<?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>219308</bug_id>
          
          <creation_ts>2020-11-27 08:42:39 -0800</creation_ts>
          <short_desc>[GTK][WPE] Async scrolling udpates are blocked in the main thread</short_desc>
          <delta_ts>2020-12-01 02:26:48 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WPE WebKit</component>
          <version>WebKit 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="Alejandro G. Castro">alex</reporter>
          <assigned_to name="Alejandro G. Castro">alex</assigned_to>
          <cc>annulen</cc>
    
    <cc>benjamin</cc>
    
    <cc>bugs-noreply</cc>
    
    <cc>cdumez</cc>
    
    <cc>changseok</cc>
    
    <cc>clord</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>fred.wang</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>jamesr</cc>
    
    <cc>keith_miller</cc>
    
    <cc>luiz</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>ryuan.choi</cc>
    
    <cc>saam</cc>
    
    <cc>sergio</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>tzagallo</cc>
    
    <cc>zeno</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1710306</commentid>
    <comment_count>0</comment_count>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2020-11-27 08:42:39 -0800</bug_when>
    <thetext>After some changes in the scrolling code WPE and GTK are not handling the scrolling thread independently when the frameDone happens, they rely on the main thread, that causes freezing in the UI.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1710319</commentid>
    <comment_count>1</comment_count>
      <attachid>414950</attachid>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2020-11-27 09:19:42 -0800</bug_when>
    <thetext>Created attachment 414950
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1710323</commentid>
    <comment_count>2</comment_count>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2020-11-27 09:28:19 -0800</bug_when>
    <thetext>Regarding the problem of avoiding hasProcessedWheelEventsRecently, probably Simon can help us to clarify how Apple ports are implementing the kinetic scrolling. WPE and GTK animation based on the class ScrollAnimationKinetic that inherits from ScrollAnimation. We would like to change this and make it as similar to the Apple ports as possible to make sure it is harder we break each other ports.

The ScrollAnimationKinetic is moving the position using scrollTo directly using a timer, I guess that is not how your ports is doing it?

Thanks for the clarifications in advance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1710973</commentid>
    <comment_count>3</comment_count>
      <attachid>415111</attachid>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2020-12-01 01:17:44 -0800</bug_when>
    <thetext>Created attachment 415111
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1710982</commentid>
    <comment_count>4</comment_count>
      <attachid>415113</attachid>
    <who name="Alejandro G. Castro">alex</who>
    <bug_when>2020-12-01 01:53:42 -0800</bug_when>
    <thetext>Created attachment 415113
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1710985</commentid>
    <comment_count>5</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-12-01 01:59:09 -0800</bug_when>
    <thetext>Patch 415111 does not build</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1710990</commentid>
    <comment_count>6</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-12-01 02:26:46 -0800</bug_when>
    <thetext>Committed r270292: &lt;https://trac.webkit.org/changeset/270292&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 415113.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>414950</attachid>
            <date>2020-11-27 09:19:42 -0800</date>
            <delta_ts>2020-12-01 01:17:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-219308-20201127181941.patch</filename>
            <type>text/plain</type>
            <size>6741</size>
            <attacher name="Alejandro G. Castro">alex</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjcwMTk1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjY3NzlhNzQ3NDIzZmIz
NThiZDBiYjA4NDI3YmYwYWQ1ZjE2NWJiZi4uNmU4ZTdmZTQ5MjRiZmMyMjU0ZTQzYTFlYmFjMDI2
NTQyYmM2Y2NmYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI1IEBACisyMDIwLTExLTI3ICBBbGVq
YW5kcm8gRy4gQ2FzdHJvICA8YWxleEBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdW1dQRV0g
QXN5bmMgc2Nyb2xsaW5nIHVkcGF0ZXMgYXJlIGJsb2NrZWQgaW4gdGhlIG1haW4gdGhyZWFkCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTkzMDgKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZSBuZWVkIHRv
IGF2b2lkIHRoaXMgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb2YgYXZvaWRpbmcgdGhlCisgICAg
ICAgIHJlZnJlc2ggZm9yIHRoZSBzY3JvbGxpbmcgdGhyZWFkIHdoZW4gbm8gd2hlZWwgZXZlbnRz
IHdlcmUKKyAgICAgICAgcmVjZW50bHkgc2VudCBiZWNhdXNlIEdUSyBhbmQgV1BFIGtpbmV0aWMg
c2Nyb2xsaW5nIGRvZXMgbm90IHVzZQorICAgICAgICB3aGVlbCBldmVudHMgdG8gY29udHJvbCB0
aGUgYW5pbWF0aW9uLiBXZSBhcmUgZGlzY3Vzc2luZyB0byBjaGFuZ2UKKyAgICAgICAgdGhpcyBm
b3IgdGhlIGZ1dHVyZSBhbmQgbWFrZSB0aGUgY29kZSBtb3JlIHNpbWlsYXIgZm9yIGV2ZXJ5IHBv
cnQuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBub3Qgc3VyZSBpZiB3ZSBjYW4gYWRkIHRlc3Rz
IGZvciB0aGlzIHNpdHVhdGlvbi4gV2UKKyAgICAgICAgZGV0ZWN0ZWQgaXQgbWFudWFsbHkuCisK
KyAgICAgICAgKiBwYWdlL3Njcm9sbGluZy9UaHJlYWRlZFNjcm9sbGluZ1RyZWUuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6VGhyZWFkZWRTY3JvbGxpbmdUcmVlOjpkaXNwbGF5RGlkUmVmcmVzaCk6
IFRoaXMgZnVuY3Rpb24KKyAgICAgICAgaXMgYWxzbyBjYWxsZWQgYnkgdGhlIHRocmVhZGVkIGNv
bXBvc2l0b3IgdGhyZWFkIGluIGNhc2Ugb2YgR1RLCisgICAgICAgIGFuZCBXUEUuIFdlIGNhbiBu
b3QgdXNlIHRoYXQgY29uZGl0aW9uIGZvciBHVEsgYW5kIFdQRSwga2luZXRpYworICAgICAgICBh
bmltYXRpb24gZG9lcyBub3QgdXNlIHRoZSB3aGVlbCBldmVudHMuCisKIDIwMjAtMTEtMjcgIEFu
dHRpIEtvaXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgogCiAgICAgICAgIFtMRkNdW0ludGVncmF0
aW9uXSBJbml0aWFsIGRpc3BsYXk6aW5saW5lIHN1cHBvcnQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKaW5kZXggZDUxNDNjYzdl
NTBmODE3NzAzY2E2YWNmZDhmMDNmMjA1OTM2NmJjOC4uYzUzNmI0NjIzMzI4YzRkZGJkZDE4ZGIw
ZmYyZDA2YjMwNThkZWRmYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysr
IGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNCBAQAorMjAyMC0xMS0yNyAg
QWxlamFuZHJvIEcuIENhc3RybyAgPGFsZXhAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXVtX
UEVdIEFzeW5jIHNjcm9sbGluZyB1ZHBhdGVzIGFyZSBibG9ja2VkIGluIHRoZSBtYWluIHRocmVh
ZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE5MzA4
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2UgbmVl
ZCB0byB1c2UgdGhlIEV2ZW50RGlzcGF0Y2hlciBmcm9tIHRoZSBmcmFtZURvbmUgY2FsbGJhY2sg
aW4KKyAgICAgICAgdGhlIFRocmVhZGVkQ29tcG9zaXRvciwgZm9yIEdUSyBhbmQgV1BFIHdlIHJl
Y2VpdmUgdGhlIGZyYW1lCisgICAgICAgIGluZm9ybWF0aW9uIGluIHRoYXQgdGhyZWFkLiBXZSBo
YXZlIHRvIG5vdGlmeSB0aGUgc2Nyb2xsaW5nIHRyZWVzCisgICAgICAgIGluIHRoZSBzY3JvbGxp
bmcgdGhyZWFkIGV2ZW4gaWYgdGhlIG1haW4gdGhyZWFkIGlzIGJ1c3kgb3Igd2Ugd2lsbAorICAg
ICAgICBmcmVlemUgd2hlbiB0aGUgbWFpbiB0aHJlYWQgaXMgYnVzeS4gRm9yIHRoYXQgd2UgdXNl
IHRoZSBBUEkgaW4KKyAgICAgICAgdGhlIEV2ZW50RGlzcGF0Y2hlci4KKworICAgICAgICAqIFNo
YXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBv
c2l0b3IuY3BwOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0b3I6OnNjZW5lVXBk
YXRlRmluaXNoZWQpOiBDYWxsIHRoZQorICAgICAgICBFdmVudERpc3BhdGNoZXIgdG8gbm90aWZ5
IHRoZSBzY3JvbGxpbmcgdHJlZXMgYSBmcmFtZSB3YXMgcmVuZGVyZWQuCisgICAgICAgICogV2Vi
UHJvY2Vzcy9XZWJQYWdlL0V2ZW50RGlzcGF0Y2hlci5jcHA6IEVuYWJsZSB0aGUgY29tcGlsYXRp
b24KKyAgICAgICAgb2YgdGhlIG5vdGlmeSBmdW5jdGlvbiBmb3IgYWxsIHRoZSBwb3J0cy4KKyAg
ICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmg6IERpdHRvLgorCiAy
MDIwLTExLTI3ICBZb3NoaWFraSBKaXRzdWthd2EgIDx5b3NoaWFraS5qaXRzdWthd2FAc29ueS5j
b20+CiAKICAgICAgICAgW1BsYXlTdGF0aW9uXSBEZWZpbmUgcGxhdGZvcm0gYXJndW1lbnQgY29k
ZXJzIGZvciBGb250CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL3Njcm9sbGluZy9U
aHJlYWRlZFNjcm9sbGluZ1RyZWUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGFnZS9zY3JvbGxpbmcv
VGhyZWFkZWRTY3JvbGxpbmdUcmVlLmNwcAppbmRleCAzMDhiZjk0MTIyNmQ1OGI2MTMxODJjNzhk
ZDkyZDQwNjhkMDEyMTZiLi45OTgxYWQyYmI5NzBiY2ZlY2RkOWIyNjY1MjgyN2M4ZjA1Njk0MzBh
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL3Njcm9sbGluZy9UaHJlYWRlZFNjcm9s
bGluZ1RyZWUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BhZ2Uvc2Nyb2xsaW5nL1RocmVhZGVk
U2Nyb2xsaW5nVHJlZS5jcHAKQEAgLTM0NSwxMyArMzQ1LDE1IEBAIHZvaWQgVGhyZWFkZWRTY3Jv
bGxpbmdUcmVlOjpkaXNwbGF5RGlkUmVmcmVzaE9uU2Nyb2xsaW5nVGhyZWFkKCkKIAogdm9pZCBU
aHJlYWRlZFNjcm9sbGluZ1RyZWU6OmRpc3BsYXlEaWRSZWZyZXNoKFBsYXRmb3JtRGlzcGxheUlE
IGRpc3BsYXlJRCkKIHsKLSAgICAvLyBXZSdyZSBvbiB0aGUgRXZlbnREaXNwYXRjaGVyIHRocmVh
ZCBoZXJlLgorICAgIC8vIFdlJ3JlIG9uIHRoZSBFdmVudERpc3BhdGNoZXIgdGhyZWFkIG9yIGlu
IHRoZSBUaHJlYWRlZENvbXBvc2l0b3IgdGhyZWFkIGhlcmUuCiAKICAgICBpZiAoZGlzcGxheUlE
ICE9IHRoaXMtPmRpc3BsYXlJRCgpKQogICAgICAgICByZXR1cm47Ci0gICAgCisKKyNpZiAhUExB
VEZPUk0oV1BFKSAmJiAhUExBVEZPUk0oR1RLKQogICAgIGlmICghaGFzUHJvY2Vzc2VkV2hlZWxF
dmVudHNSZWNlbnRseSgpKQogICAgICAgICByZXR1cm47CisjZW5kaWYKIAogICAgIFNjcm9sbGlu
Z1RocmVhZDo6ZGlzcGF0Y2goW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0oKSB7CiAg
ICAgICAgIHByb3RlY3RlZFRoaXMtPmRpc3BsYXlEaWRSZWZyZXNoT25TY3JvbGxpbmdUaHJlYWQo
KTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3Mv
dGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZGVkQ29tcG9zaXRvci5jcHAgYi9Tb3VyY2UvV2ViS2l0
L1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENv
bXBvc2l0b3IuY3BwCmluZGV4IGU4ZjQ5YWIxODZmYzA5MWViZDk5Njk3NmUyYjMxMzMzNTUwMDlj
ODIuLjRiNmQ1M2MwNDRlYWQzODY0MmM4NzNkMGZjMTdhZDEzYjlkNDE5MTAgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJLaXQvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3Np
dG9yL1RocmVhZGVkQ29tcG9zaXRvci5jcHAKKysrIGIvU291cmNlL1dlYktpdC9TaGFyZWQvQ29v
cmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmNw
cApAQCAtMjksNyArMjksOSBAQAogI2lmIFVTRShDT09SRElOQVRFRF9HUkFQSElDUykKIAogI2lu
Y2x1ZGUgIkNvbXBvc2l0aW5nUnVuTG9vcC5oIgorI2luY2x1ZGUgIkV2ZW50RGlzcGF0Y2hlci5o
IgogI2luY2x1ZGUgIlRocmVhZGVkRGlzcGxheVJlZnJlc2hNb25pdG9yLmgiCisjaW5jbHVkZSAi
V2ViUHJvY2Vzcy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1EaXNwbGF5Lmg+CiAjaW5j
bHVkZSA8V2ViQ29yZS9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oPgogI2luY2x1ZGUgPHd0Zi9TZXRG
b3JTY29wZS5oPgpAQCAtMjUzLDYgKzI1NSw5IEBAIHZvaWQgVGhyZWFkZWRDb21wb3NpdG9yOjpz
Y2VuZVVwZGF0ZUZpbmlzaGVkKCkKICAgICBpZiAoc2hvdWxkRGlzcGF0Y2hEaXNwbGF5UmVmcmVz
aENhbGxiYWNrKQogICAgICAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvci0+ZGlzcGF0Y2hEaXNw
bGF5UmVmcmVzaENhbGxiYWNrKCk7CiAKKyAgICAvLyBBbHdheXMgbm90aWZ5IHRoZSBTY3JvbGxp
bmdUcmVlcyB0byBtYWtlIHN1cmUgc2Nyb2xsaW5nIGRvZXMgZGVwZW5kIG9uIHRoZSBtYWluIHRo
cmVhZC4KKyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5ldmVudERpc3BhdGNoZXIoKS5ub3Rp
ZnlTY3JvbGxpbmdUcmVlc0Rpc3BsYXlXYXNSZWZyZXNoZWQobV9kaXNwbGF5UmVmcmVzaE1vbml0
b3ItPmRpc3BsYXlJRCgpKTsKKwogICAgIC8vIE1hcmsgdGhlIHNjZW5lIHVwZGF0ZSBhcyBjb21w
bGV0ZWQuCiAgICAgbV9jb21wb3NpdGluZ1J1bkxvb3AtPnVwZGF0ZUNvbXBsZXRlZChzdGF0ZUxv
Y2tlcik7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9F
dmVudERpc3BhdGNoZXIuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvRXZl
bnREaXNwYXRjaGVyLmNwcAppbmRleCAyNjc4ZTRjYmU3NDU1NDgwNGQ1MDMyMmFhMDZkNzI2M2Jm
YWVjOTgyLi44YjQ3OWYxMDRhYjZiN2NhOWFiY2U4MjJjMTA0ODA5MTIyYWFhNDZmIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9FdmVudERpc3BhdGNoZXIuY3Bw
CisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0V2ZW50RGlzcGF0Y2hlci5j
cHAKQEAgLTQzLDkgKzQzLDcgQEAKICNpbmNsdWRlIDxXZWJDb3JlL0FzeW5jU2Nyb2xsaW5nQ29v
cmRpbmF0b3IuaD4KICNlbmRpZgogCi0jaWYgRU5BQkxFKFdFQlBST0NFU1NfV0lORE9XU0VSVkVS
X0JMT0NLSU5HKQogI2luY2x1ZGUgPFdlYkNvcmUvRGlzcGxheVJlZnJlc2hNb25pdG9yTWFuYWdl
ci5oPgotI2VuZGlmCiAKICNpZiBFTkFCTEUoU0NST0xMSU5HX1RIUkVBRCkKICNpbmNsdWRlIDxX
ZWJDb3JlL1Njcm9sbGluZ1RocmVhZC5oPgpAQCAtMjc1LDggKzI3Myw2IEBAIHZvaWQgRXZlbnRE
aXNwYXRjaGVyOjpzZW5kRGlkUmVjZWl2ZUV2ZW50KFBhZ2VJZGVudGlmaWVyIHBhZ2VJRCwgV2Vi
RXZlbnQ6OlR5cGUKIH0KICNlbmRpZgogCi0jaWYgRU5BQkxFKFdFQlBST0NFU1NfV0lORE9XU0VS
VkVSX0JMT0NLSU5HKQotCiB2b2lkIEV2ZW50RGlzcGF0Y2hlcjo6bm90aWZ5U2Nyb2xsaW5nVHJl
ZXNEaXNwbGF5V2FzUmVmcmVzaGVkKFBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCkKIHsKICNp
ZiBFTkFCTEUoU0NST0xMSU5HX1RIUkVBRCkKQEAgLTI4Niw2ICsyODIsNyBAQCB2b2lkIEV2ZW50
RGlzcGF0Y2hlcjo6bm90aWZ5U2Nyb2xsaW5nVHJlZXNEaXNwbGF5V2FzUmVmcmVzaGVkKFBsYXRm
b3JtRGlzcGxheUlECiAjZW5kaWYKIH0KIAorI2lmIEVOQUJMRShXRUJQUk9DRVNTX1dJTkRPV1NF
UlZFUl9CTE9DS0lORykKIHZvaWQgRXZlbnREaXNwYXRjaGVyOjpkaXNwbGF5V2FzUmVmcmVzaGVk
KFBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCkKIHsKICAgICBBU1NFUlQoIVJ1bkxvb3A6Omlz
TWFpbigpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0V2
ZW50RGlzcGF0Y2hlci5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvRXZlbnRE
aXNwYXRjaGVyLmgKaW5kZXggMzc1ZDEzZGJhNDcxNmJhY2IyMTE1Y2RkZmIwZDE3Yzg5YTZiMWNm
YS4uODJmODhlYmM2MmU2NWQ0Y2RmZmM5ZGQ4YjVmNjJjNzg1YzE0NmE3OCAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmgKKysrIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmgKQEAgLTcz
LDkgKzczLDcgQEAgcHVibGljOgogCiAgICAgdm9pZCBpbml0aWFsaXplQ29ubmVjdGlvbihJUEM6
OkNvbm5lY3Rpb24qKTsKIAotI2lmIEVOQUJMRShXRUJQUk9DRVNTX1dJTkRPV1NFUlZFUl9CTE9D
S0lORykKICAgICB2b2lkIG5vdGlmeVNjcm9sbGluZ1RyZWVzRGlzcGxheVdhc1JlZnJlc2hlZChX
ZWJDb3JlOjpQbGF0Zm9ybURpc3BsYXlJRCk7Ci0jZW5kaWYKIAogcHJpdmF0ZToKICAgICBFdmVu
dERpc3BhdGNoZXIoKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>415111</attachid>
            <date>2020-12-01 01:17:44 -0800</date>
            <delta_ts>2020-12-01 01:59:10 -0800</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-219308-20201201101723.patch</filename>
            <type>text/plain</type>
            <size>4387372</size>
            <attacher name="Alejandro G. Castro">alex</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjcwMjg3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGY2NjgzMDI0N2JhNGRm
MTEzNTg0YjQwZjFjMDg3NDI4NDlmMGNlMy4uMDc2ZDkyMWU5OTMxZjZhMTQ1NmJhOTY0ZTJiMjBh
ZmYwODkyNmM3OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI1IEBACisyMDIwLTEyLTAxICBBbGVq
YW5kcm8gRy4gQ2FzdHJvICA8YWxleEBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdW1dQRV0g
QXN5bmMgc2Nyb2xsaW5nIHVkcGF0ZXMgYXJlIGJsb2NrZWQgaW4gdGhlIG1haW4gdGhyZWFkCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTkzMDgKKwor
ICAgICAgICBSZXZpZXdlZCBieSBTaW1vbiBGcmFzZXIuCisKKyAgICAgICAgV2UgbmVlZCB0byBh
dm9pZCB0aGlzIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9mIGF2b2lkaW5nIHRoZQorICAgICAg
ICByZWZyZXNoIGZvciB0aGUgc2Nyb2xsaW5nIHRocmVhZCB3aGVuIG5vIHdoZWVsIGV2ZW50cyB3
ZXJlCisgICAgICAgIHJlY2VudGx5IHNlbnQgYmVjYXVzZSBHVEsgYW5kIFdQRSBraW5ldGljIHNj
cm9sbGluZyBkb2VzIG5vdCB1c2UKKyAgICAgICAgd2hlZWwgZXZlbnRzIHRvIGNvbnRyb2wgdGhl
IGFuaW1hdGlvbi4gV2UgYXJlIGRpc2N1c3NpbmcgdG8gY2hhbmdlCisgICAgICAgIHRoaXMgZm9y
IHRoZSBmdXR1cmUgYW5kIG1ha2UgdGhlIGNvZGUgbW9yZSBzaW1pbGFyIGZvciBldmVyeSBwb3J0
LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm90IHN1cmUgaWYgd2UgY2FuIGFkZCB0ZXN0cyBm
b3IgdGhpcyBzaXR1YXRpb24uIFdlCisgICAgICAgIGRldGVjdGVkIGl0IG1hbnVhbGx5LgorCisg
ICAgICAgICogcGFnZS9zY3JvbGxpbmcvVGhyZWFkZWRTY3JvbGxpbmdUcmVlLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlRocmVhZGVkU2Nyb2xsaW5nVHJlZTo6ZGlzcGxheURpZFJlZnJlc2gpOiBU
aGlzIGZ1bmN0aW9uCisgICAgICAgIGlzIGFsc28gY2FsbGVkIGJ5IHRoZSB0aHJlYWRlZCBjb21w
b3NpdG9yIHRocmVhZCBpbiBjYXNlIG9mIEdUSworICAgICAgICBhbmQgV1BFLiBXZSBjYW4gbm90
IHVzZSB0aGF0IGNvbmRpdGlvbiBmb3IgR1RLIGFuZCBXUEUsIGtpbmV0aWMKKyAgICAgICAgYW5p
bWF0aW9uIGRvZXMgbm90IHVzZSB0aGUgd2hlZWwgZXZlbnRzLgorCiAyMDIwLTExLTMwICBBbmRy
ZXMgR29uemFsZXogIDxhbmRyZXNnXzIyQGFwcGxlLmNvbT4KIAogICAgICAgICBbV2ViQWNjZXNz
aWJpbGl0eU9iamVjdFdyYXBwZXIgZG9BWEF0dHJpYnV0ZWRTdHJpbmdGb3JSYW5nZV0gbmVlZHMg
dG8gcnVuIG9uIHRoZSBtYWluIHRocmVhZC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKaW5kZXggOWEyNDNkOGQ0NjM2ZmI5NjBh
NzhkOWVmMjg2ZmY3ZWMzNTBmODhmNy4uZjcyOWMzMTczN2ZlYmVhNDM3ZDk2NGUyZWQ3N2M4Nzhi
YWM5ZmFlZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysrIGIvU291cmNl
L1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNCBAQAorMjAyMC0xMi0wMSAgQWxlamFuZHJv
IEcuIENhc3RybyAgPGFsZXhAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXVtXUEVdIEFzeW5j
IHNjcm9sbGluZyB1ZHBhdGVzIGFyZSBibG9ja2VkIGluIHRoZSBtYWluIHRocmVhZAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE5MzA4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgU2ltb24gRnJhc2VyLgorCisgICAgICAgIFdlIG5lZWQgdG8gdXNlIHRo
ZSBFdmVudERpc3BhdGNoZXIgZnJvbSB0aGUgZnJhbWVEb25lIGNhbGxiYWNrIGluCisgICAgICAg
IHRoZSBUaHJlYWRlZENvbXBvc2l0b3IsIGZvciBHVEsgYW5kIFdQRSB3ZSByZWNlaXZlIHRoZSBm
cmFtZQorICAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGF0IHRocmVhZC4gV2UgaGF2ZSB0byBub3Rp
ZnkgdGhlIHNjcm9sbGluZyB0cmVlcworICAgICAgICBpbiB0aGUgc2Nyb2xsaW5nIHRocmVhZCBl
dmVuIGlmIHRoZSBtYWluIHRocmVhZCBpcyBidXN5IG9yIHdlIHdpbGwKKyAgICAgICAgZnJlZXpl
IHdoZW4gdGhlIG1haW4gdGhyZWFkIGlzIGJ1c3kuIEZvciB0aGF0IHdlIHVzZSB0aGUgQVBJIGlu
CisgICAgICAgIHRoZSBFdmVudERpc3BhdGNoZXIuCisKKyAgICAgICAgKiBTaGFyZWQvQ29vcmRp
bmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmNwcDoK
KyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpzY2VuZVVwZGF0ZUZpbmlzaGVk
KTogQ2FsbCB0aGUKKyAgICAgICAgRXZlbnREaXNwYXRjaGVyIHRvIG5vdGlmeSB0aGUgc2Nyb2xs
aW5nIHRyZWVzIGEgZnJhbWUgd2FzIHJlbmRlcmVkLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2Vi
UGFnZS9FdmVudERpc3BhdGNoZXIuY3BwOiBFbmFibGUgdGhlIGNvbXBpbGF0aW9uCisgICAgICAg
IG9mIHRoZSBub3RpZnkgZnVuY3Rpb24gZm9yIGFsbCB0aGUgcG9ydHMuCisgICAgICAgICogV2Vi
UHJvY2Vzcy9XZWJQYWdlL0V2ZW50RGlzcGF0Y2hlci5oOiBEaXR0by4KKwogMjAyMC0xMi0wMSAg
VGltIEhvcnRvbiAgPHRpbW90aHlfaG9ydG9uQGFwcGxlLmNvbT4KIAogICAgICAgICBHUFUgUHJv
Y2VzczogSW52YWxpZCBzdGF0aWNfY2FzdCBmcm9tIENvbmNyZXRlSW1hZ2VCdWZmZXIgdG8gUmVt
b3RlSW1hZ2VCdWZmZXJQcm94eQpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vV2FzbUVudHJ5UGxhbi5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtRW50
cnlQbGFuLmNwcAppbmRleCAwYTljZjA1NDNhNGZhOWE4ZmI2NmRlZjNiMDcxMjlhNjM0YWMzNzUz
Li41MTkyZmFkOTAwN2NlMjZjYjhmZDQ5ZjAwMDFhNzZmZDg0YjBiMTM3IDEwMDY0NAotLS0gYS9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtRW50cnlQbGFuLmNwcAorKysgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtRW50cnlQbGFuLmNwcApAQCAtMTg5LDkgKzE4OSw5IEBA
IHZvaWQgRW50cnlQbGFuOjpjb21waWxlRnVuY3Rpb25zKENvbXBpbGF0aW9uRWZmb3J0IGVmZm9y
dCkKICAgICBpZiAoIWhhc1dvcmsoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgT3B0aW9uYWw8
VHJhY2VTY29wZT4gdHJhY2VTY29wZTsKLSAgICBpZiAoT3B0aW9uczo6dXNlVHJhY2VQb2ludHMo
KSkKLSAgICAgICAgdHJhY2VTY29wZS5lbXBsYWNlKFdlYkFzc2VtYmx5Q29tcGlsZVN0YXJ0LCBX
ZWJBc3NlbWJseUNvbXBpbGVFbmQpOworICAgIC8vT3B0aW9uYWw8VHJhY2VTY29wZT4gdHJhY2VT
Y29wZTsKKyAgICAvL2lmIChPcHRpb25zOjp1c2VUcmFjZVBvaW50cygpKQorICAgIC8vICAgIHRy
YWNlU2NvcGUuZW1wbGFjZShXZWJBc3NlbWJseUNvbXBpbGVTdGFydCwgV2ViQXNzZW1ibHlDb21w
aWxlRW5kKTsKICAgICBUaHJlYWRDb3VudEhvbGRlciBob2xkZXIoKnRoaXMpOwogCiAgICAgc2l6
ZV90IGJ5dGVzQ29tcGlsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vanMvV2ViQXNzZW1ibHlGdW5jdGlvbi5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9qcy9XZWJBc3NlbWJseUZ1bmN0aW9uLmNwcAppbmRleCA3OGRhNmRjM2Y0ZWFlYWQzYzgw
MGFlNDJlYzBlNjg4MTc2NWU0NmU1Li5lNWFjZTQ2NmZiNWU3ODliMDNhNmVlZWUzZjk0NzZlZGY4
Njc2NTcyIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3Nl
bWJseUZ1bmN0aW9uLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJB
c3NlbWJseUZ1bmN0aW9uLmNwcApAQCAtNjksOSArNjksOSBAQCBKU0NfREVGSU5FX0hPU1RfRlVO
Q1RJT04oY2FsbFdlYkFzc2VtYmx5RnVuY3Rpb24sIChKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0LAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZW1vcnkgd2UgdGhpbmsgd2UgYXJlIGdv
aW5nIHRvIHJ1biB3aXRoIG1hdGNoZXMgdGhlIG9uZSB3ZSBleHBlY3QuCiAgICAgQVNTRVJUKHdh
c21GdW5jdGlvbi0+aW5zdGFuY2UoKS0+aW5zdGFuY2UoKS5jb2RlQmxvY2soKS0+aXNTYWZlVG9S
dW4od2FzbUZ1bmN0aW9uLT5pbnN0YW5jZSgpLT5tZW1vcnkoKS0+bWVtb3J5KCkubW9kZSgpKSk7
CiAKLSAgICBPcHRpb25hbDxUcmFjZVNjb3BlPiB0cmFjZVNjb3BlOwotICAgIGlmIChPcHRpb25z
Ojp1c2VUcmFjZVBvaW50cygpKQotICAgICAgICB0cmFjZVNjb3BlLmVtcGxhY2UoV2ViQXNzZW1i
bHlFeGVjdXRlU3RhcnQsIFdlYkFzc2VtYmx5RXhlY3V0ZUVuZCk7CisgICAgLy9PcHRpb25hbDxU
cmFjZVNjb3BlPiB0cmFjZVNjb3BlOworICAgIC8vaWYgKE9wdGlvbnM6OnVzZVRyYWNlUG9pbnRz
KCkpCisgICAgLy8gICAgdHJhY2VTY29wZS5lbXBsYWNlKFdlYkFzc2VtYmx5RXhlY3V0ZVN0YXJ0
LCBXZWJBc3NlbWJseUV4ZWN1dGVFbmQpOwogCiAgICAgVmVjdG9yPEpTVmFsdWUsIE1hcmtlZEFy
Z3VtZW50QnVmZmVyOjppbmxpbmVDYXBhY2l0eT4gYm94ZWRBcmdzOwogICAgIEpTV2ViQXNzZW1i
bHlJbnN0YW5jZSogaW5zdGFuY2UgPSB3YXNtRnVuY3Rpb24tPmluc3RhbmNlKCk7CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV1RGL3d0Zi9DTWFrZUxpc3RzLnR4dCBiL1NvdXJjZS9XVEYvd3RmL0NNYWtl
TGlzdHMudHh0CmluZGV4IGM4YTRmMzg5MTYyNjhlMWZiNzZiMDYzMTA3MWM0NGI2ZGZjZjdjZjAu
LmI3NDBjMDRiZWU3YWI0MGQ3YTMzYzRmOTYxMTgxZTA2NGZlNWY0M2EgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XVEYvd3RmL0NNYWtlTGlzdHMudHh0CisrKyBiL1NvdXJjZS9XVEYvd3RmL0NNYWtlTGlz
dHMudHh0CkBAIC0zMTMsNiArMzEzLDEwIEBAIHNldChXVEZfUFVCTElDX0hFQURFUlMKICAgICBk
dG9hL3N0cnRvZC5oCiAgICAgZHRvYS91dGlscy5oCiAKKyNpZiBFTkFCTEVfUEVSRkVUVE9fVFJB
Q0lORworICAgIHBlcmZldHRvL3BlcmZldHRvLmgKKyNlbmRpZgorCiAgICAgcGVyc2lzdGVuY2Uv
UGVyc2lzdGVudENvZGVyLmgKICAgICBwZXJzaXN0ZW5jZS9QZXJzaXN0ZW50Q29kZXJzLmgKICAg
ICBwZXJzaXN0ZW5jZS9QZXJzaXN0ZW50RGVjb2Rlci5oCkBAIC00NDEsNiArNDQ1LDcgQEAgc2V0
KFdURl9TT1VSQ0VTCiAgICAgU3RhY2tTdGF0cy5jcHAKICAgICBTdGFja1RyYWNlLmNwcAogICAg
IFN0cmluZ1ByaW50U3RyZWFtLmNwcAorICAgIFN5c3RlbVRyYWNpbmcuY3BwCiAgICAgVGhyZWFk
R3JvdXAuY3BwCiAgICAgVGhyZWFkTWVzc2FnZS5jcHAKICAgICBUaHJlYWRpbmcuY3BwCkBAIC00
NjksNiArNDc0LDEwIEBAIHNldChXVEZfU09VUkNFUwogICAgIGR0b2EvZml4ZWQtZHRvYS5jYwog
ICAgIGR0b2Evc3RydG9kLmNjCiAKKyNpZiBFTkFCTEVfUEVSRkVUVE9fVFJBQ0lORworICAgIHBl
cmZldHRvL3BlcmZldHRvLmNjCisjZW5kaWYKKwogICAgIHBlcnNpc3RlbmNlL1BlcnNpc3RlbnRD
b2RlcnMuY3BwCiAgICAgcGVyc2lzdGVuY2UvUGVyc2lzdGVudERlY29kZXIuY3BwCiAgICAgcGVy
c2lzdGVuY2UvUGVyc2lzdGVudEVuY29kZXIuY3BwCkBAIC01MTQsNiArNTIzLDkgQEAgc2V0KFdU
Rl9QUklWQVRFX0lOQ0xVREVfRElSRUNUT1JJRVMKICAgICAiJHtXVEZfRElSfS93dGYiCiAgICAg
IiR7V1RGX0RJUn0vd3RmL2R0b2EiCiAgICAgIiR7V1RGX0RJUn0vd3RmL3BlcnNpc3RlbmNlIgor
I2lmIEVOQUJMRV9QRVJGRVRUT19UUkFDSU5HCisgICAgIiR7V1RGX0RJUn0vd3RmL3BlcmZldHRv
IgorI2VuZGlmCiAgICAgIiR7V1RGX0RJUn0vd3RmL3RleHQiCiAgICAgIiR7V1RGX0RJUn0vd3Rm
L3RleHQvaWN1IgogICAgICIke1dURl9ESVJ9L3d0Zi90aHJlYWRzIgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dURi93dGYvUGxhdGZvcm1FbmFibGUuaCBiL1NvdXJjZS9XVEYvd3RmL1BsYXRmb3JtRW5h
YmxlLmgKaW5kZXggMDgwZWRlZDMwZjU4ZGM3NmZhNTE3OTVlYmY1N2M5MzUxNzA0YWQyMy4uNjgx
NjU2YzRiNjVjYzhhOWU4MDhkZjkxZTkxYmQwNzI1MGU1ZjkxNCAxMDA2NDQKLS0tIGEvU291cmNl
L1dURi93dGYvUGxhdGZvcm1FbmFibGUuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybUVu
YWJsZS5oCkBAIC00ODEsNiArNDgxLDEwIEBACiAjZGVmaW5lIEVOQUJMRV9XSEVFTF9FVkVOVF9S
RUdJT05TIDAKICNlbmRpZgogCisjaWYgIWRlZmluZWQoRU5BQkxFX1BFUkZFVFRPX1RSQUNJTkcp
CisjZGVmaW5lIEVOQUJMRV9QRVJGRVRUT19UUkFDSU5HIDAKKyNlbmRpZgorCiAjaWYgIWRlZmlu
ZWQoRU5BQkxFX1ZJREVPKQogI2RlZmluZSBFTkFCTEVfVklERU8gMAogI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV1RGL3d0Zi9TeXN0ZW1UcmFjaW5nLmNwcCBiL1NvdXJjZS9XVEYvd3RmL1N5
c3RlbVRyYWNpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmEyZjc4YmZhNmMxYzI0ZGViNDA4NGI4Njg2NDVm
ZDljZjIzNGY2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV1RGL3d0Zi9TeXN0ZW1UcmFj
aW5nLmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTeXN0ZW1UcmFj
aW5nLmgiCisKKyNpZiBFTkFCTEUoUEVSRkVUVE9fVFJBQ0lORykKK1BFUkZFVFRPX1RSQUNLX0VW
RU5UX1NUQVRJQ19TVE9SQUdFKCk7CisKK25hbWVzcGFjZSBXVEYgeworCit2b2lkIGluaXRpYWxp
emVQZXJmZXR0b0ZvckN1cnJlbnRQcm9jZXNzKCkKK3sKKyAgICBXVEZMb2dBbHdheXMoIldURjog
aW5pdGlhbGl6ZVBlcmZldHRvRm9yQ3VycmVudFByb2Nlc3MoKVxuIik7CisgICAgcGVyZmV0dG86
OlRyYWNpbmdJbml0QXJncyBhcmdzOworICAgIGFyZ3MuYmFja2VuZHMgPSBwZXJmZXR0bzo6a1N5
c3RlbUJhY2tlbmQ7CisKKyAgICBwZXJmZXR0bzo6VHJhY2luZzo6SW5pdGlhbGl6ZShhcmdzKTsK
KyAgICBwZXJmZXR0bzo6VHJhY2tFdmVudDo6UmVnaXN0ZXIoKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV1RGCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvU3lzdGVtVHJhY2lu
Zy5oIGIvU291cmNlL1dURi93dGYvU3lzdGVtVHJhY2luZy5oCmluZGV4IDBiMjBhOGM3MmMyYWI5
OGJkNjViZWQzNWY1ZDU1MDI3MjA4MWFjNDMuLmUzYzY4NDhlNWVjMWNlYzUyM2ZjNmQzYjU5YTE0
NTQzY2Y0YmZlYTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL1N5c3RlbVRyYWNpbmcuaAor
KysgYi9Tb3VyY2UvV1RGL3d0Zi9TeXN0ZW1UcmFjaW5nLmgKQEAgLTI4LDYgKzI4LDggQEAKICNp
ZiBVU0UoQVBQTEVfSU5URVJOQUxfU0RLKQogI2luY2x1ZGUgPFN5c3RlbS9zeXMva2RlYnVnLmg+
CiAjZGVmaW5lIEhBVkVfS0RFQlVHX0ggMQorI2VsaWYgRU5BQkxFKFBFUkZFVFRPX1RSQUNJTkcp
CisjaW5jbHVkZSA8d3RmL3BlcmZldHRvL3BlcmZldHRvLmg+CiAjZW5kaWYKIAogLy8gTm8gbmFt
ZXNwYWNlcyBiZWNhdXNlIHRoaXMgZmlsZSBoYXMgdG8gYmUgaW5jbHVkYWJsZSBmcm9tIEMgYW5k
IE9iamVjdGl2ZS1DLgpAQCAtODgsMTYgKzkwLDI0IEBAIGVudW0gVHJhY2VQb2ludENvZGUgewog
ICAgIERpc3BhdGNoVG91Y2hFdmVudHNFbmQsCiAgICAgUGFyc2VIVE1MU3RhcnQsCiAgICAgUGFy
c2VIVE1MRW5kLAorICAgIFByZWZlcnJlZEZyYW1lSW50ZXJ2YWwsCiAgICAgRGlzcGxheUxpc3RS
ZXBsYXlTdGFydCwKICAgICBEaXNwbGF5TGlzdFJlcGxheUVuZCwKKyAgICBTY3JvbGxpbmdUaHJl
YWRoYW5kbGVXaGVlbEV2ZW50QWZ0ZXJNYWluVGhyZWFkLAogICAgIFNjcm9sbGluZ1RocmVhZFJl
bmRlclVwZGF0ZVN5bmNTdGFydCwKICAgICBTY3JvbGxpbmdUaHJlYWRSZW5kZXJVcGRhdGVTeW5j
RW5kLAogICAgIFNjcm9sbGluZ1RocmVhZERpc3BsYXlEaWRSZWZyZXNoU3RhcnQsCiAgICAgU2Ny
b2xsaW5nVGhyZWFkRGlzcGxheURpZFJlZnJlc2hFbmQsCisgICAgU2Nyb2xsQW5pbWF0aW9uS2lu
ZXRpY2FuaW1hdGlvblRpbWVyRmlyZWQsCisgICAgU2Nyb2xsaW5nVHJlZUZyYW1lU2Nyb2xsaW5n
Tm9kZU5pY29zaWFFbnN1cmVTY3JvbGxBbmltYXRpb25LaW5ldGljLAorICAgIFNjcm9sbFZpZXdz
ZXRTY3JvbGxPZmZzZXQsCiAKICAgICBXZWJLaXRSYW5nZSA9IDEwMDAwLAogICAgIFdlYkhUTUxW
aWV3UGFpbnRTdGFydCwKICAgICBXZWJIVE1MVmlld1BhaW50RW5kLAorICAgIEV2ZW50RGlzcGF0
Y2hlcndoZWVsRXZlbnQsCisgICAgTGF5ZXJGbHVzaFRpbWVyRmlyZWQsCisgICAgVGhyZWFkZWRD
b21wb3NpdG9yUmVuZGVyTGF5ZXJUcmVlLAogCiAgICAgV2ViS2l0MlJhbmdlID0gMTIwMDAsCiAg
ICAgQmFja2luZ1N0b3JlRmx1c2hTdGFydCwKQEAgLTEzMCw4ICsxNDAsMTcxIEBAIGVudW0gVHJh
Y2VQb2ludENvZGUgewogICAgIFdha2VVcEFuZEFwcGx5RGlzcGxheUxpc3RFbmQsCiB9OwogCisj
aWYgRU5BQkxFKFBFUkZFVFRPX1RSQUNJTkcpCitQRVJGRVRUT19ERUZJTkVfQ0FURUdPUklFUygK
KyAgICBwZXJmZXR0bzo6Q2F0ZWdvcnkoIldURiIpLAorICAgIHBlcmZldHRvOjpDYXRlZ29yeSgi
SlNDIiksCisgICAgcGVyZmV0dG86OkNhdGVnb3J5KCJXZWJDb3JlIiksCisgICAgcGVyZmV0dG86
OkNhdGVnb3J5KCJXZWJLaXQiKSwKKyAgICBwZXJmZXR0bzo6Q2F0ZWdvcnkoIldlYktpdDIiKSwK
KyAgICBwZXJmZXR0bzo6Q2F0ZWdvcnkoIlVJUHJvY2VzcyIpCispOworCisjZGVmaW5lIFRSQUNF
X1BPSU5UX1RPX0NBVEVHT1JZKGNvZGUpIFwKKyhjb2RlID49IFVJUHJvY2Vzc1JhbmdlKSA/ICJV
SVByb2Nlc3MiIDogXAorKCBcCisgIChjb2RlID49IFdlYktpdDJSYW5nZSkgPyAiV2ViS2l0MiIg
OiBcCisgICggXAorICAgIChjb2RlID49IFdlYktpdFJhbmdlKSA/ICJXZWJLaXQiIDogXAorICAg
ICggXAorICAgICAgKGNvZGUgPj0gV2ViQ29yZVJhbmdlKSA/ICJXZWJDb3JlIiA6IFwKKyAgICAg
ICggXAorICAgICAgICAoY29kZSA+PSBKYXZhU2NyaXB0UmFuZ2UpID8gIkpTQyIgOiAiV1RGIiBc
CisgICAgICApIFwKKyAgICApIFwKKyAgKSBcCispCisjZW5kaWYKKwogI2lmZGVmIF9fY3BsdXNw
bHVzCiAKKyNpZiBFTkFCTEUoUEVSRkVUVE9fVFJBQ0lORykKK2NvbnN0ZXhwciBjb25zdCBjaGFy
KiB0cmFjZVBvaW50Q29kZVRvU3RyaW5nKFRyYWNlUG9pbnRDb2RlIGNvZGUpCit7CisgICAgc3dp
dGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIFZNRW50cnlTY29wZVN0YXJ0OiByZXR1cm4gIlZN
RW50cnlTY29wZVN0YXJ0IjsKKyAgICBjYXNlIFZNRW50cnlTY29wZUVuZDogcmV0dXJuICJWTUVu
dHJ5U2NvcGVFbmQiOworICAgIGNhc2UgV2ViQXNzZW1ibHlDb21waWxlU3RhcnQ6IHJldHVybiAi
V2ViQXNzZW1ibHlDb21waWxlU3RhcnQiOworICAgIGNhc2UgV2ViQXNzZW1ibHlDb21waWxlRW5k
OiByZXR1cm4gIldlYkFzc2VtYmx5Q29tcGlsZUVuZCI7CisgICAgY2FzZSBXZWJBc3NlbWJseUV4
ZWN1dGVTdGFydDogcmV0dXJuICJXZWJBc3NlbWJseUV4ZWN1dGVTdGFydCI7CisgICAgY2FzZSBX
ZWJBc3NlbWJseUV4ZWN1dGVFbmQ6IHJldHVybiAiV2ViQXNzZW1ibHlFeGVjdXRlRW5kIjsKKyAg
ICBjYXNlIER1bXBKSVRNZW1vcnlTdGFydDogcmV0dXJuICJEdW1wSklUTWVtb3J5U3RhcnQiOwor
ICAgIGNhc2UgRHVtcEpJVE1lbW9yeVN0b3A6IHJldHVybiAiRHVtcEpJVE1lbW9yeVN0b3AiOwor
ICAgIGNhc2UgTWFpblJlc291cmNlTG9hZERpZFN0YXJ0UHJvdmlzaW9uYWw6IHJldHVybiAiTWFp
blJlc291cmNlTG9hZERpZFN0YXJ0UHJvdmlzaW9uYWwiOworICAgIGNhc2UgTWFpblJlc291cmNl
TG9hZERpZEVuZDogcmV0dXJuICJNYWluUmVzb3VyY2VMb2FkRGlkRW5kIjsKKyAgICBjYXNlIFN1
YnJlc291cmNlTG9hZFdpbGxTdGFydDogcmV0dXJuICJTdWJyZXNvdXJjZUxvYWRXaWxsU3RhcnQi
OworICAgIGNhc2UgU3VicmVzb3VyY2VMb2FkRGlkRW5kOiByZXR1cm4gIlN1YnJlc291cmNlTG9h
ZERpZEVuZCI7CisgICAgY2FzZSBGZXRjaENvb2tpZXNTdGFydDogcmV0dXJuICJGZXRjaENvb2tp
ZXNTdGFydCI7CisgICAgY2FzZSBGZXRjaENvb2tpZXNFbmQ6IHJldHVybiAiRmV0Y2hDb29raWVz
RW5kIjsKKyAgICBjYXNlIFN0eWxlUmVjYWxjU3RhcnQ6IHJldHVybiAiU3R5bGVSZWNhbGNTdGFy
dCI7CisgICAgY2FzZSBTdHlsZVJlY2FsY0VuZDogcmV0dXJuICJTdHlsZVJlY2FsY0VuZCI7Cisg
ICAgY2FzZSBSZW5kZXJUcmVlQnVpbGRTdGFydDogcmV0dXJuICJSZW5kZXJUcmVlQnVpbGRTdGFy
dCI7CisgICAgY2FzZSBSZW5kZXJUcmVlQnVpbGRFbmQ6IHJldHVybiAiUmVuZGVyVHJlZUJ1aWxk
RW5kIjsKKyAgICBjYXNlIExheW91dFN0YXJ0OiByZXR1cm4gIkxheW91dFN0YXJ0IjsKKyAgICBj
YXNlIExheW91dEVuZDogcmV0dXJuICJMYXlvdXRFbmQiOworICAgIGNhc2UgUGFpbnRMYXllclN0
YXJ0OiByZXR1cm4gIlBhaW50TGF5ZXJTdGFydCI7CisgICAgY2FzZSBQYWludExheWVyRW5kOiBy
ZXR1cm4gIlBhaW50TGF5ZXJFbmQiOworICAgIGNhc2UgQXN5bmNJbWFnZURlY29kZVN0YXJ0OiBy
ZXR1cm4gIkFzeW5jSW1hZ2VEZWNvZGVTdGFydCI7CisgICAgY2FzZSBBc3luY0ltYWdlRGVjb2Rl
RW5kOiByZXR1cm4gIkFzeW5jSW1hZ2VEZWNvZGVFbmQiOworICAgIGNhc2UgUkFGQ2FsbGJhY2tT
dGFydDogcmV0dXJuICJSQUZDYWxsYmFja1N0YXJ0IjsKKyAgICBjYXNlIFJBRkNhbGxiYWNrRW5k
OiByZXR1cm4gIlJBRkNhbGxiYWNrRW5kIjsKKyAgICBjYXNlIE1lbW9yeVByZXNzdXJlSGFuZGxl
clN0YXJ0OiByZXR1cm4gIk1lbW9yeVByZXNzdXJlSGFuZGxlclN0YXJ0IjsKKyAgICBjYXNlIE1l
bW9yeVByZXNzdXJlSGFuZGxlckVuZDogcmV0dXJuICJNZW1vcnlQcmVzc3VyZUhhbmRsZXJFbmQi
OworICAgIGNhc2UgVXBkYXRlVG91Y2hSZWdpb25zU3RhcnQ6IHJldHVybiAiVXBkYXRlVG91Y2hS
ZWdpb25zU3RhcnQiOworICAgIGNhc2UgVXBkYXRlVG91Y2hSZWdpb25zRW5kOiByZXR1cm4gIlVw
ZGF0ZVRvdWNoUmVnaW9uc0VuZCI7CisgICAgY2FzZSBEaXNwbGF5TGlzdFJlY29yZFN0YXJ0OiBy
ZXR1cm4gIkRpc3BsYXlMaXN0UmVjb3JkU3RhcnQiOworICAgIGNhc2UgRGlzcGxheUxpc3RSZWNv
cmRFbmQ6IHJldHVybiAiRGlzcGxheUxpc3RSZWNvcmRFbmQiOworICAgIGNhc2UgRGlzcGxheVJl
ZnJlc2hEaXNwYXRjaGluZ1RvTWFpblRocmVhZDogcmV0dXJuICJEaXNwbGF5UmVmcmVzaERpc3Bh
dGNoaW5nVG9NYWluVGhyZWFkIjsKKyAgICBjYXNlIENvbXB1dGVFdmVudFJlZ2lvbnNTdGFydDog
cmV0dXJuICJDb21wdXRlRXZlbnRSZWdpb25zU3RhcnQiOworICAgIGNhc2UgQ29tcHV0ZUV2ZW50
UmVnaW9uc0VuZDogcmV0dXJuICJDb21wdXRlRXZlbnRSZWdpb25zRW5kIjsKKyAgICBjYXNlIFNj
aGVkdWxlUmVuZGVyaW5nVXBkYXRlOiByZXR1cm4gIlNjaGVkdWxlUmVuZGVyaW5nVXBkYXRlIjsK
KyAgICBjYXNlIFRyaWdnZXJSZW5kZXJpbmdVcGRhdGU6IHJldHVybiAiVHJpZ2dlclJlbmRlcmlu
Z1VwZGF0ZSI7CisgICAgY2FzZSBSZW5kZXJpbmdVcGRhdGVTdGFydDogcmV0dXJuICJSZW5kZXJp
bmdVcGRhdGVTdGFydCI7CisgICAgY2FzZSBSZW5kZXJpbmdVcGRhdGVFbmQ6IHJldHVybiAiUmVu
ZGVyaW5nVXBkYXRlRW5kIjsKKyAgICBjYXNlIENvbXBvc2l0aW5nVXBkYXRlU3RhcnQ6IHJldHVy
biAiQ29tcG9zaXRpbmdVcGRhdGVTdGFydCI7CisgICAgY2FzZSBDb21wb3NpdGluZ1VwZGF0ZUVu
ZDogcmV0dXJuICJDb21wb3NpdGluZ1VwZGF0ZUVuZCI7CisgICAgY2FzZSBEaXNwYXRjaFRvdWNo
RXZlbnRzU3RhcnQ6IHJldHVybiAiRGlzcGF0Y2hUb3VjaEV2ZW50c1N0YXJ0IjsKKyAgICBjYXNl
IERpc3BhdGNoVG91Y2hFdmVudHNFbmQ6IHJldHVybiAiRGlzcGF0Y2hUb3VjaEV2ZW50c0VuZCI7
CisgICAgY2FzZSBQYXJzZUhUTUxTdGFydDogcmV0dXJuICJQYXJzZUhUTUxTdGFydCI7CisgICAg
Y2FzZSBQYXJzZUhUTUxFbmQ6IHJldHVybiAiUGFyc2VIVE1MRW5kIjsKKyAgICBjYXNlIFByZWZl
cnJlZEZyYW1lSW50ZXJ2YWw6IHJldHVybiAiUHJlZmVycmVkRnJhbWVJbnRlcnZhbCI7CisgICAg
Y2FzZSBEaXNwbGF5TGlzdFJlcGxheVN0YXJ0OiByZXR1cm4gIkRpc3BsYXlMaXN0UmVwbGF5U3Rh
cnQiOworICAgIGNhc2UgRGlzcGxheUxpc3RSZXBsYXlFbmQ6IHJldHVybiAiRGlzcGxheUxpc3RS
ZXBsYXlFbmQiOworICAgIGNhc2UgU2Nyb2xsaW5nVGhyZWFkaGFuZGxlV2hlZWxFdmVudEFmdGVy
TWFpblRocmVhZDogcmV0dXJuICJTY3JvbGxpbmdUaHJlYWRoYW5kbGVXaGVlbEV2ZW50QWZ0ZXJN
YWluVGhyZWFkIjsKKyAgICBjYXNlIFNjcm9sbGluZ1RocmVhZFJlbmRlclVwZGF0ZVN5bmNTdGFy
dDogcmV0dXJuICJTY3JvbGxpbmdUaHJlYWRSZW5kZXJVcGRhdGVTeW5jU3RhcnQiOworICAgIGNh
c2UgU2Nyb2xsaW5nVGhyZWFkUmVuZGVyVXBkYXRlU3luY0VuZDogcmV0dXJuICJTY3JvbGxpbmdU
aHJlYWRSZW5kZXJVcGRhdGVTeW5jRW5kIjsKKyAgICBjYXNlIFNjcm9sbGluZ1RocmVhZERpc3Bs
YXlEaWRSZWZyZXNoU3RhcnQ6IHJldHVybiAiU2Nyb2xsaW5nVGhyZWFkRGlzcGxheURpZFJlZnJl
c2hTdGFydCI7CisgICAgY2FzZSBTY3JvbGxpbmdUaHJlYWREaXNwbGF5RGlkUmVmcmVzaEVuZDog
cmV0dXJuICJTY3JvbGxpbmdUaHJlYWREaXNwbGF5RGlkUmVmcmVzaEVuZCI7CisgICAgY2FzZSBT
Y3JvbGxBbmltYXRpb25LaW5ldGljYW5pbWF0aW9uVGltZXJGaXJlZDogcmV0dXJuICJTY3JvbGxB
bmltYXRpb25LaW5ldGljYW5pbWF0aW9uVGltZXJGaXJlZCI7CisgICAgY2FzZSBTY3JvbGxpbmdU
cmVlRnJhbWVTY3JvbGxpbmdOb2RlTmljb3NpYUVuc3VyZVNjcm9sbEFuaW1hdGlvbktpbmV0aWM6
IHJldHVybiAiU2Nyb2xsaW5nVHJlZUZyYW1lU2Nyb2xsaW5nTm9kZU5pY29zaWFFbnN1cmVTY3Jv
bGxBbmltYXRpb25LaW5ldGljIjsKKyAgICBjYXNlIFNjcm9sbFZpZXdzZXRTY3JvbGxPZmZzZXQ6
IHJldHVybiAiU2Nyb2xsVmlld3NldFNjcm9sbE9mZnNldCI7CisgICAgY2FzZSBXZWJIVE1MVmll
d1BhaW50U3RhcnQ6IHJldHVybiAiV2ViSFRNTFZpZXdQYWludFN0YXJ0IjsKKyAgICBjYXNlIFdl
YkhUTUxWaWV3UGFpbnRFbmQ6IHJldHVybiAiV2ViSFRNTFZpZXdQYWludEVuZCI7CisgICAgY2Fz
ZSBFdmVudERpc3BhdGNoZXJ3aGVlbEV2ZW50OiByZXR1cm4gIkV2ZW50RGlzcGF0Y2hlcndoZWVs
RXZlbnQiOworICAgIGNhc2UgTGF5ZXJGbHVzaFRpbWVyRmlyZWQ6IHJldHVybiAiTGF5ZXJGbHVz
aFRpbWVyRmlyZWQiOworICAgIGNhc2UgVGhyZWFkZWRDb21wb3NpdG9yUmVuZGVyTGF5ZXJUcmVl
OiByZXR1cm4gIlRocmVhZGVkQ29tcG9zaXRvclJlbmRlckxheWVyVHJlZSI7CisgICAgY2FzZSBC
YWNraW5nU3RvcmVGbHVzaFN0YXJ0OiByZXR1cm4gIkJhY2tpbmdTdG9yZUZsdXNoU3RhcnQiOwor
ICAgIGNhc2UgQmFja2luZ1N0b3JlRmx1c2hFbmQ6IHJldHVybiAiQmFja2luZ1N0b3JlRmx1c2hF
bmQiOworICAgIGNhc2UgQnVpbGRUcmFuc2FjdGlvblN0YXJ0OiByZXR1cm4gIkJ1aWxkVHJhbnNh
Y3Rpb25TdGFydCI7CisgICAgY2FzZSBCdWlsZFRyYW5zYWN0aW9uRW5kOiByZXR1cm4gIkJ1aWxk
VHJhbnNhY3Rpb25FbmQiOworICAgIGNhc2UgU3luY01lc3NhZ2VTdGFydDogcmV0dXJuICJTeW5j
TWVzc2FnZVN0YXJ0IjsKKyAgICBjYXNlIFN5bmNNZXNzYWdlRW5kOiByZXR1cm4gIlN5bmNNZXNz
YWdlRW5kIjsKKyAgICBjYXNlIFN5bmNUb3VjaEV2ZW50U3RhcnQ6IHJldHVybiAiU3luY1RvdWNo
RXZlbnRTdGFydCI7CisgICAgY2FzZSBTeW5jVG91Y2hFdmVudEVuZDogcmV0dXJuICJTeW5jVG91
Y2hFdmVudEVuZCI7CisgICAgY2FzZSBJbml0aWFsaXplV2ViUHJvY2Vzc1N0YXJ0OiByZXR1cm4g
IkluaXRpYWxpemVXZWJQcm9jZXNzU3RhcnQiOworICAgIGNhc2UgSW5pdGlhbGl6ZVdlYlByb2Nl
c3NFbmQ6IHJldHVybiAiSW5pdGlhbGl6ZVdlYlByb2Nlc3NFbmQiOworICAgIGNhc2UgUmVuZGVy
aW5nVXBkYXRlUnVuTG9vcE9ic2VydmVyU3RhcnQ6IHJldHVybiAiUmVuZGVyaW5nVXBkYXRlUnVu
TG9vcE9ic2VydmVyU3RhcnQiOworICAgIGNhc2UgUmVuZGVyaW5nVXBkYXRlUnVuTG9vcE9ic2Vy
dmVyRW5kOiByZXR1cm4gIlJlbmRlcmluZ1VwZGF0ZVJ1bkxvb3BPYnNlcnZlckVuZCI7CisgICAg
Y2FzZSBMYXllclRyZWVGcmVlemVTdGFydDogcmV0dXJuICJMYXllclRyZWVGcmVlemVTdGFydCI7
CisgICAgY2FzZSBMYXllclRyZWVGcmVlemVFbmQ6IHJldHVybiAiTGF5ZXJUcmVlRnJlZXplRW5k
IjsKKyAgICBjYXNlIEZsdXNoUmVtb3RlSW1hZ2VCdWZmZXJTdGFydDogcmV0dXJuICJGbHVzaFJl
bW90ZUltYWdlQnVmZmVyU3RhcnQiOworICAgIGNhc2UgRmx1c2hSZW1vdGVJbWFnZUJ1ZmZlckVu
ZDogcmV0dXJuICJGbHVzaFJlbW90ZUltYWdlQnVmZmVyRW5kIjsKKyAgICBjYXNlIENvbW1pdExh
eWVyVHJlZVN0YXJ0OiByZXR1cm4gIkNvbW1pdExheWVyVHJlZVN0YXJ0IjsKKyAgICBjYXNlIENv
bW1pdExheWVyVHJlZUVuZDogcmV0dXJuICJDb21taXRMYXllclRyZWVFbmQiOworICAgIGNhc2Ug
UHJvY2Vzc0xhdW5jaFN0YXJ0OiByZXR1cm4gIlByb2Nlc3NMYXVuY2hTdGFydCI7CisgICAgY2Fz
ZSBQcm9jZXNzTGF1bmNoRW5kOiByZXR1cm4gIlByb2Nlc3NMYXVuY2hFbmQiOworICAgIGNhc2Ug
SW5pdGlhbGl6ZVNhbmRib3hTdGFydDogcmV0dXJuICJJbml0aWFsaXplU2FuZGJveFN0YXJ0IjsK
KyAgICBjYXNlIEluaXRpYWxpemVTYW5kYm94RW5kOiByZXR1cm4gIkluaXRpYWxpemVTYW5kYm94
RW5kIjsKKyAgICBjYXNlIEdQVVByb2Nlc3NSYW5nZTogcmV0dXJuICJHUFVQcm9jZXNzUmFuZ2Ui
OworICAgIGNhc2UgV2FrZVVwQW5kQXBwbHlEaXNwbGF5TGlzdFN0YXJ0OiByZXR1cm4gIldha2VV
cEFuZEFwcGx5RGlzcGxheUxpc3RTdGFydCI7CisgICAgY2FzZSBXYWtlVXBBbmRBcHBseURpc3Bs
YXlMaXN0RW5kOiByZXR1cm4gIldha2VVcEFuZEFwcGx5RGlzcGxheUxpc3RFbmQiOworICAgIGNh
c2UgV1RGUmFuZ2U6CisgICAgY2FzZSBKYXZhU2NyaXB0UmFuZ2U6CisgICAgY2FzZSBXZWJDb3Jl
UmFuZ2U6CisgICAgY2FzZSBXZWJLaXRSYW5nZToKKyAgICBjYXNlIFdlYktpdDJSYW5nZToKKyAg
ICBjYXNlIFVJUHJvY2Vzc1JhbmdlOgorICAgICAgICByZXR1cm4gIiI7CisgICAgfTsKKworICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAiIjsKK307CisKK25hbWVzcGFjZSBX
VEYgeworCit2b2lkIGluaXRpYWxpemVQZXJmZXR0b0ZvckN1cnJlbnRQcm9jZXNzKCk7CisKK2Ns
YXNzIFRyYWNlU2NvcGUgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgor
CisgICAgVHJhY2VTY29wZShUcmFjZVBvaW50Q29kZSBlbnRyeUNvZGUsIFRyYWNlUG9pbnRDb2Rl
LCB1aW50NjRfdCA9IDAsIHVpbnQ2NF90ID0gMCwgdWludDY0X3QgPSAwLCB1aW50NjRfdCA9IDAp
CisgICAgICAgIDogbV9lbnRyeUNvZGUoZW50cnlDb2RlKQorICAgIHsKKyAgICAgICAgcGVyZmV0
dG86OkR5bmFtaWNDYXRlZ29yeSBkeW5hbWljQ2F0ZWdvcnl7VFJBQ0VfUE9JTlRfVE9fQ0FURUdP
UlkoZW50cnlDb2RlKX07CisgICAgICAgIFRSQUNFX0VWRU5UX0JFR0lOKGR5bmFtaWNDYXRlZ29y
eSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBbJl0ocGVyZmV0dG86OkV2ZW50Q29udGV4dCBj
dHgpIHsKKyAgICAgICAgICAgICAgICBjdHguZXZlbnQoKS0+c2V0X25hbWUodHJhY2VQb2ludENv
ZGVUb1N0cmluZyhlbnRyeUNvZGUpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAg
ICB+VHJhY2VTY29wZSgpCisgICAgeworICAgICAgICBwZXJmZXR0bzo6RHluYW1pY0NhdGVnb3J5
IGR5bmFtaWNDYXRlZ29yeXtUUkFDRV9QT0lOVF9UT19DQVRFR09SWShtX2VudHJ5Q29kZSl9Owor
ICAgICAgICBUUkFDRV9FVkVOVF9FTkQoZHluYW1pY0NhdGVnb3J5KTsKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgVHJhY2VQb2ludENvZGUgbV9lbnRyeUNvZGU7Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXVEYKKwordXNpbmcgV1RGOjpUcmFjZVNjb3BlOworI2RlZmluZSB0cmFjZVBvaW50KGNvZGUs
IC4uLikgVFJBQ0VfRVZFTlQoVFJBQ0VfUE9JTlRfVE9fQ0FURUdPUlkoY29kZSksICNjb2RlKQor
I2Vsc2UKIG5hbWVzcGFjZSBXVEYgewogCiBpbmxpbmUgdm9pZCB0cmFjZVBvaW50KFRyYWNlUG9p
bnRDb2RlIGNvZGUsIHVpbnQ2NF90IGRhdGExID0gMCwgdWludDY0X3QgZGF0YTIgPSAwLCB1aW50
NjRfdCBkYXRhMyA9IDAsIHVpbnQ2NF90IGRhdGE0ID0gMCkKQEAgLTE3MCw2ICszNDMsNyBAQCBw
cml2YXRlOgogCiB1c2luZyBXVEY6OlRyYWNlU2NvcGU7CiB1c2luZyBXVEY6OnRyYWNlUG9pbnQ7
CisjZW5kaWYKIAogI2VuZGlmIC8vIF9fY3BsdXNwbHVzCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
VEYvd3RmL3BlcmZldHRvL3BlcmZldHRvLmNjIGIvU291cmNlL1dURi93dGYvcGVyZmV0dG8vcGVy
ZmV0dG8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uOTdiOTcyMjY1MDZlODdkZDQ0MTVhNzA4MzNhM2U5MTc2NWVl
NzIyNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XVEYvd3RmL3BlcmZldHRvL3BlcmZldHRv
LmNjCkBAIC0wLDAgKzEsNjMyMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyAKKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUg
TGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNl
IHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91
IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8v
d3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWly
ZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisv
LyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMg
SVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJ
TkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRo
ZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0
aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisvLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxs
eSBnZW5lcmF0ZWQgYnkgZ2VuX2FtYWxnYW1hdGVkLiBEbyBub3QgZWRpdC4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkOiBwcmVkZWZpbmVkIG1hY3JvcworI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JV
Rl9OT19SVFRJKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTk9fUlRUSQorI2VuZGlmCisjaWYg
IWRlZmluZWQoUEVSRkVUVE9fSU1QTEVNRU5UQVRJT04pCisjZGVmaW5lIFBFUkZFVFRPX0lNUExF
TUVOVEFUSU9OCisjZW5kaWYKKyNpZiAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElD
X0lOSVRJQUxJWkVSKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJ
WkVSCisjZW5kaWYKKyNpbmNsdWRlICJwZXJmZXR0by5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIHNvdXJjZTogc3JjL2Jhc2UvZmlsZV91dGlscy5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vYnVpbGRfY29uZmlnL3BlcmZldHRvX2J1aWxk
X2ZsYWdzLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3Vy
Y2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy
c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g
YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5v
cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj
YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl
ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor
ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs
YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0
aGUgTGljZW5zZS4KKyAqLworCisvLyBHZW5lcmF0ZWQgYnkgLi4vLi4vZ24vd3JpdGVfYnVpbGRm
bGFnX2hlYWRlci5weQorCisvLyBmaXhfaW5jbHVkZV9ndWFyZHM6IG9mZgorI2lmbmRlZiBHRU5f
QlVJTERfQ09ORklHX1BFUkZFVFRPX0JVSUxEX0ZMQUdTX0hfCisjZGVmaW5lIEdFTl9CVUlMRF9D
T05GSUdfUEVSRkVUVE9fQlVJTERfRkxBR1NfSF8KKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2Rl
ZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0FORFJPSURfQlVJTEQoKSAo
MCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19DSFJPTUlVTV9C
VUlMRCgpICgwKQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX1NU
QU5EQUxPTkVfQlVJTEQoKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9Q
RVJGRVRUT19TVEFSVF9EQUVNT05TKCkgKDEpCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19E
RUZJTkVfUEVSRkVUVE9fSVBDKCkgKDEpCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJ
TkVfUEVSRkVUVE9fV0FUQ0hET0coKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RF
RklORV9QRVJGRVRUT19DT01QT05FTlRfQlVJTEQoKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJ
TERGTEFHX0RFRklORV9QRVJGRVRUT19GT1JDRV9ETE9HX09OKCkgKDApCisjZGVmaW5lIFBFUkZF
VFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fRk9SQ0VfRExPR19PRkYoKSAoMCkKKyNkZWZp
bmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19WRVJCT1NFX0xPR1MoKSAoMSkK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19WRVJTSU9OX0dFTigp
ICgwKQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX1RQX1BFUkNF
TlRJTEUoKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19U
UF9MSU5FTk9JU0UoKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJG
RVRUT19UUF9IVFRQRCgpICgwKQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BF
UkZFVFRPX1RQX0pTT04oKSAoMSkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9Q
RVJGRVRUT19MT0NBTF9TWU1CT0xJWkVSKCkgKDApCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxB
R19ERUZJTkVfUEVSRkVUVE9fWkxJQigpICgxKQorCisvLyBjbGFuZy1mb3JtYXQgb24KKyNlbmRp
ZiAgLy8gR0VOX0JVSUxEX0NPTkZJR19QRVJGRVRUT19CVUlMRF9GTEFHU19IXworLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICog
TGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNl
bnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNl
IHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vu
c2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNF
LTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQg
dG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNl
IGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJ
RVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4K
KyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBw
ZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisK
KyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19CQVNFX0JVSUxEX0NPTkZJR19IXworI2RlZmluZSBJ
TkNMVURFX1BFUkZFVFRPX0JBU0VfQlVJTERfQ09ORklHX0hfCisKKy8vIEFsbG93cyB0byBkZWZp
bmUgYnVpbGQgZmxhZ3MgdGhhdCBnaXZlIGEgY29tcGlsZXIgZXJyb3IgaWYgdGhlIGhlYWRlciB0
aGF0CisvLyBkZWZpbmVkIHRoZSBmbGFnIGlzIG5vdCBpbmNsdWRlZCwgaW5zdGVhZCBvZiBzaWxl
bnRseSBpZ25vcmluZyB0aGUgI2lmIGJsb2NrLgorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdf
Q0FUX0lORElSRUNUKGEsIGIpIGEjI2IKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0NBVChh
LCBiKSBQRVJGRVRUT19CVUlMREZMQUdfQ0FUX0lORElSRUNUKGEsIGIpCisjZGVmaW5lIFBFUkZF
VFRPX0JVSUxERkxBRyhmbGFnKSBcCisgIChQRVJGRVRUT19CVUlMREZMQUdfQ0FUKFBFUkZFVFRP
X0JVSUxERkxBR19ERUZJTkVfLCBmbGFnKSgpKQorCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19BTkRST0lEKCkg
MQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX01BQ09TWCgp
IDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19MSU5VWCgp
IDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19XSU4oKSAw
CisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfV0FTTSgpIDAK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19GVUNIU0lBKCkg
MAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX05BQ0woKSAw
CisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfSU9TKCkgMAor
I2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJ
TkVfUEVSRkVUVE9fT1NfQU5EUk9JRCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RF
RklORV9QRVJGRVRUT19PU19NQUNPU1goKSAxCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19E
RUZJTkVfUEVSRkVUVE9fT1NfTElOVVgoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19E
RUZJTkVfUEVSRkVUVE9fT1NfV0lOKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVG
SU5FX1BFUkZFVFRPX09TX1dBU00oKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJ
TkVfUEVSRkVUVE9fT1NfRlVDSFNJQSgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RF
RklORV9QRVJGRVRUT19PU19OQUNMKCkgMAorLy8gSW5jbHVkZSBUQVJHRVRfT1NfSVBIT05FIHdo
ZW4gb24gX19BUFBMRV9fIHN5c3RlbXMuCisjaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+
CisjaWYgZGVmaW5lZChUQVJHRVRfT1NfSVBIT05FKSAmJiBUQVJHRVRfT1NfSVBIT05FCisjZGVm
aW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfSU9TKCkgMQorI2Vsc2UK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19JT1MoKSAwCisj
ZW5kaWYKKyNlbGlmIGRlZmluZWQoX19saW51eF9fKQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZM
QUdfREVGSU5FX1BFUkZFVFRPX09TX0FORFJPSUQoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxE
RkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfTUFDT1NYKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlM
REZMQUdfREVGSU5FX1BFUkZFVFRPX09TX0xJTlVYKCkgMQorI2RlZmluZSBQRVJGRVRUT19CVUlM
REZMQUdfREVGSU5FX1BFUkZFVFRPX09TX1dJTigpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERG
TEFHX0RFRklORV9QRVJGRVRUT19PU19XQVNNKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZM
QUdfREVGSU5FX1BFUkZFVFRPX09TX0ZVQ0hTSUEoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxE
RkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfTkFDTCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERG
TEFHX0RFRklORV9QRVJGRVRUT19PU19JT1MoKSAwCisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyNk
ZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19BTkRST0lEKCkgMAor
I2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX01BQ09TWCgpIDAK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19MSU5VWCgpIDAK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19XSU4oKSAxCisj
ZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfV0FTTSgpIDAKKyNk
ZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19GVUNIU0lBKCkgMAor
I2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX05BQ0woKSAwCisj
ZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfSU9TKCkgMAorI2Vs
aWYgZGVmaW5lZChfX0VNU0NSSVBURU5fXykKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RF
RklORV9QRVJGRVRUT19PU19BTkRST0lEKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdf
REVGSU5FX1BFUkZFVFRPX09TX01BQ09TWCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFH
X0RFRklORV9QRVJGRVRUT19PU19MSU5VWCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFH
X0RFRklORV9QRVJGRVRUT19PU19XSU4oKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19E
RUZJTkVfUEVSRkVUVE9fT1NfV0FTTSgpIDEKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RF
RklORV9QRVJGRVRUT19PU19GVUNIU0lBKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdf
REVGSU5FX1BFUkZFVFRPX09TX05BQ0woKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19E
RUZJTkVfUEVSRkVUVE9fT1NfSU9TKCkgMAorI2VsaWYgZGVmaW5lZChfX0Z1Y2hzaWFfXykKKyNk
ZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19BTkRST0lEKCkgMAor
I2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX01BQ09TWCgpIDAK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19MSU5VWCgpIDAK
KyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19XSU4oKSAwCisj
ZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfV0FTTSgpIDAKKyNk
ZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19GVUNIU0lBKCkgMQor
I2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX05BQ0woKSAwCisj
ZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfSU9TKCkgMAorI2Vs
aWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFH
X0RFRklORV9QRVJGRVRUT19PU19BTkRST0lEKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZM
QUdfREVGSU5FX1BFUkZFVFRPX09TX01BQ09TWCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERG
TEFHX0RFRklORV9QRVJGRVRUT19PU19MSU5VWCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERG
TEFHX0RFRklORV9QRVJGRVRUT19PU19XSU4oKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxB
R19ERUZJTkVfUEVSRkVUVE9fT1NfV0FTTSgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFH
X0RFRklORV9QRVJGRVRUT19PU19GVUNIU0lBKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZM
QUdfREVGSU5FX1BFUkZFVFRPX09TX05BQ0woKSAxCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxB
R19ERUZJTkVfUEVSRkVUVE9fT1NfSU9TKCkgMAorI2Vsc2UKKyNlcnJvciBPUyBub3Qgc3VwcG9y
dGVkIChzZWUgYnVpbGRfY29uZmlnLmgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jbGFuZ19f
KQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0NPTVBJTEVSX0NM
QU5HKCkgMQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0NPTVBJ
TEVSX0dDQygpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19D
T01QSUxFUl9NU1ZDKCkgMAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgLy8gQ2FyZWZ1bDogQ2xh
bmcgYWxzbyBkZWZpbmVzIHRoaXMhCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVf
UEVSRkVUVE9fQ09NUElMRVJfQ0xBTkcoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19E
RUZJTkVfUEVSRkVUVE9fQ09NUElMRVJfR0NDKCkgMQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZM
QUdfREVGSU5FX1BFUkZFVFRPX0NPTVBJTEVSX01TVkMoKSAwCisjZWxpZiBkZWZpbmVkKF9NU0Nf
VkVSKQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0NPTVBJTEVS
X0NMQU5HKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0NP
TVBJTEVSX0dDQygpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRU
T19DT01QSUxFUl9NU1ZDKCkgMQorI2Vsc2UKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RF
RklORV9QRVJGRVRUT19DT01QSUxFUl9DTEFORygpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERG
TEFHX0RFRklORV9QRVJGRVRUT19DT01QSUxFUl9HQ0MoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JV
SUxERkxBR19ERUZJTkVfUEVSRkVUVE9fQ09NUElMRVJfTVNWQygpIDAKKyNlbmRpZgorCisjaWYg
ZGVmaW5lZChQRVJGRVRUT19CVUlMRF9XSVRIX0FORFJPSURfVVNFUkRFQlVHKQorI2RlZmluZSBQ
RVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0FORFJPSURfVVNFUkRFQlVHX0JVSUxE
KCkgMQorI2Vsc2UKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19B
TkRST0lEX1VTRVJERUJVR19CVUlMRCgpIDAKKyNlbmRpZgorCisvLyBwZXJmZXR0b19idWlsZF9m
bGFncy5oIGNvbnRhaW5zIHRoZSB0d2Vha2FibGUgYnVpbGQgZmxhZ3MgZGVmaW5lZCB2aWEgR04u
CisvLyAtIEluIEdOIGJ1aWxkcyAoZS5nLiwgc3RhbmRhbG9uZSwgY2hyb21pdW0sIHY4KSB0aGlz
IGZpbGUgaXMgZ2VuZXJhdGVkIGF0CisvLyAgIGJ1aWxkIHRpbWUgdmlhIHRoZSBnZW5fcnVsZSAv
L2duL2dlbl9idWlsZGZsYWdzLgorLy8gLSBJbiBBbmRyb2lkIGluLXRyZWUgYnVpbGRzLCB0aGlz
IGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHRvb2xzL2dlbl9hbmRyb2lkX2JwCisvLyAgIGFuZCBjaGVj
a2VkIGluIGludG8gaW5jbHVkZS9wZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZ3MvYW5kcm9pZF90
cmVlLy4gVGhlCisvLyAgIGRlZmF1bHQgY2ZsYWdzIGFkZCB0aGlzIHBhdGggdG8gdGhlIGRlZmF1
bHQgaW5jbHVkZSBwYXRoLgorLy8gLSBTaW1pbGFybHksIGluIGJhemVsIGJ1aWxkcywgdGhpcyBm
aWxlIGlzIGdlbmVyYXRlZCBieSB0b29scy9nZW5fYmF6ZWwgYW5kCisvLyAgIGNoZWNrZWQgaW4g
aW50byBpbmNsdWRlL3BlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlncy9iYXplbC8uCisvLyAtIElu
IGFtYWdsYW1hdGVkIGJ1aWxkcywgdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSB0b29scy9nZW5f
YW1hbGdhbWF0ZWQgYW5kCisvLyAgIGFkZGVkIHRvIHRoZSBhbWFsZ2FtYXRlZCBoZWFkZXJzLgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG9fYnVpbGRfZmxh
Z3MuaCIgIC8vIG5vLWluY2x1ZGUtdmlvbGF0aW9uLWNoZWNrCisKKyNlbmRpZiAgLy8gSU5DTFVE
RV9QRVJGRVRUT19CQVNFX0JVSUxEX0NPTkZJR19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9iYXNlL2xvZ2dpbmcuaAorLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9iYXNlL2NvbXBpbGVyLmgKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElD
RU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdy
ZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj
ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJS
QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp
ZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p
bmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAq
LworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9DT01QSUxFUl9IXworI2RlZmluZSBJ
TkNMVURFX1BFUkZFVFRPX0JBU0VfQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRz
PgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L2J1aWxkX2NvbmZpZy5oIgorCisjZGVmaW5lIFBFUkZFVFRPX0xJS0VMWShfeCkgX19idWlsdGlu
X2V4cGVjdCghIShfeCksIDEpCisjZGVmaW5lIFBFUkZFVFRPX1VOTElLRUxZKF94KSBfX2J1aWx0
aW5fZXhwZWN0KCEhKF94KSwgMCkKKworI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQo
X19jbGFuZ19fKQorI2RlZmluZSBQRVJGRVRUT19XQVJOX1VOVVNFRF9SRVNVTFQgX19hdHRyaWJ1
dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX1dBUk5f
VU5VU0VEX1JFU1VMVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUg
UEVSRkVUVE9fQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykp
CisjZGVmaW5lIFBFUkZFVFRPX05PX0lOTElORSBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18p
KQorI2Vsc2UKKy8vIEdDQyBpcyB0b28gcGVkYW50aWMgYW5kIG9mdGVuIGZhaWxzIHdpdGggdGhl
IGVycm9yOgorLy8gImFsd2F5c19pbmxpbmUgZnVuY3Rpb24gbWlnaHQgbm90IGJlIGlubGluYWJs
ZSIKKyNkZWZpbmUgUEVSRkVUVE9fQUxXQVlTX0lOTElORQorI2RlZmluZSBQRVJGRVRUT19OT19J
TkxJTkUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX2NsYW5n
X18pCisjZGVmaW5lIFBFUkZFVFRPX0RFQlVHX0ZVTkNUSU9OX0lERU5USUZJRVIoKSBfX1BSRVRU
WV9GVU5DVElPTl9fCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBQRVJGRVRUT19E
RUJVR19GVU5DVElPTl9JREVOVElGSUVSKCkgX19GVU5DU0lHX18KKyNlbHNlCisjZGVmaW5lIFBF
UkZFVFRPX0RFQlVHX0ZVTkNUSU9OX0lERU5USUZJRVIoKSBcCisgIHN0YXRpY19hc3NlcnQoZmFs
c2UsICJOb3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgY29tcGlsZXIiKQorI2VuZGlmCisKKyNpZiBk
ZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgUEVSRkVUVE9f
UFJJTlRGX0ZPUk1BVCh4LCB5KSBcCisgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmlu
dGZfXywgeCwgeSkpKQorI2Vsc2UKKyNkZWZpbmUgUEVSRkVUVE9fUFJJTlRGX0ZPUk1BVCh4LCB5
KQorI2VuZGlmCisKKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfSU9TKQorLy8g
VE9ETyhiLzE1ODgxNDA2OCk6IEZvciBpT1MgYnVpbGRzLCB0aHJlYWRfbG9jYWwgaXMgb25seSBz
dXBwb3J0ZWQgc2luY2UgaU9TCisvLyA4LiBXZSdkIGhhdmUgdG8gdXNlIHB0aHJlYWQgZm9yIHRo
cmVhZCBsb2NhbCBkYXRhIGluc3RlYWQgaGVyZS4gRm9yIG5vdywganVzdAorLy8gZGVmaW5lIGl0
IHRvIG5vdGhpbmcgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIHBlcmZldHRvIG9yIHRo
ZSBjbGllbnQKKy8vIGxpYiBvbiBpT1MgcmlnaHQgbm93LgorI2RlZmluZSBQRVJGRVRUT19USFJF
QURfTE9DQUwKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX1RIUkVBRF9MT0NBTCB0aHJlYWRfbG9j
YWwKKyNlbmRpZgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCit0
ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KK2lubGluZSB2b2lkIGlnbm9yZV9yZXN1bHQoY29uc3Qg
VCYuLi4pIHt9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0JBU0VfQ09NUElMRVJfSF8KKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS9leHBvcnQu
aAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9q
ZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIu
MCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBp
biBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkg
b2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNl
bnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxh
dyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVy
IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRI
T1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mg
b3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdl
IGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNl
bnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19CQVNFX0VYUE9SVF9IXworI2Rl
ZmluZSBJTkNMVURFX1BFUkZFVFRPX0JBU0VfRVhQT1JUX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisKKyNp
ZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fQ09NUE9ORU5UX0JVSUxEKQorCisjaWYgUEVS
RkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikKKworI2lmIGRlZmluZWQoUEVSRkVUVE9f
SU1QTEVNRU5UQVRJT04pCisjZGVmaW5lIFBFUkZFVFRPX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4
cG9ydCkKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9y
dCkKKyNlbmRpZgorCisjZWxzZSAgLy8gUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJ
TikKKworI2lmIGRlZmluZWQoUEVSRkVUVE9fSU1QTEVNRU5UQVRJT04pCisjZGVmaW5lIFBFUkZF
VFRPX0VYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2Vsc2UK
KyNkZWZpbmUgUEVSRkVUVE9fRVhQT1JUCisjZW5kaWYKKworI2VuZGlmICAvLyBQRVJGRVRUT19C
VUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorCisjZWxzZSAgLy8gIVBFUkZFVFRPX0JVSUxERkxB
RyhQRVJGRVRUT19DT01QT05FTlRfQlVJTEQpCisKKyNkZWZpbmUgUEVSRkVUVE9fRVhQT1JUCisK
KyNlbmRpZiAgLy8gUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX0NPTVBPTkVOVF9CVUlMRCkK
KworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0JBU0VfRVhQT1JUX0hfCisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBM
aWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vu
c2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ug
d2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5z
ZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0Ut
Mi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0
byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2Ug
aXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElF
UyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgor
ICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBl
cm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwor
I2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0JBU0VfTE9HR0lOR19IXworI2RlZmluZSBJTkNMVURF
X1BFUkZFVFRPX0JBU0VfTE9HR0lOR19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRl
IDxzdHJpbmcuaD4gIC8vIEZvciBzdHJlcnJvci4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvY29tcGlsZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0
LmgiCisKKy8vIElnbm9yZSBHQ0Mgd2FybmluZyBhYm91dCBhIG1pc3NpbmcgYXJndW1lbnQgZm9y
IGEgdmFyaWFkaWMgbWFjcm8gcGFyYW1ldGVyLgorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgor
CisvLyBUT0RPKHByaW1pYW5vKTogbW92ZSB0aGlzIHRvIGJhc2UvYnVpbGRfY29uZmlnLmgsIHR1
cm4gaW50bworLy8gUEVSRkVUVE9fQlVJTERGTEFHKERDSEVDS19JU19PTikgYW5kIHVwZGF0ZSBj
YWxsIHNpdGVzIHRvIHVzZSB0aGF0IGluc3RlYWQuCisjaWYgZGVmaW5lZChOREVCVUcpICYmICFk
ZWZpbmVkKERDSEVDS19BTFdBWVNfT04pCisjZGVmaW5lIFBFUkZFVFRPX0RDSEVDS19JU19PTigp
IDAKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX0RDSEVDS19JU19PTigpIDEKKyNlbmRpZgorCisj
aWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX0ZPUkNFX0RMT0dfT04pCisjZGVmaW5lIFBF
UkZFVFRPX0RMT0dfSVNfT04oKSAxCisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9f
Rk9SQ0VfRExPR19PRkYpCisjZGVmaW5lIFBFUkZFVFRPX0RMT0dfSVNfT04oKSAwCisjZWxzZQor
I2RlZmluZSBQRVJGRVRUT19ETE9HX0lTX09OKCkgUEVSRkVUVE9fRENIRUNLX0lTX09OKCkKKyNl
bmRpZgorCisjaWYgZGVmaW5lZChQRVJGRVRUT19BTkRST0lEX0FTWU5DX1NBRkVfTE9HKQorI2lm
ICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfQU5EUk9JRCkgfHwgXAorICAgICFQRVJG
RVRUT19CVUlMREZMQUcoUEVSRkVUVE9fQU5EUk9JRF9CVUlMRCkKKyNlcnJvciAiQXN5bmMtc2Fm
ZSBsb2dnaW5nIGlzIGxpbWl0ZWQgdG8gQW5kcm9pZCB0cmVlIGJ1aWxkcyIKKyNlbmRpZgorLy8g
Rm9yIGJpbmFyaWVzIHdoaWNoIG5lZWQgYSB2ZXJ5IGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgaW1wbGVt
ZW50YXRpb24uCisvLyBOb3RlIHRoYXQgdGhpcyBoZWFkZXIgaXMgaW5jb21wYXRpYmxlIHdpdGgg
YW5kcm9pZC9sb2cuaC4KKyNpbmNsdWRlIDxhc3luY19zYWZlL2xvZy5oPgorI2VsaWYgUEVSRkVU
VE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0FORFJPSUQpCisvLyBOb3JtYWwgYW5kcm9pZCBsb2dn
aW5nLgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQ29uc3RleHByIGZ1bmN0aW9ucyB0byBleHRy
YWN0IGJhc2VuYW1lKF9fRklMRV9fKSwgZS5nLjogLi4vZm9vL2YuYyAtPiBmLmMgLgorY29uc3Rl
eHByIGNvbnN0IGNoYXIqIFN0ckVuZChjb25zdCBjaGFyKiBzKSB7CisgIHJldHVybiAqcyA/IFN0
ckVuZChzICsgMSkgOiBzOworfQorCitjb25zdGV4cHIgY29uc3QgY2hhciogQmFzZW5hbWVSZWN1
cnNpdmUoY29uc3QgY2hhciogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBjaGFyKiBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBjaGFyKiBlbmQpIHsKKyAgcmV0dXJuICgqcyA9PSAnLycgJiYgcyA8IGVu
ZCkKKyAgICAgICAgICAgICA/IChzICsgMSkKKyAgICAgICAgICAgICA6ICgocyA+IGJlZ2luKSA/
IEJhc2VuYW1lUmVjdXJzaXZlKHMgLSAxLCBiZWdpbiwgZW5kKSA6IHMpOworfQorCitjb25zdGV4
cHIgY29uc3QgY2hhciogQmFzZW5hbWUoY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiBCYXNl
bmFtZVJlY3Vyc2l2ZShTdHJFbmQoc3RyKSwgc3RyLCBTdHJFbmQoc3RyKSk7Cit9CisKK2VudW0g
TG9nTGV2IHsga0xvZ0RlYnVnID0gMCwga0xvZ0luZm8sIGtMb2dJbXBvcnRhbnQsIGtMb2dFcnJv
ciB9OworCitQRVJGRVRUT19FWFBPUlQgdm9pZCBMb2dNZXNzYWdlKExvZ0xldiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZm5hbWUsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBjaGFyKiBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4u
LikgUEVSRkVUVE9fUFJJTlRGX0ZPUk1BVCg0LCA1KTsKKworI2lmIGRlZmluZWQoUEVSRkVUVE9f
QU5EUk9JRF9BU1lOQ19TQUZFX0xPRykKKyNkZWZpbmUgUEVSRkVUVE9fWExPRyhsZXZlbCwgZm10
LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coKEFORFJPSURfTE9HX0RF
QlVHICsgbGV2ZWwpLCAicGVyZmV0dG8iLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIiVzOiVkICIgZm10LCA6OnBlcmZldHRvOjpiYXNlOjpCYXNlbmFtZShfX0ZJTEVf
XyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sICMjX19WQV9BUkdTX18p
OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlICAvLyBk
ZWZpbmVkKFBFUkZFVFRPX0FORFJPSURfQVNZTkNfU0FGRV9MT0cpCisjZGVmaW5lIFBFUkZFVFRP
X1hMT0cobGV2ZWwsIGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICA6OnBlcmZldHRvOjpiYXNlOjpMb2dNZXNzYWdlKGxldmVsLCA6OnBlcmZldHRvOjpi
YXNlOjpCYXNlbmFtZShfX0ZJTEVfXyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBfX0xJTkVfXywgZm10LCAjI19fVkFfQVJHU19fKQorI2VuZGlmICAvLyBkZWZpbmVkKFBFUkZF
VFRPX0FORFJPSURfQVNZTkNfU0FGRV9MT0cpCisKKyNkZWZpbmUgUEVSRkVUVE9fSU1NRURJQVRF
X0NSQVNIKCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19i
dWlsdGluX3RyYXAoKTsgICAgICAgICAgICAgIFwKKyAgICBfX2J1aWx0aW5fdW5yZWFjaGFibGUo
KTsgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZF
VFRPX1ZFUkJPU0VfTE9HUykKKyNkZWZpbmUgUEVSRkVUVE9fTE9HKGZtdCwgLi4uKSBcCisgIFBF
UkZFVFRPX1hMT0coOjpwZXJmZXR0bzo6YmFzZTo6a0xvZ0luZm8sIGZtdCwgIyNfX1ZBX0FSR1Nf
XykKKyNlbHNlICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fVkVSQk9TRV9MT0dTKQor
I2RlZmluZSBQRVJGRVRUT19MT0coLi4uKSA6OnBlcmZldHRvOjpiYXNlOjppZ25vcmVfcmVzdWx0
KF9fVkFfQVJHU19fKQorI2VuZGlmICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fVkVS
Qk9TRV9MT0dTKQorCisjZGVmaW5lIFBFUkZFVFRPX0lMT0coZm10LCAuLi4pIFwKKyAgUEVSRkVU
VE9fWExPRyg6OnBlcmZldHRvOjpiYXNlOjprTG9nSW1wb3J0YW50LCBmbXQsICMjX19WQV9BUkdT
X18pCisjZGVmaW5lIFBFUkZFVFRPX0VMT0coZm10LCAuLi4pIFwKKyAgUEVSRkVUVE9fWExPRyg6
OnBlcmZldHRvOjpiYXNlOjprTG9nRXJyb3IsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUg
UEVSRkVUVE9fRkFUQUwoZm10LCAuLi4pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBQRVJGRVRUT19QTE9HKGZtdCwgIyNfX1ZBX0FSR1NfXyk7
IFwKKyAgICBQRVJGRVRUT19JTU1FRElBVEVfQ1JBU0goKTsgICAgICAgIFwKKyAgfSB3aGlsZSAo
MCkKKworI2RlZmluZSBQRVJGRVRUT19QTE9HKHgsIC4uLikgXAorICBQRVJGRVRUT19FTE9HKHgg
IiAoZXJybm86ICVkLCAlcykiLCAjI19fVkFfQVJHU19fLCBlcnJubywgc3RyZXJyb3IoZXJybm8p
KQorCisjaWYgUEVSRkVUVE9fRExPR19JU19PTigpCisKKyNkZWZpbmUgUEVSRkVUVE9fRExPRyhm
bXQsIC4uLikgXAorICBQRVJGRVRUT19YTE9HKDo6cGVyZmV0dG86OmJhc2U6OmtMb2dEZWJ1Zywg
Zm10LCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIFBFUkZFVFRPX0RQTE9HKHgsIC4uLikgXAor
ICBQRVJGRVRUT19ETE9HKHggIiAoZXJybm86ICVkLCAlcykiLCAjI19fVkFfQVJHU19fLCBlcnJu
bywgc3RyZXJyb3IoZXJybm8pKQorCisjZWxzZSAgLy8gUEVSRkVUVE9fRExPR19JU19PTigpCisK
KyNkZWZpbmUgUEVSRkVUVE9fRExPRyguLi4pIDo6cGVyZmV0dG86OmJhc2U6Omlnbm9yZV9yZXN1
bHQoX19WQV9BUkdTX18pCisjZGVmaW5lIFBFUkZFVFRPX0RQTE9HKC4uLikgOjpwZXJmZXR0bzo6
YmFzZTo6aWdub3JlX3Jlc3VsdChfX1ZBX0FSR1NfXykKKworI2VuZGlmICAvLyBQRVJGRVRUT19E
TE9HX0lTX09OKCkKKworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisKKyNkZWZpbmUgUEVS
RkVUVE9fRENIRUNLKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFBFUkZF
VFRPX1VOTElLRUxZKCEoeCkpKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBFUkZFVFRP
X1BMT0coIiVzIiwgIlBFUkZFVFRPX0NIRUNLKCIgI3ggIikiKTsgXAorICAgICAgUEVSRkVUVE9f
SU1NRURJQVRFX0NSQVNIKCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKwor
I2RlZmluZSBQRVJGRVRUT19DSEVDSyh4KSBQRVJGRVRUT19EQ0hFQ0soeCkKKworI2RlZmluZSBQ
RVJGRVRUT19ERkFUQUwoZm10LCAuLi4pICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgIFBFUkZFVFRPX1BMT0coZm10LCAjI19fVkFfQVJHU19fKTsg
XAorICAgIFBFUkZFVFRPX0lNTUVESUFURV9DUkFTSCgpOyAgICAgICAgXAorICB9IHdoaWxlICgw
KQorCisjZGVmaW5lIFBFUkZFVFRPX0RGQVRBTF9PUl9FTE9HKC4uLikgUEVSRkVUVE9fREZBVEFM
KF9fVkFfQVJHU19fKQorCisjZWxzZSAgLy8gUEVSRkVUVE9fRENIRUNLX0lTX09OKCkKKworI2Rl
ZmluZSBQRVJGRVRUT19EQ0hFQ0soeCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAor
ICB9IHdoaWxlIChmYWxzZSAmJiAoeCkpCisKKyNkZWZpbmUgUEVSRkVUVE9fQ0hFQ0soeCkgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFBFUkZFVFRPX1VOTElLRUxZKCEoeCkp
KSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBFUkZFVFRPX1BMT0coIiVzIiwgIlBFUkZF
VFRPX0NIRUNLKCIgI3ggIikiKTsgXAorICAgICAgUEVSRkVUVE9fSU1NRURJQVRFX0NSQVNIKCk7
ICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQRVJGRVRUT19E
RkFUQUwoLi4uKSA6OnBlcmZldHRvOjpiYXNlOjppZ25vcmVfcmVzdWx0KF9fVkFfQVJHU19fKQor
I2RlZmluZSBQRVJGRVRUT19ERkFUQUxfT1JfRUxPRyguLi4pIFBFUkZFVFRPX0VMT0coX19WQV9B
UkdTX18pCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fRENIRUNLX0lTX09OKCkKKworfSAgLy8gbmFt
ZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xV
REVfUEVSRkVUVE9fQkFTRV9MT0dHSU5HX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL2ZpbGVfdXRpbHMuaAorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQvYmFzZS91dGlscy5oCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1VUSUxTX0hfCisjZGVm
aW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfVVRJTFNfSF8KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvY29tcGls
ZXIuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVk
ZSA8c3RkbGliLmg+CisjaWYgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisj
aW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2RlZmluZSBQRVJGRVRUT19FSU5UUih4
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoWyZdIHsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlY2x0eXBl
KHgpIGVpbnRyX3dyYXBwZXJfcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRv
IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgZWludHJfd3JhcHBlcl9yZXN1bHQgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgIH0gd2hpbGUgKGVpbnRyX3dyYXBwZXJfcmVzdWx0ID09IC0xICYmIGVycm5vID09
IEVJTlRSKTsgXAorICAgIHJldHVybiBlaW50cl93cmFwcGVyX3Jlc3VsdDsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICB9KCkpCisKKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVU
VE9fT1NfV0lOKQorLy8gVE9ETyhicnVjZWRhd3NvbikgLSBjcmVhdGUgYSA6OnBlcmZldHRvOjpi
YXNlOjpJT1NpemUgdG8gcmVwbGFjZSB0aGlzLgorI2lmIGRlZmluZWQoX1dJTjY0KQordXNpbmcg
c3NpemVfdCA9IF9faW50NjQ7CisjZWxzZQordXNpbmcgc3NpemVfdCA9IGxvbmc7CisjZW5kaWYK
KyNlbmRpZgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCisjaWYg
IVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCitjb25zdGV4cHIgdWlkX3Qga0lu
dmFsaWRVaWQgPSBzdGF0aWNfY2FzdDx1aWRfdD4oLTEpOworY29uc3RleHByIHBpZF90IGtJbnZh
bGlkUGlkID0gc3RhdGljX2Nhc3Q8cGlkX3Q+KC0xKTsKKyNlbmRpZgorCitjb25zdGV4cHIgc2l6
ZV90IGtQYWdlU2l6ZSA9IDQwOTY7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY29uc3RleHBy
IHNpemVfdCBBcnJheVNpemUoY29uc3QgVCYgYXJyYXkpIHsKKyAgcmV0dXJuIHNpemVvZihhcnJh
eSkgLyBzaXplb2YoYXJyYXlbMF0pOworfQorCisvLyBGdW5jdGlvbiBvYmplY3Qgd2hpY2ggaW52
b2tlcyAnZnJlZScgb24gaXRzIHBhcmFtZXRlciwgd2hpY2ggbXVzdCBiZQorLy8gYSBwb2ludGVy
LiBDYW4gYmUgdXNlZCB0byBzdG9yZSBtYWxsb2MtYWxsb2NhdGVkIHBvaW50ZXJzIGluIHN0ZDo6
dW5pcXVlX3B0cjoKKy8vCisvLyBzdGQ6OnVuaXF1ZV9wdHI8aW50LCBiYXNlOjpGcmVlRGVsZXRl
cj4gZm9vX3B0cigKKy8vICAgICBzdGF0aWNfY2FzdDxpbnQqPihtYWxsb2Moc2l6ZW9mKGludCkp
KSk7CitzdHJ1Y3QgRnJlZURlbGV0ZXIgeworICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKHZvaWQq
IHB0cikgY29uc3QgeyBmcmVlKHB0cik7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgor
Y29uc3RleHByIFQgQXNzdW1lTGl0dGxlRW5kaWFuKFQgdmFsdWUpIHsKKyAgc3RhdGljX2Fzc2Vy
dChfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXywKKyAgICAgICAgICAg
ICAgICAiVW5pbXBsZW1lbnRlZCBvbiBiaWctZW5kaWFuIGFyY2hzIik7CisgIHJldHVybiB2YWx1
ZTsKK30KKworLy8gUm91bmQgdXAgfHNpemV8IHRvIGEgbXVsdGlwbGUgb2YgfGFsaWdubWVudHwg
KG11c3QgYmUgYSBwb3dlciBvZiB0d28pLgordGVtcGxhdGUgPHNpemVfdCBhbGlnbm1lbnQ+Citj
b25zdGV4cHIgc2l6ZV90IEFsaWduVXAoc2l6ZV90IHNpemUpIHsKKyAgc3RhdGljX2Fzc2VydCgo
YWxpZ25tZW50ICYgKGFsaWdubWVudCAtIDEpKSA9PSAwLCAiYWxpZ25tZW50IG11c3QgYmUgYSBw
b3cyIik7CisgIHJldHVybiAoc2l6ZSArIGFsaWdubWVudCAtIDEpICYgfihhbGlnbm1lbnQgLSAx
KTsKK30KKworaW5saW5lIGJvb2wgSXNBZ2FpbihpbnQgZXJyKSB7CisgIHJldHVybiBlcnIgPT0g
RUFHQUlOIHx8IGVyciA9PSBFV09VTERCTE9DSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UK
K30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9f
RVhUX0JBU0VfVVRJTFNfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQg
T3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGlj
ZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRo
aXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1h
eSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3
LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQg
YnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBk
aXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMi
IEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQs
IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBz
cGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9u
cyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhU
X0JBU0VfRklMRV9VVElMU19IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX0ZJ
TEVfVVRJTFNfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFz
ZS91dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCiti
b29sIFJlYWRGaWxlRGVzY3JpcHRvcihpbnQgZmQsIHN0ZDo6c3RyaW5nKiBvdXQpOworYm9vbCBS
ZWFkRmlsZVN0cmVhbShGSUxFKiBmLCBzdGQ6OnN0cmluZyogb3V0KTsKK2Jvb2wgUmVhZEZpbGUo
Y29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBvdXQpOworCisvLyBDYWxsIHdy
aXRlIHVudGlsIGFsbCBkYXRhIGlzIHdyaXR0ZW4gb3IgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuCisv
LworLy8gbWFuIDIgd3JpdGU6CisvLyAgIElmIGEgd3JpdGUoKSBpcyBpbnRlcnJ1cHRlZCBieSBh
IHNpZ25hbCBoYW5kbGVyIGJlZm9yZSBhbnkgYnl0ZXMgYXJlCisvLyAgIHdyaXR0ZW4sIHRoZW4g
dGhlIGNhbGwgZmFpbHMgd2l0aCB0aGUgZXJyb3IgRUlOVFI7IGlmIGl0IGlzCisvLyAgIGludGVy
cnVwdGVkIGFmdGVyIGF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHdyaXR0ZW4sIHRoZSBjYWxs
CisvLyAgIHN1Y2NlZWRzLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4u
Citzc2l6ZV90IFdyaXRlQWxsKGludCBmZCwgY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgY291bnQp
OworCitib29sIEZsdXNoRmlsZShpbnQgZmQpOworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAg
Ly8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRf
QkFTRV9GSUxFX1VUSUxTX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNs
dWRlL3BlcmZldHRvL2V4dC9iYXNlL3Njb3BlZF9maWxlLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVu
ZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICog
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
aWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgor
ICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisg
KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp
bmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli
dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ
VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhl
IExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMg
YW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElO
Q0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfU0NPUEVEX0ZJTEVfSF8KKyNkZWZpbmUgSU5DTFVERV9Q
RVJGRVRUT19FWFRfQkFTRV9TQ09QRURfRklMRV9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorCisjaW5jbHVk
ZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWYgUEVSRkVUVE9fQlVJTERGTEFH
KFBFUkZFVFRPX09TX1dJTikgJiYgXAorICAgICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9f
Q09NUElMRVJfR0NDKQorI2luY2x1ZGUgPGNvcmVjcnRfaW8uaD4KK3R5cGVkZWYgaW50IG1vZGVf
dDsKKyNlbHNlCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5k
aWYKKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CituYW1lc3BhY2UgYmFzZSB7CisKK2NvbnN0ZXhwciBtb2RlX3Qga0ludmFsaWRNb2RlID0gc3Rh
dGljX2Nhc3Q8bW9kZV90PigtMSk7CisKKy8vIFJBSUkgY2xhc3NlcyBmb3IgYXV0by1yZWxlYXNp
bmcgZmRzIGFuZCBkaXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsCisgICAgICAgICAgaW50ICgq
Q2xvc2VGdW5jdGlvbikoVCksCisgICAgICAgICAgVCBJbnZhbGlkVmFsdWUsCisgICAgICAgICAg
Ym9vbCBDaGVja0Nsb3NlID0gdHJ1ZT4KK2NsYXNzIFNjb3BlZFJlc291cmNlIHsKKyBwdWJsaWM6
CisgIGV4cGxpY2l0IFNjb3BlZFJlc291cmNlKFQgdCA9IEludmFsaWRWYWx1ZSkgOiB0Xyh0KSB7
fQorICBTY29wZWRSZXNvdXJjZShTY29wZWRSZXNvdXJjZSYmIG90aGVyKSBub2V4Y2VwdCB7Cisg
ICAgdF8gPSBvdGhlci50XzsKKyAgICBvdGhlci50XyA9IEludmFsaWRWYWx1ZTsKKyAgfQorICBT
Y29wZWRSZXNvdXJjZSYgb3BlcmF0b3I9KFNjb3BlZFJlc291cmNlJiYgb3RoZXIpIHsKKyAgICBy
ZXNldChvdGhlci50Xyk7CisgICAgb3RoZXIudF8gPSBJbnZhbGlkVmFsdWU7CisgICAgcmV0dXJu
ICp0aGlzOworICB9CisgIFQgZ2V0KCkgY29uc3QgeyByZXR1cm4gdF87IH0KKyAgVCBvcGVyYXRv
ciooKSBjb25zdCB7IHJldHVybiB0XzsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29u
c3QgeyByZXR1cm4gdF8gIT0gSW52YWxpZFZhbHVlOyB9CisgIHZvaWQgcmVzZXQoVCByID0gSW52
YWxpZFZhbHVlKSB7CisgICAgaWYgKHRfICE9IEludmFsaWRWYWx1ZSkgeworICAgICAgaW50IHJl
cyA9IENsb3NlRnVuY3Rpb24odF8pOworICAgICAgaWYgKENoZWNrQ2xvc2UpCisgICAgICAgIFBF
UkZFVFRPX0NIRUNLKHJlcyA9PSAwKTsKKyAgICB9CisgICAgdF8gPSByOworICB9CisgIFQgcmVs
ZWFzZSgpIHsKKyAgICBUIHQgPSB0XzsKKyAgICB0XyA9IEludmFsaWRWYWx1ZTsKKyAgICByZXR1
cm4gdDsKKyAgfQorICB+U2NvcGVkUmVzb3VyY2UoKSB7IHJlc2V0KEludmFsaWRWYWx1ZSk7IH0K
KworIHByaXZhdGU6CisgIFNjb3BlZFJlc291cmNlKGNvbnN0IFNjb3BlZFJlc291cmNlJikgPSBk
ZWxldGU7CisgIFNjb3BlZFJlc291cmNlJiBvcGVyYXRvcj0oY29uc3QgU2NvcGVkUmVzb3VyY2Um
KSA9IGRlbGV0ZTsKKworICBUIHRfOworfTsKKwordXNpbmcgU2NvcGVkRmlsZSA9IFNjb3BlZFJl
c291cmNlPGludCwgY2xvc2UsIC0xPjsKK2lubGluZSBzdGF0aWMgU2NvcGVkRmlsZSBPcGVuRmls
ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV90
IG1vZGUgPSBrSW52YWxpZE1vZGUpIHsKKyAgUEVSRkVUVE9fRENIRUNLKChmbGFncyAmIE9fQ1JF
QVQpID09IDAgfHwgbW9kZSAhPSBrSW52YWxpZE1vZGUpOworI2lmIFBFUkZFVFRPX0JVSUxERkxB
RyhQRVJGRVRUT19PU19XSU4pCisgIC8vIEFsd2F5cyB1c2UgT19CSU5BUlkgb24gV2luZG93cywg
dG8gYXZvaWQgc2lsbHkgRU9MIHRyYW5zbGF0aW9ucy4KKyAgU2NvcGVkRmlsZSBmZChvcGVuKHBh
dGguY19zdHIoKSwgZmxhZ3MgfCBPX0JJTkFSWSwgbW9kZSkpOworI2Vsc2UKKyAgLy8gQWx3YXlz
IG9wZW4gYSBTY29wZWRGaWxlIHdpdGggT19DTE9FWEVDIHNvIHdlIGNhbiBzYWZlbHkgZm9yayBh
bmQgZXhlYy4KKyAgU2NvcGVkRmlsZSBmZChvcGVuKHBhdGguY19zdHIoKSwgZmxhZ3MgfCBPX0NM
T0VYRUMsIG1vZGUpKTsKKyNlbmRpZgorICByZXR1cm4gZmQ7Cit9CisjaWYgIVBFUkZFVFRPX0JV
SUxERkxBRyhQRVJGRVRUT19PU19XSU4pCit1c2luZyBTY29wZWREaXIgPSBTY29wZWRSZXNvdXJj
ZTxESVIqLCBjbG9zZWRpciwgbnVsbHB0cj47CisjZW5kaWYKKwordXNpbmcgU2NvcGVkRnN0cmVh
bSA9IFNjb3BlZFJlc291cmNlPEZJTEUqLCBmY2xvc2UsIG51bGxwdHI+OworCit9ICAvLyBuYW1l
c3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVE
RV9QRVJGRVRUT19FWFRfQkFTRV9TQ09QRURfRklMRV9IXworLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5k
ZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5
b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExp
Y2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisg
KiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAq
IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGlu
Zywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1
dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElU
SU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUg
TGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBh
bmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxz
eXMvc3RhdC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9maWxlX3V0aWxzLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9zY29wZWRf
ZmlsZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
ZXh0L2Jhc2UvdXRpbHMuaCIKKworI2lmICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1Nf
V0lOKSB8fCBcCisgICAgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX0NPTVBJTEVSX0dDQykK
KyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbHNlCisjaW5jbHVkZSA8Y29yZWNydF9pby5oPgorI2lu
Y2x1ZGUgPGlvLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBi
YXNlIHsKK25hbWVzcGFjZSB7Citjb25zdGV4cHIgc2l6ZV90IGtCdWZTaXplID0gMjA0ODsKK30K
KworYm9vbCBSZWFkRmlsZURlc2NyaXB0b3IoaW50IGZkLCBzdGQ6OnN0cmluZyogb3V0KSB7Cisg
IC8vIERvIG5vdCBvdmVycmlkZSBleGlzdGluZyBkYXRhIGluIHN0cmluZy4KKyAgc2l6ZV90IGkg
PSBvdXQtPnNpemUoKTsKKworICBzdHJ1Y3Qgc3RhdCBidWYge307CisgIGlmIChmc3RhdChmZCwg
JmJ1ZikgIT0gLTEpIHsKKyAgICBpZiAoYnVmLnN0X3NpemUgPiAwKQorICAgICAgb3V0LT5yZXNp
emUoaSArIHN0YXRpY19jYXN0PHNpemVfdD4oYnVmLnN0X3NpemUpKTsKKyAgfQorCisgIHNzaXpl
X3QgYnl0ZXNfcmVhZDsKKyAgZm9yICg7OykgeworICAgIGlmIChvdXQtPnNpemUoKSA8IGkgKyBr
QnVmU2l6ZSkKKyAgICAgIG91dC0+cmVzaXplKG91dC0+c2l6ZSgpICsga0J1ZlNpemUpOworCisg
ICAgYnl0ZXNfcmVhZCA9IFBFUkZFVFRPX0VJTlRSKHJlYWQoZmQsICYoKCpvdXQpW2ldKSwga0J1
ZlNpemUpKTsKKyAgICBpZiAoYnl0ZXNfcmVhZCA+IDApIHsKKyAgICAgIGkgKz0gc3RhdGljX2Nh
c3Q8c2l6ZV90PihieXRlc19yZWFkKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0LT5yZXNpemUo
aSk7CisgICAgICByZXR1cm4gYnl0ZXNfcmVhZCA9PSAwOworICAgIH0KKyAgfQorfQorCitib29s
IFJlYWRGaWxlU3RyZWFtKEZJTEUqIGYsIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgcmV0dXJuIFJl
YWRGaWxlRGVzY3JpcHRvcihmaWxlbm8oZiksIG91dCk7Cit9CisKK2Jvb2wgUmVhZEZpbGUoY29u
c3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgYmFzZTo6U2NvcGVk
RmlsZSBmZCA9IGJhc2U6Ok9wZW5GaWxlKHBhdGgsIE9fUkRPTkxZKTsKKyAgaWYgKCFmZCkKKyAg
ICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIFJlYWRGaWxlRGVzY3JpcHRvcigqZmQsIG91dCk7
Cit9CisKK3NzaXplX3QgV3JpdGVBbGwoaW50IGZkLCBjb25zdCB2b2lkKiBidWYsIHNpemVfdCBj
b3VudCkgeworICBzaXplX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgY291bnQp
IHsKKyAgICBzc2l6ZV90IHdyID0gUEVSRkVUVE9fRUlOVFIoCisgICAgICAgIHdyaXRlKGZkLCBz
dGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oYnVmKSArIHdyaXR0ZW4sIGNvdW50IC0gd3JpdHRlbikp
OworICAgIGlmICh3ciA9PSAwKQorICAgICAgYnJlYWs7CisgICAgaWYgKHdyIDwgMCkKKyAgICAg
IHJldHVybiB3cjsKKyAgICB3cml0dGVuICs9IHN0YXRpY19jYXN0PHNpemVfdD4od3IpOworICB9
CisgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90Pih3cml0dGVuKTsKK30KKworYm9vbCBGbHVz
aEZpbGUoaW50IGZkKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhmZCAhPSAwKTsKKyNpZiBQRVJGRVRU
T19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTElOVVgpIHx8IFwKKyAgICBQRVJGRVRUT19CVUlMREZM
QUcoUEVSRkVUVE9fT1NfQU5EUk9JRCkKKyAgcmV0dXJuICFQRVJGRVRUT19FSU5UUihmZGF0YXN5
bmMoZmQpKTsKKyNlbGlmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisgIHJl
dHVybiAhUEVSRkVUVE9fRUlOVFIoX2NvbW1pdChmZCkpOworI2Vsc2UKKyAgcmV0dXJuICFQRVJG
RVRUT19FSU5UUihmc3luYyhmZCkpOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNl
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IHNyYy9iYXNlL2xvZ2dpbmcuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6
IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS90aW1lLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgg
VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRo
ZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1h
eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl
LgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAg
ICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxl
c3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNv
ZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBv
biBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMg
T0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vu
c2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisg
KiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVf
UEVSRkVUVE9fQkFTRV9USU1FX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9USU1F
X0hfCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmln
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L2xvZ2dpbmcuaCIKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19NQUNPU1gp
CisjaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KKyNpbmNsdWRlIDxtYWNoL21hY2hfcG9ydC5o
PgorI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CisjaW5jbHVkZSA8bWFjaC90aHJlYWRfYWN0
Lmg+CisjZW5kaWYKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XQVNNKQor
I2luY2x1ZGUgPGVtc2NyaXB0ZW4vZW1zY3JpcHRlbi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKK3VzaW5nIFRpbWVTZWNvbmRzID0gc3RkOjpj
aHJvbm86OnNlY29uZHM7Cit1c2luZyBUaW1lTWlsbGlzID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vj
b25kczsKK3VzaW5nIFRpbWVOYW5vcyA9IHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kczsKKworaW5s
aW5lIFRpbWVOYW5vcyBGcm9tUG9zaXhUaW1lc3BlYyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHRz
KSB7CisgIHJldHVybiBUaW1lTmFub3ModHMudHZfc2VjICogMTAwMDAwMDAwMExMICsgdHMudHZf
bnNlYyk7Cit9CisKK3ZvaWQgU2xlZXBNaWNyb3NlY29uZHModW5zaWduZWQgaW50ZXJ2YWxfdXMp
OworCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikKKworVGltZU5hbm9z
IEdldFdhbGxUaW1lTnMoKTsKK1RpbWVOYW5vcyBHZXRUaHJlYWRDUFVUaW1lTnMoKTsKKworLy8g
VE9ETzogQ2xvY2sgdGhhdCBjb3VudHMgdGltZSBkdXJpbmcgc3VzcGVuZCBpcyBub3QgaW1wbGVt
ZW50ZWQgb24gV2luZG93cy4KK2lubGluZSBUaW1lTmFub3MgR2V0Qm9vdFRpbWVOcygpIHsKKyAg
cmV0dXJuIEdldFdhbGxUaW1lTnMoKTsKK30KKworI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBF
UkZFVFRPX09TX01BQ09TWCkKKworaW5saW5lIFRpbWVOYW5vcyBHZXRXYWxsVGltZU5zKCkgewor
ICBhdXRvIGluaXRfdGltZV9mYWN0b3IgPSBbXSgpIC0+IHVpbnQ2NF90IHsKKyAgICBtYWNoX3Rp
bWViYXNlX2luZm9fZGF0YV90IHRpbWViYXNlX2luZm87CisgICAgbWFjaF90aW1lYmFzZV9pbmZv
KCZ0aW1lYmFzZV9pbmZvKTsKKyAgICByZXR1cm4gdGltZWJhc2VfaW5mby5udW1lciAvIHRpbWVi
YXNlX2luZm8uZGVub207CisgIH07CisKKyAgc3RhdGljIHVpbnQ2NF90IG1vbm90b25pY190aW1l
YmFzZV9mYWN0b3IgPSBpbml0X3RpbWVfZmFjdG9yKCk7CisgIHJldHVybiBUaW1lTmFub3MobWFj
aF9hYnNvbHV0ZV90aW1lKCkgKiBtb25vdG9uaWNfdGltZWJhc2VfZmFjdG9yKTsKK30KKworLy8g
VE9ETzogQ2xvY2sgdGhhdCBjb3VudHMgdGltZSBkdXJpbmcgc3VzcGVuZCBpcyBub3QgaW1wbGVt
ZW50ZWQgb24gTWFjLgoraW5saW5lIFRpbWVOYW5vcyBHZXRCb290VGltZU5zKCkgeworICByZXR1
cm4gR2V0V2FsbFRpbWVOcygpOworfQorCitpbmxpbmUgVGltZU5hbm9zIEdldFRocmVhZENQVVRp
bWVOcygpIHsKKyAgbWFjaF9wb3J0X3QgdGhpc190aHJlYWQgPSBtYWNoX3RocmVhZF9zZWxmKCk7
CisgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgY291bnQgPSBUSFJFQURfQkFTSUNfSU5GT19DT1VO
VDsKKyAgdGhyZWFkX2Jhc2ljX2luZm9fZGF0YV90IGluZm97fTsKKyAga2Vybl9yZXR1cm5fdCBr
ciA9CisgICAgICB0aHJlYWRfaW5mbyh0aGlzX3RocmVhZCwgVEhSRUFEX0JBU0lDX0lORk8sCisg
ICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHRocmVhZF9pbmZvX3Q+KCZpbmZvKSwg
JmNvdW50KTsKKyAgbWFjaF9wb3J0X2RlYWxsb2NhdGUobWFjaF90YXNrX3NlbGYoKSwgdGhpc190
aHJlYWQpOworCisgIGlmIChrciAhPSBLRVJOX1NVQ0NFU1MpIHsKKyAgICBQRVJGRVRUT19ERkFU
QUwoIkZhaWxlZCB0byBnZXQgQ1BVIHRpbWUuIik7CisgICAgcmV0dXJuIFRpbWVOYW5vcygwKTsK
KyAgfQorICByZXR1cm4gVGltZU5hbm9zKGluZm8udXNlcl90aW1lLnNlY29uZHMgKiAxMDAwMDAw
MDAwTEwgKworICAgICAgICAgICAgICAgICAgIGluZm8udXNlcl90aW1lLm1pY3Jvc2Vjb25kcyAq
IDEwMDBMTCArCisgICAgICAgICAgICAgICAgICAgaW5mby5zeXN0ZW1fdGltZS5zZWNvbmRzICog
MTAwMDAwMDAwMExMICsKKyAgICAgICAgICAgICAgICAgICBpbmZvLnN5c3RlbV90aW1lLm1pY3Jv
c2Vjb25kcyAqIDEwMDBMTCk7Cit9CisKKyNlbGlmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRU
T19PU19XQVNNKQorCitpbmxpbmUgVGltZU5hbm9zIEdldFdhbGxUaW1lTnMoKSB7CisgIHJldHVy
biBUaW1lTmFub3Moc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGVtc2NyaXB0ZW5fZ2V0X25vdygpKSAq
IDEwMDAwMDApOworfQorCitpbmxpbmUgVGltZU5hbm9zIEdldFRocmVhZENQVVRpbWVOcygpIHsK
KyAgcmV0dXJuIFRpbWVOYW5vcygwKTsKK30KKworLy8gVE9ETzogQ2xvY2sgdGhhdCBjb3VudHMg
dGltZSBkdXJpbmcgc3VzcGVuZCBpcyBub3QgaW1wbGVtZW50ZWQgb24gV0FTTS4KK2lubGluZSBU
aW1lTmFub3MgR2V0Qm9vdFRpbWVOcygpIHsKKyAgcmV0dXJuIEdldFdhbGxUaW1lTnMoKTsKK30K
KworI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX05BQ0wpCisKKy8vIFRyYWNp
bmcgdGltZSBkb2Vzbid0IG5lZWQgdG8gd29yayBvbiBOYUNsIHNpbmNlIGl0cyBnb2luZyBhd2F5
IHNob3J0bHkuIFdlCisvLyBqdXN0IG5lZWQgdG8gY29tcGlsZSBvbiBpdC4gVGhlIG9ubHkgZnVu
Y3Rpb24gTmFDbCBjb3VsZCBzdXBwb3J0IGlzCisvLyBHZXRXYWxsVGltZU5zKCksIGJ1dCB0byBw
cmV2ZW50IGZhbHNlIGhvcGUgd2UgbGVhdmUgaXQgdW5pbXBsZW1lbnRlZC4KKworaW5saW5lIFRp
bWVOYW5vcyBHZXRXYWxsVGltZU5zKCkgeworICByZXR1cm4gVGltZU5hbm9zKDApOworfQorCitp
bmxpbmUgVGltZU5hbm9zIEdldFRocmVhZENQVVRpbWVOcygpIHsKKyAgcmV0dXJuIFRpbWVOYW5v
cygwKTsKK30KKworaW5saW5lIFRpbWVOYW5vcyBHZXRCb290VGltZU5zKCkgeworICByZXR1cm4g
VGltZU5hbm9zKDApOworfQorCisjZWxzZSAgLy8gcG9zaXgKKworY29uc3RleHByIGNsb2NraWRf
dCBrV2FsbFRpbWVDbG9ja1NvdXJjZSA9IENMT0NLX01PTk9UT05JQzsKKworaW5saW5lIFRpbWVO
YW5vcyBHZXRUaW1lSW50ZXJuYWxOcyhjbG9ja2lkX3QgY2xrX2lkKSB7CisgIHN0cnVjdCB0aW1l
c3BlYyB0cyA9IHt9OworICBQRVJGRVRUT19DSEVDSyhjbG9ja19nZXR0aW1lKGNsa19pZCwgJnRz
KSA9PSAwKTsKKyAgcmV0dXJuIEZyb21Qb3NpeFRpbWVzcGVjKHRzKTsKK30KKworLy8gUmV0dXJu
IG5zIGZyb20gYm9vdC4gQ29udmVyc2VseSB0byBHZXRXYWxsVGltZU5zLCB0aGlzIGNsb2NrIGNv
dW50cyBhbHNvIHRpbWUKKy8vIGR1cmluZyBzdXNwZW5kICh3aGVuIHN1cHBvcnRlZCkuCitpbmxp
bmUgVGltZU5hbm9zIEdldEJvb3RUaW1lTnMoKSB7CisgIC8vIERldGVybWluZSBpZiBDTE9DS19C
T09UVElNRSBpcyBhdmFpbGFibGUgb24gdGhlIGZpcnN0IGNhbGwuCisgIHN0YXRpYyBjb25zdCBj
bG9ja2lkX3Qga0Jvb3RUaW1lQ2xvY2tTb3VyY2UgPSBbXSB7CisgICAgc3RydWN0IHRpbWVzcGVj
IHRzID0ge307CisgICAgaW50IHJlcyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfQk9PVFRJTUUsICZ0
cyk7CisgICAgcmV0dXJuIHJlcyA9PSAwID8gQ0xPQ0tfQk9PVFRJTUUgOiBrV2FsbFRpbWVDbG9j
a1NvdXJjZTsKKyAgfSgpOworICByZXR1cm4gR2V0VGltZUludGVybmFsTnMoa0Jvb3RUaW1lQ2xv
Y2tTb3VyY2UpOworfQorCitpbmxpbmUgVGltZU5hbm9zIEdldFdhbGxUaW1lTnMoKSB7CisgIHJl
dHVybiBHZXRUaW1lSW50ZXJuYWxOcyhrV2FsbFRpbWVDbG9ja1NvdXJjZSk7Cit9CisKK2lubGlu
ZSBUaW1lTmFub3MgR2V0VGhyZWFkQ1BVVGltZU5zKCkgeworICByZXR1cm4gR2V0VGltZUludGVy
bmFsTnMoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpOworfQorI2VuZGlmCisKK2lubGluZSBUaW1l
U2Vjb25kcyBHZXRCb290VGltZVMoKSB7CisgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25f
Y2FzdDxUaW1lU2Vjb25kcz4oR2V0Qm9vdFRpbWVOcygpKTsKK30KKworaW5saW5lIFRpbWVNaWxs
aXMgR2V0V2FsbFRpbWVNcygpIHsKKyAgcmV0dXJuIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0
PFRpbWVNaWxsaXM+KEdldFdhbGxUaW1lTnMoKSk7Cit9CisKK2lubGluZSBUaW1lU2Vjb25kcyBH
ZXRXYWxsVGltZVMoKSB7CisgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxUaW1l
U2Vjb25kcz4oR2V0V2FsbFRpbWVOcygpKTsKK30KKworaW5saW5lIHN0cnVjdCB0aW1lc3BlYyBU
b1Bvc2l4VGltZXNwZWMoVGltZU1pbGxpcyB0aW1lKSB7CisgIHN0cnVjdCB0aW1lc3BlYyB0cyB7
fTsKKyAgY29uc3QgbG9uZyB0aW1lX3MgPSBzdGF0aWNfY2FzdDxsb25nPih0aW1lLmNvdW50KCkg
LyAxMDAwKTsKKyAgdHMudHZfc2VjID0gdGltZV9zOworICB0cy50dl9uc2VjID0gKHN0YXRpY19j
YXN0PGxvbmc+KHRpbWUuY291bnQoKSkgLSB0aW1lX3MgKiAxMDAwTCkgKiAxMDAwMDAwTDsKKyAg
cmV0dXJuIHRzOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19CQVNFX1RJTUVfSF8KKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElD
RU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdy
ZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj
ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJS
QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp
ZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p
bmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAq
LworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisK
KyNpZiAhUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikKKyNpbmNsdWRlIDx1bmlz
dGQuaD4gIC8vIEZvciBpc2F0dHkoKQorI2VuZGlmCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvdGltZS5o
IgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2Ug
eworY29uc3QgY2hhciBrUmVzZXRbXSA9ICJceDFiWzBtIjsKK2NvbnN0IGNoYXIga0RlZmF1bHRb
XSA9ICJceDFiWzM5bSI7Citjb25zdCBjaGFyIGtEaW1bXSA9ICJceDFiWzJtIjsKK2NvbnN0IGNo
YXIga1JlZFtdID0gIlx4MWJbMzFtIjsKK2NvbnN0IGNoYXIga0JvbGRHcmVlbltdID0gIlx4MWJb
MW1ceDFiWzMybSI7Citjb25zdCBjaGFyIGtMaWdodEdyYXlbXSA9ICJceDFiWzkwbSI7CisKK30g
IC8vIG5hbWVzcGFjZQorCit2b2lkIExvZ01lc3NhZ2UoTG9nTGV2IGxldmVsLAorICAgICAgICAg
ICAgICAgIGNvbnN0IGNoYXIqIGZuYW1lLAorICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAg
ICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAgICAgICAgICAgICAuLi4pIHsKKyAg
Y2hhciBzdGFja19idWZbNTEyXTsKKyAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gbGFyZ2VfYnVm
OworICBjaGFyKiBsb2dfbXNnID0gJnN0YWNrX2J1ZlswXTsKKworICAvLyBCeSBkZWZhdWx0IHVz
ZSBhIHN0YWNrIGFsbG9jYXRlZCBidWZmZXIgYmVjYXVzZSBtb3N0IGxvZyBtZXNzYWdlcyBhcmUg
cXVpdGUKKyAgLy8gc2hvcnQuIEluIHJhcmUgY2FzZXMgdGhleSBjYW4gYmUgbGFyZ2VyIChlLmcu
IC0taGVscCkuIEluIHRob3NlIGNhc2VzIHdlCisgIC8vIHBheSB0aGUgY29zdCBvZiBhbGxvY2F0
aW5nIHRoZSBidWZmZXIgb24gdGhlIGhlYXAuCisgIGZvciAoc2l6ZV90IG1heF9sZW4gPSBzaXpl
b2Yoc3RhY2tfYnVmKTs7KSB7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3Ms
IGZtdCk7CisgICAgaW50IHJlcyA9IHZzbnByaW50Zihsb2dfbXNnLCBtYXhfbGVuLCBmbXQsIGFy
Z3MpOworICAgIHZhX2VuZChhcmdzKTsKKworICAgIC8vIElmIGZvciBhbnkgcmVhc29uIHRoZSBw
cmludCBmYWlscywgb3ZlcndyaXRlIHRoZSBtZXNzYWdlIGJ1dCBzdGlsbCBwcmludAorICAgIC8v
IGl0LiBUaGUgY29kZSBiZWxvdyB3aWxsIGF0dGFjaCB0aGUgZmlsZW5hbWUgYW5kIGxpbmUsIHdo
aWNoIGlzIHN0aWxsCisgICAgLy8gdXNlZnVsLgorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICBz
dHJuY3B5KGxvZ19tc2csICJbcHJpbnRmIGZvcm1hdCBlcnJvcl0iLCBtYXhfbGVuKTsKKyAgICAg
IGJyZWFrOworICAgIH0KKworICAgIC8vIGlmIHJlcyA9PSBtYXhfbGVuLCB2c25wcmludGYgc2F0
dXJhdGVkIHRoZSBpbnB1dCBidWZmZXIuIFJldHJ5IHdpdGggYQorICAgIC8vIGxhcmdlciBidWZm
ZXIgaW4gdGhhdCBjYXNlICh3aXRoaW4gcmVhc29uYWJsZSBsaW1pdHMpLgorICAgIGlmIChyZXMg
PCBzdGF0aWNfY2FzdDxpbnQ+KG1heF9sZW4pIHx8IG1heF9sZW4gPj0gMTI4ICogMTAyNCkKKyAg
ICAgIGJyZWFrOworICAgIG1heF9sZW4gKj0gNDsKKyAgICBsYXJnZV9idWYucmVzZXQobmV3IGNo
YXJbbWF4X2xlbl0pOworICAgIGxvZ19tc2cgPSAmbGFyZ2VfYnVmWzBdOworICB9CisKKyAgY29u
c3QgY2hhciogY29sb3IgPSBrRGVmYXVsdDsKKyAgc3dpdGNoIChsZXZlbCkgeworICAgIGNhc2Ug
a0xvZ0RlYnVnOgorICAgICAgY29sb3IgPSBrRGltOworICAgICAgYnJlYWs7CisgICAgY2FzZSBr
TG9nSW5mbzoKKyAgICAgIGNvbG9yID0ga0RlZmF1bHQ7CisgICAgICBicmVhazsKKyAgICBjYXNl
IGtMb2dJbXBvcnRhbnQ6CisgICAgICBjb2xvciA9IGtCb2xkR3JlZW47CisgICAgICBicmVhazsK
KyAgICBjYXNlIGtMb2dFcnJvcjoKKyAgICAgIGNvbG9yID0ga1JlZDsKKyAgICAgIGJyZWFrOwor
ICB9CisKKyNpZiAhUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikgJiYgXAorICAg
ICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0FTTSkKKyAgc3RhdGljIGNvbnN0IGJv
b2wgdXNlX2NvbG9ycyA9IGlzYXR0eShTVERFUlJfRklMRU5PKTsKKyNlbHNlCisgIHN0YXRpYyBj
b25zdCBib29sIHVzZV9jb2xvcnMgPSBmYWxzZTsKKyNlbmRpZgorCisgIC8vIEZvcm1hdHMgZmls
ZS5jYzpsaW5lIGFzIGEgc3BhY2UtcGFkZGVkIGZpeGVkIHdpZHRoIHN0cmluZy4gSWYgdGhlIGZp
bGUgbmFtZQorICAvLyB8Zm5hbWV8IGlzIHRvbyBsb25nLCB0cnVuY2F0ZSBpdCBvbiB0aGUgbGVm
dC1oYW5kIHNpZGUuCisgIGNoYXIgbGluZV9zdHJbMTBdOworICBzaXplX3QgbGluZV9sZW4gPQor
ICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihzbnByaW50ZihsaW5lX3N0ciwgc2l6ZW9mKGxpbmVf
c3RyKSwgIiVkIiwgbGluZSkpOworCisgIC8vIDI0IHdpbGwgYmUgdGhlIHdpZHRoIG9mIHRoZSBm
aWxlLmNjOmxpbmUgY29sdW1uIGluIHRoZSBsb2cgZXZlbnQuCisgIGNoYXIgZmlsZV9hbmRfbGlu
ZVsyNF07CisgIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4oZm5hbWUpOworICBzaXplX3QgZm5h
bWVfbWF4ID0gc2l6ZW9mKGZpbGVfYW5kX2xpbmUpIC0gbGluZV9sZW4gLSAyOyAgLy8gMiA9ICc6
JyArICdcMCcuCisgIHNpemVfdCBmbmFtZV9vZmZzZXQgPSBmbmFtZV9sZW4gPD0gZm5hbWVfbWF4
ID8gMCA6IGZuYW1lX2xlbiAtIGZuYW1lX21heDsKKyAgaW50IGxlbiA9IHNucHJpbnRmKGZpbGVf
YW5kX2xpbmUsIHNpemVvZihmaWxlX2FuZF9saW5lKSwgIiVzOiVzIiwKKyAgICAgICAgICAgICAg
ICAgICAgIGZuYW1lICsgZm5hbWVfb2Zmc2V0LCBsaW5lX3N0cik7CisgIG1lbXNldCgmZmlsZV9h
bmRfbGluZVtsZW5dLCAnICcsIHNpemVvZihmaWxlX2FuZF9saW5lKSAtIHNpemVfdChsZW4pKTsK
KyAgZmlsZV9hbmRfbGluZVtzaXplb2YoZmlsZV9hbmRfbGluZSkgLSAxXSA9ICdcMCc7CisKKyNp
ZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfQU5EUk9JRCkKKyAgLy8gTG9nY2F0IGhh
cyBhbHJlYWR5IHRpbWVzdGFtcGluZywgZG9uJ3QgcmUtZW1pdCBpdC4KKyAgX19hbmRyb2lkX2xv
Z19wcmludChBTkRST0lEX0xPR19ERUJVRyArIGxldmVsLCAicGVyZmV0dG8iLCAiJXMgJXMiLAor
ICAgICAgICAgICAgICAgICAgICAgIGZpbGVfYW5kX2xpbmUsIGxvZ19tc2cpOworI2VuZGlmCisK
KyAgLy8gV2hlbiBwcmludGluZyBvbiBzdGRlcnIsIHByaW50IGFsc28gdGhlIHRpbWVzdGFtcC4g
V2UgZG9uJ3QgcmVhbGx5IGNhcmUKKyAgLy8gYWJvdXQgdGhlIGFjdHVhbCB0aW1lLiBXZSBqdXN0
IG5lZWQgc29tZSByZWZlcmVuY2UgY2xvY2sgdGhhdCBjYW4gYmUgdXNlZAorICAvLyB0byBjb3Jy
ZWxhdGVkIGV2ZW50cyBhY3Jvc3MgZGlmZmVycmVudCBwcm9jZXNzc2VzIChlLmcuIHRyYWNlZCBh
bmQKKyAgLy8gdHJhY2VkX3Byb2JlcykuIFRoZSB3YWxsIHRpbWUgJSAxMDAwIGlzIGdvb2QgZW5v
dWdoLgorICBjaGFyIHRpbWVzdGFtcFszMl07CisgIHVpbnQzMl90IHRfbXMgPSBzdGF0aWNfY2Fz
dDx1aW50MzJfdD4oR2V0V2FsbFRpbWVNcygpLmNvdW50KCkpOworICB1aW50MzJfdCB0X3NlYyA9
IHRfbXMgLyAxMDAwOworICB0X21zIC09IHRfc2VjICogMTAwMDsKKyAgdF9zZWMgPSB0X3NlYyAl
IDEwMDA7CisgIHNucHJpbnRmKHRpbWVzdGFtcCwgc2l6ZW9mKHRpbWVzdGFtcCksICJbJTAzdS4l
MDN1XSAiLCB0X3NlYywgdF9tcyk7CisKKyAgaWYgKHVzZV9jb2xvcnMpIHsKKyAgICBmcHJpbnRm
KHN0ZGVyciwgIiVzJXMlcyVzICVzJXMlc1xuIiwga0xpZ2h0R3JheSwgdGltZXN0YW1wLCBmaWxl
X2FuZF9saW5lLAorICAgICAgICAgICAga1Jlc2V0LCBjb2xvciwgbG9nX21zZywga1Jlc2V0KTsK
KyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzJXMgJXNcbiIsIHRpbWVzdGFtcCwg
ZmlsZV9hbmRfbGluZSwgbG9nX21zZyk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UK
K30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJj
ZTogc3JjL2Jhc2UvbWV0YXRyYWNlLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL21ldGF0cmFjZS5oCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2Jhc2UvdGhyZWFkX3V0aWxzLmgKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAor
ICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo
ZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29t
cGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRo
ZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMv
TElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3Ig
YWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUg
TGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBX
QVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGlt
cGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zl
cm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K
KyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9USFJFQURfVVRJTFNfSF8KKyNk
ZWZpbmUgSU5DTFVERV9QRVJGRVRUT19CQVNFX1RIUkVBRF9VVElMU19IXworCisjaW5jbHVkZSA8
c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisKKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVU
VE9fT1NfV0lOKQorI2luY2x1ZGUgPFdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzdGhyZWFk
c2FwaS5oPgorI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0ZVQ0hTSUEpCisj
aW5jbHVkZSA8emlyY29uL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDx6aXJjb24vdHlwZXMuaD4KKyNl
bGlmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19MSU5VWCkgfHwgXAorICAgIFBFUkZF
VFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorI2luY2x1ZGUgPHN5cy9zeXNjYWxs
Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZWxzZQor
I2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIGJhc2UgeworCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0FORFJP
SUQpCit1c2luZyBQbGF0Zm9ybVRocmVhZElkID0gcGlkX3Q7CitpbmxpbmUgUGxhdGZvcm1UaHJl
YWRJZCBHZXRUaHJlYWRJZCgpIHsKKyAgcmV0dXJuIGdldHRpZCgpOworfQorI2VsaWYgUEVSRkVU
VE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0xJTlVYKQordXNpbmcgUGxhdGZvcm1UaHJlYWRJZCA9
IHBpZF90OworaW5saW5lIFBsYXRmb3JtVGhyZWFkSWQgR2V0VGhyZWFkSWQoKSB7CisgIHJldHVy
biBzdGF0aWNfY2FzdDxwaWRfdD4oc3lzY2FsbChfX05SX2dldHRpZCkpOworfQorI2VsaWYgUEVS
RkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0ZVQ0hTSUEpCit1c2luZyBQbGF0Zm9ybVRocmVh
ZElkID0genhfaGFuZGxlX3Q7CitpbmxpbmUgUGxhdGZvcm1UaHJlYWRJZCBHZXRUaHJlYWRJZCgp
IHsKKyAgcmV0dXJuIHp4X3RocmVhZF9zZWxmKCk7Cit9CisjZWxpZiBQRVJGRVRUT19CVUlMREZM
QUcoUEVSRkVUVE9fT1NfTUFDT1NYKQordXNpbmcgUGxhdGZvcm1UaHJlYWRJZCA9IHVpbnQ2NF90
OworaW5saW5lIFBsYXRmb3JtVGhyZWFkSWQgR2V0VGhyZWFkSWQoKSB7CisgIHVpbnQ2NF90IHRp
ZDsKKyAgcHRocmVhZF90aHJlYWRpZF9ucChudWxscHRyLCAmdGlkKTsKKyAgcmV0dXJuIHRpZDsK
K30KKyNlbGlmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCit1c2luZyBQbGF0
Zm9ybVRocmVhZElkID0gdWludDY0X3Q7CitpbmxpbmUgUGxhdGZvcm1UaHJlYWRJZCBHZXRUaHJl
YWRJZCgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihHZXRDdXJyZW50VGhyZWFk
SWQoKSk7Cit9CisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTkFDTCkKK3Vz
aW5nIFBsYXRmb3JtVGhyZWFkSWQgPSBwaWRfdDsKK2lubGluZSBQbGF0Zm9ybVRocmVhZElkIEdl
dFRocmVhZElkKCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90PihwdGhyZWFk
X3NlbGYoKSk7Cit9CisjZWxzZSAgLy8gRGVmYXVsdCB0byBwdGhyZWFkcyBpbiBjYXNlIG5vIE9T
IGlzIHNldC4KK3VzaW5nIFBsYXRmb3JtVGhyZWFkSWQgPSBwdGhyZWFkX3Q7CitpbmxpbmUgUGxh
dGZvcm1UaHJlYWRJZCBHZXRUaHJlYWRJZCgpIHsKKyAgcmV0dXJuIHB0aHJlYWRfc2VsZigpOwor
fQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0JBU0VfVEhSRUFEX1VUSUxTX0hfCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNl
L21ldGF0cmFjZV9ldmVudHMuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19F
WFRfQkFTRV9NRVRBVFJBQ0VfRVZFTlRTX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhU
X0JBU0VfTUVUQVRSQUNFX0VWRU5UU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgbWV0YXRyYWNlIHsKKworZW51bSBUYWdzIDogdWlu
dDMyX3QgeworICBUQUdfTk9ORSA9IDAsCisgIFRBR19BTlkgPSB1aW50MzJfdCgtMSksCisgIFRB
R19GVFJBQ0UgPSAxIDw8IDAsCisgIFRBR19QUk9DX1BPTExFUlMgPSAxIDw8IDEsCisgIFRBR19U
UkFDRV9XUklURVIgPSAxIDw8IDIsCisgIFRBR19UUkFDRV9TRVJWSUNFID0gMSA8PCAzLAorICBU
QUdfUFJPRFVDRVIgPSAxIDw8IDQsCit9OworCisvLyBUaGUgbWFjcm9zIGJlbG93IGdlbmVyYXRl
IG1hdGNoaW5nIGVudW1zIGFuZCBhcnJheXMgb2Ygc3RyaW5nIGxpdGVyYWxzLgorLy8gVGhpcyBp
cyB0byBhdm9pZCBtYWludGFpbmluZyBzdHJpbmcgbWFwcyBtYW51YWxseS4KKworLy8gY2xhbmct
Zm9ybWF0IG9mZgorCisvLyBETyBOT1QgcmVtb3ZlIG9yIHJlc2h1ZmZsZSBpdGVtcyBpbiB0aGlz
IGxpc3QsIG9ubHkgYXBwZW5kLiBUaGUgSUQgb2YgdGhlc2UKKy8vIGV2ZW50cyBhcmUgYW4gQUJJ
LCB0aGUgdHJhY2UgcHJvY2Vzc29yIHJlbGllcyBvbiB0aGVzZSB0byBvcGVuIG9sZCB0cmFjZXMu
CisjZGVmaW5lIFBFUkZFVFRPX01FVEFUUkFDRV9FVkVOVFMoRikgXAorICBGKEVWRU5UX1pFUk9f
VU5VU0VEKSwgXAorICBGKEZUUkFDRV9DUFVfUkVBREVSX1JFQUQpLCAvKnVudXNlZCovIFwKKyAg
RihGVFJBQ0VfRFJBSU5fQ1BVUyksIC8qdW51c2VkKi8gXAorICBGKEZUUkFDRV9VTkJMT0NLX1JF
QURFUlMpLCAvKnVudXNlZCovIFwKKyAgRihGVFJBQ0VfQ1BVX1JFQURfTk9OQkxPQ0spLCAvKnVu
dXNlZCovIFwKKyAgRihGVFJBQ0VfQ1BVX1JFQURfQkxPQ0spLCAvKnVudXNlZCovIFwKKyAgRihG
VFJBQ0VfQ1BVX1NQTElDRV9OT05CTE9DSyksIC8qdW51c2VkKi8gXAorICBGKEZUUkFDRV9DUFVf
U1BMSUNFX0JMT0NLKSwgLyp1bnVzZWQqLyBcCisgIEYoRlRSQUNFX0NQVV9XQUlUX0NNRCksIC8q
dW51c2VkKi8gXAorICBGKEZUUkFDRV9DUFVfUlVOX0NZQ0xFKSwgLyp1bnVzZWQqLyBcCisgIEYo
RlRSQUNFX0NQVV9GTFVTSCksIFwKKyAgRihGVFJBQ0VfQ1BVX0RSQUlOKSwgLyp1bnVzZWQqLyBc
CisgIEYoUkVBRF9TWVNfU1RBVFMpLCBcCisgIEYoUFNfV1JJVEVfQUxMX1BST0NFU1NFUyksIFwK
KyAgRihQU19PTl9QSURTKSwgXAorICBGKFBTX09OX1JFTkFNRV9QSURTKSwgXAorICBGKFBTX1dS
SVRFX0FMTF9QUk9DRVNTX1NUQVRTKSwgXAorICBGKFRSQUNFX1dSSVRFUl9DT01NSVRfU1RBUlRV
UF9XUklURVJfQkFUQ0gpLCBcCisgIEYoRlRSQUNFX1JFQURfVElDSyksIFwKKyAgRihGVFJBQ0Vf
Q1BVX1JFQURfQ1lDTEUpLCBcCisgIEYoRlRSQUNFX0NQVV9SRUFEX0JBVENIKSwgXAorICBGKEtB
TExTWU1TX1BBUlNFKSwgXAorICBGKFBST0ZJTEVSX1JFQURfVElDSyksIFwKKyAgRihQUk9GSUxF
Ul9SRUFEX0NQVSksIFwKKyAgRihQUk9GSUxFUl9VTldJTkRfVElDSyksIFwKKyAgRihQUk9GSUxF
Ul9VTldJTkRfU0FNUExFKSwgXAorICBGKFBST0ZJTEVSX1VOV0lORF9JTklUSUFMX0FUVEVNUFQp
LCBcCisgIEYoUFJPRklMRVJfVU5XSU5EX0FUVEVNUFQpLCBcCisgIEYoUFJPRklMRVJfTUFQU19Q
QVJTRSksIFwKKyAgRihQUk9GSUxFUl9NQVBTX1JFUEFSU0UpLCBcCisgIEYoUFJPRklMRVJfVU5X
SU5EX0NBQ0hFX0NMRUFSKQorCisvLyBBcHBlbmQgb25seSwgc2VlIGFib3ZlLgorLy8KKy8vIFZh
bHVlcyB0aGF0IGFyZW4ndCB1c2VkIGFzIGNvdW50ZXJzOgorLy8gKiBGVFJBQ0VfU0VSVklDRV9D
T01NSVRfREFUQSBpcyBhIGJpdC1wYWNrZWQgcmVwcmVzZW50YXRpb24gb2YgYW4gZXZlbnQsIHNl
ZQorLy8gICB0cmFjaW5nX3NlcnZpY2VfaW1wbC5jYyBmb3IgdGhlIGZvcm1hdC4KKy8vICogUFJP
RklMRVJfVU5XSU5EX0NVUlJFTlRfUElEIHJlcHJlc2VudHMgdGhlIFBJRCB0aGF0IGlzIGJlaW5n
IHVud291bmQuCisvLworI2RlZmluZSBQRVJGRVRUT19NRVRBVFJBQ0VfQ09VTlRFUlMoRikgXAor
ICBGKENPVU5URVJfWkVST19VTlVTRUQpLFwKKyAgRihGVFJBQ0VfUEFHRVNfRFJBSU5FRCksIFwK
KyAgRihQU19QSURTX1NDQU5ORUQpLCBcCisgIEYoVFJBQ0VfU0VSVklDRV9DT01NSVRfREFUQSks
IFwKKyAgRihQUk9GSUxFUl9VTldJTkRfUVVFVUVfU1opLCBcCisgIEYoUFJPRklMRVJfVU5XSU5E
X0NVUlJFTlRfUElEKQorCisvLyBjbGFuZy1mb3JtYXQgb24KKworI2RlZmluZSBQRVJGRVRUT19N
RVRBVFJBQ0VfSURFTlRJVFkobmFtZSkgbmFtZQorI2RlZmluZSBQRVJGRVRUT19NRVRBVFJBQ0Vf
VE9TVFJJTkcobmFtZSkgI25hbWUKKworZW51bSBFdmVudHMgOiB1aW50MTZfdCB7CisgIFBFUkZF
VFRPX01FVEFUUkFDRV9FVkVOVFMoUEVSRkVUVE9fTUVUQVRSQUNFX0lERU5USVRZKSwKKyAgRVZF
TlRTX01BWAorfTsKK2NvbnN0ZXhwciBjaGFyIGNvbnN0KiBrRXZlbnROYW1lc1tdID0geworICAg
IFBFUkZFVFRPX01FVEFUUkFDRV9FVkVOVFMoUEVSRkVUVE9fTUVUQVRSQUNFX1RPU1RSSU5HKX07
CisKK2VudW0gQ291bnRlcnMgOiB1aW50MTZfdCB7CisgIFBFUkZFVFRPX01FVEFUUkFDRV9DT1VO
VEVSUyhQRVJGRVRUT19NRVRBVFJBQ0VfSURFTlRJVFkpLAorICBDT1VOVEVSU19NQVgKK307Citj
b25zdGV4cHIgY2hhciBjb25zdCoga0NvdW50ZXJOYW1lc1tdID0geworICAgIFBFUkZFVFRPX01F
VEFUUkFDRV9DT1VOVEVSUyhQRVJGRVRUT19NRVRBVFJBQ0VfVE9TVFJJTkcpfTsKKworaW5saW5l
IHZvaWQgU3VwcHJlc3NVbnVzZWRWYXJzSW5BbWFsZ2FtYXRlZEJ1aWxkKCkgeworICAodm9pZClr
Q291bnRlck5hbWVzOworICAodm9pZClrRXZlbnROYW1lczsKK30KKworfSAgLy8gbmFtZXNwYWNl
IG1ldGF0cmFjZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVE
RV9QRVJGRVRUT19FWFRfQkFTRV9NRVRBVFJBQ0VfRVZFTlRTX0hfCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL3RocmVhZF9hbm5vdGF0
aW9ucy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNl
IFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn
L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi
bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAq
IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhl
IExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1RIUkVB
RF9BTk5PVEFUSU9OU19IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1RIUkVB
RF9BTk5PVEFUSU9OU19IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorCisvLyBXaW5kb3dzIFRTQU4gZG9lc24n
dCBjdXJyZW50bHkgc3VwcG9ydCB0aGVzZSBhbm5vdGF0aW9ucy4KKyNpZiBkZWZpbmVkKFRIUkVB
RF9TQU5JVElaRVIpICYmICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorZXh0
ZXJuICJDIiB7Cit2b2lkIEFubm90YXRlQmVuaWduUmFjZVNpemVkKGNvbnN0IGNoYXIqIGZpbGUs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworfQorCisjZGVmaW5lIFBFUkZFVFRPX0FOTk9U
QVRFX0JFTklHTl9SQUNFX1NJWkVEKHBvaW50ZXIsIHNpemUsIGRlc2NyaXB0aW9uKSAgIFwKKyAg
QW5ub3RhdGVCZW5pZ25SYWNlU2l6ZWQoX19GSUxFX18sIF9fTElORV9fLCAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9j
YXN0PHVuc2lnbmVkIGxvbmc+KHBvaW50ZXIpLCBzaXplLCBcCisgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRlc2NyaXB0aW9uKTsKKyNlbHNlICAvLyBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVS
KQorI2RlZmluZSBQRVJGRVRUT19BTk5PVEFURV9CRU5JR05fUkFDRV9TSVpFRChwb2ludGVyLCBz
aXplLCBkZXNjcmlwdGlvbikKKyNlbmRpZiAgLy8gZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikK
KworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1RIUkVBRF9BTk5PVEFUSU9O
U19IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQ
cm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9u
IDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2Vw
dCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNv
cHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9s
aWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxl
IGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBX
SVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJl
c3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1
YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBM
aWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9NRVRBVFJB
Q0VfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9NRVRBVFJBQ0VfSF8KKwor
I2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFs
PgorI2luY2x1ZGUgPHN0cmluZz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3RocmVhZF91dGlscy5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS90aW1lLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9tZXRhdHJh
Y2VfZXZlbnRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9leHQvYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3V0aWxzLmgiCisKKy8vIEEgZmFj
aWxpdHkgdG8gdHJhY2UgZXhlY3V0aW9uIG9mIHRoZSBwZXJmZXR0byBjb2RlYmFzZSBpdHNlbGYu
CisvLyBUaGUgbWV0YS10cmFjaW5nIGZyYW1ld29yayBpcyBvcmdhbml6ZWQgaW50byB0aHJlZSBs
YXllcnM6CisvLworLy8gMS4gQSBzdGF0aWMgcmluZy1idWZmZXIgaW4gYmFzZS8gKHRoaXMgZmls
ZSkgdGhhdCBzdXBwb3J0cyBjb25jdXJyZW50IHdyaXRlcworLy8gICAgYW5kIGEgc2luZ2xlIHJl
YWRlci4KKy8vICAgIFRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGlzIGxheWVyIGlzIHRvIHN0b3Jl
IGV2ZW50cyBhbmQgY291bnRlcnMgYXMKKy8vICAgIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlIHdp
dGhvdXQgcmUtZW50ZXJpbmcgYW55IHRyYWNpbmcgY29kZS4KKy8vICAgIFRoaXMgaXMgcmVhbGx5
IGEgc3RhdGljLXN0b3JhZ2UtYmFzZWQgcmluZy1idWZmZXIgYmFzZWQgb24gYSBQT0QgYXJyYXku
CisvLyAgICBUaGlzIGxheWVyIGRvZXMgTk9UIGRlYWwgd2l0aCBzZXJpYWxpemluZyB0aGUgbWV0
YS10cmFjZSBidWZmZXIuCisvLyAgICBJdCBwb3N0cyBhIHRhc2sgd2hlbiBpdCdzIGhhbGYgZnVs
bCBhbmQgZXhwZWN0cyBzb21ldGhpbmcgb3V0c2lkZSBvZgorLy8gICAgYmFzZS8gdG8gZHJhaW4g
dGhlIHJpbmctYnVmZmVyIGFuZCBzZXJpYWxpemUgaXQsIGV2ZW50dWFsbHkgd3JpdGluZyBpdAor
Ly8gICAgaW50byB0aGUgdHJhY2UgaXRzZWxmLCBiZWZvcmUgaXQgZ2V0cyAxMDAlIGZ1bGwuCisv
LworLy8gMi4gQSBjbGFzcyBpbiB0cmFjaW5nL2NvcmUgd2hpY2ggdGFrZXMgY2FyZSBvZiBzZXJp
YWxpemluZyB0aGUgbWV0YS10cmFjZQorLy8gICAgYnVmZmVyIGludG8gdGhlIHRyYWNlIHVzaW5n
IGEgVHJhY2VXcml0ZXIuIFNlZSBtZXRhdHJhY2Vfd3JpdGVyLmggLgorLy8KKy8vIDMuIEEgZGF0
YSBzb3VyY2UgaW4gdHJhY2VkX3Byb2JlcyB0aGF0LCB3aGVuIGJlIGVuYWJsZWQgdmlhIHRoZSB0
cmFjZSBjb25maWcsCisvLyAgICBpbmplY3RzIG1ldGF0cmFjZSBldmVudHMgaW50byB0aGUgdHJh
Y2UuIFNlZSBtZXRhdHJhY2VfZGF0YV9zb3VyY2UuaCAuCisvLworLy8gVGhlIGF2YWlsYWJsZSBl
dmVudHMgYW5kIHRhZ3MgYXJlIGRlZmluZWQgaW4gbWV0YXRyYWNlX2V2ZW50cy5oIC4KKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKKworbmFtZXNwYWNlIGJhc2UgeworY2xhc3MgVGFza1J1bm5lcjsK
K30gIC8vIG5hbWVzcGFjZSBiYXNlCisKK25hbWVzcGFjZSBtZXRhdHJhY2UgeworCisvLyBNZXRh
LXRyYWNpbmcgaXMgb3JnYW5pemVkIGluICJ0YWdzIiB0aGF0IGNhbiBiZSBzZWxlY3RpdmVseSBl
bmFibGVkLiBUaGlzIGlzCisvLyB0byBlbmFibGUgbWV0YS10cmFjaW5nIG9ubHkgb2Ygb25lIHN1
Yi1zeXN0ZW0uIFRoaXMgd29yZCBoYXMgb25lICJlbmFibGVkIgorLy8gYml0IGZvciBlYWNoIHRh
Zy4gMCAtPiBtZXRhLXRyYWNpbmcgb2ZmLgorZXh0ZXJuIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBn
X2VuYWJsZWRfdGFnczsKKworLy8gVGltZSBvZiB0aGUgRW5hYmxlKCkgY2FsbC4gVXNlZCBhcyBh
IHJlZmVyZW5jZSBmb3Iga2VlcGluZyBkZWx0YSB0aW1lc3RtYXBzCisvLyBpbiBSZWNvcmQuCitl
eHRlcm4gc3RkOjphdG9taWM8dWludDY0X3Q+IGdfZW5hYmxlZF90aW1lc3RhbXA7CisKKy8vIEVu
YWJsZXMgbWV0YS10cmFjaW5nIGZvciBvbmUgb3IgbW9yZSB0YWdzLiBPbmNlIGVuYWJsZWQgaXQg
d2lsbCBkaXNjYXJkIGFueQorLy8gZnVydGhlciBFbmFibGUoKSBjYWxscyBhbmQgcmV0dXJuIGZh
bHNlIHVudGlsIGRpc2FibGVkLAorLy8gfHJlYWRfdGFza3wgaXMgYSBjbG9zdXJlIHRoYXQgd2ls
bCBiZSBjYWxsZWQgZW5xdWV1ZWQgfHRhc2tfcnVubmVyfCB3aGVuIHRoZQorLy8gbWV0YS10cmFj
aW5nIHJpbmcgYnVmZmVyIGlzIGhhbGYgZnVsbC4gVGhlIHRhc2sgaXMgZXhwZWN0ZWQgdG8gcmVh
ZCB0aGUgcmluZworLy8gYnVmZmVyIHVzaW5nIFJpbmdCdWZmZXI6OkdldFJlYWRJdGVyYXRvcigp
IGFuZCBzZXJpYWxpemUgdGhlIGNvbnRlbnRzIG9udG8gYQorLy8gZmlsZSBvciBpbnRvIHRoZSB0
cmFjZSBpdHNlbGYuCisvLyBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgfHRhc2tfcnVubmVyfCBwYXNz
ZWQuCisvLyB8dGFza19ydW5uZXJ8IG11c3QgaGF2ZSBzdGF0aWMgbGlmZXRpbWUuCitib29sIEVu
YWJsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcmVhZF90YXNrLCBiYXNlOjpUYXNrUnVubmVyKiwg
dWludDMyX3QgdGFncyk7CisKKy8vIERpc2FibGVzIG1ldGEtdHJhY2luZy4KKy8vIE11c3QgYmUg
Y2FsbGVkIG9uIHRoZSBzYW1lIHx0YXNrX3J1bm5lcnwgYXMgRW5hYmxlKCkuCit2b2lkIERpc2Fi
bGUoKTsKKworaW5saW5lIHVpbnQ2NF90IFRyYWNlVGltZU5vd05zKCkgeworICByZXR1cm4gc3Rh
dGljX2Nhc3Q8dWludDY0X3Q+KGJhc2U6OkdldEJvb3RUaW1lTnMoKS5jb3VudCgpKTsKK30KKwor
Ly8gUmV0dXJucyBhIHJlbGF4ZWQgdmlldyBvZiB3aGV0aGVyIG1ldGF0cmFjaW5nIGlzIGVuYWJs
ZWQgZm9yIHRoZSBnaXZlbiB0YWcuCisvLyBVc2VmdWwgZm9yIHNraXBwaW5nIHVubmVjZXNzYXJ5
IGFyZ3VtZW50IGNvbXB1dGF0aW9uIGlmIG1ldGF0cmFjaW5nIGlzIG9mZi4KK2lubGluZSBib29s
IElzRW5hYmxlZCh1aW50MzJfdCB0YWcpIHsKKyAgYXV0byBlbmFibGVkX3RhZ3MgPSBnX2VuYWJs
ZWRfdGFncy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBpZiAoUEVSRkVUVE9f
TElLRUxZKChlbmFibGVkX3RhZ3MgJiB0YWcpID09IDApKQorICAgIHJldHVybiBmYWxzZTsKKyAg
ZWxzZQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBIb2xkcyB0aGUgZGF0YSBmb3IgYSBtZXRh
dHJhY2UgZXZlbnQgb3IgY291bnRlci4KK3N0cnVjdCBSZWNvcmQgeworICBzdGF0aWMgY29uc3Rl
eHByIHVpbnQxNl90IGtUeXBlTWFzayA9IDB4ODAwMDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50
MTZfdCBrVHlwZUNvdW50ZXIgPSAweDgwMDA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qg
a1R5cGVFdmVudCA9IDA7CisKKyAgdWludDY0X3QgdGltZXN0YW1wX25zKCkgY29uc3QgeworICAg
IGF1dG8gYmFzZV9ucyA9IGdfZW5hYmxlZF90aW1lc3RhbXAubG9hZChzdGQ6Om1lbW9yeV9vcmRl
cl9yZWxheGVkKTsKKyAgICBQRVJGRVRUT19EQ0hFQ0soYmFzZV9ucyk7CisgICAgcmV0dXJuIGJh
c2VfbnMgKyAoKHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0aW1lc3RhbXBfbnNfaGlnaCkgPDwgMzIp
IHwKKyAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbnNfbG93KTsKKyAgfQorCisgIHZv
aWQgc2V0X3RpbWVzdGFtcCh1aW50NjRfdCB0cykgeworICAgIGF1dG8gdF9zdGFydCA9IGdfZW5h
YmxlZF90aW1lc3RhbXAubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICB1aW50
NjRfdCBkaWZmID0gdHMgLSB0X3N0YXJ0OworICAgIFBFUkZFVFRPX0RDSEVDSyhkaWZmIDwgKDF1
bGwgPDwgNDgpKTsKKyAgICB0aW1lc3RhbXBfbnNfbG93ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+
KGRpZmYpOworICAgIHRpbWVzdGFtcF9uc19oaWdoID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGRp
ZmYgPj4gMzIpOworICB9CisKKyAgLy8gV2UgY2FuJ3QganVzdCBtZW1zZXQoKSB0aGlzIGNsYXNz
IGJlY2F1c2Ugb24gTVNWQyBzdGQ6OmF0b21pYzw+IGlzIG5vdAorICAvLyB0cml2aWFsbHkgY29u
c3RydWN0aWJsZSBhbnltb3JlLiBBbHNvIHN0ZDo6YXRvbWljPD4gaGFzIGEgZGVsZXRlZCBjb3B5
CisgIC8vIGNvbnN0cnVjdG9yIHNvIHdlIGNhbnQganVzdCBkbyAiKnRoaXMgPSBSZWNvcmQoKSIg
ZWl0aGVyLgorICAvLyBTZWUgaHR0cDovL2JpdC5seS8zMzlKbHpkIC4KKyAgdm9pZCBjbGVhcigp
IHsKKyAgICB0aGlzLT5+UmVjb3JkKCk7CisgICAgbmV3ICh0aGlzKSBSZWNvcmQoKTsKKyAgfQor
CisgIC8vIFRoaXMgZmllbGQgaG9sZHMgdGhlIHR5cGUgKGNvdW50ZXIgdnMgZXZlbnQpIGluIHRo
ZSBNU0IgYW5kIGV2ZW50IElEIChhcworICAvLyBkZWZpbmVkIGluIG1ldGF0cmFjZV9ldmVudHMu
aCkgaW4gdGhlIGxvd2VzdCAxNSBiaXRzLiBJdCBpcyBhbHNvIHVzZWQgYWxzbworICAvLyBhcyBh
IGxpbmVhcml6YXRpb24gcG9pbnQ6IHRoaXMgaXMgYWx3YXlzIHdyaXR0ZW4gYWZ0ZXIgYWxsIHRo
ZSBvdGhlcgorICAvLyBmaWVsZHMgd2l0aCBhIHJlbGVhc2Utc3RvcmUuIFRoaXMgaXMgc28gdGhl
IHJlYWRlciBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgaXQKKyAgLy8gY2FuIHNhZmVseSBwcm9jZXNz
IHRoZSBvdGhlciBldmVudCBmaWVsZHMgYWZ0ZXIgYSBsb2FkLWFjcXVpcmUuCisgIHN0ZDo6YXRv
bWljPHVpbnQxNl90PiB0eXBlX2FuZF9pZHt9OworCisgIC8vIFRpbWVzdGFtcCBpcyBzdG9yZWQg
YXMgYSA0OC1iaXRzIHZhbHVlIGRpZmZlZCBhZ2FpbnN0IGdfZW5hYmxlZF90aW1lc3RhbXAuCisg
IC8vIFRoaXMgZ2l2ZXMgdXMgNzggaG91cnMgZnJvbSBFbmFibGVkKCkuCisgIHVpbnQxNl90IHRp
bWVzdGFtcF9uc19oaWdoID0gMDsKKyAgdWludDMyX3QgdGltZXN0YW1wX25zX2xvdyA9IDA7CisK
KyAgdWludDMyX3QgdGhyZWFkX2lkID0gMDsKKworICB1bmlvbiB7CisgICAgLy8gT25seSBvbmUg
b2YgdGhlIHR3byBlbGVtZW50cyBjYW4gYmUgemVybyBpbml0aWFsaXplZCwgY2xhbmcgY29tcGxh
aW5zCisgICAgLy8gYWJvdXQgImluaXRpYWxpemluZyBtdWx0aXBsZSBtZW1iZXJzIG9mIHVuaW9u
IiBvdGhlcndpc2UuCisgICAgdWludDMyX3QgZHVyYXRpb25fbnMgPSAwOyAgLy8gSWYgdHlwZSA9
PSBldmVudC4KKyAgICBpbnQzMl90IGNvdW50ZXJfdmFsdWU7ICAvLyBJZiB0eXBlID09IGNvdW50
ZXIuCisgIH07Cit9OworCisvLyBIb2xkIHRoZSBtZXRhLXRyYWNpbmcgZGF0YSBpbnRvIGEgc3Rh
dGljYWxseSBhbGxvY2F0ZWQgYXJyYXkuCisvLyBUaGlzIGNsYXNzIHVzZXMgc3RhdGljIHN0b3Jh
Z2UgKGFzIG9wcG9zaXRlIHRvIGJlaW5nIGEgc2luZ2xldG9uKSB0bzoKKy8vIC0gSGF2ZSB0aGUg
Z3VhcmFudGVlIG9mIGFsd2F5cyB2YWxpZCBzdG9yYWdlLCBzbyB0aGF0IG1ldGEtdHJhY2luZyBj
YW4gYmUKKy8vICAgc2FmZWx5IHVzZWQgaW4gYW55IHBhcnQgb2YgdGhlIGNvZGViYXNlLCBpbmNs
dWRpbmcgYmFzZS8gaXRzZWxmLgorLy8gLSBBdm9pZCBiYXJyaWVycyB0aGF0IHRocmVhZC1zYWZl
IHN0YXRpYyBsb2NhbHMgd291bGQgcmVxdWlyZS4KK2NsYXNzIFJpbmdCdWZmZXIgeworIHB1Ymxp
YzoKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gNDA5NjsgIC8vIDQwOTYg
KiAxNiBieXRlcyA9IDY0Sy4KKworICAvLyBUaGlzIGl0ZXJhdG9yIGlzIG5vdCBpZGVtcG90ZW50
IGFuZCB3aWxsIGJ1bXAgdGhlIHJlYWQgaW5kZXggaW4gdGhlIGJ1ZmZlcgorICAvLyBhdCB0aGUg
ZW5kIG9mIHRoZSByZWFkcy4gVGhlcmUgY2FuIGJlIG9ubHkgb25lIHJlYWRlciBhdCBhbnkgdGlt
ZS4KKyAgLy8gVXNhZ2U6IGZvciAoYXV0byBpdCA9IFJpbmdCdWZmZXI6OkdldFJlYWRJdGVyYXRv
cigpOyBpdDsgKytpdCkgeyBpdC0+Li4uIH0KKyAgY2xhc3MgUmVhZEl0ZXJhdG9yIHsKKyAgIHB1
YmxpYzoKKyAgICBSZWFkSXRlcmF0b3IoUmVhZEl0ZXJhdG9yJiYgb3RoZXIpIHsKKyAgICAgIFBF
UkZFVFRPX0RDSEVDSyhvdGhlci52YWxpZF8pOworICAgICAgY3VyXyA9IG90aGVyLmN1cl87Cisg
ICAgICBlbmRfID0gb3RoZXIuZW5kXzsKKyAgICAgIHZhbGlkXyA9IG90aGVyLnZhbGlkXzsKKyAg
ICAgIG90aGVyLnZhbGlkXyA9IGZhbHNlOworICAgIH0KKworICAgIH5SZWFkSXRlcmF0b3IoKSB7
CisgICAgICBpZiAoIXZhbGlkXykKKyAgICAgICAgcmV0dXJuOworICAgICAgUEVSRkVUVE9fRENI
RUNLKGN1cl8gPj0gUmluZ0J1ZmZlcjo6cmRfaW5kZXhfKTsKKyAgICAgIFBFUkZFVFRPX0RDSEVD
SyhjdXJfIDw9IFJpbmdCdWZmZXI6OndyX2luZGV4Xyk7CisgICAgICBSaW5nQnVmZmVyOjpyZF9p
bmRleF8uc3RvcmUoY3VyXywgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgfQorCisg
ICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGN1cl8gPCBlbmRfOyB9
CisgICAgY29uc3QgUmVjb3JkKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gUmluZ0J1ZmZl
cjo6QXQoY3VyXyk7IH0KKyAgICBjb25zdCBSZWNvcmQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0
dXJuICpvcGVyYXRvci0+KCk7IH0KKworICAgIC8vIFRoaXMgaXMgZm9yICsraXQuIGl0KysgaXMg
ZGVsaWJlcmF0ZWx5IG5vdCBzdXBwb3J0ZWQuCisgICAgUmVhZEl0ZXJhdG9yJiBvcGVyYXRvcisr
KCkgeworICAgICAgUEVSRkVUVE9fRENIRUNLKGN1cl8gPCBlbmRfKTsKKyAgICAgIC8vIE9uY2Ug
YSByZWNvcmQgaGFzIGJlZW4gcmVhZCwgbWFyayBpdCBhcyBmcmVlIGNsZWFyaW5nIGl0cyB0eXBl
X2FuZF9pZCwKKyAgICAgIC8vIHNvIGlmIHdlIGVuY291bnRlciBpdCBpbiBhbm90aGVyIHJlYWQg
aXRlcmF0aW9uIHdoaWxlIGJlaW5nIHdyaXR0ZW4KKyAgICAgIC8vIHdlIGtub3cgaXQncyBub3Qg
ZnVsbHkgd3JpdHRlbiB5ZXQuCisgICAgICAvLyBUaGUgbWVtb3J5X29yZGVyX3JlbGF4ZWQgYmVs
b3cgaXMgZW5vdWdoIGJlY2F1c2U6CisgICAgICAvLyAtIFRoZSByZWFkZXIgaXMgc2luZ2xlLXRo
cmVhZGVkIGFuZCBkb2Vzbid0IHJlLXJlYWQgdGhlIHNhbWUgcmVjb3Jkcy4KKyAgICAgIC8vIC0g
QmVmb3JlIHN0YXJ0aW5nIGEgcmVhZCBiYXRjaCwgdGhlIHJlYWRlciBoYXMgYW4gYWNxdWlyZSBi
YXJyaWVyIG9uCisgICAgICAvLyAgIHxyZF9pbmRleF98LgorICAgICAgLy8gLSBBZnRlciB0ZXJt
aW5hdGluZyBhIHJlYWQgYmF0Y2gsIHRoZSB+UmVhZEl0ZXJhdG9yIGR0b3IgdXBkYXRlcyB0aGUK
KyAgICAgIC8vICAgfHJkX2luZGV4X3wgd2l0aCBhIHJlbGVhc2Utc3RvcmUuCisgICAgICAvLyAt
IFJlYWRlciBhbmQgd3JpdGVyIGFyZSB0eXBpY2FsbHkga0NhcGFjaXR5LzIgYXBhcnQuIFNvIHVu
bGVzcyBhbgorICAgICAgLy8gICBvdmVycnVuIGhhcHBlbnMgYSB3cml0ZXIgd29uJ3QgcmV1c2Ug
YSBuZXdseSByZWxlYXNlZCByZWNvcmQgYW55IHRpbWUKKyAgICAgIC8vICAgc29vbi4gSWYgYW4g
b3ZlcnJ1biBoYXBwZW5zLCBldmVyeXRoaW5nIGlzIGJ1c3RlZCByZWdhcmRsZXNzLgorICAgICAg
QXQoY3VyXyktPnR5cGVfYW5kX2lkLnN0b3JlKDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQp
OworICAgICAgKytjdXJfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgcHJpdmF0
ZToKKyAgICBmcmllbmQgY2xhc3MgUmluZ0J1ZmZlcjsKKyAgICBSZWFkSXRlcmF0b3IodWludDY0
X3QgYmVnaW4sIHVpbnQ2NF90IGVuZCkKKyAgICAgICAgOiBjdXJfKGJlZ2luKSwgZW5kXyhlbmQp
LCB2YWxpZF8odHJ1ZSkge30KKyAgICBSZWFkSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBSZWFk
SXRlcmF0b3ImKSA9IGRlbGV0ZTsKKyAgICBSZWFkSXRlcmF0b3IoY29uc3QgUmVhZEl0ZXJhdG9y
JikgPSBkZWxldGU7CisKKyAgICB1aW50NjRfdCBjdXJfOworICAgIHVpbnQ2NF90IGVuZF87Cisg
ICAgYm9vbCB2YWxpZF87CisgIH07CisKKyAgc3RhdGljIFJlY29yZCogQXQodWludDY0X3QgaW5k
ZXgpIHsKKyAgICAvLyBEb2Vzbid0IHJlYWxseSBoYXZlIHRvIGJlIHBvdzIsIGJ1dCBpZiBub3Qg
dGhlIGNvbXBpbGVyIHdpbGwgZW1pdAorICAgIC8vIGFyaXRobWV0aWMgb3BlcmF0aW9ucyB0byBj
b21wdXRlIHRoZSBtb2R1bG8gaW5zdGVhZCBvZiBhIGJpdHdpc2UgQU5ELgorICAgIHN0YXRpY19h
c3NlcnQoIShrQ2FwYWNpdHkgJiAoa0NhcGFjaXR5IC0gMSkpLCAia0NhcGFjaXR5IG11c3QgYmUg
cG93MiIpOworICAgIFBFUkZFVFRPX0RDSEVDSyhpbmRleCA+PSByZF9pbmRleF8pOworICAgIFBF
UkZFVFRPX0RDSEVDSyhpbmRleCA8PSB3cl9pbmRleF8pOworICAgIHJldHVybiAmcmVjb3Jkc19b
aW5kZXggJSBrQ2FwYWNpdHldOworICB9CisKKyAgLy8gTXVzdCBiZSBjYWxsZWQgb24gdGhlIHNh
bWUgdGFzayBydW5uZXIgcGFzc2VkIHRvIEVuYWJsZSgpCisgIHN0YXRpYyBSZWFkSXRlcmF0b3Ig
R2V0UmVhZEl0ZXJhdG9yKCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhSaW5nQnVmZmVyOjpJc09u
VmFsaWRUYXNrUnVubmVyKCkpOworICAgIHJldHVybiBSZWFkSXRlcmF0b3IocmRfaW5kZXhfLmxv
YWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSksCisgICAgICAgICAgICAgICAgICAgICAgICB3
cl9pbmRleF8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSk7CisgIH0KKworICBzdGF0
aWMgUmVjb3JkKiBBcHBlbmROZXdSZWNvcmQoKTsKKyAgc3RhdGljIHZvaWQgUmVzZXQoKTsKKwor
ICBzdGF0aWMgYm9vbCBoYXNfb3ZlcnJ1bnMoKSB7CisgICAgcmV0dXJuIGhhc19vdmVycnVuc18u
bG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgfQorCisgIC8vIENhbiB0ZW1wb3Jh
cmlseSByZXR1cm4gYSB2YWx1ZSA+PSBrQ2FwYWNpdHkgYnV0IGlzIGV2ZW50dWFsbHkgY29uc2lz
dGVudC4KKyAgLy8gVGhpcyB3b3VsZCBoYXBwZW4gaW4gY2FzZSBvZiBvdmVycnVucyB1bnRpbCB0
aHJlYWRzIGhpdCB0aGUgLS13cl9pbmRleF8KKyAgLy8gaW4gQXBwZW5kTmV3UmVjb3JkKCkuCisg
IHN0YXRpYyB1aW50NjRfdCBHZXRTaXplRm9yVGVzdGluZygpIHsKKyAgICBhdXRvIHdyX2luZGV4
ID0gd3JfaW5kZXhfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgYXV0byBy
ZF9pbmRleCA9IHJkX2luZGV4Xy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAg
IFBFUkZFVFRPX0RDSEVDSyh3cl9pbmRleCA+PSByZF9pbmRleCk7CisgICAgcmV0dXJuIHdyX2lu
ZGV4IC0gcmRfaW5kZXg7CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBSZWFkSXRl
cmF0b3I7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgb24gdGhlIHRhc2sg
cnVubmVyIHBhc3NlZCB0byBFbmFibGUoKS4KKyAgLy8gVXNlZCBvbmx5IGZvciBEQ0hFQ0tzLgor
ICBzdGF0aWMgYm9vbCBJc09uVmFsaWRUYXNrUnVubmVyKCk7CisKKyAgc3RhdGljIHN0ZDo6YXJy
YXk8UmVjb3JkLCBrQ2FwYWNpdHk+IHJlY29yZHNfOworICBzdGF0aWMgc3RkOjphdG9taWM8Ym9v
bD4gcmVhZF90YXNrX3F1ZXVlZF87CisgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gd3Jf
aW5kZXhfOworICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IHJkX2luZGV4XzsKKyAgc3Rh
dGljIHN0ZDo6YXRvbWljPGJvb2w+IGhhc19vdmVycnVuc187CisgIHN0YXRpYyBSZWNvcmQgYmFu
a3J1cHRjeV9yZWNvcmRfOyAgLy8gVXNlZCBpbiBjYXNlIG9mIG92ZXJydW5zLgorfTsKKworaW5s
aW5lIHZvaWQgVHJhY2VDb3VudGVyKHVpbnQzMl90IHRhZywgdWludDE2X3QgaWQsIGludDMyX3Qg
dmFsdWUpIHsKKyAgLy8gbWVtb3J5X29yZGVyX3JlbGF4ZWQgaXMgb2theSBiZWNhdXNlIHRoZSBz
dG9yYWdlIGhhcyBzdGF0aWMgbGlmZXRpbWUuCisgIC8vIEl0IGlzIHNhZmUgdG8gYWNjaWRlbnRh
bGx5IGxvZyBhbiBldmVudCBzb29uIGFmdGVyIGRpc2FibGluZy4KKyAgYXV0byBlbmFibGVkX3Rh
Z3MgPSBnX2VuYWJsZWRfdGFncy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBp
ZiAoUEVSRkVUVE9fTElLRUxZKChlbmFibGVkX3RhZ3MgJiB0YWcpID09IDApKQorICAgIHJldHVy
bjsKKyAgUmVjb3JkKiByZWNvcmQgPSBSaW5nQnVmZmVyOjpBcHBlbmROZXdSZWNvcmQoKTsKKyAg
cmVjb3JkLT50aHJlYWRfaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYmFzZTo6R2V0VGhyZWFk
SWQoKSk7CisgIHJlY29yZC0+c2V0X3RpbWVzdGFtcChUcmFjZVRpbWVOb3dOcygpKTsKKyAgcmVj
b3JkLT5jb3VudGVyX3ZhbHVlID0gdmFsdWU7CisgIHJlY29yZC0+dHlwZV9hbmRfaWQuc3RvcmUo
UmVjb3JkOjprVHlwZUNvdW50ZXIgfCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKK30KKworY2xhc3MgU2NvcGVkRXZlbnQgeworIHB1
YmxpYzoKKyAgU2NvcGVkRXZlbnQodWludDMyX3QgdGFnLCB1aW50MTZfdCBldmVudF9pZCkgewor
ICAgIGF1dG8gZW5hYmxlZF90YWdzID0gZ19lbmFibGVkX3RhZ3MubG9hZChzdGQ6Om1lbW9yeV9v
cmRlcl9yZWxheGVkKTsKKyAgICBpZiAoUEVSRkVUVE9fTElLRUxZKChlbmFibGVkX3RhZ3MgJiB0
YWcpID09IDApKQorICAgICAgcmV0dXJuOworICAgIGV2ZW50X2lkXyA9IGV2ZW50X2lkOworICAg
IHJlY29yZF8gPSBSaW5nQnVmZmVyOjpBcHBlbmROZXdSZWNvcmQoKTsKKyAgICByZWNvcmRfLT50
aHJlYWRfaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYmFzZTo6R2V0VGhyZWFkSWQoKSk7Cisg
ICAgcmVjb3JkXy0+c2V0X3RpbWVzdGFtcChUcmFjZVRpbWVOb3dOcygpKTsKKyAgfQorCisgIH5T
Y29wZWRFdmVudCgpIHsKKyAgICBpZiAoUEVSRkVUVE9fTElLRUxZKCFyZWNvcmRfKSkKKyAgICAg
IHJldHVybjsKKyAgICBhdXRvIG5vdyA9IFRyYWNlVGltZU5vd05zKCk7CisgICAgcmVjb3JkXy0+
ZHVyYXRpb25fbnMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obm93IC0gcmVjb3JkXy0+dGltZXN0
YW1wX25zKCkpOworICAgIHJlY29yZF8tPnR5cGVfYW5kX2lkLnN0b3JlKFJlY29yZDo6a1R5cGVF
dmVudCB8IGV2ZW50X2lkXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1l
bW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgUmVjb3JkKiByZWNvcmRf
ID0gbnVsbHB0cjsKKyAgdWludDE2X3QgZXZlbnRfaWRfID0gMDsKKyAgU2NvcGVkRXZlbnQoY29u
c3QgU2NvcGVkRXZlbnQmKSA9IGRlbGV0ZTsKKyAgU2NvcGVkRXZlbnQmIG9wZXJhdG9yPShjb25z
dCBTY29wZWRFdmVudCYpID0gZGVsZXRlOworfTsKKworLy8gQm9pbGVycGxhdGUgdG8gZGVyaXZl
IGEgdW5pcXVlIHZhcmlhYmxlIG5hbWUgZm9yIHRoZSBldmVudC4KKyNkZWZpbmUgUEVSRkVUVE9f
TUVUQVRSQUNFX1VJRDIoYSwgYikgYSMjYgorI2RlZmluZSBQRVJGRVRUT19NRVRBVFJBQ0VfVUlE
KHgpIFBFUkZFVFRPX01FVEFUUkFDRV9VSUQyKG1ldGF0cmFjZV8sIHgpCisKKyNkZWZpbmUgUEVS
RkVUVE9fTUVUQVRSQUNFX1NDT1BFRChUQUcsIElEKSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICA6OnBlcmZldHRvOjptZXRhdHJhY2U6OlNjb3BlZEV2ZW50IFBFUkZFVFRPX01F
VEFUUkFDRV9VSUQoX19DT1VOVEVSX18pKCBcCisgICAgICA6OnBlcmZldHRvOjptZXRhdHJhY2U6
OlRBRywgOjpwZXJmZXR0bzo6bWV0YXRyYWNlOjpJRCkKKworI2RlZmluZSBQRVJGRVRUT19NRVRB
VFJBQ0VfQ09VTlRFUihUQUcsIElELCBWQUxVRSkgICAgICAgICAgICAgICAgXAorICA6OnBlcmZl
dHRvOjptZXRhdHJhY2U6OlRyYWNlQ291bnRlcig6OnBlcmZldHRvOjptZXRhdHJhY2U6OlRBRywg
XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnBlcmZldHRvOjptZXRh
dHJhY2U6OklELCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxpbnQzMl90PihWQUxVRSkpCisKK30gIC8vIG5hbWVzcGFjZSBtZXRhdHJhY2UKK30g
IC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhU
X0JBU0VfTUVUQVRSQUNFX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNs
dWRlL3BlcmZldHRvL2Jhc2UvdGFza19ydW5uZXIuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIg
dGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3Ug
bWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vu
c2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAg
ICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVu
bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywg
c29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVk
IG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9O
UyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGlj
ZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQK
KyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVE
RV9QRVJGRVRUT19CQVNFX1RBU0tfUlVOTkVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9f
QkFTRV9UQVNLX1JVTk5FUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxm
dW5jdGlvbmFsPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJh
c2UgeworCisvLyBBIGdlbmVyaWMgaW50ZXJmYWNlIHRvIGFsbG93IHRoZSBsaWJyYXJ5IGNsaWVu
dHMgdG8gaW50ZXJsZWF2ZSB0aGUgZXhlY3V0aW9uCisvLyBvZiB0aGUgdHJhY2luZyBpbnRlcm5h
bHMgaW4gdGhlaXIgcnVudGltZSBlbnZpcm9ubWVudC4KKy8vIFRoZSBleHBlY3RhdGlvbiBpcyB0
aGF0IGFsbCB0YXNrcywgd2hpY2ggYXJlIHF1ZXVlZCBlaXRoZXIgdmlhIFBvc3RUYXNrKCkgb3IK
Ky8vIEFkZEZpbGVEZXNjcmlwdG9yV2F0Y2goKSwgYXJlIGV4ZWN1dGVkIG9uIHRoZSBzYW1lIHNl
cXVlbmNlIChlaXRoZXIgb24gdGhlCisvLyBzYW1lIHRocmVhZCwgb3Igb24gYSB0aHJlYWQgcG9v
bCB0aGF0IGdpdmVzIHNlcXVlbmNpbmcgZ3VhcmFudGVlcykuCisvLworLy8gVGFza3MgYXJlIG5l
dmVyIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgaW5zaWRlIFBvc3RUYXNrIGFuZCB0aGVyZSBpcyBh
IGZ1bGwKKy8vIG1lbW9yeSBiYXJyaWVyIGJldHdlZW4gdGFza3MuCisvLworLy8gQWxsIG1ldGhv
ZHMgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQuCitjbGFz
cyBQRVJGRVRUT19FWFBPUlQgVGFza1J1bm5lciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UYXNr
UnVubmVyKCk7CisKKyAgLy8gU2NoZWR1bGUgYSB0YXNrIGZvciBpbW1lZGlhdGUgZXhlY3V0aW9u
LiBJbW1lZGlhdGUgdGFza3MgYXJlIGFsd2F5cworICAvLyBleGVjdXRlZCBpbiB0aGUgb3JkZXIg
dGhleSBhcmUgcG9zdGVkLiBDYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KKyAgdmlydHVh
bCB2b2lkIFBvc3RUYXNrKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPikgPSAwOworCisgIC8vIFNjaGVk
dWxlIGEgdGFzayBmb3IgZXhlY3V0aW9uIGFmdGVyIHxkZWxheV9tc3wuIE5vdGUgdGhhdCB0aGVy
ZSBpcyBubworICAvLyBzdHJpY3Qgb3JkZXJpbmcgZ3VhcmFudGVlIGJldHdlZW4gaW1tZWRpYXRl
IGFuZCBkZWxheWVkIHRhc2tzLiBDYW4gYmUKKyAgLy8gY2FsbGVkIGZyb20gYW55IHRocmVhZC4K
KyAgdmlydHVhbCB2b2lkIFBvc3REZWxheWVkVGFzayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4sIHVp
bnQzMl90IGRlbGF5X21zKSA9IDA7CisKKyAgLy8gU2NoZWR1bGUgYSB0YXNrIHRvIHJ1biB3aGVu
IHxmZHwgYmVjb21lcyByZWFkYWJsZS4gVGhlIHNhbWUgfGZkfCBjYW4gb25seQorICAvLyBiZSBt
b25pdG9yZWQgYnkgb25lIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IG5l
ZWRzIHRvIGJlCisgIC8vIGltcGxlbWVudGVkIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgYnVpbHQt
aW4gaXBjIGZyYW1ld29yayBpcyB1c2VkLiBDYW4gYmUKKyAgLy8gY2FsbGVkIGZyb20gYW55IHRo
cmVhZC4KKyAgLy8gVE9ETyhza3lvc3RpbCk6IFJlZmFjdG9yIHRoaXMgb3V0IG9mIHRoZSBzaGFy
ZWQgaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgQWRkRmlsZURlc2NyaXB0b3JXYXRjaChpbnQg
ZmQsIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPikgPSAwOworCisgIC8vIFJlbW92ZSBhIHByZXZpb3Vz
bHkgc2NoZWR1bGVkIHdhdGNoIGZvciB8ZmR8LiBJZiB0aGlzIGlzIHJ1biBvbiB0aGUgdGFyZ2V0
CisgIC8vIHRocmVhZCBvZiB0aGlzIFRhc2tSdW5uZXIsIGd1YXJhbnRlZXMgdGhhdCB0aGUgdGFz
ayByZWdpc3RlcmVkIHRvIHRoaXMgZmQKKyAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQgYWZ0ZXIg
dGhpcyBmdW5jdGlvbiBjYWxsLiBDYW4gYmUgY2FsbGVkIGZyb20gYW55CisgIC8vIHRocmVhZC4K
KyAgdmlydHVhbCB2b2lkIFJlbW92ZUZpbGVEZXNjcmlwdG9yV2F0Y2goaW50IGZkKSA9IDA7CisK
KyAgLy8gQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgc2FtZSB0aHJlYWQgd2hl
cmUgdGhlIFRhc2tSdW5uZXIncyB0YXNrCisgIC8vIHJ1bi4gVGhpcyBhbGxvd3Mgc2luZ2xlIHRo
cmVhZGVkIHRhc2sgcnVubmVycyAobGlrZSB0aGUgb25lcyB1c2VkIGluCisgIC8vIHBlcmZldHRv
KSB0byBpbmZvcm0gdGhlIGNhbGxlciB0aGF0IGFueXRoaW5nIHBvc3RlZCB3aWxsIHJ1biBvbiB0
aGUgc2FtZQorICAvLyB0aHJlYWQvc2VxdWVuY2UuIFRoaXMgY2FuIGFsbG93IHNvbWUgY2FsbGVy
cyB0byBza2lwIFBvc3RUYXNrIGFuZCBpbnN0ZWFkCisgIC8vIGRpcmVjdGx5IGV4ZWN1dGUgdGhl
IGNvZGUuIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgorICB2aXJ0dWFsIGJvb2wgUnVu
c1Rhc2tzT25DdXJyZW50VGhyZWFkKCkgY29uc3QgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNl
IGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVS
RkVUVE9fQkFTRV9UQVNLX1JVTk5FUl9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUg
QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFw
YWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5v
dCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisg
KiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0
dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBy
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
cmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu
ICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBB
TlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBm
b3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxp
bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL21ldGF0cmFjZS5oIgorCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2NvbXBpbGVy
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L3Rhc2tfcnVubmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9iYXNlL3RpbWUuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2V4dC9iYXNlL2ZpbGVfdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBtZXRhdHJhY2UgeworCitzdGQ6OmF0b21pYzx1aW50MzJfdD4gZ19lbmFi
bGVkX3RhZ3N7MH07CitzdGQ6OmF0b21pYzx1aW50NjRfdD4gZ19lbmFibGVkX3RpbWVzdGFtcHsw
fTsKKworLy8gc3RhdGljIG1lbWJlcnMKK2NvbnN0ZXhwciBzaXplX3QgUmluZ0J1ZmZlcjo6a0Nh
cGFjaXR5Oworc3RkOjphcnJheTxSZWNvcmQsIFJpbmdCdWZmZXI6OmtDYXBhY2l0eT4gUmluZ0J1
ZmZlcjo6cmVjb3Jkc187CitzdGQ6OmF0b21pYzxib29sPiBSaW5nQnVmZmVyOjpyZWFkX3Rhc2tf
cXVldWVkXzsKK3N0ZDo6YXRvbWljPHVpbnQ2NF90PiBSaW5nQnVmZmVyOjp3cl9pbmRleF87Citz
dGQ6OmF0b21pYzx1aW50NjRfdD4gUmluZ0J1ZmZlcjo6cmRfaW5kZXhfOworc3RkOjphdG9taWM8
Ym9vbD4gUmluZ0J1ZmZlcjo6aGFzX292ZXJydW5zXzsKK1JlY29yZCBSaW5nQnVmZmVyOjpiYW5r
cnVwdGN5X3JlY29yZF87CisKK2NvbnN0ZXhwciB1aW50MTZfdCBSZWNvcmQ6OmtUeXBlTWFzazsK
K2NvbnN0ZXhwciB1aW50MTZfdCBSZWNvcmQ6OmtUeXBlQ291bnRlcjsKK2NvbnN0ZXhwciB1aW50
MTZfdCBSZWNvcmQ6OmtUeXBlRXZlbnQ7CisKK25hbWVzcGFjZSB7CisKKy8vIHN0ZDo6ZnVuY3Rp
b248PiBpcyBub3QgdHJpdmlhbGx5IGRlL2NvbnN0cnVjdGlibGUuIFRoaXMgc3RydWN0IHdyYXBz
IGl0IGluIGEKKy8vIGhlYXAtYWxsb2NhdGVkIHN0cnVjdCB0byBhdm9pZCBzdGF0aWMgaW5pdGlh
bGl6ZXJzLgorc3RydWN0IERlbGVnYXRlIHsKKyAgc3RhdGljIERlbGVnYXRlKiBHZXRJbnN0YW5j
ZSgpIHsKKyAgICBzdGF0aWMgRGVsZWdhdGUqIGluc3RhbmNlID0gbmV3IERlbGVnYXRlKCk7Cisg
ICAgcmV0dXJuIGluc3RhbmNlOworICB9CisKKyAgYmFzZTo6VGFza1J1bm5lciogdGFza19ydW5u
ZXIgPSBudWxscHRyOworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcmVhZF90YXNrOworfTsKKwor
fSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgRW5hYmxlKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiByZWFk
X3Rhc2ssCisgICAgICAgICAgICBiYXNlOjpUYXNrUnVubmVyKiB0YXNrX3J1bm5lciwKKyAgICAg
ICAgICAgIHVpbnQzMl90IHRhZ3MpIHsKKyAgUEVSRkVUVE9fRENIRUNLKHJlYWRfdGFzayk7Cisg
IFBFUkZFVFRPX0RDSEVDSyh0YXNrX3J1bm5lci0+UnVuc1Rhc2tzT25DdXJyZW50VGhyZWFkKCkp
OworICBpZiAoZ19lbmFibGVkX3RhZ3MubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSkK
KyAgICByZXR1cm4gZmFsc2U7CisKKyAgRGVsZWdhdGUqIGRnID0gRGVsZWdhdGU6OkdldEluc3Rh
bmNlKCk7CisgIGRnLT50YXNrX3J1bm5lciA9IHRhc2tfcnVubmVyOworICBkZy0+cmVhZF90YXNr
ID0gc3RkOjptb3ZlKHJlYWRfdGFzayk7CisgIFJpbmdCdWZmZXI6OlJlc2V0KCk7CisgIGdfZW5h
YmxlZF90aW1lc3RhbXAuc3RvcmUoVHJhY2VUaW1lTm93TnMoKSwgc3RkOjptZW1vcnlfb3JkZXJf
cmVsYXhlZCk7CisgIGdfZW5hYmxlZF90YWdzLnN0b3JlKHRhZ3MsIHN0ZDo6bWVtb3J5X29yZGVy
X3JlbGVhc2UpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBEaXNhYmxlKCkgeworICBnX2Vu
YWJsZWRfdGFncy5zdG9yZSgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgRGVsZWdh
dGUqIGRnID0gRGVsZWdhdGU6OkdldEluc3RhbmNlKCk7CisgIFBFUkZFVFRPX0RDSEVDSyghZGct
PnRhc2tfcnVubmVyIHx8CisgICAgICAgICAgICAgICAgICBkZy0+dGFza19ydW5uZXItPlJ1bnNU
YXNrc09uQ3VycmVudFRocmVhZCgpKTsKKyAgZGctPnRhc2tfcnVubmVyID0gbnVsbHB0cjsKKyAg
ZGctPnJlYWRfdGFzayA9IG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYwordm9pZCBSaW5nQnVmZmVy
OjpSZXNldCgpIHsKKyAgYmFua3J1cHRjeV9yZWNvcmRfLmNsZWFyKCk7CisgIGZvciAoUmVjb3Jk
JiByZWNvcmQgOiByZWNvcmRzXykKKyAgICByZWNvcmQuY2xlYXIoKTsKKyAgd3JfaW5kZXhfID0g
MDsKKyAgcmRfaW5kZXhfID0gMDsKKyAgaGFzX292ZXJydW5zXyA9IGZhbHNlOworICByZWFkX3Rh
c2tfcXVldWVkXyA9IGZhbHNlOworfQorCisvLyBzdGF0aWMKK1JlY29yZCogUmluZ0J1ZmZlcjo6
QXBwZW5kTmV3UmVjb3JkKCkgeworICBhdXRvIHdyX2luZGV4ID0gd3JfaW5kZXhfLmZldGNoX2Fk
ZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworICAvLyByZF9pbmRleCBjYW4gb25s
eSBtb25vdG9uaWNhbGx5IGluY3JlYXNlLCB3ZSBkb24ndCBjYXJlIGlmIHdlIHJlYWQgYW4KKyAg
Ly8gb2xkZXIgdmFsdWUsIHdlJ2xsIGp1c3QgaGl0IHRoZSBzbG93LXBhdGggYSBiaXQgZWFybGll
ciBpZiBpdCBoYXBwZW5zLgorICBhdXRvIHJkX2luZGV4ID0gcmRfaW5kZXhfLmxvYWQoc3RkOjpt
ZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyAgUEVSRkVUVE9fRENIRUNLKHdyX2luZGV4ID49IHJk
X2luZGV4KTsKKyAgYXV0byBzaXplID0gd3JfaW5kZXggLSByZF9pbmRleDsKKyAgaWYgKFBFUkZF
VFRPX0xJS0VMWShzaXplIDwga0NhcGFjaXR5IC8gMikpCisgICAgcmV0dXJuIEF0KHdyX2luZGV4
KTsKKworICAvLyBTbG93LXBhdGg6IEVucXVldWUgdGhlIHJlYWQgdGFzayBhbmQgaGFuZGxlIG92
ZXJydW5zLgorICBib29sIGV4cGVjdGVkID0gZmFsc2U7CisgIGlmIChSaW5nQnVmZmVyOjpyZWFk
X3Rhc2tfcXVldWVkXy5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhleHBlY3RlZCwgdHJ1ZSkpIHsK
KyAgICBEZWxlZ2F0ZSogZGcgPSBEZWxlZ2F0ZTo6R2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoZGct
PnRhc2tfcnVubmVyKSB7CisgICAgICBkZy0+dGFza19ydW5uZXItPlBvc3RUYXNrKFtdIHsKKyAg
ICAgICAgLy8gTWV0YS10cmFjaW5nIG1pZ2h0IGhhdmUgYmVlbiBkaXNhYmxlZCBpbiB0aGUgbWVh
bnRpbWUuCisgICAgICAgIGF1dG8gcmVhZF90YXNrID0gRGVsZWdhdGU6OkdldEluc3RhbmNlKCkt
PnJlYWRfdGFzazsKKyAgICAgICAgaWYgKHJlYWRfdGFzaykKKyAgICAgICAgICByZWFkX3Rhc2so
KTsKKyAgICAgICAgUmluZ0J1ZmZlcjo6cmVhZF90YXNrX3F1ZXVlZF8gPSBmYWxzZTsKKyAgICAg
IH0pOworICAgIH0KKyAgfQorCisgIGlmIChQRVJGRVRUT19MSUtFTFkoc2l6ZSA8IGtDYXBhY2l0
eSkpCisgICAgcmV0dXJuIEF0KHdyX2luZGV4KTsKKworICBoYXNfb3ZlcnJ1bnNfLnN0b3JlKHRy
dWUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICB3cl9pbmRleF8uZmV0Y2hfc3ViKDEs
IHN0ZDo6bWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisgIC8vIEluIHRoZSBjYXNlIG9mIG92ZXJm
bG93cywgdGhyZWFkcyB3aWxsIHJhY2Ugd3JpdGluZyBvbiB0aGUgc2FtZSBtZW1vcnkKKyAgLy8g
bG9jYXRpb24gYW5kIFRTYW4gd2lsbCByaWdodGx5IGNvbXBsYWluLiBUaGlzIGlzIGZpbmUgdGhv
dWdoIGJlY2F1c2Ugbm9ib2R5CisgIC8vIHdpbGwgcmVhZCB0aGUgYmFua3J1cHRjeSByZWNvcmQg
YW5kIGl0J3MgZGVzaWduZWQgdG8gY29udGFpbiBnYXJiYWdlLgorICBQRVJGRVRUT19BTk5PVEFU
RV9CRU5JR05fUkFDRV9TSVpFRCgmYmFua3J1cHRjeV9yZWNvcmRfLCBzaXplb2YoUmVjb3JkKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGhpbmcgcmVhZHMgYmFu
a3J1cHRjeV9yZWNvcmRfIikKKyAgcmV0dXJuICZiYW5rcnVwdGN5X3JlY29yZF87Cit9CisKKy8v
IHN0YXRpYworYm9vbCBSaW5nQnVmZmVyOjpJc09uVmFsaWRUYXNrUnVubmVyKCkgeworICBhdXRv
KiB0YXNrX3J1bm5lciA9IERlbGVnYXRlOjpHZXRJbnN0YW5jZSgpLT50YXNrX3J1bm5lcjsKKyAg
cmV0dXJuIHRhc2tfcnVubmVyICYmIHRhc2tfcnVubmVyLT5SdW5zVGFza3NPbkN1cnJlbnRUaHJl
YWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldGF0cmFjZQorfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvYmFzZS9wYWdlZF9t
ZW1vcnkuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0
dG8vZXh0L2Jhc2UvcGFnZWRfbWVtb3J5LmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFk
ZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L2Jhc2UvY29udGFpbmVyX2Fubm90YXRpb25zLmgKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAor
ICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo
ZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29t
cGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRo
ZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMv
TElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3Ig
YWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUg
TGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBX
QVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGlt
cGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zl
cm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K
KyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfQ09OVEFJTkVSX0FOTk9U
QVRJT05TX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfQ09OVEFJTkVSX0FO
Tk9UQVRJT05TX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisKKy8vIFdpbmRvd3MgQVNBTiBkb2Vzbid0IGN1
cnJlbnRseSBzdXBwb3J0IHRoZXNlIGFubm90YXRpb25zLgorI2lmIGRlZmluZWQoQUREUkVTU19T
QU5JVElaRVIpICYmICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKSAmJiBcCisg
ICAgIWRlZmluZWQoQUREUkVTU19TQU5JVElaRVJfV0lUSE9VVF9JTlNUUlVNRU5UQVRJT04pCisK
KyNkZWZpbmUgQU5OT1RBVEVfTkVXX0JVRkZFUihidWZmZXIsIGNhcGFjaXR5LCBuZXdfc2l6ZSkg
ICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYnVmZmVyKSB7ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19zYW5p
dGl6ZXJfYW5ub3RhdGVfY29udGlndW91c19jb250YWluZXIoYnVmZmVyLCAoYnVmZmVyKSArIChj
YXBhY2l0eSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoYnVmZmVyKSArIChjYXBhY2l0eSksICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXIpICsgKG5ld19zaXplKSk7ICAgICAgICBc
CisgIH0KKyNkZWZpbmUgQU5OT1RBVEVfREVMRVRFX0JVRkZFUihidWZmZXIsIGNhcGFjaXR5LCBv
bGRfc2l6ZSkgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYnVmZmVyKSB7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
X19zYW5pdGl6ZXJfYW5ub3RhdGVfY29udGlndW91c19jb250YWluZXIoYnVmZmVyLCAoYnVmZmVy
KSArIChjYXBhY2l0eSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoYnVmZmVyKSArIChvbGRfc2l6ZSksICAgICAgICAgXAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXIpICsgKGNhcGFjaXR5KSk7ICAg
ICAgICBcCisgIH0KKyNkZWZpbmUgQU5OT1RBVEVfQ0hBTkdFX1NJWkUoYnVmZmVyLCBjYXBhY2l0
eSwgb2xkX3NpemUsIG5ld19zaXplKSAgICAgICAgICAgXAorICBpZiAoYnVmZmVyKSB7ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgX19zYW5pdGl6ZXJfYW5ub3RhdGVfY29udGlndW91c19jb250YWluZXIoYnVmZmVyLCAo
YnVmZmVyKSArIChjYXBhY2l0eSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoYnVmZmVyKSArIChvbGRfc2l6ZSksICAgICAgICAgXAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXIpICsgKG5ld19zaXpl
KSk7ICAgICAgICBcCisgIH0KKyNkZWZpbmUgQU5OT1RBVEVfQ0hBTkdFX0NBUEFDSVRZKGJ1ZmZl
ciwgb2xkX2NhcGFjaXR5LCBidWZmZXJfc2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3X2NhcGFjaXR5KSAgICAgICAgICAgICAgICAgICAgICBcCisgIEFOTk9UQVRF
X0RFTEVURV9CVUZGRVIoYnVmZmVyLCBvbGRfY2FwYWNpdHksIGJ1ZmZlcl9zaXplKTsgICAgICAg
IFwKKyAgQU5OT1RBVEVfTkVXX0JVRkZFUihidWZmZXIsIG5ld19jYXBhY2l0eSwgYnVmZmVyX3Np
emUpOworLy8gQW5ub3RhdGlvbnMgcmVxdWlyZSBidWZmZXJzIHRvIGJlZ2luIG9uIGFuIDgtYnl0
ZSBib3VuZGFyeS4KKyNlbHNlICAvLyBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQorI2RlZmlu
ZSBBTk5PVEFURV9ORVdfQlVGRkVSKGJ1ZmZlciwgY2FwYWNpdHksIG5ld19zaXplKQorI2RlZmlu
ZSBBTk5PVEFURV9ERUxFVEVfQlVGRkVSKGJ1ZmZlciwgY2FwYWNpdHksIG9sZF9zaXplKQorI2Rl
ZmluZSBBTk5PVEFURV9DSEFOR0VfU0laRShidWZmZXIsIGNhcGFjaXR5LCBvbGRfc2l6ZSwgbmV3
X3NpemUpCisjZGVmaW5lIEFOTk9UQVRFX0NIQU5HRV9DQVBBQ0lUWShidWZmZXIsIG9sZF9jYXBh
Y2l0eSwgYnVmZmVyX3NpemUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5l
d19jYXBhY2l0eSkKKyNlbmRpZiAgLy8gZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikKKworI2Vu
ZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX0NPTlRBSU5FUl9BTk5PVEFUSU9OU19I
XworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9q
ZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIu
MCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBp
biBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkg
b2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNl
bnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxh
dyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVy
IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRI
T1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mg
b3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdl
IGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNl
bnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9QQUdFRF9NRU1P
UllfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9QQUdFRF9NRU1PUllfSF8K
KworI2luY2x1ZGUgPG1lbW9yeT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL2NvbnRhaW5lcl9hbm5vdGF0aW9u
cy5oIgorCisvLyBXZSBuZWVkIHRvIHRyYWNrIHRoZSBjb21taXR0ZWQgc2l6ZSBvbiB3aW5kb3dz
IGFuZCB3aGVuIEFTQU4gaXMgZW5hYmxlZC4KKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVU
VE9fT1NfV0lOKSB8fCBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQorI2RlZmluZSBUUkFDS19D
T01NSVRURURfU0laRSgpIDEKKyNlbHNlCisjZGVmaW5lIFRSQUNLX0NPTU1JVFRFRF9TSVpFKCkg
MAorI2VuZGlmCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKK2Ns
YXNzIFBhZ2VkTWVtb3J5IHsKKyBwdWJsaWM6CisgIC8vIEluaXRpYWxpemVzIGFuIGludmFsaWQg
UGFnZWRNZW1vcnkgcG9pbnRpbmcgdG8gbnVsbHB0ci4KKyAgUGFnZWRNZW1vcnkoKTsKKworICB+
UGFnZWRNZW1vcnkoKTsKKworICBQYWdlZE1lbW9yeShQYWdlZE1lbW9yeSYmIG90aGVyKSBub2V4
Y2VwdDsKKyAgUGFnZWRNZW1vcnkmIG9wZXJhdG9yPShQYWdlZE1lbW9yeSYmIG90aGVyKTsKKwor
ICBlbnVtIEFsbG9jYXRpb25GbGFncyB7CisgICAgLy8gQnkgZGVmYXVsdCwgQWxsb2NhdGUoKSBj
cmFzaGVzIGlmIHRoZSB1bmRlcmx5aW5nIG1tYXAgZmFpbHMgKGUuZy4sIGlmIG91dAorICAgIC8v
IG9mIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSkuIFdoZW4gdGhpcyBmbGFnIGlzIHByb3ZpZGVkLCBh
biBpbnZhbGlkCisgICAgLy8gUGFnZWRNZW1vcnkgcG9pbnRpbmcgdG8gbnVsbHB0ciBpcyByZXR1
cm5lZCBpbiB0aGlzIGNhc2UgaW5zdGVhZC4KKyAgICBrTWF5RmFpbCA9IDEgPDwgMCwKKworICAg
IC8vIEJ5IGRlZmF1bHQsIEFsbG9jYXRlKCkgY29tbWl0cyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBp
bW1lZGlhdGVseS4gV2hlbgorICAgIC8vIHRoaXMgZmxhZyBpcyBwcm92aWRlZCwgdGhlIG1lbW9y
eSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgbWF5IG9ubHkgYmUKKyAgICAvLyByZXNlcnZlZCBhbmQg
dGhlIHVzZXIgc2hvdWxkIGNhbGwgRW5zdXJlQ29tbWl0dGVkKCkgYmVmb3JlIHdyaXRpbmcgdG8K
KyAgICAvLyBtZW1vcnkgYWRkcmVzc2VzLgorICAgIGtEb250Q29tbWl0ID0gMSA8PCAxLAorICB9
OworCisgIC8vIEFsbG9jYXRlcyB8c2l6ZXwgYnl0ZXMgdXNpbmcgbW1hcChNQVBfQU5PTllNT1VT
KS4gVGhlIHJldHVybmVkIG1lbW9yeSBpcworICAvLyBndWFyYW50ZWVkIHRvIGJlIHBhZ2UtYWxp
Z25lZCBhbmQgZ3VhcmFudGVlZCB0byBiZSB6ZXJvZWQuIHxzaXplfCBtdXN0IGJlIGEKKyAgLy8g
bXVsdGlwbGUgb2YgNEtCIChhIHBhZ2Ugc2l6ZSkuIEZvciB8ZmxhZ3N8LCBzZWUgdGhlIEFsbG9j
YXRpb25GbGFncyBlbnVtCisgIC8vIGFib3ZlLgorICBzdGF0aWMgUGFnZWRNZW1vcnkgQWxsb2Nh
dGUoc2l6ZV90IHNpemUsIGludCBmbGFncyA9IDApOworCisgIC8vIEhpbnQgdG8gdGhlIE9TIHRo
YXQgdGhlIG1lbW9yeSByYW5nZSBpcyBub3QgbmVlZGVkIGFuZCBjYW4gYmUgZGlzY2FyZGVkLgor
ICAvLyBUaGUgbWVtb3J5IHJlbWFpbnMgYWNjZXNzaWJsZSBhbmQgaXRzIGNvbnRlbnRzIG1heSBi
ZSByZXRhaW5lZCwgb3IgdGhleQorICAvLyBtYXkgYmUgemVyb2VkLiBUaGlzIGZ1bmN0aW9uIG1h
eSBiZSBhIE5PUCBvbiBzb21lIHBsYXRmb3Jtcy4gUmV0dXJucyB0cnVlCisgIC8vIGlmIGltcGxl
bWVudGVkLgorICBib29sIEFkdmlzZURvbnROZWVkKHZvaWQqIHAsIHNpemVfdCBzaXplKTsKKwor
ICAvLyBFbnN1cmVzIHRoYXQgYXQgbGVhc3QgdGhlIGZpcnN0IHxjb21taXR0ZWRfc2l6ZXwgYnl0
ZXMgb2YgdGhlIGFsbG9jYXRlZAorICAvLyBtZW1vcnkgcmVnaW9uIGFyZSBjb21taXR0ZWQuIFRo
ZSBpbXBsZW1lbnRhdGlvbiBtYXkgY29tbWl0IG1lbW9yeSBpbiBsYXJnZXIKKyAgLy8gY2h1bmtz
IGFib3ZlIHxjb21taXR0ZWRfc2l6ZXwuIENyYXNoZXMgaWYgdGhlIG1lbW9yeSBjb3VsZG4ndCBi
ZSBjb21taXR0ZWQuCisjaWYgVFJBQ0tfQ09NTUlUVEVEX1NJWkUoKQorICB2b2lkIEVuc3VyZUNv
bW1pdHRlZChzaXplX3QgY29tbWl0dGVkX3NpemUpOworI2Vsc2UgICAvLyBUUkFDS19DT01NSVRU
RURfU0laRSgpCisgIHZvaWQgRW5zdXJlQ29tbWl0dGVkKHNpemVfdCAvKmNvbW1pdHRlZF9zaXpl
Ki8pIHt9CisjZW5kaWYgIC8vIFRSQUNLX0NPTU1JVFRFRF9TSVpFKCkKKworICBpbmxpbmUgdm9p
ZCogR2V0KCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gcF87IH0KKyAgaW5saW5lIGJvb2wgSXNW
YWxpZCgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICEhcF87IH0KKyAgaW5saW5lIHNpemVfdCBz
aXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gc2l6ZV87IH0KKworIHByaXZhdGU6CisgIFBh
Z2VkTWVtb3J5KGNoYXIqIHAsIHNpemVfdCBzaXplKTsKKworICBQYWdlZE1lbW9yeShjb25zdCBQ
YWdlZE1lbW9yeSYpID0gZGVsZXRlOworICAvLyBEZWZhdWx0ZWQgZm9yIGltcGxlbWVudGF0aW9u
IG9mIG1vdmUgY29uc3RydWN0b3IgKyBhc3NpZ25tZW50LgorICBQYWdlZE1lbW9yeSYgb3BlcmF0
b3I9KGNvbnN0IFBhZ2VkTWVtb3J5JikgPSBkZWZhdWx0OworCisgIGNoYXIqIHBfID0gbnVsbHB0
cjsKKyAgc2l6ZV90IHNpemVfID0gMDsKKworI2lmIFRSQUNLX0NPTU1JVFRFRF9TSVpFKCkKKyAg
c2l6ZV90IGNvbW1pdHRlZF9zaXplXyA9IDB1OworI2VuZGlmICAvLyBUUkFDS19DT01NSVRURURf
U0laRSgpCit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZl
dHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9QQUdFRF9NRU1PUllf
SF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJv
amVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAy
LjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg
aW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5
IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj
ZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBs
YXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRl
ciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lU
SE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNz
IG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFn
ZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGlj
ZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9leHQvYmFzZS9wYWdlZF9tZW1vcnkuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNp
bmNsdWRlIDxjbWF0aD4KKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4p
CisjaW5jbHVkZSA8V2luZG93cy5oPgorI2Vsc2UgIC8vIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJG
RVRUT19PU19XSU4pCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZiAgLy8gUEVSRkVUVE9f
QlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9jb250YWluZXJfYW5ub3RhdGlv
bnMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4
dC9iYXNlL3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7
CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBzaXplX3Qga0d1YXJkU2l6ZSA9IGtQYWdlU2l6
ZTsKKworI2lmIFRSQUNLX0NPTU1JVFRFRF9TSVpFKCkKK2NvbnN0ZXhwciBzaXplX3Qga0NvbW1p
dENodW5rU2l6ZSA9IGtQYWdlU2l6ZSAqIDEwMjQ7ICAvLyA0bUIKKyNlbmRpZiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUUkFDS19DT01NSVRURURf
U0laRSgpCisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK1BhZ2VkTWVtb3J5IFBhZ2Vk
TWVtb3J5OjpBbGxvY2F0ZShzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKSB7CisgIFBFUkZFVFRPX0RD
SEVDSyhzaXplICUga1BhZ2VTaXplID09IDApOworICBzaXplX3Qgb3V0ZXJfc2l6ZSA9IHNpemUg
KyBrR3VhcmRTaXplICogMjsKKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lO
KQorICB2b2lkKiBwdHIgPSBWaXJ0dWFsQWxsb2MobnVsbHB0ciwgb3V0ZXJfc2l6ZSwgTUVNX1JF
U0VSVkUsIFBBR0VfTk9BQ0NFU1MpOworICBpZiAoIXB0ciAmJiAoZmxhZ3MgJiBrTWF5RmFpbCkp
CisgICAgcmV0dXJuIFBhZ2VkTWVtb3J5KCk7CisgIFBFUkZFVFRPX0NIRUNLKHB0cik7CisgIGNo
YXIqIHVzYWJsZV9yZWdpb24gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwdHIpICsga0d1YXJk
U2l6ZTsKKyNlbHNlICAgLy8gUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikKKyAg
dm9pZCogcHRyID0gbW1hcChudWxscHRyLCBvdXRlcl9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dS
SVRFLAorICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEs
IDApOworICBpZiAocHRyID09IE1BUF9GQUlMRUQgJiYgKGZsYWdzICYga01heUZhaWwpKQorICAg
IHJldHVybiBQYWdlZE1lbW9yeSgpOworICBQRVJGRVRUT19DSEVDSyhwdHIgJiYgcHRyICE9IE1B
UF9GQUlMRUQpOworICBjaGFyKiB1c2FibGVfcmVnaW9uID0gcmVpbnRlcnByZXRfY2FzdDxjaGFy
Kj4ocHRyKSArIGtHdWFyZFNpemU7CisgIGludCByZXMgPSBtcHJvdGVjdChwdHIsIGtHdWFyZFNp
emUsIFBST1RfTk9ORSk7CisgIHJlcyB8PSBtcHJvdGVjdCh1c2FibGVfcmVnaW9uICsgc2l6ZSwg
a0d1YXJkU2l6ZSwgUFJPVF9OT05FKTsKKyAgUEVSRkVUVE9fQ0hFQ0socmVzID09IDApOworI2Vu
ZGlmICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorCisgIGF1dG8gbWVt
b3J5ID0gUGFnZWRNZW1vcnkodXNhYmxlX3JlZ2lvbiwgc2l6ZSk7CisjaWYgVFJBQ0tfQ09NTUlU
VEVEX1NJWkUoKQorICBzaXplX3QgaW5pdGlhbF9jb21taXQgPSBzaXplOworICBpZiAoZmxhZ3Mg
JiBrRG9udENvbW1pdCkKKyAgICBpbml0aWFsX2NvbW1pdCA9IHN0ZDo6bWluKGluaXRpYWxfY29t
bWl0LCBrQ29tbWl0Q2h1bmtTaXplKTsKKyAgbWVtb3J5LkVuc3VyZUNvbW1pdHRlZChpbml0aWFs
X2NvbW1pdCk7CisjZW5kaWYgIC8vIFRSQUNLX0NPTU1JVFRFRF9TSVpFKCkKKyAgcmV0dXJuIG1l
bW9yeTsKK30KKworUGFnZWRNZW1vcnk6OlBhZ2VkTWVtb3J5KCkge30KKworLy8gY2xhbmctZm9y
bWF0IG9mZgorUGFnZWRNZW1vcnk6OlBhZ2VkTWVtb3J5KGNoYXIqIHAsIHNpemVfdCBzaXplKSA6
IHBfKHApLCBzaXplXyhzaXplKSB7CisgIEFOTk9UQVRFX05FV19CVUZGRVIocF8sIHNpemVfLCBj
b21taXR0ZWRfc2l6ZV8pCit9CisKK1BhZ2VkTWVtb3J5OjpQYWdlZE1lbW9yeShQYWdlZE1lbW9y
eSYmIG90aGVyKSBub2V4Y2VwdCB7CisgICp0aGlzID0gb3RoZXI7CisgIG90aGVyLnBfID0gbnVs
bHB0cjsKK30KKy8vIGNsYW5nLWZvcm1hdCBvbgorCitQYWdlZE1lbW9yeSYgUGFnZWRNZW1vcnk6
Om9wZXJhdG9yPShQYWdlZE1lbW9yeSYmIG90aGVyKSB7CisgIHRoaXMtPn5QYWdlZE1lbW9yeSgp
OworICBuZXcgKHRoaXMpIFBhZ2VkTWVtb3J5KHN0ZDo6bW92ZShvdGhlcikpOworICByZXR1cm4g
KnRoaXM7Cit9CisKK1BhZ2VkTWVtb3J5Ojp+UGFnZWRNZW1vcnkoKSB7CisgIGlmICghcF8pCisg
ICAgcmV0dXJuOworICBQRVJGRVRUT19DSEVDSyhzaXplXyk7CisgIGNoYXIqIHN0YXJ0ID0gcF8g
LSBrR3VhcmRTaXplOworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisg
IEJPT0wgcmVzID0gVmlydHVhbEZyZWUoc3RhcnQsIDAsIE1FTV9SRUxFQVNFKTsKKyAgUEVSRkVU
VE9fQ0hFQ0socmVzICE9IDApOworI2Vsc2UgICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVU
VE9fT1NfV0lOKQorICBjb25zdCBzaXplX3Qgb3V0ZXJfc2l6ZSA9IHNpemVfICsga0d1YXJkU2l6
ZSAqIDI7CisgIGludCByZXMgPSBtdW5tYXAoc3RhcnQsIG91dGVyX3NpemUpOworICBQRVJGRVRU
T19DSEVDSyhyZXMgPT0gMCk7CisjZW5kaWYgIC8vIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRU
T19PU19XSU4pCisgIEFOTk9UQVRFX0RFTEVURV9CVUZGRVIocF8sIHNpemVfLCBjb21taXR0ZWRf
c2l6ZV8pCit9CisKK2Jvb2wgUGFnZWRNZW1vcnk6OkFkdmlzZURvbnROZWVkKHZvaWQqIHAsIHNp
emVfdCBzaXplKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhwXyk7CisgIFBFUkZFVFRPX0RDSEVDSyhw
ID49IHBfKTsKKyAgUEVSRkVUVE9fRENIRUNLKHN0YXRpY19jYXN0PGNoYXIqPihwKSArIHNpemUg
PD0gcF8gKyBzaXplXyk7CisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikg
fHwgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX05BQ0wpCisgIC8vIERpc2NhcmRpbmcg
cGFnZXMgb24gV2luZG93cyBoYXMgbW9yZSBDUFUgY29zdCB0aGFuIGlzIGp1c3RpZmllZCBmb3Ig
dGhlCisgIC8vIHBvc3NpYmxlIG1lbW9yeSBzYXZpbmdzLgorICByZXR1cm4gZmFsc2U7CisjZWxz
ZSAgIC8vIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pIHx8CisgICAgICAgIC8v
IFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19OQUNMKQorICAvLyBodHRwOi8vbWFuNy5v
cmcvbGludXgvbWFuLXBhZ2VzL21hbjIvbWFkdmlzZS4yLmh0bWwKKyAgaW50IHJlcyA9IG1hZHZp
c2UocCwgc2l6ZSwgTUFEVl9ET05UTkVFRCk7CisgIFBFUkZFVFRPX0RDSEVDSyhyZXMgPT0gMCk7
CisgIHJldHVybiB0cnVlOworI2VuZGlmICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9f
T1NfV0lOKSB8fAorICAgICAgICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTkFD
TCkKK30KKworI2lmIFRSQUNLX0NPTU1JVFRFRF9TSVpFKCkKK3ZvaWQgUGFnZWRNZW1vcnk6OkVu
c3VyZUNvbW1pdHRlZChzaXplX3QgY29tbWl0dGVkX3NpemUpIHsKKyAgUEVSRkVUVE9fRENIRUNL
KGNvbW1pdHRlZF9zaXplID4gMHUpOworICBQRVJGRVRUT19EQ0hFQ0soY29tbWl0dGVkX3NpemUg
PD0gc2l6ZV8pOworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisgIGlm
IChjb21taXR0ZWRfc2l6ZV8gPj0gY29tbWl0dGVkX3NpemUpCisgICAgcmV0dXJuOworICAvLyBS
b3VuZGluZyB1cC4KKyAgc2l6ZV90IGRlbHRhID0gY29tbWl0dGVkX3NpemUgLSBjb21taXR0ZWRf
c2l6ZV87CisgIHNpemVfdCBudW1fYWRkaXRpb25hbF9jaHVua3MgPQorICAgICAgKGRlbHRhICsg
a0NvbW1pdENodW5rU2l6ZSAtIDEpIC8ga0NvbW1pdENodW5rU2l6ZTsKKyAgUEVSRkVUVE9fRENI
RUNLKG51bV9hZGRpdGlvbmFsX2NodW5rcyAqIGtDb21taXRDaHVua1NpemUgPj0gZGVsdGEpOwor
ICAvLyBEb24ndCBjb21taXQgbW9yZSB0aGFuIHRoZSB0b3RhbCBzaXplLgorICBzaXplX3QgY29t
bWl0X3NpemUgPSBzdGQ6Om1pbihudW1fYWRkaXRpb25hbF9jaHVua3MgKiBrQ29tbWl0Q2h1bmtT
aXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXyAtIGNvbW1pdHRlZF9z
aXplXyk7CisgIHZvaWQqIHJlcyA9IFZpcnR1YWxBbGxvYyhwXyArIGNvbW1pdHRlZF9zaXplXywg
Y29tbWl0X3NpemUsIE1FTV9DT01NSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdF
X1JFQURXUklURSk7CisgIFBFUkZFVFRPX0NIRUNLKHJlcyk7CisgIEFOTk9UQVRFX0NIQU5HRV9T
SVpFKHBfLCBzaXplXywgY29tbWl0dGVkX3NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICBj
b21taXR0ZWRfc2l6ZV8gKyBjb21taXRfc2l6ZSkKKyAgY29tbWl0dGVkX3NpemVfICs9IGNvbW1p
dF9zaXplOworI2Vsc2UgICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQor
ICAvLyBtbWFwIGNvbW1pdHMgYXV0b21hdGljYWxseSBhcyBuZWVkZWQsIHNvIHdlIG9ubHkgdHJh
Y2sgaGVyZSBmb3IgQVNBTi4KKyAgY29tbWl0dGVkX3NpemUgPSBzdGQ6Om1heChjb21taXR0ZWRf
c2l6ZV8sIGNvbW1pdHRlZF9zaXplKTsKKyAgQU5OT1RBVEVfQ0hBTkdFX1NJWkUocF8sIHNpemVf
LCBjb21taXR0ZWRfc2l6ZV8sIGNvbW1pdHRlZF9zaXplKQorICBjb21taXR0ZWRfc2l6ZV8gPSBj
b21taXR0ZWRfc2l6ZTsKKyNlbmRpZiAgLy8gUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09T
X1dJTikKK30KKyNlbmRpZiAgLy8gVFJBQ0tfQ09NTUlUVEVEX1NJWkUoKQorCit9ICAvLyBuYW1l
c3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gc291cmNlOiBzcmMvYmFzZS9zdHJpbmdfc3BsaXR0ZXIuY2MKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L2Jhc2Uvc3RyaW5nX3NwbGl0
dGVyLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2Ug
UHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lv
biAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcv
bGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJs
ZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1
bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICog
V0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHBy
ZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5n
dWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUg
TGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfU1RSSU5H
X1NQTElUVEVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfU1RSSU5HX1NQ
TElUVEVSX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBwZXJmZXR0byB7Citu
YW1lc3BhY2UgYmFzZSB7CisKKy8vIEMrKyB2ZXJzaW9uIG9mIHN0cnRvaygpLiBTcGxpdHMgYSBz
dHJpbmcgd2l0aG91dCBtYWtpbmcgY29waWVzIG9yIGFueSBoZWFwCisvLyBhbGxvY2F0aW9ucy4g
RGVzdHJ1Y3RzIHRoZSBvcmlnaW5hbCBzdHJpbmcgcGFzc2VkIGluIGlucHV0LgorLy8gU3VwcG9y
dHMgdGhlIHNwZWNpYWwgY2FzZSBvZiB1c2luZyBcMCBhcyBhIGRlbGltaXRlci4KKy8vIFRoZSB0
b2tlbiByZXR1cm5lZCBpbiBvdXRwdXQgYXJlIHZhbGlkIGFzIGxvbmcgYXMgdGhlIGlucHV0IHN0
cmluZyBpcyB2YWxpZC4KK2NsYXNzIFN0cmluZ1NwbGl0dGVyIHsKKyBwdWJsaWM6CisgIC8vIENh
biB0YWtlIG93bmVyc2hpcCBvZiB0aGUgc3RyaW5nIGlmIHBhc3NlZCB2aWEgc3RkOjptb3ZlKCks
IGUuZy46CisgIC8vIFN0cmluZ1NwbGl0dGVyKHN0ZDo6bW92ZShzdHIpLCAnXG4nKTsKKyAgU3Ry
aW5nU3BsaXR0ZXIoc3RkOjpzdHJpbmcsIGNoYXIgZGVsaW1pdGVyKTsKKworICAvLyBTcGxpdHMg
YSBDLXN0cmluZy4gVGhlIGlucHV0IHN0cmluZyB3aWxsIGJlIGZvcmNlZnVsbHkgbnVsbC10ZXJt
aW5hdGVkIChzbworICAvLyBzdHJbc2l6ZSAtIDFdIHNob3VsZCBiZSA9PSAnXDAnIG9yIHRoZSBs
YXN0IGNoYXIgd2lsbCBiZSB0cnVuY2F0ZWQpLgorICBTdHJpbmdTcGxpdHRlcihjaGFyKiBzdHIs
IHNpemVfdCBzaXplLCBjaGFyIGRlbGltaXRlcik7CisKKyAgLy8gU3BsaXRzIHRoZSBjdXJyZW50
IHRva2VuIGZyb20gYW4gb3V0ZXIgU3RyaW5nU3BsaXR0ZXIgaW5zdGFuY2UuIFRoaXMgaXMgdG8K
KyAgLy8gY2hhaW4gc3BsaXR0ZXJzIGFzIGZvbGxvd3M6CisgIC8vIGZvciAoYmFzZTo6U3RyaW5n
U3BsaXR0ZXIgbGluZXMoeCwgJ1xuJyk7IHNzLk5leHQoKTspCisgIC8vICAgZm9yIChiYXNlOjpT
dHJpbmdTcGxpdHRlciB3b3JkcygmbGluZXMsICcgJyk7IHdvcmRzLk5leHQoKTspCisgIFN0cmlu
Z1NwbGl0dGVyKFN0cmluZ1NwbGl0dGVyKiwgY2hhciBkZWxpbWl0ZXIpOworCisgIC8vIFJldHVy
bnMgdHJ1ZSBpZiBhIHRva2VuIGlzIGZvdW5kIChpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgc3Rv
cmVkIGluCisgIC8vIGN1cl90b2tlbigpKSwgZmFsc2UgaWYgbm8gbW9yZSB0b2tlbnMgYXJlIGZv
dW5kLgorICBib29sIE5leHQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRva2VuIGlm
ZiBsYXN0IGNhbGwgdG8gTmV4dCgpIHJldHVybmVkIHRydWUuIEluIHRoaXMKKyAgLy8gY2FzZSBp
dCBndWFyYW50ZWVzIHRoYXQgdGhlIHJldHVybmVkIHN0cmluZyBpcyBhbHdheXMgbnVsbCB0ZXJt
aW5hdGVkLgorICAvLyBJbiBhbGwgb3RoZXIgY2FzZXMgKGJlZm9yZSB0aGUgMXN0IGNhbGwgdG8g
TmV4dCgpIGFuZCBhZnRlciBOZXh0KCkgcmV0dXJucworICAvLyBmYWxzZSkgcmV0dXJucyBudWxs
cHRyLgorICBjaGFyKiBjdXJfdG9rZW4oKSB7IHJldHVybiBjdXJfOyB9CisKKyAgLy8gUmV0dXJu
cyB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRva2VuIChleGNsdWRpbmcgdGhlIG51bGwgdGVy
bWluYXRvcikuCisgIHNpemVfdCBjdXJfdG9rZW5fc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGN1cl9z
aXplXzsgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nU3BsaXR0ZXIoY29uc3QgU3RyaW5nU3BsaXR0
ZXImKSA9IGRlbGV0ZTsKKyAgU3RyaW5nU3BsaXR0ZXImIG9wZXJhdG9yPShjb25zdCBTdHJpbmdT
cGxpdHRlciYpID0gZGVsZXRlOworICB2b2lkIEluaXRpYWxpemUoY2hhciogc3RyLCBzaXplX3Qg
c2l6ZSk7CisKKyAgc3RkOjpzdHJpbmcgc3RyXzsKKyAgY2hhciogY3VyXzsKKyAgc2l6ZV90IGN1
cl9zaXplXzsKKyAgY2hhciogbmV4dF87CisgIGNoYXIqIGVuZF87ICAvLyBTVEwtc3R5bGUsIHBv
aW50cyBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyLgorICBjb25zdCBjaGFyIGRlbGltaXRlcl87Cit9
OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNl
bmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9TVFJJTkdfU1BMSVRURVJfSF8KKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAor
ICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo
ZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29t
cGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRo
ZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMv
TElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3Ig
YWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUg
TGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBX
QVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGlt
cGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zl
cm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K
KyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9l
eHQvYmFzZS9zdHJpbmdfc3BsaXR0ZXIuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5o
IgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCitTdHJpbmdTcGxp
dHRlcjo6U3RyaW5nU3BsaXR0ZXIoc3RkOjpzdHJpbmcgc3RyLCBjaGFyIGRlbGltaXRlcikKKyAg
ICA6IHN0cl8oc3RkOjptb3ZlKHN0cikpLCBkZWxpbWl0ZXJfKGRlbGltaXRlcikgeworICAvLyBJ
dCdzIGxlZ2FsIHRvIGFjY2VzcyBzdHJbc3RyLnNpemUoKV0gaW4gQysrMTEgKGl0IGFsd2F5cyBy
ZXR1cm5zIFwwKSwKKyAgLy8gaGVuY2UgdGhlICsxICh3aGljaCBiZWNvbWVzIGp1c3Qgc2l6ZSgp
IGFmdGVyIHRoZSAtMSBpbiBJbml0aWFsaXplKCkpLgorICBJbml0aWFsaXplKCZzdHJfWzBdLCBz
dHJfLnNpemUoKSArIDEpOworfQorCitTdHJpbmdTcGxpdHRlcjo6U3RyaW5nU3BsaXR0ZXIoY2hh
ciogc3RyLCBzaXplX3Qgc2l6ZSwgY2hhciBkZWxpbWl0ZXIpCisgICAgOiBkZWxpbWl0ZXJfKGRl
bGltaXRlcikgeworICBJbml0aWFsaXplKHN0ciwgc2l6ZSk7Cit9CisKK1N0cmluZ1NwbGl0dGVy
OjpTdHJpbmdTcGxpdHRlcihTdHJpbmdTcGxpdHRlciogb3V0ZXIsIGNoYXIgZGVsaW1pdGVyKQor
ICAgIDogZGVsaW1pdGVyXyhkZWxpbWl0ZXIpIHsKKyAgSW5pdGlhbGl6ZShvdXRlci0+Y3VyX3Rv
a2VuKCksIG91dGVyLT5jdXJfdG9rZW5fc2l6ZSgpICsgMSk7Cit9CisKK3ZvaWQgU3RyaW5nU3Bs
aXR0ZXI6OkluaXRpYWxpemUoY2hhciogc3RyLCBzaXplX3Qgc2l6ZSkgeworICBQRVJGRVRUT19E
Q0hFQ0soIXNpemUgfHwgc3RyKTsKKyAgbmV4dF8gPSBzdHI7CisgIGVuZF8gPSBzdHIgKyBzaXpl
OworICBjdXJfID0gbnVsbHB0cjsKKyAgY3VyX3NpemVfID0gMDsKKyAgaWYgKHNpemUpCisgICAg
bmV4dF9bc2l6ZSAtIDFdID0gJ1wwJzsKK30KKworYm9vbCBTdHJpbmdTcGxpdHRlcjo6TmV4dCgp
IHsKKyAgZm9yICg7IG5leHRfIDwgZW5kXzsgbmV4dF8rKykgeworICAgIGlmICgqbmV4dF8gPT0g
ZGVsaW1pdGVyXykKKyAgICAgIGNvbnRpbnVlOworICAgIGN1cl8gPSBuZXh0XzsKKyAgICBmb3Ig
KDs7IG5leHRfKyspIHsKKyAgICAgIGlmICgqbmV4dF8gPT0gZGVsaW1pdGVyXykgeworICAgICAg
ICBjdXJfc2l6ZV8gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG5leHRfIC0gY3VyXyk7CisgICAgICAg
ICoobmV4dF8rKykgPSAnXDAnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICgq
bmV4dF8gPT0gJ1wwJykgeworICAgICAgICBjdXJfc2l6ZV8gPSBzdGF0aWNfY2FzdDxzaXplX3Q+
KG5leHRfIC0gY3VyXyk7CisgICAgICAgIG5leHRfID0gZW5kXzsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICB9CisgICAgfQorICAgIGlmICgqY3VyXykKKyAgICAgIHJldHVybiB0cnVlOworICAgIGJy
ZWFrOworICB9CisgIGN1cl8gPSBudWxscHRyOworICBjdXJfc2l6ZV8gPSAwOworICByZXR1cm4g
ZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9iYXNlL3N0cmluZ191dGls
cy5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9l
eHQvYmFzZS9zdHJpbmdfdXRpbHMuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjog
aW5jbHVkZS9wZXJmZXR0by9leHQvYmFzZS9vcHRpb25hbC5oCisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1
bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAq
IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUg
TGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoK
KyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgor
ICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0
aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJp
YnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05E
SVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRo
ZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25z
IGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJ
TkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX09QVElPTkFMX0hfCisjZGVmaW5lIElOQ0xVREVfUEVS
RkVUVE9fRVhUX0JBU0VfT1BUSU9OQUxfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5j
bHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIFNwZWNpZmljYXRpb246Cisv
LyBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC91dGlsaXR5L29wdGlvbmFsL2luX3Bs
YWNlX3QKK3N0cnVjdCBpbl9wbGFjZV90IHt9OworCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0
cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvdXRpbGl0eS9vcHRpb25hbC9udWxsb3B0X3QK
K3N0cnVjdCBudWxsb3B0X3QgeworICBjb25zdGV4cHIgZXhwbGljaXQgbnVsbG9wdF90KGludCkg
e30KK307CisKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNv
bS93L2NwcC91dGlsaXR5L29wdGlvbmFsL2luX3BsYWNlCitjb25zdGV4cHIgaW5fcGxhY2VfdCBp
bl9wbGFjZSA9IHt9OworCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL2VuLmNwcHJlZmVy
ZW5jZS5jb20vdy9jcHAvdXRpbGl0eS9vcHRpb25hbC9udWxsb3B0Citjb25zdGV4cHIgbnVsbG9w
dF90IG51bGxvcHQoMCk7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24sIHdoaWNoIGlzIHJlZmVy
cmVkIGJ5IGZvbGxvd2luZyBoZWxwZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBP
cHRpb25hbDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQs
IGJvb2wgPSBzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8VD46OnZhbHVlPgorc3RydWN0
IE9wdGlvbmFsU3RvcmFnZUJhc2UgeworICAvLyBJbml0aWFsaXppbmcgfGVtcHR5X3wgaGVyZSBp
bnN0ZWFkIG9mIHVzaW5nIGRlZmF1bHQgbWVtYmVyIGluaXRpYWxpemluZworICAvLyB0byBhdm9p
ZCBlcnJvcnMgaW4gZysrIDQuOC4KKyAgY29uc3RleHByIE9wdGlvbmFsU3RvcmFnZUJhc2UoKSA6
IGVtcHR5XygnXDAnKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICBjb25zdGV4
cHIgZXhwbGljaXQgT3B0aW9uYWxTdG9yYWdlQmFzZShpbl9wbGFjZV90LCBBcmdzJiYuLi4gYXJn
cykKKyAgICAgIDogaXNfcG9wdWxhdGVkXyh0cnVlKSwgdmFsdWVfKHN0ZDo6Zm9yd2FyZDxBcmdz
PihhcmdzKS4uLikge30KKworICAvLyBXaGVuIFQgaXMgbm90IHRyaXZpYWxseSBkZXN0cnVjdGli
bGUgd2UgbXVzdCBjYWxsIGl0cworICAvLyBkZXN0cnVjdG9yIGJlZm9yZSBkZWFsbG9jYXRpbmcg
aXRzIG1lbW9yeS4KKyAgLy8gTm90ZSB0aGF0IHRoaXMgaGlkZXMgdGhlIChpbXBsaWNpdGx5IGRl
Y2xhcmVkKSBtb3ZlIGNvbnN0cnVjdG9yLCB3aGljaAorICAvLyB3b3VsZCBiZSB1c2VkIGZvciBj
b25zdGV4cHIgbW92ZSBjb25zdHJ1Y3RvciBpbiBPcHRpb25hbFN0b3JhZ2U8VD4uCisgIC8vIEl0
IGlzIG5lZWRlZCBpZmYgVCBpcyB0cml2aWFsbHkgbW92ZSBjb25zdHJ1Y3RpYmxlLiBIb3dldmVy
LCB0aGUgY3VycmVudAorICAvLyBpc190cml2aWFsbHlfe2NvcHksbW92ZX1fY29uc3RydWN0aWJs
ZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcworICAvLyBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxl
ICh3aGljaCBsb29rcyBhIGJ1ZywgY2Y6CisgIC8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemls
bGEvc2hvd19idWcuY2dpP2lkPTUxNDUyIGFuZAorICAvLyBodHRwOi8vY3BsdXNwbHVzLmdpdGh1
Yi5pby9MV0cvbHdnLWFjdGl2ZS5odG1sIzIxMTYpLCBzbyBpdCBpcyBub3QKKyAgLy8gbmVjZXNz
YXJ5IGZvciB0aGlzIGNhc2UgYXQgdGhlIG1vbWVudC4gUGxlYXNlIHNlZSBhbHNvIHRoZSBkZXN0
cnVjdG9yCisgIC8vIGNvbW1lbnQgaW4gImlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGUgPSB0cnVl
IiBzcGVjaWFsaXphdGlvbiBiZWxvdy4KKyAgfk9wdGlvbmFsU3RvcmFnZUJhc2UoKSB7CisgICAg
aWYgKGlzX3BvcHVsYXRlZF8pCisgICAgICB2YWx1ZV8uflQoKTsKKyAgfQorCisgIHRlbXBsYXRl
IDxjbGFzcy4uLiBBcmdzPgorICB2b2lkIEluaXQoQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBQRVJG
RVRUT19EQ0hFQ0soIWlzX3BvcHVsYXRlZF8pOworICAgIDo6bmV3ICgmdmFsdWVfKSBUKHN0ZDo6
Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgaXNfcG9wdWxhdGVkXyA9IHRydWU7CisgIH0K
KworICBib29sIGlzX3BvcHVsYXRlZF8gPSBmYWxzZTsKKyAgdW5pb24geworICAgIC8vIHxlbXB0
eV98IGV4aXN0cyBzbyB0aGF0IHRoZSB1bmlvbiB3aWxsIGFsd2F5cyBiZSBpbml0aWFsaXplZCwg
ZXZlbiB3aGVuCisgICAgLy8gaXQgZG9lc24ndCBjb250YWluIGEgdmFsdWUuIFVuaW9uIG1lbWJl
cnMgbXVzdCBiZSBpbml0aWFsaXplZCBmb3IgdGhlCisgICAgLy8gY29uc3RydWN0b3IgdG8gYmUg
J2NvbnN0ZXhwcicuCisgICAgY2hhciBlbXB0eV87CisgICAgVCB2YWx1ZV87CisgIH07Cit9Owor
Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBPcHRpb25hbFN0b3JhZ2VCYXNlPFQsIHRy
dWUgLyogdHJpdmlhbGx5IGRlc3RydWN0aWJsZSAqLz4geworICAvLyBJbml0aWFsaXppbmcgfGVt
cHR5X3wgaGVyZSBpbnN0ZWFkIG9mIHVzaW5nIGRlZmF1bHQgbWVtYmVyIGluaXRpYWxpemluZwor
ICAvLyB0byBhdm9pZCBlcnJvcnMgaW4gZysrIDQuOC4KKyAgY29uc3RleHByIE9wdGlvbmFsU3Rv
cmFnZUJhc2UoKSA6IGVtcHR5XygnXDAnKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdz
PgorICBjb25zdGV4cHIgZXhwbGljaXQgT3B0aW9uYWxTdG9yYWdlQmFzZShpbl9wbGFjZV90LCBB
cmdzJiYuLi4gYXJncykKKyAgICAgIDogaXNfcG9wdWxhdGVkXyh0cnVlKSwgdmFsdWVfKHN0ZDo6
Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikge30KKworICAvLyBXaGVuIFQgaXMgdHJpdmlhbGx5IGRl
c3RydWN0aWJsZSAoaS5lLiBpdHMgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcpIHRoZXJlCisgIC8v
IGlzIG5vIG5lZWQgdG8gY2FsbCBpdC4gSW1wbGljaXRseSBkZWZpbmVkIGRlc3RydWN0b3IgaXMg
dHJpdmlhbCwgYmVjYXVzZQorICAvLyBib3RoIG1lbWJlcnMgKGJvb2wgYW5kIHVuaW9uIGNvbnRh
aW5pbmcgb25seSB2YXJpYW50cyB3aGljaCBhcmUgdHJpdmlhbGx5CisgIC8vIGRlc3RydWN0aWJs
ZSkgYXJlIHRyaXZpYWxseSBkZXN0cnVjdGlibGUuCisgIC8vIEV4cGxpY2l0bHktZGVmYXVsdGVk
IGRlc3RydWN0b3IgaXMgYWxzbyB0cml2aWFsLCBidXQgZG8gbm90IHVzZSBpdCBoZXJlLAorICAv
LyBiZWNhdXNlIGl0IGhpZGVzIHRoZSBpbXBsaWNpdCBtb3ZlIGNvbnN0cnVjdG9yLiBJdCBpcyBu
ZWVkZWQgdG8gaW1wbGVtZW50CisgIC8vIGNvbnN0ZXhwciBtb3ZlIGNvbnN0cnVjdG9yIGluIE9w
dGlvbmFsU3RvcmFnZSBpZmYgVCBpcyB0cml2aWFsbHkgbW92ZQorICAvLyBjb25zdHJ1Y3RpYmxl
LiBOb3RlIHRoYXQsIGlmIFQgaXMgdHJpdmlhbGx5IG1vdmUgY29uc3RydWN0aWJsZSwgdGhlIG1v
dmUKKyAgLy8gY29uc3RydWN0b3Igb2YgT3B0aW9uYWxTdG9yYWdlQmFzZTxUPiBpcyBhbHNvIGlt
cGxpY2l0bHkgZGVmaW5lZCBhbmQgaXQgaXMKKyAgLy8gdHJpdmlhbGx5IG1vdmUgY29uc3RydWN0
b3IuIElmIFQgaXMgbm90IHRyaXZpYWxseSBtb3ZlIGNvbnN0cnVjdGlibGUsCisgIC8vICJub3Qg
ZGVjbGFyaW5nIG1vdmUgY29uc3RydWN0b3Igd2l0aG91dCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9u
IiBoZXJlIG1lYW5zCisgIC8vICJkZWxldGUgbW92ZSBjb25zdHJ1Y3RvciIsIHdoaWNoIHdvcmtz
IGJlY2F1c2UgYW55IG1vdmUgY29uc3RydWN0b3Igb2YKKyAgLy8gT3B0aW9uYWxTdG9yYWdlIHdp
bGwgbm90IHJlZmVyIHRvIGl0IGluIHRoYXQgY2FzZS4KKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4g
QXJncz4KKyAgdm9pZCBJbml0KEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgUEVSRkVUVE9fRENIRUNL
KCFpc19wb3B1bGF0ZWRfKTsKKyAgICA6Om5ldyAoJnZhbHVlXykgVChzdGQ6OmZvcndhcmQ8QXJn
cz4oYXJncykuLi4pOworICAgIGlzX3BvcHVsYXRlZF8gPSB0cnVlOworICB9CisKKyAgYm9vbCBp
c19wb3B1bGF0ZWRfID0gZmFsc2U7CisgIHVuaW9uIHsKKyAgICAvLyB8ZW1wdHlffCBleGlzdHMg
c28gdGhhdCB0aGUgdW5pb24gd2lsbCBhbHdheXMgYmUgaW5pdGlhbGl6ZWQsIGV2ZW4gd2hlbgor
ICAgIC8vIGl0IGRvZXNuJ3QgY29udGFpbiBhIHZhbHVlLiBVbmlvbiBtZW1iZXJzIG11c3QgYmUg
aW5pdGlhbGl6ZWQgZm9yIHRoZQorICAgIC8vIGNvbnN0cnVjdG9yIHRvIGJlICdjb25zdGV4cHIn
LgorICAgIGNoYXIgZW1wdHlfOworICAgIFQgdmFsdWVfOworICB9OworfTsKKworLy8gSW1wbGVt
ZW50IGNvbmRpdGlvbmFsIGNvbnN0ZXhwciBjb3B5IGFuZCBtb3ZlIGNvbnN0cnVjdG9ycy4gVGhl
c2UgYXJlCisvLyBjb25zdGV4cHIgaWYgaXNfdHJpdmlhbGx5X3tjb3B5LG1vdmV9X2NvbnN0cnVj
dGlibGU8VD46OnZhbHVlIGlzIHRydWUKKy8vIHJlc3BlY3RpdmVseS4gSWYgZWFjaCBpcyB0cnVl
LCB0aGUgY29ycmVzcG9uZGluZyBjb25zdHJ1Y3RvciBpcyBkZWZpbmVkIGFzCisvLyAiPSBkZWZh
dWx0OyIsIHdoaWNoIGdlbmVyYXRlcyBhIGNvbnN0ZXhwciBjb25zdHJ1Y3RvciAoSW4gdGhpcyBj
YXNlLAorLy8gdGhlIGNvbmRpdGlvbiBvZiBjb25zdGV4cHItbmVzcyBpcyBzYXRpc2ZpZWQgYmVj
YXVzZSB0aGUgYmFzZSBjbGFzcyBhbHNvIGhhcworLy8gY29tcGlsZXIgZ2VuZXJhdGVkIGNvbnN0
ZXhwciB7Y29weSxtb3ZlfSBjb25zdHJ1Y3RvcnMpLiBOb3RlIHRoYXQKKy8vIHBsYWNlbWVudC1u
ZXcgaXMgcHJvaGliaXRlZCBpbiBjb25zdGV4cHIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9v
bCA9IHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlfY29uc3RydWN0aWJsZTxUPjo6dmFsdWU+CitzdHJ1
Y3QgT3B0aW9uYWxTdG9yYWdlIDogT3B0aW9uYWxTdG9yYWdlQmFzZTxUPiB7CisgIC8vIFRoaXMg
aXMgbm8gdHJpdmlhbGx5IHtjb3B5LG1vdmV9IGNvbnN0cnVjdGlibGUgY2FzZS4gT3RoZXIgY2Fz
ZXMgYXJlCisgIC8vIGRlZmluZWQgYmVsb3cgYXMgc3BlY2lhbGl6YXRpb25zLgorCisgIC8vIEFj
Y2Vzc2luZyB0aGUgbWVtYmVycyBvZiB0ZW1wbGF0ZSBiYXNlIGNsYXNzIHJlcXVpcmVzIGV4cGxp
Y2l0CisgIC8vIGRlY2xhcmF0aW9uLgorICB1c2luZyBPcHRpb25hbFN0b3JhZ2VCYXNlPFQ+Ojpp
c19wb3B1bGF0ZWRfOworICB1c2luZyBPcHRpb25hbFN0b3JhZ2VCYXNlPFQ+Ojp2YWx1ZV87Cisg
IHVzaW5nIE9wdGlvbmFsU3RvcmFnZUJhc2U8VD46OkluaXQ7CisKKyAgLy8gSW5oZXJpdCBjb25z
dHJ1Y3RvcnMgKHNwZWNpZmljYWxseSwgdGhlIGluX3BsYWNlIGNvbnN0cnVjdG9yKS4KKyAgdXNp
bmcgT3B0aW9uYWxTdG9yYWdlQmFzZTxUPjo6T3B0aW9uYWxTdG9yYWdlQmFzZTsKKworICAvLyBV
c2VyIGRlZmluZWQgY29uc3RydWN0b3IgZGVsZXRlcyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4K
KyAgLy8gRGVmaW5lIGl0IGV4cGxpY2l0bHkuCisgIE9wdGlvbmFsU3RvcmFnZSgpID0gZGVmYXVs
dDsKKworICBPcHRpb25hbFN0b3JhZ2UoY29uc3QgT3B0aW9uYWxTdG9yYWdlJiBvdGhlcikgOiBP
cHRpb25hbFN0b3JhZ2VCYXNlPFQ+KCkgeworICAgIGlmIChvdGhlci5pc19wb3B1bGF0ZWRfKQor
ICAgICAgSW5pdChvdGhlci52YWx1ZV8pOworICB9CisKKyAgT3B0aW9uYWxTdG9yYWdlKE9wdGlv
bmFsU3RvcmFnZSYmIG90aGVyKSBub2V4Y2VwdCgKKyAgICAgIHN0ZDo6aXNfbm90aHJvd19tb3Zl
X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlKSB7CisgICAgaWYgKG90aGVyLmlzX3BvcHVsYXRlZF8p
CisgICAgICBJbml0KHN0ZDo6bW92ZShvdGhlci52YWx1ZV8pKTsKKyAgfQorfTsKKwordGVtcGxh
dGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgT3B0aW9uYWxTdG9yYWdlPFQsIHRydWUgLyogdHJpdmlh
bGx5IGNvcHkgY29uc3RydWN0aWJsZSAqLz4KKyAgICA6IE9wdGlvbmFsU3RvcmFnZUJhc2U8VD4g
eworICB1c2luZyBPcHRpb25hbFN0b3JhZ2VCYXNlPFQ+Ojppc19wb3B1bGF0ZWRfOworICB1c2lu
ZyBPcHRpb25hbFN0b3JhZ2VCYXNlPFQ+Ojp2YWx1ZV87CisgIHVzaW5nIE9wdGlvbmFsU3RvcmFn
ZUJhc2U8VD46OkluaXQ7CisgIHVzaW5nIE9wdGlvbmFsU3RvcmFnZUJhc2U8VD46Ok9wdGlvbmFs
U3RvcmFnZUJhc2U7CisKKyAgT3B0aW9uYWxTdG9yYWdlKCkgPSBkZWZhdWx0OworICBPcHRpb25h
bFN0b3JhZ2UoY29uc3QgT3B0aW9uYWxTdG9yYWdlJiBvdGhlcikgPSBkZWZhdWx0OworCisgIE9w
dGlvbmFsU3RvcmFnZShPcHRpb25hbFN0b3JhZ2UmJiBvdGhlcikgbm9leGNlcHQoCisgICAgICBz
dGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSkgeworICAgIGlmIChv
dGhlci5pc19wb3B1bGF0ZWRfKQorICAgICAgSW5pdChzdGQ6Om1vdmUob3RoZXIudmFsdWVfKSk7
CisgIH0KK307CisKKy8vIEJhc2UgY2xhc3MgdG8gc3VwcG9ydCBjb25kaXRpb25hbGx5IHVzYWJs
ZSBjb3B5LS9tb3ZlLSBjb25zdHJ1Y3RvcnMKKy8vIGFuZCBhc3NpZ24gb3BlcmF0b3JzLgordGVt
cGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBPcHRpb25hbEJhc2UgeworICAvLyBUaGlzIGNsYXNz
IHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHB1YmxpYyBBUEksIHNvIGV2ZXJ5
dGhpbmcKKyAgLy8gc2hvdWxkIGJlIGhpZGRlbi4gT2Z0ZW4gd2UgdXNlIGNvbXBvc2l0aW9uLCBi
dXQgd2UgY2Fubm90IGluIHRoaXMgY2FzZQorICAvLyBiZWNhdXNlIG9mIEMrKyBsYW5ndWFnZSBy
ZXN0cmljdGlvbi4KKyBwcm90ZWN0ZWQ6CisgIGNvbnN0ZXhwciBPcHRpb25hbEJhc2UoKSA9IGRl
ZmF1bHQ7CisgIGNvbnN0ZXhwciBPcHRpb25hbEJhc2UoY29uc3QgT3B0aW9uYWxCYXNlJiBvdGhl
cikgPSBkZWZhdWx0OworICBjb25zdGV4cHIgT3B0aW9uYWxCYXNlKE9wdGlvbmFsQmFzZSYmIG90
aGVyKSA9IGRlZmF1bHQ7CisKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgIGNvbnN0ZXhw
ciBleHBsaWNpdCBPcHRpb25hbEJhc2UoaW5fcGxhY2VfdCwgQXJncyYmLi4uIGFyZ3MpCisgICAg
ICA6IHN0b3JhZ2VfKGluX3BsYWNlLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIHt9CisK
KyAgLy8gSW1wbGVtZW50YXRpb24gb2YgY29udmVydGluZyBjb25zdHJ1Y3RvcnMuCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBVPgorICBleHBsaWNpdCBPcHRpb25hbEJhc2UoY29uc3QgT3B0aW9uYWxC
YXNlPFU+JiBvdGhlcikgeworICAgIGlmIChvdGhlci5zdG9yYWdlXy5pc19wb3B1bGF0ZWRfKQor
ICAgICAgc3RvcmFnZV8uSW5pdChvdGhlci5zdG9yYWdlXy52YWx1ZV8pOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFU+CisgIGV4cGxpY2l0IE9wdGlvbmFsQmFzZShPcHRpb25hbEJhc2U8
VT4mJiBvdGhlcikgeworICAgIGlmIChvdGhlci5zdG9yYWdlXy5pc19wb3B1bGF0ZWRfKQorICAg
ICAgc3RvcmFnZV8uSW5pdChzdGQ6Om1vdmUob3RoZXIuc3RvcmFnZV8udmFsdWVfKSk7CisgIH0K
KworICB+T3B0aW9uYWxCYXNlKCkgPSBkZWZhdWx0OworCisgIE9wdGlvbmFsQmFzZSYgb3BlcmF0
b3I9KGNvbnN0IE9wdGlvbmFsQmFzZSYgb3RoZXIpIHsKKyAgICBDb3B5QXNzaWduKG90aGVyKTsK
KyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBPcHRpb25hbEJhc2UmIG9wZXJhdG9yPShPcHRp
b25hbEJhc2UmJiBvdGhlcikgbm9leGNlcHQoCisgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9h
c3NpZ25hYmxlPFQ+Ojp2YWx1ZSYmCisgICAgICAgICAgc3RkOjppc19ub3Rocm93X21vdmVfY29u
c3RydWN0aWJsZTxUPjo6dmFsdWUpIHsKKyAgICBNb3ZlQXNzaWduKHN0ZDo6bW92ZShvdGhlcikp
OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICB2
b2lkIENvcHlBc3NpZ24oY29uc3QgT3B0aW9uYWxCYXNlPFU+JiBvdGhlcikgeworICAgIGlmIChv
dGhlci5zdG9yYWdlXy5pc19wb3B1bGF0ZWRfKQorICAgICAgSW5pdE9yQXNzaWduKG90aGVyLnN0
b3JhZ2VfLnZhbHVlXyk7CisgICAgZWxzZQorICAgICAgRnJlZUlmTmVlZGVkKCk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgdm9pZCBNb3ZlQXNzaWduKE9wdGlvbmFsQmFzZTxV
PiYmIG90aGVyKSB7CisgICAgaWYgKG90aGVyLnN0b3JhZ2VfLmlzX3BvcHVsYXRlZF8pCisgICAg
ICBJbml0T3JBc3NpZ24oc3RkOjptb3ZlKG90aGVyLnN0b3JhZ2VfLnZhbHVlXykpOworICAgIGVs
c2UKKyAgICAgIEZyZWVJZk5lZWRlZCgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+
CisgIHZvaWQgSW5pdE9yQXNzaWduKFUmJiB2YWx1ZSkgeworICAgIGlmIChzdG9yYWdlXy5pc19w
b3B1bGF0ZWRfKQorICAgICAgc3RvcmFnZV8udmFsdWVfID0gc3RkOjpmb3J3YXJkPFU+KHZhbHVl
KTsKKyAgICBlbHNlCisgICAgICBzdG9yYWdlXy5Jbml0KHN0ZDo6Zm9yd2FyZDxVPih2YWx1ZSkp
OworICB9CisKKyAgdm9pZCBGcmVlSWZOZWVkZWQoKSB7CisgICAgaWYgKCFzdG9yYWdlXy5pc19w
b3B1bGF0ZWRfKQorICAgICAgcmV0dXJuOworICAgIHN0b3JhZ2VfLnZhbHVlXy5+VCgpOworICAg
IHN0b3JhZ2VfLmlzX3BvcHVsYXRlZF8gPSBmYWxzZTsKKyAgfQorCisgIC8vIEZvciBpbXBsZW1l
bnRpbmcgY29udmVyc2lvbiwgYWxsb3cgYWNjZXNzIHRvIG90aGVyIHR5cGVkIE9wdGlvbmFsQmFz
ZQorICAvLyBjbGFzcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGZyaWVuZCBjbGFzcyBP
cHRpb25hbEJhc2U7CisKKyAgT3B0aW9uYWxTdG9yYWdlPFQ+IHN0b3JhZ2VfOworfTsKKworLy8g
VGhlIGZvbGxvd2luZyB7Q29weSxNb3ZlfXtDb25zdHJ1Y3RpYmxlLEFzc2lnbmFibGV9IHN0cnVj
dHMgYXJlIGhlbHBlcnMgdG8KKy8vIGltcGxlbWVudCBjb25zdHJ1Y3Rvci9hc3NpZ24tb3BlcmF0
b3Igb3ZlcmxvYWRpbmcuIFNwZWNpZmljYWxseSwgaWYgVCBpcworLy8gaXMgbm90IG1vdmFibGUg
YnV0IGNvcHlhYmxlLCBPcHRpb25hbDxUPidzIG1vdmUgY29uc3RydWN0b3Igc2hvdWxkIG5vdAor
Ly8gcGFydGljaXBhdGUgaW4gb3ZlcmxvYWQgcmVzb2x1dGlvbi4gVGhpcyBpbmhlcml0YW5jZSB0
cmljayBpbXBsZW1lbnRzIHRoYXQuCit0ZW1wbGF0ZSA8Ym9vbCBpc19jb3B5X2NvbnN0cnVjdGli
bGU+CitzdHJ1Y3QgQ29weUNvbnN0cnVjdGlibGUge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3Qg
Q29weUNvbnN0cnVjdGlibGU8ZmFsc2U+IHsKKyAgY29uc3RleHByIENvcHlDb25zdHJ1Y3RpYmxl
KCkgPSBkZWZhdWx0OworICBjb25zdGV4cHIgQ29weUNvbnN0cnVjdGlibGUoY29uc3QgQ29weUNv
bnN0cnVjdGlibGUmKSA9IGRlbGV0ZTsKKyAgY29uc3RleHByIENvcHlDb25zdHJ1Y3RpYmxlKENv
cHlDb25zdHJ1Y3RpYmxlJiYpID0gZGVmYXVsdDsKKyAgQ29weUNvbnN0cnVjdGlibGUmIG9wZXJh
dG9yPShjb25zdCBDb3B5Q29uc3RydWN0aWJsZSYpID0gZGVmYXVsdDsKKyAgQ29weUNvbnN0cnVj
dGlibGUmIG9wZXJhdG9yPShDb3B5Q29uc3RydWN0aWJsZSYmKSA9IGRlZmF1bHQ7Cit9OworCit0
ZW1wbGF0ZSA8Ym9vbCBpc19tb3ZlX2NvbnN0cnVjdGlibGU+CitzdHJ1Y3QgTW92ZUNvbnN0cnVj
dGlibGUge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTW92ZUNvbnN0cnVjdGlibGU8ZmFsc2U+
IHsKKyAgY29uc3RleHByIE1vdmVDb25zdHJ1Y3RpYmxlKCkgPSBkZWZhdWx0OworICBjb25zdGV4
cHIgTW92ZUNvbnN0cnVjdGlibGUoY29uc3QgTW92ZUNvbnN0cnVjdGlibGUmKSA9IGRlZmF1bHQ7
CisgIGNvbnN0ZXhwciBNb3ZlQ29uc3RydWN0aWJsZShNb3ZlQ29uc3RydWN0aWJsZSYmKSA9IGRl
bGV0ZTsKKyAgTW92ZUNvbnN0cnVjdGlibGUmIG9wZXJhdG9yPShjb25zdCBNb3ZlQ29uc3RydWN0
aWJsZSYpID0gZGVmYXVsdDsKKyAgTW92ZUNvbnN0cnVjdGlibGUmIG9wZXJhdG9yPShNb3ZlQ29u
c3RydWN0aWJsZSYmKSA9IGRlZmF1bHQ7Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBpc19jb3B5X2Fz
c2lnbmFibGU+CitzdHJ1Y3QgQ29weUFzc2lnbmFibGUge307CisKK3RlbXBsYXRlIDw+CitzdHJ1
Y3QgQ29weUFzc2lnbmFibGU8ZmFsc2U+IHsKKyAgY29uc3RleHByIENvcHlBc3NpZ25hYmxlKCkg
PSBkZWZhdWx0OworICBjb25zdGV4cHIgQ29weUFzc2lnbmFibGUoY29uc3QgQ29weUFzc2lnbmFi
bGUmKSA9IGRlZmF1bHQ7CisgIGNvbnN0ZXhwciBDb3B5QXNzaWduYWJsZShDb3B5QXNzaWduYWJs
ZSYmKSA9IGRlZmF1bHQ7CisgIENvcHlBc3NpZ25hYmxlJiBvcGVyYXRvcj0oY29uc3QgQ29weUFz
c2lnbmFibGUmKSA9IGRlbGV0ZTsKKyAgQ29weUFzc2lnbmFibGUmIG9wZXJhdG9yPShDb3B5QXNz
aWduYWJsZSYmKSA9IGRlZmF1bHQ7Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBpc19tb3ZlX2Fzc2ln
bmFibGU+CitzdHJ1Y3QgTW92ZUFzc2lnbmFibGUge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3Qg
TW92ZUFzc2lnbmFibGU8ZmFsc2U+IHsKKyAgY29uc3RleHByIE1vdmVBc3NpZ25hYmxlKCkgPSBk
ZWZhdWx0OworICBjb25zdGV4cHIgTW92ZUFzc2lnbmFibGUoY29uc3QgTW92ZUFzc2lnbmFibGUm
KSA9IGRlZmF1bHQ7CisgIGNvbnN0ZXhwciBNb3ZlQXNzaWduYWJsZShNb3ZlQXNzaWduYWJsZSYm
KSA9IGRlZmF1bHQ7CisgIE1vdmVBc3NpZ25hYmxlJiBvcGVyYXRvcj0oY29uc3QgTW92ZUFzc2ln
bmFibGUmKSA9IGRlZmF1bHQ7CisgIE1vdmVBc3NpZ25hYmxlJiBvcGVyYXRvcj0oTW92ZUFzc2ln
bmFibGUmJikgPSBkZWxldGU7Cit9OworCisvLyBIZWxwZXIgdG8gY29uZGl0aW9uYWxseSBlbmFi
bGUgY29udmVydGluZyBjb25zdHJ1Y3RvcnMgYW5kIGFzc2lnbiBvcGVyYXRvcnMuCit0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBJc0NvbnZlcnRpYmxlRnJvbU9wdGlv
bmFsCisgICAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgIGJvb2wsCisgICAg
ICAgICAgc3RkOjppc19jb25zdHJ1Y3RpYmxlPFQsIE9wdGlvbmFsPFU+Jj46OnZhbHVlIHx8Cisg
ICAgICAgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxULCBjb25zdCBPcHRpb25hbDxVPiY+
Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8VCwgT3B0aW9u
YWw8VT4mJj46OnZhbHVlIHx8CisgICAgICAgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxU
LCBjb25zdCBPcHRpb25hbDxVPiYmPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgc3RkOjppc19j
b252ZXJ0aWJsZTxPcHRpb25hbDxVPiYsIFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICBzdGQ6
OmlzX2NvbnZlcnRpYmxlPGNvbnN0IE9wdGlvbmFsPFU+JiwgVD46OnZhbHVlIHx8CisgICAgICAg
ICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8T3B0aW9uYWw8VT4mJiwgVD46OnZhbHVlIHx8Cisg
ICAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8Y29uc3QgT3B0aW9uYWw8VT4mJiwgVD46
OnZhbHVlPiB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3Qg
SXNBc3NpZ25hYmxlRnJvbU9wdGlvbmFsCisgICAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PAor
ICAgICAgICAgIGJvb2wsCisgICAgICAgICAgSXNDb252ZXJ0aWJsZUZyb21PcHRpb25hbDxULCBV
Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgc3RkOjppc19hc3NpZ25hYmxlPFQmLCBPcHRpb25h
bDxVPiY+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICBzdGQ6OmlzX2Fzc2lnbmFibGU8VCYsIGNv
bnN0IE9wdGlvbmFsPFU+Jj46OnZhbHVlIHx8CisgICAgICAgICAgICAgIHN0ZDo6aXNfYXNzaWdu
YWJsZTxUJiwgT3B0aW9uYWw8VT4mJj46OnZhbHVlIHx8CisgICAgICAgICAgICAgIHN0ZDo6aXNf
YXNzaWduYWJsZTxUJiwgY29uc3QgT3B0aW9uYWw8VT4mJj46OnZhbHVlPiB7fTsKKworLy8gRm9y
d2FyZCBjb21wYXRpYmlsaXR5IGZvciBDKysxNy4KKy8vIEludHJvZHVjZSBvbmUgbW9yZSBkZWVw
ZXIgbmVzdGVkIG5hbWVzcGFjZSB0byBhdm9pZCBsZWFraW5nIHVzaW5nIHN0ZDo6c3dhcC4KK25h
bWVzcGFjZSBzd2FwcGFibGVfaW1wbCB7Cit1c2luZyBzdGQ6OnN3YXA7CisKK3N0cnVjdCBJc1N3
YXBwYWJsZUltcGwgeworICAvLyBUZXN0cyBpZiBzd2FwIGNhbiBiZSBjYWxsZWQuIENoZWNrPFQm
PigwKSByZXR1cm5zIHRydWVfdHlwZSBpZmYgc3dhcCBpcworICAvLyBhdmFpbGFibGUgZm9yIFQu
IE90aGVyd2lzZSwgQ2hlY2sncyBvdmVybG9hZCByZXNvbHV0aW9uIGZhbGxzIGJhY2sgdG8KKyAg
Ly8gQ2hlY2soLi4uKSBkZWNsYXJlZCBiZWxvdyB0aGFua3MgdG8gU0ZJTkFFLCBzbyByZXR1cm5z
IGZhbHNlX3R5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgYXV0byBDaGVj
ayhpbnQpCisgICAgICAtPiBkZWNsdHlwZShzd2FwKHN0ZDo6ZGVjbHZhbDxUPigpLCBzdGQ6OmRl
Y2x2YWw8VD4oKSksIHN0ZDo6dHJ1ZV90eXBlKCkpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
PgorICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIENoZWNrKC4uLik7Cit9OworfSAgLy8gbmFtZXNw
YWNlIHN3YXBwYWJsZV9pbXBsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IElzU3dh
cHBhYmxlIDogZGVjbHR5cGUoc3dhcHBhYmxlX2ltcGw6OklzU3dhcHBhYmxlSW1wbDo6Q2hlY2s8
VCY+KDApKSB7fTsKKworLy8gRm9yd2FyZCBjb21wYXRpYmlsaXR5IGZvciBDKysyMC4KK3RlbXBs
YXRlIDx0eXBlbmFtZSBUPgordXNpbmcgUmVtb3ZlQ3ZSZWZUID0KKyAgICB0eXBlbmFtZSBzdGQ6
OnJlbW92ZV9jdjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+Ojp0eXBl
OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gT24gV2luZG93cywgYnkgZGVmYXVs
dCwgZW1wdHktYmFzZSBjbGFzcyBvcHRpbWl6YXRpb24gZG9lcyBub3Qgd29yaywKKy8vIHdoaWNo
IG1lYW5zIGV2ZW4gaWYgdGhlIGJhc2UgY2xhc3MgaXMgZW1wdHkgc3RydWN0LCBpdCBzdGlsbCBj
b25zdW1lcyBvbmUKKy8vIGJ5dGUgZm9yIGl0cyBib2R5LiBfX2RlY2xzcGVjKGVtcHR5X2Jhc2Vz
KSBlbmFibGVzIHRoZSBvcHRpbWl6YXRpb24uCisvLyBjZikKKy8vIGh0dHBzOi8vYmxvZ3MubXNk
bi5taWNyb3NvZnQuY29tL3ZjYmxvZy8yMDE2LzAzLzMwL29wdGltaXppbmctdGhlLWxheW91dC1v
Zi1lbXB0eS1iYXNlLWNsYXNzZXMtaW4tdnMyMDE1LXVwZGF0ZS0yLTMvCisjaWYgUEVSRkVUVE9f
QlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikgJiYgXAorICAgICFQRVJGRVRUT19CVUlMREZMQUco
UEVSRkVUVE9fQ09NUElMRVJfR0NDKQorI2RlZmluZSBPUFRJT05BTF9ERUNMU1BFQ19FTVBUWV9C
QVNFUyBfX2RlY2xzcGVjKGVtcHR5X2Jhc2VzKQorI2Vsc2UKKyNkZWZpbmUgT1BUSU9OQUxfREVD
TFNQRUNfRU1QVFlfQkFTRVMKKyNlbmRpZgorCisvLyBiYXNlOjpPcHRpb25hbCBpcyBhIENocm9t
aXVtIHZlcnNpb24gb2YgdGhlIEMrKzE3IG9wdGlvbmFsIGNsYXNzOgorLy8gc3RkOjpvcHRpb25h
bCBkb2N1bWVudGF0aW9uOgorLy8gaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvdXRp
bGl0eS9vcHRpb25hbAorLy8gQ2hyb21pdW0gZG9jdW1lbnRhdGlvbjoKKy8vIGh0dHBzOi8vY2hy
b21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvZG9jcy9vcHRpb25h
bC5tZAorLy8KKy8vIFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgc3BlY2lm
aWNhdGlvbiBhbmQgdGhlIGltcGxlbWVudGF0aW9uOgorLy8gLSBDb25zdHJ1Y3RvcnMgZG8gbm90
IHVzZSAnY29uc3RleHByJyBhcyBpdCBpcyBhIEMrKzE0IGV4dGVuc2lvbi4KKy8vIC0gJ2NvbnN0
ZXhwcicgbWlnaHQgYmUgbWlzc2luZyBpbiBzb21lIHBsYWNlcyBmb3IgcmVhc29ucyBzcGVjaWZp
ZWQgbG9jYWxseS4KKy8vIC0gTm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duLCBiZWNhdXNlIHRoZXkg
YXJlIGJhbm5lZCBmcm9tIENocm9taXVtLgorLy8gICBNYXJrZWQgbm9leGNlcHQgZm9yIG9ubHkg
bW92ZSBjb25zdHJ1Y3RvciBhbmQgbW92ZSBhc3NpZ24gb3BlcmF0b3JzLgorLy8gLSBBbGwgdGhl
IG5vbi1tZW1iZXJzIGFyZSBpbiB0aGUgJ2Jhc2UnIG5hbWVzcGFjZSBpbnN0ZWFkIG9mICdzdGQn
LgorLy8KKy8vIE5vdGUgdGhhdCBUIGNhbm5vdCBoYXZlIGEgY29uc3RydWN0b3IgVChPcHRpb25h
bDxUPikgZXRjLiBPcHRpb25hbDxUPgorLy8gUEVSRkVUVE9fQ0hFQ0tzIFQncyBjb25zdHJ1Y3Rv
ciAoc3BlY2lmaWNhbGx5IHZpYSBJc0NvbnZlcnRpYmxlRnJvbU9wdGlvbmFsKSwKKy8vIGFuZCBp
biB0aGUgUEVSRkVUVE9fQ0hFQ0sgd2hldGhlciBUIGNhbiBiZSBjb25zdHJ1Y3RpYmxlIGZyb20g
T3B0aW9uYWw8VD4sCisvLyB3aGljaCBpcyByZWN1cnNpdmUgc28gaXQgZG9lcyBub3Qgd29yay4g
QXMgb2YgRmViIDIwMTgsIHN0ZDo6b3B0aW9uYWwgQysrMTcKKy8vIGltcGxlbWVudGF0aW9uIGlu
IGJvdGggY2xhbmcgYW5kIGdjYyBoYXMgc2FtZSBsaW1pdGF0aW9uLiBNU1ZDIFNGSU5BRSBsb29r
cworLy8gdG8gaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IsIGJ1dCBhbnl3YXkgaXQgcmVwb3J0cyBh
biBlcnJvciwgdG9vLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2Yg
b3B0aW9uYWwuaCBmcm9tIENocm9taXVtIGF0IHJldmlzaW9uCisvLyA1ZTcxYmQ0NTRlNjA1MTFj
MTI5M2MwYzY4NjU0NGFhYTc2MDk0NDI0LiBUaGUgY2hhbmdlcyByZW1vdmUgQysrMTQvQysrMTcK
Ky8vIHNwZWNpZmljIGNvZGUgYW5kIHJlcGxhY2Ugd2l0aCBDKysxMSBjb3VudGVycGFydHMuCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE9QVElPTkFMX0RFQ0xTUEVDX0VNUFRZX0JBU0VT
IE9wdGlvbmFsCisgICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok9wdGlvbmFsQmFzZTxUPiwKKyAgICAg
IHB1YmxpYyBpbnRlcm5hbDo6Q29weUNvbnN0cnVjdGlibGU8c3RkOjppc19jb3B5X2NvbnN0cnVj
dGlibGU8VD46OnZhbHVlPiwKKyAgICAgIHB1YmxpYyBpbnRlcm5hbDo6TW92ZUNvbnN0cnVjdGli
bGU8c3RkOjppc19tb3ZlX2NvbnN0cnVjdGlibGU8VD46OnZhbHVlPiwKKyAgICAgIHB1YmxpYyBp
bnRlcm5hbDo6Q29weUFzc2lnbmFibGU8c3RkOjppc19jb3B5X2NvbnN0cnVjdGlibGU8VD46OnZh
bHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29w
eV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZT4sCisgICAgICBwdWJsaWMgaW50ZXJuYWw6Ok1vdmVBc3Np
Z25hYmxlPHN0ZDo6aXNfbW92ZV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX21vdmVfYXNzaWduYWJsZTxUPjo6
dmFsdWU+IHsKKyBwdWJsaWM6CisjdW5kZWYgT1BUSU9OQUxfREVDTFNQRUNfRU1QVFlfQkFTRVMK
KyAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisKKyAgLy8gRGVmZXIgZGVmYXVsdC9jb3B5L21vdmUg
Y29uc3RydWN0b3IgaW1wbGVtZW50YXRpb24gdG8gT3B0aW9uYWxCYXNlLgorICBjb25zdGV4cHIg
T3B0aW9uYWwoKSA9IGRlZmF1bHQ7CisgIGNvbnN0ZXhwciBPcHRpb25hbChjb25zdCBPcHRpb25h
bCYgb3RoZXIpID0gZGVmYXVsdDsKKyAgY29uc3RleHByIE9wdGlvbmFsKE9wdGlvbmFsJiYgb3Ro
ZXIpIG5vZXhjZXB0KAorICAgICAgc3RkOjppc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxU
Pjo6dmFsdWUpID0gZGVmYXVsdDsKKworICBjb25zdGV4cHIgT3B0aW9uYWwobnVsbG9wdF90KSB7
fSAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCisKKyAgLy8gQ29udmVydGluZyBjb3B5IGNv
bnN0cnVjdG9yLiAiZXhwbGljaXQiIG9ubHkgaWYKKyAgLy8gc3RkOjppc19jb252ZXJ0aWJsZTxj
b25zdCBVJiwgVD46OnZhbHVlIGlzIGZhbHNlLiBJdCBpcyBpbXBsZW1lbnRlZCBieQorICAvLyBk
ZWNsYXJpbmcgdHdvIGFsbW9zdCBzYW1lIGNvbnN0cnVjdG9ycywgYnV0IHRoYXQgY29uZGl0aW9u
IGluIGVuYWJsZV9pZl90CisgIC8vIGlzIGRpZmZlcmVudCwgc28gdGhhdCBlaXRoZXIgb25lIGlz
IGNob3NlbiwgdGhhbmtzIHRvIFNGSU5BRS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUsCisgICAg
ICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICBzdGQ6Omlz
X2NvbnN0cnVjdGlibGU8VCwgY29uc3QgVSY+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAg
ICAhaW50ZXJuYWw6OklzQ29udmVydGlibGVGcm9tT3B0aW9uYWw8VCwgVT46OnZhbHVlICYmCisg
ICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8Y29uc3QgVSYsIFQ+Ojp2YWx1
ZSwKKyAgICAgICAgICAgICAgICBib29sPjo6dHlwZSA9IGZhbHNlPgorICBPcHRpb25hbChjb25z
dCBPcHRpb25hbDxVPiYgb3RoZXIpIDogaW50ZXJuYWw6Ok9wdGlvbmFsQmFzZTxUPihvdGhlcikg
e30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6
ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxULCBjb25z
dCBVJj46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICFpbnRlcm5hbDo6SXNDb252ZXJ0
aWJsZUZyb21PcHRpb25hbDxULCBVPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIXN0
ZDo6aXNfY29udmVydGlibGU8Y29uc3QgVSYsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBi
b29sPjo6dHlwZSA9IGZhbHNlPgorICBleHBsaWNpdCBPcHRpb25hbChjb25zdCBPcHRpb25hbDxV
PiYgb3RoZXIpCisgICAgICA6IGludGVybmFsOjpPcHRpb25hbEJhc2U8VD4ob3RoZXIpIHt9CisK
KyAgLy8gQ29udmVydGluZyBtb3ZlIGNvbnN0cnVjdG9yLiBTaW1pbGFyIHRvIGNvbnZlcnRpbmcg
Y29weSBjb25zdHJ1Y3RvciwKKyAgLy8gZGVjbGFyaW5nIHR3byAoZXhwbGljaXQgYW5kIG5vbi1l
eHBsaWNpdCkgY29uc3RydWN0b3JzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwKKyAgICAgICAg
ICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29u
c3RydWN0aWJsZTxULCBVJiY+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAhaW50ZXJu
YWw6OklzQ29udmVydGlibGVGcm9tT3B0aW9uYWw8VCwgVT46OnZhbHVlICYmCisgICAgICAgICAg
ICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VSYmLCBUPjo6dmFsdWUsCisgICAgICAgICAg
ICAgICAgYm9vbD46OnR5cGUgPSBmYWxzZT4KKyAgT3B0aW9uYWwoT3B0aW9uYWw8VT4mJiBvdGhl
cikgOiBpbnRlcm5hbDo6T3B0aW9uYWxCYXNlPFQ+KHN0ZDo6bW92ZShvdGhlcikpIHt9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFUsCisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9p
ZjwKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8VCwgVSYmPjo6dmFsdWUg
JiYKKyAgICAgICAgICAgICAgICAgICAgIWludGVybmFsOjpJc0NvbnZlcnRpYmxlRnJvbU9wdGlv
bmFsPFQsIFU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAhc3RkOjppc19jb252ZXJ0
aWJsZTxVJiYsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBib29sPjo6dHlwZSA9IGZhbHNl
PgorICBleHBsaWNpdCBPcHRpb25hbChPcHRpb25hbDxVPiYmIG90aGVyKQorICAgICAgOiBpbnRl
cm5hbDo6T3B0aW9uYWxCYXNlPFQ+KHN0ZDo6bW92ZShvdGhlcikpIHt9CisKKyAgdGVtcGxhdGUg
PGNsYXNzLi4uIEFyZ3M+CisgIGNvbnN0ZXhwciBleHBsaWNpdCBPcHRpb25hbChpbl9wbGFjZV90
LCBBcmdzJiYuLi4gYXJncykKKyAgICAgIDogaW50ZXJuYWw6Ok9wdGlvbmFsQmFzZTxUPihpbl9w
bGFjZSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSB7fQorCisgIHRlbXBsYXRlIDxjbGFz
cyBVLAorICAgICAgICAgICAgY2xhc3MuLi4gQXJncywKKyAgICAgICAgICAgIGNsYXNzID0gdHlw
ZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgc3RkOjppc19jb25zdHJ1Y3Rp
YmxlPHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEFyZ3MuLi4+Ojp2YWx1ZT46OnR5cGU+CisgIGNvbnN0ZXhwciBleHBsaWNpdCBPcHRp
b25hbChpbl9wbGFjZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0
aWFsaXplcl9saXN0PFU+IGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyYm
Li4uIGFyZ3MpCisgICAgICA6IGludGVybmFsOjpPcHRpb25hbEJhc2U8VD4oaW5fcGxhY2UsIGls
LCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIHt9CisKKyAgLy8gRm9yd2FyZCB2YWx1ZSBj
b25zdHJ1Y3Rvci4gU2ltaWxhciB0byBjb252ZXJ0aW5nIGNvbnN0cnVjdG9ycywKKyAgLy8gY29u
ZGl0aW9uYWxseSBleHBsaWNpdC4KKyAgdGVtcGxhdGUgPAorICAgICAgdHlwZW5hbWUgVSA9IHZh
bHVlX3R5cGUsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICBzdGQ6
OmlzX2NvbnN0cnVjdGlibGU8VCwgVSYmPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgIXN0ZDo6
aXNfc2FtZTxpbnRlcm5hbDo6UmVtb3ZlQ3ZSZWZUPFU+LCBpbl9wbGFjZV90Pjo6dmFsdWUgJiYK
KyAgICAgICAgICAgICAgIXN0ZDo6aXNfc2FtZTxpbnRlcm5hbDo6UmVtb3ZlQ3ZSZWZUPFU+LCBP
cHRpb25hbDxUPj46OnZhbHVlICYmCisgICAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8
VSYmLCBUPjo6dmFsdWUsCisgICAgICAgICAgYm9vbD46OnR5cGUgPSBmYWxzZT4KKyAgY29uc3Rl
eHByIE9wdGlvbmFsKFUmJiB2YWx1ZSkKKyAgICAgIDogaW50ZXJuYWw6Ok9wdGlvbmFsQmFzZTxU
Pihpbl9wbGFjZSwgc3RkOjpmb3J3YXJkPFU+KHZhbHVlKSkge30KKworICB0ZW1wbGF0ZSA8Cisg
ICAgICB0eXBlbmFtZSBVID0gdmFsdWVfdHlwZSwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxl
X2lmPAorICAgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxULCBVJiY+Ojp2YWx1ZSAmJgor
ICAgICAgICAgICAgICAhc3RkOjppc19zYW1lPGludGVybmFsOjpSZW1vdmVDdlJlZlQ8VT4sIGlu
X3BsYWNlX3Q+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAhc3RkOjppc19zYW1lPGludGVybmFs
OjpSZW1vdmVDdlJlZlQ8VT4sIE9wdGlvbmFsPFQ+Pjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAg
IXN0ZDo6aXNfY29udmVydGlibGU8VSYmLCBUPjo6dmFsdWUsCisgICAgICAgICAgYm9vbD46OnR5
cGUgPSBmYWxzZT4KKyAgY29uc3RleHByIGV4cGxpY2l0IE9wdGlvbmFsKFUmJiB2YWx1ZSkKKyAg
ICAgIDogaW50ZXJuYWw6Ok9wdGlvbmFsQmFzZTxUPihpbl9wbGFjZSwgc3RkOjpmb3J3YXJkPFU+
KHZhbHVlKSkge30KKworICB+T3B0aW9uYWwoKSA9IGRlZmF1bHQ7CisKKyAgLy8gRGVmZXIgY29w
eS0vbW92ZS0gYXNzaWduIG9wZXJhdG9yIGltcGxlbWVudGF0aW9uIHRvIE9wdGlvbmFsQmFzZS4K
KyAgT3B0aW9uYWwmIG9wZXJhdG9yPShjb25zdCBPcHRpb25hbCYgb3RoZXIpID0gZGVmYXVsdDsK
KyAgT3B0aW9uYWwmIG9wZXJhdG9yPShPcHRpb25hbCYmIG90aGVyKSBub2V4Y2VwdCgKKyAgICAg
IHN0ZDo6aXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8VD46OnZhbHVlJiYKKyAgICAgICAgICBz
dGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSkgPSBkZWZhdWx0Owor
CisgIE9wdGlvbmFsJiBvcGVyYXRvcj0obnVsbG9wdF90KSB7CisgICAgRnJlZUlmTmVlZGVkKCk7
CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gUGVyZmVjdC1mb3J3YXJkZWQgYXNzaWdu
bWVudC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lm
PAorICAgICAgIXN0ZDo6aXNfc2FtZTxpbnRlcm5hbDo6UmVtb3ZlQ3ZSZWZUPFU+LCBPcHRpb25h
bDxUPj46OnZhbHVlICYmCisgICAgICAgICAgc3RkOjppc19jb25zdHJ1Y3RpYmxlPFQsIFU+Ojp2
YWx1ZSAmJgorICAgICAgICAgIHN0ZDo6aXNfYXNzaWduYWJsZTxUJiwgVT46OnZhbHVlICYmCisg
ICAgICAgICAgKCFzdGQ6OmlzX3NjYWxhcjxUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgIXN0ZDo6
aXNfc2FtZTx0eXBlbmFtZSBzdGQ6OmRlY2F5PFU+Ojp0eXBlLCBUPjo6dmFsdWUpLAorICAgICAg
T3B0aW9uYWwmPjo6dHlwZQorICBvcGVyYXRvcj0oVSYmIHZhbHVlKSB7CisgICAgSW5pdE9yQXNz
aWduKHN0ZDo6Zm9yd2FyZDxVPih2YWx1ZSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisg
IC8vIENvcHkgYXNzaWduIHRoZSBzdGF0ZSBvZiBvdGhlci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFU+CisgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpbnRlcm5hbDo6SXNBc3NpZ25hYmxlRnJv
bU9wdGlvbmFsPFQsIFU+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjppc19jb25zdHJ1Y3RpYmxlPFQsIGNvbnN0IFUmPjo6dmFsdWUgJiYKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYXNzaWduYWJsZTxUJiwgY29uc3QgVSY+Ojp2YWx1
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwmPjo6dHlwZQorICBvcGVyYXRv
cj0oY29uc3QgT3B0aW9uYWw8VT4mIG90aGVyKSB7CisgICAgQ29weUFzc2lnbihvdGhlcik7Cisg
ICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gTW92ZSBhc3NpZ24gdGhlIHN0YXRlIG9mIG90
aGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8
IWludGVybmFsOjpJc0Fzc2lnbmFibGVGcm9tT3B0aW9uYWw8VCwgVT46OnZhbHVlICYmCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8VCwgVT46OnZh
bHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Fzc2lnbmFibGU8
VCYsIFU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwmPjo6dHlw
ZQorICBvcGVyYXRvcj0oT3B0aW9uYWw8VT4mJiBvdGhlcikgeworICAgIE1vdmVBc3NpZ24oc3Rk
Ojptb3ZlKG90aGVyKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgVCogb3Bl
cmF0b3ItPigpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soc3RvcmFnZV8uaXNfcG9wdWxh
dGVkXyk7CisgICAgcmV0dXJuICZzdG9yYWdlXy52YWx1ZV87CisgIH0KKworICBUKiBvcGVyYXRv
ci0+KCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhzdG9yYWdlXy5pc19wb3B1bGF0ZWRfKTsKKyAg
ICByZXR1cm4gJnN0b3JhZ2VfLnZhbHVlXzsKKyAgfQorCisgIGNvbnN0IFQmIG9wZXJhdG9yKigp
IGNvbnN0JiB7CisgICAgUEVSRkVUVE9fRENIRUNLKHN0b3JhZ2VfLmlzX3BvcHVsYXRlZF8pOwor
ICAgIHJldHVybiBzdG9yYWdlXy52YWx1ZV87CisgIH0KKworICBUJiBvcGVyYXRvciooKSAmIHsK
KyAgICBQRVJGRVRUT19EQ0hFQ0soc3RvcmFnZV8uaXNfcG9wdWxhdGVkXyk7CisgICAgcmV0dXJu
IHN0b3JhZ2VfLnZhbHVlXzsKKyAgfQorCisgIGNvbnN0IFQmJiBvcGVyYXRvciooKSBjb25zdCYm
IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soc3RvcmFnZV8uaXNfcG9wdWxhdGVkXyk7CisgICAgcmV0
dXJuIHN0ZDo6bW92ZShzdG9yYWdlXy52YWx1ZV8pOworICB9CisKKyAgVCYmIG9wZXJhdG9yKigp
ICYmIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soc3RvcmFnZV8uaXNfcG9wdWxhdGVkXyk7CisgICAg
cmV0dXJuIHN0ZDo6bW92ZShzdG9yYWdlXy52YWx1ZV8pOworICB9CisKKyAgY29uc3RleHByIGV4
cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBzdG9yYWdlXy5pc19wb3B1bGF0
ZWRfOyB9CisKKyAgY29uc3RleHByIGJvb2wgaGFzX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gc3Rv
cmFnZV8uaXNfcG9wdWxhdGVkXzsgfQorCisgIFQmIHZhbHVlKCkgJiB7CisgICAgUEVSRkVUVE9f
Q0hFQ0soc3RvcmFnZV8uaXNfcG9wdWxhdGVkXyk7CisgICAgcmV0dXJuIHN0b3JhZ2VfLnZhbHVl
XzsKKyAgfQorCisgIGNvbnN0IFQmIHZhbHVlKCkgY29uc3QmIHsKKyAgICBQRVJGRVRUT19DSEVD
SyhzdG9yYWdlXy5pc19wb3B1bGF0ZWRfKTsKKyAgICByZXR1cm4gc3RvcmFnZV8udmFsdWVfOwor
ICB9CisKKyAgVCYmIHZhbHVlKCkgJiYgeworICAgIFBFUkZFVFRPX0NIRUNLKHN0b3JhZ2VfLmlz
X3BvcHVsYXRlZF8pOworICAgIHJldHVybiBzdGQ6Om1vdmUoc3RvcmFnZV8udmFsdWVfKTsKKyAg
fQorCisgIGNvbnN0IFQmJiB2YWx1ZSgpIGNvbnN0JiYgeworICAgIFBFUkZFVFRPX0NIRUNLKHN0
b3JhZ2VfLmlzX3BvcHVsYXRlZF8pOworICAgIHJldHVybiBzdGQ6Om1vdmUoc3RvcmFnZV8udmFs
dWVfKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBjb25zdGV4cHIgVCB2YWx1ZV9v
cihVJiYgZGVmYXVsdF92YWx1ZSkgY29uc3QmIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNf
Y29udmVydGlibGU8VSwgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIlUgbXVzdCBiZSBj
b252ZXJ0aWJsZSB0byBUIik7CisgICAgcmV0dXJuIHN0b3JhZ2VfLmlzX3BvcHVsYXRlZF8KKyAg
ICAgICAgICAgICAgID8gc3RvcmFnZV8udmFsdWVfCisgICAgICAgICAgICAgICA6IHN0YXRpY19j
YXN0PFQ+KHN0ZDo6Zm9yd2FyZDxVPihkZWZhdWx0X3ZhbHVlKSk7CisgIH0KKworICB0ZW1wbGF0
ZSA8Y2xhc3MgVT4KKyAgVCB2YWx1ZV9vcihVJiYgZGVmYXVsdF92YWx1ZSkgJiYgeworICAgIHN0
YXRpY19hc3NlcnQoc3RkOjppc19jb252ZXJ0aWJsZTxVLCBUPjo6dmFsdWUsCisgICAgICAgICAg
ICAgICAgICAiVSBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvIFQiKTsKKyAgICByZXR1cm4gc3RvcmFn
ZV8uaXNfcG9wdWxhdGVkXworICAgICAgICAgICAgICAgPyBzdGQ6Om1vdmUoc3RvcmFnZV8udmFs
dWVfKQorICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxUPihzdGQ6OmZvcndhcmQ8VT4oZGVm
YXVsdF92YWx1ZSkpOworICB9CisKKyAgdm9pZCBzd2FwKE9wdGlvbmFsJiBvdGhlcikgeworICAg
IGlmICghc3RvcmFnZV8uaXNfcG9wdWxhdGVkXyAmJiAhb3RoZXIuc3RvcmFnZV8uaXNfcG9wdWxh
dGVkXykKKyAgICAgIHJldHVybjsKKworICAgIGlmIChzdG9yYWdlXy5pc19wb3B1bGF0ZWRfICE9
IG90aGVyLnN0b3JhZ2VfLmlzX3BvcHVsYXRlZF8pIHsKKyAgICAgIGlmIChzdG9yYWdlXy5pc19w
b3B1bGF0ZWRfKSB7CisgICAgICAgIG90aGVyLnN0b3JhZ2VfLkluaXQoc3RkOjptb3ZlKHN0b3Jh
Z2VfLnZhbHVlXykpOworICAgICAgICBGcmVlSWZOZWVkZWQoKTsKKyAgICAgIH0gZWxzZSB7Cisg
ICAgICAgIHN0b3JhZ2VfLkluaXQoc3RkOjptb3ZlKG90aGVyLnN0b3JhZ2VfLnZhbHVlXykpOwor
ICAgICAgICBvdGhlci5GcmVlSWZOZWVkZWQoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBQRVJGRVRUT19EQ0hFQ0soc3RvcmFnZV8uaXNfcG9wdWxhdGVkXyAmJiBvdGhl
ci5zdG9yYWdlXy5pc19wb3B1bGF0ZWRfKTsKKyAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgc3dh
cCgqKnRoaXMsICpvdGhlcik7CisgIH0KKworICB2b2lkIHJlc2V0KCkgeyBGcmVlSWZOZWVkZWQo
KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICBUJiBlbXBsYWNlKEFyZ3MmJi4u
LiBhcmdzKSB7CisgICAgRnJlZUlmTmVlZGVkKCk7CisgICAgc3RvcmFnZV8uSW5pdChzdGQ6OmZv
cndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIHJldHVybiBzdG9yYWdlXy52YWx1ZV87CisgIH0K
KworICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MuLi4gQXJncz4KKyAgdHlwZW5hbWUgc3RkOjpl
bmFibGVfaWY8CisgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8VCwgc3RkOjppbml0aWFsaXpl
cl9saXN0PFU+JiwgQXJncyYmLi4uPjo6dmFsdWUsCisgICAgICBUJj46OnR5cGUKKyAgZW1wbGFj
ZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VT4gaWwsIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgRnJl
ZUlmTmVlZGVkKCk7CisgICAgc3RvcmFnZV8uSW5pdChpbCwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFy
Z3MpLi4uKTsKKyAgICByZXR1cm4gc3RvcmFnZV8udmFsdWVfOworICB9CisKKyBwcml2YXRlOgor
ICAvLyBBY2Nlc3NpbmcgdGVtcGxhdGUgYmFzZSBjbGFzcydzIHByb3RlY3RlZCBtZW1iZXIgbmVl
ZHMgZXhwbGljaXQKKyAgLy8gZGVjbGFyYXRpb24gdG8gZG8gc28uCisgIHVzaW5nIGludGVybmFs
OjpPcHRpb25hbEJhc2U8VD46OkNvcHlBc3NpZ247CisgIHVzaW5nIGludGVybmFsOjpPcHRpb25h
bEJhc2U8VD46OkZyZWVJZk5lZWRlZDsKKyAgdXNpbmcgaW50ZXJuYWw6Ok9wdGlvbmFsQmFzZTxU
Pjo6SW5pdE9yQXNzaWduOworICB1c2luZyBpbnRlcm5hbDo6T3B0aW9uYWxCYXNlPFQ+OjpNb3Zl
QXNzaWduOworICB1c2luZyBpbnRlcm5hbDo6T3B0aW9uYWxCYXNlPFQ+OjpzdG9yYWdlXzsKK307
CisKKy8vIEhlcmUgYWZ0ZXIgZGVmaW5lcyBjb21wYXJhdGlvbiBvcGVyYXRvcnMuIFRoZSBkZWZp
bml0aW9uIGZvbGxvd3MKKy8vIGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aWxp
dHkvb3B0aW9uYWwvb3BlcmF0b3JfY21wCisvLyB3aGlsZSBib29sKCkgY2FzdGluZyBpcyByZXBs
YWNlZCBieSBoYXNfdmFsdWUoKSB0byBtZWV0IHRoZSBjaHJvbWl1bQorLy8gc3R5bGUgZ3VpZGUu
Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBPcHRp
b25hbDxUPiYgbGhzLCBjb25zdCBPcHRpb25hbDxVPiYgcmhzKSB7CisgIGlmIChsaHMuaGFzX3Zh
bHVlKCkgIT0gcmhzLmhhc192YWx1ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFsaHMu
aGFzX3ZhbHVlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiAqbGhzID09ICpyaHM7Cit9
CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IE9w
dGlvbmFsPFQ+JiBsaHMsIGNvbnN0IE9wdGlvbmFsPFU+JiByaHMpIHsKKyAgaWYgKGxocy5oYXNf
dmFsdWUoKSAhPSByaHMuaGFzX3ZhbHVlKCkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICghbGhz
Lmhhc192YWx1ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuICpsaHMgIT0gKnJoczsK
K30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIG9wZXJhdG9yPChjb25zdCBP
cHRpb25hbDxUPiYgbGhzLCBjb25zdCBPcHRpb25hbDxVPiYgcmhzKSB7CisgIGlmICghcmhzLmhh
c192YWx1ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFsaHMuaGFzX3ZhbHVlKCkpCisg
ICAgcmV0dXJuIHRydWU7CisgIHJldHVybiAqbGhzIDwgKnJoczsKK30KKwordGVtcGxhdGUgPGNs
YXNzIFQsIGNsYXNzIFU+Citib29sIG9wZXJhdG9yPD0oY29uc3QgT3B0aW9uYWw8VD4mIGxocywg
Y29uc3QgT3B0aW9uYWw8VT4mIHJocykgeworICBpZiAoIWxocy5oYXNfdmFsdWUoKSkKKyAgICBy
ZXR1cm4gdHJ1ZTsKKyAgaWYgKCFyaHMuaGFzX3ZhbHVlKCkpCisgICAgcmV0dXJuIGZhbHNlOwor
ICByZXR1cm4gKmxocyA8PSAqcmhzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4K
K2Jvb2wgb3BlcmF0b3I+KGNvbnN0IE9wdGlvbmFsPFQ+JiBsaHMsIGNvbnN0IE9wdGlvbmFsPFU+
JiByaHMpIHsKKyAgaWYgKCFsaHMuaGFzX3ZhbHVlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBp
ZiAoIXJocy5oYXNfdmFsdWUoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuICpsaHMgPiAq
cmhzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgb3BlcmF0b3I+PShj
b25zdCBPcHRpb25hbDxUPiYgbGhzLCBjb25zdCBPcHRpb25hbDxVPiYgcmhzKSB7CisgIGlmICgh
cmhzLmhhc192YWx1ZSgpKQorICAgIHJldHVybiB0cnVlOworICBpZiAoIWxocy5oYXNfdmFsdWUo
KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiAqbGhzID49ICpyaHM7Cit9CisKK3RlbXBs
YXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPcHRpb25hbDxU
PiYgb3B0LCBudWxsb3B0X3QpIHsKKyAgcmV0dXJuICFvcHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFz
cyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShudWxsb3B0X3QsIGNvbnN0IE9wdGlvbmFs
PFQ+JiBvcHQpIHsKKyAgcmV0dXJuICFvcHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29u
c3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBPcHRpb25hbDxUPiYgb3B0LCBudWxsb3B0X3Qp
IHsKKyAgcmV0dXJuIG9wdC5oYXNfdmFsdWUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citj
b25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KG51bGxvcHRfdCwgY29uc3QgT3B0aW9uYWw8VD4mIG9w
dCkgeworICByZXR1cm4gb3B0Lmhhc192YWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4K
K2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBPcHRpb25hbDxUPiYsIG51bGxvcHRfdCkg
eworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJv
b2wgb3BlcmF0b3I8KG51bGxvcHRfdCwgY29uc3QgT3B0aW9uYWw8VD4mIG9wdCkgeworICByZXR1
cm4gb3B0Lmhhc192YWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBi
b29sIG9wZXJhdG9yPD0oY29uc3QgT3B0aW9uYWw8VD4mIG9wdCwgbnVsbG9wdF90KSB7CisgIHJl
dHVybiAhb3B0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJh
dG9yPD0obnVsbG9wdF90LCBjb25zdCBPcHRpb25hbDxUPiYpIHsKKyAgcmV0dXJuIHRydWU7Cit9
CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE9w
dGlvbmFsPFQ+JiBvcHQsIG51bGxvcHRfdCkgeworICByZXR1cm4gb3B0Lmhhc192YWx1ZSgpOwor
fQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPihudWxsb3B0
X3QsIGNvbnN0IE9wdGlvbmFsPFQ+JikgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRl
IDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBPcHRpb25hbDxUPiYs
IG51bGxvcHRfdCkgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citj
b25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KG51bGxvcHRfdCwgY29uc3QgT3B0aW9uYWw8VD4mIG9w
dCkgeworICByZXR1cm4gIW9wdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+Citj
b25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQsIGNvbnN0IFUm
IHZhbHVlKSB7CisgIHJldHVybiBvcHQuaGFzX3ZhbHVlKCkgPyAqb3B0ID09IHZhbHVlIDogZmFs
c2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorY29uc3RleHByIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBVJiB2YWx1ZSwgY29uc3QgT3B0aW9uYWw8VD4mIG9wdCkgeworICByZXR1
cm4gb3B0Lmhhc192YWx1ZSgpID8gdmFsdWUgPT0gKm9wdCA6IGZhbHNlOworfQorCit0ZW1wbGF0
ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgT3B0
aW9uYWw8VD4mIG9wdCwgY29uc3QgVSYgdmFsdWUpIHsKKyAgcmV0dXJuIG9wdC5oYXNfdmFsdWUo
KSA/ICpvcHQgIT0gdmFsdWUgOiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3Mg
VT4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgVSYgdmFsdWUsIGNvbnN0IE9wdGlv
bmFsPFQ+JiBvcHQpIHsKKyAgcmV0dXJuIG9wdC5oYXNfdmFsdWUoKSA/IHZhbHVlICE9ICpvcHQg
OiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2NvbnN0ZXhwciBib29s
IG9wZXJhdG9yPChjb25zdCBPcHRpb25hbDxUPiYgb3B0LCBjb25zdCBVJiB2YWx1ZSkgeworICBy
ZXR1cm4gb3B0Lmhhc192YWx1ZSgpID8gKm9wdCA8IHZhbHVlIDogdHJ1ZTsKK30KKwordGVtcGxh
dGUgPGNsYXNzIFQsIGNsYXNzIFU+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgVSYg
dmFsdWUsIGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQpIHsKKyAgcmV0dXJuIG9wdC5oYXNfdmFsdWUo
KSA/IHZhbHVlIDwgKm9wdCA6IGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3Mg
VT4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgT3B0aW9uYWw8VD4mIG9wdCwgY29u
c3QgVSYgdmFsdWUpIHsKKyAgcmV0dXJuIG9wdC5oYXNfdmFsdWUoKSA/ICpvcHQgPD0gdmFsdWUg
OiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2NvbnN0ZXhwciBib29s
IG9wZXJhdG9yPD0oY29uc3QgVSYgdmFsdWUsIGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQpIHsKKyAg
cmV0dXJuIG9wdC5oYXNfdmFsdWUoKSA/IHZhbHVlIDw9ICpvcHQgOiBmYWxzZTsKK30KKwordGVt
cGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3Qg
T3B0aW9uYWw8VD4mIG9wdCwgY29uc3QgVSYgdmFsdWUpIHsKKyAgcmV0dXJuIG9wdC5oYXNfdmFs
dWUoKSA/ICpvcHQgPiB2YWx1ZSA6IGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xh
c3MgVT4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBVJiB2YWx1ZSwgY29uc3QgT3B0
aW9uYWw8VD4mIG9wdCkgeworICByZXR1cm4gb3B0Lmhhc192YWx1ZSgpID8gdmFsdWUgPiAqb3B0
IDogdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+Citjb25zdGV4cHIgYm9v
bCBvcGVyYXRvcj49KGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQsIGNvbnN0IFUmIHZhbHVlKSB7Cisg
IHJldHVybiBvcHQuaGFzX3ZhbHVlKCkgPyAqb3B0ID49IHZhbHVlIDogZmFsc2U7Cit9CisKK3Rl
bXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25z
dCBVJiB2YWx1ZSwgY29uc3QgT3B0aW9uYWw8VD4mIG9wdCkgeworICByZXR1cm4gb3B0Lmhhc192
YWx1ZSgpID8gdmFsdWUgPj0gKm9wdCA6IHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgor
Y29uc3RleHByIE9wdGlvbmFsPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGU+IG1ha2Vfb3B0
aW9uYWwoVCYmIHZhbHVlKSB7CisgIHJldHVybiBPcHRpb25hbDx0eXBlbmFtZSBzdGQ6OmRlY2F5
PFQ+Ojp0eXBlPihzdGQ6OmZvcndhcmQ8VD4odmFsdWUpKTsKK30KKwordGVtcGxhdGUgPGNsYXNz
IFQsIGNsYXNzLi4uIEFyZ3M+Citjb25zdGV4cHIgT3B0aW9uYWw8VD4gbWFrZV9vcHRpb25hbChB
cmdzJiYuLi4gYXJncykgeworICByZXR1cm4gT3B0aW9uYWw8VD4oaW5fcGxhY2UsIHN0ZDo6Zm9y
d2FyZDxBcmdzPihhcmdzKS4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBj
bGFzcy4uLiBBcmdzPgorY29uc3RleHByIE9wdGlvbmFsPFQ+IG1ha2Vfb3B0aW9uYWwoc3RkOjpp
bml0aWFsaXplcl9saXN0PFU+IGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgQXJncyYmLi4uIGFyZ3MpIHsKKyAgcmV0dXJuIE9wdGlvbmFsPFQ+KGluX3BsYWNlLCBpbCwg
c3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKK30KKworLy8gUGFydGlhbCBzcGVjaWFsaXph
dGlvbiBmb3IgYSBmdW5jdGlvbiB0ZW1wbGF0ZSBpcyBub3QgYWxsb3dlZC4gQWxzbywgaXQgaXMK
Ky8vIG5vdCBhbGxvd2VkIHRvIGFkZCBvdmVybG9hZCBmdW5jdGlvbiB0byBzdGQgbmFtZXNwYWNl
LCB3aGlsZSBpdCBpcyBhbGxvd2VkCisvLyB0byBzcGVjaWFsaXplIHRoZSB0ZW1wbGF0ZSBpbiBz
dGQuIFRodXMsIHN3YXAoKSAoa2luZCBvZikgb3ZlcmxvYWRpbmcgaXMKKy8vIGRlZmluZWQgaW4g
YmFzZSBuYW1lc3BhY2UsIGluc3RlYWQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3R5cGVuYW1lIHN0
ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfbW92ZV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSAmJgorICAg
ICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OklzU3dhcHBhYmxlPFQ+Ojp2YWx1ZT46OnR5
cGUKK3N3YXAoT3B0aW9uYWw8VD4mIGxocywgT3B0aW9uYWw8VD4mIHJocykgeworICBsaHMuc3dh
cChyaHMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZl
dHRvCisKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBoYXNo
PHBlcmZldHRvOjpiYXNlOjpPcHRpb25hbDxUPj4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25z
dCBwZXJmZXR0bzo6YmFzZTo6T3B0aW9uYWw8VD4mIG9wdCkgY29uc3QgeworICAgIHJldHVybiBv
cHQgPT0gcGVyZmV0dG86OmJhc2U6Om51bGxvcHQgPyAwIDogc3RkOjpoYXNoPFQ+KCkoKm9wdCk7
CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmICAvLyBJTkNMVURFX1BF
UkZFVFRPX0VYVF9CQVNFX09QVElPTkFMX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL3N0cmluZ192aWV3LmgKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L2Jhc2UvaGFzaC5oCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX0hBU0hfSF8KKyNkZWZp
bmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9IQVNIX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYu
aD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQSBoZWxwZXIgY2xhc3Mgd2hp
Y2ggY29tcHV0ZXMgYSA2NC1iaXQgaGFzaCBvZiB0aGUgaW5wdXQgZGF0YS4KKy8vIFRoZSBhbGdv
cml0aG0gdXNlZCBpcyBGTlYtMWEgYXMgaXQgaXMgZmFzdCBhbmQgZWFzeSB0byBpbXBsZW1lbnQg
YW5kIGhhcworLy8gcmVsYXRpdmVseSBmZXcgY29sbGlzaW9ucy4KKy8vIFdBUk5JTkc6IFRoaXMg
aGFzaCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueSBjcnlwdG9ncmFwaGljIHB1
cnBvc2UuCitjbGFzcyBIYXNoIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYW4gZW1wdHkgaGFz
aCBvYmplY3QKKyAgSGFzaCgpIHt9CisKKyAgLy8gSGFzaGVzIGEgbnVtZXJpYyB2YWx1ZS4KKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQsCisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9p
ZjxzdGQ6OmlzX2FyaXRobWV0aWM8VD46OnZhbHVlPiogPSBudWxscHRyPgorICB2b2lkIFVwZGF0
ZShUIGRhdGEpIHsKKyAgICBVcGRhdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmRh
dGEpLCBzaXplb2YoZGF0YSkpOworICB9CisKKyAgLy8gSGFzaGVzIGEgYnl0ZSBhcnJheS4KKyAg
dm9pZCBVcGRhdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0XyBePSBzdGF0aWNfY2Fz
dDx1aW50OF90PihkYXRhW2ldKTsKKyAgICAgIHJlc3VsdF8gKj0ga0ZudjFhNjRQcmltZTsKKyAg
ICB9CisgIH0KKworICB1aW50NjRfdCBkaWdlc3QoKSB7IHJldHVybiByZXN1bHRfOyB9CisKKyBw
cml2YXRlOgorICBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtGbnYxYTY0T2Zmc2V0QmFzaXMg
PSAweGNiZjI5Y2U0ODQyMjIzMjU7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga0ZudjFh
NjRQcmltZSA9IDB4MTAwMDAwMDAxYjM7CisKKyAgdWludDY0X3QgcmVzdWx0XyA9IGtGbnYxYTY0
T2Zmc2V0QmFzaXM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNl
IHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9IQVNIX0hf
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2pl
Y3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4w
ICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGlu
IGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBv
ZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vu
c2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3
IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIg
dGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhP
VVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBv
ciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2Ug
Z292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vu
c2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1NUUklOR19WSUVX
X0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfU1RSSU5HX1ZJRVdfSF8KKwor
I2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0
cmluZz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
YmFzZS9idWlsZF9jb25maWcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvaGFzaC5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIHN0cmluZy1saWtlIG9iamVjdCB0aGF0IHJl
ZmVycyB0byBhIG5vbi1vd25lZCBwaWVjZSBvZiBtZW1vcnkuCisvLyBTdHJpbmdzIGFyZSBpbnRl
cm5hbGx5IE5PVCBudWxsIHRlcm1pbmF0ZWQuCitjbGFzcyBTdHJpbmdWaWV3IHsKKyBwdWJsaWM6
CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IG5wb3MgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KC0x
KTsKKworICBTdHJpbmdWaWV3KCkgOiBkYXRhXyhudWxscHRyKSwgc2l6ZV8oMCkge30KKyAgU3Ry
aW5nVmlldyhjb25zdCBTdHJpbmdWaWV3JikgPSBkZWZhdWx0OworICBTdHJpbmdWaWV3JiBvcGVy
YXRvcj0oY29uc3QgU3RyaW5nVmlldyYpID0gZGVmYXVsdDsKKyAgU3RyaW5nVmlldyhjb25zdCBj
aGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgOiBkYXRhXyhkYXRhKSwgc2l6ZV8oc2l6ZSkgeworICAg
IFBFUkZFVFRPX0RDSEVDSyhzaXplID09IDAgfHwgZGF0YSAhPSBudWxscHRyKTsKKyAgfQorCisg
IC8vIEFsbG93IGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBhbnkgY2xhc3MgdGhhdCBoYXMgYSB8
ZGF0YXwgYW5kIHxzaXplfCBmaWVsZAorICAvLyBhbmQgaGFzIHRoZSBrQ29udmVydGlibGVUb1N0
cmluZ1ZpZXcgdHJhaXQgKGUuZy4sIHByb3RvemVybzo6Q29uc3RDaGFycykuCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmPFQ6OmtDb252ZXJ0aWJsZVRv
U3RyaW5nVmlldz4+CisgIFN0cmluZ1ZpZXcoY29uc3QgVCYgeCkgOiBTdHJpbmdWaWV3KHguZGF0
YSwgeC5zaXplKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKHguc2l6ZSA9PSAwIHx8IHguZGF0YSAh
PSBudWxscHRyKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBTdHJpbmdWaWV3IGZyb20gYSBudWxs
LXRlcm1pbmF0ZWQgQyBzdHJpbmcuCisgIC8vIERlbGliZXJhdGVseSBub3QgImV4cGxpY2l0Ii4K
KyAgU3RyaW5nVmlldyhjb25zdCBjaGFyKiBjc3RyKSA6IGRhdGFfKGNzdHIpLCBzaXplXyhzdHJs
ZW4oY3N0cikpIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soY3N0ciAhPSBudWxscHRyKTsKKyAgfQor
CisgIC8vIFRoaXMgaW5zdGVhZCBoYXMgdG8gYmUgZXhwbGljaXQsIGFzIGNyZWF0aW5nIGEgU3Ry
aW5nVmlldyBvdXQgb2YgYQorICAvLyBzdGQ6OnN0cmluZyBjYW4gYmUgc3VidGxlLgorICBleHBs
aWNpdCBTdHJpbmdWaWV3KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpCisgICAgICA6IGRhdGFfKHN0
ci5kYXRhKCkpLCBzaXplXyhzdHIuc2l6ZSgpKSB7fQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7
IHJldHVybiBzaXplXyA9PSAwOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6
ZV87IH0KKyAgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9CisgIGNv
bnN0IGNoYXIqIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZGF0YV87IH0KKyAgY29uc3QgY2hhciog
ZW5kKCkgY29uc3QgeyByZXR1cm4gZGF0YV8gKyBzaXplXzsgfQorCisgIGNoYXIgYXQoc2l6ZV90
IHBvcykgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSyhwb3MgPCBzaXplXyk7CisgICAgcmV0
dXJuIGRhdGFfW3Bvc107CisgIH0KKworICBzaXplX3QgZmluZChjaGFyIGMsIHNpemVfdCBzdGFy
dF9wb3MgPSAwKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaSA9IHN0YXJ0X3BvczsgaSA8IHNp
emVfOyArK2kpIHsKKyAgICAgIGlmIChkYXRhX1tpXSA9PSBjKQorICAgICAgICByZXR1cm4gaTsK
KyAgICB9CisgICAgcmV0dXJuIG5wb3M7CisgIH0KKworICBzaXplX3QgZmluZChjb25zdCBTdHJp
bmdWaWV3JiBzdHIsIHNpemVfdCBzdGFydF9wb3MgPSAwKSBjb25zdCB7CisgICAgaWYgKHN0YXJ0
X3BvcyA+IHNpemUoKSkKKyAgICAgIHJldHVybiBucG9zOworICAgIGF1dG8gaXQgPSBzdGQ6OnNl
YXJjaChiZWdpbigpICsgc3RhcnRfcG9zLCBlbmQoKSwgc3RyLmJlZ2luKCksIHN0ci5lbmQoKSk7
CisgICAgc2l6ZV90IHBvcyA9IHN0YXRpY19jYXN0PHNpemVfdD4oaXQgLSBiZWdpbigpKTsKKyAg
ICByZXR1cm4gcG9zICsgc3RyLnNpemUoKSA8PSBzaXplKCkgPyBwb3MgOiBucG9zOworICB9CisK
KyAgc2l6ZV90IGZpbmQoY29uc3QgY2hhciogc3RyLCBzaXplX3Qgc3RhcnRfcG9zID0gMCkgY29u
c3QgeworICAgIHJldHVybiBmaW5kKFN0cmluZ1ZpZXcoc3RyKSwgc3RhcnRfcG9zKTsKKyAgfQor
CisgIHNpemVfdCByZmluZChjaGFyIGMpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpID0gc2l6
ZV87IGkgPiAwOyAtLWkpIHsKKyAgICAgIGlmIChkYXRhX1tpIC0gMV0gPT0gYykKKyAgICAgICAg
cmV0dXJuIGkgLSAxOworICAgIH0KKyAgICByZXR1cm4gbnBvczsKKyAgfQorCisgIFN0cmluZ1Zp
ZXcgc3Vic3RyKHNpemVfdCBwb3MsIHNpemVfdCBjb3VudCA9IG5wb3MpIGNvbnN0IHsKKyAgICBp
ZiAocG9zID49IHNpemVfKQorICAgICAgcmV0dXJuIFN0cmluZ1ZpZXcoIiIsIDApOworICAgIHNp
emVfdCByY291bnQgPSBzdGQ6Om1pbihjb3VudCwgc2l6ZV8gLSBwb3MpOworICAgIHJldHVybiBT
dHJpbmdWaWV3KGRhdGFfICsgcG9zLCByY291bnQpOworICB9CisKKyAgYm9vbCBDYXNlSW5zZW5z
aXRpdmVFcShjb25zdCBTdHJpbmdWaWV3JiBvdGhlcikgeworICAgIGlmIChzaXplKCkgIT0gb3Ro
ZXIuc2l6ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzaXplKCkgPT0gMCkKKyAg
ICAgIHJldHVybiB0cnVlOworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4p
CisgICAgcmV0dXJuIF9zdHJuaWNtcChkYXRhKCksIG90aGVyLmRhdGEoKSwgc2l6ZSgpKSA9PSAw
OworI2Vsc2UKKyAgICByZXR1cm4gc3RybmNhc2VjbXAoZGF0YSgpLCBvdGhlci5kYXRhKCksIHNp
emUoKSkgPT0gMDsKKyNlbmRpZgorICB9CisKKyAgc3RkOjpzdHJpbmcgVG9TdGRTdHJpbmcoKSBj
b25zdCB7CisgICAgcmV0dXJuIGRhdGFfID09IG51bGxwdHIgPyAiIiA6IHN0ZDo6c3RyaW5nKGRh
dGFfLCBzaXplXyk7CisgIH0KKworICB1aW50NjRfdCBIYXNoKCkgY29uc3QgeworICAgIGJhc2U6
Okhhc2ggaGFzaGVyOworICAgIGhhc2hlci5VcGRhdGUoZGF0YV8sIHNpemVfKTsKKyAgICByZXR1
cm4gaGFzaGVyLmRpZ2VzdCgpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBkYXRh
XyA9IG51bGxwdHI7CisgIHNpemVfdCBzaXplXyA9IDA7Cit9OworCitpbmxpbmUgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IFN0cmluZ1ZpZXcmIHgsIGNvbnN0IFN0cmluZ1ZpZXcmIHkpIHsKKyAgaWYg
KHguc2l6ZSgpICE9IHkuc2l6ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKHguc2l6ZSgp
ID09IDApCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBtZW1jbXAoeC5kYXRhKCksIHkuZGF0
YSgpLCB4LnNpemUoKSkgPT0gMDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBT
dHJpbmdWaWV3JiB4LCBjb25zdCBTdHJpbmdWaWV3JiB5KSB7CisgIHJldHVybiAhKHggPT0geSk7
Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTdHJpbmdWaWV3JiB4LCBjb25zdCBT
dHJpbmdWaWV3JiB5KSB7CisgIGF1dG8gc2l6ZSA9IHN0ZDo6bWluKHguc2l6ZSgpLCB5LnNpemUo
KSk7CisgIGlmIChzaXplID09IDApCisgICAgcmV0dXJuIHguc2l6ZSgpIDwgeS5zaXplKCk7Cisg
IGludCByZXN1bHQgPSBtZW1jbXAoeC5kYXRhKCksIHkuZGF0YSgpLCBzaXplKTsKKyAgcmV0dXJu
IHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIHguc2l6ZSgpIDwgeS5zaXplKCkpOworfQor
CitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFN0cmluZ1ZpZXcmIHgsIGNvbnN0IFN0cmlu
Z1ZpZXcmIHkpIHsKKyAgcmV0dXJuICEoeCA8IHkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRv
cj4oY29uc3QgU3RyaW5nVmlldyYgeCwgY29uc3QgU3RyaW5nVmlldyYgeSkgeworICByZXR1cm4g
eSA8IHg7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU3RyaW5nVmlldyYgeCwg
Y29uc3QgU3RyaW5nVmlldyYgeSkgeworICByZXR1cm4gISh5IDwgeCk7Cit9CisKK30gIC8vIG5h
bWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworbmFtZXNwYWNlIHN0ZCB7
CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDw6OnBlcmZldHRvOjpiYXNlOjpTdHJpbmdWaWV3
PiB7CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IDo6cGVyZmV0dG86OmJhc2U6OlN0cmluZ1Zp
ZXcmIHN2KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oc3YuSGFzaCgp
KTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgIC8vIElOQ0xVREVf
UEVSRkVUVE9fRVhUX0JBU0VfU1RSSU5HX1ZJRVdfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVy
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91
IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl
bnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICog
ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV
bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs
IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl
ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP
TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp
Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xV
REVfUEVSRkVUVE9fRVhUX0JBU0VfU1RSSU5HX1VUSUxTX0hfCisjZGVmaW5lIElOQ0xVREVfUEVS
RkVUVE9fRVhUX0JBU0VfU1RSSU5HX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5j
bHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIu
aD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0
L2Jhc2Uvb3B0aW9uYWwuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2V4dC9iYXNlL3N0cmluZ192aWV3LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CituYW1lc3BhY2UgYmFzZSB7CisKK2lubGluZSBjaGFyIExvd2VyY2FzZShjaGFyIGMpIHsKKyAg
cmV0dXJuICgnQScgPD0gYyAmJiBjIDw9ICdaJykgPyBzdGF0aWNfY2FzdDxjaGFyPihjIC0gKCdB
JyAtICdhJykpIDogYzsKK30KKworaW5saW5lIGNoYXIgVXBwZXJjYXNlKGNoYXIgYykgeworICBy
ZXR1cm4gKCdhJyA8PSBjICYmIGMgPD0gJ3onKSA/IHN0YXRpY19jYXN0PGNoYXI+KGMgKyAoJ0En
IC0gJ2EnKSkgOiBjOworfQorCitpbmxpbmUgT3B0aW9uYWw8dWludDMyX3Q+IENTdHJpbmdUb1VJ
bnQzMihjb25zdCBjaGFyKiBzLCBpbnQgYmFzZSA9IDEwKSB7CisgIGNoYXIqIGVuZHB0ciA9IG51
bGxwdHI7CisgIGF1dG8gdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RydG91bChzLCAm
ZW5kcHRyLCBiYXNlKSk7CisgIHJldHVybiAoKnMgJiYgISplbmRwdHIpID8gYmFzZTo6bWFrZV9v
cHRpb25hbCh2YWx1ZSkgOiBiYXNlOjpudWxsb3B0OworfQorCitpbmxpbmUgT3B0aW9uYWw8aW50
MzJfdD4gQ1N0cmluZ1RvSW50MzIoY29uc3QgY2hhciogcywgaW50IGJhc2UgPSAxMCkgeworICBj
aGFyKiBlbmRwdHIgPSBudWxscHRyOworICBhdXRvIHZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJf
dD4oc3RydG9sKHMsICZlbmRwdHIsIGJhc2UpKTsKKyAgcmV0dXJuICgqcyAmJiAhKmVuZHB0cikg
PyBiYXNlOjptYWtlX29wdGlvbmFsKHZhbHVlKSA6IGJhc2U6Om51bGxvcHQ7Cit9CisKKy8vIE5v
dGU6IGl0IHNhdHVyYXRlcyB0byA3ZmZmZmZmZmZmZmZmZmZmIGlmIHBhcnNpbmcgYSBoZXggbnVt
YmVyID49IDB4ODAwMC4uLgoraW5saW5lIE9wdGlvbmFsPGludDY0X3Q+IENTdHJpbmdUb0ludDY0
KGNvbnN0IGNoYXIqIHMsIGludCBiYXNlID0gMTApIHsKKyAgY2hhciogZW5kcHRyID0gbnVsbHB0
cjsKKyAgYXV0byB2YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHN0cnRvbGwocywgJmVuZHB0
ciwgYmFzZSkpOworICByZXR1cm4gKCpzICYmICEqZW5kcHRyKSA/IGJhc2U6Om1ha2Vfb3B0aW9u
YWwodmFsdWUpIDogYmFzZTo6bnVsbG9wdDsKK30KKworaW5saW5lIE9wdGlvbmFsPHVpbnQ2NF90
PiBDU3RyaW5nVG9VSW50NjQoY29uc3QgY2hhciogcywgaW50IGJhc2UgPSAxMCkgeworICBjaGFy
KiBlbmRwdHIgPSBudWxscHRyOworICBhdXRvIHZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+
KHN0cnRvdWxsKHMsICZlbmRwdHIsIGJhc2UpKTsKKyAgcmV0dXJuICgqcyAmJiAhKmVuZHB0cikg
PyBiYXNlOjptYWtlX29wdGlvbmFsKHZhbHVlKSA6IGJhc2U6Om51bGxvcHQ7Cit9CisKK2lubGlu
ZSBPcHRpb25hbDxkb3VibGU+IENTdHJpbmdUb0RvdWJsZShjb25zdCBjaGFyKiBzKSB7CisgIGNo
YXIqIGVuZHB0ciA9IG51bGxwdHI7CisgIGRvdWJsZSB2YWx1ZSA9IHN0cnRvZChzLCAmZW5kcHRy
KTsKKyAgT3B0aW9uYWw8ZG91YmxlPiByZXN1bHQoYmFzZTo6bnVsbG9wdCk7CisgIGlmICgqcyAh
PSAnXDAnICYmICplbmRwdHIgPT0gJ1wwJykKKyAgICByZXN1bHQgPSB2YWx1ZTsKKyAgcmV0dXJu
IHJlc3VsdDsKK30KKworaW5saW5lIE9wdGlvbmFsPHVpbnQzMl90PiBTdHJpbmdUb1VJbnQzMihj
b25zdCBzdGQ6OnN0cmluZyYgcywgaW50IGJhc2UgPSAxMCkgeworICByZXR1cm4gQ1N0cmluZ1Rv
VUludDMyKHMuY19zdHIoKSwgYmFzZSk7Cit9CisKK2lubGluZSBPcHRpb25hbDxpbnQzMl90PiBT
dHJpbmdUb0ludDMyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBpbnQgYmFzZSA9IDEwKSB7CisgIHJl
dHVybiBDU3RyaW5nVG9JbnQzMihzLmNfc3RyKCksIGJhc2UpOworfQorCitpbmxpbmUgT3B0aW9u
YWw8dWludDY0X3Q+IFN0cmluZ1RvVUludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBpbnQgYmFz
ZSA9IDEwKSB7CisgIHJldHVybiBDU3RyaW5nVG9VSW50NjQocy5jX3N0cigpLCBiYXNlKTsKK30K
KworaW5saW5lIE9wdGlvbmFsPGludDY0X3Q+IFN0cmluZ1RvSW50NjQoY29uc3Qgc3RkOjpzdHJp
bmcmIHMsIGludCBiYXNlID0gMTApIHsKKyAgcmV0dXJuIENTdHJpbmdUb0ludDY0KHMuY19zdHIo
KSwgYmFzZSk7Cit9CisKK2lubGluZSBPcHRpb25hbDxkb3VibGU+IFN0cmluZ1RvRG91YmxlKGNv
bnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIHJldHVybiBDU3RyaW5nVG9Eb3VibGUocy5jX3N0cigp
KTsKK30KKworYm9vbCBTdGFydHNXaXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0
ZDo6c3RyaW5nJiBwcmVmaXgpOworYm9vbCBFbmRzV2l0aChjb25zdCBzdGQ6OnN0cmluZyYgc3Ry
LCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKK2Jvb2wgQ29udGFpbnMoY29uc3Qgc3RkOjpz
dHJpbmcmIGhheXN0YWNrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmVlZGxlKTsKK3NpemVfdCBGaW5k
KGNvbnN0IFN0cmluZ1ZpZXcmIG5lZWRsZSwgY29uc3QgU3RyaW5nVmlldyYgaGF5c3RhY2spOwor
Ym9vbCBDYXNlSW5zZW5zaXRpdmVFcXVhbChjb25zdCBzdGQ6OnN0cmluZyYgZmlyc3QsIGNvbnN0
IHN0ZDo6c3RyaW5nJiBzZWNvbmQpOworc3RkOjpzdHJpbmcgSm9pbihjb25zdCBzdGQ6OnZlY3Rv
cjxzdGQ6OnN0cmluZz4mIHBhcnRzLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmlu
ZyYgZGVsaW0pOworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNwbGl0U3RyaW5nKGNvbnN0IHN0
ZDo6c3RyaW5nJiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IHN0ZDo6c3RyaW5nJiBkZWxpbWl0ZXIpOworc3RkOjpzdHJpbmcgU3RyaXBQcmVmaXgoY29u
c3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCk7CitzdGQ6OnN0
cmluZyBTdHJpcFN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmlu
ZyYgc3VmZml4KTsKK3N0ZDo6c3RyaW5nIFRvTG93ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7
CitzdGQ6OnN0cmluZyBUb1VwcGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworc3RkOjpzdHJp
bmcgU3RyaXBDaGFycyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNo
YXIgcmVwbGFjZW1lbnQpOworc3RkOjpzdHJpbmcgVG9IZXgoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpOworaW5saW5lIHN0ZDo6c3RyaW5nIFRvSGV4KGNvbnN0IHN0ZDo6c3RyaW5nJiBz
KSB7CisgIHJldHVybiBUb0hleChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKK30KK3N0ZDo6c3RyaW5n
IEludFRvSGV4U3RyaW5nKHVpbnQzMl90IG51bWJlcik7CitzdGQ6OnN0cmluZyBSZXBsYWNlQWxs
KHN0ZDo6c3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJp
bmcmIHRvX3JlcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5n
JiByZXBsYWNlbWVudCk7CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1NUUklOR19V
VElMU19IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJj
ZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJz
aW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4
Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBh
IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9y
Zy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNh
YmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVk
IHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisg
KiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4
cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxh
bmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRo
ZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2V4dC9iYXNlL3N0cmluZ191dGlscy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+
CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8g
eworbmFtZXNwYWNlIGJhc2UgeworCitib29sIFN0YXJ0c1dpdGgoY29uc3Qgc3RkOjpzdHJpbmcm
IHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCkgeworICByZXR1cm4gc3RyLmNvbXBhcmUo
MCwgcHJlZml4Lmxlbmd0aCgpLCBwcmVmaXgpID09IDA7Cit9CisKK2Jvb2wgRW5kc1dpdGgoY29u
c3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgeworICBpZiAo
c3VmZml4LnNpemUoKSA+IHN0ci5zaXplKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4g
c3RyLmNvbXBhcmUoc3RyLnNpemUoKSAtIHN1ZmZpeC5zaXplKCksIHN1ZmZpeC5zaXplKCksIHN1
ZmZpeCkgPT0gMDsKK30KKworYm9vbCBDb250YWlucyhjb25zdCBzdGQ6OnN0cmluZyYgaGF5c3Rh
Y2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZWVkbGUpIHsKKyAgcmV0dXJuIGhheXN0YWNrLmZpbmQo
bmVlZGxlKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKK30KKworc2l6ZV90IEZpbmQoY29uc3QgU3Ry
aW5nVmlldyYgbmVlZGxlLCBjb25zdCBTdHJpbmdWaWV3JiBoYXlzdGFjaykgeworICBpZiAobmVl
ZGxlLnNpemUoKSA9PSAwKQorICAgIHJldHVybiAwOworICBpZiAobmVlZGxlLnNpemUoKSA+IGhh
eXN0YWNrLnNpemUoKSkKKyAgICByZXR1cm4gc3RkOjpzdHJpbmc6Om5wb3M7CisgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgaGF5c3RhY2suc2l6ZSgpIC0gKG5lZWRsZS5zaXplKCkgLSAxKTsgKytp
KSB7CisgICAgaWYgKHN0cm5jbXAoaGF5c3RhY2suZGF0YSgpICsgaSwgbmVlZGxlLmRhdGEoKSwg
bmVlZGxlLnNpemUoKSkgPT0gMCkKKyAgICAgIHJldHVybiBpOworICB9CisgIHJldHVybiBzdGQ6
OnN0cmluZzo6bnBvczsKK30KKworYm9vbCBDYXNlSW5zZW5zaXRpdmVFcXVhbChjb25zdCBzdGQ6
OnN0cmluZyYgZmlyc3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNvbmQpIHsKKyAgcmV0dXJuIGZp
cnN0LnNpemUoKSA9PSBzZWNvbmQuc2l6ZSgpICYmCisgICAgICAgICBzdGQ6OmVxdWFsKAorICAg
ICAgICAgICAgIGZpcnN0LmJlZ2luKCksIGZpcnN0LmVuZCgpLCBzZWNvbmQuYmVnaW4oKSwKKyAg
ICAgICAgICAgICBbXShjaGFyIGEsIGNoYXIgYikgeyByZXR1cm4gTG93ZXJjYXNlKGEpID09IExv
d2VyY2FzZShiKTsgfSk7Cit9CisKK3N0ZDo6c3RyaW5nIEpvaW4oY29uc3Qgc3RkOjp2ZWN0b3I8
c3RkOjpzdHJpbmc+JiBwYXJ0cywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcm
IGRlbGltKSB7CisgIHN0ZDo6c3RyaW5nIGFjYzsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBw
YXJ0cy5zaXplKCk7ICsraSkgeworICAgIGFjYyArPSBwYXJ0c1tpXTsKKyAgICBpZiAoaSArIDEg
IT0gcGFydHMuc2l6ZSgpKSB7CisgICAgICBhY2MgKz0gZGVsaW07CisgICAgfQorICB9CisgIHJl
dHVybiBhY2M7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTcGxpdFN0cmluZyhjb25z
dCBzdGQ6OnN0cmluZyYgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW1pdGVyKSB7CisgIFBFUkZFVFRPX0NIRUNLKCFkZWxp
bWl0ZXIuZW1wdHkoKSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dHB1dDsKKyAg
c2l6ZV90IHN0YXJ0ID0gMDsKKyAgc2l6ZV90IG5leHQ7CisgIGZvciAoOzspIHsKKyAgICBuZXh0
ID0gc3RkOjptaW4odGV4dC5maW5kKGRlbGltaXRlciwgc3RhcnQpLCB0ZXh0LnNpemUoKSk7Cisg
ICAgaWYgKG5leHQgPiBzdGFydCkKKyAgICAgIG91dHB1dC5lbXBsYWNlX2JhY2soJnRleHRbc3Rh
cnRdLCBuZXh0IC0gc3RhcnQpOworICAgIHN0YXJ0ID0gbmV4dCArIGRlbGltaXRlci5zaXplKCk7
CisgICAgaWYgKHN0YXJ0ID49IHRleHQuc2l6ZSgpKQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0
dXJuIG91dHB1dDsKK30KKworc3RkOjpzdHJpbmcgU3RyaXBQcmVmaXgoY29uc3Qgc3RkOjpzdHJp
bmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCkgeworICByZXR1cm4gU3RhcnRzV2l0
aChzdHIsIHByZWZpeCkgPyBzdHIuc3Vic3RyKHByZWZpeC5zaXplKCkpIDogc3RyOworfQorCitz
dGQ6OnN0cmluZyBTdHJpcFN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6
OnN0cmluZyYgc3VmZml4KSB7CisgIHJldHVybiBFbmRzV2l0aChzdHIsIHN1ZmZpeCkgPyBzdHIu
c3Vic3RyKDAsIHN0ci5zaXplKCkgLSBzdWZmaXguc2l6ZSgpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDogc3RyOworfQorCitzdGQ6OnN0cmluZyBUb1VwcGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiBzdHIpIHsKKyAgLy8gRG9uJ3QgdXNlIHRvdXBwZXIoKSwgaXQgZGVwZW5kcyBvbiB0
aGUgbG9jYWxlLgorICBzdGQ6OnN0cmluZyByZXMoc3RyKTsKKyAgYXV0byBlbmQgPSByZXMuZW5k
KCk7CisgIGZvciAoYXV0byBjID0gcmVzLmJlZ2luKCk7IGMgIT0gZW5kOyArK2MpCisgICAgKmMg
PSBVcHBlcmNhc2UoKmMpOworICByZXR1cm4gcmVzOworfQorCitzdGQ6OnN0cmluZyBUb0xvd2Vy
KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgLy8gRG9uJ3QgdXNlIHRvbG93ZXIoKSwgaXQg
ZGVwZW5kcyBvbiB0aGUgbG9jYWxlLgorICBzdGQ6OnN0cmluZyByZXMoc3RyKTsKKyAgYXV0byBl
bmQgPSByZXMuZW5kKCk7CisgIGZvciAoYXV0byBjID0gcmVzLmJlZ2luKCk7IGMgIT0gZW5kOyAr
K2MpCisgICAgKmMgPSBMb3dlcmNhc2UoKmMpOworICByZXR1cm4gcmVzOworfQorCitzdGQ6OnN0
cmluZyBUb0hleChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzdGQ6OnN0cmlu
ZyBoZXgoMiAqIHNpemUgKyAxLCAneCcpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7
ICsraSkgeworICAgIC8vIHNucHJpbnRmIHByaW50cyAzIGNoYXJhY3RlcnMsIHRoZSB0d28gaGV4
IGRpZ2l0cyBhbmQgYSBudWxsIGJ5dGUuIEFzIHdlCisgICAgLy8gd3JpdGUgbGVmdCB0byByaWdo
dCwgd2Uga2VlcCBvdmVyd3JpdGluZyB0aGUgbnVsbGJ5dGVzLCBleGNlcHQgZm9yIHRoZQorICAg
IC8vIGxhc3QgY2FsbCB0byBzbnByaW50Zi4KKyAgICBzbnByaW50ZigmKGhleFsyICogaV0pLCAz
LCAiJTAyaGh4IiwgZGF0YVtpXSk7CisgIH0KKyAgLy8gUmVtb3ZlIHRoZSB0cmFpbGluZyBudWxs
Ynl0ZSBwcm9kdWNlZCBieSB0aGUgbGFzdCBzbnByaW50Zi4KKyAgaGV4LnJlc2l6ZSgyICogc2l6
ZSk7CisgIHJldHVybiBoZXg7Cit9CisKK3N0ZDo6c3RyaW5nIEludFRvSGV4U3RyaW5nKHVpbnQz
Ml90IG51bWJlcikgeworICBzaXplX3QgbWF4X3NpemUgPSAxMTsgIC8vIE1heCB1aW50MzIgaXMg
MHhGRkZGRkZGRiArIDEgZm9yIG51bGwgYnl0ZS4KKyAgc3RkOjpzdHJpbmcgYnVmOworICBidWYu
cmVzaXplKG1heF9zaXplKTsKKyAgYXV0byBmaW5hbF9zaXplID0gc25wcmludGYoJmJ1ZlswXSwg
bWF4X3NpemUsICIweCUwMngiLCBudW1iZXIpOworICBQRVJGRVRUT19EQ0hFQ0soZmluYWxfc2l6
ZSA+PSAwKTsKKyAgYnVmLnJlc2l6ZShzdGF0aWNfY2FzdDxzaXplX3Q+KGZpbmFsX3NpemUpKTsg
IC8vIEN1dHMgb2ZmIHRoZSBmaW5hbCBudWxsIGJ5dGUuCisgIHJldHVybiBidWY7Cit9CisKK3N0
ZDo6c3RyaW5nIFN0cmlwQ2hhcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwKKyAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNoYXJzLAorICAgICAgICAgICAgICAgICAg
ICAgICBjaGFyIHJlcGxhY2VtZW50KSB7CisgIHN0ZDo6c3RyaW5nIHJlcyhzdHIpOworICBjb25z
dCBjaGFyKiBzdGFydCA9IHJlcy5jX3N0cigpOworICBjb25zdCBjaGFyKiByZW1vdmUgPSBjaGFy
cy5jX3N0cigpOworICBmb3IgKGNvbnN0IGNoYXIqIGMgPSBzdHJwYnJrKHN0YXJ0LCByZW1vdmUp
OyBjOyBjID0gc3RycGJyayhjICsgMSwgcmVtb3ZlKSkKKyAgICByZXNbc3RhdGljX2Nhc3Q8dWlu
dHB0cl90PihjIC0gc3RhcnQpXSA9IHJlcGxhY2VtZW50OworICByZXR1cm4gcmVzOworfQorCitz
dGQ6OnN0cmluZyBSZXBsYWNlQWxsKHN0ZDo6c3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRvX3JlcGxhY2UsCisgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXBsYWNlbWVudCkgeworICBQRVJGRVRUT19DSEVDSygh
dG9fcmVwbGFjZS5lbXB0eSgpKTsKKyAgc2l6ZV90IHBvcyA9IDA7CisgIHdoaWxlICgocG9zID0g
c3RyLmZpbmQodG9fcmVwbGFjZSwgcG9zKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBz
dHIucmVwbGFjZShwb3MsIHRvX3JlcGxhY2UubGVuZ3RoKCksIHJlcGxhY2VtZW50KTsKKyAgICBw
b3MgKz0gcmVwbGFjZW1lbnQubGVuZ3RoKCk7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworfSAg
Ly8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL2Jhc2Uvc3RyaW5nX3ZpZXcuY2MKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExp
Y2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5z
ZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3
aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl
IGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0y
LjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRv
IGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBp
cyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVT
IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisg
KiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVy
bWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9z
dHJpbmdfdmlldy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2Ugewor
CisvLyBzdGF0aWMKK2NvbnN0ZXhwciBzaXplX3QgU3RyaW5nVmlldzo6bnBvczsKKworfSAgLy8g
bmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIHNvdXJjZTogc3JjL2Jhc2Uvc3VicHJvY2Vzcy5jYworLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQvYmFzZS9zdWJwcm9jZXNzLmgK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS9w
cm9jX3V0aWxzLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBT
b3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwg
VmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmls
ZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRh
aW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNo
ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw
bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli
dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT
LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl
ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp
YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl
ciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9QUk9D
X1VUSUxTX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9QUk9DX1VUSUxTX0hfCisK
KyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKworI2lmIFBFUkZFVFRPX0JVSUxE
RkxBRyhQRVJGRVRUT19PU19XSU4pCisjaW5jbHVkZSA8V2luZG93cy5oPgorI2luY2x1ZGUgPHBy
b2Nlc3N0aHJlYWRzYXBpLmg+CisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1Nf
RlVDSFNJQSkKKyNpbmNsdWRlIDx6aXJjb24vcHJvY2Vzcy5oPgorI2luY2x1ZGUgPHppcmNvbi90
eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBF
UkZFVFRPX09TX0ZVQ0hTSUEpCit1c2luZyBQbGF0Zm9ybVByb2Nlc3NJZCA9IHp4X2hhbmRsZV90
OworaW5saW5lIFBsYXRmb3JtUHJvY2Vzc0lkIEdldFByb2Nlc3NJZCgpIHsKKyAgcmV0dXJuIHp4
X3Byb2Nlc3Nfc2VsZigpOworfQorI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09T
X1dJTikKK3VzaW5nIFBsYXRmb3JtUHJvY2Vzc0lkID0gdWludDY0X3Q7CitpbmxpbmUgUGxhdGZv
cm1Qcm9jZXNzSWQgR2V0UHJvY2Vzc0lkKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0
X3Q+KEdldEN1cnJlbnRQcm9jZXNzSWQoKSk7Cit9CisjZWxzZQordXNpbmcgUGxhdGZvcm1Qcm9j
ZXNzSWQgPSBwaWRfdDsKK2lubGluZSBQbGF0Zm9ybVByb2Nlc3NJZCBHZXRQcm9jZXNzSWQoKSB7
CisgIHJldHVybiBnZXRwaWQoKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19C
QVNFX1BST0NfVVRJTFNfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1
ZGUvcGVyZmV0dG8vZXh0L2Jhc2UvcGlwZS5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRo
ZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUg
QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkg
bm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4K
KyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAg
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNz
IHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0
d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24g
YW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9G
IEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNl
IGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICog
bGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BF
UkZFVFRPX0VYVF9CQVNFX1BJUEVfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFT
RV9QSVBFX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2V4dC9iYXNlL3Njb3BlZF9maWxlLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgYmFzZSB7CisKK2NsYXNzIFBpcGUgeworIHB1YmxpYzoKKyAgZW51bSBGbGFncyB7Cisg
ICAga0JvdGhCbG9jayA9IDAsCisgICAga0JvdGhOb25CbG9jaywKKyAgICBrUmROb25CbG9jaywK
KyAgICBrV3JOb25CbG9jaywKKyAgfTsKKworICBzdGF0aWMgUGlwZSBDcmVhdGUoRmxhZ3MgPSBr
Qm90aEJsb2NrKTsKKworICBQaXBlKCk7CisgIFBpcGUoUGlwZSYmKSBub2V4Y2VwdDsKKyAgUGlw
ZSYgb3BlcmF0b3I9KFBpcGUmJik7CisKKyAgU2NvcGVkRmlsZSByZDsKKyAgU2NvcGVkRmlsZSB3
cjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8K
KworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1BJUEVfSF8KKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAq
IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGlj
ZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5j
ZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNl
bnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5T
RS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVk
IHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5z
ZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5U
SUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQu
CisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcg
cGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwor
CisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfU1VCUFJPQ0VTU19IXworI2RlZmlu
ZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1NVQlBST0NFU1NfSF8KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIK
KworLy8gVGhpcyBpcyBhICNpZiBhcyBvcHBvc2l0ZSB0byBhIEdOIGNvbmRpdGlvbiwgYmVjYXVz
ZSBHTiBjb25kaXRpb25zIGFyZW4ndCBwcm9wYWdhdGVkIHdoZW4KKy8vIHRyYW5zbGF0aW5nIHRv
IEJhemVsIG9yIG90aGVyIGJ1aWxkIHN5c3RlbXMsIGFzIHRoZXkgZ2V0IHJlc29sdmVkIGF0IHRy
YW5zbGF0aW9uIHRpbWUuIFdpdGhvdXQKKy8vIHRoaXMsIHRoZSBCYXplbCBidWlsZCBicmVha3Mg
b24gV2luZG93cy4KKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTElOVVgpIHx8
ICAgXAorICAgIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKSB8fCBcCisg
ICAgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX01BQ09TWCkKKyNkZWZpbmUgUEVSRkVU
VE9fSEFTX1NVQlBST0NFU1MoKSAxCisjZWxzZQorI2RlZmluZSBQRVJGRVRUT19IQVNfU1VCUFJP
Q0VTUygpIDAKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpbml0
aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5j
bHVkZSA8dmVjdG9yPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL2Jhc2UvcHJvY191dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvcGlwZS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2Uvc2NvcGVkX2ZpbGUu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gSGFuZGxl
cyBjcmVhdGlvbiBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgb2Ygc3VicHJvY2Vzc2VzLCB0YWtp
bmcgY2FyZSBvZgorLy8gYWxsIHN1YnRsZXRpZXMgaW52b2x2ZWQgaW4gaGFuZGxpbmcgcHJvY2Vz
c2VzIG9uIFVOSVguCisvLyBUaGlzIGNsYXNzIGFsbG93cyB0byBkZWFsIHdpdGggbWFjcm8gdHdv
IHVzZS1jYXNlczoKKy8vIDEpIGZvcmsoKSArIGV4ZWMoKSBlcXVpdmFsZW50OiBmb3Igc3Bhd25p
bmcgYSBicmFuZCBuZXcgcHJvY2VzcyBpbWFnZS4KKy8vICAgIFRoaXMgaGFwcGVucyB3aGVuIHxh
cmdzLmV4ZWNfY21kfCBpcyBub3QgZW1wdHkuCisvLyAgICBUaGlzIGlzIHNhZmUgdG8gdXNlIGV2
ZW4gaW4gYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4KKy8vIDIpIGZvcmsoKTogZm9yIHNw
YXduaW5nIGEgcHJvY2VzcyBhbmQgcnVubmluZyBhIGZ1bmN0aW9uLgorLy8gICAgVGhpcyBoYXBw
ZW5zIHdoZW4gfGFyZ3MuZW50cnlwb2ludF9mb3JfdGVzdGluZ3wgaXMgbm90IGVtcHR5LgorLy8g
ICAgVGhpcyBpcyBpbnRlbmRlZCBvbmx5IGZvciB0ZXN0cyBhcyBpdCBpcyBleHRyZW1lbHkgc3Vi
dGxlLgorLy8gICAgVGhpcyBtb2RlIG11c3QgYmUgdXNlZCB3aXRoIGV4dHJlbWUgY2FyZS4gQmVm
b3JlIHRoZSBlbnRyeXBvaW50IGlzCisvLyAgICBpbnZva2VkIGFsbCBmaWxlIGRlc2NyaXB0b3Jz
IG90aGVyIHRoYW4gc3RkaW4vb3V0L2VyciBhbmQgdGhlIG9uZXMKKy8vICAgIHNwZWNpZmllZCBp
biB8YXJncy5wcmVzZXJ2ZV9mZHN8IHdpbGwgYmUgY2xvc2VkLCB0byBhdm9pZCBlYWNoIHByb2Nl
c3MKKy8vICAgIHJldGFpbmluZyBhIGR1cGUgb2Ygb3RoZXIgc3VicHJvY2Vzc2VzIHBpcGVzLiBU
aGlzIGhvd2V2ZXIgbWVhbnMgdGhhdAorLy8gICAgYW55IG5vbiB0cml2aWFsIGNhbGxzIChpbmNs
dWRpbmcgbG9nZ2luZykgbXVzdCBiZSBhdm9pZGVkIGFzIHRoZXkgbWlnaHQKKy8vICAgIHJlZmVy
IHRvIEZEcyB0aGF0IGFyZSBub3cgY2xvc2VkLiBUaGUgZW50cnlwb2ludCBzaG91bGQgcmVhbGx5
IGJlIHVzZWQKKy8vICAgIGp1c3QgdG8gc2lnbmFsIGEgcGlwZSBvciBzaW1pbGFyIGZvciBzeW5j
aHJvbml6aW5nIHNlcXVlbmNpbmcgaW4gdGVzdHMuCisKKy8vCisvLyBUaGlzIGNsYXNzIGFsbG93
cyB0byBjb250cm9sIHN0ZGluL291dC9lcnIgcGlwZSByZWRpcmVjdGlvbiBhbmQgdGFrZXMgY2Fy
ZQorLy8gb2Yga2VlcGluZyBhbGwgdGhlIHBpcGVzIHB1bXBlZCAoc3RkaW4pIC8gZHJhaW5lZCAo
c3Rkb3V0L2VyciksIGluIGEgc2ltaWxhcgorLy8gZmFzaGlvbiBvZiBweXRob24ncyBzdWJwcm9j
ZXNzLkNvbW11bmljYXRlKCkKKy8vIHN0ZGluOiBpcyBhbHdheXMgcGlwZWQgYW5kIGNsb3NlZCBv
bmNlIHRoZSB8YXJncy5pbnB1dHwgYnVmZmVyIGlzIHdyaXR0ZW4uCisvLyBzdGRvdXQvZXJyIGNh
biBiZSBlaXRoZXI6CisvLyAgIC0gZHVwKCllZCBvbnRvIHRoZSBwYXJlbnQgcHJvY2VzcyBzdGRv
dXQvZXJyLgorLy8gICAtIHJlZGlyZWN0ZWQgb250byAvZGV2L251bGwuCisvLyAgIC0gcGlwZWQg
b250byBhIGJ1ZmZlciAoc2VlIG91dHB1dCgpIG1ldGhvZCkuIFRoZXJlIGlzIG9ubHkgb25lIG91
dHB1dAorLy8gICAgIGJ1ZmZlciBpbiB0b3RhbC4gSWYgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBh
cmUgc2V0IHRvIGtCdWZmZXIgbW9kZSwgdGhleQorLy8gICAgIHdpbGwgYmUgbWVyZ2VkIG9udG8g
dGhlIHNhbWUuIFRoZXJlIGRvZXNuJ3Qgc2VlbSBhbnkgdXNlIGNhc2Ugd2hlcmUgdGhleQorLy8g
ICAgIGFyZSBuZWVkZWQgZGlzdGluY3RseS4KKy8vCisvLyBTb21lIGNhdmVhdHMgd29ydGggbWVu
dGlvbmluZzoKKy8vIC0gSXQgYWx3YXlzIHdhaXRwaWQoKXMsIHRvIGF2b2lkIGxlYXZpbmcgem9t
YmllcyBhcm91bmQuIElmIHRoZSBwcm9jZXNzIGlzCisvLyAgIG5vdCB0ZXJtaW5hdGVkIGJ5IHRo
ZSB0aW1lIHRoZSBkZXN0cnVjdG9yIGlzIHJlYWNoZWQsIHRoZSBkdG9yIHdpbGwKKy8vICAgc2Vu
ZCBhIFNJR0tJTEwgYW5kIHdhaXQgZm9yIHRoZSB0ZXJtaW5hdGlvbi4KKy8vIC0gQWZ0ZXIgZm9y
aygpLWluZyBpdCB3aWxsIGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzLCBwcmVzZXJ2aW5nIG9u
bHkKKy8vICAgc3RkaW4vb3V0L2VyciBhbmQgdGhlIGZkcyBsaXN0ZWQgaW4gfGFyZ3MucHJlc2Vy
dmVfZmRzfC4KKy8vIC0gT24gTGludXgvQW5kcm9pZCwgdGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBi
ZSBTSUdLSUxMLWVkIGlmIHRoZSBjYWxsaW5nCisvLyAgIHRocmVhZCBleGlzdHMsIGV2ZW4gaWYg
dGhlIFN1YnByb2Nlc3MgaXMgc3RkOjptb3ZlKCktZCBvbnRvIGFub3RoZXIgdGhyZWFkLgorLy8g
ICBUaGlzIGhhcHBlbnMgYnkgdmlydHVlIFBSX1NFVF9QREVBVEhTSUcsIHdoaWNoIGlzIHVzZWQg
dG8gYXZvaWQgdGhhdAorLy8gICBjaGlsZCBwcm9jZXNzZXMgYXJlIGxlYWtlZCBpbiB0aGUgY2Fz
ZSBvZiBhIGNyYXNoIG9mIHRoZSBwYXJlbnQgKGZyZXF1ZW50CisvLyAgIGluIHRlc3RzKS4gSG93
ZXZlciwgdGhlIGNoaWxkIHByb2Nlc3MgbWlnaHQgc3RpbGwgYmUgbGVha2VkIGlmIGV4ZWNpbmcK
Ky8vICAgYSBzZXR1aWQvc2V0Z2lkIGJpbmFyeSAoc2VlIG1hbiAyIHByY3RsKS4KKy8vCisvLyBV
c2FnZToKKy8vIGJhc2U6OlN1YnByb2Nlc3MgcCh7Ii9iaW4vY2F0IiwgIi0ifSk7CisvLyAob3Ig
ZXF1aXZhbGVudGx5OgorLy8gICAgIGJhc2U6OlN1YnByb2Nlc3MgcDsKKy8vICAgICBwLmFyZ3Mu
ZXhlY19jbWQucHVzaF9iYWNrKCIvYmluL2NhdCIpOworLy8gICAgIHAuYXJncy5leGVjX2NtZC5w
dXNoX2JhY2soIi0iKTsKKy8vICApCisvLyBwLmFyZ3Muc3Rkb3V0X21vZGUgPSBiYXNlOjpTdWJw
cm9jZXNzOjprQnVmZmVyOworLy8gcC5hcmdzLnN0ZGVycl9tb2RlID0gYmFzZTo6U3VicHJvY2Vz
czo6a0luaGVyaXQ7CisvLyBwLmFyZ3MuaW5wdXQgPSAic3RkaW4gY29udGVudHMiOworLy8gcC5D
YWxsKCk7CisvLyAob3IgZXF1aXZhbGVudGx5OgorLy8gICAgIHAuU3RhcnQoKTsKKy8vICAgICBw
LldhaXQoKTsKKy8vICkKKy8vIEVYUEVDVF9FUShwLnN0YXR1cygpLCBiYXNlOjpTdWJwcm9jZXNz
OjprRXhpdGVkKTsKKy8vIEVYUEVDVF9FUShwLnJldHVybmNvZGUoKSwgMCk7CitjbGFzcyBTdWJw
cm9jZXNzIHsKKyBwdWJsaWM6CisgIGVudW0gU3RhdHVzIHsKKyAgICBrTm90U3RhcnRlZCA9IDAs
ICAvLyBCZWZvcmUgY2FsbGluZyBTdGFydCgpIG9yIENhbGwoKS4KKyAgICBrUnVubmluZywgICAg
ICAgICAvLyBBZnRlciBjYWxsaW5nIFN0YXJ0KCksIGJlZm9yZSBXYWl0KCkuCisgICAga0V4aXRl
ZCwgICAgICAgICAgLy8gVGhlIHN1YnByb2Nlc3MgZXhpdGVkIChlaXRoZXIgc3VjY2VzdWxseSBv
ciBub3QpLgorICAgIGtLaWxsZWRCeVNpZ25hbCwgIC8vIFRoZSBzdWJwcm9jZXNzIGhhcyBiZWVu
IGtpbGxlZCBieSBhIHNpZ25hbC4KKyAgfTsKKworICBlbnVtIE91dHB1dE1vZGUgeworICAgIGtJ
bmhlcml0ID0gMCwgIC8vIEluaGVyaXQncyB0aGUgY2FsbGVyIHByb2Nlc3Mgc3Rkb3V0L3N0ZGVy
ci4KKyAgICBrRGV2TnVsbCwgICAgICAvLyBkdXAoKSBvbnRvIC9kZXYvbnVsbAorICAgIGtCdWZm
ZXIgICAgICAgIC8vIGR1cCgpIG9udG8gYSBwaXBlIGFuZCBtb3ZlIGl0IGludG8gdGhlIG91dHB1
dCgpIGJ1ZmZlci4KKyAgfTsKKworICAvLyBJbnB1dCBhcmd1bWVudHMgZm9yIGNvbmZpZ3VyaW5n
IHRoZSBzdWJwcm9jZXNzIGJlaGF2aW9yLgorICBzdHJ1Y3QgQXJncyB7CisgICAgQXJncyhzdGQ6
OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpzdHJpbmc+IF9jbWQgPSB7fSkgOiBleGVjX2NtZChfY21k
KSB7fQorICAgIEFyZ3MoQXJncyYmKSBub2V4Y2VwdDsKKyAgICBBcmdzJiBvcGVyYXRvcj0oQXJn
cyYmKTsKKyAgICAvLyBJZiBub24tZW1wdHkgdGhpcyB3aWxsIGNhdXNlIGFuIGV4ZWMoKSB3aGVu
IFN0YXJ0KCkvQ2FsbCgpIGFyZSBjYWxsZWQuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+
IGV4ZWNfY21kOworCisgICAgLy8gSWYgbm9uLWVtcHR5LCBpdCBjaGFuZ2VzIHRoZSBhcmd2WzBd
IGFyZ3VtZW50IHBhc3NlZCB0byBleGVjLiBJZgorICAgIC8vIHVuc2V0LCBhcmd2WzBdID09IGV4
ZWNfY21kWzBdLiBUaGlzIGlzIHRvIGhhbmRsZSBjYXNlcyBsaWtlOgorICAgIC8vIGV4ZWNfY21k
ID0geyIvcHJvYy9zZWxmL2V4ZWMifSwgYXJndjA6ICJteV9jdXN0b21fdGVzdF9vdmVycmlkZSIu
CisgICAgc3RkOjpzdHJpbmcgYXJndjBfb3ZlcnJpZGU7CisKKyAgICAvLyBJZiBub24tZW1wdHkg
dGhpcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGZvcmsoKS1lZCBjaGlsZCBwcm9jZXNzLCBhZnRl
cgorICAgIC8vIHN0ZGluL291dC9lcnIgaGFzIGJlZW4gcmVkaXJlY3RlZCBhbmQgYWxsIG90aGVy
IGZpbGUgZGVzY3JpcHRvciBhcmUKKyAgICAvLyBjbG9zZWQuCisgICAgLy8gSXQgaXMgdmFsaWQg
dG8gc3BlY2lmeSBib3RoIHxleGVjX2NtZHwgQU5EIHxlbnRyeXBvaW50X2Zvcl90ZXN0aW5nfC4K
KyAgICAvLyBJbiB0aGlzIGNhc2UgfGVudHJ5cG9pbnRfZm9yX3Rlc3Rpbmd8IHdpbGwgYmUgaW52
b2tlZCBqdXN0IGJlZm9yZSB0aGUKKyAgICAvLyBleGVjKCkgY2FsbCwgYnV0IGFmdGVyIGhhdmlu
ZyBjbG9zZWQgYWxsIGZkcyAlIHN0ZGluL291dC9lcnIuCisgICAgLy8gVGhpcyBpcyBmb3Igc3lu
Y2hyb25pemF0aW9uIGJhcnJpZXJzIGluIHRlc3RzLgorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgp
PiBlbnRyeXBvaW50X2Zvcl90ZXN0aW5nOworCisgICAgLy8gSWYgbm9uLWVtcHR5LCByZXBsYWNl
cyB0aGUgZW52aXJvbm1lbnQgcGFzc2VkIHRvIGV4ZWMoKS4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6
OnN0cmluZz4gZW52OworCisgICAgLy8gVGhlIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhpcyBsaXN0
IHdpbGwgbm90IGJlIGNsb3NlZC4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHByZXNlcnZlX2ZkczsK
KworICAgIC8vIFRoZSBkYXRhIHRvIHB1c2ggaW4gdGhlIGNoaWxkIHByb2Nlc3Mgc3RkaW4uCisg
ICAgc3RkOjpzdHJpbmcgaW5wdXQ7CisKKyAgICBPdXRwdXRNb2RlIHN0ZG91dF9tb2RlID0ga0lu
aGVyaXQ7CisgICAgT3V0cHV0TW9kZSBzdGRlcnJfbW9kZSA9IGtJbmhlcml0OworCisgICAgLy8g
UmV0dXJucyAiICIuam9pbihleGVjX2NtZCksIHF1b3RpbmcgYXJndW1lbnRzLgorICAgIHN0ZDo6
c3RyaW5nIEdldENtZFN0cmluZygpIGNvbnN0OworICB9OworCisgIGV4cGxpY2l0IFN1YnByb2Nl
c3Moc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nPiBleGVjX2NtZCA9IHt9KTsKKyAg
U3VicHJvY2VzcyhTdWJwcm9jZXNzJiYpIG5vZXhjZXB0OworICBTdWJwcm9jZXNzJiBvcGVyYXRv
cj0oU3VicHJvY2VzcyYmKTsKKyAgflN1YnByb2Nlc3MoKTsgIC8vIEl0IHdpbGwgS2lsbEFuZFdh
aXRGb3JUZXJtaW5hdGlvbigpIGlmIHN0aWxsIGFsaXZlLgorCisgIC8vIFN0YXJ0cyB0aGUgc3Vi
cHJvY2VzcyBidXQgZG9lc24ndCB3YWl0IGZvciBpdHMgdGVybWluYXRpb24uIFRoZSBjYWxsZXIK
KyAgLy8gaXMgZXhwZWN0ZWQgdG8gZWl0aGVyIGNhbGwgV2FpdCgpIG9yIFBvbGwoKSBhZnRlciB0
aGlzIGNhbGwuCisgIHZvaWQgU3RhcnQoKTsKKworICAvLyBXYWl0IGZvciBwcm9jZXNzIHRlcm1p
bmF0aW9uLiBDYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgorICAvLyBBcmdzOgorICAvLyAg
IHx0aW1lb3V0X21zfCA9IDA6IHdhaXQgaW5kZWZpbml0ZWx5LgorICAvLyAgIHx0aW1lb3V0X21z
fCA+IDA6IHdhaXQgZm9yIGF0IG1vc3QgfHRpbWVvdXRfbXN8LgorICAvLyBSZXR1cm5zOgorICAv
LyAgVHJ1ZTogVGhlIHByb2Nlc3MgdGVybWluYXRlZC4gU2VlIHN0YXR1cygpIGFuZCByZXR1cm5j
b2RlKCkuCisgIC8vICBGYWxzZTogVGltZW91dCByZWFjaGVkLCB0aGUgcHJvY2VzcyBpcyBzdGls
bCBydW5uaW5nLiBJbiB0aGlzIGNhc2UgdGhlCisgIC8vICAgICAgICAgcHJvY2VzcyB3aWxsIGJl
IGxlZnQgaW4gdGhlIGtSdW5uaW5nIHN0YXRlLgorICBib29sIFdhaXQoaW50IHRpbWVvdXRfbXMg
PSAwKTsKKworICAvLyBFcXVpdmFsZW50IG9mIFN0YXJ0KCkgKyBXYWl0KCk7CisgIC8vIFJldHVy
bnMgdHJ1ZSBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgY2xlYW5seSB3aXRoIHJldHVybiBjb2RlIDAu
IEZhbHNlIGluCisgIC8vIGFueSBvdGhlIGNhc2UuCisgIGJvb2wgQ2FsbChpbnQgdGltZW91dF9t
cyA9IDApOworCisgIFN0YXR1cyBQb2xsKCk7CisKKyAgLy8gU2VuZHMgYSBTSUdLSUxMIGFuZCB3
YWl0IHRvIHNlZSB0aGUgcHJvY2VzcyB0ZXJtaW5hdGlvbi4KKyAgdm9pZCBLaWxsQW5kV2FpdEZv
clRlcm1pbmF0aW9uKCk7CisKKyAgUGxhdGZvcm1Qcm9jZXNzSWQgcGlkKCkgY29uc3QgeyByZXR1
cm4gcGlkXzsgfQorICBTdGF0dXMgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gc3RhdHVzXzsgfQor
ICBpbnQgcmV0dXJuY29kZSgpIGNvbnN0IHsgcmV0dXJuIHJldHVybmNvZGVfOyB9CisKKyAgLy8g
VGhpcyBjb250YWlucyBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIChpZiB0aGUgY29ycmVzcG9uZGlu
ZyBfbW9kZSA9PQorICAvLyBrQnVmZmVyKS4gSXQncyBub24tY29uc3Qgc28gdGhlIGNhbGxlciBj
YW4gc3RkOjptb3ZlKCkgaXQuCisgIHN0ZDo6c3RyaW5nJiBvdXRwdXQoKSB7IHJldHVybiBvdXRw
dXRfOyB9CisKKyAgQXJncyBhcmdzOworCisgcHJpdmF0ZToKKyAgU3VicHJvY2Vzcyhjb25zdCBT
dWJwcm9jZXNzJikgPSBkZWxldGU7CisgIFN1YnByb2Nlc3MmIG9wZXJhdG9yPShjb25zdCBTdWJw
cm9jZXNzJikgPSBkZWxldGU7CisgIHZvaWQgVHJ5UHVzaFN0ZGluKCk7CisgIHZvaWQgVHJ5UmVh
ZFN0ZG91dEFuZEVycigpOworICB2b2lkIFRyeVJlYWRFeGl0U3RhdHVzKCk7CisgIHZvaWQgS2ls
bEF0TW9zdE9uY2UoKTsKKyAgYm9vbCBQb2xsSW50ZXJuYWwoaW50IHBvbGxfdGltZW91dF9tcyk7
CisKKyAgYmFzZTo6UGlwZSBzdGRpbl9waXBlXzsKKyAgYmFzZTo6UGlwZSBzdGRvdXRlcnJfcGlw
ZV87CisgIGJhc2U6OlBpcGUgZXhpdF9zdGF0dXNfcGlwZV87CisgIFBsYXRmb3JtUHJvY2Vzc0lk
IHBpZF87CisgIHNpemVfdCBpbnB1dF93cml0dGVuXyA9IDA7CisgIFN0YXR1cyBzdGF0dXNfID0g
a05vdFN0YXJ0ZWQ7CisgIGludCByZXR1cm5jb2RlXyA9IC0xOworICBzdGQ6OnN0cmluZyBvdXRw
dXRfOyAgLy8gU3RkaW4rc3RkZXJyLiBPbmx5IHdoZW4ga0J1ZmZlci4KKyAgc3RkOjp0aHJlYWQg
d2FpdHBpZF90aHJlYWRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVz
cGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfU1VC
UFJPQ0VTU19IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNv
dXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBW
ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxl
IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFp
biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hl
Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBs
aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs
CisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy
IGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj
IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVy
IHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2V4dC9iYXNlL3N1YnByb2Nlc3MuaCIKKworI2lmIFBFUkZFVFRPX0hBU19T
VUJQUk9DRVNTKCkKKworI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNp
bmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93
YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5j
bHVkZSA8dGhyZWFkPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3RpbWUuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3V0aWxzLmgiCisKKyNp
ZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTElOVVgpIHx8IFwKKyAgICBQRVJGRVRU
T19CVUlMREZMQUcoUEVSRkVUVE9fT1NfQU5EUk9JRCkKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4K
KyNlbmRpZgorCisvLyBJbiBNYWNPUyB0aGlzIGlzIG5vdCBkZWZpbmVkIGluIGFueSBoZWFkZXIu
CitleHRlcm4gIkMiIGNoYXIqKiBlbnZpcm9uOworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQ2hpbGRQcm9jZXNzQXJncyB7
CisgIFN1YnByb2Nlc3M6OkFyZ3MqIGNyZWF0ZV9hcmdzOworICBjb25zdCBjaGFyKiBleGVjX2Nt
ZCA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPGNoYXIqPiBhcmd2OworICBzdGQ6OnZlY3Rvcjxj
aGFyKj4gZW52OworICBpbnQgc3RkaW5fcGlwZV9yZCA9IC0xOworICBpbnQgc3Rkb3V0ZXJyX3Bp
cGVfd3IgPSAtMTsKK307CisKKy8vIERvbid0IGFkZCBhbnkgZHluYW1pYyBhbGxvY2F0aW9uIGlu
IHRoaXMgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSBpbnZva2VkCisvLyB1bmRlciBhIGZvcmsoKSwg
cG90ZW50aWFsbHkgaW4gYSBzdGF0ZSB3aGVyZSB0aGUgYWxsb2NhdG9yIGxvY2sgaXMgaGVsZC4K
K3ZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBDaGlsZFByb2Nlc3MoQ2hpbGRQcm9jZXNz
QXJncyogYXJncykgeworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19MSU5VWCkg
fHwgXAorICAgIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorICAvLyBJ
biBubyBjYXNlIHdlIHdhbnQgYSBjaGlsZCBwcm9jZXNzIHRvIG91dGxpdmUgaXRzIHBhcmVudCBw
cm9jZXNzLiBUaGlzIGlzCisgIC8vIHJlbGV2YW50IGZvciB0ZXN0cywgc28gdGhhdCBhIHRlc3Qg
ZmFpbHVyZS9jcmFzaCBkb2Vzbid0IGxlYXZlIGNoaWxkCisgIC8vIHByb2Nlc3NlcyBhcm91bmQg
dGhhdCBnZXQgcmVwYXJlbnRlZCB0byBpbml0LgorICBwcmN0bChQUl9TRVRfUERFQVRIU0lHLCBT
SUdLSUxMKTsKKyNlbmRpZgorCisgIGF1dG8gZGllID0gW2FyZ3NdKGNvbnN0IGNoYXIqIGVycikg
X19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSB7CisgICAgYmFzZTo6aWdub3JlX3Jlc3VsdCh3cml0
ZShhcmdzLT5zdGRvdXRlcnJfcGlwZV93ciwgZXJyLCBzdHJsZW4oZXJyKSkpOworICAgIGJhc2U6
Omlnbm9yZV9yZXN1bHQod3JpdGUoYXJncy0+c3Rkb3V0ZXJyX3BpcGVfd3IsICJcbiIsIDEpKTsK
KyAgICAvLyBGcm9tIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliYy9tYW51YWwvaHRt
bF9ub2RlL0V4aXQtU3RhdHVzLmh0bWwKKyAgICAvLyAiSW4gcGFydGljdWxhciwgdGhlIHZhbHVl
IDEyOCBpcyB1c2VkIHRvIGluZGljYXRlIGZhaWx1cmUgdG8gZXhlY3V0ZQorICAgIC8vIGFub3Ro
ZXIgcHJvZ3JhbSBpbiBhIHN1YnByb2Nlc3MuIFRoaXMgY29udmVudGlvbiBpcyBub3QgdW5pdmVy
c2FsbHkKKyAgICAvLyBvYmV5ZWQsIGJ1dCBpdCBpcyBhIGdvb2QgaWRlYSB0byBmb2xsb3cgaXQg
aW4geW91ciBwcm9ncmFtcy4iCisgICAgX2V4aXQoMTI4KTsKKyAgfTsKKworICBhdXRvIHNldF9m
ZF9jbG9zZV9vbl9leGVjID0gWyZkaWVdKGludCBmZCwgYm9vbCBjbG9zZV9vbl9leGVjKSB7Cisg
ICAgaW50IGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkQsIDApOworICAgIGlmIChmbGFncyA8IDAp
CisgICAgICBkaWUoImZjbnRsKEZfR0VURkQpIGZhaWxlZCIpOworICAgIGZsYWdzID0gY2xvc2Vf
b25fZXhlYyA/IChmbGFncyB8IEZEX0NMT0VYRUMpIDogKGZsYWdzICYgfkZEX0NMT0VYRUMpOwor
ICAgIGlmIChmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MpIDwgMCkKKyAgICAgIGRpZSgiZmNudGwo
Rl9TRVRGRCkgZmFpbGVkIik7CisgIH07CisKKyAgaWYgKGdldHBwaWQoKSA9PSAxKQorICAgIGRp
ZSgidGVybWluYXRpbmcgYmVjYXVzZSBwYXJlbnQgcHJvY2VzcyBkaWVkIik7CisKKyAgaWYgKGR1
cDIoYXJncy0+c3RkaW5fcGlwZV9yZCwgU1RESU5fRklMRU5PKSA9PSAtMSkKKyAgICBkaWUoIkZh
aWxlZCB0byBkdXAyKFNURElOKSIpOworICBjbG9zZShhcmdzLT5zdGRpbl9waXBlX3JkKTsKKwor
ICBzd2l0Y2ggKGFyZ3MtPmNyZWF0ZV9hcmdzLT5zdGRvdXRfbW9kZSkgeworICAgIGNhc2UgU3Vi
cHJvY2Vzczo6a0luaGVyaXQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIFN1YnByb2Nlc3M6OmtE
ZXZOdWxsOiB7CisgICAgICBpZiAoZHVwMihvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpLCBTVERP
VVRfRklMRU5PKSA9PSAtMSkKKyAgICAgICAgZGllKCJGYWlsZWQgdG8gZHVwMihTVERPVVQpIik7
CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBTdWJwcm9jZXNzOjprQnVmZmVyOgorICAg
ICAgaWYgKGR1cDIoYXJncy0+c3Rkb3V0ZXJyX3BpcGVfd3IsIFNURE9VVF9GSUxFTk8pID09IC0x
KQorICAgICAgICBkaWUoIkZhaWxlZCB0byBkdXAyKFNURE9VVCkiKTsKKyAgICAgIGJyZWFrOwor
ICB9CisKKyAgc3dpdGNoIChhcmdzLT5jcmVhdGVfYXJncy0+c3RkZXJyX21vZGUpIHsKKyAgICBj
YXNlIFN1YnByb2Nlc3M6OmtJbmhlcml0OgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTdWJwcm9j
ZXNzOjprRGV2TnVsbDogeworICAgICAgaWYgKGR1cDIob3BlbigiL2Rldi9udWxsIiwgT19SRFdS
KSwgU1RERVJSX0ZJTEVOTykgPT0gLTEpCisgICAgICAgIGRpZSgiRmFpbGVkIHRvIGR1cDIoU1RE
RVJSKSIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgU3VicHJvY2Vzczo6a0J1ZmZl
cjoKKyAgICAgIGlmIChkdXAyKGFyZ3MtPnN0ZG91dGVycl9waXBlX3dyLCBTVERFUlJfRklMRU5P
KSA9PSAtMSkKKyAgICAgICAgZGllKCJGYWlsZWQgdG8gZHVwMihTVERFUlIpIik7CisgICAgICBi
cmVhazsKKyAgfQorCisgIC8vIENsb3NlIGFsbCBGRHMgJSBzdGRpbi9vdXQvZXJyIGFuZCB0aGUg
b25lcyB0aGF0IHRoZSBjbGllbnQgZXhwbGljaXRseQorICAvLyBhc2tlZCB0byByZXRhaW4uIFRo
ZSByZWFzb24gZm9yIHRoaXMgaXMgdHdvZm9sZDoKKyAgLy8gMS4gRm9yIGV4ZWMtb25seSAoaS5l
LiBlbnRyeXBvaW50ID09IGVtcHR5KSBjYXNlczogaXQgYXZvaWRzIGxlYWtpbmcgRkRzCisgIC8v
ICAgIHRoYXQgZGlkbid0IGdldCBtYXJrZWQgYXMgT19DTE9FWEVDIGJ5IGFjY2lkZW50LgorICAv
LyAyLiBJbiBmb3JrKCkgbW9kZSAoZW50cnlwb2ludCBub3QgZW1wdHkpIGF2b2lkcyByZXRhaW5p
bmcgYSBkdXAgb2YgZXZlbnRmZHMKKyAgLy8gICAgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBwYXJl
bnQgcHJvY2VzcyB0byByZWNlaXZlIEVPRnMgKHRlc3RzIHVzdWFsbHkgdXNlCisgIC8vICAgIHBp
cGVzIGFzIGEgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbSBiZXR3ZWVuIHN1YnByb2Nlc3Nlcyku
CisgIGNvbnN0IGF1dG8mIHByZXNlcnZlX2ZkcyA9IGFyZ3MtPmNyZWF0ZV9hcmdzLT5wcmVzZXJ2
ZV9mZHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICBpZiAoaSAhPSBT
VERJTl9GSUxFTk8gJiYgaSAhPSBTVERFUlJfRklMRU5PICYmIGkgIT0gU1RET1VUX0ZJTEVOTyAm
JgorICAgICAgICBpICE9IGFyZ3MtPnN0ZG91dGVycl9waXBlX3dyICYmCisgICAgICAgICFzdGQ6
OmNvdW50KHByZXNlcnZlX2Zkcy5iZWdpbigpLCBwcmVzZXJ2ZV9mZHMuZW5kKCksIGkpKSB7Cisg
ICAgICBjbG9zZShpKTsKKyAgICB9CisgIH0KKworICAvLyBDbGVhcnMgT19DTE9FWEVDIGZyb20g
c3RkaW4vb3V0L2Vyci4gVGhlc2UgYXJlIHRoZSBvbmx5IEZEcyB0aGF0IHdlIHdhbnQKKyAgLy8g
dG8gYmUgcHJlc2VydmVkIGFmdGVyIHRoZSBleGVjKCkuCisgIHNldF9mZF9jbG9zZV9vbl9leGVj
KFNURElOX0ZJTEVOTywgZmFsc2UpOworICBzZXRfZmRfY2xvc2Vfb25fZXhlYyhTVERPVVRfRklM
RU5PLCBmYWxzZSk7CisgIHNldF9mZF9jbG9zZV9vbl9leGVjKFNUREVSUl9GSUxFTk8sIGZhbHNl
KTsKKworICAvLyBJZiB0aGUgY2FsbGVyIHNwZWNpZmllZCBhIHN0ZDo6ZnVuY3Rpb24gZW50cnlw
b2ludCwgcnVuIHRoYXQgZmlyc3QuCisgIGlmIChhcmdzLT5jcmVhdGVfYXJncy0+ZW50cnlwb2lu
dF9mb3JfdGVzdGluZykKKyAgICBhcmdzLT5jcmVhdGVfYXJncy0+ZW50cnlwb2ludF9mb3JfdGVz
dGluZygpOworCisgIC8vIElmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIG9ubHkgYW4gZW50cnlwb2lu
dCwgd2l0aG91dCBhbnkgYXJncywgZXhpdCBub3cuCisgIC8vIE90aGVyd2lzZSBwcm9jZWVkIHdp
dGggdGhlIGV4ZWMoKSBiZWxvdy4KKyAgaWYgKCFhcmdzLT5leGVjX2NtZCkKKyAgICBfZXhpdCgw
KTsKKworICAvLyBJZiB8YXJnc1swXXwgaXMgYSBwYXRoIHVzZSBleGVjdigpICh3aGljaCB0YWtl
cyBhIHBhdGgpLCBvdGhld2lzZSB1c2UKKyAgLy8gZXhldnAoKSwgd2hpY2ggdXNlcyB0aGUgc2hl
bGwgYW5kIGZvbGxvd3MgUEFUSC4KKyAgaWYgKHN0cmNocihhcmdzLT5leGVjX2NtZCwgJy8nKSkg
eworICAgIGNoYXIqKiBlbnYgPSBhcmdzLT5lbnYuZW1wdHkoKSA/IGVudmlyb24gOiBhcmdzLT5l
bnYuZGF0YSgpOworICAgIGV4ZWN2ZShhcmdzLT5leGVjX2NtZCwgYXJncy0+YXJndi5kYXRhKCks
IGVudik7CisgIH0gZWxzZSB7CisgICAgLy8gVGhlcmUgaXMgbm8gZXhlY3ZwZSgpIG9uIE1hYy4K
KyAgICBpZiAoIWFyZ3MtPmVudi5lbXB0eSgpKQorICAgICAgZGllKCJBIGZ1bGwgcGF0aCBpcyBy
ZXF1aXJlZCBmb3IgfGV4ZWNfY21kfCB3aGVuIHNldHRpbmcgfGVudnwiKTsKKyAgICBleGVjdnAo
YXJncy0+ZXhlY19jbWQsIGFyZ3MtPmFyZ3YuZGF0YSgpKTsKKyAgfQorCisgIC8vIFJlYWNoZWQg
b25seSBpZiBleGVjdiBmYWlscy4KKyAgZGllKCJleGVjdmUoKSBmYWlsZWQiKTsKK30KKworfSAg
Ly8gbmFtZXNwYWNlCisKK1N1YnByb2Nlc3M6OkFyZ3M6OkFyZ3MoQXJncyYmKSBub2V4Y2VwdCA9
IGRlZmF1bHQ7CitTdWJwcm9jZXNzOjpBcmdzJiBTdWJwcm9jZXNzOjpBcmdzOjpvcGVyYXRvcj0o
QXJncyYmKSA9IGRlZmF1bHQ7CisKK1N1YnByb2Nlc3M6OlN1YnByb2Nlc3Moc3RkOjppbml0aWFs
aXplcl9saXN0PHN0ZDo6c3RyaW5nPiBfYXJncykKKyAgICA6IGFyZ3MoX2FyZ3MpIHt9CisKK1N1
YnByb2Nlc3M6OlN1YnByb2Nlc3MoU3VicHJvY2VzcyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitT
dWJwcm9jZXNzJiBTdWJwcm9jZXNzOjpvcGVyYXRvcj0oU3VicHJvY2VzcyYmKSA9IGRlZmF1bHQ7
CisKK1N1YnByb2Nlc3M6On5TdWJwcm9jZXNzKCkgeworICBpZiAoc3RhdHVzXyA9PSBrUnVubmlu
ZykKKyAgICBLaWxsQW5kV2FpdEZvclRlcm1pbmF0aW9uKCk7CisgIFBFUkZFVFRPX0NIRUNLKCF3
YWl0cGlkX3RocmVhZF8uam9pbmFibGUoKSk7Cit9CisKK3ZvaWQgU3VicHJvY2Vzczo6U3RhcnQo
KSB7CisgIENoaWxkUHJvY2Vzc0FyZ3MgcHJvY19hcmdzOworICBwcm9jX2FyZ3MuY3JlYXRlX2Fy
Z3MgPSAmYXJnczsKKworICAvLyBTZXR1cCBhcmd2LgorICBpZiAoIWFyZ3MuZXhlY19jbWQuZW1w
dHkoKSkgeworICAgIHByb2NfYXJncy5leGVjX2NtZCA9IGFyZ3MuZXhlY19jbWRbMF0uY19zdHIo
KTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcgOiBhcmdzLmV4ZWNfY21kKQorICAg
ICAgcHJvY19hcmdzLmFyZ3YucHVzaF9iYWNrKGNvbnN0X2Nhc3Q8Y2hhcio+KGFyZy5jX3N0cigp
KSk7CisgICAgcHJvY19hcmdzLmFyZ3YucHVzaF9iYWNrKG51bGxwdHIpOworCisgICAgaWYgKCFh
cmdzLmFyZ3YwX292ZXJyaWRlLmVtcHR5KCkpCisgICAgICBwcm9jX2FyZ3MuYXJndlswXSA9IGNv
bnN0X2Nhc3Q8Y2hhcio+KGFyZ3MuYXJndjBfb3ZlcnJpZGUuY19zdHIoKSk7CisgIH0KKworICAv
LyBTZXR1cCBlbnYuCisgIGlmICghYXJncy5lbnYuZW1wdHkoKSkgeworICAgIGZvciAoY29uc3Qg
c3RkOjpzdHJpbmcmIHN0ciA6IGFyZ3MuZW52KQorICAgICAgcHJvY19hcmdzLmVudi5wdXNoX2Jh
Y2soY29uc3RfY2FzdDxjaGFyKj4oc3RyLmNfc3RyKCkpKTsKKyAgICBwcm9jX2FyZ3MuZW52LnB1
c2hfYmFjayhudWxscHRyKTsKKyAgfQorCisgIC8vIFNldHVwIHRoZSBwaXBlcyBmb3Igc3RkaW4v
ZXJyIHJlZGlyZWN0aW9uLgorICBzdGRpbl9waXBlXyA9IGJhc2U6OlBpcGU6OkNyZWF0ZShiYXNl
OjpQaXBlOjprV3JOb25CbG9jayk7CisgIHByb2NfYXJncy5zdGRpbl9waXBlX3JkID0gKnN0ZGlu
X3BpcGVfLnJkOworICBzdGRvdXRlcnJfcGlwZV8gPSBiYXNlOjpQaXBlOjpDcmVhdGUoYmFzZTo6
UGlwZTo6a1JkTm9uQmxvY2spOworICBwcm9jX2FyZ3Muc3Rkb3V0ZXJyX3BpcGVfd3IgPSAqc3Rk
b3V0ZXJyX3BpcGVfLndyOworCisgIC8vIFNwYXduIHRoZSBjaGlsZCBwcm9jZXNzIHRoYXQgd2ls
bCBleGVjKCkuCisgIHBpZF8gPSBmb3JrKCk7CisgIFBFUkZFVFRPX0NIRUNLKHBpZF8gPj0gMCk7
CisgIGlmIChwaWRfID09IDApIHsKKyAgICAvLyBDbG9zZSB0aGUgcGFyZW50LWVuZHMgb2YgdGhl
IHBpcGVzLgorICAgIHN0ZGluX3BpcGVfLndyLnJlc2V0KCk7CisgICAgc3Rkb3V0ZXJyX3BpcGVf
LnJkLnJlc2V0KCk7CisgICAgQ2hpbGRQcm9jZXNzKCZwcm9jX2FyZ3MpOworICAgIC8vIENoaWxk
UHJvY2VzcygpIGRvZXNuJ3QgcmV0dXJuLCBub3QgZXZlbiBpbiBjYXNlIG9mIGZhaWx1cmVzLgor
ICAgIFBFUkZFVFRPX0ZBVEFMKCJub3QgcmVhY2hlZCIpOworICB9CisKKyAgc3RhdHVzXyA9IGtS
dW5uaW5nOworCisgIC8vIENsb3NlIHRoZSBjaGlsZC1lbmQgb2YgdGhlIHBpcGVzLgorICAvLyBE
ZWxpYmVyYXRlbHkgTk9UIGNsb3NpbmcgdGhlIHN0ZGluX3BpcGVfLnJkLiBUaGlzIGlzIHRvIGF2
b2lkIGNyYXNoaW5nCisgIC8vIHdpdGggYSBTSUdQSVBFIGlmIHRoZSBwcm9jZXNzIGV4aXRzIHdp
dGhvdXQgY29uc3VtaW5nIGl0cyBzdGRpbiwgd2hpbGUKKyAgLy8gdGhlIHBhcmVudCB0cmllcyB0
byB3cml0ZSgpIG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlIHN0ZGluIHBpcGUuCisgIHN0ZG91dGVy
cl9waXBlXy53ci5yZXNldCgpOworCisgIC8vIFNwYXduIGEgdGhyZWFkIHRoYXQgaXMgYmxvY2tl
ZCBvbiB3YWl0cGlkKCkgYW5kIHdyaXRlcyB0aGUgdGVybWluYXRpb24KKyAgLy8gc3RhdHVzIG9u
dG8gYSBwaXBlLiBUaGUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgd2FpcGlkKCkgZG9lc24ndCBoYXZl
IGEKKyAgLy8gdGltZW91dCBvcHRpb24gYW5kIGNhbid0IGJlIHBhc3NlZCB0byBwb2xsKCkuIFRo
ZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZQorICAvLyB1c2luZyBhIFNJR0NITEQgaGFuZGxlciwgYnV0
IGFuZWNkb3RhbGx5IHNpZ25hbCBoYW5kbGVycyBpbnRyb2R1Y2UgbW9yZQorICAvLyBwcm9ibGVt
cyB0aGFuIHdoYXQgdGhleSBzb2x2ZS4KKyAgZXhpdF9zdGF0dXNfcGlwZV8gPSBiYXNlOjpQaXBl
OjpDcmVhdGUoYmFzZTo6UGlwZTo6a1JkTm9uQmxvY2spOworCisgIC8vIEJvdGggZW5kcyBvZiB0
aGUgcGlwZSBhcmUgY2xvc2VkIGFmdGVyIHRoZSB0aHJlYWQuam9pbigpLgorICBpbnQgcGlkID0g
cGlkXzsKKyAgaW50IGV4aXRfc3RhdHVzX3BpcGVfd3IgPSBleGl0X3N0YXR1c19waXBlXy53ci5y
ZWxlYXNlKCk7CisgIHdhaXRwaWRfdGhyZWFkXyA9IHN0ZDo6dGhyZWFkKFtwaWQsIGV4aXRfc3Rh
dHVzX3BpcGVfd3JdIHsKKyAgICBpbnQgcGlkX3N0YXQgPSAtMTsKKyAgICBpbnQgd2FpdF9yZXMg
PSBQRVJGRVRUT19FSU5UUih3YWl0cGlkKHBpZCwgJnBpZF9zdGF0LCAwKSk7CisgICAgUEVSRkVU
VE9fQ0hFQ0sod2FpdF9yZXMgPT0gcGlkKTsKKyAgICBiYXNlOjppZ25vcmVfcmVzdWx0KFBFUkZF
VFRPX0VJTlRSKAorICAgICAgICB3cml0ZShleGl0X3N0YXR1c19waXBlX3dyLCAmcGlkX3N0YXQs
IHNpemVvZihwaWRfc3RhdCkpKSk7CisgICAgUEVSRkVUVE9fQ0hFQ0soY2xvc2UoZXhpdF9zdGF0
dXNfcGlwZV93cikgPT0gMCB8fCBlcnJubyA9PSBFSU5UUik7CisgIH0pOworfQorCitTdWJwcm9j
ZXNzOjpTdGF0dXMgU3VicHJvY2Vzczo6UG9sbCgpIHsKKyAgaWYgKHN0YXR1c18gIT0ga1J1bm5p
bmcpCisgICAgcmV0dXJuIHN0YXR1c187ICAvLyBOb3RoaW5nIHRvIHBvbGwuCisgIHdoaWxlIChQ
b2xsSW50ZXJuYWwoMCAvKiBkb24ndCBibG9jayovKSkgeworICB9CisgIHJldHVybiBzdGF0dXNf
OworfQorCisvLyB8dGltZW91dF9tc3wgc2VtYW50aWM6CisvLyAgIC0xOiBCbG9jayBpbmRlZmlu
aXRlbHkuCisvLyAgICAwOiBEb24ndCBibG9jaywgcmV0dXJuIGltbWVkaWF0ZWx5LgorLy8gICA+
MDogQmxvY2sgZm9yIGF0IG1vc3QgWCBtcy4KKy8vIFJldHVybnM6CisvLyAgVHJ1ZTogUmVhZCBh
dCBsZWFzdCBvbmUgZmQgKHNvIHRoZXJlIG1pZ2h0IGJlIG1vcmUgcXVldWVkKS4KKy8vICBGYWxz
ZTogaWYgYWxsIGZkcyByZWFjaGVkIHF1aWVzY2VudCAobm8gZGF0YSB0byByZWFkL3dyaXRlKS4K
K2Jvb2wgU3VicHJvY2Vzczo6UG9sbEludGVybmFsKGludCBwb2xsX3RpbWVvdXRfbXMpIHsKKyAg
c3RydWN0IHBvbGxmZCBmZHNbM117fTsKKyAgc2l6ZV90IG51bV9mZHMgPSAwOworICBpZiAoZXhp
dF9zdGF0dXNfcGlwZV8ucmQpIHsKKyAgICBmZHNbbnVtX2Zkc10uZmQgPSAqZXhpdF9zdGF0dXNf
cGlwZV8ucmQ7CisgICAgZmRzW251bV9mZHNdLmV2ZW50cyA9IFBPTExJTjsKKyAgICBudW1fZmRz
Kys7CisgIH0KKyAgaWYgKHN0ZG91dGVycl9waXBlXy5yZCkgeworICAgIGZkc1tudW1fZmRzXS5m
ZCA9ICpzdGRvdXRlcnJfcGlwZV8ucmQ7CisgICAgZmRzW251bV9mZHNdLmV2ZW50cyA9IFBPTExJ
TjsKKyAgICBudW1fZmRzKys7CisgIH0KKyAgaWYgKHN0ZGluX3BpcGVfLndyKSB7CisgICAgZmRz
W251bV9mZHNdLmZkID0gKnN0ZGluX3BpcGVfLndyOworICAgIGZkc1tudW1fZmRzXS5ldmVudHMg
PSBQT0xMT1VUOworICAgIG51bV9mZHMrKzsKKyAgfQorCisgIGlmIChudW1fZmRzID09IDApCisg
ICAgcmV0dXJuIGZhbHNlOworCisgIGF1dG8gbmZkcyA9IHN0YXRpY19jYXN0PG5mZHNfdD4obnVt
X2Zkcyk7CisgIGludCBwb2xsX3JlcyA9IFBFUkZFVFRPX0VJTlRSKHBvbGwoZmRzLCBuZmRzLCBw
b2xsX3RpbWVvdXRfbXMpKTsKKyAgUEVSRkVUVE9fQ0hFQ0socG9sbF9yZXMgPj0gMCk7CisKKyAg
VHJ5UmVhZFN0ZG91dEFuZEVycigpOworICBUcnlQdXNoU3RkaW4oKTsKKyAgVHJ5UmVhZEV4aXRT
dGF0dXMoKTsKKworICByZXR1cm4gcG9sbF9yZXMgPiAwOworfQorCitib29sIFN1YnByb2Nlc3M6
OldhaXQoaW50IHRpbWVvdXRfbXMpIHsKKyAgUEVSRkVUVE9fQ0hFQ0soc3RhdHVzXyAhPSBrTm90
U3RhcnRlZCk7CisKKyAgLy8gQnJlYWsgb3V0IG9mIHRoZSBsb29wIG9ubHkgYWZ0ZXIgYm90aCBj
b25kaXRpb25zIGFyZSBzYXRpc2ZpZWQ6CisgIC8vIC0gQWxsIHN0ZG91dC9zdGRlcnIgZGF0YSBo
YXMgYmVlbiByZWFkIChpZiBrQnVmZmVyKS4KKyAgLy8gLSBUaGUgcHJvY2VzcyBleGl0ZWQuCisg
IC8vIE5vdGUgdGhhdCB0aGUgdHdvIGV2ZW50cyBjYW4gaGFwcGVuIGFyYml0cmFyeSBvcmRlci4g
QWZ0ZXIgdGhlIHByb2Nlc3MKKyAgLy8gZXhpdHMsIHRoZXJlIG1pZ2h0IGJlIHN0aWxsIGRhdGEg
aW4gdGhlIHBpcGUgYnVmZmVyLCB3aGljaCB3ZSB3YW50IHRvCisgIC8vIHJlYWQgZnVsbHkuCisg
IC8vCisgIC8vIEluc3RlYWQsIGRvbid0IHdhaXQgb24gdGhlIHN0ZGluIHRvIGJlIGZ1bGx5IHdy
aXR0ZW4uIFRoZSBjaGlsZCBwcm9jZXNzCisgIC8vIG1pZ2h0IGV4aXQgcHJlbWF0dXJlbHkgKG9y
IGNyYXNoKS4gSWYgdGhhdCBoYXBwZW5zLCB3ZSBjYW4gZW5kIHVwIGluIGEKKyAgLy8gc3RhdGUg
d2hlcmUgdGhlIHdyaXRlKHN0ZGluX3BpcGVfLndyKSB3aWxsIG5ldmVyIHVuYmxvY2suCisKKyAg
Y29uc3QgaW50NjRfdCB0X3N0YXJ0ID0gYmFzZTo6R2V0V2FsbFRpbWVNcygpLmNvdW50KCk7Cisg
IHdoaWxlIChleGl0X3N0YXR1c19waXBlXy5yZCB8fCBzdGRvdXRlcnJfcGlwZV8ucmQpIHsKKyAg
ICBpbnQgcG9sbF90aW1lb3V0X21zID0gLTE7ICAvLyBCbG9jayB1bnRpbCBhIEZEIGlzIHJlYWR5
LgorICAgIGlmICh0aW1lb3V0X21zID4gMCkgeworICAgICAgY29uc3QgaW50NjRfdCBub3cgPSBH
ZXRXYWxsVGltZU1zKCkuY291bnQoKTsKKyAgICAgIHBvbGxfdGltZW91dF9tcyA9IHRpbWVvdXRf
bXMgLSBzdGF0aWNfY2FzdDxpbnQ+KG5vdyAtIHRfc3RhcnQpOworICAgICAgaWYgKHBvbGxfdGlt
ZW91dF9tcyA8PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFBvbGxJbnRl
cm5hbChwb2xsX3RpbWVvdXRfbXMpOworICB9ICAvLyB3aGlsZSguLi4pCisgIHJldHVybiB0cnVl
OworfQorCitib29sIFN1YnByb2Nlc3M6OkNhbGwoaW50IHRpbWVvdXRfbXMpIHsKKyAgUEVSRkVU
VE9fQ0hFQ0soc3RhdHVzXyA9PSBrTm90U3RhcnRlZCk7CisgIFN0YXJ0KCk7CisKKyAgaWYgKCFX
YWl0KHRpbWVvdXRfbXMpKSB7CisgICAgS2lsbEFuZFdhaXRGb3JUZXJtaW5hdGlvbigpOworICAg
IC8vIFRyeVJlYWRFeGl0U3RhdHVzIG11c3QgaGF2ZSBqb2luZWQgdGhlIHRocmVhZC4KKyAgICBQ
RVJGRVRUT19EQ0hFQ0soIXdhaXRwaWRfdGhyZWFkXy5qb2luYWJsZSgpKTsKKyAgfQorICBQRVJG
RVRUT19EQ0hFQ0soc3RhdHVzXyAhPSBrUnVubmluZyk7CisgIHJldHVybiBzdGF0dXNfID09IGtF
eGl0ZWQgJiYgcmV0dXJuY29kZV8gPT0gMDsKK30KKwordm9pZCBTdWJwcm9jZXNzOjpUcnlSZWFk
RXhpdFN0YXR1cygpIHsKKyAgaWYgKCFleGl0X3N0YXR1c19waXBlXy5yZCkKKyAgICByZXR1cm47
CisKKyAgaW50IHBpZF9zdGF0ID0gLTE7CisgIGludDY0X3QgcnNpemUgPQorICAgICAgUEVSRkVU
VE9fRUlOVFIocmVhZCgqZXhpdF9zdGF0dXNfcGlwZV8ucmQsICZwaWRfc3RhdCwgc2l6ZW9mKHBp
ZF9zdGF0KSkpOworICBpZiAocnNpemUgPCAwICYmIGVycm5vID09IEVBR0FJTikKKyAgICByZXR1
cm47CisKKyAgaWYgKHJzaXplID4gMCkgeworICAgIFBFUkZFVFRPX0NIRUNLKHJzaXplID09IHNp
emVvZihwaWRfc3RhdCkpOworICB9IGVsc2UgaWYgKHJzaXplIDwgMCkgeworICAgIFBFUkZFVFRP
X1BMT0coIlN1YnByb2Nlc3MgcmVhZChleGl0X3N0YXR1c19waXBlXykgZmFpbGVkIik7CisgIH0K
KyAgd2FpdHBpZF90aHJlYWRfLmpvaW4oKTsKKyAgZXhpdF9zdGF0dXNfcGlwZV8ucmQucmVzZXQo
KTsKKworICBpZiAoV0lGRVhJVEVEKHBpZF9zdGF0KSkgeworICAgIHJldHVybmNvZGVfID0gV0VY
SVRTVEFUVVMocGlkX3N0YXQpOworICAgIHN0YXR1c18gPSBrRXhpdGVkOworICB9IGVsc2UgaWYg
KFdJRlNJR05BTEVEKHBpZF9zdGF0KSkgeworICAgIHJldHVybmNvZGVfID0gMTI4ICsgV1RFUk1T
SUcocGlkX3N0YXQpOyAgLy8gRm9sbG93IGJhc2ggY29udmVudGlvbi4KKyAgICBzdGF0dXNfID0g
a0tpbGxlZEJ5U2lnbmFsOworICB9IGVsc2UgeworICAgIFBFUkZFVFRPX0ZBVEFMKCJ3YWl0cGlk
KCkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZSAoMHgleCkiLCBwaWRfc3RhdCk7CisgIH0K
K30KKworLy8gSWYgdGhlIHN0aWRuIHBpcGUgaXMgc3RpbGwgb3BlbiwgcHVzaCBpbnB1dCBkYXRh
IGFuZCBjbG9zZSBpdCBhdCB0aGUgZW5kLgordm9pZCBTdWJwcm9jZXNzOjpUcnlQdXNoU3RkaW4o
KSB7CisgIGlmICghc3RkaW5fcGlwZV8ud3IpCisgICAgcmV0dXJuOworCisgIFBFUkZFVFRPX0RD
SEVDSyhhcmdzLmlucHV0LmVtcHR5KCkgfHwgaW5wdXRfd3JpdHRlbl8gPCBhcmdzLmlucHV0LnNp
emUoKSk7CisgIGlmIChhcmdzLmlucHV0LnNpemUoKSkgeworICAgIGludDY0X3Qgd3NpemUgPQor
ICAgICAgICBQRVJGRVRUT19FSU5UUih3cml0ZSgqc3RkaW5fcGlwZV8ud3IsICZhcmdzLmlucHV0
W2lucHV0X3dyaXR0ZW5fXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5pbnB1
dC5zaXplKCkgLSBpbnB1dF93cml0dGVuXykpOworICAgIGlmICh3c2l6ZSA8IDAgJiYgZXJybm8g
PT0gRUFHQUlOKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKHdzaXplID49IDApIHsKKyAgICAg
IC8vIFdoZXRoZXIgd3JpdGUoKSBjYW4gcmV0dXJuIDAgaXMgb25lIG9mIHRoZSBncmVhdGVzdCBt
eXN0ZXJpZXMgb2YgVU5JWC4KKyAgICAgIC8vIEp1c3QgaWdub3JlIGl0LgorICAgICAgaW5wdXRf
d3JpdHRlbl8gKz0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih3c2l6ZSk7CisgICAgfSBlbHNlIHsKKyAg
ICAgIFBFUkZFVFRPX1BMT0coIlN1YnByb2Nlc3Mgd3JpdGUoc3RkaW4pIGZhaWxlZCIpOworICAg
ICAgc3RkaW5fcGlwZV8ud3IucmVzZXQoKTsKKyAgICB9CisgIH0KKyAgUEVSRkVUVE9fRENIRUNL
KGlucHV0X3dyaXR0ZW5fIDw9IGFyZ3MuaW5wdXQuc2l6ZSgpKTsKKyAgaWYgKGlucHV0X3dyaXR0
ZW5fID09IGFyZ3MuaW5wdXQuc2l6ZSgpKQorICAgIHN0ZGluX3BpcGVfLndyLnJlc2V0KCk7ICAv
LyBDbG9zZSBzdGRpbi4KK30KKwordm9pZCBTdWJwcm9jZXNzOjpUcnlSZWFkU3Rkb3V0QW5kRXJy
KCkgeworICBpZiAoIXN0ZG91dGVycl9waXBlXy5yZCkKKyAgICByZXR1cm47CisgIGNoYXIgYnVm
WzQwOTZdOworICBpbnQ2NF90IHJzaXplID0gUEVSRkVUVE9fRUlOVFIocmVhZCgqc3Rkb3V0ZXJy
X3BpcGVfLnJkLCBidWYsIHNpemVvZihidWYpKSk7CisgIGlmIChyc2l6ZSA8IDAgJiYgZXJybm8g
PT0gRUFHQUlOKQorICAgIHJldHVybjsKKworICBpZiAocnNpemUgPiAwKSB7CisgICAgb3V0cHV0
Xy5hcHBlbmQoYnVmLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHJzaXplKSk7CisgIH0gZWxzZSBpZiAo
cnNpemUgPT0gMCAvKiBFT0YgKi8pIHsKKyAgICBzdGRvdXRlcnJfcGlwZV8ucmQucmVzZXQoKTsK
KyAgfSBlbHNlIHsKKyAgICBQRVJGRVRUT19QTE9HKCJTdWJwcm9jZXNzIHJlYWQoc3Rkb3V0L2Vy
cikgZmFpbGVkIik7CisgICAgc3Rkb3V0ZXJyX3BpcGVfLnJkLnJlc2V0KCk7CisgIH0KK30KKwor
dm9pZCBTdWJwcm9jZXNzOjpLaWxsQW5kV2FpdEZvclRlcm1pbmF0aW9uKCkgeworICBraWxsKHBp
ZF8sIFNJR0tJTEwpOworICBXYWl0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFN1YnByb2Nlc3M6OkFy
Z3M6OkdldENtZFN0cmluZygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgc3RyOworICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGV4ZWNfY21kLnNpemUoKTsgaSsrKSB7CisgICAgc3RyICs9IGkgPiAw
ID8gIiBcIiIgOiAiIjsKKyAgICBzdHIgKz0gZXhlY19jbWRbaV07CisgICAgc3RyICs9IGkgPiAw
ID8gIlwiIiA6ICIiOworICB9CisgIHJldHVybiBzdHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBi
YXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBQRVJGRVRUT19IQVNf
U1VCUFJPQ0VTUygpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvYmFzZS90
aHJlYWRfY2hlY2tlci5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVk
ZS9wZXJmZXR0by9leHQvYmFzZS90aHJlYWRfY2hlY2tlci5oCisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1
bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAq
IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUg
TGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoK
KyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgor
ICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0
aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJp
YnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05E
SVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRo
ZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25z
IGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJ
TkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1RIUkVBRF9DSEVDS0VSX0hfCisjZGVmaW5lIElOQ0xV
REVfUEVSRkVUVE9fRVhUX0JBU0VfVEhSRUFEX0NIRUNLRVJfSF8KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKwor
I2lmICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorI2luY2x1ZGUgPHB0aHJl
YWQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGF0b21pYz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdXRpbHMu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworI2lmIFBFUkZF
VFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCit1c2luZyBUaHJlYWRJRCA9IHVuc2lnbmVk
IGxvbmc7CisjZWxzZQordXNpbmcgVGhyZWFkSUQgPSBwdGhyZWFkX3Q7CisjZW5kaWYKKworY2xh
c3MgUEVSRkVUVE9fRVhQT1JUIFRocmVhZENoZWNrZXIgeworIHB1YmxpYzoKKyAgVGhyZWFkQ2hl
Y2tlcigpOworICB+VGhyZWFkQ2hlY2tlcigpOworICBUaHJlYWRDaGVja2VyKGNvbnN0IFRocmVh
ZENoZWNrZXImKTsKKyAgVGhyZWFkQ2hlY2tlciYgb3BlcmF0b3I9KGNvbnN0IFRocmVhZENoZWNr
ZXImKTsKKyAgYm9vbCBDYWxsZWRPblZhbGlkVGhyZWFkKCkgY29uc3QgUEVSRkVUVE9fV0FSTl9V
TlVTRURfUkVTVUxUOworICB2b2lkIERldGFjaEZyb21UaHJlYWQoKTsKKworIHByaXZhdGU6Cisg
IG11dGFibGUgc3RkOjphdG9taWM8VGhyZWFkSUQ+IHRocmVhZF9pZF87Cit9OworCisjaWYgUEVS
RkVUVE9fRENIRUNLX0lTX09OKCkgJiYgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19DSFJP
TUlVTV9CVUlMRCkKKy8vIFRPRE8ocHJpbWlhbm8pIFVzZSBDaHJvbWl1bSdzIHRocmVhZCBjaGVj
a2VyIGluIENocm9taXVtLgorI2RlZmluZSBQRVJGRVRUT19USFJFQURfQ0hFQ0tFUihuYW1lKSBi
YXNlOjpUaHJlYWRDaGVja2VyIG5hbWU7CisjZGVmaW5lIFBFUkZFVFRPX0RDSEVDS19USFJFQUQo
bmFtZSkgXAorICBQRVJGRVRUT19EQ0hFQ0soKG5hbWUpLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSkK
KyNkZWZpbmUgUEVSRkVUVE9fREVUQUNIX0ZST01fVEhSRUFEKG5hbWUpIChuYW1lKS5EZXRhY2hG
cm9tVGhyZWFkKCkKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX1RIUkVBRF9DSEVDS0VSKG5hbWUp
CisjZGVmaW5lIFBFUkZFVFRPX0RDSEVDS19USFJFQUQobmFtZSkKKyNkZWZpbmUgUEVSRkVUVE9f
REVUQUNIX0ZST01fVEhSRUFEKG5hbWUpCisjZW5kaWYgIC8vIFBFUkZFVFRPX0RDSEVDS19JU19P
TigpCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKwor
I2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1RIUkVBRF9DSEVDS0VSX0hfCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
ZXh0L2Jhc2UvdGhyZWFkX2NoZWNrZXIuaCIKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJG
RVRUT19PU19XSU4pCisjaW5jbHVkZSA8V2luZG93cy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7Citjb25zdGV4cHIgVGhy
ZWFkSUQga0RldGFjaGVke307CisKK1RocmVhZElEIEN1cnJlbnRUaHJlYWRJZCgpIHsKKyNpZiBQ
RVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorICByZXR1cm4gOjpHZXRDdXJyZW50
VGhyZWFkSWQoKTsKKyNlbHNlCisgIHJldHVybiBwdGhyZWFkX3NlbGYoKTsKKyNlbmRpZgorfQor
fSAgLy8gbmFtZXNwYWNlCisKK1RocmVhZENoZWNrZXI6OlRocmVhZENoZWNrZXIoKSB7CisgIHRo
cmVhZF9pZF8uc3RvcmUoQ3VycmVudFRocmVhZElkKCkpOworfQorCitUaHJlYWRDaGVja2VyOjp+
VGhyZWFkQ2hlY2tlcigpID0gZGVmYXVsdDsKKworVGhyZWFkQ2hlY2tlcjo6VGhyZWFkQ2hlY2tl
cihjb25zdCBUaHJlYWRDaGVja2VyJiBvdGhlcikgeworICB0aHJlYWRfaWRfID0gb3RoZXIudGhy
ZWFkX2lkXy5sb2FkKCk7Cit9CisKK1RocmVhZENoZWNrZXImIFRocmVhZENoZWNrZXI6Om9wZXJh
dG9yPShjb25zdCBUaHJlYWRDaGVja2VyJiBvdGhlcikgeworICB0aHJlYWRfaWRfID0gb3RoZXIu
dGhyZWFkX2lkXy5sb2FkKCk7CisgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBUaHJlYWRDaGVj
a2VyOjpDYWxsZWRPblZhbGlkVGhyZWFkKCkgY29uc3QgeworICBhdXRvIHNlbGYgPSBDdXJyZW50
VGhyZWFkSWQoKTsKKworICAvLyBXaWxsIHJlLWF0dGFjaCBpZiBwcmV2aW91c2x5IGRldGFjaGVk
IHVzaW5nIERldGFjaEZyb21UaHJlYWQoKS4KKyAgYXV0byBwcmV2X3ZhbHVlID0ga0RldGFjaGVk
OworICBpZiAodGhyZWFkX2lkXy5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhwcmV2X3ZhbHVlLCBz
ZWxmKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIHByZXZfdmFsdWUgPT0gc2VsZjsKK30K
Kwordm9pZCBUaHJlYWRDaGVja2VyOjpEZXRhY2hGcm9tVGhyZWFkKCkgeworICB0aHJlYWRfaWRf
LnN0b3JlKGtEZXRhY2hlZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1l
c3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9iYXNl
L3RpbWUuY2MKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3Vy
Y2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy
c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g
YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5v
cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj
YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl
ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor
ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs
YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0
aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9iYXNlL3RpbWUuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisKKyNpZiBQRVJGRVRUT19CVUlM
REZMQUcoUEVSRkVUVE9fT1NfV0lOKQorI2luY2x1ZGUgPFdpbmRvd3MuaD4KKyNlbHNlCisjaW5j
bHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFj
ZSBiYXNlIHsKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisKK1Rp
bWVOYW5vcyBHZXRXYWxsVGltZU5zKCkgeworICBMQVJHRV9JTlRFR0VSIGZyZXE7CisgIDo6UXVl
cnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSk7CisgIExBUkdFX0lOVEVHRVIgY291bnRlcjsK
KyAgOjpRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmY291bnRlcik7CisgIGRvdWJsZSBlbGFwc2Vk
X25hbm9zZWNvbmRzID0gKDFlOSAqIGNvdW50ZXIuUXVhZFBhcnQpIC8gZnJlcS5RdWFkUGFydDsK
KyAgcmV0dXJuIFRpbWVOYW5vcyhzdGF0aWNfY2FzdDx1aW50NjRfdD4oZWxhcHNlZF9uYW5vc2Vj
b25kcykpOworfQorCitUaW1lTmFub3MgR2V0VGhyZWFkQ1BVVGltZU5zKCkgeworICBGSUxFVElN
RSBkdW1teSwga2VybmVsX2Z0aW1lLCB1c2VyX2Z0aW1lOworICA6OkdldFRocmVhZFRpbWVzKEdl
dEN1cnJlbnRUaHJlYWQoKSwgJmR1bW15LCAmZHVtbXksICZrZXJuZWxfZnRpbWUsCisgICAgICAg
ICAgICAgICAgICAgJnVzZXJfZnRpbWUpOworICB1aW50NjRfdCBrZXJuZWxfdGltZSA9IGtlcm5l
bF9mdGltZS5kd0hpZ2hEYXRlVGltZSAqIDB4MTAwMDAwMDAwICsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICBrZXJuZWxfZnRpbWUuZHdMb3dEYXRlVGltZTsKKyAgdWludDY0X3QgdXNlcl90aW1l
ID0gdXNlcl9mdGltZS5kd0hpZ2hEYXRlVGltZSAqIDB4MTAwMDAwMDAwICsKKyAgICAgICAgICAg
ICAgICAgICAgICAgdXNlcl9mdGltZS5kd0xvd0RhdGVUaW1lOworCisgIHJldHVybiBUaW1lTmFu
b3MoKGtlcm5lbF90aW1lICsgdXNlcl90aW1lKSAqIDEwMCk7Cit9CisKK3ZvaWQgU2xlZXBNaWNy
b3NlY29uZHModW5zaWduZWQgaW50ZXJ2YWxfdXMpIHsKKyAgLy8gVGhlIFdpbmRvd3MgU2xlZXAg
ZnVuY3Rpb24gdGFrZXMgYSBtaWxsaXNlY29uZCBjb3VudC4gUm91bmQgdXAgc28gdGhhdAorICAv
LyBzaG9ydCBzbGVlcHMgZG9uJ3QgdHVybiBpbnRvIGEgYnVzeSB3YWl0LiBOb3RlIHRoYXQgdGhl
IHNsZWVwIGdyYW51bGFyaXR5CisgIC8vIG9uIFdpbmRvd3MgY2FuIGR5bmFtaWNhbGx5IHZhcnkg
ZnJvbSAxIG1zIHRvIH4xNiBtcywgc28gZG9uJ3QgY291bnQgb24gdGhpcworICAvLyBiZWluZyBh
IHNob3J0IHNsZWVwLgorICA6OlNsZWVwKHN0YXRpY19jYXN0PERXT1JEPigoaW50ZXJ2YWxfdXMg
KyA5OTkpIC8gMTAwMCkpOworfQorCisjZWxzZSAgLy8gUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZF
VFRPX09TX1dJTikKKwordm9pZCBTbGVlcE1pY3Jvc2Vjb25kcyh1bnNpZ25lZCBpbnRlcnZhbF91
cykgeworICA6OnVzbGVlcChzdGF0aWNfY2FzdDx1c2Vjb25kc190PihpbnRlcnZhbF91cykpOwor
fQorCisjZW5kaWYgIC8vIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisKK30g
IC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9iYXNlL3V1aWQuY2MKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L2Jhc2UvdXVpZC5oCisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisg
KiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxp
Y2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFu
Y2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGlj
ZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VO
U0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVl
ZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vu
c2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFO
VElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVk
LgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5n
IHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8K
KworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1VVSURfSF8KKyNkZWZpbmUgSU5D
TFVERV9QRVJGRVRUT19FWFRfQkFTRV9VVUlEX0hfCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNs
dWRlIDxzdHJpbmc+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2V4dC9iYXNlL29wdGlvbmFsLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgYmFzZSB7CisKK2NsYXNzIFV1aWQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVXVpZChj
b25zdCBzdGQ6OnN0cmluZyYgcyk7CisgIGV4cGxpY2l0IFV1aWQoaW50NjRfdCBsc2IsIGludDY0
X3QgbXNiKTsKKyAgVXVpZCgpOworCisgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiBkYXRhKCkg
eyByZXR1cm4gJmRhdGFfOyB9CisgIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiBkYXRh
KCkgY29uc3QgeyByZXR1cm4gJmRhdGFfOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFV1
aWQmIG90aGVyKSBjb25zdCB7IHJldHVybiBkYXRhXyA9PSBvdGhlci5kYXRhXzsgfQorCisgIGJv
b2wgb3BlcmF0b3IhPShjb25zdCBVdWlkJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9
PSBvdGhlcik7IH0KKworICBpbnQ2NF90IG1zYigpIGNvbnN0IHsKKyAgICBpbnQ2NF90IHJlc3Vs
dDsKKyAgICBtZW1jcHkoJnJlc3VsdCwgZGF0YV8uZGF0YSgpICsgOCwgOCk7CisgICAgcmV0dXJu
IHJlc3VsdDsKKyAgfQorCisgIGludDY0X3QgbHNiKCkgY29uc3QgeworICAgIGludDY0X3QgcmVz
dWx0OworICAgIG1lbWNweSgmcmVzdWx0LCBkYXRhXy5kYXRhKCksIDgpOworICAgIHJldHVybiBy
ZXN1bHQ7CisgIH0KKworICB2b2lkIHNldF9sc2JfbXNiKGludDY0X3QgbHNiLCBpbnQ2NF90IG1z
YikgeworICAgIHNldF9sc2IobHNiKTsKKyAgICBzZXRfbXNiKG1zYik7CisgIH0KKyAgdm9pZCBz
ZXRfbXNiKGludDY0X3QgbXNiKSB7IG1lbWNweShkYXRhXy5kYXRhKCkgKyA4LCAmbXNiLCA4KTsg
fQorICB2b2lkIHNldF9sc2IoaW50NjRfdCBsc2IpIHsgbWVtY3B5KGRhdGFfLmRhdGEoKSwgJmxz
YiwgOCk7IH0KKworICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OworICBzdGQ6OnN0cmlu
ZyBUb1ByZXR0eVN0cmluZygpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RkOjphcnJheTx1aW50
OF90LCAxNj4gZGF0YV97fTsKK307CisKK1V1aWQgVXVpZHY0KCk7CisKK30gIC8vIG5hbWVzcGFj
ZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BF
UkZFVFRPX0VYVF9CQVNFX1VVSURfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFu
ZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFj
aGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3Qg
dXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICog
WW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRw
Oi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVx
dWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJl
CisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAi
QVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5Z
IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9y
IHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1p
dGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS91dWlkLmgiCisKKyNpbmNsdWRlIDxy
YW5kb20+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2Jhc2UvdGltZS5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2Ugewor
bmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIga0hleG1hcFtdID0geycwJywgJzEnLCAnMics
ICczJywgJzQnLCAnNScsICc2JywgJzcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4
JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnfTsKK30gIC8vIG5hbWVzcGFjZQor
CisvLyBTZWUgaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0CitVdWlkIFV1aWR2
NCgpIHsKKyAgc3RhdGljIHN0ZDo6bWluc3RkX3JhbmQgcm5nKHN0YXRpY19jYXN0PHVpbnQzMl90
PihHZXRCb290VGltZU5zKCkuY291bnQoKSkpOworICBVdWlkIHV1aWQ7CisgIGF1dG8mIGRhdGEg
PSAqdXVpZC5kYXRhKCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKQorICAg
IGRhdGFbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihybmcoKSk7CisKKyAgLy8gdmVyc2lvbjoK
KyAgZGF0YVs2XSA9IChkYXRhWzZdICYgMHgwZikgfCAweDQwOworICAvLyBjbG9ja19zZXFfaGlf
YW5kX3Jlc2VydmVkOgorICBkYXRhWzhdID0gKGRhdGFbOF0gJiAweDNmKSB8IDB4ODA7CisKKyAg
cmV0dXJuIHV1aWQ7Cit9CisKK1V1aWQ6OlV1aWQoKSB7fQorCitVdWlkOjpVdWlkKGNvbnN0IHN0
ZDo6c3RyaW5nJiBzKSB7CisgIFBFUkZFVFRPX0NIRUNLKHMuc2l6ZSgpID09IGRhdGFfLnNpemUo
KSk7CisgIG1lbWNweShkYXRhXy5kYXRhKCksIHMuZGF0YSgpLCBzLnNpemUoKSk7Cit9CisKK1V1
aWQ6OlV1aWQoaW50NjRfdCBsc2IsIGludDY0X3QgbXNiKSB7CisgIHNldF9sc2JfbXNiKGxzYiwg
bXNiKTsKK30KKworc3RkOjpzdHJpbmcgVXVpZDo6VG9TdHJpbmcoKSBjb25zdCB7CisgIHJldHVy
biBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhXy5kYXRhKCkp
LCBkYXRhXy5zaXplKCkpOworfQorCitzdGQ6OnN0cmluZyBVdWlkOjpUb1ByZXR0eVN0cmluZygp
IGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgcyhkYXRhXy5zaXplKCkgKiAyICsgNCwgJy0nKTsKKyAg
Ly8gRm9ybWF0IGlzIDEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjY1NTQ0MzMyMi4KKyAgc2l6
ZV90IGogPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGFfLnNpemUoKTsgKytpKSB7
CisgICAgaWYgKGkgPT0gNCB8fCBpID09IDYgfHwgaSA9PSA4IHx8IGkgPT0gMTApCisgICAgICBq
Kys7CisgICAgc1syICogaSArIGpdID0ga0hleG1hcFsoZGF0YV9bZGF0YV8uc2l6ZSgpIC0gaSAt
IDFdICYgMHhmMCkgPj4gNF07CisgICAgc1syICogaSArIDEgKyBqXSA9IGtIZXhtYXBbKGRhdGFf
W2RhdGFfLnNpemUoKSAtIGkgLSAxXSAmIDB4MGYpXTsKKyAgfQorICByZXR1cm4gczsKK30KKwor
fSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL2Jhc2UvdmlydHVhbF9kZXN0cnVjdG9ycy5jYwor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2Jhc2UvdGFza19ydW5uZXIuaCIKKworLy8gVGhpcyB0cmFuc2xhdGlvbiB1bml0IGNvbnRhaW5z
IHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIGRlc3RydWN0b3Igb2YgcHVyZQorLy8gdmlydHVhbCBp
bnRlcmZhY2VzIGZvciB0aGUgY3VycmVudCBidWlsZCB0YXJnZXQuIFRoZSBhbHRlcm5hdGl2ZSB3
b3VsZCBiZQorLy8gaW50cm9kdWNpbmcgYSBvbmUtbGluZXIgLmNjIGZpbGUgZm9yIGVhY2ggcHVy
ZSB2aXJ0dWFsIGludGVyZmFjZSwgd2hpY2ggaXMKKy8vIG92ZXJraWxsLiBUaGlzIGlzIGZvciBj
b21wbGlhbmNlIHdpdGggLVd3ZWFrLXZ0YWJsZXMuCisKK25hbWVzcGFjZSBwZXJmZXR0byB7Citu
YW1lc3BhY2UgYmFzZSB7CisKK1Rhc2tSdW5uZXI6On5UYXNrUnVubmVyKCkgPSBkZWZhdWx0Owor
Cit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvYmFzZS93YWl0YWJsZV9ldmVudC5jYworLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQvYmFzZS93
YWl0YWJsZV9ldmVudC5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9C
QVNFX1dBSVRBQkxFX0VWRU5UX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0Vf
V0FJVEFCTEVfRVZFTlRfSF8KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNs
dWRlIDxtdXRleD4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKwor
Ly8gQSB3YWl0YWJsZSBldmVudCBmb3IgY3Jvc3MtdGhyZWFkIHN5bmNocm9uaXphdGlvbi4KKy8v
IEFsbCBtZXRob2RzIG9uIHRoaXMgY2xhc3MgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQu
CitjbGFzcyBXYWl0YWJsZUV2ZW50IHsKKyBwdWJsaWM6CisgIFdhaXRhYmxlRXZlbnQoKTsKKyAg
fldhaXRhYmxlRXZlbnQoKTsKKyAgV2FpdGFibGVFdmVudChjb25zdCBXYWl0YWJsZUV2ZW50Jikg
PSBkZWxldGU7CisgIFdhaXRhYmxlRXZlbnQgb3BlcmF0b3I9KGNvbnN0IFdhaXRhYmxlRXZlbnQm
KSA9IGRlbGV0ZTsKKworICAvLyBTeW5jaHJvbm91c2x5IGJsb2NrIHVudGlsIHRoZSBldmVudCBp
cyBub3RpZmllZC4KKyAgdm9pZCBXYWl0KCk7CisKKyAgLy8gU2lnbmFsIHRoZSBldmVudCwgd2Fr
aW5nIHVwIGJsb2NrZWQgd2FpdGVycy4KKyAgdm9pZCBOb3RpZnkoKTsKKworIHByaXZhdGU6Cisg
IHN0ZDo6bXV0ZXggbXV0ZXhfOworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBldmVudF87Cisg
IGJvb2wgbm90aWZpZWRfID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAg
Ly8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRf
QkFTRV9XQUlUQUJMRV9FVkVOVF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5k
cm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNo
ZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1
c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZ
b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6
Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1
aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUK
KyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkg
S0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0
YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3dhaXRhYmxlX2V2ZW50LmgiCisKK25h
bWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKK1dhaXRhYmxlRXZlbnQ6Oldh
aXRhYmxlRXZlbnQoKSA9IGRlZmF1bHQ7CitXYWl0YWJsZUV2ZW50Ojp+V2FpdGFibGVFdmVudCgp
ID0gZGVmYXVsdDsKKwordm9pZCBXYWl0YWJsZUV2ZW50OjpXYWl0KCkgeworICBzdGQ6OnVuaXF1
ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKKyAgcmV0dXJuIGV2ZW50Xy53YWl0KGxv
Y2ssIFt0aGlzXSB7IHJldHVybiBub3RpZmllZF87IH0pOworfQorCit2b2lkIFdhaXRhYmxlRXZl
bnQ6Ok5vdGlmeSgpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4
Xyk7CisgIG5vdGlmaWVkXyA9IHRydWU7CisgIGV2ZW50Xy5ub3RpZnlfYWxsKCk7Cit9CisKK30g
IC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9iYXNlL3dhdGNoZG9nX3Bvc2l4LmNjCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL3dhdGNo
ZG9nLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8v
ZXh0L2Jhc2Uvd2F0Y2hkb2dfbm9vcC5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBB
bmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBh
Y2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90
IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAq
IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJl
cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy
ZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFO
WSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZv
ciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGlt
aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZF
VFRPX0VYVF9CQVNFX1dBVENIRE9HX05PT1BfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19F
WFRfQkFTRV9XQVRDSERPR19OT09QX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgV2F0Y2hkb2cgeworIHB1
YmxpYzoKKyAgY2xhc3MgVGltZXIgeworICAgcHVibGljOgorICAgIC8vIERlZmluZSBhbiBlbXB0
eSBkdG9yIHRvIGF2b2lkICJ1bnVzZWQgdmFyaWFibGUiIGVycm9ycyBvbiB0aGUgY2FsbCBzaXRl
LgorICAgIFRpbWVyKCkge30KKyAgICBUaW1lcihjb25zdCBUaW1lciYpIHt9CisgICAgflRpbWVy
KCkge30KKyAgfTsKKyAgc3RhdGljIFdhdGNoZG9nKiBHZXRJbnN0YW5jZSgpIHsKKyAgICBzdGF0
aWMgV2F0Y2hkb2cqIHdhdGNoZG9nID0gbmV3IFdhdGNoZG9nKCk7CisgICAgcmV0dXJuIHdhdGNo
ZG9nOworICB9CisgIFRpbWVyIENyZWF0ZUZhdGFsVGltZXIodWludDMyX3QgLyptcyovKSB7IHJl
dHVybiBUaW1lcigpOyB9CisgIHZvaWQgU3RhcnQoKSB7fQorICB2b2lkIFNldE1lbW9yeUxpbWl0
KHVpbnQ2NF90IC8qYnl0ZXMqLywgdWludDMyX3QgLyp3aW5kb3dfbXMqLykge30KKyAgdm9pZCBT
ZXRDcHVMaW1pdCh1aW50MzJfdCAvKnBlcmNlbnRhZ2UqLywgdWludDMyX3QgLyp3aW5kb3dfbXMq
Lykge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNFX1dBVENIRE9HX05PT1Bf
SF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJv
amVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAy
LjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg
aW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5
IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj
ZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBs
YXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRl
ciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lU
SE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNz
IG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFn
ZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGlj
ZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfV0FUQ0hET0df
SF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9XQVRDSERPR19IXworCisjaW5j
bHVkZSA8ZnVuY3Rpb25hbD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKworLy8gVGhlIFBPU0lYIHdhdGNoZG9n
IGlzIG9ubHkgc3VwcG9ydGVkIG9uIExpbnV4IGFuZCBBbmRyb2lkIGluIG5vbi1lbWJlZGRlcgor
Ly8gYnVpbGRzLgorI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19XQVRDSERPRykKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3dh
dGNoZG9nX3Bvc2l4LmgiCisjZWxzZQorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vZXh0L2Jhc2Uvd2F0Y2hkb2dfbm9vcC5oIgorI2VuZGlmCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIE1ha2UgdGhlIGxpbWl0cyBt
b3JlIHJlbGF4ZWQgb24gZGVza3RvcCwgd2hlcmUgbXVsdGktR0IgdHJhY2VzIGFyZSBsaWtlbHku
CisvLyBNdWx0aS1HQiB0cmFjZXMgY2FuIHRha2UgYnVyc3RzIG9mIGNwdSB0aW1lIHRvIHdyaXRl
IGludG8gZGlzayBhdCB0aGUgZW5kIG9mCisvLyB0aGUgdHJhY2UuCisjaWYgUEVSRkVUVE9fQlVJ
TERGTEFHKFBFUkZFVFRPX09TX0FORFJPSUQpCitjb25zdGV4cHIgdWludDMyX3Qga1dhdGNoZG9n
RGVmYXVsdENwdUxpbWl0ID0gNzU7Citjb25zdGV4cHIgdWludDMyX3Qga1dhdGNoZG9nRGVmYXVs
dENwdVdpbmRvdyA9IDUgKiA2MCAqIDEwMDA7ICAvLyA1IG1pbnV0ZXMuCisjZWxzZQorY29uc3Rl
eHByIHVpbnQzMl90IGtXYXRjaGRvZ0RlZmF1bHRDcHVMaW1pdCA9IDkwOworY29uc3RleHByIHVp
bnQzMl90IGtXYXRjaGRvZ0RlZmF1bHRDcHVXaW5kb3cgPSAxMCAqIDYwICogMTAwMDsgIC8vIDEw
IG1pbnV0ZXMuCisjZW5kaWYKKworLy8gVGhlIGRlZmF1bHQgbWVtb3J5IG1hcmdpbiB3ZSBnaXZl
IHRvIG91ciBwcm9jZXNzZXMuIFRoaXMgaXMgdXNlZCBhcyBhcyBhCisvLyBjb25zdGFudCB0byBw
dXQgb24gdG9wIG9mIHRoZSB0cmFjZSBidWZmZXJzLgorY29uc3RleHByIHVpbnQ2NF90IGtXYXRj
aGRvZ0RlZmF1bHRNZW1vcnlTbGFjayA9IDMyICogMTAyNCAqIDEwMjQ7ICAvLyAzMiBNaUIuCitj
b25zdGV4cHIgdWludDMyX3Qga1dhdGNoZG9nRGVmYXVsdE1lbW9yeVdpbmRvdyA9IDMwICogMTAw
MDsgIC8vIDMwIHNlY29uZHMuCisKK2lubGluZSB2b2lkIFJ1blRhc2tXaXRoV2F0Y2hkb2dHdWFy
ZChjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4mIHRhc2spIHsKKyAgLy8gTWF4aW11bSB0aW1l
IGEgc2luZ2xlIHRhc2sgY2FuIHRha2UgaW4gYSBUYXNrUnVubmVyIGJlZm9yZSB0aGUKKyAgLy8g
cHJvZ3JhbSBzdWljaWRlcy4KKyAgY29uc3RleHByIGludDY0X3Qga1dhdGNoZG9nTWlsbGlzID0g
MzAwMDA7ICAvLyAzMHMKKworICBXYXRjaGRvZzo6VGltZXIgaGFuZGxlID0KKyAgICAgIGJhc2U6
OldhdGNoZG9nOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVGYXRhbFRpbWVyKGtXYXRjaGRvZ01pbGxp
cyk7CisgIHRhc2soKTsKKworICAvLyBTdXBwcmVzcyB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3Mg
aW4gdGhlIGNsaWVudCBsaWJyYXJ5IGFtYWxnYW1hdGVkIGJ1aWxkLgorICAodm9pZClrV2F0Y2hk
b2dEZWZhdWx0Q3B1TGltaXQ7CisgICh2b2lkKWtXYXRjaGRvZ0RlZmF1bHRDcHVXaW5kb3c7Cisg
ICh2b2lkKWtXYXRjaGRvZ0RlZmF1bHRNZW1vcnlTbGFjazsKKyAgKHZvaWQpa1dhdGNoZG9nRGVm
YXVsdE1lbW9yeVdpbmRvdzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVz
cGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfV0FU
Q0hET0dfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3Vy
Y2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy
c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g
YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5v
cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj
YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl
ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor
ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs
YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0
aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9leHQvYmFzZS93YXRjaGRvZy5oIgorCisjaWYgUEVSRkVUVE9fQlVJTERGTEFH
KFBFUkZFVFRPX1dBVENIRE9HKQorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0
eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5j
bHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvdGhy
ZWFkX3V0aWxzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9leHQvYmFzZS9zY29wZWRfZmlsZS5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1
bHRQb2xsaW5nSW50ZXJ2YWwgPSAzMCAqIDEwMDA7CisKK2Jvb2wgSXNNdWx0aXBsZU9mKHVpbnQz
Ml90IG51bWJlciwgdWludDMyX3QgZGl2aXNvcikgeworICByZXR1cm4gbnVtYmVyID49IGRpdmlz
b3IgJiYgbnVtYmVyICUgZGl2aXNvciA9PSAwOworfQorCitkb3VibGUgTWVhbkZvckFycmF5KGNv
bnN0IHVpbnQ2NF90IGFycmF5W10sIHNpemVfdCBzaXplKSB7CisgIHVpbnQ2NF90IHRvdGFsID0g
MDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICB0b3RhbCArPSBh
cnJheVtpXTsKKyAgfQorICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPih0b3RhbCAvIHNpemUp
OworCit9CisKK30gIC8vICBuYW1lc3BhY2UKKworYm9vbCBSZWFkUHJvY1N0YXQoaW50IGZkLCBQ
cm9jU3RhdCogb3V0KSB7CisgIGNoYXIgY1s1MTJdOworICBzaXplX3QgY19wb3MgPSAwOworICB3
aGlsZSAoY19wb3MgPCBzaXplb2YoYykgLSAxKSB7CisgICAgc3NpemVfdCByZCA9IFBFUkZFVFRP
X0VJTlRSKHJlYWQoZmQsIGMgKyBjX3Bvcywgc2l6ZW9mKGMpIC0gY19wb3MpKTsKKyAgICBpZiAo
cmQgPCAwKSB7CisgICAgICBQRVJGRVRUT19FTE9HKCJGYWlsZWQgdG8gcmVhZCBzdGF0IGZpbGUg
dG8gZW5mb3JjZSByZXNvdXJjZSBsaW1pdHMuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIGlmIChyZCA9PSAwKQorICAgICAgYnJlYWs7CisgICAgY19wb3MgKz0gc3RhdGljX2Nh
c3Q8c2l6ZV90PihyZCk7CisgIH0KKyAgUEVSRkVUVE9fQ0hFQ0soY19wb3MgPCBzaXplb2YoYykp
OworICBjW2NfcG9zXSA9ICdcMCc7CisKKyAgaWYgKHNzY2FuZihjLAorICAgICAgICAgICAgICIl
KmQgJSpzICUqYyAlKmQgJSpkICUqZCAlKmQgJSpkICUqdSAlKnUgJSp1ICUqdSAlKnUgJWx1Igor
ICAgICAgICAgICAgICIlbHUgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSp1ICUqdSAlbGQiLAor
ICAgICAgICAgICAgICZvdXQtPnV0aW1lLCAmb3V0LT5zdGltZSwgJm91dC0+cnNzX3BhZ2VzKSAh
PSAzKSB7CisgICAgUEVSRkVUVE9fRUxPRygiSW52YWxpZCBzdGF0IGZvcm1hdDogJXMiLCBjKTsK
KyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1dhdGNoZG9nOjpX
YXRjaGRvZyh1aW50MzJfdCBwb2xsaW5nX2ludGVydmFsX21zKQorICAgIDogcG9sbGluZ19pbnRl
cnZhbF9tc18ocG9sbGluZ19pbnRlcnZhbF9tcykge30KKworV2F0Y2hkb2c6On5XYXRjaGRvZygp
IHsKKyAgaWYgKCF0aHJlYWRfLmpvaW5hYmxlKCkpIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIWVu
YWJsZWRfKTsKKyAgICByZXR1cm47CisgIH0KKyAgUEVSRkVUVE9fRENIRUNLKGVuYWJsZWRfKTsK
KyAgZW5hYmxlZF8gPSBmYWxzZTsKKyAgZXhpdF9zaWduYWxfLm5vdGlmeV9vbmUoKTsKKyAgdGhy
ZWFkXy5qb2luKCk7Cit9CisKK1dhdGNoZG9nKiBXYXRjaGRvZzo6R2V0SW5zdGFuY2UoKSB7Cisg
IHN0YXRpYyBXYXRjaGRvZyogd2F0Y2hkb2cgPSBuZXcgV2F0Y2hkb2coa0RlZmF1bHRQb2xsaW5n
SW50ZXJ2YWwpOworICByZXR1cm4gd2F0Y2hkb2c7Cit9CisKK1dhdGNoZG9nOjpUaW1lciBXYXRj
aGRvZzo6Q3JlYXRlRmF0YWxUaW1lcih1aW50MzJfdCBtcykgeworICBpZiAoIWVuYWJsZWRfLmxv
YWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpCisgICAgcmV0dXJuIFdhdGNoZG9nOjpUaW1l
cigwKTsKKworICByZXR1cm4gV2F0Y2hkb2c6OlRpbWVyKG1zKTsKK30KKwordm9pZCBXYXRjaGRv
Zzo6U3RhcnQoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChtdXRleF8p
OworICBpZiAodGhyZWFkXy5qb2luYWJsZSgpKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKGVuYWJs
ZWRfKTsKKyAgfSBlbHNlIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIWVuYWJsZWRfKTsKKworI2lm
IFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19MSU5VWCkgfHwgXAorICAgIFBFUkZFVFRP
X0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorICAgIC8vIEtpY2sgdGhlIHRocmVhZCB0
byBzdGFydCBydW5uaW5nIGJ1dCBvbmx5IG9uIEFuZHJvaWQgb3IgTGludXguCisgICAgZW5hYmxl
ZF8gPSB0cnVlOworICAgIHRocmVhZF8gPSBzdGQ6OnRocmVhZCgmV2F0Y2hkb2c6OlRocmVhZE1h
aW4sIHRoaXMpOworI2VuZGlmCisgIH0KK30KKwordm9pZCBXYXRjaGRvZzo6U2V0TWVtb3J5TGlt
aXQodWludDY0X3QgYnl0ZXMsIHVpbnQzMl90IHdpbmRvd19tcykgeworICAvLyBVcGRhdGUgdGhl
IGZpZWxkcyB1bmRlciB0aGUgbG9jay4KKyAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1
YXJkKG11dGV4Xyk7CisKKyAgUEVSRkVUVE9fQ0hFQ0soSXNNdWx0aXBsZU9mKHdpbmRvd19tcywg
cG9sbGluZ19pbnRlcnZhbF9tc18pIHx8IGJ5dGVzID09IDApOworCisgIHNpemVfdCBzaXplID0g
Ynl0ZXMgPT0gMCA/IDAgOiB3aW5kb3dfbXMgLyBwb2xsaW5nX2ludGVydmFsX21zXyArIDE7Cisg
IG1lbW9yeV93aW5kb3dfYnl0ZXNfLlJlc2V0KHNpemUpOworICBtZW1vcnlfbGltaXRfYnl0ZXNf
ID0gYnl0ZXM7Cit9CisKK3ZvaWQgV2F0Y2hkb2c6OlNldENwdUxpbWl0KHVpbnQzMl90IHBlcmNl
bnRhZ2UsIHVpbnQzMl90IHdpbmRvd19tcykgeworICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRl
eD4gZ3VhcmQobXV0ZXhfKTsKKworICBQRVJGRVRUT19DSEVDSyhwZXJjZW50YWdlIDw9IDEwMCk7
CisgIFBFUkZFVFRPX0NIRUNLKElzTXVsdGlwbGVPZih3aW5kb3dfbXMsIHBvbGxpbmdfaW50ZXJ2
YWxfbXNfKSB8fAorICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID09IDApOworCisgIHNpemVf
dCBzaXplID0gcGVyY2VudGFnZSA9PSAwID8gMCA6IHdpbmRvd19tcyAvIHBvbGxpbmdfaW50ZXJ2
YWxfbXNfICsgMTsKKyAgY3B1X3dpbmRvd190aW1lX3RpY2tzXy5SZXNldChzaXplKTsKKyAgY3B1
X2xpbWl0X3BlcmNlbnRhZ2VfID0gcGVyY2VudGFnZTsKK30KKwordm9pZCBXYXRjaGRvZzo6VGhy
ZWFkTWFpbigpIHsKKyAgYmFzZTo6U2NvcGVkRmlsZSBzdGF0X2ZkKGJhc2U6Ok9wZW5GaWxlKCIv
cHJvYy9zZWxmL3N0YXQiLCBPX1JET05MWSkpOworICBpZiAoIXN0YXRfZmQpIHsKKyAgICBQRVJG
RVRUT19FTE9HKCJGYWlsZWQgdG8gb3BlbiBzdGF0IGZpbGUgdG8gZW5mb3JjZSByZXNvdXJjZSBs
aW1pdHMuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11
dGV4PiBndWFyZChtdXRleF8pOworICBmb3IgKDs7KSB7CisgICAgZXhpdF9zaWduYWxfLndhaXRf
Zm9yKGd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlz
ZWNvbmRzKHBvbGxpbmdfaW50ZXJ2YWxfbXNfKSk7CisgICAgaWYgKCFlbmFibGVkXykKKyAgICAg
IHJldHVybjsKKworICAgIGxzZWVrKHN0YXRfZmQuZ2V0KCksIDAsIFNFRUtfU0VUKTsKKworICAg
IFByb2NTdGF0IHN0YXQ7CisgICAgaWYgKCFSZWFkUHJvY1N0YXQoc3RhdF9mZC5nZXQoKSwgJnN0
YXQpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3QgY3B1X3RpbWUgPSBz
dGF0LnV0aW1lICsgc3RhdC5zdGltZTsKKyAgICB1aW50NjRfdCByc3NfYnl0ZXMgPQorICAgICAg
ICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdC5yc3NfcGFnZXMpICogYmFzZTo6a1BhZ2VTaXpl
OworCisgICAgQ2hlY2tNZW1vcnkocnNzX2J5dGVzKTsKKyAgICBDaGVja0NwdShjcHVfdGltZSk7
CisgIH0KK30KKwordm9pZCBXYXRjaGRvZzo6Q2hlY2tNZW1vcnkodWludDY0X3QgcnNzX2J5dGVz
KSB7CisgIGlmIChtZW1vcnlfbGltaXRfYnl0ZXNfID09IDApCisgICAgcmV0dXJuOworCisgIC8v
IEFkZCB0aGUgY3VycmVudCBzdGF0IHZhbHVlIHRvIHRoZSByaW5nIGJ1ZmZlciBhbmQgY2hlY2sg
dGhhdCB0aGUgbWVhbgorICAvLyByZW1haW5zIHVuZGVyIG91ciB0aHJlc2hvbGQuCisgIGlmICht
ZW1vcnlfd2luZG93X2J5dGVzXy5QdXNoKHJzc19ieXRlcykpIHsKKyAgICBpZiAobWVtb3J5X3dp
bmRvd19ieXRlc18uTWVhbigpID4gc3RhdGljX2Nhc3Q8ZG91YmxlPihtZW1vcnlfbGltaXRfYnl0
ZXNfKSkgeworICAgICAgUEVSRkVUVE9fRUxPRygKKyAgICAgICAgICAiTWVtb3J5IHdhdGNoZG9n
IHRyaWdnZXIuIE1lbW9yeSB3aW5kb3cgb2YgJWYgYnl0ZXMgaXMgYWJvdmUgdGhlICIKKyAgICAg
ICAgICAiJSIgUFJJdTY0ICIgYnl0ZXMgbGltaXQuIiwKKyAgICAgICAgICBtZW1vcnlfd2luZG93
X2J5dGVzXy5NZWFuKCksIG1lbW9yeV9saW1pdF9ieXRlc18pOworICAgICAga2lsbChnZXRwaWQo
KSwgU0lHQUJSVCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgV2F0Y2hkb2c6OkNoZWNrQ3B1KHVp
bnQ2NF90IGNwdV90aW1lKSB7CisgIGlmIChjcHVfbGltaXRfcGVyY2VudGFnZV8gPT0gMCkKKyAg
ICByZXR1cm47CisKKyAgLy8gQWRkIHRoZSBjcHUgdGltZSB0byB0aGUgcmluZyBidWZmZXIuCisg
IGlmIChjcHVfd2luZG93X3RpbWVfdGlja3NfLlB1c2goY3B1X3RpbWUpKSB7CisgICAgLy8gQ29t
cHV0ZSB0aGUgcGVyY2VudGFnZSBvdmVyIHRoZSB3aG9sZSB3aW5kb3cgYW5kIGNoZWNrIHRoYXQg
aXQgcmVtYWlucworICAgIC8vIHVuZGVyIHRoZSB0aHJlc2hvbGQuCisgICAgdWludDY0X3QgZGlm
ZmVyZW5jZV90aWNrcyA9IGNwdV93aW5kb3dfdGltZV90aWNrc18uTmV3ZXN0V2hlbkZ1bGwoKSAt
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV93aW5kb3dfdGltZV90aWNrc18u
T2xkZXN0V2hlbkZ1bGwoKTsKKyAgICBkb3VibGUgd2luZG93X2ludGVydmFsX3RpY2tzID0KKyAg
ICAgICAgKHN0YXRpY19jYXN0PGRvdWJsZT4oV2luZG93VGltZUZvclJpbmdCdWZmZXIoY3B1X3dp
bmRvd190aW1lX3RpY2tzXykpIC8KKyAgICAgICAgIDEwMDAuMCkgKgorICAgICAgICBzdGF0aWNf
Y2FzdDxkb3VibGU+KHN5c2NvbmYoX1NDX0NMS19UQ0spKTsKKyAgICBkb3VibGUgcGVyY2VudGFn
ZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oZGlmZmVyZW5jZV90aWNrcykgLworICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPih3aW5kb3dfaW50ZXJ2YWxfdGlja3MpICog
MTAwOworICAgIGlmIChwZXJjZW50YWdlID4gY3B1X2xpbWl0X3BlcmNlbnRhZ2VfKSB7CisgICAg
ICBQRVJGRVRUT19FTE9HKCJDUFUgd2F0Y2hkb2cgdHJpZ2dlci4gJWYlJSBDUFUgdXNlIGlzIGFi
b3ZlIHRoZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgIiUlIENQVSBsaW1pdC4iLAor
ICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlLCBjcHVfbGltaXRfcGVyY2VudGFnZV8pOwor
ICAgICAga2lsbChnZXRwaWQoKSwgU0lHQUJSVCk7CisgICAgfQorICB9Cit9CisKK3VpbnQzMl90
IFdhdGNoZG9nOjpXaW5kb3dUaW1lRm9yUmluZ0J1ZmZlcihjb25zdCBXaW5kb3dlZEludGVydmFs
JiB3aW5kb3cpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3aW5kb3cuc2l6ZSgp
IC0gMSkgKiBwb2xsaW5nX2ludGVydmFsX21zXzsKK30KKworYm9vbCBXYXRjaGRvZzo6V2luZG93
ZWRJbnRlcnZhbDo6UHVzaCh1aW50NjRfdCBzYW1wbGUpIHsKKyAgLy8gQWRkIHRoZSBzYW1wbGUg
dG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHJpbmcgYnVmZmVyLgorICBidWZmZXJfW3Bv
c2l0aW9uX10gPSBzYW1wbGU7CisKKyAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiB3aXRoIG5leHQg
b25lIGNpcmN1bGFyaWx5LgorICBwb3NpdGlvbl8gPSAocG9zaXRpb25fICsgMSkgJSBzaXplXzsK
KworICAvLyBTZXQgdGhlIGZpbGxlZCBmbGFnIHRoZSBmaXJzdCB0aW1lIHdlIHdyYXAuCisgIGZp
bGxlZF8gPSBmaWxsZWRfIHx8IHBvc2l0aW9uXyA9PSAwOworICByZXR1cm4gZmlsbGVkXzsKK30K
KworZG91YmxlIFdhdGNoZG9nOjpXaW5kb3dlZEludGVydmFsOjpNZWFuKCkgY29uc3QgeworICBy
ZXR1cm4gTWVhbkZvckFycmF5KGJ1ZmZlcl8uZ2V0KCksIHNpemVfKTsKK30KKwordm9pZCBXYXRj
aGRvZzo6V2luZG93ZWRJbnRlcnZhbDo6Q2xlYXIoKSB7CisgIHBvc2l0aW9uXyA9IDA7CisgIGJ1
ZmZlcl8ucmVzZXQobmV3IHVpbnQ2NF90W3NpemVfXSgpKTsKK30KKwordm9pZCBXYXRjaGRvZzo6
V2luZG93ZWRJbnRlcnZhbDo6UmVzZXQoc2l6ZV90IG5ld19zaXplKSB7CisgIHBvc2l0aW9uXyA9
IDA7CisgIHNpemVfID0gbmV3X3NpemU7CisgIGJ1ZmZlcl8ucmVzZXQobmV3X3NpemUgPT0gMCA/
IG51bGxwdHIgOiBuZXcgdWludDY0X3RbbmV3X3NpemVdKCkpOworfQorCitXYXRjaGRvZzo6VGlt
ZXI6OlRpbWVyKHVpbnQzMl90IG1zKSB7CisgIGlmICghbXMpCisgICAgcmV0dXJuOyAgLy8gTm8t
b3AgdGltZXIgY3JlYXRlZCB3aGVuIHRoZSB3YXRjaGRvZyBpcyBkaXNhYmxlZC4KKworICBzdHJ1
Y3Qgc2lnZXZlbnQgc2V2ID0ge307CisgIHNldi5zaWdldl9ub3RpZnkgPSBTSUdFVl9USFJFQURf
SUQ7CisgIHNldi5fc2lnZXZfdW4uX3RpZCA9IGJhc2U6OkdldFRocmVhZElkKCk7CisgIHNldi5z
aWdldl9zaWdubyA9IFNJR0FCUlQ7CisgIFBFUkZFVFRPX0NIRUNLKHRpbWVyX2NyZWF0ZShDTE9D
S19NT05PVE9OSUMsICZzZXYsICZ0aW1lcmlkXykgIT0gLTEpOworICBzdHJ1Y3QgaXRpbWVyc3Bl
YyBpdHMgPSB7fTsKKyAgaXRzLml0X3ZhbHVlLnR2X3NlYyA9IG1zIC8gMTAwMDsKKyAgaXRzLml0
X3ZhbHVlLnR2X25zZWMgPSAxMDAwMDAwTCAqIChtcyAlIDEwMDApOworICBQRVJGRVRUT19DSEVD
Syh0aW1lcl9zZXR0aW1lKHRpbWVyaWRfLCAwLCAmaXRzLCBudWxscHRyKSAhPSAtMSk7Cit9CisK
K1dhdGNoZG9nOjpUaW1lcjo6flRpbWVyKCkgeworICBpZiAodGltZXJpZF8gIT0gbnVsbHB0cikg
eworICAgIHRpbWVyX2RlbGV0ZSh0aW1lcmlkXyk7CisgIH0KK30KKworV2F0Y2hkb2c6OlRpbWVy
OjpUaW1lcihUaW1lciYmIG90aGVyKSBub2V4Y2VwdCB7CisgIHRpbWVyaWRfID0gb3RoZXIudGlt
ZXJpZF87CisgIG90aGVyLnRpbWVyaWRfID0gbnVsbHB0cjsKK30KKworfSAgLy8gbmFtZXNwYWNl
IGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIFBFUkZFVFRPX0JV
SUxERkxBRyhQRVJGRVRUT19XQVRDSERPRykKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IHNyYy9iYXNlL2V2ZW50X2ZkLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL2V2ZW50X2ZkLmgKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2Vk
IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwor
ICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo
ZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cisg
KgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAq
CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdy
aXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0
cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENP
TkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUg
dGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lv
bnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVm
IElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfRVZFTlRfRkRfSF8KKyNkZWZpbmUgSU5DTFVERV9Q
RVJGRVRUT19FWFRfQkFTRV9FVkVOVF9GRF9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2Uvc2NvcGVkX2ZpbGUu
aCIKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19MSU5VWCkgfHwgXAorICAg
IFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorI2RlZmluZSBQRVJGRVRU
T19VU0VfRVZFTlRGRCgpIDEKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX1VTRV9FVkVOVEZEKCkg
MAorI2VuZGlmCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8v
IEEgd2FpdGFibGUgZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHBvbGwvc2VsZWN0LgorLy8g
VGhpcyBpcyByZWFsbHkgYSB3cmFwcGVyIGFyb3VuZCBldmVudGZkX2NyZWF0ZSB3aXRoIGEgcGlw
ZS1iYXNlZCBmYWxsYmFjaworLy8gZm9yIG90aGVyIHBsYXRmb3JtcyB3aGVyZSBldmVudGZkIGlz
IG5vdCBzdXBwb3J0ZWQuCitjbGFzcyBFdmVudEZkIHsKKyBwdWJsaWM6CisgIEV2ZW50RmQoKTsK
KyAgfkV2ZW50RmQoKTsKKyAgRXZlbnRGZChFdmVudEZkJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsK
KyAgRXZlbnRGZCYgb3BlcmF0b3I9KEV2ZW50RmQmJikgPSBkZWZhdWx0OworCisgIC8vIFRoZSBu
b24tYmxvY2tpbmcgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY2FuIGJlIHBvbGxlZCB0byB3YWl0IGZv
ciB0aGUgZXZlbnQuCisgIGludCBmZCgpIGNvbnN0IHsgcmV0dXJuIGZkXy5nZXQoKTsgfQorCisg
IC8vIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgorICB2b2lkIE5vdGlmeSgpOworCisg
IC8vIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLiBJZiBtb3JlIE5vdGlmeSgpIGFyZSBx
dWV1ZWQgYSBDbGVhcigpIGNhbGwKKyAgLy8gY2FuIGNsZWFyIGFsbCBvZiB0aGVtICh1cCB0byAx
NiBwZXIgY2FsbCkuCisgIHZvaWQgQ2xlYXIoKTsKKworIHByaXZhdGU6CisgIC8vIFRoZSBldmVu
dGZkLCB3aGVuIGV2ZW50ZmQgaXMgc3VwcG9ydGVkLCBvdGhlcndpc2UgdGhpcyBpcyB0aGUgcmVh
ZCBlbmQgb2YKKyAgLy8gdGhlIHBpcGUgZm9yIGZhbGxiYWNrIG1vZGUuCisgIFNjb3BlZEZpbGUg
ZmRfOworCisjaWYgIVBFUkZFVFRPX1VTRV9FVkVOVEZEKCkKKyAgLy8gVGhlIHdyaXRlIGVuZCBv
ZiB0aGUgd2FrZXVwIHBpcGUuCisgIFNjb3BlZEZpbGUgd3JpdGVfZmRfOworI2VuZGlmCit9Owor
Cit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRp
ZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9FVkVOVF9GRF9IXworLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGlj
ZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNl
Iik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdp
dGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2Ug
YXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIu
MAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8g
aW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlz
IGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMg
T1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAq
IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt
aXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRf
Y29uZmlnLmgiCisjaWYgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisKKyNp
bmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9ldmVudF9m
ZC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0
L2Jhc2UvcGlwZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vZXh0L2Jhc2UvdXRpbHMuaCIKKworI2lmIFBFUkZFVFRPX1VTRV9FVkVOVEZEKCkKKyNp
bmNsdWRlIDxzeXMvZXZlbnRmZC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBwZXJmZXR0byB7Citu
YW1lc3BhY2UgYmFzZSB7CisKK0V2ZW50RmQ6OkV2ZW50RmQoKSB7CisjaWYgUEVSRkVUVE9fVVNF
X0VWRU5URkQoKQorICBmZF8ucmVzZXQoZXZlbnRmZCgvKiBzdGFydCB2YWx1ZSAqLyAwLCBFRkRf
Q0xPRVhFQyB8IEVGRF9OT05CTE9DSykpOworICBQRVJGRVRUT19DSEVDSyhmZF8pOworI2Vsc2UK
KyAgLy8gTWFrZSB0aGUgcGlwZSBub24tYmxvY2tpbmcgc28gdGhhdCB3ZSBuZXZlciBibG9jayB0
aGUgd2FraW5nIHRocmVhZCAoZWl0aGVyCisgIC8vIHRoZSBtYWluIHRocmVhZCBvciBhbm90aGVy
IG9uZSkgd2hlbiBzY2hlZHVsaW5nIGEgd2FrZS11cC4KKyAgUGlwZSBwaXBlID0gUGlwZTo6Q3Jl
YXRlKFBpcGU6OmtCb3RoTm9uQmxvY2spOworICBmZF8gPSBzdGQ6Om1vdmUocGlwZS5yZCk7Cisg
IHdyaXRlX2ZkXyA9IHN0ZDo6bW92ZShwaXBlLndyKTsKKyNlbmRpZiAgLy8gIVBFUkZFVFRPX1VT
RV9FVkVOVEZEKCkKK30KKworRXZlbnRGZDo6fkV2ZW50RmQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQg
RXZlbnRGZDo6Tm90aWZ5KCkgeworICBjb25zdCB1aW50NjRfdCB2YWx1ZSA9IDE7CisKKyNpZiBQ
RVJGRVRUT19VU0VfRVZFTlRGRCgpCisgIHNzaXplX3QgcmV0ID0gd3JpdGUoZmRfLmdldCgpLCAm
dmFsdWUsIHNpemVvZih2YWx1ZSkpOworI2Vsc2UKKyAgc3NpemVfdCByZXQgPSB3cml0ZSh3cml0
ZV9mZF8uZ2V0KCksICZ2YWx1ZSwgc2l6ZW9mKHVpbnQ4X3QpKTsKKyNlbmRpZgorCisgIGlmIChy
ZXQgPD0gMCAmJiBlcnJubyAhPSBFQUdBSU4pIHsKKyAgICBQRVJGRVRUT19ERkFUQUwoIndyaXRl
KCkiKTsKKyAgfQorfQorCit2b2lkIEV2ZW50RmQ6OkNsZWFyKCkgeworI2lmIFBFUkZFVFRPX1VT
RV9FVkVOVEZEKCkKKyAgdWludDY0X3QgdmFsdWU7CisgIHNzaXplX3QgcmV0ID0gcmVhZChmZF8u
Z2V0KCksICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisjZWxzZQorICAvLyBEcmFpbiB0aGUgYnl0
ZShzKSB3cml0dGVuIHRvIHRoZSB3YWtlLXVwIHBpcGUuIFdlIGNhbiBwb3RlbnRpYWxseSByZWFk
CisgIC8vIG1vcmUgdGhhbiBvbmUgYnl0ZSBpZiBzZXZlcmFsIHdha2UtdXBzIGhhdmUgYmVlbiBz
Y2hlZHVsZWQuCisgIGNoYXIgYnVmZmVyWzE2XTsKKyAgc3NpemVfdCByZXQgPSByZWFkKGZkXy5n
ZXQoKSwgJmJ1ZmZlclswXSwgc2l6ZW9mKGJ1ZmZlcikpOworI2VuZGlmCisgIGlmIChyZXQgPD0g
MCAmJiBlcnJubyAhPSBFQUdBSU4pCisgICAgUEVSRkVUVE9fRFBMT0coInJlYWQoKSIpOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRp
ZiAgLy8gIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvYmFzZS9waXBlLmNjCisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1
bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAq
IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUg
TGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoK
KyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgor
ICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0
aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJp
YnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05E
SVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRo
ZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25z
IGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcu
aCIKKyNpZiAhUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikKKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvcGlwZS5oIgor
CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCitQaXBlOjpQaXBlKCkg
PSBkZWZhdWx0OworUGlwZTo6UGlwZShQaXBlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1BpcGUm
IFBpcGU6Om9wZXJhdG9yPShQaXBlJiYpID0gZGVmYXVsdDsKKworUGlwZSBQaXBlOjpDcmVhdGUo
RmxhZ3MgZmxhZ3MpIHsKKyAgaW50IGZkc1syXTsKKyAgUEVSRkVUVE9fQ0hFQ0socGlwZShmZHMp
ID09IDApOworICBQaXBlIHA7CisgIHAucmQucmVzZXQoZmRzWzBdKTsKKyAgcC53ci5yZXNldChm
ZHNbMV0pOworCisgIFBFUkZFVFRPX0NIRUNLKGZjbnRsKCpwLnJkLCBGX1NFVEZELCBGRF9DTE9F
WEVDKSA9PSAwKTsKKyAgUEVSRkVUVE9fQ0hFQ0soZmNudGwoKnAud3IsIEZfU0VURkQsIEZEX0NM
T0VYRUMpID09IDApOworCisgIGlmIChmbGFncyA9PSBrQm90aE5vbkJsb2NrIHx8IGZsYWdzID09
IGtSZE5vbkJsb2NrKSB7CisgICAgaW50IGN1cl9mbGFncyA9IGZjbnRsKCpwLnJkLCBGX0dFVEZM
LCAwKTsKKyAgICBQRVJGRVRUT19DSEVDSyhjdXJfZmxhZ3MgPj0gMCk7CisgICAgUEVSRkVUVE9f
Q0hFQ0soZmNudGwoKnAucmQsIEZfU0VURkwsIGN1cl9mbGFncyB8IE9fTk9OQkxPQ0spID09IDAp
OworICB9CisKKyAgaWYgKGZsYWdzID09IGtCb3RoTm9uQmxvY2sgfHwgZmxhZ3MgPT0ga1dyTm9u
QmxvY2spIHsKKyAgICBpbnQgY3VyX2ZsYWdzID0gZmNudGwoKnAud3IsIEZfR0VURkwsIDApOwor
ICAgIFBFUkZFVFRPX0NIRUNLKGN1cl9mbGFncyA+PSAwKTsKKyAgICBQRVJGRVRUT19DSEVDSyhm
Y250bCgqcC53ciwgRl9TRVRGTCwgY3VyX2ZsYWdzIHwgT19OT05CTE9DSykgPT0gMCk7CisgIH0K
KyAgcmV0dXJuIHA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KKworI2VuZGlmICAvLyAhUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJ
TikKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9iYXNlL3RlbXBfZmlsZS5j
YworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQv
YmFzZS90ZW1wX2ZpbGUuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBP
cGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNl
bnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhp
cyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5
IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cu
YXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBi
eSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRp
c3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIg
QkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwg
ZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNw
ZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25z
IHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRf
QkFTRV9URU1QX0ZJTEVfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9URU1Q
X0ZJTEVfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2Uvc2NvcGVkX2ZpbGUuaCIKKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgVGVtcEZpbGUgeworIHB1
YmxpYzoKKyAgc3RhdGljIFRlbXBGaWxlIENyZWF0ZVVubGlua2VkKCk7CisgIHN0YXRpYyBUZW1w
RmlsZSBDcmVhdGUoKTsKKworICBUZW1wRmlsZShUZW1wRmlsZSYmKSBub2V4Y2VwdDsKKyAgVGVt
cEZpbGUmIG9wZXJhdG9yPShUZW1wRmlsZSYmKTsKKyAgflRlbXBGaWxlKCk7CisKKyAgY29uc3Qg
c3RkOjpzdHJpbmcmIHBhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQorICBpbnQgZmQoKSBj
b25zdCB7IHJldHVybiAqZmRfOyB9CisgIGludCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAq
ZmRfOyB9CisKKyAgLy8gVW5saW5rcyB0aGUgZmlsZSBmcm9tIHRoZSBmaWxlc3lzdGVtIGJ1dCBr
ZWVwcyB0aGUgZmQoKSBvcGVuLgorICAvLyBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtdWx0aXBs
ZSB0aW1lcy4KKyAgdm9pZCBVbmxpbmsoKTsKKworICAvLyBSZWxlYXNlcyB0aGUgdW5kZXJseWlu
ZyBmaWxlIGRlc2NyaXB0b3IuIFdpbGwgdW5saW5rIHRoZSBmaWxlIGZyb20gdGhlCisgIC8vIGZp
bGVzeXN0ZW0gaWYgaXQgd2FzIGNyZWF0ZWQgdmlhIENyZWF0ZVVubGlua2VkKCkuCisgIFNjb3Bl
ZEZpbGUgUmVsZWFzZUZEKCk7CisKKyBwcml2YXRlOgorICBUZW1wRmlsZSgpOworICBUZW1wRmls
ZShjb25zdCBUZW1wRmlsZSYpID0gZGVsZXRlOworICBUZW1wRmlsZSYgb3BlcmF0b3I9KGNvbnN0
IFRlbXBGaWxlJikgPSBkZWxldGU7CisKKyAgU2NvcGVkRmlsZSBmZF87CisgIHN0ZDo6c3RyaW5n
IHBhdGhfOworfTsKKworY2xhc3MgVGVtcERpciB7CisgcHVibGljOgorICBzdGF0aWMgVGVtcERp
ciBDcmVhdGUoKTsKKworICBUZW1wRGlyKFRlbXBEaXImJikgbm9leGNlcHQ7CisgIFRlbXBEaXIm
IG9wZXJhdG9yPShUZW1wRGlyJiYpOworICB+VGVtcERpcigpOworCisgIGNvbnN0IHN0ZDo6c3Ry
aW5nJiBwYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KKworIHByaXZhdGU6CisgIFRlbXBE
aXIoKTsKKyAgVGVtcERpcihjb25zdCBUZW1wRGlyJikgPSBkZWxldGU7CisgIFRlbXBEaXImIG9w
ZXJhdG9yPShjb25zdCBUZW1wRGlyJikgPSBkZWxldGU7CisKKyAgc3RkOjpzdHJpbmcgcGF0aF87
Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisK
KyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9URU1QX0ZJTEVfSF8KKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElD
RU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdy
ZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj
ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJS
QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp
ZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p
bmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAq
LworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L2J1aWxkX2NvbmZpZy5oIgorI2lmICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lO
KQorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQv
YmFzZS90ZW1wX2ZpbGUuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0
ZC5oPgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3Bh
Y2UgeworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorY29uc3Rl
eHByIGNoYXIga1N5c1RtcFBhdGhbXSA9ICIvZGF0YS9sb2NhbC90bXAiOworI2Vsc2UKK2NvbnN0
ZXhwciBjaGFyIGtTeXNUbXBQYXRoW10gPSAiL3RtcCI7CisjZW5kaWYKK30gIC8vIG5hbWVzcGFj
ZQorCisvLyBzdGF0aWMKK1RlbXBGaWxlIFRlbXBGaWxlOjpDcmVhdGUoKSB7CisgIFRlbXBGaWxl
IHRlbXBfZmlsZTsKKyAgY29uc3QgY2hhciogdG1wZGlyID0gZ2V0ZW52KCJUTVBESVIiKTsKKyAg
aWYgKHRtcGRpcikgeworICAgIHRlbXBfZmlsZS5wYXRoXy5hc3NpZ24odG1wZGlyKTsKKyAgfSBl
bHNlIHsKKyAgICB0ZW1wX2ZpbGUucGF0aF8uYXNzaWduKGtTeXNUbXBQYXRoKTsKKyAgfQorICB0
ZW1wX2ZpbGUucGF0aF8uYXBwZW5kKCIvcGVyZmV0dG8tWFhYWFhYWFgiKTsKKyAgdGVtcF9maWxl
LmZkXy5yZXNldChta3N0ZW1wKCZ0ZW1wX2ZpbGUucGF0aF9bMF0pKTsKKyAgaWYgKFBFUkZFVFRP
X1VOTElLRUxZKCF0ZW1wX2ZpbGUuZmRfKSkgeworICAgIFBFUkZFVFRPX0ZBVEFMKCJDb3VsZCBu
b3QgY3JlYXRlIHRlbXAgZmlsZSAlcyIsIHRlbXBfZmlsZS5wYXRoXy5jX3N0cigpKTsKKyAgfQor
ICByZXR1cm4gdGVtcF9maWxlOworfQorCisvLyBzdGF0aWMKK1RlbXBGaWxlIFRlbXBGaWxlOjpD
cmVhdGVVbmxpbmtlZCgpIHsKKyAgVGVtcEZpbGUgdGVtcF9maWxlID0gVGVtcEZpbGU6OkNyZWF0
ZSgpOworICB0ZW1wX2ZpbGUuVW5saW5rKCk7CisgIHJldHVybiB0ZW1wX2ZpbGU7Cit9CisKK1Rl
bXBGaWxlOjpUZW1wRmlsZSgpID0gZGVmYXVsdDsKKworVGVtcEZpbGU6On5UZW1wRmlsZSgpIHsK
KyAgVW5saW5rKCk7Cit9CisKK1Njb3BlZEZpbGUgVGVtcEZpbGU6OlJlbGVhc2VGRCgpIHsKKyAg
VW5saW5rKCk7CisgIHJldHVybiBzdGQ6Om1vdmUoZmRfKTsKK30KKwordm9pZCBUZW1wRmlsZTo6
VW5saW5rKCkgeworICBpZiAocGF0aF8uZW1wdHkoKSkKKyAgICByZXR1cm47CisgIFBFUkZFVFRP
X0NIRUNLKHVubGluayhwYXRoXy5jX3N0cigpKSA9PSAwKTsKKyAgcGF0aF8uY2xlYXIoKTsKK30K
KworVGVtcEZpbGU6OlRlbXBGaWxlKFRlbXBGaWxlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1Rl
bXBGaWxlJiBUZW1wRmlsZTo6b3BlcmF0b3I9KFRlbXBGaWxlJiYpID0gZGVmYXVsdDsKKworLy8g
c3RhdGljCitUZW1wRGlyIFRlbXBEaXI6OkNyZWF0ZSgpIHsKKyAgVGVtcERpciB0ZW1wX2RpcjsK
KyAgdGVtcF9kaXIucGF0aF8uYXNzaWduKGtTeXNUbXBQYXRoKTsKKyAgdGVtcF9kaXIucGF0aF8u
YXBwZW5kKCIvcGVyZmV0dG8tWFhYWFhYWFgiKTsKKyAgUEVSRkVUVE9fQ0hFQ0sobWtkdGVtcCgm
dGVtcF9kaXIucGF0aF9bMF0pKTsKKyAgcmV0dXJuIHRlbXBfZGlyOworfQorCitUZW1wRGlyOjpU
ZW1wRGlyKCkgPSBkZWZhdWx0OworCitUZW1wRGlyOjp+VGVtcERpcigpIHsKKyAgUEVSRkVUVE9f
Q0hFQ0socm1kaXIocGF0aF8uY19zdHIoKSkgPT0gMCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBi
YXNlCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworCisjZW5kaWYgIC8vICFQRVJGRVRUT19C
VUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJj
ZTogc3JjL2Jhc2UvdGhyZWFkX3Rhc2tfcnVubmVyLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL3RocmVhZF90YXNrX3J1bm5lci5o
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9i
YXNlL3VuaXhfdGFza19ydW5uZXIuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5k
cm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNo
ZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1
c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZ
b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6
Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1
aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUK
KyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkg
S0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0
YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRU
T19FWFRfQkFTRV9VTklYX1RBU0tfUlVOTkVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9f
RVhUX0JBU0VfVU5JWF9UQVNLX1JVTk5FUl9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS90YXNrX3J1bm5lci5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS90aHJl
YWRfdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvdGltZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vZXh0L2Jhc2UvZXZlbnRfZmQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3Njb3BlZF9maWxlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS90aHJlYWRfY2hl
Y2tlci5oIgorCisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRl
IDxkZXF1ZT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVj
dG9yPgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCisvLyBSdW5z
IGEgdGFzayBydW5uZXIgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgorLy8KKy8vIEltcGxlbWVudGF0
aW9uIG5vdGU6IHdlIGN1cnJlbnRseSBhc3N1bWUgKGFuZCBlbmZvcmNlIGluIGRlYnVnIGJ1aWxk
cykgdGhhdAorLy8gUnVuKCkgaXMgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNvbnN0cnVj
dGVkIHRoZSBVbml4VGFza1J1bm5lci4gVGhpcyBpcworLy8gbm90IHN0cmljdGx5IG5lY2Vzc2Fy
eSwgYW5kIHdlIGNvdWxkIGluc3RlYWQgdHJhY2sgdGhlIHRocmVhZCB0aGF0IGludm9rZXMKKy8v
IFJ1bigpLiBIb3dldmVyLCBhIHJlbGF0ZWQgcHJvcGVydHkgdGhhdCAqbWlnaHQqIGJlIGltcG9y
dGFudCB0byBlbmZvcmNlIGlzCisvLyB0aGF0IHRoZSBkZXN0cnVjdG9yIHJ1bnMgb24gdGhlIHRh
c2stcnVubmluZyB0aHJlYWQuIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlCisvLyBzdGlsbC1wZW5k
aW5nIHRhc2tzIGF0IHRoZSB0aW1lIG9mIGRlc3RydWN0aW9uLCB3ZSB3b3VsZCBkZXN0cm95IHRo
b3NlCisvLyBvdXRzaWRlIG9mIHRoZSB0YXNrIHRocmVhZCAod2hpY2ggbWlnaHQgYmUgdW5leHBl
Y3RlZCB0byB0aGUgY2FsbGVyKS4gT24gdGhlCisvLyBvdGhlciBoYW5kLCB0aGUgc3RkOjpmdW5j
dGlvbiB0YXNrIGludGVyZmFjZSBkaXNjb3VyYWdlcyB1c2Ugb2YgYW55CisvLyByZXNvdXJjZS1v
d25pbmcgdGFza3MgKGFzIHRoZSBjYWxsYWJsZSBuZWVkcyB0byBiZSBjb3B5YWJsZSksIHNvIHRo
aXMgbWlnaHQKKy8vIG5vdCBiZSBpbXBvcnRhbnQgaW4gcHJhY3RpY2UuCisvLworLy8gVE9ETyhy
c2F2aXRza2kpOiBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWQtY2hlY2sgaW4gdGhlIGRlc3RydWN0
b3IsIGFmdGVyCisvLyBhdWRpdGluZyBleGlzdGluZyB1c2FnZXMuCitjbGFzcyBVbml4VGFza1J1
bm5lciA6IHB1YmxpYyBUYXNrUnVubmVyIHsKKyBwdWJsaWM6CisgIFVuaXhUYXNrUnVubmVyKCk7
CisgIH5Vbml4VGFza1J1bm5lcigpIG92ZXJyaWRlOworCisgIC8vIFN0YXJ0IGV4ZWN1dGluZyB0
YXNrcy4gRG9lc24ndCByZXR1cm4gdW50aWwgUXVpdCgpIGlzIGNhbGxlZC4gUnVuKCkgbWF5IGJl
CisgIC8vIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSB0YXNrIHJ1bm5lci4KKyAg
dm9pZCBSdW4oKTsKKyAgdm9pZCBRdWl0KCk7CisKKyAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlcmUg
YXJlIGFueSBwZW5kaW5nIGltbWVkaWF0ZSB0YXNrcyB0byBydW4uIE5vdGUgdGhhdAorICAvLyBk
ZWxheWVkIHRhc2tzIGRvbid0IGNvdW50IGV2ZW4gaWYgdGhleSBhcmUgZHVlIHRvIHJ1bi4KKyAg
Ym9vbCBJc0lkbGVGb3JUZXN0aW5nKCk7CisKKyAgLy8gVGFza1J1bm5lciBpbXBsZW1lbnRhdGlv
bjoKKyAgdm9pZCBQb3N0VGFzayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4pIG92ZXJyaWRlOworICB2
b2lkIFBvc3REZWxheWVkVGFzayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4sIHVpbnQzMl90IGRlbGF5
X21zKSBvdmVycmlkZTsKKyAgdm9pZCBBZGRGaWxlRGVzY3JpcHRvcldhdGNoKGludCBmZCwgc3Rk
OjpmdW5jdGlvbjx2b2lkKCk+KSBvdmVycmlkZTsKKyAgdm9pZCBSZW1vdmVGaWxlRGVzY3JpcHRv
cldhdGNoKGludCBmZCkgb3ZlcnJpZGU7CisgIGJvb2wgUnVuc1Rhc2tzT25DdXJyZW50VGhyZWFk
KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHJ1bm5l
ciBpcyBxdWl0dGluZywgb3IgaGFzIHF1aXQgYW5kIGhhc24ndCBiZWVuCisgIC8vIHJlc3RhcnRl
ZCBzaW5jZS4gRXhwb3NlZCBwcmltYXJpbHkgZm9yIFRocmVhZFRhc2tSdW5uZXIsIG5vdCBuZWNl
c3NhcnkgZm9yCisgIC8vIG5vcm1hbCB1c2Ugb2YgdGhpcyBjbGFzcy4KKyAgYm9vbCBRdWl0Q2Fs
bGVkKCk7CisKKyBwcml2YXRlOgorICB2b2lkIFdha2VVcCgpOworCisgIHZvaWQgVXBkYXRlV2F0
Y2hUYXNrc0xvY2tlZCgpOworCisgIGludCBHZXREZWxheU1zVG9OZXh0VGFza0xvY2tlZCgpIGNv
bnN0OworICB2b2lkIFJ1bkltbWVkaWF0ZUFuZERlbGF5ZWRUYXNrKCk7CisgIHZvaWQgUG9zdEZp
bGVEZXNjcmlwdG9yV2F0Y2hlcygpOworICB2b2lkIFJ1bkZpbGVEZXNjcmlwdG9yV2F0Y2goaW50
IGZkKTsKKworICBUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKKyAgUGxhdGZvcm1UaHJl
YWRJZCBjcmVhdGVkX3RocmVhZF9pZF8gPSBHZXRUaHJlYWRJZCgpOworCisgIC8vIE9uIExpbnV4
LCBhbiBldmVudGZkKDIpIHVzZWQgdG8gd2FraW5nIHVwIHRoZSB0YXNrIHJ1bm5lciB3aGVuIGEg
bmV3IHRhc2sKKyAgLy8gaXMgcG9zdGVkLiBPdGhlcndpc2UgdGhlIHJlYWQgZW5kIG9mIGEgcGlw
ZSB1c2VkIGZvciB0aGUgc2FtZSBwdXJwb3NlLgorICBFdmVudEZkIGV2ZW50XzsKKworICBzdGQ6
OnZlY3RvcjxzdHJ1Y3QgcG9sbGZkPiBwb2xsX2Zkc187CisKKyAgLy8gLS0tIEJlZ2luIGxvY2st
cHJvdGVjdGVkIG1lbWJlcnMgLS0tCisKKyAgc3RkOjptdXRleCBsb2NrXzsKKworICBzdGQ6OmRl
cXVlPHN0ZDo6ZnVuY3Rpb248dm9pZCgpPj4gaW1tZWRpYXRlX3Rhc2tzXzsKKyAgc3RkOjptdWx0
aW1hcDxUaW1lTWlsbGlzLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+IGRlbGF5ZWRfdGFza3NfOwor
ICBib29sIHF1aXRfID0gZmFsc2U7CisKKyAgc3RydWN0IFdhdGNoVGFzayB7CisgICAgc3RkOjpm
dW5jdGlvbjx2b2lkKCk+IGNhbGxiYWNrOworICAgIHNpemVfdCBwb2xsX2ZkX2luZGV4OyAgLy8g
SW5kZXggaW50byB8cG9sbF9mZHNffC4KKyAgfTsKKworICBzdGQ6Om1hcDxpbnQsIFdhdGNoVGFz
az4gd2F0Y2hfdGFza3NfOworICBib29sIHdhdGNoX3Rhc2tzX2NoYW5nZWRfID0gZmFsc2U7CisK
KyAgLy8gLS0tIEVuZCBsb2NrLXByb3RlY3RlZCBtZW1iZXJzIC0tLQorfTsKKworfSAgLy8gbmFt
ZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xV
REVfUEVSRkVUVE9fRVhUX0JBU0VfVU5JWF9UQVNLX1JVTk5FUl9IXworLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5z
ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7
CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgg
dGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQK
KyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAor
ICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4g
d3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRp
c3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1Ig
Q09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNl
ZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNz
aW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5k
ZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9USFJFQURfVEFTS19SVU5ORVJfSF8KKyNkZWZp
bmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9USFJFQURfVEFTS19SVU5ORVJfSF8KKworI2lu
Y2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dGhyZWFkPgorCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS91bml4X3Rhc2tfcnVubmVy
LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgVW5p
eFRhc2tSdW5uZXIgYmFja2VkIGJ5IGEgZGVkaWNhdGVkIHRhc2sgdGhyZWFkLiBTaHV0cyBkb3du
IHRoZSBydW5uZXIgYW5kCisvLyBqb2lucyB0aGUgdGhyZWFkIHVwb24gZGVzdHJ1Y3Rpb24uIENh
biBiZSBtb3ZlZCB0byB0cmFuc2ZlciBvd25lcnNoaXAuCisvLworLy8gR3VhcmFudGVlcyB0aGF0
OgorLy8gKiB0aGUgVW5peFRhc2tSdW5uZXIgd2lsbCBiZSBjb25zdHJ1Y3RlZCBhbmQgZGVzdHJ1
Y3RlZCBvbiB0aGUgdGFzayB0aHJlYWQuCisvLyAqIHRoZSB0YXNrIHRocmVhZCB3aWxsIGxpdmUg
Zm9yIHRoZSBsaWZldGltZSBvZiB0aGUgVW5peFRhc2tSdW5uZXIuCisvLworY2xhc3MgVGhyZWFk
VGFza1J1bm5lciB7CisgcHVibGljOgorICBzdGF0aWMgVGhyZWFkVGFza1J1bm5lciBDcmVhdGVB
bmRTdGFydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIFRocmVh
ZFRhc2tSdW5uZXIobmFtZSk7CisgIH0KKworICBUaHJlYWRUYXNrUnVubmVyKGNvbnN0IFRocmVh
ZFRhc2tSdW5uZXImKSA9IGRlbGV0ZTsKKyAgVGhyZWFkVGFza1J1bm5lciYgb3BlcmF0b3I9KGNv
bnN0IFRocmVhZFRhc2tSdW5uZXImKSA9IGRlbGV0ZTsKKworICBUaHJlYWRUYXNrUnVubmVyKFRo
cmVhZFRhc2tSdW5uZXImJikgbm9leGNlcHQ7CisgIFRocmVhZFRhc2tSdW5uZXImIG9wZXJhdG9y
PShUaHJlYWRUYXNrUnVubmVyJiYpOworICB+VGhyZWFkVGFza1J1bm5lcigpOworCisgIC8vIEV4
ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiB0aGUgdGFzayBydW5uZXIgdGhyZWFkIGFuZCBi
bG9ja3MgdGhlIGNhbGxlcgorICAvLyB0aHJlYWQgdW50aWwgdGhlIGZ1bmN0aW9uIGhhcyBydW4u
CisgIHZvaWQgUG9zdFRhc2tBbmRXYWl0Rm9yVGVzdGluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4p
OworCisgIC8vIENhbiBiZSBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZCB0byBnZXQgdGhlIENQ
VSB0aW1lIG9mIHRoZSB0aHJlYWQgdGhlCisgIC8vIHRhc2stcnVubmVyIGlzIGV4ZWN1dGluZyBv
bi4KKyAgdWludDY0X3QgR2V0VGhyZWFkQ1BVVGltZU5zRm9yVGVzdGluZygpOworCisgIC8vIFJl
dHVybnMgYSBwb2ludGVyIHRvIHRoZSBVbml4VGFza1J1bm5lciwgd2hpY2ggaXMgdmFsaWQgZm9y
IHRoZSBsaWZldGltZSBvZgorICAvLyB0aGlzIFRocmVhZFRhc2tSdW5uZXIgb2JqZWN0ICh1bmxl
c3MgdGhpcyBvYmplY3QgaXMgbW92ZWQtZnJvbSwgaW4gd2hpY2gKKyAgLy8gY2FzZSB0aGUgcG9p
bnRlciByZW1haW5zIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIG5ldyBvd25pbmcKKyAg
Ly8gVGhyZWFkVGFza1J1bm5lcikuCisgIC8vCisgIC8vIFdhcm5pbmc6IGRvIG5vdCBjYWxsIFF1
aXQoKSBvbiB0aGUgcmV0dXJuZWQgcnVubmVyIHBvaW50ZXIsIHRoZSB0ZXJtaW5hdGlvbgorICAv
LyBzaG91bGQgYmUgaGFuZGxlZCBleGNsdXNpdmVseSBieSB0aGlzIGNsYXNzJyBkZXN0cnVjdG9y
LgorICBVbml4VGFza1J1bm5lciogZ2V0KCkgY29uc3QgeyByZXR1cm4gdGFza19ydW5uZXJfOyB9
CisKKyBwcml2YXRlOgorICBleHBsaWNpdCBUaHJlYWRUYXNrUnVubmVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiBuYW1lKTsKKyAgdm9pZCBSdW5UYXNrVGhyZWFkKHN0ZDo6ZnVuY3Rpb248dm9pZChVbml4
VGFza1J1bm5lciopPiBpbml0aWFsaXplcik7CisKKyAgc3RkOjp0aHJlYWQgdGhyZWFkXzsKKyAg
c3RkOjpzdHJpbmcgbmFtZV87CisgIFVuaXhUYXNrUnVubmVyKiB0YXNrX3J1bm5lcl8gPSBudWxs
cHRyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0
bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfVEhSRUFEX1RBU0tfUlVO
TkVSX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRv
L2V4dC9iYXNlL3RocmVhZF91dGlscy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBB
bmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBh
Y2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90
IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAq
IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJl
cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy
ZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFO
WSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZv
ciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGlt
aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZF
VFRPX0VYVF9CQVNFX1RIUkVBRF9VVElMU19IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0VY
VF9CQVNFX1RIUkVBRF9VVElMU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5o
IgorCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0xJTlVYKSB8fCAgIFwKKyAg
ICBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfQU5EUk9JRCkgfHwgXAorICAgIFBFUkZF
VFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19NQUNPU1gpCisjaW5jbHVkZSA8cHRocmVhZC5oPgor
I2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNlbmRpZgorCisvLyBJ
bnRlcm5hbCBpbXBsZW1lbnRhdGlvbiB1dGlscyB0aGF0IGFyZW4ndCBhcyB3aWRlbHkgdXNlZnVs
L3N1cHBvcnRlZCBhcworLy8gYmFzZS90aHJlYWRfdXRpbHMuaC4KKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRU
T19PU19MSU5VWCkgfHwgICBcCisgICAgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0FO
RFJPSUQpIHx8IFwKKyAgICBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTUFDT1NYKQor
Ly8gU2V0cyB0aGUgImNvbW0iIG9mIHRoZSBjYWxsaW5nIHRocmVhZCB0byB0aGUgZmlyc3QgMTUg
Y2hhcnMgb2YgdGhlIGdpdmVuCisvLyBzdHJpbmcuCitpbmxpbmUgYm9vbCBNYXliZVNldFRocmVh
ZE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgY2hhciBidWZbMTZdID0ge307Cisg
IHNpemVfdCBzeiA9IHN0ZDo6bWluKG5hbWUuc2l6ZSgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDE1
KSk7CisgIHN0cm5jcHkoYnVmLCBuYW1lLmNfc3RyKCksIHN6KTsKKworI2lmIFBFUkZFVFRPX0JV
SUxERkxBRyhQRVJGRVRUT19PU19NQUNPU1gpCisgIHJldHVybiBwdGhyZWFkX3NldG5hbWVfbnAo
YnVmKSA9PSAwOworI2Vsc2UKKyAgcmV0dXJuIHB0aHJlYWRfc2V0bmFtZV9ucChwdGhyZWFkX3Nl
bGYoKSwgYnVmKSA9PSAwOworI2VuZGlmCit9CisjZWxzZQoraW5saW5lIHZvaWQgTWF5YmVTZXRU
aHJlYWROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJikge30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3Bh
Y2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9Q
RVJGRVRUT19FWFRfQkFTRV9USFJFQURfVVRJTFNfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVy
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91
IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl
bnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICog
ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV
bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs
IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl
ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP
TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp
Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgor
I2lmICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS90aHJlYWRfdGFza19y
dW5uZXIuaCIKKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxmdW5j
dGlvbmFsPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS90
aHJlYWRfdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2V4dC9iYXNlL3VuaXhfdGFza19ydW5uZXIuaCIKKworI2lmIFBFUkZFVFRPX0JVSUxE
RkxBRyhQRVJGRVRUT19PU19MSU5VWCkgfHwgXAorICAgIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJG
RVRUT19PU19BTkRST0lEKQorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2VuZGlmCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKK1RocmVhZFRhc2tSdW5uZXI6OlRo
cmVhZFRhc2tSdW5uZXIoVGhyZWFkVGFza1J1bm5lciYmIG90aGVyKSBub2V4Y2VwdAorICAgIDog
dGhyZWFkXyhzdGQ6Om1vdmUob3RoZXIudGhyZWFkXykpLCB0YXNrX3J1bm5lcl8ob3RoZXIudGFz
a19ydW5uZXJfKSB7CisgIG90aGVyLnRhc2tfcnVubmVyXyA9IG51bGxwdHI7Cit9CisKK1RocmVh
ZFRhc2tSdW5uZXImIFRocmVhZFRhc2tSdW5uZXI6Om9wZXJhdG9yPShUaHJlYWRUYXNrUnVubmVy
JiYgb3RoZXIpIHsKKyAgdGhpcy0+flRocmVhZFRhc2tSdW5uZXIoKTsKKyAgbmV3ICh0aGlzKSBU
aHJlYWRUYXNrUnVubmVyKHN0ZDo6bW92ZShvdGhlcikpOworICByZXR1cm4gKnRoaXM7Cit9CisK
K1RocmVhZFRhc2tSdW5uZXI6On5UaHJlYWRUYXNrUnVubmVyKCkgeworICBpZiAodGFza19ydW5u
ZXJfKSB7CisgICAgUEVSRkVUVE9fQ0hFQ0soIXRhc2tfcnVubmVyXy0+UXVpdENhbGxlZCgpKTsK
KyAgICB0YXNrX3J1bm5lcl8tPlF1aXQoKTsKKworICAgIFBFUkZFVFRPX0RDSEVDSyh0aHJlYWRf
LmpvaW5hYmxlKCkpOworICB9CisgIGlmICh0aHJlYWRfLmpvaW5hYmxlKCkpCisgICAgdGhyZWFk
Xy5qb2luKCk7Cit9CisKK1RocmVhZFRhc2tSdW5uZXI6OlRocmVhZFRhc2tSdW5uZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIG5hbWUpIDogbmFtZV8obmFtZSkgeworICBzdGQ6Om11dGV4IGluaXRfbG9j
azsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgaW5pdF9jdjsKKworICBzdGQ6OmZ1bmN0aW9u
PHZvaWQoVW5peFRhc2tSdW5uZXIqKT4gaW5pdGlhbGl6ZXIgPQorICAgICAgW3RoaXMsICZpbml0
X2xvY2ssICZpbml0X2N2XShVbml4VGFza1J1bm5lciogdGFza19ydW5uZXIpIHsKKyAgICAgICAg
c3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soaW5pdF9sb2NrKTsKKyAgICAgICAgdGFz
a19ydW5uZXJfID0gdGFza19ydW5uZXI7CisgICAgICAgIC8vIE5vdGlmeSB3aGlsZSBzdGlsbCBo
b2xkaW5nIHRoZSBsb2NrLCBhcyBpbml0X2N2IGNlYXNlcyB0byBleGlzdCBhcworICAgICAgICAv
LyBzb29uIGFzIHRoZSBtYWluIHRocmVhZCBvYnNlcnZlcyBhIG5vbi1udWxsIHRhc2tfcnVubmVy
XywgYW5kIGl0IGNhbgorICAgICAgICAvLyB3YWtlIHVwIHNwdXJpb3VzbHkgKGkuZS4gYmVmb3Jl
IHRoZSBub3RpZnkgaWYgd2UgaGFkIHVubG9ja2VkIGJlZm9yZQorICAgICAgICAvLyBub3RpZnlp
bmcpLgorICAgICAgICBpbml0X2N2Lm5vdGlmeV9vbmUoKTsKKyAgICAgIH07CisKKyAgdGhyZWFk
XyA9IHN0ZDo6dGhyZWFkKCZUaHJlYWRUYXNrUnVubmVyOjpSdW5UYXNrVGhyZWFkLCB0aGlzLAor
ICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGluaXRpYWxpemVyKSk7CisKKyAgc3Rk
Ojp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGluaXRfbG9jayk7CisgIGluaXRfY3Yud2Fp
dChsb2NrLCBbdGhpc10geyByZXR1cm4gISF0YXNrX3J1bm5lcl87IH0pOworfQorCit2b2lkIFRo
cmVhZFRhc2tSdW5uZXI6OlJ1blRhc2tUaHJlYWQoCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFVu
aXhUYXNrUnVubmVyKik+IGluaXRpYWxpemVyKSB7CisgIGlmICghbmFtZV8uZW1wdHkoKSkgewor
ICAgIGJhc2U6Ok1heWJlU2V0VGhyZWFkTmFtZShuYW1lXyk7CisgIH0KKworICBVbml4VGFza1J1
bm5lciB0YXNrX3J1bm5lcjsKKyAgdGFza19ydW5uZXIuUG9zdFRhc2soc3RkOjpiaW5kKHN0ZDo6
bW92ZShpbml0aWFsaXplciksICZ0YXNrX3J1bm5lcikpOworICB0YXNrX3J1bm5lci5SdW4oKTsK
K30KKwordm9pZCBUaHJlYWRUYXNrUnVubmVyOjpQb3N0VGFza0FuZFdhaXRGb3JUZXN0aW5nKHN0
ZDo6ZnVuY3Rpb248dm9pZCgpPiBmbikgeworICBzdGQ6Om11dGV4IG11dGV4OworICBzdGQ6OmNv
bmRpdGlvbl92YXJpYWJsZSBjdjsKKworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxv
Y2sobXV0ZXgpOworICBib29sIGRvbmUgPSBmYWxzZTsKKyAgdGFza19ydW5uZXJfLT5Qb3N0VGFz
ayhbJm11dGV4LCAmY3YsICZkb25lLCAmZm5dIHsKKyAgICBmbigpOworCisgICAgc3RkOjpsb2Nr
X2d1YXJkPHN0ZDo6bXV0ZXg+IGlubmVyX2xvY2sobXV0ZXgpOworICAgIGRvbmUgPSB0cnVlOwor
ICAgIGN2Lm5vdGlmeV9vbmUoKTsKKyAgfSk7CisgIGN2LndhaXQobG9jaywgWyZkb25lXSB7IHJl
dHVybiBkb25lOyB9KTsKK30KKwordWludDY0X3QgVGhyZWFkVGFza1J1bm5lcjo6R2V0VGhyZWFk
Q1BVVGltZU5zRm9yVGVzdGluZygpIHsKKyAgdWludDY0X3QgdGhyZWFkX3RpbWVfbnMgPSAwOwor
ICBQb3N0VGFza0FuZFdhaXRGb3JUZXN0aW5nKFsmdGhyZWFkX3RpbWVfbnNdIHsKKyAgICB0aHJl
YWRfdGltZV9ucyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihiYXNlOjpHZXRUaHJlYWRDUFVUaW1l
TnMoKS5jb3VudCgpKTsKKyAgfSk7CisgIHJldHVybiB0aHJlYWRfdGltZV9uczsKK30KKworfSAg
Ly8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8v
ICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIHNvdXJjZTogc3JjL2Jhc2UvdW5peF90YXNrX3J1bm5lci5jYworLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGlj
ZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNl
Iik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdp
dGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2Ug
YXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIu
MAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8g
aW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlz
IGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMg
T1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAq
IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt
aXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRf
Y29uZmlnLmgiCisjaWYgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3Vu
aXhfdGFza19ydW5uZXIuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGli
Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3dhdGNoZG9n
LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKK1VuaXhUYXNr
UnVubmVyOjpVbml4VGFza1J1bm5lcigpIHsKKyAgQWRkRmlsZURlc2NyaXB0b3JXYXRjaChldmVu
dF8uZmQoKSwgW10geworICAgIC8vIE5vdCByZWFjaGVkIC0tIHNlZSBQb3N0RmlsZURlc2NyaXB0
b3JXYXRjaGVzKCkuCisgICAgUEVSRkVUVE9fREZBVEFMKCJTaG91bGQgYmUgdW5yZWFjaGFibGUu
Iik7CisgIH0pOworfQorCitVbml4VGFza1J1bm5lcjo6flVuaXhUYXNrUnVubmVyKCkgPSBkZWZh
dWx0OworCit2b2lkIFVuaXhUYXNrUnVubmVyOjpXYWtlVXAoKSB7CisgIGV2ZW50Xy5Ob3RpZnko
KTsKK30KKwordm9pZCBVbml4VGFza1J1bm5lcjo6UnVuKCkgeworICBQRVJGRVRUT19EQ0hFQ0tf
VEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGNyZWF0ZWRfdGhyZWFkX2lkXyA9IEdldFRocmVh
ZElkKCk7CisgIHF1aXRfID0gZmFsc2U7CisgIGZvciAoOzspIHsKKyAgICBpbnQgcG9sbF90aW1l
b3V0X21zOworICAgIHsKKyAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxv
Y2tfKTsKKyAgICAgIGlmIChxdWl0XykKKyAgICAgICAgcmV0dXJuOworICAgICAgcG9sbF90aW1l
b3V0X21zID0gR2V0RGVsYXlNc1RvTmV4dFRhc2tMb2NrZWQoKTsKKyAgICAgIFVwZGF0ZVdhdGNo
VGFza3NMb2NrZWQoKTsKKyAgICB9CisgICAgaW50IHJldCA9IFBFUkZFVFRPX0VJTlRSKHBvbGwo
CisgICAgICAgICZwb2xsX2Zkc19bMF0sIHN0YXRpY19jYXN0PG5mZHNfdD4ocG9sbF9mZHNfLnNp
emUoKSksIHBvbGxfdGltZW91dF9tcykpOworICAgIFBFUkZFVFRPX0NIRUNLKHJldCA+PSAwKTsK
KworICAgIC8vIFRvIGF2b2lkIHN0YXJ2YXRpb24gd2UgYWx3YXlzIGludGVybGVhdmUgYWxsIHR5
cGVzIG9mIHRhc2tzIC0tIGltbWVkaWF0ZSwKKyAgICAvLyBkZWxheWVkIGFuZCBmaWxlIGRlc2Ny
aXB0b3Igd2F0Y2hlcy4KKyAgICBQb3N0RmlsZURlc2NyaXB0b3JXYXRjaGVzKCk7CisgICAgUnVu
SW1tZWRpYXRlQW5kRGVsYXllZFRhc2soKTsKKyAgfQorfQorCit2b2lkIFVuaXhUYXNrUnVubmVy
OjpRdWl0KCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Cisg
IHF1aXRfID0gdHJ1ZTsKKyAgV2FrZVVwKCk7Cit9CisKK2Jvb2wgVW5peFRhc2tSdW5uZXI6OlF1
aXRDYWxsZWQoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsK
KyAgcmV0dXJuIHF1aXRfOworfQorCitib29sIFVuaXhUYXNrUnVubmVyOjpJc0lkbGVGb3JUZXN0
aW5nKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgIHJl
dHVybiBpbW1lZGlhdGVfdGFza3NfLmVtcHR5KCk7Cit9CisKK3ZvaWQgVW5peFRhc2tSdW5uZXI6
OlVwZGF0ZVdhdGNoVGFza3NMb2NrZWQoKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhy
ZWFkX2NoZWNrZXJfKTsKKyAgaWYgKCF3YXRjaF90YXNrc19jaGFuZ2VkXykKKyAgICByZXR1cm47
CisgIHdhdGNoX3Rhc2tzX2NoYW5nZWRfID0gZmFsc2U7CisgIHBvbGxfZmRzXy5jbGVhcigpOwor
ICBmb3IgKGF1dG8mIGl0IDogd2F0Y2hfdGFza3NfKSB7CisgICAgaXQuc2Vjb25kLnBvbGxfZmRf
aW5kZXggPSBwb2xsX2Zkc18uc2l6ZSgpOworICAgIHBvbGxfZmRzXy5wdXNoX2JhY2soe2l0LmZp
cnN0LCBQT0xMSU4gfCBQT0xMSFVQLCAwfSk7CisgIH0KK30KKwordm9pZCBVbml4VGFza1J1bm5l
cjo6UnVuSW1tZWRpYXRlQW5kRGVsYXllZFRhc2soKSB7CisgIC8vIElmIGxvY2tpbmcgb3Zlcmhl
YWQgYmVjb21lcyBhbiBpc3N1ZSwgYWRkIGEgc2VwYXJhdGUgd29yayBxdWV1ZS4KKyAgc3RkOjpm
dW5jdGlvbjx2b2lkKCk+IGltbWVkaWF0ZV90YXNrOworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4g
ZGVsYXllZF90YXNrOworICBUaW1lTWlsbGlzIG5vdyA9IEdldFdhbGxUaW1lTXMoKTsKKyAgewor
ICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKKyAgICBpZiAoIWlt
bWVkaWF0ZV90YXNrc18uZW1wdHkoKSkgeworICAgICAgaW1tZWRpYXRlX3Rhc2sgPSBzdGQ6Om1v
dmUoaW1tZWRpYXRlX3Rhc2tzXy5mcm9udCgpKTsKKyAgICAgIGltbWVkaWF0ZV90YXNrc18ucG9w
X2Zyb250KCk7CisgICAgfQorICAgIGlmICghZGVsYXllZF90YXNrc18uZW1wdHkoKSkgeworICAg
ICAgYXV0byBpdCA9IGRlbGF5ZWRfdGFza3NfLmJlZ2luKCk7CisgICAgICBpZiAobm93ID49IGl0
LT5maXJzdCkgeworICAgICAgICBkZWxheWVkX3Rhc2sgPSBzdGQ6Om1vdmUoaXQtPnNlY29uZCk7
CisgICAgICAgIGRlbGF5ZWRfdGFza3NfLmVyYXNlKGl0KTsKKyAgICAgIH0KKyAgICB9CisgIH0K
KworICBlcnJubyA9IDA7CisgIGlmIChpbW1lZGlhdGVfdGFzaykKKyAgICBSdW5UYXNrV2l0aFdh
dGNoZG9nR3VhcmQoaW1tZWRpYXRlX3Rhc2spOworICBlcnJubyA9IDA7CisgIGlmIChkZWxheWVk
X3Rhc2spCisgICAgUnVuVGFza1dpdGhXYXRjaGRvZ0d1YXJkKGRlbGF5ZWRfdGFzayk7Cit9CisK
K3ZvaWQgVW5peFRhc2tSdW5uZXI6OlBvc3RGaWxlRGVzY3JpcHRvcldhdGNoZXMoKSB7CisgIFBF
UkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBwb2xsX2Zkc18uc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIShwb2xsX2Zkc19baV0u
cmV2ZW50cyAmIChQT0xMSU4gfCBQT0xMSFVQKSkpCisgICAgICBjb250aW51ZTsKKyAgICBwb2xs
X2Zkc19baV0ucmV2ZW50cyA9IDA7CisKKyAgICAvLyBUaGUgd2FrZS11cCBldmVudCBpcyBoYW5k
bGVkIGlubGluZSB0byBhdm9pZCBhbiBpbmZpbml0ZSByZWN1cnNpb24gb2YKKyAgICAvLyBwb3N0
ZWQgdGFza3MuCisgICAgaWYgKHBvbGxfZmRzX1tpXS5mZCA9PSBldmVudF8uZmQoKSkgeworICAg
ICAgZXZlbnRfLkNsZWFyKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBCaW5k
aW5nIHRvIHx0aGlzfCBpcyBzYWZlIHNpbmNlIHdlIGFyZSB0aGUgb25seSBvYmplY3QgZXhlY3V0
aW5nIHRoZQorICAgIC8vIHRhc2suCisgICAgUG9zdFRhc2soc3RkOjpiaW5kKCZVbml4VGFza1J1
bm5lcjo6UnVuRmlsZURlc2NyaXB0b3JXYXRjaCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAg
ICAgcG9sbF9mZHNfW2ldLmZkKSk7CisKKyAgICAvLyBNYWtlIHRoZSBmZCBuZWdhdGl2ZSB3aGls
ZSBhIHBvc3RlZCB0YXNrIGlzIHBlbmRpbmcuIFRoaXMgbWFrZXMgcG9sbCgyKQorICAgIC8vIGln
bm9yZSB0aGUgZmQuCisgICAgUEVSRkVUVE9fRENIRUNLKHBvbGxfZmRzX1tpXS5mZCA+PSAwKTsK
KyAgICBwb2xsX2Zkc19baV0uZmQgPSAtcG9sbF9mZHNfW2ldLmZkOworICB9Cit9CisKK3ZvaWQg
VW5peFRhc2tSdW5uZXI6OlJ1bkZpbGVEZXNjcmlwdG9yV2F0Y2goaW50IGZkKSB7CisgIHN0ZDo6
ZnVuY3Rpb248dm9pZCgpPiB0YXNrOworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0
ZXg+IGxvY2sobG9ja18pOworICAgIGF1dG8gaXQgPSB3YXRjaF90YXNrc18uZmluZChmZCk7Cisg
ICAgaWYgKGl0ID09IHdhdGNoX3Rhc2tzXy5lbmQoKSkKKyAgICAgIHJldHVybjsKKyAgICAvLyBN
YWtlIHBvbGwoMikgcGF5IGF0dGVudGlvbiB0byB0aGUgZmQgYWdhaW4uIFNpbmNlIGFub3RoZXIg
dGhyZWFkIG1heSBoYXZlCisgICAgLy8gdXBkYXRlZCB0aGlzIHdhdGNoIHdlIG5lZWQgdG8gcmVm
cmVzaCB0aGUgc2V0IGZpcnN0LgorICAgIFVwZGF0ZVdhdGNoVGFza3NMb2NrZWQoKTsKKyAgICBz
aXplX3QgZmRfaW5kZXggPSBpdC0+c2Vjb25kLnBvbGxfZmRfaW5kZXg7CisgICAgUEVSRkVUVE9f
RENIRUNLKGZkX2luZGV4IDwgcG9sbF9mZHNfLnNpemUoKSk7CisgICAgUEVSRkVUVE9fRENIRUNL
KDo6YWJzKHBvbGxfZmRzX1tmZF9pbmRleF0uZmQpID09IGZkKTsKKyAgICBwb2xsX2Zkc19bZmRf
aW5kZXhdLmZkID0gZmQ7CisgICAgdGFzayA9IGl0LT5zZWNvbmQuY2FsbGJhY2s7CisgIH0KKyAg
ZXJybm8gPSAwOworICBSdW5UYXNrV2l0aFdhdGNoZG9nR3VhcmQodGFzayk7Cit9CisKK2ludCBV
bml4VGFza1J1bm5lcjo6R2V0RGVsYXlNc1RvTmV4dFRhc2tMb2NrZWQoKSBjb25zdCB7CisgIFBF
UkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgaWYgKCFpbW1lZGlhdGVf
dGFza3NfLmVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisgIGlmICghZGVsYXllZF90YXNrc18uZW1w
dHkoKSkgeworICAgIFRpbWVNaWxsaXMgZGlmZiA9IGRlbGF5ZWRfdGFza3NfLmJlZ2luKCktPmZp
cnN0IC0gR2V0V2FsbFRpbWVNcygpOworICAgIHJldHVybiBzdGQ6Om1heCgwLCBzdGF0aWNfY2Fz
dDxpbnQ+KGRpZmYuY291bnQoKSkpOworICB9CisgIHJldHVybiAtMTsKK30KKwordm9pZCBVbml4
VGFza1J1bm5lcjo6UG9zdFRhc2soc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHRhc2spIHsKKyAgYm9v
bCB3YXNfZW1wdHk7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhs
b2NrXyk7CisgICAgd2FzX2VtcHR5ID0gaW1tZWRpYXRlX3Rhc2tzXy5lbXB0eSgpOworICAgIGlt
bWVkaWF0ZV90YXNrc18ucHVzaF9iYWNrKHN0ZDo6bW92ZSh0YXNrKSk7CisgIH0KKyAgaWYgKHdh
c19lbXB0eSkKKyAgICBXYWtlVXAoKTsKK30KKwordm9pZCBVbml4VGFza1J1bm5lcjo6UG9zdERl
bGF5ZWRUYXNrKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiB0YXNrLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5X21zKSB7CisgIFRpbWVNaWxsaXMgcnVu
dGltZSA9IEdldFdhbGxUaW1lTXMoKSArIFRpbWVNaWxsaXMoZGVsYXlfbXMpOworICB7CisgICAg
c3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgIGRlbGF5ZWRfdGFz
a3NfLmluc2VydChzdGQ6Om1ha2VfcGFpcihydW50aW1lLCBzdGQ6Om1vdmUodGFzaykpKTsKKyAg
fQorICBXYWtlVXAoKTsKK30KKwordm9pZCBVbml4VGFza1J1bm5lcjo6QWRkRmlsZURlc2NyaXB0
b3JXYXRjaChpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiB0YXNrKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhmZCA+
PSAwKTsKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsK
KyAgICBQRVJGRVRUT19EQ0hFQ0soIXdhdGNoX3Rhc2tzXy5jb3VudChmZCkpOworICAgIHdhdGNo
X3Rhc2tzX1tmZF0gPSB7c3RkOjptb3ZlKHRhc2spLCBTSVpFX01BWH07CisgICAgd2F0Y2hfdGFz
a3NfY2hhbmdlZF8gPSB0cnVlOworICB9CisgIFdha2VVcCgpOworfQorCit2b2lkIFVuaXhUYXNr
UnVubmVyOjpSZW1vdmVGaWxlRGVzY3JpcHRvcldhdGNoKGludCBmZCkgeworICBQRVJGRVRUT19E
Q0hFQ0soZmQgPj0gMCk7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9j
ayhsb2NrXyk7CisgICAgUEVSRkVUVE9fRENIRUNLKHdhdGNoX3Rhc2tzXy5jb3VudChmZCkpOwor
ICAgIHdhdGNoX3Rhc2tzXy5lcmFzZShmZCk7CisgICAgd2F0Y2hfdGFza3NfY2hhbmdlZF8gPSB0
cnVlOworICB9CisgIC8vIE5vIG5lZWQgdG8gc2NoZWR1bGUgYSB3YWtlLXVwIGZvciB0aGlzLgor
fQorCitib29sIFVuaXhUYXNrUnVubmVyOjpSdW5zVGFza3NPbkN1cnJlbnRUaHJlYWQoKSBjb25z
dCB7CisgIHJldHVybiBHZXRUaHJlYWRJZCgpID09IGNyZWF0ZWRfdGhyZWFkX2lkXzsKK30KKwor
fSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYg
IC8vICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKQorLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIHNvdXJjZTogc3JjL3Byb3RvemVyby9maWVsZC5jYworLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90b3plcm8vZmllbGQuaAorLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90b3plcm8v
Y29udGlndW91c19tZW1vcnlfcmFuZ2UuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUg
QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFw
YWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5v
dCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisg
KiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0
dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBy
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
cmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu
ICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBB
TlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBm
b3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxp
bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJG
RVRUT19QUk9UT1pFUk9fQ09OVElHVU9VU19NRU1PUllfUkFOR0VfSF8KKyNkZWZpbmUgSU5DTFVE
RV9QRVJGRVRUT19QUk9UT1pFUk9fQ09OVElHVU9VU19NRU1PUllfUkFOR0VfSF8KKworI2luY2x1
ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgor
CituYW1lc3BhY2UgcHJvdG96ZXJvIHsKKworLy8gS2VlcCB0aGlzIHN0cnVjdCB0cml2aWFsbHkg
Y29uc3RydWN0aWJsZSAobm8gY3RvcnMsIG5vIGRlZmF1bHQgaW5pdGlhbGl6ZXJzKS4KK3N0cnVj
dCBDb250aWd1b3VzTWVtb3J5UmFuZ2UgeworICB1aW50OF90KiBiZWdpbjsKKyAgdWludDhfdCog
ZW5kOyAgLy8gU1RMIHN0eWxlOiBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4K
KworICBpbmxpbmUgYm9vbCBpc192YWxpZCgpIGNvbnN0IHsgcmV0dXJuIGJlZ2luICE9IG51bGxw
dHI7IH0KKyAgaW5saW5lIHZvaWQgcmVzZXQoKSB7IGJlZ2luID0gbnVsbHB0cjsgfQorICBpbmxp
bmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZCAt
IGJlZ2luKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCisjZW5kaWYgIC8v
IElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX0NPTlRJR1VPVVNfTUVNT1JZX1JBTkdFX0hfCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3RvemVy
by9wcm90b191dGlscy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1BST1RP
WkVST19QUk9UT19VVElMU19IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19Q
Uk9UT19VVElMU19IXworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRkZWYu
aD4KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIHByb3Rv
emVybyB7CituYW1lc3BhY2UgcHJvdG9fdXRpbHMgeworCisvLyBTZWUgaHR0cHM6Ly9kZXZlbG9w
ZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nIHdpcmUgdHlwZXMu
CisvLyBUaGlzIGlzIGEgdHlwZSBlbmNvZGVkIGludG8gdGhlIHByb3RvIHRoYXQgcHJvdmlkZXMg
anVzdCBlbm91Z2ggaW5mbyB0bworLy8gZmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBmb2xsb3dpbmcg
dmFsdWUuCitlbnVtIGNsYXNzIFByb3RvV2lyZVR5cGUgOiB1aW50MzJfdCB7CisgIGtWYXJJbnQg
PSAwLAorICBrRml4ZWQ2NCA9IDEsCisgIGtMZW5ndGhEZWxpbWl0ZWQgPSAyLAorICBrRml4ZWQz
MiA9IDUsCit9OworCisvLyBUaGlzIGlzIHRoZSB0eXBlIGRlZmluZWQgaW4gdGhlIHByb3RvIGZv
ciBlYWNoIGZpZWxkLiBUaGlzIGluZm9ybWF0aW9uCisvLyBpcyB1c2VkIHRvIGRlY2lkZSB0aGUg
dHJhbnNsYXRpb24gc3RyYXRlZ3kgd2hlbiB3cml0aW5nIHRoZSB0cmFjZS4KK2VudW0gY2xhc3Mg
UHJvdG9TY2hlbWFUeXBlIHsKKyAga1Vua25vd24gPSAwLAorICBrRG91YmxlLAorICBrRmxvYXQs
CisgIGtJbnQ2NCwKKyAga1VpbnQ2NCwKKyAga0ludDMyLAorICBrRml4ZWQ2NCwKKyAga0ZpeGVk
MzIsCisgIGtCb29sLAorICBrU3RyaW5nLAorICBrR3JvdXAsICAvLyBEZXByZWNhdGVkIChwcm90
bzIgb25seSkKKyAga01lc3NhZ2UsCisgIGtCeXRlcywKKyAga1VpbnQzMiwKKyAga0VudW0sCisg
IGtTZml4ZWQzMiwKKyAga1NmaXhlZDY0LAorICBrU2ludDMyLAorICBrU2ludDY0LAorfTsKKwor
aW5saW5lIGNvbnN0IGNoYXIqIFByb3RvU2NoZW1hVG9TdHJpbmcoUHJvdG9TY2hlbWFUeXBlIHYp
IHsKKyAgc3dpdGNoICh2KSB7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtVbmtub3duOgor
ICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlwZTo6a0RvdWJs
ZToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlwZTo6a0Zs
b2F0OgorICAgICAgcmV0dXJuICJmbG9hdCI7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtJ
bnQ2NDoKKyAgICAgIHJldHVybiAiaW50NjQiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjpr
VWludDY0OgorICAgICAgcmV0dXJuICJ1aW50NjQiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBl
OjprSW50MzI6CisgICAgICByZXR1cm4gImludDMyIjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlw
ZTo6a0ZpeGVkNjQ6CisgICAgICByZXR1cm4gImZpeGVkNjQiOworICAgIGNhc2UgUHJvdG9TY2hl
bWFUeXBlOjprRml4ZWQzMjoKKyAgICAgIHJldHVybiAiZml4ZWQzMiI7CisgICAgY2FzZSBQcm90
b1NjaGVtYVR5cGU6OmtCb29sOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICBjYXNlIFByb3Rv
U2NoZW1hVHlwZTo6a1N0cmluZzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIFBy
b3RvU2NoZW1hVHlwZTo6a0dyb3VwOgorICAgICAgcmV0dXJuICJncm91cCI7CisgICAgY2FzZSBQ
cm90b1NjaGVtYVR5cGU6OmtNZXNzYWdlOgorICAgICAgcmV0dXJuICJtZXNzYWdlIjsKKyAgICBj
YXNlIFByb3RvU2NoZW1hVHlwZTo6a0J5dGVzOgorICAgICAgcmV0dXJuICJieXRlcyI7CisgICAg
Y2FzZSBQcm90b1NjaGVtYVR5cGU6OmtVaW50MzI6CisgICAgICByZXR1cm4gInVpbnQzMiI7Cisg
ICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtFbnVtOgorICAgICAgcmV0dXJuICJlbnVtIjsKKyAg
ICBjYXNlIFByb3RvU2NoZW1hVHlwZTo6a1NmaXhlZDMyOgorICAgICAgcmV0dXJuICJzZml4ZWQz
MiI7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtTZml4ZWQ2NDoKKyAgICAgIHJldHVybiAi
c2ZpeGVkNjQiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprU2ludDMyOgorICAgICAgcmV0
dXJuICJzaW50MzIiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprU2ludDY0OgorICAgICAg
cmV0dXJuICJzaW50NjQiOworICB9CisgIC8vIEZvciBnY2M6CisgIFBFUkZFVFRPX0RDSEVDSyhm
YWxzZSk7CisgIHJldHVybiAiIjsKK30KKworLy8gTWF4aW11bSBtZXNzYWdlIHNpemUgc3VwcG9y
dGVkOiAyNTYgTWlCICg0IHggNy1iaXQgZHVlIHRvIHZhcmludCBlbmNvZGluZykuCitjb25zdGV4
cHIgc2l6ZV90IGtNZXNzYWdlTGVuZ3RoRmllbGRTaXplID0gNDsKK2NvbnN0ZXhwciBzaXplX3Qg
a01heE1lc3NhZ2VMZW5ndGggPSAoMXUgPDwgKGtNZXNzYWdlTGVuZ3RoRmllbGRTaXplICogNykp
IC0gMTsKKworLy8gRmllbGQgdGFnIGlzIGVuY29kZWQgYXMgMzItYml0IHZhcmludCAoNSBieXRl
cyBhdCBtb3N0KS4KKy8vIExhcmdlc3QgdmFsdWUgb2Ygc2ltcGxlIChub3QgbGVuZ3RoLWRlbGlt
aXRlZCkgZmllbGQgaXMgNjQtYml0IHZhcmludAorLy8gKDEwIGJ5dGVzIGF0IG1vc3QpLiAxNSBi
eXRlcyBidWZmZXIgaXMgZW5vdWdoIHRvIHN0b3JlIGEgc2ltcGxlIGZpZWxkLgorY29uc3RleHBy
IHNpemVfdCBrTWF4VGFnRW5jb2RlZFNpemUgPSA1OworY29uc3RleHByIHNpemVfdCBrTWF4U2lt
cGxlRmllbGRFbmNvZGVkU2l6ZSA9IGtNYXhUYWdFbmNvZGVkU2l6ZSArIDEwOworCisvLyBQcm90
byB0eXBlczogKGludHx1aW50fHNpbnQpKDMyfDY0KSwgYm9vbCwgZW51bS4KK2NvbnN0ZXhwciB1
aW50MzJfdCBNYWtlVGFnVmFySW50KHVpbnQzMl90IGZpZWxkX2lkKSB7CisgIHJldHVybiAoZmll
bGRfaWQgPDwgMykgfCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUHJvdG9XaXJlVHlwZTo6a1Zhcklu
dCk7Cit9CisKKy8vIFByb3RvIHR5cGVzOiBmaXhlZDY0LCBzZml4ZWQ2NCwgZml4ZWQzMiwgc2Zp
eGVkMzIsIGRvdWJsZSwgZmxvYXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0ZXhwciB1
aW50MzJfdCBNYWtlVGFnRml4ZWQodWludDMyX3QgZmllbGRfaWQpIHsKKyAgc3RhdGljX2Fzc2Vy
dChzaXplb2YoVCkgPT0gOCB8fCBzaXplb2YoVCkgPT0gNCwgIlZhbHVlIG11c3QgYmUgNCBvciA4
IGJ5dGVzIik7CisgIHJldHVybiAoZmllbGRfaWQgPDwgMykgfAorICAgICAgICAgc3RhdGljX2Nh
c3Q8dWludDMyX3Q+KChzaXplb2YoVCkgPT0gOCA/IFByb3RvV2lyZVR5cGU6OmtGaXhlZDY0Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUHJvdG9XaXJl
VHlwZTo6a0ZpeGVkMzIpKTsKK30KKworLy8gUHJvdG8gdHlwZXM6IHN0cmluZywgYnl0ZXMsIGVt
YmVkZGVkIG1lc3NhZ2VzLgorY29uc3RleHByIHVpbnQzMl90IE1ha2VUYWdMZW5ndGhEZWxpbWl0
ZWQodWludDMyX3QgZmllbGRfaWQpIHsKKyAgcmV0dXJuIChmaWVsZF9pZCA8PCAzKSB8CisgICAg
ICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUHJvdG9XaXJlVHlwZTo6a0xlbmd0aERlbGltaXRl
ZCk7Cit9CisKKy8vIFByb3RvIHR5cGVzOiBzaW50NjQsIHNpbnQzMi4KK3RlbXBsYXRlIDx0eXBl
bmFtZSBUPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZSBaaWda
YWdFbmNvZGUoVCB2YWx1ZSkgeworICB1c2luZyBVbnNpZ25lZFR5cGUgPSB0eXBlbmFtZSBzdGQ6
Om1ha2VfdW5zaWduZWQ8VD46OnR5cGU7CisKKyAgLy8gUmlnaHQtc2hpZnQgb2YgbmVnYXRpdmUg
dmFsdWVzIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorICAvLyBBc3NlcnQgdGhlIGltcGxl
bWVudGF0aW9uIGRvZXMgd2hhdCB3ZSBleHBlY3QsIHdoaWNoIGlzIHRoYXQgc2hpZnRpbmcgYW55
CisgIC8vIHBvc2l0aXZlIHZhbHVlIGJ5IHNpemVvZihUKSAqIDggLSAxIGdpdmVzIGFuIGFsbCAw
IGJpdG1hcCwgYW5kIGEgbmVnYXRpdmUKKyAgLy8gdmFsdWUgZ2l2ZXMgYW5kIGFsbCAxIGJpdG1h
cC4KKyAgY29uc3RleHByIHVpbnQ2NF90IGtVbnNpZ25lZFplcm8gPSAwdTsKKyAgY29uc3RleHBy
IGludDY0X3Qga05lZ2F0aXZlT25lID0gLTE7CisgIGNvbnN0ZXhwciBpbnQ2NF90IGtQb3NpdGl2
ZU9uZSA9IDE7CisgIHN0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGtOZWdhdGl2
ZU9uZSA+PiA2MykgPT0gfmtVbnNpZ25lZFplcm8sCisgICAgICAgICAgICAgICAgImltcGxlbWVu
dGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXNzdW1lZCByaWdodHNoaWZ0Iik7CisgIHN0YXRpY19h
c3NlcnQoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGtQb3NpdGl2ZU9uZSA+PiA2MykgPT0ga1Vuc2ln
bmVkWmVybywKKyAgICAgICAgICAgICAgICAiaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9y
dCBhc3N1bWVkIHJpZ2h0c2hpZnQiKTsKKworICByZXR1cm4gKHN0YXRpY19jYXN0PFVuc2lnbmVk
VHlwZT4odmFsdWUpIDw8IDEpIF4KKyAgICAgICAgIHN0YXRpY19jYXN0PFVuc2lnbmVkVHlwZT4o
dmFsdWUgPj4gKHNpemVvZihUKSAqIDggLSAxKSk7Cit9CisKKy8vIFByb3RvIHR5cGVzOiBzaW50
NjQsIHNpbnQzMi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6
bWFrZV9zaWduZWQ8VD46OnR5cGUgWmlnWmFnRGVjb2RlKFQgdmFsdWUpIHsKKyAgdXNpbmcgVW5z
aWduZWRUeXBlID0gdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlOworICBhdXRv
IHVfdmFsdWUgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZFR5cGU+KHZhbHVlKTsKKyAgcmV0dXJuIHN0
YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGU+KAorICAgICAgKCh1
X3ZhbHVlID4+IDEpIF4gLSh1X3ZhbHVlICYgMSkpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1l
IFQ+CitpbmxpbmUgdWludDhfdCogV3JpdGVWYXJJbnQoVCB2YWx1ZSwgdWludDhfdCogdGFyZ2V0
KSB7CisgIC8vIElmIHZhbHVlIGlzIDw9IDAgd2UgbXVzdCBmaXJzdCBzaWduIGV4dGVuZCB0byBp
bnQ2NF90IChzZWUgWzFdKS4KKyAgLy8gRmluYWxseSB3ZSBhbHdheXMgY2FzdCB0byBhbiB1bnNp
Z25lZCB2YWx1ZSB0byB0byBhdm9pZCBhcml0aG1ldGljCisgIC8vIChzaWduIGV4cGFuZGluZykg
c2hpZnRzIGluIHRoZSB3aGlsZSBsb29wLgorICAvLyBbMV06ICJJZiB5b3UgdXNlIGludDMyIG9y
IGludDY0IGFzIHRoZSB0eXBlIGZvciBhIG5lZ2F0aXZlIG51bWJlciwgdGhlCisgIC8vIHJlc3Vs
dGluZyB2YXJpbnQgaXMgYWx3YXlzIHRlbiBieXRlcyBsb25nIi4KKyAgLy8gLSBkZXZlbG9wZXJz
Lmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nCisgIC8vIFNvIGZvciBl
YWNoIGlucHV0IHR5cGUgd2UgZG8gdGhlIGZvbGxvd2luZyBjYXN0czoKKyAgLy8gdWludFhfdCAt
PiB1aW50WF90IC0+IHVpbnRYX3QKKyAgLy8gaW50OF90ICAtPiBpbnQ2NF90IC0+IHVpbnQ2NF90
CisgIC8vIGludDE2X3QgLT4gaW50NjRfdCAtPiB1aW50NjRfdAorICAvLyBpbnQzMl90IC0+IGlu
dDY0X3QgLT4gdWludDY0X3QKKyAgLy8gaW50NjRfdCAtPiBpbnQ2NF90IC0+IHVpbnQ2NF90Cisg
IHVzaW5nIE1heWJlRXh0ZW5kZWRUeXBlID0KKyAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9u
YWw8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIFQsIGludDY0X3Q+Ojp0eXBlOworICB1c2lu
ZyBVbnNpZ25lZFR5cGUgPSB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8TWF5YmVFeHRlbmRl
ZFR5cGU+Ojp0eXBlOworCisgIE1heWJlRXh0ZW5kZWRUeXBlIGV4dGVuZGVkX3ZhbHVlID0gc3Rh
dGljX2Nhc3Q8TWF5YmVFeHRlbmRlZFR5cGU+KHZhbHVlKTsKKyAgVW5zaWduZWRUeXBlIHVuc2ln
bmVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8VW5zaWduZWRUeXBlPihleHRlbmRlZF92YWx1ZSk7CisK
KyAgd2hpbGUgKHVuc2lnbmVkX3ZhbHVlID49IDB4ODApIHsKKyAgICAqdGFyZ2V0KysgPSBzdGF0
aWNfY2FzdDx1aW50OF90Pih1bnNpZ25lZF92YWx1ZSkgfCAweDgwOworICAgIHVuc2lnbmVkX3Zh
bHVlID4+PSA3OworICB9CisgICp0YXJnZXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih1bnNpZ25l
ZF92YWx1ZSk7CisgIHJldHVybiB0YXJnZXQgKyAxOworfQorCisvLyBXcml0ZXMgYSBmaXhlZC1z
aXplIHJlZHVuZGFudCBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gfHZhbHVlfC4gVGhpcyBpcworLy8g
dXNlZCB0byBiYWNrZmlsbCBmaXhlZC1zaXplIHJlc2VydmF0aW9ucyBmb3IgdGhlIGxlbmd0aCBm
aWVsZCB1c2luZyBhCisvLyBub24tY2Fub25pY2FsIHZhcmludCBlbmNvZGluZyAoZS5nLiBceDgx
XHg4MFx4ODBceDAwIGluc3RlYWQgb2YgXHgwMSkuCisvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29t
L2dvb2dsZS9wcm90b2J1Zi9pc3N1ZXMvMTUzMC4KKy8vIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMg
dXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzLiBUaGUgc2l6ZSBvZiBhIG5lc3RlZCBtZXNzYWdlCisv
LyBpcyBub3Qga25vd24gdW50aWwgYWxsIGl0cyBmaWVsZCBoYXZlIGJlZW4gd3JpdHRlbi4gfGtN
ZXNzYWdlTGVuZ3RoRmllbGRTaXplfAorLy8gYnl0ZXMgYXJlIHJlc2VydmVkIHRvIGVuY29kZSB0
aGUgc2l6ZSBmaWVsZCBhbmQgYmFja2ZpbGxlZCBhdCB0aGUgZW5kLgoraW5saW5lIHZvaWQgV3Jp
dGVSZWR1bmRhbnRWYXJJbnQodWludDMyX3QgdmFsdWUsIHVpbnQ4X3QqIGJ1ZikgeworICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IGtNZXNzYWdlTGVuZ3RoRmllbGRTaXplOyArK2kpIHsKKyAgICBj
b25zdCB1aW50OF90IG1zYiA9IChpIDwga01lc3NhZ2VMZW5ndGhGaWVsZFNpemUgLSAxKSA/IDB4
ODAgOiAwOworICAgIGJ1ZltpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlKSB8IG1zYjsK
KyAgICB2YWx1ZSA+Pj0gNzsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dWludDMyX3QgZmllbGRfaWQ+
Cit2b2lkIFN0YXRpY0Fzc2VydFNpbmdsZUJ5dGVQcmVhbWJsZSgpIHsKKyAgc3RhdGljX2Fzc2Vy
dChmaWVsZF9pZCA8IDE2LAorICAgICAgICAgICAgICAgICJQcm90byBmaWVsZCBpZCB0b28gYmln
IHRvIGZpdCBpbiBhIHNpbmdsZSBieXRlIHByZWFtYmxlIik7Cit9CisKKy8vIFBhcnNlcyBhIFZh
ckludCBmcm9tIHRoZSBlbmNvZGVkIGJ1ZmZlciBbc3RhcnQsIGVuZCkuIHxlbmR8IGlzIFNUTC1z
dHlsZSBhbmQKKy8vIHBvaW50cyBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyLgorLy8g
VGhlIHBhcnNlZCBpbnQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBvdXRwdXQgYXJnIHx2YWx1ZXwu
IFJldHVybnMgYSBwb2ludGVyCisvLyB0byB0aGUgbmV4dCB1bmNvbnN1bWVkIGJ5dGUgKHNvIHN0
YXJ0IDwgcmV0dmFsIDw9IGVuZCkgb3IgfHN0YXJ0fCBpZiB0aGUKKy8vIFZhckludCBjb3VsZCBu
b3QgYmUgZnVsbHkgcGFyc2VkIGJlY2F1c2UgdGhlcmUgd2FzIG5vdCBlbm91Z2ggc3BhY2UgaW4g
dGhlCisvLyBidWZmZXIuCitpbmxpbmUgY29uc3QgdWludDhfdCogUGFyc2VWYXJJbnQoY29uc3Qg
dWludDhfdCogc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
dWludDhfdCogZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90
KiBvdXRfdmFsdWUpIHsKKyAgY29uc3QgdWludDhfdCogcG9zID0gc3RhcnQ7CisgIHVpbnQ2NF90
IHZhbHVlID0gMDsKKyAgZm9yICh1aW50MzJfdCBzaGlmdCA9IDA7IHBvcyA8IGVuZCAmJiBzaGlm
dCA8IDY0dTsgc2hpZnQgKz0gNykgeworICAgIC8vIENhY2hlICpwb3MgaW50byB8Y3VyX2J5dGV8
IHRvIHByZXZlbnQgdGhhdCB0aGUgY29tcGlsZXIgZGVyZWZlcmVuY2VzIHRoZQorICAgIC8vIHBv
aW50ZXIgdHdpY2UgKGhlcmUgYW5kIGluIHRoZSBpZigpIGJlbG93KSBkdWUgdG8gY2hhciogYWxp
YXNpbmcgcnVsZXMuCisgICAgdWludDhfdCBjdXJfYnl0ZSA9ICpwb3MrKzsKKyAgICB2YWx1ZSB8
PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oY3VyX2J5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBp
ZiAoKGN1cl9ieXRlICYgMHg4MCkgPT0gMCkgeworICAgICAgLy8gSW4gdmFsaWQgY2FzZXMgd2Ug
Z2V0IGhlcmUuCisgICAgICAqb3V0X3ZhbHVlID0gdmFsdWU7CisgICAgICByZXR1cm4gcG9zOwor
ICAgIH0KKyAgfQorICAqb3V0X3ZhbHVlID0gMDsKKyAgcmV0dXJuIHN0YXJ0OworfQorCit9ICAv
LyBuYW1lc3BhY2UgcHJvdG9fdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2Vu
ZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19QUk9UT19VVElMU19IXworLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgor
ICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJM
aWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlh
bmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExp
Y2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNF
TlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3Jl
ZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNl
bnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJB
TlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGll
ZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmlu
ZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICov
CisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fRklFTERfSF8KKyNkZWZpbmUg
SU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fRklFTERfSF8KKworI2luY2x1ZGUgPHN0ZGludC5o
PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY29u
dGlndW91c19tZW1vcnlfcmFuZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcHJv
dG96ZXJvIHsKKworc3RydWN0IENvbnN0Qnl0ZXMgeworICBzdGQ6OnN0cmluZyBUb1N0ZFN0cmlu
ZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25z
dCBjaGFyKj4oZGF0YSksIHNpemUpOworICB9CisKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAg
c2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgQ29uc3RDaGFycyB7CisgIC8vIEFsbG93IGltcGxp
Y2l0IGNvbnZlcnNpb24gdG8gcGVyZmV0dG8ncyBiYXNlOjpTdHJpbmdWaWV3IHdpdGhvdXQgZGVw
ZW5kaW5nCisgIC8vIG9uIHBlcmZldHRvL2Jhc2Ugb3IgdmljZXZlcnNhLgorICBzdGF0aWMgY29u
c3RleHByIGJvb2wga0NvbnZlcnRpYmxlVG9TdHJpbmdWaWV3ID0gdHJ1ZTsKKyAgc3RkOjpzdHJp
bmcgVG9TdGRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdGQ6OnN0cmluZyhkYXRhLCBzaXplKTsg
fQorCisgIGNvbnN0IGNoYXIqIGRhdGE7CisgIHNpemVfdCBzaXplOworfTsKKworLy8gQSBwcm90
b2J1ZiBmaWVsZCBkZWNvZGVkIGJ5IHRoZSBwcm90b3plcm8gcHJvdG8gZGVjb2RlcnMuIEl0IGV4
cG9zZXMKKy8vIGNvbnZlbmllbmNlIGFjY2Vzc29ycyB3aXRoIG1pbmltYWwgZGVidWcgY2hlY2tz
LgorLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGJvdGggYnkgdGhlIGl0ZXJhdG9yLWJhc2VkIFByb3Rv
RGVjb2RlciBhbmQgYnkgdGhlCisvLyBvbmUtc2hvdCBUeXBlZFByb3RvRGVjb2Rlci4KKy8vIElm
IHRoZSBmaWVsZCBpcyBub3QgdmFsaWQgdGhlIGFjY2Vzc29ycyBjb25zaXN0ZW50bHkgcmV0dXJu
IHplcm8taW50ZWdlcnMgb3IKKy8vIG51bGwgc3RyaW5ncy4KK2NsYXNzIEZpZWxkIHsKKyBwdWJs
aWM6CisgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiBpZF8gIT0gMDsgfQorICB1aW50MTZf
dCBpZCgpIGNvbnN0IHsgcmV0dXJuIGlkXzsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkg
Y29uc3QgeyByZXR1cm4gdmFsaWQoKTsgfQorCisgIHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBl
IHR5cGUoKSBjb25zdCB7CisgICAgYXV0byByZXMgPSBzdGF0aWNfY2FzdDxwcm90b191dGlsczo6
UHJvdG9XaXJlVHlwZT4odHlwZV8pOworICAgIFBFUkZFVFRPX0RDSEVDSyhyZXMgPT0gcHJvdG9f
dXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQgfHwKKyAgICAgICAgICAgICAgICAgICAgcmVz
ID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprTGVuZ3RoRGVsaW1pdGVkIHx8CisgICAg
ICAgICAgICAgICAgICAgIHJlcyA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0ZpeGVk
MzIgfHwKKyAgICAgICAgICAgICAgICAgICAgcmVzID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVU
eXBlOjprRml4ZWQ2NCk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIGJvb2wgYXNfYm9vbCgp
IGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3Rv
X3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
Ym9vbD4oaW50X3ZhbHVlXyk7CisgIH0KKworICB1aW50MzJfdCBhc191aW50MzIoKSBjb25zdCB7
CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgpIHx8IHR5cGUoKSA9PSBwcm90b191dGlsczo6
UHJvdG9XaXJlVHlwZTo6a1ZhckludCB8fAorICAgICAgICAgICAgICAgICAgICB0eXBlKCkgPT0g
cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtGaXhlZDMyKTsKKyAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8dWludDMyX3Q+KGludF92YWx1ZV8pOworICB9CisKKyAgaW50MzJfdCBhc19pbnQzMigp
IGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3Rv
X3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50IHx8CisgICAgICAgICAgICAgICAgICAgIHR5
cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIpOworICAgIHJldHVy
biBzdGF0aWNfY2FzdDxpbnQzMl90PihpbnRfdmFsdWVfKTsKKyAgfQorCisgIGludDMyX3QgYXNf
c2ludDMyKCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSyghdmFsaWQoKSB8fCB0eXBlKCkg
PT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQpOworICAgIHJldHVybiBwcm90
b191dGlsczo6WmlnWmFnRGVjb2RlKHN0YXRpY19jYXN0PHVpbnQzMl90PihpbnRfdmFsdWVfKSk7
CisgIH0KKworICB1aW50NjRfdCBhc191aW50NjQoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENI
RUNLKCF2YWxpZCgpIHx8IHR5cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1Zh
ckludCB8fAorICAgICAgICAgICAgICAgICAgICB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3Rv
V2lyZVR5cGU6OmtGaXhlZDMyIHx8CisgICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBwcm90
b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0ZpeGVkNjQpOworICAgIHJldHVybiBpbnRfdmFsdWVf
OworICB9CisKKyAgaW50NjRfdCBhc19pbnQ2NCgpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hF
Q0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFy
SW50IHx8CisgICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9X
aXJlVHlwZTo6a0ZpeGVkMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09IHByb3Rv
X3V0aWxzOjpQcm90b1dpcmVUeXBlOjprRml4ZWQ2NCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0
PGludDY0X3Q+KGludF92YWx1ZV8pOworICB9CisKKyAgaW50NjRfdCBhc19zaW50NjQoKSBjb25z
dCB7CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgpIHx8IHR5cGUoKSA9PSBwcm90b191dGls
czo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCk7CisgICAgcmV0dXJuIHByb3RvX3V0aWxzOjpaaWda
YWdEZWNvZGUoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGludF92YWx1ZV8pKTsKKyAgfQorCisgIGZs
b2F0IGFzX2Zsb2F0KCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSyghdmFsaWQoKSB8fCB0
eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtGaXhlZDMyKTsKKyAgICBmbG9h
dCByZXM7CisgICAgdWludDMyX3QgdmFsdWUzMiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihpbnRf
dmFsdWVfKTsKKyAgICBtZW1jcHkoJnJlcywgJnZhbHVlMzIsIHNpemVvZihyZXMpKTsKKyAgICBy
ZXR1cm4gcmVzOworICB9CisKKyAgZG91YmxlIGFzX2RvdWJsZSgpIGNvbnN0IHsKKyAgICBQRVJG
RVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVU
eXBlOjprRml4ZWQ2NCk7CisgICAgZG91YmxlIHJlczsKKyAgICBtZW1jcHkoJnJlcywgJmludF92
YWx1ZV8sIHNpemVvZihyZXMpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgQ29uc3RDaGFy
cyBhc19zdHJpbmcoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgpIHx8Cisg
ICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6
a0xlbmd0aERlbGltaXRlZCk7CisgICAgcmV0dXJuIENvbnN0Q2hhcnN7cmVpbnRlcnByZXRfY2Fz
dDxjb25zdCBjaGFyKj4oZGF0YSgpKSwgc2l6ZV99OworICB9CisKKyAgc3RkOjpzdHJpbmcgYXNf
c3RkX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGFzX3N0cmluZygpLlRvU3RkU3RyaW5nKCk7IH0K
KworICBDb25zdEJ5dGVzIGFzX2J5dGVzKCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSygh
dmFsaWQoKSB8fAorICAgICAgICAgICAgICAgICAgICB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlBy
b3RvV2lyZVR5cGU6OmtMZW5ndGhEZWxpbWl0ZWQpOworICAgIHJldHVybiBDb25zdEJ5dGVze2Rh
dGEoKSwgc2l6ZV99OworICB9CisKKyAgY29uc3QgdWludDhfdCogZGF0YSgpIGNvbnN0IHsKKyAg
ICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSgp
ID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprTGVuZ3RoRGVsaW1pdGVkKTsKKyAgICBy
ZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oaW50X3ZhbHVlXyk7CisgIH0K
KworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkg
fHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVU
eXBlOjprTGVuZ3RoRGVsaW1pdGVkKTsKKyAgICByZXR1cm4gc2l6ZV87CisgIH0KKworICB1aW50
NjRfdCByYXdfaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gaW50X3ZhbHVlXzsgfQorCisgIHZv
aWQgaW5pdGlhbGl6ZSh1aW50MTZfdCBpZCwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlw
ZSwKKyAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGludF92YWx1ZSwKKyAgICAgICAgICAgICAg
ICAgIHVpbnQzMl90IHNpemUpIHsKKyAgICBpZF8gPSBpZDsKKyAgICB0eXBlXyA9IHR5cGU7Cisg
ICAgaW50X3ZhbHVlXyA9IGludF92YWx1ZTsKKyAgICBzaXplXyA9IHNpemU7CisgIH0KKworICAv
LyBGb3IgdXNlIHdpdGggdGVtcGxhdGVzLiBUaGlzIGlzIHVzZWQgYnkgUmVwZWF0ZWRGaWVsZEl0
ZXJhdG9yOjpvcGVyYXRvciooKS4KKyAgdm9pZCBnZXQoYm9vbCogdmFsKSBjb25zdCB7ICp2YWwg
PSBhc19ib29sKCk7IH0KKyAgdm9pZCBnZXQodWludDMyX3QqIHZhbCkgY29uc3QgeyAqdmFsID0g
YXNfdWludDMyKCk7IH0KKyAgdm9pZCBnZXQoaW50MzJfdCogdmFsKSBjb25zdCB7ICp2YWwgPSBh
c19pbnQzMigpOyB9CisgIHZvaWQgZ2V0KHVpbnQ2NF90KiB2YWwpIGNvbnN0IHsgKnZhbCA9IGFz
X3VpbnQ2NCgpOyB9CisgIHZvaWQgZ2V0KGludDY0X3QqIHZhbCkgY29uc3QgeyAqdmFsID0gYXNf
aW50NjQoKTsgfQorICB2b2lkIGdldChmbG9hdCogdmFsKSBjb25zdCB7ICp2YWwgPSBhc19mbG9h
dCgpOyB9CisgIHZvaWQgZ2V0KGRvdWJsZSogdmFsKSBjb25zdCB7ICp2YWwgPSBhc19kb3VibGUo
KTsgfQorICB2b2lkIGdldChzdGQ6OnN0cmluZyogdmFsKSBjb25zdCB7ICp2YWwgPSBhc19zdGRf
c3RyaW5nKCk7IH0KKyAgdm9pZCBnZXQoQ29uc3RDaGFycyogdmFsKSBjb25zdCB7ICp2YWwgPSBh
c19zdHJpbmcoKTsgfQorICB2b2lkIGdldChDb25zdEJ5dGVzKiB2YWwpIGNvbnN0IHsgKnZhbCA9
IGFzX2J5dGVzKCk7IH0KKyAgdm9pZCBnZXRfc2lnbmVkKGludDMyX3QqIHZhbCkgY29uc3QgeyAq
dmFsID0gYXNfc2ludDMyKCk7IH0KKyAgdm9pZCBnZXRfc2lnbmVkKGludDY0X3QqIHZhbCkgY29u
c3QgeyAqdmFsID0gYXNfc2ludDY0KCk7IH0KKworICAvLyBGb3IgZW51bSB0eXBlcy4KKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQsCisgICAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6
ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUsIFQ+Ojp0eXBlPgorICB2b2lkIGdldChU
KiB2YWwpIGNvbnN0IHsKKyAgICAqdmFsID0gc3RhdGljX2Nhc3Q8VD4oYXNfaW50MzIoKSk7Cisg
IH0KKworICAvLyBTZXJpYWxpemVzIHRoZSBmaWVsZCBiYWNrIGludG8gYSBwcm90by1lbmNvZGVk
IGJ5dGUgc3RyZWFtIGFuZCBhcHBlbmRzIGl0CisgIC8vIHRvIHxkc3R8LiB8ZHN0fCBpcyByZXNp
emVkIGFjY29yZGluZ2x5LgorICB2b2lkIFNlcmlhbGl6ZUFuZEFwcGVuZFRvKHN0ZDo6c3RyaW5n
KiBkc3QpIGNvbnN0OworCisgIC8vIFNlcmlhbGl6ZXMgdGhlIGZpZWxkIGJhY2sgaW50byBhIHBy
b3RvLWVuY29kZWQgYnl0ZSBzdHJlYW0gYW5kIGFwcGVuZHMgaXQKKyAgLy8gdG8gfGRzdHwuIHxk
c3R8IGlzIHJlc2l6ZWQgYWNjb3JkaW5nbHkuCisgIHZvaWQgU2VyaWFsaXplQW5kQXBwZW5kVG8o
c3RkOjp2ZWN0b3I8dWludDhfdD4qIGRzdCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIFNlcmlhbGl6ZUFuZEFwcGVuZFRvSW50ZXJu
YWwoQ29udGFpbmVyKiBkc3QpIGNvbnN0OworCisgIC8vIEZpZWxkcyBhcmUgZGVsaWJlcmF0ZWx5
IG5vdCBpbml0aWFsaXplZCB0byBrZWVwIHRoZSBjbGFzcyB0cml2aWFsbHkKKyAgLy8gY29uc3Ry
dWN0aWJsZS4gSXQgbWFrZXMgYSBsYXJnZSBwZXJmIGRpZmZlcmVuY2UgZm9yIFByb3RvRGVjb2Rl
ci4KKworICB1aW50NjRfdCBpbnRfdmFsdWVfOyAgLy8gSW4ga0xlbmd0aERlbGltaXRlZCB0aGlz
IGNvbnRhaW5zIHRoZSBkYXRhKCkgYWRkci4KKyAgdWludDMyX3Qgc2l6ZV87ICAgICAgIC8vIE9u
bHkgdmFsaWQgd2hlbiB3aGVuIHR5cGUgPT0ga0xlbmd0aERlbGltaXRlZC4KKyAgdWludDE2X3Qg
aWRfOyAgICAgICAgIC8vIFByb3RvIGZpZWxkIG9yZGluYWwuCisgIHVpbnQ4X3QgdHlwZV87ICAg
ICAgICAvLyBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZS4KK307CisKKy8vIFRoZSBGaWVsZCBz
dHJ1Y3QgaXMgdXNlZCBpbiBhIGxvdCBvZiBwZXJmLXNlbnNpdGl2ZSBjb250ZXh0cy4KK3N0YXRp
Y19hc3NlcnQoc2l6ZW9mKEZpZWxkKSA9PSAxNiwgIkZpZWxkIHN0cnVjdCB0b28gYmlnIik7CisK
K30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRP
X1BST1RPWkVST19GSUVMRF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9maWVsZC5oIgorCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKworI2lm
IF9fQllURV9PUkRFUl9fICE9IF9fT1JERVJfTElUVExFX0VORElBTl9fCisvLyBUaGUgbWVtY3B5
KCkgZm9yIGZpeGVkMzIvNjQgYmVsb3cgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgaWYgd2Ugd2FudCB0
bworLy8gc3VwcG9ydCBiaWcgZW5kaWFuIENQVXMuIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBh
IGNvbXBlbGxpbmcgbmVlZCB0b2RheS4KKyNlcnJvciBVbmltcGxlbWVudGVkIGZvciBiaWcgZW5k
aWFuIGFyY2hzLgorI2VuZGlmCisKK25hbWVzcGFjZSBwcm90b3plcm8geworCit0ZW1wbGF0ZSA8
dHlwZW5hbWUgQ29udGFpbmVyPgordm9pZCBGaWVsZDo6U2VyaWFsaXplQW5kQXBwZW5kVG9JbnRl
cm5hbChDb250YWluZXIqIGRzdCkgY29uc3QgeworICBuYW1lc3BhY2UgcHUgPSBwcm90b191dGls
czsKKyAgc2l6ZV90IGluaXRpYWxfc2l6ZSA9IGRzdC0+c2l6ZSgpOworICBkc3QtPnJlc2l6ZShp
bml0aWFsX3NpemUgKyBwdTo6a01heFNpbXBsZUZpZWxkRW5jb2RlZFNpemUgKyBzaXplXyk7Cisg
IHVpbnQ4X3QqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJigqZHN0KVtpbml0
aWFsX3NpemVdKTsKKyAgdWludDhfdCogd3B0ciA9IHN0YXJ0OworICBzd2l0Y2ggKHR5cGVfKSB7
CisgICAgY2FzZSBzdGF0aWNfY2FzdDxpbnQ+KHB1OjpQcm90b1dpcmVUeXBlOjprVmFySW50KTog
eworICAgICAgd3B0ciA9IHB1OjpXcml0ZVZhckludChwdTo6TWFrZVRhZ1ZhckludChpZF8pLCB3
cHRyKTsKKyAgICAgIHdwdHIgPSBwdTo6V3JpdGVWYXJJbnQoaW50X3ZhbHVlXywgd3B0cik7Cisg
ICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzdGF0aWNfY2FzdDxpbnQ+KHB1OjpQcm90b1dp
cmVUeXBlOjprRml4ZWQzMik6IHsKKyAgICAgIHdwdHIgPSBwdTo6V3JpdGVWYXJJbnQocHU6Ok1h
a2VUYWdGaXhlZDx1aW50MzJfdD4oaWRfKSwgd3B0cik7CisgICAgICB1aW50MzJfdCB2YWx1ZTMy
ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGludF92YWx1ZV8pOworICAgICAgbWVtY3B5KHdwdHIs
ICZ2YWx1ZTMyLCBzaXplb2YodmFsdWUzMikpOworICAgICAgd3B0ciArPSBzaXplb2YodWludDMy
X3QpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Ugc3RhdGljX2Nhc3Q8aW50PihwdTo6
UHJvdG9XaXJlVHlwZTo6a0ZpeGVkNjQpOiB7CisgICAgICB3cHRyID0gcHU6OldyaXRlVmFySW50
KHB1OjpNYWtlVGFnRml4ZWQ8dWludDY0X3Q+KGlkXyksIHdwdHIpOworICAgICAgbWVtY3B5KHdw
dHIsICZpbnRfdmFsdWVfLCBzaXplb2YoaW50X3ZhbHVlXykpOworICAgICAgd3B0ciArPSBzaXpl
b2YodWludDY0X3QpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Ugc3RhdGljX2Nhc3Q8
aW50PihwdTo6UHJvdG9XaXJlVHlwZTo6a0xlbmd0aERlbGltaXRlZCk6IHsKKyAgICAgIENvbnN0
Qnl0ZXMgcGF5bG9hZCA9IGFzX2J5dGVzKCk7CisgICAgICB3cHRyID0gcHU6OldyaXRlVmFySW50
KHB1OjpNYWtlVGFnTGVuZ3RoRGVsaW1pdGVkKGlkXyksIHdwdHIpOworICAgICAgd3B0ciA9IHB1
OjpXcml0ZVZhckludChwYXlsb2FkLnNpemUsIHdwdHIpOworICAgICAgbWVtY3B5KHdwdHIsIHBh
eWxvYWQuZGF0YSwgcGF5bG9hZC5zaXplKTsKKyAgICAgIHdwdHIgKz0gcGF5bG9hZC5zaXplOwor
ICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBQRVJGRVRUT19GQVRBTCgi
VW5rbm93biBmaWVsZCB0eXBlICV1IiwgdHlwZV8pOworICB9CisgIHNpemVfdCB3cml0dGVuX3Np
emUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHdwdHIgLSBzdGFydCk7CisgIFBFUkZFVFRPX0RDSEVD
Syh3cml0dGVuX3NpemUgPiAwICYmIHdyaXR0ZW5fc2l6ZSA8IHB1OjprTWF4TWVzc2FnZUxlbmd0
aCk7CisgIFBFUkZFVFRPX0RDSEVDSyhpbml0aWFsX3NpemUgKyB3cml0dGVuX3NpemUgPD0gZHN0
LT5zaXplKCkpOworICBkc3QtPnJlc2l6ZShpbml0aWFsX3NpemUgKyB3cml0dGVuX3NpemUpOwor
fQorCit2b2lkIEZpZWxkOjpTZXJpYWxpemVBbmRBcHBlbmRUbyhzdGQ6OnN0cmluZyogZHN0KSBj
b25zdCB7CisgIFNlcmlhbGl6ZUFuZEFwcGVuZFRvSW50ZXJuYWwoZHN0KTsKK30KKwordm9pZCBG
aWVsZDo6U2VyaWFsaXplQW5kQXBwZW5kVG8oc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRzdCkgY29u
c3QgeworICBTZXJpYWxpemVBbmRBcHBlbmRUb0ludGVybmFsKGRzdCk7Cit9CisKK30gIC8vIG5h
bWVzcGFjZSBwcm90b3plcm8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9w
cm90b3plcm8vbWVzc2FnZS5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5j
bHVkZS9wZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfc3RyZWFtX3dy
aXRlci5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNl
IFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn
L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi
bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAq
IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhl
IExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FU
VEVSRURfU1RSRUFNX1dSSVRFUl9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVS
T19TQ0FUVEVSRURfU1RSRUFNX1dSSVRFUl9IXworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5j
bHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
Y29tcGlsZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vY29udGlndW91c19tZW1vcnlfcmFuZ2UuaCIKKworbmFtZXNw
YWNlIHByb3RvemVybyB7CisKKy8vIFRoaXMgY2xhc3MgZGVhbHMgd2l0aCB0aGUgZm9sbG93aW5n
IHByb2JsZW06IGFwcGVuZC1vbmx5IHByb3RvIG1lc3NhZ2VzIHdhbnQKKy8vIHRvIHdyaXRlIGEg
c3RyZWFtIG9mIGJ5dGVzLCB3aXRob3V0IGNhcmluZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24g
b2YgdGhlCisvLyB1bmRlcmx5aW5nIGJ1ZmZlciAod2hpY2ggY29uY3JldGVseSB3aWxsIGJlIGVp
dGhlciB0aGUgdHJhY2UgcmluZyBidWZmZXIKKy8vIG9yIGEgaGVhcC1hbGxvY2F0ZWQgYnVmZmVy
KS4gVGhlIG1haW4gZGVhbCBpczogcHJvdG8gbWVzc2FnZXMgZG9uJ3Qga25vdyBpbgorLy8gYWR2
YW5jZSB3aGF0IHRoZWlyIHNpemUgd2lsbCBiZS4KKy8vIER1ZSB0byB0aGUgdHJhY2luZyBidWZm
ZXIgYmVpbmcgc3BsaXQgaW50byBmaXhlZC1zaXplIGNodW5rcywgb24gc29tZQorLy8gb2NjYXNp
b25zLCB0aGVzZSB3cml0ZXMgbmVlZCB0byBiZSBzcHJlYWQgb3ZlciB0d28gKG9yIG1vcmUpIG5v
bi1jb250aWd1b3VzCisvLyBjaHVua3Mgb2YgbWVtb3J5LiBTaW1pbGFybHksIHdoZW4gdGhlIGJ1
ZmZlciBpcyBiYWNrZWQgYnkgdGhlIGhlYXAsIHdlIHdhbnQKKy8vIHRvIGF2b2lkIHJlYWxsb2Mo
KSBjYWxscywgYXMgdGhleSBtaWdodCBjYXVzZSBhIGZ1bGwgY29weSBvZiB0aGUgY29udGVudHMK
Ky8vIG9mIHRoZSBidWZmZXIuCisvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGFi
c3RyYWN0IGF3YXkgdGhlIG5vbi1jb250aWd1b3VzIHdyaXRlIGxvZ2ljLgorLy8gVGhpcyBjbGFz
cyBrbm93cyBob3cgdG8gZGVhbCB3aXRoIHdyaXRlcyBhcyBsb25nIGFzIHRoZXkgZmFsbCBpbiB0
aGUgc2FtZQorLy8gQ29udGlndW91c01lbW9yeVJhbmdlIGFuZCBkZWZlcnMgdGhlIGNodW5rLWNo
YWluaW5nIGxvZ2ljIHRvIHRoZSBEZWxlZ2F0ZS4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBTY2F0
dGVyZWRTdHJlYW1Xcml0ZXIgeworIHB1YmxpYzoKKyAgY2xhc3MgUEVSRkVUVE9fRVhQT1JUIERl
bGVnYXRlIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5EZWxlZ2F0ZSgpOworICAgIHZpcnR1
YWwgQ29udGlndW91c01lbW9yeVJhbmdlIEdldE5ld0J1ZmZlcigpID0gMDsKKyAgfTsKKworICBl
eHBsaWNpdCBTY2F0dGVyZWRTdHJlYW1Xcml0ZXIoRGVsZWdhdGUqIGRlbGVnYXRlKTsKKyAgflNj
YXR0ZXJlZFN0cmVhbVdyaXRlcigpOworCisgIGlubGluZSB2b2lkIFdyaXRlQnl0ZSh1aW50OF90
IHZhbHVlKSB7CisgICAgaWYgKHdyaXRlX3B0cl8gPj0gY3VyX3JhbmdlXy5lbmQpCisgICAgICBF
eHRlbmQoKTsKKyAgICAqd3JpdGVfcHRyXysrID0gdmFsdWU7CisgIH0KKworICAvLyBBc3N1bWVz
IHRoYXQgdGhlIGNhbGxlciBjaGVja2VkIHRoYXQgdGhlcmUgaXMgZW5vdWdoIGhlYWRyb29tLgor
ICAvLyBUT0RPKHByaW1pYW5vKTogcGVyZiBvcHRpbWl6YXRpb24sIHRoaXMgaXMgYSB0cmFjaW5n
IGhvdCBwYXRoLiBUaGUKKyAgLy8gY29tcGlsZXIgY2FuIG1ha2Ugc3Ryb25nIG9wdGltaXphdGlv
biBvbiBtZW1jcHkgaWYgdGhlIHNpemUgYXJnIGlzIGEKKyAgLy8gY29uc3RleHByLiBNYWtlIGEg
dGVtcGxhdGVkIHZhcmlhbnQgb2YgdGhpcyBmb3IgZml4ZWQtc2l6ZSB3cml0ZXMuCisgIC8vIFRP
RE8ocHJpbWlhbm8pOiByZXN0cmljdCAvIG5vYWxpYXMgbWlnaHQgYWxzbyBoZWxwLgorICBpbmxp
bmUgdm9pZCBXcml0ZUJ5dGVzVW5zYWZlKGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNpemUp
IHsKKyAgICB1aW50OF90KiBjb25zdCBlbmQgPSB3cml0ZV9wdHJfICsgc2l6ZTsKKyAgICBhc3Nl
cnQoZW5kIDw9IGN1cl9yYW5nZV8uZW5kKTsKKyAgICBtZW1jcHkod3JpdGVfcHRyXywgc3JjLCBz
aXplKTsKKyAgICB3cml0ZV9wdHJfID0gZW5kOworICB9CisKKyAgaW5saW5lIHZvaWQgV3JpdGVC
eXRlcyhjb25zdCB1aW50OF90KiBzcmMsIHNpemVfdCBzaXplKSB7CisgICAgdWludDhfdCogY29u
c3QgZW5kID0gd3JpdGVfcHRyXyArIHNpemU7CisgICAgaWYgKFBFUkZFVFRPX0xJS0VMWShlbmQg
PD0gY3VyX3JhbmdlXy5lbmQpKQorICAgICAgcmV0dXJuIFdyaXRlQnl0ZXNVbnNhZmUoc3JjLCBz
aXplKTsKKyAgICBXcml0ZUJ5dGVzU2xvd1BhdGgoc3JjLCBzaXplKTsKKyAgfQorCisgIHZvaWQg
V3JpdGVCeXRlc1Nsb3dQYXRoKGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNpemUpOworCisg
IC8vIFJlc2VydmVzIGEgZml4ZWQgYW1vdW50IG9mIGJ5dGVzIHRvIGJlIGJhY2tmaWxsZWQgbGF0
ZXIuIFRoZSByZXNlcnZlZCByYW5nZQorICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGNvbnRpZ3Vv
dXMgYW5kIG5vdCBzcGFuIGFjcm9zcyBjaHVua3MuIHxzaXplfCBoYXMgdG8gYmUKKyAgLy8gPD0g
dGhhbiB0aGUgc2l6ZSBvZiBhIG5ldyBidWZmZXIgcmV0dXJuZWQgYnkgdGhlIERlbGVnYXRlOjpH
ZXROZXdCdWZmZXIoKS4KKyAgdWludDhfdCogUmVzZXJ2ZUJ5dGVzKHNpemVfdCBzaXplKTsKKwor
ICAvLyBGYXN0IChidXQgdW5zYWZlKSB2ZXJzaW9uIG9mIHRoZSBhYm92ZS4gVGhlIGNhbGxlciBt
dXN0IGhhdmUgcHJldmlvdXNseQorICAvLyBjaGVja2VkIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0
IHxzaXplfCBjb250aWd1b3VzIGJ5dGVzIGF2YWlsYWJsZS4KKyAgLy8gUmV0dXJucyBvbmx5IHRo
ZSBzdGFydCBwb2ludGVyIG9mIHRoZSByZXNlcnZhdGlvbi4KKyAgdWludDhfdCogUmVzZXJ2ZUJ5
dGVzVW5zYWZlKHNpemVfdCBzaXplKSB7CisgICAgdWludDhfdCogYmVnaW4gPSB3cml0ZV9wdHJf
OworICAgIHdyaXRlX3B0cl8gKz0gc2l6ZTsKKyAgICBhc3NlcnQod3JpdGVfcHRyXyA8PSBjdXJf
cmFuZ2VfLmVuZCk7CisgICAgcmV0dXJuIGJlZ2luOworICB9CisKKyAgLy8gUmVzZXRzIHRoZSBi
dWZmZXIgYm91bmRhcmllcyBhbmQgdGhlIHdyaXRlIHBvaW50ZXIgdG8gdGhlIGdpdmVuIHxyYW5n
ZXwuCisgIC8vIFN1YnNlcXVlbnQgV3JpdGVCeXRlKHMpIHdpbGwgd3JpdGUgaW50byB8cmFuZ2V8
LgorICB2b2lkIFJlc2V0KENvbnRpZ3VvdXNNZW1vcnlSYW5nZSByYW5nZSk7CisKKyAgLy8gTnVt
YmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBieXRlcyBpbiB8Y3VyX3JhbmdlX3wgdGhhdCBjYW4gYmUg
d3JpdHRlbiB3aXRob3V0CisgIC8vIHJlcXVlc3RpbmcgYSBuZXcgYnVmZmVyLgorICBzaXplX3Qg
Ynl0ZXNfYXZhaWxhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+
KGN1cl9yYW5nZV8uZW5kIC0gd3JpdGVfcHRyXyk7CisgIH0KKworICB1aW50OF90KiB3cml0ZV9w
dHIoKSBjb25zdCB7IHJldHVybiB3cml0ZV9wdHJfOyB9CisKKyAgdWludDY0X3Qgd3JpdHRlbigp
IGNvbnN0IHsKKyAgICByZXR1cm4gd3JpdHRlbl9wcmV2aW91c2x5XyArCisgICAgICAgICAgIHN0
YXRpY19jYXN0PHVpbnQ2NF90Pih3cml0ZV9wdHJfIC0gY3VyX3JhbmdlXy5iZWdpbik7CisgIH0K
KworIHByaXZhdGU6CisgIFNjYXR0ZXJlZFN0cmVhbVdyaXRlcihjb25zdCBTY2F0dGVyZWRTdHJl
YW1Xcml0ZXImKSA9IGRlbGV0ZTsKKyAgU2NhdHRlcmVkU3RyZWFtV3JpdGVyJiBvcGVyYXRvcj0o
Y29uc3QgU2NhdHRlcmVkU3RyZWFtV3JpdGVyJikgPSBkZWxldGU7CisKKyAgdm9pZCBFeHRlbmQo
KTsKKworICBEZWxlZ2F0ZSogY29uc3QgZGVsZWdhdGVfOworICBDb250aWd1b3VzTWVtb3J5UmFu
Z2UgY3VyX3JhbmdlXzsKKyAgdWludDhfdCogd3JpdGVfcHRyXzsKKyAgdWludDY0X3Qgd3JpdHRl
bl9wcmV2aW91c2x5XyA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKKyNl
bmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fU0NBVFRFUkVEX1NUUkVBTV9XUklU
RVJfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2Ug
UHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lv
biAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcv
bGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJs
ZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1
bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICog
V0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHBy
ZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5n
dWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUg
TGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX01FU1NB
R0VfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fTUVTU0FHRV9IXworCisj
aW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5n
Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0Lmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xv
Z2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9jb250aWd1b3VzX21lbW9yeV9yYW5nZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
c2NhdHRlcmVkX3N0cmVhbV93cml0ZXIuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVz
cGFjZSBzaG1fZnV6eiB7CitjbGFzcyBGYWtlUHJvZHVjZXI7Cit9ICAvLyBuYW1lc3BhY2Ugc2ht
X2Z1enoKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCituYW1lc3BhY2UgcHJvdG96ZXJvIHsK
KworY2xhc3MgTWVzc2FnZUhhbmRsZUJhc2U7CisKKy8vIEJhc2UgY2xhc3MgZXh0ZW5kZWQgYnkg
dGhlIHByb3RvIEMrKyBzdHVicyBnZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybworLy8gY29tcGls
ZXIuIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIG1pbmltYWwgcnVudGltZSByZXF1aXJlZCB0byBz
dXBwb3J0CisvLyBhcHBlbmQtb25seSBvcGVyYXRpb25zIGFuZCBpcyBkZXNpZ25lZCBmb3IgcGVy
Zm9ybWFuY2UuIE5vbmUgb2YgdGhlIG1ldGhvZHMKKy8vIHJlcXVpcmUgYW55IGR5bmFtaWMgbWVt
b3J5IGFsbG9jYXRpb24uCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgTWVzc2FnZSB7CisgcHVibGlj
OgorICBmcmllbmQgY2xhc3MgTWVzc2FnZUhhbmRsZUJhc2U7CisKKyAgLy8gQWRqdXN0IHRoZSB8
bmVzdGVkX21lc3NhZ2VzX2FyZW5hX3wgc2l6ZSB3aGVuIGNoYW5naW5nIHRoaXMsIG9yIHRoZQor
ICAvLyBzdGF0aWNfYXNzZXJ0IGluIHRoZSAuY2MgZmlsZSB3aWxsIGJhcmsuCisgIHN0YXRpYyBj
b25zdGV4cHIgdWludDMyX3Qga01heE5lc3RpbmdEZXB0aCA9IDEwOworCisgIC8vIEN0b3IgYW5k
IER0b3Igb2YgTWVzc2FnZSBhcmUgbmV2ZXIgY2FsbGVkLCB3aXRoIHRoZSBleGVjZXB0aW9uCisg
IC8vIG9mIHJvb3QgKG5vbi1uZXN0ZWQpIG1lc3NhZ2VzLiBOZXN0ZWQgbWVzc2FnZXMgYXJlIGFs
bG9jYXRlZCB2aWEgcGxhY2VtZW50CisgIC8vIG5ldyBpbiB0aGUgfG5lc3RlZF9tZXNzYWdlc19h
cmVuYV98IGFuZCBpbXBsaWN0bHkgZGVzdHJveWVkIHdoZW4gdGhlIGFyZW5hCisgIC8vIG9mIHRo
ZSByb290IG1lc3NhZ2UgZ29lcyBhd2F5LiBUaGlzIGlzIGZpbmUgYXMgbG9uZyBhcyBhbGwgdGhl
IGZpZWxkcyBhcmUKKyAgLy8gUE9Ecywgd2hpY2ggaXMgY2hlY2tlZCBieSB0aGUgc3RhdGljX2Fz
c2VydCBpbiB0aGUgY3RvciAoc2VlIHRoZSBSZXNldCgpCisgIC8vIG1ldGhvZCBpbiB0aGUgLmNj
IGZpbGUpLgorICBNZXNzYWdlKCkgPSBkZWZhdWx0OworCisgIC8vIENsZWFycyB1cCB0aGUgc3Rh
dGUsIGFsbG93aW5nIHRoZSBtZXNzYWdlIHRvIGJlIHJldXNlZCBhcyBhIGZyZXNoIG9uZS4KKyAg
dm9pZCBSZXNldChTY2F0dGVyZWRTdHJlYW1Xcml0ZXIqKTsKKworICAvLyBDb21taXRzIGFsbCB0
aGUgY2hhbmdlcyB0byB0aGUgYnVmZmVyIChiYWNrZmlsbHMgdGhlIHNpemUgZmllbGQgb2YgdGhp
cyBhbmQKKyAgLy8gYWxsIG5lc3RlZCBtZXNzYWdlcykgYW5kIHNlYWxzIHRoZSBtZXNzYWdlLiBS
ZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlCisgIC8vIChhbmQgYWxsIG5lc3RlZCBzdWIt
bWVzc2FnZXMpLCB3aXRob3V0IHRha2luZyBpbnRvIGFjY291bnQgYW55IGNodW5raW5nLgorICAv
LyBGaW5hbGl6ZSBpcyBpZGVtcG90ZW50IGFuZCBjYW4gYmUgY2FsbGVkIHNldmVyYWwgdGltZXMg
dy9vIHNpZGUgZWZmZWN0cy4KKyAgdWludDMyX3QgRmluYWxpemUoKTsKKworICAvLyBPcHRpb25h
bC4gSWYgaXNfdmFsaWQoKSA9PSB0cnVlLCB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgcmVnaW9u
IChpdHMKKyAgLy8gbGVuZ3RoID09IHByb3RvX3V0aWxzOjprTWVzc2FnZUxlbmd0aEZpZWxkU2l6
ZSkgaXMgYmFja2ZpbGxlZCB3aXRoIHRoZSBzaXplCisgIC8vIG9mIHRoaXMgbWVzc2FnZSAobWlu
dXMgfHNpemVfYWxyZWFkeV93cml0dGVufCBiZWxvdykuIFRoaXMgaXMgdGhlIG1lY2hhbmlzbQor
ICAvLyB1c2VkIGJ5IG1lc3NhZ2VzIHRvIGJhY2tmaWxsIHRoZWlyIGNvcnJlc3BvbmRpbmcgc2l6
ZSBmaWVsZCBpbiB0aGUgcGFyZW50CisgIC8vIG1lc3NhZ2UuCisgIHVpbnQ4X3QqIHNpemVfZmll
bGQoKSBjb25zdCB7IHJldHVybiBzaXplX2ZpZWxkXzsgfQorICB2b2lkIHNldF9zaXplX2ZpZWxk
KHVpbnQ4X3QqIHNpemVfZmllbGQpIHsgc2l6ZV9maWVsZF8gPSBzaXplX2ZpZWxkOyB9CisKKyAg
Ly8gVGhpcyBpcyB0byBkZWFsIHdpdGggY2FzZSBvZiBiYWNrZmlsbGluZyB0aGUgc2l6ZSBvZiBh
IHJvb3QgKG5vbi1uZXN0ZWQpCisgIC8vIG1lc3NhZ2Ugd2hpY2ggaXMgc3BsaXQgaW50byBtdWx0
aXBsZSBjaHVua3MuIFVwb24gZmluYWxpemF0aW9uIG9ubHkgdGhlCisgIC8vIHBhcnRpYWwgc2l6
ZSB0aGF0IGxpZXMgaW4gdGhlIGxhc3QgY2h1bmsgaGFzIHRvIGJlIGJhY2tmaWxsZWQuCisgIHZv
aWQgaW5jX3NpemVfYWxyZWFkeV93cml0dGVuKHVpbnQzMl90IHN6KSB7IHNpemVfYWxyZWFkeV93
cml0dGVuXyArPSBzejsgfQorCisgIE1lc3NhZ2UqIG5lc3RlZF9tZXNzYWdlKCkgeyByZXR1cm4g
bmVzdGVkX21lc3NhZ2VfOyB9CisKKyAgYm9vbCBpc19maW5hbGl6ZWQoKSBjb25zdCB7IHJldHVy
biBmaW5hbGl6ZWRfOyB9CisKKyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICB2b2lkIHNl
dF9oYW5kbGUoTWVzc2FnZUhhbmRsZUJhc2UqIGhhbmRsZSkgeyBoYW5kbGVfID0gaGFuZGxlOyB9
CisjZW5kaWYKKworICAvLyBQcm90byB0eXBlczogdWludDY0LCB1aW50MzIsIGludDY0LCBpbnQz
MiwgYm9vbCwgZW51bS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgQXBwZW5kVmFy
SW50KHVpbnQzMl90IGZpZWxkX2lkLCBUIHZhbHVlKSB7CisgICAgaWYgKG5lc3RlZF9tZXNzYWdl
XykKKyAgICAgIEVuZE5lc3RlZE1lc3NhZ2UoKTsKKworICAgIHVpbnQ4X3QgYnVmZmVyW3Byb3Rv
X3V0aWxzOjprTWF4U2ltcGxlRmllbGRFbmNvZGVkU2l6ZV07CisgICAgdWludDhfdCogcG9zID0g
YnVmZmVyOworCisgICAgcG9zID0gcHJvdG9fdXRpbHM6OldyaXRlVmFySW50KHByb3RvX3V0aWxz
OjpNYWtlVGFnVmFySW50KGZpZWxkX2lkKSwgcG9zKTsKKyAgICAvLyBXcml0ZVZhckludCBlbmNv
ZGVzIHNpZ25lZCB2YWx1ZXMgaW4gdHdvJ3MgY29tcGxlbWVudCBmb3JtLgorICAgIHBvcyA9IHBy
b3RvX3V0aWxzOjpXcml0ZVZhckludCh2YWx1ZSwgcG9zKTsKKyAgICBXcml0ZVRvU3RyZWFtKGJ1
ZmZlciwgcG9zKTsKKyAgfQorCisgIC8vIFByb3RvIHR5cGVzOiBzaW50NjQsIHNpbnQzMi4KKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgQXBwZW5kU2lnbmVkVmFySW50KHVpbnQzMl90
IGZpZWxkX2lkLCBUIHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KGZpZWxkX2lkLCBwcm90b191
dGlsczo6WmlnWmFnRW5jb2RlKHZhbHVlKSk7CisgIH0KKworICAvLyBQcm90byB0eXBlczogYm9v
bCwgZW51bSAoc21hbGwpLgorICAvLyBGYXN0ZXIgdmVyc2lvbiBvZiBBcHBlbmRWYXJJbnQgZm9y
IHRpbnkgbnVtYmVycy4KKyAgdm9pZCBBcHBlbmRUaW55VmFySW50KHVpbnQzMl90IGZpZWxkX2lk
LCBpbnQzMl90IHZhbHVlKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKDAgPD0gdmFsdWUgJiYgdmFs
dWUgPCAweDgwKTsKKyAgICBpZiAobmVzdGVkX21lc3NhZ2VfKQorICAgICAgRW5kTmVzdGVkTWVz
c2FnZSgpOworCisgICAgdWludDhfdCBidWZmZXJbcHJvdG9fdXRpbHM6OmtNYXhTaW1wbGVGaWVs
ZEVuY29kZWRTaXplXTsKKyAgICB1aW50OF90KiBwb3MgPSBidWZmZXI7CisgICAgLy8gTWFrZVRh
Z1ZhckludCBnZXRzIHN1cGVyIG9wdGltaXplZCBoZXJlIGZvciBjb25zdGV4cHIuCisgICAgcG9z
ID0gcHJvdG9fdXRpbHM6OldyaXRlVmFySW50KHByb3RvX3V0aWxzOjpNYWtlVGFnVmFySW50KGZp
ZWxkX2lkKSwgcG9zKTsKKyAgICAqcG9zKysgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YWx1ZSk7
CisgICAgV3JpdGVUb1N0cmVhbShidWZmZXIsIHBvcyk7CisgIH0KKworICAvLyBQcm90byB0eXBl
czogZml4ZWQ2NCwgc2ZpeGVkNjQsIGZpeGVkMzIsIHNmaXhlZDMyLCBkb3VibGUsIGZsb2F0Lgor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBBcHBlbmRGaXhlZCh1aW50MzJfdCBmaWVs
ZF9pZCwgVCB2YWx1ZSkgeworICAgIGlmIChuZXN0ZWRfbWVzc2FnZV8pCisgICAgICBFbmROZXN0
ZWRNZXNzYWdlKCk7CisKKyAgICB1aW50OF90IGJ1ZmZlcltwcm90b191dGlsczo6a01heFNpbXBs
ZUZpZWxkRW5jb2RlZFNpemVdOworICAgIHVpbnQ4X3QqIHBvcyA9IGJ1ZmZlcjsKKworICAgIHBv
cyA9IHByb3RvX3V0aWxzOjpXcml0ZVZhckludChwcm90b191dGlsczo6TWFrZVRhZ0ZpeGVkPFQ+
KGZpZWxkX2lkKSwgcG9zKTsKKyAgICBtZW1jcHkocG9zLCAmdmFsdWUsIHNpemVvZihUKSk7Cisg
ICAgcG9zICs9IHNpemVvZihUKTsKKyAgICAvLyBUT0RPOiBPcHRpbWl6ZSBtZW1jcHkgcGVyZm9y
bWFuY2UsIHNlZSBodHRwOi8vY3JidWcuY29tLzYyNDMxMSAuCisgICAgV3JpdGVUb1N0cmVhbShi
dWZmZXIsIHBvcyk7CisgIH0KKworICB2b2lkIEFwcGVuZFN0cmluZyh1aW50MzJfdCBmaWVsZF9p
ZCwgY29uc3QgY2hhciogc3RyKTsKKworICB2b2lkIEFwcGVuZFN0cmluZyh1aW50MzJfdCBmaWVs
ZF9pZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIEFwcGVuZEJ5dGVzKGZpZWxkX2lk
LCBzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKKyAgfQorCisgIHZvaWQgQXBwZW5kQnl0ZXModWlu
dDMyX3QgZmllbGRfaWQsIGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisKKyAgLy8g
QXBwZW5kIHJhdyBieXRlcyBmb3IgYSBmaWVsZCwgdXNpbmcgdGhlIHN1cHBsaWVkIHxyYW5nZXN8
IHRvCisgIC8vIGNvcHkgZnJvbSB8bnVtX3Jhbmdlc3wgaW5kaXZpZHVhbCBidWZmZXJzLgorICBz
aXplX3QgQXBwZW5kU2NhdHRlcmVkQnl0ZXModWludDMyX3QgZmllbGRfaWQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBDb250aWd1b3VzTWVtb3J5UmFuZ2UqIHJhbmdlcywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fcmFuZ2VzKTsKKworICAvLyBCZWdp
bnMgYSBuZXN0ZWQgbWVzc2FnZSwgdXNpbmcgdGhlIHN0YXRpYyBzdG9yYWdlIHByb3ZpZGVkIGJ5
IHRoZSBwYXJlbnQKKyAgLy8gY2xhc3MgKHNlZSBjb21tZW50IGluIHxuZXN0ZWRfbWVzc2FnZXNf
YXJlbmFffCkuIFRoZSBuZXN0ZWQgbWVzc2FnZSBlbmRzCisgIC8vIGVpdGhlciB3aGVuIEZpbmFs
aXplKCkgaXMgY2FsbGVkIG9yIHdoZW4gYW55IG90aGVyIEFwcGVuZCogbWV0aG9kIGlzIGNhbGxl
ZAorICAvLyBpbiB0aGUgcGFyZW50IGNsYXNzLgorICAvLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQg
VCBpcyBzdXBwb3NlZCB0byBiZSBhIHN0dWIgY2xhc3MgYXV0byBnZW5lcmF0ZWQgZnJvbQorICAv
LyBhIC5wcm90bywgaGVuY2UgYSBzdWJjbGFzcyBvZiBNZXNzYWdlLgorICB0ZW1wbGF0ZSA8Y2xh
c3MgVD4KKyAgVCogQmVnaW5OZXN0ZWRNZXNzYWdlKHVpbnQzMl90IGZpZWxkX2lkKSB7CisgICAg
Ly8gVGhpcyBpcyB0byBwcmV2ZW50IHN1YmNsYXNzZXMgKHdoaWNoIHNob3VsZCBiZSBhdXRvZ2Vu
ZXJhdGVkLCB0aG91Z2gpLCB0bworICAgIC8vIGludHJvZHVjZSBleHRyYSBzdGF0ZSBmaWVsZHMg
KHdoaWNoIHdvdWxkbid0IGJlIGluaXRpYWxpemVkIGJ5IFJlc2V0KCkpLgorICAgIHN0YXRpY19h
c3NlcnQoc3RkOjppc19iYXNlX29mPE1lc3NhZ2UsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAg
ICAgICJUIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBNZXNzYWdlIik7CisgICAgc3RhdGljX2Fzc2Vy
dChzaXplb2YoVCkgPT0gc2l6ZW9mKE1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgIk1lc3Nh
Z2Ugc3ViY2xhc3NlcyBjYW5ub3QgaW50cm9kdWNlIGV4dHJhIHN0YXRlLiIpOworICAgIFQqIG1l
c3NhZ2UgPSByZWludGVycHJldF9jYXN0PFQqPihuZXN0ZWRfbWVzc2FnZXNfYXJlbmFfKTsKKyAg
ICBCZWdpbk5lc3RlZE1lc3NhZ2VJbnRlcm5hbChmaWVsZF9pZCwgbWVzc2FnZSk7CisgICAgcmV0
dXJuIG1lc3NhZ2U7CisgIH0KKworICBTY2F0dGVyZWRTdHJlYW1Xcml0ZXIqIHN0cmVhbV93cml0
ZXJfZm9yX3Rlc3RpbmcoKSB7IHJldHVybiBzdHJlYW1fd3JpdGVyXzsgfQorCisgIC8vIEFwcGVu
ZHMgc29tZSByYXcgYnl0ZXMgdG8gdGhlIG1lc3NhZ2UuIFRoZSB1c2UtY2FzZSBmb3IgdGhpcyBp
cyBwcmVzZXJ2aW5nCisgIC8vIHVua25vd24gZmllbGRzIGluIHRoZSBkZWNvZGUgLT4gcmUtZW5j
b2RlIHBhdGggb2YgeHh4Lmdlbi5jYyBjbGFzc2VzCisgIC8vIGdlbmVyYXRlZCBieSB0aGUgY3Bw
Z2VuX3BsdWdpbi5jYy4KKyAgLy8gVGhlIGNhbGxlciBuZWVkcyB0byBndWFyYW50ZWUgdGhhdCB0
aGUgYXBwZW5kZWQgZGF0YSBpcyBwcm9wZXJseQorICAvLyBwcm90by1lbmNvZGVkIGFuZCBlYWNo
IGZpZWxkIGhhcyBhIHByb3RvIHByZWFtYmxlLgorICB2b2lkIEFwcGVuZFJhd1Byb3RvQnl0ZXMo
Y29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmMg
PSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKTsKKyAgICBXcml0ZVRvU3Ry
ZWFtKHNyYywgc3JjICsgc2l6ZSk7CisgIH0KKworIHByaXZhdGU6CisgIE1lc3NhZ2UoY29uc3Qg
TWVzc2FnZSYpID0gZGVsZXRlOworICBNZXNzYWdlJiBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYp
ID0gZGVsZXRlOworCisgIHZvaWQgQmVnaW5OZXN0ZWRNZXNzYWdlSW50ZXJuYWwodWludDMyX3Qg
ZmllbGRfaWQsIE1lc3NhZ2UqKTsKKworICAvLyBDYWxsZWQgYnkgRmluYWxpemUgYW5kIEFwcGVu
ZCogbWV0aG9kcy4KKyAgdm9pZCBFbmROZXN0ZWRNZXNzYWdlKCk7CisKKyAgdm9pZCBXcml0ZVRv
U3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHNyY19iZWdpbiwgY29uc3QgdWludDhfdCogc3JjX2VuZCkg
eworICAgIFBFUkZFVFRPX0RDSEVDSyghZmluYWxpemVkXyk7CisgICAgUEVSRkVUVE9fRENIRUNL
KHNyY19iZWdpbiA8PSBzcmNfZW5kKTsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gc3RhdGlj
X2Nhc3Q8dWludDMyX3Q+KHNyY19lbmQgLSBzcmNfYmVnaW4pOworICAgIHN0cmVhbV93cml0ZXJf
LT5Xcml0ZUJ5dGVzKHNyY19iZWdpbiwgc2l6ZSk7CisgICAgc2l6ZV8gKz0gc2l6ZTsKKyAgfQor
CisgIC8vIE9ubHkgUE9EIGZpZWxkcyBhcmUgYWxsb3dlZC4gVGhpcyBjbGFzcydzIGR0b3IgaXMg
bmV2ZXIgY2FsbGVkLgorICAvLyBTZWUgdGhlIGNvbW1lbnQgb24gdGhlIHN0YXRpY19hc3NlcnQg
aW4gdGhlIGNvcnJlc3BvbmRpbmcgLmNjIGZpbGUuCisKKyAgLy8gVGhlIHN0cmVhbSB3cml0ZXIg
aW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBzZXJpYWxpemF0aW9uLgorICBTY2F0dGVyZWRTdHJlYW1X
cml0ZXIqIHN0cmVhbV93cml0ZXJfOworCisgIHVpbnQ4X3QqIHNpemVfZmllbGRfOworCisgIC8v
IEtlZXBzIHRyYWNrIG9mIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuCisgIHVpbnQz
Ml90IHNpemVfOworCisgIC8vIFNlZSBjb21tZW50IGZvciBpbmNfc2l6ZV9hbHJlYWR5X3dyaXR0
ZW4oKS4KKyAgdWludDMyX3Qgc2l6ZV9hbHJlYWR5X3dyaXR0ZW5fOworCisgIC8vIFdoZW4gdHJ1
ZSwgbm8gbW9yZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlIGFyZSBhbGxvd2VkLiBUaGlzIGlzIHRv
IERDSEVDSworICAvLyBhdHRlbXB0cyBvZiB3cml0aW5nIHRvIGEgbWVzc2FnZSB3aGljaCBoYXMg
YmVlbiBGaW5hbGl6ZSgpLWQuCisgIGJvb2wgZmluYWxpemVkXzsKKworICAvLyBVc2VkIHRvIGRl
dGVjdCBhdHRlbXBzIHRvIGNyZWF0ZSBtZXNzYWdlcyB3aXRoIGEgbmVzdGluZyBsZXZlbCA+Cisg
IC8vIGtNYXhOZXN0aW5nRGVwdGguIHxuZXN0aW5nX2RlcHRoX3wgPT0gMCBmb3Igcm9vdCAobm9u
LW5lc3RlZCkgbWVzc2FnZXMuCisgIHVpbnQ4X3QgbmVzdGluZ19kZXB0aF87CisKKyNpZiBQRVJG
RVRUT19EQ0hFQ0tfSVNfT04oKQorICAvLyBDdXJyZW50IGdlbmVyYXRpb24gb2YgbWVzc2FnZS4g
SW5jcmVtZW50ZWQgb24gUmVzZXQuCisgIC8vIFVzZWQgdG8gZGV0ZWN0IHN0YWxlIGhhbmRsZXMu
CisgIHVpbnQzMl90IGdlbmVyYXRpb25fOworCisgIE1lc3NhZ2VIYW5kbGVCYXNlKiBoYW5kbGVf
OworI2VuZGlmCisKKyAgLy8gUG9pbnRlciB0byB0aGUgbGFzdCBjaGlsZCBtZXNzYWdlIGNyZWF0
ZWQgdGhyb3VnaCBCZWdpbk5lc3RlZE1lc3NhZ2UoKSwgaWYKKyAgLy8gYW55LCBudWxscHRyIG90
aGVyd2lzZS4gVGhlcmUgaXMgbm8gbmVlZCB0byBrZWVwIHRyYWNrIG9mIG1vcmUgdGhhbiBvbmUK
KyAgLy8gbWVzc2FnZSBwZXIgbmVzdGluZyBsZXZlbCBhcyB0aGUgcHJvdG8temVybyBBUEkgY29u
dHJhY3QgbWFuZGF0ZXMgdGhhdAorICAvLyBuZXN0ZWQgZmllbGRzIGNhbiBiZSBmaWxsZWQgb25s
eSBpbiBhIHN0YWNrZWQgZmFzaGlvbi4gSW4gb3RoZXIgd29yZHMsCisgIC8vIG5lc3RlZCBtZXNz
YWdlcyBhcmUgZmluYWxpemVkIGFuZCBzZWFsZWQgd2hlbiBhbnkgb3RoZXIgZmllbGQgaXMgc2V0
IGluIHRoZQorICAvLyBwYXJlbnQgbWVzc2FnZSAob3IgdGhlIHBhcmVudCBtZXNzYWdlIGl0c2Vs
ZiBpcyBmaW5hbGl6ZWQpIGFuZCBjYW5ub3QgYmUKKyAgLy8gYWNjZXNzZWQgYW55bW9yZSBhZnRl
cndhcmRzLgorICAvLyBUT0RPKHByaW1pYW5vKTogb3B0aW1pemF0aW9uOiBJIHRoaW5rIHRoYXQg
bmVzdGVkX21lc3NhZ2VfLCB3aGVuIG5vbi1udWxsLgorICAvLyB3aWxsIGFsd2F5cyBiZSBAICh0
aGlzKSArIG9mZnNldG9mKG5lc3RlZF9tZXNzYWdlc19hcmVuYV8pLgorICBNZXNzYWdlKiBuZXN0
ZWRfbWVzc2FnZV87CisKKyAgLy8gVGhlIHJvb3QgbWVzc2FnZSBvd25zIHRoZSBzdG9yYWdlIGZv
ciBhbGwgaXRzIG5lc3RlZCBtZXNzYWdlcywgdXAgdG8gYSBtYXgKKyAgLy8gb2Yga01heE5lc3Rp
bmdEZXB0aCBsZXZlbHMgKHNlZSB0aGUgLmNjIGZpbGUpLiBOb3RlIHRoYXQgdGhlIGJvdW5kYXJp
ZXMgb2YKKyAgLy8gdGhlIGFyZW5hIGFyZSBtZWFuaW5nZnVsIG9ubHkgZm9yIHRoZSByb290IG1l
c3NhZ2UuCisgIC8vIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHB1dCB0aGUgc2l6ZW9mKCkgbWF0
aCBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IHNpemVvZgorICAvLyB0aGUgY3VycmVudCBjbGFzcyBp
biBhIGhlYWRlci4gSG93ZXZlciB0aGUgLmNjIGZpbGUgaGFzIGEgc3RhdGljX2Fzc2VydAorICAv
LyB0aGF0IGd1YXJhbnRlZXMgdGhhdCAoc2VlIHRoZSBSZXNldCgpIG1ldGhvZCBpbiB0aGUgLmNj
IGZpbGUpLgorICBhbGlnbmFzKHNpemVvZih2b2lkKikpIHVpbnQ4X3QgbmVzdGVkX21lc3NhZ2Vz
X2FyZW5hX1s1MTJdOworCisgIC8vIERPIE5PVCBhZGQgYW55IGZpZWxkcyBiZWxvdyB8bmVzdGVk
X21lc3NhZ2VzX2FyZW5hX3wuIFRoZSBtZW1vcnkgbGF5b3V0IG9mCisgIC8vIG5lc3RlZCBtZXNz
YWdlcyB3b3VsZCBvdmVyZmxvdyB0aGUgc3RvcmFnZSBhbGxvY2F0ZWQgYnkgdGhlIHJvb3QgbWVz
c2FnZS4KK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlmICAvLyBJTkNM
VURFX1BFUkZFVFRPX1BST1RPWkVST19NRVNTQUdFX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlX2hhbmRsZS5oCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19NRVNTQUdFX0hBTkRM
RV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19NRVNTQUdFX0hBTkRMRV9I
XworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisKK25hbWVz
cGFjZSBwcm90b3plcm8geworCitjbGFzcyBNZXNzYWdlOworCisvLyBNZXNzYWdlSGFuZGxlIGFs
bG93cyB0byBkZWNvdXBsZSB0aGUgbGlmZXRpbWUgb2YgYSBwcm90byBtZXNzYWdlCisvLyBmcm9t
IHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UuIEl0IGdpdmVzIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVl
czoKKy8vIC0gVGhlIHVuZGVybHlpbmcgbWVzc2FnZSBpcyBmaW5hbGl6ZWQgKGlmIHN0aWxsIGFs
aXZlKSBpZiB0aGUgaGFuZGxlIGdvZXMKKy8vICAgb3V0IG9mIHNjb3BlLgorLy8gLSBJbiBEZWJ1
ZyAvIERDSEVDS19BTFdBWVNfT04gYnVpbGRzLCB0aGUgaGFuZGxlIGJlY29tZXMgbnVsbCBvbmNl
IHRoZQorLy8gICBtZXNzYWdlIGlzIGZpbmFsaXplZC4gVGhpcyBpcyB0byBlbmZvcmNlIHRoZSBh
cHBlbmQtb25seSBBUEkuIEZvciBpbnN0YW5jZQorLy8gICB3aGVuIGFkZGluZyB0d28gcmVwZWF0
ZWQgbWVzc2FnZXMsIHRoZSBhZGRpdGlvbiBvZiB0aGUgMm5kIG9uZSBmb3JjZXMKKy8vICAgdGhl
IGZpbmFsaXphdGlvbiBvZiB0aGUgZmlyc3QuCisvLyBUaGluayBhYm91dCB0aGlzIGFzIGEgV2Vh
a1B0cjxNZXNzYWdlPiB3aGljaCBjYWxscworLy8gTWVzc2FnZTo6RmluYWxpemUoKSB3aGVuIGdv
aW5nIG91dCBvZiBzY29wZS4KKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIE1lc3NhZ2VIYW5kbGVC
YXNlIHsKKyBwdWJsaWM6CisgIH5NZXNzYWdlSGFuZGxlQmFzZSgpOworCisgIC8vIE1vdmUtb25s
eSB0eXBlLgorICBNZXNzYWdlSGFuZGxlQmFzZShNZXNzYWdlSGFuZGxlQmFzZSYmKSBub2V4Y2Vw
dDsKKyAgTWVzc2FnZUhhbmRsZUJhc2UmIG9wZXJhdG9yPShNZXNzYWdlSGFuZGxlQmFzZSYmKTsK
KyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyNpZiBQRVJGRVRUT19EQ0hFQ0tf
SVNfT04oKQorICAgIFBFUkZFVFRPX0RDSEVDSyghbWVzc2FnZV8gfHwgZ2VuZXJhdGlvbl8gPT0g
bWVzc2FnZV8tPmdlbmVyYXRpb25fKTsKKyNlbmRpZgorICAgIHJldHVybiAhIW1lc3NhZ2VfOwor
ICB9CisKKyBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1lc3NhZ2VIYW5kbGVCYXNlKE1lc3NhZ2Uq
ID0gbnVsbHB0cik7CisgIE1lc3NhZ2UqIG9wZXJhdG9yLT4oKSBjb25zdCB7CisjaWYgUEVSRkVU
VE9fRENIRUNLX0lTX09OKCkKKyAgICBQRVJGRVRUT19EQ0hFQ0soIW1lc3NhZ2VfIHx8IGdlbmVy
YXRpb25fID09IG1lc3NhZ2VfLT5nZW5lcmF0aW9uXyk7CisjZW5kaWYKKyAgICByZXR1cm4gbWVz
c2FnZV87CisgIH0KKyAgTWVzc2FnZSYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKihvcGVy
YXRvci0+KCkpOyB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTWVzc2FnZTsKKyAgTWVz
c2FnZUhhbmRsZUJhc2UoY29uc3QgTWVzc2FnZUhhbmRsZUJhc2UmKSA9IGRlbGV0ZTsKKyAgTWVz
c2FnZUhhbmRsZUJhc2UmIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlSGFuZGxlQmFzZSYpID0gZGVs
ZXRlOworCisgIHZvaWQgcmVzZXRfbWVzc2FnZSgpIHsKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBi
eSBNZXNzYWdlOjpGaW5hbGl6ZSgpLgorICAgIFBFUkZFVFRPX0RDSEVDSyhtZXNzYWdlXy0+aXNf
ZmluYWxpemVkKCkpOworICAgIG1lc3NhZ2VfID0gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgTW92
ZShNZXNzYWdlSGFuZGxlQmFzZSYmKTsKKworICB2b2lkIEZpbmFsaXplTWVzc2FnZSgpIHsgbWVz
c2FnZV8tPkZpbmFsaXplKCk7IH0KKworICBNZXNzYWdlKiBtZXNzYWdlXzsKKyNpZiBQRVJGRVRU
T19EQ0hFQ0tfSVNfT04oKQorICB1aW50MzJfdCBnZW5lcmF0aW9uXzsKKyNlbmRpZgorfTsKKwor
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBNZXNzYWdlSGFuZGxlIDogcHVibGljIE1lc3Nh
Z2VIYW5kbGVCYXNlIHsKKyBwdWJsaWM6CisgIE1lc3NhZ2VIYW5kbGUoKSA6IE1lc3NhZ2VIYW5k
bGUobnVsbHB0cikge30KKyAgZXhwbGljaXQgTWVzc2FnZUhhbmRsZShUKiBtZXNzYWdlKSA6IE1l
c3NhZ2VIYW5kbGVCYXNlKG1lc3NhZ2UpIHt9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgp
IGNvbnN0IHsgcmV0dXJuIE1lc3NhZ2VIYW5kbGVCYXNlOjpvcGVyYXRvciBib29sKCk7IH0KKwor
ICBUJiBvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQmPihNZXNz
YWdlSGFuZGxlQmFzZTo6b3BlcmF0b3IqKCkpOworICB9CisKKyAgVCogb3BlcmF0b3ItPigpIGNv
bnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KE1lc3NhZ2VIYW5kbGVCYXNlOjpvcGVy
YXRvci0+KCkpOworICB9CisKKyAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8
VCo+KE1lc3NhZ2VIYW5kbGVCYXNlOjpvcGVyYXRvci0+KCkpOyB9Cit9OworCit9ICAvLyBuYW1l
c3BhY2UgcHJvdG96ZXJvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9f
TUVTU0FHRV9IQU5ETEVfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQg
T3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGlj
ZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRo
aXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1h
eSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3
LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQg
YnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBk
aXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMi
IEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQs
IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBz
cGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9u
cyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorCisjaW5jbHVkZSA8YXRv
bWljPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlX2hhbmRsZS5o
IgorCisjaWYgX19CWVRFX09SREVSX18gIT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKy8vIFRo
ZSBtZW1jcHkoKSBmb3IgZmxvYXQgYW5kIGRvdWJsZSBiZWxvdyBuZWVkcyB0byBiZSBhZGp1c3Rl
ZCBpZiB3ZSB3YW50IHRvCisvLyBzdXBwb3J0IGJpZyBlbmRpYW4gQ1BVcy4gVGhlcmUgZG9lc24n
dCBzZWVtIHRvIGJlIGEgY29tcGVsbGluZyBuZWVkIHRvZGF5LgorI2Vycm9yIFVuaW1wbGVtZW50
ZWQgZm9yIGJpZyBlbmRpYW4gYXJjaHMuCisjZW5kaWYKKworbmFtZXNwYWNlIHByb3RvemVybyB7
CisKK25hbWVzcGFjZSB7CisKKyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorc3RkOjphdG9t
aWM8dWludDMyX3Q+IGdfZ2VuZXJhdGlvbjsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKKwor
Ly8gc3RhdGljCitjb25zdGV4cHIgdWludDMyX3QgTWVzc2FnZTo6a01heE5lc3RpbmdEZXB0aDsK
KworLy8gRG8gTk9UIHB1dCBhbnkgY29kZSBpbiB0aGUgY29uc3RydWN0b3Igb3IgdXNlIGRlZmF1
bHQgaW5pdGlhbGl6YXRpb24uCisvLyBVc2UgdGhlIFJlc2V0KCkgbWV0aG9kIGJlbG93IGluc3Rl
YWQuIFNlZSB0aGUgaGVhZGVyIGZvciB0aGUgcmVhc29uIHdoeS4KKworLy8gVGhpcyBtZXRob2Qg
aXMgY2FsbGVkIHRvIGluaXRpYWxpemUgYm90aCByb290IGFuZCBuZXN0ZWQgbWVzc2FnZXMuCit2
b2lkIE1lc3NhZ2U6OlJlc2V0KFNjYXR0ZXJlZFN0cmVhbVdyaXRlciogc3RyZWFtX3dyaXRlcikg
eworLy8gT2xkZXIgdmVyc2lvbnMgb2YgbGlic3RkY3h4IGRvbid0IGhhdmUgaXNfdHJpdmlhbGx5
X2NvbnN0cnVjdGlibGUuCisjaWYgIWRlZmluZWQoX19HTElCQ1hYX18pIHx8IF9fR0xJQkNYWF9f
ID49IDIwMTcwNTE2CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29uc3RydWN0
aWJsZTxNZXNzYWdlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIk1lc3NhZ2UgbXVzdCBiZSB0
cml2aWFsbHkgY29uc3RydWN0aWJsZSIpOworI2VuZGlmCisKKyAgc3RhdGljX2Fzc2VydChzdGQ6
OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8TWVzc2FnZT46OnZhbHVlLAorICAgICAgICAgICAg
ICAgICJNZXNzYWdlIG11c3QgYmUgdHJpdmlhbGx5IGRlc3RydWN0aWJsZSIpOworCisgIHN0YXRp
Y19hc3NlcnQoCisgICAgICBzaXplb2YoTWVzc2FnZTo6bmVzdGVkX21lc3NhZ2VzX2FyZW5hXykg
Pj0KKyAgICAgICAgICBrTWF4TmVzdGluZ0RlcHRoICoKKyAgICAgICAgICAgICAgKHNpemVvZihN
ZXNzYWdlKSAtIHNpemVvZihNZXNzYWdlOjpuZXN0ZWRfbWVzc2FnZXNfYXJlbmFfKSksCisgICAg
ICAiTWVzc2FnZTo6bmVzdGVkX21lc3NhZ2VzX2FyZW5hXyBpcyB0b28gc21hbGwiKTsKKworICBz
dHJlYW1fd3JpdGVyXyA9IHN0cmVhbV93cml0ZXI7CisgIHNpemVfID0gMDsKKyAgc2l6ZV9maWVs
ZF8gPSBudWxscHRyOworICBzaXplX2FscmVhZHlfd3JpdHRlbl8gPSAwOworICBuZXN0ZWRfbWVz
c2FnZV8gPSBudWxscHRyOworICBuZXN0aW5nX2RlcHRoXyA9IDA7CisgIGZpbmFsaXplZF8gPSBm
YWxzZTsKKyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICBoYW5kbGVfID0gbnVsbHB0cjsK
KyAgZ2VuZXJhdGlvbl8gPSBnX2dlbmVyYXRpb24uZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29y
ZGVyX3JlbGF4ZWQpOworI2VuZGlmCit9CisKK3ZvaWQgTWVzc2FnZTo6QXBwZW5kU3RyaW5nKHVp
bnQzMl90IGZpZWxkX2lkLCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgQXBwZW5kQnl0ZXMoZmllbGRf
aWQsIHN0ciwgc3RybGVuKHN0cikpOworfQorCit2b2lkIE1lc3NhZ2U6OkFwcGVuZEJ5dGVzKHVp
bnQzMl90IGZpZWxkX2lkLCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBzaXplKSB7CisgIGlmIChu
ZXN0ZWRfbWVzc2FnZV8pCisgICAgRW5kTmVzdGVkTWVzc2FnZSgpOworCisgIFBFUkZFVFRPX0RD
SEVDSyhzaXplIDwgcHJvdG9fdXRpbHM6OmtNYXhNZXNzYWdlTGVuZ3RoKTsKKyAgLy8gV3JpdGUg
dGhlIHByb3RvIHByZWFtYmxlIChmaWVsZCBpZCwgdHlwZSBhbmQgbGVuZ3RoIG9mIHRoZSBmaWVs
ZCkuCisgIHVpbnQ4X3QgYnVmZmVyW3Byb3RvX3V0aWxzOjprTWF4U2ltcGxlRmllbGRFbmNvZGVk
U2l6ZV07CisgIHVpbnQ4X3QqIHBvcyA9IGJ1ZmZlcjsKKyAgcG9zID0gcHJvdG9fdXRpbHM6Oldy
aXRlVmFySW50KHByb3RvX3V0aWxzOjpNYWtlVGFnTGVuZ3RoRGVsaW1pdGVkKGZpZWxkX2lkKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyk7CisgIHBvcyA9IHByb3RvX3V0
aWxzOjpXcml0ZVZhckludChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSksIHBvcyk7CisgIFdy
aXRlVG9TdHJlYW0oYnVmZmVyLCBwb3MpOworCisgIGNvbnN0IHVpbnQ4X3QqIHNyY191OCA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyYyk7CisgIFdyaXRlVG9TdHJlYW0oc3Jj
X3U4LCBzcmNfdTggKyBzaXplKTsKK30KKworc2l6ZV90IE1lc3NhZ2U6OkFwcGVuZFNjYXR0ZXJl
ZEJ5dGVzKHVpbnQzMl90IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIENvbnRpZ3VvdXNNZW1vcnlSYW5nZSogcmFuZ2VzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fcmFuZ2VzKSB7CisgIHNpemVfdCBzaXplID0g
MDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fcmFuZ2VzOyArK2kpIHsKKyAgICBzaXpl
ICs9IHJhbmdlc1tpXS5zaXplKCk7CisgIH0KKworICBQRVJGRVRUT19EQ0hFQ0soc2l6ZSA8IHBy
b3RvX3V0aWxzOjprTWF4TWVzc2FnZUxlbmd0aCk7CisKKyAgdWludDhfdCBidWZmZXJbcHJvdG9f
dXRpbHM6OmtNYXhTaW1wbGVGaWVsZEVuY29kZWRTaXplXTsKKyAgdWludDhfdCogcG9zID0gYnVm
ZmVyOworICBwb3MgPSBwcm90b191dGlsczo6V3JpdGVWYXJJbnQocHJvdG9fdXRpbHM6Ok1ha2VU
YWdMZW5ndGhEZWxpbWl0ZWQoZmllbGRfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcG9zKTsKKyAgcG9zID0gcHJvdG9fdXRpbHM6OldyaXRlVmFySW50KHN0YXRpY19jYXN0
PHVpbnQzMl90PihzaXplKSwgcG9zKTsKKyAgV3JpdGVUb1N0cmVhbShidWZmZXIsIHBvcyk7CisK
KyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fcmFuZ2VzOyArK2kpIHsKKyAgICBhdXRvJiBy
YW5nZSA9IHJhbmdlc1tpXTsKKyAgICBXcml0ZVRvU3RyZWFtKHJhbmdlLmJlZ2luLCByYW5nZS5l
bmQpOworICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IE1lc3NhZ2U6OkZpbmFs
aXplKCkgeworICBpZiAoZmluYWxpemVkXykKKyAgICByZXR1cm4gc2l6ZV87CisKKyAgaWYgKG5l
c3RlZF9tZXNzYWdlXykKKyAgICBFbmROZXN0ZWRNZXNzYWdlKCk7CisKKyAgLy8gV3JpdGUgdGhl
IGxlbmd0aCBvZiB0aGUgbmVzdGVkIG1lc3NhZ2UgYSBwb3N0ZXJpb3JpLCB1c2luZyBhIGxlYWRp
bmctemVybworICAvLyByZWR1bmRhbnQgdmFyaW50IGVuY29kaW5nLgorICBpZiAoc2l6ZV9maWVs
ZF8pIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIWZpbmFsaXplZF8pOworICAgIFBFUkZFVFRPX0RD
SEVDSyhzaXplXyA8IHByb3RvX3V0aWxzOjprTWF4TWVzc2FnZUxlbmd0aCk7CisgICAgUEVSRkVU
VE9fRENIRUNLKHNpemVfID49IHNpemVfYWxyZWFkeV93cml0dGVuXyk7CisgICAgcHJvdG9fdXRp
bHM6OldyaXRlUmVkdW5kYW50VmFySW50KHNpemVfIC0gc2l6ZV9hbHJlYWR5X3dyaXR0ZW5fLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2ZpZWxkXyk7CisgICAg
c2l6ZV9maWVsZF8gPSBudWxscHRyOworICB9CisKKyAgZmluYWxpemVkXyA9IHRydWU7CisjaWYg
UEVSRkVUVE9fRENIRUNLX0lTX09OKCkKKyAgaWYgKGhhbmRsZV8pCisgICAgaGFuZGxlXy0+cmVz
ZXRfbWVzc2FnZSgpOworI2VuZGlmCisKKyAgcmV0dXJuIHNpemVfOworfQorCit2b2lkIE1lc3Nh
Z2U6OkJlZ2luTmVzdGVkTWVzc2FnZUludGVybmFsKHVpbnQzMl90IGZpZWxkX2lkLCBNZXNzYWdl
KiBtZXNzYWdlKSB7CisgIGlmIChuZXN0ZWRfbWVzc2FnZV8pCisgICAgRW5kTmVzdGVkTWVzc2Fn
ZSgpOworCisgIC8vIFdyaXRlIHRoZSBwcm90byBwcmVhbWJsZSBmb3IgdGhlIG5lc3RlZCBtZXNz
YWdlLgorICB1aW50OF90IGRhdGFbcHJvdG9fdXRpbHM6OmtNYXhUYWdFbmNvZGVkU2l6ZV07Cisg
IHVpbnQ4X3QqIGRhdGFfZW5kID0gcHJvdG9fdXRpbHM6OldyaXRlVmFySW50KAorICAgICAgcHJv
dG9fdXRpbHM6Ok1ha2VUYWdMZW5ndGhEZWxpbWl0ZWQoZmllbGRfaWQpLCBkYXRhKTsKKyAgV3Jp
dGVUb1N0cmVhbShkYXRhLCBkYXRhX2VuZCk7CisKKyAgbWVzc2FnZS0+UmVzZXQoc3RyZWFtX3dy
aXRlcl8pOworICBQRVJGRVRUT19DSEVDSyhuZXN0aW5nX2RlcHRoXyA8IGtNYXhOZXN0aW5nRGVw
dGgpOworICBtZXNzYWdlLT5uZXN0aW5nX2RlcHRoXyA9IG5lc3RpbmdfZGVwdGhfICsgMTsKKwor
ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBuZXN0ZWQgbWVzc2FnZSBjYW5ub3QgYmUga25vd24gdXBm
cm9udC4gU28gcmlnaHQgbm93CisgIC8vIGp1c3QgcmVzZXJ2ZSB0aGUgYnl0ZXMgdG8gZW5jb2Rl
IHRoZSBzaXplIGFmdGVyIHRoZSBuZXN0ZWQgbWVzc2FnZSBpcyBkb25lLgorICBtZXNzYWdlLT5z
ZXRfc2l6ZV9maWVsZCgKKyAgICAgIHN0cmVhbV93cml0ZXJfLT5SZXNlcnZlQnl0ZXMocHJvdG9f
dXRpbHM6OmtNZXNzYWdlTGVuZ3RoRmllbGRTaXplKSk7CisgIHNpemVfICs9IHByb3RvX3V0aWxz
OjprTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZTsKKyAgbmVzdGVkX21lc3NhZ2VfID0gbWVzc2FnZTsK
K30KKwordm9pZCBNZXNzYWdlOjpFbmROZXN0ZWRNZXNzYWdlKCkgeworICBzaXplXyArPSBuZXN0
ZWRfbWVzc2FnZV8tPkZpbmFsaXplKCk7CisgIG5lc3RlZF9tZXNzYWdlXyA9IG51bGxwdHI7Cit9
CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBz
b3VyY2U6IHNyYy9wcm90b3plcm8vbWVzc2FnZV9oYW5kbGUuY2MKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2Vk
IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwor
ICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo
ZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cisg
KgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAq
CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdy
aXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0
cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENP
TkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUg
dGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lv
bnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2Fn
ZV9oYW5kbGUuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisKK25hbWVz
cGFjZSBwcm90b3plcm8geworCitNZXNzYWdlSGFuZGxlQmFzZTo6TWVzc2FnZUhhbmRsZUJhc2Uo
TWVzc2FnZSogbWVzc2FnZSkgOiBtZXNzYWdlXyhtZXNzYWdlKSB7CisjaWYgUEVSRkVUVE9fRENI
RUNLX0lTX09OKCkKKyAgZ2VuZXJhdGlvbl8gPSBtZXNzYWdlXyA/IG1lc3NhZ2UtPmdlbmVyYXRp
b25fIDogMDsKKyAgaWYgKG1lc3NhZ2VfKQorICAgIG1lc3NhZ2VfLT5zZXRfaGFuZGxlKHRoaXMp
OworI2VuZGlmCit9CisKK01lc3NhZ2VIYW5kbGVCYXNlOjp+TWVzc2FnZUhhbmRsZUJhc2UoKSB7
CisgIGlmIChtZXNzYWdlXykgeworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgICAgUEVS
RkVUVE9fRENIRUNLKGdlbmVyYXRpb25fID09IG1lc3NhZ2VfLT5nZW5lcmF0aW9uXyk7CisjZW5k
aWYKKyAgICBGaW5hbGl6ZU1lc3NhZ2UoKTsKKyAgfQorfQorCitNZXNzYWdlSGFuZGxlQmFzZTo6
TWVzc2FnZUhhbmRsZUJhc2UoTWVzc2FnZUhhbmRsZUJhc2UmJiBvdGhlcikgbm9leGNlcHQgewor
ICBNb3ZlKHN0ZDo6bW92ZShvdGhlcikpOworfQorCitNZXNzYWdlSGFuZGxlQmFzZSYgTWVzc2Fn
ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShNZXNzYWdlSGFuZGxlQmFzZSYmIG90aGVyKSB7CisgIC8v
IElmIHRoZSBjdXJyZW50IGhhbmRsZSB3YXMgcG9pbnRpbmcgdG8gYSBtZXNzYWdlIGFuZCBpcyBi
ZWluZyByZXNldCB0byBhIG5ldworICAvLyBvbmUsIGZpbmFsaXplIHRoZSBvbGQgbWVzc2FnZS4g
SG93ZXZlciwgaWYgdGhlIG90aGVyIG1lc3NhZ2UgaXMgdGhlIHNhbWUgYXMKKyAgLy8gdGhlIG9u
ZSB3ZSBwb2ludCB0bywgZG9uJ3QgZmluYWxpemUuCisgIGlmIChtZXNzYWdlXyAmJiBtZXNzYWdl
XyAhPSBvdGhlci5tZXNzYWdlXykKKyAgICBGaW5hbGl6ZU1lc3NhZ2UoKTsKKyAgTW92ZShzdGQ6
Om1vdmUob3RoZXIpKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIE1lc3NhZ2VIYW5kbGVC
YXNlOjpNb3ZlKE1lc3NhZ2VIYW5kbGVCYXNlJiYgb3RoZXIpIHsKKyAgbWVzc2FnZV8gPSBvdGhl
ci5tZXNzYWdlXzsKKyAgb3RoZXIubWVzc2FnZV8gPSBudWxscHRyOworI2lmIFBFUkZFVFRPX0RD
SEVDS19JU19PTigpCisgIGlmIChtZXNzYWdlXykgeworICAgIGdlbmVyYXRpb25fID0gbWVzc2Fn
ZV8tPmdlbmVyYXRpb25fOworICAgIG1lc3NhZ2VfLT5zZXRfaGFuZGxlKHRoaXMpOworICB9Cisj
ZW5kaWYKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIHNvdXJjZTogc3JjL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmNjCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3RvemVy
by9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhl
IEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBB
cGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBu
b3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgor
ICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBo
dHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3Mg
cmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3
YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBh
biAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0Yg
QU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2Ug
Zm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBs
aW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVS
RkVUVE9fUFJPVE9aRVJPX1BBQ0tFRF9SRVBFQVRFRF9GSUVMRFNfSF8KKyNkZWZpbmUgSU5DTFVE
RV9QRVJGRVRUT19QUk9UT1pFUk9fUEFDS0VEX1JFUEVBVEVEX0ZJRUxEU19IXworCisjaW5jbHVk
ZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5j
bHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFj
ZSBwcm90b3plcm8geworCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3NlcyB1c2VkIHdoZW4g
ZW5jb2RpbmcgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KKy8vIFRvIGVuY29kZSBzdWNoIGEgZmll
bGQsIHRoZSBjYWxsZXIgaXMgZmlyc3QgZXhwZWN0ZWQgdG8gYWNjdW11bGF0ZSBhbGwgb2YgdGhl
CisvLyB2YWx1ZXMgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgKGRlcGVuZGluZyBvbiB0
aGUgd2lyZSB0eXBlIG9mIHRoZQorLy8gaW5kaXZpZHVhbCBlbGVtZW50cyksIGRlZmluZWQgYmVs
b3c6CisvLyAqIHByb3RvemVybzo6UGFja2VkVmFySW50CisvLyAqIHByb3RvemVybzo6UGFja2Vk
Rml4ZWRTaXplSW50PC8qZWxlbWVudF90eXBlPSovIHVpbnQzMl90PgorLy8gVGhlbiB0aGF0IGJ1
ZmZlciBpcyBwYXNzZWQgdG8gdGhlIHByb3RvemVyby1nZW5lcmF0ZWQgc2V0dGVycyBhcyBhbiBh
cmd1bWVudC4KKy8vIEFmdGVyIGNhbGxpbmcgdGhlIHNldHRlciwgdGhlIGJ1ZmZlciBjYW4gYmUg
ZGVzdHJveWVkLgorLy8KKy8vIEFuIGV4YW1wbGUgb2YgZW5jb2RpbmcgYSBwYWNrZWQgZmllbGQ6
CisvLyAgIHByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPHByb3RvemVybzo6TWVzc2FnZT4gbXNnOwor
Ly8gICBwcm90b3plcm86OlBhY2tlZFZhckludCBidWY7CisvLyAgIGJ1Zi5BcHBlbmQoNDIpOwor
Ly8gICBidWYuQXBwZW5kKC0xKTsKKy8vICAgbXNnLT5zZXRfZmllbGRuYW1lKGJ1Zik7CisvLyAg
IG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworCitjbGFzcyBQYWNrZWRCdWZmZXJCYXNlIHsKKyBw
dWJsaWM6CisgIFBhY2tlZEJ1ZmZlckJhc2UoKSB7IFJlc2V0KCk7IH0KKworICAvLyBDb3B5IG9y
IG1vdmUgaXMgZGlzYWJsZWQgZHVlIHRvIHBvaW50ZXJzIHRvIHN0YWNrIGFkZHJlc3Nlcy4KKyAg
UGFja2VkQnVmZmVyQmFzZShjb25zdCBQYWNrZWRCdWZmZXJCYXNlJikgPSBkZWxldGU7CisgIFBh
Y2tlZEJ1ZmZlckJhc2UoUGFja2VkQnVmZmVyQmFzZSYmKSA9IGRlbGV0ZTsKKyAgUGFja2VkQnVm
ZmVyQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFBhY2tlZEJ1ZmZlckJhc2UmKSA9IGRlbGV0ZTsKKyAg
UGFja2VkQnVmZmVyQmFzZSYgb3BlcmF0b3I9KFBhY2tlZEJ1ZmZlckJhc2UmJikgPSBkZWxldGU7
CisKKyAgdm9pZCBSZXNldCgpOworCisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCB7IHJl
dHVybiBzdG9yYWdlX2JlZ2luXzsgfQorCisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHdyaXRlX3B0cl8gLSBzdG9yYWdlX2JlZ2luXyk7Cisg
IH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBHcm93SWZOZWVkZWQoKSB7CisgICAgUEVSRkVUVE9f
RENIRUNLKHdyaXRlX3B0cl8gPj0gc3RvcmFnZV9iZWdpbl8gJiYgd3JpdGVfcHRyXyA8PSBzdG9y
YWdlX2VuZF8pOworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWSh3cml0ZV9wdHJfICsga01heEVs
ZW1lbnRTaXplID4gc3RvcmFnZV9lbmRfKSkgeworICAgICAgR3Jvd1Nsb3dwYXRoKCk7CisgICAg
fQorICB9CisKKyAgdm9pZCBHcm93U2xvd3BhdGgoKTsKKworICAvLyBtYXgodWludDY0X3QgdmFy
aW50IGVuY29kaW5nLCBiaWdnZXN0IGZpeGVkIHR5cGUgKHVpbnQ2NCkpLgorICBzdGF0aWMgY29u
c3RleHByIHNpemVfdCBrTWF4RWxlbWVudFNpemUgPSAxMDsKKworICAvLyBTbyBzaXplb2YodGhp
cykgPT0gOGsuCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtPblN0YWNrU3RvcmFnZVNpemUg
PSA4MTkyIC0gMzI7CisKKyAgdWludDhfdCogc3RvcmFnZV9iZWdpbl87CisgIHVpbnQ4X3QqIHN0
b3JhZ2VfZW5kXzsKKyAgdWludDhfdCogd3JpdGVfcHRyXzsKKyAgc3RkOjp1bmlxdWVfcHRyPHVp
bnQ4X3RbXT4gaGVhcF9idWZfOworICBhbGlnbmFzKHVpbnQ2NF90KSB1aW50OF90IHN0YWNrX2J1
Zl9ba09uU3RhY2tTdG9yYWdlU2l6ZV07Cit9OworCitjbGFzcyBQYWNrZWRWYXJJbnQgOiBwdWJs
aWMgUGFja2VkQnVmZmVyQmFzZSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4K
KyAgdm9pZCBBcHBlbmQoVCB2YWx1ZSkgeworICAgIEdyb3dJZk5lZWRlZCgpOworICAgIHdyaXRl
X3B0cl8gPSBwcm90b191dGlsczo6V3JpdGVWYXJJbnQodmFsdWUsIHdyaXRlX3B0cl8pOworICB9
Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCAvKiBlLmcuIHVpbnQzMl90IGZvciBGaXhlZDMy
ICovPgorY2xhc3MgUGFja2VkRml4ZWRTaXplSW50IDogcHVibGljIFBhY2tlZEJ1ZmZlckJhc2Ug
eworIHB1YmxpYzoKKyAgdm9pZCBBcHBlbmQoVCB2YWx1ZSkgeworICAgIHN0YXRpY19hc3NlcnQo
c2l6ZW9mKFQpID09IDQgfHwgc2l6ZW9mKFQpID09IDgsCisgICAgICAgICAgICAgICAgICAiUGFj
a2VkRml4ZWRTaXplSW50IHNob3VsZCBiZSB1c2VkIG9ubHkgd2l0aCAzMi82NC1iaXQgaW50cyIp
OworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpIDw9IGtNYXhFbGVtZW50U2l6ZSwKKyAgICAg
ICAgICAgICAgICAgICJrTWF4RWxlbWVudFNpemUgbmVlZHMgdG8gYmUgdXBkYXRlZCIpOworICAg
IEdyb3dJZk5lZWRlZCgpOworICAgIFBFUkZFVFRPX0RDSEVDSyhyZWludGVycHJldF9jYXN0PHNp
emVfdD4od3JpdGVfcHRyXykgJSBhbGlnbm9mKFQpID09IDApOworICAgIG1lbWNweShyZWludGVy
cHJldF9jYXN0PFQqPih3cml0ZV9wdHJfKSwgJnZhbHVlLCBzaXplb2YoVCkpOworICAgIHdyaXRl
X3B0cl8gKz0gc2l6ZW9mKFQpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJv
CisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEU19IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNv
dXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBW
ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxl
IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFp
biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hl
Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBs
aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs
CisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy
IGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj
IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVy
IHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3V0aWxz
LmgiCisKK25hbWVzcGFjZSBwcm90b3plcm8geworCisvLyBzdGF0aWMKK2NvbnN0ZXhwciBzaXpl
X3QgUGFja2VkQnVmZmVyQmFzZTo6a09uU3RhY2tTdG9yYWdlU2l6ZTsKKwordm9pZCBQYWNrZWRC
dWZmZXJCYXNlOjpHcm93U2xvd3BhdGgoKSB7CisgIHNpemVfdCB3cml0ZV9vZmYgPSBzdGF0aWNf
Y2FzdDxzaXplX3Q+KHdyaXRlX3B0cl8gLSBzdG9yYWdlX2JlZ2luXyk7CisgIHNpemVfdCBvbGRf
c2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oc3RvcmFnZV9lbmRfIC0gc3RvcmFnZV9iZWdpbl8p
OworICBzaXplX3QgbmV3X3NpemUgPSBvbGRfc2l6ZSA8IDY1NTM2ID8gKG9sZF9zaXplICogMikg
OiAob2xkX3NpemUgKiAzIC8gMik7CisgIG5ld19zaXplID0gcGVyZmV0dG86OmJhc2U6OkFsaWdu
VXA8NDA5Nj4obmV3X3NpemUpOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBuZXdfYnVm
KG5ldyB1aW50OF90W25ld19zaXplXSk7CisgIG1lbWNweShuZXdfYnVmLmdldCgpLCBzdG9yYWdl
X2JlZ2luXywgb2xkX3NpemUpOworICBoZWFwX2J1Zl8gPSBzdGQ6Om1vdmUobmV3X2J1Zik7Cisg
IHN0b3JhZ2VfYmVnaW5fID0gaGVhcF9idWZfLmdldCgpOworICBzdG9yYWdlX2VuZF8gPSBzdG9y
YWdlX2JlZ2luXyArIG5ld19zaXplOworICB3cml0ZV9wdHJfID0gc3RvcmFnZV9iZWdpbl8gKyB3
cml0ZV9vZmY7Cit9CisKK3ZvaWQgUGFja2VkQnVmZmVyQmFzZTo6UmVzZXQoKSB7CisgIGhlYXBf
YnVmXy5yZXNldCgpOworICBzdG9yYWdlX2JlZ2luXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhf
dCo+KCZzdGFja19idWZfWzBdKTsKKyAgc3RvcmFnZV9lbmRfID0gcmVpbnRlcnByZXRfY2FzdDx1
aW50OF90Kj4oJnN0YWNrX2J1Zl9ba09uU3RhY2tTdG9yYWdlU2l6ZV0pOworICB3cml0ZV9wdHJf
ID0gc3RvcmFnZV9iZWdpbl87Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5j
YworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fZGVjb2Rlci5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRy
b2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hl
IExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDov
L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVp
cmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQor
ICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFT
IElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0
aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRh
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRP
X1BST1RPWkVST19QUk9UT19ERUNPREVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fUFJP
VE9aRVJPX1BST1RPX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUg
PGFycmF5PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvY29tcGlsZXIuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9n
Z2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL2ZpZWxkLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHByb3RvemVy
byB7CisKKy8vIEEgZ2VuZXJpYyBwcm90b2J1ZiBkZWNvZGVyLiBEb2Vzbid0IHJlcXVpcmUgYW55
IGtub3dsZWRnZSBhYm91dCB0aGUgcHJvdG8KKy8vIHNjaGVtYS4gSXQgdG9rZW5pemVzIGZpZWxk
cywgcmV0cmlldmVzIHRoZWlyIElEIGFuZCB0eXBlIGFuZCBleHBvc2VzCisvLyBhY2Nlc3NvcnMg
dG8gcmV0cmlldmUgaXRzIHZhbHVlcy4KKy8vIEl0IGRvZXMgTk9UIHJlY3Vyc2UgaW4gbmVzdGVk
IHN1Ym1lc3NhZ2VzLCBpbnN0ZWFkIGl0IGp1c3QgY29tcHV0ZXMgdGhlaXIKKy8vIGJvdW5kYXJp
ZXMsIHJlY3Vyc2lvbiBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuCisvLyBUaGlzIGNsYXNzIGlzIGRl
c2lnbmVkIHRvIGJlIHVzZWQgaW4gcGVyZi1zZW5zaXRpdmUgY29udGV4dHMuIEl0IGRvZXMgbm90
CisvLyBhbGxvY2F0ZSBhbmQgZG9lcyBub3QgcGVyZm9ybSBhbnkgcHJvdG8gc2VtYW50aWMgY2hl
Y2tzIChlLmcuIHJlcGVhdGVkIC8KKy8vIHJlcXVpcmVkIC8gb3B0aW9uYWwpLiBJdCdzIHN1cHBv
c2VkbHkgc2FmZSB3cnQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMKKy8vIChzZWUgcHJv
dG9fZGVjb2Rlcl9mdXp6ZXIuY2MpLgorLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYWxzbyBhcyBhIGJ1
aWxkaW5nIGJsb2NrIGZvciBUeXBlZFByb3RvRGVjb2RlciwgdXNlZCB3aGVuCisvLyB0aGUgc2No
ZW1hIGlzIGtub3duIGF0IGNvbXBpbGUgdGltZS4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBQcm90
b0RlY29kZXIgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIFByb3RvRGVjb2RlciB1c2luZyB0
aGUgZ2l2ZW4gfGJ1ZmZlcnwgd2l0aCBzaXplIHxsZW5ndGh8IGJ5dGVzLgorICBQcm90b0RlY29k
ZXIoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQorICAgICAgOiBiZWdpbl8ocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSksCisgICAgICAgIGVuZF8oYmVn
aW5fICsgbGVuZ3RoKSwKKyAgICAgICAgcmVhZF9wdHJfKGJlZ2luXykge30KKyAgUHJvdG9EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIDogUHJvdG9EZWNvZGVyKHN0ci5kYXRhKCksIHN0
ci5zaXplKCkpIHt9CisgIFByb3RvRGVjb2Rlcihjb25zdCBDb25zdEJ5dGVzJiBjYikgOiBQcm90
b0RlY29kZXIoY2IuZGF0YSwgY2Iuc2l6ZSkge30KKworICAvLyBSZWFkcyB0aGUgbmV4dCBmaWVs
ZCBmcm9tIHRoZSBidWZmZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFkIGN1cnNvci4gSWYgYQorICAv
LyBmdWxsIGZpZWxkIGNhbm5vdCBiZSByZWFkLCB0aGUgcmV0dXJuZWQgRmllbGQgd2lsbCBiZSBp
bnZhbGlkIChpLmUuCisgIC8vIGZpZWxkLnZhbGlkKCkgPT0gZmFsc2UpLgorICBGaWVsZCBSZWFk
RmllbGQoKTsKKworICAvLyBGaW5kcyB0aGUgZmlyc3QgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gaWQu
IERvZXNuJ3QgYWZmZWN0IHRoZSByZWFkIGN1cnNvci4KKyAgRmllbGQgRmluZEZpZWxkKHVpbnQz
Ml90IGZpZWxkX2lkKTsKKworICAvLyBSZXNldHMgdGhlIHJlYWQgY3Vyc29yIHRvIHRoZSBzdGFy
dCBvZiB0aGUgYnVmZmVyLgorICB2b2lkIFJlc2V0KCkgeyByZWFkX3B0cl8gPSBiZWdpbl87IH0K
KworICAvLyBSZXNldHMgdGhlIHJlYWQgY3Vyc29yIHRvIHRoZSBnaXZlbiBwb3NpdGlvbiAobXVz
dCBiZSB3aXRoaW4gdGhlIGJ1ZmZlcikuCisgIHZvaWQgUmVzZXQoY29uc3QgdWludDhfdCogcG9z
KSB7CisgICAgUEVSRkVUVE9fRENIRUNLKHBvcyA+PSBiZWdpbl8gJiYgcG9zIDwgZW5kXyk7Cisg
ICAgcmVhZF9wdHJfID0gcG9zOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gb2Yg
cmVhZCBjdXJzb3IsIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICBzaXpl
X3QgcmVhZF9vZmZzZXQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlYWRf
cHRyXyAtIGJlZ2luXyk7IH0KKworICBzaXplX3QgYnl0ZXNfbGVmdCgpIGNvbnN0IHsKKyAgICBQ
RVJGRVRUT19EQ0hFQ0socmVhZF9wdHJfIDw9IGVuZF8pOworICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxzaXplX3Q+KGVuZF8gLSByZWFkX3B0cl8pOworICB9CisKKyAgY29uc3QgdWludDhfdCogYmVn
aW4oKSBjb25zdCB7IHJldHVybiBiZWdpbl87IH0KKyAgY29uc3QgdWludDhfdCogZW5kKCkgY29u
c3QgeyByZXR1cm4gZW5kXzsgfQorCisgcHJvdGVjdGVkOgorICBjb25zdCB1aW50OF90KiBjb25z
dCBiZWdpbl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZF87CisgIGNvbnN0IHVpbnQ4X3Qq
IHJlYWRfcHRyXyA9IG51bGxwdHI7Cit9OworCisvLyBBbiBpdGVyYXRvci1saWtlIGNsYXNzIHVz
ZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHJlcGVhdGVkIGZpZWxkcy4gVXNlZCBieQorLy8gVHlwZWRQ
cm90b0RlY29kZXIuIFRoZSBpdGVyYXRpb24gc2VxdWVuY2UgaXMgYSBiaXQgY291bnRlci1pbnR1
aXRpdmUgZHVlIHRvCisvLyB0aGUgZmFjdCB0aGF0IGZpZWxkc19bZmllbGRfaWRdIGhvbGRzIHRo
ZSAqbGFzdCogdmFsdWUgb2YgdGhlIGZpZWxkLCBub3QgdGhlCisvLyBmaXJzdCwgYnV0IHRoZSBy
ZW1haW5pbmcgc3RvcmFnZSBob2xkcyByZXBlYXRlZCBmaWVsZHMgaW4gRklGTyBvcmRlci4KKy8v
IEFzc3VtZSB0aGF0IHdlIHB1c2ggdGhlIDEwLDExLDEyIGludG8gYSByZXBlYXRlZCBmaWVsZCB3
aXRoIElEPTEuCisvLworLy8gRGVjb2RlciBtZW1vcnkgbGF5b3V0OiAgWyAgZmllbGRzIHN0b3Jh
Z2UgIF0gWyByZXBlYXRlZCBmaWVsZHMgc3RvcmFnZSBdCisvLyAxc3QgaXRlcmF0aW9uOiAgICAg
ICAgICAgMTAKKy8vIDJuZCBpdGVyYXRpb246ICAgICAgICAgICAxMSAgICAgICAgICAgICAgICAg
ICAxMAorLy8gM3JkIGl0ZXJhdGlvbjogICAgICAgICAgIDEyICAgICAgICAgICAgICAgICAgIDEw
IDExCisvLworLy8gV2Ugc3RhcnQgdGhlIGl0ZXJhdGlvbiBAIGZpZWxkc19bbnVtX2ZpZWxkc10s
IHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKKy8vIHJlcGVhdGVkIGZpZWxkcyBzdG9yYWdlLCBw
cm9jZWVkIHVudGlsIHRoZSBlbmQgYW5kIGxhc3RseSBqdW1wIEAgZmllbGRzX1tpZF0uCit0ZW1w
bGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkRmllbGRJdGVyYXRvciB7CisgcHVibGlj
OgorICBSZXBlYXRlZEZpZWxkSXRlcmF0b3IodWludDMyX3QgZmllbGRfaWQsCisgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBGaWVsZCogYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBGaWVsZCogZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGQq
IGxhc3QpCisgICAgICA6IGZpZWxkX2lkXyhmaWVsZF9pZCksIGl0ZXJfKGJlZ2luKSwgZW5kXyhl
bmQpLCBsYXN0XyhsYXN0KSB7CisgICAgRmluZE5leHRNYXRjaGluZ0lkKCk7CisgIH0KKworICAv
LyBDb25zdHJ1Y3RzIGFuIGludmFsaWQgaXRlcmF0b3IuCisgIFJlcGVhdGVkRmllbGRJdGVyYXRv
cigpCisgICAgICA6IGZpZWxkX2lkXygwdSksIGl0ZXJfKG51bGxwdHIpLCBlbmRfKG51bGxwdHIp
LCBsYXN0XyhudWxscHRyKSB7fQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7
IHJldHVybiBpdGVyXyAhPSBlbmRfOyB9CisgIGNvbnN0IEZpZWxkJiBmaWVsZCgpIGNvbnN0IHsg
cmV0dXJuICppdGVyXzsgfQorCisgIFQgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIFQgdmFse307
CisgICAgaXRlcl8tPmdldCgmdmFsKTsKKyAgICByZXR1cm4gdmFsOworICB9CisgIGNvbnN0IEZp
ZWxkKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gaXRlcl87IH0KKworICBSZXBlYXRlZEZp
ZWxkSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKGl0ZXJfICE9
IGVuZF8pOworICAgIGlmIChpdGVyXyA9PSBsYXN0XykgeworICAgICAgaXRlcl8gPSBlbmRfOwor
ICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICArK2l0ZXJfOworICAgIEZpbmROZXh0TWF0
Y2hpbmdJZCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFJlcGVhdGVkRmllbGRJdGVy
YXRvciBvcGVyYXRvcisrKGludCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhpdGVyXyAhPSBlbmRf
KTsKKyAgICBSZXBlYXRlZEZpZWxkSXRlcmF0b3IgaXQoKnRoaXMpOworICAgICsrKCp0aGlzKTsK
KyAgICByZXR1cm4gaXQ7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgRmluZE5leHRNYXRjaGlu
Z0lkKCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhpdGVyXyAhPSBsYXN0Xyk7CisgICAgZm9yICg7
IGl0ZXJfICE9IGVuZF87ICsraXRlcl8pIHsKKyAgICAgIGlmIChpdGVyXy0+aWQoKSA9PSBmaWVs
ZF9pZF8pCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXRlcl8gPSBsYXN0Xy0+dmFsaWQo
KSA/IGxhc3RfIDogZW5kXzsKKyAgfQorCisgIHVpbnQzMl90IGZpZWxkX2lkXzsKKworICAvLyBJ
bml0aWFsbHkgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcGVhdGVkIGZpZWxkIHN0
b3JhZ2UsIHRoZW4gaXMKKyAgLy8gaW5jcmVtZW50ZWQgYXMgd2UgY2FsbCBvcGVyYXRvcisrKCku
CisgIGNvbnN0IEZpZWxkKiBpdGVyXzsKKworICAvLyBBbHdheXMgcG9pbnRzIHRvIGZpZWxkc19b
c2l6ZV9dLCBpLmUuIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RvcmFnZS4KKyAgY29uc3QgRmllbGQq
IGVuZF87CisKKyAgLy8gQWx3YXlzIHBvaW50cyB0byBmaWVsZHNfW2ZpZWxkX2lkXS4KKyAgY29u
c3QgRmllbGQqIGxhc3RfOworfTsKKworLy8gQXMgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yLCBidXQg
YWxsb3dzIGl0ZXJhdGluZyBvdmVyIGEgcGFja2VkIHJlcGVhdGVkIGZpZWxkCisvLyAod2hpY2gg
d2lsbCBiZSBpbml0aWFsbHkgc3RvcmVkIGFzIGEgc2luZ2xlIGxlbmd0aC1kZWxpbWl0ZWQgZmll
bGQpLgorLy8gU2VlIHxHZXRQYWNrZWRSZXBlYXRlZEZpZWxkfCBmb3IgZGV0YWlscy4KKy8vCisv
LyBBc3N1bWVzIGxpdHRsZSBlbmRpYW5uZXNzLCBhbmQgdGhhdCB0aGUgaW5wdXQgYnVmZmVycyBh
cmUgd2VsbCBmb3JtZWQgLQorLy8gY29udGFpbmluZyBhbiBleGFjdCBtdWx0aXBsZSBvZiBlbmNv
ZGVkIGVsZW1lbnRzLgordGVtcGxhdGUgPHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlIHdpcmVf
dHlwZSwgdHlwZW5hbWUgQ3BwVHlwZT4KK2NsYXNzIFBhY2tlZFJlcGVhdGVkRmllbGRJdGVyYXRv
ciB7CisgcHVibGljOgorICBQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3IoY29uc3QgdWludDhf
dCogZGF0YV9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXpl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcGFyc2VfZXJyb3JfcHRyKQor
ICAgICAgOiBkYXRhX2VuZF8oZGF0YV9iZWdpbiA/IGRhdGFfYmVnaW4gKyBzaXplIDogbnVsbHB0
ciksCisgICAgICAgIHJlYWRfcHRyXyhkYXRhX2JlZ2luKSwKKyAgICAgICAgcGFyc2VfZXJyb3Jf
KHBhcnNlX2Vycm9yX3B0cikgeworICAgIHVzaW5nIHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBl
OworICAgIHN0YXRpY19hc3NlcnQod2lyZV90eXBlID09IFByb3RvV2lyZVR5cGU6OmtWYXJJbnQg
fHwKKyAgICAgICAgICAgICAgICAgICAgICB3aXJlX3R5cGUgPT0gUHJvdG9XaXJlVHlwZTo6a0Zp
eGVkMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICB3aXJlX3R5cGUgPT0gUHJvdG9XaXJlVHlw
ZTo6a0ZpeGVkNjQsCisgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0eXBlIik7CisKKyAgICBQ
RVJGRVRUT19EQ0hFQ0socGFyc2VfZXJyb3JfcHRyKTsKKworICAgIC8vIEVpdGhlciB0aGUgZmll
bGQgaXMgdW5zZXQgKGFuZCB0aGVyZSBhcmUgbm8gZGF0YSBwb2ludGVyKSwgb3IgdGhlIGZpZWxk
CisgICAgLy8gaXMgc2V0IHdpdGggYSB6ZXJvIGxlbmd0aCBwYXlsb2FkLiBNYXJrIHRoZSBpdGVy
YXRvciBhcyBpbnZhbGlkIGluIGJvdGgKKyAgICAvLyBjYXNlcy4KKyAgICBpZiAoc2l6ZSA9PSAw
KSB7CisgICAgICBjdXJyX3ZhbHVlX3ZhbGlkXyA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGlmICgod2lyZV90eXBlID09IFByb3RvV2lyZVR5cGU6OmtGaXhlZDMyICYmIChz
aXplICUgNCkgIT0gMCkgfHwKKyAgICAgICAgKHdpcmVfdHlwZSA9PSBQcm90b1dpcmVUeXBlOjpr
Rml4ZWQ2NCAmJiAoc2l6ZSAlIDgpICE9IDApKSB7CisgICAgICAqcGFyc2VfZXJyb3JfID0gdHJ1
ZTsKKyAgICAgIGN1cnJfdmFsdWVfdmFsaWRfID0gZmFsc2U7CisgICAgICByZXR1cm47CisgICAg
fQorCisgICAgKysoKnRoaXMpOworICB9CisKKyAgY29uc3QgQ3BwVHlwZSBvcGVyYXRvciooKSBj
b25zdCB7IHJldHVybiBjdXJyX3ZhbHVlXzsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkg
Y29uc3QgeyByZXR1cm4gY3Vycl92YWx1ZV92YWxpZF87IH0KKworICBQYWNrZWRSZXBlYXRlZEZp
ZWxkSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgdXNpbmcgcHJvdG9fdXRpbHM6OlByb3Rv
V2lyZVR5cGU7CisKKyAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkoIWN1cnJfdmFsdWVfdmFsaWRf
KSkKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWShyZWFk
X3B0cl8gPT0gZGF0YV9lbmRfKSkgeworICAgICAgY3Vycl92YWx1ZV92YWxpZF8gPSBmYWxzZTsK
KyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpZiAod2lyZV90eXBlID09IFByb3Rv
V2lyZVR5cGU6OmtWYXJJbnQpIHsKKyAgICAgIHVpbnQ2NF90IG5ld192YWx1ZSA9IDA7CisgICAg
ICBjb25zdCB1aW50OF90KiBuZXdfcG9zID0KKyAgICAgICAgICBwcm90b191dGlsczo6UGFyc2VW
YXJJbnQocmVhZF9wdHJfLCBkYXRhX2VuZF8sICZuZXdfdmFsdWUpOworCisgICAgICBpZiAoUEVS
RkVUVE9fVU5MSUtFTFkobmV3X3BvcyA9PSByZWFkX3B0cl8pKSB7CisgICAgICAgIC8vIEZhaWxl
ZCB0byBkZWNvZGUgdGhlIHZhcmludCAocHJvYmFibHkgaW5jb21wbGV0ZSBidWZmZXIpLgorICAg
ICAgICAqcGFyc2VfZXJyb3JfID0gdHJ1ZTsKKyAgICAgICAgY3Vycl92YWx1ZV92YWxpZF8gPSBm
YWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRfcHRyXyA9IG5ld19wb3M7CisgICAg
ICAgIGN1cnJfdmFsdWVfID0gc3RhdGljX2Nhc3Q8Q3BwVHlwZT4obmV3X3ZhbHVlKTsKKyAgICAg
IH0KKyAgICB9IGVsc2UgeyAgLy8ga0ZpeGVkMzIgb3Iga0ZpeGVkNjQKKyAgICAgIGNvbnN0ZXhw
ciBzaXplX3Qga1N0ZXAgPSB3aXJlX3R5cGUgPT0gUHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIgPyA0
IDogODsKKworICAgICAgLy8gTkI6IHRoZSByYXcgYnVmZmVyIGlzIG5vdCBndWFyYW50ZWVkIHRv
IGJlIGFsaWduZWQsIHNvIG5laXRoZXIgYXJlCisgICAgICAvLyB0aGVzZSBjb3BpZXMuCisgICAg
ICBtZW1jcHkoJmN1cnJfdmFsdWVfLCByZWFkX3B0cl8sIHNpemVvZihDcHBUeXBlKSk7CisgICAg
ICByZWFkX3B0cl8gKz0ga1N0ZXA7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworICB9CisK
KyAgUGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgUGFj
a2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yIGl0KCp0aGlzKTsKKyAgICArKygqdGhpcyk7CisgICAg
cmV0dXJuIGl0OworICB9CisKKyBwcml2YXRlOgorICAvLyBNaWdodCBiZSBudWxsIGlmIHRoZSBi
YWNraW5nIHByb3RvIGZpZWxkIGlzbid0IHNldC4KKyAgY29uc3QgdWludDhfdCogY29uc3QgZGF0
YV9lbmRfOworCisgIC8vIFRoZSBpdGVyYXRvciBsb29rcyBhaGVhZCBieSBhbiBlbGVtZW50LCBz
byB8Y3Vycl92YWx1ZXwgaG9sZHMgdGhlIHZhbHVlCisgIC8vIHRvIGJlIHJldHVybmVkIHdoZW4g
dGhlIGNhbGxlciBkZXJlZmVyZW5jZXMgdGhlIGl0ZXJhdG9yLCBhbmQgfHJlYWRfcHRyX3wKKyAg
Ly8gcG9pbnRzIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIGRlY29kZWQu
CisgIC8vIHxyZWFkX3B0cl98IG1pZ2h0IGJlIG51bGwgaWYgdGhlIGJhY2tpbmcgcHJvdG8gZmll
bGQgaXNuJ3Qgc2V0LgorICBjb25zdCB1aW50OF90KiByZWFkX3B0cl87CisgIENwcFR5cGUgY3Vy
cl92YWx1ZV8gPSAwOworCisgIC8vIFNldCB0byBmYWxzZSBvbmNlIHdlJ3ZlIGV4aGF1c3RlZCB0
aGUgaXRlcmF0b3IsIG9yIGVuY291bnRlcmVkIGFuIGVycm9yLgorICBib29sIGN1cnJfdmFsdWVf
dmFsaWRfID0gdHJ1ZTsKKworICAvLyBXaGVyZSB0byBzZXQgcGFyc2luZyBlcnJvcnMsIHN1cHBs
aWVkIGJ5IHRoZSBjYWxsZXIuCisgIGJvb2wqIGNvbnN0IHBhcnNlX2Vycm9yXzsKK307CisKKy8v
IFRoaXMgZGVjb2RlciBsb2FkcyBhbGwgZmllbGRzIHVwZnJvbnQsIHdpdGhvdXQgcmVjdXJzaW5n
IGluIG5lc3RlZCBtZXNzYWdlcy4KKy8vIEl0IGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciB0
eXBlZCBkZWNvZGVycyBnZW5lcmF0ZWQgYnkgdGhlIHBiemVybyBwbHVnaW4uCisvLyBUaGUgc3Bs
aXQgYmV0d2VlbiBUeXBlZFByb3RvRGVjb2RlckJhc2UgYW5kIFR5cGVkUHJvdG9EZWNvZGVyPD4g
aXMgdG8gaGF2ZQorLy8gdW5pcXVlIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIGxpa2UgUGFyc2VB
bGxGaWVsZHMoKSBhbmQgRXhwYW5kSGVhcFN0b3JhZ2UoKS4KKy8vIFRoZSBzdG9yYWdlIChlaXRo
ZXIgb24tc3RhY2sgb3Igb24taGVhcCkgZm9yIHRoaXMgY2xhc3MgaXMgb3JnYW5pemVkIGFzCisv
LyBmb2xsb3dzOgorLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpZWxkc18gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLXwKKy8vIFsgZmllbGQgMCAoaW52YWxpZCkgXSBbIGZpZWxkcyAxIC4u
IE4gXSBbIHJlcGVhdGVkIGZpZWxkcyBdCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgXgorLy8gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbnVtX2ZpZWxkc18gICAgICAgIHNpemVfCitjbGFzcyBQRVJGRVRU
T19FWFBPUlQgVHlwZWRQcm90b0RlY29kZXJCYXNlIDogcHVibGljIFByb3RvRGVjb2RlciB7Cisg
cHVibGljOgorICAvLyBJZiB0aGUgZmllbGQgfGlkfCBpcyBrbm93biBhdCBjb21waWxlIHRpbWUs
IHByZWZlciB0aGUgdGVtcGxhdGVkCisgIC8vIHNwZWNpYWxpemF0aW9uIGF0PGtGaWVsZE51bWJl
cj4oKS4KKyAgY29uc3QgRmllbGQmIEdldCh1aW50MzJfdCBpZCkgY29uc3QgeworICAgIHJldHVy
biBQRVJGRVRUT19MSUtFTFkoaWQgPCBudW1fZmllbGRzXykgPyBmaWVsZHNfW2lkXSA6IGZpZWxk
c19bMF07CisgIH0KKworICAvLyBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGFsbG93cyB0byBpdGVy
YXRlIG92ZXIgYWxsIGluc3RhbmNlcyBvZiBhIHJlcGVhdGVkCisgIC8vIGZpZWxkIGdpdmVuIGl0
cyBpZC4gRXhhbXBsZSB1c2FnZToKKyAgLy8gICBmb3IgKGF1dG8gaXQgPSBkZWNvZGVyLkdldFJl
cGVhdGVkPGludDMyX3Q+KE4pOyBpdDsgKytpdCkgeyAuLi4gfQorICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVD4KKyAgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPFQ+IEdldFJlcGVhdGVkKHVpbnQzMl90IGZp
ZWxkX2lkKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRJdGVyYXRvcjxUPihmaWVs
ZF9pZCwgJmZpZWxkc19bbnVtX2ZpZWxkc19dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJmZpZWxkc19bc2l6ZV9dLCAmZmllbGRzX1tmaWVsZF9pZF0pOworICB9CisKKyAg
Ly8gUmV0dXJucyBhbiBvYmplY3RzIHRoYXQgYWxsb3dzIHRvIGl0ZXJhdGUgb3ZlciBhbGwgZW50
cmllcyBvZiBhIHBhY2tlZAorICAvLyByZXBlYXRlZCBmaWVsZCBnaXZlbiBpdHMgaWQgYW5kIHR5
cGUuIFRoZSB8d2lyZV90eXBlfCBpcyBuZWNlc3NhcnkgZm9yCisgIC8vIGRlY29kaW5nIHRoZSBw
YWNrZWQgZmllbGQsIHRoZSB8Y3BwX3R5cGV8IGlzIGZvciBjb252ZW5pZW5jZSAmIHN0cm9uZ2Vy
CisgIC8vIHR5cGluZy4KKyAgLy8KKyAgLy8gVGhlIGNhbGxlciBtdXN0IGFsc28gc3VwcGx5IGEg
cG9pbnRlciB0byBhIGJvb2wgdGhhdCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUKKyAgLy8gcGFja2Vk
IGJ1ZmZlciBpcyBmb3VuZCB0byBiZSBtYWxmb3JtZWQgd2hpbGUgaXRlcmF0aW5nIChzbyB5b3Ug
bmVlZCB0bworICAvLyBleGhhdXN0IHRoZSBpdGVyYXRvciBpZiB5b3Ugd2FudCB0byBjaGVjayB0
aGUgZnVsbCBleHRlbnQgb2YgdGhlIGJ1ZmZlcikuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB1bmxp
a2Ugc3RhbmRhcmQgcHJvdG9idWYgcGFyc2VycywgcHJvdG96ZXJvIGRvZXMgbm90IGFsbG93Cisg
IC8vIHRyZWF0aW5nIG9mIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMgYXMgbm9uLXBhY2tlZCBhbmQg
dmljZS12ZXJzYSAodGhlcmVmb3JlCisgIC8vIG5vdCBtYWtpbmcgdGhlIHBhY2tlZCBvcHRpb24g
Zm9yd2FyZHMgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlKS4gU28KKyAgLy8gdGhlIGNhbGxlciBu
ZWVkcyB0byB1c2UgdGhlIHJpZ2h0IGFjY2Vzc29yIGZvciBjb3JyZWN0IHJlc3VsdHMuCisgIHRl
bXBsYXRlIDxwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZSB3aXJlX3R5cGUsIHR5cGVuYW1lIGNw
cF90eXBlPgorICBQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3I8d2lyZV90eXBlLCBjcHBfdHlw
ZT4gR2V0UGFja2VkUmVwZWF0ZWQoCisgICAgICB1aW50MzJfdCBmaWVsZF9pZCwKKyAgICAgIGJv
b2wqIHBhcnNlX2Vycm9yX2xvY2F0aW9uKSBjb25zdCB7CisgICAgY29uc3QgRmllbGQmIGZpZWxk
ID0gR2V0KGZpZWxkX2lkKTsKKyAgICBpZiAoZmllbGQudmFsaWQoKSkgeworICAgICAgcmV0dXJu
IFBhY2tlZFJlcGVhdGVkRmllbGRJdGVyYXRvcjx3aXJlX3R5cGUsIGNwcF90eXBlPigKKyAgICAg
ICAgICBmaWVsZC5kYXRhKCksIGZpZWxkLnNpemUoKSwgcGFyc2VfZXJyb3JfbG9jYXRpb24pOwor
ICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPHdp
cmVfdHlwZSwgY3BwX3R5cGU+KAorICAgICAgICAgIG51bGxwdHIsIDAsIHBhcnNlX2Vycm9yX2xv
Y2F0aW9uKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgVHlwZWRQcm90b0RlY29kZXJC
YXNlKEZpZWxkKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVt
X2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAg
ICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKKyAgICAgIDogUHJvdG9EZWNvZGVyKGJ1ZmZlciwg
bGVuZ3RoKSwKKyAgICAgICAgZmllbGRzXyhzdG9yYWdlKSwKKyAgICAgICAgbnVtX2ZpZWxkc18o
bnVtX2ZpZWxkcyksCisgICAgICAgIHNpemVfKG51bV9maWVsZHMpLAorICAgICAgICBjYXBhY2l0
eV8oY2FwYWNpdHkpIHsKKyAgICAvLyBUaGUgcmVhc29uIHdoeSBGaWVsZCBuZWVkcyB0byBiZSB0
cml2aWFsbHkgZGUvY29uc3RydWN0aWJsZSBpcyB0byBhdm9pZAorICAgIC8vIGltcGxpY2l0IGlu
aXRpYWxpemVycyBvbiBhbGwgdGhlIH4xMDAwIGVudHJpZXMuIFdlIG5lZWQgaXQgdG8gaW5pdGlh
bGl6ZQorICAgIC8vIG9ubHkgb24gdGhlIGZpcnN0IHxtYXhfZmllbGRfaWR8IGZpZWxkcywgdGhl
IHJlbWFpbmluZyBjYXBhY2l0eSBkb2Vzbid0CisgICAgLy8gcmVxdWlyZSBpbml0aWFsaXphdGlv
bi4KKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8Rmll
bGQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfdHJpdmlhbGx5X2Rl
c3RydWN0aWJsZTxGaWVsZD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpp
c190cml2aWFsPEZpZWxkPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiRmllbGQgbXVzdCBi
ZSBhIHRyaXZpYWwgYWdncmVnYXRlIHR5cGUiKTsKKyAgICBtZW1zZXQoZmllbGRzXywgMCwgc2l6
ZW9mKEZpZWxkKSAqIG51bV9maWVsZHNfKTsKKyAgfQorCisgIHZvaWQgUGFyc2VBbGxGaWVsZHMo
KTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGUgZGVmYXVsdCBvbi1zdGFjayBzdG9yYWdlIGlzIGV4
aGF1c3RlZCBhbmQgbmV3IHJlcGVhdGVkCisgIC8vIGZpZWxkcyBuZWVkIHRvIGJlIHB1c2hlZC4K
KyAgdm9pZCBFeHBhbmRIZWFwU3RvcmFnZSgpOworCisgIC8vIFVzZWQgb25seSBpbiBwcmVzZW5j
ZSBvZiBhIGxhcmdlIG51bWJlciBvZiByZXBlYXRlZCBmaWVsZHMsIHdoZW4gdGhlCisgIC8vIGRl
ZmF1bHQgb24tc3RhY2sgc3RvcmFnZSBpcyBleGhhdXN0ZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjxG
aWVsZFtdPiBoZWFwX3N0b3JhZ2VfOworCisgIC8vIFBvaW50cyB0byB0aGUgc3RvcmFnZSwgZWl0
aGVyIG9uLXN0YWNrIChkZWZhdWx0LCBwcm92aWRlZCBieSB0aGUgdGVtcGxhdGUKKyAgLy8gc3Bl
Y2lhbGl6YXRpb24pIG9yIHxoZWFwX3N0b3JhZ2VffCBhZnRlciBFeHBhbmRIZWFwU3RvcmFnZSgp
IGlzIGNhbGxlZCwgaW4KKyAgLy8gY2FzZSBvZiBhIGxhcmdlIG51bWJlciBvZiByZXBlYXRlZCBm
aWVsZHMuCisgIEZpZWxkKiBmaWVsZHNfOworCisgIC8vIE51bWJlciBvZiBmaWVsZHMgd2l0aG91
dCBhY2NvdW50aW5nIHJlcGVhdGVkIHN0b3JhZ2UuIFRoaXMgaXMgZXF1YWwgdG8KKyAgLy8gTUFY
X0ZJRUxEX0lEICsgMSAodG8gYWNjb3VudCBmb3IgdGhlIGludmFsaWQgMHRoIGZpZWxkKS4KKyAg
Ly8gVGhpcyB2YWx1ZSBpcyBhbHdheXMgPD0gc2l6ZV8gKGFuZCBoZW5jZSA8PSBjYXBhY2l0eSk7
CisgIHVpbnQzMl90IG51bV9maWVsZHNfOworCisgIC8vIE51bWJlciBvZiBhY3RpdmUgfGZpZWxk
c198IGVudHJpZXMuIFRoaXMgaXMgaW5pdGlhbGx5IGVxdWFsIHRvIHRoZSBoaWdoZXN0CisgIC8v
IG51bWJlciBvZiBmaWVsZHMgZm9yIHRoZSBtZXNzYWdlIChudW1fZmllbGRzXyA9PSBNQVhfRklF
TERfSUQgKyAxKSBhbmQgY2FuCisgIC8vIGdyb3cgdXAgdG8gfGNhcGFjaXR5X3wgaW4gdGhlIGNh
c2Ugb2YgcmVwZWF0ZWQgZmllbGRzLgorICB1aW50MzJfdCBzaXplXzsKKworICAvLyBJbml0aWFs
bHkgZXF1YWwgdG8ga0ZpZWxkc0NhcGFjaXR5IG9mIHRoZSBUeXBlZFByb3RvRGVjb2RlcgorICAv
LyBzcGVjaWFsaXphdGlvbi4gQ2FuIGdyb3cgd2hlbiBmYWxsaW5nIGJhY2sgb24gaGVhcC1iYXNl
ZCBzdG9yYWdlLCBpbiB3aGljaAorICAvLyBjYXNlIGl0IHJlcHJlc2VudHMgdGhlIHNpemUgKCNm
aWVsZHMgd2l0aCBlYWNoIGVudHJ5IG9mIGEgcmVwZWF0ZWQgZmllbGQKKyAgLy8gY291bnRlZCBp
bmRpdmlkdWFsbHkpIG9mIHRoZSB8aGVhcF9zdG9yYWdlX3wgYXJyYXkuCisgIHVpbnQzMl90IGNh
cGFjaXR5XzsKK307CisKKy8vIFRlbXBsYXRlIGNsYXNzIGluc3RhbnRpYXRlZCBieSB0aGUgYXV0
by1nZW5lcmF0ZWQgZGVjb2RlciBjbGFzc2VzIGRlY2xhcmVkIGluCisvLyB4eHgucGJ6ZXJvLmgg
ZmlsZXMuCit0ZW1wbGF0ZSA8aW50IE1BWF9GSUVMRF9JRCwgYm9vbCBIQVNfTk9OUEFDS0VEX1JF
UEVBVEVEX0ZJRUxEUz4KK2NsYXNzIFR5cGVkUHJvdG9EZWNvZGVyIDogcHVibGljIFR5cGVkUHJv
dG9EZWNvZGVyQmFzZSB7CisgcHVibGljOgorICBUeXBlZFByb3RvRGVjb2Rlcihjb25zdCB1aW50
OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCisgICAgICA6IFR5cGVkUHJvdG9EZWNvZGVyQmFz
ZShvbl9zdGFja19zdG9yYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVt
X2ZpZWxkcz0qL01BWF9GSUVMRF9JRCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBrQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE1B
WF9GSUVMRF9JRCA8PSBrTWF4RGVjb2RlckZpZWxkSWQsICJGaWVsZCBvcmRpbmFsIHRvbyBoaWdo
Iik7CisgICAgVHlwZWRQcm90b0RlY29kZXJCYXNlOjpQYXJzZUFsbEZpZWxkcygpOworICB9CisK
KyAgdGVtcGxhdGUgPHVpbnQzMl90IEZJRUxEX0lEPgorICBjb25zdCBGaWVsZCYgYXQoKSBjb25z
dCB7CisgICAgc3RhdGljX2Fzc2VydChGSUVMRF9JRCA8PSBNQVhfRklFTERfSUQsICJGSUVMRF9J
RCA+IE1BWF9GSUVMRF9JRCIpOworICAgIHJldHVybiBmaWVsZHNfW0ZJRUxEX0lEXTsKKyAgfQor
CisgIFR5cGVkUHJvdG9EZWNvZGVyKFR5cGVkUHJvdG9EZWNvZGVyJiYgb3RoZXIpIG5vZXhjZXB0
CisgICAgICA6IFR5cGVkUHJvdG9EZWNvZGVyQmFzZShzdGQ6Om1vdmUob3RoZXIpKSB7CisgICAg
Ly8gSWYgdGhlIG1vdmVkLWZyb20gZGVjb2RlciB3YXMgdXNpbmcgb24tc3RhY2sgc3RvcmFnZSwg
d2UgbmVlZCB0byB1cGRhdGUKKyAgICAvLyBvdXIgcG9pbnRlciB0byBwb2ludCB0byB0aGlzIGRl
Y29kZXIncyBvbi1zdGFjayBzdG9yYWdlLgorICAgIGlmIChmaWVsZHNfID09IG90aGVyLm9uX3N0
YWNrX3N0b3JhZ2VfKSB7CisgICAgICBmaWVsZHNfID0gb25fc3RhY2tfc3RvcmFnZV87CisgICAg
ICBtZW1jcHkob25fc3RhY2tfc3RvcmFnZV8sIG90aGVyLm9uX3N0YWNrX3N0b3JhZ2VfLAorICAg
ICAgICAgICAgIHNpemVvZihvbl9zdGFja19zdG9yYWdlXykpOworICAgIH0KKyAgfQorCisgcHJp
dmF0ZToKKyAgLy8gSW4gdGhlIGNhc2Ugb2Ygbm9uLXJlcGVhdGVkIGZpZWxkcywgdGhpcyBjb25z
dGFudCBkZWZpbmVzIHRoZSBoaWdoZXN0IGZpZWxkCisgIC8vIGlkIHdlIGFyZSBhYmxlIHRvIGRl
Y29kZS4gVGhpcyBpcyB0byBsaW1pdCB0aGUgb24tc3RhY2sgc3RvcmFnZS4KKyAgLy8gSW4gdGhl
IGNhc2Ugb2YgcmVwZWF0ZWQgZmllbGRzLCB0aGlzIGNvbnN0YW50IGRlZmluZXMgdGhlIG1heCBu
dW1iZXIgb2YKKyAgLy8gcmVwZWF0ZWQgZmllbGRzIHRoYXQgd2UnbGwgYmUgYWJsZSB0byBzdG9y
ZSBiZWZvcmUgZmFsbGluZyBiYWNrIG9uIHRoZQorICAvLyBoZWFwLiBLZWVwIHRoaXMgdmFsdWUg
aW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gcHJvdG96ZXJvX2dlbmVyYXRvci5jYy4KKyAgc3RhdGlj
IGNvbnN0ZXhwciBzaXplX3Qga01heERlY29kZXJGaWVsZElkID0gOTk5OworCisgIC8vIElmIHdl
IHRoZSBtZXNzYWdlIGhhcyBubyByZXBlYXRlZCBmaWVsZHMgd2UgbmVlZCBhdCBtb3N0IE4gRmll
bGQgZW50cmllcworICAvLyBpbiB0aGUgb24tc3RhY2sgc3RvcmFnZSwgd2hlcmUgTiBpcyB0aGUg
aGlnaGVzdCBmaWVsZCBpZC4KKyAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgc29tZSByb29tIHRvIHN0
b3JlIHJlcGVhdGVkIGZpZWxkcy4KKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5
ID0KKyAgICAgIDEgKyAoSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFMgPyBrTWF4RGVjb2Rl
ckZpZWxkSWQgOiBNQVhfRklFTERfSUQpOworCisgIEZpZWxkIG9uX3N0YWNrX3N0b3JhZ2VfW2tD
YXBhY2l0eV07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKKyNlbmRpZiAgLy8g
SU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUFJPVE9fREVDT0RFUl9IXworLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGlj
ZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNl
Iik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdp
dGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2Ug
YXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIu
MAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8g
aW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlz
IGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMg
T1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAq
IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt
aXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b19kZWNvZGVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHM+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
bG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vZXh0L2Jhc2UvdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcHJvdG96
ZXJvIHsKKwordXNpbmcgbmFtZXNwYWNlIHByb3RvX3V0aWxzOworCisjaWYgX19CWVRFX09SREVS
X18gIT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKyNlcnJvciBVbmltcGxlbWVudGVkIGZvciBi
aWcgZW5kaWFuIGFyY2hzLgorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBQYXJzZUZp
ZWxkUmVzdWx0IHsKKyAgZW51bSBQYXJzZVJlc3VsdCB7IGtBYm9ydCwga1NraXAsIGtPayB9Owor
ICBQYXJzZVJlc3VsdCBwYXJzZV9yZXM7CisgIGNvbnN0IHVpbnQ4X3QqIG5leHQ7CisgIEZpZWxk
IGZpZWxkOworfTsKKworLy8gUGFyc2VzIG9uZSBmaWVsZCBhbmQgcmV0dXJucyB0aGUgZmllbGQg
aXRzZWxmIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5leHQKKy8vIGZpZWxkIHRvIHBhcnNlLiBJZiBw
YXJzaW5nIGZhaWxzLCB0aGUgcmV0dXJuZWQgfG5leHR8ID09IHxidWZmZXJ8LgorUEVSRkVUVE9f
QUxXQVlTX0lOTElORSBQYXJzZUZpZWxkUmVzdWx0CitQYXJzZU9uZUZpZWxkKGNvbnN0IHVpbnQ4
X3QqIGNvbnN0IGJ1ZmZlciwgY29uc3QgdWludDhfdCogY29uc3QgZW5kKSB7CisgIFBhcnNlRmll
bGRSZXN1bHQgcmVze1BhcnNlRmllbGRSZXN1bHQ6OmtBYm9ydCwgYnVmZmVyLCBGaWVsZHt9fTsK
KworICAvLyBUaGUgZmlyc3QgYnl0ZSBvZiBhIHByb3RvIGZpZWxkIGlzIHN0cnVjdHVyZWQgYXMg
Zm9sbG93czoKKyAgLy8gVGhlIGxlYXN0IDMgc2lnbmlmaWNhbnQgYml0cyBkZXRlcm1pbmUgdGhl
IGZpZWxkIHR5cGUuCisgIC8vIFRoZSBtb3N0IDUgc2lnbmlmaWNhbnQgYml0cyBkZXRlcm1pbmUg
dGhlIGZpZWxkIGlkLiBJZiBNU0IgPT0gMSwgdGhlCisgIC8vIGZpZWxkIGlkIGNvbnRpbnVlcyBv
biB0aGUgbmV4dCBieXRlcyBmb2xsb3dpbmcgdGhlIFZhckludCBlbmNvZGluZy4KKyAgY29uc3Qg
dWludDhfdCBrRmllbGRUeXBlTnVtQml0cyA9IDM7CisgIGNvbnN0IHVpbnQ2NF90IGtGaWVsZFR5
cGVNYXNrID0gKDEgPDwga0ZpZWxkVHlwZU51bUJpdHMpIC0gMTsgIC8vIDAwMDAgMDExMTsKKyAg
Y29uc3QgdWludDhfdCogcG9zID0gYnVmZmVyOworCisgIC8vIElmIHdlJ3ZlIGFscmVhZHkgaGl0
IHRoZSBlbmQsIGp1c3QgcmV0dXJuIGFuIGludmFsaWQgZmllbGQuCisgIGlmIChQRVJGRVRUT19V
TkxJS0VMWShwb3MgPj0gZW5kKSkKKyAgICByZXR1cm4gcmVzOworCisgIHVpbnQ2NF90IHByZWFt
YmxlID0gMDsKKyAgaWYgKFBFUkZFVFRPX0xJS0VMWSgqcG9zIDwgMHg4MCkpIHsgIC8vIEZhc3Rw
YXRoIGZvciBmaWVsZHMgd2l0aCBJRCA8IDE2LgorICAgIHByZWFtYmxlID0gKihwb3MrKyk7Cisg
IH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCogbmV4dCA9IFBhcnNlVmFySW50KHBvcywgZW5k
LCAmcHJlYW1ibGUpOworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWShwb3MgPT0gbmV4dCkpCisg
ICAgICByZXR1cm4gcmVzOworICAgIHBvcyA9IG5leHQ7CisgIH0KKworICB1aW50MzJfdCBmaWVs
ZF9pZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwcmVhbWJsZSA+PiBrRmllbGRUeXBlTnVtQml0
cyk7CisgIGlmIChmaWVsZF9pZCA9PSAwIHx8IHBvcyA+PSBlbmQpCisgICAgcmV0dXJuIHJlczsK
KworICBhdXRvIGZpZWxkX3R5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihwcmVhbWJsZSAmIGtG
aWVsZFR5cGVNYXNrKTsKKyAgY29uc3QgdWludDhfdCogbmV3X3BvcyA9IHBvczsKKyAgdWludDY0
X3QgaW50X3ZhbHVlID0gMDsKKyAgdWludDY0X3Qgc2l6ZSA9IDA7CisKKyAgc3dpdGNoIChmaWVs
ZF90eXBlKSB7CisgICAgY2FzZSBzdGF0aWNfY2FzdDx1aW50OF90PihQcm90b1dpcmVUeXBlOjpr
VmFySW50KTogeworICAgICAgbmV3X3BvcyA9IFBhcnNlVmFySW50KHBvcywgZW5kLCAmaW50X3Zh
bHVlKTsKKworICAgICAgLy8gbmV3X3BvcyBub3QgYmVpbmcgZ3JlYXRlciB0aGFuIHBvcyBtZWFu
cyBQYXJzZVZhckludCBjb3VsZCBub3QgZnVsbHkKKyAgICAgIC8vIHBhcnNlIHRoZSBudW1iZXIu
IFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUgb3V0IG9mIHNwYWNlIGluIHRoZSBidWZmZXIuCisgICAg
ICAvLyBTZXQgdGhlIGlkIHRvIHplcm8gYW5kIHJldHVybiBidXQgZG9uJ3QgdXBkYXRlIHRoZSBv
ZmZzZXQgc28gYSBmdXR1cmUKKyAgICAgIC8vIHJlYWQgY2FuIHJlYWQgdGhpcyBmaWVsZC4KKyAg
ICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWShuZXdfcG9zID09IHBvcykpCisgICAgICAgIHJldHVy
biByZXM7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2Ugc3RhdGljX2Nhc3Q8dWlu
dDhfdD4oUHJvdG9XaXJlVHlwZTo6a0xlbmd0aERlbGltaXRlZCk6IHsKKyAgICAgIHVpbnQ2NF90
IHBheWxvYWRfbGVuZ3RoOworICAgICAgbmV3X3BvcyA9IFBhcnNlVmFySW50KHBvcywgZW5kLCAm
cGF5bG9hZF9sZW5ndGgpOworICAgICAgaWYgKFBFUkZFVFRPX1VOTElLRUxZKG5ld19wb3MgPT0g
cG9zKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgLy8gUGFyc2VWYXJJbnQgZ3VhcmFu
dGVlcyB0aGF0IHxuZXdfcG9zfCA8PSB8ZW5kfCB3aGVuIGl0IHN1Y2NlZWRzOworICAgICAgaWYg
KHBheWxvYWRfbGVuZ3RoID4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGVuZCAtIG5ld19wb3MpKQor
ICAgICAgICByZXR1cm4gcmVzOworCisgICAgICBjb25zdCB1aW50cHRyX3QgcGF5bG9hZF9zdGFy
dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihuZXdfcG9zKTsKKyAgICAgIGludF92YWx1
ZSA9IHBheWxvYWRfc3RhcnQ7CisgICAgICBzaXplID0gcGF5bG9hZF9sZW5ndGg7CisgICAgICBu
ZXdfcG9zICs9IHBheWxvYWRfbGVuZ3RoOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2Fz
ZSBzdGF0aWNfY2FzdDx1aW50OF90PihQcm90b1dpcmVUeXBlOjprRml4ZWQ2NCk6IHsKKyAgICAg
IG5ld19wb3MgPSBwb3MgKyBzaXplb2YodWludDY0X3QpOworICAgICAgaWYgKFBFUkZFVFRPX1VO
TElLRUxZKG5ld19wb3MgPiBlbmQpKQorICAgICAgICByZXR1cm4gcmVzOworICAgICAgbWVtY3B5
KCZpbnRfdmFsdWUsIHBvcywgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICBicmVhazsKKyAgICB9
CisKKyAgICBjYXNlIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFByb3RvV2lyZVR5cGU6OmtGaXhlZDMy
KTogeworICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemVvZih1aW50MzJfdCk7CisgICAgICBpZiAo
UEVSRkVUVE9fVU5MSUtFTFkobmV3X3BvcyA+IGVuZCkpCisgICAgICAgIHJldHVybiByZXM7Cisg
ICAgICBtZW1jcHkoJmludF92YWx1ZSwgcG9zLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBQRVJGRVRUT19ETE9HKCJJbnZhbGlk
IHByb3RvIGZpZWxkIHR5cGU6ICV1IiwgZmllbGRfdHlwZSk7CisgICAgICByZXR1cm4gcmVzOwor
ICB9CisKKyAgcmVzLm5leHQgPSBuZXdfcG9zOworCisgIGlmIChQRVJGRVRUT19VTkxJS0VMWShm
aWVsZF9pZCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSkpIHsKKyAgICBQ
RVJGRVRUT19ETE9HKCJTa2lwcGluZyBmaWVsZCAlIiBQUkl1MzIgIiBiZWNhdXNlIGl0cyBpZCA+
IDB4RkZGRiIsCisgICAgICAgICAgICAgICAgICBmaWVsZF9pZCk7CisgICAgcmVzLnBhcnNlX3Jl
cyA9IFBhcnNlRmllbGRSZXN1bHQ6OmtTa2lwOworICAgIHJldHVybiByZXM7CisgIH0KKworICBp
ZiAoUEVSRkVUVE9fVU5MSUtFTFkoc2l6ZSA+IHByb3RvX3V0aWxzOjprTWF4TWVzc2FnZUxlbmd0
aCkpIHsKKyAgICBQRVJGRVRUT19ETE9HKCJTa2lwcGluZyBmaWVsZCAlIiBQUkl1MzIgIiBiZWNh
dXNlIGl0J3MgdG9vIGJpZyAoJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAiIEtCKSIsCisg
ICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgc2l6ZSAvIDEwMjQpOworICAgIHJlcy5wYXJzZV9y
ZXMgPSBQYXJzZUZpZWxkUmVzdWx0OjprU2tpcDsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAg
cmVzLnBhcnNlX3JlcyA9IFBhcnNlRmllbGRSZXN1bHQ6OmtPazsKKyAgcmVzLmZpZWxkLmluaXRp
YWxpemUoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGZpZWxkX2lkKSwgZmllbGRfdHlwZSwgaW50X3Zh
bHVlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSkp
OworICByZXR1cm4gcmVzOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRmllbGQgUHJvdG9EZWNv
ZGVyOjpGaW5kRmllbGQodWludDMyX3QgZmllbGRfaWQpIHsKKyAgRmllbGQgcmVze307CisgIGF1
dG8gb2xkX3Bvc2l0aW9uID0gcmVhZF9wdHJfOworICByZWFkX3B0cl8gPSBiZWdpbl87CisgIGZv
ciAoYXV0byBmID0gUmVhZEZpZWxkKCk7IGYudmFsaWQoKTsgZiA9IFJlYWRGaWVsZCgpKSB7Cisg
ICAgaWYgKGYuaWQoKSA9PSBmaWVsZF9pZCkgeworICAgICAgcmVzID0gZjsKKyAgICAgIGJyZWFr
OworICAgIH0KKyAgfQorICByZWFkX3B0cl8gPSBvbGRfcG9zaXRpb247CisgIHJldHVybiByZXM7
Cit9CisKK1BFUkZFVFRPX0FMV0FZU19JTkxJTkUKK0ZpZWxkIFByb3RvRGVjb2Rlcjo6UmVhZEZp
ZWxkKCkgeworICBQYXJzZUZpZWxkUmVzdWx0IHJlczsKKyAgZG8geworICAgIHJlcyA9IFBhcnNl
T25lRmllbGQocmVhZF9wdHJfLCBlbmRfKTsKKyAgICByZWFkX3B0cl8gPSByZXMubmV4dDsKKyAg
fSB3aGlsZSAoUEVSRkVUVE9fVU5MSUtFTFkocmVzLnBhcnNlX3JlcyA9PSBQYXJzZUZpZWxkUmVz
dWx0OjprU2tpcCkpOworICByZXR1cm4gcmVzLmZpZWxkOworfQorCit2b2lkIFR5cGVkUHJvdG9E
ZWNvZGVyQmFzZTo6UGFyc2VBbGxGaWVsZHMoKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGN1ciA9IGJl
Z2luXzsKKyAgUGFyc2VGaWVsZFJlc3VsdCByZXM7CisgIGZvciAoOzspIHsKKyAgICByZXMgPSBQ
YXJzZU9uZUZpZWxkKGN1ciwgZW5kXyk7CisgICAgUEVSRkVUVE9fRENIRUNLKHJlcy5wYXJzZV9y
ZXMgIT0gUGFyc2VGaWVsZFJlc3VsdDo6a09rIHx8IHJlcy5uZXh0ICE9IGN1cik7CisgICAgY3Vy
ID0gcmVzLm5leHQ7CisgICAgaWYgKFBFUkZFVFRPX1VOTElLRUxZKHJlcy5wYXJzZV9yZXMgPT0g
UGFyc2VGaWVsZFJlc3VsdDo6a1NraXApKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2Ug
aWYgKFBFUkZFVFRPX1VOTElLRUxZKHJlcy5wYXJzZV9yZXMgPT0gUGFyc2VGaWVsZFJlc3VsdDo6
a0Fib3J0KSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIFBFUkZFVFRPX0RDSEVDSyhyZXMu
cGFyc2VfcmVzID09IFBhcnNlRmllbGRSZXN1bHQ6OmtPayk7CisgICAgUEVSRkVUVE9fRENIRUNL
KHJlcy5maWVsZC52YWxpZCgpKTsKKyAgICBhdXRvIGZpZWxkX2lkID0gcmVzLmZpZWxkLmlkKCk7
CisgICAgaWYgKFBFUkZFVFRPX1VOTElLRUxZKGZpZWxkX2lkID49IG51bV9maWVsZHNfKSkKKyAg
ICAgIGNvbnRpbnVlOworCisgICAgRmllbGQqIGZsZCA9ICZmaWVsZHNfW2ZpZWxkX2lkXTsKKyAg
ICBpZiAoUEVSRkVUVE9fTElLRUxZKCFmbGQtPnZhbGlkKCkpKSB7CisgICAgICAvLyBUaGlzIGlz
IHRoZSBmaXJzdCB0aW1lIHdlIHNlZSB0aGlzIGZpZWxkLgorICAgICAgKmZsZCA9IHN0ZDo6bW92
ZShyZXMuZmllbGQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBSZXBlYXRlZCBmaWVsZCBjYXNl
LgorICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG86CisgICAgICAvLyAxLiBBcHBlbmQg
dGhlIGxhc3QgdmFsdWUgb2YgdGhlIGZpZWxkIHRvIGVuZCBvZiB0aGUgcmVwZWF0ZWQgZmllbGQK
KyAgICAgIC8vICAgIHN0b3JhZ2UuCisgICAgICAvLyAyLiBSZXBsYWNlIHRoZSBkZWZhdWx0IGlu
c3RhbmNlIGF0IG9mZnNldCB8ZmllbGRfaWR8IHdpdGggdGhlIGN1cnJlbnQKKyAgICAgIC8vICAg
IHZhbHVlLiBUaGlzIGlzIGJlY2F1c2UgaW4gY2FzZSBvZiByZXBlYXRlZCBmaWVsZCBhIGNhbGwg
dG8gR2V0KFgpIGlzCisgICAgICAvLyAgICBzdXBwb3NlZCB0byByZXR1cm4gdGhlIGxhc3QgdmFs
dWUgb2YgWCwgbm90IHRoZSBmaXJzdCBvbmUuCisgICAgICAvLyBUaGlzIGlzIHNvIHRoYXQgdGhl
IFJlcGVhdGVkRmllbGRJdGVyYXRvciB3aWxsIGl0ZXJhdGUgaW4gdGhlIHJpZ2h0CisgICAgICAv
LyBvcmRlciwgc2VlIGNvbW1lbnRzIG9uIFJlcGVhdGVkRmllbGRJdGVyYXRvci4KKyAgICAgIGlm
IChQRVJGRVRUT19VTkxJS0VMWShzaXplXyA+PSBjYXBhY2l0eV8pKSB7CisgICAgICAgIEV4cGFu
ZEhlYXBTdG9yYWdlKCk7CisgICAgICAgIC8vIEV4cGFuZEhlYXBTdG9yYWdlIG1vdmVzIGZpZWxk
c18gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHB0ciB0byBmbGQ6CisgICAgICAgIGZsZCA9ICZm
aWVsZHNfW2ZpZWxkX2lkXTsKKyAgICAgICAgUEVSRkVUVE9fRENIRUNLKHNpemVfIDwgY2FwYWNp
dHlfKTsKKyAgICAgIH0KKyAgICAgIGZpZWxkc19bc2l6ZV8rK10gPSAqZmxkOworICAgICAgKmZs
ZCA9IHN0ZDo6bW92ZShyZXMuZmllbGQpOworICAgIH0KKyAgfQorICByZWFkX3B0cl8gPSByZXMu
bmV4dDsKK30KKwordm9pZCBUeXBlZFByb3RvRGVjb2RlckJhc2U6OkV4cGFuZEhlYXBTdG9yYWdl
KCkgeworICB1aW50MzJfdCBuZXdfY2FwYWNpdHkgPSBjYXBhY2l0eV8gKiAyOworICBQRVJGRVRU
T19DSEVDSyhuZXdfY2FwYWNpdHkgPiBzaXplXyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxGaWVsZFtd
PiBuZXdfc3RvcmFnZShuZXcgRmllbGRbbmV3X2NhcGFjaXR5XSk7CisKKyAgc3RhdGljX2Fzc2Vy
dChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxGaWVsZD46OnZhbHVlLAorICAgICAgICAgICAg
ICAgICJGaWVsZCBtdXN0IGJlIHRyaXZpYWxseSBjb3B5YWJsZSIpOworICBtZW1jcHkoJm5ld19z
dG9yYWdlWzBdLCBmaWVsZHNfLCBzaXplb2YoRmllbGQpICogc2l6ZV8pOworCisgIGhlYXBfc3Rv
cmFnZV8gPSBzdGQ6Om1vdmUobmV3X3N0b3JhZ2UpOworICBmaWVsZHNfID0gJmhlYXBfc3RvcmFn
ZV9bMF07CisgIGNhcGFjaXR5XyA9IG5ld19jYXBhY2l0eTsKK30KKworfSAgLy8gbmFtZXNwYWNl
IHByb3RvemVybworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3Byb3RvemVy
by9zY2F0dGVyZWRfaGVhcF9idWZmZXIuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFk
ZXI6IGluY2x1ZGUvcGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FUVEVSRURfSEVB
UF9CVUZGRVJfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fU0NBVFRFUkVE
X0hFQVBfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgor
I2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9zdHJlYW1fd3Jp
dGVyLmgiCisKK25hbWVzcGFjZSBwcm90b3plcm8geworCitjbGFzcyBNZXNzYWdlOworCitjbGFz
cyBQRVJGRVRUT19FWFBPUlQgU2NhdHRlcmVkSGVhcEJ1ZmZlcgorICAgIDogcHVibGljIHByb3Rv
emVybzo6U2NhdHRlcmVkU3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSB7CisgcHVibGljOgorICBjbGFz
cyBQRVJGRVRUT19FWFBPUlQgU2xpY2UgeworICAgcHVibGljOgorICAgIFNsaWNlKCk7CisgICAg
ZXhwbGljaXQgU2xpY2Uoc2l6ZV90IHNpemUpOworICAgIFNsaWNlKFNsaWNlJiYgc2xpY2UpIG5v
ZXhjZXB0OworICAgIH5TbGljZSgpOworICAgIFNsaWNlJiBvcGVyYXRvcj0oU2xpY2UmJik7CisK
KyAgICBpbmxpbmUgcHJvdG96ZXJvOjpDb250aWd1b3VzTWVtb3J5UmFuZ2UgR2V0VG90YWxSYW5n
ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB7YnVmZmVyXy5nZXQoKSwgYnVmZmVyXy5nZXQoKSAr
IHNpemVffTsKKyAgICB9CisKKyAgICBpbmxpbmUgcHJvdG96ZXJvOjpDb250aWd1b3VzTWVtb3J5
UmFuZ2UgR2V0VXNlZFJhbmdlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHtidWZmZXJfLmdldCgp
LCBidWZmZXJfLmdldCgpICsgc2l6ZV8gLSB1bnVzZWRfYnl0ZXNffTsKKyAgICB9CisKKyAgICB1
aW50OF90KiBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIGJ1ZmZlcl8uZ2V0KCk7IH0KKyAgICBzaXpl
X3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9CisgICAgc2l6ZV90IHVudXNlZF9ieXRl
cygpIGNvbnN0IHsgcmV0dXJuIHVudXNlZF9ieXRlc187IH0KKyAgICB2b2lkIHNldF91bnVzZWRf
Ynl0ZXMoc2l6ZV90IHVudXNlZF9ieXRlcykgeworICAgICAgUEVSRkVUVE9fRENIRUNLKHVudXNl
ZF9ieXRlc18gPD0gc2l6ZV8pOworICAgICAgdW51c2VkX2J5dGVzXyA9IHVudXNlZF9ieXRlczsK
KyAgICB9CisKKyAgICB2b2lkIENsZWFyKCk7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjp1bmlx
dWVfcHRyPHVpbnQ4X3RbXT4gYnVmZmVyXzsKKyAgICBzaXplX3Qgc2l6ZV87CisgICAgc2l6ZV90
IHVudXNlZF9ieXRlc187CisgIH07CisKKyAgU2NhdHRlcmVkSGVhcEJ1ZmZlcihzaXplX3QgaW5p
dGlhbF9zbGljZV9zaXplX2J5dGVzID0gMTI4LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVf
dCBtYXhpbXVtX3NsaWNlX3NpemVfYnl0ZXMgPSAxMjggKiAxMDI0KTsKKyAgflNjYXR0ZXJlZEhl
YXBCdWZmZXIoKSBvdmVycmlkZTsKKworICAvLyBwcm90b3plcm86OlNjYXR0ZXJlZFN0cmVhbVdy
aXRlcjo6RGVsZWdhdGUgaW1wbGVtZW50YXRpb24uCisgIHByb3RvemVybzo6Q29udGlndW91c01l
bW9yeVJhbmdlIEdldE5ld0J1ZmZlcigpIG92ZXJyaWRlOworCisgIC8vIFN0aXRjaCBhbGwgdGhl
IHNsaWNlcyBpbnRvIGEgc2luZ2xlIGNvbnRpZ3VvdXMgYnVmZmVyLgorICBzdGQ6OnZlY3Rvcjx1
aW50OF90PiBTdGl0Y2hTbGljZXMoKTsKKworICAvLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHJh
bmdlcyBwb2ludCBiYWNrIHRvIHRoaXMgYnVmZmVyIGFuZCB0aHVzIGNhbm5vdAorICAvLyBvdXRs
aXZlIGl0LgorICBzdGQ6OnZlY3Rvcjxwcm90b3plcm86OkNvbnRpZ3VvdXNNZW1vcnlSYW5nZT4g
R2V0UmFuZ2VzKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8U2xpY2U+JiBzbGljZXMoKSBjb25z
dCB7IHJldHVybiBzbGljZXNfOyB9CisKKyAgdm9pZCBzZXRfd3JpdGVyKHByb3RvemVybzo6U2Nh
dHRlcmVkU3RyZWFtV3JpdGVyKiB3cml0ZXIpIHsKKyAgICB3cml0ZXJfID0gd3JpdGVyOworICB9
CisKKyAgLy8gVXBkYXRlIHVudXNlZF9ieXRlcygpIG9mIHRoZSBjdXJyZW50IHxTbGljZXwgYmFz
ZWQgb24gdGhlIHdyaXRlcidzIHN0YXRlLgorICB2b2lkIEFkanVzdFVzZWRTaXplT2ZDdXJyZW50
U2xpY2UoKTsKKworICAvLyBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIHRoZSBzbGljZXMgb2NjdXB5
IGluIGhlYXAgbWVtb3J5IChpbmNsdWRpbmcgdW51c2VkKS4KKyAgc2l6ZV90IEdldFRvdGFsU2l6
ZSgpOworCisgIC8vIFJlc2V0IHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBidXQgcmV0YWlu
IG9uZSBzbGljZSBhbGxvY2F0aW9uIChpZiBpdAorICAvLyBleGlzdHMpIHRvIGJlIHJldXNlZCBm
b3IgZnV0dXJlIHdyaXRlcy4KKyAgdm9pZCBSZXNldCgpOworCisgcHJpdmF0ZToKKyAgc2l6ZV90
IG5leHRfc2xpY2Vfc2l6ZV87CisgIGNvbnN0IHNpemVfdCBtYXhpbXVtX3NsaWNlX3NpemVfOwor
ICBwcm90b3plcm86OlNjYXR0ZXJlZFN0cmVhbVdyaXRlciogd3JpdGVyXyA9IG51bGxwdHI7Cisg
IHN0ZDo6dmVjdG9yPFNsaWNlPiBzbGljZXNfOworCisgIC8vIFVzZWQgdG8ga2VlcCBhbiBhbGxv
Y2F0ZWQgc2xpY2UgYXJvdW5kIGFmdGVyIHRoaXMgYnVmZmVyIGlzIHJlc2V0LgorICBTbGljZSBj
YWNoZWRfc2xpY2VfOworfTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBoZWFwLWJh
c2VkIHByb3RvemVybyBtZXNzYWdlcyBpbiBvbmUgbGluZS4KKy8vIFVzZWZ1bCB3aGVuIG1hbnVh
bGx5IHNlcmlhbGl6aW5nIGEgcHJvdG96ZXJvIG1lc3NhZ2UgKHByaW1hcmlseSBpbgorLy8gdGVz
dHMvdXRpbGl0aWVzKS4gU28gaW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nOgorLy8gICBwcm90b3pl
cm86Ok15TWVzc2FnZSBtc2c7CisvLyAgIHByb3RvemVybzo6U2NhdHRlcmVkSGVhcEJ1ZmZlciBz
aGI7CisvLyAgIHByb3RvemVybzo6U2NhdHRlcmVkU3RyZWFtV3JpdGVyIHdyaXRlcigmc2hiKTsK
Ky8vICAgc2hiLnNldF93cml0ZXIoJndyaXRlcik7CisvLyAgIG1zZy5SZXNldCgmd3JpdGVyKTsK
Ky8vICAgLi4uCisvLyBZb3UgY2FuIHdyaXRlOgorLy8gICBwcm90b3plcm86OkhlYXBCdWZmZXJl
ZDxwcm90b3plcm86Ok15TWVzc2FnZT4gbXNnOworLy8gICBtc2ctPnNldF9zdHVmZiguLi4pOwor
Ly8gICBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUID0gOjpw
cm90b3plcm86Ok1lc3NhZ2U+CitjbGFzcyBIZWFwQnVmZmVyZWQgeworIHB1YmxpYzoKKyAgSGVh
cEJ1ZmZlcmVkKCkgOiBIZWFwQnVmZmVyZWQoNDA5NiwgNDA5Nikge30KKyAgSGVhcEJ1ZmZlcmVk
KHNpemVfdCBpbml0aWFsX3NsaWNlX3NpemVfYnl0ZXMsIHNpemVfdCBtYXhpbXVtX3NsaWNlX3Np
emVfYnl0ZXMpCisgICAgICA6IHNoYl8oaW5pdGlhbF9zbGljZV9zaXplX2J5dGVzLCBtYXhpbXVt
X3NsaWNlX3NpemVfYnl0ZXMpLAorICAgICAgICB3cml0ZXJfKCZzaGJfKSB7CisgICAgc2hiXy5z
ZXRfd3JpdGVyKCZ3cml0ZXJfKTsKKyAgICBtc2dfLlJlc2V0KCZ3cml0ZXJfKTsKKyAgfQorCisg
IC8vIFRoaXMgY2FuJ3QgYmUgbmVpdGhlciBjb3BpZWQgbm9yIG1vdmVkIGJlY2F1c2UgTWVzc2Fn
ZSBoYW5kcyBvdXQgcG9pbnRlcnMKKyAgLy8gdG8gaXRzZWxmIHdoZW4gY3JlYXRpbmcgc3VibWVz
c2FnZXMuCisgIEhlYXBCdWZmZXJlZChjb25zdCBIZWFwQnVmZmVyZWQmKSA9IGRlbGV0ZTsKKyAg
SGVhcEJ1ZmZlcmVkJiBvcGVyYXRvcj0oY29uc3QgSGVhcEJ1ZmZlcmVkJikgPSBkZWxldGU7Cisg
IEhlYXBCdWZmZXJlZChIZWFwQnVmZmVyZWQmJikgPSBkZWxldGU7CisgIEhlYXBCdWZmZXJlZCYg
b3BlcmF0b3I9KEhlYXBCdWZmZXJlZCYmKSA9IGRlbGV0ZTsKKworICBUKiBnZXQoKSB7IHJldHVy
biAmbXNnXzsgfQorICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gJm1zZ187IH0KKworICBib29s
IGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2hiXy5zbGljZXMoKS5lbXB0eSgpOyB9CisKKyAgc3Rk
Ojp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIHsKKyAgICBtc2dfLkZpbmFsaXpl
KCk7CisgICAgcmV0dXJuIHNoYl8uU3RpdGNoU2xpY2VzKCk7CisgIH0KKworICBzdGQ6OnN0cmlu
ZyBTZXJpYWxpemVBc1N0cmluZygpIHsKKyAgICBhdXRvIHZlYyA9IFNlcmlhbGl6ZUFzQXJyYXko
KTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4o
dmVjLmRhdGEoKSksIHZlYy5zaXplKCkpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8cHJvdG96ZXJv
OjpDb250aWd1b3VzTWVtb3J5UmFuZ2U+IEdldFJhbmdlcygpIHsKKyAgICBtc2dfLkZpbmFsaXpl
KCk7CisgICAgcmV0dXJuIHNoYl8uR2V0UmFuZ2VzKCk7CisgIH0KKworICB2b2lkIFJlc2V0KCkg
eworICAgIHNoYl8uUmVzZXQoKTsKKyAgICB3cml0ZXJfLlJlc2V0KHByb3RvemVybzo6Q29udGln
dW91c01lbW9yeVJhbmdle30pOworICAgIG1zZ18uUmVzZXQoJndyaXRlcl8pOworICAgIFBFUkZF
VFRPX0RDSEVDSyhlbXB0eSgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU2NhdHRlcmVkSGVhcEJ1
ZmZlciBzaGJfOworICBTY2F0dGVyZWRTdHJlYW1Xcml0ZXIgd3JpdGVyXzsKKyAgVCBtc2dfOwor
fTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVS
RkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9IRUFQX0JVRkZFUl9IXworLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5z
ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7
CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgg
dGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQK
KyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAor
ICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4g
d3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRp
c3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1Ig
Q09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNl
ZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNz
aW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0
dGVyZWRfaGVhcF9idWZmZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNl
IHByb3RvemVybyB7CisKK1NjYXR0ZXJlZEhlYXBCdWZmZXI6OlNsaWNlOjpTbGljZSgpCisgICAg
OiBidWZmZXJfKG51bGxwdHIpLCBzaXplXygwdSksIHVudXNlZF9ieXRlc18oMHUpIHt9CisKK1Nj
YXR0ZXJlZEhlYXBCdWZmZXI6OlNsaWNlOjpTbGljZShzaXplX3Qgc2l6ZSkKKyAgICA6IGJ1ZmZl
cl8oc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4obmV3IHVpbnQ4X3Rbc2l6ZV0pKSwKKyAgICAg
IHNpemVfKHNpemUpLAorICAgICAgdW51c2VkX2J5dGVzXyhzaXplKSB7CisgIFBFUkZFVFRPX0RD
SEVDSyhzaXplKTsKKyAgQ2xlYXIoKTsKK30KKworU2NhdHRlcmVkSGVhcEJ1ZmZlcjo6U2xpY2U6
OlNsaWNlKFNsaWNlJiYgc2xpY2UpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworU2NhdHRlcmVkSGVh
cEJ1ZmZlcjo6U2xpY2U6On5TbGljZSgpID0gZGVmYXVsdDsKKworU2NhdHRlcmVkSGVhcEJ1ZmZl
cjo6U2xpY2UmIFNjYXR0ZXJlZEhlYXBCdWZmZXI6OlNsaWNlOjpvcGVyYXRvcj0oU2xpY2UmJikg
PQorICAgIGRlZmF1bHQ7CisKK3ZvaWQgU2NhdHRlcmVkSGVhcEJ1ZmZlcjo6U2xpY2U6OkNsZWFy
KCkgeworICB1bnVzZWRfYnl0ZXNfID0gc2l6ZV87CisjaWYgUEVSRkVUVE9fRENIRUNLX0lTX09O
KCkKKyAgbWVtc2V0KHN0YXJ0KCksIDB4ZmYsIHNpemVfKTsKKyNlbmRpZiAgLy8gUEVSRkVUVE9f
RENIRUNLX0lTX09OKCkKK30KKworU2NhdHRlcmVkSGVhcEJ1ZmZlcjo6U2NhdHRlcmVkSGVhcEJ1
ZmZlcihzaXplX3QgaW5pdGlhbF9zbGljZV9zaXplX2J5dGVzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4aW11bV9zbGljZV9zaXplX2J5dGVzKQor
ICAgIDogbmV4dF9zbGljZV9zaXplXyhpbml0aWFsX3NsaWNlX3NpemVfYnl0ZXMpLAorICAgICAg
bWF4aW11bV9zbGljZV9zaXplXyhtYXhpbXVtX3NsaWNlX3NpemVfYnl0ZXMpIHsKKyAgUEVSRkVU
VE9fRENIRUNLKG5leHRfc2xpY2Vfc2l6ZV8gJiYgbWF4aW11bV9zbGljZV9zaXplXyk7CisgIFBF
UkZFVFRPX0RDSEVDSyhtYXhpbXVtX3NsaWNlX3NpemVfID49IGluaXRpYWxfc2xpY2Vfc2l6ZV9i
eXRlcyk7Cit9CisKK1NjYXR0ZXJlZEhlYXBCdWZmZXI6On5TY2F0dGVyZWRIZWFwQnVmZmVyKCkg
PSBkZWZhdWx0OworCitwcm90b3plcm86OkNvbnRpZ3VvdXNNZW1vcnlSYW5nZSBTY2F0dGVyZWRI
ZWFwQnVmZmVyOjpHZXROZXdCdWZmZXIoKSB7CisgIFBFUkZFVFRPX0NIRUNLKHdyaXRlcl8pOwor
ICBBZGp1c3RVc2VkU2l6ZU9mQ3VycmVudFNsaWNlKCk7CisKKyAgaWYgKGNhY2hlZF9zbGljZV8u
c3RhcnQoKSkgeworICAgIHNsaWNlc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShjYWNoZWRfc2xpY2Vf
KSk7CisgICAgUEVSRkVUVE9fRENIRUNLKCFjYWNoZWRfc2xpY2VfLnN0YXJ0KCkpOworICB9IGVs
c2UgeworICAgIHNsaWNlc18uZW1wbGFjZV9iYWNrKG5leHRfc2xpY2Vfc2l6ZV8pOworICB9Cisg
IG5leHRfc2xpY2Vfc2l6ZV8gPSBzdGQ6Om1pbihtYXhpbXVtX3NsaWNlX3NpemVfLCBuZXh0X3Ns
aWNlX3NpemVfICogMik7CisgIHJldHVybiBzbGljZXNfLmJhY2soKS5HZXRUb3RhbFJhbmdlKCk7
Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNjYXR0ZXJlZEhlYXBCdWZmZXI6OlN0aXRjaFNs
aWNlcygpIHsKKyAgQWRqdXN0VXNlZFNpemVPZkN1cnJlbnRTbGljZSgpOworICBzdGQ6OnZlY3Rv
cjx1aW50OF90PiBidWZmZXI7CisgIGZvciAoY29uc3QgYXV0byYgc2xpY2UgOiBzbGljZXNfKSB7
CisgICAgYXV0byB1c2VkX3JhbmdlID0gc2xpY2UuR2V0VXNlZFJhbmdlKCk7CisgICAgYnVmZmVy
Lmluc2VydChidWZmZXIuZW5kKCksIHVzZWRfcmFuZ2UuYmVnaW4sIHVzZWRfcmFuZ2UuZW5kKTsK
KyAgfQorICByZXR1cm4gYnVmZmVyOworfQorCitzdGQ6OnZlY3Rvcjxwcm90b3plcm86OkNvbnRp
Z3VvdXNNZW1vcnlSYW5nZT4gU2NhdHRlcmVkSGVhcEJ1ZmZlcjo6R2V0UmFuZ2VzKCkgeworICBB
ZGp1c3RVc2VkU2l6ZU9mQ3VycmVudFNsaWNlKCk7CisgIHN0ZDo6dmVjdG9yPHByb3RvemVybzo6
Q29udGlndW91c01lbW9yeVJhbmdlPiByYW5nZXM7CisgIGZvciAoY29uc3QgYXV0byYgc2xpY2Ug
OiBzbGljZXNfKQorICAgIHJhbmdlcy5wdXNoX2JhY2soc2xpY2UuR2V0VXNlZFJhbmdlKCkpOwor
ICByZXR1cm4gcmFuZ2VzOworfQorCit2b2lkIFNjYXR0ZXJlZEhlYXBCdWZmZXI6OkFkanVzdFVz
ZWRTaXplT2ZDdXJyZW50U2xpY2UoKSB7CisgIGlmICghc2xpY2VzXy5lbXB0eSgpKQorICAgIHNs
aWNlc18uYmFjaygpLnNldF91bnVzZWRfYnl0ZXMod3JpdGVyXy0+Ynl0ZXNfYXZhaWxhYmxlKCkp
OworfQorCitzaXplX3QgU2NhdHRlcmVkSGVhcEJ1ZmZlcjo6R2V0VG90YWxTaXplKCkgeworICBz
aXplX3QgdG90YWxfc2l6ZSA9IDA7CisgIGZvciAoYXV0byYgc2xpY2UgOiBzbGljZXNfKSB7Cisg
ICAgdG90YWxfc2l6ZSArPSBzbGljZS5zaXplKCk7CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NpemU7
Cit9CisKK3ZvaWQgU2NhdHRlcmVkSGVhcEJ1ZmZlcjo6UmVzZXQoKSB7CisgIGlmIChzbGljZXNf
LmVtcHR5KCkpCisgICAgcmV0dXJuOworICBjYWNoZWRfc2xpY2VfID0gc3RkOjptb3ZlKHNsaWNl
c18uZnJvbnQoKSk7CisgIGNhY2hlZF9zbGljZV8uQ2xlYXIoKTsKKyAgc2xpY2VzXy5jbGVhcigp
OworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gc291cmNlOiBzcmMvcHJvdG96ZXJvL3NjYXR0ZXJlZF9zdHJlYW1fbnVsbF9kZWxlZ2F0ZS5j
YworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90
b3plcm8vc2NhdHRlcmVkX3N0cmVhbV9udWxsX2RlbGVnYXRlLmgKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2Vk
IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwor
ICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo
ZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cisg
KgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAq
CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdy
aXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0
cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENP
TkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUg
dGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lv
bnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVm
IElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9TVFJFQU1fTlVMTF9ERUxFR0FU
RV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FUVEVSRURfU1RSRUFN
X05VTExfREVMRUdBVEVfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
ZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9jb250aWd1b3VzX21lbW9yeV9yYW5nZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJl
ZF9zdHJlYW1fd3JpdGVyLmgiCisKK25hbWVzcGFjZSBwcm90b3plcm8geworCitjbGFzcyBQRVJG
RVRUT19FWFBPUlQgU2NhdHRlcmVkU3RyZWFtV3JpdGVyTnVsbERlbGVnYXRlCisgICAgOiBwdWJs
aWMgU2NhdHRlcmVkU3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSB7CisgcHVibGljOgorICBleHBsaWNp
dCBTY2F0dGVyZWRTdHJlYW1Xcml0ZXJOdWxsRGVsZWdhdGUoc2l6ZV90IGNodW5rX3NpemUpOwor
ICB+U2NhdHRlcmVkU3RyZWFtV3JpdGVyTnVsbERlbGVnYXRlKCkgb3ZlcnJpZGU7CisKKyAgLy8g
cHJvdG96ZXJvOjpTY2F0dGVyZWRTdHJlYW1Xcml0ZXI6OkRlbGVnYXRlIGltcGxlbWVudGF0aW9u
LgorICBDb250aWd1b3VzTWVtb3J5UmFuZ2UgR2V0TmV3QnVmZmVyKCkgb3ZlcnJpZGU7CisKKyBw
cml2YXRlOgorICBjb25zdCBzaXplX3QgY2h1bmtfc2l6ZV87CisgIHN0ZDo6dW5pcXVlX3B0cjx1
aW50OF90W10+IGNodW5rXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2Vu
ZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FUVEVSRURfU1RSRUFNX05VTExf
REVMRUdBVEVfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBT
b3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwg
VmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmls
ZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRh
aW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNo
ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw
bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli
dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT
LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl
ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp
YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl
ciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX3N0cmVhbV9udWxsX2RlbGVnYXRlLmgi
CisKK25hbWVzcGFjZSBwcm90b3plcm8geworCisvLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTY2F0
dGVyZWRTdHJlYW1Xcml0ZXI6OkRlbGVnYXRlIHdoaWNoIGFsd2F5cyByZXR1cm5zCisvLyB0aGUg
c2FtZSBwaWVjZSBvZiBtZW1vcnkuCisvLyBUaGlzIGlzIHVzZWQgd2hlbiB3ZSBuZWVkIHRvIG5v
LW9wIHRoZSB3cml0ZXJzIChlLmcuIGR1cmluZyB0ZWFyZG93biBvciBpbgorLy8gY2FzZSBvZiBy
ZXNvdXJjZSBleGhhdXN0aW9uKSwgYXZvaWRpbmcgdGhhdCB0aGUgY2xpZW50cyBoYXZlIHRvIGRl
YWwgd2l0aAorLy8gbnVsbHB0ciBjaGVja3MuCitTY2F0dGVyZWRTdHJlYW1Xcml0ZXJOdWxsRGVs
ZWdhdGU6OlNjYXR0ZXJlZFN0cmVhbVdyaXRlck51bGxEZWxlZ2F0ZSgKKyAgICBzaXplX3QgY2h1
bmtfc2l6ZSkKKyAgICA6IGNodW5rX3NpemVfKGNodW5rX3NpemUpLAorICAgICAgY2h1bmtfKHN0
ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+KG5ldyB1aW50OF90W2NodW5rX3NpemVfXSkpIHt9CisK
K1NjYXR0ZXJlZFN0cmVhbVdyaXRlck51bGxEZWxlZ2F0ZTo6flNjYXR0ZXJlZFN0cmVhbVdyaXRl
ck51bGxEZWxlZ2F0ZSgpIHt9CisKK0NvbnRpZ3VvdXNNZW1vcnlSYW5nZSBTY2F0dGVyZWRTdHJl
YW1Xcml0ZXJOdWxsRGVsZWdhdGU6OkdldE5ld0J1ZmZlcigpIHsKKyAgcmV0dXJuIHtjaHVua18u
Z2V0KCksIGNodW5rXy5nZXQoKSArIGNodW5rX3NpemVffTsKK30KKworfSAgLy8gbmFtZXNwYWNl
IHByb3RvemVybworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3Byb3RvemVy
by9zY2F0dGVyZWRfc3RyZWFtX3dyaXRlci5jYworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBU
aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhl
IEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5
IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2Uu
CisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAg
IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVz
cyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29m
dHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9u
IGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBP
RiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5z
ZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAq
IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfc3RyZWFt
X3dyaXRlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNl
IHByb3RvemVybyB7CisKK1NjYXR0ZXJlZFN0cmVhbVdyaXRlcjo6RGVsZWdhdGU6On5EZWxlZ2F0
ZSgpIHt9CisKK1NjYXR0ZXJlZFN0cmVhbVdyaXRlcjo6U2NhdHRlcmVkU3RyZWFtV3JpdGVyKERl
bGVnYXRlKiBkZWxlZ2F0ZSkKKyAgICA6IGRlbGVnYXRlXyhkZWxlZ2F0ZSksCisgICAgICBjdXJf
cmFuZ2VfKHtudWxscHRyLCBudWxscHRyfSksCisgICAgICB3cml0ZV9wdHJfKG51bGxwdHIpIHt9
CisKK1NjYXR0ZXJlZFN0cmVhbVdyaXRlcjo6flNjYXR0ZXJlZFN0cmVhbVdyaXRlcigpIHt9CisK
K3ZvaWQgU2NhdHRlcmVkU3RyZWFtV3JpdGVyOjpSZXNldChDb250aWd1b3VzTWVtb3J5UmFuZ2Ug
cmFuZ2UpIHsKKyAgd3JpdHRlbl9wcmV2aW91c2x5XyArPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4o
d3JpdGVfcHRyXyAtIGN1cl9yYW5nZV8uYmVnaW4pOworICBjdXJfcmFuZ2VfID0gcmFuZ2U7Cisg
IHdyaXRlX3B0cl8gPSByYW5nZS5iZWdpbjsKKyAgUEVSRkVUVE9fRENIRUNLKCF3cml0ZV9wdHJf
IHx8IHdyaXRlX3B0cl8gPCBjdXJfcmFuZ2VfLmVuZCk7Cit9CisKK3ZvaWQgU2NhdHRlcmVkU3Ry
ZWFtV3JpdGVyOjpFeHRlbmQoKSB7CisgIFJlc2V0KGRlbGVnYXRlXy0+R2V0TmV3QnVmZmVyKCkp
OworfQorCit2b2lkIFNjYXR0ZXJlZFN0cmVhbVdyaXRlcjo6V3JpdGVCeXRlc1Nsb3dQYXRoKGNv
bnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IGJ5dGVzX2xlZnQgPSBzaXplOworICB3
aGlsZSAoYnl0ZXNfbGVmdCA+IDApIHsKKyAgICBpZiAod3JpdGVfcHRyXyA+PSBjdXJfcmFuZ2Vf
LmVuZCkKKyAgICAgIEV4dGVuZCgpOworICAgIGNvbnN0IHNpemVfdCBidXJzdF9zaXplID0gc3Rk
OjptaW4oYnl0ZXNfYXZhaWxhYmxlKCksIGJ5dGVzX2xlZnQpOworICAgIFdyaXRlQnl0ZXNVbnNh
ZmUoc3JjLCBidXJzdF9zaXplKTsKKyAgICBieXRlc19sZWZ0IC09IGJ1cnN0X3NpemU7CisgICAg
c3JjICs9IGJ1cnN0X3NpemU7CisgIH0KK30KKworLy8gVE9ETyhwcmltaWFubyk6IHBlcmYgb3B0
aW1pemF0aW9uOiBJIHN1c3BlY3QgdGhhdCBhdCB0aGUgZW5kIHRoaXMgd2lsbCBhbHdheXMKKy8v
IGJlIGNhbGxlZCB3aXRoIHxzaXplfCA9PSA0LCBpbiB3aGljaCBjYXNlIHdlIG1pZ2h0IGp1c3Qg
aGFyZGNvZGUgaXQuCit1aW50OF90KiBTY2F0dGVyZWRTdHJlYW1Xcml0ZXI6OlJlc2VydmVCeXRl
cyhzaXplX3Qgc2l6ZSkgeworICBpZiAod3JpdGVfcHRyXyArIHNpemUgPiBjdXJfcmFuZ2VfLmVu
ZCkgeworICAgIC8vIEFzc3VtZSB0aGUgcmVzZXJ2YXRpb25zIGFyZSBhbHdheXMgPCBEZWxlZ2F0
ZTo6R2V0TmV3QnVmZmVyKCkuc2l6ZSgpLAorICAgIC8vIHNvIHRoYXQgb25lIHNpbmdsZSBjYWxs
IHRvIEV4dGVuZCgpIHdpbGwgZGVmaW5pdGVseSBnaXZlIGVub3VnaCBoZWFkcm9vbS4KKyAgICBF
eHRlbmQoKTsKKyAgICBQRVJGRVRUT19EQ0hFQ0sod3JpdGVfcHRyXyArIHNpemUgPD0gY3VyX3Jh
bmdlXy5lbmQpOworICB9CisgIHVpbnQ4X3QqIGJlZ2luID0gd3JpdGVfcHRyXzsKKyAgd3JpdGVf
cHRyXyArPSBzaXplOworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgIG1lbXNldChiZWdp
biwgMCwgc2l6ZSk7CisjZW5kaWYKKyAgcmV0dXJuIGJlZ2luOworfQorCit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG96ZXJvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvcHJvdG96
ZXJvL3N0YXRpY19idWZmZXIuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGlu
Y2x1ZGUvcGVyZmV0dG8vcHJvdG96ZXJvL3N0YXRpY19idWZmZXIuaAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5z
ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7
CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgg
dGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQK
KyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAor
ICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4g
d3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRp
c3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1Ig
Q09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNl
ZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNz
aW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5k
ZWYgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fU1RBVElDX0JVRkZFUl9IXworI2RlZmluZSBJ
TkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TVEFUSUNfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxt
ZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9z
Y2F0dGVyZWRfc3RyZWFtX3dyaXRlci5oIgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKKworY2xh
c3MgTWVzc2FnZTsKKworLy8gQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgU2NhdHRlcmVkU3Ry
ZWFtV3JpdGVyOjpEZWxlZ2F0ZSBiYWNrZWQgYnkgYQorLy8gZml4ZWQtc2l6ZSBidWZmZXIuIEl0
IGRvZXNuJ3Qgc3VwcG9ydCBleHBhbnNpb24uIFRoZSBjYWxsZXIgbmVlZHMgdG8gZW5zdXJlCisv
LyB0byBuZXZlciB3cml0ZSBtb3JlIHRoYW4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4gV2lsbCBD
SEVDSygpIG90aGVyd2lzZS4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBTdGF0aWNCdWZmZXJEZWxl
Z2F0ZQorICAgIDogcHVibGljIFNjYXR0ZXJlZFN0cmVhbVdyaXRlcjo6RGVsZWdhdGUgeworIHB1
YmxpYzoKKyAgU3RhdGljQnVmZmVyRGVsZWdhdGUodWludDhfdCogYnVmLCBzaXplX3QgbGVuKSA6
IHJhbmdlX3tidWYsIGJ1ZiArIGxlbn0ge30KKyAgflN0YXRpY0J1ZmZlckRlbGVnYXRlKCkgb3Zl
cnJpZGU7CisKKyAgLy8gU2NhdHRlcmVkU3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSBpbXBsZW1lbnRh
dGlvbi4KKyAgQ29udGlndW91c01lbW9yeVJhbmdlIEdldE5ld0J1ZmZlcigpIG92ZXJyaWRlOwor
CisgIENvbnRpZ3VvdXNNZW1vcnlSYW5nZSBjb25zdCByYW5nZV87CisgIGJvb2wgZ2V0X25ld19i
dWZmZXJfY2FsbGVkX29uY2VfID0gZmFsc2U7Cit9OworCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8g
Y3JlYXRlIHByb3RvemVybyBtZXNzYWdlcyBiYWNrZWQgYnkgYSBmaXhlZC1zaXplIGJ1ZmZlcgor
Ly8gaW4gb25lIGxpbmUuIFlvdSBjYW4gd3JpdGU6CisvLyAgIHByb3RvemVybzo6U3RhdGljPHBy
b3RvemVybzo6TXlNZXNzYWdlPiBtc2coYnVmLmRhdGEoKSwgYnVmLnNpemUoKSk7CisvLyAgIG1z
Zy0+c2V0X3N0dWZmKC4uLik7CisvLyAgIHNpemVfdCBieXRlc19lbmNvZGVkID0gbXNnLkZpbmFs
aXplKCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCAvKiBwcm90b3plcm86Ok1lc3NhZ2UgKi8+Citj
bGFzcyBTdGF0aWNCdWZmZXJlZCB7CisgcHVibGljOgorICBTdGF0aWNCdWZmZXJlZCh2b2lkKiBi
dWYsIHNpemVfdCBsZW4pCisgICAgICA6IGRlbGVnYXRlXyhyZWludGVycHJldF9jYXN0PHVpbnQ4
X3QqPihidWYpLCBsZW4pLCB3cml0ZXJfKCZkZWxlZ2F0ZV8pIHsKKyAgICBtc2dfLlJlc2V0KCZ3
cml0ZXJfKTsKKyAgfQorCisgIC8vIFRoaXMgY2FuJ3QgYmUgbmVpdGhlciBjb3BpZWQgbm9yIG1v
dmVkIGJlY2F1c2UgTWVzc2FnZSBoYW5kcyBvdXQgcG9pbnRlcnMKKyAgLy8gdG8gaXRzZWxmIHdo
ZW4gY3JlYXRpbmcgc3VibWVzc2FnZXMuCisgIFN0YXRpY0J1ZmZlcmVkKGNvbnN0IFN0YXRpY0J1
ZmZlcmVkJikgPSBkZWxldGU7CisgIFN0YXRpY0J1ZmZlcmVkJiBvcGVyYXRvcj0oY29uc3QgU3Rh
dGljQnVmZmVyZWQmKSA9IGRlbGV0ZTsKKyAgU3RhdGljQnVmZmVyZWQoU3RhdGljQnVmZmVyZWQm
JikgPSBkZWxldGU7CisgIFN0YXRpY0J1ZmZlcmVkJiBvcGVyYXRvcj0oU3RhdGljQnVmZmVyZWQm
JikgPSBkZWxldGU7CisKKyAgVCogZ2V0KCkgeyByZXR1cm4gJm1zZ187IH0KKyAgVCogb3BlcmF0
b3ItPigpIHsgcmV0dXJuICZtc2dfOyB9CisKKyAgLy8gVGhlIGxhY2sgb2YgYSBzaXplKCkgbWV0
aG9kIGlzIGRlbGliZXJhdGUuIEl0J3MgdG8gcHJldmVudCB0aGF0IG9uZQorICAvLyBhY2NpZGVu
dGFsbHkgY2FsbHMgc2l6ZSgpIGJlZm9yZSBGaW5hbGl6ZSgpLgorCisgIC8vIFJldHVybnMgdGhl
IG51bWJlciBvZiBlbmNvZGVkIGJ5dGVzICg8PSB0aGUgc2l6ZSBwYXNzZWQgaW4gdGhlIGN0b3Ip
LgorICBzaXplX3QgRmluYWxpemUoKSB7CisgICAgbXNnXy5GaW5hbGl6ZSgpOworICAgIHJldHVy
biBzdGF0aWNfY2FzdDxzaXplX3Q+KHdyaXRlcl8ud3JpdGVfcHRyKCkgLSBkZWxlZ2F0ZV8ucmFu
Z2VfLmJlZ2luKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3RhdGljQnVmZmVyRGVsZWdhdGUgZGVs
ZWdhdGVfOworICBTY2F0dGVyZWRTdHJlYW1Xcml0ZXIgd3JpdGVyXzsKKyAgVCBtc2dfOworfTsK
KworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBzdGFjay1iYXNlZCBwcm90b3plcm8gbWVz
c2FnZXMgaW4gb25lIGxpbmUuCisvLyBZb3UgY2FuIHdyaXRlOgorLy8gICBwcm90b3plcm86OlN0
YWNrQnVmZmVyZWQ8cHJvdG96ZXJvOjpNeU1lc3NhZ2UsIDE2PiBtc2c7CisvLyAgIG1zZy0+c2V0
X3N0dWZmKC4uLik7CisvLyAgIHNpemVfdCBieXRlc19lbmNvZGVkID0gbXNnLkZpbmFsaXplKCk7
Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCAvKiBwcm90b3plcm86Ok1lc3NhZ2UgKi8sIHNpemVfdCBO
PgorY2xhc3MgU3RhY2tCdWZmZXJlZCA6IHB1YmxpYyBTdGF0aWNCdWZmZXJlZDxUPiB7CisgcHVi
bGljOgorICBTdGFja0J1ZmZlcmVkKCkgOiBTdGF0aWNCdWZmZXJlZDxUPigmYnVmX1swXSwgTikg
e30KKworIHByaXZhdGU6CisgIHVpbnQ4X3QgYnVmX1tOXTsgIC8vIERlbGliZXJhdGVseSBub3Qg
aW5pdGlhbGl6ZWQuCit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKKyNlbmRpZiAg
Ly8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fU1RBVElDX0JVRkZFUl9IXworLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICog
TGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNl
bnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNl
IHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vu
c2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNF
LTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQg
dG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNl
IGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJ
RVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4K
KyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBw
ZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9zdGF0aWNfYnVmZmVyLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKKwor
U3RhdGljQnVmZmVyRGVsZWdhdGU6On5TdGF0aWNCdWZmZXJEZWxlZ2F0ZSgpID0gZGVmYXVsdDsK
KworQ29udGlndW91c01lbW9yeVJhbmdlIFN0YXRpY0J1ZmZlckRlbGVnYXRlOjpHZXROZXdCdWZm
ZXIoKSB7CisgIGlmIChnZXRfbmV3X2J1ZmZlcl9jYWxsZWRfb25jZV8pIHsKKyAgICAvLyBUaGlz
IGlzIHRoZSAybmQgdGltZSBHZXROZXdCdWZmZXIgaXMgY2FsbGVkLiBUaGUgZXN0aW1hdGUgaXMg
d3JvbmcuIFdlCisgICAgLy8gc2hvdWxkbid0IHRyeSB0byBncm93IHRoZSBidWZmZXIgYWZ0ZXIg
dGhlIGluaXRpYWwgY2FsbC4KKyAgICBQRVJGRVRUT19GQVRBTCgiU3RhdGljIGJ1ZmZlciB0b28g
c21hbGwiKTsKKyAgfQorICBnZXRfbmV3X2J1ZmZlcl9jYWxsZWRfb25jZV8gPSB0cnVlOworICBy
ZXR1cm4gcmFuZ2VfOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisvLyBnZW5fYW1h
bGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvcHJvdG96ZXJvL3ZpcnR1YWxfZGVzdHJ1Y3RvcnMu
Y2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vcHJv
dG96ZXJvL2NwcF9tZXNzYWdlX29iai5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBB
bmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBh
Y2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90
IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAq
IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJl
cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy
ZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFO
WSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZv
ciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGlt
aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZF
VFRPX1BST1RPWkVST19DUFBfTUVTU0FHRV9PQkpfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRU
T19QUk9UT1pFUk9fQ1BQX01FU1NBR0VfT0JKX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwor
I2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFj
ZSBwcm90b3plcm8geworCisvLyBCYXNlIGNsYXNzIGZvciBnZW5lcmF0ZWQgLmdlbi5oIGNsYXNz
ZXMsIHdoaWNoIGFyZSBmdWxsIEMrKyBvYmplY3RzIHRoYXQKKy8vIHN1cHBvcnQgYm90aCBzZXIg
YW5kIGRlc2VyaWFsaXphdGlvbiAoYnV0IGFyZSBub3QgemVyby1jb3B5KS4KKy8vIFRoaXMgaXMg
b25seSB1c2VkIGJ5IHRoZSAiY3BwIiB0YXJnZXRzIG5vdCB0aGUgInBiemVybyIgb25lcy4KK2Ns
YXNzIFBFUkZFVFRPX0VYUE9SVCBDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwg
fkNwcE1lc3NhZ2VPYmooKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmlu
ZygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVB
c0FycmF5KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qg
dm9pZCosIHNpemVfdCkgPSAwOworCisgIGJvb2wgUGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6
c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gUGFyc2VGcm9tQXJyYXkoc3RyLmRhdGEoKSwgc3Ry
LnNpemUoKSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlm
ICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19DUFBfTUVTU0FHRV9PQkpfSF8KKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElD
RU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdy
ZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj
ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJS
QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp
ZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p
bmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAq
LworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisKK25hbWVzcGFjZSBwcm90b3plcm8geworCitDcHBN
ZXNzYWdlT2JqOjp+Q3BwTWVzc2FnZU9iaigpID0gZGVmYXVsdDsKKworfSAgLy8gbmFtZXNwYWNl
IHByb3RvemVybworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by9jb21tb24vYW5kcm9pZF9sb2dfY29uc3RhbnRzLmdlbi5jYworLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24vYW5kcm9pZF9s
b2dfY29uc3RhbnRzLmdlbi5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNs
dWRlL3BlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQg
dW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cisg
KiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhl
IExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAq
CisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoK
KyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3Jp
dGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3Ry
aWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09O
RElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0
aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9u
cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYg
SU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fQ09QWUFCTEVfUFRSX0hfCisjZGVmaW5lIElOQ0xV
REVfUEVSRkVUVE9fUFJPVE9aRVJPX0NPUFlBQkxFX1BUUl9IXworCisjaW5jbHVkZSA8bWVtb3J5
PgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKKworLy8gVGhpcyBjbGFzcyBpcyBlc3NlbnRpYWxs
eSBhIHN0ZDo6dmVjdG9yPFQ+IG9mIGZpeGVkIHNpemUgPSAxLgorLy8gSXQncyBhIHBvaW50ZXIg
d3JhcHBlciB3aXRoIGRlZXAgY29weWluZyBhbmQgZGVlcCBlcXVhbGl0eSBjb21wYXJpc29uLgor
Ly8gQXQgYWxsIGVmZmVjdHMgdGhpcyB3cmFwcGVyIGJlaGF2ZXMgbGlrZSB0aGUgdW5kZXJseWlu
ZyBULCB3aXRoIHRoZSBleGNlcHRpb24KKy8vIG9mIHRoZSBoZWFwIGluZGlyZWN0aW9uLgorLy8g
Q29udmVyc2VseSB0byBhIHN0ZDo6dW5pcXVlX3B0ciwgdGhlIHBvaW50ZXIgd2lsbCBiZSBhbHdh
eXMgdmFsaWQsIG5ldmVyCisvLyBudWxsLiBUaGUgcHJvYmxlbSBpdCBzb2x2ZXMgaXMgdGhlIGZv
bGxvd2luZzogd2hlbiBnZW5lcmF0aW5nIEMrKyBjbGFzc2VzCisvLyBmcm9tIHByb3RvIGZpbGVz
LCB3ZSB3YW50IHRvIGtlZXAgZWFjaCBoZWFkZXIgaGVybWV0aWMgKGkuZS4gbm90ICNpbmNsdWRl
CisvLyBoZWFkZXJzIG9mIGRlcGVuZGVudCB0eXBlcykuIEFzIHN1Y2ggd2UgY2FuJ3QgZGlyZWN0
bHkgaW5zdGFudGlhdGUgVAorLy8gZmllbGQgbWVtYmVycyBidXQgd2UgY2FuIGluc3RlYWQgcmVs
eSBvbiBwb2ludGVycywgc28gb25seSB0aGUgLmNjIGZpbGUgbmVlZHMKKy8vIHRvIHNlZSB0aGUg
YWN0dWFsIGRlZmluaXRpb24gb2YgVC4gSWYgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIHdlcmUgbW92
ZS1vbmx5IHdlCisvLyBjb3VsZCBqdXN0IHVzZSBhIHVuaXF1ZV9wdHIgdGhlcmUuIEJ1dCB0aGV5
IGFyZW4ndCwgaGVuY2UgdGhpcyB3cmFwcGVyLgorLy8gQ29udmVyZXNlbHkgdG8gdW5pcXVlX3B0
ciwgdGhpcyB3cmFwcGVyOgorLy8gLSBEZWZhdWx0IGNvbnN0cnVjdHMgdGhlIFQgaW5zdGFuY2Ug
aW4gaXRzIGNvbnN0cnVjdG9yLgorLy8gLSBJbXBsZW1lbnRzIGRlZXAgY29tcGFyaXNvbiBpbiBv
cGVyYXRvcj09IGluc3RlYWQgb2YgcG9pbnRlciBjb21wYXJpc29uLgordGVtcGxhdGUgPHR5cGVu
YW1lIFQ+CitjbGFzcyBDb3B5YWJsZVB0ciB7CisgcHVibGljOgorICBDb3B5YWJsZVB0cigpIDog
cHRyXyhuZXcgVCgpKSB7fQorICB+Q29weWFibGVQdHIoKSA9IGRlZmF1bHQ7CisKKyAgLy8gQ29w
eSBvcGVyYXRvcnMuCisgIENvcHlhYmxlUHRyKGNvbnN0IENvcHlhYmxlUHRyJiBvdGhlcikgOiBw
dHJfKG5ldyBUKCpvdGhlci5wdHJfKSkge30KKyAgQ29weWFibGVQdHImIG9wZXJhdG9yPShjb25z
dCBDb3B5YWJsZVB0ciYgb3RoZXIpIHsKKyAgICAqcHRyXyA9ICpvdGhlci5wdHJfOworICAgIHJl
dHVybiAqdGhpczsKKyAgfQorCisgIC8vIE1vdmUgb3BlcmF0b3JzLgorICBDb3B5YWJsZVB0cihD
b3B5YWJsZVB0ciYmIG90aGVyKSBub2V4Y2VwdCA6IHB0cl8oc3RkOjptb3ZlKG90aGVyLnB0cl8p
KSB7CisgICAgb3RoZXIucHRyXy5yZXNldChuZXcgVCgpKTsKKyAgfQorCisgIENvcHlhYmxlUHRy
JiBvcGVyYXRvcj0oQ29weWFibGVQdHImJiBvdGhlcikgeworICAgIHB0cl8gPSBzdGQ6Om1vdmUo
b3RoZXIucHRyXyk7CisgICAgb3RoZXIucHRyXy5yZXNldChuZXcgVCgpKTsKKyAgICByZXR1cm4g
KnRoaXM7CisgIH0KKworICBUKiBnZXQoKSB7IHJldHVybiBwdHJfLmdldCgpOyB9CisgIGNvbnN0
IFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl8uZ2V0KCk7IH0KKworICBUKiBvcGVyYXRvci0+
KCkgeyByZXR1cm4gcHRyXy5nZXQoKTsgfQorICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3Qg
eyByZXR1cm4gcHRyXy5nZXQoKTsgfQorCisgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICpwdHJf
OyB9CisgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpwdHJfOyB9CisKKyAg
ZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb3B5YWJsZVB0ciYgbGhzLCBjb25zdCBDb3B5
YWJsZVB0ciYgcmhzKSB7CisgICAgcmV0dXJuICpsaHMgPT0gKnJoczsKKyAgfQorCisgIGZyaWVu
ZCBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29weWFibGVQdHImIGxocywgY29uc3QgQ29weWFibGVQ
dHImIHJocykgeworICAgIC8vIEluIHRoZW9yeSB0aGUgdW5kZXJseWluZyB0eXBlIG1pZ2h0IGhh
dmUgYSBzcGVjaWFsIG9wZXJhdG9yIT0KKyAgICAvLyBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBu
b3QganVzdCAhKHggPT0geSkuIFJlc3BlY3QgdGhhdC4KKyAgICByZXR1cm4gKmxocyAhPSAqcmhz
OworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcHRyXzsKK307CisKK30g
IC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1BS
T1RPWkVST19DT1BZQUJMRV9QVFJfSF8KKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5
IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19DT01NT05fQU5EUk9JRF9MT0dfQ09OU1RBTlRTX1BST1RPX0NQUF9IXworI2RlZmlu
ZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9BTkRST0lEX0xPR19DT05T
VEFOVFNfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRz
ZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBl
X3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdl
biB7CitlbnVtIEFuZHJvaWRMb2dJZCA6IGludDsKK2VudW0gQW5kcm9pZExvZ1ByaW9yaXR5IDog
aW50OworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9
ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2Fn
ZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25h
bWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitlbnVtIEFuZHJvaWRMb2dJZCA6IGlu
dCB7CisgIExJRF9ERUZBVUxUID0gMCwKKyAgTElEX1JBRElPID0gMSwKKyAgTElEX0VWRU5UUyA9
IDIsCisgIExJRF9TWVNURU0gPSAzLAorICBMSURfQ1JBU0ggPSA0LAorICBMSURfU1RBVFMgPSA1
LAorICBMSURfU0VDVVJJVFkgPSA2LAorICBMSURfS0VSTkVMID0gNywKK307CitlbnVtIEFuZHJv
aWRMb2dQcmlvcml0eSA6IGludCB7CisgIFBSSU9fVU5TUEVDSUZJRUQgPSAwLAorICBQUklPX1VO
VVNFRCA9IDEsCisgIFBSSU9fVkVSQk9TRSA9IDIsCisgIFBSSU9fREVCVUcgPSAzLAorICBQUklP
X0lORk8gPSA0LAorICBQUklPX1dBUk4gPSA1LAorICBQUklPX0VSUk9SID0gNiwKKyAgUFJJT19G
QVRBTCA9IDcsCit9OworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2Ug
cHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9T
X1BST1RPU19QRVJGRVRUT19DT01NT05fQU5EUk9JRF9MT0dfQ09OU1RBTlRTX1BST1RPX0NQUF9I
XworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rl
ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5l
cmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBw
dXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9u
L2FuZHJvaWRfbG9nX2NvbnN0YW50cy5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25h
bWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEg
R0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4v
cHJvdG9zL3BlcmZldHRvL2NvbW1vbi9idWlsdGluX2Nsb2NrLmdlbi5jYworLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24vYnVpbHRpbl9j
bG9jay5nZW4uaAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3Bw
Z2VuX3BsdWdpbgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1P
Tl9CVUlMVElOX0NMT0NLX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX0NPTU1PTl9CVUlMVElOX0NMT0NLX1BST1RPX0NQUF9IXworCisjaW5jbHVk
ZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNs
dWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmou
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworZW51bSBCdWlsdGluQ2xvY2sgOiBpbnQ7
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8v
IG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOwor
fSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNw
YWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2VudW0gQnVpbHRpbkNsb2NrIDogaW50IHsK
KyAgQlVJTFRJTl9DTE9DS19VTktOT1dOID0gMCwKKyAgQlVJTFRJTl9DTE9DS19SRUFMVElNRSA9
IDEsCisgIEJVSUxUSU5fQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFID0gMiwKKyAgQlVJTFRJTl9DTE9D
S19NT05PVE9OSUMgPSAzLAorICBCVUlMVElOX0NMT0NLX01PTk9UT05JQ19DT0FSU0UgPSA0LAor
ICBCVUlMVElOX0NMT0NLX01PTk9UT05JQ19SQVcgPSA1LAorICBCVUlMVElOX0NMT0NLX0JPT1RU
SU1FID0gNiwKKyAgQlVJTFRJTl9DTE9DS19NQVhfSUQgPSA2MywKK307Cit9ICAvLyBuYW1lc3Bh
Y2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4K
KworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9CVUlM
VElOX0NMT0NLX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmll
bGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8g
RE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3By
YWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQg
Ii1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
cm90b3MvcGVyZmV0dG8vY29tbW9uL2J1aWx0aW5fY2xvY2suZ2VuLmgiCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2Ug
Z2VuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24vY29tbWl0X2RhdGFfcmVxdWVzdC5n
ZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vY29tbW9uL2NvbW1pdF9kYXRhX3JlcXVlc3QuZ2VuLmgKKy8vIERPIE5PVCBFRElULiBBdXRv
Z2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fQ09NTUlUX0RBVEFfUkVRVUVTVF9QUk9UT19DUFBf
SF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fQ09NTUlU
X0RBVEFfUkVRVUVTVF9QUk9UT19DUFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1
ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1
ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4
cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1l
c3BhY2UgZ2VuIHsKK2NsYXNzIENvbW1pdERhdGFSZXF1ZXN0OworY2xhc3MgQ29tbWl0RGF0YVJl
cXVlc3RfQ2h1bmtUb1BhdGNoOworY2xhc3MgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNo
X1BhdGNoOworY2xhc3MgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlOworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2Ug
Z2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVz
cGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mg
eworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBDb21taXREYXRhUmVx
dWVzdCA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICB1
c2luZyBDaHVua3NUb01vdmUgPSBDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmU7CisgIHVz
aW5nIENodW5rVG9QYXRjaCA9IENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaDsKKyAgZW51
bSBGaWVsZE51bWJlcnMgeworICAgIGtDaHVua3NUb01vdmVGaWVsZE51bWJlciA9IDEsCisgICAg
a0NodW5rc1RvUGF0Y2hGaWVsZE51bWJlciA9IDIsCisgICAga0ZsdXNoUmVxdWVzdElkRmllbGRO
dW1iZXIgPSAzLAorICB9OworCisgIENvbW1pdERhdGFSZXF1ZXN0KCk7CisgIH5Db21taXREYXRh
UmVxdWVzdCgpIG92ZXJyaWRlOworICBDb21taXREYXRhUmVxdWVzdChDb21taXREYXRhUmVxdWVz
dCYmKSBub2V4Y2VwdDsKKyAgQ29tbWl0RGF0YVJlcXVlc3QmIG9wZXJhdG9yPShDb21taXREYXRh
UmVxdWVzdCYmKTsKKyAgQ29tbWl0RGF0YVJlcXVlc3QoY29uc3QgQ29tbWl0RGF0YVJlcXVlc3Qm
KTsKKyAgQ29tbWl0RGF0YVJlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBDb21taXREYXRhUmVxdWVz
dCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29tbWl0RGF0YVJlcXVlc3QmKSBjb25zdDsK
KyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbW1pdERhdGFSZXF1ZXN0JiBvdGhlcikgY29uc3Qg
eyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNv
bnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0
cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVB
c0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpN
ZXNzYWdlKikgY29uc3Q7CisKKyAgaW50IGNodW5rc190b19tb3ZlX3NpemUoKSBjb25zdCB7IHJl
dHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNodW5rc190b19tb3ZlXy5zaXplKCkpOyB9CisgIGNvbnN0
IHN0ZDo6dmVjdG9yPENvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZT4mIGNodW5rc190b19t
b3ZlKCkgY29uc3QgeyByZXR1cm4gY2h1bmtzX3RvX21vdmVfOyB9CisgIHN0ZDo6dmVjdG9yPENv
bW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZT4qIG11dGFibGVfY2h1bmtzX3RvX21vdmUoKSB7
IHJldHVybiAmY2h1bmtzX3RvX21vdmVfOyB9CisgIHZvaWQgY2xlYXJfY2h1bmtzX3RvX21vdmUo
KSB7IGNodW5rc190b19tb3ZlXy5jbGVhcigpOyB9CisgIENvbW1pdERhdGFSZXF1ZXN0X0NodW5r
c1RvTW92ZSogYWRkX2NodW5rc190b19tb3ZlKCkgeyBjaHVua3NfdG9fbW92ZV8uZW1wbGFjZV9i
YWNrKCk7IHJldHVybiAmY2h1bmtzX3RvX21vdmVfLmJhY2soKTsgfQorCisgIGludCBjaHVua3Nf
dG9fcGF0Y2hfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY2h1bmtzX3Rv
X3BhdGNoXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbW1pdERhdGFSZXF1ZXN0
X0NodW5rVG9QYXRjaD4mIGNodW5rc190b19wYXRjaCgpIGNvbnN0IHsgcmV0dXJuIGNodW5rc190
b19wYXRjaF87IH0KKyAgc3RkOjp2ZWN0b3I8Q29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNo
PiogbXV0YWJsZV9jaHVua3NfdG9fcGF0Y2goKSB7IHJldHVybiAmY2h1bmtzX3RvX3BhdGNoXzsg
fQorICB2b2lkIGNsZWFyX2NodW5rc190b19wYXRjaCgpIHsgY2h1bmtzX3RvX3BhdGNoXy5jbGVh
cigpOyB9CisgIENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaCogYWRkX2NodW5rc190b19w
YXRjaCgpIHsgY2h1bmtzX3RvX3BhdGNoXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZjaHVua3Nf
dG9fcGF0Y2hfLmJhY2soKTsgfQorCisgIGJvb2wgaGFzX2ZsdXNoX3JlcXVlc3RfaWQoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICB1aW50NjRfdCBmbHVzaF9yZXF1ZXN0X2lk
KCkgY29uc3QgeyByZXR1cm4gZmx1c2hfcmVxdWVzdF9pZF87IH0KKyAgdm9pZCBzZXRfZmx1c2hf
cmVxdWVzdF9pZCh1aW50NjRfdCB2YWx1ZSkgeyBmbHVzaF9yZXF1ZXN0X2lkXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPENvbW1pdERh
dGFSZXF1ZXN0X0NodW5rc1RvTW92ZT4gY2h1bmtzX3RvX21vdmVfOworICBzdGQ6OnZlY3RvcjxD
b21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2g+IGNodW5rc190b19wYXRjaF87CisgIHVpbnQ2
NF90IGZsdXNoX3JlcXVlc3RfaWRfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25v
d24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZl
cnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOwor
CisgIHN0ZDo6Yml0c2V0PDQ+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRP
X0VYUE9SVCBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2ggOiBwdWJsaWMgOjpwcm90b3pl
cm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgUGF0Y2ggPSBDb21taXREYXRh
UmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2g7CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBr
VGFyZ2V0QnVmZmVyRmllbGROdW1iZXIgPSAxLAorICAgIGtXcml0ZXJJZEZpZWxkTnVtYmVyID0g
MiwKKyAgICBrQ2h1bmtJZEZpZWxkTnVtYmVyID0gMywKKyAgICBrUGF0Y2hlc0ZpZWxkTnVtYmVy
ID0gNCwKKyAgICBrSGFzTW9yZVBhdGNoZXNGaWVsZE51bWJlciA9IDUsCisgIH07CisKKyAgQ29t
bWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoKCk7CisgIH5Db21taXREYXRhUmVxdWVzdF9DaHVu
a1RvUGF0Y2goKSBvdmVycmlkZTsKKyAgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoKENv
bW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaCYmKSBub2V4Y2VwdDsKKyAgQ29tbWl0RGF0YVJl
cXVlc3RfQ2h1bmtUb1BhdGNoJiBvcGVyYXRvcj0oQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1Bh
dGNoJiYpOworICBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2goY29uc3QgQ29tbWl0RGF0
YVJlcXVlc3RfQ2h1bmtUb1BhdGNoJik7CisgIENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRj
aCYgb3BlcmF0b3I9KGNvbnN0IENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaCYpOworICBi
b29sIG9wZXJhdG9yPT0oY29uc3QgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoJikgY29u
c3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0
Y2gmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wg
UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3Ry
aW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVp
bnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxp
emUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc190YXJnZXRfYnVm
ZmVyKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDMyX3QgdGFyZ2V0
X2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIHRhcmdldF9idWZmZXJfOyB9CisgIHZvaWQgc2V0X3Rh
cmdldF9idWZmZXIodWludDMyX3QgdmFsdWUpIHsgdGFyZ2V0X2J1ZmZlcl8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfd3JpdGVyX2lkKCkgY29uc3QgeyByZXR1
cm4gX2hhc19maWVsZF9bMl07IH0KKyAgdWludDMyX3Qgd3JpdGVyX2lkKCkgY29uc3QgeyByZXR1
cm4gd3JpdGVyX2lkXzsgfQorICB2b2lkIHNldF93cml0ZXJfaWQodWludDMyX3QgdmFsdWUpIHsg
d3JpdGVyX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc19j
aHVua19pZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIHVpbnQzMl90IGNo
dW5rX2lkKCkgY29uc3QgeyByZXR1cm4gY2h1bmtfaWRfOyB9CisgIHZvaWQgc2V0X2NodW5rX2lk
KHVpbnQzMl90IHZhbHVlKSB7IGNodW5rX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7
IH0KKworICBpbnQgcGF0Y2hlc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50
PihwYXRjaGVzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbW1pdERhdGFSZXF1
ZXN0X0NodW5rVG9QYXRjaF9QYXRjaD4mIHBhdGNoZXMoKSBjb25zdCB7IHJldHVybiBwYXRjaGVz
XzsgfQorICBzdGQ6OnZlY3RvcjxDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2g+
KiBtdXRhYmxlX3BhdGNoZXMoKSB7IHJldHVybiAmcGF0Y2hlc187IH0KKyAgdm9pZCBjbGVhcl9w
YXRjaGVzKCkgeyBwYXRjaGVzXy5jbGVhcigpOyB9CisgIENvbW1pdERhdGFSZXF1ZXN0X0NodW5r
VG9QYXRjaF9QYXRjaCogYWRkX3BhdGNoZXMoKSB7IHBhdGNoZXNfLmVtcGxhY2VfYmFjaygpOyBy
ZXR1cm4gJnBhdGNoZXNfLmJhY2soKTsgfQorCisgIGJvb2wgaGFzX2hhc19tb3JlX3BhdGNoZXMo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s1XTsgfQorICBib29sIGhhc19tb3JlX3BhdGNo
ZXMoKSBjb25zdCB7IHJldHVybiBoYXNfbW9yZV9wYXRjaGVzXzsgfQorICB2b2lkIHNldF9oYXNf
bW9yZV9wYXRjaGVzKGJvb2wgdmFsdWUpIHsgaGFzX21vcmVfcGF0Y2hlc18gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDUpOyB9CisKKyBwcml2YXRlOgorICB1aW50MzJfdCB0YXJnZXRfYnVmZmVy
X3t9OworICB1aW50MzJfdCB3cml0ZXJfaWRfe307CisgIHVpbnQzMl90IGNodW5rX2lkX3t9Owor
ICBzdGQ6OnZlY3RvcjxDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2g+IHBhdGNo
ZXNfOworICBib29sIGhhc19tb3JlX3BhdGNoZXNfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNl
cnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGgg
ZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9m
aWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDY+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNz
IFBFUkZFVFRPX0VYUE9SVCBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2ggOiBw
dWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVs
ZE51bWJlcnMgeworICAgIGtPZmZzZXRGaWVsZE51bWJlciA9IDEsCisgICAga0RhdGFGaWVsZE51
bWJlciA9IDIsCisgIH07CisKKyAgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNo
KCk7CisgIH5Db21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2goKSBvdmVycmlkZTsK
KyAgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoKENvbW1pdERhdGFSZXF1ZXN0
X0NodW5rVG9QYXRjaF9QYXRjaCYmKSBub2V4Y2VwdDsKKyAgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1
bmtUb1BhdGNoX1BhdGNoJiBvcGVyYXRvcj0oQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNo
X1BhdGNoJiYpOworICBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2goY29uc3Qg
Q29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoJik7CisgIENvbW1pdERhdGFSZXF1
ZXN0X0NodW5rVG9QYXRjaF9QYXRjaCYgb3BlcmF0b3I9KGNvbnN0IENvbW1pdERhdGFSZXF1ZXN0
X0NodW5rVG9QYXRjaF9QYXRjaCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29tbWl0RGF0
YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShj
b25zdCBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2gmIG90aGVyKSBjb25zdCB7
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3Ry
aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19vZmZzZXQoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1sxXTsgfQorICB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBvZmZzZXRf
OyB9CisgIHZvaWQgc2V0X29mZnNldCh1aW50MzJfdCB2YWx1ZSkgeyBvZmZzZXRfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2RhdGEoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1syXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSgpIGNvbnN0IHsg
cmV0dXJuIGRhdGFfOyB9CisgIHZvaWQgc2V0X2RhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7IGRhdGFfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorICB2b2lkIHNldF9kYXRh
KGNvbnN0IHZvaWQqIHAsIHNpemVfdCBzKSB7IGRhdGFfLmFzc2lnbihyZWludGVycHJldF9jYXN0
PGNvbnN0IGNoYXIqPihwKSwgcyk7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToK
KyAgdWludDMyX3Qgb2Zmc2V0X3t9OworICBzdGQ6OnN0cmluZyBkYXRhX3t9OworCisgIC8vIEFs
bG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0
eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3Ry
aW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwzPiBfaGFzX2ZpZWxkX3t9Owor
fTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9N
b3ZlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVu
dW0gRmllbGROdW1iZXJzIHsKKyAgICBrUGFnZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrQ2h1bmtG
aWVsZE51bWJlciA9IDIsCisgICAga1RhcmdldEJ1ZmZlckZpZWxkTnVtYmVyID0gMywKKyAgfTsK
KworICBDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmUoKTsKKyAgfkNvbW1pdERhdGFSZXF1
ZXN0X0NodW5rc1RvTW92ZSgpIG92ZXJyaWRlOworICBDb21taXREYXRhUmVxdWVzdF9DaHVua3NU
b01vdmUoQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlJiYpIG5vZXhjZXB0OworICBDb21t
aXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmUmIG9wZXJhdG9yPShDb21taXREYXRhUmVxdWVzdF9D
aHVua3NUb01vdmUmJik7CisgIENvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZShjb25zdCBD
b21taXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmUmKTsKKyAgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1
bmtzVG9Nb3ZlJiBvcGVyYXRvcj0oY29uc3QgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3Zl
Jik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01v
dmUmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbW1pdERhdGFSZXF1ZXN0X0No
dW5rc1RvTW92ZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisK
KyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAg
c3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2
ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lk
IFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3Bh
Z2UoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50MzJfdCBwYWdlKCkg
Y29uc3QgeyByZXR1cm4gcGFnZV87IH0KKyAgdm9pZCBzZXRfcGFnZSh1aW50MzJfdCB2YWx1ZSkg
eyBwYWdlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19jaHVu
aygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIHVpbnQzMl90IGNodW5rKCkg
Y29uc3QgeyByZXR1cm4gY2h1bmtfOyB9CisgIHZvaWQgc2V0X2NodW5rKHVpbnQzMl90IHZhbHVl
KSB7IGNodW5rXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc190
YXJnZXRfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDMy
X3QgdGFyZ2V0X2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIHRhcmdldF9idWZmZXJfOyB9CisgIHZv
aWQgc2V0X3RhcmdldF9idWZmZXIodWludDMyX3QgdmFsdWUpIHsgdGFyZ2V0X2J1ZmZlcl8gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBwYWdl
X3t9OworICB1aW50MzJfdCBjaHVua197fTsKKyAgdWludDMyX3QgdGFyZ2V0X2J1ZmZlcl97fTsK
KworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNv
bXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgor
ICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8ND4gX2hhc19m
aWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNl
IHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0NPTU1JVF9EQVRBX1JFUVVFU1RfUFJPVE9fQ1BQX0hf
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVy
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVy
YXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1
c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24v
Y29tbWl0X2RhdGFfcmVxdWVzdC5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVz
cGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK0NvbW1pdERhdGFSZXF1ZXN0OjpDb21t
aXREYXRhUmVxdWVzdCgpID0gZGVmYXVsdDsKK0NvbW1pdERhdGFSZXF1ZXN0Ojp+Q29tbWl0RGF0
YVJlcXVlc3QoKSA9IGRlZmF1bHQ7CitDb21taXREYXRhUmVxdWVzdDo6Q29tbWl0RGF0YVJlcXVl
c3QoY29uc3QgQ29tbWl0RGF0YVJlcXVlc3QmKSA9IGRlZmF1bHQ7CitDb21taXREYXRhUmVxdWVz
dCYgQ29tbWl0RGF0YVJlcXVlc3Q6Om9wZXJhdG9yPShjb25zdCBDb21taXREYXRhUmVxdWVzdCYp
ID0gZGVmYXVsdDsKK0NvbW1pdERhdGFSZXF1ZXN0OjpDb21taXREYXRhUmVxdWVzdChDb21taXRE
YXRhUmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitDb21taXREYXRhUmVxdWVzdCYgQ29t
bWl0RGF0YVJlcXVlc3Q6Om9wZXJhdG9yPShDb21taXREYXRhUmVxdWVzdCYmKSA9IGRlZmF1bHQ7
CisKK2Jvb2wgQ29tbWl0RGF0YVJlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgQ29tbWl0RGF0YVJl
cXVlc3QmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIu
dW5rbm93bl9maWVsZHNfCisgICAmJiBjaHVua3NfdG9fbW92ZV8gPT0gb3RoZXIuY2h1bmtzX3Rv
X21vdmVfCisgICAmJiBjaHVua3NfdG9fcGF0Y2hfID09IG90aGVyLmNodW5rc190b19wYXRjaF8K
KyAgICYmIGZsdXNoX3JlcXVlc3RfaWRfID09IG90aGVyLmZsdXNoX3JlcXVlc3RfaWRfOworfQor
Citib29sIENvbW1pdERhdGFSZXF1ZXN0OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcs
IHNpemVfdCBzaXplKSB7CisgIGNodW5rc190b19tb3ZlXy5jbGVhcigpOworICBjaHVua3NfdG9f
cGF0Y2hfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tl
ZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywg
c2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQo
KTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNf
ZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAg
IH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBjaHVua3NfdG9f
bW92ZSAqLzoKKyAgICAgICAgY2h1bmtzX3RvX21vdmVfLmVtcGxhY2VfYmFjaygpOworICAgICAg
ICBjaHVua3NfdG9fbW92ZV8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3Ry
aW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBjaHVua3NfdG9fcGF0Y2gg
Ki86CisgICAgICAgIGNodW5rc190b19wYXRjaF8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGNo
dW5rc190b19wYXRjaF8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5n
KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBmbHVzaF9yZXF1ZXN0X2lkICov
OgorICAgICAgICBmaWVsZC5nZXQoJmZsdXNoX3JlcXVlc3RfaWRfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5r
bm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFj
a2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBDb21taXRE
YXRhUmVxdWVzdDo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpI
ZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5n
ZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0
b3I8dWludDhfdD4gQ29tbWl0RGF0YVJlcXVlc3Q6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgp
OworfQorCit2b2lkIENvbW1pdERhdGFSZXF1ZXN0OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBjaHVua3NfdG9fbW92ZQorICBmb3Ig
KGF1dG8mIGl0IDogY2h1bmtzX3RvX21vdmVfKSB7CisgICAgaXQuU2VyaWFsaXplKG1zZy0+QmVn
aW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigxKSk7CisgIH0KKworICAvLyBG
aWVsZCAyOiBjaHVua3NfdG9fcGF0Y2gKKyAgZm9yIChhdXRvJiBpdCA6IGNodW5rc190b19wYXRj
aF8pIHsKKyAgICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+KDIpKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGZsdXNoX3JlcXVlc3RfaWQK
KyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMywgZmx1c2hf
cmVxdWVzdF9pZF8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25f
ZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0NvbW1pdERh
dGFSZXF1ZXN0X0NodW5rVG9QYXRjaDo6Q29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoKCkg
PSBkZWZhdWx0OworQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoOjp+Q29tbWl0RGF0YVJl
cXVlc3RfQ2h1bmtUb1BhdGNoKCkgPSBkZWZhdWx0OworQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtU
b1BhdGNoOjpDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2goY29uc3QgQ29tbWl0RGF0YVJl
cXVlc3RfQ2h1bmtUb1BhdGNoJikgPSBkZWZhdWx0OworQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtU
b1BhdGNoJiBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2g6Om9wZXJhdG9yPShjb25zdCBD
b21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2gmKSA9IGRlZmF1bHQ7CitDb21taXREYXRhUmVx
dWVzdF9DaHVua1RvUGF0Y2g6OkNvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaChDb21taXRE
YXRhUmVxdWVzdF9DaHVua1RvUGF0Y2gmJikgbm9leGNlcHQgPSBkZWZhdWx0OworQ29tbWl0RGF0
YVJlcXVlc3RfQ2h1bmtUb1BhdGNoJiBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2g6Om9w
ZXJhdG9yPShDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2gmJikgPSBkZWZhdWx0OworCiti
b29sIENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaDo6b3BlcmF0b3I9PShjb25zdCBDb21t
aXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2gmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtu
b3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiB0YXJnZXRfYnVmZmVy
XyA9PSBvdGhlci50YXJnZXRfYnVmZmVyXworICAgJiYgd3JpdGVyX2lkXyA9PSBvdGhlci53cml0
ZXJfaWRfCisgICAmJiBjaHVua19pZF8gPT0gb3RoZXIuY2h1bmtfaWRfCisgICAmJiBwYXRjaGVz
XyA9PSBvdGhlci5wYXRjaGVzXworICAgJiYgaGFzX21vcmVfcGF0Y2hlc18gPT0gb3RoZXIuaGFz
X21vcmVfcGF0Y2hlc187Cit9CisKK2Jvb2wgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNo
OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHBhdGNo
ZXNfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9l
cnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6
ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsg
ZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmll
bGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0K
KyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiB0YXJnZXRfYnVmZmVy
ICovOgorICAgICAgICBmaWVsZC5nZXQoJnRhcmdldF9idWZmZXJfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDIgLyogd3JpdGVyX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJndyaXRl
cl9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBjaHVua19pZCAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZjaHVua19pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
NCAvKiBwYXRjaGVzICovOgorICAgICAgICBwYXRjaGVzXy5lbXBsYWNlX2JhY2soKTsKKyAgICAg
ICAgcGF0Y2hlc18uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkp
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBoYXNfbW9yZV9wYXRjaGVzICovOgor
ICAgICAgICBmaWVsZC5nZXQoJmhhc19tb3JlX3BhdGNoZXNfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93
bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2Vk
X2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBDb21taXREYXRh
UmVxdWVzdF9DaHVua1RvUGF0Y2g6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnBy
b3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlh
bGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisK
K3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaDo6U2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1
bmtUb1BhdGNoOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qgewor
ICAvLyBGaWVsZCAxOiB0YXJnZXRfYnVmZmVyCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDEsIHRhcmdldF9idWZmZXJfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDI6IHdyaXRlcl9pZAorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZh
ckludCgyLCB3cml0ZXJfaWRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGNodW5rX2lkCisgIGlm
IChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIGNodW5rX2lkXyk7
CisgIH0KKworICAvLyBGaWVsZCA0OiBwYXRjaGVzCisgIGZvciAoYXV0byYgaXQgOiBwYXRjaGVz
XykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVy
bzo6TWVzc2FnZT4oNCkpOworICB9CisKKyAgLy8gRmllbGQgNTogaGFzX21vcmVfcGF0Y2hlcwor
ICBpZiAoX2hhc19maWVsZF9bNV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNSwgaGFz
X21vcmVfcGF0Y2hlc18pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25v
d25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0NvbW1p
dERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaF9QYXRjaDo6Q29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtU
b1BhdGNoX1BhdGNoKCkgPSBkZWZhdWx0OworQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNo
X1BhdGNoOjp+Q29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoKCkgPSBkZWZhdWx0
OworQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoOjpDb21taXREYXRhUmVxdWVz
dF9DaHVua1RvUGF0Y2hfUGF0Y2goY29uc3QgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNo
X1BhdGNoJikgPSBkZWZhdWx0OworQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNo
JiBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2g6Om9wZXJhdG9yPShjb25zdCBD
b21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2gmKSA9IGRlZmF1bHQ7CitDb21taXRE
YXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2g6OkNvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9Q
YXRjaF9QYXRjaChDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2gmJikgbm9leGNl
cHQgPSBkZWZhdWx0OworQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoJiBDb21t
aXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2g6Om9wZXJhdG9yPShDb21taXREYXRhUmVx
dWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2gmJikgPSBkZWZhdWx0OworCitib29sIENvbW1pdERhdGFS
ZXF1ZXN0X0NodW5rVG9QYXRjaF9QYXRjaDo6b3BlcmF0b3I9PShjb25zdCBDb21taXREYXRhUmVx
dWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2gmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3du
X2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBvZmZzZXRfID09IG90aGVy
Lm9mZnNldF8KKyAgICYmIGRhdGFfID09IG90aGVyLmRhdGFfOworfQorCitib29sIENvbW1pdERh
dGFSZXF1ZXN0X0NodW5rVG9QYXRjaF9QYXRjaDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCog
cmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBw
YWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhy
YXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZh
bGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBf
aGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsK
KyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogb2Zmc2V0
ICovOgorICAgICAgICBmaWVsZC5nZXQoJm9mZnNldF8pOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgMiAvKiBkYXRhICovOgorICAgICAgICBmaWVsZC5nZXQoJmRhdGFfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRU
bygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVy
biAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBD
b21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2g6OlNlcmlhbGl6ZUFzU3RyaW5nKCkg
Y29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdl
PiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFz
U3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENvbW1pdERhdGFSZXF1ZXN0X0No
dW5rVG9QYXRjaF9QYXRjaDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3pl
cm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUo
bXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQg
Q29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoOjpTZXJpYWxpemUoOjpwcm90b3pl
cm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBvZmZzZXQKKyAgaWYgKF9o
YXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgb2Zmc2V0Xyk7CisgIH0K
KworICAvLyBGaWVsZCAyOiBkYXRhCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+
QXBwZW5kU3RyaW5nKDIsIGRhdGFfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRl
cyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKwor
CitDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmU6OkNvbW1pdERhdGFSZXF1ZXN0X0NodW5r
c1RvTW92ZSgpID0gZGVmYXVsdDsKK0NvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZTo6fkNv
bW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZSgpID0gZGVmYXVsdDsKK0NvbW1pdERhdGFSZXF1
ZXN0X0NodW5rc1RvTW92ZTo6Q29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlKGNvbnN0IENv
bW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZSYpID0gZGVmYXVsdDsKK0NvbW1pdERhdGFSZXF1
ZXN0X0NodW5rc1RvTW92ZSYgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlOjpvcGVyYXRv
cj0oY29uc3QgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlJikgPSBkZWZhdWx0OworQ29t
bWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlOjpDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01v
dmUoQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsK
K0NvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZSYgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtz
VG9Nb3ZlOjpvcGVyYXRvcj0oQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlJiYpID0gZGVm
YXVsdDsKKworYm9vbCBDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmU6Om9wZXJhdG9yPT0o
Y29uc3QgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlJiBvdGhlcikgY29uc3QgeworICBy
ZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgcGFn
ZV8gPT0gb3RoZXIucGFnZV8KKyAgICYmIGNodW5rXyA9PSBvdGhlci5jaHVua18KKyAgICYmIHRh
cmdldF9idWZmZXJfID09IG90aGVyLnRhcmdldF9idWZmZXJfOworfQorCitib29sIENvbW1pdERh
dGFSZXF1ZXN0X0NodW5rc1RvTW92ZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBz
aXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogcGFnZSAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZwYWdlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8q
IGNodW5rICovOgorICAgICAgICBmaWVsZC5nZXQoJmNodW5rXyk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgY2FzZSAzIC8qIHRhcmdldF9idWZmZXIgKi86CisgICAgICAgIGZpZWxkLmdldCgmdGFy
Z2V0X2J1ZmZlcl8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZp
ZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVh
azsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0
KCk7Cit9CisKK3N0ZDo6c3RyaW5nIENvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZTo6U2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ29t
bWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsK
K30KKwordm9pZCBDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmU6OlNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IHBhZ2UKKyAgaWYg
KF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgcGFnZV8pOworICB9
CisKKyAgLy8gRmllbGQgMjogY2h1bmsKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNn
LT5BcHBlbmRWYXJJbnQoMiwgY2h1bmtfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IHRhcmdldF9i
dWZmZXIKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMywg
dGFyZ2V0X2J1ZmZlcl8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25v
d25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBu
YW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFj
ZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9kYXRhX3NvdXJjZV9kZXNjcmlw
dG9yLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by9jb21tb24vZGF0YV9zb3VyY2VfZGVzY3JpcHRvci5nZW4uaAorLy8gRE8gTk9UIEVE
SVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRlZiBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9EQVRBX1NPVVJDRV9ERVNDUklQVE9S
X1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NP
TU1PTl9EQVRBX1NPVVJDRV9ERVNDUklQVE9SX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3Rk
aW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxz
dHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9j
b3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2Ug
cHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgRGF0YVNvdXJjZURlc2NyaXB0b3I7Cit9
ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5h
bWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNl
IHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIERhdGFT
b3VyY2VEZXNjcmlwdG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBw
dWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwK
KyAgICBrV2lsbE5vdGlmeU9uU3RvcEZpZWxkTnVtYmVyID0gMiwKKyAgICBrV2lsbE5vdGlmeU9u
U3RhcnRGaWVsZE51bWJlciA9IDMsCisgICAga0hhbmRsZXNJbmNyZW1lbnRhbFN0YXRlQ2xlYXJG
aWVsZE51bWJlciA9IDQsCisgICAga0dwdUNvdW50ZXJEZXNjcmlwdG9yRmllbGROdW1iZXIgPSA1
LAorICAgIGtUcmFja0V2ZW50RGVzY3JpcHRvckZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKworICBE
YXRhU291cmNlRGVzY3JpcHRvcigpOworICB+RGF0YVNvdXJjZURlc2NyaXB0b3IoKSBvdmVycmlk
ZTsKKyAgRGF0YVNvdXJjZURlc2NyaXB0b3IoRGF0YVNvdXJjZURlc2NyaXB0b3ImJikgbm9leGNl
cHQ7CisgIERhdGFTb3VyY2VEZXNjcmlwdG9yJiBvcGVyYXRvcj0oRGF0YVNvdXJjZURlc2NyaXB0
b3ImJik7CisgIERhdGFTb3VyY2VEZXNjcmlwdG9yKGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9y
Jik7CisgIERhdGFTb3VyY2VEZXNjcmlwdG9yJiBvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZURl
c2NyaXB0b3ImKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9y
JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEYXRhU291cmNlRGVzY3JpcHRvciYg
b3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcg
U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhf
dD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6
OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7
IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNv
bnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wg
aGFzX3dpbGxfbm90aWZ5X29uX3N0b3AoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsg
fQorICBib29sIHdpbGxfbm90aWZ5X29uX3N0b3AoKSBjb25zdCB7IHJldHVybiB3aWxsX25vdGlm
eV9vbl9zdG9wXzsgfQorICB2b2lkIHNldF93aWxsX25vdGlmeV9vbl9zdG9wKGJvb2wgdmFsdWUp
IHsgd2lsbF9ub3RpZnlfb25fc3RvcF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisK
KyAgYm9vbCBoYXNfd2lsbF9ub3RpZnlfb25fc3RhcnQoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1szXTsgfQorICBib29sIHdpbGxfbm90aWZ5X29uX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4g
d2lsbF9ub3RpZnlfb25fc3RhcnRfOyB9CisgIHZvaWQgc2V0X3dpbGxfbm90aWZ5X29uX3N0YXJ0
KGJvb2wgdmFsdWUpIHsgd2lsbF9ub3RpZnlfb25fc3RhcnRfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCgzKTsgfQorCisgIGJvb2wgaGFzX2hhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXIo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICBib29sIGhhbmRsZXNfaW5jcmVt
ZW50YWxfc3RhdGVfY2xlYXIoKSBjb25zdCB7IHJldHVybiBoYW5kbGVzX2luY3JlbWVudGFsX3N0
YXRlX2NsZWFyXzsgfQorICB2b2lkIHNldF9oYW5kbGVzX2luY3JlbWVudGFsX3N0YXRlX2NsZWFy
KGJvb2wgdmFsdWUpIHsgaGFuZGxlc19pbmNyZW1lbnRhbF9zdGF0ZV9jbGVhcl8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdwdV9jb3VudGVy
X2Rlc2NyaXB0b3JfcmF3KCkgY29uc3QgeyByZXR1cm4gZ3B1X2NvdW50ZXJfZGVzY3JpcHRvcl87
IH0KKyAgdm9pZCBzZXRfZ3B1X2NvdW50ZXJfZGVzY3JpcHRvcl9yYXcoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgeyBncHVfY291bnRlcl9kZXNjcmlwdG9yXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0
KDUpOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYWNrX2V2ZW50X2Rlc2NyaXB0b3JfcmF3
KCkgY29uc3QgeyByZXR1cm4gdHJhY2tfZXZlbnRfZGVzY3JpcHRvcl87IH0KKyAgdm9pZCBzZXRf
dHJhY2tfZXZlbnRfZGVzY3JpcHRvcl9yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeyB0cmFj
a19ldmVudF9kZXNjcmlwdG9yXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisKKyBwcml2
YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lX3t9OworICBib29sIHdpbGxfbm90aWZ5X29uX3N0b3Bf
e307CisgIGJvb2wgd2lsbF9ub3RpZnlfb25fc3RhcnRfe307CisgIGJvb2wgaGFuZGxlc19pbmNy
ZW1lbnRhbF9zdGF0ZV9jbGVhcl97fTsKKyAgc3RkOjpzdHJpbmcgZ3B1X2NvdW50ZXJfZGVzY3Jp
cHRvcl87ICAvLyBbbGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyB0cmFja19ldmVudF9kZXNjcmlw
dG9yXzsgIC8vIFtsYXp5PXRydWVdCisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24g
cHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNp
b25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisg
IHN0ZDo6Yml0c2V0PDc+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVy
ZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2Vu
ZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9EQVRBX1NPVVJD
RV9ERVNDUklQVE9SX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRf
ZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgor
Ly8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgor
I3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9y
ZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2RhdGFfc291cmNlX2Rlc2NyaXB0b3IuZ2VuLmgiCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4g
eworCitEYXRhU291cmNlRGVzY3JpcHRvcjo6RGF0YVNvdXJjZURlc2NyaXB0b3IoKSA9IGRlZmF1
bHQ7CitEYXRhU291cmNlRGVzY3JpcHRvcjo6fkRhdGFTb3VyY2VEZXNjcmlwdG9yKCkgPSBkZWZh
dWx0OworRGF0YVNvdXJjZURlc2NyaXB0b3I6OkRhdGFTb3VyY2VEZXNjcmlwdG9yKGNvbnN0IERh
dGFTb3VyY2VEZXNjcmlwdG9yJikgPSBkZWZhdWx0OworRGF0YVNvdXJjZURlc2NyaXB0b3ImIERh
dGFTb3VyY2VEZXNjcmlwdG9yOjpvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZURlc2NyaXB0b3Im
KSA9IGRlZmF1bHQ7CitEYXRhU291cmNlRGVzY3JpcHRvcjo6RGF0YVNvdXJjZURlc2NyaXB0b3Io
RGF0YVNvdXJjZURlc2NyaXB0b3ImJikgbm9leGNlcHQgPSBkZWZhdWx0OworRGF0YVNvdXJjZURl
c2NyaXB0b3ImIERhdGFTb3VyY2VEZXNjcmlwdG9yOjpvcGVyYXRvcj0oRGF0YVNvdXJjZURlc2Ny
aXB0b3ImJikgPSBkZWZhdWx0OworCitib29sIERhdGFTb3VyY2VEZXNjcmlwdG9yOjpvcGVyYXRv
cj09KGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgeworICByZXR1cm4g
dW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgbmFtZV8gPT0g
b3RoZXIubmFtZV8KKyAgICYmIHdpbGxfbm90aWZ5X29uX3N0b3BfID09IG90aGVyLndpbGxfbm90
aWZ5X29uX3N0b3BfCisgICAmJiB3aWxsX25vdGlmeV9vbl9zdGFydF8gPT0gb3RoZXIud2lsbF9u
b3RpZnlfb25fc3RhcnRfCisgICAmJiBoYW5kbGVzX2luY3JlbWVudGFsX3N0YXRlX2NsZWFyXyA9
PSBvdGhlci5oYW5kbGVzX2luY3JlbWVudGFsX3N0YXRlX2NsZWFyXworICAgJiYgZ3B1X2NvdW50
ZXJfZGVzY3JpcHRvcl8gPT0gb3RoZXIuZ3B1X2NvdW50ZXJfZGVzY3JpcHRvcl8KKyAgICYmIHRy
YWNrX2V2ZW50X2Rlc2NyaXB0b3JfID09IG90aGVyLnRyYWNrX2V2ZW50X2Rlc2NyaXB0b3JfOwor
fQorCitib29sIERhdGFTb3VyY2VEZXNjcmlwdG9yOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lk
KiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29s
IHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVj
KHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQu
dmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8
IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkp
OworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBuYW1l
ICovOgorICAgICAgICBmaWVsZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDIgLyogd2lsbF9ub3RpZnlfb25fc3RvcCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ3aWxs
X25vdGlmeV9vbl9zdG9wXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIHdpbGxf
bm90aWZ5X29uX3N0YXJ0ICovOgorICAgICAgICBmaWVsZC5nZXQoJndpbGxfbm90aWZ5X29uX3N0
YXJ0Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIGhhbmRsZXNfaW5jcmVtZW50
YWxfc3RhdGVfY2xlYXIgKi86CisgICAgICAgIGZpZWxkLmdldCgmaGFuZGxlc19pbmNyZW1lbnRh
bF9zdGF0ZV9jbGVhcl8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBncHVfY291
bnRlcl9kZXNjcmlwdG9yICovOgorICAgICAgICBncHVfY291bnRlcl9kZXNjcmlwdG9yXyA9IGZp
ZWxkLmFzX3N0ZF9zdHJpbmcoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYgLyogdHJh
Y2tfZXZlbnRfZGVzY3JpcHRvciAqLzoKKyAgICAgICAgdHJhY2tfZXZlbnRfZGVzY3JpcHRvcl8g
PSBmaWVsZC5hc19zdGRfc3RyaW5nKCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoK
KyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVj
LmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgRGF0YVNvdXJjZURlc2NyaXB0b3I6OlNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6
cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1
cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IERh
dGFTb3VyY2VEZXNjcmlwdG9yOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9p
ZCBEYXRhU291cmNlRGVzY3JpcHRvcjo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBt
c2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogbmFtZQorICBpZiAoX2hhc19maWVsZF9bMV0pIHsK
KyAgICBtc2ctPkFwcGVuZFN0cmluZygxLCBuYW1lXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiB3
aWxsX25vdGlmeV9vbl9zdG9wCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBw
ZW5kVGlueVZhckludCgyLCB3aWxsX25vdGlmeV9vbl9zdG9wXyk7CisgIH0KKworICAvLyBGaWVs
ZCAzOiB3aWxsX25vdGlmeV9vbl9zdGFydAorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBt
c2ctPkFwcGVuZFRpbnlWYXJJbnQoMywgd2lsbF9ub3RpZnlfb25fc3RhcnRfKTsKKyAgfQorCisg
IC8vIEZpZWxkIDQ6IGhhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXIKKyAgaWYgKF9oYXNf
ZmllbGRfWzRdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDQsIGhhbmRsZXNfaW5jcmVt
ZW50YWxfc3RhdGVfY2xlYXJfKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IGdwdV9jb3VudGVyX2Rl
c2NyaXB0b3IKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmco
NSwgZ3B1X2NvdW50ZXJfZGVzY3JpcHRvcl8pOworICB9CisKKyAgLy8gRmllbGQgNjogdHJhY2tf
ZXZlbnRfZGVzY3JpcHRvcgorICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVu
ZFN0cmluZyg2LCB0cmFja19ldmVudF9kZXNjcmlwdG9yXyk7CisgIH0KKworICBtc2ctPkFwcGVu
ZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNp
emUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHBy
b3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29tbW9u
L2Rlc2NyaXB0b3IuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4v
cHJvdG9zL3BlcmZldHRvL2NvbW1vbi9kZXNjcmlwdG9yLmdlbi5oCisvLyBETyBOT1QgRURJVC4g
QXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisj
ZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0RFU0NSSVBUT1Jf
UFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+Cisj
aW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0
cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7Citj
bGFzcyBPbmVvZk9wdGlvbnM7CitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG87CitjbGFz
cyBFbnVtRGVzY3JpcHRvclByb3RvOworY2xhc3MgT25lb2ZEZXNjcmlwdG9yUHJvdG87CitjbGFz
cyBGaWVsZERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIERl
c2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOworY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90bzsK
K2NsYXNzIEZpbGVEZXNjcmlwdG9yU2V0OworZW51bSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBl
IDogaW50OworZW51bSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCA6IGludDsKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNl
IGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1l
c3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9z
IHsKK25hbWVzcGFjZSBnZW4geworZW51bSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIDogaW50
IHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0RPVUJMRSA9IDEsCisgIEZpZWxk
RGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GTE9BVCA9IDIsCisgIEZpZWxkRGVzY3JpcHRvclBy
b3RvX1R5cGVfVFlQRV9JTlQ2NCA9IDMsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQ
RV9VSU5UNjQgPSA0LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzIgPSA1
LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRklYRUQ2NCA9IDYsCisgIEZpZWxk
RGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDMyID0gNywKKyAgRmllbGREZXNjcmlwdG9y
UHJvdG9fVHlwZV9UWVBFX0JPT0wgPSA4LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZ
UEVfU1RSSU5HID0gOSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0dST1VQID0g
MTAsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9NRVNTQUdFID0gMTEsCisgIEZp
ZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9CWVRFUyA9IDEyLAorICBGaWVsZERlc2NyaXB0
b3JQcm90b19UeXBlX1RZUEVfVUlOVDMyID0gMTMsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5
cGVfVFlQRV9FTlVNID0gMTQsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TRklY
RUQzMiA9IDE1LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVENjQgPSAx
NiwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQzMiA9IDE3LAorICBGaWVs
ZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0ID0gMTgsCit9OworZW51bSBGaWVsZERl
c2NyaXB0b3JQcm90b19MYWJlbCA6IGludCB7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVs
X0xBQkVMX09QVElPTkFMID0gMSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxf
UkVRVUlSRUQgPSAyLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRF
RCA9IDMsCit9OworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgT25lb2ZPcHRpb25zIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1i
ZXJzIHsKKyAgfTsKKworICBPbmVvZk9wdGlvbnMoKTsKKyAgfk9uZW9mT3B0aW9ucygpIG92ZXJy
aWRlOworICBPbmVvZk9wdGlvbnMoT25lb2ZPcHRpb25zJiYpIG5vZXhjZXB0OworICBPbmVvZk9w
dGlvbnMmIG9wZXJhdG9yPShPbmVvZk9wdGlvbnMmJik7CisgIE9uZW9mT3B0aW9ucyhjb25zdCBP
bmVvZk9wdGlvbnMmKTsKKyAgT25lb2ZPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgT25lb2ZPcHRp
b25zJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPbmVvZk9wdGlvbnMmKSBjb25zdDsKKyAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IE9uZW9mT3B0aW9ucyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJu
ICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lk
Kiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgp
IGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSop
IGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBw
cm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lv
bnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAg
c3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQ
T1JUIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVz
c2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga05hbWVGaWVs
ZE51bWJlciA9IDEsCisgICAga051bWJlckZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKworICBFbnVt
VmFsdWVEZXNjcmlwdG9yUHJvdG8oKTsKKyAgfkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpIG92
ZXJyaWRlOworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oRW51bVZhbHVlRGVzY3JpcHRvclBy
b3RvJiYpIG5vZXhjZXB0OworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShF
bnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mJik7CisgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byhj
b25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mKTsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclBy
b3RvJiBvcGVyYXRvcj0oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJik7CisgIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mKSBjb25zdDsKKyAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IG5h
bWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX251bWJlcigp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGludDMyX3QgbnVtYmVyKCkgY29u
c3QgeyByZXR1cm4gbnVtYmVyXzsgfQorICB2b2lkIHNldF9udW1iZXIoaW50MzJfdCB2YWx1ZSkg
eyBudW1iZXJfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToKKyAg
c3RkOjpzdHJpbmcgbmFtZV97fTsKKyAgaW50MzJfdCBudW1iZXJfe307CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9Owor
CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBFbnVtRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6
cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJz
IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDIs
CisgICAga1Jlc2VydmVkTmFtZUZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKworICBFbnVtRGVzY3Jp
cHRvclByb3RvKCk7CisgIH5FbnVtRGVzY3JpcHRvclByb3RvKCkgb3ZlcnJpZGU7CisgIEVudW1E
ZXNjcmlwdG9yUHJvdG8oRW51bURlc2NyaXB0b3JQcm90byYmKSBub2V4Y2VwdDsKKyAgRW51bURl
c2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KEVudW1EZXNjcmlwdG9yUHJvdG8mJik7CisgIEVudW1E
ZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYpOworICBFbnVtRGVzY3Jp
cHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYpOworICBib29s
IG9wZXJhdG9yPT0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYpIGNvbnN0OworICBib29sIG9w
ZXJhdG9yIT0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgb3RoZXIpIGNvbnN0IHsgcmV0dXJu
ICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lk
Kiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgp
IGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSop
IGNvbnN0OworCisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sx
XTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9
CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IG5hbWVfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGludCB2YWx1ZV9zaXplKCkgY29uc3QgeyBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZV8uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZl
Y3RvcjxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8+JiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZh
bHVlXzsgfQorICBzdGQ6OnZlY3RvcjxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8+KiBtdXRhYmxl
X3ZhbHVlKCkgeyByZXR1cm4gJnZhbHVlXzsgfQorICB2b2lkIGNsZWFyX3ZhbHVlKCkgeyB2YWx1
ZV8uY2xlYXIoKTsgfQorICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIGFkZF92YWx1ZSgpIHsg
dmFsdWVfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnZhbHVlXy5iYWNrKCk7IH0KKworICBpbnQg
cmVzZXJ2ZWRfbmFtZV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihyZXNl
cnZlZF9uYW1lXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYg
cmVzZXJ2ZWRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHJlc2VydmVkX25hbWVfOyB9CisgIHN0ZDo6
dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9yZXNlcnZlZF9uYW1lKCkgeyByZXR1cm4gJnJl
c2VydmVkX25hbWVfOyB9CisgIHZvaWQgY2xlYXJfcmVzZXJ2ZWRfbmFtZSgpIHsgcmVzZXJ2ZWRf
bmFtZV8uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKHN0ZDo6c3RyaW5nIHZh
bHVlKSB7IHJlc2VydmVkX25hbWVfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJp
bmcqIGFkZF9yZXNlcnZlZF9uYW1lKCkgeyByZXNlcnZlZF9uYW1lXy5lbXBsYWNlX2JhY2soKTsg
cmV0dXJuICZyZXNlcnZlZF9uYW1lXy5iYWNrKCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3Ry
aW5nIG5hbWVfe307CisgIHN0ZDo6dmVjdG9yPEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bz4gdmFs
dWVfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzZXJ2ZWRfbmFtZV87CisKKyAgLy8g
QWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmls
aXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpz
dHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDY+IF9oYXNfZmllbGRfe307
Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBPbmVvZkRlc2NyaXB0b3JQcm90byA6IHB1
YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxk
TnVtYmVycyB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga09wdGlvbnNGaWVsZE51
bWJlciA9IDIsCisgIH07CisKKyAgT25lb2ZEZXNjcmlwdG9yUHJvdG8oKTsKKyAgfk9uZW9mRGVz
Y3JpcHRvclByb3RvKCkgb3ZlcnJpZGU7CisgIE9uZW9mRGVzY3JpcHRvclByb3RvKE9uZW9mRGVz
Y3JpcHRvclByb3RvJiYpIG5vZXhjZXB0OworICBPbmVvZkRlc2NyaXB0b3JQcm90byYgb3BlcmF0
b3I9KE9uZW9mRGVzY3JpcHRvclByb3RvJiYpOworICBPbmVvZkRlc2NyaXB0b3JQcm90byhjb25z
dCBPbmVvZkRlc2NyaXB0b3JQcm90byYpOworICBPbmVvZkRlc2NyaXB0b3JQcm90byYgb3BlcmF0
b3I9KGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBPbmVvZkRlc2NyaXB0b3JQcm90byYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
T25lb2ZEZXNjcmlwdG9yUHJvdG8mIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90
aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3Zl
cnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7
CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlk
ZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBi
b29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qg
c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorICB2b2lkIHNldF9u
YW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBuYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoMSk7IH0KKworICBib29sIGhhc19vcHRpb25zKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMl07IH0KKyAgY29uc3QgT25lb2ZPcHRpb25zJiBvcHRpb25zKCkgY29uc3QgeyByZXR1
cm4gKm9wdGlvbnNfOyB9CisgIE9uZW9mT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCkgeyBfaGFz
X2ZpZWxkXy5zZXQoMik7IHJldHVybiBvcHRpb25zXy5nZXQoKTsgfQorCisgcHJpdmF0ZToKKyAg
c3RkOjpzdHJpbmcgbmFtZV97fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPE9uZW9mT3B0
aW9ucz4gb3B0aW9uc187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9i
dWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9m
IC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6
Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBG
aWVsZERlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7
CisgcHVibGljOgorICB1c2luZyBUeXBlID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZTsKKyAg
c3RhdGljIGNvbnN0ZXhwciBhdXRvIFRZUEVfRE9VQkxFID0gRmllbGREZXNjcmlwdG9yUHJvdG9f
VHlwZV9UWVBFX0RPVUJMRTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRZUEVfRkxPQVQgPSBG
aWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRkxPQVQ7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBUWVBFX0lOVDY0ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDY0Owor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9VSU5UNjQgPSBGaWVsZERlc2NyaXB0b3JQcm90
b19UeXBlX1RZUEVfVUlOVDY0OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9JTlQzMiA9
IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9JTlQzMjsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIFRZUEVfRklYRUQ2NCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhF
RDY0OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9GSVhFRDMyID0gRmllbGREZXNjcmlw
dG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVEMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUWVBF
X0JPT0wgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQk9PTDsKKyAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIFRZUEVfU1RSSU5HID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBF
X1NUUklORzsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRZUEVfR1JPVVAgPSBGaWVsZERlc2Ny
aXB0b3JQcm90b19UeXBlX1RZUEVfR1JPVVA7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUWVBF
X01FU1NBR0UgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfTUVTU0FHRTsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIFRZUEVfQllURVMgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBl
X1RZUEVfQllURVM7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUWVBFX1VJTlQzMiA9IEZpZWxk
RGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBUWVBFX0VOVU0gPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRU5VTTsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIFRZUEVfU0ZJWEVEMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19U
eXBlX1RZUEVfU0ZJWEVEMzI7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUWVBFX1NGSVhFRDY0
ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhFRDY0OworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gVFlQRV9TSU5UMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVf
U0lOVDMyOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9TSU5UNjQgPSBGaWVsZERlc2Ny
aXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVHlw
ZV9NSU4gPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFOworICBzdGF0aWMg
Y29uc3RleHByIGF1dG8gVHlwZV9NQVggPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVf
U0lOVDY0OworICB1c2luZyBMYWJlbCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gTEFCRUxfT1BUSU9OQUwgPSBGaWVsZERlc2NyaXB0b3JQcm90
b19MYWJlbF9MQUJFTF9PUFRJT05BTDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIExBQkVMX1JF
UVVJUkVEID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfUkVRVUlSRUQ7CisgIHN0
YXRpYyBjb25zdGV4cHIgYXV0byBMQUJFTF9SRVBFQVRFRCA9IEZpZWxkRGVzY3JpcHRvclByb3Rv
X0xhYmVsX0xBQkVMX1JFUEVBVEVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gTGFiZWxfTUlO
ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9OQUw7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBMYWJlbF9NQVggPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJF
TF9SRVBFQVRFRDsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtOYW1lRmllbGROdW1iZXIg
PSAxLAorICAgIGtOdW1iZXJGaWVsZE51bWJlciA9IDMsCisgICAga0xhYmVsRmllbGROdW1iZXIg
PSA0LAorICAgIGtUeXBlRmllbGROdW1iZXIgPSA1LAorICAgIGtUeXBlTmFtZUZpZWxkTnVtYmVy
ID0gNiwKKyAgICBrRXh0ZW5kZWVGaWVsZE51bWJlciA9IDIsCisgICAga0RlZmF1bHRWYWx1ZUZp
ZWxkTnVtYmVyID0gNywKKyAgICBrT25lb2ZJbmRleEZpZWxkTnVtYmVyID0gOSwKKyAgfTsKKwor
ICBGaWVsZERlc2NyaXB0b3JQcm90bygpOworICB+RmllbGREZXNjcmlwdG9yUHJvdG8oKSBvdmVy
cmlkZTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8oRmllbGREZXNjcmlwdG9yUHJvdG8mJikgbm9l
eGNlcHQ7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oRmllbGREZXNjcmlwdG9y
UHJvdG8mJik7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKGNvbnN0IEZpZWxkRGVzY3JpcHRvclBy
b3RvJik7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRmllbGREZXNj
cmlwdG9yUHJvdG8mKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpZWxkRGVzY3JpcHRvclBy
b3RvJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90
byYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQ
YXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJp
bmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWlu
dDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6
ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX25hbWUoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJv
b2wgaGFzX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGludDMy
X3QgbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbnVtYmVyXzsgfQorICB2b2lkIHNldF9udW1iZXIo
aW50MzJfdCB2YWx1ZSkgeyBudW1iZXJfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQor
CisgIGJvb2wgaGFzX2xhYmVsKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAg
RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgbGFiZWwoKSBjb25zdCB7IHJldHVybiBsYWJlbF87
IH0KKyAgdm9pZCBzZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgdmFsdWUpIHsg
bGFiZWxfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgIGJvb2wgaGFzX3R5cGUo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s1XTsgfQorICBGaWVsZERlc2NyaXB0b3JQcm90
b19UeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorICB2b2lkIHNldF90eXBlKEZp
ZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpIHsgdHlwZV8gPSB2YWx1ZTsgX2hhc19maWVs
ZF8uc2V0KDUpOyB9CisKKyAgYm9vbCBoYXNfdHlwZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hh
c19maWVsZF9bNl07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIHR5cGVfbmFtZV87IH0KKyAgdm9pZCBzZXRfdHlwZV9uYW1lKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeyB0eXBlX25hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg2KTsgfQor
CisgIGJvb2wgaGFzX2V4dGVuZGVlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0K
KyAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4dGVuZGVlKCkgY29uc3QgeyByZXR1cm4gZXh0ZW5kZWVf
OyB9CisgIHZvaWQgc2V0X2V4dGVuZGVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBleHRl
bmRlZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfZGVmYXVs
dF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzddOyB9CisgIGNvbnN0IHN0ZDo6
c3RyaW5nJiBkZWZhdWx0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gZGVmYXVsdF92YWx1ZV87IH0K
KyAgdm9pZCBzZXRfZGVmYXVsdF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgZGVm
YXVsdF92YWx1ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDcpOyB9CisKKyAgYm9vbCBoYXNf
b25lb2ZfaW5kZXgoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s5XTsgfQorICBpbnQzMl90
IG9uZW9mX2luZGV4KCkgY29uc3QgeyByZXR1cm4gb25lb2ZfaW5kZXhfOyB9CisgIHZvaWQgc2V0
X29uZW9mX2luZGV4KGludDMyX3QgdmFsdWUpIHsgb25lb2ZfaW5kZXhfID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCg5KTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV97fTsKKyAg
aW50MzJfdCBudW1iZXJfe307CisgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIGxhYmVsX3t9
OworICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHR5cGVfe307CisgIHN0ZDo6c3RyaW5nIHR5
cGVfbmFtZV97fTsKKyAgc3RkOjpzdHJpbmcgZXh0ZW5kZWVfe307CisgIHN0ZDo6c3RyaW5nIGRl
ZmF1bHRfdmFsdWVfe307CisgIGludDMyX3Qgb25lb2ZfaW5kZXhfe307CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDEwPiBfaGFzX2ZpZWxkX3t9OworfTsK
KworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6cHJv
dG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIFJlc2VydmVkUmFuZ2Ug
PSBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTsKKyAgZW51bSBGaWVsZE51bWJlcnMgewor
ICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtGaWVsZEZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2LAorICAgIGtOZXN0ZWRUeXBlRmllbGROdW1iZXIg
PSAzLAorICAgIGtFbnVtVHlwZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrT25lb2ZEZWNsRmllbGRO
dW1iZXIgPSA4LAorICAgIGtSZXNlcnZlZFJhbmdlRmllbGROdW1iZXIgPSA5LAorICAgIGtSZXNl
cnZlZE5hbWVGaWVsZE51bWJlciA9IDEwLAorICB9OworCisgIERlc2NyaXB0b3JQcm90bygpOwor
ICB+RGVzY3JpcHRvclByb3RvKCkgb3ZlcnJpZGU7CisgIERlc2NyaXB0b3JQcm90byhEZXNjcmlw
dG9yUHJvdG8mJikgbm9leGNlcHQ7CisgIERlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KERlc2Ny
aXB0b3JQcm90byYmKTsKKyAgRGVzY3JpcHRvclByb3RvKGNvbnN0IERlc2NyaXB0b3JQcm90byYp
OworICBEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG8mKTsK
KyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlc2NyaXB0b3JQcm90byYpIGNvbnN0OworICBib29s
IG9wZXJhdG9yIT0oY29uc3QgRGVzY3JpcHRvclByb3RvJiBvdGhlcikgY29uc3QgeyByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
LCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikg
Y29uc3Q7CisKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFd
OyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0K
KyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgbmFtZV8gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgaW50IGZpZWxkX3NpemUoKSBjb25zdCB7IHJl
dHVybiBzdGF0aWNfY2FzdDxpbnQ+KGZpZWxkXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVj
dG9yPEZpZWxkRGVzY3JpcHRvclByb3RvPiYgZmllbGQoKSBjb25zdCB7IHJldHVybiBmaWVsZF87
IH0KKyAgc3RkOjp2ZWN0b3I8RmllbGREZXNjcmlwdG9yUHJvdG8+KiBtdXRhYmxlX2ZpZWxkKCkg
eyByZXR1cm4gJmZpZWxkXzsgfQorICB2b2lkIGNsZWFyX2ZpZWxkKCkgeyBmaWVsZF8uY2xlYXIo
KTsgfQorICBGaWVsZERlc2NyaXB0b3JQcm90byogYWRkX2ZpZWxkKCkgeyBmaWVsZF8uZW1wbGFj
ZV9iYWNrKCk7IHJldHVybiAmZmllbGRfLmJhY2soKTsgfQorCisgIGludCBleHRlbnNpb25fc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZXh0ZW5zaW9uXy5zaXplKCkpOyB9
CisgIGNvbnN0IHN0ZDo6dmVjdG9yPEZpZWxkRGVzY3JpcHRvclByb3RvPiYgZXh0ZW5zaW9uKCkg
Y29uc3QgeyByZXR1cm4gZXh0ZW5zaW9uXzsgfQorICBzdGQ6OnZlY3RvcjxGaWVsZERlc2NyaXB0
b3JQcm90bz4qIG11dGFibGVfZXh0ZW5zaW9uKCkgeyByZXR1cm4gJmV4dGVuc2lvbl87IH0KKyAg
dm9pZCBjbGVhcl9leHRlbnNpb24oKSB7IGV4dGVuc2lvbl8uY2xlYXIoKTsgfQorICBGaWVsZERl
c2NyaXB0b3JQcm90byogYWRkX2V4dGVuc2lvbigpIHsgZXh0ZW5zaW9uXy5lbXBsYWNlX2JhY2so
KTsgcmV0dXJuICZleHRlbnNpb25fLmJhY2soKTsgfQorCisgIGludCBuZXN0ZWRfdHlwZV9zaXpl
KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihuZXN0ZWRfdHlwZV8uc2l6ZSgpKTsg
fQorICBjb25zdCBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yUHJvdG8+JiBuZXN0ZWRfdHlwZSgpIGNv
bnN0IHsgcmV0dXJuIG5lc3RlZF90eXBlXzsgfQorICBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yUHJv
dG8+KiBtdXRhYmxlX25lc3RlZF90eXBlKCkgeyByZXR1cm4gJm5lc3RlZF90eXBlXzsgfQorICB2
b2lkIGNsZWFyX25lc3RlZF90eXBlKCkgeyBuZXN0ZWRfdHlwZV8uY2xlYXIoKTsgfQorICBEZXNj
cmlwdG9yUHJvdG8qIGFkZF9uZXN0ZWRfdHlwZSgpIHsgbmVzdGVkX3R5cGVfLmVtcGxhY2VfYmFj
aygpOyByZXR1cm4gJm5lc3RlZF90eXBlXy5iYWNrKCk7IH0KKworICBpbnQgZW51bV90eXBlX3Np
emUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGVudW1fdHlwZV8uc2l6ZSgpKTsg
fQorICBjb25zdCBzdGQ6OnZlY3RvcjxFbnVtRGVzY3JpcHRvclByb3RvPiYgZW51bV90eXBlKCkg
Y29uc3QgeyByZXR1cm4gZW51bV90eXBlXzsgfQorICBzdGQ6OnZlY3RvcjxFbnVtRGVzY3JpcHRv
clByb3RvPiogbXV0YWJsZV9lbnVtX3R5cGUoKSB7IHJldHVybiAmZW51bV90eXBlXzsgfQorICB2
b2lkIGNsZWFyX2VudW1fdHlwZSgpIHsgZW51bV90eXBlXy5jbGVhcigpOyB9CisgIEVudW1EZXNj
cmlwdG9yUHJvdG8qIGFkZF9lbnVtX3R5cGUoKSB7IGVudW1fdHlwZV8uZW1wbGFjZV9iYWNrKCk7
IHJldHVybiAmZW51bV90eXBlXy5iYWNrKCk7IH0KKworICBpbnQgb25lb2ZfZGVjbF9zaXplKCkg
Y29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihvbmVvZl9kZWNsXy5zaXplKCkpOyB9Cisg
IGNvbnN0IHN0ZDo6dmVjdG9yPE9uZW9mRGVzY3JpcHRvclByb3RvPiYgb25lb2ZfZGVjbCgpIGNv
bnN0IHsgcmV0dXJuIG9uZW9mX2RlY2xfOyB9CisgIHN0ZDo6dmVjdG9yPE9uZW9mRGVzY3JpcHRv
clByb3RvPiogbXV0YWJsZV9vbmVvZl9kZWNsKCkgeyByZXR1cm4gJm9uZW9mX2RlY2xfOyB9Cisg
IHZvaWQgY2xlYXJfb25lb2ZfZGVjbCgpIHsgb25lb2ZfZGVjbF8uY2xlYXIoKTsgfQorICBPbmVv
ZkRlc2NyaXB0b3JQcm90byogYWRkX29uZW9mX2RlY2woKSB7IG9uZW9mX2RlY2xfLmVtcGxhY2Vf
YmFjaygpOyByZXR1cm4gJm9uZW9mX2RlY2xfLmJhY2soKTsgfQorCisgIGludCByZXNlcnZlZF9y
YW5nZV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihyZXNlcnZlZF9yYW5n
ZV8uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2
ZWRSYW5nZT4mIHJlc2VydmVkX3JhbmdlKCkgY29uc3QgeyByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2Vf
OyB9CisgIHN0ZDo6dmVjdG9yPERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlPiogbXV0YWJs
ZV9yZXNlcnZlZF9yYW5nZSgpIHsgcmV0dXJuICZyZXNlcnZlZF9yYW5nZV87IH0KKyAgdm9pZCBj
bGVhcl9yZXNlcnZlZF9yYW5nZSgpIHsgcmVzZXJ2ZWRfcmFuZ2VfLmNsZWFyKCk7IH0KKyAgRGVz
Y3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIGFkZF9yZXNlcnZlZF9yYW5nZSgpIHsgcmVzZXJ2
ZWRfcmFuZ2VfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnJlc2VydmVkX3JhbmdlXy5iYWNrKCk7
IH0KKworICBpbnQgcmVzZXJ2ZWRfbmFtZV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nh
c3Q8aW50PihyZXNlcnZlZF9uYW1lXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0
ZDo6c3RyaW5nPiYgcmVzZXJ2ZWRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHJlc2VydmVkX25hbWVf
OyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9yZXNlcnZlZF9uYW1lKCkg
eyByZXR1cm4gJnJlc2VydmVkX25hbWVfOyB9CisgIHZvaWQgY2xlYXJfcmVzZXJ2ZWRfbmFtZSgp
IHsgcmVzZXJ2ZWRfbmFtZV8uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKHN0
ZDo6c3RyaW5nIHZhbHVlKSB7IHJlc2VydmVkX25hbWVfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0K
KyAgc3RkOjpzdHJpbmcqIGFkZF9yZXNlcnZlZF9uYW1lKCkgeyByZXNlcnZlZF9uYW1lXy5lbXBs
YWNlX2JhY2soKTsgcmV0dXJuICZyZXNlcnZlZF9uYW1lXy5iYWNrKCk7IH0KKworIHByaXZhdGU6
CisgIHN0ZDo6c3RyaW5nIG5hbWVfe307CisgIHN0ZDo6dmVjdG9yPEZpZWxkRGVzY3JpcHRvclBy
b3RvPiBmaWVsZF87CisgIHN0ZDo6dmVjdG9yPEZpZWxkRGVzY3JpcHRvclByb3RvPiBleHRlbnNp
b25fOworICBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yUHJvdG8+IG5lc3RlZF90eXBlXzsKKyAgc3Rk
Ojp2ZWN0b3I8RW51bURlc2NyaXB0b3JQcm90bz4gZW51bV90eXBlXzsKKyAgc3RkOjp2ZWN0b3I8
T25lb2ZEZXNjcmlwdG9yUHJvdG8+IG9uZW9mX2RlY2xfOworICBzdGQ6OnZlY3RvcjxEZXNjcmlw
dG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZT4gcmVzZXJ2ZWRfcmFuZ2VfOworICBzdGQ6OnZlY3Rvcjxz
dGQ6OnN0cmluZz4gcmVzZXJ2ZWRfbmFtZV87CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVu
a25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJl
IHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNf
OworCisgIHN0ZDo6Yml0c2V0PDExPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJG
RVRUT19FWFBPUlQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgOiBwdWJsaWMgOjpwcm90
b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgewor
ICAgIGtTdGFydEZpZWxkTnVtYmVyID0gMSwKKyAgICBrRW5kRmllbGROdW1iZXIgPSAyLAorICB9
OworCisgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCk7CisgIH5EZXNjcmlwdG9yUHJv
dG9fUmVzZXJ2ZWRSYW5nZSgpIG92ZXJyaWRlOworICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRS
YW5nZShEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYmKSBub2V4Y2VwdDsKKyAgRGVzY3Jp
cHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIG9wZXJhdG9yPShEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2
ZWRSYW5nZSYmKTsKKyAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoY29uc3QgRGVzY3Jp
cHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmKTsKKyAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFu
Z2UmIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYpOworICBi
b29sIG9wZXJhdG9yPT0oY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmKSBjb25z
dDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdl
JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmlu
ZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50
OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXpl
KDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfc3RhcnQoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQzMl90IHN0YXJ0KCkgY29uc3QgeyBy
ZXR1cm4gc3RhcnRfOyB9CisgIHZvaWQgc2V0X3N0YXJ0KGludDMyX3QgdmFsdWUpIHsgc3RhcnRf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2VuZCgpIGNvbnN0
IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGludDMyX3QgZW5kKCkgY29uc3QgeyByZXR1
cm4gZW5kXzsgfQorICB2b2lkIHNldF9lbmQoaW50MzJfdCB2YWx1ZSkgeyBlbmRfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBzdGFydF97fTsK
KyAgaW50MzJfdCBlbmRfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJv
dG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25z
IG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0
ZDo6Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9S
VCBGaWxlRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2Jq
IHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrTmFtZUZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrUGFja2FnZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrRGVwZW5kZW5jeUZpZWxk
TnVtYmVyID0gMywKKyAgICBrUHVibGljRGVwZW5kZW5jeUZpZWxkTnVtYmVyID0gMTAsCisgICAg
a1dlYWtEZXBlbmRlbmN5RmllbGROdW1iZXIgPSAxMSwKKyAgICBrTWVzc2FnZVR5cGVGaWVsZE51
bWJlciA9IDQsCisgICAga0VudW1UeXBlRmllbGROdW1iZXIgPSA1LAorICAgIGtFeHRlbnNpb25G
aWVsZE51bWJlciA9IDcsCisgIH07CisKKyAgRmlsZURlc2NyaXB0b3JQcm90bygpOworICB+Rmls
ZURlc2NyaXB0b3JQcm90bygpIG92ZXJyaWRlOworICBGaWxlRGVzY3JpcHRvclByb3RvKEZpbGVE
ZXNjcmlwdG9yUHJvdG8mJikgbm9leGNlcHQ7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8mIG9wZXJh
dG9yPShGaWxlRGVzY3JpcHRvclByb3RvJiYpOworICBGaWxlRGVzY3JpcHRvclByb3RvKGNvbnN0
IEZpbGVEZXNjcmlwdG9yUHJvdG8mKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9
KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZp
bGVEZXNjcmlwdG9yUHJvdG8mKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZpbGVE
ZXNjcmlwdG9yUHJvdG8mIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsg
fQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7
CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0
ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAg
dm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhh
c19uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpz
dHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorICB2b2lkIHNldF9uYW1lKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBuYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
MSk7IH0KKworICBib29sIGhhc19wYWNrYWdlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9b
Ml07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UoKSBjb25zdCB7IHJldHVybiBwYWNr
YWdlXzsgfQorICB2b2lkIHNldF9wYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBw
YWNrYWdlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBpbnQgZGVwZW5kZW5j
eV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkZXBlbmRlbmN5Xy5zaXpl
KCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGVwZW5kZW5jeSgpIGNv
bnN0IHsgcmV0dXJuIGRlcGVuZGVuY3lfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiog
bXV0YWJsZV9kZXBlbmRlbmN5KCkgeyByZXR1cm4gJmRlcGVuZGVuY3lfOyB9CisgIHZvaWQgY2xl
YXJfZGVwZW5kZW5jeSgpIHsgZGVwZW5kZW5jeV8uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9kZXBl
bmRlbmN5KHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGRlcGVuZGVuY3lfLmVtcGxhY2VfYmFjayh2YWx1
ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9kZXBlbmRlbmN5KCkgeyBkZXBlbmRlbmN5Xy5lbXBs
YWNlX2JhY2soKTsgcmV0dXJuICZkZXBlbmRlbmN5Xy5iYWNrKCk7IH0KKworICBpbnQgcHVibGlj
X2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocHVibGlj
X2RlcGVuZGVuY3lfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHB1
YmxpY19kZXBlbmRlbmN5KCkgY29uc3QgeyByZXR1cm4gcHVibGljX2RlcGVuZGVuY3lfOyB9Cisg
IHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBtdXRhYmxlX3B1YmxpY19kZXBlbmRlbmN5KCkgeyByZXR1
cm4gJnB1YmxpY19kZXBlbmRlbmN5XzsgfQorICB2b2lkIGNsZWFyX3B1YmxpY19kZXBlbmRlbmN5
KCkgeyBwdWJsaWNfZGVwZW5kZW5jeV8uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9wdWJsaWNfZGVw
ZW5kZW5jeShpbnQzMl90IHZhbHVlKSB7IHB1YmxpY19kZXBlbmRlbmN5Xy5lbXBsYWNlX2JhY2so
dmFsdWUpOyB9CisgIGludDMyX3QqIGFkZF9wdWJsaWNfZGVwZW5kZW5jeSgpIHsgcHVibGljX2Rl
cGVuZGVuY3lfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnB1YmxpY19kZXBlbmRlbmN5Xy5iYWNr
KCk7IH0KKworICBpbnQgd2Vha19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0
aWNfY2FzdDxpbnQ+KHdlYWtfZGVwZW5kZW5jeV8uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZl
Y3RvcjxpbnQzMl90PiYgd2Vha19kZXBlbmRlbmN5KCkgY29uc3QgeyByZXR1cm4gd2Vha19kZXBl
bmRlbmN5XzsgfQorICBzdGQ6OnZlY3RvcjxpbnQzMl90PiogbXV0YWJsZV93ZWFrX2RlcGVuZGVu
Y3koKSB7IHJldHVybiAmd2Vha19kZXBlbmRlbmN5XzsgfQorICB2b2lkIGNsZWFyX3dlYWtfZGVw
ZW5kZW5jeSgpIHsgd2Vha19kZXBlbmRlbmN5Xy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX3dlYWtf
ZGVwZW5kZW5jeShpbnQzMl90IHZhbHVlKSB7IHdlYWtfZGVwZW5kZW5jeV8uZW1wbGFjZV9iYWNr
KHZhbHVlKTsgfQorICBpbnQzMl90KiBhZGRfd2Vha19kZXBlbmRlbmN5KCkgeyB3ZWFrX2RlcGVu
ZGVuY3lfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJndlYWtfZGVwZW5kZW5jeV8uYmFjaygpOyB9
CisKKyAgaW50IG1lc3NhZ2VfdHlwZV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8
aW50PihtZXNzYWdlX3R5cGVfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8RGVzY3Jp
cHRvclByb3RvPiYgbWVzc2FnZV90eXBlKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZV90eXBlXzsg
fQorICBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yUHJvdG8+KiBtdXRhYmxlX21lc3NhZ2VfdHlwZSgp
IHsgcmV0dXJuICZtZXNzYWdlX3R5cGVfOyB9CisgIHZvaWQgY2xlYXJfbWVzc2FnZV90eXBlKCkg
eyBtZXNzYWdlX3R5cGVfLmNsZWFyKCk7IH0KKyAgRGVzY3JpcHRvclByb3RvKiBhZGRfbWVzc2Fn
ZV90eXBlKCkgeyBtZXNzYWdlX3R5cGVfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJm1lc3NhZ2Vf
dHlwZV8uYmFjaygpOyB9CisKKyAgaW50IGVudW1fdHlwZV9zaXplKCkgY29uc3QgeyByZXR1cm4g
c3RhdGljX2Nhc3Q8aW50PihlbnVtX3R5cGVfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0
b3I8RW51bURlc2NyaXB0b3JQcm90bz4mIGVudW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVudW1f
dHlwZV87IH0KKyAgc3RkOjp2ZWN0b3I8RW51bURlc2NyaXB0b3JQcm90bz4qIG11dGFibGVfZW51
bV90eXBlKCkgeyByZXR1cm4gJmVudW1fdHlwZV87IH0KKyAgdm9pZCBjbGVhcl9lbnVtX3R5cGUo
KSB7IGVudW1fdHlwZV8uY2xlYXIoKTsgfQorICBFbnVtRGVzY3JpcHRvclByb3RvKiBhZGRfZW51
bV90eXBlKCkgeyBlbnVtX3R5cGVfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJmVudW1fdHlwZV8u
YmFjaygpOyB9CisKKyAgaW50IGV4dGVuc2lvbl9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGlj
X2Nhc3Q8aW50PihleHRlbnNpb25fLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Rmll
bGREZXNjcmlwdG9yUHJvdG8+JiBleHRlbnNpb24oKSBjb25zdCB7IHJldHVybiBleHRlbnNpb25f
OyB9CisgIHN0ZDo6dmVjdG9yPEZpZWxkRGVzY3JpcHRvclByb3RvPiogbXV0YWJsZV9leHRlbnNp
b24oKSB7IHJldHVybiAmZXh0ZW5zaW9uXzsgfQorICB2b2lkIGNsZWFyX2V4dGVuc2lvbigpIHsg
ZXh0ZW5zaW9uXy5jbGVhcigpOyB9CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZXh0ZW5z
aW9uKCkgeyBleHRlbnNpb25fLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJmV4dGVuc2lvbl8uYmFj
aygpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lX3t9OworICBzdGQ6OnN0cmlu
ZyBwYWNrYWdlX3t9OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGVwZW5kZW5jeV87Cisg
IHN0ZDo6dmVjdG9yPGludDMyX3Q+IHB1YmxpY19kZXBlbmRlbmN5XzsKKyAgc3RkOjp2ZWN0b3I8
aW50MzJfdD4gd2Vha19kZXBlbmRlbmN5XzsKKyAgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvclByb3Rv
PiBtZXNzYWdlX3R5cGVfOworICBzdGQ6OnZlY3RvcjxFbnVtRGVzY3JpcHRvclByb3RvPiBlbnVt
X3R5cGVfOworICBzdGQ6OnZlY3RvcjxGaWVsZERlc2NyaXB0b3JQcm90bz4gZXh0ZW5zaW9uXzsK
KworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNv
bXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgor
ICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8MTI+IF9oYXNf
ZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBGaWxlRGVzY3JpcHRvclNl
dCA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVt
IEZpZWxkTnVtYmVycyB7CisgICAga0ZpbGVGaWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgRmls
ZURlc2NyaXB0b3JTZXQoKTsKKyAgfkZpbGVEZXNjcmlwdG9yU2V0KCkgb3ZlcnJpZGU7CisgIEZp
bGVEZXNjcmlwdG9yU2V0KEZpbGVEZXNjcmlwdG9yU2V0JiYpIG5vZXhjZXB0OworICBGaWxlRGVz
Y3JpcHRvclNldCYgb3BlcmF0b3I9KEZpbGVEZXNjcmlwdG9yU2V0JiYpOworICBGaWxlRGVzY3Jp
cHRvclNldChjb25zdCBGaWxlRGVzY3JpcHRvclNldCYpOworICBGaWxlRGVzY3JpcHRvclNldCYg
b3BlcmF0b3I9KGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0Jik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBGaWxlRGVzY3JpcHRvclNldCYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
RmlsZURlc2NyaXB0b3JTZXQmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVy
KTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJp
ZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cisg
IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsK
KyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBpbnQg
ZmlsZV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihmaWxlXy5zaXplKCkp
OyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPEZpbGVEZXNjcmlwdG9yUHJvdG8+JiBmaWxlKCkgY29u
c3QgeyByZXR1cm4gZmlsZV87IH0KKyAgc3RkOjp2ZWN0b3I8RmlsZURlc2NyaXB0b3JQcm90bz4q
IG11dGFibGVfZmlsZSgpIHsgcmV0dXJuICZmaWxlXzsgfQorICB2b2lkIGNsZWFyX2ZpbGUoKSB7
IGZpbGVfLmNsZWFyKCk7IH0KKyAgRmlsZURlc2NyaXB0b3JQcm90byogYWRkX2ZpbGUoKSB7IGZp
bGVfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJmZpbGVfLmJhY2soKTsgfQorCisgcHJpdmF0ZToK
KyAgc3RkOjp2ZWN0b3I8RmlsZURlc2NyaXB0b3JQcm90bz4gZmlsZV87CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9Owor
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8v
IG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTU1PTl9ERVNDUklQVE9SX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRf
cmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1
ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2Vu
X3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9z
dGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2Rlc2NyaXB0b3IuZ2VuLmgiCisKK25h
bWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4gewor
CitPbmVvZk9wdGlvbnM6Ok9uZW9mT3B0aW9ucygpID0gZGVmYXVsdDsKK09uZW9mT3B0aW9uczo6
fk9uZW9mT3B0aW9ucygpID0gZGVmYXVsdDsKK09uZW9mT3B0aW9uczo6T25lb2ZPcHRpb25zKGNv
bnN0IE9uZW9mT3B0aW9ucyYpID0gZGVmYXVsdDsKK09uZW9mT3B0aW9ucyYgT25lb2ZPcHRpb25z
OjpvcGVyYXRvcj0oY29uc3QgT25lb2ZPcHRpb25zJikgPSBkZWZhdWx0OworT25lb2ZPcHRpb25z
OjpPbmVvZk9wdGlvbnMoT25lb2ZPcHRpb25zJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK09uZW9m
T3B0aW9ucyYgT25lb2ZPcHRpb25zOjpvcGVyYXRvcj0oT25lb2ZPcHRpb25zJiYpID0gZGVmYXVs
dDsKKworYm9vbCBPbmVvZk9wdGlvbnM6Om9wZXJhdG9yPT0oY29uc3QgT25lb2ZPcHRpb25zJiBv
dGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25f
ZmllbGRzXzsKK30KKworYm9vbCBPbmVvZk9wdGlvbnM6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZv
aWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAg
ICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5
dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgT25lb2ZPcHRpb25zOjpTZXJpYWxpemVBc1N0
cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6
TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJp
YWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBPbmVvZk9wdGlvbnM6
OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8
Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJl
dHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIE9uZW9mT3B0aW9uczo6U2Vy
aWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgbXNnLT5BcHBlbmRS
YXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXpl
KCkpOworfQorCisKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6RW51bVZhbHVlRGVzY3JpcHRv
clByb3RvKCkgPSBkZWZhdWx0OworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjp+RW51bVZhbHVl
RGVzY3JpcHRvclByb3RvKCkgPSBkZWZhdWx0OworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpF
bnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJikg
PSBkZWZhdWx0OworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBFbnVtVmFsdWVEZXNjcmlwdG9y
UHJvdG86Om9wZXJhdG9yPShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mKSA9IGRlZmF1
bHQ7CitFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byhF
bnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mJikgbm9leGNlcHQgPSBkZWZhdWx0OworRW51bVZhbHVl
RGVzY3JpcHRvclByb3RvJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om9wZXJhdG9yPShFbnVt
VmFsdWVEZXNjcmlwdG9yUHJvdG8mJikgPSBkZWZhdWx0OworCitib29sIEVudW1WYWx1ZURlc2Ny
aXB0b3JQcm90bzo6b3BlcmF0b3I9PShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIG90
aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9m
aWVsZHNfCisgICAmJiBuYW1lXyA9PSBvdGhlci5uYW1lXworICAgJiYgbnVtYmVyXyA9PSBvdGhl
ci5udW1iZXJfOworfQorCitib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6UGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18u
Y2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6
UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAg
aWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRf
LnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAg
ICBjYXNlIDEgLyogbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZuYW1lXyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAyIC8qIG51bWJlciAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZu
dW1iZXJfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5T
ZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOwor
fQorCitzdGQ6OnN0cmluZyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZUFzU3Ry
aW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEVudW1WYWx1ZURlc2Ny
aXB0b3JQcm90bzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgRW51bVZh
bHVlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykg
Y29uc3QgeworICAvLyBGaWVsZCAxOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAg
IG1zZy0+QXBwZW5kU3RyaW5nKDEsIG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IG51bWJl
cgorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBudW1i
ZXJfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18u
ZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitFbnVtRGVzY3JpcHRvclBy
b3RvOjpFbnVtRGVzY3JpcHRvclByb3RvKCkgPSBkZWZhdWx0OworRW51bURlc2NyaXB0b3JQcm90
bzo6fkVudW1EZXNjcmlwdG9yUHJvdG8oKSA9IGRlZmF1bHQ7CitFbnVtRGVzY3JpcHRvclByb3Rv
OjpFbnVtRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mKSA9IGRlZmF1
bHQ7CitFbnVtRGVzY3JpcHRvclByb3RvJiBFbnVtRGVzY3JpcHRvclByb3RvOjpvcGVyYXRvcj0o
Y29uc3QgRW51bURlc2NyaXB0b3JQcm90byYpID0gZGVmYXVsdDsKK0VudW1EZXNjcmlwdG9yUHJv
dG86OkVudW1EZXNjcmlwdG9yUHJvdG8oRW51bURlc2NyaXB0b3JQcm90byYmKSBub2V4Y2VwdCA9
IGRlZmF1bHQ7CitFbnVtRGVzY3JpcHRvclByb3RvJiBFbnVtRGVzY3JpcHRvclByb3RvOjpvcGVy
YXRvcj0oRW51bURlc2NyaXB0b3JQcm90byYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRW51bURlc2Ny
aXB0b3JQcm90bzo6b3BlcmF0b3I9PShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBvdGhlcikg
Y29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRz
XworICAgJiYgbmFtZV8gPT0gb3RoZXIubmFtZV8KKyAgICYmIHZhbHVlXyA9PSBvdGhlci52YWx1
ZV8KKyAgICYmIHJlc2VydmVkX25hbWVfID09IG90aGVyLnJlc2VydmVkX25hbWVfOworfQorCiti
b29sIEVudW1EZXNjcmlwdG9yUHJvdG86OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywg
c2l6ZV90IHNpemUpIHsKKyAgdmFsdWVfLmNsZWFyKCk7CisgIHJlc2VydmVkX25hbWVfLmNsZWFy
KCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZh
bHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZv
ciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUo
KSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0
Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBuYW1lICovOgorICAgICAgICBmaWVs
ZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogdmFsdWUgKi86
CisgICAgICAgIHZhbHVlXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgdmFsdWVfLmJhY2soKS5Q
YXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDUgLyogcmVzZXJ2ZWRfbmFtZSAqLzoKKyAgICAgICAgcmVzZXJ2ZWRfbmFtZV8u
ZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmcmVzZXJ2ZWRfbmFtZV8uYmFjaygp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxp
emVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitz
dGQ6OnN0cmluZyBFbnVtRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0
IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNn
OworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmlu
ZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBFbnVtRGVzY3JpcHRvclByb3RvOjpTZXJp
YWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJv
dG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4g
bXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAx
OiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEs
IG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHZhbHVlCisgIGZvciAoYXV0byYgaXQgOiB2
YWx1ZV8pIHsKKyAgICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90
b3plcm86Ok1lc3NhZ2U+KDIpKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IHJlc2VydmVkX25hbWUK
KyAgZm9yIChhdXRvJiBpdCA6IHJlc2VydmVkX25hbWVfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJp
bmcoNSwgaXQpOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmll
bGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK09uZW9mRGVzY3Jp
cHRvclByb3RvOjpPbmVvZkRlc2NyaXB0b3JQcm90bygpID0gZGVmYXVsdDsKK09uZW9mRGVzY3Jp
cHRvclByb3RvOjp+T25lb2ZEZXNjcmlwdG9yUHJvdG8oKSA9IGRlZmF1bHQ7CitPbmVvZkRlc2Ny
aXB0b3JQcm90bzo6T25lb2ZEZXNjcmlwdG9yUHJvdG8oY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJv
dG8mKSA9IGRlZmF1bHQ7CitPbmVvZkRlc2NyaXB0b3JQcm90byYgT25lb2ZEZXNjcmlwdG9yUHJv
dG86Om9wZXJhdG9yPShjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYpID0gZGVmYXVsdDsKK09u
ZW9mRGVzY3JpcHRvclByb3RvOjpPbmVvZkRlc2NyaXB0b3JQcm90byhPbmVvZkRlc2NyaXB0b3JQ
cm90byYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitPbmVvZkRlc2NyaXB0b3JQcm90byYgT25lb2ZE
ZXNjcmlwdG9yUHJvdG86Om9wZXJhdG9yPShPbmVvZkRlc2NyaXB0b3JQcm90byYmKSA9IGRlZmF1
bHQ7CisKK2Jvb2wgT25lb2ZEZXNjcmlwdG9yUHJvdG86Om9wZXJhdG9yPT0oY29uc3QgT25lb2ZE
ZXNjcmlwdG9yUHJvdG8mIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18g
PT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBuYW1lXyA9PSBvdGhlci5uYW1lXworICAg
JiYgb3B0aW9uc18gPT0gb3RoZXIub3B0aW9uc187Cit9CisKK2Jvb2wgT25lb2ZEZXNjcmlwdG9y
UHJvdG86OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAg
dW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisK
KyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRv
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFk
RmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7Cisg
ICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmll
bGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIG5hbWUgKi86CisgICAgICAgIGZpZWxkLmdldCgm
bmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBvcHRpb25zICovOgorICAg
ICAgICAoKm9wdGlvbnNfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVB
bmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9
CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6
OnN0cmluZyBPbmVvZkRlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmco
KTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gT25lb2ZEZXNjcmlwdG9yUHJvdG86OlNlcmlh
bGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90
b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBt
c2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAx
OiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEs
IG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IG9wdGlvbnMKKyAgaWYgKF9oYXNfZmllbGRf
WzJdKSB7CisgICAgKCpvcHRpb25zXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdl
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyKSk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3Rv
Qnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9
CisKKworRmllbGREZXNjcmlwdG9yUHJvdG86OkZpZWxkRGVzY3JpcHRvclByb3RvKCkgPSBkZWZh
dWx0OworRmllbGREZXNjcmlwdG9yUHJvdG86On5GaWVsZERlc2NyaXB0b3JQcm90bygpID0gZGVm
YXVsdDsKK0ZpZWxkRGVzY3JpcHRvclByb3RvOjpGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCBG
aWVsZERlc2NyaXB0b3JQcm90byYpID0gZGVmYXVsdDsKK0ZpZWxkRGVzY3JpcHRvclByb3RvJiBG
aWVsZERlc2NyaXB0b3JQcm90bzo6b3BlcmF0b3I9KGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3Rv
JikgPSBkZWZhdWx0OworRmllbGREZXNjcmlwdG9yUHJvdG86OkZpZWxkRGVzY3JpcHRvclByb3Rv
KEZpZWxkRGVzY3JpcHRvclByb3RvJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0ZpZWxkRGVzY3Jp
cHRvclByb3RvJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6b3BlcmF0b3I9KEZpZWxkRGVzY3JpcHRv
clByb3RvJiYpID0gZGVmYXVsdDsKKworYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6b3BlcmF0
b3I9PShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJu
IHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIG5hbWVfID09
IG90aGVyLm5hbWVfCisgICAmJiBudW1iZXJfID09IG90aGVyLm51bWJlcl8KKyAgICYmIGxhYmVs
XyA9PSBvdGhlci5sYWJlbF8KKyAgICYmIHR5cGVfID09IG90aGVyLnR5cGVfCisgICAmJiB0eXBl
X25hbWVfID09IG90aGVyLnR5cGVfbmFtZV8KKyAgICYmIGV4dGVuZGVlXyA9PSBvdGhlci5leHRl
bmRlZV8KKyAgICYmIGRlZmF1bHRfdmFsdWVfID09IG90aGVyLmRlZmF1bHRfdmFsdWVfCisgICAm
JiBvbmVvZl9pbmRleF8gPT0gb3RoZXIub25lb2ZfaW5kZXhfOworfQorCitib29sIEZpZWxkRGVz
Y3JpcHRvclByb3RvOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXpl
KSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZh
bHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZv
ciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUo
KSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0
Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBuYW1lICovOgorICAgICAgICBmaWVs
ZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogbnVtYmVyICov
OgorICAgICAgICBmaWVsZC5nZXQoJm51bWJlcl8pOworICAgICAgICBicmVhazsKKyAgICAgIGNh
c2UgNCAvKiBsYWJlbCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZsYWJlbF8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgNSAvKiB0eXBlICovOgorICAgICAgICBmaWVsZC5nZXQoJnR5cGVf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYgLyogdHlwZV9uYW1lICovOgorICAgICAg
ICBmaWVsZC5nZXQoJnR5cGVfbmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAv
KiBleHRlbmRlZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZleHRlbmRlZV8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgNyAvKiBkZWZhdWx0X3ZhbHVlICovOgorICAgICAgICBmaWVsZC5n
ZXQoJmRlZmF1bHRfdmFsdWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDkgLyogb25l
b2ZfaW5kZXggKi86CisgICAgICAgIGZpZWxkLmdldCgmb25lb2ZfaW5kZXhfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRU
bygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVy
biAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBG
aWVsZERlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKwor
c3RkOjp2ZWN0b3I8dWludDhfdD4gRmllbGREZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZUFzQXJy
YXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNBcnJheSgpOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemUo
Ojpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBuYW1lCisg
IGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEsIG5hbWVfKTsK
KyAgfQorCisgIC8vIEZpZWxkIDM6IG51bWJlcgorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAg
ICBtc2ctPkFwcGVuZFZhckludCgzLCBudW1iZXJfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IGxh
YmVsCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDQsIGxh
YmVsXyk7CisgIH0KKworICAvLyBGaWVsZCA1OiB0eXBlCisgIGlmIChfaGFzX2ZpZWxkX1s1XSkg
eworICAgIG1zZy0+QXBwZW5kVmFySW50KDUsIHR5cGVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDY6
IHR5cGVfbmFtZQorICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmlu
Zyg2LCB0eXBlX25hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGV4dGVuZGVlCisgIGlmIChf
aGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIGV4dGVuZGVlXyk7Cisg
IH0KKworICAvLyBGaWVsZCA3OiBkZWZhdWx0X3ZhbHVlCisgIGlmIChfaGFzX2ZpZWxkX1s3XSkg
eworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDcsIGRlZmF1bHRfdmFsdWVfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDk6IG9uZW9mX2luZGV4CisgIGlmIChfaGFzX2ZpZWxkX1s5XSkgeworICAgIG1zZy0+
QXBwZW5kVmFySW50KDksIG9uZW9mX2luZGV4Xyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKKworRGVzY3JpcHRvclByb3RvOjpEZXNjcmlwdG9yUHJvdG8oKSA9IGRlZmF1bHQ7CitE
ZXNjcmlwdG9yUHJvdG86On5EZXNjcmlwdG9yUHJvdG8oKSA9IGRlZmF1bHQ7CitEZXNjcmlwdG9y
UHJvdG86OkRlc2NyaXB0b3JQcm90byhjb25zdCBEZXNjcmlwdG9yUHJvdG8mKSA9IGRlZmF1bHQ7
CitEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6b3BlcmF0b3I9KGNvbnN0IERlc2Ny
aXB0b3JQcm90byYpID0gZGVmYXVsdDsKK0Rlc2NyaXB0b3JQcm90bzo6RGVzY3JpcHRvclByb3Rv
KERlc2NyaXB0b3JQcm90byYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitEZXNjcmlwdG9yUHJvdG8m
IERlc2NyaXB0b3JQcm90bzo6b3BlcmF0b3I9KERlc2NyaXB0b3JQcm90byYmKSA9IGRlZmF1bHQ7
CisKK2Jvb2wgRGVzY3JpcHRvclByb3RvOjpvcGVyYXRvcj09KGNvbnN0IERlc2NyaXB0b3JQcm90
byYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtu
b3duX2ZpZWxkc18KKyAgICYmIG5hbWVfID09IG90aGVyLm5hbWVfCisgICAmJiBmaWVsZF8gPT0g
b3RoZXIuZmllbGRfCisgICAmJiBleHRlbnNpb25fID09IG90aGVyLmV4dGVuc2lvbl8KKyAgICYm
IG5lc3RlZF90eXBlXyA9PSBvdGhlci5uZXN0ZWRfdHlwZV8KKyAgICYmIGVudW1fdHlwZV8gPT0g
b3RoZXIuZW51bV90eXBlXworICAgJiYgb25lb2ZfZGVjbF8gPT0gb3RoZXIub25lb2ZfZGVjbF8K
KyAgICYmIHJlc2VydmVkX3JhbmdlXyA9PSBvdGhlci5yZXNlcnZlZF9yYW5nZV8KKyAgICYmIHJl
c2VydmVkX25hbWVfID09IG90aGVyLnJlc2VydmVkX25hbWVfOworfQorCitib29sIERlc2NyaXB0
b3JQcm90bzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgewor
ICBmaWVsZF8uY2xlYXIoKTsKKyAgZXh0ZW5zaW9uXy5jbGVhcigpOworICBuZXN0ZWRfdHlwZV8u
Y2xlYXIoKTsKKyAgZW51bV90eXBlXy5jbGVhcigpOworICBvbmVvZl9kZWNsXy5jbGVhcigpOwor
ICByZXNlcnZlZF9yYW5nZV8uY2xlYXIoKTsKKyAgcmVzZXJ2ZWRfbmFtZV8uY2xlYXIoKTsKKyAg
dW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisK
KyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRv
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFk
RmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7Cisg
ICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmll
bGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIG5hbWUgKi86CisgICAgICAgIGZpZWxkLmdldCgm
bmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBmaWVsZCAqLzoKKyAgICAg
ICAgZmllbGRfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZF8uYmFjaygpLlBhcnNlRnJv
bVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNh
c2UgNiAvKiBleHRlbnNpb24gKi86CisgICAgICAgIGV4dGVuc2lvbl8uZW1wbGFjZV9iYWNrKCk7
CisgICAgICAgIGV4dGVuc2lvbl8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRf
c3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBuZXN0ZWRfdHlwZSAq
LzoKKyAgICAgICAgbmVzdGVkX3R5cGVfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBuZXN0ZWRf
dHlwZV8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBlbnVtX3R5cGUgKi86CisgICAgICAgIGVudW1f
dHlwZV8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGVudW1fdHlwZV8uYmFjaygpLlBhcnNlRnJv
bVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNh
c2UgOCAvKiBvbmVvZl9kZWNsICovOgorICAgICAgICBvbmVvZl9kZWNsXy5lbXBsYWNlX2JhY2so
KTsKKyAgICAgICAgb25lb2ZfZGVjbF8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19z
dGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOSAvKiByZXNlcnZlZF9y
YW5nZSAqLzoKKyAgICAgICAgcmVzZXJ2ZWRfcmFuZ2VfLmVtcGxhY2VfYmFjaygpOworICAgICAg
ICByZXNlcnZlZF9yYW5nZV8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3Ry
aW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAgLyogcmVzZXJ2ZWRfbmFtZSAq
LzoKKyAgICAgICAgcmVzZXJ2ZWRfbmFtZV8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxk
LmdldCgmcmVzZXJ2ZWRfbmFtZV8uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZh
dWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYm
ICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBEZXNjcmlwdG9yUHJvdG86OlNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6
cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1
cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IERl
c2NyaXB0b3JQcm90bzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86
OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNn
LmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgRGVz
Y3JpcHRvclByb3RvOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qg
eworICAvLyBGaWVsZCAxOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+
QXBwZW5kU3RyaW5nKDEsIG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGZpZWxkCisgIGZv
ciAoYXV0byYgaXQgOiBmaWVsZF8pIHsKKyAgICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3Rl
ZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDIpKTsKKyAgfQorCisgIC8vIEZpZWxkIDY6
IGV4dGVuc2lvbgorICBmb3IgKGF1dG8mIGl0IDogZXh0ZW5zaW9uXykgeworICAgIGl0LlNlcmlh
bGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oNikpOwor
ICB9CisKKyAgLy8gRmllbGQgMzogbmVzdGVkX3R5cGUKKyAgZm9yIChhdXRvJiBpdCA6IG5lc3Rl
ZF90eXBlXykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnBy
b3RvemVybzo6TWVzc2FnZT4oMykpOworICB9CisKKyAgLy8gRmllbGQgNDogZW51bV90eXBlCisg
IGZvciAoYXV0byYgaXQgOiBlbnVtX3R5cGVfKSB7CisgICAgaXQuU2VyaWFsaXplKG1zZy0+QmVn
aW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPig0KSk7CisgIH0KKworICAvLyBG
aWVsZCA4OiBvbmVvZl9kZWNsCisgIGZvciAoYXV0byYgaXQgOiBvbmVvZl9kZWNsXykgeworICAg
IGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2Fn
ZT4oOCkpOworICB9CisKKyAgLy8gRmllbGQgOTogcmVzZXJ2ZWRfcmFuZ2UKKyAgZm9yIChhdXRv
JiBpdCA6IHJlc2VydmVkX3JhbmdlXykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVz
dGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oOSkpOworICB9CisKKyAgLy8gRmllbGQg
MTA6IHJlc2VydmVkX25hbWUKKyAgZm9yIChhdXRvJiBpdCA6IHJlc2VydmVkX25hbWVfKSB7Cisg
ICAgbXNnLT5BcHBlbmRTdHJpbmcoMTAsIGl0KTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJv
dG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsK
K30KKworCitEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6RGVzY3JpcHRvclByb3RvX1Jl
c2VydmVkUmFuZ2UoKSA9IGRlZmF1bHQ7CitEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6
fkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCkgPSBkZWZhdWx0OworRGVzY3JpcHRvclBy
b3RvX1Jlc2VydmVkUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKGNvbnN0IERl
c2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJikgPSBkZWZhdWx0OworRGVzY3JpcHRvclByb3Rv
X1Jlc2VydmVkUmFuZ2UmIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpvcGVyYXRvcj0o
Y29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmKSA9IGRlZmF1bHQ7CitEZXNjcmlw
dG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoRGVz
Y3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmJikgbm9leGNlcHQgPSBkZWZhdWx0OworRGVzY3Jp
cHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpv
cGVyYXRvcj0oRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmJikgPSBkZWZhdWx0OworCiti
b29sIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpvcGVyYXRvcj09KGNvbnN0IERlc2Ny
aXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93
bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgc3RhcnRfID09IG90aGVy
LnN0YXJ0XworICAgJiYgZW5kXyA9PSBvdGhlci5lbmRfOworfQorCitib29sIERlc2NyaXB0b3JQ
cm90b19SZXNlcnZlZFJhbmdlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVf
dCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJv
ciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7
CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmll
bGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRf
LnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAg
ICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBzdGFydCAqLzoKKyAgICAg
ICAgZmllbGQuZ2V0KCZzdGFydF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBl
bmQgKi86CisgICAgICAgIGZpZWxkLmdldCgmZW5kXyk7CisgICAgICAgIGJyZWFrOworICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmll
bGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJv
ciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgRGVzY3JpcHRvclByb3Rv
X1Jlc2VydmVkUmFuZ2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVy
bzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZSht
c2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpTZXJpYWxpemVB
c0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNl
cmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5n
ZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmll
bGQgMTogc3RhcnQKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJ
bnQoMSwgc3RhcnRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGVuZAorICBpZiAoX2hhc19maWVs
ZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBlbmRfKTsKKyAgfQorCisgIG1zZy0+
QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxk
c18uc2l6ZSgpKTsKK30KKworCitGaWxlRGVzY3JpcHRvclByb3RvOjpGaWxlRGVzY3JpcHRvclBy
b3RvKCkgPSBkZWZhdWx0OworRmlsZURlc2NyaXB0b3JQcm90bzo6fkZpbGVEZXNjcmlwdG9yUHJv
dG8oKSA9IGRlZmF1bHQ7CitGaWxlRGVzY3JpcHRvclByb3RvOjpGaWxlRGVzY3JpcHRvclByb3Rv
KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mKSA9IGRlZmF1bHQ7CitGaWxlRGVzY3JpcHRvclBy
b3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpvcGVyYXRvcj0oY29uc3QgRmlsZURlc2NyaXB0b3JQ
cm90byYpID0gZGVmYXVsdDsKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OkZpbGVEZXNjcmlwdG9yUHJv
dG8oRmlsZURlc2NyaXB0b3JQcm90byYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitGaWxlRGVzY3Jp
cHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpvcGVyYXRvcj0oRmlsZURlc2NyaXB0b3JQ
cm90byYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6b3BlcmF0b3I9
PShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5r
bm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgbmFtZV8gPT0gb3Ro
ZXIubmFtZV8KKyAgICYmIHBhY2thZ2VfID09IG90aGVyLnBhY2thZ2VfCisgICAmJiBkZXBlbmRl
bmN5XyA9PSBvdGhlci5kZXBlbmRlbmN5XworICAgJiYgcHVibGljX2RlcGVuZGVuY3lfID09IG90
aGVyLnB1YmxpY19kZXBlbmRlbmN5XworICAgJiYgd2Vha19kZXBlbmRlbmN5XyA9PSBvdGhlci53
ZWFrX2RlcGVuZGVuY3lfCisgICAmJiBtZXNzYWdlX3R5cGVfID09IG90aGVyLm1lc3NhZ2VfdHlw
ZV8KKyAgICYmIGVudW1fdHlwZV8gPT0gb3RoZXIuZW51bV90eXBlXworICAgJiYgZXh0ZW5zaW9u
XyA9PSBvdGhlci5leHRlbnNpb25fOworfQorCitib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86OlBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgZGVwZW5kZW5j
eV8uY2xlYXIoKTsKKyAgcHVibGljX2RlcGVuZGVuY3lfLmNsZWFyKCk7CisgIHdlYWtfZGVwZW5k
ZW5jeV8uY2xlYXIoKTsKKyAgbWVzc2FnZV90eXBlXy5jbGVhcigpOworICBlbnVtX3R5cGVfLmNs
ZWFyKCk7CisgIGV4dGVuc2lvbl8uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7
CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVj
b2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgp
OyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVs
ZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmll
bGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAx
IC8qIG5hbWUgKi86CisgICAgICAgIGZpZWxkLmdldCgmbmFtZV8pOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgMiAvKiBwYWNrYWdlICovOgorICAgICAgICBmaWVsZC5nZXQoJnBhY2thZ2Vf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogZGVwZW5kZW5jeSAqLzoKKyAgICAg
ICAgZGVwZW5kZW5jeV8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmZGVwZW5k
ZW5jeV8uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwIC8qIHB1YmxpY19k
ZXBlbmRlbmN5ICovOgorICAgICAgICBwdWJsaWNfZGVwZW5kZW5jeV8uZW1wbGFjZV9iYWNrKCk7
CisgICAgICAgIGZpZWxkLmdldCgmcHVibGljX2RlcGVuZGVuY3lfLmJhY2soKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAxMSAvKiB3ZWFrX2RlcGVuZGVuY3kgKi86CisgICAgICAgIHdl
YWtfZGVwZW5kZW5jeV8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmd2Vha19k
ZXBlbmRlbmN5Xy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBtZXNz
YWdlX3R5cGUgKi86CisgICAgICAgIG1lc3NhZ2VfdHlwZV8uZW1wbGFjZV9iYWNrKCk7CisgICAg
ICAgIG1lc3NhZ2VfdHlwZV8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3Ry
aW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBlbnVtX3R5cGUgKi86Cisg
ICAgICAgIGVudW1fdHlwZV8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGVudW1fdHlwZV8uYmFj
aygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgNyAvKiBleHRlbnNpb24gKi86CisgICAgICAgIGV4dGVuc2lvbl8uZW1w
bGFjZV9iYWNrKCk7CisgICAgICAgIGV4dGVuc2lvbl8uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhm
aWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAg
ICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5i
eXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNlcmlh
bGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJv
dG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4g
bXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEZpbGVE
ZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJv
OjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1z
Zy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEZp
bGVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBj
b25zdCB7CisgIC8vIEZpZWxkIDE6IG5hbWUKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAg
bXNnLT5BcHBlbmRTdHJpbmcoMSwgbmFtZV8pOworICB9CisKKyAgLy8gRmllbGQgMjogcGFja2Fn
ZQorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZygyLCBwYWNr
YWdlXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBkZXBlbmRlbmN5CisgIGZvciAoYXV0byYgaXQg
OiBkZXBlbmRlbmN5XykgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDMsIGl0KTsKKyAgfQorCisg
IC8vIEZpZWxkIDEwOiBwdWJsaWNfZGVwZW5kZW5jeQorICBmb3IgKGF1dG8mIGl0IDogcHVibGlj
X2RlcGVuZGVuY3lfKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTAsIGl0KTsKKyAgfQorCisg
IC8vIEZpZWxkIDExOiB3ZWFrX2RlcGVuZGVuY3kKKyAgZm9yIChhdXRvJiBpdCA6IHdlYWtfZGVw
ZW5kZW5jeV8pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMSwgaXQpOworICB9CisKKyAgLy8g
RmllbGQgNDogbWVzc2FnZV90eXBlCisgIGZvciAoYXV0byYgaXQgOiBtZXNzYWdlX3R5cGVfKSB7
CisgICAgaXQuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPig0KSk7CisgIH0KKworICAvLyBGaWVsZCA1OiBlbnVtX3R5cGUKKyAgZm9yIChhdXRv
JiBpdCA6IGVudW1fdHlwZV8pIHsKKyAgICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1l
c3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDUpKTsKKyAgfQorCisgIC8vIEZpZWxkIDc6IGV4
dGVuc2lvbgorICBmb3IgKGF1dG8mIGl0IDogZXh0ZW5zaW9uXykgeworICAgIGl0LlNlcmlhbGl6
ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oNykpOworICB9
CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVu
a25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0ZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVz
Y3JpcHRvclNldCgpID0gZGVmYXVsdDsKK0ZpbGVEZXNjcmlwdG9yU2V0Ojp+RmlsZURlc2NyaXB0
b3JTZXQoKSA9IGRlZmF1bHQ7CitGaWxlRGVzY3JpcHRvclNldDo6RmlsZURlc2NyaXB0b3JTZXQo
Y29uc3QgRmlsZURlc2NyaXB0b3JTZXQmKSA9IGRlZmF1bHQ7CitGaWxlRGVzY3JpcHRvclNldCYg
RmlsZURlc2NyaXB0b3JTZXQ6Om9wZXJhdG9yPShjb25zdCBGaWxlRGVzY3JpcHRvclNldCYpID0g
ZGVmYXVsdDsKK0ZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVzY3JpcHRvclNldChGaWxlRGVzY3Jp
cHRvclNldCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitGaWxlRGVzY3JpcHRvclNldCYgRmlsZURl
c2NyaXB0b3JTZXQ6Om9wZXJhdG9yPShGaWxlRGVzY3JpcHRvclNldCYmKSA9IGRlZmF1bHQ7CisK
K2Jvb2wgRmlsZURlc2NyaXB0b3JTZXQ6Om9wZXJhdG9yPT0oY29uc3QgRmlsZURlc2NyaXB0b3JT
ZXQmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5r
bm93bl9maWVsZHNfCisgICAmJiBmaWxlXyA9PSBvdGhlci5maWxlXzsKK30KKworYm9vbCBGaWxl
RGVzY3JpcHRvclNldDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6
ZSkgeworICBmaWxlXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9v
bCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRl
YyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxk
LnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkg
PCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgp
KTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogZmls
ZSAqLzoKKyAgICAgICAgZmlsZV8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpbGVfLmJhY2so
KS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5r
bm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFj
a2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBGaWxlRGVz
Y3JpcHRvclNldDo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpI
ZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5n
ZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0
b3I8dWludDhfdD4gRmlsZURlc2NyaXB0b3JTZXQ6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgp
OworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBmaWxlCisgIGZvciAoYXV0byYgaXQg
OiBmaWxlXykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnBy
b3RvemVybzo6TWVzc2FnZT4oMSkpOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVz
KHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9
ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5h
bWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9ncHVfY291bnRlcl9k
ZXNjcmlwdG9yLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3By
b3Rvcy9wZXJmZXR0by9jb21tb24vZ3B1X2NvdW50ZXJfZGVzY3JpcHRvci5nZW4uaAorLy8gRE8g
Tk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRl
ZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9HUFVfQ09VTlRFUl9ERVND
UklQVE9SX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTU1PTl9HUFVfQ09VTlRFUl9ERVNDUklQVE9SX1BST1RPX0NQUF9IXworCisjaW5jbHVk
ZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNs
dWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmou
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgR3B1Q291bnRlckRlc2NyaXB0
b3I7CitjbGFzcyBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2s7CitjbGFzcyBH
cHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyU3BlYzsKK2VudW0gR3B1Q291bnRlckRlc2Ny
aXB0b3JfR3B1Q291bnRlckdyb3VwIDogaW50OworZW51bSBHcHVDb3VudGVyRGVzY3JpcHRvcl9N
ZWFzdXJlVW5pdCA6IGludDsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNw
YWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsK
K2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworZW51bSBHcHVD
b3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3JvdXAgOiBpbnQgeworICBHcHVDb3VudGVyRGVz
Y3JpcHRvcl9HcHVDb3VudGVyR3JvdXBfVU5DTEFTU0lGSUVEID0gMCwKKyAgR3B1Q291bnRlckRl
c2NyaXB0b3JfR3B1Q291bnRlckdyb3VwX1NZU1RFTSA9IDEsCisgIEdwdUNvdW50ZXJEZXNjcmlw
dG9yX0dwdUNvdW50ZXJHcm91cF9WRVJUSUNFUyA9IDIsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9y
X0dwdUNvdW50ZXJHcm91cF9GUkFHTUVOVFMgPSAzLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9H
cHVDb3VudGVyR3JvdXBfUFJJTUlUSVZFUyA9IDQsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dw
dUNvdW50ZXJHcm91cF9NRU1PUlkgPSA1LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3Vu
dGVyR3JvdXBfQ09NUFVURSA9IDYsCit9OworZW51bSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFz
dXJlVW5pdCA6IGludCB7CisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X05PTkUg
PSAwLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9CSVQgPSAxLAorICBHcHVD
b3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9LSUxPQklUID0gMiwKKyAgR3B1Q291bnRlckRl
c2NyaXB0b3JfTWVhc3VyZVVuaXRfTUVHQUJJVCA9IDMsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9y
X01lYXN1cmVVbml0X0dJR0FCSVQgPSA0LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJl
VW5pdF9URVJBQklUID0gNSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfUEVU
QUJJVCA9IDYsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0JZVEUgPSA3LAor
ICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9LSUxPQllURSA9IDgsCisgIEdwdUNv
dW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X01FR0FCWVRFID0gOSwKKyAgR3B1Q291bnRlckRl
c2NyaXB0b3JfTWVhc3VyZVVuaXRfR0lHQUJZVEUgPSAxMCwKKyAgR3B1Q291bnRlckRlc2NyaXB0
b3JfTWVhc3VyZVVuaXRfVEVSQUJZVEUgPSAxMSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVh
c3VyZVVuaXRfUEVUQUJZVEUgPSAxMiwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVu
aXRfSEVSVFogPSAxMywKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfS0lMT0hF
UlRaID0gMTQsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X01FR0FIRVJUWiA9
IDE1LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9HSUdBSEVSVFogPSAxNiwK
KyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfVEVSQUhFUlRaID0gMTcsCisgIEdw
dUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1BFVEFIRVJUWiA9IDE4LAorICBHcHVDb3Vu
dGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9OQU5PU0VDT05EID0gMTksCisgIEdwdUNvdW50ZXJE
ZXNjcmlwdG9yX01lYXN1cmVVbml0X01JQ1JPU0VDT05EID0gMjAsCisgIEdwdUNvdW50ZXJEZXNj
cmlwdG9yX01lYXN1cmVVbml0X01JTExJU0VDT05EID0gMjEsCisgIEdwdUNvdW50ZXJEZXNjcmlw
dG9yX01lYXN1cmVVbml0X1NFQ09ORCA9IDIyLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFz
dXJlVW5pdF9NSU5VVEUgPSAyMywKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRf
SE9VUiA9IDI0LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9WRVJURVggPSAy
NSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfUElYRUwgPSAyNiwKKyAgR3B1
Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfVFJJQU5HTEUgPSAyNywKKyAgR3B1Q291bnRl
ckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfUFJJTUlUSVZFID0gMzgsCisgIEdwdUNvdW50ZXJEZXNj
cmlwdG9yX01lYXN1cmVVbml0X0ZSQUdNRU5UID0gMzksCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9y
X01lYXN1cmVVbml0X01JTExJV0FUVCA9IDI4LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFz
dXJlVW5pdF9XQVRUID0gMjksCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0tJ
TE9XQVRUID0gMzAsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0pPVUxFID0g
MzEsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1ZPTFQgPSAzMiwKKyAgR3B1
Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfQU1QRVJFID0gMzMsCisgIEdwdUNvdW50ZXJE
ZXNjcmlwdG9yX01lYXN1cmVVbml0X0NFTFNJVVMgPSAzNCwKKyAgR3B1Q291bnRlckRlc2NyaXB0
b3JfTWVhc3VyZVVuaXRfRkFIUkVOSEVJVCA9IDM1LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9N
ZWFzdXJlVW5pdF9LRUxWSU4gPSAzNiwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVu
aXRfUEVSQ0VOVCA9IDM3LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9JTlNU
UlVDVElPTiA9IDQwLAorfTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEdwdUNvdW50ZXJEZXNj
cmlwdG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIEdwdUNvdW50ZXJTcGVjID0gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNw
ZWM7CisgIHVzaW5nIEdwdUNvdW50ZXJCbG9jayA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNv
dW50ZXJCbG9jazsKKyAgdXNpbmcgR3B1Q291bnRlckdyb3VwID0gR3B1Q291bnRlckRlc2NyaXB0
b3JfR3B1Q291bnRlckdyb3VwOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVU5DTEFTU0lGSUVE
ID0gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3VwX1VOQ0xBU1NJRklFRDsKKyAg
c3RhdGljIGNvbnN0ZXhwciBhdXRvIFNZU1RFTSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNv
dW50ZXJHcm91cF9TWVNURU07CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBWRVJUSUNFUyA9IEdw
dUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJHcm91cF9WRVJUSUNFUzsKKyAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIEZSQUdNRU5UUyA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJH
cm91cF9GUkFHTUVOVFM7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBQUklNSVRJVkVTID0gR3B1
Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3VwX1BSSU1JVElWRVM7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBNRU1PUlkgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3Jv
dXBfTUVNT1JZOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ09NUFVURSA9IEdwdUNvdW50ZXJE
ZXNjcmlwdG9yX0dwdUNvdW50ZXJHcm91cF9DT01QVVRFOworICBzdGF0aWMgY29uc3RleHByIGF1
dG8gR3B1Q291bnRlckdyb3VwX01JTiA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJH
cm91cF9VTkNMQVNTSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBHcHVDb3VudGVyR3Jv
dXBfTUFYID0gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3VwX0NPTVBVVEU7Cisg
IHVzaW5nIE1lYXN1cmVVbml0ID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXQ7Cisg
IHN0YXRpYyBjb25zdGV4cHIgYXV0byBOT05FID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3Vy
ZVVuaXRfTk9ORTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEJJVCA9IEdwdUNvdW50ZXJEZXNj
cmlwdG9yX01lYXN1cmVVbml0X0JJVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEtJTE9CSVQg
PSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9LSUxPQklUOworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gTUVHQUJJVCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X01F
R0FCSVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBHSUdBQklUID0gR3B1Q291bnRlckRlc2Ny
aXB0b3JfTWVhc3VyZVVuaXRfR0lHQUJJVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRFUkFC
SVQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9URVJBQklUOworICBzdGF0aWMg
Y29uc3RleHByIGF1dG8gUEVUQUJJVCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0
X1BFVEFCSVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCWVRFID0gR3B1Q291bnRlckRlc2Ny
aXB0b3JfTWVhc3VyZVVuaXRfQllURTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEtJTE9CWVRF
ID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfS0lMT0JZVEU7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBNRUdBQllURSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0
X01FR0FCWVRFOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gR0lHQUJZVEUgPSBHcHVDb3VudGVy
RGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9HSUdBQllURTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRv
IFRFUkFCWVRFID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfVEVSQUJZVEU7Cisg
IHN0YXRpYyBjb25zdGV4cHIgYXV0byBQRVRBQllURSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01l
YXN1cmVVbml0X1BFVEFCWVRFOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gSEVSVFogPSBHcHVD
b3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9IRVJUWjsKKyAgc3RhdGljIGNvbnN0ZXhwciBh
dXRvIEtJTE9IRVJUWiA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0tJTE9IRVJU
WjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIE1FR0FIRVJUWiA9IEdwdUNvdW50ZXJEZXNjcmlw
dG9yX01lYXN1cmVVbml0X01FR0FIRVJUWjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEdJR0FI
RVJUWiA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0dJR0FIRVJUWjsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIFRFUkFIRVJUWiA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1
cmVVbml0X1RFUkFIRVJUWjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFBFVEFIRVJUWiA9IEdw
dUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1BFVEFIRVJUWjsKKyAgc3RhdGljIGNvbnN0
ZXhwciBhdXRvIE5BTk9TRUNPTkQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9O
QU5PU0VDT05EOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gTUlDUk9TRUNPTkQgPSBHcHVDb3Vu
dGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9NSUNST1NFQ09ORDsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIE1JTExJU0VDT05EID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfTUlM
TElTRUNPTkQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTRUNPTkQgPSBHcHVDb3VudGVyRGVz
Y3JpcHRvcl9NZWFzdXJlVW5pdF9TRUNPTkQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBNSU5V
VEUgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9NSU5VVEU7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBIT1VSID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfSE9V
UjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFZFUlRFWCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9y
X01lYXN1cmVVbml0X1ZFUlRFWDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFBJWEVMID0gR3B1
Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfUElYRUw7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBUUklBTkdMRSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1RSSUFOR0xF
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gUFJJTUlUSVZFID0gR3B1Q291bnRlckRlc2NyaXB0
b3JfTWVhc3VyZVVuaXRfUFJJTUlUSVZFOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gRlJBR01F
TlQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9GUkFHTUVOVDsKKyAgc3RhdGlj
IGNvbnN0ZXhwciBhdXRvIE1JTExJV0FUVCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVV
bml0X01JTExJV0FUVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFdBVFQgPSBHcHVDb3VudGVy
RGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9XQVRUOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gS0lM
T1dBVFQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9LSUxPV0FUVDsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIEpPVUxFID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVu
aXRfSk9VTEU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBWT0xUID0gR3B1Q291bnRlckRlc2Ny
aXB0b3JfTWVhc3VyZVVuaXRfVk9MVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEFNUEVSRSA9
IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0FNUEVSRTsKKyAgc3RhdGljIGNvbnN0
ZXhwciBhdXRvIENFTFNJVVMgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9DRUxT
SVVTOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gRkFIUkVOSEVJVCA9IEdwdUNvdW50ZXJEZXNj
cmlwdG9yX01lYXN1cmVVbml0X0ZBSFJFTkhFSVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBL
RUxWSU4gPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9LRUxWSU47CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBQRVJDRU5UID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVu
aXRfUEVSQ0VOVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIElOU1RSVUNUSU9OID0gR3B1Q291
bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfSU5TVFJVQ1RJT047CisgIHN0YXRpYyBjb25zdGV4
cHIgYXV0byBNZWFzdXJlVW5pdF9NSU4gPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5p
dF9OT05FOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gTWVhc3VyZVVuaXRfTUFYID0gR3B1Q291
bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfSU5TVFJVQ1RJT047CisgIGVudW0gRmllbGROdW1i
ZXJzIHsKKyAgICBrU3BlY3NGaWVsZE51bWJlciA9IDEsCisgICAga0Jsb2Nrc0ZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrTWluU2FtcGxpbmdQZXJpb2ROc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrTWF4
U2FtcGxpbmdQZXJpb2ROc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrU3VwcG9ydHNJbnN0cnVtZW50
ZWRTYW1wbGluZ0ZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKworICBHcHVDb3VudGVyRGVzY3JpcHRv
cigpOworICB+R3B1Q291bnRlckRlc2NyaXB0b3IoKSBvdmVycmlkZTsKKyAgR3B1Q291bnRlckRl
c2NyaXB0b3IoR3B1Q291bnRlckRlc2NyaXB0b3ImJikgbm9leGNlcHQ7CisgIEdwdUNvdW50ZXJE
ZXNjcmlwdG9yJiBvcGVyYXRvcj0oR3B1Q291bnRlckRlc2NyaXB0b3ImJik7CisgIEdwdUNvdW50
ZXJEZXNjcmlwdG9yKGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yJik7CisgIEdwdUNvdW50ZXJE
ZXNjcmlwdG9yJiBvcGVyYXRvcj0oY29uc3QgR3B1Q291bnRlckRlc2NyaXB0b3ImKTsKKyAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yJikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBHcHVDb3VudGVyRGVzY3JpcHRvciYgb3RoZXIpIGNvbnN0IHsgcmV0
dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2
b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmco
KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJh
eSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2Fn
ZSopIGNvbnN0OworCisgIGludCBzcGVjc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nh
c3Q8aW50PihzcGVjc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxHcHVDb3VudGVy
RGVzY3JpcHRvcl9HcHVDb3VudGVyU3BlYz4mIHNwZWNzKCkgY29uc3QgeyByZXR1cm4gc3BlY3Nf
OyB9CisgIHN0ZDo6dmVjdG9yPEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjPiog
bXV0YWJsZV9zcGVjcygpIHsgcmV0dXJuICZzcGVjc187IH0KKyAgdm9pZCBjbGVhcl9zcGVjcygp
IHsgc3BlY3NfLmNsZWFyKCk7IH0KKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNw
ZWMqIGFkZF9zcGVjcygpIHsgc3BlY3NfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnNwZWNzXy5i
YWNrKCk7IH0KKworICBpbnQgYmxvY2tzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2Fz
dDxpbnQ+KGJsb2Nrc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxHcHVDb3VudGVy
RGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2s+JiBibG9ja3MoKSBjb25zdCB7IHJldHVybiBibG9j
a3NfOyB9CisgIHN0ZDo6dmVjdG9yPEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9j
az4qIG11dGFibGVfYmxvY2tzKCkgeyByZXR1cm4gJmJsb2Nrc187IH0KKyAgdm9pZCBjbGVhcl9i
bG9ja3MoKSB7IGJsb2Nrc18uY2xlYXIoKTsgfQorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVD
b3VudGVyQmxvY2sqIGFkZF9ibG9ja3MoKSB7IGJsb2Nrc18uZW1wbGFjZV9iYWNrKCk7IHJldHVy
biAmYmxvY2tzXy5iYWNrKCk7IH0KKworICBib29sIGhhc19taW5fc2FtcGxpbmdfcGVyaW9kX25z
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDY0X3QgbWluX3NhbXBs
aW5nX3BlcmlvZF9ucygpIGNvbnN0IHsgcmV0dXJuIG1pbl9zYW1wbGluZ19wZXJpb2RfbnNfOyB9
CisgIHZvaWQgc2V0X21pbl9zYW1wbGluZ19wZXJpb2RfbnModWludDY0X3QgdmFsdWUpIHsgbWlu
X3NhbXBsaW5nX3BlcmlvZF9uc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyAg
Ym9vbCBoYXNfbWF4X3NhbXBsaW5nX3BlcmlvZF9ucygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzRdOyB9CisgIHVpbnQ2NF90IG1heF9zYW1wbGluZ19wZXJpb2RfbnMoKSBjb25zdCB7IHJl
dHVybiBtYXhfc2FtcGxpbmdfcGVyaW9kX25zXzsgfQorICB2b2lkIHNldF9tYXhfc2FtcGxpbmdf
cGVyaW9kX25zKHVpbnQ2NF90IHZhbHVlKSB7IG1heF9zYW1wbGluZ19wZXJpb2RfbnNfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgIGJvb2wgaGFzX3N1cHBvcnRzX2luc3RydW1l
bnRlZF9zYW1wbGluZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGJvb2wg
c3VwcG9ydHNfaW5zdHJ1bWVudGVkX3NhbXBsaW5nKCkgY29uc3QgeyByZXR1cm4gc3VwcG9ydHNf
aW5zdHJ1bWVudGVkX3NhbXBsaW5nXzsgfQorICB2b2lkIHNldF9zdXBwb3J0c19pbnN0cnVtZW50
ZWRfc2FtcGxpbmcoYm9vbCB2YWx1ZSkgeyBzdXBwb3J0c19pbnN0cnVtZW50ZWRfc2FtcGxpbmdf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg1KTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0
b3I8R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWM+IHNwZWNzXzsKKyAgc3RkOjp2
ZWN0b3I8R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2NrPiBibG9ja3NfOworICB1
aW50NjRfdCBtaW5fc2FtcGxpbmdfcGVyaW9kX25zX3t9OworICB1aW50NjRfdCBtYXhfc2FtcGxp
bmdfcGVyaW9kX25zX3t9OworICBib29sIHN1cHBvcnRzX2luc3RydW1lbnRlZF9zYW1wbGluZ197
fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9y
IGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVz
LgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Nj4gX2hh
c19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEdwdUNvdW50ZXJEZXNj
cmlwdG9yX0dwdUNvdW50ZXJCbG9jayA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9i
aiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0Jsb2NrSWRGaWVsZE51
bWJlciA9IDEsCisgICAga0Jsb2NrQ2FwYWNpdHlGaWVsZE51bWJlciA9IDIsCisgICAga05hbWVG
aWVsZE51bWJlciA9IDMsCisgICAga0Rlc2NyaXB0aW9uRmllbGROdW1iZXIgPSA0LAorICAgIGtD
b3VudGVySWRzRmllbGROdW1iZXIgPSA1LAorICB9OworCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9y
X0dwdUNvdW50ZXJCbG9jaygpOworICB+R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJs
b2NrKCkgb3ZlcnJpZGU7CisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayhH
cHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2smJikgbm9leGNlcHQ7CisgIEdwdUNv
dW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayYgb3BlcmF0b3I9KEdwdUNvdW50ZXJEZXNj
cmlwdG9yX0dwdUNvdW50ZXJCbG9jayYmKTsKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291
bnRlckJsb2NrKGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayYpOwor
ICBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2smIG9wZXJhdG9yPShjb25zdCBH
cHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2smKTsKKyAgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayYpIGNvbnN0OworICBi
b29sIG9wZXJhdG9yIT0oY29uc3QgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2Nr
JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmlu
ZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50
OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXpl
KDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfYmxvY2tfaWQoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50MzJfdCBibG9ja19pZCgpIGNv
bnN0IHsgcmV0dXJuIGJsb2NrX2lkXzsgfQorICB2b2lkIHNldF9ibG9ja19pZCh1aW50MzJfdCB2
YWx1ZSkgeyBibG9ja19pZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9v
bCBoYXNfYmxvY2tfY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQor
ICB1aW50MzJfdCBibG9ja19jYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGJsb2NrX2NhcGFjaXR5
XzsgfQorICB2b2lkIHNldF9ibG9ja19jYXBhY2l0eSh1aW50MzJfdCB2YWx1ZSkgeyBibG9ja19j
YXBhY2l0eV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfbmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5n
JiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsgbmFtZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9
CisKKyAgYm9vbCBoYXNfZGVzY3JpcHRpb24oKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0
XTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24oKSBjb25zdCB7IHJldHVybiBk
ZXNjcmlwdGlvbl87IH0KKyAgdm9pZCBzZXRfZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7IGRlc2NyaXB0aW9uXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNCk7IH0KKwor
ICBpbnQgY291bnRlcl9pZHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4o
Y291bnRlcl9pZHNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBj
b3VudGVyX2lkcygpIGNvbnN0IHsgcmV0dXJuIGNvdW50ZXJfaWRzXzsgfQorICBzdGQ6OnZlY3Rv
cjx1aW50MzJfdD4qIG11dGFibGVfY291bnRlcl9pZHMoKSB7IHJldHVybiAmY291bnRlcl9pZHNf
OyB9CisgIHZvaWQgY2xlYXJfY291bnRlcl9pZHMoKSB7IGNvdW50ZXJfaWRzXy5jbGVhcigpOyB9
CisgIHZvaWQgYWRkX2NvdW50ZXJfaWRzKHVpbnQzMl90IHZhbHVlKSB7IGNvdW50ZXJfaWRzXy5l
bXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHVpbnQzMl90KiBhZGRfY291bnRlcl9pZHMoKSB7IGNv
dW50ZXJfaWRzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZjb3VudGVyX2lkc18uYmFjaygpOyB9
CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBibG9ja19pZF97fTsKKyAgdWludDMyX3QgYmxvY2tf
Y2FwYWNpdHlfe307CisgIHN0ZDo6c3RyaW5nIG5hbWVfe307CisgIHN0ZDo6c3RyaW5nIGRlc2Ny
aXB0aW9uX3t9OworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY291bnRlcl9pZHNfOworCisgIC8v
IEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJp
bGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6
c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw2PiBfaGFzX2ZpZWxkX3t9
OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1
Q291bnRlclNwZWMgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtDb3VudGVySWRGaWVsZE51bWJlciA9IDEs
CisgICAga05hbWVGaWVsZE51bWJlciA9IDIsCisgICAga0Rlc2NyaXB0aW9uRmllbGROdW1iZXIg
PSAzLAorICAgIGtJbnRQZWFrVmFsdWVGaWVsZE51bWJlciA9IDUsCisgICAga0RvdWJsZVBlYWtW
YWx1ZUZpZWxkTnVtYmVyID0gNiwKKyAgICBrTnVtZXJhdG9yVW5pdHNGaWVsZE51bWJlciA9IDcs
CisgICAga0Rlbm9taW5hdG9yVW5pdHNGaWVsZE51bWJlciA9IDgsCisgICAga1NlbGVjdEJ5RGVm
YXVsdEZpZWxkTnVtYmVyID0gOSwKKyAgICBrR3JvdXBzRmllbGROdW1iZXIgPSAxMCwKKyAgfTsK
KworICBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyU3BlYygpOworICB+R3B1Q291bnRl
ckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMoKSBvdmVycmlkZTsKKyAgR3B1Q291bnRlckRlc2Ny
aXB0b3JfR3B1Q291bnRlclNwZWMoR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMm
Jikgbm9leGNlcHQ7CisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjJiBvcGVy
YXRvcj0oR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMmJik7CisgIEdwdUNvdW50
ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjKGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dw
dUNvdW50ZXJTcGVjJik7CisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjJiBv
cGVyYXRvcj0oY29uc3QgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMmKTsKKyAg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVj
JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHcHVDb3VudGVyRGVzY3JpcHRvcl9H
cHVDb3VudGVyU3BlYyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9
CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsK
KyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3Rk
Ojp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2
b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFz
X2NvdW50ZXJfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50MzJf
dCBjb3VudGVyX2lkKCkgY29uc3QgeyByZXR1cm4gY291bnRlcl9pZF87IH0KKyAgdm9pZCBzZXRf
Y291bnRlcl9pZCh1aW50MzJfdCB2YWx1ZSkgeyBjb3VudGVyX2lkXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMl07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBu
YW1lXzsgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBuYW1l
XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc19kZXNjcmlwdGlv
bigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5n
JiBkZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGRlc2NyaXB0aW9uXzsgfQorICB2b2lkIHNl
dF9kZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgZGVzY3JpcHRpb25fID0g
dmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX2ludF9wZWFrX3ZhbHVl
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07IH0KKyAgaW50NjRfdCBpbnRfcGVha192
YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGludF9wZWFrX3ZhbHVlXzsgfQorICB2b2lkIHNldF9pbnRf
cGVha192YWx1ZShpbnQ2NF90IHZhbHVlKSB7IGludF9wZWFrX3ZhbHVlXyA9IHZhbHVlOyBfaGFz
X2ZpZWxkXy5zZXQoNSk7IH0KKworICBib29sIGhhc19kb3VibGVfcGVha192YWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIF9oYXNfZmllbGRfWzZdOyB9CisgIGRvdWJsZSBkb3VibGVfcGVha192YWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIGRvdWJsZV9wZWFrX3ZhbHVlXzsgfQorICB2b2lkIHNldF9kb3VibGVf
cGVha192YWx1ZShkb3VibGUgdmFsdWUpIHsgZG91YmxlX3BlYWtfdmFsdWVfID0gdmFsdWU7IF9o
YXNfZmllbGRfLnNldCg2KTsgfQorCisgIGludCBudW1lcmF0b3JfdW5pdHNfc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obnVtZXJhdG9yX3VuaXRzXy5zaXplKCkpOyB9Cisg
IGNvbnN0IHN0ZDo6dmVjdG9yPEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0PiYgbnVt
ZXJhdG9yX3VuaXRzKCkgY29uc3QgeyByZXR1cm4gbnVtZXJhdG9yX3VuaXRzXzsgfQorICBzdGQ6
OnZlY3RvcjxHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdD4qIG11dGFibGVfbnVtZXJh
dG9yX3VuaXRzKCkgeyByZXR1cm4gJm51bWVyYXRvcl91bml0c187IH0KKyAgdm9pZCBjbGVhcl9u
dW1lcmF0b3JfdW5pdHMoKSB7IG51bWVyYXRvcl91bml0c18uY2xlYXIoKTsgfQorICB2b2lkIGFk
ZF9udW1lcmF0b3JfdW5pdHMoR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXQgdmFsdWUp
IHsgbnVtZXJhdG9yX3VuaXRzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIEdwdUNvdW50ZXJE
ZXNjcmlwdG9yX01lYXN1cmVVbml0KiBhZGRfbnVtZXJhdG9yX3VuaXRzKCkgeyBudW1lcmF0b3Jf
dW5pdHNfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJm51bWVyYXRvcl91bml0c18uYmFjaygpOyB9
CisKKyAgaW50IGRlbm9taW5hdG9yX3VuaXRzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNf
Y2FzdDxpbnQ+KGRlbm9taW5hdG9yX3VuaXRzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVj
dG9yPEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0PiYgZGVub21pbmF0b3JfdW5pdHMo
KSBjb25zdCB7IHJldHVybiBkZW5vbWluYXRvcl91bml0c187IH0KKyAgc3RkOjp2ZWN0b3I8R3B1
Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXQ+KiBtdXRhYmxlX2Rlbm9taW5hdG9yX3VuaXRz
KCkgeyByZXR1cm4gJmRlbm9taW5hdG9yX3VuaXRzXzsgfQorICB2b2lkIGNsZWFyX2Rlbm9taW5h
dG9yX3VuaXRzKCkgeyBkZW5vbWluYXRvcl91bml0c18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9k
ZW5vbWluYXRvcl91bml0cyhHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdCB2YWx1ZSkg
eyBkZW5vbWluYXRvcl91bml0c18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBHcHVDb3VudGVy
RGVzY3JpcHRvcl9NZWFzdXJlVW5pdCogYWRkX2Rlbm9taW5hdG9yX3VuaXRzKCkgeyBkZW5vbWlu
YXRvcl91bml0c18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmZGVub21pbmF0b3JfdW5pdHNfLmJh
Y2soKTsgfQorCisgIGJvb2wgaGFzX3NlbGVjdF9ieV9kZWZhdWx0KCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bOV07IH0KKyAgYm9vbCBzZWxlY3RfYnlfZGVmYXVsdCgpIGNvbnN0IHsgcmV0
dXJuIHNlbGVjdF9ieV9kZWZhdWx0XzsgfQorICB2b2lkIHNldF9zZWxlY3RfYnlfZGVmYXVsdChi
b29sIHZhbHVlKSB7IHNlbGVjdF9ieV9kZWZhdWx0XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
OSk7IH0KKworICBpbnQgZ3JvdXBzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxp
bnQ+KGdyb3Vwc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxHcHVDb3VudGVyRGVz
Y3JpcHRvcl9HcHVDb3VudGVyR3JvdXA+JiBncm91cHMoKSBjb25zdCB7IHJldHVybiBncm91cHNf
OyB9CisgIHN0ZDo6dmVjdG9yPEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJHcm91cD4q
IG11dGFibGVfZ3JvdXBzKCkgeyByZXR1cm4gJmdyb3Vwc187IH0KKyAgdm9pZCBjbGVhcl9ncm91
cHMoKSB7IGdyb3Vwc18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9ncm91cHMoR3B1Q291bnRlckRl
c2NyaXB0b3JfR3B1Q291bnRlckdyb3VwIHZhbHVlKSB7IGdyb3Vwc18uZW1wbGFjZV9iYWNrKHZh
bHVlKTsgfQorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3JvdXAqIGFkZF9ncm91
cHMoKSB7IGdyb3Vwc18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmZ3JvdXBzXy5iYWNrKCk7IH0K
KworIHByaXZhdGU6CisgIHVpbnQzMl90IGNvdW50ZXJfaWRfe307CisgIHN0ZDo6c3RyaW5nIG5h
bWVfe307CisgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uX3t9OworICBpbnQ2NF90IGludF9wZWFr
X3ZhbHVlX3t9OworICBkb3VibGUgZG91YmxlX3BlYWtfdmFsdWVfe307CisgIHN0ZDo6dmVjdG9y
PEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0PiBudW1lcmF0b3JfdW5pdHNfOworICBz
dGQ6OnZlY3RvcjxHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdD4gZGVub21pbmF0b3Jf
dW5pdHNfOworICBib29sIHNlbGVjdF9ieV9kZWZhdWx0X3t9OworICBzdGQ6OnZlY3RvcjxHcHVD
b3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3JvdXA+IGdyb3Vwc187CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDExPiBfaGFzX2ZpZWxkX3t9OworfTsK
KworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAv
LyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19DT01NT05fR1BVX0NPVU5URVJfREVTQ1JJUFRPUl9QUk9UT19DUFBfSF8KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdl
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0
dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBl
cmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdt
YSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9ncHVfY291bnRl
cl9kZXNjcmlwdG9yLmdlbi5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHBy
b3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworR3B1Q291bnRlckRlc2NyaXB0b3I6OkdwdUNvdW50
ZXJEZXNjcmlwdG9yKCkgPSBkZWZhdWx0OworR3B1Q291bnRlckRlc2NyaXB0b3I6On5HcHVDb3Vu
dGVyRGVzY3JpcHRvcigpID0gZGVmYXVsdDsKK0dwdUNvdW50ZXJEZXNjcmlwdG9yOjpHcHVDb3Vu
dGVyRGVzY3JpcHRvcihjb25zdCBHcHVDb3VudGVyRGVzY3JpcHRvciYpID0gZGVmYXVsdDsKK0dw
dUNvdW50ZXJEZXNjcmlwdG9yJiBHcHVDb3VudGVyRGVzY3JpcHRvcjo6b3BlcmF0b3I9KGNvbnN0
IEdwdUNvdW50ZXJEZXNjcmlwdG9yJikgPSBkZWZhdWx0OworR3B1Q291bnRlckRlc2NyaXB0b3I6
OkdwdUNvdW50ZXJEZXNjcmlwdG9yKEdwdUNvdW50ZXJEZXNjcmlwdG9yJiYpIG5vZXhjZXB0ID0g
ZGVmYXVsdDsKK0dwdUNvdW50ZXJEZXNjcmlwdG9yJiBHcHVDb3VudGVyRGVzY3JpcHRvcjo6b3Bl
cmF0b3I9KEdwdUNvdW50ZXJEZXNjcmlwdG9yJiYpID0gZGVmYXVsdDsKKworYm9vbCBHcHVDb3Vu
dGVyRGVzY3JpcHRvcjo6b3BlcmF0b3I9PShjb25zdCBHcHVDb3VudGVyRGVzY3JpcHRvciYgb3Ro
ZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2Zp
ZWxkc18KKyAgICYmIHNwZWNzXyA9PSBvdGhlci5zcGVjc18KKyAgICYmIGJsb2Nrc18gPT0gb3Ro
ZXIuYmxvY2tzXworICAgJiYgbWluX3NhbXBsaW5nX3BlcmlvZF9uc18gPT0gb3RoZXIubWluX3Nh
bXBsaW5nX3BlcmlvZF9uc18KKyAgICYmIG1heF9zYW1wbGluZ19wZXJpb2RfbnNfID09IG90aGVy
Lm1heF9zYW1wbGluZ19wZXJpb2RfbnNfCisgICAmJiBzdXBwb3J0c19pbnN0cnVtZW50ZWRfc2Ft
cGxpbmdfID09IG90aGVyLnN1cHBvcnRzX2luc3RydW1lbnRlZF9zYW1wbGluZ187Cit9CisKK2Jv
b2wgR3B1Q291bnRlckRlc2NyaXB0b3I6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywg
c2l6ZV90IHNpemUpIHsKKyAgc3BlY3NfLmNsZWFyKCk7CisgIGJsb2Nrc18uY2xlYXIoKTsKKyAg
dW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisK
KyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRv
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFk
RmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7Cisg
ICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmll
bGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHNwZWNzICovOgorICAgICAgICBzcGVjc18uZW1w
bGFjZV9iYWNrKCk7CisgICAgICAgIHNwZWNzXy5iYWNrKCkuUGFyc2VGcm9tU3RyaW5nKGZpZWxk
LmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIGJsb2Nr
cyAqLzoKKyAgICAgICAgYmxvY2tzXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgYmxvY2tzXy5i
YWNrKCkuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJy
ZWFrOworICAgICAgY2FzZSAzIC8qIG1pbl9zYW1wbGluZ19wZXJpb2RfbnMgKi86CisgICAgICAg
IGZpZWxkLmdldCgmbWluX3NhbXBsaW5nX3BlcmlvZF9uc18pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgNCAvKiBtYXhfc2FtcGxpbmdfcGVyaW9kX25zICovOgorICAgICAgICBmaWVsZC5n
ZXQoJm1heF9zYW1wbGluZ19wZXJpb2RfbnNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl
IDUgLyogc3VwcG9ydHNfaW5zdHJ1bWVudGVkX3NhbXBsaW5nICovOgorICAgICAgICBmaWVsZC5n
ZXQoJnN1cHBvcnRzX2luc3RydW1lbnRlZF9zYW1wbGluZ18pOworICAgICAgICBicmVhazsKKyAg
ICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3du
X2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRf
ZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdwdUNvdW50ZXJE
ZXNjcmlwdG9yOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rv
cjx1aW50OF90PiBHcHVDb3VudGVyRGVzY3JpcHRvcjo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0
IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNn
OworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5
KCk7Cit9CisKK3ZvaWQgR3B1Q291bnRlckRlc2NyaXB0b3I6OlNlcmlhbGl6ZSg6OnByb3RvemVy
bzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IHNwZWNzCisgIGZvciAoYXV0
byYgaXQgOiBzcGVjc18pIHsKKyAgICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3Nh
Z2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDEpKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGJsb2Nr
cworICBmb3IgKGF1dG8mIGl0IDogYmxvY2tzXykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJl
Z2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMikpOworICB9CisKKyAgLy8g
RmllbGQgMzogbWluX3NhbXBsaW5nX3BlcmlvZF9ucworICBpZiAoX2hhc19maWVsZF9bM10pIHsK
KyAgICBtc2ctPkFwcGVuZFZhckludCgzLCBtaW5fc2FtcGxpbmdfcGVyaW9kX25zXyk7CisgIH0K
KworICAvLyBGaWVsZCA0OiBtYXhfc2FtcGxpbmdfcGVyaW9kX25zCisgIGlmIChfaGFzX2ZpZWxk
X1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDQsIG1heF9zYW1wbGluZ19wZXJpb2RfbnNf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IHN1cHBvcnRzX2luc3RydW1lbnRlZF9zYW1wbGluZwor
ICBpZiAoX2hhc19maWVsZF9bNV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNSwgc3Vw
cG9ydHNfaW5zdHJ1bWVudGVkX3NhbXBsaW5nXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKKworR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2NrOjpHcHVDb3VudGVy
RGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2soKSA9IGRlZmF1bHQ7CitHcHVDb3VudGVyRGVzY3Jp
cHRvcl9HcHVDb3VudGVyQmxvY2s6On5HcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyQmxv
Y2soKSA9IGRlZmF1bHQ7CitHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2s6Okdw
dUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayhjb25zdCBHcHVDb3VudGVyRGVzY3Jp
cHRvcl9HcHVDb3VudGVyQmxvY2smKSA9IGRlZmF1bHQ7CitHcHVDb3VudGVyRGVzY3JpcHRvcl9H
cHVDb3VudGVyQmxvY2smIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jazo6b3Bl
cmF0b3I9KGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayYpID0gZGVm
YXVsdDsKK0dwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jazo6R3B1Q291bnRlckRl
c2NyaXB0b3JfR3B1Q291bnRlckJsb2NrKEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJC
bG9jayYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3Vu
dGVyQmxvY2smIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jazo6b3BlcmF0b3I9
KEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayYmKSA9IGRlZmF1bHQ7CisKK2Jv
b2wgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2NrOjpvcGVyYXRvcj09KGNvbnN0
IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9jayYgb3RoZXIpIGNvbnN0IHsKKyAg
cmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGJs
b2NrX2lkXyA9PSBvdGhlci5ibG9ja19pZF8KKyAgICYmIGJsb2NrX2NhcGFjaXR5XyA9PSBvdGhl
ci5ibG9ja19jYXBhY2l0eV8KKyAgICYmIG5hbWVfID09IG90aGVyLm5hbWVfCisgICAmJiBkZXNj
cmlwdGlvbl8gPT0gb3RoZXIuZGVzY3JpcHRpb25fCisgICAmJiBjb3VudGVyX2lkc18gPT0gb3Ro
ZXIuY291bnRlcl9pZHNfOworfQorCitib29sIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50
ZXJCbG9jazo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgewor
ICBjb3VudGVyX2lkc18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGJs
b2NrX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJmJsb2NrX2lkXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSAyIC8qIGJsb2NrX2NhcGFjaXR5ICovOgorICAgICAgICBmaWVsZC5nZXQo
JmJsb2NrX2NhcGFjaXR5Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIG5hbWUg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmbmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNh
c2UgNCAvKiBkZXNjcmlwdGlvbiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkZXNjcmlwdGlvbl8p
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBjb3VudGVyX2lkcyAqLzoKKyAgICAg
ICAgY291bnRlcl9pZHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmNvdW50
ZXJfaWRzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAg
IGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBi
cmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19s
ZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJC
bG9jazo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVm
ZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7
CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWlu
dDhfdD4gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2NrOjpTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVy
QmxvY2s6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8v
IEZpZWxkIDE6IGJsb2NrX2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBw
ZW5kVmFySW50KDEsIGJsb2NrX2lkXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBibG9ja19jYXBh
Y2l0eQorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBi
bG9ja19jYXBhY2l0eV8pOworICB9CisKKyAgLy8gRmllbGQgMzogbmFtZQorICBpZiAoX2hhc19m
aWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZygzLCBuYW1lXyk7CisgIH0KKworICAv
LyBGaWVsZCA0OiBkZXNjcmlwdGlvbgorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ct
PkFwcGVuZFN0cmluZyg0LCBkZXNjcmlwdGlvbl8pOworICB9CisKKyAgLy8gRmllbGQgNTogY291
bnRlcl9pZHMKKyAgZm9yIChhdXRvJiBpdCA6IGNvdW50ZXJfaWRzXykgeworICAgIG1zZy0+QXBw
ZW5kVmFySW50KDUsIGl0KTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtu
b3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitHcHVD
b3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyU3BlYzo6R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1
Q291bnRlclNwZWMoKSA9IGRlZmF1bHQ7CitHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVy
U3BlYzo6fkdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjKCkgPSBkZWZhdWx0Owor
R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWM6OkdwdUNvdW50ZXJEZXNjcmlwdG9y
X0dwdUNvdW50ZXJTcGVjKGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVj
JikgPSBkZWZhdWx0OworR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMmIEdwdUNv
dW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjOjpvcGVyYXRvcj0oY29uc3QgR3B1Q291bnRl
ckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMmKSA9IGRlZmF1bHQ7CitHcHVDb3VudGVyRGVzY3Jp
cHRvcl9HcHVDb3VudGVyU3BlYzo6R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMo
R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMmJikgbm9leGNlcHQgPSBkZWZhdWx0
OworR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWMmIEdwdUNvdW50ZXJEZXNjcmlw
dG9yX0dwdUNvdW50ZXJTcGVjOjpvcGVyYXRvcj0oR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291
bnRlclNwZWMmJikgPSBkZWZhdWx0OworCitib29sIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNv
dW50ZXJTcGVjOjpvcGVyYXRvcj09KGNvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50
ZXJTcGVjJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVy
LnVua25vd25fZmllbGRzXworICAgJiYgY291bnRlcl9pZF8gPT0gb3RoZXIuY291bnRlcl9pZF8K
KyAgICYmIG5hbWVfID09IG90aGVyLm5hbWVfCisgICAmJiBkZXNjcmlwdGlvbl8gPT0gb3RoZXIu
ZGVzY3JpcHRpb25fCisgICAmJiBpbnRfcGVha192YWx1ZV8gPT0gb3RoZXIuaW50X3BlYWtfdmFs
dWVfCisgICAmJiBkb3VibGVfcGVha192YWx1ZV8gPT0gb3RoZXIuZG91YmxlX3BlYWtfdmFsdWVf
CisgICAmJiBudW1lcmF0b3JfdW5pdHNfID09IG90aGVyLm51bWVyYXRvcl91bml0c18KKyAgICYm
IGRlbm9taW5hdG9yX3VuaXRzXyA9PSBvdGhlci5kZW5vbWluYXRvcl91bml0c18KKyAgICYmIHNl
bGVjdF9ieV9kZWZhdWx0XyA9PSBvdGhlci5zZWxlY3RfYnlfZGVmYXVsdF8KKyAgICYmIGdyb3Vw
c18gPT0gb3RoZXIuZ3JvdXBzXzsKK30KKworYm9vbCBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVD
b3VudGVyU3BlYzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkg
eworICBudW1lcmF0b3JfdW5pdHNfLmNsZWFyKCk7CisgIGRlbm9taW5hdG9yX3VuaXRzXy5jbGVh
cigpOworICBncm91cHNfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBi
b29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIg
ZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmll
bGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQo
KSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlk
KCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBj
b3VudGVyX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJmNvdW50ZXJfaWRfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDIgLyogbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZuYW1l
Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIGRlc2NyaXB0aW9uICovOgorICAg
ICAgICBmaWVsZC5nZXQoJmRlc2NyaXB0aW9uXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSA1IC8qIGludF9wZWFrX3ZhbHVlICovOgorICAgICAgICBmaWVsZC5nZXQoJmludF9wZWFrX3Zh
bHVlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8qIGRvdWJsZV9wZWFrX3ZhbHVl
ICovOgorICAgICAgICBmaWVsZC5nZXQoJmRvdWJsZV9wZWFrX3ZhbHVlXyk7CisgICAgICAgIGJy
ZWFrOworICAgICAgY2FzZSA3IC8qIG51bWVyYXRvcl91bml0cyAqLzoKKyAgICAgICAgbnVtZXJh
dG9yX3VuaXRzXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgZmllbGQuZ2V0KCZudW1lcmF0b3Jf
dW5pdHNfLmJhY2soKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIGRlbm9taW5h
dG9yX3VuaXRzICovOgorICAgICAgICBkZW5vbWluYXRvcl91bml0c18uZW1wbGFjZV9iYWNrKCk7
CisgICAgICAgIGZpZWxkLmdldCgmZGVub21pbmF0b3JfdW5pdHNfLmJhY2soKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSA5IC8qIHNlbGVjdF9ieV9kZWZhdWx0ICovOgorICAgICAgICBm
aWVsZC5nZXQoJnNlbGVjdF9ieV9kZWZhdWx0Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAxMCAvKiBncm91cHMgKi86CisgICAgICAgIGdyb3Vwc18uZW1wbGFjZV9iYWNrKCk7CisgICAg
ICAgIGZpZWxkLmdldCgmZ3JvdXBzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRl
ZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxk
c18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3Ig
JiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdwdUNvdW50ZXJEZXNjcmlw
dG9yX0dwdUNvdW50ZXJTcGVjOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitz
dGQ6OnZlY3Rvcjx1aW50OF90PiBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyU3BlYzo6
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgR3B1Q291bnRlckRlc2NyaXB0
b3JfR3B1Q291bnRlclNwZWM6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBj
b25zdCB7CisgIC8vIEZpZWxkIDE6IGNvdW50ZXJfaWQKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7
CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgY291bnRlcl9pZF8pOworICB9CisKKyAgLy8gRmll
bGQgMjogbmFtZQorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmlu
ZygyLCBuYW1lXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBkZXNjcmlwdGlvbgorICBpZiAoX2hh
c19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZygzLCBkZXNjcmlwdGlvbl8pOwor
ICB9CisKKyAgLy8gRmllbGQgNTogaW50X3BlYWtfdmFsdWUKKyAgaWYgKF9oYXNfZmllbGRfWzVd
KSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNSwgaW50X3BlYWtfdmFsdWVfKTsKKyAgfQorCisg
IC8vIEZpZWxkIDY6IGRvdWJsZV9wZWFrX3ZhbHVlCisgIGlmIChfaGFzX2ZpZWxkX1s2XSkgewor
ICAgIG1zZy0+QXBwZW5kRml4ZWQoNiwgZG91YmxlX3BlYWtfdmFsdWVfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDc6IG51bWVyYXRvcl91bml0cworICBmb3IgKGF1dG8mIGl0IDogbnVtZXJhdG9yX3Vu
aXRzXykgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDcsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxk
IDg6IGRlbm9taW5hdG9yX3VuaXRzCisgIGZvciAoYXV0byYgaXQgOiBkZW5vbWluYXRvcl91bml0
c18pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg4LCBpdCk7CisgIH0KKworICAvLyBGaWVsZCA5
OiBzZWxlY3RfYnlfZGVmYXVsdAorICBpZiAoX2hhc19maWVsZF9bOV0pIHsKKyAgICBtc2ctPkFw
cGVuZFRpbnlWYXJJbnQoOSwgc2VsZWN0X2J5X2RlZmF1bHRfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDEwOiBncm91cHMKKyAgZm9yIChhdXRvJiBpdCA6IGdyb3Vwc18pIHsKKyAgICBtc2ctPkFwcGVu
ZFZhckludCgxMCwgaXQpOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25v
d25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBu
YW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFj
ZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9vYnNlcnZhYmxlX2V2ZW50cy5n
ZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vY29tbW9uL29ic2VydmFibGVfZXZlbnRzLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dl
bmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX09CU0VSVkFCTEVfRVZFTlRTX1BST1RPX0NQUF9IXwor
I2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9PQlNFUlZBQkxF
X0VWRU5UU19QUk9UT19DUFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJp
dHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5
cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5o
IgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2Ug
Z2VuIHsKK2NsYXNzIE9ic2VydmFibGVFdmVudHM7CitjbGFzcyBPYnNlcnZhYmxlRXZlbnRzX0Rh
dGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlOworZW51bSBPYnNlcnZhYmxlRXZlbnRzX1R5cGUg
OiBpbnQ7CitlbnVtIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGUgOiBp
bnQ7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30g
IC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdl
OworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2VudW0gT2JzZXJ2YWJsZUV2ZW50c19U
eXBlIDogaW50IHsKKyAgT2JzZXJ2YWJsZUV2ZW50c19UeXBlX1RZUEVfVU5TUEVDSUZJRUQgPSAw
LAorICBPYnNlcnZhYmxlRXZlbnRzX1R5cGVfVFlQRV9EQVRBX1NPVVJDRVNfSU5TVEFOQ0VTID0g
MSwKKyAgT2JzZXJ2YWJsZUV2ZW50c19UeXBlX1RZUEVfQUxMX0RBVEFfU09VUkNFU19TVEFSVEVE
ID0gMiwKK307CitlbnVtIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGUg
OiBpbnQgeworICBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlX0RBVEFf
U09VUkNFX0lOU1RBTkNFX1NUQVRFX1NUT1BQRUQgPSAxLAorICBPYnNlcnZhYmxlRXZlbnRzX0Rh
dGFTb3VyY2VJbnN0YW5jZVN0YXRlX0RBVEFfU09VUkNFX0lOU1RBTkNFX1NUQVRFX1NUQVJURUQg
PSAyLAorfTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIE9ic2VydmFibGVFdmVudHMgOiBwdWJs
aWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgRGF0YVNv
dXJjZUluc3RhbmNlU3RhdGVDaGFuZ2UgPSBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0
YW5jZVN0YXRlQ2hhbmdlOworICB1c2luZyBUeXBlID0gT2JzZXJ2YWJsZUV2ZW50c19UeXBlOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9VTlNQRUNJRklFRCA9IE9ic2VydmFibGVFdmVu
dHNfVHlwZV9UWVBFX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9E
QVRBX1NPVVJDRVNfSU5TVEFOQ0VTID0gT2JzZXJ2YWJsZUV2ZW50c19UeXBlX1RZUEVfREFUQV9T
T1VSQ0VTX0lOU1RBTkNFUzsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRZUEVfQUxMX0RBVEFf
U09VUkNFU19TVEFSVEVEID0gT2JzZXJ2YWJsZUV2ZW50c19UeXBlX1RZUEVfQUxMX0RBVEFfU09V
UkNFU19TVEFSVEVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVHlwZV9NSU4gPSBPYnNlcnZh
YmxlRXZlbnRzX1R5cGVfVFlQRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRv
IFR5cGVfTUFYID0gT2JzZXJ2YWJsZUV2ZW50c19UeXBlX1RZUEVfQUxMX0RBVEFfU09VUkNFU19T
VEFSVEVEOworICB1c2luZyBEYXRhU291cmNlSW5zdGFuY2VTdGF0ZSA9IE9ic2VydmFibGVFdmVu
dHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBEQVRB
X1NPVVJDRV9JTlNUQU5DRV9TVEFURV9TVE9QUEVEID0gT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291
cmNlSW5zdGFuY2VTdGF0ZV9EQVRBX1NPVVJDRV9JTlNUQU5DRV9TVEFURV9TVE9QUEVEOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gREFUQV9TT1VSQ0VfSU5TVEFOQ0VfU1RBVEVfU1RBUlRFRCA9
IE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVfREFUQV9TT1VSQ0VfSU5T
VEFOQ0VfU1RBVEVfU1RBUlRFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIERhdGFTb3VyY2VJ
bnN0YW5jZVN0YXRlX01JTiA9IE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3Rh
dGVfREFUQV9TT1VSQ0VfSU5TVEFOQ0VfU1RBVEVfU1RPUFBFRDsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIERhdGFTb3VyY2VJbnN0YW5jZVN0YXRlX01BWCA9IE9ic2VydmFibGVFdmVudHNfRGF0
YVNvdXJjZUluc3RhbmNlU3RhdGVfREFUQV9TT1VSQ0VfSU5TVEFOQ0VfU1RBVEVfU1RBUlRFRDsK
KyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtJbnN0YW5jZVN0YXRlQ2hhbmdlc0ZpZWxkTnVt
YmVyID0gMSwKKyAgICBrQWxsRGF0YVNvdXJjZXNTdGFydGVkRmllbGROdW1iZXIgPSAyLAorICB9
OworCisgIE9ic2VydmFibGVFdmVudHMoKTsKKyAgfk9ic2VydmFibGVFdmVudHMoKSBvdmVycmlk
ZTsKKyAgT2JzZXJ2YWJsZUV2ZW50cyhPYnNlcnZhYmxlRXZlbnRzJiYpIG5vZXhjZXB0OworICBP
YnNlcnZhYmxlRXZlbnRzJiBvcGVyYXRvcj0oT2JzZXJ2YWJsZUV2ZW50cyYmKTsKKyAgT2JzZXJ2
YWJsZUV2ZW50cyhjb25zdCBPYnNlcnZhYmxlRXZlbnRzJik7CisgIE9ic2VydmFibGVFdmVudHMm
IG9wZXJhdG9yPShjb25zdCBPYnNlcnZhYmxlRXZlbnRzJik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBPYnNlcnZhYmxlRXZlbnRzJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBP
YnNlcnZhYmxlRXZlbnRzJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7
IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRl
OworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBz
dGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7Cisg
IHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50IGlu
c3RhbmNlX3N0YXRlX2NoYW5nZXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGlu
dD4oaW5zdGFuY2Vfc3RhdGVfY2hhbmdlc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3Rv
cjxPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlPiYgaW5zdGFu
Y2Vfc3RhdGVfY2hhbmdlcygpIGNvbnN0IHsgcmV0dXJuIGluc3RhbmNlX3N0YXRlX2NoYW5nZXNf
OyB9CisgIHN0ZDo6dmVjdG9yPE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3Rh
dGVDaGFuZ2U+KiBtdXRhYmxlX2luc3RhbmNlX3N0YXRlX2NoYW5nZXMoKSB7IHJldHVybiAmaW5z
dGFuY2Vfc3RhdGVfY2hhbmdlc187IH0KKyAgdm9pZCBjbGVhcl9pbnN0YW5jZV9zdGF0ZV9jaGFu
Z2VzKCkgeyBpbnN0YW5jZV9zdGF0ZV9jaGFuZ2VzXy5jbGVhcigpOyB9CisgIE9ic2VydmFibGVF
dmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2UqIGFkZF9pbnN0YW5jZV9zdGF0ZV9j
aGFuZ2VzKCkgeyBpbnN0YW5jZV9zdGF0ZV9jaGFuZ2VzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJu
ICZpbnN0YW5jZV9zdGF0ZV9jaGFuZ2VzXy5iYWNrKCk7IH0KKworICBib29sIGhhc19hbGxfZGF0
YV9zb3VyY2VzX3N0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBi
b29sIGFsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIGFsbF9kYXRhX3Nv
dXJjZXNfc3RhcnRlZF87IH0KKyAgdm9pZCBzZXRfYWxsX2RhdGFfc291cmNlc19zdGFydGVkKGJv
b2wgdmFsdWUpIHsgYWxsX2RhdGFfc291cmNlc19zdGFydGVkXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoMik7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPE9ic2VydmFibGVFdmVudHNf
RGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2U+IGluc3RhbmNlX3N0YXRlX2NoYW5nZXNfOwor
ICBib29sIGFsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZF97fTsKKworICAvLyBBbGxvd3MgdG8gcHJl
c2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0
aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3du
X2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mz4gX2hhc19maWVsZF97fTsKK307CisKKworY2xh
c3MgUEVSRkVUVE9fRVhQT1JUIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3Rh
dGVDaGFuZ2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoK
KyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtQcm9kdWNlck5hbWVGaWVsZE51bWJlciA9IDEs
CisgICAga0RhdGFTb3VyY2VOYW1lRmllbGROdW1iZXIgPSAyLAorICAgIGtTdGF0ZUZpZWxkTnVt
YmVyID0gMywKKyAgfTsKKworICBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0
YXRlQ2hhbmdlKCk7CisgIH5PYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRl
Q2hhbmdlKCkgb3ZlcnJpZGU7CisgIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNl
U3RhdGVDaGFuZ2UoT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5n
ZSYmKSBub2V4Y2VwdDsKKyAgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0
ZUNoYW5nZSYgb3BlcmF0b3I9KE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3Rh
dGVDaGFuZ2UmJik7CisgIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVD
aGFuZ2UoY29uc3QgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5n
ZSYpOworICBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlJiBv
cGVyYXRvcj0oY29uc3QgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNo
YW5nZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291
cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
T2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZSYgb3RoZXIpIGNv
bnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJh
eShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFs
aXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVy
bzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3Byb2R1Y2VyX25hbWUoKSBjb25zdCB7
IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvZHVjZXJf
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIHByb2R1Y2VyX25hbWVfOyB9CisgIHZvaWQgc2V0X3Byb2R1
Y2VyX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IHByb2R1Y2VyX25hbWVfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2RhdGFfc291cmNlX25hbWUo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYg
ZGF0YV9zb3VyY2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfc291cmNlX25hbWVfOyB9Cisg
IHZvaWQgc2V0X2RhdGFfc291cmNlX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IGRh
dGFfc291cmNlX25hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wg
aGFzX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgT2JzZXJ2YWJs
ZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZSBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0
YXRlXzsgfQorICB2b2lkIHNldF9zdGF0ZShPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0
YW5jZVN0YXRlIHZhbHVlKSB7IHN0YXRlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0K
KworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIHByb2R1Y2VyX25hbWVfe307CisgIHN0ZDo6c3Ry
aW5nIGRhdGFfc291cmNlX25hbWVfe307CisgIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUlu
c3RhbmNlU3RhdGUgc3RhdGVfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24g
cHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNp
b25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisg
IHN0ZDo6Yml0c2V0PDQ+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVy
ZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2Vu
ZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9PQlNFUlZBQkxF
X0VWRU5UU19QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxk
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERP
IE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFn
bWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICIt
V2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJv
dG9zL3BlcmZldHRvL2NvbW1vbi9vYnNlcnZhYmxlX2V2ZW50cy5nZW4uaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK09ic2Vy
dmFibGVFdmVudHM6Ok9ic2VydmFibGVFdmVudHMoKSA9IGRlZmF1bHQ7CitPYnNlcnZhYmxlRXZl
bnRzOjp+T2JzZXJ2YWJsZUV2ZW50cygpID0gZGVmYXVsdDsKK09ic2VydmFibGVFdmVudHM6Ok9i
c2VydmFibGVFdmVudHMoY29uc3QgT2JzZXJ2YWJsZUV2ZW50cyYpID0gZGVmYXVsdDsKK09ic2Vy
dmFibGVFdmVudHMmIE9ic2VydmFibGVFdmVudHM6Om9wZXJhdG9yPShjb25zdCBPYnNlcnZhYmxl
RXZlbnRzJikgPSBkZWZhdWx0OworT2JzZXJ2YWJsZUV2ZW50czo6T2JzZXJ2YWJsZUV2ZW50cyhP
YnNlcnZhYmxlRXZlbnRzJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK09ic2VydmFibGVFdmVudHMm
IE9ic2VydmFibGVFdmVudHM6Om9wZXJhdG9yPShPYnNlcnZhYmxlRXZlbnRzJiYpID0gZGVmYXVs
dDsKKworYm9vbCBPYnNlcnZhYmxlRXZlbnRzOjpvcGVyYXRvcj09KGNvbnN0IE9ic2VydmFibGVF
dmVudHMmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIu
dW5rbm93bl9maWVsZHNfCisgICAmJiBpbnN0YW5jZV9zdGF0ZV9jaGFuZ2VzXyA9PSBvdGhlci5p
bnN0YW5jZV9zdGF0ZV9jaGFuZ2VzXworICAgJiYgYWxsX2RhdGFfc291cmNlc19zdGFydGVkXyA9
PSBvdGhlci5hbGxfZGF0YV9zb3VyY2VzX3N0YXJ0ZWRfOworfQorCitib29sIE9ic2VydmFibGVF
dmVudHM6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAg
aW5zdGFuY2Vfc3RhdGVfY2hhbmdlc18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFy
KCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3Rv
RGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChm
aWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQo
ZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2Fz
ZSAxIC8qIGluc3RhbmNlX3N0YXRlX2NoYW5nZXMgKi86CisgICAgICAgIGluc3RhbmNlX3N0YXRl
X2NoYW5nZXNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBpbnN0YW5jZV9zdGF0ZV9jaGFuZ2Vz
Xy5iYWNrKCkuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAyIC8qIGFsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZhbGxfZGF0YV9zb3VyY2VzX3N0YXJ0ZWRfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygm
dW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAh
cGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBPYnNl
cnZhYmxlRXZlbnRzOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86
OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNn
LmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZl
Y3Rvcjx1aW50OF90PiBPYnNlcnZhYmxlRXZlbnRzOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qg
eworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7
CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXko
KTsKK30KKwordm9pZCBPYnNlcnZhYmxlRXZlbnRzOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBpbnN0YW5jZV9zdGF0ZV9jaGFuZ2Vz
CisgIGZvciAoYXV0byYgaXQgOiBpbnN0YW5jZV9zdGF0ZV9jaGFuZ2VzXykgeworICAgIGl0LlNl
cmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMSkp
OworICB9CisKKyAgLy8gRmllbGQgMjogYWxsX2RhdGFfc291cmNlc19zdGFydGVkCisgIGlmIChf
aGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgyLCBhbGxfZGF0YV9z
b3VyY2VzX3N0YXJ0ZWRfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtu
b3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitPYnNl
cnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlOjpPYnNlcnZhYmxlRXZl
bnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlKCkgPSBkZWZhdWx0OworT2JzZXJ2YWJs
ZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZTo6fk9ic2VydmFibGVFdmVudHNf
RGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2UoKSA9IGRlZmF1bHQ7CitPYnNlcnZhYmxlRXZl
bnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlOjpPYnNlcnZhYmxlRXZlbnRzX0RhdGFT
b3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlKGNvbnN0IE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJj
ZUluc3RhbmNlU3RhdGVDaGFuZ2UmKSA9IGRlZmF1bHQ7CitPYnNlcnZhYmxlRXZlbnRzX0RhdGFT
b3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlJiBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0
YW5jZVN0YXRlQ2hhbmdlOjpvcGVyYXRvcj0oY29uc3QgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291
cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZSYpID0gZGVmYXVsdDsKK09ic2VydmFibGVFdmVudHNfRGF0
YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2U6Ok9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUlu
c3RhbmNlU3RhdGVDaGFuZ2UoT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0
ZUNoYW5nZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3Vy
Y2VJbnN0YW5jZVN0YXRlQ2hhbmdlJiBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5j
ZVN0YXRlQ2hhbmdlOjpvcGVyYXRvcj0oT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFu
Y2VTdGF0ZUNoYW5nZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgT2JzZXJ2YWJsZUV2ZW50c19EYXRh
U291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZTo6b3BlcmF0b3I9PShjb25zdCBPYnNlcnZhYmxlRXZl
bnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlJiBvdGhlcikgY29uc3QgeworICByZXR1
cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgcHJvZHVj
ZXJfbmFtZV8gPT0gb3RoZXIucHJvZHVjZXJfbmFtZV8KKyAgICYmIGRhdGFfc291cmNlX25hbWVf
ID09IG90aGVyLmRhdGFfc291cmNlX25hbWVfCisgICAmJiBzdGF0ZV8gPT0gb3RoZXIuc3RhdGVf
OworfQorCitib29sIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFu
Z2U6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5r
bm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAg
Ojpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZp
ZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAg
ICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQu
aWQoKSkgeworICAgICAgY2FzZSAxIC8qIHByb2R1Y2VyX25hbWUgKi86CisgICAgICAgIGZpZWxk
LmdldCgmcHJvZHVjZXJfbmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBk
YXRhX3NvdXJjZV9uYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJmRhdGFfc291cmNlX25hbWVf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogc3RhdGUgKi86CisgICAgICAgIGZp
ZWxkLmdldCgmc3RhdGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAg
ICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNf
bGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0
YW5jZVN0YXRlQ2hhbmdlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3pl
cm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUo
bXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6
OnZlY3Rvcjx1aW50OF90PiBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRl
Q2hhbmdlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1
ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkp
OworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBPYnNlcnZhYmxl
RXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlOjpTZXJpYWxpemUoOjpwcm90b3pl
cm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBwcm9kdWNlcl9uYW1lCisg
IGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEsIHByb2R1Y2Vy
X25hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGRhdGFfc291cmNlX25hbWUKKyAgaWYgKF9o
YXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMiwgZGF0YV9zb3VyY2VfbmFt
ZV8pOworICB9CisKKyAgLy8gRmllbGQgMzogc3RhdGUKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7
CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMywgc3RhdGVfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5k
UmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6
ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJv
dG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24v
c3lzX3N0YXRzX2NvdW50ZXJzLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRl
cjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24vc3lzX3N0YXRzX2NvdW50ZXJzLmdlbi5oCisv
LyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisj
aWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1NZU19TVEFUU19D
T1VOVEVSU19QUk9UT19DUFBfSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19DT01NT05fU1lTX1NUQVRTX0NPVU5URVJTX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8
c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRl
IDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3Bh
Y2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworZW51bSBNZW1pbmZvQ291bnRlcnMgOiBpbnQ7
CitlbnVtIFZtc3RhdENvdW50ZXJzIDogaW50OworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9
ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBw
cm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7
CitlbnVtIE1lbWluZm9Db3VudGVycyA6IGludCB7CisgIE1FTUlORk9fVU5TUEVDSUZJRUQgPSAw
LAorICBNRU1JTkZPX01FTV9UT1RBTCA9IDEsCisgIE1FTUlORk9fTUVNX0ZSRUUgPSAyLAorICBN
RU1JTkZPX01FTV9BVkFJTEFCTEUgPSAzLAorICBNRU1JTkZPX0JVRkZFUlMgPSA0LAorICBNRU1J
TkZPX0NBQ0hFRCA9IDUsCisgIE1FTUlORk9fU1dBUF9DQUNIRUQgPSA2LAorICBNRU1JTkZPX0FD
VElWRSA9IDcsCisgIE1FTUlORk9fSU5BQ1RJVkUgPSA4LAorICBNRU1JTkZPX0FDVElWRV9BTk9O
ID0gOSwKKyAgTUVNSU5GT19JTkFDVElWRV9BTk9OID0gMTAsCisgIE1FTUlORk9fQUNUSVZFX0ZJ
TEUgPSAxMSwKKyAgTUVNSU5GT19JTkFDVElWRV9GSUxFID0gMTIsCisgIE1FTUlORk9fVU5FVklD
VEFCTEUgPSAxMywKKyAgTUVNSU5GT19NTE9DS0VEID0gMTQsCisgIE1FTUlORk9fU1dBUF9UT1RB
TCA9IDE1LAorICBNRU1JTkZPX1NXQVBfRlJFRSA9IDE2LAorICBNRU1JTkZPX0RJUlRZID0gMTcs
CisgIE1FTUlORk9fV1JJVEVCQUNLID0gMTgsCisgIE1FTUlORk9fQU5PTl9QQUdFUyA9IDE5LAor
ICBNRU1JTkZPX01BUFBFRCA9IDIwLAorICBNRU1JTkZPX1NITUVNID0gMjEsCisgIE1FTUlORk9f
U0xBQiA9IDIyLAorICBNRU1JTkZPX1NMQUJfUkVDTEFJTUFCTEUgPSAyMywKKyAgTUVNSU5GT19T
TEFCX1VOUkVDTEFJTUFCTEUgPSAyNCwKKyAgTUVNSU5GT19LRVJORUxfU1RBQ0sgPSAyNSwKKyAg
TUVNSU5GT19QQUdFX1RBQkxFUyA9IDI2LAorICBNRU1JTkZPX0NPTU1JVF9MSU1JVCA9IDI3LAor
ICBNRU1JTkZPX0NPTU1JVEVEX0FTID0gMjgsCisgIE1FTUlORk9fVk1BTExPQ19UT1RBTCA9IDI5
LAorICBNRU1JTkZPX1ZNQUxMT0NfVVNFRCA9IDMwLAorICBNRU1JTkZPX1ZNQUxMT0NfQ0hVTksg
PSAzMSwKKyAgTUVNSU5GT19DTUFfVE9UQUwgPSAzMiwKKyAgTUVNSU5GT19DTUFfRlJFRSA9IDMz
LAorfTsKK2VudW0gVm1zdGF0Q291bnRlcnMgOiBpbnQgeworICBWTVNUQVRfVU5TUEVDSUZJRUQg
PSAwLAorICBWTVNUQVRfTlJfRlJFRV9QQUdFUyA9IDEsCisgIFZNU1RBVF9OUl9BTExPQ19CQVRD
SCA9IDIsCisgIFZNU1RBVF9OUl9JTkFDVElWRV9BTk9OID0gMywKKyAgVk1TVEFUX05SX0FDVElW
RV9BTk9OID0gNCwKKyAgVk1TVEFUX05SX0lOQUNUSVZFX0ZJTEUgPSA1LAorICBWTVNUQVRfTlJf
QUNUSVZFX0ZJTEUgPSA2LAorICBWTVNUQVRfTlJfVU5FVklDVEFCTEUgPSA3LAorICBWTVNUQVRf
TlJfTUxPQ0sgPSA4LAorICBWTVNUQVRfTlJfQU5PTl9QQUdFUyA9IDksCisgIFZNU1RBVF9OUl9N
QVBQRUQgPSAxMCwKKyAgVk1TVEFUX05SX0ZJTEVfUEFHRVMgPSAxMSwKKyAgVk1TVEFUX05SX0RJ
UlRZID0gMTIsCisgIFZNU1RBVF9OUl9XUklURUJBQ0sgPSAxMywKKyAgVk1TVEFUX05SX1NMQUJf
UkVDTEFJTUFCTEUgPSAxNCwKKyAgVk1TVEFUX05SX1NMQUJfVU5SRUNMQUlNQUJMRSA9IDE1LAor
ICBWTVNUQVRfTlJfUEFHRV9UQUJMRV9QQUdFUyA9IDE2LAorICBWTVNUQVRfTlJfS0VSTkVMX1NU
QUNLID0gMTcsCisgIFZNU1RBVF9OUl9PVkVSSEVBRCA9IDE4LAorICBWTVNUQVRfTlJfVU5TVEFC
TEUgPSAxOSwKKyAgVk1TVEFUX05SX0JPVU5DRSA9IDIwLAorICBWTVNUQVRfTlJfVk1TQ0FOX1dS
SVRFID0gMjEsCisgIFZNU1RBVF9OUl9WTVNDQU5fSU1NRURJQVRFX1JFQ0xBSU0gPSAyMiwKKyAg
Vk1TVEFUX05SX1dSSVRFQkFDS19URU1QID0gMjMsCisgIFZNU1RBVF9OUl9JU09MQVRFRF9BTk9O
ID0gMjQsCisgIFZNU1RBVF9OUl9JU09MQVRFRF9GSUxFID0gMjUsCisgIFZNU1RBVF9OUl9TSE1F
TSA9IDI2LAorICBWTVNUQVRfTlJfRElSVElFRCA9IDI3LAorICBWTVNUQVRfTlJfV1JJVFRFTiA9
IDI4LAorICBWTVNUQVRfTlJfUEFHRVNfU0NBTk5FRCA9IDI5LAorICBWTVNUQVRfV09SS0lOR1NF
VF9SRUZBVUxUID0gMzAsCisgIFZNU1RBVF9XT1JLSU5HU0VUX0FDVElWQVRFID0gMzEsCisgIFZN
U1RBVF9XT1JLSU5HU0VUX05PREVSRUNMQUlNID0gMzIsCisgIFZNU1RBVF9OUl9BTk9OX1RSQU5T
UEFSRU5UX0hVR0VQQUdFUyA9IDMzLAorICBWTVNUQVRfTlJfRlJFRV9DTUEgPSAzNCwKKyAgVk1T
VEFUX05SX1NXQVBDQUNIRSA9IDM1LAorICBWTVNUQVRfTlJfRElSVFlfVEhSRVNIT0xEID0gMzYs
CisgIFZNU1RBVF9OUl9ESVJUWV9CQUNLR1JPVU5EX1RIUkVTSE9MRCA9IDM3LAorICBWTVNUQVRf
UEdQR0lOID0gMzgsCisgIFZNU1RBVF9QR1BHT1VUID0gMzksCisgIFZNU1RBVF9QR1BHT1VUQ0xF
QU4gPSA0MCwKKyAgVk1TVEFUX1BTV1BJTiA9IDQxLAorICBWTVNUQVRfUFNXUE9VVCA9IDQyLAor
ICBWTVNUQVRfUEdBTExPQ19ETUEgPSA0MywKKyAgVk1TVEFUX1BHQUxMT0NfTk9STUFMID0gNDQs
CisgIFZNU1RBVF9QR0FMTE9DX01PVkFCTEUgPSA0NSwKKyAgVk1TVEFUX1BHRlJFRSA9IDQ2LAor
ICBWTVNUQVRfUEdBQ1RJVkFURSA9IDQ3LAorICBWTVNUQVRfUEdERUFDVElWQVRFID0gNDgsCisg
IFZNU1RBVF9QR0ZBVUxUID0gNDksCisgIFZNU1RBVF9QR01BSkZBVUxUID0gNTAsCisgIFZNU1RB
VF9QR1JFRklMTF9ETUEgPSA1MSwKKyAgVk1TVEFUX1BHUkVGSUxMX05PUk1BTCA9IDUyLAorICBW
TVNUQVRfUEdSRUZJTExfTU9WQUJMRSA9IDUzLAorICBWTVNUQVRfUEdTVEVBTF9LU1dBUERfRE1B
ID0gNTQsCisgIFZNU1RBVF9QR1NURUFMX0tTV0FQRF9OT1JNQUwgPSA1NSwKKyAgVk1TVEFUX1BH
U1RFQUxfS1NXQVBEX01PVkFCTEUgPSA1NiwKKyAgVk1TVEFUX1BHU1RFQUxfRElSRUNUX0RNQSA9
IDU3LAorICBWTVNUQVRfUEdTVEVBTF9ESVJFQ1RfTk9STUFMID0gNTgsCisgIFZNU1RBVF9QR1NU
RUFMX0RJUkVDVF9NT1ZBQkxFID0gNTksCisgIFZNU1RBVF9QR1NDQU5fS1NXQVBEX0RNQSA9IDYw
LAorICBWTVNUQVRfUEdTQ0FOX0tTV0FQRF9OT1JNQUwgPSA2MSwKKyAgVk1TVEFUX1BHU0NBTl9L
U1dBUERfTU9WQUJMRSA9IDYyLAorICBWTVNUQVRfUEdTQ0FOX0RJUkVDVF9ETUEgPSA2MywKKyAg
Vk1TVEFUX1BHU0NBTl9ESVJFQ1RfTk9STUFMID0gNjQsCisgIFZNU1RBVF9QR1NDQU5fRElSRUNU
X01PVkFCTEUgPSA2NSwKKyAgVk1TVEFUX1BHU0NBTl9ESVJFQ1RfVEhST1RUTEUgPSA2NiwKKyAg
Vk1TVEFUX1BHSU5PREVTVEVBTCA9IDY3LAorICBWTVNUQVRfU0xBQlNfU0NBTk5FRCA9IDY4LAor
ICBWTVNUQVRfS1NXQVBEX0lOT0RFU1RFQUwgPSA2OSwKKyAgVk1TVEFUX0tTV0FQRF9MT1dfV01B
UktfSElUX1FVSUNLTFkgPSA3MCwKKyAgVk1TVEFUX0tTV0FQRF9ISUdIX1dNQVJLX0hJVF9RVUlD
S0xZID0gNzEsCisgIFZNU1RBVF9QQUdFT1VUUlVOID0gNzIsCisgIFZNU1RBVF9BTExPQ1NUQUxM
ID0gNzMsCisgIFZNU1RBVF9QR1JPVEFURUQgPSA3NCwKKyAgVk1TVEFUX0RST1BfUEFHRUNBQ0hF
ID0gNzUsCisgIFZNU1RBVF9EUk9QX1NMQUIgPSA3NiwKKyAgVk1TVEFUX1BHTUlHUkFURV9TVUND
RVNTID0gNzcsCisgIFZNU1RBVF9QR01JR1JBVEVfRkFJTCA9IDc4LAorICBWTVNUQVRfQ09NUEFD
VF9NSUdSQVRFX1NDQU5ORUQgPSA3OSwKKyAgVk1TVEFUX0NPTVBBQ1RfRlJFRV9TQ0FOTkVEID0g
ODAsCisgIFZNU1RBVF9DT01QQUNUX0lTT0xBVEVEID0gODEsCisgIFZNU1RBVF9DT01QQUNUX1NU
QUxMID0gODIsCisgIFZNU1RBVF9DT01QQUNUX0ZBSUwgPSA4MywKKyAgVk1TVEFUX0NPTVBBQ1Rf
U1VDQ0VTUyA9IDg0LAorICBWTVNUQVRfQ09NUEFDVF9EQUVNT05fV0FLRSA9IDg1LAorICBWTVNU
QVRfVU5FVklDVEFCTEVfUEdTX0NVTExFRCA9IDg2LAorICBWTVNUQVRfVU5FVklDVEFCTEVfUEdT
X1NDQU5ORUQgPSA4NywKKyAgVk1TVEFUX1VORVZJQ1RBQkxFX1BHU19SRVNDVUVEID0gODgsCisg
IFZNU1RBVF9VTkVWSUNUQUJMRV9QR1NfTUxPQ0tFRCA9IDg5LAorICBWTVNUQVRfVU5FVklDVEFC
TEVfUEdTX01VTkxPQ0tFRCA9IDkwLAorICBWTVNUQVRfVU5FVklDVEFCTEVfUEdTX0NMRUFSRUQg
PSA5MSwKKyAgVk1TVEFUX1VORVZJQ1RBQkxFX1BHU19TVFJBTkRFRCA9IDkyLAorICBWTVNUQVRf
TlJfWlNQQUdFUyA9IDkzLAorICBWTVNUQVRfTlJfSU9OX0hFQVAgPSA5NCwKKyAgVk1TVEFUX05S
X0dQVV9IRUFQID0gOTUsCit9OworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1l
c3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9f
UFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fU1lTX1NUQVRTX0NPVU5URVJTX1BST1RPX0NQ
UF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVj
b2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9n
ZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3Rp
YyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29t
bW9uL3N5c19zdGF0c19jb3VudGVycy5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25h
bWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEg
R0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4v
cHJvdG9zL3BlcmZldHRvL2NvbW1vbi90cmFjZV9zdGF0cy5nZW4uY2MKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNlX3N0YXRz
Lmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5f
cGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1RS
QUNFX1NUQVRTX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BF
UkZFVFRPX0NPTU1PTl9UUkFDRV9TVEFUU19QUk9UT19DUFBfSF8KKworI2luY2x1ZGUgPHN0ZGlu
dC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3Ry
aW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY29w
eWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHBy
b3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIFRyYWNlU3RhdHM7CitjbGFzcyBUcmFjZVN0
YXRzX0J1ZmZlclN0YXRzOworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8gewor
Y2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBl
cmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBF
UkZFVFRPX0VYUE9SVCBUcmFjZVN0YXRzIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdl
T2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIEJ1ZmZlclN0YXRzID0gVHJhY2VTdGF0c19CdWZmZXJT
dGF0czsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtCdWZmZXJTdGF0c0ZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrUHJvZHVjZXJzQ29ubmVjdGVkRmllbGROdW1iZXIgPSAyLAorICAgIGtQcm9k
dWNlcnNTZWVuRmllbGROdW1iZXIgPSAzLAorICAgIGtEYXRhU291cmNlc1JlZ2lzdGVyZWRGaWVs
ZE51bWJlciA9IDQsCisgICAga0RhdGFTb3VyY2VzU2VlbkZpZWxkTnVtYmVyID0gNSwKKyAgICBr
VHJhY2luZ1Nlc3Npb25zRmllbGROdW1iZXIgPSA2LAorICAgIGtUb3RhbEJ1ZmZlcnNGaWVsZE51
bWJlciA9IDcsCisgICAga0NodW5rc0Rpc2NhcmRlZEZpZWxkTnVtYmVyID0gOCwKKyAgICBrUGF0
Y2hlc0Rpc2NhcmRlZEZpZWxkTnVtYmVyID0gOSwKKyAgICBrSW52YWxpZFBhY2tldHNGaWVsZE51
bWJlciA9IDEwLAorICB9OworCisgIFRyYWNlU3RhdHMoKTsKKyAgflRyYWNlU3RhdHMoKSBvdmVy
cmlkZTsKKyAgVHJhY2VTdGF0cyhUcmFjZVN0YXRzJiYpIG5vZXhjZXB0OworICBUcmFjZVN0YXRz
JiBvcGVyYXRvcj0oVHJhY2VTdGF0cyYmKTsKKyAgVHJhY2VTdGF0cyhjb25zdCBUcmFjZVN0YXRz
Jik7CisgIFRyYWNlU3RhdHMmIG9wZXJhdG9yPShjb25zdCBUcmFjZVN0YXRzJik7CisgIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBUcmFjZVN0YXRzJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShj
b25zdCBUcmFjZVN0YXRzJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7
IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRl
OworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBz
dGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7Cisg
IHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50IGJ1
ZmZlcl9zdGF0c19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihidWZmZXJf
c3RhdHNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJhY2VTdGF0c19CdWZmZXJT
dGF0cz4mIGJ1ZmZlcl9zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGJ1ZmZlcl9zdGF0c187IH0KKyAg
c3RkOjp2ZWN0b3I8VHJhY2VTdGF0c19CdWZmZXJTdGF0cz4qIG11dGFibGVfYnVmZmVyX3N0YXRz
KCkgeyByZXR1cm4gJmJ1ZmZlcl9zdGF0c187IH0KKyAgdm9pZCBjbGVhcl9idWZmZXJfc3RhdHMo
KSB7IGJ1ZmZlcl9zdGF0c18uY2xlYXIoKTsgfQorICBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzKiBh
ZGRfYnVmZmVyX3N0YXRzKCkgeyBidWZmZXJfc3RhdHNfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4g
JmJ1ZmZlcl9zdGF0c18uYmFjaygpOyB9CisKKyAgYm9vbCBoYXNfcHJvZHVjZXJzX2Nvbm5lY3Rl
ZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIHVpbnQzMl90IHByb2R1Y2Vy
c19jb25uZWN0ZWQoKSBjb25zdCB7IHJldHVybiBwcm9kdWNlcnNfY29ubmVjdGVkXzsgfQorICB2
b2lkIHNldF9wcm9kdWNlcnNfY29ubmVjdGVkKHVpbnQzMl90IHZhbHVlKSB7IHByb2R1Y2Vyc19j
b25uZWN0ZWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX3By
b2R1Y2Vyc19zZWVuKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDY0
X3QgcHJvZHVjZXJzX3NlZW4oKSBjb25zdCB7IHJldHVybiBwcm9kdWNlcnNfc2Vlbl87IH0KKyAg
dm9pZCBzZXRfcHJvZHVjZXJzX3NlZW4odWludDY0X3QgdmFsdWUpIHsgcHJvZHVjZXJzX3NlZW5f
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX2RhdGFfc291cmNl
c19yZWdpc3RlcmVkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAgdWludDMy
X3QgZGF0YV9zb3VyY2VzX3JlZ2lzdGVyZWQoKSBjb25zdCB7IHJldHVybiBkYXRhX3NvdXJjZXNf
cmVnaXN0ZXJlZF87IH0KKyAgdm9pZCBzZXRfZGF0YV9zb3VyY2VzX3JlZ2lzdGVyZWQodWludDMy
X3QgdmFsdWUpIHsgZGF0YV9zb3VyY2VzX3JlZ2lzdGVyZWRfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCg0KTsgfQorCisgIGJvb2wgaGFzX2RhdGFfc291cmNlc19zZWVuKCkgY29uc3QgeyByZXR1
cm4gX2hhc19maWVsZF9bNV07IH0KKyAgdWludDY0X3QgZGF0YV9zb3VyY2VzX3NlZW4oKSBjb25z
dCB7IHJldHVybiBkYXRhX3NvdXJjZXNfc2Vlbl87IH0KKyAgdm9pZCBzZXRfZGF0YV9zb3VyY2Vz
X3NlZW4odWludDY0X3QgdmFsdWUpIHsgZGF0YV9zb3VyY2VzX3NlZW5fID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCg1KTsgfQorCisgIGJvb2wgaGFzX3RyYWNpbmdfc2Vzc2lvbnMoKSBjb25zdCB7
IHJldHVybiBfaGFzX2ZpZWxkX1s2XTsgfQorICB1aW50MzJfdCB0cmFjaW5nX3Nlc3Npb25zKCkg
Y29uc3QgeyByZXR1cm4gdHJhY2luZ19zZXNzaW9uc187IH0KKyAgdm9pZCBzZXRfdHJhY2luZ19z
ZXNzaW9ucyh1aW50MzJfdCB2YWx1ZSkgeyB0cmFjaW5nX3Nlc3Npb25zXyA9IHZhbHVlOyBfaGFz
X2ZpZWxkXy5zZXQoNik7IH0KKworICBib29sIGhhc190b3RhbF9idWZmZXJzKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bN107IH0KKyAgdWludDMyX3QgdG90YWxfYnVmZmVycygpIGNvbnN0
IHsgcmV0dXJuIHRvdGFsX2J1ZmZlcnNfOyB9CisgIHZvaWQgc2V0X3RvdGFsX2J1ZmZlcnModWlu
dDMyX3QgdmFsdWUpIHsgdG90YWxfYnVmZmVyc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDcp
OyB9CisKKyAgYm9vbCBoYXNfY2h1bmtzX2Rpc2NhcmRlZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzhdOyB9CisgIHVpbnQ2NF90IGNodW5rc19kaXNjYXJkZWQoKSBjb25zdCB7IHJldHVy
biBjaHVua3NfZGlzY2FyZGVkXzsgfQorICB2b2lkIHNldF9jaHVua3NfZGlzY2FyZGVkKHVpbnQ2
NF90IHZhbHVlKSB7IGNodW5rc19kaXNjYXJkZWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg4
KTsgfQorCisgIGJvb2wgaGFzX3BhdGNoZXNfZGlzY2FyZGVkKCkgY29uc3QgeyByZXR1cm4gX2hh
c19maWVsZF9bOV07IH0KKyAgdWludDY0X3QgcGF0Y2hlc19kaXNjYXJkZWQoKSBjb25zdCB7IHJl
dHVybiBwYXRjaGVzX2Rpc2NhcmRlZF87IH0KKyAgdm9pZCBzZXRfcGF0Y2hlc19kaXNjYXJkZWQo
dWludDY0X3QgdmFsdWUpIHsgcGF0Y2hlc19kaXNjYXJkZWRfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCg5KTsgfQorCisgIGJvb2wgaGFzX2ludmFsaWRfcGFja2V0cygpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzEwXTsgfQorICB1aW50NjRfdCBpbnZhbGlkX3BhY2tldHMoKSBjb25zdCB7
IHJldHVybiBpbnZhbGlkX3BhY2tldHNfOyB9CisgIHZvaWQgc2V0X2ludmFsaWRfcGFja2V0cyh1
aW50NjRfdCB2YWx1ZSkgeyBpbnZhbGlkX3BhY2tldHNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxMCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFRyYWNlU3RhdHNfQnVmZmVyU3Rh
dHM+IGJ1ZmZlcl9zdGF0c187CisgIHVpbnQzMl90IHByb2R1Y2Vyc19jb25uZWN0ZWRfe307Cisg
IHVpbnQ2NF90IHByb2R1Y2Vyc19zZWVuX3t9OworICB1aW50MzJfdCBkYXRhX3NvdXJjZXNfcmVn
aXN0ZXJlZF97fTsKKyAgdWludDY0X3QgZGF0YV9zb3VyY2VzX3NlZW5fe307CisgIHVpbnQzMl90
IHRyYWNpbmdfc2Vzc2lvbnNfe307CisgIHVpbnQzMl90IHRvdGFsX2J1ZmZlcnNfe307CisgIHVp
bnQ2NF90IGNodW5rc19kaXNjYXJkZWRfe307CisgIHVpbnQ2NF90IHBhdGNoZXNfZGlzY2FyZGVk
X3t9OworICB1aW50NjRfdCBpbnZhbGlkX3BhY2tldHNfe307CisKKyAgLy8gQWxsb3dzIHRvIHBy
ZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdp
dGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93
bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDExPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitj
bGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2VTdGF0c19CdWZmZXJTdGF0cyA6IHB1YmxpYyA6OnBy
b3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7
CisgICAga0J1ZmZlclNpemVGaWVsZE51bWJlciA9IDEyLAorICAgIGtCeXRlc1dyaXR0ZW5GaWVs
ZE51bWJlciA9IDEsCisgICAga0J5dGVzT3ZlcndyaXR0ZW5GaWVsZE51bWJlciA9IDEzLAorICAg
IGtCeXRlc1JlYWRGaWVsZE51bWJlciA9IDE0LAorICAgIGtQYWRkaW5nQnl0ZXNXcml0dGVuRmll
bGROdW1iZXIgPSAxNSwKKyAgICBrUGFkZGluZ0J5dGVzQ2xlYXJlZEZpZWxkTnVtYmVyID0gMTYs
CisgICAga0NodW5rc1dyaXR0ZW5GaWVsZE51bWJlciA9IDIsCisgICAga0NodW5rc1Jld3JpdHRl
bkZpZWxkTnVtYmVyID0gMTAsCisgICAga0NodW5rc092ZXJ3cml0dGVuRmllbGROdW1iZXIgPSAz
LAorICAgIGtDaHVua3NEaXNjYXJkZWRGaWVsZE51bWJlciA9IDE4LAorICAgIGtDaHVua3NSZWFk
RmllbGROdW1iZXIgPSAxNywKKyAgICBrQ2h1bmtzQ29tbWl0dGVkT3V0T2ZPcmRlckZpZWxkTnVt
YmVyID0gMTEsCisgICAga1dyaXRlV3JhcENvdW50RmllbGROdW1iZXIgPSA0LAorICAgIGtQYXRj
aGVzU3VjY2VlZGVkRmllbGROdW1iZXIgPSA1LAorICAgIGtQYXRjaGVzRmFpbGVkRmllbGROdW1i
ZXIgPSA2LAorICAgIGtSZWFkYWhlYWRzU3VjY2VlZGVkRmllbGROdW1iZXIgPSA3LAorICAgIGtS
ZWFkYWhlYWRzRmFpbGVkRmllbGROdW1iZXIgPSA4LAorICAgIGtBYmlWaW9sYXRpb25zRmllbGRO
dW1iZXIgPSA5LAorICAgIGtUcmFjZVdyaXRlclBhY2tldExvc3NGaWVsZE51bWJlciA9IDE5LAor
ICB9OworCisgIFRyYWNlU3RhdHNfQnVmZmVyU3RhdHMoKTsKKyAgflRyYWNlU3RhdHNfQnVmZmVy
U3RhdHMoKSBvdmVycmlkZTsKKyAgVHJhY2VTdGF0c19CdWZmZXJTdGF0cyhUcmFjZVN0YXRzX0J1
ZmZlclN0YXRzJiYpIG5vZXhjZXB0OworICBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzJiBvcGVyYXRv
cj0oVHJhY2VTdGF0c19CdWZmZXJTdGF0cyYmKTsKKyAgVHJhY2VTdGF0c19CdWZmZXJTdGF0cyhj
b25zdCBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzJik7CisgIFRyYWNlU3RhdHNfQnVmZmVyU3RhdHMm
IG9wZXJhdG9yPShjb25zdCBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzJik7CisgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzJiBvdGhlcikgY29uc3QgeyByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
LCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikg
Y29uc3Q7CisKKyAgYm9vbCBoYXNfYnVmZmVyX3NpemUoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1sxMl07IH0KKyAgdWludDY0X3QgYnVmZmVyX3NpemUoKSBjb25zdCB7IHJldHVybiBidWZm
ZXJfc2l6ZV87IH0KKyAgdm9pZCBzZXRfYnVmZmVyX3NpemUodWludDY0X3QgdmFsdWUpIHsgYnVm
ZmVyX3NpemVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMik7IH0KKworICBib29sIGhhc19i
eXRlc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDY0
X3QgYnl0ZXNfd3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGJ5dGVzX3dyaXR0ZW5fOyB9CisgIHZv
aWQgc2V0X2J5dGVzX3dyaXR0ZW4odWludDY0X3QgdmFsdWUpIHsgYnl0ZXNfd3JpdHRlbl8gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfYnl0ZXNfb3ZlcndyaXR0
ZW4oKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxM107IH0KKyAgdWludDY0X3QgYnl0ZXNf
b3ZlcndyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBieXRlc19vdmVyd3JpdHRlbl87IH0KKyAgdm9p
ZCBzZXRfYnl0ZXNfb3ZlcndyaXR0ZW4odWludDY0X3QgdmFsdWUpIHsgYnl0ZXNfb3ZlcndyaXR0
ZW5fID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMyk7IH0KKworICBib29sIGhhc19ieXRlc19y
ZWFkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTRdOyB9CisgIHVpbnQ2NF90IGJ5dGVz
X3JlYWQoKSBjb25zdCB7IHJldHVybiBieXRlc19yZWFkXzsgfQorICB2b2lkIHNldF9ieXRlc19y
ZWFkKHVpbnQ2NF90IHZhbHVlKSB7IGJ5dGVzX3JlYWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxNCk7IH0KKworICBib29sIGhhc19wYWRkaW5nX2J5dGVzX3dyaXR0ZW4oKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1sxNV07IH0KKyAgdWludDY0X3QgcGFkZGluZ19ieXRlc193cml0dGVu
KCkgY29uc3QgeyByZXR1cm4gcGFkZGluZ19ieXRlc193cml0dGVuXzsgfQorICB2b2lkIHNldF9w
YWRkaW5nX2J5dGVzX3dyaXR0ZW4odWludDY0X3QgdmFsdWUpIHsgcGFkZGluZ19ieXRlc193cml0
dGVuXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTUpOyB9CisKKyAgYm9vbCBoYXNfcGFkZGlu
Z19ieXRlc19jbGVhcmVkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTZdOyB9CisgIHVp
bnQ2NF90IHBhZGRpbmdfYnl0ZXNfY2xlYXJlZCgpIGNvbnN0IHsgcmV0dXJuIHBhZGRpbmdfYnl0
ZXNfY2xlYXJlZF87IH0KKyAgdm9pZCBzZXRfcGFkZGluZ19ieXRlc19jbGVhcmVkKHVpbnQ2NF90
IHZhbHVlKSB7IHBhZGRpbmdfYnl0ZXNfY2xlYXJlZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0
KDE2KTsgfQorCisgIGJvb2wgaGFzX2NodW5rc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gX2hh
c19maWVsZF9bMl07IH0KKyAgdWludDY0X3QgY2h1bmtzX3dyaXR0ZW4oKSBjb25zdCB7IHJldHVy
biBjaHVua3Nfd3JpdHRlbl87IH0KKyAgdm9pZCBzZXRfY2h1bmtzX3dyaXR0ZW4odWludDY0X3Qg
dmFsdWUpIHsgY2h1bmtzX3dyaXR0ZW5fID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQor
CisgIGJvb2wgaGFzX2NodW5rc19yZXdyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1sxMF07IH0KKyAgdWludDY0X3QgY2h1bmtzX3Jld3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGNo
dW5rc19yZXdyaXR0ZW5fOyB9CisgIHZvaWQgc2V0X2NodW5rc19yZXdyaXR0ZW4odWludDY0X3Qg
dmFsdWUpIHsgY2h1bmtzX3Jld3JpdHRlbl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEwKTsg
fQorCisgIGJvb2wgaGFzX2NodW5rc19vdmVyd3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzNdOyB9CisgIHVpbnQ2NF90IGNodW5rc19vdmVyd3JpdHRlbigpIGNvbnN0IHsgcmV0
dXJuIGNodW5rc19vdmVyd3JpdHRlbl87IH0KKyAgdm9pZCBzZXRfY2h1bmtzX292ZXJ3cml0dGVu
KHVpbnQ2NF90IHZhbHVlKSB7IGNodW5rc19vdmVyd3JpdHRlbl8gPSB2YWx1ZTsgX2hhc19maWVs
ZF8uc2V0KDMpOyB9CisKKyAgYm9vbCBoYXNfY2h1bmtzX2Rpc2NhcmRlZCgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzE4XTsgfQorICB1aW50NjRfdCBjaHVua3NfZGlzY2FyZGVkKCkgY29u
c3QgeyByZXR1cm4gY2h1bmtzX2Rpc2NhcmRlZF87IH0KKyAgdm9pZCBzZXRfY2h1bmtzX2Rpc2Nh
cmRlZCh1aW50NjRfdCB2YWx1ZSkgeyBjaHVua3NfZGlzY2FyZGVkXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoMTgpOyB9CisKKyAgYm9vbCBoYXNfY2h1bmtzX3JlYWQoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1sxN107IH0KKyAgdWludDY0X3QgY2h1bmtzX3JlYWQoKSBjb25zdCB7IHJl
dHVybiBjaHVua3NfcmVhZF87IH0KKyAgdm9pZCBzZXRfY2h1bmtzX3JlYWQodWludDY0X3QgdmFs
dWUpIHsgY2h1bmtzX3JlYWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxNyk7IH0KKworICBi
b29sIGhhc19jaHVua3NfY29tbWl0dGVkX291dF9vZl9vcmRlcigpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzExXTsgfQorICB1aW50NjRfdCBjaHVua3NfY29tbWl0dGVkX291dF9vZl9vcmRl
cigpIGNvbnN0IHsgcmV0dXJuIGNodW5rc19jb21taXR0ZWRfb3V0X29mX29yZGVyXzsgfQorICB2
b2lkIHNldF9jaHVua3NfY29tbWl0dGVkX291dF9vZl9vcmRlcih1aW50NjRfdCB2YWx1ZSkgeyBj
aHVua3NfY29tbWl0dGVkX291dF9vZl9vcmRlcl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEx
KTsgfQorCisgIGJvb2wgaGFzX3dyaXRlX3dyYXBfY291bnQoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1s0XTsgfQorICB1aW50NjRfdCB3cml0ZV93cmFwX2NvdW50KCkgY29uc3QgeyByZXR1
cm4gd3JpdGVfd3JhcF9jb3VudF87IH0KKyAgdm9pZCBzZXRfd3JpdGVfd3JhcF9jb3VudCh1aW50
NjRfdCB2YWx1ZSkgeyB3cml0ZV93cmFwX2NvdW50XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
NCk7IH0KKworICBib29sIGhhc19wYXRjaGVzX3N1Y2NlZWRlZCgpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzVdOyB9CisgIHVpbnQ2NF90IHBhdGNoZXNfc3VjY2VlZGVkKCkgY29uc3QgeyBy
ZXR1cm4gcGF0Y2hlc19zdWNjZWVkZWRfOyB9CisgIHZvaWQgc2V0X3BhdGNoZXNfc3VjY2VlZGVk
KHVpbnQ2NF90IHZhbHVlKSB7IHBhdGNoZXNfc3VjY2VlZGVkXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoNSk7IH0KKworICBib29sIGhhc19wYXRjaGVzX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzZdOyB9CisgIHVpbnQ2NF90IHBhdGNoZXNfZmFpbGVkKCkgY29uc3QgeyBy
ZXR1cm4gcGF0Y2hlc19mYWlsZWRfOyB9CisgIHZvaWQgc2V0X3BhdGNoZXNfZmFpbGVkKHVpbnQ2
NF90IHZhbHVlKSB7IHBhdGNoZXNfZmFpbGVkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNik7
IH0KKworICBib29sIGhhc19yZWFkYWhlYWRzX3N1Y2NlZWRlZCgpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzddOyB9CisgIHVpbnQ2NF90IHJlYWRhaGVhZHNfc3VjY2VlZGVkKCkgY29uc3Qg
eyByZXR1cm4gcmVhZGFoZWFkc19zdWNjZWVkZWRfOyB9CisgIHZvaWQgc2V0X3JlYWRhaGVhZHNf
c3VjY2VlZGVkKHVpbnQ2NF90IHZhbHVlKSB7IHJlYWRhaGVhZHNfc3VjY2VlZGVkXyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoNyk7IH0KKworICBib29sIGhhc19yZWFkYWhlYWRzX2ZhaWxlZCgp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzhdOyB9CisgIHVpbnQ2NF90IHJlYWRhaGVhZHNf
ZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gcmVhZGFoZWFkc19mYWlsZWRfOyB9CisgIHZvaWQgc2V0
X3JlYWRhaGVhZHNfZmFpbGVkKHVpbnQ2NF90IHZhbHVlKSB7IHJlYWRhaGVhZHNfZmFpbGVkXyA9
IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoOCk7IH0KKworICBib29sIGhhc19hYmlfdmlvbGF0aW9u
cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzldOyB9CisgIHVpbnQ2NF90IGFiaV92aW9s
YXRpb25zKCkgY29uc3QgeyByZXR1cm4gYWJpX3Zpb2xhdGlvbnNfOyB9CisgIHZvaWQgc2V0X2Fi
aV92aW9sYXRpb25zKHVpbnQ2NF90IHZhbHVlKSB7IGFiaV92aW9sYXRpb25zXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoOSk7IH0KKworICBib29sIGhhc190cmFjZV93cml0ZXJfcGFja2V0X2xv
c3MoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxOV07IH0KKyAgdWludDY0X3QgdHJhY2Vf
d3JpdGVyX3BhY2tldF9sb3NzKCkgY29uc3QgeyByZXR1cm4gdHJhY2Vfd3JpdGVyX3BhY2tldF9s
b3NzXzsgfQorICB2b2lkIHNldF90cmFjZV93cml0ZXJfcGFja2V0X2xvc3ModWludDY0X3QgdmFs
dWUpIHsgdHJhY2Vfd3JpdGVyX3BhY2tldF9sb3NzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
MTkpOyB9CisKKyBwcml2YXRlOgorICB1aW50NjRfdCBidWZmZXJfc2l6ZV97fTsKKyAgdWludDY0
X3QgYnl0ZXNfd3JpdHRlbl97fTsKKyAgdWludDY0X3QgYnl0ZXNfb3ZlcndyaXR0ZW5fe307Cisg
IHVpbnQ2NF90IGJ5dGVzX3JlYWRfe307CisgIHVpbnQ2NF90IHBhZGRpbmdfYnl0ZXNfd3JpdHRl
bl97fTsKKyAgdWludDY0X3QgcGFkZGluZ19ieXRlc19jbGVhcmVkX3t9OworICB1aW50NjRfdCBj
aHVua3Nfd3JpdHRlbl97fTsKKyAgdWludDY0X3QgY2h1bmtzX3Jld3JpdHRlbl97fTsKKyAgdWlu
dDY0X3QgY2h1bmtzX292ZXJ3cml0dGVuX3t9OworICB1aW50NjRfdCBjaHVua3NfZGlzY2FyZGVk
X3t9OworICB1aW50NjRfdCBjaHVua3NfcmVhZF97fTsKKyAgdWludDY0X3QgY2h1bmtzX2NvbW1p
dHRlZF9vdXRfb2Zfb3JkZXJfe307CisgIHVpbnQ2NF90IHdyaXRlX3dyYXBfY291bnRfe307Cisg
IHVpbnQ2NF90IHBhdGNoZXNfc3VjY2VlZGVkX3t9OworICB1aW50NjRfdCBwYXRjaGVzX2ZhaWxl
ZF97fTsKKyAgdWludDY0X3QgcmVhZGFoZWFkc19zdWNjZWVkZWRfe307CisgIHVpbnQ2NF90IHJl
YWRhaGVhZHNfZmFpbGVkX3t9OworICB1aW50NjRfdCBhYmlfdmlvbGF0aW9uc197fTsKKyAgdWlu
dDY0X3QgdHJhY2Vfd3JpdGVyX3BhY2tldF9sb3NzX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVz
ZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRo
IGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25f
ZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyMD4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8v
IG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNw
YWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09N
TU9OX1RSQUNFX1NUQVRTX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0
ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5o
IgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdp
bgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGln
bm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNlX3N0YXRzLmdlbi5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworVHJh
Y2VTdGF0czo6VHJhY2VTdGF0cygpID0gZGVmYXVsdDsKK1RyYWNlU3RhdHM6On5UcmFjZVN0YXRz
KCkgPSBkZWZhdWx0OworVHJhY2VTdGF0czo6VHJhY2VTdGF0cyhjb25zdCBUcmFjZVN0YXRzJikg
PSBkZWZhdWx0OworVHJhY2VTdGF0cyYgVHJhY2VTdGF0czo6b3BlcmF0b3I9KGNvbnN0IFRyYWNl
U3RhdHMmKSA9IGRlZmF1bHQ7CitUcmFjZVN0YXRzOjpUcmFjZVN0YXRzKFRyYWNlU3RhdHMmJikg
bm9leGNlcHQgPSBkZWZhdWx0OworVHJhY2VTdGF0cyYgVHJhY2VTdGF0czo6b3BlcmF0b3I9KFRy
YWNlU3RhdHMmJikgPSBkZWZhdWx0OworCitib29sIFRyYWNlU3RhdHM6Om9wZXJhdG9yPT0oY29u
c3QgVHJhY2VTdGF0cyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9
PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGJ1ZmZlcl9zdGF0c18gPT0gb3RoZXIuYnVm
ZmVyX3N0YXRzXworICAgJiYgcHJvZHVjZXJzX2Nvbm5lY3RlZF8gPT0gb3RoZXIucHJvZHVjZXJz
X2Nvbm5lY3RlZF8KKyAgICYmIHByb2R1Y2Vyc19zZWVuXyA9PSBvdGhlci5wcm9kdWNlcnNfc2Vl
bl8KKyAgICYmIGRhdGFfc291cmNlc19yZWdpc3RlcmVkXyA9PSBvdGhlci5kYXRhX3NvdXJjZXNf
cmVnaXN0ZXJlZF8KKyAgICYmIGRhdGFfc291cmNlc19zZWVuXyA9PSBvdGhlci5kYXRhX3NvdXJj
ZXNfc2Vlbl8KKyAgICYmIHRyYWNpbmdfc2Vzc2lvbnNfID09IG90aGVyLnRyYWNpbmdfc2Vzc2lv
bnNfCisgICAmJiB0b3RhbF9idWZmZXJzXyA9PSBvdGhlci50b3RhbF9idWZmZXJzXworICAgJiYg
Y2h1bmtzX2Rpc2NhcmRlZF8gPT0gb3RoZXIuY2h1bmtzX2Rpc2NhcmRlZF8KKyAgICYmIHBhdGNo
ZXNfZGlzY2FyZGVkXyA9PSBvdGhlci5wYXRjaGVzX2Rpc2NhcmRlZF8KKyAgICYmIGludmFsaWRf
cGFja2V0c18gPT0gb3RoZXIuaW52YWxpZF9wYWNrZXRzXzsKK30KKworYm9vbCBUcmFjZVN0YXRz
OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIGJ1ZmZl
cl9zdGF0c18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFj
a2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3
LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxp
ZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hh
c19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7Cisg
ICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGJ1ZmZlcl9z
dGF0cyAqLzoKKyAgICAgICAgYnVmZmVyX3N0YXRzXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAg
YnVmZmVyX3N0YXRzXy5iYWNrKCkuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmco
KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIHByb2R1Y2Vyc19jb25uZWN0ZWQg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmcHJvZHVjZXJzX2Nvbm5lY3RlZF8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgMyAvKiBwcm9kdWNlcnNfc2VlbiAqLzoKKyAgICAgICAgZmllbGQu
Z2V0KCZwcm9kdWNlcnNfc2Vlbl8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBk
YXRhX3NvdXJjZXNfcmVnaXN0ZXJlZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkYXRhX3NvdXJj
ZXNfcmVnaXN0ZXJlZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBkYXRhX3Nv
dXJjZXNfc2VlbiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkYXRhX3NvdXJjZXNfc2Vlbl8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAvKiB0cmFjaW5nX3Nlc3Npb25zICovOgorICAg
ICAgICBmaWVsZC5nZXQoJnRyYWNpbmdfc2Vzc2lvbnNfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDcgLyogdG90YWxfYnVmZmVycyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0b3RhbF9i
dWZmZXJzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIGNodW5rc19kaXNjYXJk
ZWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmY2h1bmtzX2Rpc2NhcmRlZF8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgOSAvKiBwYXRjaGVzX2Rpc2NhcmRlZCAqLzoKKyAgICAgICAgZmll
bGQuZ2V0KCZwYXRjaGVzX2Rpc2NhcmRlZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
MTAgLyogaW52YWxpZF9wYWNrZXRzICovOgorICAgICAgICBmaWVsZC5nZXQoJmludmFsaWRfcGFj
a2V0c18pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNl
cmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAg
ICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9
CisKK3N0ZDo6c3RyaW5nIFRyYWNlU3RhdHM6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7
Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNlU3RhdHM6OlNlcmlhbGl6ZUFzQXJyYXko
KSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3Nh
Z2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXpl
QXNBcnJheSgpOworfQorCit2b2lkIFRyYWNlU3RhdHM6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGJ1ZmZlcl9zdGF0cworICBmb3Ig
KGF1dG8mIGl0IDogYnVmZmVyX3N0YXRzXykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2lu
TmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMSkpOworICB9CisKKyAgLy8gRmll
bGQgMjogcHJvZHVjZXJzX2Nvbm5lY3RlZAorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBt
c2ctPkFwcGVuZFZhckludCgyLCBwcm9kdWNlcnNfY29ubmVjdGVkXyk7CisgIH0KKworICAvLyBG
aWVsZCAzOiBwcm9kdWNlcnNfc2VlbgorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCgzLCBwcm9kdWNlcnNfc2Vlbl8pOworICB9CisKKyAgLy8gRmllbGQgNDog
ZGF0YV9zb3VyY2VzX3JlZ2lzdGVyZWQKKyAgaWYgKF9oYXNfZmllbGRfWzRdKSB7CisgICAgbXNn
LT5BcHBlbmRWYXJJbnQoNCwgZGF0YV9zb3VyY2VzX3JlZ2lzdGVyZWRfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDU6IGRhdGFfc291cmNlc19zZWVuCisgIGlmIChfaGFzX2ZpZWxkX1s1XSkgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDUsIGRhdGFfc291cmNlc19zZWVuXyk7CisgIH0KKworICAvLyBG
aWVsZCA2OiB0cmFjaW5nX3Nlc3Npb25zCisgIGlmIChfaGFzX2ZpZWxkX1s2XSkgeworICAgIG1z
Zy0+QXBwZW5kVmFySW50KDYsIHRyYWNpbmdfc2Vzc2lvbnNfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDc6IHRvdGFsX2J1ZmZlcnMKKyAgaWYgKF9oYXNfZmllbGRfWzddKSB7CisgICAgbXNnLT5BcHBl
bmRWYXJJbnQoNywgdG90YWxfYnVmZmVyc18pOworICB9CisKKyAgLy8gRmllbGQgODogY2h1bmtz
X2Rpc2NhcmRlZAorICBpZiAoX2hhc19maWVsZF9bOF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCg4LCBjaHVua3NfZGlzY2FyZGVkXyk7CisgIH0KKworICAvLyBGaWVsZCA5OiBwYXRjaGVzX2Rp
c2NhcmRlZAorICBpZiAoX2hhc19maWVsZF9bOV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg5
LCBwYXRjaGVzX2Rpc2NhcmRlZF8pOworICB9CisKKyAgLy8gRmllbGQgMTA6IGludmFsaWRfcGFj
a2V0cworICBpZiAoX2hhc19maWVsZF9bMTBdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTAs
IGludmFsaWRfcGFja2V0c18pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVu
a25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK1Ry
YWNlU3RhdHNfQnVmZmVyU3RhdHM6OlRyYWNlU3RhdHNfQnVmZmVyU3RhdHMoKSA9IGRlZmF1bHQ7
CitUcmFjZVN0YXRzX0J1ZmZlclN0YXRzOjp+VHJhY2VTdGF0c19CdWZmZXJTdGF0cygpID0gZGVm
YXVsdDsKK1RyYWNlU3RhdHNfQnVmZmVyU3RhdHM6OlRyYWNlU3RhdHNfQnVmZmVyU3RhdHMoY29u
c3QgVHJhY2VTdGF0c19CdWZmZXJTdGF0cyYpID0gZGVmYXVsdDsKK1RyYWNlU3RhdHNfQnVmZmVy
U3RhdHMmIFRyYWNlU3RhdHNfQnVmZmVyU3RhdHM6Om9wZXJhdG9yPShjb25zdCBUcmFjZVN0YXRz
X0J1ZmZlclN0YXRzJikgPSBkZWZhdWx0OworVHJhY2VTdGF0c19CdWZmZXJTdGF0czo6VHJhY2VT
dGF0c19CdWZmZXJTdGF0cyhUcmFjZVN0YXRzX0J1ZmZlclN0YXRzJiYpIG5vZXhjZXB0ID0gZGVm
YXVsdDsKK1RyYWNlU3RhdHNfQnVmZmVyU3RhdHMmIFRyYWNlU3RhdHNfQnVmZmVyU3RhdHM6Om9w
ZXJhdG9yPShUcmFjZVN0YXRzX0J1ZmZlclN0YXRzJiYpID0gZGVmYXVsdDsKKworYm9vbCBUcmFj
ZVN0YXRzX0J1ZmZlclN0YXRzOjpvcGVyYXRvcj09KGNvbnN0IFRyYWNlU3RhdHNfQnVmZmVyU3Rh
dHMmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5r
bm93bl9maWVsZHNfCisgICAmJiBidWZmZXJfc2l6ZV8gPT0gb3RoZXIuYnVmZmVyX3NpemVfCisg
ICAmJiBieXRlc193cml0dGVuXyA9PSBvdGhlci5ieXRlc193cml0dGVuXworICAgJiYgYnl0ZXNf
b3ZlcndyaXR0ZW5fID09IG90aGVyLmJ5dGVzX292ZXJ3cml0dGVuXworICAgJiYgYnl0ZXNfcmVh
ZF8gPT0gb3RoZXIuYnl0ZXNfcmVhZF8KKyAgICYmIHBhZGRpbmdfYnl0ZXNfd3JpdHRlbl8gPT0g
b3RoZXIucGFkZGluZ19ieXRlc193cml0dGVuXworICAgJiYgcGFkZGluZ19ieXRlc19jbGVhcmVk
XyA9PSBvdGhlci5wYWRkaW5nX2J5dGVzX2NsZWFyZWRfCisgICAmJiBjaHVua3Nfd3JpdHRlbl8g
PT0gb3RoZXIuY2h1bmtzX3dyaXR0ZW5fCisgICAmJiBjaHVua3NfcmV3cml0dGVuXyA9PSBvdGhl
ci5jaHVua3NfcmV3cml0dGVuXworICAgJiYgY2h1bmtzX292ZXJ3cml0dGVuXyA9PSBvdGhlci5j
aHVua3Nfb3ZlcndyaXR0ZW5fCisgICAmJiBjaHVua3NfZGlzY2FyZGVkXyA9PSBvdGhlci5jaHVu
a3NfZGlzY2FyZGVkXworICAgJiYgY2h1bmtzX3JlYWRfID09IG90aGVyLmNodW5rc19yZWFkXwor
ICAgJiYgY2h1bmtzX2NvbW1pdHRlZF9vdXRfb2Zfb3JkZXJfID09IG90aGVyLmNodW5rc19jb21t
aXR0ZWRfb3V0X29mX29yZGVyXworICAgJiYgd3JpdGVfd3JhcF9jb3VudF8gPT0gb3RoZXIud3Jp
dGVfd3JhcF9jb3VudF8KKyAgICYmIHBhdGNoZXNfc3VjY2VlZGVkXyA9PSBvdGhlci5wYXRjaGVz
X3N1Y2NlZWRlZF8KKyAgICYmIHBhdGNoZXNfZmFpbGVkXyA9PSBvdGhlci5wYXRjaGVzX2ZhaWxl
ZF8KKyAgICYmIHJlYWRhaGVhZHNfc3VjY2VlZGVkXyA9PSBvdGhlci5yZWFkYWhlYWRzX3N1Y2Nl
ZWRlZF8KKyAgICYmIHJlYWRhaGVhZHNfZmFpbGVkXyA9PSBvdGhlci5yZWFkYWhlYWRzX2ZhaWxl
ZF8KKyAgICYmIGFiaV92aW9sYXRpb25zXyA9PSBvdGhlci5hYmlfdmlvbGF0aW9uc18KKyAgICYm
IHRyYWNlX3dyaXRlcl9wYWNrZXRfbG9zc18gPT0gb3RoZXIudHJhY2Vfd3JpdGVyX3BhY2tldF9s
b3NzXzsKK30KKworYm9vbCBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzOjpQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigp
OworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0Rl
Y29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQo
KTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmll
bGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZp
ZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2Ug
MTIgLyogYnVmZmVyX3NpemUgKi86CisgICAgICAgIGZpZWxkLmdldCgmYnVmZmVyX3NpemVfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgLyogYnl0ZXNfd3JpdHRlbiAqLzoKKyAgICAg
ICAgZmllbGQuZ2V0KCZieXRlc193cml0dGVuXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAxMyAvKiBieXRlc19vdmVyd3JpdHRlbiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZieXRlc19v
dmVyd3JpdHRlbl8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTQgLyogYnl0ZXNfcmVh
ZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZieXRlc19yZWFkXyk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgY2FzZSAxNSAvKiBwYWRkaW5nX2J5dGVzX3dyaXR0ZW4gKi86CisgICAgICAgIGZpZWxk
LmdldCgmcGFkZGluZ19ieXRlc193cml0dGVuXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAxNiAvKiBwYWRkaW5nX2J5dGVzX2NsZWFyZWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmcGFk
ZGluZ19ieXRlc19jbGVhcmVkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIGNo
dW5rc193cml0dGVuICovOgorICAgICAgICBmaWVsZC5nZXQoJmNodW5rc193cml0dGVuXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMCAvKiBjaHVua3NfcmV3cml0dGVuICovOgorICAg
ICAgICBmaWVsZC5nZXQoJmNodW5rc19yZXdyaXR0ZW5fKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDMgLyogY2h1bmtzX292ZXJ3cml0dGVuICovOgorICAgICAgICBmaWVsZC5nZXQoJmNo
dW5rc19vdmVyd3JpdHRlbl8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTggLyogY2h1
bmtzX2Rpc2NhcmRlZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZjaHVua3NfZGlzY2FyZGVkXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNyAvKiBjaHVua3NfcmVhZCAqLzoKKyAgICAg
ICAgZmllbGQuZ2V0KCZjaHVua3NfcmVhZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
MTEgLyogY2h1bmtzX2NvbW1pdHRlZF9vdXRfb2Zfb3JkZXIgKi86CisgICAgICAgIGZpZWxkLmdl
dCgmY2h1bmtzX2NvbW1pdHRlZF9vdXRfb2Zfb3JkZXJfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDQgLyogd3JpdGVfd3JhcF9jb3VudCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ3cml0
ZV93cmFwX2NvdW50Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1IC8qIHBhdGNoZXNf
c3VjY2VlZGVkICovOgorICAgICAgICBmaWVsZC5nZXQoJnBhdGNoZXNfc3VjY2VlZGVkXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8qIHBhdGNoZXNfZmFpbGVkICovOgorICAgICAg
ICBmaWVsZC5nZXQoJnBhdGNoZXNfZmFpbGVkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSA3IC8qIHJlYWRhaGVhZHNfc3VjY2VlZGVkICovOgorICAgICAgICBmaWVsZC5nZXQoJnJlYWRh
aGVhZHNfc3VjY2VlZGVkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIHJlYWRh
aGVhZHNfZmFpbGVkICovOgorICAgICAgICBmaWVsZC5nZXQoJnJlYWRhaGVhZHNfZmFpbGVkXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5IC8qIGFiaV92aW9sYXRpb25zICovOgorICAg
ICAgICBmaWVsZC5nZXQoJmFiaV92aW9sYXRpb25zXyk7CisgICAgICAgIGJyZWFrOworICAgICAg
Y2FzZSAxOSAvKiB0cmFjZV93cml0ZXJfcGFja2V0X2xvc3MgKi86CisgICAgICAgIGZpZWxkLmdl
dCgmdHJhY2Vfd3JpdGVyX3BhY2tldF9sb3NzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVm
YXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRz
Xyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAm
JiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2VTdGF0c19CdWZmZXJT
dGF0czo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVm
ZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7
CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWlu
dDhfdD4gVHJhY2VTdGF0c19CdWZmZXJTdGF0czo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsK
KyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOwor
ICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7
Cit9CisKK3ZvaWQgVHJhY2VTdGF0c19CdWZmZXJTdGF0czo6U2VyaWFsaXplKDo6cHJvdG96ZXJv
OjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTI6IGJ1ZmZlcl9zaXplCisgIGlm
IChfaGFzX2ZpZWxkX1sxMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMiwgYnVmZmVyX3Np
emVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDE6IGJ5dGVzX3dyaXR0ZW4KKyAgaWYgKF9oYXNfZmll
bGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgYnl0ZXNfd3JpdHRlbl8pOworICB9
CisKKyAgLy8gRmllbGQgMTM6IGJ5dGVzX292ZXJ3cml0dGVuCisgIGlmIChfaGFzX2ZpZWxkX1sx
M10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMywgYnl0ZXNfb3ZlcndyaXR0ZW5fKTsKKyAg
fQorCisgIC8vIEZpZWxkIDE0OiBieXRlc19yZWFkCisgIGlmIChfaGFzX2ZpZWxkX1sxNF0pIHsK
KyAgICBtc2ctPkFwcGVuZFZhckludCgxNCwgYnl0ZXNfcmVhZF8pOworICB9CisKKyAgLy8gRmll
bGQgMTU6IHBhZGRpbmdfYnl0ZXNfd3JpdHRlbgorICBpZiAoX2hhc19maWVsZF9bMTVdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMTUsIHBhZGRpbmdfYnl0ZXNfd3JpdHRlbl8pOworICB9CisK
KyAgLy8gRmllbGQgMTY6IHBhZGRpbmdfYnl0ZXNfY2xlYXJlZAorICBpZiAoX2hhc19maWVsZF9b
MTZdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTYsIHBhZGRpbmdfYnl0ZXNfY2xlYXJlZF8p
OworICB9CisKKyAgLy8gRmllbGQgMjogY2h1bmtzX3dyaXR0ZW4KKyAgaWYgKF9oYXNfZmllbGRf
WzJdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgY2h1bmtzX3dyaXR0ZW5fKTsKKyAgfQor
CisgIC8vIEZpZWxkIDEwOiBjaHVua3NfcmV3cml0dGVuCisgIGlmIChfaGFzX2ZpZWxkX1sxMF0p
IHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMCwgY2h1bmtzX3Jld3JpdHRlbl8pOworICB9CisK
KyAgLy8gRmllbGQgMzogY2h1bmtzX292ZXJ3cml0dGVuCisgIGlmIChfaGFzX2ZpZWxkX1szXSkg
eworICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIGNodW5rc19vdmVyd3JpdHRlbl8pOworICB9CisK
KyAgLy8gRmllbGQgMTg6IGNodW5rc19kaXNjYXJkZWQKKyAgaWYgKF9oYXNfZmllbGRfWzE4XSkg
eworICAgIG1zZy0+QXBwZW5kVmFySW50KDE4LCBjaHVua3NfZGlzY2FyZGVkXyk7CisgIH0KKwor
ICAvLyBGaWVsZCAxNzogY2h1bmtzX3JlYWQKKyAgaWYgKF9oYXNfZmllbGRfWzE3XSkgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDE3LCBjaHVua3NfcmVhZF8pOworICB9CisKKyAgLy8gRmllbGQg
MTE6IGNodW5rc19jb21taXR0ZWRfb3V0X29mX29yZGVyCisgIGlmIChfaGFzX2ZpZWxkX1sxMV0p
IHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMSwgY2h1bmtzX2NvbW1pdHRlZF9vdXRfb2Zfb3Jk
ZXJfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IHdyaXRlX3dyYXBfY291bnQKKyAgaWYgKF9oYXNf
ZmllbGRfWzRdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNCwgd3JpdGVfd3JhcF9jb3VudF8p
OworICB9CisKKyAgLy8gRmllbGQgNTogcGF0Y2hlc19zdWNjZWVkZWQKKyAgaWYgKF9oYXNfZmll
bGRfWzVdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNSwgcGF0Y2hlc19zdWNjZWVkZWRfKTsK
KyAgfQorCisgIC8vIEZpZWxkIDY6IHBhdGNoZXNfZmFpbGVkCisgIGlmIChfaGFzX2ZpZWxkX1s2
XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDYsIHBhdGNoZXNfZmFpbGVkXyk7CisgIH0KKwor
ICAvLyBGaWVsZCA3OiByZWFkYWhlYWRzX3N1Y2NlZWRlZAorICBpZiAoX2hhc19maWVsZF9bN10p
IHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg3LCByZWFkYWhlYWRzX3N1Y2NlZWRlZF8pOworICB9
CisKKyAgLy8gRmllbGQgODogcmVhZGFoZWFkc19mYWlsZWQKKyAgaWYgKF9oYXNfZmllbGRfWzhd
KSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoOCwgcmVhZGFoZWFkc19mYWlsZWRfKTsKKyAgfQor
CisgIC8vIEZpZWxkIDk6IGFiaV92aW9sYXRpb25zCisgIGlmIChfaGFzX2ZpZWxkX1s5XSkgewor
ICAgIG1zZy0+QXBwZW5kVmFySW50KDksIGFiaV92aW9sYXRpb25zXyk7CisgIH0KKworICAvLyBG
aWVsZCAxOTogdHJhY2Vfd3JpdGVyX3BhY2tldF9sb3NzCisgIGlmIChfaGFzX2ZpZWxkX1sxOV0p
IHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxOSwgdHJhY2Vfd3JpdGVyX3BhY2tldF9sb3NzXyk7
CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEo
KSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0
bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBH
Q0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9w
cm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNpbmdfc2VydmljZV9jYXBhYmlsaXRpZXMuZ2VuLmNj
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2Nv
bW1vbi90cmFjaW5nX3NlcnZpY2VfY2FwYWJpbGl0aWVzLmdlbi5oCisvLyBETyBOT1QgRURJVC4g
QXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1RSQUNJTkdfU0VSVklDRV9DQVBBQklMSVRJ
RVNfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
Q09NTU9OX1RSQUNJTkdfU0VSVklDRV9DQVBBQklMSVRJRVNfUFJPVE9fQ1BQX0hfCisKKyNpbmNs
dWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2lu
Y2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29i
ai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25h
bWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBUcmFjaW5nU2VydmljZUNh
cGFiaWxpdGllczsKK2VudW0gT2JzZXJ2YWJsZUV2ZW50c19UeXBlIDogaW50OworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2Ug
Z2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVz
cGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mg
eworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFjaW5nU2Vydmlj
ZUNhcGFiaWxpdGllcyA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVi
bGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0hhc1F1ZXJ5Q2FwYWJpbGl0aWVzRmll
bGROdW1iZXIgPSAxLAorICAgIGtPYnNlcnZhYmxlRXZlbnRzRmllbGROdW1iZXIgPSAyLAorICAg
IGtIYXNUcmFjZUNvbmZpZ091dHB1dFBhdGhGaWVsZE51bWJlciA9IDMsCisgIH07CisKKyAgVHJh
Y2luZ1NlcnZpY2VDYXBhYmlsaXRpZXMoKTsKKyAgflRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVz
KCkgb3ZlcnJpZGU7CisgIFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzKFRyYWNpbmdTZXJ2aWNl
Q2FwYWJpbGl0aWVzJiYpIG5vZXhjZXB0OworICBUcmFjaW5nU2VydmljZUNhcGFiaWxpdGllcyYg
b3BlcmF0b3I9KFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzJiYpOworICBUcmFjaW5nU2Vydmlj
ZUNhcGFiaWxpdGllcyhjb25zdCBUcmFjaW5nU2VydmljZUNhcGFiaWxpdGllcyYpOworICBUcmFj
aW5nU2VydmljZUNhcGFiaWxpdGllcyYgb3BlcmF0b3I9KGNvbnN0IFRyYWNpbmdTZXJ2aWNlQ2Fw
YWJpbGl0aWVzJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjaW5nU2VydmljZUNhcGFi
aWxpdGllcyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2luZ1NlcnZpY2VD
YXBhYmlsaXRpZXMmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQor
CisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7Cisg
IHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9p
ZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19o
YXNfcXVlcnlfY2FwYWJpbGl0aWVzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0K
KyAgYm9vbCBoYXNfcXVlcnlfY2FwYWJpbGl0aWVzKCkgY29uc3QgeyByZXR1cm4gaGFzX3F1ZXJ5
X2NhcGFiaWxpdGllc187IH0KKyAgdm9pZCBzZXRfaGFzX3F1ZXJ5X2NhcGFiaWxpdGllcyhib29s
IHZhbHVlKSB7IGhhc19xdWVyeV9jYXBhYmlsaXRpZXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxKTsgfQorCisgIGludCBvYnNlcnZhYmxlX2V2ZW50c19zaXplKCkgY29uc3QgeyByZXR1cm4g
c3RhdGljX2Nhc3Q8aW50PihvYnNlcnZhYmxlX2V2ZW50c18uc2l6ZSgpKTsgfQorICBjb25zdCBz
dGQ6OnZlY3RvcjxPYnNlcnZhYmxlRXZlbnRzX1R5cGU+JiBvYnNlcnZhYmxlX2V2ZW50cygpIGNv
bnN0IHsgcmV0dXJuIG9ic2VydmFibGVfZXZlbnRzXzsgfQorICBzdGQ6OnZlY3RvcjxPYnNlcnZh
YmxlRXZlbnRzX1R5cGU+KiBtdXRhYmxlX29ic2VydmFibGVfZXZlbnRzKCkgeyByZXR1cm4gJm9i
c2VydmFibGVfZXZlbnRzXzsgfQorICB2b2lkIGNsZWFyX29ic2VydmFibGVfZXZlbnRzKCkgeyBv
YnNlcnZhYmxlX2V2ZW50c18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9vYnNlcnZhYmxlX2V2ZW50
cyhPYnNlcnZhYmxlRXZlbnRzX1R5cGUgdmFsdWUpIHsgb2JzZXJ2YWJsZV9ldmVudHNfLmVtcGxh
Y2VfYmFjayh2YWx1ZSk7IH0KKyAgT2JzZXJ2YWJsZUV2ZW50c19UeXBlKiBhZGRfb2JzZXJ2YWJs
ZV9ldmVudHMoKSB7IG9ic2VydmFibGVfZXZlbnRzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZv
YnNlcnZhYmxlX2V2ZW50c18uYmFjaygpOyB9CisKKyAgYm9vbCBoYXNfaGFzX3RyYWNlX2NvbmZp
Z19vdXRwdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGJvb2wg
aGFzX3RyYWNlX2NvbmZpZ19vdXRwdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIGhhc190cmFjZV9j
b25maWdfb3V0cHV0X3BhdGhfOyB9CisgIHZvaWQgc2V0X2hhc190cmFjZV9jb25maWdfb3V0cHV0
X3BhdGgoYm9vbCB2YWx1ZSkgeyBoYXNfdHJhY2VfY29uZmlnX291dHB1dF9wYXRoXyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworIHByaXZhdGU6CisgIGJvb2wgaGFzX3F1ZXJ5X2Nh
cGFiaWxpdGllc197fTsKKyAgc3RkOjp2ZWN0b3I8T2JzZXJ2YWJsZUV2ZW50c19UeXBlPiBvYnNl
cnZhYmxlX2V2ZW50c187CisgIGJvb2wgaGFzX3RyYWNlX2NvbmZpZ19vdXRwdXRfcGF0aF97fTsK
KworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNv
bXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgor
ICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8ND4gX2hhc19m
aWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNl
IHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1RSQUNJTkdfU0VSVklDRV9DQVBBQklMSVRJRVNfUFJP
VE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90
b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4g
QXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFn
bm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVh
bCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0
by9jb21tb24vdHJhY2luZ19zZXJ2aWNlX2NhcGFiaWxpdGllcy5nZW4uaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24vb2JzZXJ2
YWJsZV9ldmVudHMuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJv
dG9zIHsKK25hbWVzcGFjZSBnZW4geworCitUcmFjaW5nU2VydmljZUNhcGFiaWxpdGllczo6VHJh
Y2luZ1NlcnZpY2VDYXBhYmlsaXRpZXMoKSA9IGRlZmF1bHQ7CitUcmFjaW5nU2VydmljZUNhcGFi
aWxpdGllczo6flRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzKCkgPSBkZWZhdWx0OworVHJhY2lu
Z1NlcnZpY2VDYXBhYmlsaXRpZXM6OlRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzKGNvbnN0IFRy
YWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzJikgPSBkZWZhdWx0OworVHJhY2luZ1NlcnZpY2VDYXBh
YmlsaXRpZXMmIFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzOjpvcGVyYXRvcj0oY29uc3QgVHJh
Y2luZ1NlcnZpY2VDYXBhYmlsaXRpZXMmKSA9IGRlZmF1bHQ7CitUcmFjaW5nU2VydmljZUNhcGFi
aWxpdGllczo6VHJhY2luZ1NlcnZpY2VDYXBhYmlsaXRpZXMoVHJhY2luZ1NlcnZpY2VDYXBhYmls
aXRpZXMmJikgbm9leGNlcHQgPSBkZWZhdWx0OworVHJhY2luZ1NlcnZpY2VDYXBhYmlsaXRpZXMm
IFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzOjpvcGVyYXRvcj0oVHJhY2luZ1NlcnZpY2VDYXBh
YmlsaXRpZXMmJikgPSBkZWZhdWx0OworCitib29sIFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVz
OjpvcGVyYXRvcj09KGNvbnN0IFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzJiBvdGhlcikgY29u
c3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXwor
ICAgJiYgaGFzX3F1ZXJ5X2NhcGFiaWxpdGllc18gPT0gb3RoZXIuaGFzX3F1ZXJ5X2NhcGFiaWxp
dGllc18KKyAgICYmIG9ic2VydmFibGVfZXZlbnRzXyA9PSBvdGhlci5vYnNlcnZhYmxlX2V2ZW50
c18KKyAgICYmIGhhc190cmFjZV9jb25maWdfb3V0cHV0X3BhdGhfID09IG90aGVyLmhhc190cmFj
ZV9jb25maWdfb3V0cHV0X3BhdGhfOworfQorCitib29sIFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0
aWVzOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIG9i
c2VydmFibGVfZXZlbnRzXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAg
Ym9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVy
IGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZp
ZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlk
KCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5p
ZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyog
aGFzX3F1ZXJ5X2NhcGFiaWxpdGllcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZoYXNfcXVlcnlf
Y2FwYWJpbGl0aWVzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIG9ic2VydmFi
bGVfZXZlbnRzICovOgorICAgICAgICBvYnNlcnZhYmxlX2V2ZW50c18uZW1wbGFjZV9iYWNrKCk7
CisgICAgICAgIGZpZWxkLmdldCgmb2JzZXJ2YWJsZV9ldmVudHNfLmJhY2soKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAzIC8qIGhhc190cmFjZV9jb25maWdfb3V0cHV0X3BhdGggKi86
CisgICAgICAgIGZpZWxkLmdldCgmaGFzX3RyYWNlX2NvbmZpZ19vdXRwdXRfcGF0aF8pOworICAg
ICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFw
cGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAg
cmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3Ry
aW5nIFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0
IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNn
OworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmlu
ZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBUcmFjaW5nU2VydmljZUNhcGFiaWxpdGll
czo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJl
ZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAg
cmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VD
YXBhYmlsaXRpZXM6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7
CisgIC8vIEZpZWxkIDE6IGhhc19xdWVyeV9jYXBhYmlsaXRpZXMKKyAgaWYgKF9oYXNfZmllbGRf
WzFdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDEsIGhhc19xdWVyeV9jYXBhYmlsaXRp
ZXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IG9ic2VydmFibGVfZXZlbnRzCisgIGZvciAoYXV0
byYgaXQgOiBvYnNlcnZhYmxlX2V2ZW50c18pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBp
dCk7CisgIH0KKworICAvLyBGaWVsZCAzOiBoYXNfdHJhY2VfY29uZmlnX291dHB1dF9wYXRoCisg
IGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgzLCBoYXNf
dHJhY2VfY29uZmlnX291dHB1dF9wYXRoXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3Rv
Qnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9
CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAg
Ly8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNpbmdf
c2VydmljZV9zdGF0ZS5nZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdl
bi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNpbmdfc2VydmljZV9zdGF0ZS5nZW4uaAorLy8g
RE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lm
bmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9UUkFDSU5HX1NFUlZJ
Q0VfU1RBVEVfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVS
RkVUVE9fQ09NTU9OX1RSQUNJTkdfU0VSVklDRV9TVEFURV9QUk9UT19DUFBfSF8KKworI2luY2x1
ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5j
bHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2Jq
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIFRyYWNpbmdTZXJ2aWNlU3Rh
dGU7CitjbGFzcyBUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291
cmNlRGVzY3JpcHRvcjsKK2NsYXNzIFRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXI7Cit9ICAv
LyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVz
cGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOworfSAgLy8g
bmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHBy
b3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNpbmdT
ZXJ2aWNlU3RhdGUgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgdXNpbmcgUHJvZHVjZXIgPSBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyOworICB1
c2luZyBEYXRhU291cmNlID0gVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlOworICBlbnVt
IEZpZWxkTnVtYmVycyB7CisgICAga1Byb2R1Y2Vyc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrRGF0
YVNvdXJjZXNGaWVsZE51bWJlciA9IDIsCisgICAga051bVNlc3Npb25zRmllbGROdW1iZXIgPSAz
LAorICAgIGtOdW1TZXNzaW9uc1N0YXJ0ZWRGaWVsZE51bWJlciA9IDQsCisgIH07CisKKyAgVHJh
Y2luZ1NlcnZpY2VTdGF0ZSgpOworICB+VHJhY2luZ1NlcnZpY2VTdGF0ZSgpIG92ZXJyaWRlOwor
ICBUcmFjaW5nU2VydmljZVN0YXRlKFRyYWNpbmdTZXJ2aWNlU3RhdGUmJikgbm9leGNlcHQ7Cisg
IFRyYWNpbmdTZXJ2aWNlU3RhdGUmIG9wZXJhdG9yPShUcmFjaW5nU2VydmljZVN0YXRlJiYpOwor
ICBUcmFjaW5nU2VydmljZVN0YXRlKGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGUmKTsKKyAgVHJh
Y2luZ1NlcnZpY2VTdGF0ZSYgb3BlcmF0b3I9KGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGUmKTsK
KyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGUmKSBjb25zdDsKKyAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGUmIG90aGVyKSBjb25zdCB7
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3Ry
aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqKSBjb25zdDsKKworICBpbnQgcHJvZHVjZXJzX3NpemUoKSBjb25zdCB7IHJldHVybiBz
dGF0aWNfY2FzdDxpbnQ+KHByb2R1Y2Vyc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3Rv
cjxUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyPiYgcHJvZHVjZXJzKCkgY29uc3QgeyByZXR1
cm4gcHJvZHVjZXJzXzsgfQorICBzdGQ6OnZlY3RvcjxUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1
Y2VyPiogbXV0YWJsZV9wcm9kdWNlcnMoKSB7IHJldHVybiAmcHJvZHVjZXJzXzsgfQorICB2b2lk
IGNsZWFyX3Byb2R1Y2VycygpIHsgcHJvZHVjZXJzXy5jbGVhcigpOyB9CisgIFRyYWNpbmdTZXJ2
aWNlU3RhdGVfUHJvZHVjZXIqIGFkZF9wcm9kdWNlcnMoKSB7IHByb2R1Y2Vyc18uZW1wbGFjZV9i
YWNrKCk7IHJldHVybiAmcHJvZHVjZXJzXy5iYWNrKCk7IH0KKworICBpbnQgZGF0YV9zb3VyY2Vz
X3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRhdGFfc291cmNlc18uc2l6
ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3Vy
Y2U+JiBkYXRhX3NvdXJjZXMoKSBjb25zdCB7IHJldHVybiBkYXRhX3NvdXJjZXNfOyB9CisgIHN0
ZDo6dmVjdG9yPFRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZT4qIG11dGFibGVfZGF0YV9z
b3VyY2VzKCkgeyByZXR1cm4gJmRhdGFfc291cmNlc187IH0KKyAgdm9pZCBjbGVhcl9kYXRhX3Nv
dXJjZXMoKSB7IGRhdGFfc291cmNlc18uY2xlYXIoKTsgfQorICBUcmFjaW5nU2VydmljZVN0YXRl
X0RhdGFTb3VyY2UqIGFkZF9kYXRhX3NvdXJjZXMoKSB7IGRhdGFfc291cmNlc18uZW1wbGFjZV9i
YWNrKCk7IHJldHVybiAmZGF0YV9zb3VyY2VzXy5iYWNrKCk7IH0KKworICBib29sIGhhc19udW1f
c2Vzc2lvbnMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICBpbnQzMl90IG51
bV9zZXNzaW9ucygpIGNvbnN0IHsgcmV0dXJuIG51bV9zZXNzaW9uc187IH0KKyAgdm9pZCBzZXRf
bnVtX3Nlc3Npb25zKGludDMyX3QgdmFsdWUpIHsgbnVtX3Nlc3Npb25zXyA9IHZhbHVlOyBfaGFz
X2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29sIGhhc19udW1fc2Vzc2lvbnNfc3RhcnRlZCgpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIGludDMyX3QgbnVtX3Nlc3Npb25zX3N0
YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBudW1fc2Vzc2lvbnNfc3RhcnRlZF87IH0KKyAgdm9pZCBz
ZXRfbnVtX3Nlc3Npb25zX3N0YXJ0ZWQoaW50MzJfdCB2YWx1ZSkgeyBudW1fc2Vzc2lvbnNfc3Rh
cnRlZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6
OnZlY3RvcjxUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyPiBwcm9kdWNlcnNfOworICBzdGQ6
OnZlY3RvcjxUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2U+IGRhdGFfc291cmNlc187Cisg
IGludDMyX3QgbnVtX3Nlc3Npb25zX3t9OworICBpbnQzMl90IG51bV9zZXNzaW9uc19zdGFydGVk
X3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBm
b3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmls
ZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw1PiBf
aGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2luZ1NlcnZp
Y2VTdGF0ZV9EYXRhU291cmNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsK
KyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrRHNEZXNjcmlwdG9yRmllbGRO
dW1iZXIgPSAxLAorICAgIGtQcm9kdWNlcklkRmllbGROdW1iZXIgPSAyLAorICB9OworCisgIFRy
YWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZSgpOworICB+VHJhY2luZ1NlcnZpY2VTdGF0ZV9E
YXRhU291cmNlKCkgb3ZlcnJpZGU7CisgIFRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZShU
cmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2UmJikgbm9leGNlcHQ7CisgIFRyYWNpbmdTZXJ2
aWNlU3RhdGVfRGF0YVNvdXJjZSYgb3BlcmF0b3I9KFRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNv
dXJjZSYmKTsKKyAgVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlKGNvbnN0IFRyYWNpbmdT
ZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZSYpOworICBUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3Vy
Y2UmIG9wZXJhdG9yPShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2UmKTsKKyAg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZSYpIGNv
bnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291
cmNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29s
IFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0
cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1
aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFs
aXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfZHNfZGVzY3Jp
cHRvcigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIGNvbnN0IERhdGFTb3Vy
Y2VEZXNjcmlwdG9yJiBkc19kZXNjcmlwdG9yKCkgY29uc3QgeyByZXR1cm4gKmRzX2Rlc2NyaXB0
b3JfOyB9CisgIERhdGFTb3VyY2VEZXNjcmlwdG9yKiBtdXRhYmxlX2RzX2Rlc2NyaXB0b3IoKSB7
IF9oYXNfZmllbGRfLnNldCgxKTsgcmV0dXJuIGRzX2Rlc2NyaXB0b3JfLmdldCgpOyB9CisKKyAg
Ym9vbCBoYXNfcHJvZHVjZXJfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQor
ICBpbnQzMl90IHByb2R1Y2VyX2lkKCkgY29uc3QgeyByZXR1cm4gcHJvZHVjZXJfaWRfOyB9Cisg
IHZvaWQgc2V0X3Byb2R1Y2VyX2lkKGludDMyX3QgdmFsdWUpIHsgcHJvZHVjZXJfaWRfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToKKyAgOjpwcm90b3plcm86OkNv
cHlhYmxlUHRyPERhdGFTb3VyY2VEZXNjcmlwdG9yPiBkc19kZXNjcmlwdG9yXzsKKyAgaW50MzJf
dCBwcm9kdWNlcl9pZF97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90
b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMg
b2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3Rk
OjpiaXRzZXQ8Mz4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JU
IFRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1l
c3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtJZEZpZWxk
TnVtYmVyID0gMSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrVWlkRmllbGROdW1i
ZXIgPSAzLAorICB9OworCisgIFRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXIoKTsKKyAgflRy
YWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXIoKSBvdmVycmlkZTsKKyAgVHJhY2luZ1NlcnZpY2VT
dGF0ZV9Qcm9kdWNlcihUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJiYpIG5vZXhjZXB0Owor
ICBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJiBvcGVyYXRvcj0oVHJhY2luZ1NlcnZpY2VT
dGF0ZV9Qcm9kdWNlciYmKTsKKyAgVHJhY2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcihjb25zdCBU
cmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJik7CisgIFRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJv
ZHVjZXImIG9wZXJhdG9yPShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJik7Cisg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJikgY29u
c3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2Vy
JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmlu
ZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50
OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXpl
KDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfaWQoKSBjb25zdCB7
IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQzMl90IGlkKCkgY29uc3QgeyByZXR1cm4g
aWRfOyB9CisgIHZvaWQgc2V0X2lkKGludDMyX3QgdmFsdWUpIHsgaWRfID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1syXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IG5h
bWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX3VpZCgpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGludDMyX3QgdWlkKCkgY29uc3QgeyBy
ZXR1cm4gdWlkXzsgfQorICB2b2lkIHNldF91aWQoaW50MzJfdCB2YWx1ZSkgeyB1aWRfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBpZF97fTsK
KyAgc3RkOjpzdHJpbmcgbmFtZV97fTsKKyAgaW50MzJfdCB1aWRfe307CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDQ+IF9oYXNfZmllbGRfe307Cit9Owor
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8v
IG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTU1PTl9UUkFDSU5HX1NFUlZJQ0VfU1RBVEVfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1h
bGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi90cmFja19l
dmVudF9kZXNjcmlwdG9yLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQ
ZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVS
RkVUVE9fQ09NTU9OX1RSQUNLX0VWRU5UX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisjZGVmaW5l
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1RSQUNLX0VWRU5UX0RFU0NS
SVBUT1JfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRz
ZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBl
X3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdl
biB7CitjbGFzcyBUcmFja0V2ZW50RGVzY3JpcHRvcjsKK2NsYXNzIFRyYWNrRXZlbnRDYXRlZ29y
eTsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAg
Ly8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
VHJhY2tFdmVudERlc2NyaXB0b3IgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmog
eworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtBdmFpbGFibGVDYXRlZ29y
aWVzRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIFRyYWNrRXZlbnREZXNjcmlwdG9yKCk7Cisg
IH5UcmFja0V2ZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlOworICBUcmFja0V2ZW50RGVzY3JpcHRv
cihUcmFja0V2ZW50RGVzY3JpcHRvciYmKSBub2V4Y2VwdDsKKyAgVHJhY2tFdmVudERlc2NyaXB0
b3ImIG9wZXJhdG9yPShUcmFja0V2ZW50RGVzY3JpcHRvciYmKTsKKyAgVHJhY2tFdmVudERlc2Ny
aXB0b3IoY29uc3QgVHJhY2tFdmVudERlc2NyaXB0b3ImKTsKKyAgVHJhY2tFdmVudERlc2NyaXB0
b3ImIG9wZXJhdG9yPShjb25zdCBUcmFja0V2ZW50RGVzY3JpcHRvciYpOworICBib29sIG9wZXJh
dG9yPT0oY29uc3QgVHJhY2tFdmVudERlc2NyaXB0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IFRyYWNrRXZlbnREZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgq
dGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBz
aXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0
IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29u
c3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29u
c3Q7CisKKyAgaW50IGF2YWlsYWJsZV9jYXRlZ29yaWVzX3NpemUoKSBjb25zdCB7IHJldHVybiBz
dGF0aWNfY2FzdDxpbnQ+KGF2YWlsYWJsZV9jYXRlZ29yaWVzXy5zaXplKCkpOyB9CisgIGNvbnN0
IHN0ZDo6dmVjdG9yPFRyYWNrRXZlbnRDYXRlZ29yeT4mIGF2YWlsYWJsZV9jYXRlZ29yaWVzKCkg
Y29uc3QgeyByZXR1cm4gYXZhaWxhYmxlX2NhdGVnb3JpZXNfOyB9CisgIHN0ZDo6dmVjdG9yPFRy
YWNrRXZlbnRDYXRlZ29yeT4qIG11dGFibGVfYXZhaWxhYmxlX2NhdGVnb3JpZXMoKSB7IHJldHVy
biAmYXZhaWxhYmxlX2NhdGVnb3JpZXNfOyB9CisgIHZvaWQgY2xlYXJfYXZhaWxhYmxlX2NhdGVn
b3JpZXMoKSB7IGF2YWlsYWJsZV9jYXRlZ29yaWVzXy5jbGVhcigpOyB9CisgIFRyYWNrRXZlbnRD
YXRlZ29yeSogYWRkX2F2YWlsYWJsZV9jYXRlZ29yaWVzKCkgeyBhdmFpbGFibGVfY2F0ZWdvcmll
c18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmYXZhaWxhYmxlX2NhdGVnb3JpZXNfLmJhY2soKTsg
fQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8VHJhY2tFdmVudENhdGVnb3J5PiBhdmFpbGFi
bGVfY2F0ZWdvcmllc187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9i
dWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9m
IC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6
Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBU
cmFja0V2ZW50Q2F0ZWdvcnkgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogewor
IHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAx
LAorICAgIGtEZXNjcmlwdGlvbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrVGFnc0ZpZWxkTnVtYmVy
ID0gMywKKyAgfTsKKworICBUcmFja0V2ZW50Q2F0ZWdvcnkoKTsKKyAgflRyYWNrRXZlbnRDYXRl
Z29yeSgpIG92ZXJyaWRlOworICBUcmFja0V2ZW50Q2F0ZWdvcnkoVHJhY2tFdmVudENhdGVnb3J5
JiYpIG5vZXhjZXB0OworICBUcmFja0V2ZW50Q2F0ZWdvcnkmIG9wZXJhdG9yPShUcmFja0V2ZW50
Q2F0ZWdvcnkmJik7CisgIFRyYWNrRXZlbnRDYXRlZ29yeShjb25zdCBUcmFja0V2ZW50Q2F0ZWdv
cnkmKTsKKyAgVHJhY2tFdmVudENhdGVnb3J5JiBvcGVyYXRvcj0oY29uc3QgVHJhY2tFdmVudENh
dGVnb3J5Jik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFja0V2ZW50Q2F0ZWdvcnkmKSBj
b25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNrRXZlbnRDYXRlZ29yeSYgb3RoZXIp
IGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21B
cnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3Rv
emVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2Rl
c2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgY29uc3Qgc3Rk
OjpzdHJpbmcmIGRlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gZGVzY3JpcHRpb25fOyB9Cisg
IHZvaWQgc2V0X2Rlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBkZXNjcmlw
dGlvbl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgaW50IHRhZ3Nfc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGFnc18uc2l6ZSgpKTsgfQorICBjb25z
dCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRhZ3MoKSBjb25zdCB7IHJldHVybiB0YWdzXzsg
fQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfdGFncygpIHsgcmV0dXJuICZ0
YWdzXzsgfQorICB2b2lkIGNsZWFyX3RhZ3MoKSB7IHRhZ3NfLmNsZWFyKCk7IH0KKyAgdm9pZCBh
ZGRfdGFncyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyB0YWdzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9
CisgIHN0ZDo6c3RyaW5nKiBhZGRfdGFncygpIHsgdGFnc18uZW1wbGFjZV9iYWNrKCk7IHJldHVy
biAmdGFnc18uYmFjaygpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lX3t9Owor
ICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbl97fTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+
IHRhZ3NfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxk
cyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8g
ZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw0
PiBfaGFzX2ZpZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBu
YW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVU
VE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fVFJBQ0tfRVZFTlRfREVTQ1JJUFRPUl9Q
Uk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3By
b3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElU
LiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRp
YWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVx
dWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZl
dHRvL2NvbW1vbi90cmFjaW5nX3NlcnZpY2Vfc3RhdGUuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2RhdGFfc291cmNl
X2Rlc2NyaXB0b3IuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNrX2V2ZW50X2Rlc2NyaXB0b3IuZ2VuLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29t
bW9uL2dwdV9jb3VudGVyX2Rlc2NyaXB0b3IuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitUcmFjaW5nU2VydmljZVN0
YXRlOjpUcmFjaW5nU2VydmljZVN0YXRlKCkgPSBkZWZhdWx0OworVHJhY2luZ1NlcnZpY2VTdGF0
ZTo6flRyYWNpbmdTZXJ2aWNlU3RhdGUoKSA9IGRlZmF1bHQ7CitUcmFjaW5nU2VydmljZVN0YXRl
OjpUcmFjaW5nU2VydmljZVN0YXRlKGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGUmKSA9IGRlZmF1
bHQ7CitUcmFjaW5nU2VydmljZVN0YXRlJiBUcmFjaW5nU2VydmljZVN0YXRlOjpvcGVyYXRvcj0o
Y29uc3QgVHJhY2luZ1NlcnZpY2VTdGF0ZSYpID0gZGVmYXVsdDsKK1RyYWNpbmdTZXJ2aWNlU3Rh
dGU6OlRyYWNpbmdTZXJ2aWNlU3RhdGUoVHJhY2luZ1NlcnZpY2VTdGF0ZSYmKSBub2V4Y2VwdCA9
IGRlZmF1bHQ7CitUcmFjaW5nU2VydmljZVN0YXRlJiBUcmFjaW5nU2VydmljZVN0YXRlOjpvcGVy
YXRvcj0oVHJhY2luZ1NlcnZpY2VTdGF0ZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgVHJhY2luZ1Nl
cnZpY2VTdGF0ZTo6b3BlcmF0b3I9PShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlJiBvdGhlcikg
Y29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRz
XworICAgJiYgcHJvZHVjZXJzXyA9PSBvdGhlci5wcm9kdWNlcnNfCisgICAmJiBkYXRhX3NvdXJj
ZXNfID09IG90aGVyLmRhdGFfc291cmNlc18KKyAgICYmIG51bV9zZXNzaW9uc18gPT0gb3RoZXIu
bnVtX3Nlc3Npb25zXworICAgJiYgbnVtX3Nlc3Npb25zX3N0YXJ0ZWRfID09IG90aGVyLm51bV9z
ZXNzaW9uc19zdGFydGVkXzsKK30KKworYm9vbCBUcmFjaW5nU2VydmljZVN0YXRlOjpQYXJzZUZy
b21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHByb2R1Y2Vyc18uY2xl
YXIoKTsKKyAgZGF0YV9zb3VyY2VzXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIo
KTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9E
ZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxk
KCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZp
ZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChm
aWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNl
IDEgLyogcHJvZHVjZXJzICovOgorICAgICAgICBwcm9kdWNlcnNfLmVtcGxhY2VfYmFjaygpOwor
ICAgICAgICBwcm9kdWNlcnNfLmJhY2soKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0
cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogZGF0YV9zb3VyY2VzICov
OgorICAgICAgICBkYXRhX3NvdXJjZXNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBkYXRhX3Nv
dXJjZXNfLmJhY2soKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogbnVtX3Nlc3Npb25zICovOgorICAgICAgICBm
aWVsZC5nZXQoJm51bV9zZXNzaW9uc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAv
KiBudW1fc2Vzc2lvbnNfc3RhcnRlZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZudW1fc2Vzc2lv
bnNfc3RhcnRlZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZp
ZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVh
azsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0
KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRyYWNpbmdTZXJ2aWNlU3RhdGU6OlNlcmlhbGl6ZUFzU3Ry
aW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNpbmdTZXJ2aWNl
U3RhdGU6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVm
ZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7
CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2
aWNlU3RhdGU6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7Cisg
IC8vIEZpZWxkIDE6IHByb2R1Y2VycworICBmb3IgKGF1dG8mIGl0IDogcHJvZHVjZXJzXykgewor
ICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVz
c2FnZT4oMSkpOworICB9CisKKyAgLy8gRmllbGQgMjogZGF0YV9zb3VyY2VzCisgIGZvciAoYXV0
byYgaXQgOiBkYXRhX3NvdXJjZXNfKSB7CisgICAgaXQuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0
ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyKSk7CisgIH0KKworICAvLyBGaWVsZCAz
OiBudW1fc2Vzc2lvbnMKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRW
YXJJbnQoMywgbnVtX3Nlc3Npb25zXyk7CisgIH0KKworICAvLyBGaWVsZCA0OiBudW1fc2Vzc2lv
bnNfc3RhcnRlZAorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCg0LCBudW1fc2Vzc2lvbnNfc3RhcnRlZF8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90
b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOwor
fQorCisKK1RyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZTo6VHJhY2luZ1NlcnZpY2VTdGF0
ZV9EYXRhU291cmNlKCkgPSBkZWZhdWx0OworVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNl
Ojp+VHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlKCkgPSBkZWZhdWx0OworVHJhY2luZ1Nl
cnZpY2VTdGF0ZV9EYXRhU291cmNlOjpUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2UoY29u
c3QgVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlJikgPSBkZWZhdWx0OworVHJhY2luZ1Nl
cnZpY2VTdGF0ZV9EYXRhU291cmNlJiBUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2U6Om9w
ZXJhdG9yPShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2UmKSA9IGRlZmF1bHQ7
CitUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2U6OlRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0
YVNvdXJjZShUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2UmJikgbm9leGNlcHQgPSBkZWZh
dWx0OworVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlJiBUcmFjaW5nU2VydmljZVN0YXRl
X0RhdGFTb3VyY2U6Om9wZXJhdG9yPShUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2UmJikg
PSBkZWZhdWx0OworCitib29sIFRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZTo6b3BlcmF0
b3I9PShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2UmIG90aGVyKSBjb25zdCB7
CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAm
JiBkc19kZXNjcmlwdG9yXyA9PSBvdGhlci5kc19kZXNjcmlwdG9yXworICAgJiYgcHJvZHVjZXJf
aWRfID09IG90aGVyLnByb2R1Y2VyX2lkXzsKK30KKworYm9vbCBUcmFjaW5nU2VydmljZVN0YXRl
X0RhdGFTb3VyY2U6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUp
IHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFs
c2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9y
IChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRl
Yy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgp
KSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRj
aCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGRzX2Rlc2NyaXB0b3IgKi86CisgICAg
ICAgICgqZHNfZGVzY3JpcHRvcl8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5n
KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBwcm9kdWNlcl9pZCAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZwcm9kdWNlcl9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRl
ZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxk
c18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3Ig
JiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRyYWNpbmdTZXJ2aWNlU3Rh
dGVfRGF0YVNvdXJjZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJv
OjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1z
Zy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2
ZWN0b3I8dWludDhfdD4gVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlOjpTZXJpYWxpemVB
c0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNl
cmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3Vy
Y2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZp
ZWxkIDE6IGRzX2Rlc2NyaXB0b3IKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgKCpkc19k
ZXNjcmlwdG9yXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPigxKSk7CisgIH0KKworICAvLyBGaWVsZCAyOiBwcm9kdWNlcl9pZAorICBpZiAo
X2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBwcm9kdWNlcl9pZF8p
OworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRh
KCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK1RyYWNpbmdTZXJ2aWNlU3RhdGVf
UHJvZHVjZXI6OlRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXIoKSA9IGRlZmF1bHQ7CitUcmFj
aW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyOjp+VHJhY2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcigp
ID0gZGVmYXVsdDsKK1RyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXI6OlRyYWNpbmdTZXJ2aWNl
U3RhdGVfUHJvZHVjZXIoY29uc3QgVHJhY2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlciYpID0gZGVm
YXVsdDsKK1RyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXImIFRyYWNpbmdTZXJ2aWNlU3RhdGVf
UHJvZHVjZXI6Om9wZXJhdG9yPShjb25zdCBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJikg
PSBkZWZhdWx0OworVHJhY2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcjo6VHJhY2luZ1NlcnZpY2VT
dGF0ZV9Qcm9kdWNlcihUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJiYpIG5vZXhjZXB0ID0g
ZGVmYXVsdDsKK1RyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXImIFRyYWNpbmdTZXJ2aWNlU3Rh
dGVfUHJvZHVjZXI6Om9wZXJhdG9yPShUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyJiYpID0g
ZGVmYXVsdDsKKworYm9vbCBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyOjpvcGVyYXRvcj09
KGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXImIG90aGVyKSBjb25zdCB7CisgIHJl
dHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBpZF8g
PT0gb3RoZXIuaWRfCisgICAmJiBuYW1lXyA9PSBvdGhlci5uYW1lXworICAgJiYgdWlkXyA9PSBv
dGhlci51aWRfOworfQorCitib29sIFRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXI6OlBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVs
ZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3pl
cm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVj
LlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgewor
ICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2Zp
ZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgewor
ICAgICAgY2FzZSAxIC8qIGlkICovOgorICAgICAgICBmaWVsZC5nZXQoJmlkXyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAyIC8qIG5hbWUgKi86CisgICAgICAgIGZpZWxkLmdldCgmbmFt
ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiB1aWQgKi86CisgICAgICAgIGZp
ZWxkLmdldCgmdWlkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xl
ZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcjo6U2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVHJh
Y2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcjo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAg
Ojpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBT
ZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9
CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcjo6U2VyaWFsaXplKDo6cHJvdG96
ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogaWQKKyAgaWYgKF9oYXNf
ZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgaWRfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDI6IG5hbWUKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRT
dHJpbmcoMiwgbmFtZV8pOworICB9CisKKyAgLy8gRmllbGQgMzogdWlkCisgIGlmIChfaGFzX2Zp
ZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIHVpZF8pOworICB9CisKKyAgbXNn
LT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmll
bGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVz
cGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMg
cG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRv
L2NvbW1vbi90cmFja19ldmVudF9kZXNjcmlwdG9yLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFw
X2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3Bw
Z2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFn
bm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNrX2V2ZW50X2Rlc2NyaXB0
b3IuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25h
bWVzcGFjZSBnZW4geworCitUcmFja0V2ZW50RGVzY3JpcHRvcjo6VHJhY2tFdmVudERlc2NyaXB0
b3IoKSA9IGRlZmF1bHQ7CitUcmFja0V2ZW50RGVzY3JpcHRvcjo6flRyYWNrRXZlbnREZXNjcmlw
dG9yKCkgPSBkZWZhdWx0OworVHJhY2tFdmVudERlc2NyaXB0b3I6OlRyYWNrRXZlbnREZXNjcmlw
dG9yKGNvbnN0IFRyYWNrRXZlbnREZXNjcmlwdG9yJikgPSBkZWZhdWx0OworVHJhY2tFdmVudERl
c2NyaXB0b3ImIFRyYWNrRXZlbnREZXNjcmlwdG9yOjpvcGVyYXRvcj0oY29uc3QgVHJhY2tFdmVu
dERlc2NyaXB0b3ImKSA9IGRlZmF1bHQ7CitUcmFja0V2ZW50RGVzY3JpcHRvcjo6VHJhY2tFdmVu
dERlc2NyaXB0b3IoVHJhY2tFdmVudERlc2NyaXB0b3ImJikgbm9leGNlcHQgPSBkZWZhdWx0Owor
VHJhY2tFdmVudERlc2NyaXB0b3ImIFRyYWNrRXZlbnREZXNjcmlwdG9yOjpvcGVyYXRvcj0oVHJh
Y2tFdmVudERlc2NyaXB0b3ImJikgPSBkZWZhdWx0OworCitib29sIFRyYWNrRXZlbnREZXNjcmlw
dG9yOjpvcGVyYXRvcj09KGNvbnN0IFRyYWNrRXZlbnREZXNjcmlwdG9yJiBvdGhlcikgY29uc3Qg
eworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAg
JiYgYXZhaWxhYmxlX2NhdGVnb3JpZXNfID09IG90aGVyLmF2YWlsYWJsZV9jYXRlZ29yaWVzXzsK
K30KKworYm9vbCBUcmFja0V2ZW50RGVzY3JpcHRvcjo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9p
ZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICBhdmFpbGFibGVfY2F0ZWdvcmllc18uY2xlYXIoKTsK
KyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7
CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChh
dXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5S
ZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7
CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAo
ZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGF2YWlsYWJsZV9jYXRlZ29yaWVzICovOgor
ICAgICAgICBhdmFpbGFibGVfY2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGF2
YWlsYWJsZV9jYXRlZ29yaWVzXy5iYWNrKCkuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9z
dHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQu
U2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsK
K30KKworc3RkOjpzdHJpbmcgVHJhY2tFdmVudERlc2NyaXB0b3I6OlNlcmlhbGl6ZUFzU3RyaW5n
KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6
ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNrRXZlbnREZXNjcmlw
dG9yOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZl
cmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOwor
ICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBUcmFja0V2ZW50RGVz
Y3JpcHRvcjo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAg
Ly8gRmllbGQgMTogYXZhaWxhYmxlX2NhdGVnb3JpZXMKKyAgZm9yIChhdXRvJiBpdCA6IGF2YWls
YWJsZV9jYXRlZ29yaWVzXykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVz
c2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMSkpOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQ
cm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkp
OworfQorCisKK1RyYWNrRXZlbnRDYXRlZ29yeTo6VHJhY2tFdmVudENhdGVnb3J5KCkgPSBkZWZh
dWx0OworVHJhY2tFdmVudENhdGVnb3J5Ojp+VHJhY2tFdmVudENhdGVnb3J5KCkgPSBkZWZhdWx0
OworVHJhY2tFdmVudENhdGVnb3J5OjpUcmFja0V2ZW50Q2F0ZWdvcnkoY29uc3QgVHJhY2tFdmVu
dENhdGVnb3J5JikgPSBkZWZhdWx0OworVHJhY2tFdmVudENhdGVnb3J5JiBUcmFja0V2ZW50Q2F0
ZWdvcnk6Om9wZXJhdG9yPShjb25zdCBUcmFja0V2ZW50Q2F0ZWdvcnkmKSA9IGRlZmF1bHQ7CitU
cmFja0V2ZW50Q2F0ZWdvcnk6OlRyYWNrRXZlbnRDYXRlZ29yeShUcmFja0V2ZW50Q2F0ZWdvcnkm
Jikgbm9leGNlcHQgPSBkZWZhdWx0OworVHJhY2tFdmVudENhdGVnb3J5JiBUcmFja0V2ZW50Q2F0
ZWdvcnk6Om9wZXJhdG9yPShUcmFja0V2ZW50Q2F0ZWdvcnkmJikgPSBkZWZhdWx0OworCitib29s
IFRyYWNrRXZlbnRDYXRlZ29yeTo6b3BlcmF0b3I9PShjb25zdCBUcmFja0V2ZW50Q2F0ZWdvcnkm
IG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93
bl9maWVsZHNfCisgICAmJiBuYW1lXyA9PSBvdGhlci5uYW1lXworICAgJiYgZGVzY3JpcHRpb25f
ID09IG90aGVyLmRlc2NyaXB0aW9uXworICAgJiYgdGFnc18gPT0gb3RoZXIudGFnc187Cit9CisK
K2Jvb2wgVHJhY2tFdmVudENhdGVnb3J5OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcs
IHNpemVfdCBzaXplKSB7CisgIHRhZ3NfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVh
cigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90
b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAo
ZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0
KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNh
c2UgMSAvKiBuYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDIgLyogZGVzY3JpcHRpb24gKi86CisgICAgICAgIGZpZWxkLmdldCgm
ZGVzY3JpcHRpb25fKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogdGFncyAqLzoK
KyAgICAgICAgdGFnc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmdGFnc18u
YmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5T
ZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOwor
fQorCitzdGQ6OnN0cmluZyBUcmFja0V2ZW50Q2F0ZWdvcnk6OlNlcmlhbGl6ZUFzU3RyaW5nKCkg
Y29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdl
PiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFz
U3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNrRXZlbnRDYXRlZ29yeTo6
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2tFdmVudENhdGVnb3J5
OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVs
ZCAxOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5n
KDEsIG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGRlc2NyaXB0aW9uCisgIGlmIChfaGFz
X2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIGRlc2NyaXB0aW9uXyk7Cisg
IH0KKworICAvLyBGaWVsZCAzOiB0YWdzCisgIGZvciAoYXV0byYgaXQgOiB0YWdzXykgeworICAg
IG1zZy0+QXBwZW5kU3RyaW5nKDMsIGl0KTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9C
eXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30K
KworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAv
LyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvYW5kcm9pZC9h
bmRyb2lkX2xvZ19jb25maWcuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9hbmRyb2lkL2FuZHJvaWRfbG9nX2NvbmZpZy5n
ZW4uaAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3Bs
dWdpbgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19BTkRS
T0lEX0FORFJPSURfTE9HX0NPTkZJR19QUk9UT19DUFBfSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfQU5EUk9JRF9BTkRST0lEX0xPR19DT05GSUdfUFJP
VE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5j
bHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4K
KworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFz
cyBBbmRyb2lkTG9nQ29uZmlnOworZW51bSBBbmRyb2lkTG9nSWQgOiBpbnQ7CitlbnVtIEFuZHJv
aWRMb2dQcmlvcml0eSA6IGludDsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFt
ZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJv
IHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFz
cyBQRVJGRVRUT19FWFBPUlQgQW5kcm9pZExvZ0NvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6
Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0xv
Z0lkc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrTWluUHJpb0ZpZWxkTnVtYmVyID0gMywKKyAgICBr
RmlsdGVyVGFnc0ZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKworICBBbmRyb2lkTG9nQ29uZmlnKCk7
CisgIH5BbmRyb2lkTG9nQ29uZmlnKCkgb3ZlcnJpZGU7CisgIEFuZHJvaWRMb2dDb25maWcoQW5k
cm9pZExvZ0NvbmZpZyYmKSBub2V4Y2VwdDsKKyAgQW5kcm9pZExvZ0NvbmZpZyYgb3BlcmF0b3I9
KEFuZHJvaWRMb2dDb25maWcmJik7CisgIEFuZHJvaWRMb2dDb25maWcoY29uc3QgQW5kcm9pZExv
Z0NvbmZpZyYpOworICBBbmRyb2lkTG9nQ29uZmlnJiBvcGVyYXRvcj0oY29uc3QgQW5kcm9pZExv
Z0NvbmZpZyYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQW5kcm9pZExvZ0NvbmZpZyYpIGNv
bnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgQW5kcm9pZExvZ0NvbmZpZyYgb3RoZXIpIGNv
bnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJh
eShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFs
aXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVy
bzo6TWVzc2FnZSopIGNvbnN0OworCisgIGludCBsb2dfaWRzX3NpemUoKSBjb25zdCB7IHJldHVy
biBzdGF0aWNfY2FzdDxpbnQ+KGxvZ19pZHNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0
b3I8QW5kcm9pZExvZ0lkPiYgbG9nX2lkcygpIGNvbnN0IHsgcmV0dXJuIGxvZ19pZHNfOyB9Cisg
IHN0ZDo6dmVjdG9yPEFuZHJvaWRMb2dJZD4qIG11dGFibGVfbG9nX2lkcygpIHsgcmV0dXJuICZs
b2dfaWRzXzsgfQorICB2b2lkIGNsZWFyX2xvZ19pZHMoKSB7IGxvZ19pZHNfLmNsZWFyKCk7IH0K
KyAgdm9pZCBhZGRfbG9nX2lkcyhBbmRyb2lkTG9nSWQgdmFsdWUpIHsgbG9nX2lkc18uZW1wbGFj
ZV9iYWNrKHZhbHVlKTsgfQorICBBbmRyb2lkTG9nSWQqIGFkZF9sb2dfaWRzKCkgeyBsb2dfaWRz
Xy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZsb2dfaWRzXy5iYWNrKCk7IH0KKworICBib29sIGhh
c19taW5fcHJpbygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIEFuZHJvaWRM
b2dQcmlvcml0eSBtaW5fcHJpbygpIGNvbnN0IHsgcmV0dXJuIG1pbl9wcmlvXzsgfQorICB2b2lk
IHNldF9taW5fcHJpbyhBbmRyb2lkTG9nUHJpb3JpdHkgdmFsdWUpIHsgbWluX3ByaW9fID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgIGludCBmaWx0ZXJfdGFnc19zaXplKCkgY29u
c3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihmaWx0ZXJfdGFnc18uc2l6ZSgpKTsgfQorICBj
b25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZpbHRlcl90YWdzKCkgY29uc3QgeyByZXR1
cm4gZmlsdGVyX3RhZ3NfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9m
aWx0ZXJfdGFncygpIHsgcmV0dXJuICZmaWx0ZXJfdGFnc187IH0KKyAgdm9pZCBjbGVhcl9maWx0
ZXJfdGFncygpIHsgZmlsdGVyX3RhZ3NfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfZmlsdGVyX3Rh
Z3Moc3RkOjpzdHJpbmcgdmFsdWUpIHsgZmlsdGVyX3RhZ3NfLmVtcGxhY2VfYmFjayh2YWx1ZSk7
IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9maWx0ZXJfdGFncygpIHsgZmlsdGVyX3RhZ3NfLmVtcGxh
Y2VfYmFjaygpOyByZXR1cm4gJmZpbHRlcl90YWdzXy5iYWNrKCk7IH0KKworIHByaXZhdGU6Cisg
IHN0ZDo6dmVjdG9yPEFuZHJvaWRMb2dJZD4gbG9nX2lkc187CisgIEFuZHJvaWRMb2dQcmlvcml0
eSBtaW5fcHJpb197fTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbHRlcl90YWdzXzsK
KworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNv
bXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgor
ICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8NT4gX2hhc19m
aWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNl
IHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX0FORFJPSURfQU5EUk9JRF9MT0dfQ09ORklHX1BST1RP
X0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9f
ZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1
dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25v
c3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8v
Y29uZmlnL2FuZHJvaWQvYW5kcm9pZF9sb2dfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9hbmRyb2lkX2xv
Z19jb25zdGFudHMuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJv
dG9zIHsKK25hbWVzcGFjZSBnZW4geworCitBbmRyb2lkTG9nQ29uZmlnOjpBbmRyb2lkTG9nQ29u
ZmlnKCkgPSBkZWZhdWx0OworQW5kcm9pZExvZ0NvbmZpZzo6fkFuZHJvaWRMb2dDb25maWcoKSA9
IGRlZmF1bHQ7CitBbmRyb2lkTG9nQ29uZmlnOjpBbmRyb2lkTG9nQ29uZmlnKGNvbnN0IEFuZHJv
aWRMb2dDb25maWcmKSA9IGRlZmF1bHQ7CitBbmRyb2lkTG9nQ29uZmlnJiBBbmRyb2lkTG9nQ29u
ZmlnOjpvcGVyYXRvcj0oY29uc3QgQW5kcm9pZExvZ0NvbmZpZyYpID0gZGVmYXVsdDsKK0FuZHJv
aWRMb2dDb25maWc6OkFuZHJvaWRMb2dDb25maWcoQW5kcm9pZExvZ0NvbmZpZyYmKSBub2V4Y2Vw
dCA9IGRlZmF1bHQ7CitBbmRyb2lkTG9nQ29uZmlnJiBBbmRyb2lkTG9nQ29uZmlnOjpvcGVyYXRv
cj0oQW5kcm9pZExvZ0NvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQW5kcm9pZExvZ0NvbmZp
Zzo6b3BlcmF0b3I9PShjb25zdCBBbmRyb2lkTG9nQ29uZmlnJiBvdGhlcikgY29uc3QgeworICBy
ZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgbG9n
X2lkc18gPT0gb3RoZXIubG9nX2lkc18KKyAgICYmIG1pbl9wcmlvXyA9PSBvdGhlci5taW5fcHJp
b18KKyAgICYmIGZpbHRlcl90YWdzXyA9PSBvdGhlci5maWx0ZXJfdGFnc187Cit9CisKK2Jvb2wg
QW5kcm9pZExvZ0NvbmZpZzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qg
c2l6ZSkgeworICBsb2dfaWRzXy5jbGVhcigpOworICBmaWx0ZXJfdGFnc18uY2xlYXIoKTsKKyAg
dW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisK
KyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRv
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFk
RmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7Cisg
ICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmll
bGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGxvZ19pZHMgKi86CisgICAgICAgIGxvZ19pZHNf
LmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmxvZ19pZHNfLmJhY2soKSk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIG1pbl9wcmlvICovOgorICAgICAgICBmaWVs
ZC5nZXQoJm1pbl9wcmlvXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIGZpbHRl
cl90YWdzICovOgorICAgICAgICBmaWx0ZXJfdGFnc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAg
IGZpZWxkLmdldCgmZmlsdGVyX3RhZ3NfLmJhY2soKSk7CisgICAgICAgIGJyZWFrOworICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmll
bGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJv
ciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgQW5kcm9pZExvZ0NvbmZp
Zzo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVy
ZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7Cisg
IHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhf
dD4gQW5kcm9pZExvZ0NvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3Zv
aWQgQW5kcm9pZExvZ0NvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cp
IGNvbnN0IHsKKyAgLy8gRmllbGQgMTogbG9nX2lkcworICBmb3IgKGF1dG8mIGl0IDogbG9nX2lk
c18pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCBpdCk7CisgIH0KKworICAvLyBGaWVsZCAz
OiBtaW5fcHJpbworICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCgzLCBtaW5fcHJpb18pOworICB9CisKKyAgLy8gRmllbGQgNDogZmlsdGVyX3RhZ3MKKyAgZm9y
IChhdXRvJiBpdCA6IGZpbHRlcl90YWdzXykgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDQsIGl0
KTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0
YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBlcmZl
dHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21h
IEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2Vu
L3Byb3Rvcy9wZXJmZXR0by9jb25maWcvYW5kcm9pZC9hbmRyb2lkX3BvbGxlZF9zdGF0ZV9jb25m
aWcuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3Bl
cmZldHRvL2NvbmZpZy9hbmRyb2lkL2FuZHJvaWRfcG9sbGVkX3N0YXRlX2NvbmZpZy5nZW4uaAor
Ly8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgor
I2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19BTkRST0lEX0FO
RFJPSURfUE9MTEVEX1NUQVRFX0NPTkZJR19QUk9UT19DUFBfSF8KKyNkZWZpbmUgUEVSRkVUVE9f
UFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfQU5EUk9JRF9BTkRST0lEX1BPTExFRF9TVEFU
RV9DT05GSUdfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxi
aXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0
eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNl
IGdlbiB7CitjbGFzcyBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWc7Cit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKwor
bmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHBy
b3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1l
c3BhY2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEFuZHJvaWRQb2xsZWRTdGF0ZUNv
bmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBl
bnVtIEZpZWxkTnVtYmVycyB7CisgICAga1BvbGxNc0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKwor
ICBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcoKTsKKyAgfkFuZHJvaWRQb2xsZWRTdGF0ZUNvbmZp
ZygpIG92ZXJyaWRlOworICBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcoQW5kcm9pZFBvbGxlZFN0
YXRlQ29uZmlnJiYpIG5vZXhjZXB0OworICBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcmIG9wZXJh
dG9yPShBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcmJik7CisgIEFuZHJvaWRQb2xsZWRTdGF0ZUNv
bmZpZyhjb25zdCBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcmKTsKKyAgQW5kcm9pZFBvbGxlZFN0
YXRlQ29uZmlnJiBvcGVyYXRvcj0oY29uc3QgQW5kcm9pZFBvbGxlZFN0YXRlQ29uZmlnJik7Cisg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcmKSBjb25zdDsK
KyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFuZHJvaWRQb2xsZWRTdGF0ZUNvbmZpZyYgb3RoZXIp
IGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21B
cnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3Rv
emVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3BvbGxfbXMoKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50MzJfdCBwb2xsX21zKCkgY29uc3QgeyByZXR1
cm4gcG9sbF9tc187IH0KKyAgdm9pZCBzZXRfcG9sbF9tcyh1aW50MzJfdCB2YWx1ZSkgeyBwb2xs
X21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworIHByaXZhdGU6CisgIHVpbnQz
Ml90IHBvbGxfbXNfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9i
dWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9m
IC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6
Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8K
K30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAv
LyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19BTkRST0lEX0FORFJPSURf
UE9MTEVEX1NUQVRFX0NPTkZJR19QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3Jl
cGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZm
ZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9w
bHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3Rp
YyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9hbmRyb2lkL2FuZHJvaWRfcG9sbGVkX3N0
YXRlX2NvbmZpZy5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90
b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK0FuZHJvaWRQb2xsZWRTdGF0ZUNvbmZpZzo6QW5kcm9p
ZFBvbGxlZFN0YXRlQ29uZmlnKCkgPSBkZWZhdWx0OworQW5kcm9pZFBvbGxlZFN0YXRlQ29uZmln
Ojp+QW5kcm9pZFBvbGxlZFN0YXRlQ29uZmlnKCkgPSBkZWZhdWx0OworQW5kcm9pZFBvbGxlZFN0
YXRlQ29uZmlnOjpBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcoY29uc3QgQW5kcm9pZFBvbGxlZFN0
YXRlQ29uZmlnJikgPSBkZWZhdWx0OworQW5kcm9pZFBvbGxlZFN0YXRlQ29uZmlnJiBBbmRyb2lk
UG9sbGVkU3RhdGVDb25maWc6Om9wZXJhdG9yPShjb25zdCBBbmRyb2lkUG9sbGVkU3RhdGVDb25m
aWcmKSA9IGRlZmF1bHQ7CitBbmRyb2lkUG9sbGVkU3RhdGVDb25maWc6OkFuZHJvaWRQb2xsZWRT
dGF0ZUNvbmZpZyhBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcmJikgbm9leGNlcHQgPSBkZWZhdWx0
OworQW5kcm9pZFBvbGxlZFN0YXRlQ29uZmlnJiBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWc6Om9w
ZXJhdG9yPShBbmRyb2lkUG9sbGVkU3RhdGVDb25maWcmJikgPSBkZWZhdWx0OworCitib29sIEFu
ZHJvaWRQb2xsZWRTdGF0ZUNvbmZpZzo6b3BlcmF0b3I9PShjb25zdCBBbmRyb2lkUG9sbGVkU3Rh
dGVDb25maWcmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3Ro
ZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBwb2xsX21zXyA9PSBvdGhlci5wb2xsX21zXzsKK30K
KworYm9vbCBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWc6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZv
aWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHBv
bGxfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmcG9sbF9tc18pOworICAgICAgICBicmVhazsK
KyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtu
b3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNr
ZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEFuZHJvaWRQ
b2xsZWRTdGF0ZUNvbmZpZzo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96
ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXpl
KG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3Rk
Ojp2ZWN0b3I8dWludDhfdD4gQW5kcm9pZFBvbGxlZFN0YXRlQ29uZmlnOjpTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWc6OlNlcmlh
bGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IHBv
bGxfbXMKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwg
cG9sbF9tc18pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmll
bGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3Bh
Y2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4K
KyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9hbmRyb2lkL3BhY2thZ2VzX2xpc3RfY29u
ZmlnLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by9jb25maWcvYW5kcm9pZC9wYWNrYWdlc19saXN0X2NvbmZpZy5nZW4uaAorLy8gRE8g
Tk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRl
ZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19BTkRST0lEX1BBQ0tBR0VT
X0xJU1RfQ09ORklHX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9T
X1BFUkZFVFRPX0NPTkZJR19BTkRST0lEX1BBQ0tBR0VTX0xJU1RfQ09ORklHX1BST1RPX0NQUF9I
XworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZl
Y3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBf
bWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgUGFja2Fn
ZXNMaXN0Q29uZmlnOworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2Ug
cHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xh
c3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZF
VFRPX0VYUE9SVCBQYWNrYWdlc0xpc3RDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1l
c3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtQYWNrYWdl
TmFtZUZpbHRlckZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBQYWNrYWdlc0xpc3RDb25maWco
KTsKKyAgflBhY2thZ2VzTGlzdENvbmZpZygpIG92ZXJyaWRlOworICBQYWNrYWdlc0xpc3RDb25m
aWcoUGFja2FnZXNMaXN0Q29uZmlnJiYpIG5vZXhjZXB0OworICBQYWNrYWdlc0xpc3RDb25maWcm
IG9wZXJhdG9yPShQYWNrYWdlc0xpc3RDb25maWcmJik7CisgIFBhY2thZ2VzTGlzdENvbmZpZyhj
b25zdCBQYWNrYWdlc0xpc3RDb25maWcmKTsKKyAgUGFja2FnZXNMaXN0Q29uZmlnJiBvcGVyYXRv
cj0oY29uc3QgUGFja2FnZXNMaXN0Q29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQ
YWNrYWdlc0xpc3RDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBhY2th
Z2VzTGlzdENvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9
CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsK
KyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3Rk
Ojp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2
b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGludCBwYWNr
YWdlX25hbWVfZmlsdGVyX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHBh
Y2thZ2VfbmFtZV9maWx0ZXJfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpz
dHJpbmc+JiBwYWNrYWdlX25hbWVfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gcGFja2FnZV9uYW1l
X2ZpbHRlcl87IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX3BhY2thZ2Vf
bmFtZV9maWx0ZXIoKSB7IHJldHVybiAmcGFja2FnZV9uYW1lX2ZpbHRlcl87IH0KKyAgdm9pZCBj
bGVhcl9wYWNrYWdlX25hbWVfZmlsdGVyKCkgeyBwYWNrYWdlX25hbWVfZmlsdGVyXy5jbGVhcigp
OyB9CisgIHZvaWQgYWRkX3BhY2thZ2VfbmFtZV9maWx0ZXIoc3RkOjpzdHJpbmcgdmFsdWUpIHsg
cGFja2FnZV9uYW1lX2ZpbHRlcl8uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBzdGQ6OnN0cmlu
ZyogYWRkX3BhY2thZ2VfbmFtZV9maWx0ZXIoKSB7IHBhY2thZ2VfbmFtZV9maWx0ZXJfLmVtcGxh
Y2VfYmFjaygpOyByZXR1cm4gJnBhY2thZ2VfbmFtZV9maWx0ZXJfLmJhY2soKTsgfQorCisgcHJp
dmF0ZToKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhY2thZ2VfbmFtZV9maWx0ZXJfOwor
CisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29t
cGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisg
IHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2Zp
ZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2Ug
cHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9T
X1BST1RPU19QRVJGRVRUT19DT05GSUdfQU5EUk9JRF9QQUNLQUdFU19MSVNUX0NPTkZJR19QUk9U
T19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3Rv
X2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBB
dXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdu
b3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFs
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRv
L2NvbmZpZy9hbmRyb2lkL3BhY2thZ2VzX2xpc3RfY29uZmlnLmdlbi5oIgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworUGFja2Fn
ZXNMaXN0Q29uZmlnOjpQYWNrYWdlc0xpc3RDb25maWcoKSA9IGRlZmF1bHQ7CitQYWNrYWdlc0xp
c3RDb25maWc6On5QYWNrYWdlc0xpc3RDb25maWcoKSA9IGRlZmF1bHQ7CitQYWNrYWdlc0xpc3RD
b25maWc6OlBhY2thZ2VzTGlzdENvbmZpZyhjb25zdCBQYWNrYWdlc0xpc3RDb25maWcmKSA9IGRl
ZmF1bHQ7CitQYWNrYWdlc0xpc3RDb25maWcmIFBhY2thZ2VzTGlzdENvbmZpZzo6b3BlcmF0b3I9
KGNvbnN0IFBhY2thZ2VzTGlzdENvbmZpZyYpID0gZGVmYXVsdDsKK1BhY2thZ2VzTGlzdENvbmZp
Zzo6UGFja2FnZXNMaXN0Q29uZmlnKFBhY2thZ2VzTGlzdENvbmZpZyYmKSBub2V4Y2VwdCA9IGRl
ZmF1bHQ7CitQYWNrYWdlc0xpc3RDb25maWcmIFBhY2thZ2VzTGlzdENvbmZpZzo6b3BlcmF0b3I9
KFBhY2thZ2VzTGlzdENvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgUGFja2FnZXNMaXN0Q29u
ZmlnOjpvcGVyYXRvcj09KGNvbnN0IFBhY2thZ2VzTGlzdENvbmZpZyYgb3RoZXIpIGNvbnN0IHsK
KyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYm
IHBhY2thZ2VfbmFtZV9maWx0ZXJfID09IG90aGVyLnBhY2thZ2VfbmFtZV9maWx0ZXJfOworfQor
Citib29sIFBhY2thZ2VzTGlzdENvbmZpZzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3
LCBzaXplX3Qgc2l6ZSkgeworICBwYWNrYWdlX25hbWVfZmlsdGVyXy5jbGVhcigpOworICB1bmtu
b3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6
OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmll
bGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAg
IF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5p
ZCgpKSB7CisgICAgICBjYXNlIDEgLyogcGFja2FnZV9uYW1lX2ZpbHRlciAqLzoKKyAgICAgICAg
cGFja2FnZV9uYW1lX2ZpbHRlcl8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgm
cGFja2FnZV9uYW1lX2ZpbHRlcl8uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZh
dWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYm
ICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBQYWNrYWdlc0xpc3RDb25maWc6
OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVk
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICBy
ZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IFBhY2thZ2VzTGlzdENvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3Zv
aWQgUGFja2FnZXNMaXN0Q29uZmlnOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBwYWNrYWdlX25hbWVfZmlsdGVyCisgIGZvciAoYXV0
byYgaXQgOiBwYWNrYWdlX25hbWVfZmlsdGVyXykgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEs
IGl0KTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18u
ZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJh
Z21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTog
Z2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvZnRyYWNlL2Z0cmFjZV9jb25maWcuZ2VuLmNjCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZp
Zy9mdHJhY2UvZnRyYWNlX2NvbmZpZy5nZW4uaAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0
ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX0NPTkZJR19GVFJBQ0VfRlRSQUNFX0NPTkZJR19QUk9UT19DUFBfSF8KKyNk
ZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfRlRSQUNFX0ZUUkFD
RV9DT05GSUdfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxi
aXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0
eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNl
IGdlbiB7CitjbGFzcyBGdHJhY2VDb25maWc7CitjbGFzcyBGdHJhY2VDb25maWdfQ29tcGFjdFNj
aGVkQ29uZmlnOworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJv
dG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3Mg
TWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRP
X0VYUE9SVCBGdHJhY2VDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmog
eworIHB1YmxpYzoKKyAgdXNpbmcgQ29tcGFjdFNjaGVkQ29uZmlnID0gRnRyYWNlQ29uZmlnX0Nv
bXBhY3RTY2hlZENvbmZpZzsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtGdHJhY2VFdmVu
dHNGaWVsZE51bWJlciA9IDEsCisgICAga0F0cmFjZUNhdGVnb3JpZXNGaWVsZE51bWJlciA9IDIs
CisgICAga0F0cmFjZUFwcHNGaWVsZE51bWJlciA9IDMsCisgICAga0J1ZmZlclNpemVLYkZpZWxk
TnVtYmVyID0gMTAsCisgICAga0RyYWluUGVyaW9kTXNGaWVsZE51bWJlciA9IDExLAorICAgIGtD
b21wYWN0U2NoZWRGaWVsZE51bWJlciA9IDEyLAorICB9OworCisgIEZ0cmFjZUNvbmZpZygpOwor
ICB+RnRyYWNlQ29uZmlnKCkgb3ZlcnJpZGU7CisgIEZ0cmFjZUNvbmZpZyhGdHJhY2VDb25maWcm
Jikgbm9leGNlcHQ7CisgIEZ0cmFjZUNvbmZpZyYgb3BlcmF0b3I9KEZ0cmFjZUNvbmZpZyYmKTsK
KyAgRnRyYWNlQ29uZmlnKGNvbnN0IEZ0cmFjZUNvbmZpZyYpOworICBGdHJhY2VDb25maWcmIG9w
ZXJhdG9yPShjb25zdCBGdHJhY2VDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZ0
cmFjZUNvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRnRyYWNlQ29uZmln
JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmlu
ZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50
OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXpl
KDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50IGZ0cmFjZV9ldmVudHNfc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZnRyYWNlX2V2ZW50c18uc2l6ZSgp
KTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZ0cmFjZV9ldmVudHMoKSBj
b25zdCB7IHJldHVybiBmdHJhY2VfZXZlbnRzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmlu
Zz4qIG11dGFibGVfZnRyYWNlX2V2ZW50cygpIHsgcmV0dXJuICZmdHJhY2VfZXZlbnRzXzsgfQor
ICB2b2lkIGNsZWFyX2Z0cmFjZV9ldmVudHMoKSB7IGZ0cmFjZV9ldmVudHNfLmNsZWFyKCk7IH0K
KyAgdm9pZCBhZGRfZnRyYWNlX2V2ZW50cyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBmdHJhY2VfZXZl
bnRzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRfZnRyYWNlX2V2
ZW50cygpIHsgZnRyYWNlX2V2ZW50c18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmZnRyYWNlX2V2
ZW50c18uYmFjaygpOyB9CisKKyAgaW50IGF0cmFjZV9jYXRlZ29yaWVzX3NpemUoKSBjb25zdCB7
IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGF0cmFjZV9jYXRlZ29yaWVzXy5zaXplKCkpOyB9Cisg
IGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXRyYWNlX2NhdGVnb3JpZXMoKSBjb25z
dCB7IHJldHVybiBhdHJhY2VfY2F0ZWdvcmllc187IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJp
bmc+KiBtdXRhYmxlX2F0cmFjZV9jYXRlZ29yaWVzKCkgeyByZXR1cm4gJmF0cmFjZV9jYXRlZ29y
aWVzXzsgfQorICB2b2lkIGNsZWFyX2F0cmFjZV9jYXRlZ29yaWVzKCkgeyBhdHJhY2VfY2F0ZWdv
cmllc18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9hdHJhY2VfY2F0ZWdvcmllcyhzdGQ6OnN0cmlu
ZyB2YWx1ZSkgeyBhdHJhY2VfY2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBz
dGQ6OnN0cmluZyogYWRkX2F0cmFjZV9jYXRlZ29yaWVzKCkgeyBhdHJhY2VfY2F0ZWdvcmllc18u
ZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmYXRyYWNlX2NhdGVnb3JpZXNfLmJhY2soKTsgfQorCisg
IGludCBhdHJhY2VfYXBwc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihh
dHJhY2VfYXBwc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4m
IGF0cmFjZV9hcHBzKCkgY29uc3QgeyByZXR1cm4gYXRyYWNlX2FwcHNfOyB9CisgIHN0ZDo6dmVj
dG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9hdHJhY2VfYXBwcygpIHsgcmV0dXJuICZhdHJhY2Vf
YXBwc187IH0KKyAgdm9pZCBjbGVhcl9hdHJhY2VfYXBwcygpIHsgYXRyYWNlX2FwcHNfLmNsZWFy
KCk7IH0KKyAgdm9pZCBhZGRfYXRyYWNlX2FwcHMoc3RkOjpzdHJpbmcgdmFsdWUpIHsgYXRyYWNl
X2FwcHNfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9hdHJhY2Vf
YXBwcygpIHsgYXRyYWNlX2FwcHNfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJmF0cmFjZV9hcHBz
Xy5iYWNrKCk7IH0KKworICBib29sIGhhc19idWZmZXJfc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzEwXTsgfQorICB1aW50MzJfdCBidWZmZXJfc2l6ZV9rYigpIGNvbnN0IHsg
cmV0dXJuIGJ1ZmZlcl9zaXplX2tiXzsgfQorICB2b2lkIHNldF9idWZmZXJfc2l6ZV9rYih1aW50
MzJfdCB2YWx1ZSkgeyBidWZmZXJfc2l6ZV9rYl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEw
KTsgfQorCisgIGJvb2wgaGFzX2RyYWluX3BlcmlvZF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzExXTsgfQorICB1aW50MzJfdCBkcmFpbl9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVy
biBkcmFpbl9wZXJpb2RfbXNfOyB9CisgIHZvaWQgc2V0X2RyYWluX3BlcmlvZF9tcyh1aW50MzJf
dCB2YWx1ZSkgeyBkcmFpbl9wZXJpb2RfbXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMSk7
IH0KKworICBib29sIGhhc19jb21wYWN0X3NjaGVkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bMTJdOyB9CisgIGNvbnN0IEZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWcmIGNvbXBh
Y3Rfc2NoZWQoKSBjb25zdCB7IHJldHVybiAqY29tcGFjdF9zY2hlZF87IH0KKyAgRnRyYWNlQ29u
ZmlnX0NvbXBhY3RTY2hlZENvbmZpZyogbXV0YWJsZV9jb21wYWN0X3NjaGVkKCkgeyBfaGFzX2Zp
ZWxkXy5zZXQoMTIpOyByZXR1cm4gY29tcGFjdF9zY2hlZF8uZ2V0KCk7IH0KKworIHByaXZhdGU6
CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmdHJhY2VfZXZlbnRzXzsKKyAgc3RkOjp2ZWN0
b3I8c3RkOjpzdHJpbmc+IGF0cmFjZV9jYXRlZ29yaWVzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpz
dHJpbmc+IGF0cmFjZV9hcHBzXzsKKyAgdWludDMyX3QgYnVmZmVyX3NpemVfa2Jfe307CisgIHVp
bnQzMl90IGRyYWluX3BlcmlvZF9tc197fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPEZ0
cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWc+IGNvbXBhY3Rfc2NoZWRfOworCisgIC8vIEFs
bG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0
eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3Ry
aW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwxMz4gX2hhc19maWVsZF97fTsK
K307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRD
b25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAg
ZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtFbmFibGVkRmllbGROdW1iZXIgPSAxLAorICB9Owor
CisgIEZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWcoKTsKKyAgfkZ0cmFjZUNvbmZpZ19D
b21wYWN0U2NoZWRDb25maWcoKSBvdmVycmlkZTsKKyAgRnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hl
ZENvbmZpZyhGdHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnJiYpIG5vZXhjZXB0OworICBG
dHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnJiBvcGVyYXRvcj0oRnRyYWNlQ29uZmlnX0Nv
bXBhY3RTY2hlZENvbmZpZyYmKTsKKyAgRnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZyhj
b25zdCBGdHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnJik7CisgIEZ0cmFjZUNvbmZpZ19D
b21wYWN0U2NoZWRDb25maWcmIG9wZXJhdG9yPShjb25zdCBGdHJhY2VDb25maWdfQ29tcGFjdFNj
aGVkQ29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGdHJhY2VDb25maWdfQ29tcGFj
dFNjaGVkQ29uZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGdHJhY2VDb25m
aWdfQ29tcGFjdFNjaGVkQ29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBv
dGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92
ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRl
OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJp
ZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAg
Ym9vbCBoYXNfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIGJv
b2wgZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGVuYWJsZWRfOyB9CisgIHZvaWQgc2V0X2VuYWJs
ZWQoYm9vbCB2YWx1ZSkgeyBlbmFibGVkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0K
KworIHByaXZhdGU6CisgIGJvb2wgZW5hYmxlZF97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2Vy
dmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBm
dXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2Zp
ZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNl
IGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklH
X0ZUUkFDRV9GVFJBQ0VfQ09ORklHX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRf
cmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1
ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2Vu
X3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9z
dGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2Z0cmFjZS9mdHJhY2VfY29uZmlnLmdl
bi5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3Bh
Y2UgZ2VuIHsKKworRnRyYWNlQ29uZmlnOjpGdHJhY2VDb25maWcoKSA9IGRlZmF1bHQ7CitGdHJh
Y2VDb25maWc6On5GdHJhY2VDb25maWcoKSA9IGRlZmF1bHQ7CitGdHJhY2VDb25maWc6OkZ0cmFj
ZUNvbmZpZyhjb25zdCBGdHJhY2VDb25maWcmKSA9IGRlZmF1bHQ7CitGdHJhY2VDb25maWcmIEZ0
cmFjZUNvbmZpZzo6b3BlcmF0b3I9KGNvbnN0IEZ0cmFjZUNvbmZpZyYpID0gZGVmYXVsdDsKK0Z0
cmFjZUNvbmZpZzo6RnRyYWNlQ29uZmlnKEZ0cmFjZUNvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1
bHQ7CitGdHJhY2VDb25maWcmIEZ0cmFjZUNvbmZpZzo6b3BlcmF0b3I9KEZ0cmFjZUNvbmZpZyYm
KSA9IGRlZmF1bHQ7CisKK2Jvb2wgRnRyYWNlQ29uZmlnOjpvcGVyYXRvcj09KGNvbnN0IEZ0cmFj
ZUNvbmZpZyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhl
ci51bmtub3duX2ZpZWxkc18KKyAgICYmIGZ0cmFjZV9ldmVudHNfID09IG90aGVyLmZ0cmFjZV9l
dmVudHNfCisgICAmJiBhdHJhY2VfY2F0ZWdvcmllc18gPT0gb3RoZXIuYXRyYWNlX2NhdGVnb3Jp
ZXNfCisgICAmJiBhdHJhY2VfYXBwc18gPT0gb3RoZXIuYXRyYWNlX2FwcHNfCisgICAmJiBidWZm
ZXJfc2l6ZV9rYl8gPT0gb3RoZXIuYnVmZmVyX3NpemVfa2JfCisgICAmJiBkcmFpbl9wZXJpb2Rf
bXNfID09IG90aGVyLmRyYWluX3BlcmlvZF9tc18KKyAgICYmIGNvbXBhY3Rfc2NoZWRfID09IG90
aGVyLmNvbXBhY3Rfc2NoZWRfOworfQorCitib29sIEZ0cmFjZUNvbmZpZzo6UGFyc2VGcm9tQXJy
YXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICBmdHJhY2VfZXZlbnRzXy5jbGVh
cigpOworICBhdHJhY2VfY2F0ZWdvcmllc18uY2xlYXIoKTsKKyAgYXRyYWNlX2FwcHNfLmNsZWFy
KCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZh
bHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZv
ciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUo
KSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0
Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBmdHJhY2VfZXZlbnRzICovOgorICAg
ICAgICBmdHJhY2VfZXZlbnRzXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgZmllbGQuZ2V0KCZm
dHJhY2VfZXZlbnRzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBh
dHJhY2VfY2F0ZWdvcmllcyAqLzoKKyAgICAgICAgYXRyYWNlX2NhdGVnb3JpZXNfLmVtcGxhY2Vf
YmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmF0cmFjZV9jYXRlZ29yaWVzXy5iYWNrKCkpOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBhdHJhY2VfYXBwcyAqLzoKKyAgICAgICAg
YXRyYWNlX2FwcHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmF0cmFjZV9h
cHBzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAgLyogYnVmZmVyX3Np
emVfa2IgKi86CisgICAgICAgIGZpZWxkLmdldCgmYnVmZmVyX3NpemVfa2JfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDExIC8qIGRyYWluX3BlcmlvZF9tcyAqLzoKKyAgICAgICAgZmll
bGQuZ2V0KCZkcmFpbl9wZXJpb2RfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEy
IC8qIGNvbXBhY3Rfc2NoZWQgKi86CisgICAgICAgICgqY29tcGFjdF9zY2hlZF8pLlBhcnNlRnJv
bVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRl
ZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxk
c18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3Ig
JiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEZ0cmFjZUNvbmZpZzo6U2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gRnRy
YWNlQ29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVh
cEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0
KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBGdHJhY2VD
b25maWc6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8v
IEZpZWxkIDE6IGZ0cmFjZV9ldmVudHMKKyAgZm9yIChhdXRvJiBpdCA6IGZ0cmFjZV9ldmVudHNf
KSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMSwgaXQpOworICB9CisKKyAgLy8gRmllbGQgMjog
YXRyYWNlX2NhdGVnb3JpZXMKKyAgZm9yIChhdXRvJiBpdCA6IGF0cmFjZV9jYXRlZ29yaWVzXykg
eworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGF0
cmFjZV9hcHBzCisgIGZvciAoYXV0byYgaXQgOiBhdHJhY2VfYXBwc18pIHsKKyAgICBtc2ctPkFw
cGVuZFN0cmluZygzLCBpdCk7CisgIH0KKworICAvLyBGaWVsZCAxMDogYnVmZmVyX3NpemVfa2IK
KyAgaWYgKF9oYXNfZmllbGRfWzEwXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEwLCBidWZm
ZXJfc2l6ZV9rYl8pOworICB9CisKKyAgLy8gRmllbGQgMTE6IGRyYWluX3BlcmlvZF9tcworICBp
ZiAoX2hhc19maWVsZF9bMTFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTEsIGRyYWluX3Bl
cmlvZF9tc18pOworICB9CisKKyAgLy8gRmllbGQgMTI6IGNvbXBhY3Rfc2NoZWQKKyAgaWYgKF9o
YXNfZmllbGRfWzEyXSkgeworICAgICgqY29tcGFjdF9zY2hlZF8pLlNlcmlhbGl6ZShtc2ctPkJl
Z2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMTIpKTsKKyAgfQorCisgIG1z
Zy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2Zp
ZWxkc18uc2l6ZSgpKTsKK30KKworCitGdHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnOjpG
dHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnKCkgPSBkZWZhdWx0OworRnRyYWNlQ29uZmln
X0NvbXBhY3RTY2hlZENvbmZpZzo6fkZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWcoKSA9
IGRlZmF1bHQ7CitGdHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnOjpGdHJhY2VDb25maWdf
Q29tcGFjdFNjaGVkQ29uZmlnKGNvbnN0IEZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWcm
KSA9IGRlZmF1bHQ7CitGdHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnJiBGdHJhY2VDb25m
aWdfQ29tcGFjdFNjaGVkQ29uZmlnOjpvcGVyYXRvcj0oY29uc3QgRnRyYWNlQ29uZmlnX0NvbXBh
Y3RTY2hlZENvbmZpZyYpID0gZGVmYXVsdDsKK0Z0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25m
aWc6OkZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWcoRnRyYWNlQ29uZmlnX0NvbXBhY3RT
Y2hlZENvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitGdHJhY2VDb25maWdfQ29tcGFjdFNj
aGVkQ29uZmlnJiBGdHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmlnOjpvcGVyYXRvcj0oRnRy
YWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRnRyYWNl
Q29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZzo6b3BlcmF0b3I9PShjb25zdCBGdHJhY2VDb25maWdf
Q29tcGFjdFNjaGVkQ29uZmlnJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVs
ZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgZW5hYmxlZF8gPT0gb3RoZXIuZW5h
YmxlZF87Cit9CisKK2Jvb2wgRnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZzo6UGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxk
c18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVy
bzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMu
UmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7Cisg
ICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmll
bGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7Cisg
ICAgICBjYXNlIDEgLyogZW5hYmxlZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZlbmFibGVkXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXpl
QW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAg
fQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3Rk
OjpzdHJpbmcgRnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZzo6U2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gRnRyYWNlQ29uZmlnX0Nv
bXBhY3RTY2hlZENvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3pl
cm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUo
bXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQg
RnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpN
ZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogZW5hYmxlZAorICBpZiAoX2hhc19m
aWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoMSwgZW5hYmxlZF8pOworICB9
CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVu
a25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30g
IC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRp
YWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9z
L3BlcmZldHRvL2NvbmZpZy9ncHUvZ3B1X2NvdW50ZXJfY29uZmlnLmdlbi5jYworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvZ3B1L2dw
dV9jb3VudGVyX2NvbmZpZy5nZW4uaAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkg
UGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BF
UkZFVFRPX0NPTkZJR19HUFVfR1BVX0NPVU5URVJfQ09ORklHX1BST1RPX0NQUF9IXworI2RlZmlu
ZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19HUFVfR1BVX0NPVU5URVJf
Q09ORklHX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0
c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlw
ZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0Lmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBn
ZW4geworY2xhc3MgR3B1Q291bnRlckNvbmZpZzsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bwor
fSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2Ug
cHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4g
eworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgR3B1Q291bnRlckNvbmZpZyA6IHB1YmxpYyA6OnBy
b3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7
CisgICAga0NvdW50ZXJQZXJpb2ROc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrQ291bnRlcklkc0Zp
ZWxkTnVtYmVyID0gMiwKKyAgICBrSW5zdHJ1bWVudGVkU2FtcGxpbmdGaWVsZE51bWJlciA9IDMs
CisgICAga0ZpeEdwdUNsb2NrRmllbGROdW1iZXIgPSA0LAorICB9OworCisgIEdwdUNvdW50ZXJD
b25maWcoKTsKKyAgfkdwdUNvdW50ZXJDb25maWcoKSBvdmVycmlkZTsKKyAgR3B1Q291bnRlckNv
bmZpZyhHcHVDb3VudGVyQ29uZmlnJiYpIG5vZXhjZXB0OworICBHcHVDb3VudGVyQ29uZmlnJiBv
cGVyYXRvcj0oR3B1Q291bnRlckNvbmZpZyYmKTsKKyAgR3B1Q291bnRlckNvbmZpZyhjb25zdCBH
cHVDb3VudGVyQ29uZmlnJik7CisgIEdwdUNvdW50ZXJDb25maWcmIG9wZXJhdG9yPShjb25zdCBH
cHVDb3VudGVyQ29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBHcHVDb3VudGVyQ29u
ZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHcHVDb3VudGVyQ29uZmlnJiBv
dGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90
PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6
cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfY291bnRlcl9wZXJpb2Rf
bnMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50NjRfdCBjb3VudGVy
X3BlcmlvZF9ucygpIGNvbnN0IHsgcmV0dXJuIGNvdW50ZXJfcGVyaW9kX25zXzsgfQorICB2b2lk
IHNldF9jb3VudGVyX3BlcmlvZF9ucyh1aW50NjRfdCB2YWx1ZSkgeyBjb3VudGVyX3BlcmlvZF9u
c18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgaW50IGNvdW50ZXJfaWRzX3Np
emUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50ZXJfaWRzXy5zaXplKCkp
OyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgY291bnRlcl9pZHMoKSBjb25zdCB7
IHJldHVybiBjb3VudGVyX2lkc187IH0KKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBtdXRhYmxl
X2NvdW50ZXJfaWRzKCkgeyByZXR1cm4gJmNvdW50ZXJfaWRzXzsgfQorICB2b2lkIGNsZWFyX2Nv
dW50ZXJfaWRzKCkgeyBjb3VudGVyX2lkc18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9jb3VudGVy
X2lkcyh1aW50MzJfdCB2YWx1ZSkgeyBjb3VudGVyX2lkc18uZW1wbGFjZV9iYWNrKHZhbHVlKTsg
fQorICB1aW50MzJfdCogYWRkX2NvdW50ZXJfaWRzKCkgeyBjb3VudGVyX2lkc18uZW1wbGFjZV9i
YWNrKCk7IHJldHVybiAmY291bnRlcl9pZHNfLmJhY2soKTsgfQorCisgIGJvb2wgaGFzX2luc3Ry
dW1lbnRlZF9zYW1wbGluZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGJv
b2wgaW5zdHJ1bWVudGVkX3NhbXBsaW5nKCkgY29uc3QgeyByZXR1cm4gaW5zdHJ1bWVudGVkX3Nh
bXBsaW5nXzsgfQorICB2b2lkIHNldF9pbnN0cnVtZW50ZWRfc2FtcGxpbmcoYm9vbCB2YWx1ZSkg
eyBpbnN0cnVtZW50ZWRfc2FtcGxpbmdfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQor
CisgIGJvb2wgaGFzX2ZpeF9ncHVfY2xvY2soKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0
XTsgfQorICBib29sIGZpeF9ncHVfY2xvY2soKSBjb25zdCB7IHJldHVybiBmaXhfZ3B1X2Nsb2Nr
XzsgfQorICB2b2lkIHNldF9maXhfZ3B1X2Nsb2NrKGJvb2wgdmFsdWUpIHsgZml4X2dwdV9jbG9j
a18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyBwcml2YXRlOgorICB1aW50NjRf
dCBjb3VudGVyX3BlcmlvZF9uc197fTsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGNvdW50ZXJf
aWRzXzsKKyAgYm9vbCBpbnN0cnVtZW50ZWRfc2FtcGxpbmdfe307CisgIGJvb2wgZml4X2dwdV9j
bG9ja197fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVs
ZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3Rv
IGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8
NT4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8g
bmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZF
VFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX0dQVV9HUFVfQ09VTlRFUl9DT05GSUdf
UFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJ
VC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBk
aWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1l
cXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJm
ZXR0by9jb25maWcvZ3B1L2dwdV9jb3VudGVyX2NvbmZpZy5nZW4uaCIKKworbmFtZXNwYWNlIHBl
cmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK0dwdUNvdW50
ZXJDb25maWc6OkdwdUNvdW50ZXJDb25maWcoKSA9IGRlZmF1bHQ7CitHcHVDb3VudGVyQ29uZmln
Ojp+R3B1Q291bnRlckNvbmZpZygpID0gZGVmYXVsdDsKK0dwdUNvdW50ZXJDb25maWc6OkdwdUNv
dW50ZXJDb25maWcoY29uc3QgR3B1Q291bnRlckNvbmZpZyYpID0gZGVmYXVsdDsKK0dwdUNvdW50
ZXJDb25maWcmIEdwdUNvdW50ZXJDb25maWc6Om9wZXJhdG9yPShjb25zdCBHcHVDb3VudGVyQ29u
ZmlnJikgPSBkZWZhdWx0OworR3B1Q291bnRlckNvbmZpZzo6R3B1Q291bnRlckNvbmZpZyhHcHVD
b3VudGVyQ29uZmlnJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0dwdUNvdW50ZXJDb25maWcmIEdw
dUNvdW50ZXJDb25maWc6Om9wZXJhdG9yPShHcHVDb3VudGVyQ29uZmlnJiYpID0gZGVmYXVsdDsK
KworYm9vbCBHcHVDb3VudGVyQ29uZmlnOjpvcGVyYXRvcj09KGNvbnN0IEdwdUNvdW50ZXJDb25m
aWcmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5r
bm93bl9maWVsZHNfCisgICAmJiBjb3VudGVyX3BlcmlvZF9uc18gPT0gb3RoZXIuY291bnRlcl9w
ZXJpb2RfbnNfCisgICAmJiBjb3VudGVyX2lkc18gPT0gb3RoZXIuY291bnRlcl9pZHNfCisgICAm
JiBpbnN0cnVtZW50ZWRfc2FtcGxpbmdfID09IG90aGVyLmluc3RydW1lbnRlZF9zYW1wbGluZ18K
KyAgICYmIGZpeF9ncHVfY2xvY2tfID09IG90aGVyLmZpeF9ncHVfY2xvY2tfOworfQorCitib29s
IEdwdUNvdW50ZXJDb25maWc6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90
IHNpemUpIHsKKyAgY291bnRlcl9pZHNfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVh
cigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90
b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAo
ZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0
KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNh
c2UgMSAvKiBjb3VudGVyX3BlcmlvZF9ucyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZjb3VudGVy
X3BlcmlvZF9uc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBjb3VudGVyX2lk
cyAqLzoKKyAgICAgICAgY291bnRlcl9pZHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVs
ZC5nZXQoJmNvdW50ZXJfaWRzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
MyAvKiBpbnN0cnVtZW50ZWRfc2FtcGxpbmcgKi86CisgICAgICAgIGZpZWxkLmdldCgmaW5zdHJ1
bWVudGVkX3NhbXBsaW5nXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIGZpeF9n
cHVfY2xvY2sgKi86CisgICAgICAgIGZpZWxkLmdldCgmZml4X2dwdV9jbG9ja18pOworICAgICAg
ICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVu
ZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0
dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5n
IEdwdUNvdW50ZXJDb25maWc6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0
ZDo6dmVjdG9yPHVpbnQ4X3Q+IEdwdUNvdW50ZXJDb25maWc6OlNlcmlhbGl6ZUFzQXJyYXkoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNB
cnJheSgpOworfQorCit2b2lkIEdwdUNvdW50ZXJDb25maWc6OlNlcmlhbGl6ZSg6OnByb3RvemVy
bzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGNvdW50ZXJfcGVyaW9kX25z
CisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGNvdW50
ZXJfcGVyaW9kX25zXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBjb3VudGVyX2lkcworICBmb3Ig
KGF1dG8mIGl0IDogY291bnRlcl9pZHNfKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgaXQp
OworICB9CisKKyAgLy8gRmllbGQgMzogaW5zdHJ1bWVudGVkX3NhbXBsaW5nCisgIGlmIChfaGFz
X2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgzLCBpbnN0cnVtZW50ZWRf
c2FtcGxpbmdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IGZpeF9ncHVfY2xvY2sKKyAgaWYgKF9o
YXNfZmllbGRfWzRdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDQsIGZpeF9ncHVfY2xv
Y2tfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18u
ZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJh
Z21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTog
Z2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvZ3B1L3Z1bGthbl9tZW1vcnlfY29uZmlnLmdlbi5j
YworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9j
b25maWcvZ3B1L3Z1bGthbl9tZW1vcnlfY29uZmlnLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0
b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX0dQVV9WVUxLQU5fTUVNT1JZX0NPTkZJR19QUk9U
T19DUFBfSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdf
R1BVX1ZVTEtBTl9NRU1PUllfQ09ORklHX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50
Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJp
bmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5
YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJv
dG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgVnVsa2FuTWVtb3J5Q29uZmlnOworfSAgLy8g
bmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3Bh
Y2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5h
bWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90
b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBWdWxrYW5NZW1v
cnlDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoK
KyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtUcmFja0RyaXZlck1lbW9yeVVzYWdlRmllbGRO
dW1iZXIgPSAxLAorICAgIGtUcmFja0RldmljZU1lbW9yeVVzYWdlRmllbGROdW1iZXIgPSAyLAor
ICB9OworCisgIFZ1bGthbk1lbW9yeUNvbmZpZygpOworICB+VnVsa2FuTWVtb3J5Q29uZmlnKCkg
b3ZlcnJpZGU7CisgIFZ1bGthbk1lbW9yeUNvbmZpZyhWdWxrYW5NZW1vcnlDb25maWcmJikgbm9l
eGNlcHQ7CisgIFZ1bGthbk1lbW9yeUNvbmZpZyYgb3BlcmF0b3I9KFZ1bGthbk1lbW9yeUNvbmZp
ZyYmKTsKKyAgVnVsa2FuTWVtb3J5Q29uZmlnKGNvbnN0IFZ1bGthbk1lbW9yeUNvbmZpZyYpOwor
ICBWdWxrYW5NZW1vcnlDb25maWcmIG9wZXJhdG9yPShjb25zdCBWdWxrYW5NZW1vcnlDb25maWcm
KTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1bGthbk1lbW9yeUNvbmZpZyYpIGNvbnN0Owor
ICBib29sIG9wZXJhdG9yIT0oY29uc3QgVnVsa2FuTWVtb3J5Q29uZmlnJiBvdGhlcikgY29uc3Qg
eyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNv
bnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0
cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVB
c0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpN
ZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfdHJhY2tfZHJpdmVyX21lbW9yeV91c2FnZSgp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIGJvb2wgdHJhY2tfZHJpdmVyX21l
bW9yeV91c2FnZSgpIGNvbnN0IHsgcmV0dXJuIHRyYWNrX2RyaXZlcl9tZW1vcnlfdXNhZ2VfOyB9
CisgIHZvaWQgc2V0X3RyYWNrX2RyaXZlcl9tZW1vcnlfdXNhZ2UoYm9vbCB2YWx1ZSkgeyB0cmFj
a19kcml2ZXJfbWVtb3J5X3VzYWdlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKwor
ICBib29sIGhhc190cmFja19kZXZpY2VfbWVtb3J5X3VzYWdlKCkgY29uc3QgeyByZXR1cm4gX2hh
c19maWVsZF9bMl07IH0KKyAgYm9vbCB0cmFja19kZXZpY2VfbWVtb3J5X3VzYWdlKCkgY29uc3Qg
eyByZXR1cm4gdHJhY2tfZGV2aWNlX21lbW9yeV91c2FnZV87IH0KKyAgdm9pZCBzZXRfdHJhY2tf
ZGV2aWNlX21lbW9yeV91c2FnZShib29sIHZhbHVlKSB7IHRyYWNrX2RldmljZV9tZW1vcnlfdXNh
Z2VfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToKKyAgYm9vbCB0
cmFja19kcml2ZXJfbWVtb3J5X3VzYWdlX3t9OworICBib29sIHRyYWNrX2RldmljZV9tZW1vcnlf
dXNhZ2Vfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmll
bGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90
byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0
PDM+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8v
IG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19HUFVfVlVMS0FOX01FTU9SWV9DT05G
SUdfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1Qg
RURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdD
QyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9h
dC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9w
ZXJmZXR0by9jb25maWcvZ3B1L3Z1bGthbl9tZW1vcnlfY29uZmlnLmdlbi5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworVnVs
a2FuTWVtb3J5Q29uZmlnOjpWdWxrYW5NZW1vcnlDb25maWcoKSA9IGRlZmF1bHQ7CitWdWxrYW5N
ZW1vcnlDb25maWc6On5WdWxrYW5NZW1vcnlDb25maWcoKSA9IGRlZmF1bHQ7CitWdWxrYW5NZW1v
cnlDb25maWc6OlZ1bGthbk1lbW9yeUNvbmZpZyhjb25zdCBWdWxrYW5NZW1vcnlDb25maWcmKSA9
IGRlZmF1bHQ7CitWdWxrYW5NZW1vcnlDb25maWcmIFZ1bGthbk1lbW9yeUNvbmZpZzo6b3BlcmF0
b3I9KGNvbnN0IFZ1bGthbk1lbW9yeUNvbmZpZyYpID0gZGVmYXVsdDsKK1Z1bGthbk1lbW9yeUNv
bmZpZzo6VnVsa2FuTWVtb3J5Q29uZmlnKFZ1bGthbk1lbW9yeUNvbmZpZyYmKSBub2V4Y2VwdCA9
IGRlZmF1bHQ7CitWdWxrYW5NZW1vcnlDb25maWcmIFZ1bGthbk1lbW9yeUNvbmZpZzo6b3BlcmF0
b3I9KFZ1bGthbk1lbW9yeUNvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgVnVsa2FuTWVtb3J5
Q29uZmlnOjpvcGVyYXRvcj09KGNvbnN0IFZ1bGthbk1lbW9yeUNvbmZpZyYgb3RoZXIpIGNvbnN0
IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAg
ICYmIHRyYWNrX2RyaXZlcl9tZW1vcnlfdXNhZ2VfID09IG90aGVyLnRyYWNrX2RyaXZlcl9tZW1v
cnlfdXNhZ2VfCisgICAmJiB0cmFja19kZXZpY2VfbWVtb3J5X3VzYWdlXyA9PSBvdGhlci50cmFj
a19kZXZpY2VfbWVtb3J5X3VzYWdlXzsKK30KKworYm9vbCBWdWxrYW5NZW1vcnlDb25maWc6OlBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9m
aWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90
b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0g
ZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkg
eworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFz
X2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkg
eworICAgICAgY2FzZSAxIC8qIHRyYWNrX2RyaXZlcl9tZW1vcnlfdXNhZ2UgKi86CisgICAgICAg
IGZpZWxkLmdldCgmdHJhY2tfZHJpdmVyX21lbW9yeV91c2FnZV8pOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgMiAvKiB0cmFja19kZXZpY2VfbWVtb3J5X3VzYWdlICovOgorICAgICAgICBm
aWVsZC5nZXQoJnRyYWNrX2RldmljZV9tZW1vcnlfdXNhZ2VfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93
bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2Vk
X2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBWdWxrYW5NZW1v
cnlDb25maWc6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVh
cEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0
KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9y
PHVpbnQ4X3Q+IFZ1bGthbk1lbW9yeUNvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsK
KyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOwor
ICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7
Cit9CisKK3ZvaWQgVnVsa2FuTWVtb3J5Q29uZmlnOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiB0cmFja19kcml2ZXJfbWVtb3J5X3Vz
YWdlCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgx
LCB0cmFja19kcml2ZXJfbWVtb3J5X3VzYWdlXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiB0cmFj
a19kZXZpY2VfbWVtb3J5X3VzYWdlCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+
QXBwZW5kVGlueVZhckludCgyLCB0cmFja19kZXZpY2VfbWVtb3J5X3VzYWdlXyk7CisgIH0KKwor
ICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93
bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8g
bmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25v
c3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVy
ZmV0dG8vY29uZmlnL2lub2RlX2ZpbGUvaW5vZGVfZmlsZV9jb25maWcuZ2VuLmNjCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9pbm9k
ZV9maWxlL2lub2RlX2ZpbGVfY29uZmlnLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVy
YXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fQ09ORklHX0lOT0RFX0ZJTEVfSU5PREVfRklMRV9DT05GSUdfUFJPVE9f
Q1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX0lO
T0RFX0ZJTEVfSU5PREVfRklMRV9DT05GSUdfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRp
bnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0
cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2Nv
cHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBw
cm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBJbm9kZUZpbGVDb25maWc7CitjbGFzcyBJ
bm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeTsKK30gIC8vIG5hbWVzcGFjZSBw
ZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCitu
YW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJv
dG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVz
cGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgSW5vZGVGaWxlQ29uZmlnIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIE1vdW50
UG9pbnRNYXBwaW5nRW50cnkgPSBJbm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRy
eTsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtTY2FuSW50ZXJ2YWxNc0ZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrU2NhbkRlbGF5TXNGaWVsZE51bWJlciA9IDIsCisgICAga1NjYW5CYXRjaFNp
emVGaWVsZE51bWJlciA9IDMsCisgICAga0RvTm90U2NhbkZpZWxkTnVtYmVyID0gNCwKKyAgICBr
U2Nhbk1vdW50UG9pbnRzRmllbGROdW1iZXIgPSA1LAorICAgIGtNb3VudFBvaW50TWFwcGluZ0Zp
ZWxkTnVtYmVyID0gNiwKKyAgfTsKKworICBJbm9kZUZpbGVDb25maWcoKTsKKyAgfklub2RlRmls
ZUNvbmZpZygpIG92ZXJyaWRlOworICBJbm9kZUZpbGVDb25maWcoSW5vZGVGaWxlQ29uZmlnJiYp
IG5vZXhjZXB0OworICBJbm9kZUZpbGVDb25maWcmIG9wZXJhdG9yPShJbm9kZUZpbGVDb25maWcm
Jik7CisgIElub2RlRmlsZUNvbmZpZyhjb25zdCBJbm9kZUZpbGVDb25maWcmKTsKKyAgSW5vZGVG
aWxlQ29uZmlnJiBvcGVyYXRvcj0oY29uc3QgSW5vZGVGaWxlQ29uZmlnJik7CisgIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBJbm9kZUZpbGVDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IElub2RlRmlsZUNvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0g
b3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBv
dmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlk
ZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJy
aWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisg
IGJvb2wgaGFzX3NjYW5faW50ZXJ2YWxfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sx
XTsgfQorICB1aW50MzJfdCBzY2FuX2ludGVydmFsX21zKCkgY29uc3QgeyByZXR1cm4gc2Nhbl9p
bnRlcnZhbF9tc187IH0KKyAgdm9pZCBzZXRfc2Nhbl9pbnRlcnZhbF9tcyh1aW50MzJfdCB2YWx1
ZSkgeyBzY2FuX2ludGVydmFsX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKwor
ICBib29sIGhhc19zY2FuX2RlbGF5X21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07
IH0KKyAgdWludDMyX3Qgc2Nhbl9kZWxheV9tcygpIGNvbnN0IHsgcmV0dXJuIHNjYW5fZGVsYXlf
bXNfOyB9CisgIHZvaWQgc2V0X3NjYW5fZGVsYXlfbXModWludDMyX3QgdmFsdWUpIHsgc2Nhbl9k
ZWxheV9tc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfc2Nh
bl9iYXRjaF9zaXplKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDMy
X3Qgc2Nhbl9iYXRjaF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2Nhbl9iYXRjaF9zaXplXzsgfQor
ICB2b2lkIHNldF9zY2FuX2JhdGNoX3NpemUodWludDMyX3QgdmFsdWUpIHsgc2Nhbl9iYXRjaF9z
aXplXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29sIGhhc19kb19ub3Rf
c2NhbigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIGJvb2wgZG9fbm90X3Nj
YW4oKSBjb25zdCB7IHJldHVybiBkb19ub3Rfc2Nhbl87IH0KKyAgdm9pZCBzZXRfZG9fbm90X3Nj
YW4oYm9vbCB2YWx1ZSkgeyBkb19ub3Rfc2Nhbl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQp
OyB9CisKKyAgaW50IHNjYW5fbW91bnRfcG9pbnRzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0
aWNfY2FzdDxpbnQ+KHNjYW5fbW91bnRfcG9pbnRzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6
dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc2Nhbl9tb3VudF9wb2ludHMoKSBjb25zdCB7IHJldHVybiBz
Y2FuX21vdW50X3BvaW50c187IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBtdXRhYmxl
X3NjYW5fbW91bnRfcG9pbnRzKCkgeyByZXR1cm4gJnNjYW5fbW91bnRfcG9pbnRzXzsgfQorICB2
b2lkIGNsZWFyX3NjYW5fbW91bnRfcG9pbnRzKCkgeyBzY2FuX21vdW50X3BvaW50c18uY2xlYXIo
KTsgfQorICB2b2lkIGFkZF9zY2FuX21vdW50X3BvaW50cyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBz
Y2FuX21vdW50X3BvaW50c18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBzdGQ6OnN0cmluZyog
YWRkX3NjYW5fbW91bnRfcG9pbnRzKCkgeyBzY2FuX21vdW50X3BvaW50c18uZW1wbGFjZV9iYWNr
KCk7IHJldHVybiAmc2Nhbl9tb3VudF9wb2ludHNfLmJhY2soKTsgfQorCisgIGludCBtb3VudF9w
b2ludF9tYXBwaW5nX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1vdW50
X3BvaW50X21hcHBpbmdfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8SW5vZGVGaWxl
Q29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnk+JiBtb3VudF9wb2ludF9tYXBwaW5nKCkgY29u
c3QgeyByZXR1cm4gbW91bnRfcG9pbnRfbWFwcGluZ187IH0KKyAgc3RkOjp2ZWN0b3I8SW5vZGVG
aWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnk+KiBtdXRhYmxlX21vdW50X3BvaW50X21h
cHBpbmcoKSB7IHJldHVybiAmbW91bnRfcG9pbnRfbWFwcGluZ187IH0KKyAgdm9pZCBjbGVhcl9t
b3VudF9wb2ludF9tYXBwaW5nKCkgeyBtb3VudF9wb2ludF9tYXBwaW5nXy5jbGVhcigpOyB9Cisg
IElub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5KiBhZGRfbW91bnRfcG9pbnRf
bWFwcGluZygpIHsgbW91bnRfcG9pbnRfbWFwcGluZ18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAm
bW91bnRfcG9pbnRfbWFwcGluZ18uYmFjaygpOyB9CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBz
Y2FuX2ludGVydmFsX21zX3t9OworICB1aW50MzJfdCBzY2FuX2RlbGF5X21zX3t9OworICB1aW50
MzJfdCBzY2FuX2JhdGNoX3NpemVfe307CisgIGJvb2wgZG9fbm90X3NjYW5fe307CisgIHN0ZDo6
dmVjdG9yPHN0ZDo6c3RyaW5nPiBzY2FuX21vdW50X3BvaW50c187CisgIHN0ZDo6dmVjdG9yPElu
b2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5PiBtb3VudF9wb2ludF9tYXBwaW5n
XzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9y
IGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVz
LgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Nz4gX2hh
c19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIElub2RlRmlsZUNvbmZp
Z19Nb3VudFBvaW50TWFwcGluZ0VudHJ5IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdl
T2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrTW91bnRwb2ludEZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrU2NhblJvb3RzRmllbGROdW1iZXIgPSAyLAorICB9OworCisg
IElub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5KCk7CisgIH5Jbm9kZUZpbGVD
b25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeSgpIG92ZXJyaWRlOworICBJbm9kZUZpbGVDb25m
aWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeShJbm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBp
bmdFbnRyeSYmKSBub2V4Y2VwdDsKKyAgSW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5n
RW50cnkmIG9wZXJhdG9yPShJbm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeSYm
KTsKKyAgSW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnkoY29uc3QgSW5vZGVG
aWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnkmKTsKKyAgSW5vZGVGaWxlQ29uZmlnX01v
dW50UG9pbnRNYXBwaW5nRW50cnkmIG9wZXJhdG9yPShjb25zdCBJbm9kZUZpbGVDb25maWdfTW91
bnRQb2ludE1hcHBpbmdFbnRyeSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5vZGVGaWxl
Q29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnkmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IElub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5JiBvdGhlcikgY29u
c3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5
KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVB
c1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxp
emVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJv
OjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfbW91bnRwb2ludCgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudHBvaW50KCkg
Y29uc3QgeyByZXR1cm4gbW91bnRwb2ludF87IH0KKyAgdm9pZCBzZXRfbW91bnRwb2ludChjb25z
dCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgbW91bnRwb2ludF8gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDEpOyB9CisKKyAgaW50IHNjYW5fcm9vdHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRp
Y19jYXN0PGludD4oc2Nhbl9yb290c18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjxz
dGQ6OnN0cmluZz4mIHNjYW5fcm9vdHMoKSBjb25zdCB7IHJldHVybiBzY2FuX3Jvb3RzXzsgfQor
ICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfc2Nhbl9yb290cygpIHsgcmV0dXJu
ICZzY2FuX3Jvb3RzXzsgfQorICB2b2lkIGNsZWFyX3NjYW5fcm9vdHMoKSB7IHNjYW5fcm9vdHNf
LmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfc2Nhbl9yb290cyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBz
Y2FuX3Jvb3RzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRfc2Nh
bl9yb290cygpIHsgc2Nhbl9yb290c18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmc2Nhbl9yb290
c18uYmFjaygpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBtb3VudHBvaW50X3t9Owor
ICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2Nhbl9yb290c187CisKKyAgLy8gQWxsb3dzIHRv
IHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8v
IHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5r
bm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9OworCit9
ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5h
bWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X0NPTkZJR19JTk9ERV9GSUxFX0lOT0RFX0ZJTEVfQ09ORklHX1BST1RPX0NQUF9IXworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3Nh
Z2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Nj
YXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkg
UGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJh
Z21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2lub2RlX2Zp
bGUvaW5vZGVfZmlsZV9jb25maWcuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitJbm9kZUZpbGVDb25maWc6Oklub2Rl
RmlsZUNvbmZpZygpID0gZGVmYXVsdDsKK0lub2RlRmlsZUNvbmZpZzo6fklub2RlRmlsZUNvbmZp
ZygpID0gZGVmYXVsdDsKK0lub2RlRmlsZUNvbmZpZzo6SW5vZGVGaWxlQ29uZmlnKGNvbnN0IElu
b2RlRmlsZUNvbmZpZyYpID0gZGVmYXVsdDsKK0lub2RlRmlsZUNvbmZpZyYgSW5vZGVGaWxlQ29u
ZmlnOjpvcGVyYXRvcj0oY29uc3QgSW5vZGVGaWxlQ29uZmlnJikgPSBkZWZhdWx0OworSW5vZGVG
aWxlQ29uZmlnOjpJbm9kZUZpbGVDb25maWcoSW5vZGVGaWxlQ29uZmlnJiYpIG5vZXhjZXB0ID0g
ZGVmYXVsdDsKK0lub2RlRmlsZUNvbmZpZyYgSW5vZGVGaWxlQ29uZmlnOjpvcGVyYXRvcj0oSW5v
ZGVGaWxlQ29uZmlnJiYpID0gZGVmYXVsdDsKKworYm9vbCBJbm9kZUZpbGVDb25maWc6Om9wZXJh
dG9yPT0oY29uc3QgSW5vZGVGaWxlQ29uZmlnJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5r
bm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgc2Nhbl9pbnRlcnZh
bF9tc18gPT0gb3RoZXIuc2Nhbl9pbnRlcnZhbF9tc18KKyAgICYmIHNjYW5fZGVsYXlfbXNfID09
IG90aGVyLnNjYW5fZGVsYXlfbXNfCisgICAmJiBzY2FuX2JhdGNoX3NpemVfID09IG90aGVyLnNj
YW5fYmF0Y2hfc2l6ZV8KKyAgICYmIGRvX25vdF9zY2FuXyA9PSBvdGhlci5kb19ub3Rfc2Nhbl8K
KyAgICYmIHNjYW5fbW91bnRfcG9pbnRzXyA9PSBvdGhlci5zY2FuX21vdW50X3BvaW50c18KKyAg
ICYmIG1vdW50X3BvaW50X21hcHBpbmdfID09IG90aGVyLm1vdW50X3BvaW50X21hcHBpbmdfOwor
fQorCitib29sIElub2RlRmlsZUNvbmZpZzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3
LCBzaXplX3Qgc2l6ZSkgeworICBzY2FuX21vdW50X3BvaW50c18uY2xlYXIoKTsKKyAgbW91bnRf
cG9pbnRfbWFwcGluZ18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHNj
YW5faW50ZXJ2YWxfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmc2Nhbl9pbnRlcnZhbF9tc18p
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBzY2FuX2RlbGF5X21zICovOgorICAg
ICAgICBmaWVsZC5nZXQoJnNjYW5fZGVsYXlfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDMgLyogc2Nhbl9iYXRjaF9zaXplICovOgorICAgICAgICBmaWVsZC5nZXQoJnNjYW5fYmF0
Y2hfc2l6ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBkb19ub3Rfc2NhbiAq
LzoKKyAgICAgICAgZmllbGQuZ2V0KCZkb19ub3Rfc2Nhbl8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgNSAvKiBzY2FuX21vdW50X3BvaW50cyAqLzoKKyAgICAgICAgc2Nhbl9tb3VudF9w
b2ludHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJnNjYW5fbW91bnRfcG9p
bnRzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAvKiBtb3VudF9wb2lu
dF9tYXBwaW5nICovOgorICAgICAgICBtb3VudF9wb2ludF9tYXBwaW5nXy5lbXBsYWNlX2JhY2so
KTsKKyAgICAgICAgbW91bnRfcG9pbnRfbWFwcGluZ18uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhm
aWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAg
ICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5i
eXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIElub2RlRmlsZUNvbmZpZzo6U2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cu
U2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gSW5vZGVGaWxl
Q29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1
ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkp
OworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBJbm9kZUZpbGVD
b25maWc6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8v
IEZpZWxkIDE6IHNjYW5faW50ZXJ2YWxfbXMKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAg
bXNnLT5BcHBlbmRWYXJJbnQoMSwgc2Nhbl9pbnRlcnZhbF9tc18pOworICB9CisKKyAgLy8gRmll
bGQgMjogc2Nhbl9kZWxheV9tcworICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFw
cGVuZFZhckludCgyLCBzY2FuX2RlbGF5X21zXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBzY2Fu
X2JhdGNoX3NpemUKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJ
bnQoMywgc2Nhbl9iYXRjaF9zaXplXyk7CisgIH0KKworICAvLyBGaWVsZCA0OiBkb19ub3Rfc2Nh
bgorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNCwg
ZG9fbm90X3NjYW5fKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IHNjYW5fbW91bnRfcG9pbnRzCisg
IGZvciAoYXV0byYgaXQgOiBzY2FuX21vdW50X3BvaW50c18pIHsKKyAgICBtc2ctPkFwcGVuZFN0
cmluZyg1LCBpdCk7CisgIH0KKworICAvLyBGaWVsZCA2OiBtb3VudF9wb2ludF9tYXBwaW5nCisg
IGZvciAoYXV0byYgaXQgOiBtb3VudF9wb2ludF9tYXBwaW5nXykgeworICAgIGl0LlNlcmlhbGl6
ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oNikpOworICB9
CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVu
a25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0lub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50
TWFwcGluZ0VudHJ5OjpJbm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeSgpID0g
ZGVmYXVsdDsKK0lub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5Ojp+SW5vZGVG
aWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnkoKSA9IGRlZmF1bHQ7CitJbm9kZUZpbGVD
b25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeTo6SW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRN
YXBwaW5nRW50cnkoY29uc3QgSW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnkm
KSA9IGRlZmF1bHQ7CitJbm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeSYgSW5v
ZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnk6Om9wZXJhdG9yPShjb25zdCBJbm9k
ZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeSYpID0gZGVmYXVsdDsKK0lub2RlRmls
ZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5OjpJbm9kZUZpbGVDb25maWdfTW91bnRQb2lu
dE1hcHBpbmdFbnRyeShJbm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeSYmKSBu
b2V4Y2VwdCA9IGRlZmF1bHQ7CitJbm9kZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRy
eSYgSW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnk6Om9wZXJhdG9yPShJbm9k
ZUZpbGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wg
SW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnk6Om9wZXJhdG9yPT0oY29uc3Qg
SW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnkmIG90aGVyKSBjb25zdCB7Cisg
IHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBt
b3VudHBvaW50XyA9PSBvdGhlci5tb3VudHBvaW50XworICAgJiYgc2Nhbl9yb290c18gPT0gb3Ro
ZXIuc2Nhbl9yb290c187Cit9CisKK2Jvb2wgSW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBw
aW5nRW50cnk6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsK
KyAgc2Nhbl9yb290c18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIG1v
dW50cG9pbnQgKi86CisgICAgICAgIGZpZWxkLmdldCgmbW91bnRwb2ludF8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgMiAvKiBzY2FuX3Jvb3RzICovOgorICAgICAgICBzY2FuX3Jvb3Rz
Xy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgZmllbGQuZ2V0KCZzY2FuX3Jvb3RzXy5iYWNrKCkp
OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6
ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9Cisg
IH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0
ZDo6c3RyaW5nIElub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5OjpTZXJpYWxp
emVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3Rv
emVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1z
Zy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBJbm9kZUZp
bGVDb25maWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0
IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNn
OworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5
KCk7Cit9CisKK3ZvaWQgSW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnk6OlNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6
IG1vdW50cG9pbnQKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJp
bmcoMSwgbW91bnRwb2ludF8pOworICB9CisKKyAgLy8gRmllbGQgMjogc2Nhbl9yb290cworICBm
b3IgKGF1dG8mIGl0IDogc2Nhbl9yb290c18pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZygyLCBp
dCk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRh
dGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJm
ZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdt
YSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdl
bi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3Bvd2VyL2FuZHJvaWRfcG93ZXJfY29uZmlnLmdlbi5j
YworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9j
b25maWcvcG93ZXIvYW5kcm9pZF9wb3dlcl9jb25maWcuZ2VuLmgKKy8vIERPIE5PVCBFRElULiBB
dXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9f
UFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfUE9XRVJfQU5EUk9JRF9QT1dFUl9DT05GSUdf
UFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09O
RklHX1BPV0VSX0FORFJPSURfUE9XRVJfQ09ORklHX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8
c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRl
IDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3Bh
Y2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgQW5kcm9pZFBvd2VyQ29uZmlnOwor
ZW51bSBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzIDogaW50OworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2Ug
Z2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVz
cGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mg
eworbmFtZXNwYWNlIGdlbiB7CitlbnVtIEFuZHJvaWRQb3dlckNvbmZpZ19CYXR0ZXJ5Q291bnRl
cnMgOiBpbnQgeworICBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRFUllf
Q09VTlRFUl9VTlNQRUNJRklFRCA9IDAsCisgIEFuZHJvaWRQb3dlckNvbmZpZ19CYXR0ZXJ5Q291
bnRlcnNfQkFUVEVSWV9DT1VOVEVSX0NIQVJHRSA9IDEsCisgIEFuZHJvaWRQb3dlckNvbmZpZ19C
YXR0ZXJ5Q291bnRlcnNfQkFUVEVSWV9DT1VOVEVSX0NBUEFDSVRZX1BFUkNFTlQgPSAyLAorICBB
bmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRFUllfQ09VTlRFUl9DVVJSRU5U
ID0gMywKKyAgQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVyc19CQVRURVJZX0NPVU5U
RVJfQ1VSUkVOVF9BVkcgPSA0LAorfTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEFuZHJvaWRQ
b3dlckNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGlj
OgorICB1c2luZyBCYXR0ZXJ5Q291bnRlcnMgPSBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNv
dW50ZXJzOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQkFUVEVSWV9DT1VOVEVSX1VOU1BFQ0lG
SUVEID0gQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVyc19CQVRURVJZX0NPVU5URVJf
VU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCQVRURVJZX0NPVU5URVJfQ0hB
UkdFID0gQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVyc19CQVRURVJZX0NPVU5URVJf
Q0hBUkdFOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQkFUVEVSWV9DT1VOVEVSX0NBUEFDSVRZ
X1BFUkNFTlQgPSBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRFUllfQ09V
TlRFUl9DQVBBQ0lUWV9QRVJDRU5UOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQkFUVEVSWV9D
T1VOVEVSX0NVUlJFTlQgPSBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRF
UllfQ09VTlRFUl9DVVJSRU5UOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQkFUVEVSWV9DT1VO
VEVSX0NVUlJFTlRfQVZHID0gQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVyc19CQVRU
RVJZX0NPVU5URVJfQ1VSUkVOVF9BVkc7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCYXR0ZXJ5
Q291bnRlcnNfTUlOID0gQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVyc19CQVRURVJZ
X0NPVU5URVJfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCYXR0ZXJ5Q291
bnRlcnNfTUFYID0gQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVyc19CQVRURVJZX0NP
VU5URVJfQ1VSUkVOVF9BVkc7CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrQmF0dGVyeVBv
bGxNc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrQmF0dGVyeUNvdW50ZXJzRmllbGROdW1iZXIgPSAy
LAorICAgIGtDb2xsZWN0UG93ZXJSYWlsc0ZpZWxkTnVtYmVyID0gMywKKyAgfTsKKworICBBbmRy
b2lkUG93ZXJDb25maWcoKTsKKyAgfkFuZHJvaWRQb3dlckNvbmZpZygpIG92ZXJyaWRlOworICBB
bmRyb2lkUG93ZXJDb25maWcoQW5kcm9pZFBvd2VyQ29uZmlnJiYpIG5vZXhjZXB0OworICBBbmRy
b2lkUG93ZXJDb25maWcmIG9wZXJhdG9yPShBbmRyb2lkUG93ZXJDb25maWcmJik7CisgIEFuZHJv
aWRQb3dlckNvbmZpZyhjb25zdCBBbmRyb2lkUG93ZXJDb25maWcmKTsKKyAgQW5kcm9pZFBvd2Vy
Q29uZmlnJiBvcGVyYXRvcj0oY29uc3QgQW5kcm9pZFBvd2VyQ29uZmlnJik7CisgIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBBbmRyb2lkUG93ZXJDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IEFuZHJvaWRQb3dlckNvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRo
aXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6
ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBv
dmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0
IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0
OworCisgIGJvb2wgaGFzX2JhdHRlcnlfcG9sbF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzFdOyB9CisgIHVpbnQzMl90IGJhdHRlcnlfcG9sbF9tcygpIGNvbnN0IHsgcmV0dXJuIGJh
dHRlcnlfcG9sbF9tc187IH0KKyAgdm9pZCBzZXRfYmF0dGVyeV9wb2xsX21zKHVpbnQzMl90IHZh
bHVlKSB7IGJhdHRlcnlfcG9sbF9tc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisK
KyAgaW50IGJhdHRlcnlfY291bnRlcnNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0
PGludD4oYmF0dGVyeV9jb3VudGVyc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxB
bmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzPiYgYmF0dGVyeV9jb3VudGVycygpIGNv
bnN0IHsgcmV0dXJuIGJhdHRlcnlfY291bnRlcnNfOyB9CisgIHN0ZDo6dmVjdG9yPEFuZHJvaWRQ
b3dlckNvbmZpZ19CYXR0ZXJ5Q291bnRlcnM+KiBtdXRhYmxlX2JhdHRlcnlfY291bnRlcnMoKSB7
IHJldHVybiAmYmF0dGVyeV9jb3VudGVyc187IH0KKyAgdm9pZCBjbGVhcl9iYXR0ZXJ5X2NvdW50
ZXJzKCkgeyBiYXR0ZXJ5X2NvdW50ZXJzXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX2JhdHRlcnlf
Y291bnRlcnMoQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVycyB2YWx1ZSkgeyBiYXR0
ZXJ5X2NvdW50ZXJzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIEFuZHJvaWRQb3dlckNvbmZp
Z19CYXR0ZXJ5Q291bnRlcnMqIGFkZF9iYXR0ZXJ5X2NvdW50ZXJzKCkgeyBiYXR0ZXJ5X2NvdW50
ZXJzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZiYXR0ZXJ5X2NvdW50ZXJzXy5iYWNrKCk7IH0K
KworICBib29sIGhhc19jb2xsZWN0X3Bvd2VyX3JhaWxzKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bM107IH0KKyAgYm9vbCBjb2xsZWN0X3Bvd2VyX3JhaWxzKCkgY29uc3QgeyByZXR1cm4g
Y29sbGVjdF9wb3dlcl9yYWlsc187IH0KKyAgdm9pZCBzZXRfY29sbGVjdF9wb3dlcl9yYWlscyhi
b29sIHZhbHVlKSB7IGNvbGxlY3RfcG93ZXJfcmFpbHNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgzKTsgfQorCisgcHJpdmF0ZToKKyAgdWludDMyX3QgYmF0dGVyeV9wb2xsX21zX3t9OworICBz
dGQ6OnZlY3RvcjxBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzPiBiYXR0ZXJ5X2Nv
dW50ZXJzXzsKKyAgYm9vbCBjb2xsZWN0X3Bvd2VyX3JhaWxzX3t9OworCisgIC8vIEFsbG93cyB0
byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAv
LyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVu
a25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw0PiBfaGFzX2ZpZWxkX3t9OworfTsKKwor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBu
YW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19DT05GSUdfUE9XRVJfQU5EUk9JRF9QT1dFUl9DT05GSUdfUFJPVE9fQ1BQX0hfCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2Fn
ZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2Nh
dHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQ
ZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFn
bWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvcG93ZXIvYW5k
cm9pZF9wb3dlcl9jb25maWcuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3Bh
Y2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitBbmRyb2lkUG93ZXJDb25maWc6OkFuZHJv
aWRQb3dlckNvbmZpZygpID0gZGVmYXVsdDsKK0FuZHJvaWRQb3dlckNvbmZpZzo6fkFuZHJvaWRQ
b3dlckNvbmZpZygpID0gZGVmYXVsdDsKK0FuZHJvaWRQb3dlckNvbmZpZzo6QW5kcm9pZFBvd2Vy
Q29uZmlnKGNvbnN0IEFuZHJvaWRQb3dlckNvbmZpZyYpID0gZGVmYXVsdDsKK0FuZHJvaWRQb3dl
ckNvbmZpZyYgQW5kcm9pZFBvd2VyQ29uZmlnOjpvcGVyYXRvcj0oY29uc3QgQW5kcm9pZFBvd2Vy
Q29uZmlnJikgPSBkZWZhdWx0OworQW5kcm9pZFBvd2VyQ29uZmlnOjpBbmRyb2lkUG93ZXJDb25m
aWcoQW5kcm9pZFBvd2VyQ29uZmlnJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0FuZHJvaWRQb3dl
ckNvbmZpZyYgQW5kcm9pZFBvd2VyQ29uZmlnOjpvcGVyYXRvcj0oQW5kcm9pZFBvd2VyQ29uZmln
JiYpID0gZGVmYXVsdDsKKworYm9vbCBBbmRyb2lkUG93ZXJDb25maWc6Om9wZXJhdG9yPT0oY29u
c3QgQW5kcm9pZFBvd2VyQ29uZmlnJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9m
aWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgYmF0dGVyeV9wb2xsX21zXyA9
PSBvdGhlci5iYXR0ZXJ5X3BvbGxfbXNfCisgICAmJiBiYXR0ZXJ5X2NvdW50ZXJzXyA9PSBvdGhl
ci5iYXR0ZXJ5X2NvdW50ZXJzXworICAgJiYgY29sbGVjdF9wb3dlcl9yYWlsc18gPT0gb3RoZXIu
Y29sbGVjdF9wb3dlcl9yYWlsc187Cit9CisKK2Jvb2wgQW5kcm9pZFBvd2VyQ29uZmlnOjpQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIGJhdHRlcnlfY291
bnRlcnNfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tl
ZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywg
c2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQo
KTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNf
ZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAg
IH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBiYXR0ZXJ5X3Bv
bGxfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmYmF0dGVyeV9wb2xsX21zXyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAyIC8qIGJhdHRlcnlfY291bnRlcnMgKi86CisgICAgICAgIGJh
dHRlcnlfY291bnRlcnNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmJhdHRl
cnlfY291bnRlcnNfLmJhY2soKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIGNv
bGxlY3RfcG93ZXJfcmFpbHMgKi86CisgICAgICAgIGZpZWxkLmdldCgmY29sbGVjdF9wb3dlcl9y
YWlsc18pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNl
cmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAg
ICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9
CisKK3N0ZDo6c3RyaW5nIEFuZHJvaWRQb3dlckNvbmZpZzo6U2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNT
dHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQW5kcm9pZFBvd2VyQ29uZmlnOjpT
ZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6
cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1
cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBBbmRyb2lkUG93ZXJDb25maWc6
OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxk
IDE6IGJhdHRlcnlfcG9sbF9tcworICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFw
cGVuZFZhckludCgxLCBiYXR0ZXJ5X3BvbGxfbXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGJh
dHRlcnlfY291bnRlcnMKKyAgZm9yIChhdXRvJiBpdCA6IGJhdHRlcnlfY291bnRlcnNfKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgaXQpOworICB9CisKKyAgLy8gRmllbGQgMzogY29sbGVj
dF9wb3dlcl9yYWlscworICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFRp
bnlWYXJJbnQoMywgY29sbGVjdF9wb3dlcl9yYWlsc18pOworICB9CisKKyAgbXNnLT5BcHBlbmRS
YXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXpl
KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90
b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9w
cm9jZXNzX3N0YXRzL3Byb2Nlc3Nfc3RhdHNfY29uZmlnLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvY2Vzc19zdGF0
cy9wcm9jZXNzX3N0YXRzX2NvbmZpZy5nZW4uaAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0
ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX0NPTkZJR19QUk9DRVNTX1NUQVRTX1BST0NFU1NfU1RBVFNfQ09ORklHX1BS
T1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJ
R19QUk9DRVNTX1NUQVRTX1BST0NFU1NfU1RBVFNfQ09ORklHX1BST1RPX0NQUF9IXworCisjaW5j
bHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNp
bmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9v
YmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7Citu
YW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgUHJvY2Vzc1N0YXRzQ29u
ZmlnOworZW51bSBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzIDogaW50OworfSAgLy8gbmFtZXNw
YWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2Vu
CisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFj
ZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mgewor
bmFtZXNwYWNlIGdlbiB7CitlbnVtIFByb2Nlc3NTdGF0c0NvbmZpZ19RdWlya3MgOiBpbnQgewor
ICBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzX1FVSVJLU19VTlNQRUNJRklFRCA9IDAsCisgIFBy
b2Nlc3NTdGF0c0NvbmZpZ19RdWlya3NfRElTQUJMRV9JTklUSUFMX0RVTVAgPSAxLAorICBQcm9j
ZXNzU3RhdHNDb25maWdfUXVpcmtzX0RJU0FCTEVfT05fREVNQU5EID0gMiwKK307CisKK2NsYXNz
IFBFUkZFVFRPX0VYUE9SVCBQcm9jZXNzU3RhdHNDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86
OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgUXVpcmtzID0gUHJvY2Vzc1N0YXRz
Q29uZmlnX1F1aXJrczsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFFVSVJLU19VTlNQRUNJRklF
RCA9IFByb2Nlc3NTdGF0c0NvbmZpZ19RdWlya3NfUVVJUktTX1VOU1BFQ0lGSUVEOworICBzdGF0
aWMgY29uc3RleHByIGF1dG8gRElTQUJMRV9JTklUSUFMX0RVTVAgPSBQcm9jZXNzU3RhdHNDb25m
aWdfUXVpcmtzX0RJU0FCTEVfSU5JVElBTF9EVU1QOworICBzdGF0aWMgY29uc3RleHByIGF1dG8g
RElTQUJMRV9PTl9ERU1BTkQgPSBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzX0RJU0FCTEVfT05f
REVNQU5EOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gUXVpcmtzX01JTiA9IFByb2Nlc3NTdGF0
c0NvbmZpZ19RdWlya3NfUVVJUktTX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1
dG8gUXVpcmtzX01BWCA9IFByb2Nlc3NTdGF0c0NvbmZpZ19RdWlya3NfRElTQUJMRV9PTl9ERU1B
TkQ7CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrUXVpcmtzRmllbGROdW1iZXIgPSAxLAor
ICAgIGtTY2FuQWxsUHJvY2Vzc2VzT25TdGFydEZpZWxkTnVtYmVyID0gMiwKKyAgICBrUmVjb3Jk
VGhyZWFkTmFtZXNGaWVsZE51bWJlciA9IDMsCisgICAga1Byb2NTdGF0c1BvbGxNc0ZpZWxkTnVt
YmVyID0gNCwKKyAgICBrUHJvY1N0YXRzQ2FjaGVUdGxNc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBr
UmVjb3JkVGhyZWFkVGltZUluU3RhdGVGaWVsZE51bWJlciA9IDcsCisgICAga1RocmVhZFRpbWVJ
blN0YXRlQ2FjaGVTaXplRmllbGROdW1iZXIgPSA4LAorICB9OworCisgIFByb2Nlc3NTdGF0c0Nv
bmZpZygpOworICB+UHJvY2Vzc1N0YXRzQ29uZmlnKCkgb3ZlcnJpZGU7CisgIFByb2Nlc3NTdGF0
c0NvbmZpZyhQcm9jZXNzU3RhdHNDb25maWcmJikgbm9leGNlcHQ7CisgIFByb2Nlc3NTdGF0c0Nv
bmZpZyYgb3BlcmF0b3I9KFByb2Nlc3NTdGF0c0NvbmZpZyYmKTsKKyAgUHJvY2Vzc1N0YXRzQ29u
ZmlnKGNvbnN0IFByb2Nlc3NTdGF0c0NvbmZpZyYpOworICBQcm9jZXNzU3RhdHNDb25maWcmIG9w
ZXJhdG9yPShjb25zdCBQcm9jZXNzU3RhdHNDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNv
bnN0IFByb2Nlc3NTdGF0c0NvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
UHJvY2Vzc1N0YXRzQ29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJy
aWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwor
ICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7
CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50
IHF1aXJrc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihxdWlya3NfLnNp
emUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UHJvY2Vzc1N0YXRzQ29uZmlnX1F1aXJrcz4m
IHF1aXJrcygpIGNvbnN0IHsgcmV0dXJuIHF1aXJrc187IH0KKyAgc3RkOjp2ZWN0b3I8UHJvY2Vz
c1N0YXRzQ29uZmlnX1F1aXJrcz4qIG11dGFibGVfcXVpcmtzKCkgeyByZXR1cm4gJnF1aXJrc187
IH0KKyAgdm9pZCBjbGVhcl9xdWlya3MoKSB7IHF1aXJrc18uY2xlYXIoKTsgfQorICB2b2lkIGFk
ZF9xdWlya3MoUHJvY2Vzc1N0YXRzQ29uZmlnX1F1aXJrcyB2YWx1ZSkgeyBxdWlya3NfLmVtcGxh
Y2VfYmFjayh2YWx1ZSk7IH0KKyAgUHJvY2Vzc1N0YXRzQ29uZmlnX1F1aXJrcyogYWRkX3F1aXJr
cygpIHsgcXVpcmtzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZxdWlya3NfLmJhY2soKTsgfQor
CisgIGJvb2wgaGFzX3NjYW5fYWxsX3Byb2Nlc3Nlc19vbl9zdGFydCgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzJdOyB9CisgIGJvb2wgc2Nhbl9hbGxfcHJvY2Vzc2VzX29uX3N0YXJ0KCkg
Y29uc3QgeyByZXR1cm4gc2Nhbl9hbGxfcHJvY2Vzc2VzX29uX3N0YXJ0XzsgfQorICB2b2lkIHNl
dF9zY2FuX2FsbF9wcm9jZXNzZXNfb25fc3RhcnQoYm9vbCB2YWx1ZSkgeyBzY2FuX2FsbF9wcm9j
ZXNzZXNfb25fc3RhcnRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wg
aGFzX3JlY29yZF90aHJlYWRfbmFtZXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsg
fQorICBib29sIHJlY29yZF90aHJlYWRfbmFtZXMoKSBjb25zdCB7IHJldHVybiByZWNvcmRfdGhy
ZWFkX25hbWVzXzsgfQorICB2b2lkIHNldF9yZWNvcmRfdGhyZWFkX25hbWVzKGJvb2wgdmFsdWUp
IHsgcmVjb3JkX3RocmVhZF9uYW1lc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisK
KyAgYm9vbCBoYXNfcHJvY19zdGF0c19wb2xsX21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bNF07IH0KKyAgdWludDMyX3QgcHJvY19zdGF0c19wb2xsX21zKCkgY29uc3QgeyByZXR1cm4g
cHJvY19zdGF0c19wb2xsX21zXzsgfQorICB2b2lkIHNldF9wcm9jX3N0YXRzX3BvbGxfbXModWlu
dDMyX3QgdmFsdWUpIHsgcHJvY19zdGF0c19wb2xsX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5z
ZXQoNCk7IH0KKworICBib29sIGhhc19wcm9jX3N0YXRzX2NhY2hlX3R0bF9tcygpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzZdOyB9CisgIHVpbnQzMl90IHByb2Nfc3RhdHNfY2FjaGVfdHRs
X21zKCkgY29uc3QgeyByZXR1cm4gcHJvY19zdGF0c19jYWNoZV90dGxfbXNfOyB9CisgIHZvaWQg
c2V0X3Byb2Nfc3RhdHNfY2FjaGVfdHRsX21zKHVpbnQzMl90IHZhbHVlKSB7IHByb2Nfc3RhdHNf
Y2FjaGVfdHRsX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNik7IH0KKworICBib29sIGhh
c19yZWNvcmRfdGhyZWFkX3RpbWVfaW5fc3RhdGUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1s3XTsgfQorICBib29sIHJlY29yZF90aHJlYWRfdGltZV9pbl9zdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIHJlY29yZF90aHJlYWRfdGltZV9pbl9zdGF0ZV87IH0KKyAgdm9pZCBzZXRfcmVjb3JkX3Ro
cmVhZF90aW1lX2luX3N0YXRlKGJvb2wgdmFsdWUpIHsgcmVjb3JkX3RocmVhZF90aW1lX2luX3N0
YXRlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNyk7IH0KKworICBib29sIGhhc190aHJlYWRf
dGltZV9pbl9zdGF0ZV9jYWNoZV9zaXplKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bOF07
IH0KKyAgdWludDMyX3QgdGhyZWFkX3RpbWVfaW5fc3RhdGVfY2FjaGVfc2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIHRocmVhZF90aW1lX2luX3N0YXRlX2NhY2hlX3NpemVfOyB9CisgIHZvaWQgc2V0X3Ro
cmVhZF90aW1lX2luX3N0YXRlX2NhY2hlX3NpemUodWludDMyX3QgdmFsdWUpIHsgdGhyZWFkX3Rp
bWVfaW5fc3RhdGVfY2FjaGVfc2l6ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDgpOyB9CisK
KyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzPiBxdWly
a3NfOworICBib29sIHNjYW5fYWxsX3Byb2Nlc3Nlc19vbl9zdGFydF97fTsKKyAgYm9vbCByZWNv
cmRfdGhyZWFkX25hbWVzX3t9OworICB1aW50MzJfdCBwcm9jX3N0YXRzX3BvbGxfbXNfe307Cisg
IHVpbnQzMl90IHByb2Nfc3RhdHNfY2FjaGVfdHRsX21zX3t9OworICBib29sIHJlY29yZF90aHJl
YWRfdGltZV9pbl9zdGF0ZV97fTsKKyAgdWludDMyX3QgdGhyZWFkX3RpbWVfaW5fc3RhdGVfY2Fj
aGVfc2l6ZV97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBm
aWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnBy
b3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRz
ZXQ8OT4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1BST0NFU1NfU1RBVFNfUFJPQ0VT
U19TVEFUU19DT05GSUdfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRl
ZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgi
CisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2lu
CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdu
b3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvY2Vzc19zdGF0cy9wcm9jZXNzX3N0YXRzX2Nv
bmZpZy5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mgewor
bmFtZXNwYWNlIGdlbiB7CisKK1Byb2Nlc3NTdGF0c0NvbmZpZzo6UHJvY2Vzc1N0YXRzQ29uZmln
KCkgPSBkZWZhdWx0OworUHJvY2Vzc1N0YXRzQ29uZmlnOjp+UHJvY2Vzc1N0YXRzQ29uZmlnKCkg
PSBkZWZhdWx0OworUHJvY2Vzc1N0YXRzQ29uZmlnOjpQcm9jZXNzU3RhdHNDb25maWcoY29uc3Qg
UHJvY2Vzc1N0YXRzQ29uZmlnJikgPSBkZWZhdWx0OworUHJvY2Vzc1N0YXRzQ29uZmlnJiBQcm9j
ZXNzU3RhdHNDb25maWc6Om9wZXJhdG9yPShjb25zdCBQcm9jZXNzU3RhdHNDb25maWcmKSA9IGRl
ZmF1bHQ7CitQcm9jZXNzU3RhdHNDb25maWc6OlByb2Nlc3NTdGF0c0NvbmZpZyhQcm9jZXNzU3Rh
dHNDb25maWcmJikgbm9leGNlcHQgPSBkZWZhdWx0OworUHJvY2Vzc1N0YXRzQ29uZmlnJiBQcm9j
ZXNzU3RhdHNDb25maWc6Om9wZXJhdG9yPShQcm9jZXNzU3RhdHNDb25maWcmJikgPSBkZWZhdWx0
OworCitib29sIFByb2Nlc3NTdGF0c0NvbmZpZzo6b3BlcmF0b3I9PShjb25zdCBQcm9jZXNzU3Rh
dHNDb25maWcmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3Ro
ZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBxdWlya3NfID09IG90aGVyLnF1aXJrc18KKyAgICYm
IHNjYW5fYWxsX3Byb2Nlc3Nlc19vbl9zdGFydF8gPT0gb3RoZXIuc2Nhbl9hbGxfcHJvY2Vzc2Vz
X29uX3N0YXJ0XworICAgJiYgcmVjb3JkX3RocmVhZF9uYW1lc18gPT0gb3RoZXIucmVjb3JkX3Ro
cmVhZF9uYW1lc18KKyAgICYmIHByb2Nfc3RhdHNfcG9sbF9tc18gPT0gb3RoZXIucHJvY19zdGF0
c19wb2xsX21zXworICAgJiYgcHJvY19zdGF0c19jYWNoZV90dGxfbXNfID09IG90aGVyLnByb2Nf
c3RhdHNfY2FjaGVfdHRsX21zXworICAgJiYgcmVjb3JkX3RocmVhZF90aW1lX2luX3N0YXRlXyA9
PSBvdGhlci5yZWNvcmRfdGhyZWFkX3RpbWVfaW5fc3RhdGVfCisgICAmJiB0aHJlYWRfdGltZV9p
bl9zdGF0ZV9jYWNoZV9zaXplXyA9PSBvdGhlci50aHJlYWRfdGltZV9pbl9zdGF0ZV9jYWNoZV9z
aXplXzsKK30KKworYm9vbCBQcm9jZXNzU3RhdHNDb25maWc6OlBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgcXVpcmtzXy5jbGVhcigpOworICB1bmtub3du
X2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnBy
b3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQg
PSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgp
KSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9o
YXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgp
KSB7CisgICAgICBjYXNlIDEgLyogcXVpcmtzICovOgorICAgICAgICBxdWlya3NfLmVtcGxhY2Vf
YmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJnF1aXJrc18uYmFjaygpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDIgLyogc2Nhbl9hbGxfcHJvY2Vzc2VzX29uX3N0YXJ0ICovOgorICAg
ICAgICBmaWVsZC5nZXQoJnNjYW5fYWxsX3Byb2Nlc3Nlc19vbl9zdGFydF8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgMyAvKiByZWNvcmRfdGhyZWFkX25hbWVzICovOgorICAgICAgICBm
aWVsZC5nZXQoJnJlY29yZF90aHJlYWRfbmFtZXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDQgLyogcHJvY19zdGF0c19wb2xsX21zICovOgorICAgICAgICBmaWVsZC5nZXQoJnByb2Nf
c3RhdHNfcG9sbF9tc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAvKiBwcm9jX3N0
YXRzX2NhY2hlX3R0bF9tcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwcm9jX3N0YXRzX2NhY2hl
X3R0bF9tc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNyAvKiByZWNvcmRfdGhyZWFk
X3RpbWVfaW5fc3RhdGUgKi86CisgICAgICAgIGZpZWxkLmdldCgmcmVjb3JkX3RocmVhZF90aW1l
X2luX3N0YXRlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIHRocmVhZF90aW1l
X2luX3N0YXRlX2NhY2hlX3NpemUgKi86CisgICAgICAgIGZpZWxkLmdldCgmdGhyZWFkX3RpbWVf
aW5fc3RhdGVfY2FjaGVfc2l6ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAg
ICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5i
eXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFByb2Nlc3NTdGF0c0NvbmZpZzo6U2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90
b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBt
c2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gUHJvY2Vz
c1N0YXRzQ29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cu
Z2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBQcm9j
ZXNzU3RhdHNDb25maWc6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25z
dCB7CisgIC8vIEZpZWxkIDE6IHF1aXJrcworICBmb3IgKGF1dG8mIGl0IDogcXVpcmtzXykgewor
ICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHNjYW5f
YWxsX3Byb2Nlc3Nlc19vbl9zdGFydAorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ct
PkFwcGVuZFRpbnlWYXJJbnQoMiwgc2Nhbl9hbGxfcHJvY2Vzc2VzX29uX3N0YXJ0Xyk7CisgIH0K
KworICAvLyBGaWVsZCAzOiByZWNvcmRfdGhyZWFkX25hbWVzCisgIGlmIChfaGFzX2ZpZWxkX1sz
XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgzLCByZWNvcmRfdGhyZWFkX25hbWVzXyk7
CisgIH0KKworICAvLyBGaWVsZCA0OiBwcm9jX3N0YXRzX3BvbGxfbXMKKyAgaWYgKF9oYXNfZmll
bGRfWzRdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNCwgcHJvY19zdGF0c19wb2xsX21zXyk7
CisgIH0KKworICAvLyBGaWVsZCA2OiBwcm9jX3N0YXRzX2NhY2hlX3R0bF9tcworICBpZiAoX2hh
c19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg2LCBwcm9jX3N0YXRzX2NhY2hl
X3R0bF9tc18pOworICB9CisKKyAgLy8gRmllbGQgNzogcmVjb3JkX3RocmVhZF90aW1lX2luX3N0
YXRlCisgIGlmIChfaGFzX2ZpZWxkX1s3XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg3
LCByZWNvcmRfdGhyZWFkX3RpbWVfaW5fc3RhdGVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IHRo
cmVhZF90aW1lX2luX3N0YXRlX2NhY2hlX3NpemUKKyAgaWYgKF9oYXNfZmllbGRfWzhdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoOCwgdGhyZWFkX3RpbWVfaW5fc3RhdGVfY2FjaGVfc2l6ZV8p
OworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRh
KCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEg
R0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4v
cHJvdG9zL3BlcmZldHRvL2NvbmZpZy9wcm9maWxpbmcvaGVhcHByb2ZkX2NvbmZpZy5nZW4uY2MK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29u
ZmlnL3Byb2ZpbGluZy9oZWFwcHJvZmRfY29uZmlnLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0
b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1BST0ZJTElOR19IRUFQUFJPRkRfQ09ORklHX1BS
T1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJ
R19QUk9GSUxJTkdfSEVBUFBST0ZEX0NPTkZJR19QUk9UT19DUFBfSF8KKworI2luY2x1ZGUgPHN0
ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8
c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
Y29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNl
IHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIEhlYXBwcm9mZENvbmZpZzsKK2NsYXNz
IEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZzsKK30gIC8vIG5hbWVzcGFjZSBw
ZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCitu
YW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJv
dG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVz
cGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgSGVhcHByb2ZkQ29uZmlnIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIENvbnRp
bnVvdXNEdW1wQ29uZmlnID0gSGVhcHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnOwor
ICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1NhbXBsaW5nSW50ZXJ2YWxCeXRlc0ZpZWxkTnVt
YmVyID0gMSwKKyAgICBrUHJvY2Vzc0NtZGxpbmVGaWVsZE51bWJlciA9IDIsCisgICAga1BpZEZp
ZWxkTnVtYmVyID0gNCwKKyAgICBrSGVhcHNGaWVsZE51bWJlciA9IDIwLAorICAgIGtBbGxGaWVs
ZE51bWJlciA9IDUsCisgICAga01pbkFub255bW91c01lbW9yeUtiRmllbGROdW1iZXIgPSAxNSwK
KyAgICBrTWF4SGVhcHByb2ZkTWVtb3J5S2JGaWVsZE51bWJlciA9IDE2LAorICAgIGtNYXhIZWFw
cHJvZmRDcHVTZWNzRmllbGROdW1iZXIgPSAxNywKKyAgICBrU2tpcFN5bWJvbFByZWZpeEZpZWxk
TnVtYmVyID0gNywKKyAgICBrQ29udGludW91c0R1bXBDb25maWdGaWVsZE51bWJlciA9IDYsCisg
ICAga1NobWVtU2l6ZUJ5dGVzRmllbGROdW1iZXIgPSA4LAorICAgIGtCbG9ja0NsaWVudEZpZWxk
TnVtYmVyID0gOSwKKyAgICBrQmxvY2tDbGllbnRUaW1lb3V0VXNGaWVsZE51bWJlciA9IDE0LAor
ICAgIGtOb1N0YXJ0dXBGaWVsZE51bWJlciA9IDEwLAorICAgIGtOb1J1bm5pbmdGaWVsZE51bWJl
ciA9IDExLAorICAgIGtJZGxlQWxsb2NhdGlvbnNGaWVsZE51bWJlciA9IDEyLAorICAgIGtEdW1w
QXRNYXhGaWVsZE51bWJlciA9IDEzLAorICAgIGtEaXNhYmxlRm9ya1RlYXJkb3duRmllbGROdW1i
ZXIgPSAxOCwKKyAgICBrRGlzYWJsZVZmb3JrRGV0ZWN0aW9uRmllbGROdW1iZXIgPSAxOSwKKyAg
fTsKKworICBIZWFwcHJvZmRDb25maWcoKTsKKyAgfkhlYXBwcm9mZENvbmZpZygpIG92ZXJyaWRl
OworICBIZWFwcHJvZmRDb25maWcoSGVhcHByb2ZkQ29uZmlnJiYpIG5vZXhjZXB0OworICBIZWFw
cHJvZmRDb25maWcmIG9wZXJhdG9yPShIZWFwcHJvZmRDb25maWcmJik7CisgIEhlYXBwcm9mZENv
bmZpZyhjb25zdCBIZWFwcHJvZmRDb25maWcmKTsKKyAgSGVhcHByb2ZkQ29uZmlnJiBvcGVyYXRv
cj0oY29uc3QgSGVhcHByb2ZkQ29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBIZWFw
cHJvZmRDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEhlYXBwcm9mZENv
bmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9v
bCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpz
dHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8
dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlh
bGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3NhbXBsaW5n
X2ludGVydmFsX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWlu
dDY0X3Qgc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBzYW1wbGluZ19p
bnRlcnZhbF9ieXRlc187IH0KKyAgdm9pZCBzZXRfc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXModWlu
dDY0X3QgdmFsdWUpIHsgc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXNfID0gdmFsdWU7IF9oYXNfZmll
bGRfLnNldCgxKTsgfQorCisgIGludCBwcm9jZXNzX2NtZGxpbmVfc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIHN0YXRpY19jYXN0PGludD4ocHJvY2Vzc19jbWRsaW5lXy5zaXplKCkpOyB9CisgIGNvbnN0
IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHJvY2Vzc19jbWRsaW5lKCkgY29uc3QgeyByZXR1
cm4gcHJvY2Vzc19jbWRsaW5lXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFi
bGVfcHJvY2Vzc19jbWRsaW5lKCkgeyByZXR1cm4gJnByb2Nlc3NfY21kbGluZV87IH0KKyAgdm9p
ZCBjbGVhcl9wcm9jZXNzX2NtZGxpbmUoKSB7IHByb2Nlc3NfY21kbGluZV8uY2xlYXIoKTsgfQor
ICB2b2lkIGFkZF9wcm9jZXNzX2NtZGxpbmUoc3RkOjpzdHJpbmcgdmFsdWUpIHsgcHJvY2Vzc19j
bWRsaW5lXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRfcHJvY2Vz
c19jbWRsaW5lKCkgeyBwcm9jZXNzX2NtZGxpbmVfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnBy
b2Nlc3NfY21kbGluZV8uYmFjaygpOyB9CisKKyAgaW50IHBpZF9zaXplKCkgY29uc3QgeyByZXR1
cm4gc3RhdGljX2Nhc3Q8aW50PihwaWRfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8
dWludDY0X3Q+JiBwaWQoKSBjb25zdCB7IHJldHVybiBwaWRfOyB9CisgIHN0ZDo6dmVjdG9yPHVp
bnQ2NF90PiogbXV0YWJsZV9waWQoKSB7IHJldHVybiAmcGlkXzsgfQorICB2b2lkIGNsZWFyX3Bp
ZCgpIHsgcGlkXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX3BpZCh1aW50NjRfdCB2YWx1ZSkgeyBw
aWRfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgdWludDY0X3QqIGFkZF9waWQoKSB7IHBpZF8u
ZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmcGlkXy5iYWNrKCk7IH0KKworICBpbnQgaGVhcHNfc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaGVhcHNfLnNpemUoKSk7IH0KKyAg
Y29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBoZWFwcygpIGNvbnN0IHsgcmV0dXJuIGhl
YXBzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfaGVhcHMoKSB7IHJl
dHVybiAmaGVhcHNfOyB9CisgIHZvaWQgY2xlYXJfaGVhcHMoKSB7IGhlYXBzXy5jbGVhcigpOyB9
CisgIHZvaWQgYWRkX2hlYXBzKHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGhlYXBzXy5lbXBsYWNlX2Jh
Y2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRfaGVhcHMoKSB7IGhlYXBzXy5lbXBsYWNl
X2JhY2soKTsgcmV0dXJuICZoZWFwc18uYmFjaygpOyB9CisKKyAgYm9vbCBoYXNfYWxsKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07IH0KKyAgYm9vbCBhbGwoKSBjb25zdCB7IHJldHVy
biBhbGxfOyB9CisgIHZvaWQgc2V0X2FsbChib29sIHZhbHVlKSB7IGFsbF8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDUpOyB9CisKKyAgYm9vbCBoYXNfbWluX2Fub255bW91c19tZW1vcnlfa2Io
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxNV07IH0KKyAgdWludDMyX3QgbWluX2Fub255
bW91c19tZW1vcnlfa2IoKSBjb25zdCB7IHJldHVybiBtaW5fYW5vbnltb3VzX21lbW9yeV9rYl87
IH0KKyAgdm9pZCBzZXRfbWluX2Fub255bW91c19tZW1vcnlfa2IodWludDMyX3QgdmFsdWUpIHsg
bWluX2Fub255bW91c19tZW1vcnlfa2JfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxNSk7IH0K
KworICBib29sIGhhc19tYXhfaGVhcHByb2ZkX21lbW9yeV9rYigpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzE2XTsgfQorICB1aW50MzJfdCBtYXhfaGVhcHByb2ZkX21lbW9yeV9rYigpIGNv
bnN0IHsgcmV0dXJuIG1heF9oZWFwcHJvZmRfbWVtb3J5X2tiXzsgfQorICB2b2lkIHNldF9tYXhf
aGVhcHByb2ZkX21lbW9yeV9rYih1aW50MzJfdCB2YWx1ZSkgeyBtYXhfaGVhcHByb2ZkX21lbW9y
eV9rYl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDE2KTsgfQorCisgIGJvb2wgaGFzX21heF9o
ZWFwcHJvZmRfY3B1X3NlY3MoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxN107IH0KKyAg
dWludDY0X3QgbWF4X2hlYXBwcm9mZF9jcHVfc2VjcygpIGNvbnN0IHsgcmV0dXJuIG1heF9oZWFw
cHJvZmRfY3B1X3NlY3NfOyB9CisgIHZvaWQgc2V0X21heF9oZWFwcHJvZmRfY3B1X3NlY3ModWlu
dDY0X3QgdmFsdWUpIHsgbWF4X2hlYXBwcm9mZF9jcHVfc2Vjc18gPSB2YWx1ZTsgX2hhc19maWVs
ZF8uc2V0KDE3KTsgfQorCisgIGludCBza2lwX3N5bWJvbF9wcmVmaXhfc2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIHN0YXRpY19jYXN0PGludD4oc2tpcF9zeW1ib2xfcHJlZml4Xy5zaXplKCkpOyB9Cisg
IGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc2tpcF9zeW1ib2xfcHJlZml4KCkgY29u
c3QgeyByZXR1cm4gc2tpcF9zeW1ib2xfcHJlZml4XzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0
cmluZz4qIG11dGFibGVfc2tpcF9zeW1ib2xfcHJlZml4KCkgeyByZXR1cm4gJnNraXBfc3ltYm9s
X3ByZWZpeF87IH0KKyAgdm9pZCBjbGVhcl9za2lwX3N5bWJvbF9wcmVmaXgoKSB7IHNraXBfc3lt
Ym9sX3ByZWZpeF8uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9za2lwX3N5bWJvbF9wcmVmaXgoc3Rk
OjpzdHJpbmcgdmFsdWUpIHsgc2tpcF9zeW1ib2xfcHJlZml4Xy5lbXBsYWNlX2JhY2sodmFsdWUp
OyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRfc2tpcF9zeW1ib2xfcHJlZml4KCkgeyBza2lwX3N5bWJv
bF9wcmVmaXhfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnNraXBfc3ltYm9sX3ByZWZpeF8uYmFj
aygpOyB9CisKKyAgYm9vbCBoYXNfY29udGludW91c19kdW1wX2NvbmZpZygpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzZdOyB9CisgIGNvbnN0IEhlYXBwcm9mZENvbmZpZ19Db250aW51b3Vz
RHVtcENvbmZpZyYgY29udGludW91c19kdW1wX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuICpjb250
aW51b3VzX2R1bXBfY29uZmlnXzsgfQorICBIZWFwcHJvZmRDb25maWdfQ29udGludW91c0R1bXBD
b25maWcqIG11dGFibGVfY29udGludW91c19kdW1wX2NvbmZpZygpIHsgX2hhc19maWVsZF8uc2V0
KDYpOyByZXR1cm4gY29udGludW91c19kdW1wX2NvbmZpZ18uZ2V0KCk7IH0KKworICBib29sIGhh
c19zaG1lbV9zaXplX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bOF07IH0KKyAg
dWludDY0X3Qgc2htZW1fc2l6ZV9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIHNobWVtX3NpemVfYnl0
ZXNfOyB9CisgIHZvaWQgc2V0X3NobWVtX3NpemVfYnl0ZXModWludDY0X3QgdmFsdWUpIHsgc2ht
ZW1fc2l6ZV9ieXRlc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDgpOyB9CisKKyAgYm9vbCBo
YXNfYmxvY2tfY2xpZW50KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bOV07IH0KKyAgYm9v
bCBibG9ja19jbGllbnQoKSBjb25zdCB7IHJldHVybiBibG9ja19jbGllbnRfOyB9CisgIHZvaWQg
c2V0X2Jsb2NrX2NsaWVudChib29sIHZhbHVlKSB7IGJsb2NrX2NsaWVudF8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDkpOyB9CisKKyAgYm9vbCBoYXNfYmxvY2tfY2xpZW50X3RpbWVvdXRfdXMo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxNF07IH0KKyAgdWludDMyX3QgYmxvY2tfY2xp
ZW50X3RpbWVvdXRfdXMoKSBjb25zdCB7IHJldHVybiBibG9ja19jbGllbnRfdGltZW91dF91c187
IH0KKyAgdm9pZCBzZXRfYmxvY2tfY2xpZW50X3RpbWVvdXRfdXModWludDMyX3QgdmFsdWUpIHsg
YmxvY2tfY2xpZW50X3RpbWVvdXRfdXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxNCk7IH0K
KworICBib29sIGhhc19ub19zdGFydHVwKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTBd
OyB9CisgIGJvb2wgbm9fc3RhcnR1cCgpIGNvbnN0IHsgcmV0dXJuIG5vX3N0YXJ0dXBfOyB9Cisg
IHZvaWQgc2V0X25vX3N0YXJ0dXAoYm9vbCB2YWx1ZSkgeyBub19zdGFydHVwXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMTApOyB9CisKKyAgYm9vbCBoYXNfbm9fcnVubmluZygpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzExXTsgfQorICBib29sIG5vX3J1bm5pbmcoKSBjb25zdCB7IHJl
dHVybiBub19ydW5uaW5nXzsgfQorICB2b2lkIHNldF9ub19ydW5uaW5nKGJvb2wgdmFsdWUpIHsg
bm9fcnVubmluZ18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDExKTsgfQorCisgIGJvb2wgaGFz
X2lkbGVfYWxsb2NhdGlvbnMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxMl07IH0KKyAg
Ym9vbCBpZGxlX2FsbG9jYXRpb25zKCkgY29uc3QgeyByZXR1cm4gaWRsZV9hbGxvY2F0aW9uc187
IH0KKyAgdm9pZCBzZXRfaWRsZV9hbGxvY2F0aW9ucyhib29sIHZhbHVlKSB7IGlkbGVfYWxsb2Nh
dGlvbnNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMik7IH0KKworICBib29sIGhhc19kdW1w
X2F0X21heCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEzXTsgfQorICBib29sIGR1bXBf
YXRfbWF4KCkgY29uc3QgeyByZXR1cm4gZHVtcF9hdF9tYXhfOyB9CisgIHZvaWQgc2V0X2R1bXBf
YXRfbWF4KGJvb2wgdmFsdWUpIHsgZHVtcF9hdF9tYXhfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxMyk7IH0KKworICBib29sIGhhc19kaXNhYmxlX2ZvcmtfdGVhcmRvd24oKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1sxOF07IH0KKyAgYm9vbCBkaXNhYmxlX2ZvcmtfdGVhcmRvd24oKSBj
b25zdCB7IHJldHVybiBkaXNhYmxlX2ZvcmtfdGVhcmRvd25fOyB9CisgIHZvaWQgc2V0X2Rpc2Fi
bGVfZm9ya190ZWFyZG93bihib29sIHZhbHVlKSB7IGRpc2FibGVfZm9ya190ZWFyZG93bl8gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDE4KTsgfQorCisgIGJvb2wgaGFzX2Rpc2FibGVfdmZvcmtf
ZGV0ZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTldOyB9CisgIGJvb2wgZGlz
YWJsZV92Zm9ya19kZXRlY3Rpb24oKSBjb25zdCB7IHJldHVybiBkaXNhYmxlX3Zmb3JrX2RldGVj
dGlvbl87IH0KKyAgdm9pZCBzZXRfZGlzYWJsZV92Zm9ya19kZXRlY3Rpb24oYm9vbCB2YWx1ZSkg
eyBkaXNhYmxlX3Zmb3JrX2RldGVjdGlvbl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDE5KTsg
fQorCisgcHJpdmF0ZToKKyAgdWludDY0X3Qgc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXNfe307Cisg
IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwcm9jZXNzX2NtZGxpbmVfOworICBzdGQ6OnZlY3Rv
cjx1aW50NjRfdD4gcGlkXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGhlYXBzXzsKKyAg
Ym9vbCBhbGxfe307CisgIHVpbnQzMl90IG1pbl9hbm9ueW1vdXNfbWVtb3J5X2tiX3t9OworICB1
aW50MzJfdCBtYXhfaGVhcHByb2ZkX21lbW9yeV9rYl97fTsKKyAgdWludDY0X3QgbWF4X2hlYXBw
cm9mZF9jcHVfc2Vjc197fTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNraXBfc3ltYm9s
X3ByZWZpeF87CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxIZWFwcHJvZmRDb25maWdfQ29u
dGludW91c0R1bXBDb25maWc+IGNvbnRpbnVvdXNfZHVtcF9jb25maWdfOworICB1aW50NjRfdCBz
aG1lbV9zaXplX2J5dGVzX3t9OworICBib29sIGJsb2NrX2NsaWVudF97fTsKKyAgdWludDMyX3Qg
YmxvY2tfY2xpZW50X3RpbWVvdXRfdXNfe307CisgIGJvb2wgbm9fc3RhcnR1cF97fTsKKyAgYm9v
bCBub19ydW5uaW5nX3t9OworICBib29sIGlkbGVfYWxsb2NhdGlvbnNfe307CisgIGJvb2wgZHVt
cF9hdF9tYXhfe307CisgIGJvb2wgZGlzYWJsZV9mb3JrX3RlYXJkb3duX3t9OworICBib29sIGRp
c2FibGVfdmZvcmtfZGV0ZWN0aW9uX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtu
b3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2
ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsK
KworICBzdGQ6OmJpdHNldDwyMT4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVU
VE9fRVhQT1JUIEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZyA6IHB1YmxpYyA6
OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVy
cyB7CisgICAga0R1bXBQaGFzZU1zRmllbGROdW1iZXIgPSA1LAorICAgIGtEdW1wSW50ZXJ2YWxN
c0ZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKworICBIZWFwcHJvZmRDb25maWdfQ29udGludW91c0R1
bXBDb25maWcoKTsKKyAgfkhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZygpIG92
ZXJyaWRlOworICBIZWFwcHJvZmRDb25maWdfQ29udGludW91c0R1bXBDb25maWcoSGVhcHByb2Zk
Q29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnJiYpIG5vZXhjZXB0OworICBIZWFwcHJvZmRDb25m
aWdfQ29udGludW91c0R1bXBDb25maWcmIG9wZXJhdG9yPShIZWFwcHJvZmRDb25maWdfQ29udGlu
dW91c0R1bXBDb25maWcmJik7CisgIEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZp
Zyhjb25zdCBIZWFwcHJvZmRDb25maWdfQ29udGludW91c0R1bXBDb25maWcmKTsKKyAgSGVhcHBy
b2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnJiBvcGVyYXRvcj0oY29uc3QgSGVhcHByb2Zk
Q29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBI
ZWFwcHJvZmRDb25maWdfQ29udGludW91c0R1bXBDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZyYgb3RoZXIp
IGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21B
cnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3Rv
emVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX2R1bXBfcGhhc2VfbXMoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1s1XTsgfQorICB1aW50MzJfdCBkdW1wX3BoYXNlX21zKCkg
Y29uc3QgeyByZXR1cm4gZHVtcF9waGFzZV9tc187IH0KKyAgdm9pZCBzZXRfZHVtcF9waGFzZV9t
cyh1aW50MzJfdCB2YWx1ZSkgeyBkdW1wX3BoYXNlX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5z
ZXQoNSk7IH0KKworICBib29sIGhhc19kdW1wX2ludGVydmFsX21zKCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bNl07IH0KKyAgdWludDMyX3QgZHVtcF9pbnRlcnZhbF9tcygpIGNvbnN0IHsg
cmV0dXJuIGR1bXBfaW50ZXJ2YWxfbXNfOyB9CisgIHZvaWQgc2V0X2R1bXBfaW50ZXJ2YWxfbXMo
dWludDMyX3QgdmFsdWUpIHsgZHVtcF9pbnRlcnZhbF9tc18gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDYpOyB9CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBkdW1wX3BoYXNlX21zX3t9OworICB1
aW50MzJfdCBkdW1wX2ludGVydmFsX21zX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1
bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVy
ZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRz
XzsKKworICBzdGQ6OmJpdHNldDw3PiBfaGFzX2ZpZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNw
YWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2Vu
CisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfUFJP
RklMSU5HX0hFQVBQUk9GRF9DT05GSUdfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tl
ZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBf
YnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBn
ZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdu
b3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvZmlsaW5nL2hlYXBwcm9mZF9j
b25maWcuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsK
K25hbWVzcGFjZSBnZW4geworCitIZWFwcHJvZmRDb25maWc6OkhlYXBwcm9mZENvbmZpZygpID0g
ZGVmYXVsdDsKK0hlYXBwcm9mZENvbmZpZzo6fkhlYXBwcm9mZENvbmZpZygpID0gZGVmYXVsdDsK
K0hlYXBwcm9mZENvbmZpZzo6SGVhcHByb2ZkQ29uZmlnKGNvbnN0IEhlYXBwcm9mZENvbmZpZyYp
ID0gZGVmYXVsdDsKK0hlYXBwcm9mZENvbmZpZyYgSGVhcHByb2ZkQ29uZmlnOjpvcGVyYXRvcj0o
Y29uc3QgSGVhcHByb2ZkQ29uZmlnJikgPSBkZWZhdWx0OworSGVhcHByb2ZkQ29uZmlnOjpIZWFw
cHJvZmRDb25maWcoSGVhcHByb2ZkQ29uZmlnJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0hlYXBw
cm9mZENvbmZpZyYgSGVhcHByb2ZkQ29uZmlnOjpvcGVyYXRvcj0oSGVhcHByb2ZkQ29uZmlnJiYp
ID0gZGVmYXVsdDsKKworYm9vbCBIZWFwcHJvZmRDb25maWc6Om9wZXJhdG9yPT0oY29uc3QgSGVh
cHByb2ZkQ29uZmlnJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09
IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXNfID09
IG90aGVyLnNhbXBsaW5nX2ludGVydmFsX2J5dGVzXworICAgJiYgcHJvY2Vzc19jbWRsaW5lXyA9
PSBvdGhlci5wcm9jZXNzX2NtZGxpbmVfCisgICAmJiBwaWRfID09IG90aGVyLnBpZF8KKyAgICYm
IGhlYXBzXyA9PSBvdGhlci5oZWFwc18KKyAgICYmIGFsbF8gPT0gb3RoZXIuYWxsXworICAgJiYg
bWluX2Fub255bW91c19tZW1vcnlfa2JfID09IG90aGVyLm1pbl9hbm9ueW1vdXNfbWVtb3J5X2ti
XworICAgJiYgbWF4X2hlYXBwcm9mZF9tZW1vcnlfa2JfID09IG90aGVyLm1heF9oZWFwcHJvZmRf
bWVtb3J5X2tiXworICAgJiYgbWF4X2hlYXBwcm9mZF9jcHVfc2Vjc18gPT0gb3RoZXIubWF4X2hl
YXBwcm9mZF9jcHVfc2Vjc18KKyAgICYmIHNraXBfc3ltYm9sX3ByZWZpeF8gPT0gb3RoZXIuc2tp
cF9zeW1ib2xfcHJlZml4XworICAgJiYgY29udGludW91c19kdW1wX2NvbmZpZ18gPT0gb3RoZXIu
Y29udGludW91c19kdW1wX2NvbmZpZ18KKyAgICYmIHNobWVtX3NpemVfYnl0ZXNfID09IG90aGVy
LnNobWVtX3NpemVfYnl0ZXNfCisgICAmJiBibG9ja19jbGllbnRfID09IG90aGVyLmJsb2NrX2Ns
aWVudF8KKyAgICYmIGJsb2NrX2NsaWVudF90aW1lb3V0X3VzXyA9PSBvdGhlci5ibG9ja19jbGll
bnRfdGltZW91dF91c18KKyAgICYmIG5vX3N0YXJ0dXBfID09IG90aGVyLm5vX3N0YXJ0dXBfCisg
ICAmJiBub19ydW5uaW5nXyA9PSBvdGhlci5ub19ydW5uaW5nXworICAgJiYgaWRsZV9hbGxvY2F0
aW9uc18gPT0gb3RoZXIuaWRsZV9hbGxvY2F0aW9uc18KKyAgICYmIGR1bXBfYXRfbWF4XyA9PSBv
dGhlci5kdW1wX2F0X21heF8KKyAgICYmIGRpc2FibGVfZm9ya190ZWFyZG93bl8gPT0gb3RoZXIu
ZGlzYWJsZV9mb3JrX3RlYXJkb3duXworICAgJiYgZGlzYWJsZV92Zm9ya19kZXRlY3Rpb25fID09
IG90aGVyLmRpc2FibGVfdmZvcmtfZGV0ZWN0aW9uXzsKK30KKworYm9vbCBIZWFwcHJvZmRDb25m
aWc6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgcHJv
Y2Vzc19jbWRsaW5lXy5jbGVhcigpOworICBwaWRfLmNsZWFyKCk7CisgIGhlYXBzXy5jbGVhcigp
OworICBza2lwX3N5bWJvbF9wcmVmaXhfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVh
cigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90
b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAo
ZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0
KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNh
c2UgMSAvKiBzYW1wbGluZ19pbnRlcnZhbF9ieXRlcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZz
YW1wbGluZ19pbnRlcnZhbF9ieXRlc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAv
KiBwcm9jZXNzX2NtZGxpbmUgKi86CisgICAgICAgIHByb2Nlc3NfY21kbGluZV8uZW1wbGFjZV9i
YWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmcHJvY2Vzc19jbWRsaW5lXy5iYWNrKCkpOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBwaWQgKi86CisgICAgICAgIHBpZF8uZW1wbGFj
ZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmcGlkXy5iYWNrKCkpOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgMjAgLyogaGVhcHMgKi86CisgICAgICAgIGhlYXBzXy5lbXBsYWNlX2Jh
Y2soKTsKKyAgICAgICAgZmllbGQuZ2V0KCZoZWFwc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDUgLyogYWxsICovOgorICAgICAgICBmaWVsZC5nZXQoJmFsbF8pOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgMTUgLyogbWluX2Fub255bW91c19tZW1vcnlfa2IgKi86
CisgICAgICAgIGZpZWxkLmdldCgmbWluX2Fub255bW91c19tZW1vcnlfa2JfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDE2IC8qIG1heF9oZWFwcHJvZmRfbWVtb3J5X2tiICovOgorICAg
ICAgICBmaWVsZC5nZXQoJm1heF9oZWFwcHJvZmRfbWVtb3J5X2tiXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSAxNyAvKiBtYXhfaGVhcHByb2ZkX2NwdV9zZWNzICovOgorICAgICAgICBm
aWVsZC5nZXQoJm1heF9oZWFwcHJvZmRfY3B1X3NlY3NfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDcgLyogc2tpcF9zeW1ib2xfcHJlZml4ICovOgorICAgICAgICBza2lwX3N5bWJvbF9w
cmVmaXhfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJnNraXBfc3ltYm9sX3By
ZWZpeF8uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYgLyogY29udGludW91
c19kdW1wX2NvbmZpZyAqLzoKKyAgICAgICAgKCpjb250aW51b3VzX2R1bXBfY29uZmlnXykuUGFy
c2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAg
ICAgY2FzZSA4IC8qIHNobWVtX3NpemVfYnl0ZXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmc2ht
ZW1fc2l6ZV9ieXRlc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOSAvKiBibG9ja19j
bGllbnQgKi86CisgICAgICAgIGZpZWxkLmdldCgmYmxvY2tfY2xpZW50Xyk7CisgICAgICAgIGJy
ZWFrOworICAgICAgY2FzZSAxNCAvKiBibG9ja19jbGllbnRfdGltZW91dF91cyAqLzoKKyAgICAg
ICAgZmllbGQuZ2V0KCZibG9ja19jbGllbnRfdGltZW91dF91c18pOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgMTAgLyogbm9fc3RhcnR1cCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZub19z
dGFydHVwXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMSAvKiBub19ydW5uaW5nICov
OgorICAgICAgICBmaWVsZC5nZXQoJm5vX3J1bm5pbmdfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDEyIC8qIGlkbGVfYWxsb2NhdGlvbnMgKi86CisgICAgICAgIGZpZWxkLmdldCgmaWRs
ZV9hbGxvY2F0aW9uc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTMgLyogZHVtcF9h
dF9tYXggKi86CisgICAgICAgIGZpZWxkLmdldCgmZHVtcF9hdF9tYXhfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDE4IC8qIGRpc2FibGVfZm9ya190ZWFyZG93biAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZkaXNhYmxlX2ZvcmtfdGVhcmRvd25fKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDE5IC8qIGRpc2FibGVfdmZvcmtfZGV0ZWN0aW9uICovOgorICAgICAgICBmaWVsZC5n
ZXQoJmRpc2FibGVfdmZvcmtfZGV0ZWN0aW9uXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVm
YXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRz
Xyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAm
JiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgSGVhcHByb2ZkQ29uZmlnOjpT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBI
ZWFwcHJvZmRDb25maWc6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJv
OjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1z
Zy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEhl
YXBwcm9mZENvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0
IHsKKyAgLy8gRmllbGQgMTogc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXMKKyAgaWYgKF9oYXNfZmll
bGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgc2FtcGxpbmdfaW50ZXJ2YWxfYnl0
ZXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHByb2Nlc3NfY21kbGluZQorICBmb3IgKGF1dG8m
IGl0IDogcHJvY2Vzc19jbWRsaW5lXykgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIGl0KTsK
KyAgfQorCisgIC8vIEZpZWxkIDQ6IHBpZAorICBmb3IgKGF1dG8mIGl0IDogcGlkXykgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDQsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDIwOiBoZWFwcwor
ICBmb3IgKGF1dG8mIGl0IDogaGVhcHNfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMjAsIGl0
KTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IGFsbAorICBpZiAoX2hhc19maWVsZF9bNV0pIHsKKyAg
ICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNSwgYWxsXyk7CisgIH0KKworICAvLyBGaWVsZCAxNTog
bWluX2Fub255bW91c19tZW1vcnlfa2IKKyAgaWYgKF9oYXNfZmllbGRfWzE1XSkgeworICAgIG1z
Zy0+QXBwZW5kVmFySW50KDE1LCBtaW5fYW5vbnltb3VzX21lbW9yeV9rYl8pOworICB9CisKKyAg
Ly8gRmllbGQgMTY6IG1heF9oZWFwcHJvZmRfbWVtb3J5X2tiCisgIGlmIChfaGFzX2ZpZWxkX1sx
Nl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxNiwgbWF4X2hlYXBwcm9mZF9tZW1vcnlfa2Jf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDE3OiBtYXhfaGVhcHByb2ZkX2NwdV9zZWNzCisgIGlmIChf
aGFzX2ZpZWxkX1sxN10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxNywgbWF4X2hlYXBwcm9m
ZF9jcHVfc2Vjc18pOworICB9CisKKyAgLy8gRmllbGQgNzogc2tpcF9zeW1ib2xfcHJlZml4Cisg
IGZvciAoYXV0byYgaXQgOiBza2lwX3N5bWJvbF9wcmVmaXhfKSB7CisgICAgbXNnLT5BcHBlbmRT
dHJpbmcoNywgaXQpOworICB9CisKKyAgLy8gRmllbGQgNjogY29udGludW91c19kdW1wX2NvbmZp
ZworICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAgICAoKmNvbnRpbnVvdXNfZHVtcF9jb25maWdf
KS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
KDYpKTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IHNobWVtX3NpemVfYnl0ZXMKKyAgaWYgKF9oYXNf
ZmllbGRfWzhdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoOCwgc2htZW1fc2l6ZV9ieXRlc18p
OworICB9CisKKyAgLy8gRmllbGQgOTogYmxvY2tfY2xpZW50CisgIGlmIChfaGFzX2ZpZWxkX1s5
XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg5LCBibG9ja19jbGllbnRfKTsKKyAgfQor
CisgIC8vIEZpZWxkIDE0OiBibG9ja19jbGllbnRfdGltZW91dF91cworICBpZiAoX2hhc19maWVs
ZF9bMTRdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTQsIGJsb2NrX2NsaWVudF90aW1lb3V0
X3VzXyk7CisgIH0KKworICAvLyBGaWVsZCAxMDogbm9fc3RhcnR1cAorICBpZiAoX2hhc19maWVs
ZF9bMTBdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDEwLCBub19zdGFydHVwXyk7Cisg
IH0KKworICAvLyBGaWVsZCAxMTogbm9fcnVubmluZworICBpZiAoX2hhc19maWVsZF9bMTFdKSB7
CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDExLCBub19ydW5uaW5nXyk7CisgIH0KKworICAv
LyBGaWVsZCAxMjogaWRsZV9hbGxvY2F0aW9ucworICBpZiAoX2hhc19maWVsZF9bMTJdKSB7Cisg
ICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDEyLCBpZGxlX2FsbG9jYXRpb25zXyk7CisgIH0KKwor
ICAvLyBGaWVsZCAxMzogZHVtcF9hdF9tYXgKKyAgaWYgKF9oYXNfZmllbGRfWzEzXSkgeworICAg
IG1zZy0+QXBwZW5kVGlueVZhckludCgxMywgZHVtcF9hdF9tYXhfKTsKKyAgfQorCisgIC8vIEZp
ZWxkIDE4OiBkaXNhYmxlX2ZvcmtfdGVhcmRvd24KKyAgaWYgKF9oYXNfZmllbGRfWzE4XSkgewor
ICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgxOCwgZGlzYWJsZV9mb3JrX3RlYXJkb3duXyk7Cisg
IH0KKworICAvLyBGaWVsZCAxOTogZGlzYWJsZV92Zm9ya19kZXRlY3Rpb24KKyAgaWYgKF9oYXNf
ZmllbGRfWzE5XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgxOSwgZGlzYWJsZV92Zm9y
a19kZXRlY3Rpb25fKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3du
X2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitIZWFwcHJv
ZmRDb25maWdfQ29udGludW91c0R1bXBDb25maWc6OkhlYXBwcm9mZENvbmZpZ19Db250aW51b3Vz
RHVtcENvbmZpZygpID0gZGVmYXVsdDsKK0hlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENv
bmZpZzo6fkhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZygpID0gZGVmYXVsdDsK
K0hlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZzo6SGVhcHByb2ZkQ29uZmlnX0Nv
bnRpbnVvdXNEdW1wQ29uZmlnKGNvbnN0IEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENv
bmZpZyYpID0gZGVmYXVsdDsKK0hlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZyYg
SGVhcHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnOjpvcGVyYXRvcj0oY29uc3QgSGVh
cHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnJikgPSBkZWZhdWx0OworSGVhcHByb2Zk
Q29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnOjpIZWFwcHJvZmRDb25maWdfQ29udGludW91c0R1
bXBDb25maWcoSGVhcHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnJiYpIG5vZXhjZXB0
ID0gZGVmYXVsdDsKK0hlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZyYgSGVhcHBy
b2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnOjpvcGVyYXRvcj0oSGVhcHByb2ZkQ29uZmln
X0NvbnRpbnVvdXNEdW1wQ29uZmlnJiYpID0gZGVmYXVsdDsKKworYm9vbCBIZWFwcHJvZmRDb25m
aWdfQ29udGludW91c0R1bXBDb25maWc6Om9wZXJhdG9yPT0oY29uc3QgSGVhcHByb2ZkQ29uZmln
X0NvbnRpbnVvdXNEdW1wQ29uZmlnJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9m
aWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgZHVtcF9waGFzZV9tc18gPT0g
b3RoZXIuZHVtcF9waGFzZV9tc18KKyAgICYmIGR1bXBfaW50ZXJ2YWxfbXNfID09IG90aGVyLmR1
bXBfaW50ZXJ2YWxfbXNfOworfQorCitib29sIEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVt
cENvbmZpZzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgewor
ICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsK
KworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1
dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJl
YWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsK
KyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChm
aWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDUgLyogZHVtcF9waGFzZV9tcyAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZkdW1wX3BoYXNlX21zXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2
IC8qIGR1bXBfaW50ZXJ2YWxfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmZHVtcF9pbnRlcnZh
bF9tc18pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNl
cmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAg
ICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9
CisKK3N0ZDo6c3RyaW5nIEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZzo6U2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gSGVh
cHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29u
c3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBt
c2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJy
YXkoKTsKK30KKwordm9pZCBIZWFwcHJvZmRDb25maWdfQ29udGludW91c0R1bXBDb25maWc6OlNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDU6
IGR1bXBfcGhhc2VfbXMKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7CisgICAgbXNnLT5BcHBlbmRW
YXJJbnQoNSwgZHVtcF9waGFzZV9tc18pOworICB9CisKKyAgLy8gRmllbGQgNjogZHVtcF9pbnRl
cnZhbF9tcworICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg2
LCBkdW1wX2ludGVydmFsX21zXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXMo
dW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30g
IC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFt
ZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3Byb2ZpbGluZy9qYXZh
X2hwcm9mX2NvbmZpZy5nZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdl
bi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3Byb2ZpbGluZy9qYXZhX2hwcm9mX2NvbmZpZy5nZW4u
aAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdp
bgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19QUk9GSUxJ
TkdfSkFWQV9IUFJPRl9DT05GSUdfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1BST0ZJTElOR19KQVZBX0hQUk9GX0NPTkZJR19QUk9U
T19DUFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNs
dWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNz
IEphdmFIcHJvZkNvbmZpZzsKK2NsYXNzIEphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVtcENv
bmZpZzsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3Rvcwor
fSAgLy8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3Nh
Z2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7Citu
YW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBP
UlQgSmF2YUhwcm9mQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsK
KyBwdWJsaWM6CisgIHVzaW5nIENvbnRpbnVvdXNEdW1wQ29uZmlnID0gSmF2YUhwcm9mQ29uZmln
X0NvbnRpbnVvdXNEdW1wQ29uZmlnOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1Byb2Nl
c3NDbWRsaW5lRmllbGROdW1iZXIgPSAxLAorICAgIGtQaWRGaWVsZE51bWJlciA9IDIsCisgICAg
a0NvbnRpbnVvdXNEdW1wQ29uZmlnRmllbGROdW1iZXIgPSAzLAorICAgIGtNaW5Bbm9ueW1vdXNN
ZW1vcnlLYkZpZWxkTnVtYmVyID0gNCwKKyAgICBrRHVtcFNtYXBzRmllbGROdW1iZXIgPSA1LAor
ICB9OworCisgIEphdmFIcHJvZkNvbmZpZygpOworICB+SmF2YUhwcm9mQ29uZmlnKCkgb3ZlcnJp
ZGU7CisgIEphdmFIcHJvZkNvbmZpZyhKYXZhSHByb2ZDb25maWcmJikgbm9leGNlcHQ7CisgIEph
dmFIcHJvZkNvbmZpZyYgb3BlcmF0b3I9KEphdmFIcHJvZkNvbmZpZyYmKTsKKyAgSmF2YUhwcm9m
Q29uZmlnKGNvbnN0IEphdmFIcHJvZkNvbmZpZyYpOworICBKYXZhSHByb2ZDb25maWcmIG9wZXJh
dG9yPShjb25zdCBKYXZhSHByb2ZDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEph
dmFIcHJvZkNvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgSmF2YUhwcm9m
Q29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBi
b29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6
OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rv
cjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2Vy
aWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50IHByb2Nlc3NfY21k
bGluZV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihwcm9jZXNzX2NtZGxp
bmVfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwcm9jZXNz
X2NtZGxpbmUoKSBjb25zdCB7IHJldHVybiBwcm9jZXNzX2NtZGxpbmVfOyB9CisgIHN0ZDo6dmVj
dG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9wcm9jZXNzX2NtZGxpbmUoKSB7IHJldHVybiAmcHJv
Y2Vzc19jbWRsaW5lXzsgfQorICB2b2lkIGNsZWFyX3Byb2Nlc3NfY21kbGluZSgpIHsgcHJvY2Vz
c19jbWRsaW5lXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX3Byb2Nlc3NfY21kbGluZShzdGQ6OnN0
cmluZyB2YWx1ZSkgeyBwcm9jZXNzX2NtZGxpbmVfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAg
c3RkOjpzdHJpbmcqIGFkZF9wcm9jZXNzX2NtZGxpbmUoKSB7IHByb2Nlc3NfY21kbGluZV8uZW1w
bGFjZV9iYWNrKCk7IHJldHVybiAmcHJvY2Vzc19jbWRsaW5lXy5iYWNrKCk7IH0KKworICBpbnQg
cGlkX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHBpZF8uc2l6ZSgpKTsg
fQorICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIHBpZCgpIGNvbnN0IHsgcmV0dXJuIHBp
ZF87IH0KKyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+KiBtdXRhYmxlX3BpZCgpIHsgcmV0dXJuICZw
aWRfOyB9CisgIHZvaWQgY2xlYXJfcGlkKCkgeyBwaWRfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRf
cGlkKHVpbnQ2NF90IHZhbHVlKSB7IHBpZF8uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICB1aW50
NjRfdCogYWRkX3BpZCgpIHsgcGlkXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZwaWRfLmJhY2so
KTsgfQorCisgIGJvb2wgaGFzX2NvbnRpbnVvdXNfZHVtcF9jb25maWcoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1szXTsgfQorICBjb25zdCBKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1
bXBDb25maWcmIGNvbnRpbnVvdXNfZHVtcF9jb25maWcoKSBjb25zdCB7IHJldHVybiAqY29udGlu
dW91c19kdW1wX2NvbmZpZ187IH0KKyAgSmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29u
ZmlnKiBtdXRhYmxlX2NvbnRpbnVvdXNfZHVtcF9jb25maWcoKSB7IF9oYXNfZmllbGRfLnNldCgz
KTsgcmV0dXJuIGNvbnRpbnVvdXNfZHVtcF9jb25maWdfLmdldCgpOyB9CisKKyAgYm9vbCBoYXNf
bWluX2Fub255bW91c19tZW1vcnlfa2IoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsg
fQorICB1aW50MzJfdCBtaW5fYW5vbnltb3VzX21lbW9yeV9rYigpIGNvbnN0IHsgcmV0dXJuIG1p
bl9hbm9ueW1vdXNfbWVtb3J5X2tiXzsgfQorICB2b2lkIHNldF9taW5fYW5vbnltb3VzX21lbW9y
eV9rYih1aW50MzJfdCB2YWx1ZSkgeyBtaW5fYW5vbnltb3VzX21lbW9yeV9rYl8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfZHVtcF9zbWFwcygpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGJvb2wgZHVtcF9zbWFwcygpIGNvbnN0IHsgcmV0
dXJuIGR1bXBfc21hcHNfOyB9CisgIHZvaWQgc2V0X2R1bXBfc21hcHMoYm9vbCB2YWx1ZSkgeyBk
dW1wX3NtYXBzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworIHByaXZhdGU6Cisg
IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwcm9jZXNzX2NtZGxpbmVfOworICBzdGQ6OnZlY3Rv
cjx1aW50NjRfdD4gcGlkXzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPEphdmFIcHJvZkNv
bmZpZ19Db250aW51b3VzRHVtcENvbmZpZz4gY29udGludW91c19kdW1wX2NvbmZpZ187CisgIHVp
bnQzMl90IG1pbl9hbm9ueW1vdXNfbWVtb3J5X2tiX3t9OworICBib29sIGR1bXBfc21hcHNfe307
CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBj
b21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4K
KyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDY+IF9oYXNf
ZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBKYXZhSHByb2ZDb25maWdf
Q29udGludW91c0R1bXBDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmog
eworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtEdW1wUGhhc2VNc0ZpZWxk
TnVtYmVyID0gMSwKKyAgICBrRHVtcEludGVydmFsTXNGaWVsZE51bWJlciA9IDIsCisgIH07CisK
KyAgSmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnKCk7CisgIH5KYXZhSHByb2ZD
b25maWdfQ29udGludW91c0R1bXBDb25maWcoKSBvdmVycmlkZTsKKyAgSmF2YUhwcm9mQ29uZmln
X0NvbnRpbnVvdXNEdW1wQ29uZmlnKEphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVtcENvbmZp
ZyYmKSBub2V4Y2VwdDsKKyAgSmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnJiBv
cGVyYXRvcj0oSmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnJiYpOworICBKYXZh
SHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWcoY29uc3QgSmF2YUhwcm9mQ29uZmlnX0Nv
bnRpbnVvdXNEdW1wQ29uZmlnJik7CisgIEphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVtcENv
bmZpZyYgb3BlcmF0b3I9KGNvbnN0IEphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVtcENvbmZp
ZyYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNE
dW1wQ29uZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBKYXZhSHByb2ZDb25m
aWdfQ29udGludW91c0R1bXBDb25maWcmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09
IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkg
b3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJp
ZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVy
cmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKwor
ICBib29sIGhhc19kdW1wX3BoYXNlX21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07
IH0KKyAgdWludDMyX3QgZHVtcF9waGFzZV9tcygpIGNvbnN0IHsgcmV0dXJuIGR1bXBfcGhhc2Vf
bXNfOyB9CisgIHZvaWQgc2V0X2R1bXBfcGhhc2VfbXModWludDMyX3QgdmFsdWUpIHsgZHVtcF9w
aGFzZV9tc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfZHVt
cF9pbnRlcnZhbF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIHVpbnQz
Ml90IGR1bXBfaW50ZXJ2YWxfbXMoKSBjb25zdCB7IHJldHVybiBkdW1wX2ludGVydmFsX21zXzsg
fQorICB2b2lkIHNldF9kdW1wX2ludGVydmFsX21zKHVpbnQzMl90IHZhbHVlKSB7IGR1bXBfaW50
ZXJ2YWxfbXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToKKyAg
dWludDMyX3QgZHVtcF9waGFzZV9tc197fTsKKyAgdWludDMyX3QgZHVtcF9pbnRlcnZhbF9tc197
fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9y
IGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVz
LgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mz4gX2hh
c19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNw
YWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1BST0ZJTElOR19KQVZBX0hQUk9GX0NPTkZJR19Q
Uk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3By
b3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElU
LiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRp
YWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVx
dWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZl
dHRvL2NvbmZpZy9wcm9maWxpbmcvamF2YV9ocHJvZl9jb25maWcuZ2VuLmgiCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitKYXZh
SHByb2ZDb25maWc6OkphdmFIcHJvZkNvbmZpZygpID0gZGVmYXVsdDsKK0phdmFIcHJvZkNvbmZp
Zzo6fkphdmFIcHJvZkNvbmZpZygpID0gZGVmYXVsdDsKK0phdmFIcHJvZkNvbmZpZzo6SmF2YUhw
cm9mQ29uZmlnKGNvbnN0IEphdmFIcHJvZkNvbmZpZyYpID0gZGVmYXVsdDsKK0phdmFIcHJvZkNv
bmZpZyYgSmF2YUhwcm9mQ29uZmlnOjpvcGVyYXRvcj0oY29uc3QgSmF2YUhwcm9mQ29uZmlnJikg
PSBkZWZhdWx0OworSmF2YUhwcm9mQ29uZmlnOjpKYXZhSHByb2ZDb25maWcoSmF2YUhwcm9mQ29u
ZmlnJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0phdmFIcHJvZkNvbmZpZyYgSmF2YUhwcm9mQ29u
ZmlnOjpvcGVyYXRvcj0oSmF2YUhwcm9mQ29uZmlnJiYpID0gZGVmYXVsdDsKKworYm9vbCBKYXZh
SHByb2ZDb25maWc6Om9wZXJhdG9yPT0oY29uc3QgSmF2YUhwcm9mQ29uZmlnJiBvdGhlcikgY29u
c3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXwor
ICAgJiYgcHJvY2Vzc19jbWRsaW5lXyA9PSBvdGhlci5wcm9jZXNzX2NtZGxpbmVfCisgICAmJiBw
aWRfID09IG90aGVyLnBpZF8KKyAgICYmIGNvbnRpbnVvdXNfZHVtcF9jb25maWdfID09IG90aGVy
LmNvbnRpbnVvdXNfZHVtcF9jb25maWdfCisgICAmJiBtaW5fYW5vbnltb3VzX21lbW9yeV9rYl8g
PT0gb3RoZXIubWluX2Fub255bW91c19tZW1vcnlfa2JfCisgICAmJiBkdW1wX3NtYXBzXyA9PSBv
dGhlci5kdW1wX3NtYXBzXzsKK30KKworYm9vbCBKYXZhSHByb2ZDb25maWc6OlBhcnNlRnJvbUFy
cmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgcHJvY2Vzc19jbWRsaW5lXy5j
bGVhcigpOworICBwaWRfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBi
b29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIg
ZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmll
bGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQo
KSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlk
KCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBw
cm9jZXNzX2NtZGxpbmUgKi86CisgICAgICAgIHByb2Nlc3NfY21kbGluZV8uZW1wbGFjZV9iYWNr
KCk7CisgICAgICAgIGZpZWxkLmdldCgmcHJvY2Vzc19jbWRsaW5lXy5iYWNrKCkpOworICAgICAg
ICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBwaWQgKi86CisgICAgICAgIHBpZF8uZW1wbGFjZV9i
YWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmcGlkXy5iYWNrKCkpOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgMyAvKiBjb250aW51b3VzX2R1bXBfY29uZmlnICovOgorICAgICAgICAoKmNv
bnRpbnVvdXNfZHVtcF9jb25maWdfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmlu
ZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyogbWluX2Fub255bW91c19tZW1v
cnlfa2IgKi86CisgICAgICAgIGZpZWxkLmdldCgmbWluX2Fub255bW91c19tZW1vcnlfa2JfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUgLyogZHVtcF9zbWFwcyAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZkdW1wX3NtYXBzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoK
KyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVj
LmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgSmF2YUhwcm9mQ29uZmlnOjpTZXJpYWxp
emVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3Rv
emVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1z
Zy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBKYXZhSHBy
b2ZDb25maWc6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFw
QnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQo
KSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEphdmFIcHJv
ZkNvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAg
Ly8gRmllbGQgMTogcHJvY2Vzc19jbWRsaW5lCisgIGZvciAoYXV0byYgaXQgOiBwcm9jZXNzX2Nt
ZGxpbmVfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMSwgaXQpOworICB9CisKKyAgLy8gRmll
bGQgMjogcGlkCisgIGZvciAoYXV0byYgaXQgOiBwaWRfKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJ
bnQoMiwgaXQpOworICB9CisKKyAgLy8gRmllbGQgMzogY29udGludW91c19kdW1wX2NvbmZpZwor
ICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICAoKmNvbnRpbnVvdXNfZHVtcF9jb25maWdfKS5T
ZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDMp
KTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IG1pbl9hbm9ueW1vdXNfbWVtb3J5X2tiCisgIGlmIChf
aGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDQsIG1pbl9hbm9ueW1vdXNf
bWVtb3J5X2tiXyk7CisgIH0KKworICAvLyBGaWVsZCA1OiBkdW1wX3NtYXBzCisgIGlmIChfaGFz
X2ZpZWxkX1s1XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg1LCBkdW1wX3NtYXBzXyk7
CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEo
KSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworSmF2YUhwcm9mQ29uZmlnX0NvbnRp
bnVvdXNEdW1wQ29uZmlnOjpKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWcoKSA9
IGRlZmF1bHQ7CitKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWc6On5KYXZhSHBy
b2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWcoKSA9IGRlZmF1bHQ7CitKYXZhSHByb2ZDb25m
aWdfQ29udGludW91c0R1bXBDb25maWc6OkphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVtcENv
bmZpZyhjb25zdCBKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWcmKSA9IGRlZmF1
bHQ7CitKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWcmIEphdmFIcHJvZkNvbmZp
Z19Db250aW51b3VzRHVtcENvbmZpZzo6b3BlcmF0b3I9KGNvbnN0IEphdmFIcHJvZkNvbmZpZ19D
b250aW51b3VzRHVtcENvbmZpZyYpID0gZGVmYXVsdDsKK0phdmFIcHJvZkNvbmZpZ19Db250aW51
b3VzRHVtcENvbmZpZzo6SmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnKEphdmFI
cHJvZkNvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitK
YXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWcmIEphdmFIcHJvZkNvbmZpZ19Db250
aW51b3VzRHVtcENvbmZpZzo6b3BlcmF0b3I9KEphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVt
cENvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgSmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNE
dW1wQ29uZmlnOjpvcGVyYXRvcj09KGNvbnN0IEphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVt
cENvbmZpZyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhl
ci51bmtub3duX2ZpZWxkc18KKyAgICYmIGR1bXBfcGhhc2VfbXNfID09IG90aGVyLmR1bXBfcGhh
c2VfbXNfCisgICAmJiBkdW1wX2ludGVydmFsX21zXyA9PSBvdGhlci5kdW1wX2ludGVydmFsX21z
XzsKK30KKworYm9vbCBKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWc6OlBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVs
ZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3pl
cm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVj
LlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgewor
ICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2Zp
ZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgewor
ICAgICAgY2FzZSAxIC8qIGR1bXBfcGhhc2VfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmZHVt
cF9waGFzZV9tc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBkdW1wX2ludGVy
dmFsX21zICovOgorICAgICAgICBmaWVsZC5nZXQoJmR1bXBfaW50ZXJ2YWxfbXNfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBl
bmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJl
dHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmlu
ZyBKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWc6OlNlcmlhbGl6ZUFzU3RyaW5n
KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6
ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEphdmFIcHJvZkNvbmZpZ19D
b250aW51b3VzRHVtcENvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3Zv
aWQgSmF2YUhwcm9mQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnOjpTZXJpYWxpemUoOjpwcm90
b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBkdW1wX3BoYXNlX21z
CisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGR1bXBf
cGhhc2VfbXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGR1bXBfaW50ZXJ2YWxfbXMKKyAgaWYg
KF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgZHVtcF9pbnRlcnZh
bF9tc18pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRz
Xy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNw
cmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNl
OiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9wcm9maWxpbmcvcGVyZl9ldmVudF9jb25maWcu
Z2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL2NvbmZpZy9wcm9maWxpbmcvcGVyZl9ldmVudF9jb25maWcuZ2VuLmgKKy8vIERPIE5PVCBF
RElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVS
RkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfUFJPRklMSU5HX1BFUkZfRVZFTlRf
Q09ORklHX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTkZJR19QUk9GSUxJTkdfUEVSRl9FVkVOVF9DT05GSUdfUFJPVE9fQ1BQX0hfCisKKyNp
bmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgor
I2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdl
X29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBQZXJmRXZlbnRDb25m
aWc7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30g
IC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdl
OworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JU
IFBlcmZFdmVudENvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7Cisg
cHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0FsbENwdXNGaWVsZE51bWJlciA9
IDEsCisgICAga1NhbXBsaW5nRnJlcXVlbmN5RmllbGROdW1iZXIgPSAyLAorICAgIGtSaW5nQnVm
ZmVyUmVhZFBlcmlvZE1zRmllbGROdW1iZXIgPSA4LAorICAgIGtSaW5nQnVmZmVyUGFnZXNGaWVs
ZE51bWJlciA9IDMsCisgICAga1RhcmdldFBpZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrVGFyZ2V0
Q21kbGluZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrRXhjbHVkZVBpZEZpZWxkTnVtYmVyID0gNiwK
KyAgICBrRXhjbHVkZUNtZGxpbmVGaWVsZE51bWJlciA9IDcsCisgICAga1JlbW90ZURlc2NyaXB0
b3JUaW1lb3V0TXNGaWVsZE51bWJlciA9IDksCisgICAga1Vud2luZFN0YXRlQ2xlYXJQZXJpb2RN
c0ZpZWxkTnVtYmVyID0gMTAsCisgIH07CisKKyAgUGVyZkV2ZW50Q29uZmlnKCk7CisgIH5QZXJm
RXZlbnRDb25maWcoKSBvdmVycmlkZTsKKyAgUGVyZkV2ZW50Q29uZmlnKFBlcmZFdmVudENvbmZp
ZyYmKSBub2V4Y2VwdDsKKyAgUGVyZkV2ZW50Q29uZmlnJiBvcGVyYXRvcj0oUGVyZkV2ZW50Q29u
ZmlnJiYpOworICBQZXJmRXZlbnRDb25maWcoY29uc3QgUGVyZkV2ZW50Q29uZmlnJik7CisgIFBl
cmZFdmVudENvbmZpZyYgb3BlcmF0b3I9KGNvbnN0IFBlcmZFdmVudENvbmZpZyYpOworICBib29s
IG9wZXJhdG9yPT0oY29uc3QgUGVyZkV2ZW50Q29uZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBQZXJmRXZlbnRDb25maWcmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVf
dCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3Zl
cnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBv
dmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsK
KworICBib29sIGhhc19hbGxfY3B1cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9
CisgIGJvb2wgYWxsX2NwdXMoKSBjb25zdCB7IHJldHVybiBhbGxfY3B1c187IH0KKyAgdm9pZCBz
ZXRfYWxsX2NwdXMoYm9vbCB2YWx1ZSkgeyBhbGxfY3B1c18gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfc2FtcGxpbmdfZnJlcXVlbmN5KCkgY29uc3QgeyByZXR1
cm4gX2hhc19maWVsZF9bMl07IH0KKyAgdWludDMyX3Qgc2FtcGxpbmdfZnJlcXVlbmN5KCkgY29u
c3QgeyByZXR1cm4gc2FtcGxpbmdfZnJlcXVlbmN5XzsgfQorICB2b2lkIHNldF9zYW1wbGluZ19m
cmVxdWVuY3kodWludDMyX3QgdmFsdWUpIHsgc2FtcGxpbmdfZnJlcXVlbmN5XyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc19yaW5nX2J1ZmZlcl9yZWFkX3Blcmlv
ZF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzhdOyB9CisgIHVpbnQzMl90IHJpbmdf
YnVmZmVyX3JlYWRfcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gcmluZ19idWZmZXJfcmVhZF9w
ZXJpb2RfbXNfOyB9CisgIHZvaWQgc2V0X3JpbmdfYnVmZmVyX3JlYWRfcGVyaW9kX21zKHVpbnQz
Ml90IHZhbHVlKSB7IHJpbmdfYnVmZmVyX3JlYWRfcGVyaW9kX21zXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoOCk7IH0KKworICBib29sIGhhc19yaW5nX2J1ZmZlcl9wYWdlcygpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIHVpbnQzMl90IHJpbmdfYnVmZmVyX3BhZ2VzKCkg
Y29uc3QgeyByZXR1cm4gcmluZ19idWZmZXJfcGFnZXNfOyB9CisgIHZvaWQgc2V0X3JpbmdfYnVm
ZmVyX3BhZ2VzKHVpbnQzMl90IHZhbHVlKSB7IHJpbmdfYnVmZmVyX3BhZ2VzXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBpbnQgdGFyZ2V0X3BpZF9zaXplKCkgY29uc3QgeyBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0YXJnZXRfcGlkXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0
ZDo6dmVjdG9yPGludDMyX3Q+JiB0YXJnZXRfcGlkKCkgY29uc3QgeyByZXR1cm4gdGFyZ2V0X3Bp
ZF87IH0KKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG11dGFibGVfdGFyZ2V0X3BpZCgpIHsgcmV0
dXJuICZ0YXJnZXRfcGlkXzsgfQorICB2b2lkIGNsZWFyX3RhcmdldF9waWQoKSB7IHRhcmdldF9w
aWRfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfdGFyZ2V0X3BpZChpbnQzMl90IHZhbHVlKSB7IHRh
cmdldF9waWRfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgaW50MzJfdCogYWRkX3RhcmdldF9w
aWQoKSB7IHRhcmdldF9waWRfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnRhcmdldF9waWRfLmJh
Y2soKTsgfQorCisgIGludCB0YXJnZXRfY21kbGluZV9zaXplKCkgY29uc3QgeyByZXR1cm4gc3Rh
dGljX2Nhc3Q8aW50Pih0YXJnZXRfY21kbGluZV8uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZl
Y3RvcjxzdGQ6OnN0cmluZz4mIHRhcmdldF9jbWRsaW5lKCkgY29uc3QgeyByZXR1cm4gdGFyZ2V0
X2NtZGxpbmVfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV90YXJnZXRf
Y21kbGluZSgpIHsgcmV0dXJuICZ0YXJnZXRfY21kbGluZV87IH0KKyAgdm9pZCBjbGVhcl90YXJn
ZXRfY21kbGluZSgpIHsgdGFyZ2V0X2NtZGxpbmVfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfdGFy
Z2V0X2NtZGxpbmUoc3RkOjpzdHJpbmcgdmFsdWUpIHsgdGFyZ2V0X2NtZGxpbmVfLmVtcGxhY2Vf
YmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF90YXJnZXRfY21kbGluZSgpIHsgdGFy
Z2V0X2NtZGxpbmVfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnRhcmdldF9jbWRsaW5lXy5iYWNr
KCk7IH0KKworICBpbnQgZXhjbHVkZV9waWRfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19j
YXN0PGludD4oZXhjbHVkZV9waWRfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50
MzJfdD4mIGV4Y2x1ZGVfcGlkKCkgY29uc3QgeyByZXR1cm4gZXhjbHVkZV9waWRfOyB9CisgIHN0
ZDo6dmVjdG9yPGludDMyX3Q+KiBtdXRhYmxlX2V4Y2x1ZGVfcGlkKCkgeyByZXR1cm4gJmV4Y2x1
ZGVfcGlkXzsgfQorICB2b2lkIGNsZWFyX2V4Y2x1ZGVfcGlkKCkgeyBleGNsdWRlX3BpZF8uY2xl
YXIoKTsgfQorICB2b2lkIGFkZF9leGNsdWRlX3BpZChpbnQzMl90IHZhbHVlKSB7IGV4Y2x1ZGVf
cGlkXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIGludDMyX3QqIGFkZF9leGNsdWRlX3BpZCgp
IHsgZXhjbHVkZV9waWRfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJmV4Y2x1ZGVfcGlkXy5iYWNr
KCk7IH0KKworICBpbnQgZXhjbHVkZV9jbWRsaW5lX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0
aWNfY2FzdDxpbnQ+KGV4Y2x1ZGVfY21kbGluZV8uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZl
Y3RvcjxzdGQ6OnN0cmluZz4mIGV4Y2x1ZGVfY21kbGluZSgpIGNvbnN0IHsgcmV0dXJuIGV4Y2x1
ZGVfY21kbGluZV87IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2V4Y2x1
ZGVfY21kbGluZSgpIHsgcmV0dXJuICZleGNsdWRlX2NtZGxpbmVfOyB9CisgIHZvaWQgY2xlYXJf
ZXhjbHVkZV9jbWRsaW5lKCkgeyBleGNsdWRlX2NtZGxpbmVfLmNsZWFyKCk7IH0KKyAgdm9pZCBh
ZGRfZXhjbHVkZV9jbWRsaW5lKHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGV4Y2x1ZGVfY21kbGluZV8u
ZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBzdGQ6OnN0cmluZyogYWRkX2V4Y2x1ZGVfY21kbGlu
ZSgpIHsgZXhjbHVkZV9jbWRsaW5lXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZleGNsdWRlX2Nt
ZGxpbmVfLmJhY2soKTsgfQorCisgIGJvb2wgaGFzX3JlbW90ZV9kZXNjcmlwdG9yX3RpbWVvdXRf
bXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s5XTsgfQorICB1aW50MzJfdCByZW1vdGVf
ZGVzY3JpcHRvcl90aW1lb3V0X21zKCkgY29uc3QgeyByZXR1cm4gcmVtb3RlX2Rlc2NyaXB0b3Jf
dGltZW91dF9tc187IH0KKyAgdm9pZCBzZXRfcmVtb3RlX2Rlc2NyaXB0b3JfdGltZW91dF9tcyh1
aW50MzJfdCB2YWx1ZSkgeyByZW1vdGVfZGVzY3JpcHRvcl90aW1lb3V0X21zXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoOSk7IH0KKworICBib29sIGhhc191bndpbmRfc3RhdGVfY2xlYXJfcGVy
aW9kX21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTBdOyB9CisgIHVpbnQzMl90IHVu
d2luZF9zdGF0ZV9jbGVhcl9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiB1bndpbmRfc3RhdGVf
Y2xlYXJfcGVyaW9kX21zXzsgfQorICB2b2lkIHNldF91bndpbmRfc3RhdGVfY2xlYXJfcGVyaW9k
X21zKHVpbnQzMl90IHZhbHVlKSB7IHVud2luZF9zdGF0ZV9jbGVhcl9wZXJpb2RfbXNfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCgxMCk7IH0KKworIHByaXZhdGU6CisgIGJvb2wgYWxsX2NwdXNf
e307CisgIHVpbnQzMl90IHNhbXBsaW5nX2ZyZXF1ZW5jeV97fTsKKyAgdWludDMyX3QgcmluZ19i
dWZmZXJfcmVhZF9wZXJpb2RfbXNfe307CisgIHVpbnQzMl90IHJpbmdfYnVmZmVyX3BhZ2VzX3t9
OworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YXJnZXRfcGlkXzsKKyAgc3RkOjp2ZWN0b3I8c3Rk
OjpzdHJpbmc+IHRhcmdldF9jbWRsaW5lXzsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZXhjbHVk
ZV9waWRfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhjbHVkZV9jbWRsaW5lXzsKKyAg
dWludDMyX3QgcmVtb3RlX2Rlc2NyaXB0b3JfdGltZW91dF9tc197fTsKKyAgdWludDMyX3QgdW53
aW5kX3N0YXRlX2NsZWFyX3BlcmlvZF9tc197fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUg
dW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1
cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxk
c187CisKKyAgc3RkOjpiaXRzZXQ8MTE+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1l
c3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBn
ZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19Q
Uk9GSUxJTkdfUEVSRl9FVkVOVF9DT05GSUdfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Bh
Y2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hl
YXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBj
cHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRp
YWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvZmlsaW5nL3BlcmZfZXZl
bnRfY29uZmlnLmdlbi5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3Rv
cyB7CituYW1lc3BhY2UgZ2VuIHsKKworUGVyZkV2ZW50Q29uZmlnOjpQZXJmRXZlbnRDb25maWco
KSA9IGRlZmF1bHQ7CitQZXJmRXZlbnRDb25maWc6On5QZXJmRXZlbnRDb25maWcoKSA9IGRlZmF1
bHQ7CitQZXJmRXZlbnRDb25maWc6OlBlcmZFdmVudENvbmZpZyhjb25zdCBQZXJmRXZlbnRDb25m
aWcmKSA9IGRlZmF1bHQ7CitQZXJmRXZlbnRDb25maWcmIFBlcmZFdmVudENvbmZpZzo6b3BlcmF0
b3I9KGNvbnN0IFBlcmZFdmVudENvbmZpZyYpID0gZGVmYXVsdDsKK1BlcmZFdmVudENvbmZpZzo6
UGVyZkV2ZW50Q29uZmlnKFBlcmZFdmVudENvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitQ
ZXJmRXZlbnRDb25maWcmIFBlcmZFdmVudENvbmZpZzo6b3BlcmF0b3I9KFBlcmZFdmVudENvbmZp
ZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgUGVyZkV2ZW50Q29uZmlnOjpvcGVyYXRvcj09KGNvbnN0
IFBlcmZFdmVudENvbmZpZyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRz
XyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGFsbF9jcHVzXyA9PSBvdGhlci5hbGxf
Y3B1c18KKyAgICYmIHNhbXBsaW5nX2ZyZXF1ZW5jeV8gPT0gb3RoZXIuc2FtcGxpbmdfZnJlcXVl
bmN5XworICAgJiYgcmluZ19idWZmZXJfcmVhZF9wZXJpb2RfbXNfID09IG90aGVyLnJpbmdfYnVm
ZmVyX3JlYWRfcGVyaW9kX21zXworICAgJiYgcmluZ19idWZmZXJfcGFnZXNfID09IG90aGVyLnJp
bmdfYnVmZmVyX3BhZ2VzXworICAgJiYgdGFyZ2V0X3BpZF8gPT0gb3RoZXIudGFyZ2V0X3BpZF8K
KyAgICYmIHRhcmdldF9jbWRsaW5lXyA9PSBvdGhlci50YXJnZXRfY21kbGluZV8KKyAgICYmIGV4
Y2x1ZGVfcGlkXyA9PSBvdGhlci5leGNsdWRlX3BpZF8KKyAgICYmIGV4Y2x1ZGVfY21kbGluZV8g
PT0gb3RoZXIuZXhjbHVkZV9jbWRsaW5lXworICAgJiYgcmVtb3RlX2Rlc2NyaXB0b3JfdGltZW91
dF9tc18gPT0gb3RoZXIucmVtb3RlX2Rlc2NyaXB0b3JfdGltZW91dF9tc18KKyAgICYmIHVud2lu
ZF9zdGF0ZV9jbGVhcl9wZXJpb2RfbXNfID09IG90aGVyLnVud2luZF9zdGF0ZV9jbGVhcl9wZXJp
b2RfbXNfOworfQorCitib29sIFBlcmZFdmVudENvbmZpZzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qg
dm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB0YXJnZXRfcGlkXy5jbGVhcigpOworICB0YXJn
ZXRfY21kbGluZV8uY2xlYXIoKTsKKyAgZXhjbHVkZV9waWRfLmNsZWFyKCk7CisgIGV4Y2x1ZGVf
Y21kbGluZV8uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFj
a2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3
LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxp
ZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hh
c19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7Cisg
ICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGFsbF9jcHVz
ICovOgorICAgICAgICBmaWVsZC5nZXQoJmFsbF9jcHVzXyk7CisgICAgICAgIGJyZWFrOworICAg
ICAgY2FzZSAyIC8qIHNhbXBsaW5nX2ZyZXF1ZW5jeSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZz
YW1wbGluZ19mcmVxdWVuY3lfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDggLyogcmlu
Z19idWZmZXJfcmVhZF9wZXJpb2RfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmcmluZ19idWZm
ZXJfcmVhZF9wZXJpb2RfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogcmlu
Z19idWZmZXJfcGFnZXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmcmluZ19idWZmZXJfcGFnZXNf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyogdGFyZ2V0X3BpZCAqLzoKKyAgICAg
ICAgdGFyZ2V0X3BpZF8uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmdGFyZ2V0
X3BpZF8uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUgLyogdGFyZ2V0X2Nt
ZGxpbmUgKi86CisgICAgICAgIHRhcmdldF9jbWRsaW5lXy5lbXBsYWNlX2JhY2soKTsKKyAgICAg
ICAgZmllbGQuZ2V0KCZ0YXJnZXRfY21kbGluZV8uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDYgLyogZXhjbHVkZV9waWQgKi86CisgICAgICAgIGV4Y2x1ZGVfcGlkXy5lbXBs
YWNlX2JhY2soKTsKKyAgICAgICAgZmllbGQuZ2V0KCZleGNsdWRlX3BpZF8uYmFjaygpKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgICBjYXNlIDcgLyogZXhjbHVkZV9jbWRsaW5lICovOgorICAgICAg
ICBleGNsdWRlX2NtZGxpbmVfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmV4
Y2x1ZGVfY21kbGluZV8uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDkgLyog
cmVtb3RlX2Rlc2NyaXB0b3JfdGltZW91dF9tcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZyZW1v
dGVfZGVzY3JpcHRvcl90aW1lb3V0X21zXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAx
MCAvKiB1bndpbmRfc3RhdGVfY2xlYXJfcGVyaW9kX21zICovOgorICAgICAgICBmaWVsZC5nZXQo
JnVud2luZF9zdGF0ZV9jbGVhcl9wZXJpb2RfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBk
ZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVs
ZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9y
ICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBQZXJmRXZlbnRDb25maWc6
OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVk
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICBy
ZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IFBlcmZFdmVudENvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3pl
cm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUo
bXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQg
UGVyZkV2ZW50Q29uZmlnOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29u
c3QgeworICAvLyBGaWVsZCAxOiBhbGxfY3B1cworICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAg
ICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoMSwgYWxsX2NwdXNfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDI6IHNhbXBsaW5nX2ZyZXF1ZW5jeQorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCgyLCBzYW1wbGluZ19mcmVxdWVuY3lfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDg6IHJpbmdfYnVmZmVyX3JlYWRfcGVyaW9kX21zCisgIGlmIChfaGFzX2ZpZWxkX1s4XSkgewor
ICAgIG1zZy0+QXBwZW5kVmFySW50KDgsIHJpbmdfYnVmZmVyX3JlYWRfcGVyaW9kX21zXyk7Cisg
IH0KKworICAvLyBGaWVsZCAzOiByaW5nX2J1ZmZlcl9wYWdlcworICBpZiAoX2hhc19maWVsZF9b
M10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgzLCByaW5nX2J1ZmZlcl9wYWdlc18pOworICB9
CisKKyAgLy8gRmllbGQgNDogdGFyZ2V0X3BpZAorICBmb3IgKGF1dG8mIGl0IDogdGFyZ2V0X3Bp
ZF8pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg0LCBpdCk7CisgIH0KKworICAvLyBGaWVsZCA1
OiB0YXJnZXRfY21kbGluZQorICBmb3IgKGF1dG8mIGl0IDogdGFyZ2V0X2NtZGxpbmVfKSB7Cisg
ICAgbXNnLT5BcHBlbmRTdHJpbmcoNSwgaXQpOworICB9CisKKyAgLy8gRmllbGQgNjogZXhjbHVk
ZV9waWQKKyAgZm9yIChhdXRvJiBpdCA6IGV4Y2x1ZGVfcGlkXykgeworICAgIG1zZy0+QXBwZW5k
VmFySW50KDYsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDc6IGV4Y2x1ZGVfY21kbGluZQorICBm
b3IgKGF1dG8mIGl0IDogZXhjbHVkZV9jbWRsaW5lXykgeworICAgIG1zZy0+QXBwZW5kU3RyaW5n
KDcsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDk6IHJlbW90ZV9kZXNjcmlwdG9yX3RpbWVvdXRf
bXMKKyAgaWYgKF9oYXNfZmllbGRfWzldKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoOSwgcmVt
b3RlX2Rlc2NyaXB0b3JfdGltZW91dF9tc18pOworICB9CisKKyAgLy8gRmllbGQgMTA6IHVud2lu
ZF9zdGF0ZV9jbGVhcl9wZXJpb2RfbXMKKyAgaWYgKF9oYXNfZmllbGRfWzEwXSkgeworICAgIG1z
Zy0+QXBwZW5kVmFySW50KDEwLCB1bndpbmRfc3RhdGVfY2xlYXJfcGVyaW9kX21zXyk7CisgIH0K
KworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5r
bm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlh
Z25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3Mv
cGVyZmV0dG8vY29uZmlnL3N5c19zdGF0cy9zeXNfc3RhdHNfY29uZmlnLmdlbi5jYworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvc3lz
X3N0YXRzL3N5c19zdGF0c19jb25maWcuZ2VuLmgKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJh
dGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BS
T1RPU19QRVJGRVRUT19DT05GSUdfU1lTX1NUQVRTX1NZU19TVEFUU19DT05GSUdfUFJPVE9fQ1BQ
X0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1NZU19T
VEFUU19TWVNfU1RBVFNfQ09ORklHX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+
CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+
CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJs
ZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9z
IHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgU3lzU3RhdHNDb25maWc7CitlbnVtIFN5c1N0YXRz
Q29uZmlnX1N0YXRDb3VudGVycyA6IGludDsKK2VudW0gTWVtaW5mb0NvdW50ZXJzIDogaW50Owor
ZW51bSBWbXN0YXRDb3VudGVycyA6IGludDsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJv
dG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25h
bWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4gewor
ZW51bSBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnMgOiBpbnQgeworICBTeXNTdGF0c0NvbmZp
Z19TdGF0Q291bnRlcnNfU1RBVF9VTlNQRUNJRklFRCA9IDAsCisgIFN5c1N0YXRzQ29uZmlnX1N0
YXRDb3VudGVyc19TVEFUX0NQVV9USU1FUyA9IDEsCisgIFN5c1N0YXRzQ29uZmlnX1N0YXRDb3Vu
dGVyc19TVEFUX0lSUV9DT1VOVFMgPSAyLAorICBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnNf
U1RBVF9TT0ZUSVJRX0NPVU5UUyA9IDMsCisgIFN5c1N0YXRzQ29uZmlnX1N0YXRDb3VudGVyc19T
VEFUX0ZPUktfQ09VTlQgPSA0LAorfTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFN5c1N0YXRz
Q29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIFN0YXRDb3VudGVycyA9IFN5c1N0YXRzQ29uZmlnX1N0YXRDb3VudGVyczsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIFNUQVRfVU5TUEVDSUZJRUQgPSBTeXNTdGF0c0NvbmZpZ19TdGF0
Q291bnRlcnNfU1RBVF9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNUQVRf
Q1BVX1RJTUVTID0gU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzX1NUQVRfQ1BVX1RJTUVTOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gU1RBVF9JUlFfQ09VTlRTID0gU3lzU3RhdHNDb25maWdf
U3RhdENvdW50ZXJzX1NUQVRfSVJRX0NPVU5UUzsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNU
QVRfU09GVElSUV9DT1VOVFMgPSBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnNfU1RBVF9TT0ZU
SVJRX0NPVU5UUzsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNUQVRfRk9SS19DT1VOVCA9IFN5
c1N0YXRzQ29uZmlnX1N0YXRDb3VudGVyc19TVEFUX0ZPUktfQ09VTlQ7CisgIHN0YXRpYyBjb25z
dGV4cHIgYXV0byBTdGF0Q291bnRlcnNfTUlOID0gU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJz
X1NUQVRfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTdGF0Q291bnRlcnNf
TUFYID0gU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzX1NUQVRfRk9SS19DT1VOVDsKKyAgZW51
bSBGaWVsZE51bWJlcnMgeworICAgIGtNZW1pbmZvUGVyaW9kTXNGaWVsZE51bWJlciA9IDEsCisg
ICAga01lbWluZm9Db3VudGVyc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrVm1zdGF0UGVyaW9kTXNG
aWVsZE51bWJlciA9IDMsCisgICAga1Ztc3RhdENvdW50ZXJzRmllbGROdW1iZXIgPSA0LAorICAg
IGtTdGF0UGVyaW9kTXNGaWVsZE51bWJlciA9IDUsCisgICAga1N0YXRDb3VudGVyc0ZpZWxkTnVt
YmVyID0gNiwKKyAgfTsKKworICBTeXNTdGF0c0NvbmZpZygpOworICB+U3lzU3RhdHNDb25maWco
KSBvdmVycmlkZTsKKyAgU3lzU3RhdHNDb25maWcoU3lzU3RhdHNDb25maWcmJikgbm9leGNlcHQ7
CisgIFN5c1N0YXRzQ29uZmlnJiBvcGVyYXRvcj0oU3lzU3RhdHNDb25maWcmJik7CisgIFN5c1N0
YXRzQ29uZmlnKGNvbnN0IFN5c1N0YXRzQ29uZmlnJik7CisgIFN5c1N0YXRzQ29uZmlnJiBvcGVy
YXRvcj0oY29uc3QgU3lzU3RhdHNDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN5
c1N0YXRzQ29uZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTeXNTdGF0c0Nv
bmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9v
bCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpz
dHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8
dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlh
bGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX21lbWluZm9f
cGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDMyX3Qg
bWVtaW5mb19wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBtZW1pbmZvX3BlcmlvZF9tc187IH0K
KyAgdm9pZCBzZXRfbWVtaW5mb19wZXJpb2RfbXModWludDMyX3QgdmFsdWUpIHsgbWVtaW5mb19w
ZXJpb2RfbXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGludCBtZW1pbmZv
X2NvdW50ZXJzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1lbWluZm9f
Y291bnRlcnNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVtaW5mb0NvdW50ZXJz
PiYgbWVtaW5mb19jb3VudGVycygpIGNvbnN0IHsgcmV0dXJuIG1lbWluZm9fY291bnRlcnNfOyB9
CisgIHN0ZDo6dmVjdG9yPE1lbWluZm9Db3VudGVycz4qIG11dGFibGVfbWVtaW5mb19jb3VudGVy
cygpIHsgcmV0dXJuICZtZW1pbmZvX2NvdW50ZXJzXzsgfQorICB2b2lkIGNsZWFyX21lbWluZm9f
Y291bnRlcnMoKSB7IG1lbWluZm9fY291bnRlcnNfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfbWVt
aW5mb19jb3VudGVycyhNZW1pbmZvQ291bnRlcnMgdmFsdWUpIHsgbWVtaW5mb19jb3VudGVyc18u
ZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBNZW1pbmZvQ291bnRlcnMqIGFkZF9tZW1pbmZvX2Nv
dW50ZXJzKCkgeyBtZW1pbmZvX2NvdW50ZXJzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZtZW1p
bmZvX2NvdW50ZXJzXy5iYWNrKCk7IH0KKworICBib29sIGhhc192bXN0YXRfcGVyaW9kX21zKCkg
Y29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDMyX3Qgdm1zdGF0X3Blcmlv
ZF9tcygpIGNvbnN0IHsgcmV0dXJuIHZtc3RhdF9wZXJpb2RfbXNfOyB9CisgIHZvaWQgc2V0X3Zt
c3RhdF9wZXJpb2RfbXModWludDMyX3QgdmFsdWUpIHsgdm1zdGF0X3BlcmlvZF9tc18gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyAgaW50IHZtc3RhdF9jb3VudGVyc19zaXplKCkg
Y29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih2bXN0YXRfY291bnRlcnNfLnNpemUoKSk7
IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Vm1zdGF0Q291bnRlcnM+JiB2bXN0YXRfY291bnRlcnMo
KSBjb25zdCB7IHJldHVybiB2bXN0YXRfY291bnRlcnNfOyB9CisgIHN0ZDo6dmVjdG9yPFZtc3Rh
dENvdW50ZXJzPiogbXV0YWJsZV92bXN0YXRfY291bnRlcnMoKSB7IHJldHVybiAmdm1zdGF0X2Nv
dW50ZXJzXzsgfQorICB2b2lkIGNsZWFyX3Ztc3RhdF9jb3VudGVycygpIHsgdm1zdGF0X2NvdW50
ZXJzXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX3Ztc3RhdF9jb3VudGVycyhWbXN0YXRDb3VudGVy
cyB2YWx1ZSkgeyB2bXN0YXRfY291bnRlcnNfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgVm1z
dGF0Q291bnRlcnMqIGFkZF92bXN0YXRfY291bnRlcnMoKSB7IHZtc3RhdF9jb3VudGVyc18uZW1w
bGFjZV9iYWNrKCk7IHJldHVybiAmdm1zdGF0X2NvdW50ZXJzXy5iYWNrKCk7IH0KKworICBib29s
IGhhc19zdGF0X3BlcmlvZF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9Cisg
IHVpbnQzMl90IHN0YXRfcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gc3RhdF9wZXJpb2RfbXNf
OyB9CisgIHZvaWQgc2V0X3N0YXRfcGVyaW9kX21zKHVpbnQzMl90IHZhbHVlKSB7IHN0YXRfcGVy
aW9kX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworICBpbnQgc3RhdF9jb3Vu
dGVyc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzdGF0X2NvdW50ZXJz
Xy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFN5c1N0YXRzQ29uZmlnX1N0YXRDb3Vu
dGVycz4mIHN0YXRfY291bnRlcnMoKSBjb25zdCB7IHJldHVybiBzdGF0X2NvdW50ZXJzXzsgfQor
ICBzdGQ6OnZlY3RvcjxTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnM+KiBtdXRhYmxlX3N0YXRf
Y291bnRlcnMoKSB7IHJldHVybiAmc3RhdF9jb3VudGVyc187IH0KKyAgdm9pZCBjbGVhcl9zdGF0
X2NvdW50ZXJzKCkgeyBzdGF0X2NvdW50ZXJzXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX3N0YXRf
Y291bnRlcnMoU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzIHZhbHVlKSB7IHN0YXRfY291bnRl
cnNfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJz
KiBhZGRfc3RhdF9jb3VudGVycygpIHsgc3RhdF9jb3VudGVyc18uZW1wbGFjZV9iYWNrKCk7IHJl
dHVybiAmc3RhdF9jb3VudGVyc18uYmFjaygpOyB9CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBt
ZW1pbmZvX3BlcmlvZF9tc197fTsKKyAgc3RkOjp2ZWN0b3I8TWVtaW5mb0NvdW50ZXJzPiBtZW1p
bmZvX2NvdW50ZXJzXzsKKyAgdWludDMyX3Qgdm1zdGF0X3BlcmlvZF9tc197fTsKKyAgc3RkOjp2
ZWN0b3I8Vm1zdGF0Q291bnRlcnM+IHZtc3RhdF9jb3VudGVyc187CisgIHVpbnQzMl90IHN0YXRf
cGVyaW9kX21zX3t9OworICBzdGQ6OnZlY3RvcjxTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnM+
IHN0YXRfY291bnRlcnNfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3Rv
YnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBv
ZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6
OmJpdHNldDw3PiBfaGFzX2ZpZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRv
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAg
Ly8gUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfU1lTX1NUQVRTX1NZU19T
VEFUU19DT05GSUdfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9m
aWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisv
LyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisj
cHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3Jl
ZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InByb3Rvcy9wZXJmZXR0by9jb25maWcvc3lzX3N0YXRzL3N5c19zdGF0c19jb25maWcuZ2VuLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8v
Y29tbW9uL3N5c19zdGF0c19jb3VudGVycy5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK1N5c1N0YXRzQ29uZmlnOjpT
eXNTdGF0c0NvbmZpZygpID0gZGVmYXVsdDsKK1N5c1N0YXRzQ29uZmlnOjp+U3lzU3RhdHNDb25m
aWcoKSA9IGRlZmF1bHQ7CitTeXNTdGF0c0NvbmZpZzo6U3lzU3RhdHNDb25maWcoY29uc3QgU3lz
U3RhdHNDb25maWcmKSA9IGRlZmF1bHQ7CitTeXNTdGF0c0NvbmZpZyYgU3lzU3RhdHNDb25maWc6
Om9wZXJhdG9yPShjb25zdCBTeXNTdGF0c0NvbmZpZyYpID0gZGVmYXVsdDsKK1N5c1N0YXRzQ29u
ZmlnOjpTeXNTdGF0c0NvbmZpZyhTeXNTdGF0c0NvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7
CitTeXNTdGF0c0NvbmZpZyYgU3lzU3RhdHNDb25maWc6Om9wZXJhdG9yPShTeXNTdGF0c0NvbmZp
ZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgU3lzU3RhdHNDb25maWc6Om9wZXJhdG9yPT0oY29uc3Qg
U3lzU3RhdHNDb25maWcmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18g
PT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBtZW1pbmZvX3BlcmlvZF9tc18gPT0gb3Ro
ZXIubWVtaW5mb19wZXJpb2RfbXNfCisgICAmJiBtZW1pbmZvX2NvdW50ZXJzXyA9PSBvdGhlci5t
ZW1pbmZvX2NvdW50ZXJzXworICAgJiYgdm1zdGF0X3BlcmlvZF9tc18gPT0gb3RoZXIudm1zdGF0
X3BlcmlvZF9tc18KKyAgICYmIHZtc3RhdF9jb3VudGVyc18gPT0gb3RoZXIudm1zdGF0X2NvdW50
ZXJzXworICAgJiYgc3RhdF9wZXJpb2RfbXNfID09IG90aGVyLnN0YXRfcGVyaW9kX21zXworICAg
JiYgc3RhdF9jb3VudGVyc18gPT0gb3RoZXIuc3RhdF9jb3VudGVyc187Cit9CisKK2Jvb2wgU3lz
U3RhdHNDb25maWc6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUp
IHsKKyAgbWVtaW5mb19jb3VudGVyc18uY2xlYXIoKTsKKyAgdm1zdGF0X2NvdW50ZXJzXy5jbGVh
cigpOworICBzdGF0X2NvdW50ZXJzXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIo
KTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9E
ZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxk
KCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZp
ZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChm
aWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNl
IDEgLyogbWVtaW5mb19wZXJpb2RfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmbWVtaW5mb19w
ZXJpb2RfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogbWVtaW5mb19jb3Vu
dGVycyAqLzoKKyAgICAgICAgbWVtaW5mb19jb3VudGVyc18uZW1wbGFjZV9iYWNrKCk7CisgICAg
ICAgIGZpZWxkLmdldCgmbWVtaW5mb19jb3VudGVyc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDMgLyogdm1zdGF0X3BlcmlvZF9tcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0
KCZ2bXN0YXRfcGVyaW9kX21zXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIHZt
c3RhdF9jb3VudGVycyAqLzoKKyAgICAgICAgdm1zdGF0X2NvdW50ZXJzXy5lbXBsYWNlX2JhY2so
KTsKKyAgICAgICAgZmllbGQuZ2V0KCZ2bXN0YXRfY291bnRlcnNfLmJhY2soKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSA1IC8qIHN0YXRfcGVyaW9kX21zICovOgorICAgICAgICBmaWVs
ZC5nZXQoJnN0YXRfcGVyaW9kX21zXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8q
IHN0YXRfY291bnRlcnMgKi86CisgICAgICAgIHN0YXRfY291bnRlcnNfLmVtcGxhY2VfYmFjaygp
OworICAgICAgICBmaWVsZC5nZXQoJnN0YXRfY291bnRlcnNfLmJhY2soKSk7CisgICAgICAgIGJy
ZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8o
JnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4g
IXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgU3lz
U3RhdHNDb25maWc6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cu
Z2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVj
dG9yPHVpbnQ4X3Q+IFN5c1N0YXRzQ29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsK
K30KKwordm9pZCBTeXNTdGF0c0NvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdl
KiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogbWVtaW5mb19wZXJpb2RfbXMKKyAgaWYgKF9o
YXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgbWVtaW5mb19wZXJpb2Rf
bXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IG1lbWluZm9fY291bnRlcnMKKyAgZm9yIChhdXRv
JiBpdCA6IG1lbWluZm9fY291bnRlcnNfKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgaXQp
OworICB9CisKKyAgLy8gRmllbGQgMzogdm1zdGF0X3BlcmlvZF9tcworICBpZiAoX2hhc19maWVs
ZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgzLCB2bXN0YXRfcGVyaW9kX21zXyk7Cisg
IH0KKworICAvLyBGaWVsZCA0OiB2bXN0YXRfY291bnRlcnMKKyAgZm9yIChhdXRvJiBpdCA6IHZt
c3RhdF9jb3VudGVyc18pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg0LCBpdCk7CisgIH0KKwor
ICAvLyBGaWVsZCA1OiBzdGF0X3BlcmlvZF9tcworICBpZiAoX2hhc19maWVsZF9bNV0pIHsKKyAg
ICBtc2ctPkFwcGVuZFZhckludCg1LCBzdGF0X3BlcmlvZF9tc18pOworICB9CisKKyAgLy8gRmll
bGQgNjogc3RhdF9jb3VudGVycworICBmb3IgKGF1dG8mIGl0IDogc3RhdF9jb3VudGVyc18pIHsK
KyAgICBtc2ctPkFwcGVuZFZhckludCg2LCBpdCk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3Rvcwor
fSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3RyYWNr
X2V2ZW50L3RyYWNrX2V2ZW50X2NvbmZpZy5nZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3RyYWNrX2V2ZW50L3RyYWNrX2V2
ZW50X2NvbmZpZy5nZW4uaAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0
dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X0NPTkZJR19UUkFDS19FVkVOVF9UUkFDS19FVkVOVF9DT05GSUdfUFJPVE9fQ1BQX0hfCisjZGVm
aW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1RSQUNLX0VWRU5UX1RS
QUNLX0VWRU5UX0NPTkZJR19QUk9UT19DUFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lu
Y2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2lu
Y2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRy
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7Citu
YW1lc3BhY2UgZ2VuIHsKK2NsYXNzIFRyYWNrRXZlbnRDb25maWc7Cit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKwor
bmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHBy
b3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1l
c3BhY2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNrRXZlbnRDb25maWcgOiBw
dWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVs
ZE51bWJlcnMgeworICAgIGtEaXNhYmxlZENhdGVnb3JpZXNGaWVsZE51bWJlciA9IDEsCisgICAg
a0VuYWJsZWRDYXRlZ29yaWVzRmllbGROdW1iZXIgPSAyLAorICAgIGtEaXNhYmxlZFRhZ3NGaWVs
ZE51bWJlciA9IDMsCisgICAga0VuYWJsZWRUYWdzRmllbGROdW1iZXIgPSA0LAorICB9OworCisg
IFRyYWNrRXZlbnRDb25maWcoKTsKKyAgflRyYWNrRXZlbnRDb25maWcoKSBvdmVycmlkZTsKKyAg
VHJhY2tFdmVudENvbmZpZyhUcmFja0V2ZW50Q29uZmlnJiYpIG5vZXhjZXB0OworICBUcmFja0V2
ZW50Q29uZmlnJiBvcGVyYXRvcj0oVHJhY2tFdmVudENvbmZpZyYmKTsKKyAgVHJhY2tFdmVudENv
bmZpZyhjb25zdCBUcmFja0V2ZW50Q29uZmlnJik7CisgIFRyYWNrRXZlbnRDb25maWcmIG9wZXJh
dG9yPShjb25zdCBUcmFja0V2ZW50Q29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBU
cmFja0V2ZW50Q29uZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFja0V2
ZW50Q29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKwor
ICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBz
dGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZl
Y3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQg
U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50IGRpc2FibGVk
X2NhdGVnb3JpZXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZGlzYWJs
ZWRfY2F0ZWdvcmllc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmlu
Zz4mIGRpc2FibGVkX2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBkaXNhYmxlZF9jYXRlZ29y
aWVzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfZGlzYWJsZWRfY2F0
ZWdvcmllcygpIHsgcmV0dXJuICZkaXNhYmxlZF9jYXRlZ29yaWVzXzsgfQorICB2b2lkIGNsZWFy
X2Rpc2FibGVkX2NhdGVnb3JpZXMoKSB7IGRpc2FibGVkX2NhdGVnb3JpZXNfLmNsZWFyKCk7IH0K
KyAgdm9pZCBhZGRfZGlzYWJsZWRfY2F0ZWdvcmllcyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBkaXNh
YmxlZF9jYXRlZ29yaWVzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBh
ZGRfZGlzYWJsZWRfY2F0ZWdvcmllcygpIHsgZGlzYWJsZWRfY2F0ZWdvcmllc18uZW1wbGFjZV9i
YWNrKCk7IHJldHVybiAmZGlzYWJsZWRfY2F0ZWdvcmllc18uYmFjaygpOyB9CisKKyAgaW50IGVu
YWJsZWRfY2F0ZWdvcmllc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihl
bmFibGVkX2NhdGVnb3JpZXNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpz
dHJpbmc+JiBlbmFibGVkX2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBlbmFibGVkX2NhdGVn
b3JpZXNfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9lbmFibGVkX2Nh
dGVnb3JpZXMoKSB7IHJldHVybiAmZW5hYmxlZF9jYXRlZ29yaWVzXzsgfQorICB2b2lkIGNsZWFy
X2VuYWJsZWRfY2F0ZWdvcmllcygpIHsgZW5hYmxlZF9jYXRlZ29yaWVzXy5jbGVhcigpOyB9Cisg
IHZvaWQgYWRkX2VuYWJsZWRfY2F0ZWdvcmllcyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBlbmFibGVk
X2NhdGVnb3JpZXNfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9l
bmFibGVkX2NhdGVnb3JpZXMoKSB7IGVuYWJsZWRfY2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKCk7
IHJldHVybiAmZW5hYmxlZF9jYXRlZ29yaWVzXy5iYWNrKCk7IH0KKworICBpbnQgZGlzYWJsZWRf
dGFnc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkaXNhYmxlZF90YWdz
Xy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGlzYWJsZWRf
dGFncygpIGNvbnN0IHsgcmV0dXJuIGRpc2FibGVkX3RhZ3NfOyB9CisgIHN0ZDo6dmVjdG9yPHN0
ZDo6c3RyaW5nPiogbXV0YWJsZV9kaXNhYmxlZF90YWdzKCkgeyByZXR1cm4gJmRpc2FibGVkX3Rh
Z3NfOyB9CisgIHZvaWQgY2xlYXJfZGlzYWJsZWRfdGFncygpIHsgZGlzYWJsZWRfdGFnc18uY2xl
YXIoKTsgfQorICB2b2lkIGFkZF9kaXNhYmxlZF90YWdzKHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGRp
c2FibGVkX3RhZ3NfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9k
aXNhYmxlZF90YWdzKCkgeyBkaXNhYmxlZF90YWdzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZk
aXNhYmxlZF90YWdzXy5iYWNrKCk7IH0KKworICBpbnQgZW5hYmxlZF90YWdzX3NpemUoKSBjb25z
dCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGVuYWJsZWRfdGFnc18uc2l6ZSgpKTsgfQorICBj
b25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGVuYWJsZWRfdGFncygpIGNvbnN0IHsgcmV0
dXJuIGVuYWJsZWRfdGFnc187IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBtdXRhYmxl
X2VuYWJsZWRfdGFncygpIHsgcmV0dXJuICZlbmFibGVkX3RhZ3NfOyB9CisgIHZvaWQgY2xlYXJf
ZW5hYmxlZF90YWdzKCkgeyBlbmFibGVkX3RhZ3NfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfZW5h
YmxlZF90YWdzKHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGVuYWJsZWRfdGFnc18uZW1wbGFjZV9iYWNr
KHZhbHVlKTsgfQorICBzdGQ6OnN0cmluZyogYWRkX2VuYWJsZWRfdGFncygpIHsgZW5hYmxlZF90
YWdzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZlbmFibGVkX3RhZ3NfLmJhY2soKTsgfQorCisg
cHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRpc2FibGVkX2NhdGVnb3JpZXNf
OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW5hYmxlZF9jYXRlZ29yaWVzXzsKKyAgc3Rk
Ojp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRpc2FibGVkX3RhZ3NfOworICBzdGQ6OnZlY3RvcjxzdGQ6
OnN0cmluZz4gZW5hYmxlZF90YWdzXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93
biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVy
c2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisK
KyAgc3RkOjpiaXRzZXQ8NT4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBw
ZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisj
ZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1RSQUNLX0VW
RU5UX1RSQUNLX0VWRU5UX0NPTkZJR19QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2Vk
X3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9i
dWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdl
bl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25v
c3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy90cmFja19ldmVudC90cmFja19ldmVu
dF9jb25maWcuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9z
IHsKK25hbWVzcGFjZSBnZW4geworCitUcmFja0V2ZW50Q29uZmlnOjpUcmFja0V2ZW50Q29uZmln
KCkgPSBkZWZhdWx0OworVHJhY2tFdmVudENvbmZpZzo6flRyYWNrRXZlbnRDb25maWcoKSA9IGRl
ZmF1bHQ7CitUcmFja0V2ZW50Q29uZmlnOjpUcmFja0V2ZW50Q29uZmlnKGNvbnN0IFRyYWNrRXZl
bnRDb25maWcmKSA9IGRlZmF1bHQ7CitUcmFja0V2ZW50Q29uZmlnJiBUcmFja0V2ZW50Q29uZmln
OjpvcGVyYXRvcj0oY29uc3QgVHJhY2tFdmVudENvbmZpZyYpID0gZGVmYXVsdDsKK1RyYWNrRXZl
bnRDb25maWc6OlRyYWNrRXZlbnRDb25maWcoVHJhY2tFdmVudENvbmZpZyYmKSBub2V4Y2VwdCA9
IGRlZmF1bHQ7CitUcmFja0V2ZW50Q29uZmlnJiBUcmFja0V2ZW50Q29uZmlnOjpvcGVyYXRvcj0o
VHJhY2tFdmVudENvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgVHJhY2tFdmVudENvbmZpZzo6
b3BlcmF0b3I9PShjb25zdCBUcmFja0V2ZW50Q29uZmlnJiBvdGhlcikgY29uc3QgeworICByZXR1
cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgZGlzYWJs
ZWRfY2F0ZWdvcmllc18gPT0gb3RoZXIuZGlzYWJsZWRfY2F0ZWdvcmllc18KKyAgICYmIGVuYWJs
ZWRfY2F0ZWdvcmllc18gPT0gb3RoZXIuZW5hYmxlZF9jYXRlZ29yaWVzXworICAgJiYgZGlzYWJs
ZWRfdGFnc18gPT0gb3RoZXIuZGlzYWJsZWRfdGFnc18KKyAgICYmIGVuYWJsZWRfdGFnc18gPT0g
b3RoZXIuZW5hYmxlZF90YWdzXzsKK30KKworYm9vbCBUcmFja0V2ZW50Q29uZmlnOjpQYXJzZUZy
b21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIGRpc2FibGVkX2NhdGVn
b3JpZXNfLmNsZWFyKCk7CisgIGVuYWJsZWRfY2F0ZWdvcmllc18uY2xlYXIoKTsKKyAgZGlzYWJs
ZWRfdGFnc18uY2xlYXIoKTsKKyAgZW5hYmxlZF90YWdzXy5jbGVhcigpOworICB1bmtub3duX2Zp
ZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3Rv
emVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7
CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNf
ZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7
CisgICAgICBjYXNlIDEgLyogZGlzYWJsZWRfY2F0ZWdvcmllcyAqLzoKKyAgICAgICAgZGlzYWJs
ZWRfY2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmZGlzYWJs
ZWRfY2F0ZWdvcmllc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyog
ZW5hYmxlZF9jYXRlZ29yaWVzICovOgorICAgICAgICBlbmFibGVkX2NhdGVnb3JpZXNfLmVtcGxh
Y2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmVuYWJsZWRfY2F0ZWdvcmllc18uYmFjaygp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogZGlzYWJsZWRfdGFncyAqLzoKKyAg
ICAgICAgZGlzYWJsZWRfdGFnc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgm
ZGlzYWJsZWRfdGFnc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyog
ZW5hYmxlZF90YWdzICovOgorICAgICAgICBlbmFibGVkX3RhZ3NfLmVtcGxhY2VfYmFjaygpOwor
ICAgICAgICBmaWVsZC5nZXQoJmVuYWJsZWRfdGFnc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5r
bm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFj
a2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBUcmFja0V2
ZW50Q29uZmlnOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rv
cjx1aW50OF90PiBUcmFja0V2ZW50Q29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsK
K30KKwordm9pZCBUcmFja0V2ZW50Q29uZmlnOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3Nh
Z2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBkaXNhYmxlZF9jYXRlZ29yaWVzCisgIGZv
ciAoYXV0byYgaXQgOiBkaXNhYmxlZF9jYXRlZ29yaWVzXykgeworICAgIG1zZy0+QXBwZW5kU3Ry
aW5nKDEsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGVuYWJsZWRfY2F0ZWdvcmllcworICBm
b3IgKGF1dG8mIGl0IDogZW5hYmxlZF9jYXRlZ29yaWVzXykgeworICAgIG1zZy0+QXBwZW5kU3Ry
aW5nKDIsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGRpc2FibGVkX3RhZ3MKKyAgZm9yIChh
dXRvJiBpdCA6IGRpc2FibGVkX3RhZ3NfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMywgaXQp
OworICB9CisKKyAgLy8gRmllbGQgNDogZW5hYmxlZF90YWdzCisgIGZvciAoYXV0byYgaXQgOiBl
bmFibGVkX3RhZ3NfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoNCwgaXQpOworICB9CisKKyAg
bXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25f
ZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5h
bWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0
aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL2NvbmZpZy9jaHJvbWUvY2hyb21lX2NvbmZpZy5nZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL2Nocm9tZS9jaHJvbWVf
Y29uZmlnLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBj
cHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09O
RklHX0NIUk9NRV9DSFJPTUVfQ09ORklHX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19Q
Uk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19DSFJPTUVfQ0hST01FX0NPTkZJR19QUk9UT19D
UFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRl
IDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
Y3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIENo
cm9tZUNvbmZpZzsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHBy
b3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNz
IE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0
byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRU
T19FWFBPUlQgQ2hyb21lQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2Jq
IHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrVHJhY2VDb25maWdGaWVs
ZE51bWJlciA9IDEsCisgICAga1ByaXZhY3lGaWx0ZXJpbmdFbmFibGVkRmllbGROdW1iZXIgPSAy
LAorICB9OworCisgIENocm9tZUNvbmZpZygpOworICB+Q2hyb21lQ29uZmlnKCkgb3ZlcnJpZGU7
CisgIENocm9tZUNvbmZpZyhDaHJvbWVDb25maWcmJikgbm9leGNlcHQ7CisgIENocm9tZUNvbmZp
ZyYgb3BlcmF0b3I9KENocm9tZUNvbmZpZyYmKTsKKyAgQ2hyb21lQ29uZmlnKGNvbnN0IENocm9t
ZUNvbmZpZyYpOworICBDaHJvbWVDb25maWcmIG9wZXJhdG9yPShjb25zdCBDaHJvbWVDb25maWcm
KTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENocm9tZUNvbmZpZyYpIGNvbnN0OworICBib29s
IG9wZXJhdG9yIT0oY29uc3QgQ2hyb21lQ29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgq
dGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBz
aXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0
IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29u
c3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29u
c3Q7CisKKyAgYm9vbCBoYXNfdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYWNlX2NvbmZpZygpIGNvbnN0IHsgcmV0
dXJuIHRyYWNlX2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfdHJhY2VfY29uZmlnKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeyB0cmFjZV9jb25maWdfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgx
KTsgfQorCisgIGJvb2wgaGFzX3ByaXZhY3lfZmlsdGVyaW5nX2VuYWJsZWQoKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBib29sIHByaXZhY3lfZmlsdGVyaW5nX2VuYWJsZWQo
KSBjb25zdCB7IHJldHVybiBwcml2YWN5X2ZpbHRlcmluZ19lbmFibGVkXzsgfQorICB2b2lkIHNl
dF9wcml2YWN5X2ZpbHRlcmluZ19lbmFibGVkKGJvb2wgdmFsdWUpIHsgcHJpdmFjeV9maWx0ZXJp
bmdfZW5hYmxlZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyBwcml2YXRlOgor
ICBzdGQ6OnN0cmluZyB0cmFjZV9jb25maWdfe307CisgIGJvb2wgcHJpdmFjeV9maWx0ZXJpbmdf
ZW5hYmxlZF97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBm
aWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnBy
b3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRz
ZXQ8Mz4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX0NIUk9NRV9DSFJPTUVfQ09ORklH
X1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
cHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9UIEVE
SVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBHQ0Mg
ZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxvYXQt
ZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVy
ZmV0dG8vY29uZmlnL2Nocm9tZS9jaHJvbWVfY29uZmlnLmdlbi5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworQ2hyb21lQ29u
ZmlnOjpDaHJvbWVDb25maWcoKSA9IGRlZmF1bHQ7CitDaHJvbWVDb25maWc6On5DaHJvbWVDb25m
aWcoKSA9IGRlZmF1bHQ7CitDaHJvbWVDb25maWc6OkNocm9tZUNvbmZpZyhjb25zdCBDaHJvbWVD
b25maWcmKSA9IGRlZmF1bHQ7CitDaHJvbWVDb25maWcmIENocm9tZUNvbmZpZzo6b3BlcmF0b3I9
KGNvbnN0IENocm9tZUNvbmZpZyYpID0gZGVmYXVsdDsKK0Nocm9tZUNvbmZpZzo6Q2hyb21lQ29u
ZmlnKENocm9tZUNvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitDaHJvbWVDb25maWcmIENo
cm9tZUNvbmZpZzo6b3BlcmF0b3I9KENocm9tZUNvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wg
Q2hyb21lQ29uZmlnOjpvcGVyYXRvcj09KGNvbnN0IENocm9tZUNvbmZpZyYgb3RoZXIpIGNvbnN0
IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAg
ICYmIHRyYWNlX2NvbmZpZ18gPT0gb3RoZXIudHJhY2VfY29uZmlnXworICAgJiYgcHJpdmFjeV9m
aWx0ZXJpbmdfZW5hYmxlZF8gPT0gb3RoZXIucHJpdmFjeV9maWx0ZXJpbmdfZW5hYmxlZF87Cit9
CisKK2Jvb2wgQ2hyb21lQ29uZmlnOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNp
emVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9l
cnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6
ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsg
ZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmll
bGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0K
KyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiB0cmFjZV9jb25maWcg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmdHJhY2VfY29uZmlnXyk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgY2FzZSAyIC8qIHByaXZhY3lfZmlsdGVyaW5nX2VuYWJsZWQgKi86CisgICAgICAgIGZp
ZWxkLmdldCgmcHJpdmFjeV9maWx0ZXJpbmdfZW5hYmxlZF8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3du
X2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRf
ZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIENocm9tZUNvbmZp
Zzo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVy
ZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7Cisg
IHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhf
dD4gQ2hyb21lQ29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVy
bzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZSht
c2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBD
aHJvbWVDb25maWc6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7
CisgIC8vIEZpZWxkIDE6IHRyYWNlX2NvbmZpZworICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAg
ICBtc2ctPkFwcGVuZFN0cmluZygxLCB0cmFjZV9jb25maWdfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDI6IHByaXZhY3lfZmlsdGVyaW5nX2VuYWJsZWQKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7Cisg
ICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDIsIHByaXZhY3lfZmlsdGVyaW5nX2VuYWJsZWRfKTsK
KyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgp
LCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRv
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21hIEdD
QyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3By
b3Rvcy9wZXJmZXR0by9jb25maWcvZGF0YV9zb3VyY2VfY29uZmlnLmdlbi5jYworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvZGF0YV9z
b3VyY2VfY29uZmlnLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJm
ZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fQ09ORklHX0RBVEFfU09VUkNFX0NPTkZJR19QUk9UT19DUFBfSF8KKyNkZWZpbmUgUEVSRkVU
VE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfREFUQV9TT1VSQ0VfQ09ORklHX1BST1RP
X0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1
ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3Mg
RGF0YVNvdXJjZUNvbmZpZzsKK2NsYXNzIFRlc3RDb25maWc7CitjbGFzcyBUZXN0Q29uZmlnX0R1
bW15RmllbGRzOworY2xhc3MgQ2hyb21lQ29uZmlnOworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRv
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFj
ZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8K
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdl
biB7CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBEYXRhU291cmNlQ29uZmlnIDogcHVibGljIDo6
cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJz
IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrVGFyZ2V0QnVmZmVyRmllbGROdW1i
ZXIgPSAyLAorICAgIGtUcmFjZUR1cmF0aW9uTXNGaWVsZE51bWJlciA9IDMsCisgICAga1N0b3BU
aW1lb3V0TXNGaWVsZE51bWJlciA9IDcsCisgICAga0VuYWJsZUV4dHJhR3VhcmRyYWlsc0ZpZWxk
TnVtYmVyID0gNiwKKyAgICBrVHJhY2luZ1Nlc3Npb25JZEZpZWxkTnVtYmVyID0gNCwKKyAgICBr
RnRyYWNlQ29uZmlnRmllbGROdW1iZXIgPSAxMDAsCisgICAga0lub2RlRmlsZUNvbmZpZ0ZpZWxk
TnVtYmVyID0gMTAyLAorICAgIGtQcm9jZXNzU3RhdHNDb25maWdGaWVsZE51bWJlciA9IDEwMywK
KyAgICBrU3lzU3RhdHNDb25maWdGaWVsZE51bWJlciA9IDEwNCwKKyAgICBrSGVhcHByb2ZkQ29u
ZmlnRmllbGROdW1iZXIgPSAxMDUsCisgICAga0phdmFIcHJvZkNvbmZpZ0ZpZWxkTnVtYmVyID0g
MTEwLAorICAgIGtBbmRyb2lkUG93ZXJDb25maWdGaWVsZE51bWJlciA9IDEwNiwKKyAgICBrQW5k
cm9pZExvZ0NvbmZpZ0ZpZWxkTnVtYmVyID0gMTA3LAorICAgIGtHcHVDb3VudGVyQ29uZmlnRmll
bGROdW1iZXIgPSAxMDgsCisgICAga1BhY2thZ2VzTGlzdENvbmZpZ0ZpZWxkTnVtYmVyID0gMTA5
LAorICAgIGtQZXJmRXZlbnRDb25maWdGaWVsZE51bWJlciA9IDExMSwKKyAgICBrVnVsa2FuTWVt
b3J5Q29uZmlnRmllbGROdW1iZXIgPSAxMTIsCisgICAga1RyYWNrRXZlbnRDb25maWdGaWVsZE51
bWJlciA9IDExMywKKyAgICBrQW5kcm9pZFBvbGxlZFN0YXRlQ29uZmlnRmllbGROdW1iZXIgPSAx
MTQsCisgICAga0Nocm9tZUNvbmZpZ0ZpZWxkTnVtYmVyID0gMTAxLAorICAgIGtMZWdhY3lDb25m
aWdGaWVsZE51bWJlciA9IDEwMDAsCisgICAga0ZvclRlc3RpbmdGaWVsZE51bWJlciA9IDEwMDEs
CisgIH07CisKKyAgRGF0YVNvdXJjZUNvbmZpZygpOworICB+RGF0YVNvdXJjZUNvbmZpZygpIG92
ZXJyaWRlOworICBEYXRhU291cmNlQ29uZmlnKERhdGFTb3VyY2VDb25maWcmJikgbm9leGNlcHQ7
CisgIERhdGFTb3VyY2VDb25maWcmIG9wZXJhdG9yPShEYXRhU291cmNlQ29uZmlnJiYpOworICBE
YXRhU291cmNlQ29uZmlnKGNvbnN0IERhdGFTb3VyY2VDb25maWcmKTsKKyAgRGF0YVNvdXJjZUNv
bmZpZyYgb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRv
cj09KGNvbnN0IERhdGFTb3VyY2VDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNv
bnN0IERhdGFTb3VyY2VDb25maWcmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90
aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3Zl
cnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7
CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlk
ZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBi
b29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qg
c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorICB2b2lkIHNldF9u
YW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBuYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoMSk7IH0KKworICBib29sIGhhc190YXJnZXRfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bMl07IH0KKyAgdWludDMyX3QgdGFyZ2V0X2J1ZmZlcigpIGNvbnN0IHsgcmV0
dXJuIHRhcmdldF9idWZmZXJfOyB9CisgIHZvaWQgc2V0X3RhcmdldF9idWZmZXIodWludDMyX3Qg
dmFsdWUpIHsgdGFyZ2V0X2J1ZmZlcl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisK
KyAgYm9vbCBoYXNfdHJhY2VfZHVyYXRpb25fbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1szXTsgfQorICB1aW50MzJfdCB0cmFjZV9kdXJhdGlvbl9tcygpIGNvbnN0IHsgcmV0dXJuIHRy
YWNlX2R1cmF0aW9uX21zXzsgfQorICB2b2lkIHNldF90cmFjZV9kdXJhdGlvbl9tcyh1aW50MzJf
dCB2YWx1ZSkgeyB0cmFjZV9kdXJhdGlvbl9tc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMp
OyB9CisKKyAgYm9vbCBoYXNfc3RvcF90aW1lb3V0X21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bN107IH0KKyAgdWludDMyX3Qgc3RvcF90aW1lb3V0X21zKCkgY29uc3QgeyByZXR1cm4g
c3RvcF90aW1lb3V0X21zXzsgfQorICB2b2lkIHNldF9zdG9wX3RpbWVvdXRfbXModWludDMyX3Qg
dmFsdWUpIHsgc3RvcF90aW1lb3V0X21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNyk7IH0K
KworICBib29sIGhhc19lbmFibGVfZXh0cmFfZ3VhcmRyYWlscygpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzZdOyB9CisgIGJvb2wgZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKSBjb25zdCB7
IHJldHVybiBlbmFibGVfZXh0cmFfZ3VhcmRyYWlsc187IH0KKyAgdm9pZCBzZXRfZW5hYmxlX2V4
dHJhX2d1YXJkcmFpbHMoYm9vbCB2YWx1ZSkgeyBlbmFibGVfZXh0cmFfZ3VhcmRyYWlsc18gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisKKyAgYm9vbCBoYXNfdHJhY2luZ19zZXNzaW9u
X2lkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAgdWludDY0X3QgdHJhY2lu
Z19zZXNzaW9uX2lkKCkgY29uc3QgeyByZXR1cm4gdHJhY2luZ19zZXNzaW9uX2lkXzsgfQorICB2
b2lkIHNldF90cmFjaW5nX3Nlc3Npb25faWQodWludDY0X3QgdmFsdWUpIHsgdHJhY2luZ19zZXNz
aW9uX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNCk7IH0KKworICBjb25zdCBzdGQ6OnN0
cmluZyYgZnRyYWNlX2NvbmZpZ19yYXcoKSBjb25zdCB7IHJldHVybiBmdHJhY2VfY29uZmlnXzsg
fQorICB2b2lkIHNldF9mdHJhY2VfY29uZmlnX3Jhdyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7
IGZ0cmFjZV9jb25maWdfID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoMTAwKTsgfQorCisgIGNvbnN0
IHN0ZDo6c3RyaW5nJiBpbm9kZV9maWxlX2NvbmZpZ19yYXcoKSBjb25zdCB7IHJldHVybiBpbm9k
ZV9maWxlX2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfaW5vZGVfZmlsZV9jb25maWdfcmF3KGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIHsgaW5vZGVfZmlsZV9jb25maWdfID0gcmF3OyBfaGFzX2ZpZWxk
Xy5zZXQoMTAyKTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9jZXNzX3N0YXRzX2NvbmZp
Z19yYXcoKSBjb25zdCB7IHJldHVybiBwcm9jZXNzX3N0YXRzX2NvbmZpZ187IH0KKyAgdm9pZCBz
ZXRfcHJvY2Vzc19zdGF0c19jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsgcHJv
Y2Vzc19zdGF0c19jb25maWdfID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoMTAzKTsgfQorCisgIGNv
bnN0IHN0ZDo6c3RyaW5nJiBzeXNfc3RhdHNfY29uZmlnX3JhdygpIGNvbnN0IHsgcmV0dXJuIHN5
c19zdGF0c19jb25maWdfOyB9CisgIHZvaWQgc2V0X3N5c19zdGF0c19jb25maWdfcmF3KGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIHsgc3lzX3N0YXRzX2NvbmZpZ18gPSByYXc7IF9oYXNfZmllbGRf
LnNldCgxMDQpOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGhlYXBwcm9mZF9jb25maWdfcmF3
KCkgY29uc3QgeyByZXR1cm4gaGVhcHByb2ZkX2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfaGVhcHBy
b2ZkX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeyBoZWFwcHJvZmRfY29uZmln
XyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDEwNSk7IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYg
amF2YV9ocHJvZl9jb25maWdfcmF3KCkgY29uc3QgeyByZXR1cm4gamF2YV9ocHJvZl9jb25maWdf
OyB9CisgIHZvaWQgc2V0X2phdmFfaHByb2ZfY29uZmlnX3Jhdyhjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSB7IGphdmFfaHByb2ZfY29uZmlnXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDExMCk7IH0K
KworICBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9wb3dlcl9jb25maWdfcmF3KCkgY29uc3Qg
eyByZXR1cm4gYW5kcm9pZF9wb3dlcl9jb25maWdfOyB9CisgIHZvaWQgc2V0X2FuZHJvaWRfcG93
ZXJfY29uZmlnX3Jhdyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7IGFuZHJvaWRfcG93ZXJfY29u
ZmlnXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDEwNik7IH0KKworICBjb25zdCBzdGQ6OnN0cmlu
ZyYgYW5kcm9pZF9sb2dfY29uZmlnX3JhdygpIGNvbnN0IHsgcmV0dXJuIGFuZHJvaWRfbG9nX2Nv
bmZpZ187IH0KKyAgdm9pZCBzZXRfYW5kcm9pZF9sb2dfY29uZmlnX3Jhdyhjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSB7IGFuZHJvaWRfbG9nX2NvbmZpZ18gPSByYXc7IF9oYXNfZmllbGRfLnNldCgx
MDcpOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdwdV9jb3VudGVyX2NvbmZpZ19yYXcoKSBj
b25zdCB7IHJldHVybiBncHVfY291bnRlcl9jb25maWdfOyB9CisgIHZvaWQgc2V0X2dwdV9jb3Vu
dGVyX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeyBncHVfY291bnRlcl9jb25m
aWdfID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoMTA4KTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5n
JiBwYWNrYWdlc19saXN0X2NvbmZpZ19yYXcoKSBjb25zdCB7IHJldHVybiBwYWNrYWdlc19saXN0
X2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfcGFja2FnZXNfbGlzdF9jb25maWdfcmF3KGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIHsgcGFja2FnZXNfbGlzdF9jb25maWdfID0gcmF3OyBfaGFzX2ZpZWxk
Xy5zZXQoMTA5KTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJmX2V2ZW50X2NvbmZpZ19y
YXcoKSBjb25zdCB7IHJldHVybiBwZXJmX2V2ZW50X2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfcGVy
Zl9ldmVudF9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsgcGVyZl9ldmVudF9j
b25maWdfID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoMTExKTsgfQorCisgIGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2dWxrYW5fbWVtb3J5X2NvbmZpZ19yYXcoKSBjb25zdCB7IHJldHVybiB2dWxrYW5fbWVt
b3J5X2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfdnVsa2FuX21lbW9yeV9jb25maWdfcmF3KGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIHsgdnVsa2FuX21lbW9yeV9jb25maWdfID0gcmF3OyBfaGFzX2Zp
ZWxkXy5zZXQoMTEyKTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFja19ldmVudF9jb25m
aWdfcmF3KCkgY29uc3QgeyByZXR1cm4gdHJhY2tfZXZlbnRfY29uZmlnXzsgfQorICB2b2lkIHNl
dF90cmFja19ldmVudF9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsgdHJhY2tf
ZXZlbnRfY29uZmlnXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDExMyk7IH0KKworICBjb25zdCBz
dGQ6OnN0cmluZyYgYW5kcm9pZF9wb2xsZWRfc3RhdGVfY29uZmlnX3JhdygpIGNvbnN0IHsgcmV0
dXJuIGFuZHJvaWRfcG9sbGVkX3N0YXRlX2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfYW5kcm9pZF9w
b2xsZWRfc3RhdGVfY29uZmlnX3Jhdyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7IGFuZHJvaWRf
cG9sbGVkX3N0YXRlX2NvbmZpZ18gPSByYXc7IF9oYXNfZmllbGRfLnNldCgxMTQpOyB9CisKKyAg
Ym9vbCBoYXNfY2hyb21lX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEwMV07
IH0KKyAgY29uc3QgQ2hyb21lQ29uZmlnJiBjaHJvbWVfY29uZmlnKCkgY29uc3QgeyByZXR1cm4g
KmNocm9tZV9jb25maWdfOyB9CisgIENocm9tZUNvbmZpZyogbXV0YWJsZV9jaHJvbWVfY29uZmln
KCkgeyBfaGFzX2ZpZWxkXy5zZXQoMTAxKTsgcmV0dXJuIGNocm9tZV9jb25maWdfLmdldCgpOyB9
CisKKyAgYm9vbCBoYXNfbGVnYWN5X2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRf
WzEwMDBdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsZWdhY3lfY29uZmlnKCkgY29uc3QgeyBy
ZXR1cm4gbGVnYWN5X2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfbGVnYWN5X2NvbmZpZyhjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsgbGVnYWN5X2NvbmZpZ18gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDEwMDApOyB9CisKKyAgYm9vbCBoYXNfZm9yX3Rlc3RpbmcoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1sxMDAxXTsgfQorICBjb25zdCBUZXN0Q29uZmlnJiBmb3JfdGVzdGluZygpIGNv
bnN0IHsgcmV0dXJuICpmb3JfdGVzdGluZ187IH0KKyAgVGVzdENvbmZpZyogbXV0YWJsZV9mb3Jf
dGVzdGluZygpIHsgX2hhc19maWVsZF8uc2V0KDEwMDEpOyByZXR1cm4gZm9yX3Rlc3RpbmdfLmdl
dCgpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lX3t9OworICB1aW50MzJfdCB0
YXJnZXRfYnVmZmVyX3t9OworICB1aW50MzJfdCB0cmFjZV9kdXJhdGlvbl9tc197fTsKKyAgdWlu
dDMyX3Qgc3RvcF90aW1lb3V0X21zX3t9OworICBib29sIGVuYWJsZV9leHRyYV9ndWFyZHJhaWxz
X3t9OworICB1aW50NjRfdCB0cmFjaW5nX3Nlc3Npb25faWRfe307CisgIHN0ZDo6c3RyaW5nIGZ0
cmFjZV9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcgaW5vZGVfZmlsZV9j
b25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcgcHJvY2Vzc19zdGF0c19jb25m
aWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcgc3lzX3N0YXRzX2NvbmZpZ187ICAv
LyBbbGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyBoZWFwcHJvZmRfY29uZmlnXzsgIC8vIFtsYXp5
PXRydWVdCisgIHN0ZDo6c3RyaW5nIGphdmFfaHByb2ZfY29uZmlnXzsgIC8vIFtsYXp5PXRydWVd
CisgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfcG93ZXJfY29uZmlnXzsgIC8vIFtsYXp5PXRydWVdCisg
IHN0ZDo6c3RyaW5nIGFuZHJvaWRfbG9nX2NvbmZpZ187ICAvLyBbbGF6eT10cnVlXQorICBzdGQ6
OnN0cmluZyBncHVfY291bnRlcl9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJp
bmcgcGFja2FnZXNfbGlzdF9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcg
cGVyZl9ldmVudF9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcgdnVsa2Fu
X21lbW9yeV9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcgdHJhY2tfZXZl
bnRfY29uZmlnXzsgIC8vIFtsYXp5PXRydWVdCisgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfcG9sbGVk
X3N0YXRlX2NvbmZpZ187ICAvLyBbbGF6eT10cnVlXQorICA6OnByb3RvemVybzo6Q29weWFibGVQ
dHI8Q2hyb21lQ29uZmlnPiBjaHJvbWVfY29uZmlnXzsKKyAgc3RkOjpzdHJpbmcgbGVnYWN5X2Nv
bmZpZ197fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPFRlc3RDb25maWc+IGZvcl90ZXN0
aW5nXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMg
Zm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZp
bGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8MTAw
Mj4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8g
bmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZF
VFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX0RBVEFfU09VUkNFX0NPTkZJR19QUk9U
T19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVy
ZmV0dG8vY29uZmlnL3Rlc3RfY29uZmlnLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVy
YXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fQ09ORklHX1RFU1RfQ09ORklHX1BST1RPX0NQUF9IXworI2RlZmluZSBQ
RVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19URVNUX0NPTkZJR19QUk9UT19D
UFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRl
IDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
Y3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIFRl
c3RDb25maWc7CitjbGFzcyBUZXN0Q29uZmlnX0R1bW15RmllbGRzOworfSAgLy8gbmFtZXNwYWNl
IHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisK
K25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBw
cm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFt
ZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUZXN0Q29uZmlnIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIER1bW15Rmll
bGRzID0gVGVzdENvbmZpZ19EdW1teUZpZWxkczsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAg
IGtNZXNzYWdlQ291bnRGaWVsZE51bWJlciA9IDEsCisgICAga01heE1lc3NhZ2VzUGVyU2Vjb25k
RmllbGROdW1iZXIgPSAyLAorICAgIGtTZWVkRmllbGROdW1iZXIgPSAzLAorICAgIGtNZXNzYWdl
U2l6ZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrU2VuZEJhdGNoT25SZWdpc3RlckZpZWxkTnVtYmVy
ID0gNSwKKyAgICBrRHVtbXlGaWVsZHNGaWVsZE51bWJlciA9IDYsCisgIH07CisKKyAgVGVzdENv
bmZpZygpOworICB+VGVzdENvbmZpZygpIG92ZXJyaWRlOworICBUZXN0Q29uZmlnKFRlc3RDb25m
aWcmJikgbm9leGNlcHQ7CisgIFRlc3RDb25maWcmIG9wZXJhdG9yPShUZXN0Q29uZmlnJiYpOwor
ICBUZXN0Q29uZmlnKGNvbnN0IFRlc3RDb25maWcmKTsKKyAgVGVzdENvbmZpZyYgb3BlcmF0b3I9
KGNvbnN0IFRlc3RDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRlc3RDb25maWcm
KSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRlc3RDb25maWcmIG90aGVyKSBjb25z
dCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXko
Y29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFz
U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6
ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86
Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19tZXNzYWdlX2NvdW50KCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDMyX3QgbWVzc2FnZV9jb3VudCgpIGNvbnN0
IHsgcmV0dXJuIG1lc3NhZ2VfY291bnRfOyB9CisgIHZvaWQgc2V0X21lc3NhZ2VfY291bnQodWlu
dDMyX3QgdmFsdWUpIHsgbWVzc2FnZV9jb3VudF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEp
OyB9CisKKyAgYm9vbCBoYXNfbWF4X21lc3NhZ2VzX3Blcl9zZWNvbmQoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1syXTsgfQorICB1aW50MzJfdCBtYXhfbWVzc2FnZXNfcGVyX3NlY29uZCgp
IGNvbnN0IHsgcmV0dXJuIG1heF9tZXNzYWdlc19wZXJfc2Vjb25kXzsgfQorICB2b2lkIHNldF9t
YXhfbWVzc2FnZXNfcGVyX3NlY29uZCh1aW50MzJfdCB2YWx1ZSkgeyBtYXhfbWVzc2FnZXNfcGVy
X3NlY29uZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfc2Vl
ZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIHVpbnQzMl90IHNlZWQoKSBj
b25zdCB7IHJldHVybiBzZWVkXzsgfQorICB2b2lkIHNldF9zZWVkKHVpbnQzMl90IHZhbHVlKSB7
IHNlZWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX21lc3Nh
Z2Vfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIHVpbnQzMl90IG1l
c3NhZ2Vfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2Vfc2l6ZV87IH0KKyAgdm9pZCBzZXRf
bWVzc2FnZV9zaXplKHVpbnQzMl90IHZhbHVlKSB7IG1lc3NhZ2Vfc2l6ZV8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfc2VuZF9iYXRjaF9vbl9yZWdpc3Rlcigp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGJvb2wgc2VuZF9iYXRjaF9vbl9y
ZWdpc3RlcigpIGNvbnN0IHsgcmV0dXJuIHNlbmRfYmF0Y2hfb25fcmVnaXN0ZXJfOyB9CisgIHZv
aWQgc2V0X3NlbmRfYmF0Y2hfb25fcmVnaXN0ZXIoYm9vbCB2YWx1ZSkgeyBzZW5kX2JhdGNoX29u
X3JlZ2lzdGVyXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworICBib29sIGhhc19k
dW1teV9maWVsZHMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s2XTsgfQorICBjb25zdCBU
ZXN0Q29uZmlnX0R1bW15RmllbGRzJiBkdW1teV9maWVsZHMoKSBjb25zdCB7IHJldHVybiAqZHVt
bXlfZmllbGRzXzsgfQorICBUZXN0Q29uZmlnX0R1bW15RmllbGRzKiBtdXRhYmxlX2R1bW15X2Zp
ZWxkcygpIHsgX2hhc19maWVsZF8uc2V0KDYpOyByZXR1cm4gZHVtbXlfZmllbGRzXy5nZXQoKTsg
fQorCisgcHJpdmF0ZToKKyAgdWludDMyX3QgbWVzc2FnZV9jb3VudF97fTsKKyAgdWludDMyX3Qg
bWF4X21lc3NhZ2VzX3Blcl9zZWNvbmRfe307CisgIHVpbnQzMl90IHNlZWRfe307CisgIHVpbnQz
Ml90IG1lc3NhZ2Vfc2l6ZV97fTsKKyAgYm9vbCBzZW5kX2JhdGNoX29uX3JlZ2lzdGVyX3t9Owor
ICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8VGVzdENvbmZpZ19EdW1teUZpZWxkcz4gZHVtbXlf
ZmllbGRzXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVs
ZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3Rv
IGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8
Nz4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRlc3RDb25m
aWdfRHVtbXlGaWVsZHMgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1
YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtGaWVsZFVpbnQzMkZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrRmllbGRJbnQzMkZpZWxkTnVtYmVyID0gMiwKKyAgICBrRmllbGRVaW50NjRG
aWVsZE51bWJlciA9IDMsCisgICAga0ZpZWxkSW50NjRGaWVsZE51bWJlciA9IDQsCisgICAga0Zp
ZWxkRml4ZWQ2NEZpZWxkTnVtYmVyID0gNSwKKyAgICBrRmllbGRTZml4ZWQ2NEZpZWxkTnVtYmVy
ID0gNiwKKyAgICBrRmllbGRGaXhlZDMyRmllbGROdW1iZXIgPSA3LAorICAgIGtGaWVsZFNmaXhl
ZDMyRmllbGROdW1iZXIgPSA4LAorICAgIGtGaWVsZERvdWJsZUZpZWxkTnVtYmVyID0gOSwKKyAg
ICBrRmllbGRGbG9hdEZpZWxkTnVtYmVyID0gMTAsCisgICAga0ZpZWxkU2ludDY0RmllbGROdW1i
ZXIgPSAxMSwKKyAgICBrRmllbGRTaW50MzJGaWVsZE51bWJlciA9IDEyLAorICAgIGtGaWVsZFN0
cmluZ0ZpZWxkTnVtYmVyID0gMTMsCisgICAga0ZpZWxkQnl0ZXNGaWVsZE51bWJlciA9IDE0LAor
ICB9OworCisgIFRlc3RDb25maWdfRHVtbXlGaWVsZHMoKTsKKyAgflRlc3RDb25maWdfRHVtbXlG
aWVsZHMoKSBvdmVycmlkZTsKKyAgVGVzdENvbmZpZ19EdW1teUZpZWxkcyhUZXN0Q29uZmlnX0R1
bW15RmllbGRzJiYpIG5vZXhjZXB0OworICBUZXN0Q29uZmlnX0R1bW15RmllbGRzJiBvcGVyYXRv
cj0oVGVzdENvbmZpZ19EdW1teUZpZWxkcyYmKTsKKyAgVGVzdENvbmZpZ19EdW1teUZpZWxkcyhj
b25zdCBUZXN0Q29uZmlnX0R1bW15RmllbGRzJik7CisgIFRlc3RDb25maWdfRHVtbXlGaWVsZHMm
IG9wZXJhdG9yPShjb25zdCBUZXN0Q29uZmlnX0R1bW15RmllbGRzJik7CisgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBUZXN0Q29uZmlnX0R1bW15RmllbGRzJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBUZXN0Q29uZmlnX0R1bW15RmllbGRzJiBvdGhlcikgY29uc3QgeyByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
LCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikg
Y29uc3Q7CisKKyAgYm9vbCBoYXNfZmllbGRfdWludDMyKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMV07IH0KKyAgdWludDMyX3QgZmllbGRfdWludDMyKCkgY29uc3QgeyByZXR1cm4gZmll
bGRfdWludDMyXzsgfQorICB2b2lkIHNldF9maWVsZF91aW50MzIodWludDMyX3QgdmFsdWUpIHsg
ZmllbGRfdWludDMyXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhh
c19maWVsZF9pbnQzMigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGludDMy
X3QgZmllbGRfaW50MzIoKSBjb25zdCB7IHJldHVybiBmaWVsZF9pbnQzMl87IH0KKyAgdm9pZCBz
ZXRfZmllbGRfaW50MzIoaW50MzJfdCB2YWx1ZSkgeyBmaWVsZF9pbnQzMl8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfZmllbGRfdWludDY0KCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDY0X3QgZmllbGRfdWludDY0KCkgY29uc3Qg
eyByZXR1cm4gZmllbGRfdWludDY0XzsgfQorICB2b2lkIHNldF9maWVsZF91aW50NjQodWludDY0
X3QgdmFsdWUpIHsgZmllbGRfdWludDY0XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0K
KworICBib29sIGhhc19maWVsZF9pbnQ2NCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRd
OyB9CisgIGludDY0X3QgZmllbGRfaW50NjQoKSBjb25zdCB7IHJldHVybiBmaWVsZF9pbnQ2NF87
IH0KKyAgdm9pZCBzZXRfZmllbGRfaW50NjQoaW50NjRfdCB2YWx1ZSkgeyBmaWVsZF9pbnQ2NF8g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfZmllbGRfZml4ZWQ2
NCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIHVpbnQ2NF90IGZpZWxkX2Zp
eGVkNjQoKSBjb25zdCB7IHJldHVybiBmaWVsZF9maXhlZDY0XzsgfQorICB2b2lkIHNldF9maWVs
ZF9maXhlZDY0KHVpbnQ2NF90IHZhbHVlKSB7IGZpZWxkX2ZpeGVkNjRfID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCg1KTsgfQorCisgIGJvb2wgaGFzX2ZpZWxkX3NmaXhlZDY0KCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bNl07IH0KKyAgaW50NjRfdCBmaWVsZF9zZml4ZWQ2NCgpIGNvbnN0
IHsgcmV0dXJuIGZpZWxkX3NmaXhlZDY0XzsgfQorICB2b2lkIHNldF9maWVsZF9zZml4ZWQ2NChp
bnQ2NF90IHZhbHVlKSB7IGZpZWxkX3NmaXhlZDY0XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
Nik7IH0KKworICBib29sIGhhc19maWVsZF9maXhlZDMyKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bN107IH0KKyAgdWludDMyX3QgZmllbGRfZml4ZWQzMigpIGNvbnN0IHsgcmV0dXJuIGZp
ZWxkX2ZpeGVkMzJfOyB9CisgIHZvaWQgc2V0X2ZpZWxkX2ZpeGVkMzIodWludDMyX3QgdmFsdWUp
IHsgZmllbGRfZml4ZWQzMl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDcpOyB9CisKKyAgYm9v
bCBoYXNfZmllbGRfc2ZpeGVkMzIoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s4XTsgfQor
ICBpbnQzMl90IGZpZWxkX3NmaXhlZDMyKCkgY29uc3QgeyByZXR1cm4gZmllbGRfc2ZpeGVkMzJf
OyB9CisgIHZvaWQgc2V0X2ZpZWxkX3NmaXhlZDMyKGludDMyX3QgdmFsdWUpIHsgZmllbGRfc2Zp
eGVkMzJfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg4KTsgfQorCisgIGJvb2wgaGFzX2ZpZWxk
X2RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzldOyB9CisgIGRvdWJsZSBmaWVs
ZF9kb3VibGUoKSBjb25zdCB7IHJldHVybiBmaWVsZF9kb3VibGVfOyB9CisgIHZvaWQgc2V0X2Zp
ZWxkX2RvdWJsZShkb3VibGUgdmFsdWUpIHsgZmllbGRfZG91YmxlXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoOSk7IH0KKworICBib29sIGhhc19maWVsZF9mbG9hdCgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzEwXTsgfQorICBmbG9hdCBmaWVsZF9mbG9hdCgpIGNvbnN0IHsgcmV0dXJu
IGZpZWxkX2Zsb2F0XzsgfQorICB2b2lkIHNldF9maWVsZF9mbG9hdChmbG9hdCB2YWx1ZSkgeyBm
aWVsZF9mbG9hdF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEwKTsgfQorCisgIGJvb2wgaGFz
X2ZpZWxkX3NpbnQ2NCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzExXTsgfQorICBpbnQ2
NF90IGZpZWxkX3NpbnQ2NCgpIGNvbnN0IHsgcmV0dXJuIGZpZWxkX3NpbnQ2NF87IH0KKyAgdm9p
ZCBzZXRfZmllbGRfc2ludDY0KGludDY0X3QgdmFsdWUpIHsgZmllbGRfc2ludDY0XyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoMTEpOyB9CisKKyAgYm9vbCBoYXNfZmllbGRfc2ludDMyKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTJdOyB9CisgIGludDMyX3QgZmllbGRfc2ludDMyKCkg
Y29uc3QgeyByZXR1cm4gZmllbGRfc2ludDMyXzsgfQorICB2b2lkIHNldF9maWVsZF9zaW50MzIo
aW50MzJfdCB2YWx1ZSkgeyBmaWVsZF9zaW50MzJfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgx
Mik7IH0KKworICBib29sIGhhc19maWVsZF9zdHJpbmcoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1sxM107IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX3N0cmluZygpIGNvbnN0IHsg
cmV0dXJuIGZpZWxkX3N0cmluZ187IH0KKyAgdm9pZCBzZXRfZmllbGRfc3RyaW5nKGNvbnN0IHN0
ZDo6c3RyaW5nJiB2YWx1ZSkgeyBmaWVsZF9zdHJpbmdfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxMyk7IH0KKworICBib29sIGhhc19maWVsZF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzE0XTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfYnl0ZXMoKSBjb25zdCB7
IHJldHVybiBmaWVsZF9ieXRlc187IH0KKyAgdm9pZCBzZXRfZmllbGRfYnl0ZXMoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7IGZpZWxkX2J5dGVzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
MTQpOyB9CisgIHZvaWQgc2V0X2ZpZWxkX2J5dGVzKGNvbnN0IHZvaWQqIHAsIHNpemVfdCBzKSB7
IGZpZWxkX2J5dGVzXy5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocCksIHMp
OyBfaGFzX2ZpZWxkXy5zZXQoMTQpOyB9CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBmaWVsZF91
aW50MzJfe307CisgIGludDMyX3QgZmllbGRfaW50MzJfe307CisgIHVpbnQ2NF90IGZpZWxkX3Vp
bnQ2NF97fTsKKyAgaW50NjRfdCBmaWVsZF9pbnQ2NF97fTsKKyAgdWludDY0X3QgZmllbGRfZml4
ZWQ2NF97fTsKKyAgaW50NjRfdCBmaWVsZF9zZml4ZWQ2NF97fTsKKyAgdWludDMyX3QgZmllbGRf
Zml4ZWQzMl97fTsKKyAgaW50MzJfdCBmaWVsZF9zZml4ZWQzMl97fTsKKyAgZG91YmxlIGZpZWxk
X2RvdWJsZV97fTsKKyAgZmxvYXQgZmllbGRfZmxvYXRfe307CisgIGludDY0X3QgZmllbGRfc2lu
dDY0X3t9OworICBpbnQzMl90IGZpZWxkX3NpbnQzMl97fTsKKyAgc3RkOjpzdHJpbmcgZmllbGRf
c3RyaW5nX3t9OworICBzdGQ6OnN0cmluZyBmaWVsZF9ieXRlc197fTsKKworICAvLyBBbGxvd3Mg
dG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAg
Ly8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1
bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8MTU+IF9oYXNfZmllbGRfe307Cit9Owor
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8v
IG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTkZJR19URVNUX0NPTkZJR19QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2Vk
X3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9i
dWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdl
bl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25v
c3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9kYXRhX3NvdXJjZV9jb25maWcuZ2Vu
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0
dG8vY29uZmlnL3Rlc3RfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9jaHJvbWUvY2hyb21lX2NvbmZpZy5n
ZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNw
YWNlIGdlbiB7CisKK0RhdGFTb3VyY2VDb25maWc6OkRhdGFTb3VyY2VDb25maWcoKSA9IGRlZmF1
bHQ7CitEYXRhU291cmNlQ29uZmlnOjp+RGF0YVNvdXJjZUNvbmZpZygpID0gZGVmYXVsdDsKK0Rh
dGFTb3VyY2VDb25maWc6OkRhdGFTb3VyY2VDb25maWcoY29uc3QgRGF0YVNvdXJjZUNvbmZpZyYp
ID0gZGVmYXVsdDsKK0RhdGFTb3VyY2VDb25maWcmIERhdGFTb3VyY2VDb25maWc6Om9wZXJhdG9y
PShjb25zdCBEYXRhU291cmNlQ29uZmlnJikgPSBkZWZhdWx0OworRGF0YVNvdXJjZUNvbmZpZzo6
RGF0YVNvdXJjZUNvbmZpZyhEYXRhU291cmNlQ29uZmlnJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsK
K0RhdGFTb3VyY2VDb25maWcmIERhdGFTb3VyY2VDb25maWc6Om9wZXJhdG9yPShEYXRhU291cmNl
Q29uZmlnJiYpID0gZGVmYXVsdDsKKworYm9vbCBEYXRhU291cmNlQ29uZmlnOjpvcGVyYXRvcj09
KGNvbnN0IERhdGFTb3VyY2VDb25maWcmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3du
X2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBuYW1lXyA9PSBvdGhlci5u
YW1lXworICAgJiYgdGFyZ2V0X2J1ZmZlcl8gPT0gb3RoZXIudGFyZ2V0X2J1ZmZlcl8KKyAgICYm
IHRyYWNlX2R1cmF0aW9uX21zXyA9PSBvdGhlci50cmFjZV9kdXJhdGlvbl9tc18KKyAgICYmIHN0
b3BfdGltZW91dF9tc18gPT0gb3RoZXIuc3RvcF90aW1lb3V0X21zXworICAgJiYgZW5hYmxlX2V4
dHJhX2d1YXJkcmFpbHNfID09IG90aGVyLmVuYWJsZV9leHRyYV9ndWFyZHJhaWxzXworICAgJiYg
dHJhY2luZ19zZXNzaW9uX2lkXyA9PSBvdGhlci50cmFjaW5nX3Nlc3Npb25faWRfCisgICAmJiBm
dHJhY2VfY29uZmlnXyA9PSBvdGhlci5mdHJhY2VfY29uZmlnXworICAgJiYgaW5vZGVfZmlsZV9j
b25maWdfID09IG90aGVyLmlub2RlX2ZpbGVfY29uZmlnXworICAgJiYgcHJvY2Vzc19zdGF0c19j
b25maWdfID09IG90aGVyLnByb2Nlc3Nfc3RhdHNfY29uZmlnXworICAgJiYgc3lzX3N0YXRzX2Nv
bmZpZ18gPT0gb3RoZXIuc3lzX3N0YXRzX2NvbmZpZ18KKyAgICYmIGhlYXBwcm9mZF9jb25maWdf
ID09IG90aGVyLmhlYXBwcm9mZF9jb25maWdfCisgICAmJiBqYXZhX2hwcm9mX2NvbmZpZ18gPT0g
b3RoZXIuamF2YV9ocHJvZl9jb25maWdfCisgICAmJiBhbmRyb2lkX3Bvd2VyX2NvbmZpZ18gPT0g
b3RoZXIuYW5kcm9pZF9wb3dlcl9jb25maWdfCisgICAmJiBhbmRyb2lkX2xvZ19jb25maWdfID09
IG90aGVyLmFuZHJvaWRfbG9nX2NvbmZpZ18KKyAgICYmIGdwdV9jb3VudGVyX2NvbmZpZ18gPT0g
b3RoZXIuZ3B1X2NvdW50ZXJfY29uZmlnXworICAgJiYgcGFja2FnZXNfbGlzdF9jb25maWdfID09
IG90aGVyLnBhY2thZ2VzX2xpc3RfY29uZmlnXworICAgJiYgcGVyZl9ldmVudF9jb25maWdfID09
IG90aGVyLnBlcmZfZXZlbnRfY29uZmlnXworICAgJiYgdnVsa2FuX21lbW9yeV9jb25maWdfID09
IG90aGVyLnZ1bGthbl9tZW1vcnlfY29uZmlnXworICAgJiYgdHJhY2tfZXZlbnRfY29uZmlnXyA9
PSBvdGhlci50cmFja19ldmVudF9jb25maWdfCisgICAmJiBhbmRyb2lkX3BvbGxlZF9zdGF0ZV9j
b25maWdfID09IG90aGVyLmFuZHJvaWRfcG9sbGVkX3N0YXRlX2NvbmZpZ18KKyAgICYmIGNocm9t
ZV9jb25maWdfID09IG90aGVyLmNocm9tZV9jb25maWdfCisgICAmJiBsZWdhY3lfY29uZmlnXyA9
PSBvdGhlci5sZWdhY3lfY29uZmlnXworICAgJiYgZm9yX3Rlc3RpbmdfID09IG90aGVyLmZvcl90
ZXN0aW5nXzsKK30KKworYm9vbCBEYXRhU291cmNlQ29uZmlnOjpQYXJzZUZyb21BcnJheShjb25z
dCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOwor
ICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29k
ZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsg
ZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQu
aWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxk
LmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAv
KiBuYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDIgLyogdGFyZ2V0X2J1ZmZlciAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0YXJn
ZXRfYnVmZmVyXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIHRyYWNlX2R1cmF0
aW9uX21zICovOgorICAgICAgICBmaWVsZC5nZXQoJnRyYWNlX2R1cmF0aW9uX21zXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSA3IC8qIHN0b3BfdGltZW91dF9tcyAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZzdG9wX3RpbWVvdXRfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl
IDYgLyogZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMgKi86CisgICAgICAgIGZpZWxkLmdldCgmZW5h
YmxlX2V4dHJhX2d1YXJkcmFpbHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyog
dHJhY2luZ19zZXNzaW9uX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJnRyYWNpbmdfc2Vzc2lv
bl9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAwIC8qIGZ0cmFjZV9jb25maWcg
Ki86CisgICAgICAgIGZ0cmFjZV9jb25maWdfID0gZmllbGQuYXNfc3RkX3N0cmluZygpOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAyIC8qIGlub2RlX2ZpbGVfY29uZmlnICovOgorICAg
ICAgICBpbm9kZV9maWxlX2NvbmZpZ18gPSBmaWVsZC5hc19zdGRfc3RyaW5nKCk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAxMDMgLyogcHJvY2Vzc19zdGF0c19jb25maWcgKi86CisgICAg
ICAgIHByb2Nlc3Nfc3RhdHNfY29uZmlnXyA9IGZpZWxkLmFzX3N0ZF9zdHJpbmcoKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBjYXNlIDEwNCAvKiBzeXNfc3RhdHNfY29uZmlnICovOgorICAgICAg
ICBzeXNfc3RhdHNfY29uZmlnXyA9IGZpZWxkLmFzX3N0ZF9zdHJpbmcoKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDEwNSAvKiBoZWFwcHJvZmRfY29uZmlnICovOgorICAgICAgICBoZWFw
cHJvZmRfY29uZmlnXyA9IGZpZWxkLmFzX3N0ZF9zdHJpbmcoKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDExMCAvKiBqYXZhX2hwcm9mX2NvbmZpZyAqLzoKKyAgICAgICAgamF2YV9ocHJv
Zl9jb25maWdfID0gZmllbGQuYXNfc3RkX3N0cmluZygpOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgMTA2IC8qIGFuZHJvaWRfcG93ZXJfY29uZmlnICovOgorICAgICAgICBhbmRyb2lkX3Bv
d2VyX2NvbmZpZ18gPSBmaWVsZC5hc19zdGRfc3RyaW5nKCk7CisgICAgICAgIGJyZWFrOworICAg
ICAgY2FzZSAxMDcgLyogYW5kcm9pZF9sb2dfY29uZmlnICovOgorICAgICAgICBhbmRyb2lkX2xv
Z19jb25maWdfID0gZmllbGQuYXNfc3RkX3N0cmluZygpOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgMTA4IC8qIGdwdV9jb3VudGVyX2NvbmZpZyAqLzoKKyAgICAgICAgZ3B1X2NvdW50ZXJf
Y29uZmlnXyA9IGZpZWxkLmFzX3N0ZF9zdHJpbmcoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDEwOSAvKiBwYWNrYWdlc19saXN0X2NvbmZpZyAqLzoKKyAgICAgICAgcGFja2FnZXNfbGlz
dF9jb25maWdfID0gZmllbGQuYXNfc3RkX3N0cmluZygpOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgMTExIC8qIHBlcmZfZXZlbnRfY29uZmlnICovOgorICAgICAgICBwZXJmX2V2ZW50X2Nv
bmZpZ18gPSBmaWVsZC5hc19zdGRfc3RyaW5nKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAxMTIgLyogdnVsa2FuX21lbW9yeV9jb25maWcgKi86CisgICAgICAgIHZ1bGthbl9tZW1vcnlf
Y29uZmlnXyA9IGZpZWxkLmFzX3N0ZF9zdHJpbmcoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDExMyAvKiB0cmFja19ldmVudF9jb25maWcgKi86CisgICAgICAgIHRyYWNrX2V2ZW50X2Nv
bmZpZ18gPSBmaWVsZC5hc19zdGRfc3RyaW5nKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAxMTQgLyogYW5kcm9pZF9wb2xsZWRfc3RhdGVfY29uZmlnICovOgorICAgICAgICBhbmRyb2lk
X3BvbGxlZF9zdGF0ZV9jb25maWdfID0gZmllbGQuYXNfc3RkX3N0cmluZygpOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgMTAxIC8qIGNocm9tZV9jb25maWcgKi86CisgICAgICAgICgqY2hy
b21lX2NvbmZpZ18pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAwMCAvKiBsZWdhY3lfY29uZmlnICovOgorICAgICAg
ICBmaWVsZC5nZXQoJmxlZ2FjeV9jb25maWdfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl
IDEwMDEgLyogZm9yX3Rlc3RpbmcgKi86CisgICAgICAgICgqZm9yX3Rlc3RpbmdfKS5QYXJzZUZy
b21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBk
ZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVs
ZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9y
ICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBEYXRhU291cmNlQ29uZmln
OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJl
ZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAg
cmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90
PiBEYXRhU291cmNlQ29uZmlnOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9p
ZCBEYXRhU291cmNlQ29uZmlnOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykg
Y29uc3QgeworICAvLyBGaWVsZCAxOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAg
IG1zZy0+QXBwZW5kU3RyaW5nKDEsIG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHRhcmdl
dF9idWZmZXIKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQo
MiwgdGFyZ2V0X2J1ZmZlcl8pOworICB9CisKKyAgLy8gRmllbGQgMzogdHJhY2VfZHVyYXRpb25f
bXMKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMywgdHJh
Y2VfZHVyYXRpb25fbXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDc6IHN0b3BfdGltZW91dF9tcwor
ICBpZiAoX2hhc19maWVsZF9bN10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg3LCBzdG9wX3Rp
bWVvdXRfbXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDY6IGVuYWJsZV9leHRyYV9ndWFyZHJhaWxz
CisgIGlmIChfaGFzX2ZpZWxkX1s2XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg2LCBl
bmFibGVfZXh0cmFfZ3VhcmRyYWlsc18pOworICB9CisKKyAgLy8gRmllbGQgNDogdHJhY2luZ19z
ZXNzaW9uX2lkCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50
KDQsIHRyYWNpbmdfc2Vzc2lvbl9pZF8pOworICB9CisKKyAgLy8gRmllbGQgMTAwOiBmdHJhY2Vf
Y29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMDBdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmco
MTAwLCBmdHJhY2VfY29uZmlnXyk7CisgIH0KKworICAvLyBGaWVsZCAxMDI6IGlub2RlX2ZpbGVf
Y29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMDJdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmco
MTAyLCBpbm9kZV9maWxlX2NvbmZpZ18pOworICB9CisKKyAgLy8gRmllbGQgMTAzOiBwcm9jZXNz
X3N0YXRzX2NvbmZpZworICBpZiAoX2hhc19maWVsZF9bMTAzXSkgeworICAgIG1zZy0+QXBwZW5k
U3RyaW5nKDEwMywgcHJvY2Vzc19zdGF0c19jb25maWdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDEw
NDogc3lzX3N0YXRzX2NvbmZpZworICBpZiAoX2hhc19maWVsZF9bMTA0XSkgeworICAgIG1zZy0+
QXBwZW5kU3RyaW5nKDEwNCwgc3lzX3N0YXRzX2NvbmZpZ18pOworICB9CisKKyAgLy8gRmllbGQg
MTA1OiBoZWFwcHJvZmRfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMDVdKSB7CisgICAgbXNn
LT5BcHBlbmRTdHJpbmcoMTA1LCBoZWFwcHJvZmRfY29uZmlnXyk7CisgIH0KKworICAvLyBGaWVs
ZCAxMTA6IGphdmFfaHByb2ZfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMTBdKSB7CisgICAg
bXNnLT5BcHBlbmRTdHJpbmcoMTEwLCBqYXZhX2hwcm9mX2NvbmZpZ18pOworICB9CisKKyAgLy8g
RmllbGQgMTA2OiBhbmRyb2lkX3Bvd2VyX2NvbmZpZworICBpZiAoX2hhc19maWVsZF9bMTA2XSkg
eworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEwNiwgYW5kcm9pZF9wb3dlcl9jb25maWdfKTsKKyAg
fQorCisgIC8vIEZpZWxkIDEwNzogYW5kcm9pZF9sb2dfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxk
X1sxMDddKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMTA3LCBhbmRyb2lkX2xvZ19jb25maWdf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDEwODogZ3B1X2NvdW50ZXJfY29uZmlnCisgIGlmIChfaGFz
X2ZpZWxkX1sxMDhdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMTA4LCBncHVfY291bnRlcl9j
b25maWdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDEwOTogcGFja2FnZXNfbGlzdF9jb25maWcKKyAg
aWYgKF9oYXNfZmllbGRfWzEwOV0pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZygxMDksIHBhY2th
Z2VzX2xpc3RfY29uZmlnXyk7CisgIH0KKworICAvLyBGaWVsZCAxMTE6IHBlcmZfZXZlbnRfY29u
ZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMTFdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMTEx
LCBwZXJmX2V2ZW50X2NvbmZpZ18pOworICB9CisKKyAgLy8gRmllbGQgMTEyOiB2dWxrYW5fbWVt
b3J5X2NvbmZpZworICBpZiAoX2hhc19maWVsZF9bMTEyXSkgeworICAgIG1zZy0+QXBwZW5kU3Ry
aW5nKDExMiwgdnVsa2FuX21lbW9yeV9jb25maWdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDExMzog
dHJhY2tfZXZlbnRfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMTNdKSB7CisgICAgbXNnLT5B
cHBlbmRTdHJpbmcoMTEzLCB0cmFja19ldmVudF9jb25maWdfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDExNDogYW5kcm9pZF9wb2xsZWRfc3RhdGVfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMTRd
KSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMTE0LCBhbmRyb2lkX3BvbGxlZF9zdGF0ZV9jb25m
aWdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDEwMTogY2hyb21lX2NvbmZpZworICBpZiAoX2hhc19m
aWVsZF9bMTAxXSkgeworICAgICgqY2hyb21lX2NvbmZpZ18pLlNlcmlhbGl6ZShtc2ctPkJlZ2lu
TmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMTAxKSk7CisgIH0KKworICAvLyBG
aWVsZCAxMDAwOiBsZWdhY3lfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxMDAwXSkgeworICAg
IG1zZy0+QXBwZW5kU3RyaW5nKDEwMDAsIGxlZ2FjeV9jb25maWdfKTsKKyAgfQorCisgIC8vIEZp
ZWxkIDEwMDE6IGZvcl90ZXN0aW5nCisgIGlmIChfaGFzX2ZpZWxkX1sxMDAxXSkgeworICAgICgq
Zm9yX3Rlc3RpbmdfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+KDEwMDEpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1
bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAg
Ly8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1l
c3BhY2UgZ2VuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvdGVzdF9jb25maWcuZ2Vu
LmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNv
ZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dl
bmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGlj
IHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25m
aWcvdGVzdF9jb25maWcuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2Ug
cHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitUZXN0Q29uZmlnOjpUZXN0Q29uZmlnKCkgPSBk
ZWZhdWx0OworVGVzdENvbmZpZzo6flRlc3RDb25maWcoKSA9IGRlZmF1bHQ7CitUZXN0Q29uZmln
OjpUZXN0Q29uZmlnKGNvbnN0IFRlc3RDb25maWcmKSA9IGRlZmF1bHQ7CitUZXN0Q29uZmlnJiBU
ZXN0Q29uZmlnOjpvcGVyYXRvcj0oY29uc3QgVGVzdENvbmZpZyYpID0gZGVmYXVsdDsKK1Rlc3RD
b25maWc6OlRlc3RDb25maWcoVGVzdENvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitUZXN0
Q29uZmlnJiBUZXN0Q29uZmlnOjpvcGVyYXRvcj0oVGVzdENvbmZpZyYmKSA9IGRlZmF1bHQ7CisK
K2Jvb2wgVGVzdENvbmZpZzo6b3BlcmF0b3I9PShjb25zdCBUZXN0Q29uZmlnJiBvdGhlcikgY29u
c3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXwor
ICAgJiYgbWVzc2FnZV9jb3VudF8gPT0gb3RoZXIubWVzc2FnZV9jb3VudF8KKyAgICYmIG1heF9t
ZXNzYWdlc19wZXJfc2Vjb25kXyA9PSBvdGhlci5tYXhfbWVzc2FnZXNfcGVyX3NlY29uZF8KKyAg
ICYmIHNlZWRfID09IG90aGVyLnNlZWRfCisgICAmJiBtZXNzYWdlX3NpemVfID09IG90aGVyLm1l
c3NhZ2Vfc2l6ZV8KKyAgICYmIHNlbmRfYmF0Y2hfb25fcmVnaXN0ZXJfID09IG90aGVyLnNlbmRf
YmF0Y2hfb25fcmVnaXN0ZXJfCisgICAmJiBkdW1teV9maWVsZHNfID09IG90aGVyLmR1bW15X2Zp
ZWxkc187Cit9CisKK2Jvb2wgVGVzdENvbmZpZzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCog
cmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBw
YWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhy
YXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZh
bGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBf
aGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsK
KyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogbWVzc2Fn
ZV9jb3VudCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZtZXNzYWdlX2NvdW50Xyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAyIC8qIG1heF9tZXNzYWdlc19wZXJfc2Vjb25kICovOgorICAg
ICAgICBmaWVsZC5nZXQoJm1heF9tZXNzYWdlc19wZXJfc2Vjb25kXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSAzIC8qIHNlZWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmc2VlZF8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBtZXNzYWdlX3NpemUgKi86CisgICAgICAg
IGZpZWxkLmdldCgmbWVzc2FnZV9zaXplXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1
IC8qIHNlbmRfYmF0Y2hfb25fcmVnaXN0ZXIgKi86CisgICAgICAgIGZpZWxkLmdldCgmc2VuZF9i
YXRjaF9vbl9yZWdpc3Rlcl8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAvKiBkdW1t
eV9maWVsZHMgKi86CisgICAgICAgICgqZHVtbXlfZmllbGRzXykuUGFyc2VGcm9tU3RyaW5nKGZp
ZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAg
ICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5
dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVGVzdENvbmZpZzo6U2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVGVzdENvbmZpZzo6U2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVGVzdENvbmZpZzo6U2VyaWFsaXpl
KDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogbWVzc2Fn
ZV9jb3VudAorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgx
LCBtZXNzYWdlX2NvdW50Xyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBtYXhfbWVzc2FnZXNfcGVy
X3NlY29uZAorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgy
LCBtYXhfbWVzc2FnZXNfcGVyX3NlY29uZF8pOworICB9CisKKyAgLy8gRmllbGQgMzogc2VlZAor
ICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgzLCBzZWVkXyk7
CisgIH0KKworICAvLyBGaWVsZCA0OiBtZXNzYWdlX3NpemUKKyAgaWYgKF9oYXNfZmllbGRfWzRd
KSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNCwgbWVzc2FnZV9zaXplXyk7CisgIH0KKworICAv
LyBGaWVsZCA1OiBzZW5kX2JhdGNoX29uX3JlZ2lzdGVyCisgIGlmIChfaGFzX2ZpZWxkX1s1XSkg
eworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg1LCBzZW5kX2JhdGNoX29uX3JlZ2lzdGVyXyk7
CisgIH0KKworICAvLyBGaWVsZCA2OiBkdW1teV9maWVsZHMKKyAgaWYgKF9oYXNfZmllbGRfWzZd
KSB7CisgICAgKCpkdW1teV9maWVsZHNfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3Nh
Z2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDYpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJv
dG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsK
K30KKworCitUZXN0Q29uZmlnX0R1bW15RmllbGRzOjpUZXN0Q29uZmlnX0R1bW15RmllbGRzKCkg
PSBkZWZhdWx0OworVGVzdENvbmZpZ19EdW1teUZpZWxkczo6flRlc3RDb25maWdfRHVtbXlGaWVs
ZHMoKSA9IGRlZmF1bHQ7CitUZXN0Q29uZmlnX0R1bW15RmllbGRzOjpUZXN0Q29uZmlnX0R1bW15
RmllbGRzKGNvbnN0IFRlc3RDb25maWdfRHVtbXlGaWVsZHMmKSA9IGRlZmF1bHQ7CitUZXN0Q29u
ZmlnX0R1bW15RmllbGRzJiBUZXN0Q29uZmlnX0R1bW15RmllbGRzOjpvcGVyYXRvcj0oY29uc3Qg
VGVzdENvbmZpZ19EdW1teUZpZWxkcyYpID0gZGVmYXVsdDsKK1Rlc3RDb25maWdfRHVtbXlGaWVs
ZHM6OlRlc3RDb25maWdfRHVtbXlGaWVsZHMoVGVzdENvbmZpZ19EdW1teUZpZWxkcyYmKSBub2V4
Y2VwdCA9IGRlZmF1bHQ7CitUZXN0Q29uZmlnX0R1bW15RmllbGRzJiBUZXN0Q29uZmlnX0R1bW15
RmllbGRzOjpvcGVyYXRvcj0oVGVzdENvbmZpZ19EdW1teUZpZWxkcyYmKSA9IGRlZmF1bHQ7CisK
K2Jvb2wgVGVzdENvbmZpZ19EdW1teUZpZWxkczo6b3BlcmF0b3I9PShjb25zdCBUZXN0Q29uZmln
X0R1bW15RmllbGRzJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09
IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgZmllbGRfdWludDMyXyA9PSBvdGhlci5maWVs
ZF91aW50MzJfCisgICAmJiBmaWVsZF9pbnQzMl8gPT0gb3RoZXIuZmllbGRfaW50MzJfCisgICAm
JiBmaWVsZF91aW50NjRfID09IG90aGVyLmZpZWxkX3VpbnQ2NF8KKyAgICYmIGZpZWxkX2ludDY0
XyA9PSBvdGhlci5maWVsZF9pbnQ2NF8KKyAgICYmIGZpZWxkX2ZpeGVkNjRfID09IG90aGVyLmZp
ZWxkX2ZpeGVkNjRfCisgICAmJiBmaWVsZF9zZml4ZWQ2NF8gPT0gb3RoZXIuZmllbGRfc2ZpeGVk
NjRfCisgICAmJiBmaWVsZF9maXhlZDMyXyA9PSBvdGhlci5maWVsZF9maXhlZDMyXworICAgJiYg
ZmllbGRfc2ZpeGVkMzJfID09IG90aGVyLmZpZWxkX3NmaXhlZDMyXworICAgJiYgZmllbGRfZG91
YmxlXyA9PSBvdGhlci5maWVsZF9kb3VibGVfCisgICAmJiBmaWVsZF9mbG9hdF8gPT0gb3RoZXIu
ZmllbGRfZmxvYXRfCisgICAmJiBmaWVsZF9zaW50NjRfID09IG90aGVyLmZpZWxkX3NpbnQ2NF8K
KyAgICYmIGZpZWxkX3NpbnQzMl8gPT0gb3RoZXIuZmllbGRfc2ludDMyXworICAgJiYgZmllbGRf
c3RyaW5nXyA9PSBvdGhlci5maWVsZF9zdHJpbmdfCisgICAmJiBmaWVsZF9ieXRlc18gPT0gb3Ro
ZXIuZmllbGRfYnl0ZXNfOworfQorCitib29sIFRlc3RDb25maWdfRHVtbXlGaWVsZHM6OlBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVs
ZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3pl
cm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVj
LlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgewor
ICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2Zp
ZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgewor
ICAgICAgY2FzZSAxIC8qIGZpZWxkX3VpbnQzMiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZmaWVs
ZF91aW50MzJfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogZmllbGRfaW50MzIg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmZmllbGRfaW50MzJfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDMgLyogZmllbGRfdWludDY0ICovOgorICAgICAgICBmaWVsZC5nZXQoJmZpZWxk
X3VpbnQ2NF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBmaWVsZF9pbnQ2NCAq
LzoKKyAgICAgICAgZmllbGQuZ2V0KCZmaWVsZF9pbnQ2NF8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgNSAvKiBmaWVsZF9maXhlZDY0ICovOgorICAgICAgICBmaWVsZC5nZXQoJmZpZWxk
X2ZpeGVkNjRfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYgLyogZmllbGRfc2ZpeGVk
NjQgKi86CisgICAgICAgIGZpZWxkLmdldCgmZmllbGRfc2ZpeGVkNjRfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDcgLyogZmllbGRfZml4ZWQzMiAqLzoKKyAgICAgICAgZmllbGQuZ2V0
KCZmaWVsZF9maXhlZDMyXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIGZpZWxk
X3NmaXhlZDMyICovOgorICAgICAgICBmaWVsZC5nZXQoJmZpZWxkX3NmaXhlZDMyXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSA5IC8qIGZpZWxkX2RvdWJsZSAqLzoKKyAgICAgICAgZmll
bGQuZ2V0KCZmaWVsZF9kb3VibGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwIC8q
IGZpZWxkX2Zsb2F0ICovOgorICAgICAgICBmaWVsZC5nZXQoJmZpZWxkX2Zsb2F0Xyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSAxMSAvKiBmaWVsZF9zaW50NjQgKi86CisgICAgICAgIGZp
ZWxkLmdldF9zaWduZWQoJmZpZWxkX3NpbnQ2NF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNh
c2UgMTIgLyogZmllbGRfc2ludDMyICovOgorICAgICAgICBmaWVsZC5nZXRfc2lnbmVkKCZmaWVs
ZF9zaW50MzJfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEzIC8qIGZpZWxkX3N0cmlu
ZyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZmaWVsZF9zdHJpbmdfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDE0IC8qIGZpZWxkX2J5dGVzICovOgorICAgICAgICBmaWVsZC5nZXQoJmZp
ZWxkX2J5dGVzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmll
bGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQo
KTsKK30KKworc3RkOjpzdHJpbmcgVGVzdENvbmZpZ19EdW1teUZpZWxkczo6U2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86
Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2Vy
aWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVGVzdENvbmZpZ19E
dW1teUZpZWxkczo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVGVzdENv
bmZpZ19EdW1teUZpZWxkczo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNv
bnN0IHsKKyAgLy8gRmllbGQgMTogZmllbGRfdWludDMyCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkg
eworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGZpZWxkX3VpbnQzMl8pOworICB9CisKKyAgLy8g
RmllbGQgMjogZmllbGRfaW50MzIKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5B
cHBlbmRWYXJJbnQoMiwgZmllbGRfaW50MzJfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGZpZWxk
X3VpbnQ2NAorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgz
LCBmaWVsZF91aW50NjRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IGZpZWxkX2ludDY0CisgIGlm
IChfaGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDQsIGZpZWxkX2ludDY0
Xyk7CisgIH0KKworICAvLyBGaWVsZCA1OiBmaWVsZF9maXhlZDY0CisgIGlmIChfaGFzX2ZpZWxk
X1s1XSkgeworICAgIG1zZy0+QXBwZW5kRml4ZWQoNSwgZmllbGRfZml4ZWQ2NF8pOworICB9CisK
KyAgLy8gRmllbGQgNjogZmllbGRfc2ZpeGVkNjQKKyAgaWYgKF9oYXNfZmllbGRfWzZdKSB7Cisg
ICAgbXNnLT5BcHBlbmRGaXhlZCg2LCBmaWVsZF9zZml4ZWQ2NF8pOworICB9CisKKyAgLy8gRmll
bGQgNzogZmllbGRfZml4ZWQzMgorICBpZiAoX2hhc19maWVsZF9bN10pIHsKKyAgICBtc2ctPkFw
cGVuZEZpeGVkKDcsIGZpZWxkX2ZpeGVkMzJfKTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IGZpZWxk
X3NmaXhlZDMyCisgIGlmIChfaGFzX2ZpZWxkX1s4XSkgeworICAgIG1zZy0+QXBwZW5kRml4ZWQo
OCwgZmllbGRfc2ZpeGVkMzJfKTsKKyAgfQorCisgIC8vIEZpZWxkIDk6IGZpZWxkX2RvdWJsZQor
ICBpZiAoX2hhc19maWVsZF9bOV0pIHsKKyAgICBtc2ctPkFwcGVuZEZpeGVkKDksIGZpZWxkX2Rv
dWJsZV8pOworICB9CisKKyAgLy8gRmllbGQgMTA6IGZpZWxkX2Zsb2F0CisgIGlmIChfaGFzX2Zp
ZWxkX1sxMF0pIHsKKyAgICBtc2ctPkFwcGVuZEZpeGVkKDEwLCBmaWVsZF9mbG9hdF8pOworICB9
CisKKyAgLy8gRmllbGQgMTE6IGZpZWxkX3NpbnQ2NAorICBpZiAoX2hhc19maWVsZF9bMTFdKSB7
CisgICAgbXNnLT5BcHBlbmRTaWduZWRWYXJJbnQoMTEsIGZpZWxkX3NpbnQ2NF8pOworICB9CisK
KyAgLy8gRmllbGQgMTI6IGZpZWxkX3NpbnQzMgorICBpZiAoX2hhc19maWVsZF9bMTJdKSB7Cisg
ICAgbXNnLT5BcHBlbmRTaWduZWRWYXJJbnQoMTIsIGZpZWxkX3NpbnQzMl8pOworICB9CisKKyAg
Ly8gRmllbGQgMTM6IGZpZWxkX3N0cmluZworICBpZiAoX2hhc19maWVsZF9bMTNdKSB7CisgICAg
bXNnLT5BcHBlbmRTdHJpbmcoMTMsIGZpZWxkX3N0cmluZ18pOworICB9CisKKyAgLy8gRmllbGQg
MTQ6IGZpZWxkX2J5dGVzCisgIGlmIChfaGFzX2ZpZWxkX1sxNF0pIHsKKyAgICBtc2ctPkFwcGVu
ZFN0cmluZygxNCwgZmllbGRfYnl0ZXNfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9C
eXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30K
KworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAv
LyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvdHJhY2VfY29u
ZmlnLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by9jb25maWcvdHJhY2VfY29uZmlnLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dl
bmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1RSQUNFX0NPTkZJR19QUk9UT19DUFBfSF8KKyNkZWZp
bmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfVFJBQ0VfQ09ORklHX1BS
T1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2lu
Y2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xh
c3MgVHJhY2VDb25maWc7CitjbGFzcyBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZzsK
K2NsYXNzIFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWc7CitjbGFzcyBUcmFjZUNv
bmZpZ19UcmlnZ2VyQ29uZmlnOworY2xhc3MgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19Ucmln
Z2VyOworY2xhc3MgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzOworY2xhc3MgVHJhY2VD
b25maWdfU3RhdHNkTWV0YWRhdGE7CitjbGFzcyBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZzsK
K2NsYXNzIFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlOworY2xhc3MgVHJhY2VDb25maWdf
RGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2VDb25maWc7CitjbGFzcyBUZXN0Q29uZmlnOwor
Y2xhc3MgVGVzdENvbmZpZ19EdW1teUZpZWxkczsKK2NsYXNzIENocm9tZUNvbmZpZzsKK2NsYXNz
IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZzsKK2VudW0gVHJhY2VDb25maWdfTG9ja2Rvd25Nb2Rl
T3BlcmF0aW9uIDogaW50OworZW51bSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGUgOiBpbnQ7
CitlbnVtIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGUgOiBpbnQ7CitlbnVt
IEJ1aWx0aW5DbG9jayA6IGludDsKK2VudW0gVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQ
b2xpY3kgOiBpbnQ7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBw
cm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFz
cyBNZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2VudW0gVHJhY2VDb25m
aWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uIDogaW50IHsKKyAgVHJhY2VDb25maWdfTG9ja2Rvd25N
b2RlT3BlcmF0aW9uX0xPQ0tET1dOX1VOQ0hBTkdFRCA9IDAsCisgIFRyYWNlQ29uZmlnX0xvY2tk
b3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9DTEVBUiA9IDEsCisgIFRyYWNlQ29uZmlnX0xvY2tk
b3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9TRVQgPSAyLAorfTsKK2VudW0gVHJhY2VDb25maWdf
Q29tcHJlc3Npb25UeXBlIDogaW50IHsKKyAgVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlX0NP
TVBSRVNTSU9OX1RZUEVfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFjZUNvbmZpZ19Db21wcmVzc2lv
blR5cGVfQ09NUFJFU1NJT05fVFlQRV9ERUZMQVRFID0gMSwKK307CitlbnVtIFRyYWNlQ29uZmln
X1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGUgOiBpbnQgeworICBUcmFjZUNvbmZpZ19UcmlnZ2Vy
Q29uZmlnX1RyaWdnZXJNb2RlX1VOU1BFQ0lGSUVEID0gMCwKKyAgVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZ19UcmlnZ2VyTW9kZV9TVEFSVF9UUkFDSU5HID0gMSwKKyAgVHJhY2VDb25maWdfVHJp
Z2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9TVE9QX1RSQUNJTkcgPSAyLAorfTsKK2VudW0gVHJhY2VD
b25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQb2xpY3kgOiBpbnQgeworICBUcmFjZUNvbmZpZ19CdWZm
ZXJDb25maWdfRmlsbFBvbGljeV9VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNlQ29uZmlnX0J1ZmZl
ckNvbmZpZ19GaWxsUG9saWN5X1JJTkdfQlVGRkVSID0gMSwKKyAgVHJhY2VDb25maWdfQnVmZmVy
Q29uZmlnX0ZpbGxQb2xpY3lfRElTQ0FSRCA9IDIsCit9OworCitjbGFzcyBQRVJGRVRUT19FWFBP
UlQgVHJhY2VDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1
YmxpYzoKKyAgdXNpbmcgQnVmZmVyQ29uZmlnID0gVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnOwor
ICB1c2luZyBEYXRhU291cmNlID0gVHJhY2VDb25maWdfRGF0YVNvdXJjZTsKKyAgdXNpbmcgQnVp
bHRpbkRhdGFTb3VyY2UgPSBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZTsKKyAgdXNpbmcg
UHJvZHVjZXJDb25maWcgPSBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZzsKKyAgdXNpbmcgU3Rh
dHNkTWV0YWRhdGEgPSBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YTsKKyAgdXNpbmcgR3VhcmRy
YWlsT3ZlcnJpZGVzID0gVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzOworICB1c2luZyBU
cmlnZ2VyQ29uZmlnID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZzsKKyAgdXNpbmcgSW5jcmVt
ZW50YWxTdGF0ZUNvbmZpZyA9IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWc7Cisg
IHVzaW5nIEluY2lkZW50UmVwb3J0Q29uZmlnID0gVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRD
b25maWc7CisgIHVzaW5nIExvY2tkb3duTW9kZU9wZXJhdGlvbiA9IFRyYWNlQ29uZmlnX0xvY2tk
b3duTW9kZU9wZXJhdGlvbjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIExPQ0tET1dOX1VOQ0hB
TkdFRCA9IFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9VTkNIQU5H
RUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBMT0NLRE9XTl9DTEVBUiA9IFRyYWNlQ29uZmln
X0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9DTEVBUjsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIExPQ0tET1dOX1NFVCA9IFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9M
T0NLRE9XTl9TRVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBMb2NrZG93bk1vZGVPcGVyYXRp
b25fTUlOID0gVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uX0xPQ0tET1dOX1VOQ0hB
TkdFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIExvY2tkb3duTW9kZU9wZXJhdGlvbl9NQVgg
PSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fU0VUOworICB1c2lu
ZyBDb21wcmVzc2lvblR5cGUgPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGU7CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBDT01QUkVTU0lPTl9UWVBFX1VOU1BFQ0lGSUVEID0gVHJhY2VDb25m
aWdfQ29tcHJlc3Npb25UeXBlX0NPTVBSRVNTSU9OX1RZUEVfVU5TUEVDSUZJRUQ7CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBDT01QUkVTU0lPTl9UWVBFX0RFRkxBVEUgPSBUcmFjZUNvbmZpZ19D
b21wcmVzc2lvblR5cGVfQ09NUFJFU1NJT05fVFlQRV9ERUZMQVRFOworICBzdGF0aWMgY29uc3Rl
eHByIGF1dG8gQ29tcHJlc3Npb25UeXBlX01JTiA9IFRyYWNlQ29uZmlnX0NvbXByZXNzaW9uVHlw
ZV9DT01QUkVTU0lPTl9UWVBFX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8g
Q29tcHJlc3Npb25UeXBlX01BWCA9IFRyYWNlQ29uZmlnX0NvbXByZXNzaW9uVHlwZV9DT01QUkVT
U0lPTl9UWVBFX0RFRkxBVEU7CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrQnVmZmVyc0Zp
ZWxkTnVtYmVyID0gMSwKKyAgICBrRGF0YVNvdXJjZXNGaWVsZE51bWJlciA9IDIsCisgICAga0J1
aWx0aW5EYXRhU291cmNlc0ZpZWxkTnVtYmVyID0gMjAsCisgICAga0R1cmF0aW9uTXNGaWVsZE51
bWJlciA9IDMsCisgICAga0VuYWJsZUV4dHJhR3VhcmRyYWlsc0ZpZWxkTnVtYmVyID0gNCwKKyAg
ICBrTG9ja2Rvd25Nb2RlRmllbGROdW1iZXIgPSA1LAorICAgIGtQcm9kdWNlcnNGaWVsZE51bWJl
ciA9IDYsCisgICAga1N0YXRzZE1ldGFkYXRhRmllbGROdW1iZXIgPSA3LAorICAgIGtXcml0ZUlu
dG9GaWxlRmllbGROdW1iZXIgPSA4LAorICAgIGtPdXRwdXRQYXRoRmllbGROdW1iZXIgPSAyOSwK
KyAgICBrRmlsZVdyaXRlUGVyaW9kTXNGaWVsZE51bWJlciA9IDksCisgICAga01heEZpbGVTaXpl
Qnl0ZXNGaWVsZE51bWJlciA9IDEwLAorICAgIGtHdWFyZHJhaWxPdmVycmlkZXNGaWVsZE51bWJl
ciA9IDExLAorICAgIGtEZWZlcnJlZFN0YXJ0RmllbGROdW1iZXIgPSAxMiwKKyAgICBrRmx1c2hQ
ZXJpb2RNc0ZpZWxkTnVtYmVyID0gMTMsCisgICAga0ZsdXNoVGltZW91dE1zRmllbGROdW1iZXIg
PSAxNCwKKyAgICBrRGF0YVNvdXJjZVN0b3BUaW1lb3V0TXNGaWVsZE51bWJlciA9IDIzLAorICAg
IGtOb3RpZnlUcmFjZXVyRmllbGROdW1iZXIgPSAxNiwKKyAgICBrVHJpZ2dlckNvbmZpZ0ZpZWxk
TnVtYmVyID0gMTcsCisgICAga0FjdGl2YXRlVHJpZ2dlcnNGaWVsZE51bWJlciA9IDE4LAorICAg
IGtJbmNyZW1lbnRhbFN0YXRlQ29uZmlnRmllbGROdW1iZXIgPSAyMSwKKyAgICBrQWxsb3dVc2Vy
QnVpbGRUcmFjaW5nRmllbGROdW1iZXIgPSAxOSwKKyAgICBrVW5pcXVlU2Vzc2lvbk5hbWVGaWVs
ZE51bWJlciA9IDIyLAorICAgIGtDb21wcmVzc2lvblR5cGVGaWVsZE51bWJlciA9IDI0LAorICAg
IGtJbmNpZGVudFJlcG9ydENvbmZpZ0ZpZWxkTnVtYmVyID0gMjUsCisgICAga1RyYWNlVXVpZE1z
YkZpZWxkTnVtYmVyID0gMjcsCisgICAga1RyYWNlVXVpZExzYkZpZWxkTnVtYmVyID0gMjgsCisg
IH07CisKKyAgVHJhY2VDb25maWcoKTsKKyAgflRyYWNlQ29uZmlnKCkgb3ZlcnJpZGU7CisgIFRy
YWNlQ29uZmlnKFRyYWNlQ29uZmlnJiYpIG5vZXhjZXB0OworICBUcmFjZUNvbmZpZyYgb3BlcmF0
b3I9KFRyYWNlQ29uZmlnJiYpOworICBUcmFjZUNvbmZpZyhjb25zdCBUcmFjZUNvbmZpZyYpOwor
ICBUcmFjZUNvbmZpZyYgb3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnJik7CisgIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29u
c3QgVHJhY2VDb25maWcmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsg
fQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7
CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0
ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAg
dm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBpbnQgYnVm
ZmVyc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihidWZmZXJzXy5zaXpl
KCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZz4mIGJ1
ZmZlcnMoKSBjb25zdCB7IHJldHVybiBidWZmZXJzXzsgfQorICBzdGQ6OnZlY3RvcjxUcmFjZUNv
bmZpZ19CdWZmZXJDb25maWc+KiBtdXRhYmxlX2J1ZmZlcnMoKSB7IHJldHVybiAmYnVmZmVyc187
IH0KKyAgdm9pZCBjbGVhcl9idWZmZXJzKCkgeyBidWZmZXJzXy5jbGVhcigpOyB9CisgIFRyYWNl
Q29uZmlnX0J1ZmZlckNvbmZpZyogYWRkX2J1ZmZlcnMoKSB7IGJ1ZmZlcnNfLmVtcGxhY2VfYmFj
aygpOyByZXR1cm4gJmJ1ZmZlcnNfLmJhY2soKTsgfQorCisgIGludCBkYXRhX3NvdXJjZXNfc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZGF0YV9zb3VyY2VzXy5zaXplKCkp
OyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRyYWNlQ29uZmlnX0RhdGFTb3VyY2U+JiBkYXRhX3Nv
dXJjZXMoKSBjb25zdCB7IHJldHVybiBkYXRhX3NvdXJjZXNfOyB9CisgIHN0ZDo6dmVjdG9yPFRy
YWNlQ29uZmlnX0RhdGFTb3VyY2U+KiBtdXRhYmxlX2RhdGFfc291cmNlcygpIHsgcmV0dXJuICZk
YXRhX3NvdXJjZXNfOyB9CisgIHZvaWQgY2xlYXJfZGF0YV9zb3VyY2VzKCkgeyBkYXRhX3NvdXJj
ZXNfLmNsZWFyKCk7IH0KKyAgVHJhY2VDb25maWdfRGF0YVNvdXJjZSogYWRkX2RhdGFfc291cmNl
cygpIHsgZGF0YV9zb3VyY2VzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZkYXRhX3NvdXJjZXNf
LmJhY2soKTsgfQorCisgIGJvb2wgaGFzX2J1aWx0aW5fZGF0YV9zb3VyY2VzKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bMjBdOyB9CisgIGNvbnN0IFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRh
U291cmNlJiBidWlsdGluX2RhdGFfc291cmNlcygpIGNvbnN0IHsgcmV0dXJuICpidWlsdGluX2Rh
dGFfc291cmNlc187IH0KKyAgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2UqIG11dGFibGVf
YnVpbHRpbl9kYXRhX3NvdXJjZXMoKSB7IF9oYXNfZmllbGRfLnNldCgyMCk7IHJldHVybiBidWls
dGluX2RhdGFfc291cmNlc18uZ2V0KCk7IH0KKworICBib29sIGhhc19kdXJhdGlvbl9tcygpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIHVpbnQzMl90IGR1cmF0aW9uX21zKCkg
Y29uc3QgeyByZXR1cm4gZHVyYXRpb25fbXNfOyB9CisgIHZvaWQgc2V0X2R1cmF0aW9uX21zKHVp
bnQzMl90IHZhbHVlKSB7IGR1cmF0aW9uX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7
IH0KKworICBib29sIGhhc19lbmFibGVfZXh0cmFfZ3VhcmRyYWlscygpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzRdOyB9CisgIGJvb2wgZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKSBjb25z
dCB7IHJldHVybiBlbmFibGVfZXh0cmFfZ3VhcmRyYWlsc187IH0KKyAgdm9pZCBzZXRfZW5hYmxl
X2V4dHJhX2d1YXJkcmFpbHMoYm9vbCB2YWx1ZSkgeyBlbmFibGVfZXh0cmFfZ3VhcmRyYWlsc18g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfbG9ja2Rvd25fbW9k
ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIFRyYWNlQ29uZmlnX0xvY2tk
b3duTW9kZU9wZXJhdGlvbiBsb2NrZG93bl9tb2RlKCkgY29uc3QgeyByZXR1cm4gbG9ja2Rvd25f
bW9kZV87IH0KKyAgdm9pZCBzZXRfbG9ja2Rvd25fbW9kZShUcmFjZUNvbmZpZ19Mb2NrZG93bk1v
ZGVPcGVyYXRpb24gdmFsdWUpIHsgbG9ja2Rvd25fbW9kZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDUpOyB9CisKKyAgaW50IHByb2R1Y2Vyc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGlj
X2Nhc3Q8aW50Pihwcm9kdWNlcnNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJh
Y2VDb25maWdfUHJvZHVjZXJDb25maWc+JiBwcm9kdWNlcnMoKSBjb25zdCB7IHJldHVybiBwcm9k
dWNlcnNfOyB9CisgIHN0ZDo6dmVjdG9yPFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnPiogbXV0
YWJsZV9wcm9kdWNlcnMoKSB7IHJldHVybiAmcHJvZHVjZXJzXzsgfQorICB2b2lkIGNsZWFyX3By
b2R1Y2VycygpIHsgcHJvZHVjZXJzXy5jbGVhcigpOyB9CisgIFRyYWNlQ29uZmlnX1Byb2R1Y2Vy
Q29uZmlnKiBhZGRfcHJvZHVjZXJzKCkgeyBwcm9kdWNlcnNfLmVtcGxhY2VfYmFjaygpOyByZXR1
cm4gJnByb2R1Y2Vyc18uYmFjaygpOyB9CisKKyAgYm9vbCBoYXNfc3RhdHNkX21ldGFkYXRhKCkg
Y29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bN107IH0KKyAgY29uc3QgVHJhY2VDb25maWdfU3Rh
dHNkTWV0YWRhdGEmIHN0YXRzZF9tZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuICpzdGF0c2RfbWV0
YWRhdGFfOyB9CisgIFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhKiBtdXRhYmxlX3N0YXRzZF9t
ZXRhZGF0YSgpIHsgX2hhc19maWVsZF8uc2V0KDcpOyByZXR1cm4gc3RhdHNkX21ldGFkYXRhXy5n
ZXQoKTsgfQorCisgIGJvb2wgaGFzX3dyaXRlX2ludG9fZmlsZSgpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzhdOyB9CisgIGJvb2wgd3JpdGVfaW50b19maWxlKCkgY29uc3QgeyByZXR1cm4g
d3JpdGVfaW50b19maWxlXzsgfQorICB2b2lkIHNldF93cml0ZV9pbnRvX2ZpbGUoYm9vbCB2YWx1
ZSkgeyB3cml0ZV9pbnRvX2ZpbGVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg4KTsgfQorCisg
IGJvb2wgaGFzX291dHB1dF9wYXRoKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjldOyB9
CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dHB1
dF9wYXRoXzsgfQorICB2b2lkIHNldF9vdXRwdXRfcGF0aChjb25zdCBzdGQ6OnN0cmluZyYgdmFs
dWUpIHsgb3V0cHV0X3BhdGhfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyOSk7IH0KKworICBi
b29sIGhhc19maWxlX3dyaXRlX3BlcmlvZF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRf
WzldOyB9CisgIHVpbnQzMl90IGZpbGVfd3JpdGVfcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4g
ZmlsZV93cml0ZV9wZXJpb2RfbXNfOyB9CisgIHZvaWQgc2V0X2ZpbGVfd3JpdGVfcGVyaW9kX21z
KHVpbnQzMl90IHZhbHVlKSB7IGZpbGVfd3JpdGVfcGVyaW9kX21zXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoOSk7IH0KKworICBib29sIGhhc19tYXhfZmlsZV9zaXplX2J5dGVzKCkgY29uc3Qg
eyByZXR1cm4gX2hhc19maWVsZF9bMTBdOyB9CisgIHVpbnQ2NF90IG1heF9maWxlX3NpemVfYnl0
ZXMoKSBjb25zdCB7IHJldHVybiBtYXhfZmlsZV9zaXplX2J5dGVzXzsgfQorICB2b2lkIHNldF9t
YXhfZmlsZV9zaXplX2J5dGVzKHVpbnQ2NF90IHZhbHVlKSB7IG1heF9maWxlX3NpemVfYnl0ZXNf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMCk7IH0KKworICBib29sIGhhc19ndWFyZHJhaWxf
b3ZlcnJpZGVzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTFdOyB9CisgIGNvbnN0IFRy
YWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYgZ3VhcmRyYWlsX292ZXJyaWRlcygpIGNvbnN0
IHsgcmV0dXJuICpndWFyZHJhaWxfb3ZlcnJpZGVzXzsgfQorICBUcmFjZUNvbmZpZ19HdWFyZHJh
aWxPdmVycmlkZXMqIG11dGFibGVfZ3VhcmRyYWlsX292ZXJyaWRlcygpIHsgX2hhc19maWVsZF8u
c2V0KDExKTsgcmV0dXJuIGd1YXJkcmFpbF9vdmVycmlkZXNfLmdldCgpOyB9CisKKyAgYm9vbCBo
YXNfZGVmZXJyZWRfc3RhcnQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxMl07IH0KKyAg
Ym9vbCBkZWZlcnJlZF9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGRlZmVycmVkX3N0YXJ0XzsgfQor
ICB2b2lkIHNldF9kZWZlcnJlZF9zdGFydChib29sIHZhbHVlKSB7IGRlZmVycmVkX3N0YXJ0XyA9
IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTIpOyB9CisKKyAgYm9vbCBoYXNfZmx1c2hfcGVyaW9k
X21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTNdOyB9CisgIHVpbnQzMl90IGZsdXNo
X3BlcmlvZF9tcygpIGNvbnN0IHsgcmV0dXJuIGZsdXNoX3BlcmlvZF9tc187IH0KKyAgdm9pZCBz
ZXRfZmx1c2hfcGVyaW9kX21zKHVpbnQzMl90IHZhbHVlKSB7IGZsdXNoX3BlcmlvZF9tc18gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEzKTsgfQorCisgIGJvb2wgaGFzX2ZsdXNoX3RpbWVvdXRf
bXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxNF07IH0KKyAgdWludDMyX3QgZmx1c2hf
dGltZW91dF9tcygpIGNvbnN0IHsgcmV0dXJuIGZsdXNoX3RpbWVvdXRfbXNfOyB9CisgIHZvaWQg
c2V0X2ZsdXNoX3RpbWVvdXRfbXModWludDMyX3QgdmFsdWUpIHsgZmx1c2hfdGltZW91dF9tc18g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDE0KTsgfQorCisgIGJvb2wgaGFzX2RhdGFfc291cmNl
X3N0b3BfdGltZW91dF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzIzXTsgfQorICB1
aW50MzJfdCBkYXRhX3NvdXJjZV9zdG9wX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBkYXRh
X3NvdXJjZV9zdG9wX3RpbWVvdXRfbXNfOyB9CisgIHZvaWQgc2V0X2RhdGFfc291cmNlX3N0b3Bf
dGltZW91dF9tcyh1aW50MzJfdCB2YWx1ZSkgeyBkYXRhX3NvdXJjZV9zdG9wX3RpbWVvdXRfbXNf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyMyk7IH0KKworICBib29sIGhhc19ub3RpZnlfdHJh
Y2V1cigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE2XTsgfQorICBib29sIG5vdGlmeV90
cmFjZXVyKCkgY29uc3QgeyByZXR1cm4gbm90aWZ5X3RyYWNldXJfOyB9CisgIHZvaWQgc2V0X25v
dGlmeV90cmFjZXVyKGJvb2wgdmFsdWUpIHsgbm90aWZ5X3RyYWNldXJfID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCgxNik7IH0KKworICBib29sIGhhc190cmlnZ2VyX2NvbmZpZygpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzE3XTsgfQorICBjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnJiB0cmlnZ2VyX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuICp0cmlnZ2VyX2NvbmZpZ187IH0K
KyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyogbXV0YWJsZV90cmlnZ2VyX2NvbmZpZygpIHsg
X2hhc19maWVsZF8uc2V0KDE3KTsgcmV0dXJuIHRyaWdnZXJfY29uZmlnXy5nZXQoKTsgfQorCisg
IGludCBhY3RpdmF0ZV90cmlnZ2Vyc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8
aW50PihhY3RpdmF0ZV90cmlnZ2Vyc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjxz
dGQ6OnN0cmluZz4mIGFjdGl2YXRlX3RyaWdnZXJzKCkgY29uc3QgeyByZXR1cm4gYWN0aXZhdGVf
dHJpZ2dlcnNfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9hY3RpdmF0
ZV90cmlnZ2VycygpIHsgcmV0dXJuICZhY3RpdmF0ZV90cmlnZ2Vyc187IH0KKyAgdm9pZCBjbGVh
cl9hY3RpdmF0ZV90cmlnZ2VycygpIHsgYWN0aXZhdGVfdHJpZ2dlcnNfLmNsZWFyKCk7IH0KKyAg
dm9pZCBhZGRfYWN0aXZhdGVfdHJpZ2dlcnMoc3RkOjpzdHJpbmcgdmFsdWUpIHsgYWN0aXZhdGVf
dHJpZ2dlcnNfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9hY3Rp
dmF0ZV90cmlnZ2VycygpIHsgYWN0aXZhdGVfdHJpZ2dlcnNfLmVtcGxhY2VfYmFjaygpOyByZXR1
cm4gJmFjdGl2YXRlX3RyaWdnZXJzXy5iYWNrKCk7IH0KKworICBib29sIGhhc19pbmNyZW1lbnRh
bF9zdGF0ZV9jb25maWcoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syMV07IH0KKyAgY29u
c3QgVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyYgaW5jcmVtZW50YWxfc3RhdGVf
Y29uZmlnKCkgY29uc3QgeyByZXR1cm4gKmluY3JlbWVudGFsX3N0YXRlX2NvbmZpZ187IH0KKyAg
VHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyogbXV0YWJsZV9pbmNyZW1lbnRhbF9z
dGF0ZV9jb25maWcoKSB7IF9oYXNfZmllbGRfLnNldCgyMSk7IHJldHVybiBpbmNyZW1lbnRhbF9z
dGF0ZV9jb25maWdfLmdldCgpOyB9CisKKyAgYm9vbCBoYXNfYWxsb3dfdXNlcl9idWlsZF90cmFj
aW5nKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTldOyB9CisgIGJvb2wgYWxsb3dfdXNl
cl9idWlsZF90cmFjaW5nKCkgY29uc3QgeyByZXR1cm4gYWxsb3dfdXNlcl9idWlsZF90cmFjaW5n
XzsgfQorICB2b2lkIHNldF9hbGxvd191c2VyX2J1aWxkX3RyYWNpbmcoYm9vbCB2YWx1ZSkgeyBh
bGxvd191c2VyX2J1aWxkX3RyYWNpbmdfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxOSk7IH0K
KworICBib29sIGhhc191bmlxdWVfc2Vzc2lvbl9uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMjJdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1bmlxdWVfc2Vzc2lvbl9uYW1lKCkg
Y29uc3QgeyByZXR1cm4gdW5pcXVlX3Nlc3Npb25fbmFtZV87IH0KKyAgdm9pZCBzZXRfdW5pcXVl
X3Nlc3Npb25fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgdW5pcXVlX3Nlc3Npb25f
bmFtZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIyKTsgfQorCisgIGJvb2wgaGFzX2NvbXBy
ZXNzaW9uX3R5cGUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syNF07IH0KKyAgVHJhY2VD
b25maWdfQ29tcHJlc3Npb25UeXBlIGNvbXByZXNzaW9uX3R5cGUoKSBjb25zdCB7IHJldHVybiBj
b21wcmVzc2lvbl90eXBlXzsgfQorICB2b2lkIHNldF9jb21wcmVzc2lvbl90eXBlKFRyYWNlQ29u
ZmlnX0NvbXByZXNzaW9uVHlwZSB2YWx1ZSkgeyBjb21wcmVzc2lvbl90eXBlXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMjQpOyB9CisKKyAgYm9vbCBoYXNfaW5jaWRlbnRfcmVwb3J0X2NvbmZp
ZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzI1XTsgfQorICBjb25zdCBUcmFjZUNvbmZp
Z19JbmNpZGVudFJlcG9ydENvbmZpZyYgaW5jaWRlbnRfcmVwb3J0X2NvbmZpZygpIGNvbnN0IHsg
cmV0dXJuICppbmNpZGVudF9yZXBvcnRfY29uZmlnXzsgfQorICBUcmFjZUNvbmZpZ19JbmNpZGVu
dFJlcG9ydENvbmZpZyogbXV0YWJsZV9pbmNpZGVudF9yZXBvcnRfY29uZmlnKCkgeyBfaGFzX2Zp
ZWxkXy5zZXQoMjUpOyByZXR1cm4gaW5jaWRlbnRfcmVwb3J0X2NvbmZpZ18uZ2V0KCk7IH0KKwor
ICBib29sIGhhc190cmFjZV91dWlkX21zYigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzI3
XTsgfQorICBpbnQ2NF90IHRyYWNlX3V1aWRfbXNiKCkgY29uc3QgeyByZXR1cm4gdHJhY2VfdXVp
ZF9tc2JfOyB9CisgIHZvaWQgc2V0X3RyYWNlX3V1aWRfbXNiKGludDY0X3QgdmFsdWUpIHsgdHJh
Y2VfdXVpZF9tc2JfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyNyk7IH0KKworICBib29sIGhh
c190cmFjZV91dWlkX2xzYigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzI4XTsgfQorICBp
bnQ2NF90IHRyYWNlX3V1aWRfbHNiKCkgY29uc3QgeyByZXR1cm4gdHJhY2VfdXVpZF9sc2JfOyB9
CisgIHZvaWQgc2V0X3RyYWNlX3V1aWRfbHNiKGludDY0X3QgdmFsdWUpIHsgdHJhY2VfdXVpZF9s
c2JfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyOCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6
dmVjdG9yPFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZz4gYnVmZmVyc187CisgIHN0ZDo6dmVjdG9y
PFRyYWNlQ29uZmlnX0RhdGFTb3VyY2U+IGRhdGFfc291cmNlc187CisgIDo6cHJvdG96ZXJvOjpD
b3B5YWJsZVB0cjxUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZT4gYnVpbHRpbl9kYXRhX3Nv
dXJjZXNfOworICB1aW50MzJfdCBkdXJhdGlvbl9tc197fTsKKyAgYm9vbCBlbmFibGVfZXh0cmFf
Z3VhcmRyYWlsc197fTsKKyAgVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uIGxvY2tk
b3duX21vZGVfe307CisgIHN0ZDo6dmVjdG9yPFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnPiBw
cm9kdWNlcnNfOworICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8VHJhY2VDb25maWdfU3RhdHNk
TWV0YWRhdGE+IHN0YXRzZF9tZXRhZGF0YV87CisgIGJvb2wgd3JpdGVfaW50b19maWxlX3t9Owor
ICBzdGQ6OnN0cmluZyBvdXRwdXRfcGF0aF97fTsKKyAgdWludDMyX3QgZmlsZV93cml0ZV9wZXJp
b2RfbXNfe307CisgIHVpbnQ2NF90IG1heF9maWxlX3NpemVfYnl0ZXNfe307CisgIDo6cHJvdG96
ZXJvOjpDb3B5YWJsZVB0cjxUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXM+IGd1YXJkcmFp
bF9vdmVycmlkZXNfOworICBib29sIGRlZmVycmVkX3N0YXJ0X3t9OworICB1aW50MzJfdCBmbHVz
aF9wZXJpb2RfbXNfe307CisgIHVpbnQzMl90IGZsdXNoX3RpbWVvdXRfbXNfe307CisgIHVpbnQz
Ml90IGRhdGFfc291cmNlX3N0b3BfdGltZW91dF9tc197fTsKKyAgYm9vbCBub3RpZnlfdHJhY2V1
cl97fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPFRyYWNlQ29uZmlnX1RyaWdnZXJDb25m
aWc+IHRyaWdnZXJfY29uZmlnXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFjdGl2YXRl
X3RyaWdnZXJzXzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPFRyYWNlQ29uZmlnX0luY3Jl
bWVudGFsU3RhdGVDb25maWc+IGluY3JlbWVudGFsX3N0YXRlX2NvbmZpZ187CisgIGJvb2wgYWxs
b3dfdXNlcl9idWlsZF90cmFjaW5nX3t9OworICBzdGQ6OnN0cmluZyB1bmlxdWVfc2Vzc2lvbl9u
YW1lX3t9OworICBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGUgY29tcHJlc3Npb25fdHlwZV97
fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0
Q29uZmlnPiBpbmNpZGVudF9yZXBvcnRfY29uZmlnXzsKKyAgaW50NjRfdCB0cmFjZV91dWlkX21z
Yl97fTsKKyAgaW50NjRfdCB0cmFjZV91dWlkX2xzYl97fTsKKworICAvLyBBbGxvd3MgdG8gcHJl
c2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0
aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3du
X2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8MzA+IF9oYXNfZmllbGRfe307Cit9OworCisKK2Ns
YXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZyA6IHB1
YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxk
TnVtYmVycyB7CisgICAga0Rlc3RpbmF0aW9uUGFja2FnZUZpZWxkTnVtYmVyID0gMSwKKyAgICBr
RGVzdGluYXRpb25DbGFzc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUHJpdmFjeUxldmVsRmllbGRO
dW1iZXIgPSAzLAorICAgIGtTa2lwRHJvcGJveEZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKworICBU
cmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZygpOworICB+VHJhY2VDb25maWdfSW5jaWRl
bnRSZXBvcnRDb25maWcoKSBvdmVycmlkZTsKKyAgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRD
b25maWcoVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWcmJikgbm9leGNlcHQ7CisgIFRy
YWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnJiBvcGVyYXRvcj0oVHJhY2VDb25maWdfSW5j
aWRlbnRSZXBvcnRDb25maWcmJik7CisgIFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmln
KGNvbnN0IFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnJik7CisgIFRyYWNlQ29uZmln
X0luY2lkZW50UmVwb3J0Q29uZmlnJiBvcGVyYXRvcj0oY29uc3QgVHJhY2VDb25maWdfSW5jaWRl
bnRSZXBvcnRDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRyYWNlQ29uZmlnX0lu
Y2lkZW50UmVwb3J0Q29uZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFj
ZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRo
aXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6
ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBv
dmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0
IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0
OworCisgIGJvb2wgaGFzX2Rlc3RpbmF0aW9uX3BhY2thZ2UoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgZGVzdGluYXRpb25fcGFja2FnZSgp
IGNvbnN0IHsgcmV0dXJuIGRlc3RpbmF0aW9uX3BhY2thZ2VfOyB9CisgIHZvaWQgc2V0X2Rlc3Rp
bmF0aW9uX3BhY2thZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IGRlc3RpbmF0aW9uX3Bh
Y2thZ2VfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2Rlc3Rp
bmF0aW9uX2NsYXNzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgY29uc3Qg
c3RkOjpzdHJpbmcmIGRlc3RpbmF0aW9uX2NsYXNzKCkgY29uc3QgeyByZXR1cm4gZGVzdGluYXRp
b25fY2xhc3NfOyB9CisgIHZvaWQgc2V0X2Rlc3RpbmF0aW9uX2NsYXNzKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeyBkZXN0aW5hdGlvbl9jbGFzc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0
KDIpOyB9CisKKyAgYm9vbCBoYXNfcHJpdmFjeV9sZXZlbCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzNdOyB9CisgIGludDMyX3QgcHJpdmFjeV9sZXZlbCgpIGNvbnN0IHsgcmV0dXJuIHBy
aXZhY3lfbGV2ZWxfOyB9CisgIHZvaWQgc2V0X3ByaXZhY3lfbGV2ZWwoaW50MzJfdCB2YWx1ZSkg
eyBwcml2YWN5X2xldmVsXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29s
IGhhc19za2lwX2Ryb3Bib3goKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICBi
b29sIHNraXBfZHJvcGJveCgpIGNvbnN0IHsgcmV0dXJuIHNraXBfZHJvcGJveF87IH0KKyAgdm9p
ZCBzZXRfc2tpcF9kcm9wYm94KGJvb2wgdmFsdWUpIHsgc2tpcF9kcm9wYm94XyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoNCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGRlc3RpbmF0
aW9uX3BhY2thZ2Vfe307CisgIHN0ZDo6c3RyaW5nIGRlc3RpbmF0aW9uX2NsYXNzX3t9OworICBp
bnQzMl90IHByaXZhY3lfbGV2ZWxfe307CisgIGJvb2wgc2tpcF9kcm9wYm94X3t9OworCisgIC8v
IEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJp
bGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6
c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw1PiBfaGFzX2ZpZWxkX3t9
OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2VDb25maWdfSW5jcmVtZW50YWxT
dGF0ZUNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGlj
OgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0NsZWFyUGVyaW9kTXNGaWVsZE51bWJlciA9
IDEsCisgIH07CisKKyAgVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZygpOworICB+
VHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZygpIG92ZXJyaWRlOworICBUcmFjZUNv
bmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnKFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVD
b25maWcmJikgbm9leGNlcHQ7CisgIFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcm
IG9wZXJhdG9yPShUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnJiYpOworICBUcmFj
ZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnKGNvbnN0IFRyYWNlQ29uZmlnX0luY3JlbWVu
dGFsU3RhdGVDb25maWcmKTsKKyAgVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyYg
b3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcmKTsKKyAg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcm
KSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNlQ29uZmlnX0luY3JlbWVudGFs
U3RhdGVDb25maWcmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQor
CisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7Cisg
IHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9p
ZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19j
bGVhcl9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50
MzJfdCBjbGVhcl9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBjbGVhcl9wZXJpb2RfbXNfOyB9
CisgIHZvaWQgc2V0X2NsZWFyX3BlcmlvZF9tcyh1aW50MzJfdCB2YWx1ZSkgeyBjbGVhcl9wZXJp
b2RfbXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgcHJpdmF0ZToKKyAgdWlu
dDMyX3QgY2xlYXJfcGVyaW9kX21zX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtu
b3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2
ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsK
KworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRU
T19FWFBPUlQgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6
Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICB1c2luZyBUcmlnZ2VyID0gVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZ19UcmlnZ2VyOworICB1c2luZyBUcmlnZ2VyTW9kZSA9IFRyYWNlQ29uZmln
X1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBVTlNQ
RUNJRklFRCA9IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVfVU5TUEVDSUZJ
RUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTVEFSVF9UUkFDSU5HID0gVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9TVEFSVF9UUkFDSU5HOworICBzdGF0aWMgY29uc3Rl
eHByIGF1dG8gU1RPUF9UUkFDSU5HID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2Vy
TW9kZV9TVE9QX1RSQUNJTkc7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUcmlnZ2VyTW9kZV9N
SU4gPSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlX1VOU1BFQ0lGSUVEOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gVHJpZ2dlck1vZGVfTUFYID0gVHJhY2VDb25maWdfVHJp
Z2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9TVE9QX1RSQUNJTkc7CisgIGVudW0gRmllbGROdW1iZXJz
IHsKKyAgICBrVHJpZ2dlck1vZGVGaWVsZE51bWJlciA9IDEsCisgICAga1RyaWdnZXJzRmllbGRO
dW1iZXIgPSAyLAorICAgIGtUcmlnZ2VyVGltZW91dE1zRmllbGROdW1iZXIgPSAzLAorICB9Owor
CisgIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcoKTsKKyAgflRyYWNlQ29uZmlnX1RyaWdnZXJD
b25maWcoKSBvdmVycmlkZTsKKyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyhUcmFjZUNvbmZp
Z19UcmlnZ2VyQ29uZmlnJiYpIG5vZXhjZXB0OworICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmln
JiBvcGVyYXRvcj0oVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyYmKTsKKyAgVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZyhjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnJik7CisgIFRyYWNl
Q29uZmlnX1RyaWdnZXJDb25maWcmIG9wZXJhdG9yPShjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2Vy
Q29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2Vy
Q29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBi
b29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6
OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rv
cjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2Vy
aWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfdHJpZ2dl
cl9tb2RlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZSB0cmlnZ2VyX21vZGUoKSBjb25zdCB7IHJldHVybiB0
cmlnZ2VyX21vZGVfOyB9CisgIHZvaWQgc2V0X3RyaWdnZXJfbW9kZShUcmFjZUNvbmZpZ19Ucmln
Z2VyQ29uZmlnX1RyaWdnZXJNb2RlIHZhbHVlKSB7IHRyaWdnZXJfbW9kZV8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDEpOyB9CisKKyAgaW50IHRyaWdnZXJzX3NpemUoKSBjb25zdCB7IHJldHVy
biBzdGF0aWNfY2FzdDxpbnQ+KHRyaWdnZXJzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVj
dG9yPFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlcj4mIHRyaWdnZXJzKCkgY29uc3Qg
eyByZXR1cm4gdHJpZ2dlcnNfOyB9CisgIHN0ZDo6dmVjdG9yPFRyYWNlQ29uZmlnX1RyaWdnZXJD
b25maWdfVHJpZ2dlcj4qIG11dGFibGVfdHJpZ2dlcnMoKSB7IHJldHVybiAmdHJpZ2dlcnNfOyB9
CisgIHZvaWQgY2xlYXJfdHJpZ2dlcnMoKSB7IHRyaWdnZXJzXy5jbGVhcigpOyB9CisgIFRyYWNl
Q29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlciogYWRkX3RyaWdnZXJzKCkgeyB0cmlnZ2Vyc18u
ZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmdHJpZ2dlcnNfLmJhY2soKTsgfQorCisgIGJvb2wgaGFz
X3RyaWdnZXJfdGltZW91dF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9Cisg
IHVpbnQzMl90IHRyaWdnZXJfdGltZW91dF9tcygpIGNvbnN0IHsgcmV0dXJuIHRyaWdnZXJfdGlt
ZW91dF9tc187IH0KKyAgdm9pZCBzZXRfdHJpZ2dlcl90aW1lb3V0X21zKHVpbnQzMl90IHZhbHVl
KSB7IHRyaWdnZXJfdGltZW91dF9tc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisK
KyBwcml2YXRlOgorICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlIHRyaWdn
ZXJfbW9kZV97fTsKKyAgc3RkOjp2ZWN0b3I8VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19Ucmln
Z2VyPiB0cmlnZ2Vyc187CisgIHVpbnQzMl90IHRyaWdnZXJfdGltZW91dF9tc197fTsKKworICAv
LyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGli
aWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6
OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8ND4gX2hhc19maWVsZF97
fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25m
aWdfVHJpZ2dlciA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGlj
OgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAg
a1Byb2R1Y2VyTmFtZVJlZ2V4RmllbGROdW1iZXIgPSAyLAorICAgIGtTdG9wRGVsYXlNc0ZpZWxk
TnVtYmVyID0gMywKKyAgfTsKKworICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXIo
KTsKKyAgflRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlcigpIG92ZXJyaWRlOworICBU
cmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXIoVHJhY2VDb25maWdfVHJpZ2dlckNvbmZp
Z19UcmlnZ2VyJiYpIG5vZXhjZXB0OworICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdn
ZXImIG9wZXJhdG9yPShUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXImJik7CisgIFRy
YWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlcihjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2Vy
Q29uZmlnX1RyaWdnZXImKTsKKyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyJiBv
cGVyYXRvcj0oY29uc3QgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyJik7CisgIGJv
b2wgb3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXImKSBj
b25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdf
VHJpZ2dlciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAg
Ym9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3Rk
OjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0
b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX25hbWUo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYg
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQor
CisgIGJvb2wgaGFzX3Byb2R1Y2VyX25hbWVfcmVnZXgoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1syXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvZHVjZXJfbmFtZV9yZWdleCgpIGNv
bnN0IHsgcmV0dXJuIHByb2R1Y2VyX25hbWVfcmVnZXhfOyB9CisgIHZvaWQgc2V0X3Byb2R1Y2Vy
X25hbWVfcmVnZXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IHByb2R1Y2VyX25hbWVfcmVn
ZXhfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX3N0b3BfZGVs
YXlfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICB1aW50MzJfdCBzdG9w
X2RlbGF5X21zKCkgY29uc3QgeyByZXR1cm4gc3RvcF9kZWxheV9tc187IH0KKyAgdm9pZCBzZXRf
c3RvcF9kZWxheV9tcyh1aW50MzJfdCB2YWx1ZSkgeyBzdG9wX2RlbGF5X21zXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfe307
CisgIHN0ZDo6c3RyaW5nIHByb2R1Y2VyX25hbWVfcmVnZXhfe307CisgIHVpbnQzMl90IHN0b3Bf
ZGVsYXlfbXNfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYg
ZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5w
cm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0
c2V0PDQ+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFj
ZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3Nh
Z2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtNYXhVcGxvYWRQ
ZXJEYXlCeXRlc0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBUcmFjZUNvbmZpZ19HdWFyZHJh
aWxPdmVycmlkZXMoKTsKKyAgflRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcygpIG92ZXJy
aWRlOworICBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMoVHJhY2VDb25maWdfR3VhcmRy
YWlsT3ZlcnJpZGVzJiYpIG5vZXhjZXB0OworICBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlk
ZXMmIG9wZXJhdG9yPShUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMmJik7CisgIFRyYWNl
Q29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyhjb25zdCBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVy
cmlkZXMmKTsKKyAgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzJiBvcGVyYXRvcj0oY29u
c3QgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzJik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMmKSBjb25zdDsKKyAgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX21heF91cGxvYWRfcGVyX2RheV9ieXRlcygp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQ2NF90IG1heF91cGxvYWRf
cGVyX2RheV9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIG1heF91cGxvYWRfcGVyX2RheV9ieXRlc187
IH0KKyAgdm9pZCBzZXRfbWF4X3VwbG9hZF9wZXJfZGF5X2J5dGVzKHVpbnQ2NF90IHZhbHVlKSB7
IG1heF91cGxvYWRfcGVyX2RheV9ieXRlc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9
CisKKyBwcml2YXRlOgorICB1aW50NjRfdCBtYXhfdXBsb2FkX3Blcl9kYXlfYnl0ZXNfe307CisK
KyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21w
YXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAg
c3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmll
bGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFjZUNvbmZpZ19TdGF0c2RN
ZXRhZGF0YSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgor
ICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1RyaWdnZXJpbmdBbGVydElkRmllbGROdW1iZXIg
PSAxLAorICAgIGtUcmlnZ2VyaW5nQ29uZmlnVWlkRmllbGROdW1iZXIgPSAyLAorICAgIGtUcmln
Z2VyaW5nQ29uZmlnSWRGaWVsZE51bWJlciA9IDMsCisgICAga1RyaWdnZXJpbmdTdWJzY3JpcHRp
b25JZEZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKworICBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0
YSgpOworICB+VHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGEoKSBvdmVycmlkZTsKKyAgVHJhY2VD
b25maWdfU3RhdHNkTWV0YWRhdGEoVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGEmJikgbm9leGNl
cHQ7CisgIFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhJiBvcGVyYXRvcj0oVHJhY2VDb25maWdf
U3RhdHNkTWV0YWRhdGEmJik7CisgIFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhKGNvbnN0IFRy
YWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhJik7CisgIFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRh
JiBvcGVyYXRvcj0oY29uc3QgVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGEmKTsKKyAgYm9vbCBv
cGVyYXRvcj09KGNvbnN0IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhJikgY29uc3Q7CisgIGJv
b2wgb3BlcmF0b3IhPShjb25zdCBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSYgb3RoZXIpIGNv
bnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJh
eShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFs
aXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVy
bzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3RyaWdnZXJpbmdfYWxlcnRfaWQoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQ2NF90IHRyaWdnZXJpbmdfYWxl
cnRfaWQoKSBjb25zdCB7IHJldHVybiB0cmlnZ2VyaW5nX2FsZXJ0X2lkXzsgfQorICB2b2lkIHNl
dF90cmlnZ2VyaW5nX2FsZXJ0X2lkKGludDY0X3QgdmFsdWUpIHsgdHJpZ2dlcmluZ19hbGVydF9p
ZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfdHJpZ2dlcmlu
Z19jb25maWdfdWlkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgaW50MzJf
dCB0cmlnZ2VyaW5nX2NvbmZpZ191aWQoKSBjb25zdCB7IHJldHVybiB0cmlnZ2VyaW5nX2NvbmZp
Z191aWRfOyB9CisgIHZvaWQgc2V0X3RyaWdnZXJpbmdfY29uZmlnX3VpZChpbnQzMl90IHZhbHVl
KSB7IHRyaWdnZXJpbmdfY29uZmlnX3VpZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9
CisKKyAgYm9vbCBoYXNfdHJpZ2dlcmluZ19jb25maWdfaWQoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1szXTsgfQorICBpbnQ2NF90IHRyaWdnZXJpbmdfY29uZmlnX2lkKCkgY29uc3QgeyBy
ZXR1cm4gdHJpZ2dlcmluZ19jb25maWdfaWRfOyB9CisgIHZvaWQgc2V0X3RyaWdnZXJpbmdfY29u
ZmlnX2lkKGludDY0X3QgdmFsdWUpIHsgdHJpZ2dlcmluZ19jb25maWdfaWRfID0gdmFsdWU7IF9o
YXNfZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX3RyaWdnZXJpbmdfc3Vic2NyaXB0aW9u
X2lkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAgaW50NjRfdCB0cmlnZ2Vy
aW5nX3N1YnNjcmlwdGlvbl9pZCgpIGNvbnN0IHsgcmV0dXJuIHRyaWdnZXJpbmdfc3Vic2NyaXB0
aW9uX2lkXzsgfQorICB2b2lkIHNldF90cmlnZ2VyaW5nX3N1YnNjcmlwdGlvbl9pZChpbnQ2NF90
IHZhbHVlKSB7IHRyaWdnZXJpbmdfc3Vic2NyaXB0aW9uX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoNCk7IH0KKworIHByaXZhdGU6CisgIGludDY0X3QgdHJpZ2dlcmluZ19hbGVydF9pZF97
fTsKKyAgaW50MzJfdCB0cmlnZ2VyaW5nX2NvbmZpZ191aWRfe307CisgIGludDY0X3QgdHJpZ2dl
cmluZ19jb25maWdfaWRfe307CisgIGludDY0X3QgdHJpZ2dlcmluZ19zdWJzY3JpcHRpb25faWRf
e307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZv
ciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxl
cy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDU+IF9o
YXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFjZUNvbmZpZ19Q
cm9kdWNlckNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVi
bGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1Byb2R1Y2VyTmFtZUZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrU2htU2l6ZUtiRmllbGROdW1iZXIgPSAyLAorICAgIGtQYWdlU2l6ZUtiRmll
bGROdW1iZXIgPSAzLAorICB9OworCisgIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnKCk7Cisg
IH5UcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZygpIG92ZXJyaWRlOworICBUcmFjZUNvbmZpZ19Q
cm9kdWNlckNvbmZpZyhUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZyYmKSBub2V4Y2VwdDsKKyAg
VHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcmIG9wZXJhdG9yPShUcmFjZUNvbmZpZ19Qcm9kdWNl
ckNvbmZpZyYmKTsKKyAgVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcoY29uc3QgVHJhY2VDb25m
aWdfUHJvZHVjZXJDb25maWcmKTsKKyAgVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcmIG9wZXJh
dG9yPShjb25zdCBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZyYpOworICBib29sIG9wZXJhdG9y
PT0oY29uc3QgVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnJiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmlu
ZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNz
YWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfcHJvZHVjZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzFdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9kdWNlcl9uYW1lKCkg
Y29uc3QgeyByZXR1cm4gcHJvZHVjZXJfbmFtZV87IH0KKyAgdm9pZCBzZXRfcHJvZHVjZXJfbmFt
ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgcHJvZHVjZXJfbmFtZV8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfc2htX3NpemVfa2IoKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICB1aW50MzJfdCBzaG1fc2l6ZV9rYigpIGNvbnN0IHsg
cmV0dXJuIHNobV9zaXplX2tiXzsgfQorICB2b2lkIHNldF9zaG1fc2l6ZV9rYih1aW50MzJfdCB2
YWx1ZSkgeyBzaG1fc2l6ZV9rYl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAg
Ym9vbCBoYXNfcGFnZV9zaXplX2tiKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0K
KyAgdWludDMyX3QgcGFnZV9zaXplX2tiKCkgY29uc3QgeyByZXR1cm4gcGFnZV9zaXplX2tiXzsg
fQorICB2b2lkIHNldF9wYWdlX3NpemVfa2IodWludDMyX3QgdmFsdWUpIHsgcGFnZV9zaXplX2ti
XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3Ry
aW5nIHByb2R1Y2VyX25hbWVfe307CisgIHVpbnQzMl90IHNobV9zaXplX2tiX3t9OworICB1aW50
MzJfdCBwYWdlX3NpemVfa2Jfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24g
cHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNp
b25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisg
IHN0ZDo6Yml0c2V0PDQ+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VY
UE9SVCBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSA6IHB1YmxpYyA6OnByb3RvemVybzo6
Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0Rp
c2FibGVDbG9ja1NuYXBzaG90dGluZ0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrRGlzYWJsZVRyYWNl
Q29uZmlnRmllbGROdW1iZXIgPSAyLAorICAgIGtEaXNhYmxlU3lzdGVtSW5mb0ZpZWxkTnVtYmVy
ID0gMywKKyAgICBrRGlzYWJsZVNlcnZpY2VFdmVudHNGaWVsZE51bWJlciA9IDQsCisgICAga1By
aW1hcnlUcmFjZUNsb2NrRmllbGROdW1iZXIgPSA1LAorICAgIGtTbmFwc2hvdEludGVydmFsTXNG
aWVsZE51bWJlciA9IDYsCisgIH07CisKKyAgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2Uo
KTsKKyAgflRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlKCkgb3ZlcnJpZGU7CisgIFRyYWNl
Q29uZmlnX0J1aWx0aW5EYXRhU291cmNlKFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlJiYp
IG5vZXhjZXB0OworICBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSYgb3BlcmF0b3I9KFRy
YWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlJiYpOworICBUcmFjZUNvbmZpZ19CdWlsdGluRGF0
YVNvdXJjZShjb25zdCBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSYpOworICBUcmFjZUNv
bmZpZ19CdWlsdGluRGF0YVNvdXJjZSYgb3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnX0J1aWx0
aW5EYXRhU291cmNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19CdWls
dGluRGF0YVNvdXJjZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2VDb25m
aWdfQnVpbHRpbkRhdGFTb3VyY2UmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90
aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3Zl
cnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7
CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlk
ZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBi
b29sIGhhc19kaXNhYmxlX2Nsb2NrX3NuYXBzaG90dGluZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzFdOyB9CisgIGJvb2wgZGlzYWJsZV9jbG9ja19zbmFwc2hvdHRpbmcoKSBjb25zdCB7
IHJldHVybiBkaXNhYmxlX2Nsb2NrX3NuYXBzaG90dGluZ187IH0KKyAgdm9pZCBzZXRfZGlzYWJs
ZV9jbG9ja19zbmFwc2hvdHRpbmcoYm9vbCB2YWx1ZSkgeyBkaXNhYmxlX2Nsb2NrX3NuYXBzaG90
dGluZ18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfZGlzYWJs
ZV90cmFjZV9jb25maWcoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBib29s
IGRpc2FibGVfdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gZGlzYWJsZV90cmFjZV9jb25m
aWdfOyB9CisgIHZvaWQgc2V0X2Rpc2FibGVfdHJhY2VfY29uZmlnKGJvb2wgdmFsdWUpIHsgZGlz
YWJsZV90cmFjZV9jb25maWdfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJv
b2wgaGFzX2Rpc2FibGVfc3lzdGVtX2luZm8oKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sz
XTsgfQorICBib29sIGRpc2FibGVfc3lzdGVtX2luZm8oKSBjb25zdCB7IHJldHVybiBkaXNhYmxl
X3N5c3RlbV9pbmZvXzsgfQorICB2b2lkIHNldF9kaXNhYmxlX3N5c3RlbV9pbmZvKGJvb2wgdmFs
dWUpIHsgZGlzYWJsZV9zeXN0ZW1faW5mb18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9
CisKKyAgYm9vbCBoYXNfZGlzYWJsZV9zZXJ2aWNlX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzRdOyB9CisgIGJvb2wgZGlzYWJsZV9zZXJ2aWNlX2V2ZW50cygpIGNvbnN0IHsg
cmV0dXJuIGRpc2FibGVfc2VydmljZV9ldmVudHNfOyB9CisgIHZvaWQgc2V0X2Rpc2FibGVfc2Vy
dmljZV9ldmVudHMoYm9vbCB2YWx1ZSkgeyBkaXNhYmxlX3NlcnZpY2VfZXZlbnRzXyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoNCk7IH0KKworICBib29sIGhhc19wcmltYXJ5X3RyYWNlX2Nsb2Nr
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07IH0KKyAgQnVpbHRpbkNsb2NrIHByaW1h
cnlfdHJhY2VfY2xvY2soKSBjb25zdCB7IHJldHVybiBwcmltYXJ5X3RyYWNlX2Nsb2NrXzsgfQor
ICB2b2lkIHNldF9wcmltYXJ5X3RyYWNlX2Nsb2NrKEJ1aWx0aW5DbG9jayB2YWx1ZSkgeyBwcmlt
YXJ5X3RyYWNlX2Nsb2NrXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworICBib29s
IGhhc19zbmFwc2hvdF9pbnRlcnZhbF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzZd
OyB9CisgIHVpbnQzMl90IHNuYXBzaG90X2ludGVydmFsX21zKCkgY29uc3QgeyByZXR1cm4gc25h
cHNob3RfaW50ZXJ2YWxfbXNfOyB9CisgIHZvaWQgc2V0X3NuYXBzaG90X2ludGVydmFsX21zKHVp
bnQzMl90IHZhbHVlKSB7IHNuYXBzaG90X2ludGVydmFsX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoNik7IH0KKworIHByaXZhdGU6CisgIGJvb2wgZGlzYWJsZV9jbG9ja19zbmFwc2hvdHRp
bmdfe307CisgIGJvb2wgZGlzYWJsZV90cmFjZV9jb25maWdfe307CisgIGJvb2wgZGlzYWJsZV9z
eXN0ZW1faW5mb197fTsKKyAgYm9vbCBkaXNhYmxlX3NlcnZpY2VfZXZlbnRzX3t9OworICBCdWls
dGluQ2xvY2sgcHJpbWFyeV90cmFjZV9jbG9ja197fTsKKyAgdWludDMyX3Qgc25hcHNob3RfaW50
ZXJ2YWxfbXNfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYg
ZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5w
cm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0
c2V0PDc+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFj
ZUNvbmZpZ19EYXRhU291cmNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsK
KyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrQ29uZmlnRmllbGROdW1iZXIg
PSAxLAorICAgIGtQcm9kdWNlck5hbWVGaWx0ZXJGaWVsZE51bWJlciA9IDIsCisgICAga1Byb2R1
Y2VyTmFtZVJlZ2V4RmlsdGVyRmllbGROdW1iZXIgPSAzLAorICB9OworCisgIFRyYWNlQ29uZmln
X0RhdGFTb3VyY2UoKTsKKyAgflRyYWNlQ29uZmlnX0RhdGFTb3VyY2UoKSBvdmVycmlkZTsKKyAg
VHJhY2VDb25maWdfRGF0YVNvdXJjZShUcmFjZUNvbmZpZ19EYXRhU291cmNlJiYpIG5vZXhjZXB0
OworICBUcmFjZUNvbmZpZ19EYXRhU291cmNlJiBvcGVyYXRvcj0oVHJhY2VDb25maWdfRGF0YVNv
dXJjZSYmKTsKKyAgVHJhY2VDb25maWdfRGF0YVNvdXJjZShjb25zdCBUcmFjZUNvbmZpZ19EYXRh
U291cmNlJik7CisgIFRyYWNlQ29uZmlnX0RhdGFTb3VyY2UmIG9wZXJhdG9yPShjb25zdCBUcmFj
ZUNvbmZpZ19EYXRhU291cmNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZp
Z19EYXRhU291cmNlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFjZUNvbmZp
Z19EYXRhU291cmNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0K
KworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOwor
ICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6
OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZv
aWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNf
Y29uZmlnKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3QgRGF0YVNv
dXJjZUNvbmZpZyYgY29uZmlnKCkgY29uc3QgeyByZXR1cm4gKmNvbmZpZ187IH0KKyAgRGF0YVNv
dXJjZUNvbmZpZyogbXV0YWJsZV9jb25maWcoKSB7IF9oYXNfZmllbGRfLnNldCgxKTsgcmV0dXJu
IGNvbmZpZ18uZ2V0KCk7IH0KKworICBpbnQgcHJvZHVjZXJfbmFtZV9maWx0ZXJfc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocHJvZHVjZXJfbmFtZV9maWx0ZXJfLnNpemUo
KSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwcm9kdWNlcl9uYW1lX2Zp
bHRlcigpIGNvbnN0IHsgcmV0dXJuIHByb2R1Y2VyX25hbWVfZmlsdGVyXzsgfQorICBzdGQ6OnZl
Y3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfcHJvZHVjZXJfbmFtZV9maWx0ZXIoKSB7IHJldHVy
biAmcHJvZHVjZXJfbmFtZV9maWx0ZXJfOyB9CisgIHZvaWQgY2xlYXJfcHJvZHVjZXJfbmFtZV9m
aWx0ZXIoKSB7IHByb2R1Y2VyX25hbWVfZmlsdGVyXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX3By
b2R1Y2VyX25hbWVfZmlsdGVyKHN0ZDo6c3RyaW5nIHZhbHVlKSB7IHByb2R1Y2VyX25hbWVfZmls
dGVyXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRfcHJvZHVjZXJf
bmFtZV9maWx0ZXIoKSB7IHByb2R1Y2VyX25hbWVfZmlsdGVyXy5lbXBsYWNlX2JhY2soKTsgcmV0
dXJuICZwcm9kdWNlcl9uYW1lX2ZpbHRlcl8uYmFjaygpOyB9CisKKyAgaW50IHByb2R1Y2VyX25h
bWVfcmVnZXhfZmlsdGVyX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHBy
b2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9y
PHN0ZDo6c3RyaW5nPiYgcHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXIoKSBjb25zdCB7IHJldHVy
biBwcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl87IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJp
bmc+KiBtdXRhYmxlX3Byb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyKCkgeyByZXR1cm4gJnByb2R1
Y2VyX25hbWVfcmVnZXhfZmlsdGVyXzsgfQorICB2b2lkIGNsZWFyX3Byb2R1Y2VyX25hbWVfcmVn
ZXhfZmlsdGVyKCkgeyBwcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl8uY2xlYXIoKTsgfQorICB2
b2lkIGFkZF9wcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcihzdGQ6OnN0cmluZyB2YWx1ZSkgeyBw
cm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl8uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBzdGQ6
OnN0cmluZyogYWRkX3Byb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyKCkgeyBwcm9kdWNlcl9uYW1l
X3JlZ2V4X2ZpbHRlcl8uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmcHJvZHVjZXJfbmFtZV9yZWdl
eF9maWx0ZXJfLmJhY2soKTsgfQorCisgcHJpdmF0ZToKKyAgOjpwcm90b3plcm86OkNvcHlhYmxl
UHRyPERhdGFTb3VyY2VDb25maWc+IGNvbmZpZ187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5n
PiBwcm9kdWNlcl9uYW1lX2ZpbHRlcl87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwcm9k
dWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl87CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25v
d24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZl
cnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOwor
CisgIHN0ZDo6Yml0c2V0PDQ+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRP
X0VYUE9SVCBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNw
cE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgRmlsbFBvbGljeSA9IFRyYWNlQ29uZmln
X0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVU5TUEVD
SUZJRUQgPSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9VTlNQRUNJRklFRDsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFJJTkdfQlVGRkVSID0gVHJhY2VDb25maWdfQnVmZmVy
Q29uZmlnX0ZpbGxQb2xpY3lfUklOR19CVUZGRVI7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBE
SVNDQVJEID0gVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQb2xpY3lfRElTQ0FSRDsKKyAg
c3RhdGljIGNvbnN0ZXhwciBhdXRvIEZpbGxQb2xpY3lfTUlOID0gVHJhY2VDb25maWdfQnVmZmVy
Q29uZmlnX0ZpbGxQb2xpY3lfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBG
aWxsUG9saWN5X01BWCA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5X0RJU0NB
UkQ7CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrU2l6ZUtiRmllbGROdW1iZXIgPSAxLAor
ICAgIGtGaWxsUG9saWN5RmllbGROdW1iZXIgPSA0LAorICB9OworCisgIFRyYWNlQ29uZmlnX0J1
ZmZlckNvbmZpZygpOworICB+VHJhY2VDb25maWdfQnVmZmVyQ29uZmlnKCkgb3ZlcnJpZGU7Cisg
IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyhUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcmJikgbm9l
eGNlcHQ7CisgIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyYgb3BlcmF0b3I9KFRyYWNlQ29uZmln
X0J1ZmZlckNvbmZpZyYmKTsKKyAgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnKGNvbnN0IFRyYWNl
Q29uZmlnX0J1ZmZlckNvbmZpZyYpOworICBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcmIG9wZXJh
dG9yPShjb25zdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcmKTsKKyAgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9y
IT0oY29uc3QgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
LCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikg
Y29uc3Q7CisKKyAgYm9vbCBoYXNfc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRf
WzFdOyB9CisgIHVpbnQzMl90IHNpemVfa2IoKSBjb25zdCB7IHJldHVybiBzaXplX2tiXzsgfQor
ICB2b2lkIHNldF9zaXplX2tiKHVpbnQzMl90IHZhbHVlKSB7IHNpemVfa2JfID0gdmFsdWU7IF9o
YXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2ZpbGxfcG9saWN5KCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQ
b2xpY3kgZmlsbF9wb2xpY3koKSBjb25zdCB7IHJldHVybiBmaWxsX3BvbGljeV87IH0KKyAgdm9p
ZCBzZXRfZmlsbF9wb2xpY3koVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQb2xpY3kgdmFs
dWUpIHsgZmlsbF9wb2xpY3lfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgcHJp
dmF0ZToKKyAgdWludDMyX3Qgc2l6ZV9rYl97fTsKKyAgVHJhY2VDb25maWdfQnVmZmVyQ29uZmln
X0ZpbGxQb2xpY3kgZmlsbF9wb2xpY3lfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVu
a25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJl
IHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNf
OworCisgIHN0ZDo6Yml0c2V0PDU+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3Bh
Y2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4K
KworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19UUkFD
RV9DT05GSUdfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVs
ZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBE
TyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJh
Z21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAi
LVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBy
b3Rvcy9wZXJmZXR0by9jb25maWcvdHJhY2VfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9idWlsdGluX2Ns
b2NrLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9z
L3BlcmZldHRvL2NvbmZpZy9kYXRhX3NvdXJjZV9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL3RyYWNrX2V2
ZW50L3RyYWNrX2V2ZW50X2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvdGVzdF9jb25maWcuZ2VuLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29u
ZmlnL3N5c19zdGF0cy9zeXNfc3RhdHNfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9zeXNfc3RhdHNfY291
bnRlcnMuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90
b3MvcGVyZmV0dG8vY29uZmlnL3Byb2ZpbGluZy9wZXJmX2V2ZW50X2NvbmZpZy5nZW4uaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25m
aWcvcHJvZmlsaW5nL2phdmFfaHByb2ZfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9wcm9maWxpbmcvaGVh
cHByb2ZkX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvY2Vzc19zdGF0cy9wcm9jZXNzX3N0YXRzX2Nv
bmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rv
cy9wZXJmZXR0by9jb25maWcvcG93ZXIvYW5kcm9pZF9wb3dlcl9jb25maWcuZ2VuLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmln
L2lub2RlX2ZpbGUvaW5vZGVfZmlsZV9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2dwdS92dWxrYW5fbWVt
b3J5X2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InByb3Rvcy9wZXJmZXR0by9jb25maWcvZ3B1L2dwdV9jb3VudGVyX2NvbmZpZy5nZW4uaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25m
aWcvZnRyYWNlL2Z0cmFjZV9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2Nocm9tZS9jaHJvbWVfY29uZmln
Lmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3Bl
cmZldHRvL2NvbmZpZy9hbmRyb2lkL3BhY2thZ2VzX2xpc3RfY29uZmlnLmdlbi5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9h
bmRyb2lkL2FuZHJvaWRfcG9sbGVkX3N0YXRlX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvYW5kcm9pZC9h
bmRyb2lkX2xvZ19jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2FuZHJvaWRfbG9nX2NvbnN0YW50cy5nZW4u
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNl
IGdlbiB7CisKK1RyYWNlQ29uZmlnOjpUcmFjZUNvbmZpZygpID0gZGVmYXVsdDsKK1RyYWNlQ29u
ZmlnOjp+VHJhY2VDb25maWcoKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZzo6VHJhY2VDb25maWco
Y29uc3QgVHJhY2VDb25maWcmKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZyYgVHJhY2VDb25maWc6
Om9wZXJhdG9yPShjb25zdCBUcmFjZUNvbmZpZyYpID0gZGVmYXVsdDsKK1RyYWNlQ29uZmlnOjpU
cmFjZUNvbmZpZyhUcmFjZUNvbmZpZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitUcmFjZUNvbmZp
ZyYgVHJhY2VDb25maWc6Om9wZXJhdG9yPShUcmFjZUNvbmZpZyYmKSA9IGRlZmF1bHQ7CisKK2Jv
b2wgVHJhY2VDb25maWc6Om9wZXJhdG9yPT0oY29uc3QgVHJhY2VDb25maWcmIG90aGVyKSBjb25z
dCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisg
ICAmJiBidWZmZXJzXyA9PSBvdGhlci5idWZmZXJzXworICAgJiYgZGF0YV9zb3VyY2VzXyA9PSBv
dGhlci5kYXRhX3NvdXJjZXNfCisgICAmJiBidWlsdGluX2RhdGFfc291cmNlc18gPT0gb3RoZXIu
YnVpbHRpbl9kYXRhX3NvdXJjZXNfCisgICAmJiBkdXJhdGlvbl9tc18gPT0gb3RoZXIuZHVyYXRp
b25fbXNfCisgICAmJiBlbmFibGVfZXh0cmFfZ3VhcmRyYWlsc18gPT0gb3RoZXIuZW5hYmxlX2V4
dHJhX2d1YXJkcmFpbHNfCisgICAmJiBsb2NrZG93bl9tb2RlXyA9PSBvdGhlci5sb2NrZG93bl9t
b2RlXworICAgJiYgcHJvZHVjZXJzXyA9PSBvdGhlci5wcm9kdWNlcnNfCisgICAmJiBzdGF0c2Rf
bWV0YWRhdGFfID09IG90aGVyLnN0YXRzZF9tZXRhZGF0YV8KKyAgICYmIHdyaXRlX2ludG9fZmls
ZV8gPT0gb3RoZXIud3JpdGVfaW50b19maWxlXworICAgJiYgb3V0cHV0X3BhdGhfID09IG90aGVy
Lm91dHB1dF9wYXRoXworICAgJiYgZmlsZV93cml0ZV9wZXJpb2RfbXNfID09IG90aGVyLmZpbGVf
d3JpdGVfcGVyaW9kX21zXworICAgJiYgbWF4X2ZpbGVfc2l6ZV9ieXRlc18gPT0gb3RoZXIubWF4
X2ZpbGVfc2l6ZV9ieXRlc18KKyAgICYmIGd1YXJkcmFpbF9vdmVycmlkZXNfID09IG90aGVyLmd1
YXJkcmFpbF9vdmVycmlkZXNfCisgICAmJiBkZWZlcnJlZF9zdGFydF8gPT0gb3RoZXIuZGVmZXJy
ZWRfc3RhcnRfCisgICAmJiBmbHVzaF9wZXJpb2RfbXNfID09IG90aGVyLmZsdXNoX3BlcmlvZF9t
c18KKyAgICYmIGZsdXNoX3RpbWVvdXRfbXNfID09IG90aGVyLmZsdXNoX3RpbWVvdXRfbXNfCisg
ICAmJiBkYXRhX3NvdXJjZV9zdG9wX3RpbWVvdXRfbXNfID09IG90aGVyLmRhdGFfc291cmNlX3N0
b3BfdGltZW91dF9tc18KKyAgICYmIG5vdGlmeV90cmFjZXVyXyA9PSBvdGhlci5ub3RpZnlfdHJh
Y2V1cl8KKyAgICYmIHRyaWdnZXJfY29uZmlnXyA9PSBvdGhlci50cmlnZ2VyX2NvbmZpZ18KKyAg
ICYmIGFjdGl2YXRlX3RyaWdnZXJzXyA9PSBvdGhlci5hY3RpdmF0ZV90cmlnZ2Vyc18KKyAgICYm
IGluY3JlbWVudGFsX3N0YXRlX2NvbmZpZ18gPT0gb3RoZXIuaW5jcmVtZW50YWxfc3RhdGVfY29u
ZmlnXworICAgJiYgYWxsb3dfdXNlcl9idWlsZF90cmFjaW5nXyA9PSBvdGhlci5hbGxvd191c2Vy
X2J1aWxkX3RyYWNpbmdfCisgICAmJiB1bmlxdWVfc2Vzc2lvbl9uYW1lXyA9PSBvdGhlci51bmlx
dWVfc2Vzc2lvbl9uYW1lXworICAgJiYgY29tcHJlc3Npb25fdHlwZV8gPT0gb3RoZXIuY29tcHJl
c3Npb25fdHlwZV8KKyAgICYmIGluY2lkZW50X3JlcG9ydF9jb25maWdfID09IG90aGVyLmluY2lk
ZW50X3JlcG9ydF9jb25maWdfCisgICAmJiB0cmFjZV91dWlkX21zYl8gPT0gb3RoZXIudHJhY2Vf
dXVpZF9tc2JfCisgICAmJiB0cmFjZV91dWlkX2xzYl8gPT0gb3RoZXIudHJhY2VfdXVpZF9sc2Jf
OworfQorCitib29sIFRyYWNlQ29uZmlnOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcs
IHNpemVfdCBzaXplKSB7CisgIGJ1ZmZlcnNfLmNsZWFyKCk7CisgIGRhdGFfc291cmNlc18uY2xl
YXIoKTsKKyAgcHJvZHVjZXJzXy5jbGVhcigpOworICBhY3RpdmF0ZV90cmlnZ2Vyc18uY2xlYXIo
KTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFs
c2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9y
IChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRl
Yy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgp
KSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRj
aCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGJ1ZmZlcnMgKi86CisgICAgICAgIGJ1
ZmZlcnNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBidWZmZXJzXy5iYWNrKCkuUGFyc2VGcm9t
U3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAyIC8qIGRhdGFfc291cmNlcyAqLzoKKyAgICAgICAgZGF0YV9zb3VyY2VzXy5lbXBsYWNlX2Jh
Y2soKTsKKyAgICAgICAgZGF0YV9zb3VyY2VzXy5iYWNrKCkuUGFyc2VGcm9tU3RyaW5nKGZpZWxk
LmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMCAvKiBidWls
dGluX2RhdGFfc291cmNlcyAqLzoKKyAgICAgICAgKCpidWlsdGluX2RhdGFfc291cmNlc18pLlBh
cnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgMyAvKiBkdXJhdGlvbl9tcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkdXJhdGlv
bl9tc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBlbmFibGVfZXh0cmFfZ3Vh
cmRyYWlscyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZlbmFibGVfZXh0cmFfZ3VhcmRyYWlsc18p
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBsb2NrZG93bl9tb2RlICovOgorICAg
ICAgICBmaWVsZC5nZXQoJmxvY2tkb3duX21vZGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDYgLyogcHJvZHVjZXJzICovOgorICAgICAgICBwcm9kdWNlcnNfLmVtcGxhY2VfYmFjaygp
OworICAgICAgICBwcm9kdWNlcnNfLmJhY2soKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3Rk
X3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDcgLyogc3RhdHNkX21ldGFk
YXRhICovOgorICAgICAgICAoKnN0YXRzZF9tZXRhZGF0YV8pLlBhcnNlRnJvbVN0cmluZyhmaWVs
ZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOCAvKiB3cml0
ZV9pbnRvX2ZpbGUgKi86CisgICAgICAgIGZpZWxkLmdldCgmd3JpdGVfaW50b19maWxlXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOSAvKiBvdXRwdXRfcGF0aCAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZvdXRwdXRfcGF0aF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOSAv
KiBmaWxlX3dyaXRlX3BlcmlvZF9tcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZmaWxlX3dyaXRl
X3BlcmlvZF9tc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAgLyogbWF4X2ZpbGVf
c2l6ZV9ieXRlcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZtYXhfZmlsZV9zaXplX2J5dGVzXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMSAvKiBndWFyZHJhaWxfb3ZlcnJpZGVzICov
OgorICAgICAgICAoKmd1YXJkcmFpbF9vdmVycmlkZXNfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQu
YXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyIC8qIGRlZmVy
cmVkX3N0YXJ0ICovOgorICAgICAgICBmaWVsZC5nZXQoJmRlZmVycmVkX3N0YXJ0Xyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSAxMyAvKiBmbHVzaF9wZXJpb2RfbXMgKi86CisgICAgICAg
IGZpZWxkLmdldCgmZmx1c2hfcGVyaW9kX21zXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAxNCAvKiBmbHVzaF90aW1lb3V0X21zICovOgorICAgICAgICBmaWVsZC5nZXQoJmZsdXNoX3Rp
bWVvdXRfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIzIC8qIGRhdGFfc291cmNl
X3N0b3BfdGltZW91dF9tcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkYXRhX3NvdXJjZV9zdG9w
X3RpbWVvdXRfbXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE2IC8qIG5vdGlmeV90
cmFjZXVyICovOgorICAgICAgICBmaWVsZC5nZXQoJm5vdGlmeV90cmFjZXVyXyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAxNyAvKiB0cmlnZ2VyX2NvbmZpZyAqLzoKKyAgICAgICAgKCp0
cmlnZ2VyX2NvbmZpZ18pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTggLyogYWN0aXZhdGVfdHJpZ2dlcnMgKi86Cisg
ICAgICAgIGFjdGl2YXRlX3RyaWdnZXJzXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgZmllbGQu
Z2V0KCZhY3RpdmF0ZV90cmlnZ2Vyc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDIxIC8qIGluY3JlbWVudGFsX3N0YXRlX2NvbmZpZyAqLzoKKyAgICAgICAgKCppbmNyZW1l
bnRhbF9zdGF0ZV9jb25maWdfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE5IC8qIGFsbG93X3VzZXJfYnVpbGRfdHJh
Y2luZyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZhbGxvd191c2VyX2J1aWxkX3RyYWNpbmdfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIyIC8qIHVuaXF1ZV9zZXNzaW9uX25hbWUgKi86
CisgICAgICAgIGZpZWxkLmdldCgmdW5pcXVlX3Nlc3Npb25fbmFtZV8pOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgMjQgLyogY29tcHJlc3Npb25fdHlwZSAqLzoKKyAgICAgICAgZmllbGQu
Z2V0KCZjb21wcmVzc2lvbl90eXBlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNSAv
KiBpbmNpZGVudF9yZXBvcnRfY29uZmlnICovOgorICAgICAgICAoKmluY2lkZW50X3JlcG9ydF9j
b25maWdfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDI3IC8qIHRyYWNlX3V1aWRfbXNiICovOgorICAgICAgICBmaWVs
ZC5nZXQoJnRyYWNlX3V1aWRfbXNiXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOCAv
KiB0cmFjZV91dWlkX2xzYiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0cmFjZV91dWlkX2xzYl8p
OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6
ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9Cisg
IH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0
ZDo6c3RyaW5nIFRyYWNlQ29uZmlnOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQor
CitzdGQ6OnZlY3Rvcjx1aW50OF90PiBUcmFjZUNvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNv
bnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4g
bXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0Fy
cmF5KCk7Cit9CisKK3ZvaWQgVHJhY2VDb25maWc6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVz
c2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGJ1ZmZlcnMKKyAgZm9yIChhdXRvJiBp
dCA6IGJ1ZmZlcnNfKSB7CisgICAgaXQuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdl
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPigxKSk7CisgIH0KKworICAvLyBGaWVsZCAyOiBkYXRhX3Nv
dXJjZXMKKyAgZm9yIChhdXRvJiBpdCA6IGRhdGFfc291cmNlc18pIHsKKyAgICBpdC5TZXJpYWxp
emUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDIpKTsKKyAg
fQorCisgIC8vIEZpZWxkIDIwOiBidWlsdGluX2RhdGFfc291cmNlcworICBpZiAoX2hhc19maWVs
ZF9bMjBdKSB7CisgICAgKCpidWlsdGluX2RhdGFfc291cmNlc18pLlNlcmlhbGl6ZShtc2ctPkJl
Z2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMjApKTsKKyAgfQorCisgIC8v
IEZpZWxkIDM6IGR1cmF0aW9uX21zCisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+
QXBwZW5kVmFySW50KDMsIGR1cmF0aW9uX21zXyk7CisgIH0KKworICAvLyBGaWVsZCA0OiBlbmFi
bGVfZXh0cmFfZ3VhcmRyYWlscworICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ctPkFw
cGVuZFRpbnlWYXJJbnQoNCwgZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHNfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDU6IGxvY2tkb3duX21vZGUKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7CisgICAgbXNn
LT5BcHBlbmRWYXJJbnQoNSwgbG9ja2Rvd25fbW9kZV8pOworICB9CisKKyAgLy8gRmllbGQgNjog
cHJvZHVjZXJzCisgIGZvciAoYXV0byYgaXQgOiBwcm9kdWNlcnNfKSB7CisgICAgaXQuU2VyaWFs
aXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPig2KSk7Cisg
IH0KKworICAvLyBGaWVsZCA3OiBzdGF0c2RfbWV0YWRhdGEKKyAgaWYgKF9oYXNfZmllbGRfWzdd
KSB7CisgICAgKCpzdGF0c2RfbWV0YWRhdGFfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1l
c3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDcpKTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IHdy
aXRlX2ludG9fZmlsZQorICBpZiAoX2hhc19maWVsZF9bOF0pIHsKKyAgICBtc2ctPkFwcGVuZFRp
bnlWYXJJbnQoOCwgd3JpdGVfaW50b19maWxlXyk7CisgIH0KKworICAvLyBGaWVsZCAyOTogb3V0
cHV0X3BhdGgKKyAgaWYgKF9oYXNfZmllbGRfWzI5XSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5n
KDI5LCBvdXRwdXRfcGF0aF8pOworICB9CisKKyAgLy8gRmllbGQgOTogZmlsZV93cml0ZV9wZXJp
b2RfbXMKKyAgaWYgKF9oYXNfZmllbGRfWzldKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoOSwg
ZmlsZV93cml0ZV9wZXJpb2RfbXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDEwOiBtYXhfZmlsZV9z
aXplX2J5dGVzCisgIGlmIChfaGFzX2ZpZWxkX1sxMF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCgxMCwgbWF4X2ZpbGVfc2l6ZV9ieXRlc18pOworICB9CisKKyAgLy8gRmllbGQgMTE6IGd1YXJk
cmFpbF9vdmVycmlkZXMKKyAgaWYgKF9oYXNfZmllbGRfWzExXSkgeworICAgICgqZ3VhcmRyYWls
X292ZXJyaWRlc18pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVy
bzo6TWVzc2FnZT4oMTEpKTsKKyAgfQorCisgIC8vIEZpZWxkIDEyOiBkZWZlcnJlZF9zdGFydAor
ICBpZiAoX2hhc19maWVsZF9bMTJdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDEyLCBk
ZWZlcnJlZF9zdGFydF8pOworICB9CisKKyAgLy8gRmllbGQgMTM6IGZsdXNoX3BlcmlvZF9tcwor
ICBpZiAoX2hhc19maWVsZF9bMTNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTMsIGZsdXNo
X3BlcmlvZF9tc18pOworICB9CisKKyAgLy8gRmllbGQgMTQ6IGZsdXNoX3RpbWVvdXRfbXMKKyAg
aWYgKF9oYXNfZmllbGRfWzE0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDE0LCBmbHVzaF90
aW1lb3V0X21zXyk7CisgIH0KKworICAvLyBGaWVsZCAyMzogZGF0YV9zb3VyY2Vfc3RvcF90aW1l
b3V0X21zCisgIGlmIChfaGFzX2ZpZWxkX1syM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgy
MywgZGF0YV9zb3VyY2Vfc3RvcF90aW1lb3V0X21zXyk7CisgIH0KKworICAvLyBGaWVsZCAxNjog
bm90aWZ5X3RyYWNldXIKKyAgaWYgKF9oYXNfZmllbGRfWzE2XSkgeworICAgIG1zZy0+QXBwZW5k
VGlueVZhckludCgxNiwgbm90aWZ5X3RyYWNldXJfKTsKKyAgfQorCisgIC8vIEZpZWxkIDE3OiB0
cmlnZ2VyX2NvbmZpZworICBpZiAoX2hhc19maWVsZF9bMTddKSB7CisgICAgKCp0cmlnZ2VyX2Nv
bmZpZ18pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVz
c2FnZT4oMTcpKTsKKyAgfQorCisgIC8vIEZpZWxkIDE4OiBhY3RpdmF0ZV90cmlnZ2VycworICBm
b3IgKGF1dG8mIGl0IDogYWN0aXZhdGVfdHJpZ2dlcnNfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJp
bmcoMTgsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDIxOiBpbmNyZW1lbnRhbF9zdGF0ZV9jb25m
aWcKKyAgaWYgKF9oYXNfZmllbGRfWzIxXSkgeworICAgICgqaW5jcmVtZW50YWxfc3RhdGVfY29u
ZmlnXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPigyMSkpOworICB9CisKKyAgLy8gRmllbGQgMTk6IGFsbG93X3VzZXJfYnVpbGRfdHJhY2lu
ZworICBpZiAoX2hhc19maWVsZF9bMTldKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDE5
LCBhbGxvd191c2VyX2J1aWxkX3RyYWNpbmdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDIyOiB1bmlx
dWVfc2Vzc2lvbl9uYW1lCisgIGlmIChfaGFzX2ZpZWxkX1syMl0pIHsKKyAgICBtc2ctPkFwcGVu
ZFN0cmluZygyMiwgdW5pcXVlX3Nlc3Npb25fbmFtZV8pOworICB9CisKKyAgLy8gRmllbGQgMjQ6
IGNvbXByZXNzaW9uX3R5cGUKKyAgaWYgKF9oYXNfZmllbGRfWzI0XSkgeworICAgIG1zZy0+QXBw
ZW5kVmFySW50KDI0LCBjb21wcmVzc2lvbl90eXBlXyk7CisgIH0KKworICAvLyBGaWVsZCAyNTog
aW5jaWRlbnRfcmVwb3J0X2NvbmZpZworICBpZiAoX2hhc19maWVsZF9bMjVdKSB7CisgICAgKCpp
bmNpZGVudF9yZXBvcnRfY29uZmlnXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdl
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyNSkpOworICB9CisKKyAgLy8gRmllbGQgMjc6IHRyYWNl
X3V1aWRfbXNiCisgIGlmIChfaGFzX2ZpZWxkX1syN10pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCgyNywgdHJhY2VfdXVpZF9tc2JfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI4OiB0cmFjZV91dWlk
X2xzYgorICBpZiAoX2hhc19maWVsZF9bMjhdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMjgs
IHRyYWNlX3V1aWRfbHNiXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5r
bm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworVHJh
Y2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWc6OlRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0
Q29uZmlnKCkgPSBkZWZhdWx0OworVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWc6On5U
cmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZygpID0gZGVmYXVsdDsKK1RyYWNlQ29uZmln
X0luY2lkZW50UmVwb3J0Q29uZmlnOjpUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZyhj
b25zdCBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZyYpID0gZGVmYXVsdDsKK1RyYWNl
Q29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnJiBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENv
bmZpZzo6b3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnJikg
PSBkZWZhdWx0OworVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWc6OlRyYWNlQ29uZmln
X0luY2lkZW50UmVwb3J0Q29uZmlnKFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnJiYp
IG5vZXhjZXB0ID0gZGVmYXVsdDsKK1RyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnJiBU
cmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZzo6b3BlcmF0b3I9KFRyYWNlQ29uZmlnX0lu
Y2lkZW50UmVwb3J0Q29uZmlnJiYpID0gZGVmYXVsdDsKKworYm9vbCBUcmFjZUNvbmZpZ19JbmNp
ZGVudFJlcG9ydENvbmZpZzo6b3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19JbmNpZGVudFJl
cG9ydENvbmZpZyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBv
dGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGRlc3RpbmF0aW9uX3BhY2thZ2VfID09IG90aGVy
LmRlc3RpbmF0aW9uX3BhY2thZ2VfCisgICAmJiBkZXN0aW5hdGlvbl9jbGFzc18gPT0gb3RoZXIu
ZGVzdGluYXRpb25fY2xhc3NfCisgICAmJiBwcml2YWN5X2xldmVsXyA9PSBvdGhlci5wcml2YWN5
X2xldmVsXworICAgJiYgc2tpcF9kcm9wYm94XyA9PSBvdGhlci5za2lwX2Ryb3Bib3hfOworfQor
Citib29sIFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnOjpQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigp
OworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0Rl
Y29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQo
KTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmll
bGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZp
ZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2Ug
MSAvKiBkZXN0aW5hdGlvbl9wYWNrYWdlICovOgorICAgICAgICBmaWVsZC5nZXQoJmRlc3RpbmF0
aW9uX3BhY2thZ2VfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogZGVzdGluYXRp
b25fY2xhc3MgKi86CisgICAgICAgIGZpZWxkLmdldCgmZGVzdGluYXRpb25fY2xhc3NfKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogcHJpdmFjeV9sZXZlbCAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZwcml2YWN5X2xldmVsXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0
IC8qIHNraXBfZHJvcGJveCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZza2lwX2Ryb3Bib3hfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVB
bmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9
CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6
OnN0cmluZyBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZzo6U2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVHJhY2VDb25maWdfSW5j
aWRlbnRSZXBvcnRDb25maWc6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96
ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXpl
KG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lk
IFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnOjpTZXJpYWxpemUoOjpwcm90b3plcm86
Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBkZXN0aW5hdGlvbl9wYWNrYWdl
CisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEsIGRlc3Rp
bmF0aW9uX3BhY2thZ2VfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGRlc3RpbmF0aW9uX2NsYXNz
CisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIGRlc3Rp
bmF0aW9uX2NsYXNzXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBwcml2YWN5X2xldmVsCisgIGlm
IChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIHByaXZhY3lfbGV2
ZWxfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IHNraXBfZHJvcGJveAorICBpZiAoX2hhc19maWVs
ZF9bNF0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNCwgc2tpcF9kcm9wYm94Xyk7Cisg
IH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwg
dW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworVHJhY2VDb25maWdfSW5jcmVtZW50YWxT
dGF0ZUNvbmZpZzo6VHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZygpID0gZGVmYXVs
dDsKK1RyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWc6On5UcmFjZUNvbmZpZ19JbmNy
ZW1lbnRhbFN0YXRlQ29uZmlnKCkgPSBkZWZhdWx0OworVHJhY2VDb25maWdfSW5jcmVtZW50YWxT
dGF0ZUNvbmZpZzo6VHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyhjb25zdCBUcmFj
ZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnJikgPSBkZWZhdWx0OworVHJhY2VDb25maWdf
SW5jcmVtZW50YWxTdGF0ZUNvbmZpZyYgVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZp
Zzo6b3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcmKSA9
IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnOjpUcmFjZUNvbmZp
Z19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnKFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25m
aWcmJikgbm9leGNlcHQgPSBkZWZhdWx0OworVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNv
bmZpZyYgVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZzo6b3BlcmF0b3I9KFRyYWNl
Q29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcmJikgPSBkZWZhdWx0OworCitib29sIFRyYWNl
Q29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWc6Om9wZXJhdG9yPT0oY29uc3QgVHJhY2VDb25m
aWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25v
d25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGNsZWFyX3BlcmlvZF9t
c18gPT0gb3RoZXIuY2xlYXJfcGVyaW9kX21zXzsKK30KKworYm9vbCBUcmFjZUNvbmZpZ19JbmNy
ZW1lbnRhbFN0YXRlQ29uZmlnOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVf
dCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJv
ciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7
CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmll
bGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRf
LnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAg
ICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBjbGVhcl9wZXJpb2RfbXMg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmY2xlYXJfcGVyaW9kX21zXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVu
a25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBh
Y2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2VD
b25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZzo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmco
KTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0
ZUNvbmZpZzo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBC
dWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgp
KTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2VDb25m
aWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdl
KiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogY2xlYXJfcGVyaW9kX21zCisgIGlmIChfaGFz
X2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGNsZWFyX3BlcmlvZF9tc18p
OworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRh
KCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK1RyYWNlQ29uZmlnX1RyaWdnZXJD
b25maWc6OlRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcoKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZp
Z19UcmlnZ2VyQ29uZmlnOjp+VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZygpID0gZGVmYXVsdDsK
K1RyYWNlQ29uZmlnX1RyaWdnZXJDb25maWc6OlRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcoY29u
c3QgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyYpID0gZGVmYXVsdDsKK1RyYWNlQ29uZmlnX1Ry
aWdnZXJDb25maWcmIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWc6Om9wZXJhdG9yPShjb25zdCBU
cmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnJikgPSBkZWZhdWx0OworVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZzo6VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyhUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1RyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcmIFRy
YWNlQ29uZmlnX1RyaWdnZXJDb25maWc6Om9wZXJhdG9yPShUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnJiYpID0gZGVmYXVsdDsKKworYm9vbCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnOjpvcGVy
YXRvcj09KGNvbnN0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcmIG90aGVyKSBjb25zdCB7Cisg
IHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiB0
cmlnZ2VyX21vZGVfID09IG90aGVyLnRyaWdnZXJfbW9kZV8KKyAgICYmIHRyaWdnZXJzXyA9PSBv
dGhlci50cmlnZ2Vyc18KKyAgICYmIHRyaWdnZXJfdGltZW91dF9tc18gPT0gb3RoZXIudHJpZ2dl
cl90aW1lb3V0X21zXzsKK30KKworYm9vbCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnOjpQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHRyaWdnZXJzXy5j
bGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3Ig
PSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOwor
ICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxk
ID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5z
aXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAg
c3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogdHJpZ2dlcl9tb2RlICovOgor
ICAgICAgICBmaWVsZC5nZXQoJnRyaWdnZXJfbW9kZV8pOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgMiAvKiB0cmlnZ2VycyAqLzoKKyAgICAgICAgdHJpZ2dlcnNfLmVtcGxhY2VfYmFjaygp
OworICAgICAgICB0cmlnZ2Vyc18uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRf
c3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiB0cmlnZ2VyX3RpbWVv
dXRfbXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmdHJpZ2dlcl90aW1lb3V0X21zXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBw
ZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBy
ZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJp
bmcgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZzo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmco
KTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZzo6
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAg
Ly8gRmllbGQgMTogdHJpZ2dlcl9tb2RlCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1z
Zy0+QXBwZW5kVmFySW50KDEsIHRyaWdnZXJfbW9kZV8pOworICB9CisKKyAgLy8gRmllbGQgMjog
dHJpZ2dlcnMKKyAgZm9yIChhdXRvJiBpdCA6IHRyaWdnZXJzXykgeworICAgIGl0LlNlcmlhbGl6
ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMikpOworICB9
CisKKyAgLy8gRmllbGQgMzogdHJpZ2dlcl90aW1lb3V0X21zCisgIGlmIChfaGFzX2ZpZWxkX1sz
XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIHRyaWdnZXJfdGltZW91dF9tc18pOworICB9
CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVu
a25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK1RyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdf
VHJpZ2dlcjo6VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyKCkgPSBkZWZhdWx0Owor
VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyOjp+VHJhY2VDb25maWdfVHJpZ2dlckNv
bmZpZ19UcmlnZ2VyKCkgPSBkZWZhdWx0OworVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19Ucmln
Z2VyOjpUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXIoY29uc3QgVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZ19UcmlnZ2VyJikgPSBkZWZhdWx0OworVHJhY2VDb25maWdfVHJpZ2dlckNv
bmZpZ19UcmlnZ2VyJiBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI6Om9wZXJhdG9y
PShjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXImKSA9IGRlZmF1bHQ7CitU
cmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI6OlRyYWNlQ29uZmlnX1RyaWdnZXJDb25m
aWdfVHJpZ2dlcihUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXImJikgbm9leGNlcHQg
PSBkZWZhdWx0OworVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyJiBUcmFjZUNvbmZp
Z19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI6Om9wZXJhdG9yPShUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnX1RyaWdnZXImJikgPSBkZWZhdWx0OworCitib29sIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25m
aWdfVHJpZ2dlcjo6b3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1Ry
aWdnZXImIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIu
dW5rbm93bl9maWVsZHNfCisgICAmJiBuYW1lXyA9PSBvdGhlci5uYW1lXworICAgJiYgcHJvZHVj
ZXJfbmFtZV9yZWdleF8gPT0gb3RoZXIucHJvZHVjZXJfbmFtZV9yZWdleF8KKyAgICYmIHN0b3Bf
ZGVsYXlfbXNfID09IG90aGVyLnN0b3BfZGVsYXlfbXNfOworfQorCitib29sIFRyYWNlQ29uZmln
X1RyaWdnZXJDb25maWdfVHJpZ2dlcjo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBz
aXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogbmFtZSAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZuYW1lXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8q
IHByb2R1Y2VyX25hbWVfcmVnZXggKi86CisgICAgICAgIGZpZWxkLmdldCgmcHJvZHVjZXJfbmFt
ZV9yZWdleF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBzdG9wX2RlbGF5X21z
ICovOgorICAgICAgICBmaWVsZC5nZXQoJnN0b3BfZGVsYXlfbXNfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5r
bm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFj
a2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBUcmFjZUNv
bmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7
Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJp
Z2dlcjo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZm
ZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsK
KyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZ19UcmlnZ2VyOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgewor
ICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEsIG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHBy
b2R1Y2VyX25hbWVfcmVnZXgKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBl
bmRTdHJpbmcoMiwgcHJvZHVjZXJfbmFtZV9yZWdleF8pOworICB9CisKKyAgLy8gRmllbGQgMzog
c3RvcF9kZWxheV9tcworICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFZh
ckludCgzLCBzdG9wX2RlbGF5X21zXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0
ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisK
KworVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzOjpUcmFjZUNvbmZpZ19HdWFyZHJhaWxP
dmVycmlkZXMoKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXM6On5U
cmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMoKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19H
dWFyZHJhaWxPdmVycmlkZXM6OlRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyhjb25zdCBU
cmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMmKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19H
dWFyZHJhaWxPdmVycmlkZXMmIFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlczo6b3BlcmF0
b3I9KGNvbnN0IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYpID0gZGVmYXVsdDsKK1Ry
YWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlczo6VHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJp
ZGVzKFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7
CitUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMmIFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92
ZXJyaWRlczo6b3BlcmF0b3I9KFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYmKSA9IGRl
ZmF1bHQ7CisKK2Jvb2wgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzOjpvcGVyYXRvcj09
KGNvbnN0IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYgb3RoZXIpIGNvbnN0IHsKKyAg
cmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIG1h
eF91cGxvYWRfcGVyX2RheV9ieXRlc18gPT0gb3RoZXIubWF4X3VwbG9hZF9wZXJfZGF5X2J5dGVz
XzsKK30KKworYm9vbCBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXM6OlBhcnNlRnJvbUFy
cmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNs
ZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlBy
b3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRG
aWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlm
IChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5z
ZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAg
Y2FzZSAxIC8qIG1heF91cGxvYWRfcGVyX2RheV9ieXRlcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0
KCZtYXhfdXBsb2FkX3Blcl9kYXlfYnl0ZXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZh
dWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYm
ICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBUcmFjZUNvbmZpZ19HdWFyZHJh
aWxPdmVycmlkZXM6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cu
Z2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVj
dG9yPHVpbnQ4X3Q+IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlczo6U2VyaWFsaXplQXNB
cnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6
TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJp
YWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVz
OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVs
ZCAxOiBtYXhfdXBsb2FkX3Blcl9kYXlfYnl0ZXMKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgbWF4X3VwbG9hZF9wZXJfZGF5X2J5dGVzXyk7CisgIH0K
KworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5r
bm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGE6
OlRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhKCkgPSBkZWZhdWx0OworVHJhY2VDb25maWdfU3Rh
dHNkTWV0YWRhdGE6On5UcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSgpID0gZGVmYXVsdDsKK1Ry
YWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhOjpUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YShjb25z
dCBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSYpID0gZGVmYXVsdDsKK1RyYWNlQ29uZmlnX1N0
YXRzZE1ldGFkYXRhJiBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YTo6b3BlcmF0b3I9KGNvbnN0
IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhJikgPSBkZWZhdWx0OworVHJhY2VDb25maWdfU3Rh
dHNkTWV0YWRhdGE6OlRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhKFRyYWNlQ29uZmlnX1N0YXRz
ZE1ldGFkYXRhJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1RyYWNlQ29uZmlnX1N0YXRzZE1ldGFk
YXRhJiBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YTo6b3BlcmF0b3I9KFRyYWNlQ29uZmlnX1N0
YXRzZE1ldGFkYXRhJiYpID0gZGVmYXVsdDsKKworYm9vbCBUcmFjZUNvbmZpZ19TdGF0c2RNZXRh
ZGF0YTo6b3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSYgb3RoZXIp
IGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxk
c18KKyAgICYmIHRyaWdnZXJpbmdfYWxlcnRfaWRfID09IG90aGVyLnRyaWdnZXJpbmdfYWxlcnRf
aWRfCisgICAmJiB0cmlnZ2VyaW5nX2NvbmZpZ191aWRfID09IG90aGVyLnRyaWdnZXJpbmdfY29u
ZmlnX3VpZF8KKyAgICYmIHRyaWdnZXJpbmdfY29uZmlnX2lkXyA9PSBvdGhlci50cmlnZ2VyaW5n
X2NvbmZpZ19pZF8KKyAgICYmIHRyaWdnZXJpbmdfc3Vic2NyaXB0aW9uX2lkXyA9PSBvdGhlci50
cmlnZ2VyaW5nX3N1YnNjcmlwdGlvbl9pZF87Cit9CisKK2Jvb2wgVHJhY2VDb25maWdfU3RhdHNk
TWV0YWRhdGE6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsK
KyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7
CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChh
dXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5S
ZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7
CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAo
ZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHRyaWdnZXJpbmdfYWxlcnRfaWQgKi86Cisg
ICAgICAgIGZpZWxkLmdldCgmdHJpZ2dlcmluZ19hbGVydF9pZF8pOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgMiAvKiB0cmlnZ2VyaW5nX2NvbmZpZ191aWQgKi86CisgICAgICAgIGZpZWxk
LmdldCgmdHJpZ2dlcmluZ19jb25maWdfdWlkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAzIC8qIHRyaWdnZXJpbmdfY29uZmlnX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJnRyaWdn
ZXJpbmdfY29uZmlnX2lkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIHRyaWdn
ZXJpbmdfc3Vic2NyaXB0aW9uX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJnRyaWdnZXJpbmdf
c3Vic2NyaXB0aW9uX2lkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVz
X2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGE6OlNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6
cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1
cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRy
YWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6
OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNl
cmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30K
Kwordm9pZCBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YTo6U2VyaWFsaXplKDo6cHJvdG96ZXJv
OjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogdHJpZ2dlcmluZ19hbGVydF9p
ZAorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCB0cmln
Z2VyaW5nX2FsZXJ0X2lkXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiB0cmlnZ2VyaW5nX2NvbmZp
Z191aWQKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwg
dHJpZ2dlcmluZ19jb25maWdfdWlkXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiB0cmlnZ2VyaW5n
X2NvbmZpZ19pZAorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCgzLCB0cmlnZ2VyaW5nX2NvbmZpZ19pZF8pOworICB9CisKKyAgLy8gRmllbGQgNDogdHJpZ2dl
cmluZ19zdWJzY3JpcHRpb25faWQKKyAgaWYgKF9oYXNfZmllbGRfWzRdKSB7CisgICAgbXNnLT5B
cHBlbmRWYXJJbnQoNCwgdHJpZ2dlcmluZ19zdWJzY3JpcHRpb25faWRfKTsKKyAgfQorCisgIG1z
Zy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2Zp
ZWxkc18uc2l6ZSgpKTsKK30KKworCitUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZzo6VHJhY2VD
b25maWdfUHJvZHVjZXJDb25maWcoKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19Qcm9kdWNlckNv
bmZpZzo6flRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnKCkgPSBkZWZhdWx0OworVHJhY2VDb25m
aWdfUHJvZHVjZXJDb25maWc6OlRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnKGNvbnN0IFRyYWNl
Q29uZmlnX1Byb2R1Y2VyQ29uZmlnJikgPSBkZWZhdWx0OworVHJhY2VDb25maWdfUHJvZHVjZXJD
b25maWcmIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnOjpvcGVyYXRvcj0oY29uc3QgVHJhY2VD
b25maWdfUHJvZHVjZXJDb25maWcmKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19Qcm9kdWNlckNv
bmZpZzo6VHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcoVHJhY2VDb25maWdfUHJvZHVjZXJDb25m
aWcmJikgbm9leGNlcHQgPSBkZWZhdWx0OworVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcmIFRy
YWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnOjpvcGVyYXRvcj0oVHJhY2VDb25maWdfUHJvZHVjZXJD
b25maWcmJikgPSBkZWZhdWx0OworCitib29sIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnOjpv
cGVyYXRvcj09KGNvbnN0IFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnJiBvdGhlcikgY29uc3Qg
eworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAg
JiYgcHJvZHVjZXJfbmFtZV8gPT0gb3RoZXIucHJvZHVjZXJfbmFtZV8KKyAgICYmIHNobV9zaXpl
X2tiXyA9PSBvdGhlci5zaG1fc2l6ZV9rYl8KKyAgICYmIHBhZ2Vfc2l6ZV9rYl8gPT0gb3RoZXIu
cGFnZV9zaXplX2tiXzsKK30KKworYm9vbCBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZzo6UGFy
c2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2Zp
ZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3Rv
emVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7
CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNf
ZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7
CisgICAgICBjYXNlIDEgLyogcHJvZHVjZXJfbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZw
cm9kdWNlcl9uYW1lXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIHNobV9zaXpl
X2tiICovOgorICAgICAgICBmaWVsZC5nZXQoJnNobV9zaXplX2tiXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSAzIC8qIHBhZ2Vfc2l6ZV9rYiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZw
YWdlX3NpemVfa2JfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBm
aWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVm
dCgpOworfQorCitzdGQ6OnN0cmluZyBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZzo6U2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90
b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBt
c2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVHJhY2VD
b25maWdfUHJvZHVjZXJDb25maWc6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2
b2lkIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBwcm9kdWNlcl9uYW1lCisgIGlmIChf
aGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEsIHByb2R1Y2VyX25hbWVf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHNobV9zaXplX2tiCisgIGlmIChfaGFzX2ZpZWxkX1sy
XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDIsIHNobV9zaXplX2tiXyk7CisgIH0KKworICAv
LyBGaWVsZCAzOiBwYWdlX3NpemVfa2IKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNn
LT5BcHBlbmRWYXJJbnQoMywgcGFnZV9zaXplX2tiXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJh
d1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUo
KSk7Cit9CisKKworVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2U6OlRyYWNlQ29uZmlnX0J1
aWx0aW5EYXRhU291cmNlKCkgPSBkZWZhdWx0OworVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3Vy
Y2U6On5UcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSgpID0gZGVmYXVsdDsKK1RyYWNlQ29u
ZmlnX0J1aWx0aW5EYXRhU291cmNlOjpUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZShjb25z
dCBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSYpID0gZGVmYXVsdDsKK1RyYWNlQ29uZmln
X0J1aWx0aW5EYXRhU291cmNlJiBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZTo6b3BlcmF0
b3I9KGNvbnN0IFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlJikgPSBkZWZhdWx0OworVHJh
Y2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2U6OlRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNl
KFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1Ry
YWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlJiBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJj
ZTo6b3BlcmF0b3I9KFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlJiYpID0gZGVmYXVsdDsK
KworYm9vbCBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZTo6b3BlcmF0b3I9PShjb25zdCBU
cmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVu
a25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGRpc2FibGVfY2xv
Y2tfc25hcHNob3R0aW5nXyA9PSBvdGhlci5kaXNhYmxlX2Nsb2NrX3NuYXBzaG90dGluZ18KKyAg
ICYmIGRpc2FibGVfdHJhY2VfY29uZmlnXyA9PSBvdGhlci5kaXNhYmxlX3RyYWNlX2NvbmZpZ18K
KyAgICYmIGRpc2FibGVfc3lzdGVtX2luZm9fID09IG90aGVyLmRpc2FibGVfc3lzdGVtX2luZm9f
CisgICAmJiBkaXNhYmxlX3NlcnZpY2VfZXZlbnRzXyA9PSBvdGhlci5kaXNhYmxlX3NlcnZpY2Vf
ZXZlbnRzXworICAgJiYgcHJpbWFyeV90cmFjZV9jbG9ja18gPT0gb3RoZXIucHJpbWFyeV90cmFj
ZV9jbG9ja18KKyAgICYmIHNuYXBzaG90X2ludGVydmFsX21zXyA9PSBvdGhlci5zbmFwc2hvdF9p
bnRlcnZhbF9tc187Cit9CisKK2Jvb2wgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2U6OlBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9m
aWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90
b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0g
ZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkg
eworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFz
X2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkg
eworICAgICAgY2FzZSAxIC8qIGRpc2FibGVfY2xvY2tfc25hcHNob3R0aW5nICovOgorICAgICAg
ICBmaWVsZC5nZXQoJmRpc2FibGVfY2xvY2tfc25hcHNob3R0aW5nXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSAyIC8qIGRpc2FibGVfdHJhY2VfY29uZmlnICovOgorICAgICAgICBmaWVs
ZC5nZXQoJmRpc2FibGVfdHJhY2VfY29uZmlnXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAzIC8qIGRpc2FibGVfc3lzdGVtX2luZm8gKi86CisgICAgICAgIGZpZWxkLmdldCgmZGlzYWJs
ZV9zeXN0ZW1faW5mb18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBkaXNhYmxl
X3NlcnZpY2VfZXZlbnRzICovOgorICAgICAgICBmaWVsZC5nZXQoJmRpc2FibGVfc2VydmljZV9l
dmVudHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUgLyogcHJpbWFyeV90cmFjZV9j
bG9jayAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwcmltYXJ5X3RyYWNlX2Nsb2NrXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8qIHNuYXBzaG90X2ludGVydmFsX21zICovOgorICAg
ICAgICBmaWVsZC5nZXQoJnNuYXBzaG90X2ludGVydmFsX21zXyk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25v
d25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tl
ZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2VDb25m
aWdfQnVpbHRpbkRhdGFTb3VyY2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnBy
b3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlh
bGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisK
K3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlOjpTZXJp
YWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJv
dG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4g
bXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBUcmFjZUNvbmZpZ19CdWlsdGluRGF0
YVNvdXJjZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAg
Ly8gRmllbGQgMTogZGlzYWJsZV9jbG9ja19zbmFwc2hvdHRpbmcKKyAgaWYgKF9oYXNfZmllbGRf
WzFdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDEsIGRpc2FibGVfY2xvY2tfc25hcHNo
b3R0aW5nXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBkaXNhYmxlX3RyYWNlX2NvbmZpZworICBp
ZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoMiwgZGlzYWJs
ZV90cmFjZV9jb25maWdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGRpc2FibGVfc3lzdGVtX2lu
Zm8KKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDMs
IGRpc2FibGVfc3lzdGVtX2luZm9fKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IGRpc2FibGVfc2Vy
dmljZV9ldmVudHMKKyAgaWYgKF9oYXNfZmllbGRfWzRdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55
VmFySW50KDQsIGRpc2FibGVfc2VydmljZV9ldmVudHNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6
IHByaW1hcnlfdHJhY2VfY2xvY2sKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7CisgICAgbXNnLT5B
cHBlbmRWYXJJbnQoNSwgcHJpbWFyeV90cmFjZV9jbG9ja18pOworICB9CisKKyAgLy8gRmllbGQg
Njogc25hcHNob3RfaW50ZXJ2YWxfbXMKKyAgaWYgKF9oYXNfZmllbGRfWzZdKSB7CisgICAgbXNn
LT5BcHBlbmRWYXJJbnQoNiwgc25hcHNob3RfaW50ZXJ2YWxfbXNfKTsKKyAgfQorCisgIG1zZy0+
QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxk
c18uc2l6ZSgpKTsKK30KKworCitUcmFjZUNvbmZpZ19EYXRhU291cmNlOjpUcmFjZUNvbmZpZ19E
YXRhU291cmNlKCkgPSBkZWZhdWx0OworVHJhY2VDb25maWdfRGF0YVNvdXJjZTo6flRyYWNlQ29u
ZmlnX0RhdGFTb3VyY2UoKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19EYXRhU291cmNlOjpUcmFj
ZUNvbmZpZ19EYXRhU291cmNlKGNvbnN0IFRyYWNlQ29uZmlnX0RhdGFTb3VyY2UmKSA9IGRlZmF1
bHQ7CitUcmFjZUNvbmZpZ19EYXRhU291cmNlJiBUcmFjZUNvbmZpZ19EYXRhU291cmNlOjpvcGVy
YXRvcj0oY29uc3QgVHJhY2VDb25maWdfRGF0YVNvdXJjZSYpID0gZGVmYXVsdDsKK1RyYWNlQ29u
ZmlnX0RhdGFTb3VyY2U6OlRyYWNlQ29uZmlnX0RhdGFTb3VyY2UoVHJhY2VDb25maWdfRGF0YVNv
dXJjZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19EYXRhU291cmNlJiBUcmFj
ZUNvbmZpZ19EYXRhU291cmNlOjpvcGVyYXRvcj0oVHJhY2VDb25maWdfRGF0YVNvdXJjZSYmKSA9
IGRlZmF1bHQ7CisKK2Jvb2wgVHJhY2VDb25maWdfRGF0YVNvdXJjZTo6b3BlcmF0b3I9PShjb25z
dCBUcmFjZUNvbmZpZ19EYXRhU291cmNlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93
bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgY29uZmlnXyA9PSBvdGhl
ci5jb25maWdfCisgICAmJiBwcm9kdWNlcl9uYW1lX2ZpbHRlcl8gPT0gb3RoZXIucHJvZHVjZXJf
bmFtZV9maWx0ZXJfCisgICAmJiBwcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl8gPT0gb3RoZXIu
cHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXJfOworfQorCitib29sIFRyYWNlQ29uZmlnX0RhdGFT
b3VyY2U6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAg
cHJvZHVjZXJfbmFtZV9maWx0ZXJfLmNsZWFyKCk7CisgIHByb2R1Y2VyX25hbWVfcmVnZXhfZmls
dGVyXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogY29uZmlnICovOgor
ICAgICAgICAoKmNvbmZpZ18pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkp
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBwcm9kdWNlcl9uYW1lX2ZpbHRlciAq
LzoKKyAgICAgICAgcHJvZHVjZXJfbmFtZV9maWx0ZXJfLmVtcGxhY2VfYmFjaygpOworICAgICAg
ICBmaWVsZC5nZXQoJnByb2R1Y2VyX25hbWVfZmlsdGVyXy5iYWNrKCkpOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgMyAvKiBwcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlciAqLzoKKyAgICAg
ICAgcHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXJfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBm
aWVsZC5nZXQoJnByb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyXy5iYWNrKCkpOworICAgICAgICBi
cmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRv
KCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJu
ICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRy
YWNlQ29uZmlnX0RhdGFTb3VyY2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnBy
b3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlh
bGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisK
K3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNlQ29uZmlnX0RhdGFTb3VyY2U6OlNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86
Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2Vy
aWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFRyYWNlQ29uZmlnX0RhdGFTb3VyY2U6OlNlcmlh
bGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGNv
bmZpZworICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICAoKmNvbmZpZ18pLlNlcmlhbGl6ZSht
c2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMSkpOworICB9CisK
KyAgLy8gRmllbGQgMjogcHJvZHVjZXJfbmFtZV9maWx0ZXIKKyAgZm9yIChhdXRvJiBpdCA6IHBy
b2R1Y2VyX25hbWVfZmlsdGVyXykgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIGl0KTsKKyAg
fQorCisgIC8vIEZpZWxkIDM6IHByb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyCisgIGZvciAoYXV0
byYgaXQgOiBwcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl8pIHsKKyAgICBtc2ctPkFwcGVuZFN0
cmluZygzLCBpdCk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9m
aWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworVHJhY2VDb25m
aWdfQnVmZmVyQ29uZmlnOjpUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcoKSA9IGRlZmF1bHQ7CitU
cmFjZUNvbmZpZ19CdWZmZXJDb25maWc6On5UcmFjZUNvbmZpZ19CdWZmZXJDb25maWcoKSA9IGRl
ZmF1bHQ7CitUcmFjZUNvbmZpZ19CdWZmZXJDb25maWc6OlRyYWNlQ29uZmlnX0J1ZmZlckNvbmZp
Zyhjb25zdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcmKSA9IGRlZmF1bHQ7CitUcmFjZUNvbmZp
Z19CdWZmZXJDb25maWcmIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZzo6b3BlcmF0b3I9KGNvbnN0
IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyYpID0gZGVmYXVsdDsKK1RyYWNlQ29uZmlnX0J1ZmZl
ckNvbmZpZzo6VHJhY2VDb25maWdfQnVmZmVyQ29uZmlnKFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZp
ZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcmIFRyYWNl
Q29uZmlnX0J1ZmZlckNvbmZpZzo6b3BlcmF0b3I9KFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyYm
KSA9IGRlZmF1bHQ7CisKK2Jvb2wgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnOjpvcGVyYXRvcj09
KGNvbnN0IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJu
IHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHNpemVfa2Jf
ID09IG90aGVyLnNpemVfa2JfCisgICAmJiBmaWxsX3BvbGljeV8gPT0gb3RoZXIuZmlsbF9wb2xp
Y3lfOworfQorCitib29sIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZzo6UGFyc2VGcm9tQXJyYXko
Y29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIo
KTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9E
ZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxk
KCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZp
ZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChm
aWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNl
IDEgLyogc2l6ZV9rYiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZzaXplX2tiXyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSA0IC8qIGZpbGxfcG9saWN5ICovOgorICAgICAgICBmaWVsZC5n
ZXQoJmZpbGxfcG9saWN5Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVz
X2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnOjpTZXJp
YWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBUcmFj
ZUNvbmZpZ19CdWZmZXJDb25maWc6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2
b2lkIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZzo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNz
YWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogc2l6ZV9rYgorICBpZiAoX2hhc19maWVs
ZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCBzaXplX2tiXyk7CisgIH0KKworICAv
LyBGaWVsZCA0OiBmaWxsX3BvbGljeQorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCg0LCBmaWxsX3BvbGljeV8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQ
cm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkp
OworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MK
K30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9hbmRy
b2lkX2xvZ19jb25zdGFudHMucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1
Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rv
cy9wZXJmZXR0by9jb21tb24vYnVpbHRpbl9jbG9jay5wYnplcm8uY2MKKy8vIEludGVudGlvbmFs
bHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9jb21taXRfZGF0YV9yZXF1ZXN0LnBiemVy
by5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL2RhdGFf
c291cmNlX2Rlc2NyaXB0b3IucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1
Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rv
cy9wZXJmZXR0by9jb21tb24vZGVzY3JpcHRvci5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkg
ZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNl
OiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9ncHVfY291bnRlcl9kZXNjcmlwdG9yLnBiemVy
by5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL29ic2Vy
dmFibGVfZXZlbnRzLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29t
Lzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVy
ZmV0dG8vY29tbW9uL3N5c19zdGF0c19jb3VudGVycy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFs
bHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi90cmFjZV9zdGF0cy5wYnplcm8uY2MKKy8v
IEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi90cmFjaW5nX3NlcnZp
Y2VfY2FwYWJpbGl0aWVzLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcu
Y29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3Mv
cGVyZmV0dG8vY29tbW9uL3RyYWNpbmdfc2VydmljZV9zdGF0ZS5wYnplcm8uY2MKKy8vIEludGVu
dGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi90cmFja19ldmVudF9kZXNjcmlw
dG9yLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJh
Y2UvZ3B1L2dwdV9jb3VudGVyX2V2ZW50LnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0
eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdl
bi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZ3B1L2dwdV9sb2cucGJ6ZXJvLmNjCisvLyBJbnRlbnRp
b25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9ncHUvZ3B1X3JlbmRlcl9zdGFnZV9l
dmVudC5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUp
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3Ry
YWNlL2dwdS92dWxrYW5fYXBpX2V2ZW50LnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0
eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdl
bi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZ3B1L3Z1bGthbl9tZW1vcnlfZXZlbnQucGJ6ZXJvLmNj
CisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9wcm9maWxpbmcv
aGVhcF9ncmFwaC5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85
OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL3RyYWNlL3Byb2ZpbGluZy9wcm9maWxlX2NvbW1vbi5wYnplcm8uY2MKKy8vIEludGVudGlv
bmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4g
c291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3Byb2ZpbGluZy9wcm9maWxlX3BhY2tl
dC5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNl
L3Byb2ZpbGluZy9zbWFwcy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVn
LmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9z
L3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9jb21wb3NpdG9yX3NjaGVkdWxlcl9z
dGF0ZS5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUp
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3Ry
YWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9mcmFtZV9yZXBvcnRlci5wYnplcm8uY2MKKy8vIEludGVu
dGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9o
aXN0b2dyYW1fc2FtcGxlLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcu
Y29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3Mv
cGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX2tleWVkX3NlcnZpY2UucGJ6ZXJvLmNj
CisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVu
dC9jaHJvbWVfbGF0ZW5jeV9pbmZvLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAo
Y3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9w
cm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX2xlZ2FjeV9pcGMucGJ6ZXJv
LmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19l
dmVudC9jaHJvbWVfcHJvY2Vzc19kZXNjcmlwdG9yLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxs
eSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX3RocmVhZF9k
ZXNjcmlwdG9yLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5
ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0
dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX3VzZXJfZXZlbnQucGJ6ZXJvLmNjCisvLyBJbnRl
bnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jb3VudGVy
X2Rlc2NyaXB0b3IucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20v
OTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJm
ZXR0by90cmFjZS90cmFja19ldmVudC9kZWJ1Z19hbm5vdGF0aW9uLnBiemVyby5jYworLy8gSW50
ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvbG9nX21l
c3NhZ2UucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1
KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90
cmFjZS90cmFja19ldmVudC9wcm9jZXNzX2Rlc2NyaXB0b3IucGJ6ZXJvLmNjCisvLyBJbnRlbnRp
b25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9zb3VyY2VfbG9j
YXRpb24ucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1
KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90
cmFjZS90cmFja19ldmVudC90YXNrX2V4ZWN1dGlvbi5wYnplcm8uY2MKKy8vIEludGVudGlvbmFs
bHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RocmVhZF9kZXNjcmlw
dG9yLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJh
Y2UvdHJhY2tfZXZlbnQvdHJhY2tfZGVzY3JpcHRvci5wYnplcm8uY2MKKy8vIEludGVudGlvbmFs
bHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RyYWNrX2V2ZW50LnBi
emVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvaW50
ZXJuZWRfZGF0YS9pbnRlcm5lZF9kYXRhLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0
eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdl
bi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX2NvbXBvc2l0b3Jfc2No
ZWR1bGVyX3N0YXRlLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2Vu
L3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfY29tcG9zaXRvcl9zY2hl
ZHVsZXJfc3RhdGUuZ2VuLmgKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZl
dHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfQ09NUE9TSVRPUl9TQ0hFRFVMRVJfU1RBVEVfUFJP
VE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
VFJBQ0tfRVZFTlRfQ0hST01FX0NPTVBPU0lUT1JfU0NIRURVTEVSX1NUQVRFX1BST1RPX0NQUF9I
XworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZl
Y3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBf
bWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgQ29tcG9z
aXRvclRpbWluZ0hpc3Rvcnk7CitjbGFzcyBCZWdpbkZyYW1lU291cmNlU3RhdGU7CitjbGFzcyBC
ZWdpbkZyYW1lQXJnczsKK2NsYXNzIFNvdXJjZUxvY2F0aW9uOworY2xhc3MgQmVnaW5GcmFtZU9i
c2VydmVyU3RhdGU7CitjbGFzcyBCZWdpbkltcGxGcmFtZUFyZ3M7CitjbGFzcyBCZWdpbkltcGxG
cmFtZUFyZ3NfVGltZXN0YW1wc0luVXM7CitjbGFzcyBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNo
aW5lOworY2xhc3MgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlOworY2xh
c3MgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlOworY2xhc3MgQ2hyb21l
Q29tcG9zaXRvclNjaGVkdWxlclN0YXRlOworZW51bSBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVy
QWN0aW9uIDogaW50OworZW51bSBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGUgOiBp
bnQ7CitlbnVtIEJlZ2luSW1wbEZyYW1lQXJnc19TdGF0ZSA6IGludDsKK2VudW0gQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0eSA6IGludDsKK2VudW0g
Q2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0
ZSA6IGludDsKK2VudW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0Jl
Z2luSW1wbEZyYW1lU3RhdGUgOiBpbnQ7CitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hp
bmVfTWFqb3JTdGF0ZV9CZWdpbk1haW5GcmFtZVN0YXRlIDogaW50OworZW51bSBDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGUgOiBp
bnQ7CitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9Gb3JjZWRS
ZWRyYXdPblRpbWVvdXRTdGF0ZSA6IGludDsKK2VudW0gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxl
clN0YXRlX0JlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlIDogaW50OworfSAgLy8gbmFtZXNwYWNl
IHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisK
K25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBw
cm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFt
ZXNwYWNlIGdlbiB7CitlbnVtIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJBY3Rpb24gOiBpbnQg
eworICBDQ19TQ0hFRFVMRVJfQUNUSU9OX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ0NfU0NIRURVTEVS
X0FDVElPTl9OT05FID0gMSwKKyAgQ0NfU0NIRURVTEVSX0FDVElPTl9TRU5EX0JFR0lOX01BSU5f
RlJBTUUgPSAyLAorICBDQ19TQ0hFRFVMRVJfQUNUSU9OX0NPTU1JVCA9IDMsCisgIENDX1NDSEVE
VUxFUl9BQ1RJT05fQUNUSVZBVEVfU1lOQ19UUkVFID0gNCwKKyAgQ0NfU0NIRURVTEVSX0FDVElP
Tl9EUkFXX0lGX1BPU1NJQkxFID0gNSwKKyAgQ0NfU0NIRURVTEVSX0FDVElPTl9EUkFXX0ZPUkNF
RCA9IDYsCisgIENDX1NDSEVEVUxFUl9BQ1RJT05fRFJBV19BQk9SVCA9IDcsCisgIENDX1NDSEVE
VUxFUl9BQ1RJT05fQkVHSU5fTEFZRVJfVFJFRV9GUkFNRV9TSU5LX0NSRUFUSU9OID0gOCwKKyAg
Q0NfU0NIRURVTEVSX0FDVElPTl9QUkVQQVJFX1RJTEVTID0gOSwKKyAgQ0NfU0NIRURVTEVSX0FD
VElPTl9JTlZBTElEQVRFX0xBWUVSX1RSRUVfRlJBTUVfU0lOSyA9IDEwLAorICBDQ19TQ0hFRFVM
RVJfQUNUSU9OX1BFUkZPUk1fSU1QTF9TSURFX0lOVkFMSURBVElPTiA9IDExLAorICBDQ19TQ0hF
RFVMRVJfQUNUSU9OX05PVElGWV9CRUdJTl9NQUlOX0ZSQU1FX05PVF9FWFBFQ1RFRF9VTlRJTCA9
IDEyLAorICBDQ19TQ0hFRFVMRVJfQUNUSU9OX05PVElGWV9CRUdJTl9NQUlOX0ZSQU1FX05PVF9F
WFBFQ1RFRF9TT09OID0gMTMsCit9OworZW51bSBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJn
c1R5cGUgOiBpbnQgeworICBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGVfQkVHSU5f
RlJBTUVfQVJHU19UWVBFX1VOU1BFQ0lGSUVEID0gMCwKKyAgQmVnaW5GcmFtZUFyZ3NfQmVnaW5G
cmFtZUFyZ3NUeXBlX0JFR0lOX0ZSQU1FX0FSR1NfVFlQRV9JTlZBTElEID0gMSwKKyAgQmVnaW5G
cmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlX0JFR0lOX0ZSQU1FX0FSR1NfVFlQRV9OT1JNQUwg
PSAyLAorICBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGVfQkVHSU5fRlJBTUVfQVJH
U19UWVBFX01JU1NFRCA9IDMsCit9OworZW51bSBCZWdpbkltcGxGcmFtZUFyZ3NfU3RhdGUgOiBp
bnQgeworICBCZWdpbkltcGxGcmFtZUFyZ3NfU3RhdGVfQkVHSU5fRlJBTUVfRklOSVNIRUQgPSAw
LAorICBCZWdpbkltcGxGcmFtZUFyZ3NfU3RhdGVfQkVHSU5fRlJBTUVfVVNJTkcgPSAxLAorfTsK
K2VudW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0
eSA6IGludCB7CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVl
UHJpb3JpdHlfVFJFRV9QUklPUklUWV9VTlNQRUNJRklFRCA9IDAsCisgIENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHlfVFJFRV9QUklPUklUWV9TQU1F
X1BSSU9SSVRZX0ZPUl9CT1RIX1RSRUVTID0gMSwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFj
aGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0eV9UUkVFX1BSSU9SSVRZX1NNT09USE5FU1NfVEFL
RVNfUFJJT1JJVFkgPSAyLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3Rh
dGVfVHJlZVByaW9yaXR5X1RSRUVfUFJJT1JJVFlfTkVXX0NPTlRFTlRfVEFLRVNfUFJJT1JJVFkg
PSAzLAorfTsKK2VudW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Nj
cm9sbEhhbmRsZXJTdGF0ZSA6IGludCB7CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVf
TWlub3JTdGF0ZV9TY3JvbGxIYW5kbGVyU3RhdGVfU0NST0xMX0hBTkRMRVJfVU5TUEVDSUZJRUQg
PSAwLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfU2Nyb2xsSGFu
ZGxlclN0YXRlX1NDUk9MTF9BRkZFQ1RTX1NDUk9MTF9IQU5ETEVSID0gMSwKKyAgQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZV9TQ1JPTExf
RE9FU19OT1RfQUZGRUNUX1NDUk9MTF9IQU5ETEVSID0gMiwKK307CitlbnVtIENocm9tZUNvbXBv
c2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlIDogaW50IHsK
KyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luSW1wbEZyYW1l
U3RhdGVfQkVHSU5fSU1QTF9GUkFNRV9VTlNQRUNJRklFRCA9IDAsCisgIENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlX0JFR0lOX0lNUExf
RlJBTUVfSURMRSA9IDEsCisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0
ZV9CZWdpbkltcGxGcmFtZVN0YXRlX0JFR0lOX0lNUExfRlJBTUVfSU5TSURFX0JFR0lOX0ZSQU1F
ID0gMiwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luSW1w
bEZyYW1lU3RhdGVfQkVHSU5fSU1QTF9GUkFNRV9JTlNJREVfREVBRExJTkUgPSAzLAorfTsKK2Vu
dW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luTWFpbkZyYW1l
U3RhdGUgOiBpbnQgeworICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVf
QmVnaW5NYWluRnJhbWVTdGF0ZV9CRUdJTl9NQUlOX0ZSQU1FX1VOU1BFQ0lGSUVEID0gMCwKKyAg
Q2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3Rh
dGVfQkVHSU5fTUFJTl9GUkFNRV9JRExFID0gMSwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFj
aGluZV9NYWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGVfQkVHSU5fTUFJTl9GUkFNRV9TRU5U
ID0gMiwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luTWFp
bkZyYW1lU3RhdGVfQkVHSU5fTUFJTl9GUkFNRV9SRUFEWV9UT19DT01NSVQgPSAzLAorfTsKK2Vu
dW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1l
U2lua1N0YXRlIDogaW50IHsKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0
YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJBTUVfVU5TUEVDSUZJRUQg
PSAwLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVl
RnJhbWVTaW5rU3RhdGVfTEFZRVJfVFJFRV9GUkFNRV9OT05FID0gMSwKKyAgQ2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVS
X1RSRUVfRlJBTUVfQUNUSVZFID0gMiwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
YWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJBTUVfQ1JFQVRJ
TkcgPSAzLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJU
cmVlRnJhbWVTaW5rU3RhdGVfTEFZRVJfVFJFRV9GUkFNRV9XQUlUSU5HX0ZPUl9GSVJTVF9DT01N
SVQgPSA0LAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJU
cmVlRnJhbWVTaW5rU3RhdGVfTEFZRVJfVFJFRV9GUkFNRV9XQUlUSU5HX0ZPUl9GSVJTVF9BQ1RJ
VkFUSU9OID0gNSwKK307CitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JT
dGF0ZV9Gb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZSA6IGludCB7CisgIENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9Gb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZV9GT1JD
RURfUkVEUkFXX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGlu
ZV9NYWpvclN0YXRlX0ZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlX0ZPUkNFRF9SRURSQVdfSURM
RSA9IDEsCisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9Gb3JjZWRS
ZWRyYXdPblRpbWVvdXRTdGF0ZV9GT1JDRURfUkVEUkFXX1dBSVRJTkdfRk9SX0NPTU1JVCA9IDIs
CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9Gb3JjZWRSZWRyYXdP
blRpbWVvdXRTdGF0ZV9GT1JDRURfUkVEUkFXX1dBSVRJTkdfRk9SX0FDVElWQVRJT04gPSAzLAor
ICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25U
aW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19XQUlUSU5HX0ZPUl9EUkFXID0gNCwKK307CitlbnVt
IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9k
ZSA6IGludCB7CisgIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFt
ZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ2hyb21lQ29t
cG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlX0RFQURMSU5F
X01PREVfTk9ORSA9IDEsCisgIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbklt
cGxGcmFtZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX0lNTUVESUFURSA9IDIsCisgIENocm9t
ZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFE
TElORV9NT0RFX1JFR1VMQVIgPSAzLAorICBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGVf
QmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVfREVBRExJTkVfTU9ERV9MQVRFID0gNCwKKyAgQ2hy
b21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlX0RF
QURMSU5FX01PREVfQkxPQ0tFRCA9IDUsCit9OworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQ29t
cG9zaXRvclRpbWluZ0hpc3RvcnkgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmog
eworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtCZWdpbk1haW5GcmFtZVF1
ZXVlQ3JpdGljYWxFc3RpbWF0ZURlbHRhVXNGaWVsZE51bWJlciA9IDEsCisgICAga0JlZ2luTWFp
bkZyYW1lUXVldWVOb3RDcml0aWNhbEVzdGltYXRlRGVsdGFVc0ZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrQmVnaW5NYWluRnJhbWVTdGFydFRvUmVhZHlUb0NvbW1pdEVzdGltYXRlRGVsdGFVc0ZpZWxk
TnVtYmVyID0gMywKKyAgICBrQ29tbWl0VG9SZWFkeVRvQWN0aXZhdGVFc3RpbWF0ZURlbHRhVXNG
aWVsZE51bWJlciA9IDQsCisgICAga1ByZXBhcmVUaWxlc0VzdGltYXRlRGVsdGFVc0ZpZWxkTnVt
YmVyID0gNSwKKyAgICBrQWN0aXZhdGVFc3RpbWF0ZURlbHRhVXNGaWVsZE51bWJlciA9IDYsCisg
ICAga0RyYXdFc3RpbWF0ZURlbHRhVXNGaWVsZE51bWJlciA9IDcsCisgIH07CisKKyAgQ29tcG9z
aXRvclRpbWluZ0hpc3RvcnkoKTsKKyAgfkNvbXBvc2l0b3JUaW1pbmdIaXN0b3J5KCkgb3ZlcnJp
ZGU7CisgIENvbXBvc2l0b3JUaW1pbmdIaXN0b3J5KENvbXBvc2l0b3JUaW1pbmdIaXN0b3J5JiYp
IG5vZXhjZXB0OworICBDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYgb3BlcmF0b3I9KENvbXBvc2l0
b3JUaW1pbmdIaXN0b3J5JiYpOworICBDb21wb3NpdG9yVGltaW5nSGlzdG9yeShjb25zdCBDb21w
b3NpdG9yVGltaW5nSGlzdG9yeSYpOworICBDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYgb3BlcmF0
b3I9KGNvbnN0IENvbXBvc2l0b3JUaW1pbmdIaXN0b3J5Jik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0o
Y29uc3QgQ29tcG9zaXRvclRpbWluZ0hpc3RvcnkmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNp
emVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qg
b3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25z
dCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25z
dDsKKworICBib29sIGhhc19iZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX2NyaXRpY2FsX2VzdGltYXRl
X2RlbHRhX3VzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgaW50NjRfdCBi
ZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX2NyaXRpY2FsX2VzdGltYXRlX2RlbHRhX3VzKCkgY29uc3Qg
eyByZXR1cm4gYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9jcml0aWNhbF9lc3RpbWF0ZV9kZWx0YV91
c187IH0KKyAgdm9pZCBzZXRfYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9jcml0aWNhbF9lc3RpbWF0
ZV9kZWx0YV91cyhpbnQ2NF90IHZhbHVlKSB7IGJlZ2luX21haW5fZnJhbWVfcXVldWVfY3JpdGlj
YWxfZXN0aW1hdGVfZGVsdGFfdXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisg
IGJvb2wgaGFzX2JlZ2luX21haW5fZnJhbWVfcXVldWVfbm90X2NyaXRpY2FsX2VzdGltYXRlX2Rl
bHRhX3VzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgaW50NjRfdCBiZWdp
bl9tYWluX2ZyYW1lX3F1ZXVlX25vdF9jcml0aWNhbF9lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0
IHsgcmV0dXJuIGJlZ2luX21haW5fZnJhbWVfcXVldWVfbm90X2NyaXRpY2FsX2VzdGltYXRlX2Rl
bHRhX3VzXzsgfQorICB2b2lkIHNldF9iZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX25vdF9jcml0aWNh
bF9lc3RpbWF0ZV9kZWx0YV91cyhpbnQ2NF90IHZhbHVlKSB7IGJlZ2luX21haW5fZnJhbWVfcXVl
dWVfbm90X2NyaXRpY2FsX2VzdGltYXRlX2RlbHRhX3VzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5z
ZXQoMik7IH0KKworICBib29sIGhhc19iZWdpbl9tYWluX2ZyYW1lX3N0YXJ0X3RvX3JlYWR5X3Rv
X2NvbW1pdF9lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNd
OyB9CisgIGludDY0X3QgYmVnaW5fbWFpbl9mcmFtZV9zdGFydF90b19yZWFkeV90b19jb21taXRf
ZXN0aW1hdGVfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBiZWdpbl9tYWluX2ZyYW1lX3N0YXJ0
X3RvX3JlYWR5X3RvX2NvbW1pdF9lc3RpbWF0ZV9kZWx0YV91c187IH0KKyAgdm9pZCBzZXRfYmVn
aW5fbWFpbl9mcmFtZV9zdGFydF90b19yZWFkeV90b19jb21taXRfZXN0aW1hdGVfZGVsdGFfdXMo
aW50NjRfdCB2YWx1ZSkgeyBiZWdpbl9tYWluX2ZyYW1lX3N0YXJ0X3RvX3JlYWR5X3RvX2NvbW1p
dF9lc3RpbWF0ZV9kZWx0YV91c18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyAg
Ym9vbCBoYXNfY29tbWl0X3RvX3JlYWR5X3RvX2FjdGl2YXRlX2VzdGltYXRlX2RlbHRhX3VzKCkg
Y29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAgaW50NjRfdCBjb21taXRfdG9fcmVh
ZHlfdG9fYWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBjb21taXRf
dG9fcmVhZHlfdG9fYWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXNfOyB9CisgIHZvaWQgc2V0X2Nv
bW1pdF90b19yZWFkeV90b19hY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91cyhpbnQ2NF90IHZhbHVl
KSB7IGNvbW1pdF90b19yZWFkeV90b19hY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91c18gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfcHJlcGFyZV90aWxlc19lc3Rp
bWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGludDY0
X3QgcHJlcGFyZV90aWxlc19lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIHByZXBh
cmVfdGlsZXNfZXN0aW1hdGVfZGVsdGFfdXNfOyB9CisgIHZvaWQgc2V0X3ByZXBhcmVfdGlsZXNf
ZXN0aW1hdGVfZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgeyBwcmVwYXJlX3RpbGVzX2VzdGltYXRl
X2RlbHRhX3VzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworICBib29sIGhhc19h
Y3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzZd
OyB9CisgIGludDY0X3QgYWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVy
biBhY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91c187IH0KKyAgdm9pZCBzZXRfYWN0aXZhdGVfZXN0
aW1hdGVfZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgeyBhY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91
c18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisKKyAgYm9vbCBoYXNfZHJhd19lc3Rp
bWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzddOyB9CisgIGludDY0
X3QgZHJhd19lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIGRyYXdfZXN0aW1hdGVf
ZGVsdGFfdXNfOyB9CisgIHZvaWQgc2V0X2RyYXdfZXN0aW1hdGVfZGVsdGFfdXMoaW50NjRfdCB2
YWx1ZSkgeyBkcmF3X2VzdGltYXRlX2RlbHRhX3VzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
Nyk7IH0KKworIHByaXZhdGU6CisgIGludDY0X3QgYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9jcml0
aWNhbF9lc3RpbWF0ZV9kZWx0YV91c197fTsKKyAgaW50NjRfdCBiZWdpbl9tYWluX2ZyYW1lX3F1
ZXVlX25vdF9jcml0aWNhbF9lc3RpbWF0ZV9kZWx0YV91c197fTsKKyAgaW50NjRfdCBiZWdpbl9t
YWluX2ZyYW1lX3N0YXJ0X3RvX3JlYWR5X3RvX2NvbW1pdF9lc3RpbWF0ZV9kZWx0YV91c197fTsK
KyAgaW50NjRfdCBjb21taXRfdG9fcmVhZHlfdG9fYWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXNf
e307CisgIGludDY0X3QgcHJlcGFyZV90aWxlc19lc3RpbWF0ZV9kZWx0YV91c197fTsKKyAgaW50
NjRfdCBhY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91c197fTsKKyAgaW50NjRfdCBkcmF3X2VzdGlt
YXRlX2RlbHRhX3VzX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3Rv
YnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBv
ZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6
OmJpdHNldDw4PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
QmVnaW5GcmFtZVNvdXJjZVN0YXRlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2Jq
IHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrU291cmNlSWRGaWVsZE51
bWJlciA9IDEsCisgICAga1BhdXNlZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrTnVtT2JzZXJ2ZXJz
RmllbGROdW1iZXIgPSAzLAorICAgIGtMYXN0QmVnaW5GcmFtZUFyZ3NGaWVsZE51bWJlciA9IDQs
CisgIH07CisKKyAgQmVnaW5GcmFtZVNvdXJjZVN0YXRlKCk7CisgIH5CZWdpbkZyYW1lU291cmNl
U3RhdGUoKSBvdmVycmlkZTsKKyAgQmVnaW5GcmFtZVNvdXJjZVN0YXRlKEJlZ2luRnJhbWVTb3Vy
Y2VTdGF0ZSYmKSBub2V4Y2VwdDsKKyAgQmVnaW5GcmFtZVNvdXJjZVN0YXRlJiBvcGVyYXRvcj0o
QmVnaW5GcmFtZVNvdXJjZVN0YXRlJiYpOworICBCZWdpbkZyYW1lU291cmNlU3RhdGUoY29uc3Qg
QmVnaW5GcmFtZVNvdXJjZVN0YXRlJik7CisgIEJlZ2luRnJhbWVTb3VyY2VTdGF0ZSYgb3BlcmF0
b3I9KGNvbnN0IEJlZ2luRnJhbWVTb3VyY2VTdGF0ZSYpOworICBib29sIG9wZXJhdG9yPT0oY29u
c3QgQmVnaW5GcmFtZVNvdXJjZVN0YXRlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25z
dCBCZWdpbkZyYW1lU291cmNlU3RhdGUmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09
IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkg
b3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJp
ZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVy
cmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKwor
ICBib29sIGhhc19zb3VyY2VfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQor
ICB1aW50MzJfdCBzb3VyY2VfaWQoKSBjb25zdCB7IHJldHVybiBzb3VyY2VfaWRfOyB9CisgIHZv
aWQgc2V0X3NvdXJjZV9pZCh1aW50MzJfdCB2YWx1ZSkgeyBzb3VyY2VfaWRfID0gdmFsdWU7IF9o
YXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX3BhdXNlZCgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzJdOyB9CisgIGJvb2wgcGF1c2VkKCkgY29uc3QgeyByZXR1cm4gcGF1c2Vk
XzsgfQorICB2b2lkIHNldF9wYXVzZWQoYm9vbCB2YWx1ZSkgeyBwYXVzZWRfID0gdmFsdWU7IF9o
YXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX251bV9vYnNlcnZlcnMoKSBjb25zdCB7
IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICB1aW50MzJfdCBudW1fb2JzZXJ2ZXJzKCkgY29u
c3QgeyByZXR1cm4gbnVtX29ic2VydmVyc187IH0KKyAgdm9pZCBzZXRfbnVtX29ic2VydmVycyh1
aW50MzJfdCB2YWx1ZSkgeyBudW1fb2JzZXJ2ZXJzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
Myk7IH0KKworICBib29sIGhhc19sYXN0X2JlZ2luX2ZyYW1lX2FyZ3MoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1s0XTsgfQorICBjb25zdCBCZWdpbkZyYW1lQXJncyYgbGFzdF9iZWdpbl9m
cmFtZV9hcmdzKCkgY29uc3QgeyByZXR1cm4gKmxhc3RfYmVnaW5fZnJhbWVfYXJnc187IH0KKyAg
QmVnaW5GcmFtZUFyZ3MqIG11dGFibGVfbGFzdF9iZWdpbl9mcmFtZV9hcmdzKCkgeyBfaGFzX2Zp
ZWxkXy5zZXQoNCk7IHJldHVybiBsYXN0X2JlZ2luX2ZyYW1lX2FyZ3NfLmdldCgpOyB9CisKKyBw
cml2YXRlOgorICB1aW50MzJfdCBzb3VyY2VfaWRfe307CisgIGJvb2wgcGF1c2VkX3t9OworICB1
aW50MzJfdCBudW1fb2JzZXJ2ZXJzX3t9OworICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8QmVn
aW5GcmFtZUFyZ3M+IGxhc3RfYmVnaW5fZnJhbWVfYXJnc187CisKKyAgLy8gQWxsb3dzIHRvIHBy
ZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdp
dGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93
bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDU+IF9oYXNfZmllbGRfe307Cit9OworCisKK2Ns
YXNzIFBFUkZFVFRPX0VYUE9SVCBCZWdpbkZyYW1lQXJncyA6IHB1YmxpYyA6OnByb3RvemVybzo6
Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICB1c2luZyBCZWdpbkZyYW1lQXJnc1R5cGUgPSBC
ZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBCRUdJTl9GUkFNRV9BUkdTX1RZUEVfVU5TUEVDSUZJRUQgPSBCZWdpbkZyYW1lQXJnc19CZWdp
bkZyYW1lQXJnc1R5cGVfQkVHSU5fRlJBTUVfQVJHU19UWVBFX1VOU1BFQ0lGSUVEOworICBzdGF0
aWMgY29uc3RleHByIGF1dG8gQkVHSU5fRlJBTUVfQVJHU19UWVBFX0lOVkFMSUQgPSBCZWdpbkZy
YW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGVfQkVHSU5fRlJBTUVfQVJHU19UWVBFX0lOVkFMSUQ7
CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCRUdJTl9GUkFNRV9BUkdTX1RZUEVfTk9STUFMID0g
QmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlX0JFR0lOX0ZSQU1FX0FSR1NfVFlQRV9O
T1JNQUw7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCRUdJTl9GUkFNRV9BUkdTX1RZUEVfTUlT
U0VEID0gQmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlX0JFR0lOX0ZSQU1FX0FSR1Nf
VFlQRV9NSVNTRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCZWdpbkZyYW1lQXJnc1R5cGVf
TUlOID0gQmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlX0JFR0lOX0ZSQU1FX0FSR1Nf
VFlQRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEJlZ2luRnJhbWVBcmdz
VHlwZV9NQVggPSBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGVfQkVHSU5fRlJBTUVf
QVJHU19UWVBFX01JU1NFRDsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtUeXBlRmllbGRO
dW1iZXIgPSAxLAorICAgIGtTb3VyY2VJZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2VxdWVuY2VO
dW1iZXJGaWVsZE51bWJlciA9IDMsCisgICAga0ZyYW1lVGltZVVzRmllbGROdW1iZXIgPSA0LAor
ICAgIGtEZWFkbGluZVVzRmllbGROdW1iZXIgPSA1LAorICAgIGtJbnRlcnZhbERlbHRhVXNGaWVs
ZE51bWJlciA9IDYsCisgICAga09uQ3JpdGljYWxQYXRoRmllbGROdW1iZXIgPSA3LAorICAgIGtB
bmltYXRlT25seUZpZWxkTnVtYmVyID0gOCwKKyAgICBrU291cmNlTG9jYXRpb25JaWRGaWVsZE51
bWJlciA9IDksCisgICAga1NvdXJjZUxvY2F0aW9uRmllbGROdW1iZXIgPSAxMCwKKyAgfTsKKwor
ICBCZWdpbkZyYW1lQXJncygpOworICB+QmVnaW5GcmFtZUFyZ3MoKSBvdmVycmlkZTsKKyAgQmVn
aW5GcmFtZUFyZ3MoQmVnaW5GcmFtZUFyZ3MmJikgbm9leGNlcHQ7CisgIEJlZ2luRnJhbWVBcmdz
JiBvcGVyYXRvcj0oQmVnaW5GcmFtZUFyZ3MmJik7CisgIEJlZ2luRnJhbWVBcmdzKGNvbnN0IEJl
Z2luRnJhbWVBcmdzJik7CisgIEJlZ2luRnJhbWVBcmdzJiBvcGVyYXRvcj0oY29uc3QgQmVnaW5G
cmFtZUFyZ3MmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJlZ2luRnJhbWVBcmdzJikgY29u
c3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCZWdpbkZyYW1lQXJncyYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3R5cGUoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1sxXTsgfQorICBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGUgdHlwZSgp
IGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisgIHZvaWQgc2V0X3R5cGUoQmVnaW5GcmFtZUFyZ3Nf
QmVnaW5GcmFtZUFyZ3NUeXBlIHZhbHVlKSB7IHR5cGVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxKTsgfQorCisgIGJvb2wgaGFzX3NvdXJjZV9pZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzJdOyB9CisgIHVpbnQ2NF90IHNvdXJjZV9pZCgpIGNvbnN0IHsgcmV0dXJuIHNvdXJjZV9p
ZF87IH0KKyAgdm9pZCBzZXRfc291cmNlX2lkKHVpbnQ2NF90IHZhbHVlKSB7IHNvdXJjZV9pZF8g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfc2VxdWVuY2VfbnVt
YmVyKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDY0X3Qgc2VxdWVu
Y2VfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gc2VxdWVuY2VfbnVtYmVyXzsgfQorICB2b2lkIHNl
dF9zZXF1ZW5jZV9udW1iZXIodWludDY0X3QgdmFsdWUpIHsgc2VxdWVuY2VfbnVtYmVyXyA9IHZh
bHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29sIGhhc19mcmFtZV90aW1lX3VzKCkg
Y29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAgaW50NjRfdCBmcmFtZV90aW1lX3Vz
KCkgY29uc3QgeyByZXR1cm4gZnJhbWVfdGltZV91c187IH0KKyAgdm9pZCBzZXRfZnJhbWVfdGlt
ZV91cyhpbnQ2NF90IHZhbHVlKSB7IGZyYW1lX3RpbWVfdXNfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCg0KTsgfQorCisgIGJvb2wgaGFzX2RlYWRsaW5lX3VzKCkgY29uc3QgeyByZXR1cm4gX2hh
c19maWVsZF9bNV07IH0KKyAgaW50NjRfdCBkZWFkbGluZV91cygpIGNvbnN0IHsgcmV0dXJuIGRl
YWRsaW5lX3VzXzsgfQorICB2b2lkIHNldF9kZWFkbGluZV91cyhpbnQ2NF90IHZhbHVlKSB7IGRl
YWRsaW5lX3VzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworICBib29sIGhhc19p
bnRlcnZhbF9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzZdOyB9CisgIGlu
dDY0X3QgaW50ZXJ2YWxfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBpbnRlcnZhbF9kZWx0YV91
c187IH0KKyAgdm9pZCBzZXRfaW50ZXJ2YWxfZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgeyBpbnRl
cnZhbF9kZWx0YV91c18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisKKyAgYm9vbCBo
YXNfb25fY3JpdGljYWxfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzddOyB9Cisg
IGJvb2wgb25fY3JpdGljYWxfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG9uX2NyaXRpY2FsX3BhdGhf
OyB9CisgIHZvaWQgc2V0X29uX2NyaXRpY2FsX3BhdGgoYm9vbCB2YWx1ZSkgeyBvbl9jcml0aWNh
bF9wYXRoXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNyk7IH0KKworICBib29sIGhhc19hbmlt
YXRlX29ubHkoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s4XTsgfQorICBib29sIGFuaW1h
dGVfb25seSgpIGNvbnN0IHsgcmV0dXJuIGFuaW1hdGVfb25seV87IH0KKyAgdm9pZCBzZXRfYW5p
bWF0ZV9vbmx5KGJvb2wgdmFsdWUpIHsgYW5pbWF0ZV9vbmx5XyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoOCk7IH0KKworICBib29sIGhhc19zb3VyY2VfbG9jYXRpb25faWlkKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bOV07IH0KKyAgdWludDY0X3Qgc291cmNlX2xvY2F0aW9uX2lpZCgp
IGNvbnN0IHsgcmV0dXJuIHNvdXJjZV9sb2NhdGlvbl9paWRfOyB9CisgIHZvaWQgc2V0X3NvdXJj
ZV9sb2NhdGlvbl9paWQodWludDY0X3QgdmFsdWUpIHsgc291cmNlX2xvY2F0aW9uX2lpZF8gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDkpOyB9CisKKyAgYm9vbCBoYXNfc291cmNlX2xvY2F0aW9u
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTBdOyB9CisgIGNvbnN0IFNvdXJjZUxvY2F0
aW9uJiBzb3VyY2VfbG9jYXRpb24oKSBjb25zdCB7IHJldHVybiAqc291cmNlX2xvY2F0aW9uXzsg
fQorICBTb3VyY2VMb2NhdGlvbiogbXV0YWJsZV9zb3VyY2VfbG9jYXRpb24oKSB7IF9oYXNfZmll
bGRfLnNldCgxMCk7IHJldHVybiBzb3VyY2VfbG9jYXRpb25fLmdldCgpOyB9CisKKyBwcml2YXRl
OgorICBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGUgdHlwZV97fTsKKyAgdWludDY0
X3Qgc291cmNlX2lkX3t9OworICB1aW50NjRfdCBzZXF1ZW5jZV9udW1iZXJfe307CisgIGludDY0
X3QgZnJhbWVfdGltZV91c197fTsKKyAgaW50NjRfdCBkZWFkbGluZV91c197fTsKKyAgaW50NjRf
dCBpbnRlcnZhbF9kZWx0YV91c197fTsKKyAgYm9vbCBvbl9jcml0aWNhbF9wYXRoX3t9OworICBi
b29sIGFuaW1hdGVfb25seV97fTsKKyAgdWludDY0X3Qgc291cmNlX2xvY2F0aW9uX2lpZF97fTsK
KyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPFNvdXJjZUxvY2F0aW9uPiBzb3VyY2VfbG9jYXRp
b25fOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBm
b3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmls
ZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwxMT4g
X2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEJlZ2luRnJhbWVP
YnNlcnZlclN0YXRlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJs
aWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrRHJvcHBlZEJlZ2luRnJhbWVBcmdzRmll
bGROdW1iZXIgPSAxLAorICAgIGtMYXN0QmVnaW5GcmFtZUFyZ3NGaWVsZE51bWJlciA9IDIsCisg
IH07CisKKyAgQmVnaW5GcmFtZU9ic2VydmVyU3RhdGUoKTsKKyAgfkJlZ2luRnJhbWVPYnNlcnZl
clN0YXRlKCkgb3ZlcnJpZGU7CisgIEJlZ2luRnJhbWVPYnNlcnZlclN0YXRlKEJlZ2luRnJhbWVP
YnNlcnZlclN0YXRlJiYpIG5vZXhjZXB0OworICBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZSYgb3Bl
cmF0b3I9KEJlZ2luRnJhbWVPYnNlcnZlclN0YXRlJiYpOworICBCZWdpbkZyYW1lT2JzZXJ2ZXJT
dGF0ZShjb25zdCBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZSYpOworICBCZWdpbkZyYW1lT2JzZXJ2
ZXJTdGF0ZSYgb3BlcmF0b3I9KGNvbnN0IEJlZ2luRnJhbWVPYnNlcnZlclN0YXRlJik7CisgIGJv
b2wgb3BlcmF0b3I9PShjb25zdCBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZSYpIGNvbnN0OworICBi
b29sIG9wZXJhdG9yIT0oY29uc3QgQmVnaW5GcmFtZU9ic2VydmVyU3RhdGUmIG90aGVyKSBjb25z
dCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXko
Y29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFz
U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6
ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86
Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19kcm9wcGVkX2JlZ2luX2ZyYW1lX2FyZ3Mo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQ2NF90IGRyb3BwZWRfYmVn
aW5fZnJhbWVfYXJncygpIGNvbnN0IHsgcmV0dXJuIGRyb3BwZWRfYmVnaW5fZnJhbWVfYXJnc187
IH0KKyAgdm9pZCBzZXRfZHJvcHBlZF9iZWdpbl9mcmFtZV9hcmdzKGludDY0X3QgdmFsdWUpIHsg
ZHJvcHBlZF9iZWdpbl9mcmFtZV9hcmdzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0K
KworICBib29sIGhhc19sYXN0X2JlZ2luX2ZyYW1lX2FyZ3MoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1syXTsgfQorICBjb25zdCBCZWdpbkZyYW1lQXJncyYgbGFzdF9iZWdpbl9mcmFtZV9h
cmdzKCkgY29uc3QgeyByZXR1cm4gKmxhc3RfYmVnaW5fZnJhbWVfYXJnc187IH0KKyAgQmVnaW5G
cmFtZUFyZ3MqIG11dGFibGVfbGFzdF9iZWdpbl9mcmFtZV9hcmdzKCkgeyBfaGFzX2ZpZWxkXy5z
ZXQoMik7IHJldHVybiBsYXN0X2JlZ2luX2ZyYW1lX2FyZ3NfLmdldCgpOyB9CisKKyBwcml2YXRl
OgorICBpbnQ2NF90IGRyb3BwZWRfYmVnaW5fZnJhbWVfYXJnc197fTsKKyAgOjpwcm90b3plcm86
OkNvcHlhYmxlUHRyPEJlZ2luRnJhbWVBcmdzPiBsYXN0X2JlZ2luX2ZyYW1lX2FyZ3NfOworCisg
IC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0
aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0
ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwzPiBfaGFzX2ZpZWxk
X3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQmVnaW5JbXBsRnJhbWVBcmdzIDog
cHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIFRp
bWVzdGFtcHNJblVzID0gQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzOworICB1c2lu
ZyBTdGF0ZSA9IEJlZ2luSW1wbEZyYW1lQXJnc19TdGF0ZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBh
dXRvIEJFR0lOX0ZSQU1FX0ZJTklTSEVEID0gQmVnaW5JbXBsRnJhbWVBcmdzX1N0YXRlX0JFR0lO
X0ZSQU1FX0ZJTklTSEVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQkVHSU5fRlJBTUVfVVNJ
TkcgPSBCZWdpbkltcGxGcmFtZUFyZ3NfU3RhdGVfQkVHSU5fRlJBTUVfVVNJTkc7CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBTdGF0ZV9NSU4gPSBCZWdpbkltcGxGcmFtZUFyZ3NfU3RhdGVfQkVH
SU5fRlJBTUVfRklOSVNIRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTdGF0ZV9NQVggPSBC
ZWdpbkltcGxGcmFtZUFyZ3NfU3RhdGVfQkVHSU5fRlJBTUVfVVNJTkc7CisgIGVudW0gRmllbGRO
dW1iZXJzIHsKKyAgICBrVXBkYXRlZEF0VXNGaWVsZE51bWJlciA9IDEsCisgICAga0ZpbmlzaGVk
QXRVc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrU3RhdGVGaWVsZE51bWJlciA9IDMsCisgICAga0N1
cnJlbnRBcmdzRmllbGROdW1iZXIgPSA0LAorICAgIGtMYXN0QXJnc0ZpZWxkTnVtYmVyID0gNSwK
KyAgICBrVGltZXN0YW1wc0luVXNGaWVsZE51bWJlciA9IDYsCisgIH07CisKKyAgQmVnaW5JbXBs
RnJhbWVBcmdzKCk7CisgIH5CZWdpbkltcGxGcmFtZUFyZ3MoKSBvdmVycmlkZTsKKyAgQmVnaW5J
bXBsRnJhbWVBcmdzKEJlZ2luSW1wbEZyYW1lQXJncyYmKSBub2V4Y2VwdDsKKyAgQmVnaW5JbXBs
RnJhbWVBcmdzJiBvcGVyYXRvcj0oQmVnaW5JbXBsRnJhbWVBcmdzJiYpOworICBCZWdpbkltcGxG
cmFtZUFyZ3MoY29uc3QgQmVnaW5JbXBsRnJhbWVBcmdzJik7CisgIEJlZ2luSW1wbEZyYW1lQXJn
cyYgb3BlcmF0b3I9KGNvbnN0IEJlZ2luSW1wbEZyYW1lQXJncyYpOworICBib29sIG9wZXJhdG9y
PT0oY29uc3QgQmVnaW5JbXBsRnJhbWVBcmdzJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShj
b25zdCBCZWdpbkltcGxGcmFtZUFyZ3MmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09
IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkg
b3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJp
ZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVy
cmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKwor
ICBib29sIGhhc191cGRhdGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07
IH0KKyAgaW50NjRfdCB1cGRhdGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gdXBkYXRlZF9hdF91
c187IH0KKyAgdm9pZCBzZXRfdXBkYXRlZF9hdF91cyhpbnQ2NF90IHZhbHVlKSB7IHVwZGF0ZWRf
YXRfdXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2Zpbmlz
aGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgaW50NjRfdCBm
aW5pc2hlZF9hdF91cygpIGNvbnN0IHsgcmV0dXJuIGZpbmlzaGVkX2F0X3VzXzsgfQorICB2b2lk
IHNldF9maW5pc2hlZF9hdF91cyhpbnQ2NF90IHZhbHVlKSB7IGZpbmlzaGVkX2F0X3VzXyA9IHZh
bHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc19zdGF0ZSgpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIEJlZ2luSW1wbEZyYW1lQXJnc19TdGF0ZSBzdGF0
ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQorICB2b2lkIHNldF9zdGF0ZShCZWdpbkltcGxG
cmFtZUFyZ3NfU3RhdGUgdmFsdWUpIHsgc3RhdGVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgz
KTsgfQorCisgIGJvb2wgaGFzX2N1cnJlbnRfYXJncygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzRdOyB9CisgIGNvbnN0IEJlZ2luRnJhbWVBcmdzJiBjdXJyZW50X2FyZ3MoKSBjb25zdCB7
IHJldHVybiAqY3VycmVudF9hcmdzXzsgfQorICBCZWdpbkZyYW1lQXJncyogbXV0YWJsZV9jdXJy
ZW50X2FyZ3MoKSB7IF9oYXNfZmllbGRfLnNldCg0KTsgcmV0dXJuIGN1cnJlbnRfYXJnc18uZ2V0
KCk7IH0KKworICBib29sIGhhc19sYXN0X2FyZ3MoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1s1XTsgfQorICBjb25zdCBCZWdpbkZyYW1lQXJncyYgbGFzdF9hcmdzKCkgY29uc3QgeyByZXR1
cm4gKmxhc3RfYXJnc187IH0KKyAgQmVnaW5GcmFtZUFyZ3MqIG11dGFibGVfbGFzdF9hcmdzKCkg
eyBfaGFzX2ZpZWxkXy5zZXQoNSk7IHJldHVybiBsYXN0X2FyZ3NfLmdldCgpOyB9CisKKyAgYm9v
bCBoYXNfdGltZXN0YW1wc19pbl91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzZdOyB9
CisgIGNvbnN0IEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5VcyYgdGltZXN0YW1wc19p
bl91cygpIGNvbnN0IHsgcmV0dXJuICp0aW1lc3RhbXBzX2luX3VzXzsgfQorICBCZWdpbkltcGxG
cmFtZUFyZ3NfVGltZXN0YW1wc0luVXMqIG11dGFibGVfdGltZXN0YW1wc19pbl91cygpIHsgX2hh
c19maWVsZF8uc2V0KDYpOyByZXR1cm4gdGltZXN0YW1wc19pbl91c18uZ2V0KCk7IH0KKworIHBy
aXZhdGU6CisgIGludDY0X3QgdXBkYXRlZF9hdF91c197fTsKKyAgaW50NjRfdCBmaW5pc2hlZF9h
dF91c197fTsKKyAgQmVnaW5JbXBsRnJhbWVBcmdzX1N0YXRlIHN0YXRlX3t9OworICA6OnByb3Rv
emVybzo6Q29weWFibGVQdHI8QmVnaW5GcmFtZUFyZ3M+IGN1cnJlbnRfYXJnc187CisgIDo6cHJv
dG96ZXJvOjpDb3B5YWJsZVB0cjxCZWdpbkZyYW1lQXJncz4gbGFzdF9hcmdzXzsKKyAgOjpwcm90
b3plcm86OkNvcHlhYmxlUHRyPEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5Vcz4gdGlt
ZXN0YW1wc19pbl91c187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9i
dWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9m
IC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6
Yml0c2V0PDc+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBC
ZWdpbkltcGxGcmFtZUFyZ3NfVGltZXN0YW1wc0luVXMgOiBwdWJsaWMgOjpwcm90b3plcm86OkNw
cE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtJbnRl
cnZhbERlbHRhRmllbGROdW1iZXIgPSAxLAorICAgIGtOb3dUb0RlYWRsaW5lRGVsdGFGaWVsZE51
bWJlciA9IDIsCisgICAga0ZyYW1lVGltZVRvTm93RGVsdGFGaWVsZE51bWJlciA9IDMsCisgICAg
a0ZyYW1lVGltZVRvRGVhZGxpbmVEZWx0YUZpZWxkTnVtYmVyID0gNCwKKyAgICBrTm93RmllbGRO
dW1iZXIgPSA1LAorICAgIGtGcmFtZVRpbWVGaWVsZE51bWJlciA9IDYsCisgICAga0RlYWRsaW5l
RmllbGROdW1iZXIgPSA3LAorICB9OworCisgIEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBz
SW5VcygpOworICB+QmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzKCkgb3ZlcnJpZGU7
CisgIEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5VcyhCZWdpbkltcGxGcmFtZUFyZ3Nf
VGltZXN0YW1wc0luVXMmJikgbm9leGNlcHQ7CisgIEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3Rh
bXBzSW5VcyYgb3BlcmF0b3I9KEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5VcyYmKTsK
KyAgQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzKGNvbnN0IEJlZ2luSW1wbEZyYW1l
QXJnc19UaW1lc3RhbXBzSW5VcyYpOworICBCZWdpbkltcGxGcmFtZUFyZ3NfVGltZXN0YW1wc0lu
VXMmIG9wZXJhdG9yPShjb25zdCBCZWdpbkltcGxGcmFtZUFyZ3NfVGltZXN0YW1wc0luVXMmKTsK
KyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5V
cyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgQmVnaW5JbXBsRnJhbWVBcmdzX1Rp
bWVzdGFtcHNJblVzJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0K
KworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOwor
ICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6
OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZv
aWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNf
aW50ZXJ2YWxfZGVsdGEoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQ2
NF90IGludGVydmFsX2RlbHRhKCkgY29uc3QgeyByZXR1cm4gaW50ZXJ2YWxfZGVsdGFfOyB9Cisg
IHZvaWQgc2V0X2ludGVydmFsX2RlbHRhKGludDY0X3QgdmFsdWUpIHsgaW50ZXJ2YWxfZGVsdGFf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX25vd190b19kZWFk
bGluZV9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGludDY0X3Qg
bm93X3RvX2RlYWRsaW5lX2RlbHRhKCkgY29uc3QgeyByZXR1cm4gbm93X3RvX2RlYWRsaW5lX2Rl
bHRhXzsgfQorICB2b2lkIHNldF9ub3dfdG9fZGVhZGxpbmVfZGVsdGEoaW50NjRfdCB2YWx1ZSkg
eyBub3dfdG9fZGVhZGxpbmVfZGVsdGFfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQor
CisgIGJvb2wgaGFzX2ZyYW1lX3RpbWVfdG9fbm93X2RlbHRhKCkgY29uc3QgeyByZXR1cm4gX2hh
c19maWVsZF9bM107IH0KKyAgaW50NjRfdCBmcmFtZV90aW1lX3RvX25vd19kZWx0YSgpIGNvbnN0
IHsgcmV0dXJuIGZyYW1lX3RpbWVfdG9fbm93X2RlbHRhXzsgfQorICB2b2lkIHNldF9mcmFtZV90
aW1lX3RvX25vd19kZWx0YShpbnQ2NF90IHZhbHVlKSB7IGZyYW1lX3RpbWVfdG9fbm93X2RlbHRh
XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29sIGhhc19mcmFtZV90aW1l
X3RvX2RlYWRsaW5lX2RlbHRhKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAg
aW50NjRfdCBmcmFtZV90aW1lX3RvX2RlYWRsaW5lX2RlbHRhKCkgY29uc3QgeyByZXR1cm4gZnJh
bWVfdGltZV90b19kZWFkbGluZV9kZWx0YV87IH0KKyAgdm9pZCBzZXRfZnJhbWVfdGltZV90b19k
ZWFkbGluZV9kZWx0YShpbnQ2NF90IHZhbHVlKSB7IGZyYW1lX3RpbWVfdG9fZGVhZGxpbmVfZGVs
dGFfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgIGJvb2wgaGFzX25vdygpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGludDY0X3Qgbm93KCkgY29uc3QgeyBy
ZXR1cm4gbm93XzsgfQorICB2b2lkIHNldF9ub3coaW50NjRfdCB2YWx1ZSkgeyBub3dfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCg1KTsgfQorCisgIGJvb2wgaGFzX2ZyYW1lX3RpbWUoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1s2XTsgfQorICBpbnQ2NF90IGZyYW1lX3RpbWUoKSBjb25z
dCB7IHJldHVybiBmcmFtZV90aW1lXzsgfQorICB2b2lkIHNldF9mcmFtZV90aW1lKGludDY0X3Qg
dmFsdWUpIHsgZnJhbWVfdGltZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisKKyAg
Ym9vbCBoYXNfZGVhZGxpbmUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s3XTsgfQorICBp
bnQ2NF90IGRlYWRsaW5lKCkgY29uc3QgeyByZXR1cm4gZGVhZGxpbmVfOyB9CisgIHZvaWQgc2V0
X2RlYWRsaW5lKGludDY0X3QgdmFsdWUpIHsgZGVhZGxpbmVfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCg3KTsgfQorCisgcHJpdmF0ZToKKyAgaW50NjRfdCBpbnRlcnZhbF9kZWx0YV97fTsKKyAg
aW50NjRfdCBub3dfdG9fZGVhZGxpbmVfZGVsdGFfe307CisgIGludDY0X3QgZnJhbWVfdGltZV90
b19ub3dfZGVsdGFfe307CisgIGludDY0X3QgZnJhbWVfdGltZV90b19kZWFkbGluZV9kZWx0YV97
fTsKKyAgaW50NjRfdCBub3dfe307CisgIGludDY0X3QgZnJhbWVfdGltZV97fTsKKyAgaW50NjRf
dCBkZWFkbGluZV97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1
ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2Yg
LnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpi
aXRzZXQ8OD4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENo
cm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmUgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3Nh
Z2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgTWFqb3JTdGF0ZSA9IENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZTsKKyAgdXNpbmcgTWlub3JTdGF0ZSA9IENocm9tZUNvbXBv
c2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZTsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAg
IGtNYWpvclN0YXRlRmllbGROdW1iZXIgPSAxLAorICAgIGtNaW5vclN0YXRlRmllbGROdW1iZXIg
PSAyLAorICB9OworCisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmUoKTsKKyAgfkNocm9t
ZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmUoKSBvdmVycmlkZTsKKyAgQ2hyb21lQ29tcG9zaXRvclN0
YXRlTWFjaGluZShDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lJiYpIG5vZXhjZXB0OworICBD
aHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lJiBvcGVyYXRvcj0oQ2hyb21lQ29tcG9zaXRvclN0
YXRlTWFjaGluZSYmKTsKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZShjb25zdCBDaHJv
bWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lJik7CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hp
bmUmIG9wZXJhdG9yPShjb25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lJik7CisgIGJv
b2wgb3BlcmF0b3I9PShjb25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lJikgY29uc3Q7
CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lJiBv
dGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90
PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6
cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfbWFqb3Jfc3RhdGUoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBDaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01ham9yU3RhdGUmIG1ham9yX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gKm1h
am9yX3N0YXRlXzsgfQorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGUq
IG11dGFibGVfbWFqb3Jfc3RhdGUoKSB7IF9oYXNfZmllbGRfLnNldCgxKTsgcmV0dXJuIG1ham9y
X3N0YXRlXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX21pbm9yX3N0YXRlKCkgY29uc3QgeyByZXR1
cm4gX2hhc19maWVsZF9bMl07IH0KKyAgY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGlu
ZV9NaW5vclN0YXRlJiBtaW5vcl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuICptaW5vcl9zdGF0ZV87
IH0KKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlKiBtdXRhYmxlX21p
bm9yX3N0YXRlKCkgeyBfaGFzX2ZpZWxkXy5zZXQoMik7IHJldHVybiBtaW5vcl9zdGF0ZV8uZ2V0
KCk7IH0KKworIHByaXZhdGU6CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGU+IG1ham9yX3N0YXRlXzsKKyAgOjpwcm90b3pl
cm86OkNvcHlhYmxlUHRyPENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZT4g
bWlub3Jfc3RhdGVfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVm
IGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAu
cHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJp
dHNldDwzPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQ2hy
b21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlIDogcHVibGljIDo6cHJvdG96ZXJv
OjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIFRyZWVQcmlvcml0eSA9IENocm9t
ZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHk7CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBUUkVFX1BSSU9SSVRZX1VOU1BFQ0lGSUVEID0gQ2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0eV9UUkVFX1BSSU9SSVRZX1VO
U1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFJFRV9QUklPUklUWV9TQU1FX1BS
SU9SSVRZX0ZPUl9CT1RIX1RSRUVTID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5v
clN0YXRlX1RyZWVQcmlvcml0eV9UUkVFX1BSSU9SSVRZX1NBTUVfUFJJT1JJVFlfRk9SX0JPVEhf
VFJFRVM7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUUkVFX1BSSU9SSVRZX1NNT09USE5FU1Nf
VEFLRVNfUFJJT1JJVFkgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVf
VHJlZVByaW9yaXR5X1RSRUVfUFJJT1JJVFlfU01PT1RITkVTU19UQUtFU19QUklPUklUWTsKKyAg
c3RhdGljIGNvbnN0ZXhwciBhdXRvIFRSRUVfUFJJT1JJVFlfTkVXX0NPTlRFTlRfVEFLRVNfUFJJ
T1JJVFkgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfVHJlZVByaW9y
aXR5X1RSRUVfUFJJT1JJVFlfTkVXX0NPTlRFTlRfVEFLRVNfUFJJT1JJVFk7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBUcmVlUHJpb3JpdHlfTUlOID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFj
aGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0eV9UUkVFX1BSSU9SSVRZX1VOU1BFQ0lGSUVEOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gVHJlZVByaW9yaXR5X01BWCA9IENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHlfVFJFRV9QUklPUklUWV9ORVdf
Q09OVEVOVF9UQUtFU19QUklPUklUWTsKKyAgdXNpbmcgU2Nyb2xsSGFuZGxlclN0YXRlID0gQ2hy
b21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZTsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNDUk9MTF9IQU5ETEVSX1VOU1BFQ0lGSUVEID0gQ2hy
b21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZV9T
Q1JPTExfSEFORExFUl9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNDUk9M
TF9BRkZFQ1RTX1NDUk9MTF9IQU5ETEVSID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
aW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZV9TQ1JPTExfQUZGRUNUU19TQ1JPTExfSEFORExF
UjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNDUk9MTF9ET0VTX05PVF9BRkZFQ1RfU0NST0xM
X0hBTkRMRVIgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfU2Nyb2xs
SGFuZGxlclN0YXRlX1NDUk9MTF9ET0VTX05PVF9BRkZFQ1RfU0NST0xMX0hBTkRMRVI7CisgIHN0
YXRpYyBjb25zdGV4cHIgYXV0byBTY3JvbGxIYW5kbGVyU3RhdGVfTUlOID0gQ2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZV9TQ1JPTExfSEFO
RExFUl9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNjcm9sbEhhbmRsZXJT
dGF0ZV9NQVggPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfU2Nyb2xs
SGFuZGxlclN0YXRlX1NDUk9MTF9ET0VTX05PVF9BRkZFQ1RfU0NST0xMX0hBTkRMRVI7CisgIGVu
dW0gRmllbGROdW1iZXJzIHsKKyAgICBrQ29tbWl0Q291bnRGaWVsZE51bWJlciA9IDEsCisgICAg
a0N1cnJlbnRGcmFtZU51bWJlckZpZWxkTnVtYmVyID0gMiwKKyAgICBrTGFzdEZyYW1lTnVtYmVy
U3VibWl0UGVyZm9ybWVkRmllbGROdW1iZXIgPSAzLAorICAgIGtMYXN0RnJhbWVOdW1iZXJEcmF3
UGVyZm9ybWVkRmllbGROdW1iZXIgPSA0LAorICAgIGtMYXN0RnJhbWVOdW1iZXJCZWdpbk1haW5G
cmFtZVNlbnRGaWVsZE51bWJlciA9IDUsCisgICAga0RpZERyYXdGaWVsZE51bWJlciA9IDYsCisg
ICAga0RpZFNlbmRCZWdpbk1haW5GcmFtZUZvckN1cnJlbnRGcmFtZUZpZWxkTnVtYmVyID0gNywK
KyAgICBrRGlkTm90aWZ5QmVnaW5NYWluRnJhbWVOb3RFeHBlY3RlZFVudGlsRmllbGROdW1iZXIg
PSA4LAorICAgIGtEaWROb3RpZnlCZWdpbk1haW5GcmFtZU5vdEV4cGVjdGVkU29vbkZpZWxkTnVt
YmVyID0gOSwKKyAgICBrV2FudHNCZWdpbk1haW5GcmFtZU5vdEV4cGVjdGVkRmllbGROdW1iZXIg
PSAxMCwKKyAgICBrRGlkQ29tbWl0RHVyaW5nRnJhbWVGaWVsZE51bWJlciA9IDExLAorICAgIGtE
aWRJbnZhbGlkYXRlTGF5ZXJUcmVlRnJhbWVTaW5rRmllbGROdW1iZXIgPSAxMiwKKyAgICBrRGlk
UGVyZm9ybUltcGxTaWRlSW52YWxpZGFpb25GaWVsZE51bWJlciA9IDEzLAorICAgIGtEaWRQcmVw
YXJlVGlsZXNGaWVsZE51bWJlciA9IDE0LAorICAgIGtDb25zZWN1dGl2ZUNoZWNrZXJib2FyZEFu
aW1hdGlvbnNGaWVsZE51bWJlciA9IDE1LAorICAgIGtQZW5kaW5nU3VibWl0RnJhbWVzRmllbGRO
dW1iZXIgPSAxNiwKKyAgICBrU3VibWl0RnJhbWVzV2l0aEN1cnJlbnRMYXllclRyZWVGcmFtZVNp
bmtGaWVsZE51bWJlciA9IDE3LAorICAgIGtOZWVkc1JlZHJhd0ZpZWxkTnVtYmVyID0gMTgsCisg
ICAga05lZWRzUHJlcGFyZVRpbGVzRmllbGROdW1iZXIgPSAxOSwKKyAgICBrTmVlZHNCZWdpbk1h
aW5GcmFtZUZpZWxkTnVtYmVyID0gMjAsCisgICAga05lZWRzT25lQmVnaW5JbXBsRnJhbWVGaWVs
ZE51bWJlciA9IDIxLAorICAgIGtWaXNpYmxlRmllbGROdW1iZXIgPSAyMiwKKyAgICBrQmVnaW5G
cmFtZVNvdXJjZVBhdXNlZEZpZWxkTnVtYmVyID0gMjMsCisgICAga0NhbkRyYXdGaWVsZE51bWJl
ciA9IDI0LAorICAgIGtSZXNvdXJjZWxlc3NEcmF3RmllbGROdW1iZXIgPSAyNSwKKyAgICBrSGFz
UGVuZGluZ1RyZWVGaWVsZE51bWJlciA9IDI2LAorICAgIGtQZW5kaW5nVHJlZUlzUmVhZHlGb3JB
Y3RpdmF0aW9uRmllbGROdW1iZXIgPSAyNywKKyAgICBrQWN0aXZlVHJlZU5lZWRzRmlyc3REcmF3
RmllbGROdW1iZXIgPSAyOCwKKyAgICBrQWN0aXZlVHJlZUlzUmVhZHlUb0RyYXdGaWVsZE51bWJl
ciA9IDI5LAorICAgIGtEaWRDcmVhdGVBbmRJbml0aWFsaXplRmlyc3RMYXllclRyZWVGcmFtZVNp
bmtGaWVsZE51bWJlciA9IDMwLAorICAgIGtUcmVlUHJpb3JpdHlGaWVsZE51bWJlciA9IDMxLAor
ICAgIGtTY3JvbGxIYW5kbGVyU3RhdGVGaWVsZE51bWJlciA9IDMyLAorICAgIGtDcml0aWNhbEJl
Z2luTWFpbkZyYW1lVG9BY3RpdmF0ZUlzRmFzdEZpZWxkTnVtYmVyID0gMzMsCisgICAga01haW5U
aHJlYWRNaXNzZWRMYXN0RGVhZGxpbmVGaWVsZE51bWJlciA9IDM0LAorICAgIGtTa2lwTmV4dEJl
Z2luTWFpbkZyYW1lVG9SZWR1Y2VMYXRlbmN5RmllbGROdW1iZXIgPSAzNSwKKyAgICBrVmlkZW9O
ZWVkc0JlZ2luRnJhbWVzRmllbGROdW1iZXIgPSAzNiwKKyAgICBrRGVmZXJCZWdpbk1haW5GcmFt
ZUZpZWxkTnVtYmVyID0gMzcsCisgICAga0xhc3RDb21taXRIYWROb1VwZGF0ZXNGaWVsZE51bWJl
ciA9IDM4LAorICAgIGtEaWREcmF3SW5MYXN0RnJhbWVGaWVsZE51bWJlciA9IDM5LAorICAgIGtE
aWRTdWJtaXRJbkxhc3RGcmFtZUZpZWxkTnVtYmVyID0gNDAsCisgICAga05lZWRzSW1wbFNpZGVJ
bnZhbGlkYXRpb25GaWVsZE51bWJlciA9IDQxLAorICAgIGtDdXJyZW50UGVuZGluZ1RyZWVJc0lt
cGxTaWRlRmllbGROdW1iZXIgPSA0MiwKKyAgICBrUHJldmlvdXNQZW5kaW5nVHJlZVdhc0ltcGxT
aWRlRmllbGROdW1iZXIgPSA0MywKKyAgICBrUHJvY2Vzc2luZ0FuaW1hdGlvbldvcmtsZXRzRm9y
QWN0aXZlVHJlZUZpZWxkTnVtYmVyID0gNDQsCisgICAga1Byb2Nlc3NpbmdBbmltYXRpb25Xb3Jr
bGV0c0ZvclBlbmRpbmdUcmVlRmllbGROdW1iZXIgPSA0NSwKKyAgICBrUHJvY2Vzc2luZ1BhaW50
V29ya2xldHNGb3JQZW5kaW5nVHJlZUZpZWxkTnVtYmVyID0gNDYsCisgIH07CisKKyAgQ2hyb21l
Q29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlKCk7CisgIH5DaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01pbm9yU3RhdGUoKSBvdmVycmlkZTsKKyAgQ2hyb21lQ29tcG9zaXRvclN0
YXRlTWFjaGluZV9NaW5vclN0YXRlKENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JT
dGF0ZSYmKSBub2V4Y2VwdDsKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0
YXRlJiBvcGVyYXRvcj0oQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlJiYp
OworICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGUoY29uc3QgQ2hyb21l
Q29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlJik7CisgIENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWlub3JTdGF0ZSYgb3BlcmF0b3I9KGNvbnN0IENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWlub3JTdGF0ZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2hyb21l
Q29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGUmIG90aGVy
KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlh
bGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNl
cmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90
b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19jb21taXRfY291bnQoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQzMl90IGNvbW1pdF9jb3VudCgpIGNv
bnN0IHsgcmV0dXJuIGNvbW1pdF9jb3VudF87IH0KKyAgdm9pZCBzZXRfY29tbWl0X2NvdW50KGlu
dDMyX3QgdmFsdWUpIHsgY29tbWl0X2NvdW50XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7
IH0KKworICBib29sIGhhc19jdXJyZW50X2ZyYW1lX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzJdOyB9CisgIGludDMyX3QgY3VycmVudF9mcmFtZV9udW1iZXIoKSBjb25zdCB7
IHJldHVybiBjdXJyZW50X2ZyYW1lX251bWJlcl87IH0KKyAgdm9pZCBzZXRfY3VycmVudF9mcmFt
ZV9udW1iZXIoaW50MzJfdCB2YWx1ZSkgeyBjdXJyZW50X2ZyYW1lX251bWJlcl8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfbGFzdF9mcmFtZV9udW1iZXJfc3Vi
bWl0X3BlcmZvcm1lZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGludDMy
X3QgbGFzdF9mcmFtZV9udW1iZXJfc3VibWl0X3BlcmZvcm1lZCgpIGNvbnN0IHsgcmV0dXJuIGxh
c3RfZnJhbWVfbnVtYmVyX3N1Ym1pdF9wZXJmb3JtZWRfOyB9CisgIHZvaWQgc2V0X2xhc3RfZnJh
bWVfbnVtYmVyX3N1Ym1pdF9wZXJmb3JtZWQoaW50MzJfdCB2YWx1ZSkgeyBsYXN0X2ZyYW1lX251
bWJlcl9zdWJtaXRfcGVyZm9ybWVkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKwor
ICBib29sIGhhc19sYXN0X2ZyYW1lX251bWJlcl9kcmF3X3BlcmZvcm1lZCgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIGludDMyX3QgbGFzdF9mcmFtZV9udW1iZXJfZHJhd19w
ZXJmb3JtZWQoKSBjb25zdCB7IHJldHVybiBsYXN0X2ZyYW1lX251bWJlcl9kcmF3X3BlcmZvcm1l
ZF87IH0KKyAgdm9pZCBzZXRfbGFzdF9mcmFtZV9udW1iZXJfZHJhd19wZXJmb3JtZWQoaW50MzJf
dCB2YWx1ZSkgeyBsYXN0X2ZyYW1lX251bWJlcl9kcmF3X3BlcmZvcm1lZF8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfbGFzdF9mcmFtZV9udW1iZXJfYmVnaW5f
bWFpbl9mcmFtZV9zZW50KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07IH0KKyAgaW50
MzJfdCBsYXN0X2ZyYW1lX251bWJlcl9iZWdpbl9tYWluX2ZyYW1lX3NlbnQoKSBjb25zdCB7IHJl
dHVybiBsYXN0X2ZyYW1lX251bWJlcl9iZWdpbl9tYWluX2ZyYW1lX3NlbnRfOyB9CisgIHZvaWQg
c2V0X2xhc3RfZnJhbWVfbnVtYmVyX2JlZ2luX21haW5fZnJhbWVfc2VudChpbnQzMl90IHZhbHVl
KSB7IGxhc3RfZnJhbWVfbnVtYmVyX2JlZ2luX21haW5fZnJhbWVfc2VudF8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDUpOyB9CisKKyAgYm9vbCBoYXNfZGlkX2RyYXcoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1s2XTsgfQorICBib29sIGRpZF9kcmF3KCkgY29uc3QgeyByZXR1cm4gZGlk
X2RyYXdfOyB9CisgIHZvaWQgc2V0X2RpZF9kcmF3KGJvb2wgdmFsdWUpIHsgZGlkX2RyYXdfID0g
dmFsdWU7IF9oYXNfZmllbGRfLnNldCg2KTsgfQorCisgIGJvb2wgaGFzX2RpZF9zZW5kX2JlZ2lu
X21haW5fZnJhbWVfZm9yX2N1cnJlbnRfZnJhbWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1s3XTsgfQorICBib29sIGRpZF9zZW5kX2JlZ2luX21haW5fZnJhbWVfZm9yX2N1cnJlbnRfZnJh
bWUoKSBjb25zdCB7IHJldHVybiBkaWRfc2VuZF9iZWdpbl9tYWluX2ZyYW1lX2Zvcl9jdXJyZW50
X2ZyYW1lXzsgfQorICB2b2lkIHNldF9kaWRfc2VuZF9iZWdpbl9tYWluX2ZyYW1lX2Zvcl9jdXJy
ZW50X2ZyYW1lKGJvb2wgdmFsdWUpIHsgZGlkX3NlbmRfYmVnaW5fbWFpbl9mcmFtZV9mb3JfY3Vy
cmVudF9mcmFtZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDcpOyB9CisKKyAgYm9vbCBoYXNf
ZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZF91bnRpbCgpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzhdOyB9CisgIGJvb2wgZGlkX25vdGlmeV9iZWdpbl9tYWluX2Zy
YW1lX25vdF9leHBlY3RlZF91bnRpbCgpIGNvbnN0IHsgcmV0dXJuIGRpZF9ub3RpZnlfYmVnaW5f
bWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfdW50aWxfOyB9CisgIHZvaWQgc2V0X2RpZF9ub3RpZnlf
YmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfdW50aWwoYm9vbCB2YWx1ZSkgeyBkaWRfbm90
aWZ5X2JlZ2luX21haW5fZnJhbWVfbm90X2V4cGVjdGVkX3VudGlsXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoOCk7IH0KKworICBib29sIGhhc19kaWRfbm90aWZ5X2JlZ2luX21haW5fZnJhbWVf
bm90X2V4cGVjdGVkX3Nvb24oKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s5XTsgfQorICBi
b29sIGRpZF9ub3RpZnlfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfc29vbigpIGNvbnN0
IHsgcmV0dXJuIGRpZF9ub3RpZnlfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfc29vbl87
IH0KKyAgdm9pZCBzZXRfZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZF9z
b29uKGJvb2wgdmFsdWUpIHsgZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3Rl
ZF9zb29uXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoOSk7IH0KKworICBib29sIGhhc193YW50
c19iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzEwXTsgfQorICBib29sIHdhbnRzX2JlZ2luX21haW5fZnJhbWVfbm90X2V4cGVjdGVkKCkg
Y29uc3QgeyByZXR1cm4gd2FudHNfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfOyB9Cisg
IHZvaWQgc2V0X3dhbnRzX2JlZ2luX21haW5fZnJhbWVfbm90X2V4cGVjdGVkKGJvb2wgdmFsdWUp
IHsgd2FudHNfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfID0gdmFsdWU7IF9oYXNfZmll
bGRfLnNldCgxMCk7IH0KKworICBib29sIGhhc19kaWRfY29tbWl0X2R1cmluZ19mcmFtZSgpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzExXTsgfQorICBib29sIGRpZF9jb21taXRfZHVyaW5n
X2ZyYW1lKCkgY29uc3QgeyByZXR1cm4gZGlkX2NvbW1pdF9kdXJpbmdfZnJhbWVfOyB9CisgIHZv
aWQgc2V0X2RpZF9jb21taXRfZHVyaW5nX2ZyYW1lKGJvb2wgdmFsdWUpIHsgZGlkX2NvbW1pdF9k
dXJpbmdfZnJhbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMSk7IH0KKworICBib29sIGhh
c19kaWRfaW52YWxpZGF0ZV9sYXllcl90cmVlX2ZyYW1lX3NpbmsoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1sxMl07IH0KKyAgYm9vbCBkaWRfaW52YWxpZGF0ZV9sYXllcl90cmVlX2ZyYW1l
X3NpbmsoKSBjb25zdCB7IHJldHVybiBkaWRfaW52YWxpZGF0ZV9sYXllcl90cmVlX2ZyYW1lX3Np
bmtfOyB9CisgIHZvaWQgc2V0X2RpZF9pbnZhbGlkYXRlX2xheWVyX3RyZWVfZnJhbWVfc2luayhi
b29sIHZhbHVlKSB7IGRpZF9pbnZhbGlkYXRlX2xheWVyX3RyZWVfZnJhbWVfc2lua18gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDEyKTsgfQorCisgIGJvb2wgaGFzX2RpZF9wZXJmb3JtX2ltcGxf
c2lkZV9pbnZhbGlkYWlvbigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEzXTsgfQorICBi
b29sIGRpZF9wZXJmb3JtX2ltcGxfc2lkZV9pbnZhbGlkYWlvbigpIGNvbnN0IHsgcmV0dXJuIGRp
ZF9wZXJmb3JtX2ltcGxfc2lkZV9pbnZhbGlkYWlvbl87IH0KKyAgdm9pZCBzZXRfZGlkX3BlcmZv
cm1faW1wbF9zaWRlX2ludmFsaWRhaW9uKGJvb2wgdmFsdWUpIHsgZGlkX3BlcmZvcm1faW1wbF9z
aWRlX2ludmFsaWRhaW9uXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTMpOyB9CisKKyAgYm9v
bCBoYXNfZGlkX3ByZXBhcmVfdGlsZXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxNF07
IH0KKyAgYm9vbCBkaWRfcHJlcGFyZV90aWxlcygpIGNvbnN0IHsgcmV0dXJuIGRpZF9wcmVwYXJl
X3RpbGVzXzsgfQorICB2b2lkIHNldF9kaWRfcHJlcGFyZV90aWxlcyhib29sIHZhbHVlKSB7IGRp
ZF9wcmVwYXJlX3RpbGVzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTQpOyB9CisKKyAgYm9v
bCBoYXNfY29uc2VjdXRpdmVfY2hlY2tlcmJvYXJkX2FuaW1hdGlvbnMoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1sxNV07IH0KKyAgaW50MzJfdCBjb25zZWN1dGl2ZV9jaGVja2VyYm9hcmRf
YW5pbWF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGNvbnNlY3V0aXZlX2NoZWNrZXJib2FyZF9hbmlt
YXRpb25zXzsgfQorICB2b2lkIHNldF9jb25zZWN1dGl2ZV9jaGVja2VyYm9hcmRfYW5pbWF0aW9u
cyhpbnQzMl90IHZhbHVlKSB7IGNvbnNlY3V0aXZlX2NoZWNrZXJib2FyZF9hbmltYXRpb25zXyA9
IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTUpOyB9CisKKyAgYm9vbCBoYXNfcGVuZGluZ19zdWJt
aXRfZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTZdOyB9CisgIGludDMyX3Qg
cGVuZGluZ19zdWJtaXRfZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gcGVuZGluZ19zdWJtaXRfZnJh
bWVzXzsgfQorICB2b2lkIHNldF9wZW5kaW5nX3N1Ym1pdF9mcmFtZXMoaW50MzJfdCB2YWx1ZSkg
eyBwZW5kaW5nX3N1Ym1pdF9mcmFtZXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxNik7IH0K
KworICBib29sIGhhc19zdWJtaXRfZnJhbWVzX3dpdGhfY3VycmVudF9sYXllcl90cmVlX2ZyYW1l
X3NpbmsoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxN107IH0KKyAgaW50MzJfdCBzdWJt
aXRfZnJhbWVzX3dpdGhfY3VycmVudF9sYXllcl90cmVlX2ZyYW1lX3NpbmsoKSBjb25zdCB7IHJl
dHVybiBzdWJtaXRfZnJhbWVzX3dpdGhfY3VycmVudF9sYXllcl90cmVlX2ZyYW1lX3NpbmtfOyB9
CisgIHZvaWQgc2V0X3N1Ym1pdF9mcmFtZXNfd2l0aF9jdXJyZW50X2xheWVyX3RyZWVfZnJhbWVf
c2luayhpbnQzMl90IHZhbHVlKSB7IHN1Ym1pdF9mcmFtZXNfd2l0aF9jdXJyZW50X2xheWVyX3Ry
ZWVfZnJhbWVfc2lua18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDE3KTsgfQorCisgIGJvb2wg
aGFzX25lZWRzX3JlZHJhdygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE4XTsgfQorICBi
b29sIG5lZWRzX3JlZHJhdygpIGNvbnN0IHsgcmV0dXJuIG5lZWRzX3JlZHJhd187IH0KKyAgdm9p
ZCBzZXRfbmVlZHNfcmVkcmF3KGJvb2wgdmFsdWUpIHsgbmVlZHNfcmVkcmF3XyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMTgpOyB9CisKKyAgYm9vbCBoYXNfbmVlZHNfcHJlcGFyZV90aWxlcygp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE5XTsgfQorICBib29sIG5lZWRzX3ByZXBhcmVf
dGlsZXMoKSBjb25zdCB7IHJldHVybiBuZWVkc19wcmVwYXJlX3RpbGVzXzsgfQorICB2b2lkIHNl
dF9uZWVkc19wcmVwYXJlX3RpbGVzKGJvb2wgdmFsdWUpIHsgbmVlZHNfcHJlcGFyZV90aWxlc18g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDE5KTsgfQorCisgIGJvb2wgaGFzX25lZWRzX2JlZ2lu
X21haW5fZnJhbWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syMF07IH0KKyAgYm9vbCBu
ZWVkc19iZWdpbl9tYWluX2ZyYW1lKCkgY29uc3QgeyByZXR1cm4gbmVlZHNfYmVnaW5fbWFpbl9m
cmFtZV87IH0KKyAgdm9pZCBzZXRfbmVlZHNfYmVnaW5fbWFpbl9mcmFtZShib29sIHZhbHVlKSB7
IG5lZWRzX2JlZ2luX21haW5fZnJhbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyMCk7IH0K
KworICBib29sIGhhc19uZWVkc19vbmVfYmVnaW5faW1wbF9mcmFtZSgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzIxXTsgfQorICBib29sIG5lZWRzX29uZV9iZWdpbl9pbXBsX2ZyYW1lKCkg
Y29uc3QgeyByZXR1cm4gbmVlZHNfb25lX2JlZ2luX2ltcGxfZnJhbWVfOyB9CisgIHZvaWQgc2V0
X25lZWRzX29uZV9iZWdpbl9pbXBsX2ZyYW1lKGJvb2wgdmFsdWUpIHsgbmVlZHNfb25lX2JlZ2lu
X2ltcGxfZnJhbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyMSk7IH0KKworICBib29sIGhh
c192aXNpYmxlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjJdOyB9CisgIGJvb2wgdmlz
aWJsZSgpIGNvbnN0IHsgcmV0dXJuIHZpc2libGVfOyB9CisgIHZvaWQgc2V0X3Zpc2libGUoYm9v
bCB2YWx1ZSkgeyB2aXNpYmxlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMjIpOyB9CisKKyAg
Ym9vbCBoYXNfYmVnaW5fZnJhbWVfc291cmNlX3BhdXNlZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzIzXTsgfQorICBib29sIGJlZ2luX2ZyYW1lX3NvdXJjZV9wYXVzZWQoKSBjb25zdCB7
IHJldHVybiBiZWdpbl9mcmFtZV9zb3VyY2VfcGF1c2VkXzsgfQorICB2b2lkIHNldF9iZWdpbl9m
cmFtZV9zb3VyY2VfcGF1c2VkKGJvb2wgdmFsdWUpIHsgYmVnaW5fZnJhbWVfc291cmNlX3BhdXNl
ZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIzKTsgfQorCisgIGJvb2wgaGFzX2Nhbl9kcmF3
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjRdOyB9CisgIGJvb2wgY2FuX2RyYXcoKSBj
b25zdCB7IHJldHVybiBjYW5fZHJhd187IH0KKyAgdm9pZCBzZXRfY2FuX2RyYXcoYm9vbCB2YWx1
ZSkgeyBjYW5fZHJhd18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDI0KTsgfQorCisgIGJvb2wg
aGFzX3Jlc291cmNlbGVzc19kcmF3KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjVdOyB9
CisgIGJvb2wgcmVzb3VyY2VsZXNzX2RyYXcoKSBjb25zdCB7IHJldHVybiByZXNvdXJjZWxlc3Nf
ZHJhd187IH0KKyAgdm9pZCBzZXRfcmVzb3VyY2VsZXNzX2RyYXcoYm9vbCB2YWx1ZSkgeyByZXNv
dXJjZWxlc3NfZHJhd18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDI1KTsgfQorCisgIGJvb2wg
aGFzX2hhc19wZW5kaW5nX3RyZWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syNl07IH0K
KyAgYm9vbCBoYXNfcGVuZGluZ190cmVlKCkgY29uc3QgeyByZXR1cm4gaGFzX3BlbmRpbmdfdHJl
ZV87IH0KKyAgdm9pZCBzZXRfaGFzX3BlbmRpbmdfdHJlZShib29sIHZhbHVlKSB7IGhhc19wZW5k
aW5nX3RyZWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyNik7IH0KKworICBib29sIGhhc19w
ZW5kaW5nX3RyZWVfaXNfcmVhZHlfZm9yX2FjdGl2YXRpb24oKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1syN107IH0KKyAgYm9vbCBwZW5kaW5nX3RyZWVfaXNfcmVhZHlfZm9yX2FjdGl2YXRp
b24oKSBjb25zdCB7IHJldHVybiBwZW5kaW5nX3RyZWVfaXNfcmVhZHlfZm9yX2FjdGl2YXRpb25f
OyB9CisgIHZvaWQgc2V0X3BlbmRpbmdfdHJlZV9pc19yZWFkeV9mb3JfYWN0aXZhdGlvbihib29s
IHZhbHVlKSB7IHBlbmRpbmdfdHJlZV9pc19yZWFkeV9mb3JfYWN0aXZhdGlvbl8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDI3KTsgfQorCisgIGJvb2wgaGFzX2FjdGl2ZV90cmVlX25lZWRzX2Zp
cnN0X2RyYXcoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syOF07IH0KKyAgYm9vbCBhY3Rp
dmVfdHJlZV9uZWVkc19maXJzdF9kcmF3KCkgY29uc3QgeyByZXR1cm4gYWN0aXZlX3RyZWVfbmVl
ZHNfZmlyc3RfZHJhd187IH0KKyAgdm9pZCBzZXRfYWN0aXZlX3RyZWVfbmVlZHNfZmlyc3RfZHJh
dyhib29sIHZhbHVlKSB7IGFjdGl2ZV90cmVlX25lZWRzX2ZpcnN0X2RyYXdfID0gdmFsdWU7IF9o
YXNfZmllbGRfLnNldCgyOCk7IH0KKworICBib29sIGhhc19hY3RpdmVfdHJlZV9pc19yZWFkeV90
b19kcmF3KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjldOyB9CisgIGJvb2wgYWN0aXZl
X3RyZWVfaXNfcmVhZHlfdG9fZHJhdygpIGNvbnN0IHsgcmV0dXJuIGFjdGl2ZV90cmVlX2lzX3Jl
YWR5X3RvX2RyYXdfOyB9CisgIHZvaWQgc2V0X2FjdGl2ZV90cmVlX2lzX3JlYWR5X3RvX2RyYXco
Ym9vbCB2YWx1ZSkgeyBhY3RpdmVfdHJlZV9pc19yZWFkeV90b19kcmF3XyA9IHZhbHVlOyBfaGFz
X2ZpZWxkXy5zZXQoMjkpOyB9CisKKyAgYm9vbCBoYXNfZGlkX2NyZWF0ZV9hbmRfaW5pdGlhbGl6
ZV9maXJzdF9sYXllcl90cmVlX2ZyYW1lX3NpbmsoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1szMF07IH0KKyAgYm9vbCBkaWRfY3JlYXRlX2FuZF9pbml0aWFsaXplX2ZpcnN0X2xheWVyX3Ry
ZWVfZnJhbWVfc2luaygpIGNvbnN0IHsgcmV0dXJuIGRpZF9jcmVhdGVfYW5kX2luaXRpYWxpemVf
Zmlyc3RfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rXzsgfQorICB2b2lkIHNldF9kaWRfY3JlYXRlX2Fu
ZF9pbml0aWFsaXplX2ZpcnN0X2xheWVyX3RyZWVfZnJhbWVfc2luayhib29sIHZhbHVlKSB7IGRp
ZF9jcmVhdGVfYW5kX2luaXRpYWxpemVfZmlyc3RfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rXyA9IHZh
bHVlOyBfaGFzX2ZpZWxkXy5zZXQoMzApOyB9CisKKyAgYm9vbCBoYXNfdHJlZV9wcmlvcml0eSgp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzMxXTsgfQorICBDaHJvbWVDb21wb3NpdG9yU3Rh
dGVNYWNoaW5lX01pbm9yU3RhdGVfVHJlZVByaW9yaXR5IHRyZWVfcHJpb3JpdHkoKSBjb25zdCB7
IHJldHVybiB0cmVlX3ByaW9yaXR5XzsgfQorICB2b2lkIHNldF90cmVlX3ByaW9yaXR5KENocm9t
ZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHkgdmFsdWUpIHsg
dHJlZV9wcmlvcml0eV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMxKTsgfQorCisgIGJvb2wg
aGFzX3Njcm9sbF9oYW5kbGVyX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMzJd
OyB9CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9TY3JvbGxIYW5k
bGVyU3RhdGUgc2Nyb2xsX2hhbmRsZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBzY3JvbGxfaGFu
ZGxlcl9zdGF0ZV87IH0KKyAgdm9pZCBzZXRfc2Nyb2xsX2hhbmRsZXJfc3RhdGUoQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZSB2YWx1ZSkg
eyBzY3JvbGxfaGFuZGxlcl9zdGF0ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMyKTsgfQor
CisgIGJvb2wgaGFzX2NyaXRpY2FsX2JlZ2luX21haW5fZnJhbWVfdG9fYWN0aXZhdGVfaXNfZmFz
dCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzMzXTsgfQorICBib29sIGNyaXRpY2FsX2Jl
Z2luX21haW5fZnJhbWVfdG9fYWN0aXZhdGVfaXNfZmFzdCgpIGNvbnN0IHsgcmV0dXJuIGNyaXRp
Y2FsX2JlZ2luX21haW5fZnJhbWVfdG9fYWN0aXZhdGVfaXNfZmFzdF87IH0KKyAgdm9pZCBzZXRf
Y3JpdGljYWxfYmVnaW5fbWFpbl9mcmFtZV90b19hY3RpdmF0ZV9pc19mYXN0KGJvb2wgdmFsdWUp
IHsgY3JpdGljYWxfYmVnaW5fbWFpbl9mcmFtZV90b19hY3RpdmF0ZV9pc19mYXN0XyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoMzMpOyB9CisKKyAgYm9vbCBoYXNfbWFpbl90aHJlYWRfbWlzc2Vk
X2xhc3RfZGVhZGxpbmUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szNF07IH0KKyAgYm9v
bCBtYWluX3RocmVhZF9taXNzZWRfbGFzdF9kZWFkbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1haW5f
dGhyZWFkX21pc3NlZF9sYXN0X2RlYWRsaW5lXzsgfQorICB2b2lkIHNldF9tYWluX3RocmVhZF9t
aXNzZWRfbGFzdF9kZWFkbGluZShib29sIHZhbHVlKSB7IG1haW5fdGhyZWFkX21pc3NlZF9sYXN0
X2RlYWRsaW5lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMzQpOyB9CisKKyAgYm9vbCBoYXNf
c2tpcF9uZXh0X2JlZ2luX21haW5fZnJhbWVfdG9fcmVkdWNlX2xhdGVuY3koKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1szNV07IH0KKyAgYm9vbCBza2lwX25leHRfYmVnaW5fbWFpbl9mcmFt
ZV90b19yZWR1Y2VfbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIHNraXBfbmV4dF9iZWdpbl9tYWlu
X2ZyYW1lX3RvX3JlZHVjZV9sYXRlbmN5XzsgfQorICB2b2lkIHNldF9za2lwX25leHRfYmVnaW5f
bWFpbl9mcmFtZV90b19yZWR1Y2VfbGF0ZW5jeShib29sIHZhbHVlKSB7IHNraXBfbmV4dF9iZWdp
bl9tYWluX2ZyYW1lX3RvX3JlZHVjZV9sYXRlbmN5XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
MzUpOyB9CisKKyAgYm9vbCBoYXNfdmlkZW9fbmVlZHNfYmVnaW5fZnJhbWVzKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bMzZdOyB9CisgIGJvb2wgdmlkZW9fbmVlZHNfYmVnaW5fZnJhbWVz
KCkgY29uc3QgeyByZXR1cm4gdmlkZW9fbmVlZHNfYmVnaW5fZnJhbWVzXzsgfQorICB2b2lkIHNl
dF92aWRlb19uZWVkc19iZWdpbl9mcmFtZXMoYm9vbCB2YWx1ZSkgeyB2aWRlb19uZWVkc19iZWdp
bl9mcmFtZXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzNik7IH0KKworICBib29sIGhhc19k
ZWZlcl9iZWdpbl9tYWluX2ZyYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMzddOyB9
CisgIGJvb2wgZGVmZXJfYmVnaW5fbWFpbl9mcmFtZSgpIGNvbnN0IHsgcmV0dXJuIGRlZmVyX2Jl
Z2luX21haW5fZnJhbWVfOyB9CisgIHZvaWQgc2V0X2RlZmVyX2JlZ2luX21haW5fZnJhbWUoYm9v
bCB2YWx1ZSkgeyBkZWZlcl9iZWdpbl9tYWluX2ZyYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5z
ZXQoMzcpOyB9CisKKyAgYm9vbCBoYXNfbGFzdF9jb21taXRfaGFkX25vX3VwZGF0ZXMoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1szOF07IH0KKyAgYm9vbCBsYXN0X2NvbW1pdF9oYWRfbm9f
dXBkYXRlcygpIGNvbnN0IHsgcmV0dXJuIGxhc3RfY29tbWl0X2hhZF9ub191cGRhdGVzXzsgfQor
ICB2b2lkIHNldF9sYXN0X2NvbW1pdF9oYWRfbm9fdXBkYXRlcyhib29sIHZhbHVlKSB7IGxhc3Rf
Y29tbWl0X2hhZF9ub191cGRhdGVzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMzgpOyB9CisK
KyAgYm9vbCBoYXNfZGlkX2RyYXdfaW5fbGFzdF9mcmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzM5XTsgfQorICBib29sIGRpZF9kcmF3X2luX2xhc3RfZnJhbWUoKSBjb25zdCB7IHJl
dHVybiBkaWRfZHJhd19pbl9sYXN0X2ZyYW1lXzsgfQorICB2b2lkIHNldF9kaWRfZHJhd19pbl9s
YXN0X2ZyYW1lKGJvb2wgdmFsdWUpIHsgZGlkX2RyYXdfaW5fbGFzdF9mcmFtZV8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDM5KTsgfQorCisgIGJvb2wgaGFzX2RpZF9zdWJtaXRfaW5fbGFzdF9m
cmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzQwXTsgfQorICBib29sIGRpZF9zdWJt
aXRfaW5fbGFzdF9mcmFtZSgpIGNvbnN0IHsgcmV0dXJuIGRpZF9zdWJtaXRfaW5fbGFzdF9mcmFt
ZV87IH0KKyAgdm9pZCBzZXRfZGlkX3N1Ym1pdF9pbl9sYXN0X2ZyYW1lKGJvb2wgdmFsdWUpIHsg
ZGlkX3N1Ym1pdF9pbl9sYXN0X2ZyYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNDApOyB9
CisKKyAgYm9vbCBoYXNfbmVlZHNfaW1wbF9zaWRlX2ludmFsaWRhdGlvbigpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzQxXTsgfQorICBib29sIG5lZWRzX2ltcGxfc2lkZV9pbnZhbGlkYXRp
b24oKSBjb25zdCB7IHJldHVybiBuZWVkc19pbXBsX3NpZGVfaW52YWxpZGF0aW9uXzsgfQorICB2
b2lkIHNldF9uZWVkc19pbXBsX3NpZGVfaW52YWxpZGF0aW9uKGJvb2wgdmFsdWUpIHsgbmVlZHNf
aW1wbF9zaWRlX2ludmFsaWRhdGlvbl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQxKTsgfQor
CisgIGJvb2wgaGFzX2N1cnJlbnRfcGVuZGluZ190cmVlX2lzX2ltcGxfc2lkZSgpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzQyXTsgfQorICBib29sIGN1cnJlbnRfcGVuZGluZ190cmVlX2lz
X2ltcGxfc2lkZSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfcGVuZGluZ190cmVlX2lzX2ltcGxf
c2lkZV87IH0KKyAgdm9pZCBzZXRfY3VycmVudF9wZW5kaW5nX3RyZWVfaXNfaW1wbF9zaWRlKGJv
b2wgdmFsdWUpIHsgY3VycmVudF9wZW5kaW5nX3RyZWVfaXNfaW1wbF9zaWRlXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoNDIpOyB9CisKKyAgYm9vbCBoYXNfcHJldmlvdXNfcGVuZGluZ190cmVl
X3dhc19pbXBsX3NpZGUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0M107IH0KKyAgYm9v
bCBwcmV2aW91c19wZW5kaW5nX3RyZWVfd2FzX2ltcGxfc2lkZSgpIGNvbnN0IHsgcmV0dXJuIHBy
ZXZpb3VzX3BlbmRpbmdfdHJlZV93YXNfaW1wbF9zaWRlXzsgfQorICB2b2lkIHNldF9wcmV2aW91
c19wZW5kaW5nX3RyZWVfd2FzX2ltcGxfc2lkZShib29sIHZhbHVlKSB7IHByZXZpb3VzX3BlbmRp
bmdfdHJlZV93YXNfaW1wbF9zaWRlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNDMpOyB9CisK
KyAgYm9vbCBoYXNfcHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xldHNfZm9yX2FjdGl2ZV90cmVl
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNDRdOyB9CisgIGJvb2wgcHJvY2Vzc2luZ19h
bmltYXRpb25fd29ya2xldHNfZm9yX2FjdGl2ZV90cmVlKCkgY29uc3QgeyByZXR1cm4gcHJvY2Vz
c2luZ19hbmltYXRpb25fd29ya2xldHNfZm9yX2FjdGl2ZV90cmVlXzsgfQorICB2b2lkIHNldF9w
cm9jZXNzaW5nX2FuaW1hdGlvbl93b3JrbGV0c19mb3JfYWN0aXZlX3RyZWUoYm9vbCB2YWx1ZSkg
eyBwcm9jZXNzaW5nX2FuaW1hdGlvbl93b3JrbGV0c19mb3JfYWN0aXZlX3RyZWVfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCg0NCk7IH0KKworICBib29sIGhhc19wcm9jZXNzaW5nX2FuaW1hdGlv
bl93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9b
NDVdOyB9CisgIGJvb2wgcHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xldHNfZm9yX3BlbmRpbmdf
dHJlZSgpIGNvbnN0IHsgcmV0dXJuIHByb2Nlc3NpbmdfYW5pbWF0aW9uX3dvcmtsZXRzX2Zvcl9w
ZW5kaW5nX3RyZWVfOyB9CisgIHZvaWQgc2V0X3Byb2Nlc3NpbmdfYW5pbWF0aW9uX3dvcmtsZXRz
X2Zvcl9wZW5kaW5nX3RyZWUoYm9vbCB2YWx1ZSkgeyBwcm9jZXNzaW5nX2FuaW1hdGlvbl93b3Jr
bGV0c19mb3JfcGVuZGluZ190cmVlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNDUpOyB9CisK
KyAgYm9vbCBoYXNfcHJvY2Vzc2luZ19wYWludF93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlKCkg
Y29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNDZdOyB9CisgIGJvb2wgcHJvY2Vzc2luZ19wYWlu
dF93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlKCkgY29uc3QgeyByZXR1cm4gcHJvY2Vzc2luZ19w
YWludF93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlXzsgfQorICB2b2lkIHNldF9wcm9jZXNzaW5n
X3BhaW50X3dvcmtsZXRzX2Zvcl9wZW5kaW5nX3RyZWUoYm9vbCB2YWx1ZSkgeyBwcm9jZXNzaW5n
X3BhaW50X3dvcmtsZXRzX2Zvcl9wZW5kaW5nX3RyZWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCg0Nik7IH0KKworIHByaXZhdGU6CisgIGludDMyX3QgY29tbWl0X2NvdW50X3t9OworICBpbnQz
Ml90IGN1cnJlbnRfZnJhbWVfbnVtYmVyX3t9OworICBpbnQzMl90IGxhc3RfZnJhbWVfbnVtYmVy
X3N1Ym1pdF9wZXJmb3JtZWRfe307CisgIGludDMyX3QgbGFzdF9mcmFtZV9udW1iZXJfZHJhd19w
ZXJmb3JtZWRfe307CisgIGludDMyX3QgbGFzdF9mcmFtZV9udW1iZXJfYmVnaW5fbWFpbl9mcmFt
ZV9zZW50X3t9OworICBib29sIGRpZF9kcmF3X3t9OworICBib29sIGRpZF9zZW5kX2JlZ2luX21h
aW5fZnJhbWVfZm9yX2N1cnJlbnRfZnJhbWVfe307CisgIGJvb2wgZGlkX25vdGlmeV9iZWdpbl9t
YWluX2ZyYW1lX25vdF9leHBlY3RlZF91bnRpbF97fTsKKyAgYm9vbCBkaWRfbm90aWZ5X2JlZ2lu
X21haW5fZnJhbWVfbm90X2V4cGVjdGVkX3Nvb25fe307CisgIGJvb2wgd2FudHNfYmVnaW5fbWFp
bl9mcmFtZV9ub3RfZXhwZWN0ZWRfe307CisgIGJvb2wgZGlkX2NvbW1pdF9kdXJpbmdfZnJhbWVf
e307CisgIGJvb2wgZGlkX2ludmFsaWRhdGVfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rX3t9OworICBi
b29sIGRpZF9wZXJmb3JtX2ltcGxfc2lkZV9pbnZhbGlkYWlvbl97fTsKKyAgYm9vbCBkaWRfcHJl
cGFyZV90aWxlc197fTsKKyAgaW50MzJfdCBjb25zZWN1dGl2ZV9jaGVja2VyYm9hcmRfYW5pbWF0
aW9uc197fTsKKyAgaW50MzJfdCBwZW5kaW5nX3N1Ym1pdF9mcmFtZXNfe307CisgIGludDMyX3Qg
c3VibWl0X2ZyYW1lc193aXRoX2N1cnJlbnRfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rX3t9OworICBi
b29sIG5lZWRzX3JlZHJhd197fTsKKyAgYm9vbCBuZWVkc19wcmVwYXJlX3RpbGVzX3t9OworICBi
b29sIG5lZWRzX2JlZ2luX21haW5fZnJhbWVfe307CisgIGJvb2wgbmVlZHNfb25lX2JlZ2luX2lt
cGxfZnJhbWVfe307CisgIGJvb2wgdmlzaWJsZV97fTsKKyAgYm9vbCBiZWdpbl9mcmFtZV9zb3Vy
Y2VfcGF1c2VkX3t9OworICBib29sIGNhbl9kcmF3X3t9OworICBib29sIHJlc291cmNlbGVzc19k
cmF3X3t9OworICBib29sIGhhc19wZW5kaW5nX3RyZWVfe307CisgIGJvb2wgcGVuZGluZ190cmVl
X2lzX3JlYWR5X2Zvcl9hY3RpdmF0aW9uX3t9OworICBib29sIGFjdGl2ZV90cmVlX25lZWRzX2Zp
cnN0X2RyYXdfe307CisgIGJvb2wgYWN0aXZlX3RyZWVfaXNfcmVhZHlfdG9fZHJhd197fTsKKyAg
Ym9vbCBkaWRfY3JlYXRlX2FuZF9pbml0aWFsaXplX2ZpcnN0X2xheWVyX3RyZWVfZnJhbWVfc2lu
a197fTsKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlv
cml0eSB0cmVlX3ByaW9yaXR5X3t9OworICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01p
bm9yU3RhdGVfU2Nyb2xsSGFuZGxlclN0YXRlIHNjcm9sbF9oYW5kbGVyX3N0YXRlX3t9OworICBi
b29sIGNyaXRpY2FsX2JlZ2luX21haW5fZnJhbWVfdG9fYWN0aXZhdGVfaXNfZmFzdF97fTsKKyAg
Ym9vbCBtYWluX3RocmVhZF9taXNzZWRfbGFzdF9kZWFkbGluZV97fTsKKyAgYm9vbCBza2lwX25l
eHRfYmVnaW5fbWFpbl9mcmFtZV90b19yZWR1Y2VfbGF0ZW5jeV97fTsKKyAgYm9vbCB2aWRlb19u
ZWVkc19iZWdpbl9mcmFtZXNfe307CisgIGJvb2wgZGVmZXJfYmVnaW5fbWFpbl9mcmFtZV97fTsK
KyAgYm9vbCBsYXN0X2NvbW1pdF9oYWRfbm9fdXBkYXRlc197fTsKKyAgYm9vbCBkaWRfZHJhd19p
bl9sYXN0X2ZyYW1lX3t9OworICBib29sIGRpZF9zdWJtaXRfaW5fbGFzdF9mcmFtZV97fTsKKyAg
Ym9vbCBuZWVkc19pbXBsX3NpZGVfaW52YWxpZGF0aW9uX3t9OworICBib29sIGN1cnJlbnRfcGVu
ZGluZ190cmVlX2lzX2ltcGxfc2lkZV97fTsKKyAgYm9vbCBwcmV2aW91c19wZW5kaW5nX3RyZWVf
d2FzX2ltcGxfc2lkZV97fTsKKyAgYm9vbCBwcm9jZXNzaW5nX2FuaW1hdGlvbl93b3JrbGV0c19m
b3JfYWN0aXZlX3RyZWVfe307CisgIGJvb2wgcHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xldHNf
Zm9yX3BlbmRpbmdfdHJlZV97fTsKKyAgYm9vbCBwcm9jZXNzaW5nX3BhaW50X3dvcmtsZXRzX2Zv
cl9wZW5kaW5nX3RyZWVfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJv
dG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25z
IG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0
ZDo6Yml0c2V0PDQ3PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBP
UlQgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlIDogcHVibGljIDo6cHJv
dG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIEJlZ2luSW1wbEZyYW1l
U3RhdGUgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5JbXBs
RnJhbWVTdGF0ZTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEJFR0lOX0lNUExfRlJBTUVfVU5T
UEVDSUZJRUQgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5J
bXBsRnJhbWVTdGF0ZV9CRUdJTl9JTVBMX0ZSQU1FX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gQkVHSU5fSU1QTF9GUkFNRV9JRExFID0gQ2hyb21lQ29tcG9zaXRvclN0YXRl
TWFjaGluZV9NYWpvclN0YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGVfQkVHSU5fSU1QTF9GUkFNRV9J
RExFOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQkVHSU5fSU1QTF9GUkFNRV9JTlNJREVfQkVH
SU5fRlJBTUUgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5J
bXBsRnJhbWVTdGF0ZV9CRUdJTl9JTVBMX0ZSQU1FX0lOU0lERV9CRUdJTl9GUkFNRTsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIEJFR0lOX0lNUExfRlJBTUVfSU5TSURFX0RFQURMSU5FID0gQ2hy
b21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGVf
QkVHSU5fSU1QTF9GUkFNRV9JTlNJREVfREVBRExJTkU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBCZWdpbkltcGxGcmFtZVN0YXRlX01JTiA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVf
TWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlX0JFR0lOX0lNUExfRlJBTUVfVU5TUEVDSUZJ
RUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCZWdpbkltcGxGcmFtZVN0YXRlX01BWCA9IENo
cm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRl
X0JFR0lOX0lNUExfRlJBTUVfSU5TSURFX0RFQURMSU5FOworICB1c2luZyBCZWdpbk1haW5GcmFt
ZVN0YXRlID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luTWFp
bkZyYW1lU3RhdGU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCRUdJTl9NQUlOX0ZSQU1FX1VO
U1BFQ0lGSUVEID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2lu
TWFpbkZyYW1lU3RhdGVfQkVHSU5fTUFJTl9GUkFNRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIEJFR0lOX01BSU5fRlJBTUVfSURMRSA9IENocm9tZUNvbXBvc2l0b3JTdGF0
ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbk1haW5GcmFtZVN0YXRlX0JFR0lOX01BSU5fRlJBTUVf
SURMRTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEJFR0lOX01BSU5fRlJBTUVfU0VOVCA9IENo
cm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbk1haW5GcmFtZVN0YXRl
X0JFR0lOX01BSU5fRlJBTUVfU0VOVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEJFR0lOX01B
SU5fRlJBTUVfUkVBRFlfVE9fQ09NTUlUID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
YWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGVfQkVHSU5fTUFJTl9GUkFNRV9SRUFEWV9UT19D
T01NSVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBCZWdpbk1haW5GcmFtZVN0YXRlX01JTiA9
IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbk1haW5GcmFtZVN0
YXRlX0JFR0lOX01BSU5fRlJBTUVfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBCZWdpbk1haW5GcmFtZVN0YXRlX01BWCA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVf
TWFqb3JTdGF0ZV9CZWdpbk1haW5GcmFtZVN0YXRlX0JFR0lOX01BSU5fRlJBTUVfUkVBRFlfVE9f
Q09NTUlUOworICB1c2luZyBMYXllclRyZWVGcmFtZVNpbmtTdGF0ZSA9IENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFtZVNpbmtTdGF0ZTsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIExBWUVSX1RSRUVfRlJBTUVfVU5TUEVDSUZJRUQgPSBDaHJvbWVD
b21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGVf
TEFZRVJfVFJFRV9GUkFNRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIExB
WUVSX1RSRUVfRlJBTUVfTk9ORSA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JT
dGF0ZV9MYXllclRyZWVGcmFtZVNpbmtTdGF0ZV9MQVlFUl9UUkVFX0ZSQU1FX05PTkU7CisgIHN0
YXRpYyBjb25zdGV4cHIgYXV0byBMQVlFUl9UUkVFX0ZSQU1FX0FDVElWRSA9IENocm9tZUNvbXBv
c2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFtZVNpbmtTdGF0ZV9MQVlF
Ul9UUkVFX0ZSQU1FX0FDVElWRTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIExBWUVSX1RSRUVf
RlJBTUVfQ1JFQVRJTkcgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVf
TGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGVfTEFZRVJfVFJFRV9GUkFNRV9DUkVBVElORzsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIExBWUVSX1RSRUVfRlJBTUVfV0FJVElOR19GT1JfRklSU1RfQ09N
TUlUID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZy
YW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJBTUVfV0FJVElOR19GT1JfRklSU1RfQ09NTUlUOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gTEFZRVJfVFJFRV9GUkFNRV9XQUlUSU5HX0ZPUl9GSVJT
VF9BQ1RJVkFUSU9OID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xh
eWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJBTUVfV0FJVElOR19GT1JfRklSU1Rf
QUNUSVZBVElPTjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIExheWVyVHJlZUZyYW1lU2lua1N0
YXRlX01JTiA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRy
ZWVGcmFtZVNpbmtTdGF0ZV9MQVlFUl9UUkVFX0ZSQU1FX1VOU1BFQ0lGSUVEOworICBzdGF0aWMg
Y29uc3RleHByIGF1dG8gTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGVfTUFYID0gQ2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVS
X1RSRUVfRlJBTUVfV0FJVElOR19GT1JfRklSU1RfQUNUSVZBVElPTjsKKyAgdXNpbmcgRm9yY2Vk
UmVkcmF3T25UaW1lb3V0U3RhdGUgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9y
U3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBGT1JDRURfUkVEUkFXX1VOU1BFQ0lGSUVEID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGlu
ZV9NYWpvclN0YXRlX0ZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlX0ZPUkNFRF9SRURSQVdfVU5T
UEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBGT1JDRURfUkVEUkFXX0lETEUgPSBD
aHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1l
b3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19JRExFOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gRk9S
Q0VEX1JFRFJBV19XQUlUSU5HX0ZPUl9DT01NSVQgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNo
aW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19X
QUlUSU5HX0ZPUl9DT01NSVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBGT1JDRURfUkVEUkFX
X1dBSVRJTkdfRk9SX0FDVElWQVRJT04gPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01h
am9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19XQUlUSU5H
X0ZPUl9BQ1RJVkFUSU9OOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gRk9SQ0VEX1JFRFJBV19X
QUlUSU5HX0ZPUl9EUkFXID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRl
X0ZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlX0ZPUkNFRF9SRURSQVdfV0FJVElOR19GT1JfRFJB
VzsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlX01J
TiA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9Gb3JjZWRSZWRyYXdP
blRpbWVvdXRTdGF0ZV9GT1JDRURfUkVEUkFXX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3Rl
eHByIGF1dG8gRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGVfTUFYID0gQ2hyb21lQ29tcG9zaXRv
clN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0ZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlX0ZPUkNF
RF9SRURSQVdfV0FJVElOR19GT1JfRFJBVzsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtO
ZXh0QWN0aW9uRmllbGROdW1iZXIgPSAxLAorICAgIGtCZWdpbkltcGxGcmFtZVN0YXRlRmllbGRO
dW1iZXIgPSAyLAorICAgIGtCZWdpbk1haW5GcmFtZVN0YXRlRmllbGROdW1iZXIgPSAzLAorICAg
IGtMYXllclRyZWVGcmFtZVNpbmtTdGF0ZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrRm9yY2VkUmVk
cmF3U3RhdGVGaWVsZE51bWJlciA9IDUsCisgIH07CisKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRl
TWFjaGluZV9NYWpvclN0YXRlKCk7CisgIH5DaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01h
am9yU3RhdGUoKSBvdmVycmlkZTsKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpv
clN0YXRlKENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZSYmKSBub2V4Y2Vw
dDsKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlJiBvcGVyYXRvcj0o
Q2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlJiYpOworICBDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGUoY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRl
TWFjaGluZV9NYWpvclN0YXRlJik7CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFq
b3JTdGF0ZSYgb3BlcmF0b3I9KGNvbnN0IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFq
b3JTdGF0ZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRl
TWFjaGluZV9NYWpvclN0YXRlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaHJv
bWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGUmIG90aGVyKSBjb25zdCB7IHJldHVy
biAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9p
ZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXko
KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2Uq
KSBjb25zdDsKKworICBib29sIGhhc19uZXh0X2FjdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzFdOyB9CisgIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJBY3Rpb24gbmV4dF9hY3Rp
b24oKSBjb25zdCB7IHJldHVybiBuZXh0X2FjdGlvbl87IH0KKyAgdm9pZCBzZXRfbmV4dF9hY3Rp
b24oQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlckFjdGlvbiB2YWx1ZSkgeyBuZXh0X2FjdGlvbl8g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfYmVnaW5faW1wbF9m
cmFtZV9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIENocm9tZUNv
bXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlIGJlZ2lu
X2ltcGxfZnJhbWVfc3RhdGUoKSBjb25zdCB7IHJldHVybiBiZWdpbl9pbXBsX2ZyYW1lX3N0YXRl
XzsgfQorICB2b2lkIHNldF9iZWdpbl9pbXBsX2ZyYW1lX3N0YXRlKENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlIHZhbHVlKSB7IGJlZ2lu
X2ltcGxfZnJhbWVfc3RhdGVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJv
b2wgaGFzX2JlZ2luX21haW5fZnJhbWVfc3RhdGUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1szXTsgfQorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5N
YWluRnJhbWVTdGF0ZSBiZWdpbl9tYWluX2ZyYW1lX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gYmVn
aW5fbWFpbl9mcmFtZV9zdGF0ZV87IH0KKyAgdm9pZCBzZXRfYmVnaW5fbWFpbl9mcmFtZV9zdGF0
ZShDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5NYWluRnJhbWVT
dGF0ZSB2YWx1ZSkgeyBiZWdpbl9tYWluX2ZyYW1lX3N0YXRlXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoMyk7IH0KKworICBib29sIGhhc19sYXllcl90cmVlX2ZyYW1lX3Npbmtfc3RhdGUoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVN
YWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGUgbGF5ZXJfdHJlZV9mcmFt
ZV9zaW5rX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gbGF5ZXJfdHJlZV9mcmFtZV9zaW5rX3N0YXRl
XzsgfQorICB2b2lkIHNldF9sYXllcl90cmVlX2ZyYW1lX3Npbmtfc3RhdGUoQ2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlIHZhbHVl
KSB7IGxheWVyX3RyZWVfZnJhbWVfc2lua19zdGF0ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0
KDQpOyB9CisKKyAgYm9vbCBoYXNfZm9yY2VkX3JlZHJhd19zdGF0ZSgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzVdOyB9CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JT
dGF0ZV9Gb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZSBmb3JjZWRfcmVkcmF3X3N0YXRlKCkgY29u
c3QgeyByZXR1cm4gZm9yY2VkX3JlZHJhd19zdGF0ZV87IH0KKyAgdm9pZCBzZXRfZm9yY2VkX3Jl
ZHJhd19zdGF0ZShDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2Vk
UmVkcmF3T25UaW1lb3V0U3RhdGUgdmFsdWUpIHsgZm9yY2VkX3JlZHJhd19zdGF0ZV8gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDUpOyB9CisKKyBwcml2YXRlOgorICBDaHJvbWVDb21wb3NpdG9y
U2NoZWR1bGVyQWN0aW9uIG5leHRfYWN0aW9uX3t9OworICBDaHJvbWVDb21wb3NpdG9yU3RhdGVN
YWNoaW5lX01ham9yU3RhdGVfQmVnaW5JbXBsRnJhbWVTdGF0ZSBiZWdpbl9pbXBsX2ZyYW1lX3N0
YXRlX3t9OworICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5N
YWluRnJhbWVTdGF0ZSBiZWdpbl9tYWluX2ZyYW1lX3N0YXRlX3t9OworICBDaHJvbWVDb21wb3Np
dG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGUgbGF5ZXJf
dHJlZV9mcmFtZV9zaW5rX3N0YXRlX3t9OworICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5l
X01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGUgZm9yY2VkX3JlZHJhd19zdGF0
ZV97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMg
Zm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZp
bGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Nj4g
X2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENocm9tZUNvbXBv
c2l0b3JTY2hlZHVsZXJTdGF0ZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7
CisgcHVibGljOgorICB1c2luZyBCZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZSA9IENocm9tZUNv
bXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZTsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIERFQURMSU5FX01PREVfVU5TUEVDSUZJRUQgPSBDaHJvbWVDb21w
b3NpdG9yU2NoZWR1bGVyU3RhdGVfQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVfREVBRExJTkVf
TU9ERV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIERFQURMSU5FX01PREVf
Tk9ORSA9IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRs
aW5lTW9kZV9ERUFETElORV9NT0RFX05PTkU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBERUFE
TElORV9NT0RFX0lNTUVESUFURSA9IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdp
bkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX0lNTUVESUFURTsKKyAgc3RhdGlj
IGNvbnN0ZXhwciBhdXRvIERFQURMSU5FX01PREVfUkVHVUxBUiA9IENocm9tZUNvbXBvc2l0b3JT
Y2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX1JF
R1VMQVI7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBERUFETElORV9NT0RFX0xBVEUgPSBDaHJv
bWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGVfQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVfREVB
RExJTkVfTU9ERV9MQVRFOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gREVBRExJTkVfTU9ERV9C
TE9DS0VEID0gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1lRGVh
ZGxpbmVNb2RlX0RFQURMSU5FX01PREVfQkxPQ0tFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRv
IEJlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlX01JTiA9IENocm9tZUNvbXBvc2l0b3JTY2hlZHVs
ZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX1VOU1BFQ0lG
SUVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVf
TUFYID0gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1lRGVhZGxp
bmVNb2RlX0RFQURMSU5FX01PREVfQkxPQ0tFRDsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAg
IGtTdGF0ZU1hY2hpbmVGaWVsZE51bWJlciA9IDEsCisgICAga09ic2VydmluZ0JlZ2luRnJhbWVT
b3VyY2VGaWVsZE51bWJlciA9IDIsCisgICAga0JlZ2luSW1wbEZyYW1lRGVhZGxpbmVUYXNrRmll
bGROdW1iZXIgPSAzLAorICAgIGtQZW5kaW5nQmVnaW5GcmFtZVRhc2tGaWVsZE51bWJlciA9IDQs
CisgICAga1NraXBwZWRMYXN0RnJhbWVNaXNzZWRFeGNlZWRlZERlYWRsaW5lRmllbGROdW1iZXIg
PSA1LAorICAgIGtTa2lwcGVkTGFzdEZyYW1lVG9SZWR1Y2VMYXRlbmN5RmllbGROdW1iZXIgPSA2
LAorICAgIGtJbnNpZGVBY3Rpb25GaWVsZE51bWJlciA9IDcsCisgICAga0RlYWRsaW5lTW9kZUZp
ZWxkTnVtYmVyID0gOCwKKyAgICBrRGVhZGxpbmVVc0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrRGVh
ZGxpbmVTY2hlZHVsZWRBdFVzRmllbGROdW1iZXIgPSAxMCwKKyAgICBrTm93VXNGaWVsZE51bWJl
ciA9IDExLAorICAgIGtOb3dUb0RlYWRsaW5lRGVsdGFVc0ZpZWxkTnVtYmVyID0gMTIsCisgICAg
a05vd1RvRGVhZGxpbmVTY2hlZHVsZWRBdERlbHRhVXNGaWVsZE51bWJlciA9IDEzLAorICAgIGtC
ZWdpbkltcGxGcmFtZUFyZ3NGaWVsZE51bWJlciA9IDE0LAorICAgIGtCZWdpbkZyYW1lT2JzZXJ2
ZXJTdGF0ZUZpZWxkTnVtYmVyID0gMTUsCisgICAga0JlZ2luRnJhbWVTb3VyY2VTdGF0ZUZpZWxk
TnVtYmVyID0gMTYsCisgICAga0NvbXBvc2l0b3JUaW1pbmdIaXN0b3J5RmllbGROdW1iZXIgPSAx
NywKKyAgfTsKKworICBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGUoKTsKKyAgfkNocm9t
ZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZSgpIG92ZXJyaWRlOworICBDaHJvbWVDb21wb3NpdG9y
U2NoZWR1bGVyU3RhdGUoQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlJiYpIG5vZXhjZXB0
OworICBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGUmIG9wZXJhdG9yPShDaHJvbWVDb21w
b3NpdG9yU2NoZWR1bGVyU3RhdGUmJik7CisgIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0
ZShjb25zdCBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGUmKTsKKyAgQ2hyb21lQ29tcG9z
aXRvclNjaGVkdWxlclN0YXRlJiBvcGVyYXRvcj0oY29uc3QgQ2hyb21lQ29tcG9zaXRvclNjaGVk
dWxlclN0YXRlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDaHJvbWVDb21wb3NpdG9yU2No
ZWR1bGVyU3RhdGUmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENocm9tZUNvbXBv
c2l0b3JTY2hlZHVsZXJTdGF0ZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVy
cmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsK
KyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRl
OworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJv
b2wgaGFzX3N0YXRlX21hY2hpbmUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQor
ICBjb25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lJiBzdGF0ZV9tYWNoaW5lKCkgY29u
c3QgeyByZXR1cm4gKnN0YXRlX21hY2hpbmVfOyB9CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1h
Y2hpbmUqIG11dGFibGVfc3RhdGVfbWFjaGluZSgpIHsgX2hhc19maWVsZF8uc2V0KDEpOyByZXR1
cm4gc3RhdGVfbWFjaGluZV8uZ2V0KCk7IH0KKworICBib29sIGhhc19vYnNlcnZpbmdfYmVnaW5f
ZnJhbWVfc291cmNlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgYm9vbCBv
YnNlcnZpbmdfYmVnaW5fZnJhbWVfc291cmNlKCkgY29uc3QgeyByZXR1cm4gb2JzZXJ2aW5nX2Jl
Z2luX2ZyYW1lX3NvdXJjZV87IH0KKyAgdm9pZCBzZXRfb2JzZXJ2aW5nX2JlZ2luX2ZyYW1lX3Nv
dXJjZShib29sIHZhbHVlKSB7IG9ic2VydmluZ19iZWdpbl9mcmFtZV9zb3VyY2VfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX2JlZ2luX2ltcGxfZnJhbWVfZGVh
ZGxpbmVfdGFzaygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGJvb2wgYmVn
aW5faW1wbF9mcmFtZV9kZWFkbGluZV90YXNrKCkgY29uc3QgeyByZXR1cm4gYmVnaW5faW1wbF9m
cmFtZV9kZWFkbGluZV90YXNrXzsgfQorICB2b2lkIHNldF9iZWdpbl9pbXBsX2ZyYW1lX2RlYWRs
aW5lX3Rhc2soYm9vbCB2YWx1ZSkgeyBiZWdpbl9pbXBsX2ZyYW1lX2RlYWRsaW5lX3Rhc2tfID0g
dmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX3BlbmRpbmdfYmVnaW5f
ZnJhbWVfdGFzaygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIGJvb2wgcGVu
ZGluZ19iZWdpbl9mcmFtZV90YXNrKCkgY29uc3QgeyByZXR1cm4gcGVuZGluZ19iZWdpbl9mcmFt
ZV90YXNrXzsgfQorICB2b2lkIHNldF9wZW5kaW5nX2JlZ2luX2ZyYW1lX3Rhc2soYm9vbCB2YWx1
ZSkgeyBwZW5kaW5nX2JlZ2luX2ZyYW1lX3Rhc2tfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg0
KTsgfQorCisgIGJvb2wgaGFzX3NraXBwZWRfbGFzdF9mcmFtZV9taXNzZWRfZXhjZWVkZWRfZGVh
ZGxpbmUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s1XTsgfQorICBib29sIHNraXBwZWRf
bGFzdF9mcmFtZV9taXNzZWRfZXhjZWVkZWRfZGVhZGxpbmUoKSBjb25zdCB7IHJldHVybiBza2lw
cGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4Y2VlZGVkX2RlYWRsaW5lXzsgfQorICB2b2lkIHNldF9z
a2lwcGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4Y2VlZGVkX2RlYWRsaW5lKGJvb2wgdmFsdWUpIHsg
c2tpcHBlZF9sYXN0X2ZyYW1lX21pc3NlZF9leGNlZWRlZF9kZWFkbGluZV8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDUpOyB9CisKKyAgYm9vbCBoYXNfc2tpcHBlZF9sYXN0X2ZyYW1lX3RvX3Jl
ZHVjZV9sYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNl07IH0KKyAgYm9vbCBz
a2lwcGVkX2xhc3RfZnJhbWVfdG9fcmVkdWNlX2xhdGVuY3koKSBjb25zdCB7IHJldHVybiBza2lw
cGVkX2xhc3RfZnJhbWVfdG9fcmVkdWNlX2xhdGVuY3lfOyB9CisgIHZvaWQgc2V0X3NraXBwZWRf
bGFzdF9mcmFtZV90b19yZWR1Y2VfbGF0ZW5jeShib29sIHZhbHVlKSB7IHNraXBwZWRfbGFzdF9m
cmFtZV90b19yZWR1Y2VfbGF0ZW5jeV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisK
KyAgYm9vbCBoYXNfaW5zaWRlX2FjdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzdd
OyB9CisgIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJBY3Rpb24gaW5zaWRlX2FjdGlvbigpIGNv
bnN0IHsgcmV0dXJuIGluc2lkZV9hY3Rpb25fOyB9CisgIHZvaWQgc2V0X2luc2lkZV9hY3Rpb24o
Q2hyb21lQ29tcG9zaXRvclNjaGVkdWxlckFjdGlvbiB2YWx1ZSkgeyBpbnNpZGVfYWN0aW9uXyA9
IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNyk7IH0KKworICBib29sIGhhc19kZWFkbGluZV9tb2Rl
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bOF07IH0KKyAgQ2hyb21lQ29tcG9zaXRvclNj
aGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlIGRlYWRsaW5lX21vZGUoKSBj
b25zdCB7IHJldHVybiBkZWFkbGluZV9tb2RlXzsgfQorICB2b2lkIHNldF9kZWFkbGluZV9tb2Rl
KENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9k
ZSB2YWx1ZSkgeyBkZWFkbGluZV9tb2RlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoOCk7IH0K
KworICBib29sIGhhc19kZWFkbGluZV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzld
OyB9CisgIGludDY0X3QgZGVhZGxpbmVfdXMoKSBjb25zdCB7IHJldHVybiBkZWFkbGluZV91c187
IH0KKyAgdm9pZCBzZXRfZGVhZGxpbmVfdXMoaW50NjRfdCB2YWx1ZSkgeyBkZWFkbGluZV91c18g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDkpOyB9CisKKyAgYm9vbCBoYXNfZGVhZGxpbmVfc2No
ZWR1bGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTBdOyB9CisgIGludDY0
X3QgZGVhZGxpbmVfc2NoZWR1bGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gZGVhZGxpbmVfc2No
ZWR1bGVkX2F0X3VzXzsgfQorICB2b2lkIHNldF9kZWFkbGluZV9zY2hlZHVsZWRfYXRfdXMoaW50
NjRfdCB2YWx1ZSkgeyBkZWFkbGluZV9zY2hlZHVsZWRfYXRfdXNfID0gdmFsdWU7IF9oYXNfZmll
bGRfLnNldCgxMCk7IH0KKworICBib29sIGhhc19ub3dfdXMoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1sxMV07IH0KKyAgaW50NjRfdCBub3dfdXMoKSBjb25zdCB7IHJldHVybiBub3dfdXNf
OyB9CisgIHZvaWQgc2V0X25vd191cyhpbnQ2NF90IHZhbHVlKSB7IG5vd191c18gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDExKTsgfQorCisgIGJvb2wgaGFzX25vd190b19kZWFkbGluZV9kZWx0
YV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEyXTsgfQorICBpbnQ2NF90IG5vd190
b19kZWFkbGluZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIG5vd190b19kZWFkbGluZV9kZWx0
YV91c187IH0KKyAgdm9pZCBzZXRfbm93X3RvX2RlYWRsaW5lX2RlbHRhX3VzKGludDY0X3QgdmFs
dWUpIHsgbm93X3RvX2RlYWRsaW5lX2RlbHRhX3VzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
MTIpOyB9CisKKyAgYm9vbCBoYXNfbm93X3RvX2RlYWRsaW5lX3NjaGVkdWxlZF9hdF9kZWx0YV91
cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEzXTsgfQorICBpbnQ2NF90IG5vd190b19k
ZWFkbGluZV9zY2hlZHVsZWRfYXRfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBub3dfdG9fZGVh
ZGxpbmVfc2NoZWR1bGVkX2F0X2RlbHRhX3VzXzsgfQorICB2b2lkIHNldF9ub3dfdG9fZGVhZGxp
bmVfc2NoZWR1bGVkX2F0X2RlbHRhX3VzKGludDY0X3QgdmFsdWUpIHsgbm93X3RvX2RlYWRsaW5l
X3NjaGVkdWxlZF9hdF9kZWx0YV91c18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEzKTsgfQor
CisgIGJvb2wgaGFzX2JlZ2luX2ltcGxfZnJhbWVfYXJncygpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzE0XTsgfQorICBjb25zdCBCZWdpbkltcGxGcmFtZUFyZ3MmIGJlZ2luX2ltcGxfZnJh
bWVfYXJncygpIGNvbnN0IHsgcmV0dXJuICpiZWdpbl9pbXBsX2ZyYW1lX2FyZ3NfOyB9CisgIEJl
Z2luSW1wbEZyYW1lQXJncyogbXV0YWJsZV9iZWdpbl9pbXBsX2ZyYW1lX2FyZ3MoKSB7IF9oYXNf
ZmllbGRfLnNldCgxNCk7IHJldHVybiBiZWdpbl9pbXBsX2ZyYW1lX2FyZ3NfLmdldCgpOyB9CisK
KyAgYm9vbCBoYXNfYmVnaW5fZnJhbWVfb2JzZXJ2ZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1sxNV07IH0KKyAgY29uc3QgQmVnaW5GcmFtZU9ic2VydmVyU3RhdGUmIGJlZ2lu
X2ZyYW1lX29ic2VydmVyX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gKmJlZ2luX2ZyYW1lX29ic2Vy
dmVyX3N0YXRlXzsgfQorICBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZSogbXV0YWJsZV9iZWdpbl9m
cmFtZV9vYnNlcnZlcl9zdGF0ZSgpIHsgX2hhc19maWVsZF8uc2V0KDE1KTsgcmV0dXJuIGJlZ2lu
X2ZyYW1lX29ic2VydmVyX3N0YXRlXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX2JlZ2luX2ZyYW1l
X3NvdXJjZV9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE2XTsgfQorICBjb25z
dCBCZWdpbkZyYW1lU291cmNlU3RhdGUmIGJlZ2luX2ZyYW1lX3NvdXJjZV9zdGF0ZSgpIGNvbnN0
IHsgcmV0dXJuICpiZWdpbl9mcmFtZV9zb3VyY2Vfc3RhdGVfOyB9CisgIEJlZ2luRnJhbWVTb3Vy
Y2VTdGF0ZSogbXV0YWJsZV9iZWdpbl9mcmFtZV9zb3VyY2Vfc3RhdGUoKSB7IF9oYXNfZmllbGRf
LnNldCgxNik7IHJldHVybiBiZWdpbl9mcmFtZV9zb3VyY2Vfc3RhdGVfLmdldCgpOyB9CisKKyAg
Ym9vbCBoYXNfY29tcG9zaXRvcl90aW1pbmdfaGlzdG9yeSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzE3XTsgfQorICBjb25zdCBDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYgY29tcG9zaXRv
cl90aW1pbmdfaGlzdG9yeSgpIGNvbnN0IHsgcmV0dXJuICpjb21wb3NpdG9yX3RpbWluZ19oaXN0
b3J5XzsgfQorICBDb21wb3NpdG9yVGltaW5nSGlzdG9yeSogbXV0YWJsZV9jb21wb3NpdG9yX3Rp
bWluZ19oaXN0b3J5KCkgeyBfaGFzX2ZpZWxkXy5zZXQoMTcpOyByZXR1cm4gY29tcG9zaXRvcl90
aW1pbmdfaGlzdG9yeV8uZ2V0KCk7IH0KKworIHByaXZhdGU6CisgIDo6cHJvdG96ZXJvOjpDb3B5
YWJsZVB0cjxDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lPiBzdGF0ZV9tYWNoaW5lXzsKKyAg
Ym9vbCBvYnNlcnZpbmdfYmVnaW5fZnJhbWVfc291cmNlX3t9OworICBib29sIGJlZ2luX2ltcGxf
ZnJhbWVfZGVhZGxpbmVfdGFza197fTsKKyAgYm9vbCBwZW5kaW5nX2JlZ2luX2ZyYW1lX3Rhc2tf
e307CisgIGJvb2wgc2tpcHBlZF9sYXN0X2ZyYW1lX21pc3NlZF9leGNlZWRlZF9kZWFkbGluZV97
fTsKKyAgYm9vbCBza2lwcGVkX2xhc3RfZnJhbWVfdG9fcmVkdWNlX2xhdGVuY3lfe307CisgIENo
cm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJBY3Rpb24gaW5zaWRlX2FjdGlvbl97fTsKKyAgQ2hyb21l
Q29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlIGRlYWRs
aW5lX21vZGVfe307CisgIGludDY0X3QgZGVhZGxpbmVfdXNfe307CisgIGludDY0X3QgZGVhZGxp
bmVfc2NoZWR1bGVkX2F0X3VzX3t9OworICBpbnQ2NF90IG5vd191c197fTsKKyAgaW50NjRfdCBu
b3dfdG9fZGVhZGxpbmVfZGVsdGFfdXNfe307CisgIGludDY0X3Qgbm93X3RvX2RlYWRsaW5lX3Nj
aGVkdWxlZF9hdF9kZWx0YV91c197fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPEJlZ2lu
SW1wbEZyYW1lQXJncz4gYmVnaW5faW1wbF9mcmFtZV9hcmdzXzsKKyAgOjpwcm90b3plcm86OkNv
cHlhYmxlUHRyPEJlZ2luRnJhbWVPYnNlcnZlclN0YXRlPiBiZWdpbl9mcmFtZV9vYnNlcnZlcl9z
dGF0ZV87CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxCZWdpbkZyYW1lU291cmNlU3RhdGU+
IGJlZ2luX2ZyYW1lX3NvdXJjZV9zdGF0ZV87CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxD
b21wb3NpdG9yVGltaW5nSGlzdG9yeT4gY29tcG9zaXRvcl90aW1pbmdfaGlzdG9yeV87CisKKyAg
Ly8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRp
YmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3Rk
OjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDE4PiBfaGFzX2ZpZWxk
X3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJv
dG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BS
T1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfQ09NUE9TSVRPUl9TQ0hFRFVM
RVJfU1RBVEVfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBn
ZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3NvdXJjZV9sb2NhdGlvbi5nZW4u
aAorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdp
bgorI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VW
RU5UX1NPVVJDRV9MT0NBVElPTl9QUk9UT19DUFBfSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9T
X1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9TT1VSQ0VfTE9DQVRJT05fUFJPVE9f
Q1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVk
ZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKwor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBT
b3VyY2VMb2NhdGlvbjsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNl
IHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2Ns
YXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBQRVJG
RVRUT19FWFBPUlQgU291cmNlTG9jYXRpb24gOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3Nh
Z2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtJaWRGaWVsZE51
bWJlciA9IDEsCisgICAga0ZpbGVOYW1lRmllbGROdW1iZXIgPSAyLAorICAgIGtGdW5jdGlvbk5h
bWVGaWVsZE51bWJlciA9IDMsCisgICAga0xpbmVOdW1iZXJGaWVsZE51bWJlciA9IDQsCisgIH07
CisKKyAgU291cmNlTG9jYXRpb24oKTsKKyAgflNvdXJjZUxvY2F0aW9uKCkgb3ZlcnJpZGU7Cisg
IFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uJiYpIG5vZXhjZXB0OworICBTb3VyY2VMb2Nh
dGlvbiYgb3BlcmF0b3I9KFNvdXJjZUxvY2F0aW9uJiYpOworICBTb3VyY2VMb2NhdGlvbihjb25z
dCBTb3VyY2VMb2NhdGlvbiYpOworICBTb3VyY2VMb2NhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFNv
dXJjZUxvY2F0aW9uJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTb3VyY2VMb2NhdGlvbiYp
IGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU291cmNlTG9jYXRpb24mIG90aGVyKSBj
b25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJy
YXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6
ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlh
bGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3pl
cm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19paWQoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1sxXTsgfQorICB1aW50NjRfdCBpaWQoKSBjb25zdCB7IHJldHVybiBpaWRfOyB9
CisgIHZvaWQgc2V0X2lpZCh1aW50NjRfdCB2YWx1ZSkgeyBpaWRfID0gdmFsdWU7IF9oYXNfZmll
bGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2ZpbGVfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzJdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUoKSBjb25zdCB7
IHJldHVybiBmaWxlX25hbWVfOyB9CisgIHZvaWQgc2V0X2ZpbGVfbmFtZShjb25zdCBzdGQ6OnN0
cmluZyYgdmFsdWUpIHsgZmlsZV9uYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0K
KworICBib29sIGhhc19mdW5jdGlvbl9uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9b
M107IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bmN0aW9uX25hbWUoKSBjb25zdCB7IHJldHVy
biBmdW5jdGlvbl9uYW1lXzsgfQorICB2b2lkIHNldF9mdW5jdGlvbl9uYW1lKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeyBmdW5jdGlvbl9uYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
Myk7IH0KKworICBib29sIGhhc19saW5lX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzRdOyB9CisgIHVpbnQzMl90IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbGluZV9u
dW1iZXJfOyB9CisgIHZvaWQgc2V0X2xpbmVfbnVtYmVyKHVpbnQzMl90IHZhbHVlKSB7IGxpbmVf
bnVtYmVyXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNCk7IH0KKworIHByaXZhdGU6CisgIHVp
bnQ2NF90IGlpZF97fTsKKyAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lX3t9OworICBzdGQ6OnN0cmlu
ZyBmdW5jdGlvbl9uYW1lX3t9OworICB1aW50MzJfdCBsaW5lX251bWJlcl97fTsKKworICAvLyBB
bGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxp
dHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0
cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8NT4gX2hhc19maWVsZF97fTsK
K307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3Rvcwor
fSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfU09VUkNFX0xPQ0FUSU9OX1BST1RPX0NQUF9IXwor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0
ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNo
CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJh
Y2tfZXZlbnQvY2hyb21lX2NvbXBvc2l0b3Jfc2NoZWR1bGVyX3N0YXRlLmdlbi5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3Ry
YWNrX2V2ZW50L3NvdXJjZV9sb2NhdGlvbi5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK0NvbXBvc2l0b3JUaW1pbmdI
aXN0b3J5OjpDb21wb3NpdG9yVGltaW5nSGlzdG9yeSgpID0gZGVmYXVsdDsKK0NvbXBvc2l0b3JU
aW1pbmdIaXN0b3J5Ojp+Q29tcG9zaXRvclRpbWluZ0hpc3RvcnkoKSA9IGRlZmF1bHQ7CitDb21w
b3NpdG9yVGltaW5nSGlzdG9yeTo6Q29tcG9zaXRvclRpbWluZ0hpc3RvcnkoY29uc3QgQ29tcG9z
aXRvclRpbWluZ0hpc3RvcnkmKSA9IGRlZmF1bHQ7CitDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYg
Q29tcG9zaXRvclRpbWluZ0hpc3Rvcnk6Om9wZXJhdG9yPShjb25zdCBDb21wb3NpdG9yVGltaW5n
SGlzdG9yeSYpID0gZGVmYXVsdDsKK0NvbXBvc2l0b3JUaW1pbmdIaXN0b3J5OjpDb21wb3NpdG9y
VGltaW5nSGlzdG9yeShDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYmKSBub2V4Y2VwdCA9IGRlZmF1
bHQ7CitDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYgQ29tcG9zaXRvclRpbWluZ0hpc3Rvcnk6Om9w
ZXJhdG9yPShDb21wb3NpdG9yVGltaW5nSGlzdG9yeSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQ29t
cG9zaXRvclRpbWluZ0hpc3Rvcnk6Om9wZXJhdG9yPT0oY29uc3QgQ29tcG9zaXRvclRpbWluZ0hp
c3RvcnkmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIu
dW5rbm93bl9maWVsZHNfCisgICAmJiBiZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX2NyaXRpY2FsX2Vz
dGltYXRlX2RlbHRhX3VzXyA9PSBvdGhlci5iZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX2NyaXRpY2Fs
X2VzdGltYXRlX2RlbHRhX3VzXworICAgJiYgYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9ub3RfY3Jp
dGljYWxfZXN0aW1hdGVfZGVsdGFfdXNfID09IG90aGVyLmJlZ2luX21haW5fZnJhbWVfcXVldWVf
bm90X2NyaXRpY2FsX2VzdGltYXRlX2RlbHRhX3VzXworICAgJiYgYmVnaW5fbWFpbl9mcmFtZV9z
dGFydF90b19yZWFkeV90b19jb21taXRfZXN0aW1hdGVfZGVsdGFfdXNfID09IG90aGVyLmJlZ2lu
X21haW5fZnJhbWVfc3RhcnRfdG9fcmVhZHlfdG9fY29tbWl0X2VzdGltYXRlX2RlbHRhX3VzXwor
ICAgJiYgY29tbWl0X3RvX3JlYWR5X3RvX2FjdGl2YXRlX2VzdGltYXRlX2RlbHRhX3VzXyA9PSBv
dGhlci5jb21taXRfdG9fcmVhZHlfdG9fYWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXNfCisgICAm
JiBwcmVwYXJlX3RpbGVzX2VzdGltYXRlX2RlbHRhX3VzXyA9PSBvdGhlci5wcmVwYXJlX3RpbGVz
X2VzdGltYXRlX2RlbHRhX3VzXworICAgJiYgYWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXNfID09
IG90aGVyLmFjdGl2YXRlX2VzdGltYXRlX2RlbHRhX3VzXworICAgJiYgZHJhd19lc3RpbWF0ZV9k
ZWx0YV91c18gPT0gb3RoZXIuZHJhd19lc3RpbWF0ZV9kZWx0YV91c187Cit9CisKK2Jvb2wgQ29t
cG9zaXRvclRpbWluZ0hpc3Rvcnk6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6
ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vy
cm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXpl
KTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBm
aWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVs
ZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQor
ICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGJlZ2luX21haW5fZnJh
bWVfcXVldWVfY3JpdGljYWxfZXN0aW1hdGVfZGVsdGFfdXMgKi86CisgICAgICAgIGZpZWxkLmdl
dCgmYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9jcml0aWNhbF9lc3RpbWF0ZV9kZWx0YV91c18pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBiZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX25v
dF9jcml0aWNhbF9lc3RpbWF0ZV9kZWx0YV91cyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZiZWdp
bl9tYWluX2ZyYW1lX3F1ZXVlX25vdF9jcml0aWNhbF9lc3RpbWF0ZV9kZWx0YV91c18pOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBiZWdpbl9tYWluX2ZyYW1lX3N0YXJ0X3RvX3Jl
YWR5X3RvX2NvbW1pdF9lc3RpbWF0ZV9kZWx0YV91cyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZi
ZWdpbl9tYWluX2ZyYW1lX3N0YXJ0X3RvX3JlYWR5X3RvX2NvbW1pdF9lc3RpbWF0ZV9kZWx0YV91
c18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBjb21taXRfdG9fcmVhZHlfdG9f
YWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmY29tbWl0
X3RvX3JlYWR5X3RvX2FjdGl2YXRlX2VzdGltYXRlX2RlbHRhX3VzXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSA1IC8qIHByZXBhcmVfdGlsZXNfZXN0aW1hdGVfZGVsdGFfdXMgKi86Cisg
ICAgICAgIGZpZWxkLmdldCgmcHJlcGFyZV90aWxlc19lc3RpbWF0ZV9kZWx0YV91c18pOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAvKiBhY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91cyAq
LzoKKyAgICAgICAgZmllbGQuZ2V0KCZhY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91c18pOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgNyAvKiBkcmF3X2VzdGltYXRlX2RlbHRhX3VzICovOgor
ICAgICAgICBmaWVsZC5nZXQoJmRyYXdfZXN0aW1hdGVfZGVsdGFfdXNfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygm
dW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAh
cGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBDb21w
b3NpdG9yVGltaW5nSGlzdG9yeTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKwor
c3RkOjp2ZWN0b3I8dWludDhfdD4gQ29tcG9zaXRvclRpbWluZ0hpc3Rvcnk6OlNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86
Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2Vy
aWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIENvbXBvc2l0b3JUaW1pbmdIaXN0b3J5OjpTZXJp
YWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBi
ZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX2NyaXRpY2FsX2VzdGltYXRlX2RlbHRhX3VzCisgIGlmIChf
aGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGJlZ2luX21haW5fZnJh
bWVfcXVldWVfY3JpdGljYWxfZXN0aW1hdGVfZGVsdGFfdXNfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDI6IGJlZ2luX21haW5fZnJhbWVfcXVldWVfbm90X2NyaXRpY2FsX2VzdGltYXRlX2RlbHRhX3Vz
CisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDIsIGJlZ2lu
X21haW5fZnJhbWVfcXVldWVfbm90X2NyaXRpY2FsX2VzdGltYXRlX2RlbHRhX3VzXyk7CisgIH0K
KworICAvLyBGaWVsZCAzOiBiZWdpbl9tYWluX2ZyYW1lX3N0YXJ0X3RvX3JlYWR5X3RvX2NvbW1p
dF9lc3RpbWF0ZV9kZWx0YV91cworICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFw
cGVuZFZhckludCgzLCBiZWdpbl9tYWluX2ZyYW1lX3N0YXJ0X3RvX3JlYWR5X3RvX2NvbW1pdF9l
c3RpbWF0ZV9kZWx0YV91c18pOworICB9CisKKyAgLy8gRmllbGQgNDogY29tbWl0X3RvX3JlYWR5
X3RvX2FjdGl2YXRlX2VzdGltYXRlX2RlbHRhX3VzCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgewor
ICAgIG1zZy0+QXBwZW5kVmFySW50KDQsIGNvbW1pdF90b19yZWFkeV90b19hY3RpdmF0ZV9lc3Rp
bWF0ZV9kZWx0YV91c18pOworICB9CisKKyAgLy8gRmllbGQgNTogcHJlcGFyZV90aWxlc19lc3Rp
bWF0ZV9kZWx0YV91cworICBpZiAoX2hhc19maWVsZF9bNV0pIHsKKyAgICBtc2ctPkFwcGVuZFZh
ckludCg1LCBwcmVwYXJlX3RpbGVzX2VzdGltYXRlX2RlbHRhX3VzXyk7CisgIH0KKworICAvLyBG
aWVsZCA2OiBhY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91cworICBpZiAoX2hhc19maWVsZF9bNl0p
IHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg2LCBhY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91c18p
OworICB9CisKKyAgLy8gRmllbGQgNzogZHJhd19lc3RpbWF0ZV9kZWx0YV91cworICBpZiAoX2hh
c19maWVsZF9bN10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg3LCBkcmF3X2VzdGltYXRlX2Rl
bHRhX3VzXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVs
ZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworQmVnaW5GcmFtZVNv
dXJjZVN0YXRlOjpCZWdpbkZyYW1lU291cmNlU3RhdGUoKSA9IGRlZmF1bHQ7CitCZWdpbkZyYW1l
U291cmNlU3RhdGU6On5CZWdpbkZyYW1lU291cmNlU3RhdGUoKSA9IGRlZmF1bHQ7CitCZWdpbkZy
YW1lU291cmNlU3RhdGU6OkJlZ2luRnJhbWVTb3VyY2VTdGF0ZShjb25zdCBCZWdpbkZyYW1lU291
cmNlU3RhdGUmKSA9IGRlZmF1bHQ7CitCZWdpbkZyYW1lU291cmNlU3RhdGUmIEJlZ2luRnJhbWVT
b3VyY2VTdGF0ZTo6b3BlcmF0b3I9KGNvbnN0IEJlZ2luRnJhbWVTb3VyY2VTdGF0ZSYpID0gZGVm
YXVsdDsKK0JlZ2luRnJhbWVTb3VyY2VTdGF0ZTo6QmVnaW5GcmFtZVNvdXJjZVN0YXRlKEJlZ2lu
RnJhbWVTb3VyY2VTdGF0ZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitCZWdpbkZyYW1lU291cmNl
U3RhdGUmIEJlZ2luRnJhbWVTb3VyY2VTdGF0ZTo6b3BlcmF0b3I9KEJlZ2luRnJhbWVTb3VyY2VT
dGF0ZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQmVnaW5GcmFtZVNvdXJjZVN0YXRlOjpvcGVyYXRv
cj09KGNvbnN0IEJlZ2luRnJhbWVTb3VyY2VTdGF0ZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJu
IHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHNvdXJjZV9p
ZF8gPT0gb3RoZXIuc291cmNlX2lkXworICAgJiYgcGF1c2VkXyA9PSBvdGhlci5wYXVzZWRfCisg
ICAmJiBudW1fb2JzZXJ2ZXJzXyA9PSBvdGhlci5udW1fb2JzZXJ2ZXJzXworICAgJiYgbGFzdF9i
ZWdpbl9mcmFtZV9hcmdzXyA9PSBvdGhlci5sYXN0X2JlZ2luX2ZyYW1lX2FyZ3NfOworfQorCiti
b29sIEJlZ2luRnJhbWVTb3VyY2VTdGF0ZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3
LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNr
ZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcs
IHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlk
KCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFz
X2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAg
ICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogc291cmNlX2lk
ICovOgorICAgICAgICBmaWVsZC5nZXQoJnNvdXJjZV9pZF8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgMiAvKiBwYXVzZWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmcGF1c2VkXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIG51bV9vYnNlcnZlcnMgKi86CisgICAgICAg
IGZpZWxkLmdldCgmbnVtX29ic2VydmVyc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
NCAvKiBsYXN0X2JlZ2luX2ZyYW1lX2FyZ3MgKi86CisgICAgICAgICgqbGFzdF9iZWdpbl9mcmFt
ZV9hcmdzXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5k
VG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1
cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcg
QmVnaW5GcmFtZVNvdXJjZVN0YXRlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQor
CitzdGQ6OnZlY3Rvcjx1aW50OF90PiBCZWdpbkZyYW1lU291cmNlU3RhdGU6OlNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86
Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2Vy
aWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEJlZ2luRnJhbWVTb3VyY2VTdGF0ZTo6U2VyaWFs
aXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogc291
cmNlX2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEs
IHNvdXJjZV9pZF8pOworICB9CisKKyAgLy8gRmllbGQgMjogcGF1c2VkCisgIGlmIChfaGFzX2Zp
ZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgyLCBwYXVzZWRfKTsKKyAgfQor
CisgIC8vIEZpZWxkIDM6IG51bV9vYnNlcnZlcnMKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMywgbnVtX29ic2VydmVyc18pOworICB9CisKKyAgLy8gRmll
bGQgNDogbGFzdF9iZWdpbl9mcmFtZV9hcmdzCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAg
ICgqbGFzdF9iZWdpbl9mcmFtZV9hcmdzXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNz
YWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPig0KSk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKKworQmVnaW5GcmFtZUFyZ3M6OkJlZ2luRnJhbWVBcmdzKCkgPSBkZWZhdWx0OworQmVn
aW5GcmFtZUFyZ3M6On5CZWdpbkZyYW1lQXJncygpID0gZGVmYXVsdDsKK0JlZ2luRnJhbWVBcmdz
OjpCZWdpbkZyYW1lQXJncyhjb25zdCBCZWdpbkZyYW1lQXJncyYpID0gZGVmYXVsdDsKK0JlZ2lu
RnJhbWVBcmdzJiBCZWdpbkZyYW1lQXJnczo6b3BlcmF0b3I9KGNvbnN0IEJlZ2luRnJhbWVBcmdz
JikgPSBkZWZhdWx0OworQmVnaW5GcmFtZUFyZ3M6OkJlZ2luRnJhbWVBcmdzKEJlZ2luRnJhbWVB
cmdzJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0JlZ2luRnJhbWVBcmdzJiBCZWdpbkZyYW1lQXJn
czo6b3BlcmF0b3I9KEJlZ2luRnJhbWVBcmdzJiYpID0gZGVmYXVsdDsKKworYm9vbCBCZWdpbkZy
YW1lQXJnczo6b3BlcmF0b3I9PShjb25zdCBCZWdpbkZyYW1lQXJncyYgb3RoZXIpIGNvbnN0IHsK
KyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYm
IHR5cGVfID09IG90aGVyLnR5cGVfCisgICAmJiBzb3VyY2VfaWRfID09IG90aGVyLnNvdXJjZV9p
ZF8KKyAgICYmIHNlcXVlbmNlX251bWJlcl8gPT0gb3RoZXIuc2VxdWVuY2VfbnVtYmVyXworICAg
JiYgZnJhbWVfdGltZV91c18gPT0gb3RoZXIuZnJhbWVfdGltZV91c18KKyAgICYmIGRlYWRsaW5l
X3VzXyA9PSBvdGhlci5kZWFkbGluZV91c18KKyAgICYmIGludGVydmFsX2RlbHRhX3VzXyA9PSBv
dGhlci5pbnRlcnZhbF9kZWx0YV91c18KKyAgICYmIG9uX2NyaXRpY2FsX3BhdGhfID09IG90aGVy
Lm9uX2NyaXRpY2FsX3BhdGhfCisgICAmJiBhbmltYXRlX29ubHlfID09IG90aGVyLmFuaW1hdGVf
b25seV8KKyAgICYmIHNvdXJjZV9sb2NhdGlvbl9paWRfID09IG90aGVyLnNvdXJjZV9sb2NhdGlv
bl9paWRfCisgICAmJiBzb3VyY2VfbG9jYXRpb25fID09IG90aGVyLnNvdXJjZV9sb2NhdGlvbl87
Cit9CisKK2Jvb2wgQmVnaW5GcmFtZUFyZ3M6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJh
dywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFj
a2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3
LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxp
ZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hh
c19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7Cisg
ICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHR5cGUgKi86
CisgICAgICAgIGZpZWxkLmdldCgmdHlwZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
MiAvKiBzb3VyY2VfaWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmc291cmNlX2lkXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIHNlcXVlbmNlX251bWJlciAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZzZXF1ZW5jZV9udW1iZXJfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl
IDQgLyogZnJhbWVfdGltZV91cyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZmcmFtZV90aW1lX3Vz
Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1IC8qIGRlYWRsaW5lX3VzICovOgorICAg
ICAgICBmaWVsZC5nZXQoJmRlYWRsaW5lX3VzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSA2IC8qIGludGVydmFsX2RlbHRhX3VzICovOgorICAgICAgICBmaWVsZC5nZXQoJmludGVydmFs
X2RlbHRhX3VzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3IC8qIG9uX2NyaXRpY2Fs
X3BhdGggKi86CisgICAgICAgIGZpZWxkLmdldCgmb25fY3JpdGljYWxfcGF0aF8pOworICAgICAg
ICBicmVhazsKKyAgICAgIGNhc2UgOCAvKiBhbmltYXRlX29ubHkgKi86CisgICAgICAgIGZpZWxk
LmdldCgmYW5pbWF0ZV9vbmx5Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5IC8qIHNv
dXJjZV9sb2NhdGlvbl9paWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmc291cmNlX2xvY2F0aW9u
X2lpZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAgLyogc291cmNlX2xvY2F0aW9u
ICovOgorICAgICAgICAoKnNvdXJjZV9sb2NhdGlvbl8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5h
c19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAg
IGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBi
cmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19s
ZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEJlZ2luRnJhbWVBcmdzOjpTZXJpYWxpemVBc1N0cmlu
ZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVz
c2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxp
emVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBCZWdpbkZyYW1lQXJnczo6
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQmVnaW5GcmFtZUFyZ3M6OlNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6
IHR5cGUKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwg
dHlwZV8pOworICB9CisKKyAgLy8gRmllbGQgMjogc291cmNlX2lkCisgIGlmIChfaGFzX2ZpZWxk
X1syXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDIsIHNvdXJjZV9pZF8pOworICB9CisKKyAg
Ly8gRmllbGQgMzogc2VxdWVuY2VfbnVtYmVyCisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDMsIHNlcXVlbmNlX251bWJlcl8pOworICB9CisKKyAgLy8gRmll
bGQgNDogZnJhbWVfdGltZV91cworICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ctPkFw
cGVuZFZhckludCg0LCBmcmFtZV90aW1lX3VzXyk7CisgIH0KKworICAvLyBGaWVsZCA1OiBkZWFk
bGluZV91cworICBpZiAoX2hhc19maWVsZF9bNV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg1
LCBkZWFkbGluZV91c18pOworICB9CisKKyAgLy8gRmllbGQgNjogaW50ZXJ2YWxfZGVsdGFfdXMK
KyAgaWYgKF9oYXNfZmllbGRfWzZdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNiwgaW50ZXJ2
YWxfZGVsdGFfdXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDc6IG9uX2NyaXRpY2FsX3BhdGgKKyAg
aWYgKF9oYXNfZmllbGRfWzddKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDcsIG9uX2Ny
aXRpY2FsX3BhdGhfKTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IGFuaW1hdGVfb25seQorICBpZiAo
X2hhc19maWVsZF9bOF0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoOCwgYW5pbWF0ZV9v
bmx5Xyk7CisgIH0KKworICAvLyBGaWVsZCA5OiBzb3VyY2VfbG9jYXRpb25faWlkCisgIGlmIChf
aGFzX2ZpZWxkX1s5XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDksIHNvdXJjZV9sb2NhdGlv
bl9paWRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDEwOiBzb3VyY2VfbG9jYXRpb24KKyAgaWYgKF9o
YXNfZmllbGRfWzEwXSkgeworICAgICgqc291cmNlX2xvY2F0aW9uXykuU2VyaWFsaXplKG1zZy0+
QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigxMCkpOworICB9CisKKyAg
bXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25f
ZmllbGRzXy5zaXplKCkpOworfQorCisKK0JlZ2luRnJhbWVPYnNlcnZlclN0YXRlOjpCZWdpbkZy
YW1lT2JzZXJ2ZXJTdGF0ZSgpID0gZGVmYXVsdDsKK0JlZ2luRnJhbWVPYnNlcnZlclN0YXRlOjp+
QmVnaW5GcmFtZU9ic2VydmVyU3RhdGUoKSA9IGRlZmF1bHQ7CitCZWdpbkZyYW1lT2JzZXJ2ZXJT
dGF0ZTo6QmVnaW5GcmFtZU9ic2VydmVyU3RhdGUoY29uc3QgQmVnaW5GcmFtZU9ic2VydmVyU3Rh
dGUmKSA9IGRlZmF1bHQ7CitCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZSYgQmVnaW5GcmFtZU9ic2Vy
dmVyU3RhdGU6Om9wZXJhdG9yPShjb25zdCBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZSYpID0gZGVm
YXVsdDsKK0JlZ2luRnJhbWVPYnNlcnZlclN0YXRlOjpCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZShC
ZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitCZWdpbkZyYW1l
T2JzZXJ2ZXJTdGF0ZSYgQmVnaW5GcmFtZU9ic2VydmVyU3RhdGU6Om9wZXJhdG9yPShCZWdpbkZy
YW1lT2JzZXJ2ZXJTdGF0ZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQmVnaW5GcmFtZU9ic2VydmVy
U3RhdGU6Om9wZXJhdG9yPT0oY29uc3QgQmVnaW5GcmFtZU9ic2VydmVyU3RhdGUmIG90aGVyKSBj
b25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNf
CisgICAmJiBkcm9wcGVkX2JlZ2luX2ZyYW1lX2FyZ3NfID09IG90aGVyLmRyb3BwZWRfYmVnaW5f
ZnJhbWVfYXJnc18KKyAgICYmIGxhc3RfYmVnaW5fZnJhbWVfYXJnc18gPT0gb3RoZXIubGFzdF9i
ZWdpbl9mcmFtZV9hcmdzXzsKK30KKworYm9vbCBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZTo6UGFy
c2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2Zp
ZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3Rv
emVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7
CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNf
ZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7
CisgICAgICBjYXNlIDEgLyogZHJvcHBlZF9iZWdpbl9mcmFtZV9hcmdzICovOgorICAgICAgICBm
aWVsZC5nZXQoJmRyb3BwZWRfYmVnaW5fZnJhbWVfYXJnc18pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgMiAvKiBsYXN0X2JlZ2luX2ZyYW1lX2FyZ3MgKi86CisgICAgICAgICgqbGFzdF9i
ZWdpbl9mcmFtZV9hcmdzXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7
CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXpl
QW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAg
fQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3Rk
OjpzdHJpbmcgQmVnaW5GcmFtZU9ic2VydmVyU3RhdGU6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29u
c3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBt
c2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3Ry
aW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJlZ2luRnJhbWVPYnNlcnZlclN0YXRl
OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVk
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICBy
ZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBCZWdpbkZyYW1lT2JzZXJ2
ZXJTdGF0ZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAg
Ly8gRmllbGQgMTogZHJvcHBlZF9iZWdpbl9mcmFtZV9hcmdzCisgIGlmIChfaGFzX2ZpZWxkX1sx
XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGRyb3BwZWRfYmVnaW5fZnJhbWVfYXJnc18p
OworICB9CisKKyAgLy8gRmllbGQgMjogbGFzdF9iZWdpbl9mcmFtZV9hcmdzCisgIGlmIChfaGFz
X2ZpZWxkX1syXSkgeworICAgICgqbGFzdF9iZWdpbl9mcmFtZV9hcmdzXykuU2VyaWFsaXplKG1z
Zy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyKSk7CisgIH0KKwor
ICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93
bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworQmVnaW5JbXBsRnJhbWVBcmdzOjpCZWdpbkltcGxG
cmFtZUFyZ3MoKSA9IGRlZmF1bHQ7CitCZWdpbkltcGxGcmFtZUFyZ3M6On5CZWdpbkltcGxGcmFt
ZUFyZ3MoKSA9IGRlZmF1bHQ7CitCZWdpbkltcGxGcmFtZUFyZ3M6OkJlZ2luSW1wbEZyYW1lQXJn
cyhjb25zdCBCZWdpbkltcGxGcmFtZUFyZ3MmKSA9IGRlZmF1bHQ7CitCZWdpbkltcGxGcmFtZUFy
Z3MmIEJlZ2luSW1wbEZyYW1lQXJnczo6b3BlcmF0b3I9KGNvbnN0IEJlZ2luSW1wbEZyYW1lQXJn
cyYpID0gZGVmYXVsdDsKK0JlZ2luSW1wbEZyYW1lQXJnczo6QmVnaW5JbXBsRnJhbWVBcmdzKEJl
Z2luSW1wbEZyYW1lQXJncyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitCZWdpbkltcGxGcmFtZUFy
Z3MmIEJlZ2luSW1wbEZyYW1lQXJnczo6b3BlcmF0b3I9KEJlZ2luSW1wbEZyYW1lQXJncyYmKSA9
IGRlZmF1bHQ7CisKK2Jvb2wgQmVnaW5JbXBsRnJhbWVBcmdzOjpvcGVyYXRvcj09KGNvbnN0IEJl
Z2luSW1wbEZyYW1lQXJncyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRz
XyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHVwZGF0ZWRfYXRfdXNfID09IG90aGVy
LnVwZGF0ZWRfYXRfdXNfCisgICAmJiBmaW5pc2hlZF9hdF91c18gPT0gb3RoZXIuZmluaXNoZWRf
YXRfdXNfCisgICAmJiBzdGF0ZV8gPT0gb3RoZXIuc3RhdGVfCisgICAmJiBjdXJyZW50X2FyZ3Nf
ID09IG90aGVyLmN1cnJlbnRfYXJnc18KKyAgICYmIGxhc3RfYXJnc18gPT0gb3RoZXIubGFzdF9h
cmdzXworICAgJiYgdGltZXN0YW1wc19pbl91c18gPT0gb3RoZXIudGltZXN0YW1wc19pbl91c187
Cit9CisKK2Jvb2wgQmVnaW5JbXBsRnJhbWVBcmdzOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lk
KiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29s
IHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVj
KHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQu
dmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8
IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkp
OworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiB1cGRh
dGVkX2F0X3VzICovOgorICAgICAgICBmaWVsZC5nZXQoJnVwZGF0ZWRfYXRfdXNfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogZmluaXNoZWRfYXRfdXMgKi86CisgICAgICAgIGZp
ZWxkLmdldCgmZmluaXNoZWRfYXRfdXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMg
Lyogc3RhdGUgKi86CisgICAgICAgIGZpZWxkLmdldCgmc3RhdGVfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDQgLyogY3VycmVudF9hcmdzICovOgorICAgICAgICAoKmN1cnJlbnRfYXJn
c18pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgNSAvKiBsYXN0X2FyZ3MgKi86CisgICAgICAgICgqbGFzdF9hcmdzXyku
UGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgY2FzZSA2IC8qIHRpbWVzdGFtcHNfaW5fdXMgKi86CisgICAgICAgICgqdGltZXN0YW1w
c19pbl91c18pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAg
ICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVu
ZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0
dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5n
IEJlZ2luSW1wbEZyYW1lQXJnczo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKwor
c3RkOjp2ZWN0b3I8dWludDhfdD4gQmVnaW5JbXBsRnJhbWVBcmdzOjpTZXJpYWxpemVBc0FycmF5
KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6
ZUFzQXJyYXkoKTsKK30KKwordm9pZCBCZWdpbkltcGxGcmFtZUFyZ3M6OlNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IHVwZGF0ZWRfYXRf
dXMKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgdXBk
YXRlZF9hdF91c18pOworICB9CisKKyAgLy8gRmllbGQgMjogZmluaXNoZWRfYXRfdXMKKyAgaWYg
KF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgZmluaXNoZWRfYXRf
dXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IHN0YXRlCisgIGlmIChfaGFzX2ZpZWxkX1szXSkg
eworICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIHN0YXRlXyk7CisgIH0KKworICAvLyBGaWVsZCA0
OiBjdXJyZW50X2FyZ3MKKyAgaWYgKF9oYXNfZmllbGRfWzRdKSB7CisgICAgKCpjdXJyZW50X2Fy
Z3NfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3Nh
Z2U+KDQpKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IGxhc3RfYXJncworICBpZiAoX2hhc19maWVs
ZF9bNV0pIHsKKyAgICAoKmxhc3RfYXJnc18pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVz
c2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oNSkpOworICB9CisKKyAgLy8gRmllbGQgNjogdGlt
ZXN0YW1wc19pbl91cworICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAgICAoKnRpbWVzdGFtcHNf
aW5fdXNfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+KDYpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2Zp
ZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitCZWdpbkltcGxG
cmFtZUFyZ3NfVGltZXN0YW1wc0luVXM6OkJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5V
cygpID0gZGVmYXVsdDsKK0JlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5Vczo6fkJlZ2lu
SW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5VcygpID0gZGVmYXVsdDsKK0JlZ2luSW1wbEZyYW1l
QXJnc19UaW1lc3RhbXBzSW5Vczo6QmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzKGNv
bnN0IEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5VcyYpID0gZGVmYXVsdDsKK0JlZ2lu
SW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5VcyYgQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFt
cHNJblVzOjpvcGVyYXRvcj0oY29uc3QgQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVz
JikgPSBkZWZhdWx0OworQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzOjpCZWdpbklt
cGxGcmFtZUFyZ3NfVGltZXN0YW1wc0luVXMoQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJ
blVzJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0JlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBz
SW5VcyYgQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzOjpvcGVyYXRvcj0oQmVnaW5J
bXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzJiYpID0gZGVmYXVsdDsKKworYm9vbCBCZWdpbklt
cGxGcmFtZUFyZ3NfVGltZXN0YW1wc0luVXM6Om9wZXJhdG9yPT0oY29uc3QgQmVnaW5JbXBsRnJh
bWVBcmdzX1RpbWVzdGFtcHNJblVzJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9m
aWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgaW50ZXJ2YWxfZGVsdGFfID09
IG90aGVyLmludGVydmFsX2RlbHRhXworICAgJiYgbm93X3RvX2RlYWRsaW5lX2RlbHRhXyA9PSBv
dGhlci5ub3dfdG9fZGVhZGxpbmVfZGVsdGFfCisgICAmJiBmcmFtZV90aW1lX3RvX25vd19kZWx0
YV8gPT0gb3RoZXIuZnJhbWVfdGltZV90b19ub3dfZGVsdGFfCisgICAmJiBmcmFtZV90aW1lX3Rv
X2RlYWRsaW5lX2RlbHRhXyA9PSBvdGhlci5mcmFtZV90aW1lX3RvX2RlYWRsaW5lX2RlbHRhXwor
ICAgJiYgbm93XyA9PSBvdGhlci5ub3dfCisgICAmJiBmcmFtZV90aW1lXyA9PSBvdGhlci5mcmFt
ZV90aW1lXworICAgJiYgZGVhZGxpbmVfID09IG90aGVyLmRlYWRsaW5lXzsKK30KKworYm9vbCBC
ZWdpbkltcGxGcmFtZUFyZ3NfVGltZXN0YW1wc0luVXM6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZv
aWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGlu
dGVydmFsX2RlbHRhICovOgorICAgICAgICBmaWVsZC5nZXQoJmludGVydmFsX2RlbHRhXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIG5vd190b19kZWFkbGluZV9kZWx0YSAqLzoK
KyAgICAgICAgZmllbGQuZ2V0KCZub3dfdG9fZGVhZGxpbmVfZGVsdGFfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDMgLyogZnJhbWVfdGltZV90b19ub3dfZGVsdGEgKi86CisgICAgICAg
IGZpZWxkLmdldCgmZnJhbWVfdGltZV90b19ub3dfZGVsdGFfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDQgLyogZnJhbWVfdGltZV90b19kZWFkbGluZV9kZWx0YSAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZmcmFtZV90aW1lX3RvX2RlYWRsaW5lX2RlbHRhXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSA1IC8qIG5vdyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZub3dfKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYgLyogZnJhbWVfdGltZSAqLzoKKyAgICAgICAgZmll
bGQuZ2V0KCZmcmFtZV90aW1lXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3IC8qIGRl
YWRsaW5lICovOgorICAgICAgICBmaWVsZC5nZXQoJmRlYWRsaW5lXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVu
a25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBh
Y2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgQmVnaW5J
bXBsRnJhbWVBcmdzX1RpbWVzdGFtcHNJblVzOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsK
KyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOwor
ICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygp
OworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBCZWdpbkltcGxGcmFtZUFyZ3NfVGltZXN0YW1w
c0luVXM6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVm
ZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7
CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEJlZ2luSW1wbEZy
YW1lQXJnc19UaW1lc3RhbXBzSW5Vczo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBt
c2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogaW50ZXJ2YWxfZGVsdGEKKyAgaWYgKF9oYXNfZmll
bGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgaW50ZXJ2YWxfZGVsdGFfKTsKKyAg
fQorCisgIC8vIEZpZWxkIDI6IG5vd190b19kZWFkbGluZV9kZWx0YQorICBpZiAoX2hhc19maWVs
ZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBub3dfdG9fZGVhZGxpbmVfZGVsdGFf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGZyYW1lX3RpbWVfdG9fbm93X2RlbHRhCisgIGlmIChf
aGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIGZyYW1lX3RpbWVfdG9f
bm93X2RlbHRhXyk7CisgIH0KKworICAvLyBGaWVsZCA0OiBmcmFtZV90aW1lX3RvX2RlYWRsaW5l
X2RlbHRhCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDQs
IGZyYW1lX3RpbWVfdG9fZGVhZGxpbmVfZGVsdGFfKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IG5v
dworICBpZiAoX2hhc19maWVsZF9bNV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg1LCBub3df
KTsKKyAgfQorCisgIC8vIEZpZWxkIDY6IGZyYW1lX3RpbWUKKyAgaWYgKF9oYXNfZmllbGRfWzZd
KSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNiwgZnJhbWVfdGltZV8pOworICB9CisKKyAgLy8g
RmllbGQgNzogZGVhZGxpbmUKKyAgaWYgKF9oYXNfZmllbGRfWzddKSB7CisgICAgbXNnLT5BcHBl
bmRWYXJJbnQoNywgZGVhZGxpbmVfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRl
cyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKwor
CitDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lOjpDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNo
aW5lKCkgPSBkZWZhdWx0OworQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZTo6fkNocm9tZUNv
bXBvc2l0b3JTdGF0ZU1hY2hpbmUoKSA9IGRlZmF1bHQ7CitDaHJvbWVDb21wb3NpdG9yU3RhdGVN
YWNoaW5lOjpDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lKGNvbnN0IENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmUmKSA9IGRlZmF1bHQ7CitDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5l
JiBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lOjpvcGVyYXRvcj0oY29uc3QgQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZSYpID0gZGVmYXVsdDsKK0Nocm9tZUNvbXBvc2l0b3JTdGF0ZU1h
Y2hpbmU6OkNocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmUoQ2hyb21lQ29tcG9zaXRvclN0YXRl
TWFjaGluZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNo
aW5lJiBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lOjpvcGVyYXRvcj0oQ2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQ2hyb21lQ29tcG9zaXRvclN0
YXRlTWFjaGluZTo6b3BlcmF0b3I9PShjb25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5l
JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25v
d25fZmllbGRzXworICAgJiYgbWFqb3Jfc3RhdGVfID09IG90aGVyLm1ham9yX3N0YXRlXworICAg
JiYgbWlub3Jfc3RhdGVfID09IG90aGVyLm1pbm9yX3N0YXRlXzsKK30KKworYm9vbCBDaHJvbWVD
b21wb3NpdG9yU3RhdGVNYWNoaW5lOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNp
emVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9l
cnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6
ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsg
ZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmll
bGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0K
KyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBtYWpvcl9zdGF0ZSAq
LzoKKyAgICAgICAgKCptYWpvcl9zdGF0ZV8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRf
c3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBtaW5vcl9zdGF0ZSAq
LzoKKyAgICAgICAgKCptaW5vcl9zdGF0ZV8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRf
c3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxk
LlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsK
KyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7
Cit9CisKK3N0ZDo6c3RyaW5nIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmU6OlNlcmlhbGl6
ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96
ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNn
LlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENocm9tZUNv
bXBvc2l0b3JTdGF0ZU1hY2hpbmU6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2
b2lkIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmU6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IG1ham9yX3N0YXRlCisgIGlmIChf
aGFzX2ZpZWxkX1sxXSkgeworICAgICgqbWFqb3Jfc3RhdGVfKS5TZXJpYWxpemUobXNnLT5CZWdp
bk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDEpKTsKKyAgfQorCisgIC8vIEZp
ZWxkIDI6IG1pbm9yX3N0YXRlCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgICgqbWlub3Jf
c3RhdGVfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+KDIpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2Zp
ZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGU6OkNocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hp
bmVfTWlub3JTdGF0ZSgpID0gZGVmYXVsdDsKK0Nocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVf
TWlub3JTdGF0ZTo6fkNocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZSgpID0g
ZGVmYXVsdDsKK0Nocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZTo6Q2hyb21l
Q29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlKGNvbnN0IENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWlub3JTdGF0ZSYpID0gZGVmYXVsdDsKK0Nocm9tZUNvbXBvc2l0b3JTdGF0
ZU1hY2hpbmVfTWlub3JTdGF0ZSYgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0
YXRlOjpvcGVyYXRvcj0oY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0
YXRlJikgPSBkZWZhdWx0OworQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRl
OjpDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGUoQ2hyb21lQ29tcG9zaXRv
clN0YXRlTWFjaGluZV9NaW5vclN0YXRlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0Nocm9tZUNv
bXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZSYgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFj
aGluZV9NaW5vclN0YXRlOjpvcGVyYXRvcj0oQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
aW5vclN0YXRlJiYpID0gZGVmYXVsdDsKKworYm9vbCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNo
aW5lX01pbm9yU3RhdGU6Om9wZXJhdG9yPT0oY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFj
aGluZV9NaW5vclN0YXRlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNf
ID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgY29tbWl0X2NvdW50XyA9PSBvdGhlci5j
b21taXRfY291bnRfCisgICAmJiBjdXJyZW50X2ZyYW1lX251bWJlcl8gPT0gb3RoZXIuY3VycmVu
dF9mcmFtZV9udW1iZXJfCisgICAmJiBsYXN0X2ZyYW1lX251bWJlcl9zdWJtaXRfcGVyZm9ybWVk
XyA9PSBvdGhlci5sYXN0X2ZyYW1lX251bWJlcl9zdWJtaXRfcGVyZm9ybWVkXworICAgJiYgbGFz
dF9mcmFtZV9udW1iZXJfZHJhd19wZXJmb3JtZWRfID09IG90aGVyLmxhc3RfZnJhbWVfbnVtYmVy
X2RyYXdfcGVyZm9ybWVkXworICAgJiYgbGFzdF9mcmFtZV9udW1iZXJfYmVnaW5fbWFpbl9mcmFt
ZV9zZW50XyA9PSBvdGhlci5sYXN0X2ZyYW1lX251bWJlcl9iZWdpbl9tYWluX2ZyYW1lX3NlbnRf
CisgICAmJiBkaWRfZHJhd18gPT0gb3RoZXIuZGlkX2RyYXdfCisgICAmJiBkaWRfc2VuZF9iZWdp
bl9tYWluX2ZyYW1lX2Zvcl9jdXJyZW50X2ZyYW1lXyA9PSBvdGhlci5kaWRfc2VuZF9iZWdpbl9t
YWluX2ZyYW1lX2Zvcl9jdXJyZW50X2ZyYW1lXworICAgJiYgZGlkX25vdGlmeV9iZWdpbl9tYWlu
X2ZyYW1lX25vdF9leHBlY3RlZF91bnRpbF8gPT0gb3RoZXIuZGlkX25vdGlmeV9iZWdpbl9tYWlu
X2ZyYW1lX25vdF9leHBlY3RlZF91bnRpbF8KKyAgICYmIGRpZF9ub3RpZnlfYmVnaW5fbWFpbl9m
cmFtZV9ub3RfZXhwZWN0ZWRfc29vbl8gPT0gb3RoZXIuZGlkX25vdGlmeV9iZWdpbl9tYWluX2Zy
YW1lX25vdF9leHBlY3RlZF9zb29uXworICAgJiYgd2FudHNfYmVnaW5fbWFpbl9mcmFtZV9ub3Rf
ZXhwZWN0ZWRfID09IG90aGVyLndhbnRzX2JlZ2luX21haW5fZnJhbWVfbm90X2V4cGVjdGVkXwor
ICAgJiYgZGlkX2NvbW1pdF9kdXJpbmdfZnJhbWVfID09IG90aGVyLmRpZF9jb21taXRfZHVyaW5n
X2ZyYW1lXworICAgJiYgZGlkX2ludmFsaWRhdGVfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rXyA9PSBv
dGhlci5kaWRfaW52YWxpZGF0ZV9sYXllcl90cmVlX2ZyYW1lX3NpbmtfCisgICAmJiBkaWRfcGVy
Zm9ybV9pbXBsX3NpZGVfaW52YWxpZGFpb25fID09IG90aGVyLmRpZF9wZXJmb3JtX2ltcGxfc2lk
ZV9pbnZhbGlkYWlvbl8KKyAgICYmIGRpZF9wcmVwYXJlX3RpbGVzXyA9PSBvdGhlci5kaWRfcHJl
cGFyZV90aWxlc18KKyAgICYmIGNvbnNlY3V0aXZlX2NoZWNrZXJib2FyZF9hbmltYXRpb25zXyA9
PSBvdGhlci5jb25zZWN1dGl2ZV9jaGVja2VyYm9hcmRfYW5pbWF0aW9uc18KKyAgICYmIHBlbmRp
bmdfc3VibWl0X2ZyYW1lc18gPT0gb3RoZXIucGVuZGluZ19zdWJtaXRfZnJhbWVzXworICAgJiYg
c3VibWl0X2ZyYW1lc193aXRoX2N1cnJlbnRfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rXyA9PSBvdGhl
ci5zdWJtaXRfZnJhbWVzX3dpdGhfY3VycmVudF9sYXllcl90cmVlX2ZyYW1lX3NpbmtfCisgICAm
JiBuZWVkc19yZWRyYXdfID09IG90aGVyLm5lZWRzX3JlZHJhd18KKyAgICYmIG5lZWRzX3ByZXBh
cmVfdGlsZXNfID09IG90aGVyLm5lZWRzX3ByZXBhcmVfdGlsZXNfCisgICAmJiBuZWVkc19iZWdp
bl9tYWluX2ZyYW1lXyA9PSBvdGhlci5uZWVkc19iZWdpbl9tYWluX2ZyYW1lXworICAgJiYgbmVl
ZHNfb25lX2JlZ2luX2ltcGxfZnJhbWVfID09IG90aGVyLm5lZWRzX29uZV9iZWdpbl9pbXBsX2Zy
YW1lXworICAgJiYgdmlzaWJsZV8gPT0gb3RoZXIudmlzaWJsZV8KKyAgICYmIGJlZ2luX2ZyYW1l
X3NvdXJjZV9wYXVzZWRfID09IG90aGVyLmJlZ2luX2ZyYW1lX3NvdXJjZV9wYXVzZWRfCisgICAm
JiBjYW5fZHJhd18gPT0gb3RoZXIuY2FuX2RyYXdfCisgICAmJiByZXNvdXJjZWxlc3NfZHJhd18g
PT0gb3RoZXIucmVzb3VyY2VsZXNzX2RyYXdfCisgICAmJiBoYXNfcGVuZGluZ190cmVlXyA9PSBv
dGhlci5oYXNfcGVuZGluZ190cmVlXworICAgJiYgcGVuZGluZ190cmVlX2lzX3JlYWR5X2Zvcl9h
Y3RpdmF0aW9uXyA9PSBvdGhlci5wZW5kaW5nX3RyZWVfaXNfcmVhZHlfZm9yX2FjdGl2YXRpb25f
CisgICAmJiBhY3RpdmVfdHJlZV9uZWVkc19maXJzdF9kcmF3XyA9PSBvdGhlci5hY3RpdmVfdHJl
ZV9uZWVkc19maXJzdF9kcmF3XworICAgJiYgYWN0aXZlX3RyZWVfaXNfcmVhZHlfdG9fZHJhd18g
PT0gb3RoZXIuYWN0aXZlX3RyZWVfaXNfcmVhZHlfdG9fZHJhd18KKyAgICYmIGRpZF9jcmVhdGVf
YW5kX2luaXRpYWxpemVfZmlyc3RfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rXyA9PSBvdGhlci5kaWRf
Y3JlYXRlX2FuZF9pbml0aWFsaXplX2ZpcnN0X2xheWVyX3RyZWVfZnJhbWVfc2lua18KKyAgICYm
IHRyZWVfcHJpb3JpdHlfID09IG90aGVyLnRyZWVfcHJpb3JpdHlfCisgICAmJiBzY3JvbGxfaGFu
ZGxlcl9zdGF0ZV8gPT0gb3RoZXIuc2Nyb2xsX2hhbmRsZXJfc3RhdGVfCisgICAmJiBjcml0aWNh
bF9iZWdpbl9tYWluX2ZyYW1lX3RvX2FjdGl2YXRlX2lzX2Zhc3RfID09IG90aGVyLmNyaXRpY2Fs
X2JlZ2luX21haW5fZnJhbWVfdG9fYWN0aXZhdGVfaXNfZmFzdF8KKyAgICYmIG1haW5fdGhyZWFk
X21pc3NlZF9sYXN0X2RlYWRsaW5lXyA9PSBvdGhlci5tYWluX3RocmVhZF9taXNzZWRfbGFzdF9k
ZWFkbGluZV8KKyAgICYmIHNraXBfbmV4dF9iZWdpbl9tYWluX2ZyYW1lX3RvX3JlZHVjZV9sYXRl
bmN5XyA9PSBvdGhlci5za2lwX25leHRfYmVnaW5fbWFpbl9mcmFtZV90b19yZWR1Y2VfbGF0ZW5j
eV8KKyAgICYmIHZpZGVvX25lZWRzX2JlZ2luX2ZyYW1lc18gPT0gb3RoZXIudmlkZW9fbmVlZHNf
YmVnaW5fZnJhbWVzXworICAgJiYgZGVmZXJfYmVnaW5fbWFpbl9mcmFtZV8gPT0gb3RoZXIuZGVm
ZXJfYmVnaW5fbWFpbl9mcmFtZV8KKyAgICYmIGxhc3RfY29tbWl0X2hhZF9ub191cGRhdGVzXyA9
PSBvdGhlci5sYXN0X2NvbW1pdF9oYWRfbm9fdXBkYXRlc18KKyAgICYmIGRpZF9kcmF3X2luX2xh
c3RfZnJhbWVfID09IG90aGVyLmRpZF9kcmF3X2luX2xhc3RfZnJhbWVfCisgICAmJiBkaWRfc3Vi
bWl0X2luX2xhc3RfZnJhbWVfID09IG90aGVyLmRpZF9zdWJtaXRfaW5fbGFzdF9mcmFtZV8KKyAg
ICYmIG5lZWRzX2ltcGxfc2lkZV9pbnZhbGlkYXRpb25fID09IG90aGVyLm5lZWRzX2ltcGxfc2lk
ZV9pbnZhbGlkYXRpb25fCisgICAmJiBjdXJyZW50X3BlbmRpbmdfdHJlZV9pc19pbXBsX3NpZGVf
ID09IG90aGVyLmN1cnJlbnRfcGVuZGluZ190cmVlX2lzX2ltcGxfc2lkZV8KKyAgICYmIHByZXZp
b3VzX3BlbmRpbmdfdHJlZV93YXNfaW1wbF9zaWRlXyA9PSBvdGhlci5wcmV2aW91c19wZW5kaW5n
X3RyZWVfd2FzX2ltcGxfc2lkZV8KKyAgICYmIHByb2Nlc3NpbmdfYW5pbWF0aW9uX3dvcmtsZXRz
X2Zvcl9hY3RpdmVfdHJlZV8gPT0gb3RoZXIucHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xldHNf
Zm9yX2FjdGl2ZV90cmVlXworICAgJiYgcHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xldHNfZm9y
X3BlbmRpbmdfdHJlZV8gPT0gb3RoZXIucHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xldHNfZm9y
X3BlbmRpbmdfdHJlZV8KKyAgICYmIHByb2Nlc3NpbmdfcGFpbnRfd29ya2xldHNfZm9yX3BlbmRp
bmdfdHJlZV8gPT0gb3RoZXIucHJvY2Vzc2luZ19wYWludF93b3JrbGV0c19mb3JfcGVuZGluZ190
cmVlXzsKK30KKworYm9vbCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGU6
OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93
bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpw
cm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxk
ID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQo
KSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBf
aGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQo
KSkgeworICAgICAgY2FzZSAxIC8qIGNvbW1pdF9jb3VudCAqLzoKKyAgICAgICAgZmllbGQuZ2V0
KCZjb21taXRfY291bnRfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogY3VycmVu
dF9mcmFtZV9udW1iZXIgKi86CisgICAgICAgIGZpZWxkLmdldCgmY3VycmVudF9mcmFtZV9udW1i
ZXJfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogbGFzdF9mcmFtZV9udW1iZXJf
c3VibWl0X3BlcmZvcm1lZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZsYXN0X2ZyYW1lX251bWJl
cl9zdWJtaXRfcGVyZm9ybWVkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIGxh
c3RfZnJhbWVfbnVtYmVyX2RyYXdfcGVyZm9ybWVkICovOgorICAgICAgICBmaWVsZC5nZXQoJmxh
c3RfZnJhbWVfbnVtYmVyX2RyYXdfcGVyZm9ybWVkXyk7CisgICAgICAgIGJyZWFrOworICAgICAg
Y2FzZSA1IC8qIGxhc3RfZnJhbWVfbnVtYmVyX2JlZ2luX21haW5fZnJhbWVfc2VudCAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZsYXN0X2ZyYW1lX251bWJlcl9iZWdpbl9tYWluX2ZyYW1lX3NlbnRf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYgLyogZGlkX2RyYXcgKi86CisgICAgICAg
IGZpZWxkLmdldCgmZGlkX2RyYXdfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDcgLyog
ZGlkX3NlbmRfYmVnaW5fbWFpbl9mcmFtZV9mb3JfY3VycmVudF9mcmFtZSAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZkaWRfc2VuZF9iZWdpbl9tYWluX2ZyYW1lX2Zvcl9jdXJyZW50X2ZyYW1lXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIGRpZF9ub3RpZnlfYmVnaW5fbWFpbl9m
cmFtZV9ub3RfZXhwZWN0ZWRfdW50aWwgKi86CisgICAgICAgIGZpZWxkLmdldCgmZGlkX25vdGlm
eV9iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZF91bnRpbF8pOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgOSAvKiBkaWRfbm90aWZ5X2JlZ2luX21haW5fZnJhbWVfbm90X2V4cGVjdGVk
X3Nvb24gKi86CisgICAgICAgIGZpZWxkLmdldCgmZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1l
X25vdF9leHBlY3RlZF9zb29uXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMCAvKiB3
YW50c19iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0
KCZ3YW50c19iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZF8pOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgMTEgLyogZGlkX2NvbW1pdF9kdXJpbmdfZnJhbWUgKi86CisgICAgICAgIGZp
ZWxkLmdldCgmZGlkX2NvbW1pdF9kdXJpbmdfZnJhbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDEyIC8qIGRpZF9pbnZhbGlkYXRlX2xheWVyX3RyZWVfZnJhbWVfc2luayAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZkaWRfaW52YWxpZGF0ZV9sYXllcl90cmVlX2ZyYW1lX3NpbmtfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEzIC8qIGRpZF9wZXJmb3JtX2ltcGxfc2lkZV9p
bnZhbGlkYWlvbiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkaWRfcGVyZm9ybV9pbXBsX3NpZGVf
aW52YWxpZGFpb25fKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE0IC8qIGRpZF9wcmVw
YXJlX3RpbGVzICovOgorICAgICAgICBmaWVsZC5nZXQoJmRpZF9wcmVwYXJlX3RpbGVzXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNSAvKiBjb25zZWN1dGl2ZV9jaGVja2VyYm9hcmRf
YW5pbWF0aW9ucyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZjb25zZWN1dGl2ZV9jaGVja2VyYm9h
cmRfYW5pbWF0aW9uc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTYgLyogcGVuZGlu
Z19zdWJtaXRfZnJhbWVzICovOgorICAgICAgICBmaWVsZC5nZXQoJnBlbmRpbmdfc3VibWl0X2Zy
YW1lc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTcgLyogc3VibWl0X2ZyYW1lc193
aXRoX2N1cnJlbnRfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rICovOgorICAgICAgICBmaWVsZC5nZXQo
JnN1Ym1pdF9mcmFtZXNfd2l0aF9jdXJyZW50X2xheWVyX3RyZWVfZnJhbWVfc2lua18pOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgMTggLyogbmVlZHNfcmVkcmF3ICovOgorICAgICAgICBm
aWVsZC5nZXQoJm5lZWRzX3JlZHJhd18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTkg
LyogbmVlZHNfcHJlcGFyZV90aWxlcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZuZWVkc19wcmVw
YXJlX3RpbGVzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMCAvKiBuZWVkc19iZWdp
bl9tYWluX2ZyYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJm5lZWRzX2JlZ2luX21haW5fZnJh
bWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIxIC8qIG5lZWRzX29uZV9iZWdpbl9p
bXBsX2ZyYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJm5lZWRzX29uZV9iZWdpbl9pbXBsX2Zy
YW1lXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMiAvKiB2aXNpYmxlICovOgorICAg
ICAgICBmaWVsZC5nZXQoJnZpc2libGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIz
IC8qIGJlZ2luX2ZyYW1lX3NvdXJjZV9wYXVzZWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmYmVn
aW5fZnJhbWVfc291cmNlX3BhdXNlZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjQg
LyogY2FuX2RyYXcgKi86CisgICAgICAgIGZpZWxkLmdldCgmY2FuX2RyYXdfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDI1IC8qIHJlc291cmNlbGVzc19kcmF3ICovOgorICAgICAgICBm
aWVsZC5nZXQoJnJlc291cmNlbGVzc19kcmF3Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSAyNiAvKiBoYXNfcGVuZGluZ190cmVlICovOgorICAgICAgICBmaWVsZC5nZXQoJmhhc19wZW5k
aW5nX3RyZWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI3IC8qIHBlbmRpbmdfdHJl
ZV9pc19yZWFkeV9mb3JfYWN0aXZhdGlvbiAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwZW5kaW5n
X3RyZWVfaXNfcmVhZHlfZm9yX2FjdGl2YXRpb25fKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDI4IC8qIGFjdGl2ZV90cmVlX25lZWRzX2ZpcnN0X2RyYXcgKi86CisgICAgICAgIGZpZWxk
LmdldCgmYWN0aXZlX3RyZWVfbmVlZHNfZmlyc3RfZHJhd18pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgMjkgLyogYWN0aXZlX3RyZWVfaXNfcmVhZHlfdG9fZHJhdyAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZhY3RpdmVfdHJlZV9pc19yZWFkeV90b19kcmF3Xyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSAzMCAvKiBkaWRfY3JlYXRlX2FuZF9pbml0aWFsaXplX2ZpcnN0X2xheWVy
X3RyZWVfZnJhbWVfc2luayAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkaWRfY3JlYXRlX2FuZF9p
bml0aWFsaXplX2ZpcnN0X2xheWVyX3RyZWVfZnJhbWVfc2lua18pOworICAgICAgICBicmVhazsK
KyAgICAgIGNhc2UgMzEgLyogdHJlZV9wcmlvcml0eSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0
cmVlX3ByaW9yaXR5Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMiAvKiBzY3JvbGxf
aGFuZGxlcl9zdGF0ZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZzY3JvbGxfaGFuZGxlcl9zdGF0
ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzMgLyogY3JpdGljYWxfYmVnaW5fbWFp
bl9mcmFtZV90b19hY3RpdmF0ZV9pc19mYXN0ICovOgorICAgICAgICBmaWVsZC5nZXQoJmNyaXRp
Y2FsX2JlZ2luX21haW5fZnJhbWVfdG9fYWN0aXZhdGVfaXNfZmFzdF8pOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgMzQgLyogbWFpbl90aHJlYWRfbWlzc2VkX2xhc3RfZGVhZGxpbmUgKi86
CisgICAgICAgIGZpZWxkLmdldCgmbWFpbl90aHJlYWRfbWlzc2VkX2xhc3RfZGVhZGxpbmVfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM1IC8qIHNraXBfbmV4dF9iZWdpbl9tYWluX2Zy
YW1lX3RvX3JlZHVjZV9sYXRlbmN5ICovOgorICAgICAgICBmaWVsZC5nZXQoJnNraXBfbmV4dF9i
ZWdpbl9tYWluX2ZyYW1lX3RvX3JlZHVjZV9sYXRlbmN5Xyk7CisgICAgICAgIGJyZWFrOworICAg
ICAgY2FzZSAzNiAvKiB2aWRlb19uZWVkc19iZWdpbl9mcmFtZXMgKi86CisgICAgICAgIGZpZWxk
LmdldCgmdmlkZW9fbmVlZHNfYmVnaW5fZnJhbWVzXyk7CisgICAgICAgIGJyZWFrOworICAgICAg
Y2FzZSAzNyAvKiBkZWZlcl9iZWdpbl9tYWluX2ZyYW1lICovOgorICAgICAgICBmaWVsZC5nZXQo
JmRlZmVyX2JlZ2luX21haW5fZnJhbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM4
IC8qIGxhc3RfY29tbWl0X2hhZF9ub191cGRhdGVzICovOgorICAgICAgICBmaWVsZC5nZXQoJmxh
c3RfY29tbWl0X2hhZF9ub191cGRhdGVzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAz
OSAvKiBkaWRfZHJhd19pbl9sYXN0X2ZyYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJmRpZF9k
cmF3X2luX2xhc3RfZnJhbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQwIC8qIGRp
ZF9zdWJtaXRfaW5fbGFzdF9mcmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkaWRfc3VibWl0
X2luX2xhc3RfZnJhbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQxIC8qIG5lZWRz
X2ltcGxfc2lkZV9pbnZhbGlkYXRpb24gKi86CisgICAgICAgIGZpZWxkLmdldCgmbmVlZHNfaW1w
bF9zaWRlX2ludmFsaWRhdGlvbl8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDIgLyog
Y3VycmVudF9wZW5kaW5nX3RyZWVfaXNfaW1wbF9zaWRlICovOgorICAgICAgICBmaWVsZC5nZXQo
JmN1cnJlbnRfcGVuZGluZ190cmVlX2lzX2ltcGxfc2lkZV8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgNDMgLyogcHJldmlvdXNfcGVuZGluZ190cmVlX3dhc19pbXBsX3NpZGUgKi86Cisg
ICAgICAgIGZpZWxkLmdldCgmcHJldmlvdXNfcGVuZGluZ190cmVlX3dhc19pbXBsX3NpZGVfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ0IC8qIHByb2Nlc3NpbmdfYW5pbWF0aW9uX3dv
cmtsZXRzX2Zvcl9hY3RpdmVfdHJlZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwcm9jZXNzaW5n
X2FuaW1hdGlvbl93b3JrbGV0c19mb3JfYWN0aXZlX3RyZWVfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDQ1IC8qIHByb2Nlc3NpbmdfYW5pbWF0aW9uX3dvcmtsZXRzX2Zvcl9wZW5kaW5n
X3RyZWUgKi86CisgICAgICAgIGZpZWxkLmdldCgmcHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xl
dHNfZm9yX3BlbmRpbmdfdHJlZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDYgLyog
cHJvY2Vzc2luZ19wYWludF93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlICovOgorICAgICAgICBm
aWVsZC5nZXQoJnByb2Nlc3NpbmdfcGFpbnRfd29ya2xldHNfZm9yX3BlbmRpbmdfdHJlZV8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFu
ZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0K
KyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6
c3RyaW5nIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZTo6U2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cu
U2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qg
eworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7
CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXko
KTsKK30KKwordm9pZCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGU6OlNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6
IGNvbW1pdF9jb3VudAorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZh
ckludCgxLCBjb21taXRfY291bnRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGN1cnJlbnRfZnJh
bWVfbnVtYmVyCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50
KDIsIGN1cnJlbnRfZnJhbWVfbnVtYmVyXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBsYXN0X2Zy
YW1lX251bWJlcl9zdWJtaXRfcGVyZm9ybWVkCisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDMsIGxhc3RfZnJhbWVfbnVtYmVyX3N1Ym1pdF9wZXJmb3JtZWRf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IGxhc3RfZnJhbWVfbnVtYmVyX2RyYXdfcGVyZm9ybWVk
CisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDQsIGxhc3Rf
ZnJhbWVfbnVtYmVyX2RyYXdfcGVyZm9ybWVkXyk7CisgIH0KKworICAvLyBGaWVsZCA1OiBsYXN0
X2ZyYW1lX251bWJlcl9iZWdpbl9tYWluX2ZyYW1lX3NlbnQKKyAgaWYgKF9oYXNfZmllbGRfWzVd
KSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNSwgbGFzdF9mcmFtZV9udW1iZXJfYmVnaW5fbWFp
bl9mcmFtZV9zZW50Xyk7CisgIH0KKworICAvLyBGaWVsZCA2OiBkaWRfZHJhdworICBpZiAoX2hh
c19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNiwgZGlkX2RyYXdfKTsK
KyAgfQorCisgIC8vIEZpZWxkIDc6IGRpZF9zZW5kX2JlZ2luX21haW5fZnJhbWVfZm9yX2N1cnJl
bnRfZnJhbWUKKyAgaWYgKF9oYXNfZmllbGRfWzddKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFy
SW50KDcsIGRpZF9zZW5kX2JlZ2luX21haW5fZnJhbWVfZm9yX2N1cnJlbnRfZnJhbWVfKTsKKyAg
fQorCisgIC8vIEZpZWxkIDg6IGRpZF9ub3RpZnlfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0
ZWRfdW50aWwKKyAgaWYgKF9oYXNfZmllbGRfWzhdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFy
SW50KDgsIGRpZF9ub3RpZnlfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfdW50aWxfKTsK
KyAgfQorCisgIC8vIEZpZWxkIDk6IGRpZF9ub3RpZnlfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhw
ZWN0ZWRfc29vbgorICBpZiAoX2hhc19maWVsZF9bOV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlW
YXJJbnQoOSwgZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZF9zb29uXyk7
CisgIH0KKworICAvLyBGaWVsZCAxMDogd2FudHNfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0
ZWQKKyAgaWYgKF9oYXNfZmllbGRfWzEwXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgx
MCwgd2FudHNfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfKTsKKyAgfQorCisgIC8vIEZp
ZWxkIDExOiBkaWRfY29tbWl0X2R1cmluZ19mcmFtZQorICBpZiAoX2hhc19maWVsZF9bMTFdKSB7
CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDExLCBkaWRfY29tbWl0X2R1cmluZ19mcmFtZV8p
OworICB9CisKKyAgLy8gRmllbGQgMTI6IGRpZF9pbnZhbGlkYXRlX2xheWVyX3RyZWVfZnJhbWVf
c2luaworICBpZiAoX2hhc19maWVsZF9bMTJdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50
KDEyLCBkaWRfaW52YWxpZGF0ZV9sYXllcl90cmVlX2ZyYW1lX3NpbmtfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDEzOiBkaWRfcGVyZm9ybV9pbXBsX3NpZGVfaW52YWxpZGFpb24KKyAgaWYgKF9oYXNf
ZmllbGRfWzEzXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgxMywgZGlkX3BlcmZvcm1f
aW1wbF9zaWRlX2ludmFsaWRhaW9uXyk7CisgIH0KKworICAvLyBGaWVsZCAxNDogZGlkX3ByZXBh
cmVfdGlsZXMKKyAgaWYgKF9oYXNfZmllbGRfWzE0XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZh
ckludCgxNCwgZGlkX3ByZXBhcmVfdGlsZXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDE1OiBjb25z
ZWN1dGl2ZV9jaGVja2VyYm9hcmRfYW5pbWF0aW9ucworICBpZiAoX2hhc19maWVsZF9bMTVdKSB7
CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTUsIGNvbnNlY3V0aXZlX2NoZWNrZXJib2FyZF9hbmlt
YXRpb25zXyk7CisgIH0KKworICAvLyBGaWVsZCAxNjogcGVuZGluZ19zdWJtaXRfZnJhbWVzCisg
IGlmIChfaGFzX2ZpZWxkX1sxNl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxNiwgcGVuZGlu
Z19zdWJtaXRfZnJhbWVzXyk7CisgIH0KKworICAvLyBGaWVsZCAxNzogc3VibWl0X2ZyYW1lc193
aXRoX2N1cnJlbnRfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rCisgIGlmIChfaGFzX2ZpZWxkX1sxN10p
IHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxNywgc3VibWl0X2ZyYW1lc193aXRoX2N1cnJlbnRf
bGF5ZXJfdHJlZV9mcmFtZV9zaW5rXyk7CisgIH0KKworICAvLyBGaWVsZCAxODogbmVlZHNfcmVk
cmF3CisgIGlmIChfaGFzX2ZpZWxkX1sxOF0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQo
MTgsIG5lZWRzX3JlZHJhd18pOworICB9CisKKyAgLy8gRmllbGQgMTk6IG5lZWRzX3ByZXBhcmVf
dGlsZXMKKyAgaWYgKF9oYXNfZmllbGRfWzE5XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhcklu
dCgxOSwgbmVlZHNfcHJlcGFyZV90aWxlc18pOworICB9CisKKyAgLy8gRmllbGQgMjA6IG5lZWRz
X2JlZ2luX21haW5fZnJhbWUKKyAgaWYgKF9oYXNfZmllbGRfWzIwXSkgeworICAgIG1zZy0+QXBw
ZW5kVGlueVZhckludCgyMCwgbmVlZHNfYmVnaW5fbWFpbl9mcmFtZV8pOworICB9CisKKyAgLy8g
RmllbGQgMjE6IG5lZWRzX29uZV9iZWdpbl9pbXBsX2ZyYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sy
MV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoMjEsIG5lZWRzX29uZV9iZWdpbl9pbXBs
X2ZyYW1lXyk7CisgIH0KKworICAvLyBGaWVsZCAyMjogdmlzaWJsZQorICBpZiAoX2hhc19maWVs
ZF9bMjJdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDIyLCB2aXNpYmxlXyk7CisgIH0K
KworICAvLyBGaWVsZCAyMzogYmVnaW5fZnJhbWVfc291cmNlX3BhdXNlZAorICBpZiAoX2hhc19m
aWVsZF9bMjNdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDIzLCBiZWdpbl9mcmFtZV9z
b3VyY2VfcGF1c2VkXyk7CisgIH0KKworICAvLyBGaWVsZCAyNDogY2FuX2RyYXcKKyAgaWYgKF9o
YXNfZmllbGRfWzI0XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgyNCwgY2FuX2RyYXdf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDI1OiByZXNvdXJjZWxlc3NfZHJhdworICBpZiAoX2hhc19m
aWVsZF9bMjVdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDI1LCByZXNvdXJjZWxlc3Nf
ZHJhd18pOworICB9CisKKyAgLy8gRmllbGQgMjY6IGhhc19wZW5kaW5nX3RyZWUKKyAgaWYgKF9o
YXNfZmllbGRfWzI2XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgyNiwgaGFzX3BlbmRp
bmdfdHJlZV8pOworICB9CisKKyAgLy8gRmllbGQgMjc6IHBlbmRpbmdfdHJlZV9pc19yZWFkeV9m
b3JfYWN0aXZhdGlvbgorICBpZiAoX2hhc19maWVsZF9bMjddKSB7CisgICAgbXNnLT5BcHBlbmRU
aW55VmFySW50KDI3LCBwZW5kaW5nX3RyZWVfaXNfcmVhZHlfZm9yX2FjdGl2YXRpb25fKTsKKyAg
fQorCisgIC8vIEZpZWxkIDI4OiBhY3RpdmVfdHJlZV9uZWVkc19maXJzdF9kcmF3CisgIGlmIChf
aGFzX2ZpZWxkX1syOF0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoMjgsIGFjdGl2ZV90
cmVlX25lZWRzX2ZpcnN0X2RyYXdfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI5OiBhY3RpdmVfdHJl
ZV9pc19yZWFkeV90b19kcmF3CisgIGlmIChfaGFzX2ZpZWxkX1syOV0pIHsKKyAgICBtc2ctPkFw
cGVuZFRpbnlWYXJJbnQoMjksIGFjdGl2ZV90cmVlX2lzX3JlYWR5X3RvX2RyYXdfKTsKKyAgfQor
CisgIC8vIEZpZWxkIDMwOiBkaWRfY3JlYXRlX2FuZF9pbml0aWFsaXplX2ZpcnN0X2xheWVyX3Ry
ZWVfZnJhbWVfc2luaworICBpZiAoX2hhc19maWVsZF9bMzBdKSB7CisgICAgbXNnLT5BcHBlbmRU
aW55VmFySW50KDMwLCBkaWRfY3JlYXRlX2FuZF9pbml0aWFsaXplX2ZpcnN0X2xheWVyX3RyZWVf
ZnJhbWVfc2lua18pOworICB9CisKKyAgLy8gRmllbGQgMzE6IHRyZWVfcHJpb3JpdHkKKyAgaWYg
KF9oYXNfZmllbGRfWzMxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMxLCB0cmVlX3ByaW9y
aXR5Xyk7CisgIH0KKworICAvLyBGaWVsZCAzMjogc2Nyb2xsX2hhbmRsZXJfc3RhdGUKKyAgaWYg
KF9oYXNfZmllbGRfWzMyXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMyLCBzY3JvbGxfaGFu
ZGxlcl9zdGF0ZV8pOworICB9CisKKyAgLy8gRmllbGQgMzM6IGNyaXRpY2FsX2JlZ2luX21haW5f
ZnJhbWVfdG9fYWN0aXZhdGVfaXNfZmFzdAorICBpZiAoX2hhc19maWVsZF9bMzNdKSB7CisgICAg
bXNnLT5BcHBlbmRUaW55VmFySW50KDMzLCBjcml0aWNhbF9iZWdpbl9tYWluX2ZyYW1lX3RvX2Fj
dGl2YXRlX2lzX2Zhc3RfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM0OiBtYWluX3RocmVhZF9taXNz
ZWRfbGFzdF9kZWFkbGluZQorICBpZiAoX2hhc19maWVsZF9bMzRdKSB7CisgICAgbXNnLT5BcHBl
bmRUaW55VmFySW50KDM0LCBtYWluX3RocmVhZF9taXNzZWRfbGFzdF9kZWFkbGluZV8pOworICB9
CisKKyAgLy8gRmllbGQgMzU6IHNraXBfbmV4dF9iZWdpbl9tYWluX2ZyYW1lX3RvX3JlZHVjZV9s
YXRlbmN5CisgIGlmIChfaGFzX2ZpZWxkX1szNV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJ
bnQoMzUsIHNraXBfbmV4dF9iZWdpbl9tYWluX2ZyYW1lX3RvX3JlZHVjZV9sYXRlbmN5Xyk7Cisg
IH0KKworICAvLyBGaWVsZCAzNjogdmlkZW9fbmVlZHNfYmVnaW5fZnJhbWVzCisgIGlmIChfaGFz
X2ZpZWxkX1szNl0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoMzYsIHZpZGVvX25lZWRz
X2JlZ2luX2ZyYW1lc18pOworICB9CisKKyAgLy8gRmllbGQgMzc6IGRlZmVyX2JlZ2luX21haW5f
ZnJhbWUKKyAgaWYgKF9oYXNfZmllbGRfWzM3XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhcklu
dCgzNywgZGVmZXJfYmVnaW5fbWFpbl9mcmFtZV8pOworICB9CisKKyAgLy8gRmllbGQgMzg6IGxh
c3RfY29tbWl0X2hhZF9ub191cGRhdGVzCisgIGlmIChfaGFzX2ZpZWxkX1szOF0pIHsKKyAgICBt
c2ctPkFwcGVuZFRpbnlWYXJJbnQoMzgsIGxhc3RfY29tbWl0X2hhZF9ub191cGRhdGVzXyk7Cisg
IH0KKworICAvLyBGaWVsZCAzOTogZGlkX2RyYXdfaW5fbGFzdF9mcmFtZQorICBpZiAoX2hhc19m
aWVsZF9bMzldKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDM5LCBkaWRfZHJhd19pbl9s
YXN0X2ZyYW1lXyk7CisgIH0KKworICAvLyBGaWVsZCA0MDogZGlkX3N1Ym1pdF9pbl9sYXN0X2Zy
YW1lCisgIGlmIChfaGFzX2ZpZWxkX1s0MF0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQo
NDAsIGRpZF9zdWJtaXRfaW5fbGFzdF9mcmFtZV8pOworICB9CisKKyAgLy8gRmllbGQgNDE6IG5l
ZWRzX2ltcGxfc2lkZV9pbnZhbGlkYXRpb24KKyAgaWYgKF9oYXNfZmllbGRfWzQxXSkgeworICAg
IG1zZy0+QXBwZW5kVGlueVZhckludCg0MSwgbmVlZHNfaW1wbF9zaWRlX2ludmFsaWRhdGlvbl8p
OworICB9CisKKyAgLy8gRmllbGQgNDI6IGN1cnJlbnRfcGVuZGluZ190cmVlX2lzX2ltcGxfc2lk
ZQorICBpZiAoX2hhc19maWVsZF9bNDJdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDQy
LCBjdXJyZW50X3BlbmRpbmdfdHJlZV9pc19pbXBsX3NpZGVfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDQzOiBwcmV2aW91c19wZW5kaW5nX3RyZWVfd2FzX2ltcGxfc2lkZQorICBpZiAoX2hhc19maWVs
ZF9bNDNdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDQzLCBwcmV2aW91c19wZW5kaW5n
X3RyZWVfd2FzX2ltcGxfc2lkZV8pOworICB9CisKKyAgLy8gRmllbGQgNDQ6IHByb2Nlc3Npbmdf
YW5pbWF0aW9uX3dvcmtsZXRzX2Zvcl9hY3RpdmVfdHJlZQorICBpZiAoX2hhc19maWVsZF9bNDRd
KSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDQ0LCBwcm9jZXNzaW5nX2FuaW1hdGlvbl93
b3JrbGV0c19mb3JfYWN0aXZlX3RyZWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ1OiBwcm9jZXNz
aW5nX2FuaW1hdGlvbl93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlCisgIGlmIChfaGFzX2ZpZWxk
X1s0NV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNDUsIHByb2Nlc3NpbmdfYW5pbWF0
aW9uX3dvcmtsZXRzX2Zvcl9wZW5kaW5nX3RyZWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ2OiBw
cm9jZXNzaW5nX3BhaW50X3dvcmtsZXRzX2Zvcl9wZW5kaW5nX3RyZWUKKyAgaWYgKF9oYXNfZmll
bGRfWzQ2XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg0NiwgcHJvY2Vzc2luZ19wYWlu
dF93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKKworQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlOjpDaHJvbWVD
b21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGUoKSA9IGRlZmF1bHQ7CitDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGU6On5DaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNo
aW5lX01ham9yU3RhdGUoKSA9IGRlZmF1bHQ7CitDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5l
X01ham9yU3RhdGU6OkNocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZShjb25z
dCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGUmKSA9IGRlZmF1bHQ7CitD
aHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGUmIENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZTo6b3BlcmF0b3I9KGNvbnN0IENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZSYpID0gZGVmYXVsdDsKK0Nocm9tZUNvbXBvc2l0b3JTdGF0
ZU1hY2hpbmVfTWFqb3JTdGF0ZTo6Q2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0
YXRlKENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZSYmKSBub2V4Y2VwdCA9
IGRlZmF1bHQ7CitDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGUmIENocm9t
ZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZTo6b3BlcmF0b3I9KENocm9tZUNvbXBv
c2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQ2hyb21l
Q29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlOjpvcGVyYXRvcj09KGNvbnN0IENocm9t
ZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0
dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIG5leHRf
YWN0aW9uXyA9PSBvdGhlci5uZXh0X2FjdGlvbl8KKyAgICYmIGJlZ2luX2ltcGxfZnJhbWVfc3Rh
dGVfID09IG90aGVyLmJlZ2luX2ltcGxfZnJhbWVfc3RhdGVfCisgICAmJiBiZWdpbl9tYWluX2Zy
YW1lX3N0YXRlXyA9PSBvdGhlci5iZWdpbl9tYWluX2ZyYW1lX3N0YXRlXworICAgJiYgbGF5ZXJf
dHJlZV9mcmFtZV9zaW5rX3N0YXRlXyA9PSBvdGhlci5sYXllcl90cmVlX2ZyYW1lX3Npbmtfc3Rh
dGVfCisgICAmJiBmb3JjZWRfcmVkcmF3X3N0YXRlXyA9PSBvdGhlci5mb3JjZWRfcmVkcmF3X3N0
YXRlXzsKK30KKworYm9vbCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGU6
OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93
bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpw
cm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxk
ID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQo
KSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBf
aGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQo
KSkgeworICAgICAgY2FzZSAxIC8qIG5leHRfYWN0aW9uICovOgorICAgICAgICBmaWVsZC5nZXQo
Jm5leHRfYWN0aW9uXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIGJlZ2luX2lt
cGxfZnJhbWVfc3RhdGUgKi86CisgICAgICAgIGZpZWxkLmdldCgmYmVnaW5faW1wbF9mcmFtZV9z
dGF0ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBiZWdpbl9tYWluX2ZyYW1l
X3N0YXRlICovOgorICAgICAgICBmaWVsZC5nZXQoJmJlZ2luX21haW5fZnJhbWVfc3RhdGVfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyogbGF5ZXJfdHJlZV9mcmFtZV9zaW5rX3N0
YXRlICovOgorICAgICAgICBmaWVsZC5nZXQoJmxheWVyX3RyZWVfZnJhbWVfc2lua19zdGF0ZV8p
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBmb3JjZWRfcmVkcmF3X3N0YXRlICov
OgorICAgICAgICBmaWVsZC5nZXQoJmZvcmNlZF9yZWRyYXdfc3RhdGVfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygm
dW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAh
cGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBDaHJv
bWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGU6OlNlcmlhbGl6ZUFzU3RyaW5nKCkg
Y29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdl
PiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFz
U3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENocm9tZUNvbXBvc2l0b3JTdGF0
ZU1hY2hpbmVfTWFqb3JTdGF0ZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3Zv
aWQgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlOjpTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBuZXh0X2FjdGlv
bgorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCBuZXh0
X2FjdGlvbl8pOworICB9CisKKyAgLy8gRmllbGQgMjogYmVnaW5faW1wbF9mcmFtZV9zdGF0ZQor
ICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBiZWdpbl9p
bXBsX2ZyYW1lX3N0YXRlXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBiZWdpbl9tYWluX2ZyYW1l
X3N0YXRlCisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDMs
IGJlZ2luX21haW5fZnJhbWVfc3RhdGVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IGxheWVyX3Ry
ZWVfZnJhbWVfc2lua19zdGF0ZQorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ctPkFw
cGVuZFZhckludCg0LCBsYXllcl90cmVlX2ZyYW1lX3Npbmtfc3RhdGVfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDU6IGZvcmNlZF9yZWRyYXdfc3RhdGUKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoNSwgZm9yY2VkX3JlZHJhd19zdGF0ZV8pOworICB9CisKKyAg
bXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25f
ZmllbGRzXy5zaXplKCkpOworfQorCisKK0Nocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZTo6
Q2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlKCkgPSBkZWZhdWx0OworQ2hyb21lQ29tcG9z
aXRvclNjaGVkdWxlclN0YXRlOjp+Q2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlKCkgPSBk
ZWZhdWx0OworQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlOjpDaHJvbWVDb21wb3NpdG9y
U2NoZWR1bGVyU3RhdGUoY29uc3QgQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlJikgPSBk
ZWZhdWx0OworQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlJiBDaHJvbWVDb21wb3NpdG9y
U2NoZWR1bGVyU3RhdGU6Om9wZXJhdG9yPShjb25zdCBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVy
U3RhdGUmKSA9IGRlZmF1bHQ7CitDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGU6OkNocm9t
ZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZShDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGUm
Jikgbm9leGNlcHQgPSBkZWZhdWx0OworQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlJiBD
aHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGU6Om9wZXJhdG9yPShDaHJvbWVDb21wb3NpdG9y
U2NoZWR1bGVyU3RhdGUmJikgPSBkZWZhdWx0OworCitib29sIENocm9tZUNvbXBvc2l0b3JTY2hl
ZHVsZXJTdGF0ZTo6b3BlcmF0b3I9PShjb25zdCBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3Rh
dGUmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5r
bm93bl9maWVsZHNfCisgICAmJiBzdGF0ZV9tYWNoaW5lXyA9PSBvdGhlci5zdGF0ZV9tYWNoaW5l
XworICAgJiYgb2JzZXJ2aW5nX2JlZ2luX2ZyYW1lX3NvdXJjZV8gPT0gb3RoZXIub2JzZXJ2aW5n
X2JlZ2luX2ZyYW1lX3NvdXJjZV8KKyAgICYmIGJlZ2luX2ltcGxfZnJhbWVfZGVhZGxpbmVfdGFz
a18gPT0gb3RoZXIuYmVnaW5faW1wbF9mcmFtZV9kZWFkbGluZV90YXNrXworICAgJiYgcGVuZGlu
Z19iZWdpbl9mcmFtZV90YXNrXyA9PSBvdGhlci5wZW5kaW5nX2JlZ2luX2ZyYW1lX3Rhc2tfCisg
ICAmJiBza2lwcGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4Y2VlZGVkX2RlYWRsaW5lXyA9PSBvdGhl
ci5za2lwcGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4Y2VlZGVkX2RlYWRsaW5lXworICAgJiYgc2tp
cHBlZF9sYXN0X2ZyYW1lX3RvX3JlZHVjZV9sYXRlbmN5XyA9PSBvdGhlci5za2lwcGVkX2xhc3Rf
ZnJhbWVfdG9fcmVkdWNlX2xhdGVuY3lfCisgICAmJiBpbnNpZGVfYWN0aW9uXyA9PSBvdGhlci5p
bnNpZGVfYWN0aW9uXworICAgJiYgZGVhZGxpbmVfbW9kZV8gPT0gb3RoZXIuZGVhZGxpbmVfbW9k
ZV8KKyAgICYmIGRlYWRsaW5lX3VzXyA9PSBvdGhlci5kZWFkbGluZV91c18KKyAgICYmIGRlYWRs
aW5lX3NjaGVkdWxlZF9hdF91c18gPT0gb3RoZXIuZGVhZGxpbmVfc2NoZWR1bGVkX2F0X3VzXwor
ICAgJiYgbm93X3VzXyA9PSBvdGhlci5ub3dfdXNfCisgICAmJiBub3dfdG9fZGVhZGxpbmVfZGVs
dGFfdXNfID09IG90aGVyLm5vd190b19kZWFkbGluZV9kZWx0YV91c18KKyAgICYmIG5vd190b19k
ZWFkbGluZV9zY2hlZHVsZWRfYXRfZGVsdGFfdXNfID09IG90aGVyLm5vd190b19kZWFkbGluZV9z
Y2hlZHVsZWRfYXRfZGVsdGFfdXNfCisgICAmJiBiZWdpbl9pbXBsX2ZyYW1lX2FyZ3NfID09IG90
aGVyLmJlZ2luX2ltcGxfZnJhbWVfYXJnc18KKyAgICYmIGJlZ2luX2ZyYW1lX29ic2VydmVyX3N0
YXRlXyA9PSBvdGhlci5iZWdpbl9mcmFtZV9vYnNlcnZlcl9zdGF0ZV8KKyAgICYmIGJlZ2luX2Zy
YW1lX3NvdXJjZV9zdGF0ZV8gPT0gb3RoZXIuYmVnaW5fZnJhbWVfc291cmNlX3N0YXRlXworICAg
JiYgY29tcG9zaXRvcl90aW1pbmdfaGlzdG9yeV8gPT0gb3RoZXIuY29tcG9zaXRvcl90aW1pbmdf
aGlzdG9yeV87Cit9CisKK2Jvb2wgQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlOjpQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmll
bGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96
ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRl
Yy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsK
KyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19m
aWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsK
KyAgICAgIGNhc2UgMSAvKiBzdGF0ZV9tYWNoaW5lICovOgorICAgICAgICAoKnN0YXRlX21hY2hp
bmVfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDIgLyogb2JzZXJ2aW5nX2JlZ2luX2ZyYW1lX3NvdXJjZSAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZvYnNlcnZpbmdfYmVnaW5fZnJhbWVfc291cmNlXyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAzIC8qIGJlZ2luX2ltcGxfZnJhbWVfZGVhZGxpbmVfdGFzayAq
LzoKKyAgICAgICAgZmllbGQuZ2V0KCZiZWdpbl9pbXBsX2ZyYW1lX2RlYWRsaW5lX3Rhc2tfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyogcGVuZGluZ19iZWdpbl9mcmFtZV90YXNr
ICovOgorICAgICAgICBmaWVsZC5nZXQoJnBlbmRpbmdfYmVnaW5fZnJhbWVfdGFza18pOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBza2lwcGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4
Y2VlZGVkX2RlYWRsaW5lICovOgorICAgICAgICBmaWVsZC5nZXQoJnNraXBwZWRfbGFzdF9mcmFt
ZV9taXNzZWRfZXhjZWVkZWRfZGVhZGxpbmVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl
IDYgLyogc2tpcHBlZF9sYXN0X2ZyYW1lX3RvX3JlZHVjZV9sYXRlbmN5ICovOgorICAgICAgICBm
aWVsZC5nZXQoJnNraXBwZWRfbGFzdF9mcmFtZV90b19yZWR1Y2VfbGF0ZW5jeV8pOworICAgICAg
ICBicmVhazsKKyAgICAgIGNhc2UgNyAvKiBpbnNpZGVfYWN0aW9uICovOgorICAgICAgICBmaWVs
ZC5nZXQoJmluc2lkZV9hY3Rpb25fKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDggLyog
ZGVhZGxpbmVfbW9kZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkZWFkbGluZV9tb2RlXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5IC8qIGRlYWRsaW5lX3VzICovOgorICAgICAgICBm
aWVsZC5nZXQoJmRlYWRsaW5lX3VzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMCAv
KiBkZWFkbGluZV9zY2hlZHVsZWRfYXRfdXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmZGVhZGxp
bmVfc2NoZWR1bGVkX2F0X3VzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMSAvKiBu
b3dfdXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmbm93X3VzXyk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgY2FzZSAxMiAvKiBub3dfdG9fZGVhZGxpbmVfZGVsdGFfdXMgKi86CisgICAgICAgIGZp
ZWxkLmdldCgmbm93X3RvX2RlYWRsaW5lX2RlbHRhX3VzXyk7CisgICAgICAgIGJyZWFrOworICAg
ICAgY2FzZSAxMyAvKiBub3dfdG9fZGVhZGxpbmVfc2NoZWR1bGVkX2F0X2RlbHRhX3VzICovOgor
ICAgICAgICBmaWVsZC5nZXQoJm5vd190b19kZWFkbGluZV9zY2hlZHVsZWRfYXRfZGVsdGFfdXNf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE0IC8qIGJlZ2luX2ltcGxfZnJhbWVfYXJn
cyAqLzoKKyAgICAgICAgKCpiZWdpbl9pbXBsX2ZyYW1lX2FyZ3NfKS5QYXJzZUZyb21TdHJpbmco
ZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE1IC8q
IGJlZ2luX2ZyYW1lX29ic2VydmVyX3N0YXRlICovOgorICAgICAgICAoKmJlZ2luX2ZyYW1lX29i
c2VydmVyX3N0YXRlXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNiAvKiBiZWdpbl9mcmFtZV9zb3VyY2Vfc3RhdGUg
Ki86CisgICAgICAgICgqYmVnaW5fZnJhbWVfc291cmNlX3N0YXRlXykuUGFyc2VGcm9tU3RyaW5n
KGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNyAv
KiBjb21wb3NpdG9yX3RpbWluZ19oaXN0b3J5ICovOgorICAgICAgICAoKmNvbXBvc2l0b3JfdGlt
aW5nX2hpc3RvcnlfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRB
cHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cisg
IHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0
cmluZyBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGU6OlNlcmlhbGl6ZUFzU3RyaW5nKCkg
Y29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdl
PiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFz
U3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENocm9tZUNvbXBvc2l0b3JTY2hl
ZHVsZXJTdGF0ZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQ2hyb21l
Q29tcG9zaXRvclNjaGVkdWxlclN0YXRlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2Uq
IG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBzdGF0ZV9tYWNoaW5lCisgIGlmIChfaGFzX2Zp
ZWxkX1sxXSkgeworICAgICgqc3RhdGVfbWFjaGluZV8pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVz
dGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMSkpOworICB9CisKKyAgLy8gRmllbGQg
Mjogb2JzZXJ2aW5nX2JlZ2luX2ZyYW1lX3NvdXJjZQorICBpZiAoX2hhc19maWVsZF9bMl0pIHsK
KyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoMiwgb2JzZXJ2aW5nX2JlZ2luX2ZyYW1lX3NvdXJj
ZV8pOworICB9CisKKyAgLy8gRmllbGQgMzogYmVnaW5faW1wbF9mcmFtZV9kZWFkbGluZV90YXNr
CisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgzLCBi
ZWdpbl9pbXBsX2ZyYW1lX2RlYWRsaW5lX3Rhc2tfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IHBl
bmRpbmdfYmVnaW5fZnJhbWVfdGFzaworICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ct
PkFwcGVuZFRpbnlWYXJJbnQoNCwgcGVuZGluZ19iZWdpbl9mcmFtZV90YXNrXyk7CisgIH0KKwor
ICAvLyBGaWVsZCA1OiBza2lwcGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4Y2VlZGVkX2RlYWRsaW5l
CisgIGlmIChfaGFzX2ZpZWxkX1s1XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg1LCBz
a2lwcGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4Y2VlZGVkX2RlYWRsaW5lXyk7CisgIH0KKworICAv
LyBGaWVsZCA2OiBza2lwcGVkX2xhc3RfZnJhbWVfdG9fcmVkdWNlX2xhdGVuY3kKKyAgaWYgKF9o
YXNfZmllbGRfWzZdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDYsIHNraXBwZWRfbGFz
dF9mcmFtZV90b19yZWR1Y2VfbGF0ZW5jeV8pOworICB9CisKKyAgLy8gRmllbGQgNzogaW5zaWRl
X2FjdGlvbgorICBpZiAoX2hhc19maWVsZF9bN10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg3
LCBpbnNpZGVfYWN0aW9uXyk7CisgIH0KKworICAvLyBGaWVsZCA4OiBkZWFkbGluZV9tb2RlCisg
IGlmIChfaGFzX2ZpZWxkX1s4XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDgsIGRlYWRsaW5l
X21vZGVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDk6IGRlYWRsaW5lX3VzCisgIGlmIChfaGFzX2Zp
ZWxkX1s5XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDksIGRlYWRsaW5lX3VzXyk7CisgIH0K
KworICAvLyBGaWVsZCAxMDogZGVhZGxpbmVfc2NoZWR1bGVkX2F0X3VzCisgIGlmIChfaGFzX2Zp
ZWxkX1sxMF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMCwgZGVhZGxpbmVfc2NoZWR1bGVk
X2F0X3VzXyk7CisgIH0KKworICAvLyBGaWVsZCAxMTogbm93X3VzCisgIGlmIChfaGFzX2ZpZWxk
X1sxMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMSwgbm93X3VzXyk7CisgIH0KKworICAv
LyBGaWVsZCAxMjogbm93X3RvX2RlYWRsaW5lX2RlbHRhX3VzCisgIGlmIChfaGFzX2ZpZWxkX1sx
Ml0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMiwgbm93X3RvX2RlYWRsaW5lX2RlbHRhX3Vz
Xyk7CisgIH0KKworICAvLyBGaWVsZCAxMzogbm93X3RvX2RlYWRsaW5lX3NjaGVkdWxlZF9hdF9k
ZWx0YV91cworICBpZiAoX2hhc19maWVsZF9bMTNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQo
MTMsIG5vd190b19kZWFkbGluZV9zY2hlZHVsZWRfYXRfZGVsdGFfdXNfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDE0OiBiZWdpbl9pbXBsX2ZyYW1lX2FyZ3MKKyAgaWYgKF9oYXNfZmllbGRfWzE0XSkg
eworICAgICgqYmVnaW5faW1wbF9mcmFtZV9hcmdzXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0
ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigxNCkpOworICB9CisKKyAgLy8gRmllbGQg
MTU6IGJlZ2luX2ZyYW1lX29ic2VydmVyX3N0YXRlCisgIGlmIChfaGFzX2ZpZWxkX1sxNV0pIHsK
KyAgICAoKmJlZ2luX2ZyYW1lX29ic2VydmVyX3N0YXRlXykuU2VyaWFsaXplKG1zZy0+QmVnaW5O
ZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigxNSkpOworICB9CisKKyAgLy8gRmll
bGQgMTY6IGJlZ2luX2ZyYW1lX3NvdXJjZV9zdGF0ZQorICBpZiAoX2hhc19maWVsZF9bMTZdKSB7
CisgICAgKCpiZWdpbl9mcmFtZV9zb3VyY2Vfc3RhdGVfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5l
c3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDE2KSk7CisgIH0KKworICAvLyBGaWVs
ZCAxNzogY29tcG9zaXRvcl90aW1pbmdfaGlzdG9yeQorICBpZiAoX2hhc19maWVsZF9bMTddKSB7
CisgICAgKCpjb21wb3NpdG9yX3RpbWluZ19oaXN0b3J5XykuU2VyaWFsaXplKG1zZy0+QmVnaW5O
ZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigxNykpOworICB9CisKKyAgbXNnLT5B
cHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRz
Xy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFj
ZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9w
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3Ry
YWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9mcmFtZV9yZXBvcnRlci5nZW4uY2MKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZl
bnQvY2hyb21lX2ZyYW1lX3JlcG9ydGVyLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVy
YXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX0ZSQU1FX1JFUE9SVEVSX1BS
T1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNF
X1RSQUNLX0VWRU5UX0NIUk9NRV9GUkFNRV9SRVBPUlRFUl9QUk9UT19DUFBfSF8KKworI2luY2x1
ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5j
bHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2Jq
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIENocm9tZUZyYW1lUmVwb3J0
ZXI7CitlbnVtIENocm9tZUZyYW1lUmVwb3J0ZXJfU3RhdGUgOiBpbnQ7CitlbnVtIENocm9tZUZy
YW1lUmVwb3J0ZXJfRnJhbWVEcm9wUmVhc29uIDogaW50OworfSAgLy8gbmFtZXNwYWNlIHBlcmZl
dHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVz
cGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3pl
cm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNl
IGdlbiB7CitlbnVtIENocm9tZUZyYW1lUmVwb3J0ZXJfU3RhdGUgOiBpbnQgeworICBDaHJvbWVG
cmFtZVJlcG9ydGVyX1N0YXRlX1NUQVRFX05PX1VQREFURV9ERVNJUkVEID0gMCwKKyAgQ2hyb21l
RnJhbWVSZXBvcnRlcl9TdGF0ZV9TVEFURV9QUkVTRU5URURfQUxMID0gMSwKKyAgQ2hyb21lRnJh
bWVSZXBvcnRlcl9TdGF0ZV9TVEFURV9QUkVTRU5URURfUEFSVElBTCA9IDIsCisgIENocm9tZUZy
YW1lUmVwb3J0ZXJfU3RhdGVfU1RBVEVfRFJPUFBFRCA9IDMsCit9OworZW51bSBDaHJvbWVGcmFt
ZVJlcG9ydGVyX0ZyYW1lRHJvcFJlYXNvbiA6IGludCB7CisgIENocm9tZUZyYW1lUmVwb3J0ZXJf
RnJhbWVEcm9wUmVhc29uX1JFQVNPTl9VTlNQRUNJRklFRCA9IDAsCisgIENocm9tZUZyYW1lUmVw
b3J0ZXJfRnJhbWVEcm9wUmVhc29uX1JFQVNPTl9ESVNQTEFZX0NPTVBPU0lUT1IgPSAxLAorICBD
aHJvbWVGcmFtZVJlcG9ydGVyX0ZyYW1lRHJvcFJlYXNvbl9SRUFTT05fTUFJTl9USFJFQUQgPSAy
LAorICBDaHJvbWVGcmFtZVJlcG9ydGVyX0ZyYW1lRHJvcFJlYXNvbl9SRUFTT05fQ0xJRU5UX0NP
TVBPU0lUT1IgPSAzLAorfTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENocm9tZUZyYW1lUmVw
b3J0ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAg
dXNpbmcgU3RhdGUgPSBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0YXRlOworICBzdGF0aWMgY29uc3Rl
eHByIGF1dG8gU1RBVEVfTk9fVVBEQVRFX0RFU0lSRUQgPSBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0
YXRlX1NUQVRFX05PX1VQREFURV9ERVNJUkVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gU1RB
VEVfUFJFU0VOVEVEX0FMTCA9IENocm9tZUZyYW1lUmVwb3J0ZXJfU3RhdGVfU1RBVEVfUFJFU0VO
VEVEX0FMTDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNUQVRFX1BSRVNFTlRFRF9QQVJUSUFM
ID0gQ2hyb21lRnJhbWVSZXBvcnRlcl9TdGF0ZV9TVEFURV9QUkVTRU5URURfUEFSVElBTDsKKyAg
c3RhdGljIGNvbnN0ZXhwciBhdXRvIFNUQVRFX0RST1BQRUQgPSBDaHJvbWVGcmFtZVJlcG9ydGVy
X1N0YXRlX1NUQVRFX0RST1BQRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTdGF0ZV9NSU4g
PSBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0YXRlX1NUQVRFX05PX1VQREFURV9ERVNJUkVEOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gU3RhdGVfTUFYID0gQ2hyb21lRnJhbWVSZXBvcnRlcl9TdGF0
ZV9TVEFURV9EUk9QUEVEOworICB1c2luZyBGcmFtZURyb3BSZWFzb24gPSBDaHJvbWVGcmFtZVJl
cG9ydGVyX0ZyYW1lRHJvcFJlYXNvbjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFJFQVNPTl9V
TlNQRUNJRklFRCA9IENocm9tZUZyYW1lUmVwb3J0ZXJfRnJhbWVEcm9wUmVhc29uX1JFQVNPTl9V
TlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFJFQVNPTl9ESVNQTEFZX0NPTVBP
U0lUT1IgPSBDaHJvbWVGcmFtZVJlcG9ydGVyX0ZyYW1lRHJvcFJlYXNvbl9SRUFTT05fRElTUExB
WV9DT01QT1NJVE9SOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gUkVBU09OX01BSU5fVEhSRUFE
ID0gQ2hyb21lRnJhbWVSZXBvcnRlcl9GcmFtZURyb3BSZWFzb25fUkVBU09OX01BSU5fVEhSRUFE
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gUkVBU09OX0NMSUVOVF9DT01QT1NJVE9SID0gQ2hy
b21lRnJhbWVSZXBvcnRlcl9GcmFtZURyb3BSZWFzb25fUkVBU09OX0NMSUVOVF9DT01QT1NJVE9S
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gRnJhbWVEcm9wUmVhc29uX01JTiA9IENocm9tZUZy
YW1lUmVwb3J0ZXJfRnJhbWVEcm9wUmVhc29uX1JFQVNPTl9VTlNQRUNJRklFRDsKKyAgc3RhdGlj
IGNvbnN0ZXhwciBhdXRvIEZyYW1lRHJvcFJlYXNvbl9NQVggPSBDaHJvbWVGcmFtZVJlcG9ydGVy
X0ZyYW1lRHJvcFJlYXNvbl9SRUFTT05fQ0xJRU5UX0NPTVBPU0lUT1I7CisgIGVudW0gRmllbGRO
dW1iZXJzIHsKKyAgICBrU3RhdGVGaWVsZE51bWJlciA9IDEsCisgICAga1JlYXNvbkZpZWxkTnVt
YmVyID0gMiwKKyAgICBrRnJhbWVTb3VyY2VGaWVsZE51bWJlciA9IDMsCisgICAga0ZyYW1lU2Vx
dWVuY2VGaWVsZE51bWJlciA9IDQsCisgIH07CisKKyAgQ2hyb21lRnJhbWVSZXBvcnRlcigpOwor
ICB+Q2hyb21lRnJhbWVSZXBvcnRlcigpIG92ZXJyaWRlOworICBDaHJvbWVGcmFtZVJlcG9ydGVy
KENocm9tZUZyYW1lUmVwb3J0ZXImJikgbm9leGNlcHQ7CisgIENocm9tZUZyYW1lUmVwb3J0ZXIm
IG9wZXJhdG9yPShDaHJvbWVGcmFtZVJlcG9ydGVyJiYpOworICBDaHJvbWVGcmFtZVJlcG9ydGVy
KGNvbnN0IENocm9tZUZyYW1lUmVwb3J0ZXImKTsKKyAgQ2hyb21lRnJhbWVSZXBvcnRlciYgb3Bl
cmF0b3I9KGNvbnN0IENocm9tZUZyYW1lUmVwb3J0ZXImKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNv
bnN0IENocm9tZUZyYW1lUmVwb3J0ZXImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0
IENocm9tZUZyYW1lUmVwb3J0ZXImIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90
aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3Zl
cnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7
CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlk
ZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBi
b29sIGhhc19zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIENocm9t
ZUZyYW1lUmVwb3J0ZXJfU3RhdGUgc3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV87IH0KKyAg
dm9pZCBzZXRfc3RhdGUoQ2hyb21lRnJhbWVSZXBvcnRlcl9TdGF0ZSB2YWx1ZSkgeyBzdGF0ZV8g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfcmVhc29uKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgQ2hyb21lRnJhbWVSZXBvcnRlcl9GcmFt
ZURyb3BSZWFzb24gcmVhc29uKCkgY29uc3QgeyByZXR1cm4gcmVhc29uXzsgfQorICB2b2lkIHNl
dF9yZWFzb24oQ2hyb21lRnJhbWVSZXBvcnRlcl9GcmFtZURyb3BSZWFzb24gdmFsdWUpIHsgcmVh
c29uXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc19mcmFtZV9z
b3VyY2UoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICB1aW50NjRfdCBmcmFt
ZV9zb3VyY2UoKSBjb25zdCB7IHJldHVybiBmcmFtZV9zb3VyY2VfOyB9CisgIHZvaWQgc2V0X2Zy
YW1lX3NvdXJjZSh1aW50NjRfdCB2YWx1ZSkgeyBmcmFtZV9zb3VyY2VfID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX2ZyYW1lX3NlcXVlbmNlKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bNF07IH0KKyAgdWludDY0X3QgZnJhbWVfc2VxdWVuY2UoKSBjb25z
dCB7IHJldHVybiBmcmFtZV9zZXF1ZW5jZV87IH0KKyAgdm9pZCBzZXRfZnJhbWVfc2VxdWVuY2Uo
dWludDY0X3QgdmFsdWUpIHsgZnJhbWVfc2VxdWVuY2VfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCg0KTsgfQorCisgcHJpdmF0ZToKKyAgQ2hyb21lRnJhbWVSZXBvcnRlcl9TdGF0ZSBzdGF0ZV97
fTsKKyAgQ2hyb21lRnJhbWVSZXBvcnRlcl9GcmFtZURyb3BSZWFzb24gcmVhc29uX3t9OworICB1
aW50NjRfdCBmcmFtZV9zb3VyY2Vfe307CisgIHVpbnQ2NF90IGZyYW1lX3NlcXVlbmNlX3t9Owor
CisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29t
cGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisg
IHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw1PiBfaGFzX2Zp
ZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2Ug
cHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9T
X1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfRlJBTUVfUkVQT1JURVJf
UFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJ
VC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBk
aWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1l
cXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJm
ZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfZnJhbWVfcmVwb3J0ZXIuZ2VuLmgiCisKK25h
bWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4gewor
CitDaHJvbWVGcmFtZVJlcG9ydGVyOjpDaHJvbWVGcmFtZVJlcG9ydGVyKCkgPSBkZWZhdWx0Owor
Q2hyb21lRnJhbWVSZXBvcnRlcjo6fkNocm9tZUZyYW1lUmVwb3J0ZXIoKSA9IGRlZmF1bHQ7CitD
aHJvbWVGcmFtZVJlcG9ydGVyOjpDaHJvbWVGcmFtZVJlcG9ydGVyKGNvbnN0IENocm9tZUZyYW1l
UmVwb3J0ZXImKSA9IGRlZmF1bHQ7CitDaHJvbWVGcmFtZVJlcG9ydGVyJiBDaHJvbWVGcmFtZVJl
cG9ydGVyOjpvcGVyYXRvcj0oY29uc3QgQ2hyb21lRnJhbWVSZXBvcnRlciYpID0gZGVmYXVsdDsK
K0Nocm9tZUZyYW1lUmVwb3J0ZXI6OkNocm9tZUZyYW1lUmVwb3J0ZXIoQ2hyb21lRnJhbWVSZXBv
cnRlciYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitDaHJvbWVGcmFtZVJlcG9ydGVyJiBDaHJvbWVG
cmFtZVJlcG9ydGVyOjpvcGVyYXRvcj0oQ2hyb21lRnJhbWVSZXBvcnRlciYmKSA9IGRlZmF1bHQ7
CisKK2Jvb2wgQ2hyb21lRnJhbWVSZXBvcnRlcjo6b3BlcmF0b3I9PShjb25zdCBDaHJvbWVGcmFt
ZVJlcG9ydGVyJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90
aGVyLnVua25vd25fZmllbGRzXworICAgJiYgc3RhdGVfID09IG90aGVyLnN0YXRlXworICAgJiYg
cmVhc29uXyA9PSBvdGhlci5yZWFzb25fCisgICAmJiBmcmFtZV9zb3VyY2VfID09IG90aGVyLmZy
YW1lX3NvdXJjZV8KKyAgICYmIGZyYW1lX3NlcXVlbmNlXyA9PSBvdGhlci5mcmFtZV9zZXF1ZW5j
ZV87Cit9CisKK2Jvb2wgQ2hyb21lRnJhbWVSZXBvcnRlcjo6UGFyc2VGcm9tQXJyYXkoY29uc3Qg
dm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAg
Ym9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVy
IGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZp
ZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlk
KCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5p
ZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyog
c3RhdGUgKi86CisgICAgICAgIGZpZWxkLmdldCgmc3RhdGVfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDIgLyogcmVhc29uICovOgorICAgICAgICBmaWVsZC5nZXQoJnJlYXNvbl8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBmcmFtZV9zb3VyY2UgKi86CisgICAgICAg
IGZpZWxkLmdldCgmZnJhbWVfc291cmNlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0
IC8qIGZyYW1lX3NlcXVlbmNlICovOgorICAgICAgICBmaWVsZC5nZXQoJmZyYW1lX3NlcXVlbmNl
Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFs
aXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0K
KyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKwor
c3RkOjpzdHJpbmcgQ2hyb21lRnJhbWVSZXBvcnRlcjo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25z
dCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1z
ZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJp
bmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ2hyb21lRnJhbWVSZXBvcnRlcjo6U2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQ2hyb21lRnJhbWVSZXBvcnRlcjo6
U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQg
MTogc3RhdGUKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQo
MSwgc3RhdGVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHJlYXNvbgorICBpZiAoX2hhc19maWVs
ZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCByZWFzb25fKTsKKyAgfQorCisgIC8v
IEZpZWxkIDM6IGZyYW1lX3NvdXJjZQorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCgzLCBmcmFtZV9zb3VyY2VfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IGZy
YW1lX3NlcXVlbmNlCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFy
SW50KDQsIGZyYW1lX3NlcXVlbmNlXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0
ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisK
K30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8g
bmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQv
Y2hyb21lX2hpc3RvZ3JhbV9zYW1wbGUuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4g
aGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9oaXN0
b2dyYW1fc2FtcGxlLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJm
ZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX0hJU1RPR1JBTV9TQU1QTEVfUFJPVE9fQ1BQX0hf
CisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZF
TlRfQ0hST01FX0hJU1RPR1JBTV9TQU1QTEVfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRp
bnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0
cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2Nv
cHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBw
cm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBDaHJvbWVIaXN0b2dyYW1TYW1wbGU7Cit9
ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5h
bWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNl
IHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENocm9t
ZUhpc3RvZ3JhbVNhbXBsZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7Cisg
cHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga05hbWVIYXNoRmllbGROdW1iZXIg
PSAxLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAyLAorICAgIGtTYW1wbGVGaWVsZE51bWJlciA9
IDMsCisgIH07CisKKyAgQ2hyb21lSGlzdG9ncmFtU2FtcGxlKCk7CisgIH5DaHJvbWVIaXN0b2dy
YW1TYW1wbGUoKSBvdmVycmlkZTsKKyAgQ2hyb21lSGlzdG9ncmFtU2FtcGxlKENocm9tZUhpc3Rv
Z3JhbVNhbXBsZSYmKSBub2V4Y2VwdDsKKyAgQ2hyb21lSGlzdG9ncmFtU2FtcGxlJiBvcGVyYXRv
cj0oQ2hyb21lSGlzdG9ncmFtU2FtcGxlJiYpOworICBDaHJvbWVIaXN0b2dyYW1TYW1wbGUoY29u
c3QgQ2hyb21lSGlzdG9ncmFtU2FtcGxlJik7CisgIENocm9tZUhpc3RvZ3JhbVNhbXBsZSYgb3Bl
cmF0b3I9KGNvbnN0IENocm9tZUhpc3RvZ3JhbVNhbXBsZSYpOworICBib29sIG9wZXJhdG9yPT0o
Y29uc3QgQ2hyb21lSGlzdG9ncmFtU2FtcGxlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShj
b25zdCBDaHJvbWVIaXN0b2dyYW1TYW1wbGUmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVf
dCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3Zl
cnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBv
dmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsK
KworICBib29sIGhhc19uYW1lX2hhc2goKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsg
fQorICB1aW50NjRfdCBuYW1lX2hhc2goKSBjb25zdCB7IHJldHVybiBuYW1lX2hhc2hfOyB9Cisg
IHZvaWQgc2V0X25hbWVfaGFzaCh1aW50NjRfdCB2YWx1ZSkgeyBuYW1lX2hhc2hfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1syXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX3Nh
bXBsZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGludDY0X3Qgc2FtcGxl
KCkgY29uc3QgeyByZXR1cm4gc2FtcGxlXzsgfQorICB2b2lkIHNldF9zYW1wbGUoaW50NjRfdCB2
YWx1ZSkgeyBzYW1wbGVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgcHJpdmF0
ZToKKyAgdWludDY0X3QgbmFtZV9oYXNoX3t9OworICBzdGQ6OnN0cmluZyBuYW1lX3t9OworICBp
bnQ2NF90IHNhbXBsZV97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90
b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMg
b2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3Rk
OjpiaXRzZXQ8ND4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0
bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYg
IC8vIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hS
T01FX0hJU1RPR1JBTV9TQU1QTEVfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9y
ZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVm
ZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5f
cGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0
aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfaGlzdG9n
cmFtX3NhbXBsZS5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90
b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK0Nocm9tZUhpc3RvZ3JhbVNhbXBsZTo6Q2hyb21lSGlz
dG9ncmFtU2FtcGxlKCkgPSBkZWZhdWx0OworQ2hyb21lSGlzdG9ncmFtU2FtcGxlOjp+Q2hyb21l
SGlzdG9ncmFtU2FtcGxlKCkgPSBkZWZhdWx0OworQ2hyb21lSGlzdG9ncmFtU2FtcGxlOjpDaHJv
bWVIaXN0b2dyYW1TYW1wbGUoY29uc3QgQ2hyb21lSGlzdG9ncmFtU2FtcGxlJikgPSBkZWZhdWx0
OworQ2hyb21lSGlzdG9ncmFtU2FtcGxlJiBDaHJvbWVIaXN0b2dyYW1TYW1wbGU6Om9wZXJhdG9y
PShjb25zdCBDaHJvbWVIaXN0b2dyYW1TYW1wbGUmKSA9IGRlZmF1bHQ7CitDaHJvbWVIaXN0b2dy
YW1TYW1wbGU6OkNocm9tZUhpc3RvZ3JhbVNhbXBsZShDaHJvbWVIaXN0b2dyYW1TYW1wbGUmJikg
bm9leGNlcHQgPSBkZWZhdWx0OworQ2hyb21lSGlzdG9ncmFtU2FtcGxlJiBDaHJvbWVIaXN0b2dy
YW1TYW1wbGU6Om9wZXJhdG9yPShDaHJvbWVIaXN0b2dyYW1TYW1wbGUmJikgPSBkZWZhdWx0Owor
Citib29sIENocm9tZUhpc3RvZ3JhbVNhbXBsZTo6b3BlcmF0b3I9PShjb25zdCBDaHJvbWVIaXN0
b2dyYW1TYW1wbGUmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0g
b3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBuYW1lX2hhc2hfID09IG90aGVyLm5hbWVfaGFz
aF8KKyAgICYmIG5hbWVfID09IG90aGVyLm5hbWVfCisgICAmJiBzYW1wbGVfID09IG90aGVyLnNh
bXBsZV87Cit9CisKK2Jvb2wgQ2hyb21lSGlzdG9ncmFtU2FtcGxlOjpQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigp
OworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0Rl
Y29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQo
KTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmll
bGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZp
ZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2Ug
MSAvKiBuYW1lX2hhc2ggKi86CisgICAgICAgIGZpZWxkLmdldCgmbmFtZV9oYXNoXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIG5hbWUgKi86CisgICAgICAgIGZpZWxkLmdldCgm
bmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBzYW1wbGUgKi86CisgICAg
ICAgIGZpZWxkLmdldCgmc2FtcGxlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoK
KyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVj
LmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgQ2hyb21lSGlzdG9ncmFtU2FtcGxlOjpT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBD
aHJvbWVIaXN0b2dyYW1TYW1wbGU6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2
b2lkIENocm9tZUhpc3RvZ3JhbVNhbXBsZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdl
KiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogbmFtZV9oYXNoCisgIGlmIChfaGFzX2ZpZWxk
X1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIG5hbWVfaGFzaF8pOworICB9CisKKyAg
Ly8gRmllbGQgMjogbmFtZQorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVu
ZFN0cmluZygyLCBuYW1lXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBzYW1wbGUKKyAgaWYgKF9o
YXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMywgc2FtcGxlXyk7CisgIH0K
KworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5r
bm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlh
Z25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3Mv
cGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX2tleWVkX3NlcnZpY2UuZ2VuLmNjCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNl
L3RyYWNrX2V2ZW50L2Nocm9tZV9rZXllZF9zZXJ2aWNlLmdlbi5oCisvLyBETyBOT1QgRURJVC4g
QXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX0tFWUVEX1NF
UlZJQ0VfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX0tFWUVEX1NFUlZJQ0VfUFJPVE9fQ1BQX0hfCisK
KyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9y
PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNz
YWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBDaHJvbWVLZXll
ZFNlcnZpY2U7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90
b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBN
ZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8g
eworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9f
RVhQT1JUIENocm9tZUtleWVkU2VydmljZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2Fn
ZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga05hbWVGaWVsZE51
bWJlciA9IDEsCisgIH07CisKKyAgQ2hyb21lS2V5ZWRTZXJ2aWNlKCk7CisgIH5DaHJvbWVLZXll
ZFNlcnZpY2UoKSBvdmVycmlkZTsKKyAgQ2hyb21lS2V5ZWRTZXJ2aWNlKENocm9tZUtleWVkU2Vy
dmljZSYmKSBub2V4Y2VwdDsKKyAgQ2hyb21lS2V5ZWRTZXJ2aWNlJiBvcGVyYXRvcj0oQ2hyb21l
S2V5ZWRTZXJ2aWNlJiYpOworICBDaHJvbWVLZXllZFNlcnZpY2UoY29uc3QgQ2hyb21lS2V5ZWRT
ZXJ2aWNlJik7CisgIENocm9tZUtleWVkU2VydmljZSYgb3BlcmF0b3I9KGNvbnN0IENocm9tZUtl
eWVkU2VydmljZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2hyb21lS2V5ZWRTZXJ2aWNl
JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaHJvbWVLZXllZFNlcnZpY2UmIG90
aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19uYW1lKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25z
dCB7IHJldHVybiBuYW1lXzsgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2
YWx1ZSkgeyBuYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworIHByaXZhdGU6
CisgIHN0ZDo6c3RyaW5nIG5hbWVfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25v
d24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZl
cnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOwor
CisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKwor
I2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VW
RU5UX0NIUk9NRV9LRVlFRF9TRVJWSUNFX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFw
X2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3Bw
Z2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFn
bm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX2tl
eWVkX3NlcnZpY2UuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJv
dG9zIHsKK25hbWVzcGFjZSBnZW4geworCitDaHJvbWVLZXllZFNlcnZpY2U6OkNocm9tZUtleWVk
U2VydmljZSgpID0gZGVmYXVsdDsKK0Nocm9tZUtleWVkU2VydmljZTo6fkNocm9tZUtleWVkU2Vy
dmljZSgpID0gZGVmYXVsdDsKK0Nocm9tZUtleWVkU2VydmljZTo6Q2hyb21lS2V5ZWRTZXJ2aWNl
KGNvbnN0IENocm9tZUtleWVkU2VydmljZSYpID0gZGVmYXVsdDsKK0Nocm9tZUtleWVkU2Vydmlj
ZSYgQ2hyb21lS2V5ZWRTZXJ2aWNlOjpvcGVyYXRvcj0oY29uc3QgQ2hyb21lS2V5ZWRTZXJ2aWNl
JikgPSBkZWZhdWx0OworQ2hyb21lS2V5ZWRTZXJ2aWNlOjpDaHJvbWVLZXllZFNlcnZpY2UoQ2hy
b21lS2V5ZWRTZXJ2aWNlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0Nocm9tZUtleWVkU2Vydmlj
ZSYgQ2hyb21lS2V5ZWRTZXJ2aWNlOjpvcGVyYXRvcj0oQ2hyb21lS2V5ZWRTZXJ2aWNlJiYpID0g
ZGVmYXVsdDsKKworYm9vbCBDaHJvbWVLZXllZFNlcnZpY2U6Om9wZXJhdG9yPT0oY29uc3QgQ2hy
b21lS2V5ZWRTZXJ2aWNlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNf
ID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgbmFtZV8gPT0gb3RoZXIubmFtZV87Cit9
CisKK2Jvb2wgQ2hyb21lS2V5ZWRTZXJ2aWNlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBy
YXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBh
Y2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJh
dywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFs
aWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9o
YXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOwor
ICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBuYW1lICov
OgorICAgICAgICBmaWVsZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZh
dWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYm
ICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBDaHJvbWVLZXllZFNlcnZpY2U6
OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVk
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICBy
ZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IENocm9tZUtleWVkU2VydmljZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3Zv
aWQgQ2hyb21lS2V5ZWRTZXJ2aWNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgewor
ICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEsIG5hbWVfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3
UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgp
KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9z
Cit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFj
a19ldmVudC9jaHJvbWVfbGF0ZW5jeV9pbmZvLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVf
bGF0ZW5jeV9pbmZvLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJm
ZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX0xBVEVOQ1lfSU5GT19QUk9UT19DUFBfSF8KKyNk
ZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9D
SFJPTUVfTEFURU5DWV9JTkZPX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+Cisj
aW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+Cisj
aW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9w
dHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jh
c2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsK
K25hbWVzcGFjZSBnZW4geworY2xhc3MgQ2hyb21lTGF0ZW5jeUluZm87CitjbGFzcyBDaHJvbWVM
YXRlbmN5SW5mb19Db21wb25lbnRJbmZvOworZW51bSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwIDog
aW50OworZW51bSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZSA6IGludDsK
K30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8g
bmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9
ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3Bh
Y2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworZW51bSBDaHJvbWVMYXRlbmN5SW5mb19TdGVw
IDogaW50IHsKKyAgQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX1VOU1BFQ0lGSUVEID0gMCwK
KyAgQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX1NFTkRfSU5QVVRfRVZFTlRfVUkgPSAzLAor
ICBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfSEFORExFX0lOUFVUX0VWRU5UX0lNUEwgPSA1
LAorICBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfRElEX0hBTkRMRV9JTlBVVF9BTkRfT1ZF
UlNDUk9MTCA9IDgsCisgIENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9IQU5ETEVfSU5QVVRf
RVZFTlRfTUFJTiA9IDQsCisgIENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9NQUlOX1RIUkVB
RF9TQ1JPTExfVVBEQVRFID0gMiwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX0hBTkRM
RV9JTlBVVF9FVkVOVF9NQUlOX0NPTU1JVCA9IDEsCisgIENocm9tZUxhdGVuY3lJbmZvX1N0ZXBf
U1RFUF9IQU5ETEVEX0lOUFVUX0VWRU5UX01BSU5fT1JfSU1QTCA9IDksCisgIENocm9tZUxhdGVu
Y3lJbmZvX1N0ZXBfU1RFUF9IQU5ETEVEX0lOUFVUX0VWRU5UX0lNUEwgPSAxMCwKKyAgQ2hyb21l
TGF0ZW5jeUluZm9fU3RlcF9TVEVQX1NXQVBfQlVGRkVSUyA9IDYsCisgIENocm9tZUxhdGVuY3lJ
bmZvX1N0ZXBfU1RFUF9EUkFXX0FORF9TV0FQID0gNywKK307CitlbnVtIENocm9tZUxhdGVuY3lJ
bmZvX0xhdGVuY3lDb21wb25lbnRUeXBlIDogaW50IHsKKyAgQ2hyb21lTGF0ZW5jeUluZm9fTGF0
ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ2hyb21lTGF0
ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVO
Q1lfQkVHSU5fUldIID0gMSwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5
cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfU0NST0xMX1VQREFURV9PUklHSU5BTCA9
IDIsCisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9J
TlBVVF9FVkVOVF9MQVRFTkNZX0ZJUlNUX1NDUk9MTF9VUERBVEVfT1JJR0lOQUwgPSAzLAorICBD
aHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZF
TlRfTEFURU5DWV9PUklHSU5BTCA9IDQsCisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21w
b25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX1VJID0gNSwKKyAgQ2hyb21l
TGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xB
VEVOQ1lfUkVOREVSRVJfTUFJTiA9IDYsCisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21w
b25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX1JFTkRFUklOR19TQ0hFRFVM
RURfTUFJTiA9IDcsCisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NP
TVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX1JFTkRFUklOR19TQ0hFRFVMRURfSU1QTCA9IDgs
CisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9JTlBV
VF9FVkVOVF9MQVRFTkNZX1NDUk9MTF9VUERBVEVfTEFTVF9FVkVOVCA9IDksCisgIENocm9tZUxh
dGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRF
TkNZX0FDS19SV0ggPSAxMCwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5
cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVSRVJfU1dBUCA9IDExLAorICBD
aHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfRElTUExBWV9D
T01QT1NJVE9SX1JFQ0VJVkVEX0ZSQU1FID0gMTIsCisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVu
Y3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9HUFVfU1dBUF9CVUZGRVIgPSAx
MywKKyAgQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lO
UFVUX0VWRU5UX0xBVEVOQ1lfRlJBTUVfU1dBUCA9IDE0LAorfTsKKworY2xhc3MgUEVSRkVUVE9f
RVhQT1JUIENocm9tZUxhdGVuY3lJbmZvIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdl
T2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIENvbXBvbmVudEluZm8gPSBDaHJvbWVMYXRlbmN5SW5m
b19Db21wb25lbnRJbmZvOworICB1c2luZyBTdGVwID0gQ2hyb21lTGF0ZW5jeUluZm9fU3RlcDsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNURVBfVU5TUEVDSUZJRUQgPSBDaHJvbWVMYXRlbmN5
SW5mb19TdGVwX1NURVBfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTVEVQ
X1NFTkRfSU5QVVRfRVZFTlRfVUkgPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfU0VORF9J
TlBVVF9FVkVOVF9VSTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNURVBfSEFORExFX0lOUFVU
X0VWRU5UX0lNUEwgPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfSEFORExFX0lOUFVUX0VW
RU5UX0lNUEw7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTVEVQX0RJRF9IQU5ETEVfSU5QVVRf
QU5EX09WRVJTQ1JPTEwgPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfRElEX0hBTkRMRV9J
TlBVVF9BTkRfT1ZFUlNDUk9MTDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNURVBfSEFORExF
X0lOUFVUX0VWRU5UX01BSU4gPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfSEFORExFX0lO
UFVUX0VWRU5UX01BSU47CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTVEVQX01BSU5fVEhSRUFE
X1NDUk9MTF9VUERBVEUgPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfTUFJTl9USFJFQURf
U0NST0xMX1VQREFURTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNURVBfSEFORExFX0lOUFVU
X0VWRU5UX01BSU5fQ09NTUlUID0gQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX0hBTkRMRV9J
TlBVVF9FVkVOVF9NQUlOX0NPTU1JVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNURVBfSEFO
RExFRF9JTlBVVF9FVkVOVF9NQUlOX09SX0lNUEwgPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NU
RVBfSEFORExFRF9JTlBVVF9FVkVOVF9NQUlOX09SX0lNUEw7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBTVEVQX0hBTkRMRURfSU5QVVRfRVZFTlRfSU1QTCA9IENocm9tZUxhdGVuY3lJbmZvX1N0
ZXBfU1RFUF9IQU5ETEVEX0lOUFVUX0VWRU5UX0lNUEw7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBTVEVQX1NXQVBfQlVGRkVSUyA9IENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9TV0FQX0JV
RkZFUlM7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTVEVQX0RSQVdfQU5EX1NXQVAgPSBDaHJv
bWVMYXRlbmN5SW5mb19TdGVwX1NURVBfRFJBV19BTkRfU1dBUDsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIFN0ZXBfTUlOID0gQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX1VOU1BFQ0lGSUVE
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gU3RlcF9NQVggPSBDaHJvbWVMYXRlbmN5SW5mb19T
dGVwX1NURVBfSEFORExFRF9JTlBVVF9FVkVOVF9JTVBMOworICB1c2luZyBMYXRlbmN5Q29tcG9u
ZW50VHlwZSA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlOworICBzdGF0
aWMgY29uc3RleHByIGF1dG8gQ09NUE9ORU5UX1VOU1BFQ0lGSUVEID0gQ2hyb21lTGF0ZW5jeUlu
Zm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX1VOU1BFQ0lGSUVEOworICBzdGF0aWMg
Y29uc3RleHByIGF1dG8gQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfQkVHSU5fUldIID0g
Q2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VW
RU5UX0xBVEVOQ1lfQkVHSU5fUldIOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ09NUE9ORU5U
X0lOUFVUX0VWRU5UX0xBVEVOQ1lfU0NST0xMX1VQREFURV9PUklHSU5BTCA9IENocm9tZUxhdGVu
Y3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZ
X1NDUk9MTF9VUERBVEVfT1JJR0lOQUw7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDT01QT05F
TlRfSU5QVVRfRVZFTlRfTEFURU5DWV9GSVJTVF9TQ1JPTExfVVBEQVRFX09SSUdJTkFMID0gQ2hy
b21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5U
X0xBVEVOQ1lfRklSU1RfU0NST0xMX1VQREFURV9PUklHSU5BTDsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIENPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX09SSUdJTkFMID0gQ2hyb21lTGF0
ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVO
Q1lfT1JJR0lOQUw7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDT01QT05FTlRfSU5QVVRfRVZF
TlRfTEFURU5DWV9VSSA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NP
TVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX1VJOworICBzdGF0aWMgY29uc3RleHByIGF1dG8g
Q09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVSRVJfTUFJTiA9IENocm9tZUxhdGVu
Y3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZ
X1JFTkRFUkVSX01BSU47CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDT01QT05FTlRfSU5QVVRf
RVZFTlRfTEFURU5DWV9SRU5ERVJJTkdfU0NIRURVTEVEX01BSU4gPSBDaHJvbWVMYXRlbmN5SW5m
b19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9SRU5E
RVJJTkdfU0NIRURVTEVEX01BSU47CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDT01QT05FTlRf
SU5QVVRfRVZFTlRfTEFURU5DWV9SRU5ERVJJTkdfU0NIRURVTEVEX0lNUEwgPSBDaHJvbWVMYXRl
bmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5D
WV9SRU5ERVJJTkdfU0NIRURVTEVEX0lNUEw7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDT01Q
T05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9TQ1JPTExfVVBEQVRFX0xBU1RfRVZFTlQgPSBDaHJv
bWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRf
TEFURU5DWV9TQ1JPTExfVVBEQVRFX0xBU1RfRVZFTlQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBDT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9BQ0tfUldIID0gQ2hyb21lTGF0ZW5jeUlu
Zm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfQUNL
X1JXSDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRF
TkNZX1JFTkRFUkVSX1NXQVAgPSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlw
ZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9SRU5ERVJFUl9TV0FQOworICBzdGF0aWMg
Y29uc3RleHByIGF1dG8gQ09NUE9ORU5UX0RJU1BMQVlfQ09NUE9TSVRPUl9SRUNFSVZFRF9GUkFN
RSA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9ESVNQ
TEFZX0NPTVBPU0lUT1JfUkVDRUlWRURfRlJBTUU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBD
T01QT05FTlRfSU5QVVRfRVZFTlRfR1BVX1NXQVBfQlVGRkVSID0gQ2hyb21lTGF0ZW5jeUluZm9f
TGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0dQVV9TV0FQX0JVRkZF
UjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZ
X0ZSQU1FX1NXQVAgPSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01Q
T05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9GUkFNRV9TV0FQOworICBzdGF0aWMgY29uc3RleHBy
IGF1dG8gTGF0ZW5jeUNvbXBvbmVudFR5cGVfTUlOID0gQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5j
eUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHBy
IGF1dG8gTGF0ZW5jeUNvbXBvbmVudFR5cGVfTUFYID0gQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5j
eUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfRlJBTUVfU1dBUDsK
KyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtUcmFjZUlkRmllbGROdW1iZXIgPSAxLAorICAg
IGtTdGVwRmllbGROdW1iZXIgPSAyLAorICAgIGtGcmFtZVRyZWVOb2RlSWRGaWVsZE51bWJlciA9
IDMsCisgICAga0NvbXBvbmVudEluZm9GaWVsZE51bWJlciA9IDQsCisgICAga0lzQ29hbGVzY2Vk
RmllbGROdW1iZXIgPSA1LAorICAgIGtHZXN0dXJlU2Nyb2xsSWRGaWVsZE51bWJlciA9IDYsCisg
IH07CisKKyAgQ2hyb21lTGF0ZW5jeUluZm8oKTsKKyAgfkNocm9tZUxhdGVuY3lJbmZvKCkgb3Zl
cnJpZGU7CisgIENocm9tZUxhdGVuY3lJbmZvKENocm9tZUxhdGVuY3lJbmZvJiYpIG5vZXhjZXB0
OworICBDaHJvbWVMYXRlbmN5SW5mbyYgb3BlcmF0b3I9KENocm9tZUxhdGVuY3lJbmZvJiYpOwor
ICBDaHJvbWVMYXRlbmN5SW5mbyhjb25zdCBDaHJvbWVMYXRlbmN5SW5mbyYpOworICBDaHJvbWVM
YXRlbmN5SW5mbyYgb3BlcmF0b3I9KGNvbnN0IENocm9tZUxhdGVuY3lJbmZvJik7CisgIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBDaHJvbWVMYXRlbmN5SW5mbyYpIGNvbnN0OworICBib29sIG9wZXJh
dG9yIT0oY29uc3QgQ2hyb21lTGF0ZW5jeUluZm8mIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNp
emVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qg
b3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25z
dCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25z
dDsKKworICBib29sIGhhc190cmFjZV9pZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFd
OyB9CisgIGludDY0X3QgdHJhY2VfaWQoKSBjb25zdCB7IHJldHVybiB0cmFjZV9pZF87IH0KKyAg
dm9pZCBzZXRfdHJhY2VfaWQoaW50NjRfdCB2YWx1ZSkgeyB0cmFjZV9pZF8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfc3RlcCgpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzJdOyB9CisgIENocm9tZUxhdGVuY3lJbmZvX1N0ZXAgc3RlcCgpIGNvbnN0IHsg
cmV0dXJuIHN0ZXBfOyB9CisgIHZvaWQgc2V0X3N0ZXAoQ2hyb21lTGF0ZW5jeUluZm9fU3RlcCB2
YWx1ZSkgeyBzdGVwXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhh
c19mcmFtZV90cmVlX25vZGVfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQor
ICBpbnQzMl90IGZyYW1lX3RyZWVfbm9kZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lX3RyZWVf
bm9kZV9pZF87IH0KKyAgdm9pZCBzZXRfZnJhbWVfdHJlZV9ub2RlX2lkKGludDMyX3QgdmFsdWUp
IHsgZnJhbWVfdHJlZV9ub2RlX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKwor
ICBpbnQgY29tcG9uZW50X2luZm9fc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGlu
dD4oY29tcG9uZW50X2luZm9fLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2hyb21l
TGF0ZW5jeUluZm9fQ29tcG9uZW50SW5mbz4mIGNvbXBvbmVudF9pbmZvKCkgY29uc3QgeyByZXR1
cm4gY29tcG9uZW50X2luZm9fOyB9CisgIHN0ZDo6dmVjdG9yPENocm9tZUxhdGVuY3lJbmZvX0Nv
bXBvbmVudEluZm8+KiBtdXRhYmxlX2NvbXBvbmVudF9pbmZvKCkgeyByZXR1cm4gJmNvbXBvbmVu
dF9pbmZvXzsgfQorICB2b2lkIGNsZWFyX2NvbXBvbmVudF9pbmZvKCkgeyBjb21wb25lbnRfaW5m
b18uY2xlYXIoKTsgfQorICBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvKiBhZGRfY29t
cG9uZW50X2luZm8oKSB7IGNvbXBvbmVudF9pbmZvXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZj
b21wb25lbnRfaW5mb18uYmFjaygpOyB9CisKKyAgYm9vbCBoYXNfaXNfY29hbGVzY2VkKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07IH0KKyAgYm9vbCBpc19jb2FsZXNjZWQoKSBjb25z
dCB7IHJldHVybiBpc19jb2FsZXNjZWRfOyB9CisgIHZvaWQgc2V0X2lzX2NvYWxlc2NlZChib29s
IHZhbHVlKSB7IGlzX2NvYWxlc2NlZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDUpOyB9CisK
KyAgYm9vbCBoYXNfZ2VzdHVyZV9zY3JvbGxfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1s2XTsgfQorICBpbnQ2NF90IGdlc3R1cmVfc2Nyb2xsX2lkKCkgY29uc3QgeyByZXR1cm4gZ2Vz
dHVyZV9zY3JvbGxfaWRfOyB9CisgIHZvaWQgc2V0X2dlc3R1cmVfc2Nyb2xsX2lkKGludDY0X3Qg
dmFsdWUpIHsgZ2VzdHVyZV9zY3JvbGxfaWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg2KTsg
fQorCisgcHJpdmF0ZToKKyAgaW50NjRfdCB0cmFjZV9pZF97fTsKKyAgQ2hyb21lTGF0ZW5jeUlu
Zm9fU3RlcCBzdGVwX3t9OworICBpbnQzMl90IGZyYW1lX3RyZWVfbm9kZV9pZF97fTsKKyAgc3Rk
Ojp2ZWN0b3I8Q2hyb21lTGF0ZW5jeUluZm9fQ29tcG9uZW50SW5mbz4gY29tcG9uZW50X2luZm9f
OworICBib29sIGlzX2NvYWxlc2NlZF97fTsKKyAgaW50NjRfdCBnZXN0dXJlX3Njcm9sbF9pZF97
fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9y
IGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVz
LgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Nz4gX2hh
c19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENocm9tZUxhdGVuY3lJ
bmZvX0NvbXBvbmVudEluZm8gOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogewor
IHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtDb21wb25lbnRUeXBlRmllbGRO
dW1iZXIgPSAxLAorICAgIGtUaW1lVXNGaWVsZE51bWJlciA9IDIsCisgIH07CisKKyAgQ2hyb21l
TGF0ZW5jeUluZm9fQ29tcG9uZW50SW5mbygpOworICB+Q2hyb21lTGF0ZW5jeUluZm9fQ29tcG9u
ZW50SW5mbygpIG92ZXJyaWRlOworICBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvKENo
cm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm8mJikgbm9leGNlcHQ7CisgIENocm9tZUxhdGVu
Y3lJbmZvX0NvbXBvbmVudEluZm8mIG9wZXJhdG9yPShDaHJvbWVMYXRlbmN5SW5mb19Db21wb25l
bnRJbmZvJiYpOworICBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvKGNvbnN0IENocm9t
ZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm8mKTsKKyAgQ2hyb21lTGF0ZW5jeUluZm9fQ29tcG9u
ZW50SW5mbyYgb3BlcmF0b3I9KGNvbnN0IENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm8m
KTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudElu
Zm8mKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENocm9tZUxhdGVuY3lJbmZvX0Nv
bXBvbmVudEluZm8mIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQor
CisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7Cisg
IHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9p
ZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19j
b21wb25lbnRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIENocm9t
ZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlIGNvbXBvbmVudF90eXBlKCkgY29uc3Qg
eyByZXR1cm4gY29tcG9uZW50X3R5cGVfOyB9CisgIHZvaWQgc2V0X2NvbXBvbmVudF90eXBlKENo
cm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlIHZhbHVlKSB7IGNvbXBvbmVudF90
eXBlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc190aW1lX3Vz
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgdWludDY0X3QgdGltZV91cygp
IGNvbnN0IHsgcmV0dXJuIHRpbWVfdXNfOyB9CisgIHZvaWQgc2V0X3RpbWVfdXModWludDY0X3Qg
dmFsdWUpIHsgdGltZV91c18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyBwcml2
YXRlOgorICBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZSBjb21wb25lbnRf
dHlwZV97fTsKKyAgdWludDY0X3QgdGltZV91c197fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2Vy
dmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBm
dXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2Zp
ZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mz4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNl
IGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
VFJBQ0tfRVZFTlRfQ0hST01FX0xBVEVOQ1lfSU5GT19QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVy
ZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZl
dHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBH
Q0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2No
cm9tZV9sYXRlbmN5X2luZm8uZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3Bh
Y2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitDaHJvbWVMYXRlbmN5SW5mbzo6Q2hyb21l
TGF0ZW5jeUluZm8oKSA9IGRlZmF1bHQ7CitDaHJvbWVMYXRlbmN5SW5mbzo6fkNocm9tZUxhdGVu
Y3lJbmZvKCkgPSBkZWZhdWx0OworQ2hyb21lTGF0ZW5jeUluZm86OkNocm9tZUxhdGVuY3lJbmZv
KGNvbnN0IENocm9tZUxhdGVuY3lJbmZvJikgPSBkZWZhdWx0OworQ2hyb21lTGF0ZW5jeUluZm8m
IENocm9tZUxhdGVuY3lJbmZvOjpvcGVyYXRvcj0oY29uc3QgQ2hyb21lTGF0ZW5jeUluZm8mKSA9
IGRlZmF1bHQ7CitDaHJvbWVMYXRlbmN5SW5mbzo6Q2hyb21lTGF0ZW5jeUluZm8oQ2hyb21lTGF0
ZW5jeUluZm8mJikgbm9leGNlcHQgPSBkZWZhdWx0OworQ2hyb21lTGF0ZW5jeUluZm8mIENocm9t
ZUxhdGVuY3lJbmZvOjpvcGVyYXRvcj0oQ2hyb21lTGF0ZW5jeUluZm8mJikgPSBkZWZhdWx0Owor
Citib29sIENocm9tZUxhdGVuY3lJbmZvOjpvcGVyYXRvcj09KGNvbnN0IENocm9tZUxhdGVuY3lJ
bmZvJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVu
a25vd25fZmllbGRzXworICAgJiYgdHJhY2VfaWRfID09IG90aGVyLnRyYWNlX2lkXworICAgJiYg
c3RlcF8gPT0gb3RoZXIuc3RlcF8KKyAgICYmIGZyYW1lX3RyZWVfbm9kZV9pZF8gPT0gb3RoZXIu
ZnJhbWVfdHJlZV9ub2RlX2lkXworICAgJiYgY29tcG9uZW50X2luZm9fID09IG90aGVyLmNvbXBv
bmVudF9pbmZvXworICAgJiYgaXNfY29hbGVzY2VkXyA9PSBvdGhlci5pc19jb2FsZXNjZWRfCisg
ICAmJiBnZXN0dXJlX3Njcm9sbF9pZF8gPT0gb3RoZXIuZ2VzdHVyZV9zY3JvbGxfaWRfOworfQor
Citib29sIENocm9tZUxhdGVuY3lJbmZvOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcs
IHNpemVfdCBzaXplKSB7CisgIGNvbXBvbmVudF9pbmZvXy5jbGVhcigpOworICB1bmtub3duX2Zp
ZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3Rv
emVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7
CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNf
ZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7
CisgICAgICBjYXNlIDEgLyogdHJhY2VfaWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmdHJhY2Vf
aWRfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogc3RlcCAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZzdGVwXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIGZyYW1l
X3RyZWVfbm9kZV9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZmcmFtZV90cmVlX25vZGVfaWRf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyogY29tcG9uZW50X2luZm8gKi86Cisg
ICAgICAgIGNvbXBvbmVudF9pbmZvXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgY29tcG9uZW50
X2luZm9fLmJhY2soKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUgLyogaXNfY29hbGVzY2VkICovOgorICAgICAgICBm
aWVsZC5nZXQoJmlzX2NvYWxlc2NlZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAv
KiBnZXN0dXJlX3Njcm9sbF9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZnZXN0dXJlX3Njcm9s
bF9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNl
cmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAg
ICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9
CisKK3N0ZDo6c3RyaW5nIENocm9tZUxhdGVuY3lJbmZvOjpTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4g
bXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0
cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBDaHJvbWVMYXRlbmN5SW5mbzo6U2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQ2hyb21lTGF0ZW5jeUluZm86OlNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6
IHRyYWNlX2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50
KDEsIHRyYWNlX2lkXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBzdGVwCisgIGlmIChfaGFzX2Zp
ZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDIsIHN0ZXBfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDM6IGZyYW1lX3RyZWVfbm9kZV9pZAorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAg
ICBtc2ctPkFwcGVuZFZhckludCgzLCBmcmFtZV90cmVlX25vZGVfaWRfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDQ6IGNvbXBvbmVudF9pbmZvCisgIGZvciAoYXV0byYgaXQgOiBjb21wb25lbnRfaW5m
b18pIHsKKyAgICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+KDQpKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IGlzX2NvYWxlc2NlZAorICBp
ZiAoX2hhc19maWVsZF9bNV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNSwgaXNfY29h
bGVzY2VkXyk7CisgIH0KKworICAvLyBGaWVsZCA2OiBnZXN0dXJlX3Njcm9sbF9pZAorICBpZiAo
X2hhc19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg2LCBnZXN0dXJlX3Njcm9s
bF9pZF8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRz
Xy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0Nocm9tZUxhdGVuY3lJ
bmZvX0NvbXBvbmVudEluZm86OkNocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm8oKSA9IGRl
ZmF1bHQ7CitDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvOjp+Q2hyb21lTGF0ZW5jeUlu
Zm9fQ29tcG9uZW50SW5mbygpID0gZGVmYXVsdDsKK0Nocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVu
dEluZm86OkNocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm8oY29uc3QgQ2hyb21lTGF0ZW5j
eUluZm9fQ29tcG9uZW50SW5mbyYpID0gZGVmYXVsdDsKK0Nocm9tZUxhdGVuY3lJbmZvX0NvbXBv
bmVudEluZm8mIENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm86Om9wZXJhdG9yPShjb25z
dCBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvJikgPSBkZWZhdWx0OworQ2hyb21lTGF0
ZW5jeUluZm9fQ29tcG9uZW50SW5mbzo6Q2hyb21lTGF0ZW5jeUluZm9fQ29tcG9uZW50SW5mbyhD
aHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0No
cm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm8mIENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVu
dEluZm86Om9wZXJhdG9yPShDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvJiYpID0gZGVm
YXVsdDsKKworYm9vbCBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvOjpvcGVyYXRvcj09
KGNvbnN0IENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm8mIG90aGVyKSBjb25zdCB7Cisg
IHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBj
b21wb25lbnRfdHlwZV8gPT0gb3RoZXIuY29tcG9uZW50X3R5cGVfCisgICAmJiB0aW1lX3VzXyA9
PSBvdGhlci50aW1lX3VzXzsKK30KKworYm9vbCBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJ
bmZvOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVu
a25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisg
IDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBm
aWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZp
ZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAg
ICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxk
LmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBjb21wb25lbnRfdHlwZSAqLzoKKyAgICAgICAgZmll
bGQuZ2V0KCZjb21wb25lbnRfdHlwZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAv
KiB0aW1lX3VzICovOgorICAgICAgICBmaWVsZC5nZXQoJnRpbWVfdXNfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygm
dW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAh
cGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBDaHJv
bWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsK
KyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOwor
ICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygp
OworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJ
bmZvOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZl
cmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOwor
ICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBDaHJvbWVMYXRlbmN5
SW5mb19Db21wb25lbnRJbmZvOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykg
Y29uc3QgeworICAvLyBGaWVsZCAxOiBjb21wb25lbnRfdHlwZQorICBpZiAoX2hhc19maWVsZF9b
MV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCBjb21wb25lbnRfdHlwZV8pOworICB9CisK
KyAgLy8gRmllbGQgMjogdGltZV91cworICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCgyLCB0aW1lX3VzXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3Rv
Qnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9
CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAg
Ly8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZl
bnQvY2hyb21lX2xlZ2FjeV9pcGMuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9sZWdhY3lf
aXBjLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBn
ZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
VFJBQ0tfRVZFTlRfQ0hST01FX0xFR0FDWV9JUENfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZF
VFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX0xFR0FD
WV9JUENfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRz
ZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBl
X3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdl
biB7CitjbGFzcyBDaHJvbWVMZWdhY3lJcGM7CitlbnVtIENocm9tZUxlZ2FjeUlwY19NZXNzYWdl
Q2xhc3MgOiBpbnQ7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBw
cm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFz
cyBNZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2VudW0gQ2hyb21lTGVn
YWN5SXBjX01lc3NhZ2VDbGFzcyA6IGludCB7CisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xh
c3NfQ0xBU1NfVU5TUEVDSUZJRUQgPSAwLAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNz
X0NMQVNTX0FVVE9NQVRJT04gPSAxLAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NM
QVNTX0ZSQU1FID0gMiwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19QQUdF
ID0gMywKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19WSUVXID0gNCwKKyAg
Q2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19XSURHRVQgPSA1LAorICBDaHJvbWVM
ZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0lOUFVUID0gNiwKKyAgQ2hyb21lTGVnYWN5SXBj
X01lc3NhZ2VDbGFzc19DTEFTU19URVNUID0gNywKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VD
bGFzc19DTEFTU19XT1JLRVIgPSA4LAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NM
QVNTX05BQ0wgPSA5LAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0dQVV9D
SEFOTkVMID0gMTAsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfTUVESUEg
PSAxMSwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19QUEFQSSA9IDEyLAor
ICBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0NIUk9NRSA9IDEzLAorICBDaHJv
bWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0RSQUcgPSAxNCwKKyAgQ2hyb21lTGVnYWN5
SXBjX01lc3NhZ2VDbGFzc19DTEFTU19QUklOVCA9IDE1LAorICBDaHJvbWVMZWdhY3lJcGNfTWVz
c2FnZUNsYXNzX0NMQVNTX0VYVEVOU0lPTiA9IDE2LAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2Fn
ZUNsYXNzX0NMQVNTX1RFWFRfSU5QVVRfQ0xJRU5UID0gMTcsCisgIENocm9tZUxlZ2FjeUlwY19N
ZXNzYWdlQ2xhc3NfQ0xBU1NfQkxJTktfVEVTVCA9IDE4LAorICBDaHJvbWVMZWdhY3lJcGNfTWVz
c2FnZUNsYXNzX0NMQVNTX0FDQ0VTU0lCSUxJVFkgPSAxOSwKKyAgQ2hyb21lTGVnYWN5SXBjX01l
c3NhZ2VDbGFzc19DTEFTU19QUkVSRU5ERVIgPSAyMCwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzc19DTEFTU19DSFJPTU9USU5HID0gMjEsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdl
Q2xhc3NfQ0xBU1NfQlJPV1NFUl9QTFVHSU4gPSAyMiwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzc19DTEFTU19BTkRST0lEX1dFQl9WSUVXID0gMjMsCisgIENocm9tZUxlZ2FjeUlwY19N
ZXNzYWdlQ2xhc3NfQ0xBU1NfTkFDTF9IT1NUID0gMjQsCisgIENocm9tZUxlZ2FjeUlwY19NZXNz
YWdlQ2xhc3NfQ0xBU1NfRU5DUllQVEVEX01FRElBID0gMjUsCisgIENocm9tZUxlZ2FjeUlwY19N
ZXNzYWdlQ2xhc3NfQ0xBU1NfQ0FTVCA9IDI2LAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNs
YXNzX0NMQVNTX0dJTl9KQVZBX0JSSURHRSA9IDI3LAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2Fn
ZUNsYXNzX0NMQVNTX0NIUk9NRV9VVElMSVRZX1BSSU5USU5HID0gMjgsCisgIENocm9tZUxlZ2Fj
eUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfT1pPTkVfR1BVID0gMjksCisgIENocm9tZUxlZ2FjeUlw
Y19NZXNzYWdlQ2xhc3NfQ0xBU1NfV0VCX1RFU1QgPSAzMCwKKyAgQ2hyb21lTGVnYWN5SXBjX01l
c3NhZ2VDbGFzc19DTEFTU19ORVRXT1JLX0hJTlRTID0gMzEsCisgIENocm9tZUxlZ2FjeUlwY19N
ZXNzYWdlQ2xhc3NfQ0xBU1NfRVhURU5TSU9OU19HVUVTVF9WSUVXID0gMzIsCisgIENocm9tZUxl
Z2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfR1VFU1RfVklFVyA9IDMzLAorICBDaHJvbWVMZWdh
Y3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX01FRElBX1BMQVlFUl9ERUxFR0FURSA9IDM0LAorICBD
aHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0VYVEVOU0lPTl9XT1JLRVIgPSAzNSwK
KyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19TVUJSRVNPVVJDRV9GSUxURVIg
PSAzNiwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19VTkZSRUVaQUJMRV9G
UkFNRSA9IDM3LAorfTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENocm9tZUxlZ2FjeUlwYyA6
IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICB1c2luZyBN
ZXNzYWdlQ2xhc3MgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzOworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gQ0xBU1NfVU5TUEVDSUZJRUQgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNs
YXNzX0NMQVNTX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfQVVU
T01BVElPTiA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfQVVUT01BVElPTjsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENMQVNTX0ZSQU1FID0gQ2hyb21lTGVnYWN5SXBjX01l
c3NhZ2VDbGFzc19DTEFTU19GUkFNRTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENMQVNTX1BB
R0UgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1BBR0U7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBDTEFTU19WSUVXID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19D
TEFTU19WSUVXOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfV0lER0VUID0gQ2hyb21l
TGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19XSURHRVQ7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBDTEFTU19JTlBVVCA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfSU5Q
VVQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19URVNUID0gQ2hyb21lTGVnYWN5SXBj
X01lc3NhZ2VDbGFzc19DTEFTU19URVNUOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1Nf
V09SS0VSID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19XT1JLRVI7CisgIHN0
YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19OQUNMID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VD
bGFzc19DTEFTU19OQUNMOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfR1BVX0NIQU5O
RUwgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0dQVV9DSEFOTkVMOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfTUVESUEgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2Fn
ZUNsYXNzX0NMQVNTX01FRElBOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfUFBBUEkg
PSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1BQQVBJOworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gQ0xBU1NfQ0hST01FID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19D
TEFTU19DSFJPTUU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19EUkFHID0gQ2hyb21l
TGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19EUkFHOworICBzdGF0aWMgY29uc3RleHByIGF1
dG8gQ0xBU1NfUFJJTlQgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1BSSU5U
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfRVhURU5TSU9OID0gQ2hyb21lTGVnYWN5
SXBjX01lc3NhZ2VDbGFzc19DTEFTU19FWFRFTlNJT047CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBDTEFTU19URVhUX0lOUFVUX0NMSUVOVCA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3Nf
Q0xBU1NfVEVYVF9JTlBVVF9DTElFTlQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19C
TElOS19URVNUID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19CTElOS19URVNU
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfQUNDRVNTSUJJTElUWSA9IENocm9tZUxl
Z2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfQUNDRVNTSUJJTElUWTsKKyAgc3RhdGljIGNvbnN0
ZXhwciBhdXRvIENMQVNTX1BSRVJFTkRFUiA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3Nf
Q0xBU1NfUFJFUkVOREVSOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfQ0hST01PVElO
RyA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfQ0hST01PVElORzsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIENMQVNTX0JST1dTRVJfUExVR0lOID0gQ2hyb21lTGVnYWN5SXBj
X01lc3NhZ2VDbGFzc19DTEFTU19CUk9XU0VSX1BMVUdJTjsKKyAgc3RhdGljIGNvbnN0ZXhwciBh
dXRvIENMQVNTX0FORFJPSURfV0VCX1ZJRVcgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNz
X0NMQVNTX0FORFJPSURfV0VCX1ZJRVc7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19O
QUNMX0hPU1QgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX05BQ0xfSE9TVDsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENMQVNTX0VOQ1JZUFRFRF9NRURJQSA9IENocm9tZUxl
Z2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfRU5DUllQVEVEX01FRElBOworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gQ0xBU1NfQ0FTVCA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xB
U1NfQ0FTVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENMQVNTX0dJTl9KQVZBX0JSSURHRSA9
IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfR0lOX0pBVkFfQlJJREdFOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfQ0hST01FX1VUSUxJVFlfUFJJTlRJTkcgPSBDaHJv
bWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0NIUk9NRV9VVElMSVRZX1BSSU5USU5HOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfT1pPTkVfR1BVID0gQ2hyb21lTGVnYWN5SXBj
X01lc3NhZ2VDbGFzc19DTEFTU19PWk9ORV9HUFU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBD
TEFTU19XRUJfVEVTVCA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfV0VCX1RF
U1Q7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19ORVRXT1JLX0hJTlRTID0gQ2hyb21l
TGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19ORVRXT1JLX0hJTlRTOworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gQ0xBU1NfRVhURU5TSU9OU19HVUVTVF9WSUVXID0gQ2hyb21lTGVnYWN5SXBj
X01lc3NhZ2VDbGFzc19DTEFTU19FWFRFTlNJT05TX0dVRVNUX1ZJRVc7CisgIHN0YXRpYyBjb25z
dGV4cHIgYXV0byBDTEFTU19HVUVTVF9WSUVXID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFz
c19DTEFTU19HVUVTVF9WSUVXOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfTUVESUFf
UExBWUVSX0RFTEVHQVRFID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19NRURJ
QV9QTEFZRVJfREVMRUdBVEU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19FWFRFTlNJ
T05fV09SS0VSID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19FWFRFTlNJT05f
V09SS0VSOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0xBU1NfU1VCUkVTT1VSQ0VfRklMVEVS
ID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19TVUJSRVNPVVJDRV9GSUxURVI7
CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDTEFTU19VTkZSRUVaQUJMRV9GUkFNRSA9IENocm9t
ZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfVU5GUkVFWkFCTEVfRlJBTUU7CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBNZXNzYWdlQ2xhc3NfTUlOID0gQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzc19DTEFTU19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIE1lc3Nh
Z2VDbGFzc19NQVggPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1VORlJFRVpB
QkxFX0ZSQU1FOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga01lc3NhZ2VDbGFzc0ZpZWxk
TnVtYmVyID0gMSwKKyAgICBrTWVzc2FnZUxpbmVGaWVsZE51bWJlciA9IDIsCisgIH07CisKKyAg
Q2hyb21lTGVnYWN5SXBjKCk7CisgIH5DaHJvbWVMZWdhY3lJcGMoKSBvdmVycmlkZTsKKyAgQ2hy
b21lTGVnYWN5SXBjKENocm9tZUxlZ2FjeUlwYyYmKSBub2V4Y2VwdDsKKyAgQ2hyb21lTGVnYWN5
SXBjJiBvcGVyYXRvcj0oQ2hyb21lTGVnYWN5SXBjJiYpOworICBDaHJvbWVMZWdhY3lJcGMoY29u
c3QgQ2hyb21lTGVnYWN5SXBjJik7CisgIENocm9tZUxlZ2FjeUlwYyYgb3BlcmF0b3I9KGNvbnN0
IENocm9tZUxlZ2FjeUlwYyYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2hyb21lTGVnYWN5
SXBjJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaHJvbWVMZWdhY3lJcGMmIG90
aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19tZXNzYWdlX2NsYXNzKCkg
Y29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzcyBtZXNzYWdlX2NsYXNzKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZV9jbGFzc187IH0K
KyAgdm9pZCBzZXRfbWVzc2FnZV9jbGFzcyhDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzIHZh
bHVlKSB7IG1lc3NhZ2VfY2xhc3NfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisg
IGJvb2wgaGFzX21lc3NhZ2VfbGluZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9
CisgIHVpbnQzMl90IG1lc3NhZ2VfbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfbGluZV87
IH0KKyAgdm9pZCBzZXRfbWVzc2FnZV9saW5lKHVpbnQzMl90IHZhbHVlKSB7IG1lc3NhZ2VfbGlu
ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyBwcml2YXRlOgorICBDaHJvbWVM
ZWdhY3lJcGNfTWVzc2FnZUNsYXNzIG1lc3NhZ2VfY2xhc3Nfe307CisgIHVpbnQzMl90IG1lc3Nh
Z2VfbGluZV97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBm
aWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnBy
b3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRz
ZXQ8Mz4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX0xF
R0FDWV9JUENfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVs
ZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBE
TyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJh
Z21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAi
LVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBy
b3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfbGVnYWN5X2lwYy5nZW4uaCIK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdl
biB7CisKK0Nocm9tZUxlZ2FjeUlwYzo6Q2hyb21lTGVnYWN5SXBjKCkgPSBkZWZhdWx0OworQ2hy
b21lTGVnYWN5SXBjOjp+Q2hyb21lTGVnYWN5SXBjKCkgPSBkZWZhdWx0OworQ2hyb21lTGVnYWN5
SXBjOjpDaHJvbWVMZWdhY3lJcGMoY29uc3QgQ2hyb21lTGVnYWN5SXBjJikgPSBkZWZhdWx0Owor
Q2hyb21lTGVnYWN5SXBjJiBDaHJvbWVMZWdhY3lJcGM6Om9wZXJhdG9yPShjb25zdCBDaHJvbWVM
ZWdhY3lJcGMmKSA9IGRlZmF1bHQ7CitDaHJvbWVMZWdhY3lJcGM6OkNocm9tZUxlZ2FjeUlwYyhD
aHJvbWVMZWdhY3lJcGMmJikgbm9leGNlcHQgPSBkZWZhdWx0OworQ2hyb21lTGVnYWN5SXBjJiBD
aHJvbWVMZWdhY3lJcGM6Om9wZXJhdG9yPShDaHJvbWVMZWdhY3lJcGMmJikgPSBkZWZhdWx0Owor
Citib29sIENocm9tZUxlZ2FjeUlwYzo6b3BlcmF0b3I9PShjb25zdCBDaHJvbWVMZWdhY3lJcGMm
IG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93
bl9maWVsZHNfCisgICAmJiBtZXNzYWdlX2NsYXNzXyA9PSBvdGhlci5tZXNzYWdlX2NsYXNzXwor
ICAgJiYgbWVzc2FnZV9saW5lXyA9PSBvdGhlci5tZXNzYWdlX2xpbmVfOworfQorCitib29sIENo
cm9tZUxlZ2FjeUlwYzo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6
ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBm
YWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBm
b3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0g
ZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXpl
KCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dp
dGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogbWVzc2FnZV9jbGFzcyAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZtZXNzYWdlX2NsYXNzXyk7CisgICAgICAgIGJyZWFrOworICAgICAg
Y2FzZSAyIC8qIG1lc3NhZ2VfbGluZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZtZXNzYWdlX2xp
bmVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJp
YWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
fQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQor
CitzdGQ6OnN0cmluZyBDaHJvbWVMZWdhY3lJcGM6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qg
eworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7
CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5n
KCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENocm9tZUxlZ2FjeUlwYzo6U2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVy
bzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5T
ZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQ2hyb21lTGVnYWN5SXBjOjpTZXJpYWxpemUo
Ojpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBtZXNzYWdl
X2NsYXNzCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEs
IG1lc3NhZ2VfY2xhc3NfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IG1lc3NhZ2VfbGluZQorICBp
ZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBtZXNzYWdlX2xp
bmVfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18u
ZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJh
Z21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTog
Z2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfcHJvY2Vzc19kZXNj
cmlwdG9yLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rv
cy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfcHJvY2Vzc19kZXNjcmlwdG9yLmdl
bi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1
Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tf
RVZFTlRfQ0hST01FX1BST0NFU1NfREVTQ1JJUFRPUl9QUk9UT19DUFBfSF8KKyNkZWZpbmUgUEVS
RkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfUFJP
Q0VTU19ERVNDUklQVE9SX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5j
bHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5j
bHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
ZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25h
bWVzcGFjZSBnZW4geworY2xhc3MgQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3I7CitlbnVtIENocm9t
ZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlIDogaW50OworfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25h
bWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90
b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNw
YWNlIGdlbiB7CitlbnVtIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlIDogaW50
IHsKKyAgQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19VTlNQRUNJ
RklFRCA9IDAsCisgIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NFU1Nf
QlJPV1NFUiA9IDEsCisgIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NF
U1NfUkVOREVSRVIgPSAyLAorICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9Q
Uk9DRVNTX1VUSUxJVFkgPSAzLAorICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlw
ZV9QUk9DRVNTX1pZR09URSA9IDQsCisgIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NU
eXBlX1BST0NFU1NfU0FOREJPWF9IRUxQRVIgPSA1LAorICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRv
cl9Qcm9jZXNzVHlwZV9QUk9DRVNTX0dQVSA9IDYsCisgIENocm9tZVByb2Nlc3NEZXNjcmlwdG9y
X1Byb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfUExVR0lOID0gNywKKyAgQ2hyb21lUHJvY2Vzc0Rl
c2NyaXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19QUEFQSV9CUk9LRVIgPSA4LAorfTsKKworY2xh
c3MgUEVSRkVUVE9fRVhQT1JUIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yIDogcHVibGljIDo6cHJv
dG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIFByb2Nlc3NUeXBlID0g
Q2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vzc1R5cGU7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBQUk9DRVNTX1VOU1BFQ0lGSUVEID0gQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vz
c1R5cGVfUFJPQ0VTU19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFBST0NF
U1NfQlJPV1NFUiA9IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NFU1Nf
QlJPV1NFUjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFBST0NFU1NfUkVOREVSRVIgPSBDaHJv
bWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNTX1JFTkRFUkVSOworICBzdGF0
aWMgY29uc3RleHByIGF1dG8gUFJPQ0VTU19VVElMSVRZID0gQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0
b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19VVElMSVRZOworICBzdGF0aWMgY29uc3RleHByIGF1dG8g
UFJPQ0VTU19aWUdPVEUgPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9D
RVNTX1pZR09URTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFBST0NFU1NfU0FOREJPWF9IRUxQ
RVIgPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNTX1NBTkRCT1hf
SEVMUEVSOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gUFJPQ0VTU19HUFUgPSBDaHJvbWVQcm9j
ZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNTX0dQVTsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIFBST0NFU1NfUFBBUElfUExVR0lOID0gQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJv
Y2Vzc1R5cGVfUFJPQ0VTU19QUEFQSV9QTFVHSU47CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBQ
Uk9DRVNTX1BQQVBJX0JST0tFUiA9IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBl
X1BST0NFU1NfUFBBUElfQlJPS0VSOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gUHJvY2Vzc1R5
cGVfTUlOID0gQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19VTlNQ
RUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFByb2Nlc3NUeXBlX01BWCA9IENocm9t
ZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfQlJPS0VSOworICBl
bnVtIEZpZWxkTnVtYmVycyB7CisgICAga1Byb2Nlc3NUeXBlRmllbGROdW1iZXIgPSAxLAorICAg
IGtQcm9jZXNzUHJpb3JpdHlGaWVsZE51bWJlciA9IDIsCisgICAga0xlZ2FjeVNvcnRJbmRleEZp
ZWxkTnVtYmVyID0gMywKKyAgfTsKKworICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcigpOworICB+
Q2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3IoKSBvdmVycmlkZTsKKyAgQ2hyb21lUHJvY2Vzc0Rlc2Ny
aXB0b3IoQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3ImJikgbm9leGNlcHQ7CisgIENocm9tZVByb2Nl
c3NEZXNjcmlwdG9yJiBvcGVyYXRvcj0oQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3ImJik7CisgIENo
cm9tZVByb2Nlc3NEZXNjcmlwdG9yKGNvbnN0IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yJik7Cisg
IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yJiBvcGVyYXRvcj0oY29uc3QgQ2hyb21lUHJvY2Vzc0Rl
c2NyaXB0b3ImKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENocm9tZVByb2Nlc3NEZXNjcmlw
dG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaHJvbWVQcm9jZXNzRGVzY3Jp
cHRvciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9v
bCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpz
dHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8
dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlh
bGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3Byb2Nlc3Nf
dHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIENocm9tZVByb2Nlc3NE
ZXNjcmlwdG9yX1Byb2Nlc3NUeXBlIHByb2Nlc3NfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHByb2Nl
c3NfdHlwZV87IH0KKyAgdm9pZCBzZXRfcHJvY2Vzc190eXBlKENocm9tZVByb2Nlc3NEZXNjcmlw
dG9yX1Byb2Nlc3NUeXBlIHZhbHVlKSB7IHByb2Nlc3NfdHlwZV8gPSB2YWx1ZTsgX2hhc19maWVs
ZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfcHJvY2Vzc19wcmlvcml0eSgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGludDMyX3QgcHJvY2Vzc19wcmlvcml0eSgpIGNvbnN0
IHsgcmV0dXJuIHByb2Nlc3NfcHJpb3JpdHlfOyB9CisgIHZvaWQgc2V0X3Byb2Nlc3NfcHJpb3Jp
dHkoaW50MzJfdCB2YWx1ZSkgeyBwcm9jZXNzX3ByaW9yaXR5XyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoMik7IH0KKworICBib29sIGhhc19sZWdhY3lfc29ydF9pbmRleCgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGludDMyX3QgbGVnYWN5X3NvcnRfaW5kZXgoKSBjb25z
dCB7IHJldHVybiBsZWdhY3lfc29ydF9pbmRleF87IH0KKyAgdm9pZCBzZXRfbGVnYWN5X3NvcnRf
aW5kZXgoaW50MzJfdCB2YWx1ZSkgeyBsZWdhY3lfc29ydF9pbmRleF8gPSB2YWx1ZTsgX2hhc19m
aWVsZF8uc2V0KDMpOyB9CisKKyBwcml2YXRlOgorICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Q
cm9jZXNzVHlwZSBwcm9jZXNzX3R5cGVfe307CisgIGludDMyX3QgcHJvY2Vzc19wcmlvcml0eV97
fTsKKyAgaW50MzJfdCBsZWdhY3lfc29ydF9pbmRleF97fTsKKworICAvLyBBbGxvd3MgdG8gcHJl
c2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0
aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3du
X2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8ND4gX2hhc19maWVsZF97fTsKK307CisKK30gIC8v
IG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNw
YWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJB
Q0VfVFJBQ0tfRVZFTlRfQ0hST01FX1BST0NFU1NfREVTQ1JJUFRPUl9QUk9UT19DUFBfSF8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9t
ZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVk
IGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAor
I3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNr
X2V2ZW50L2Nocm9tZV9wcm9jZXNzX2Rlc2NyaXB0b3IuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitDaHJvbWVQcm9j
ZXNzRGVzY3JpcHRvcjo6Q2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CitDaHJv
bWVQcm9jZXNzRGVzY3JpcHRvcjo6fkNocm9tZVByb2Nlc3NEZXNjcmlwdG9yKCkgPSBkZWZhdWx0
OworQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3I6OkNocm9tZVByb2Nlc3NEZXNjcmlwdG9yKGNvbnN0
IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yJikgPSBkZWZhdWx0OworQ2hyb21lUHJvY2Vzc0Rlc2Ny
aXB0b3ImIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yOjpvcGVyYXRvcj0oY29uc3QgQ2hyb21lUHJv
Y2Vzc0Rlc2NyaXB0b3ImKSA9IGRlZmF1bHQ7CitDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcjo6Q2hy
b21lUHJvY2Vzc0Rlc2NyaXB0b3IoQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3ImJikgbm9leGNlcHQg
PSBkZWZhdWx0OworQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3ImIENocm9tZVByb2Nlc3NEZXNjcmlw
dG9yOjpvcGVyYXRvcj0oQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3ImJikgPSBkZWZhdWx0OworCiti
b29sIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yOjpvcGVyYXRvcj09KGNvbnN0IENocm9tZVByb2Nl
c3NEZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09
IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgcHJvY2Vzc190eXBlXyA9PSBvdGhlci5wcm9j
ZXNzX3R5cGVfCisgICAmJiBwcm9jZXNzX3ByaW9yaXR5XyA9PSBvdGhlci5wcm9jZXNzX3ByaW9y
aXR5XworICAgJiYgbGVnYWN5X3NvcnRfaW5kZXhfID09IG90aGVyLmxlZ2FjeV9zb3J0X2luZGV4
XzsKK30KKworYm9vbCBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcjo6UGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsK
KyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNv
ZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7
IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxk
LmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVs
ZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEg
LyogcHJvY2Vzc190eXBlICovOgorICAgICAgICBmaWVsZC5nZXQoJnByb2Nlc3NfdHlwZV8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBwcm9jZXNzX3ByaW9yaXR5ICovOgorICAg
ICAgICBmaWVsZC5nZXQoJnByb2Nlc3NfcHJpb3JpdHlfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDMgLyogbGVnYWN5X3NvcnRfaW5kZXggKi86CisgICAgICAgIGZpZWxkLmdldCgmbGVn
YWN5X3NvcnRfaW5kZXhfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAg
ICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNf
bGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcjo6U2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90
b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBt
c2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ2hyb21l
UHJvY2Vzc0Rlc2NyaXB0b3I6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96
ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXpl
KG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lk
IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2Uq
IG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBwcm9jZXNzX3R5cGUKKyAgaWYgKF9oYXNfZmll
bGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgcHJvY2Vzc190eXBlXyk7CisgIH0K
KworICAvLyBGaWVsZCAyOiBwcm9jZXNzX3ByaW9yaXR5CisgIGlmIChfaGFzX2ZpZWxkX1syXSkg
eworICAgIG1zZy0+QXBwZW5kVmFySW50KDIsIHByb2Nlc3NfcHJpb3JpdHlfKTsKKyAgfQorCisg
IC8vIEZpZWxkIDM6IGxlZ2FjeV9zb3J0X2luZGV4CisgIGlmIChfaGFzX2ZpZWxkX1szXSkgewor
ICAgIG1zZy0+QXBwZW5kVmFySW50KDMsIGxlZ2FjeV9zb3J0X2luZGV4Xyk7CisgIH0KKworICBt
c2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9m
aWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFt
ZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3Rp
YyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0
dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX3RocmVhZF9kZXNjcmlwdG9yLmdlbi5jYworLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90
cmFja19ldmVudC9jaHJvbWVfdGhyZWFkX2Rlc2NyaXB0b3IuZ2VuLmgKKy8vIERPIE5PVCBFRElU
LiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVU
VE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfVEhSRUFE
X0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX1RIUkVBRF9ERVNDUklQVE9SX1BST1RP
X0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1
ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3Mg
Q2hyb21lVGhyZWFkRGVzY3JpcHRvcjsKK2VudW0gQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJl
YWRUeXBlIDogaW50OworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2Ug
cHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xh
c3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitlbnVtIENocm9tZVRo
cmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZSA6IGludCB7CisgIENocm9tZVRocmVhZERlc2NyaXB0
b3JfVGhyZWFkVHlwZV9USFJFQURfVU5TUEVDSUZJRUQgPSAwLAorICBDaHJvbWVUaHJlYWREZXNj
cmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX01BSU4gPSAxLAorICBDaHJvbWVUaHJlYWREZXNjcmlw
dG9yX1RocmVhZFR5cGVfVEhSRUFEX0lPID0gMiwKKyAgQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9U
aHJlYWRUeXBlX1RIUkVBRF9QT09MX0JHX1dPUktFUiA9IDMsCisgIENocm9tZVRocmVhZERlc2Ny
aXB0b3JfVGhyZWFkVHlwZV9USFJFQURfUE9PTF9GR19XT1JLRVIgPSA0LAorICBDaHJvbWVUaHJl
YWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfQkdfQkxPQ0tJTkcgPSA2LAorICBD
aHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfRkdfQkxPQ0tJTkcg
PSA1LAorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfU0VS
VklDRSA9IDcsCisgIENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURfQ09N
UE9TSVRPUiA9IDgsCisgIENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURf
VklaX0NPTVBPU0lUT1IgPSA5LAorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVf
VEhSRUFEX0NPTVBPU0lUT1JfV09SS0VSID0gMTAsCisgIENocm9tZVRocmVhZERlc2NyaXB0b3Jf
VGhyZWFkVHlwZV9USFJFQURfU0VSVklDRV9XT1JLRVIgPSAxMSwKKyAgQ2hyb21lVGhyZWFkRGVz
Y3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9NRU1PUllfSU5GUkEgPSA1MCwKKyAgQ2hyb21lVGhy
ZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9TQU1QTElOR19QUk9GSUxFUiA9IDUxLAor
fTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENocm9tZVRocmVhZERlc2NyaXB0b3IgOiBwdWJs
aWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgVGhyZWFk
VHlwZSA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZTsKKyAgc3RhdGljIGNvbnN0
ZXhwciBhdXRvIFRIUkVBRF9VTlNQRUNJRklFRCA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhy
ZWFkVHlwZV9USFJFQURfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUSFJF
QURfTUFJTiA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURfTUFJTjsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRIUkVBRF9JTyA9IENocm9tZVRocmVhZERlc2NyaXB0
b3JfVGhyZWFkVHlwZV9USFJFQURfSU87CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUSFJFQURf
UE9PTF9CR19XT1JLRVIgPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFE
X1BPT0xfQkdfV09SS0VSOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVEhSRUFEX1BPT0xfRkdf
V09SS0VSID0gQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9QT09MX0ZH
X1dPUktFUjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRIUkVBRF9QT09MX0JHX0JMT0NLSU5H
ID0gQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9QT09MX0JHX0JMT0NL
SU5HOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVEhSRUFEX1BPT0xfRkdfQkxPQ0tJTkcgPSBD
aHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfRkdfQkxPQ0tJTkc7
CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUSFJFQURfUE9PTF9TRVJWSUNFID0gQ2hyb21lVGhy
ZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9QT09MX1NFUlZJQ0U7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBUSFJFQURfQ09NUE9TSVRPUiA9IENocm9tZVRocmVhZERlc2NyaXB0b3Jf
VGhyZWFkVHlwZV9USFJFQURfQ09NUE9TSVRPUjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRI
UkVBRF9WSVpfQ09NUE9TSVRPUiA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9U
SFJFQURfVklaX0NPTVBPU0lUT1I7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUSFJFQURfQ09N
UE9TSVRPUl9XT1JLRVIgPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFE
X0NPTVBPU0lUT1JfV09SS0VSOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVEhSRUFEX1NFUlZJ
Q0VfV09SS0VSID0gQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9TRVJW
SUNFX1dPUktFUjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRIUkVBRF9NRU1PUllfSU5GUkEg
PSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX01FTU9SWV9JTkZSQTsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRIUkVBRF9TQU1QTElOR19QUk9GSUxFUiA9IENocm9t
ZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURfU0FNUExJTkdfUFJPRklMRVI7Cisg
IHN0YXRpYyBjb25zdGV4cHIgYXV0byBUaHJlYWRUeXBlX01JTiA9IENocm9tZVRocmVhZERlc2Ny
aXB0b3JfVGhyZWFkVHlwZV9USFJFQURfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBUaHJlYWRUeXBlX01BWCA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9U
SFJFQURfU0FNUExJTkdfUFJPRklMRVI7CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrVGhy
ZWFkVHlwZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrTGVnYWN5U29ydEluZGV4RmllbGROdW1iZXIg
PSAyLAorICB9OworCisgIENocm9tZVRocmVhZERlc2NyaXB0b3IoKTsKKyAgfkNocm9tZVRocmVh
ZERlc2NyaXB0b3IoKSBvdmVycmlkZTsKKyAgQ2hyb21lVGhyZWFkRGVzY3JpcHRvcihDaHJvbWVU
aHJlYWREZXNjcmlwdG9yJiYpIG5vZXhjZXB0OworICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yJiBv
cGVyYXRvcj0oQ2hyb21lVGhyZWFkRGVzY3JpcHRvciYmKTsKKyAgQ2hyb21lVGhyZWFkRGVzY3Jp
cHRvcihjb25zdCBDaHJvbWVUaHJlYWREZXNjcmlwdG9yJik7CisgIENocm9tZVRocmVhZERlc2Ny
aXB0b3ImIG9wZXJhdG9yPShjb25zdCBDaHJvbWVUaHJlYWREZXNjcmlwdG9yJik7CisgIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBDaHJvbWVUaHJlYWREZXNjcmlwdG9yJikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBDaHJvbWVUaHJlYWREZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmlu
ZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNz
YWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfdGhyZWFkX3R5cGUoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1sxXTsgfQorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGUgdGhy
ZWFkX3R5cGUoKSBjb25zdCB7IHJldHVybiB0aHJlYWRfdHlwZV87IH0KKyAgdm9pZCBzZXRfdGhy
ZWFkX3R5cGUoQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlIHZhbHVlKSB7IHRocmVh
ZF90eXBlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19sZWdh
Y3lfc29ydF9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGludDMy
X3QgbGVnYWN5X3NvcnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiBsZWdhY3lfc29ydF9pbmRleF87
IH0KKyAgdm9pZCBzZXRfbGVnYWN5X3NvcnRfaW5kZXgoaW50MzJfdCB2YWx1ZSkgeyBsZWdhY3lf
c29ydF9pbmRleF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyBwcml2YXRlOgor
ICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGUgdGhyZWFkX3R5cGVfe307CisgIGlu
dDMyX3QgbGVnYWN5X3NvcnRfaW5kZXhfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVu
a25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJl
IHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNf
OworCisgIHN0ZDo6Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3Bh
Y2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4K
KworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNL
X0VWRU5UX0NIUk9NRV9USFJFQURfREVTQ1JJUFRPUl9QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVy
ZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZl
dHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBH
Q0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2No
cm9tZV90aHJlYWRfZGVzY3JpcHRvci5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25h
bWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK0Nocm9tZVRocmVhZERlc2NyaXB0
b3I6OkNocm9tZVRocmVhZERlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CitDaHJvbWVUaHJlYWREZXNj
cmlwdG9yOjp+Q2hyb21lVGhyZWFkRGVzY3JpcHRvcigpID0gZGVmYXVsdDsKK0Nocm9tZVRocmVh
ZERlc2NyaXB0b3I6OkNocm9tZVRocmVhZERlc2NyaXB0b3IoY29uc3QgQ2hyb21lVGhyZWFkRGVz
Y3JpcHRvciYpID0gZGVmYXVsdDsKK0Nocm9tZVRocmVhZERlc2NyaXB0b3ImIENocm9tZVRocmVh
ZERlc2NyaXB0b3I6Om9wZXJhdG9yPShjb25zdCBDaHJvbWVUaHJlYWREZXNjcmlwdG9yJikgPSBk
ZWZhdWx0OworQ2hyb21lVGhyZWFkRGVzY3JpcHRvcjo6Q2hyb21lVGhyZWFkRGVzY3JpcHRvcihD
aHJvbWVUaHJlYWREZXNjcmlwdG9yJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0Nocm9tZVRocmVh
ZERlc2NyaXB0b3ImIENocm9tZVRocmVhZERlc2NyaXB0b3I6Om9wZXJhdG9yPShDaHJvbWVUaHJl
YWREZXNjcmlwdG9yJiYpID0gZGVmYXVsdDsKKworYm9vbCBDaHJvbWVUaHJlYWREZXNjcmlwdG9y
OjpvcGVyYXRvcj09KGNvbnN0IENocm9tZVRocmVhZERlc2NyaXB0b3ImIG90aGVyKSBjb25zdCB7
CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAm
JiB0aHJlYWRfdHlwZV8gPT0gb3RoZXIudGhyZWFkX3R5cGVfCisgICAmJiBsZWdhY3lfc29ydF9p
bmRleF8gPT0gb3RoZXIubGVnYWN5X3NvcnRfaW5kZXhfOworfQorCitib29sIENocm9tZVRocmVh
ZERlc2NyaXB0b3I6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUp
IHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFs
c2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9y
IChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRl
Yy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgp
KSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRj
aCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHRocmVhZF90eXBlICovOgorICAgICAg
ICBmaWVsZC5nZXQoJnRocmVhZF90eXBlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAy
IC8qIGxlZ2FjeV9zb3J0X2luZGV4ICovOgorICAgICAgICBmaWVsZC5nZXQoJmxlZ2FjeV9zb3J0
X2luZGV4Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQu
U2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsK
K30KKworc3RkOjpzdHJpbmcgQ2hyb21lVGhyZWFkRGVzY3JpcHRvcjo6U2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ2hyb21lVGhyZWFkRGVz
Y3JpcHRvcjo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBC
dWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgp
KTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQ2hyb21lVGhy
ZWFkRGVzY3JpcHRvcjo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0
IHsKKyAgLy8gRmllbGQgMTogdGhyZWFkX3R5cGUKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgdGhyZWFkX3R5cGVfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDI6IGxlZ2FjeV9zb3J0X2luZGV4CisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+
QXBwZW5kVmFySW50KDIsIGxlZ2FjeV9zb3J0X2luZGV4Xyk7CisgIH0KKworICBtc2ctPkFwcGVu
ZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNp
emUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHBy
b3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2Uv
dHJhY2tfZXZlbnQvY2hyb21lX3VzZXJfZXZlbnQuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9t
ZV91c2VyX2V2ZW50Lmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJm
ZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX1VTRVJfRVZFTlRfUFJPVE9fQ1BQX0hfCisjZGVm
aW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hS
T01FX1VTRVJfRVZFTlRfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNs
dWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNs
dWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9l
eHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFt
ZXNwYWNlIGdlbiB7CitjbGFzcyBDaHJvbWVVc2VyRXZlbnQ7Cit9ICAvLyBuYW1lc3BhY2UgcGVy
ZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFt
ZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3Rv
emVybworCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3Bh
Y2UgZ2VuIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENocm9tZVVzZXJFdmVudCA6IHB1Ymxp
YyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVt
YmVycyB7CisgICAga0FjdGlvbkZpZWxkTnVtYmVyID0gMSwKKyAgICBrQWN0aW9uSGFzaEZpZWxk
TnVtYmVyID0gMiwKKyAgfTsKKworICBDaHJvbWVVc2VyRXZlbnQoKTsKKyAgfkNocm9tZVVzZXJF
dmVudCgpIG92ZXJyaWRlOworICBDaHJvbWVVc2VyRXZlbnQoQ2hyb21lVXNlckV2ZW50JiYpIG5v
ZXhjZXB0OworICBDaHJvbWVVc2VyRXZlbnQmIG9wZXJhdG9yPShDaHJvbWVVc2VyRXZlbnQmJik7
CisgIENocm9tZVVzZXJFdmVudChjb25zdCBDaHJvbWVVc2VyRXZlbnQmKTsKKyAgQ2hyb21lVXNl
ckV2ZW50JiBvcGVyYXRvcj0oY29uc3QgQ2hyb21lVXNlckV2ZW50Jik7CisgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBDaHJvbWVVc2VyRXZlbnQmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNv
bnN0IENocm9tZVVzZXJFdmVudCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVy
cmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsK
KyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRl
OworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJv
b2wgaGFzX2FjdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIGNvbnN0
IHN0ZDo6c3RyaW5nJiBhY3Rpb24oKSBjb25zdCB7IHJldHVybiBhY3Rpb25fOyB9CisgIHZvaWQg
c2V0X2FjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgYWN0aW9uXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19hY3Rpb25faGFzaCgpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIHVpbnQ2NF90IGFjdGlvbl9oYXNoKCkgY29uc3Qg
eyByZXR1cm4gYWN0aW9uX2hhc2hfOyB9CisgIHZvaWQgc2V0X2FjdGlvbl9oYXNoKHVpbnQ2NF90
IHZhbHVlKSB7IGFjdGlvbl9oYXNoXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKwor
IHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGFjdGlvbl97fTsKKyAgdWludDY0X3QgYWN0aW9uX2hh
c2hfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRz
IGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBm
aWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDM+
IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5h
bWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0NIUk9NRV9VU0VSX0VW
RU5UX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9U
IEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBH
Q0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxv
YXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3Mv
cGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY2hyb21lX3VzZXJfZXZlbnQuZ2VuLmgiCisKK25h
bWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4gewor
CitDaHJvbWVVc2VyRXZlbnQ6OkNocm9tZVVzZXJFdmVudCgpID0gZGVmYXVsdDsKK0Nocm9tZVVz
ZXJFdmVudDo6fkNocm9tZVVzZXJFdmVudCgpID0gZGVmYXVsdDsKK0Nocm9tZVVzZXJFdmVudDo6
Q2hyb21lVXNlckV2ZW50KGNvbnN0IENocm9tZVVzZXJFdmVudCYpID0gZGVmYXVsdDsKK0Nocm9t
ZVVzZXJFdmVudCYgQ2hyb21lVXNlckV2ZW50OjpvcGVyYXRvcj0oY29uc3QgQ2hyb21lVXNlckV2
ZW50JikgPSBkZWZhdWx0OworQ2hyb21lVXNlckV2ZW50OjpDaHJvbWVVc2VyRXZlbnQoQ2hyb21l
VXNlckV2ZW50JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0Nocm9tZVVzZXJFdmVudCYgQ2hyb21l
VXNlckV2ZW50OjpvcGVyYXRvcj0oQ2hyb21lVXNlckV2ZW50JiYpID0gZGVmYXVsdDsKKworYm9v
bCBDaHJvbWVVc2VyRXZlbnQ6Om9wZXJhdG9yPT0oY29uc3QgQ2hyb21lVXNlckV2ZW50JiBvdGhl
cikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmll
bGRzXworICAgJiYgYWN0aW9uXyA9PSBvdGhlci5hY3Rpb25fCisgICAmJiBhY3Rpb25faGFzaF8g
PT0gb3RoZXIuYWN0aW9uX2hhc2hfOworfQorCitib29sIENocm9tZVVzZXJFdmVudDo6UGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxk
c18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVy
bzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMu
UmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7Cisg
ICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmll
bGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7Cisg
ICAgICBjYXNlIDEgLyogYWN0aW9uICovOgorICAgICAgICBmaWVsZC5nZXQoJmFjdGlvbl8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBhY3Rpb25faGFzaCAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZhY3Rpb25faGFzaF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6
CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOwor
ICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRl
Yy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIENocm9tZVVzZXJFdmVudDo6U2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90
b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBt
c2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ2hyb21l
VXNlckV2ZW50OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVh
cEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0
KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBDaHJvbWVV
c2VyRXZlbnQ6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7Cisg
IC8vIEZpZWxkIDE6IGFjdGlvbgorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFw
cGVuZFN0cmluZygxLCBhY3Rpb25fKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGFjdGlvbl9oYXNo
CisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDIsIGFjdGlv
bl9oYXNoXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVs
ZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgor
I3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvY291bnRlcl9kZXNjcmlw
dG9yLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jb3VudGVyX2Rlc2NyaXB0b3IuZ2VuLmgKKy8vIERP
IE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5k
ZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DT1VO
VEVSX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9U
T1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ09VTlRFUl9ERVNDUklQVE9SX1BST1RPX0NQ
UF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUg
PHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9j
cHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgQ291
bnRlckRlc2NyaXB0b3I7CitlbnVtIENvdW50ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3VudGVyVHlw
ZSA6IGludDsKK2VudW0gQ291bnRlckRlc2NyaXB0b3JfVW5pdCA6IGludDsKK30gIC8vIG5hbWVz
cGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdl
bgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsK
K25hbWVzcGFjZSBnZW4geworZW51bSBDb3VudGVyRGVzY3JpcHRvcl9CdWlsdGluQ291bnRlclR5
cGUgOiBpbnQgeworICBDb3VudGVyRGVzY3JpcHRvcl9CdWlsdGluQ291bnRlclR5cGVfQ09VTlRF
Ul9VTlNQRUNJRklFRCA9IDAsCisgIENvdW50ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3VudGVyVHlw
ZV9DT1VOVEVSX1RIUkVBRF9USU1FX05TID0gMSwKKyAgQ291bnRlckRlc2NyaXB0b3JfQnVpbHRp
bkNvdW50ZXJUeXBlX0NPVU5URVJfVEhSRUFEX0lOU1RSVUNUSU9OX0NPVU5UID0gMiwKK307Citl
bnVtIENvdW50ZXJEZXNjcmlwdG9yX1VuaXQgOiBpbnQgeworICBDb3VudGVyRGVzY3JpcHRvcl9V
bml0X1VOSVRfVU5TUEVDSUZJRUQgPSAwLAorICBDb3VudGVyRGVzY3JpcHRvcl9Vbml0X1VOSVRf
VElNRV9OUyA9IDEsCisgIENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9DT1VOVCA9IDIsCisg
IENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9TSVpFX0JZVEVTID0gMywKK307CisKK2NsYXNz
IFBFUkZFVFRPX0VYUE9SVCBDb3VudGVyRGVzY3JpcHRvciA6IHB1YmxpYyA6OnByb3RvemVybzo6
Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICB1c2luZyBCdWlsdGluQ291bnRlclR5cGUgPSBD
b3VudGVyRGVzY3JpcHRvcl9CdWlsdGluQ291bnRlclR5cGU7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBDT1VOVEVSX1VOU1BFQ0lGSUVEID0gQ291bnRlckRlc2NyaXB0b3JfQnVpbHRpbkNvdW50
ZXJUeXBlX0NPVU5URVJfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDT1VO
VEVSX1RIUkVBRF9USU1FX05TID0gQ291bnRlckRlc2NyaXB0b3JfQnVpbHRpbkNvdW50ZXJUeXBl
X0NPVU5URVJfVEhSRUFEX1RJTUVfTlM7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDT1VOVEVS
X1RIUkVBRF9JTlNUUlVDVElPTl9DT1VOVCA9IENvdW50ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3Vu
dGVyVHlwZV9DT1VOVEVSX1RIUkVBRF9JTlNUUlVDVElPTl9DT1VOVDsKKyAgc3RhdGljIGNvbnN0
ZXhwciBhdXRvIEJ1aWx0aW5Db3VudGVyVHlwZV9NSU4gPSBDb3VudGVyRGVzY3JpcHRvcl9CdWls
dGluQ291bnRlclR5cGVfQ09VTlRFUl9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBh
dXRvIEJ1aWx0aW5Db3VudGVyVHlwZV9NQVggPSBDb3VudGVyRGVzY3JpcHRvcl9CdWlsdGluQ291
bnRlclR5cGVfQ09VTlRFUl9USFJFQURfSU5TVFJVQ1RJT05fQ09VTlQ7CisgIHVzaW5nIFVuaXQg
PSBDb3VudGVyRGVzY3JpcHRvcl9Vbml0OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVU5JVF9V
TlNQRUNJRklFRCA9IENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9VTlNQRUNJRklFRDsKKyAg
c3RhdGljIGNvbnN0ZXhwciBhdXRvIFVOSVRfVElNRV9OUyA9IENvdW50ZXJEZXNjcmlwdG9yX1Vu
aXRfVU5JVF9USU1FX05TOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVU5JVF9DT1VOVCA9IENv
dW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9DT1VOVDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRv
IFVOSVRfU0laRV9CWVRFUyA9IENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9TSVpFX0JZVEVT
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVW5pdF9NSU4gPSBDb3VudGVyRGVzY3JpcHRvcl9V
bml0X1VOSVRfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBVbml0X01BWCA9
IENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9TSVpFX0JZVEVTOworICBlbnVtIEZpZWxkTnVt
YmVycyB7CisgICAga1R5cGVGaWVsZE51bWJlciA9IDEsCisgICAga0NhdGVnb3JpZXNGaWVsZE51
bWJlciA9IDIsCisgICAga1VuaXRGaWVsZE51bWJlciA9IDMsCisgICAga1VuaXRNdWx0aXBsaWVy
RmllbGROdW1iZXIgPSA0LAorICAgIGtJc0luY3JlbWVudGFsRmllbGROdW1iZXIgPSA1LAorICB9
OworCisgIENvdW50ZXJEZXNjcmlwdG9yKCk7CisgIH5Db3VudGVyRGVzY3JpcHRvcigpIG92ZXJy
aWRlOworICBDb3VudGVyRGVzY3JpcHRvcihDb3VudGVyRGVzY3JpcHRvciYmKSBub2V4Y2VwdDsK
KyAgQ291bnRlckRlc2NyaXB0b3ImIG9wZXJhdG9yPShDb3VudGVyRGVzY3JpcHRvciYmKTsKKyAg
Q291bnRlckRlc2NyaXB0b3IoY29uc3QgQ291bnRlckRlc2NyaXB0b3ImKTsKKyAgQ291bnRlckRl
c2NyaXB0b3ImIG9wZXJhdG9yPShjb25zdCBDb3VudGVyRGVzY3JpcHRvciYpOworICBib29sIG9w
ZXJhdG9yPT0oY29uc3QgQ291bnRlckRlc2NyaXB0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IENvdW50ZXJEZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhp
cyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXpl
X3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92
ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qg
b3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7
CisKKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9Cisg
IENvdW50ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3VudGVyVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1
cm4gdHlwZV87IH0KKyAgdm9pZCBzZXRfdHlwZShDb3VudGVyRGVzY3JpcHRvcl9CdWlsdGluQ291
bnRlclR5cGUgdmFsdWUpIHsgdHlwZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisK
KyAgaW50IGNhdGVnb3JpZXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4o
Y2F0ZWdvcmllc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4m
IGNhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBjYXRlZ29yaWVzXzsgfQorICBzdGQ6OnZlY3Rv
cjxzdGQ6OnN0cmluZz4qIG11dGFibGVfY2F0ZWdvcmllcygpIHsgcmV0dXJuICZjYXRlZ29yaWVz
XzsgfQorICB2b2lkIGNsZWFyX2NhdGVnb3JpZXMoKSB7IGNhdGVnb3JpZXNfLmNsZWFyKCk7IH0K
KyAgdm9pZCBhZGRfY2F0ZWdvcmllcyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBjYXRlZ29yaWVzXy5l
bXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRfY2F0ZWdvcmllcygpIHsg
Y2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmY2F0ZWdvcmllc18uYmFjaygpOyB9
CisKKyAgYm9vbCBoYXNfdW5pdCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9Cisg
IENvdW50ZXJEZXNjcmlwdG9yX1VuaXQgdW5pdCgpIGNvbnN0IHsgcmV0dXJuIHVuaXRfOyB9Cisg
IHZvaWQgc2V0X3VuaXQoQ291bnRlckRlc2NyaXB0b3JfVW5pdCB2YWx1ZSkgeyB1bml0XyA9IHZh
bHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29sIGhhc191bml0X211bHRpcGxpZXIo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICBpbnQ2NF90IHVuaXRfbXVsdGlw
bGllcigpIGNvbnN0IHsgcmV0dXJuIHVuaXRfbXVsdGlwbGllcl87IH0KKyAgdm9pZCBzZXRfdW5p
dF9tdWx0aXBsaWVyKGludDY0X3QgdmFsdWUpIHsgdW5pdF9tdWx0aXBsaWVyXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoNCk7IH0KKworICBib29sIGhhc19pc19pbmNyZW1lbnRhbCgpIGNvbnN0
IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGJvb2wgaXNfaW5jcmVtZW50YWwoKSBjb25z
dCB7IHJldHVybiBpc19pbmNyZW1lbnRhbF87IH0KKyAgdm9pZCBzZXRfaXNfaW5jcmVtZW50YWwo
Ym9vbCB2YWx1ZSkgeyBpc19pbmNyZW1lbnRhbF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDUp
OyB9CisKKyBwcml2YXRlOgorICBDb3VudGVyRGVzY3JpcHRvcl9CdWlsdGluQ291bnRlclR5cGUg
dHlwZV97fTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNhdGVnb3JpZXNfOworICBDb3Vu
dGVyRGVzY3JpcHRvcl9Vbml0IHVuaXRfe307CisgIGludDY0X3QgdW5pdF9tdWx0aXBsaWVyX3t9
OworICBib29sIGlzX2luY3JlbWVudGFsX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1
bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVy
ZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRz
XzsKKworICBzdGQ6OmJpdHNldDw2PiBfaGFzX2ZpZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNw
YWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2Vu
CisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFD
S19FVkVOVF9DT1VOVEVSX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Bh
Y2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hl
YXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBj
cHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRp
YWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jb3VudGVy
X2Rlc2NyaXB0b3IuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJv
dG9zIHsKK25hbWVzcGFjZSBnZW4geworCitDb3VudGVyRGVzY3JpcHRvcjo6Q291bnRlckRlc2Ny
aXB0b3IoKSA9IGRlZmF1bHQ7CitDb3VudGVyRGVzY3JpcHRvcjo6fkNvdW50ZXJEZXNjcmlwdG9y
KCkgPSBkZWZhdWx0OworQ291bnRlckRlc2NyaXB0b3I6OkNvdW50ZXJEZXNjcmlwdG9yKGNvbnN0
IENvdW50ZXJEZXNjcmlwdG9yJikgPSBkZWZhdWx0OworQ291bnRlckRlc2NyaXB0b3ImIENvdW50
ZXJEZXNjcmlwdG9yOjpvcGVyYXRvcj0oY29uc3QgQ291bnRlckRlc2NyaXB0b3ImKSA9IGRlZmF1
bHQ7CitDb3VudGVyRGVzY3JpcHRvcjo6Q291bnRlckRlc2NyaXB0b3IoQ291bnRlckRlc2NyaXB0
b3ImJikgbm9leGNlcHQgPSBkZWZhdWx0OworQ291bnRlckRlc2NyaXB0b3ImIENvdW50ZXJEZXNj
cmlwdG9yOjpvcGVyYXRvcj0oQ291bnRlckRlc2NyaXB0b3ImJikgPSBkZWZhdWx0OworCitib29s
IENvdW50ZXJEZXNjcmlwdG9yOjpvcGVyYXRvcj09KGNvbnN0IENvdW50ZXJEZXNjcmlwdG9yJiBv
dGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25f
ZmllbGRzXworICAgJiYgdHlwZV8gPT0gb3RoZXIudHlwZV8KKyAgICYmIGNhdGVnb3JpZXNfID09
IG90aGVyLmNhdGVnb3JpZXNfCisgICAmJiB1bml0XyA9PSBvdGhlci51bml0XworICAgJiYgdW5p
dF9tdWx0aXBsaWVyXyA9PSBvdGhlci51bml0X211bHRpcGxpZXJfCisgICAmJiBpc19pbmNyZW1l
bnRhbF8gPT0gb3RoZXIuaXNfaW5jcmVtZW50YWxfOworfQorCitib29sIENvdW50ZXJEZXNjcmlw
dG9yOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIGNh
dGVnb3JpZXNfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBh
Y2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJh
dywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFs
aWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9o
YXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOwor
ICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiB0eXBlICov
OgorICAgICAgICBmaWVsZC5nZXQoJnR5cGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl
IDIgLyogY2F0ZWdvcmllcyAqLzoKKyAgICAgICAgY2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKCk7
CisgICAgICAgIGZpZWxkLmdldCgmY2F0ZWdvcmllc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDMgLyogdW5pdCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ1bml0Xyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIHVuaXRfbXVsdGlwbGllciAqLzoKKyAgICAg
ICAgZmllbGQuZ2V0KCZ1bml0X211bHRpcGxpZXJfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDUgLyogaXNfaW5jcmVtZW50YWwgKi86CisgICAgICAgIGZpZWxkLmdldCgmaXNfaW5jcmVt
ZW50YWxfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5T
ZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOwor
fQorCitzdGQ6OnN0cmluZyBDb3VudGVyRGVzY3JpcHRvcjo6U2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNT
dHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ291bnRlckRlc2NyaXB0b3I6OlNl
cmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIENvdW50ZXJEZXNjcmlwdG9yOjpT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAx
OiB0eXBlCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEs
IHR5cGVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGNhdGVnb3JpZXMKKyAgZm9yIChhdXRvJiBp
dCA6IGNhdGVnb3JpZXNfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMiwgaXQpOworICB9CisK
KyAgLy8gRmllbGQgMzogdW5pdAorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFw
cGVuZFZhckludCgzLCB1bml0Xyk7CisgIH0KKworICAvLyBGaWVsZCA0OiB1bml0X211bHRpcGxp
ZXIKKyAgaWYgKF9oYXNfZmllbGRfWzRdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNCwgdW5p
dF9tdWx0aXBsaWVyXyk7CisgIH0KKworICAvLyBGaWVsZCA1OiBpc19pbmNyZW1lbnRhbAorICBp
ZiAoX2hhc19maWVsZF9bNV0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQoNSwgaXNfaW5j
cmVtZW50YWxfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2Zp
ZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNw
YWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2Vu
CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNv
dXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9kZWJ1Z19hbm5vdGF0
aW9uLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by90cmFjZS90cmFja19ldmVudC9kZWJ1Z19hbm5vdGF0aW9uLmdlbi5oCisvLyBETyBO
T1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVm
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfREVCVUdf
QU5OT1RBVElPTl9QUk9UT19DUFBfSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9ERUJVR19BTk5PVEFUSU9OX1BST1RPX0NQUF9IXwor
CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rv
cj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVz
c2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0
byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgRGVidWdBbm5v
dGF0aW9uTmFtZTsKK2NsYXNzIERlYnVnQW5ub3RhdGlvbjsKK2NsYXNzIERlYnVnQW5ub3RhdGlv
bl9OZXN0ZWRWYWx1ZTsKK2VudW0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5
cGUgOiBpbnQ7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90
b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBN
ZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8g
eworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2VudW0gRGVidWdBbm5vdGF0
aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGUgOiBpbnQgeworICBEZWJ1Z0Fubm90YXRpb25fTmVz
dGVkVmFsdWVfTmVzdGVkVHlwZV9VTlNQRUNJRklFRCA9IDAsCisgIERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlX0RJQ1QgPSAxLAorICBEZWJ1Z0Fubm90YXRpb25fTmVzdGVk
VmFsdWVfTmVzdGVkVHlwZV9BUlJBWSA9IDIsCit9OworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
RGVidWdBbm5vdGF0aW9uTmFtZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7
CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0lpZEZpZWxkTnVtYmVyID0g
MSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKworICBEZWJ1Z0Fubm90YXRpb25O
YW1lKCk7CisgIH5EZWJ1Z0Fubm90YXRpb25OYW1lKCkgb3ZlcnJpZGU7CisgIERlYnVnQW5ub3Rh
dGlvbk5hbWUoRGVidWdBbm5vdGF0aW9uTmFtZSYmKSBub2V4Y2VwdDsKKyAgRGVidWdBbm5vdGF0
aW9uTmFtZSYgb3BlcmF0b3I9KERlYnVnQW5ub3RhdGlvbk5hbWUmJik7CisgIERlYnVnQW5ub3Rh
dGlvbk5hbWUoY29uc3QgRGVidWdBbm5vdGF0aW9uTmFtZSYpOworICBEZWJ1Z0Fubm90YXRpb25O
YW1lJiBvcGVyYXRvcj0oY29uc3QgRGVidWdBbm5vdGF0aW9uTmFtZSYpOworICBib29sIG9wZXJh
dG9yPT0oY29uc3QgRGVidWdBbm5vdGF0aW9uTmFtZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9y
IT0oY29uc3QgRGVidWdBbm5vdGF0aW9uTmFtZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRo
aXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6
ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBv
dmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0
IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0
OworCisgIGJvb2wgaGFzX2lpZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9Cisg
IHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJuIGlpZF87IH0KKyAgdm9pZCBzZXRfaWlkKHVp
bnQ2NF90IHZhbHVlKSB7IGlpZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAg
Ym9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGNvbnN0
IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKyAgdm9pZCBzZXRf
bmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgbmFtZV8gPSB2YWx1ZTsgX2hhc19maWVs
ZF8uc2V0KDIpOyB9CisKKyBwcml2YXRlOgorICB1aW50NjRfdCBpaWRfe307CisgIHN0ZDo6c3Ry
aW5nIG5hbWVfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYg
ZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5w
cm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0
c2V0PDM+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBEZWJ1
Z0Fubm90YXRpb24gOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgdXNpbmcgTmVzdGVkVmFsdWUgPSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU7Cisg
IGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrTmFtZUlpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBr
TmFtZUZpZWxkTnVtYmVyID0gMTAsCisgICAga0Jvb2xWYWx1ZUZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrVWludFZhbHVlRmllbGROdW1iZXIgPSAzLAorICAgIGtJbnRWYWx1ZUZpZWxkTnVtYmVyID0g
NCwKKyAgICBrRG91YmxlVmFsdWVGaWVsZE51bWJlciA9IDUsCisgICAga1N0cmluZ1ZhbHVlRmll
bGROdW1iZXIgPSA2LAorICAgIGtQb2ludGVyVmFsdWVGaWVsZE51bWJlciA9IDcsCisgICAga05l
c3RlZFZhbHVlRmllbGROdW1iZXIgPSA4LAorICAgIGtMZWdhY3lKc29uVmFsdWVGaWVsZE51bWJl
ciA9IDksCisgIH07CisKKyAgRGVidWdBbm5vdGF0aW9uKCk7CisgIH5EZWJ1Z0Fubm90YXRpb24o
KSBvdmVycmlkZTsKKyAgRGVidWdBbm5vdGF0aW9uKERlYnVnQW5ub3RhdGlvbiYmKSBub2V4Y2Vw
dDsKKyAgRGVidWdBbm5vdGF0aW9uJiBvcGVyYXRvcj0oRGVidWdBbm5vdGF0aW9uJiYpOworICBE
ZWJ1Z0Fubm90YXRpb24oY29uc3QgRGVidWdBbm5vdGF0aW9uJik7CisgIERlYnVnQW5ub3RhdGlv
biYgb3BlcmF0b3I9KGNvbnN0IERlYnVnQW5ub3RhdGlvbiYpOworICBib29sIG9wZXJhdG9yPT0o
Y29uc3QgRGVidWdBbm5vdGF0aW9uJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBE
ZWJ1Z0Fubm90YXRpb24mIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsg
fQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7
CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0
ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAg
dm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhh
c19uYW1lX2lpZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQ2NF90
IG5hbWVfaWlkKCkgY29uc3QgeyByZXR1cm4gbmFtZV9paWRfOyB9CisgIHZvaWQgc2V0X25hbWVf
aWlkKHVpbnQ2NF90IHZhbHVlKSB7IG5hbWVfaWlkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
MSk7IH0KKworICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTBd
OyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0K
KyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgbmFtZV8gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDEwKTsgfQorCisgIGJvb2wgaGFzX2Jvb2xfdmFsdWUoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBib29sIGJvb2xfdmFsdWUoKSBjb25zdCB7
IHJldHVybiBib29sX3ZhbHVlXzsgfQorICB2b2lkIHNldF9ib29sX3ZhbHVlKGJvb2wgdmFsdWUp
IHsgYm9vbF92YWx1ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBo
YXNfdWludF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIHVpbnQ2
NF90IHVpbnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB1aW50X3ZhbHVlXzsgfQorICB2b2lkIHNl
dF91aW50X3ZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7IHVpbnRfdmFsdWVfID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX2ludF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzRdOyB9CisgIGludDY0X3QgaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4g
aW50X3ZhbHVlXzsgfQorICB2b2lkIHNldF9pbnRfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeyBpbnRf
dmFsdWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgIGJvb2wgaGFzX2RvdWJs
ZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGRvdWJsZSBkb3Vi
bGVfdmFsdWUoKSBjb25zdCB7IHJldHVybiBkb3VibGVfdmFsdWVfOyB9CisgIHZvaWQgc2V0X2Rv
dWJsZV92YWx1ZShkb3VibGUgdmFsdWUpIHsgZG91YmxlX3ZhbHVlXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoNSk7IH0KKworICBib29sIGhhc19zdHJpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1s2XTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nX3ZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gc3RyaW5nX3ZhbHVlXzsgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUo
Y29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IHN0cmluZ192YWx1ZV8gPSB2YWx1ZTsgX2hhc19m
aWVsZF8uc2V0KDYpOyB9CisKKyAgYm9vbCBoYXNfcG9pbnRlcl92YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzddOyB9CisgIHVpbnQ2NF90IHBvaW50ZXJfdmFsdWUoKSBjb25zdCB7
IHJldHVybiBwb2ludGVyX3ZhbHVlXzsgfQorICB2b2lkIHNldF9wb2ludGVyX3ZhbHVlKHVpbnQ2
NF90IHZhbHVlKSB7IHBvaW50ZXJfdmFsdWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg3KTsg
fQorCisgIGJvb2wgaGFzX25lc3RlZF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRf
WzhdOyB9CisgIGNvbnN0IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZSYgbmVzdGVkX3ZhbHVl
KCkgY29uc3QgeyByZXR1cm4gKm5lc3RlZF92YWx1ZV87IH0KKyAgRGVidWdBbm5vdGF0aW9uX05l
c3RlZFZhbHVlKiBtdXRhYmxlX25lc3RlZF92YWx1ZSgpIHsgX2hhc19maWVsZF8uc2V0KDgpOyBy
ZXR1cm4gbmVzdGVkX3ZhbHVlXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX2xlZ2FjeV9qc29uX3Zh
bHVlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bOV07IH0KKyAgY29uc3Qgc3RkOjpzdHJp
bmcmIGxlZ2FjeV9qc29uX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gbGVnYWN5X2pzb25fdmFsdWVf
OyB9CisgIHZvaWQgc2V0X2xlZ2FjeV9qc29uX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeyBsZWdhY3lfanNvbl92YWx1ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDkpOyB9CisK
KyBwcml2YXRlOgorICB1aW50NjRfdCBuYW1lX2lpZF97fTsKKyAgc3RkOjpzdHJpbmcgbmFtZV97
fTsKKyAgYm9vbCBib29sX3ZhbHVlX3t9OworICB1aW50NjRfdCB1aW50X3ZhbHVlX3t9OworICBp
bnQ2NF90IGludF92YWx1ZV97fTsKKyAgZG91YmxlIGRvdWJsZV92YWx1ZV97fTsKKyAgc3RkOjpz
dHJpbmcgc3RyaW5nX3ZhbHVlX3t9OworICB1aW50NjRfdCBwb2ludGVyX3ZhbHVlX3t9OworICA6
OnByb3RvemVybzo6Q29weWFibGVQdHI8RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlPiBuZXN0
ZWRfdmFsdWVfOworICBzdGQ6OnN0cmluZyBsZWdhY3lfanNvbl92YWx1ZV97fTsKKworICAvLyBB
bGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxp
dHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0
cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8MTE+IF9oYXNfZmllbGRfe307
Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFs
dWUgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNp
bmcgTmVzdGVkVHlwZSA9IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gVU5TUEVDSUZJRUQgPSBEZWJ1Z0Fubm90YXRpb25fTmVz
dGVkVmFsdWVfTmVzdGVkVHlwZV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRv
IERJQ1QgPSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfTmVzdGVkVHlwZV9ESUNUOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gQVJSQVkgPSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVf
TmVzdGVkVHlwZV9BUlJBWTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIE5lc3RlZFR5cGVfTUlO
ID0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVfVU5TUEVDSUZJRUQ7Cisg
IHN0YXRpYyBjb25zdGV4cHIgYXV0byBOZXN0ZWRUeXBlX01BWCA9IERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlX0FSUkFZOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAg
a05lc3RlZFR5cGVGaWVsZE51bWJlciA9IDEsCisgICAga0RpY3RLZXlzRmllbGROdW1iZXIgPSAy
LAorICAgIGtEaWN0VmFsdWVzRmllbGROdW1iZXIgPSAzLAorICAgIGtBcnJheVZhbHVlc0ZpZWxk
TnVtYmVyID0gNCwKKyAgICBrSW50VmFsdWVGaWVsZE51bWJlciA9IDUsCisgICAga0RvdWJsZVZh
bHVlRmllbGROdW1iZXIgPSA2LAorICAgIGtCb29sVmFsdWVGaWVsZE51bWJlciA9IDcsCisgICAg
a1N0cmluZ1ZhbHVlRmllbGROdW1iZXIgPSA4LAorICB9OworCisgIERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZSgpOworICB+RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlKCkgb3ZlcnJpZGU7
CisgIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZShEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFs
dWUmJikgbm9leGNlcHQ7CisgIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZSYgb3BlcmF0b3I9
KERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZSYmKTsKKyAgRGVidWdBbm5vdGF0aW9uX05lc3Rl
ZFZhbHVlKGNvbnN0IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZSYpOworICBEZWJ1Z0Fubm90
YXRpb25fTmVzdGVkVmFsdWUmIG9wZXJhdG9yPShjb25zdCBEZWJ1Z0Fubm90YXRpb25fTmVzdGVk
VmFsdWUmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRW
YWx1ZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGVidWdBbm5vdGF0aW9uX05l
c3RlZFZhbHVlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKwor
ICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBz
dGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZl
Y3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQg
U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfbmVz
dGVkX3R5cGUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBEZWJ1Z0Fubm90
YXRpb25fTmVzdGVkVmFsdWVfTmVzdGVkVHlwZSBuZXN0ZWRfdHlwZSgpIGNvbnN0IHsgcmV0dXJu
IG5lc3RlZF90eXBlXzsgfQorICB2b2lkIHNldF9uZXN0ZWRfdHlwZShEZWJ1Z0Fubm90YXRpb25f
TmVzdGVkVmFsdWVfTmVzdGVkVHlwZSB2YWx1ZSkgeyBuZXN0ZWRfdHlwZV8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDEpOyB9CisKKyAgaW50IGRpY3Rfa2V5c19zaXplKCkgY29uc3QgeyByZXR1
cm4gc3RhdGljX2Nhc3Q8aW50PihkaWN0X2tleXNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2
ZWN0b3I8c3RkOjpzdHJpbmc+JiBkaWN0X2tleXMoKSBjb25zdCB7IHJldHVybiBkaWN0X2tleXNf
OyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9kaWN0X2tleXMoKSB7IHJl
dHVybiAmZGljdF9rZXlzXzsgfQorICB2b2lkIGNsZWFyX2RpY3Rfa2V5cygpIHsgZGljdF9rZXlz
Xy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX2RpY3Rfa2V5cyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBk
aWN0X2tleXNfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9kaWN0
X2tleXMoKSB7IGRpY3Rfa2V5c18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmZGljdF9rZXlzXy5i
YWNrKCk7IH0KKworICBpbnQgZGljdF92YWx1ZXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRp
Y19jYXN0PGludD4oZGljdF92YWx1ZXNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8
RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlPiYgZGljdF92YWx1ZXMoKSBjb25zdCB7IHJldHVy
biBkaWN0X3ZhbHVlc187IH0KKyAgc3RkOjp2ZWN0b3I8RGVidWdBbm5vdGF0aW9uX05lc3RlZFZh
bHVlPiogbXV0YWJsZV9kaWN0X3ZhbHVlcygpIHsgcmV0dXJuICZkaWN0X3ZhbHVlc187IH0KKyAg
dm9pZCBjbGVhcl9kaWN0X3ZhbHVlcygpIHsgZGljdF92YWx1ZXNfLmNsZWFyKCk7IH0KKyAgRGVi
dWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlKiBhZGRfZGljdF92YWx1ZXMoKSB7IGRpY3RfdmFsdWVz
Xy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZkaWN0X3ZhbHVlc18uYmFjaygpOyB9CisKKyAgaW50
IGFycmF5X3ZhbHVlc19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhcnJh
eV92YWx1ZXNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8RGVidWdBbm5vdGF0aW9u
X05lc3RlZFZhbHVlPiYgYXJyYXlfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfdmFsdWVz
XzsgfQorICBzdGQ6OnZlY3RvcjxEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU+KiBtdXRhYmxl
X2FycmF5X3ZhbHVlcygpIHsgcmV0dXJuICZhcnJheV92YWx1ZXNfOyB9CisgIHZvaWQgY2xlYXJf
YXJyYXlfdmFsdWVzKCkgeyBhcnJheV92YWx1ZXNfLmNsZWFyKCk7IH0KKyAgRGVidWdBbm5vdGF0
aW9uX05lc3RlZFZhbHVlKiBhZGRfYXJyYXlfdmFsdWVzKCkgeyBhcnJheV92YWx1ZXNfLmVtcGxh
Y2VfYmFjaygpOyByZXR1cm4gJmFycmF5X3ZhbHVlc18uYmFjaygpOyB9CisKKyAgYm9vbCBoYXNf
aW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07IH0KKyAgaW50NjRfdCBp
bnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBpbnRfdmFsdWVfOyB9CisgIHZvaWQgc2V0X2ludF92
YWx1ZShpbnQ2NF90IHZhbHVlKSB7IGludF92YWx1ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0
KDUpOyB9CisKKyAgYm9vbCBoYXNfZG91YmxlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bNl07IH0KKyAgZG91YmxlIGRvdWJsZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGRvdWJs
ZV92YWx1ZV87IH0KKyAgdm9pZCBzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSkgeyBkb3Vi
bGVfdmFsdWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg2KTsgfQorCisgIGJvb2wgaGFzX2Jv
b2xfdmFsdWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s3XTsgfQorICBib29sIGJvb2xf
dmFsdWUoKSBjb25zdCB7IHJldHVybiBib29sX3ZhbHVlXzsgfQorICB2b2lkIHNldF9ib29sX3Zh
bHVlKGJvb2wgdmFsdWUpIHsgYm9vbF92YWx1ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDcp
OyB9CisKKyAgYm9vbCBoYXNfc3RyaW5nX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bOF07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZ192YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIHN0cmluZ192YWx1ZV87IH0KKyAgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeyBzdHJpbmdfdmFsdWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg4
KTsgfQorCisgcHJpdmF0ZToKKyAgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5
cGUgbmVzdGVkX3R5cGVfe307CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkaWN0X2tleXNf
OworICBzdGQ6OnZlY3RvcjxEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU+IGRpY3RfdmFsdWVz
XzsKKyAgc3RkOjp2ZWN0b3I8RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlPiBhcnJheV92YWx1
ZXNfOworICBpbnQ2NF90IGludF92YWx1ZV97fTsKKyAgZG91YmxlIGRvdWJsZV92YWx1ZV97fTsK
KyAgYm9vbCBib29sX3ZhbHVlX3t9OworICBzdGQ6OnN0cmluZyBzdHJpbmdfdmFsdWVfe307CisK
KyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21w
YXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAg
c3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDk+IF9oYXNfZmll
bGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBw
cm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1Nf
UFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0RFQlVHX0FOTk9UQVRJT05fUFJPVE9f
Q1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19k
ZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0
b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9z
dGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90
cmFjZS90cmFja19ldmVudC9kZWJ1Z19hbm5vdGF0aW9uLmdlbi5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworRGVidWdBbm5v
dGF0aW9uTmFtZTo6RGVidWdBbm5vdGF0aW9uTmFtZSgpID0gZGVmYXVsdDsKK0RlYnVnQW5ub3Rh
dGlvbk5hbWU6On5EZWJ1Z0Fubm90YXRpb25OYW1lKCkgPSBkZWZhdWx0OworRGVidWdBbm5vdGF0
aW9uTmFtZTo6RGVidWdBbm5vdGF0aW9uTmFtZShjb25zdCBEZWJ1Z0Fubm90YXRpb25OYW1lJikg
PSBkZWZhdWx0OworRGVidWdBbm5vdGF0aW9uTmFtZSYgRGVidWdBbm5vdGF0aW9uTmFtZTo6b3Bl
cmF0b3I9KGNvbnN0IERlYnVnQW5ub3RhdGlvbk5hbWUmKSA9IGRlZmF1bHQ7CitEZWJ1Z0Fubm90
YXRpb25OYW1lOjpEZWJ1Z0Fubm90YXRpb25OYW1lKERlYnVnQW5ub3RhdGlvbk5hbWUmJikgbm9l
eGNlcHQgPSBkZWZhdWx0OworRGVidWdBbm5vdGF0aW9uTmFtZSYgRGVidWdBbm5vdGF0aW9uTmFt
ZTo6b3BlcmF0b3I9KERlYnVnQW5ub3RhdGlvbk5hbWUmJikgPSBkZWZhdWx0OworCitib29sIERl
YnVnQW5ub3RhdGlvbk5hbWU6Om9wZXJhdG9yPT0oY29uc3QgRGVidWdBbm5vdGF0aW9uTmFtZSYg
b3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3du
X2ZpZWxkc18KKyAgICYmIGlpZF8gPT0gb3RoZXIuaWlkXworICAgJiYgbmFtZV8gPT0gb3RoZXIu
bmFtZV87Cit9CisKK2Jvb2wgRGVidWdBbm5vdGF0aW9uTmFtZTo6UGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsK
KyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNv
ZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7
IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxk
LmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVs
ZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEg
LyogaWlkICovOgorICAgICAgICBmaWVsZC5nZXQoJmlpZF8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgMiAvKiBuYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJm5hbWVfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBl
bmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJl
dHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmlu
ZyBEZWJ1Z0Fubm90YXRpb25OYW1lOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQor
CitzdGQ6OnZlY3Rvcjx1aW50OF90PiBEZWJ1Z0Fubm90YXRpb25OYW1lOjpTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBEZWJ1Z0Fubm90YXRpb25OYW1lOjpTZXJpYWxpemUo
Ojpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBpaWQKKyAg
aWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgaWlkXyk7Cisg
IH0KKworICAvLyBGaWVsZCAyOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1z
Zy0+QXBwZW5kU3RyaW5nKDIsIG5hbWVfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9C
eXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30K
KworCitEZWJ1Z0Fubm90YXRpb246OkRlYnVnQW5ub3RhdGlvbigpID0gZGVmYXVsdDsKK0RlYnVn
QW5ub3RhdGlvbjo6fkRlYnVnQW5ub3RhdGlvbigpID0gZGVmYXVsdDsKK0RlYnVnQW5ub3RhdGlv
bjo6RGVidWdBbm5vdGF0aW9uKGNvbnN0IERlYnVnQW5ub3RhdGlvbiYpID0gZGVmYXVsdDsKK0Rl
YnVnQW5ub3RhdGlvbiYgRGVidWdBbm5vdGF0aW9uOjpvcGVyYXRvcj0oY29uc3QgRGVidWdBbm5v
dGF0aW9uJikgPSBkZWZhdWx0OworRGVidWdBbm5vdGF0aW9uOjpEZWJ1Z0Fubm90YXRpb24oRGVi
dWdBbm5vdGF0aW9uJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0RlYnVnQW5ub3RhdGlvbiYgRGVi
dWdBbm5vdGF0aW9uOjpvcGVyYXRvcj0oRGVidWdBbm5vdGF0aW9uJiYpID0gZGVmYXVsdDsKKwor
Ym9vbCBEZWJ1Z0Fubm90YXRpb246Om9wZXJhdG9yPT0oY29uc3QgRGVidWdBbm5vdGF0aW9uJiBv
dGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25f
ZmllbGRzXworICAgJiYgbmFtZV9paWRfID09IG90aGVyLm5hbWVfaWlkXworICAgJiYgbmFtZV8g
PT0gb3RoZXIubmFtZV8KKyAgICYmIGJvb2xfdmFsdWVfID09IG90aGVyLmJvb2xfdmFsdWVfCisg
ICAmJiB1aW50X3ZhbHVlXyA9PSBvdGhlci51aW50X3ZhbHVlXworICAgJiYgaW50X3ZhbHVlXyA9
PSBvdGhlci5pbnRfdmFsdWVfCisgICAmJiBkb3VibGVfdmFsdWVfID09IG90aGVyLmRvdWJsZV92
YWx1ZV8KKyAgICYmIHN0cmluZ192YWx1ZV8gPT0gb3RoZXIuc3RyaW5nX3ZhbHVlXworICAgJiYg
cG9pbnRlcl92YWx1ZV8gPT0gb3RoZXIucG9pbnRlcl92YWx1ZV8KKyAgICYmIG5lc3RlZF92YWx1
ZV8gPT0gb3RoZXIubmVzdGVkX3ZhbHVlXworICAgJiYgbGVnYWN5X2pzb25fdmFsdWVfID09IG90
aGVyLmxlZ2FjeV9qc29uX3ZhbHVlXzsKK30KKworYm9vbCBEZWJ1Z0Fubm90YXRpb246OlBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVs
ZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3pl
cm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVj
LlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgewor
ICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2Zp
ZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgewor
ICAgICAgY2FzZSAxIC8qIG5hbWVfaWlkICovOgorICAgICAgICBmaWVsZC5nZXQoJm5hbWVfaWlk
Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMCAvKiBuYW1lICovOgorICAgICAgICBm
aWVsZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogYm9vbF92
YWx1ZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZib29sX3ZhbHVlXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgY2FzZSAzIC8qIHVpbnRfdmFsdWUgKi86CisgICAgICAgIGZpZWxkLmdldCgmdWlu
dF92YWx1ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBpbnRfdmFsdWUgKi86
CisgICAgICAgIGZpZWxkLmdldCgmaW50X3ZhbHVlXyk7CisgICAgICAgIGJyZWFrOworICAgICAg
Y2FzZSA1IC8qIGRvdWJsZV92YWx1ZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkb3VibGVfdmFs
dWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYgLyogc3RyaW5nX3ZhbHVlICovOgor
ICAgICAgICBmaWVsZC5nZXQoJnN0cmluZ192YWx1ZV8pOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgNyAvKiBwb2ludGVyX3ZhbHVlICovOgorICAgICAgICBmaWVsZC5nZXQoJnBvaW50ZXJf
dmFsdWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDggLyogbmVzdGVkX3ZhbHVlICov
OgorICAgICAgICAoKm5lc3RlZF92YWx1ZV8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRf
c3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOSAvKiBsZWdhY3lfanNvbl92
YWx1ZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZsZWdhY3lfanNvbl92YWx1ZV8pOworICAgICAg
ICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVu
ZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0
dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5n
IERlYnVnQW5ub3RhdGlvbjo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96
ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXpl
KG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3Rk
Ojp2ZWN0b3I8dWludDhfdD4gRGVidWdBbm5vdGF0aW9uOjpTZXJpYWxpemVBc0FycmF5KCkgY29u
c3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBt
c2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJy
YXkoKTsKK30KKwordm9pZCBEZWJ1Z0Fubm90YXRpb246OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IG5hbWVfaWlkCisgIGlmIChfaGFz
X2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIG5hbWVfaWlkXyk7CisgIH0K
KworICAvLyBGaWVsZCAxMDogbmFtZQorICBpZiAoX2hhc19maWVsZF9bMTBdKSB7CisgICAgbXNn
LT5BcHBlbmRTdHJpbmcoMTAsIG5hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IGJvb2xfdmFs
dWUKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDIs
IGJvb2xfdmFsdWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IHVpbnRfdmFsdWUKKyAgaWYgKF9o
YXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMywgdWludF92YWx1ZV8pOwor
ICB9CisKKyAgLy8gRmllbGQgNDogaW50X3ZhbHVlCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgewor
ICAgIG1zZy0+QXBwZW5kVmFySW50KDQsIGludF92YWx1ZV8pOworICB9CisKKyAgLy8gRmllbGQg
NTogZG91YmxlX3ZhbHVlCisgIGlmIChfaGFzX2ZpZWxkX1s1XSkgeworICAgIG1zZy0+QXBwZW5k
Rml4ZWQoNSwgZG91YmxlX3ZhbHVlXyk7CisgIH0KKworICAvLyBGaWVsZCA2OiBzdHJpbmdfdmFs
dWUKKyAgaWYgKF9oYXNfZmllbGRfWzZdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoNiwgc3Ry
aW5nX3ZhbHVlXyk7CisgIH0KKworICAvLyBGaWVsZCA3OiBwb2ludGVyX3ZhbHVlCisgIGlmIChf
aGFzX2ZpZWxkX1s3XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDcsIHBvaW50ZXJfdmFsdWVf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IG5lc3RlZF92YWx1ZQorICBpZiAoX2hhc19maWVsZF9b
OF0pIHsKKyAgICAoKm5lc3RlZF92YWx1ZV8pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVz
c2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oOCkpOworICB9CisKKyAgLy8gRmllbGQgOTogbGVn
YWN5X2pzb25fdmFsdWUKKyAgaWYgKF9oYXNfZmllbGRfWzldKSB7CisgICAgbXNnLT5BcHBlbmRT
dHJpbmcoOSwgbGVnYWN5X2pzb25fdmFsdWVfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJv
dG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsK
K30KKworCitEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU6OkRlYnVnQW5ub3RhdGlvbl9OZXN0
ZWRWYWx1ZSgpID0gZGVmYXVsdDsKK0RlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZTo6fkRlYnVn
QW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZSgpID0gZGVmYXVsdDsKK0RlYnVnQW5ub3RhdGlvbl9OZXN0
ZWRWYWx1ZTo6RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlKGNvbnN0IERlYnVnQW5ub3RhdGlv
bl9OZXN0ZWRWYWx1ZSYpID0gZGVmYXVsdDsKK0RlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZSYg
RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlOjpvcGVyYXRvcj0oY29uc3QgRGVidWdBbm5vdGF0
aW9uX05lc3RlZFZhbHVlJikgPSBkZWZhdWx0OworRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVl
OjpEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWUoRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVl
JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0RlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZSYgRGVi
dWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlOjpvcGVyYXRvcj0oRGVidWdBbm5vdGF0aW9uX05lc3Rl
ZFZhbHVlJiYpID0gZGVmYXVsdDsKKworYm9vbCBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU6
Om9wZXJhdG9yPT0oY29uc3QgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlJiBvdGhlcikgY29u
c3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXwor
ICAgJiYgbmVzdGVkX3R5cGVfID09IG90aGVyLm5lc3RlZF90eXBlXworICAgJiYgZGljdF9rZXlz
XyA9PSBvdGhlci5kaWN0X2tleXNfCisgICAmJiBkaWN0X3ZhbHVlc18gPT0gb3RoZXIuZGljdF92
YWx1ZXNfCisgICAmJiBhcnJheV92YWx1ZXNfID09IG90aGVyLmFycmF5X3ZhbHVlc18KKyAgICYm
IGludF92YWx1ZV8gPT0gb3RoZXIuaW50X3ZhbHVlXworICAgJiYgZG91YmxlX3ZhbHVlXyA9PSBv
dGhlci5kb3VibGVfdmFsdWVfCisgICAmJiBib29sX3ZhbHVlXyA9PSBvdGhlci5ib29sX3ZhbHVl
XworICAgJiYgc3RyaW5nX3ZhbHVlXyA9PSBvdGhlci5zdHJpbmdfdmFsdWVfOworfQorCitib29s
IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCog
cmF3LCBzaXplX3Qgc2l6ZSkgeworICBkaWN0X2tleXNfLmNsZWFyKCk7CisgIGRpY3RfdmFsdWVz
Xy5jbGVhcigpOworICBhcnJheV92YWx1ZXNfLmNsZWFyKCk7CisgIHVua25vd25fZmllbGRzXy5j
bGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQ
cm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFk
RmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBp
ZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8u
c2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAg
IGNhc2UgMSAvKiBuZXN0ZWRfdHlwZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZuZXN0ZWRfdHlw
ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBkaWN0X2tleXMgKi86CisgICAg
ICAgIGRpY3Rfa2V5c18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmZGljdF9r
ZXlzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBkaWN0X3ZhbHVl
cyAqLzoKKyAgICAgICAgZGljdF92YWx1ZXNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBkaWN0
X3ZhbHVlc18uYmFjaygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBhcnJheV92YWx1ZXMgKi86CisgICAgICAg
IGFycmF5X3ZhbHVlc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGFycmF5X3ZhbHVlc18uYmFj
aygpLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgNSAvKiBpbnRfdmFsdWUgKi86CisgICAgICAgIGZpZWxkLmdldCgmaW50
X3ZhbHVlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8qIGRvdWJsZV92YWx1ZSAq
LzoKKyAgICAgICAgZmllbGQuZ2V0KCZkb3VibGVfdmFsdWVfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDcgLyogYm9vbF92YWx1ZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZib29sX3Zh
bHVlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIHN0cmluZ192YWx1ZSAqLzoK
KyAgICAgICAgZmllbGQuZ2V0KCZzdHJpbmdfdmFsdWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9m
aWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vy
cm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBEZWJ1Z0Fubm90YXRp
b25fTmVzdGVkVmFsdWU6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVy
bzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZSht
c2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZTo6U2VyaWFsaXplQXNB
cnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6
TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJp
YWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlOjpT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAx
OiBuZXN0ZWRfdHlwZQorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZh
ckludCgxLCBuZXN0ZWRfdHlwZV8pOworICB9CisKKyAgLy8gRmllbGQgMjogZGljdF9rZXlzCisg
IGZvciAoYXV0byYgaXQgOiBkaWN0X2tleXNfKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMiwg
aXQpOworICB9CisKKyAgLy8gRmllbGQgMzogZGljdF92YWx1ZXMKKyAgZm9yIChhdXRvJiBpdCA6
IGRpY3RfdmFsdWVzXykgeworICAgIGl0LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2Fn
ZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMykpOworICB9CisKKyAgLy8gRmllbGQgNDogYXJyYXlf
dmFsdWVzCisgIGZvciAoYXV0byYgaXQgOiBhcnJheV92YWx1ZXNfKSB7CisgICAgaXQuU2VyaWFs
aXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPig0KSk7Cisg
IH0KKworICAvLyBGaWVsZCA1OiBpbnRfdmFsdWUKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoNSwgaW50X3ZhbHVlXyk7CisgIH0KKworICAvLyBGaWVsZCA2
OiBkb3VibGVfdmFsdWUKKyAgaWYgKF9oYXNfZmllbGRfWzZdKSB7CisgICAgbXNnLT5BcHBlbmRG
aXhlZCg2LCBkb3VibGVfdmFsdWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDc6IGJvb2xfdmFsdWUK
KyAgaWYgKF9oYXNfZmllbGRfWzddKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDcsIGJv
b2xfdmFsdWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IHN0cmluZ192YWx1ZQorICBpZiAoX2hh
c19maWVsZF9bOF0pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZyg4LCBzdHJpbmdfdmFsdWVfKTsK
KyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgp
LCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRv
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21hIEdD
QyBkaWFnbm9zdGljIHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3By
b3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9sb2dfbWVzc2FnZS5nZW4uY2MKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJh
Y2tfZXZlbnQvbG9nX21lc3NhZ2UuZ2VuLmgKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVk
IGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9MT0dfTUVTU0FHRV9QUk9UT19DUFBfSF8KKyNk
ZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9M
T0dfTUVTU0FHRV9QUk9UT19DUFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUg
PGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUg
PHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9y
dC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3Bh
Y2UgZ2VuIHsKK2NsYXNzIExvZ01lc3NhZ2VCb2R5OworY2xhc3MgTG9nTWVzc2FnZTsKK30gIC8v
IG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNw
YWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBu
YW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJv
dG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgTG9nTWVzc2Fn
ZUJvZHkgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAg
ZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtJaWRGaWVsZE51bWJlciA9IDEsCisgICAga0JvZHlG
aWVsZE51bWJlciA9IDIsCisgIH07CisKKyAgTG9nTWVzc2FnZUJvZHkoKTsKKyAgfkxvZ01lc3Nh
Z2VCb2R5KCkgb3ZlcnJpZGU7CisgIExvZ01lc3NhZ2VCb2R5KExvZ01lc3NhZ2VCb2R5JiYpIG5v
ZXhjZXB0OworICBMb2dNZXNzYWdlQm9keSYgb3BlcmF0b3I9KExvZ01lc3NhZ2VCb2R5JiYpOwor
ICBMb2dNZXNzYWdlQm9keShjb25zdCBMb2dNZXNzYWdlQm9keSYpOworICBMb2dNZXNzYWdlQm9k
eSYgb3BlcmF0b3I9KGNvbnN0IExvZ01lc3NhZ2VCb2R5Jik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBMb2dNZXNzYWdlQm9keSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgTG9n
TWVzc2FnZUJvZHkmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQor
CisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7Cisg
IHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9p
ZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19p
aWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50NjRfdCBpaWQoKSBj
b25zdCB7IHJldHVybiBpaWRfOyB9CisgIHZvaWQgc2V0X2lpZCh1aW50NjRfdCB2YWx1ZSkgeyBp
aWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2JvZHkoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgYm9k
eSgpIGNvbnN0IHsgcmV0dXJuIGJvZHlfOyB9CisgIHZvaWQgc2V0X2JvZHkoY29uc3Qgc3RkOjpz
dHJpbmcmIHZhbHVlKSB7IGJvZHlfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisg
cHJpdmF0ZToKKyAgdWludDY0X3QgaWlkX3t9OworICBzdGQ6OnN0cmluZyBib2R5X3t9OworCisg
IC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0
aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0
ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwzPiBfaGFzX2ZpZWxk
X3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgTG9nTWVzc2FnZSA6IHB1YmxpYyA6
OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVy
cyB7CisgICAga1NvdXJjZUxvY2F0aW9uSWlkRmllbGROdW1iZXIgPSAxLAorICAgIGtCb2R5SWlk
RmllbGROdW1iZXIgPSAyLAorICB9OworCisgIExvZ01lc3NhZ2UoKTsKKyAgfkxvZ01lc3NhZ2Uo
KSBvdmVycmlkZTsKKyAgTG9nTWVzc2FnZShMb2dNZXNzYWdlJiYpIG5vZXhjZXB0OworICBMb2dN
ZXNzYWdlJiBvcGVyYXRvcj0oTG9nTWVzc2FnZSYmKTsKKyAgTG9nTWVzc2FnZShjb25zdCBMb2dN
ZXNzYWdlJik7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPShjb25zdCBMb2dNZXNzYWdlJik7Cisg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBMb2dNZXNzYWdlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBMb2dNZXNzYWdlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBv
dGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92
ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRl
OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJp
ZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAg
Ym9vbCBoYXNfc291cmNlX2xvY2F0aW9uX2lpZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRf
WzFdOyB9CisgIHVpbnQ2NF90IHNvdXJjZV9sb2NhdGlvbl9paWQoKSBjb25zdCB7IHJldHVybiBz
b3VyY2VfbG9jYXRpb25faWlkXzsgfQorICB2b2lkIHNldF9zb3VyY2VfbG9jYXRpb25faWlkKHVp
bnQ2NF90IHZhbHVlKSB7IHNvdXJjZV9sb2NhdGlvbl9paWRfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2JvZHlfaWlkKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMl07IH0KKyAgdWludDY0X3QgYm9keV9paWQoKSBjb25zdCB7IHJldHVybiBib2R5X2lp
ZF87IH0KKyAgdm9pZCBzZXRfYm9keV9paWQodWludDY0X3QgdmFsdWUpIHsgYm9keV9paWRfID0g
dmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToKKyAgdWludDY0X3Qgc291
cmNlX2xvY2F0aW9uX2lpZF97fTsKKyAgdWludDY0X3QgYm9keV9paWRfe307CisKKyAgLy8gQWxs
b3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5
CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJp
bmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9
OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30g
IC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BF
UkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0xPR19NRVNTQUdFX1BST1RPX0NQUF9IXworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3Nh
Z2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Nj
YXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkg
UGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJh
Z21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZl
bnQvbG9nX21lc3NhZ2UuZ2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2Ug
cHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitMb2dNZXNzYWdlQm9keTo6TG9nTWVzc2FnZUJv
ZHkoKSA9IGRlZmF1bHQ7CitMb2dNZXNzYWdlQm9keTo6fkxvZ01lc3NhZ2VCb2R5KCkgPSBkZWZh
dWx0OworTG9nTWVzc2FnZUJvZHk6OkxvZ01lc3NhZ2VCb2R5KGNvbnN0IExvZ01lc3NhZ2VCb2R5
JikgPSBkZWZhdWx0OworTG9nTWVzc2FnZUJvZHkmIExvZ01lc3NhZ2VCb2R5OjpvcGVyYXRvcj0o
Y29uc3QgTG9nTWVzc2FnZUJvZHkmKSA9IGRlZmF1bHQ7CitMb2dNZXNzYWdlQm9keTo6TG9nTWVz
c2FnZUJvZHkoTG9nTWVzc2FnZUJvZHkmJikgbm9leGNlcHQgPSBkZWZhdWx0OworTG9nTWVzc2Fn
ZUJvZHkmIExvZ01lc3NhZ2VCb2R5OjpvcGVyYXRvcj0oTG9nTWVzc2FnZUJvZHkmJikgPSBkZWZh
dWx0OworCitib29sIExvZ01lc3NhZ2VCb2R5OjpvcGVyYXRvcj09KGNvbnN0IExvZ01lc3NhZ2VC
b2R5JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVu
a25vd25fZmllbGRzXworICAgJiYgaWlkXyA9PSBvdGhlci5paWRfCisgICAmJiBib2R5XyA9PSBv
dGhlci5ib2R5XzsKK30KKworYm9vbCBMb2dNZXNzYWdlQm9keTo6UGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsK
KyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNv
ZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7
IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxk
LmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVs
ZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEg
LyogaWlkICovOgorICAgICAgICBmaWVsZC5nZXQoJmlpZF8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgMiAvKiBib2R5ICovOgorICAgICAgICBmaWVsZC5nZXQoJmJvZHlfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBl
bmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJl
dHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmlu
ZyBMb2dNZXNzYWdlQm9keTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96
ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXpl
KG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3Rk
Ojp2ZWN0b3I8dWludDhfdD4gTG9nTWVzc2FnZUJvZHk6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25z
dCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1z
ZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJh
eSgpOworfQorCit2b2lkIExvZ01lc3NhZ2VCb2R5OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBpaWQKKyAgaWYgKF9oYXNfZmllbGRf
WzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgaWlkXyk7CisgIH0KKworICAvLyBGaWVs
ZCAyOiBib2R5CisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5n
KDIsIGJvZHlfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2Zp
ZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitMb2dNZXNzYWdl
OjpMb2dNZXNzYWdlKCkgPSBkZWZhdWx0OworTG9nTWVzc2FnZTo6fkxvZ01lc3NhZ2UoKSA9IGRl
ZmF1bHQ7CitMb2dNZXNzYWdlOjpMb2dNZXNzYWdlKGNvbnN0IExvZ01lc3NhZ2UmKSA9IGRlZmF1
bHQ7CitMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcj0oY29uc3QgTG9nTWVzc2FnZSYp
ID0gZGVmYXVsdDsKK0xvZ01lc3NhZ2U6OkxvZ01lc3NhZ2UoTG9nTWVzc2FnZSYmKSBub2V4Y2Vw
dCA9IGRlZmF1bHQ7CitMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcj0oTG9nTWVzc2Fn
ZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgTG9nTWVzc2FnZTo6b3BlcmF0b3I9PShjb25zdCBMb2dN
ZXNzYWdlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVy
LnVua25vd25fZmllbGRzXworICAgJiYgc291cmNlX2xvY2F0aW9uX2lpZF8gPT0gb3RoZXIuc291
cmNlX2xvY2F0aW9uX2lpZF8KKyAgICYmIGJvZHlfaWlkXyA9PSBvdGhlci5ib2R5X2lpZF87Cit9
CisKK2Jvb2wgTG9nTWVzc2FnZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXpl
X3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJy
b3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUp
OworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZp
ZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxk
Xy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9Cisg
ICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogc291cmNlX2xvY2F0aW9u
X2lpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZzb3VyY2VfbG9jYXRpb25faWlkXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIGJvZHlfaWlkICovOgorICAgICAgICBmaWVsZC5n
ZXQoJmJvZHlfaWlkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xl
ZnQoKTsKK30KKworc3RkOjpzdHJpbmcgTG9nTWVzc2FnZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNT
dHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gTG9nTWVzc2FnZTo6U2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVy
bzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5T
ZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgTG9nTWVzc2FnZTo6U2VyaWFsaXplKDo6cHJv
dG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogc291cmNlX2xvY2F0
aW9uX2lpZAorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgx
LCBzb3VyY2VfbG9jYXRpb25faWlkXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBib2R5X2lpZAor
ICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBib2R5X2lp
ZF8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5k
YXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVy
ZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFn
bWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBn
ZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3Byb2Nlc3NfZGVzY3JpcHRvci5n
ZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vdHJhY2UvdHJhY2tfZXZlbnQvcHJvY2Vzc19kZXNjcmlwdG9yLmdlbi5oCisvLyBETyBOT1Qg
RURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfUFJPQ0VTU19E
RVNDUklQVE9SX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BF
UkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX1BST0NFU1NfREVTQ1JJUFRPUl9QUk9UT19DUFBfSF8K
KworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2ZWN0
b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY3BwX21l
c3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIFByb2Nlc3NE
ZXNjcmlwdG9yOworZW51bSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZSA6IGlu
dDsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAg
Ly8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworZW51bSBQcm9jZXNzRGVzY3JpcHRvcl9D
aHJvbWVQcm9jZXNzVHlwZSA6IGludCB7CisgIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nl
c3NUeXBlX1BST0NFU1NfVU5TUEVDSUZJRUQgPSAwLAorICBQcm9jZXNzRGVzY3JpcHRvcl9DaHJv
bWVQcm9jZXNzVHlwZV9QUk9DRVNTX0JST1dTRVIgPSAxLAorICBQcm9jZXNzRGVzY3JpcHRvcl9D
aHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1JFTkRFUkVSID0gMiwKKyAgUHJvY2Vzc0Rlc2NyaXB0
b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19VVElMSVRZID0gMywKKyAgUHJvY2Vzc0Rlc2Ny
aXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19aWUdPVEUgPSA0LAorICBQcm9jZXNzRGVz
Y3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1NBTkRCT1hfSEVMUEVSID0gNSwKKyAg
UHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19HUFUgPSA2LAorICBQ
cm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1BQQVBJX1BMVUdJTiA9
IDcsCisgIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElf
QlJPS0VSID0gOCwKK307CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBQcm9jZXNzRGVzY3JpcHRv
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICB1c2lu
ZyBDaHJvbWVQcm9jZXNzVHlwZSA9IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBl
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gUFJPQ0VTU19VTlNQRUNJRklFRCA9IFByb2Nlc3NE
ZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfVU5TUEVDSUZJRUQ7CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBQUk9DRVNTX0JST1dTRVIgPSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJv
bWVQcm9jZXNzVHlwZV9QUk9DRVNTX0JST1dTRVI7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBQ
Uk9DRVNTX1JFTkRFUkVSID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJP
Q0VTU19SRU5ERVJFUjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFBST0NFU1NfVVRJTElUWSA9
IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfVVRJTElUWTsKKyAg
c3RhdGljIGNvbnN0ZXhwciBhdXRvIFBST0NFU1NfWllHT1RFID0gUHJvY2Vzc0Rlc2NyaXB0b3Jf
Q2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19aWUdPVEU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0
byBQUk9DRVNTX1NBTkRCT1hfSEVMUEVSID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vz
c1R5cGVfUFJPQ0VTU19TQU5EQk9YX0hFTFBFUjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFBS
T0NFU1NfR1BVID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19H
UFU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBQUk9DRVNTX1BQQVBJX1BMVUdJTiA9IFByb2Nl
c3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfUExVR0lOOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gUFJPQ0VTU19QUEFQSV9CUk9LRVIgPSBQcm9jZXNzRGVzY3Jp
cHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1BQQVBJX0JST0tFUjsKKyAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIENocm9tZVByb2Nlc3NUeXBlX01JTiA9IFByb2Nlc3NEZXNjcmlwdG9yX0No
cm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIg
YXV0byBDaHJvbWVQcm9jZXNzVHlwZV9NQVggPSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9j
ZXNzVHlwZV9QUk9DRVNTX1BQQVBJX0JST0tFUjsKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAg
IGtQaWRGaWVsZE51bWJlciA9IDEsCisgICAga0NtZGxpbmVGaWVsZE51bWJlciA9IDIsCisgICAg
a1Byb2Nlc3NOYW1lRmllbGROdW1iZXIgPSA2LAorICAgIGtQcm9jZXNzUHJpb3JpdHlGaWVsZE51
bWJlciA9IDUsCisgICAga0Nocm9tZVByb2Nlc3NUeXBlRmllbGROdW1iZXIgPSA0LAorICAgIGtM
ZWdhY3lTb3J0SW5kZXhGaWVsZE51bWJlciA9IDMsCisgIH07CisKKyAgUHJvY2Vzc0Rlc2NyaXB0
b3IoKTsKKyAgflByb2Nlc3NEZXNjcmlwdG9yKCkgb3ZlcnJpZGU7CisgIFByb2Nlc3NEZXNjcmlw
dG9yKFByb2Nlc3NEZXNjcmlwdG9yJiYpIG5vZXhjZXB0OworICBQcm9jZXNzRGVzY3JpcHRvciYg
b3BlcmF0b3I9KFByb2Nlc3NEZXNjcmlwdG9yJiYpOworICBQcm9jZXNzRGVzY3JpcHRvcihjb25z
dCBQcm9jZXNzRGVzY3JpcHRvciYpOworICBQcm9jZXNzRGVzY3JpcHRvciYgb3BlcmF0b3I9KGNv
bnN0IFByb2Nlc3NEZXNjcmlwdG9yJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQcm9jZXNz
RGVzY3JpcHRvciYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUHJvY2Vzc0Rlc2Ny
aXB0b3ImIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJv
b2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6
c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9y
PHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJp
YWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19waWQoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsg
cmV0dXJuIHBpZF87IH0KKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsgcGlkXyA9IHZh
bHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBpbnQgY21kbGluZV9zaXplKCkgY29uc3Qg
eyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjbWRsaW5lXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0
ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY21kbGluZSgpIGNvbnN0IHsgcmV0dXJuIGNtZGxpbmVf
OyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9jbWRsaW5lKCkgeyByZXR1
cm4gJmNtZGxpbmVfOyB9CisgIHZvaWQgY2xlYXJfY21kbGluZSgpIHsgY21kbGluZV8uY2xlYXIo
KTsgfQorICB2b2lkIGFkZF9jbWRsaW5lKHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGNtZGxpbmVfLmVt
cGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9jbWRsaW5lKCkgeyBjbWRs
aW5lXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZjbWRsaW5lXy5iYWNrKCk7IH0KKworICBib29s
IGhhc19wcm9jZXNzX25hbWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s2XTsgfQorICBj
b25zdCBzdGQ6OnN0cmluZyYgcHJvY2Vzc19uYW1lKCkgY29uc3QgeyByZXR1cm4gcHJvY2Vzc19u
YW1lXzsgfQorICB2b2lkIHNldF9wcm9jZXNzX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7IHByb2Nlc3NfbmFtZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisKKyAgYm9v
bCBoYXNfcHJvY2Vzc19wcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9
CisgIGludDMyX3QgcHJvY2Vzc19wcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIHByb2Nlc3NfcHJp
b3JpdHlfOyB9CisgIHZvaWQgc2V0X3Byb2Nlc3NfcHJpb3JpdHkoaW50MzJfdCB2YWx1ZSkgeyBw
cm9jZXNzX3ByaW9yaXR5XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworICBib29s
IGhhc19jaHJvbWVfcHJvY2Vzc190eXBlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07
IH0KKyAgUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGUgY2hyb21lX3Byb2Nlc3Nf
dHlwZSgpIGNvbnN0IHsgcmV0dXJuIGNocm9tZV9wcm9jZXNzX3R5cGVfOyB9CisgIHZvaWQgc2V0
X2Nocm9tZV9wcm9jZXNzX3R5cGUoUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGUg
dmFsdWUpIHsgY2hyb21lX3Byb2Nlc3NfdHlwZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQp
OyB9CisKKyAgYm9vbCBoYXNfbGVnYWN5X3NvcnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1szXTsgfQorICBpbnQzMl90IGxlZ2FjeV9zb3J0X2luZGV4KCkgY29uc3QgeyByZXR1
cm4gbGVnYWN5X3NvcnRfaW5kZXhfOyB9CisgIHZvaWQgc2V0X2xlZ2FjeV9zb3J0X2luZGV4KGlu
dDMyX3QgdmFsdWUpIHsgbGVnYWN5X3NvcnRfaW5kZXhfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgzKTsgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBwaWRfe307CisgIHN0ZDo6dmVjdG9yPHN0
ZDo6c3RyaW5nPiBjbWRsaW5lXzsKKyAgc3RkOjpzdHJpbmcgcHJvY2Vzc19uYW1lX3t9OworICBp
bnQzMl90IHByb2Nlc3NfcHJpb3JpdHlfe307CisgIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVBy
b2Nlc3NUeXBlIGNocm9tZV9wcm9jZXNzX3R5cGVfe307CisgIGludDMyX3QgbGVnYWN5X3NvcnRf
aW5kZXhfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmll
bGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90
byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0
PDc+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8v
IG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX1BST0NFU1NfREVT
Q1JJUFRPUl9QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxk
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERP
IE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFn
bWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICIt
V2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJv
dG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3Byb2Nlc3NfZGVzY3JpcHRvci5nZW4uaCIK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdl
biB7CisKK1Byb2Nlc3NEZXNjcmlwdG9yOjpQcm9jZXNzRGVzY3JpcHRvcigpID0gZGVmYXVsdDsK
K1Byb2Nlc3NEZXNjcmlwdG9yOjp+UHJvY2Vzc0Rlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CitQcm9j
ZXNzRGVzY3JpcHRvcjo6UHJvY2Vzc0Rlc2NyaXB0b3IoY29uc3QgUHJvY2Vzc0Rlc2NyaXB0b3Im
KSA9IGRlZmF1bHQ7CitQcm9jZXNzRGVzY3JpcHRvciYgUHJvY2Vzc0Rlc2NyaXB0b3I6Om9wZXJh
dG9yPShjb25zdCBQcm9jZXNzRGVzY3JpcHRvciYpID0gZGVmYXVsdDsKK1Byb2Nlc3NEZXNjcmlw
dG9yOjpQcm9jZXNzRGVzY3JpcHRvcihQcm9jZXNzRGVzY3JpcHRvciYmKSBub2V4Y2VwdCA9IGRl
ZmF1bHQ7CitQcm9jZXNzRGVzY3JpcHRvciYgUHJvY2Vzc0Rlc2NyaXB0b3I6Om9wZXJhdG9yPShQ
cm9jZXNzRGVzY3JpcHRvciYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgUHJvY2Vzc0Rlc2NyaXB0b3I6
Om9wZXJhdG9yPT0oY29uc3QgUHJvY2Vzc0Rlc2NyaXB0b3ImIG90aGVyKSBjb25zdCB7CisgIHJl
dHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBwaWRf
ID09IG90aGVyLnBpZF8KKyAgICYmIGNtZGxpbmVfID09IG90aGVyLmNtZGxpbmVfCisgICAmJiBw
cm9jZXNzX25hbWVfID09IG90aGVyLnByb2Nlc3NfbmFtZV8KKyAgICYmIHByb2Nlc3NfcHJpb3Jp
dHlfID09IG90aGVyLnByb2Nlc3NfcHJpb3JpdHlfCisgICAmJiBjaHJvbWVfcHJvY2Vzc190eXBl
XyA9PSBvdGhlci5jaHJvbWVfcHJvY2Vzc190eXBlXworICAgJiYgbGVnYWN5X3NvcnRfaW5kZXhf
ID09IG90aGVyLmxlZ2FjeV9zb3J0X2luZGV4XzsKK30KKworYm9vbCBQcm9jZXNzRGVzY3JpcHRv
cjo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICBjbWRs
aW5lXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogcGlkICovOgorICAg
ICAgICBmaWVsZC5nZXQoJnBpZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBj
bWRsaW5lICovOgorICAgICAgICBjbWRsaW5lXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgZmll
bGQuZ2V0KCZjbWRsaW5lXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAv
KiBwcm9jZXNzX25hbWUgKi86CisgICAgICAgIGZpZWxkLmdldCgmcHJvY2Vzc19uYW1lXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1IC8qIHByb2Nlc3NfcHJpb3JpdHkgKi86CisgICAg
ICAgIGZpZWxkLmdldCgmcHJvY2Vzc19wcmlvcml0eV8pOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgNCAvKiBjaHJvbWVfcHJvY2Vzc190eXBlICovOgorICAgICAgICBmaWVsZC5nZXQoJmNo
cm9tZV9wcm9jZXNzX3R5cGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogbGVn
YWN5X3NvcnRfaW5kZXggKi86CisgICAgICAgIGZpZWxkLmdldCgmbGVnYWN5X3NvcnRfaW5kZXhf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxp
emVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitz
dGQ6OnN0cmluZyBQcm9jZXNzRGVzY3JpcHRvcjo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmco
KTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gUHJvY2Vzc0Rlc2NyaXB0b3I6OlNlcmlhbGl6
ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cu
U2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFByb2Nlc3NEZXNjcmlwdG9yOjpTZXJpYWxp
emUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBwaWQK
KyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgcGlkXyk7
CisgIH0KKworICAvLyBGaWVsZCAyOiBjbWRsaW5lCisgIGZvciAoYXV0byYgaXQgOiBjbWRsaW5l
XykgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDY6
IHByb2Nlc3NfbmFtZQorICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVuZFN0
cmluZyg2LCBwcm9jZXNzX25hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IHByb2Nlc3NfcHJp
b3JpdHkKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNSwg
cHJvY2Vzc19wcmlvcml0eV8pOworICB9CisKKyAgLy8gRmllbGQgNDogY2hyb21lX3Byb2Nlc3Nf
dHlwZQorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg0LCBj
aHJvbWVfcHJvY2Vzc190eXBlXyk7CisgIH0KKworICAvLyBGaWVsZCAzOiBsZWdhY3lfc29ydF9p
bmRleAorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgzLCBs
ZWdhY3lfc29ydF9pbmRleF8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVu
a25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCit9ICAv
LyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVz
cGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3NvdXJj
ZV9sb2NhdGlvbi5nZW4uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5P
VCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEg
R0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zs
b2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9z
L3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3NvdXJjZV9sb2NhdGlvbi5nZW4uaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisK
K1NvdXJjZUxvY2F0aW9uOjpTb3VyY2VMb2NhdGlvbigpID0gZGVmYXVsdDsKK1NvdXJjZUxvY2F0
aW9uOjp+U291cmNlTG9jYXRpb24oKSA9IGRlZmF1bHQ7CitTb3VyY2VMb2NhdGlvbjo6U291cmNl
TG9jYXRpb24oY29uc3QgU291cmNlTG9jYXRpb24mKSA9IGRlZmF1bHQ7CitTb3VyY2VMb2NhdGlv
biYgU291cmNlTG9jYXRpb246Om9wZXJhdG9yPShjb25zdCBTb3VyY2VMb2NhdGlvbiYpID0gZGVm
YXVsdDsKK1NvdXJjZUxvY2F0aW9uOjpTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiYmKSBu
b2V4Y2VwdCA9IGRlZmF1bHQ7CitTb3VyY2VMb2NhdGlvbiYgU291cmNlTG9jYXRpb246Om9wZXJh
dG9yPShTb3VyY2VMb2NhdGlvbiYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgU291cmNlTG9jYXRpb246
Om9wZXJhdG9yPT0oY29uc3QgU291cmNlTG9jYXRpb24mIG90aGVyKSBjb25zdCB7CisgIHJldHVy
biB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBpaWRfID09
IG90aGVyLmlpZF8KKyAgICYmIGZpbGVfbmFtZV8gPT0gb3RoZXIuZmlsZV9uYW1lXworICAgJiYg
ZnVuY3Rpb25fbmFtZV8gPT0gb3RoZXIuZnVuY3Rpb25fbmFtZV8KKyAgICYmIGxpbmVfbnVtYmVy
XyA9PSBvdGhlci5saW5lX251bWJlcl87Cit9CisKK2Jvb2wgU291cmNlTG9jYXRpb246OlBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVs
ZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3pl
cm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVj
LlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgewor
ICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2Zp
ZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgewor
ICAgICAgY2FzZSAxIC8qIGlpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZpaWRfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogZmlsZV9uYW1lICovOgorICAgICAgICBmaWVsZC5n
ZXQoJmZpbGVfbmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBmdW5jdGlv
bl9uYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJmZ1bmN0aW9uX25hbWVfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDQgLyogbGluZV9udW1iZXIgKi86CisgICAgICAgIGZpZWxkLmdl
dCgmbGluZV9udW1iZXJfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAg
ICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNf
bGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBTb3VyY2VMb2NhdGlvbjo6U2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gU291cmNlTG9jYXRpb246
OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8
Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJl
dHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFNvdXJjZUxvY2F0aW9uOjpT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAx
OiBpaWQKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwg
aWlkXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBmaWxlX25hbWUKKyAgaWYgKF9oYXNfZmllbGRf
WzJdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMiwgZmlsZV9uYW1lXyk7CisgIH0KKworICAv
LyBGaWVsZCAzOiBmdW5jdGlvbl9uYW1lCisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1z
Zy0+QXBwZW5kU3RyaW5nKDMsIGZ1bmN0aW9uX25hbWVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6
IGxpbmVfbnVtYmVyCisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAgIG1zZy0+QXBwZW5kVmFy
SW50KDQsIGxpbmVfbnVtYmVyXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXMo
dW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30g
IC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFt
ZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdGFz
a19leGVjdXRpb24uZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4v
cHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3Rhc2tfZXhlY3V0aW9uLmdlbi5oCisv
LyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisj
aWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRf
VEFTS19FWEVDVVRJT05fUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9U
T1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVEFTS19FWEVDVVRJT05fUFJPVE9fQ1BQX0hf
CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVj
dG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9t
ZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBUYXNrRXhl
Y3V0aW9uOworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9z
Cit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVz
c2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRPX0VY
UE9SVCBUYXNrRXhlY3V0aW9uIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsK
KyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrUG9zdGVkRnJvbUlpZEZpZWxk
TnVtYmVyID0gMSwKKyAgfTsKKworICBUYXNrRXhlY3V0aW9uKCk7CisgIH5UYXNrRXhlY3V0aW9u
KCkgb3ZlcnJpZGU7CisgIFRhc2tFeGVjdXRpb24oVGFza0V4ZWN1dGlvbiYmKSBub2V4Y2VwdDsK
KyAgVGFza0V4ZWN1dGlvbiYgb3BlcmF0b3I9KFRhc2tFeGVjdXRpb24mJik7CisgIFRhc2tFeGVj
dXRpb24oY29uc3QgVGFza0V4ZWN1dGlvbiYpOworICBUYXNrRXhlY3V0aW9uJiBvcGVyYXRvcj0o
Y29uc3QgVGFza0V4ZWN1dGlvbiYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVGFza0V4ZWN1
dGlvbiYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVGFza0V4ZWN1dGlvbiYgb3Ro
ZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZy
b21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4g
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3Bvc3RlZF9mcm9tX2lpZCgp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQ2NF90IHBvc3RlZF9mcm9t
X2lpZCgpIGNvbnN0IHsgcmV0dXJuIHBvc3RlZF9mcm9tX2lpZF87IH0KKyAgdm9pZCBzZXRfcG9z
dGVkX2Zyb21faWlkKHVpbnQ2NF90IHZhbHVlKSB7IHBvc3RlZF9mcm9tX2lpZF8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyBwcml2YXRlOgorICB1aW50NjRfdCBwb3N0ZWRfZnJv
bV9paWRfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmll
bGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90
byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0
PDI+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8v
IG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX1RBU0tfRVhFQ1VU
SU9OX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oIgorLy8gRE8gTk9U
IEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI3ByYWdtYSBH
Q0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZmxv
YXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3Mv
cGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdGFza19leGVjdXRpb24uZ2VuLmgiCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitU
YXNrRXhlY3V0aW9uOjpUYXNrRXhlY3V0aW9uKCkgPSBkZWZhdWx0OworVGFza0V4ZWN1dGlvbjo6
flRhc2tFeGVjdXRpb24oKSA9IGRlZmF1bHQ7CitUYXNrRXhlY3V0aW9uOjpUYXNrRXhlY3V0aW9u
KGNvbnN0IFRhc2tFeGVjdXRpb24mKSA9IGRlZmF1bHQ7CitUYXNrRXhlY3V0aW9uJiBUYXNrRXhl
Y3V0aW9uOjpvcGVyYXRvcj0oY29uc3QgVGFza0V4ZWN1dGlvbiYpID0gZGVmYXVsdDsKK1Rhc2tF
eGVjdXRpb246OlRhc2tFeGVjdXRpb24oVGFza0V4ZWN1dGlvbiYmKSBub2V4Y2VwdCA9IGRlZmF1
bHQ7CitUYXNrRXhlY3V0aW9uJiBUYXNrRXhlY3V0aW9uOjpvcGVyYXRvcj0oVGFza0V4ZWN1dGlv
biYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgVGFza0V4ZWN1dGlvbjo6b3BlcmF0b3I9PShjb25zdCBU
YXNrRXhlY3V0aW9uJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09
IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgcG9zdGVkX2Zyb21faWlkXyA9PSBvdGhlci5w
b3N0ZWRfZnJvbV9paWRfOworfQorCitib29sIFRhc2tFeGVjdXRpb246OlBhcnNlRnJvbUFycmF5
KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFy
KCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3Rv
RGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChm
aWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQo
ZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2Fz
ZSAxIC8qIHBvc3RlZF9mcm9tX2lpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwb3N0ZWRfZnJv
bV9paWRfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5T
ZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOwor
fQorCitzdGQ6OnN0cmluZyBUYXNrRXhlY3V0aW9uOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0
IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNn
OworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmlu
ZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBUYXNrRXhlY3V0aW9uOjpTZXJpYWxpemVB
c0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNl
cmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBUYXNrRXhlY3V0aW9uOjpTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBwb3N0ZWRfZnJv
bV9paWQKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwg
cG9zdGVkX2Zyb21faWlkXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5r
bm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8v
IG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNw
YWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdGhyZWFk
X2Rlc2NyaXB0b3IuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4v
cHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RocmVhZF9kZXNjcmlwdG9yLmdlbi5o
CisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2lu
CisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZF
TlRfVEhSRUFEX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVEhSRUFEX0RFU0NSSVBUT1JfUFJP
VE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5j
bHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4K
KworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFz
cyBUaHJlYWREZXNjcmlwdG9yOworZW51bSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5
cGUgOiBpbnQ7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90
b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CitjbGFzcyBN
ZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2UgcGVyZmV0dG8g
eworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2VudW0gVGhyZWFkRGVzY3Jp
cHRvcl9DaHJvbWVUaHJlYWRUeXBlIDogaW50IHsKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVU
aHJlYWRUeXBlX0NIUk9NRV9USFJFQURfVU5TUEVDSUZJRUQgPSAwLAorICBUaHJlYWREZXNjcmlw
dG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9NQUlOID0gMSwKKyAgVGhyZWFkRGVz
Y3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfSU8gPSAyLAorICBUaHJlYWRE
ZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9QT09MX0JHX1dPUktFUiA9
IDMsCisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1BP
T0xfRkdfV09SS0VSID0gNCwKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NI
Uk9NRV9USFJFQURfUE9PTF9GQl9CTE9DS0lORyA9IDUsCisgIFRocmVhZERlc2NyaXB0b3JfQ2hy
b21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1BPT0xfQkdfQkxPQ0tJTkcgPSA2LAorICBUaHJl
YWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9QT09MX1NFUlZJQ0Ug
PSA3LAorICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9D
T01QT1NJVE9SID0gOCwKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9N
RV9USFJFQURfVklaX0NPTVBPU0lUT1IgPSA5LAorICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRo
cmVhZFR5cGVfQ0hST01FX1RIUkVBRF9DT01QT1NJVE9SX1dPUktFUiA9IDEwLAorICBUaHJlYWRE
ZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9TRVJWSUNFX1dPUktFUiA9
IDExLAorICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9N
RU1PUllfSU5GUkEgPSA1MCwKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NI
Uk9NRV9USFJFQURfU0FNUExJTkdfUFJPRklMRVIgPSA1MSwKK307CisKK2NsYXNzIFBFUkZFVFRP
X0VYUE9SVCBUaHJlYWREZXNjcmlwdG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdl
T2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIENocm9tZVRocmVhZFR5cGUgPSBUaHJlYWREZXNjcmlw
dG9yX0Nocm9tZVRocmVhZFR5cGU7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDSFJPTUVfVEhS
RUFEX1VOU1BFQ0lGSUVEID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9N
RV9USFJFQURfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDSFJPTUVfVEhS
RUFEX01BSU4gPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVB
RF9NQUlOOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0hST01FX1RIUkVBRF9JTyA9IFRocmVh
ZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX0lPOworICBzdGF0aWMg
Y29uc3RleHByIGF1dG8gQ0hST01FX1RIUkVBRF9QT09MX0JHX1dPUktFUiA9IFRocmVhZERlc2Ny
aXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1BPT0xfQkdfV09SS0VSOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gQ0hST01FX1RIUkVBRF9QT09MX0ZHX1dPUktFUiA9IFRocmVh
ZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1BPT0xfRkdfV09SS0VS
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gQ0hST01FX1RIUkVBRF9QT09MX0ZCX0JMT0NLSU5H
ID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfUE9PTF9G
Ql9CTE9DS0lORzsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENIUk9NRV9USFJFQURfUE9PTF9C
R19CTE9DS0lORyA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhS
RUFEX1BPT0xfQkdfQkxPQ0tJTkc7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDSFJPTUVfVEhS
RUFEX1BPT0xfU0VSVklDRSA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJP
TUVfVEhSRUFEX1BPT0xfU0VSVklDRTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENIUk9NRV9U
SFJFQURfQ09NUE9TSVRPUiA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJP
TUVfVEhSRUFEX0NPTVBPU0lUT1I7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDSFJPTUVfVEhS
RUFEX1ZJWl9DT01QT1NJVE9SID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NI
Uk9NRV9USFJFQURfVklaX0NPTVBPU0lUT1I7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBDSFJP
TUVfVEhSRUFEX0NPTVBPU0lUT1JfV09SS0VSID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJl
YWRUeXBlX0NIUk9NRV9USFJFQURfQ09NUE9TSVRPUl9XT1JLRVI7CisgIHN0YXRpYyBjb25zdGV4
cHIgYXV0byBDSFJPTUVfVEhSRUFEX1NFUlZJQ0VfV09SS0VSID0gVGhyZWFkRGVzY3JpcHRvcl9D
aHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfU0VSVklDRV9XT1JLRVI7CisgIHN0YXRpYyBj
b25zdGV4cHIgYXV0byBDSFJPTUVfVEhSRUFEX01FTU9SWV9JTkZSQSA9IFRocmVhZERlc2NyaXB0
b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX01FTU9SWV9JTkZSQTsKKyAgc3RhdGlj
IGNvbnN0ZXhwciBhdXRvIENIUk9NRV9USFJFQURfU0FNUExJTkdfUFJPRklMRVIgPSBUaHJlYWRE
ZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9TQU1QTElOR19QUk9GSUxF
UjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIENocm9tZVRocmVhZFR5cGVfTUlOID0gVGhyZWFk
RGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfVU5TUEVDSUZJRUQ7Cisg
IHN0YXRpYyBjb25zdGV4cHIgYXV0byBDaHJvbWVUaHJlYWRUeXBlX01BWCA9IFRocmVhZERlc2Ny
aXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1NBTVBMSU5HX1BST0ZJTEVSOwor
ICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1BpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrVGlk
RmllbGROdW1iZXIgPSAyLAorICAgIGtUaHJlYWROYW1lRmllbGROdW1iZXIgPSA1LAorICAgIGtD
aHJvbWVUaHJlYWRUeXBlRmllbGROdW1iZXIgPSA0LAorICAgIGtSZWZlcmVuY2VUaW1lc3RhbXBV
c0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrUmVmZXJlbmNlVGhyZWFkVGltZVVzRmllbGROdW1iZXIg
PSA3LAorICAgIGtSZWZlcmVuY2VUaHJlYWRJbnN0cnVjdGlvbkNvdW50RmllbGROdW1iZXIgPSA4
LAorICAgIGtMZWdhY3lTb3J0SW5kZXhGaWVsZE51bWJlciA9IDMsCisgIH07CisKKyAgVGhyZWFk
RGVzY3JpcHRvcigpOworICB+VGhyZWFkRGVzY3JpcHRvcigpIG92ZXJyaWRlOworICBUaHJlYWRE
ZXNjcmlwdG9yKFRocmVhZERlc2NyaXB0b3ImJikgbm9leGNlcHQ7CisgIFRocmVhZERlc2NyaXB0
b3ImIG9wZXJhdG9yPShUaHJlYWREZXNjcmlwdG9yJiYpOworICBUaHJlYWREZXNjcmlwdG9yKGNv
bnN0IFRocmVhZERlc2NyaXB0b3ImKTsKKyAgVGhyZWFkRGVzY3JpcHRvciYgb3BlcmF0b3I9KGNv
bnN0IFRocmVhZERlc2NyaXB0b3ImKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRocmVhZERl
c2NyaXB0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRocmVhZERlc2NyaXB0
b3ImIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wg
UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3Ry
aW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVp
bnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxp
emUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19waWQoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0
dXJuIHBpZF87IH0KKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsgcGlkXyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc190aWQoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1syXTsgfQorICBpbnQzMl90IHRpZCgpIGNvbnN0IHsgcmV0dXJuIHRpZF87
IH0KKyAgdm9pZCBzZXRfdGlkKGludDMyX3QgdmFsdWUpIHsgdGlkXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc190aHJlYWRfbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzVdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlYWRfbmFtZSgpIGNv
bnN0IHsgcmV0dXJuIHRocmVhZF9uYW1lXzsgfQorICB2b2lkIHNldF90aHJlYWRfbmFtZShjb25z
dCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgdGhyZWFkX25hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCg1KTsgfQorCisgIGJvb2wgaGFzX2Nocm9tZV90aHJlYWRfdHlwZSgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlw
ZSBjaHJvbWVfdGhyZWFkX3R5cGUoKSBjb25zdCB7IHJldHVybiBjaHJvbWVfdGhyZWFkX3R5cGVf
OyB9CisgIHZvaWQgc2V0X2Nocm9tZV90aHJlYWRfdHlwZShUaHJlYWREZXNjcmlwdG9yX0Nocm9t
ZVRocmVhZFR5cGUgdmFsdWUpIHsgY2hyb21lX3RocmVhZF90eXBlXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoNCk7IH0KKworICBib29sIGhhc19yZWZlcmVuY2VfdGltZXN0YW1wX3VzKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bNl07IH0KKyAgaW50NjRfdCByZWZlcmVuY2VfdGltZXN0
YW1wX3VzKCkgY29uc3QgeyByZXR1cm4gcmVmZXJlbmNlX3RpbWVzdGFtcF91c187IH0KKyAgdm9p
ZCBzZXRfcmVmZXJlbmNlX3RpbWVzdGFtcF91cyhpbnQ2NF90IHZhbHVlKSB7IHJlZmVyZW5jZV90
aW1lc3RhbXBfdXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg2KTsgfQorCisgIGJvb2wgaGFz
X3JlZmVyZW5jZV90aHJlYWRfdGltZV91cygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzdd
OyB9CisgIGludDY0X3QgcmVmZXJlbmNlX3RocmVhZF90aW1lX3VzKCkgY29uc3QgeyByZXR1cm4g
cmVmZXJlbmNlX3RocmVhZF90aW1lX3VzXzsgfQorICB2b2lkIHNldF9yZWZlcmVuY2VfdGhyZWFk
X3RpbWVfdXMoaW50NjRfdCB2YWx1ZSkgeyByZWZlcmVuY2VfdGhyZWFkX3RpbWVfdXNfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCg3KTsgfQorCisgIGJvb2wgaGFzX3JlZmVyZW5jZV90aHJlYWRf
aW5zdHJ1Y3Rpb25fY291bnQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s4XTsgfQorICBp
bnQ2NF90IHJlZmVyZW5jZV90aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnQoKSBjb25zdCB7IHJldHVy
biByZWZlcmVuY2VfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50XzsgfQorICB2b2lkIHNldF9yZWZl
cmVuY2VfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50KGludDY0X3QgdmFsdWUpIHsgcmVmZXJlbmNl
X3RocmVhZF9pbnN0cnVjdGlvbl9jb3VudF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDgpOyB9
CisKKyAgYm9vbCBoYXNfbGVnYWN5X3NvcnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1szXTsgfQorICBpbnQzMl90IGxlZ2FjeV9zb3J0X2luZGV4KCkgY29uc3QgeyByZXR1cm4g
bGVnYWN5X3NvcnRfaW5kZXhfOyB9CisgIHZvaWQgc2V0X2xlZ2FjeV9zb3J0X2luZGV4KGludDMy
X3QgdmFsdWUpIHsgbGVnYWN5X3NvcnRfaW5kZXhfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgz
KTsgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBwaWRfe307CisgIGludDMyX3QgdGlkX3t9Owor
ICBzdGQ6OnN0cmluZyB0aHJlYWRfbmFtZV97fTsKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVU
aHJlYWRUeXBlIGNocm9tZV90aHJlYWRfdHlwZV97fTsKKyAgaW50NjRfdCByZWZlcmVuY2VfdGlt
ZXN0YW1wX3VzX3t9OworICBpbnQ2NF90IHJlZmVyZW5jZV90aHJlYWRfdGltZV91c197fTsKKyAg
aW50NjRfdCByZWZlcmVuY2VfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50X3t9OworICBpbnQzMl90
IGxlZ2FjeV9zb3J0X2luZGV4X3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3du
IHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJz
aW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKwor
ICBzdGQ6OmJpdHNldDw5PiBfaGFzX2ZpZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNl
bmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVO
VF9USFJFQURfREVTQ1JJUFRPUl9QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3Jl
cGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZm
ZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9w
bHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3Rp
YyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RocmVhZF9kZXNjcmlw
dG9yLmdlbi5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7Citu
YW1lc3BhY2UgZ2VuIHsKKworVGhyZWFkRGVzY3JpcHRvcjo6VGhyZWFkRGVzY3JpcHRvcigpID0g
ZGVmYXVsdDsKK1RocmVhZERlc2NyaXB0b3I6On5UaHJlYWREZXNjcmlwdG9yKCkgPSBkZWZhdWx0
OworVGhyZWFkRGVzY3JpcHRvcjo6VGhyZWFkRGVzY3JpcHRvcihjb25zdCBUaHJlYWREZXNjcmlw
dG9yJikgPSBkZWZhdWx0OworVGhyZWFkRGVzY3JpcHRvciYgVGhyZWFkRGVzY3JpcHRvcjo6b3Bl
cmF0b3I9KGNvbnN0IFRocmVhZERlc2NyaXB0b3ImKSA9IGRlZmF1bHQ7CitUaHJlYWREZXNjcmlw
dG9yOjpUaHJlYWREZXNjcmlwdG9yKFRocmVhZERlc2NyaXB0b3ImJikgbm9leGNlcHQgPSBkZWZh
dWx0OworVGhyZWFkRGVzY3JpcHRvciYgVGhyZWFkRGVzY3JpcHRvcjo6b3BlcmF0b3I9KFRocmVh
ZERlc2NyaXB0b3ImJikgPSBkZWZhdWx0OworCitib29sIFRocmVhZERlc2NyaXB0b3I6Om9wZXJh
dG9yPT0oY29uc3QgVGhyZWFkRGVzY3JpcHRvciYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVu
a25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHBpZF8gPT0gb3Ro
ZXIucGlkXworICAgJiYgdGlkXyA9PSBvdGhlci50aWRfCisgICAmJiB0aHJlYWRfbmFtZV8gPT0g
b3RoZXIudGhyZWFkX25hbWVfCisgICAmJiBjaHJvbWVfdGhyZWFkX3R5cGVfID09IG90aGVyLmNo
cm9tZV90aHJlYWRfdHlwZV8KKyAgICYmIHJlZmVyZW5jZV90aW1lc3RhbXBfdXNfID09IG90aGVy
LnJlZmVyZW5jZV90aW1lc3RhbXBfdXNfCisgICAmJiByZWZlcmVuY2VfdGhyZWFkX3RpbWVfdXNf
ID09IG90aGVyLnJlZmVyZW5jZV90aHJlYWRfdGltZV91c18KKyAgICYmIHJlZmVyZW5jZV90aHJl
YWRfaW5zdHJ1Y3Rpb25fY291bnRfID09IG90aGVyLnJlZmVyZW5jZV90aHJlYWRfaW5zdHJ1Y3Rp
b25fY291bnRfCisgICAmJiBsZWdhY3lfc29ydF9pbmRleF8gPT0gb3RoZXIubGVnYWN5X3NvcnRf
aW5kZXhfOworfQorCitib29sIFRocmVhZERlc2NyaXB0b3I6OlBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7Cisg
IGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2Rl
ciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBm
aWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5p
ZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQu
aWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8q
IHBpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwaWRfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDIgLyogdGlkICovOgorICAgICAgICBmaWVsZC5nZXQoJnRpZF8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGNhc2UgNSAvKiB0aHJlYWRfbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0
KCZ0aHJlYWRfbmFtZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBjaHJvbWVf
dGhyZWFkX3R5cGUgKi86CisgICAgICAgIGZpZWxkLmdldCgmY2hyb21lX3RocmVhZF90eXBlXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8qIHJlZmVyZW5jZV90aW1lc3RhbXBfdXMg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmcmVmZXJlbmNlX3RpbWVzdGFtcF91c18pOworICAgICAg
ICBicmVhazsKKyAgICAgIGNhc2UgNyAvKiByZWZlcmVuY2VfdGhyZWFkX3RpbWVfdXMgKi86Cisg
ICAgICAgIGZpZWxkLmdldCgmcmVmZXJlbmNlX3RocmVhZF90aW1lX3VzXyk7CisgICAgICAgIGJy
ZWFrOworICAgICAgY2FzZSA4IC8qIHJlZmVyZW5jZV90aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnQg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmcmVmZXJlbmNlX3RocmVhZF9pbnN0cnVjdGlvbl9jb3Vu
dF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMyAvKiBsZWdhY3lfc29ydF9pbmRleCAq
LzoKKyAgICAgICAgZmllbGQuZ2V0KCZsZWdhY3lfc29ydF9pbmRleF8pOworICAgICAgICBicmVh
azsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1
bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFw
YWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRocmVh
ZERlc2NyaXB0b3I6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cu
Z2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVj
dG9yPHVpbnQ4X3Q+IFRocmVhZERlc2NyaXB0b3I6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgp
OworfQorCit2b2lkIFRocmVhZERlc2NyaXB0b3I6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVz
c2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IHBpZAorICBpZiAoX2hhc19maWVsZF9b
MV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCBwaWRfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDI6IHRpZAorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgy
LCB0aWRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6IHRocmVhZF9uYW1lCisgIGlmIChfaGFzX2Zp
ZWxkX1s1XSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDUsIHRocmVhZF9uYW1lXyk7CisgIH0K
KworICAvLyBGaWVsZCA0OiBjaHJvbWVfdGhyZWFkX3R5cGUKKyAgaWYgKF9oYXNfZmllbGRfWzRd
KSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNCwgY2hyb21lX3RocmVhZF90eXBlXyk7CisgIH0K
KworICAvLyBGaWVsZCA2OiByZWZlcmVuY2VfdGltZXN0YW1wX3VzCisgIGlmIChfaGFzX2ZpZWxk
X1s2XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDYsIHJlZmVyZW5jZV90aW1lc3RhbXBfdXNf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDc6IHJlZmVyZW5jZV90aHJlYWRfdGltZV91cworICBpZiAo
X2hhc19maWVsZF9bN10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg3LCByZWZlcmVuY2VfdGhy
ZWFkX3RpbWVfdXNfKTsKKyAgfQorCisgIC8vIEZpZWxkIDg6IHJlZmVyZW5jZV90aHJlYWRfaW5z
dHJ1Y3Rpb25fY291bnQKKyAgaWYgKF9oYXNfZmllbGRfWzhdKSB7CisgICAgbXNnLT5BcHBlbmRW
YXJJbnQoOCwgcmVmZXJlbmNlX3RocmVhZF9pbnN0cnVjdGlvbl9jb3VudF8pOworICB9CisKKyAg
Ly8gRmllbGQgMzogbGVnYWN5X3NvcnRfaW5kZXgKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMywgbGVnYWN5X3NvcnRfaW5kZXhfKTsKKyAgfQorCisgIG1z
Zy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2Zp
ZWxkc18uc2l6ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1l
c3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGlj
IHBvcAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0
by90cmFjZS90cmFja19ldmVudC90cmFja19kZXNjcmlwdG9yLmdlbi5jYworLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVu
dC90cmFja19kZXNjcmlwdG9yLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBi
eSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfREVTQ1JJUFRPUl9QUk9UT19DUFBfSF8K
KyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVO
VF9UUkFDS19ERVNDUklQVE9SX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+Cisj
aW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+Cisj
aW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9w
dHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jh
c2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsK
K25hbWVzcGFjZSBnZW4geworY2xhc3MgVHJhY2tEZXNjcmlwdG9yOworY2xhc3MgQ291bnRlckRl
c2NyaXB0b3I7CitjbGFzcyBDaHJvbWVUaHJlYWREZXNjcmlwdG9yOworY2xhc3MgVGhyZWFkRGVz
Y3JpcHRvcjsKK2NsYXNzIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yOworY2xhc3MgUHJvY2Vzc0Rl
c2NyaXB0b3I7CitlbnVtIENvdW50ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3VudGVyVHlwZSA6IGlu
dDsKK2VudW0gQ291bnRlckRlc2NyaXB0b3JfVW5pdCA6IGludDsKK2VudW0gQ2hyb21lVGhyZWFk
RGVzY3JpcHRvcl9UaHJlYWRUeXBlIDogaW50OworZW51bSBUaHJlYWREZXNjcmlwdG9yX0Nocm9t
ZVRocmVhZFR5cGUgOiBpbnQ7CitlbnVtIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NU
eXBlIDogaW50OworZW51bSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZSA6IGlu
dDsKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAg
Ly8gbmFtZXNwYWNlIGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
VHJhY2tEZXNjcmlwdG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBw
dWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrVXVpZEZpZWxkTnVtYmVyID0gMSwK
KyAgICBrUGFyZW50VXVpZEZpZWxkTnVtYmVyID0gNSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0g
MiwKKyAgICBrUHJvY2Vzc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrQ2hyb21lUHJvY2Vzc0ZpZWxk
TnVtYmVyID0gNiwKKyAgICBrVGhyZWFkRmllbGROdW1iZXIgPSA0LAorICAgIGtDaHJvbWVUaHJl
YWRGaWVsZE51bWJlciA9IDcsCisgICAga0NvdW50ZXJGaWVsZE51bWJlciA9IDgsCisgIH07CisK
KyAgVHJhY2tEZXNjcmlwdG9yKCk7CisgIH5UcmFja0Rlc2NyaXB0b3IoKSBvdmVycmlkZTsKKyAg
VHJhY2tEZXNjcmlwdG9yKFRyYWNrRGVzY3JpcHRvciYmKSBub2V4Y2VwdDsKKyAgVHJhY2tEZXNj
cmlwdG9yJiBvcGVyYXRvcj0oVHJhY2tEZXNjcmlwdG9yJiYpOworICBUcmFja0Rlc2NyaXB0b3Io
Y29uc3QgVHJhY2tEZXNjcmlwdG9yJik7CisgIFRyYWNrRGVzY3JpcHRvciYgb3BlcmF0b3I9KGNv
bnN0IFRyYWNrRGVzY3JpcHRvciYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2tEZXNj
cmlwdG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFja0Rlc2NyaXB0b3Im
IG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFy
c2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5n
IFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4
X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUo
Ojpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc191dWlkKCkgY29uc3Qg
eyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDY0X3QgdXVpZCgpIGNvbnN0IHsgcmV0
dXJuIHV1aWRfOyB9CisgIHZvaWQgc2V0X3V1aWQodWludDY0X3QgdmFsdWUpIHsgdXVpZF8gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfcGFyZW50X3V1aWQoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s1XTsgfQorICB1aW50NjRfdCBwYXJlbnRfdXVpZCgp
IGNvbnN0IHsgcmV0dXJuIHBhcmVudF91dWlkXzsgfQorICB2b2lkIHNldF9wYXJlbnRfdXVpZCh1
aW50NjRfdCB2YWx1ZSkgeyBwYXJlbnRfdXVpZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDUp
OyB9CisKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9
CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKyAg
dm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgbmFtZV8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9vbCBoYXNfcHJvY2VzcygpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGNvbnN0IFByb2Nlc3NEZXNjcmlwdG9yJiBwcm9jZXNz
KCkgY29uc3QgeyByZXR1cm4gKnByb2Nlc3NfOyB9CisgIFByb2Nlc3NEZXNjcmlwdG9yKiBtdXRh
YmxlX3Byb2Nlc3MoKSB7IF9oYXNfZmllbGRfLnNldCgzKTsgcmV0dXJuIHByb2Nlc3NfLmdldCgp
OyB9CisKKyAgYm9vbCBoYXNfY2hyb21lX3Byb2Nlc3MoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1s2XTsgfQorICBjb25zdCBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvciYgY2hyb21lX3Byb2Nl
c3MoKSBjb25zdCB7IHJldHVybiAqY2hyb21lX3Byb2Nlc3NfOyB9CisgIENocm9tZVByb2Nlc3NE
ZXNjcmlwdG9yKiBtdXRhYmxlX2Nocm9tZV9wcm9jZXNzKCkgeyBfaGFzX2ZpZWxkXy5zZXQoNik7
IHJldHVybiBjaHJvbWVfcHJvY2Vzc18uZ2V0KCk7IH0KKworICBib29sIGhhc190aHJlYWQoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICBjb25zdCBUaHJlYWREZXNjcmlwdG9y
JiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiAqdGhyZWFkXzsgfQorICBUaHJlYWREZXNjcmlwdG9y
KiBtdXRhYmxlX3RocmVhZCgpIHsgX2hhc19maWVsZF8uc2V0KDQpOyByZXR1cm4gdGhyZWFkXy5n
ZXQoKTsgfQorCisgIGJvb2wgaGFzX2Nocm9tZV90aHJlYWQoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1s3XTsgfQorICBjb25zdCBDaHJvbWVUaHJlYWREZXNjcmlwdG9yJiBjaHJvbWVfdGhy
ZWFkKCkgY29uc3QgeyByZXR1cm4gKmNocm9tZV90aHJlYWRfOyB9CisgIENocm9tZVRocmVhZERl
c2NyaXB0b3IqIG11dGFibGVfY2hyb21lX3RocmVhZCgpIHsgX2hhc19maWVsZF8uc2V0KDcpOyBy
ZXR1cm4gY2hyb21lX3RocmVhZF8uZ2V0KCk7IH0KKworICBib29sIGhhc19jb3VudGVyKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bOF07IH0KKyAgY29uc3QgQ291bnRlckRlc2NyaXB0b3Im
IGNvdW50ZXIoKSBjb25zdCB7IHJldHVybiAqY291bnRlcl87IH0KKyAgQ291bnRlckRlc2NyaXB0
b3IqIG11dGFibGVfY291bnRlcigpIHsgX2hhc19maWVsZF8uc2V0KDgpOyByZXR1cm4gY291bnRl
cl8uZ2V0KCk7IH0KKworIHByaXZhdGU6CisgIHVpbnQ2NF90IHV1aWRfe307CisgIHVpbnQ2NF90
IHBhcmVudF91dWlkX3t9OworICBzdGQ6OnN0cmluZyBuYW1lX3t9OworICA6OnByb3RvemVybzo6
Q29weWFibGVQdHI8UHJvY2Vzc0Rlc2NyaXB0b3I+IHByb2Nlc3NfOworICA6OnByb3RvemVybzo6
Q29weWFibGVQdHI8Q2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3I+IGNocm9tZV9wcm9jZXNzXzsKKyAg
Ojpwcm90b3plcm86OkNvcHlhYmxlUHRyPFRocmVhZERlc2NyaXB0b3I+IHRocmVhZF87CisgIDo6
cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxDaHJvbWVUaHJlYWREZXNjcmlwdG9yPiBjaHJvbWVfdGhy
ZWFkXzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPENvdW50ZXJEZXNjcmlwdG9yPiBjb3Vu
dGVyXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMg
Zm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZp
bGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8OT4g
X2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFt
ZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfREVTQ1JJUFRP
Ul9QUk9UT19DUFBfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBF
RElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0ND
IGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0
LWVxdWFsIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3Bl
cmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RyYWNrX2Rlc2NyaXB0b3IuZ2VuLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJh
Y2tfZXZlbnQvY291bnRlcl9kZXNjcmlwdG9yLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RocmVh
ZF9kZXNjcmlwdG9yLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3Byb2Nlc3NfZGVzY3JpcHRvci5n
ZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJm
ZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfdGhyZWFkX2Rlc2NyaXB0b3IuZ2VuLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJh
Y2UvdHJhY2tfZXZlbnQvY2hyb21lX3Byb2Nlc3NfZGVzY3JpcHRvci5nZW4uaCIKKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK1Ry
YWNrRGVzY3JpcHRvcjo6VHJhY2tEZXNjcmlwdG9yKCkgPSBkZWZhdWx0OworVHJhY2tEZXNjcmlw
dG9yOjp+VHJhY2tEZXNjcmlwdG9yKCkgPSBkZWZhdWx0OworVHJhY2tEZXNjcmlwdG9yOjpUcmFj
a0Rlc2NyaXB0b3IoY29uc3QgVHJhY2tEZXNjcmlwdG9yJikgPSBkZWZhdWx0OworVHJhY2tEZXNj
cmlwdG9yJiBUcmFja0Rlc2NyaXB0b3I6Om9wZXJhdG9yPShjb25zdCBUcmFja0Rlc2NyaXB0b3Im
KSA9IGRlZmF1bHQ7CitUcmFja0Rlc2NyaXB0b3I6OlRyYWNrRGVzY3JpcHRvcihUcmFja0Rlc2Ny
aXB0b3ImJikgbm9leGNlcHQgPSBkZWZhdWx0OworVHJhY2tEZXNjcmlwdG9yJiBUcmFja0Rlc2Ny
aXB0b3I6Om9wZXJhdG9yPShUcmFja0Rlc2NyaXB0b3ImJikgPSBkZWZhdWx0OworCitib29sIFRy
YWNrRGVzY3JpcHRvcjo6b3BlcmF0b3I9PShjb25zdCBUcmFja0Rlc2NyaXB0b3ImIG90aGVyKSBj
b25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNf
CisgICAmJiB1dWlkXyA9PSBvdGhlci51dWlkXworICAgJiYgcGFyZW50X3V1aWRfID09IG90aGVy
LnBhcmVudF91dWlkXworICAgJiYgbmFtZV8gPT0gb3RoZXIubmFtZV8KKyAgICYmIHByb2Nlc3Nf
ID09IG90aGVyLnByb2Nlc3NfCisgICAmJiBjaHJvbWVfcHJvY2Vzc18gPT0gb3RoZXIuY2hyb21l
X3Byb2Nlc3NfCisgICAmJiB0aHJlYWRfID09IG90aGVyLnRocmVhZF8KKyAgICYmIGNocm9tZV90
aHJlYWRfID09IG90aGVyLmNocm9tZV90aHJlYWRfCisgICAmJiBjb3VudGVyXyA9PSBvdGhlci5j
b3VudGVyXzsKK30KKworYm9vbCBUcmFja0Rlc2NyaXB0b3I6OlBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7Cisg
IGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2Rl
ciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBm
aWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5p
ZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQu
aWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8q
IHV1aWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmdXVpZF8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgNSAvKiBwYXJlbnRfdXVpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwYXJlbnRf
dXVpZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBuYW1lICovOgorICAgICAg
ICBmaWVsZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogcHJv
Y2VzcyAqLzoKKyAgICAgICAgKCpwcm9jZXNzXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0
ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8qIGNocm9tZV9wcm9j
ZXNzICovOgorICAgICAgICAoKmNocm9tZV9wcm9jZXNzXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxk
LmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0IC8qIHRocmVh
ZCAqLzoKKyAgICAgICAgKCp0aHJlYWRfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0
cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDcgLyogY2hyb21lX3RocmVhZCAq
LzoKKyAgICAgICAgKCpjaHJvbWVfdGhyZWFkXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0
ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIGNvdW50ZXIgKi86
CisgICAgICAgICgqY291bnRlcl8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5n
KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlh
bGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9
CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisK
K3N0ZDo6c3RyaW5nIFRyYWNrRGVzY3JpcHRvcjo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmco
KTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVHJhY2tEZXNjcmlwdG9yOjpTZXJpYWxpemVB
c0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNl
cmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBUcmFja0Rlc2NyaXB0b3I6OlNlcmlhbGl6ZSg6
OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IHV1aWQKKyAg
aWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgdXVpZF8pOwor
ICB9CisKKyAgLy8gRmllbGQgNTogcGFyZW50X3V1aWQKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7
CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNSwgcGFyZW50X3V1aWRfKTsKKyAgfQorCisgIC8vIEZp
ZWxkIDI6IG5hbWUKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJp
bmcoMiwgbmFtZV8pOworICB9CisKKyAgLy8gRmllbGQgMzogcHJvY2VzcworICBpZiAoX2hhc19m
aWVsZF9bM10pIHsKKyAgICAoKnByb2Nlc3NfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1l
c3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDMpKTsKKyAgfQorCisgIC8vIEZpZWxkIDY6IGNo
cm9tZV9wcm9jZXNzCisgIGlmIChfaGFzX2ZpZWxkX1s2XSkgeworICAgICgqY2hyb21lX3Byb2Nl
c3NfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3Nh
Z2U+KDYpKTsKKyAgfQorCisgIC8vIEZpZWxkIDQ6IHRocmVhZAorICBpZiAoX2hhc19maWVsZF9b
NF0pIHsKKyAgICAoKnRocmVhZF8pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6
OnByb3RvemVybzo6TWVzc2FnZT4oNCkpOworICB9CisKKyAgLy8gRmllbGQgNzogY2hyb21lX3Ro
cmVhZAorICBpZiAoX2hhc19maWVsZF9bN10pIHsKKyAgICAoKmNocm9tZV90aHJlYWRfKS5TZXJp
YWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDcpKTsK
KyAgfQorCisgIC8vIEZpZWxkIDg6IGNvdW50ZXIKKyAgaWYgKF9oYXNfZmllbGRfWzhdKSB7Cisg
ICAgKCpjb3VudGVyXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96
ZXJvOjpNZXNzYWdlPig4KSk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5r
bm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8v
IG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNw
YWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdHJhY2tf
ZXZlbnQuZ2VuLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9z
L3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RyYWNrX2V2ZW50Lmdlbi5oCisvLyBETyBOT1Qg
RURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfRVZF
TlRfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
VFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfRVZFTlRfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxz
dGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUg
PHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFj
ZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBFdmVudE5hbWU7CitjbGFzcyBFdmVu
dENhdGVnb3J5OworY2xhc3MgVHJhY2tFdmVudERlZmF1bHRzOworY2xhc3MgVHJhY2tFdmVudDsK
K2NsYXNzIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQ7CitjbGFzcyBDaHJvbWVGcmFtZVJlcG9ydGVy
OworY2xhc3MgQ2hyb21lTGF0ZW5jeUluZm87CitjbGFzcyBDaHJvbWVMYXRlbmN5SW5mb19Db21w
b25lbnRJbmZvOworY2xhc3MgQ2hyb21lSGlzdG9ncmFtU2FtcGxlOworY2xhc3MgQ2hyb21lTGVn
YWN5SXBjOworY2xhc3MgQ2hyb21lS2V5ZWRTZXJ2aWNlOworY2xhc3MgQ2hyb21lVXNlckV2ZW50
OworY2xhc3MgQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlOworY2xhc3MgQ29tcG9zaXRv
clRpbWluZ0hpc3Rvcnk7CitjbGFzcyBCZWdpbkZyYW1lU291cmNlU3RhdGU7CitjbGFzcyBCZWdp
bkZyYW1lQXJnczsKK2NsYXNzIFNvdXJjZUxvY2F0aW9uOworY2xhc3MgQmVnaW5GcmFtZU9ic2Vy
dmVyU3RhdGU7CitjbGFzcyBCZWdpbkltcGxGcmFtZUFyZ3M7CitjbGFzcyBCZWdpbkltcGxGcmFt
ZUFyZ3NfVGltZXN0YW1wc0luVXM7CitjbGFzcyBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5l
OworY2xhc3MgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlOworY2xhc3Mg
Q2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlOworY2xhc3MgTG9nTWVzc2Fn
ZTsKK2NsYXNzIFRhc2tFeGVjdXRpb247CitjbGFzcyBEZWJ1Z0Fubm90YXRpb247CitjbGFzcyBE
ZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU7CitlbnVtIFRyYWNrRXZlbnRfVHlwZSA6IGludDsK
K2VudW0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uIDogaW50OworZW51bSBU
cmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlIDogaW50OworZW51bSBDaHJv
bWVGcmFtZVJlcG9ydGVyX1N0YXRlIDogaW50OworZW51bSBDaHJvbWVGcmFtZVJlcG9ydGVyX0Zy
YW1lRHJvcFJlYXNvbiA6IGludDsKK2VudW0gQ2hyb21lTGF0ZW5jeUluZm9fU3RlcCA6IGludDsK
K2VudW0gQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGUgOiBpbnQ7CitlbnVt
IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3MgOiBpbnQ7CitlbnVtIENocm9tZUNvbXBvc2l0
b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZSA6IGludDsKK2VudW0g
Q2hyb21lQ29tcG9zaXRvclNjaGVkdWxlckFjdGlvbiA6IGludDsKK2VudW0gQmVnaW5GcmFtZUFy
Z3NfQmVnaW5GcmFtZUFyZ3NUeXBlIDogaW50OworZW51bSBCZWdpbkltcGxGcmFtZUFyZ3NfU3Rh
dGUgOiBpbnQ7CitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9U
cmVlUHJpb3JpdHkgOiBpbnQ7CitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlu
b3JTdGF0ZV9TY3JvbGxIYW5kbGVyU3RhdGUgOiBpbnQ7CitlbnVtIENocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlIDogaW50OworZW51bSBD
aHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5NYWluRnJhbWVTdGF0
ZSA6IGludDsKK2VudW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xh
eWVyVHJlZUZyYW1lU2lua1N0YXRlIDogaW50OworZW51bSBDaHJvbWVDb21wb3NpdG9yU3RhdGVN
YWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGUgOiBpbnQ7CitlbnVt
IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlIDogaW50OworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2Ug
Z2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVz
cGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mg
eworbmFtZXNwYWNlIGdlbiB7CitlbnVtIFRyYWNrRXZlbnRfVHlwZSA6IGludCB7CisgIFRyYWNr
RXZlbnRfVHlwZV9UWVBFX1VOU1BFQ0lGSUVEID0gMCwKKyAgVHJhY2tFdmVudF9UeXBlX1RZUEVf
U0xJQ0VfQkVHSU4gPSAxLAorICBUcmFja0V2ZW50X1R5cGVfVFlQRV9TTElDRV9FTkQgPSAyLAor
ICBUcmFja0V2ZW50X1R5cGVfVFlQRV9JTlNUQU5UID0gMywKKyAgVHJhY2tFdmVudF9UeXBlX1RZ
UEVfQ09VTlRFUiA9IDQsCit9OworZW51bSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJl
Y3Rpb24gOiBpbnQgeworICBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb25fRkxP
V19VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlv
bl9GTE9XX0lOID0gMSwKKyAgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX0ZM
T1dfT1VUID0gMiwKKyAgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX0ZMT1df
SU5PVVQgPSAzLAorfTsKK2VudW0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRT
Y29wZSA6IGludCB7CisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVf
U0NPUEVfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRF
dmVudFNjb3BlX1NDT1BFX0dMT0JBTCA9IDEsCisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5z
dGFudEV2ZW50U2NvcGVfU0NPUEVfUFJPQ0VTUyA9IDIsCisgIFRyYWNrRXZlbnRfTGVnYWN5RXZl
bnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVEhSRUFEID0gMywKK307CisKK2NsYXNzIFBFUkZF
VFRPX0VYUE9SVCBFdmVudE5hbWUgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmog
eworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtJaWRGaWVsZE51bWJlciA9
IDEsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIsCisgIH07CisKKyAgRXZlbnROYW1lKCk7Cisg
IH5FdmVudE5hbWUoKSBvdmVycmlkZTsKKyAgRXZlbnROYW1lKEV2ZW50TmFtZSYmKSBub2V4Y2Vw
dDsKKyAgRXZlbnROYW1lJiBvcGVyYXRvcj0oRXZlbnROYW1lJiYpOworICBFdmVudE5hbWUoY29u
c3QgRXZlbnROYW1lJik7CisgIEV2ZW50TmFtZSYgb3BlcmF0b3I9KGNvbnN0IEV2ZW50TmFtZSYp
OworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXZlbnROYW1lJikgY29uc3Q7CisgIGJvb2wgb3Bl
cmF0b3IhPShjb25zdCBFdmVudE5hbWUmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09
IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkg
b3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJp
ZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVy
cmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKwor
ICBib29sIGhhc19paWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50
NjRfdCBpaWQoKSBjb25zdCB7IHJldHVybiBpaWRfOyB9CisgIHZvaWQgc2V0X2lpZCh1aW50NjRf
dCB2YWx1ZSkgeyBpaWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wg
aGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBjb25zdCBzdGQ6
OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUo
Y29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgyKTsgfQorCisgcHJpdmF0ZToKKyAgdWludDY0X3QgaWlkX3t9OworICBzdGQ6OnN0cmluZyBu
YW1lX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxk
cyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8g
ZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwz
PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgRXZlbnRDYXRl
Z29yeSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBl
bnVtIEZpZWxkTnVtYmVycyB7CisgICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmFtZUZp
ZWxkTnVtYmVyID0gMiwKKyAgfTsKKworICBFdmVudENhdGVnb3J5KCk7CisgIH5FdmVudENhdGVn
b3J5KCkgb3ZlcnJpZGU7CisgIEV2ZW50Q2F0ZWdvcnkoRXZlbnRDYXRlZ29yeSYmKSBub2V4Y2Vw
dDsKKyAgRXZlbnRDYXRlZ29yeSYgb3BlcmF0b3I9KEV2ZW50Q2F0ZWdvcnkmJik7CisgIEV2ZW50
Q2F0ZWdvcnkoY29uc3QgRXZlbnRDYXRlZ29yeSYpOworICBFdmVudENhdGVnb3J5JiBvcGVyYXRv
cj0oY29uc3QgRXZlbnRDYXRlZ29yeSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXZlbnRD
YXRlZ29yeSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRXZlbnRDYXRlZ29yeSYg
b3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcg
U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhf
dD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6
OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX2lpZCgpIGNvbnN0IHsg
cmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJu
IGlpZF87IH0KKyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90IHZhbHVlKSB7IGlpZF8gPSB2YWx1ZTsg
X2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzJdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyBy
ZXR1cm4gbmFtZV87IH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUp
IHsgbmFtZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyBwcml2YXRlOgorICB1
aW50NjRfdCBpaWRfe307CisgIHN0ZDo6c3RyaW5nIG5hbWVfe307CisKKyAgLy8gQWxsb3dzIHRv
IHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8v
IHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5r
bm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9OworCisK
K2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFja0V2ZW50RGVmYXVsdHMgOiBwdWJsaWMgOjpwcm90
b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgewor
ICAgIGtUcmFja1V1aWRGaWVsZE51bWJlciA9IDExLAorICAgIGtFeHRyYUNvdW50ZXJUcmFja1V1
aWRzRmllbGROdW1iZXIgPSAzMSwKKyAgfTsKKworICBUcmFja0V2ZW50RGVmYXVsdHMoKTsKKyAg
flRyYWNrRXZlbnREZWZhdWx0cygpIG92ZXJyaWRlOworICBUcmFja0V2ZW50RGVmYXVsdHMoVHJh
Y2tFdmVudERlZmF1bHRzJiYpIG5vZXhjZXB0OworICBUcmFja0V2ZW50RGVmYXVsdHMmIG9wZXJh
dG9yPShUcmFja0V2ZW50RGVmYXVsdHMmJik7CisgIFRyYWNrRXZlbnREZWZhdWx0cyhjb25zdCBU
cmFja0V2ZW50RGVmYXVsdHMmKTsKKyAgVHJhY2tFdmVudERlZmF1bHRzJiBvcGVyYXRvcj0oY29u
c3QgVHJhY2tFdmVudERlZmF1bHRzJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFja0V2
ZW50RGVmYXVsdHMmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNrRXZlbnRE
ZWZhdWx0cyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAg
Ym9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3Rk
OjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0
b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3RyYWNr
X3V1aWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxMV07IH0KKyAgdWludDY0X3QgdHJh
Y2tfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIHRyYWNrX3V1aWRfOyB9CisgIHZvaWQgc2V0X3RyYWNr
X3V1aWQodWludDY0X3QgdmFsdWUpIHsgdHJhY2tfdXVpZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDExKTsgfQorCisgIGludCBleHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzX3NpemUoKSBjb25z
dCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfLnNp
emUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+JiBleHRyYV9jb3VudGVyX3Ry
YWNrX3V1aWRzKCkgY29uc3QgeyByZXR1cm4gZXh0cmFfY291bnRlcl90cmFja191dWlkc187IH0K
KyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+KiBtdXRhYmxlX2V4dHJhX2NvdW50ZXJfdHJhY2tfdXVp
ZHMoKSB7IHJldHVybiAmZXh0cmFfY291bnRlcl90cmFja191dWlkc187IH0KKyAgdm9pZCBjbGVh
cl9leHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzKCkgeyBleHRyYV9jb3VudGVyX3RyYWNrX3V1aWRz
Xy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX2V4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHModWludDY0
X3QgdmFsdWUpIHsgZXh0cmFfY291bnRlcl90cmFja191dWlkc18uZW1wbGFjZV9iYWNrKHZhbHVl
KTsgfQorICB1aW50NjRfdCogYWRkX2V4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMoKSB7IGV4dHJh
X2NvdW50ZXJfdHJhY2tfdXVpZHNfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJmV4dHJhX2NvdW50
ZXJfdHJhY2tfdXVpZHNfLmJhY2soKTsgfQorCisgcHJpdmF0ZToKKyAgdWludDY0X3QgdHJhY2tf
dXVpZF97fTsKKyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVp
ZHNfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBm
b3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmls
ZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwzMj4g
X2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNrRXZlbnQg
OiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcg
TGVnYWN5RXZlbnQgPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50OworICB1c2luZyBUeXBlID0gVHJh
Y2tFdmVudF9UeXBlOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9VTlNQRUNJRklFRCA9
IFRyYWNrRXZlbnRfVHlwZV9UWVBFX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1
dG8gVFlQRV9TTElDRV9CRUdJTiA9IFRyYWNrRXZlbnRfVHlwZV9UWVBFX1NMSUNFX0JFR0lOOwor
ICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQRV9TTElDRV9FTkQgPSBUcmFja0V2ZW50X1R5cGVf
VFlQRV9TTElDRV9FTkQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBUWVBFX0lOU1RBTlQgPSBU
cmFja0V2ZW50X1R5cGVfVFlQRV9JTlNUQU5UOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVFlQ
RV9DT1VOVEVSID0gVHJhY2tFdmVudF9UeXBlX1RZUEVfQ09VTlRFUjsKKyAgc3RhdGljIGNvbnN0
ZXhwciBhdXRvIFR5cGVfTUlOID0gVHJhY2tFdmVudF9UeXBlX1RZUEVfVU5TUEVDSUZJRUQ7Cisg
IHN0YXRpYyBjb25zdGV4cHIgYXV0byBUeXBlX01BWCA9IFRyYWNrRXZlbnRfVHlwZV9UWVBFX0NP
VU5URVI7CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrQ2F0ZWdvcnlJaWRzRmllbGROdW1i
ZXIgPSAzLAorICAgIGtDYXRlZ29yaWVzRmllbGROdW1iZXIgPSAyMiwKKyAgICBrTmFtZUlpZEZp
ZWxkTnVtYmVyID0gMTAsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIzLAorICAgIGtUeXBlRmll
bGROdW1iZXIgPSA5LAorICAgIGtUcmFja1V1aWRGaWVsZE51bWJlciA9IDExLAorICAgIGtDb3Vu
dGVyVmFsdWVGaWVsZE51bWJlciA9IDMwLAorICAgIGtFeHRyYUNvdW50ZXJUcmFja1V1aWRzRmll
bGROdW1iZXIgPSAzMSwKKyAgICBrRXh0cmFDb3VudGVyVmFsdWVzRmllbGROdW1iZXIgPSAxMiwK
KyAgICBrRGVidWdBbm5vdGF0aW9uc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrVGFza0V4ZWN1dGlv
bkZpZWxkTnVtYmVyID0gNSwKKyAgICBrTG9nTWVzc2FnZUZpZWxkTnVtYmVyID0gMjEsCisgICAg
a0NjU2NoZWR1bGVyU3RhdGVGaWVsZE51bWJlciA9IDI0LAorICAgIGtDaHJvbWVVc2VyRXZlbnRG
aWVsZE51bWJlciA9IDI1LAorICAgIGtDaHJvbWVLZXllZFNlcnZpY2VGaWVsZE51bWJlciA9IDI2
LAorICAgIGtDaHJvbWVMZWdhY3lJcGNGaWVsZE51bWJlciA9IDI3LAorICAgIGtDaHJvbWVIaXN0
b2dyYW1TYW1wbGVGaWVsZE51bWJlciA9IDI4LAorICAgIGtDaHJvbWVMYXRlbmN5SW5mb0ZpZWxk
TnVtYmVyID0gMjksCisgICAga0Nocm9tZUZyYW1lUmVwb3J0ZXJGaWVsZE51bWJlciA9IDMyLAor
ICAgIGtUaW1lc3RhbXBEZWx0YVVzRmllbGROdW1iZXIgPSAxLAorICAgIGtUaW1lc3RhbXBBYnNv
bHV0ZVVzRmllbGROdW1iZXIgPSAxNiwKKyAgICBrVGhyZWFkVGltZURlbHRhVXNGaWVsZE51bWJl
ciA9IDIsCisgICAga1RocmVhZFRpbWVBYnNvbHV0ZVVzRmllbGROdW1iZXIgPSAxNywKKyAgICBr
VGhyZWFkSW5zdHJ1Y3Rpb25Db3VudERlbHRhRmllbGROdW1iZXIgPSA4LAorICAgIGtUaHJlYWRJ
bnN0cnVjdGlvbkNvdW50QWJzb2x1dGVGaWVsZE51bWJlciA9IDIwLAorICAgIGtMZWdhY3lFdmVu
dEZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKworICBUcmFja0V2ZW50KCk7CisgIH5UcmFja0V2ZW50
KCkgb3ZlcnJpZGU7CisgIFRyYWNrRXZlbnQoVHJhY2tFdmVudCYmKSBub2V4Y2VwdDsKKyAgVHJh
Y2tFdmVudCYgb3BlcmF0b3I9KFRyYWNrRXZlbnQmJik7CisgIFRyYWNrRXZlbnQoY29uc3QgVHJh
Y2tFdmVudCYpOworICBUcmFja0V2ZW50JiBvcGVyYXRvcj0oY29uc3QgVHJhY2tFdmVudCYpOwor
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2tFdmVudCYpIGNvbnN0OworICBib29sIG9wZXJh
dG9yIT0oY29uc3QgVHJhY2tFdmVudCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0g
b3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBv
dmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlk
ZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJy
aWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisg
IGludCBjYXRlZ29yeV9paWRzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+
KGNhdGVnb3J5X2lpZHNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+
JiBjYXRlZ29yeV9paWRzKCkgY29uc3QgeyByZXR1cm4gY2F0ZWdvcnlfaWlkc187IH0KKyAgc3Rk
Ojp2ZWN0b3I8dWludDY0X3Q+KiBtdXRhYmxlX2NhdGVnb3J5X2lpZHMoKSB7IHJldHVybiAmY2F0
ZWdvcnlfaWlkc187IH0KKyAgdm9pZCBjbGVhcl9jYXRlZ29yeV9paWRzKCkgeyBjYXRlZ29yeV9p
aWRzXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX2NhdGVnb3J5X2lpZHModWludDY0X3QgdmFsdWUp
IHsgY2F0ZWdvcnlfaWlkc18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICB1aW50NjRfdCogYWRk
X2NhdGVnb3J5X2lpZHMoKSB7IGNhdGVnb3J5X2lpZHNfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4g
JmNhdGVnb3J5X2lpZHNfLmJhY2soKTsgfQorCisgIGludCBjYXRlZ29yaWVzX3NpemUoKSBjb25z
dCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNhdGVnb3JpZXNfLnNpemUoKSk7IH0KKyAgY29u
c3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4g
Y2F0ZWdvcmllc187IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2NhdGVn
b3JpZXMoKSB7IHJldHVybiAmY2F0ZWdvcmllc187IH0KKyAgdm9pZCBjbGVhcl9jYXRlZ29yaWVz
KCkgeyBjYXRlZ29yaWVzXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX2NhdGVnb3JpZXMoc3RkOjpz
dHJpbmcgdmFsdWUpIHsgY2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBzdGQ6
OnN0cmluZyogYWRkX2NhdGVnb3JpZXMoKSB7IGNhdGVnb3JpZXNfLmVtcGxhY2VfYmFjaygpOyBy
ZXR1cm4gJmNhdGVnb3JpZXNfLmJhY2soKTsgfQorCisgIGJvb2wgaGFzX25hbWVfaWlkKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTBdOyB9CisgIHVpbnQ2NF90IG5hbWVfaWlkKCkgY29u
c3QgeyByZXR1cm4gbmFtZV9paWRfOyB9CisgIHZvaWQgc2V0X25hbWVfaWlkKHVpbnQ2NF90IHZh
bHVlKSB7IG5hbWVfaWlkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTApOyB9CisKKyAgYm9v
bCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzIzXTsgfQorICBjb25zdCBz
dGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25h
bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCgyMyk7IH0KKworICBib29sIGhhc190eXBlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bOV07IH0KKyAgVHJhY2tFdmVudF9UeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsg
fQorICB2b2lkIHNldF90eXBlKFRyYWNrRXZlbnRfVHlwZSB2YWx1ZSkgeyB0eXBlXyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoOSk7IH0KKworICBib29sIGhhc190cmFja191dWlkKCkgY29uc3Qg
eyByZXR1cm4gX2hhc19maWVsZF9bMTFdOyB9CisgIHVpbnQ2NF90IHRyYWNrX3V1aWQoKSBjb25z
dCB7IHJldHVybiB0cmFja191dWlkXzsgfQorICB2b2lkIHNldF90cmFja191dWlkKHVpbnQ2NF90
IHZhbHVlKSB7IHRyYWNrX3V1aWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMSk7IH0KKwor
ICBib29sIGhhc19jb3VudGVyX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMzBd
OyB9CisgIGludDY0X3QgY291bnRlcl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGNvdW50ZXJfdmFs
dWVfOyB9CisgIHZvaWQgc2V0X2NvdW50ZXJfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeyBjb3VudGVy
X3ZhbHVlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMzApOyB9CisKKyAgaW50IGV4dHJhX2Nv
dW50ZXJfdHJhY2tfdXVpZHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4o
ZXh0cmFfY291bnRlcl90cmFja191dWlkc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3Rv
cjx1aW50NjRfdD4mIGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMoKSBjb25zdCB7IHJldHVybiBl
eHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzXzsgfQorICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4qIG11
dGFibGVfZXh0cmFfY291bnRlcl90cmFja191dWlkcygpIHsgcmV0dXJuICZleHRyYV9jb3VudGVy
X3RyYWNrX3V1aWRzXzsgfQorICB2b2lkIGNsZWFyX2V4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMo
KSB7IGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfZXh0
cmFfY291bnRlcl90cmFja191dWlkcyh1aW50NjRfdCB2YWx1ZSkgeyBleHRyYV9jb3VudGVyX3Ry
YWNrX3V1aWRzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHVpbnQ2NF90KiBhZGRfZXh0cmFf
Y291bnRlcl90cmFja191dWlkcygpIHsgZXh0cmFfY291bnRlcl90cmFja191dWlkc18uZW1wbGFj
ZV9iYWNrKCk7IHJldHVybiAmZXh0cmFfY291bnRlcl90cmFja191dWlkc18uYmFjaygpOyB9CisK
KyAgaW50IGV4dHJhX2NvdW50ZXJfdmFsdWVzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNf
Y2FzdDxpbnQ+KGV4dHJhX2NvdW50ZXJfdmFsdWVzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6
dmVjdG9yPGludDY0X3Q+JiBleHRyYV9jb3VudGVyX3ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIGV4
dHJhX2NvdW50ZXJfdmFsdWVzXzsgfQorICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogbXV0YWJsZV9l
eHRyYV9jb3VudGVyX3ZhbHVlcygpIHsgcmV0dXJuICZleHRyYV9jb3VudGVyX3ZhbHVlc187IH0K
KyAgdm9pZCBjbGVhcl9leHRyYV9jb3VudGVyX3ZhbHVlcygpIHsgZXh0cmFfY291bnRlcl92YWx1
ZXNfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfZXh0cmFfY291bnRlcl92YWx1ZXMoaW50NjRfdCB2
YWx1ZSkgeyBleHRyYV9jb3VudGVyX3ZhbHVlc18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBp
bnQ2NF90KiBhZGRfZXh0cmFfY291bnRlcl92YWx1ZXMoKSB7IGV4dHJhX2NvdW50ZXJfdmFsdWVz
Xy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZleHRyYV9jb3VudGVyX3ZhbHVlc18uYmFjaygpOyB9
CisKKyAgaW50IGRlYnVnX2Fubm90YXRpb25zX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNf
Y2FzdDxpbnQ+KGRlYnVnX2Fubm90YXRpb25zXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVj
dG9yPERlYnVnQW5ub3RhdGlvbj4mIGRlYnVnX2Fubm90YXRpb25zKCkgY29uc3QgeyByZXR1cm4g
ZGVidWdfYW5ub3RhdGlvbnNfOyB9CisgIHN0ZDo6dmVjdG9yPERlYnVnQW5ub3RhdGlvbj4qIG11
dGFibGVfZGVidWdfYW5ub3RhdGlvbnMoKSB7IHJldHVybiAmZGVidWdfYW5ub3RhdGlvbnNfOyB9
CisgIHZvaWQgY2xlYXJfZGVidWdfYW5ub3RhdGlvbnMoKSB7IGRlYnVnX2Fubm90YXRpb25zXy5j
bGVhcigpOyB9CisgIERlYnVnQW5ub3RhdGlvbiogYWRkX2RlYnVnX2Fubm90YXRpb25zKCkgeyBk
ZWJ1Z19hbm5vdGF0aW9uc18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmZGVidWdfYW5ub3RhdGlv
bnNfLmJhY2soKTsgfQorCisgIGJvb2wgaGFzX3Rhc2tfZXhlY3V0aW9uKCkgY29uc3QgeyByZXR1
cm4gX2hhc19maWVsZF9bNV07IH0KKyAgY29uc3QgVGFza0V4ZWN1dGlvbiYgdGFza19leGVjdXRp
b24oKSBjb25zdCB7IHJldHVybiAqdGFza19leGVjdXRpb25fOyB9CisgIFRhc2tFeGVjdXRpb24q
IG11dGFibGVfdGFza19leGVjdXRpb24oKSB7IF9oYXNfZmllbGRfLnNldCg1KTsgcmV0dXJuIHRh
c2tfZXhlY3V0aW9uXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX2xvZ19tZXNzYWdlKCkgY29uc3Qg
eyByZXR1cm4gX2hhc19maWVsZF9bMjFdOyB9CisgIGNvbnN0IExvZ01lc3NhZ2UmIGxvZ19tZXNz
YWdlKCkgY29uc3QgeyByZXR1cm4gKmxvZ19tZXNzYWdlXzsgfQorICBMb2dNZXNzYWdlKiBtdXRh
YmxlX2xvZ19tZXNzYWdlKCkgeyBfaGFzX2ZpZWxkXy5zZXQoMjEpOyByZXR1cm4gbG9nX21lc3Nh
Z2VfLmdldCgpOyB9CisKKyAgYm9vbCBoYXNfY2Nfc2NoZWR1bGVyX3N0YXRlKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bMjRdOyB9CisgIGNvbnN0IENocm9tZUNvbXBvc2l0b3JTY2hlZHVs
ZXJTdGF0ZSYgY2Nfc2NoZWR1bGVyX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gKmNjX3NjaGVkdWxl
cl9zdGF0ZV87IH0KKyAgQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlKiBtdXRhYmxlX2Nj
X3NjaGVkdWxlcl9zdGF0ZSgpIHsgX2hhc19maWVsZF8uc2V0KDI0KTsgcmV0dXJuIGNjX3NjaGVk
dWxlcl9zdGF0ZV8uZ2V0KCk7IH0KKworICBib29sIGhhc19jaHJvbWVfdXNlcl9ldmVudCgpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzI1XTsgfQorICBjb25zdCBDaHJvbWVVc2VyRXZlbnQm
IGNocm9tZV91c2VyX2V2ZW50KCkgY29uc3QgeyByZXR1cm4gKmNocm9tZV91c2VyX2V2ZW50Xzsg
fQorICBDaHJvbWVVc2VyRXZlbnQqIG11dGFibGVfY2hyb21lX3VzZXJfZXZlbnQoKSB7IF9oYXNf
ZmllbGRfLnNldCgyNSk7IHJldHVybiBjaHJvbWVfdXNlcl9ldmVudF8uZ2V0KCk7IH0KKworICBi
b29sIGhhc19jaHJvbWVfa2V5ZWRfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRf
WzI2XTsgfQorICBjb25zdCBDaHJvbWVLZXllZFNlcnZpY2UmIGNocm9tZV9rZXllZF9zZXJ2aWNl
KCkgY29uc3QgeyByZXR1cm4gKmNocm9tZV9rZXllZF9zZXJ2aWNlXzsgfQorICBDaHJvbWVLZXll
ZFNlcnZpY2UqIG11dGFibGVfY2hyb21lX2tleWVkX3NlcnZpY2UoKSB7IF9oYXNfZmllbGRfLnNl
dCgyNik7IHJldHVybiBjaHJvbWVfa2V5ZWRfc2VydmljZV8uZ2V0KCk7IH0KKworICBib29sIGhh
c19jaHJvbWVfbGVnYWN5X2lwYygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzI3XTsgfQor
ICBjb25zdCBDaHJvbWVMZWdhY3lJcGMmIGNocm9tZV9sZWdhY3lfaXBjKCkgY29uc3QgeyByZXR1
cm4gKmNocm9tZV9sZWdhY3lfaXBjXzsgfQorICBDaHJvbWVMZWdhY3lJcGMqIG11dGFibGVfY2hy
b21lX2xlZ2FjeV9pcGMoKSB7IF9oYXNfZmllbGRfLnNldCgyNyk7IHJldHVybiBjaHJvbWVfbGVn
YWN5X2lwY18uZ2V0KCk7IH0KKworICBib29sIGhhc19jaHJvbWVfaGlzdG9ncmFtX3NhbXBsZSgp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzI4XTsgfQorICBjb25zdCBDaHJvbWVIaXN0b2dy
YW1TYW1wbGUmIGNocm9tZV9oaXN0b2dyYW1fc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gKmNocm9t
ZV9oaXN0b2dyYW1fc2FtcGxlXzsgfQorICBDaHJvbWVIaXN0b2dyYW1TYW1wbGUqIG11dGFibGVf
Y2hyb21lX2hpc3RvZ3JhbV9zYW1wbGUoKSB7IF9oYXNfZmllbGRfLnNldCgyOCk7IHJldHVybiBj
aHJvbWVfaGlzdG9ncmFtX3NhbXBsZV8uZ2V0KCk7IH0KKworICBib29sIGhhc19jaHJvbWVfbGF0
ZW5jeV9pbmZvKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjldOyB9CisgIGNvbnN0IENo
cm9tZUxhdGVuY3lJbmZvJiBjaHJvbWVfbGF0ZW5jeV9pbmZvKCkgY29uc3QgeyByZXR1cm4gKmNo
cm9tZV9sYXRlbmN5X2luZm9fOyB9CisgIENocm9tZUxhdGVuY3lJbmZvKiBtdXRhYmxlX2Nocm9t
ZV9sYXRlbmN5X2luZm8oKSB7IF9oYXNfZmllbGRfLnNldCgyOSk7IHJldHVybiBjaHJvbWVfbGF0
ZW5jeV9pbmZvXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX2Nocm9tZV9mcmFtZV9yZXBvcnRlcigp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzMyXTsgfQorICBjb25zdCBDaHJvbWVGcmFtZVJl
cG9ydGVyJiBjaHJvbWVfZnJhbWVfcmVwb3J0ZXIoKSBjb25zdCB7IHJldHVybiAqY2hyb21lX2Zy
YW1lX3JlcG9ydGVyXzsgfQorICBDaHJvbWVGcmFtZVJlcG9ydGVyKiBtdXRhYmxlX2Nocm9tZV9m
cmFtZV9yZXBvcnRlcigpIHsgX2hhc19maWVsZF8uc2V0KDMyKTsgcmV0dXJuIGNocm9tZV9mcmFt
ZV9yZXBvcnRlcl8uZ2V0KCk7IH0KKworICBib29sIGhhc190aW1lc3RhbXBfZGVsdGFfdXMoKSBj
b25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBpbnQ2NF90IHRpbWVzdGFtcF9kZWx0
YV91cygpIGNvbnN0IHsgcmV0dXJuIHRpbWVzdGFtcF9kZWx0YV91c187IH0KKyAgdm9pZCBzZXRf
dGltZXN0YW1wX2RlbHRhX3VzKGludDY0X3QgdmFsdWUpIHsgdGltZXN0YW1wX2RlbHRhX3VzXyA9
IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc190aW1lc3RhbXBfYWJz
b2x1dGVfdXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxNl07IH0KKyAgaW50NjRfdCB0
aW1lc3RhbXBfYWJzb2x1dGVfdXMoKSBjb25zdCB7IHJldHVybiB0aW1lc3RhbXBfYWJzb2x1dGVf
dXNfOyB9CisgIHZvaWQgc2V0X3RpbWVzdGFtcF9hYnNvbHV0ZV91cyhpbnQ2NF90IHZhbHVlKSB7
IHRpbWVzdGFtcF9hYnNvbHV0ZV91c18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDE2KTsgfQor
CisgIGJvb2wgaGFzX3RocmVhZF90aW1lX2RlbHRhX3VzKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMl07IH0KKyAgaW50NjRfdCB0aHJlYWRfdGltZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0
dXJuIHRocmVhZF90aW1lX2RlbHRhX3VzXzsgfQorICB2b2lkIHNldF90aHJlYWRfdGltZV9kZWx0
YV91cyhpbnQ2NF90IHZhbHVlKSB7IHRocmVhZF90aW1lX2RlbHRhX3VzXyA9IHZhbHVlOyBfaGFz
X2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc190aHJlYWRfdGltZV9hYnNvbHV0ZV91cygp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE3XTsgfQorICBpbnQ2NF90IHRocmVhZF90aW1l
X2Fic29sdXRlX3VzKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkX3RpbWVfYWJzb2x1dGVfdXNfOyB9
CisgIHZvaWQgc2V0X3RocmVhZF90aW1lX2Fic29sdXRlX3VzKGludDY0X3QgdmFsdWUpIHsgdGhy
ZWFkX3RpbWVfYWJzb2x1dGVfdXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxNyk7IH0KKwor
ICBib29sIGhhc190aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnRfZGVsdGEoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1s4XTsgfQorICBpbnQ2NF90IHRocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9k
ZWx0YSgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9kZWx0YV87IH0K
KyAgdm9pZCBzZXRfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50X2RlbHRhKGludDY0X3QgdmFsdWUp
IHsgdGhyZWFkX2luc3RydWN0aW9uX2NvdW50X2RlbHRhXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5z
ZXQoOCk7IH0KKworICBib29sIGhhc190aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnRfYWJzb2x1dGUo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syMF07IH0KKyAgaW50NjRfdCB0aHJlYWRfaW5z
dHJ1Y3Rpb25fY291bnRfYWJzb2x1dGUoKSBjb25zdCB7IHJldHVybiB0aHJlYWRfaW5zdHJ1Y3Rp
b25fY291bnRfYWJzb2x1dGVfOyB9CisgIHZvaWQgc2V0X3RocmVhZF9pbnN0cnVjdGlvbl9jb3Vu
dF9hYnNvbHV0ZShpbnQ2NF90IHZhbHVlKSB7IHRocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9hYnNv
bHV0ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIwKTsgfQorCisgIGJvb2wgaGFzX2xlZ2Fj
eV9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzZdOyB9CisgIGNvbnN0IFRyYWNr
RXZlbnRfTGVnYWN5RXZlbnQmIGxlZ2FjeV9ldmVudCgpIGNvbnN0IHsgcmV0dXJuICpsZWdhY3lf
ZXZlbnRfOyB9CisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQqIG11dGFibGVfbGVnYWN5X2V2ZW50
KCkgeyBfaGFzX2ZpZWxkXy5zZXQoNik7IHJldHVybiBsZWdhY3lfZXZlbnRfLmdldCgpOyB9CisK
KyBwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY2F0ZWdvcnlfaWlkc187CisgIHN0
ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjYXRlZ29yaWVzXzsKKyAgdWludDY0X3QgbmFtZV9paWRf
e307CisgIHN0ZDo6c3RyaW5nIG5hbWVfe307CisgIFRyYWNrRXZlbnRfVHlwZSB0eXBlX3t9Owor
ICB1aW50NjRfdCB0cmFja191dWlkX3t9OworICBpbnQ2NF90IGNvdW50ZXJfdmFsdWVfe307Cisg
IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBleHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzXzsKKyAgc3Rk
Ojp2ZWN0b3I8aW50NjRfdD4gZXh0cmFfY291bnRlcl92YWx1ZXNfOworICBzdGQ6OnZlY3RvcjxE
ZWJ1Z0Fubm90YXRpb24+IGRlYnVnX2Fubm90YXRpb25zXzsKKyAgOjpwcm90b3plcm86OkNvcHlh
YmxlUHRyPFRhc2tFeGVjdXRpb24+IHRhc2tfZXhlY3V0aW9uXzsKKyAgOjpwcm90b3plcm86OkNv
cHlhYmxlUHRyPExvZ01lc3NhZ2U+IGxvZ19tZXNzYWdlXzsKKyAgOjpwcm90b3plcm86OkNvcHlh
YmxlUHRyPENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZT4gY2Nfc2NoZWR1bGVyX3N0YXRl
XzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPENocm9tZVVzZXJFdmVudD4gY2hyb21lX3Vz
ZXJfZXZlbnRfOworICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8Q2hyb21lS2V5ZWRTZXJ2aWNl
PiBjaHJvbWVfa2V5ZWRfc2VydmljZV87CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxDaHJv
bWVMZWdhY3lJcGM+IGNocm9tZV9sZWdhY3lfaXBjXzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxl
UHRyPENocm9tZUhpc3RvZ3JhbVNhbXBsZT4gY2hyb21lX2hpc3RvZ3JhbV9zYW1wbGVfOworICA6
OnByb3RvemVybzo6Q29weWFibGVQdHI8Q2hyb21lTGF0ZW5jeUluZm8+IGNocm9tZV9sYXRlbmN5
X2luZm9fOworICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8Q2hyb21lRnJhbWVSZXBvcnRlcj4g
Y2hyb21lX2ZyYW1lX3JlcG9ydGVyXzsKKyAgaW50NjRfdCB0aW1lc3RhbXBfZGVsdGFfdXNfe307
CisgIGludDY0X3QgdGltZXN0YW1wX2Fic29sdXRlX3VzX3t9OworICBpbnQ2NF90IHRocmVhZF90
aW1lX2RlbHRhX3VzX3t9OworICBpbnQ2NF90IHRocmVhZF90aW1lX2Fic29sdXRlX3VzX3t9Owor
ICBpbnQ2NF90IHRocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9kZWx0YV97fTsKKyAgaW50NjRfdCB0
aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnRfYWJzb2x1dGVfe307CisgIDo6cHJvdG96ZXJvOjpDb3B5
YWJsZVB0cjxUcmFja0V2ZW50X0xlZ2FjeUV2ZW50PiBsZWdhY3lfZXZlbnRfOworCisgIC8vIEFs
bG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0
eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3Ry
aW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwzMz4gX2hhc19maWVsZF97fTsK
K307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgRmxv
d0RpcmVjdGlvbiA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbjsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIEZMT1dfVU5TUEVDSUZJRUQgPSBUcmFja0V2ZW50X0xlZ2FjeUV2
ZW50X0Zsb3dEaXJlY3Rpb25fRkxPV19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBh
dXRvIEZMT1dfSU4gPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb25fRkxPV19J
TjsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEZMT1dfT1VUID0gVHJhY2tFdmVudF9MZWdhY3lF
dmVudF9GbG93RGlyZWN0aW9uX0ZMT1dfT1VUOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gRkxP
V19JTk9VVCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9XX0lOT1VU
OworICBzdGF0aWMgY29uc3RleHByIGF1dG8gRmxvd0RpcmVjdGlvbl9NSU4gPSBUcmFja0V2ZW50
X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb25fRkxPV19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIEZsb3dEaXJlY3Rpb25fTUFYID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9G
bG93RGlyZWN0aW9uX0ZMT1dfSU5PVVQ7CisgIHVzaW5nIEluc3RhbnRFdmVudFNjb3BlID0gVHJh
Y2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZTsKKyAgc3RhdGljIGNvbnN0ZXhw
ciBhdXRvIFNDT1BFX1VOU1BFQ0lGSUVEID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50
RXZlbnRTY29wZV9TQ09QRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFND
T1BFX0dMT0JBTCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NP
UEVfR0xPQkFMOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gU0NPUEVfUFJPQ0VTUyA9IFRyYWNr
RXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfUFJPQ0VTUzsKKyAgc3Rh
dGljIGNvbnN0ZXhwciBhdXRvIFNDT1BFX1RIUkVBRCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRf
SW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVEhSRUFEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8g
SW5zdGFudEV2ZW50U2NvcGVfTUlOID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZl
bnRTY29wZV9TQ09QRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEluc3Rh
bnRFdmVudFNjb3BlX01BWCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2Nv
cGVfU0NPUEVfVEhSRUFEOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga05hbWVJaWRGaWVs
ZE51bWJlciA9IDEsCisgICAga1BoYXNlRmllbGROdW1iZXIgPSAyLAorICAgIGtEdXJhdGlvblVz
RmllbGROdW1iZXIgPSAzLAorICAgIGtUaHJlYWREdXJhdGlvblVzRmllbGROdW1iZXIgPSA0LAor
ICAgIGtUaHJlYWRJbnN0cnVjdGlvbkRlbHRhRmllbGROdW1iZXIgPSAxNSwKKyAgICBrVW5zY29w
ZWRJZEZpZWxkTnVtYmVyID0gNiwKKyAgICBrTG9jYWxJZEZpZWxkTnVtYmVyID0gMTAsCisgICAg
a0dsb2JhbElkRmllbGROdW1iZXIgPSAxMSwKKyAgICBrSWRTY29wZUZpZWxkTnVtYmVyID0gNywK
KyAgICBrVXNlQXN5bmNUdHNGaWVsZE51bWJlciA9IDksCisgICAga0JpbmRJZEZpZWxkTnVtYmVy
ID0gOCwKKyAgICBrQmluZFRvRW5jbG9zaW5nRmllbGROdW1iZXIgPSAxMiwKKyAgICBrRmxvd0Rp
cmVjdGlvbkZpZWxkTnVtYmVyID0gMTMsCisgICAga0luc3RhbnRFdmVudFNjb3BlRmllbGROdW1i
ZXIgPSAxNCwKKyAgICBrUGlkT3ZlcnJpZGVGaWVsZE51bWJlciA9IDE4LAorICAgIGtUaWRPdmVy
cmlkZUZpZWxkTnVtYmVyID0gMTksCisgIH07CisKKyAgVHJhY2tFdmVudF9MZWdhY3lFdmVudCgp
OworICB+VHJhY2tFdmVudF9MZWdhY3lFdmVudCgpIG92ZXJyaWRlOworICBUcmFja0V2ZW50X0xl
Z2FjeUV2ZW50KFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQmJikgbm9leGNlcHQ7CisgIFRyYWNrRXZl
bnRfTGVnYWN5RXZlbnQmIG9wZXJhdG9yPShUcmFja0V2ZW50X0xlZ2FjeUV2ZW50JiYpOworICBU
cmFja0V2ZW50X0xlZ2FjeUV2ZW50KGNvbnN0IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQmKTsKKyAg
VHJhY2tFdmVudF9MZWdhY3lFdmVudCYgb3BlcmF0b3I9KGNvbnN0IFRyYWNrRXZlbnRfTGVnYWN5
RXZlbnQmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQm
KSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQm
IG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFy
c2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5n
IFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4
X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUo
Ojpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19uYW1lX2lpZCgpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQ2NF90IG5hbWVfaWlkKCkgY29u
c3QgeyByZXR1cm4gbmFtZV9paWRfOyB9CisgIHZvaWQgc2V0X25hbWVfaWlkKHVpbnQ2NF90IHZh
bHVlKSB7IG5hbWVfaWlkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29s
IGhhc19waGFzZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGludDMyX3Qg
cGhhc2UoKSBjb25zdCB7IHJldHVybiBwaGFzZV87IH0KKyAgdm9pZCBzZXRfcGhhc2UoaW50MzJf
dCB2YWx1ZSkgeyBwaGFzZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyAgYm9v
bCBoYXNfZHVyYXRpb25fdXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICBp
bnQ2NF90IGR1cmF0aW9uX3VzKCkgY29uc3QgeyByZXR1cm4gZHVyYXRpb25fdXNfOyB9CisgIHZv
aWQgc2V0X2R1cmF0aW9uX3VzKGludDY0X3QgdmFsdWUpIHsgZHVyYXRpb25fdXNfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX3RocmVhZF9kdXJhdGlvbl91cygp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIGludDY0X3QgdGhyZWFkX2R1cmF0
aW9uX3VzKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkX2R1cmF0aW9uX3VzXzsgfQorICB2b2lkIHNl
dF90aHJlYWRfZHVyYXRpb25fdXMoaW50NjRfdCB2YWx1ZSkgeyB0aHJlYWRfZHVyYXRpb25fdXNf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgIGJvb2wgaGFzX3RocmVhZF9pbnN0
cnVjdGlvbl9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE1XTsgfQorICBpbnQ2
NF90IHRocmVhZF9pbnN0cnVjdGlvbl9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZF9pbnN0
cnVjdGlvbl9kZWx0YV87IH0KKyAgdm9pZCBzZXRfdGhyZWFkX2luc3RydWN0aW9uX2RlbHRhKGlu
dDY0X3QgdmFsdWUpIHsgdGhyZWFkX2luc3RydWN0aW9uX2RlbHRhXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoMTUpOyB9CisKKyAgYm9vbCBoYXNfdW5zY29wZWRfaWQoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1s2XTsgfQorICB1aW50NjRfdCB1bnNjb3BlZF9pZCgpIGNvbnN0IHsgcmV0
dXJuIHVuc2NvcGVkX2lkXzsgfQorICB2b2lkIHNldF91bnNjb3BlZF9pZCh1aW50NjRfdCB2YWx1
ZSkgeyB1bnNjb3BlZF9pZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDYpOyB9CisKKyAgYm9v
bCBoYXNfbG9jYWxfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxMF07IH0KKyAgdWlu
dDY0X3QgbG9jYWxfaWQoKSBjb25zdCB7IHJldHVybiBsb2NhbF9pZF87IH0KKyAgdm9pZCBzZXRf
bG9jYWxfaWQodWludDY0X3QgdmFsdWUpIHsgbG9jYWxfaWRfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCgxMCk7IH0KKworICBib29sIGhhc19nbG9iYWxfaWQoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1sxMV07IH0KKyAgdWludDY0X3QgZ2xvYmFsX2lkKCkgY29uc3QgeyByZXR1cm4gZ2xv
YmFsX2lkXzsgfQorICB2b2lkIHNldF9nbG9iYWxfaWQodWludDY0X3QgdmFsdWUpIHsgZ2xvYmFs
X2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTEpOyB9CisKKyAgYm9vbCBoYXNfaWRfc2Nv
cGUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s3XTsgfQorICBjb25zdCBzdGQ6OnN0cmlu
ZyYgaWRfc2NvcGUoKSBjb25zdCB7IHJldHVybiBpZF9zY29wZV87IH0KKyAgdm9pZCBzZXRfaWRf
c2NvcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IGlkX3Njb3BlXyA9IHZhbHVlOyBfaGFz
X2ZpZWxkXy5zZXQoNyk7IH0KKworICBib29sIGhhc191c2VfYXN5bmNfdHRzKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bOV07IH0KKyAgYm9vbCB1c2VfYXN5bmNfdHRzKCkgY29uc3QgeyBy
ZXR1cm4gdXNlX2FzeW5jX3R0c187IH0KKyAgdm9pZCBzZXRfdXNlX2FzeW5jX3R0cyhib29sIHZh
bHVlKSB7IHVzZV9hc3luY190dHNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg5KTsgfQorCisg
IGJvb2wgaGFzX2JpbmRfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s4XTsgfQorICB1
aW50NjRfdCBiaW5kX2lkKCkgY29uc3QgeyByZXR1cm4gYmluZF9pZF87IH0KKyAgdm9pZCBzZXRf
YmluZF9pZCh1aW50NjRfdCB2YWx1ZSkgeyBiaW5kX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5z
ZXQoOCk7IH0KKworICBib29sIGhhc19iaW5kX3RvX2VuY2xvc2luZygpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzEyXTsgfQorICBib29sIGJpbmRfdG9fZW5jbG9zaW5nKCkgY29uc3QgeyBy
ZXR1cm4gYmluZF90b19lbmNsb3NpbmdfOyB9CisgIHZvaWQgc2V0X2JpbmRfdG9fZW5jbG9zaW5n
KGJvb2wgdmFsdWUpIHsgYmluZF90b19lbmNsb3NpbmdfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxMik7IH0KKworICBib29sIGhhc19mbG93X2RpcmVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzEzXTsgfQorICBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb24g
Zmxvd19kaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBmbG93X2RpcmVjdGlvbl87IH0KKyAgdm9p
ZCBzZXRfZmxvd19kaXJlY3Rpb24oVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9u
IHZhbHVlKSB7IGZsb3dfZGlyZWN0aW9uXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTMpOyB9
CisKKyAgYm9vbCBoYXNfaW5zdGFudF9ldmVudF9zY29wZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNf
ZmllbGRfWzE0XTsgfQorICBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3Bl
IGluc3RhbnRfZXZlbnRfc2NvcGUoKSBjb25zdCB7IHJldHVybiBpbnN0YW50X2V2ZW50X3Njb3Bl
XzsgfQorICB2b2lkIHNldF9pbnN0YW50X2V2ZW50X3Njb3BlKFRyYWNrRXZlbnRfTGVnYWN5RXZl
bnRfSW5zdGFudEV2ZW50U2NvcGUgdmFsdWUpIHsgaW5zdGFudF9ldmVudF9zY29wZV8gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDE0KTsgfQorCisgIGJvb2wgaGFzX3BpZF9vdmVycmlkZSgpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE4XTsgfQorICBpbnQzMl90IHBpZF9vdmVycmlkZSgp
IGNvbnN0IHsgcmV0dXJuIHBpZF9vdmVycmlkZV87IH0KKyAgdm9pZCBzZXRfcGlkX292ZXJyaWRl
KGludDMyX3QgdmFsdWUpIHsgcGlkX292ZXJyaWRlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
MTgpOyB9CisKKyAgYm9vbCBoYXNfdGlkX292ZXJyaWRlKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMTldOyB9CisgIGludDMyX3QgdGlkX292ZXJyaWRlKCkgY29uc3QgeyByZXR1cm4gdGlk
X292ZXJyaWRlXzsgfQorICB2b2lkIHNldF90aWRfb3ZlcnJpZGUoaW50MzJfdCB2YWx1ZSkgeyB0
aWRfb3ZlcnJpZGVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxOSk7IH0KKworIHByaXZhdGU6
CisgIHVpbnQ2NF90IG5hbWVfaWlkX3t9OworICBpbnQzMl90IHBoYXNlX3t9OworICBpbnQ2NF90
IGR1cmF0aW9uX3VzX3t9OworICBpbnQ2NF90IHRocmVhZF9kdXJhdGlvbl91c197fTsKKyAgaW50
NjRfdCB0aHJlYWRfaW5zdHJ1Y3Rpb25fZGVsdGFfe307CisgIHVpbnQ2NF90IHVuc2NvcGVkX2lk
X3t9OworICB1aW50NjRfdCBsb2NhbF9pZF97fTsKKyAgdWludDY0X3QgZ2xvYmFsX2lkX3t9Owor
ICBzdGQ6OnN0cmluZyBpZF9zY29wZV97fTsKKyAgYm9vbCB1c2VfYXN5bmNfdHRzX3t9OworICB1
aW50NjRfdCBiaW5kX2lkX3t9OworICBib29sIGJpbmRfdG9fZW5jbG9zaW5nX3t9OworICBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb24gZmxvd19kaXJlY3Rpb25fe307CisgIFRy
YWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGUgaW5zdGFudF9ldmVudF9zY29w
ZV97fTsKKyAgaW50MzJfdCBwaWRfb3ZlcnJpZGVfe307CisgIGludDMyX3QgdGlkX292ZXJyaWRl
X3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBm
b3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmls
ZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyMD4g
X2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFt
ZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfRVZFTlRfUFJP
VE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90
b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4g
QXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFn
bm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVh
bCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0
by90cmFjZS90cmFja19ldmVudC90cmFja19ldmVudC5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9j
aHJvbWVfdXNlcl9ldmVudC5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfbGVnYWN5X2lw
Yy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9w
ZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfbGF0ZW5jeV9pbmZvLmdlbi5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNl
L3RyYWNrX2V2ZW50L2Nocm9tZV9rZXllZF9zZXJ2aWNlLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50
L2Nocm9tZV9oaXN0b2dyYW1fc2FtcGxlLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9m
cmFtZV9yZXBvcnRlci5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfY29tcG9zaXRvcl9z
Y2hlZHVsZXJfc3RhdGUuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvc291cmNlX2xvY2F0aW9uLmdl
bi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZl
dHRvL3RyYWNlL3RyYWNrX2V2ZW50L3Rhc2tfZXhlY3V0aW9uLmdlbi5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2
ZW50L2xvZ19tZXNzYWdlLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2RlYnVnX2Fubm90YXRpb24u
Z2VuLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVz
cGFjZSBnZW4geworCitFdmVudE5hbWU6OkV2ZW50TmFtZSgpID0gZGVmYXVsdDsKK0V2ZW50TmFt
ZTo6fkV2ZW50TmFtZSgpID0gZGVmYXVsdDsKK0V2ZW50TmFtZTo6RXZlbnROYW1lKGNvbnN0IEV2
ZW50TmFtZSYpID0gZGVmYXVsdDsKK0V2ZW50TmFtZSYgRXZlbnROYW1lOjpvcGVyYXRvcj0oY29u
c3QgRXZlbnROYW1lJikgPSBkZWZhdWx0OworRXZlbnROYW1lOjpFdmVudE5hbWUoRXZlbnROYW1l
JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0V2ZW50TmFtZSYgRXZlbnROYW1lOjpvcGVyYXRvcj0o
RXZlbnROYW1lJiYpID0gZGVmYXVsdDsKKworYm9vbCBFdmVudE5hbWU6Om9wZXJhdG9yPT0oY29u
c3QgRXZlbnROYW1lJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09
IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgaWlkXyA9PSBvdGhlci5paWRfCisgICAmJiBu
YW1lXyA9PSBvdGhlci5uYW1lXzsKK30KKworYm9vbCBFdmVudE5hbWU6OlBhcnNlRnJvbUFycmF5
KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFy
KCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3Rv
RGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChm
aWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQo
ZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2Fz
ZSAxIC8qIGlpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZpaWRfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDIgLyogbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZuYW1lXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5k
QXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQor
ICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpz
dHJpbmcgRXZlbnROYW1lOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3pl
cm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUo
bXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6
OnZlY3Rvcjx1aW50OF90PiBFdmVudE5hbWU6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7Cisg
IDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAg
U2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOwor
fQorCit2b2lkIEV2ZW50TmFtZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cp
IGNvbnN0IHsKKyAgLy8gRmllbGQgMTogaWlkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDEsIGlpZF8pOworICB9CisKKyAgLy8gRmllbGQgMjogbmFtZQor
ICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZygyLCBuYW1lXyk7
CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEo
KSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworRXZlbnRDYXRlZ29yeTo6RXZlbnRD
YXRlZ29yeSgpID0gZGVmYXVsdDsKK0V2ZW50Q2F0ZWdvcnk6On5FdmVudENhdGVnb3J5KCkgPSBk
ZWZhdWx0OworRXZlbnRDYXRlZ29yeTo6RXZlbnRDYXRlZ29yeShjb25zdCBFdmVudENhdGVnb3J5
JikgPSBkZWZhdWx0OworRXZlbnRDYXRlZ29yeSYgRXZlbnRDYXRlZ29yeTo6b3BlcmF0b3I9KGNv
bnN0IEV2ZW50Q2F0ZWdvcnkmKSA9IGRlZmF1bHQ7CitFdmVudENhdGVnb3J5OjpFdmVudENhdGVn
b3J5KEV2ZW50Q2F0ZWdvcnkmJikgbm9leGNlcHQgPSBkZWZhdWx0OworRXZlbnRDYXRlZ29yeSYg
RXZlbnRDYXRlZ29yeTo6b3BlcmF0b3I9KEV2ZW50Q2F0ZWdvcnkmJikgPSBkZWZhdWx0OworCiti
b29sIEV2ZW50Q2F0ZWdvcnk6Om9wZXJhdG9yPT0oY29uc3QgRXZlbnRDYXRlZ29yeSYgb3RoZXIp
IGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxk
c18KKyAgICYmIGlpZF8gPT0gb3RoZXIuaWlkXworICAgJiYgbmFtZV8gPT0gb3RoZXIubmFtZV87
Cit9CisKK2Jvb2wgRXZlbnRDYXRlZ29yeTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3
LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNr
ZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcs
IHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlk
KCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFz
X2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAg
ICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogaWlkICovOgor
ICAgICAgICBmaWVsZC5nZXQoJmlpZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAv
KiBuYW1lICovOgorICAgICAgICBmaWVsZC5nZXQoJm5hbWVfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93
bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2Vk
X2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBFdmVudENhdGVn
b3J5OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZm
ZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsK
KyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50
OF90PiBFdmVudENhdGVnb3J5OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9p
ZCBFdmVudENhdGVnb3J5OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29u
c3QgeworICAvLyBGaWVsZCAxOiBpaWQKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNn
LT5BcHBlbmRWYXJJbnQoMSwgaWlkXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBuYW1lCisgIGlm
IChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDIsIG5hbWVfKTsKKyAg
fQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1
bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitUcmFja0V2ZW50RGVmYXVsdHM6OlRyYWNr
RXZlbnREZWZhdWx0cygpID0gZGVmYXVsdDsKK1RyYWNrRXZlbnREZWZhdWx0czo6flRyYWNrRXZl
bnREZWZhdWx0cygpID0gZGVmYXVsdDsKK1RyYWNrRXZlbnREZWZhdWx0czo6VHJhY2tFdmVudERl
ZmF1bHRzKGNvbnN0IFRyYWNrRXZlbnREZWZhdWx0cyYpID0gZGVmYXVsdDsKK1RyYWNrRXZlbnRE
ZWZhdWx0cyYgVHJhY2tFdmVudERlZmF1bHRzOjpvcGVyYXRvcj0oY29uc3QgVHJhY2tFdmVudERl
ZmF1bHRzJikgPSBkZWZhdWx0OworVHJhY2tFdmVudERlZmF1bHRzOjpUcmFja0V2ZW50RGVmYXVs
dHMoVHJhY2tFdmVudERlZmF1bHRzJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1RyYWNrRXZlbnRE
ZWZhdWx0cyYgVHJhY2tFdmVudERlZmF1bHRzOjpvcGVyYXRvcj0oVHJhY2tFdmVudERlZmF1bHRz
JiYpID0gZGVmYXVsdDsKKworYm9vbCBUcmFja0V2ZW50RGVmYXVsdHM6Om9wZXJhdG9yPT0oY29u
c3QgVHJhY2tFdmVudERlZmF1bHRzJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9m
aWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgdHJhY2tfdXVpZF8gPT0gb3Ro
ZXIudHJhY2tfdXVpZF8KKyAgICYmIGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfID09IG90aGVy
LmV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfOworfQorCitib29sIFRyYWNrRXZlbnREZWZhdWx0
czo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICBleHRy
YV9jb3VudGVyX3RyYWNrX3V1aWRzXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIo
KTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9E
ZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxk
KCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZp
ZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChm
aWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNl
IDExIC8qIHRyYWNrX3V1aWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmdHJhY2tfdXVpZF8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzEgLyogZXh0cmFfY291bnRlcl90cmFja191dWlk
cyAqLzoKKyAgICAgICAgZXh0cmFfY291bnRlcl90cmFja191dWlkc18uZW1wbGFjZV9iYWNrKCk7
CisgICAgICAgIGZpZWxkLmdldCgmZXh0cmFfY291bnRlcl90cmFja191dWlkc18uYmFjaygpKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVB
bmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9
CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6
OnN0cmluZyBUcmFja0V2ZW50RGVmYXVsdHM6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7
Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFRyYWNrRXZlbnREZWZhdWx0czo6U2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVy
bzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5T
ZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2tFdmVudERlZmF1bHRzOjpTZXJpYWxp
emUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxMTogdHJh
Y2tfdXVpZAorICBpZiAoX2hhc19maWVsZF9bMTFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQo
MTEsIHRyYWNrX3V1aWRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDMxOiBleHRyYV9jb3VudGVyX3Ry
YWNrX3V1aWRzCisgIGZvciAoYXV0byYgaXQgOiBleHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzXykg
eworICAgIG1zZy0+QXBwZW5kVmFySW50KDMxLCBpdCk7CisgIH0KKworICBtc2ctPkFwcGVuZFJh
d1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUo
KSk7Cit9CisKKworVHJhY2tFdmVudDo6VHJhY2tFdmVudCgpID0gZGVmYXVsdDsKK1RyYWNrRXZl
bnQ6On5UcmFja0V2ZW50KCkgPSBkZWZhdWx0OworVHJhY2tFdmVudDo6VHJhY2tFdmVudChjb25z
dCBUcmFja0V2ZW50JikgPSBkZWZhdWx0OworVHJhY2tFdmVudCYgVHJhY2tFdmVudDo6b3BlcmF0
b3I9KGNvbnN0IFRyYWNrRXZlbnQmKSA9IGRlZmF1bHQ7CitUcmFja0V2ZW50OjpUcmFja0V2ZW50
KFRyYWNrRXZlbnQmJikgbm9leGNlcHQgPSBkZWZhdWx0OworVHJhY2tFdmVudCYgVHJhY2tFdmVu
dDo6b3BlcmF0b3I9KFRyYWNrRXZlbnQmJikgPSBkZWZhdWx0OworCitib29sIFRyYWNrRXZlbnQ6
Om9wZXJhdG9yPT0oY29uc3QgVHJhY2tFdmVudCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVu
a25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGNhdGVnb3J5X2lp
ZHNfID09IG90aGVyLmNhdGVnb3J5X2lpZHNfCisgICAmJiBjYXRlZ29yaWVzXyA9PSBvdGhlci5j
YXRlZ29yaWVzXworICAgJiYgbmFtZV9paWRfID09IG90aGVyLm5hbWVfaWlkXworICAgJiYgbmFt
ZV8gPT0gb3RoZXIubmFtZV8KKyAgICYmIHR5cGVfID09IG90aGVyLnR5cGVfCisgICAmJiB0cmFj
a191dWlkXyA9PSBvdGhlci50cmFja191dWlkXworICAgJiYgY291bnRlcl92YWx1ZV8gPT0gb3Ro
ZXIuY291bnRlcl92YWx1ZV8KKyAgICYmIGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfID09IG90
aGVyLmV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfCisgICAmJiBleHRyYV9jb3VudGVyX3ZhbHVl
c18gPT0gb3RoZXIuZXh0cmFfY291bnRlcl92YWx1ZXNfCisgICAmJiBkZWJ1Z19hbm5vdGF0aW9u
c18gPT0gb3RoZXIuZGVidWdfYW5ub3RhdGlvbnNfCisgICAmJiB0YXNrX2V4ZWN1dGlvbl8gPT0g
b3RoZXIudGFza19leGVjdXRpb25fCisgICAmJiBsb2dfbWVzc2FnZV8gPT0gb3RoZXIubG9nX21l
c3NhZ2VfCisgICAmJiBjY19zY2hlZHVsZXJfc3RhdGVfID09IG90aGVyLmNjX3NjaGVkdWxlcl9z
dGF0ZV8KKyAgICYmIGNocm9tZV91c2VyX2V2ZW50XyA9PSBvdGhlci5jaHJvbWVfdXNlcl9ldmVu
dF8KKyAgICYmIGNocm9tZV9rZXllZF9zZXJ2aWNlXyA9PSBvdGhlci5jaHJvbWVfa2V5ZWRfc2Vy
dmljZV8KKyAgICYmIGNocm9tZV9sZWdhY3lfaXBjXyA9PSBvdGhlci5jaHJvbWVfbGVnYWN5X2lw
Y18KKyAgICYmIGNocm9tZV9oaXN0b2dyYW1fc2FtcGxlXyA9PSBvdGhlci5jaHJvbWVfaGlzdG9n
cmFtX3NhbXBsZV8KKyAgICYmIGNocm9tZV9sYXRlbmN5X2luZm9fID09IG90aGVyLmNocm9tZV9s
YXRlbmN5X2luZm9fCisgICAmJiBjaHJvbWVfZnJhbWVfcmVwb3J0ZXJfID09IG90aGVyLmNocm9t
ZV9mcmFtZV9yZXBvcnRlcl8KKyAgICYmIHRpbWVzdGFtcF9kZWx0YV91c18gPT0gb3RoZXIudGlt
ZXN0YW1wX2RlbHRhX3VzXworICAgJiYgdGltZXN0YW1wX2Fic29sdXRlX3VzXyA9PSBvdGhlci50
aW1lc3RhbXBfYWJzb2x1dGVfdXNfCisgICAmJiB0aHJlYWRfdGltZV9kZWx0YV91c18gPT0gb3Ro
ZXIudGhyZWFkX3RpbWVfZGVsdGFfdXNfCisgICAmJiB0aHJlYWRfdGltZV9hYnNvbHV0ZV91c18g
PT0gb3RoZXIudGhyZWFkX3RpbWVfYWJzb2x1dGVfdXNfCisgICAmJiB0aHJlYWRfaW5zdHJ1Y3Rp
b25fY291bnRfZGVsdGFfID09IG90aGVyLnRocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9kZWx0YV8K
KyAgICYmIHRocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9hYnNvbHV0ZV8gPT0gb3RoZXIudGhyZWFk
X2luc3RydWN0aW9uX2NvdW50X2Fic29sdXRlXworICAgJiYgbGVnYWN5X2V2ZW50XyA9PSBvdGhl
ci5sZWdhY3lfZXZlbnRfOworfQorCitib29sIFRyYWNrRXZlbnQ6OlBhcnNlRnJvbUFycmF5KGNv
bnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgY2F0ZWdvcnlfaWlkc18uY2xlYXIoKTsK
KyAgY2F0ZWdvcmllc18uY2xlYXIoKTsKKyAgZXh0cmFfY291bnRlcl90cmFja191dWlkc18uY2xl
YXIoKTsKKyAgZXh0cmFfY291bnRlcl92YWx1ZXNfLmNsZWFyKCk7CisgIGRlYnVnX2Fubm90YXRp
b25zXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDMgLyogY2F0ZWdvcnlfaWlk
cyAqLzoKKyAgICAgICAgY2F0ZWdvcnlfaWlkc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZp
ZWxkLmdldCgmY2F0ZWdvcnlfaWlkc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDIyIC8qIGNhdGVnb3JpZXMgKi86CisgICAgICAgIGNhdGVnb3JpZXNfLmVtcGxhY2VfYmFj
aygpOworICAgICAgICBmaWVsZC5nZXQoJmNhdGVnb3JpZXNfLmJhY2soKSk7CisgICAgICAgIGJy
ZWFrOworICAgICAgY2FzZSAxMCAvKiBuYW1lX2lpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZu
YW1lX2lpZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjMgLyogbmFtZSAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZuYW1lXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5IC8q
IHR5cGUgKi86CisgICAgICAgIGZpZWxkLmdldCgmdHlwZV8pOworICAgICAgICBicmVhazsKKyAg
ICAgIGNhc2UgMTEgLyogdHJhY2tfdXVpZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0cmFja191
dWlkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMCAvKiBjb3VudGVyX3ZhbHVlICov
OgorICAgICAgICBmaWVsZC5nZXQoJmNvdW50ZXJfdmFsdWVfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDMxIC8qIGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMgKi86CisgICAgICAgIGV4
dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5n
ZXQoJmV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHNfLmJhY2soKSk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgY2FzZSAxMiAvKiBleHRyYV9jb3VudGVyX3ZhbHVlcyAqLzoKKyAgICAgICAgZXh0cmFf
Y291bnRlcl92YWx1ZXNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBmaWVsZC5nZXQoJmV4dHJh
X2NvdW50ZXJfdmFsdWVzXy5iYWNrKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAv
KiBkZWJ1Z19hbm5vdGF0aW9ucyAqLzoKKyAgICAgICAgZGVidWdfYW5ub3RhdGlvbnNfLmVtcGxh
Y2VfYmFjaygpOworICAgICAgICBkZWJ1Z19hbm5vdGF0aW9uc18uYmFjaygpLlBhcnNlRnJvbVN0
cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
NSAvKiB0YXNrX2V4ZWN1dGlvbiAqLzoKKyAgICAgICAgKCp0YXNrX2V4ZWN1dGlvbl8pLlBhcnNl
RnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAg
IGNhc2UgMjEgLyogbG9nX21lc3NhZ2UgKi86CisgICAgICAgICgqbG9nX21lc3NhZ2VfKS5QYXJz
ZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDI0IC8qIGNjX3NjaGVkdWxlcl9zdGF0ZSAqLzoKKyAgICAgICAgKCpjY19zY2hlZHVs
ZXJfc3RhdGVfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBjYXNlIDI1IC8qIGNocm9tZV91c2VyX2V2ZW50ICovOgorICAgICAg
ICAoKmNocm9tZV91c2VyX2V2ZW50XykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJp
bmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNiAvKiBjaHJvbWVfa2V5ZWRfc2Vy
dmljZSAqLzoKKyAgICAgICAgKCpjaHJvbWVfa2V5ZWRfc2VydmljZV8pLlBhcnNlRnJvbVN0cmlu
ZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjcg
LyogY2hyb21lX2xlZ2FjeV9pcGMgKi86CisgICAgICAgICgqY2hyb21lX2xlZ2FjeV9pcGNfKS5Q
YXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIDI4IC8qIGNocm9tZV9oaXN0b2dyYW1fc2FtcGxlICovOgorICAgICAgICAoKmNo
cm9tZV9oaXN0b2dyYW1fc2FtcGxlXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJp
bmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOSAvKiBjaHJvbWVfbGF0ZW5jeV9p
bmZvICovOgorICAgICAgICAoKmNocm9tZV9sYXRlbmN5X2luZm9fKS5QYXJzZUZyb21TdHJpbmco
ZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMyIC8q
IGNocm9tZV9mcmFtZV9yZXBvcnRlciAqLzoKKyAgICAgICAgKCpjaHJvbWVfZnJhbWVfcmVwb3J0
ZXJfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDEgLyogdGltZXN0YW1wX2RlbHRhX3VzICovOgorICAgICAgICBmaWVs
ZC5nZXQoJnRpbWVzdGFtcF9kZWx0YV91c18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
MTYgLyogdGltZXN0YW1wX2Fic29sdXRlX3VzICovOgorICAgICAgICBmaWVsZC5nZXQoJnRpbWVz
dGFtcF9hYnNvbHV0ZV91c18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiB0aHJl
YWRfdGltZV9kZWx0YV91cyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0aHJlYWRfdGltZV9kZWx0
YV91c18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTcgLyogdGhyZWFkX3RpbWVfYWJz
b2x1dGVfdXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmdGhyZWFkX3RpbWVfYWJzb2x1dGVfdXNf
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDggLyogdGhyZWFkX2luc3RydWN0aW9uX2Nv
dW50X2RlbHRhICovOgorICAgICAgICBmaWVsZC5nZXQoJnRocmVhZF9pbnN0cnVjdGlvbl9jb3Vu
dF9kZWx0YV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjAgLyogdGhyZWFkX2luc3Ry
dWN0aW9uX2NvdW50X2Fic29sdXRlICovOgorICAgICAgICBmaWVsZC5nZXQoJnRocmVhZF9pbnN0
cnVjdGlvbl9jb3VudF9hYnNvbHV0ZV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAv
KiBsZWdhY3lfZXZlbnQgKi86CisgICAgICAgICgqbGVnYWN5X2V2ZW50XykuUGFyc2VGcm9tU3Ry
aW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVs
dDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7
CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAh
ZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2tFdmVudDo6U2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cu
U2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gVHJhY2tFdmVu
dDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJl
ZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAg
cmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgVHJhY2tFdmVudDo6U2Vy
aWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMzog
Y2F0ZWdvcnlfaWlkcworICBmb3IgKGF1dG8mIGl0IDogY2F0ZWdvcnlfaWlkc18pIHsKKyAgICBt
c2ctPkFwcGVuZFZhckludCgzLCBpdCk7CisgIH0KKworICAvLyBGaWVsZCAyMjogY2F0ZWdvcmll
cworICBmb3IgKGF1dG8mIGl0IDogY2F0ZWdvcmllc18pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmlu
ZygyMiwgaXQpOworICB9CisKKyAgLy8gRmllbGQgMTA6IG5hbWVfaWlkCisgIGlmIChfaGFzX2Zp
ZWxkX1sxMF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMCwgbmFtZV9paWRfKTsKKyAgfQor
CisgIC8vIEZpZWxkIDIzOiBuYW1lCisgIGlmIChfaGFzX2ZpZWxkX1syM10pIHsKKyAgICBtc2ct
PkFwcGVuZFN0cmluZygyMywgbmFtZV8pOworICB9CisKKyAgLy8gRmllbGQgOTogdHlwZQorICBp
ZiAoX2hhc19maWVsZF9bOV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCg5LCB0eXBlXyk7Cisg
IH0KKworICAvLyBGaWVsZCAxMTogdHJhY2tfdXVpZAorICBpZiAoX2hhc19maWVsZF9bMTFdKSB7
CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTEsIHRyYWNrX3V1aWRfKTsKKyAgfQorCisgIC8vIEZp
ZWxkIDMwOiBjb3VudGVyX3ZhbHVlCisgIGlmIChfaGFzX2ZpZWxkX1szMF0pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCgzMCwgY291bnRlcl92YWx1ZV8pOworICB9CisKKyAgLy8gRmllbGQgMzE6
IGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMKKyAgZm9yIChhdXRvJiBpdCA6IGV4dHJhX2NvdW50
ZXJfdHJhY2tfdXVpZHNfKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMzEsIGl0KTsKKyAgfQor
CisgIC8vIEZpZWxkIDEyOiBleHRyYV9jb3VudGVyX3ZhbHVlcworICBmb3IgKGF1dG8mIGl0IDog
ZXh0cmFfY291bnRlcl92YWx1ZXNfKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTIsIGl0KTsK
KyAgfQorCisgIC8vIEZpZWxkIDQ6IGRlYnVnX2Fubm90YXRpb25zCisgIGZvciAoYXV0byYgaXQg
OiBkZWJ1Z19hbm5vdGF0aW9uc18pIHsKKyAgICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3Rl
ZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDQpKTsKKyAgfQorCisgIC8vIEZpZWxkIDU6
IHRhc2tfZXhlY3V0aW9uCisgIGlmIChfaGFzX2ZpZWxkX1s1XSkgeworICAgICgqdGFza19leGVj
dXRpb25fKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+KDUpKTsKKyAgfQorCisgIC8vIEZpZWxkIDIxOiBsb2dfbWVzc2FnZQorICBpZiAoX2hh
c19maWVsZF9bMjFdKSB7CisgICAgKCpsb2dfbWVzc2FnZV8pLlNlcmlhbGl6ZShtc2ctPkJlZ2lu
TmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMjEpKTsKKyAgfQorCisgIC8vIEZp
ZWxkIDI0OiBjY19zY2hlZHVsZXJfc3RhdGUKKyAgaWYgKF9oYXNfZmllbGRfWzI0XSkgeworICAg
ICgqY2Nfc2NoZWR1bGVyX3N0YXRlXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdl
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyNCkpOworICB9CisKKyAgLy8gRmllbGQgMjU6IGNocm9t
ZV91c2VyX2V2ZW50CisgIGlmIChfaGFzX2ZpZWxkX1syNV0pIHsKKyAgICAoKmNocm9tZV91c2Vy
X2V2ZW50XykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPigyNSkpOworICB9CisKKyAgLy8gRmllbGQgMjY6IGNocm9tZV9rZXllZF9zZXJ2aWNl
CisgIGlmIChfaGFzX2ZpZWxkX1syNl0pIHsKKyAgICAoKmNocm9tZV9rZXllZF9zZXJ2aWNlXyku
U2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigy
NikpOworICB9CisKKyAgLy8gRmllbGQgMjc6IGNocm9tZV9sZWdhY3lfaXBjCisgIGlmIChfaGFz
X2ZpZWxkX1syN10pIHsKKyAgICAoKmNocm9tZV9sZWdhY3lfaXBjXykuU2VyaWFsaXplKG1zZy0+
QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyNykpOworICB9CisKKyAg
Ly8gRmllbGQgMjg6IGNocm9tZV9oaXN0b2dyYW1fc2FtcGxlCisgIGlmIChfaGFzX2ZpZWxkX1sy
OF0pIHsKKyAgICAoKmNocm9tZV9oaXN0b2dyYW1fc2FtcGxlXykuU2VyaWFsaXplKG1zZy0+QmVn
aW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyOCkpOworICB9CisKKyAgLy8g
RmllbGQgMjk6IGNocm9tZV9sYXRlbmN5X2luZm8KKyAgaWYgKF9oYXNfZmllbGRfWzI5XSkgewor
ICAgICgqY2hyb21lX2xhdGVuY3lfaW5mb18pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVz
c2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMjkpKTsKKyAgfQorCisgIC8vIEZpZWxkIDMyOiBj
aHJvbWVfZnJhbWVfcmVwb3J0ZXIKKyAgaWYgKF9oYXNfZmllbGRfWzMyXSkgeworICAgICgqY2hy
b21lX2ZyYW1lX3JlcG9ydGVyXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6
cHJvdG96ZXJvOjpNZXNzYWdlPigzMikpOworICB9CisKKyAgLy8gRmllbGQgMTogdGltZXN0YW1w
X2RlbHRhX3VzCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50
KDEsIHRpbWVzdGFtcF9kZWx0YV91c18pOworICB9CisKKyAgLy8gRmllbGQgMTY6IHRpbWVzdGFt
cF9hYnNvbHV0ZV91cworICBpZiAoX2hhc19maWVsZF9bMTZdKSB7CisgICAgbXNnLT5BcHBlbmRW
YXJJbnQoMTYsIHRpbWVzdGFtcF9hYnNvbHV0ZV91c18pOworICB9CisKKyAgLy8gRmllbGQgMjog
dGhyZWFkX3RpbWVfZGVsdGFfdXMKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5B
cHBlbmRWYXJJbnQoMiwgdGhyZWFkX3RpbWVfZGVsdGFfdXNfKTsKKyAgfQorCisgIC8vIEZpZWxk
IDE3OiB0aHJlYWRfdGltZV9hYnNvbHV0ZV91cworICBpZiAoX2hhc19maWVsZF9bMTddKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMTcsIHRocmVhZF90aW1lX2Fic29sdXRlX3VzXyk7CisgIH0K
KworICAvLyBGaWVsZCA4OiB0aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnRfZGVsdGEKKyAgaWYgKF9o
YXNfZmllbGRfWzhdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoOCwgdGhyZWFkX2luc3RydWN0
aW9uX2NvdW50X2RlbHRhXyk7CisgIH0KKworICAvLyBGaWVsZCAyMDogdGhyZWFkX2luc3RydWN0
aW9uX2NvdW50X2Fic29sdXRlCisgIGlmIChfaGFzX2ZpZWxkX1syMF0pIHsKKyAgICBtc2ctPkFw
cGVuZFZhckludCgyMCwgdGhyZWFkX2luc3RydWN0aW9uX2NvdW50X2Fic29sdXRlXyk7CisgIH0K
KworICAvLyBGaWVsZCA2OiBsZWdhY3lfZXZlbnQKKyAgaWYgKF9oYXNfZmllbGRfWzZdKSB7Cisg
ICAgKCpsZWdhY3lfZXZlbnRfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+KDYpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRl
cyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKwor
CitUcmFja0V2ZW50X0xlZ2FjeUV2ZW50OjpUcmFja0V2ZW50X0xlZ2FjeUV2ZW50KCkgPSBkZWZh
dWx0OworVHJhY2tFdmVudF9MZWdhY3lFdmVudDo6flRyYWNrRXZlbnRfTGVnYWN5RXZlbnQoKSA9
IGRlZmF1bHQ7CitUcmFja0V2ZW50X0xlZ2FjeUV2ZW50OjpUcmFja0V2ZW50X0xlZ2FjeUV2ZW50
KGNvbnN0IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQmKSA9IGRlZmF1bHQ7CitUcmFja0V2ZW50X0xl
Z2FjeUV2ZW50JiBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50OjpvcGVyYXRvcj0oY29uc3QgVHJhY2tF
dmVudF9MZWdhY3lFdmVudCYpID0gZGVmYXVsdDsKK1RyYWNrRXZlbnRfTGVnYWN5RXZlbnQ6OlRy
YWNrRXZlbnRfTGVnYWN5RXZlbnQoVHJhY2tFdmVudF9MZWdhY3lFdmVudCYmKSBub2V4Y2VwdCA9
IGRlZmF1bHQ7CitUcmFja0V2ZW50X0xlZ2FjeUV2ZW50JiBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50
OjpvcGVyYXRvcj0oVHJhY2tFdmVudF9MZWdhY3lFdmVudCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wg
VHJhY2tFdmVudF9MZWdhY3lFdmVudDo6b3BlcmF0b3I9PShjb25zdCBUcmFja0V2ZW50X0xlZ2Fj
eUV2ZW50JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVy
LnVua25vd25fZmllbGRzXworICAgJiYgbmFtZV9paWRfID09IG90aGVyLm5hbWVfaWlkXworICAg
JiYgcGhhc2VfID09IG90aGVyLnBoYXNlXworICAgJiYgZHVyYXRpb25fdXNfID09IG90aGVyLmR1
cmF0aW9uX3VzXworICAgJiYgdGhyZWFkX2R1cmF0aW9uX3VzXyA9PSBvdGhlci50aHJlYWRfZHVy
YXRpb25fdXNfCisgICAmJiB0aHJlYWRfaW5zdHJ1Y3Rpb25fZGVsdGFfID09IG90aGVyLnRocmVh
ZF9pbnN0cnVjdGlvbl9kZWx0YV8KKyAgICYmIHVuc2NvcGVkX2lkXyA9PSBvdGhlci51bnNjb3Bl
ZF9pZF8KKyAgICYmIGxvY2FsX2lkXyA9PSBvdGhlci5sb2NhbF9pZF8KKyAgICYmIGdsb2JhbF9p
ZF8gPT0gb3RoZXIuZ2xvYmFsX2lkXworICAgJiYgaWRfc2NvcGVfID09IG90aGVyLmlkX3Njb3Bl
XworICAgJiYgdXNlX2FzeW5jX3R0c18gPT0gb3RoZXIudXNlX2FzeW5jX3R0c18KKyAgICYmIGJp
bmRfaWRfID09IG90aGVyLmJpbmRfaWRfCisgICAmJiBiaW5kX3RvX2VuY2xvc2luZ18gPT0gb3Ro
ZXIuYmluZF90b19lbmNsb3NpbmdfCisgICAmJiBmbG93X2RpcmVjdGlvbl8gPT0gb3RoZXIuZmxv
d19kaXJlY3Rpb25fCisgICAmJiBpbnN0YW50X2V2ZW50X3Njb3BlXyA9PSBvdGhlci5pbnN0YW50
X2V2ZW50X3Njb3BlXworICAgJiYgcGlkX292ZXJyaWRlXyA9PSBvdGhlci5waWRfb3ZlcnJpZGVf
CisgICAmJiB0aWRfb3ZlcnJpZGVfID09IG90aGVyLnRpZF9vdmVycmlkZV87Cit9CisKK2Jvb2wg
VHJhY2tFdmVudF9MZWdhY3lFdmVudDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBz
aXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogbmFtZV9paWQgKi86
CisgICAgICAgIGZpZWxkLmdldCgmbmFtZV9paWRfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDIgLyogcGhhc2UgKi86CisgICAgICAgIGZpZWxkLmdldCgmcGhhc2VfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDMgLyogZHVyYXRpb25fdXMgKi86CisgICAgICAgIGZpZWxkLmdl
dCgmZHVyYXRpb25fdXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQgLyogdGhyZWFk
X2R1cmF0aW9uX3VzICovOgorICAgICAgICBmaWVsZC5nZXQoJnRocmVhZF9kdXJhdGlvbl91c18p
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTUgLyogdGhyZWFkX2luc3RydWN0aW9uX2Rl
bHRhICovOgorICAgICAgICBmaWVsZC5nZXQoJnRocmVhZF9pbnN0cnVjdGlvbl9kZWx0YV8pOwor
ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNiAvKiB1bnNjb3BlZF9pZCAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZ1bnNjb3BlZF9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAg
LyogbG9jYWxfaWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmbG9jYWxfaWRfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIDExIC8qIGdsb2JhbF9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0
KCZnbG9iYWxfaWRfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDcgLyogaWRfc2NvcGUg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmaWRfc2NvcGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDkgLyogdXNlX2FzeW5jX3R0cyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ1c2VfYXN5
bmNfdHRzXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4IC8qIGJpbmRfaWQgKi86Cisg
ICAgICAgIGZpZWxkLmdldCgmYmluZF9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
MTIgLyogYmluZF90b19lbmNsb3NpbmcgKi86CisgICAgICAgIGZpZWxkLmdldCgmYmluZF90b19l
bmNsb3NpbmdfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEzIC8qIGZsb3dfZGlyZWN0
aW9uICovOgorICAgICAgICBmaWVsZC5nZXQoJmZsb3dfZGlyZWN0aW9uXyk7CisgICAgICAgIGJy
ZWFrOworICAgICAgY2FzZSAxNCAvKiBpbnN0YW50X2V2ZW50X3Njb3BlICovOgorICAgICAgICBm
aWVsZC5nZXQoJmluc3RhbnRfZXZlbnRfc2NvcGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj
YXNlIDE4IC8qIHBpZF9vdmVycmlkZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwaWRfb3ZlcnJp
ZGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE5IC8qIHRpZF9vdmVycmlkZSAqLzoK
KyAgICAgICAgZmllbGQuZ2V0KCZ0aWRfb3ZlcnJpZGVfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9m
aWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vy
cm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBUcmFja0V2ZW50X0xl
Z2FjeUV2ZW50OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rv
cjx1aW50OF90PiBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50OjpTZXJpYWxpemVBc0FycmF5KCkgY29u
c3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBt
c2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJy
YXkoKTsKK30KKwordm9pZCBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50OjpTZXJpYWxpemUoOjpwcm90
b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBuYW1lX2lpZAorICBp
ZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCBuYW1lX2lpZF8p
OworICB9CisKKyAgLy8gRmllbGQgMjogcGhhc2UKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgcGhhc2VfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IGR1
cmF0aW9uX3VzCisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50
KDMsIGR1cmF0aW9uX3VzXyk7CisgIH0KKworICAvLyBGaWVsZCA0OiB0aHJlYWRfZHVyYXRpb25f
dXMKKyAgaWYgKF9oYXNfZmllbGRfWzRdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoNCwgdGhy
ZWFkX2R1cmF0aW9uX3VzXyk7CisgIH0KKworICAvLyBGaWVsZCAxNTogdGhyZWFkX2luc3RydWN0
aW9uX2RlbHRhCisgIGlmIChfaGFzX2ZpZWxkX1sxNV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCgxNSwgdGhyZWFkX2luc3RydWN0aW9uX2RlbHRhXyk7CisgIH0KKworICAvLyBGaWVsZCA2OiB1
bnNjb3BlZF9pZAorICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAgICBtc2ctPkFwcGVuZFZhcklu
dCg2LCB1bnNjb3BlZF9pZF8pOworICB9CisKKyAgLy8gRmllbGQgMTA6IGxvY2FsX2lkCisgIGlm
IChfaGFzX2ZpZWxkX1sxMF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMCwgbG9jYWxfaWRf
KTsKKyAgfQorCisgIC8vIEZpZWxkIDExOiBnbG9iYWxfaWQKKyAgaWYgKF9oYXNfZmllbGRfWzEx
XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDExLCBnbG9iYWxfaWRfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDc6IGlkX3Njb3BlCisgIGlmIChfaGFzX2ZpZWxkX1s3XSkgeworICAgIG1zZy0+QXBw
ZW5kU3RyaW5nKDcsIGlkX3Njb3BlXyk7CisgIH0KKworICAvLyBGaWVsZCA5OiB1c2VfYXN5bmNf
dHRzCisgIGlmIChfaGFzX2ZpZWxkX1s5XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCg5
LCB1c2VfYXN5bmNfdHRzXyk7CisgIH0KKworICAvLyBGaWVsZCA4OiBiaW5kX2lkCisgIGlmIChf
aGFzX2ZpZWxkX1s4XSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDgsIGJpbmRfaWRfKTsKKyAg
fQorCisgIC8vIEZpZWxkIDEyOiBiaW5kX3RvX2VuY2xvc2luZworICBpZiAoX2hhc19maWVsZF9b
MTJdKSB7CisgICAgbXNnLT5BcHBlbmRUaW55VmFySW50KDEyLCBiaW5kX3RvX2VuY2xvc2luZ18p
OworICB9CisKKyAgLy8gRmllbGQgMTM6IGZsb3dfZGlyZWN0aW9uCisgIGlmIChfaGFzX2ZpZWxk
X1sxM10pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxMywgZmxvd19kaXJlY3Rpb25fKTsKKyAg
fQorCisgIC8vIEZpZWxkIDE0OiBpbnN0YW50X2V2ZW50X3Njb3BlCisgIGlmIChfaGFzX2ZpZWxk
X1sxNF0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxNCwgaW5zdGFudF9ldmVudF9zY29wZV8p
OworICB9CisKKyAgLy8gRmllbGQgMTg6IHBpZF9vdmVycmlkZQorICBpZiAoX2hhc19maWVsZF9b
MThdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMTgsIHBpZF9vdmVycmlkZV8pOworICB9CisK
KyAgLy8gRmllbGQgMTk6IHRpZF9vdmVycmlkZQorICBpZiAoX2hhc19maWVsZF9bMTldKSB7Cisg
ICAgbXNnLT5BcHBlbmRWYXJJbnQoMTksIHRpZF9vdmVycmlkZV8pOworICB9CisKKyAgbXNnLT5B
cHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRz
Xy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFj
ZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9w
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2Nv
bmZpZy9hbmRyb2lkL2FuZHJvaWRfbG9nX2NvbmZpZy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFs
bHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9hbmRyb2lkL2FuZHJvaWRfcG9sbGVkX3N0
YXRlX2NvbmZpZy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85
OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL2NvbmZpZy9hbmRyb2lkL3BhY2thZ2VzX2xpc3RfY29uZmlnLnBiemVyby5jYworLy8gSW50
ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL2Z0cmFjZS9mdHJhY2VfY29u
ZmlnLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29u
ZmlnL2dwdS9ncHVfY291bnRlcl9jb25maWcucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVt
cHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTog
Z2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvZ3B1L3Z1bGthbl9tZW1vcnlfY29uZmlnLnBiemVy
by5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL2lub2Rl
X2ZpbGUvaW5vZGVfZmlsZV9jb25maWcucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5
IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2Vu
L3Byb3Rvcy9wZXJmZXR0by9jb25maWcvcG93ZXIvYW5kcm9pZF9wb3dlcl9jb25maWcucGJ6ZXJv
LmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvY2Vz
c19zdGF0cy9wcm9jZXNzX3N0YXRzX2NvbmZpZy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkg
ZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNl
OiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9wcm9maWxpbmcvaGVhcHByb2ZkX2NvbmZpZy5w
Ynplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9w
cm9maWxpbmcvamF2YV9ocHJvZl9jb25maWcucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVt
cHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTog
Z2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvZmlsaW5nL3BlcmZfZXZlbnRfY29uZmlnLnBi
emVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3N5
c19zdGF0cy9zeXNfc3RhdHNfY29uZmlnLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0
eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdl
bi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3RyYWNrX2V2ZW50L3RyYWNrX2V2ZW50X2NvbmZpZy5w
Ynplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9j
aHJvbWUvY2hyb21lX2NvbmZpZy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNy
YnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJv
dG9zL3BlcmZldHRvL2NvbmZpZy9kYXRhX3NvdXJjZV9jb25maWcucGJ6ZXJvLmNjCisvLyBJbnRl
bnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvdGVzdF9jb25maWcucGJ6ZXJv
LmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvdHJhY2Vf
Y29uZmlnLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2
NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8v
dHJhY2UvY2xvY2tfc25hcHNob3QucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChj
cmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3By
b3Rvcy9wZXJmZXR0by90cmFjZS90cmlnZ2VyLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBl
bXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6
IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2Uvc3lzdGVtX2luZm8ucGJ6ZXJvLmNjCisvLyBJbnRl
bnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9hbmRyb2lkL2FuZHJvaWRfbG9n
LnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2Uv
YW5kcm9pZC9ncHVfbWVtX2V2ZW50LnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAo
Y3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9w
cm90b3MvcGVyZmV0dG8vdHJhY2UvYW5kcm9pZC9ncmFwaGljc19mcmFtZV9ldmVudC5wYnplcm8u
Y2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1h
bGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2FuZHJvaWQv
aW5pdGlhbF9kaXNwbGF5X3N0YXRlLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAo
Y3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9w
cm90b3MvcGVyZmV0dG8vdHJhY2UvYW5kcm9pZC9wYWNrYWdlc19saXN0LnBiemVyby5jYworLy8g
SW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvY2hyb21lL2Nocm9tZV9i
ZW5jaG1hcmtfbWV0YWRhdGEucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1
Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rv
cy9wZXJmZXR0by90cmFjZS9jaHJvbWUvY2hyb21lX21ldGFkYXRhLnBiemVyby5jYworLy8gSW50
ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvY2hyb21lL2Nocm9tZV90cmFj
ZV9ldmVudC5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgx
NjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRv
L3RyYWNlL2ZpbGVzeXN0ZW0vaW5vZGVfZmlsZV9tYXAucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25h
bGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNv
dXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvZnRyYWNlX2V2ZW50LnBiemVy
by5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNl
L2Z0cmFjZV9ldmVudF9idW5kbGUucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChj
cmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3By
b3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvZnRyYWNlX3N0YXRzLnBiemVyby5jYworLy8gSW50
ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL3Rlc3RfYnVuZGxl
X3dyYXBwZXIucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4
MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0
by90cmFjZS9mdHJhY2UvZ2VuZXJpYy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkg
KGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4v
cHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9iaW5kZXIucGJ6ZXJvLmNjCisvLyBJbnRlbnRp
b25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvYmxvY2sucGJ6ZXJvLmNj
CisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvY2dy
b3VwLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJh
Y2UvZnRyYWNlL2Nsay5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNv
bS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3Bl
cmZldHRvL3RyYWNlL2Z0cmFjZS9jb21wYWN0aW9uLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxs
eSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2V4dDQucGJ6ZXJvLmNjCisvLyBJ
bnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvZjJmcy5wYnpl
cm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFj
ZS9mZW5jZS5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgx
NjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRv
L3RyYWNlL2Z0cmFjZS9maWxlbWFwLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAo
Y3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9w
cm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2Z0cmFjZS5wYnplcm8uY2MKKy8vIEludGVudGlv
bmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4g
c291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9ncHVfbWVtLnBiemVyby5j
YworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2ky
Yy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNl
L2Z0cmFjZS9pb24ucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20v
OTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJm
ZXR0by90cmFjZS9mdHJhY2UvaXBpLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAo
Y3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9w
cm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2lycS5wYnplcm8uY2MKKy8vIEludGVudGlvbmFs
bHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9rbWVtLnBiemVyby5jYworLy8g
SW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2xvd21lbW9y
eWtpbGxlci5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgx
NjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRv
L3RyYWNlL2Z0cmFjZS9tZHNzLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3Ji
dWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90
b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL21tX2V2ZW50LnBiemVyby5jYworLy8gSW50ZW50aW9u
YWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBz
b3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL29vbS5wYnplcm8uY2MKKy8v
IEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9wb3dlci5w
Ynplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0
cmFjZS9yYXdfc3lzY2FsbHMucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1
Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rv
cy9wZXJmZXR0by90cmFjZS9mdHJhY2UvcmVndWxhdG9yLnBiemVyby5jYworLy8gSW50ZW50aW9u
YWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBz
b3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL3NjaGVkLnBiemVyby5jYwor
Ly8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL3NjbS5w
Ynplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0
cmFjZS9zZGUucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4
MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0
by90cmFjZS9mdHJhY2Uvc2lnbmFsLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAo
Y3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9w
cm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL3N5bmMucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25h
bGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNv
dXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2Uvc3lzdHJhY2UucGJ6ZXJvLmNj
CisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvdGFz
ay5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNl
L2Z0cmFjZS92bXNjYW4ucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5j
b20vOTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by90cmFjZS9mdHJhY2Uvd29ya3F1ZXVlLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxs
eSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvcGVyZmV0dG8vcGVyZmV0dG9fbWV0YXRyYWNl
LnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2Uv
cGVyZmV0dG8vdHJhY2luZ19zZXJ2aWNlX2V2ZW50LnBiemVyby5jYworLy8gSW50ZW50aW9uYWxs
eSBlbXB0eSAoY3JidWcuY29tLzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvcG93ZXIvYmF0dGVyeV9jb3VudGVycy5wYnpl
cm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3Bvd2Vy
L3Bvd2VyX3JhaWxzLnBiemVyby5jYworLy8gSW50ZW50aW9uYWxseSBlbXB0eSAoY3JidWcuY29t
Lzk5ODE2NSkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVy
ZmV0dG8vdHJhY2UvcHMvcHJvY2Vzc19zdGF0cy5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkg
ZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNl
OiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3BzL3Byb2Nlc3NfdHJlZS5wYnplcm8uY2MKKy8v
IEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3N5c19zdGF0cy9zeXNf
c3RhdHMucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1
KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90
cmFjZS9zeXN0ZW1faW5mby9jcHVfaW5mby5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1w
dHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBn
ZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNlX3BhY2tldF9kZWZhdWx0cy5wYnplcm8uY2MK
Ky8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVnLmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3Rlc3RfZXZlbnQu
cGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20vOTk4MTY1KQorLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90
cmFjZV9wYWNrZXQucGJ6ZXJvLmNjCisvLyBJbnRlbnRpb25hbGx5IGVtcHR5IChjcmJ1Zy5jb20v
OTk4MTY1KQorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJm
ZXR0by90cmFjZS90cmFjZS5wYnplcm8uY2MKKy8vIEludGVudGlvbmFsbHkgZW1wdHkgKGNyYnVn
LmNvbS85OTgxNjUpCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvdHJhY2lu
Zy90cmFjZV93cml0ZXJfYmFzZS5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjog
aW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL3RyYWNlX3dyaXRlcl9iYXNlLmgKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExp
Y2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5z
ZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3
aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl
IGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0y
LjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRv
IGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBp
cyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVT
IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisg
KiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVy
bWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisj
aWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDRV9XUklURVJfQkFTRV9IXworI2Rl
ZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfVFJBQ0VfV1JJVEVSX0JBU0VfSF8KKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21l
c3NhZ2VfaGFuZGxlLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKK25hbWVzcGFjZSBwcm90
b3MgeworbmFtZXNwYWNlIHBiemVybyB7CitjbGFzcyBUcmFjZVBhY2tldDsKK30gIC8vIG5hbWVz
cGFjZSBwYnplcm8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKKworLy8gVGhlIGJhcmUtbWluaW11
bSBzdWJzZXQgb2YgdGhlIFRyYWNlV3JpdGVyIGludGVyZmFjZSB0aGF0IGlzIGV4cG9zZWQgYXMg
YQorLy8gZnVsbHkgcHVibGljIEFQSS4KKy8vIFNlZSBjb21tZW50cyBpbiAvaW5jbHVkZS9wZXJm
ZXR0by9leHQvdHJhY2luZy9jb3JlL3RyYWNlX3dyaXRlci5oLgorY2xhc3MgVHJhY2VXcml0ZXJC
YXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRyYWNlV3JpdGVyQmFzZSgpOworCisgIHZpcnR1
YWwgcHJvdG96ZXJvOjpNZXNzYWdlSGFuZGxlPHByb3Rvczo6cGJ6ZXJvOjpUcmFjZVBhY2tldD4K
KyAgTmV3VHJhY2VQYWNrZXQoKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIEZsdXNoKHN0ZDo6ZnVu
Y3Rpb248dm9pZCgpPiBjYWxsYmFjayA9IHt9KSA9IDA7CisgIHZpcnR1YWwgdWludDY0X3Qgd3Jp
dHRlbigpIGNvbnN0ID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5k
aWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDRV9XUklURVJfQkFTRV9IXworLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cisg
KgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhl
ICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21w
bGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhl
IExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9M
SUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh
Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBM
aWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdB
UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w
bGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVy
bmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgor
ICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Ry
YWNpbmcvdHJhY2Vfd3JpdGVyX2Jhc2UuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworLy8g
VGhpcyBkZXN0cnVjdG9yIG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gYSBkZWRpY2F0ZWQgdHJhbnNs
YXRpb24gdW5pdCBhbmQKKy8vIGNhbm5vdCBiZSBtZXJnZWQgdG9nZXRoZXIgd2l0aCB0aGUgb3Ro
ZXIgb25lcyBpbiB2aXJ0dWFsX2Rlc3RydWN0b3JzLmNjLgorLy8gVGhpcyBpcyBiZWNhdXNlIHRy
YWNlX3dyaXRlcl9iYXNlLmgvY2MgIGlzIHBhcnQgb2YgYSBzZXBhcmF0ZSB0YXJnZXQKKy8vIChz
cmMvcHVibGljOmNvbW1vbikgdGhhdCBpcyBsaW5rZWQgYWxzbyBieSBvdGhlciBwYXJ0IG9mIHRo
ZSBjb2RlYmFzZS4KKworVHJhY2VXcml0ZXJCYXNlOjp+VHJhY2VXcml0ZXJCYXNlKCkgPSBkZWZh
dWx0OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBzb3VyY2U6IHNyYy90cmFjaW5nL2NvcmUvaWRfYWxsb2NhdG9yLmNjCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gaGVhZGVyOiBzcmMvdHJhY2luZy9jb3JlL2lkX2FsbG9jYXRvci5oCisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAq
CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg
IkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs
aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg
TGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJ
Q0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFn
cmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp
Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FS
UkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBs
aWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu
aW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisg
Ki8KKworI2lmbmRlZiBTUkNfVFJBQ0lOR19DT1JFX0lEX0FMTE9DQVRPUl9IXworI2RlZmluZSBT
UkNfVFJBQ0lOR19DT1JFX0lEX0FMTE9DQVRPUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisK
KyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CisKKy8vIEhhbmRsZXMgYXNzaWdtZW50IG9mIElEcyAoaW50IHR5cGVzKSBmcm9t
IGEgZml4ZWQtc2l6ZSBwb29sLgorLy8gWmVybyBpcyBub3QgY29uc2lkZXJlZCBhIHZhbGlkIElE
LgorLy8gVGhlIGJhc2UgY2xhc3MgdGFrZXMgYWx3YXlzIGEgdWludDMyX3QgYW5kIHRoZSBkZXJp
dmVkIGNsYXNzIGNhc3RzIGFuZCBjaGVja3MKKy8vIGJvdW5kcyBhdCBjb21waWxlIHRpbWUuIFRo
aXMgaXMgdG8gYXZvaWQgYmxvYXRpbmcgY29kZSB3aXRoIGRpZmZlcmVudAorLy8gaW5zdGFuY2Vz
IG9mIHRoZSBtYWluIGNsYXNzIGZvciBlYWNoIHNpemUuCitjbGFzcyBJZEFsbG9jYXRvckdlbmVy
aWMgeworIHB1YmxpYzoKKyAgLy8gfG1heF9pZHwgaXMgaW5jbHVzaXZlLgorICBleHBsaWNpdCBJ
ZEFsbG9jYXRvckdlbmVyaWModWludDMyX3QgbWF4X2lkKTsKKyAgfklkQWxsb2NhdG9yR2VuZXJp
YygpOworCisgIC8vIFJldHVybnMgYW4gSUQgaW4gdGhlIHJhbmdlIFsxLCBtYXhfaWRdIG9yIDAg
aWYgbm8gbW9yZSBpZHMgYXJlIGF2YWlsYWJsZS4KKyAgdWludDMyX3QgQWxsb2NhdGVHZW5lcmlj
KCk7CisgIHZvaWQgRnJlZUdlbmVyaWModWludDMyX3QpOworCisgcHJpdmF0ZToKKyAgSWRBbGxv
Y2F0b3JHZW5lcmljKGNvbnN0IElkQWxsb2NhdG9yR2VuZXJpYyYpID0gZGVsZXRlOworICBJZEFs
bG9jYXRvckdlbmVyaWMmIG9wZXJhdG9yPShjb25zdCBJZEFsbG9jYXRvckdlbmVyaWMmKSA9IGRl
bGV0ZTsKKworICBjb25zdCB1aW50MzJfdCBtYXhfaWRfOworICB1aW50MzJfdCBsYXN0X2lkXyA9
IDA7CisgIHN0ZDo6dmVjdG9yPGJvb2w+IGlkc187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IHVpbnQzMl90PgorY2xhc3MgSWRBbGxvY2F0b3IgOiBwdWJsaWMgSWRBbGxvY2F0b3JHZW5l
cmljIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IElkQWxsb2NhdG9yKFQgZW5kKSA6IElkQWxsb2Nh
dG9yR2VuZXJpYyhlbmQpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8VD46
OnZhbHVlICYmIHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAg
IlQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIik7CisgICAgc3RhdGljX2Fzc2VydChzaXpl
b2YoVCkgPD0gc2l6ZW9mKHVpbnQzMl90KSwgIlQgaXMgdG9vIGJpZyIpOworICB9CisKKyAgVCBB
bGxvY2F0ZSgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KEFsbG9jYXRlR2VuZXJpYygpKTsgfQor
ICB2b2lkIEZyZWUoVCBpZCkgeyBGcmVlR2VuZXJpYyhpZCk7IH0KK307CisKK30gIC8vIG5hbWVz
cGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIFNSQ19UUkFDSU5HX0NPUkVfSURfQUxMT0NBVE9S
X0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFBy
b2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24g
Mi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0
IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29w
eSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xp
Y2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUg
bGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5k
ZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJ
VEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVz
cyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3Vh
Z2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExp
Y2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAic3Jj
L3RyYWNpbmcvY29yZS9pZF9hbGxvY2F0b3IuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CisKK0lkQWxsb2NhdG9yR2VuZXJpYzo6SWRBbGxvY2F0b3JHZW5lcmljKHVpbnQzMl90
IG1heF9pZCkgOiBtYXhfaWRfKG1heF9pZCkgeworICBQRVJGRVRUT19EQ0hFQ0sobWF4X2lkID4g
MSk7Cit9CisKK0lkQWxsb2NhdG9yR2VuZXJpYzo6fklkQWxsb2NhdG9yR2VuZXJpYygpID0gZGVm
YXVsdDsKKwordWludDMyX3QgSWRBbGxvY2F0b3JHZW5lcmljOjpBbGxvY2F0ZUdlbmVyaWMoKSB7
CisgIGZvciAodWludDMyX3QgaWdub3JlZCA9IDE7IGlnbm9yZWQgPD0gbWF4X2lkXzsgaWdub3Jl
ZCsrKSB7CisgICAgbGFzdF9pZF8gPSBsYXN0X2lkXyA8IG1heF9pZF8gPyBsYXN0X2lkXyArIDEg
OiAxOworICAgIGNvbnN0IGF1dG8gaWQgPSBsYXN0X2lkXzsKKworICAgIC8vIDAgaXMgbmV2ZXIg
YSB2YWxpZCBJRC4gU28gaWYgd2UgYXJlIGxvb2tpbmcgZm9yIHxpZHwgPT0gTiBhbmQgdGhlcmUg
YXJlCisgICAgLy8gTiBvciBsZXNzIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IsIHRoZXkgbXVzdCBu
ZWNlc3NhcmlseSBiZSBhbGwgPCBOLgorICAgIC8vIGUuZy4gaWYgfGlkfCA9PSA0IGFuZCBzaXpl
KCkgPT0gNCwgdGhlIHZlY3RvciB3aWxsIGNvbnRhaW4gSURzIDAsMSwyLDMuCisgICAgaWYgKGlk
ID49IGlkc18uc2l6ZSgpKSB7CisgICAgICBpZHNfLnJlc2l6ZShpZCArIDEpOworICAgICAgaWRz
X1tpZF0gPSB0cnVlOworICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIGlmICghaWRzX1tp
ZF0pIHsKKyAgICAgIGlkc19baWRdID0gdHJ1ZTsKKyAgICAgIHJldHVybiBpZDsKKyAgICB9Cisg
IH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgSWRBbGxvY2F0b3JHZW5lcmljOjpGcmVlR2VuZXJp
Yyh1aW50MzJfdCBpZCkgeworICBpZiAoaWQgPT0gMCB8fCBpZCA+PSBpZHNfLnNpemUoKSB8fCAh
aWRzX1tpZF0pIHsKKyAgICBQRVJGRVRUT19ERkFUQUwoIkludmFsaWQgaWQuIik7CisgICAgcmV0
dXJuOworICB9CisgIGlkc19baWRdID0gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJm
ZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcvY29yZS9u
dWxsX3RyYWNlX3dyaXRlci5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogc3Jj
L3RyYWNpbmcvY29yZS9udWxsX3RyYWNlX3dyaXRlci5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vfd3JpdGVy
LmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0
L3RyYWNpbmcvY29yZS9iYXNpY190eXBlcy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRo
ZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUg
QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkg
bm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4K
KyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAg
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNz
IHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0
d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24g
YW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9G
IEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNl
IGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICog
bGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BF
UkZFVFRPX0VYVF9UUkFDSU5HX0NPUkVfQkFTSUNfVFlQRVNfSF8KKyNkZWZpbmUgSU5DTFVERV9Q
RVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX0JBU0lDX1RZUEVTX0hfCisKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisK
KyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMv
dHlwZXMuaD4KKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCit1c2lu
ZyB1aWRfdCA9IHVuc2lnbmVkIGludDsKKyNlbmRpZgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
CisvLyBVbmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdHJhY2luZyBzZXJ2aWNlLgordXNp
bmcgVHJhY2luZ1Nlc3Npb25JRCA9IHVpbnQ2NF90OworCisvLyBVbmlxdWUgd2l0aGluIHRoZSBz
Y29wZSBvZiB0aGUgdHJhY2luZyBzZXJ2aWNlLgordXNpbmcgUHJvZHVjZXJJRCA9IHVpbnQxNl90
OworCisvLyBVbmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdHJhY2luZyBzZXJ2aWNlLgor
dXNpbmcgRGF0YVNvdXJjZUluc3RhbmNlSUQgPSB1aW50NjRfdDsKKworLy8gVW5pcXVlIHdpdGhp
biB0aGUgc2NvcGUgb2YgYSBQcm9kdWNlci4KK3VzaW5nIFdyaXRlcklEID0gdWludDE2X3Q7CisK
Ky8vIFVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSB0cmFjaW5nIHNlcnZpY2UuCit1c2lu
ZyBGbHVzaFJlcXVlc3RJRCA9IHVpbnQ2NF90OworCisvLyBXZSBuZWVkIG9uZSBGRCBwZXIgcHJv
ZHVjZXIgYW5kIHdlIGFyZSBub3QgZ29pbmcgdG8gYmUgYWJsZSB0byBrZWVwID4gNjRrIEZEcwor
Ly8gb3BlbiBpbiB0aGUgc2VydmljZS4KK3N0YXRpYyBjb25zdGV4cHIgUHJvZHVjZXJJRCBrTWF4
UHJvZHVjZXJJRCA9IHN0YXRpY19jYXN0PFByb2R1Y2VySUQ+KC0xKTsKKworLy8gMTAyNCBXcml0
ZXJzIHBlciBwcm9kdWNlciBzZWVtcyBhIHJlc29uYWJsZSBib3VuZC4gVGhpcyByZWR1Y2VzIHRo
ZSBhYmlsaXR5CisvLyB0byBtZW1vcnktRG9TIHRoZSBzZXJ2aWNlIGJ5IGhhdmluZyB0byBrZWVw
IHRyYWNrIG9mIHRvbyBtYW55IHdyaXRlciBJRHMuCitzdGF0aWMgY29uc3RleHByIFdyaXRlcklE
IGtNYXhXcml0ZXJJRCA9IHN0YXRpY19jYXN0PFdyaXRlcklEPigoMSA8PCAxMCkgLSAxKTsKKwor
Ly8gVW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7UHJvZHVjZXJJRCwgV3JpdGVySUR9IHR1
cGxlLgordXNpbmcgQ2h1bmtJRCA9IHVpbnQzMl90Oworc3RhdGljIGNvbnN0ZXhwciBDaHVua0lE
IGtNYXhDaHVua0lEID0gc3RhdGljX2Nhc3Q8Q2h1bmtJRD4oLTEpOworCisvLyBVbmlxdWUgd2l0
aGluIHRoZSBzY29wZSBvZiB0aGUgdHJhY2luZyBzZXJ2aWNlLgordXNpbmcgQnVmZmVySUQgPSB1
aW50MTZfdDsKKworLy8gVGFyZ2V0IGJ1ZmZlciBJRCBmb3IgU2hhcmVkTWVtb3J5QXJiaXRlci4g
VmFsdWVzIHVwIHRvIG1heCB1aW50MTZfdCBhcmUKKy8vIGVxdWl2YWxlbnQgdG8gYSBib3VuZCBC
dWZmZXJJRC4gVmFsdWVzIGFib3ZlIG1heCB1aW50MTZfdCBhcmUgcmVzZXJ2YXRpb24gSURzCisv
LyBmb3IgdGhlIHRhcmdldCBidWZmZXIgb2YgYSBzdGFydHVwIHRyYWNlIHdyaXRlci4gUmVzZXJ2
YXRpb24gSURzIHdpbGwgYmUKKy8vIHRyYW5zbGF0ZWQgdG8gYWN0dWFsIEJ1ZmZlcklEcyBhZnRl
ciB0aGV5IGFyZSBib3VuZCBieQorLy8gU2hhcmVkTWVtb3J5QXJiaXRlcjo6QmluZFN0YXJ0dXBU
YXJnZXRCdWZmZXIoKS4KK3VzaW5nIE1heWJlVW5ib3VuZEJ1ZmZlcklEID0gdWludDMyX3Q7CisK
Ky8vIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggU2hhcmVkTWVtb3J5QUJJOjpQYWdlSGVhZGVyOjp0
YXJnZXRfYnVmZmVyLgorc3RhdGljIGNvbnN0ZXhwciBCdWZmZXJJRCBrTWF4VHJhY2VCdWZmZXJJ
RCA9IHN0YXRpY19jYXN0PEJ1ZmZlcklEPigtMSk7CisKKy8vIFVuaXF1ZSB3aXRoaW4gdGhlIHNj
b3BlIG9mIGEgdHJhY2luZyBzZXNzaW9uLgordXNpbmcgUGFja2V0U2VxdWVuY2VJRCA9IHVpbnQz
Ml90OworLy8gVXNlZCBmb3IgZXh0cmEgcGFja2V0cyBlbWl0dGVkIGJ5IHRoZSBzZXJ2aWNlLCBz
dWNoIGFzIHN0YXRpc3RpY3MuCitzdGF0aWMgY29uc3RleHByIFBhY2tldFNlcXVlbmNlSUQga1Nl
cnZpY2VQYWNrZXRTZXF1ZW5jZUlEID0gMTsKK3N0YXRpYyBjb25zdGV4cHIgUGFja2V0U2VxdWVu
Y2VJRCBrTWF4UGFja2V0U2VxdWVuY2VJRCA9CisgICAgc3RhdGljX2Nhc3Q8UGFja2V0U2VxdWVu
Y2VJRD4oLTEpOworCitjb25zdGV4cHIgdWlkX3Qga0ludmFsaWRVaWQgPSBzdGF0aWNfY2FzdDx1
aWRfdD4oLTEpOworCitjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1bHRGbHVzaFRpbWVvdXRNcyA9
IDUwMDA7CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVf
UEVSRkVUVE9fRVhUX1RSQUNJTkdfQ09SRV9CQVNJQ19UWVBFU19IXworLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5z
ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7
CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgg
dGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQK
KyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAor
ICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4g
d3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRp
c3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1Ig
Q09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNl
ZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNz
aW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5k
ZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX1RSQUNFX1dSSVRFUl9IXworI2Rl
ZmluZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0NPUkVfVFJBQ0VfV1JJVEVSX0hfCisK
KyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9iYXNpY190eXBlcy5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L21lc3NhZ2VfaGFuZGxlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by90cmFjaW5nL3RyYWNlX3dyaXRlcl9iYXNlLmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CisKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CitjbGFzcyBU
cmFjZVBhY2tldDsKK30gIC8vIG5hbWVzcGFjZSBwYnplcm8KK30gIC8vIG5hbWVzcGFjZSBwcm90
b3MKKworLy8gVGhpcyBpcyBhIHNpbmdsZS10aHJlYWQgd3JpdGUgaW50ZXJmYWNlIHRoYXQgYWxs
b3dzIHRvIHdyaXRlIHByb3RvYnVmcworLy8gZGlyZWN0bHkgaW50byB0aGUgdHJhY2luZyBzaGFy
ZWQgYnVmZmVyIHdpdGhvdXQgbWFraW5nIGFueSBjb3BpZXMuCisvLyBJdCB0YWtlcyBjYXJlIG9m
IGFjcXVpcmluZyBhbmQgcmVsZWFzaW5nIGNodW5rcyBmcm9tIHRoZQorLy8gU2hhcmVkTWVtb3J5
QXJiaXRlciBhbmQgc3BsaXR0aW5nIHByb3RvcyBvdmVyIGNodW5rcy4KKy8vIFRoZSBpZGVhIGlz
IHRoYXQgZWFjaCBkYXRhIHNvdXJjZSBjcmVhdGVzIG9uZSAob3IgbW9yZSkgVHJhY2VXcml0ZXIg
Zm9yIGVhY2gKKy8vIHRocmVhZCBpdCB3YW50cyB0byB3cml0ZSBmcm9tLiBFYWNoIFRyYWNlV3Jp
dGVyIHdpbGwgZ2V0IGl0cyBvd24gZGVkaWNhdGVkCisvLyBjaHVuayBhbmQgd2lsbCB3cml0ZSBp
bnRvIHRoZSBzaGFyZWQgYnVmZmVyIHdpdGhvdXQgYW55IGxvY2tpbmcgbW9zdCBvZiB0aGUKKy8v
IHRpbWUuIExvY2tpbmcgd2lsbCBoYXBwZW4gb25seSB3aGVuIGEgY2h1bmsgaXMgZXhoYXVzdGVk
IGFuZCBhIG5ldyBvbmUgaXMKKy8vIGFjcXVpcmVkIGZyb20gdGhlIGFyYml0ZXIuCisKKy8vIFRP
RE86IFRyYWNlV3JpdGVyIG5lZWRzIHRvIGtlZXAgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyIGFs
aXZlIChyZWZjb3VudD8pLgorLy8gT3RoZXJ3aXNlIGlmIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZl
ciBnb2VzIGF3YXkgKGUuZy4gdGhlIFNlcnZpY2UgY3Jhc2hlcykKKy8vIHRoZSBUcmFjZVdyaXRl
ciB3aWxsIGtlZXAgd3JpdGluZyBpbnRvIHVubWFwcGVkIG1lbW9yeS4KKworY2xhc3MgUEVSRkVU
VE9fRVhQT1JUIFRyYWNlV3JpdGVyIDogcHVibGljIFRyYWNlV3JpdGVyQmFzZSB7CisgcHVibGlj
OgorICB1c2luZyBUcmFjZVBhY2tldEhhbmRsZSA9CisgICAgICBwcm90b3plcm86Ok1lc3NhZ2VI
YW5kbGU8cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0PjsKKworICBUcmFjZVdyaXRlcigpOwor
ICB+VHJhY2VXcml0ZXIoKSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIGEgaGFuZGxlIHRvIHRo
ZSByb290IHByb3RvIG1lc3NhZ2UgZm9yIHRoZSB0cmFjZS4gVGhlIG1lc3NhZ2Ugd2lsbAorICAv
LyBiZSBmaW5hbGl6ZWQgZWl0aGVyIGJ5IGNhbGxpbmcgZGlyZWN0bHkgaGFuZGxlLkZpbmFsaXpl
KCkgb3IgYnkgbGV0dGluZyB0aGUKKyAgLy8gaGFuZGxlIGdvIG91dCBvZiBzY29wZS4gVGhlIHJl
dHVybmVkIGhhbmRsZSBjYW4gYmUgc3RkOjptb3ZlKCknZCBidXQgY2Fubm90CisgIC8vIGJlIHVz
ZWQgYWZ0ZXIgZWl0aGVyOiAoaSkgdGhlIFRyYWNlV3JpdGVyIGluc3RhbmNlIGlzIGRlc3Ryb3ll
ZCwgKGlpKSBhCisgIC8vIHN1YnNlcXVlbmNlIE5ld1RyYWNlUGFja2V0KCkgY2FsbCBpcyBtYWRl
IG9uIHRoZSBzYW1lIFRyYWNlV3JpdGVyIGluc3RhbmNlLgorICBUcmFjZVBhY2tldEhhbmRsZSBO
ZXdUcmFjZVBhY2tldCgpIG92ZXJyaWRlID0gMDsKKworICAvLyBDb21taXRzIHRoZSBkYXRhIHBl
bmRpbmcgZm9yIHRoZSBjdXJyZW50IGNodW5rIGludG8gdGhlIHNoYXJlZCBtZW1vcnkKKyAgLy8g
YnVmZmVyIGFuZCBzZW5kcyBhIENvbW1pdERhdGFSZXF1ZXN0KCkgdG8gdGhlIHNlcnZpY2UuIFRo
aXMgY2FuIGJlIGNhbGxlZAorICAvLyBvbmx5IGlmIHRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgTmV3
VHJhY2VQYWNrZXQoKSBoYXMgYmVlbiBkZXN0cm95ZWQgKGkuZS4gd2UKKyAgLy8gY2Fubm90IEZs
dXNoKCkgd2hpbGUgd3JpdGluZyBhIFRyYWNlUGFja2V0KS4KKyAgLy8gTm90ZTogRmx1c2goKSBh
bHNvIGhhcHBlbnMgaW1wbGljaXRseSB3aGVuIGRlc3Ryb3lpbmcgdGhlIFRyYWNlV3JpdGVyLgor
ICAvLyB8Y2FsbGJhY2t8IGlzIGFuIG9wdGlvbmFsIGNhbGxiYWNrLiBXaGVuIG5vbi1udWxsIGl0
IHdpbGwgcmVxdWVzdCB0aGUKKyAgLy8gc2VydmljZSB0byBBQ0sgdGhlIGZsdXNoIGFuZCB3aWxs
IGJlIGludm9rZWQgYWZ0ZXIgdGhlIHNlcnZpY2UgaGFzCisgIC8vIGFja25vd2xlZGdlZCBpdC4g
VGhlIGNhbGxiYWNrIG1pZ2h0IGJlIE5FVkVSIElOVk9LRUQgaWYgdGhlIHNlcnZpY2UgY3Jhc2hl
cworICAvLyBvciB0aGUgSVBDIGNvbm5lY3Rpb24gaXMgZHJvcHBlZC4gVGhlIGNhbGxiYWNrIHNo
b3VsZCBiZSB1c2VkIG9ubHkgYnkgdGVzdHMKKyAgLy8gYW5kIGJlc3QtZWZmb3J0IGZlYXR1cmVz
IChsb2dnaW5nKS4KKyAgLy8gVE9ETyhwcmltaWFubyk6IHJpZ2h0IG5vdyB0aGUgfGNhbGxiYWNr
fCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgSVBDIHRocmVhZC4KKyAgLy8gVGhpcyBpcyBmaW5lIGlu
IHRoZSBjdXJyZW50IHNpbmdsZS10aHJlYWQgc2NlbmFyaW8sIGJ1dCBsb25nLXRlcm0KKyAgLy8g
dHJhY2Vfd3JpdGVyX2ltcGwuY2Mgc2hvdWxkIGJlIHNtYXJ0ZXIgYW5kIHBvc3QgaXQgb24gdGhl
IHJpZ2h0IHRocmVhZC4KKyAgdm9pZCBGbHVzaChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY2FsbGJh
Y2sgPSB7fSkgb3ZlcnJpZGUgPSAwOworCisgIHZpcnR1YWwgV3JpdGVySUQgd3JpdGVyX2lkKCkg
Y29uc3QgPSAwOworCisgIC8vIEJ5dGVzIHdyaXR0ZW4gc2luY2UgY3JlYXRpb24uIElzIG5vdCBy
ZXNldCB3aGVuIG5ldyBjaHVua3MgYXJlIGFjcXVpcmVkLgorICB2aXJ0dWFsIHVpbnQ2NF90IHdy
aXR0ZW4oKSBjb25zdCBvdmVycmlkZSA9IDA7CisKKyBwcml2YXRlOgorICBUcmFjZVdyaXRlcihj
b25zdCBUcmFjZVdyaXRlciYpID0gZGVsZXRlOworICBUcmFjZVdyaXRlciYgb3BlcmF0b3I9KGNv
bnN0IFRyYWNlV3JpdGVyJikgPSBkZWxldGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0NPUkVfVFJBQ0Vf
V1JJVEVSX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291
cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZl
cnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUg
ZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWlu
IGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUu
b3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxp
Y2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0
ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywK
KyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIg
ZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMg
bGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIg
dGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTUkNfVFJBQ0lOR19DT1JFX05VTExfVFJBQ0Vf
V1JJVEVSX0hfCisjZGVmaW5lIFNSQ19UUkFDSU5HX0NPUkVfTlVMTF9UUkFDRV9XUklURVJfSF8K
KworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3Ry
YWNpbmcvY29yZS90cmFjZV93cml0ZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlX2hhbmRsZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJl
ZF9zdHJlYW1fbnVsbF9kZWxlZ2F0ZS5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCisvLyBB
IHNwZWNpYWxpemF0aW9uIG9mIFRyYWNlV3JpdGVyIHdoaWNoIG5vLW9wcyBhbGwgdGhlIHdyaXRl
cyByb3V0aW5nIHRoZW0KKy8vIGludG8gYSBmaXhlZCByZWdpb24gb2YgbWVtb3J5CisvLyBTZWUg
Ly9pbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvY29yZS90cmFjZV93cml0ZXIuaCBmb3IgZG9jcy4K
K2NsYXNzIE51bGxUcmFjZVdyaXRlciA6IHB1YmxpYyBUcmFjZVdyaXRlciB7CisgcHVibGljOgor
ICBOdWxsVHJhY2VXcml0ZXIoKTsKKyAgfk51bGxUcmFjZVdyaXRlcigpIG92ZXJyaWRlOworCisg
IC8vIFRyYWNlV3JpdGVyIGltcGxlbWVudGF0aW9uLiBTZWUgZG9jdW1lbnRhdGlvbiBpbiB0cmFj
ZV93cml0ZXIuaC4KKyAgLy8gVHJhY2VQYWNrZXRIYW5kbGUgaXMgZGVmaW5lZCBpbiB0cmFjZV93
cml0ZXIuaAorICBUcmFjZVBhY2tldEhhbmRsZSBOZXdUcmFjZVBhY2tldCgpIG92ZXJyaWRlOwor
ICB2b2lkIEZsdXNoKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjYWxsYmFjayA9IHt9KSBvdmVycmlk
ZTsKKyAgV3JpdGVySUQgd3JpdGVyX2lkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IHdy
aXR0ZW4oKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIE51bGxUcmFjZVdyaXRlcihj
b25zdCBOdWxsVHJhY2VXcml0ZXImKSA9IGRlbGV0ZTsKKyAgTnVsbFRyYWNlV3JpdGVyJiBvcGVy
YXRvcj0oY29uc3QgTnVsbFRyYWNlV3JpdGVyJikgPSBkZWxldGU7CisKKyAgcHJvdG96ZXJvOjpT
Y2F0dGVyZWRTdHJlYW1Xcml0ZXJOdWxsRGVsZWdhdGUgZGVsZWdhdGVfOworICBwcm90b3plcm86
OlNjYXR0ZXJlZFN0cmVhbVdyaXRlciBzdHJlYW1fOworCisgIC8vIFRoZSBwYWNrZXQgcmV0dXJu
ZWQgdmlhIE5ld1RyYWNlUGFja2V0KCkuIEl0cyBvd25lZCBieSB0aGlzIGNsYXNzLAorICAvLyBU
cmFjZVBhY2tldEhhbmRsZSBoYXMganVzdCBhIHBvaW50ZXIgdG8gaXQuCisgIHN0ZDo6dW5pcXVl
X3B0cjxwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXQ+IGN1cl9wYWNrZXRfOworfTsKKworfSAg
Ly8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gU1JDX1RSQUNJTkdfQ09SRV9OVUxM
X1RSQUNFX1dSSVRFUl9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3By
b3Rvcy9wZXJmZXR0by90cmFjZS90cmFjZV9wYWNrZXQucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0
ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZu
ZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0VfUEFDS0VUX1BS
T1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJB
Q0VfUEFDS0VUX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRp
bnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9f
ZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1l
c3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBBbmRyb2lkTG9nUGFj
a2V0OworY2xhc3MgQmF0dGVyeUNvdW50ZXJzOworY2xhc3MgQ2hyb21lQmVuY2htYXJrTWV0YWRh
dGE7CitjbGFzcyBDaHJvbWVFdmVudEJ1bmRsZTsKK2NsYXNzIENocm9tZU1ldGFkYXRhUGFja2V0
OworY2xhc3MgQ2xvY2tTbmFwc2hvdDsKK2NsYXNzIENwdUluZm87CitjbGFzcyBEZW9iZnVzY2F0
aW9uTWFwcGluZzsKK2NsYXNzIEZ0cmFjZUV2ZW50QnVuZGxlOworY2xhc3MgRnRyYWNlU3RhdHM7
CitjbGFzcyBHcHVDb3VudGVyRXZlbnQ7CitjbGFzcyBHcHVMb2c7CitjbGFzcyBHcHVNZW1Ub3Rh
bEV2ZW50OworY2xhc3MgR3B1UmVuZGVyU3RhZ2VFdmVudDsKK2NsYXNzIEdyYXBoaWNzRnJhbWVF
dmVudDsKK2NsYXNzIEhlYXBHcmFwaDsKK2NsYXNzIEluaXRpYWxEaXNwbGF5U3RhdGU7CitjbGFz
cyBJbm9kZUZpbGVNYXA7CitjbGFzcyBJbnRlcm5lZERhdGE7CitjbGFzcyBNb2R1bGVTeW1ib2xz
OworY2xhc3MgUGFja2FnZXNMaXN0OworY2xhc3MgUGVyZlNhbXBsZTsKK2NsYXNzIFBlcmZldHRv
TWV0YXRyYWNlOworY2xhc3MgUG93ZXJSYWlsczsKK2NsYXNzIFByb2Nlc3NEZXNjcmlwdG9yOwor
Y2xhc3MgUHJvY2Vzc1N0YXRzOworY2xhc3MgUHJvY2Vzc1RyZWU7CitjbGFzcyBQcm9maWxlUGFj
a2V0OworY2xhc3MgUHJvZmlsZWRGcmFtZVN5bWJvbHM7CitjbGFzcyBTbWFwc1BhY2tldDsKK2Ns
YXNzIFN0cmVhbWluZ1Byb2ZpbGVQYWNrZXQ7CitjbGFzcyBTeXNTdGF0czsKK2NsYXNzIFN5c3Rl
bUluZm87CitjbGFzcyBUZXN0RXZlbnQ7CitjbGFzcyBUaHJlYWREZXNjcmlwdG9yOworY2xhc3Mg
VHJhY2VDb25maWc7CitjbGFzcyBUcmFjZVBhY2tldERlZmF1bHRzOworY2xhc3MgVHJhY2VTdGF0
czsKK2NsYXNzIFRyYWNpbmdTZXJ2aWNlRXZlbnQ7CitjbGFzcyBUcmFja0Rlc2NyaXB0b3I7Citj
bGFzcyBUcmFja0V2ZW50OworY2xhc3MgVHJpZ2dlcjsKK2NsYXNzIFZ1bGthbkFwaUV2ZW50Owor
Y2xhc3MgVnVsa2FuTWVtb3J5RXZlbnQ7CisKK2VudW0gVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFn
cyA6IGludDMyX3QgeworICBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdzX1NFUV9VTlNQRUNJRklF
RCA9IDAsCisgIFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3NfU0VRX0lOQ1JFTUVOVEFMX1NUQVRF
X0NMRUFSRUQgPSAxLAorICBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdzX1NFUV9ORUVEU19JTkNS
RU1FTlRBTF9TVEFURSA9IDIsCit9OworCitjb25zdCBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdz
IFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3NfTUlOID0gVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFn
c19TRVFfVU5TUEVDSUZJRUQ7Citjb25zdCBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdzIFRyYWNl
UGFja2V0X1NlcXVlbmNlRmxhZ3NfTUFYID0gVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19TRVFf
TkVFRFNfSU5DUkVNRU5UQUxfU1RBVEU7CisKK2NsYXNzIFRyYWNlUGFja2V0X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOTAw
LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6Cisg
IFRyYWNlUGFja2V0X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNlUGFja2V0X0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgVHJhY2VQYWNrZXRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IHRpbWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfdGltZXN0YW1wX2Nsb2NrX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8NTg+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCB0aW1lc3RhbXBfY2xvY2tfaWQoKSBjb25zdCB7IHJldHVy
biBhdDw1OD4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19wcm9jZXNzX3RyZWUoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
cHJvY2Vzc190cmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19ieXRlcygpOyB9CisgIGJv
b2wgaGFzX3Byb2Nlc3Nfc3RhdHMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcHJvY2Vzc19zdGF0cygpIGNvbnN0IHsgcmV0dXJu
IGF0PDk+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19pbm9kZV9maWxlX21hcCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBp
bm9kZV9maWxlX21hcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19jaHJvbWVfZXZlbnRzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9tZV9ldmVudHMoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2xvY2tfc25hcHNob3QoKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
Y2xvY2tfc25hcHNob3QoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2J5dGVzKCk7IH0KKyAg
Ym9vbCBoYXNfc3lzX3N0YXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHN5c19zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+
KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190cmFja19ldmVudCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDExPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdHJhY2tfZXZl
bnQoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Ry
YWNlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDMzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MzM+KCku
YXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19mdHJhY2Vfc3RhdHMoKSBjb25zdCB7IHJldHVybiBh
dDwzND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGZ0cmFjZV9zdGF0
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfdHJh
Y2Vfc3RhdHMoKSBjb25zdCB7IHJldHVybiBhdDwzNT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzIHRyYWNlX3N0YXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8MzU+KCkuYXNf
Ynl0ZXMoKTsgfQorICBib29sIGhhc19wcm9maWxlX3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcHJvZmlsZV9wYWNr
ZXQoKSBjb25zdCB7IHJldHVybiBhdDwzNz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Jh
dHRlcnkoKSBjb25zdCB7IHJldHVybiBhdDwzOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzIGJhdHRlcnkoKSBjb25zdCB7IHJldHVybiBhdDwzOD4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX3Bvd2VyX3JhaWxzKCkgY29uc3QgeyByZXR1cm4gYXQ8NDA+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwb3dlcl9yYWlscygpIGNvbnN0IHsg
cmV0dXJuIGF0PDQwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYW5kcm9pZF9sb2coKSBj
b25zdCB7IHJldHVybiBhdDwzOT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIGFuZHJvaWRfbG9nKCkgY29uc3QgeyByZXR1cm4gYXQ8Mzk+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19zeXN0ZW1faW5mbygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ1PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc3lzdGVtX2luZm8oKSBjb25zdCB7IHJldHVy
biBhdDw0NT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3RyaWdnZXIoKSBjb25zdCB7IHJl
dHVybiBhdDw0Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRyaWdn
ZXIoKSBjb25zdCB7IHJldHVybiBhdDw0Nj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Bh
Y2thZ2VzX2xpc3QoKSBjb25zdCB7IHJldHVybiBhdDw0Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIHBhY2thZ2VzX2xpc3QoKSBjb25zdCB7IHJldHVybiBhdDw0Nz4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9iZW5jaG1hcmtfbWV0YWRhdGEoKSBj
b25zdCB7IHJldHVybiBhdDw0OD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIGNocm9tZV9iZW5jaG1hcmtfbWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBhdDw0OD4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3BlcmZldHRvX21ldGF0cmFjZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcGVyZmV0
dG9fbWV0YXRyYWNlKCkgY29uc3QgeyByZXR1cm4gYXQ8NDk+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19jaHJvbWVfbWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBhdDw1MT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9tZV9tZXRhZGF0YSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDUxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZ3B1X2NvdW50ZXJfZXZl
bnQoKSBjb25zdCB7IHJldHVybiBhdDw1Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIGdwdV9jb3VudGVyX2V2ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8NTI+KCkuYXNf
Ynl0ZXMoKTsgfQorICBib29sIGhhc19ncHVfcmVuZGVyX3N0YWdlX2V2ZW50KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NTM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBncHVf
cmVuZGVyX3N0YWdlX2V2ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8NTM+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19zdHJlYW1pbmdfcHJvZmlsZV9wYWNrZXQoKSBjb25zdCB7IHJldHVybiBh
dDw1ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHN0cmVhbWluZ19w
cm9maWxlX3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU0PigpLmFzX2J5dGVzKCk7IH0KKyAg
Ym9vbCBoYXNfaGVhcF9ncmFwaCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU2PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaGVhcF9ncmFwaCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDU2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZ3JhcGhpY3NfZnJhbWVfZXZlbnQoKSBj
b25zdCB7IHJldHVybiBhdDw1Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIGdyYXBoaWNzX2ZyYW1lX2V2ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8NTc+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc192dWxrYW5fbWVtb3J5X2V2ZW50KCkgY29uc3QgeyByZXR1cm4g
YXQ8NjI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB2dWxrYW5fbWVt
b3J5X2V2ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8NjI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19ncHVfbG9nKCkgY29uc3QgeyByZXR1cm4gYXQ8NjM+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBncHVfbG9nKCkgY29uc3QgeyByZXR1cm4gYXQ8NjM+KCkuYXNf
Ynl0ZXMoKTsgfQorICBib29sIGhhc192dWxrYW5fYXBpX2V2ZW50KCkgY29uc3QgeyByZXR1cm4g
YXQ8NjU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB2dWxrYW5fYXBp
X2V2ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8NjU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19wZXJmX3NhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY2PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgcGVyZl9zYW1wbGUoKSBjb25zdCB7IHJldHVybiBhdDw2Nj4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2NwdV9pbmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8
Njc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBjcHVfaW5mbygpIGNv
bnN0IHsgcmV0dXJuIGF0PDY3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc21hcHNfcGFj
a2V0KCkgY29uc3QgeyByZXR1cm4gYXQ8Njg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBzbWFwc19wYWNrZXQoKSBjb25zdCB7IHJldHVybiBhdDw2OD4oKS5hc19ieXRl
cygpOyB9CisgIGJvb2wgaGFzX3NlcnZpY2VfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw2OT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHNlcnZpY2VfZXZlbnQoKSBj
b25zdCB7IHJldHVybiBhdDw2OT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2luaXRpYWxf
ZGlzcGxheV9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDcwPigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgaW5pdGlhbF9kaXNwbGF5X3N0YXRlKCkgY29uc3QgeyByZXR1
cm4gYXQ8NzA+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19ncHVfbWVtX3RvdGFsX2V2ZW50
KCkgY29uc3QgeyByZXR1cm4gYXQ8NzE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBncHVfbWVtX3RvdGFsX2V2ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8NzE+KCkuYXNf
Ynl0ZXMoKTsgfQorICBib29sIGhhc19wcm9maWxlZF9mcmFtZV9zeW1ib2xzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NTU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwcm9m
aWxlZF9mcmFtZV9zeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gYXQ8NTU+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19tb2R1bGVfc3ltYm9scygpIGNvbnN0IHsgcmV0dXJuIGF0PDYxPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbW9kdWxlX3N5bWJvbHMoKSBjb25z
dCB7IHJldHVybiBhdDw2MT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Rlb2JmdXNjYXRp
b25fbWFwcGluZygpIGNvbnN0IHsgcmV0dXJuIGF0PDY0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgZGVvYmZ1c2NhdGlvbl9tYXBwaW5nKCkgY29uc3QgeyByZXR1cm4g
YXQ8NjQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190cmFja19kZXNjcmlwdG9yKCkgY29u
c3QgeyByZXR1cm4gYXQ8NjA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyB0cmFja19kZXNjcmlwdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8NjA+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19wcm9jZXNzX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBhdDw0Mz4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHByb2Nlc3NfZGVzY3JpcHRv
cigpIGNvbnN0IHsgcmV0dXJuIGF0PDQzPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfdGhy
ZWFkX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBhdDw0ND4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRocmVhZF9kZXNjcmlwdG9yKCkgY29uc3QgeyByZXR1cm4g
YXQ8NDQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19mdHJhY2VfZXZlbnRzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGZ0
cmFjZV9ldmVudHMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfc3luY2hyb25pemF0aW9uX21hcmtlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM2PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc3luY2hyb25pemF0aW9uX21hcmtl
cigpIGNvbnN0IHsgcmV0dXJuIGF0PDM2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY29t
cHJlc3NlZF9wYWNrZXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8NTA+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBjb21wcmVzc2VkX3BhY2tldHMoKSBjb25zdCB7IHJldHVy
biBhdDw1MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Zvcl90ZXN0aW5nKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OTAwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
Zm9yX3Rlc3RpbmcoKSBjb25zdCB7IHJldHVybiBhdDw5MDA+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc190cnVzdGVkX3VpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQor
ICBpbnQzMl90IHRydXN0ZWRfdWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigp
OyB9CisgIGJvb2wgaGFzX3RydXN0ZWRfcGFja2V0X3NlcXVlbmNlX2lkKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB0cnVzdGVkX3BhY2tldF9zZXF1ZW5j
ZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X2ludGVybmVkX2RhdGEoKSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGludGVybmVkX2RhdGEoKSBjb25zdCB7IHJldHVybiBhdDwx
Mj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3NlcXVlbmNlX2ZsYWdzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzZXF1ZW5jZV9mbGFncygpIGNv
bnN0IHsgcmV0dXJuIGF0PDEzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2luY3JlbWVu
dGFsX3N0YXRlX2NsZWFyZWQoKSBjb25zdCB7IHJldHVybiBhdDw0MT4oKS52YWxpZCgpOyB9Cisg
IGJvb2wgaW5jcmVtZW50YWxfc3RhdGVfY2xlYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQxPigp
LmFzX2Jvb2woKTsgfQorICBib29sIGhhc190cmFjZV9wYWNrZXRfZGVmYXVsdHMoKSBjb25zdCB7
IHJldHVybiBhdDw1OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRy
YWNlX3BhY2tldF9kZWZhdWx0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDU5PigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfcHJldmlvdXNfcGFja2V0X2Ryb3BwZWQoKSBjb25zdCB7IHJldHVybiBh
dDw0Mj4oKS52YWxpZCgpOyB9CisgIGJvb2wgcHJldmlvdXNfcGFja2V0X2Ryb3BwZWQoKSBjb25z
dCB7IHJldHVybiBhdDw0Mj4oKS5hc19ib29sKCk7IH0KK307CisKK2NsYXNzIFRyYWNlUGFja2V0
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBUcmFjZVBhY2tldF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RpbWVz
dGFtcEZpZWxkTnVtYmVyID0gOCwKKyAgICBrVGltZXN0YW1wQ2xvY2tJZEZpZWxkTnVtYmVyID0g
NTgsCisgICAga1Byb2Nlc3NUcmVlRmllbGROdW1iZXIgPSAyLAorICAgIGtQcm9jZXNzU3RhdHNG
aWVsZE51bWJlciA9IDksCisgICAga0lub2RlRmlsZU1hcEZpZWxkTnVtYmVyID0gNCwKKyAgICBr
Q2hyb21lRXZlbnRzRmllbGROdW1iZXIgPSA1LAorICAgIGtDbG9ja1NuYXBzaG90RmllbGROdW1i
ZXIgPSA2LAorICAgIGtTeXNTdGF0c0ZpZWxkTnVtYmVyID0gNywKKyAgICBrVHJhY2tFdmVudEZp
ZWxkTnVtYmVyID0gMTEsCisgICAga1RyYWNlQ29uZmlnRmllbGROdW1iZXIgPSAzMywKKyAgICBr
RnRyYWNlU3RhdHNGaWVsZE51bWJlciA9IDM0LAorICAgIGtUcmFjZVN0YXRzRmllbGROdW1iZXIg
PSAzNSwKKyAgICBrUHJvZmlsZVBhY2tldEZpZWxkTnVtYmVyID0gMzcsCisgICAga0JhdHRlcnlG
aWVsZE51bWJlciA9IDM4LAorICAgIGtQb3dlclJhaWxzRmllbGROdW1iZXIgPSA0MCwKKyAgICBr
QW5kcm9pZExvZ0ZpZWxkTnVtYmVyID0gMzksCisgICAga1N5c3RlbUluZm9GaWVsZE51bWJlciA9
IDQ1LAorICAgIGtUcmlnZ2VyRmllbGROdW1iZXIgPSA0NiwKKyAgICBrUGFja2FnZXNMaXN0Rmll
bGROdW1iZXIgPSA0NywKKyAgICBrQ2hyb21lQmVuY2htYXJrTWV0YWRhdGFGaWVsZE51bWJlciA9
IDQ4LAorICAgIGtQZXJmZXR0b01ldGF0cmFjZUZpZWxkTnVtYmVyID0gNDksCisgICAga0Nocm9t
ZU1ldGFkYXRhRmllbGROdW1iZXIgPSA1MSwKKyAgICBrR3B1Q291bnRlckV2ZW50RmllbGROdW1i
ZXIgPSA1MiwKKyAgICBrR3B1UmVuZGVyU3RhZ2VFdmVudEZpZWxkTnVtYmVyID0gNTMsCisgICAg
a1N0cmVhbWluZ1Byb2ZpbGVQYWNrZXRGaWVsZE51bWJlciA9IDU0LAorICAgIGtIZWFwR3JhcGhG
aWVsZE51bWJlciA9IDU2LAorICAgIGtHcmFwaGljc0ZyYW1lRXZlbnRGaWVsZE51bWJlciA9IDU3
LAorICAgIGtWdWxrYW5NZW1vcnlFdmVudEZpZWxkTnVtYmVyID0gNjIsCisgICAga0dwdUxvZ0Zp
ZWxkTnVtYmVyID0gNjMsCisgICAga1Z1bGthbkFwaUV2ZW50RmllbGROdW1iZXIgPSA2NSwKKyAg
ICBrUGVyZlNhbXBsZUZpZWxkTnVtYmVyID0gNjYsCisgICAga0NwdUluZm9GaWVsZE51bWJlciA9
IDY3LAorICAgIGtTbWFwc1BhY2tldEZpZWxkTnVtYmVyID0gNjgsCisgICAga1NlcnZpY2VFdmVu
dEZpZWxkTnVtYmVyID0gNjksCisgICAga0luaXRpYWxEaXNwbGF5U3RhdGVGaWVsZE51bWJlciA9
IDcwLAorICAgIGtHcHVNZW1Ub3RhbEV2ZW50RmllbGROdW1iZXIgPSA3MSwKKyAgICBrUHJvZmls
ZWRGcmFtZVN5bWJvbHNGaWVsZE51bWJlciA9IDU1LAorICAgIGtNb2R1bGVTeW1ib2xzRmllbGRO
dW1iZXIgPSA2MSwKKyAgICBrRGVvYmZ1c2NhdGlvbk1hcHBpbmdGaWVsZE51bWJlciA9IDY0LAor
ICAgIGtUcmFja0Rlc2NyaXB0b3JGaWVsZE51bWJlciA9IDYwLAorICAgIGtQcm9jZXNzRGVzY3Jp
cHRvckZpZWxkTnVtYmVyID0gNDMsCisgICAga1RocmVhZERlc2NyaXB0b3JGaWVsZE51bWJlciA9
IDQ0LAorICAgIGtGdHJhY2VFdmVudHNGaWVsZE51bWJlciA9IDEsCisgICAga1N5bmNocm9uaXph
dGlvbk1hcmtlckZpZWxkTnVtYmVyID0gMzYsCisgICAga0NvbXByZXNzZWRQYWNrZXRzRmllbGRO
dW1iZXIgPSA1MCwKKyAgICBrRm9yVGVzdGluZ0ZpZWxkTnVtYmVyID0gOTAwLAorICAgIGtUcnVz
dGVkVWlkRmllbGROdW1iZXIgPSAzLAorICAgIGtUcnVzdGVkUGFja2V0U2VxdWVuY2VJZEZpZWxk
TnVtYmVyID0gMTAsCisgICAga0ludGVybmVkRGF0YUZpZWxkTnVtYmVyID0gMTIsCisgICAga1Nl
cXVlbmNlRmxhZ3NGaWVsZE51bWJlciA9IDEzLAorICAgIGtJbmNyZW1lbnRhbFN0YXRlQ2xlYXJl
ZEZpZWxkTnVtYmVyID0gNDEsCisgICAga1RyYWNlUGFja2V0RGVmYXVsdHNGaWVsZE51bWJlciA9
IDU5LAorICAgIGtQcmV2aW91c1BhY2tldERyb3BwZWRGaWVsZE51bWJlciA9IDQyLAorICB9Owor
ICB1c2luZyBTZXF1ZW5jZUZsYWdzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNl
UGFja2V0X1NlcXVlbmNlRmxhZ3M7CisgIHN0YXRpYyBjb25zdCBTZXF1ZW5jZUZsYWdzIFNFUV9V
TlNQRUNJRklFRCA9IFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3NfU0VRX1VOU1BFQ0lGSUVEOwor
ICBzdGF0aWMgY29uc3QgU2VxdWVuY2VGbGFncyBTRVFfSU5DUkVNRU5UQUxfU1RBVEVfQ0xFQVJF
RCA9IFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3NfU0VRX0lOQ1JFTUVOVEFMX1NUQVRFX0NMRUFS
RUQ7CisgIHN0YXRpYyBjb25zdCBTZXF1ZW5jZUZsYWdzIFNFUV9ORUVEU19JTkNSRU1FTlRBTF9T
VEFURSA9IFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3NfU0VRX05FRURTX0lOQ1JFTUVOVEFMX1NU
QVRFOworICB2b2lkIHNldF90aW1lc3RhbXAodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RpbWVzdGFtcF9jbG9ja19pZCh1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1OCwgdmFsdWUpOworICB9CisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gUHJvY2Vzc1RyZWU+IFQqIHNldF9wcm9jZXNzX3RyZWUoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gUHJvY2Vzc1N0YXRzPiBUKiBzZXRfcHJvY2Vzc19zdGF0cygpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBJbm9kZUZpbGVNYXA+IFQqIHNldF9pbm9kZV9maWxlX21hcCgpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBDaHJvbWVFdmVudEJ1bmRsZT4gVCogc2V0X2Nocm9tZV9ldmVudHMoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gQ2xvY2tTbmFwc2hvdD4gVCogc2V0X2Nsb2NrX3NuYXBzaG90KCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IFN5c1N0YXRzPiBUKiBzZXRfc3lzX3N0YXRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oNyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNrRXZl
bnQ+IFQqIHNldF90cmFja19ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDExKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2VDb25maWc+IFQq
IHNldF90cmFjZV9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigz
Myk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEZ0cmFjZVN0YXRzPiBUKiBzZXRf
ZnRyYWNlX3N0YXRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzQpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjZVN0YXRzPiBUKiBzZXRfdHJhY2Vf
c3RhdHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzNSk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFByb2ZpbGVQYWNrZXQ+IFQqIHNldF9wcm9maWxlX3Bh
Y2tldCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDM3KTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmF0dGVyeUNvdW50ZXJzPiBUKiBzZXRfYmF0dGVyeSgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDM4KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gUG93ZXJSYWlscz4gVCogc2V0X3Bvd2VyX3JhaWxzKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNDApOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBBbmRyb2lkTG9nUGFja2V0PiBUKiBzZXRfYW5kcm9pZF9sb2coKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzOSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IFN5c3RlbUluZm8+IFQqIHNldF9zeXN0ZW1faW5mbygpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gVHJpZ2dlcj4gVCogc2V0X3RyaWdnZXIoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVz
c2FnZTxUPig0Nik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFBhY2thZ2VzTGlz
dD4gVCogc2V0X3BhY2thZ2VzX2xpc3QoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPig0Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUJlbmNobWFy
a01ldGFkYXRhPiBUKiBzZXRfY2hyb21lX2JlbmNobWFya19tZXRhZGF0YSgpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gUGVyZmV0dG9NZXRhdHJhY2U+IFQqIHNldF9wZXJmZXR0b19tZXRhdHJhY2UoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0OSk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IENocm9tZU1ldGFkYXRhUGFja2V0PiBUKiBzZXRfY2hyb21lX21ldGFkYXRh
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNTEpOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQgPSBHcHVDb3VudGVyRXZlbnQ+IFQqIHNldF9ncHVfY291bnRlcl9l
dmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDUyKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3B1UmVuZGVyU3RhZ2VFdmVudD4gVCogc2V0X2dwdV9y
ZW5kZXJfc3RhZ2VfZXZlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1
Myk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFN0cmVhbWluZ1Byb2ZpbGVQYWNr
ZXQ+IFQqIHNldF9zdHJlYW1pbmdfcHJvZmlsZV9wYWNrZXQoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPig1NCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEhl
YXBHcmFwaD4gVCogc2V0X2hlYXBfZ3JhcGgoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVz
c2FnZTxUPig1Nik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEdyYXBoaWNzRnJh
bWVFdmVudD4gVCogc2V0X2dyYXBoaWNzX2ZyYW1lX2V2ZW50KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oNTcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBW
dWxrYW5NZW1vcnlFdmVudD4gVCogc2V0X3Z1bGthbl9tZW1vcnlfZXZlbnQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2Mik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IEdwdUxvZz4gVCogc2V0X2dwdV9sb2coKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPig2Myk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFZ1bGthbkFw
aUV2ZW50PiBUKiBzZXRfdnVsa2FuX2FwaV9ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDY1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUGVyZlNh
bXBsZT4gVCogc2V0X3BlcmZfc2FtcGxlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oNjYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDcHVJbmZvPiBUKiBz
ZXRfY3B1X2luZm8oKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2Nyk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFNtYXBzUGFja2V0PiBUKiBzZXRfc21hcHNf
cGFja2V0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjgpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjaW5nU2VydmljZUV2ZW50PiBUKiBzZXRfc2Vy
dmljZV9ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDY5KTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW5pdGlhbERpc3BsYXlTdGF0ZT4gVCogc2V0
X2luaXRpYWxfZGlzcGxheV9zdGF0ZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDcwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3B1TWVtVG90YWxFdmVu
dD4gVCogc2V0X2dwdV9tZW1fdG90YWxfZXZlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPig3MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFByb2ZpbGVk
RnJhbWVTeW1ib2xzPiBUKiBzZXRfcHJvZmlsZWRfZnJhbWVfc3ltYm9scygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDU1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gTW9kdWxlU3ltYm9scz4gVCogc2V0X21vZHVsZV9zeW1ib2xzKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBEZW9iZnVzY2F0aW9uTWFwcGluZz4gVCogc2V0X2Rlb2JmdXNjYXRpb25fbWFwcGluZygp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDY0KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gVHJhY2tEZXNjcmlwdG9yPiBUKiBzZXRfdHJhY2tfZGVzY3JpcHRv
cigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDYwKTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gUHJvY2Vzc0Rlc2NyaXB0b3I+IFQqIHNldF9wcm9jZXNzX2Rl
c2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0Myk7CisgIH0K
KworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRocmVhZERlc2NyaXB0b3I+IFQqIHNldF90aHJl
YWRfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ0KTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRnRyYWNlRXZlbnRCdW5kbGU+IFQqIHNl
dF9mdHJhY2VfZXZlbnRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMSk7
CisgIH0KKworICB2b2lkIHNldF9zeW5jaHJvbml6YXRpb25fbWFya2VyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDM2LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNp
emUoKSk7CisgIH0KKyAgdm9pZCBzZXRfc3luY2hyb25pemF0aW9uX21hcmtlcihjb25zdCB1aW50
OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDM2LCBkYXRhLCBzaXpl
KTsKKyAgfQorICB2b2lkIHNldF9jb21wcmVzc2VkX3BhY2tldHMoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNTAsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgfQorICB2b2lkIHNldF9jb21wcmVzc2VkX3BhY2tldHMoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg1MCwgZGF0YSwgc2l6ZSk7CisgIH0K
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUZXN0RXZlbnQ+IFQqIHNldF9mb3JfdGVzdGluZygp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDkwMCk7CisgIH0KKworICB2b2lk
IHNldF90cnVzdGVkX3VpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF90cnVzdGVkX3BhY2tldF9zZXF1ZW5jZV9pZCh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMCwgdmFsdWUpOworICB9CisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gSW50ZXJuZWREYXRhPiBUKiBzZXRfaW50ZXJuZWRfZGF0YSgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEyKTsKKyAgfQorCisgIHZvaWQgc2V0X3Nl
cXVlbmNlX2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEzLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXJlZChib29sIHZhbHVl
KSB7CisgICAgQXBwZW5kVGlueVZhckludCg0MSwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gVHJhY2VQYWNrZXREZWZhdWx0cz4gVCogc2V0X3RyYWNlX3BhY2tldF9kZWZh
dWx0cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDU5KTsKKyAgfQorCisg
IHZvaWQgc2V0X3ByZXZpb3VzX3BhY2tldF9kcm9wcGVkKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBl
bmRUaW55VmFySW50KDQyLCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4K
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVj
dAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAg
KHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4g
Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9m
IHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5z
ZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg
b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0
aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9V
VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y
IGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBn
b3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z
ZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJh
Y2luZy9jb3JlL251bGxfdHJhY2Vfd3JpdGVyLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdXRpbHMuaCIKKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21l
c3NhZ2UuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9z
L3BlcmZldHRvL3RyYWNlL3RyYWNlX3BhY2tldC5wYnplcm8uaCIKKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKKworTnVsbFRyYWNlV3JpdGVyOjpOdWxsVHJhY2VXcml0ZXIoKQorICAgIDogZGVsZWdh
dGVfKGJhc2U6OmtQYWdlU2l6ZSksIHN0cmVhbV8oJmRlbGVnYXRlXykgeworICBjdXJfcGFja2V0
Xy5yZXNldChuZXcgcHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0KCkpOworICBjdXJfcGFja2V0
Xy0+RmluYWxpemUoKTsgIC8vIFRvIGF2b2lkIHRoZSBEQ0hFQ0sgaW4gTmV3VHJhY2VQYWNrZXQo
KS4KK30KKworTnVsbFRyYWNlV3JpdGVyOjp+TnVsbFRyYWNlV3JpdGVyKCkge30KKwordm9pZCBO
dWxsVHJhY2VXcml0ZXI6OkZsdXNoKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjYWxsYmFjaykgewor
ICAvLyBGbHVzaCgpIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBhIFRyYWNlUGFj
a2V0LgorICBQRVJGRVRUT19DSEVDSyhjdXJfcGFja2V0Xy0+aXNfZmluYWxpemVkKCkpOworCisg
IGlmIChjYWxsYmFjaykKKyAgICBjYWxsYmFjaygpOworfQorCitOdWxsVHJhY2VXcml0ZXI6OlRy
YWNlUGFja2V0SGFuZGxlIE51bGxUcmFjZVdyaXRlcjo6TmV3VHJhY2VQYWNrZXQoKSB7CisgIC8v
IElmIHdlIGhpdCB0aGlzLCB0aGUgY2FsbGVyIGlzIGNhbGxpbmcgTmV3VHJhY2VQYWNrZXQoKSB3
aXRob3V0IGhhdmluZworICAvLyBmaW5hbGl6ZWQgdGhlIHByZXZpb3VzIHBhY2tldC4KKyAgUEVS
RkVUVE9fRENIRUNLKGN1cl9wYWNrZXRfLT5pc19maW5hbGl6ZWQoKSk7CisgIGN1cl9wYWNrZXRf
LT5SZXNldCgmc3RyZWFtXyk7CisgIHJldHVybiBUcmFjZVdyaXRlcjo6VHJhY2VQYWNrZXRIYW5k
bGUoY3VyX3BhY2tldF8uZ2V0KCkpOworfQorCitXcml0ZXJJRCBOdWxsVHJhY2VXcml0ZXI6Ondy
aXRlcl9pZCgpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQ2NF90IE51bGxUcmFjZVdy
aXRlcjo6d3JpdHRlbigpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcv
Y29yZS9zaGFyZWRfbWVtb3J5X2FiaS5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRl
cjogaW5jbHVkZS9wZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnlfYWJpLmgK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVj
dAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAg
KHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4g
Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9m
IHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5z
ZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg
b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0
aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9V
VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y
IGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBn
b3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z
ZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdfQ09SRV9TSEFS
RURfTUVNT1JZX0FCSV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0NP
UkVfU0hBUkVEX01FTU9SWV9BQklfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUg
PHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1
ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+Cisj
aW5jbHVkZSA8dXRpbGl0eT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKKworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGJpbmFyeSBpbnRlcmZhY2Ug
b2YgdGhlIG1lbW9yeSBidWZmZXJzIHNoYXJlZCBiZXR3ZWVuCisvLyBQcm9kdWNlciBhbmQgU2Vy
dmljZS4gVGhpcyBpcyBhIGxvbmctdGVybSBzdGFibGUgQUJJIGFuZCBoYXMgdG8gYmUgYmFja3dh
cmRzCisvLyBjb21wYXRpYmxlIHRvIGRlYWwgd2l0aCBtaXNtYXRjaGluZyBQcm9kdWNlciBhbmQg
U2VydmljZSB2ZXJzaW9ucy4KKy8vCisvLyBPdmVydmlldworLy8gLS0tLS0tLS0KKy8vIFNNQiA6
PSAiU2hhcmVkIE1lbW9yeSBCdWZmZXIiLgorLy8gSW4gdGhlIG1vc3QgdHlwaWNhbCBjYXNlIG9m
IGEgbXVsdGktcHJvY2VzcyBhcmNoaXRlY3R1cmUgKGkuZS4gUHJvZHVjZXIgYW5kCisvLyBTZXJ2
aWNlIGFyZSBob3N0ZWQgYnkgZGlmZmVyZW50IHByb2Nlc3NlcyksIGEgUHJvZHVjZXIgbWVhbnMg
YWxtb3N0IGFsd2F5cworLy8gYSAiY2xpZW50IHByb2Nlc3MgcHJvZHVjaW5nIGRhdGEiIChhbG1v
c3Q6IGluIHNvbWUgY2FzZXMgYSBwcm9jZXNzIG1pZ2h0IGhvc3QKKy8vID4gMSBQcm9kdWNlciwg
aWYgaXQgbGlua3MgdHdvIGxpYnJhcmllcywgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlciwgdGhh
dCBib3RoCisvLyB1c2UgUGVyZmV0dG8gdHJhY2luZykuCisvLyBUaGUgU2VydmljZSBoYXMgb25l
IFNNQiBmb3IgZWFjaCBQcm9kdWNlci4KKy8vIEEgcHJvZHVjZXIgaGFzIG9uZSBvciAodHlwaWNh
bGx5KSBtb3JlIGRhdGEgc291cmNlcy4gVGhleSBhbGwgc2hhcmUgdGhlIHNhbWUKKy8vIFNNQi4K
Ky8vIFRoZSBTTUIgaXMgYSBzdGFnaW5nIGFyZWEgdG8gZGVjb3VwbGUgZGF0YSBzb3VyY2VzIGxp
dmluZyBpbiB0aGUgUHJvZHVjZXIKKy8vIGFuZCBhbGxvdyB0aGVtIHRvIGRvIG5vbi1ibG9ja2lu
ZyBhc3luYyB3cml0ZXMuCisvLyBUaGUgU01CIGlzICpub3QqIHRoZSB1bHRpbWF0ZSBsb2dnaW5n
IGJ1ZmZlciBzZWVuIGJ5IHRoZSBDb25zdW1lci4gVGhhdCBvbmUKKy8vIGlzIGxhcmdlciAofk1C
cykgYW5kIG5vdCBzaGFyZWQgd2l0aCBQcm9kdWNlcnMuCisvLyBFYWNoIFNNQiBpcyBzbWFsbCwg
dHlwaWNhbGx5IGZldyBLQi4gSXRzIHNpemUgaXMgY29uZmlndXJhYmxlIGJ5IHRoZSBwcm9kdWNl
cgorLy8gd2l0aGluIGEgbWF4IGxpbWl0IG9mIH5NQiAoc2VlIGtNYXhTaG1TaXplIGluIHRyYWNp
bmdfc2VydmljZV9pbXBsLmNjKS4KKy8vIFRoZSBTTUIgaXMgcGFydGl0aW9uZWQgaW50byBmaXhl
ZC1zaXplIFBhZ2UocykuIFRoZSBzaXplIG9mIHRoZSBQYWdlcyBhcmUKKy8vIGRldGVybWluZWQg
YnkgZWFjaCBQcm9kdWNlciBhdCBjb25uZWN0aW9uIHRpbWUgYW5kIGNhbm5vdCBiZSBjaGFuZ2Vk
LgorLy8gSGVuY2UsIGRpZmZlcmVudCBwcm9kdWNlcnMgY2FuIGhhdmUgU01CKHMpIHRoYXQgaGF2
ZSBhIGRpZmZlcmVudCBQYWdlIHNpemUKKy8vIGZyb20gZWFjaCBvdGhlciwgYnV0IHRoZSBwYWdl
IHNpemUgd2lsbCBiZSBjb25zdGFudCB0aHJvdWdob3V0IGFsbCB0aGUKKy8vIGxpZmV0aW1lIG9m
IHRoZSBTTUIuCisvLyBQYWdlKHMpIGFyZSBwYXJ0aXRpb25lZCBieSB0aGUgUHJvZHVjZXIgaW50
byB2YXJpYWJsZSBzaXplIENodW5rKHMpOgorLy8KKy8vICstLS0tLS0tLS0tLS0rICAgICAgKy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gfCBQcm9kdWNlciAxIHwgIDwtPiB8ICAgICAg
U01CIDEgW34zMksgLSAxTUJdICB8CisvLyArLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLSst
LS0tLS0tLSstLS0tLS0tLSsKKy8vICAgICAgICAgICAgICAgICAgICAgfCAgUGFnZSAgfCAgUGFn
ZSAgfCAgUGFnZSAgfAorLy8gICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0r
LS0tLS0tLS0rCisvLyAgICAgICAgICAgICAgICAgICAgIHwgQ2h1bmsgIHwgICAgICAgIHwgQ2h1
bmsgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKyAgQ2h1bmsgKy0tLS0tLS0t
KyA8LS0tLSsKKy8vICAgICAgICAgICAgICAgICAgICAgfCBDaHVuayAgfCAgICAgICAgfCBDaHVu
ayAgfCAgICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKy0t
LS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIFNlcnZpY2UgICAg
ICAgfAorLy8gKy0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r
ICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIHwgUHJvZHVjZXIgMiB8ICA8LT4gfCAg
ICAgIFNNQiAyIFt+MzJLIC0gMU1CXSAgfCAgICAgL3wgbGFyZ2UgcmluZyBidWZmZXJzICB8Cisv
LyArLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsgPC0tKyB8
ICgxMDBLIC0gc2V2ZXJhbCBNQikgfAorLy8gICAgICAgICAgICAgICAgICAgICB8ICBQYWdlICB8
ICBQYWdlICB8ICBQYWdlICB8ICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vICAgICAg
ICAgICAgICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworLy8gICAgICAgICAg
ICAgICAgICAgICB8IENodW5rICB8ICAgICAgICB8IENodW5rICB8CisvLyAgICAgICAgICAgICAg
ICAgICAgICstLS0tLS0tLSsgIENodW5rICstLS0tLS0tLSsKKy8vICAgICAgICAgICAgICAgICAg
ICAgfCBDaHVuayAgfCAgICAgICAgfCBDaHVuayAgfAorLy8gICAgICAgICAgICAgICAgICAgICAr
LS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCisvLworLy8gKiBTaXplcyBvZiBib3RoIFNNQiBh
bmQgcmluZyBidWZmZXJzIGFyZSBwdXJlbHkgaW5kaWNhdGl2ZSBhbmQgZGVjaWRlZCBhdAorLy8g
Y29uZmlndXJhdGlvbiB0aW1lIGJ5IHRoZSBQcm9kdWNlciAoZm9yIFNNQiBzaXplcykgYW5kIHRo
ZSBDb25zdW1lciAoZm9yIHRoZQorLy8gZmluYWwgcmluZyBidWZmZXIgc2l6ZSkuCisKKy8vIFBh
Z2UKKy8vIC0tLS0KKy8vIEEgcGFnZSBpcyBhIHBvcnRpb24gb2YgdGhlIHNoYXJlZCBtZW1vcnkg
YnVmZmVyIGFuZCBkZWZpbmVzIHRoZSBncmFudWxhcml0eQorLy8gb2YgdGhlIGludGVyYWN0aW9u
IGJldHdlZW4gdGhlIFByb2R1Y2VyIGFuZCB0cmFjaW5nIFNlcnZpY2UuIFdoZW4gc2Nhbm5pbmcK
Ky8vIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciB0byBkZXRlcm1pbmUgaWYgc29tZXRoaW5nIHNo
b3VsZCBiZSBtb3ZlZCB0byB0aGUKKy8vIGNlbnRyYWwgbG9nZ2luZyBidWZmZXJzLCB0aGUgU2Vy
dmljZSBtb3N0IG9mIHRoZSB0aW1lcyBsb29rcyBhdCBhbmQgbW92ZXMKKy8vIHdob2xlIHBhZ2Vz
LiBTaW1pbGFybHksIHRoZSBQcm9kdWNlciBzZW5kcyBhbiBJUEMgdG8gaW52aXRlIHRoZSBTZXJ2
aWNlIHRvCisvLyBkcmFpbiB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgb25seSB3aGVuIGEgd2hv
bGUgcGFnZSBpcyBmaWxsZWQuCisvLyBIYXZpbmcgZml4ZWQgdGhlIHRvdGFsIFNNQiBzaXplICho
ZW5jZSB0aGUgdG90YWwgbWVtb3J5IG92ZXJoZWFkKSwgdGhlIHBhZ2UKKy8vIHNpemUgaXMgYSB0
cmlhbmd1bGFyIHRyYWRlb2ZmIGJldHdlZW46CisvLyAxKSBJUEMgdHJhZmZpYzogc21hbGxlciBw
YWdlcyAtPiBtb3JlIElQQ3MuCisvLyAyKSBQcm9kdWNlciBsb2NrIGZyZWVkb206IGxhcmdlciBw
YWdlcyAtPiBsYXJnZXIgY2h1bmtzIC0+IGRhdGEgc291cmNlcyBjYW4KKy8vICAgIHdyaXRlIG1v
cmUgZGF0YSB3aXRob3V0IG5lZWRpbmcgdG8gc3dhcCBjaHVua3MgYW5kIHN5bmNocm9uaXplLgor
Ly8gMykgUmlzayBvZiB3cml0ZS1zdGFydmluZyB0aGUgU01COiBsYXJnZXIgcGFnZXMgLT4gaGln
aGVyIGNoYW5jZSB0aGF0IHRoZQorLy8gICAgU2VydmljZSB3b24ndCBtYW5hZ2UgdG8gZHJhaW4g
dGhlbSBhbmQgdGhlIFNNQiByZW1haW5zIGZ1bGwuCisvLyBUaGUgcGFnZSBzaXplLCBvbiB0aGUg
b3RoZXIgc2lkZSwgaGFzIG5vIGltcGxpY2F0aW9ucyBvbiB3YXN0ZWQgbWVtb3J5IGR1ZSB0bwor
Ly8gZnJhZ21lbnRhdGlvbnMgKHNlZSBDaHVuayBiZWxvdykuCisvLyBUaGUgc2l6ZSBvZiB0aGUg
cGFnZSBpcyBjaG9zZW4gYnkgdGhlIFNlcnZpY2UgYXQgY29ubmVjdGlvbiB0aW1lIGFuZCBzdGF5
cworLy8gZml4ZWQgdGhyb3VnaG91dCBhbGwgdGhlIGxpZmV0aW1lIG9mIHRoZSBQcm9kdWNlci4g
RGlmZmVyZW50IHByb2R1Y2VycyAoaS5lLgorLy8gfiBkaWZmZXJlbnQgY2xpZW50IHByb2Nlc3Nl
cykgY2FuIHVzZSBkaWZmZXJlbnQgcGFnZSBzaXplcy4KKy8vIFRoZSBwYWdlIHNpemUgbXVzdCBi
ZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDRrICh0aGlzIGlzIHRvIGFsbG93IFZNIHBhZ2UKKy8v
IHN0ZWFsaW5nIG9wdGltaXphdGlvbnMpIGFuZCBvYnZpb3VzbHkgaGFzIHRvIGJlIGFuIGludGVn
ZXIgZGl2aXNvciBvZiB0aGUKKy8vIHRvdGFsIFNNQiBzaXplLgorCisvLyBDaHVuaworLy8gLS0t
LS0KKy8vIEEgY2h1bmsgaXMgYSBwb3J0aW9uIG9mIGEgUGFnZSB3aGljaCBpcyB3cml0dGVuIGFu
ZCBoYW5kbGVkIGJ5IGEgUHJvZHVjZXIuCisvLyBBIGNodW5rIGNvbnRhaW5zIGEgbGluZWFyIHNl
cXVlbmNlIG9mIFRyYWNlUGFja2V0KHMpICh0aGUgcm9vdCBwcm90bykuCisvLyBBIGNodW5rIGNh
bm5vdCBiZSB3cml0dGVuIGNvbmN1cnJlbnRseSBieSB0d28gZGF0YSBzb3VyY2VzLiBQcm90b2J1
ZnMgbXVzdCBiZQorLy8gZW5jb2RlZCBhcyBjb250aWd1b3VzIGJ5dGUgc3RyZWFtcyBhbmQgY2Fu
bm90IGJlIGludGVybGVhdmVkLiBUaGVyZWZvcmUsIG9uCisvLyB0aGUgUHJvZHVjZXIgc2lkZSwg
YSBjaHVuayBpcyBhbG1vc3QgYWx3YXlzIG93bmVkIGV4Y2x1c2l2ZWx5IGJ5IG9uZSB0aHJlYWQK
Ky8vICglIGV4dHJlbWVseSBwZWN1bGlhciBzbG93LXBhdGggY2FzZXMpLgorLy8gQ2h1bmtzIGFy
ZSBlc3NlbnRpYWxseSBzaW5nbGUtd3JpdGVyIHNpbmdsZS10aHJlYWQgbG9jay1mcmVlIGFyZW5h
cy4gTG9ja2luZworLy8gaGFwcGVucyBvbmx5IHdoZW4gYSBDaHVuayBpcyBmdWxsIGFuZCBhIG5l
dyBvbmUgbmVlZHMgdG8gYmUgYWNxdWlyZWQuCisvLyBMb2NraW5nIGhhcHBlbnMgb25seSB3aXRo
aW4gdGhlIHNjb3BlIG9mIGEgUHJvZHVjZXIgcHJvY2Vzcy4gVGhlcmUgaXMgbm8KKy8vIGludGVy
LXByb2Nlc3MgbG9ja2luZy4gVGhlIFByb2R1Y2VyIGNhbm5vdCBsb2NrIHRoZSBTZXJ2aWNlIGFu
ZCB2aWNldmVyc2EuCisvLyBJbiB0aGUgd29yc3QgY2FzZSwgYW55IG9mIHRoZSB0d28gY2FuIHN0
YXJ2ZSB0aGUgU01CLCBieSBtYXJraW5nIGFsbCBjaHVua3MKKy8vIGFzIGVpdGhlciBiZWluZyBy
ZWFkIG9yIHdyaXR0ZW4uIEJ1dCB0aGF0IGhhcyB0aGUgb25seSBzaWRlIGVmZmVjdCBvZgorLy8g
bG9zaW5nIHRoZSB0cmFjZSBkYXRhLgorLy8gVGhlIFByb2R1Y2VyIGNhbiBkZWNpZGUgdG8gcGFy
dGl0aW9uIGVhY2ggcGFnZSBpbnRvIGEgbnVtYmVyIG9mIGxpbWl0ZWQKKy8vIGNvbmZpZ3VyYXRp
b25zIChlLmcuLCAxIHBhZ2UgPT0gMSBjaHVuaywgMSBwYWdlID09IDIgY2h1bmtzIGFuZCBzbyBv
bikuCisKKy8vIFRyYWNlUGFja2V0CisvLyAtLS0tLS0tLS0tLQorLy8gSXMgdGhlIGF0b20gb2Yg
dHJhY2luZy4gUHV0dGluZyBhc2lkZSBwYWdlcyBhbmQgY2h1bmtzIGEgdHJhY2UgaXMgbWVyZWx5
IGEKKy8vIHNlcXVlbmNlIG9mIFRyYWNlUGFja2V0KHMpLiBUcmFjZVBhY2tldCBpcyB0aGUgcm9v
dCBwcm90b2J1ZiBtZXNzYWdlLgorLy8gQSBUcmFjZVBhY2tldCBjYW4gc3BhbiBhY3Jvc3Mgc2V2
ZXJhbCBjaHVua3MgKGhlbmNlIGV2ZW4gYWNyb3NzIHNldmVyYWwKKy8vIHBhZ2VzKS4gQSBUcmFj
ZVBhY2tldCBjYW4gdGhlcmVmb3JlIGJlID4+IGNodW5rIHNpemUsID4+IHBhZ2Ugc2l6ZSBhbmQg
ZXZlbgorLy8gPj4gU01CIHNpemUuIFRoZSBDaHVuayBoZWFkZXIgY2FycmllcyBtZXRhZGF0YSB0
byBkZWFsIHdpdGggdGhlIFRyYWNlUGFja2V0CisvLyBzcGxpdHRpbmcgY2FzZS4KKworLy8gVXNl
IG9ubHkgZXhwbGljaXRseS1zaXplZCB0eXBlcyBiZWxvdy4gRE8gTk9UIHVzZSBzaXplX3Qgb3Ig
YW55IGFyY2hpdGVjdHVyZQorLy8gZGVwZW5kZW50IHNpemUgKGUuZy4gc2l6ZV90KSBpbiB0aGUg
c3RydWN0IGZpZWxkcy4gVGhpcyBidWZmZXIgd2lsbCBiZSByZWFkCisvLyBhbmQgd3JpdHRlbiBi
eSBwcm9jZXNzZXMgdGhhdCBoYXZlIGEgZGlmZmVyZW50IGJpdG5lc3MgaW4gdGhlIHNhbWUgT1Mu
CisvLyBJbnN0ZWFkIGl0J3MgZmluZSB0byBhc3N1bWUgbGl0dGxlLWVuZGlhbmVzcy4gQmlnLWVu
ZGlhbiBpcyBhIGRyZWFtIHdlIGFyZQorLy8gbm90IGN1cnJlbnRseSBwdXJzdWluZy4KKworY2xh
c3MgU2hhcmVkTWVtb3J5QUJJIHsKKyBwdWJsaWM6CisgIC8vIFRoaXMgaXMgZHVlIHRvIENodW5r
OjpzaXplIGJlaW5nIDE2IGJpdHMuCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhQYWdl
U2l6ZSA9IDY0ICogMTAyNDsKKworICAvLyAiMTQiIGlzIHRoZSBtYXggbnVtYmVyIHRoYXQgY2Fu
IGJlIGVuY29kZWQgaW4gYSAzMiBiaXQgYXRvbWljIHdvcmQgdXNpbmcKKyAgLy8gMiBzdGF0ZSBi
aXRzIHBlciBDaHVuayBhbmQgbGVhdmluZyA0IGJpdHMgZm9yIHRoZSBwYWdlIGxheW91dC4KKyAg
Ly8gU2VlIFBhZ2VMYXlvdXQgYmVsb3cuCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhD
aHVua3NQZXJQYWdlID0gMTQ7CisKKyAgLy8gRWFjaCBUcmFjZVBhY2tldCBpbiB0aGUgQ2h1bmsg
aXMgcHJlZml4ZWQgYnkgYSA0IGJ5dGVzIHJlZHVuZGFudCBWYXJJbnQKKyAgLy8gKHNlZSBwcm90
b191dGlscy5oKSBzdGF0aW5nIGl0cyBzaXplLgorICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBr
UGFja2V0SGVhZGVyU2l6ZSA9IDQ7CisKKyAgLy8gVHJhY2VXcml0ZXIgc3BlY2lmaWVzIHRoaXMg
aW52YWxpZCBwYWNrZXQvZnJhZ21lbnQgc2l6ZSB0byBzaWduYWwgdG8gdGhlCisgIC8vIHNlcnZp
Y2UgdGhhdCBhIHBhY2tldCBzaG91bGQgYmUgZGlzY2FyZGVkLCBiZWNhdXNlIHRoZSBUcmFjZVdy
aXRlciBjb3VsZG4ndAorICAvLyB3cml0ZSBpdHMgcmVtYWluaW5nIGZyYWdtZW50cyAoZS5nLiBi
ZWNhdXNlIHRoZSBTTUIgd2FzIGV4aGF1c3RlZCkuCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90
IGtQYWNrZXRTaXplRHJvcFBhY2tldCA9CisgICAgICBwcm90b3plcm86OnByb3RvX3V0aWxzOjpr
TWF4TWVzc2FnZUxlbmd0aDsKKworICAvLyBDaHVuayBzdGF0ZXMgYW5kIHRyYW5zaXRpb25zOgor
ICAvLyAgICBrQ2h1bmtGcmVlICA8LS0tLS0tLS0tLS0tLS0tLSsKKyAgLy8gICAgICAgICB8ICAo
UHJvZHVjZXIpICAgICAgICAgICB8CisgIC8vICAgICAgICAgViAgICAgICAgICAgICAgICAgICAg
ICAgfAorICAvLyAga0NodW5rQmVpbmdXcml0dGVuICAgICAgICAgICAgIHwKKyAgLy8gICAgICAg
ICB8ICAoUHJvZHVjZXIpICAgICAgICAgICB8CisgIC8vICAgICAgICAgViAgICAgICAgICAgICAg
ICAgICAgICAgfAorICAvLyAga0NodW5rQ29tcGxldGUgICAgICAgICAgICAgICAgIHwKKyAgLy8g
ICAgICAgICB8ICAoU2VydmljZSkgICAgICAgICAgICB8CisgIC8vICAgICAgICAgViAgICAgICAg
ICAgICAgICAgICAgICAgfAorICAvLyAga0NodW5rQmVpbmdSZWFkICAgICAgICAgICAgICAgIHwK
KyAgLy8gICAgICAgIHwgICAoU2VydmljZSkgICAgICAgICAgICB8CisgIC8vICAgICAgICArLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICBlbnVtIENodW5rU3RhdGUgOiB1aW50MzJfdCB7Cisg
ICAgLy8gVGhlIENodW5rIGlzIGZyZWUuIFRoZSBTZXJ2aWNlIHNoYWxsIG5ldmVyIHRvdWNoIGl0
LCB0aGUgUHJvZHVjZXIgY2FuCisgICAgLy8gYWNxdWlyZSBpdCBhbmQgdHJhbnNpdGlvbiBpdCBp
bnRvIGtDaHVua0JlaW5nV3JpdHRlbi4KKyAgICBrQ2h1bmtGcmVlID0gMCwKKworICAgIC8vIFRo
ZSBDaHVuayBpcyBiZWluZyB1c2VkIGJ5IHRoZSBQcm9kdWNlciBhbmQgaXMgbm90IGNvbXBsZXRl
IHlldC4KKyAgICAvLyBUaGUgU2VydmljZSBzaGFsbCBuZXZlciB0b3VjaCBrQ2h1bmtCZWluZ1dy
aXR0ZW4gcGFnZXMuCisgICAga0NodW5rQmVpbmdXcml0dGVuID0gMSwKKworICAgIC8vIFRoZSBT
ZXJ2aWNlIGlzIG1vdmluZyB0aGUgcGFnZSBpbnRvIGl0cyBub24tc2hhcmVkIHJpbmcgYnVmZmVy
LiBUaGUKKyAgICAvLyBQcm9kdWNlciBzaGFsbCBuZXZlciB0b3VjaCBrQ2h1bmtCZWluZ1JlYWQg
cGFnZXMuCisgICAga0NodW5rQmVpbmdSZWFkID0gMiwKKworICAgIC8vIFRoZSBQcm9kdWNlciBp
cyBkb25lIHdyaXRpbmcgdGhlIHBhZ2UgYW5kIHdvbid0IHRvdWNoIGl0IGFnYWluLiBUaGUKKyAg
ICAvLyBTZXJ2aWNlIGNhbiBub3cgbW92ZSBpdCB0byBpdHMgbm9uLXNoYXJlZCByaW5nIGJ1ZmZl
ci4KKyAgICAvLyBrQWxsQ2h1bmtzQ29tcGxldGUgcmVsaWVzIG9uIHRoaXMgYmVpbmcgPT0gMy4K
KyAgICBrQ2h1bmtDb21wbGV0ZSA9IDMsCisgIH07CisgIHN0YXRpYyBjb25zdGV4cHIgY29uc3Qg
Y2hhcioga0NodW5rU3RhdGVTdHJbXSA9IHsiRnJlZSIsICJCZWluZ1dyaXR0ZW4iLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlaW5nUmVhZCIs
ICJDb21wbGV0ZSJ9OworCisgIGVudW0gUGFnZUxheW91dCA6IHVpbnQzMl90IHsKKyAgICAvLyBU
aGUgcGFnZSBpcyBmdWxseSBmcmVlIGFuZCBoYXMgbm90IGJlZW4gcGFydGl0aW9uZWQgeWV0Lgor
ICAgIGtQYWdlTm90UGFydGl0aW9uZWQgPSAwLAorCisgICAgLy8gVE9ETyhwcmltaWFubyk6IEFs
aWduaW5nIGEgY2h1bmsgQCAxNiBieXRlcyBjb3VsZCBhbGxvdyB0byB1c2UgZmFzdGVyCisgICAg
Ly8gaW50cmluc2ljcyBiYXNlZCBvbiBxdWFkLXdvcmQgbW92ZXMuIERvIHRoZSBtYXRoIGFuZCBj
aGVjayB3aGF0IGlzIHRoZQorICAgIC8vIGZyYWdtZW50YXRpb24gbG9zcy4KKworICAgIC8vIGFs
aWduNChYKSA6PSB0aGUgbGFyZ2VzdCBpbnRlZ2VyIE4gcy50LiAoTiAlIDQpID09IDAgJiYgTiA8
PSBYLgorICAgIC8vIDggPT0gc2l6ZW9mKFBhZ2VIZWFkZXIpLgorICAgIGtQYWdlRGl2MSA9IDEs
ICAgLy8gT25seSBvbmUgY2h1bmsgb2Ygc2l6ZTogUEFHRV9TSVpFIC0gOC4KKyAgICBrUGFnZURp
djIgPSAyLCAgIC8vIFR3byBjaHVua3Mgb2Ygc2l6ZTogYWxpZ240KChQQUdFX1NJWkUgLSA4KSAv
IDIpLgorICAgIGtQYWdlRGl2NCA9IDMsICAgLy8gRm91ciBjaHVua3Mgb2Ygc2l6ZTogYWxpZ240
KChQQUdFX1NJWkUgLSA4KSAvIDQpLgorICAgIGtQYWdlRGl2NyA9IDQsICAgLy8gU2V2ZW4gY2h1
bmtzIG9mIHNpemU6IGFsaWduNCgoUEFHRV9TSVpFIC0gOCkgLyA3KS4KKyAgICBrUGFnZURpdjE0
ID0gNSwgIC8vIEZvdXJ0ZWVuIGNodW5rcyBvZiBzaXplOiBhbGlnbjQoKFBBR0VfU0laRSAtIDgp
IC8gMTQpLgorCisgICAgLy8gVGhlIHJhdGlvbmFsZSBmb3IgNyBhbmQgMTQgYWJvdmUgaXMgdG8g
bWF4aW1pemUgdGhlIHBhZ2UgdXNhZ2UgZm9yIHRoZQorICAgIC8vIGxpa2VseSBjYXNlIG9mIHxw
YWdlX3NpemV8ID09IDQwOTY6CisgICAgLy8gKCgoNDA5NiAtIDgpIC8gMTQpICUgNCkgPT0gMCwg
d2hpbGUgKCgoNDA5NiAtIDgpIC8gMTYgJSA0KSkgPT0gMy4gU28KKyAgICAvLyBEaXYxNiB3b3Vs
ZCB3YXN0ZSAzICogMTYgPSA0OCBieXRlcyBwZXIgcGFnZSBmb3IgY2h1bmsgYWxpZ25tZW50IGdh
cHMuCisKKyAgICBrUGFnZURpdlJlc2VydmVkMSA9IDYsCisgICAga1BhZ2VEaXZSZXNlcnZlZDIg
PSA3LAorICAgIGtOdW1QYWdlTGF5b3V0cyA9IDgsCisgIH07CisKKyAgLy8gS2VlcCB0aGlzIGNv
bnNpc3RlbnQgd2l0aCB0aGUgUGFnZUxheW91dCBlbnVtIGFib3ZlLgorICBzdGF0aWMgY29uc3Rl
eHByIHVpbnQzMl90IGtOdW1DaHVua3NGb3JMYXlvdXRbXSA9IHswLCAxLCAyLCA0LCA3LCAxNCwg
MCwgMH07CisKKyAgLy8gTGF5b3V0IG9mIGEgUGFnZS4KKyAgLy8gKz09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKyAgLy8gfCBQYWdlIGhlYWRlciBb
OCBieXRlc10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgLy8gfCBUZWxscyBob3cg
bWFueSBjaHVua3MgdGhlcmUgYXJlLCBob3cgYmlnIHRoZXkgYXJlIHwKKyAgLy8gfCBhbmQgdGhl
aXIgc3RhdGUgKGZyZWUsIHJlYWQsIHdyaXRlLCBjb21wbGV0ZSkuICAgIHwKKyAgLy8gKz09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKyAgLy8gKyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKisKKyAgLy8g
fCBDaHVuayAjMCBoZWFkZXIgWzggYnl0ZXNdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAg
Ly8gfCBUZWxscyBob3cgbWFueSBwYWNrZXRzIHRoZXJlIGFyZSBhbmQgd2hldGhlciB0aGUgIHwK
KyAgLy8gfCB3aGV0aGVyIHRoZSAxc3QgYW5kIGxhc3Qgb25lcyBhcmUgZnJhZ21lbnRlZC4gICAg
IHwKKyAgLy8gfCBBbHNvIGhhcyBhIGNodW5rIGlkIHRvIHJlYXNzZW1ibGUgZnJhZ21lbnRzLiAg
ICB8CisgIC8vICsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKiorCisgIC8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0rCisgIC8vIHwgUGFja2V0ICMwIHNpemUgW3ZhcmludCwgdXAgdG8gNCBieXRlc10g
ICAgICAgICAgICB8CisgIC8vICsgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSArCisgIC8vIHwgUGFja2V0ICMwIHBheWxvYWQgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB8CisgIC8vIHwgQSBUcmFjZVBhY2tldCBwcm90b2J1ZiBtZXNzYWdl
ICAgICAgICAgICAgICAgICAgICB8CisgIC8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC4u
LgorICAvLyArIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAu
IC4gKworICAvLyB8ICAgICAgT3B0aW9uYWwgcGFkZGluZyB0byBtYWludGFpbiBhbGlnbWVudCAg
ICAgICAgfAorICAvLyArIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAu
IC4gLiAuIC4gKworICAvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tKworICAvLyB8IFBhY2tldCAjTiBzaXplIFt2YXJpbnQsIHVwIHRvIDQgYnl0
ZXNdICAgICAgICAgICAgfAorICAvLyArIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gKworICAvLyB8IFBhY2tldCAjTiBwYXlsb2FkICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfAorICAvLyB8IEEgVHJhY2VQYWNrZXQgcHJvdG9idWYgbWVz
c2FnZSAgICAgICAgICAgICAgICAgICAgfAorICAvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAvLyAgICAgICAgICAgICAgICAgICAgICAg
ICAuLi4KKyAgLy8gKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKisKKyAgLy8gfCBDaHVuayAjTSBoZWFkZXIgWzggYnl0ZXNdICAgICAgICAgICAgICAg
ICAgICAgICAgIHwKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLy8gQWxp
Z25tZW50IGFwcGxpZXMgdG8gc3RhcnQgb2Zmc2V0IG9ubHkuIFRoZSBDaHVuayBzaXplIGlzICpu
b3QqIGFsaWduZWQuCisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0NodW5rQWxpZ25tZW50
ID0gNDsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQ2h1bmtTaGlmdCA9IDI7CisgIHN0
YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0NodW5rTWFzayA9IDB4MzsKKyAgc3RhdGljIGNvbnN0
ZXhwciB1aW50MzJfdCBrTGF5b3V0TWFzayA9IDB4NzAwMDAwMDA7CisgIHN0YXRpYyBjb25zdGV4
cHIgdWludDMyX3Qga0xheW91dFNoaWZ0ID0gMjg7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMy
X3Qga0FsbENodW5rc01hc2sgPSAweDBGRkZGRkZGOworCisgIC8vIFRoaXMgYXNzdW1lcyB0aGF0
IGtDaHVua0NvbXBsZXRlID09IDMuCisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0FsbENo
dW5rc0NvbXBsZXRlID0gMHgwRkZGRkZGRjsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBr
QWxsQ2h1bmtzRnJlZSA9IDA7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtJbnZhbGlkUGFn
ZUlkeCA9IHN0YXRpY19jYXN0PHNpemVfdD4oLTEpOworCisgIC8vIFRoZXJlIGlzIG9uZSBwYWdl
IGhlYWRlciBwZXIgcGFnZSwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4KKyAgc3RydWN0
IFBhZ2VIZWFkZXIgeworICAgIC8vIHxsYXlvdXR8IGJpdHM6CisgICAgLy8gWzMxXSBbMzA6Mjhd
IFsyNzoyNl0gLi4uIFsxOjBdCisgICAgLy8gIHwgICAgICB8ICAgICAgIHwgICAgIHwgICAgfAor
ICAgIC8vICB8ICAgICAgfCAgICAgICB8ICAgICB8ICAgICstLS0tLS0tLS0tIENodW5rU3RhdGVb
MF0KKyAgICAvLyAgfCAgICAgIHwgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tLS0tLSBDaHVua1N0
YXRlWzEyLi4xXQorICAgIC8vICB8ICAgICAgfCAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0t
IENodW5rU3RhdGVbMTNdCisgICAgLy8gIHwgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gUGFnZUxheW91dCAoMCA9PSBwYWdlIGZ1bGx5IGZyZWUpCisgICAgLy8gICstLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAg
ICBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbGF5b3V0OworCisgICAgLy8gSWYgd2UnbGwgZXZlciBn
b2luZyB0byB1c2UgdGhpcyBpbiB0aGUgZnV0dXJlIGl0IG1pZ2h0IGNvbWUgaGFuZHkKKyAgICAv
LyByZXZpdmluZyB0aGUga1BhZ2VCZWluZ1BhcnRpdGlvbmVkIGxvZ2ljIChsb29rIGluIGdpdCBs
b2csIGl0IHdhcyB0aGVyZQorICAgIC8vIGF0IHNvbWUgcG9pbnQgaW4gdGhlIHBhc3QpLgorICAg
IHVpbnQzMl90IHJlc2VydmVkOworICB9OworCisgIC8vIFRoZXJlIGlzIG9uZSBDaHVuayBoZWFk
ZXIgcGVyIGNodW5rIChoZW5jZSBQYWdlTGF5b3V0IHBlciBwYWdlKSBhdCB0aGUKKyAgLy8gYmVn
aW5uaW5nIG9mIGVhY2ggY2h1bmsuCisgIHN0cnVjdCBDaHVua0hlYWRlciB7CisgICAgZW51bSBG
bGFncyA6IHVpbnQ4X3QgeworICAgICAgLy8gSWYgc2V0LCB0aGUgZmlyc3QgVHJhY2VQYWNrZXQg
aW4gdGhlIGNodW5rIGlzIHBhcnRpYWwgYW5kIGNvbnRpbnVlcworICAgICAgLy8gZnJvbSB8Y2h1
bmtfaWR8IC0gMSAod2l0aGluIHRoZSBzYW1lIHx3cml0ZXJfaWR8KS4KKyAgICAgIGtGaXJzdFBh
Y2tldENvbnRpbnVlc0Zyb21QcmV2Q2h1bmsgPSAxIDw8IDAsCisKKyAgICAgIC8vIElmIHNldCwg
dGhlIGxhc3QgVHJhY2VQYWNrZXQgaW4gdGhlIGNodW5rIGlzIHBhcnRpYWwgYW5kIGNvbnRpbnVl
cyBvbgorICAgICAgLy8gfGNodW5rX2lkfCArIDEgKHdpdGhpbiB0aGUgc2FtZSB8d3JpdGVyX2lk
fCkuCisgICAgICBrTGFzdFBhY2tldENvbnRpbnVlc09uTmV4dENodW5rID0gMSA8PCAxLAorCisg
ICAgICAvLyBJZiBzZXQsIHRoZSBsYXN0IChmcmFnbWVudGVkKSBUcmFjZVBhY2tldCBpbiB0aGUg
Y2h1bmsgaGFzIGhvbGVzIChldmVuCisgICAgICAvLyBpZiB0aGUgY2h1bmsgaXMgbWFya2VkIGFz
IGtDaHVua0NvbXBsZXRlKSB0aGF0IG5lZWQgdG8gYmUgcGF0Y2hlZAorICAgICAgLy8gb3V0LW9m
LWJhbmQgYmVmb3JlIHRoZSBjaHVuayBjYW4gYmUgcmVhZC4KKyAgICAgIGtDaHVua05lZWRzUGF0
Y2hpbmcgPSAxIDw8IDIsCisgICAgfTsKKworICAgIHN0cnVjdCBQYWNrZXRzIHsKKyAgICAgIC8v
IE51bWJlciBvZiB2YWxpZCBUcmFjZVBhY2tldCBwcm90b2J1ZiBtZXNzYWdlcyBjb250YWluZWQg
aW4gdGhlIGNodW5rLgorICAgICAgLy8gRWFjaCBUcmFjZVBhY2tldCBpcyBwcmVmaXhlZCBieSBp
dHMgb3duIHNpemUuIFRoaXMgZmllbGQgaXMKKyAgICAgIC8vIG1vbm90b25pY2FsbHkgdXBkYXRl
ZCBieSB0aGUgUHJvZHVjZXIgd2l0aCByZWxlYXNlIHN0b3JlIHNlbWFudGljIHdoZW4KKyAgICAg
IC8vIHRoZSBwYWNrZXQgYXQgcG9zaXRpb24gfGNvdW50fCBpcyBzdGFydGVkLiBUaGlzIGxhc3Qg
cGFja2V0IG1heSBub3QgYmUKKyAgICAgIC8vIGNvbnNpZGVyZWQgY29tcGxldGUgdW50aWwgfGNv
dW50fCBpcyBpbmNyZW1lbnRlZCBmb3IgdGhlIHN1YnNlcXVlbnQKKyAgICAgIC8vIHBhY2tldCBv
ciB0aGUgY2h1bmsgaXMgY29tcGxldGVkLgorICAgICAgdWludDE2X3QgY291bnQgOiAxMDsKKyAg
ICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhDb3VudCA9ICgxIDw8IDEwKSAtIDE7CisK
KyAgICAgIC8vIFNlZSBGbGFncyBhYm92ZS4KKyAgICAgIHVpbnQxNl90IGZsYWdzIDogNjsKKyAg
ICB9OworCisgICAgLy8gQSBtb25vdG9uaWMgY291bnRlciBvZiB0aGUgY2h1bmsgd2l0aGluIHRo
ZSBzY29wZWQgb2YgYSB8d3JpdGVyX2lkfC4KKyAgICAvLyBUaGUgdHVwbGUgKFByb2R1Y2VySUQs
IFdyaXRlcklELCBDaHVua0lEKSBhbGxvd3MgdG8gZmlndXJlIG91dCBpZiB0d28KKyAgICAvLyBj
aHVua3MgYXJlIGNvbnRpZ3VvdXMgKGFuZCBoZW5jZSBhIHRyYWNlIHBhY2tldHMgc3Bhbm5pbmcg
YWNyb3NzIHRoZW0gY2FuCisgICAgLy8gYmUgZ2x1ZWQpIG9yIHdlIGhhZCBzb21lIGhvbGVzIGR1
ZSB0byB0aGUgcmluZyBidWZmZXIgd3JhcHBpbmcuCisgICAgLy8gVGhpcyBpcyBzZXQgb25seSB3
aGVuIHRyYW5zaXRpb25pbmcgZnJvbSBrQ2h1bmtGcmVlIHRvIGtDaHVua0JlaW5nV3JpdHRlbgor
ICAgIC8vIGFuZCByZW1haW5zIHVuY2hhbmdlZCB0aHJvdWdob3V0IHRoZSByZW1haW5pbmcgbGlm
ZXRpbWUgb2YgdGhlIGNodW5rLgorICAgIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBjaHVua19pZDsK
KworICAgIC8vIElEIG9mIHRoZSB3cml0ZXIsIHVuaXF1ZSB3aXRoaW4gdGhlIHByb2R1Y2VyLgor
ICAgIC8vIExpa2UgfGNodW5rX2lkfCwgdGhpcyBpcyBzZXQgb25seSB3aGVuIHRyYW5zaXRpb25p
bmcgZnJvbSBrQ2h1bmtGcmVlIHRvCisgICAgLy8ga0NodW5rQmVpbmdXcml0dGVuLgorICAgIHN0
ZDo6YXRvbWljPHVpbnQxNl90PiB3cml0ZXJfaWQ7CisKKyAgICAvLyBUaGVyZSBpcyBubyBQcm9k
dWNlcklEIGhlcmUuIFRoZSBzZXJ2aWNlIGZpZ3VyZXMgdGhhdCBvdXQgZnJvbSB0aGUgSVBDCisg
ICAgLy8gY2hhbm5lbCwgd2hpY2ggaXMgdW5zcG9vZmFibGUuCisKKyAgICAvLyBVcGRhdGVkIHdp
dGggcmVsZWFzZS1zdG9yZSBzZW1hbnRpY3MuCisgICAgc3RkOjphdG9taWM8UGFja2V0cz4gcGFj
a2V0czsKKyAgfTsKKworICBjbGFzcyBDaHVuayB7CisgICBwdWJsaWM6CisgICAgQ2h1bmsoKTsg
IC8vIENvbnN0cnVjdHMgYW4gaW52YWxpZCBjaHVuay4KKworICAgIC8vIENodW5rIGlzIG1vdmUt
b25seSwgdG8gZG9jdW1lbnQgdGhlIHNjb3BlIG9mIHRoZSBBY3F1aXJlL1JlbGVhc2UKKyAgICAv
LyBUcnlMb2NrIG9wZXJhdGlvbnMgYmVsb3cuCisgICAgQ2h1bmsoY29uc3QgQ2h1bmsmKSA9IGRl
bGV0ZTsKKyAgICBDaHVuayBvcGVyYXRvcj0oY29uc3QgQ2h1bmsmKSA9IGRlbGV0ZTsKKyAgICBD
aHVuayhDaHVuayYmKSBub2V4Y2VwdDsKKyAgICBDaHVuayYgb3BlcmF0b3I9KENodW5rJiYpOwor
CisgICAgdWludDhfdCogYmVnaW4oKSBjb25zdCB7IHJldHVybiBiZWdpbl87IH0KKyAgICB1aW50
OF90KiBlbmQoKSBjb25zdCB7IHJldHVybiBiZWdpbl8gKyBzaXplXzsgfQorCisgICAgLy8gU2l6
ZSwgaW5jbHVkaW5nIENodW5rIGhlYWRlci4KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIHNpemVfOyB9CisKKyAgICAvLyBCZWdpbiBvZiB0aGUgZmlyc3QgcGFja2V0IChvciBwYWNr
ZXQgZnJhZ21lbnQpLgorICAgIHVpbnQ4X3QqIHBheWxvYWRfYmVnaW4oKSBjb25zdCB7IHJldHVy
biBiZWdpbl8gKyBzaXplb2YoQ2h1bmtIZWFkZXIpOyB9CisgICAgc2l6ZV90IHBheWxvYWRfc2l6
ZSgpIGNvbnN0IHsKKyAgICAgIFBFUkZFVFRPX0RDSEVDSyhzaXplXyA+PSBzaXplb2YoQ2h1bmtI
ZWFkZXIpKTsKKyAgICAgIHJldHVybiBzaXplXyAtIHNpemVvZihDaHVua0hlYWRlcik7CisgICAg
fQorCisgICAgYm9vbCBpc192YWxpZCgpIGNvbnN0IHsgcmV0dXJuIGJlZ2luXyAmJiBzaXplXzsg
fQorCisgICAgLy8gSW5kZXggb2YgdGhlIGNodW5rIHdpdGhpbiB0aGUgcGFnZSBbMC4uMTNdICgx
MyBjb21lcyBmcm9tIGtQYWdlRGl2MTQpLgorICAgIHVpbnQ4X3QgY2h1bmtfaWR4KCkgY29uc3Qg
eyByZXR1cm4gY2h1bmtfaWR4XzsgfQorCisgICAgQ2h1bmtIZWFkZXIqIGhlYWRlcigpIHsgcmV0
dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q2h1bmtIZWFkZXIqPihiZWdpbl8pOyB9CisKKyAgICB1aW50
MTZfdCB3cml0ZXJfaWQoKSB7CisgICAgICByZXR1cm4gaGVhZGVyKCktPndyaXRlcl9pZC5sb2Fk
KHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhl
IGNvdW50IG9mIHBhY2tldHMgYW5kIHRoZSBmbGFncyB3aXRoIGFjcXVpcmUtbG9hZCBzZW1hbnRp
Y3MuCisgICAgc3RkOjpwYWlyPHVpbnQxNl90LCB1aW50OF90PiBHZXRQYWNrZXRDb3VudEFuZEZs
YWdzKCkgeworICAgICAgYXV0byBwYWNrZXRzID0gaGVhZGVyKCktPnBhY2tldHMubG9hZChzdGQ6
Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgIGNvbnN0IHVpbnQxNl90IHBhY2tldHNfY291
bnQgPSBwYWNrZXRzLmNvdW50OworICAgICAgY29uc3QgdWludDhfdCBwYWNrZXRzX2ZsYWdzID0g
cGFja2V0cy5mbGFnczsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwYWNrZXRzX2NvdW50
LCBwYWNrZXRzX2ZsYWdzKTsKKyAgICB9CisKKyAgICAvLyBJbmNyZWFzZXMgfHBhY2tldHMuY291
bnR8IHdpdGggcmVsZWFzZSBzZW1hbnRpY3MgKG5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlCisgICAg
Ly8gcGFja2V0IGNvdW50IGlzIGluY3JlbWVudGVkICpiZWZvcmUqIHN0YXJ0aW5nIHdyaXRpbmcg
YSBwYWNrZXQpLiBSZXR1cm5zCisgICAgLy8gdGhlIG5ldyBwYWNrZXQgY291bnQuIFRoZSBpbmNy
ZW1lbnQgaXMgYXRvbWljIGJ1dCBOT1QgcmFjZS1mcmVlIChpLmUuIG5vCisgICAgLy8gQ0FTKS4g
T25seSB0aGUgUHJvZHVjZXIgaXMgc3VwcG9zZWQgdG8gcGVyZm9ybSB0aGlzIGluY3JlbWVudCwg
YW5kIGl0J3MKKyAgICAvLyBzdXBwb3NlZCB0byBkbyB0aGF0IGluIGEgdGhyZWFkLXNhZmUgd2F5
IChob2xkaW5nIGEgbG9jaykuIEEgQ2h1bmsgY2Fubm90CisgICAgLy8gYmUgc2hhcmVkIGJ5IG11
bHRpcGxlIFByb2R1Y2VyIHRocmVhZHMgd2l0aG91dCBsb2NraW5nLiBUaGUgcGFja2V0IGNvdW50
CisgICAgLy8gaXMgY2xlYXJlZCBieSBUcnlBY3F1aXJlQ2h1bmsoKSwgd2hlbiBwYXNzaW5nIHRo
ZSBuZXcgaGVhZGVyIGZvciB0aGUKKyAgICAvLyBjaHVuay4KKyAgICB1aW50MTZfdCBJbmNyZW1l
bnRQYWNrZXRDb3VudCgpIHsKKyAgICAgIENodW5rSGVhZGVyKiBjaHVua19oZWFkZXIgPSBoZWFk
ZXIoKTsKKyAgICAgIGF1dG8gcGFja2V0cyA9IGNodW5rX2hlYWRlci0+cGFja2V0cy5sb2FkKHN0
ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgcGFja2V0cy5jb3VudCsrOworICAgICAg
Y2h1bmtfaGVhZGVyLT5wYWNrZXRzLnN0b3JlKHBhY2tldHMsIHN0ZDo6bWVtb3J5X29yZGVyX3Jl
bGVhc2UpOworICAgICAgcmV0dXJuIHBhY2tldHMuY291bnQ7CisgICAgfQorCisgICAgLy8gSW5j
cmVhc2VzIHxwYWNrZXRzLmNvdW50fCB0byB0aGUgZ2l2ZW4gfHBhY2tldF9jb3VudHwsIGJ1dCBv
bmx5IGlmCisgICAgLy8gfHBhY2tldF9jb3VudHwgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQg
dmFsdWUgb2YgfHBhY2tldHMuY291bnR8LgorICAgIC8vIFJldHVybnMgdGhlIG5ldyBwYWNrZXQg
Y291bnQuIFNhbWUgYXRvbWljaXR5IGd1YXJhbnRlZXMgYXMKKyAgICAvLyBJbmNyZW1lbnRQYWNr
ZXRDb3VudCgpLgorICAgIHVpbnQxNl90IEluY3JlYXNlUGFja2V0Q291bnRUbyh1aW50MTZfdCBw
YWNrZXRfY291bnQpIHsKKyAgICAgIENodW5rSGVhZGVyKiBjaHVua19oZWFkZXIgPSBoZWFkZXIo
KTsKKyAgICAgIGF1dG8gcGFja2V0cyA9IGNodW5rX2hlYWRlci0+cGFja2V0cy5sb2FkKHN0ZDo6
bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgaWYgKHBhY2tldHMuY291bnQgPCBwYWNrZXRf
Y291bnQpCisgICAgICAgIHBhY2tldHMuY291bnQgPSBwYWNrZXRfY291bnQ7CisgICAgICBjaHVu
a19oZWFkZXItPnBhY2tldHMuc3RvcmUocGFja2V0cywgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFz
ZSk7CisgICAgICByZXR1cm4gcGFja2V0cy5jb3VudDsKKyAgICB9CisKKyAgICAvLyBGbGFncyBh
cmUgY2xlYXJlZCBieSBUcnlBY3F1aXJlQ2h1bmsoKSwgYnkgcGFzc2luZyB0aGUgbmV3IGhlYWRl
ciBmb3IKKyAgICAvLyB0aGUgY2h1bmsuCisgICAgdm9pZCBTZXRGbGFnKENodW5rSGVhZGVyOjpG
bGFncyBmbGFnKSB7CisgICAgICBDaHVua0hlYWRlciogY2h1bmtfaGVhZGVyID0gaGVhZGVyKCk7
CisgICAgICBhdXRvIHBhY2tldHMgPSBjaHVua19oZWFkZXItPnBhY2tldHMubG9hZChzdGQ6Om1l
bW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgIHBhY2tldHMuZmxhZ3MgfD0gZmxhZzsKKyAgICAg
IGNodW5rX2hlYWRlci0+cGFja2V0cy5zdG9yZShwYWNrZXRzLCBzdGQ6Om1lbW9yeV9vcmRlcl9y
ZWxlYXNlKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFNoYXJlZE1l
bW9yeUFCSTsKKyAgICBDaHVuayh1aW50OF90KiBiZWdpbiwgdWludDE2X3Qgc2l6ZSwgdWludDhf
dCBjaHVua19pZHgpOworCisgICAgLy8gRG9uJ3QgYWRkIGV4dHJhIGZpZWxkcywga2VlcCB0aGUg
bW92ZSBvcGVyYXRvciBmYXN0LgorICAgIHVpbnQ4X3QqIGJlZ2luXyA9IG51bGxwdHI7CisgICAg
dWludDE2X3Qgc2l6ZV8gPSAwOworICAgIHVpbnQ4X3QgY2h1bmtfaWR4XyA9IDA7CisgIH07CisK
KyAgLy8gQ29uc3RydWN0IGFuIGluc3RhbmNlIGZyb20gYW4gZXhpc3Rpbmcgc2hhcmVkIG1lbW9y
eSBidWZmZXIuCisgIFNoYXJlZE1lbW9yeUFCSSh1aW50OF90KiBzdGFydCwgc2l6ZV90IHNpemUs
IHNpemVfdCBwYWdlX3NpemUpOworICBTaGFyZWRNZW1vcnlBQkkoKTsKKworICB2b2lkIEluaXRp
YWxpemUodWludDhfdCogc3RhcnQsIHNpemVfdCBzaXplLCBzaXplX3QgcGFnZV9zaXplKTsKKwor
ICB1aW50OF90KiBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0XzsgfQorICB1aW50OF90KiBl
bmQoKSBjb25zdCB7IHJldHVybiBzdGFydF8gKyBzaXplXzsgfQorICBzaXplX3Qgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIHNpemVfOyB9CisgIHNpemVfdCBwYWdlX3NpemUoKSBjb25zdCB7IHJldHVy
biBwYWdlX3NpemVfOyB9CisgIHNpemVfdCBudW1fcGFnZXMoKSBjb25zdCB7IHJldHVybiBudW1f
cGFnZXNfOyB9CisgIGJvb2wgaXNfdmFsaWQoKSB7IHJldHVybiBudW1fcGFnZXMoKSA+IDA7IH0K
KworICB1aW50OF90KiBwYWdlX3N0YXJ0KHNpemVfdCBwYWdlX2lkeCkgeworICAgIFBFUkZFVFRP
X0RDSEVDSyhwYWdlX2lkeCA8IG51bV9wYWdlc18pOworICAgIHJldHVybiBzdGFydF8gKyBwYWdl
X3NpemVfICogcGFnZV9pZHg7CisgIH0KKworICBQYWdlSGVhZGVyKiBwYWdlX2hlYWRlcihzaXpl
X3QgcGFnZV9pZHgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQYWdlSGVhZGVyKj4o
cGFnZV9zdGFydChwYWdlX2lkeCkpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBw
YWdlIGlzIGZ1bGx5IGNsZWFyIGFuZCBoYXMgbm90IGJlZW4gcGFydGl0aW9uZWQgeWV0LgorICAv
LyBUaGUgc3RhdGUgb2YgdGhlIHBhZ2UgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgYWZ0ZXIgdGhp
cyByZXR1cm5zIChvciBldmVuCisgIC8vIGJlZm9yZSkuIFRoZSBQcm9kdWNlciBzaG91bGQgdXNl
IHRoaXMgb25seSBhcyBhIGhpbnQgdG8gZGVjaWRlIG91dCB3aGV0aGVyCisgIC8vIGl0IHNob3Vs
ZCBUcnlQYXJ0aXRpb25QYWdlKCkgb3IgYWNxdWlyZSBhbiBpbmRpdmlkdWFsIGNodW5rLgorICBi
b29sIGlzX3BhZ2VfZnJlZShzaXplX3QgcGFnZV9pZHgpIHsKKyAgICByZXR1cm4gcGFnZV9oZWFk
ZXIocGFnZV9pZHgpLT5sYXlvdXQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSA9PSAw
OworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBjaHVua3MgaW4gdGhlIHBhZ2UgYXJl
IGtDaHVua0NvbXBsZXRlLiBBcyBhYm92ZSwgdGhpcworICAvLyBpcyBhZHZpc29yeSBvbmx5LiBU
aGUgU2VydmljZSBpcyBzdXBwb3NlZCB0byB1c2UgdGhpcyBvbmx5IHRvIGRlY2lkZQorICAvLyB3
aGV0aGVyIHRvIFRyeUFjcXVpcmVBbGxDaHVua3NGb3JSZWFkaW5nKCkgb3Igbm90LgorICBib29s
IGlzX3BhZ2VfY29tcGxldGUoc2l6ZV90IHBhZ2VfaWR4KSB7CisgICAgYXV0byBsYXlvdXQgPSBw
YWdlX2hlYWRlcihwYWdlX2lkeCktPmxheW91dC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4
ZWQpOworICAgIGNvbnN0IHVpbnQzMl90IG51bV9jaHVua3MgPSBHZXROdW1DaHVua3NGb3JMYXlv
dXQobGF5b3V0KTsKKyAgICBpZiAobnVtX2NodW5rcyA9PSAwKQorICAgICAgcmV0dXJuIGZhbHNl
OyAgLy8gTm9uIHBhcnRpdGlvbmVkIHBhZ2VzIGNhbm5vdCBiZSBjb21wbGV0ZS4KKyAgICByZXR1
cm4gKGxheW91dCAmIGtBbGxDaHVua3NNYXNrKSA9PQorICAgICAgICAgICAoa0FsbENodW5rc0Nv
bXBsZXRlICYgKCgxIDw8IChudW1fY2h1bmtzICoga0NodW5rU2hpZnQpKSAtIDEpKTsKKyAgfQor
CisgIC8vIEZvciB0ZXN0aW5nIC8gZGVidWdnaW5nIG9ubHkuCisgIHN0ZDo6c3RyaW5nIHBhZ2Vf
aGVhZGVyX2RiZyhzaXplX3QgcGFnZV9pZHgpIHsKKyAgICB1aW50MzJfdCB4ID0gcGFnZV9oZWFk
ZXIocGFnZV9pZHgpLT5sYXlvdXQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAg
ICByZXR1cm4gc3RkOjpiaXRzZXQ8MzI+KHgpLnRvX3N0cmluZygpOworICB9CisKKyAgLy8gUmV0
dXJucyB0aGUgcGFnZSBsYXlvdXQsIHdoaWNoIGlzIGEgYml0bWFwIHRoYXQgc3BlY2lmaWVzIHRo
ZSBjaHVua2luZworICAvLyBsYXlvdXQgb2YgdGhlIHBhZ2UgYW5kIGVhY2ggY2h1bmsncyBjdXJy
ZW50IHN0YXRlLiBSZWFkcyB3aXRoIGFuCisgIC8vIGFjcXVpcmUtbG9hZCBzZW1hbnRpYyB0byBl
bnN1cmUgYSBwcm9kdWNlcidzIHdyaXRlcyBjb3JyZXNwb25kaW5nIHRvIGFuCisgIC8vIHVwZGF0
ZSBvZiB0aGUgbGF5b3V0IChlLmcuIGNsZWFyaW5nIGEgY2h1bmsncyBoZWFkZXIpIGFyZSBvYnNl
cnZlZAorICAvLyBjb25zaXN0ZW50bHkuCisgIHVpbnQzMl90IEdldFBhZ2VMYXlvdXQoc2l6ZV90
IHBhZ2VfaWR4KSB7CisgICAgcmV0dXJuIHBhZ2VfaGVhZGVyKHBhZ2VfaWR4KS0+bGF5b3V0Lmxv
YWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgIH0KKworICAvLyBSZXR1cm5zIGEgYml0
bWFwIGluIHdoaWNoIGVhY2ggYml0IGlzIHNldCBpZiB0aGUgY29ycmVzcG9uZGluZyBDaHVuayBl
eGlzdHMKKyAgLy8gaW4gdGhlIHBhZ2UgKGFjY29yZGluZyB0byB0aGUgcGFnZSBsYXlvdXQpIGFu
ZCBpcyBmcmVlLiBJZiB0aGUgcGFnZSBpcyBub3QKKyAgLy8gcGFydGl0aW9uZWQgaXQgcmV0dXJu
cyAwIChhcyBpZiB0aGUgcGFnZSBoYWQgbm8gZnJlZSBjaHVua3MpLgorICB1aW50MzJfdCBHZXRG
cmVlQ2h1bmtzKHNpemVfdCBwYWdlX2lkeCk7CisKKyAgLy8gVHJpZXMgdG8gYXRvbWljYWxseSBw
YXJ0aXRpb24gYSBwYWdlIHdpdGggdGhlIGdpdmVuIHxsYXlvdXR8LiBSZXR1cm5zIHRydWUKKyAg
Ly8gaWYgdGhlIHBhZ2Ugd2FzIGZyZWUgYW5kIGhhcyBiZWVuIHBhcnRpdGlvbmVkIHdpdGggdGhl
IGdpdmVuIHxsYXlvdXR8LAorICAvLyBmYWxzZSBpZiB0aGUgcGFnZSB3YXNuJ3QgZnJlZSBhbnlt
b3JlIGJ5IHRoZSB0aW1lIHdlIGdvdCB0aGVyZS4KKyAgLy8gSWYgc3VjY2VlZHMgYWxsIHRoZSBj
aHVua3MgYXJlIGF0b21pY2FsbHkgc2V0IGluIHRoZSBrQ2h1bmtGcmVlIHN0YXRlLgorICBib29s
IFRyeVBhcnRpdGlvblBhZ2Uoc2l6ZV90IHBhZ2VfaWR4LCBQYWdlTGF5b3V0IGxheW91dCk7CisK
KyAgLy8gVHJpZXMgdG8gYXRvbWljYWxseSBtYXJrIGEgc2luZ2xlIGNodW5rIHdpdGhpbiB0aGUg
cGFnZSBhcworICAvLyBrQ2h1bmtCZWluZ1dyaXR0ZW4uIFJldHVybnMgYW4gaW52YWxpZCBjaHVu
ayBpZiB0aGUgcGFnZSBpcyBub3QgcGFydGl0aW9uZWQKKyAgLy8gb3IgdGhlIGNodW5rIGlzIG5v
dCBpbiB0aGUga0NodW5rRnJlZSBzdGF0ZS4gSWYgc3VjY2VlZHMgc2V0cyB0aGUgY2h1bmsKKyAg
Ly8gaGVhZGVyIHRvIHxoZWFkZXJ8LgorICBDaHVuayBUcnlBY3F1aXJlQ2h1bmtGb3JXcml0aW5n
KHNpemVfdCBwYWdlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
X3QgY2h1bmtfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENo
dW5rSGVhZGVyKiBoZWFkZXIpIHsKKyAgICByZXR1cm4gVHJ5QWNxdWlyZUNodW5rKHBhZ2VfaWR4
LCBjaHVua19pZHgsIGtDaHVua0JlaW5nV3JpdHRlbiwgaGVhZGVyKTsKKyAgfQorCisgIC8vIFNp
bWlsYXIgdG8gVHJ5QWNxdWlyZUNodW5rRm9yV3JpdGluZy4gRmFpbHMgaWYgdGhlIGNodW5rIGlz
bid0IGluIHRoZQorICAvLyBrQ2h1bmtDb21wbGV0ZSBzdGF0ZS4KKyAgQ2h1bmsgVHJ5QWNxdWly
ZUNodW5rRm9yUmVhZGluZyhzaXplX3QgcGFnZV9pZHgsIHNpemVfdCBjaHVua19pZHgpIHsKKyAg
ICByZXR1cm4gVHJ5QWNxdWlyZUNodW5rKHBhZ2VfaWR4LCBjaHVua19pZHgsIGtDaHVua0JlaW5n
UmVhZCwgbnVsbHB0cik7CisgIH0KKworICAvLyBUaGUgY2FsbGVyIG11c3QgaGF2ZSBzdWNjZXNz
ZnVsbHkgVHJ5QWNxdWlyZUFsbENodW5rc0ZvclJlYWRpbmcoKS4KKyAgQ2h1bmsgR2V0Q2h1bmtV
bmNoZWNrZWQoc2l6ZV90IHBhZ2VfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50
MzJfdCBwYWdlX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNodW5r
X2lkeCk7CisKKyAgLy8gUHV0cyBhIGNodW5rIGludG8gdGhlIGtDaHVua0NvbXBsZXRlIHN0YXRl
LiBSZXR1cm5zIHRoZSBwYWdlIGluZGV4LgorICBzaXplX3QgUmVsZWFzZUNodW5rQXNDb21wbGV0
ZShDaHVuayBjaHVuaykgeworICAgIHJldHVybiBSZWxlYXNlQ2h1bmsoc3RkOjptb3ZlKGNodW5r
KSwga0NodW5rQ29tcGxldGUpOworICB9CisKKyAgLy8gUHV0cyBhIGNodW5rIGludG8gdGhlIGtD
aHVua0ZyZWUgc3RhdGUuIFJldHVybnMgdGhlIHBhZ2UgaW5kZXguCisgIHNpemVfdCBSZWxlYXNl
Q2h1bmtBc0ZyZWUoQ2h1bmsgY2h1bmspIHsKKyAgICByZXR1cm4gUmVsZWFzZUNodW5rKHN0ZDo6
bW92ZShjaHVuayksIGtDaHVua0ZyZWUpOworICB9CisKKyAgQ2h1bmtTdGF0ZSBHZXRDaHVua1N0
YXRlKHNpemVfdCBwYWdlX2lkeCwgc2l6ZV90IGNodW5rX2lkeCkgeworICAgIFBhZ2VIZWFkZXIq
IHBoZHIgPSBwYWdlX2hlYWRlcihwYWdlX2lkeCk7CisgICAgdWludDMyX3QgbGF5b3V0ID0gcGhk
ci0+bGF5b3V0LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIEdl
dENodW5rU3RhdGVGcm9tTGF5b3V0KGxheW91dCwgY2h1bmtfaWR4KTsKKyAgfQorCisgIHN0ZDo6
cGFpcjxzaXplX3QsIHNpemVfdD4gR2V0UGFnZUFuZENodW5rSW5kZXgoY29uc3QgQ2h1bmsmIGNo
dW5rKTsKKworICB1aW50MTZfdCBHZXRDaHVua1NpemVGb3JMYXlvdXQodWludDMyX3QgcGFnZV9s
YXlvdXQpIGNvbnN0IHsKKyAgICByZXR1cm4gY2h1bmtfc2l6ZXNfWyhwYWdlX2xheW91dCAmIGtM
YXlvdXRNYXNrKSA+PiBrTGF5b3V0U2hpZnRdOworICB9CisKKyAgc3RhdGljIENodW5rU3RhdGUg
R2V0Q2h1bmtTdGF0ZUZyb21MYXlvdXQodWludDMyX3QgcGFnZV9sYXlvdXQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaHVua19pZHgpIHsKKyAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2h1bmtTdGF0ZT4oKHBhZ2VfbGF5b3V0ID4+IChjaHVua19p
ZHggKiBrQ2h1bmtTaGlmdCkpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
a0NodW5rTWFzayk7CisgIH0KKworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IEdldE51bUNo
dW5rc0ZvckxheW91dCh1aW50MzJfdCBwYWdlX2xheW91dCkgeworICAgIHJldHVybiBrTnVtQ2h1
bmtzRm9yTGF5b3V0WyhwYWdlX2xheW91dCAmIGtMYXlvdXRNYXNrKSA+PiBrTGF5b3V0U2hpZnRd
OworICB9CisKKyAgLy8gUmV0dXJucyBhIGJpdG1hcCBpbiB3aGljaCBlYWNoIGJpdCBpcyBzZXQg
aWYgdGhlIGNvcnJlc3BvbmRpbmcgQ2h1bmsgZXhpc3RzCisgIC8vIGluIHRoZSBwYWdlIChhY2Nv
cmRpbmcgdG8gdGhlIHBhZ2UgbGF5b3V0KSBhbmQgaXMgbm90IGZyZWUuIElmIHRoZSBwYWdlIGlz
CisgIC8vIG5vdCBwYXJ0aXRpb25lZCBpdCByZXR1cm5zIDAgKGFzIGlmIHRoZSBwYWdlIGhhZCBu
byB1c2VkIGNodW5rcykuIEJpdCBOCisgIC8vIGNvcnJlc3BvbmRzIHRvIENodW5rIE4uCisgIHN0
YXRpYyB1aW50MzJfdCBHZXRVc2VkQ2h1bmtzKHVpbnQzMl90IHBhZ2VfbGF5b3V0KSB7CisgICAg
Y29uc3QgdWludDMyX3QgbnVtX2NodW5rcyA9IEdldE51bUNodW5rc0ZvckxheW91dChwYWdlX2xh
eW91dCk7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBp
IDwgbnVtX2NodW5rczsgaSsrKSB7CisgICAgICByZXMgfD0gKChwYWdlX2xheW91dCAmIGtDaHVu
a01hc2spICE9IGtDaHVua0ZyZWUpID8gKDEgPDwgaSkgOiAwOworICAgICAgcGFnZV9sYXlvdXQg
Pj49IGtDaHVua1NoaWZ0OworICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9CisKKyBwcml2YXRl
OgorICBTaGFyZWRNZW1vcnlBQkkoY29uc3QgU2hhcmVkTWVtb3J5QUJJJikgPSBkZWxldGU7Cisg
IFNoYXJlZE1lbW9yeUFCSSYgb3BlcmF0b3I9KGNvbnN0IFNoYXJlZE1lbW9yeUFCSSYpID0gZGVs
ZXRlOworCisgIENodW5rIFRyeUFjcXVpcmVDaHVuayhzaXplX3QgcGFnZV9pZHgsCisgICAgICAg
ICAgICAgICAgICAgICAgICBzaXplX3QgY2h1bmtfaWR4LAorICAgICAgICAgICAgICAgICAgICAg
ICAgQ2h1bmtTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENodW5rSGVhZGVy
Kik7CisgIHNpemVfdCBSZWxlYXNlQ2h1bmsoQ2h1bmsgY2h1bmssIENodW5rU3RhdGUpOworCisg
IHVpbnQ4X3QqIHN0YXJ0XyA9IG51bGxwdHI7CisgIHNpemVfdCBzaXplXyA9IDA7CisgIHNpemVf
dCBwYWdlX3NpemVfID0gMDsKKyAgc2l6ZV90IG51bV9wYWdlc18gPSAwOworICBzdGQ6OmFycmF5
PHVpbnQxNl90LCBrTnVtUGFnZUxheW91dHM+IGNodW5rX3NpemVzXzsKK307CisKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJ
TkdfQ09SRV9TSEFSRURfTUVNT1JZX0FCSV9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBU
aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhl
IEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5
IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgKiBMaWNl
bnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAg
IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVz
cyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAq
IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9u
IGFuICJBUworICogSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBP
RiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5z
ZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3NoYXJlZF9tZW1v
cnlfYWJpLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9iYXNlL3RpbWUuaCIKKworI2lmICFQRVJGRVRUT19CVUlMREZMQUco
UEVSRkVUVE9fT1NfV0lOKQorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdXRpbHMu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90
cmFjaW5nL2NvcmUvYmFzaWNfdHlwZXMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworbmFt
ZXNwYWNlIHsKKworY29uc3RleHByIGludCBrUmV0cnlBdHRlbXB0cyA9IDY0OworCitpbmxpbmUg
dm9pZCBXYWl0QmVmb3JlTmV4dEF0dGVtcHQoaW50IGF0dGVtcHQpIHsKKyAgaWYgKGF0dGVtcHQg
PCBrUmV0cnlBdHRlbXB0cyAvIDIpIHsKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOwor
ICB9IGVsc2UgeworICAgIGJhc2U6OlNsZWVwTWljcm9zZWNvbmRzKCh1bnNpZ25lZChhdHRlbXB0
KSAvIDEwKSAqIDEwMDApOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGxhcmdlc3QgNC1ieXRl
cyBhbGlnbmVkIGNodW5rIHNpemUgPD0gfHBhZ2Vfc2l6ZXwgLyB8ZGl2aWRlcnwKKy8vIGZvciBl
YWNoIGRpdmlkZXIgaW4gUGFnZUxheW91dC4KK2NvbnN0ZXhwciBzaXplX3QgR2V0Q2h1bmtTaXpl
KHNpemVfdCBwYWdlX3NpemUsIHNpemVfdCBkaXZpZGVyKSB7CisgIHJldHVybiAoKHBhZ2Vfc2l6
ZSAtIHNpemVvZihTaGFyZWRNZW1vcnlBQkk6OlBhZ2VIZWFkZXIpKSAvIGRpdmlkZXIpICYgfjNV
TDsKK30KKworLy8gSW5pdGlhbGl6ZXIgZm9yIHRoZSBjb25zdCB8Y2h1bmtfc2l6ZXNffCBhcnJh
eS4KK3N0ZDo6YXJyYXk8dWludDE2X3QsIFNoYXJlZE1lbW9yeUFCSTo6a051bVBhZ2VMYXlvdXRz
PiBJbml0Q2h1bmtTaXplcygKKyAgICBzaXplX3QgcGFnZV9zaXplKSB7CisgIHN0YXRpY19hc3Nl
cnQoU2hhcmVkTWVtb3J5QUJJOjprTnVtUGFnZUxheW91dHMgPT0KKyAgICAgICAgICAgICAgICAg
ICAgYmFzZTo6QXJyYXlTaXplKFNoYXJlZE1lbW9yeUFCSTo6a051bUNodW5rc0ZvckxheW91dCks
CisgICAgICAgICAgICAgICAgImtOdW1QYWdlTGF5b3V0cyBvdXQgb2YgZGF0ZSIpOworICBzdGQ6
OmFycmF5PHVpbnQxNl90LCBTaGFyZWRNZW1vcnlBQkk6OmtOdW1QYWdlTGF5b3V0cz4gcmVzID0g
e307CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgU2hhcmVkTWVtb3J5QUJJOjprTnVtUGFnZUxh
eW91dHM7IGkrKykgeworICAgIHNpemVfdCBudW1fY2h1bmtzID0gU2hhcmVkTWVtb3J5QUJJOjpr
TnVtQ2h1bmtzRm9yTGF5b3V0W2ldOworICAgIHNpemVfdCBzaXplID0gbnVtX2NodW5rcyA9PSAw
ID8gMCA6IEdldENodW5rU2l6ZShwYWdlX3NpemUsIG51bV9jaHVua3MpOworICAgIFBFUkZFVFRP
X0NIRUNLKHNpemUgPD0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpKTsKKyAg
ICByZXNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc2l6ZSk7CisgIH0KKyAgcmV0dXJuIHJl
czsKK30KKworaW5saW5lIHZvaWQgQ2xlYXJDaHVua0hlYWRlcihTaGFyZWRNZW1vcnlBQkk6OkNo
dW5rSGVhZGVyKiBoZWFkZXIpIHsKKyAgaGVhZGVyLT53cml0ZXJfaWQuc3RvcmUoMHUsIHN0ZDo6
bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBoZWFkZXItPmNodW5rX2lkLnN0b3JlKDB1LCBzdGQ6
Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgaGVhZGVyLT5wYWNrZXRzLnN0b3JlKHt9LCBzdGQ6
Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRp
YworY29uc3RleHByIHVpbnQzMl90IFNoYXJlZE1lbW9yeUFCSTo6a051bUNodW5rc0ZvckxheW91
dFtdOworY29uc3RleHByIGNvbnN0IGNoYXIqIFNoYXJlZE1lbW9yeUFCSTo6a0NodW5rU3RhdGVT
dHJbXTsKK2NvbnN0ZXhwciBjb25zdCBzaXplX3QgU2hhcmVkTWVtb3J5QUJJOjprSW52YWxpZFBh
Z2VJZHg7Citjb25zdGV4cHIgY29uc3Qgc2l6ZV90IFNoYXJlZE1lbW9yeUFCSTo6a01heFBhZ2VT
aXplOworY29uc3RleHByIGNvbnN0IHNpemVfdCBTaGFyZWRNZW1vcnlBQkk6OmtQYWNrZXRTaXpl
RHJvcFBhY2tldDsKKworU2hhcmVkTWVtb3J5QUJJOjpTaGFyZWRNZW1vcnlBQkkoKSA9IGRlZmF1
bHQ7CisKK1NoYXJlZE1lbW9yeUFCSTo6U2hhcmVkTWVtb3J5QUJJKHVpbnQ4X3QqIHN0YXJ0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFnZV9zaXplKSB7CisgIEluaXRpYWxpemUo
c3RhcnQsIHNpemUsIHBhZ2Vfc2l6ZSk7Cit9CisKK3ZvaWQgU2hhcmVkTWVtb3J5QUJJOjpJbml0
aWFsaXplKHVpbnQ4X3QqIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFn
ZV9zaXplKSB7CisgIHN0YXJ0XyA9IHN0YXJ0OworICBzaXplXyA9IHNpemU7CisgIHBhZ2Vfc2l6
ZV8gPSBwYWdlX3NpemU7CisgIG51bV9wYWdlc18gPSBzaXplIC8gcGFnZV9zaXplOworICBjaHVu
a19zaXplc18gPSBJbml0Q2h1bmtTaXplcyhwYWdlX3NpemUpOworICBzdGF0aWNfYXNzZXJ0KHNp
emVvZihQYWdlSGVhZGVyKSA9PSA4LCAiUGFnZUhlYWRlciBzaXplIik7CisgIHN0YXRpY19hc3Nl
cnQoc2l6ZW9mKENodW5rSGVhZGVyKSA9PSA4LCAiQ2h1bmtIZWFkZXIgc2l6ZSIpOworICBzdGF0
aWNfYXNzZXJ0KHNpemVvZihDaHVua0hlYWRlcjo6Y2h1bmtfaWQpID09IHNpemVvZihDaHVua0lE
KSwKKyAgICAgICAgICAgICAgICAiQ2h1bmtJRCBzaXplIik7CisKKyAgc3RhdGljX2Fzc2VydChz
aXplb2YoQ2h1bmtIZWFkZXI6OlBhY2tldHMpID09IDIsICJDaHVua0hlYWRlcjo6UGFja2V0cyBz
aXplIik7CisgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihDaHVua0hlYWRlcikgPT0ga0NodW5rQWxp
Z25tZW50LAorICAgICAgICAgICAgICAgICJDaHVua0hlYWRlciBhbGlnbm1lbnQiKTsKKworICAv
LyBJbiB0aGVvcnkgc3RkOjphdG9taWMgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIHVuZGVy
bHlpbmcgdHlwZQorICAvLyBjb25zaXN0cyBvbmx5IG9mIHRoZSBhY3R1YWwgYXRvbWljIHdvcmQu
IFRoZW9yZXRpY2FsbHkgaXQgY291bGQgaGF2ZQorICAvLyBsb2NrcyBvciBvdGhlciBzdGF0ZS4g
SW4gcHJhY3RpY2UgbW9zdCBpbXBsZW1lbnRhdGlvbnMganVzdCBpbXBsZW1lbnQKKyAgLy8gdGhl
bSB3aXRob3V0IGV4dHJhIHN0YXRlLiBUaGUgY29kZSBiZWxvdyBvdmVybGF5cyB0aGUgYXRvbWlj
IGludG8gdGhlCisgIC8vIFNNQiwgaGVuY2UgcmVsaWVzIG9uIHRoaXMgaW1wbGVtZW50YXRpb24g
ZGV0YWlsLiBUaGlzIHNob3VsZCBiZSBmaW5lCisgIC8vIHByYWdtYXRpY2FsbHkgKENocm9tZSdz
IGJhc2UgbWFrZXMgdGhlIHNhbWUgYXNzdW1wdGlvbiksIGJ1dCBsZXQncyBoYXZlIGEKKyAgLy8g
Y2hlY2sgZm9yIHRoaXMuCisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHN0ZDo6YXRvbWljPHVpbnQz
Ml90PikgPT0gc2l6ZW9mKHVpbnQzMl90KSAmJgorICAgICAgICAgICAgICAgICAgICBzaXplb2Yo
c3RkOjphdG9taWM8dWludDE2X3Q+KSA9PSBzaXplb2YodWludDE2X3QpLAorICAgICAgICAgICAg
ICAgICJJbmNvbXBhdGlibGUgU1RMIDxhdG9taWM+IGltcGxlbWVudGF0aW9uIik7CisKKyAgLy8g
Q2hlYyB0aGF0IHRoZSBrQWxsQ2h1bmtzKENvbXBsZXRlLEZyZWUpIGFyZSBjb25zaXN0ZW50IHdp
dGggdGhlCisgIC8vIENodW5rU3RhdGUgZW51bSB2YWx1ZXMuCisKKyAgLy8gVGhlc2UgbXVzdCBi
ZSB6ZXJvIGJlY2F1c2UgcmVseSBvbiB6ZXJvLWluaXRpYWxpemVkIG1lbW9yeSBiZWluZworICAv
LyBpbnRlcnByZXRlZCBhcyAiZnJlZSIuCisgIHN0YXRpY19hc3NlcnQoa0NodW5rRnJlZSA9PSAw
ICYmIGtBbGxDaHVua3NGcmVlID09IDAsCisgICAgICAgICAgICAgICAgImtDaHVua0ZyZWUva0Fs
bENodW5rc0ZyZWUgYW5kIG11c3QgYmUgMCIpOworCisgIHN0YXRpY19hc3NlcnQoKGtBbGxDaHVu
a3NDb21wbGV0ZSAmIGtDaHVua01hc2spID09IGtDaHVua0NvbXBsZXRlLAorICAgICAgICAgICAg
ICAgICJrQWxsQ2h1bmtzQ29tcGxldGUgb3V0IG9mIHN5bmMgd2l0aCBrQ2h1bmtDb21wbGV0ZSIp
OworCisgIC8vIFNhbml0eSBjaGVjayB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGtNYXguLi4gY29u
c3RhbnRzLgorICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDaHVua0hlYWRlcjo6d3JpdGVyX2lkKSA9
PSBzaXplb2YoV3JpdGVySUQpLAorICAgICAgICAgICAgICAgICJXcml0ZXJJRCBzaXplIik7Cisg
IENodW5rSGVhZGVyIGNodW5rX2hlYWRlcnt9OworICBjaHVua19oZWFkZXIuY2h1bmtfaWQuc3Rv
cmUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKSk7CisgIFBFUkZFVFRPX0NIRUNLKGNodW5rX2hl
YWRlci5jaHVua19pZC5sb2FkKCkgPT0ga01heENodW5rSUQpOworCisgIGNodW5rX2hlYWRlci53
cml0ZXJfaWQuc3RvcmUoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KC0xKSk7CisgIFBFUkZFVFRPX0NI
RUNLKGtNYXhXcml0ZXJJRCA8PSBjaHVua19oZWFkZXIud3JpdGVyX2lkLmxvYWQoKSk7CisKKyAg
UEVSRkVUVE9fQ0hFQ0socGFnZV9zaXplID49IGJhc2U6OmtQYWdlU2l6ZSk7CisgIFBFUkZFVFRP
X0NIRUNLKHBhZ2Vfc2l6ZSA8PSBrTWF4UGFnZVNpemUpOworICBQRVJGRVRUT19DSEVDSyhwYWdl
X3NpemUgJSBiYXNlOjprUGFnZVNpemUgPT0gMCk7CisgIFBFUkZFVFRPX0NIRUNLKHJlaW50ZXJw
cmV0X2Nhc3Q8dWludHB0cl90PihzdGFydCkgJSBiYXNlOjprUGFnZVNpemUgPT0gMCk7CisgIFBF
UkZFVFRPX0NIRUNLKHNpemUgJSBwYWdlX3NpemUgPT0gMCk7Cit9CisKK1NoYXJlZE1lbW9yeUFC
STo6Q2h1bmsgU2hhcmVkTWVtb3J5QUJJOjpHZXRDaHVua1VuY2hlY2tlZChzaXplX3QgcGFnZV9p
ZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdWludDMyX3QgcGFnZV9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNodW5rX2lkeCkgeworICBjb25z
dCBzaXplX3QgbnVtX2NodW5rcyA9IEdldE51bUNodW5rc0ZvckxheW91dChwYWdlX2xheW91dCk7
CisgIFBFUkZFVFRPX0RDSEVDSyhjaHVua19pZHggPCBudW1fY2h1bmtzKTsKKyAgLy8gQ29tcHV0
ZSB0aGUgY2h1bmsgdmlydHVhbCBhZGRyZXNzIGFuZCB3cml0ZSBpdCBpbnRvIHxjaHVua3wuCisg
IGNvbnN0IHVpbnQxNl90IGNodW5rX3NpemUgPSBHZXRDaHVua1NpemVGb3JMYXlvdXQocGFnZV9s
YXlvdXQpOworICBzaXplX3QgY2h1bmtfb2Zmc2V0X2luX3BhZ2UgPSBzaXplb2YoUGFnZUhlYWRl
cikgKyBjaHVua19pZHggKiBjaHVua19zaXplOworCisgIENodW5rIGNodW5rKHBhZ2Vfc3RhcnQo
cGFnZV9pZHgpICsgY2h1bmtfb2Zmc2V0X2luX3BhZ2UsIGNodW5rX3NpemUsCisgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNodW5rX2lkeCkpOworICBQRVJGRVRUT19EQ0hFQ0so
Y2h1bmsuZW5kKCkgPD0gZW5kKCkpOworICByZXR1cm4gY2h1bms7Cit9CisKK1NoYXJlZE1lbW9y
eUFCSTo6Q2h1bmsgU2hhcmVkTWVtb3J5QUJJOjpUcnlBY3F1aXJlQ2h1bmsoCisgICAgc2l6ZV90
IHBhZ2VfaWR4LAorICAgIHNpemVfdCBjaHVua19pZHgsCisgICAgQ2h1bmtTdGF0ZSBkZXNpcmVk
X2NodW5rX3N0YXRlLAorICAgIGNvbnN0IENodW5rSGVhZGVyKiBoZWFkZXIpIHsKKyAgUEVSRkVU
VE9fRENIRUNLKGRlc2lyZWRfY2h1bmtfc3RhdGUgPT0ga0NodW5rQmVpbmdSZWFkIHx8CisgICAg
ICAgICAgICAgICAgICBkZXNpcmVkX2NodW5rX3N0YXRlID09IGtDaHVua0JlaW5nV3JpdHRlbik7
CisgIFBhZ2VIZWFkZXIqIHBoZHIgPSBwYWdlX2hlYWRlcihwYWdlX2lkeCk7CisgIGZvciAoaW50
IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwga1JldHJ5QXR0ZW1wdHM7IGF0dGVtcHQrKykgeworICAg
IHVpbnQzMl90IGxheW91dCA9IHBoZHItPmxheW91dC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2Fj
cXVpcmUpOworICAgIGNvbnN0IHNpemVfdCBudW1fY2h1bmtzID0gR2V0TnVtQ2h1bmtzRm9yTGF5
b3V0KGxheW91dCk7CisKKyAgICAvLyBUaGUgcGFnZSBsYXlvdXQgaGFzIGNoYW5nZWQgKG9yIHRo
ZSBwYWdlIGlzIGZyZWUpLgorICAgIGlmIChjaHVua19pZHggPj0gbnVtX2NodW5rcykKKyAgICAg
IHJldHVybiBDaHVuaygpOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNodW5rIGlzIHN0aWxs
IGluIGEgc3RhdGUgdGhhdCBhbGxvd3MgdGhlIHRyYW5zaXRpb24gdG8KKyAgICAvLyB8ZGVzaXJl
ZF9jaHVua19zdGF0ZXwuIFRoZSBvbmx5IGFsbG93ZWQgdHJhbnNpdGlvbnMgYXJlOgorICAgIC8v
IDEuIGtDaHVua0ZyZWUgLT4ga0NodW5rQmVpbmdXcml0dGVuIChQcm9kdWNlcikuCisgICAgLy8g
Mi4ga0NodW5rQ29tcGxldGUgLT4ga0NodW5rQmVpbmdSZWFkIChTZXJ2aWNlKS4KKyAgICBDaHVu
a1N0YXRlIGV4cGVjdGVkX2NodW5rX3N0YXRlID0KKyAgICAgICAgZGVzaXJlZF9jaHVua19zdGF0
ZSA9PSBrQ2h1bmtCZWluZ1dyaXR0ZW4gPyBrQ2h1bmtGcmVlIDoga0NodW5rQ29tcGxldGU7Cisg
ICAgYXV0byBjdXJfY2h1bmtfc3RhdGUgPSAobGF5b3V0ID4+IChjaHVua19pZHggKiBrQ2h1bmtT
aGlmdCkpICYga0NodW5rTWFzazsKKyAgICBpZiAoY3VyX2NodW5rX3N0YXRlICE9IGV4cGVjdGVk
X2NodW5rX3N0YXRlKQorICAgICAgcmV0dXJuIENodW5rKCk7CisKKyAgICB1aW50MzJfdCBuZXh0
X2xheW91dCA9IGxheW91dDsKKyAgICBuZXh0X2xheW91dCAmPSB+KGtDaHVua01hc2sgPDwgKGNo
dW5rX2lkeCAqIGtDaHVua1NoaWZ0KSk7CisgICAgbmV4dF9sYXlvdXQgfD0gKGRlc2lyZWRfY2h1
bmtfc3RhdGUgPDwgKGNodW5rX2lkeCAqIGtDaHVua1NoaWZ0KSk7CisgICAgaWYgKHBoZHItPmxh
eW91dC5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhsYXlvdXQsIG5leHRfbGF5b3V0LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJf
YWNxX3JlbCkpIHsKKyAgICAgIC8vIENvbXB1dGUgdGhlIGNodW5rIHZpcnR1YWwgYWRkcmVzcyBh
bmQgd3JpdGUgaXQgaW50byB8Y2h1bmt8LgorICAgICAgQ2h1bmsgY2h1bmsgPSBHZXRDaHVua1Vu
Y2hlY2tlZChwYWdlX2lkeCwgbGF5b3V0LCBjaHVua19pZHgpOworICAgICAgaWYgKGRlc2lyZWRf
Y2h1bmtfc3RhdGUgPT0ga0NodW5rQmVpbmdXcml0dGVuKSB7CisgICAgICAgIFBFUkZFVFRPX0RD
SEVDSyhoZWFkZXIpOworICAgICAgICBDaHVua0hlYWRlciogbmV3X2hlYWRlciA9IGNodW5rLmhl
YWRlcigpOworICAgICAgICBuZXdfaGVhZGVyLT53cml0ZXJfaWQuc3RvcmUoaGVhZGVyLT53cml0
ZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9v
cmRlcl9yZWxheGVkKTsKKyAgICAgICAgbmV3X2hlYWRlci0+Y2h1bmtfaWQuc3RvcmUoaGVhZGVy
LT5jaHVua19pZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIG5ld19oZWFk
ZXItPnBhY2tldHMuc3RvcmUoaGVhZGVyLT5wYWNrZXRzLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxl
YXNlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjaHVuazsKKyAgICB9CisgICAgV2FpdEJlZm9y
ZU5leHRBdHRlbXB0KGF0dGVtcHQpOworICB9CisgIHJldHVybiBDaHVuaygpOyAgLy8gQWxsIG91
ciBhdHRlbXB0cyBmYWlsZWQuCit9CisKK2Jvb2wgU2hhcmVkTWVtb3J5QUJJOjpUcnlQYXJ0aXRp
b25QYWdlKHNpemVfdCBwYWdlX2lkeCwgUGFnZUxheW91dCBsYXlvdXQpIHsKKyAgUEVSRkVUVE9f
RENIRUNLKGxheW91dCA+PSBrUGFnZURpdjEgJiYgbGF5b3V0IDw9IGtQYWdlRGl2MTQpOworICB1
aW50MzJfdCBleHBlY3RlZF9sYXlvdXQgPSAwOyAgLy8gRnJlZSBwYWdlLgorICB1aW50MzJfdCBu
ZXh0X2xheW91dCA9IChsYXlvdXQgPDwga0xheW91dFNoaWZ0KSAmIGtMYXlvdXRNYXNrOworICBQ
YWdlSGVhZGVyKiBwaGRyID0gcGFnZV9oZWFkZXIocGFnZV9pZHgpOworICBpZiAoIXBoZHItPmxh
eW91dC5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhleHBlY3RlZF9sYXlvdXQsIG5leHRfbGF5b3V0
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9y
eV9vcmRlcl9hY3FfcmVsKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1
ZTsKK30KKwordWludDMyX3QgU2hhcmVkTWVtb3J5QUJJOjpHZXRGcmVlQ2h1bmtzKHNpemVfdCBw
YWdlX2lkeCkgeworICB1aW50MzJfdCBsYXlvdXQgPQorICAgICAgcGFnZV9oZWFkZXIocGFnZV9p
ZHgpLT5sYXlvdXQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgY29uc3QgdWlu
dDMyX3QgbnVtX2NodW5rcyA9IEdldE51bUNodW5rc0ZvckxheW91dChsYXlvdXQpOworICB1aW50
MzJfdCByZXMgPSAwOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX2NodW5rczsgaSsr
KSB7CisgICAgcmVzIHw9ICgobGF5b3V0ICYga0NodW5rTWFzaykgPT0ga0NodW5rRnJlZSkgPyAo
MSA8PCBpKSA6IDA7CisgICAgbGF5b3V0ID4+PSBrQ2h1bmtTaGlmdDsKKyAgfQorICByZXR1cm4g
cmVzOworfQorCitzaXplX3QgU2hhcmVkTWVtb3J5QUJJOjpSZWxlYXNlQ2h1bmsoQ2h1bmsgY2h1
bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtTdGF0ZSBkZXNp
cmVkX2NodW5rX3N0YXRlKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhkZXNpcmVkX2NodW5rX3N0YXRl
ID09IGtDaHVua0NvbXBsZXRlIHx8CisgICAgICAgICAgICAgICAgICBkZXNpcmVkX2NodW5rX3N0
YXRlID09IGtDaHVua0ZyZWUpOworCisgIHNpemVfdCBwYWdlX2lkeDsKKyAgc2l6ZV90IGNodW5r
X2lkeDsKKyAgc3RkOjp0aWUocGFnZV9pZHgsIGNodW5rX2lkeCkgPSBHZXRQYWdlQW5kQ2h1bmtJ
bmRleChjaHVuayk7CisKKyAgLy8gUmVzZXQgaGVhZGVyIGZpZWxkcywgc28gdGhhdCB0aGUgc2Vy
dmljZSBjYW4gaWRlbnRpZnkgd2hlbiB0aGUgY2h1bmsncworICAvLyBoZWFkZXIgaGFzIGJlZW4g
aW5pdGlhbGl6ZWQgYnkgdGhlIHByb2R1Y2VyLgorICBpZiAoZGVzaXJlZF9jaHVua19zdGF0ZSA9
PSBrQ2h1bmtGcmVlKQorICAgIENsZWFyQ2h1bmtIZWFkZXIoY2h1bmsuaGVhZGVyKCkpOworCisg
IGZvciAoaW50IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwga1JldHJ5QXR0ZW1wdHM7IGF0dGVtcHQr
KykgeworICAgIFBhZ2VIZWFkZXIqIHBoZHIgPSBwYWdlX2hlYWRlcihwYWdlX2lkeCk7CisgICAg
dWludDMyX3QgbGF5b3V0ID0gcGhkci0+bGF5b3V0LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVs
YXhlZCk7CisgICAgY29uc3Qgc2l6ZV90IHBhZ2VfY2h1bmtfc2l6ZSA9IEdldENodW5rU2l6ZUZv
ckxheW91dChsYXlvdXQpOworCisgICAgLy8gVE9ETyhwcmltaWFubyk6IHRoaXMgc2hvdWxkIG5v
dCBiZSBhIENIRUNLLCBiZWNhdXNlIGEgbWFsaWNpb3VzIHByb2R1Y2VyCisgICAgLy8gY291bGQg
Y3Jhc2ggdXMgYnkgcHV0dGluZyB0aGUgY2h1bmsgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBz
aG91bGQKKyAgICAvLyBncmFjZWZ1bGx5IGZhaWwuIEtlZXAgYSBDSEVDSyB1bnRpbCB0aGVuLgor
ICAgIFBFUkZFVFRPX0NIRUNLKGNodW5rLnNpemUoKSA9PSBwYWdlX2NodW5rX3NpemUpOworICAg
IGNvbnN0IHVpbnQzMl90IGNodW5rX3N0YXRlID0KKyAgICAgICAgKChsYXlvdXQgPj4gKGNodW5r
X2lkeCAqIGtDaHVua1NoaWZ0KSkgJiBrQ2h1bmtNYXNrKTsKKworICAgIC8vIFZlcmlmeSB0aGF0
IHRoZSBjaHVuayBpcyBzdGlsbCBpbiBhIHN0YXRlIHRoYXQgYWxsb3dzIHRoZSB0cmFuc2l0aW9u
IHRvCisgICAgLy8gfGRlc2lyZWRfY2h1bmtfc3RhdGV8LiBUaGUgb25seSBhbGxvd2VkIHRyYW5z
aXRpb25zIGFyZToKKyAgICAvLyAxLiBrQ2h1bmtCZWluZ1dyaXR0ZW4gLT4ga0NodW5rQ29tcGxl
dGUgKFByb2R1Y2VyKS4KKyAgICAvLyAyLiBrQ2h1bmtCZWluZ1JlYWQgLT4ga0NodW5rRnJlZSAo
U2VydmljZSkuCisgICAgQ2h1bmtTdGF0ZSBleHBlY3RlZF9jaHVua19zdGF0ZTsKKyAgICBpZiAo
ZGVzaXJlZF9jaHVua19zdGF0ZSA9PSBrQ2h1bmtDb21wbGV0ZSkgeworICAgICAgZXhwZWN0ZWRf
Y2h1bmtfc3RhdGUgPSBrQ2h1bmtCZWluZ1dyaXR0ZW47CisgICAgfSBlbHNlIHsKKyAgICAgIGV4
cGVjdGVkX2NodW5rX3N0YXRlID0ga0NodW5rQmVpbmdSZWFkOworICAgIH0KKworICAgIC8vIFRP
RE8ocHJpbWlhbm8pOiBzaG91bGQgbm90IGJlIGEgQ0hFQ0sgKHNhbWUgcmF0aW9uYWxlIG9mIGNv
bW1lbnQgYWJvdmUpLgorICAgIFBFUkZFVFRPX0NIRUNLKGNodW5rX3N0YXRlID09IGV4cGVjdGVk
X2NodW5rX3N0YXRlKTsKKyAgICB1aW50MzJfdCBuZXh0X2xheW91dCA9IGxheW91dDsKKyAgICBu
ZXh0X2xheW91dCAmPSB+KGtDaHVua01hc2sgPDwgKGNodW5rX2lkeCAqIGtDaHVua1NoaWZ0KSk7
CisgICAgbmV4dF9sYXlvdXQgfD0gKGRlc2lyZWRfY2h1bmtfc3RhdGUgPDwgKGNodW5rX2lkeCAq
IGtDaHVua1NoaWZ0KSk7CisKKyAgICAvLyBJZiB3ZSBhcmUgZnJlZWluZyBhIGNodW5rIGFuZCBh
bGwgdGhlIG90aGVyIGNodW5rcyBpbiB0aGUgcGFnZSBhcmUgZnJlZQorICAgIC8vIHdlIHNob3Vs
ZCBkZS1wYXJ0aXRpb24gdGhlIHBhZ2UgYW5kIG1hcmsgaXQgYXMgY2xlYXIuCisgICAgaWYgKChu
ZXh0X2xheW91dCAmIGtBbGxDaHVua3NNYXNrKSA9PSBrQWxsQ2h1bmtzRnJlZSkKKyAgICAgIG5l
eHRfbGF5b3V0ID0gMDsKKworICAgIGlmIChwaGRyLT5sYXlvdXQuY29tcGFyZV9leGNoYW5nZV9z
dHJvbmcobGF5b3V0LCBuZXh0X2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX2FjcV9yZWwpKSB7CisgICAgICByZXR1
cm4gcGFnZV9pZHg7CisgICAgfQorICAgIFdhaXRCZWZvcmVOZXh0QXR0ZW1wdChhdHRlbXB0KTsK
KyAgfQorICAvLyBUb28gbXVjaCBjb250ZW50aW9uIG9uIHRoaXMgcGFnZS4gR2l2ZSB1cC4gVGhp
cyBwYWdlIHdpbGwgYmUgbGVmdCBwZW5kaW5nCisgIC8vIGZvcmV2ZXIgYnV0IHRoZXJlIGlzbid0
IG11Y2ggbW9yZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4KKyAgUEVSRkVUVE9fREZBVEFMKCJU
b28gbXVjaCBjb250ZW50aW9uIG9uIHBhZ2UuIik7CisgIHJldHVybiBrSW52YWxpZFBhZ2VJZHg7
Cit9CisKK1NoYXJlZE1lbW9yeUFCSTo6Q2h1bms6OkNodW5rKCkgPSBkZWZhdWx0OworCitTaGFy
ZWRNZW1vcnlBQkk6OkNodW5rOjpDaHVuayh1aW50OF90KiBiZWdpbiwgdWludDE2X3Qgc2l6ZSwg
dWludDhfdCBjaHVua19pZHgpCisgICAgOiBiZWdpbl8oYmVnaW4pLCBzaXplXyhzaXplKSwgY2h1
bmtfaWR4XyhjaHVua19pZHgpIHsKKyAgUEVSRkVUVE9fQ0hFQ0socmVpbnRlcnByZXRfY2FzdDx1
aW50cHRyX3Q+KGJlZ2luKSAlIGtDaHVua0FsaWdubWVudCA9PSAwKTsKKyAgUEVSRkVUVE9fQ0hF
Q0soc2l6ZSA+IDApOworfQorCitTaGFyZWRNZW1vcnlBQkk6OkNodW5rOjpDaHVuayhDaHVuayYm
IG8pIG5vZXhjZXB0IHsKKyAgKnRoaXMgPSBzdGQ6Om1vdmUobyk7Cit9CisKK1NoYXJlZE1lbW9y
eUFCSTo6Q2h1bmsmIFNoYXJlZE1lbW9yeUFCSTo6Q2h1bms6Om9wZXJhdG9yPShDaHVuayYmIG8p
IHsKKyAgYmVnaW5fID0gby5iZWdpbl87CisgIHNpemVfID0gby5zaXplXzsKKyAgY2h1bmtfaWR4
XyA9IG8uY2h1bmtfaWR4XzsKKyAgby5iZWdpbl8gPSBudWxscHRyOworICBvLnNpemVfID0gMDsK
KyAgby5jaHVua19pZHhfID0gMDsKKyAgcmV0dXJuICp0aGlzOworfQorCitzdGQ6OnBhaXI8c2l6
ZV90LCBzaXplX3Q+IFNoYXJlZE1lbW9yeUFCSTo6R2V0UGFnZUFuZENodW5rSW5kZXgoCisgICAg
Y29uc3QgQ2h1bmsmIGNodW5rKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhjaHVuay5pc192YWxpZCgp
KTsKKyAgUEVSRkVUVE9fRENIRUNLKGNodW5rLmJlZ2luKCkgPj0gc3RhcnRfKTsKKyAgUEVSRkVU
VE9fRENIRUNLKGNodW5rLmVuZCgpIDw9IHN0YXJ0XyArIHNpemVfKTsKKworICAvLyBUT0RPKHBy
aW1pYW5vKTogVGhlIGRpdmlzaW9ucyBiZWxvdyBjb3VsZCBiZSBhdm9pZGVkIGlmIHdlIGNhY2hl
ZAorICAvLyB8cGFnZV9zaGlmdF98LgorICBjb25zdCB1aW50cHRyX3QgcmVsX2FkZHIgPSBzdGF0
aWNfY2FzdDx1aW50cHRyX3Q+KGNodW5rLmJlZ2luKCkgLSBzdGFydF8pOworICBjb25zdCBzaXpl
X3QgcGFnZV9pZHggPSByZWxfYWRkciAvIHBhZ2Vfc2l6ZV87CisgIGNvbnN0IHNpemVfdCBvZmZz
ZXQgPSByZWxfYWRkciAlIHBhZ2Vfc2l6ZV87CisgIFBFUkZFVFRPX0RDSEVDSyhvZmZzZXQgPj0g
c2l6ZW9mKFBhZ2VIZWFkZXIpKTsKKyAgUEVSRkVUVE9fRENIRUNLKG9mZnNldCAlIGtDaHVua0Fs
aWdubWVudCA9PSAwKTsKKyAgUEVSRkVUVE9fRENIRUNLKChvZmZzZXQgLSBzaXplb2YoUGFnZUhl
YWRlcikpICUgY2h1bmsuc2l6ZSgpID09IDApOworICBjb25zdCBzaXplX3QgY2h1bmtfaWR4ID0g
KG9mZnNldCAtIHNpemVvZihQYWdlSGVhZGVyKSkgLyBjaHVuay5zaXplKCk7CisgIFBFUkZFVFRP
X0RDSEVDSyhjaHVua19pZHggPCBrTWF4Q2h1bmtzUGVyUGFnZSk7CisgIFBFUkZFVFRPX0RDSEVD
SyhjaHVua19pZHggPCBHZXROdW1DaHVua3NGb3JMYXlvdXQoR2V0UGFnZUxheW91dChwYWdlX2lk
eCkpKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBhZ2VfaWR4LCBjaHVua19pZHgpOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IHNyYy90cmFjaW5nL2NvcmUvc2hhcmVkX21lbW9yeV9hcmJpdGVyX2ltcGwuY2MKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IHNyYy90cmFjaW5nL2NvcmUvc2hhcmVkX21lbW9y
eV9hcmJpdGVyX2ltcGwuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVk
ZS9wZXJmZXR0by9leHQvYmFzZS93ZWFrX3B0ci5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0
aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBt
YXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5z
ZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAg
ICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5s
ZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBz
b2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQg
b24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05T
IE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNl
bnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAor
ICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURF
X1BFUkZFVFRPX0VYVF9CQVNFX1dFQUtfUFRSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9f
RVhUX0JBU0VfV0VBS19QVFJfSF8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdGhyZWFkX2NoZWNrZXIuaCIKKworI2luY2x1ZGUgPG1l
bW9yeT4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQSBz
aW1wbGUgV2Vha1B0ciBmb3Igc2luZ2xlLXRocmVhZGVkIGNhc2VzLgorLy8gR2VuZXJhbGx5IGtl
ZXAgdGhlIFdlYWtQdHJGYWN0b3J5IGFzIGxhc3QgZmllbGRzIGluIGNsYXNzZXM6IGl0IG1ha2Vz
IHRoZQorLy8gV2Vha1B0cihzKSBpbnZhbGlkYXRlIGFzIGZpcnN0IHRoaW5nIGluIHRoZSBjbGFz
cyBkdG9yLgorLy8gVXNhZ2U6CisvLyBjbGFzcyBNeUNsYXNzIHsKKy8vICBNeUNsYXNzKCkgOiB3
ZWFrX2ZhY3RvcnlfKHRoaXMpIHt9CisvLyAgV2Vha1B0cjxNeUNsYXNzPiBHZXRXZWFrUHRyKCkg
eyByZXR1cm4gd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7IH0KKy8vCisvLyBwcml2YXRlOgor
Ly8gIFdlYWtQdHJGYWN0b3J5PE15Q2xhc3M+IHdlYWtfZmFjdG9yeV87CisvLyB9CisvLworLy8g
aW50IG1haW4oKSB7CisvLyAgc3RkOjp1bmlxdWVfcHRyPE15Q2xhc3M+IGZvbyhuZXcgTXlDbGFz
cyk7CisvLyAgYXV0byB3cHRyID0gZm9vLkdldFdlYWtQdHIoKTsKKy8vICBBU1NFUlRfVFJVRSh3
cHRyKTsKKy8vICBBU1NFUlRfRVEoZm9vLmdldCgpLCB3cHRyLT5nZXQoKSk7CisvLyAgZm9vLnJl
c2V0KCk7CisvLyAgQVNTRVJUX0ZBTFNFKHdwdHIpOworLy8gIEFTU0VSVF9FUShudWxscHRyLCB3
cHRyLT5nZXQoKSk7CisvLyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgV2Vha1B0
ckZhY3Rvcnk7ICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uLCBkZWZpbmVkIGJlbG93LgorCit0ZW1w
bGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFdlYWtQdHIgeworIHB1YmxpYzoKKyAgV2Vha1B0cigp
IHt9CisgIFdlYWtQdHIoY29uc3QgV2Vha1B0ciYpID0gZGVmYXVsdDsKKyAgV2Vha1B0ciYgb3Bl
cmF0b3I9KGNvbnN0IFdlYWtQdHImKSA9IGRlZmF1bHQ7CisgIFdlYWtQdHIoV2Vha1B0ciYmKSA9
IGRlZmF1bHQ7CisgIFdlYWtQdHImIG9wZXJhdG9yPShXZWFrUHRyJiYpID0gZGVmYXVsdDsKKwor
ICBUKiBnZXQoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hl
Y2tlcik7CisgICAgcmV0dXJuIGhhbmRsZV8gPyAqaGFuZGxlXy5nZXQoKSA6IG51bGxwdHI7Cisg
IH0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIFQmIG9wZXJh
dG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXQoKTsgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJv
b2woKSBjb25zdCB7IHJldHVybiAhIWdldCgpOyB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xh
c3MgV2Vha1B0ckZhY3Rvcnk8VD47CisgIGV4cGxpY2l0IFdlYWtQdHIoY29uc3Qgc3RkOjpzaGFy
ZWRfcHRyPFQqPiYgaGFuZGxlKSA6IGhhbmRsZV8oaGFuZGxlKSB7fQorCisgIHN0ZDo6c2hhcmVk
X3B0cjxUKj4gaGFuZGxlXzsKKyAgUEVSRkVUVE9fVEhSRUFEX0NIRUNLRVIodGhyZWFkX2NoZWNr
ZXIpCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFdlYWtQdHJGYWN0b3J5IHsK
KyBwdWJsaWM6CisgIGV4cGxpY2l0IFdlYWtQdHJGYWN0b3J5KFQqIG93bmVyKQorICAgICAgOiB3
ZWFrX3B0cl8oc3RkOjpzaGFyZWRfcHRyPFQqPihuZXcgVCoge293bmVyfSkpIHsKKyAgICBQRVJG
RVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyKTsKKyAgfQorCisgIH5XZWFrUHRyRmFj
dG9yeSgpIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyKTsKKyAg
ICAqKHdlYWtfcHRyXy5oYW5kbGVfLmdldCgpKSA9IG51bGxwdHI7CisgIH0KKworICAvLyBDYW4g
YmUgc2FmZWx5IGNhbGxlZCBvbiBhbnkgdGhyZWFkLCBzaW5jZSBpdCBzaW1wbHkgY29waWVzIHx3
ZWFrX3B0cl98LgorICAvLyBOb3RlIHRoYXQgYW55IGFjY2Vzc2VzIHRvIHRoZSByZXR1cm5lZCBw
b2ludGVyIG5lZWQgdG8gYmUgbWFkZSBvbiB0aGUKKyAgLy8gdGhyZWFkIHRoYXQgY3JlYXRlZC9y
ZXNldCB0aGUgZmFjdG9yeS4KKyAgV2Vha1B0cjxUPiBHZXRXZWFrUHRyKCkgY29uc3QgeyByZXR1
cm4gd2Vha19wdHJfOyB9CisKKyAgLy8gUmVzZXQgdGhlIGZhY3RvcnkgdG8gYSBuZXcgb3duZXIg
JiB0aHJlYWQuIE1heSBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgYW55CisgIC8vIHdlYWsgcG9pbnRl
cnMgd2VyZSBwYXNzZWQgb3V0LiBGdXR1cmUgd2VhayBwb2ludGVycyB3aWxsIGJlIHZhbGlkIG9u
IHRoZQorICAvLyBjYWxsaW5nIHRocmVhZC4KKyAgdm9pZCBSZXNldChUKiBvd25lcikgeworICAg
IC8vIFJlc2V0IHRocmVhZCBjaGVja2VyIHRvIGN1cnJlbnQgdGhyZWFkLgorICAgIFBFUkZFVFRP
X0RFVEFDSF9GUk9NX1RIUkVBRCh0aHJlYWRfY2hlY2tlcik7CisgICAgUEVSRkVUVE9fRENIRUNL
X1RIUkVBRCh0aHJlYWRfY2hlY2tlcik7CisKKyAgICAvLyBXZSBzaG91bGQgbm90IGhhdmUgcGFz
c2VkIG91dCBhbnkgd2VhayBwb2ludGVycyB5ZXQgYXQgdGhpcyBwb2ludC4KKyAgICBQRVJGRVRU
T19EQ0hFQ0sod2Vha19wdHJfLmhhbmRsZV8udXNlX2NvdW50KCkgPT0gMSk7CisKKyAgICB3ZWFr
X3B0cl8gPSBXZWFrUHRyPFQ+KHN0ZDo6c2hhcmVkX3B0cjxUKj4obmV3IFQqIHtvd25lcn0pKTsK
KyAgfQorCisgcHJpdmF0ZToKKyAgV2Vha1B0ckZhY3RvcnkoY29uc3QgV2Vha1B0ckZhY3Rvcnkm
KSA9IGRlbGV0ZTsKKyAgV2Vha1B0ckZhY3RvcnkmIG9wZXJhdG9yPShjb25zdCBXZWFrUHRyRmFj
dG9yeSYpID0gZGVsZXRlOworCisgIFdlYWtQdHI8VD4gd2Vha19wdHJfOworICBQRVJGRVRUT19U
SFJFQURfQ0hFQ0tFUih0aHJlYWRfY2hlY2tlcikKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNl
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRP
X0VYVF9CQVNFX1dFQUtfUFRSX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBp
bmNsdWRlL3BlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvc2hhcmVkX21lbW9yeV9hcmJpdGVyLmgK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L3Ry
YWNpbmcvY29yZS90cmFjaW5nX3NlcnZpY2UuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnkuaAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX1NIQVJF
RF9NRU1PUllfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX1NI
QVJFRF9NRU1PUllfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bWVtb3J5
PgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCisvLyBBbiBhYnN0cmFjdCBpbnRl
cmZhY2UgdGhhdCBtb2RlbHMgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uIHNoYXJlZCBiZXR3ZWVu
CisvLyBTZXJ2aWNlIGFuZCBQcm9kdWNlci4gVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9m
IHRoaXMgaXMgdXAgdG8gdGhlCisvLyB0cmFuc3BvcnQgbGF5ZXIuIFRoaXMgY2FuIGJlIGFzIHNp
bXBsZSBhcyBhIG1hbGxvYygpLWVkIGJ1ZmZlciwgaWYgYm90aAorLy8gUHJvZHVjZXIgYW5kIFNl
cnZpY2UgYXJlIGhvc3RlZCBpbiB0aGUgc2FtZSBwcm9jZXNzLCBvciBzb21lIHBvc2l4IHNoYXJl
ZAorLy8gbWVtb3J5IGZvciB0aGUgb3V0LW9mLXByb2Nlc3MgY2FzZSAoc2VlIHNyYy91bml4X3Jw
YykuCisvLyBCb3RoIHRoaXMgY2xhc3MgYW5kIHRoZSBGYWN0b3J5IGFyZSBzdWJjbGFzc2VkIGJ5
IHRoZSB0cmFuc3BvcnQgbGF5ZXIsIHdoaWNoCisvLyB3aWxsIGF0dGFjaCBwbGF0Zm9ybSBzcGVj
aWZpYyBmaWVsZHMgdG8gaXQgKGUuZy4sIGEgdW5peCBmaWxlIGRlc2NyaXB0b3IpLgorY2xhc3Mg
UEVSRkVUVE9fRVhQT1JUIFNoYXJlZE1lbW9yeSB7CisgcHVibGljOgorICBjbGFzcyBQRVJGRVRU
T19FWFBPUlQgRmFjdG9yeSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+RmFjdG9yeSgpOwor
ICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeT4gQ3JlYXRlU2hhcmVkTWVt
b3J5KHNpemVfdCkgPSAwOworICB9OworCisgIC8vIFRoZSB0cmFuc3BvcnQgbGF5ZXIgaXMgZXhw
ZWN0ZWQgdG8gdGVhciBkb3duIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHRvCisgIC8vIHRoaXMg
b2JqZWN0IHJlZ2lvbiB3aGVuIGRlc3Ryb3llZC4KKyAgdmlydHVhbCB+U2hhcmVkTWVtb3J5KCk7
CisKKyAgdmlydHVhbCB2b2lkKiBzdGFydCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzaXplX3Qg
c2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgZmQoKSBjb25zdCA9IDA7Cit9OworCit9
ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VY
VF9UUkFDSU5HX0NPUkVfU0hBUkVEX01FTU9SWV9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2J1ZmZlcl9leGhhdXN0ZWRfcG9saWN5
LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJv
amVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAy
LjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg
aW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5
IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj
ZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBs
YXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRl
ciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lU
SE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNz
IG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFn
ZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGlj
ZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19CVUZGRVJfRVhI
QVVTVEVEX1BPTElDWV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfQlVGRkVS
X0VYSEFVU1RFRF9QT0xJQ1lfSF8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworLy8gRGV0ZXJt
aW5lcyBob3cgU2hhcmVkTWVtb3J5QXJiaXRlckltcGw6OkdldE5ld0NodW5rKCkgYmVoYXZlcyB3
aGVuIG5vIGZyZWUKKy8vIGNodW5rcyBhcmUgYXZhaWxhYmxlLgorZW51bSBjbGFzcyBCdWZmZXJF
eGhhdXN0ZWRQb2xpY3kgeworICAvLyBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbDo6R2V0TmV3Q2h1
bmsoKSB3aWxsIHN0YWxsIGlmIG5vIGZyZWUgU01CIGNodW5rIGlzCisgIC8vIGF2YWlsYWJsZSBh
bmQgd2FpdCBmb3IgdGhlIHRyYWNpbmcgc2VydmljZSB0byBmcmVlIG9uZS4gTm90ZSB0aGF0IHRo
aXMKKyAgLy8gcmVxdWlyZXMgdGhhdCBtZXNzYWdlcyB0aGUgYXJiaXRlciBzZW5kcyB0byB0aGUg
dHJhY2luZyBzZXJ2aWNlIChmcm9tIGFueQorICAvLyBUcmFjZVdyaXRlciB0aHJlYWQpIHdpbGwg
YmUgcmVjZWl2ZWQgYnkgaXQsIGV2ZW4gaWYgYWxsIFRyYWNlV3JpdGVyIHRocmVhZHMKKyAgLy8g
YXJlIHN0YWxsZWQuCisgIGtTdGFsbCwKKworICAvLyBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbDo6
R2V0TmV3Q2h1bmsoKSB3aWxsIHJldHVybiBhbiBpbnZhbGlkIGNodW5rIGlmIG5vCisgIC8vIGZy
ZWUgU01CIGNodW5rIGlzIGF2YWlsYWJsZS4gSW4gdGhpcyBjYXNlLCB0aGUgVHJhY2VXcml0ZXIg
d2lsbCBmYWxsIGJhY2sKKyAgLy8gdG8gYSBnYXJiYWdlIGNodW5rIGFuZCBkcm9wIHdyaXR0ZW4g
ZGF0YSB1bnRpbCBhY3F1aXJpbmcgYSBmdXR1cmUgY2h1bmsKKyAgLy8gc3VjY2VlZHMgYWdhaW4u
CisgIGtEcm9wLAorCisgIC8vIFRPRE8oZXNlY2tsZXIpOiBTd2l0Y2ggdG8ga0Ryb3AgYnkgZGVm
YXVsdCBhbmQgY2hhbmdlIHRoZSBBbmRyb2lkIGNvZGUgdG8KKyAgLy8gZXhwbGljaXRseSByZXF1
ZXN0IGtTdGFsbCBpbnN0ZWFkLgorICBrRGVmYXVsdCA9IGtTdGFsbAorfTsKKworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0JV
RkZFUl9FWEhBVVNURURfUE9MSUNZX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAq
IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGlj
ZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5j
ZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNl
bnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5T
RS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVk
IHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5z
ZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5U
SUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQu
CisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcg
cGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwor
CisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19DT1JFX0ZPUldBUkRfREVDTFNfSF8K
KyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NPUkVfRk9SV0FSRF9ERUNMU19IXwor
CisvLyBGb3J3YXJkIGRlY2xhcmVzIGNsYXNzZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGF0IGJ1aWxk
LXRpbWUgZnJvbSBwcm90b3MuCisvLyBGaXJzdCBvZiBhbGwsIHdoeSBhcmUgd2UgZm9yd2FyZCBk
ZWNsYXJpbmcgYXQgYWxsPworLy8gIDEuIENocm9taXVtIGRpdmVyZ2VzIGZyb20gdGhlIEdvb2ds
ZSBzdHlsZSBndWlkZSBvbiB0aGlzLCBiZWNhdXNlIGZvcndhcmQKKy8vICAgICBkZWNsYXJhdGlv
bnMgdHlwaWNhbGx5IG1ha2UgYnVpbGQgdGltZXMgZmFzdGVyLCBhbmQgdGhhdCdzIGEgZGVzaXJh
YmxlCisvLyAgICAgcHJvcGVydHkgZm9yIGEgbGFyZ2UgYW5kIGNvbXBsZXggY29kZWJhc2UuCisv
LyAgMi4gQWRkaW5nICNpbmNsdWRlIHRvIGJ1aWxkLXRpbWUtZ2VuZXJhdGVkIGhlYWRlcnMgZnJv
bSBoZWFkZXJzIHR5cGljYWxseQorLy8gICAgIGNyZWF0ZXMgc3VidGxlIGJ1aWxkIGVycm9ycyB0
aGF0IGFyZSBoYXJkIHRvIHNwb3QgaW4gR04uIFRoaXMgaXMgYmVjYXVzZQorLy8gICAgIG9uY2Ug
YSBzdGFuZGFyZCBoZWFkZXIgKHNheSBmb28uaCkgaGFzIGFuICNpbmNsdWRlICJwcm90b3MvZm9v
Lmdlbi5oIiwKKy8vICAgICB0aGUgYnVpbGQgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiBmb28uaCBu
ZWVkcyB0byBkZXBlbmQgb24gdGhlIGdlbnJ1bGUKKy8vICAgICB0aGF0IGdlbmVyYXRlcyBmb28u
Z2VuLmguIFRoaXMgaXMgYWNoaWV2YWJsZSB1c2luZyBwdWJsaWNfZGVwcyBpbiBHTiBidXQKKy8v
ICAgICBpcyBub3QgdGVzdGFibGUgLyBlbmZvcmNlYWJsZSwgaGVuY2UgdG9vIGVhc3kgdG8gZ2V0
IHdyb25nLgorCisvLyBIaXN0b3JpY2FsbHkgdGhlIGNsYXNzZXMgYmVsb3cgdXNlZCB0byBiZSBn
ZW5lcmF0ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZworLy8gLnByb3RvKHMpIGF0IENMICpjaGVj
ay1pbiogdGltZSAoIT0gYnVpbGQgdGltZSkgaW4gdGhlIDo6cGVyZmV0dG8gbmFtZXNwYWNlLgor
Ly8gTm93YWRheXMgd2UgaGF2ZSBjb2RlIGV2ZXJ5d2hlcmUgdGhhdCBhc3N1bWUgdGhlIHJpZ2h0
IGNsYXNzIGlzCisvLyA6OnBlcmZldHRvOjpUcmFjZUNvbmZpZyBvciB0aGUgbGlrZS4gQmFjayB0
aGVuIG90aGVyIGhlYWRlcnMgY291bGQganVzdAorLy8gZm9yd2FyZCBkZWNsYXJlZCA6OnBlcmZl
dHRvOjpUcmFjZUNvbmZpZy4gVGhlc2UgZGF5cywgdGhlIHJlYWwgY2xhc3MgaXMKKy8vIDo6cGVy
ZmV0dG86OnByb3Rvczo6Z2VuOjpUcmFjZUNvbmZpZyBhbmQgY29yZS90cmFjZV9jb25maWcuaCBh
bGlhc2VzIHRoYXQgYXMKKy8vIHVzaW5nIDo6cGVyZmV0dG86OlRyYWNlQ29uZmlnID0gOjpwZXJm
ZXR0bzo6cHJvdG9zOjpnZW46OlRyYWNlQ29uZmlnLgorLy8gSW4gQysrIG9uZSBjYW5ub3QgZm9y
d2FyZCBkZWNsYXJlIGEgdHlwZSBhbGlhcyAoYnV0IG9ubHkgdGhlIGFsaWFzZWQgdHlwZSkuCisv
LyBIZW5jZSB0aGlzIGhlYWRlciwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZXZlcnkgdGltZSBvbmUg
d2FudHMgdG8gZm9yd2FyZAorLy8gZGVjbGFyZSBjbGFzc2VzIGxpa2UgVHJhY2VDb25maWcuCisK
Ky8vIFRoZSBvdmVyYWxsIHBsYW4gaXMgdGhhdCwgd2hlbiBvbmUgb2YgdGhlIGNsYXNzZXMgYmVs
b3cgaXMgbmVlZGVkOgorLy8gVGhlIC5oIGZpbGUgaW5jbHVkZXMgdGhpcyBmaWxlLgorLy8gVGhl
IC5jYyBmaWxlIGluY2x1ZGVzIHBlcmZldHRvL3RyYWNpbmcvY29yZS90cmFjZV9jb25maWcuaCAo
b3IgZXF1aXYpLiBUaGF0CisvLyBoZWFkZXIgd2lsbCBwdWxsIHRoZSBmdWxsIGRlY2xhcmF0aW9u
IGZyb20gdHJhY2VfY29uZmlnLmdlbi5oIGFuZCB3aWxsIGFsc28KKy8vIHNldHVwIHRoZSBhbGlh
cyBpbiB0aGUgOjpwZXJmZXR0byBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSBwZXJmZXR0byB7Citu
YW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBDaHJvbWVDb25maWc7
CitjbGFzcyBDb21taXREYXRhUmVxdWVzdDsKK2NsYXNzIERhdGFTb3VyY2VDb25maWc7CitjbGFz
cyBEYXRhU291cmNlRGVzY3JpcHRvcjsKK2NsYXNzIE9ic2VydmFibGVFdmVudHM7CitjbGFzcyBU
cmFjZUNvbmZpZzsKK2NsYXNzIFRyYWNlU3RhdHM7CitjbGFzcyBUcmFjaW5nU2VydmljZUNhcGFi
aWxpdGllczsKK2NsYXNzIFRyYWNpbmdTZXJ2aWNlU3RhdGU7CisKK30gIC8vIG5hbWVzcGFjZSBn
ZW4KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKKwordXNpbmcgQ2hyb21lQ29uZmlnID0gOjpwZXJm
ZXR0bzo6cHJvdG9zOjpnZW46OkNocm9tZUNvbmZpZzsKK3VzaW5nIENvbW1pdERhdGFSZXF1ZXN0
ID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpnZW46OkNvbW1pdERhdGFSZXF1ZXN0OwordXNpbmcgRGF0
YVNvdXJjZUNvbmZpZyA9IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpEYXRhU291cmNlQ29uZmln
OwordXNpbmcgRGF0YVNvdXJjZURlc2NyaXB0b3IgPSA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6
RGF0YVNvdXJjZURlc2NyaXB0b3I7Cit1c2luZyBPYnNlcnZhYmxlRXZlbnRzID0gOjpwZXJmZXR0
bzo6cHJvdG9zOjpnZW46Ok9ic2VydmFibGVFdmVudHM7Cit1c2luZyBUcmFjZUNvbmZpZyA9IDo6
cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpUcmFjZUNvbmZpZzsKK3VzaW5nIFRyYWNlU3RhdHMgPSA6
OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6VHJhY2VTdGF0czsKK3VzaW5nIFRyYWNpbmdTZXJ2aWNl
Q2FwYWJpbGl0aWVzID0KKyAgICA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6VHJhY2luZ1NlcnZp
Y2VDYXBhYmlsaXRpZXM7Cit1c2luZyBUcmFjaW5nU2VydmljZVN0YXRlID0gOjpwZXJmZXR0bzo6
cHJvdG9zOjpnZW46OlRyYWNpbmdTZXJ2aWNlU3RhdGU7CisKK30gIC8vIG5hbWVzcGFjZSBwZXJm
ZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19DT1JFX0ZPUldBUkRf
REVDTFNfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3Vy
Y2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy
c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g
YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5v
cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj
YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl
ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor
ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs
YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0
aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdf
Q09SRV9UUkFDSU5HX1NFUlZJQ0VfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfVFJB
Q0lOR19DT1JFX1RSQUNJTkdfU0VSVklDRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNp
bmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
ZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9leHQvYmFzZS9zY29wZWRfZmlsZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9iYXNpY190eXBlcy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29y
ZS9zaGFyZWRfbWVtb3J5LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by90cmFjaW5nL2J1ZmZlcl9leGhhdXN0ZWRfcG9saWN5LmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2NvcmUvZm9yd2Fy
ZF9kZWNscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCituYW1lc3BhY2UgYmFzZSB7Citj
bGFzcyBUYXNrUnVubmVyOworfSAgLy8gbmFtZXNwYWNlIGJhc2UKKworY2xhc3MgQ29uc3VtZXI7
CitjbGFzcyBQcm9kdWNlcjsKK2NsYXNzIFNoYXJlZE1lbW9yeUFyYml0ZXI7CitjbGFzcyBUcmFj
ZVdyaXRlcjsKKworLy8gVE9ETzogZm9yIHRoZSBtb21lbnQgdGhpcyBhc3N1bWVzIHRoYXQgYWxs
IHRoZSBjYWxscyBoYXBwZW4gb24gdGhlIHNhbWUKKy8vIHRocmVhZC9zZXF1ZW5jZS4gTm90IHN1
cmUgdGhpcyB3aWxsIGJlIHRoZSBjYXNlIGxvbmcgdGVybSBpbiBDaHJvbWUuCisKKy8vIFRoZSBB
UEkgZm9yIHRoZSBQcm9kdWNlciBwb3J0IG9mIHRoZSBTZXJ2aWNlLgorLy8gU3ViY2xhc3NlZCBi
eToKKy8vIDEuIFRoZSB0cmFjaW5nX3NlcnZpY2VfaW1wbC5jYyBidXNpbmVzcyBsb2dpYyB3aGVu
IHJldHVybmluZyBpdCBpbiByZXNwb25zZQorLy8gICAgdG8gdGhlIENvbm5lY3RQcm9kdWNlcigp
IG1ldGhvZC4KKy8vIDIuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgKGUuZy4sIHNyYy9pcGMpIHdoZW4g
dGhlIHByb2R1Y2VyIGFuZAorLy8gICAgdGhlIHNlcnZpY2UgZG9uJ3QgdGFsayBsb2NhbGx5IGJ1
dCB2aWEgc29tZSBJUEMgbWVjaGFuaXNtLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFByb2R1Y2Vy
RW5kcG9pbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UHJvZHVjZXJFbmRwb2ludCgpOworCisg
IC8vIENhbGxlZCBieSB0aGUgUHJvZHVjZXIgdG8gKHVuKXJlZ2lzdGVyIGRhdGEgc291cmNlcy4g
RGF0YSBzb3VyY2VzIGFyZQorICAvLyBpZGVudGlmaWVkIGJ5IHRoZWlyIG5hbWUgKGkuZS4gRGF0
YVNvdXJjZURlc2NyaXB0b3IubmFtZSkKKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyRGF0YVNvdXJj
ZShjb25zdCBEYXRhU291cmNlRGVzY3JpcHRvciYpID0gMDsKKyAgdmlydHVhbCB2b2lkIFVucmVn
aXN0ZXJEYXRhU291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSA9IDA7CisKKyAgLy8gQXNz
b2NpYXRlIHRoZSB0cmFjZSB3cml0ZXIgd2l0aCB0aGUgZ2l2ZW4gfHdyaXRlcl9pZHwgd2l0aAor
ICAvLyB8dGFyZ2V0X2J1ZmZlcnwuIFRoZSBzZXJ2aWNlIG1heSB1c2UgdGhpcyBpbmZvcm1hdGlv
biB0byByZXRyaWV2ZSBhbmQKKyAgLy8gY29weSB1bmNvbW1pdHRlZCBjaHVua3Mgd3JpdHRlbiBi
eSB0aGUgdHJhY2Ugd3JpdGVyIGludG8gaXRzIGFzc29jaWF0ZWQKKyAgLy8gYnVmZmVyLCBlLmcu
IHdoZW4gYSBwcm9kdWNlciBwcm9jZXNzIGNyYXNoZXMgb3Igd2hlbiBhIGZsdXNoIGlzCisgIC8v
IG5lY2Vzc2FyeS4KKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVHJhY2VXcml0ZXIodWludDMyX3Qg
d3JpdGVyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0
YXJnZXRfYnVmZmVyKSA9IDA7CisKKyAgLy8gUmVtb3ZlIHRoZSBhc3NvY2lhdGlvbiBvZiB0aGUg
dHJhY2Ugd3JpdGVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEKKyAgLy8gUmVnaXN0ZXJUcmFjZVdy
aXRlci4KKyAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJUcmFjZVdyaXRlcih1aW50MzJfdCB3cml0
ZXJfaWQpID0gMDsKKworICAvLyBDYWxsZWQgYnkgdGhlIFByb2R1Y2VyIHRvIHNpZ25hbCB0aGF0
IHNvbWUgcGFnZXMgaW4gdGhlIHNoYXJlZCBtZW1vcnkKKyAgLy8gYnVmZmVyIChzaGFyZWQgYmV0
d2VlbiBTZXJ2aWNlIGFuZCBQcm9kdWNlcikgaGF2ZSBjaGFuZ2VkLgorICAvLyBXaGVuIHRoZSBQ
cm9kdWNlciBhbmQgdGhlIFNlcnZpY2UgYXJlIGhvc3RlZCBpbiB0aGUgc2FtZSBwcm9jZXNzIGFu
ZAorICAvLyBoZW5jZSBwb3RlbnRpYWxseSBsaXZlIG9uIHRoZSBzYW1lIHRhc2sgcnVubmVyLCBU
aGlzIG1ldGhvZCBtdXN0IGNhbGwKKyAgLy8gVHJhY2luZ1NlcnZpY2VJbXBsJ3MgQ29tbWl0RGF0
YSBzeW5jaHJvbm91c2x5LCB3aXRob3V0IGFueSBQb3N0VGFzaygpcywKKyAgLy8gaWYgb24gdGhl
IHNhbWUgdGhyZWFkLiBUaGlzIGlzIHRvIGF2b2lkIGEgZGVhZGxvY2sgd2hlcmUgdGhlIFByb2R1
Y2VyCisgIC8vIGV4aGF1c3RzIGl0cyBTTUIgYW5kIHN0YWxscyB3YWl0aW5nIGZvciB0aGUgc2Vy
dmljZSB0byBjYXRjaCB1cCB3aXRoCisgIC8vIHJlYWRzLCBidXQgdGhlIFNlcnZpY2UgbmV2ZXIg
Z2V0cyB0byB0aGF0IGJlY2F1c2UgaXQgbGl2ZXMgb24gdGhlIHNhbWUKKyAgLy8gdGhyZWFkLgor
ICB1c2luZyBDb21taXREYXRhQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT47CisgIHZp
cnR1YWwgdm9pZCBDb21taXREYXRhKGNvbnN0IENvbW1pdERhdGFSZXF1ZXN0JiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgQ29tbWl0RGF0YUNhbGxiYWNrIGNhbGxiYWNrID0ge30pID0gMDsK
KworICB2aXJ0dWFsIFNoYXJlZE1lbW9yeSogc2hhcmVkX21lbW9yeSgpIGNvbnN0ID0gMDsKKwor
ICAvLyBTaXplIG9mIHNoYXJlZCBtZW1vcnkgYnVmZmVyIHBhZ2VzLiBJdCdzIGFsd2F5cyBhIG11
bHRpcGxlIG9mIDRLLgorICAvLyBTZWUgc2hhcmVkX21lbW9yeV9hYmkuaAorICB2aXJ0dWFsIHNp
emVfdCBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYigpIGNvbnN0ID0gMDsKKworICAvLyBDcmVh
dGVzIGEgdHJhY2Ugd3JpdGVyLCB3aGljaCBhbGxvd3MgdG8gY3JlYXRlIGV2ZW50cywgaGFuZGxp
bmcgdGhlCisgIC8vIHVuZGVyeWluZyBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBhbmQgc2lnbmFsbGlu
ZyB0byB0aGUgU2VydmljZS4gVGhpcyBtZXRob2QKKyAgLy8gaXMgdGhyZWFkLXNhZmUgYnV0IHRo
ZSByZXR1cm5lZCBvYmplY3QgaXMgbm90LiBBIFRyYWNlV3JpdGVyIHNob3VsZCBiZQorICAvLyB1
c2VkIG9ubHkgZnJvbSBhIHNpbmdsZSB0aHJlYWQsIG9yIHRoZSBjYWxsZXIgaGFzIHRvIGhhbmRs
ZSBzZXF1ZW5jaW5nCisgIC8vIHZpYSBhIG11dGV4IG9yIGVxdWl2YWxlbnQuIFRoaXMgbWV0aG9k
IGNhbiBvbmx5IGJlIGNhbGxlZCBpZgorICAvLyBUcmFjaW5nU2VydmljZTo6Q29ubmVjdFByb2R1
Y2VyIHdhcyBjYWxsZWQgd2l0aCB8aW5fcHJvY2Vzcz10cnVlfC4KKyAgLy8gQXJnczoKKyAgLy8g
fHRhcmdldF9idWZmZXJ8IGlzIHRoZSB0YXJnZXQgYnVmZmVyIElEIHdoZXJlIHRoZSBkYXRhIHBy
b2R1Y2VkIGJ5IHRoZQorICAvLyB3cml0ZXIgc2hvdWxkIGJlIHN0b3JlZCBieSB0aGUgdHJhY2lu
ZyBzZXJ2aWNlLiBUaGlzIHZhbHVlIGlzIHBhc3NlZAorICAvLyB1cG9uIGNyZWF0aW9uIG9mIHRo
ZSBkYXRhIHNvdXJjZSAoU3RhcnREYXRhU291cmNlKCkpIGluIHRoZQorICAvLyBEYXRhU291cmNl
Q29uZmlnLnRhcmdldF9idWZmZXIoKS4KKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8VHJhY2VX
cml0ZXI+IENyZWF0ZVRyYWNlV3JpdGVyKAorICAgICAgQnVmZmVySUQgdGFyZ2V0X2J1ZmZlciwK
KyAgICAgIEJ1ZmZlckV4aGF1c3RlZFBvbGljeSBidWZmZXJfZXhoYXVzdGVkX3BvbGljeSA9Cisg
ICAgICAgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5OjprRGVmYXVsdCkgPSAwOworCisgIC8vIFRP
RE8oZXNlY2tsZXIpOiBBbHNvIGV4cG9zZSBDcmVhdGVTdGFydHVwVHJhY2VXcml0ZXIoKSA/CisK
KyAgLy8gSW4gc29tZSBjYXNlcyB5b3UgY2FuIGFjY2VzcyB0aGUgcHJvZHVjZXIncyBTaGFyZWRN
ZW1vcnlBcmJpdGVyIChmb3IKKyAgLy8gZXhhbXBsZSBpZiBUcmFjaW5nU2VydmljZTo6Q29ubmVj
dFByb2R1Y2VyIGlzIGNhbGxlZCB3aXRoCisgIC8vIHxpbl9wcm9jZXNzPXRydWV8KS4gVGhlIFNo
YXJlZE1lbW9yeUFyYml0ZXIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlCisgIC8vIFRyYWNlV3JpdGVy
cyB3aGljaCBpcyBhYmxlIHRvIGRpcmVjdGx5IGNvbW1pdCBjaHVua3MuIEZvciB0aGUKKyAgLy8g
fGluX3Byb2Nlc3M9dHJ1ZXwgY2FzZSB0aGlzIGNhbiBiZSBkb25lIHdpdGhvdXQgZ29pbmcgdGhy
b3VnaCBhbiBJUEMgbGF5ZXIuCisgIHZpcnR1YWwgU2hhcmVkTWVtb3J5QXJiaXRlciogTWF5YmVT
aGFyZWRNZW1vcnlBcmJpdGVyKCkgPSAwOworCisgIC8vIFdoZXRoZXIgdGhlIHNlcnZpY2UgYWNj
ZXB0ZWQgYSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBwcm92aWRlZCBieSB0aGUKKyAgLy8gcHJvZHVj
ZXIuCisgIHZpcnR1YWwgYm9vbCBJc1NobWVtUHJvdmlkZWRCeVByb2R1Y2VyKCkgY29uc3QgPSAw
OworCisgIC8vIENhbGxlZCBpbiByZXNwb25zZSB0byBhIFByb2R1Y2VyOjpGbHVzaChyZXF1ZXN0
X2lkKSBjYWxsIGFmdGVyIGFsbCBkYXRhCisgIC8vIGZvciB0aGUgZmx1c2ggcmVxdWVzdCBoYXMg
YmVlbiBjb21taXR0ZWQuCisgIHZpcnR1YWwgdm9pZCBOb3RpZnlGbHVzaENvbXBsZXRlKEZsdXNo
UmVxdWVzdElEKSA9IDA7CisKKyAgLy8gQ2FsbGVkIGluIHJlc3BvbnNlIHRvIG9uZSBvciBtb3Jl
IFByb2R1Y2VyOjpTdGFydERhdGFTb3VyY2UoKSwKKyAgLy8gaWYgdGhlIGRhdGEgc291cmNlIHJl
Z2lzdGVyZWQgc2V0dGluZyB0aGUgZmxhZworICAvLyBEYXRhU291cmNlRGVzY3JpcHRvci53aWxs
X25vdGlmeV9vbl9zdGFydC4KKyAgdmlydHVhbCB2b2lkIE5vdGlmeURhdGFTb3VyY2VTdGFydGVk
KERhdGFTb3VyY2VJbnN0YW5jZUlEKSA9IDA7CisKKyAgLy8gQ2FsbGVkIGluIHJlc3BvbnNlIHRv
IG9uZSBvciBtb3JlIFByb2R1Y2VyOjpTdG9wRGF0YVNvdXJjZSgpLAorICAvLyBpZiB0aGUgZGF0
YSBzb3VyY2UgcmVnaXN0ZXJlZCBzZXR0aW5nIHRoZSBmbGFnCisgIC8vIERhdGFTb3VyY2VEZXNj
cmlwdG9yLndpbGxfbm90aWZ5X29uX3N0b3AuCisgIHZpcnR1YWwgdm9pZCBOb3RpZnlEYXRhU291
cmNlU3RvcHBlZChEYXRhU291cmNlSW5zdGFuY2VJRCkgPSAwOworCisgIC8vIFRoaXMgaW5mb3Jt
cyB0aGUgc2VydmljZSB0byBhY3RpdmF0ZSBhbnkgb2YgdGhlc2UgdHJpZ2dlcnMgaWYgYW55IHRy
YWNpbmcKKyAgLy8gc2Vzc2lvbiB3YXMgd2FpdGluZyBmb3IgdGhlbS4KKyAgdmlydHVhbCB2b2lk
IEFjdGl2YXRlVHJpZ2dlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JikgPSAwOwor
CisgIC8vIEVtaXRzIGEgc3luY2hyb25pemF0aW9uIGJhcnJpZXIgdG8gbGluZWFyaXplIHdpdGgg
dGhlIHNlcnZpY2UuIFdoZW4KKyAgLy8gfGNhbGxiYWNrfCBpcyBpbnZva2VkLCB0aGUgY2FsbGVy
IGhhcyB0aGUgZ3VhcmFudGVlIHRoYXQgdGhlIHNlcnZpY2UgaGFzCisgIC8vIHNlZW4gYW5kIHBy
b2Nlc3NlZCBhbGwgdGhlIHJlcXVlc3RzIHNlbnQgYnkgdGhpcyBwcm9kdWNlciBwcmlvciB0byB0
aGUKKyAgLy8gU3luYygpIGNhbGwuIFVzZWQgbWFpbmx5IGluIHRlc3RzLgorICB2aXJ0dWFsIHZv
aWQgU3luYyhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY2FsbGJhY2spID0gMDsKK307ICAvLyBjbGFz
cyBQcm9kdWNlckVuZHBvaW50LgorCisvLyBUaGUgQVBJIGZvciB0aGUgQ29uc3VtZXIgcG9ydCBv
ZiB0aGUgU2VydmljZS4KKy8vIFN1YmNsYXNzZWQgYnk6CisvLyAxLiBUaGUgdHJhY2luZ19zZXJ2
aWNlX2ltcGwuY2MgYnVzaW5lc3MgbG9naWMgd2hlbiByZXR1cm5pbmcgaXQgaW4gcmVzcG9uc2UK
Ky8vIHRvCisvLyAgICB0aGUgQ29ubmVjdENvbnN1bWVyKCkgbWV0aG9kLgorLy8gMi4gVGhlIHRy
YW5zcG9ydCBsYXllciAoZS5nLiwgc3JjL2lwYykgd2hlbiB0aGUgY29uc3VtZXIgYW5kCisvLyAg
ICB0aGUgc2VydmljZSBkb24ndCB0YWxrIGxvY2FsbHkgYnV0IHZpYSBzb21lIElQQyBtZWNoYW5p
c20uCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQ29uc3VtZXJFbmRwb2ludCB7CisgcHVibGljOgor
ICB2aXJ0dWFsIH5Db25zdW1lckVuZHBvaW50KCk7CisKKyAgLy8gRW5hYmxlcyB0cmFjaW5nIHdp
dGggdGhlIGdpdmVuIFRyYWNlQ29uZmlnLiBUaGUgU2NvcGVkRmlsZSBhcmd1bWVudCBpcworICAv
LyB1c2VkIG9ubHkgd2hlbiBUcmFjZUNvbmZpZy53cml0ZV9pbnRvX2ZpbGUgPT0gdHJ1ZS4KKyAg
Ly8gSWYgVHJhY2VDb25maWcuZGVmZXJyZWRfc3RhcnQgPT0gdHJ1ZSBkYXRhIHNvdXJjZXMgYXJl
IGNvbmZpZ3VyZWQgdmlhCisgIC8vIFNldHVwRGF0YVNvdXJjZSgpIGJ1dCBhcmUgbm90IHN0YXJ0
ZWQgdW50aWwgU3RhcnRUcmFjaW5nKCkgaXMgY2FsbGVkLgorICAvLyBUaGlzIGlzIHRvIHN1cHBv
cnQgcHJlLWluaXRpYWxpemF0aW9uIGFuZCBmYXN0IHRyaWdnZXJpbmcgb2YgdHJhY2VzLgorICAv
LyBUaGUgU2NvcGVkRmlsZSBhcmd1bWVudCBpcyB1c2VkIG9ubHkgd2hlbiBUcmFjZUNvbmZpZy53
cml0ZV9pbnRvX2ZpbGUKKyAgLy8gPT0gdHJ1ZS4KKyAgdmlydHVhbCB2b2lkIEVuYWJsZVRyYWNp
bmcoY29uc3QgVHJhY2VDb25maWcmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNl
OjpTY29wZWRGaWxlID0gYmFzZTo6U2NvcGVkRmlsZSgpKSA9IDA7CisKKyAgLy8gVXBkYXRlIHRo
ZSB0cmFjZSBjb25maWcgb2YgYW4gZXhpc3RpbmcgdHJhY2luZyBzZXNzaW9uOyBvbmx5IGEgc3Vi
c2V0CisgIC8vIG9mIG9wdGlvbnMgY2FuIGJlIGNoYW5nZWQgbWlkLXNlc3Npb24uIEN1cnJlbnRs
eSB0aGUgb25seQorICAvLyBzdXBwb3J0ZWQgZnVuY3Rpb25hbGl0eSBpcyBleHBhbmRpbmcgdGhl
IGxpc3Qgb2YgcHJvZHVjZXJfbmFtZV9maWx0ZXJzKCkKKyAgLy8gKG9yIHJlbW92aW5nIHRoZSBm
aWx0ZXIgZW50aXJlbHkpIGZvciBleGlzdGluZyBkYXRhIHNvdXJjZXMuCisgIHZpcnR1YWwgdm9p
ZCBDaGFuZ2VUcmFjZUNvbmZpZyhjb25zdCBUcmFjZUNvbmZpZyYpID0gMDsKKworICAvLyBTdGFy
dHMgYWxsIGRhdGEgc291cmNlcyBjb25maWd1cmVkIGluIHRoZSB0cmFjZSBjb25maWcuIFRoaXMg
aXMgdXNlZCBvbmx5CisgIC8vIGFmdGVyIGNhbGxpbmcgRW5hYmxlVHJhY2luZygpIHdpdGggVHJh
Y2VDb25maWcuZGVmZXJyZWRfc3RhcnQ9dHJ1ZS4KKyAgLy8gSXQncyBhIG5vLW9wIGlmIGNhbGxl
ZCBhZnRlciBhIHJlZ3VsYXIgRW5hYmxlVHJhY2luZygpLCB3aXRob3V0IHNldHRpbmcKKyAgLy8g
ZGVmZXJyZWRfc3RhcnQuCisgIHZpcnR1YWwgdm9pZCBTdGFydFRyYWNpbmcoKSA9IDA7CisKKyAg
dmlydHVhbCB2b2lkIERpc2FibGVUcmFjaW5nKCkgPSAwOworCisgIC8vIFJlcXVlc3RzIGFsbCBk
YXRhIHNvdXJjZXMgdG8gZmx1c2ggdGhlaXIgZGF0YSBpbW1lZGlhdGVseSBhbmQgaW52b2tlcyB0
aGUKKyAgLy8gcGFzc2VkIGNhbGxiYWNrIG9uY2UgYWxsIG9mIHRoZW0gaGF2ZSBhY2tlZCB0aGUg
Zmx1c2ggKGluIHdoaWNoIGNhc2UKKyAgLy8gdGhlIGNhbGxiYWNrIGFyZ3VtZW50IHxzdWNjZXNz
fCB3aWxsIGJlIHRydWUpIG9yIHx0aW1lb3V0X21zfCBhcmUgZWxhcHNlZAorICAvLyAoaW4gd2hp
Y2ggY2FzZSB8c3VjY2Vzc3wgd2lsbCBiZSBmYWxzZSkuCisgIC8vIElmIHx0aW1lb3V0X21zfCBp
cyAwIHRoZSBUcmFjZUNvbmZpZydzIGZsdXNoX3RpbWVvdXRfbXMgaXMgdXNlZCwgb3IsCisgIC8v
IGlmIHRoYXQgb25lIGlzIG5vdCBzZXQgKG9yIGlzIHNldCB0byAwKSwga0RlZmF1bHRGbHVzaFRp
bWVvdXRNcyAoNXMpIGlzCisgIC8vIHVzZWQuCisgIHVzaW5nIEZsdXNoQ2FsbGJhY2sgPSBzdGQ6
OmZ1bmN0aW9uPHZvaWQoYm9vbCAvKnN1Y2Nlc3MqLyk+OworICB2aXJ0dWFsIHZvaWQgRmx1c2go
dWludDMyX3QgdGltZW91dF9tcywgRmx1c2hDYWxsYmFjaykgPSAwOworCisgIC8vIFRyYWNpbmcg
ZGF0YSB3aWxsIGJlIGRlbGl2ZXJlZCBpbnZva2luZyBDb25zdW1lcjo6T25UcmFjZURhdGEoKS4K
KyAgdmlydHVhbCB2b2lkIFJlYWRCdWZmZXJzKCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBGcmVl
QnVmZmVycygpID0gMDsKKworICAvLyBXaWxsIGNhbGwgT25EZXRhY2goKS4KKyAgdmlydHVhbCB2
b2lkIERldGFjaChjb25zdCBzdGQ6OnN0cmluZyYga2V5KSA9IDA7CisKKyAgLy8gV2lsbCBjYWxs
IE9uQXR0YWNoKCkuCisgIHZpcnR1YWwgdm9pZCBBdHRhY2goY29uc3Qgc3RkOjpzdHJpbmcmIGtl
eSkgPSAwOworCisgIC8vIFdpbGwgY2FsbCBPblRyYWNlU3RhdHMoKS4KKyAgdmlydHVhbCB2b2lk
IEdldFRyYWNlU3RhdHMoKSA9IDA7CisKKyAgLy8gU3RhcnQgb3Igc3RvcCBvYnNlcnZpbmcgZXZl
bnRzIG9mIHNlbGVjdGVkIHR5cGVzLiB8ZXZlbnRzX21hc2t8IHNwZWNpZmllcworICAvLyB0aGUg
dHlwZXMgb2YgZXZlbnRzIHRvIG9ic2VydmUgaW4gYSBiaXRtYXNrIG9mIE9ic2VydmFibGVFdmVu
dHM6OlR5cGUuCisgIC8vIFRvIGRpc2FibGUgb2JzZXJ2aW5nLCBwYXNzIDAuCisgIC8vIFdpbGwg
Y2FsbCBPbk9ic2VydmFibGVFdmVudHMoKSByZXBlYXRlZGx5IHdoZW5ldmVyIGFuIGV2ZW50IG9m
IGFuIGVuYWJsZWQKKyAgLy8gT2JzZXJ2YWJsZUV2ZW50VHlwZSBvY2N1cnMuCisgIC8vIFRPRE8o
ZXNlY2tsZXIpOiBFeHRlbmQgdGhpcyB0byBzdXBwb3J0IHByb2R1Y2VycyAmIGRhdGEgc291cmNl
cy4KKyAgdmlydHVhbCB2b2lkIE9ic2VydmVFdmVudHModWludDMyX3QgZXZlbnRzX21hc2spID0g
MDsKKworICAvLyBVc2VkIHRvIG9idGFpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGF0YSBzb3Vy
Y2VzIGFuZCBvdGhlciBpbmZvIGFib3V0CisgIC8vIHRoZSB0cmFjaW5nIHNlcnZpY2UuCisgIHVz
aW5nIFF1ZXJ5U2VydmljZVN0YXRlQ2FsbGJhY2sgPQorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lk
KGJvb2wgc3VjY2VzcywgY29uc3QgVHJhY2luZ1NlcnZpY2VTdGF0ZSYpPjsKKyAgdmlydHVhbCB2
b2lkIFF1ZXJ5U2VydmljZVN0YXRlKFF1ZXJ5U2VydmljZVN0YXRlQ2FsbGJhY2spID0gMDsKKwor
ICAvLyBVc2VkIGZvciBmZWF0dXJlIGRldGVjdGlvbi4gTWFrZXMgc2Vuc2Ugb25seSB3aGVuIHRo
ZSBjb25zdW1lciBhbmQgdGhlCisgIC8vIHNlcnZpY2UgdGFsayBvdmVyIElQQyBhbmQgY2FuIGJl
IGZyb20gZGlmZmVyZW50IHZlcnNpb25zLgorICB1c2luZyBRdWVyeUNhcGFiaWxpdGllc0NhbGxi
YWNrID0KKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUcmFjaW5nU2VydmljZUNhcGFi
aWxpdGllcyYpPjsKKyAgdmlydHVhbCB2b2lkIFF1ZXJ5Q2FwYWJpbGl0aWVzKFF1ZXJ5Q2FwYWJp
bGl0aWVzQ2FsbGJhY2spID0gMDsKK307ICAvLyBjbGFzcyBDb25zdW1lckVuZHBvaW50LgorCisv
LyBUaGUgcHVibGljIEFQSSBvZiB0aGUgdHJhY2luZyBTZXJ2aWNlIGJ1c2luZXNzIGxvZ2ljLgor
Ly8KKy8vIEV4cG9zZWQgdG86CisvLyAxLiBUaGUgdHJhbnNwb3J0IGxheWVyIChlLmcuLCBzcmMv
dW5peF9ycGMvdW5peF9zZXJ2aWNlX2hvc3QuY2MpLAorLy8gICAgd2hpY2ggZm9yd2FyZHMgY29t
bWFuZHMgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBwcm9kdWNlciBvciBjb25zdW1lciB0bworLy8g
ICAgdGhlIGFjdHVhbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgorLy8gMi4gVGVzdHMuCisvLwor
Ly8gU3ViY2xhc3NlZCBieToKKy8vICAgVGhlIHNlcnZpY2UgYnVzaW5lc3MgbG9naWMgaW4gc3Jj
L2NvcmUvdHJhY2luZ19zZXJ2aWNlX2ltcGwuY2MuCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJh
Y2luZ1NlcnZpY2UgeworIHB1YmxpYzoKKyAgdXNpbmcgUHJvZHVjZXJFbmRwb2ludCA9IHBlcmZl
dHRvOjpQcm9kdWNlckVuZHBvaW50OworICB1c2luZyBDb25zdW1lckVuZHBvaW50ID0gcGVyZmV0
dG86OkNvbnN1bWVyRW5kcG9pbnQ7CisKKyAgZW51bSBjbGFzcyBQcm9kdWNlclNNQlNjcmFwaW5n
TW9kZSB7CisgICAgLy8gVXNlIHNlcnZpY2UncyBkZWZhdWx0IHNldHRpbmcgZm9yIFNNQiBzY3Jh
cGluZy4gQ3VycmVudGx5LCB0aGUgZGVmYXVsdAorICAgIC8vIG1vZGUgaXMgdG8gZGlzYWJsZSBT
TUIgc2NyYXBpbmcsIGJ1dCB0aGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKyAgICBrRGVm
YXVsdCwKKworICAgIC8vIEVuYWJsZSBzY3JhcGluZyBvZiB1bmNvbW1pdHRlZCBjaHVua3MgaW4g
cHJvZHVjZXJzJyBzaGFyZWQgbWVtb3J5CisgICAgLy8gYnVmZmVycy4KKyAgICBrRW5hYmxlZCwK
KworICAgIC8vIERpc2FibGUgc2NyYXBpbmcgb2YgdW5jb21taXR0ZWQgY2h1bmtzIGluIHByb2R1
Y2Vycycgc2hhcmVkIG1lbW9yeQorICAgIC8vIGJ1ZmZlcnMuCisgICAga0Rpc2FibGVkCisgIH07
CisKKyAgLy8gSW1wbGVtZW50ZWQgaW4gc3JjL2NvcmUvdHJhY2luZ19zZXJ2aWNlX2ltcGwuY2Mg
LgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRyYWNpbmdTZXJ2aWNlPiBDcmVhdGVJbnN0YW5j
ZSgKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnk6OkZhY3Rvcnk+LAorICAgICAg
YmFzZTo6VGFza1J1bm5lciopOworCisgIHZpcnR1YWwgflRyYWNpbmdTZXJ2aWNlKCk7CisKKyAg
Ly8gQ29ubmVjdHMgYSBQcm9kdWNlciBpbnN0YW5jZSBhbmQgb2J0YWlucyBhIFByb2R1Y2VyRW5k
cG9pbnQsIHdoaWNoIGlzCisgIC8vIGVzc2VudGlhbGx5IGEgMToxIGNoYW5uZWwgYmV0d2VlbiBv
bmUgUHJvZHVjZXIgYW5kIHRoZSBTZXJ2aWNlLgorICAvLworICAvLyBUaGUgY2FsbGVyIGhhcyB0
byBndWFyYW50ZWUgdGhhdCB0aGUgcGFzc2VkIFByb2R1Y2VyIHdpbGwgYmUgYWxpdmUgYXMgbG9u
ZworICAvLyBhcyB0aGUgcmV0dXJuZWQgUHJvZHVjZXJFbmRwb2ludCBpcyBhbGl2ZS4gQm90aCB0
aGUgcGFzc2VkIFByb2R1Y2VyIGFuZCB0aGUKKyAgLy8gcmV0dXJuZWQgUHJvZHVjZXJFbmRwb2lu
dCBtdXN0IGxpdmUgb24gdGhlIHNhbWUgdGFzayBydW5uZXIgb2YgdGhlIHNlcnZpY2UsCisgIC8v
IHNwZWNpZmljYWxseToKKyAgLy8gMSkgVGhlIFNlcnZpY2Ugd2lsbCBjYWxsIFByb2R1Y2VyOjoq
IG1ldGhvZHMgb24gdGhlIFNlcnZpY2UncyB0YXNrIHJ1bm5lci4KKyAgLy8gMikgVGhlIFByb2R1
Y2VyIHNob3VsZCBjYWxsIFByb2R1Y2VyRW5kcG9pbnQ6OiogbWV0aG9kcyBvbmx5IG9uIHRoZQor
ICAvLyAgICBzZXJ2aWNlJ3MgdGFzayBydW5uZXIsIGV4Y2VwdCBmb3IgUHJvZHVjZXJFbmRwb2lu
dDo6Q3JlYXRlVHJhY2VXcml0ZXIoKSwKKyAgLy8gICAgd2hpY2ggY2FuIGJlIGNhbGxlZCBvbiBh
bnkgdGhyZWFkLiBUbyBkaXNjb25uZWN0IGp1c3QgZGVzdHJveSB0aGUKKyAgLy8gICAgcmV0dXJu
ZWQgUHJvZHVjZXJFbmRwb2ludCBvYmplY3QuIEl0IGlzIHNhZmUgdG8gZGVzdHJveSB0aGUgUHJv
ZHVjZXIKKyAgLy8gICAgb25jZSB0aGUgUHJvZHVjZXI6Ok9uRGlzY29ubmVjdCgpIGhhcyBiZWVu
IGludm9rZWQuCisgIC8vCisgIC8vIHx1aWR8IGlzIHRoZSB0cnVzdGVkIHVzZXIgaWQgb2YgdGhl
IHByb2R1Y2VyIHByb2Nlc3MsIHVzZWQgYnkgdGhlIGNvbnN1bWVycworICAvLyBmb3IgdmFsaWRh
dGluZyB0aGUgb3JpZ2luIG9mIHRyYWNlIGRhdGEuIHxzaGFyZWRfbWVtb3J5X3NpemVfaGludF9i
eXRlc3wKKyAgLy8gYW5kIHxzaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzfCBhcmUg
b3B0aW9uYWwgaGludHMgb24gdGhlIHNpemUgb2YKKyAgLy8gdGhlIHNoYXJlZCBtZW1vcnkgYnVm
ZmVyIGFuZCBpdHMgcGFnZXMuIFRoZSBzZXJ2aWNlIGNhbiBpZ25vcmUgdGhlIGhpbnRzCisgIC8v
IChlLmcuLCBpZiB0aGUgaGludHMgYXJlIHVucmVhc29uYWJseSBsYXJnZSBvciBvdGhlciBzaXpl
cyB3ZXJlIGNvbmZpZ3VyZWQKKyAgLy8gaW4gYSB0cmFjaW5nIHNlc3Npb24ncyBjb25maWcpLiB8
aW5fcHJvY2Vzc3wgZW5hYmxlcyB0aGUgUHJvZHVjZXJFbmRwb2ludAorICAvLyB0byBtYW5hZ2Ug
aXRzIG93biBzaGFyZWQgbWVtb3J5IGFuZCBlbmFibGVzIHVzZSBvZgorICAvLyB8UHJvZHVjZXJF
bmRwb2ludDo6Q3JlYXRlVHJhY2VXcml0ZXJ8LgorICAvLworICAvLyBUaGUgcHJvZHVjZXIgY2Fu
IG9wdGlvbmFsbHkgcHJvdmlkZSBhIG5vbi1udWxsIHxzaG18LCB3aGljaCB0aGUgc2VydmljZQor
ICAvLyB3aWxsIGFkb3B0IGZvciB0aGUgY29ubmVjdGlvbiB0byB0aGUgcHJvZHVjZXIsIHByb3Zp
ZGVkIGl0IGlzIGNvcnJlY3RseQorICAvLyBzaXplZC4gSW4gdGhpcyBjYXNlLCB8c2hhcmVkX21l
bW9yeV9wYWdlX3NpemVfaGludF9ieXRlc3wgaW5kaWNhdGVzIHRoZQorICAvLyBwYWdlIHNpemUg
dXNlZCBpbiB0aGlzIFNNQi4gVGhlIHByb2R1Y2VyIGNhbiB1c2UgdGhpcyBtZWNoYW5pc20gdG8g
cmVjb3JkCisgIC8vIHRyYWNpbmcgZGF0YSB0byBhbiBTTUIgZXZlbiBiZWZvcmUgdGhlIHRyYWNp
bmcgc2Vzc2lvbiBpcyBzdGFydGVkIGJ5IHRoZQorICAvLyBzZXJ2aWNlLiBUaGlzIGlzIHVzZWQg
aW4gQ2hyb21lIHRvIGltcGxlbWVudCBzdGFydHVwIHRyYWNpbmcuIElmIHRoZSBidWZmZXIKKyAg
Ly8gaXMgaW5jb3JyZWN0bHkgc2l6ZWQsIHRoZSBzZXJ2aWNlIHdpbGwgZGlzY2FyZCB0aGUgU01C
IGFuZCBhbGxvY2F0ZSBhIG5ldworICAvLyBvbmUsIHByb3ZpZGVkIHRvIHRoZSBwcm9kdWNlciB2
aWEgUHJvZHVjZXJFbmRwb2ludDo6c2hhcmVkX21lbW9yeSgpIGFmdGVyCisgIC8vIE9uVHJhY2lu
Z1NldHVwKCkuIFRvIHZlcmlmeSB0aGF0IHRoZSBzZXJ2aWNlIGFjY2VwdGVkIHRoZSBTTUIsIHRo
ZSBwcm9kdWNlcgorICAvLyBtYXkgY2hlY2sgdmlhIFByb2R1Y2VyRW5kcG9pbnQ6OklzU2htZW1Q
cm92aWRlZEJ5UHJvZHVjZXIoKS4gSWYgdGhlIHNlcnZpY2UKKyAgLy8gYWNjZXB0ZWQgdGhlIFNN
QiwgdGhlIHByb2R1Y2VyIGNhbiB0aGVuIGNvbW1pdCBhbnkgZGF0YSB0aGF0IGlzIGFscmVhZHkg
aW4KKyAgLy8gdGhlIFNNQiBhZnRlciB0aGUgdHJhY2luZyBzZXNzaW9uIHdhcyBzdGFydGVkIGJ5
IHRoZSBzZXJ2aWNlIHZpYQorICAvLyBQcm9kdWNlcjo6U3RhcnREYXRhU291cmNlKCkuIFRoZSB8
c2htfCB3aWxsIGFsc28gYmUgcmVqZWN0ZWQgd2hlbgorICAvLyBjb25uZWN0aW5nIHRvIGEgc2Vy
dmljZSB0aGF0IGlzIHRvbyBvbGQgKHByZSBBbmRyb2lkLTExKS4KKyAgLy8KKyAgLy8gQ2FuIHJl
dHVybiBudWxsIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IHNlcnZpY2UgaGFzIHRvbyBtYW55
IHByb2R1Y2VycworICAvLyBjb25uZWN0ZWQuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFBy
b2R1Y2VyRW5kcG9pbnQ+IENvbm5lY3RQcm9kdWNlcigKKyAgICAgIFByb2R1Y2VyKiwKKyAgICAg
IHVpZF90IHVpZCwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgc2l6ZV90
IHNoYXJlZF9tZW1vcnlfc2l6ZV9oaW50X2J5dGVzID0gMCwKKyAgICAgIGJvb2wgaW5fcHJvY2Vz
cyA9IGZhbHNlLAorICAgICAgUHJvZHVjZXJTTUJTY3JhcGluZ01vZGUgc21iX3NjcmFwaW5nX21v
ZGUgPQorICAgICAgICAgIFByb2R1Y2VyU01CU2NyYXBpbmdNb2RlOjprRGVmYXVsdCwKKyAgICAg
IHNpemVfdCBzaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzID0gMCwKKyAgICAgIHN0
ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnk+IHNobSA9IG51bGxwdHIpID0gMDsKKworICAvLyBD
b25uZWN0cyBhIENvbnN1bWVyIGluc3RhbmNlIGFuZCBvYnRhaW5zIGEgQ29uc3VtZXJFbmRwb2lu
dCwgd2hpY2ggaXMKKyAgLy8gZXNzZW50aWFsbHkgYSAxOjEgY2hhbm5lbCBiZXR3ZWVuIG9uZSBD
b25zdW1lciBhbmQgdGhlIFNlcnZpY2UuCisgIC8vIFRoZSBjYWxsZXIgaGFzIHRvIGd1YXJhbnRl
ZSB0aGF0IHRoZSBwYXNzZWQgQ29uc3VtZXIgd2lsbCBiZSBhbGl2ZSBhcyBsb25nCisgIC8vIGFz
IHRoZSByZXR1cm5lZCBDb25zdW1lckVuZHBvaW50IGlzIGFsaXZlLgorICAvLyBUbyBkaXNjb25u
ZWN0IGp1c3QgZGVzdHJveSB0aGUgcmV0dXJuZWQgQ29uc3VtZXJFbmRwb2ludCBvYmplY3QuIEl0
IGlzIHNhZmUKKyAgLy8gdG8gZGVzdHJveSB0aGUgQ29uc3VtZXIgb25jZSB0aGUgQ29uc3VtZXI6
Ok9uRGlzY29ubmVjdCgpIGhhcyBiZWVuIGludm9rZWQuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVf
cHRyPENvbnN1bWVyRW5kcG9pbnQ+IENvbm5lY3RDb25zdW1lcihDb25zdW1lciosCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRf
dCkgPSAwOworCisgIC8vIEVuYWJsZS9kaXNhYmxlIHNjcmFwaW5nIG9mIGNodW5rcyBpbiB0aGUg
c2hhcmVkIG1lbW9yeSBidWZmZXIuIElmIGVuYWJsZWQsCisgIC8vIHRoZSBzZXJ2aWNlIHdpbGwg
Y29weSB1bmNvbW1pdHRlZCBidXQgbm9uLWVtcHR5IGNodW5rcyBmcm9tIHRoZSBTTUIgd2hlbgor
ICAvLyBmbHVzaGluZyAoZS5nLiB0byBoYW5kbGUgdW5yZXNwb25zaXZlIHByb2R1Y2VycyBvciBw
cm9kdWNlcnMgdW5hYmxlIHRvCisgIC8vIGZsdXNoIHRoZWlyIGFjdGl2ZSBjaHVua3MpLCBvbiBw
cm9kdWNlciBkaXNjb25uZWN0IChlLmcuIHRvIHJlY292ZXIgZGF0YQorICAvLyBmcm9tIGNyYXNo
ZWQgcHJvZHVjZXJzKSwgYW5kIGFmdGVyIGRpc2FibGluZyBhIHRyYWNpbmcgc2Vzc2lvbiAoZS5n
LiB0bworICAvLyBnYXRoZXIgZGF0YSBmcm9tIHByb2R1Y2VycyB0aGF0IGRpZG4ndCBzdG9wIHRo
ZWlyIGRhdGEgc291cmNlcyBpbiB0aW1lKS4KKyAgLy8KKyAgLy8gVGhpcyBmZWF0dXJlIGlzIGN1
cnJlbnRseSB1c2VkIGJ5IENocm9tZS4KKyAgdmlydHVhbCB2b2lkIFNldFNNQlNjcmFwaW5nRW5h
YmxlZChib29sIGVuYWJsZWQpID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bwor
CisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdfQ09SRV9UUkFDSU5HX1NF
UlZJQ0VfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3Vy
Y2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy
c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g
YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5v
cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj
YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl
ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor
ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs
YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0
aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdf
Q09SRV9TSEFSRURfTUVNT1JZX0FSQklURVJfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19F
WFRfVFJBQ0lOR19DT1JFX1NIQVJFRF9NRU1PUllfQVJCSVRFUl9IXworCisjaW5jbHVkZSA8c3Rk
ZGVmLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNs
dWRlIDx2ZWN0b3I+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL2Jhc2ljX3R5cGVzLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3Ry
YWNpbmdfc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vdHJhY2luZy9idWZmZXJfZXhoYXVzdGVkX3BvbGljeS5oIgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworCituYW1lc3BhY2UgYmFzZSB7CitjbGFzcyBUYXNrUnVubmVyOworfQorCitj
bGFzcyBTaGFyZWRNZW1vcnk7CitjbGFzcyBUcmFjZVdyaXRlcjsKKworLy8gVXNlZCBieSB0aGUg
UHJvZHVjZXItc2lkZSBvZiB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIHZlbmQgVHJhY2VXcml0ZXJz
CisvLyBmcm9tIHRoZSBTaGFyZWRNZW1vcnkgaXQgcmVjZWl2ZXMgZnJvbSB0aGUgU2VydmljZS1z
aWRlLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFNoYXJlZE1lbW9yeUFyYml0ZXIgeworIHB1Ymxp
YzoKKyAgdmlydHVhbCB+U2hhcmVkTWVtb3J5QXJiaXRlcigpOworCisgIC8vIENyZWF0ZXMgYSBu
ZXcgVHJhY2VXcml0ZXIgYW5kIGFzc2lnbnMgaXQgYSBuZXcgV3JpdGVySUQuIFRoZSBXcml0ZXJJ
RCBpcworICAvLyB3cml0dGVuIGluIGVhY2ggY2h1bmsgaGVhZGVyIG93bmVkIGJ5IGEgZ2l2ZW4g
VHJhY2VXcml0ZXIgYW5kIGlzIHVzZWQgYnkKKyAgLy8gdGhlIFNlcnZpY2UgdG8gcmVjb25zdHJ1
Y3QgVHJhY2VQYWNrZXRzIHdyaXR0ZW4gYnkgdGhlIHNhbWUgVHJhY2VXcml0ZXIuCisgIC8vIFJl
dHVybnMgbnVsbCBpbXBsIG9mIFRyYWNlV3JpdGVyIGlmIGFsbCBXcml0ZXJJRCBzbG90cyBhcmUg
ZXhoYXVzdGVkLiBUaGUKKyAgLy8gd3JpdGVyIHdpbGwgY29tbWl0IHRvIHRoZSBwcm92aWRlZCB8
dGFyZ2V0X2J1ZmZlcnwuIElmIHRoZSBhcmJpdGVyIHdhcworICAvLyBjcmVhdGVkIHZpYSBDcmVh
dGVVbmJvdW5kKCksIG9ubHkgQnVmZmVyRXhoYXVzdGVkUG9saWN5OjprRHJvcCBpcworICAvLyBz
dXBwb3J0ZWQuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFRyYWNlV3JpdGVyPiBDcmVhdGVU
cmFjZVdyaXRlcigKKyAgICAgIEJ1ZmZlcklEIHRhcmdldF9idWZmZXIsCisgICAgICBCdWZmZXJF
eGhhdXN0ZWRQb2xpY3kgYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3kgPQorICAgICAgICAgIEJ1ZmZl
ckV4aGF1c3RlZFBvbGljeTo6a0RlZmF1bHQpID0gMDsKKworICAvLyBDcmVhdGVzIGEgVHJhY2VX
cml0ZXIgdGhhdCB3aWxsIGNvbW1pdCB0byB0aGUgdGFyZ2V0IGJ1ZmZlciB3aXRoIHRoZSBnaXZl
bgorICAvLyByZXNlcnZhdGlvbiBJRCAoY3JlYXRpbmcgYSBuZXcgcmVzZXJ2YXRpb24gZm9yIHRo
aXMgSUQgaWYgbm9uZSBleGlzdHMgeWV0KS4KKyAgLy8gVGhlIGJ1ZmZlciByZXNlcnZhdGlvbiBz
aG91bGQgYmUgYm91bmQgdG8gYW4gYWN0dWFsIEJ1ZmZlcklEIHZpYQorICAvLyBCaW5kU3RhcnR1
cFRhcmdldEJ1ZmZlcigpIG9uY2UgdGhlIGFjdHVhbCBCdWZmZXJJRCBpcyBrbm93bi4gT25seSBz
dXBwb3J0ZWQKKyAgLy8gaWYgdGhlIGFyYml0ZXIgd2FzIGNyZWF0ZWQgdXNpbmcgQ3JlYXRlVW5i
b3VuZCgpLCBhbmQgbWF5IGJlIGNhbGxlZCB3aGlsZQorICAvLyB0aGUgYXJiaXRlciBpcyB1bmJv
dW5kLgorICAvLworICAvLyBXaGlsZSBhbnkgdW5ib3VuZCBidWZmZXIgcmVzZXJ2YXRpb24gZXhp
c3RzLCBhbGwgY29tbWl0cyB3aWxsIGJlIGJ1ZmZlcmVkCisgIC8vIHVudGlsIGFsbCByZXNlcnZh
dGlvbnMgd2VyZSBib3VuZC4gVGh1cywgdW50aWwgYWxsIHJlc2VydmF0aW9ucyBhcmUgYm91bmQs
CisgIC8vIHRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlIFNNQiB3aWxsIG5vdCBiZSBjb25zdW1lZCBi
eSB0aGUgc2VydmljZSAtIHRoZSBTTUIKKyAgLy8gc2l6ZSBzaG91bGQgYmUgY2hvc2VuIHdpdGgg
dGhpcyBpbiBtaW5kLiBTdGFydHVwIHdyaXRlcnMgYWx3YXlzIHVzZQorICAvLyBCdWZmZXJFeGhh
dXN0ZWRQb2xpY3k6OmtEcm9wLCBhcyB3ZSBjYW5ub3QgZmVhc2libHkgc3RhbGwgd2hpbGUgbm90
CisgIC8vIGZsdXNoaW5nIHRvIHRoZSBzZXJ2aWNlLgorICAvLworICAvLyBUaGUgfHRhcmdldF9i
dWZmZXJfcmVzZXJ2YXRpb25faWR8IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCBidXQgY2FuCisg
IC8vIG90aGVyd2lzZSBiZSBmcmVlbHkgY2hvc2VuIGJ5IHRoZSBwcm9kdWNlciBhbmQgaXMgb25s
eSB1c2VkIHRvIHRyYW5zbGF0ZQorICAvLyBwYWNrZXRzIGludG8gdGhlIGFjdHVhbCBidWZmZXIg
aWQgb25jZQorICAvLyBCaW5kU3RhcnR1cFRhcmdldEJ1ZmZlcihyZXNlcnZhdGlvbl9pZCkgaXMg
Y2FsbGVkLiBGb3IgZXhhbXBsZSwgQ2hyb21lIHVzZXMKKyAgLy8gc3RhcnR1cCB0cmFjaW5nIG5v
dCBvbmx5IGZvciB0aGUgZmlyc3QsIGJ1dCBhbHNvIHN1YnNlcXVlbnQgdHJhY2luZworICAvLyBz
ZXNzaW9ucyAodG8gZW5hYmxlIHRyYWNpbmcgaW4gdGhlIGJyb3dzZXIgcHJvY2VzcyBiZWZvcmUg
aXQgaW5zdHJ1Y3RzIHRoZQorICAvLyB0cmFjaW5nIHNlcnZpY2UgdG8gc3RhcnQgdHJhY2luZyBh
c3luY2hyb25vdXNseSwgbWluaW1pemluZyB0cmFjZSBkYXRhIGxvc3MKKyAgLy8gaW4gdGhlIG1l
YW50aW1lKSwgYW5kIGluY3JlbWVudHMgdGhlIHJlc2VydmF0aW9uIElEIGJldHdlZW4gc2Vzc2lv
bnMuCisgIC8vIFNpbWlsYXJseSwgaWYgbW9yZSB0aGFuIGEgc2luZ2xlIHRhcmdldCBidWZmZXIg
cGVyIHNlc3Npb24gaXMgcmVxdWlyZWQKKyAgLy8gKGUuZy4gZm9yIHR3byBkaWZmZXJlbnQgZGF0
YSBzb3VyY2VzKSwgZGlmZmVyZW50IHJlc2VydmF0aW9uIElEcyBzaG91bGQgYmUKKyAgLy8gY2hv
c2VuIGZvciBkaWZmZXJlbnQgdGFyZ2V0cyBidWZmZXJzLgorICB2aXJ0dWFsIHN0ZDo6dW5pcXVl
X3B0cjxUcmFjZVdyaXRlcj4gQ3JlYXRlU3RhcnR1cFRyYWNlV3JpdGVyKAorICAgICAgdWludDE2
X3QgdGFyZ2V0X2J1ZmZlcl9yZXNlcnZhdGlvbl9pZCkgPSAwOworCisgIC8vIFNob3VsZCBvbmx5
IGJlIGNhbGxlZCBvbiB1bmJvdW5kIFNoYXJlZE1lbW9yeUFyYml0ZXJzLiBCaW5kcyB0aGUgYXJi
aXRlciB0bworICAvLyB0aGUgcHJvdmlkZWQgUHJvZHVjZXJFbmRwb2ludCBhbmQgVGFza1J1bm5l
ci4gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UKKyAgLy8gYW5kIG9uIHRoZSBwcm92aWRlZCB8
VGFza1J1bm5lcnwuIFVzdWFsbHkgY2FsbGVkIGJ5IHRoZSBwcm9kdWNlciAoaS5lLiwgbm8KKyAg
Ly8gc3BlY2lmaWMgZGF0YSBzb3VyY2UpIG9uY2UgaXQgY29ubmVjdHMgdG8gdGhlIHNlcnZpY2Uu
IEJvdGggdGhlIGVuZHBvaW50CisgIC8vIGFuZCB0YXNrIHJ1bm5lciBzaG91bGQgcmVtYWluIHZh
bGlkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmJpdGVyJ3MKKyAgLy8gbGlmZXRpbWUuCisg
IHZpcnR1YWwgdm9pZCBCaW5kVG9Qcm9kdWNlckVuZHBvaW50KFRyYWNpbmdTZXJ2aWNlOjpQcm9k
dWNlckVuZHBvaW50KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFz
ZTo6VGFza1J1bm5lciopID0gMDsKKworICAvLyBCaW5kcyBjb21taXRzIGZyb20gVHJhY2VXcml0
ZXJzIGNyZWF0ZWQgdmlhIENyZWF0ZVN0YXJ0dXBUcmFjZVdyaXRlcigpIHdpdGgKKyAgLy8gdGhl
IGdpdmVuIHx0YXJnZXRfYnVmZmVyX3Jlc2VydmF0aW9uX2lkfCB0byB8dGFyZ2V0X2J1ZmZlcl9p
ZHwuIE1heSBvbmx5IGJlCisgIC8vIGNhbGxlZCBvbmNlIHBlciB8dGFyZ2V0X2J1ZmZlcl9yZXNl
cnZhdGlvbl9pZHwuIFNob3VsZCBiZSBjYWxsZWQgb24gdGhlCisgIC8vIGFyYml0ZXIncyBUYXNr
UnVubmVyLCBhbmQgYWZ0ZXIgQmluZFRvUHJvZHVjZXJFbmRwb2ludCgpIHdhcyBjYWxsZWQuCisg
IC8vIFVzdWFsbHksIGl0IGlzIGNhbGxlZCBieSBhIHNwZWNpZmljIGRhdGEgc291cmNlLCBhZnRl
ciBpdCByZWNlaXZlZCBpdHMKKyAgLy8gY29uZmlndXJhdGlvbiAoaW5jbHVkaW5nIHRoZSB0YXJn
ZXQgYnVmZmVyIElEKSBmcm9tIHRoZSBzZXJ2aWNlLgorICB2aXJ0dWFsIHZvaWQgQmluZFN0YXJ0
dXBUYXJnZXRCdWZmZXIodWludDE2X3QgdGFyZ2V0X2J1ZmZlcl9yZXNlcnZhdGlvbl9pZCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklEIHRhcmdldF9idWZm
ZXJfaWQpID0gMDsKKworICAvLyBUcmVhdCB0aGUgcmVzZXJ2YXRpb24gYXMgcmVzb2x2ZWQgdG8g
YW4gaW52YWxpZCBidWZmZXIuIENvbW1pdHMgZm9yIHRoaXMKKyAgLy8gcmVzZXJ2YXRpb24gd2ls
bCBiZSBmbHVzaGVkIHRvIHRoZSBzZXJ2aWNlIEFTQVAuIFRoZSBzZXJ2aWNlIHdpbGwgZnJlZQor
ICAvLyBjb21taXR0ZWQgY2h1bmtzIGJ1dCBvdGhlcndpc2UgaWdub3JlIHRoZW0uIFRoZSBwcm9k
dWNlciBjYW4gY2FsbCB0aGlzCisgIC8vIG1ldGhvZCwgZm9yIGV4YW1wbGUsIGlmIGNvbm5lY3Rp
b24gdG8gdGhlIHRyYWNpbmcgc2VydmljZSBmYWlsZWQgb3IgdGhlCisgIC8vIHNlc3Npb24gd2Fz
IHN0b3BwZWQgY29uY3VycmVudGx5IGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNo
ZWQuCisgIHZpcnR1YWwgdm9pZCBBYm9ydFN0YXJ0dXBUcmFjaW5nRm9yUmVzZXJ2YXRpb24oCisg
ICAgICB1aW50MTZfdCB0YXJnZXRfYnVmZmVyX3Jlc2VydmF0aW9uX2lkKSA9IDA7CisKKyAgLy8g
Tm90aWZpZXMgdGhlIHNlcnZpY2UgdGhhdCBhbGwgZGF0YSBmb3IgdGhlIGdpdmVuIEZsdXNoUmVx
dWVzdElEIGhhcyBiZWVuCisgIC8vIGNvbW1pdHRlZCBpbiB0aGUgc2hhcmVkIG1lbW9yeSBidWZm
ZXIuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZSBib3VuZC4KKyAgdmlydHVhbCB2b2lkIE5v
dGlmeUZsdXNoQ29tcGxldGUoRmx1c2hSZXF1ZXN0SUQpID0gMDsKKworICAvLyBDcmVhdGUgYSBi
b3VuZCBhcmJpdGVyIGluc3RhbmNlLiBBcmdzOgorICAvLyB8U2hhcmVkTWVtb3J5fDogdGhlIHNo
YXJlZCBtZW1vcnkgYnVmZmVyIHRvIHVzZS4KKyAgLy8gfHBhZ2Vfc2l6ZXw6IGEgbXVsdGlwbGUg
b2YgNEtCIHRoYXQgZGVmaW5lcyB0aGUgZ3JhbnVsYXJpdHkgb2YgdHJhY2luZworICAvLyBwYWdl
cy4gU2VlIHRyYWRlb2ZmIGNvbnNpZGVyYXRpb25zIGluIHNoYXJlZF9tZW1vcnlfYWJpLmguCisg
IC8vIHxQcm9kdWNlckVuZHBvaW50fDogVGhlIHNlcnZpY2UncyBwcm9kdWNlciBlbmRwb2ludCB1
c2VkIGUuZy4gdG8gY29tbWl0CisgIC8vIGNodW5rcyBhbmQgcmVnaXN0ZXIgdHJhY2Ugd3JpdGVy
cy4KKyAgLy8gfFRhc2tSdW5uZXJ8OiBUYXNrIHJ1bm5lciBmb3IgcGVyZmV0dG8ncyBtYWluIHRo
cmVhZCwgd2hpY2ggZXhlY3V0ZXMgdGhlCisgIC8vIE9uUGFnZXNDb21wbGV0ZUNhbGxiYWNrIGFu
ZCBJUEMgY2FsbHMgdG8gdGhlIHxQcm9kdWNlckVuZHBvaW50fC4KKyAgLy8KKyAgLy8gSW1wbGVt
ZW50ZWQgaW4gc3JjL2NvcmUvc2hhcmVkX21lbW9yeV9hcmJpdGVyX2ltcGwuY2MuCisgIHN0YXRp
YyBzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5QXJiaXRlcj4gQ3JlYXRlSW5zdGFuY2UoCisg
ICAgICBTaGFyZWRNZW1vcnkqLAorICAgICAgc2l6ZV90IHBhZ2Vfc2l6ZSwKKyAgICAgIFRyYWNp
bmdTZXJ2aWNlOjpQcm9kdWNlckVuZHBvaW50KiwKKyAgICAgIGJhc2U6OlRhc2tSdW5uZXIqKTsK
KworICAvLyBDcmVhdGUgYW4gdW5ib3VuZCBhcmJpdGVyIGluc3RhbmNlLCB3aGljaCBzaG91bGQg
bGF0ZXIgYmUgYm91bmQgdG8gYQorICAvLyBQcm9kdWNlckVuZHBvaW50IGFuZCBUYXNrUnVubmVy
IGJ5IGNhbGxpbmcgQmluZFRvUHJvZHVjZXJFbmRwb2ludCgpLiBUaGUKKyAgLy8gcmV0dXJuZWQg
YXJiaXRlciB3aWxsIE9OTFkgc3VwcG9ydCB0cmFjZSB3cml0ZXJzIHdpdGgKKyAgLy8gQnVmZmVy
RXhoYXVzdGVkUG9saWN5OjprRHJvcC4KKyAgLy8KKyAgLy8gQW4gdW5ib3VuZCBTaGFyZWRNZW1v
cnlBcmJpdGVyIGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRvIGEgcHJvZHVjZXItY3JlYXRlZAorICAv
LyBTaGFyZWRNZW1vcnkgYnVmZmVyIGJlZm9yZSB0aGUgcHJvZHVjZXIgY29ubmVjdHMgdG8gdGhl
IHRyYWNpbmcgc2VydmljZS4KKyAgLy8gVGhlIHByb2R1Y2VyIGNhbiB0aGVuIHBhc3MgdGhpcyBT
TUIgdG8gdGhlIHNlcnZpY2Ugd2hlbiBpdCBjb25uZWN0cyAoc2VlCisgIC8vIFRyYWNpbmdTZXJ2
aWNlOjpDb25uZWN0UHJvZHVjZXIpLgorICAvLworICAvLyBUbyB0cmFjZSBpbnRvIHRoZSBTTUIg
YmVmb3JlIHRoZSBzZXJ2aWNlIHN0YXJ0cyB0aGUgdHJhY2luZyBzZXNzaW9uLCB0cmFjZQorICAv
LyB3cml0ZXJzIGNhbiBiZSBvYnRhaW5lZCB2aWEgQ3JlYXRlU3RhcnR1cFRyYWNlV3JpdGVyKCkg
YW5kIGxhdGVyIGFzc29jaWF0ZWQKKyAgLy8gd2l0aCBhIHRhcmdldCBidWZmZXIgdmlhIEJpbmRT
dGFydHVwVGFyZ2V0QnVmZmVyKCksIG9uY2UgdGhlIHRhcmdldCBidWZmZXIKKyAgLy8gaXMga25v
d24uCisgIC8vCisgIC8vIEltcGxlbWVudGVkIGluIHNyYy9jb3JlL3NoYXJlZF9tZW1vcnlfYXJi
aXRlcl9pbXBsLmNjLiBTZWUgQ3JlYXRlSW5zdGFuY2UoKQorICAvLyBmb3IgY29tbWVudHMgYWJv
dXQgdGhlIGFyZ3VtZW50cy4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnlB
cmJpdGVyPiBDcmVhdGVVbmJvdW5kSW5zdGFuY2UoCisgICAgICBTaGFyZWRNZW1vcnkqLAorICAg
ICAgc2l6ZV90IHBhZ2Vfc2l6ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKwor
I2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0NPUkVfU0hBUkVEX01FTU9S
WV9BUkJJVEVSX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4g
U291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2Us
IFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp
bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0
YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFj
aGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFw
cGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJp
YnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJ
UywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRo
ZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lm
aWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5k
ZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTUkNfVFJBQ0lOR19DT1JFX1NIQVJFRF9N
RU1PUllfQVJCSVRFUl9JTVBMX0hfCisjZGVmaW5lIFNSQ19UUkFDSU5HX0NPUkVfU0hBUkVEX01F
TU9SWV9BUkJJVEVSX0lNUExfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8
ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUg
PG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2Uvd2Vha19wdHIuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvYmFzaWNf
dHlwZXMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2V4dC90cmFjaW5nL2NvcmUvc2hhcmVkX21lbW9yeV9hYmkuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvc2hhcmVkX21l
bW9yeV9hcmJpdGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by90cmFjaW5nL2NvcmUvZm9yd2FyZF9kZWNscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAic3JjL3RyYWNpbmcvY29yZS9pZF9hbGxvY2F0b3IuaCIKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKKworY2xhc3MgUGF0Y2hMaXN0OworY2xhc3MgVHJhY2VXcml0
ZXI7CitjbGFzcyBUcmFjZVdyaXRlckltcGw7CisKK25hbWVzcGFjZSBiYXNlIHsKK2NsYXNzIFRh
c2tSdW5uZXI7Cit9ICAvLyBuYW1lc3BhY2UgYmFzZQorCisvLyBUaGlzIGNsYXNzIGhhbmRsZXMg
dGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyIG9uIHRoZSBwcm9kdWNlciBzaWRlLiBJdCBpcyB1c2Vk
CisvLyB0byBvYnRhaW4gdGhyZWFkLWxvY2FsIGNodW5rcyBhbmQgdG8gcGFydGl0aW9uIHBhZ2Vz
IGZyb20gc2V2ZXJhbCB0aHJlYWRzLgorLy8gVGhlcmUgaXMgb25lIGFyYml0ZXIgaW5zdGFuY2Ug
cGVyIFByb2R1Y2VyLgorLy8gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZSBhbmQgdXNlcyBsb2Nr
cyB0byBkbyBzby4gRGF0YSBzb3VyY2VzIGFyZSBzdXBwb3NlZAorLy8gdG8gaW50ZXJhY3Qgd2l0
aCB0aGlzIHNwb3JhZGljYWxseSwgb25seSB3aGVuIHRoZXkgcnVuIG91dCBvZiBzcGFjZSBvbiB0
aGVpcgorLy8gY3VycmVudCB0aHJlYWQtbG9jYWwgY2h1bmsuCisvLworLy8gV2hlbiB0aGUgYXJi
aXRlciBpcyBjcmVhdGVkIHVzaW5nIENyZWF0ZVVuYm91bmRJbnN0YW5jZSgpLCB0aGUgZm9sbG93
aW5nCisvLyBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgcG9zc2libGU6CisvLworLy8gICBbICFmdWxs
eV9ib3VuZF8sICFlbmRwb2ludF8sIDAgdW5ib3VuZCBidWZmZXIgcmVzZXJ2YXRpb25zIF0KKy8v
ICAgICAgIHwgICAgIHwKKy8vICAgICAgIHwgICAgIHwgQ3JlYXRlU3RhcnR1cFRyYWNlV3JpdGVy
KGJ1ZikKKy8vICAgICAgIHwgICAgIHwgIGJ1ZmZlciByZXNlcnZhdGlvbnMgKz0gYnVmCisvLyAg
ICAgICB8ICAgICB8CisvLyAgICAgICB8ICAgICB8ICAgICAgICAgICAgIC0tLS0KKy8vICAgICAg
IHwgICAgIHwgICAgICAgICAgICB8ICAgIHwgQ3JlYXRlU3RhcnR1cFRyYWNlV3JpdGVyKGJ1ZikK
Ky8vICAgICAgIHwgICAgIHwgICAgICAgICAgICB8ICAgIHwgIGJ1ZmZlciByZXNlcnZhdGlvbnMg
Kz0gYnVmCisvLyAgICAgICB8ICAgICBWICAgICAgICAgICAgfCAgICBWCisvLyAgICAgICB8ICAg
WyAhZnVsbHlfYm91bmRfLCAhZW5kcG9pbnRfLCA+PTEgdW5ib3VuZCBidWZmZXIgcmVzZXJ2YXRp
b25zIF0KKy8vICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB8CisvLyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICBCaW5kVG9Qcm9kdWNl
ckVuZHBvaW50KCkgfAorLy8gICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHwKKy8vICAgICAgIHwgQmluZFRvUHJvZHVjZXJFbmRwb2ludCgpICAg
ICAgICAgICAgICAgICAgICAgICB8CisvLyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVgorLy8gICAgICAgfCAgIFsgIWZ1bGx5X2JvdW5kXywg
ZW5kcG9pbnRfLCA+PTEgdW5ib3VuZCBidWZmZXIgcmVzZXJ2YXRpb25zIF0KKy8vICAgICAgIHwg
ICBBICAgIHwgICAgQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBBCisvLyAg
ICAgICB8ICAgfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAg
fAorLy8gICAgICAgfCAgIHwgICAgIC0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHwgICAgIHwKKy8vICAgICAgIHwgICB8ICAgIENyZWF0ZVN0YXJ0dXBUcmFjZVdyaXRlcihidWYp
ICAgICAgICB8ICAgICB8CisvLyAgICAgICB8ICAgfCAgICAgYnVmZmVyIHJlc2VydmF0aW9ucyAr
PSBidWYgICAgICAgICAgfCAgICAgfAorLy8gICAgICAgfCAgIHwgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKKy8vICAgICAgIHwgICB8IENyZWF0ZVN0YXJ0
dXBUcmFjZVdyaXRlcihidWYpICAgICAgICAgICB8ICAgICB8CisvLyAgICAgICB8ICAgfCAgd2hl
cmUgYnVmIGlzIG5vdCB5ZXQgYm91bmQgICAgICAgICAgICAgfCAgICAgfAorLy8gICAgICAgfCAg
IHwgIGJ1ZmZlciByZXNlcnZhdGlvbnMgKz0gYnVmICAgICAgICAgICAgIHwgICAgIHwgKHllcykK
Ky8vICAgICAgIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8
ICAgICB8CisvLyAgICAgICB8ICAgfCAgICAgICAgQmluZFN0YXJ0dXBUYXJnZXRCdWZmZXIoYnVm
LCBpZCkgfC0tLS0tCisvLyAgICAgICB8ICAgfCAgICAgICAgICAgYnVmZmVyIHJlc2VydmF0aW9u
cyAtPSBidWYgICAgfCByZXNlcnZhdGlvbnMgPiAwPworLy8gICAgICAgfCAgIHwgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgIHwgICB8ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChubykKKy8vICAgICAgIFYgICB8ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisvLyAgICAgICBbIGZ1bGx5
X2JvdW5kXywgZW5kcG9pbnRfLCAwIHVuYm91bmQgYnVmZmVyIHJlc2VydmF0aW9ucyBdCisvLyAg
ICAgICAgICB8ICAgIEEKKy8vICAgICAgICAgIHwgICAgfCBDcmVhdGVTdGFydHVwVHJhY2VXcml0
ZXIoYnVmKQorLy8gICAgICAgICAgfCAgICB8ICB3aGVyZSBidWYgaXMgYWxyZWFkeSBib3VuZAor
Ly8gICAgICAgICAgIC0tLS0KK2NsYXNzIFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsIDogcHVibGlj
IFNoYXJlZE1lbW9yeUFyYml0ZXIgeworIHB1YmxpYzoKKyAgLy8gU2VlIFNoYXJlZE1lbW9yeUFy
Yml0ZXI6OkNyZWF0ZUluc3RhbmNlKCkuIHxzdGFydHwsIHxzaXplfCBkZWZpbmUgdGhlCisgIC8v
IGJvdW5kYXJpZXMgb2YgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyLiBQcm9kdWNlckVuZHBvaW50
IGFuZCBUYXNrUnVubmVyIG1heQorICAvLyBiZSB8bnVsbHB0cnwgaWYgY3JlYXRlZCB1bmJvdW5k
LCBzZWUKKyAgLy8gU2hhcmVkTWVtb3J5QXJiaXRlcjo6Q3JlYXRlVW5ib3VuZEluc3RhbmNlKCku
CisgIFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsKHZvaWQqIHN0YXJ0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90
IHBhZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2luZ1NlcnZpY2U6OlBy
b2R1Y2VyRW5kcG9pbnQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUYXNrUnVu
bmVyKik7CisKKyAgLy8gUmV0dXJucyBhIG5ldyBDaHVuayB0byB3cml0ZSB0cmFjaW5nIGRhdGEu
IERlcGVuZGluZyBvbiB0aGUgcHJvdmlkZWQKKyAgLy8gQnVmZmVyRXhoYXVzdGVkUG9saWN5LCB0
aGlzIG1heSByZXR1cm4gYW4gaW52YWxpZCBjaHVuayBpZiBubyB2YWxpZCBmcmVlCisgIC8vIGNo
dW5rIGNvdWxkIGJlIGZvdW5kIGluIHRoZSBTTUIuCisgIFNoYXJlZE1lbW9yeUFCSTo6Q2h1bmsg
R2V0TmV3Q2h1bmsoY29uc3QgU2hhcmVkTWVtb3J5QUJJOjpDaHVua0hlYWRlciYsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX2hpbnQgPSAwKTsK
KworICAvLyBQdXRzIGJhY2sgYSBDaHVuayB0aGF0IGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgc2Vu
ZHMgYSByZXF1ZXN0IHRvIHRoZQorICAvLyBzZXJ2aWNlIHRvIG1vdmUgaXQgdG8gdGhlIGNlbnRy
YWwgdHJhY2luZyBidWZmZXIuIHx0YXJnZXRfYnVmZmVyfCBpcyB0aGUKKyAgLy8gYWJzb2x1dGUg
dHJhY2UgYnVmZmVyIElEIHdoZXJlIHRoZSBzZXJ2aWNlIHNob3VsZCBtb3ZlIHRoZSBjaHVuayBv
bnRvICh0aGUKKyAgLy8gcHJvZHVjZXIgaXMganVzdCB0byBjb3B5IGJhY2sgdGhlIHNhbWUgbnVt
YmVyIHJlY2VpdmVkIGluIHRoZQorICAvLyBEYXRhU291cmNlQ29uZmlnIHVwb24gdGhlIFN0YXJ0
RGF0YVNvdXJjZSgpIHJlcXVlcykuCisgIC8vIFBhdGNoTGlzdCBpcyBhIHBvaW50ZXIgdG8gdGhl
IGxpc3Qgb2YgcGF0Y2hlcyBmb3IgcHJldmlvdXMgY2h1bmtzLiBUaGUKKyAgLy8gZmlyc3QgcGF0
Y2hlZCBlbnRyaWVzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBwYXRjaGVkIGxpc3QgYW5kIHNl
bnQgb3ZlcgorICAvLyB0byB0aGUgc2VydmljZSBpbiB0aGUgc2FtZSBDb21taXREYXRhKCkgSVBD
IHJlcXVlc3QuCisgIHZvaWQgUmV0dXJuQ29tcGxldGVkQ2h1bmsoU2hhcmVkTWVtb3J5QUJJOjpD
aHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXliZVVuYm91bmRCdWZmZXJJRCB0
YXJnZXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoTGlzdCopOwor
CisgIC8vIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2aWNlIHRvIGFwcGx5IGNvbXBsZXRlZCBw
YXRjaGVzIGZyb20gfHBhdGNoX2xpc3R8LgorICAvLyB8d3JpdGVyX2lkfCBpcyB0aGUgSUQgb2Yg
dGhlIFRyYWNlV3JpdGVyIHRoYXQgY2FsbHMgdGhpcyBtZXRob2QsCisgIC8vIHx0YXJnZXRfYnVm
ZmVyfCBpcyB0aGUgZ2xvYmFsIHRyYWNlIGJ1ZmZlciBJRCBvZiBpdHMgdGFyZ2V0IGJ1ZmZlci4K
KyAgdm9pZCBTZW5kUGF0Y2hlcyhXcml0ZXJJRCB3cml0ZXJfaWQsCisgICAgICAgICAgICAgICAg
ICAgTWF5YmVVbmJvdW5kQnVmZmVySUQgdGFyZ2V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAg
ICBQYXRjaExpc3QqIHBhdGNoX2xpc3QpOworCisgIC8vIEZvcmNlcyBhIHN5bmNocm9ub3VzIGNv
bW1pdCBvZiB0aGUgY29tcGxldGVkIHBhY2tldHMgd2l0aG91dCB3YWl0aW5nIGZvcgorICAvLyB0
aGUgbmV4dCB0YXNrLgorICB2b2lkIEZsdXNoUGVuZGluZ0NvbW1pdERhdGFSZXF1ZXN0cyhzdGQ6
OmZ1bmN0aW9uPHZvaWQoKT4gY2FsbGJhY2sgPSB7fSk7CisKKyAgU2hhcmVkTWVtb3J5QUJJKiBz
aG1lbV9hYmlfZm9yX3Rlc3RpbmcoKSB7IHJldHVybiAmc2htZW1fYWJpXzsgfQorCisgIHN0YXRp
YyB2b2lkIHNldF9kZWZhdWx0X2xheW91dF9mb3JfdGVzdGluZyhTaGFyZWRNZW1vcnlBQkk6OlBh
Z2VMYXlvdXQgbCkgeworICAgIGRlZmF1bHRfcGFnZV9sYXlvdXQgPSBsOworICB9CisKKyAgLy8g
U2hhcmVkTWVtb3J5QXJiaXRlciBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gU2VlIGluY2x1ZGUvcGVy
ZmV0dG8vdHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnlfYXJiaXRlci5oIGZvciBjb21tZW50cy4K
KyAgc3RkOjp1bmlxdWVfcHRyPFRyYWNlV3JpdGVyPiBDcmVhdGVUcmFjZVdyaXRlcigKKyAgICAg
IEJ1ZmZlcklEIHRhcmdldF9idWZmZXIsCisgICAgICBCdWZmZXJFeGhhdXN0ZWRQb2xpY3kgPSBC
dWZmZXJFeGhhdXN0ZWRQb2xpY3k6OmtEZWZhdWx0KSBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVf
cHRyPFRyYWNlV3JpdGVyPiBDcmVhdGVTdGFydHVwVHJhY2VXcml0ZXIoCisgICAgICB1aW50MTZf
dCB0YXJnZXRfYnVmZmVyX3Jlc2VydmF0aW9uX2lkKSBvdmVycmlkZTsKKyAgdm9pZCBCaW5kVG9Q
cm9kdWNlckVuZHBvaW50KFRyYWNpbmdTZXJ2aWNlOjpQcm9kdWNlckVuZHBvaW50KiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRhc2tSdW5uZXIqKSBvdmVycmlkZTsKKyAg
dm9pZCBCaW5kU3RhcnR1cFRhcmdldEJ1ZmZlcih1aW50MTZfdCB0YXJnZXRfYnVmZmVyX3Jlc2Vy
dmF0aW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklEIHRhcmdl
dF9idWZmZXJfaWQpIG92ZXJyaWRlOworICB2b2lkIEFib3J0U3RhcnR1cFRyYWNpbmdGb3JSZXNl
cnZhdGlvbigKKyAgICAgIHVpbnQxNl90IHRhcmdldF9idWZmZXJfcmVzZXJ2YXRpb25faWQpIG92
ZXJyaWRlOworICB2b2lkIE5vdGlmeUZsdXNoQ29tcGxldGUoRmx1c2hSZXF1ZXN0SUQpIG92ZXJy
aWRlOworCisgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyKCkgY29uc3QgeyByZXR1cm4g
dGFza19ydW5uZXJfOyB9CisgIHNpemVfdCBwYWdlX3NpemUoKSBjb25zdCB7IHJldHVybiBzaG1l
bV9hYmlfLnBhZ2Vfc2l6ZSgpOyB9CisgIHNpemVfdCBudW1fcGFnZXMoKSBjb25zdCB7IHJldHVy
biBzaG1lbV9hYmlfLm51bV9wYWdlcygpOyB9CisKKyAgYmFzZTo6V2Vha1B0cjxTaGFyZWRNZW1v
cnlBcmJpdGVySW1wbD4gR2V0V2Vha1B0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gd2Vha19wdHJf
ZmFjdG9yeV8uR2V0V2Vha1B0cigpOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3Mg
VHJhY2VXcml0ZXJJbXBsOworICBmcmllbmQgY2xhc3MgU3RhcnR1cFRyYWNlV3JpdGVyVGVzdDsK
KyAgZnJpZW5kIGNsYXNzIFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsVGVzdDsKKworICBzdHJ1Y3Qg
VGFyZ2V0QnVmZmVyUmVzZXJ2YXRpb24geworICAgIGJvb2wgcmVzb2x2ZWQgPSBmYWxzZTsKKyAg
ICBCdWZmZXJJRCB0YXJnZXRfYnVmZmVyID0ga0ludmFsaWRCdWZmZXJJZDsKKyAgfTsKKworICAv
LyBQbGFjZWhvbGRlciBmb3IgdGhlIGFjdHVhbCB0YXJnZXQgYnVmZmVyIElEIG9mIGEgc3RhcnR1
cCB0YXJnZXQgYnVmZmVyCisgIC8vIHJlc2VydmF0aW9uIElEIGluIHx0YXJnZXRfYnVmZmVyX3Jl
c2VydmF0aW9uc198LgorICBzdGF0aWMgY29uc3RleHByIEJ1ZmZlcklEIGtJbnZhbGlkQnVmZmVy
SWQgPSAwOworCisgIHN0YXRpYyBTaGFyZWRNZW1vcnlBQkk6OlBhZ2VMYXlvdXQgZGVmYXVsdF9w
YWdlX2xheW91dDsKKworICBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbChjb25zdCBTaGFyZWRNZW1v
cnlBcmJpdGVySW1wbCYpID0gZGVsZXRlOworICBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbCYgb3Bl
cmF0b3I9KGNvbnN0IFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsJikgPSBkZWxldGU7CisKKyAgdm9p
ZCBVcGRhdGVDb21taXREYXRhUmVxdWVzdChTaGFyZWRNZW1vcnlBQkk6OkNodW5rIGNodW5rLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlcklEIHdyaXRlcl9pZCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBNYXliZVVuYm91bmRCdWZmZXJJRCB0YXJnZXRfYnVm
ZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoTGlzdCogcGF0Y2hfbGlz
dCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFRyYWNlV3JpdGVyPiBDcmVhdGVUcmFjZVdyaXRlcklu
dGVybmFsKAorICAgICAgTWF5YmVVbmJvdW5kQnVmZmVySUQgdGFyZ2V0X2J1ZmZlciwKKyAgICAg
IEJ1ZmZlckV4aGF1c3RlZFBvbGljeSk7CisKKyAgLy8gQ2FsbGVkIGJ5IHRoZSBUcmFjZVdyaXRl
ciBkZXN0cnVjdG9yLgorICB2b2lkIFJlbGVhc2VXcml0ZXJJRChXcml0ZXJJRCk7CisKKyAgdm9p
ZCBCaW5kU3RhcnR1cFRhcmdldEJ1ZmZlckltcGwoc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4
PiBzY29wZWRfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2
X3QgdGFyZ2V0X2J1ZmZlcl9yZXNlcnZhdGlvbl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgQnVmZmVySUQgdGFyZ2V0X2J1ZmZlcl9pZCk7CisKKyAgLy8gSWYgYW55IGZs
dXNoIGNhbGxiYWNrcyB3ZXJlIHF1ZXVlZCB1cCB3aGlsZSB0aGUgYXJiaXRlciBvciBhbnkgdGFy
Z2V0CisgIC8vIGJ1ZmZlciByZXNlcnZhdGlvbiB3YXMgdW5ib3VuZCwgdGhpcyB3cmFwcyB0aGUg
cGVuZGluZyBjYWxsYmFja3MgaW50byBhIG5ldworICAvLyBzdGQ6OmZ1bmN0aW9uIGFuZCByZXR1
cm5zIGl0LiBPdGhlcndpc2UgcmV0dXJucyBhbiBpbnZhbGlkIHN0ZDo6ZnVuY3Rpb24uCisgIHN0
ZDo6ZnVuY3Rpb248dm9pZCgpPiBUYWtlUGVuZGluZ0ZsdXNoQ2FsbGJhY2tzTG9ja2VkKCk7CisK
KyAgLy8gUmVwbGFjZSBvY2N1cnJlbmNlcyBvZiB0YXJnZXQgYnVmZmVyIHJlc2VydmF0aW9uIElE
cyBpbiB8Y29tbWl0X2RhdGFfcmVxX3wKKyAgLy8gd2l0aCB0aGVpciByZXNwZWN0aXZlIGFjdHVh
bCBCdWZmZXJJRHMgaWYgdGhleSB3ZXJlIGFscmVhZHkgYm91bmQuIFJldHVybnMKKyAgLy8gdHJ1
ZSBpZmYgYWxsIG9jY3VycmVuY2VzIHdlcmUgcmVwbGFjZWQuCisgIGJvb2wgUmVwbGFjZUNvbW1p
dFBsYWNlaG9sZGVyQnVmZmVySWRzTG9ja2VkKCk7CisKKyAgLy8gVXBkYXRlIGFuZCByZXR1cm4g
fGZ1bGx5X2JvdW5kX3wgYmFzZWQgb24gdGhlIGFyYml0ZXIncyB8cGVuZGluZ193cml0ZXJzX3wK
KyAgLy8gc3RhdGUuCisgIGJvb2wgVXBkYXRlRnVsbHlCb3VuZExvY2tlZCgpOworCisgIGNvbnN0
IGJvb2wgaW5pdGlhbGx5X2JvdW5kXzsKKyAgLy8gT25seSBhY2Nlc3NlZCBvbiB8dGFza19ydW5u
ZXJffCBhZnRlciB0aGUgcHJvZHVjZXIgZW5kcG9pbnQgd2FzIGJvdW5kLgorICBUcmFjaW5nU2Vy
dmljZTo6UHJvZHVjZXJFbmRwb2ludCogcHJvZHVjZXJfZW5kcG9pbnRfID0gbnVsbHB0cjsKKwor
ICAvLyAtLS0gQmVnaW4gbG9jay1wcm90ZWN0ZWQgbWVtYmVycyAtLS0KKworICBzdGQ6Om11dGV4
IGxvY2tfOworCisgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyXyA9IG51bGxwdHI7Cisg
IFNoYXJlZE1lbW9yeUFCSSBzaG1lbV9hYmlfOworICBzaXplX3QgcGFnZV9pZHhfID0gMDsKKyAg
c3RkOjp1bmlxdWVfcHRyPENvbW1pdERhdGFSZXF1ZXN0PiBjb21taXRfZGF0YV9yZXFfOworICBz
aXplX3QgYnl0ZXNfcGVuZGluZ19jb21taXRfID0gMDsgIC8vIFNVTShjaHVuay5zaXplKCkgOiBj
b21taXRfZGF0YV9yZXFfKS4KKyAgSWRBbGxvY2F0b3I8V3JpdGVySUQ+IGFjdGl2ZV93cml0ZXJf
aWRzXzsKKworICAvLyBXaGV0aGVyIHRoZSBhcmJpdGVyIGl0c2VsZiBhbmQgYWxsIHN0YXJ0dXAg
dGFyZ2V0IGJ1ZmZlciByZXNlcnZhdGlvbnMgYXJlCisgIC8vIGJvdW5kLiBOb3RlIHRoYXQgdGhp
cyBjYW4gYmVjb21lIGZhbHNlIGFnYWluIGxhdGVyIGlmIGEgbmV3IHRhcmdldCBidWZmZXIKKyAg
Ly8gcmVzZXJ2YXRpb24gaXMgY3JlYXRlZCBieSBjYWxsaW5nIENyZWF0ZVN0YXJ0dXBUcmFjZVdy
aXRlcigpIHdpdGggYSBuZXcKKyAgLy8gcmVzZXJ2YXRpb24gaWQuCisgIGJvb2wgZnVsbHlfYm91
bmRfOworCisgIC8vIElEcyBvZiB3cml0ZXJzIGFuZCB0aGVpciBhc3NpZ25lZCB0YXJnZXQgYnVm
ZmVycyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkCisgIC8vIHdpdGggdGhlIHNlcnZpY2UgYWZ0
ZXIgdGhlIGFyYml0ZXIgYW5kL29yIHRoZWlyIHN0YXJ0dXAgdGFyZ2V0IGJ1ZmZlciBpcworICAv
LyBib3VuZC4KKyAgc3RkOjptYXA8V3JpdGVySUQsIE1heWJlVW5ib3VuZEJ1ZmZlcklEPiBwZW5k
aW5nX3dyaXRlcnNfOworCisgIC8vIENhbGxiYWNrcyBmb3IgZmx1c2ggcmVxdWVzdHMgaXNzdWVk
IHdoaWxlIHRoZSBhcmJpdGVyIG9yIGEgdGFyZ2V0IGJ1ZmZlcgorICAvLyByZXNlcnZhdGlvbiB3
YXMgdW5ib3VuZC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBwZW5kaW5n
X2ZsdXNoX2NhbGxiYWNrc187CisKKyAgLy8gU3RvcmVzIHRhcmdldCBidWZmZXIgcmVzZXJ2YXRp
b25zIGZvciB3cml0ZXJzIGNyZWF0ZWQgdmlhCisgIC8vIENyZWF0ZVN0YXJ0dXBUcmFjZVdyaXRl
cigpLiBBIGJvdW5kIHJlc2VydmF0aW9uIHNldHMKKyAgLy8gVGFyZ2V0QnVmZmVyUmVzZXJ2YXRp
b246OnJlc29sdmVkIHRvIHRydWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0dWFsCisg
IC8vIEJ1ZmZlcklEIHN1cHBsaWVkIGluIEJpbmRTdGFydHVwVGFyZ2V0QnVmZmVyKCkuCisgIC8v
CisgIC8vIFRPRE8oZXNlY2tsZXIpOiBDbGVhbiB1cCBlbnRyaWVzIGZyb20gdGhpcyBtYXAuIFRo
aXMgd291bGQgcHJvYmFibHkgcmVxdWlyZQorICAvLyBhIG1ldGhvZCBpbiBTaGFyZWRNZW1vcnlB
cmJpdGVyIHRoYXQgYWxsb3dzIGEgcHJvZHVjZXIgdG8gaW52YWxpZGF0ZSBhCisgIC8vIHJlc2Vy
dmF0aW9uIElELgorICBzdGQ6Om1hcDxNYXliZVVuYm91bmRCdWZmZXJJRCwgVGFyZ2V0QnVmZmVy
UmVzZXJ2YXRpb24+CisgICAgICB0YXJnZXRfYnVmZmVyX3Jlc2VydmF0aW9uc187CisKKyAgLy8g
LS0tIEVuZCBsb2NrLXByb3RlY3RlZCBtZW1iZXJzIC0tLQorCisgIC8vIEtlZXAgYXQgdGhlIGVu
ZC4KKyAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8U2hhcmVkTWVtb3J5QXJiaXRlckltcGw+IHdlYWtf
cHRyX2ZhY3RvcnlfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAg
Ly8gU1JDX1RSQUNJTkdfQ09SRV9TSEFSRURfTUVNT1JZX0FSQklURVJfSU1QTF9IXworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQvdHJhY2luZy9j
b3JlL2NvbW1pdF9kYXRhX3JlcXVlc3QuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUg
QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFw
YWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5v
dCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisg
KiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0
dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBy
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
cmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu
ICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBB
TlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBm
b3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxp
bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJG
RVRUT19FWFRfVFJBQ0lOR19DT1JFX0NPTU1JVF9EQVRBX1JFUVVFU1RfSF8KKyNkZWZpbmUgSU5D
TFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX0NPTU1JVF9EQVRBX1JFUVVFU1RfSF8KKwor
Ly8gQ3JlYXRlcyB0aGUgYWxpYXNlcyBpbiB0aGUgOjpwZXJmZXR0byBuYW1lc3BhY2UsIGRvaW5n
IHRoaW5ncyBsaWtlOgorLy8gdXNpbmcgOjpwZXJmZXR0bzo6Rm9vID0gOjpwZXJmZXR0bzo6cHJv
dG9zOjpnZW46OkZvby4KKy8vIFNlZSBjb21tZW50cyBpbiBmb3J3YXJkX2RlY2xzLmggZm9yIHRo
ZSBoaXN0b3JpY2FsIHJlYXNvbnMgb2YgdGhpcworLy8gaW5kaXJlY3Rpb24gbGF5ZXIuCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2NvcmUv
Zm9yd2FyZF9kZWNscy5oIgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2NvbW1pdF9kYXRhX3JlcXVlc3QuZ2VuLmgiCisKKyNl
bmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX0NPTU1JVF9EQVRBX1JF
UVVFU1RfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IHNyYy90cmFjaW5nL2Nv
cmUvdHJhY2Vfd3JpdGVyX2ltcGwuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjog
c3JjL3RyYWNpbmcvY29yZS9wYXRjaF9saXN0LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgg
VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRo
ZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1h
eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl
LgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAg
ICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxl
c3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNv
ZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBv
biBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMg
T0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vu
c2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisg
KiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNSQ19UUkFD
SU5HX0NPUkVfUEFUQ0hfTElTVF9IXworI2RlZmluZSBTUkNfVFJBQ0lOR19DT1JFX1BBVENIX0xJ
U1RfSF8KKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5n
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQv
dHJhY2luZy9jb3JlL2Jhc2ljX3R5cGVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnlfYWJpLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIFVzZWQgdG8gaGFuZGxlIHRoZSBiYWNrZmls
bGluZyBvZiB0aGUgaGVhZGVycyAodGhlIHxzaXplX2ZpZWxkfCkgb2YgbmVzdGVkCisvLyBtZXNz
YWdlcyB3aGVuIGEgcHJvdG8gaXMgZnJhZ21lbnRlZCBvdmVyIHNldmVyYWwgY2h1bmtzLiBUaGVz
ZSBwYXRjaGVzIGFyZQorLy8gc2VudCBvdXQtb2YtYmFuZCB0byB0aGUgdHJhY2luZyBzZXJ2aWNl
LCBhZnRlciBoYXZpbmcgcmV0dXJuZWQgdGhlIGluaXRpYWwKKy8vIGNodW5rcyBvZiB0aGUgZnJh
Z21lbnQuCisvLyBUT0RPKGNyYnVnLmNvbS85MDQ0NzcpOiBSZS1kaXNhYmxlIHRoZSBtb3ZlIGNv
bnN0cnVjdG9ycyB3aGVuIGFsbCB1c3NlcyBvZgorLy8gdGhpcyBjbGFzcyBoYXZlIGJlZW4gZml4
ZWQuCitjbGFzcyBQYXRjaCB7CisgcHVibGljOgorICB1c2luZyBQYXRjaENvbnRlbnQgPSBzdGQ6
OmFycmF5PHVpbnQ4X3QsIFNoYXJlZE1lbW9yeUFCSTo6a1BhY2tldEhlYWRlclNpemU+OworICBQ
YXRjaChDaHVua0lEIGMsIHVpbnQxNl90IG8pIDogY2h1bmtfaWQoYyksIG9mZnNldChvKSB7fQor
ICBQYXRjaChjb25zdCBQYXRjaCYpID0gZGVmYXVsdDsgIC8vIEZvciB0ZXN0cy4KKworICBjb25z
dCBDaHVua0lEIGNodW5rX2lkOworICBjb25zdCB1aW50MTZfdCBvZmZzZXQ7CisgIFBhdGNoQ29u
dGVudCBzaXplX2ZpZWxke307CisKKyAgLy8gfHNpemVfZmllbGR8IGNvbnRhaW5zIGEgdmFyaW50
LiBBbnkgdmFyaW50IG11c3Qgc3RhcnQgd2l0aCAhPSAwLiBFdmVuIGluCisgIC8vIHRoZSBjYXNl
IHdlIHdhbnQgdG8gZW5jb2RlIGEgc2l6ZSA9PSAwLCBwcm90b3plcm8gd2lsbCB3cml0ZSBhIHJl
ZHVuZGFudAorICAvLyB2YXJpbnQgZm9yIHRoYXQsIHRoYXQgaXMgWzB4ODAsIDB4ODAsIDB4ODAs
IDB4MDBdLiBTbyB0aGUgZmlyc3QgYnl0ZSBpcyAwCisgIC8vIGlmZiB3ZSBuZXZlciB3cm90ZSBh
bnkgdmFyaW50IGludG8gdGhhdC4KKyAgYm9vbCBpc19wYXRjaGVkKCkgY29uc3QgeyByZXR1cm4g
c2l6ZV9maWVsZFswXSAhPSAwOyB9CisKKyAgLy8gRm9yIHRlc3RzLgorICBib29sIG9wZXJhdG9y
PT0oY29uc3QgUGF0Y2gmIG8pIGNvbnN0IHsKKyAgICByZXR1cm4gY2h1bmtfaWQgPT0gby5jaHVu
a19pZCAmJiBvZmZzZXQgPT0gby5vZmZzZXQgJiYKKyAgICAgICAgICAgc2l6ZV9maWVsZCA9PSBv
LnNpemVfZmllbGQ7CisgIH0KKworIHByaXZhdGU6CisgIFBhdGNoJiBvcGVyYXRvcj0oY29uc3Qg
UGF0Y2gmKSA9IGRlbGV0ZTsKK307CisKKy8vIE5vdGU6IHRoZSBwcm90b3plcm86Ok1lc3NhZ2Uo
cykgd2lsbCB0YWtlIHBvaW50ZXJzIHRvIHRoZSB8c2l6ZV9maWVsZHwgb2YKKy8vIHRoZXNlIGVu
dHJpZXMuIFRoaXMgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhlIFBhdGNoIG9iamVj
dHMgYXJlIG5ldmVyCisvLyBtb3ZlZCBhcm91bmQgKGkuZS4gY2Fubm90IGJlIGEgdmVjdG9yIGJl
Y2F1c2Ugb2YgcmVhbGxvY2F0aW9ucyBjYW4gY2hhbmdlCisvLyBhZGRyZXNzZXMgb2YgcHJlLWV4
aXN0aW5nIGVudHJpZXMpLgorY2xhc3MgUGF0Y2hMaXN0IHsKKyBwdWJsaWM6CisgIHVzaW5nIExp
c3RUeXBlID0gc3RkOjpmb3J3YXJkX2xpc3Q8UGF0Y2g+OworICB1c2luZyB2YWx1ZV90eXBlID0g
TGlzdFR5cGU6OnZhbHVlX3R5cGU7ICAgICAgICAgIC8vIEZvciBndGVzdC4KKyAgdXNpbmcgY29u
c3RfaXRlcmF0b3IgPSBMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I7ICAvLyBGb3IgZ3Rlc3QuCisK
KyAgUGF0Y2hMaXN0KCkgOiBsYXN0XyhsaXN0Xy5iZWZvcmVfYmVnaW4oKSkge30KKworICBQYXRj
aCogZW1wbGFjZV9iYWNrKENodW5rSUQgY2h1bmtfaWQsIHVpbnQxNl90IG9mZnNldCkgeworICAg
IFBFUkZFVFRPX0RDSEVDSyhlbXB0eSgpIHx8IGxhc3RfLT5jaHVua19pZCAhPSBjaHVua19pZCB8
fAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPj0gbGFzdF8tPm9mZnNldCArIHNpemVvZihQ
YXRjaDo6UGF0Y2hDb250ZW50KSk7CisgICAgbGFzdF8gPSBsaXN0Xy5lbXBsYWNlX2FmdGVyKGxh
c3RfLCBjaHVua19pZCwgb2Zmc2V0KTsKKyAgICByZXR1cm4gJipsYXN0XzsKKyAgfQorCisgIHZv
aWQgcG9wX2Zyb250KCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyghbGlzdF8uZW1wdHkoKSk7Cisg
ICAgbGlzdF8ucG9wX2Zyb250KCk7CisgICAgaWYgKGVtcHR5KCkpCisgICAgICBsYXN0XyA9IGxp
c3RfLmJlZm9yZV9iZWdpbigpOworICB9CisKKyAgY29uc3QgUGF0Y2gmIGZyb250KCkgY29uc3Qg
eworICAgIFBFUkZFVFRPX0RDSEVDSyghbGlzdF8uZW1wdHkoKSk7CisgICAgcmV0dXJuIGxpc3Rf
LmZyb250KCk7CisgIH0KKworICBjb25zdCBQYXRjaCYgYmFjaygpIGNvbnN0IHsKKyAgICBQRVJG
RVRUT19EQ0hFQ0soIWxpc3RfLmVtcHR5KCkpOworICAgIHJldHVybiAqbGFzdF87CisgIH0KKwor
ICBMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBsaXN0Xy5i
ZWdpbigpOyB9CisgIExpc3RUeXBlOjpjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy
biBsaXN0Xy5lbmQoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gbGlzdF8uZW1w
dHkoKTsgfQorCisgcHJpdmF0ZToKKyAgTGlzdFR5cGUgbGlzdF87CisgIExpc3RUeXBlOjppdGVy
YXRvciBsYXN0XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8v
IFNSQ19UUkFDSU5HX0NPUkVfUEFUQ0hfTElTVF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIg
dGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3Ug
bWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vu
c2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAg
ICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVu
bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywg
c29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVk
IG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9O
UyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGlj
ZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQK
KyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1JDX1RS
QUNJTkdfQ09SRV9UUkFDRV9XUklURVJfSU1QTF9IXworI2RlZmluZSBTUkNfVFJBQ0lOR19DT1JF
X1RSQUNFX1dSSVRFUl9JTVBMX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL2Jhc2UvcHJvY191dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9iYXNpY190eXBlcy5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3Ry
YWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5X2FiaS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5X2Fy
Yml0ZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vfd3JpdGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZV9oYW5kbGUuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b191dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9zdHJlYW1fd3JpdGVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2J1ZmZlcl9leGhhdXN0
ZWRfcG9saWN5LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMv
dHJhY2luZy9jb3JlL3BhdGNoX2xpc3QuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworY2xh
c3MgU2hhcmVkTWVtb3J5QXJiaXRlckltcGw7CisKKy8vIFNlZSAvL2luY2x1ZGUvcGVyZmV0dG8v
dHJhY2luZy9jb3JlL3RyYWNlX3dyaXRlci5oIGZvciBkb2NzLgorY2xhc3MgVHJhY2VXcml0ZXJJ
bXBsIDogcHVibGljIFRyYWNlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlj
IHByb3RvemVybzo6U2NhdHRlcmVkU3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSB7CisgcHVibGljOgor
ICAvLyBUcmFjZVBhY2tldEhhbmRsZSBpcyBkZWZpbmVkIGluIHRyYWNlX3dyaXRlci5oCisgIFRy
YWNlV3JpdGVySW1wbChTaGFyZWRNZW1vcnlBcmJpdGVySW1wbCosCisgICAgICAgICAgICAgICAg
ICBXcml0ZXJJRCwKKyAgICAgICAgICAgICAgICAgIE1heWJlVW5ib3VuZEJ1ZmZlcklEIGJ1ZmZl
cl9pZCwKKyAgICAgICAgICAgICAgICAgIEJ1ZmZlckV4aGF1c3RlZFBvbGljeSk7CisgIH5UcmFj
ZVdyaXRlckltcGwoKSBvdmVycmlkZTsKKworICAvLyBUcmFjZVdyaXRlciBpbXBsZW1lbnRhdGlv
bi4gU2VlIGRvY3VtZW50YXRpb24gaW4gdHJhY2Vfd3JpdGVyLmguCisgIFRyYWNlUGFja2V0SGFu
ZGxlIE5ld1RyYWNlUGFja2V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgRmx1c2goc3RkOjpmdW5jdGlv
bjx2b2lkKCk+IGNhbGxiYWNrID0ge30pIG92ZXJyaWRlOworICBXcml0ZXJJRCB3cml0ZXJfaWQo
KSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3Qgd3JpdHRlbigpIGNvbnN0IG92ZXJyaWRlIHsK
KyAgICByZXR1cm4gcHJvdG9idWZfc3RyZWFtX3dyaXRlcl8ud3JpdHRlbigpOworICB9CisKKyAg
dm9pZCBSZXNldENodW5rRm9yVGVzdGluZygpIHsgY3VyX2NodW5rXyA9IFNoYXJlZE1lbW9yeUFC
STo6Q2h1bmsoKTsgfQorICBib29sIGRyb3BfcGFja2V0c19mb3JfdGVzdGluZygpIGNvbnN0IHsg
cmV0dXJuIGRyb3BfcGFja2V0c187IH0KKworIHByaXZhdGU6CisgIFRyYWNlV3JpdGVySW1wbChj
b25zdCBUcmFjZVdyaXRlckltcGwmKSA9IGRlbGV0ZTsKKyAgVHJhY2VXcml0ZXJJbXBsJiBvcGVy
YXRvcj0oY29uc3QgVHJhY2VXcml0ZXJJbXBsJikgPSBkZWxldGU7CisKKyAgLy8gU2NhdHRlcmVk
U3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgcHJvdG96ZXJvOjpDb250
aWd1b3VzTWVtb3J5UmFuZ2UgR2V0TmV3QnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gVGhlIHBl
ci1wcm9kdWNlciBhcmJpdGVyIHRoYXQgY29vcmRpbmF0ZXMgYWNjZXNzIHRvIHRoZSBzaGFyZWQg
bWVtb3J5CisgIC8vIGJ1ZmZlciBmcm9tIHNldmVyYWwgdGhyZWFkcy4KKyAgU2hhcmVkTWVtb3J5
QXJiaXRlckltcGwqIGNvbnN0IHNobWVtX2FyYml0ZXJfOworCisgIC8vIElEIG9mIHRoZSBjdXJy
ZW50IHdyaXRlci4KKyAgY29uc3QgV3JpdGVySUQgaWRfOworCisgIC8vIFRoaXMgaXMgY29waWVk
IGludG8gdGhlIGNvbW1pdCByZXF1ZXN0IGJ5IFNoYXJlZE1lbW9yeUFyYml0ZXIuIFNlZSBjb21t
ZW50cworICAvLyBpbiBkYXRhX3NvdXJjZV9jb25maWcucHJvdG8gZm9yIHx0YXJnZXRfYnVmZmVy
fC4gSWYgdGhpcyBpcyBhIHJlc2VydmF0aW9uCisgIC8vIGZvciBhIGJ1ZmZlciBJRCBpbiBjYXNl
IG9mIGEgc3RhcnR1cCB0cmFjZSB3cml0ZXIsIFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsCisgIC8v
IHdpbGwgYWxzbyB0cmFuc2xhdGUgdGhlIHJlc2VydmF0aW9uIElEIHRvIHRoZSBhY3R1YWwgYnVm
ZmVyIElELgorICBjb25zdCBNYXliZVVuYm91bmRCdWZmZXJJRCB0YXJnZXRfYnVmZmVyXzsKKwor
ICAvLyBXaGV0aGVyIEdldE5ld0NodW5rKCkgc2hvdWxkIHN0YWxsIG9yIHJldHVybiBhbiBpbnZh
bGlkIGNodW5rIGlmIHRoZSBTTUIgaXMKKyAgLy8gZXhoYXVzdGVkLgorICBjb25zdCBCdWZmZXJF
eGhhdXN0ZWRQb2xpY3kgYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3lfOworCisgIC8vIE1vbm90b25p
YyAoJSB3cmFwcGluZykgc2VxdWVuY2UgaWQgb2YgdGhlIGNodW5rLiBUb2dldGhlciB3aXRoIHRo
ZSBXcml0ZXJJRAorICAvLyB0aGlzIGFsbG93cyB0aGUgU2VydmljZSB0byByZWNvbnN0cnVjdCB0
aGUgbGluZWFyIHNlcXVlbmNlIG9mIHBhY2tldHMuCisgIENodW5rSUQgbmV4dF9jaHVua19pZF8g
PSAwOworCisgIC8vIFRoZSBjaHVuayB3ZSBhcmUgaG9sZGluZyBvbnRvIChpZiBhbnkpLgorICBT
aGFyZWRNZW1vcnlBQkk6OkNodW5rIGN1cl9jaHVua187CisKKyAgLy8gUGFzc2VkIHRvIHByb3Rv
emVybyBtZXNzYWdlIHRvIHdyaXRlIGRpcmVjdGx5IGludG8gfGN1cl9jaHVua198LiBJdAorICAv
LyBrZWVwcyB0cmFjayBvZiB0aGUgd3JpdGUgcG9pbnRlci4gSXQgY2FsbHMgdXMgYmFjayAoR2V0
TmV3QnVmZmVyKCkpIHdoZW4KKyAgLy8gfGN1cl9jaHVua198IGlzIGZpbGxlZC4KKyAgcHJvdG96
ZXJvOjpTY2F0dGVyZWRTdHJlYW1Xcml0ZXIgcHJvdG9idWZfc3RyZWFtX3dyaXRlcl87CisKKyAg
Ly8gVGhlIHBhY2tldCByZXR1cm5lZCB2aWEgTmV3VHJhY2VQYWNrZXQoKS4gSXRzIG93bmVkIGJ5
IHRoaXMgY2xhc3MsCisgIC8vIFRyYWNlUGFja2V0SGFuZGxlIGhhcyBqdXN0IGEgcG9pbnRlciB0
byBpdC4KKyAgc3RkOjp1bmlxdWVfcHRyPHByb3Rvczo6cGJ6ZXJvOjpUcmFjZVBhY2tldD4gY3Vy
X3BhY2tldF87CisKKyAgLy8gVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgfGN1cl9wYWNrZXRffCB3aXRo
aW4gfGN1cl9jaHVua198LiBVc2VkIHRvIGZpZ3VyZSBvdXQKKyAgLy8gZnJhZ21lbnRzIHNpemVz
IHdoZW4gYSBUcmFjZVBhY2tldCB3cml0ZSBpcyBpbnRlcnJ1cHRlZCBieSBHZXROZXdCdWZmZXIo
KS4KKyAgdWludDhfdCogY3VyX2ZyYWdtZW50X3N0YXJ0XyA9IG51bGxwdHI7CisKKyAgLy8gdHJ1
ZSBpZiB3ZSByZWNlaXZlZCBhIGNhbGwgdG8gR2V0TmV3QnVmZmVyKCkgYWZ0ZXIgTmV3VHJhY2VQ
YWNrZXQoKSwKKyAgLy8gZmFsc2UgaWYgR2V0TmV3QnVmZmVyKCkgaGFwcGVuZWQgZHVyaW5nIE5l
d1RyYWNlUGFja2V0KCkgcHJvbG9ndWUsIHdoaWxlCisgIC8vIHN0YXJ0aW5nIHRoZSBUcmFjZVBh
Y2tldCBoZWFkZXIuCisgIGJvb2wgZnJhZ21lbnRpbmdfcGFja2V0XyA9IGZhbHNlOworCisgIC8v
IFNldCB0byB8dHJ1ZXwgd2hlbiB0aGUgY3VycmVudCBjaHVuayBjb250YWlucyB0aGUgbWF4aW11
bSBudW1iZXIgb2YgcGFja2V0cworICAvLyBhIGNodW5rIGNhbiBjb250YWluLiBXaGVuIHRoaXMg
aXMgfHRydWV8LCB0aGUgbmV4dCBwYWNrZXQgcmVxdWlyZXMgc3RhcnRpbmcKKyAgLy8gYSBuZXcg
Y2h1bmsuCisgIGJvb2wgcmVhY2hlZF9tYXhfcGFja2V0c19wZXJfY2h1bmtfID0gZmFsc2U7CisK
KyAgLy8gSWYgd2UgZmFpbCB0byBhY3F1aXJlIGEgbmV3IGNodW5rIHdoZW4gdGhlIGFyYml0ZXIg
b3BlcmF0ZXMgaW4KKyAgLy8gU2hhcmVkTWVtb3J5OjpCdWZmZXJFeGhhdXN0ZWRQb2xpY3k6OmtE
cm9wIG1vZGUsIHRoZSB0cmFjZSB3cml0ZXIgZW50ZXJzIGEKKyAgLy8gbW9kZSBpbiB3aGljaCBk
YXRhIGlzIHdyaXR0ZW4gdG8gYSBsb2NhbCBnYXJiYWdlIGNodW5rIGFuZCBkcm9wcGVkLgorICBi
b29sIGRyb3BfcGFja2V0c18gPSBmYWxzZTsKKworICAvLyBXaGV0aGVyIHRoZSB0cmFjZSB3cml0
ZXIgc2hvdWxkIHRyeSB0byBhY3F1aXJlIGEgbmV3IGNodW5rIGZyb20gdGhlIFNNQgorICAvLyB3
aGVuIHRoZSBuZXh0IFRyYWNlUGFja2V0IGlzIHN0YXJ0ZWQgYmVjYXVzZSBpdCBmaWxsZWQgdGhl
IGdhcmJhZ2UgY2h1bmsgYXQKKyAgLy8gbGVhc3Qgb25jZSBzaW5jZSB0aGUgbGFzdCBhdHRlbXB0
LgorICBib29sIHJldHJ5X25ld19jaHVua19hZnRlcl9wYWNrZXRfID0gZmFsc2U7CisKKyAgLy8g
UG9pbnRzIHRvIHRoZSBzaXplIGZpZWxkIG9mIHRoZSBsYXN0IHBhY2tldCB3ZSB3cm90ZSB0byB0
aGUgY3VycmVudCBjaHVuay4KKyAgLy8gSWYgdGhlIGNodW5rIHdhcyBhbHJlYWR5IHJldHVybmVk
LCB0aGlzIGlzIHJlc2V0IHRvIHxudWxscHRyfC4KKyAgdWludDhfdCogbGFzdF9wYWNrZXRfc2l6
ZV9maWVsZF8gPSBudWxscHRyOworCisgIC8vIFdoZW4gYSBwYWNrZXQgaXMgZnJhZ21lbnRlZCBh
Y3Jvc3MgZGlmZmVyZW50IGNodW5rcywgdGhlIHxzaXplX2ZpZWxkfCBvZgorICAvLyB0aGUgb3V0
c3RhbmRpbmcgbmVzdGVkIHByb3RvYnVmIG1lc3NhZ2VzIGlzIHJlZGlyZWN0ZWQgb250byBQYXRj
aCBlbnRyaWVzCisgIC8vIGluIHRoaXMgbGlzdCBhdCB0aGUgdGltZSB0aGUgQ2h1bmsgaXMgcmV0
dXJuZWQgKGJlY2F1c2UgYXQgdGhhdCBwb2ludCB3ZQorICAvLyBoYXZlIHRvIHJlbGVhc2UgdGhl
IG93bmVyc2hpcCBvZiB0aGUgY3VycmVudCBDaHVuaykuIFRoaXMgbGlzdCB3aWxsIGJlCisgIC8v
IGxhdGVyIHNlbnQgb3V0LW9mLWJhbmQgdG8gdGhlIHRyYWNpbmcgc2VydmljZSwgd2hvIHdpbGwg
cGF0Y2ggdGhlIHJlcXVpcmVkCisgIC8vIGNodW5rcywgaWYgdGhleSBhcmUgc3RpbGwgYXJvdW5k
LgorICBQYXRjaExpc3QgcGF0Y2hfbGlzdF87CisKKyAgLy8gUElEIG9mIHRoZSBwcm9jZXNzIHRo
YXQgY3JlYXRlZCB0aGUgdHJhY2Ugd3JpdGVyLiBVc2VkIGZvciBhIERDSEVDSyB0aGF0CisgIC8v
IGFpbXMgdG8gZGV0ZWN0IHVuc3VwcG9ydGVkIHByb2Nlc3MgZm9ya3Mgd2hpbGUgdHJhY2luZy4K
KyAgY29uc3QgYmFzZTo6UGxhdGZvcm1Qcm9jZXNzSWQgcHJvY2Vzc19pZF87Cit9OworCit9ICAv
LyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBTUkNfVFJBQ0lOR19DT1JFX1RSQUNF
X1dSSVRFUl9JTVBMX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAic3JjL3RyYWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5X2FyYml0ZXJfaW1wbC5oIgor
CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGls
aXR5PgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9i
YXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2Jhc2UvdGFza19ydW5uZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvdGltZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9jb21taXRfZGF0YV9yZXF1
ZXN0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9l
eHQvdHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnkuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInNyYy90cmFjaW5nL2NvcmUvbnVsbF90cmFjZV93cml0ZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInNyYy90cmFjaW5nL2NvcmUvdHJh
Y2Vfd3JpdGVyX2ltcGwuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKwordXNpbmcgQ2h1bmsg
PSBTaGFyZWRNZW1vcnlBQkk6OkNodW5rOworCituYW1lc3BhY2Ugeworc3RhdGljX2Fzc2VydChz
aXplb2YoQnVmZmVySUQpID09IHNpemVvZih1aW50MTZfdCksCisgICAgICAgICAgICAgICJUaGUg
TWF5YmVVbmJvdW5kQnVmZmVySUQgbG9naWMgcmVxdWlyZXMgQnVmZmVySUQgbm90IHRvIGdyb3cg
IgorICAgICAgICAgICAgICAiYWJvdmUgdWludDE2X3QuIik7CisKK01heWJlVW5ib3VuZEJ1ZmZl
cklEIE1ha2VUYXJnZXRCdWZmZXJJZEZvclJlc2VydmF0aW9uKHVpbnQxNl90IHJlc2VydmF0aW9u
X2lkKSB7CisgIC8vIFJlc2VydmF0aW9uIElEcyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciBiaXRz
LgorICBQRVJGRVRUT19DSEVDSyhyZXNlcnZhdGlvbl9pZCA+IDApOworICByZXR1cm4gc3RhdGlj
X2Nhc3Q8TWF5YmVVbmJvdW5kQnVmZmVySUQ+KHJlc2VydmF0aW9uX2lkKSA8PCAxNjsKK30KKwor
Ym9vbCBJc1Jlc2VydmF0aW9uVGFyZ2V0QnVmZmVySWQoTWF5YmVVbmJvdW5kQnVmZmVySUQgYnVm
ZmVyX2lkKSB7CisgIHJldHVybiAoYnVmZmVyX2lkID4+IDE2KSA+IDA7Cit9Cit9ICAvLyBuYW1l
c3BhY2UKKworLy8gc3RhdGljCitTaGFyZWRNZW1vcnlBQkk6OlBhZ2VMYXlvdXQgU2hhcmVkTWVt
b3J5QXJiaXRlckltcGw6OmRlZmF1bHRfcGFnZV9sYXlvdXQgPQorICAgIFNoYXJlZE1lbW9yeUFC
STo6UGFnZUxheW91dDo6a1BhZ2VEaXYxOworCisvLyBzdGF0aWMKK2NvbnN0ZXhwciBCdWZmZXJJ
RCBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbDo6a0ludmFsaWRCdWZmZXJJZDsKKworLy8gc3RhdGlj
CitzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5QXJiaXRlcj4gU2hhcmVkTWVtb3J5QXJiaXRl
cjo6Q3JlYXRlSW5zdGFuY2UoCisgICAgU2hhcmVkTWVtb3J5KiBzaGFyZWRfbWVtb3J5LAorICAg
IHNpemVfdCBwYWdlX3NpemUsCisgICAgVHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyRW5kcG9pbnQq
IHByb2R1Y2VyX2VuZHBvaW50LAorICAgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyKSB7
CisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5QXJiaXRlckltcGw+KAorICAg
ICAgbmV3IFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsKHNoYXJlZF9tZW1vcnktPnN0YXJ0KCksIHNo
YXJlZF9tZW1vcnktPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
YWdlX3NpemUsIHByb2R1Y2VyX2VuZHBvaW50LCB0YXNrX3J1bm5lcikpOworfQorCisvLyBzdGF0
aWMKK3N0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnlBcmJpdGVyPiBTaGFyZWRNZW1vcnlBcmJp
dGVyOjpDcmVhdGVVbmJvdW5kSW5zdGFuY2UoCisgICAgU2hhcmVkTWVtb3J5KiBzaGFyZWRfbWVt
b3J5LAorICAgIHNpemVfdCBwYWdlX3NpemUpIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxT
aGFyZWRNZW1vcnlBcmJpdGVySW1wbD4obmV3IFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsKAorICAg
ICAgc2hhcmVkX21lbW9yeS0+c3RhcnQoKSwgc2hhcmVkX21lbW9yeS0+c2l6ZSgpLCBwYWdlX3Np
emUsCisgICAgICAvKnByb2R1Y2VyX2VuZHBvaW50PSovbnVsbHB0ciwgLyp0YXNrX3J1bm5lcj0q
L251bGxwdHIpKTsKK30KKworU2hhcmVkTWVtb3J5QXJiaXRlckltcGw6OlNoYXJlZE1lbW9yeUFy
Yml0ZXJJbXBsKAorICAgIHZvaWQqIHN0YXJ0LAorICAgIHNpemVfdCBzaXplLAorICAgIHNpemVf
dCBwYWdlX3NpemUsCisgICAgVHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyRW5kcG9pbnQqIHByb2R1
Y2VyX2VuZHBvaW50LAorICAgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyKQorICAgIDog
aW5pdGlhbGx5X2JvdW5kXyh0YXNrX3J1bm5lciAmJiBwcm9kdWNlcl9lbmRwb2ludCksCisgICAg
ICBwcm9kdWNlcl9lbmRwb2ludF8ocHJvZHVjZXJfZW5kcG9pbnQpLAorICAgICAgdGFza19ydW5u
ZXJfKHRhc2tfcnVubmVyKSwKKyAgICAgIHNobWVtX2FiaV8ocmVpbnRlcnByZXRfY2FzdDx1aW50
OF90Kj4oc3RhcnQpLCBzaXplLCBwYWdlX3NpemUpLAorICAgICAgYWN0aXZlX3dyaXRlcl9pZHNf
KGtNYXhXcml0ZXJJRCksCisgICAgICBmdWxseV9ib3VuZF8oaW5pdGlhbGx5X2JvdW5kXyksCisg
ICAgICB3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSB7fQorCitDaHVuayBTaGFyZWRNZW1vcnlBcmJp
dGVySW1wbDo6R2V0TmV3Q2h1bmsoCisgICAgY29uc3QgU2hhcmVkTWVtb3J5QUJJOjpDaHVua0hl
YWRlciYgaGVhZGVyLAorICAgIEJ1ZmZlckV4aGF1c3RlZFBvbGljeSBidWZmZXJfZXhoYXVzdGVk
X3BvbGljeSwKKyAgICBzaXplX3Qgc2l6ZV9oaW50KSB7CisgIFBFUkZFVFRPX0RDSEVDSyhzaXpl
X2hpbnQgPT0gMCk7ICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgorICAvLyBJZiBpbml0aWFsbHkg
dW5ib3VuZCwgd2UgZG8gbm90IHN1cHBvcnQgc3RhbGxpbmcuIEluIHRoZW9yeSwgd2UgY291bGQK
KyAgLy8gc3VwcG9ydCBzdGFsbGluZyBmb3IgVHJhY2VXcml0ZXJzIGNyZWF0ZWQgYWZ0ZXIgdGhl
IGFyYml0ZXIgYW5kIHN0YXJ0dXAKKyAgLy8gYnVmZmVyIHJlc2VydmF0aW9ucyB3ZXJlIGJvdW5k
LCBidXQgdG8gYXZvaWQgcmFjaW5lc3MgYmV0d2VlbiB0aGUgY3JlYXRpb24KKyAgLy8gb2Ygc3Rh
cnR1cCB3cml0ZXJzIGFuZCBiaW5kaW5nLCB3ZSBjYXRlZ29yaWNhbGx5IGZvcmJpZCBrU3RhbGwg
bW9kZS4KKyAgUEVSRkVUVE9fRENIRUNLKGluaXRpYWxseV9ib3VuZF8gfHwKKyAgICAgICAgICAg
ICAgICAgIGJ1ZmZlcl9leGhhdXN0ZWRfcG9saWN5ID09IEJ1ZmZlckV4aGF1c3RlZFBvbGljeTo6
a0Ryb3ApOworCisgIGludCBzdGFsbF9jb3VudCA9IDA7CisgIHVuc2lnbmVkIHN0YWxsX2ludGVy
dmFsX3VzID0gMDsKKyAgYm9vbCB0YXNrX3J1bm5lcl9ydW5zX29uX2N1cnJlbnRfdGhyZWFkID0g
ZmFsc2U7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrTWF4U3RhbGxJbnRlcnZhbFVzID0gMTAw
MDAwOworICBzdGF0aWMgY29uc3QgaW50IGtMb2dBZnRlck5TdGFsbHMgPSAzOworICBzdGF0aWMg
Y29uc3QgaW50IGtGbHVzaENvbW1pdHNBZnRlckV2ZXJ5TlN0YWxscyA9IDI7CisgIHN0YXRpYyBj
b25zdCBpbnQga0Fzc2VydEF0TlN0YWxscyA9IDEwMDsKKworICBmb3IgKDs7KSB7CisgICAgLy8g
VE9ETyhwcmltaWFubyk6IFByb2JhYmx5IHRoaXMgbG9jayBpcyBub3QgcmVhbGx5IHJlcXVpcmVk
IGFuZCB0aGlzIGNvZGUKKyAgICAvLyBjb3VsZCBiZSByZXdyaXR0ZW4gbGV2ZXJhZ2luZyBvbmx5
IHRoZSBUcnkqIGF0b21pYyBvcGVyYXRpb25zIGluCisgICAgLy8gU2hhcmVkTWVtb3J5QUJJLiBC
dXQgbGV0J3Mgbm90IGJlIHRvbyBhZHZlbnR1cm91cyBmb3IgdGhlIG1vbWVudC4KKyAgICB7Cisg
ICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IHNjb3BlZF9sb2NrKGxvY2tfKTsKKwor
ICAgICAgdGFza19ydW5uZXJfcnVuc19vbl9jdXJyZW50X3RocmVhZCA9CisgICAgICAgICAgdGFz
a19ydW5uZXJfICYmIHRhc2tfcnVubmVyXy0+UnVuc1Rhc2tzT25DdXJyZW50VGhyZWFkKCk7CisK
KyAgICAgIC8vIElmIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBTTUIuc2l6ZSgpIGlzIGZpbGxlZCB3
aXRoIGNvbXBsZXRlZCBjaHVua3MgZm9yCisgICAgICAvLyB3aGljaCB3ZSBoYXZlbid0IG5vdGlm
aWVkIHRoZSBzZXJ2aWNlIHlldCAoaS5lLiB0aGV5IGFyZSBzdGlsbCBlbnF1ZXVlZAorICAgICAg
Ly8gaW4gfGNvbW1pdF9kYXRhX3JlcV98KSwgZm9yY2UgYSBzeW5jaHJvbm91cyBDb21taXREYXRh
UmVxdWVzdCgpIGV2ZW4gaWYKKyAgICAgIC8vIHdlIGFjcXVpcmUgYSBjaHVuaywgdG8gcmVkdWNl
IHRoZSBsaWtlbGluZXNzIG9mIHN0YWxsaW5nIHRoZSB3cml0ZXIuCisgICAgICAvLworICAgICAg
Ly8gV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSB3cml0aW5nIG9uIHRoZSBzYW1lIHRocmVh
ZCB0aGF0IHdlIGFjY2VzcworICAgICAgLy8gdGhlIHByb2R1Y2VyIGVuZHBvaW50IG9uLCBzaW5j
ZSB3ZSBjYW5ub3Qgbm90aWZ5IHRoZSBwcm9kdWNlciBlbmRwb2ludAorICAgICAgLy8gdG8gY29t
bWl0IHN5bmNocm9ub3VzbHkgb24gYSBkaWZmZXJlbnQgdGhyZWFkLiBBdHRlbXB0aW5nIHRvIGZs
dXNoCisgICAgICAvLyBzeW5jaHJvbm91c2x5IG9uIGFub3RoZXIgdGhyZWFkIHdpbGwgbGVhZCB0
byBzdWJ0bGUgYnVncyBjYXVzZWQgYnkKKyAgICAgIC8vIG91dC1vZi1vcmRlciBjb21taXQgcmVx
dWVzdHMgKGNyYnVnLmNvbS85MTkxODcjYzI4KS4KKyAgICAgIGJvb2wgc2hvdWxkX2NvbW1pdF9z
eW5jaHJvbm91c2x5ID0KKyAgICAgICAgICB0YXNrX3J1bm5lcl9ydW5zX29uX2N1cnJlbnRfdGhy
ZWFkICYmCisgICAgICAgICAgYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3kgPT0gQnVmZmVyRXhoYXVz
dGVkUG9saWN5OjprU3RhbGwgJiYKKyAgICAgICAgICBjb21taXRfZGF0YV9yZXFfICYmIGJ5dGVz
X3BlbmRpbmdfY29tbWl0XyA+PSBzaG1lbV9hYmlfLnNpemUoKSAvIDI7CisKKyAgICAgIGNvbnN0
IHNpemVfdCBpbml0aWFsX3BhZ2VfaWR4ID0gcGFnZV9pZHhfOworICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBzaG1lbV9hYmlfLm51bV9wYWdlcygpOyBpKyspIHsKKyAgICAgICAgcGFnZV9p
ZHhfID0gKGluaXRpYWxfcGFnZV9pZHggKyBpKSAlIHNobWVtX2FiaV8ubnVtX3BhZ2VzKCk7Cisg
ICAgICAgIGJvb2wgaXNfbmV3X3BhZ2UgPSBmYWxzZTsKKworICAgICAgICAvLyBUT0RPKHByaW1p
YW5vKTogbWFrZSB0aGUgcGFnZSBsYXlvdXQgZHluYW1pYy4KKyAgICAgICAgYXV0byBsYXlvdXQg
PSBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbDo6ZGVmYXVsdF9wYWdlX2xheW91dDsKKworICAgICAg
ICBpZiAoc2htZW1fYWJpXy5pc19wYWdlX2ZyZWUocGFnZV9pZHhfKSkgeworICAgICAgICAgIC8v
IFRPRE8ocHJpbWlhbm8pOiBVc2UgdGhlIHxzaXplX2hpbnR8IGhlcmUgdG8gZGVjaWRlIHRoZSBs
YXlvdXQuCisgICAgICAgICAgaXNfbmV3X3BhZ2UgPSBzaG1lbV9hYmlfLlRyeVBhcnRpdGlvblBh
Z2UocGFnZV9pZHhfLCBsYXlvdXQpOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IGZyZWVf
Y2h1bmtzOworICAgICAgICBpZiAoaXNfbmV3X3BhZ2UpIHsKKyAgICAgICAgICBmcmVlX2NodW5r
cyA9ICgxIDw8IFNoYXJlZE1lbW9yeUFCSTo6a051bUNodW5rc0ZvckxheW91dFtsYXlvdXRdKSAt
IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZnJlZV9jaHVua3MgPSBzaG1lbV9hYmlf
LkdldEZyZWVDaHVua3MocGFnZV9pZHhfKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodWlu
dDMyX3QgY2h1bmtfaWR4ID0gMDsgZnJlZV9jaHVua3M7CisgICAgICAgICAgICAgY2h1bmtfaWR4
KyssIGZyZWVfY2h1bmtzID4+PSAxKSB7CisgICAgICAgICAgaWYgKCEoZnJlZV9jaHVua3MgJiAx
KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIC8vIFdlIGZvdW5kIGEgZnJlZSBj
aHVuay4KKyAgICAgICAgICBDaHVuayBjaHVuayA9IHNobWVtX2FiaV8uVHJ5QWNxdWlyZUNodW5r
Rm9yV3JpdGluZygKKyAgICAgICAgICAgICAgcGFnZV9pZHhfLCBjaHVua19pZHgsICZoZWFkZXIp
OworICAgICAgICAgIGlmICghY2h1bmsuaXNfdmFsaWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgIGlmIChzdGFsbF9jb3VudCA+IGtMb2dBZnRlck5TdGFsbHMpIHsKKyAgICAg
ICAgICAgIFBFUkZFVFRPX0xPRygiUmVjb3ZlcmVkIGZyb20gc3RhbGwgYWZ0ZXIgJWQgaXRlcmF0
aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbGxfY291bnQpOworICAgICAgICAg
IH0KKworICAgICAgICAgIGlmIChzaG91bGRfY29tbWl0X3N5bmNocm9ub3VzbHkpIHsKKyAgICAg
ICAgICAgIC8vIFdlIGNhbid0IGZsdXNoIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAg
ICAgICBzY29wZWRfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIEZsdXNoUGVuZGluZ0NvbW1p
dERhdGFSZXF1ZXN0cygpOworICAgICAgICAgICAgcmV0dXJuIGNodW5rOworICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY2h1bms7CisgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICB9CisgICAgfSAgLy8gc2NvcGVkX2xvY2sKKworICAgIGlmIChidWZmZXJfZXhoYXVz
dGVkX3BvbGljeSA9PSBCdWZmZXJFeGhhdXN0ZWRQb2xpY3k6OmtEcm9wKSB7CisgICAgICBQRVJG
RVRUT19ETE9HKCJTaGFyZWQgbWVtb3J5IGJ1ZmZlciBleGhhdXNlZCwgcmV0dXJuaW5nIGludmFs
aWQgQ2h1bmshIik7CisgICAgICByZXR1cm4gQ2h1bmsoKTsKKyAgICB9CisKKyAgICBQRVJGRVRU
T19EQ0hFQ0soaW5pdGlhbGx5X2JvdW5kXyk7CisKKyAgICAvLyBBbGwgY2h1bmtzIGFyZSB0YWtl
biAoZWl0aGVyIGtCZWluZ1dyaXR0ZW4gYnkgdXMgb3Iga0JlaW5nUmVhZCBieSB0aGUKKyAgICAv
LyBTZXJ2aWNlKS4KKyAgICBpZiAoc3RhbGxfY291bnQrKyA9PSBrTG9nQWZ0ZXJOU3RhbGxzKSB7
CisgICAgICBQRVJGRVRUT19MT0coIlNoYXJlZCBtZW1vcnkgYnVmZmVyIG92ZXJydW4hIFN0YWxs
aW5nIik7CisgICAgfQorCisgICAgaWYgKHN0YWxsX2NvdW50ID09IGtBc3NlcnRBdE5TdGFsbHMp
IHsKKyAgICAgIFBFUkZFVFRPX0ZBVEFMKAorICAgICAgICAgICJTaGFyZWQgbWVtb3J5IGJ1ZmZl
ciBtYXggc3RhbGwgY291bnQgZXhjZWVkZWQ7IHBvc3NpYmxlIGRlYWRsb2NrIik7CisgICAgfQor
CisgICAgLy8gSWYgdGhlIElQQyB0aHJlYWQgaXRzZWxmIGlzIHN0YWxsZWQgYmVjYXVzZSB0aGUg
Y3VycmVudCBwcm9jZXNzIGhhcworICAgIC8vIGZpbGxlZCB1cCB0aGUgU01CLCB3ZSBuZWVkIHRv
IG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXJ2aWNlIGNhbiBwcm9jZXNzIGFuZAorICAgIC8vIHB1cmdl
IHRoZSBjaHVua3Mgd3JpdHRlbiBieSBvdXIgcHJvY2VzcywgYnkgZmx1c2hpbmcgYW55IHBlbmRp
bmcgY29tbWl0CisgICAgLy8gcmVxdWVzdHMuIEJlY2F1c2Ugb3RoZXIgdGhyZWFkcyBpbiBvdXIg
cHJvY2VzcyBjYW4gY29udGludWUgdG8KKyAgICAvLyBjb25jdXJyZW50bHkgZ3JhYiwgZmlsbCBh
bmQgY29tbWl0IGFueSBjaHVua3MgcHVyZ2VkIGJ5IHRoZSBzZXJ2aWNlLCBpdAorICAgIC8vIGlz
IHBvc3NpYmxlIHRoYXQgdGhlIFNNQiByZW1haW5zIGZ1bGwgYW5kIHRoZSBJUEMgdGhyZWFkIHJl
bWFpbnMgc3RhbGxlZCwKKyAgICAvLyBuZWVkaW5nIHRvIGZsdXNoIHRoZSBjb25jdXJyZW50bHkg
cXVldWVkIHVwIGNvbW1pdHMgYWdhaW4uIFRoaXMgaXMKKyAgICAvLyBwYXJ0aWN1bGFybHkgbGlr
ZWx5IHdpdGggaW4tcHJvY2VzcyBwZXJmZXR0byBzZXJ2aWNlIHdoZXJlIHRoZSBJUEMgdGhyZWFk
CisgICAgLy8gaXMgdGhlIHNlcnZpY2UgdGhyZWFkLiBUbyBhdm9pZCByZW1haW5pbmcgc3RhbGxl
ZCBmb3JldmVyIGluIHN1Y2ggYQorICAgIC8vIHNpdHVhdGlvbiwgd2UgYXR0ZW1wdCB0byBmbHVz
aCBwZXJpb2RpY2FsbHkgYWZ0ZXIgZXZlcnkgTiBzdGFsbHMuCisgICAgaWYgKHN0YWxsX2NvdW50
ICUga0ZsdXNoQ29tbWl0c0FmdGVyRXZlcnlOU3RhbGxzID09IDAgJiYKKyAgICAgICAgdGFza19y
dW5uZXJfcnVuc19vbl9jdXJyZW50X3RocmVhZCkgeworICAgICAgLy8gVE9ETyhwcmltaWFubyk6
IHNlbmRpbmcgdGhlIElQQyBzeW5jaHJvbm91c2x5IGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQK
KyAgICAgIC8vIHVudGlsIHRoZSBiYWNrcHJlc3N1cmUgbG9naWMgaW4gcHJvYmVzX3Byb2R1Y2Vy
IGlzIHNvcnRlZCBvdXQuIFVudGlsCisgICAgICAvLyB0aGVuIHRoZSByaXNrIGlzIHRoYXQgd2Ug
c3RhbGwgdGhlIG1lc3NhZ2UgbG9vcCB3YWl0aW5nIGZvciB0aGUgdHJhY2luZworICAgICAgLy8g
c2VydmljZSB0byBjb25zdW1lIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciAoU01CKSBhbmQsIGZv
ciB0aGlzIHJlYXNvbiwKKyAgICAgIC8vIG5ldmVyIHJ1biB0aGUgdGFzayB0aGF0IHRlbGxzIHRo
ZSBzZXJ2aWNlIHRvIHB1cmdlIHRoZSBTTUIuIFRoaXMgbXVzdAorICAgICAgLy8gaGFwcGVuIGlm
ZiB3ZSBhcmUgb24gdGhlIElQQyB0aHJlYWQsIG5vdCBkb2luZyB0aGlzIHdpbGwgY2F1c2UKKyAg
ICAgIC8vIGRlYWRsb2NrcywgZG9pbmcgdGhpcyBvbiB0aGUgd3JvbmcgdGhyZWFkIGNhdXNlcyBv
dXQtb2Ytb3JkZXIgZGF0YQorICAgICAgLy8gY29tbWl0cyAoY3JidWcuY29tLzkxOTE4NyNjMjgp
LgorICAgICAgRmx1c2hQZW5kaW5nQ29tbWl0RGF0YVJlcXVlc3RzKCk7CisgICAgfSBlbHNlIHsK
KyAgICAgIGJhc2U6OlNsZWVwTWljcm9zZWNvbmRzKHN0YWxsX2ludGVydmFsX3VzKTsKKyAgICAg
IHN0YWxsX2ludGVydmFsX3VzID0KKyAgICAgICAgICBzdGQ6Om1pbihrTWF4U3RhbGxJbnRlcnZh
bFVzLCAoc3RhbGxfaW50ZXJ2YWxfdXMgKyAxKSAqIDgpOworICAgIH0KKyAgfQorfQorCit2b2lk
IFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsOjpSZXR1cm5Db21wbGV0ZWRDaHVuaygKKyAgICBDaHVu
ayBjaHVuaywKKyAgICBNYXliZVVuYm91bmRCdWZmZXJJRCB0YXJnZXRfYnVmZmVyLAorICAgIFBh
dGNoTGlzdCogcGF0Y2hfbGlzdCkgeworICBQRVJGRVRUT19EQ0hFQ0soY2h1bmsuaXNfdmFsaWQo
KSk7CisgIGNvbnN0IFdyaXRlcklEIHdyaXRlcl9pZCA9IGNodW5rLndyaXRlcl9pZCgpOworICBV
cGRhdGVDb21taXREYXRhUmVxdWVzdChzdGQ6Om1vdmUoY2h1bmspLCB3cml0ZXJfaWQsIHRhcmdl
dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoX2xpc3QpOworfQorCit2
b2lkIFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsOjpTZW5kUGF0Y2hlcyhXcml0ZXJJRCB3cml0ZXJf
aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXliZVVuYm91
bmRCdWZmZXJJRCB0YXJnZXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUGF0Y2hMaXN0KiBwYXRjaF9saXN0KSB7CisgIFBFUkZFVFRPX0RDSEVDSygh
cGF0Y2hfbGlzdC0+ZW1wdHkoKSAmJiBwYXRjaF9saXN0LT5mcm9udCgpLmlzX3BhdGNoZWQoKSk7
CisgIFVwZGF0ZUNvbW1pdERhdGFSZXF1ZXN0KENodW5rKCksIHdyaXRlcl9pZCwgdGFyZ2V0X2J1
ZmZlciwgcGF0Y2hfbGlzdCk7Cit9CisKK3ZvaWQgU2hhcmVkTWVtb3J5QXJiaXRlckltcGw6OlVw
ZGF0ZUNvbW1pdERhdGFSZXF1ZXN0KAorICAgIENodW5rIGNodW5rLAorICAgIFdyaXRlcklEIHdy
aXRlcl9pZCwKKyAgICBNYXliZVVuYm91bmRCdWZmZXJJRCB0YXJnZXRfYnVmZmVyLAorICAgIFBh
dGNoTGlzdCogcGF0Y2hfbGlzdCkgeworICAvLyBOb3RlOiBjaHVuayB3aWxsIGJlIGludmFsaWQg
aWYgdGhlIGNhbGwgY2FtZSBmcm9tIFNlbmRQYXRjaGVzKCkuCisgIGJhc2U6OlRhc2tSdW5uZXIq
IHRhc2tfcnVubmVyX3RvX3Bvc3RfY2FsbGJhY2tfb24gPSBudWxscHRyOworICBiYXNlOjpXZWFr
UHRyPFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsPiB3ZWFrX3RoaXM7CisgIHsKKyAgICBzdGQ6Omxv
Y2tfZ3VhcmQ8c3RkOjptdXRleD4gc2NvcGVkX2xvY2sobG9ja18pOworCisgICAgaWYgKCFjb21t
aXRfZGF0YV9yZXFfKSB7CisgICAgICBjb21taXRfZGF0YV9yZXFfLnJlc2V0KG5ldyBDb21taXRE
YXRhUmVxdWVzdCgpKTsKKworICAgICAgLy8gRmx1c2hpbmcgdGhlIGNvbW1pdCBpcyBvbmx5IHN1
cHBvcnRlZCB3aGlsZSB3ZSdyZSB8ZnVsbHlfYm91bmRffC4gSWYgd2UKKyAgICAgIC8vIGFyZW4n
dCwgd2UnbGwgZmx1c2ggd2hlbiB8ZnVsbHlfYm91bmRffCBpcyB1cGRhdGVkLgorICAgICAgaWYg
KGZ1bGx5X2JvdW5kXykgeworICAgICAgICB3ZWFrX3RoaXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5H
ZXRXZWFrUHRyKCk7CisgICAgICAgIHRhc2tfcnVubmVyX3RvX3Bvc3RfY2FsbGJhY2tfb24gPSB0
YXNrX3J1bm5lcl87CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgYSB2YWxpZCBjaHVuayBp
cyBzcGVjaWZpZWQsIHJldHVybiBpdCBhbmQgYXR0YWNoIGl0IHRvIHRoZSByZXF1ZXN0LgorICAg
IGlmIChjaHVuay5pc192YWxpZCgpKSB7CisgICAgICBQRVJGRVRUT19EQ0hFQ0soY2h1bmsud3Jp
dGVyX2lkKCkgPT0gd3JpdGVyX2lkKTsKKyAgICAgIHVpbnQ4X3QgY2h1bmtfaWR4ID0gY2h1bmsu
Y2h1bmtfaWR4KCk7CisgICAgICBieXRlc19wZW5kaW5nX2NvbW1pdF8gKz0gY2h1bmsuc2l6ZSgp
OworICAgICAgc2l6ZV90IHBhZ2VfaWR4ID0gc2htZW1fYWJpXy5SZWxlYXNlQ2h1bmtBc0NvbXBs
ZXRlKHN0ZDo6bW92ZShjaHVuaykpOworCisgICAgICAvLyBETyBOT1QgYWNjZXNzIHxjaHVua3wg
YWZ0ZXIgdGhpcyBwb2ludCwgaGFzIGJlZW4gc3RkOjptb3ZlKCktZCBhYm92ZS4KKworICAgICAg
Q29tbWl0RGF0YVJlcXVlc3Q6OkNodW5rc1RvTW92ZSogY3RtID0KKyAgICAgICAgICBjb21taXRf
ZGF0YV9yZXFfLT5hZGRfY2h1bmtzX3RvX21vdmUoKTsKKyAgICAgIGN0bS0+c2V0X3BhZ2Uoc3Rh
dGljX2Nhc3Q8dWludDMyX3Q+KHBhZ2VfaWR4KSk7CisgICAgICBjdG0tPnNldF9jaHVuayhjaHVu
a19pZHgpOworICAgICAgY3RtLT5zZXRfdGFyZ2V0X2J1ZmZlcih0YXJnZXRfYnVmZmVyKTsKKyAg
ICB9CisKKyAgICAvLyBHZXQgdGhlIGNvbXBsZXRlZCBwYXRjaGVzIGZvciBwcmV2aW91cyBjaHVu
a3MgZnJvbSB0aGUgfHBhdGNoX2xpc3R8CisgICAgLy8gYW5kIGF0dGFjaCB0aGVtLgorICAgIENo
dW5rSUQgbGFzdF9jaHVua19pZCA9IDA7ICAvLyAwIGlzIGlycmVsZXZhbnQgYnV0IGtlZXBzIHRo
ZSBjb21waWxlciBoYXBweS4KKyAgICBDb21taXREYXRhUmVxdWVzdDo6Q2h1bmtUb1BhdGNoKiBs
YXN0X2NodW5rX3JlcSA9IG51bGxwdHI7CisgICAgd2hpbGUgKCFwYXRjaF9saXN0LT5lbXB0eSgp
ICYmIHBhdGNoX2xpc3QtPmZyb250KCkuaXNfcGF0Y2hlZCgpKSB7CisgICAgICBpZiAoIWxhc3Rf
Y2h1bmtfcmVxIHx8IGxhc3RfY2h1bmtfaWQgIT0gcGF0Y2hfbGlzdC0+ZnJvbnQoKS5jaHVua19p
ZCkgeworICAgICAgICBsYXN0X2NodW5rX3JlcSA9IGNvbW1pdF9kYXRhX3JlcV8tPmFkZF9jaHVu
a3NfdG9fcGF0Y2goKTsKKyAgICAgICAgbGFzdF9jaHVua19yZXEtPnNldF93cml0ZXJfaWQod3Jp
dGVyX2lkKTsKKyAgICAgICAgbGFzdF9jaHVua19pZCA9IHBhdGNoX2xpc3QtPmZyb250KCkuY2h1
bmtfaWQ7CisgICAgICAgIGxhc3RfY2h1bmtfcmVxLT5zZXRfY2h1bmtfaWQobGFzdF9jaHVua19p
ZCk7CisgICAgICAgIGxhc3RfY2h1bmtfcmVxLT5zZXRfdGFyZ2V0X2J1ZmZlcih0YXJnZXRfYnVm
ZmVyKTsKKyAgICAgIH0KKyAgICAgIGF1dG8qIHBhdGNoX3JlcSA9IGxhc3RfY2h1bmtfcmVxLT5h
ZGRfcGF0Y2hlcygpOworICAgICAgcGF0Y2hfcmVxLT5zZXRfb2Zmc2V0KHBhdGNoX2xpc3QtPmZy
b250KCkub2Zmc2V0KTsKKyAgICAgIHBhdGNoX3JlcS0+c2V0X2RhdGEoJnBhdGNoX2xpc3QtPmZy
b250KCkuc2l6ZV9maWVsZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hfbGlz
dC0+ZnJvbnQoKS5zaXplX2ZpZWxkLnNpemUoKSk7CisgICAgICBwYXRjaF9saXN0LT5wb3BfZnJv
bnQoKTsKKyAgICB9CisgICAgLy8gUGF0Y2hlcyBhcmUgZW5xdWV1ZWQgaW4gdGhlIHxwYXRjaF9s
aXN0fCBpbiBvcmRlciBhbmQgYXJlIG5vdGlmaWVkIHRvCisgICAgLy8gdGhlIHNlcnZpY2Ugd2hl
biB0aGUgY2h1bmsgaXMgcmV0dXJuZWQuIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGUgY3VycmVudAor
ICAgIC8vIHBhdGNoIGxpc3QgaXMgaW5jb21wbGV0ZSBpcyBpZiB0aGVyZSBpcyBhbiB1bnBhdGNo
ZWQgZW50cnkgYXQgdGhlIGhlYWQgb2YKKyAgICAvLyB0aGUgfHBhdGNoX2xpc3R8IHRoYXQgYmVs
b25ncyB0byB0aGUgc2FtZSBDaHVua0lEIGFzIHRoZSBsYXN0IG9uZSB3ZSBhcmUKKyAgICAvLyBh
Ym91dCB0byBzZW5kIHRvIHRoZSBzZXJ2aWNlLgorICAgIGlmIChsYXN0X2NodW5rX3JlcSAmJiAh
cGF0Y2hfbGlzdC0+ZW1wdHkoKSAmJgorICAgICAgICBwYXRjaF9saXN0LT5mcm9udCgpLmNodW5r
X2lkID09IGxhc3RfY2h1bmtfaWQpIHsKKyAgICAgIGxhc3RfY2h1bmtfcmVxLT5zZXRfaGFzX21v
cmVfcGF0Y2hlcyh0cnVlKTsKKyAgICB9CisgIH0gIC8vIHNjb3BlZF9sb2NrKGxvY2tfKQorCisg
IC8vIFdlIHNob3VsZG4ndCBwb3N0IHRhc2tzIHdoaWxlIGxvY2tlZC4gfHRhc2tfcnVubmVyX3Rv
X3Bvc3RfY2FsbGJhY2tfb258CisgIC8vIHJlbWFpbnMgdmFsaWQgYWZ0ZXIgdW5sb2NraW5nLCBi
ZWNhdXNlIHx0YXNrX3J1bm5lcl98IGlzIG5ldmVyIHJlc2V0LgorICBpZiAodGFza19ydW5uZXJf
dG9fcG9zdF9jYWxsYmFja19vbikgeworICAgIHRhc2tfcnVubmVyX3RvX3Bvc3RfY2FsbGJhY2tf
b24tPlBvc3RUYXNrKFt3ZWFrX3RoaXNdIHsKKyAgICAgIGlmICh3ZWFrX3RoaXMpCisgICAgICAg
IHdlYWtfdGhpcy0+Rmx1c2hQZW5kaW5nQ29tbWl0RGF0YVJlcXVlc3RzKCk7CisgICAgfSk7Cisg
IH0KK30KKworLy8gVGhpcyBmdW5jdGlvbiBpcyBxdWl0ZSBzdWJ0bGUuIFdoZW4gbWFraW5nIGNo
YW5nZXMga2VlcCBpbiBtaW5kIHRoZXNlIHR3bworLy8gY2hhbGxlbmdlczoKKy8vIDEpIElmIHRo
ZSBwcm9kdWNlciBzdGFsbHMgYW5kIHdlIGhhcHBlbiB0byBiZSBvbiB0aGUgfHRhc2tfcnVubmVy
X3wgSVBDCisvLyAgICB0aHJlYWQgKG9yLCBmb3IgaW4tcHJvY2VzcyBjYXNlcywgb24gdGhlIHNh
bWUgdGhyZWFkIHdoZXJlCisvLyAgICBUcmFjaW5nU2VydmljZUltcGwgbGl2ZXMpLCB0aGUgQ29t
bWl0RGF0YSgpIGNhbGwgbXVzdCBiZSBzeW5jaHJvbm91cyBhbmQKKy8vICAgIG5vdCBwb3N0ZWQs
IHRvIGF2b2lkIGRlYWRsb2Nrcy4KKy8vIDIpIFdoZW4gZGlmZmVyZW50IHRocmVhZHMgaGl0IHRo
aXMgZnVuY3Rpb24sIHdlIG11c3QgZ3VhcmFudGVlIHRoYXQgd2UgZG9uJ3QKKy8vICAgIGFjY2lk
ZW50YWxseSBtYWtlIGNvbW1pdHMgb3V0IG9mIG9yZGVyLiBTZWUgY29tbWl0IDRlNGZlOGY1NmVm
IGFuZAorLy8gICAgY3JidWcuY29tLzkxOTE4NyBmb3IgbW9yZSBjb250ZXh0Lgordm9pZCBTaGFy
ZWRNZW1vcnlBcmJpdGVySW1wbDo6Rmx1c2hQZW5kaW5nQ29tbWl0RGF0YVJlcXVlc3RzKAorICAg
IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjYWxsYmFjaykgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q29t
bWl0RGF0YVJlcXVlc3Q+IHJlcTsKKyAgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRl
eD4gc2NvcGVkX2xvY2sobG9ja18pOworCisgICAgLy8gRmx1c2hpbmcgaXMgb25seSBzdXBwb3J0
ZWQgd2hpbGUgfGZ1bGx5X2JvdW5kX3wsIGFuZCB0aGVyZSBtYXkgc3RpbGwgYmUKKyAgICAvLyB1
bmJvdW5kIHN0YXJ0dXAgdHJhY2Ugd3JpdGVycy4gSWYgc28sIHNraXAgdGhlIGNvbW1pdCBmb3Ig
bm93IC0gaXQnbGwgYmUKKyAgICAvLyBkb25lIHdoZW4gfGZ1bGx5X2JvdW5kX3wgaXMgdXBkYXRl
ZC4KKyAgICBpZiAoIWZ1bGx5X2JvdW5kXykgeworICAgICAgaWYgKGNhbGxiYWNrKQorICAgICAg
ICBwZW5kaW5nX2ZsdXNoX2NhbGxiYWNrc18ucHVzaF9iYWNrKGNhbGxiYWNrKTsKKyAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICAvLyBNYXkgYmUgY2FsbGVkIGJ5IFRyYWNlV3JpdGVySW1wbCBv
biBhbnkgdGhyZWFkLgorICAgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyID0gdGFza19y
dW5uZXJfOworICAgIGlmICghdGFza19ydW5uZXItPlJ1bnNUYXNrc09uQ3VycmVudFRocmVhZCgp
KSB7CisgICAgICAvLyBXZSBzaG91bGRuJ3QgcG9zdCBhIHRhc2sgd2hpbGUgaG9sZGluZyBhIGxv
Y2suIHx0YXNrX3J1bm5lcnwgcmVtYWlucworICAgICAgLy8gdmFsaWQgYWZ0ZXIgdW5sb2NraW5n
LCBiZWNhdXNlIHx0YXNrX3J1bm5lcl98IGlzIG5ldmVyIHJlc2V0LgorICAgICAgc2NvcGVkX2xv
Y2sudW5sb2NrKCk7CisKKyAgICAgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8u
R2V0V2Vha1B0cigpOworICAgICAgdGFza19ydW5uZXItPlBvc3RUYXNrKFt3ZWFrX3RoaXMsIGNh
bGxiYWNrXSB7CisgICAgICAgIGlmICh3ZWFrX3RoaXMpCisgICAgICAgICAgd2Vha190aGlzLT5G
bHVzaFBlbmRpbmdDb21taXREYXRhUmVxdWVzdHMoc3RkOjptb3ZlKGNhbGxiYWNrKSk7CisgICAg
ICB9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB8Y29tbWl0X2RhdGFfcmVxX3wg
Y291bGQgaGF2ZSBiZWNvbWUgYSBudWxscHRyLCBmb3IgZXhhbXBsZSB3aGVuIGEgZm9yY2VkCisg
ICAgLy8gc3luYyBmbHVzaCBoYXBwZW5zIGluIEdldE5ld0NodW5rKCkuCisgICAgaWYgKGNvbW1p
dF9kYXRhX3JlcV8pIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSBhbnkgcGxhY2Vob2xkZXIgYnVmZmVy
IElEcyBmcm9tIFN0YXJ0dXBXcml0ZXJzIGFyZSByZXBsYWNlZAorICAgICAgLy8gYmVmb3JlIHNl
bmRpbmcgdGhlIHJlcXVlc3QuCisgICAgICBib29sIGFsbF9wbGFjZWhvbGRlcnNfcmVwbGFjZWQg
PQorICAgICAgICAgIFJlcGxhY2VDb21taXRQbGFjZWhvbGRlckJ1ZmZlcklkc0xvY2tlZCgpOwor
ICAgICAgLy8gV2UncmUgfGZ1bGx5X2JvdW5kX3wsIHRodXMgYWxsIHdyaXRlcnMgYXJlIGJvdW5k
IGFuZCBhbGwgcGxhY2Vob2xkZXJzCisgICAgICAvLyBzaG91bGQgaGF2ZSBiZWVuIHJlcGxhY2Vk
LgorICAgICAgUEVSRkVUVE9fRENIRUNLKGFsbF9wbGFjZWhvbGRlcnNfcmVwbGFjZWQpOworCisg
ICAgICByZXEgPSBzdGQ6Om1vdmUoY29tbWl0X2RhdGFfcmVxXyk7CisgICAgICBieXRlc19wZW5k
aW5nX2NvbW1pdF8gPSAwOworICAgIH0KKyAgfSAgLy8gc2NvcGVkX2xvY2sKKworICBpZiAocmVx
KSB7CisgICAgcHJvZHVjZXJfZW5kcG9pbnRfLT5Db21taXREYXRhKCpyZXEsIGNhbGxiYWNrKTsK
KyAgfSBlbHNlIGlmIChjYWxsYmFjaykgeworICAgIC8vIElmIHxyZXF8IHdhcyBudWxscHRyLCBp
dCBtZWFucyB0aGF0IGFuIGVucXVldWVkIGRlZmVycmVkIGNvbW1pdCB3YXMKKyAgICAvLyBleGVj
dXRlZCBqdXN0IGJlZm9yZSB0aGlzLiBBdCB0aGlzIHBvaW50IHNlbmQgYW4gZW1wdHkgY29tbWl0
IHJlcXVlc3QKKyAgICAvLyB0byB0aGUgc2VydmljZSwganVzdCB0byBsaW5lYXJpemUgd2l0aCBp
dCBhbmQgZ2l2ZSB0aGUgZ3VhcmFudGVlIHRvIHRoZQorICAgIC8vIGNhbGxlciB0aGF0IHRoZSBk
YXRhIGhhcyBiZWVuIGZsdXNoZWQgaW50byB0aGUgc2VydmljZS4KKyAgICBwcm9kdWNlcl9lbmRw
b2ludF8tPkNvbW1pdERhdGEoQ29tbWl0RGF0YVJlcXVlc3QoKSwgc3RkOjptb3ZlKGNhbGxiYWNr
KSk7CisgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPFRyYWNlV3JpdGVyPiBTaGFyZWRNZW1vcnlB
cmJpdGVySW1wbDo6Q3JlYXRlVHJhY2VXcml0ZXIoCisgICAgQnVmZmVySUQgdGFyZ2V0X2J1ZmZl
ciwKKyAgICBCdWZmZXJFeGhhdXN0ZWRQb2xpY3kgYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3kpIHsK
KyAgUEVSRkVUVE9fQ0hFQ0sodGFyZ2V0X2J1ZmZlciA+IDApOworICByZXR1cm4gQ3JlYXRlVHJh
Y2VXcml0ZXJJbnRlcm5hbCh0YXJnZXRfYnVmZmVyLCBidWZmZXJfZXhoYXVzdGVkX3BvbGljeSk7
Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxUcmFjZVdyaXRlcj4gU2hhcmVkTWVtb3J5QXJiaXRlcklt
cGw6OkNyZWF0ZVN0YXJ0dXBUcmFjZVdyaXRlcigKKyAgICB1aW50MTZfdCB0YXJnZXRfYnVmZmVy
X3Jlc2VydmF0aW9uX2lkKSB7CisgIFBFUkZFVFRPX0NIRUNLKCFpbml0aWFsbHlfYm91bmRfKTsK
KyAgcmV0dXJuIENyZWF0ZVRyYWNlV3JpdGVySW50ZXJuYWwoCisgICAgICBNYWtlVGFyZ2V0QnVm
ZmVySWRGb3JSZXNlcnZhdGlvbih0YXJnZXRfYnVmZmVyX3Jlc2VydmF0aW9uX2lkKSwKKyAgICAg
IEJ1ZmZlckV4aGF1c3RlZFBvbGljeTo6a0Ryb3ApOworfQorCit2b2lkIFNoYXJlZE1lbW9yeUFy
Yml0ZXJJbXBsOjpCaW5kVG9Qcm9kdWNlckVuZHBvaW50KAorICAgIFRyYWNpbmdTZXJ2aWNlOjpQ
cm9kdWNlckVuZHBvaW50KiBwcm9kdWNlcl9lbmRwb2ludCwKKyAgICBiYXNlOjpUYXNrUnVubmVy
KiB0YXNrX3J1bm5lcikgeworICBQRVJGRVRUT19EQ0hFQ0socHJvZHVjZXJfZW5kcG9pbnQgJiYg
dGFza19ydW5uZXIpOworICBQRVJGRVRUT19EQ0hFQ0sodGFza19ydW5uZXItPlJ1bnNUYXNrc09u
Q3VycmVudFRocmVhZCgpKTsKKyAgUEVSRkVUVE9fQ0hFQ0soIWluaXRpYWxseV9ib3VuZF8pOwor
CisgIGJvb2wgc2hvdWxkX2ZsdXNoID0gZmFsc2U7CisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBm
bHVzaF9jYWxsYmFjazsKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBzY29w
ZWRfbG9jayhsb2NrXyk7CisgICAgUEVSRkVUVE9fQ0hFQ0soIWZ1bGx5X2JvdW5kXyk7CisgICAg
UEVSRkVUVE9fQ0hFQ0soIXByb2R1Y2VyX2VuZHBvaW50XyAmJiAhdGFza19ydW5uZXJfKTsKKwor
ICAgIHByb2R1Y2VyX2VuZHBvaW50XyA9IHByb2R1Y2VyX2VuZHBvaW50OworICAgIHRhc2tfcnVu
bmVyXyA9IHRhc2tfcnVubmVyOworCisgICAgLy8gTm93IHRoYXQgd2UncmUgYm91bmQgdG8gYSB0
YXNrIHJ1bm5lciwgYWxzbyByZXNldCB0aGUgV2Vha1B0ckZhY3RvcnkgdG8KKyAgICAvLyBpdC4g
QmVjYXVzZSB0aGlzIGNvZGUgcnVucyBvbiB0aGUgdGFzayBydW5uZXIsIHRoZSBmYWN0b3J5J3Mg
d2VhaworICAgIC8vIHBvaW50ZXJzIHdpbGwgYmUgdmFsaWQgb24gaXQuCisgICAgd2Vha19wdHJf
ZmFjdG9yeV8uUmVzZXQodGhpcyk7CisKKyAgICAvLyBBbGwgd3JpdGVycyByZWdpc3RlcmVkIHNv
IGZhciBzaG91bGQgYmUgc3RhcnR1cCB0cmFjZSB3cml0ZXJzLCBzaW5jZQorICAgIC8vIHRoZSBw
cm9kdWNlciBjYW5ub3QgZmVhc2libHkga25vdyB0aGUgdGFyZ2V0IGJ1ZmZlciBmb3IgYW55IGZ1
dHVyZQorICAgIC8vIHNlc3Npb24geWV0LgorICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBw
ZW5kaW5nX3dyaXRlcnNfKSB7CisgICAgICBQRVJGRVRUT19DSEVDSyhJc1Jlc2VydmF0aW9uVGFy
Z2V0QnVmZmVySWQoZW50cnkuc2Vjb25kKSk7CisgICAgfQorCisgICAgLy8gSWYgYWxsIGJ1ZmZl
ciByZXNlcnZhdGlvbnMgYXJlIGJvdW5kLCB3ZSBjYW4gZmx1c2ggcGVuZGluZyBjb21taXRzLgor
ICAgIGlmIChVcGRhdGVGdWxseUJvdW5kTG9ja2VkKCkpIHsKKyAgICAgIHNob3VsZF9mbHVzaCA9
IHRydWU7CisgICAgICBmbHVzaF9jYWxsYmFjayA9IFRha2VQZW5kaW5nRmx1c2hDYWxsYmFja3NM
b2NrZWQoKTsKKyAgICB9CisgIH0gIC8vIHNjb3BlZF9sb2NrCisKKyAgLy8gQXR0ZW1wdCB0byBm
bHVzaCBhbnkgcGVuZGluZyBjb21taXRzIChhbmQgcnVuIHBlbmRpbmcgZmx1c2ggY2FsbGJhY2tz
KS4gSWYKKyAgLy8gdGhlcmUgYXJlIG5vbmUsIHRoaXMgd2lsbCBoYXZlIG5vIGVmZmVjdC4gSWYg
d2UgZW5kZWQgdXAgaW4gYSByYWNlIHRoYXQKKyAgLy8gY2hhbmdlZCB8ZnVsbHlfYm91bmRffCBi
YWNrIHRvIGZhbHNlLCB0aGUgY29tbWl0IHdpbGwgaGFwcGVuIG9uY2Ugd2UgYmVjb21lCisgIC8v
IHxmdWxseV9ib3VuZF98IGFnYWluLgorICBpZiAoc2hvdWxkX2ZsdXNoKQorICAgIEZsdXNoUGVu
ZGluZ0NvbW1pdERhdGFSZXF1ZXN0cyhmbHVzaF9jYWxsYmFjayk7Cit9CisKK3ZvaWQgU2hhcmVk
TWVtb3J5QXJiaXRlckltcGw6OkJpbmRTdGFydHVwVGFyZ2V0QnVmZmVyKAorICAgIHVpbnQxNl90
IHRhcmdldF9idWZmZXJfcmVzZXJ2YXRpb25faWQsCisgICAgQnVmZmVySUQgdGFyZ2V0X2J1ZmZl
cl9pZCkgeworICBQRVJGRVRUT19EQ0hFQ0sodGFyZ2V0X2J1ZmZlcl9pZCA+IDApOworICBQRVJG
RVRUT19DSEVDSyghaW5pdGlhbGx5X2JvdW5kXyk7CisKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6
Om11dGV4PiBzY29wZWRfbG9jayhsb2NrXyk7CisKKyAgLy8gV2Ugc2hvdWxkIGFscmVhZHkgYmUg
Ym91bmQgdG8gYW4gZW5kcG9pbnQsIGJ1dCBub3QgZnVsbHkgYm91bmQuCisgIFBFUkZFVFRPX0NI
RUNLKCFmdWxseV9ib3VuZF8pOworICBQRVJGRVRUT19DSEVDSyhwcm9kdWNlcl9lbmRwb2ludF8p
OworICBQRVJGRVRUT19DSEVDSyh0YXNrX3J1bm5lcl8pOworICBQRVJGRVRUT19DSEVDSyh0YXNr
X3J1bm5lcl8tPlJ1bnNUYXNrc09uQ3VycmVudFRocmVhZCgpKTsKKworICBCaW5kU3RhcnR1cFRh
cmdldEJ1ZmZlckltcGwoc3RkOjptb3ZlKHNjb3BlZF9sb2NrKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHRhcmdldF9idWZmZXJfcmVzZXJ2YXRpb25faWQsIHRhcmdldF9idWZmZXJf
aWQpOworfQorCit2b2lkIFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsOjpBYm9ydFN0YXJ0dXBUcmFj
aW5nRm9yUmVzZXJ2YXRpb24oCisgICAgdWludDE2X3QgdGFyZ2V0X2J1ZmZlcl9yZXNlcnZhdGlv
bl9pZCkgeworICBQRVJGRVRUT19DSEVDSyghaW5pdGlhbGx5X2JvdW5kXyk7CisKKyAgc3RkOjp1
bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBzY29wZWRfbG9jayhsb2NrXyk7CisKKyAgLy8gSWYgd2Ug
YXJlIGFscmVhZHkgYm91bmQgdG8gYW4gYXJiaXRlciwgd2UgbWF5IG5lZWQgdG8gZmx1c2ggYWZ0
ZXIgYWJvcnRpbmcKKyAgLy8gdGhlIHNlc3Npb24sIGFuZCB0aHVzIHNob3VsZCBiZSBydW5uaW5n
IG9uIHRoZSBhcmJpdGVyJ3MgdGFzayBydW5uZXIuCisgIGlmICh0YXNrX3J1bm5lcl8gJiYgIXRh
c2tfcnVubmVyXy0+UnVuc1Rhc2tzT25DdXJyZW50VGhyZWFkKCkpIHsKKyAgICAvLyBXZSBzaG91
bGRuJ3QgcG9zdCB0YXNrcyB3aGlsZSBsb2NrZWQuCisgICAgYXV0byogdGFza19ydW5uZXIgPSB0
YXNrX3J1bm5lcl87CisgICAgc2NvcGVkX2xvY2sudW5sb2NrKCk7CisKKyAgICBhdXRvIHdlYWtf
dGhpcyA9IHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKKyAgICB0YXNrX3J1bm5lci0+
UG9zdFRhc2soW3dlYWtfdGhpcywgdGFyZ2V0X2J1ZmZlcl9yZXNlcnZhdGlvbl9pZF0oKSB7Cisg
ICAgICBpZiAoIXdlYWtfdGhpcykKKyAgICAgICAgcmV0dXJuOworICAgICAgd2Vha190aGlzLT5B
Ym9ydFN0YXJ0dXBUcmFjaW5nRm9yUmVzZXJ2YXRpb24oCisgICAgICAgICAgdGFyZ2V0X2J1ZmZl
cl9yZXNlcnZhdGlvbl9pZCk7CisgICAgfSk7CisgICAgcmV0dXJuOworICB9CisKKyAgUEVSRkVU
VE9fQ0hFQ0soIWZ1bGx5X2JvdW5kXyk7CisKKyAgLy8gQmluZCB0aGUgdGFyZ2V0IGJ1ZmZlciBy
ZXNlcnZhdGlvbiB0byBhbiBpbnZhbGlkIGJ1ZmZlciAoSUQgMCksIHNvIHRoYXQKKyAgLy8gZXhp
c3RpbmcgY29tbWl0cywgYXMgd2VsbCBhcyBmdXR1cmUgY29tbWl0cyAob2YgY3VycmVudGx5IGFj
cXVpcmVkIGNodW5rcyksCisgIC8vIHdpbGwgYmUgcmVsZWFzZWQgYXMgZnJlZSBmcmVlIGJ5IHRo
ZSBzZXJ2aWNlIGJ1dCBvdGhlcndpc2UgaWdub3JlZCAoaS5lLgorICAvLyBub3QgY29waWVkIGlu
dG8gYW55IHZhbGlkIHRhcmdldCBidWZmZXIpLgorICBCaW5kU3RhcnR1cFRhcmdldEJ1ZmZlcklt
cGwoc3RkOjptb3ZlKHNjb3BlZF9sb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRhcmdldF9idWZmZXJfcmVzZXJ2YXRpb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvKnRhcmdldF9idWZmZXJfaWQ9Ki9rSW52YWxpZEJ1ZmZlcklkKTsKK30KKwordm9pZCBT
aGFyZWRNZW1vcnlBcmJpdGVySW1wbDo6QmluZFN0YXJ0dXBUYXJnZXRCdWZmZXJJbXBsKAorICAg
IHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gc2NvcGVkX2xvY2ssCisgICAgdWludDE2X3Qg
dGFyZ2V0X2J1ZmZlcl9yZXNlcnZhdGlvbl9pZCwKKyAgICBCdWZmZXJJRCB0YXJnZXRfYnVmZmVy
X2lkKSB7CisgIC8vIFdlIHNob3VsZCBhbHJlYWR5IGJlIGJvdW5kIHRvIGFuIGVuZHBvaW50IGlm
IHRoZSB0YXJnZXQgYnVmZmVyIGlzIHZhbGlkLgorICBQRVJGRVRUT19EQ0hFQ0soKHByb2R1Y2Vy
X2VuZHBvaW50XyAmJiB0YXNrX3J1bm5lcl8pIHx8CisgICAgICAgICAgICAgICAgICB0YXJnZXRf
YnVmZmVyX2lkID09IGtJbnZhbGlkQnVmZmVySWQpOworCisgIE1heWJlVW5ib3VuZEJ1ZmZlcklE
IHJlc2VydmVkX2lkID0KKyAgICAgIE1ha2VUYXJnZXRCdWZmZXJJZEZvclJlc2VydmF0aW9uKHRh
cmdldF9idWZmZXJfcmVzZXJ2YXRpb25faWQpOworCisgIGJvb2wgc2hvdWxkX2ZsdXNoID0gZmFs
c2U7CisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmbHVzaF9jYWxsYmFjazsKKyAgc3RkOjp2ZWN0
b3I8c3RkOjpwYWlyPFdyaXRlcklELCBCdWZmZXJJRD4+IHdyaXRlcnNfdG9fcmVnaXN0ZXI7CisK
KyAgVGFyZ2V0QnVmZmVyUmVzZXJ2YXRpb24mIHJlc2VydmF0aW9uID0KKyAgICAgIHRhcmdldF9i
dWZmZXJfcmVzZXJ2YXRpb25zX1tyZXNlcnZlZF9pZF07CisgIFBFUkZFVFRPX0NIRUNLKCFyZXNl
cnZhdGlvbi5yZXNvbHZlZCk7CisgIHJlc2VydmF0aW9uLnJlc29sdmVkID0gdHJ1ZTsKKyAgcmVz
ZXJ2YXRpb24udGFyZ2V0X2J1ZmZlciA9IHRhcmdldF9idWZmZXJfaWQ7CisKKyAgLy8gQ29sbGVj
dCB0cmFjZSB3cml0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzZXJ2YXRpb24uCisgIGZvciAo
YXV0byBpdCA9IHBlbmRpbmdfd3JpdGVyc18uYmVnaW4oKTsgaXQgIT0gcGVuZGluZ193cml0ZXJz
Xy5lbmQoKTspIHsKKyAgICBpZiAoaXQtPnNlY29uZCA9PSByZXNlcnZlZF9pZCkgeworICAgICAg
Ly8gTm8gbmVlZCB0byByZWdpc3RlciB3cml0ZXJzIHRoYXQgaGF2ZSBhbiBpbnZhbGlkIHRhcmdl
dCBidWZmZXIuCisgICAgICBpZiAodGFyZ2V0X2J1ZmZlcl9pZCAhPSBrSW52YWxpZEJ1ZmZlcklk
KSB7CisgICAgICAgIHdyaXRlcnNfdG9fcmVnaXN0ZXIucHVzaF9iYWNrKAorICAgICAgICAgICAg
c3RkOjptYWtlX3BhaXIoaXQtPmZpcnN0LCB0YXJnZXRfYnVmZmVyX2lkKSk7CisgICAgICB9Cisg
ICAgICBpdCA9IHBlbmRpbmdfd3JpdGVyc18uZXJhc2UoaXQpOworICAgIH0gZWxzZSB7CisgICAg
ICBpdCsrOworICAgIH0KKyAgfQorCisgIC8vIElmIGFsbCBidWZmZXIgcmVzZXJ2YXRpb25zIGFy
ZSBib3VuZCwgd2UgY2FuIGZsdXNoIHBlbmRpbmcgY29tbWl0cy4KKyAgaWYgKFVwZGF0ZUZ1bGx5
Qm91bmRMb2NrZWQoKSkgeworICAgIHNob3VsZF9mbHVzaCA9IHRydWU7CisgICAgZmx1c2hfY2Fs
bGJhY2sgPSBUYWtlUGVuZGluZ0ZsdXNoQ2FsbGJhY2tzTG9ja2VkKCk7CisgIH0KKworICBzY29w
ZWRfbG9jay51bmxvY2soKTsKKworICAvLyBSZWdpc3RlciBhbnkgbmV3bHkgYm91bmQgdHJhY2Ug
d3JpdGVycyB3aXRoIHRoZSBzZXJ2aWNlLgorICBmb3IgKGNvbnN0IGF1dG8mIHdyaXRlcl9hbmRf
dGFyZ2V0X2J1ZmZlciA6IHdyaXRlcnNfdG9fcmVnaXN0ZXIpIHsKKyAgICBwcm9kdWNlcl9lbmRw
b2ludF8tPlJlZ2lzdGVyVHJhY2VXcml0ZXIod3JpdGVyX2FuZF90YXJnZXRfYnVmZmVyLmZpcnN0
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXJfYW5k
X3RhcmdldF9idWZmZXIuc2Vjb25kKTsKKyAgfQorCisgIC8vIEF0dGVtcHQgdG8gZmx1c2ggYW55
IHBlbmRpbmcgY29tbWl0cyAoYW5kIHJ1biBwZW5kaW5nIGZsdXNoIGNhbGxiYWNrcykuIElmCisg
IC8vIHRoZXJlIGFyZSBub25lLCB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuIElmIHdlIGVuZGVk
IHVwIGluIGEgcmFjZSB0aGF0CisgIC8vIGNoYW5nZWQgfGZ1bGx5X2JvdW5kX3wgYmFjayB0byBm
YWxzZSwgdGhlIGNvbW1pdCB3aWxsIGhhcHBlbiBvbmNlIHdlIGJlY29tZQorICAvLyB8ZnVsbHlf
Ym91bmRffCBhZ2Fpbi4KKyAgaWYgKHNob3VsZF9mbHVzaCkKKyAgICBGbHVzaFBlbmRpbmdDb21t
aXREYXRhUmVxdWVzdHMoZmx1c2hfY2FsbGJhY2spOworfQorCitzdGQ6OmZ1bmN0aW9uPHZvaWQo
KT4KK1NoYXJlZE1lbW9yeUFyYml0ZXJJbXBsOjpUYWtlUGVuZGluZ0ZsdXNoQ2FsbGJhY2tzTG9j
a2VkKCkgeworICBpZiAocGVuZGluZ19mbHVzaF9jYWxsYmFja3NfLmVtcHR5KCkpCisgICAgcmV0
dXJuIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPigpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rp
b248dm9pZCgpPj4gcGVuZGluZ19mbHVzaF9jYWxsYmFja3M7CisgIHBlbmRpbmdfZmx1c2hfY2Fs
bGJhY2tzLnN3YXAocGVuZGluZ19mbHVzaF9jYWxsYmFja3NfKTsKKyAgLy8gQ2FwdHVyZSB0aGUg
Y2FsbGJhY2sgbGlzdCBpbnRvIHRoZSBsYW1iZGEgYnkgY29weS4KKyAgcmV0dXJuIFtwZW5kaW5n
X2ZsdXNoX2NhbGxiYWNrc10oKSB7CisgICAgZm9yIChhdXRvJiBjYWxsYmFjayA6IHBlbmRpbmdf
Zmx1c2hfY2FsbGJhY2tzKQorICAgICAgY2FsbGJhY2soKTsKKyAgfTsKK30KKwordm9pZCBTaGFy
ZWRNZW1vcnlBcmJpdGVySW1wbDo6Tm90aWZ5Rmx1c2hDb21wbGV0ZShGbHVzaFJlcXVlc3RJRCBy
ZXFfaWQpIHsKKyAgYmFzZTo6VGFza1J1bm5lciogdGFza19ydW5uZXJfdG9fY29tbWl0X29uID0g
bnVsbHB0cjsKKworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHNjb3BlZF9s
b2NrKGxvY2tfKTsKKyAgICAvLyBJZiBhIGNvbW1pdF9kYXRhX3JlcV8gZXhpc3RzIGl0IG1lYW5z
IHRoYXQgc29tZWJvZHkgZWxzZSBhbHJlYWR5IHBvc3RlZCBhCisgICAgLy8gRmx1c2hQZW5kaW5n
Q29tbWl0RGF0YVJlcXVlc3RzKCkgdGFzay4KKyAgICBpZiAoIWNvbW1pdF9kYXRhX3JlcV8pIHsK
KyAgICAgIGNvbW1pdF9kYXRhX3JlcV8ucmVzZXQobmV3IENvbW1pdERhdGFSZXF1ZXN0KCkpOwor
CisgICAgICAvLyBGbHVzaGluZyB0aGUgY29tbWl0IGlzIG9ubHkgc3VwcG9ydGVkIHdoaWxlIHdl
J3JlIHxmdWxseV9ib3VuZF98LiBJZiB3ZQorICAgICAgLy8gYXJlbid0LCB3ZSdsbCBmbHVzaCB3
aGVuIHxmdWxseV9ib3VuZF98IGlzIHVwZGF0ZWQuCisgICAgICBpZiAoZnVsbHlfYm91bmRfKQor
ICAgICAgICB0YXNrX3J1bm5lcl90b19jb21taXRfb24gPSB0YXNrX3J1bm5lcl87CisgICAgfSBl
bHNlIHsKKyAgICAgIC8vIElmIHRoZXJlIGlzIGFub3RoZXIgcmVxdWVzdCBxdWV1ZWQgYW5kIHRo
YXQgYWxzbyBjb250YWlucyBpcyBhIHJlcGx5CisgICAgICAvLyB0byBhIGZsdXNoIHJlcXVlc3Qs
IHJlcGx5IHdpdGggdGhlIGhpZ2hlc3QgaWQuCisgICAgICByZXFfaWQgPSBzdGQ6Om1heChyZXFf
aWQsIGNvbW1pdF9kYXRhX3JlcV8tPmZsdXNoX3JlcXVlc3RfaWQoKSk7CisgICAgfQorICAgIGNv
bW1pdF9kYXRhX3JlcV8tPnNldF9mbHVzaF9yZXF1ZXN0X2lkKHJlcV9pZCk7CisgIH0gIC8vIHNj
b3BlZF9sb2NrCisKKyAgLy8gV2Ugc2hvdWxkbid0IHBvc3QgdGFza3Mgd2hpbGUgbG9ja2VkLiB8
dGFza19ydW5uZXJfdG9fY29tbWl0X29ufAorICAvLyByZW1haW5zIHZhbGlkIGFmdGVyIHVubG9j
a2luZywgYmVjYXVzZSB8dGFza19ydW5uZXJffCBpcyBuZXZlciByZXNldC4KKyAgaWYgKHRhc2tf
cnVubmVyX3RvX2NvbW1pdF9vbikgeworICAgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFj
dG9yeV8uR2V0V2Vha1B0cigpOworICAgIHRhc2tfcnVubmVyX3RvX2NvbW1pdF9vbi0+UG9zdFRh
c2soW3dlYWtfdGhpc10geworICAgICAgaWYgKHdlYWtfdGhpcykKKyAgICAgICAgd2Vha190aGlz
LT5GbHVzaFBlbmRpbmdDb21taXREYXRhUmVxdWVzdHMoKTsKKyAgICB9KTsKKyAgfQorfQorCitz
dGQ6OnVuaXF1ZV9wdHI8VHJhY2VXcml0ZXI+IFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsOjpDcmVh
dGVUcmFjZVdyaXRlckludGVybmFsKAorICAgIE1heWJlVW5ib3VuZEJ1ZmZlcklEIHRhcmdldF9i
dWZmZXIsCisgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5IGJ1ZmZlcl9leGhhdXN0ZWRfcG9saWN5
KSB7CisgIFdyaXRlcklEIGlkOworICBiYXNlOjpUYXNrUnVubmVyKiB0YXNrX3J1bm5lcl90b19y
ZWdpc3Rlcl9vbiA9IG51bGxwdHI7CisKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11
dGV4PiBzY29wZWRfbG9jayhsb2NrXyk7CisgICAgaWQgPSBhY3RpdmVfd3JpdGVyX2lkc18uQWxs
b2NhdGUoKTsKKworICAgIGlmICghaWQpCisgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFRy
YWNlV3JpdGVyPihuZXcgTnVsbFRyYWNlV3JpdGVyKCkpOworCisgICAgUEVSRkVUVE9fRENIRUNL
KCFwZW5kaW5nX3dyaXRlcnNfLmNvdW50KGlkKSk7CisKKyAgICBpZiAoSXNSZXNlcnZhdGlvblRh
cmdldEJ1ZmZlcklkKHRhcmdldF9idWZmZXIpKSB7CisgICAgICAvLyBJZiB0aGUgcmVzZXJ2YXRp
b24gaXMgbmV3LCBtYXJrIGl0IGFzIHVuYm91bmQgaW4KKyAgICAgIC8vIHx0YXJnZXRfYnVmZmVy
X3Jlc2VydmF0aW9uc198LiBPdGhlcndpc2UsIGlmIHRoZSByZXNlcnZhdGlvbiB3YXMKKyAgICAg
IC8vIGFscmVhZHkgYm91bmQsIGNob29zZSB0aGUgYm91bmQgYnVmZmVyIElEIG5vdy4KKyAgICAg
IGF1dG8gaXRfYW5kX2luc2VydGVkID0gdGFyZ2V0X2J1ZmZlcl9yZXNlcnZhdGlvbnNfLmluc2Vy
dCgKKyAgICAgICAgICB7dGFyZ2V0X2J1ZmZlciwgVGFyZ2V0QnVmZmVyUmVzZXJ2YXRpb24oKX0p
OworICAgICAgaWYgKGl0X2FuZF9pbnNlcnRlZC5maXJzdC0+c2Vjb25kLnJlc29sdmVkKQorICAg
ICAgICB0YXJnZXRfYnVmZmVyID0gaXRfYW5kX2luc2VydGVkLmZpcnN0LT5zZWNvbmQudGFyZ2V0
X2J1ZmZlcjsKKyAgICB9CisKKyAgICBpZiAoSXNSZXNlcnZhdGlvblRhcmdldEJ1ZmZlcklkKHRh
cmdldF9idWZmZXIpKSB7CisgICAgICAvLyBUaGUgYXJiaXRlciBhbmQvb3Igc3RhcnR1cCBidWZm
ZXIgcmVzZXJ2YXRpb25zIGFyZSBub3QgYm91bmQgeWV0LCBzbworICAgICAgLy8gYnVmZmVyIHRo
ZSByZWdpc3RyYXRpb24gb2YgdGhlIHdyaXRlciB1bnRpbCBhZnRlciB3ZSdyZSBib3VuZC4KKyAg
ICAgIHBlbmRpbmdfd3JpdGVyc19baWRdID0gdGFyZ2V0X2J1ZmZlcjsKKworICAgICAgLy8gTWFy
ayB0aGUgYXJiaXRlciBhcyBub3QgZnVsbHkgYm91bmQsIHNpbmNlIHdlIG5vdyBoYXZlIGF0IGxl
YXN0IG9uZQorICAgICAgLy8gdW5ib3VuZCB0cmFjZSB3cml0ZXIgLyB0YXJnZXQgYnVmZmVyIHJl
c2VydmF0aW9uLgorICAgICAgZnVsbHlfYm91bmRfID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICh0
YXJnZXRfYnVmZmVyICE9IGtJbnZhbGlkQnVmZmVySWQpIHsKKyAgICAgIC8vIFRyYWNlIHdyaXRl
ciBpcyBib3VuZCwgc28gYXJiaXRlciBzaG91bGQgYmUgYm91bmQgdG8gYW4gZW5kcG9pbnQsIHRv
by4KKyAgICAgIFBFUkZFVFRPX0NIRUNLKHByb2R1Y2VyX2VuZHBvaW50XyAmJiB0YXNrX3J1bm5l
cl8pOworICAgICAgdGFza19ydW5uZXJfdG9fcmVnaXN0ZXJfb24gPSB0YXNrX3J1bm5lcl87Cisg
ICAgfQorICB9ICAvLyBzY29wZWRfbG9jaworCisgIC8vIFdlIHNob3VsZG4ndCBwb3N0IHRhc2tz
IHdoaWxlIGxvY2tlZC4gfHRhc2tfcnVubmVyX3RvX3JlZ2lzdGVyX29ufAorICAvLyByZW1haW5z
IHZhbGlkIGFmdGVyIHVubG9ja2luZywgYmVjYXVzZSB8dGFza19ydW5uZXJffCBpcyBuZXZlciBy
ZXNldC4KKyAgaWYgKHRhc2tfcnVubmVyX3RvX3JlZ2lzdGVyX29uKSB7CisgICAgYXV0byB3ZWFr
X3RoaXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgICAgdGFza19ydW5uZXJf
dG9fcmVnaXN0ZXJfb24tPlBvc3RUYXNrKFt3ZWFrX3RoaXMsIGlkLCB0YXJnZXRfYnVmZmVyXSB7
CisgICAgICBpZiAod2Vha190aGlzKQorICAgICAgICB3ZWFrX3RoaXMtPnByb2R1Y2VyX2VuZHBv
aW50Xy0+UmVnaXN0ZXJUcmFjZVdyaXRlcihpZCwgdGFyZ2V0X2J1ZmZlcik7CisgICAgfSk7Cisg
IH0KKworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFRyYWNlV3JpdGVyPigKKyAgICAgIG5ldyBU
cmFjZVdyaXRlckltcGwodGhpcywgaWQsIHRhcmdldF9idWZmZXIsIGJ1ZmZlcl9leGhhdXN0ZWRf
cG9saWN5KSk7Cit9CisKK3ZvaWQgU2hhcmVkTWVtb3J5QXJiaXRlckltcGw6OlJlbGVhc2VXcml0
ZXJJRChXcml0ZXJJRCBpZCkgeworICBiYXNlOjpUYXNrUnVubmVyKiB0YXNrX3J1bm5lciA9IG51
bGxwdHI7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gc2NvcGVkX2xvY2so
bG9ja18pOworICAgIGFjdGl2ZV93cml0ZXJfaWRzXy5GcmVlKGlkKTsKKworICAgIGF1dG8gaXQg
PSBwZW5kaW5nX3dyaXRlcnNfLmZpbmQoaWQpOworICAgIGlmIChpdCAhPSBwZW5kaW5nX3dyaXRl
cnNfLmVuZCgpKSB7CisgICAgICAvLyBXcml0ZXIgaGFzbid0IGJlZW4gYm91bmQgeWV0IGFuZCB0
aHVzIGFsc28gbm90IHlldCByZWdpc3RlcmVkIHdpdGggdGhlCisgICAgICAvLyBzZXJ2aWNlLgor
ICAgICAgcGVuZGluZ193cml0ZXJzXy5lcmFzZShpdCk7CisgICAgICByZXR1cm47CisgICAgfQor
CisgICAgLy8gQSB0cmFjZSB3cml0ZXIgZnJvbSBhbiBhYm9ydGVkIHNlc3Npb24gbWF5IGJlIGRl
c3Ryb3llZCBiZWZvcmUgdGhlCisgICAgLy8gYXJiaXRlciBpcyBib3VuZCB0byBhIHRhc2sgcnVu
bmVyLiBJbiB0aGF0IGNhc2UsIGl0IHdhcyBuZXZlciByZWdpc3RlcmVkCisgICAgLy8gd2l0aCB0
aGUgc2VydmljZS4KKyAgICBpZiAoIXRhc2tfcnVubmVyXykKKyAgICAgIHJldHVybjsKKworICAg
IHRhc2tfcnVubmVyID0gdGFza19ydW5uZXJfOworICB9ICAvLyBzY29wZWRfbG9jaworCisgIC8v
IFdlIHNob3VsZG4ndCBwb3N0IHRhc2tzIHdoaWxlIGxvY2tlZC4gfHRhc2tfcnVubmVyfCByZW1h
aW5zIHZhbGlkIGFmdGVyCisgIC8vIHVubG9ja2luZywgYmVjYXVzZSB8dGFza19ydW5uZXJffCBp
cyBuZXZlciByZXNldC4KKyAgYXV0byB3ZWFrX3RoaXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRX
ZWFrUHRyKCk7CisgIHRhc2tfcnVubmVyLT5Qb3N0VGFzayhbd2Vha190aGlzLCBpZF0geworICAg
IGlmICh3ZWFrX3RoaXMpCisgICAgICB3ZWFrX3RoaXMtPnByb2R1Y2VyX2VuZHBvaW50Xy0+VW5y
ZWdpc3RlclRyYWNlV3JpdGVyKGlkKTsKKyAgfSk7Cit9CisKK2Jvb2wgU2hhcmVkTWVtb3J5QXJi
aXRlckltcGw6OlJlcGxhY2VDb21taXRQbGFjZWhvbGRlckJ1ZmZlcklkc0xvY2tlZCgpIHsKKyAg
aWYgKCFjb21taXRfZGF0YV9yZXFfKQorICAgIHJldHVybiB0cnVlOworCisgIGJvb2wgYWxsX3Bs
YWNlaG9sZGVyc19yZXBsYWNlZCA9IHRydWU7CisgIGZvciAoYXV0byYgY2h1bmsgOiAqY29tbWl0
X2RhdGFfcmVxXy0+bXV0YWJsZV9jaHVua3NfdG9fbW92ZSgpKSB7CisgICAgaWYgKCFJc1Jlc2Vy
dmF0aW9uVGFyZ2V0QnVmZmVySWQoY2h1bmsudGFyZ2V0X2J1ZmZlcigpKSkKKyAgICAgIGNvbnRp
bnVlOworICAgIGNvbnN0IGF1dG8gaXQgPSB0YXJnZXRfYnVmZmVyX3Jlc2VydmF0aW9uc18uZmlu
ZChjaHVuay50YXJnZXRfYnVmZmVyKCkpOworICAgIFBFUkZFVFRPX0RDSEVDSyhpdCAhPSB0YXJn
ZXRfYnVmZmVyX3Jlc2VydmF0aW9uc18uZW5kKCkpOworICAgIGlmICghaXQtPnNlY29uZC5yZXNv
bHZlZCkgeworICAgICAgYWxsX3BsYWNlaG9sZGVyc19yZXBsYWNlZCA9IGZhbHNlOworICAgICAg
Y29udGludWU7CisgICAgfQorICAgIGNodW5rLnNldF90YXJnZXRfYnVmZmVyKGl0LT5zZWNvbmQu
dGFyZ2V0X2J1ZmZlcik7CisgIH0KKyAgZm9yIChhdXRvJiBjaHVuayA6ICpjb21taXRfZGF0YV9y
ZXFfLT5tdXRhYmxlX2NodW5rc190b19wYXRjaCgpKSB7CisgICAgaWYgKCFJc1Jlc2VydmF0aW9u
VGFyZ2V0QnVmZmVySWQoY2h1bmsudGFyZ2V0X2J1ZmZlcigpKSkKKyAgICAgIGNvbnRpbnVlOwor
ICAgIGNvbnN0IGF1dG8gaXQgPSB0YXJnZXRfYnVmZmVyX3Jlc2VydmF0aW9uc18uZmluZChjaHVu
ay50YXJnZXRfYnVmZmVyKCkpOworICAgIFBFUkZFVFRPX0RDSEVDSyhpdCAhPSB0YXJnZXRfYnVm
ZmVyX3Jlc2VydmF0aW9uc18uZW5kKCkpOworICAgIGlmICghaXQtPnNlY29uZC5yZXNvbHZlZCkg
eworICAgICAgYWxsX3BsYWNlaG9sZGVyc19yZXBsYWNlZCA9IGZhbHNlOworICAgICAgY29udGlu
dWU7CisgICAgfQorICAgIGNodW5rLnNldF90YXJnZXRfYnVmZmVyKGl0LT5zZWNvbmQudGFyZ2V0
X2J1ZmZlcik7CisgIH0KKyAgcmV0dXJuIGFsbF9wbGFjZWhvbGRlcnNfcmVwbGFjZWQ7Cit9CisK
K2Jvb2wgU2hhcmVkTWVtb3J5QXJiaXRlckltcGw6OlVwZGF0ZUZ1bGx5Qm91bmRMb2NrZWQoKSB7
CisgIGlmICghcHJvZHVjZXJfZW5kcG9pbnRfKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKCFmdWxs
eV9ib3VuZF8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBXZSdyZSBmdWxseSBib3Vu
ZCBpZiBhbGwgdGFyZ2V0IGJ1ZmZlciByZXNlcnZhdGlvbnMgaGF2ZSBhIHZhbGlkIGFzc29jaWF0
ZWQKKyAgLy8gQnVmZmVySUQuCisgIGZ1bGx5X2JvdW5kXyA9IHN0ZDo6bm9uZV9vZigKKyAgICAg
IHRhcmdldF9idWZmZXJfcmVzZXJ2YXRpb25zXy5iZWdpbigpLCB0YXJnZXRfYnVmZmVyX3Jlc2Vy
dmF0aW9uc18uZW5kKCksCisgICAgICBbXShzdGQ6OnBhaXI8TWF5YmVVbmJvdW5kQnVmZmVySUQs
IFRhcmdldEJ1ZmZlclJlc2VydmF0aW9uPiBlbnRyeSkgeworICAgICAgICByZXR1cm4gIWVudHJ5
LnNlY29uZC5yZXNvbHZlZDsKKyAgICAgIH0pOworICByZXR1cm4gZnVsbHlfYm91bmRfOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IHNyYy90cmFjaW5nL2NvcmUvdHJhY2VfcGFja2V0LmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2VfcGFj
a2V0LmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8v
ZXh0L3RyYWNpbmcvY29yZS9zbGljZS5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBB
bmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBh
Y2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90
IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAq
IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJl
cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy
ZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFO
WSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZv
ciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGlt
aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZF
VFRPX0VYVF9UUkFDSU5HX0NPUkVfU0xJQ0VfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19F
WFRfVFJBQ0lOR19DT1JFX1NMSUNFX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRl
IDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5j
bHVkZSA8dmVjdG9yPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworLy8gQSBz
aW1wbGUgd3JhcHBlciBhcm91bmQgYSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnkgcmFuZ2Ug
dGhhdCBjb250YWlucyBhCisvLyBUcmFjZVBhY2tldCwgb3IganVzdCBhIHBvcnRpb24gb2YgaXQu
CitzdHJ1Y3QgU2xpY2UgeworICBTbGljZSgpIDogc3RhcnQobnVsbHB0ciksIHNpemUoMCkge30K
KyAgU2xpY2UoY29uc3Qgdm9pZCogc3QsIHNpemVfdCBzeikgOiBzdGFydChzdCksIHNpemUoc3op
IHt9CisgIFNsaWNlKFNsaWNlJiYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAvLyBD
cmVhdGUgYSBTbGljZSB3aGljaCBvd25zIHxzaXplfCBieXRlcyBvZiBtZW1vcnkuCisgIHN0YXRp
YyBTbGljZSBBbGxvY2F0ZShzaXplX3Qgc2l6ZSkgeworICAgIFNsaWNlIHNsaWNlOworICAgIHNs
aWNlLm93bl9kYXRhXy5yZXNldChuZXcgdWludDhfdFtzaXplXSk7CisgICAgc2xpY2Uuc3RhcnQg
PSAmc2xpY2Uub3duX2RhdGFfWzBdOworICAgIHNsaWNlLnNpemUgPSBzaXplOworICAgIHJldHVy
biBzbGljZTsKKyAgfQorCisgIHVpbnQ4X3QqIG93bl9kYXRhKCkgeworICAgIFBFUkZFVFRPX0RD
SEVDSyhvd25fZGF0YV8pOworICAgIHJldHVybiBvd25fZGF0YV8uZ2V0KCk7CisgIH0KKworICBj
b25zdCB2b2lkKiBzdGFydDsKKyAgc2l6ZV90IHNpemU7CisKKyBwcml2YXRlOgorICBTbGljZShj
b25zdCBTbGljZSYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBTbGljZSYpID0g
ZGVsZXRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG93bl9kYXRhXzsKK307CisK
Ky8vIFRPRE8ocHJpbWlhbm8pOiBtb3N0IFRyYWNlUGFja2V0KHMpIGZpdCBpbiBhIHNsaWNlIG9y
IHR3by4gV2UgbmVlZCBzb21ldGhpbmcKKy8vIGEgYml0IG1vcmUgY2xldmVyIGhlcmUgdGhhdCBo
YXMgaW5saW5lIGNhcGFjaXR5IGZvciAyIHNsaWNlcyBhbmQgdGhlbiB1c2VzIGEKKy8vIHN0ZDo6
Zm9yd2FyZF9saXN0IG9yIGEgc3RkOjp2ZWN0b3IgZm9yIHRoZSBsZXNzIGxpa2VseSBjYXNlcy4K
K3VzaW5nIFNsaWNlcyA9IHN0ZDo6dmVjdG9yPFNsaWNlPjsKKworfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX1NM
SUNFX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNl
IFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn
L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi
bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAq
IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhl
IExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0NP
UkVfVFJBQ0VfUEFDS0VUX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdf
Q09SRV9UUkFDRV9QQUNLRVRfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG1l
bW9yeT4KKyNpbmNsdWRlIDx0dXBsZT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9zbGljZS5o
IgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCisvLyBBIHdyYXBwZXIgYXJvdW5kIGEgYnl0ZSBi
dWZmZXIgdGhhdCBjb250YWlucyBhIHByb3RvYnVmLWVuY29kZWQgVHJhY2VQYWNrZXQKKy8vIChz
ZWUgdHJhY2VfcGFja2V0LnByb3RvKS4gVGhlIFRyYWNlUGFja2V0IGlzIGRlY29kZWQgb25seSBp
ZiB0aGUgQ29uc3VtZXIKKy8vIHJlcXVlc3RzIHRoYXQuIFRoaXMgaXMgdG8gYWxsb3cgQ29uc3Vt
ZXIocykgdG8ganVzdCBzdHJlYW0gdGhlIHBhY2tldCBvdmVyCisvLyB0aGUgbmV0d29yayBvciBz
YXZlIGl0IHRvIGEgZmlsZSB3aXRob3V0IHdhc3RpbmcgdGltZSBkZWNvZGluZyBpdCBhbmQgd2l0
aG91dAorLy8gbmVlZGluZyB0byBkZXBlbmQgb24gbGlicHJvdG9idWYgb3IgdGhlIHRyYWNlX3Bh
Y2tldC5wYi5oIGhlYWRlci4KKy8vIElmIHRoZSBwYWNrZXRzIGFyZSBzYXZlZCAvIHN0cmVhbWVk
IGFuZCBub3QganVzdCBjb25zdW1lZCBsb2NhbGx5LCBjb25zdW1lcnMKKy8vIHNob3VsZCBlbnN1
cmUgdG8gcHJlc2VydmUgdGhlIHVua25vd24gZmllbGRzIGluIHRoZSBwcm90by4gQSBjb25zdW1l
ciwgaW4KKy8vIGZhY3QsIG1pZ2h0IGhhdmUgYW4gb2xkZXIgdmVyc2lvbiAucHJvdG8gd2hpY2gg
aXMgbmV3ZXIgb24gdGhlIHByb2R1Y2VyLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNlUGFj
a2V0IHsKKyBwdWJsaWM6CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gU2xpY2VzOjpjb25zdF9p
dGVyYXRvcjsKKworICAvLyBUaGUgZmllbGQgaWQgb2YgcHJvdG9zOjpUcmFjZTo6cGFja2V0LCBz
dGF0aWNfYXNzZXJ0KCktZWQgaW4gdGhlIHVuaXR0ZXN0LgorICBzdGF0aWMgY29uc3RleHByIHVp
bnQzMl90IGtQYWNrZXRGaWVsZE51bWJlciA9IDE7CisKKyAgLy8gTWF4aW11bSBzaXplIG9mIHRo
ZSBwcmVhbWJsZSByZXR1cm5lZCBieSBHZXRQcm90b1ByZWFtYmxlKCkuCisgIHN0YXRpYyBjb25z
dGV4cHIgc2l6ZV90IGtNYXhQcmVhbWJsZUJ5dGVzID0gODsKKworICBUcmFjZVBhY2tldCgpOwor
ICB+VHJhY2VQYWNrZXQoKTsKKyAgVHJhY2VQYWNrZXQoVHJhY2VQYWNrZXQmJikgbm9leGNlcHQ7
CisgIFRyYWNlUGFja2V0JiBvcGVyYXRvcj0oVHJhY2VQYWNrZXQmJik7CisKKyAgLy8gQWNjZXNz
ZXMgYWxsIHRoZSByYXcgc2xpY2VzIGluIHRoZSBwYWNrZXQsIGZvciBzYXZpbmcgdGhlbSB0byBm
aWxlL25ldHdvcmsuCisgIGNvbnN0IFNsaWNlcyYgc2xpY2VzKCkgY29uc3QgeyByZXR1cm4gc2xp
Y2VzXzsgfQorCisgIC8vIE11dGF0b3IsIHVzZWQgb25seSBieSB0aGUgc2VydmljZSBhbmQgdGVz
dHMuCisgIHZvaWQgQWRkU2xpY2UoU2xpY2UpOworCisgIC8vIERvZXMgbm90IGNvcHkgLyB0YWtl
IG93bmVyc2hpcCBvZiB0aGUgbWVtb3J5IG9mIHRoZSBzbGljZS4gVGhlIFRyYWNlUGFja2V0Cisg
IC8vIHdpbGwgYmUgdmFsaWQgb25seSBhcyBsb25nIGFzIHRoZSBvcmlnaW5hbCBidWZmZXIgaXMg
dmFsaWQuCisgIHZvaWQgQWRkU2xpY2UoY29uc3Qgdm9pZCogc3RhcnQsIHNpemVfdCBzaXplKTsK
KworICAvLyBUb3RhbCBzaXplIG9mIGFsbCBzbGljZXMuCisgIHNpemVfdCBzaXplKCkgY29uc3Qg
eyByZXR1cm4gc2l6ZV87IH0KKworICAvLyBHZW5lcmF0ZXMgYSBwcm90b2J1ZiBwcmVhbWJsZSBz
dWl0YWJsZSB0byByZXByZXNlbnQgdGhpcyBwYWNrZXQgYXMgYQorICAvLyByZXBlYXRlZCBmaWVs
ZCB3aXRoaW4gYSByb290IHRyYWNlLnByb3RvIG1lc3NhZ2UuCisgIC8vIFJldHVybnMgYSBwb2lu
dGVyIHRvIGEgYnVmZmVyLCBvd25lZCBieSB0aGlzIGNsYXNzLCBjb250YWluaW5nIHRoZSBwcmVh
bWJsZQorICAvLyBhbmQgaXRzIHNpemUuCisgIHN0ZDo6dHVwbGU8Y2hhciosIHNpemVfdD4gR2V0
UHJvdG9QcmVhbWJsZSgpOworCisgIC8vIFJldHVybnMgdGhlIHJhdyBwcm90b2J1ZiBieXRlcyBv
ZiB0aGUgc2xpY2VzLCBhbGwgc3RpdGNoZWQgdG9nZXRoZXIgaW50bworICAvLyBhIHN0cmluZy4g
T25seSBmb3IgdGVzdGluZy4KKyAgc3RkOjpzdHJpbmcgR2V0UmF3Qnl0ZXNGb3JUZXN0aW5nKCk7
CisKKyBwcml2YXRlOgorICBUcmFjZVBhY2tldChjb25zdCBUcmFjZVBhY2tldCYpID0gZGVsZXRl
OworICBUcmFjZVBhY2tldCYgb3BlcmF0b3I9KGNvbnN0IFRyYWNlUGFja2V0JikgPSBkZWxldGU7
CisKKyAgU2xpY2VzIHNsaWNlc187ICAgICAvLyBOb3Qgb3duZWQuCisgIHNpemVfdCBzaXplXyA9
IDA7ICAgLy8gU1VNKHNsaWNlLnNpemUgZm9yIHNsaWNlIGluIHNsaWNlc18pLgorICBjaGFyIHBy
ZWFtYmxlX1trTWF4UHJlYW1ibGVCeXRlc107ICAvLyBEZWxpYmVyYXRlbHkgbm90IGluaXRpYWxp
emVkLgorCisgIC8vIFJlbWVtYmVyIHRvIHVwZGF0ZSB0aGUgbW92ZSBvcGVyYXRvcnMgYW5kIHRo
ZWlyIHVuaXR0ZXN0IGlmIGFkZGluZyBuZXcKKyAgLy8gZmllbGRzLiBDb25zdW1lcklQQ0NsaWVu
dEltcGw6Ok9uUmVhZEJ1ZmZlcnNSZXNwb25zZSgpIHJlbGllcyBvbgorICAvLyBzdGQ6Om1vdmUo
VHJhY2VQYWNrZXQpIHRvIGNsZWFyIHVwIHRoZSBtb3ZlZC1mcm9tIGluc3RhbmNlLgorfTsKKwor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19F
WFRfVFJBQ0lOR19DT1JFX1RSQUNFX1BBQ0tFVF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIg
dGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3Ug
bWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vu
c2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAg
ICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVu
bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywg
c29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVk
IG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9O
UyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGlj
ZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQK
KyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vf
cGFja2V0LmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0
byB7CisKK1RyYWNlUGFja2V0OjpUcmFjZVBhY2tldCgpID0gZGVmYXVsdDsKK1RyYWNlUGFja2V0
Ojp+VHJhY2VQYWNrZXQoKSA9IGRlZmF1bHQ7CisKK1RyYWNlUGFja2V0OjpUcmFjZVBhY2tldChU
cmFjZVBhY2tldCYmIG90aGVyKSBub2V4Y2VwdCB7CisgICp0aGlzID0gc3RkOjptb3ZlKG90aGVy
KTsKK30KKworVHJhY2VQYWNrZXQmIFRyYWNlUGFja2V0OjpvcGVyYXRvcj0oVHJhY2VQYWNrZXQm
JiBvdGhlcikgeworICBzbGljZXNfID0gc3RkOjptb3ZlKG90aGVyLnNsaWNlc18pOworICBvdGhl
ci5zbGljZXNfLmNsZWFyKCk7CisgIHNpemVfID0gb3RoZXIuc2l6ZV87CisgIG90aGVyLnNpemVf
ID0gMDsKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIFRyYWNlUGFja2V0OjpBZGRTbGljZShT
bGljZSBzbGljZSkgeworICBzaXplXyArPSBzbGljZS5zaXplOworICBzbGljZXNfLnB1c2hfYmFj
ayhzdGQ6Om1vdmUoc2xpY2UpKTsKK30KKwordm9pZCBUcmFjZVBhY2tldDo6QWRkU2xpY2UoY29u
c3Qgdm9pZCogc3RhcnQsIHNpemVfdCBzaXplKSB7CisgIHNpemVfICs9IHNpemU7CisgIHNsaWNl
c18uZW1wbGFjZV9iYWNrKHN0YXJ0LCBzaXplKTsKK30KKworc3RkOjp0dXBsZTxjaGFyKiwgc2l6
ZV90PiBUcmFjZVBhY2tldDo6R2V0UHJvdG9QcmVhbWJsZSgpIHsKKyAgdXNpbmcgcHJvdG96ZXJv
Ojpwcm90b191dGlsczo6TWFrZVRhZ0xlbmd0aERlbGltaXRlZDsKKyAgdXNpbmcgcHJvdG96ZXJv
Ojpwcm90b191dGlsczo6V3JpdGVWYXJJbnQ7CisgIHVpbnQ4X3QqIHB0ciA9IHJlaW50ZXJwcmV0
X2Nhc3Q8dWludDhfdCo+KCZwcmVhbWJsZV9bMF0pOworCisgIGNvbnN0ZXhwciB1aW50OF90IHRh
ZyA9IE1ha2VUYWdMZW5ndGhEZWxpbWl0ZWQoa1BhY2tldEZpZWxkTnVtYmVyKTsKKyAgc3RhdGlj
X2Fzc2VydCh0YWcgPCAweDgwLCAiVHJhY2VQYWNrZXQgdGFnIHNob3VsZCBmaXQgaW4gb25lIGJ5
dGUiKTsKKyAgKihwdHIrKykgPSB0YWc7CisKKyAgcHRyID0gV3JpdGVWYXJJbnQoc2l6ZSgpLCBw
dHIpOworICBzaXplX3QgcHJlYW1ibGVfc2l6ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90
PihwdHIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRw
dHJfdD4oJnByZWFtYmxlX1swXSk7CisgIFBFUkZFVFRPX0RDSEVDSyhwcmVhbWJsZV9zaXplIDw9
IHNpemVvZihwcmVhbWJsZV8pKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZSgmcHJlYW1ibGVf
WzBdLCBwcmVhbWJsZV9zaXplKTsKK30KKworc3RkOjpzdHJpbmcgVHJhY2VQYWNrZXQ6OkdldFJh
d0J5dGVzRm9yVGVzdGluZygpIHsKKyAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgZGF0YS5yZXNpemUo
c2l6ZSgpKTsKKyAgc2l6ZV90IHBvcyA9IDA7CisgIGZvciAoY29uc3QgU2xpY2UmIHNsaWNlIDog
c2xpY2VzKCkpIHsKKyAgICBQRVJGRVRUT19DSEVDSyhwb3MgKyBzbGljZS5zaXplIDw9IGRhdGEu
c2l6ZSgpKTsKKyAgICBtZW1jcHkoJmRhdGFbcG9zXSwgc2xpY2Uuc3RhcnQsIHNsaWNlLnNpemUp
OworICAgIHBvcyArPSBzbGljZS5zaXplOworICB9CisgIHJldHVybiBkYXRhOworfQorCit9ICAv
LyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNy
Yy90cmFjaW5nL2NvcmUvdHJhY2Vfd3JpdGVyX2ltcGwuY2MKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVu
ZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICog
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
aWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgor
ICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisg
KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp
bmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli
dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ
VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhl
IExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMg
YW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9jb3JlL3RyYWNlX3dyaXRl
cl9pbXBsLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4K
KyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3Ro
cmVhZF9hbm5vdGF0aW9ucy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnlfYXJiaXRl
cl9pbXBsLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rv
cy9wZXJmZXR0by90cmFjZS90cmFjZV9wYWNrZXQucGJ6ZXJvLmgiCisKK3VzaW5nIHByb3RvemVy
bzo6cHJvdG9fdXRpbHM6OmtNZXNzYWdlTGVuZ3RoRmllbGRTaXplOwordXNpbmcgcHJvdG96ZXJv
Ojpwcm90b191dGlsczo6V3JpdGVSZWR1bmRhbnRWYXJJbnQ7Cit1c2luZyBDaHVua0hlYWRlciA9
IHBlcmZldHRvOjpTaGFyZWRNZW1vcnlBQkk6OkNodW5rSGVhZGVyOworCituYW1lc3BhY2UgcGVy
ZmV0dG8geworCituYW1lc3BhY2UgeworY29uc3RleHByIHNpemVfdCBrUGFja2V0SGVhZGVyU2l6
ZSA9IFNoYXJlZE1lbW9yeUFCSTo6a1BhY2tldEhlYWRlclNpemU7Cit1aW50OF90IGdfZ2FyYmFn
ZV9jaHVua1sxMDI0XTsKK30gIC8vIG5hbWVzcGFjZQorCitUcmFjZVdyaXRlckltcGw6OlRyYWNl
V3JpdGVySW1wbChTaGFyZWRNZW1vcnlBcmJpdGVySW1wbCogc2htZW1fYXJiaXRlciwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlcklEIGlkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgTWF5YmVVbmJvdW5kQnVmZmVySUQgdGFyZ2V0X2J1ZmZlciwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckV4aGF1c3RlZFBvbGljeSBidWZm
ZXJfZXhoYXVzdGVkX3BvbGljeSkKKyAgICA6IHNobWVtX2FyYml0ZXJfKHNobWVtX2FyYml0ZXIp
LAorICAgICAgaWRfKGlkKSwKKyAgICAgIHRhcmdldF9idWZmZXJfKHRhcmdldF9idWZmZXIpLAor
ICAgICAgYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3lfKGJ1ZmZlcl9leGhhdXN0ZWRfcG9saWN5KSwK
KyAgICAgIHByb3RvYnVmX3N0cmVhbV93cml0ZXJfKHRoaXMpLAorICAgICAgcHJvY2Vzc19pZF8o
YmFzZTo6R2V0UHJvY2Vzc0lkKCkpIHsKKyAgLy8gVE9ETyhwcmltaWFubyk6IHdlIGNvdWxkIGhh
bmRsZSB0aGUgY2FzZSBvZiBydW5uaW5nIG91dCBvZiBUcmFjZVdyaXRlcklEKHMpCisgIC8vIG1v
cmUgZ3JhY2VmdWxseSBhbmQgYWx3YXlzIHJldHVybiBhIG5vLW9wIFRyYWNlUGFja2V0IGluIE5l
d1RyYWNlUGFja2V0KCkuCisgIFBFUkZFVFRPX0NIRUNLKGlkXyAhPSAwKTsKKworICBjdXJfcGFj
a2V0Xy5yZXNldChuZXcgcHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0KCkpOworICBjdXJfcGFj
a2V0Xy0+RmluYWxpemUoKTsgIC8vIFRvIGF2b2lkIHRoZSBEQ0hFQ0sgaW4gTmV3VHJhY2VQYWNr
ZXQoKS4KK30KKworVHJhY2VXcml0ZXJJbXBsOjp+VHJhY2VXcml0ZXJJbXBsKCkgeworICBpZiAo
Y3VyX2NodW5rXy5pc192YWxpZCgpKSB7CisgICAgY3VyX3BhY2tldF8tPkZpbmFsaXplKCk7Cisg
ICAgRmx1c2goKTsKKyAgfQorICBzaG1lbV9hcmJpdGVyXy0+UmVsZWFzZVdyaXRlcklEKGlkXyk7
Cit9CisKK3ZvaWQgVHJhY2VXcml0ZXJJbXBsOjpGbHVzaChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4g
Y2FsbGJhY2spIHsKKyAgLy8gRmx1c2goKSBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSBtaWRkbGUg
b2YgYSBUcmFjZVBhY2tldC4KKyAgUEVSRkVUVE9fQ0hFQ0soY3VyX3BhY2tldF8tPmlzX2ZpbmFs
aXplZCgpKTsKKworICBpZiAoY3VyX2NodW5rXy5pc192YWxpZCgpKSB7CisgICAgc2htZW1fYXJi
aXRlcl8tPlJldHVybkNvbXBsZXRlZENodW5rKHN0ZDo6bW92ZShjdXJfY2h1bmtfKSwgdGFyZ2V0
X2J1ZmZlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRj
aF9saXN0Xyk7CisgIH0gZWxzZSB7CisgICAgUEVSRkVUVE9fRENIRUNLKHBhdGNoX2xpc3RfLmVt
cHR5KCkpOworICB9CisgIC8vIEFsd2F5cyBpc3N1ZSB0aGUgRmx1c2ggcmVxdWVzdCwgZXZlbiBp
ZiB0aGVyZSBpcyBub3RoaW5nIHRvIGZsdXNoLCBqdXN0CisgIC8vIGZvciB0aGUgc2FrZSBvZiBn
ZXR0aW5nIHRoZSBjYWxsYmFjayBwb3N0ZWQgYmFjay4KKyAgc2htZW1fYXJiaXRlcl8tPkZsdXNo
UGVuZGluZ0NvbW1pdERhdGFSZXF1ZXN0cyhjYWxsYmFjayk7CisgIHByb3RvYnVmX3N0cmVhbV93
cml0ZXJfLlJlc2V0KHtudWxscHRyLCBudWxscHRyfSk7CisKKyAgLy8gfGxhc3RfcGFja2V0X3Np
emVfZmllbGRffCBtaWdodCBoYXZlIHBvaW50ZWQgaW50byB0aGUgY2h1bmsgd2UgcmV0dXJuZWQu
CisgIGxhc3RfcGFja2V0X3NpemVfZmllbGRfID0gbnVsbHB0cjsKK30KKworVHJhY2VXcml0ZXJJ
bXBsOjpUcmFjZVBhY2tldEhhbmRsZSBUcmFjZVdyaXRlckltcGw6Ok5ld1RyYWNlUGFja2V0KCkg
eworICAvLyBJZiB3ZSBoaXQgdGhpcywgdGhlIGNhbGxlciBpcyBjYWxsaW5nIE5ld1RyYWNlUGFj
a2V0KCkgd2l0aG91dCBoYXZpbmcKKyAgLy8gZmluYWxpemVkIHRoZSBwcmV2aW91cyBwYWNrZXQu
CisgIFBFUkZFVFRPX0NIRUNLKGN1cl9wYWNrZXRfLT5pc19maW5hbGl6ZWQoKSk7CisgIC8vIElm
IHdlIGhpdCB0aGlzLCB0aGlzIHRyYWNlIHdyaXRlciB3YXMgY3JlYXRlZCBpbiBhIGRpZmZlcmVu
dCBwcm9jZXNzLiBUaGlzCisgIC8vIGxpa2VseSBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGZvcmtl
ZCB3aGlsZSB0cmFjaW5nIHdhcyBhY3RpdmUsIGFuZCB0aGUKKyAgLy8gZm9ya2VkIGNoaWxkIHBy
b2Nlc3MgdHJpZWQgdG8gZW1pdCBhIHRyYWNlIGV2ZW50LiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQs
IGFzCisgIC8vIGl0IHdvdWxkIGxlYWQgdG8gdHdvIHByb2Nlc3NlcyB3cml0aW5nIHRvIHRoZSBz
YW1lIHRyYWNpbmcgU01CLgorICBQRVJGRVRUT19EQ0hFQ0socHJvY2Vzc19pZF8gPT0gYmFzZTo6
R2V0UHJvY2Vzc0lkKCkpOworCisgIGZyYWdtZW50aW5nX3BhY2tldF8gPSBmYWxzZTsKKworICAv
LyBSZXNlcnZlIHNwYWNlIGZvciB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4gTm90ZTogdGhpcyBj
YWxsIG1pZ2h0IHJlLWVudGVyCisgIC8vIGludG8gdGhpcyBjbGFzcyBpbnZva2luZyBHZXROZXdC
dWZmZXIoKSBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2Ugb3IgaWYKKyAgLy8gdGhpcyBpcyB0
aGUgdmVyeSBmaXJzdCBjYWxsIHRvIE5ld1RyYWNlUGFja2V0KCkuCisgIHN0YXRpY19hc3NlcnQo
a1BhY2tldEhlYWRlclNpemUgPT0ga01lc3NhZ2VMZW5ndGhGaWVsZFNpemUsCisgICAgICAgICAg
ICAgICAgIlRoZSBwYWNrZXQgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIE1lc3NhZ2UgaGVhZGVyIHNp
emUiKTsKKworICBib29sIHdhc19kcm9wcGluZ19wYWNrZXRzID0gZHJvcF9wYWNrZXRzXzsKKwor
ICAvLyBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gYmVnaW4gYSBwYWNrZXQgdGhhdCBpcyBnb2lu
ZyB0byBmcmFnbWVudAorICAvLyBpbW1lZGlhdGVseSBhZnRlciAoOCBpcyBqdXN0IGFuIGFyYml0
cmFyeSBlc3RpbWF0aW9uIG9uIHRoZSBtaW5pbXVtIHNpemUgb2YKKyAgLy8gYSByZWFsaXN0aWMg
cGFja2V0KS4KKyAgYm9vbCBjaHVua190b29fZnVsbCA9CisgICAgICBwcm90b2J1Zl9zdHJlYW1f
d3JpdGVyXy5ieXRlc19hdmFpbGFibGUoKSA8IGtQYWNrZXRIZWFkZXJTaXplICsgODsKKyAgaWYg
KGNodW5rX3Rvb19mdWxsIHx8IHJlYWNoZWRfbWF4X3BhY2tldHNfcGVyX2NodW5rXyB8fAorICAg
ICAgcmV0cnlfbmV3X2NodW5rX2FmdGVyX3BhY2tldF8pIHsKKyAgICBwcm90b2J1Zl9zdHJlYW1f
d3JpdGVyXy5SZXNldChHZXROZXdCdWZmZXIoKSk7CisgIH0KKworICAvLyBTZW5kIGFueSBjb21w
bGV0ZWQgcGF0Y2hlcyB0byB0aGUgc2VydmljZSB0byBmYWNpbGl0YXRlIHRyYWNlIGRhdGEKKyAg
Ly8gcmVjb3ZlcnkgYnkgdGhlIHNlcnZpY2UuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4g
d2UncmUgY29tcGxldGluZworICAvLyB0aGUgZmlyc3QgcGFja2V0IGluIGEgY2h1bmsgd2hpY2gg
d2FzIGEgY29udGludWF0aW9uIGZyb20gdGhlIHByZXZpb3VzCisgIC8vIGNodW5rLCBpLmUuIGF0
IG1vc3Qgb25jZSBwZXIgY2h1bmsuCisgIGlmICghcGF0Y2hfbGlzdF8uZW1wdHkoKSAmJiBwYXRj
aF9saXN0Xy5mcm9udCgpLmlzX3BhdGNoZWQoKSkgeworICAgIHNobWVtX2FyYml0ZXJfLT5TZW5k
UGF0Y2hlcyhpZF8sIHRhcmdldF9idWZmZXJfLCAmcGF0Y2hfbGlzdF8pOworICB9CisKKyAgY3Vy
X3BhY2tldF8tPlJlc2V0KCZwcm90b2J1Zl9zdHJlYW1fd3JpdGVyXyk7CisgIHVpbnQ4X3QqIGhl
YWRlciA9IHByb3RvYnVmX3N0cmVhbV93cml0ZXJfLlJlc2VydmVCeXRlcyhrUGFja2V0SGVhZGVy
U2l6ZSk7CisgIG1lbXNldChoZWFkZXIsIDAsIGtQYWNrZXRIZWFkZXJTaXplKTsKKyAgY3VyX3Bh
Y2tldF8tPnNldF9zaXplX2ZpZWxkKGhlYWRlcik7CisgIGxhc3RfcGFja2V0X3NpemVfZmllbGRf
ID0gaGVhZGVyOworCisgIFRyYWNlUGFja2V0SGFuZGxlIGhhbmRsZShjdXJfcGFja2V0Xy5nZXQo
KSk7CisgIGN1cl9mcmFnbWVudF9zdGFydF8gPSBwcm90b2J1Zl9zdHJlYW1fd3JpdGVyXy53cml0
ZV9wdHIoKTsKKyAgZnJhZ21lbnRpbmdfcGFja2V0XyA9IHRydWU7CisKKyAgaWYgKFBFUkZFVFRP
X0xJS0VMWSghZHJvcF9wYWNrZXRzXykpIHsKKyAgICB1aW50MTZfdCBuZXdfcGFja2V0X2NvdW50
ID0gY3VyX2NodW5rXy5JbmNyZW1lbnRQYWNrZXRDb3VudCgpOworICAgIHJlYWNoZWRfbWF4X3Bh
Y2tldHNfcGVyX2NodW5rXyA9CisgICAgICAgIG5ld19wYWNrZXRfY291bnQgPT0gQ2h1bmtIZWFk
ZXI6OlBhY2tldHM6OmtNYXhDb3VudDsKKworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWSh3YXNf
ZHJvcHBpbmdfcGFja2V0cykpIHsKKyAgICAgIC8vIFdlJ3ZlIHN1Y2NlZWRlZCB0byBnZXQgYSBu
ZXcgY2h1bmsgZnJvbSB0aGUgU01CIGFmdGVyIHdlIGVudGVyZWQKKyAgICAgIC8vIGRyb3BfcGFj
a2V0c18gbW9kZS4gUmVjb3JkIGEgbWFya2VyIGludG8gdGhlIG5ldyBwYWNrZXQgdG8gaW5kaWNh
dGUgdGhlCisgICAgICAvLyBkYXRhIGxvc3MuCisgICAgICBjdXJfcGFja2V0Xy0+c2V0X3ByZXZp
b3VzX3BhY2tldF9kcm9wcGVkKHRydWUpOworICAgIH0KKyAgfQorCisgIHJldHVybiBoYW5kbGU7
Cit9CisKKy8vIENhbGxlZCBieSB0aGUgTWVzc2FnZS4gV2UgY2FuIGdldCBoZXJlIGluIHR3byBj
YXNlczoKKy8vIDEuIEluIHRoZSBtaWRkbGUgb2Ygd3JpdGluZyBhIE1lc3NhZ2UsCisvLyB3aGVu
IHxmcmFnbWVudGluZ19wYWNrZXRffCA9PSB0cnVlLiBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byB1
cGRhdGUgdGhlCisvLyBjaHVuayBoZWFkZXIgd2l0aCBhIHBhcnRpYWwgcGFja2V0IGFuZCBzdGFy
dCBhIG5ldyBwYXJ0aWFsIHBhY2tldCBpbiB0aGUKKy8vIG5ldyBjaHVuay4KKy8vIDIuIFdoaWxl
IGNhbGxpbmcgUmVzZXJ2ZUJ5dGVzKCkgZm9yIHRoZSBwYWNrZXQgaGVhZGVyIGluIE5ld1RyYWNl
UGFja2V0KCkuCisvLyBJbiB0aGlzIGNhc2UgfGZyYWdtZW50aW5nX3BhY2tldF98ID09IGZhbHNl
IGFuZCB3ZSBqdXN0IHdhbnQgYSBuZXcgY2h1bmsKKy8vIHdpdGhvdXQgY3JlYXRpbmcgYW55IGZy
YWdtZW50cy4KK3Byb3RvemVybzo6Q29udGlndW91c01lbW9yeVJhbmdlIFRyYWNlV3JpdGVySW1w
bDo6R2V0TmV3QnVmZmVyKCkgeworICBpZiAoZnJhZ21lbnRpbmdfcGFja2V0XyAmJiBkcm9wX3Bh
Y2tldHNfKSB7CisgICAgLy8gV2UgY2FuJ3Qgd3JpdGUgdGhlIHJlbWFpbmluZyBkYXRhIG9mIHRo
ZSBmcmFnbWVudGluZyBwYWNrZXQgdG8gYSBuZXcKKyAgICAvLyBjaHVuaywgYmVjYXVzZSB3ZSBo
YXZlIGFscmVhZHkgbG9zdCBzb21lIG9mIGl0cyBkYXRhIGluIHRoZSBnYXJiYWdlCisgICAgLy8g
Y2h1bmsuIFRodXMsIHdlIHdpbGwgd3JhcCBhcm91bmQgaW4gdGhlIGdhcmJhZ2UgY2h1bmssIHdh
aXQgdW50aWwgdGhlCisgICAgLy8gY3VycmVudCBwYWNrZXQgd2FzIGNvbXBsZXRlZCwgYW5kIHRo
ZW4gYXR0ZW1wdCB0byBnZXQgYSBuZXcgY2h1bmsgZnJvbQorICAgIC8vIHRoZSBTTUIgYWdhaW4u
IEluc3RlYWQsIGlmIHxkcm9wX3BhY2tldHNffCBpcyB0cnVlIGFuZAorICAgIC8vIHxmcmFnbWVu
dGluZ19wYWNrZXRffCBpcyBmYWxzZSwgd2UgdHJ5IHRvIGFjcXVpcmUgYSB2YWxpZCBjaHVuayBi
ZWNhdXNlCisgICAgLy8gdGhlIFNNQiBleGhhdXN0aW9uIG1pZ2h0IGJlIHJlc29sdmVkLgorICAg
IHJldHJ5X25ld19jaHVua19hZnRlcl9wYWNrZXRfID0gdHJ1ZTsKKyAgICByZXR1cm4gcHJvdG96
ZXJvOjpDb250aWd1b3VzTWVtb3J5UmFuZ2V7CisgICAgICAgICZnX2dhcmJhZ2VfY2h1bmtbMF0s
ICZnX2dhcmJhZ2VfY2h1bmtbMF0gKyBzaXplb2YoZ19nYXJiYWdlX2NodW5rKX07CisgIH0KKwor
ICAvLyBBdHRlbXB0IHRvIGdyYWIgdGhlIG5leHQgY2h1bmsgYmVmb3JlIGZpbmFsaXppbmcgdGhl
IGN1cnJlbnQgb25lLCBzbyB0aGF0CisgIC8vIHdlIGtub3cgd2hldGhlciB3ZSBuZWVkIHRvIHN0
YXJ0IGRyb3BwaW5nIHBhY2tldHMgYmVmb3JlIHdyaXRpbmcgdGhlCisgIC8vIGN1cnJlbnQgcGFj
a2V0IGZyYWdtZW50J3MgaGVhZGVyLgorICBDaHVua0hlYWRlcjo6UGFja2V0cyBwYWNrZXRzID0g
e307CisgIGlmIChmcmFnbWVudGluZ19wYWNrZXRfKSB7CisgICAgcGFja2V0cy5jb3VudCA9IDE7
CisgICAgcGFja2V0cy5mbGFncyA9IENodW5rSGVhZGVyOjprRmlyc3RQYWNrZXRDb250aW51ZXNG
cm9tUHJldkNodW5rOworICB9CisKKyAgLy8gVGhlIG1lbW9yeSBvcmRlciBvZiB0aGUgc3RvcmVz
IGJlbG93IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4gVGhpcyB8aGVhZGVyfAorICAvLyBpcyBqdXN0
IGEgbG9jYWwgdGVtcG9yYXJ5IG9iamVjdC4gVGhlIEdldE5ld0NodW5rKCkgY2FsbCBiZWxvdyB3
aWxsIGNvcHkgaXQKKyAgLy8gaW50byB0aGUgc2hhcmVkIGJ1ZmZlciB3aXRoIHRoZSBwcm9wZXIg
YmFycmllcnMuCisgIENodW5rSGVhZGVyIGhlYWRlciA9IHt9OworICBoZWFkZXIud3JpdGVyX2lk
LnN0b3JlKGlkXywgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGhlYWRlci5jaHVua19p
ZC5zdG9yZShuZXh0X2NodW5rX2lkXywgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIGhl
YWRlci5wYWNrZXRzLnN0b3JlKHBhY2tldHMsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOwor
CisgIFNoYXJlZE1lbW9yeUFCSTo6Q2h1bmsgbmV3X2NodW5rID0KKyAgICAgIHNobWVtX2FyYml0
ZXJfLT5HZXROZXdDaHVuayhoZWFkZXIsIGJ1ZmZlcl9leGhhdXN0ZWRfcG9saWN5Xyk7CisgIGlm
ICghbmV3X2NodW5rLmlzX3ZhbGlkKCkpIHsKKyAgICAvLyBTaGFyZWQgbWVtb3J5IGJ1ZmZlciBl
eGhhdXN0ZWQsIHN3aXRjaCBpbnRvIHxkcm9wX3BhY2tldHNffCBtb2RlLiBXZSdsbAorICAgIC8v
IGRyb3AgZGF0YSB1bnRpbCB0aGUgZ2FyYmFnZSBjaHVuayBoYXMgYmVlbiBmaWxsZWQgb25jZSBh
bmQgdGhlbiByZXRyeS4KKworICAgIC8vIElmIHdlIHN0YXJ0ZWQgYSBwYWNrZXQgaW4gb25lIG9m
IHRoZSBwcmV2aW91cyAodmFsaWQpIGNodW5rcywgd2UgbmVlZCB0bworICAgIC8vIHRlbGwgdGhl
IHNlcnZpY2UgdG8gZGlzY2FyZCBpdC4KKyAgICBpZiAoZnJhZ21lbnRpbmdfcGFja2V0Xykgewor
ICAgICAgLy8gV2UgY2FuIG9ubHkgZW5kIHVwIGhlcmUgaWYgdGhlIHByZXZpb3VzIGNodW5rIHdh
cyBhIHZhbGlkIGNodW5rLAorICAgICAgLy8gYmVjYXVzZSB3ZSBuZXZlciB0cnkgdG8gYWNxdWly
ZSBhIG5ldyBjaHVuayBpbiB8ZHJvcF9wYWNrZXRzX3wgbW9kZQorICAgICAgLy8gd2hpbGUgZnJh
Z21lbnRpbmcuCisgICAgICBQRVJGRVRUT19EQ0hFQ0soIWRyb3BfcGFja2V0c18pOworCisgICAg
ICAvLyBCYWNrZmlsbCB0aGUgbGFzdCBmcmFnbWVudCdzIGhlYWRlciB3aXRoIGFuIGludmFsaWQg
c2l6ZSAodG9vIGxhcmdlKSwKKyAgICAgIC8vIHNvIHRoYXQgdGhlIHNlcnZpY2UncyBUcmFjZUJ1
ZmZlciB0aHJvd3Mgb3V0IHRoZSBpbmNvbXBsZXRlIHBhY2tldC4KKyAgICAgIC8vIEl0J2xsIHJl
c3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IGNodW5rIHdlIHN1Ym1pdC4KKyAgICAgIFdyaXRl
UmVkdW5kYW50VmFySW50KFNoYXJlZE1lbW9yeUFCSTo6a1BhY2tldFNpemVEcm9wUGFja2V0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3BhY2tldF8tPnNpemVfZmllbGQoKSk7CisK
KyAgICAgIC8vIFJlc2V0IHRoZSBzaXplIGZpZWxkLCBzaW5jZSB3ZSBzaG91bGQgbm90IHdyaXRl
IHRoZSBjdXJyZW50IHBhY2tldCdzCisgICAgICAvLyBzaXplIGFueW1vcmUgYWZ0ZXIgdGhpcy4K
KyAgICAgIGN1cl9wYWNrZXRfLT5zZXRfc2l6ZV9maWVsZChudWxscHRyKTsKKworICAgICAgLy8g
V2UgZG9uJ3Qgc2V0IGtMYXN0UGFja2V0Q29udGludWVzT25OZXh0Q2h1bmsgb3Iga0NodW5rTmVl
ZHNQYXRjaGluZyBvbgorICAgICAgLy8gdGhlIGxhc3QgY2h1bmssIGJlY2F1c2UgaXRzIGxhc3Qg
ZnJhZ21lbnQgd2lsbCBiZSBkaXNjYXJkZWQgYW55d2F5LgorICAgICAgLy8gSG93ZXZlciwgdGhl
IGN1cnJlbnQgcGFja2V0IGZyYWdtZW50IHBvaW50cyB0byBhIHZhbGlkIHxjdXJfY2h1bmtffCBh
bmQKKyAgICAgIC8vIG1heSBoYXZlIG5vbi1maW5hbGl6ZWQgbmVzdGVkIG1lc3NhZ2VzIHdoaWNo
IHdpbGwgY29udGludWUgaW4gdGhlCisgICAgICAvLyBnYXJiYWdlIGNodW5rIGFuZCBjdXJyZW50
bHkgc3RpbGwgcG9pbnQgaW50byB8Y3VyX2NodW5rX3wuIEFzIHdlIGFyZQorICAgICAgLy8gYWJv
dXQgdG8gcmV0dXJuIHxjdXJfY2h1bmtffCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBzaXpl
IGZpZWxkcyBvZgorICAgICAgLy8gdGhvc2UgbmVzdGVkIG1lc3NhZ2VzLiBOb3JtYWxseSB3ZSBt
b3ZlIHRoZW0gaW4gdGhlIHxwYXRjaF9saXN0X3wgKHNlZQorICAgICAgLy8gYmVsb3cpIGJ1dCBp
biB0aGlzIGNhc2UsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBzZW5kIHBhdGNoZXMgZm9yIGEK
KyAgICAgIC8vIGZyYWdtZW50IHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgZm9yIHN1cmUuIFRodXMs
IHdlIGNsZWFuIHVwIGFueSBzaXplCisgICAgICAvLyBmaWVsZCByZWZlcmVuY2VzIGludG8gfGN1
cl9jaHVua198LgorICAgICAgZm9yIChhdXRvKiBuZXN0ZWRfbXNnID0gY3VyX3BhY2tldF8tPm5l
c3RlZF9tZXNzYWdlKCk7IG5lc3RlZF9tc2c7CisgICAgICAgICAgIG5lc3RlZF9tc2cgPSBuZXN0
ZWRfbXNnLT5uZXN0ZWRfbWVzc2FnZSgpKSB7CisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGN1cl9o
ZHIgPSBuZXN0ZWRfbXNnLT5zaXplX2ZpZWxkKCk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBm
YWxzZSB0aGUgcHJvdG96ZXJvIE1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBpbnN0cnVjdGVkIHRv
CisgICAgICAgIC8vIHdyaXRlLCB1cG9uIEZpbmFsaXplKCksIGl0cyBzaXplIGludG8gdGhlIHBh
dGNoIGxpc3QuCisgICAgICAgIGJvb2wgc2l6ZV9maWVsZF9wb2ludHNfd2l0aGluX2NodW5rID0K
KyAgICAgICAgICAgIGN1cl9oZHIgPj0gY3VyX2NodW5rXy5wYXlsb2FkX2JlZ2luKCkgJiYKKyAg
ICAgICAgICAgIGN1cl9oZHIgKyBrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZSA8PSBjdXJfY2h1bmtf
LmVuZCgpOworCisgICAgICAgIGlmIChzaXplX2ZpZWxkX3BvaW50c193aXRoaW5fY2h1bmspCisg
ICAgICAgICAgbmVzdGVkX21zZy0+c2V0X3NpemVfZmllbGQobnVsbHB0cik7CisgICAgICB9Cisg
ICAgfSBlbHNlIGlmICghZHJvcF9wYWNrZXRzXyAmJiBsYXN0X3BhY2tldF9zaXplX2ZpZWxkXykg
eworICAgICAgLy8gSWYgd2Ugd2VyZW4ndCBkcm9wcGluZyBwYWNrZXRzIGJlZm9yZSwgd2Ugc2hv
dWxkIGluZGljYXRlIHRvIHRoZQorICAgICAgLy8gc2VydmljZSB0aGF0IHdlJ3JlIGFib3V0IHRv
IGxvc2UgZGF0YS4gV2UgZG8gdGhpcyBieSBpbnZhbGlkYXRpbmcgdGhlCisgICAgICAvLyBzaXpl
IG9mIHRoZSBsYXN0IHBhY2tldCBpbiB8Y3VyX2NodW5rX3wuIFRoZSBzZXJ2aWNlIHdpbGwgcmVj
b3JkCisgICAgICAvLyBzdGF0aXN0aWNzIGFib3V0IHBhY2tldHMgd2l0aCBrUGFja2V0U2l6ZURy
b3BQYWNrZXQgc2l6ZS4KKyAgICAgIFBFUkZFVFRPX0RDSEVDSyhjdXJfcGFja2V0Xy0+aXNfZmlu
YWxpemVkKCkpOworICAgICAgUEVSRkVUVE9fRENIRUNLKGN1cl9jaHVua18uaXNfdmFsaWQoKSk7
CisKKyAgICAgIC8vIHxsYXN0X3BhY2tldF9zaXplX2ZpZWxkX3wgc2hvdWxkIHBvaW50IHdpdGhp
biB8Y3VyX2NodW5rX3wncyBwYXlsb2FkLgorICAgICAgUEVSRkVUVE9fRENIRUNLKGxhc3RfcGFj
a2V0X3NpemVfZmllbGRfID49IGN1cl9jaHVua18ucGF5bG9hZF9iZWdpbigpICYmCisgICAgICAg
ICAgICAgICAgICAgICAgbGFzdF9wYWNrZXRfc2l6ZV9maWVsZF8gKyBrTWVzc2FnZUxlbmd0aEZp
ZWxkU2l6ZSA8PQorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfY2h1bmtfLmVuZCgpKTsK
KworICAgICAgV3JpdGVSZWR1bmRhbnRWYXJJbnQoU2hhcmVkTWVtb3J5QUJJOjprUGFja2V0U2l6
ZURyb3BQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BhY2tldF9zaXpl
X2ZpZWxkXyk7CisgICAgfQorCisgICAgaWYgKGN1cl9jaHVua18uaXNfdmFsaWQoKSkgeworICAg
ICAgc2htZW1fYXJiaXRlcl8tPlJldHVybkNvbXBsZXRlZENodW5rKHN0ZDo6bW92ZShjdXJfY2h1
bmtfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRf
YnVmZmVyXywgJnBhdGNoX2xpc3RfKTsKKyAgICB9CisKKyAgICBkcm9wX3BhY2tldHNfID0gdHJ1
ZTsKKyAgICBjdXJfY2h1bmtfID0gU2hhcmVkTWVtb3J5QUJJOjpDaHVuaygpOyAgLy8gUmVzZXQg
dG8gYW4gaW52YWxpZCBjaHVuay4KKyAgICByZWFjaGVkX21heF9wYWNrZXRzX3Blcl9jaHVua18g
PSBmYWxzZTsKKyAgICByZXRyeV9uZXdfY2h1bmtfYWZ0ZXJfcGFja2V0XyA9IGZhbHNlOworICAg
IGxhc3RfcGFja2V0X3NpemVfZmllbGRfID0gbnVsbHB0cjsKKworICAgIFBFUkZFVFRPX0FOTk9U
QVRFX0JFTklHTl9SQUNFX1NJWkVEKCZnX2dhcmJhZ2VfY2h1bmssCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdfZ2FyYmFnZV9jaHVuayksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vYm9keSByZWFkcyB0aGUgZ2FyYmFn
ZSBjaHVuayIpCisgICAgcmV0dXJuIHByb3RvemVybzo6Q29udGlndW91c01lbW9yeVJhbmdlewor
ICAgICAgICAmZ19nYXJiYWdlX2NodW5rWzBdLCAmZ19nYXJiYWdlX2NodW5rWzBdICsgc2l6ZW9m
KGdfZ2FyYmFnZV9jaHVuayl9OworICB9ICAvLyBpZiAoIW5ld19jaHVuay5pc192YWxpZCgpKQor
CisgIFBFUkZFVFRPX0RDSEVDSyhuZXdfY2h1bmsuaXNfdmFsaWQoKSk7CisKKyAgaWYgKGZyYWdt
ZW50aW5nX3BhY2tldF8pIHsKKyAgICAvLyBXZSBzaG91bGQgbm90IGJlIGZyYWdtZW50aW5nIGEg
cGFja2V0IGFmdGVyIHdlIGV4aXRlZCBkcm9wX3BhY2tldHNfIG1vZGUsCisgICAgLy8gYmVjYXVz
ZSB3ZSBvbmx5IHJldHJ5IHRvIGdldCBhIG5ldyBjaHVuayB3aGVuIGEgZnJlc2ggcGFja2V0IGlz
IHN0YXJ0ZWQuCisgICAgUEVSRkVUVE9fRENIRUNLKCFkcm9wX3BhY2tldHNfKTsKKworICAgIHVp
bnQ4X3QqIGNvbnN0IHdwdHIgPSBwcm90b2J1Zl9zdHJlYW1fd3JpdGVyXy53cml0ZV9wdHIoKTsK
KyAgICBQRVJGRVRUT19EQ0hFQ0sod3B0ciA+PSBjdXJfZnJhZ21lbnRfc3RhcnRfKTsKKyAgICB1
aW50MzJfdCBwYXJ0aWFsX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od3B0ciAtIGN1cl9m
cmFnbWVudF9zdGFydF8pOworICAgIFBFUkZFVFRPX0RDSEVDSyhwYXJ0aWFsX3NpemUgPCBjdXJf
Y2h1bmtfLnNpemUoKSk7CisKKyAgICAvLyBCYWNrZmlsbCB0aGUgcGFja2V0IGhlYWRlciB3aXRo
IHRoZSBmcmFnbWVudCBzaXplLgorICAgIFBFUkZFVFRPX0RDSEVDSyhwYXJ0aWFsX3NpemUgPiAw
KTsKKyAgICBjdXJfcGFja2V0Xy0+aW5jX3NpemVfYWxyZWFkeV93cml0dGVuKHBhcnRpYWxfc2l6
ZSk7CisgICAgY3VyX2NodW5rXy5TZXRGbGFnKENodW5rSGVhZGVyOjprTGFzdFBhY2tldENvbnRp
bnVlc09uTmV4dENodW5rKTsKKyAgICBXcml0ZVJlZHVuZGFudFZhckludChwYXJ0aWFsX3NpemUs
IGN1cl9wYWNrZXRfLT5zaXplX2ZpZWxkKCkpOworCisgICAgLy8gRGVzY2VuZCBpbiB0aGUgc3Rh
Y2sgb2Ygbm9uLWZpbmFsaXplZCBuZXN0ZWQgc3VibWVzc2FnZXMgKGlmIGFueSkgYW5kCisgICAg
Ly8gZGV0b3VyIHRoZWlyIHxzaXplX2ZpZWxkfCBpbnRvIHRoZSB8cGF0Y2hfbGlzdF98LiBBdCB0
aGlzIHBvaW50IHdlIGhhdmUKKyAgICAvLyB0byByZWxlYXNlIHRoZSBjaHVuayBhbmQgdGhleSBj
YW5ub3Qgd3JpdGUgYW55bW9yZSBpbnRvIHRoYXQuCisgICAgLy8gVE9ETyhwcmltaWFubyk6IGFk
ZCB0ZXN0cyB0byBjb3ZlciB0aGlzIGxvZ2ljLgorICAgIGJvb2wgY2h1bmtfbmVlZHNfcGF0Y2hp
bmcgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8qIG5lc3RlZF9tc2cgPSBjdXJfcGFja2V0Xy0+bmVz
dGVkX21lc3NhZ2UoKTsgbmVzdGVkX21zZzsKKyAgICAgICAgIG5lc3RlZF9tc2cgPSBuZXN0ZWRf
bXNnLT5uZXN0ZWRfbWVzc2FnZSgpKSB7CisgICAgICB1aW50OF90KiBjb25zdCBjdXJfaGRyID0g
bmVzdGVkX21zZy0+c2l6ZV9maWVsZCgpOworCisgICAgICAvLyBJZiB0aGlzIGlzIGZhbHNlIHRo
ZSBwcm90b3plcm8gTWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGluc3RydWN0ZWQgdG8KKyAgICAg
IC8vIHdyaXRlLCB1cG9uIEZpbmFsaXplKCksIGl0cyBzaXplIGludG8gdGhlIHBhdGNoIGxpc3Qu
CisgICAgICBib29sIHNpemVfZmllbGRfcG9pbnRzX3dpdGhpbl9jaHVuayA9CisgICAgICAgICAg
Y3VyX2hkciA+PSBjdXJfY2h1bmtfLnBheWxvYWRfYmVnaW4oKSAmJgorICAgICAgICAgIGN1cl9o
ZHIgKyBrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZSA8PSBjdXJfY2h1bmtfLmVuZCgpOworCisgICAg
ICBpZiAoc2l6ZV9maWVsZF9wb2ludHNfd2l0aGluX2NodW5rKSB7CisgICAgICAgIGF1dG8gb2Zm
c2V0ID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihjdXJfaGRyIC0gY3VyX2No
dW5rXy5wYXlsb2FkX2JlZ2luKCkpOworICAgICAgICBjb25zdCBDaHVua0lEIGN1cl9jaHVua19p
ZCA9CisgICAgICAgICAgICBjdXJfY2h1bmtfLmhlYWRlcigpLT5jaHVua19pZC5sb2FkKHN0ZDo6
bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgICBQYXRjaCogcGF0Y2ggPSBwYXRjaF9saXN0
Xy5lbXBsYWNlX2JhY2soY3VyX2NodW5rX2lkLCBvZmZzZXQpOworICAgICAgICBuZXN0ZWRfbXNn
LT5zZXRfc2l6ZV9maWVsZCgmcGF0Y2gtPnNpemVfZmllbGRbMF0pOworICAgICAgICBjaHVua19u
ZWVkc19wYXRjaGluZyA9IHRydWU7CisgICAgICB9IGVsc2UgeworI2lmIFBFUkZFVFRPX0RDSEVD
S19JU19PTigpCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzaXplIGZpZWxkIG9mIHRoZSBt
ZXNzYWdlIHBvaW50cyB0byBhbiBlbGVtZW50IG9mIHRoZQorICAgICAgICAvLyBwYXRjaCBsaXN0
LgorICAgICAgICBhdXRvIHBhdGNoX2l0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgcGF0
Y2hfbGlzdF8uYmVnaW4oKSwgcGF0Y2hfbGlzdF8uZW5kKCksCisgICAgICAgICAgICBbY3VyX2hk
cl0oY29uc3QgUGF0Y2gmIHApIHsgcmV0dXJuICZwLnNpemVfZmllbGRbMF0gPT0gY3VyX2hkcjsg
fSk7CisgICAgICAgIFBFUkZFVFRPX0RDSEVDSyhwYXRjaF9pdCAhPSBwYXRjaF9saXN0Xy5lbmQo
KSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9ICAvLyBmb3IobmVzdGVkX21zZworCisgICAgaWYg
KGNodW5rX25lZWRzX3BhdGNoaW5nKQorICAgICAgY3VyX2NodW5rXy5TZXRGbGFnKENodW5rSGVh
ZGVyOjprQ2h1bmtOZWVkc1BhdGNoaW5nKTsKKyAgfSAgLy8gaWYoZnJhZ21lbnRpbmdfcGFja2V0
KQorCisgIGlmIChjdXJfY2h1bmtfLmlzX3ZhbGlkKCkpIHsKKyAgICAvLyBSZXR1cm5Db21wbGV0
ZWRDaHVuayB3aWxsIGNvbnN1bWUgdGhlIGZpcnN0IHBhdGNoZWQgZW50cmllcyBmcm9tCisgICAg
Ly8gfHBhdGNoX2xpc3RffCBhbmQgc2hyaW5rIGl0LgorICAgIHNobWVtX2FyYml0ZXJfLT5SZXR1
cm5Db21wbGV0ZWRDaHVuayhzdGQ6Om1vdmUoY3VyX2NodW5rXyksIHRhcmdldF9idWZmZXJfLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2hfbGlzdF8pOwor
ICB9CisKKyAgLy8gU3dpdGNoIHRvIHRoZSBuZXcgY2h1bmsuCisgIGRyb3BfcGFja2V0c18gPSBm
YWxzZTsKKyAgcmVhY2hlZF9tYXhfcGFja2V0c19wZXJfY2h1bmtfID0gZmFsc2U7CisgIHJldHJ5
X25ld19jaHVua19hZnRlcl9wYWNrZXRfID0gZmFsc2U7CisgIG5leHRfY2h1bmtfaWRfKys7Cisg
IGN1cl9jaHVua18gPSBzdGQ6Om1vdmUobmV3X2NodW5rKTsKKyAgbGFzdF9wYWNrZXRfc2l6ZV9m
aWVsZF8gPSBudWxscHRyOworCisgIHVpbnQ4X3QqIHBheWxvYWRfYmVnaW4gPSBjdXJfY2h1bmtf
LnBheWxvYWRfYmVnaW4oKTsKKyAgaWYgKGZyYWdtZW50aW5nX3BhY2tldF8pIHsKKyAgICBjdXJf
cGFja2V0Xy0+c2V0X3NpemVfZmllbGQocGF5bG9hZF9iZWdpbik7CisgICAgbGFzdF9wYWNrZXRf
c2l6ZV9maWVsZF8gPSBwYXlsb2FkX2JlZ2luOworICAgIG1lbXNldChwYXlsb2FkX2JlZ2luLCAw
LCBrUGFja2V0SGVhZGVyU2l6ZSk7CisgICAgcGF5bG9hZF9iZWdpbiArPSBrUGFja2V0SGVhZGVy
U2l6ZTsKKyAgICBjdXJfZnJhZ21lbnRfc3RhcnRfID0gcGF5bG9hZF9iZWdpbjsKKyAgfQorCisg
IHJldHVybiBwcm90b3plcm86OkNvbnRpZ3VvdXNNZW1vcnlSYW5nZXtwYXlsb2FkX2JlZ2luLCBj
dXJfY2h1bmtfLmVuZCgpfTsKK30KKworV3JpdGVySUQgVHJhY2VXcml0ZXJJbXBsOjp3cml0ZXJf
aWQoKSBjb25zdCB7CisgIHJldHVybiBpZF87Cit9CisKKy8vIEJhc2UgY2xhc3MgZGVmaW5pdGlv
bnMuCitUcmFjZVdyaXRlcjo6VHJhY2VXcml0ZXIoKSA9IGRlZmF1bHQ7CitUcmFjZVdyaXRlcjo6
flRyYWNlV3JpdGVyKCkgPSBkZWZhdWx0OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFjaW5nL2NvcmUvdmlydHVhbF9k
ZXN0cnVjdG9ycy5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9w
ZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL2NvbnN1bWVyLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9vYnNlcnZhYmxl
X2V2ZW50cy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291
cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZl
cnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUg
ZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWlu
IGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUu
b3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxp
Y2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0
ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywK
KyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIg
ZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMg
bGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIg
dGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5H
X0NPUkVfT0JTRVJWQUJMRV9FVkVOVFNfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRf
VFJBQ0lOR19DT1JFX09CU0VSVkFCTEVfRVZFTlRTX0hfCisKKy8vIENyZWF0ZXMgdGhlIGFsaWFz
ZXMgaW4gdGhlIDo6cGVyZmV0dG8gbmFtZXNwYWNlLCBkb2luZyB0aGluZ3MgbGlrZToKKy8vIHVz
aW5nIDo6cGVyZmV0dG86OkZvbyA9IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpGb28uCisvLyBT
ZWUgY29tbWVudHMgaW4gZm9yd2FyZF9kZWNscy5oIGZvciB0aGUgaGlzdG9yaWNhbCByZWFzb25z
IG9mIHRoaXMKKy8vIGluZGlyZWN0aW9uIGxheWVyLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKwor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2Nv
bW1vbi9vYnNlcnZhYmxlX2V2ZW50cy5nZW4uaCIKKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZF
VFRPX0VYVF9UUkFDSU5HX0NPUkVfT0JTRVJWQUJMRV9FVkVOVFNfSF8KKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vu
c2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIp
OworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRo
IHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0
CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAK
KyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGlu
IHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBk
aXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9S
IENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBT
ZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlz
c2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZu
ZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdfQ09SRV9DT05TVU1FUl9IXworI2RlZmlu
ZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0NPUkVfQ09OU1VNRVJfSF8KKworI2luY2x1
ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvYmFzaWNfdHlwZXMuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvb2Jz
ZXJ2YWJsZV9ldmVudHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCituYW1lc3BhY2UgcGVyZmV0
dG8geworCitjbGFzcyBUcmFjZVBhY2tldDsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENvbnN1
bWVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNvbnN1bWVyKCk7CisKKyAgLy8gQ2FsbGVkIGJ5
IFNlcnZpY2UgKG9yIG1vcmUgdHlwaWNhbGx5IGJ5IHRoZSB0cmFuc3BvcnQgbGF5ZXIsIG9uIGJl
aGFsZiBvZgorICAvLyB0aGUgcmVtb3RlIFNlcnZpY2UpLCBvbmNlIHRoZSBDb25zdW1lciA8PiBT
ZXJ2aWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4KKyAgLy8gZXN0YWJsaXNoZWQuCisgIHZpcnR1YWwg
dm9pZCBPbkNvbm5lY3QoKSA9IDA7CisKKyAgLy8gQ2FsbGVkIGJ5IHRoZSBTZXJ2aWNlIG9yIGJ5
IHRoZSB0cmFuc3BvcnQgbGF5ZXIgaWYgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUKKyAgLy8gc2Vy
dmljZSBkcm9wcywgZWl0aGVyIHZvbHVudGFyaWx5IChlLmcuLCBieSBkZXN0cm95aW5nIHRoZSBD
b25zdW1lckVuZHBvaW50CisgIC8vIG9idGFpbmVkIHRocm91Z2ggU2VydmljZTo6Q29ubmVjdENv
bnN1bWVyKCkpIG9yIGludm9sdW50YXJpbHkgKGUuZy4sIGlmIHRoZQorICAvLyBTZXJ2aWNlIHBy
b2Nlc3MgY3Jhc2hlcykuCisgIHZpcnR1YWwgdm9pZCBPbkRpc2Nvbm5lY3QoKSA9IDA7CisKKyAg
Ly8gQ2FsbGVkIGJ5IHRoZSBTZXJ2aWNlIGFmdGVyIHRoZSB0cmFjaW5nIHNlc3Npb24gaGFzIGVu
ZGVkLiBUaGlzIGNhbiBoYXBwZW4KKyAgLy8gZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zOgorICAv
LyAtIFRoZSBjb25zdW1lciBleHBsaWNpdGx5IGNhbGxlZCBEaXNhYmxlVHJhY2luZygpCisgIC8v
IC0gVGhlIFRyYWNlQ29uZmlnJ3MgfGR1cmF0aW9uX21zfCBoYXMgYmVlbiByZWFjaGVkLgorICAv
LyAtIFRoZSBUcmFjZUNvbmZpZydzIHxtYXhfZmlsZV9zaXplX2J5dGVzfCBoYXMgYmVlbiByZWFj
aGVkLgorICAvLyAtIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBlbmFibGUgdHJh
Y2luZy4KKyAgdmlydHVhbCB2b2lkIE9uVHJhY2luZ0Rpc2FibGVkKCkgPSAwOworCisgIC8vIENh
bGxlZCBiYWNrIGJ5IHRoZSBTZXJ2aWNlIChvciB0cmFuc3BvcnQgbGF5ZXIpIGFmdGVyIGludm9r
aW5nCisgIC8vIFRyYWNpbmdTZXJ2aWNlOjpDb25zdW1lckVuZHBvaW50OjpSZWFkQnVmZmVycygp
LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZQorICAvLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuIEVhY2gg
aW52b2NhdGlvbiBjYW4gY2Fycnkgb25lIG9yIG1vcmUKKyAgLy8gVHJhY2VQYWNrZXQocykuIFVw
b24gdGhlIGxhc3QgY2FsbCwgfGhhc19tb3JlfCBpcyBzZXQgdG8gdHJ1ZSAoaS5lLgorICAvLyB8
aGFzX21vcmV8IGlzIGEgIUVPRikuCisgIHZpcnR1YWwgdm9pZCBPblRyYWNlRGF0YShzdGQ6OnZl
Y3RvcjxUcmFjZVBhY2tldD4sIGJvb2wgaGFzX21vcmUpID0gMDsKKworICAvLyBDYWxsZWQgYmFj
ayBieSB0aGUgU2VydmljZSAob3IgdHJhbnNwb3J0IGxheWVyKSBhZnRlciBpbnZva2luZworICAv
LyBUcmFjaW5nU2VydmljZTo6Q29uc3VtZXJFbmRwb2ludDo6RGV0YWNoKCkuCisgIC8vIFRoZSBj
b25zdW1lciBjYW4gZGlzY29ubmVjdCBhdCB0aGlzIHBvaW50IGFuZCB0aGUgdHJhY2Ugc2Vzc2lv
biB3aWxsIGtlZXAKKyAgLy8gb24gZ29pbmcuIEEgbmV3IGNvbnN1bWVyIGNhbiBsYXRlciByZS1h
dHRhY2ggcGFzc2luZyBiYWNrIHRoZSBzYW1lIHxrZXl8CisgIC8vIHBhc3NlZCB0byBEZXRhY2go
KSwgYnV0IG9ubHkgaWYgdGhlIHR3byByZXF1ZXN0cyBjb21lIGZyb20gdGhlIHNhbWUgdWlkLgor
ICB2aXJ0dWFsIHZvaWQgT25EZXRhY2goYm9vbCBzdWNjZXNzKSA9IDA7CisKKyAgLy8gQ2FsbGVk
IGJhY2sgYnkgdGhlIFNlcnZpY2UgKG9yIHRyYW5zcG9ydCBsYXllcikgYWZ0ZXIgaW52b2tpbmcK
KyAgLy8gVHJhY2luZ1NlcnZpY2U6OkNvbnN1bWVyRW5kcG9pbnQ6OkF0dGFjaCgpLgorICB2aXJ0
dWFsIHZvaWQgT25BdHRhY2goYm9vbCBzdWNjZXNzLCBjb25zdCBUcmFjZUNvbmZpZyYpID0gMDsK
KworICAvLyBDYWxsZWQgYmFjayBieSB0aGUgU2VydmljZSAob3IgdHJhbnNwb3J0IGxheWVyKSBh
ZnRlciBpbnZva2luZworICAvLyBUcmFjaW5nU2VydmljZTo6Q29uc3VtZXJFbmRwb2ludDo6R2V0
VHJhY2VTdGF0cygpLgorICB2aXJ0dWFsIHZvaWQgT25UcmFjZVN0YXRzKGJvb2wgc3VjY2Vzcywg
Y29uc3QgVHJhY2VTdGF0cyYpID0gMDsKKworICAvLyBDYWxsZWQgYmFjayBieSB0aGUgU2Vydmlj
ZSAob3IgdHJhbnNwb3J0IGxheWVyKSBhZnRlciBpbnZva2luZworICAvLyBUcmFjaW5nU2Vydmlj
ZTo6Q29uc3VtZXJFbmRwb2ludDo6T2JzZXJ2ZUV2ZW50cygpIHdoZW5ldmVyIG9uZSBvciBtb3Jl
CisgIC8vIE9ic2VydmFibGVFdmVudHMgb2YgZW5hYmxlZCBldmVudCB0eXBlcyBvY2N1ci4KKyAg
dmlydHVhbCB2b2lkIE9uT2JzZXJ2YWJsZUV2ZW50cyhjb25zdCBPYnNlcnZhYmxlRXZlbnRzJikg
PSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVE
RV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX0NPTlNVTUVSX0hfCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvcHJvZHVj
ZXIuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQ
cm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9u
IDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2Vw
dCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNv
cHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9s
aWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxl
IGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBX
SVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJl
c3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1
YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBM
aWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JF
X1BST0RVQ0VSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdfQ09SRV9Q
Uk9EVUNFUl9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9iYXNlL2V4cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9iYXNpY190eXBlcy5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRf
ZGVjbHMuaCIKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKK2NsYXNzIFNoYXJlZE1lbW9yeTsKKwor
Ly8gQSBQcm9kdWNlciBpcyBhbiBlbnRpdHkgdGhhdCBjb25uZWN0cyB0byB0aGUgd3JpdGUtb25s
eSBwb3J0IG9mIHRoZSBTZXJ2aWNlCisvLyBhbmQgZXhwb3NlcyB0aGUgYWJpbGl0eSB0byBwcm9k
dWNlIHBlcmZvcm1hbmNlIGRhdGEgb24tZGVtYW5kLiBUaGUgbGlmZWN5Y2xlCisvLyBvZiBhIFBy
b2R1Y2VyIGlzIGFzIGZvbGxvd3M6CisvLyAxLiBUaGUgcHJvZHVjZXIgY29ubmVjdHMgdG8gdGhl
IHNlcnZpY2UgYW5kIGFkdmVydGlzZXMgaXRzIGRhdGEgc291cmNlcworLy8gICAgKGUuZy4sIHRo
ZSBhYmlsaXR5IHRvIGdldCBrZXJuZWwgZnRyYWNlcywgdG8gbGlzdCBwcm9jZXNzIHN0YXRzKS4K
Ky8vIDIuIFRoZSBzZXJ2aWNlIGFja25vd2xlZGdlcyB0aGUgY29ubmVjdGlvbiBhbmQgc2VuZHMg
b3ZlciB0aGUgU2hhcmVkTWVtb3J5CisvLyAgICByZWdpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8g
ZXhjaGFuZ2UgZGF0YSAodG9nZXRoZXIgd2l0aCB0aGUgc2lnbmFsbGluZworLy8gICAgQVBJIFRy
YWNpbmdTZXJ2aWNlOjpQcm9kdWNlckVuZHBvaW50OjpPblBhZ2VBY3F1aXJlZCgpL09uUGFnZVJl
bGVhc2VkKCkpLgorLy8gMy4gQXQgc29tZSBwb2ludCBsYXRlciBvbiwgdGhlIFNlcnZpY2UgYXNr
cyB0aGUgUHJvZHVjZXIgdG8gdHVybiBvbiBzb21lIG9mCisvLyAgICB0aGUgcHJldmlvdXNseSBy
ZWdpc3RlcmVkIGRhdGEgc291cmNlcywgdG9nZXRoZXIgd2l0aCBzb21lIGNvbmZpZ3VyYXRpb24K
Ky8vICAgIHBhcmFtZXRlcnMuIFRoaXMgaGFwcGVucyB2aWEgdGhlIFN0YXJ0RGF0YVNvdXJjZSgp
IGNhbGxiYWNrLgorLy8gNC4gSW4gcmVzcG9uc2UgdG8gdGhhdCB0aGUgUHJvZHVjZXIgd2lsbCBz
cGF3biBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gZGF0YQorLy8gICAgc291cmNlIGFuZCBpbmpl
Y3QgaXRzIGRhdGEgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgKG9idGFpbmVkIGR1cmlu
ZworLy8gICAgT25Db25uZWN0KS4KKy8vIFRoaXMgaW50ZXJmYWNlIGlzIHN1YmNsYXNzZWQgYnk6
CisvLyAgMS4gVGhlIGFjdHVhbCBwcm9kdWNlciBjb2RlIGluIHRoZSBjbGllbnRzIGUuZy4sIHRo
ZSBmdHJhY2UgcmVhZGVyIHByb2Nlc3MuCisvLyAgMi4gVGhlIHRyYW5zcG9ydCBsYXllciB3aGVu
IGludGVycG9zaW5nIFJQQyBiZXR3ZWVuIHNlcnZpY2UgYW5kIHByb2R1Y2Vycy4KK2NsYXNzIFBF
UkZFVFRPX0VYUE9SVCBQcm9kdWNlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Qcm9kdWNlcigp
OworCisgIC8vIENhbGxlZCBieSBTZXJ2aWNlIChvciBtb3JlIHR5cGljYWxseSBieSB0aGUgdHJh
bnNwb3J0IGxheWVyLCBvbiBiZWhhbGYgb2YKKyAgLy8gdGhlIHJlbW90ZSBTZXJ2aWNlKSwgb25j
ZSB0aGUgUHJvZHVjZXIgPD4gU2VydmljZSBjb25uZWN0aW9uIGhhcyBiZWVuCisgIC8vIGVzdGFi
bGlzaGVkLgorICB2aXJ0dWFsIHZvaWQgT25Db25uZWN0KCkgPSAwOworCisgIC8vIENhbGxlZCBi
eSB0aGUgU2VydmljZSBvciBieSB0aGUgdHJhbnNwb3J0IGxheWVyIGlmIHRoZSBjb25uZWN0aW9u
IHdpdGggdGhlCisgIC8vIHNlcnZpY2UgZHJvcHMsIGVpdGhlciB2b2x1bnRhcmlseSAoZS5nLiwg
YnkgZGVzdHJveWluZyB0aGUgUHJvZHVjZXJFbmRwb2ludAorICAvLyBvYnRhaW5lZCB0aHJvdWdo
IFNlcnZpY2U6OkNvbm5lY3RQcm9kdWNlcigpKSBvciBpbnZvbHVudGFyaWx5IChlLmcuLCBpZiB0
aGUKKyAgLy8gU2VydmljZSBwcm9jZXNzIGNyYXNoZXMpLgorICAvLyBUaGUgUHJvZHVjZXIgaXMg
ZXhwZWN0ZWQgdG8gdGVhciBkb3duIGFsbCBpdHMgZGF0YSBzb3VyY2VzIGlmIHRoaXMgaGFwcGVu
cy4KKyAgLy8gT25jZSB0aGlzIGNhbGwgcmV0dXJucyBpdCBpcyBwb3NzaWJsZSB0byBzYWZlbHkg
ZGVzdHJveSB0aGUgUHJvZHVjZXIKKyAgLy8gaW5zdGFuY2UuCisgIHZpcnR1YWwgdm9pZCBPbkRp
c2Nvbm5lY3QoKSA9IDA7CisKKyAgLy8gQ2FsbGVkIGJ5IHRoZSBTZXJ2aWNlIGFmdGVyIE9uQ29u
bmVjdCBidXQgYmVmb3JlIHRoZSBmaXJzdCBEYXRhU291cmNlIGlzCisgIC8vIGNyZWF0ZWQuIENh
biBiZSB1c2VkIGZvciBhbnkgc2V0dXAgcmVxdWlyZWQgYmVmb3JlIHRyYWNpbmcgYmVnaW5zLgor
ICB2aXJ0dWFsIHZvaWQgT25UcmFjaW5nU2V0dXAoKSA9IDA7CisKKyAgLy8gVGhlIGxpZmVjeWNs
ZSBtZXRob2RzIGJlbG93IGFyZSBhbHdheXMgY2FsbGVkIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVu
Y2U6CisgIC8vIFNldHVwRGF0YVNvdXJjZSAgLT4gU3RhcnREYXRhU291cmNlIC0+IFN0b3BEYXRh
U291cmNlLgorICAvLyBPciwgaW4gdGhlIGVkZ2UgY2FzZSB3aGVyZSBhIHRyYWNlIGlzIGFib3J0
ZWQgaW1tZWRpYXRlbHk6CisgIC8vIFNldHVwRGF0YVNvdXJjZSAgLT4gU3RvcERhdGFTb3VyY2Uu
CisgIC8vIFRoZSBTZXR1cCtTdGFydCBjYWxsIHNlcXVlbmNlIGlzIGFsd2F5cyBndWFyYW5hdGVl
ZCwgcmVnYXJkbGVzcyBvZiB0aGUKKyAgLy8gVHJhY2VDb25maWcuZGVmZXJyZWRfc3RhcnQgZmxh
Z3MuCisgIC8vIENhbGxlZCBieSB0aGUgU2VydmljZSB0byBjb25maWd1cmUgb25lIG9mIHRoZSBk
YXRhIHNvdXJjZXMgcHJldmlvdXNseQorICAvLyByZWdpc3RlcmVkIHRocm91Z2ggVHJhY2luZ1Nl
cnZpY2U6OlByb2R1Y2VyRW5kcG9pbnQ6OlJlZ2lzdGVyRGF0YVNvdXJjZSgpLgorICAvLyBUaGlz
IG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSBTdGFydERhdGFTb3VyY2UuIFRoZXJlIGlz
IGFsd2F5cyBhCisgIC8vIFNldHVwRGF0YVNvdXJjZSgpIGNhbGwgYmVmb3JlIGVhY2ggU3RhcnRE
YXRhU291cmNlKCkgY2FsbC4KKyAgLy8gQXJnczoKKyAgLy8gLSBEYXRhU291cmNlSW5zdGFuY2VJ
RCBpcyBhbiBpZGVudGlmaWVyIGNob3NlbiBieSB0aGUgU2VydmljZSB0aGF0IHNob3VsZAorICAv
LyAgIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIGRhdGEgc291cmNlIGluc3RhbmNl
LiBJdCBpcyB1c2VkIHRvCisgIC8vICAgbWF0Y2ggdGhlIFN0b3BEYXRhU291cmNlKCkgcmVxdWVz
dCBiZWxvdy4KKyAgLy8gLSBEYXRhU291cmNlQ29uZmlnIGlzIHRoZSBjb25maWd1cmF0aW9uIGZv
ciB0aGUgbmV3IGRhdGEgc291cmNlIChlLmcuLAorICAvLyAgIHRlbGxzIHdoaWNoIHRyYWNlIGNh
dGVnb3JpZXMgdG8gZW5hYmxlKS4KKyAgdmlydHVhbCB2b2lkIFNldHVwRGF0YVNvdXJjZShEYXRh
U291cmNlSW5zdGFuY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBE
YXRhU291cmNlQ29uZmlnJikgPSAwOworCisgIC8vIENhbGxlZCBieSB0aGUgU2VydmljZSB0byB0
dXJuIG9uIG9uZSBvZiB0aGUgZGF0YSBzb3VyY2VzIHByZXZpb3VzbHkKKyAgLy8gcmVnaXN0ZXJl
ZCB0aHJvdWdoIFRyYWNpbmdTZXJ2aWNlOjpQcm9kdWNlckVuZHBvaW50OjpSZWdpc3RlckRhdGFT
b3VyY2UoKQorICAvLyBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBTZXR1cERhdGFTb3VyY2UoKS4K
KyAgLy8gQm90aCBhcmd1bWVudHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgaWRlbnRpY2FsIHRvIHRo
ZSBvbmVzIHBhc3NlZCB0byB0aGUKKyAgLy8gcHJpb3IgU2V0dXBEYXRhU291cmNlKCkgY2FsbC4K
KyAgdmlydHVhbCB2b2lkIFN0YXJ0RGF0YVNvdXJjZShEYXRhU291cmNlSW5zdGFuY2VJRCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhU291cmNlQ29uZmlnJikgPSAw
OworCisgIC8vIENhbGxlZCBieSB0aGUgU2VydmljZSB0byBzaHV0IGRvd24gYW4gZXhpc3Rpbmcg
ZGF0YSBzb3VyY2UgaW5zdGFuY2UuCisgIHZpcnR1YWwgdm9pZCBTdG9wRGF0YVNvdXJjZShEYXRh
U291cmNlSW5zdGFuY2VJRCkgPSAwOworCisgIC8vIENhbGxlZCBieSB0aGUgc2VydmljZSB0byBy
ZXF1ZXN0IHRoZSBQcm9kdWNlciB0byBjb21taXQgdGhlIGRhdGEgb2YgdGhlCisgIC8vIGdpdmVu
IGRhdGEgc291cmNlcyBhbmQgcmV0dXJuIHRoZWlyIGNodW5rcyBpbnRvIHRoZSBzaGFyZWQgbWVt
b3J5IGJ1ZmZlci4KKyAgLy8gVGhlIFByb2R1Y2VyIGlzIGV4cGVjdGVkIHRvIGludm9rZSBOb3Rp
ZnlGbHVzaENvbXBsZXRlKEZsdXNoUmVxdWVzdElEKSBvbgorICAvLyB0aGUgU2VydmljZSBhZnRl
ciB0aGUgZGF0YSBoYXMgYmVlbiBjb21taXR0ZWQuIFRoZSBwcm9kdWNlciBoYXMgdG8gZWl0aGVy
CisgIC8vIHJlcGx5IHRvIHRoZSBmbHVzaCByZXF1ZXN0cyBpbiBvcmRlciwgb3IgY2FuIGp1c3Qg
cmVwbHkgdG8gdGhlIGxhdGVzdCBvbmUKKyAgLy8gVXBvbiBzZWVpbmcgYSBOb3RpZnlGbHVzaENv
bXBsZXRlKE4pLCB0aGUgc2VydmljZSB3aWxsIGFzc3VtZSB0aGF0IGFsbAorICAvLyBmbHVzaGVz
IDwgTiBoYXZlIGFsc28gYmVlbiBjb21taXR0ZWQuCisgIHZpcnR1YWwgdm9pZCBGbHVzaChGbHVz
aFJlcXVlc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFTb3VyY2VJbnN0YW5j
ZUlEKiBkYXRhX3NvdXJjZV9pZHMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2Rh
dGFfc291cmNlcykgPSAwOworCisgIC8vIENhbGxlZCBieSB0aGUgc2VydmljZSB0byBpbnN0cnVj
dCB0aGUgZ2l2ZW4gZGF0YSBzb3VyY2VzIHRvIHN0b3AgcmVmZXJyaW5nCisgIC8vIHRvIGFueSB0
cmFjZSBjb250ZW50cyBlbWl0dGVkIHNvIGZhci4gVGhlIGludGVudCBpcyB0aGF0IGFmdGVyIHBy
b2Nlc3NpbmcKKyAgLy8gdGhpcyBjYWxsLCB0aGUgcmVzdCBvZiB0aGUgdHJhY2Ugc2hvdWxkIGJl
IHBhcnNhYmxlIGV2ZW4gaWYgYWxsIG9mIHRoZQorICAvLyBwYWNrZXRzIGVtaXR0ZWQgc28gZmFy
IGhhdmUgYmVlbiBsb3N0IChmb3IgZXhhbXBsZSBkdWUgdG8gcmluZyBidWZmZXIKKyAgLy8gb3Zl
cndyaXRlcykuCisgIC8vCisgIC8vIENhbGxlZCBvbmx5IGZvciBQcm9kdWNlcnMgd2l0aCBhY3Rp
dmUgZGF0YSBzb3VyY2VzIHRoYXQgaGF2ZSBvcHRlZCBpbiBieQorICAvLyBzZXR0aW5nIHxoYW5k
bGVzX2luY3JlbWVudGFsX3N0YXRlX2NsZWFyfCBpbiB0aGVpciBEYXRhU291cmNlRGVzY3JpcHRv
ci4KKyAgLy8KKyAgLy8gVGhlIHdheSB0aGlzIGNhbGwgaXMgaGFuZGxlZCBpcyB1cCB0byB0aGUg
aW5kaXZpZHVhbCBQcm9kdWNlcgorICAvLyBpbXBsZW1lbnRhdGlvbi4gU29tZSBtaWdodCB3aXNo
IHRvIGVtaXQgaW52YWxpZGF0aW9uIG1hcmtlcnMgaW4gdGhlIHRyYWNlCisgIC8vIChzZWUgVHJh
Y2VQYWNrZXQuaW5jcmVtZW50YWxfc3RhdGVfY2xlYXJlZCBmb3IgYW4gZXhpc3RpbmcgZmllbGQp
LCBhbmQKKyAgLy8gaGFuZGxlIHRoZW0gd2hlbiBwYXJzaW5nIHRoZSB0cmFjZS4KKyAgdmlydHVh
bCB2b2lkIENsZWFySW5jcmVtZW50YWxTdGF0ZSgKKyAgICAgIGNvbnN0IERhdGFTb3VyY2VJbnN0
YW5jZUlEKiBkYXRhX3NvdXJjZV9pZHMsCisgICAgICBzaXplX3QgbnVtX2RhdGFfc291cmNlcykg
PSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVE
RV9QRVJGRVRUT19FWFRfVFJBQ0lOR19DT1JFX1BST0RVQ0VSX0hfCisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNl
ZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsK
KyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0
aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAor
ICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisg
KgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3
cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz
dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD
T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2Vl
IHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Np
b25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29y
ZS9jb25zdW1lci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9wcm9kdWNlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQv
dHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnlfYXJiaXRlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS90cmFjaW5nX3Nl
cnZpY2UuaCIKKworLy8gVGhpcyB0cmFuc2xhdGlvbiB1bml0IGNvbnRhaW5zIHRoZSBkZWZpbml0
aW9ucyBmb3IgdGhlIGRlc3RydWN0b3Igb2YgcHVyZQorLy8gdmlydHVhbCBpbnRlcmZhY2VzIGZv
ciB0aGUgY3VycmVudCBidWlsZCB0YXJnZXQuIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZQorLy8g
aW50cm9kdWNpbmcgYSBvbmUtbGluZXIgLmNjIGZpbGUgZm9yIGVhY2ggcHVyZSB2aXJ0dWFsIGlu
dGVyZmFjZSwgd2hpY2ggaXMKKy8vIG92ZXJraWxsLiBUaGlzIGlzIGZvciBjb21wbGlhbmNlIHdp
dGggLVd3ZWFrLXZ0YWJsZXMuCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKK0NvbnN1bWVyOjp+
Q29uc3VtZXIoKSA9IGRlZmF1bHQ7CitQcm9kdWNlcjo6flByb2R1Y2VyKCkgPSBkZWZhdWx0Owor
VHJhY2luZ1NlcnZpY2U6On5UcmFjaW5nU2VydmljZSgpID0gZGVmYXVsdDsKK0NvbnN1bWVyRW5k
cG9pbnQ6On5Db25zdW1lckVuZHBvaW50KCkgPSBkZWZhdWx0OworUHJvZHVjZXJFbmRwb2ludDo6
flByb2R1Y2VyRW5kcG9pbnQoKSA9IGRlZmF1bHQ7CitTaGFyZWRNZW1vcnk6On5TaGFyZWRNZW1v
cnkoKSA9IGRlZmF1bHQ7CitTaGFyZWRNZW1vcnk6OkZhY3Rvcnk6On5GYWN0b3J5KCkgPSBkZWZh
dWx0OworU2hhcmVkTWVtb3J5QXJiaXRlcjo6flNoYXJlZE1lbW9yeUFyYml0ZXIoKSA9IGRlZmF1
bHQ7CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IHNvdXJjZTogc3JjL3RyYWNpbmcvZGF0YV9zb3VyY2UuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy9kYXRhX3NvdXJjZS5oCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvaW50
ZXJuYWwvYmFzaWNfdHlwZXMuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19U
UkFDSU5HX0lOVEVSTkFMX0JBU0lDX1RZUEVTX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9f
VFJBQ0lOR19JTlRFUk5BTF9CQVNJQ19UWVBFU19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+Cisj
aW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgaW50
ZXJuYWwgeworCisvLyBBIHN0YXRpY19hc3NlcnQgaW4gdHJhY2luZ19tdXhlcl9pbXBsLmNjIGd1
YXJhbnRlZXMgdGhhdCB0aGlzIHN0YXlzIGluIHN5bmMKKy8vIHdpdGggdGhlIGRlZmluaXRpb24g
aW4gdHJhY2luZy9jb3JlL2Jhc2ljX3R5cGVzLmgKK3VzaW5nIEJ1ZmZlcklkID0gdWludDE2X3Q7
CisKKy8vIFRoaXMgaXMgYSBkaXJlY3QgaW5kZXggaW4gdGhlIFRyYWNpbmdNdXhlcjo6YmFja2Vu
ZHNfIHZlY3Rvci4KKy8vIEJhY2tlbmRzIGFyZSBvbmx5IGFkZGVkIGFuZCBuZXZlciByZW1vdmVk
LgordXNpbmcgVHJhY2luZ0JhY2tlbmRJZCA9IHNpemVfdDsKKworLy8gTWF4IG51bWJlcnMgb2Yg
ZGF0YSBzb3VyY2VzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSBwcm9jZXNzLgorY29uc3Rl
eHByIHNpemVfdCBrTWF4RGF0YVNvdXJjZXMgPSAzMjsKKworLy8gTWF4IGluc3RhbmNlcyBmb3Ig
ZWFjaCBkYXRhIHNvdXJjZSB0eXBlLiBUaGlzIHR5cGljYWxseSBtYXRjaGVzIHRoZQorLy8gIm1h
eCBudW1iZXIgb2YgY29uY3VycmVudCB0cmFjaW5nIHNlc3Npb25zIi4gSG93ZXZlciByZW1lbWJl
ciB0aGF0IGEgZGF0YQorLy8gc291cmNlIGNhbiBiZSBpbnN0YW50aWF0ZWQgbW9yZSB0aGFuIG9u
Y2Ugd2l0aGluIG9uZSB0cmFjaW5nIHNlc3Npb24gYnkKKy8vIGNyZWF0aW5nIHR3byBlbnRyaWVz
IGZvciBpdCBpbiB0aGUgdHJhY2UgY29uZmlnLgorY29uc3RleHByIHNpemVfdCBrTWF4RGF0YVNv
dXJjZUluc3RhbmNlcyA9IDg7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lO
VEVSTkFMX0JBU0lDX1RZUEVTX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBp
bmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvZGF0YV9zb3VyY2VfaW50ZXJuYWwuaAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX0RBVEFf
U09VUkNFX0lOVEVSTkFMX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRF
Uk5BTF9EQVRBX1NPVVJDRV9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5j
bHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxhdG9taWM+Cisj
aW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+
CisKKy8vIE5vIHBlcmZldHRvIGhlYWRlcnMgKG90aGVyIHRoYW4gdHJhY2luZy9hcGkgYW5kIHBy
b3RvemVybykgc2hvdWxkIGJlIGhlcmUuCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2J1ZmZlcl9leGhhdXN0ZWRfcG9saWN5LmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVy
bmFsL2Jhc2ljX3R5cGVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by90cmFjaW5nL3RyYWNlX3dyaXRlcl9iYXNlLmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgVHJhY2VXcml0ZXJCYXNlOwor
CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBUcmFjaW5nVExTOworCisvLyBUaGlzIG1h
aW50YWlucyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgYSBkYXRhIHNvdXJjZSBpbnN0YW5jZSB0aGF0
IGlzIHVzZWQgb25seQorLy8gdG8gaW1wbGVtZW50IHRoZSB0cmFjaW5nIG1lY2hhbmljcyBhbmQg
aXMgbm90IGV4cG9zZWQgdG8gdGhlIEFQSSBjbGllbnQuCisvLyBUaGVyZSBpcyBvbmUgb2YgdGhl
c2Ugb2JqZWN0IHBlciBEYXRhU291cmNlIGluc3RhbmNlICh1cCB0bworLy8ga01heERhdGFTb3Vy
Y2VJbnN0YW5jZXMpLgorc3RydWN0IERhdGFTb3VyY2VTdGF0ZSB7CisgIC8vIFRoaXMgYm9vbGVh
biBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgRGF0YVNvdXJjZTo6VHJhY2UoKSBtZXRob2Qg
c2hvdWxkCisgIC8vIGRvIHNvbWV0aGluZyBvciBiZSBhIG5vLW9wLiBUaGlzIGZsYWcgZG9lc24n
dCBnaXZlIHRoZSBmdWxsIGd1YXJhbnRlZQorICAvLyB0aGF0IHRyYWNpbmcgZGF0YSB3aWxsIGJl
IHZpc2libGUgaW4gdGhlIHRyYWNlLCBpdCBqdXN0IG1ha2VzIGl0IHNvIHRoYXQKKyAgLy8gdGhl
IGNsaWVudCBhdHRlbXBzIHdyaXRpbmcgdHJhY2UgZGF0YSBhbmQgaW50ZXJhY3Rpbmcgd2l0aCB0
aGUgc2VydmljZS4KKyAgLy8gRm9yIGluc3RhbmNlLCB3aGVuIGEgdHJhY2luZyBzZXNzaW9uIGVu
ZHMgdGhlIHNlcnZpY2Ugd2lsbCByZWplY3QgZGF0YQorICAvLyBjb21taXRzIHRoYXQgYXJyaXZl
IHRvbyBsYXRlIGV2ZW4gaWYgdGhlIHByb2R1Y2VyIGhhc24ndCByZWNlaXZlZCB0aGUgc3RvcAor
ICAvLyBJUEMgbWVzc2FnZS4KKyAgLy8gVGhpcyBmbGFnIGlzIHNldCByaWdodCBiZWZvcmUgY2Fs
bGluZyBPblN0YXJ0KCkgYW5kIGNsZWFyZWQgcmlnaHQgYmVmb3JlCisgIC8vIGNhbGxpbmcgT25T
dG9wKCksIHVubGVzcyB1c2luZyBIYW5kbGVTdG9wQXN5bmNocm9ub3VzbHkoKSAoc2VlIGNvbW1l
bnRzCisgIC8vIGluIGRhdGFfc291cmNlLmgpLgorICAvLyBLZWVwIHRoaXMgZmxhZyBhcyB0aGUg
Zmlyc3QgZmllbGQuIFRoaXMgYWxsb3dzIHRoZSBjb21waWxlciB0byBkaXJlY3RseQorICAvLyBk
ZXJlZmVyZW5jZSB0aGUgRGF0YVNvdXJjZVN0YXRlKiBwb2ludGVyIGluIHRoZSB0cmFjZSBmYXN0
LXBhdGggd2l0aG91dAorICAvLyBkb2luZyBleHRyYSBwb2ludHIgYXJpdGhtZXRpYy4KKyAgYm9v
bCB0cmFjZV9sYW1iZGFfZW5hYmxlZCA9IGZhbHNlOworCisgIC8vIFRoZSBjZW50cmFsIGJ1ZmZl
ciBpZCB0aGF0IGFsbCBUcmFjZVdyaXRlcihzKSBjcmVhdGVkIGJ5IHRoaXMgZGF0YSBzb3VyY2UK
KyAgLy8gbXVzdCB0YXJnZXQuCisgIEJ1ZmZlcklkIGJ1ZmZlcl9pZCA9IDA7CisKKyAgLy8gVGhl
IGluZGV4IHdpdGhpbiBUcmFjaW5nTXV4ZXJJbXBsLmJhY2tlbmRzXy4gUHJhY3RpY2FsbHkgaXQg
YWxsb3dzIHRvCisgIC8vIGxvb2t1cCB0aGUgUHJvZHVjZXIgb2JqZWN0LCBhbmQgaGVuY2UgdGhl
IElQQyBjaGFubmVsLCBmb3IgdGhpcyBkYXRhCisgIC8vIHNvdXJjZS4KKyAgVHJhY2luZ0JhY2tl
bmRJZCBiYWNrZW5kX2lkID0gMDsKKworICAvLyBUaGUgaW5zdGFuY2UgaWQgYXMgYXNzaWduZWQg
YnkgdGhlIHRyYWNpbmcgc2VydmljZS4gTm90ZSB0aGF0IGJlY2F1c2UgYQorICAvLyBwcm9jZXNz
IGNhbiBiZSBjb25uZWN0ZWQgdG8gPjEgc2VydmljZXMsIHRoaXMgSUQgaXMgbm90IGdsb2JhbGx5
IHVuaXF1ZSBidXQKKyAgLy8gaXMgb25seSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiBpdHMg
YmFja2VuZC4KKyAgLy8gT25seSB0aGUgdHVwbGUgKGJhY2tlbmRfaWQsIGRhdGFfc291cmNlX2lu
c3RhbmNlX2lkKSBpcyBnbG9iYWxseSB1bmlxdWUuCisgIHVpbnQ2NF90IGRhdGFfc291cmNlX2lu
c3RhbmNlX2lkID0gMDsKKworICAvLyBBIGhhc2ggb2YgdGhlIHRyYWNlIGNvbmZpZyB1c2VkIGJ5
IHRoaXMgaW5zdGFuY2UuIFRoaXMgaXMgdXNlZCB0bworICAvLyBkZS1kdXBsaWNhdGUgaW5zdGFu
Y2VzIGZvciBkYXRhIHNvdXJjZXMgd2l0aCBpZGVudGljYWwgbmFtZXMgKGUuZy4sIHRyYWNrCisg
IC8vIGV2ZW50KS4KKyAgdWludDY0X3QgY29uZmlnX2hhc2ggPSAwOworCisgIC8vIFRoaXMgbG9j
ayBpcyBub3QgaGVsZCB0byBpbXBsZW1lbnQgVHJhY2UoKSBhbmQgaXQncyB1c2VkIG9ubHkgaWYg
dGhlIHRyYWNlCisgIC8vIGNvZGUgd2FudHMgdG8gYWNjZXNzIGl0cyBvd24gZGF0YSBzb3VyY2Ug
c3RhdGUuCisgIC8vIFRoaXMgaXMgdG8gcHJldmVudCB0aGF0IGFjY2Vzc2luZyB0aGUgZGF0YSBz
b3VyY2Ugb24gYW4gYXJiaXRyYXJ5IGVtYmVkZGVyCisgIC8vIHRocmVhZCByYWNlcyB3aXRoIHRo
ZSBpbnRlcm5hbCBJUEMgdGhyZWFkIGRlc3Ryb3lpbmcgdGhlIGRhdGEgc291cmNlCisgIC8vIGJl
Y2F1c2Ugb2YgYSBlbmQtb2YtdHJhY2luZyBub3RpZmljYXRpb24gZnJvbSB0aGUgc2VydmljZS4K
KyAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbG9jazsKKyAgc3RkOjp1bmlxdWVfcHRyPERhdGFTb3Vy
Y2VCYXNlPiBkYXRhX3NvdXJjZTsKK307CisKKy8vIFRoaXMgaXMgdG8gYWxsb3cgbGF6eS1pbml0
aWFsaXphdGlvbiBhbmQgYXZvaWQgc3RhdGljIGluaXRpYWxpemVycyBhbmQKKy8vIGF0LWV4aXQg
ZGVzdHJ1Y3RvcnMuIEFsbCB0aGUgZW50cmllcyBhcmUgaW5pdGlhbGl6ZWQgdmlhIHBsYWNlbWVu
dC1uZXcgd2hlbgorLy8gRGF0YVNvdXJjZTo6UmVnaXN0ZXIoKSBpcyBjYWxsZWQsIHNlZSBUcmFj
aW5nTXV4ZXJJbXBsOjpSZWdpc3RlckRhdGFTb3VyY2UoKS4KK3N0cnVjdCBEYXRhU291cmNlU3Rh
dGVTdG9yYWdlIHsKKyAgYWxpZ25hcyhEYXRhU291cmNlU3RhdGUpIGNoYXIgc3RvcmFnZVtzaXpl
b2YoRGF0YVNvdXJjZVN0YXRlKV17fTsKK307CisKKy8vIFBlci1EYXRhU291cmNlLXR5cGUgZ2xv
YmFsIHN0YXRlLgorc3RydWN0IERhdGFTb3VyY2VTdGF0aWNTdGF0ZSB7CisgIC8vIFVuaXF1ZSBp
bmRleCBvZiB0aGUgZGF0YSBzb3VyY2UsIGFzc2lnbmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLgor
ICB1aW50MzJfdCBpbmRleCA9IGtNYXhEYXRhU291cmNlczsKKworICAvLyBBIGJpdG1hcCB0aGF0
IHRlbGxzIGFib3V0IHRoZSB2YWxpZGl0eSBvZiBlYWNoIHxpbnN0YW5jZXN8IGVudHJ5LiBXaGVu
IHRoZQorICAvLyBpLXRoIGJpdCBvZiB0aGUgYml0bWFwIGl0J3Mgc2V0LCBpbnN0YW5jZXNbaV0g
aXMgdmFsaWQuCisgIHN0ZDo6YXRvbWljPHVpbnQzMl90PiB2YWxpZF9pbnN0YW5jZXN7fTsKKyAg
c3RkOjphcnJheTxEYXRhU291cmNlU3RhdGVTdG9yYWdlLCBrTWF4RGF0YVNvdXJjZUluc3RhbmNl
cz4gaW5zdGFuY2Vze307CisKKyAgLy8gQ2FuIGJlIHVzZWQgd2l0aCBhIGNhY2hlZCB8dmFsaWRf
aW5zdGFuY2VzfCBiaXRtYXAuCisgIERhdGFTb3VyY2VTdGF0ZSogVHJ5R2V0Q2FjaGVkKHVpbnQz
Ml90IGNhY2hlZF9iaXRtYXAsIHNpemVfdCBuKSB7CisgICAgcmV0dXJuIGNhY2hlZF9iaXRtYXAg
JiAoMSA8PCBuKQorICAgICAgICAgICAgICAgPyByZWludGVycHJldF9jYXN0PERhdGFTb3VyY2VT
dGF0ZSo+KCZpbnN0YW5jZXNbbl0pCisgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKwor
ICBEYXRhU291cmNlU3RhdGUqIFRyeUdldChzaXplX3QgbikgeworICAgIHJldHVybiBUcnlHZXRD
YWNoZWQodmFsaWRfaW5zdGFuY2VzLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSksIG4p
OworICB9CisKKyAgdm9pZCBDb21waWxlckFzc2VydHMoKSB7CisgICAgc3RhdGljX2Fzc2VydChz
aXplb2YodmFsaWRfaW5zdGFuY2VzLmxvYWQoKSkgKiA4ID49IGtNYXhEYXRhU291cmNlSW5zdGFu
Y2VzLAorICAgICAgICAgICAgICAgICAgImtNYXhEYXRhU291cmNlSW5zdGFuY2VzIHRvbyBoaWdo
Iik7CisgIH0KK307CisKKy8vIFBlci1EYXRhU291cmNlLWluc3RhbmNlIHRocmVhZC1sb2NhbCBz
dGF0ZS4KK3N0cnVjdCBEYXRhU291cmNlSW5zdGFuY2VUaHJlYWRMb2NhbFN0YXRlIHsKKyAgdXNp
bmcgSW5jcmVtZW50YWxTdGF0ZVBvaW50ZXIgPSBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgdm9pZCAo
Kikodm9pZCopPjsKKworICB2b2lkIFJlc2V0KCkgeworICAgIHRyYWNlX3dyaXRlci5yZXNldCgp
OworICAgIGluY3JlbWVudGFsX3N0YXRlLnJlc2V0KCk7CisgICAgYmFja2VuZF9pZCA9IDA7Cisg
ICAgYnVmZmVyX2lkID0gMDsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxUcmFjZVdyaXRlckJh
c2U+IHRyYWNlX3dyaXRlcjsKKyAgSW5jcmVtZW50YWxTdGF0ZVBvaW50ZXIgaW5jcmVtZW50YWxf
c3RhdGUgPSB7bnVsbHB0ciwgW10odm9pZCopIHt9fTsKKyAgVHJhY2luZ0JhY2tlbmRJZCBiYWNr
ZW5kX2lkOworICBCdWZmZXJJZCBidWZmZXJfaWQ7Cit9OworCisvLyBQZXItRGF0YVNvdXJjZS10
eXBlIHRocmVhZC1sb2NhbCBzdGF0ZS4KK3N0cnVjdCBEYXRhU291cmNlVGhyZWFkTG9jYWxTdGF0
ZSB7CisgIERhdGFTb3VyY2VTdGF0aWNTdGF0ZSogc3RhdGljX3N0YXRlID0gbnVsbHB0cjsKKwor
ICAvLyBQb2ludGVyIHRvIHRoZSBwYXJlbnQgdGxzIG9iamVjdCB0aGF0IGhvbGRzIHVzLiBVc2Vk
IHRvIHJldHJpZXZlIHRoZQorICAvLyBnZW5lcmF0aW9uLCB3aGljaCBpcyBwZXItZ2xvYmFsLVRM
UyBhbmQgbm90IHBlciBkYXRhLXNvdXJjZS4KKyAgVHJhY2luZ1RMUyogcm9vdF90bHMgPSBudWxs
cHRyOworCisgIC8vIE9uZSBlbnRyeSBwZXIgZWFjaCBkYXRhIHNvdXJjZSBpbnN0YW5jZS4KKyAg
c3RkOjphcnJheTxEYXRhU291cmNlSW5zdGFuY2VUaHJlYWRMb2NhbFN0YXRlLCBrTWF4RGF0YVNv
dXJjZUluc3RhbmNlcz4KKyAgICAgIHBlcl9pbnN0YW5jZXt9OworfTsKKworfSAgLy8gbmFtZXNw
YWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNM
VURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfREFUQV9TT1VSQ0VfSU5URVJOQUxfSF8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy9p
bnRlcm5hbC90cmFjaW5nX211eGVyLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6
IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy9pbnRlcm5hbC90cmFjaW5nX3Rscy5oCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvcGxhdGZv
cm0uaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQ
cm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9u
IDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2Vw
dCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNv
cHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9s
aWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxl
IGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBX
SVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJl
c3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1
YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBM
aWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1BMQVRGT1JN
X0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19QTEFURk9STV9IXworCisjaW5j
bHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxmdW5jdGlv
bmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
KworbmFtZXNwYWNlIGJhc2UgeworY2xhc3MgVGFza1J1bm5lcjsKK30gIC8vIG5hbWVzcGFjZSBi
YXNlCisKKy8vIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCB0byBhYnN0cmFjdCBkZXBlbmRl
bmNpZXMgb24gcGxhdGZvcm0tc3BlY2lmaWMKKy8vIHByaW1pdGl2ZXMgdGhhdCBjYW5ub3QgYmUg
aW1wbGVtZW50ZWQgYnkgdGhlIHBlcmZldHRvIGNvZGViYXNlIGFuZCBtdXN0IGJlCisvLyBwcm92
aWRlZCBvciBvdmVycmlkZGVuIGJ5IHRoZSBlbWJlZGRlci4KKy8vIFRoaXMgaXMsIGZvciBpbnN0
YW5jZSwgZm9yIGNhc2VzIHdoZXJlIHdlIHdhbnQgdG8gdXNlIHNvbWUgcGFydGljdWxhcgorLy8g
YmFzZTo6IGNsYXNzIGluIENocm9tZSBhbmQgcHJvdmlkZSBpbnN0ZWFkIFBPU0lYIGZhbGxiYWNr
cyBmb3Igb3RoZXIKKy8vIGVtYmVkZGVycy4KKworLy8gQmFzZSBjbGFzcyBmb3IgdGhyZWFkLWxv
Y2FsIG9iamVjdHMuIFRoaXMgaXMgdG8gZ2V0IGEgYmFzaWMgb2JqZWN0IHZ0YWJsZSBhbmQKKy8v
IGRlbGVnYXRlIGRlc3RydWN0aW9uIHRvIHRoZSBlbWJlZGRlci4gU2VlIFBsYXRmb3JtOjpDcmVh
dGVUaHJlYWRMb2NhbE9iamVjdC4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBQbGF0Zm9ybVRocmVh
ZExvY2FsT2JqZWN0IHsKKyBwdWJsaWM6CisgIC8vIEltcGxlbWVudGVkIGJ5IHBlcmZldHRvIGlu
dGVybmFsIGNvZGUuIFRoZSBlbWJlZGRlciBtdXN0IGNhbGwgdGhpcyB3aGVuCisgIC8vIGltcGxl
bWVudGluZyBHZXRPckNyZWF0ZVRocmVhZExvY2FsT2JqZWN0KCkgdG8gY3JlYXRlIGFuIGluc3Rh
bmNlIGZvciB0aGUKKyAgLy8gZmlyc3QgdGltZSBvbiBlYWNoIHRocmVhZC4KKyAgc3RhdGljIHN0
ZDo6dW5pcXVlX3B0cjxQbGF0Zm9ybVRocmVhZExvY2FsT2JqZWN0PiBDcmVhdGVJbnN0YW5jZSgp
OworICB2aXJ0dWFsIH5QbGF0Zm9ybVRocmVhZExvY2FsT2JqZWN0KCk7Cit9OworCitjbGFzcyBQ
RVJGRVRUT19FWFBPUlQgUGxhdGZvcm0geworIHB1YmxpYzoKKyAgLy8gRW1iZWRkZXJzIGNhbiB1
c2UgdGhpcyB1bmxlc3MgdGhleSBoYXZlIGN1c3RvbSBuZWVkcyAoZS5nLiBDaHJvbWUgd2FudGlu
ZworICAvLyB0byB1c2UgaXRzIG93biBiYXNlIGNsYXNzIGZvciBUTFMpLgorICBzdGF0aWMgUGxh
dGZvcm0qIEdldERlZmF1bHRQbGF0Zm9ybSgpOworCisgIHZpcnR1YWwgflBsYXRmb3JtKCk7CisK
KyAgLy8gQ3JlYXRlcyBhIHRocmVhZC1sb2NhbCBvYmplY3QuIFRoZSBlbWJlZGRlciBtdXN0Ogor
ICAvLyAtIENyZWF0ZSBhbiBpbnN0YW5jZSBwZXItdGhyZWFkIGNhbGxpbmcgVGhyZWFkTG9jYWxP
YmplY3Q6OkNyZWF0ZUluc3RhbmNlLgorICAvLyAtIE93biB0aGUgbGlmZXRpbWUgb2YgdGhlIHJl
dHVybmVkIG9iamVjdCBhcyBsb25nIGFzIHRoZSB0aHJlYWQgaXMgYWxpdmUuCisgIC8vIC0gRGVz
dHJveSBpdCB3aGVuIHRoZSB0aHJlYWQgZXhpdHMuCisgIC8vIFBlcmZldHRvIHJlcXVpcmVzIG9u
bHkgb25lIHRocmVhZC1sb2NhbCBvYmplY3Qgb3ZlcmFsbCAob2J2aW91c2x5LCBvbmUKKyAgLy8g
aW5zdGFuY2UgcGVyLXRocmVhZCkgZnJvbSB0aGUgZW1iZWRkZXIuCisgIHVzaW5nIFRocmVhZExv
Y2FsT2JqZWN0ID0gOjpwZXJmZXR0bzo6UGxhdGZvcm1UaHJlYWRMb2NhbE9iamVjdDsKKyAgdmly
dHVhbCBUaHJlYWRMb2NhbE9iamVjdCogR2V0T3JDcmVhdGVUaHJlYWRMb2NhbE9iamVjdCgpID0g
MDsKKworICAvLyBDcmVhdGVzIGEgc2VxdWVuY2VkIHRhc2sgcnVubmVyLiBUaGUgZWFzaWVzdCBp
bXBsZW1lbnRhdGlvbiBpcyB0byBjcmVhdGUKKyAgLy8gYSBuZXcgdGhyZWFkIChlLmcuIHVzZSBi
YXNlOjpUaHJlYWRUYXNrUnVubmVyKSBidXQgdGhpcyBjYW4gYWxzbyBiZQorICAvLyBpbXBsZW1l
bnRlZCBpbiBzb21lIG1vcmUgY2xldmVyIHdheSAoZS5nLiB1c2luZyBjaHJvbWl1bXMncyBzY2hl
ZHVsZXIpLgorICBzdHJ1Y3QgQ3JlYXRlVGFza1J1bm5lckFyZ3Mge307CisgIHZpcnR1YWwgc3Rk
Ojp1bmlxdWVfcHRyPGJhc2U6OlRhc2tSdW5uZXI+IENyZWF0ZVRhc2tSdW5uZXIoCisgICAgICBj
b25zdCBDcmVhdGVUYXNrUnVubmVyQXJncyYpID0gMDsKKworICAvLyBVc2VkIHRvIGRlcml2ZSB0
aGUgcHJvZHVjZXIgbmFtZS4gTW9zdGx5IHJlbGV2YW50IHdoZW4gdXNpbmcgdGhlCisgIC8vIGtT
eXN0ZW1CYWNrZW5kIG1vZGUuIEl0IGNhbiBiZSBhbiBhcmJpdHJhcnkgc3RyaW5nIHdoZW4gdXNp
bmcgdGhlCisgIC8vIGluLXByb2Nlc3MgbW9kZS4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRD
dXJyZW50UHJvY2Vzc05hbWUoKSA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8K
KworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfUExBVEZPUk1fSF8KKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElD
RU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdy
ZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj
ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJS
QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp
ZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p
bmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAq
LworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9UUkFDSU5HX1RM
U19IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfVFJBQ0lOR19U
TFNfSF8KKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPG1lbW9yeT4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9pbnRlcm5hbC9i
YXNpY190eXBlcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vdHJhY2luZy9pbnRlcm5hbC9kYXRhX3NvdXJjZV9pbnRlcm5hbC5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9wbGF0Zm9ybS5o
IgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCitjbGFzcyBUcmFjZVdyaXRlckJhc2U7CisKK25h
bWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIE9yZ2FuaXphdGlvbiBvZiB0aGUgdGhyZWFkLWxvY2Fs
IHN0b3JhZ2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8v
IEZpcnN0IG9mIGFsbCwgcmVtZW1iZXIgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBwcm9ibGVtOiBh
dCBhbnkgcG9pbnQgaW4gdGltZQorLy8gdGhlcmUgYXJlIE0gZGF0YSBzb3VyY2VzIHJlZ2lzdGVy
ZWQgKGkuZS4gbnVtYmVyIG9mIHN1YmNsYXNzZXMgb2YgRGF0YVNvdXJjZSkKKy8vIGFuZCB1cCB0
byBOIGNvbmN1cnJlbnQgaW5zdGFuY2VzIGZvciBlYWNoIGRhdGEgc291cmNlLCBzbyB1cCB0byBN
ICogTiB0b3RhbAorLy8gZGF0YSBzb3VyY2UgaW5zdGFuY2VzIGFyb3VuZC4KKy8vIEVhY2ggZGF0
YSBzb3VyY2UgaW5zdGFuY2UgY2FuIGJlIGFjY2Vzc2VkIGJ5IFQgdGhyZWFkcyAobm8gdXBwZXIg
Ym91bmQpLgorLy8gV2UgY2FuIHNhZmVseSBwdXQgaGFyZCBsaW1pdHMgYm90aCB0byBNIGFuZCBO
IChpLmUuIHNheSB0aGF0IHdlIHN1cHBvcnQgYXQKKy8vIG1vc3QgMzIgZGF0YSBzb3VyY2UgdHlw
ZXMgcGVyIHByb2Nlc3MgYW5kIHVwIHRvIDggY29uY3VycmVudCBpbnN0YW5jZXMpLgorLy8KKy8v
IFdlIHdhbnQgdG8gbWFrZSBpdCBzbyBmcm9tIHRoZSBQbGF0Zm9ybSB2aWV3cG9pbnQsIHdlIHVz
ZSBvbmx5IG9uZSBnbG9iYWwKKy8vIFRMUyBvYmplY3QsIHNvIFQgaW5zdGFuY2VzIGluIHRvdGFs
LCBvbmUgcGVyIHRocmVhZCwgcmVnYXJkbGVzcyBvZiBNIGFuZCBOLgorLy8gVGhpcyBhbGxvd3Mg
dG8gZGVhbCB3aXRoIGF0LXRocmVhZC1leGl0IGRlc3RydWN0aW9uIG9ubHkgaW4gb25lIHBsYWNl
LCByYXRoZXIKKy8vIHRoYW4gTiwgTSBvciBNICogTi4KKy8vCisvLyBWaXN1YWxseToKKy8vICAg
ICAgICAgICAgICAgICAgICAgWyAgICBUaHJlYWQgMSAgIF0gWyAgICBUaHJlYWQgMiAgIF0gWyAg
ICBUaHJlYWQgVCAgIF0KKy8vICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsg
Ky0tLS0tLS0tLS0tLS0tLSsgKy0tLS0tLS0tLS0tLS0tLSsKKy8vIERhdGEgc291cmNlIEZvbyAg
ICAgfCAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAgICAgIHwK
Ky8vICBJbnN0YW5jZSAxICAgICAgICAgfCAgICAgVExTICAgICAgIHwgfCAgICAgVExTICAgICAg
IHwgfCAgICAgVExTICAgICAgIHwKKy8vICBJbnN0YW5jZSAyICAgICAgICAgfCAgICBPYmplY3Qg
ICAgIHwgfCAgICBPYmplY3QgICAgIHwgfCAgICBPYmplY3QgICAgIHwKKy8vICBJbnN0YW5jZSAz
ICAgICAgICAgfCAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAg
ICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgfCAgICAgICAg
ICAgICAgIHwgfCAgICAgICAgICAgICAgIHwKKy8vIERhdGEgc291cmNlIEJhciAgICAgfCAgICAg
ICAgICAgICAgIHwgfCAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAgICAgIHwKKy8vICBJbnN0
YW5jZSAxICAgICAgICAgfCAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAgICAgIHwgfCAgICAg
ICAgICAgICAgIHwKKy8vICBJbnN0YW5jZSAyICAgICAgICAgfCAgICAgICAgICAgICAgIHwgfCAg
ICAgICAgICAgICAgIHwgfCAgICAgICAgICAgICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAg
Ky0tLS0tLS0tLS0tLS0tLSsgKy0tLS0tLS0tLS0tLS0tLSsgKy0tLS0tLS0tLS0tLS0tLSsKKy8v
CisvLyBFYWNoIFRMUyBPYmplY3QgaXMgb3JnYW5pemVkIGFzIGFuIGFycmF5IG9mIE0gRGF0YVNv
dXJjZVRocmVhZExvY2FsU3RhdGUuCisvLyBFYWNoIERTVExTIGl0c2VsZiBpcyBhbiBhcnJheSBv
ZiB1cCB0byBOIHBlci1pbnN0YW5jZSBvYmplY3RzLgorLy8gVGhlIG9ubHkgcGVyLWluc3RhbmNl
IG9iamVjdCBmb3Igbm93IGlzIHRoZSBUcmFjZVdyaXRlci4KKy8vIFNvIGZvciBlYWNoIGRhdGEg
c291cmNlLCBmb3IgZWFjaCBpbnN0YW5jZSwgZm9yIGVhY2ggdGhyZWFkIHdlIGtlZXAgb25lCisv
LyBUcmFjZVdyaXRlci4KKy8vIFRoZSBsb29rdXAgaXMgTygxKTogR2l2ZW4gdGhlIFRMUyBvYmpl
Y3QsIHRoZSBUcmFjZVdyaXRlciBpcyBqdXN0IHRsc1tNXVtOXS4KK2NsYXNzIFRyYWNpbmdUTFMg
OiBwdWJsaWMgUGxhdGZvcm06OlRocmVhZExvY2FsT2JqZWN0IHsKKyBwdWJsaWM6CisgIH5UcmFj
aW5nVExTKCkgb3ZlcnJpZGU7CisKKyAgLy8gVGhpcyBpcyBjaGVja2VkIGFnYWluc3QgVHJhY2VN
dXhlckltcGwncyBnbG9iYWwgZ2VuZXJhdGlvbiBjb3VudGVyIHRvCisgIC8vIGhhbmRsZSBkZXN0
cnVjdGlvbiBvZiBUcmFjZVdyaXRlcihzKSB0aGF0IGJlbG9uZyB0byBkYXRhIHNvdXJjZXMgdGhh
dAorICAvLyBoYXZlIGJlZW4gc3RvcHBlZC4gV2hlbiB0aGUgdHdvIG51bWJlcnMgZGl2ZXJnZSwg
YSBzY2FuIG9mIGFsbCB0aGUKKyAgLy8gdGhyZWFkLWxvY2FsIFRyYWNlV3JpdGVyKHMpIGlzIGlz
c3VlZC4KKyAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisKKyAgLy8gQnkgZGVmYXVsdCBhbGwg
ZGF0YSBzb3VyY2UgaW5zdGFuY2VzIGhhdmUgaW5kZXBlbmRlbnQgdGhyZWFkLWxvY2FsIHN0YXRl
CisgIC8vIChzZWUgYWJvdmUpLgorICBzdGQ6OmFycmF5PERhdGFTb3VyY2VUaHJlYWRMb2NhbFN0
YXRlLCBrTWF4RGF0YVNvdXJjZXM+IGRhdGFfc291cmNlc190bHN7fTsKKworICAvLyBUcmFjayBl
dmVudCBkYXRhIHNvdXJjZXMsIGhvd2V2ZXIsIHNoYXJlIHRoZSBzYW1lIHRocmVhZC1sb2NhbCBz
dGF0ZSBpbgorICAvLyBvcmRlciB0byBiZSBhYmxlIHRvIHNoYXJlIHRyYWNlIHdyaXRlcnMgYW5k
IGludGVybmluZyBzdGF0ZSBhY3Jvc3MgYWxsCisgIC8vIHRyYWNrIGV2ZW50IGNhdGVnb3JpZXMu
CisgIERhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlIHRyYWNrX2V2ZW50X3Rsc3t9OworfTsKKwor
fSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2Vu
ZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfVFJBQ0lOR19UTFNfSF8K
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVj
dAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAg
KHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4g
Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9m
IHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5z
ZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg
b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0
aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9V
VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y
IGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBn
b3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z
ZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9UUkFD
SU5HX01VWEVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9U
UkFDSU5HX01VWEVSX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bWVtb3J5Pgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4
cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
dHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvYmFzaWNfdHlwZXMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50
ZXJuYWwvdHJhY2luZ190bHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3RyYWNpbmcvcGxhdGZvcm0uaCIKK25hbWVzcGFjZSBwZXJmZXR0byB7CisK
K2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgVHJhY2VXcml0ZXJCYXNlOworc3RydWN0IFRy
YWNpbmdJbml0QXJnczsKK2NsYXNzIFRyYWNpbmdTZXNzaW9uOworCituYW1lc3BhY2UgaW50ZXJu
YWwgeworCitzdHJ1Y3QgRGF0YVNvdXJjZVN0YXRpY1N0YXRlOworCisvLyBUaGlzIGNsYXNzIGFj
dHMgYXMgYSBicmlkZ2UgYmV0d2VlbiB0aGUgcHVibGljIEFQSSBtZXRob2RzIGFuZCB0aGUKKy8v
IFRyYWNpbmdCYWNrZW5kKHMpLiBJdCBleHBvc2VzIGEgc2ltcGxpZmllZCB2aWV3IG9mIHRoZSB3
b3JsZCB0byB0aGUgQVBJCisvLyBtZXRob2RzLCBzbyB0aGF0IHRoZXkgZG9uJ3QgaGF2ZSB0byBj
YXJlIGFib3V0IHRoZSBtdWx0aXBsaWNpdHkgb2YgYmFja2VuZHMuCisvLyBJdCBoYW5kbGVzIGFs
bCB0aGUgYm9va2tlZXBpbmcgdG8gbWFwIGRhdGEgc291cmNlIGluc3RhbmNlcyBhbmQgdHJhY2Ug
d3JpdGVycworLy8gdG8gdGhlIHZhcmlvdXMgYmFja2VuZHMuCisvLyBTZWUgdHJhY2luZ19tdXhl
cl9pbXBsLmggZm9yIHRoZSBmdWxsIHBpY3R1cmUuIFRoaXMgY2xhc3MgY29udGFpbnMgb25seSB0
aGUKKy8vIGZld2VyIGZpZWxkcyBhbmQgbWV0aG9kcyB0aGF0IG5lZWQgdG8gYmUgZXhwb3NlZCB0
byBwdWJsaWMvIGhlYWRlcnMuIEZpZWxkcworLy8gYW5kIG1ldGhvZHMgdGhhdCBhcmUgcmVxdWly
ZWQgdG8gaW1wbGVtZW50IHRoZW0gc2hvdWxkIGdvIGludG8KKy8vIHNyYy90cmFjaW5nL2ludGVy
bmFsL3RyYWNpbmdfbXV4ZXJfaW1wbC5oIGluc3RlYWQ6IHRoYXQgb25lIGNhbiBwdWxsIGluCisv
LyBwZXJmZXR0byBoZWFkZXJzIG91dHNpZGUgb2YgcHVibGljLCB0aGlzIG9uZSBjYW5ub3QuCitj
bGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2luZ011eGVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBU
cmFjaW5nTXV4ZXIqIEdldCgpIHsgcmV0dXJuIGluc3RhbmNlXzsgfQorCisgIHZpcnR1YWwgflRy
YWNpbmdNdXhlcigpOworCisgIFRyYWNpbmdUTFMqIEdldE9yQ3JlYXRlVHJhY2luZ1RMUygpIHsK
KyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJhY2luZ1RMUyo+KHBsYXRmb3JtXy0+R2V0T3JDcmVh
dGVUaHJlYWRMb2NhbE9iamVjdCgpKTsKKyAgfQorCisgIC8vIFRoaXMgbWV0aG9kIGNhbiBmYWls
IGFuZCByZXR1cm4gZmFsc2UgaWYgdHJ5aW5nIHRvIHJlZ2lzdGVyIG1vcmUgdGhhbgorICAvLyBr
TWF4RGF0YVNvdXJjZXMgdHlwZXMuCisgIHVzaW5nIERhdGFTb3VyY2VGYWN0b3J5ID0gc3RkOjpm
dW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8RGF0YVNvdXJjZUJhc2U+KCk+OworICB2aXJ0dWFsIGJv
b2wgUmVnaXN0ZXJEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9yJiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlRmFjdG9yeSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlU3RhdGljU3RhdGUqKSA9IDA7CisK
KyAgLy8gSXQgaWRlbnRpZmllcyB0aGUgcmlnaHQgYmFja2VuZCBhbmQgZm9yd2FyZHMgdGhlIGNh
bGwgdG8gaXQuCisgIC8vIFRoZSByZXR1cm5lZCBUcmFjZVdyaXRlciBtdXN0IGJlIHVzZWQgd2l0
aGluIHRoZSBzYW1lIHNlcXVlbmNlIChmb3IgbW9zdAorICAvLyBwcm9qZWN0cyB0aGlzIG1lYW5z
ICJzYW1lIHRocmVhZCIpLiBBbHRlcm5hdGl2ZWx5IHRoZSBjbGllbnQgbmVlZHMgdG8gdGFrZQor
ICAvLyBjYXJlIG9mIHVzaW5nIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIHRvIHByZXZlbnQg
Y29uY3VycmVudCBhY2Nlc3Nlcy4KKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8VHJhY2VXcml0
ZXJCYXNlPiBDcmVhdGVUcmFjZVdyaXRlcigKKyAgICAgIERhdGFTb3VyY2VTdGF0ZSosCisgICAg
ICBCdWZmZXJFeGhhdXN0ZWRQb2xpY3kgYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3kpID0gMDsKKwor
ICB2aXJ0dWFsIHZvaWQgRGVzdHJveVN0b3BwZWRUcmFjZVdyaXRlcnNGb3JDdXJyZW50VGhyZWFk
KCkgPSAwOworCisgIHVpbnQzMl90IGdlbmVyYXRpb24oc3RkOjptZW1vcnlfb3JkZXIgb3JkKSB7
IHJldHVybiBnZW5lcmF0aW9uXy5sb2FkKG9yZCk7IH0KKworIHByb3RlY3RlZDoKKyAgZXhwbGlj
aXQgVHJhY2luZ011eGVyKFBsYXRmb3JtKiBwbGF0Zm9ybSkgOiBwbGF0Zm9ybV8ocGxhdGZvcm0p
IHt9CisKKyAgc3RhdGljIFRyYWNpbmdNdXhlciogaW5zdGFuY2VfOworICBQbGF0Zm9ybSogY29u
c3QgcGxhdGZvcm1fID0gbnVsbHB0cjsKKworICAvLyBJbmNyZW1lbnRlZCBldmVyeSB0aW1lIGEg
ZGF0YSBzb3VyY2UgaXMgZGVzdHJveWVkLiBTZWUgdHJhY2luZ190bHMuaC4KKyAgc3RkOjphdG9t
aWM8dWludDMyX3Q+IGdlbmVyYXRpb25fe307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJu
YWwKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVU
VE9fVFJBQ0lOR19JTlRFUk5BTF9UUkFDSU5HX01VWEVSX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvbG9ja2VkX2hhbmRsZS5oCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfTE9DS0VEX0hBTkRMRV9I
XworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfTE9DS0VEX0hBTkRMRV9IXworCisj
aW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIFRoaXMgaXMgdXNl
ZCBmb3IgR2V0RGF0YVNvdXJjZUxvY2tlZCgpLCBpbiB0aGUgKHJhcmUpIGNhc2Ugd2hlcmUgdGhl
CisvLyB0cmFjaW5nIGNvZGUgd2FudHMgdG8gYWNjZXNzIHRoZSBzdGF0ZSBvZiBpdHMgZGF0YSBz
b3VyY2UgZnJvbSB0aGUgVHJhY2UoKQorLy8gbWV0aG9kLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+
CitjbGFzcyBMb2NrZWRIYW5kbGUgeworIHB1YmxpYzoKKyAgTG9ja2VkSGFuZGxlKHN0ZDo6cmVj
dXJzaXZlX211dGV4KiBtdHgsIFQqIG9iaikgOiBsb2NrXygqbXR4KSwgb2JqXyhvYmopIHt9Cisg
IExvY2tlZEhhbmRsZSgpID0gZGVmYXVsdDsgIC8vIEZvciB0aGUgaW52YWxpZCBjYXNlLgorICBM
b2NrZWRIYW5kbGUoTG9ja2VkSGFuZGxlJiYpID0gZGVmYXVsdDsKKyAgTG9ja2VkSGFuZGxlJiBv
cGVyYXRvcj0oTG9ja2VkSGFuZGxlJiYpID0gZGVmYXVsdDsKKworICBib29sIHZhbGlkKCkgY29u
c3QgeyByZXR1cm4gb2JqXzsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyBy
ZXR1cm4gdmFsaWQoKTsgfQorCisgIFQqIG9wZXJhdG9yLT4oKSB7CisgICAgYXNzZXJ0KHZhbGlk
KCkpOworICAgIHJldHVybiBvYmpfOworICB9CisKKyAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4g
Kih0aGlzLT5vcGVyYXRvci0+KCkpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9sb2Nr
PHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrXzsKKyAgVCogb2JqXyA9IG51bGxwdHI7Cit9Owor
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRP
X1RSQUNJTkdfTE9DS0VEX0hBTkRMRV9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUg
QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFw
YWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5v
dCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisg
KiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0
dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBy
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
cmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu
ICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBB
TlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBm
b3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxp
bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJG
RVRUT19UUkFDSU5HX0RBVEFfU09VUkNFX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJB
Q0lOR19EQVRBX1NPVVJDRV9IXworCisvLyBUaGlzIGhlYWRlciBjb250YWlucyB0aGUga2V5IGNs
YXNzIChEYXRhU291cmNlKSB0aGF0IGEgcHJvZHVjZXIgYXBwIHNob3VsZAorLy8gb3ZlcnJpZGUg
aW4gb3JkZXIgdG8gY3JlYXRlIGEgY3VzdG9tIGRhdGEgc291cmNlIHRoYXQgZ2V0cyB0cmFjaW5n
IFN0YXJ0L1N0b3AKKy8vIG5vdGlmaWNhdGlvbnMgYW5kIGVtaXRzIHRyYWNpbmcgZGF0YS4KKwor
I2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlu
dC5oPgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGZ1
bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZp
Zy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFz
ZS9jb21waWxlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZV9oYW5kbGUuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvYnVm
ZmVyX2V4aGF1c3RlZF9wb2xpY3kuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL2Jh
c2ljX3R5cGVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by90cmFjaW5nL2ludGVybmFsL2RhdGFfc291cmNlX2ludGVybmFsLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3Ry
YWNpbmdfbXV4ZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3RyYWNpbmcvbG9ja2VkX2hhbmRsZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjZV93cml0ZXJfYmFzZS5oIgorCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJh
Y2UvdHJhY2VfcGFja2V0LnBiemVyby5oIgorCisvLyBQRVJGRVRUT19DT01QT05FTlRfRVhQT1JU
IGlzIHVzZWQgdG8gbWFyayBzeW1ib2xzIGluIFBlcmZldHRvJ3MgaGVhZGVycworLy8gKHR5cGlj
YWxseSB0ZW1wbGF0ZXMpIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIHVzZXIgb3V0c2lkZSBvZiBQ
ZXJmZXR0byBhbmQKKy8vIHNob3VsZCBiZSBtYWRlIHZpc2libGUgb3V0c2lkZSB0aGUgY3VycmVu
dCBtb2R1bGUuIChlLmcuLCBpbiBDaHJvbWUncworLy8gY29tcG9uZW50IGJ1aWxkKS4KKyNpZiAh
ZGVmaW5lZChQRVJGRVRUT19DT01QT05FTlRfRVhQT1JUKQorI2RlZmluZSBQRVJGRVRUT19DT01Q
T05FTlRfRVhQT1JUCisjZW5kaWYKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBp
bnRlcm5hbCB7CitjbGFzcyBUcmFjaW5nTXV4ZXJJbXBsOworY2xhc3MgVHJhY2tFdmVudENhdGVn
b3J5UmVnaXN0cnk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUsIGNvbnN0IGludGVybmFsOjpUcmFja0V2
ZW50Q2F0ZWdvcnlSZWdpc3RyeSo+CitjbGFzcyBUcmFja0V2ZW50RGF0YVNvdXJjZTsKK30gIC8v
IG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBCYXNlIGNsYXNzIHdpdGggdGhlIHZpcnR1YWwgbWV0
aG9kcyB0byBnZXQgc3RhcnQvc3RvcCBub3RpZmljYXRpb25zLgorLy8gRW1iZWRkZXJzIGFyZSBz
dXBwb3NlZCB0byBkZXJpdmUgdGhlIHRlbXBsYXRlZCB2ZXJzaW9uIGJlbG93LCBub3QgdGhpcyBv
bmUuCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgRGF0YVNvdXJjZUJhc2UgeworIHB1YmxpYzoKKyAg
dmlydHVhbCB+RGF0YVNvdXJjZUJhc2UoKTsKKworICAvLyBUT0RPKHByaW1pYW5vKTogY2hhbmdl
IHRoZSBjb25zdCYgYXJncyBiZWxvdyB0byBiZSBwb2ludGVycyBpbnN0ZWFkLiBJdAorICAvLyBt
YWtlcyBpdCBtb3JlIGF3a3dhcmQgdG8gaGFuZGxlIG91dHB1dCBhcmd1bWVudHMgYW5kIHJlcXVp
cmUgbXV0YWJsZShzKS4KKyAgLy8gVGhpcyByZXF1aXJlcyBzeW5jaHJvbml6aW5nIGEgYnJlYWtp
bmcgQVBJIGNoYW5nZSBmb3IgZXhpc3RpbmcgZW1iZWRkZXJzLgorCisgIC8vIE9uU2V0dXAoKSBp
cyBpbnZva2VkIHdoZW4gdHJhY2luZyBpcyBjb25maWd1cmVkLiBJbiBtb3N0IGNhc2VzIHRoaXMg
aGFwcGVucworICAvLyBqdXN0IGJlZm9yZSBzdGFydGluZyB0aGUgdHJhY2UuIEluIHRoZSBjYXNl
IG9mIGRlZmVycmVkIHN0YXJ0IChzZWUKKyAgLy8gZGVmZXJyZWRfc3RhcnQgaW4gdHJhY2VfY29u
ZmlnLnByb3RvKSBzdGFydCBtaWdodCBoYXBwZW4gbGF0ZXIuCisgIGNsYXNzIFNldHVwQXJncyB7
CisgICBwdWJsaWM6CisgICAgLy8gVGhpcyBpcyB2YWxpZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUg
b2YgdGhlIE9uU2V0dXAoKSBjYWxsIGFuZCBtdXN0IG5vdAorICAgIC8vIGJlIHJldGFpbmVkLgor
ICAgIGNvbnN0IERhdGFTb3VyY2VDb25maWcqIGNvbmZpZyA9IG51bGxwdHI7CisKKyAgICAvLyBU
aGUgaW5kZXggb2YgdGhpcyBkYXRhIHNvdXJjZSBpbnN0YW5jZSAoMC4ua01heERhdGFTb3VyY2VJ
bnN0YW5jZXMgLSAxKS4KKyAgICB1aW50MzJfdCBpbnRlcm5hbF9pbnN0YW5jZV9pbmRleCA9IDA7
CisgIH07CisgIHZpcnR1YWwgdm9pZCBPblNldHVwKGNvbnN0IFNldHVwQXJncyYpOworCisgIGNs
YXNzIFN0YXJ0QXJncyB7CisgICBwdWJsaWM6CisgICAgLy8gVGhlIGluZGV4IG9mIHRoaXMgZGF0
YSBzb3VyY2UgaW5zdGFuY2UgKDAuLmtNYXhEYXRhU291cmNlSW5zdGFuY2VzIC0gMSkuCisgICAg
dWludDMyX3QgaW50ZXJuYWxfaW5zdGFuY2VfaW5kZXggPSAwOworICB9OworICB2aXJ0dWFsIHZv
aWQgT25TdGFydChjb25zdCBTdGFydEFyZ3MmKTsKKworICBjbGFzcyBTdG9wQXJncyB7CisgICBw
dWJsaWM6CisgICAgdmlydHVhbCB+U3RvcEFyZ3MoKTsKKworICAgIC8vIEhhbmRsZUFzeW5jaHJv
bm91c2x5KCkgY2FuIG9wdGlvbmFsbHkgYmUgY2FsbGVkIHRvIGRlZmVyIHRoZSB0cmFjaW5nCisg
ICAgLy8gc2Vzc2lvbiBzdG9wIGFuZCB3cml0ZSB0cmFjaW5nIGRhdGEganVzdCBiZWZvcmUgc3Rv
cHBpbmcuCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY2xvc3VyZSB0aGF0IG11c3Qg
YmUgaW52b2tlZCBhZnRlciB0aGUgbGFzdAorICAgIC8vIHRyYWNlIGV2ZW50cyBoYXZlIGJlZW4g
ZW1pdHRlZC4gVGhlIHJldHVybmVkIGNsb3N1cmUgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgLy8g
YW55IHRocmVhZC4gVGhlIGNhbGxlciBhbHNvIG5lZWRzIHRvIGV4cGxpY2l0bHkgY2FsbCBUcmFj
ZUNvbnRleHQuRmx1c2goKQorICAgIC8vIGZyb20gdGhlIGxhc3QgVHJhY2UoKSBsYW1iZGEgaW52
b2NhdGlvbiBiZWNhdXNlIG5vIG90aGVyIGltcGxpY2l0IGZsdXNoZXMKKyAgICAvLyB3aWxsIGhh
cHBlbiBhZnRlciB0aGUgc3RvcCBzaWduYWwuCisgICAgLy8gV2hlbiB0aGlzIGZ1bmN0aW9uIGlz
IGNhbGxlZCwgdGhlIHRyYWNpbmcgc2VydmljZSB3aWxsIGRlZmVyIHRoZSBzdG9wIG9mCisgICAg
Ly8gdGhlIHRyYWNpbmcgc2Vzc2lvbiB1bnRpbCB0aGUgcmV0dXJuZWQgY2xvc3VyZSBpcyBpbnZv
a2VkLgorICAgIC8vIEhvd2V2ZXIsIHRoZSBjYWxsZXIgY2Fubm90IGhhbmcgb250byB0aGlzIGNs
b3N1cmUgZm9yIHRvbyBsb25nLiBUaGUKKyAgICAvLyB0cmFjaW5nIHNlcnZpY2Ugd2lsbCBmb3Jj
ZWZ1bGx5IHN0b3AgdGhlIHRyYWNpbmcgc2Vzc2lvbiB3aXRob3V0IHdhaXRpbmcKKyAgICAvLyBm
b3IgcGVuZGluZyBwcm9kdWNlcnMgYWZ0ZXIgVHJhY2VDb25maWcuZGF0YV9zb3VyY2Vfc3RvcF90
aW1lb3V0X21zCisgICAgLy8gKGRlZmF1bHQ6IDVzLCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBDb25z
dW1lcnMgd2hlbiBzdGFydGluZyBhIHRyYWNlKS4KKyAgICAvLyBJZiB0aGUgY2xvc3VyZSBpcyBj
YWxsZWQgYWZ0ZXIgdGhpcyB0aW1lb3V0IGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkIGFuZAorICAg
IC8vIHRoZSB0cmFjZSBkYXRhIGVtaXR0ZWQgd2lsbCBub3QgYmUgcHJlc2VudCBpbiB0aGUgdHJh
Y2UuIE5vIG90aGVyCisgICAgLy8gZnVuY3Rpb25hbCBzaWRlIGVmZmVjdHMgKGUuZy4gY3Jhc2hl
cyBvciBjb3JydXB0aW9ucykgd2lsbCBoYXBwZW4uIEluCisgICAgLy8gb3RoZXIgd29yZHMsIGl0
IGlzIGZpbmUgdG8gYWNjaWRlbnRhbGx5IGhvbGQgb250byB0aGlzIGNsb3N1cmUgZm9yIHRvbwor
ICAgIC8vIGxvbmcgYnV0LCBpZiB0aGF0IGhhcHBlbnMsIHNvbWUgdHJhY2luZyBkYXRhIHdpbGwg
YmUgbG9zdC4KKyAgICB2aXJ0dWFsIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBIYW5kbGVTdG9wQXN5
bmNocm9ub3VzbHkoKSBjb25zdCA9IDA7CisKKyAgICAvLyBUaGUgaW5kZXggb2YgdGhpcyBkYXRh
IHNvdXJjZSBpbnN0YW5jZSAoMC4ua01heERhdGFTb3VyY2VJbnN0YW5jZXMgLSAxKS4KKyAgICB1
aW50MzJfdCBpbnRlcm5hbF9pbnN0YW5jZV9pbmRleCA9IDA7CisgIH07CisgIHZpcnR1YWwgdm9p
ZCBPblN0b3AoY29uc3QgU3RvcEFyZ3MmKTsKK307CisKK3N0cnVjdCBEZWZhdWx0RGF0YVNvdXJj
ZVRyYWl0cyB7CisgIC8vIHxJbmNyZW1lbnRhbFN0YXRlVHlwZXwgY2FuIG9wdGlvbmFsbHkgYmUg
dXNlZCBzdG9yZSBjdXN0b20gcGVyLXNlcXVlbmNlCisgIC8vIGluY3JlbWVudGFsIGRhdGEgKGUu
Zy4sIGludGVybmluZyB0YWJsZXMpLiBJdCBzaG91bGQgaGF2ZSBhIENsZWFyKCkgbWV0aG9kCisg
IC8vIGZvciB3aGVuIGluY3JlbWVudGFsIHN0YXRlIG5lZWRzIHRvIGJlIGNsZWFyZWQuIFNlZQor
ICAvLyBUcmFjZUNvbnRleHQ6OkdldEluY3JlbWVudGFsU3RhdGUoKS4KKyAgdXNpbmcgSW5jcmVt
ZW50YWxTdGF0ZVR5cGUgPSB2b2lkOworCisgIC8vIEFsbG93cyBvdmVycmlkaW5nIHdoYXQgdHlw
ZSBvZiB0aHJlYWQtbG9jYWwgc3RhdGUgY29uZmlndXJhdGlvbiB0aGUgZGF0YQorICAvLyBzb3Vy
Y2UgdXNlcy4gQnkgZGVmYXVsdCBldmVyeSBkYXRhIHNvdXJjZSBnZXRzIGluZGVwZW5kZW50IHRo
cmVhZC1sb2NhbAorICAvLyBzdGF0ZSwgd2hpY2ggbWVhbnMgZXZlcnkgaW5zdGFuY2UgdXNlcyBz
ZXBhcmF0ZSB0cmFjZSB3cml0ZXJzIGFuZAorICAvLyBpbmNyZW1lbnRhbCBzdGF0ZSBldmVuIG9u
IHRoZSBzYW1lIHRocmVhZC4gU29tZSBkYXRhIHNvdXJjZXMgKG1vc3Qgbm90YWJseQorICAvLyB0
aGUgdHJhY2sgZXZlbnQgZGF0YSBzb3VyY2UpIHdhbnQgdG8gc2hhcmUgdHJhY2Ugd3JpdGVycyBh
bmQgaW5jcmVtZW50YWwKKyAgLy8gc3RhdGUgb24gdGhlIHNhbWUgdGhyZWFkLgorICBzdGF0aWMg
aW50ZXJuYWw6OkRhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlKiBHZXREYXRhU291cmNlVExTKAor
ICAgICAgaW50ZXJuYWw6OkRhdGFTb3VyY2VTdGF0aWNTdGF0ZSogc3RhdGljX3N0YXRlLAorICAg
ICAgaW50ZXJuYWw6OlRyYWNpbmdUTFMqIHJvb3RfdGxzKSB7CisgICAgYXV0byogZHNfdGxzID0g
JnJvb3RfdGxzLT5kYXRhX3NvdXJjZXNfdGxzW3N0YXRpY19zdGF0ZS0+aW5kZXhdOworICAgIC8v
IFRoZSBwZXItdHlwZSBUTFMgaXMgZWl0aGVyIHplcm8taW5pdGlhbGl6ZWQgb3IgbXVzdCBoYXZl
IGJlZW4gaW5pdGlhbGl6ZWQKKyAgICAvLyBmb3IgdGhpcyBzcGVjaWZpYyBkYXRhIHNvdXJjZSB0
eXBlLgorICAgIGFzc2VydCghZHNfdGxzLT5zdGF0aWNfc3RhdGUgfHwKKyAgICAgICAgICAgZHNf
dGxzLT5zdGF0aWNfc3RhdGUtPmluZGV4ID09IHN0YXRpY19zdGF0ZS0+aW5kZXgpOworICAgIHJl
dHVybiBkc190bHM7CisgIH0KK307CisKKy8vIFRlbXBsYXRlZCBiYXNlIGNsYXNzIG1lYW50IHRv
IGJlIGRlcml2ZWQgYnkgZW1iZWRkZXJzIHRvIGNyZWF0ZSBhIGN1c3RvbSBkYXRhCisvLyBzb3Vy
Y2UuIERhdGFTb3VyY2VUeXBlIG11c3QgYmUgdGhlIHR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mg
aXRzZWxmLCBlLmcuOgorLy8gY2xhc3MgTXlEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VC
YXNlPE15RGF0YVNvdXJjZT4gey4uLn0uCisvLworLy8gfERhdGFTb3VyY2VUcmFpdHN8IGFsbG93
cyBjdXN0b21pemluZyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhdGEgc291cmNlLiBTZWUKKy8vIHxE
ZWZhdWx0RGF0YVNvdXJjZVRyYWl0c3wuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVNvdXJjZVR5
cGUsCisgICAgICAgICAgdHlwZW5hbWUgRGF0YVNvdXJjZVRyYWl0cyA9IERlZmF1bHREYXRhU291
cmNlVHJhaXRzPgorY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7Cisg
IHN0cnVjdCBEZWZhdWx0VHJhY2VQb2ludFRyYWl0czsKKworIHB1YmxpYzoKKyAgLy8gVGhlIEJ1
ZmZlckV4aGF1c3RlZFBvbGljeSB0byB1c2UgZm9yIFRyYWNlV3JpdGVycyBvZiB0aGlzIERhdGFT
b3VyY2UuCisgIC8vIE92ZXJyaWRlIHRoaXMgaW4geW91ciBEYXRhU291cmNlIGNsYXNzIHRvIGNo
YW5nZSB0aGUgZGVmYXVsdCwgd2hpY2ggaXMgdG8KKyAgLy8gZHJvcCBkYXRhIG9uIHNoYXJlZCBt
ZW1vcnkgb3ZlcnJ1bnMuCisgIGNvbnN0ZXhwciBzdGF0aWMgQnVmZmVyRXhoYXVzdGVkUG9saWN5
IGtCdWZmZXJFeGhhdXN0ZWRQb2xpY3kgPQorICAgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5Ojpr
RHJvcDsKKworICAvLyBBcmd1bWVudCBwYXNzZWQgdG8gdGhlIGxhbWJkYSBmdW5jdGlvbiBwYXNz
ZWQgdG8gVHJhY2UoKSAoYmVsb3cpLgorICBjbGFzcyBUcmFjZUNvbnRleHQgeworICAgcHVibGlj
OgorICAgIHVzaW5nIFRyYWNlUGFja2V0SGFuZGxlID0KKyAgICAgICAgOjpwcm90b3plcm86Ok1l
c3NhZ2VIYW5kbGU8OjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0PjsKKwor
ICAgIFRyYWNlQ29udGV4dChUcmFjZUNvbnRleHQmJikgbm9leGNlcHQgPSBkZWZhdWx0OworICAg
IH5UcmFjZUNvbnRleHQoKSA9IGRlZmF1bHQ7CisKKyAgICBUcmFjZVBhY2tldEhhbmRsZSBOZXdU
cmFjZVBhY2tldCgpIHsKKyAgICAgIHJldHVybiB0bHNfaW5zdF8tPnRyYWNlX3dyaXRlci0+TmV3
VHJhY2VQYWNrZXQoKTsKKyAgICB9CisKKyAgICAvLyBGb3JjZXMgYSBjb21taXQgb2YgdGhlIHRo
cmVhZC1sb2NhbCB0cmFjaW5nIGRhdGEgd3JpdHRlbiBzbyBmYXIgdG8gdGhlCisgICAgLy8gc2Vy
dmljZS4gVGhpcyBpcyBhbG1vc3QgbmV2ZXIgcmVxdWlyZWQgKHRyYWNpbmcgZGF0YSBpcyBwZXJp
b2RpY2FsbHkKKyAgICAvLyBjb21taXR0ZWQgYXMgdHJhY2UgcGFnZXMgYXJlIGZpbGxlZCB1cCkg
YW5kIGhhcyBhIG5vbi1uZWdsaWdpYmxlCisgICAgLy8gcGVyZm9ybWFuY2UgaGl0IChyZXF1aXJl
cyBhbiBJUEMgKyByZWZyZXNoIG9mIHRoZSBjdXJyZW50IHRocmVhZC1sb2NhbAorICAgIC8vIGNo
dW5rKS4gVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgc2hvdWxkIGJlIHVzZWQgaXMgd2hlbiBoYW5k
bGluZyBPblN0b3AoKQorICAgIC8vIGFzeW5jaHJvbm91c2x5LCB0byBlbnN1cmUgc3VyZSB0aGF0
IHRoZSBkYXRhIGlzIGNvbW1pdHRlZCBiZWZvcmUgdGhlCisgICAgLy8gU3RvcCB0aW1lb3V0IGV4
cGlyZXMuCisgICAgLy8gVGhlIFRyYWNlUGFja2V0SGFuZGxlIG9idGFpbmVkIGJ5IHRoZSBsYXN0
IE5ld1RyYWNlUGFja2V0KCkgY2FsbCBtdXN0IGJlCisgICAgLy8gZmluYWxpemVkIGJlZm9yZSBj
YWxsaW5nIEZsdXNoKCkgKGVpdGhlciBpbXBsaWNpdGx5IGJ5IGdvaW5nIG91dCBvZiBzY29wZQor
ICAgIC8vIG9yIGJ5IGV4cGxpY2l0bHkgY2FsbGluZyBGaW5hbGl6ZSgpKS4KKyAgICAvLyB8Y2J8
IGlzIGFuIG9wdGlvbmFsIGNhbGxiYWNrLiBXaGVuIG5vbi1udWxsIGl0IHdpbGwgcmVxdWVzdCB0
aGUKKyAgICAvLyBzZXJ2aWNlIHRvIEFDSyB0aGUgZmx1c2ggYW5kIHdpbGwgYmUgaW52b2tlZCBv
biBhbiBpbnRlcm5hbCB0aHJlYWQgYWZ0ZXIKKyAgICAvLyB0aGUgc2VydmljZSBoYXMgIGFja25v
d2xlZGdlZCBpdC4gVGhlIGNhbGxiYWNrIG1pZ2h0IGJlIE5FVkVSIElOVk9LRUQgaWYKKyAgICAv
LyB0aGUgc2VydmljZSBjcmFzaGVzIG9yIHRoZSBJUEMgY29ubmVjdGlvbiBpcyBkcm9wcGVkLgor
ICAgIHZvaWQgRmx1c2goc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNiID0ge30pIHsKKyAgICAgIHRs
c19pbnN0Xy0+dHJhY2Vfd3JpdGVyLT5GbHVzaChjYik7CisgICAgfQorCisgICAgLy8gUmV0dXJu
cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb24gdGhlIGN1cnJlbnQgdGhyZWFkIGJ5IHRo
ZSBjdXJyZW50CisgICAgLy8gZGF0YS1zb3VyY2Ugc2luY2UgaXRzIGNyZWF0aW9uLgorICAgIC8v
IFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igc3BsaXR0aW5nIHByb3RvcyB0aGF0IG1pZ2h0IGdyb3cg
dmVyeSBsYXJnZS4KKyAgICB1aW50NjRfdCB3cml0dGVuKCkgeyByZXR1cm4gdGxzX2luc3RfLT50
cmFjZV93cml0ZXItPndyaXR0ZW4oKTsgfQorCisgICAgLy8gUmV0dXJucyBhIFJBSUkgaGFuZGxl
IHRvIGFjY2VzcyB0aGUgZGF0YSBzb3VyY2UgaW5zdGFuY2UsIGd1YXJhbnRlZWluZworICAgIC8v
IHRoYXQgaXQgd29uJ3QgYmUgZGVsZXRlZCBvbiBhbm90aGVyIHRocmVhZCAoYmVjYXVzZSBvZiB0
cmFjZSBzdG9wcGluZykKKyAgICAvLyB3aGlsZSBhY2Nlc3NpbmcgaXQgZnJvbSB3aXRoaW4gdGhl
IFRyYWNlKCkgbGFtYmRhLgorICAgIC8vIFRoZSByZXR1cm5lZCBoYW5kbGUgY2FuIGJlIGludmFs
aWQgKG51bGxwdHIpIGlmIHRyYWNpbmcgaXMgc3RvcHBlZAorICAgIC8vIGltbWVkaWF0ZWx5IGJl
Zm9yZSBjYWxsaW5nIHRoaXMuIFRoZSBjYWxsZXIgaXMgc3VwcG9zZWQgdG8gY2hlY2sgZm9yIGl0
cworICAgIC8vIHZhbGlkaXR5IGJlZm9yZSB1c2luZyBpdC4gQWZ0ZXIgY2hlY2tpbmcsIHRoZSBo
YW5kbGUgaXMgZ3VhcmFudGVlZCB0bworICAgIC8vIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFu
ZGxlIGdvZXMgb3V0IG9mIHNjb3BlLgorICAgIExvY2tlZEhhbmRsZTxEYXRhU291cmNlVHlwZT4g
R2V0RGF0YVNvdXJjZUxvY2tlZCgpIHsKKyAgICAgIGF1dG8qIGludGVybmFsX3N0YXRlID0gc3Rh
dGljX3N0YXRlXy5UcnlHZXQoaW5zdGFuY2VfaW5kZXhfKTsKKyAgICAgIGlmICghaW50ZXJuYWxf
c3RhdGUpCisgICAgICAgIHJldHVybiBMb2NrZWRIYW5kbGU8RGF0YVNvdXJjZVR5cGU+KCk7Cisg
ICAgICByZXR1cm4gTG9ja2VkSGFuZGxlPERhdGFTb3VyY2VUeXBlPigKKyAgICAgICAgICAmaW50
ZXJuYWxfc3RhdGUtPmxvY2ssCisgICAgICAgICAgc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZVR5cGUq
PihpbnRlcm5hbF9zdGF0ZS0+ZGF0YV9zb3VyY2UuZ2V0KCkpKTsKKyAgICB9CisKKyAgICB0eXBl
bmFtZSBEYXRhU291cmNlVHJhaXRzOjpJbmNyZW1lbnRhbFN0YXRlVHlwZSogR2V0SW5jcmVtZW50
YWxTdGF0ZSgpIHsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIERhdGFT
b3VyY2VUcmFpdHM6OkluY3JlbWVudGFsU3RhdGVUeXBlKj4oCisgICAgICAgICAgdGxzX2luc3Rf
LT5pbmNyZW1lbnRhbF9zdGF0ZS5nZXQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGZy
aWVuZCBjbGFzcyBEYXRhU291cmNlOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgY29uc3QgaW50
ZXJuYWw6OlRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5Kj4KKyAgICBmcmllbmQgY2xhc3MgaW50
ZXJuYWw6OlRyYWNrRXZlbnREYXRhU291cmNlOworICAgIFRyYWNlQ29udGV4dChpbnRlcm5hbDo6
RGF0YVNvdXJjZUluc3RhbmNlVGhyZWFkTG9jYWxTdGF0ZSogdGxzX2luc3QsCisgICAgICAgICAg
ICAgICAgIHVpbnQzMl90IGluc3RhbmNlX2luZGV4KQorICAgICAgICA6IHRsc19pbnN0Xyh0bHNf
aW5zdCksIGluc3RhbmNlX2luZGV4XyhpbnN0YW5jZV9pbmRleCkge30KKyAgICBUcmFjZUNvbnRl
eHQoY29uc3QgVHJhY2VDb250ZXh0JikgPSBkZWxldGU7CisgICAgVHJhY2VDb250ZXh0JiBvcGVy
YXRvcj0oY29uc3QgVHJhY2VDb250ZXh0JikgPSBkZWxldGU7CisKKyAgICBpbnRlcm5hbDo6RGF0
YVNvdXJjZUluc3RhbmNlVGhyZWFkTG9jYWxTdGF0ZSogY29uc3QgdGxzX2luc3RfOworICAgIHVp
bnQzMl90IGNvbnN0IGluc3RhbmNlX2luZGV4XzsKKyAgfTsKKworICAvLyBUaGUgbWFpbiB0cmFj
aW5nIG1ldGhvZC4gVHJhY2luZyBjb2RlIHNob3VsZCBjYWxsIHRoaXMgcGFzc2luZyBhIGxhbWJk
YSBhcworICAvLyBhcmd1bWVudCwgd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTogdm9pZChU
cmFjZUNvbnRleHQpLgorICAvLyBUaGUgbGFtYmRhIHdpbGwgYmUgY2FsbGVkIHN5bmNocm9ub3Vz
bHkgKGkuZS4sIGFsd2F5cyBiZWZvcmUgVHJhY2UoKQorICAvLyByZXR1cm5zKSBvbmx5IGlmIHRy
YWNpbmcgaXMgZW5hYmxlZCBhbmQgdGhlIGRhdGEgc291cmNlIGhhcyBiZWVuIGVuYWJsZWQgaW4K
KyAgLy8gdGhlIHRyYWNpbmcgY29uZmlnLgorICAvLyBUaGUgbGFtYmRhIGNhbiBiZSBjYWxsZWQg
bW9yZSB0aGFuIG9uY2UgcGVyIFRyYWNlKCkgY2FsbCwgaW4gdGhlIGNhc2Ugb2YKKyAgLy8gY29u
Y3VycmVudCB0cmFjaW5nIHNlc3Npb25zIChvciBldmVuIGlmIHRoZSBkYXRhIHNvdXJjZSBpcyBp
bnN0YW50aWF0ZWQKKyAgLy8gdHdpY2Ugd2l0aGluIHRoZSBzYW1lIHRyYWNlIGNvbmZpZykuCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBMYW1iZGE+CisgIHN0YXRpYyB2b2lkIFRyYWNlKExhbWJkYSB0
cmFjaW5nX2ZuKSB7CisgICAgQ2FsbElmRW5hYmxlZDxEZWZhdWx0VHJhY2VQb2ludFRyYWl0cz4o
WyZ0cmFjaW5nX2ZuXSh1aW50MzJfdCBpbnN0YW5jZXMpIHsKKyAgICAgIFRyYWNlV2l0aEluc3Rh
bmNlczxEZWZhdWx0VHJhY2VQb2ludFRyYWl0cz4oaW5zdGFuY2VzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodHJhY2luZ19mbikp
OworICAgIH0pOworICB9CisKKyAgLy8gQW4gZWZmaWNpZW50IHRyYWNlIHBvaW50IGd1YXJkIGZv
ciBjaGVja2luZyBpZiB0aGlzIGRhdGEgc291cmNlIGlzIGFjdGl2ZS4KKyAgLy8gfGNhbGxiYWNr
fCBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlcmUgYXJlIGFj
dGl2ZQorICAvLyBpbnN0YW5jZXMuIEl0IGlzIGdpdmVuIGFuIGluc3RhbmNlIHN0YXRlIHBhcmFt
ZXRlciwgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZAorICAvLyB0byBUcmFjZVdpdGhJbnN0YW5jZXMo
KSB0byBhY3R1YWxseSByZWNvcmQgdHJhY2UgZGF0YS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRy
YWl0cyA9IERlZmF1bHRUcmFjZVBvaW50VHJhaXRzLCB0eXBlbmFtZSBDYWxsYmFjaz4KKyAgc3Rh
dGljIHZvaWQgQ2FsbElmRW5hYmxlZChDYWxsYmFjayBjYWxsYmFjaykgUEVSRkVUVE9fQUxXQVlT
X0lOTElORSB7CisgICAgLy8gfGluc3RhbmNlc3wgaXMgYSBwZXItY2xhc3MgYml0bWFwIHRoYXQg
dGVsbHM6CisgICAgLy8gMS4gSWYgdGhlIGRhdGEgc291cmNlIGlzIGVuYWJsZWQgYXQgYWxsLgor
ICAgIC8vIDIuIFRoZSBpbmRleCBvZiB0aGUgc2xvdCB3aXRoaW4gfHN0YXRpY19zdGF0ZV98IHRo
YXQgaG9sZHMgdGhlIGluc3RhbmNlCisgICAgLy8gICAgc3RhdGUuIEluIHR1cm4gdGhpcyBhbGxv
d3MgdG8gbWFwIHRoZSBkYXRhIHNvdXJjZSB0byB0aGUgdHJhY2luZworICAgIC8vICAgIHNlc3Np
b24gYW5kIGJ1ZmZlcnMuCisgICAgLy8gbWVtb3J5X29yZGVyX3JlbGF4ZWQgaXMgb2theSBiZWNh
dXNlOgorICAgIC8vIC0gfGluc3RhbmNlc3wgaXMgcmUtcmVhZCB3aXRoIGFuIGFjcXVpcmUgYmFy
cmllciBiZWxvdyBpZiB0aGlzIHN1Y2NlZWRzLgorICAgIC8vIC0gVGhlIGNvZGUgYmV0d2VlbiB0
aGlzIHBvaW50IGFuZCB0aGUgYWNxdWlyZS1sb2FkIGlzIGJhc2VkIG9uIHN0YXRpYworICAgIC8v
ICAgIHN0b3JhZ2Ugd2hpY2ggaGFzIGluZGVmaW5pdGUgbGlmZXRpbWUuCisgICAgdWludDMyX3Qg
aW5zdGFuY2VzID0KKyAgICAgICAgVHJhaXRzOjpHZXRBY3RpdmVJbnN0YW5jZXMoKS0+bG9hZChz
dGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICAgIC8vIFRoaXMgaXMgdGhlIHRyYWNpbmcg
ZmFzdC1wYXRoLiBCYWlsIG91dCBpbW1lZGlhdGVseSBpZiB0cmFjaW5nIGlzIG5vdAorICAgIC8v
IGVuYWJsZWQgKG9yIHRyYWNpbmcgaXMgZW5hYmxlZCBidXQgbm90IGZvciB0aGlzIGRhdGEgc291
cmNlKS4KKyAgICBpZiAoUEVSRkVUVE9fTElLRUxZKCFpbnN0YW5jZXMpKQorICAgICAgcmV0dXJu
OworICAgIGNhbGxiYWNrKGluc3RhbmNlcyk7CisgIH0KKworICAvLyBUaGUgImxvd2VyIGhhbGYi
IG9mIGEgdHJhY2UgcG9pbnQgd2hpY2ggYWN0dWFsbHkgcGVyZm9ybXMgdHJhY2luZyBhZnRlcgor
ICAvLyB0aGlzIGRhdGEgc291cmNlIGhhcyBiZWVuIGRldGVybWluZWQgdG8gYmUgYWN0aXZlLgor
ICAvLyB8aW5zdGFuY2VzfCBtdXN0IGJlIHRoZSBpbnN0YW5jZSBzdGF0ZSB2YWx1ZSByZXRyaWV2
ZWQgdGhyb3VnaAorICAvLyBDYWxsSWZFbmFibGVkKCkuCisgIC8vIHx0cmFjaW5nX2ZufCB3aWxs
IGJlIGNhbGxlZCB0byByZWNvcmQgdHJhY2UgZGF0YSBhcyBpbiBUcmFjZSgpLgorICAvLworICAv
LyBUT0RPKHByaW1pYW5vKTogYWxsIHRoZSBzdHVmZiBiZWxvdyBzaG91bGQgYmUgb3V0bGluZWQg
ZnJvbSB0aGUgdHJhY2UKKyAgLy8gcG9pbnQuIE9yIGF0IGxlYXN0IHdlIHNob3VsZCBoYXZlIHNv
bWUgY29tcGlsZS10aW1lIHRyYWl0cyBsaWtlCisgIC8vIGtPcHRpbWl6ZUJpbmFyeVNpemUgLyBr
T3B0aW1pemVUcmFjaW5nTGF0ZW5jeS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRyYWl0cyA9IERl
ZmF1bHRUcmFjZVBvaW50VHJhaXRzLCB0eXBlbmFtZSBMYW1iZGE+CisgIHN0YXRpYyB2b2lkIFRy
YWNlV2l0aEluc3RhbmNlcyh1aW50MzJfdCBpbnN0YW5jZXMsIExhbWJkYSB0cmFjaW5nX2ZuKSB7
CisgICAgUEVSRkVUVE9fRENIRUNLKGluc3RhbmNlcyk7CisgICAgY29uc3RleHByIGF1dG8ga01h
eERhdGFTb3VyY2VJbnN0YW5jZXMgPSBpbnRlcm5hbDo6a01heERhdGFTb3VyY2VJbnN0YW5jZXM7
CisKKyAgICAvLyBTZWUgdHJhY2luZ19tdXhlci5oIGZvciB0aGUgc3RydWN0dXJlIG9mIHRoZSBU
TFMuCisgICAgYXV0byogdHJhY2luZ19pbXBsID0gaW50ZXJuYWw6OlRyYWNpbmdNdXhlcjo6R2V0
KCk7CisgICAgaWYgKFBFUkZFVFRPX1VOTElLRUxZKCF0bHNfc3RhdGVfKSkKKyAgICAgIHRsc19z
dGF0ZV8gPSBHZXRPckNyZWF0ZURhdGFTb3VyY2VUTFMoJnN0YXRpY19zdGF0ZV8pOworCisgICAg
Ly8gVHJhY2luZ1RMUzo6Z2VuZXJhdGlvbiBpcyBhIGdsb2JhbCBtb25vdG9uaWMgY291bnRlciB0
aGF0IGlzIGluY3JlbWVudGVkCisgICAgLy8gZXZlcnkgdGltZSBhIHRyYWNpbmcgc2Vzc2lvbiBp
cyBzdG9wcGVkLiBXZSB1c2UgdGhhdCBhcyBhIHNpZ25hbCB0byBmb3JjZQorICAgIC8vIGEgc2xv
dy1wYXRoIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBhbGwgdGhlIHRyYWNlIHdyaXRlcnMgZm9yIHRo
ZSBjdXJyZW50CisgICAgLy8gdGhyZWFkIGFuZCB0byBkZXN0cm95IHRoZSBvbmVzIHRoYXQgYmVs
b25nIHRvIHRyYWNpbmcgc2Vzc2lvbnMgdGhhdCBoYXZlCisgICAgLy8gZW5kZWQuIFRoaXMgaXMg
dG8gYXZvaWQgaGF2aW5nIHRvbyBtYW55IFRyYWNlV3JpdGVyIGluc3RhbmNlcyBhbGl2ZSwgZWFj
aAorICAgIC8vIGhvbGRpbmcgb250byBvbmUgY2h1bmsgb2YgdGhlIHNoYXJlZCBtZW1vcnkgYnVm
ZmVyLgorICAgIC8vIFJhdGlvbmFsZSB3aHkgbWVtb3J5X29yZGVyX3JlbGF4ZWQgc2hvdWxkIGJl
IGZpbmU6CisgICAgLy8gLSBUaGUgVHJhY2VXcml0ZXIgb2JqZWN0IHRoYXQgd2UgdXNlIGlzIGFs
d2F5cyBjb25zdHJ1Y3RlZCBhbmQgZGVzdHJ1Y3RlZAorICAgIC8vICAgb24gdGhlIGN1cnJlbnQg
dGhyZWFkLiBUaGVyZSBpcyBubyByaXNrIG9mIGFjY2Vzc2luZyBhIGhhbGYtaW5pdGlhbGl6ZWQK
KyAgICAvLyAgIFRyYWNlV3JpdGVyICh3aGljaCB3b3VsZCBiZSByZWFsbHkgYmFkKS4KKyAgICAv
LyAtIEluIHRoZSB3b3JzdCBjYXNlLCBpbiB0aGUgY2FzZSBvZiBhIHJhY2Ugb24gdGhlIGdlbmVy
YXRpb24gY2hlY2ssIHdlCisgICAgLy8gICBtaWdodCBlbmQgdXAgdXNpbmcgYSBUcmFjZVdyaXRl
ciBmb3IgdGhlIHNhbWUgZGF0YSBzb3VyY2UgdGhhdCBiZWxvbmdzCisgICAgLy8gICB0byBhIHN0
b3BwZWQgc2Vzc2lvbi4gVGhpcyBpcyBub3QgcmVhbGx5IHdyb25nLCBhcyB3ZSBkb24ndCBnaXZl
IGFueQorICAgIC8vICAgZ3VhcmFudGVlIG9uIHRoZSBnbG9iYWwgYXRvbWljaXR5IG9mIHRoZSBz
dG9wLiBJbiB0aGUgd29yc3QgY2FzZSB0aGUKKyAgICAvLyAgIHNlcnZpY2Ugd2lsbCByZWplY3Qg
dGhlIGRhdGEgY29tbWl0IGlmIHRoaXMgYXJyaXZlcyB0b28gbGF0ZS4KKworICAgIGlmIChQRVJG
RVRUT19VTkxJS0VMWSgKKyAgICAgICAgICAgIHRsc19zdGF0ZV8tPnJvb3RfdGxzLT5nZW5lcmF0
aW9uICE9CisgICAgICAgICAgICB0cmFjaW5nX2ltcGwtPmdlbmVyYXRpb24oc3RkOjptZW1vcnlf
b3JkZXJfcmVsYXhlZCkpKSB7CisgICAgICAvLyBXaWxsIHVwZGF0ZSByb290X3Rscy0+Z2VuZXJh
dGlvbi4KKyAgICAgIHRyYWNpbmdfaW1wbC0+RGVzdHJveVN0b3BwZWRUcmFjZVdyaXRlcnNGb3JD
dXJyZW50VGhyZWFkKCk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtN
YXhEYXRhU291cmNlSW5zdGFuY2VzOyBpKyspIHsKKyAgICAgIGludGVybmFsOjpEYXRhU291cmNl
U3RhdGUqIGluc3RhbmNlX3N0YXRlID0KKyAgICAgICAgICBzdGF0aWNfc3RhdGVfLlRyeUdldENh
Y2hlZChpbnN0YW5jZXMsIGkpOworICAgICAgaWYgKCFpbnN0YW5jZV9zdGF0ZSkKKyAgICAgICAg
Y29udGludWU7CisKKyAgICAgIC8vIEV2ZW4gaWYgd2UgcGFzc2VkIHRoZSBjaGVjayBhYm92ZSwg
dGhlIERhdGFTb3VyY2VJbnN0YW5jZSBtaWdodCBiZQorICAgICAgLy8gc3RpbGwgZGVzdHJveWVk
IGNvbmN1cnJlbnRseSB3aGlsZSB0aGlzIGNvZGUgcnVucy4gVGhlIGNvZGUgYmVsb3cgaXMKKyAg
ICAgIC8vIGRlc2lnbmVkIHRvIGRlYWwgd2l0aCBzdWNoIHJhY2UsIGFzIGZvbGxvd3M6CisgICAg
ICAvLyAtIFdlIGRvbid0IGFjY2VzcyB0aGUgdXNlci1kZWZpbmVkIGRhdGEgc291cmNlIGluc3Rh
bmNlIHN0YXRlLiBUaGUgb25seQorICAgICAgLy8gICBiaXRzIG9mIHN0YXRlIHdlIHVzZSBhcmUg
fGJhY2tlbmRfaWR8IGFuZCB8YnVmZmVyX2lkfC4KKyAgICAgIC8vIC0gQmV5b25kIHRob3NlIHR3
byBpbnRlZ2Vycywgd2UgYWNjZXNzIG9ubHkgdGhlIFRyYWNlV3JpdGVyIGhlcmUuIFRoZQorICAg
ICAgLy8gICBUcmFjZVdyaXRlciBpcyBhbHdheXMgc2FmZSBiZWNhdXNlIGl0IGxpdmVzIG9uIHRo
ZSBUTFMuCisgICAgICAvLyAtIHxpbnN0YW5jZV9zdGF0ZXwgaXMgYmFja2VkIGJ5IHN0YXRpYyBz
dG9yYWdlLCBzbyB0aGUgcG9pbnRlciBpcworICAgICAgLy8gICBhbHdheXMgdmFsaWQsIGV2ZW4g
YWZ0ZXIgdGhlIGRhdGEgc291cmNlIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4KKyAgICAgIC8vIC0g
SW4gdGhlIGNhc2Ugb2YgYSByYWNlLW9uLWRlc3RydWN0aW9uLCB3ZSdsbCBzdGlsbCBzZWUgdGhl
IGxhdGVzdAorICAgICAgLy8gICBiYWNrZW5kX2lkIGFuZCBidWZmZXJfaWQgYW5kIGluIHRoZSB3
b3JzdCBjYXNlIGtlZXAgdHJ5aW5nIHdyaXRpbmcKKyAgICAgIC8vICAgaW50byB0aGUgdHJhY2lu
ZyBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBhZnRlciBzdG9wcGVkLiBCdXQgdGhpcyBpc24ndAorICAg
ICAgLy8gICByZWFsbHkgYW55IHdvcnNlIHRoYW4gdGhlIGNhc2Ugb2YgdGhlIHN0b3AgSVBDIGJl
aW5nIGRlbGF5ZWQgYnkgdGhlCisgICAgICAvLyAgIGtlcm5lbCBzY2hlZHVsZXIuIFRoZSB0cmFj
aW5nIHNlcnZpY2UgaXMgcm9idXN0IGFnYWluc3QgZGF0YSBjb21taXQKKyAgICAgIC8vICAgYXR0
ZW1wcyBtYWRlIGFmdGVyIHRyYWNpbmcgaXMgc3RvcHBlZC4KKyAgICAgIC8vIFRoZXJlIGlzIGEg
dGhlb3JldGljYWwgcmFjZSB0aGF0IHdvdWxkIGNhc2UgdGhlIHdyb25nIGJlaGF2aW9yIHcuci50
CisgICAgICAvLyB3cml0aW5nIGRhdGEgaW4gdGhlIHdyb25nIGJ1ZmZlciwgYnV0IGl0J3Mgc28g
cmFyZSB0aGF0IHdlIGlnbm9yZSBpdDoKKyAgICAgIC8vIGlmIHRoZSBkYXRhIHNvdXJjZSBpcyBz
dG9wcGVkIGFuZCBzdGFydGVkIGtNYXhEYXRhU291cmNlSW5zdGFuY2VzCisgICAgICAvLyB0aW1l
cyAoc28gdGhhdCB0aGUgc2FtZSBpZCBpcyByZWN5Y2xlZCkgd2hpbGUgd2UgYXJlIGluIHRoaXMg
ZnVuY3Rpb24sCisgICAgICAvLyB3ZSBtaWdodCBlbmQgdXAgcmV1c2luZyB0aGUgb2xkIGRhdGEg
c291cmNlJ3MgYmFja2VuZF9pZCBhbmQgYnVmZmVyX2lkCisgICAgICAvLyBmb3IgdGhlIG5ldyBv
bmUsIGJlY2F1c2Ugd2UgZG9uJ3Qgc2VlIHRoZSBnZW5lcmF0aW9uIGNoYW5nZSBwYXN0IHRoaXMK
KyAgICAgIC8vIHBvaW50LiBCdXQgc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIHRyYWNpbmcgKGV2ZW4g
b25jZSkgdGFrZXMgc28gbXVjaAorICAgICAgLy8gaGFuZHNoYWtpbmcgdG8gbWFrZSB0aGlzIGV4
dHJlbWVseSB1bnJlYWxpc3RpYy4KKworICAgICAgYXV0byYgdGxzX2luc3QgPSB0bHNfc3RhdGVf
LT5wZXJfaW5zdGFuY2VbaV07CisgICAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkoIXRsc19pbnN0
LnRyYWNlX3dyaXRlcikpIHsKKyAgICAgICAgLy8gSGVyZSB3ZSBuZWVkIGFuIGFjcXVpcmUgYmFy
cmllciwgd2hpY2ggbWF0Y2hlcyB0aGUgcmVsZWFzZS1zdG9yZSBtYWRlCisgICAgICAgIC8vIGJ5
IFRyYWNpbmdNdXhlckltcGw6OlNldHVwRGF0YVNvdXJjZSgpLCB0byBlbnN1cmUgdGhhdCB0aGUg
YmFja2VuZF9pZAorICAgICAgICAvLyBhbmQgYnVmZmVyX2lkIGFyZSBjb25zaXN0ZW50LgorICAg
ICAgICBpbnN0YW5jZXMgPQorICAgICAgICAgICAgVHJhaXRzOjpHZXRBY3RpdmVJbnN0YW5jZXMo
KS0+bG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgICAgaW5zdGFuY2Vfc3Rh
dGUgPSBzdGF0aWNfc3RhdGVfLlRyeUdldENhY2hlZChpbnN0YW5jZXMsIGkpOworICAgICAgICBp
ZiAoIWluc3RhbmNlX3N0YXRlIHx8ICFpbnN0YW5jZV9zdGF0ZS0+dHJhY2VfbGFtYmRhX2VuYWJs
ZWQpCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB0bHNfaW5zdC5iYWNrZW5kX2lkID0gaW5z
dGFuY2Vfc3RhdGUtPmJhY2tlbmRfaWQ7CisgICAgICAgIHRsc19pbnN0LmJ1ZmZlcl9pZCA9IGlu
c3RhbmNlX3N0YXRlLT5idWZmZXJfaWQ7CisgICAgICAgIHRsc19pbnN0LnRyYWNlX3dyaXRlciA9
IHRyYWNpbmdfaW1wbC0+Q3JlYXRlVHJhY2VXcml0ZXIoCisgICAgICAgICAgICBpbnN0YW5jZV9z
dGF0ZSwgRGF0YVNvdXJjZVR5cGU6OmtCdWZmZXJFeGhhdXN0ZWRQb2xpY3kpOworICAgICAgICBD
cmVhdGVJbmNyZW1lbnRhbFN0YXRlKAorICAgICAgICAgICAgJnRsc19pbnN0LAorICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgRGF0YVNvdXJjZVRyYWl0czo6SW5jcmVtZW50YWxTdGF0
ZVR5cGUqPigKKyAgICAgICAgICAgICAgICBudWxscHRyKSk7CisKKyAgICAgICAgLy8gRXZlbiBp
biB0aGUgY2FzZSBvZiBvdXQtb2YtSURzLCBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbCByZXR1cm5z
IGEKKyAgICAgICAgLy8gTnVsbFRyYWNlV3JpdGVyLiBUaGUgcmV0dXJuZWQgcG9pbnRlciBzaG91
bGQgbmV2ZXIgYmUgbnVsbC4KKyAgICAgICAgYXNzZXJ0KHRsc19pbnN0LnRyYWNlX3dyaXRlcik7
CisgICAgICB9CisKKyAgICAgIHRyYWNpbmdfZm4oVHJhY2VDb250ZXh0KCZ0bHNfaW5zdCwgaSkp
OworICAgIH0KKyAgfQorCisgIC8vIFJlZ2lzdGVycyB0aGUgZGF0YSBzb3VyY2Ugb24gYWxsIHRy
YWNpbmcgYmFja2VuZHMsIGluY2x1ZGluZyBvbmVzIHRoYXQKKyAgLy8gY29ubmVjdCBhZnRlciB0
aGUgcmVnaXN0cmF0aW9uLiBEb2luZyBzbyBlbmFibGVzIHRoZSBkYXRhIHNvdXJjZSB0byByZWNl
aXZlCisgIC8vIFNldHVwL1N0YXJ0L1N0b3Agbm90aWZpY2F0aW9ucyBhbmQgbWFrZXMgdGhlIFRy
YWNlKCkgbWV0aG9kIHdvcmsgd2hlbgorICAvLyB0cmFjaW5nIGlzIGVuYWJsZWQgYW5kIHRoZSBk
YXRhIHNvdXJjZSBpcyBzZWxlY3RlZC4KKyAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBU
cmFjaW5nOjpJbml0aWFsaXplKCkuCisgIC8vIENhbiByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIGZh
aWx1cmUgaWYgYXR0ZW1waW5nIHRvIHJlZ2lzdGVyIG1vcmUgdGhhbgorICAvLyBrTWF4RGF0YVNv
dXJjZXMgKDMyKSBkYXRhIHNvdXJjZXMgdHlwZXMgb3IgaWYgdHJhY2luZyBoYXNuJ3QgYmVlbgor
ICAvLyBpbml0aWFsaXplZC4KKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgRGF0YVNvdXJj
ZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIHsKKyAgICAvLyBTaWxlbmNlcyAtV3VudXNlZC12YXJp
YWJsZSB3YXJuaW5nIGluIGNhc2UgdGhlIHRyYWNlIG1ldGhvZCBpcyBub3QgdXNlZAorICAgIC8v
IGJ5IHRoZSB0cmFuc2xhdGlvbiB1bml0IHRoYXQgZGVjbGFyZXMgdGhlIGRhdGEgc291cmNlLgor
ICAgICh2b2lkKXN0YXRpY19zdGF0ZV87CisgICAgKHZvaWQpdGxzX3N0YXRlXzsKKworICAgIGF1
dG8gZmFjdG9yeSA9IFtdIHsKKyAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGF0YVNvdXJj
ZUJhc2U+KG5ldyBEYXRhU291cmNlVHlwZSgpKTsKKyAgICB9OworICAgIGF1dG8qIHRyYWNpbmdf
aW1wbCA9IGludGVybmFsOjpUcmFjaW5nTXV4ZXI6OkdldCgpOworICAgIGlmICghdHJhY2luZ19p
bXBsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cmFjaW5nX2ltcGwtPlJlZ2lz
dGVyRGF0YVNvdXJjZShkZXNjcmlwdG9yLCBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGljX3N0YXRlXyk7CisgIH0KKworIHByaXZhdGU6
CisgIC8vIFRyYWl0cyBmb3IgY3VzdG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIGEgc3BlY2lmaWMg
dHJhY2UgcG9pbnQuCisgIHN0cnVjdCBEZWZhdWx0VHJhY2VQb2ludFRyYWl0cyB7CisgICAgLy8g
QnkgZGVmYXVsdCwgZXZlcnkgY2FsbCB0byBEYXRhU291cmNlOjpUcmFjZSgpIHdpbGwgcmVjb3Jk
IHRyYWNlIGV2ZW50cworICAgIC8vIGZvciBldmVyeSBhY3RpdmUgaW5zdGFuY2Ugb2YgdGhhdCBk
YXRhIHNvdXJjZS4gQSBzaW5nbGUgdHJhY2UgcG9pbnQgY2FuLAorICAgIC8vIGhvd2V2ZXIsIHVz
ZSBhIGN1c3RvbSBzZXQgb2YgZW5hYmxlIGZsYWdzIGZvciBtb3JlIGZpbmUgZ3JhaW5lZCBjb250
cm9sCisgICAgLy8gb2Ygd2hlbiB0aGF0IHRyYWNlIHBvaW50IGlzIGFjdGl2ZS4KKyAgICAvLwor
ICAgIC8vIERBTkdFUjogd2hlbiBkb2luZyB0aGlzLCB0aGUgZGF0YSBzb3VyY2UgbXVzdCB1c2Ug
dGhlIGFwcHJvcHJpYXRlIG1lbW9yeQorICAgIC8vIGZlbmNlcyB3aGVuIGNoYW5naW5nIHRoZSBz
dGF0ZSBvZiB0aGUgYml0bWFwLgorICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjphdG9taWM8dWlu
dDMyX3Q+KiBHZXRBY3RpdmVJbnN0YW5jZXMoKSB7CisgICAgICByZXR1cm4gJnN0YXRpY19zdGF0
ZV8udmFsaWRfaW5zdGFuY2VzOworICAgIH0KKyAgfTsKKworICAvLyBDcmVhdGUgdGhlIHVzZXIg
cHJvdmlkZWQgaW5jcmVtZW50YWwgc3RhdGUgaW4gdGhlIGdpdmVuIHRocmVhZC1sb2NhbAorICAv
LyBzdG9yYWdlLiBOb3RlOiBUaGUgc2Vjb25kIHBhcmFtZXRlciBoZXJlIGlzIHVzZWQgdG8gc3Bl
Y2lhbGl6ZSB0aGUgY2FzZQorICAvLyB3aGVyZSB0aGVyZSBpcyBubyBpbmNyZW1lbnRhbCBzdGF0
ZSB0eXBlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIHZvaWQgQ3JlYXRlSW5j
cmVtZW50YWxTdGF0ZSgKKyAgICAgIGludGVybmFsOjpEYXRhU291cmNlSW5zdGFuY2VUaHJlYWRM
b2NhbFN0YXRlKiB0bHNfaW5zdCwKKyAgICAgIGNvbnN0IFQqKSB7CisgICAgUEVSRkVUVE9fRENI
RUNLKCF0bHNfaW5zdC0+aW5jcmVtZW50YWxfc3RhdGUpOworICAgIHRsc19pbnN0LT5pbmNyZW1l
bnRhbF9zdGF0ZSA9CisgICAgICAgIGludGVybmFsOjpEYXRhU291cmNlSW5zdGFuY2VUaHJlYWRM
b2NhbFN0YXRlOjpJbmNyZW1lbnRhbFN0YXRlUG9pbnRlcigKKyAgICAgICAgICAgIHJlaW50ZXJw
cmV0X2Nhc3Q8dm9pZCo+KG5ldyBUKCkpLAorICAgICAgICAgICAgW10odm9pZCogcCkgeyBkZWxl
dGUgcmVpbnRlcnByZXRfY2FzdDxUKj4ocCk7IH0pOworICB9CisgIHN0YXRpYyB2b2lkIENyZWF0
ZUluY3JlbWVudGFsU3RhdGUoCisgICAgICBpbnRlcm5hbDo6RGF0YVNvdXJjZUluc3RhbmNlVGhy
ZWFkTG9jYWxTdGF0ZSosCisgICAgICBjb25zdCB2b2lkKikge30KKworICAvLyBOb3RlIHRoYXQg
dGhlIHJldHVybmVkIG9iamVjdCBpcyBvbmUgcGVyLXRocmVhZCBwZXItZGF0YS1zb3VyY2UtdHlw
ZSwgTk9UCisgIC8vIHBlciBkYXRhLXNvdXJjZSAqaW5zdGFuY2UqLgorICBzdGF0aWMgaW50ZXJu
YWw6OkRhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlKiBHZXRPckNyZWF0ZURhdGFTb3VyY2VUTFMo
CisgICAgICBpbnRlcm5hbDo6RGF0YVNvdXJjZVN0YXRpY1N0YXRlKiBzdGF0aWNfc3RhdGUpIHsK
KyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfSU9TKQorICAgIFBFUkZFVFRPX0ZB
VEFMKCJEYXRhIHNvdXJjZSBUTFMgbm90IHN1cHBvcnRlZCBvbiBpT1MsIHNlZSBiLzE1ODgxNDA2
OCIpOworI2VuZGlmCisgICAgYXV0byogdHJhY2luZ19pbXBsID0gaW50ZXJuYWw6OlRyYWNpbmdN
dXhlcjo6R2V0KCk7CisgICAgaW50ZXJuYWw6OlRyYWNpbmdUTFMqIHJvb3RfdGxzID0gdHJhY2lu
Z19pbXBsLT5HZXRPckNyZWF0ZVRyYWNpbmdUTFMoKTsKKyAgICBpbnRlcm5hbDo6RGF0YVNvdXJj
ZVRocmVhZExvY2FsU3RhdGUqIGRzX3RscyA9CisgICAgICAgIERhdGFTb3VyY2VUcmFpdHM6Okdl
dERhdGFTb3VyY2VUTFMoc3RhdGljX3N0YXRlLCByb290X3Rscyk7CisgICAgLy8gV2Uga2VlcCBy
ZS1pbml0aWFsaXppbmcgYXMgdGhlIGluaXRpYWxpemF0aW9uIGlzIGlkZW1wb3RlbnQgYW5kIG5v
dCB3b3J0aAorICAgIC8vIHRoZSBjb2RlIGZvciBleHRyYSBjaGVja3MuCisgICAgZHNfdGxzLT5z
dGF0aWNfc3RhdGUgPSBzdGF0aWNfc3RhdGU7CisgICAgYXNzZXJ0KCFkc190bHMtPnJvb3RfdGxz
IHx8IGRzX3Rscy0+cm9vdF90bHMgPT0gcm9vdF90bHMpOworICAgIGRzX3Rscy0+cm9vdF90bHMg
PSByb290X3RsczsKKyAgICByZXR1cm4gZHNfdGxzOworICB9CisKKyAgLy8gU3RhdGljIHN0YXRl
LiBBY2Nlc3NlZCBieSB0aGUgc3RhdGljIFRyYWNlKCkgbWV0aG9kIGZhc3RwYXRocy4KKyAgc3Rh
dGljIGludGVybmFsOjpEYXRhU291cmNlU3RhdGljU3RhdGUgc3RhdGljX3N0YXRlXzsKKworICAv
LyBUaGlzIFRMUyBvYmplY3QgaXMgYSBjYWNoZWQgcmF3IHBvaW50ZXIgYW5kIGhhcyBkZWxpYmVy
YXRlbHkgbm8gZGVzdHJ1Y3Rvci4KKyAgLy8gVGhlIFBsYXRmb3JtIGltcGxlbWVudGF0aW9uIGlz
IHN1cHBvc2VkIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHRoZSBsaWZldGltZQorICAvLyBvZiB0aGUg
UGxhdGZvcm06OlRocmVhZExvY2FsT2JqZWN0IGFuZCB0YWtlIGNhcmUgb2YgZGVzdHJveWluZyBp
dC4KKyAgLy8gVGhpcyBpcyBiZWNhdXNlIG5vbi1QT0QgdGhyZWFkX2xvY2FsIHZhcmlhYmxlcyBo
YXZlIHN1YnRsZXRpZXMgKGdsb2JhbAorICAvLyBkZXN0cnVjdG9ycykgdGhhdCB3ZSBuZWVkIHRv
IGRlZmVyIHRvIHRoZSBlbWJlZGRlci4gSW4gY2hyb21pdW0ncyBwbGF0Zm9ybQorICAvLyBpbXBs
ZW1lbnRhdGlvbiwgZm9yIGluc3RhbmNlLCB0aGUgdGxzIHNsb3QgaXMgaW1wbGVtZW50ZWQgdXNp
bmcKKyAgLy8gY2hyb21pdW0ncyBiYXNlOjpUaHJlYWRMb2NhbFN0b3JhZ2UuCisgIHN0YXRpYyBQ
RVJGRVRUT19USFJFQURfTE9DQUwgaW50ZXJuYWw6OkRhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRl
KiB0bHNfc3RhdGVfOworfTsKKworLy8gc3RhdGljCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlw
ZW5hbWUgRD4KK2ludGVybmFsOjpEYXRhU291cmNlU3RhdGljU3RhdGUgRGF0YVNvdXJjZTxULCBE
Pjo6c3RhdGljX3N0YXRlXzsKKy8vIHN0YXRpYwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVu
YW1lIEQ+CitQRVJGRVRUT19USFJFQURfTE9DQUwgaW50ZXJuYWw6OkRhdGFTb3VyY2VUaHJlYWRM
b2NhbFN0YXRlKgorICAgIERhdGFTb3VyY2U8VCwgRD46OnRsc19zdGF0ZV87CisKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworCisvLyBJZiBwbGFjZWQgYXQgdGhlIGVuZCBvZiBhIG1hY3JvIGRl
Y2xhcmF0aW9uLCBlYXRzIHRoZSBzZW1pY29sb24gYXQgdGhlIGVuZCBvZgorLy8gdGhlIG1hY3Jv
IGludm9jYXRpb24gKGUuZy4sICJNQUNSTyguLi4pOyIpIHRvIGF2b2lkIHdhcm5pbmdzIGFib3V0
IGV4dHJhCisvLyBzZW1pY29sb25zLgorI2RlZmluZSBQRVJGRVRUT19JTlRFUk5BTF9TV0FMTE9X
X1NFTUlDT0xPTigpIFwKKyAgZXh0ZXJuIGludCBwZXJmZXR0b19pbnRlcm5hbF91bnVzZWQKKwor
Ly8gVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgb25jZSBmb3IgZWFjaCBkYXRhIHNvdXJjZSBuZXh0
IHRvIHRoZSBkYXRhIHNvdXJjZSdzCisvLyBkZWNsYXJhdGlvbi4KKyNkZWZpbmUgUEVSRkVUVE9f
REVDTEFSRV9EQVRBX1NPVVJDRV9TVEFUSUNfTUVNQkVSUyguLi4pICAgICAgICAgICAgICBcCisg
IHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICBQRVJGRVRUT19DT01QT05FTlRfRVhQT1JUIHBlcmZldHRvOjppbnRl
cm5hbDo6RGF0YVNvdXJjZVN0YXRpY1N0YXRlIFwKKyAgICAgIHBlcmZldHRvOjpEYXRhU291cmNl
PF9fVkFfQVJHU19fPjo6c3RhdGljX3N0YXRlXzsgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRl
IDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICBQRVJGRVRUT19DT01QT05FTlRfRVhQT1JUIHRocmVhZF9sb2NhbCBwZXJmZXR0bzo6
aW50ZXJuYWw6OiAgICAgICAgIFwKKyAgICAgIERhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlKiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcGVyZmV0dG86
OkRhdGFTb3VyY2U8X19WQV9BUkdTX18+Ojp0bHNfc3RhdGVfCisKKy8vIFRoaXMgbWFjcm8gbXVz
dCBiZSB1c2VkIG9uY2UgZm9yIGVhY2ggZGF0YSBzb3VyY2UgaW4gb25lIHNvdXJjZSBmaWxlIHRv
CisvLyBhbGxvY2F0ZSBzdGF0aWMgc3RvcmFnZSBmb3IgdGhlIGRhdGEgc291cmNlJ3Mgc3RhdGlj
IHN0YXRlLgorI2RlZmluZSBQRVJGRVRUT19ERUZJTkVfREFUQV9TT1VSQ0VfU1RBVElDX01FTUJF
UlMoLi4uKSAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBFUkZFVFRPX0NPTVBP
TkVOVF9FWFBPUlQgcGVyZmV0dG86OmludGVybmFsOjpEYXRhU291cmNlU3RhdGljU3RhdGUgXAor
ICAgICAgcGVyZmV0dG86OkRhdGFTb3VyY2U8X19WQV9BUkdTX18+OjpzdGF0aWNfc3RhdGVfe307
ICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBFUkZFVFRPX0NPTVBPTkVOVF9FWFBP
UlQgdGhyZWFkX2xvY2FsIHBlcmZldHRvOjppbnRlcm5hbDo6ICAgICAgICAgXAorICAgICAgRGF0
YVNvdXJjZVRocmVhZExvY2FsU3RhdGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICAgICAgICBwZXJmZXR0bzo6RGF0YVNvdXJjZTxfX1ZBX0FSR1NfXz46OnRsc19z
dGF0ZV8gPSBudWxscHRyCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0RB
VEFfU09VUkNFX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4g
U291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2Us
IFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp
bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0
YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFj
aGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFw
cGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJp
YnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJ
UywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRo
ZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lm
aWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5k
ZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vdHJhY2luZy9kYXRhX3NvdXJjZS5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworCitEYXRhU291cmNlQmFzZTo6U3RvcEFyZ3M6On5TdG9wQXJncygpID0gZGVmYXVsdDsK
K0RhdGFTb3VyY2VCYXNlOjp+RGF0YVNvdXJjZUJhc2UoKSA9IGRlZmF1bHQ7Cit2b2lkIERhdGFT
b3VyY2VCYXNlOjpPblNldHVwKGNvbnN0IFNldHVwQXJncyYpIHt9Cit2b2lkIERhdGFTb3VyY2VC
YXNlOjpPblN0YXJ0KGNvbnN0IFN0YXJ0QXJncyYpIHt9Cit2b2lkIERhdGFTb3VyY2VCYXNlOjpP
blN0b3AoY29uc3QgU3RvcEFyZ3MmKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFjaW5nL2RlYnVnX2Fubm90YXRp
b24uY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8v
dHJhY2luZy9kZWJ1Z19hbm5vdGF0aW9uLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFk
ZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvZGVidWdfYW5ub3RhdGlv
bi5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBs
dWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19UUkFDRV9UUkFDS19FVkVOVF9ERUJVR19BTk5PVEFUSU9OX1BST1RPX0hfCisjZGVmaW5l
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfREVCVUdf
QU5OT1RBVElPTl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3Rk
aW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3Rv
X2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgRGVidWdBbm5vdGF0
aW9uX05lc3RlZFZhbHVlOworZW51bSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfTmVzdGVk
VHlwZSA6IGludDMyX3Q7CisKK2VudW0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3Rl
ZFR5cGUgOiBpbnQzMl90IHsKKyAgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5
cGVfVU5TUEVDSUZJRUQgPSAwLAorICBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfTmVzdGVk
VHlwZV9ESUNUID0gMSwKKyAgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVf
QVJSQVkgPSAyLAorfTsKKworY29uc3QgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3Rl
ZFR5cGUgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVfTUlOID0gRGVidWdB
bm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVfVU5TUEVDSUZJRUQ7Citjb25zdCBEZWJ1
Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfTmVzdGVkVHlwZSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVk
VmFsdWVfTmVzdGVkVHlwZV9NQVggPSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfTmVzdGVk
VHlwZV9BUlJBWTsKKworY2xhc3MgRGVidWdBbm5vdGF0aW9uTmFtZV9EZWNvZGVyIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRGVidWdB
bm5vdGF0aW9uTmFtZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBEZWJ1Z0Fubm90YXRp
b25OYW1lX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgRGVidWdBbm5vdGF0aW9uTmFtZV9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19paWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBEZWJ1Z0Fubm90YXRpb25OYW1lIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBEZWJ1
Z0Fubm90YXRpb25OYW1lX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrSWlkRmll
bGROdW1iZXIgPSAxLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNl
dF9paWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5k
Qnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25h
bWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBk
YXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgRGVidWdBbm5vdGF0aW9uX0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMTAs
IC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAg
RGVidWdBbm5vdGF0aW9uX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IERlYnVnQW5ub3Rh
dGlvbl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IERlYnVnQW5ub3RhdGlvbl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19uYW1lX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBuYW1lX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDEwPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2Jvb2xfdmFsdWUoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBib29sX3ZhbHVlKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfdWludF92YWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB1aW50X3ZhbHVlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbnRfdmFsdWUoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBpbnRfdmFsdWUoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfZG91YmxlX3Zh
bHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGRvdWJsZSBkb3VibGVf
dmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2RvdWJsZSgpOyB9CisgIGJvb2wgaGFz
X3N0cmluZ192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RDaGFycyBzdHJpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw2Pigp
LmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3BvaW50ZXJfdmFsdWUoKSBjb25zdCB7IHJldHVy
biBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcG9pbnRlcl92YWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmVzdGVkX3ZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIG5lc3RlZF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19sZWdhY3lfanNvbl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBsZWdhY3lfanNvbl92YWx1ZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDk+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIERlYnVnQW5u
b3RhdGlvbiA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gRGVidWdBbm5vdGF0aW9uX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrTmFtZUlpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMTAs
CisgICAga0Jvb2xWYWx1ZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrVWludFZhbHVlRmllbGROdW1i
ZXIgPSAzLAorICAgIGtJbnRWYWx1ZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrRG91YmxlVmFsdWVG
aWVsZE51bWJlciA9IDUsCisgICAga1N0cmluZ1ZhbHVlRmllbGROdW1iZXIgPSA2LAorICAgIGtQ
b2ludGVyVmFsdWVGaWVsZE51bWJlciA9IDcsCisgICAga05lc3RlZFZhbHVlRmllbGROdW1iZXIg
PSA4LAorICAgIGtMZWdhY3lKc29uVmFsdWVGaWVsZE51bWJlciA9IDksCisgIH07CisgIHVzaW5n
IE5lc3RlZFZhbHVlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlv
bl9OZXN0ZWRWYWx1ZTsKKyAgdm9pZCBzZXRfbmFtZV9paWQodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMTAsIHZhbHVlLmRhdGEoKSwgdmFs
dWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVf
dCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMTAsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQg
c2V0X2Jvb2xfdmFsdWUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3VpbnRfdmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ludF92YWx1ZShpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9k
b3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKSB7CisgICAgQXBwZW5kRml4ZWQoNSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsK
KyAgICBBcHBlbmRCeXRlcyg2LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAg
dm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoNiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcG9pbnRlcl92
YWx1ZSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0K
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU+IFQq
IHNldF9uZXN0ZWRfdmFsdWUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig4
KTsKKyAgfQorCisgIHZvaWQgc2V0X2xlZ2FjeV9qc29uX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5n
JiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDksIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgfQorICB2b2lkIHNldF9sZWdhY3lfanNvbl92YWx1ZShjb25zdCBjaGFyKiBkYXRhLCBz
aXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDksIGRhdGEsIHNpemUpOworICB9Cit9Owor
CitjbGFzcyBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki84LCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgRGVidWdBbm5vdGF0
aW9uX05lc3RlZFZhbHVlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IERlYnVnQW5ub3Rh
dGlvbl9OZXN0ZWRWYWx1ZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uZXN0ZWRfdHlwZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG5lc3RlZF90eXBlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2RpY3Rfa2V5
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVw
ZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiBkaWN0X2tleXMoKSBj
b25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMik7IH0K
KyAgYm9vbCBoYXNfZGljdF92YWx1ZXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29u
c3RCeXRlcz4gZGljdF92YWx1ZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3Rv
emVybzo6Q29uc3RCeXRlcz4oMyk7IH0KKyAgYm9vbCBoYXNfYXJyYXlfdmFsdWVzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxk
SXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGFycmF5X3ZhbHVlcygpIGNvbnN0IHsg
cmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig0KTsgfQorICBib29s
IGhhc19pbnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCBpbnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfZG91YmxlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9
CisgIGRvdWJsZSBkb3VibGVfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2RvdWJs
ZSgpOyB9CisgIGJvb2wgaGFzX2Jvb2xfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZh
bGlkKCk7IH0KKyAgYm9vbCBib29sX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19i
b29sKCk7IH0KKyAgYm9vbCBoYXNfc3RyaW5nX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHN0cmluZ192YWx1ZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIERlYnVnQW5u
b3RhdGlvbl9OZXN0ZWRWYWx1ZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmVzdGVkVHlwZUZpZWxkTnVtYmVyID0gMSwK
KyAgICBrRGljdEtleXNGaWVsZE51bWJlciA9IDIsCisgICAga0RpY3RWYWx1ZXNGaWVsZE51bWJl
ciA9IDMsCisgICAga0FycmF5VmFsdWVzRmllbGROdW1iZXIgPSA0LAorICAgIGtJbnRWYWx1ZUZp
ZWxkTnVtYmVyID0gNSwKKyAgICBrRG91YmxlVmFsdWVGaWVsZE51bWJlciA9IDYsCisgICAga0Jv
b2xWYWx1ZUZpZWxkTnVtYmVyID0gNywKKyAgICBrU3RyaW5nVmFsdWVGaWVsZE51bWJlciA9IDgs
CisgIH07CisgIHVzaW5nIE5lc3RlZFR5cGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6
RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGU7CisgIHN0YXRpYyBjb25zdCBO
ZXN0ZWRUeXBlIFVOU1BFQ0lGSUVEID0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3Rl
ZFR5cGVfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBOZXN0ZWRUeXBlIERJQ1QgPSBEZWJ1
Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfTmVzdGVkVHlwZV9ESUNUOworICBzdGF0aWMgY29uc3Qg
TmVzdGVkVHlwZSBBUlJBWSA9IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBl
X0FSUkFZOworICB2b2lkIHNldF9uZXN0ZWRfdHlwZSg6OnBlcmZldHRvOjpwcm90b3M6OnBiemVy
bzo6RGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGUgdmFsdWUpIHsKKyAgICBB
cHBlbmRUaW55VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9kaWN0X2tleXMoY29u
c3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgp
LCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2RpY3Rfa2V5cyhjb25zdCBjaGFyKiBk
YXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlPiBU
KiBhZGRfZGljdF92YWx1ZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigz
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGVidWdBbm5vdGF0aW9uX05lc3Rl
ZFZhbHVlPiBUKiBhZGRfYXJyYXlfdmFsdWVzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oNCk7CisgIH0KKworICB2b2lkIHNldF9pbnRfdmFsdWUoaW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZG91YmxlX3Zh
bHVlKGRvdWJsZSB2YWx1ZSkgeworICAgIEFwcGVuZEZpeGVkKDYsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9ib29sX3ZhbHVlKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDcs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoOCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDgsIGRhdGEsIHNpemUpOworICB9Cit9OworCit9IC8v
IE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8v
IEluY2x1ZGUgZ3VhcmQuCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJ
TkdfREVCVUdfQU5OT1RBVElPTl9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdf
REVCVUdfQU5OT1RBVElPTl9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2RlYnVnX2Fubm90
YXRpb24ucGJ6ZXJvLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9y
eT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSB7CisvLyBzdGQ6OnVuZGVybHlpbmdf
dHlwZSBjYW4ndCBiZSB1c2VkIHdpdGggbm9uLWVudW0gdHlwZXMsIHNvIHdlIG5lZWQgdGhpcwor
Ly8gaW5kaXJlY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfZW51
bTxUPjo6dmFsdWU+CitzdHJ1Y3Qgc2FmZV91bmRlcmx5aW5nX3R5cGUgeworICB1c2luZyB0eXBl
ID0gdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU7Cit9OworCit0ZW1wbGF0
ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBzYWZlX3VuZGVybHlpbmdfdHlwZTxULCBmYWxzZT4gewor
ICB1c2luZyB0eXBlID0gVDsKK307Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CitjbGFzcyBEZWJ1
Z0Fubm90YXRpb247Cit9ICAvLyBuYW1lc3BhY2UgcGJ6ZXJvCit9ICAvLyBuYW1lc3BhY2UgcHJv
dG9zCisKKy8vIEEgYmFzZSBjbGFzcyBmb3IgY3VzdG9tIHRyYWNrIGV2ZW50IGRlYnVnIGFubm90
YXRpb25zLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIERlYnVnQW5ub3RhdGlvbiB7CisgcHVibGlj
OgorICBEZWJ1Z0Fubm90YXRpb24oKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkRlYnVnQW5ub3Rh
dGlvbigpOworCisgIC8vIENhbGxlZCB0byB3cml0ZSB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVn
IGFubm90YXRpb24gaW50byB0aGUgdHJhY2UuCisgIHZpcnR1YWwgdm9pZCBBZGQocHJvdG9zOjpw
Ynplcm86OkRlYnVnQW5ub3RhdGlvbiopIGNvbnN0ID0gMDsKK307CisKK25hbWVzcGFjZSBpbnRl
cm5hbCB7CisvLyBPdmVybG9hZHMgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIGJ1aWx0IGluIGRlYnVn
IGFubm90YXRpb24gdHlwZXMuIE51bWVyaWMKKy8vIHR5cGVzIGFyZSBoYW5kbGVkIHdpdGggdGVt
cGxhdGVzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggb3ZlcmxvYWRpbmcKKy8vIHBsYXRmb3JtLXNw
ZWNpZmljIHR5cGVzIChlLmcuLCBzaXplX3QpLgordm9pZCBQRVJGRVRUT19FWFBPUlQgV3JpdGVE
ZWJ1Z0Fubm90YXRpb24ocHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbiosCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKik7Cit2b2lkIFBF
UkZFVFRPX0VYUE9SVCBXcml0ZURlYnVnQW5ub3RhdGlvbihwcm90b3M6OnBiemVybzo6RGVidWdB
bm5vdGF0aW9uKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IHN0ZDo6c3RyaW5nJik7Cit2b2lkIFBFUkZFVFRPX0VYUE9SVCBXcml0ZURlYnVnQW5ub3Rh
dGlvbihwcm90b3M6OnBiemVybzo6RGVidWdBbm5vdGF0aW9uKiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqKTsKK3ZvaWQgUEVSRkVUVE9fRVhQ
T1JUIFdyaXRlRGVidWdBbm5vdGF0aW9uKHByb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90YXRpb24q
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdB
bm5vdGF0aW9uJik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBXcml0ZURlYnVnQW5u
b3RhdGlvbigKKyAgICBwcm90b3M6OnBiemVybzo6RGVidWdBbm5vdGF0aW9uKiBhbm5vdGF0aW9u
LAorICAgIFQgdmFsdWUsCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mbG9h
dGluZ19wb2ludDxUPjo6dmFsdWU+Ojp0eXBlKiA9CisgICAgICAgIG51bGxwdHIpIHsKKyAgYW5u
b3RhdGlvbi0+c2V0X2RvdWJsZV92YWx1ZShzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSk7Cit9
CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBXcml0ZURlYnVnQW5ub3RhdGlvbigKKyAg
ICBwcm90b3M6OnBiemVybzo6RGVidWdBbm5vdGF0aW9uKiBhbm5vdGF0aW9uLAorICAgIFQgdmFs
dWUsCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFs
dWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjppc19zYW1lPFQsIGJvb2w+
Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2lnbmVkPFQ+
Ojp2YWx1ZT46OnR5cGUqID0gbnVsbHB0cikgeworICBhbm5vdGF0aW9uLT5zZXRfaW50X3ZhbHVl
KHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFdyaXRlRGVidWdBbm5v
dGF0aW9uKAorICAgIHByb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90YXRpb24qIGFubm90YXRpb24s
CisgICAgVCB2YWx1ZSwKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgc3Rk
Ojppc19lbnVtPFQ+Ojp2YWx1ZSAmJgorICAgICAgICBzdGQ6OmlzX3NpZ25lZDx0eXBlbmFtZSBz
YWZlX3VuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT46OnZhbHVlPjo6dHlwZSogPQorICAgICAgICBu
dWxscHRyKSB7CisgIGFubm90YXRpb24tPnNldF9pbnRfdmFsdWUodmFsdWUpOworfQorCit0ZW1w
bGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgV3JpdGVEZWJ1Z0Fubm90YXRpb24oCisgICAgcHJvdG9z
OjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbiogYW5ub3RhdGlvbiwKKyAgICBUIHZhbHVlLAorICAg
IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgJiYKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3Vuc2lnbmVkPHR5cGVuYW1lIHNhZmVfdW5k
ZXJseWluZ190eXBlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUPjo6dHlwZT46
OnZhbHVlPjo6dHlwZSogPSBudWxscHRyKSB7CisgIGFubm90YXRpb24tPnNldF91aW50X3ZhbHVl
KHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFdyaXRlRGVidWdBbm5v
dGF0aW9uKAorICAgIHByb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90YXRpb24qIGFubm90YXRpb24s
CisgICAgVCB2YWx1ZSwKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVn
cmFsPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGQ6OmlzX3Nh
bWU8VCwgYm9vbD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpp
c191bnNpZ25lZDxUPjo6dmFsdWU+Ojp0eXBlKiA9IG51bGxwdHIpIHsKKyAgYW5ub3RhdGlvbi0+
c2V0X3VpbnRfdmFsdWUodmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQg
V3JpdGVEZWJ1Z0Fubm90YXRpb24oCisgICAgcHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlv
biogYW5ub3RhdGlvbiwKKyAgICBUIHZhbHVlLAorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lm
PHN0ZDo6aXNfc2FtZTxULCBib29sPjo6dmFsdWU+Ojp0eXBlKiA9IG51bGxwdHIpIHsKKyAgYW5u
b3RhdGlvbi0+c2V0X2Jvb2xfdmFsdWUodmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUg
VD4KK3ZvaWQgV3JpdGVEZWJ1Z0Fubm90YXRpb24ocHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3Rh
dGlvbiogYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1
bmlxdWVfcHRyPFQ+JiB2YWx1ZSkgeworICBXcml0ZURlYnVnQW5ub3RhdGlvbihhbm5vdGF0aW9u
LCAqdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19ERUJVR19B
Tk5PVEFUSU9OX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4g
U291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2Us
IFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp
bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0
YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFj
aGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFw
cGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJp
YnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJ
UywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRo
ZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lm
aWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5k
ZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vdHJhY2luZy9kZWJ1Z19hbm5vdGF0aW9uLmgiCisKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19l
dmVudC9kZWJ1Z19hbm5vdGF0aW9uLnBiemVyby5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
CitEZWJ1Z0Fubm90YXRpb246On5EZWJ1Z0Fubm90YXRpb24oKSA9IGRlZmF1bHQ7CisKK25hbWVz
cGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgV3JpdGVEZWJ1Z0Fubm90YXRpb24ocHJvdG9zOjpwYnpl
cm86OkRlYnVnQW5ub3RhdGlvbiogYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgYW5ub3RhdGlvbi0+c2V0X3N0cmluZ192YWx1ZSh2
YWx1ZSk7Cit9CisKK3ZvaWQgV3JpdGVEZWJ1Z0Fubm90YXRpb24ocHJvdG9zOjpwYnplcm86OkRl
YnVnQW5ub3RhdGlvbiogYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGFubm90YXRpb24tPnNldF9zdHJpbmdfdmFsdWUo
dmFsdWUpOworfQorCit2b2lkIFdyaXRlRGVidWdBbm5vdGF0aW9uKHByb3Rvczo6cGJ6ZXJvOjpE
ZWJ1Z0Fubm90YXRpb24qIGFubm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IHZvaWQqIHZhbHVlKSB7CisgIGFubm90YXRpb24tPnNldF9wb2ludGVyX3ZhbHVlKHJlaW50
ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSk7Cit9CisKK3ZvaWQgV3JpdGVEZWJ1Z0Fubm90
YXRpb24ocHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbiogYW5ub3RhdGlvbiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdBbm5vdGF0aW9uJiBjdXN0b21fYW5ub3Rh
dGlvbikgeworICBjdXN0b21fYW5ub3RhdGlvbi5BZGQoYW5ub3RhdGlvbik7Cit9CisKK30gIC8v
IG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1h
bGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvdHJhY2luZy9ldmVudF9jb250ZXh0LmNjCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvZXZl
bnRfY29udGV4dC5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3Bl
cmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfaW50ZXJuYWwuaAorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9iYXNlL2ZsYXRfc2V0LmgK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVj
dAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAg
KHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4g
Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9m
IHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5z
ZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg
b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0
aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9V
VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9y
IGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBn
b3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5z
ZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9GTEFUX1NFVF9IXworI2Rl
ZmluZSBJTkNMVURFX1BFUkZFVFRPX0JBU0VfRkxBVF9TRVRfSF8KKworI2luY2x1ZGUgPGFsZ29y
aXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEEgdmVjdG9yLWJhc2VkIHNldDo6c2V0LWxp
a2UgY29udGFpbmVyLgorLy8gSXQncyBtb3JlIGNhY2hlIGZyaWVuZGx5IHRoYW4gc3RkOjoqc2V0
IGFuZCBwZXJmb3JtcyBmb3IgY2FzZXMgd2hlcmU6CisvLyAxLiBBIGhpZ2ggbnVtYmVyIG9mIGR1
cGVzIGlzIGV4cGVjdGVkIChlLmcuIHBpZCB0cmFja2luZyBpbiBmdHJhY2UpLgorLy8gMi4gVGhl
IHdvcmtpbmcgc2V0IGlzIHNtYWxsIChodW5kcmVkcyBvZiBlbGVtZW50cykuCisKKy8vIFBlcmZv
cm1hbmNlIGNoYXJhY3RlcmlzdGljcyAoZm9yIHVuaWZvcm1seSByYW5kb20gaW5zZXJ0aW9uIG9y
ZGVyKToKKy8vIC0gRm9yIHNtYWxsZXIgaW5zZXJ0aW9ucyAodXAgdG8gfjUwMCksIGl0IG91dHBl
cmZvcm1zIGJvdGggc3RkOjpzZXQ8aW50PiBhbmQKKy8vICAgc3RkOjp1bm9yZGVyZWRfc2V0PGlu
dD4gYnkgfjN4LgorLy8gLSBVcCB1bnRpbCA0ayBpbnNlcnRpb25zLCBpdCBpcyBhbHdheXMgZmFz
dGVyIHRoYW4gc3RkOjpzZXQ8aW50Pi4KKy8vIC0gdW5vcmRlcmVkX3NldDxpbnQ+IGlzIGZhc3Rl
ciB3aXRoIG1vcmUgdGhhbiAyayBpbnNlcnRpb25zLgorLy8gLSB1bm9yZGVyZWRfc2V0LCBob3dl
dmVyLCBpdCdzIGxlc3MgbWVtb3J5IGVmZmljaWVudCBhbmQgaGFzIG1vcmUgY2F2ZWF0cworLy8g
ICAoc2VlIGNocm9taXVtJ3MgYmFzZS9jb250YWluZXJzL1JFQURNRS5tZCkuCisvLworLy8gU2Vl
IGZsYXRfc2V0X2JlbmNobWFyay5jYyBhbmQgdGhlIGNoYXJ0cyBpbiBnby9wZXJmZXR0by1pbnQt
c2V0LWJlbmNobWFyay4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsK
KwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGbGF0U2V0IHsKKyBwdWJsaWM6CisgIHVz
aW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVCo7Cisg
IHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgc3RkOjp2ZWN0b3I8VD46Oml0ZXJhdG9yOworICB1
c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+Ojpjb25zdF9pdGVy
YXRvcjsKKworICBGbGF0U2V0KCkgPSBkZWZhdWx0OworCisgIC8vIE1haW5seSBmb3IgdGVzdHMu
IERlbGliZXJhdGVseSBub3QgbWFya2VkIGFzICJleHBpY2l0Ii4KKyAgRmxhdFNldChzdGQ6Omlu
aXRpYWxpemVyX2xpc3Q8VD4gaW5pdGlhbCkgOiBlbnRyaWVzXyhpbml0aWFsKSB7CisgICAgc3Rk
Ojpzb3J0KGVudHJpZXNfLmJlZ2luKCksIGVudHJpZXNfLmVuZCgpKTsKKyAgICBlbnRyaWVzXy5l
cmFzZShzdGQ6OnVuaXF1ZShlbnRyaWVzXy5iZWdpbigpLCBlbnRyaWVzXy5lbmQoKSksCisgICAg
ICAgICAgICAgICAgICAgZW50cmllc18uZW5kKCkpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3Ig
ZmluZChUIHZhbHVlKSBjb25zdCB7CisgICAgYXV0byBlbnRyaWVzX2VuZCA9IGVudHJpZXNfLmVu
ZCgpOworICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKGVudHJpZXNfLmJlZ2luKCksIGVu
dHJpZXNfZW5kLCB2YWx1ZSk7CisgICAgcmV0dXJuIChpdCAhPSBlbnRyaWVzX2VuZCAmJiAqaXQg
PT0gdmFsdWUpID8gaXQgOiBlbnRyaWVzX2VuZDsKKyAgfQorCisgIHNpemVfdCBjb3VudChUIHZh
bHVlKSBjb25zdCB7IHJldHVybiBmaW5kKHZhbHVlKSA9PSBlbnRyaWVzXy5lbmQoKSA/IDAgOiAx
OyB9CisKKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoVCB2YWx1ZSkgeworICAg
IGF1dG8gZW50cmllc19lbmQgPSBlbnRyaWVzXy5lbmQoKTsKKyAgICBhdXRvIGl0ID0gc3RkOjps
b3dlcl9ib3VuZChlbnRyaWVzXy5iZWdpbigpLCBlbnRyaWVzX2VuZCwgdmFsdWUpOworICAgIGlm
IChpdCAhPSBlbnRyaWVzX2VuZCAmJiAqaXQgPT0gdmFsdWUpCisgICAgICByZXR1cm4gc3RkOjpt
YWtlX3BhaXIoaXQsIGZhbHNlKTsKKyAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kIHxp
dHwgaXMgZWl0aGVyIGVuZCgpIG9yIHRoZSBuZXh0IGl0ZW0gc3RyaWN0bHkKKyAgICAvLyBncmVh
dGVyIHRoYW4gfHZhbHVlfC4gSW4gYm90aCBjYXNlcyB3ZSB3YW50IHRvIGluc2VydCBqdXN0IGJl
Zm9yZSB0aGF0LgorICAgIGl0ID0gZW50cmllc18uaW5zZXJ0KGl0LCBzdGQ6Om1vdmUodmFsdWUp
KTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXQsIHRydWUpOworICB9CisKKyAgc2l6ZV90
IGVyYXNlKFQgdmFsdWUpIHsKKyAgICBhdXRvIGl0ID0gZmluZCh2YWx1ZSk7CisgICAgaWYgKGl0
ID09IGVudHJpZXNfLmVuZCgpKQorICAgICAgcmV0dXJuIDA7CisgICAgZW50cmllc18uZXJhc2Uo
aXQpOworICAgIHJldHVybiAxOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsgZW50cmllc18uY2xl
YXIoKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBlbnRyaWVzXy5lbXB0eSgp
OyB9CisgIHZvaWQgcmVzZXJ2ZShzaXplX3QgbikgeyBlbnRyaWVzXy5yZXNlcnZlKG4pOyB9Cisg
IHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW50cmllc18uc2l6ZSgpOyB9CisgIGNvbnN0
X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZW50cmllc18uYmVnaW4oKTsgfQorICBj
b25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBlbnRyaWVzXy5lbmQoKTsgfQorCisg
cHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8VD4gZW50cmllc187Cit9OworCit9ICAvLyBuYW1lc3Bh
Y2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9Q
RVJGRVRUT19CQVNFX0ZMQVRfU0VUX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvdHJhY2suaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC90cmFja19k
ZXNjcmlwdG9yLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29t
cGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX1RSQUNLX0RFU0NSSVBUT1JfUFJPVE9fSF8K
KyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVO
VF9UUkFDS19ERVNDUklQVE9SX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNs
dWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0
byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBDaHJv
bWVQcm9jZXNzRGVzY3JpcHRvcjsKK2NsYXNzIENocm9tZVRocmVhZERlc2NyaXB0b3I7CitjbGFz
cyBDb3VudGVyRGVzY3JpcHRvcjsKK2NsYXNzIFByb2Nlc3NEZXNjcmlwdG9yOworY2xhc3MgVGhy
ZWFkRGVzY3JpcHRvcjsKKworY2xhc3MgVHJhY2tEZXNjcmlwdG9yX0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOCwgLypIQVNf
Tk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBUcmFja0Rl
c2NyaXB0b3JfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVk
UHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVHJhY2tEZXNjcmlwdG9yX0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgVHJhY2tEZXNjcmlwdG9yX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX3V1aWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfcGFyZW50X3V1aWQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgcGFyZW50X3V1aWQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
YXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfcHJvY2VzcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwcm9jZXNzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9wcm9jZXNz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIGNocm9tZV9wcm9jZXNzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2hyb21lX3RocmVhZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBjaHJvbWVf
dGhyZWFkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFz
X2NvdW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgY291bnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfYnl0ZXMo
KTsgfQorfTsKKworY2xhc3MgVHJhY2tEZXNjcmlwdG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFja0Rlc2NyaXB0b3JfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtVdWlkRmllbGROdW1iZXIgPSAxLAorICAg
IGtQYXJlbnRVdWlkRmllbGROdW1iZXIgPSA1LAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAyLAor
ICAgIGtQcm9jZXNzRmllbGROdW1iZXIgPSAzLAorICAgIGtDaHJvbWVQcm9jZXNzRmllbGROdW1i
ZXIgPSA2LAorICAgIGtUaHJlYWRGaWVsZE51bWJlciA9IDQsCisgICAga0Nocm9tZVRocmVhZEZp
ZWxkTnVtYmVyID0gNywKKyAgICBrQ291bnRlckZpZWxkTnVtYmVyID0gOCwKKyAgfTsKKyAgdm9p
ZCBzZXRfdXVpZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcGFyZW50X3V1aWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXpl
KCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUp
IHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IFByb2Nlc3NEZXNjcmlwdG9yPiBUKiBzZXRfcHJvY2VzcygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcj4gVCogc2V0X2Nocm9tZV9wcm9jZXNzKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IFRocmVhZERlc2NyaXB0b3I+IFQqIHNldF90aHJlYWQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gQ2hyb21lVGhyZWFkRGVzY3JpcHRvcj4gVCogc2V0X2Nocm9tZV90aHJlYWQoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gQ291bnRlckRlc2NyaXB0b3I+IFQqIHNldF9jb3VudGVyKCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oOCk7CisgIH0KKworfTsKKworfSAvLyBOYW1lc3Bh
Y2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRl
IGd1YXJkLgorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJj
ZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJz
aW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4
Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBh
IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9y
Zy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNh
YmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVk
IHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisg
KiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4
cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxh
bmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRo
ZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNL
X0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19IXworCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9wcm9j
X3V0aWxzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9iYXNlL3RocmVhZF91dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2VfaGFuZGxlLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX2hl
YXBfYnVmZmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90
b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2VfcGFja2V0LnBiemVyby5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50
L3RyYWNrX2Rlc2NyaXB0b3IuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdHJhY2tfZGVzY3JpcHRv
ci5wYnplcm8uaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNs
dWRlIDxtdXRleD4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7
CitjbGFzcyBUcmFja1JlZ2lzdHJ5OworfQorCisvLyBUcmFjayBldmVudHMgYXJlIHJlY29yZGVk
IG9uIGEgdGltZWxpbmUgdHJhY2ssIHdoaWNoIG1haW50YWlucyB0aGUgcmVsYXRpdmUKKy8vIHRp
bWUgb3JkZXJpbmcgb2YgYWxsIGV2ZW50cyBvbiB0aGF0IHRyYWNrLiBFYWNoIHRocmVhZCBoYXMg
aXRzIG93biBkZWZhdWx0CisvLyB0cmFjayAoVGhyZWFkVHJhY2spLCB3aGljaCBpcyBieSBkZWZh
dWx0IHdoZXJlIGFsbCB0cmFjayBldmVudHMgYXJlIHdyaXR0ZW4uCisvLyBUaHJlYWQgdHJhY2tz
IGFyZSBncm91cGVkIHVuZGVyIHRoZWlyIGhvc3RpbmcgcHJvY2VzcyAoUHJvY2Vzc1RyYWNrKS4K
KworLy8gRXZlbnRzIHdoaWNoIGFyZW4ndCBzdHJpY3RseSBzY29wZWQgdG8gYSB0aHJlYWQgb3Ig
YSBwcm9jZXNzLCBvciBkb24ndAorLy8gY29ycmVzcG9uZCB0byBzeW5jaHJvbm91cyBjb2RlIGV4
ZWN1dGlvbiBvbiBhIHRocmVhZCBjYW4gdXNlIGEgY3VzdG9tCisvLyB0cmFjayAoVHJhY2ssIFRo
cmVhZFRyYWNrIG9yIFByb2Nlc3NUcmFjaykuIEEgVHJhY2sgb2JqZWN0IGNhbiBhbHNvCisvLyBv
cHRpb25hbGx5IGJlIHBhcmVudGVkIHRvIGEgdGhyZWFkIG9yIGEgcHJvY2Vzcy4KKy8vCisvLyBB
IHRyYWNrIGlzIHJlcHJlc2VudGVkIGJ5IGEgdXVpZCwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgYWNy
b3NzIHRoZSBlbnRpcmUKKy8vIHJlY29yZGVkIHRyYWNlLgorLy8KKy8vIEZvciBleGFtcGxlLCB0
byByZWNvcmQgYW4gZXZlbnQgdGhhdCBiZWdpbnMgYW5kIGVuZHMgb24gZGlmZmVyZW50IHRocmVh
ZHMsCisvLyB1c2UgYSBtYXRjaGluZyBpZCB0byB0aWUgdGhlIGJlZ2luIGFuZCBlbmQgZXZlbnRz
IHRvZ2V0aGVyOgorLy8KKy8vICAgVFJBQ0VfRVZFTlRfQkVHSU4oImNhdGVnb3J5IiwgIkFzeW5j
RXZlbnQiLCBwZXJmZXR0bzo6VHJhY2soODA4NikpOworLy8gICAuLi4KKy8vICAgVFJBQ0VfRVZF
TlRfRU5EKCJjYXRlZ29yeSIsIHBlcmZldHRvOjpUcmFjayg4MDg2KSk7CisvLworLy8gVHJhY2tz
IGNhbiBhbHNvIGJlIGFubm90YXRlZCB3aXRoIG1ldGFkYXRhOgorLy8KKy8vICAgYXV0byBkZXNj
ID0gdHJhY2suU2VyaWFsaXplKCk7CisvLyAgIGRlc2Muc2V0X25hbWUoIk15VHJhY2siKTsKKy8v
ICAgcGVyZmV0dG86OlRyYWNrRXZlbnQ6OlNldFRyYWNrRGVzY3JpcHRvcih0cmFjaywgZGVzYyk7
CisvLworLy8gVGhyZWFkcyBhbmQgcHJvY2Vzc2VzIGNhbiBhbHNvIGJlIG5hbWVkIGluIGEgc2lt
aWxhciB3YXksIGUuZy46CisvLworLy8gICBhdXRvIGRlc2MgPSBwZXJmZXR0bzo6UHJvY2Vzc1Ry
YWNrOjpDdXJyZW50KCkuU2VyaWFsaXplKCk7CisvLyAgIGRlc2MubXV0YWJsZV9wcm9jZXNzKCkt
PnNldF9wcm9jZXNzX25hbWUoIk15UHJvY2VzcyIpOworLy8gICBwZXJmZXR0bzo6VHJhY2tFdmVu
dDo6U2V0VHJhY2tEZXNjcmlwdG9yKAorLy8gICAgICAgcGVyZmV0dG86OlByb2Nlc3NUcmFjazo6
Q3VycmVudCgpLCBkZXNjKTsKKy8vCisvLyBUaGUgbWV0YWRhdGEgcmVtYWlucyB2YWxpZCBiZXR3
ZWVuIHRyYWNpbmcgc2Vzc2lvbnMuIFRvIGZyZWUgdXAgZGF0YSBmb3IgYQorLy8gdHJhY2ssIGNh
bGwgRXJhc2VUcmFja0Rlc2NyaXB0b3I6CisvLworLy8gICBwZXJmZXR0bzo6VHJhY2tFdmVudDo6
RXJhc2VUcmFja0Rlc2NyaXB0b3IodHJhY2spOworLy8KK3N0cnVjdCBQRVJGRVRUT19FWFBPUlQg
VHJhY2sgeworICBjb25zdCB1aW50NjRfdCB1dWlkOworICBjb25zdCB1aW50NjRfdCBwYXJlbnRf
dXVpZDsKKyAgY29uc3RleHByIFRyYWNrKCkgOiB1dWlkKDApLCBwYXJlbnRfdXVpZCgwKSB7fQor
CisgIC8vIENvbnN0cnVjdCBhIHRyYWNrIHdpdGggaWRlbnRpZmllciB8aWR8LCBvcHRpb25hbGx5
IHBhcmVudGVkIHVuZGVyIHxwYXJlbnR8LgorICAvLyBJZiBubyBwYXJlbnQgaXMgc3BlY2lmaWVk
LCB0aGUgdHJhY2sncyBwYXJlbnQgaXMgdGhlIGN1cnJlbnQgcHJvY2VzcydzCisgIC8vIHRyYWNr
LgorICAvLworICAvLyBUbyBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBmb3IgYWNjaWRlbnRhbCBpZCBj
b2xsaXNpb25zIGFjcm9zcyBwcm9jZXNzZXMsIHRoZQorICAvLyB0cmFjaydzIGVmZmVjdGl2ZSB1
dWlkIGlzIGdlbmVyYXRlZCBieSB4b3JyaW5nIHxpZHwgd2l0aCBhIHJhbmRvbSwKKyAgLy8gcGVy
LXByb2Nlc3MgY29va2llLgorICBleHBsaWNpdCBUcmFjayh1aW50NjRfdCBpZCwgVHJhY2sgcGFy
ZW50ID0gTWFrZVByb2Nlc3NUcmFjaygpKQorICAgICAgOiB1dWlkKGlkIF4gcGFyZW50LnV1aWQp
LCBwYXJlbnRfdXVpZChwYXJlbnQudXVpZCkge30KKworICBleHBsaWNpdCBvcGVyYXRvciBib29s
KCkgY29uc3QgeyByZXR1cm4gdXVpZDsgfQorICB2b2lkIFNlcmlhbGl6ZShwcm90b3M6OnBiemVy
bzo6VHJhY2tEZXNjcmlwdG9yKikgY29uc3Q7CisgIHByb3Rvczo6Z2VuOjpUcmFja0Rlc2NyaXB0
b3IgU2VyaWFsaXplKCkgY29uc3Q7CisKKyAgLy8gQ29uc3RydWN0IGEgZ2xvYmFsIHRyYWNrIHdp
dGggaWRlbnRpZmllciB8aWR8LgorICAvLworICAvLyBCZXdhcmU6IHRoZSBnbG9iYWxseSB1bmlx
dWUgfGlkfCBzaG91bGQgYmUgY2hvc2VuIGNhcmVmdWxseSB0byBhdm9pZAorICAvLyBhY2NpZGVu
dGFsIGNsYXNoZXMgd2l0aCB0cmFjayBpZGVudGlmaWVycyBlbWl0dGVkIGJ5IG90aGVyIHByb2R1
Y2Vycy4KKyAgc3RhdGljIFRyYWNrIEdsb2JhbCh1aW50NjRfdCBpZCkgeyByZXR1cm4gVHJhY2so
aWQsIFRyYWNrKCkpOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBUcmFjayBNYWtlVGhyZWFk
VHJhY2soYmFzZTo6UGxhdGZvcm1UaHJlYWRJZCB0aWQpIHsKKyAgICAvLyBJZiB0aWQgd2VyZSAw
IGhlcmUgKHdoaWNoIGlzIGFuIGludmFsaWQgdGlkKSwgd2Ugd291bGQgY3JlYXRlIGEgdGhyZWFk
CisgICAgLy8gdHJhY2sgd2l0aCBhIHV1aWQgdGhhdCBjb25mbGljdHMgd2l0aCB0aGUgY29ycmVz
cG9uZGluZyBQcm9jZXNzVHJhY2suCisgICAgUEVSRkVUVE9fRENIRUNLKHRpZCAhPSAwKTsKKyAg
ICByZXR1cm4gVHJhY2soc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHRpZCksIE1ha2VQcm9jZXNzVHJh
Y2soKSk7CisgIH0KKworICBzdGF0aWMgVHJhY2sgTWFrZVByb2Nlc3NUcmFjaygpIHsgcmV0dXJu
IFRyYWNrKHByb2Nlc3NfdXVpZCwgVHJhY2soKSk7IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBj
bGFzcyBpbnRlcm5hbDo6VHJhY2tSZWdpc3RyeTsKKyAgc3RhdGljIHVpbnQ2NF90IHByb2Nlc3Nf
dXVpZDsKK307CisKKy8vIEEgcHJvY2VzcyB0cmFjayByZXByZXNlbnRzIGV2ZW50cyB0aGF0IGRl
c2NyaWJlIHRoZSBzdGF0ZSBvZiB0aGUgZW50aXJlCisvLyBhcHBsaWNhdGlvbiAoZS5nLiwgY291
bnRlciBldmVudHMpLiBDdXJyZW50bHkgYSBQcm9jZXNzVHJhY2sgY2FuIG9ubHkKKy8vIHJlcHJl
c2VudCB0aGUgY3VycmVudCBwcm9jZXNzLgorc3RydWN0IFBFUkZFVFRPX0VYUE9SVCBQcm9jZXNz
VHJhY2sgOiBwdWJsaWMgVHJhY2sgeworICBjb25zdCBiYXNlOjpQbGF0Zm9ybVByb2Nlc3NJZCBw
aWQ7CisKKyAgc3RhdGljIFByb2Nlc3NUcmFjayBDdXJyZW50KCkgeyByZXR1cm4gUHJvY2Vzc1Ry
YWNrKCk7IH0KKworICB2b2lkIFNlcmlhbGl6ZShwcm90b3M6OnBiemVybzo6VHJhY2tEZXNjcmlw
dG9yKikgY29uc3Q7CisgIHByb3Rvczo6Z2VuOjpUcmFja0Rlc2NyaXB0b3IgU2VyaWFsaXplKCkg
Y29uc3Q7CisKKyBwcml2YXRlOgorICBQcm9jZXNzVHJhY2soKSA6IFRyYWNrKE1ha2VQcm9jZXNz
VHJhY2soKSksIHBpZChiYXNlOjpHZXRQcm9jZXNzSWQoKSkge30KK307CisKKy8vIEEgdGhyZWFk
IHRyYWNrIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHRocmVhZCBvZiBleGVjdXRpb24u
IEN1cnJlbnRseQorLy8gb25seSB0aHJlYWRzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuIGJl
IHJlZmVyZW5jZWQuCitzdHJ1Y3QgUEVSRkVUVE9fRVhQT1JUIFRocmVhZFRyYWNrIDogcHVibGlj
IFRyYWNrIHsKKyAgY29uc3QgYmFzZTo6UGxhdGZvcm1Qcm9jZXNzSWQgcGlkOworICBjb25zdCBi
YXNlOjpQbGF0Zm9ybVRocmVhZElkIHRpZDsKKworICBzdGF0aWMgVGhyZWFkVHJhY2sgQ3VycmVu
dCgpIHsgcmV0dXJuIFRocmVhZFRyYWNrKGJhc2U6OkdldFRocmVhZElkKCkpOyB9CisKKyAgLy8g
UmVwcmVzZW50cyBhIHRocmVhZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLgorICBzdGF0aWMgVGhy
ZWFkVHJhY2sgRm9yVGhyZWFkKGJhc2U6OlBsYXRmb3JtVGhyZWFkSWQgdGlkXykgeworICAgIHJl
dHVybiBUaHJlYWRUcmFjayh0aWRfKTsKKyAgfQorCisgIHZvaWQgU2VyaWFsaXplKHByb3Rvczo6
cGJ6ZXJvOjpUcmFja0Rlc2NyaXB0b3IqKSBjb25zdDsKKyAgcHJvdG9zOjpnZW46OlRyYWNrRGVz
Y3JpcHRvciBTZXJpYWxpemUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGV4cGxpY2l0IFRocmVh
ZFRyYWNrKGJhc2U6OlBsYXRmb3JtVGhyZWFkSWQgdGlkXykKKyAgICAgIDogVHJhY2soTWFrZVRo
cmVhZFRyYWNrKHRpZF8pKSwKKyAgICAgICAgcGlkKFByb2Nlc3NUcmFjazo6Q3VycmVudCgpLnBp
ZCksCisgICAgICAgIHRpZCh0aWRfKSB7fQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwor
Ly8gS2VlcHMgYSBtYXAgb2YgdXVpZHMgdG8gc2VyaWFsaXplZCB0cmFjayBkZXNjcmlwdG9ycyBh
bmQgcHJvdmlkZXMgYQorLy8gdGhyZWFkLXNhZmUgd2F5IHRvIHJlYWQgYW5kIHdyaXRlIHRoZW0u
IEVhY2ggdHJhY2Ugd3JpdGVyIGtlZXBzIGEgVExTIHNldCBvZgorLy8gdGhlIHRyYWNrcyBpdCBo
YXMgc2VlbiAoc2VlIFRyYWNrRXZlbnRJbmNyZW1lbnRhbFN0YXRlKS4gSW4gdGhlIGNvbW1vbiBj
YXNlLAorLy8gdGhpcyByZWdpc3RyeSBpcyBub3QgY29uc3VsdGVkIChhbmQgbm8gbG9ja3MgYXJl
IHRha2VuKS4gSG93ZXZlciB3aGVuIGEgbmV3CisvLyB0cmFjayBpcyBzZWVuLCB0aGlzIHJlZ2lz
dHJ5IGlzIHVzZWQgdG8gd3JpdGUgZWl0aGVyIDEpIHRoZSBkZWZhdWx0CisvLyBkZXNjcmlwdG9y
IGZvciB0aGF0IHRyYWNrIChzZWUgKlRyYWNrOjpTZXJpYWxpemUpIG9yIDIpIGEgc2VyaWFsaXpl
ZAorLy8gZGVzY3JpcHRvciBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5IHdoaWNoIG1heSBoYXZlIGFk
ZGl0aW9uYWwgbWV0YWRhdGEgKGUuZy4sCisvLyB0cmFjayBuYW1lKS4KKy8vIFRPRE8oZXNlY2ts
ZXIpOiBSZW1vdmUgUEVSRkVUVE9fRVhQT1JUIG9uY2UgQ2hyb21pdW0gbm8gbG9uZ2VyIGNhbGxz
CisvLyBUcmFja1JlZ2lzdHJ5OjpJbml0aWFsaXplSW5zdGFuY2UoKSBkaXJlY3RseS4KK2NsYXNz
IFBFUkZFVFRPX0VYUE9SVCBUcmFja1JlZ2lzdHJ5IHsKKyBwdWJsaWM6CisgIHVzaW5nIFNlcmlh
bGl6ZWRUcmFja0Rlc2NyaXB0b3IgPSBzdGQ6OnN0cmluZzsKKworICBUcmFja1JlZ2lzdHJ5KCk7
CisgIH5UcmFja1JlZ2lzdHJ5KCk7CisKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZUluc3RhbmNl
KCk7CisgIHN0YXRpYyBUcmFja1JlZ2lzdHJ5KiBHZXQoKSB7IHJldHVybiBpbnN0YW5jZV87IH0K
KworICB2b2lkIEVyYXNlVHJhY2soVHJhY2spOworCisgIC8vIFN0b3JlIG1ldGFkYXRhIGZvciB8
dHJhY2t8IGluIHRoZSByZWdpc3RyeS4gfGZpbGxfZnVuY3Rpb258IGlzIGNhbGxlZAorICAvLyBz
eW5jaHJvbm91c2x5IHRvIHJlY29yZCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHRoZSB0cmFj
ay4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRyYWNrVHlwZT4KKyAgdm9pZCBVcGRhdGVUcmFjaygK
KyAgICAgIGNvbnN0IFRyYWNrVHlwZSYgdHJhY2ssCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQo
cHJvdG9zOjpwYnplcm86OlRyYWNrRGVzY3JpcHRvciopPiBmaWxsX2Z1bmN0aW9uKSB7CisgICAg
VXBkYXRlVHJhY2tJbXBsKHRyYWNrLCBbJl0ocHJvdG9zOjpwYnplcm86OlRyYWNrRGVzY3JpcHRv
ciogZGVzYykgeworICAgICAgdHJhY2suU2VyaWFsaXplKGRlc2MpOworICAgICAgZmlsbF9mdW5j
dGlvbihkZXNjKTsKKyAgICB9KTsKKyAgfQorCisgIC8vIFRoaXMgdmFyaWFudCBsZXRzIHRoZSB1
c2VyIHN1cHBseSBhIHNlcmlhbGl6ZWQgdHJhY2sgZGVzY3JpcHRvciBkaXJlY3RseS4KKyAgdm9p
ZCBVcGRhdGVUcmFjayhUcmFjaywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRfZGVzYyk7
CisKKyAgLy8gSWYgfHRyYWNrfCBleGlzdHMgaW4gdGhlIHJlZ2lzdHJ5LCB3cml0ZSBvdXQgdGhl
IHNlcmlhbGl6ZWQgdHJhY2sKKyAgLy8gZGVzY3JpcHRvciBmb3IgaXQgaW50byB8cGFja2V0fC4g
T3RoZXJ3aXNlIGp1c3QgdGhlIGVwaGVtZXJhbCB0cmFjayBvYmplY3QKKyAgLy8gaXMgc2VyaWFs
aXplZCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIG1ldGFkYXRhLgorICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVHJhY2tUeXBlPgorICB2b2lkIFNlcmlhbGl6ZVRyYWNrKAorICAgICAgY29uc3QgVHJhY2tU
eXBlJiB0cmFjaywKKyAgICAgIHByb3RvemVybzo6TWVzc2FnZUhhbmRsZTxwcm90b3M6OnBiemVy
bzo6VHJhY2VQYWNrZXQ+IHBhY2tldCkgeworICAgIC8vIElmIHRoZSB0cmFjayBoYXMgZXh0cmEg
bWV0YWRhdGEgKHJlY29yZGVkIHdpdGggVXBkYXRlVHJhY2spLCBpdCB3aWxsIGJlCisgICAgLy8g
Zm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBUbyBtaW5pbWl6ZSB0aGUgdGltZSB0aGUgbG9jayBpcyBo
ZWxkLCBtYWtlIGEgY29weQorICAgIC8vIG9mIHRoZSBkYXRhIGhlbGQgaW4gdGhlIHJlZ2lzdHJ5
IGFuZCB3cml0ZSBpdCBvdXRzaWRlIHRoZSBsb2NrLgorICAgIHN0ZDo6c3RyaW5nIGRlc2NfY29w
eTsKKyAgICB7CisgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8p
OworICAgICAgY29uc3QgYXV0byYgaXQgPSB0cmFja3NfLmZpbmQodHJhY2sudXVpZCk7CisgICAg
ICBpZiAoaXQgIT0gdHJhY2tzXy5lbmQoKSkgeworICAgICAgICBkZXNjX2NvcHkgPSBpdC0+c2Vj
b25kOworICAgICAgICBQRVJGRVRUT19EQ0hFQ0soIWRlc2NfY29weS5lbXB0eSgpKTsKKyAgICAg
IH0KKyAgICB9CisgICAgaWYgKCFkZXNjX2NvcHkuZW1wdHkoKSkgeworICAgICAgV3JpdGVUcmFj
a0Rlc2NyaXB0b3Ioc3RkOjptb3ZlKGRlc2NfY29weSksIHN0ZDo6bW92ZShwYWNrZXQpKTsKKyAg
ICB9IGVsc2UgeworICAgICAgLy8gT3RoZXJ3aXNlIHdlIGp1c3Qgd3JpdGUgdGhlIGJhc2ljIGRl
c2NyaXB0b3IgZm9yIHRoaXMgdHlwZSBvZiB0cmFjaworICAgICAgLy8gKGUuZy4sIGp1c3QgdXVp
ZCwgbm8gbmFtZSkuCisgICAgICB0cmFjay5TZXJpYWxpemUocGFja2V0LT5zZXRfdHJhY2tfZGVz
Y3JpcHRvcigpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCBXcml0ZVRyYWNrRGVzY3Jp
cHRvcigKKyAgICAgIGNvbnN0IFNlcmlhbGl6ZWRUcmFja0Rlc2NyaXB0b3ImIGRlc2MsCisgICAg
ICBwcm90b3plcm86Ok1lc3NhZ2VIYW5kbGU8cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0PiBw
YWNrZXQpOworCisgcHJpdmF0ZToKKyAgdm9pZCBVcGRhdGVUcmFja0ltcGwoCisgICAgICBUcmFj
aywKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChwcm90b3M6OnBiemVybzo6VHJhY2tEZXNjcmlw
dG9yKik+IGZpbGxfZnVuY3Rpb24pOworCisgIHN0ZDo6bXV0ZXggbXV0ZXhfOworICBzdGQ6Om1h
cDx1aW50NjRfdCAvKiB1dWlkICovLCBTZXJpYWxpemVkVHJhY2tEZXNjcmlwdG9yPiB0cmFja3Nf
OworCisgIHN0YXRpYyBUcmFja1JlZ2lzdHJ5KiBpbnN0YW5jZV87Cit9OworCit9ICAvLyBuYW1l
c3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElO
Q0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24vYnVpbHRpbl9jbG9jay5wYnplcm8u
aAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8g
Tk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01N
T05fQlVJTFRJTl9DTE9DS19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9T
X1BFUkZFVFRPX0NPTU1PTl9CVUlMVElOX0NMT0NLX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRk
ZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0
ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8gewor
CisKK2VudW0gQnVpbHRpbkNsb2NrIDogaW50MzJfdCB7CisgIEJVSUxUSU5fQ0xPQ0tfVU5LTk9X
TiA9IDAsCisgIEJVSUxUSU5fQ0xPQ0tfUkVBTFRJTUUgPSAxLAorICBCVUlMVElOX0NMT0NLX1JF
QUxUSU1FX0NPQVJTRSA9IDIsCisgIEJVSUxUSU5fQ0xPQ0tfTU9OT1RPTklDID0gMywKKyAgQlVJ
TFRJTl9DTE9DS19NT05PVE9OSUNfQ09BUlNFID0gNCwKKyAgQlVJTFRJTl9DTE9DS19NT05PVE9O
SUNfUkFXID0gNSwKKyAgQlVJTFRJTl9DTE9DS19CT09UVElNRSA9IDYsCisgIEJVSUxUSU5fQ0xP
Q0tfTUFYX0lEID0gNjMsCit9OworCitjb25zdCBCdWlsdGluQ2xvY2sgQnVpbHRpbkNsb2NrX01J
TiA9IEJVSUxUSU5fQ0xPQ0tfVU5LTk9XTjsKK2NvbnN0IEJ1aWx0aW5DbG9jayBCdWlsdGluQ2xv
Y2tfTUFYID0gQlVJTFRJTl9DTE9DS19NQVhfSUQ7CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBO
YW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2Uv
aW50ZXJuZWRfZGF0YS9pbnRlcm5lZF9kYXRhLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5
IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQ
RVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0lOVEVSTkVEX0RBVEFfSU5URVJO
RURfREFUQV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X1RSQUNFX0lOVEVSTkVEX0RBVEFfSU5URVJORURfREFUQV9QUk9UT19IXworCisjaW5jbHVkZSA8
c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3Jl
cGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCitu
YW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJv
IHsKKworY2xhc3MgQ2FsbHN0YWNrOworY2xhc3MgRGVidWdBbm5vdGF0aW9uTmFtZTsKK2NsYXNz
IEV2ZW50Q2F0ZWdvcnk7CitjbGFzcyBFdmVudE5hbWU7CitjbGFzcyBGcmFtZTsKK2NsYXNzIElu
dGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9uOworY2xhc3MgSW50ZXJuZWRHcmFwaGlj
c0NvbnRleHQ7CitjbGFzcyBJbnRlcm5lZFN0cmluZzsKK2NsYXNzIExvZ01lc3NhZ2VCb2R5Owor
Y2xhc3MgTWFwcGluZzsKK2NsYXNzIFByb2ZpbGVkRnJhbWVTeW1ib2xzOworY2xhc3MgU291cmNl
TG9jYXRpb247CisKK2NsYXNzIEludGVybmVkRGF0YV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzI0LCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgSW50ZXJuZWREYXRhX0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEludGVybmVkRGF0YV9EZWNvZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEludGVy
bmVkRGF0YV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19ldmVudF9j
YXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGV2ZW50
X2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29u
c3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfZXZlbnRfbmFtZXMoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZXZlbnRfbmFtZXMoKSBjb25zdCB7IHJldHVybiBHZXRS
ZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMik7IH0KKyAgYm9vbCBoYXNfZGVidWdf
YW5ub3RhdGlvbl9uYW1lcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
PiBkZWJ1Z19hbm5vdGF0aW9uX25hbWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpw
cm90b3plcm86OkNvbnN0Qnl0ZXM+KDMpOyB9CisgIGJvb2wgaGFzX3NvdXJjZV9sb2NhdGlvbnMo
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gc291cmNlX2xvY2F0aW9u
cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig0
KTsgfQorICBib29sIGhhc19sb2dfbWVzc2FnZV9ib2R5KCkgY29uc3QgeyByZXR1cm4gYXQ8MjA+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzPiBsb2dfbWVzc2FnZV9ib2R5KCkgY29uc3QgeyByZXR1cm4gR2V0
UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIwKTsgfQorICBib29sIGhhc19idWls
ZF9pZHMoKSBjb25zdCB7IHJldHVybiBhdDwxNj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGJ1aWxkX2lk
cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigx
Nik7IH0KKyAgYm9vbCBoYXNfbWFwcGluZ19wYXRocygpIGNvbnN0IHsgcmV0dXJuIGF0PDE3Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3Rv
emVybzo6Q29uc3RCeXRlcz4gbWFwcGluZ19wYXRocygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVh
dGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxNyk7IH0KKyAgYm9vbCBoYXNfc291cmNlX3Bh
dGhzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBzb3VyY2VfcGF0
aHMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4o
MTgpOyB9CisgIGJvb2wgaGFzX2Z1bmN0aW9uX25hbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90
b3plcm86OkNvbnN0Qnl0ZXM+IGZ1bmN0aW9uX25hbWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVw
ZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDUpOyB9CisgIGJvb2wgaGFzX3Byb2ZpbGVk
X2ZyYW1lX3N5bWJvbHMoKSBjb25zdCB7IHJldHVybiBhdDwyMT4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+
IHByb2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnBy
b3RvemVybzo6Q29uc3RCeXRlcz4oMjEpOyB9CisgIGJvb2wgaGFzX21hcHBpbmdzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVs
ZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBtYXBwaW5ncygpIGNvbnN0IHsgcmV0
dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxOSk7IH0KKyAgYm9vbCBo
YXNfZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGZyYW1l
cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig2
KTsgfQorICBib29sIGhhc19jYWxsc3RhY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86
OkNvbnN0Qnl0ZXM+IGNhbGxzdGFja3MoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnBy
b3RvemVybzo6Q29uc3RCeXRlcz4oNyk7IH0KKyAgYm9vbCBoYXNfdnVsa2FuX21lbW9yeV9rZXlz
KCkgY29uc3QgeyByZXR1cm4gYXQ8MjI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVw
ZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiB2dWxrYW5fbWVtb3J5
X2tleXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4oMjIpOyB9CisgIGJvb2wgaGFzX2dyYXBoaWNzX2NvbnRleHRzKCkgY29uc3QgeyByZXR1cm4g
YXQ8MjM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9y
PDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBncmFwaGljc19jb250ZXh0cygpIGNvbnN0IHsgcmV0
dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyMyk7IH0KKyAgYm9vbCBo
YXNfZ3B1X3NwZWNpZmljYXRpb25zKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQ+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzPiBncHVfc3BlY2lmaWNhdGlvbnMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMjQpOyB9Cit9OworCitjbGFzcyBJbnRlcm5lZERhdGEg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IEludGVybmVkRGF0YV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0V2ZW50
Q2F0ZWdvcmllc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrRXZlbnROYW1lc0ZpZWxkTnVtYmVyID0g
MiwKKyAgICBrRGVidWdBbm5vdGF0aW9uTmFtZXNGaWVsZE51bWJlciA9IDMsCisgICAga1NvdXJj
ZUxvY2F0aW9uc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrTG9nTWVzc2FnZUJvZHlGaWVsZE51bWJl
ciA9IDIwLAorICAgIGtCdWlsZElkc0ZpZWxkTnVtYmVyID0gMTYsCisgICAga01hcHBpbmdQYXRo
c0ZpZWxkTnVtYmVyID0gMTcsCisgICAga1NvdXJjZVBhdGhzRmllbGROdW1iZXIgPSAxOCwKKyAg
ICBrRnVuY3Rpb25OYW1lc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrUHJvZmlsZWRGcmFtZVN5bWJv
bHNGaWVsZE51bWJlciA9IDIxLAorICAgIGtNYXBwaW5nc0ZpZWxkTnVtYmVyID0gMTksCisgICAg
a0ZyYW1lc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrQ2FsbHN0YWNrc0ZpZWxkTnVtYmVyID0gNywK
KyAgICBrVnVsa2FuTWVtb3J5S2V5c0ZpZWxkTnVtYmVyID0gMjIsCisgICAga0dyYXBoaWNzQ29u
dGV4dHNGaWVsZE51bWJlciA9IDIzLAorICAgIGtHcHVTcGVjaWZpY2F0aW9uc0ZpZWxkTnVtYmVy
ID0gMjQsCisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXZlbnRDYXRlZ29yeT4gVCog
YWRkX2V2ZW50X2NhdGVnb3JpZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXZlbnROYW1lPiBUKiBhZGRf
ZXZlbnRfbmFtZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyKTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGVidWdBbm5vdGF0aW9uTmFtZT4gVCogYWRk
X2RlYnVnX2Fubm90YXRpb25fbmFtZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU291cmNlTG9jYXRpb24+
IFQqIGFkZF9zb3VyY2VfbG9jYXRpb25zKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IExvZ01lc3NhZ2VCb2R5
PiBUKiBhZGRfbG9nX21lc3NhZ2VfYm9keSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDIwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRTdHJp
bmc+IFQqIGFkZF9idWlsZF9pZHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigxNik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEludGVybmVkU3RyaW5nPiBU
KiBhZGRfbWFwcGluZ19wYXRocygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDE3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRTdHJpbmc+IFQq
IGFkZF9zb3VyY2VfcGF0aHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigx
OCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEludGVybmVkU3RyaW5nPiBUKiBh
ZGRfZnVuY3Rpb25fbmFtZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUHJvZmlsZWRGcmFtZVN5bWJvbHM+
IFQqIGFkZF9wcm9maWxlZF9mcmFtZV9zeW1ib2xzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMjEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNYXBwaW5n
PiBUKiBhZGRfbWFwcGluZ3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigx
OSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEZyYW1lPiBUKiBhZGRfZnJhbWVz
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IENhbGxzdGFjaz4gVCogYWRkX2NhbGxzdGFja3MoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gSW50ZXJuZWRTdHJpbmc+IFQqIGFkZF92dWxrYW5fbWVtb3J5X2tleXMoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMik7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IEludGVybmVkR3JhcGhpY3NDb250ZXh0PiBUKiBhZGRfZ3JhcGhpY3NfY29u
dGV4dHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMyk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0
aW9uPiBUKiBhZGRfZ3B1X3NwZWNpZmljYXRpb25zKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMjQpOworICB9CisKK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1l
c3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJh
Y2tfZXZlbnQvdHJhY2tfZXZlbnQucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFBy
b3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfRVZFTlRfUFJP
VE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFD
S19FVkVOVF9UUkFDS19FVkVOVF9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5j
bHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgQ2hy
b21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlOworY2xhc3MgQ2hyb21lRnJhbWVSZXBvcnRlcjsK
K2NsYXNzIENocm9tZUhpc3RvZ3JhbVNhbXBsZTsKK2NsYXNzIENocm9tZUtleWVkU2VydmljZTsK
K2NsYXNzIENocm9tZUxhdGVuY3lJbmZvOworY2xhc3MgQ2hyb21lTGVnYWN5SXBjOworY2xhc3Mg
Q2hyb21lVXNlckV2ZW50OworY2xhc3MgRGVidWdBbm5vdGF0aW9uOworY2xhc3MgTG9nTWVzc2Fn
ZTsKK2NsYXNzIFRhc2tFeGVjdXRpb247CitjbGFzcyBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50Owor
ZW51bSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb24gOiBpbnQzMl90OworZW51
bSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlIDogaW50MzJfdDsKK2Vu
dW0gVHJhY2tFdmVudF9UeXBlIDogaW50MzJfdDsKKworZW51bSBUcmFja0V2ZW50X1R5cGUgOiBp
bnQzMl90IHsKKyAgVHJhY2tFdmVudF9UeXBlX1RZUEVfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFj
a0V2ZW50X1R5cGVfVFlQRV9TTElDRV9CRUdJTiA9IDEsCisgIFRyYWNrRXZlbnRfVHlwZV9UWVBF
X1NMSUNFX0VORCA9IDIsCisgIFRyYWNrRXZlbnRfVHlwZV9UWVBFX0lOU1RBTlQgPSAzLAorICBU
cmFja0V2ZW50X1R5cGVfVFlQRV9DT1VOVEVSID0gNCwKK307CisKK2NvbnN0IFRyYWNrRXZlbnRf
VHlwZSBUcmFja0V2ZW50X1R5cGVfTUlOID0gVHJhY2tFdmVudF9UeXBlX1RZUEVfVU5TUEVDSUZJ
RUQ7Citjb25zdCBUcmFja0V2ZW50X1R5cGUgVHJhY2tFdmVudF9UeXBlX01BWCA9IFRyYWNrRXZl
bnRfVHlwZV9UWVBFX0NPVU5URVI7CisKK2VudW0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93
RGlyZWN0aW9uIDogaW50MzJfdCB7CisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVj
dGlvbl9GTE9XX1VOU1BFQ0lGSUVEID0gMCwKKyAgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93
RGlyZWN0aW9uX0ZMT1dfSU4gPSAxLAorICBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJl
Y3Rpb25fRkxPV19PVVQgPSAyLAorICBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rp
b25fRkxPV19JTk9VVCA9IDMsCit9OworCitjb25zdCBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zs
b3dEaXJlY3Rpb24gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX01JTiA9IFRy
YWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9XX1VOU1BFQ0lGSUVEOworY29u
c3QgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uIFRyYWNrRXZlbnRfTGVnYWN5
RXZlbnRfRmxvd0RpcmVjdGlvbl9NQVggPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJl
Y3Rpb25fRkxPV19JTk9VVDsKKworZW51bSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRF
dmVudFNjb3BlIDogaW50MzJfdCB7CisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2
ZW50U2NvcGVfU0NPUEVfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50
X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX0dMT0JBTCA9IDEsCisgIFRyYWNrRXZlbnRfTGVnYWN5
RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfUFJPQ0VTUyA9IDIsCisgIFRyYWNrRXZlbnRf
TGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVEhSRUFEID0gMywKK307CisKK2Nv
bnN0IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGUgVHJhY2tFdmVudF9M
ZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9NSU4gPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50
X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX1VOU1BFQ0lGSUVEOworY29uc3QgVHJhY2tFdmVudF9M
ZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3Rh
bnRFdmVudFNjb3BlX01BWCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2Nv
cGVfU0NPUEVfVEhSRUFEOworCitjbGFzcyBFdmVudE5hbWVfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV2ZW50TmFtZV9E
ZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29k
ZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFdmVudE5hbWVfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFdmVudE5h
bWVfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaWlkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgRXZlbnRO
YW1lIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBFdmVudE5hbWVfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtJaWRG
aWVsZE51bWJlciA9IDEsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQg
c2V0X2lpZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBl
bmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRf
bmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIs
IGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFzcyBFdmVudENhdGVnb3J5X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBF
dmVudENhdGVnb3J5X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV2ZW50Q2F0ZWdvcnlf
RGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQor
ICBleHBsaWNpdCBFdmVudENhdGVnb3J5X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBpaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7
IH0KK307CisKK2NsYXNzIEV2ZW50Q2F0ZWdvcnkgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV2ZW50Q2F0ZWdvcnlfRGVjb2RlcjsK
KyAgZW51bSA6IGludDMyX3QgeworICAgIGtJaWRGaWVsZE51bWJlciA9IDEsCisgICAga05hbWVG
aWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2lpZCh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9Cit9OworCitj
bGFzcyBUcmFja0V2ZW50RGVmYXVsdHNfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlw
ZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVB
VEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFRyYWNrRXZlbnREZWZhdWx0c19EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50RGVmYXVsdHNfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBU
cmFja0V2ZW50RGVmYXVsdHNfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfdHJhY2tfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgdHJhY2tfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX2V4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMoKSBjb25zdCB7IHJldHVybiBh
dDwzMT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8
dWludDY0X3Q+IGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMoKSBjb25zdCB7IHJldHVybiBHZXRS
ZXBlYXRlZDx1aW50NjRfdD4oMzEpOyB9Cit9OworCitjbGFzcyBUcmFja0V2ZW50RGVmYXVsdHMg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IFRyYWNrRXZlbnREZWZhdWx0c19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a1RyYWNrVXVpZEZpZWxkTnVtYmVyID0gMTEsCisgICAga0V4dHJhQ291bnRlclRyYWNrVXVpZHNG
aWVsZE51bWJlciA9IDMxLAorICB9OworICB2b2lkIHNldF90cmFja191dWlkKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDExLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfZXh0
cmFfY291bnRlcl90cmFja191dWlkcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgzMSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBUcmFja0V2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMzIsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBUcmFj
a0V2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNrRXZlbnRfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBUcmFja0V2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Nh
dGVnb3J5X2lpZHMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjx1aW50NjRfdD4gY2F0ZWdvcnlfaWlkcygpIGNv
bnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPHVpbnQ2NF90PigzKTsgfQorICBib29sIGhhc19jYXRl
Z29yaWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MjI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiBjYXRlZ29y
aWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+
KDIyKTsgfQorICBib29sIGhhc19uYW1lX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgbmFtZV9paWQoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MjM+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1
cm4gYXQ8MjM+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBh
dDw5PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdHJhY2tfdXVpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDExPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdHJhY2tfdXVpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDExPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NvdW50ZXJfdmFsdWUo
KSBjb25zdCB7IHJldHVybiBhdDwzMD4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgY291bnRlcl92
YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMwPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNf
ZXh0cmFfY291bnRlcl90cmFja191dWlkcygpIGNvbnN0IHsgcmV0dXJuIGF0PDMxPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjx1aW50NjRfdD4gZXh0
cmFfY291bnRlcl90cmFja191dWlkcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPHVpbnQ2
NF90PigzMSk7IH0KKyAgYm9vbCBoYXNfZXh0cmFfY291bnRlcl92YWx1ZXMoKSBjb25zdCB7IHJl
dHVybiBhdDwxMj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRl
cmF0b3I8aW50NjRfdD4gZXh0cmFfY291bnRlcl92YWx1ZXMoKSBjb25zdCB7IHJldHVybiBHZXRS
ZXBlYXRlZDxpbnQ2NF90PigxMik7IH0KKyAgYm9vbCBoYXNfZGVidWdfYW5ub3RhdGlvbnMoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZGVidWdfYW5ub3RhdGlvbnMo
KSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNCk7
IH0KKyAgYm9vbCBoYXNfdGFza19leGVjdXRpb24oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdGFza19leGVjdXRpb24oKSBjb25z
dCB7IHJldHVybiBhdDw1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbG9nX21lc3NhZ2Uo
KSBjb25zdCB7IHJldHVybiBhdDwyMT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIGxvZ19tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjE+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19jY19zY2hlZHVsZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwyND4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNjX3NjaGVkdWxlcl9zdGF0
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2hy
b21lX3VzZXJfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDwyNT4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9tZV91c2VyX2V2ZW50KCkgY29uc3QgeyByZXR1cm4g
YXQ8MjU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jaHJvbWVfa2V5ZWRfc2VydmljZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMgY2hyb21lX2tleWVkX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiBhdDwyNj4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9sZWdhY3lfaXBjKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mjc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBjaHJvbWVfbGVn
YWN5X2lwYygpIGNvbnN0IHsgcmV0dXJuIGF0PDI3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfY2hyb21lX2hpc3RvZ3JhbV9zYW1wbGUoKSBjb25zdCB7IHJldHVybiBhdDwyOD4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9tZV9oaXN0b2dyYW1fc2FtcGxl
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jaHJv
bWVfbGF0ZW5jeV9pbmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjk+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBjaHJvbWVfbGF0ZW5jeV9pbmZvKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mjk+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jaHJvbWVfZnJhbWVfcmVwb3J0
ZXIoKSBjb25zdCB7IHJldHVybiBhdDwzMj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIGNocm9tZV9mcmFtZV9yZXBvcnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDMyPigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1wX2RlbHRhX3VzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGltZXN0YW1wX2RlbHRhX3VzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RpbWVzdGFt
cF9hYnNvbHV0ZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCB0aW1lc3RhbXBfYWJzb2x1dGVfdXMoKSBjb25zdCB7IHJldHVybiBhdDwxNj4oKS5hc19p
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RocmVhZF90aW1lX2RlbHRhX3VzKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGhyZWFkX3RpbWVfZGVsdGFfdXMoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfdGhyZWFkX3Rp
bWVfYWJzb2x1dGVfdXMoKSBjb25zdCB7IHJldHVybiBhdDwxNz4oKS52YWxpZCgpOyB9CisgIGlu
dDY0X3QgdGhyZWFkX3RpbWVfYWJzb2x1dGVfdXMoKSBjb25zdCB7IHJldHVybiBhdDwxNz4oKS5h
c19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9kZWx0YSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHRocmVhZF9pbnN0
cnVjdGlvbl9jb3VudF9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfaW50NjQoKTsg
fQorICBib29sIGhhc190aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnRfYWJzb2x1dGUoKSBjb25zdCB7
IHJldHVybiBhdDwyMD4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGhyZWFkX2luc3RydWN0aW9u
X2NvdW50X2Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjA+KCkuYXNfaW50NjQoKTsgfQor
ICBib29sIGhhc19sZWdhY3lfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbGVnYWN5X2V2ZW50KCkgY29uc3QgeyByZXR1
cm4gYXQ8Nj4oKS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBUcmFja0V2ZW50IDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFj
a0V2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2F0ZWdvcnlJaWRzRmll
bGROdW1iZXIgPSAzLAorICAgIGtDYXRlZ29yaWVzRmllbGROdW1iZXIgPSAyMiwKKyAgICBrTmFt
ZUlpZEZpZWxkTnVtYmVyID0gMTAsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIzLAorICAgIGtU
eXBlRmllbGROdW1iZXIgPSA5LAorICAgIGtUcmFja1V1aWRGaWVsZE51bWJlciA9IDExLAorICAg
IGtDb3VudGVyVmFsdWVGaWVsZE51bWJlciA9IDMwLAorICAgIGtFeHRyYUNvdW50ZXJUcmFja1V1
aWRzRmllbGROdW1iZXIgPSAzMSwKKyAgICBrRXh0cmFDb3VudGVyVmFsdWVzRmllbGROdW1iZXIg
PSAxMiwKKyAgICBrRGVidWdBbm5vdGF0aW9uc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrVGFza0V4
ZWN1dGlvbkZpZWxkTnVtYmVyID0gNSwKKyAgICBrTG9nTWVzc2FnZUZpZWxkTnVtYmVyID0gMjEs
CisgICAga0NjU2NoZWR1bGVyU3RhdGVGaWVsZE51bWJlciA9IDI0LAorICAgIGtDaHJvbWVVc2Vy
RXZlbnRGaWVsZE51bWJlciA9IDI1LAorICAgIGtDaHJvbWVLZXllZFNlcnZpY2VGaWVsZE51bWJl
ciA9IDI2LAorICAgIGtDaHJvbWVMZWdhY3lJcGNGaWVsZE51bWJlciA9IDI3LAorICAgIGtDaHJv
bWVIaXN0b2dyYW1TYW1wbGVGaWVsZE51bWJlciA9IDI4LAorICAgIGtDaHJvbWVMYXRlbmN5SW5m
b0ZpZWxkTnVtYmVyID0gMjksCisgICAga0Nocm9tZUZyYW1lUmVwb3J0ZXJGaWVsZE51bWJlciA9
IDMyLAorICAgIGtUaW1lc3RhbXBEZWx0YVVzRmllbGROdW1iZXIgPSAxLAorICAgIGtUaW1lc3Rh
bXBBYnNvbHV0ZVVzRmllbGROdW1iZXIgPSAxNiwKKyAgICBrVGhyZWFkVGltZURlbHRhVXNGaWVs
ZE51bWJlciA9IDIsCisgICAga1RocmVhZFRpbWVBYnNvbHV0ZVVzRmllbGROdW1iZXIgPSAxNywK
KyAgICBrVGhyZWFkSW5zdHJ1Y3Rpb25Db3VudERlbHRhRmllbGROdW1iZXIgPSA4LAorICAgIGtU
aHJlYWRJbnN0cnVjdGlvbkNvdW50QWJzb2x1dGVGaWVsZE51bWJlciA9IDIwLAorICAgIGtMZWdh
Y3lFdmVudEZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKyAgdXNpbmcgTGVnYWN5RXZlbnQgPSA6OnBl
cmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudF9MZWdhY3lFdmVudDsKKyAgdXNpbmcg
VHlwZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50X1R5cGU7CisgIHN0
YXRpYyBjb25zdCBUeXBlIFRZUEVfVU5TUEVDSUZJRUQgPSBUcmFja0V2ZW50X1R5cGVfVFlQRV9V
TlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9TTElDRV9CRUdJTiA9IFRyYWNr
RXZlbnRfVHlwZV9UWVBFX1NMSUNFX0JFR0lOOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NM
SUNFX0VORCA9IFRyYWNrRXZlbnRfVHlwZV9UWVBFX1NMSUNFX0VORDsKKyAgc3RhdGljIGNvbnN0
IFR5cGUgVFlQRV9JTlNUQU5UID0gVHJhY2tFdmVudF9UeXBlX1RZUEVfSU5TVEFOVDsKKyAgc3Rh
dGljIGNvbnN0IFR5cGUgVFlQRV9DT1VOVEVSID0gVHJhY2tFdmVudF9UeXBlX1RZUEVfQ09VTlRF
UjsKKyAgdm9pZCBhZGRfY2F0ZWdvcnlfaWlkcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfY2F0ZWdvcmllcyhjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyMiwgdmFsdWUuZGF0YSgpLCB2YWx1
ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2NhdGVnb3JpZXMoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAg
dm9pZCBzZXRfbmFtZV9paWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTAs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDIzLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0K
KyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDIzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF90eXBlKDo6cGVyZmV0
dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50X1R5cGUgdmFsdWUpIHsKKyAgICBBcHBlbmRU
aW55VmFySW50KDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90cmFja191dWlkKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDExLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
Y291bnRlcl92YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMwLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBhZGRfZXh0cmFfY291bnRlcl90cmFja191dWlkcyh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzMSwgdmFsdWUpOworICB9CisgIHZvaWQgYWRkX2V4
dHJhX2NvdW50ZXJfdmFsdWVzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTIs
IHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERlYnVnQW5ub3RhdGlvbj4g
VCogYWRkX2RlYnVnX2Fubm90YXRpb25zKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRhc2tFeGVjdXRpb24+
IFQqIHNldF90YXNrX2V4ZWN1dGlvbigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBMb2dNZXNzYWdlPiBUKiBz
ZXRfbG9nX21lc3NhZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMSk7
CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUNvbXBvc2l0b3JTY2hlZHVs
ZXJTdGF0ZT4gVCogc2V0X2NjX3NjaGVkdWxlcl9zdGF0ZSgpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDI0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hy
b21lVXNlckV2ZW50PiBUKiBzZXRfY2hyb21lX3VzZXJfZXZlbnQoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigyNSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IENocm9tZUtleWVkU2VydmljZT4gVCogc2V0X2Nocm9tZV9rZXllZF9zZXJ2aWNlKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBDaHJvbWVMZWdhY3lJcGM+IFQqIHNldF9jaHJvbWVfbGVnYWN5X2lwYygpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI3KTsKKyAgfQorCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gQ2hyb21lSGlzdG9ncmFtU2FtcGxlPiBUKiBzZXRfY2hyb21lX2hpc3Rv
Z3JhbV9zYW1wbGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyOCk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUxhdGVuY3lJbmZvPiBUKiBzZXRf
Y2hyb21lX2xhdGVuY3lfaW5mbygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDI5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lRnJhbWVSZXBvcnRl
cj4gVCogc2V0X2Nocm9tZV9mcmFtZV9yZXBvcnRlcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDMyKTsKKyAgfQorCisgIHZvaWQgc2V0X3RpbWVzdGFtcF9kZWx0YV91cyhp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF90aW1lc3RhbXBfYWJzb2x1dGVfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RocmVhZF90aW1lX2RlbHRhX3VzKGlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3RocmVhZF90aW1lX2Fic29sdXRlX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMTcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90aHJlYWRfaW5zdHJ1Y3Rpb25fY291
bnRfZGVsdGEoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50X2Fic29sdXRlKGludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMjAsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQ+IFQqIHNldF9sZWdhY3lfZXZlbnQo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2KTsKKyAgfQorCit9OworCitj
bGFzcyBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMTksIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVHJhY2tFdmVudF9MZWdhY3lF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19uYW1lX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBuYW1lX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
dWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcGhhc2UoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCBwaGFzZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50
MzIoKTsgfQorICBib29sIGhhc19kdXJhdGlvbl91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
dmFsaWQoKTsgfQorICBpbnQ2NF90IGR1cmF0aW9uX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RocmVhZF9kdXJhdGlvbl91cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHRocmVhZF9kdXJhdGlvbl91cygp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc190aHJlYWRf
aW5zdHJ1Y3Rpb25fZGVsdGEoKSBjb25zdCB7IHJldHVybiBhdDwxNT4oKS52YWxpZCgpOyB9Cisg
IGludDY0X3QgdGhyZWFkX2luc3RydWN0aW9uX2RlbHRhKCkgY29uc3QgeyByZXR1cm4gYXQ8MTU+
KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc191bnNjb3BlZF9pZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB1bnNjb3BlZF9pZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDY+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbG9jYWxfaWQoKSBjb25zdCB7
IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGxvY2FsX2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTA+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZ2xvYmFsX2lkKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBnbG9iYWxfaWQo
KSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pZF9z
Y29wZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBpZF9zY29wZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfc3RyaW5nKCk7
IH0KKyAgYm9vbCBoYXNfdXNlX2FzeW5jX3R0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFs
aWQoKTsgfQorICBib29sIHVzZV9hc3luY190dHMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFz
X2Jvb2woKTsgfQorICBib29sIGhhc19iaW5kX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJpbmRfaWQoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2JpbmRfdG9fZW5jbG9zaW5nKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTI+KCkudmFsaWQoKTsgfQorICBib29sIGJpbmRfdG9fZW5jbG9zaW5nKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTI+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2Zsb3dfZGlyZWN0aW9u
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGZsb3dfZGly
ZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhh
c19pbnN0YW50X2V2ZW50X3Njb3BlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCkudmFsaWQoKTsg
fQorICBpbnQzMl90IGluc3RhbnRfZXZlbnRfc2NvcGUoKSBjb25zdCB7IHJldHVybiBhdDwxND4o
KS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BpZF9vdmVycmlkZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE4PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwaWRfb3ZlcnJpZGUoKSBjb25zdCB7IHJl
dHVybiBhdDwxOD4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RpZF9vdmVycmlkZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE5PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCB0aWRfb3ZlcnJpZGUo
KSBjb25zdCB7IHJldHVybiBhdDwxOT4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUlpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGhh
c2VGaWVsZE51bWJlciA9IDIsCisgICAga0R1cmF0aW9uVXNGaWVsZE51bWJlciA9IDMsCisgICAg
a1RocmVhZER1cmF0aW9uVXNGaWVsZE51bWJlciA9IDQsCisgICAga1RocmVhZEluc3RydWN0aW9u
RGVsdGFGaWVsZE51bWJlciA9IDE1LAorICAgIGtVbnNjb3BlZElkRmllbGROdW1iZXIgPSA2LAor
ICAgIGtMb2NhbElkRmllbGROdW1iZXIgPSAxMCwKKyAgICBrR2xvYmFsSWRGaWVsZE51bWJlciA9
IDExLAorICAgIGtJZFNjb3BlRmllbGROdW1iZXIgPSA3LAorICAgIGtVc2VBc3luY1R0c0ZpZWxk
TnVtYmVyID0gOSwKKyAgICBrQmluZElkRmllbGROdW1iZXIgPSA4LAorICAgIGtCaW5kVG9FbmNs
b3NpbmdGaWVsZE51bWJlciA9IDEyLAorICAgIGtGbG93RGlyZWN0aW9uRmllbGROdW1iZXIgPSAx
MywKKyAgICBrSW5zdGFudEV2ZW50U2NvcGVGaWVsZE51bWJlciA9IDE0LAorICAgIGtQaWRPdmVy
cmlkZUZpZWxkTnVtYmVyID0gMTgsCisgICAga1RpZE92ZXJyaWRlRmllbGROdW1iZXIgPSAxOSwK
KyAgfTsKKyAgdXNpbmcgRmxvd0RpcmVjdGlvbiA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJv
OjpUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb247CisgIHVzaW5nIEluc3RhbnRF
dmVudFNjb3BlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnRfTGVnYWN5
RXZlbnRfSW5zdGFudEV2ZW50U2NvcGU7CisgIHN0YXRpYyBjb25zdCBGbG93RGlyZWN0aW9uIEZM
T1dfVU5TUEVDSUZJRUQgPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb25fRkxP
V19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IEZsb3dEaXJlY3Rpb24gRkxPV19JTiA9IFRy
YWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9XX0lOOworICBzdGF0aWMgY29u
c3QgRmxvd0RpcmVjdGlvbiBGTE9XX09VVCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0Rp
cmVjdGlvbl9GTE9XX09VVDsKKyAgc3RhdGljIGNvbnN0IEZsb3dEaXJlY3Rpb24gRkxPV19JTk9V
VCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9XX0lOT1VUOworICBz
dGF0aWMgY29uc3QgSW5zdGFudEV2ZW50U2NvcGUgU0NPUEVfVU5TUEVDSUZJRUQgPSBUcmFja0V2
ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX1VOU1BFQ0lGSUVEOworICBz
dGF0aWMgY29uc3QgSW5zdGFudEV2ZW50U2NvcGUgU0NPUEVfR0xPQkFMID0gVHJhY2tFdmVudF9M
ZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9TQ09QRV9HTE9CQUw7CisgIHN0YXRpYyBjb25z
dCBJbnN0YW50RXZlbnRTY29wZSBTQ09QRV9QUk9DRVNTID0gVHJhY2tFdmVudF9MZWdhY3lFdmVu
dF9JbnN0YW50RXZlbnRTY29wZV9TQ09QRV9QUk9DRVNTOworICBzdGF0aWMgY29uc3QgSW5zdGFu
dEV2ZW50U2NvcGUgU0NPUEVfVEhSRUFEID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50
RXZlbnRTY29wZV9TQ09QRV9USFJFQUQ7CisgIHZvaWQgc2V0X25hbWVfaWlkKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9waGFz
ZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9kdXJhdGlvbl91cyhpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90aHJlYWRfZHVyYXRpb25fdXMoaW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGhyZWFk
X2luc3RydWN0aW9uX2RlbHRhKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTUs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91bnNjb3BlZF9pZCh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbG9jYWxfaWQodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTAsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9nbG9iYWxfaWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9pZF9zY29wZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUp
IHsKKyAgICBBcHBlbmRCeXRlcyg3LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0K
KyAgdm9pZCBzZXRfaWRfc2NvcGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAg
ICBBcHBlbmRCeXRlcyg3LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF91c2VfYXN5bmNf
dHRzKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDksIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9iaW5kX2lkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDgs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9iaW5kX3RvX2VuY2xvc2luZyhib29sIHZhbHVlKSB7
CisgICAgQXBwZW5kVGlueVZhckludCgxMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Zsb3df
ZGlyZWN0aW9uKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50X0xlZ2FjeUV2
ZW50X0Zsb3dEaXJlY3Rpb24gdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEzLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5zdGFudF9ldmVudF9zY29wZSg6OnBlcmZldHRvOjpwcm90
b3M6OnBiemVybzo6VHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZSB2YWx1
ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMTQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9w
aWRfb3ZlcnJpZGUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxOCwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3RpZF9vdmVycmlkZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDE5LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBO
YW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAor
ICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo
ZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29t
cGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRo
ZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMv
TElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3Ig
YWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUg
TGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBX
QVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGlt
cGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zl
cm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K
KyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9UUkFDS19F
VkVOVF9JTlRFUk5BTF9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJO
QUxfVFJBQ0tfRVZFTlRfSU5URVJOQUxfSF8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9mbGF0X3NldC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1
ZmZlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
dHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvZGVidWdfYW5ub3RhdGlvbi5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjZV93
cml0ZXJfYmFzZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vdHJhY2luZy90cmFjay5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9idWlsdGluX2Nsb2NrLnBiemVyby5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNl
L2ludGVybmVkX2RhdGEvaW50ZXJuZWRfZGF0YS5wYnplcm8uaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC90
cmFja19ldmVudC5wYnplcm8uaCIKKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CitjbGFzcyBFdmVudENvbnRleHQ7CitzdHJ1Y3QgQ2F0ZWdvcnk7Citu
YW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xhc3MgVHJhY2tFdmVudENvbmZp
ZzsKK30gIC8vIG5hbWVzcGFjZSBnZW4KK25hbWVzcGFjZSBwYnplcm8geworY2xhc3MgRGVidWdB
bm5vdGF0aW9uOworfSAgLy8gbmFtZXNwYWNlIHBiemVybworfSAgLy8gbmFtZXNwYWNlIHByb3Rv
cworCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0
cnk7CisKK2NsYXNzIEJhc2VUcmFja0V2ZW50SW50ZXJuZWREYXRhSW5kZXggeworIHB1YmxpYzoK
KyAgdmlydHVhbCB+QmFzZVRyYWNrRXZlbnRJbnRlcm5lZERhdGFJbmRleCgpOworCisjaWYgUEVS
RkVUVE9fRENIRUNLX0lTX09OKCkKKyAgY29uc3QgY2hhciogdHlwZV9pZF8gPSBudWxscHRyOwor
I2VuZGlmICAvLyBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorfTsKKworc3RydWN0IFRyYWNrRXZl
bnRJbmNyZW1lbnRhbFN0YXRlIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heEludGVy
bmVkRGF0YUZpZWxkcyA9IDMyOworCisgIGJvb2wgd2FzX2NsZWFyZWQgPSB0cnVlOworCisgIC8v
IEEgaGVhcC1hbGxvY2F0ZWQgbWVzc2FnZSBmb3Igc3RvcmluZyBuZXdseSBzZWVuIGludGVybmVk
IGRhdGEgd2hpbGUgd2UgYXJlCisgIC8vIGluIHRoZSBtaWRkbGUgb2Ygd3JpdGluZyBhIHRyYWNr
IGV2ZW50LiBXaGVuIGEgdHJhY2sgZXZlbnQgd2FudHMgdG8gd3JpdGUKKyAgLy8gbmV3IGludGVy
bmVkIGRhdGEgaW50byB0aGUgdHJhY2UsIGl0IGlzIGZpcnN0IHNlcmlhbGl6ZWQgaW50byB0aGlz
IG1lc3NhZ2UKKyAgLy8gYW5kIHRoZW4gZmx1c2hlZCB0byB0aGUgcmVhbCB0cmFjZSBpbiBFdmVu
dENvbnRleHQgd2hlbiB0aGUgcGFja2V0IGVuZHMuCisgIC8vIFRoZSBtZXNzYWdlIGlzIGNhY2hl
ZCBoZXJlIGFzIGEgcGFydCBvZiBpbmNyZW1lbnRhbCBzdGF0ZSBzbyB0aGF0IHdlIGNhbgorICAv
LyByZXVzZSB0aGUgdW5kZXJseWluZyBidWZmZXIgYWxsb2NhdGlvbiBmb3Igc3Vic2VxdWVudGx5
IHdyaXR0ZW4gaW50ZXJuZWQKKyAgLy8gZGF0YS4KKyAgcHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8
cHJvdG9zOjpwYnplcm86OkludGVybmVkRGF0YT4KKyAgICAgIHNlcmlhbGl6ZWRfaW50ZXJuZWRf
ZGF0YTsKKworICAvLyBJbi1tZW1vcnkgaW5kaWNlcyBmb3IgbG9va2luZyB1cCBpbnRlcm5lZCBk
YXRhIGlkcy4KKyAgLy8gRm9yIGVhY2ggaW50ZXJuLWFibGUgZmllbGQgKHVwIHRvIGEgbWF4IG9m
IDMyKSB3ZSBrZWVwIGEgZGljdGlvbmFyeSBvZgorICAvLyBmaWVsZC12YWx1ZSAtPiBpbnRlcm5p
bmcta2V5LiBEZXBlbmRpbmcgb24gdGhlIHR5cGUgd2UgZWl0aGVyIGtlZXAgdGhlIGZ1bGwKKyAg
Ly8gdmFsdWUgb3IgYSBoYXNoIG9mIGl0IChTZWUgdHJhY2tfZXZlbnRfaW50ZXJuZWRfZGF0YV9p
bmRleC5oKQorICB1c2luZyBJbnRlcm5lZERhdGFJbmRleCA9CisgICAgICBzdGQ6OnBhaXI8Lyog
aW50ZXJuZWRfZGF0YS5wcm90byBmaWVsZCBudW1iZXIgKi8gc2l6ZV90LAorICAgICAgICAgICAg
ICAgIHN0ZDo6dW5pcXVlX3B0cjxCYXNlVHJhY2tFdmVudEludGVybmVkRGF0YUluZGV4Pj47Cisg
IHN0ZDo6YXJyYXk8SW50ZXJuZWREYXRhSW5kZXgsIGtNYXhJbnRlcm5lZERhdGFGaWVsZHM+IGlu
dGVybmVkX2RhdGFfaW5kaWNlcyA9CisgICAgICB7fTsKKworICAvLyBUcmFjayB1dWlkcyBmb3Ig
d2hpY2ggd2UgaGF2ZSB3cml0dGVuIGRlc2NyaXB0b3JzIGludG8gdGhlIHRyYWNlLiBJZiBhCisg
IC8vIHRyYWNlIGV2ZW50IHVzZXMgYSB0cmFjayB3aGljaCBpcyBub3QgaW4gdGhpcyBzZXQsIHdl
J2xsIHdyaXRlIG91dCBhCisgIC8vIGRlc2NyaXB0b3IgZm9yIGl0LgorICBiYXNlOjpGbGF0U2V0
PHVpbnQ2NF90PiBzZWVuX3RyYWNrczsKKworICAvLyBEeW5hbWljYWxseSByZWdpc3RlcmVkIGNh
dGVnb3J5IG5hbWVzIHRoYXQgaGF2ZSBiZWVuIGVuY291bnRlcmVkIGR1cmluZworICAvLyB0aGlz
IHRyYWNpbmcgc2Vzc2lvbi4gVGhlIHZhbHVlIGluIHRoZSBtYXAgaW5kaWNhdGVzIHdoZXRoZXIg
dGhlIGNhdGVnb3J5CisgIC8vIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgIHN0ZDo6dW5vcmRl
cmVkX21hcDxzdGQ6OnN0cmluZywgYm9vbD4gZHluYW1pY19jYXRlZ29yaWVzOworfTsKKworLy8g
VGhlIGJhY2tlbmQgcG9ydGlvbiBvZiB0aGUgdHJhY2sgZXZlbnQgdHJhY2UgcG9pbnQgaW1wbGVt
ZW50aW9uLiBPdXRsaW5lZCB0bworLy8gYSBzZXBhcmF0ZSAuY2MgZmlsZSBzbyBpdCBjYW4gYmUg
c2hhcmVkIGJ5IGRpZmZlcmVudCB0cmFjayBldmVudCBjYXRlZ29yeQorLy8gbmFtZXNwYWNlcy4K
K2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFja0V2ZW50SW50ZXJuYWwgeworIHB1YmxpYzoKKyAg
c3RhdGljIGJvb2wgSW5pdGlhbGl6ZSgKKyAgICAgIGNvbnN0IFRyYWNrRXZlbnRDYXRlZ29yeVJl
Z2lzdHJ5JiwKKyAgICAgIGJvb2wgKCpyZWdpc3Rlcl9kYXRhX3NvdXJjZSkoY29uc3QgRGF0YVNv
dXJjZURlc2NyaXB0b3ImKSk7CisKKyAgc3RhdGljIHZvaWQgRW5hYmxlVHJhY2luZyhjb25zdCBU
cmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeSYgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgcHJvdG9zOjpnZW46OlRyYWNrRXZlbnRDb25maWcmIGNvbmZpZywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnN0YW5jZV9pbmRleCk7CisgIHN0
YXRpYyB2b2lkIERpc2FibGVUcmFjaW5nKGNvbnN0IFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5
JiByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5zdGFu
Y2VfaW5kZXgpOworICBzdGF0aWMgYm9vbCBJc0NhdGVnb3J5RW5hYmxlZChjb25zdCBUcmFja0V2
ZW50Q2F0ZWdvcnlSZWdpc3RyeSYgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IHByb3Rvczo6Z2VuOjpUcmFja0V2ZW50Q29uZmlnJiBjb25maWcsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhdGVnb3J5JiBjYXRlZ29yeSk7CisK
KyAgc3RhdGljIHBlcmZldHRvOjpFdmVudENvbnRleHQgV3JpdGVFdmVudCgKKyAgICAgIFRyYWNl
V3JpdGVyQmFzZSosCisgICAgICBUcmFja0V2ZW50SW5jcmVtZW50YWxTdGF0ZSosCisgICAgICBj
b25zdCBDYXRlZ29yeSogY2F0ZWdvcnksCisgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAg
cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUeXBlLAorICAgICAgdWludDY0
X3QgdGltZXN0YW1wID0gR2V0VGltZU5zKCkpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgor
ICBzdGF0aWMgdm9pZCBBZGREZWJ1Z0Fubm90YXRpb24ocGVyZmV0dG86OkV2ZW50Q29udGV4dCog
ZXZlbnRfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciog
bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQmJiB2YWx1ZSkgeworICAg
IGF1dG8gYW5ub3RhdGlvbiA9IEFkZERlYnVnQW5ub3RhdGlvbihldmVudF9jdHgsIG5hbWUpOwor
ICAgIFdyaXRlRGVidWdBbm5vdGF0aW9uKGFubm90YXRpb24sIHZhbHVlKTsKKyAgfQorCisgIC8v
IElmIHRoZSBnaXZlbiB0cmFjayBoYXNuJ3QgYmVlbiBzZWVuIGJ5IHRoZSB0cmFjZSB3cml0ZXIg
eWV0LCB3cml0ZSBhCisgIC8vIGRlc2NyaXB0b3IgZm9yIGl0IGludG8gdGhlIHRyYWNlLiBEb2Vz
bid0IHRha2UgYSBsb2NrIHVubGVzcyB0aGUgdHJhY2sKKyAgLy8gZGVzY3JpcHRvciBpcyBuZXcu
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUcmFja1R5cGU+CisgIHN0YXRpYyB2b2lkIFdyaXRlVHJh
Y2tEZXNjcmlwdG9ySWZOZWVkZWQoCisgICAgICBjb25zdCBUcmFja1R5cGUmIHRyYWNrLAorICAg
ICAgVHJhY2VXcml0ZXJCYXNlKiB0cmFjZV93cml0ZXIsCisgICAgICBUcmFja0V2ZW50SW5jcmVt
ZW50YWxTdGF0ZSogaW5jcl9zdGF0ZSkgeworICAgIGF1dG8gaXRfYW5kX2luc2VydGVkID0gaW5j
cl9zdGF0ZS0+c2Vlbl90cmFja3MuaW5zZXJ0KHRyYWNrLnV1aWQpOworICAgIGlmIChQRVJGRVRU
T19MSUtFTFkoIWl0X2FuZF9pbnNlcnRlZC5zZWNvbmQpKQorICAgICAgcmV0dXJuOworICAgIFdy
aXRlVHJhY2tEZXNjcmlwdG9yKHRyYWNrLCB0cmFjZV93cml0ZXIpOworICB9CisKKyAgLy8gVW5j
b25kaXRpb25hbGx5IHdyaXRlIGEgdHJhY2sgZGVzY3JpcHRvciBpbnRvIHRoZSB0cmFjZS4KKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFRyYWNrVHlwZT4KKyAgc3RhdGljIHZvaWQgV3JpdGVUcmFja0Rl
c2NyaXB0b3IoY29uc3QgVHJhY2tUeXBlJiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgVHJhY2VXcml0ZXJCYXNlKiB0cmFjZV93cml0ZXIpIHsKKyAgICBUcmFja1Jl
Z2lzdHJ5OjpHZXQoKS0+U2VyaWFsaXplVHJhY2soCisgICAgICAgIHRyYWNrLCBOZXdUcmFjZVBh
Y2tldCh0cmFjZV93cml0ZXIsIEdldFRpbWVOcygpKSk7CisgIH0KKworICAvLyBHZXQgdGhlIGN1
cnJlbnQgdGltZSBpbiBuYW5vc2Vjb25kcyBpbiB0aGUgdHJhY2UgY2xvY2sgdGltZWJhc2UuCisg
IHN0YXRpYyB1aW50NjRfdCBHZXRUaW1lTnMoKTsKKworICAvLyBHZXQgdGhlIGNsb2NrIHVzZWQg
YnkgR2V0VGltZU5zKCkuCisgIHN0YXRpYyBjb25zdGV4cHIgcHJvdG9zOjpwYnplcm86OkJ1aWx0
aW5DbG9jayBHZXRDbG9ja0lkKCkgeworI2lmICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9f
T1NfTUFDT1NYKSAmJiBcCisgICAgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4p
CisgICAgcmV0dXJuIHByb3Rvczo6cGJ6ZXJvOjpCVUlMVElOX0NMT0NLX0JPT1RUSU1FOworI2Vs
c2UKKyAgICByZXR1cm4gcHJvdG9zOjpwYnplcm86OkJVSUxUSU5fQ0xPQ0tfTU9OT1RPTklDOwor
I2VuZGlmCisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIFJlc2V0SW5jcmVtZW50YWxT
dGF0ZShUcmFjZVdyaXRlckJhc2UqLCB1aW50NjRfdCB0aW1lc3RhbXApOworICBzdGF0aWMgcHJv
dG96ZXJvOjpNZXNzYWdlSGFuZGxlPHByb3Rvczo6cGJ6ZXJvOjpUcmFjZVBhY2tldD4gTmV3VHJh
Y2VQYWNrZXQoCisgICAgICBUcmFjZVdyaXRlckJhc2UqLAorICAgICAgdWludDY0X3QgdGltZXN0
YW1wLAorICAgICAgdWludDMyX3Qgc2VxX2ZsYWdzID0KKyAgICAgICAgICBwcm90b3M6OnBiemVy
bzo6VHJhY2VQYWNrZXQ6OlNFUV9ORUVEU19JTkNSRU1FTlRBTF9TVEFURSk7CisgIHN0YXRpYyBw
cm90b3M6OnBiemVybzo6RGVidWdBbm5vdGF0aW9uKiBBZGREZWJ1Z0Fubm90YXRpb24oCisgICAg
ICBwZXJmZXR0bzo6RXZlbnRDb250ZXh0KiwKKyAgICAgIGNvbnN0IGNoYXIqIG5hbWUpOworfTsK
KworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKwor
I2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfVFJBQ0tfRVZFTlRf
SU5URVJOQUxfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBT
b3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwg
VmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmls
ZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRh
aW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNo
ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw
bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli
dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT
LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl
ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp
YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl
ciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19F
VkVOVF9DT05URVhUX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19FVkVOVF9D
T05URVhUX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9tZXNzYWdlX2hhbmRsZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9pbnRlcm5hbC90cmFja19ldmVudF9pbnRl
cm5hbC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3Bl
cmZldHRvL3RyYWNlL3RyYWNlX3BhY2tldC5wYnplcm8uaCIKKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBUcmFja0V2ZW50SW50ZXJuYWw7Cit9CisK
Ky8vIEFsbG93cyBhZGRpbmcgY3VzdG9tIGFyZ3VtZW50cyBpbnRvIHRyYWNrIGV2ZW50cy4gRXhh
bXBsZToKKy8vCisvLyAgIFRSQUNFX0VWRU5UX0JFR0lOKCJjYXRlZ29yeSIsICJUaXRsZSIsCisv
LyAgICAgICAgICAgICAgICAgICAgIFtdKHBlcmZldHRvOjpFdmVudENvbnRleHQgY3R4KSB7Cisv
LyAgICAgICAgICAgICAgICAgICAgICAgYXV0byogZGJnID0gY3R4LmV2ZW50KCktPmFkZF9kZWJ1
Z19hbm5vdGF0aW9ucygpOworLy8gICAgICAgICAgICAgICAgICAgICAgIGRiZy0+c2V0X25hbWUo
Im5hbWUiKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICBkYmctPnNldF9pbnRfdmFsdWUoMTIz
NCk7CisvLyAgICAgICAgICAgICAgICAgICAgIH0pOworLy8KK2NsYXNzIFBFUkZFVFRPX0VYUE9S
VCBFdmVudENvbnRleHQgeworIHB1YmxpYzoKKyAgRXZlbnRDb250ZXh0KEV2ZW50Q29udGV4dCYm
KSA9IGRlZmF1bHQ7CisKKyAgLy8gRm9yIENocm9taXVtIGR1cmluZyB0aGUgdHJhbnNpdGlvbiBw
aGFzZSB0byB0aGUgY2xpZW50IGxpYnJhcnkuCisgIC8vIFRPRE8oZXNlY2tsZXIpOiBSZW1vdmUg
b25jZSBDaHJvbWl1bSBoYXMgc3dpdGNoZWQgdG8gY2xpZW50IGxpYiBlbnRpcmVseS4KKyAgZXhw
bGljaXQgRXZlbnRDb250ZXh0KHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50KiBldmVudCkKKyAg
ICAgIDogZXZlbnRfKGV2ZW50KSwgaW5jcmVtZW50YWxfc3RhdGVfKG51bGxwdHIpIHt9CisKKyAg
fkV2ZW50Q29udGV4dCgpOworCisgIHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50KiBldmVudCgp
IGNvbnN0IHsgcmV0dXJuIGV2ZW50XzsgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lLCBzaXplX3QsIHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgZnJpZW5kIGNsYXNzIFRyYWNrRXZl
bnRJbnRlcm5lZERhdGFJbmRleDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUcmFja0V2ZW50
SW50ZXJuYWw7CisKKyAgdXNpbmcgVHJhY2VQYWNrZXRIYW5kbGUgPQorICAgICAgOjpwcm90b3pl
cm86Ok1lc3NhZ2VIYW5kbGU8cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0PjsKKworICBFdmVu
dENvbnRleHQoVHJhY2VQYWNrZXRIYW5kbGUsIGludGVybmFsOjpUcmFja0V2ZW50SW5jcmVtZW50
YWxTdGF0ZSopOworICBFdmVudENvbnRleHQoY29uc3QgRXZlbnRDb250ZXh0JikgPSBkZWxldGU7
CisKKyAgVHJhY2VQYWNrZXRIYW5kbGUgdHJhY2VfcGFja2V0XzsKKyAgcHJvdG9zOjpwYnplcm86
OlRyYWNrRXZlbnQqIGV2ZW50XzsKKyAgaW50ZXJuYWw6OlRyYWNrRXZlbnRJbmNyZW1lbnRhbFN0
YXRlKiBpbmNyZW1lbnRhbF9zdGF0ZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8K
KworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfRVZFTlRfQ09OVEVYVF9IXwor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3RyYWNpbmcvZXZlbnRfY29udGV4dC5oIgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvaW50ZXJuZWRfZGF0YS9pbnRlcm5lZF9k
YXRhLnBiemVyby5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJv
dG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3RyYWNrX2V2ZW50LnBiemVyby5oIgorCitu
YW1lc3BhY2UgcGVyZmV0dG8geworCitFdmVudENvbnRleHQ6OkV2ZW50Q29udGV4dCgKKyAgICBF
dmVudENvbnRleHQ6OlRyYWNlUGFja2V0SGFuZGxlIHRyYWNlX3BhY2tldCwKKyAgICBpbnRlcm5h
bDo6VHJhY2tFdmVudEluY3JlbWVudGFsU3RhdGUqIGluY3JlbWVudGFsX3N0YXRlKQorICAgIDog
dHJhY2VfcGFja2V0XyhzdGQ6Om1vdmUodHJhY2VfcGFja2V0KSksCisgICAgICBldmVudF8odHJh
Y2VfcGFja2V0Xy0+c2V0X3RyYWNrX2V2ZW50KCkpLAorICAgICAgaW5jcmVtZW50YWxfc3RhdGVf
KGluY3JlbWVudGFsX3N0YXRlKSB7fQorCitFdmVudENvbnRleHQ6On5FdmVudENvbnRleHQoKSB7
CisgIGlmICghdHJhY2VfcGFja2V0XykKKyAgICByZXR1cm47CisKKyAgLy8gV2hlbiB0aGUgdHJh
Y2sgZXZlbnQgaXMgZmluYWxpemVkIChpLmUuLCB0aGUgY29udGV4dCBpcyBkZXN0cm95ZWQpLCB3
ZQorICAvLyBzaG91bGQgZmx1c2ggYW55IG5ld2x5IHNlZW4gaW50ZXJuZWQgZGF0YSB0byB0aGUg
dHJhY2UuIFRoZSBkYXRhIGhhcworICAvLyBlYXJsaWVyIGJlZW4gd3JpdHRlbiB0byBhIGhlYXAg
YWxsb2NhdGVkIHByb3RvYnVmIG1lc3NhZ2UKKyAgLy8gKHxzZXJpYWxpemVkX2ludGVybmVkX2Rh
dGF8KS4gSGVyZSB3ZSBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgdG8gdGhlIG1haW4KKyAgLy8gdHJh
Y2UuCisgIGF1dG8mIHNlcmlhbGl6ZWRfaW50ZXJuZWRfZGF0YSA9IGluY3JlbWVudGFsX3N0YXRl
Xy0+c2VyaWFsaXplZF9pbnRlcm5lZF9kYXRhOworICBpZiAoUEVSRkVUVE9fTElLRUxZKHNlcmlh
bGl6ZWRfaW50ZXJuZWRfZGF0YS5lbXB0eSgpKSkKKyAgICByZXR1cm47CisKKyAgYXV0byByYW5n
ZXMgPSBzZXJpYWxpemVkX2ludGVybmVkX2RhdGEuR2V0UmFuZ2VzKCk7CisgIHRyYWNlX3BhY2tl
dF8tPkFwcGVuZFNjYXR0ZXJlZEJ5dGVzKAorICAgICAgcGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJv
OjpUcmFjZVBhY2tldDo6a0ludGVybmVkRGF0YUZpZWxkTnVtYmVyLAorICAgICAgJnJhbmdlc1sw
XSwgcmFuZ2VzLnNpemUoKSk7CisKKyAgLy8gUmVzZXQgdGhlIG1lc3NhZ2UgYnV0IGtlZXAgb25l
IGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIGZ1dHVyZSB1c2UuCisgIHNlcmlhbGl6ZWRfaW50ZXJuZWRf
ZGF0YS5SZXNldCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFjaW5nL2ludGVybmFsL3RyYWNpbmdfbXV4ZXJf
aW1wbC5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogc3JjL3RyYWNpbmcvaW50
ZXJuYWwvdHJhY2luZ19tdXhlcl9pbXBsLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFk
ZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy9jb3JlL2RhdGFfc291cmNlX2Rlc2NyaXB0b3Iu
aAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9q
ZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIu
MCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBp
biBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkg
b2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNl
bnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxh
dyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVy
IHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRI
T1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mg
b3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdl
IGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNl
bnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NPUkVfREFUQV9T
T1VSQ0VfREVTQ1JJUFRPUl9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfQ09S
RV9EQVRBX1NPVVJDRV9ERVNDUklQVE9SX0hfCisKKy8vIENyZWF0ZXMgdGhlIGFsaWFzZXMgaW4g
dGhlIDo6cGVyZmV0dG8gbmFtZXNwYWNlLCBkb2luZyB0aGluZ3MgbGlrZToKKy8vIHVzaW5nIDo6
cGVyZmV0dG86OkZvbyA9IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpGb28uCisvLyBTZWUgY29t
bWVudHMgaW4gZm9yd2FyZF9kZWNscy5oIGZvciB0aGUgaGlzdG9yaWNhbCByZWFzb25zIG9mIHRo
aXMKKy8vIGluZGlyZWN0aW9uIGxheWVyLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9k
YXRhX3NvdXJjZV9kZXNjcmlwdG9yLmdlbi5oIgorCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVU
VE9fVFJBQ0lOR19DT1JFX0RBVEFfU09VUkNFX0RFU0NSSVBUT1JfSF8KKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy9jb3JlL3RyYWNlX2Nv
bmZpZy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNl
IFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn
L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi
bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAq
IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhl
IExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfQ09SRV9U
UkFDRV9DT05GSUdfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NPUkVfVFJB
Q0VfQ09ORklHX0hfCisKKy8vIENyZWF0ZXMgdGhlIGFsaWFzZXMgaW4gdGhlIDo6cGVyZmV0dG8g
bmFtZXNwYWNlLCBkb2luZyB0aGluZ3MgbGlrZToKKy8vIHVzaW5nIDo6cGVyZmV0dG86OkZvbyA9
IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpGb28uCisvLyBTZWUgY29tbWVudHMgaW4gZm9yd2Fy
ZF9kZWNscy5oIGZvciB0aGUgaGlzdG9yaWNhbCByZWFzb25zIG9mIHRoaXMKKy8vIGluZGlyZWN0
aW9uIGxheWVyLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy90cmFjZV9jb25maWcuZ2Vu
LmgiCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NPUkVfVFJBQ0VfQ09O
RklHX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRv
L3RyYWNpbmcvdHJhY2luZy5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNs
dWRlL3BlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvaW5fcHJvY2Vzc190cmFjaW5nX2JhY2tlbmQu
aAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFj
aW5nL3RyYWNpbmdfYmFja2VuZC5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRy
b2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hl
IExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDov
L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVp
cmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQor
ICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFT
IElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0
aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRh
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRP
X1RSQUNJTkdfVFJBQ0lOR19CQUNLRU5EX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJB
Q0lOR19UUkFDSU5HX0JBQ0tFTkRfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxz
dHJpbmc+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2Jhc2UvZXhwb3J0LmgiCisKKy8vIFRoZSBlbWJlZGRlciBjYW4gKGJ1dCBkb2Vzbid0IGhhdmUg
dG8pIGV4dGVuZCB0aGUgVHJhY2luZ0JhY2tlbmQgY2xhc3MgYW5kCisvLyBwYXNzIGFzIGFuIGFy
Z3VtZW50IHRvIFRyYWNpbmc6OkluaXRpYWxpemUoa0N1c3RvbUJhY2tlbmQpIHRvIG92ZXJyaWRl
IHRoZQorLy8gd2F5IHRvIHJlYWNoIHRoZSBzZXJ2aWNlLiBUaGlzIGlzIGZvciBwZWN1bGlhciBj
YXNlcyB3aGVyZSB0aGUgZW1iZWRkZXIgaGFzCisvLyBhIG11bHRpLXByb2Nlc3MgYXJjaGl0ZWN0
dXJlIGFuZCB3YW50cyB0byBvdmVycmlkZSB0aGUgSVBDIHRyYW5zcG9ydC4gVGhlCisvLyByZWFs
IHVzZS1jYXNlIGZvciB0aGlzIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcgaXMgY2hyb21pdW0gKCsg
TW9qbyBJUEMpLgorLy8gRXh0ZW5kaW5nIHRoaXMgY2xhc3MgcmVxdWlyZXMgZGVwZW5kaW5nIG9u
IHRoZSBmdWxsIHNldCBvZiBwZXJmZXR0byBoZWFkZXJzCisvLyAobm90IGp1c3QgL3B1YmxpYy8p
LiBDb250YWN0IHRoZSB0ZWFtIGJlZm9yZSBkb2luZyBzbyBhcyB0aGUgbm9uLXB1YmxpYworLy8g
aGVhZGVycyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgQVBJIHN0YWJsZS4KKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKKworbmFtZXNwYWNlIGJhc2UgeworY2xhc3MgVGFza1J1bm5lcjsKK30KKwor
Ly8gVGhlc2UgY2xhc3NlcyBhcmUgZGVjbGFyZWQgaW4gaGVhZGVycyBvdXRzaWRlIG9mIC9wdWJs
aWMvLgorY2xhc3MgQ29uc3VtZXI7CitjbGFzcyBDb25zdW1lckVuZHBvaW50OworY2xhc3MgUHJv
ZHVjZXI7CitjbGFzcyBQcm9kdWNlckVuZHBvaW50OworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
VHJhY2luZ0JhY2tlbmQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VHJhY2luZ0JhY2tlbmQoKTsK
KworICAvLyBDb25uZWN0cyBhIFByb2R1Y2VyIGluc3RhbmNlIGFuZCBvYnRhaW5zIGEgUHJvZHVj
ZXJFbmRwb2ludCwgd2hpY2ggaXMKKyAgLy8gZXNzZW50aWFsbHkgYSAxOjEgY2hhbm5lbCBiZXR3
ZWVuIG9uZSBQcm9kdWNlciBhbmQgdGhlIFNlcnZpY2UuCisgIC8vIFRvIGRpc2Nvbm5lY3QganVz
dCBkZXN0cm95IHRoZSByZXR1cm5lZCBlbmRwb2ludCBvYmplY3QuIEl0IGlzIHNhZmUgdG8KKyAg
Ly8gZGVzdHJveSB0aGUgUHJvZHVjZXIgb25jZSBQcm9kdWNlcjo6T25EaXNjb25uZWN0KCkgaGFz
IGJlZW4gaW52b2tlZC4KKyAgc3RydWN0IENvbm5lY3RQcm9kdWNlckFyZ3MgeworICAgIHN0ZDo6
c3RyaW5nIHByb2R1Y2VyX25hbWU7CisKKyAgICAvLyBUaGUgUHJvZHVjZXIgb2JqZWN0IHRoYXQg
d2lsbCByZWNlaXZlIGNhbGxzIGxpa2UgU3RhcnQvU3RvcERhdGFTb3VyY2UoKS4KKyAgICAvLyBU
aGUgY2FsbGVyIGhhcyB0byBndWFyYW50ZWUgdGhhdCB0aGlzIG9iamVjdCBpcyB2YWxpZCBhcyBs
b25nIGFzIHRoZQorICAgIC8vIHJldHVybmVkIFByb2R1Y2VyRW5kcG9pbnQgaXMgYWxpdmUuCisg
ICAgUHJvZHVjZXIqIHByb2R1Y2VyID0gbnVsbHB0cjsKKworICAgIC8vIFRoZSB0YXNrIHJ1bm5l
ciB3aGVyZSB0aGUgUHJvZHVjZXIgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBvbnRvLgorICAgIC8v
IFRoZSBjYWxsZXIgaGFzIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBwYXNzZWQgVGFza1J1bm5lciBp
cyB2YWxpZCBhcyBsb25nCisgICAgLy8gYXMgdGhlIHJldHVybmVkIFByb2R1Y2VyRW5kcG9pbnQg
aXMgYWxpdmUuCisgICAgOjpwZXJmZXR0bzo6YmFzZTo6VGFza1J1bm5lciogdGFza19ydW5uZXIg
PSBudWxscHRyOworCisgICAgLy8gVGhlc2UgZ2V0IHByb3BhZ2F0ZWQgZnJvbSBUcmFjaW5nSW5p
dEFyZ3MgYW5kIGFyZSBvcHRpb25hbGx5IHByb3ZpZGVkIGJ5CisgICAgLy8gdGhlIGNsaWVudCB3
aGVuIGNhbGxpbmcgVHJhY2luZzo6SW5pdGlhbGl6ZSgpLgorICAgIHVpbnQzMl90IHNobWVtX3Np
emVfaGludF9ieXRlcyA9IDA7CisgICAgdWludDMyX3Qgc2htZW1fcGFnZV9zaXplX2hpbnRfYnl0
ZXMgPSAwOworICB9OworCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFByb2R1Y2VyRW5kcG9p
bnQ+IENvbm5lY3RQcm9kdWNlcigKKyAgICAgIGNvbnN0IENvbm5lY3RQcm9kdWNlckFyZ3MmKSA9
IDA7CisKKyAgLy8gQXMgYWJvdmUsIGZvciB0aGUgQ29uc3VtZXItc2lkZS4KKyAgc3RydWN0IENv
bm5lY3RDb25zdW1lckFyZ3MgeworICAgIC8vIFRoZSBDb25zdW1lciBvYmplY3QgdGhhdCB3aWxs
IHJlY2VpdmUgY2FsbHMgbGlrZSBPblRyYWNpbmdEaXNhYmxlZCgpLAorICAgIC8vIE9uVHJhY2VE
YXRhKCkuCisgICAgQ29uc3VtZXIqIGNvbnN1bWVye307CisKKyAgICAvLyBUaGUgdGFzayBydW5u
ZXIgd2hlcmUgdGhlIENvbnN1bWVyIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgb250by4KKyAgICA6
OnBlcmZldHRvOjpiYXNlOjpUYXNrUnVubmVyKiB0YXNrX3J1bm5lcnt9OworICB9OworICB2aXJ0
dWFsIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lckVuZHBvaW50PiBDb25uZWN0Q29uc3VtZXIoCisg
ICAgICBjb25zdCBDb25uZWN0Q29uc3VtZXJBcmdzJikgPSAwOworfTsKKworfSAgLy8gbmFtZXNw
YWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNJ
TkdfQkFDS0VORF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVu
IFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNl
LCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBm
aWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9i
dGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBh
Y2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBh
cHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3Ry
aWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFT
SVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0
aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNp
ZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVu
ZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5H
X0lOVEVSTkFMX0lOX1BST0NFU1NfVFJBQ0lOR19CQUNLRU5EX0hfCisjZGVmaW5lIElOQ0xVREVf
UEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9JTl9QUk9DRVNTX1RSQUNJTkdfQkFDS0VORF9IXwor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4
cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
dHJhY2luZy90cmFjaW5nX2JhY2tlbmQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworbmFt
ZXNwYWNlIGJhc2UgeworY2xhc3MgVGFza1J1bm5lcjsKK30KKworY2xhc3MgUHJvZHVjZXI7Citj
bGFzcyBUcmFjaW5nU2VydmljZTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBidWls
dC1pbiBpbXBsZW1lbnRhdGlvbiBvZiBUcmFjaW5nQmFja2VuZCB0aGF0IGNyZWF0ZXMgYSB0cmFj
aW5nIHNlcnZpY2UKKy8vIGluc3RhbmNlIGluLXByb2Nlc3MuIEluc3RhbnRpYXRlZCB3aGVuIHRo
ZSBlbWJlZGRlciBjYWxscworLy8gVHJhY2luZzo6SW5pdGlhbGl6ZShrSW5Qcm9jZXNzQmFja2Vu
ZCkuIFNvbHZlcyBtb3N0IGluLWFwcC1vbmx5IHRyYWNpbmcKKy8vIHVzZS1jYXNlcy4KK2NsYXNz
IFBFUkZFVFRPX0VYUE9SVCBJblByb2Nlc3NUcmFjaW5nQmFja2VuZCA6IHB1YmxpYyBUcmFjaW5n
QmFja2VuZCB7CisgcHVibGljOgorICBzdGF0aWMgVHJhY2luZ0JhY2tlbmQqIEdldEluc3RhbmNl
KCk7CisKKyAgLy8gVHJhY2luZ0JhY2tlbmQgaW1wbGVtZW50YXRpb24uCisgIHN0ZDo6dW5pcXVl
X3B0cjxQcm9kdWNlckVuZHBvaW50PiBDb25uZWN0UHJvZHVjZXIoCisgICAgICBjb25zdCBDb25u
ZWN0UHJvZHVjZXJBcmdzJikgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lckVu
ZHBvaW50PiBDb25uZWN0Q29uc3VtZXIoCisgICAgICBjb25zdCBDb25uZWN0Q29uc3VtZXJBcmdz
Jikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBJblByb2Nlc3NUcmFjaW5nQmFja2VuZCgpOwor
ICBUcmFjaW5nU2VydmljZSogR2V0T3JDcmVhdGVTZXJ2aWNlKGJhc2U6OlRhc2tSdW5uZXIqKTsK
KworICBzdGQ6OnVuaXF1ZV9wdHI8VHJhY2luZ1NlcnZpY2U+IHNlcnZpY2VfOworfTsKKworfSAg
Ly8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlm
ICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfSU5fUFJPQ0VTU19UUkFDSU5H
X0JBQ0tFTkRfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVy
ZmV0dG8vdHJhY2luZy9pbnRlcm5hbC9zeXN0ZW1fdHJhY2luZ19iYWNrZW5kLmgKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAq
IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGlj
ZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5j
ZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNl
bnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5T
RS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVk
IHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5z
ZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5U
SUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQu
CisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcg
cGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwor
CisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9TWVNURU1fVFJBQ0lO
R19CQUNLRU5EX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9T
WVNURU1fVFJBQ0lOR19CQUNLRU5EX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNpbmdfYmFja2VuZC5oIgorCitu
YW1lc3BhY2UgcGVyZmV0dG8geworCituYW1lc3BhY2UgYmFzZSB7CitjbGFzcyBUYXNrUnVubmVy
OworfQorCitjbGFzcyBQcm9kdWNlcjsKKworLy8gQSBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbiBv
ZiBUcmFjaW5nQmFja2VuZCB0aGF0IGNvbm5lY3RzIHRvIHRoZSBzeXN0ZW0KKy8vIHRyYWNpbmcg
ZGFlbW9uICh0cmFjZWQpIHZpYSBhIFVOSVggc29ja2V0IHVzaW5nIHRoZSBwZXJmZXR0byBidWls
dC1pbgorLy8gcHJvdG8tYmFzZWQgSVBDIG1lY2hhbmlzbS4gSW5zdGFudGlhdGVkIHdoZW4gdGhl
IGVtYmVkZGVyIGNhbGxzCisvLyBUcmFjaW5nOjpJbml0aWFsaXplKGtTeXN0ZW1CYWNrZW5kKS4g
SXQgYWxsb3dzIHRvIGdldCBhcHAtdHJhY2VzIGZ1c2VkCisvLyB0b2dldGhlciB3aXRoIHN5c3Rl
bSB0cmFjZXMsIHVzZWZ1bCB0byBjb3JyZWxhdGUgb24gdGhlIHRpbWVsaW5lIHN5c3RlbQorLy8g
ZXZlbnRzIChlLmcuIHNjaGVkdWxpbmcgc2xpY2VzIGZyb20gdGhlIGtlcm5lbCkgd2l0aCBpbi1h
cHAgZXZlbnRzLgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBT
eXN0ZW1UcmFjaW5nQmFja2VuZCA6IHB1YmxpYyBUcmFjaW5nQmFja2VuZCB7CisgcHVibGljOgor
ICBzdGF0aWMgVHJhY2luZ0JhY2tlbmQqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gVHJhY2luZ0Jh
Y2tlbmQgaW1wbGVtZW50YXRpb24uCisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9kdWNlckVuZHBvaW50
PiBDb25uZWN0UHJvZHVjZXIoCisgICAgICBjb25zdCBDb25uZWN0UHJvZHVjZXJBcmdzJikgb3Zl
cnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lckVuZHBvaW50PiBDb25uZWN0Q29uc3Vt
ZXIoCisgICAgICBjb25zdCBDb25uZWN0Q29uc3VtZXJBcmdzJikgb3ZlcnJpZGU7CisKKyBwcml2
YXRlOgorICBTeXN0ZW1UcmFjaW5nQmFja2VuZCgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGlu
dGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BF
UkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfU1lTVEVNX1RSQUNJTkdfQkFDS0VORF9IXworLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgor
ICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJM
aWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlh
bmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExp
Y2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNF
TlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3Jl
ZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNl
bnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJB
TlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGll
ZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmlu
ZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICov
CisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNJTkdfSF8KKyNkZWZpbmUg
SU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNJTkdfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5o
PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRl
IDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9jb21waWxlci5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9l
eHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvaW5fcHJvY2Vz
c190cmFjaW5nX2JhY2tlbmQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvc3lzdGVtX3RyYWNpbmdfYmFja2VuZC5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgVHJh
Y2luZ011eGVySW1wbDsKK30KKworY2xhc3MgVHJhY2luZ0JhY2tlbmQ7CitjbGFzcyBQbGF0Zm9y
bTsKK2NsYXNzIFRyYWNpbmdTZXNzaW9uOyAgLy8gRGVjbGFyZWQgYmVsb3cuCisKK2VudW0gQmFj
a2VuZFR5cGUgOiB1aW50MzJfdCB7CisgIGtVbnNwZWNpZmllZEJhY2tlbmQgPSAwLAorCisgIC8v
IENvbm5lY3RzIHRvIGEgcHJldmlvdXNseS1pbml0aWFsaXplZCBwZXJmZXR0byB0cmFjaW5nIGJh
Y2tlbmQgZm9yCisgIC8vIGluLXByb2Nlc3MuIElmIHRoZSBpbi1wcm9jZXNzIGJhY2tlbmQgaGFz
IG5vdCBiZWVuIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQKKyAgLy8gaXQgd2lsbCBkbyBzbyBhbmQg
Y3JlYXRlIHRoZSB0cmFjaW5nIHNlcnZpY2Ugb24gYSBkZWRpY2F0ZWQgdGhyZWFkLgorICBrSW5Q
cm9jZXNzQmFja2VuZCA9IDEgPDwgMCwKKworICAvLyBDb25uZWN0cyB0byB0aGUgc3lzdGVtIHRy
YWNpbmcgc2VydmljZSAoZS5nLiBvbiBMaW51eC9BbmRyb2lkL01hYyB1c2VzIGEKKyAgLy8gbmFt
ZWQgVU5JWCBzb2NrZXQpLgorICBrU3lzdGVtQmFja2VuZCA9IDEgPDwgMSwKKworICAvLyBVc2Vk
IHRvIHByb3ZpZGUgYSBjdXN0b20gSVBDIHRyYW5zcG9ydCB0byBjb25uZWN0IHRvIHRoZSBzZXJ2
aWNlLgorICAvLyBUcmFjaW5nSW5pdEFyZ3M6OmN1c3RvbV9iYWNrZW5kIG11c3QgYmUgbm9uLW51
bGwgYW5kIHBvaW50IHRvIGFuCisgIC8vIGluZGVmaW5pdGVseSBsaXZlZCBpbnN0YW5jZS4KKyAg
a0N1c3RvbUJhY2tlbmQgPSAxIDw8IDIsCit9OworCitzdHJ1Y3QgVHJhY2luZ0luaXRBcmdzIHsK
KyAgdWludDMyX3QgYmFja2VuZHMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBvciBt
b3JlIEJhY2tlbmRGbGFncy4KKyAgVHJhY2luZ0JhY2tlbmQqIGN1c3RvbV9iYWNrZW5kID0gbnVs
bHB0cjsgIC8vIFtPcHRpb25hbF0uCisKKyAgLy8gW09wdGlvbmFsXSBQbGF0Zm9ybSBpbXBsZW1l
bnRhdGlvbi4gSXQgYWxsb3dzIHRoZSBlbWJlZGRlciB0byB0YWtlIGNvbnRyb2wKKyAgLy8gb2Yg
cGxhdGZvcm0tc3BlY2lmaWMgYml0cyBsaWtlIHRocmVhZCBjcmVhdGlvbiBhbmQgVExTIHNsb3Qg
aGFuZGxpbmcuIElmCisgIC8vIG5vdCBzZXQgaXQgd2lsbCB1c2UgUGxhdGZvcm06OkdldERlZmF1
bHRQbGF0Zm9ybSgpLgorICBQbGF0Zm9ybSogcGxhdGZvcm0gPSBudWxscHRyOworCisgIC8vIFtP
cHRpb25hbF0gVHVuZSB0aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgYmV0d2Vl
biB0aGUgY3VycmVudAorICAvLyBwcm9jZXNzIGFuZCB0aGUgc2VydmljZSBiYWNrZW5kKHMpLiBU
aGlzIGlzIGEgdHJhZGUtb2ZmIGJldHdlZW4gbWVtb3J5CisgIC8vIGZvb3RwcmludCBhbmQgdGhl
IGFiaWxpdHkgdG8gc3VzdGFpbiBidXJzdHMgb2YgdHJhY2Ugd3JpdGVzIChzZWUgY29tbWVudHMK
KyAgLy8gaW4gc2hhcmVkX21lbW9yeV9hYmkuaCkuCisgIC8vIElmIHNldCwgdGhlIHZhbHVlIG11
c3QgYmUgYSBtdWx0aXBsZSBvZiA0S0IuIFRoZSB2YWx1ZSBjYW4gYmUgaWdub3JlZCBpZgorICAv
LyBsYXJnZXIgdGhhbiBrTWF4U2htU2l6ZSAoMzJNQikgb3Igbm90IGEgbXVsdGlwbGUgb2YgNEtC
LgorICB1aW50MzJfdCBzaG1lbV9zaXplX2hpbnRfa2IgPSAwOworCisgIC8vIFtPcHRpb25hbF0g
U3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgc2l6ZSBvZiBlYWNoIHBhZ2UgaW4gdGhlIHNobWVtIGJ1
ZmZlci4KKyAgLy8gVGhpcyBpcyBhIHRyYWRlLW9mZiBiZXR3ZWVuIElQQyBvdmVyaGVhZCBhbmQg
ZnJhZ21lbnRhdGlvbi9lZmZpY2llbmN5IG9mCisgIC8vIHRoZSBzaG1lbSBidWZmZXIgaW4gcHJl
c2VuY2Ugb2YgbXVsdGlwbGUgd3JpdGVyIHRocmVhZHMuCisgIC8vIE11c3QgYmUgb25lIG9mIFs0
LCA4LCAxNiwgMzJdLgorICB1aW50MzJfdCBzaG1lbV9wYWdlX3NpemVfaGludF9rYiA9IDA7CisK
KyBwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBUcmFjaW5nOworICBmcmllbmQgY2xhc3MgaW50
ZXJuYWw6OlRyYWNpbmdNdXhlckltcGw7CisKKyAgLy8gVXNlZCBvbmx5IGJ5IHRoZSBEQ0hFQ0sg
aW4gdHJhY2luZy5jYywgdG8gY2hlY2sgdGhhdCB0aGUgY29uZmlnIGlzIHRoZQorICAvLyBzYW1l
IGluIGNhc2Ugb2YgcmUtaW5pdGlhbGl6YXRpb24uCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBU
cmFjaW5nSW5pdEFyZ3MmIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGJhY2tl
bmRzLCBjdXN0b21fYmFja2VuZCwgcGxhdGZvcm0sIHNobWVtX3NpemVfaGludF9rYiwKKyAgICAg
ICAgICAgICAgICAgICAgc2htZW1fcGFnZV9zaXplX2hpbnRfa2IsIGluX3Byb2Nlc3NfYmFja2Vu
ZF9mYWN0b3J5XywKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX2JhY2tlbmRfZmFjdG9yeV8s
IGRjaGVja19pc19vbl8pID09CisgICAgICAgICAgIHN0ZDo6dGllKG90aGVyLmJhY2tlbmRzLCBv
dGhlci5jdXN0b21fYmFja2VuZCwgb3RoZXIucGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAg
IG90aGVyLnNobWVtX3NpemVfaGludF9rYiwgb3RoZXIuc2htZW1fcGFnZV9zaXplX2hpbnRfa2Is
CisgICAgICAgICAgICAgICAgICAgIG90aGVyLmluX3Byb2Nlc3NfYmFja2VuZF9mYWN0b3J5XywK
KyAgICAgICAgICAgICAgICAgICAgb3RoZXIuc3lzdGVtX2JhY2tlbmRfZmFjdG9yeV8sIG90aGVy
LmRjaGVja19pc19vbl8pOworICB9CisKKyAgdXNpbmcgQmFja2VuZEZhY3RvcnlGdW5jdGlvbiA9
IFRyYWNpbmdCYWNrZW5kKiAoKikoKTsKKyAgQmFja2VuZEZhY3RvcnlGdW5jdGlvbiBpbl9wcm9j
ZXNzX2JhY2tlbmRfZmFjdG9yeV8gPSBudWxscHRyOworICBCYWNrZW5kRmFjdG9yeUZ1bmN0aW9u
IHN5c3RlbV9iYWNrZW5kX2ZhY3RvcnlfID0gbnVsbHB0cjsKKyAgYm9vbCBkY2hlY2tfaXNfb25f
ID0gUEVSRkVUVE9fRENIRUNLX0lTX09OKCk7Cit9OworCisvLyBUaGUgZW50cnktcG9pbnQgZm9y
IHVzaW5nIHBlcmZldHRvLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNpbmcgeworIHB1Ymxp
YzoKKyAgLy8gSW5pdGlhbGl6ZXMgUGVyZmV0dG8gd2l0aCB0aGUgZ2l2ZW4gYmFja2VuZHMgaW4g
dGhlIGNhbGxpbmcgcHJvY2VzcyBhbmQvb3IKKyAgLy8gd2l0aCBhIHVzZXItcHJvdmlkZWQgYmFj
a2VuZC4gTm8tb3AgaWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgorICBzdGF0aWMgaW5saW5lIHZv
aWQgSW5pdGlhbGl6ZShjb25zdCBUcmFjaW5nSW5pdEFyZ3MmIGFyZ3MpCisgICAgICBQRVJGRVRU
T19BTFdBWVNfSU5MSU5FIHsKKyAgICBUcmFjaW5nSW5pdEFyZ3MgYXJnc19jb3B5KGFyZ3MpOwor
ICAgIC8vIFRoaXMgY29kZSBpcyBpbmxpbmVkIHRvIGFsbG93IGRlYWQtY29kZSBlbGltaW5hdGlv
biBmb3IgdW51c2VkIGJhY2tlbmRzLgorICAgIC8vIFRoaXMgc2F2ZXMgfjIwMCBLQiB3aGVuIG5v
dCB1c2luZyB0aGUgaW4tcHJvY2VzcyBiYWNrZW5kIChiLzE0ODE5ODk5MykuCisgICAgLy8gVGhl
IGxvZ2ljIGJlaGluZCBpdCBpcyB0aGUgZm9sbG93aW5nOgorICAgIC8vIE5vdGhpbmcgb3RoZXIg
dGhhbiB0aGUgY29kZSBiZWxvdyByZWZlcmVuY2VzIHRoZSB0d28gR2V0SW5zdGFuY2UoKQorICAg
IC8vIG1ldGhvZHMuIEZyb20gYSBsaW5rZXItZ3JhcGggdmlld3BvaW50LCB0aG9zZSBHZXRJbnN0
YW5jZSgpIHB1bGwgaW4gbWFueQorICAgIC8vIG90aGVyIHBpZWNlcyBvZiB0aGUgY29kZWJhc2Ug
KGUuZy4gSW5Qcm9jZXNzVHJhY2luZ0JhY2tlbmQgcHVsbHMgdGhlCisgICAgLy8gd2hvbGUgVHJh
Y2luZ1NlcnZpY2VJbXBsLCBTeXN0ZW1UcmFjaW5nQmFja2VuZCBwdWxscyB0aGUgd2hvbGUgLy9p
cGMKKyAgICAvLyBsYXllcikuIER1ZSB0byB0aGUgaW5saW5lLCB0aGUgY29tcGlsZXIgY2FuIHNl
ZSB0aHJvdWdoIHRoZSBjb2RlIGFuZAorICAgIC8vIHJlYWxpemUgdGhhdCBzb21lIGJyYW5jaGVz
IGFyZSBhbHdheXMgbm90IHRha2VuLiBXaGVuIHRoYXQgaGFwcGVucywgbm8KKyAgICAvLyByZWZl
cmVuY2UgdG8gdGhlIGJhY2tlbmRzJyBHZXRJbnN0YW5jZSgpIGlzIGVtaXR0ZWQgYW5kIHRoYXQg
YWxsb3dzIHRoZQorICAgIC8vIGxpbmtlciBHQyB0byBnZXQgcmlkIG9mIHRoZSBlbnRpcmUgc2V0
IG9mIGRlcGVuZGVuY2llcy4KKyAgICBpZiAoYXJncy5iYWNrZW5kcyAmIGtJblByb2Nlc3NCYWNr
ZW5kKSB7CisgICAgICBhcmdzX2NvcHkuaW5fcHJvY2Vzc19iYWNrZW5kX2ZhY3RvcnlfID0KKyAg
ICAgICAgICAmaW50ZXJuYWw6OkluUHJvY2Vzc1RyYWNpbmdCYWNrZW5kOjpHZXRJbnN0YW5jZTsK
KyAgICB9CisgICAgaWYgKGFyZ3MuYmFja2VuZHMgJiBrU3lzdGVtQmFja2VuZCkgeworICAgICAg
YXJnc19jb3B5LnN5c3RlbV9iYWNrZW5kX2ZhY3RvcnlfID0KKyAgICAgICAgICAmaW50ZXJuYWw6
OlN5c3RlbVRyYWNpbmdCYWNrZW5kOjpHZXRJbnN0YW5jZTsKKyAgICB9CisgICAgSW5pdGlhbGl6
ZUludGVybmFsKGFyZ3NfY29weSk7CisgIH0KKworICAvLyBTdGFydCBhIG5ldyB0cmFjaW5nIHNl
c3Npb24gdXNpbmcgdGhlIGdpdmVuIHRyYWNpbmcgYmFja2VuZC4gVXNlCisgIC8vIHxrVW5zcGVj
aWZpZWRCYWNrZW5kfCB0byBzZWxlY3QgYW4gYXZhaWxhYmxlIGJhY2tlbmQgYXV0b21hdGljYWxs
eS4KKyAgLy8gRm9yIHRoZSBtb21lbnQgdGhpcyBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gaW5pdGlh
bGl6aW5nIHRyYWNpbmcgaW4KKyAgLy8ga0luUHJvY2VzcyBtb2RlLiBGb3IgdGhlIHN5c3RlbSBt
b2RlIHVzZSB0aGUgJ2Jpbi9wZXJmZXR0bycgY21kbGluZSBjbGllbnQuCisgIHN0YXRpYyBzdGQ6
OnVuaXF1ZV9wdHI8VHJhY2luZ1Nlc3Npb24+IE5ld1RyYWNlKAorICAgICAgQmFja2VuZFR5cGUg
PSBrVW5zcGVjaWZpZWRCYWNrZW5kKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIEluaXRp
YWxpemVJbnRlcm5hbChjb25zdCBUcmFjaW5nSW5pdEFyZ3MmKTsKKworICBUcmFjaW5nKCkgPSBk
ZWxldGU7Cit9OworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2luZ1Nlc3Npb24geworIHB1
YmxpYzoKKyAgdmlydHVhbCB+VHJhY2luZ1Nlc3Npb24oKTsKKworICAvLyBDb25maWd1cmUgdGhl
IHNlc3Npb24gcGFzc2luZyB0aGUgdHJhY2UgY29uZmlnLgorICAvLyBJZiBhIHdyaXRhYmxlIGZp
bGUgaGFuZGxlIGlzIGdpdmVuIHRocm91Z2ggfGZkfCwgdGhlIHRyYWNlIHdpbGwKKyAgLy8gYXV0
b21hdGljYWxseSB3cml0dGVuIHRvIHRoYXQgZmlsZS4gT3RoZXJ3aXNlIHlvdSBzaG91bGQgY2Fs
bCBSZWFkVHJhY2UoKQorICAvLyB0byByZXRyaWV2ZSB0aGUgdHJhY2UgZGF0YS4gVGhpcyBjYWxs
IGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHxmZHwuCisgIC8vIFRPRE8ocHJpbWlhbm8pOiBh
ZGQgYW4gZXJyb3IgY2FsbGJhY2suCisgIHZpcnR1YWwgdm9pZCBTZXR1cChjb25zdCBUcmFjZUNv
bmZpZyYsIGludCBmZCA9IC0xKSA9IDA7CisKKyAgLy8gRW5hYmxlIHRyYWNpbmcgYXN5bmNocm9u
b3VzbHkuCisgIHZpcnR1YWwgdm9pZCBTdGFydCgpID0gMDsKKworICAvLyBFbmFibGUgdHJhY2lu
ZyBhbmQgYmxvY2sgdW50aWwgdHJhY2luZyBoYXMgc3RhcnRlZC4gTm90ZSB0aGF0IGlmIGRhdGEK
KyAgLy8gc291cmNlcyBhcmUgcmVnaXN0ZXJlZCBhZnRlciB0aGlzIGNhbGwgd2FzIGluaXRpYXRl
ZCwgdGhlIGNhbGwgbWF5IHJldHVybgorICAvLyBiZWZvcmUgdGhlIGFkZGl0aW9uYWwgZGF0YSBz
b3VyY2VzIGhhdmUgc3RhcnRlZC4gQWxzbywgaWYgb3RoZXIgcHJvZHVjZXJzCisgIC8vIChlLmcu
LCB3aXRoIHN5c3RlbS13aWRlIHRyYWNpbmcpIGhhdmUgcmVnaXN0ZXJlZCBkYXRhIHNvdXJjZXMg
d2l0aG91dCBzdGFydAorICAvLyBub3RpZmljYXRpb24gc3VwcG9ydCwgdGhpcyBjYWxsIG1heSBy
ZXR1cm4gYmVmb3JlIHRob3NlIGRhdGEgc291cmNlcyBoYXZlCisgIC8vIHN0YXJ0ZWQuCisgIHZp
cnR1YWwgdm9pZCBTdGFydEJsb2NraW5nKCkgPSAwOworCisgIC8vIERpc2FibGUgdHJhY2luZyBh
c3luY2hyb25vdXNseS4KKyAgLy8gVXNlIFNldE9uU3RvcENhbGxiYWNrKCkgdG8gZ2V0IGEgbm90
aWZpY2F0aW9uIHdoZW4gdGhlIHRyYWNpbmcgc2Vzc2lvbiBpcworICAvLyBmdWxseSBzdG9wcGVk
IGFuZCBhbGwgZGF0YSBzb3VyY2VzIGhhdmUgYWNrZWQuCisgIHZpcnR1YWwgdm9pZCBTdG9wKCkg
PSAwOworCisgIC8vIERpc2FibGUgdHJhY2luZyBhbmQgYmxvY2sgdW50aWwgdHJhY2luZyBoYXMg
c3RvcHBlZC4KKyAgdmlydHVhbCB2b2lkIFN0b3BCbG9ja2luZygpID0gMDsKKworICAvLyBUaGlz
IGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRyYWNpbmcgaXMgZGlzYWJsZWQuCisgIC8v
IFRoaXMgY2FuIGhhcHBlbiBlaXRoZXIgd2hlbiBleHBsaWNpdGx5IGNhbGxpbmcgVHJhY2luZ1Nl
c3Npb24uU3RvcCgpIG9yCisgIC8vIHdoZW4gdGhlIHRyYWNlIHJlYWNoZXMgaXRzIHxkdXJhdGlv
bl9tc3wgdGltZSBsaW1pdC4KKyAgLy8gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgb24g
YW4gaW50ZXJuYWwgcGVyZmV0dG8gdGhyZWFkLgorICB2aXJ0dWFsIHZvaWQgU2V0T25TdG9wQ2Fs
bGJhY2soc3RkOjpmdW5jdGlvbjx2b2lkKCk+KSA9IDA7CisKKyAgLy8gU3RydWN0IHBhc3NlZCBh
cyBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2sgcGFzc2VkIHRvIFJlYWRUcmFjZSgpLgorICAvLyBb
ZGF0YSwgc2l6ZV0gaXMgZ3VhcmFudGVlZCB0byBjb250YWluIDEgb3IgbW9yZSBmdWxsIHRyYWNl
IHBhY2tldHMsIHdoaWNoCisgIC8vIGNhbiBiZSBkZWNvZGVkIHVzaW5nIHRyYWNlLnByb3RvLiBO
byBwYXJ0aWFsIG9yIHRydW5jYXRlZCBwYWNrZXRzIGFyZQorICAvLyBleHBvc2VkLiBJZiB0aGUg
dHJhY2UgaXMgZW1wdHkgdGhpcyByZXR1cm5zIGEgemVyby1zaXplZCBudWxscHRyIHdpdGgKKyAg
Ly8gfGhhc19tb3JlfCA9PSB0cnVlIHRvIHNpZ25hbCBFT0YuCisgIC8vIFRoaXMgY2FsbGJhY2sg
d2lsbCBiZSBpbnZva2VkIG9uIGFuIGludGVybmFsIHBlcmZldHRvIHRocmVhZC4KKyAgc3RydWN0
IFJlYWRUcmFjZUNhbGxiYWNrQXJncyB7CisgICAgY29uc3QgY2hhciogZGF0YSA9IG51bGxwdHI7
CisgICAgc2l6ZV90IHNpemUgPSAwOworCisgICAgLy8gV2hlbiBmYWxzZSwgdGhpcyB3aWxsIGJl
IHRoZSBsYXN0IGludm9jYXRpb24gb2YgdGhlIGNhbGxiYWNrIGZvciB0aGlzCisgICAgLy8gcmVh
ZCBjeWNsZS4KKyAgICBib29sIGhhc19tb3JlID0gZmFsc2U7CisgIH07CisKKyAgLy8gUmVhZHMg
YmFjayB0aGUgdHJhY2UgZGF0YSAocmF3IHByb3RvYnVmLWVuY29kZWQgYnl0ZXMpIGFzeW5jaHJv
bm91c2x5LgorICAvLyBDYW4gYmUgY2FsbGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHRyYWNl
LCB0eXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwKKyAgLy8gYWZ0ZXIgc3RvcHBpbmcuIFJl
YWRpbmcgdGhlIHRyYWNlIGRhdGEgaXMgYSBkZXN0cnVjdGl2ZSBvcGVyYXRpb24gdy5yLnQuCisg
IC8vIGNvbnRlbnRzIG9mIHRoZSB0cmFjZSBidWZmZXIgYW5kIGlzIG5vdCBpZGVtcG90ZW50Lgor
ICAvLyBBIHNpbmdsZSBSZWFkVHJhY2UoKSBjYWxsIGNhbiB5aWVsZCA+MSBjYWxsYmFjayBpbnZv
Y2F0aW9ucywgdW50aWwKKyAgLy8gfGhhc19tb3JlfCBpcyBmYWxzZS4KKyAgdXNpbmcgUmVhZFRy
YWNlQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoUmVhZFRyYWNlQ2FsbGJhY2tBcmdzKT47
CisgIHZpcnR1YWwgdm9pZCBSZWFkVHJhY2UoUmVhZFRyYWNlQ2FsbGJhY2spID0gMDsKKworICAv
LyBTeW5jaHJvbm91cyB2ZXJzaW9uIG9mIFJlYWRUcmFjZSgpLiBJdCBibG9ja3MgdGhlIGNhbGxp
bmcgdGhyZWFkIHVudGlsIGFsbAorICAvLyB0aGUgdHJhY2UgY29udGVudHMgYXJlIHJlYWQuIFRo
aXMgaXMgc2xvdyBhbmQgaW5lZmZpY2llbnQgKGludm9sdmVzIG1vcmUKKyAgLy8gY29waWVzKSBh
bmQgaXMgbWFpbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nLgorICBzdGQ6OnZlY3RvcjxjaGFyPiBS
ZWFkVHJhY2VCbG9ja2luZygpOworCisgIC8vIFN0cnVjdCBwYXNzZWQgYXMgYW4gYXJndW1lbnQg
dG8gdGhlIGNhbGxiYWNrIGZvciBHZXRUcmFjZVN0YXRzKCkuIENvbnRhaW5zCisgIC8vIHN0YXRp
c3RpY3MgYWJvdXQgdGhlIHRyYWNpbmcgc2Vzc2lvbi4KKyAgc3RydWN0IEdldFRyYWNlU3RhdHND
YWxsYmFja0FyZ3MgeworICAgIC8vIFdoZXRoZXIgb3Igbm90IHF1ZXJ5aW5nIHN0YXRpc3RpY3Mg
c3VjY2VlZGVkLgorICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIC8vIFNlcmlhbGl6ZWQg
VHJhY2VTdGF0cyBwcm90b2J1ZiBtZXNzYWdlLiBUbyBkZWNvZGU6CisgICAgLy8KKyAgICAvLyAg
IHBlcmZldHRvOjpwcm90b3M6Omdlbjo6VHJhY2VTdGF0cyB0cmFjZV9zdGF0czsKKyAgICAvLyAg
IHRyYWNlX3N0YXRzLlBhcnNlRnJvbUFycmF5KGFyZ3MudHJhY2Vfc3RhdHNfZGF0YS5kYXRhKCks
CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnRyYWNlX3N0YXRzX2Rh
dGEuc2l6ZSgpKTsKKyAgICAvLworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRyYWNlX3N0YXRz
X2RhdGE7CisgIH07CisKKyAgLy8gUmVxdWVzdHMgYSBzbmFwc2hvdCBvZiBzdGF0aXN0aWNhbCBk
YXRhIGZvciB0aGlzIHRyYWNpbmcgc2Vzc2lvbi4gT25seSBvbmUKKyAgLy8gcXVlcnkgbWF5IGJl
IGFjdGl2ZSBhdCBhIHRpbWUuIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGlu
dGVybmFsCisgIC8vIHBlcmZldHRvIHRocmVhZC4KKyAgdXNpbmcgR2V0VHJhY2VTdGF0c0NhbGxi
YWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKEdldFRyYWNlU3RhdHNDYWxsYmFja0FyZ3MpPjsKKyAg
dmlydHVhbCB2b2lkIEdldFRyYWNlU3RhdHMoR2V0VHJhY2VTdGF0c0NhbGxiYWNrKSA9IDA7CisK
KyAgLy8gU3luY2hyb25vdXMgdmVyc2lvbiBvZiBHZXRUcmFjZVN0YXRzKCkgZm9yIGNvbnZlbmll
bmNlLgorICBHZXRUcmFjZVN0YXRzQ2FsbGJhY2tBcmdzIEdldFRyYWNlU3RhdHNCbG9ja2luZygp
OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9Q
RVJGRVRUT19UUkFDSU5HX1RSQUNJTkdfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhl
IEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBB
cGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBu
b3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgor
ICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBo
dHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3Mg
cmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3
YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBh
biAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0Yg
QU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2Ug
Zm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBs
aW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNSQ19UUkFDSU5H
X0lOVEVSTkFMX1RSQUNJTkdfTVVYRVJfSU1QTF9IXworI2RlZmluZSBTUkNfVFJBQ0lOR19JTlRF
Uk5BTF9UUkFDSU5HX01VWEVSX0lNUExfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1
ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXRvbWljPgorI2lu
Y2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1
ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vZXh0L2Jhc2Uvc2NvcGVkX2ZpbGUuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3RocmVhZF9jaGVja2VyLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3Jl
L2Jhc2ljX3R5cGVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL2NvbnN1bWVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3Byb2R1Y2VyLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5n
L2NvcmUvZGF0YV9zb3VyY2VfZGVzY3JpcHRvci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29y
ZS90cmFjZV9jb25maWcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvYmFzaWNfdHlwZXMuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2lu
Z19tdXhlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vdHJhY2luZy90cmFjaW5nLmgiCituYW1lc3BhY2UgcGVyZmV0dG8geworCitjbGFzcyBDb25z
dW1lckVuZHBvaW50OworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBQcm9kdWNlckVuZHBv
aW50OworY2xhc3MgVHJhY2VXcml0ZXJCYXNlOworY2xhc3MgVHJhY2luZ0JhY2tlbmQ7CitjbGFz
cyBUcmFjaW5nU2Vzc2lvbjsKK3N0cnVjdCBUcmFjaW5nSW5pdEFyZ3M7CisKK25hbWVzcGFjZSBi
YXNlIHsKK2NsYXNzIFRhc2tSdW5uZXI7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0
cnVjdCBEYXRhU291cmNlU3RhdGljU3RhdGU7CisKKy8vIFRoaXMgY2xhc3MgYWN0cyBhcyBhIGJy
aWRnZSBiZXR3ZWVuIHRoZSBwdWJsaWMgQVBJIGFuZCB0aGUgVHJhY2luZ0JhY2tlbmQocykuCisv
LyBJdCBleHBvc2VzIGEgc2ltcGxpZmllZCB2aWV3IG9mIHRoZSB3b3JsZCB0byB0aGUgQVBJIG1l
dGhvZHMgaGFuZGxpbmcgYWxsIHRoZQorLy8gYm9va2tlZXBpbmcgdG8gbWFwIGRhdGEgc291cmNl
IGluc3RhbmNlcyBhbmQgdHJhY2Ugd3JpdGVycyB0byB0aGUgdmFyaW91cworLy8gYmFja2VuZHMu
IEl0IGRlYWxzIHdpdGggTiBkYXRhIHNvdXJjZXMsIE0gYmFja2VuZHMgKDEgYmFja2VuZCA9PSAx
IHRyYWNpbmcKKy8vIHNlcnZpY2UgPT0gMSBwcm9kdWNlciBjb25uZWN0aW9uKSBhbmQgVCBjb25j
dXJyZW50IHRyYWNpbmcgc2Vzc2lvbnMuCisvLworLy8gSGFuZGluZyBkYXRhIHNvdXJjZSByZWdp
c3RyYXRpb24gYW5kIHN0YXJ0L3N0b3AgZmxvd3MgW3Byb2R1Y2VyIHNpZGVdOgorLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQorLy8gMS4gVGhlIEFQSSBjbGllbnQgc3ViY2xhc3NlcyBwZXJmZXR0bzo6RGF0YVNv
dXJjZSBhbmQgY2FsbHMKKy8vICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyPE15RGF0YVNvdXJjZT4o
KS4gSW4gdHVybiB0aGlzIGNhbGxzIGludG8gdGhlCisvLyAgICBUcmFjaW5nTXV4ZXIuCisvLyAy
LiBUaGUgdHJhY2luZyBtdXhlciBpdGVyYXRlcyB0aHJvdWdoIGFsbCB0aGUgYmFja2VuZHMgKDEg
YmFja2VuZCA9PSAxCisvLyAgICBzZXJ2aWNlID09IDEgcHJvZHVjZXIgY29ubmVjdGlvbikgYW5k
IHJlZ2lzdGVycyB0aGUgZGF0YSBzb3VyY2Ugb24gZWFjaAorLy8gICAgYmFja2VuZC4KKy8vIDMu
IFdoZW4gYW55IChzZXJ2aWNlcyBiZWhpbmQgYSkgYmFja2VuZCBzdGFydHMgdHJhY2luZyBhbmQg
cmVxdWVzdHMgdG8gc3RhcnQKKy8vICAgIHRoYXQgc3BlY2lmaWMgZGF0YSBzb3VyY2UsIHRoZSBU
cmFjaW5nTXV4ZXJJbXBsIGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UKKy8vICAgIG9mIE15RGF0
YVNvdXJjZSBhbmQgY2FsbHMgdGhlIE9uU3RhcnQoKSBtZXRob2QuCisvLworLy8gQ29udHJvbGxp
bmcgdHJhY2UgYW5kIHJldHJpZXZpbmcgdHJhY2UgZGF0YSBbY29uc3VtZXIgc2lkZV06CisvLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKy8vIDEuIFRoZSBBUEkgY2xpZW50IGNhbGxzIFRyYWNpbmc6Ok5ld1RyYWNlKCksIHJldHVy
bnMgYSBSQUlJIFRyYWNpbmdTZXNzaW9uCisvLyAgICBvYmplY3QuCisvLyAyLiBOZXdUcmFjZSgp
IGNhbGxzIGludG8gaW50ZXJuYWw6OlRyYWNpbmdNdXhlcihJbXBsKS4gVHJhY2luZ011eGVyCisv
LyAgICBzdWJjbGFzc2VzIHRoZSBUcmFjaW5nU2Vzc2lvbiBvYmplY3QgKFRyYWNpbmdTZXNzaW9u
SW1wbCkgYW5kIHJldHVybnMgaXQuCisvLyAzLiBUaGUgdHJhY2luZyBtdXhlciBpZGVudGlmaWVz
IHRoZSBiYWNrZW5kIChhY2NvcmRpbmcgdG8gdGhlIGFyZ3MgcGFzc2VkIHRvCisvLyAgICBOZXdU
cmFjZSksIGNyZWF0ZXMgYSBuZXcgQ29uc3VtZXIgYW5kIGNvbm5lY3RzIHRvIGl0LgorLy8gNC4g
V2hlbiB0aGUgQVBJIGNsaWVudCBjYWxscyBTdGFydCgpL1N0b3AoKS9SZWFkVHJhY2UoKSBtZXRo
b2RzLCB0aGUKKy8vICAgIFRyYWNpbmdNdXhlciBmb3J3YXJkcyB0aGVtIHRvIHRoZSBjb25zdW1l
ciBhc3NvY2lhdGVkIHRvIHRoZQorLy8gICAgVHJhY2luZ1Nlc3Npb24uIExpa2V3aXNlIGZvciBj
YWxsYmFja3MgY29taW5nIGZyb20gdGhlIGNvbnN1bWVyLXNpZGUgb2YKKy8vICAgIHRoZSBzZXJ2
aWNlLgorY2xhc3MgVHJhY2luZ011eGVySW1wbCA6IHB1YmxpYyBUcmFjaW5nTXV4ZXIgeworIHB1
YmxpYzoKKyAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBUcmFjaW5nU2Vzc2lvbklEIGJlY2F1
c2UgaXQncyBnbG9iYWwgYWNyb3NzIGFsbAorICAvLyBiYWNrZW5kcy4gVHJhY2luZ1Nlc3Npb25J
RCBpcyBnbG9iYWwgb25seSB3aXRoaW4gdGhlIHNjb3BlIG9mIG9uZSBzZXJ2aWNlLgorICB1c2lu
ZyBUcmFjaW5nU2Vzc2lvbkdsb2JhbElEID0gdWludDY0X3Q7CisKKyAgc3RhdGljIHZvaWQgSW5p
dGlhbGl6ZUluc3RhbmNlKGNvbnN0IFRyYWNpbmdJbml0QXJncyYpOworCisgIC8vIFRyYWNpbmdN
dXhlciBpbXBsZW1lbnRhdGlvbi4KKyAgYm9vbCBSZWdpc3RlckRhdGFTb3VyY2UoY29uc3QgRGF0
YVNvdXJjZURlc2NyaXB0b3ImLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNl
RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZVN0YXRpY1N0YXRl
Kikgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxUcmFjZVdyaXRlckJhc2U+IENyZWF0ZVRy
YWNlV3JpdGVyKAorICAgICAgRGF0YVNvdXJjZVN0YXRlKiwKKyAgICAgIEJ1ZmZlckV4aGF1c3Rl
ZFBvbGljeSBidWZmZXJfZXhoYXVzdGVkX3BvbGljeSkgb3ZlcnJpZGU7CisgIHZvaWQgRGVzdHJv
eVN0b3BwZWRUcmFjZVdyaXRlcnNGb3JDdXJyZW50VGhyZWFkKCkgb3ZlcnJpZGU7CisKKyAgc3Rk
Ojp1bmlxdWVfcHRyPFRyYWNpbmdTZXNzaW9uPiBDcmVhdGVUcmFjaW5nU2Vzc2lvbihCYWNrZW5k
VHlwZSk7CisKKyAgLy8gUHJvZHVjZXItc2lkZSBib29ra2VlcGluZyBtZXRob2RzLgorICB2b2lk
IFVwZGF0ZURhdGFTb3VyY2VzT25BbGxCYWNrZW5kcygpOworICB2b2lkIFNldHVwRGF0YVNvdXJj
ZShUcmFjaW5nQmFja2VuZElkLAorICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSW5z
dGFuY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVNvdXJjZUNvbmZpZyYp
OworICB2b2lkIFN0YXJ0RGF0YVNvdXJjZShUcmFjaW5nQmFja2VuZElkLCBEYXRhU291cmNlSW5z
dGFuY2VJRCk7CisgIHZvaWQgU3RvcERhdGFTb3VyY2VfQXN5bmNCZWdpbihUcmFjaW5nQmFja2Vu
ZElkLCBEYXRhU291cmNlSW5zdGFuY2VJRCk7CisgIHZvaWQgU3RvcERhdGFTb3VyY2VfQXN5bmNF
bmQoVHJhY2luZ0JhY2tlbmRJZCwgRGF0YVNvdXJjZUluc3RhbmNlSUQpOworCisgIC8vIENvbnN1
bWVyLXNpZGUgYm9va2tlZXBpbmcgbWV0aG9kcy4KKyAgdm9pZCBTZXR1cFRyYWNpbmdTZXNzaW9u
KFRyYWNpbmdTZXNzaW9uR2xvYmFsSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2VDb25maWc+JiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJhc2U6OlNjb3BlZEZpbGUgdHJhY2VfZmQgPSBiYXNlOjpTY29wZWRGaWxlKCkpOworICB2
b2lkIFN0YXJ0VHJhY2luZ1Nlc3Npb24oVHJhY2luZ1Nlc3Npb25HbG9iYWxJRCk7CisgIHZvaWQg
U3RvcFRyYWNpbmdTZXNzaW9uKFRyYWNpbmdTZXNzaW9uR2xvYmFsSUQpOworICB2b2lkIERlc3Ry
b3lUcmFjaW5nU2Vzc2lvbihUcmFjaW5nU2Vzc2lvbkdsb2JhbElEKTsKKyAgdm9pZCBSZWFkVHJh
Y2luZ1Nlc3Npb25EYXRhKAorICAgICAgVHJhY2luZ1Nlc3Npb25HbG9iYWxJRCwKKyAgICAgIHN0
ZDo6ZnVuY3Rpb248dm9pZChUcmFjaW5nU2Vzc2lvbjo6UmVhZFRyYWNlQ2FsbGJhY2tBcmdzKT4p
OworICB2b2lkIEdldFRyYWNlU3RhdHMoVHJhY2luZ1Nlc3Npb25HbG9iYWxJRCwKKyAgICAgICAg
ICAgICAgICAgICAgIFRyYWNpbmdTZXNzaW9uOjpHZXRUcmFjZVN0YXRzQ2FsbGJhY2spOworCisg
cHJpdmF0ZToKKyAgLy8gRm9yIGVhY2ggVHJhY2luZ0JhY2tlbmQgd2UgY3JlYXRlIGFuZCByZWdp
c3RlciBvbmUgUHJvZHVjZXJJbXBsIGluc3RhbmNlLgorICAvLyBUaGlzIHRhbGtzIHRvIHRoZSBw
cm9kdWNlci1zaWRlIG9mIHRoZSBzZXJ2aWNlLCBnZXRzIHN0YXJ0L3N0b3AgcmVxdWVzdHMKKyAg
Ly8gZnJvbSBpdCBhbmQgcm91dGVzIHRoZW0gdG8gdGhlIHJlZ2lzdGVyZWQgZGF0YSBzb3VyY2Vz
LgorICAvLyBPbmUgUHJvZHVjZXJJbXBsID09IG9uZSBiYWNrZW5kID09IG9uZSB0cmFjaW5nIHNl
cnZpY2UuCisgIC8vIFRoaXMgY2xhc3MgaXMgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZSBjYWxsYmFj
a3MgY29taW5nIGZyb20gZGlmZmVyZW50CisgIC8vIHNlcnZpY2VzLiBUcmFjaW5nTXV4ZXJJbXBs
IGNhbid0IGRpcmVjdGx5IGltcGxlbWVudCB0aGUgUHJvZHVjZXIgaW50ZXJmYWNlCisgIC8vIGJl
Y2F1c2UgdGhlIFByb2R1Y2VyIHZpcnR1YWwgbWV0aG9kcyBkb24ndCBhbGxvdyB0byBpZGVudGlm
eSB0aGUgc2VydmljZS4KKyAgY2xhc3MgUHJvZHVjZXJJbXBsIDogcHVibGljIFByb2R1Y2VyIHsK
KyAgIHB1YmxpYzoKKyAgICBQcm9kdWNlckltcGwoVHJhY2luZ011eGVySW1wbCosIFRyYWNpbmdC
YWNrZW5kSWQpOworICAgIH5Qcm9kdWNlckltcGwoKSBvdmVycmlkZTsKKworICAgIHZvaWQgSW5p
dGlhbGl6ZShzdGQ6OnVuaXF1ZV9wdHI8UHJvZHVjZXJFbmRwb2ludD4gZW5kcG9pbnQpOworICAg
IHZvaWQgUmVnaXN0ZXJEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9yJiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlRmFjdG9yeSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBEYXRhU291cmNlU3RhdGljU3RhdGUqKTsKKworICAgIC8vIHBlcmZl
dHRvOjpQcm9kdWNlciBpbXBsZW1lbnRhdGlvbi4KKyAgICB2b2lkIE9uQ29ubmVjdCgpIG92ZXJy
aWRlOworICAgIHZvaWQgT25EaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBPblRyYWNp
bmdTZXR1cCgpIG92ZXJyaWRlOworICAgIHZvaWQgU2V0dXBEYXRhU291cmNlKERhdGFTb3VyY2VJ
bnN0YW5jZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFTb3VyY2VDb25m
aWcmKSBvdmVycmlkZTsKKyAgICB2b2lkIFN0YXJ0RGF0YVNvdXJjZShEYXRhU291cmNlSW5zdGFu
Y2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhU291cmNlQ29uZmlnJikg
b3ZlcnJpZGU7CisgICAgdm9pZCBTdG9wRGF0YVNvdXJjZShEYXRhU291cmNlSW5zdGFuY2VJRCkg
b3ZlcnJpZGU7CisgICAgdm9pZCBGbHVzaChGbHVzaFJlcXVlc3RJRCwgY29uc3QgRGF0YVNvdXJj
ZUluc3RhbmNlSUQqLCBzaXplX3QpIG92ZXJyaWRlOworICAgIHZvaWQgQ2xlYXJJbmNyZW1lbnRh
bFN0YXRlKGNvbnN0IERhdGFTb3VyY2VJbnN0YW5jZUlEKiwgc2l6ZV90KSBvdmVycmlkZTsKKwor
ICAgIFBFUkZFVFRPX1RIUkVBRF9DSEVDS0VSKHRocmVhZF9jaGVja2VyXykKKyAgICBUcmFjaW5n
TXV4ZXJJbXBsKiBjb25zdCBtdXhlcl87CisgICAgVHJhY2luZ0JhY2tlbmRJZCBjb25zdCBiYWNr
ZW5kX2lkXzsKKyAgICBib29sIGNvbm5lY3RlZF8gPSBmYWxzZTsKKworICAgIC8vIFNldCBvZiBk
YXRhIHNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWN0dWFsbHkgcmVnaXN0ZXJlZCBvbiB0aGlzIHBy
b2R1Y2VyLgorICAgIC8vIFRoaXMgY2FuIGJlIGEgc3Vic2V0IG9mIHRoZSBnbG9iYWwgfGRhdGFf
c291cmNlc198LCBiZWNhdXNlIGRhdGEgc291cmNlcworICAgIC8vIGNhbiByZWdpc3RlciBiZWZv
cmUgdGhlIHByb2R1Y2VyIGlzIGZ1bGx5IGNvbm5lY3RlZC4KKyAgICBzdGQ6OmJpdHNldDxrTWF4
RGF0YVNvdXJjZXM+IHJlZ2lzdGVyZWRfZGF0YV9zb3VyY2VzX3t9OworCisgICAgc3RkOjp1bmlx
dWVfcHRyPFByb2R1Y2VyRW5kcG9pbnQ+IHNlcnZpY2VfOyAgLy8gS2VlcCBsYXN0LgorICB9Owor
CisgIC8vIEZvciBlYWNoIFRyYWNpbmdTZXNzaW9uIGNyZWF0ZWQgYnkgdGhlIEFQSSBjbGllbnQg
KFRyYWNpbmc6Ok5ld1RyYWNlKCkgd2UKKyAgLy8gY3JlYXRlIGFuZCByZWdpc3RlciBvbmUgQ29u
c3VtZXJJbXBsIGluc3RhbmNlLgorICAvLyBUaGlzIHRhbGtzIHRvIHRoZSBjb25zdW1lci1zaWRl
IG9mIHRoZSBzZXJ2aWNlLCBnZXRzIGVuZC1vZi10cmFjZSBhbmQKKyAgLy8gb24tdHJhY2UtZGF0
YSBjYWxsYmFja3MgYW5kIHJvdXRlcyB0aGVtIHRvIHRoZSBBUEkgY2xpZW50IGNhbGxiYWNrcy4K
KyAgLy8gVGhpcyBjbGFzcyBpcyBuZWVkZWQgdG8gZGlzYW1iaWd1YXRlIGNhbGxiYWNrcyBjb21p
bmcgZnJvbSBkaWZmZXJlbnQKKyAgLy8gdHJhY2luZyBzZXNzaW9ucy4KKyAgY2xhc3MgQ29uc3Vt
ZXJJbXBsIDogcHVibGljIENvbnN1bWVyIHsKKyAgIHB1YmxpYzoKKyAgICBDb25zdW1lckltcGwo
VHJhY2luZ011eGVySW1wbCosIFRyYWNpbmdCYWNrZW5kSWQsIFRyYWNpbmdTZXNzaW9uR2xvYmFs
SUQpOworICAgIH5Db25zdW1lckltcGwoKSBvdmVycmlkZTsKKworICAgIHZvaWQgSW5pdGlhbGl6
ZShzdGQ6OnVuaXF1ZV9wdHI8Q29uc3VtZXJFbmRwb2ludD4gZW5kcG9pbnQpOworCisgICAgLy8g
cGVyZmV0dG86OkNvbnN1bWVyIGltcGxlbWVudGF0aW9uLgorICAgIHZvaWQgT25Db25uZWN0KCkg
b3ZlcnJpZGU7CisgICAgdm9pZCBPbkRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKyAgICB2b2lkIE9u
VHJhY2luZ0Rpc2FibGVkKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBPblRyYWNlRGF0YShzdGQ6OnZl
Y3RvcjxUcmFjZVBhY2tldD4sIGJvb2wgaGFzX21vcmUpIG92ZXJyaWRlOworICAgIHZvaWQgT25E
ZXRhY2goYm9vbCBzdWNjZXNzKSBvdmVycmlkZTsKKyAgICB2b2lkIE9uQXR0YWNoKGJvb2wgc3Vj
Y2VzcywgY29uc3QgVHJhY2VDb25maWcmKSBvdmVycmlkZTsKKyAgICB2b2lkIE9uVHJhY2VTdGF0
cyhib29sIHN1Y2Nlc3MsIGNvbnN0IFRyYWNlU3RhdHMmKSBvdmVycmlkZTsKKyAgICB2b2lkIE9u
T2JzZXJ2YWJsZUV2ZW50cyhjb25zdCBPYnNlcnZhYmxlRXZlbnRzJikgb3ZlcnJpZGU7CisKKyAg
ICB2b2lkIE5vdGlmeVN0YXJ0Q29tcGxldGUoKTsKKyAgICB2b2lkIE5vdGlmeVN0b3BDb21wbGV0
ZSgpOworCisgICAgLy8gV2lsbCBldmVudHVhbGx5IGluZm9ybSB0aGUgfG11eGVyX3wgd2hlbiBp
dCBpcyBzYWZlIHRvIHJlbW92ZSB8dGhpc3wuCisgICAgdm9pZCBEaXNjb25uZWN0KCk7CisKKyAg
ICBUcmFjaW5nTXV4ZXJJbXBsKiBjb25zdCBtdXhlcl87CisgICAgVHJhY2luZ0JhY2tlbmRJZCBj
b25zdCBiYWNrZW5kX2lkXzsKKyAgICBUcmFjaW5nU2Vzc2lvbkdsb2JhbElEIGNvbnN0IHNlc3Np
b25faWRfOworICAgIGJvb2wgY29ubmVjdGVkXyA9IGZhbHNlOworCisgICAgLy8gVGhpcyBpcyB0
byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIFNldHVwIGNhbGwgZnJvbSB0aGUgQVBJIGNsaWVu
dAorICAgIC8vIGFycml2ZXMgYmVmb3JlIHRoZSBjb25zdW1lciBoYXMgY29ubmVjdGVkLiBJbiB0
aGlzIGNhc2Ugd2Uga2VlcCBhcm91bmQKKyAgICAvLyB0aGUgY29uZmlnIGFuZCBjaGVjayBpZiB3
ZSBoYXZlIGl0IGFmdGVyIGNvbm5lY3Rpb24uCisgICAgYm9vbCBzdGFydF9wZW5kaW5nXyA9IGZh
bHNlOworCisgICAgLy8gU2ltaWxhcmx5IGlmIHRoZSBzZXNzaW9uIGlzIHN0b3BwZWQgYmVmb3Jl
IHRoZSBjb25zdW1lciB3YXMgY29ubmVjdGVkLCB3ZQorICAgIC8vIG5lZWQgdG8gd2FpdCB1bnRp
bCB0aGUgc2Vzc2lvbiBoYXMgc3RhcnRlZCBiZWZvcmUgc3RvcHBpbmcgaXQuCisgICAgYm9vbCBz
dG9wX3BlbmRpbmdfID0gZmFsc2U7CisKKyAgICAvLyBXaGV0aGVyIHRoaXMgc2Vzc2lvbiB3YXMg
YWxyZWFkeSBzdG9wcGVkLiBUaGlzIHdpbGwgaGFwcGVuIGluIHJlc3BvbnNlIHRvCisgICAgLy8g
U3RvcHssQmxvY2tpbmd9LCBidXQgYWxzbyBpZiB0aGUgc2VydmljZSBzdG9wcyB0aGUgc2Vzc2lv
biBmb3IgdXMKKyAgICAvLyBhdXRvbWF0aWNhbGx5IChlLmcuLCB3aGVuIHRoZXJlIGFyZSBubyBk
YXRhIHNvdXJjZXMpLgorICAgIGJvb2wgc3RvcHBlZF8gPSBmYWxzZTsKKworICAgIC8vIHNoYXJl
ZF9wdHIgYmVjYXVzZSBpdCdzIHBvc3RlZCBhY3Jvc3MgdGhyZWFkcy4gVGhpcyBpcyB0byBhdm9p
ZCBjb3B5aW5nCisgICAgLy8gaXQgbW9yZSB0aGFuIG9uY2UuCisgICAgc3RkOjpzaGFyZWRfcHRy
PFRyYWNlQ29uZmlnPiB0cmFjZV9jb25maWdfOworICAgIGJhc2U6OlNjb3BlZEZpbGUgdHJhY2Vf
ZmRfOworCisgICAgLy8gQW4gaW50ZXJuYWwgY2FsbGJhY2sgdXNlZCB0byBpbXBsZW1lbnQgU3Rh
cnRCbG9ja2luZygpLgorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBibG9ja2luZ19zdGFydF9j
b21wbGV0ZV9jYWxsYmFja187CisKKyAgICAvLyBJZiB0aGUgQVBJIGNsaWVudCBwYXNzZXMgYSBj
YWxsYmFjayB0byBzdG9wLCB3ZSBzaG91bGQgaW52b2tlIHRoaXMgd2hlbgorICAgIC8vIE9uVHJh
Y2luZ0Rpc2FibGVkKCkgaXMgaW52b2tlZC4KKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gc3Rv
cF9jb21wbGV0ZV9jYWxsYmFja187CisKKyAgICAvLyBBbiBpbnRlcm5hbCBjYWxsYmFjayB1c2Vk
IHRvIGltcGxlbWVudCBTdG9wQmxvY2tpbmcoKS4KKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4g
YmxvY2tpbmdfc3RvcF9jb21wbGV0ZV9jYWxsYmFja187CisKKyAgICAvLyBDYWxsYmFjayBwYXNz
ZWQgdG8gUmVhZFRyYWNlKCkuCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFRyYWNpbmdTZXNzaW9u
OjpSZWFkVHJhY2VDYWxsYmFja0FyZ3MpPgorICAgICAgICByZWFkX3RyYWNlX2NhbGxiYWNrXzsK
KworICAgIC8vIENhbGxiYWNrIHBhc3NlZCB0byBHZXRUcmFjZVN0YXRzKCkuCisgICAgVHJhY2lu
Z1Nlc3Npb246OkdldFRyYWNlU3RhdHNDYWxsYmFjayBnZXRfdHJhY2Vfc3RhdHNfY2FsbGJhY2tf
OworCisgICAgLy8gVGhlIHN0YXRlcyBvZiBhbGwgZGF0YSBzb3VyY2VzIGluIHRoaXMgdHJhY2lu
ZyBzZXNzaW9uLiB8dHJ1ZXwgbWVhbnMgdGhlCisgICAgLy8gZGF0YSBzb3VyY2UgaGFzIHN0YXJ0
ZWQgdHJhY2luZy4KKyAgICB1c2luZyBEYXRhU291cmNlSGFuZGxlID0gc3RkOjpwYWlyPHN0ZDo6
c3RyaW5nLCBzdGQ6OnN0cmluZz47CisgICAgc3RkOjptYXA8RGF0YVNvdXJjZUhhbmRsZSwgYm9v
bD4gZGF0YV9zb3VyY2Vfc3RhdGVzXzsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lckVu
ZHBvaW50PiBzZXJ2aWNlXzsgIC8vIEtlZXAgYmVmb3JlIGxhc3QuCisgICAgUEVSRkVUVE9fVEhS
RUFEX0NIRUNLRVIodGhyZWFkX2NoZWNrZXJfKSAgICAgLy8gS2VlcCBsYXN0LgorICB9OworCisg
IC8vIFRoaXMgb2JqZWN0IGlzIHJldHVybmVkIHRvIEFQSSBjbGllbnRzIHdoZW4gdGhleSBjYWxs
CisgIC8vIFRyYWNpbmc6OkNyZWF0ZVRyYWNpbmdTZXNzaW9uKCkuCisgIGNsYXNzIFRyYWNpbmdT
ZXNzaW9uSW1wbCA6IHB1YmxpYyBUcmFjaW5nU2Vzc2lvbiB7CisgICBwdWJsaWM6CisgICAgVHJh
Y2luZ1Nlc3Npb25JbXBsKFRyYWNpbmdNdXhlckltcGwqLCBUcmFjaW5nU2Vzc2lvbkdsb2JhbElE
KTsKKyAgICB+VHJhY2luZ1Nlc3Npb25JbXBsKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBTZXR1cChj
b25zdCBUcmFjZUNvbmZpZyYsIGludCBmZCkgb3ZlcnJpZGU7CisgICAgdm9pZCBTdGFydCgpIG92
ZXJyaWRlOworICAgIHZvaWQgU3RhcnRCbG9ja2luZygpIG92ZXJyaWRlOworICAgIHZvaWQgU3Rv
cCgpIG92ZXJyaWRlOworICAgIHZvaWQgU3RvcEJsb2NraW5nKCkgb3ZlcnJpZGU7CisgICAgdm9p
ZCBSZWFkVHJhY2UoUmVhZFRyYWNlQ2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZvaWQgU2V0T25T
dG9wQ2FsbGJhY2soc3RkOjpmdW5jdGlvbjx2b2lkKCk+KSBvdmVycmlkZTsKKyAgICB2b2lkIEdl
dFRyYWNlU3RhdHMoR2V0VHJhY2VTdGF0c0NhbGxiYWNrKSBvdmVycmlkZTsKKworICAgcHJpdmF0
ZToKKyAgICBUcmFjaW5nTXV4ZXJJbXBsKiBjb25zdCBtdXhlcl87CisgICAgVHJhY2luZ1Nlc3Np
b25HbG9iYWxJRCBjb25zdCBzZXNzaW9uX2lkXzsKKyAgfTsKKworICBzdHJ1Y3QgUmVnaXN0ZXJl
ZERhdGFTb3VyY2UgeworICAgIERhdGFTb3VyY2VEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAg
RGF0YVNvdXJjZUZhY3RvcnkgZmFjdG9yeXt9OworICAgIERhdGFTb3VyY2VTdGF0aWNTdGF0ZSog
c3RhdGljX3N0YXRlID0gbnVsbHB0cjsKKyAgfTsKKworICBzdHJ1Y3QgUmVnaXN0ZXJlZEJhY2tl
bmQgeworICAgIC8vIEJhY2tlbmRzIGFyZSBzdXBwb3NlZCB0byBoYXZlIHN0YXRpYyBsaWZldGlt
ZS4KKyAgICBUcmFjaW5nQmFja2VuZCogYmFja2VuZCA9IG51bGxwdHI7CisgICAgVHJhY2luZ0Jh
Y2tlbmRJZCBpZCA9IDA7CisgICAgQmFja2VuZFR5cGUgdHlwZXt9OworCisgICAgc3RkOjp1bmlx
dWVfcHRyPFByb2R1Y2VySW1wbD4gcHJvZHVjZXI7CisKKyAgICAvLyBUaGUgY2FsbGluZyBjb2Rl
IGNhbiByZXF1ZXN0IG1vcmUgdGhhbiBvbmUgY29uY3VycmVudGx5IGFjdGl2ZSB0cmFjaW5nCisg
ICAgLy8gc2Vzc2lvbiBmb3IgdGhlIHNhbWUgYmFja2VuZC4gV2UgbmVlZCB0byBjcmVhdGUgb25l
IGNvbnN1bWVyIHBlciBzZXNzaW9uLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxD
b25zdW1lckltcGw+PiBjb25zdW1lcnM7CisgIH07CisKKyAgZXhwbGljaXQgVHJhY2luZ011eGVy
SW1wbChjb25zdCBUcmFjaW5nSW5pdEFyZ3MmKTsKKyAgdm9pZCBJbml0aWFsaXplKGNvbnN0IFRy
YWNpbmdJbml0QXJncyYgYXJncyk7CisgIENvbnN1bWVySW1wbCogRmluZENvbnN1bWVyKFRyYWNp
bmdTZXNzaW9uR2xvYmFsSUQgc2Vzc2lvbl9pZCk7CisgIHZvaWQgT25Db25zdW1lckRpc2Nvbm5l
Y3RlZChDb25zdW1lckltcGwqIGNvbnN1bWVyKTsKKworICBzdHJ1Y3QgRmluZERhdGFTb3VyY2VS
ZXMgeworICAgIEZpbmREYXRhU291cmNlUmVzKCkgPSBkZWZhdWx0OworICAgIEZpbmREYXRhU291
cmNlUmVzKERhdGFTb3VyY2VTdGF0aWNTdGF0ZSogYSwgRGF0YVNvdXJjZVN0YXRlKiBiLCB1aW50
MzJfdCBjKQorICAgICAgICA6IHN0YXRpY19zdGF0ZShhKSwgaW50ZXJuYWxfc3RhdGUoYiksIGlu
c3RhbmNlX2lkeChjKSB7fQorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJl
dHVybiAhIWludGVybmFsX3N0YXRlOyB9CisKKyAgICBEYXRhU291cmNlU3RhdGljU3RhdGUqIHN0
YXRpY19zdGF0ZSA9IG51bGxwdHI7CisgICAgRGF0YVNvdXJjZVN0YXRlKiBpbnRlcm5hbF9zdGF0
ZSA9IG51bGxwdHI7CisgICAgdWludDMyX3QgaW5zdGFuY2VfaWR4ID0gMDsKKyAgfTsKKyAgRmlu
ZERhdGFTb3VyY2VSZXMgRmluZERhdGFTb3VyY2UoVHJhY2luZ0JhY2tlbmRJZCwgRGF0YVNvdXJj
ZUluc3RhbmNlSUQpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpUYXNrUnVubmVyPiB0YXNr
X3J1bm5lcl87CisgIHN0ZDo6dmVjdG9yPFJlZ2lzdGVyZWREYXRhU291cmNlPiBkYXRhX3NvdXJj
ZXNfOworICBzdGQ6OnZlY3RvcjxSZWdpc3RlcmVkQmFja2VuZD4gYmFja2VuZHNfOworCisgIHN0
ZDo6YXRvbWljPFRyYWNpbmdTZXNzaW9uR2xvYmFsSUQ+IG5leHRfdHJhY2luZ19zZXNzaW9uX2lk
X3t9OworCisgIFBFUkZFVFRPX1RIUkVBRF9DSEVDS0VSKHRocmVhZF9jaGVja2VyXykKK307CisK
K30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNl
bmRpZiAgLy8gU1JDX1RSQUNJTkdfSU5URVJOQUxfVFJBQ0lOR19NVVhFUl9JTVBMX0hfCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC90cmFjaW5n
L2NvcmUvdHJhY2Vfc3RhdHMuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19F
WFRfVFJBQ0lOR19DT1JFX1RSQUNFX1NUQVRTX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9f
RVhUX1RSQUNJTkdfQ09SRV9UUkFDRV9TVEFUU19IXworCisvLyBDcmVhdGVzIHRoZSBhbGlhc2Vz
IGluIHRoZSA6OnBlcmZldHRvIG5hbWVzcGFjZSwgZG9pbmcgdGhpbmdzIGxpa2U6CisvLyB1c2lu
ZyA6OnBlcmZldHRvOjpGb28gPSA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6Rm9vLgorLy8gU2Vl
IGNvbW1lbnRzIGluIGZvcndhcmRfZGVjbHMuaCBmb3IgdGhlIGhpc3RvcmljYWwgcmVhc29ucyBv
ZiB0aGlzCisvLyBpbmRpcmVjdGlvbiBsYXllci4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21t
b24vdHJhY2Vfc3RhdHMuZ2VuLmgiCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRf
VFJBQ0lOR19DT1JFX1RSQUNFX1NUQVRTX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvY29yZS9kYXRhX3NvdXJjZV9jb25maWcuaAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NPUkVfREFUQV9TT1VS
Q0VfQ09ORklHX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19DT1JFX0RBVEFf
U09VUkNFX0NPTkZJR19IXworCisvLyBDcmVhdGVzIHRoZSBhbGlhc2VzIGluIHRoZSA6OnBlcmZl
dHRvIG5hbWVzcGFjZSwgZG9pbmcgdGhpbmdzIGxpa2U6CisvLyB1c2luZyA6OnBlcmZldHRvOjpG
b28gPSA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6Rm9vLgorLy8gU2VlIGNvbW1lbnRzIGluIGZv
cndhcmRfZGVjbHMuaCBmb3IgdGhlIGhpc3RvcmljYWwgcmVhc29ucyBvZiB0aGlzCisvLyBpbmRp
cmVjdGlvbiBsYXllci4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvZGF0YV9zb3VyY2Vf
Y29uZmlnLmdlbi5oIgorCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19DT1JF
X0RBVEFfU09VUkNFX0NPTkZJR19IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5k
cm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNo
ZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1
c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZ
b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6
Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1
aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUK
KyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkg
S0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0
YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInNyYy90cmFjaW5nL2ludGVybmFsL3RyYWNpbmdfbXV4ZXJfaW1wbC5o
IgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxt
dXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvdGFza19ydW5uZXIu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9i
YXNlL2hhc2guaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2V4dC9iYXNlL3RocmVhZF9jaGVja2VyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS93YWl0YWJsZV9ldmVudC5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29y
ZS90cmFjZV9wYWNrZXQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vfc3RhdHMuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vf
d3JpdGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9leHQvdHJhY2luZy9jb3JlL3RyYWNpbmdfc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9idWZmZXJfZXhoYXVzdGVkX3Bv
bGljeS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
dHJhY2luZy9jb3JlL2RhdGFfc291cmNlX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9kYXRhX3NvdXJjZS5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9pbnRlcm5h
bC9kYXRhX3NvdXJjZV9pbnRlcm5hbC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjZV93cml0ZXJfYmFzZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjaW5nLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5n
L3RyYWNpbmdfYmFja2VuZC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGlu
dGVybmFsIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgU3RvcEFyZ3NJbXBsIDogcHVibGljIERh
dGFTb3VyY2VCYXNlOjpTdG9wQXJncyB7CisgcHVibGljOgorICBzdGQ6OmZ1bmN0aW9uPHZvaWQo
KT4gSGFuZGxlU3RvcEFzeW5jaHJvbm91c2x5KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGF1dG8g
Y2xvc3VyZSA9IHN0ZDo6bW92ZShhc3luY19zdG9wX2Nsb3N1cmUpOworICAgIGFzeW5jX3N0b3Bf
Y2xvc3VyZSA9IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPigpOworICAgIHJldHVybiBjbG9zdXJlOwor
ICB9CisKKyAgbXV0YWJsZSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYXN5bmNfc3RvcF9jbG9zdXJl
OworfTsKKwordWludDY0X3QgQ29tcHV0ZUNvbmZpZ0hhc2goY29uc3QgRGF0YVNvdXJjZUNvbmZp
ZyYgY29uZmlnKSB7CisgIGJhc2U6Okhhc2ggaGFzaGVyOworICBzdGQ6OnN0cmluZyBjb25maWdf
Ynl0ZXMgPSBjb25maWcuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgaGFzaGVyLlVwZGF0ZShjb25m
aWdfYnl0ZXMuZGF0YSgpLCBjb25maWdfYnl0ZXMuc2l6ZSgpKTsKKyAgcmV0dXJuIGhhc2hlci5k
aWdlc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIC0tLS0tIEJlZ2luIG9mIFRyYWNp
bmdNdXhlckltcGw6OlByb2R1Y2VySW1wbAorVHJhY2luZ011eGVySW1wbDo6UHJvZHVjZXJJbXBs
OjpQcm9kdWNlckltcGwoVHJhY2luZ011eGVySW1wbCogbXV4ZXIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nQmFja2VuZElkIGJhY2tlbmRfaWQp
CisgICAgOiBtdXhlcl8obXV4ZXIpLCBiYWNrZW5kX2lkXyhiYWNrZW5kX2lkKSB7fQorVHJhY2lu
Z011eGVySW1wbDo6UHJvZHVjZXJJbXBsOjp+UHJvZHVjZXJJbXBsKCkgPSBkZWZhdWx0OworCit2
b2lkIFRyYWNpbmdNdXhlckltcGw6OlByb2R1Y2VySW1wbDo6SW5pdGlhbGl6ZSgKKyAgICBzdGQ6
OnVuaXF1ZV9wdHI8UHJvZHVjZXJFbmRwb2ludD4gZW5kcG9pbnQpIHsKKyAgc2VydmljZV8gPSBz
dGQ6Om1vdmUoZW5kcG9pbnQpOworfQorCit2b2lkIFRyYWNpbmdNdXhlckltcGw6OlByb2R1Y2Vy
SW1wbDo6T25Db25uZWN0KCkgeworICBQRVJGRVRUT19ETE9HKCJQcm9kdWNlciBjb25uZWN0ZWQi
KTsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBQRVJGRVRU
T19EQ0hFQ0soIWNvbm5lY3RlZF8pOworICBjb25uZWN0ZWRfID0gdHJ1ZTsKKyAgbXV4ZXJfLT5V
cGRhdGVEYXRhU291cmNlc09uQWxsQmFja2VuZHMoKTsKK30KKwordm9pZCBUcmFjaW5nTXV4ZXJJ
bXBsOjpQcm9kdWNlckltcGw6Ok9uRGlzY29ubmVjdCgpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RI
UkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBjb25uZWN0ZWRfID0gZmFsc2U7CisgIC8vIFRPRE86
IGhhbmRsZSBtb3JlIGdyYWNlZnVsLgorICBQRVJGRVRUT19FTE9HKCJDYW5ub3QgY29ubmVjdCB0
byB0cmFjZWQuIElzIGl0IHJ1bm5pbmc/Iik7Cit9CisKK3ZvaWQgVHJhY2luZ011eGVySW1wbDo6
UHJvZHVjZXJJbXBsOjpPblRyYWNpbmdTZXR1cCgpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVB
RCh0aHJlYWRfY2hlY2tlcl8pOworfQorCit2b2lkIFRyYWNpbmdNdXhlckltcGw6OlByb2R1Y2Vy
SW1wbDo6U2V0dXBEYXRhU291cmNlKAorICAgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGlkLAorICAg
IGNvbnN0IERhdGFTb3VyY2VDb25maWcmIGNmZykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFE
KHRocmVhZF9jaGVja2VyXyk7CisgIG11eGVyXy0+U2V0dXBEYXRhU291cmNlKGJhY2tlbmRfaWRf
LCBpZCwgY2ZnKTsKK30KKwordm9pZCBUcmFjaW5nTXV4ZXJJbXBsOjpQcm9kdWNlckltcGw6OlN0
YXJ0RGF0YVNvdXJjZShEYXRhU291cmNlSW5zdGFuY2VJRCBpZCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVNvdXJjZUNvbmZp
ZyYpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBtdXhl
cl8tPlN0YXJ0RGF0YVNvdXJjZShiYWNrZW5kX2lkXywgaWQpOworICBzZXJ2aWNlXy0+Tm90aWZ5
RGF0YVNvdXJjZVN0YXJ0ZWQoaWQpOworfQorCit2b2lkIFRyYWNpbmdNdXhlckltcGw6OlByb2R1
Y2VySW1wbDo6U3RvcERhdGFTb3VyY2UoRGF0YVNvdXJjZUluc3RhbmNlSUQgaWQpIHsKKyAgUEVS
RkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBtdXhlcl8tPlN0b3BEYXRh
U291cmNlX0FzeW5jQmVnaW4oYmFja2VuZF9pZF8sIGlkKTsKK30KKwordm9pZCBUcmFjaW5nTXV4
ZXJJbXBsOjpQcm9kdWNlckltcGw6OkZsdXNoKEZsdXNoUmVxdWVzdElEIGZsdXNoX2lkLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFTb3VyY2VJ
bnN0YW5jZUlEKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
aXplX3QpIHsKKyAgLy8gRmx1c2ggaXMgbm90IHBsdW1iZWQgZm9yIG5vdywgd2UganVzdCBhY2sg
c3RyYWlnaHQgYXdheS4KKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8p
OworICBzZXJ2aWNlXy0+Tm90aWZ5Rmx1c2hDb21wbGV0ZShmbHVzaF9pZCk7Cit9CisKK3ZvaWQg
VHJhY2luZ011eGVySW1wbDo6UHJvZHVjZXJJbXBsOjpDbGVhckluY3JlbWVudGFsU3RhdGUoCisg
ICAgY29uc3QgRGF0YVNvdXJjZUluc3RhbmNlSUQqLAorICAgIHNpemVfdCkgeworICBQRVJGRVRU
T19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIC8vIFRPRE8oc2t5b3N0aWwpOiBN
YXJrIGVhY2ggYWZmZWN0ZWQgZGF0YSBzb3VyY2UncyBpbmNyZW1lbnRhbCBzdGF0ZSBhcworICAv
LyBuZWVkaW5nIHRvIGJlIGNsZWFyZWQuCit9CisvLyAtLS0tLSBFbmQgb2YgVHJhY2luZ011eGVy
SW1wbDo6UHJvZHVjZXJJbXBsIG1ldGhvZHMuCisKKy8vIC0tLS0tIEJlZ2luIG9mIFRyYWNpbmdN
dXhlckltcGw6OkNvbnN1bWVySW1wbAorVHJhY2luZ011eGVySW1wbDo6Q29uc3VtZXJJbXBsOjpD
b25zdW1lckltcGwoVHJhY2luZ011eGVySW1wbCogbXV4ZXIsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nQmFja2VuZElkIGJhY2tlbmRfaWQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nU2Vzc2lv
bkdsb2JhbElEIHNlc3Npb25faWQpCisgICAgOiBtdXhlcl8obXV4ZXIpLCBiYWNrZW5kX2lkXyhi
YWNrZW5kX2lkKSwgc2Vzc2lvbl9pZF8oc2Vzc2lvbl9pZCkge30KKworVHJhY2luZ011eGVySW1w
bDo6Q29uc3VtZXJJbXBsOjp+Q29uc3VtZXJJbXBsKCkgPSBkZWZhdWx0OworCit2b2lkIFRyYWNp
bmdNdXhlckltcGw6OkNvbnN1bWVySW1wbDo6SW5pdGlhbGl6ZSgKKyAgICBzdGQ6OnVuaXF1ZV9w
dHI8Q29uc3VtZXJFbmRwb2ludD4gZW5kcG9pbnQpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVB
RCh0aHJlYWRfY2hlY2tlcl8pOworICBzZXJ2aWNlXyA9IHN0ZDo6bW92ZShlbmRwb2ludCk7Cisg
IC8vIE9ic2VydmUgZGF0YSBzb3VyY2UgaW5zdGFuY2UgZXZlbnRzIHNvIHdlIGdldCBub3RpZmll
ZCB3aGVuIHRyYWNpbmcgc3RhcnRzLgorICBzZXJ2aWNlXy0+T2JzZXJ2ZUV2ZW50cyhPYnNlcnZh
YmxlRXZlbnRzOjpUWVBFX0RBVEFfU09VUkNFU19JTlNUQU5DRVMpOworfQorCit2b2lkIFRyYWNp
bmdNdXhlckltcGw6OkNvbnN1bWVySW1wbDo6T25Db25uZWN0KCkgeworICBQRVJGRVRUT19EQ0hF
Q0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFBFUkZFVFRPX0RDSEVDSyghY29ubmVjdGVk
Xyk7CisgIGNvbm5lY3RlZF8gPSB0cnVlOworCisgIC8vIElmIHRoZSBBUEkgY2xpZW50IGNvbmZp
Z3VyZWQgYW5kIHN0YXJ0ZWQgdHJhY2luZyBiZWZvcmUgd2UgY29ubmVjdGVkLAorICAvLyB0ZWxs
IHRoZSBiYWNrZW5kIGFib3V0IGl0IG5vdy4KKyAgaWYgKHRyYWNlX2NvbmZpZ18pIHsKKyAgICBt
dXhlcl8tPlNldHVwVHJhY2luZ1Nlc3Npb24oc2Vzc2lvbl9pZF8sIHRyYWNlX2NvbmZpZ18pOwor
ICAgIGlmIChzdGFydF9wZW5kaW5nXykKKyAgICAgIG11eGVyXy0+U3RhcnRUcmFjaW5nU2Vzc2lv
bihzZXNzaW9uX2lkXyk7CisgICAgaWYgKHN0b3BfcGVuZGluZ18pCisgICAgICBtdXhlcl8tPlN0
b3BUcmFjaW5nU2Vzc2lvbihzZXNzaW9uX2lkXyk7CisgIH0KK30KKwordm9pZCBUcmFjaW5nTXV4
ZXJJbXBsOjpDb25zdW1lckltcGw6Ok9uRGlzY29ubmVjdCgpIHsKKyAgUEVSRkVUVE9fRENIRUNL
X1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICAvLyBJdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5
IHRvIGNhbGwgU3RvcFRyYWNpbmdTZXNzaW9uLiBJZiB3ZSBnZXQgdGhpcyBjYWxsCisgIC8vIGl0
IG1lYW5zIHRoYXQgdGhlIHNlcnZpY2UgZGlkIHNodXRkb3duIGJlZm9yZSB1cywgc28gdGhlcmUg
aXMgbm8gcG9pbnQKKyAgLy8gdHJ5aW5nIGl0IHRvIGFzayBpdCB0byBzdG9wIHRoZSBzZXNzaW9u
LiBXZSBzaG91bGQganVzdCByZW1lbWJlciB0byBjbGVhbnVwCisgIC8vIHRoZSBjb25zdW1lciB2
ZWN0b3IuCisgIGNvbm5lY3RlZF8gPSBmYWxzZTsKKworICAvLyBUT0RPIG5vdGlmeSB0aGUgY2xp
ZW50IHNvbWVob3cuCisKKyAgLy8gTm90aWZ5IHRoZSBtdXhlciB0aGF0IGl0IGlzIHNhZmUgdG8g
ZGVzdHJveSB8dGhpc3wuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UKKyAgLy8gdGhlIENvbnN1bWVy
RW5kcG9pbnQgc3RvcmVkIGluIHxzZXJ2aWNlX3wgcmVxdWlyZXMgdGhhdCB8dGhpc3wgYmUgc2Fm
ZSB0bworICAvLyBhY2Nlc3MgdW50aWwgT25EaXNjb25uZWN0KCkgaXMgY2FsbGVkLgorICBtdXhl
cl8tPk9uQ29uc3VtZXJEaXNjb25uZWN0ZWQodGhpcyk7Cit9CisKK3ZvaWQgVHJhY2luZ011eGVy
SW1wbDo6Q29uc3VtZXJJbXBsOjpEaXNjb25uZWN0KCkgeworICAvLyBUaGlzIGlzIHdlaXJkIGFu
ZCBkZXNlcnZlcyBhIGNvbW1lbnQuCisgIC8vCisgIC8vIFdoZW4gd2UgY2FsbGVkIHRoZSBDb25u
ZWN0Q29uc3VtZXIgbWV0aG9kIG9uIHRoZSBzZXJ2aWNlIGl0IHJldHVybnMKKyAgLy8gdXMgYSBD
b25zdW1lckVuZHBvaW50IHdoaWNoIHdlIHN0b3JlZCBpbiB8c2VydmljZV98LCBob3dldmVyIHRo
aXMKKyAgLy8gQ29uc3VtZXJFbmRwb2ludCBob2xkcyBhIHBvaW50ZXIgdG8gdGhlIENvbnN1bWVy
SW1wbCBwb2ludGVkIHRvIGJ5CisgIC8vIHx0aGlzfC4gUGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0
IHRvIFRyYWNpbmdTZXJ2aWNlOjpDb25uZWN0Q29uc3VtZXIgaXMgdGhhdAorICAvLyB0aGUgQ29u
c3VtZXJJbXBsIHBvaW50ZXIgaGFzIHRvIGJlIHZhbGlkIHVudGlsIHRoZQorICAvLyBDb25zdW1l
ckltcGw6Ok9uRGlzY29ubmVjdCBtZXRob2QgaXMgY2FsbGVkLiBUaGVyZWZvcmUgd2UgcmVzZXQg
dGhlCisgIC8vIENvbnN1bWVyRW5kcG9pbnQgfHNlcnZpY2VffC4gRXZlbnR1YWxseSB0aGlzIHdp
bGwgY2FsbAorICAvLyBDb25zdW1lckltcGw6Ok9uRGlzY29ubmVjdCBhbmQgd2Ugd2lsbCBpbmZv
cm0gdGhlIG11eGVyIGl0IGlzIHNhZmUgdG8KKyAgLy8gY2FsbCB0aGUgZGVzdHJ1Y3RvciBvZiB8
dGhpc3wuCisgIHNlcnZpY2VfLnJlc2V0KCk7Cit9CisKK3ZvaWQgVHJhY2luZ011eGVySW1wbDo6
Q29uc3VtZXJJbXBsOjpPblRyYWNpbmdEaXNhYmxlZCgpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RI
UkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBQRVJGRVRUT19EQ0hFQ0soIXN0b3BwZWRfKTsKKyAg
c3RvcHBlZF8gPSB0cnVlOworICAvLyBJZiB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgc3Rh
cnQgZXZlbnQsIGZpcmUgaXQgbm93LiBUaGlzIG1heSBoYXBwZW4gaWYKKyAgLy8gdGhlcmUgYXJl
IG5vIGFjdGl2ZSBkYXRhIHNvdXJjZXMgaW4gdGhlIHNlc3Npb24uCisgIE5vdGlmeVN0YXJ0Q29t
cGxldGUoKTsKKyAgTm90aWZ5U3RvcENvbXBsZXRlKCk7Cit9CisKK3ZvaWQgVHJhY2luZ011eGVy
SW1wbDo6Q29uc3VtZXJJbXBsOjpOb3RpZnlTdGFydENvbXBsZXRlKCkgeworICBQRVJGRVRUT19E
Q0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGlmIChibG9ja2luZ19zdGFydF9jb21w
bGV0ZV9jYWxsYmFja18pIHsKKyAgICBtdXhlcl8tPnRhc2tfcnVubmVyXy0+UG9zdFRhc2soCisg
ICAgICAgIHN0ZDo6bW92ZShibG9ja2luZ19zdGFydF9jb21wbGV0ZV9jYWxsYmFja18pKTsKKyAg
ICBibG9ja2luZ19zdGFydF9jb21wbGV0ZV9jYWxsYmFja18gPSBudWxscHRyOworICB9Cit9CisK
K3ZvaWQgVHJhY2luZ011eGVySW1wbDo6Q29uc3VtZXJJbXBsOjpOb3RpZnlTdG9wQ29tcGxldGUo
KSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgaWYgKHN0
b3BfY29tcGxldGVfY2FsbGJhY2tfKSB7CisgICAgbXV4ZXJfLT50YXNrX3J1bm5lcl8tPlBvc3RU
YXNrKHN0ZDo6bW92ZShzdG9wX2NvbXBsZXRlX2NhbGxiYWNrXykpOworICAgIHN0b3BfY29tcGxl
dGVfY2FsbGJhY2tfID0gbnVsbHB0cjsKKyAgfQorICBpZiAoYmxvY2tpbmdfc3RvcF9jb21wbGV0
ZV9jYWxsYmFja18pIHsKKyAgICBtdXhlcl8tPnRhc2tfcnVubmVyXy0+UG9zdFRhc2soc3RkOjpt
b3ZlKGJsb2NraW5nX3N0b3BfY29tcGxldGVfY2FsbGJhY2tfKSk7CisgICAgYmxvY2tpbmdfc3Rv
cF9jb21wbGV0ZV9jYWxsYmFja18gPSBudWxscHRyOworICB9Cit9CisKK3ZvaWQgVHJhY2luZ011
eGVySW1wbDo6Q29uc3VtZXJJbXBsOjpPblRyYWNlRGF0YSgKKyAgICBzdGQ6OnZlY3RvcjxUcmFj
ZVBhY2tldD4gcGFja2V0cywKKyAgICBib29sIGhhc19tb3JlKSB7CisgIFBFUkZFVFRPX0RDSEVD
S19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgaWYgKCFyZWFkX3RyYWNlX2NhbGxiYWNrXykK
KyAgICByZXR1cm47CisKKyAgc2l6ZV90IGNhcGFjaXR5ID0gMDsKKyAgZm9yIChjb25zdCBhdXRv
JiBwYWNrZXQgOiBwYWNrZXRzKSB7CisgICAgLy8gMTYgaXMgYW4gb3Zlci1lc3RpbWF0aW9uIG9m
IHRoZSBwcm90byBwcmVhbWJsZSBzaXplCisgICAgY2FwYWNpdHkgKz0gcGFja2V0LnNpemUoKSAr
IDE2OworICB9CisKKyAgLy8gVGhlIHNoYXJlZF9wdHIgaXMgdG8gYXZvaWQgbWFraW5nIGEgY29w
eSBvZiB0aGUgYnVmZmVyIHdoZW4gUG9zdFRhc2staW5nLgorICBzdGQ6OnNoYXJlZF9wdHI8c3Rk
Ojp2ZWN0b3I8Y2hhcj4+IGJ1ZihuZXcgc3RkOjp2ZWN0b3I8Y2hhcj4oKSk7CisgIGJ1Zi0+cmVz
ZXJ2ZShjYXBhY2l0eSk7CisgIGZvciAoYXV0byYgcGFja2V0IDogcGFja2V0cykgeworICAgIGNo
YXIqIHN0YXJ0OworICAgIHNpemVfdCBzaXplOworICAgIHN0ZDo6dGllKHN0YXJ0LCBzaXplKSA9
IHBhY2tldC5HZXRQcm90b1ByZWFtYmxlKCk7CisgICAgYnVmLT5pbnNlcnQoYnVmLT5lbmQoKSwg
c3RhcnQsIHN0YXJ0ICsgc2l6ZSk7CisgICAgZm9yIChhdXRvJiBzbGljZSA6IHBhY2tldC5zbGlj
ZXMoKSkgeworICAgICAgY29uc3QgYXV0byogc2xpY2VfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgY2hhcio+KHNsaWNlLnN0YXJ0KTsKKyAgICAgIGJ1Zi0+aW5zZXJ0KGJ1Zi0+ZW5kKCks
IHNsaWNlX2RhdGEsIHNsaWNlX2RhdGEgKyBzbGljZS5zaXplKTsKKyAgICB9CisgIH0KKworICBh
dXRvIGNhbGxiYWNrID0gcmVhZF90cmFjZV9jYWxsYmFja187CisgIG11eGVyXy0+dGFza19ydW5u
ZXJfLT5Qb3N0VGFzayhbY2FsbGJhY2ssIGJ1ZiwgaGFzX21vcmVdIHsKKyAgICBUcmFjaW5nU2Vz
c2lvbjo6UmVhZFRyYWNlQ2FsbGJhY2tBcmdzIGNhbGxiYWNrX2FyZ3t9OworICAgIGNhbGxiYWNr
X2FyZy5kYXRhID0gYnVmLT5zaXplKCkgPyAmKCpidWYpWzBdIDogbnVsbHB0cjsKKyAgICBjYWxs
YmFja19hcmcuc2l6ZSA9IGJ1Zi0+c2l6ZSgpOworICAgIGNhbGxiYWNrX2FyZy5oYXNfbW9yZSA9
IGhhc19tb3JlOworICAgIGNhbGxiYWNrKGNhbGxiYWNrX2FyZyk7CisgIH0pOworCisgIGlmICgh
aGFzX21vcmUpCisgICAgcmVhZF90cmFjZV9jYWxsYmFja18gPSBudWxscHRyOworfQorCit2b2lk
IFRyYWNpbmdNdXhlckltcGw6OkNvbnN1bWVySW1wbDo6T25PYnNlcnZhYmxlRXZlbnRzKAorICAg
IGNvbnN0IE9ic2VydmFibGVFdmVudHMmIGV2ZW50cykgeworICBpZiAoZXZlbnRzLmluc3RhbmNl
X3N0YXRlX2NoYW5nZXNfc2l6ZSgpKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBzdGF0ZV9jaGFu
Z2UgOiBldmVudHMuaW5zdGFuY2Vfc3RhdGVfY2hhbmdlcygpKSB7CisgICAgICBEYXRhU291cmNl
SGFuZGxlIGhhbmRsZXtzdGF0ZV9jaGFuZ2UucHJvZHVjZXJfbmFtZSgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGVfY2hhbmdlLmRhdGFfc291cmNlX25hbWUoKX07CisgICAg
ICBkYXRhX3NvdXJjZV9zdGF0ZXNfW2hhbmRsZV0gPQorICAgICAgICAgIHN0YXRlX2NoYW5nZS5z
dGF0ZSgpID09CisgICAgICAgICAgT2JzZXJ2YWJsZUV2ZW50czo6REFUQV9TT1VSQ0VfSU5TVEFO
Q0VfU1RBVEVfU1RBUlRFRDsKKyAgICB9CisgICAgLy8gRGF0YSBzb3VyY2VzIGFyZSBmaXJzdCBy
ZXBvcnRlZCBhcyBiZWluZyBzdG9wcGVkIGJlZm9yZSBzdGFydGluZywgc28gb25jZQorICAgIC8v
IGFsbCB0aGUgZGF0YSBzb3VyY2VzIHdlIGtub3cgYWJvdXQgaGF2ZSBzdGFydGVkIHdlIGNhbiBk
ZWNsYXJlIHRyYWNpbmcKKyAgICAvLyBiZWd1bi4KKyAgICBpZiAoYmxvY2tpbmdfc3RhcnRfY29t
cGxldGVfY2FsbGJhY2tfKSB7CisgICAgICBib29sIGFsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCA9
IHN0ZDo6YWxsX29mKAorICAgICAgICAgIGRhdGFfc291cmNlX3N0YXRlc18uY2JlZ2luKCksIGRh
dGFfc291cmNlX3N0YXRlc18uY2VuZCgpLAorICAgICAgICAgIFtdKHN0ZDo6cGFpcjxEYXRhU291
cmNlSGFuZGxlLCBib29sPiBzdGF0ZSkgeyByZXR1cm4gc3RhdGUuc2Vjb25kOyB9KTsKKyAgICAg
IGlmIChhbGxfZGF0YV9zb3VyY2VzX3N0YXJ0ZWQpCisgICAgICAgIE5vdGlmeVN0YXJ0Q29tcGxl
dGUoKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUcmFjaW5nTXV4ZXJJbXBsOjpDb25zdW1lcklt
cGw6Ok9uVHJhY2VTdGF0cygKKyAgICBib29sIHN1Y2Nlc3MsCisgICAgY29uc3QgVHJhY2VTdGF0
cyYgdHJhY2Vfc3RhdHMpIHsKKyAgaWYgKCFnZXRfdHJhY2Vfc3RhdHNfY2FsbGJhY2tfKQorICAg
IHJldHVybjsKKyAgVHJhY2luZ1Nlc3Npb246OkdldFRyYWNlU3RhdHNDYWxsYmFja0FyZ3MgY2Fs
bGJhY2tfYXJne307CisgIGNhbGxiYWNrX2FyZy5zdWNjZXNzID0gc3VjY2VzczsKKyAgY2FsbGJh
Y2tfYXJnLnRyYWNlX3N0YXRzX2RhdGEgPSB0cmFjZV9zdGF0cy5TZXJpYWxpemVBc0FycmF5KCk7
CisgIG11eGVyXy0+dGFza19ydW5uZXJfLT5Qb3N0VGFzaygKKyAgICAgIHN0ZDo6YmluZChzdGQ6
Om1vdmUoZ2V0X3RyYWNlX3N0YXRzX2NhbGxiYWNrXyksIHN0ZDo6bW92ZShjYWxsYmFja19hcmcp
KSk7CisgIGdldF90cmFjZV9zdGF0c19jYWxsYmFja18gPSBudWxscHRyOworfQorCisvLyBUaGUg
Y2FsbGJhY2tzIGJlbG93IGFyZSBub3QgdXNlZC4KK3ZvaWQgVHJhY2luZ011eGVySW1wbDo6Q29u
c3VtZXJJbXBsOjpPbkRldGFjaChib29sKSB7fQordm9pZCBUcmFjaW5nTXV4ZXJJbXBsOjpDb25z
dW1lckltcGw6Ok9uQXR0YWNoKGJvb2wsIGNvbnN0IFRyYWNlQ29uZmlnJikge30KKy8vIC0tLS0t
IEVuZCBvZiBUcmFjaW5nTXV4ZXJJbXBsOjpDb25zdW1lckltcGwKKworLy8gLS0tLS0gQmVnaW4g
b2YgVHJhY2luZ011eGVySW1wbDo6VHJhY2luZ1Nlc3Npb25JbXBsCisKKy8vIFRyYWNpbmdTZXNz
aW9uSW1wbCBpcyB0aGUgUkFJSSBvYmplY3QgcmV0dXJuZWQgdG8gQVBJIGNsaWVudHMgd2hlbiB0
aGV5CisvLyBpbnZva2UgVHJhY2luZzo6Q3JlYXRlVHJhY2luZ1Nlc3Npb24uIFRoZXkgdXNlIGl0
IGZvciBzdGFydGluZy9zdG9wcGluZworLy8gdHJhY2luZy4KKworVHJhY2luZ011eGVySW1wbDo6
VHJhY2luZ1Nlc3Npb25JbXBsOjpUcmFjaW5nU2Vzc2lvbkltcGwoCisgICAgVHJhY2luZ011eGVy
SW1wbCogbXV4ZXIsCisgICAgVHJhY2luZ1Nlc3Npb25HbG9iYWxJRCBzZXNzaW9uX2lkKQorICAg
IDogbXV4ZXJfKG11eGVyKSwgc2Vzc2lvbl9pZF8oc2Vzc2lvbl9pZCkge30KKworLy8gQ2FuIGJl
IGRlc3Ryb3llZCBmcm9tIGFueSB0aHJlYWQuCitUcmFjaW5nTXV4ZXJJbXBsOjpUcmFjaW5nU2Vz
c2lvbkltcGw6On5UcmFjaW5nU2Vzc2lvbkltcGwoKSB7CisgIGF1dG8qIG11eGVyID0gbXV4ZXJf
OworICBhdXRvIHNlc3Npb25faWQgPSBzZXNzaW9uX2lkXzsKKyAgbXV4ZXItPnRhc2tfcnVubmVy
Xy0+UG9zdFRhc2soCisgICAgICBbbXV4ZXIsIHNlc3Npb25faWRdIHsgbXV4ZXItPkRlc3Ryb3lU
cmFjaW5nU2Vzc2lvbihzZXNzaW9uX2lkKTsgfSk7Cit9CisKKy8vIENhbiBiZSBjYWxsZWQgZnJv
bSBhbnkgdGhyZWFkLgordm9pZCBUcmFjaW5nTXV4ZXJJbXBsOjpUcmFjaW5nU2Vzc2lvbkltcGw6
OlNldHVwKGNvbnN0IFRyYWNlQ29uZmlnJiBjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkKSB7CisgIGF1dG8qIG11eGVyID0gbXV4ZXJf
OworICBhdXRvIHNlc3Npb25faWQgPSBzZXNzaW9uX2lkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRy
YWNlQ29uZmlnPiB0cmFjZV9jb25maWcobmV3IFRyYWNlQ29uZmlnKGNmZykpOworICBpZiAoZmQg
Pj0gMCkgeworICAgIHRyYWNlX2NvbmZpZy0+c2V0X3dyaXRlX2ludG9fZmlsZSh0cnVlKTsKKyAg
ICBmZCA9IGR1cChmZCk7CisgIH0KKyAgbXV4ZXItPnRhc2tfcnVubmVyXy0+UG9zdFRhc2soW211
eGVyLCBzZXNzaW9uX2lkLCB0cmFjZV9jb25maWcsIGZkXSB7CisgICAgbXV4ZXItPlNldHVwVHJh
Y2luZ1Nlc3Npb24oc2Vzc2lvbl9pZCwgdHJhY2VfY29uZmlnLCBiYXNlOjpTY29wZWRGaWxlKGZk
KSk7CisgIH0pOworfQorCisvLyBDYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KK3ZvaWQg
VHJhY2luZ011eGVySW1wbDo6VHJhY2luZ1Nlc3Npb25JbXBsOjpTdGFydCgpIHsKKyAgYXV0byog
bXV4ZXIgPSBtdXhlcl87CisgIGF1dG8gc2Vzc2lvbl9pZCA9IHNlc3Npb25faWRfOworICBtdXhl
ci0+dGFza19ydW5uZXJfLT5Qb3N0VGFzaygKKyAgICAgIFttdXhlciwgc2Vzc2lvbl9pZF0geyBt
dXhlci0+U3RhcnRUcmFjaW5nU2Vzc2lvbihzZXNzaW9uX2lkKTsgfSk7Cit9CisKKy8vIENhbiBi
ZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkIGV4Y2VwdCB0aGUgc2VydmljZSB0aHJlYWQuCit2b2lk
IFRyYWNpbmdNdXhlckltcGw6OlRyYWNpbmdTZXNzaW9uSW1wbDo6U3RhcnRCbG9ja2luZygpIHsK
KyAgUEVSRkVUVE9fRENIRUNLKCFtdXhlcl8tPnRhc2tfcnVubmVyXy0+UnVuc1Rhc2tzT25DdXJy
ZW50VGhyZWFkKCkpOworICBhdXRvKiBtdXhlciA9IG11eGVyXzsKKyAgYXV0byBzZXNzaW9uX2lk
ID0gc2Vzc2lvbl9pZF87CisgIGJhc2U6OldhaXRhYmxlRXZlbnQgdHJhY2luZ19zdGFydGVkOwor
ICBtdXhlci0+dGFza19ydW5uZXJfLT5Qb3N0VGFzayhbbXV4ZXIsIHNlc3Npb25faWQsICZ0cmFj
aW5nX3N0YXJ0ZWRdIHsKKyAgICBhdXRvKiBjb25zdW1lciA9IG11eGVyLT5GaW5kQ29uc3VtZXIo
c2Vzc2lvbl9pZCk7CisgICAgUEVSRkVUVE9fRENIRUNLKCFjb25zdW1lci0+YmxvY2tpbmdfc3Rh
cnRfY29tcGxldGVfY2FsbGJhY2tfKTsKKyAgICBjb25zdW1lci0+YmxvY2tpbmdfc3RhcnRfY29t
cGxldGVfY2FsbGJhY2tfID0gWyZdIHsKKyAgICAgIHRyYWNpbmdfc3RhcnRlZC5Ob3RpZnkoKTsK
KyAgICB9OworICAgIG11eGVyLT5TdGFydFRyYWNpbmdTZXNzaW9uKHNlc3Npb25faWQpOworICB9
KTsKKyAgdHJhY2luZ19zdGFydGVkLldhaXQoKTsKK30KKworLy8gQ2FuIGJlIGNhbGxlZCBmcm9t
IGFueSB0aHJlYWQuCit2b2lkIFRyYWNpbmdNdXhlckltcGw6OlRyYWNpbmdTZXNzaW9uSW1wbDo6
U3RvcCgpIHsKKyAgYXV0byogbXV4ZXIgPSBtdXhlcl87CisgIGF1dG8gc2Vzc2lvbl9pZCA9IHNl
c3Npb25faWRfOworICBtdXhlci0+dGFza19ydW5uZXJfLT5Qb3N0VGFzaygKKyAgICAgIFttdXhl
ciwgc2Vzc2lvbl9pZF0geyBtdXhlci0+U3RvcFRyYWNpbmdTZXNzaW9uKHNlc3Npb25faWQpOyB9
KTsKK30KKworLy8gQ2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQgZXhjZXB0IHRoZSBzZXJ2
aWNlIHRocmVhZC4KK3ZvaWQgVHJhY2luZ011eGVySW1wbDo6VHJhY2luZ1Nlc3Npb25JbXBsOjpT
dG9wQmxvY2tpbmcoKSB7CisgIFBFUkZFVFRPX0RDSEVDSyghbXV4ZXJfLT50YXNrX3J1bm5lcl8t
PlJ1bnNUYXNrc09uQ3VycmVudFRocmVhZCgpKTsKKyAgYXV0byogbXV4ZXIgPSBtdXhlcl87Cisg
IGF1dG8gc2Vzc2lvbl9pZCA9IHNlc3Npb25faWRfOworICBiYXNlOjpXYWl0YWJsZUV2ZW50IHRy
YWNpbmdfc3RvcHBlZDsKKyAgbXV4ZXItPnRhc2tfcnVubmVyXy0+UG9zdFRhc2soW211eGVyLCBz
ZXNzaW9uX2lkLCAmdHJhY2luZ19zdG9wcGVkXSB7CisgICAgYXV0byogY29uc3VtZXIgPSBtdXhl
ci0+RmluZENvbnN1bWVyKHNlc3Npb25faWQpOworICAgIFBFUkZFVFRPX0RDSEVDSyghY29uc3Vt
ZXItPmJsb2NraW5nX3N0b3BfY29tcGxldGVfY2FsbGJhY2tfKTsKKyAgICBjb25zdW1lci0+Ymxv
Y2tpbmdfc3RvcF9jb21wbGV0ZV9jYWxsYmFja18gPSBbJl0geworICAgICAgdHJhY2luZ19zdG9w
cGVkLk5vdGlmeSgpOworICAgIH07CisgICAgbXV4ZXItPlN0b3BUcmFjaW5nU2Vzc2lvbihzZXNz
aW9uX2lkKTsKKyAgfSk7CisgIHRyYWNpbmdfc3RvcHBlZC5XYWl0KCk7Cit9CisKKy8vIENhbiBi
ZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgordm9pZCBUcmFjaW5nTXV4ZXJJbXBsOjpUcmFjaW5n
U2Vzc2lvbkltcGw6OlJlYWRUcmFjZShSZWFkVHJhY2VDYWxsYmFjayBjYikgeworICBhdXRvKiBt
dXhlciA9IG11eGVyXzsKKyAgYXV0byBzZXNzaW9uX2lkID0gc2Vzc2lvbl9pZF87CisgIG11eGVy
LT50YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFttdXhlciwgc2Vzc2lvbl9pZCwgY2JdIHsKKyAgICBt
dXhlci0+UmVhZFRyYWNpbmdTZXNzaW9uRGF0YShzZXNzaW9uX2lkLCBzdGQ6Om1vdmUoY2IpKTsK
KyAgfSk7Cit9CisKKy8vIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgordm9pZCBUcmFj
aW5nTXV4ZXJJbXBsOjpUcmFjaW5nU2Vzc2lvbkltcGw6OlNldE9uU3RvcENhbGxiYWNrKAorICAg
IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjYikgeworICBhdXRvKiBtdXhlciA9IG11eGVyXzsKKyAg
YXV0byBzZXNzaW9uX2lkID0gc2Vzc2lvbl9pZF87CisgIG11eGVyLT50YXNrX3J1bm5lcl8tPlBv
c3RUYXNrKFttdXhlciwgc2Vzc2lvbl9pZCwgY2JdIHsKKyAgICBhdXRvKiBjb25zdW1lciA9IG11
eGVyLT5GaW5kQ29uc3VtZXIoc2Vzc2lvbl9pZCk7CisgICAgY29uc3VtZXItPnN0b3BfY29tcGxl
dGVfY2FsbGJhY2tfID0gY2I7CisgIH0pOworfQorCisvLyBDYW4gYmUgY2FsbGVkIGZyb20gYW55
IHRocmVhZC4KK3ZvaWQgVHJhY2luZ011eGVySW1wbDo6VHJhY2luZ1Nlc3Npb25JbXBsOjpHZXRU
cmFjZVN0YXRzKAorICAgIEdldFRyYWNlU3RhdHNDYWxsYmFjayBjYikgeworICBhdXRvKiBtdXhl
ciA9IG11eGVyXzsKKyAgYXV0byBzZXNzaW9uX2lkID0gc2Vzc2lvbl9pZF87CisgIG11eGVyLT50
YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFttdXhlciwgc2Vzc2lvbl9pZCwgY2JdIHsKKyAgICBtdXhl
ci0+R2V0VHJhY2VTdGF0cyhzZXNzaW9uX2lkLCBzdGQ6Om1vdmUoY2IpKTsKKyAgfSk7Cit9CisK
Ky8vIC0tLS0tIEVuZCBvZiBUcmFjaW5nTXV4ZXJJbXBsOjpUcmFjaW5nU2Vzc2lvbkltcGwKKwor
Ly8gc3RhdGljCitUcmFjaW5nTXV4ZXIqIFRyYWNpbmdNdXhlcjo6aW5zdGFuY2VfID0gbnVsbHB0
cjsKKworLy8gVGhpcyBpcyBjYWxsZWQgYnkgcGVyZmV0dG86OlRyYWNpbmc6OkluaXRpYWxpemUo
KS4KKy8vIENhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZC4gVHlwaWNhbGx5LCBidXQgbm90IG5l
Y2Vzc2FyaWx5LCB0aGF0IHdpbGwgYmUKKy8vIHRoZSBlbWJlZGRlcidzIG1haW4gdGhyZWFkLgor
VHJhY2luZ011eGVySW1wbDo6VHJhY2luZ011eGVySW1wbChjb25zdCBUcmFjaW5nSW5pdEFyZ3Mm
IGFyZ3MpCisgICAgOiBUcmFjaW5nTXV4ZXIoYXJncy5wbGF0Zm9ybSA/IGFyZ3MucGxhdGZvcm0K
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUGxhdGZvcm06OkdldERlZmF1bHRQ
bGF0Zm9ybSgpKSB7CisgIFBFUkZFVFRPX0RFVEFDSF9GUk9NX1RIUkVBRCh0aHJlYWRfY2hlY2tl
cl8pOworCisgIC8vIENyZWF0ZSB0aGUgdGhyZWFkIHdoZXJlIG11eGVyLCBwcm9kdWNlcnMgYW5k
IHNlcnZpY2Ugd2lsbCBsaXZlLgorICB0YXNrX3J1bm5lcl8gPSBwbGF0Zm9ybV8tPkNyZWF0ZVRh
c2tSdW5uZXIoe30pOworCisgIC8vIFJ1biB0aGUgaW5pdGlhbGl6ZXIgb24gdGhhdCB0aHJlYWQu
CisgIHRhc2tfcnVubmVyXy0+UG9zdFRhc2soW3RoaXMsIGFyZ3NdIHsgSW5pdGlhbGl6ZShhcmdz
KTsgfSk7Cit9CisKK3ZvaWQgVHJhY2luZ011eGVySW1wbDo6SW5pdGlhbGl6ZShjb25zdCBUcmFj
aW5nSW5pdEFyZ3MmIGFyZ3MpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hl
Y2tlcl8pOyAgLy8gUmViaW5kIHRoZSB0aHJlYWQgY2hlY2tlci4KKworICBhdXRvIGFkZF9iYWNr
ZW5kID0gW3RoaXMsICZhcmdzXShUcmFjaW5nQmFja2VuZCogYmFja2VuZCwgQmFja2VuZFR5cGUg
dHlwZSkgeworICAgIGlmICghYmFja2VuZCkgeworICAgICAgLy8gV2Ugc2tpcCB0aGUgbG9nIGlu
IHJlbGVhc2UgYnVpbGRzIGJlY2F1c2UgdGhlICpfYmFja2VuZF9mYWtlLmNjIGNvZGUKKyAgICAg
IC8vIGhhcyBhbHJlYWR5IGFuIEVMT0cgYmVmb3JlIHJldHVybmluZyBhIG51bGxwdHIuCisgICAg
ICBQRVJGRVRUT19ETE9HKCJCYWNrZW5kIGNyZWF0aW9uIGZhaWxlZCwgdHlwZSAlZCIsIHN0YXRp
Y19jYXN0PGludD4odHlwZSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUcmFjaW5nQmFj
a2VuZElkIGJhY2tlbmRfaWQgPSBiYWNrZW5kc18uc2l6ZSgpOworICAgIGJhY2tlbmRzXy5lbXBs
YWNlX2JhY2soKTsKKyAgICBSZWdpc3RlcmVkQmFja2VuZCYgcmIgPSBiYWNrZW5kc18uYmFjaygp
OworICAgIHJiLmJhY2tlbmQgPSBiYWNrZW5kOworICAgIHJiLmlkID0gYmFja2VuZF9pZDsKKyAg
ICByYi50eXBlID0gdHlwZTsKKyAgICByYi5wcm9kdWNlci5yZXNldChuZXcgUHJvZHVjZXJJbXBs
KHRoaXMsIGJhY2tlbmRfaWQpKTsKKyAgICBUcmFjaW5nQmFja2VuZDo6Q29ubmVjdFByb2R1Y2Vy
QXJncyBjb25uX2FyZ3M7CisgICAgY29ubl9hcmdzLnByb2R1Y2VyID0gcmIucHJvZHVjZXIuZ2V0
KCk7CisgICAgY29ubl9hcmdzLnByb2R1Y2VyX25hbWUgPSBwbGF0Zm9ybV8tPkdldEN1cnJlbnRQ
cm9jZXNzTmFtZSgpOworICAgIGNvbm5fYXJncy50YXNrX3J1bm5lciA9IHRhc2tfcnVubmVyXy5n
ZXQoKTsKKyAgICBjb25uX2FyZ3Muc2htZW1fc2l6ZV9oaW50X2J5dGVzID0gYXJncy5zaG1lbV9z
aXplX2hpbnRfa2IgKiAxMDI0OworICAgIGNvbm5fYXJncy5zaG1lbV9wYWdlX3NpemVfaGludF9i
eXRlcyA9IGFyZ3Muc2htZW1fcGFnZV9zaXplX2hpbnRfa2IgKiAxMDI0OworICAgIHJiLnByb2R1
Y2VyLT5Jbml0aWFsaXplKHJiLmJhY2tlbmQtPkNvbm5lY3RQcm9kdWNlcihjb25uX2FyZ3MpKTsK
KyAgfTsKKworICBpZiAoYXJncy5iYWNrZW5kcyAmIGtTeXN0ZW1CYWNrZW5kKSB7CisgICAgUEVS
RkVUVE9fQ0hFQ0soYXJncy5zeXN0ZW1fYmFja2VuZF9mYWN0b3J5Xyk7CisgICAgYWRkX2JhY2tl
bmQoYXJncy5zeXN0ZW1fYmFja2VuZF9mYWN0b3J5XygpLCBrU3lzdGVtQmFja2VuZCk7CisgIH0K
KworICBpZiAoYXJncy5iYWNrZW5kcyAmIGtJblByb2Nlc3NCYWNrZW5kKSB7CisgICAgUEVSRkVU
VE9fQ0hFQ0soYXJncy5pbl9wcm9jZXNzX2JhY2tlbmRfZmFjdG9yeV8pOworICAgIGFkZF9iYWNr
ZW5kKGFyZ3MuaW5fcHJvY2Vzc19iYWNrZW5kX2ZhY3RvcnlfKCksIGtJblByb2Nlc3NCYWNrZW5k
KTsKKyAgfQorCisgIGlmIChhcmdzLmJhY2tlbmRzICYga0N1c3RvbUJhY2tlbmQpIHsKKyAgICBQ
RVJGRVRUT19DSEVDSyhhcmdzLmN1c3RvbV9iYWNrZW5kKTsKKyAgICBhZGRfYmFja2VuZChhcmdz
LmN1c3RvbV9iYWNrZW5kLCBrQ3VzdG9tQmFja2VuZCk7CisgIH0KKworICBpZiAoYXJncy5iYWNr
ZW5kcyAmIH4oa1N5c3RlbUJhY2tlbmQgfCBrSW5Qcm9jZXNzQmFja2VuZCB8IGtDdXN0b21CYWNr
ZW5kKSkgeworICAgIFBFUkZFVFRPX0ZBVEFMKCJVbnN1cHBvcnRlZCB0cmFjaW5nIGJhY2tlbmQg
dHlwZSIpOworICB9Cit9CisKKy8vIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkIChidXQg
bm90IGNvbmN1cnJlbnRseSkuCitib29sIFRyYWNpbmdNdXhlckltcGw6OlJlZ2lzdGVyRGF0YVNv
dXJjZSgKKyAgICBjb25zdCBEYXRhU291cmNlRGVzY3JpcHRvciYgZGVzY3JpcHRvciwKKyAgICBE
YXRhU291cmNlRmFjdG9yeSBmYWN0b3J5LAorICAgIERhdGFTb3VyY2VTdGF0aWNTdGF0ZSogc3Rh
dGljX3N0YXRlKSB7CisgIC8vIElnbm9yZSByZXBlYXRlZCByZWdpc3RyYXRpb25zLgorICBpZiAo
c3RhdGljX3N0YXRlLT5pbmRleCAhPSBrTWF4RGF0YVNvdXJjZXMpCisgICAgcmV0dXJuIHRydWU7
CisKKyAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBsYXN0X2lke307CisgIHVpbnQzMl90
IG5ld19pbmRleCA9IGxhc3RfaWQrKzsKKyAgaWYgKG5ld19pbmRleCA+PSBrTWF4RGF0YVNvdXJj
ZXMpIHsKKyAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAiUmVnaXN0ZXJEYXRhU291cmNlIGZh
aWxlZDogdG9vIG1hbnkgZGF0YSBzb3VyY2VzIGFscmVhZHkgcmVnaXN0ZXJlZCIpOworICAgIHJl
dHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgdGhlIHN0YXRpYyBzdGF0ZS4KKyAg
c3RhdGljX2Fzc2VydChzaXplb2Yoc3RhdGljX3N0YXRlLT5pbnN0YW5jZXNbMF0pID49IHNpemVv
ZihEYXRhU291cmNlU3RhdGUpLAorICAgICAgICAgICAgICAgICJpbnN0YW5jZXNbXSBzaXplIG1p
c21hdGNoIik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX3N0YXRlLT5pbnN0YW5j
ZXMuc2l6ZSgpOyBpKyspCisgICAgbmV3ICgmc3RhdGljX3N0YXRlLT5pbnN0YW5jZXNbaV0pIERh
dGFTb3VyY2VTdGF0ZXt9OworCisgIHN0YXRpY19zdGF0ZS0+aW5kZXggPSBuZXdfaW5kZXg7CisK
KyAgdGFza19ydW5uZXJfLT5Qb3N0VGFzayhbdGhpcywgZGVzY3JpcHRvciwgZmFjdG9yeSwgc3Rh
dGljX3N0YXRlXSB7CisgICAgZGF0YV9zb3VyY2VzXy5lbXBsYWNlX2JhY2soKTsKKyAgICBSZWdp
c3RlcmVkRGF0YVNvdXJjZSYgcmRzID0gZGF0YV9zb3VyY2VzXy5iYWNrKCk7CisgICAgcmRzLmRl
c2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgIHJkcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICBy
ZHMuc3RhdGljX3N0YXRlID0gc3RhdGljX3N0YXRlOworICAgIFVwZGF0ZURhdGFTb3VyY2VzT25B
bGxCYWNrZW5kcygpOworICB9KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIENhbGxlZCBieSB0
aGUgc2VydmljZSBvZiBvbmUgb2YgdGhlIGJhY2tlbmRzLgordm9pZCBUcmFjaW5nTXV4ZXJJbXBs
OjpTZXR1cERhdGFTb3VyY2UoVHJhY2luZ0JhY2tlbmRJZCBiYWNrZW5kX2lkLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUluc3RhbmNlSUQgaW5zdGFu
Y2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRh
U291cmNlQ29uZmlnJiBjZmcpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hl
Y2tlcl8pOworICBQRVJGRVRUT19ETE9HKCJTZXR0aW5nIHVwIGRhdGEgc291cmNlICUiIFBSSXU2
NCAiICVzIiwgaW5zdGFuY2VfaWQsCisgICAgICAgICAgICAgICAgY2ZnLm5hbWUoKS5jX3N0cigp
KTsKKyAgdWludDY0X3QgY29uZmlnX2hhc2ggPSBDb21wdXRlQ29uZmlnSGFzaChjZmcpOworCisg
IGZvciAoY29uc3QgYXV0byYgcmRzIDogZGF0YV9zb3VyY2VzXykgeworICAgIGlmIChyZHMuZGVz
Y3JpcHRvci5uYW1lKCkgIT0gY2ZnLm5hbWUoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIERhdGFT
b3VyY2VTdGF0aWNTdGF0ZSYgc3RhdGljX3N0YXRlID0gKnJkcy5zdGF0aWNfc3RhdGU7CisKKyAg
ICAvLyBJZiB0aGlzIGRhdGEgc291cmNlIGlzIGFscmVhZHkgYWN0aXZlIGZvciB0aGlzIGV4YWN0
IGNvbmZpZywgZG9uJ3Qgc3RhcnQKKyAgICAvLyBhbm90aGVyIGluc3RhbmNlLiBUaGlzIGhhcHBl
bnMgd2hlbiB3ZSBoYXZlIHNldmVyYWwgZGF0YSBzb3VyY2VzIHdpdGggdGhlCisgICAgLy8gc2Ft
ZSBuYW1lLCBpbiB3aGljaCBjYXNlIHRoZSBzZXJ2aWNlIHNlbmRzIG9uZSBTZXR1cERhdGFTb3Vy
Y2UgZXZlbnQgZm9yCisgICAgLy8gZWFjaCBvbmUuIFNpbmNlIHdlIGNhbid0IG1hcCB3aGljaCBl
dmVudCBtYXBzIHRvIHdoaWNoIGRhdGEgc291cmNlLCB3ZQorICAgIC8vIGVuc3VyZSBlYWNoIGV2
ZW50IG9ubHkgc3RhcnRzIG9uZSBkYXRhIHNvdXJjZSBpbnN0YW5jZS4KKyAgICAvLyBUT0RPKHNr
eW9zdGlsKTogUmVnaXN0ZXIgYSB1bmlxdWUgaWQgd2l0aCBlYWNoIGRhdGEgc291cmNlIHRvIHRo
ZSBzZXJ2aWNlCisgICAgLy8gdG8gZGlzYW1iaWd1YXRlLgorICAgIGJvb2wgYWN0aXZlX2Zvcl9j
b25maWcgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga01heERhdGFTb3Vy
Y2VJbnN0YW5jZXM7IGkrKykgeworICAgICAgaWYgKCFzdGF0aWNfc3RhdGUuVHJ5R2V0KGkpKQor
ICAgICAgICBjb250aW51ZTsKKyAgICAgIGF1dG8qIGludGVybmFsX3N0YXRlID0KKyAgICAgICAg
ICByZWludGVycHJldF9jYXN0PERhdGFTb3VyY2VTdGF0ZSo+KCZzdGF0aWNfc3RhdGUuaW5zdGFu
Y2VzW2ldKTsKKyAgICAgIGlmIChpbnRlcm5hbF9zdGF0ZS0+YmFja2VuZF9pZCA9PSBiYWNrZW5k
X2lkICYmCisgICAgICAgICAgaW50ZXJuYWxfc3RhdGUtPmNvbmZpZ19oYXNoID09IGNvbmZpZ19o
YXNoKSB7CisgICAgICAgIGFjdGl2ZV9mb3JfY29uZmlnID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7
CisgICAgICB9CisgICAgfQorICAgIGlmIChhY3RpdmVfZm9yX2NvbmZpZykgeworICAgICAgUEVS
RkVUVE9fRExPRygKKyAgICAgICAgICAiRGF0YSBzb3VyY2UgJXMgaXMgYWxyZWFkeSBhY3RpdmUg
d2l0aCB0aGlzIGNvbmZpZywgc2tpcHBpbmciLAorICAgICAgICAgIGNmZy5uYW1lKCkuY19zdHIo
KSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBp
IDwga01heERhdGFTb3VyY2VJbnN0YW5jZXM7IGkrKykgeworICAgICAgLy8gRmluZCBhIGZyZWUg
c2xvdC4KKyAgICAgIGlmIChzdGF0aWNfc3RhdGUuVHJ5R2V0KGkpKQorICAgICAgICBjb250aW51
ZTsKKworICAgICAgYXV0byogaW50ZXJuYWxfc3RhdGUgPQorICAgICAgICAgIHJlaW50ZXJwcmV0
X2Nhc3Q8RGF0YVNvdXJjZVN0YXRlKj4oJnN0YXRpY19zdGF0ZS5pbnN0YW5jZXNbaV0pOworICAg
ICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBndWFyZChpbnRlcm5hbF9z
dGF0ZS0+bG9jayk7CisgICAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICAgIHN0ZDo6aXNfc2Ft
ZTxkZWNsdHlwZShpbnRlcm5hbF9zdGF0ZS0+ZGF0YV9zb3VyY2VfaW5zdGFuY2VfaWQpLAorICAg
ICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSW5zdGFuY2VJRD46OnZhbHVlLAorICAgICAg
ICAgICJkYXRhX3NvdXJjZV9pbnN0YW5jZV9pZCB0eXBlIG1pc21hdGNoIik7CisgICAgICBpbnRl
cm5hbF9zdGF0ZS0+YmFja2VuZF9pZCA9IGJhY2tlbmRfaWQ7CisgICAgICBpbnRlcm5hbF9zdGF0
ZS0+ZGF0YV9zb3VyY2VfaW5zdGFuY2VfaWQgPSBpbnN0YW5jZV9pZDsKKyAgICAgIGludGVybmFs
X3N0YXRlLT5idWZmZXJfaWQgPQorICAgICAgICAgIHN0YXRpY19jYXN0PGludGVybmFsOjpCdWZm
ZXJJZD4oY2ZnLnRhcmdldF9idWZmZXIoKSk7CisgICAgICBpbnRlcm5hbF9zdGF0ZS0+Y29uZmln
X2hhc2ggPSBjb25maWdfaGFzaDsKKyAgICAgIGludGVybmFsX3N0YXRlLT5kYXRhX3NvdXJjZSA9
IHJkcy5mYWN0b3J5KCk7CisKKyAgICAgIC8vIFRoaXMgbXVzdCBiZSBtYWRlIGF0IHRoZSBlbmQu
IFNlZSBtYXRjaGluZyBhY3F1aXJlLWxvYWQgaW4KKyAgICAgIC8vIERhdGFTb3VyY2U6OlRyYWNl
KCkuCisgICAgICBzdGF0aWNfc3RhdGUudmFsaWRfaW5zdGFuY2VzLmZldGNoX29yKDEgPDwgaSwg
c3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisKKyAgICAgIERhdGFTb3VyY2VCYXNlOjpTZXR1
cEFyZ3Mgc2V0dXBfYXJnczsKKyAgICAgIHNldHVwX2FyZ3MuY29uZmlnID0gJmNmZzsKKyAgICAg
IHNldHVwX2FyZ3MuaW50ZXJuYWxfaW5zdGFuY2VfaW5kZXggPSBpOworICAgICAgaW50ZXJuYWxf
c3RhdGUtPmRhdGFfc291cmNlLT5PblNldHVwKHNldHVwX2FyZ3MpOworICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBQRVJGRVRUT19FTE9HKAorICAgICAgICAiTWF4aW11bSBudW1iZXIgb2YgZGF0
YSBzb3VyY2UgaW5zdGFuY2VzIGV4aGF1c3RlZC4gIgorICAgICAgICAiRHJvcHBpbmcgZGF0YSBz
b3VyY2UgJSIgUFJJdTY0LAorICAgICAgICBpbnN0YW5jZV9pZCk7CisgICAgYnJlYWs7CisgIH0K
K30KKworLy8gQ2FsbGVkIGJ5IHRoZSBzZXJ2aWNlIG9mIG9uZSBvZiB0aGUgYmFja2VuZHMuCit2
b2lkIFRyYWNpbmdNdXhlckltcGw6OlN0YXJ0RGF0YVNvdXJjZShUcmFjaW5nQmFja2VuZElkIGJh
Y2tlbmRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291
cmNlSW5zdGFuY2VJRCBpbnN0YW5jZV9pZCkgeworICBQRVJGRVRUT19ETE9HKCJTdGFydGluZyBk
YXRhIHNvdXJjZSAlIiBQUkl1NjQsIGluc3RhbmNlX2lkKTsKKyAgUEVSRkVUVE9fRENIRUNLX1RI
UkVBRCh0aHJlYWRfY2hlY2tlcl8pOworCisgIGF1dG8gZHMgPSBGaW5kRGF0YVNvdXJjZShiYWNr
ZW5kX2lkLCBpbnN0YW5jZV9pZCk7CisgIGlmICghZHMpIHsKKyAgICBQRVJGRVRUT19FTE9HKCJD
b3VsZCBub3QgZmluZCBkYXRhIHNvdXJjZSB0byBzdGFydCIpOworICAgIHJldHVybjsKKyAgfQor
CisgIERhdGFTb3VyY2VCYXNlOjpTdGFydEFyZ3Mgc3RhcnRfYXJnc3t9OworICBzdGFydF9hcmdz
LmludGVybmFsX2luc3RhbmNlX2luZGV4ID0gZHMuaW5zdGFuY2VfaWR4OworCisgIHN0ZDo6bG9j
a19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gZ3VhcmQoZHMuaW50ZXJuYWxfc3RhdGUtPmxv
Y2spOworICBkcy5pbnRlcm5hbF9zdGF0ZS0+dHJhY2VfbGFtYmRhX2VuYWJsZWQgPSB0cnVlOwor
ICBkcy5pbnRlcm5hbF9zdGF0ZS0+ZGF0YV9zb3VyY2UtPk9uU3RhcnQoc3RhcnRfYXJncyk7Cit9
CisKKy8vIENhbGxlZCBieSB0aGUgc2VydmljZSBvZiBvbmUgb2YgdGhlIGJhY2tlbmRzLgordm9p
ZCBUcmFjaW5nTXV4ZXJJbXBsOjpTdG9wRGF0YVNvdXJjZV9Bc3luY0JlZ2luKAorICAgIFRyYWNp
bmdCYWNrZW5kSWQgYmFja2VuZF9pZCwKKyAgICBEYXRhU291cmNlSW5zdGFuY2VJRCBpbnN0YW5j
ZV9pZCkgeworICBQRVJGRVRUT19ETE9HKCJTdG9wcGluZyBkYXRhIHNvdXJjZSAlIiBQUkl1NjQs
IGluc3RhbmNlX2lkKTsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8p
OworCisgIGF1dG8gZHMgPSBGaW5kRGF0YVNvdXJjZShiYWNrZW5kX2lkLCBpbnN0YW5jZV9pZCk7
CisgIGlmICghZHMpIHsKKyAgICBQRVJGRVRUT19FTE9HKCJDb3VsZCBub3QgZmluZCBkYXRhIHNv
dXJjZSB0byBzdG9wIik7CisgICAgcmV0dXJuOworICB9CisKKyAgU3RvcEFyZ3NJbXBsIHN0b3Bf
YXJnc3t9OworICBzdG9wX2FyZ3MuaW50ZXJuYWxfaW5zdGFuY2VfaW5kZXggPSBkcy5pbnN0YW5j
ZV9pZHg7CisgIHN0b3BfYXJncy5hc3luY19zdG9wX2Nsb3N1cmUgPSBbdGhpcywgYmFja2VuZF9p
ZCwgaW5zdGFuY2VfaWRdIHsKKyAgICAvLyBUcmFjaW5nTXV4ZXJJbXBsIGlzIGxvbmcgbGl2ZWQs
IGNhcHR1cmluZyB8dGhpc3wgaXMgb2theS4KKyAgICAvLyBUaGUgbm90aWZpY2F0aW9uIGNsb3N1
cmUgY2FuIGJlIG1vdmVkIG91dCBvZiB0aGUgU3RvcEFyZ3MgYnkgdGhlCisgICAgLy8gZW1iZWRk
ZXIgdG8gaGFuZGxlIHN0b3AgYXN5bmNocm9ub3VzbHkuIFRoZSBlbWJlZGRlciBtaWdodCB0aGVu
CisgICAgLy8gY2FsbCB0aGUgY2xvc3VyZSBvbiBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUg
Y3VycmVudCBvbmUsIGhlbmNlCisgICAgLy8gdGhpcyBuZXN0ZWQgUG9zdFRhc2soKS4KKyAgICB0
YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt0aGlzLCBiYWNrZW5kX2lkLCBpbnN0YW5jZV9pZF0gewor
ICAgICAgU3RvcERhdGFTb3VyY2VfQXN5bmNFbmQoYmFja2VuZF9pZCwgaW5zdGFuY2VfaWQpOwor
ICAgIH0pOworICB9OworCisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVf
bXV0ZXg+IGd1YXJkKGRzLmludGVybmFsX3N0YXRlLT5sb2NrKTsKKyAgICBkcy5pbnRlcm5hbF9z
dGF0ZS0+ZGF0YV9zb3VyY2UtPk9uU3RvcChzdG9wX2FyZ3MpOworICB9CisKKyAgLy8gSWYgdGhl
IGVtYmVkZGVyIGhhc24ndCBjYWxsZWQgU3RvcEFyZ3MuSGFuZGxlU3RvcEFzeW5jaHJvbm91c2x5
KCkgcnVuIHRoZQorICAvLyBhc3luYyBjbG9zdXJlIGhlcmUuIEluIHRoZW9yeSB3ZSBjb3VsZCBh
dm9pZCB0aGUgUG9zdFRhc2sgYW5kIGNhbGwKKyAgLy8gc3RyYWlnaHQgaW50byBDb21wbGV0ZURh
dGFTb3VyY2VBc3luY1N0b3AoKS4gV2Uga2VlcCB0aGF0IHRvIHJlZHVjZQorICAvLyBkaXZlcmdl
bmNpZXMgYmV0d2VlbiB0aGUgZGVmZXJyZWQtc3RvcCB2cyBub24tZGVmZXJyZWQtc3RvcCBjb2Rl
IHBhdGhzLgorICBpZiAoc3RvcF9hcmdzLmFzeW5jX3N0b3BfY2xvc3VyZSkKKyAgICBzdGQ6Om1v
dmUoc3RvcF9hcmdzLmFzeW5jX3N0b3BfY2xvc3VyZSkoKTsKK30KKwordm9pZCBUcmFjaW5nTXV4
ZXJJbXBsOjpTdG9wRGF0YVNvdXJjZV9Bc3luY0VuZCgKKyAgICBUcmFjaW5nQmFja2VuZElkIGJh
Y2tlbmRfaWQsCisgICAgRGF0YVNvdXJjZUluc3RhbmNlSUQgaW5zdGFuY2VfaWQpIHsKKyAgUEVS
RkVUVE9fRExPRygiRW5kaW5nIGFzeW5jIHN0b3Agb2YgZGF0YSBzb3VyY2UgJSIgUFJJdTY0LCBp
bnN0YW5jZV9pZCk7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsK
KworICBhdXRvIGRzID0gRmluZERhdGFTb3VyY2UoYmFja2VuZF9pZCwgaW5zdGFuY2VfaWQpOwor
ICBpZiAoIWRzKSB7CisgICAgUEVSRkVUVE9fRUxPRygKKyAgICAgICAgIkFzeW5jIHN0b3Agb2Yg
ZGF0YSBzb3VyY2UgJSIgUFJJdTY0CisgICAgICAgICIgZmFpbGVkLiBUaGlzIG1pZ2h0IGJlIGR1
ZSB0byBjYWxsaW5nIHRoZSBhc3luY19zdG9wX2Nsb3N1cmUgdHdpY2UuIiwKKyAgICAgICAgaW5z
dGFuY2VfaWQpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSB+
KDEgPDwgZHMuaW5zdGFuY2VfaWR4KTsKKyAgZHMuc3RhdGljX3N0YXRlLT52YWxpZF9pbnN0YW5j
ZXMuZmV0Y2hfYW5kKG1hc2ssIHN0ZDo6bWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisgIC8vIFRh
a2UgdGhlIG11dGV4IHRvIHByZXZlbnQgdGhhdCB0aGUgZGF0YSBzb3VyY2UgaXMgaW4gdGhlIG1p
ZGRsZSBvZgorICAvLyBhIFRyYWNlKCkgZXhlY3V0aW9uIHdoZXJlIGl0IGNhbGxlZCBHZXREYXRh
U291cmNlTG9ja2VkKCkgd2hpbGUgd2UKKyAgLy8gZGVzdHJveSBpdC4KKyAgeworICAgIHN0ZDo6
bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gZ3VhcmQoZHMuaW50ZXJuYWxfc3RhdGUt
PmxvY2spOworICAgIGRzLmludGVybmFsX3N0YXRlLT50cmFjZV9sYW1iZGFfZW5hYmxlZCA9IGZh
bHNlOworICAgIGRzLmludGVybmFsX3N0YXRlLT5kYXRhX3NvdXJjZS5yZXNldCgpOworICB9CisK
KyAgLy8gVGhlIG90aGVyIGZpZWxkcyBvZiBpbnRlcm5hbF9zdGF0ZSBhcmUgZGVsaWJlcmF0ZWx5
ICpub3QqIGNsZWFyZWQuCisgIC8vIFNlZSByYWNlcy1yZWxhdGVkIGNvbW1lbnRzIG9mIERhdGFT
b3VyY2U6OlRyYWNlKCkuCisKKyAgVHJhY2luZ011eGVyOjpnZW5lcmF0aW9uXysrOworCisgIC8v
IHxiYWNrZW5kc198IGlzIGFwcGVuZC1vbmx5LCBCYWNrZW5kIGluc3RhbmNlcyBhcmUgYWx3YXlz
IHZhbGlkLgorICBQRVJGRVRUT19DSEVDSyhiYWNrZW5kX2lkIDwgYmFja2VuZHNfLnNpemUoKSk7
CisgIFByb2R1Y2VySW1wbCogcHJvZHVjZXIgPSBiYWNrZW5kc19bYmFja2VuZF9pZF0ucHJvZHVj
ZXIuZ2V0KCk7CisgIGlmIChwcm9kdWNlciAmJiBwcm9kdWNlci0+Y29ubmVjdGVkXykKKyAgICBw
cm9kdWNlci0+c2VydmljZV8tPk5vdGlmeURhdGFTb3VyY2VTdG9wcGVkKGluc3RhbmNlX2lkKTsK
K30KKwordm9pZCBUcmFjaW5nTXV4ZXJJbXBsOjpEZXN0cm95U3RvcHBlZFRyYWNlV3JpdGVyc0Zv
ckN1cnJlbnRUaHJlYWQoKSB7CisgIC8vIEl0ZXJhdGUgYWNyb3NzIGFsbCBwb3NzaWJsZSBkYXRh
IHNvdXJjZSB0eXBlcy4KKyAgYXV0byBjdXJfZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb25fLmxvYWQo
c3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgIGF1dG8qIHJvb3RfdGxzID0gR2V0T3JDcmVh
dGVUcmFjaW5nVExTKCk7CisKKyAgYXV0byBkZXN0cm95X3N0b3BwZWRfaW5zdGFuY2VzID0gW10o
RGF0YVNvdXJjZVRocmVhZExvY2FsU3RhdGUmIHRscykgeworICAgIC8vIHx0bHN8IGhhcyBhIHZl
Y3RvciBvZiBwZXItZGF0YS1zb3VyY2UtaW5zdGFuY2UgdGhyZWFkLWxvY2FsIHN0YXRlLgorICAg
IERhdGFTb3VyY2VTdGF0aWNTdGF0ZSogc3RhdGljX3N0YXRlID0gdGxzLnN0YXRpY19zdGF0ZTsK
KyAgICBpZiAoIXN0YXRpY19zdGF0ZSkKKyAgICAgIHJldHVybjsgIC8vIFNsb3Qgbm90IHVzZWQu
CisKKyAgICAvLyBJdGVyYXRlIGFjcm9zcyBhbGwgcG9zc2libGUgaW5zdGFuY2VzIGZvciB0aGlz
IGRhdGEgc291cmNlLgorICAgIGZvciAodWludDMyX3QgaW5zdCA9IDA7IGluc3QgPCBrTWF4RGF0
YVNvdXJjZUluc3RhbmNlczsgaW5zdCsrKSB7CisgICAgICBEYXRhU291cmNlSW5zdGFuY2VUaHJl
YWRMb2NhbFN0YXRlJiBkc190bHMgPSB0bHMucGVyX2luc3RhbmNlW2luc3RdOworICAgICAgaWYg
KCFkc190bHMudHJhY2Vfd3JpdGVyKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgRGF0YVNv
dXJjZVN0YXRlKiBkc19zdGF0ZSA9IHN0YXRpY19zdGF0ZS0+VHJ5R2V0KGluc3QpOworICAgICAg
aWYgKGRzX3N0YXRlICYmIGRzX3N0YXRlLT5iYWNrZW5kX2lkID09IGRzX3Rscy5iYWNrZW5kX2lk
ICYmCisgICAgICAgICAgZHNfc3RhdGUtPmJ1ZmZlcl9pZCA9PSBkc190bHMuYnVmZmVyX2lkKSB7
CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBUaGUgRGF0YVNvdXJjZSBp
bnN0YW5jZSBoYXMgYmVlbiBkZXN0cm95ZWQgb3IgcmVjeWNsZWQuCisgICAgICBkc190bHMuUmVz
ZXQoKTsgIC8vIFdpbGwgYWxzbyBkZXN0cm95IHRoZSB8ZHNfdGxzLnRyYWNlX3dyaXRlcnwuCisg
ICAgfQorICB9OworCisgIGZvciAoc2l6ZV90IGRzX2lkeCA9IDA7IGRzX2lkeCA8IGtNYXhEYXRh
U291cmNlczsgZHNfaWR4KyspIHsKKyAgICAvLyB8dGxzfCBoYXMgYSB2ZWN0b3Igb2YgcGVyLWRh
dGEtc291cmNlLWluc3RhbmNlIHRocmVhZC1sb2NhbCBzdGF0ZS4KKyAgICBEYXRhU291cmNlVGhy
ZWFkTG9jYWxTdGF0ZSYgdGxzID0gcm9vdF90bHMtPmRhdGFfc291cmNlc190bHNbZHNfaWR4XTsK
KyAgICBkZXN0cm95X3N0b3BwZWRfaW5zdGFuY2VzKHRscyk7CisgIH0KKyAgZGVzdHJveV9zdG9w
cGVkX2luc3RhbmNlcyhyb290X3Rscy0+dHJhY2tfZXZlbnRfdGxzKTsKKyAgcm9vdF90bHMtPmdl
bmVyYXRpb24gPSBjdXJfZ2VuZXJhdGlvbjsKK30KKworLy8gQ2FsbGVkIGJvdGggd2hlbiBhIG5l
dyBkYXRhIHNvdXJjZSBpcyByZWdpc3RlcmVkIG9yIHdoZW4gYSBuZXcgYmFja2VuZAorLy8gY29u
bmVjdHMuIEluIGJvdGggY2FzZXMgd2Ugd2FudCB0byBiZSBzdXJlIHdlIHJlZmxlY3RlZCB0aGUg
ZGF0YSBzb3VyY2UKKy8vIHJlZ2lzdHJhdGlvbnMgb24gdGhlIGJhY2tlbmRzLgordm9pZCBUcmFj
aW5nTXV4ZXJJbXBsOjpVcGRhdGVEYXRhU291cmNlc09uQWxsQmFja2VuZHMoKSB7CisgIFBFUkZF
VFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgZm9yIChSZWdpc3RlcmVkRGF0
YVNvdXJjZSYgcmRzIDogZGF0YV9zb3VyY2VzXykgeworICAgIGZvciAoUmVnaXN0ZXJlZEJhY2tl
bmQmIGJhY2tlbmQgOiBiYWNrZW5kc18pIHsKKyAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIFJlZ2lz
dGVyRGF0YVNvdXJjZSBvbiB0aGUgYmFja2VuZCBiZWZvcmUgaXQgY29ubmVjdHMuCisgICAgICBp
ZiAoIWJhY2tlbmQucHJvZHVjZXItPmNvbm5lY3RlZF8pCisgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICBQRVJGRVRUT19EQ0hFQ0socmRzLnN0YXRpY19zdGF0ZS0+aW5kZXggPCBrTWF4RGF0YVNv
dXJjZUluc3RhbmNlcyk7CisgICAgICBpZiAoYmFja2VuZC5wcm9kdWNlci0+cmVnaXN0ZXJlZF9k
YXRhX3NvdXJjZXNfLnRlc3QoCisgICAgICAgICAgICAgIHJkcy5zdGF0aWNfc3RhdGUtPmluZGV4
KSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHJkcy5kZXNjcmlwdG9yLnNldF93aWxsX25v
dGlmeV9vbl9zdGFydCh0cnVlKTsKKyAgICAgIHJkcy5kZXNjcmlwdG9yLnNldF93aWxsX25vdGlm
eV9vbl9zdG9wKHRydWUpOworICAgICAgYmFja2VuZC5wcm9kdWNlci0+c2VydmljZV8tPlJlZ2lz
dGVyRGF0YVNvdXJjZShyZHMuZGVzY3JpcHRvcik7CisgICAgICBiYWNrZW5kLnByb2R1Y2VyLT5y
ZWdpc3RlcmVkX2RhdGFfc291cmNlc18uc2V0KHJkcy5zdGF0aWNfc3RhdGUtPmluZGV4KTsKKyAg
ICB9CisgIH0KK30KKwordm9pZCBUcmFjaW5nTXV4ZXJJbXBsOjpTZXR1cFRyYWNpbmdTZXNzaW9u
KAorICAgIFRyYWNpbmdTZXNzaW9uR2xvYmFsSUQgc2Vzc2lvbl9pZCwKKyAgICBjb25zdCBzdGQ6
OnNoYXJlZF9wdHI8VHJhY2VDb25maWc+JiB0cmFjZV9jb25maWcsCisgICAgYmFzZTo6U2NvcGVk
RmlsZSB0cmFjZV9mZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2Vy
Xyk7CisgIFBFUkZFVFRPX0NIRUNLKCF0cmFjZV9mZCB8fCB0cmFjZV9jb25maWctPndyaXRlX2lu
dG9fZmlsZSgpKTsKKworICBhdXRvKiBjb25zdW1lciA9IEZpbmRDb25zdW1lcihzZXNzaW9uX2lk
KTsKKyAgaWYgKCFjb25zdW1lcikKKyAgICByZXR1cm47CisKKyAgY29uc3VtZXItPnRyYWNlX2Nv
bmZpZ18gPSB0cmFjZV9jb25maWc7CisgIGlmICh0cmFjZV9mZCkKKyAgICBjb25zdW1lci0+dHJh
Y2VfZmRfID0gc3RkOjptb3ZlKHRyYWNlX2ZkKTsKKworICBpZiAoIWNvbnN1bWVyLT5jb25uZWN0
ZWRfKQorICAgIHJldHVybjsKKworICAvLyBPbmx5IHVzZWQgaW4gdGhlIGRlZmVycmVkIHN0YXJ0
IG1vZGUuCisgIGlmICh0cmFjZV9jb25maWctPmRlZmVycmVkX3N0YXJ0KCkpIHsKKyAgICBjb25z
dW1lci0+c2VydmljZV8tPkVuYWJsZVRyYWNpbmcoKnRyYWNlX2NvbmZpZywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNvbnN1bWVyLT50cmFjZV9mZF8p
KTsKKyAgfQorfQorCit2b2lkIFRyYWNpbmdNdXhlckltcGw6OlN0YXJ0VHJhY2luZ1Nlc3Npb24o
VHJhY2luZ1Nlc3Npb25HbG9iYWxJRCBzZXNzaW9uX2lkKSB7CisgIFBFUkZFVFRPX0RDSEVDS19U
SFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKworICBhdXRvKiBjb25zdW1lciA9IEZpbmRDb25zdW1l
cihzZXNzaW9uX2lkKTsKKworICBpZiAoIWNvbnN1bWVyKQorICAgIHJldHVybjsKKworICBpZiAo
IWNvbnN1bWVyLT50cmFjZV9jb25maWdfKSB7CisgICAgUEVSRkVUVE9fRUxPRygiTXVzdCBjYWxs
IFNldHVwKGNvbmZpZykgZmlyc3QiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIWNvbnN1
bWVyLT5jb25uZWN0ZWRfKSB7CisgICAgY29uc3VtZXItPnN0YXJ0X3BlbmRpbmdfID0gdHJ1ZTsK
KyAgICByZXR1cm47CisgIH0KKworICBjb25zdW1lci0+c3RhcnRfcGVuZGluZ18gPSBmYWxzZTsK
KyAgaWYgKGNvbnN1bWVyLT50cmFjZV9jb25maWdfLT5kZWZlcnJlZF9zdGFydCgpKSB7CisgICAg
Y29uc3VtZXItPnNlcnZpY2VfLT5TdGFydFRyYWNpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICBjb25z
dW1lci0+c2VydmljZV8tPkVuYWJsZVRyYWNpbmcoKmNvbnN1bWVyLT50cmFjZV9jb25maWdfLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY29uc3VtZXIt
PnRyYWNlX2ZkXykpOworICB9CisKKyAgLy8gVE9ETyBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGhl
IGRlZmVycmVkLXN0YXJ0ICsgZmFzdC10cmlnZ2VyaW5nIGNhc2UuCit9CisKK3ZvaWQgVHJhY2lu
Z011eGVySW1wbDo6U3RvcFRyYWNpbmdTZXNzaW9uKFRyYWNpbmdTZXNzaW9uR2xvYmFsSUQgc2Vz
c2lvbl9pZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7Cisg
IGF1dG8qIGNvbnN1bWVyID0gRmluZENvbnN1bWVyKHNlc3Npb25faWQpOworICBpZiAoIWNvbnN1
bWVyKQorICAgIHJldHVybjsKKworICBpZiAoY29uc3VtZXItPnN0YXJ0X3BlbmRpbmdfKSB7Cisg
ICAgLy8gSWYgdGhlIHNlc3Npb24gaGFzbid0IHN0YXJ0ZWQgeWV0LCB3YWl0IHVudGlsIGl0IGRv
ZXMgYmVmb3JlIHN0b3BwaW5nLgorICAgIGNvbnN1bWVyLT5zdG9wX3BlbmRpbmdfID0gdHJ1ZTsK
KyAgICByZXR1cm47CisgIH0KKworICBjb25zdW1lci0+c3RvcF9wZW5kaW5nXyA9IGZhbHNlOwor
ICBpZiAoY29uc3VtZXItPnN0b3BwZWRfKSB7CisgICAgLy8gSWYgdGhlIHNlc3Npb24gd2FzIGFs
cmVhZHkgc3RvcHBlZCAoZS5nLiwgaXQgZmFpbGVkIHRvIHN0YXJ0KSwgZG9uJ3QgdHJ5CisgICAg
Ly8gc3RvcHBpbmcgYWdhaW4uCisgICAgY29uc3VtZXItPk5vdGlmeVN0b3BDb21wbGV0ZSgpOwor
ICB9IGVsc2UgaWYgKCFjb25zdW1lci0+dHJhY2VfY29uZmlnXykgeworICAgIFBFUkZFVFRPX0VM
T0coIk11c3QgY2FsbCBTZXR1cChjb25maWcpIGFuZCBTdGFydCgpIGZpcnN0Iik7CisgICAgcmV0
dXJuOworICB9IGVsc2UgeworICAgIGNvbnN1bWVyLT5zZXJ2aWNlXy0+RGlzYWJsZVRyYWNpbmco
KTsKKyAgfQorCisgIGNvbnN1bWVyLT50cmFjZV9jb25maWdfLnJlc2V0KCk7Cit9CisKK3ZvaWQg
VHJhY2luZ011eGVySW1wbDo6RGVzdHJveVRyYWNpbmdTZXNzaW9uKAorICAgIFRyYWNpbmdTZXNz
aW9uR2xvYmFsSUQgc2Vzc2lvbl9pZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVh
ZF9jaGVja2VyXyk7CisgIGZvciAoUmVnaXN0ZXJlZEJhY2tlbmQmIGJhY2tlbmQgOiBiYWNrZW5k
c18pIHsKKyAgICAvLyBXZSBuZWVkIHRvIGZpbmQgdGhlIGNvbnN1bWVyIChpZiBhbnkpIGFuZCBj
YWxsIERpc2Nvbm5lY3QgYXMgd2UgZGVzdHJveQorICAgIC8vIHRoZSB0cmFjaW5nIHNlc3Npb24u
IFdlIGNhbid0IGNhbGwgRGlzY29ubmVjdCgpIGluc2lkZSB0aGlzIGZvciBsb29wCisgICAgLy8g
YmVjYXVzZSBpbiB0aGUgaW4tcHJvY2VzcyBjYXNlIHRoaXMgd2lsbCBlbmQgdXAgdG8gYSBzeW5j
aHJvbm91cyBjYWxsIHRvCisgICAgLy8gT25Db25zdW1lckRpc2Nvbm5lY3Qgd2hpY2ggd2lsbCBp
bnZhbGlkYXRlIGFsbCB0aGUgaXRlcmF0b3JzIHRvCisgICAgLy8gfGJhY2tlbmQuY29uc3VtZXJz
fC4KKyAgICBDb25zdW1lckltcGwqIGNvbnN1bWVyID0gbnVsbHB0cjsKKyAgICBmb3IgKGF1dG8m
IGNvbiA6IGJhY2tlbmQuY29uc3VtZXJzKSB7CisgICAgICBpZiAoY29uLT5zZXNzaW9uX2lkXyA9
PSBzZXNzaW9uX2lkKSB7CisgICAgICAgIGNvbnN1bWVyID0gY29uLmdldCgpOworICAgICAgICBi
cmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvbnN1bWVyKSB7CisgICAgICAvLyBXZSBi
cm9rZSBvdXQgb2YgdGhlIGxvb3AgYWJvdmUgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBlYWNoIGJh
Y2tlbmQgd2lsbAorICAgICAgLy8gb25seSBoYXZlIGEgc2luZ2xlIGNvbnN1bWVyIHBlciBzZXNz
aW9uLiBUaGlzIERDSEVDSyBlbnN1cmVzIHRoYXQKKyAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Uu
CisgICAgICBQRVJGRVRUT19EQ0hFQ0soCisgICAgICAgICAgc3RkOjpjb3VudF9pZihiYWNrZW5k
LmNvbnN1bWVycy5iZWdpbigpLCBiYWNrZW5kLmNvbnN1bWVycy5lbmQoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIFtzZXNzaW9uX2lkXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uc3VtZXJJ
bXBsPiYgY29uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb24tPnNlc3Np
b25faWRfID09IHNlc3Npb25faWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSA9PSAxdSk7
CisgICAgICBjb25zdW1lci0+RGlzY29ubmVjdCgpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRy
YWNpbmdNdXhlckltcGw6OlJlYWRUcmFjaW5nU2Vzc2lvbkRhdGEoCisgICAgVHJhY2luZ1Nlc3Np
b25HbG9iYWxJRCBzZXNzaW9uX2lkLAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChUcmFjaW5nU2Vz
c2lvbjo6UmVhZFRyYWNlQ2FsbGJhY2tBcmdzKT4gY2FsbGJhY2spIHsKKyAgUEVSRkVUVE9fRENI
RUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBhdXRvKiBjb25zdW1lciA9IEZpbmRDb25z
dW1lcihzZXNzaW9uX2lkKTsKKyAgaWYgKCFjb25zdW1lcikKKyAgICByZXR1cm47CisgIFBFUkZF
VFRPX0RDSEVDSyghY29uc3VtZXItPnJlYWRfdHJhY2VfY2FsbGJhY2tfKTsKKyAgY29uc3VtZXIt
PnJlYWRfdHJhY2VfY2FsbGJhY2tfID0gc3RkOjptb3ZlKGNhbGxiYWNrKTsKKyAgY29uc3VtZXIt
PnNlcnZpY2VfLT5SZWFkQnVmZmVycygpOworfQorCit2b2lkIFRyYWNpbmdNdXhlckltcGw6Okdl
dFRyYWNlU3RhdHMoCisgICAgVHJhY2luZ1Nlc3Npb25HbG9iYWxJRCBzZXNzaW9uX2lkLAorICAg
IFRyYWNpbmdTZXNzaW9uOjpHZXRUcmFjZVN0YXRzQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgUEVS
RkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBhdXRvKiBjb25zdW1lciA9
IEZpbmRDb25zdW1lcihzZXNzaW9uX2lkKTsKKyAgaWYgKCFjb25zdW1lcikgeworICAgIFRyYWNp
bmdTZXNzaW9uOjpHZXRUcmFjZVN0YXRzQ2FsbGJhY2tBcmdzIGNhbGxiYWNrX2FyZ3t9OworICAg
IGNhbGxiYWNrX2FyZy5zdWNjZXNzID0gZmFsc2U7CisgICAgY2FsbGJhY2soc3RkOjptb3ZlKGNh
bGxiYWNrX2FyZykpOworICAgIHJldHVybjsKKyAgfQorICBQRVJGRVRUT19EQ0hFQ0soIWNvbnN1
bWVyLT5nZXRfdHJhY2Vfc3RhdHNfY2FsbGJhY2tfKTsKKyAgY29uc3VtZXItPmdldF90cmFjZV9z
dGF0c19jYWxsYmFja18gPSBzdGQ6Om1vdmUoY2FsbGJhY2spOworICBjb25zdW1lci0+c2Vydmlj
ZV8tPkdldFRyYWNlU3RhdHMoKTsKK30KKworVHJhY2luZ011eGVySW1wbDo6Q29uc3VtZXJJbXBs
KiBUcmFjaW5nTXV4ZXJJbXBsOjpGaW5kQ29uc3VtZXIoCisgICAgVHJhY2luZ1Nlc3Npb25HbG9i
YWxJRCBzZXNzaW9uX2lkKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNr
ZXJfKTsKKyAgZm9yIChSZWdpc3RlcmVkQmFja2VuZCYgYmFja2VuZCA6IGJhY2tlbmRzXykgewor
ICAgIGZvciAoYXV0byYgY29uc3VtZXIgOiBiYWNrZW5kLmNvbnN1bWVycykgeworICAgICAgaWYg
KGNvbnN1bWVyLT5zZXNzaW9uX2lkXyA9PSBzZXNzaW9uX2lkKSB7CisgICAgICAgIFBFUkZFVFRP
X0RDSEVDSyhjb25zdW1lci0+c2VydmljZV8pOworICAgICAgICByZXR1cm4gY29uc3VtZXIuZ2V0
KCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIFRy
YWNpbmdNdXhlckltcGw6Ok9uQ29uc3VtZXJEaXNjb25uZWN0ZWQoQ29uc3VtZXJJbXBsKiBjb25z
dW1lcikgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGZv
ciAoUmVnaXN0ZXJlZEJhY2tlbmQmIGJhY2tlbmQgOiBiYWNrZW5kc18pIHsKKyAgICBhdXRvIHBy
ZWQgPSBbY29uc3VtZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lckltcGw+JiBjb24p
IHsKKyAgICAgIHJldHVybiBjb24uZ2V0KCkgPT0gY29uc3VtZXI7CisgICAgfTsKKyAgICBiYWNr
ZW5kLmNvbnN1bWVycy5lcmFzZShzdGQ6OnJlbW92ZV9pZihiYWNrZW5kLmNvbnN1bWVycy5iZWdp
bigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmQu
Y29uc3VtZXJzLmVuZCgpLCBwcmVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNr
ZW5kLmNvbnN1bWVycy5lbmQoKSk7CisgIH0KK30KKworVHJhY2luZ011eGVySW1wbDo6RmluZERh
dGFTb3VyY2VSZXMgVHJhY2luZ011eGVySW1wbDo6RmluZERhdGFTb3VyY2UoCisgICAgVHJhY2lu
Z0JhY2tlbmRJZCBiYWNrZW5kX2lkLAorICAgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGluc3RhbmNl
X2lkKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgZm9y
IChjb25zdCBhdXRvJiByZHMgOiBkYXRhX3NvdXJjZXNfKSB7CisgICAgRGF0YVNvdXJjZVN0YXRp
Y1N0YXRlKiBzdGF0aWNfc3RhdGUgPSByZHMuc3RhdGljX3N0YXRlOworICAgIGZvciAodWludDMy
X3QgaSA9IDA7IGkgPCBrTWF4RGF0YVNvdXJjZUluc3RhbmNlczsgaSsrKSB7CisgICAgICBhdXRv
KiBpbnRlcm5hbF9zdGF0ZSA9IHN0YXRpY19zdGF0ZS0+VHJ5R2V0KGkpOworICAgICAgaWYgKGlu
dGVybmFsX3N0YXRlICYmIGludGVybmFsX3N0YXRlLT5iYWNrZW5kX2lkID09IGJhY2tlbmRfaWQg
JiYKKyAgICAgICAgICBpbnRlcm5hbF9zdGF0ZS0+ZGF0YV9zb3VyY2VfaW5zdGFuY2VfaWQgPT0g
aW5zdGFuY2VfaWQpIHsKKyAgICAgICAgcmV0dXJuIEZpbmREYXRhU291cmNlUmVzKHN0YXRpY19z
dGF0ZSwgaW50ZXJuYWxfc3RhdGUsIGkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4g
RmluZERhdGFTb3VyY2VSZXMoKTsKK30KKworLy8gQ2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJl
YWQuCitzdGQ6OnVuaXF1ZV9wdHI8VHJhY2VXcml0ZXJCYXNlPiBUcmFjaW5nTXV4ZXJJbXBsOjpD
cmVhdGVUcmFjZVdyaXRlcigKKyAgICBEYXRhU291cmNlU3RhdGUqIGRhdGFfc291cmNlLAorICAg
IEJ1ZmZlckV4aGF1c3RlZFBvbGljeSBidWZmZXJfZXhoYXVzdGVkX3BvbGljeSkgeworICBQcm9k
dWNlckltcGwqIHByb2R1Y2VyID0gYmFja2VuZHNfW2RhdGFfc291cmNlLT5iYWNrZW5kX2lkXS5w
cm9kdWNlci5nZXQoKTsKKyAgcmV0dXJuIHByb2R1Y2VyLT5zZXJ2aWNlXy0+Q3JlYXRlVHJhY2VX
cml0ZXIoZGF0YV9zb3VyY2UtPmJ1ZmZlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3kpOworfQorCisvLyBU
aGlzIGlzIGNhbGxlZCB2aWEgdGhlIHB1YmxpYyBBUEkgVHJhY2luZzo6TmV3VHJhY2UoKS4KKy8v
IENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgorc3RkOjp1bmlxdWVfcHRyPFRyYWNpbmdT
ZXNzaW9uPiBUcmFjaW5nTXV4ZXJJbXBsOjpDcmVhdGVUcmFjaW5nU2Vzc2lvbigKKyAgICBCYWNr
ZW5kVHlwZSBiYWNrZW5kX3R5cGUpIHsKKyAgVHJhY2luZ1Nlc3Npb25HbG9iYWxJRCBzZXNzaW9u
X2lkID0gKytuZXh0X3RyYWNpbmdfc2Vzc2lvbl9pZF87CisKKyAgLy8gfGJhY2tlbmRfdHlwZXwg
Y2FuIG9ubHkgc3BlY2lmeSBvbmUgYmFja2VuZCwgbm90IGFuIE9SLWVkIG1hc2suCisgIFBFUkZF
VFRPX0NIRUNLKChiYWNrZW5kX3R5cGUgJiAoYmFja2VuZF90eXBlIC0gMSkpID09IDApOworCisg
IC8vIENhcHR1cmluZyB8dGhpc3wgaXMgZmluZSBiZWNhdXNlIHRoZSBUcmFjaW5nTXV4ZXIgaXMg
YSBsZWFreSBzaW5nbGV0b24uCisgIHRhc2tfcnVubmVyXy0+UG9zdFRhc2soW3RoaXMsIGJhY2tl
bmRfdHlwZSwgc2Vzc2lvbl9pZF0geworICAgIGZvciAoUmVnaXN0ZXJlZEJhY2tlbmQmIGJhY2tl
bmQgOiBiYWNrZW5kc18pIHsKKyAgICAgIGlmIChiYWNrZW5kX3R5cGUgJiYgYmFja2VuZC50eXBl
ICE9IGJhY2tlbmRfdHlwZSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGJhY2tlbmQuY29u
c3VtZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICBuZXcgQ29uc3VtZXJJbXBsKHRoaXMsIGJh
Y2tlbmQuaWQsIHNlc3Npb25faWQpKTsKKyAgICAgIGF1dG8mIGNvbnN1bWVyID0gYmFja2VuZC5j
b25zdW1lcnMuYmFjaygpOworICAgICAgVHJhY2luZ0JhY2tlbmQ6OkNvbm5lY3RDb25zdW1lckFy
Z3MgY29ubl9hcmdzOworICAgICAgY29ubl9hcmdzLmNvbnN1bWVyID0gY29uc3VtZXIuZ2V0KCk7
CisgICAgICBjb25uX2FyZ3MudGFza19ydW5uZXIgPSB0YXNrX3J1bm5lcl8uZ2V0KCk7CisgICAg
ICBjb25zdW1lci0+SW5pdGlhbGl6ZShiYWNrZW5kLmJhY2tlbmQtPkNvbm5lY3RDb25zdW1lcihj
b25uX2FyZ3MpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgUEVSRkVUVE9fRUxPRygKKyAg
ICAgICAgIkNhbm5vdCBjcmVhdGUgdHJhY2luZyBzZXNzaW9uLCBubyB0cmFjaW5nIGJhY2tlbmQg
cmVhZHkgZm9yIHR5cGU9JWQiLAorICAgICAgICBiYWNrZW5kX3R5cGUpOworICB9KTsKKworICBy
ZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFRyYWNpbmdTZXNzaW9uPigKKyAgICAgIG5ldyBUcmFjaW5n
U2Vzc2lvbkltcGwodGhpcywgc2Vzc2lvbl9pZCkpOworfQorCit2b2lkIFRyYWNpbmdNdXhlcklt
cGw6OkluaXRpYWxpemVJbnN0YW5jZShjb25zdCBUcmFjaW5nSW5pdEFyZ3MmIGFyZ3MpIHsKKyAg
aWYgKGluc3RhbmNlXykKKyAgICBQRVJGRVRUT19GQVRBTCgiVHJhY2luZyBhbHJlYWR5IGluaXRp
YWxpemVkIik7CisgIGluc3RhbmNlXyA9IG5ldyBUcmFjaW5nTXV4ZXJJbXBsKGFyZ3MpOworfQor
CitUcmFjaW5nTXV4ZXI6On5UcmFjaW5nTXV4ZXIoKSA9IGRlZmF1bHQ7CisKK3N0YXRpY19hc3Nl
cnQoc3RkOjppc19zYW1lPGludGVybmFsOjpCdWZmZXJJZCwgQnVmZmVySUQ+Ojp2YWx1ZSwKKyAg
ICAgICAgICAgICAgInB1YmxpYydzIEJ1ZmZlcklkIGFuZCB0cmFjaW5nL2NvcmUncyBCdWZmZXJJ
RCBkaXZlcmdlZCIpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcv
aW50ZXJuYWwvdHJhY2tfZXZlbnRfaW50ZXJuYWwuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy90cmFja19ldmVudC5oCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvaW50ZXJu
YWwvdHJhY2tfZXZlbnRfZGF0YV9zb3VyY2UuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50X2NhdGVnb3J5X3JlZ2lz
dHJ5LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2Ug
UHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lv
biAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcv
bGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJs
ZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1
bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICog
V0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHBy
ZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5n
dWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUg
TGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19F
VkVOVF9DQVRFR09SWV9SRUdJU1RSWV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJ
TkdfVFJBQ0tfRVZFTlRfQ0FURUdPUllfUkVHSVNUUllfSF8KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9kYXRhX3NvdXJjZS5oIgorCisj
aW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dXRpbGl0
eT4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK2NsYXNzIER5bmFtaWNDYXRlZ29yeTsKKworLy8g
QSBjb21waWxlLXRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFjayBldmVudCBjYXRlZ29yeS4g
U2VlCisvLyBQRVJGRVRUT19ERUZJTkVfQ0FURUdPUklFUyBmb3IgcmVnaXN0ZXJpbmcgeW91ciBv
d24gY2F0ZWdvcmllcy4KK3N0cnVjdCBQRVJGRVRUT19FWFBPUlQgQ2F0ZWdvcnkgeworICB1c2lu
ZyBUYWdzID0gc3RkOjphcnJheTxjb25zdCBjaGFyKiwgND47CisKKyAgY29uc3QgY2hhciogY29u
c3QgbmFtZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGRlc2NyaXB0aW9uID0gbnVs
bHB0cjsKKyAgY29uc3QgVGFncyB0YWdzID0ge307CisKKyAgY29uc3RleHByIENhdGVnb3J5KGNv
bnN0IENhdGVnb3J5JikgPSBkZWZhdWx0OworICBjb25zdGV4cHIgZXhwbGljaXQgQ2F0ZWdvcnko
Y29uc3QgY2hhciogbmFtZV8pCisgICAgICA6IG5hbWUoQ2hlY2tJc1ZhbGlkQ2F0ZWdvcnkobmFt
ZV8pKSwKKyAgICAgICAgbmFtZV9zaXplc18oQ29tcHV0ZU5hbWVTaXplcyhuYW1lXykpIHt9CisK
KyAgY29uc3RleHByIENhdGVnb3J5IFNldERlc2NyaXB0aW9uKGNvbnN0IGNoYXIqIGRlc2NyaXB0
aW9uXykgY29uc3QgeworICAgIHJldHVybiBDYXRlZ29yeShuYW1lLCBkZXNjcmlwdGlvbl8sIHRh
Z3MsIG5hbWVfc2l6ZXNfKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgor
ICBjb25zdGV4cHIgQ2F0ZWdvcnkgU2V0VGFncyhBcmdzJiYuLi4gYXJncykgY29uc3QgeworICAg
IHJldHVybiBDYXRlZ29yeShuYW1lLCBkZXNjcmlwdGlvbiwge3N0ZDo6Zm9yd2FyZDxBcmdzPihh
cmdzKS4uLn0sCisgICAgICAgICAgICAgICAgICAgIG5hbWVfc2l6ZXNfKTsKKyAgfQorCisgIC8v
IEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbXVsdGlwbGUgY2F0ZWdvcmllcyB0byBiZSB1c2Vk
IGluIGEgc2luZ2xlIHRyYWNlCisgIC8vIHBvaW50LgorICBzdGF0aWMgY29uc3RleHByIENhdGVn
b3J5IEdyb3VwKGNvbnN0IGNoYXIqIG5hbWVzKSB7CisgICAgcmV0dXJuIENhdGVnb3J5KG5hbWVz
LCBBbGxvd0dyb3Vwe30pOworICB9CisKKyAgLy8gVXNlZCBmb3IgcGFyc2luZyBkeW5hbWljIGNh
dGVnb3J5IGdyb3Vwcy4gTm90ZSB0aGF0IHxuYW1lfCBhbmQKKyAgLy8gfER5bmFtaWNDYXRlZ29y
eXwgbXVzdCBvdXRsaXZlIHRoZSByZXR1cm5lZCBvYmplY3QgYmVjYXVzZSB0aGUgY2F0ZWdvcnkK
KyAgLy8gbmFtZSBpc24ndCBjb3BpZWQuCisgIHN0YXRpYyBDYXRlZ29yeSBGcm9tRHluYW1pY0Nh
dGVnb3J5KGNvbnN0IGNoYXIqIG5hbWUpOworICBzdGF0aWMgQ2F0ZWdvcnkgRnJvbUR5bmFtaWND
YXRlZ29yeShjb25zdCBEeW5hbWljQ2F0ZWdvcnkmKTsKKworICBjb25zdGV4cHIgYm9vbCBJc0dy
b3VwKCkgY29uc3QgeyByZXR1cm4gR2V0TmFtZVNpemUoMSkgPiAwOyB9CisKKyAgLy8gUmV0dXJu
cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciBpbiB0aGUgY2F0ZWdvcnkgbmFtZS4gTm90IHZhbGlk
IGZvcgorICAvLyBjYXRlZ29yeSBncm91cHMuCisgIHNpemVfdCBuYW1lX3NpemUoKSBjb25zdCB7
CisgICAgUEVSRkVUVE9fRENIRUNLKCFJc0dyb3VwKCkpOworICAgIHJldHVybiBHZXROYW1lU2l6
ZSgwKTsKKyAgfQorCisgIC8vIEl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBtZW1iZXJzIG9mIHRoaXMg
Y2F0ZWdvcnkgZ3JvdXAsIG9yIGp1c3QgdGhlIG5hbWUgb2YKKyAgLy8gdGhlIGNhdGVnb3J5IGl0
c2VsZiBpZiB0aGlzIGlzbid0IGEgY2F0ZWdvcnkgZ3JvdXAuIFJldHVybiBmYWxzZSBmcm9tCisg
IC8vIHxjYWxsYmFja3wgdG8gc3RvcCBpdGVyYXRpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
PgorICB2b2lkIEZvckVhY2hHcm91cE1lbWJlcihUIGNhbGxiYWNrKSBjb25zdCB7CisgICAgY29u
c3QgY2hhciogbmFtZV9wdHIgPSBuYW1lOworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAo
c2l6ZV90IG5hbWVfc2l6ZSA9IEdldE5hbWVTaXplKGkrKykpIHsKKyAgICAgIGlmICghY2FsbGJh
Y2sobmFtZV9wdHIsIG5hbWVfc2l6ZSkpCisgICAgICAgIGJyZWFrOworICAgICAgbmFtZV9wdHIg
Kz0gbmFtZV9zaXplICsgMTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25z
dGV4cHIgc2l6ZV90IGtNYXhHcm91cFNpemUgPSA0OworICB1c2luZyBOYW1lU2l6ZXMgPSBzdGQ6
OmFycmF5PHVpbnQ4X3QsIGtNYXhHcm91cFNpemU+OworCisgIGNvbnN0ZXhwciBDYXRlZ29yeShj
b25zdCBjaGFyKiBuYW1lXywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlc2Ny
aXB0aW9uXywKKyAgICAgICAgICAgICAgICAgICAgIFRhZ3MgdGFnc18sCisgICAgICAgICAgICAg
ICAgICAgICBOYW1lU2l6ZXMgbmFtZV9zaXplcykKKyAgICAgIDogbmFtZShuYW1lXyksCisgICAg
ICAgIGRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uXyksCisgICAgICAgIHRhZ3ModGFnc18pLAorICAg
ICAgICBuYW1lX3NpemVzXyhuYW1lX3NpemVzKSB7fQorCisgIGVudW0gQWxsb3dHcm91cCB7fTsK
KyAgY29uc3RleHByIENhdGVnb3J5KGNvbnN0IGNoYXIqIG5hbWVfLCBBbGxvd0dyb3VwKQorICAg
ICAgOiBuYW1lKENoZWNrSXNWYWxpZENhdGVnb3J5R3JvdXAobmFtZV8pKSwKKyAgICAgICAgbmFt
ZV9zaXplc18oQ29tcHV0ZU5hbWVTaXplcyhuYW1lXykpIHt9CisKKyAgY29uc3RleHByIHNpemVf
dCBHZXROYW1lU2l6ZShzaXplX3QgaSkgY29uc3QgeworICAgIHJldHVybiBpIDwgbmFtZV9zaXpl
c18uc2l6ZSgpID8gbmFtZV9zaXplc19baV0gOiAwOworICB9CisKKyAgc3RhdGljIGNvbnN0ZXhw
ciBOYW1lU2l6ZXMgQ29tcHV0ZU5hbWVTaXplcyhjb25zdCBjaGFyKiBzKSB7CisgICAgc3RhdGlj
X2Fzc2VydChrTWF4R3JvdXBTaXplID09IDQsICJVbmV4cGVjdGVkIG1heGltdW0gY2F0ZWdvcnkg
Z3JvdXAgc2l6ZSIpOworICAgIHJldHVybiBOYW1lU2l6ZXN7e3N0YXRpY19jYXN0PHVpbnQ4X3Q+
KEdldE50aE5hbWVTaXplKDAsIHMsIHMpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDx1aW50OF90PihHZXROdGhOYW1lU2l6ZSgxLCBzLCBzKSksCisgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oR2V0TnRoTmFtZVNpemUoMiwgcywgcykpLAorICAg
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEdldE50aE5hbWVTaXplKDMs
IHMsIHMpKX19OworICB9CisKKyAgc3RhdGljIGNvbnN0ZXhwciBwdHJkaWZmX3QgR2V0TnRoTmFt
ZVNpemUoaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IGNoYXIqIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBjaGFyKiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGludCBjb3VudGVyID0gMCkgeworICAgIHJldHVybiAoISplbmQgfHwgKmVu
ZCA9PSAnLCcpCisgICAgICAgICAgICAgICA/ICgoISplbmQgfHwgY291bnRlciA9PSBuKQorICAg
ICAgICAgICAgICAgICAgICAgID8gKGNvdW50ZXIgPT0gbiA/IGVuZCAtIHN0YXJ0IDogMCkKKyAg
ICAgICAgICAgICAgICAgICAgICA6IEdldE50aE5hbWVTaXplKG4sIGVuZCArIDEsIGVuZCArIDEs
IGNvdW50ZXIgKyAxKSkKKyAgICAgICAgICAgICAgIDogR2V0TnRoTmFtZVNpemUobiwgc3RhcnQs
IGVuZCArIDEsIGNvdW50ZXIpOworICB9CisKKyAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFy
KiBDaGVja0lzVmFsaWRDYXRlZ29yeShjb25zdCBjaGFyKiBuKSB7CisgICAgLy8gV2UganVzdCBy
ZXBsYWNlIGludmFsaWQgaW5wdXQgd2l0aCBhIG51bGxwdHIgaGVyZTsgaXQgd2lsbCB0cmlnZ2Vy
IGEKKyAgICAvLyBzdGF0aWMgYXNzZXJ0IGluIFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5OjpW
YWxpZGF0ZUNhdGVnb3JpZXMoKS4KKyAgICByZXR1cm4gR2V0TnRoTmFtZVNpemUoMSwgbiwgbikg
PyBudWxscHRyIDogbjsKKyAgfQorCisgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogQ2hl
Y2tJc1ZhbGlkQ2F0ZWdvcnlHcm91cChjb25zdCBjaGFyKiBuKSB7CisgICAgLy8gU2FtZSBhcyBh
Ym92ZTogcmVwbGFjZSBpbnZhbGlkIGlucHV0IHdpdGggbnVsbHB0ci4KKyAgICByZXR1cm4gIUdl
dE50aE5hbWVTaXplKDEsIG4sIG4pIHx8IEdldE50aE5hbWVTaXplKGtNYXhHcm91cFNpemUsIG4s
IG4pCisgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgIDogbjsKKyAgfQor
CisgIC8vIEFuIGFycmF5IG9mIGxlbmd0aHMgb2YgdGhlIGRpZmZlcmVudCBuYW1lcyBhc3NvY2lh
dGVkIHdpdGggdGhpcyBjYXRlZ29yeS4KKyAgLy8gSWYgdGhpcyBjYXRlZ29yeSBkb2Vzbid0IHJl
cHJlc2VudCBhIGdyb3VwIG9mIG11bHRpcGxlIGNhdGVnb3JpZXMsIG9ubHkgdGhlCisgIC8vIGZp
cnN0IGVsZW1lbnQgaXMgbm9uLXplcm8uCisgIGNvbnN0IE5hbWVTaXplcyBuYW1lX3NpemVzXyA9
IHt9OworfTsKKworLy8gRHluYW1pY2FsbHkgY29uc3RydWN0ZWQgY2F0ZWdvcnkgbmFtZXMgc2hv
dWxkIG1hcmtlZCBhcyBzdWNoIHRocm91Z2ggdGhpcworLy8gY29udGFpbmVyIHR5cGUgdG8gbWFr
ZSBpdCBsZXNzIGxpa2VseSBmb3IgdHJhY2UgcG9pbnRzIHRvIGFjY2lkZW50YWxseSBzdGFydAor
Ly8gdXNpbmcgZHluYW1pYyBjYXRlZ29yaWVzLiBFdmVudHMgd2l0aCBkeW5hbWljIGNhdGVnb3Jp
ZXMgd2lsbCBhbHdheXMgYmUKKy8vIHNsaWdodGx5IG1vcmUgZXhwZW5zaXZlIHRoYW4gcmVndWxh
ciBldmVudHMsIHNvIHVzZSB0aGVtIHNwYXJpbmdseS4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBE
eW5hbWljQ2F0ZWdvcnkgZmluYWwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRHluYW1pY0NhdGVn
b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lXykgOiBuYW1lKG5hbWVfKSB7fQorICBleHBsaWNp
dCBEeW5hbWljQ2F0ZWdvcnkoY29uc3QgY2hhciogbmFtZV8pIDogbmFtZShuYW1lXykge30KKyAg
RHluYW1pY0NhdGVnb3J5KCkge30KKyAgfkR5bmFtaWNDYXRlZ29yeSgpID0gZGVmYXVsdDsKKwor
ICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwor
Y29uc3RleHByIGNvbnN0IGNoYXIqIE51bGxDYXRlZ29yeShjb25zdCBjaGFyKikgeworICByZXR1
cm4gbnVsbHB0cjsKK30KKworcGVyZmV0dG86OkR5bmFtaWNDYXRlZ29yeSBOdWxsQ2F0ZWdvcnko
Y29uc3QgcGVyZmV0dG86OkR5bmFtaWNDYXRlZ29yeSYpOworCitjb25zdGV4cHIgYm9vbCBTdHJp
bmdNYXRjaGVzUHJlZml4KGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogcHJlZml4KSB7Cisg
IHJldHVybiAhKnN0ciA/ICEqcHJlZml4CisgICAgICAgICAgICAgICA6ICEqcHJlZml4ID8gdHJ1
ZQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICpzdHIgIT0gKnByZWZpeAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICA/IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDogU3RyaW5nTWF0Y2hlc1ByZWZpeChzdHIgKyAxLCBwcmVmaXggKyAxKTsKK30KKwor
Y29uc3RleHByIGJvb2wgSXNTdHJpbmdJblByZWZpeExpc3QoY29uc3QgY2hhciopIHsKKyAgcmV0
dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KK2NvbnN0ZXhwciBi
b29sIElzU3RyaW5nSW5QcmVmaXhMaXN0KGNvbnN0IGNoYXIqIHN0ciwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuLi4gYXJncykgeworICByZXR1cm4gU3RyaW5nTWF0
Y2hlc1ByZWZpeChzdHIsIHByZWZpeCkgfHwKKyAgICAgICAgIElzU3RyaW5nSW5QcmVmaXhMaXN0
KHN0ciwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKK30KKworLy8gSG9sZHMgYWxsIHRo
ZSByZWdpc3RlcmVkIGNhdGVnb3JpZXMgZm9yIG9uZSBjYXRlZ29yeSBuYW1lc3BhY2UuIFNlZQor
Ly8gUEVSRkVUVE9fREVGSU5FX0NBVEVHT1JJRVMgZm9yIGJ1aWxkaW5nIHRoZSByZWdpc3RyeS4K
K2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeSB7CisgcHVi
bGljOgorICBjb25zdGV4cHIgVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0cnkoc2l6ZV90IGNhdGVn
b3J5X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
Q2F0ZWdvcnkqIGNhdGVnb3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGQ6OmF0b21pYzx1aW50OF90Piogc3RhdGVfc3RvcmFnZSkKKyAgICAgIDogY2F0ZWdv
cmllc18oY2F0ZWdvcmllcyksCisgICAgICAgIGNhdGVnb3J5X2NvdW50XyhjYXRlZ29yeV9jb3Vu
dCksCisgICAgICAgIHN0YXRlX3N0b3JhZ2VfKHN0YXRlX3N0b3JhZ2UpIHsKKyAgICBzdGF0aWNf
YXNzZXJ0KAorICAgICAgICBzaXplb2Yoc3RhdGVfc3RvcmFnZVswXS5sb2FkKCkpICogOCA+PSBr
TWF4RGF0YVNvdXJjZUluc3RhbmNlcywKKyAgICAgICAgIlRoZSBjYXRlZ29yeSBzdGF0ZSBtdXN0
IGhhdmUgZW5vdWdoIGJpdHMgZm9yIGFsbCBwb3NzaWJsZSBkYXRhIHNvdXJjZSAiCisgICAgICAg
ICJpbnN0YW5jZXMiKTsKKyAgfQorCisgIHNpemVfdCBjYXRlZ29yeV9jb3VudCgpIGNvbnN0IHsg
cmV0dXJuIGNhdGVnb3J5X2NvdW50XzsgfQorCisgIC8vIFJldHVybnMgYSBjYXRlZ29yeSBiYXNl
ZCBvbiBpdHMgaW5kZXguCisgIGNvbnN0IENhdGVnb3J5KiBHZXRDYXRlZ29yeShzaXplX3QgaW5k
ZXgpIGNvbnN0OworCisgIC8vIFR1cm4gdHJhY2luZyBvbiBvciBvZmYgZm9yIHRoZSBnaXZlbiBj
YXRlZ29yeSBpbiBhIHRyYWNrIGV2ZW50IGRhdGEgc291cmNlCisgIC8vIGluc3RhbmNlLgorICB2
b2lkIEVuYWJsZUNhdGVnb3J5Rm9ySW5zdGFuY2Uoc2l6ZV90IGNhdGVnb3J5X2luZGV4LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5zdGFuY2VfaW5kZXgpIGNv
bnN0OworICB2b2lkIERpc2FibGVDYXRlZ29yeUZvckluc3RhbmNlKHNpemVfdCBjYXRlZ29yeV9p
bmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnN0YW5j
ZV9pbmRleCkgY29uc3Q7CisKKyAgY29uc3RleHByIHN0ZDo6YXRvbWljPHVpbnQ4X3Q+KiBHZXRD
YXRlZ29yeVN0YXRlKAorICAgICAgc2l6ZV90IGNhdGVnb3J5X2luZGV4KSBjb25zdCB7CisgICAg
cmV0dXJuICZzdGF0ZV9zdG9yYWdlX1tjYXRlZ29yeV9pbmRleF07CisgIH0KKworICAvLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorICAvLyBUcmFjZSBwb2ludCBzdXBwb3J0CisgIC8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCisgIC8vCisgIC8vIChUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgYnkgdGhl
IHRyYWNrIGV2ZW50IHRyYWNlIHBvaW50CisgIC8vIGltcGxlbWVudGF0aW9uIGFuZCB0eXBpY2Fs
bHkgZG9uJ3QgbmVlZCB0byBiZSBjYWxsZWQgYnkgb3RoZXIgY29kZS4pCisKKyAgLy8gQXQgY29t
cGlsZSB0aW1lLCB0dXJuIGEgY2F0ZWdvcnkgbmFtZSBpbnRvIGFuIGluZGV4IGludG8gdGhlIHJl
Z2lzdHJ5LgorICAvLyBSZXR1cm5zIGtJbnZhbGlkQ2F0ZWdvcnlJbmRleCBpZiB0aGUgY2F0ZWdv
cnkgd2FzIG5vdCBmb3VuZCwgb3IKKyAgLy8ga0R5bmFtaWNDYXRlZ29yeUluZGV4IGlmIHxpc19k
eW5hbWljfCBpcyB0cnVlIG9yIGEgRHluYW1pY0NhdGVnb3J5IHdhcworICAvLyBwYXNzZWQgaW4u
CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtJbnZhbGlkQ2F0ZWdvcnlJbmRleCA9IHN0YXRp
Y19jYXN0PHNpemVfdD4oLTEpOworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRHluYW1pY0Nh
dGVnb3J5SW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KC0yKTsKKyAgY29uc3RleHByIHNpemVf
dCBGaW5kKGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wgaXNfZHluYW1pYykgY29uc3QgeworICAgIHJl
dHVybiBDaGVja0lzVmFsaWRDYXRlZ29yeUluZGV4KEZpbmRJbXBsKG5hbWUsIGlzX2R5bmFtaWMp
KTsKKyAgfQorCisgIGNvbnN0ZXhwciBzaXplX3QgRmluZChjb25zdCBEeW5hbWljQ2F0ZWdvcnkm
LCBib29sKSBjb25zdCB7CisgICAgcmV0dXJuIGtEeW5hbWljQ2F0ZWdvcnlJbmRleDsKKyAgfQor
CisgIGNvbnN0ZXhwciBib29sIFZhbGlkYXRlQ2F0ZWdvcmllcyhzaXplX3QgaW5kZXggPSAwKSBj
b25zdCB7CisgICAgcmV0dXJuIChpbmRleCA9PSBjYXRlZ29yeV9jb3VudF8pCisgICAgICAgICAg
ICAgICA/IHRydWUKKyAgICAgICAgICAgICAgIDogSXNWYWxpZENhdGVnb3J5TmFtZShjYXRlZ29y
aWVzX1tpbmRleF0ubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgID8gVmFsaWRhdGVDYXRlZ29y
aWVzKGluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CisgIH0KKworIHBy
aXZhdGU6CisgIC8vIFRPRE8oc2t5b3N0aWwpOiBNYWtlIHRoZSBjb21waWxlLXRpbWUgcm91dGlu
ZXMgbmljZXIgd2l0aCBDKysxNC4KKyAgY29uc3RleHByIHNpemVfdCBGaW5kSW1wbChjb25zdCBj
aGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZHluYW1pYywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5kZXggPSAwKSBjb25zdCB7Cisg
ICAgcmV0dXJuIGlzX2R5bmFtaWMgPyBrRHluYW1pY0NhdGVnb3J5SW5kZXgKKyAgICAgICAgICAg
ICAgICAgICAgICA6IChpbmRleCA9PSBjYXRlZ29yeV9jb3VudF8pCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgPyBrSW52YWxpZENhdGVnb3J5SW5kZXgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA6IFN0cmluZ0VxKGNhdGVnb3JpZXNfW2luZGV4XS5uYW1lLCBuYW1lKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5kZXgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA6IEZpbmRJbXBsKG5hbWUsIGZhbHNlLCBpbmRleCArIDEpOworICB9CisK
KyAgLy8gQSBjb21waWxlIHRpbWUgaGVscGVyIGZvciBjaGVja2luZyB0aGF0IGEgY2F0ZWdvcnkg
aW5kZXggaXMgdmFsaWQuCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IENoZWNrSXNWYWxpZENh
dGVnb3J5SW5kZXgoc2l6ZV90IGluZGV4KSB7CisgICAgLy8gUmVsaWVzIG9uIFBFUkZFVFRPX0NI
RUNLKCkgKGFuZCB0aGUgc3Vycm91bmRpbmcgbGFtYmRhKSBiZWluZyBhCisgICAgLy8gbm9uLWNv
bnN0ZXhwciBmdW5jdGlvbiwgd2hpY2ggd2lsbCBmYWlsIHRoZSBidWlsZCBpZiB0aGUgZ2l2ZW4g
fGluZGV4fCBpcworICAgIC8vIGludmFsaWQuIFRoZSBmdW5ueSBmb3JtYXR0aW5nIGhlcmUgaXMg
c28gdGhhdCBjbGFuZyBzaG93cyB0aGUgY29tbWVudAorICAgIC8vIGJlbG93IGFzIHBhcnQgb2Yg
dGhlIGVycm9yIG1lc3NhZ2UuCisgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgIHJldHVybiBp
bmRleCAhPSBrSW52YWxpZENhdGVnb3J5SW5kZXggPyBpbmRleCA6IFwKKyAgICAgICAgLyogSW52
YWxpZCBjYXRlZ29yeSAtLSBhZGQgaXQgdG8gUEVSRkVUVE9fREVGSU5FX0NBVEVHT1JJRVMoKS4g
Ki8gW10geworICAgICAgICBQRVJGRVRUT19DSEVDSygKKyAgICAgICAgICAgIGZhbHNlICYmCisg
ICAgICAgICAgICAiQSB0cmFjayBldmVudCB1c2VkIGFuIHVua25vd24gY2F0ZWdvcnkuIFBsZWFz
ZSBhZGQgaXQgdG8gIgorICAgICAgICAgICAgIlBFUkZFVFRPX0RFRklORV9DQVRFR09SSUVTKCku
Iik7CisgICAgICAgIHJldHVybiBrSW52YWxpZENhdGVnb3J5SW5kZXg7CisgICAgICB9KCk7Cisg
ICAgLy8gY2xhbmctZm9ybWF0IG9uCisgIH0KKworICBzdGF0aWMgY29uc3RleHByIGJvb2wgSXNW
YWxpZENhdGVnb3J5TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgcmV0dXJuICghbmFtZSB8
fCAqbmFtZSA9PSAnXCInIHx8ICpuYW1lID09ICcqJyB8fCAqbmFtZSA9PSAnICcpCisgICAgICAg
ICAgICAgICA/IGZhbHNlCisgICAgICAgICAgICAgICA6ICpuYW1lID8gSXNWYWxpZENhdGVnb3J5
TmFtZShuYW1lICsgMSkgOiB0cnVlOworICB9CisKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIFN0
cmluZ0VxKGNvbnN0IGNoYXIqIGEsIGNvbnN0IGNoYXIqIGIpIHsKKyAgICByZXR1cm4gKmEgIT0g
KmIgPyBmYWxzZQorICAgICAgICAgICAgICAgICAgICA6ICghKmEgfHwgISpiKSA/ICgqYSA9PSAq
YikgOiBTdHJpbmdFcShhICsgMSwgYiArIDEpOworICB9CisKKyAgY29uc3QgQ2F0ZWdvcnkqIGNv
bnN0IGNhdGVnb3JpZXNfOworICBjb25zdCBzaXplX3QgY2F0ZWdvcnlfY291bnRfOworICBzdGQ6
OmF0b21pYzx1aW50OF90PiogY29uc3Qgc3RhdGVfc3RvcmFnZV87Cit9OworCit9ICAvLyBuYW1l
c3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElO
Q0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19FVkVOVF9DQVRFR09SWV9SRUdJU1RSWV9IXwor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX1RSQUNL
X0VWRU5UX0RBVEFfU09VUkNFX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19J
TlRFUk5BTF9UUkFDS19FVkVOVF9EQVRBX1NPVVJDRV9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2NvbXBpbGVyLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZV9o
YW5kbGUuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3RyYWNpbmcvY29yZS9kYXRhX3NvdXJjZV9jb25maWcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvZGF0YV9zb3VyY2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvZXZlbnRf
Y29udGV4dC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vdHJhY2luZy9pbnRlcm5hbC90cmFja19ldmVudF9pbnRlcm5hbC5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjay5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFj
a19ldmVudF9jYXRlZ29yeV9yZWdpc3RyeS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9idWlsdGluX2Nsb2NrLnBiemVyby5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRv
L2NvbmZpZy90cmFja19ldmVudC90cmFja19ldmVudF9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tf
ZXZlbnQvdHJhY2tfZXZlbnQucGJ6ZXJvLmgiCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2Ugewor
CisvLyBBIHRlbXBsYXRlIGhlbHBlciBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHR5cGUgY2Fu
IGJlIHVzZWQgYXMgYSB0cmFjayBldmVudAorLy8gbGFtYmRhLCBpLmUuLCBpdCBoYXMgdGhlIHNp
Z25hdHVyZSAidm9pZChFdmVudENvbnRleHQpIi4gVGhpcyBpcyBhY2hpZXZlZCBieQorLy8gY2hl
Y2tpbmcgdGhhdCB3ZSBjYW4gcGFzcyBhbiBFdmVudENvbnRleHQgdmFsdWUgKHRoZSBpbm5lciBk
ZWNsdmFsKSBpbnRvIGEgVAorLy8gaW5zdGFuY2UgKHRoZSBvdXRlciBkZWNsdmFsKS4gSWYgdGhp
cyBpcyBhIHZhbGlkIGV4cHJlc3Npb24sIHRoZSByZXN1bHQKKy8vIGV2YWx1YXRlcyB0byBzaXpl
b2YoMCksIGkuZS4sIHRydWUuCisvLyBUT0RPKHNreW9zdGlsKTogUmVwbGFjZSB0aGlzIHdpdGgg
c3RkOjppc19jb252ZXJ0aWJsZTxzdGQ6OmZ1bmN0aW9uPC4uLj4+CisvLyBvbmNlIHdlIGhhdmUg
QysrMTQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBJc1Zh
bGlkVHJhY2VMYW1iZGFJbXBsKAorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0YXRpY19j
YXN0PGJvb2w+KAorICAgICAgICBzaXplb2Yoc3RkOjpkZWNsdmFsPFQ+KCkoc3RkOjpkZWNsdmFs
PEV2ZW50Q29udGV4dD4oKSksIDApKT46OnR5cGUqID0KKyAgICAgICAgbnVsbHB0cikgeworICBy
ZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgY29uc3RleHBy
IGJvb2wgSXNWYWxpZFRyYWNlTGFtYmRhSW1wbCguLi4pIHsKKyAgcmV0dXJuIGZhbHNlOworfQor
Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBJc1ZhbGlkVHJh
Y2VMYW1iZGEoKSB7CisgIHJldHVybiBJc1ZhbGlkVHJhY2VMYW1iZGFJbXBsPFQ+KG51bGxwdHIp
OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RydWN0IFRyYWNrRXZlbnREYXRhU291cmNlVHJh
aXRzIDogcHVibGljIHBlcmZldHRvOjpEZWZhdWx0RGF0YVNvdXJjZVRyYWl0cyB7CisgIHVzaW5n
IEluY3JlbWVudGFsU3RhdGVUeXBlID0gVHJhY2tFdmVudEluY3JlbWVudGFsU3RhdGU7CisKKyAg
Ly8gVXNlIGEgb25lIHNoYXJlZCBUTFMgc2xvdCBzbyB0aGF0IGFsbCB0cmFjayBldmVudCBkYXRh
IHNvdXJjZXMgd3JpdGUgaW50bworICAvLyB0aGUgc2FtZSBzZXF1ZW5jZSBhbmQgc2hhcmUgaW50
ZXJuaW5nIGRpY3Rpb25hcmllcy4KKyAgc3RhdGljIERhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRl
KiBHZXREYXRhU291cmNlVExTKERhdGFTb3VyY2VTdGF0aWNTdGF0ZSosCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nVExTKiByb290
X3RscykgeworICAgIHJldHVybiAmcm9vdF90bHMtPnRyYWNrX2V2ZW50X3RsczsKKyAgfQorfTsK
KworLy8gQSBoZWxwZXIgdGhhdCBlbnN1cmVzIG1vdmFibGUgZGVidWcgYW5ub3RhdGlvbnMgYXJl
IHBhc3NlZCBieSB2YWx1ZSB0bworLy8gbWluaW1pemUgYmluYXJ5IHNpemUgYXQgdGhlIGNhbGwg
c2l0ZSwgd2hpbGUgYWxsb3dpbmcgbm9uLW1vdmFibGUgYW5kCisvLyBub24tY29waWFibGUgYXJn
dW1lbnRzIHRvIGJlIHBhc3NlZCBieSByZWZlcmVuY2UuCisvLyBUT0RPKHNreW9zdGlsKTogUmVt
b3ZlIHRoaXMgd2l0aCBDKysxNy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IERlYnVn
QW5ub3RhdGlvbkFyZyB7CisgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBzdGQ6OgorICAgICAgY29u
ZGl0aW9uYWw8c3RkOjppc19tb3ZlX2NvbnN0cnVjdGlibGU8VD46OnZhbHVlLCBULCBUJiY+Ojp0
eXBlOworfTsKKworLy8gQSBnZW5lcmljIHRyYWNrIGV2ZW50IGRhdGEgc291cmNlIHdoaWNoIGlz
IGluc3RhbnRpYXRlZCBvbmNlIHBlciB0cmFjayBldmVudAorLy8gY2F0ZWdvcnkgbmFtZXNwYWNl
LgordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFTb3VyY2VUeXBlLCBjb25zdCBUcmFja0V2ZW50Q2F0
ZWdvcnlSZWdpc3RyeSogUmVnaXN0cnk+CitjbGFzcyBUcmFja0V2ZW50RGF0YVNvdXJjZQorICAg
IDogcHVibGljIERhdGFTb3VyY2U8RGF0YVNvdXJjZVR5cGUsIFRyYWNrRXZlbnREYXRhU291cmNl
VHJhaXRzPiB7CisgIHVzaW5nIEJhc2UgPSBEYXRhU291cmNlPERhdGFTb3VyY2VUeXBlLCBUcmFj
a0V2ZW50RGF0YVNvdXJjZVRyYWl0cz47CisKKyBwdWJsaWM6CisgIC8vIERhdGFTb3VyY2UgaW1w
bGVtZW50YXRpb24uCisgIHZvaWQgT25TZXR1cChjb25zdCBEYXRhU291cmNlQmFzZTo6U2V0dXBB
cmdzJiBhcmdzKSBvdmVycmlkZSB7CisgICAgYXV0byBjb25maWdfcmF3ID0gYXJncy5jb25maWct
PnRyYWNrX2V2ZW50X2NvbmZpZ19yYXcoKTsKKyAgICBib29sIG9rID0gY29uZmlnXy5QYXJzZUZy
b21BcnJheShjb25maWdfcmF3LmRhdGEoKSwgY29uZmlnX3Jhdy5zaXplKCkpOworICAgIFBFUkZF
VFRPX0RDSEVDSyhvayk7CisgICAgVHJhY2tFdmVudEludGVybmFsOjpFbmFibGVUcmFjaW5nKCpS
ZWdpc3RyeSwgY29uZmlnXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJncy5pbnRlcm5hbF9pbnN0YW5jZV9pbmRleCk7CisgIH0KKworICB2b2lkIE9uU3RhcnQoY29u
c3QgRGF0YVNvdXJjZUJhc2U6OlN0YXJ0QXJncyYpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBPblN0
b3AoY29uc3QgRGF0YVNvdXJjZUJhc2U6OlN0b3BBcmdzJiBhcmdzKSBvdmVycmlkZSB7CisgICAg
VHJhY2tFdmVudEludGVybmFsOjpEaXNhYmxlVHJhY2luZygqUmVnaXN0cnksIGFyZ3MuaW50ZXJu
YWxfaW5zdGFuY2VfaW5kZXgpOworICB9CisKKyAgc3RhdGljIHZvaWQgRmx1c2goKSB7CisgICAg
QmFzZTo6dGVtcGxhdGUgVHJhY2UoW10odHlwZW5hbWUgQmFzZTo6VHJhY2VDb250ZXh0IGN0eCkg
eyBjdHguRmx1c2goKTsgfSk7CisgIH0KKworICAvLyBEZXRlcm1pbmUgaWYgdHJhY2luZyBmb3Ig
dGhlIGdpdmVuIHN0YXRpYyBjYXRlZ29yeSBpcyBlbmFibGVkLgorICB0ZW1wbGF0ZSA8c2l6ZV90
IENhdGVnb3J5SW5kZXg+CisgIHN0YXRpYyBib29sIElzQ2F0ZWdvcnlFbmFibGVkKCkgeworICAg
IHJldHVybiBSZWdpc3RyeS0+R2V0Q2F0ZWdvcnlTdGF0ZShDYXRlZ29yeUluZGV4KQorICAgICAg
ICAtPmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIH0KKworICAvLyBEZXRlcm1p
bmUgaWYgdHJhY2luZyBmb3IgdGhlIGdpdmVuIGR5bmFtaWMgY2F0ZWdvcnkgaXMgZW5hYmxlZC4K
KyAgc3RhdGljIGJvb2wgSXNEeW5hbWljQ2F0ZWdvcnlFbmFibGVkKAorICAgICAgY29uc3QgRHlu
YW1pY0NhdGVnb3J5JiBkeW5hbWljX2NhdGVnb3J5KSB7CisgICAgYm9vbCBlbmFibGVkID0gZmFs
c2U7CisgICAgQmFzZTo6dGVtcGxhdGUgVHJhY2UoWyZdKHR5cGVuYW1lIEJhc2U6OlRyYWNlQ29u
dGV4dCBjdHgpIHsKKyAgICAgIGVuYWJsZWQgPSBJc0R5bmFtaWNDYXRlZ29yeUVuYWJsZWQoJmN0
eCwgZHluYW1pY19jYXRlZ29yeSk7CisgICAgfSk7CisgICAgcmV0dXJuIGVuYWJsZWQ7CisgIH0K
KworICAvLyBUaGlzIGlzIHRoZSBpbmxpbmVkIGVudHJ5cG9pbnQgZm9yIGFsbCB0cmFjayBldmVu
dCB0cmFjZSBwb2ludHMuIEl0IHRyaWVzCisgIC8vIHRvIGJlIGFzIGxpZ2h0d2VpZ2h0IGFzIHBv
c3NpYmxlIGluIHRlcm1zIG9mIGluc3RydWN0aW9ucyBhbmQgYWltcyB0bworICAvLyBjb21waWxl
IGRvd24gdG8gYW4gdW5saWtlbHkgY29uZGl0aW9uYWwganVtcCB0byB0aGUgYWN0dWFsIHRyYWNl
IHdyaXRpbmcKKyAgLy8gZnVuY3Rpb24uCisgIHRlbXBsYXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRl
eCwgdHlwZW5hbWUgQ2FsbGJhY2s+CisgIHN0YXRpYyB2b2lkIENhbGxJZkNhdGVnb3J5RW5hYmxl
ZChDYWxsYmFjayBjYWxsYmFjaykgUEVSRkVUVE9fQUxXQVlTX0lOTElORSB7CisgICAgQmFzZTo6
dGVtcGxhdGUgQ2FsbElmRW5hYmxlZDxDYXRlZ29yeVRyYWNlUG9pbnRUcmFpdHM8Q2F0ZWdvcnlJ
bmRleD4+KAorICAgICAgICBbJmNhbGxiYWNrXSh1aW50MzJfdCBpbnN0YW5jZXMpIHsgY2FsbGJh
Y2soaW5zdGFuY2VzKTsgfSk7CisgIH0KKworICAvLyBPbmNlIHdlJ3ZlIGRldGVybWluZWQgdHJh
Y2luZyB0byBiZSBlbmFibGVkIGZvciB0aGlzIGNhdGVnb3J5LCBhY3R1YWxseQorICAvLyB3cml0
ZSBhIHRyYWNlIGV2ZW50IG9udG8gdGhpcyB0aHJlYWQncyBkZWZhdWx0IHRyYWNrLiBPdXRsaW5l
ZCB0byBhdm9pZAorICAvLyBibG9hdGluZyBjb2RlIChtb3N0bHkgc3RhY2sgZGVwdGgpIGF0IHRo
ZSBhY3R1YWwgdHJhY2UgcG9pbnQuCisgIC8vCisgIC8vIFRvIG1pbmltaXplIGNhbGwgb3Zlcmhl
YWQgYXQgZWFjaCB0cmFjZSBwb2ludCwgd2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nCisgIC8vIHRy
YWNlIHBvaW50IGFyZ3VtZW50IHZhcmlhbnRzOgorICAvLworICAvLyAtIE5vbmUKKyAgLy8gLSBM
YW1iZGEKKyAgLy8gLSBMYW1iZGEgKyB0aW1lc3RhbXAKKyAgLy8gLSBPbmUgZGVidWcgYW5ub3Rh
dGlvbgorICAvLyAtIFR3byBkZWJ1ZyBhbm5vdGF0aW9ucworICAvLyAtIFRyYWNrCisgIC8vIC0g
VHJhY2sgKyBMYW1iZGEKKyAgLy8gLSBUcmFjayArIHRpbWVzdGFtcAorICAvLyAtIFRyYWNrICsg
TGFtYmRhICsgdGltZXN0YW1wCisgIC8vIC0gVHJhY2sgKyBvbmUgZGVidWcgYW5ub3RhdGlvbgor
ICAvLyAtIFRyYWNrICsgdHdvIGRlYnVnIGFubm90YXRpb25zCisKKyAgLy8gVHJhY2UgcG9pbnQg
d2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzLgorICB0ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5SW5k
ZXgsIHR5cGVuYW1lIENhdGVnb3J5VHlwZT4KKyAgc3RhdGljIHZvaWQgVHJhY2VGb3JDYXRlZ29y
eSh1aW50MzJfdCBpbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgQ2F0ZWdvcnlUeXBlJiBkeW5hbWljX2NhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IGNoYXIqIGV2ZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUeXBlIHR5cGUp
CisgICAgICBQRVJGRVRUT19OT19JTkxJTkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlJbXBsPENh
dGVnb3J5SW5kZXg+KGluc3RhbmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRfbmFtZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgfQorCisgIC8v
IFRyYWNlIHBvaW50IHdoaWNoIHRha2VzIGEgbGFtYmRhIGZ1bmN0aW9uIGFyZ3VtZW50LgorICB0
ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5SW5kZXgsCisgICAgICAgICAgICB0eXBlbmFtZSBDYXRl
Z29yeVR5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmd1bWVudEZ1bmN0aW9uID0gdm9pZCAo
KikoRXZlbnRDb250ZXh0KSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rpb25D
aGVjayA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgIElzVmFsaWRU
cmFjZUxhbWJkYTxBcmd1bWVudEZ1bmN0aW9uPigpPjo6dHlwZT4KKyAgc3RhdGljIHZvaWQgVHJh
Y2VGb3JDYXRlZ29yeSh1aW50MzJfdCBpbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgQ2F0ZWdvcnlUeXBlJiBkeW5hbWljX2NhdGVnb3J5LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV2ZW50X25hbWUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50
OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRGdW5j
dGlvbiBhcmdfZnVuY3Rpb24pCisgICAgICBQRVJGRVRUT19OT19JTkxJTkUgeworICAgIFRyYWNl
Rm9yQ2F0ZWdvcnlJbXBsPENhdGVnb3J5SW5kZXg+KAorICAgICAgICBpbnN0YW5jZXMsIGR5bmFt
aWNfY2F0ZWdvcnksIGV2ZW50X25hbWUsIHR5cGUsIFRyYWNrKCksCisgICAgICAgIFRyYWNrRXZl
bnRJbnRlcm5hbDo6R2V0VGltZU5zKCksIHN0ZDo6bW92ZShhcmdfZnVuY3Rpb24pKTsKKyAgfQor
CisgIC8vIFRyYWNlIHBvaW50IHdoaWNoIHRha2VzIGEgbGFtYmRhIGZ1bmN0aW9uIGFyZ3VtZW50
IGFuZCBhbiBvdmVycmlkZGVuCisgIC8vIHRpbWVzdGFtcC4gfHRpbWVzdGFtcHwgbXVzdCBiZSBp
biBuYW5vc2Vjb25kcyBpbiB0aGUgdHJhY2UgY2xvY2sgdGltZWJhc2UuCisgIHRlbXBsYXRlIDxz
aXplX3QgQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAgIHR5cGVuYW1lIENhdGVnb3J5VHlwZSwK
KyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rpb24gPSB2b2lkICgqKShFdmVudENv
bnRleHQpLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJndW1lbnRGdW5jdGlvbkNoZWNrID0gdHlw
ZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgSXNWYWxpZFRyYWNlTGFtYmRh
PEFyZ3VtZW50RnVuY3Rpb24+KCk+Ojp0eXBlPgorICBzdGF0aWMgdm9pZCBUcmFjZUZvckNhdGVn
b3J5KHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNfY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlw
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXAsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRGdW5jdGlvbiBhcmdfZnVuY3Rp
b24pCisgICAgICBQRVJGRVRUT19OT19JTkxJTkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlJbXBs
PENhdGVnb3J5SW5kZXg+KGluc3RhbmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRfbmFtZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBUcmFjaygpLCB0
aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpt
b3ZlKGFyZ19mdW5jdGlvbikpOworICB9CisKKyAgLy8gVGhpcyB2YXJpYW50IG9mIHRoZSBpbm5l
ciB0cmFjZSBwb2ludCB0YWtlcyBhIFRyYWNrIGFyZ3VtZW50IHdoaWNoIGNhbiBiZQorICAvLyB1
c2VkIHRvIGVtaXQgZXZlbnRzIG9uIGEgbm9uLWRlZmF1bHQgdHJhY2suCisgIHRlbXBsYXRlIDxz
aXplX3QgQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAgIHR5cGVuYW1lIENhdGVnb3J5VHlwZSwK
KyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWNrVHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRy
YWNrVHlwZUNoZWNrID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAg
c3RkOjppc19jb252ZXJ0aWJsZTxUcmFja1R5cGUsIFRyYWNrPjo6dmFsdWU+Ojp0eXBlPgorICBz
dGF0aWMgdm9pZCBUcmFjZUZvckNhdGVnb3J5KHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNfY2F0ZWdv
cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFt
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBUcmFja1R5cGUmIHRyYWNrKSBQRVJGRVRUT19OT19JTkxJTkUgeworICAgIFRyYWNl
Rm9yQ2F0ZWdvcnlJbXBsPENhdGVnb3J5SW5kZXg+KGluc3RhbmNlcywgZHluYW1pY19jYXRlZ29y
eSwgZXZlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
eXBlLCB0cmFjayk7CisgIH0KKworICAvLyBUcmFjZSBwb2ludCB3aXRoIGEgdHJhY2sgYW5kIGEg
bGFtYmRhIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5SW5kZXgsCisgICAg
ICAgICAgICB0eXBlbmFtZSBUcmFja1R5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBDYXRlZ29y
eVR5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmd1bWVudEZ1bmN0aW9uID0gdm9pZCAoKiko
RXZlbnRDb250ZXh0KSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rpb25DaGVj
ayA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgIElzVmFsaWRUcmFj
ZUxhbWJkYTxBcmd1bWVudEZ1bmN0aW9uPigpPjo6dHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1l
IFRyYWNrVHlwZUNoZWNrID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAg
ICAgc3RkOjppc19jb252ZXJ0aWJsZTxUcmFja1R5cGUsIFRyYWNrPjo6dmFsdWU+Ojp0eXBlPgor
ICBzdGF0aWMgdm9pZCBUcmFjZUZvckNhdGVnb3J5KHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNfY2F0
ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXZlbnRf
bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpw
Ynplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBUcmFja1R5cGUmIHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEFyZ3VtZW50RnVuY3Rpb24gYXJnX2Z1bmN0aW9uKQorICAgICAgUEVSRkVUVE9fTk9fSU5M
SU5FIHsKKyAgICBUcmFjZUZvckNhdGVnb3J5SW1wbDxDYXRlZ29yeUluZGV4PigKKyAgICAgICAg
aW5zdGFuY2VzLCBkeW5hbWljX2NhdGVnb3J5LCBldmVudF9uYW1lLCB0eXBlLCB0cmFjaywKKyAg
ICAgICAgVHJhY2tFdmVudEludGVybmFsOjpHZXRUaW1lTnMoKSwgc3RkOjptb3ZlKGFyZ19mdW5j
dGlvbikpOworICB9CisKKyAgLy8gVHJhY2UgcG9pbnQgd2l0aCBhIHRyYWNrIGFuZCBvdmVycmlk
ZGVuIHRpbWVzdGFtcC4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4LAorICAgICAg
ICAgICAgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhY2tU
eXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlQ2hlY2sgPSB0eXBlbmFtZSBzdGQ6
OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFRyYWNrVHlw
ZSwgVHJhY2s+Ojp2YWx1ZT46OnR5cGU+CisgIHN0YXRpYyB2b2lkIFRyYWNlRm9yQ2F0ZWdvcnko
dWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IENhdGVnb3J5VHlwZSYgZHluYW1pY19jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBjaGFyKiBldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VHlwZSB0eXBlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrVHlwZSYgdHJhY2ssCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSBQRVJGRVRU
T19OT19JTkxJTkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlJbXBsPENhdGVnb3J5SW5kZXg+KGlu
c3RhbmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCB0cmFjaywgdGltZXN0YW1wKTsKKyAgfQorCisg
IC8vIFRyYWNlIHBvaW50IHdpdGggYSB0cmFjaywgYSBsYW1iZGEgZnVuY3Rpb24gYW5kIGFuIG92
ZXJyaWRkZW4gdGltZXN0YW1wLgorICAvLyB8dGltZXN0YW1wfCBtdXN0IGJlIGluIG5hbm9zZWNv
bmRzIGluIHRoZSB0cmFjZSBjbG9jayB0aW1lYmFzZS4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRl
Z29yeUluZGV4LAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlLAorICAgICAgICAgICAg
dHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJndW1lbnRGdW5j
dGlvbiA9IHZvaWQgKCopKEV2ZW50Q29udGV4dCksCisgICAgICAgICAgICB0eXBlbmFtZSBBcmd1
bWVudEZ1bmN0aW9uQ2hlY2sgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAg
ICAgICBJc1ZhbGlkVHJhY2VMYW1iZGE8QXJndW1lbnRGdW5jdGlvbj4oKT46OnR5cGU+CisgIHN0
YXRpYyB2b2lkIFRyYWNlRm9yQ2F0ZWdvcnkodWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhdGVnb3J5VHlwZSYgZHluYW1pY19jYXRlZ29y
eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBldmVudF9uYW1l
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBiemVy
bzo6VHJhY2tFdmVudDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFRyYWNrVHlwZSYgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dWludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3Vt
ZW50RnVuY3Rpb24gYXJnX2Z1bmN0aW9uKQorICAgICAgUEVSRkVUVE9fTk9fSU5MSU5FIHsKKyAg
ICBUcmFjZUZvckNhdGVnb3J5SW1wbDxDYXRlZ29yeUluZGV4PihpbnN0YW5jZXMsIGR5bmFtaWNf
Y2F0ZWdvcnksIGV2ZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdHlwZSwgdHJhY2ssIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGQ6Om1vdmUoYXJnX2Z1bmN0aW9uKSk7CisgIH0KKworICAvLyBUcmFj
ZSBwb2ludCB3aXRoIG9uZSBkZWJ1ZyBhbm5vdGF0aW9uLgorICAvLworICAvLyBUaGlzIHR5cGUg
b2YgdHJhY2UgcG9pbnQgaXMgaW1wbGVtZW50ZWQgd2l0aCBhbiBpbm5lciBoZWxwZXIgZnVuY3Rp
b24gd2hpY2gKKyAgLy8gZW5zdXJlcyB8YXJnX3ZhbHVlfCBpcyBvbmx5IHBhc3NlZCBieSByZWZl
cmVuY2Ugd2hlbiByZXF1aXJlZCAoaS5lLiwgd2l0aCBhCisgIC8vIGN1c3RvbSBEZWJ1Z0Fubm90
YXRpb24gdHlwZSkuIFRoaXMgYXZvaWRzIHRoZSBiaW5hcnkgYW5kIHJ1bnRpbWUgb3ZlcmhlYWQK
KyAgLy8gb2YgdW5uZWNlc3NhcmlseSBwYXNzaW5nIGFsbCB0eXBlcyBkZWJ1ZyBhbm5vdGF0aW9u
cyBieSByZWZlcmVuY2UuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrIHdl
bGwsIHRoZSBfb3V0ZXJfIGZ1bmN0aW9uICh0aGlzIGZ1bmN0aW9uKSBoYXMKKyAgLy8gdG8gYmUg
aW5saW5lZCBhdCB0aGUgY2FsbCBzaXRlIHdoaWxlIHRoZSBfaW5uZXJfIGZ1bmN0aW9uCisgIC8v
IChUcmFjZUZvckNhdGVnb3J5V2l0aERlYnVnQW5ub3RhdGlvbnMpIGlzIHN0aWxsIG91dGxpbmVk
IHRvIG1pbmltaXplCisgIC8vIG92ZXJhbGwgYmluYXJ5IHNpemUuCisgIHRlbXBsYXRlIDxzaXpl
X3QgQ2F0ZWdvcnlJbmRleCwgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLCB0eXBlbmFtZSBBcmdUeXBl
PgorICBzdGF0aWMgdm9pZCBUcmFjZUZvckNhdGVnb3J5KHVpbnQzMl90IGluc3RhbmNlcywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNf
Y2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXZl
bnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZXR0bzo6cHJvdG9z
OjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBjaGFyKiBhcmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBBcmdUeXBlJiYgYXJnX3ZhbHVlKSBQRVJGRVRUT19BTFdBWVNfSU5MSU5FIHsKKyAgICBU
cmFjZUZvckNhdGVnb3J5V2l0aERlYnVnQW5ub3RhdGlvbnM8Q2F0ZWdvcnlJbmRleCwgQ2F0ZWdv
cnlUeXBlLCBUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
QXJnVHlwZT4oCisgICAgICAgIGluc3RhbmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRfbmFt
ZSwgdHlwZSwgVHJhY2soKSwgYXJnX25hbWUsCisgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmdUeXBl
PihhcmdfdmFsdWUpKTsKKyAgfQorCisgIC8vIEEgb25lIGFyZ3VtZW50IHRyYWNlIHBvaW50IHdo
aWNoIHRha2VzIGFuIGV4cGxpY2l0IHRyYWNrLgorICB0ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5
SW5kZXgsCisgICAgICAgICAgICB0eXBlbmFtZSBDYXRlZ29yeVR5cGUsCisgICAgICAgICAgICB0
eXBlbmFtZSBUcmFja1R5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmdUeXBlPgorICBzdGF0
aWMgdm9pZCBUcmFjZUZvckNhdGVnb3J5KHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNfY2F0ZWdvcnks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86
OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBUcmFja1R5cGUmIHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IGNoYXIqIGFyZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5
cGUmJiBhcmdfdmFsdWUpIFBFUkZFVFRPX0FMV0FZU19JTkxJTkUgeworICAgIFBFUkZFVFRPX0RD
SEVDSyh0cmFjayk7CisgICAgVHJhY2VGb3JDYXRlZ29yeVdpdGhEZWJ1Z0Fubm90YXRpb25zPENh
dGVnb3J5SW5kZXgsIENhdGVnb3J5VHlwZSwgVHJhY2tUeXBlLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBBcmdUeXBlPigKKyAgICAgICAgaW5zdGFuY2VzLCBkeW5h
bWljX2NhdGVnb3J5LCBldmVudF9uYW1lLCB0eXBlLCB0cmFjaywgYXJnX25hbWUsCisgICAgICAg
IHN0ZDo6Zm9yd2FyZDxBcmdUeXBlPihhcmdfdmFsdWUpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxz
aXplX3QgQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAgIHR5cGVuYW1lIENhdGVnb3J5VHlwZSwK
KyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWNrVHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEFy
Z1R5cGU+CisgIHN0YXRpYyB2b2lkIFRyYWNlRm9yQ2F0ZWdvcnlXaXRoRGVidWdBbm5vdGF0aW9u
cygKKyAgICAgIHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAgIGNvbnN0IENhdGVnb3J5VHlwZSYg
ZHluYW1pY19jYXRlZ29yeSwKKyAgICAgIGNvbnN0IGNoYXIqIGV2ZW50X25hbWUsCisgICAgICBw
ZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSwKKyAgICAgIGNv
bnN0IFRyYWNrVHlwZSYgdHJhY2ssCisgICAgICBjb25zdCBjaGFyKiBhcmdfbmFtZSwKKyAgICAg
IHR5cGVuYW1lIGludGVybmFsOjpEZWJ1Z0Fubm90YXRpb25Bcmc8QXJnVHlwZT46OnR5cGUgYXJn
X3ZhbHVlKQorICAgICAgUEVSRkVUVE9fTk9fSU5MSU5FIHsKKyAgICBUcmFjZUZvckNhdGVnb3J5
SW1wbDxDYXRlZ29yeUluZGV4PigKKyAgICAgICAgaW5zdGFuY2VzLCBkeW5hbWljX2NhdGVnb3J5
LCBldmVudF9uYW1lLCB0eXBlLCB0cmFjaywKKyAgICAgICAgVHJhY2tFdmVudEludGVybmFsOjpH
ZXRUaW1lTnMoKSwgWyZdKEV2ZW50Q29udGV4dCBldmVudF9jdHgpIHsKKyAgICAgICAgICBUcmFj
a0V2ZW50SW50ZXJuYWw6OkFkZERlYnVnQW5ub3RhdGlvbigmZXZlbnRfY3R4LCBhcmdfbmFtZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfdmFs
dWUpOworICAgICAgICB9KTsKKyAgfQorCisgIC8vIFRyYWNlIHBvaW50IHdpdGggdHdvIGRlYnVn
IGFubm90YXRpb25zLiBOb3RlIHRoYXQgd2Ugb25seSBzdXBwb3J0IHVwIHRvIHR3bworICAvLyBk
aXJlY3QgZGVidWcgYW5ub3RhdGlvbnMuIEZvciBtb3JlIGNvbXBsaWNhdGVkIGFyZ3VtZW50cywg
eW91IHNob3VsZAorICAvLyBkZWZpbmUgeW91ciBvd24gYXJndW1lbnQgdHlwZSBpbiB0cmFja19l
dmVudC5wcm90byBhbmQgdXNlIGEgbGFtYmRhIHRvIGZpbGwKKyAgLy8gaXQgaW4geW91ciB0cmFj
ZSBwb2ludC4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4LAorICAgICAgICAgICAg
dHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJnVHlwZSwKKyAg
ICAgICAgICAgIHR5cGVuYW1lIEFyZ1R5cGUyPgorICBzdGF0aWMgdm9pZCBUcmFjZUZvckNhdGVn
b3J5KHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNfY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlw
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcmdfbmFtZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdUeXBlJiYgYXJnX3ZhbHVlLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ19uYW1lMiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdUeXBlMiYmIGFyZ192YWx1ZTIpIFBFUkZFVFRP
X0FMV0FZU19JTkxJTkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlXaXRoRGVidWdBbm5vdGF0aW9u
czxDYXRlZ29yeUluZGV4LCBDYXRlZ29yeVR5cGUsIFRyYWNrLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBBcmdUeXBlLCBBcmdUeXBlMj4oCisgICAgICAgIGluc3Rh
bmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRfbmFtZSwgdHlwZSwgVHJhY2soKSwgYXJnX25h
bWUsCisgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmdUeXBlPihhcmdfdmFsdWUpLCBhcmdfbmFtZTIs
CisgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmdUeXBlMj4oYXJnX3ZhbHVlMikpOworICB9CisKKyAg
Ly8gQSB0d28gYXJndW1lbnQgdHJhY2UgcG9pbnQgd2hpY2ggdGFrZXMgYW4gZXhwbGljaXQgdHJh
Y2suCisgIHRlbXBsYXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAgIHR5cGVu
YW1lIENhdGVnb3J5VHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWNrVHlwZSwKKyAgICAg
ICAgICAgIHR5cGVuYW1lIEFyZ1R5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmdUeXBlMj4K
KyAgc3RhdGljIHZvaWQgVHJhY2VGb3JDYXRlZ29yeSh1aW50MzJfdCBpbnN0YW5jZXMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2F0ZWdvcnlUeXBlJiBkeW5hbWljX2Nh
dGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV2ZW50
X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmV0dG86OnByb3Rvczo6
cGJ6ZXJvOjpUcmFja0V2ZW50OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgVHJhY2tUeXBlJiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBjaGFyKiBhcmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBBcmdUeXBlJiYgYXJnX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IGNoYXIqIGFyZ19uYW1lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdU
eXBlMiYmIGFyZ192YWx1ZTIpIFBFUkZFVFRPX0FMV0FZU19JTkxJTkUgeworICAgIFBFUkZFVFRP
X0RDSEVDSyh0cmFjayk7CisgICAgVHJhY2VGb3JDYXRlZ29yeVdpdGhEZWJ1Z0Fubm90YXRpb25z
PENhdGVnb3J5SW5kZXgsIENhdGVnb3J5VHlwZSwgVHJhY2tUeXBlLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdUeXBlLCBBcmdUeXBlMj4oCisgICAgICAgIGlu
c3RhbmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRfbmFtZSwgdHlwZSwgdHJhY2ssIGFyZ19u
YW1lLAorICAgICAgICBzdGQ6OmZvcndhcmQ8QXJnVHlwZT4oYXJnX3ZhbHVlKSwgYXJnX25hbWUy
LAorICAgICAgICBzdGQ6OmZvcndhcmQ8QXJnVHlwZTI+KGFyZ192YWx1ZTIpKTsKKyAgfQorCisg
IHRlbXBsYXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAgIHR5cGVuYW1lIENh
dGVnb3J5VHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWNrVHlwZSwKKyAgICAgICAgICAg
IHR5cGVuYW1lIEFyZ1R5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmdUeXBlMj4KKyAgc3Rh
dGljIHZvaWQgVHJhY2VGb3JDYXRlZ29yeVdpdGhEZWJ1Z0Fubm90YXRpb25zKAorICAgICAgdWlu
dDMyX3QgaW5zdGFuY2VzLAorICAgICAgY29uc3QgQ2F0ZWdvcnlUeXBlJiBkeW5hbWljX2NhdGVn
b3J5LAorICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwKKyAgICAgIHBlcmZldHRvOjpwcm90
b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VHlwZSB0eXBlLAorICAgICAgVHJhY2tUeXBlIHRyYWNr
LAorICAgICAgY29uc3QgY2hhciogYXJnX25hbWUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6
RGVidWdBbm5vdGF0aW9uQXJnPEFyZ1R5cGU+Ojp0eXBlIGFyZ192YWx1ZSwKKyAgICAgIGNvbnN0
IGNoYXIqIGFyZ19uYW1lMiwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWJ1Z0Fubm90YXRp
b25Bcmc8QXJnVHlwZTI+Ojp0eXBlIGFyZ192YWx1ZTIpCisgICAgICBQRVJGRVRUT19OT19JTkxJ
TkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlJbXBsPENhdGVnb3J5SW5kZXg+KAorICAgICAgICBp
bnN0YW5jZXMsIGR5bmFtaWNfY2F0ZWdvcnksIGV2ZW50X25hbWUsIHR5cGUsIHRyYWNrLAorICAg
ICAgICBUcmFja0V2ZW50SW50ZXJuYWw6OkdldFRpbWVOcygpLCBbJl0oRXZlbnRDb250ZXh0IGV2
ZW50X2N0eCkgeworICAgICAgICAgIFRyYWNrRXZlbnRJbnRlcm5hbDo6QWRkRGVidWdBbm5vdGF0
aW9uKCZldmVudF9jdHgsIGFyZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGFyZ192YWx1ZSk7CisgICAgICAgICAgVHJhY2tFdmVudEludGVy
bmFsOjpBZGREZWJ1Z0Fubm90YXRpb24oJmV2ZW50X2N0eCwgYXJnX25hbWUyLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ192YWx1ZTIpOworICAg
ICAgICB9KTsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgdGhlIHRyYWNrIGV2ZW50IGxpYnJhcnku
IFNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRyYWNpbmcgaXMKKyAgLy8gZW5hYmxlZC4KKyAgc3Rh
dGljIGJvb2wgUmVnaXN0ZXIoKSB7CisgICAgLy8gUmVnaXN0cmF0aW9uIGlzIHBlcmZvcm1lZCBv
dXQtb2YtbGluZSBzbyB1c2VycyBkb24ndCBuZWVkIHRvIGRlcGVuZCBvbgorICAgIC8vIERhdGFT
b3VyY2VEZXNjcmlwdG9yIEMrKyBiaW5kaW5ncy4KKyAgICByZXR1cm4gVHJhY2tFdmVudEludGVy
bmFsOjpJbml0aWFsaXplKAorICAgICAgICAqUmVnaXN0cnksCisgICAgICAgIFtdKGNvbnN0IERh
dGFTb3VyY2VEZXNjcmlwdG9yJiBkc2QpIHsgcmV0dXJuIEJhc2U6OlJlZ2lzdGVyKGRzZCk7IH0p
OworICB9CisKKyAgLy8gUmVjb3JkIG1ldGFkYXRhIGFib3V0IGRpZmZlcmVudCB0eXBlcyBvZiB0
aW1lbGluZSB0cmFja3MuIFNlZSBUcmFjay4KKyAgc3RhdGljIHZvaWQgU2V0VHJhY2tEZXNjcmlw
dG9yKGNvbnN0IFRyYWNrJiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IHByb3Rvczo6Z2VuOjpUcmFja0Rlc2NyaXB0b3ImIGRlc2MpIHsKKyAgICBQRVJGRVRU
T19EQ0hFQ0sodHJhY2sudXVpZCA9PSBkZXNjLnV1aWQoKSk7CisgICAgVHJhY2tSZWdpc3RyeTo6
R2V0KCktPlVwZGF0ZVRyYWNrKHRyYWNrLCBkZXNjLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICAg
IEJhc2U6OnRlbXBsYXRlIFRyYWNlKFsmXSh0eXBlbmFtZSBCYXNlOjpUcmFjZUNvbnRleHQgY3R4
KSB7CisgICAgICBUcmFja0V2ZW50SW50ZXJuYWw6OldyaXRlVHJhY2tEZXNjcmlwdG9yKAorICAg
ICAgICAgIHRyYWNrLCBjdHgudGxzX2luc3RfLT50cmFjZV93cml0ZXIuZ2V0KCkpOworICAgIH0p
OworICB9CisKKyAgLy8gREVQUkVDQVRFRC4gT25seSBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0
aWJpbGl0eS4KKyAgc3RhdGljIHZvaWQgU2V0VHJhY2tEZXNjcmlwdG9yKAorICAgICAgY29uc3Qg
VHJhY2smIHRyYWNrLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHByb3Rvczo6cGJ6ZXJvOjpU
cmFja0Rlc2NyaXB0b3IqKT4gY2FsbGJhY2spIHsKKyAgICBTZXRUcmFja0Rlc2NyaXB0b3JJbXBs
KHRyYWNrLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgfQorCisgIC8vIERFUFJFQ0FURUQuIE9u
bHkga2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgIHN0YXRpYyB2b2lkIFNldFBy
b2Nlc3NEZXNjcmlwdG9yKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHByb3Rvczo6cGJ6ZXJv
OjpUcmFja0Rlc2NyaXB0b3IqKT4gY2FsbGJhY2ssCisgICAgICBjb25zdCBQcm9jZXNzVHJhY2sm
IHRyYWNrID0gUHJvY2Vzc1RyYWNrOjpDdXJyZW50KCkpIHsKKyAgICBTZXRUcmFja0Rlc2NyaXB0
b3JJbXBsKHN0ZDo6bW92ZSh0cmFjayksIHN0ZDo6bW92ZShjYWxsYmFjaykpOworICB9CisKKyAg
Ly8gREVQUkVDQVRFRC4gT25seSBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAg
c3RhdGljIHZvaWQgU2V0VGhyZWFkRGVzY3JpcHRvcigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9p
ZChwcm90b3M6OnBiemVybzo6VHJhY2tEZXNjcmlwdG9yKik+IGNhbGxiYWNrLAorICAgICAgY29u
c3QgVGhyZWFkVHJhY2smIHRyYWNrID0gVGhyZWFkVHJhY2s6OkN1cnJlbnQoKSkgeworICAgIFNl
dFRyYWNrRGVzY3JpcHRvckltcGwoc3RkOjptb3ZlKHRyYWNrKSwgc3RkOjptb3ZlKGNhbGxiYWNr
KSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBFcmFzZVRyYWNrRGVzY3JpcHRvcihjb25zdCBUcmFj
ayYgdHJhY2spIHsKKyAgICBUcmFja1JlZ2lzdHJ5OjpHZXQoKS0+RXJhc2VUcmFjayh0cmFjayk7
CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRyYWNlIHRpbWVzdGFtcCBpbiBuYW5v
c2Vjb25kcy4gTm90ZSB0aGUgcmV0dXJuZWQKKyAgLy8gdGltZWJhc2UgbWF5IHZhcnkgZGVwZW5k
aW5nIG9uIHRoZSBwbGF0Zm9ybSwgYnV0IHdpbGwgYWx3YXlzIG1hdGNoIHRoZQorICAvLyB0aW1l
c3RhbXBzIHJlY29yZGVkIGJ5IHRyYWNrIGV2ZW50cyAoc2VlIEdldFRyYWNlQ2xvY2tJZCkuCisg
IHN0YXRpYyB1aW50NjRfdCBHZXRUcmFjZVRpbWVOcygpIHsgcmV0dXJuIFRyYWNrRXZlbnRJbnRl
cm5hbDo6R2V0VGltZU5zKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSB0eXBlIG9mIGNsb2NrIHVz
ZWQgYnkgR2V0VHJhY2VUaW1lTnMoKS4KKyAgc3RhdGljIGNvbnN0ZXhwciBwcm90b3M6OnBiemVy
bzo6QnVpbHRpbkNsb2NrIEdldFRyYWNlQ2xvY2tJZCgpIHsKKyAgICByZXR1cm4gVHJhY2tFdmVu
dEludGVybmFsOjpHZXRDbG9ja0lkKCk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEVhY2ggY2F0
ZWdvcnkgaGFzIGl0cyBvd24gZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZSwgc3RvcmVkIGluIHRoZSBj
YXRlZ29yeQorICAvLyByZWdpc3RyeS4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4
PgorICBzdHJ1Y3QgQ2F0ZWdvcnlUcmFjZVBvaW50VHJhaXRzIHsKKyAgICBzdGF0aWMgY29uc3Rl
eHByIHN0ZDo6YXRvbWljPHVpbnQ4X3Q+KiBHZXRBY3RpdmVJbnN0YW5jZXMoKSB7CisgICAgICBz
dGF0aWNfYXNzZXJ0KAorICAgICAgICAgIENhdGVnb3J5SW5kZXggIT0gVHJhY2tFdmVudENhdGVn
b3J5UmVnaXN0cnk6OmtJbnZhbGlkQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAiSW52YWxpZCBj
YXRlZ29yeSBpbmRleCIpOworICAgICAgcmV0dXJuIFJlZ2lzdHJ5LT5HZXRDYXRlZ29yeVN0YXRl
KENhdGVnb3J5SW5kZXgpOworICAgIH0KKyAgfTsKKworICAvLyBUT0RPKHNreW9zdGlsKTogTWFr
ZSB8Q2F0ZWdvcnlJbmRleHwgYSByZWd1bGFyIHBhcmFtZXRlciB0byByZXVzZSB0cmFjZQorICAv
LyBwb2ludCBjb2RlIGFjcm9zcyBkaWZmZXJlbnQgY2F0ZWdvcmllcy4KKyAgdGVtcGxhdGUgPHNp
emVfdCBDYXRlZ29yeUluZGV4LAorICAgICAgICAgICAgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAor
ICAgICAgICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlID0gVHJhY2ssCisgICAgICAgICAgICB0eXBl
bmFtZSBBcmd1bWVudEZ1bmN0aW9uID0gdm9pZCAoKikoRXZlbnRDb250ZXh0KSwKKyAgICAgICAg
ICAgIHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rpb25DaGVjayA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxl
X2lmPAorICAgICAgICAgICAgICAgIElzVmFsaWRUcmFjZUxhbWJkYTxBcmd1bWVudEZ1bmN0aW9u
PigpPjo6dHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWNrVHlwZUNoZWNrID0gdHlwZW5h
bWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxU
cmFja1R5cGUsIFRyYWNrPjo6dmFsdWU+Ojp0eXBlPgorICBzdGF0aWMgdm9pZCBUcmFjZUZvckNh
dGVnb3J5SW1wbCgKKyAgICAgIHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAgIGNvbnN0IENhdGVn
b3J5VHlwZSYgZHluYW1pY19jYXRlZ29yeSwKKyAgICAgIGNvbnN0IGNoYXIqIGV2ZW50X25hbWUs
CisgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSwK
KyAgICAgIGNvbnN0IFRyYWNrVHlwZSYgdHJhY2sgPSBUcmFjaygpLAorICAgICAgdWludDY0X3Qg
dGltZXN0YW1wID0gVHJhY2tFdmVudEludGVybmFsOjpHZXRUaW1lTnMoKSwKKyAgICAgIEFyZ3Vt
ZW50RnVuY3Rpb24gYXJnX2Z1bmN0aW9uID0gW10oRXZlbnRDb250ZXh0KSB7CisgICAgICB9KSBQ
RVJGRVRUT19BTFdBWVNfSU5MSU5FIHsKKyAgICBUcmFjZVdpdGhJbnN0YW5jZXM8Q2F0ZWdvcnlJ
bmRleD4oCisgICAgICAgIGluc3RhbmNlcywgWyZdKHR5cGVuYW1lIEJhc2U6OlRyYWNlQ29udGV4
dCBjdHgpIHsKKyAgICAgICAgICAvLyBJZiB0aGlzIGNhdGVnb3J5IGlzIGR5bmFtaWMsIGZpcnN0
IGNoZWNrIHdoZXRoZXIgaXQncyBlbmFibGVkLgorICAgICAgICAgIGNvbnN0ZXhwciBib29sIGtJ
c0R5bmFtaWMgPQorICAgICAgICAgICAgICBDYXRlZ29yeUluZGV4ID09CisgICAgICAgICAgICAg
IFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5OjprRHluYW1pY0NhdGVnb3J5SW5kZXg7CisgICAg
ICAgICAgaWYgKGtJc0R5bmFtaWMgJiYgIUlzRHluYW1pY0NhdGVnb3J5RW5hYmxlZCgKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eCwgRHluYW1pY0NhdGVnb3J5e2R5bmFtaWNf
Y2F0ZWdvcnl9KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAg
ICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8oc2t5b3N0aWwpOiBJbnRlcm4gY2F0ZWdvcmllcyBh
dCBjb21waWxlIHRpbWUuCisgICAgICAgICAgICBjb25zdCBDYXRlZ29yeSogc3RhdGljX2NhdGVn
b3J5ID0KKyAgICAgICAgICAgICAgICBrSXNEeW5hbWljID8gbnVsbHB0ciA6IFJlZ2lzdHJ5LT5H
ZXRDYXRlZ29yeShDYXRlZ29yeUluZGV4KTsKKyAgICAgICAgICAgIGF1dG8gZXZlbnRfY3R4ID0g
VHJhY2tFdmVudEludGVybmFsOjpXcml0ZUV2ZW50KAorICAgICAgICAgICAgICAgIGN0eC50bHNf
aW5zdF8tPnRyYWNlX3dyaXRlci5nZXQoKSwgY3R4LkdldEluY3JlbWVudGFsU3RhdGUoKSwKKyAg
ICAgICAgICAgICAgICBzdGF0aWNfY2F0ZWdvcnksIGV2ZW50X25hbWUsIHR5cGUsIHRpbWVzdGFt
cCk7CisgICAgICAgICAgICBpZiAoa0lzRHluYW1pYykgeworICAgICAgICAgICAgICBDYXRlZ29y
eSBjYXRlZ29yeXsKKyAgICAgICAgICAgICAgICAgIENhdGVnb3J5OjpGcm9tRHluYW1pY0NhdGVn
b3J5KGR5bmFtaWNfY2F0ZWdvcnkpfTsKKyAgICAgICAgICAgICAgY2F0ZWdvcnkuRm9yRWFjaEdy
b3VwTWVtYmVyKAorICAgICAgICAgICAgICAgICAgWyZdKGNvbnN0IGNoYXIqIG1lbWJlcl9uYW1l
LCBzaXplX3QgbmFtZV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50X2N0eC5ldmVu
dCgpLT5hZGRfY2F0ZWdvcmllcyhtZW1iZXJfbmFtZSwgbmFtZV9zaXplKTsKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGlmICh0cmFjaykKKyAgICAgICAgICAgICAgZXZlbnRfY3R4LmV2ZW50
KCktPnNldF90cmFja191dWlkKHRyYWNrLnV1aWQpOworICAgICAgICAgICAgYXJnX2Z1bmN0aW9u
KHN0ZDo6bW92ZShldmVudF9jdHgpKTsKKyAgICAgICAgICB9ICAvLyBldmVudF9jdHgKKworICAg
ICAgICAgIGlmICh0cmFjaykgeworICAgICAgICAgICAgVHJhY2tFdmVudEludGVybmFsOjpXcml0
ZVRyYWNrRGVzY3JpcHRvcklmTmVlZGVkKAorICAgICAgICAgICAgICAgIHRyYWNrLCBjdHgudGxz
X2luc3RfLT50cmFjZV93cml0ZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgY3R4LkdldEluY3Jl
bWVudGFsU3RhdGUoKSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgfQorCisgIHRlbXBs
YXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRleCwgdHlwZW5hbWUgTGFtYmRhPgorICBzdGF0aWMgdm9p
ZCBUcmFjZVdpdGhJbnN0YW5jZXModWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgTGFtYmRhIGxhbWJkYSkgUEVSRkVUVE9fQUxXQVlTX0lOTElORSB7
CisgICAgaWYgKENhdGVnb3J5SW5kZXggPT0gVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0cnk6OmtE
eW5hbWljQ2F0ZWdvcnlJbmRleCkgeworICAgICAgQmFzZTo6dGVtcGxhdGUgVHJhY2VXaXRoSW5z
dGFuY2VzKGluc3RhbmNlcywgc3RkOjptb3ZlKGxhbWJkYSkpOworICAgIH0gZWxzZSB7CisgICAg
ICBCYXNlOjp0ZW1wbGF0ZSBUcmFjZVdpdGhJbnN0YW5jZXM8CisgICAgICAgICAgQ2F0ZWdvcnlU
cmFjZVBvaW50VHJhaXRzPENhdGVnb3J5SW5kZXg+PihpbnN0YW5jZXMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUobGFtYmRhKSk7
CisgICAgfQorICB9CisKKyAgLy8gUmVjb3JkcyBhIHRyYWNrIGRlc2NyaXB0b3IgaW50byB0aGUg
dHJhY2sgZGVzY3JpcHRvciByZWdpc3RyeSBhbmQsIGlmIHdlCisgIC8vIGFyZSB0cmFjaW5nLCBh
bHNvIG1pcnJvcnMgdGhlIGRlc2NyaXB0b3IgaW50byB0aGUgdHJhY2UuCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUcmFja1R5cGU+CisgIHN0YXRpYyB2b2lkIFNldFRyYWNrRGVzY3JpcHRvckltcGwo
CisgICAgICBjb25zdCBUcmFja1R5cGUmIHRyYWNrLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lk
KHByb3Rvczo6cGJ6ZXJvOjpUcmFja0Rlc2NyaXB0b3IqKT4gY2FsbGJhY2spIHsKKyAgICBUcmFj
a1JlZ2lzdHJ5OjpHZXQoKS0+VXBkYXRlVHJhY2sodHJhY2ssIHN0ZDo6bW92ZShjYWxsYmFjaykp
OworICAgIEJhc2U6OnRlbXBsYXRlIFRyYWNlKFsmXSh0eXBlbmFtZSBCYXNlOjpUcmFjZUNvbnRl
eHQgY3R4KSB7CisgICAgICBUcmFja0V2ZW50SW50ZXJuYWw6OldyaXRlVHJhY2tEZXNjcmlwdG9y
KAorICAgICAgICAgIHRyYWNrLCBjdHgudGxzX2luc3RfLT50cmFjZV93cml0ZXIuZ2V0KCkpOwor
ICAgIH0pOworICB9CisKKyAgLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZHluYW1pYyBjYXRl
Z29yeSBpcyBlbmFibGVkLCBmaXJzdCBieSBjaGVja2luZyB0aGUKKyAgLy8gcGVyLXRyYWNlIHdy
aXRlciBjYWNoZSBvciBieSBmYWxsaW5nIGJhY2sgdG8gY29tcHV0aW5nIGl0IGJhc2VkIG9uIHRo
ZQorICAvLyB0cmFjZSBjb25maWcgZm9yIHRoZSBnaXZlbiBzZXNzaW9uLgorICBzdGF0aWMgYm9v
bCBJc0R5bmFtaWNDYXRlZ29yeUVuYWJsZWQoCisgICAgICB0eXBlbmFtZSBCYXNlOjpUcmFjZUNv
bnRleHQqIGN0eCwKKyAgICAgIGNvbnN0IER5bmFtaWNDYXRlZ29yeSYgZHluYW1pY19jYXRlZ29y
eSkgeworICAgIGF1dG8gaW5jcl9zdGF0ZSA9IGN0eC0+R2V0SW5jcmVtZW50YWxTdGF0ZSgpOwor
ICAgIGF1dG8gaXQgPSBpbmNyX3N0YXRlLT5keW5hbWljX2NhdGVnb3JpZXMuZmluZChkeW5hbWlj
X2NhdGVnb3J5Lm5hbWUpOworICAgIGlmIChpdCA9PSBpbmNyX3N0YXRlLT5keW5hbWljX2NhdGVn
b3JpZXMuZW5kKCkpIHsKKyAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiB0aGlzIGNhdGVnb3J5IGJl
Zm9yZS4gTGV0J3MgZmlndXJlIG91dCBpZiBpdCdzIGVuYWJsZWQuCisgICAgICAvLyBUaGlzIHJl
cXVpcmVzIGdyYWJiaW5nIGEgbG9jayB0byByZWFkIHRoZSBzZXNzaW9uJ3MgdHJhY2UgY29uZmln
LgorICAgICAgYXV0byBkcyA9IGN0eC0+R2V0RGF0YVNvdXJjZUxvY2tlZCgpOworICAgICAgQ2F0
ZWdvcnkgY2F0ZWdvcnl7Q2F0ZWdvcnk6OkZyb21EeW5hbWljQ2F0ZWdvcnkoZHluYW1pY19jYXRl
Z29yeSl9OworICAgICAgYm9vbCBlbmFibGVkID0gVHJhY2tFdmVudEludGVybmFsOjpJc0NhdGVn
b3J5RW5hYmxlZCgKKyAgICAgICAgICAqUmVnaXN0cnksIGRzLT5jb25maWdfLCBjYXRlZ29yeSk7
CisgICAgICAvLyBUT0RPKHNreW9zdGlsKTogQ2FwIHRoZSBzaXplIG9mIHxkeW5hbWljX2NhdGVn
b3JpZXN8LgorICAgICAgaW5jcl9zdGF0ZS0+ZHluYW1pY19jYXRlZ29yaWVzW2R5bmFtaWNfY2F0
ZWdvcnkubmFtZV0gPSBlbmFibGVkOworICAgICAgcmV0dXJuIGVuYWJsZWQ7CisgICAgfQorICAg
IHJldHVybiBpdC0+c2Vjb25kOworICB9CisKKyAgLy8gQ29uZmlnIGZvciB0aGUgY3VycmVudCB0
cmFjaW5nIHNlc3Npb24uCisgIHByb3Rvczo6Z2VuOjpUcmFja0V2ZW50Q29uZmlnIGNvbmZpZ187
Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0
bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9UUkFDS19F
VkVOVF9EQVRBX1NPVVJDRV9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5j
bHVkZS9wZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNrX2V2ZW50X21hY3Jvcy5oCisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAq
CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg
IkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs
aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg
TGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJ
Q0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFn
cmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp
Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FS
UkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBs
aWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu
aW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisg
Ki8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfVFJBQ0tfRVZF
TlRfTUFDUk9TX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9U
UkFDS19FVkVOVF9NQUNST1NfSF8KKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHVuZGVybHlpbmcg
bWFjcm9zIGZvciB0aGUgdHJhY2UgcG9pbnQgdHJhY2sgZXZlbnQKKy8vIGltcGxlbWVudGF0aW9u
LiBQZXJmZXR0byBBUEkgdXNlcnMgdHlwaWNhbGx5IGRvbid0IG5lZWQgdG8gdXNlIGFueXRoaW5n
IGhlcmUKKy8vIGRpcmVjdGx5LgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9iYXNlL2NvbXBpbGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNrX2V2ZW50X2RhdGFf
c291cmNlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by90cmFjaW5nL3RyYWNrX2V2ZW50X2NhdGVnb3J5X3JlZ2lzdHJ5LmgiCisKKy8vIElnbm9yZSBH
Q0Mgd2FybmluZyBhYm91dCBhIG1pc3NpbmcgYXJndW1lbnQgZm9yIGEgdmFyaWFkaWMgbWFjcm8g
cGFyYW1ldGVyLgorI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisvLyBEZWZpbmVzIGRhdGEg
c3RydWN0dXJlcyBmb3IgYmFja2luZyBhIGNhdGVnb3J5IHJlZ2lzdHJ5LgorLy8KKy8vIEVhY2gg
Y2F0ZWdvcnkgaGFzIG9uZSBlbmFibGVkL2Rpc2FibGVkIGJpdCBwZXIgcG9zc2libGUgZGF0YSBz
b3VyY2UgaW5zdGFuY2UuCisvLyBUaGUgYml0cyBhcmUgcGFja2VkLCBpLmUuLCBlYWNoIGJ5dGUg
aG9sZHMgdGhlIHN0YXRlIGZvciBpbnN0YW5jZXMuIFRvCisvLyBpbXByb3ZlIGNhY2hlIGxvY2Fs
aXR5LCB0aGUgYml0cyBmb3IgZWFjaCBpbnN0YW5jZSBhcmUgc3RvcmVkIHNlcGFyYXRlbHkgZnJv
bQorLy8gdGhlIG5hbWVzIG9mIHRoZSBjYXRlZ29yaWVzOgorLy8KKy8vICAgYnl0ZSAwICAgICAg
ICAgICAgICAgICAgICAgIGJ5dGUgMQorLy8gICAoaW5zdDAsIGluc3QxLCAuLi4sIGluc3Q3KSwg
KGluc3QwLCBpbnN0MSwgLi4uLCBpbnN0NykKKy8vCisjZGVmaW5lIFBFUkZFVFRPX0lOVEVSTkFM
X0RFQ0xBUkVfQ0FURUdPUklFUyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
IG5hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0ZXhwciA6OnBlcmZldHRvOjpDYXRlZ29yeSBr
Q2F0ZWdvcmllc1tdID0ge19fVkFfQVJHU19ffTsgICAgICAgICAgICAgICBcCisgIGNvbnN0ZXhw
ciBzaXplX3Qga0NhdGVnb3J5Q291bnQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgICBzaXplb2Yoa0NhdGVnb3JpZXMpIC8gc2l6ZW9mKGtDYXRlZ29y
aWVzWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIFRoZSBwZXItaW5zdGFu
Y2UgZW5hYmxlL2Rpc2FibGUgc3RhdGUgcGVyIGNhdGVnb3J5ICovICAgICAgICAgICAgICAgICAg
ICBcCisgIGV4dGVybiBzdGQ6OmF0b21pYzx1aW50OF90PiBnX2NhdGVnb3J5X3N0YXRlX3N0b3Jh
Z2Vba0NhdGVnb3J5Q291bnRdOyAgICAgICBcCisgIC8qIFRoZSBjYXRlZ29yeSByZWdpc3RyeSB3
aGljaCBtZWRpYXRlcyBhY2Nlc3MgdG8gdGhlIGFib3ZlIHN0cnVjdHVyZXMuICovICBcCisgIC8q
IFRoZSByZWdpc3RyeSBpcyB1c2VkIGZvciB0d28gcHVycG9zZXM6ICovICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgIC8qKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qICAgIDEpIEZv
ciBsb29raW5nIHVwIGNhdGVnb3JpZXMgYXQgYnVpbGQgKGNvbnN0ZXhwcikgdGltZS4gKi8gICAg
ICAgICAgICBcCisgIC8qICAgIDIpIEZvciBkZWNsYXJpbmcgdGhlIHBlci1uYW1lc3BhY2UgVHJh
Y2tFdmVudCBkYXRhIHNvdXJjZS4gKi8gICAgICAgICBcCisgIC8qKi8gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgIC8qIEJlY2F1c2UgdXNhZ2UgIzEgcmVxdWlyZXMgYSBjb25zdGV4cHIgdHlwZSBhbmQgdXNh
Z2UgIzIgcmVxdWlyZXMgYW4gKi8gICBcCisgIC8qIGV4dGVybiB0eXBlICh0byBhdm9pZCBkZWNs
YXJpbmcgYSB0eXBlIGJhc2VkIG9uIGEgdHJhbnNsYXRpb24tdW5pdCAqLyAgICBcCisgIC8qIHZh
cmlhYmxlKSwgd2UgbmVlZCB0d28gc2VwYXJhdGUgY29waWVzIG9mIHRoZSByZWdpc3RyeSB3aXRo
IGRpZmZlcmVudCAqLyBcCisgIC8qIHN0b3JhZ2Ugc3BlY2lmaWVycy4gKi8gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qKi8gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgIC8qIFRPRE8oc2t5b3N0aWwpOiBVbmlmeSB0aGVzZSB1c2luZyBhIEMrKzE3IGlu
bGluZSBjb25zdGV4cHIgdmFyaWFibGUuICovICBcCisgIGNvbnN0ZXhwciA6OnBlcmZldHRvOjpp
bnRlcm5hbDo6VHJhY2tFdmVudENhdGVnb3J5UmVnaXN0cnkgICAgICAgICAgICAgICAgICBcCisg
ICAgICBrQ29uc3RFeHByQ2F0ZWdvcnlSZWdpc3RyeShrQ2F0ZWdvcnlDb3VudCwgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm
a0NhdGVnb3JpZXNbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAmZ19jYXRlZ29yeV9zdGF0ZV9zdG9yYWdlWzBdKTsgICAg
ICAgICAgICAgICBcCisgIFBFUkZFVFRPX0NPTVBPTkVOVF9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6
cGVyZmV0dG86OmludGVybmFsOjogICAgICAgICAgICAgICBcCisgICAgICBUcmFja0V2ZW50Q2F0
ZWdvcnlSZWdpc3RyeSBrQ2F0ZWdvcnlSZWdpc3RyeTsgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgIHN0YXRpY19hc3NlcnQoa0NvbnN0RXhwckNhdGVnb3J5UmVnaXN0cnkuVmFsaWRhdGVD
YXRlZ29yaWVzKCksICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIkludmFsaWQgY2F0
ZWdvcnkgbmFtZXMgZm91bmQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0g
IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJbiBhIC5jYyBmaWxlLCBkZWNsYXJlcyBzdG9y
YWdlIGZvciBlYWNoIGNhdGVnb3J5J3MgcnVudGltZSBzdGF0ZS4KKyNkZWZpbmUgUEVSRkVUVE9f
SU5URVJOQUxfQ0FURUdPUllfU1RPUkFHRSgpICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1l
c3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgIHN0ZDo6YXRvbWljPHVpbnQ4X3Q+IGdfY2F0ZWdvcnlfc3RhdGVfc3RvcmFnZVtrQ2F0
ZWdvcnlDb3VudF07IFwKKyAgUEVSRkVUVE9fQ09NUE9ORU5UX0VYUE9SVCBjb25zdGV4cHIgOjpw
ZXJmZXR0bzo6aW50ZXJuYWw6OiAgICAgXAorICAgICAgVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0
cnkga0NhdGVnb3J5UmVnaXN0cnkoICAgICAgICAgICAgICBcCisgICAgICAgICAga0NhdGVnb3J5
Q291bnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg
ICAma0NhdGVnb3JpZXNbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICAgICAgICAgICZnX2NhdGVnb3J5X3N0YXRlX3N0b3JhZ2VbMF0pOyAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBEZWZpbmVzIHRo
ZSBUcmFja0V2ZW50IGRhdGEgc291cmNlIGZvciB0aGUgY3VycmVudCB0cmFjayBldmVudCBuYW1l
c3BhY2UuCisjZGVmaW5lIFBFUkZFVFRPX0lOVEVSTkFMX0RFQ0xBUkVfVFJBQ0tfRVZFTlRfREFU
QV9TT1VSQ0UoKSBcCisgIHN0cnVjdCBQRVJGRVRUT19DT01QT05FTlRfRVhQT1JUIFRyYWNrRXZl
bnQgICAgICAgICAgICAgICBcCisgICAgICA6IHB1YmxpYyA6OnBlcmZldHRvOjppbnRlcm5hbDo6
VHJhY2tFdmVudERhdGFTb3VyY2U8ICBcCisgICAgICAgICAgICBUcmFja0V2ZW50LCAmaW50ZXJu
YWw6OmtDYXRlZ29yeVJlZ2lzdHJ5PiB7fQorCisvLyBBdCBjb21waWxlIHRpbWUsIHR1cm5zIGEg
Y2F0ZWdvcnkgbmFtZSByZXByZXNlbnRlZCBieSBhIHN0YXRpYyBzdHJpbmcgaW50byBhbgorLy8g
aW5kZXggaW50byB0aGUgY3VycmVudCBjYXRlZ29yeSByZWdpc3RyeS4gQSBidWlsZCBlcnJvciB3
aWxsIGJlIGdlbmVyYXRlZCBpZgorLy8gdGhlIGNhdGVnb3J5IGhhc24ndCBiZWVuIHJlZ2lzdGVy
ZWQgb3IgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYWxsb3dlZCBkeW5hbWljCisvLyBjYXRlZ29yaWVz
LiBTZWUgUEVSRkVUVE9fREVGSU5FX0NBVEVHT1JJRVMuCisjZGVmaW5lIFBFUkZFVFRPX0dFVF9D
QVRFR09SWV9JTkRFWChjYXRlZ29yeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICA6OlBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVTUEFDRTo6aW50ZXJuYWw6OmtDb25zdEV4
cHJDYXRlZ29yeVJlZ2lzdHJ5LkZpbmQoIFwKKyAgICAgIGNhdGVnb3J5LCAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
ICA6OlBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVTUEFDRTo6aW50ZXJuYWw6OklzRHluYW1pY0Nh
dGVnb3J5KGNhdGVnb3J5KSkKKworLy8gR2VuZXJhdGUgYSB1bmlxdWUgdmFyaWFibGUgbmFtZSB3
aXRoIGEgZ2l2ZW4gcHJlZml4LgorI2RlZmluZSBQRVJGRVRUT19JTlRFUk5BTF9DT05DQVQyKGEs
IGIpIGEjI2IKKyNkZWZpbmUgUEVSRkVUVE9fSU5URVJOQUxfQ09OQ0FUKGEsIGIpIFBFUkZFVFRP
X0lOVEVSTkFMX0NPTkNBVDIoYSwgYikKKyNkZWZpbmUgUEVSRkVUVE9fVUlEKHByZWZpeCkgUEVS
RkVUVE9fSU5URVJOQUxfQ09OQ0FUKHByZWZpeCwgX19MSU5FX18pCisKKy8vIEVmZmljaWVudGx5
IGRldGVybWluZXMgd2hldGhlciB0cmFjaW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBjYXRl
Z29yeSwgYW5kCisvLyBpZiBzbywgZW1pdHMgb25lIHRyYWNlIGV2ZW50IHdpdGggdGhlIGdpdmVu
IGFyZ3VtZW50cy4KKyNkZWZpbmUgUEVSRkVUVE9fSU5URVJOQUxfVFJBQ0tfRVZFTlQoY2F0ZWdv
cnksIC4uLikgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
bmFtZXNwYWNlIHRucyA9IDo6UEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFOyAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAvKiBDb21wdXRlIHRoZSBjYXRlZ29yeSBpbmRleCBvdXRzaWRl
IHRoZSBsYW1iZGEgdG8gd29yayBhcm91bmQgYSAqLyAgXAorICAgIC8qIEdDQyA3IGJ1ZyAqLyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgY29uc3RleHByIGF1dG8gUEVSRkVUVE9fVUlEKGtDYXRJbmRleCkgPSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUEVSRkVUVE9fR0VUX0NBVEVHT1JZX0lOREVYKGNh
dGVnb3J5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh0bnM6OmludGVy
bmFsOjpJc0R5bmFtaWNDYXRlZ29yeShjYXRlZ29yeSkpIHsgICAgICAgICAgICAgICAgICAgICBc
CisgICAgICB0bnM6OlRyYWNrRXZlbnQ6OkNhbGxJZkVuYWJsZWQoWyZdKHVpbnQzMl90IGluc3Rh
bmNlcykgeyAgICAgICAgICAgIFwKKyAgICAgICAgdG5zOjpUcmFja0V2ZW50OjpUcmFjZUZvckNh
dGVnb3J5PFBFUkZFVFRPX1VJRChrQ2F0SW5kZXgpPiggICAgICAgXAorICAgICAgICAgICAgaW5z
dGFuY2VzLCBjYXRlZ29yeSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG5zOjpU
cmFja0V2ZW50OjpDYWxsSWZDYXRlZ29yeUVuYWJsZWQ8UEVSRkVUVE9fVUlEKGtDYXRJbmRleCk+
KCAgICBcCisgICAgICAgICAgWyZdKHVpbnQzMl90IGluc3RhbmNlcykgeyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIFRPRE8oc2t5b3N0aWwp
OiBHZXQgcmlkIG9mIHRoZSBjYXRlZ29yeSBuYW1lIHBhcmFtZXRlci4gKi8gXAorICAgICAgICAg
ICAgdG5zOjpUcmFja0V2ZW50OjpUcmFjZUZvckNhdGVnb3J5PFBFUkZFVFRPX1VJRChrQ2F0SW5k
ZXgpPiggICBcCisgICAgICAgICAgICAgICAgaW5zdGFuY2VzLCBudWxscHRyLCAjI19fVkFfQVJH
U19fKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9KTsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlKQorCisjZGVmaW5lIFBFUkZFVFRPX0lOVEVS
TkFMX1NDT1BFRF9UUkFDS19FVkVOVChjYXRlZ29yeSwgbmFtZSwgLi4uKSAgICAgICAgICAgICBc
CisgIHN0cnVjdCBQRVJGRVRUT19VSUQoU2NvcGVkRXZlbnQpIHsgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IEV2ZW50RmluYWxpemVyIHsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAv
KiBUaGUgcGFyYW1ldGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gSXQgYWxsb3dzIHRo
ZSAgICAgICAgICAqLyBcCisgICAgICAvKiBhbm9ueW1vdXMgc3RydWN0IHRvIHVzZSBhZ2dyZWdh
dGUgaW5pdGlhbGl6YXRpb24gdG8gaW52b2tlIHRoZSAgICAqLyBcCisgICAgICAvKiBsYW1iZGEg
KHdoaWNoIGVtaXRzIHRoZSBCRUdJTiBldmVudCBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyKSAgICAg
ICAqLyBcCisgICAgICAvKiB3aXRoIHRoZSBwcm9wZXIgcmVmZXJlbmNlIGNhcHR1cmUgZm9yIGFu
eSAgICAgICAgICAgICAgICAgICAgICAgICAqLyBcCisgICAgICAvKiBUcmFja0V2ZW50QXJndW1l
bnRGdW5jdGlvbiBpbiB8X19WQV9BUkdTX198LiBUaGlzIGlzIHJlcXVpcmVkIHNvICAqLyBcCisg
ICAgICAvKiB0aGF0IHRoZSBzY29wZWQgZXZlbnQgaXMgZXhhY3RseSBPTkUgbGluZSBhbmQgY2Fu
J3QgZXNjYXBlIHRoZSAgICAqLyBcCisgICAgICAvKiBzY29wZSBpZiB1c2VkIGluIGEgc2luZ2xl
IGxpbmUgaWYgc3RhdGVtZW50LiAgICAgICAgICAgICAgICAgICAgICAqLyBcCisgICAgICBFdmVu
dEZpbmFsaXplciguLi4pIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgICB+RXZlbnRGaW5hbGl6ZXIoKSB7IFRSQUNFX0VWRU5UX0VORChj
YXRlZ29yeSk7IH0gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBmaW5hbGl6ZXI7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgIH0gUEVSRkVUVE9fVUlEKHNjb3BlZF9ldmVudCkgeyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWyZdKCkgeyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
ICBUUkFDRV9FVkVOVF9CRUdJTihjYXRlZ29yeSwgbmFtZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSgpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgIH0KKworI2RlZmluZSBQRVJGRVRUT19JTlRFUk5BTF9DQVRFR09SWV9FTkFC
TEVEKGNhdGVnb3J5KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICg6OlBFUkZFVFRPX1RS
QUNLX0VWRU5UX05BTUVTUEFDRTo6aW50ZXJuYWw6OklzRHluYW1pY0NhdGVnb3J5KGNhdGVnb3J5
KSAgIFwKKyAgICAgICA/IDo6UEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFOjpUcmFja0V2
ZW50OjogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIElzRHluYW1pY0NhdGVn
b3J5RW5hYmxlZCg6OnBlcmZldHRvOjpEeW5hbWljQ2F0ZWdvcnkoY2F0ZWdvcnkpKSBcCisgICAg
ICAgOiA6OlBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVTUEFDRTo6VHJhY2tFdmVudDo6SXNDYXRl
Z29yeUVuYWJsZWQ8ICAgIFwKKyAgICAgICAgICAgICBQRVJGRVRUT19HRVRfQ0FURUdPUllfSU5E
RVgoY2F0ZWdvcnkpPigpKQorCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19J
TlRFUk5BTF9UUkFDS19FVkVOVF9NQUNST1NfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkg
VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRo
ZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1h
eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl
LgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAg
ICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxl
c3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNv
ZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBv
biBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMg
T0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vu
c2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisg
KiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVf
UEVSRkVUVE9fVFJBQ0lOR19UUkFDS19FVkVOVF9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRP
X1RSQUNJTkdfVFJBQ0tfRVZFTlRfSF8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS90aW1lLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNrX2V2ZW50X2RhdGFf
c291cmNlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by90cmFjaW5nL2ludGVybmFsL3RyYWNrX2V2ZW50X2ludGVybmFsLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNr
X2V2ZW50X21hY3Jvcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vdHJhY2luZy90cmFjay5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFja19ldmVudF9jYXRlZ29yeV9yZWdpc3RyeS5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRv
L3RyYWNlL3RyYWNrX2V2ZW50L3RyYWNrX2V2ZW50LnBiemVyby5oIgorCisjaW5jbHVkZSA8dHlw
ZV90cmFpdHM+CisKKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHNldCBvZiBtYWNyb3MgZGVzaWdu
ZWQgZm9yIGluc3RydW1lbnRpbmcgYXBwbGljYXRpb25zCisvLyB3aXRoIHRyYWNrIGV2ZW50IHRy
YWNlIHBvaW50cy4gV2hpbGUgdGhlIHVuZGVybHlpbmcgVHJhY2tFdmVudCBBUEkgY2FuIGFsc28K
Ky8vIGJlIHVzZWQgZGlyZWN0bHksIGRvaW5nIHNvIGVmZmljaWVudGx5IHJlcXVpcmVzIHNvbWUg
Y2FyZSAoZS5nLiwgdG8gYXZvaWQKKy8vIGV2YWx1YXRpbmcgYXJndW1lbnRzIHdoaWxlIHRyYWNp
bmcgaXMgZGlzYWJsZWQpLiBUaGVzZSB0eXBlcyBvZiBvcHRpbWl6YXRpb25zCisvLyBhcmUgYWJz
dHJhY3RlZCBhd2F5IGJ5IHRoZSBtYWNyb3MgYmVsb3cuCisvLworLy8gPT09PT09PT09PT09PT09
PQorLy8gUXVpY2tzdGFydCBndWlkZQorLy8gPT09PT09PT09PT09PT09PQorLy8KKy8vICAgVG8g
YWRkIHRyYWNrIGV2ZW50cyB0byB5b3VyIGFwcGxpY2F0aW9uLCBmaXJzdCBkZWZpbmUgeW91ciBj
YXRlZ29yaWVzIGluLAorLy8gICBlLmcuLCBteV90cmFjaW5nLmg6CisvLworLy8gICAgICAgUEVS
RkVUVE9fREVGSU5FX0NBVEVHT1JJRVMoCisvLyAgICAgICAgICAgcGVyZmV0dG86OkNhdGVnb3J5
KCJiYXNlIiksCisvLyAgICAgICAgICAgcGVyZmV0dG86OkNhdGVnb3J5KCJ2OCIpLAorLy8gICAg
ICAgICAgIHBlcmZldHRvOjpDYXRlZ29yeSgiY2MiKSk7CisvLworLy8gICBUaGVuIGluIGEgc2lu
Z2xlIC5jYyBmaWxlLCBlLmcuLCBteV90cmFjaW5nLmNjOgorLy8KKy8vICAgICAgICNpbmNsdWRl
ICJteV90cmFjaW5nLmgiCisvLyAgICAgICBQRVJGRVRUT19UUkFDS19FVkVOVF9TVEFUSUNfU1RP
UkFHRSgpOworLy8KKy8vICAgRmluYWxseSwgcmVnaXN0ZXIgdHJhY2sgZXZlbnRzIGF0IHN0YXJ0
dXAsIGFmdGVyIHdoaWNoIHlvdSBjYW4gcmVjb3JkCisvLyAgIGV2ZW50cyB3aXRoIHRoZSBUUkFD
RV9FVkVOVCBtYWNyb3M6CisvLworLy8gICAgICAgI2luY2x1ZGUgIm15X3RyYWNpbmcuaCIKKy8v
CisvLyAgICAgICBpbnQgbWFpbigpIHsKKy8vICAgICAgICAgcGVyZmV0dG86OlRyYWNrRXZlbnQ6
OlJlZ2lzdGVyKCk7CisvLworLy8gICAgICAgICAvLyBBIGJhc2ljIHRyYWNrIGV2ZW50IHdpdGgg
anVzdCBhIG5hbWUuCisvLyAgICAgICAgIFRSQUNFX0VWRU5UKCJjYXRlZ29yeSIsICJNeUV2ZW50
Iik7CisvLworLy8gICAgICAgICAvLyBBIHRyYWNrIGV2ZW50IHdpdGggKHVwIHRvIHR3bykgZGVi
dWcgYW5ub3RhdGlvbnMuCisvLyAgICAgICAgIFRSQUNFX0VWRU5UKCJjYXRlZ29yeSIsICJNeUV2
ZW50IiwgInBhcmFtZXRlciIsIDQyKTsKKy8vCisvLyAgICAgICAgIC8vIEEgdHJhY2sgZXZlbnQg
d2l0aCBhIHN0cm9uZ2x5IHR5cGVkIHBhcmFtZXRlci4KKy8vICAgICAgICAgVFJBQ0VfRVZFTlQo
ImNhdGVnb3J5IiwgIk15RXZlbnQiLCBbXShwZXJmZXR0bzo6RXZlbnRDb250ZXh0IGN0eCkgewor
Ly8gICAgICAgICAgIGN0eC5ldmVudCgpLT5zZXRfZm9vKDQyKTsKKy8vICAgICAgICAgICBjdHgu
ZXZlbnQoKS0+c2V0X2JhciguNWYpOworLy8gICAgICAgICB9KTsKKy8vICAgICAgIH0KKy8vCisv
LyAgTm90ZSB0aGF0IHRyYWNrIGV2ZW50cyBtdXN0IGJlIG5lc3RlZCBjb25zaXN0ZW50bHksIGku
ZS4sIHRoZSBmb2xsb3dpbmcgaXMKKy8vICBub3QgYWxsb3dlZDoKKy8vCisvLyAgICBUUkFDRV9F
VkVOVF9CRUdJTigiYSIsICJiYXIiLCAuLi4pOworLy8gICAgVFJBQ0VfRVZFTlRfQkVHSU4oImIi
LCAiZm9vIiwgLi4uKTsKKy8vICAgIFRSQUNFX0VWRU5UX0VORCgiYSIpOyAgLy8gImZvbyIgbXVz
dCBiZSBjbG9zZWQgYmVmb3JlICJiYXIiLgorLy8gICAgVFJBQ0VfRVZFTlRfRU5EKCJiIik7Cisv
LworLy8gPT09PT09PT09PT09PT09PT09PT0KKy8vIEltcGxlbWVudGF0aW9uIG5vdGVzCisvLyA9
PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoZSB0cmFjayBldmVudCBsaWJyYXJ5IGNvbnNp
c3RzIG9mIHRoZSBmb2xsb3dpbmcgbGF5ZXJzIGFuZCBjb21wb25lbnRzLiBUaGUKKy8vIGNsYXNz
ZXMgdGhlIGludGVybmFsIG5hbWVzcGFjZSBzaG91bGRuJ3QgYmUgY29uc2lkZXJlZCBwYXJ0IG9m
IHRoZSBwdWJsaWMKKy8vIEFQSS4KKy8vICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0uCisvLyAgICAgICAgICAgICAgIC4tLS0tfCAgVFJBQ0VfRVZF
TlQgICAgICAgICAgICAgICAgICAgfC0tLS0uCisvLyAgICAgIHdyaXRlICAgfCAgICAgfCAgIC0g
QXBwIGluc3RydW1lbnRhdGlvbiBwb2ludCAgfCAgICAgfCAgd3JpdGUKKy8vICAgICAgZXZlbnQg
ICB8ICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nICAgICB8ICBhcmd1bWVu
dHMKKy8vICAgICAgICAgICAgICBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBWCisvLyAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uICAgIC4t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKy8vICB8IFRyYWNrRXZlbnQgICAgICAgICAg
ICAgICAgICAgICAgIHwgICAgfCBFdmVudENvbnRleHQgICAgICAgICAgICAgICAgfAorLy8gIHwg
IC0gUmVnaXN0cnkgb2YgZXZlbnQgY2F0ZWdvcmllcyAgfCAgICB8ICAtIE9uZSB0cmFjayBldmVu
dCBpbnN0YW5jZSB8CisvLyAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nICAg
ICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKy8vICAgICAgICAgICAgICB8ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyAgICAgICAgICAgICAg
fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsb29rIHVwCisv
LyAgICAgICAgICAgICAgfCBpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfCBpbnRlcm5pbmcgaWRzCisvLyAgICAgICAgICAgICAgViAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVgorLy8gIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLiAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisvLyAgfCBpbnRl
cm5hbDo6VHJhY2tFdmVudERhdGFTb3VyY2UgICB8ICAgIHwgVHJhY2tFdmVudEludGVybmVkRGF0
YUluZGV4IHwKKy8vICB8IC0gUGVyZmV0dG8gZGF0YSBzb3VyY2UgICAgICAgICAgIHwgICAgfCAt
IENvcnJlc3BvbmRzIHRvIGEgZmllbGQgaW4gfAorLy8gIHwgLSBIYXMgVHJhY2tFdmVudEluY3Jl
bWVudGFsU3RhdGUgfCAgICB8ICAgaW4gaW50ZXJuZWRfZGF0YS5wcm90byAgICB8CisvLyAgJy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nICAgICctLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLScKKy8vICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAg
ICAgICAgICAgICAgICAgICBeCisvLyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwg
ICAgICAgb3ducyAoMTptYW55KSAgICAgfAorLy8gICAgICAgICAgICAgIHwgd3JpdGUgZXZlbnQg
ICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKy8vICAgICAgICAgICAgICBWCisvLyAg
Li0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisvLyAgfCBpbnRlcm5hbDo6VHJh
Y2tFdmVudEludGVybmFsICAgICB8CisvLyAgfCAtIE91dGxpbmVkIGNvZGUgdG8gc2VyaWFsaXpl
ICAgICB8CisvLyAgfCAgIG9uZSB0cmFjayBldmVudCAgICAgICAgICAgICAgICB8CisvLyAgJy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisvLworCisvLyBFYWNoIGNvbXBpbGF0
aW9uIHVuaXQgY2FuIGJlIGluIGV4YWN0bHkgb25lIHRyYWNrIGV2ZW50IG5hbWVzcGFjZSwKKy8v
IGFsbG93aW5nIHRoZSBvdmVyYWxsIHByb2dyYW0gdG8gdXNlIG11bHRpcGxlIHRyYWNrIGV2ZW50
IGRhdGEgc291cmNlcyBhbmQKKy8vIGNhdGVnb3J5IGxpc3RzIGlmIG5lY2Vzc2FyeS4gVXNlIHRo
aXMgbWFjcm8gdG8gc2VsZWN0IHRoZSBuYW1lc3BhY2UgZm9yIHRoZQorLy8gY3VycmVudCBjb21w
aWxhdGlvbiB1bml0LgorLy8KKy8vIElmIHRoZSBwcm9ncmFtIHVzZXMgbXVsdGlwbGUgdHJhY2sg
ZXZlbnQgbmFtZXNwYWNlcywgY2F0ZWdvcnkgJiB0cmFjayBldmVudAorLy8gcmVnaXN0cmF0aW9u
IChzZWUgcXVpY2tzdGFydCBhYm92ZSkgbmVlZHMgdG8gaGFwcGVuIGZvciBib3RoIG5hbWVzcGFj
ZXMKKy8vIHNlcGFyYXRlbHkuCisjaWZuZGVmIFBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVTUEFD
RQorI2RlZmluZSBQRVJGRVRUT19UUkFDS19FVkVOVF9OQU1FU1BBQ0UgcGVyZmV0dG8KKyNlbmRp
ZgorCisvLyBEZXByZWNhdGVkOyBzZWUgcGVyZmV0dG86OkNhdGVnb3J5KCkuCisjZGVmaW5lIFBF
UkZFVFRPX0NBVEVHT1JZKG5hbWUpIFwKKyAgOjpwZXJmZXR0bzo6Q2F0ZWdvcnkgeyAjbmFtZSB9
CisKKy8vIEludGVybmFsIGhlbHBlcnMgZm9yIGRldGVybWluaW5nIGlmIGEgZ2l2ZW4gY2F0ZWdv
cnkgaXMgZGVmaW5lZCBhdCBidWlsZCBvcgorLy8gcnVudGltZS4KK25hbWVzcGFjZSBQRVJGRVRU
T19UUkFDS19FVkVOVF9OQU1FU1BBQ0UgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQnkg
ZGVmYXVsdCBubyBzdGF0aWNhbGx5IGRlZmluZWQgY2F0ZWdvcmllcyBhcmUgZHluYW1pYywgYnV0
IHRoaXMgY2FuIGJlCisvLyBvdmVycmlkZGVuIHdpdGggUEVSRkVUVE9fREVGSU5FX1RFU1RfQ0FU
RUdPUllfUFJFRklYRVMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KK2NvbnN0ZXhwciBib29s
IElzRHluYW1pY0NhdGVnb3J5KGNvbnN0IGNoYXIqKSB7CisgIHJldHVybiBmYWxzZTsKK30KKwor
Ly8gRXhwbGljaXRseSBkeW5hbWljIGNhdGVnb3JpZXMgYXJlIGFsd2F5cyBkeW5hbWljLgorY29u
c3RleHByIGJvb2wgSXNEeW5hbWljQ2F0ZWdvcnkoY29uc3QgOjpwZXJmZXR0bzo6RHluYW1pY0Nh
dGVnb3J5JikgeworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFs
Cit9ICAvLyBuYW1lc3BhY2UgUEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CisKKy8vIEEgd3JhcHBlciBmb3IgbWFya2luZyBzdHJpbmdzIHRoYXQg
Y2FuJ3QgYmUgZGV0ZXJtaW5lZCB0byBiZSBzdGF0aWMgYXQgYnVpbGQKKy8vIHRpbWUsIGJ1dCBh
cmUgaW4gZmFjdCBzdGF0aWMuCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgU3RhdGljU3RyaW5nIGZp
bmFsIHsKKyBwdWJsaWM6CisgIGNvbnN0IGNoYXIqIHZhbHVlOworCisgIG9wZXJhdG9yIGNvbnN0
IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5h
bCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUID0gdm9pZD4KK2NvbnN0ZXhwciBib29sIElzU3Rh
dGljU3RyaW5nKGNvbnN0IGNoYXIqKSB7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IHZvaWQ+Citjb25zdGV4cHIgYm9vbCBJc1N0YXRpY1N0cmluZyguLi4pIHsK
KyAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworCisvLyBOb3JtYWxseSBhbGwgY2F0ZWdvcmllcyBhcmUgZGVmaW5l
ZCBzdGF0aWNhbGx5IGF0IGJ1aWxkLXRpbWUgKHNlZQorLy8gUEVSRkVUVE9fREVGSU5FX0NBVEVH
T1JJRVMpLiBIb3dldmVyLCBzb21lIGNhdGVnb3JpZXMgYXJlIG9ubHkgdXNlZCBmb3IKKy8vIHRl
c3RpbmcsIGFuZCB3ZSBzaG91bGRuJ3QgcHVibGlzaCB0aGVtIHRvIHRoZSB0cmFjaW5nIHNlcnZp
Y2Ugb3IgaW5jbHVkZSB0aGVtCisvLyBpbiBhIHByb2R1Y3Rpb24gYmluYXJ5LiBVc2UgdGhpcyBt
YWNybyB0byBkZWZpbmUgYSBsaXN0IG9mIHByZWZpeGVzIGZvciB0aGVzZQorLy8gdHlwZXMgb2Yg
Y2F0ZWdvcmllcy4gTm90ZSB0aGF0IHRyYWNlIHBvaW50cyB1c2luZyB0aGVzZSBjYXRlZ29yaWVz
IHdpbGwgYmUKKy8vIHNsaWdodGx5IGxlc3MgZWZmaWNpZW50IGNvbXBhcmVkIHRvIHJlZ3VsYXIg
dHJhY2UgcG9pbnRzLgorI2RlZmluZSBQRVJGRVRUT19ERUZJTkVfVEVTVF9DQVRFR09SWV9QUkVG
SVhFUyguLi4pICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBQRVJGRVRUT19U
UkFDS19FVkVOVF9OQU1FU1BBQ0UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
bmFtZXNwYWNlIGludGVybmFsIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0ZXhwciBib29sIElz
RHluYW1pY0NhdGVnb3J5KGNvbnN0IGNoYXIqIG5hbWUpIHsgICAgICAgICAgICAgICAgICAgIFwK
KyAgICByZXR1cm4gOjpwZXJmZXR0bzo6aW50ZXJuYWw6OklzU3RyaW5nSW5QcmVmaXhMaXN0KG5h
bWUsIF9fVkFfQVJHU19fKTsgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gLyogbmFtZXNwYWNl
IGludGVybmFsICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgfSAvKiBuYW1lc3BhY2UgUEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFICovICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICBQRVJGRVRUT19JTlRFUk5BTF9TV0FMTE9XX1NFTUlD
T0xPTigpCisKKy8vIFJlZ2lzdGVyIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGNhdGVnb3JpZXMgYnkg
cGFzc2luZyBhIGxpc3Qgb2YgY2F0ZWdvcmllcyB0bworLy8gdGhpcyBtYWNybzogUEVSRkVUVE9f
Q0FURUdPUlkoY2F0MSksIFBFUkZFVFRPX0NBVEVHT1JZKGNhdDIpLCAuLi4KKyNkZWZpbmUgUEVS
RkVUVE9fREVGSU5FX0NBVEVHT1JJRVMoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
bmFtZXNwYWNlIFBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVTUEFDRSB7ICAgICAgICAgICAgICAg
ICAgIFwKKyAgLyogVGhlIGxpc3Qgb2YgY2F0ZWdvcnkgbmFtZXMgKi8gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfREVDTEFSRV9DQVRFR09SSUVTKF9f
VkFfQVJHU19fKSAgICAgICAgICAgIFwKKyAgLyogVGhlIHRyYWNrIGV2ZW50IGRhdGEgc291cmNl
IGZvciB0aGlzIHNldCBvZiBjYXRlZ29yaWVzICovIFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfREVD
TEFSRV9UUkFDS19FVkVOVF9EQVRBX1NPVVJDRSgpOyAgICAgICAgIFwKKyAgfSAvKiBuYW1lc3Bh
Y2UgUEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFICovICAgICAgICAgICAgIFwKKyAgUEVS
RkVUVE9fREVDTEFSRV9EQVRBX1NPVVJDRV9TVEFUSUNfTUVNQkVSUyggICAgICAgICAgICAgICAg
IFwKKyAgICAgIFBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVTUEFDRTo6VHJhY2tFdmVudCwgICAg
ICAgICAgICAgIFwKKyAgICAgIHBlcmZldHRvOjppbnRlcm5hbDo6VHJhY2tFdmVudERhdGFTb3Vy
Y2VUcmFpdHMpCisKKy8vIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGVhY2ggY2F0ZWdvcnkgYnkgdXNp
bmcgdGhpcyBtYWNybyBvbmNlIHBlciB0cmFjayBldmVudAorLy8gbmFtZXNwYWNlLgorI2RlZmlu
ZSBQRVJGRVRUT19UUkFDS19FVkVOVF9TVEFUSUNfU1RPUkFHRSgpICAgICAgXAorICBuYW1lc3Bh
Y2UgUEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFIHsgICAgICAgXAorICBQRVJGRVRUT19J
TlRFUk5BTF9DQVRFR09SWV9TVE9SQUdFKCkgICAgICAgICAgICAgXAorICB9IC8qIG5hbWVzcGFj
ZSBQRVJGRVRUT19UUkFDS19FVkVOVF9OQU1FU1BBQ0UgKi8gXAorICBQRVJGRVRUT19ERUZJTkVf
REFUQV9TT1VSQ0VfU1RBVElDX01FTUJFUlMoICAgICAgXAorICAgICAgUEVSRkVUVE9fVFJBQ0tf
RVZFTlRfTkFNRVNQQUNFOjpUcmFja0V2ZW50LCAgXAorICAgICAgcGVyZmV0dG86OmludGVybmFs
OjpUcmFja0V2ZW50RGF0YVNvdXJjZVRyYWl0cykKKworLy8gSWdub3JlIEdDQyB3YXJuaW5nIGFi
b3V0IGEgbWlzc2luZyBhcmd1bWVudCBmb3IgYSB2YXJpYWRpYyBtYWNybyBwYXJhbWV0ZXIuCisj
cHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKy8vIEVuc3VyZSB0aGF0IHxzdHJpbmd8IGlzIGEg
c3RhdGljIGNvbnN0YW50IHN0cmluZy4KKy8vCisvLyBJZiB5b3UgZ2V0IGEgY29tcGlsZXIgZmFp
bHVyZSBoZXJlLCB5b3UgYXJlIG1vc3QgbGlrZWx5IHRyeWluZyB0byB1c2UKKy8vIFRSQUNFX0VW
RU5UIHdpdGggYSBkeW5hbWljIGV2ZW50IG5hbWUuIFRoZXJlIGFyZSB0d28gd2F5cyB0byBmaXgg
dGhpczoKKy8vCisvLyAxKSBJZiB0aGUgZXZlbnQgbmFtZSBpcyBhY3R1YWxseSBkeW5hbWljIChl
LmcuLCBzdGQ6OnN0cmluZyksIHdyaXRlIGl0IGludG8KKy8vICAgIHRoZSBldmVudCBtYW51YWxs
eToKKy8vCisvLyAgICAgIFRSQUNFX0VWRU5UKCJjYXRlZ29yeSIsIG51bGxwdHIsIFsmXShwZXJm
ZXR0bzo6RXZlbnRDb250ZXh0IGN0eCkgeworLy8gICAgICAgIGN0eC5ldmVudCgpLT5zZXRfbmFt
ZShkeW5hbWljX25hbWUpOworLy8gICAgICB9KTsKKy8vCisvLyAyKSBJZiB0aGUgbmFtZSBpcyBz
dGF0aWMsIGJ1dCB0aGUgcG9pbnRlciBpcyBjb21wdXRlZCBhdCBydW50aW1lLCB3cmFwIGl0Cisv
LyAgICB3aXRoIHBlcmZldHRvOjpTdGF0aWNTdHJpbmc6CisvLworLy8gICAgICBUUkFDRV9FVkVO
VCgiY2F0ZWdvcnkiLCBwZXJmZXR0bzo6U3RhdGljU3RyaW5ne25hbWV9KTsKKy8vCisvLyAgICBE
QU5HRVI6IFVzaW5nIHBlcmZldHRvOjpTdGF0aWNTdHJpbmcgd2l0aCBzdHJpbmdzIHdob3NlIGNv
bnRlbnRzIGNoYW5nZQorLy8gICAgICAgICAgICBkeW5hbWljYWxseSBjYW4gY2F1c2Ugc2lsZW50
IHRyYWNlIGRhdGEgY29ycnVwdGlvbi4KKy8vCisjZGVmaW5lIFBFUkZFVFRPX0dFVF9TVEFUSUNf
U1RSSU5HKHN0cmluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFsmXSgp
IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgc3RhdGljX2Fzc2VydCggICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6aXNfc2FtZTxk
ZWNsdHlwZShzdHJpbmcpLCA6OnBlcmZldHRvOjpTdGF0aWNTdHJpbmc+Ojp2YWx1ZSB8fCBcCisg
ICAgICAgICAgICA6OnBlcmZldHRvOjppbnRlcm5hbDo6SXNTdGF0aWNTdHJpbmcoc3RyaW5nKSwg
ICAgICAgICAgICAgICAgICBcCisgICAgICAgICJTdHJpbmcgbXVzdCBiZSBzdGF0aWMiKTsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PGNvbnN0IGNoYXIqPihzdHJpbmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgIH0oKQorCisvLyBCZWdpbiBhIHNsaWNlIHVuZGVyIHxjYXRlZ29yeXwgd2l0aCB0aGUg
dGl0bGUgfG5hbWV8LiBCb3RoIHN0cmluZ3MgbXVzdCBiZQorLy8gc3RhdGljIGNvbnN0YW50cy4g
VGhlIHRyYWNrIGV2ZW50IGlzIG9ubHkgcmVjb3JkZWQgaWYgfGNhdGVnb3J5fCBpcyBlbmFibGVk
CisvLyBmb3IgYSB0cmFjaW5nIHNlc3Npb24uCisvLworLy8gVGhlIHNsaWNlIGlzIHRocmVhZC1z
Y29wZWQgKGkuZS4sIHdyaXR0ZW4gdG8gdGhlIGRlZmF1bHQgdHJhY2sgb2YgdGhlIGN1cnJlbnQK
Ky8vIHRocmVhZCkgdW5sZXNzIG92ZXJyaWRkZW4gd2l0aCBhIGN1c3RvbSB0cmFjayBvYmplY3Qg
KHNlZSBUcmFjaykuCisvLworLy8gfG5hbWV8IG11c3QgYmUgYSBzdHJpbmcgd2l0aCBzdGF0aWMg
bGlmZXRpbWUgKGkuZS4sIHRoZSBzYW1lCisvLyBhZGRyZXNzIG11c3Qgbm90IGJlIHVzZWQgZm9y
IGEgZGlmZmVyZW50IGV2ZW50IG5hbWUgaW4gdGhlIGZ1dHVyZSkuIElmIHlvdQorLy8gd2FudCB0
byB1c2UgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbmFtZSwgZG8gdGhpczoKKy8vCisvLyAgVFJB
Q0VfRVZFTlQoImNhdGVnb3J5IiwgbnVsbHB0ciwgWyZdKHBlcmZldHRvOjpFdmVudENvbnRleHQg
Y3R4KSB7CisvLyAgICBjdHguZXZlbnQoKS0+c2V0X25hbWUoZHluYW1pY19uYW1lKTsKKy8vICB9
KTsKKy8vCisjZGVmaW5lIFRSQUNFX0VWRU5UX0JFR0lOKGNhdGVnb3J5LCBuYW1lLCAuLi4pICAg
IFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfVFJBQ0tfRVZFTlQoICAgICAgICAgICAgICAgICAgXAor
ICAgICAgY2F0ZWdvcnksIFBFUkZFVFRPX0dFVF9TVEFUSUNfU1RSSU5HKG5hbWUpLCBcCisgICAg
ICA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VFlQRV9TTElDRV9CRUdJ
TiwgIyNfX1ZBX0FSR1NfXykKKworLy8gRW5kIGEgc2xpY2UgdW5kZXIgfGNhdGVnb3J5fC4KKyNk
ZWZpbmUgVFJBQ0VfRVZFTlRfRU5EKGNhdGVnb3J5LCAuLi4pIFwKKyAgUEVSRkVUVE9fSU5URVJO
QUxfVFJBQ0tfRVZFTlQoICAgICAgIFwKKyAgICAgIGNhdGVnb3J5LCBudWxscHRyLCAgICAgICAg
ICAgICAgIFwKKyAgICAgIDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpU
WVBFX1NMSUNFX0VORCwgIyNfX1ZBX0FSR1NfXykKKworLy8gQmVnaW4gYSBzbGljZSB3aGljaCBn
ZXRzIGF1dG9tYXRpY2FsbHkgY2xvc2VkIHdoZW4gZ29pbmcgb3V0IG9mIHNjb3BlLgorI2RlZmlu
ZSBUUkFDRV9FVkVOVChjYXRlZ29yeSwgbmFtZSwgLi4uKSBcCisgIFBFUkZFVFRPX0lOVEVSTkFM
X1NDT1BFRF9UUkFDS19FVkVOVChjYXRlZ29yeSwgbmFtZSwgIyNfX1ZBX0FSR1NfXykKKworLy8g
RW1pdCBhIHNsaWNlIHdoaWNoIGhhcyB6ZXJvIGR1cmF0aW9uLgorI2RlZmluZSBUUkFDRV9FVkVO
VF9JTlNUQU5UKGNhdGVnb3J5LCBuYW1lLCAuLi4pICBcCisgIFBFUkZFVFRPX0lOVEVSTkFMX1RS
QUNLX0VWRU5UKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhdGVnb3J5LCBQRVJGRVRUT19H
RVRfU1RBVElDX1NUUklORyhuYW1lKSwgXAorICAgICAgOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OlRyYWNrRXZlbnQ6OlRZUEVfSU5TVEFOVCwgIyNfX1ZBX0FSR1NfXykKKworLy8gRWZmaWNp
ZW50bHkgZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBzdGF0aWMgb3IgZHluYW1pYyB0cmFjZSBjYXRl
Z29yeSBvcgorLy8gY2F0ZWdvcnkgZ3JvdXAgaXMgZW5hYmxlZCBmb3IgdHJhY2luZy4KKyNkZWZp
bmUgVFJBQ0VfRVZFTlRfQ0FURUdPUllfRU5BQkxFRChjYXRlZ29yeSkgXAorICBQRVJGRVRUT19J
TlRFUk5BTF9DQVRFR09SWV9FTkFCTEVEKGNhdGVnb3J5KQorCisvLyBUT0RPKHNreW9zdGlsKTog
QWRkIGZsb3cgZXZlbnRzLgorLy8gVE9ETyhza3lvc3RpbCk6IEFkZCBjb3VudGVycy4KKworI2Vu
ZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfVFJBQ0tfRVZFTlRfSF8KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy90cmFja19l
dmVudF9pbnRlcm5lZF9kYXRhX2luZGV4LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhl
IEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBB
cGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBu
b3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgor
ICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBo
dHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3Mg
cmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3
YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBh
biAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0Yg
QU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2Ug
Zm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBs
aW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVS
RkVUVE9fVFJBQ0lOR19UUkFDS19FVkVOVF9JTlRFUk5FRF9EQVRBX0lOREVYX0hfCisjZGVmaW5l
IElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19FVkVOVF9JTlRFUk5FRF9EQVRBX0lOREVY
X0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Ry
YWNpbmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfaW50ZXJuYWwuaCIKKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9jb21waWxlci5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9ldmVudF9j
b250ZXh0LmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5j
bHVkZSA8dW5vcmRlcmVkX21hcD4KKworLy8gVGhpcyBmaWxlIGhhcyB0ZW1wbGF0ZXMgZm9yIGRl
ZmluaW5nIHlvdXIgb3duIGludGVybmVkIGRhdGEgdHlwZXMgdG8gYmUgdXNlZAorLy8gd2l0aCB0
cmFjayBldmVudC4gSW50ZXJuZWQgZGF0YSBjYW4gYmUgdXNlZnVsIGZvciBhdm9pZGluZyByZXBl
YXRpbmcgdGhlIHNhbWUKKy8vIGNvbnN0YW50IGRhdGEgKGUuZy4sIHN0cmluZ3MpIHRocm91Z2hv
dXQgdGhlIHRyYWNlLgorLy8KKy8vID09PT09PT09PT09PT0KKy8vIEV4YW1wbGUgdXNhZ2UKKy8v
ID09PT09PT09PT09PT0KKy8vCisvLyBGaXJzdCBkZWZpbmUgYW4gaW50ZXJuaW5nIGluZGV4IGZv
ciB5b3VyIHR5cGUuIEl0IHNob3VsZCBtYXAgdG8gYSBzcGVjaWZpYworLy8gZmllbGQgb2YgaW50
ZXJuZWRfZGF0YS5wcm90byBhbmQgZGVmaW5lIGhvdyB0aGUgaW50ZXJuZWQgZGF0YSBpcyB3cml0
dGVuIGludG8KKy8vIHRoYXQgbWVzc2FnZS4KKy8vCisvLyAgIHN0cnVjdCBNeUludGVybmVkRGF0
YQorLy8gICAgICAgOiBwdWJsaWMgcGVyZmV0dG86OlRyYWNrRXZlbnRJbnRlcm5lZERhdGFJbmRl
eDwKKy8vICAgICAgICAgICBNeUludGVybmVkRGF0YSwKKy8vICAgICAgICAgICBwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OkludGVybmVkRGF0YTo6a015SW50ZXJuZWREYXRhRmllbGROdW1iZXIs
CisvLyAgICAgICAgICAgY29uc3QgY2hhcio+IHsKKy8vICAgICBzdGF0aWMgdm9pZCBBZGQocGVy
ZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpJbnRlcm5lZERhdGEqIGludGVybmVkX2RhdGEsCisvLyAg
ICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWlkLAorLy8gICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgY2hhciogdmFsdWUpIHsKKy8vICAgICAgIGF1dG8gbXlfZGF0YSA9IGludGVybmVkX2Rh
dGEtPmFkZF9teV9pbnRlcm5lZF9kYXRhKCk7CisvLyAgICAgICBteV9kYXRhLT5zZXRfaWlkKGlp
ZCk7CisvLyAgICAgICBteV9kYXRhLT5zZXRfdmFsdWUodmFsdWUpOworLy8gICAgIH0KKy8vICAg
fTsKKy8vCisvLyBOZXh0LCB1c2UgeW91ciBpbnRlcm5lZCBkYXRhIGluIGEgdHJhY2UgcG9pbnQg
YXMgc2hvd24gYmVsb3cuIFRoZSBpbnRlcm5lZAorLy8gc3RyaW5nIHdpbGwgb25seSBiZSBlbWl0
dGVkIHRoZSBmaXJzdCB0aW1lIHRoZSB0cmFjZSBwb2ludCBpcyBoaXQuCisvLworLy8gICBUUkFD
RV9FVkVOVF9CRUdJTigKKy8vICAgICAgImNhdGVnb3J5IiwgIkV2ZW50IiwgWyZdKHBlcmZldHRv
OjpFdmVudENvbnRleHQgY3R4KSB7CisvLyAgICAgICAgYXV0byBteV9tZXNzYWdlID0gY3R4LmV2
ZW50KCktPnNldF9teV9tZXNzYWdlKCk7CisvLyAgICAgICAgc2l6ZV90IGlpZCA9IE15SW50ZXJu
ZWREYXRhOjpHZXQoJmN0eCwgIlNvbWUgZGF0YSIpOworLy8gICAgICAgIG15X21lc3NhZ2UtPnNl
dF9paWQoaWlkKTsKKy8vICAgICAgfSk7CisvLworCituYW1lc3BhY2UgcGVyZmV0dG8geworCisv
LyBCeSBkZWZhdWx0LCB0aGUgaW50ZXJuaW5nIGluZGV4IHN0b3JlcyBhIGZ1bGwgY29weSBvZiB0
aGUgaW50ZXJuZWQgZGF0YS4gVGhpcworLy8gZW5zdXJlcyB0aGUgc2FtZSBkYXRhIGlzIGFsd2F5
cyBtYXBwZWQgdG8gdGhlIHNhbWUgaW50ZXJuaW5nIGlkLCBhbmQgdGhlcmUgaXMKKy8vIG5vIGRh
bmdlciBvZiBjb2xsaXNpb25zLiBUaGlzIGNvbWVzIGF0IHRoZSBjb3N0IG9mIG1lbW9yeSB1c2Fn
ZSwgaG93ZXZlciwgc28KKy8vIGNvbnNpZGVyIHVzaW5nIEhhc2hlZEludGVybmVkRGF0YVRyYWl0
cyBpZiB0aGF0IG1heSBiZSBhbiBpc3N1ZS4KKy8vCisvLyBUaGlzIHR5cGUgb2YgaW5kZXggYWxz
byBwZXJmb3JtcyBoYXNoaW5nIG9uIHRoZSBzdG9yZWQgZGF0YSBmb3IgbG9va3VwczsgZm9yCisv
LyB0eXBlcyB3aGVyZSB0aGlzIGlzbid0IG5lY2Vzc2FyeSAoZS5nLiwgcmF3IGNvbnN0IGNoYXIq
KSwgdXNlCisvLyBTbWFsbEludGVybmVkRGF0YVRyYWl0cy4KK3N0cnVjdCBCaWdJbnRlcm5lZERh
dGFUcmFpdHMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeXBlPgorICBjbGFzcyBJbmRl
eCB7CisgICBwdWJsaWM6CisgICAgYm9vbCBMb29rVXBPckluc2VydChzaXplX3QqIGlpZCwgY29u
c3QgVmFsdWVUeXBlJiB2YWx1ZSkgeworICAgICAgc2l6ZV90IG5leHRfaWQgPSBkYXRhXy5zaXpl
KCkgKyAxOworICAgICAgYXV0byBpdF9hbmRfaW5zZXJ0ZWQgPSBkYXRhXy5pbnNlcnQoc3RkOjpt
YWtlX3BhaXIodmFsdWUsIG5leHRfaWQpKTsKKyAgICAgIGlmICghaXRfYW5kX2luc2VydGVkLnNl
Y29uZCkgeworICAgICAgICAqaWlkID0gaXRfYW5kX2luc2VydGVkLmZpcnN0LT5zZWNvbmQ7Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgKmlpZCA9IG5leHRfaWQ7CisgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6dW5vcmRlcmVk
X21hcDxWYWx1ZVR5cGUsIHNpemVfdD4gZGF0YV87CisgIH07Cit9OworCisvLyBUaGlzIHR5cGUg
b2YgaW50ZXJuaW5nIGluZGV4IGtlZXBzIGZ1bGwgY29waWVzIG9mIGludGVybmVkIGRhdGEgd2l0
aG91dAorLy8gaGFzaGluZyB0aGUgdmFsdWVzLiBUaGlzIGlzIGEgZ29vZCBmaXQgZm9yIHNtYWxs
IHR5cGVzIHRoYXQgY2FuIGJlIGRpcmVjdGx5CisvLyB1c2VkIGFzIGluZGV4IGtleXMuCitzdHJ1
Y3QgU21hbGxJbnRlcm5lZERhdGFUcmFpdHMgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVU
eXBlPgorICBjbGFzcyBJbmRleCB7CisgICBwdWJsaWM6CisgICAgYm9vbCBMb29rVXBPckluc2Vy
dChzaXplX3QqIGlpZCwgY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSkgeworICAgICAgc2l6ZV90IG5l
eHRfaWQgPSBkYXRhXy5zaXplKCkgKyAxOworICAgICAgYXV0byBpdF9hbmRfaW5zZXJ0ZWQgPSBk
YXRhXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIodmFsdWUsIG5leHRfaWQpKTsKKyAgICAgIGlmICgh
aXRfYW5kX2luc2VydGVkLnNlY29uZCkgeworICAgICAgICAqaWlkID0gaXRfYW5kX2luc2VydGVk
LmZpcnN0LT5zZWNvbmQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgKmlp
ZCA9IG5leHRfaWQ7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICBwcml2YXRlOgor
ICAgIHN0ZDo6bWFwPFZhbHVlVHlwZSwgc2l6ZV90PiBkYXRhXzsKKyAgfTsKK307CisKKy8vIFRo
aXMgdHlwZSBvZiBpbnRlcm5pbmcgaW5kZXggb25seSBzdG9yZXMgdGhlIGhhc2ggb2YgdGhlIGlu
dGVybmVkIHZhbHVlcworLy8gaW5zdGVhZCBvZiB0aGUgdmFsdWVzIHRoZW1zZWx2ZXMuIFRoaXMg
aXMgbW9yZSBlZmZpY2llbnQgaW4gdGVybXMgb2YgbWVtb3J5CisvLyB1c2FnZSwgYnV0IGFzc3Vt
ZXMgdGhhdCB0aGVyZSBhcmUgbm8gaGFzaCBjb2xsaXNpb25zLiBJZiBhIGhhc2ggY29sbGlzaW9u
CisvLyBvY2N1cnMsIHR3byBvciBtb3JlIHZhbHVlcyB3aWxsIGJlIG1hcHBlZCB0byB0aGUgc2Ft
ZSBpbnRlcm5pbmcgaWQuCisvLworLy8gTm90ZSB0aGF0IHRoZSBnaXZlbiB0eXBlIG11c3QgaGF2
ZSBhIHNwZWNpYWxpemF0aW9uIGZvciBzdGQ6Omhhc2guCitzdHJ1Y3QgSGFzaGVkSW50ZXJuZWRE
YXRhVHJhaXRzIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHlwZT4KKyAgY2xhc3MgSW5k
ZXggeworICAgcHVibGljOgorICAgIGJvb2wgTG9va1VwT3JJbnNlcnQoc2l6ZV90KiBpaWQsIGNv
bnN0IFZhbHVlVHlwZSYgdmFsdWUpIHsKKyAgICAgIGF1dG8ga2V5ID0gc3RkOjpoYXNoPFZhbHVl
VHlwZT4oKSh2YWx1ZSk7CisgICAgICBzaXplX3QgbmV4dF9pZCA9IGRhdGFfLnNpemUoKSArIDE7
CisgICAgICBhdXRvIGl0X2FuZF9pbnNlcnRlZCA9IGRhdGFfLmluc2VydChzdGQ6Om1ha2VfcGFp
cihrZXksIG5leHRfaWQpKTsKKyAgICAgIGlmICghaXRfYW5kX2luc2VydGVkLnNlY29uZCkgewor
ICAgICAgICAqaWlkID0gaXRfYW5kX2luc2VydGVkLmZpcnN0LT5zZWNvbmQ7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgfQorICAgICAgKmlpZCA9IG5leHRfaWQ7CisgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6bWFwPHNpemVfdCwgc2l6ZV90
PiBkYXRhXzsKKyAgfTsKK307CisKKy8vIEEgdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIGFuIGlu
dGVybmVkIGRhdGEgdHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIGZpZWxkCisvLyBpbiBpbnRl
cm5lZF9kYXRhLnByb3RvLgorLy8KKy8vIHxJbnRlcm5lZERhdGFUeXBlfCBtdXN0IGJlIHRoZSB0
eXBlIG9mIHRoZSBzdWJjbGFzcy4KKy8vIHxGaWVsZE51bWJlcnwgaXMgdGhlIGNvcnJlc3BvbmRp
bmcgcHJvdG9idWYgZmllbGQgaW4gSW50ZXJuZWREYXRhLgorLy8gfFZhbHVlVHlwZXwgaXMgdGhl
IHR5cGUgd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBpbmRleC4gSXQgbXVzdCBiZSBjb3B5YWJsZS4K
Ky8vIHxUcmFpdHN8IGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgc3RvcmFnZSBhbmQgbG9v
a3VwIG1lY2hhbmlzbS4KKy8vCisvLyBUaGUgc3ViY2xhc3Mgc2hvdWxkIGRlZmluZSBhIHN0YXRp
YyBtZXRob2Qgd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSBmb3IKKy8vIGNvbW1pdHRpbmcg
aW50ZXJuZWQgZGF0YSB0b2dldGhlciB3aXRoIHRoZSBpbnRlcm5pbmcgaWQgfGlpZHwgaW50byB0
aGUgdHJhY2U6CisvLworLy8gICBzdGF0aWMgdm9pZCBBZGQocGVyZmV0dG86OnByb3Rvczo6cGJ6
ZXJvOjpJbnRlcm5lZERhdGEqLAorLy8gICAgICAgICAgICAgICAgICAgc2l6ZV90IGlpZCwKKy8v
ICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpOworLy8KK3RlbXBsYXRl
IDx0eXBlbmFtZSBJbnRlcm5lZERhdGFUeXBlLAorICAgICAgICAgIHNpemVfdCBGaWVsZE51bWJl
ciwKKyAgICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGUsCisgICAgICAgICAgLy8gQXZvaWQgdW5u
ZWNlc3NhcnkgaGFzaGluZyBmb3IgcG9pbnRlcnMgYnkgZGVmYXVsdC4KKyAgICAgICAgICB0eXBl
bmFtZSBUcmFpdHMgPQorICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPChz
dGQ6OmlzX3BvaW50ZXI8VmFsdWVUeXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFNtYWxsSW50ZXJuZWREYXRhVHJhaXRzLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVybmVkRGF0YVRyYWl0cz46OnR5cGU+
CitjbGFzcyBUcmFja0V2ZW50SW50ZXJuZWREYXRhSW5kZXgKKyAgICA6IHB1YmxpYyBpbnRlcm5h
bDo6QmFzZVRyYWNrRXZlbnRJbnRlcm5lZERhdGFJbmRleCB7CisgcHVibGljOgorICAvLyBSZXR1
cm4gYW4gaW50ZXJuaW5nIGlkIGZvciB8dmFsdWV8LiBUaGUgcmV0dXJuZWQgaWQgY2FuIGJlIGlt
bWVkaWF0ZWx5CisgIC8vIHdyaXR0ZW4gdG8gdGhlIHRyYWNlLiBUaGUgb3B0aW9uYWwgfGFkZF9h
cmdzfCBhcmUgcGFzc2VkIHRvIHRoZSBBZGQoKQorICAvLyBmdW5jdGlvbi4KKyAgdGVtcGxhdGUg
PHR5cGVuYW1lLi4uIEFyZ3M+CisgIHN0YXRpYyBzaXplX3QgR2V0KEV2ZW50Q29udGV4dCogY3R4
LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR5cGUmIHZhbHVlLAorICAgICAgICAg
ICAgICAgICAgICBBcmdzJiYuLi4gYWRkX2FyZ3MpIHsKKyAgICAvLyBGaXJzdCBjaGVjayBpZiB0
aGUgdmFsdWUgZXhpc3RzIGluIHRoZSBkaWN0aW9uYXJ5LgorICAgIGF1dG8gaW5kZXhfZm9yX2Zp
ZWxkID0gR2V0T3JDcmVhdGVJbmRleEZvckZpZWxkKGN0eC0+aW5jcmVtZW50YWxfc3RhdGVfKTsK
KyAgICBzaXplX3QgaWlkOworICAgIGlmIChQRVJGRVRUT19MSUtFTFkoaW5kZXhfZm9yX2ZpZWxk
LT5pbmRleF8uTG9va1VwT3JJbnNlcnQoJmlpZCwgdmFsdWUpKSkgeworICAgICAgUEVSRkVUVE9f
RENIRUNLKGlpZCk7CisgICAgICByZXR1cm4gaWlkOworICAgIH0KKworICAgIC8vIElmIG5vdCwg
d2UgbmVlZCB0byBzZXJpYWxpemUgdGhlIGRlZmluaXRpb24gb2YgdGhlIGludGVybmVkIHZhbHVl
IGludG8KKyAgICAvLyB0aGUgaGVhcCBidWZmZXJlZCBtZXNzYWdlICh3aGljaCBpcyBjb21taXR0
ZWQgdG8gdGhlIHRyYWNlIHdoZW4gdGhlCisgICAgLy8gcGFja2V0IGVuZHMpLgorICAgIFBFUkZF
VFRPX0RDSEVDSyhpaWQpOworICAgIEludGVybmVkRGF0YVR5cGU6OkFkZCgKKyAgICAgICAgY3R4
LT5pbmNyZW1lbnRhbF9zdGF0ZV8tPnNlcmlhbGl6ZWRfaW50ZXJuZWRfZGF0YS5nZXQoKSwgaWlk
LAorICAgICAgICBzdGQ6Om1vdmUodmFsdWUpLCBzdGQ6OmZvcndhcmQ8QXJncz4oYWRkX2FyZ3Mp
Li4uKTsKKyAgICByZXR1cm4gaWlkOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgSW50ZXJu
ZWREYXRhVHlwZSogR2V0T3JDcmVhdGVJbmRleEZvckZpZWxkKAorICAgICAgaW50ZXJuYWw6OlRy
YWNrRXZlbnRJbmNyZW1lbnRhbFN0YXRlKiBpbmNyZW1lbnRhbF9zdGF0ZSkgeworICAgIC8vIEZh
c3QgcGF0aDogbG9vayBmb3IgbWF0Y2hpbmcgZmllbGQgbnVtYmVyLgorICAgIGZvciAoY29uc3Qg
YXV0byYgZW50cnkgOiBpbmNyZW1lbnRhbF9zdGF0ZS0+aW50ZXJuZWRfZGF0YV9pbmRpY2VzKSB7
CisgICAgICBpZiAoZW50cnkuZmlyc3QgPT0gRmllbGROdW1iZXIpIHsKKyNpZiBQRVJGRVRUT19E
Q0hFQ0tfSVNfT04oKQorICAgICAgICBpZiAoc3RyY21wKFBFUkZFVFRPX0RFQlVHX0ZVTkNUSU9O
X0lERU5USUZJRVIoKSwKKyAgICAgICAgICAgICAgICAgICBlbnRyeS5zZWNvbmQtPnR5cGVfaWRf
KSkgeworICAgICAgICAgIFBFUkZFVFRPX0ZBVEFMKAorICAgICAgICAgICAgICAiSW50ZXJuZWQg
ZGF0YSBhY2Nlc3NlZCB1bmRlciBkaWZmZXJlbnQgdHlwZXMhIFByZXZpb3VzIHR5cGU6ICIKKyAg
ICAgICAgICAgICAgIiVzLiBOZXcgdHlwZTogJXMuIiwKKyAgICAgICAgICAgICAgZW50cnkuc2Vj
b25kLT50eXBlX2lkXywgUEVSRkVUVE9fREVCVUdfRlVOQ1RJT05fSURFTlRJRklFUigpKTsKKyAg
ICAgICAgfQorI2VuZGlmICAvLyBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICAgICAgICByZXR1
cm4gcmVpbnRlcnByZXRfY2FzdDxJbnRlcm5lZERhdGFUeXBlKj4oZW50cnkuc2Vjb25kLmdldCgp
KTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gTm8gbWF0Y2ggLS0gYWRkIGEgbmV3IGVudHJ5IGZv
ciB0aGlzIGZpZWxkLgorICAgIGZvciAoYXV0byYgZW50cnkgOiBpbmNyZW1lbnRhbF9zdGF0ZS0+
aW50ZXJuZWRfZGF0YV9pbmRpY2VzKSB7CisgICAgICBpZiAoIWVudHJ5LmZpcnN0KSB7CisgICAg
ICAgIGVudHJ5LmZpcnN0ID0gRmllbGROdW1iZXI7CisgICAgICAgIGVudHJ5LnNlY29uZC5yZXNl
dChuZXcgSW50ZXJuZWREYXRhVHlwZSgpKTsKKyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQor
ICAgICAgICBlbnRyeS5zZWNvbmQtPnR5cGVfaWRfID0gUEVSRkVUVE9fREVCVUdfRlVOQ1RJT05f
SURFTlRJRklFUigpOworI2VuZGlmICAvLyBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICAgICAg
ICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJbnRlcm5lZERhdGFUeXBlKj4oZW50cnkuc2Vjb25k
LmdldCgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gT3V0IG9mIHNwYWNlIGluIHRoZSBpbnRl
cm5lZCBkYXRhIGluZGV4IHRhYmxlLgorICAgIFBFUkZFVFRPX0NIRUNLKGZhbHNlKTsKKyAgfQor
CisgIC8vIFRoZSBhY3R1YWwgaW50ZXJuaW5nIGRpY3Rpb25hcnkgZm9yIHRoaXMgdHlwZSBvZiBp
bnRlcm5lZCBkYXRhLiBUaGUgYWN0dWFsCisgIC8vIGNvbnRhaW5lciB0eXBlIGlzIGRlZmluZWQg
YnkgfFRyYWl0c3wsIGhlbmNlIHRoZSBleHRyYSBsYXllciBvZiB0ZW1wbGF0ZQorICAvLyBpbmRp
cmVjdGlvbiBoZXJlLgorICB0eXBlbmFtZSBUcmFpdHM6OnRlbXBsYXRlIEluZGV4PFZhbHVlVHlw
ZT4gaW5kZXhfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8g
SU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNLX0VWRU5UX0lOVEVSTkVEX0RBVEFfSU5ERVhf
SF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8v
Y29tbW9uL3RyYWNrX2V2ZW50X2Rlc2NyaXB0b3IucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQg
YnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVm
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1RSQUNLX0VWRU5UX0RFU0NS
SVBUT1JfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19D
T01NT05fVFJBQ0tfRVZFTlRfREVTQ1JJUFRPUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVm
Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVk
X2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKwor
Y2xhc3MgVHJhY2tFdmVudENhdGVnb3J5OworCitjbGFzcyBUcmFja0V2ZW50RGVzY3JpcHRvcl9E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVi
bGljOgorICBUcmFja0V2ZW50RGVzY3JpcHRvcl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBUcmFja0V2ZW50RGVzY3JpcHRvcl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNrRXZlbnREZXNjcmlwdG9yX0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2F2YWlsYWJsZV9jYXRlZ29y
aWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpS
ZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGF2YWlsYWJsZV9j
YXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0
Qnl0ZXM+KDEpOyB9Cit9OworCitjbGFzcyBUcmFja0V2ZW50RGVzY3JpcHRvciA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2tF
dmVudERlc2NyaXB0b3JfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtBdmFpbGFi
bGVDYXRlZ29yaWVzRmllbGROdW1iZXIgPSAxLAorICB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IFRyYWNrRXZlbnRDYXRlZ29yeT4gVCogYWRkX2F2YWlsYWJsZV9jYXRlZ29yaWVzKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMSk7CisgIH0KKworfTsKKworY2xhc3Mg
VHJhY2tFdmVudENhdGVnb3J5X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFRyYWNrRXZlbnRDYXRlZ29yeV9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50Q2F0ZWdvcnlfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUcmFja0V2
ZW50Q2F0ZWdvcnlfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBi
b29sIGhhc19kZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBkZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdGFncygpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6
cHJvdG96ZXJvOjpDb25zdENoYXJzPiB0YWdzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8
Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+KDMpOyB9Cit9OworCitjbGFzcyBUcmFja0V2ZW50Q2F0
ZWdvcnkgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IFRyYWNrRXZlbnRDYXRlZ29yeV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga0Rlc2NyaXB0aW9uRmllbGROdW1iZXIg
PSAyLAorICAgIGtUYWdzRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9uYW1lKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEs
IHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAg
dm9pZCBzZXRfZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X2Rlc2NyaXB0aW9uKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5k
Qnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBhZGRfdGFncyhjb25zdCBzdGQ6OnN0
cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNp
emUoKSk7CisgIH0KKyAgdm9pZCBhZGRfdGFncyhjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUpOworICB9Cit9OworCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIElu
Y2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9z
L3BlcmZldHRvL3RyYWNlL3RyYWNlX3BhY2tldF9kZWZhdWx0cy5wYnplcm8uaAorLy8gQXV0b2dl
bmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisK
KyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDRV9QQUNL
RVRfREVGQVVMVFNfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19UUkFDRV9UUkFDRV9QQUNLRVRfREVGQVVMVFNfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0
ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBl
YXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7
CisKK2NsYXNzIFRyYWNrRXZlbnREZWZhdWx0czsKKworY2xhc3MgVHJhY2VQYWNrZXREZWZhdWx0
c19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzU4LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsK
KyBwdWJsaWM6CisgIFRyYWNlUGFja2V0RGVmYXVsdHNfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgVHJhY2VQYWNrZXREZWZhdWx0c19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlUGFja2V0RGVmYXVsdHNf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdGltZXN0YW1wX2Nsb2Nr
X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8NTg+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB0aW1l
c3RhbXBfY2xvY2tfaWQoKSBjb25zdCB7IHJldHVybiBhdDw1OD4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc190cmFja19ldmVudF9kZWZhdWx0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdHJhY2tfZXZlbnRfZGVmYXVs
dHMoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBU
cmFjZVBhY2tldERlZmF1bHRzIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFjZVBhY2tldERlZmF1bHRzX0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrVGltZXN0YW1wQ2xvY2tJZEZpZWxkTnVtYmVyID0gNTgsCisg
ICAga1RyYWNrRXZlbnREZWZhdWx0c0ZpZWxkTnVtYmVyID0gMTEsCisgIH07CisgIHZvaWQgc2V0
X3RpbWVzdGFtcF9jbG9ja19pZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1
OCwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2tFdmVudERlZmF1
bHRzPiBUKiBzZXRfdHJhY2tfZXZlbnRfZGVmYXVsdHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPigxMSk7CisgIH0KKworfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cisg
KgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhl
ICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21w
bGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhl
IExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9M
SUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh
Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBM
aWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdB
UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w
bGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVy
bmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgor
ICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Ry
YWNpbmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfaW50ZXJuYWwuaCIKKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9wcm9jX3V0aWxzLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3RocmVhZF91
dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
YmFzZS90aW1lLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by90cmFjaW5nL2NvcmUvZGF0YV9zb3VyY2VfY29uZmlnLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50LmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3Ry
YWNrX2V2ZW50X2NhdGVnb3J5X3JlZ2lzdHJ5LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50X2ludGVybmVkX2RhdGFf
aW5kZXguaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9w
ZXJmZXR0by9jb21tb24vZGF0YV9zb3VyY2VfZGVzY3JpcHRvci5nZW4uaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24vdHJhY2tf
ZXZlbnRfZGVzY3JpcHRvci5wYnplcm8uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS9pbnRlcm5lZF9kYXRhL2ludGVybmVkX2Rh
dGEucGJ6ZXJvLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90
b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2VfcGFja2V0X2RlZmF1bHRzLnBiemVyby5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3Ry
YWNrX2V2ZW50L2RlYnVnX2Fubm90YXRpb24ucGJ6ZXJvLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdHJh
Y2tfZGVzY3JpcHRvci5wYnplcm8uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFj
ZSBpbnRlcm5hbCB7CisKK0Jhc2VUcmFja0V2ZW50SW50ZXJuZWREYXRhSW5kZXg6On5CYXNlVHJh
Y2tFdmVudEludGVybmVkRGF0YUluZGV4KCkgPSBkZWZhdWx0OworCituYW1lc3BhY2UgeworCitz
dGQ6OmF0b21pYzxwZXJmZXR0bzo6YmFzZTo6UGxhdGZvcm1UaHJlYWRJZD4gZ19tYWluX3RocmVh
ZDsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciBrTGVnYWN5U2xvd1ByZWZpeFtdID0gImRp
c2FibGVkLWJ5LWRlZmF1bHQtIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciBrU2xvd1Rh
Z1tdID0gInNsb3ciOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyIGtEZWJ1Z1RhZ1tdID0g
ImRlYnVnIjsKKworc3RydWN0IEludGVybmVkRXZlbnRDYXRlZ29yeQorICAgIDogcHVibGljIFRy
YWNrRXZlbnRJbnRlcm5lZERhdGFJbmRleDwKKyAgICAgICAgICBJbnRlcm5lZEV2ZW50Q2F0ZWdv
cnksCisgICAgICAgICAgcGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpJbnRlcm5lZERhdGE6OmtF
dmVudENhdGVnb3JpZXNGaWVsZE51bWJlciwKKyAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAg
ICAgICBTbWFsbEludGVybmVkRGF0YVRyYWl0cz4geworICBzdGF0aWMgdm9pZCBBZGQocHJvdG9z
OjpwYnplcm86OkludGVybmVkRGF0YSogaW50ZXJuZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAg
IHNpemVfdCBpaWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwKKyAgICAg
ICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKKyAgICBhdXRvIGNhdGVnb3J5ID0gaW50ZXJu
ZWRfZGF0YS0+YWRkX2V2ZW50X2NhdGVnb3JpZXMoKTsKKyAgICBjYXRlZ29yeS0+c2V0X2lpZChp
aWQpOworICAgIGNhdGVnb3J5LT5zZXRfbmFtZSh2YWx1ZSwgbGVuZ3RoKTsKKyAgfQorfTsKKwor
c3RydWN0IEludGVybmVkRXZlbnROYW1lCisgICAgOiBwdWJsaWMgVHJhY2tFdmVudEludGVybmVk
RGF0YUluZGV4PAorICAgICAgICAgIEludGVybmVkRXZlbnROYW1lLAorICAgICAgICAgIHBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6SW50ZXJuZWREYXRhOjprRXZlbnROYW1lc0ZpZWxkTnVtYmVy
LAorICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgIFNtYWxsSW50ZXJuZWREYXRhVHJh
aXRzPiB7CisgIHN0YXRpYyB2b2lkIEFkZChwcm90b3M6OnBiemVybzo6SW50ZXJuZWREYXRhKiBp
bnRlcm5lZF9kYXRhLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IGlpZCwKKyAgICAgICAgICAg
ICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgICAgYXV0byBuYW1lID0gaW50ZXJuZWRfZGF0
YS0+YWRkX2V2ZW50X25hbWVzKCk7CisgICAgbmFtZS0+c2V0X2lpZChpaWQpOworICAgIG5hbWUt
PnNldF9uYW1lKHZhbHVlKTsKKyAgfQorfTsKKworc3RydWN0IEludGVybmVkRGVidWdBbm5vdGF0
aW9uTmFtZQorICAgIDogcHVibGljIFRyYWNrRXZlbnRJbnRlcm5lZERhdGFJbmRleDwKKyAgICAg
ICAgICBJbnRlcm5lZERlYnVnQW5ub3RhdGlvbk5hbWUsCisgICAgICAgICAgcGVyZmV0dG86OnBy
b3Rvczo6cGJ6ZXJvOjpJbnRlcm5lZERhdGE6OgorICAgICAgICAgICAgICBrRGVidWdBbm5vdGF0
aW9uTmFtZXNGaWVsZE51bWJlciwKKyAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICBT
bWFsbEludGVybmVkRGF0YVRyYWl0cz4geworICBzdGF0aWMgdm9pZCBBZGQocHJvdG9zOjpwYnpl
cm86OkludGVybmVkRGF0YSogaW50ZXJuZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgIHNpemVf
dCBpaWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIGF1dG8g
bmFtZSA9IGludGVybmVkX2RhdGEtPmFkZF9kZWJ1Z19hbm5vdGF0aW9uX25hbWVzKCk7CisgICAg
bmFtZS0+c2V0X2lpZChpaWQpOworICAgIG5hbWUtPnNldF9uYW1lKHZhbHVlKTsKKyAgfQorfTsK
KworZW51bSBjbGFzcyBNYXRjaFR5cGUgeyBrRXhhY3QsIGtQYXR0ZXJuIH07CisKK2Jvb2wgTmFt
ZU1hdGNoZXNQYXR0ZXJuKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXR0ZXJuLAorICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAg
ICAgICBNYXRjaFR5cGUgbWF0Y2hfdHlwZSkgeworICAvLyBUbyBhdm9pZCBwdWxsaW5nIGluIGFs
bCBvZiBzdGQ6OnJlZ2V4LCBmb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSAiKiIKKyAg
Ly8gd2lsZGNhcmQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KKyAgc2l6ZV90IGkgPSBwYXR0
ZXJuLmZpbmQoJyonKTsKKyAgaWYgKGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBQRVJG
RVRUT19EQ0hFQ0soaSA9PSBwYXR0ZXJuLnNpemUoKSAtIDEpOworICAgIGlmIChtYXRjaF90eXBl
ICE9IE1hdGNoVHlwZTo6a1BhdHRlcm4pCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJu
IG5hbWUuc3Vic3RyKDAsIGkpID09IHBhdHRlcm4uc3Vic3RyKDAsIGkpOworICB9CisgIHJldHVy
biBuYW1lID09IHBhdHRlcm47Cit9CisKK2Jvb2wgTmFtZU1hdGNoZXNQYXR0ZXJuTGlzdChjb25z
dCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhdHRlcm5zLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIE1hdGNoVHlwZSBtYXRjaF90eXBlKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGF0dGVy
biA6IHBhdHRlcm5zKSB7CisgICAgaWYgKE5hbWVNYXRjaGVzUGF0dGVybihwYXR0ZXJuLCBuYW1l
LCBtYXRjaF90eXBlKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsK
K30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworYm9vbCBUcmFja0V2ZW50SW50ZXJu
YWw6OkluaXRpYWxpemUoCisgICAgY29uc3QgVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0cnkmIHJl
Z2lzdHJ5LAorICAgIGJvb2wgKCpyZWdpc3Rlcl9kYXRhX3NvdXJjZSkoY29uc3QgRGF0YVNvdXJj
ZURlc2NyaXB0b3ImKSkgeworICBpZiAoIWdfbWFpbl90aHJlYWQpCisgICAgZ19tYWluX3RocmVh
ZCA9IHBlcmZldHRvOjpiYXNlOjpHZXRUaHJlYWRJZCgpOworCisgIERhdGFTb3VyY2VEZXNjcmlw
dG9yIGRzZDsKKyAgZHNkLnNldF9uYW1lKCJ0cmFja19ldmVudCIpOworCisgIHByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50RGVzY3JpcHRvcj4gdGVkOwor
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlZ2lzdHJ5LmNhdGVnb3J5X2NvdW50KCk7IGkrKykg
eworICAgIGF1dG8gY2F0ZWdvcnkgPSByZWdpc3RyeS5HZXRDYXRlZ29yeShpKTsKKyAgICAvLyBE
b24ndCByZWdpc3RlciBncm91cCBjYXRlZ29yaWVzLgorICAgIGlmIChjYXRlZ29yeS0+SXNHcm91
cCgpKQorICAgICAgY29udGludWU7CisgICAgYXV0byBjYXQgPSB0ZWQtPmFkZF9hdmFpbGFibGVf
Y2F0ZWdvcmllcygpOworICAgIGNhdC0+c2V0X25hbWUoY2F0ZWdvcnktPm5hbWUpOworICAgIGlm
IChjYXRlZ29yeS0+ZGVzY3JpcHRpb24pCisgICAgICBjYXQtPnNldF9kZXNjcmlwdGlvbihjYXRl
Z29yeS0+ZGVzY3JpcHRpb24pOworICAgIGZvciAoY29uc3QgYXV0byYgdGFnIDogY2F0ZWdvcnkt
PnRhZ3MpIHsKKyAgICAgIGlmICh0YWcpCisgICAgICAgIGNhdC0+YWRkX3RhZ3ModGFnKTsKKyAg
ICB9CisgICAgLy8gRGlzYWJsZWQtYnktZGVmYXVsdCBjYXRlZ29yaWVzIGdldCBhICJzbG93IiB0
YWcuCisgICAgaWYgKCFzdHJuY21wKGNhdGVnb3J5LT5uYW1lLCBrTGVnYWN5U2xvd1ByZWZpeCwg
c3RybGVuKGtMZWdhY3lTbG93UHJlZml4KSkpCisgICAgICBjYXQtPmFkZF90YWdzKGtTbG93VGFn
KTsKKyAgfQorICBkc2Quc2V0X3RyYWNrX2V2ZW50X2Rlc2NyaXB0b3JfcmF3KHRlZC5TZXJpYWxp
emVBc1N0cmluZygpKTsKKworICByZXR1cm4gcmVnaXN0ZXJfZGF0YV9zb3VyY2UoZHNkKTsKK30K
KworLy8gc3RhdGljCit2b2lkIFRyYWNrRXZlbnRJbnRlcm5hbDo6RW5hYmxlVHJhY2luZygKKyAg
ICBjb25zdCBUcmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeSYgcmVnaXN0cnksCisgICAgY29uc3Qg
cHJvdG9zOjpnZW46OlRyYWNrRXZlbnRDb25maWcmIGNvbmZpZywKKyAgICB1aW50MzJfdCBpbnN0
YW5jZV9pbmRleCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlZ2lzdHJ5LmNhdGVnb3J5
X2NvdW50KCk7IGkrKykgeworICAgIGlmIChJc0NhdGVnb3J5RW5hYmxlZChyZWdpc3RyeSwgY29u
ZmlnLCAqcmVnaXN0cnkuR2V0Q2F0ZWdvcnkoaSkpKQorICAgICAgcmVnaXN0cnkuRW5hYmxlQ2F0
ZWdvcnlGb3JJbnN0YW5jZShpLCBpbnN0YW5jZV9pbmRleCk7CisgIH0KK30KKworLy8gc3RhdGlj
Cit2b2lkIFRyYWNrRXZlbnRJbnRlcm5hbDo6RGlzYWJsZVRyYWNpbmcoCisgICAgY29uc3QgVHJh
Y2tFdmVudENhdGVnb3J5UmVnaXN0cnkmIHJlZ2lzdHJ5LAorICAgIHVpbnQzMl90IGluc3RhbmNl
X2luZGV4KSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVnaXN0cnkuY2F0ZWdvcnlfY291
bnQoKTsgaSsrKQorICAgIHJlZ2lzdHJ5LkRpc2FibGVDYXRlZ29yeUZvckluc3RhbmNlKGksIGlu
c3RhbmNlX2luZGV4KTsKK30KKworLy8gc3RhdGljCitib29sIFRyYWNrRXZlbnRJbnRlcm5hbDo6
SXNDYXRlZ29yeUVuYWJsZWQoCisgICAgY29uc3QgVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0cnkm
IHJlZ2lzdHJ5LAorICAgIGNvbnN0IHByb3Rvczo6Z2VuOjpUcmFja0V2ZW50Q29uZmlnJiBjb25m
aWcsCisgICAgY29uc3QgQ2F0ZWdvcnkmIGNhdGVnb3J5KSB7CisgIC8vIElmIHRoaXMgaXMgYSBn
cm91cCBjYXRlZ29yeSwgY2hlY2sgaWYgYW55IG9mIGl0cyBjb25zdGl0dWVudCBjYXRlZ29yaWVz
IGFyZQorICAvLyBlbmFibGVkLiBJZiBzbywgdGhlbiB0aGlzIG9uZSBpcyBlbmFibGVkIHRvby4K
KyAgaWYgKGNhdGVnb3J5LklzR3JvdXAoKSkgeworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7Cisg
ICAgY2F0ZWdvcnkuRm9yRWFjaEdyb3VwTWVtYmVyKFsmXShjb25zdCBjaGFyKiBtZW1iZXJfbmFt
ZSwgc2l6ZV90IG5hbWVfc2l6ZSkgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWdp
c3RyeS5jYXRlZ29yeV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byByZWZfY2F0
ZWdvcnkgPSByZWdpc3RyeS5HZXRDYXRlZ29yeShpKTsKKyAgICAgICAgLy8gR3JvdXBzIGNhbid0
IHJlZmVyIHRvIG90aGVyIGdyb3Vwcy4KKyAgICAgICAgaWYgKHJlZl9jYXRlZ29yeS0+SXNHcm91
cCgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBSZXF1aXJlIGFuIGV4YWN0IG1h
dGNoLgorICAgICAgICBpZiAocmVmX2NhdGVnb3J5LT5uYW1lX3NpemUoKSAhPSBuYW1lX3NpemUg
fHwKKyAgICAgICAgICAgIHN0cm5jbXAocmVmX2NhdGVnb3J5LT5uYW1lLCBtZW1iZXJfbmFtZSwg
bmFtZV9zaXplKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlm
IChJc0NhdGVnb3J5RW5hYmxlZChyZWdpc3RyeSwgY29uZmlnLCAqcmVmX2NhdGVnb3J5KSkgewor
ICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgLy8gQnJlYWsgRm9yRWFjaEdyb3Vw
TWVtYmVyKCkgbG9vcC4KKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBObyBtYXRjaCBmb3VuZCA9PiBrZWVwIGl0ZXJh
dGluZy4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7Cisg
IH0KKworICBhdXRvIGhhc19tYXRjaGluZ190YWcgPSBbJl0oc3RkOjpmdW5jdGlvbjxib29sKGNv
bnN0IGNoYXIqKT4gbWF0Y2hlcikgeworICAgIGZvciAoY29uc3QgYXV0byYgdGFnIDogY2F0ZWdv
cnkudGFncykgeworICAgICAgaWYgKCF0YWcpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKG1h
dGNoZXIodGFnKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIExlZ2FjeSAi
ZGlzYWJsZWQtYnktZGVmYXVsdCIgY2F0ZWdvcmllcyBhdXRvbWF0aWNhbGx5IGdldCB0aGUgInNs
b3ciIHRhZy4KKyAgICBpZiAoIXN0cm5jbXAoY2F0ZWdvcnkubmFtZSwga0xlZ2FjeVNsb3dQcmVm
aXgsIHN0cmxlbihrTGVnYWN5U2xvd1ByZWZpeCkpICYmCisgICAgICAgIG1hdGNoZXIoa1Nsb3dU
YWcpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9
OworCisgIC8vIEZpcnN0IHRyeSBleGFjdCBtYXRjaGVzLCB0aGVuIHBhdHRlcm4gbWF0Y2hlcy4K
KyAgY29uc3Qgc3RkOjphcnJheTxNYXRjaFR5cGUsIDI+IG1hdGNoX3R5cGVzID0geworICAgICAg
e01hdGNoVHlwZTo6a0V4YWN0LCBNYXRjaFR5cGU6OmtQYXR0ZXJufX07CisgIGZvciAoYXV0byBt
YXRjaF90eXBlIDogbWF0Y2hfdHlwZXMpIHsKKyAgICAvLyAxLiBFbmFibGVkIGNhdGVnb3JpZXMu
CisgICAgaWYgKE5hbWVNYXRjaGVzUGF0dGVybkxpc3QoY29uZmlnLmVuYWJsZWRfY2F0ZWdvcmll
cygpLCBjYXRlZ29yeS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNo
X3R5cGUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAyLiBFbmFibGVk
IHRhZ3MuCisgICAgaWYgKGhhc19tYXRjaGluZ190YWcoWyZdKGNvbnN0IGNoYXIqIHRhZykgewor
ICAgICAgICAgIHJldHVybiBOYW1lTWF0Y2hlc1BhdHRlcm5MaXN0KGNvbmZpZy5lbmFibGVkX3Rh
Z3MoKSwgdGFnLCBtYXRjaF90eXBlKTsKKyAgICAgICAgfSkpIHsKKyAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIC8vIDMuIERpc2FibGVkIGNhdGVnb3JpZXMuCisgICAgaWYgKE5hbWVN
YXRjaGVzUGF0dGVybkxpc3QoY29uZmlnLmRpc2FibGVkX2NhdGVnb3JpZXMoKSwgY2F0ZWdvcnku
bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF90eXBlKSkgeworICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIDQuIERpc2FibGVkIHRhZ3MuCisgICAg
aWYgKGhhc19tYXRjaGluZ190YWcoWyZdKGNvbnN0IGNoYXIqIHRhZykgeworICAgICAgICAgIGlm
IChjb25maWcuZGlzYWJsZWRfdGFnc19zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOYW1l
TWF0Y2hlc1BhdHRlcm5MaXN0KGNvbmZpZy5kaXNhYmxlZF90YWdzKCksIHRhZywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3R5cGUpOworICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgInNsb3ciIGFuZCAiZGVidWciIHRhZ3MgYXJl
IGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICByZXR1cm4gTmFtZU1hdGNoZXNQYXR0
ZXJuKGtTbG93VGFnLCB0YWcsIG1hdGNoX3R5cGUpIHx8CisgICAgICAgICAgICAgICAgICAgTmFt
ZU1hdGNoZXNQYXR0ZXJuKGtEZWJ1Z1RhZywgdGFnLCBtYXRjaF90eXBlKTsKKyAgICAgICAgICB9
CisgICAgICAgIH0pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8g
SWYgbm90aGluZyBtYXRjaGVkLCBlbmFibGUgdGhlIGNhdGVnb3J5IGJ5IGRlZmF1bHQuCisgIHJl
dHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK3VpbnQ2NF90IFRyYWNrRXZlbnRJbnRlcm5hbDo6
R2V0VGltZU5zKCkgeworICBpZiAoR2V0Q2xvY2tJZCgpID09IHByb3Rvczo6cGJ6ZXJvOjpCVUlM
VElOX0NMT0NLX0JPT1RUSU1FKQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocGVy
ZmV0dG86OmJhc2U6OkdldEJvb3RUaW1lTnMoKS5jb3VudCgpKTsKKyAgUEVSRkVUVE9fRENIRUNL
KEdldENsb2NrSWQoKSA9PSBwcm90b3M6OnBiemVybzo6QlVJTFRJTl9DTE9DS19NT05PVE9OSUMp
OworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBlcmZldHRvOjpiYXNlOjpHZXRXYWxs
VGltZU5zKCkuY291bnQoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBUcmFja0V2ZW50SW50ZXJu
YWw6OlJlc2V0SW5jcmVtZW50YWxTdGF0ZShUcmFjZVdyaXRlckJhc2UqIHRyYWNlX3dyaXRlciwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qg
dGltZXN0YW1wKSB7CisgIGF1dG8gZGVmYXVsdF90cmFjayA9IFRocmVhZFRyYWNrOjpDdXJyZW50
KCk7CisgIHsKKyAgICAvLyBNYXJrIGFueSBpbmNyZW1lbnRhbCBzdGF0ZSBiZWZvcmUgdGhpcyBw
b2ludCBpbnZhbGlkLiBBbHNvIHNldCB1cAorICAgIC8vIGRlZmF1bHRzIHNvIHRoYXQgd2UgZG9u
J3QgbmVlZCB0byByZXBlYXQgY29uc3RhbnQgZGF0YSBmb3IgZWFjaCBwYWNrZXQuCisgICAgYXV0
byBwYWNrZXQgPSBOZXdUcmFjZVBhY2tldCgKKyAgICAgICAgdHJhY2Vfd3JpdGVyLCB0aW1lc3Rh
bXAsCisgICAgICAgIHByb3Rvczo6cGJ6ZXJvOjpUcmFjZVBhY2tldDo6U0VRX0lOQ1JFTUVOVEFM
X1NUQVRFX0NMRUFSRUQpOworICAgIGF1dG8gZGVmYXVsdHMgPSBwYWNrZXQtPnNldF90cmFjZV9w
YWNrZXRfZGVmYXVsdHMoKTsKKyAgICBkZWZhdWx0cy0+c2V0X3RpbWVzdGFtcF9jbG9ja19pZChH
ZXRDbG9ja0lkKCkpOworCisgICAgLy8gRXN0YWJsaXNoIHRoZSBkZWZhdWx0IHRyYWNrIGZvciB0
aGlzIGV2ZW50IHNlcXVlbmNlLgorICAgIGF1dG8gdHJhY2tfZGVmYXVsdHMgPSBkZWZhdWx0cy0+
c2V0X3RyYWNrX2V2ZW50X2RlZmF1bHRzKCk7CisgICAgdHJhY2tfZGVmYXVsdHMtPnNldF90cmFj
a191dWlkKGRlZmF1bHRfdHJhY2sudXVpZCk7CisgIH0KKworICAvLyBFdmVyeSB0aHJlYWQgc2hv
dWxkIHdyaXRlIGEgZGVzY3JpcHRvciBmb3IgaXRzIGRlZmF1bHQgdHJhY2ssIGJlY2F1c2UgbW9z
dAorICAvLyB0cmFjZSBwb2ludHMgd29uJ3QgZXhwbGljaXRseSByZWZlcmVuY2UgaXQuCisgIFdy
aXRlVHJhY2tEZXNjcmlwdG9yKGRlZmF1bHRfdHJhY2ssIHRyYWNlX3dyaXRlcik7CisKKyAgLy8g
QWRkaXRpb25hbGx5IHRoZSBtYWluIHRocmVhZCBzaG91bGQgZHVtcCB0aGUgcHJvY2VzcyBkZXNj
cmlwdG9yLgorICBpZiAocGVyZmV0dG86OmJhc2U6OkdldFRocmVhZElkKCkgPT0gZ19tYWluX3Ro
cmVhZCkKKyAgICBXcml0ZVRyYWNrRGVzY3JpcHRvcihQcm9jZXNzVHJhY2s6OkN1cnJlbnQoKSwg
dHJhY2Vfd3JpdGVyKTsKK30KKworLy8gc3RhdGljCitwcm90b3plcm86Ok1lc3NhZ2VIYW5kbGU8
cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0PgorVHJhY2tFdmVudEludGVybmFsOjpOZXdUcmFj
ZVBhY2tldChUcmFjZVdyaXRlckJhc2UqIHRyYWNlX3dyaXRlciwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXFfZmxhZ3MpIHsKKyAgYXV0byBwYWNrZXQgPSB0
cmFjZV93cml0ZXItPk5ld1RyYWNlUGFja2V0KCk7CisgIHBhY2tldC0+c2V0X3RpbWVzdGFtcCh0
aW1lc3RhbXApOworICAvLyBUT0RPKHNreW9zdGlsKTogU3RvcCBlbWl0dGluZyB0aGlzIGZvciBl
dmVyeSBldmVudCBvbmNlIHRoZSB0cmFjZQorICAvLyBwcm9jZXNzb3IgdW5kZXJzdGFuZHMgdHJh
Y2UgcGFja2V0IGRlZmF1bHRzLgorICBpZiAoR2V0Q2xvY2tJZCgpICE9IHByb3Rvczo6cGJ6ZXJv
OjpCVUlMVElOX0NMT0NLX0JPT1RUSU1FKQorICAgIHBhY2tldC0+c2V0X3RpbWVzdGFtcF9jbG9j
a19pZChHZXRDbG9ja0lkKCkpOworICBwYWNrZXQtPnNldF9zZXF1ZW5jZV9mbGFncyhzZXFfZmxh
Z3MpOworICByZXR1cm4gcGFja2V0OworfQorCisvLyBzdGF0aWMKK0V2ZW50Q29udGV4dCBUcmFj
a0V2ZW50SW50ZXJuYWw6OldyaXRlRXZlbnQoCisgICAgVHJhY2VXcml0ZXJCYXNlKiB0cmFjZV93
cml0ZXIsCisgICAgVHJhY2tFdmVudEluY3JlbWVudGFsU3RhdGUqIGluY3Jfc3RhdGUsCisgICAg
Y29uc3QgQ2F0ZWdvcnkqIGNhdGVnb3J5LAorICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgcGVy
ZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUeXBlIHR5cGUsCisgICAgdWludDY0
X3QgdGltZXN0YW1wKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhnX21haW5fdGhyZWFkKTsKKworICBp
ZiAoaW5jcl9zdGF0ZS0+d2FzX2NsZWFyZWQpIHsKKyAgICBpbmNyX3N0YXRlLT53YXNfY2xlYXJl
ZCA9IGZhbHNlOworICAgIFJlc2V0SW5jcmVtZW50YWxTdGF0ZSh0cmFjZV93cml0ZXIsIHRpbWVz
dGFtcCk7CisgIH0KKyAgYXV0byBwYWNrZXQgPSBOZXdUcmFjZVBhY2tldCh0cmFjZV93cml0ZXIs
IHRpbWVzdGFtcCk7CisgIEV2ZW50Q29udGV4dCBjdHgoc3RkOjptb3ZlKHBhY2tldCksIGluY3Jf
c3RhdGUpOworCisgIGF1dG8gdHJhY2tfZXZlbnQgPSBjdHguZXZlbnQoKTsKKyAgaWYgKHR5cGUg
IT0gcHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlRZUEVfVU5TUEVDSUZJRUQpCisgICAgdHJh
Y2tfZXZlbnQtPnNldF90eXBlKHR5cGUpOworCisgIC8vIFdlIGFzc3VtZSB0aGF0IHxjYXRlZ29y
eXwgYW5kIHxuYW1lfCBwb2ludCB0byBzdHJpbmdzIHdpdGggc3RhdGljIGxpZmV0aW1lLgorICAv
LyBUaGlzIG1lYW5zIHdlIGNhbiB1c2UgdGhlaXIgYWRkcmVzc2VzIGFzIGludGVybmluZyBrZXlz
LgorICBpZiAoY2F0ZWdvcnkgJiYgdHlwZSAhPSBwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6
VFlQRV9TTElDRV9FTkQpIHsKKyAgICBjYXRlZ29yeS0+Rm9yRWFjaEdyb3VwTWVtYmVyKAorICAg
ICAgICBbJl0oY29uc3QgY2hhciogbWVtYmVyX25hbWUsIHNpemVfdCBuYW1lX3NpemUpIHsKKyAg
ICAgICAgICBzaXplX3QgY2F0ZWdvcnlfaWlkID0KKyAgICAgICAgICAgICAgSW50ZXJuZWRFdmVu
dENhdGVnb3J5OjpHZXQoJmN0eCwgbWVtYmVyX25hbWUsIG5hbWVfc2l6ZSk7CisgICAgICAgICAg
dHJhY2tfZXZlbnQtPmFkZF9jYXRlZ29yeV9paWRzKGNhdGVnb3J5X2lpZCk7CisgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIH0pOworICB9CisgIGlmIChuYW1lKSB7CisgICAgc2l6ZV90
IG5hbWVfaWlkID0gSW50ZXJuZWRFdmVudE5hbWU6OkdldCgmY3R4LCBuYW1lKTsKKyAgICB0cmFj
a19ldmVudC0+c2V0X25hbWVfaWlkKG5hbWVfaWlkKTsKKyAgfQorICByZXR1cm4gY3R4OworfQor
CisvLyBzdGF0aWMKK3Byb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90YXRpb24qIFRyYWNrRXZlbnRJ
bnRlcm5hbDo6QWRkRGVidWdBbm5vdGF0aW9uKAorICAgIHBlcmZldHRvOjpFdmVudENvbnRleHQq
IGV2ZW50X2N0eCwKKyAgICBjb25zdCBjaGFyKiBuYW1lKSB7CisgIGF1dG8gYW5ub3RhdGlvbiA9
IGV2ZW50X2N0eC0+ZXZlbnQoKS0+YWRkX2RlYnVnX2Fubm90YXRpb25zKCk7CisgIGFubm90YXRp
b24tPnNldF9uYW1lX2lpZChJbnRlcm5lZERlYnVnQW5ub3RhdGlvbk5hbWU6OkdldChldmVudF9j
dHgsIG5hbWUpKTsKKyAgcmV0dXJuIGFubm90YXRpb247Cit9CisKK30gIC8vIG5hbWVzcGFjZSBp
bnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gc291cmNlOiBzcmMvdHJhY2luZy9wbGF0Zm9ybS5jYworLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5k
ZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5
b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExp
Y2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisg
KiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAq
IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGlu
Zywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1
dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElU
SU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUg
TGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBh
bmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvcGxhdGZvcm0uaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcv
aW50ZXJuYWwvdHJhY2luZ190bHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvdHJhY2Vfd3JpdGVyX2Jhc2UuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKKworUGxhdGZvcm1UaHJlYWRMb2NhbE9iamVjdDo6flBsYXRmb3JtVGhyZWFk
TG9jYWxPYmplY3QoKSA9IGRlZmF1bHQ7CitQbGF0Zm9ybTo6flBsYXRmb3JtKCkgPSBkZWZhdWx0
OworCisvLyBzdGF0aWMKK3N0ZDo6dW5pcXVlX3B0cjxQbGF0Zm9ybVRocmVhZExvY2FsT2JqZWN0
PgorUGxhdGZvcm1UaHJlYWRMb2NhbE9iamVjdDo6Q3JlYXRlSW5zdGFuY2UoKSB7CisgIHJldHVy
biBzdGQ6OnVuaXF1ZV9wdHI8UGxhdGZvcm1UaHJlYWRMb2NhbE9iamVjdD4obmV3IGludGVybmFs
OjpUcmFjaW5nVExTKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFjaW5nL3RyYWNpbmcuY2MKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAq
IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGlj
ZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5j
ZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNl
bnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5T
RS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVk
IHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5z
ZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5U
SUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQu
CisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcg
cGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5n
L3RyYWNpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfaW50ZXJuYWwuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInNyYy90cmFjaW5nL2ludGVybmFsL3RyYWNpbmdf
bXV4ZXJfaW1wbC5oIgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUg
PG11dGV4PgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCisvLyBzdGF0aWMKK3ZvaWQgVHJhY2lu
Zzo6SW5pdGlhbGl6ZUludGVybmFsKGNvbnN0IFRyYWNpbmdJbml0QXJncyYgYXJncykgeworICBz
dGF0aWMgYm9vbCB3YXNfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgc3RhdGljIFRyYWNpbmdJbml0
QXJncyBpbml0X2FyZ3M7CisgIGlmICh3YXNfaW5pdGlhbGl6ZWQpIHsKKyAgICAvLyBTaG91bGQg
bm90IGJlIHJlaW5pdGlhbGl6ZWQgd2l0aCBkaWZmZXJlbnQgYXJncy4KKyAgICBQRVJGRVRUT19E
Q0hFQ0soaW5pdF9hcmdzID09IGFyZ3MpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE1ha2Ug
c3VyZSB0aGUgaGVhZGVycyBhbmQgaW1wbGVtZW50YXRpb24gZmlsZXMgYWdyZWUgb24gdGhlIGJ1
aWxkIGNvbmZpZy4KKyAgUEVSRkVUVE9fQ0hFQ0soYXJncy5kY2hlY2tfaXNfb25fID09IFBFUkZF
VFRPX0RDSEVDS19JU19PTigpKTsKKyAgaW50ZXJuYWw6OlRyYWNpbmdNdXhlckltcGw6OkluaXRp
YWxpemVJbnN0YW5jZShhcmdzKTsKKyAgaW50ZXJuYWw6OlRyYWNrUmVnaXN0cnk6OkluaXRpYWxp
emVJbnN0YW5jZSgpOworICB3YXNfaW5pdGlhbGl6ZWQgPSB0cnVlOworICBpbml0X2FyZ3MgPSBh
cmdzOworfQorCisvLyAgc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8VHJhY2luZ1Nlc3Npb24+IFRy
YWNpbmc6Ok5ld1RyYWNlKEJhY2tlbmRUeXBlIGJhY2tlbmQpIHsKKyAgcmV0dXJuIHN0YXRpY19j
YXN0PGludGVybmFsOjpUcmFjaW5nTXV4ZXJJbXBsKj4oaW50ZXJuYWw6OlRyYWNpbmdNdXhlcjo6
R2V0KCkpCisgICAgICAtPkNyZWF0ZVRyYWNpbmdTZXNzaW9uKGJhY2tlbmQpOworfQorCitzdGQ6
OnZlY3RvcjxjaGFyPiBUcmFjaW5nU2Vzc2lvbjo6UmVhZFRyYWNlQmxvY2tpbmcoKSB7CisgIHN0
ZDo6dmVjdG9yPGNoYXI+IHJhd190cmFjZTsKKyAgc3RkOjptdXRleCBtdXRleDsKKyAgc3RkOjpj
b25kaXRpb25fdmFyaWFibGUgY3Y7CisgIGJvb2wgYWxsX3JlYWQgPSBmYWxzZTsKKworICBSZWFk
VHJhY2UoWyZtdXRleCwgJnJhd190cmFjZSwgJmFsbF9yZWFkLCAmY3ZdKFJlYWRUcmFjZUNhbGxi
YWNrQXJncyBjYikgeworICAgIHJhd190cmFjZS5pbnNlcnQocmF3X3RyYWNlLmVuZCgpLCBjYi5k
YXRhLCBjYi5kYXRhICsgY2Iuc2l6ZSk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4
PiBsb2NrKG11dGV4KTsKKyAgICBhbGxfcmVhZCA9ICFjYi5oYXNfbW9yZTsKKyAgICBpZiAoYWxs
X3JlYWQpCisgICAgICBjdi5ub3RpZnlfb25lKCk7CisgIH0pOworCisgIHsKKyAgICBzdGQ6OnVu
aXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIGN2LndhaXQobG9jaywgWyZh
bGxfcmVhZF0geyByZXR1cm4gYWxsX3JlYWQ7IH0pOworICB9CisgIHJldHVybiByYXdfdHJhY2U7
Cit9CisKK1RyYWNpbmdTZXNzaW9uOjpHZXRUcmFjZVN0YXRzQ2FsbGJhY2tBcmdzCitUcmFjaW5n
U2Vzc2lvbjo6R2V0VHJhY2VTdGF0c0Jsb2NraW5nKCkgeworICBzdGQ6Om11dGV4IG11dGV4Owor
ICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdjsKKyAgR2V0VHJhY2VTdGF0c0NhbGxiYWNrQXJn
cyByZXN1bHQ7CisgIGJvb2wgc3RhdHNfcmVhZCA9IGZhbHNlOworCisgIEdldFRyYWNlU3RhdHMo
CisgICAgICBbJm11dGV4LCAmcmVzdWx0LCAmc3RhdHNfcmVhZCwgJmN2XShHZXRUcmFjZVN0YXRz
Q2FsbGJhY2tBcmdzIGFyZ3MpIHsKKyAgICAgICAgcmVzdWx0ID0gc3RkOjptb3ZlKGFyZ3MpOwor
ICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAg
ICBzdGF0c19yZWFkID0gdHJ1ZTsKKyAgICAgICAgY3Yubm90aWZ5X29uZSgpOworICAgICAgfSk7
CisKKyAgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7Cisg
ICAgY3Yud2FpdChsb2NrLCBbJnN0YXRzX3JlYWRdIHsgcmV0dXJuIHN0YXRzX3JlYWQ7IH0pOwor
ICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcvdHJhY2suY2MKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJh
Y2tfZXZlbnQvcHJvY2Vzc19kZXNjcmlwdG9yLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5
IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQ
RVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX1BST0NFU1Nf
REVTQ1JJUFRPUl9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX1RSQUNFX1RSQUNLX0VWRU5UX1BST0NFU1NfREVTQ1JJUFRPUl9QUk9UT19IXworCisjaW5j
bHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFj
a2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5o
IgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2Ug
cGJ6ZXJvIHsKKworZW51bSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZSA6IGlu
dDMyX3Q7CisKK2VudW0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGUgOiBpbnQz
Ml90IHsKKyAgUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19VTlNQ
RUNJRklFRCA9IDAsCisgIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NF
U1NfQlJPV1NFUiA9IDEsCisgIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BS
T0NFU1NfUkVOREVSRVIgPSAyLAorICBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlw
ZV9QUk9DRVNTX1VUSUxJVFkgPSAzLAorICBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNz
VHlwZV9QUk9DRVNTX1pZR09URSA9IDQsCisgIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nl
c3NUeXBlX1BST0NFU1NfU0FOREJPWF9IRUxQRVIgPSA1LAorICBQcm9jZXNzRGVzY3JpcHRvcl9D
aHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX0dQVSA9IDYsCisgIFByb2Nlc3NEZXNjcmlwdG9yX0No
cm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfUExVR0lOID0gNywKKyAgUHJvY2Vzc0Rlc2Ny
aXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19QUEFQSV9CUk9LRVIgPSA4LAorfTsKKwor
Y29uc3QgUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGUgUHJvY2Vzc0Rlc2NyaXB0
b3JfQ2hyb21lUHJvY2Vzc1R5cGVfTUlOID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vz
c1R5cGVfUFJPQ0VTU19VTlNQRUNJRklFRDsKK2NvbnN0IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9t
ZVByb2Nlc3NUeXBlIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX01BWCA9IFBy
b2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfQlJPS0VSOwor
CitjbGFzcyBQcm9jZXNzRGVzY3JpcHRvcl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBQcm9jZXNzRGVzY3JpcHRvcl9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBQcm9jZXNzRGVzY3JpcHRvcl9EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFBy
b2Nlc3NEZXNjcmlwdG9yX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBpZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19jbWRsaW5l
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IGNtZGxpbmUoKSBjb25z
dCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMik7IH0KKyAg
Ym9vbCBoYXNfcHJvY2Vzc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHByb2Nlc3NfbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDY+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfcHJvY2Vzc19wcmlvcml0eSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHByb2Nlc3NfcHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfY2hy
b21lX3Byb2Nlc3NfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBp
bnQzMl90IGNocm9tZV9wcm9jZXNzX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2lu
dDMyKCk7IH0KKyAgYm9vbCBoYXNfbGVnYWN5X3NvcnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBsZWdhY3lfc29ydF9pbmRleCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0
b3IgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IFByb2Nlc3NEZXNjcmlwdG9yX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrUGlkRmllbGROdW1iZXIgPSAxLAorICAgIGtDbWRsaW5lRmllbGROdW1iZXIgPSAyLAorICAg
IGtQcm9jZXNzTmFtZUZpZWxkTnVtYmVyID0gNiwKKyAgICBrUHJvY2Vzc1ByaW9yaXR5RmllbGRO
dW1iZXIgPSA1LAorICAgIGtDaHJvbWVQcm9jZXNzVHlwZUZpZWxkTnVtYmVyID0gNCwKKyAgICBr
TGVnYWN5U29ydEluZGV4RmllbGROdW1iZXIgPSAzLAorICB9OworICB1c2luZyBDaHJvbWVQcm9j
ZXNzVHlwZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpQcm9jZXNzRGVzY3JpcHRvcl9D
aHJvbWVQcm9jZXNzVHlwZTsKKyAgc3RhdGljIGNvbnN0IENocm9tZVByb2Nlc3NUeXBlIFBST0NF
U1NfVU5TUEVDSUZJRUQgPSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9D
RVNTX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgQ2hyb21lUHJvY2Vzc1R5cGUgUFJPQ0VT
U19CUk9XU0VSID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19C
Uk9XU0VSOworICBzdGF0aWMgY29uc3QgQ2hyb21lUHJvY2Vzc1R5cGUgUFJPQ0VTU19SRU5ERVJF
UiA9IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfUkVOREVSRVI7
CisgIHN0YXRpYyBjb25zdCBDaHJvbWVQcm9jZXNzVHlwZSBQUk9DRVNTX1VUSUxJVFkgPSBQcm9j
ZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1VUSUxJVFk7CisgIHN0YXRp
YyBjb25zdCBDaHJvbWVQcm9jZXNzVHlwZSBQUk9DRVNTX1pZR09URSA9IFByb2Nlc3NEZXNjcmlw
dG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfWllHT1RFOworICBzdGF0aWMgY29uc3QgQ2hy
b21lUHJvY2Vzc1R5cGUgUFJPQ0VTU19TQU5EQk9YX0hFTFBFUiA9IFByb2Nlc3NEZXNjcmlwdG9y
X0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfU0FOREJPWF9IRUxQRVI7CisgIHN0YXRpYyBjb25z
dCBDaHJvbWVQcm9jZXNzVHlwZSBQUk9DRVNTX0dQVSA9IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9t
ZVByb2Nlc3NUeXBlX1BST0NFU1NfR1BVOworICBzdGF0aWMgY29uc3QgQ2hyb21lUHJvY2Vzc1R5
cGUgUFJPQ0VTU19QUEFQSV9QTFVHSU4gPSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNz
VHlwZV9QUk9DRVNTX1BQQVBJX1BMVUdJTjsKKyAgc3RhdGljIGNvbnN0IENocm9tZVByb2Nlc3NU
eXBlIFBST0NFU1NfUFBBUElfQlJPS0VSID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vz
c1R5cGVfUFJPQ0VTU19QUEFQSV9CUk9LRVI7CisgIHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9jbWRsaW5l
KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRh
dGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9jbWRsaW5lKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcHJvY2Vzc19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDYsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIHNldF9wcm9jZXNzX25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAg
ICBBcHBlbmRCeXRlcyg2LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9wcm9jZXNzX3By
aW9yaXR5KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2Nocm9tZV9wcm9jZXNzX3R5cGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OlByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlIHZhbHVlKSB7CisgICAgQXBw
ZW5kVGlueVZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVnYWN5X3NvcnRfaW5k
ZXgoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307
CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNl
bmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6
IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdGhyZWFkX2Rlc2NyaXB0b3Iu
cGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVn
aW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVEhSRUFEX0RFU0NSSVBUT1JfUFJPVE9fSF8KKyNkZWZpbmUg
UEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9USFJFQURf
REVTQ1JJUFRPUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3Rk
aW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3Rv
X2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworZW51bSBUaHJlYWREZXNjcmlw
dG9yX0Nocm9tZVRocmVhZFR5cGUgOiBpbnQzMl90OworCitlbnVtIFRocmVhZERlc2NyaXB0b3Jf
Q2hyb21lVGhyZWFkVHlwZSA6IGludDMyX3QgeworICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRo
cmVhZFR5cGVfQ0hST01FX1RIUkVBRF9VTlNQRUNJRklFRCA9IDAsCisgIFRocmVhZERlc2NyaXB0
b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX01BSU4gPSAxLAorICBUaHJlYWREZXNj
cmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9JTyA9IDIsCisgIFRocmVhZERl
c2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1BPT0xfQkdfV09SS0VSID0g
MywKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfUE9P
TF9GR19XT1JLRVIgPSA0LAorICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hS
T01FX1RIUkVBRF9QT09MX0ZCX0JMT0NLSU5HID0gNSwKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJv
bWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfUE9PTF9CR19CTE9DS0lORyA9IDYsCisgIFRocmVh
ZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1BPT0xfU0VSVklDRSA9
IDcsCisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX0NP
TVBPU0lUT1IgPSA4LAorICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01F
X1RIUkVBRF9WSVpfQ09NUE9TSVRPUiA9IDksCisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhy
ZWFkVHlwZV9DSFJPTUVfVEhSRUFEX0NPTVBPU0lUT1JfV09SS0VSID0gMTAsCisgIFRocmVhZERl
c2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1NFUlZJQ0VfV09SS0VSID0g
MTEsCisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX01F
TU9SWV9JTkZSQSA9IDUwLAorICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hS
T01FX1RIUkVBRF9TQU1QTElOR19QUk9GSUxFUiA9IDUxLAorfTsKKworY29uc3QgVGhyZWFkRGVz
Y3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlw
ZV9NSU4gPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9V
TlNQRUNJRklFRDsKK2NvbnN0IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZSBUaHJl
YWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfTUFYID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJv
bWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfU0FNUExJTkdfUFJPRklMRVI7CisKK2NsYXNzIFRo
cmVhZERlc2NyaXB0b3JfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0Rl
Y29kZXI8LypNQVhfRklFTERfSUQ9Ki84LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERT
PSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRocmVhZERlc2NyaXB0b3JfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgVGhyZWFkRGVzY3JpcHRvcl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRocmVhZERlc2NyaXB0
b3JfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGlkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcGlkKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHRpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190aHJlYWRfbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0aHJlYWRfbmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY2hy
b21lX3RocmVhZF90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGlu
dDMyX3QgY2hyb21lX3RocmVhZF90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQz
MigpOyB9CisgIGJvb2wgaGFzX3JlZmVyZW5jZV90aW1lc3RhbXBfdXMoKSBjb25zdCB7IHJldHVy
biBhdDw2PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCByZWZlcmVuY2VfdGltZXN0YW1wX3VzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3JlZmVyZW5j
ZV90aHJlYWRfdGltZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICBp
bnQ2NF90IHJlZmVyZW5jZV90aHJlYWRfdGltZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCku
YXNfaW50NjQoKTsgfQorICBib29sIGhhc19yZWZlcmVuY2VfdGhyZWFkX2luc3RydWN0aW9uX2Nv
dW50KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgcmVmZXJl
bmNlX3RocmVhZF9pbnN0cnVjdGlvbl9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNf
aW50NjQoKTsgfQorICBib29sIGhhc19sZWdhY3lfc29ydF9pbmRleCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGxlZ2FjeV9zb3J0X2luZGV4KCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBUaHJlYWREZXNjcmlw
dG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBUaHJlYWREZXNjcmlwdG9yX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrUGlkRmllbGROdW1iZXIgPSAxLAorICAgIGtUaWRGaWVsZE51bWJlciA9IDIsCisgICAga1Ro
cmVhZE5hbWVGaWVsZE51bWJlciA9IDUsCisgICAga0Nocm9tZVRocmVhZFR5cGVGaWVsZE51bWJl
ciA9IDQsCisgICAga1JlZmVyZW5jZVRpbWVzdGFtcFVzRmllbGROdW1iZXIgPSA2LAorICAgIGtS
ZWZlcmVuY2VUaHJlYWRUaW1lVXNGaWVsZE51bWJlciA9IDcsCisgICAga1JlZmVyZW5jZVRocmVh
ZEluc3RydWN0aW9uQ291bnRGaWVsZE51bWJlciA9IDgsCisgICAga0xlZ2FjeVNvcnRJbmRleEZp
ZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdXNpbmcgQ2hyb21lVGhyZWFkVHlwZSA9IDo6cGVyZmV0
dG86OnByb3Rvczo6cGJ6ZXJvOjpUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGU7Cisg
IHN0YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9NRV9USFJFQURfVU5TUEVDSUZJRUQg
PSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9VTlNQRUNJ
RklFRDsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01FX1RIUkVBRF9NQUlO
ID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfTUFJTjsK
KyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01FX1RIUkVBRF9JTyA9IFRocmVh
ZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX0lPOworICBzdGF0aWMg
Y29uc3QgQ2hyb21lVGhyZWFkVHlwZSBDSFJPTUVfVEhSRUFEX1BPT0xfQkdfV09SS0VSID0gVGhy
ZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfUE9PTF9CR19XT1JL
RVI7CisgIHN0YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9NRV9USFJFQURfUE9PTF9G
R19XT1JLRVIgPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVB
RF9QT09MX0ZHX1dPUktFUjsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01F
X1RIUkVBRF9QT09MX0ZCX0JMT0NLSU5HID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRU
eXBlX0NIUk9NRV9USFJFQURfUE9PTF9GQl9CTE9DS0lORzsKKyAgc3RhdGljIGNvbnN0IENocm9t
ZVRocmVhZFR5cGUgQ0hST01FX1RIUkVBRF9QT09MX0JHX0JMT0NLSU5HID0gVGhyZWFkRGVzY3Jp
cHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfUE9PTF9CR19CTE9DS0lORzsKKyAg
c3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01FX1RIUkVBRF9QT09MX1NFUlZJQ0Ug
PSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9QT09MX1NF
UlZJQ0U7CisgIHN0YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9NRV9USFJFQURfQ09N
UE9TSVRPUiA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFE
X0NPTVBPU0lUT1I7CisgIHN0YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9NRV9USFJF
QURfVklaX0NPTVBPU0lUT1IgPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hS
T01FX1RIUkVBRF9WSVpfQ09NUE9TSVRPUjsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5
cGUgQ0hST01FX1RIUkVBRF9DT01QT1NJVE9SX1dPUktFUiA9IFRocmVhZERlc2NyaXB0b3JfQ2hy
b21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX0NPTVBPU0lUT1JfV09SS0VSOworICBzdGF0aWMg
Y29uc3QgQ2hyb21lVGhyZWFkVHlwZSBDSFJPTUVfVEhSRUFEX1NFUlZJQ0VfV09SS0VSID0gVGhy
ZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfU0VSVklDRV9XT1JL
RVI7CisgIHN0YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9NRV9USFJFQURfTUVNT1JZ
X0lORlJBID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURf
TUVNT1JZX0lORlJBOworICBzdGF0aWMgY29uc3QgQ2hyb21lVGhyZWFkVHlwZSBDSFJPTUVfVEhS
RUFEX1NBTVBMSU5HX1BST0ZJTEVSID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBl
X0NIUk9NRV9USFJFQURfU0FNUExJTkdfUFJPRklMRVI7CisgIHZvaWQgc2V0X3BpZChpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90
aWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfdGhyZWFkX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoNSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X3RocmVhZF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5k
Qnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2hyb21lX3RocmVhZF90eXBl
KDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVh
ZFR5cGUgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9yZWZlcmVuY2VfdGltZXN0YW1wX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3JlZmVyZW5jZV90aHJlYWRfdGlt
ZV91cyhpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9yZWZlcmVuY2VfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50KGludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlZ2Fj
eV9zb3J0X2luZGV4KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUp
OworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1l
c3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRl
ciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlv
dSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGlj
ZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAq
ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICog
VW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5n
LCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0
ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJ
T05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBM
aWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFu
ZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjay5oIgorCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS91
dWlkLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90
cmFjaW5nL2ludGVybmFsL3RyYWNrX2V2ZW50X2RhdGFfc291cmNlLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZl
bnQvcHJvY2Vzc19kZXNjcmlwdG9yLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3Byb2Nlc3NfZGVz
Y3JpcHRvci5wYnplcm8uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC90aHJlYWRfZGVzY3JpcHRvci5nZW4u
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0
by90cmFjZS90cmFja19ldmVudC90aHJlYWRfZGVzY3JpcHRvci5wYnplcm8uaCIKKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKKworLy8gc3RhdGljCit1aW50NjRfdCBUcmFjazo6cHJvY2Vzc191dWlk
OworCitwcm90b3M6Omdlbjo6VHJhY2tEZXNjcmlwdG9yIFRyYWNrOjpTZXJpYWxpemUoKSBjb25z
dCB7CisgIHByb3Rvczo6Z2VuOjpUcmFja0Rlc2NyaXB0b3IgZGVzYzsKKyAgZGVzYy5zZXRfdXVp
ZCh1dWlkKTsKKyAgaWYgKHBhcmVudF91dWlkKQorICAgIGRlc2Muc2V0X3BhcmVudF91dWlkKHBh
cmVudF91dWlkKTsKKyAgcmV0dXJuIGRlc2M7Cit9CisKK3ZvaWQgVHJhY2s6OlNlcmlhbGl6ZShw
cm90b3M6OnBiemVybzo6VHJhY2tEZXNjcmlwdG9yKiBkZXNjKSBjb25zdCB7CisgIGF1dG8gYnl0
ZXMgPSBTZXJpYWxpemUoKS5TZXJpYWxpemVBc1N0cmluZygpOworICBkZXNjLT5BcHBlbmRSYXdQ
cm90b0J5dGVzKGJ5dGVzLmRhdGEoKSwgYnl0ZXMuc2l6ZSgpKTsKK30KKworcHJvdG9zOjpnZW46
OlRyYWNrRGVzY3JpcHRvciBQcm9jZXNzVHJhY2s6OlNlcmlhbGl6ZSgpIGNvbnN0IHsKKyAgYXV0
byBkZXNjID0gVHJhY2s6OlNlcmlhbGl6ZSgpOworICBhdXRvIHBkID0gZGVzYy5tdXRhYmxlX3By
b2Nlc3MoKTsKKyAgcGQtPnNldF9waWQoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGlkKSk7CisgIC8v
IFRPRE8oc2t5b3N0aWwpOiBSZWNvcmQgY29tbWFuZCBsaW5lLgorICByZXR1cm4gZGVzYzsKK30K
Kwordm9pZCBQcm9jZXNzVHJhY2s6OlNlcmlhbGl6ZShwcm90b3M6OnBiemVybzo6VHJhY2tEZXNj
cmlwdG9yKiBkZXNjKSBjb25zdCB7CisgIGF1dG8gYnl0ZXMgPSBTZXJpYWxpemUoKS5TZXJpYWxp
emVBc1N0cmluZygpOworICBkZXNjLT5BcHBlbmRSYXdQcm90b0J5dGVzKGJ5dGVzLmRhdGEoKSwg
Ynl0ZXMuc2l6ZSgpKTsKK30KKworcHJvdG9zOjpnZW46OlRyYWNrRGVzY3JpcHRvciBUaHJlYWRU
cmFjazo6U2VyaWFsaXplKCkgY29uc3QgeworICBhdXRvIGRlc2MgPSBUcmFjazo6U2VyaWFsaXpl
KCk7CisgIGF1dG8gdGQgPSBkZXNjLm11dGFibGVfdGhyZWFkKCk7CisgIHRkLT5zZXRfcGlkKHN0
YXRpY19jYXN0PGludDMyX3Q+KHBpZCkpOworICB0ZC0+c2V0X3RpZChzdGF0aWNfY2FzdDxpbnQz
Ml90Pih0aWQpKTsKKyAgLy8gVE9ETyhza3lvc3RpbCk6IFJlY29yZCB0aHJlYWQgbmFtZS4KKyAg
cmV0dXJuIGRlc2M7Cit9CisKK3ZvaWQgVGhyZWFkVHJhY2s6OlNlcmlhbGl6ZShwcm90b3M6OnBi
emVybzo6VHJhY2tEZXNjcmlwdG9yKiBkZXNjKSBjb25zdCB7CisgIGF1dG8gYnl0ZXMgPSBTZXJp
YWxpemUoKS5TZXJpYWxpemVBc1N0cmluZygpOworICBkZXNjLT5BcHBlbmRSYXdQcm90b0J5dGVz
KGJ5dGVzLmRhdGEoKSwgYnl0ZXMuc2l6ZSgpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsK
KworLy8gc3RhdGljCitUcmFja1JlZ2lzdHJ5KiBUcmFja1JlZ2lzdHJ5OjppbnN0YW5jZV87CisK
K1RyYWNrUmVnaXN0cnk6OlRyYWNrUmVnaXN0cnkoKSA9IGRlZmF1bHQ7CitUcmFja1JlZ2lzdHJ5
Ojp+VHJhY2tSZWdpc3RyeSgpID0gZGVmYXVsdDsKKworLy8gc3RhdGljCit2b2lkIFRyYWNrUmVn
aXN0cnk6OkluaXRpYWxpemVJbnN0YW5jZSgpIHsKKyAgLy8gVE9ETyhlc2Vja2xlcik6IENocm9t
ZSBtYXkgY2FsbCB0aGlzIG1vcmUgdGhhbiBvbmNlLiBPbmNlIENocm9tZSBkb2Vzbid0CisgIC8v
IGNhbGwgdGhpcyBkaXJlY3RseSBhbnltb3JlLCBicmluZyBiYWNrIERDSEVDSyghaW5zdGFuY2Vf
KSBpbnN0ZWFkLgorICBpZiAoaW5zdGFuY2VfKQorICAgIHJldHVybjsKKyAgaW5zdGFuY2VfID0g
bmV3IFRyYWNrUmVnaXN0cnkoKTsKKyAgVHJhY2s6OnByb2Nlc3NfdXVpZCA9IHN0YXRpY19jYXN0
PHVpbnQ2NF90PihiYXNlOjpVdWlkdjQoKS5sc2IoKSk7Cit9CisKK3ZvaWQgVHJhY2tSZWdpc3Ry
eTo6VXBkYXRlVHJhY2soVHJhY2sgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkX2Rlc2MpIHsKKyAgc3RkOjpsb2NrX2d1
YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKKyAgdHJhY2tzX1t0cmFjay51dWlkXSA9IHN0
ZDo6bW92ZShzZXJpYWxpemVkX2Rlc2MpOworfQorCit2b2lkIFRyYWNrUmVnaXN0cnk6OlVwZGF0
ZVRyYWNrSW1wbCgKKyAgICBUcmFjayB0cmFjaywKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQocHJv
dG9zOjpwYnplcm86OlRyYWNrRGVzY3JpcHRvciopPiBmaWxsX2Z1bmN0aW9uKSB7CisgIGNvbnN0
ZXhwciBzaXplX3Qga0luaXRpYWxTbGljZVNpemUgPSAzMjsKKyAgY29uc3RleHByIHNpemVfdCBr
TWF4aW11bVNsaWNlU2l6ZSA9IDQwOTY7CisgIHByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPHByb3Rv
czo6cGJ6ZXJvOjpUcmFja0Rlc2NyaXB0b3I+IG5ld19kZXNjcmlwdG9yKAorICAgICAga0luaXRp
YWxTbGljZVNpemUsIGtNYXhpbXVtU2xpY2VTaXplKTsKKyAgZmlsbF9mdW5jdGlvbihuZXdfZGVz
Y3JpcHRvci5nZXQoKSk7CisgIGF1dG8gc2VyaWFsaXplZF9kZXNjID0gbmV3X2Rlc2NyaXB0b3Iu
U2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgVXBkYXRlVHJhY2sodHJhY2ssIHNlcmlhbGl6ZWRfZGVz
Yyk7Cit9CisKK3ZvaWQgVHJhY2tSZWdpc3RyeTo6RXJhc2VUcmFjayhUcmFjayB0cmFjaykgewor
ICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOworICB0cmFja3NfLmVy
YXNlKHRyYWNrLnV1aWQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgVHJhY2tSZWdpc3RyeTo6V3Jp
dGVUcmFja0Rlc2NyaXB0b3IoCisgICAgY29uc3QgU2VyaWFsaXplZFRyYWNrRGVzY3JpcHRvciYg
ZGVzYywKKyAgICBwcm90b3plcm86Ok1lc3NhZ2VIYW5kbGU8cHJvdG9zOjpwYnplcm86OlRyYWNl
UGFja2V0PiBwYWNrZXQpIHsKKyAgcGFja2V0LT5BcHBlbmRTdHJpbmcoCisgICAgICBwZXJmZXR0
bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0OjprVHJhY2tEZXNjcmlwdG9yRmllbGROdW1i
ZXIsIGRlc2MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcv
dHJhY2tfZXZlbnRfY2F0ZWdvcnlfcmVnaXN0cnkuY2MKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVy
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91
IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl
bnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICog
ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV
bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs
IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl
ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP
TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp
Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50X2Nh
dGVnb3J5X3JlZ2lzdHJ5LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIHN0YXRpYwor
Q2F0ZWdvcnkgQ2F0ZWdvcnk6OkZyb21EeW5hbWljQ2F0ZWdvcnkoY29uc3QgY2hhciogbmFtZSkg
eworICBpZiAoR2V0TnRoTmFtZVNpemUoMSwgbmFtZSwgbmFtZSkpIHsKKyAgICBDYXRlZ29yeSBn
cm91cChHcm91cChuYW1lKSk7CisgICAgUEVSRkVUVE9fRENIRUNLKGdyb3VwLm5hbWUpOworICAg
IHJldHVybiBncm91cDsKKyAgfQorICBDYXRlZ29yeSBjYXRlZ29yeShuYW1lKTsKKyAgUEVSRkVU
VE9fRENIRUNLKGNhdGVnb3J5Lm5hbWUpOworICByZXR1cm4gY2F0ZWdvcnk7Cit9CisKK0NhdGVn
b3J5IENhdGVnb3J5OjpGcm9tRHluYW1pY0NhdGVnb3J5KAorICAgIGNvbnN0IER5bmFtaWNDYXRl
Z29yeSYgZHluYW1pY19jYXRlZ29yeSkgeworICByZXR1cm4gRnJvbUR5bmFtaWNDYXRlZ29yeShk
eW5hbWljX2NhdGVnb3J5Lm5hbWUuY19zdHIoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7
CisKK3BlcmZldHRvOjpEeW5hbWljQ2F0ZWdvcnkgTnVsbENhdGVnb3J5KGNvbnN0IHBlcmZldHRv
OjpEeW5hbWljQ2F0ZWdvcnkmKSB7CisgIHJldHVybiBwZXJmZXR0bzo6RHluYW1pY0NhdGVnb3J5
e307Cit9CisKK2NvbnN0IENhdGVnb3J5KiBUcmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeTo6R2V0
Q2F0ZWdvcnkoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgIFBFUkZFVFRPX0RDSEVDSyhpbmRleCA8
IGNhdGVnb3J5X2NvdW50Xyk7CisgIHJldHVybiAmY2F0ZWdvcmllc19baW5kZXhdOworfQorCit2
b2lkIFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5OjpFbmFibGVDYXRlZ29yeUZvckluc3RhbmNl
KAorICAgIHNpemVfdCBjYXRlZ29yeV9pbmRleCwKKyAgICB1aW50MzJfdCBpbnN0YW5jZV9pbmRl
eCkgY29uc3QgeworICBQRVJGRVRUT19EQ0hFQ0soaW5zdGFuY2VfaW5kZXggPCBrTWF4RGF0YVNv
dXJjZUluc3RhbmNlcyk7CisgIFBFUkZFVFRPX0RDSEVDSyhjYXRlZ29yeV9pbmRleCA8IGNhdGVn
b3J5X2NvdW50Xyk7CisgIC8vIE1hdGNoZXMgdGhlIGFjcXVpcmVfbG9hZCBpbiBEYXRhU291cmNl
OjpUcmFjZSgpLgorICBzdGF0ZV9zdG9yYWdlX1tjYXRlZ29yeV9pbmRleF0uZmV0Y2hfb3IoCisg
ICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigxdSA8PCBpbnN0YW5jZV9pbmRleCksIHN0ZDo6bWVt
b3J5X29yZGVyX3JlbGVhc2UpOworfQorCit2b2lkIFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5
OjpEaXNhYmxlQ2F0ZWdvcnlGb3JJbnN0YW5jZSgKKyAgICBzaXplX3QgY2F0ZWdvcnlfaW5kZXgs
CisgICAgdWludDMyX3QgaW5zdGFuY2VfaW5kZXgpIGNvbnN0IHsKKyAgUEVSRkVUVE9fRENIRUNL
KGluc3RhbmNlX2luZGV4IDwga01heERhdGFTb3VyY2VJbnN0YW5jZXMpOworICBQRVJGRVRUT19E
Q0hFQ0soY2F0ZWdvcnlfaW5kZXggPCBjYXRlZ29yeV9jb3VudF8pOworICAvLyBNYXRjaGVzIHRo
ZSBhY3F1aXJlX2xvYWQgaW4gRGF0YVNvdXJjZTo6VHJhY2UoKS4KKyAgc3RhdGVfc3RvcmFnZV9b
Y2F0ZWdvcnlfaW5kZXhdLmZldGNoX2FuZCgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KH4o
MXUgPDwgaW5zdGFuY2VfaW5kZXgpKSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Cit9CisK
K30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvdHJhY2luZy90cmFja19ldmVudF9sZWdh
Y3kuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8v
dHJhY2luZy90cmFja19ldmVudF9sZWdhY3kuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBU
aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhl
IEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5
IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2Uu
CisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAg
IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVz
cyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29m
dHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9u
IGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBP
RiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5z
ZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAq
IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9Q
RVJGRVRUT19UUkFDSU5HX1RSQUNLX0VWRU5UX0xFR0FDWV9IXworI2RlZmluZSBJTkNMVURFX1BF
UkZFVFRPX1RSQUNJTkdfVFJBQ0tfRVZFTlRfTEVHQUNZX0hfCisKKy8vIFRoaXMgZmlsZSBkZWZp
bmVzIGEgY29tcGF0aWJpbGl0eSBzaGltIGJldHdlZW4gbGVnYWN5IChDaHJvbWUsIFY4KSB0cmFj
ZQorLy8gZXZlbnQgbWFjcm9zIGFuZCB0cmFjayBldmVudHMuIFRvIGF2b2lkIGFjY2lkZW50YWxs
eSBpbnRyb2R1Y2luZyBsZWdhY3kKKy8vIGV2ZW50cyBpbiBuZXcgY29kZSwgdGhlIFBFUkZFVFRP
X0VOQUJMRV9MRUdBQ1lfVFJBQ0VfRVZFTlRTIG1hY3JvIG11c3QgYmUgc2V0CisvLyB0byAxIGFj
dGl2YXRlIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyLgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2NvbXBpbGVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50Lmgi
CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmbmRlZiBQRVJGRVRUT19FTkFCTEVfTEVHQUNZ
X1RSQUNFX0VWRU5UUworI2RlZmluZSBQRVJGRVRUT19FTkFCTEVfTEVHQUNZX1RSQUNFX0VWRU5U
UyAwCisjZW5kaWYKKworLy8gSWdub3JlIEdDQyB3YXJuaW5nIGFib3V0IGEgbWlzc2luZyBhcmd1
bWVudCBmb3IgYSB2YXJpYWRpYyBtYWNybyBwYXJhbWV0ZXIuCisjcHJhZ21hIEdDQyBzeXN0ZW1f
aGVhZGVyCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnN0YW50cy4KKy8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBsZWdhY3kg
eworCitlbnVtIFRyYWNlRXZlbnRGbGFnIHsKKyAga1RyYWNlRXZlbnRGbGFnTm9uZSA9IDAsCisg
IGtUcmFjZUV2ZW50RmxhZ0NvcHkgPSAxdSA8PCAwLAorICBrVHJhY2VFdmVudEZsYWdIYXNJZCA9
IDF1IDw8IDEsCisgIGtUcmFjZUV2ZW50RmxhZ1Njb3BlT2Zmc2V0ID0gMXUgPDwgMiwKKyAga1Ry
YWNlRXZlbnRGbGFnU2NvcGVFeHRyYSA9IDF1IDw8IDMsCisgIGtUcmFjZUV2ZW50RmxhZ0V4cGxp
Y2l0VGltZXN0YW1wID0gMXUgPDwgNCwKKyAga1RyYWNlRXZlbnRGbGFnQXN5bmNUVFMgPSAxdSA8
PCA1LAorICBrVHJhY2VFdmVudEZsYWdCaW5kVG9FbmNsb3NpbmcgPSAxdSA8PCA2LAorICBrVHJh
Y2VFdmVudEZsYWdGbG93SW4gPSAxdSA8PCA3LAorICBrVHJhY2VFdmVudEZsYWdGbG93T3V0ID0g
MXUgPDwgOCwKKyAga1RyYWNlRXZlbnRGbGFnSGFzQ29udGV4dElkID0gMXUgPDwgOSwKKyAga1Ry
YWNlRXZlbnRGbGFnSGFzUHJvY2Vzc0lkID0gMXUgPDwgMTAsCisgIGtUcmFjZUV2ZW50RmxhZ0hh
c0xvY2FsSWQgPSAxdSA8PCAxMSwKKyAga1RyYWNlRXZlbnRGbGFnSGFzR2xvYmFsSWQgPSAxdSA8
PCAxMiwKKyAgLy8gVE9ETyhlc2Vja2xlcik6IFJlbW92ZSBvbmNlIHdlIGhhdmUgbmF0aXZlIHN1
cHBvcnQgZm9yIHR5cGVkIHByb3RvIGV2ZW50cworICAvLyBpbiBUUkFDRV9FVkVOVCBtYWNyb3Mu
CisgIGtUcmFjZUV2ZW50RmxhZ1R5cGVkUHJvdG9BcmdzID0gMXUgPDwgMTUsCisgIGtUcmFjZUV2
ZW50RmxhZ0phdmFTdHJpbmdMaXRlcmFscyA9IDF1IDw8IDE2LAorfTsKKworZW51bSBQZXJmZXR0
b0xlZ2FjeUN1cnJlbnRUaHJlYWRJZCB7IGtDdXJyZW50VGhyZWFkSWQgfTsKKworfSAgLy8gbmFt
ZXNwYWNlIGxlZ2FjeQorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNpZiBQRVJGRVRUT19F
TkFCTEVfTEVHQUNZX1RSQUNFX0VWRU5UUworLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJl
IGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHNpbmNlIHRoZXkgd2VyZQorLy8gb3Jp
Z2luYWxseSBpbXBsZW1lbnRlZCBhcyBtYWNyb3MuCisKKy8vIEV2ZW50IHBoYXNlcy4KK3N0YXRp
YyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9CRUdJTiA9ICdCJzsKK3N0YXRpYyBj
b25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9FTkQgPSAnRSc7CitzdGF0aWMgY29uc3Rl
eHByIGNoYXIgVFJBQ0VfRVZFTlRfUEhBU0VfQ09NUExFVEUgPSAnWCc7CitzdGF0aWMgY29uc3Rl
eHByIGNoYXIgVFJBQ0VfRVZFTlRfUEhBU0VfSU5TVEFOVCA9ICdJJzsKK3N0YXRpYyBjb25zdGV4
cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJTiA9ICdTJzsKK3N0YXRpYyBjb25z
dGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19TVEVQX0lOVE8gPSAnVCc7CitzdGF0
aWMgY29uc3RleHByIGNoYXIgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfU1RFUF9QQVNUID0gJ3An
Oworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCA9ICdG
JzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lO
Q19CRUdJTiA9ICdiJzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9O
RVNUQUJMRV9BU1lOQ19FTkQgPSAnZSc7CitzdGF0aWMgY29uc3RleHByIGNoYXIgVFJBQ0VfRVZF
TlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNfSU5TVEFOVCA9ICduJzsKK3N0YXRpYyBjb25zdGV4cHIg
Y2hhciBUUkFDRV9FVkVOVF9QSEFTRV9GTE9XX0JFR0lOID0gJ3MnOworc3RhdGljIGNvbnN0ZXhw
ciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1dfU1RFUCA9ICd0JzsKK3N0YXRpYyBjb25zdGV4
cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9GTE9XX0VORCA9ICdmJzsKK3N0YXRpYyBjb25zdGV4
cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9NRVRBREFUQSA9ICdNJzsKK3N0YXRpYyBjb25zdGV4
cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9DT1VOVEVSID0gJ0MnOworc3RhdGljIGNvbnN0ZXhw
ciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX1NBTVBMRSA9ICdQJzsKK3N0YXRpYyBjb25zdGV4cHIg
Y2hhciBUUkFDRV9FVkVOVF9QSEFTRV9DUkVBVEVfT0JKRUNUID0gJ04nOworc3RhdGljIGNvbnN0
ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX1NOQVBTSE9UX09CSkVDVCA9ICdPJzsKK3N0YXRp
YyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9ERUxFVEVfT0JKRUNUID0gJ0QnOwor
c3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX01FTU9SWV9EVU1QID0gJ3Yn
Oworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX01BUksgPSAnUic7Citz
dGF0aWMgY29uc3RleHByIGNoYXIgVFJBQ0VfRVZFTlRfUEhBU0VfQ0xPQ0tfU1lOQyA9ICdjJzsK
K3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9FTlRFUl9DT05URVhUID0g
JygnOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX0xFQVZFX0NPTlRF
WFQgPSAnKSc7CisKKy8vIEZsYWdzIGZvciBjaGFuZ2luZyB0aGUgYmVoYXZpb3Igb2YgVFJBQ0Vf
RVZFTlRfQVBJX0FERF9UUkFDRV9FVkVOVC4KK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJB
Q0VfRVZFTlRfRkxBR19OT05FID0KKyAgICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VFdmVudEZs
YWdOb25lOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX0NPUFkg
PQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0NvcHk7CitzdGF0aWMgY29u
c3RleHByIHVpbnQzMl90IFRSQUNFX0VWRU5UX0ZMQUdfSEFTX0lEID0KKyAgICBwZXJmZXR0bzo6
bGVnYWN5OjprVHJhY2VFdmVudEZsYWdIYXNJZDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qg
VFJBQ0VfRVZFTlRfRkxBR19TQ09QRV9PRkZTRVQgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtU
cmFjZUV2ZW50RmxhZ1Njb3BlT2Zmc2V0Oworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFD
RV9FVkVOVF9GTEFHX1NDT1BFX0VYVFJBID0KKyAgICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VF
dmVudEZsYWdTY29wZUV4dHJhOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVO
VF9GTEFHX0VYUExJQ0lUX1RJTUVTVEFNUCA9CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNl
RXZlbnRGbGFnRXhwbGljaXRUaW1lc3RhbXA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRS
QUNFX0VWRU5UX0ZMQUdfQVNZTkNfVFRTID0KKyAgICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VF
dmVudEZsYWdBc3luY1RUUzsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBQ0VfRVZFTlRf
RkxBR19CSU5EX1RPX0VOQ0xPU0lORyA9CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNlRXZl
bnRGbGFnQmluZFRvRW5jbG9zaW5nOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFDRV9F
VkVOVF9GTEFHX0ZMT1dfSU4gPQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50Rmxh
Z0Zsb3dJbjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBQ0VfRVZFTlRfRkxBR19GTE9X
X09VVCA9CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnRmxvd091dDsKK3N0
YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBQ0VfRVZFTlRfRkxBR19IQVNfQ09OVEVYVF9JRCA9
CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnSGFzQ29udGV4dElkOworc3Rh
dGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX0hBU19QUk9DRVNTX0lEID0K
KyAgICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VFdmVudEZsYWdIYXNQcm9jZXNzSWQ7CitzdGF0
aWMgY29uc3RleHByIHVpbnQzMl90IFRSQUNFX0VWRU5UX0ZMQUdfSEFTX0xPQ0FMX0lEID0KKyAg
ICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VFdmVudEZsYWdIYXNMb2NhbElkOworc3RhdGljIGNv
bnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX0hBU19HTE9CQUxfSUQgPQorICAgIHBl
cmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0dsb2JhbElkOworc3RhdGljIGNvbnN0
ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX1RZUEVEX1BST1RPX0FSR1MgPQorICAgIHBl
cmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ1R5cGVkUHJvdG9BcmdzOworc3RhdGljIGNv
bnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX0pBVkFfU1RSSU5HX0xJVEVSQUxTID0K
KyAgICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VFdmVudEZsYWdKYXZhU3RyaW5nTGl0ZXJhbHM7
CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBQ0VfRVZFTlRfRkxBR19TQ09QRV9NQVNL
ID0KKyAgICBUUkFDRV9FVkVOVF9GTEFHX1NDT1BFX09GRlNFVCB8IFRSQUNFX0VWRU5UX0ZMQUdf
U0NPUEVfRVhUUkE7CisKKy8vIFR5cGUgdmFsdWVzIGZvciBpZGVudGlmeWluZyB0eXBlcyBpbiB0
aGUgVHJhY2VWYWx1ZSB1bmlvbi4KK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBUUkFDRV9WQUxV
RV9UWVBFX0JPT0wgPSAxOworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFRSQUNFX1ZBTFVFX1RZ
UEVfVUlOVCA9IDI7CitzdGF0aWMgY29uc3RleHByIHVpbnQ4X3QgVFJBQ0VfVkFMVUVfVFlQRV9J
TlQgPSAzOworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFRSQUNFX1ZBTFVFX1RZUEVfRE9VQkxF
ID0gNDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBUUkFDRV9WQUxVRV9UWVBFX1BPSU5URVIg
PSA1Oworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFRSQUNFX1ZBTFVFX1RZUEVfU1RSSU5HID0g
NjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBUUkFDRV9WQUxVRV9UWVBFX0NPUFlfU1RSSU5H
ID0gNzsKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBUUkFDRV9WQUxVRV9UWVBFX0NPTlZFUlRB
QkxFID0gODsKKworLy8gRW51bSByZWZsZWN0aW5nIHRoZSBzY29wZSBvZiBhbiBJTlNUQU5UIGV2
ZW50LiBNdXN0IGZpdCB3aXRoaW4KKy8vIFRSQUNFX0VWRU5UX0ZMQUdfU0NPUEVfTUFTSy4KK3N0
YXRpYyBjb25zdGV4cHIgdWludDhfdCBUUkFDRV9FVkVOVF9TQ09QRV9HTE9CQUwgPSAwdSA8PCAy
Oworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFRSQUNFX0VWRU5UX1NDT1BFX1BST0NFU1MgPSAx
dSA8PCAyOworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFRSQUNFX0VWRU5UX1NDT1BFX1RIUkVB
RCA9IDJ1IDw8IDI7CisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9TQ09QRV9O
QU1FX0dMT0JBTCA9ICdnJzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9TQ09Q
RV9OQU1FX1BST0NFU1MgPSAncCc7CitzdGF0aWMgY29uc3RleHByIGNoYXIgVFJBQ0VfRVZFTlRf
U0NPUEVfTkFNRV9USFJFQUQgPSAndCc7CisKK3N0YXRpYyBjb25zdGV4cHIgYXV0byBUUkFDRV9F
VkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtDdXJy
ZW50VGhyZWFkSWQ7CisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fRU5BQkxFX0xFR0FDWV9UUkFDRV9F
VkVOVFMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50ZXJuYWwgbGVnYWN5IHRyYWNl
IHBvaW50IGltcGxlbWVudGF0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGxlZ2FjeSB7CisKKy8vIFRoZSBmb2xsb3dpbmcgdXNl
ci1wcm92aWRlZCBhZGFwdG9ycyBhcmUgdXNlZCB0byBzZXJpYWxpemUgdXNlci1kZWZpbmVkCisv
LyB0aHJlYWQgaWQgYW5kIHRpbWUgdHlwZXMgaW50byB0cmFjayBldmVudHMuIEZvciBmdWxsIGNv
bXBhdGliaWxpdHksIHRoZSB1c2VyCisvLyBzaG91bGQgYWxzbyBkZWZpbmUgdGhlIGZvbGxvd2lu
ZyBtYWNyb3MgYXBwcm9wcmlhdGVseToKKy8vCisvLyAgICNkZWZpbmUgVFJBQ0VfVElNRV9USUNL
U19OT1coKSAuLi4KKy8vICAgI2RlZmluZSBUUkFDRV9USU1FX05PVygpIC4uLgorCisvLyBVc2Vy
LXByb3ZpZGVkIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYW4gYWJzdHJhY3QgdGhyZWFkIGlkIGludG8g
ZWl0aGVyIGEgdHJhY2sKKy8vIHV1aWQgb3IgYSBwaWQvdGlkIG92ZXJyaWRlLiBSZXR1cm4gdHJ1
ZSBpZiB0aGUgY29udmVyc2lvbiBzdWNjZWVkZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jv
b2wgQ29udmVydFRocmVhZElkKGNvbnN0IFQmLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0
X3QqIHRyYWNrX3V1aWRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcGlkX292
ZXJyaWRlX291dCwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHRpZF9vdmVycmlkZV9v
dXQpOworCisvLyBVc2VyLXByb3ZpZGVkIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYW4gYWJzdHJhY3Qg
dGltZXN0YW1wIGludG8gdGhlIHRyYWNlIGNsb2NrCisvLyB0aW1lYmFzZSBpbiBuYW5vc2Vjb25k
cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordWludDY0X3QgQ29udmVydFRpbWVzdGFtcFRvVHJh
Y2VUaW1lTnMoY29uc3QgVCYpOworCisvLyBCdWlsdC1pbiBpbXBsZW1lbnRhdGlvbiBmb3IgZXZl
bnRzIHJlZmVycmluZyB0byB0aGUgY3VycmVudCB0aHJlYWQuCit0ZW1wbGF0ZSA8PgorYm9vbCBQ
RVJGRVRUT19FWFBPUlQgQ29udmVydFRocmVhZElkKGNvbnN0IFBlcmZldHRvTGVnYWN5Q3VycmVu
dFRocmVhZElkJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRf
dCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCosCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCopOworCit9ICAvLyBuYW1l
c3BhY2UgbGVnYWN5CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIExlZ2FjeVRyYWNlSWQg
ZW5jYXBzdWxhdGVzIGFuIElEIHRoYXQgY2FuIGVpdGhlciBiZSBhbiBpbnRlZ2VyIG9yIHBvaW50
ZXIuCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgTGVnYWN5VHJhY2VJZCB7CisgcHVibGljOgorICAv
LyBDYW4gYmUgY29tYmluZWQgd2l0aCBXaXRoU2NvcGUuCisgIGNsYXNzIExvY2FsSWQgeworICAg
cHVibGljOgorICAgIGV4cGxpY2l0IExvY2FsSWQoY29uc3Qgdm9pZCogcmF3X2lkKQorICAgICAg
ICA6IHJhd19pZF8oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0
cl90PihyYXdfaWQpKSkge30KKyAgICBleHBsaWNpdCBMb2NhbElkKHVpbnQ2NF90IHJhd19pZCkg
OiByYXdfaWRfKHJhd19pZCkge30KKyAgICB1aW50NjRfdCByYXdfaWQoKSBjb25zdCB7IHJldHVy
biByYXdfaWRfOyB9CisKKyAgIHByaXZhdGU6CisgICAgdWludDY0X3QgcmF3X2lkXzsKKyAgfTsK
KworICAvLyBDYW4gYmUgY29tYmluZWQgd2l0aCBXaXRoU2NvcGUuCisgIGNsYXNzIEdsb2JhbElk
IHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBHbG9iYWxJZCh1aW50NjRfdCByYXdfaWQpIDog
cmF3X2lkXyhyYXdfaWQpIHt9CisgICAgdWludDY0X3QgcmF3X2lkKCkgY29uc3QgeyByZXR1cm4g
cmF3X2lkXzsgfQorCisgICBwcml2YXRlOgorICAgIHVpbnQ2NF90IHJhd19pZF87CisgIH07CisK
KyAgY2xhc3MgV2l0aFNjb3BlIHsKKyAgIHB1YmxpYzoKKyAgICBXaXRoU2NvcGUoY29uc3QgY2hh
ciogc2NvcGUsIHVpbnQ2NF90IHJhd19pZCkKKyAgICAgICAgOiBzY29wZV8oc2NvcGUpLCByYXdf
aWRfKHJhd19pZCkge30KKyAgICBXaXRoU2NvcGUoY29uc3QgY2hhciogc2NvcGUsIExvY2FsSWQg
bG9jYWxfaWQpCisgICAgICAgIDogc2NvcGVfKHNjb3BlKSwgcmF3X2lkXyhsb2NhbF9pZC5yYXdf
aWQoKSkgeworICAgICAgaWRfZmxhZ3NfID0gbGVnYWN5OjprVHJhY2VFdmVudEZsYWdIYXNMb2Nh
bElkOworICAgIH0KKyAgICBXaXRoU2NvcGUoY29uc3QgY2hhciogc2NvcGUsIEdsb2JhbElkIGds
b2JhbF9pZCkKKyAgICAgICAgOiBzY29wZV8oc2NvcGUpLCByYXdfaWRfKGdsb2JhbF9pZC5yYXdf
aWQoKSkgeworICAgICAgaWRfZmxhZ3NfID0gbGVnYWN5OjprVHJhY2VFdmVudEZsYWdIYXNHbG9i
YWxJZDsKKyAgICB9CisgICAgV2l0aFNjb3BlKGNvbnN0IGNoYXIqIHNjb3BlLCB1aW50NjRfdCBw
cmVmaXgsIHVpbnQ2NF90IHJhd19pZCkKKyAgICAgICAgOiBzY29wZV8oc2NvcGUpLCBoYXNfcHJl
Zml4Xyh0cnVlKSwgcHJlZml4XyhwcmVmaXgpLCByYXdfaWRfKHJhd19pZCkge30KKyAgICBXaXRo
U2NvcGUoY29uc3QgY2hhciogc2NvcGUsIHVpbnQ2NF90IHByZWZpeCwgR2xvYmFsSWQgZ2xvYmFs
X2lkKQorICAgICAgICA6IHNjb3BlXyhzY29wZSksCisgICAgICAgICAgaGFzX3ByZWZpeF8odHJ1
ZSksCisgICAgICAgICAgcHJlZml4XyhwcmVmaXgpLAorICAgICAgICAgIHJhd19pZF8oZ2xvYmFs
X2lkLnJhd19pZCgpKSB7CisgICAgICBpZF9mbGFnc18gPSBsZWdhY3k6OmtUcmFjZUV2ZW50Rmxh
Z0hhc0dsb2JhbElkOworICAgIH0KKyAgICB1aW50NjRfdCByYXdfaWQoKSBjb25zdCB7IHJldHVy
biByYXdfaWRfOyB9CisgICAgY29uc3QgY2hhciogc2NvcGUoKSBjb25zdCB7IHJldHVybiBzY29w
ZV87IH0KKyAgICBib29sIGhhc19wcmVmaXgoKSBjb25zdCB7IHJldHVybiBoYXNfcHJlZml4Xzsg
fQorICAgIHVpbnQ2NF90IHByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIHByZWZpeF87IH0KKyAgICB1
aW50MzJfdCBpZF9mbGFncygpIGNvbnN0IHsgcmV0dXJuIGlkX2ZsYWdzXzsgfQorCisgICBwcml2
YXRlOgorICAgIGNvbnN0IGNoYXIqIHNjb3BlXyA9IG51bGxwdHI7CisgICAgYm9vbCBoYXNfcHJl
Zml4XyA9IGZhbHNlOworICAgIHVpbnQ2NF90IHByZWZpeF87CisgICAgdWludDY0X3QgcmF3X2lk
XzsKKyAgICB1aW50MzJfdCBpZF9mbGFnc18gPSBsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0lk
OworICB9OworCisgIExlZ2FjeVRyYWNlSWQoY29uc3Qgdm9pZCogcmF3X2lkKQorICAgICAgOiBy
YXdfaWRfKHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4o
cmF3X2lkKSkpIHsKKyAgICBpZF9mbGFnc18gPSBsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0xv
Y2FsSWQ7CisgIH0KKyAgZXhwbGljaXQgTGVnYWN5VHJhY2VJZCh1aW50NjRfdCByYXdfaWQpIDog
cmF3X2lkXyhyYXdfaWQpIHt9CisgIGV4cGxpY2l0IExlZ2FjeVRyYWNlSWQodWludDMyX3QgcmF3
X2lkKSA6IHJhd19pZF8ocmF3X2lkKSB7fQorICBleHBsaWNpdCBMZWdhY3lUcmFjZUlkKHVpbnQx
Nl90IHJhd19pZCkgOiByYXdfaWRfKHJhd19pZCkge30KKyAgZXhwbGljaXQgTGVnYWN5VHJhY2VJ
ZCh1aW50OF90IHJhd19pZCkgOiByYXdfaWRfKHJhd19pZCkge30KKyAgZXhwbGljaXQgTGVnYWN5
VHJhY2VJZChpbnQ2NF90IHJhd19pZCkKKyAgICAgIDogcmF3X2lkXyhzdGF0aWNfY2FzdDx1aW50
NjRfdD4ocmF3X2lkKSkge30KKyAgZXhwbGljaXQgTGVnYWN5VHJhY2VJZChpbnQzMl90IHJhd19p
ZCkKKyAgICAgIDogcmF3X2lkXyhzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmF3X2lkKSkge30KKyAg
ZXhwbGljaXQgTGVnYWN5VHJhY2VJZChpbnQxNl90IHJhd19pZCkKKyAgICAgIDogcmF3X2lkXyhz
dGF0aWNfY2FzdDx1aW50NjRfdD4ocmF3X2lkKSkge30KKyAgZXhwbGljaXQgTGVnYWN5VHJhY2VJ
ZChpbnQ4X3QgcmF3X2lkKQorICAgICAgOiByYXdfaWRfKHN0YXRpY19jYXN0PHVpbnQ2NF90Pihy
YXdfaWQpKSB7fQorICBleHBsaWNpdCBMZWdhY3lUcmFjZUlkKExvY2FsSWQgcmF3X2lkKSA6IHJh
d19pZF8ocmF3X2lkLnJhd19pZCgpKSB7CisgICAgaWRfZmxhZ3NfID0gbGVnYWN5OjprVHJhY2VF
dmVudEZsYWdIYXNMb2NhbElkOworICB9CisgIGV4cGxpY2l0IExlZ2FjeVRyYWNlSWQoR2xvYmFs
SWQgcmF3X2lkKSA6IHJhd19pZF8ocmF3X2lkLnJhd19pZCgpKSB7CisgICAgaWRfZmxhZ3NfID0g
bGVnYWN5OjprVHJhY2VFdmVudEZsYWdIYXNHbG9iYWxJZDsKKyAgfQorICBleHBsaWNpdCBMZWdh
Y3lUcmFjZUlkKFdpdGhTY29wZSBzY29wZWRfaWQpCisgICAgICA6IHNjb3BlXyhzY29wZWRfaWQu
c2NvcGUoKSksCisgICAgICAgIGhhc19wcmVmaXhfKHNjb3BlZF9pZC5oYXNfcHJlZml4KCkpLAor
ICAgICAgICBwcmVmaXhfKHNjb3BlZF9pZC5wcmVmaXgoKSksCisgICAgICAgIHJhd19pZF8oc2Nv
cGVkX2lkLnJhd19pZCgpKSwKKyAgICAgICAgaWRfZmxhZ3NfKHNjb3BlZF9pZC5pZF9mbGFncygp
KSB7fQorCisgIHVpbnQ2NF90IHJhd19pZCgpIGNvbnN0IHsgcmV0dXJuIHJhd19pZF87IH0KKyAg
Y29uc3QgY2hhciogc2NvcGUoKSBjb25zdCB7IHJldHVybiBzY29wZV87IH0KKyAgYm9vbCBoYXNf
cHJlZml4KCkgY29uc3QgeyByZXR1cm4gaGFzX3ByZWZpeF87IH0KKyAgdWludDY0X3QgcHJlZml4
KCkgY29uc3QgeyByZXR1cm4gcHJlZml4XzsgfQorICB1aW50MzJfdCBpZF9mbGFncygpIGNvbnN0
IHsgcmV0dXJuIGlkX2ZsYWdzXzsgfQorCisgIHZvaWQgV3JpdGUocHJvdG9zOjpwYnplcm86OlRy
YWNrRXZlbnQ6OkxlZ2FjeUV2ZW50KiwKKyAgICAgICAgICAgICB1aW50MzJfdCBldmVudF9mbGFn
cykgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBzY29wZV8gPSBudWxscHRyOwor
ICBib29sIGhhc19wcmVmaXhfID0gZmFsc2U7CisgIHVpbnQ2NF90IHByZWZpeF87CisgIHVpbnQ2
NF90IHJhd19pZF87CisgIHVpbnQzMl90IGlkX2ZsYWdzXyA9IGxlZ2FjeTo6a1RyYWNlRXZlbnRG
bGFnSGFzSWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworCisjaWYgUEVSRkVUVE9fRU5BQkxFX0xFR0FDWV9UUkFDRV9FVkVOVFMKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIFBFUkZF
VFRPX0VYUE9SVCBUcmFja0V2ZW50TGVnYWN5IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdGV4
cHIgcHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgUGhhc2VUb1R5cGUoY2hhciBwaGFz
ZSkgeworICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICByZXR1cm4gKHBoYXNlID09IFRSQUNF
X0VWRU5UX1BIQVNFX0JFR0lOKSA/CisgICAgICAgICAgICAgICBwcm90b3M6OnBiemVybzo6VHJh
Y2tFdmVudDo6VFlQRV9TTElDRV9CRUdJTiA6CisgICAgICAgICAgIChwaGFzZSA9PSBUUkFDRV9F
VkVOVF9QSEFTRV9FTkQpID8KKyAgICAgICAgICAgICAgIHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2
ZW50OjpUWVBFX1NMSUNFX0VORCA6CisgICAgICAgICAgIChwaGFzZSA9PSBUUkFDRV9FVkVOVF9Q
SEFTRV9JTlNUQU5UKSA/CisgICAgICAgICAgICAgICBwcm90b3M6OnBiemVybzo6VHJhY2tFdmVu
dDo6VFlQRV9JTlNUQU5UIDoKKyAgICAgICAgICAgcHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6
OlRZUEVfVU5TUEVDSUZJRUQ7CisgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgIH0KKworICAvLyBS
ZWR1Y2UgYmluYXJ5IHNpemUgb3ZlcmhlYWQgYnkgb3V0bGluaW5nIG1vc3Qgb2YgdGhlIGNvZGUg
Zm9yIHdyaXRpbmcgYQorICAvLyBsZWdhY3kgdHJhY2UgZXZlbnQuCisgIHRlbXBsYXRlIDx0eXBl
bmFtZS4uLiBBcmdzPgorICBzdGF0aWMgdm9pZCBXcml0ZUxlZ2FjeUV2ZW50KEV2ZW50Q29udGV4
dCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBwaGFzZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBBcmdzJiYuLi4gYXJncykgUEVSRkVUVE9fTk9fSU5MSU5FIHsKKyAg
ICBBZGREZWJ1Z0Fubm90YXRpb25zKCZjdHgsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7
CisgICAgU2V0VHJhY2tJZk5lZWRlZCgmY3R4LCBmbGFncyk7CisgICAgaWYgKE5lZWRMZWdhY3lG
bGFncyhwaGFzZSwgZmxhZ3MpKSB7CisgICAgICBhdXRvIGxlZ2FjeV9ldmVudCA9IGN0eC5ldmVu
dCgpLT5zZXRfbGVnYWN5X2V2ZW50KCk7CisgICAgICBTZXRMZWdhY3lGbGFncyhsZWdhY3lfZXZl
bnQsIHBoYXNlLCBmbGFncyk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRo
cmVhZElkVHlwZSwgdHlwZW5hbWUuLi4gQXJncz4KKyAgc3RhdGljIHZvaWQgV3JpdGVMZWdhY3lF
dmVudFdpdGhJZEFuZFRpZChFdmVudENvbnRleHQgY3R4LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGVnYWN5VHJhY2VJZCYgaWQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSWRUeXBlJiB0
aHJlYWRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJn
cyYmLi4uIGFyZ3MpIFBFUkZFVFRPX05PX0lOTElORSB7CisgICAgLy8KKyAgICAvLyBPdmVycmlk
ZXMgdG8gY29uc2lkZXI6CisgICAgLy8KKyAgICAvLyAxLiBJZiB3ZSBoYXZlIGFuIGlkLCB3ZSBu
ZWVkIHRvIHdyaXRlIHt1bnNjb3BlZCxsb2NhbCxnbG9iYWx9X2lkIGFuZC9vcgorICAgIC8vICAg
IGJpbmRfaWQuCisgICAgLy8gMi4gSWYgd2UgaGF2ZSBhIHRocmVhZCBpZCwgd2UgbmVlZCB0byB3
cml0ZSB0cmFja191dWlkKCkgb3IKKyAgICAvLyAgICB7cGlkLHRpZH1fb3ZlcnJpZGUuIFRoaXMg
aGFwcGVucyBpbiBlbWJlZGRlciBjb2RlIHNpbmNlIHRoZSB0aHJlYWQgaWQKKyAgICAvLyAgICBp
cyBlbWJlZGRlci1zcGVjaWZpZWQuCisgICAgLy8gMy4gSWYgd2UgaGF2ZSBhIHRpbWVzdGFtcCwg
d2UgbmVlZCB0byB3cml0ZSBhIGRpZmZlcmVudCB0aW1lc3RhbXAgaW4gdGhlCisgICAgLy8gICAg
dHJhY2UgcGFja2V0IGl0c2VsZiBhbmQgbWFrZSBzdXJlIFRyYWNrRXZlbnQgd29uJ3Qgd3JpdGUg
b25lCisgICAgLy8gICAgaW50ZXJuYWxseS4gVGhpcyBpcyBhbHJlYWR5IGRvbmUgYXQgdGhlIGNh
bGwgc2l0ZS4KKyAgICAvLworICAgIGZsYWdzIHw9IGlkLmlkX2ZsYWdzKCk7CisgICAgQWRkRGVi
dWdBbm5vdGF0aW9ucygmY3R4LCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIGlu
dDMyX3QgcGlkX292ZXJyaWRlID0gMDsKKyAgICBpbnQzMl90IHRpZF9vdmVycmlkZSA9IDA7Cisg
ICAgdWludDY0X3QgdHJhY2tfdXVpZCA9IDA7CisgICAgaWYgKGxlZ2FjeTo6Q29udmVydFRocmVh
ZElkKHRocmVhZF9pZCwgJnRyYWNrX3V1aWQsICZwaWRfb3ZlcnJpZGUsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICZ0aWRfb3ZlcnJpZGUpICYmCisgICAgICAgIHRyYWNrX3V1aWQp
IHsKKyAgICAgIGlmICh0cmFja191dWlkICE9IFRocmVhZFRyYWNrOjpDdXJyZW50KCkudXVpZCkK
KyAgICAgICAgY3R4LmV2ZW50KCktPnNldF90cmFja191dWlkKHRyYWNrX3V1aWQpOworICAgIH0g
ZWxzZSBpZiAocGlkX292ZXJyaWRlIHx8IHRpZF9vdmVycmlkZSkgeworICAgICAgLy8gRXhwbGlj
aXRseSBjbGVhciB0aGUgdHJhY2sgc28gdGhlIG92ZXJyaWRlcyBiZWxvdyB0YWtlIGVmZmVjdC4K
KyAgICAgIGN0eC5ldmVudCgpLT5zZXRfdHJhY2tfdXVpZCgwKTsKKyAgICB9IGVsc2UgeworICAg
ICAgLy8gTm8gcGlkL3RpZC90cmFjayBvdmVycmlkZXMgPT4gb2JleSB0aGUgZmxhZ3MgaW5zdGVh
ZC4KKyAgICAgIFNldFRyYWNrSWZOZWVkZWQoJmN0eCwgZmxhZ3MpOworICAgIH0KKyAgICBpZiAo
TmVlZExlZ2FjeUZsYWdzKHBoYXNlLCBmbGFncykgfHwgcGlkX292ZXJyaWRlIHx8IHRpZF9vdmVy
cmlkZSkgeworICAgICAgYXV0byBsZWdhY3lfZXZlbnQgPSBjdHguZXZlbnQoKS0+c2V0X2xlZ2Fj
eV9ldmVudCgpOworICAgICAgU2V0TGVnYWN5RmxhZ3MobGVnYWN5X2V2ZW50LCBwaGFzZSwgZmxh
Z3MpOworICAgICAgaWYgKGlkLmlkX2ZsYWdzKCkpCisgICAgICAgIGlkLldyaXRlKGxlZ2FjeV9l
dmVudCwgZmxhZ3MpOworICAgICAgaWYgKHBpZF9vdmVycmlkZSkKKyAgICAgICAgbGVnYWN5X2V2
ZW50LT5zZXRfcGlkX292ZXJyaWRlKHBpZF9vdmVycmlkZSk7CisgICAgICBpZiAodGlkX292ZXJy
aWRlKQorICAgICAgICBsZWdhY3lfZXZlbnQtPnNldF90aWRfb3ZlcnJpZGUodGlkX292ZXJyaWRl
KTsKKyAgICB9CisgIH0KKworICAvLyBObyBhcmd1bWVudHMuCisgIHN0YXRpYyB2b2lkIEFkZERl
YnVnQW5ub3RhdGlvbnMoRXZlbnRDb250ZXh0Kikge30KKworICAvLyBPbmUgYXJndW1lbnQuCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUeXBlPgorICBzdGF0aWMgdm9pZCBBZGREZWJ1Z0Fubm90
YXRpb25zKEV2ZW50Q29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IGNoYXIqIGFyZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEFyZ1R5cGUmJiBhcmdfdmFsdWUpIHsKKyAgICBUcmFja0V2ZW50SW50ZXJuYWw6OkFkZERl
YnVnQW5ub3RhdGlvbihjdHgsIGFyZ19uYW1lLCBhcmdfdmFsdWUpOworICB9CisKKyAgLy8gVHdv
IGFyZ3VtZW50cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIEFyZ1R5
cGUyPgorICBzdGF0aWMgdm9pZCBBZGREZWJ1Z0Fubm90YXRpb25zKEV2ZW50Q29udGV4dCogY3R4
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ19uYW1l
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGUmJiBhcmdfdmFsdWUs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJnX25hbWUy
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGUyJiYgYXJnX3ZhbHVl
MikgeworICAgIFRyYWNrRXZlbnRJbnRlcm5hbDo6QWRkRGVidWdBbm5vdGF0aW9uKGN0eCwgYXJn
X25hbWUsIGFyZ192YWx1ZSk7CisgICAgVHJhY2tFdmVudEludGVybmFsOjpBZGREZWJ1Z0Fubm90
YXRpb24oY3R4LCBhcmdfbmFtZTIsIGFyZ192YWx1ZTIpOworICB9CisKKyBwcml2YXRlOgorICBz
dGF0aWMgdm9pZCBTZXRUcmFja0lmTmVlZGVkKEV2ZW50Q29udGV4dCogY3R4LCB1aW50MzJfdCBm
bGFncykgeworICAgIC8vIE5vdGU6IFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIHNldCBMZWdhY3lF
dmVudDo6aW5zdGFudF9ldmVudF9zY29wZS4KKyAgICBhdXRvIHNjb3BlID0gZmxhZ3MgJiBUUkFD
RV9FVkVOVF9GTEFHX1NDT1BFX01BU0s7CisgICAgc3dpdGNoIChzY29wZSkgeworICAgICAgY2Fz
ZSBUUkFDRV9FVkVOVF9TQ09QRV9HTE9CQUw6CisgICAgICAgIGN0eC0+ZXZlbnQoKS0+c2V0X3Ry
YWNrX3V1aWQoMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUUkFDRV9FVkVOVF9TQ09Q
RV9QUk9DRVNTOgorICAgICAgICBjdHgtPmV2ZW50KCktPnNldF90cmFja191dWlkKFByb2Nlc3NU
cmFjazo6Q3VycmVudCgpLnV1aWQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6Cisg
ICAgICBjYXNlIFRSQUNFX0VWRU5UX1NDT1BFX1RIUkVBRDoKKyAgICAgICAgLy8gVGhyZWFkIHNj
b3BlIGlzIGFscmVhZHkgdGhlIGRlZmF1bHQuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQor
CisgIHN0YXRpYyBib29sIE5lZWRMZWdhY3lGbGFncyhjaGFyIHBoYXNlLCB1aW50MzJfdCBmbGFn
cykgeworICAgIGlmIChQaGFzZVRvVHlwZShwaGFzZSkgPT0gcHJvdG9zOjpwYnplcm86OlRyYWNr
RXZlbnQ6OlRZUEVfVU5TUEVDSUZJRUQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBUT0RP
KHNreW9zdGlsKTogSW1wbGVtZW50L2RlcHJlY2F0ZToKKyAgICAvLyAtIFRSQUNFX0VWRU5UX0ZM
QUdfRVhQTElDSVRfVElNRVNUQU1QCisgICAgLy8gLSBUUkFDRV9FVkVOVF9GTEFHX0hBU19DT05U
RVhUX0lECisgICAgLy8gLSBUUkFDRV9FVkVOVF9GTEFHX0hBU19QUk9DRVNTX0lECisgICAgLy8g
LSBUUkFDRV9FVkVOVF9GTEFHX1RZUEVEX1BST1RPX0FSR1MKKyAgICAvLyAtIFRSQUNFX0VWRU5U
X0ZMQUdfSkFWQV9TVFJJTkdfTElURVJBTFMKKyAgICByZXR1cm4gZmxhZ3MgJgorICAgICAgICAg
ICAoVFJBQ0VfRVZFTlRfRkxBR19IQVNfSUQgfCBUUkFDRV9FVkVOVF9GTEFHX0hBU19MT0NBTF9J
RCB8CisgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0hBU19HTE9CQUxfSUQgfCBUUkFDRV9F
VkVOVF9GTEFHX0FTWU5DX1RUUyB8CisgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0JJTkRf
VE9fRU5DTE9TSU5HIHwgVFJBQ0VfRVZFTlRfRkxBR19GTE9XX0lOIHwKKyAgICAgICAgICAgIFRS
QUNFX0VWRU5UX0ZMQUdfRkxPV19PVVQpOworICB9CisKKyAgc3RhdGljIHZvaWQgU2V0TGVnYWN5
RmxhZ3MoCisgICAgICBwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6TGVnYWN5RXZlbnQqIGxl
Z2FjeV9ldmVudCwKKyAgICAgIGNoYXIgcGhhc2UsCisgICAgICB1aW50MzJfdCBmbGFncykgewor
ICAgIGlmIChQaGFzZVRvVHlwZShwaGFzZSkgPT0gcHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6
OlRZUEVfVU5TUEVDSUZJRUQpCisgICAgICBsZWdhY3lfZXZlbnQtPnNldF9waGFzZShwaGFzZSk7
CisgICAgaWYgKGZsYWdzICYgVFJBQ0VfRVZFTlRfRkxBR19BU1lOQ19UVFMpCisgICAgICBsZWdh
Y3lfZXZlbnQtPnNldF91c2VfYXN5bmNfdHRzKHRydWUpOworICAgIGlmIChmbGFncyAmIFRSQUNF
X0VWRU5UX0ZMQUdfQklORF9UT19FTkNMT1NJTkcpCisgICAgICBsZWdhY3lfZXZlbnQtPnNldF9i
aW5kX3RvX2VuY2xvc2luZyh0cnVlKTsKKworICAgIGNvbnN0IGF1dG8ga0Zsb3dJbiA9IFRSQUNF
X0VWRU5UX0ZMQUdfRkxPV19JTjsKKyAgICBjb25zdCBhdXRvIGtGbG93T3V0ID0gVFJBQ0VfRVZF
TlRfRkxBR19GTE9XX09VVDsKKyAgICBjb25zdCBhdXRvIGtGbG93SW5PdXQgPSBrRmxvd0luIHwg
a0Zsb3dPdXQ7CisgICAgaWYgKChmbGFncyAmIGtGbG93SW5PdXQpID09IGtGbG93SW5PdXQpIHsK
KyAgICAgIGxlZ2FjeV9ldmVudC0+c2V0X2Zsb3dfZGlyZWN0aW9uKAorICAgICAgICAgIHByb3Rv
czo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpMZWdhY3lFdmVudDo6RkxPV19JTk9VVCk7CisgICAgfSBl
bHNlIGlmIChmbGFncyAmIGtGbG93SW4pIHsKKyAgICAgIGxlZ2FjeV9ldmVudC0+c2V0X2Zsb3df
ZGlyZWN0aW9uKAorICAgICAgICAgIHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpMZWdhY3lF
dmVudDo6RkxPV19JTik7CisgICAgfSBlbHNlIGlmIChmbGFncyAmIGtGbG93T3V0KSB7CisgICAg
ICBsZWdhY3lfZXZlbnQtPnNldF9mbG93X2RpcmVjdGlvbigKKyAgICAgICAgICBwcm90b3M6OnBi
emVybzo6VHJhY2tFdmVudDo6TGVnYWN5RXZlbnQ6OkZMT1dfT1VUKTsKKyAgICB9CisgIH0KK307
CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisK
Ky8vIEltcGxlbWVudGF0aW9ucyBmb3IgdGhlIElOVEVSTkFMXyogYWRhcHRlciBtYWNyb3MgdXNl
ZCBieSB0aGUgdHJhY2UgcG9pbnRzCisvLyBiZWxvdy4KKyNkZWZpbmUgSU5URVJOQUxfVFJBQ0Vf
RVZFTlRfQUREKHBoYXNlLCBjYXRlZ29yeSwgbmFtZSwgZmxhZ3MsIC4uLikgICAgICBcCisgIFBF
UkZFVFRPX0lOVEVSTkFMX1RSQUNLX0VWRU5UKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgY2F0ZWdvcnksIDo6cGVyZmV0dG86OlN0YXRpY1N0cmluZ3tu
YW1lfSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6cGVyZmV0dG86OmludGVy
bmFsOjpUcmFja0V2ZW50TGVnYWN5OjpQaGFzZVRvVHlwZShwaGFzZSksICAgICAgICBcCisgICAg
ICBbJl0ocGVyZmV0dG86OkV2ZW50Q29udGV4dCBjdHgpIHsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgICB1c2luZyA6OnBlcmZldHRvOjppbnRlcm5hbDo6VHJhY2tF
dmVudExlZ2FjeTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVHJhY2tFdmVudExlZ2Fj
eTo6V3JpdGVMZWdhY3lFdmVudChzdGQ6Om1vdmUoY3R4KSwgcGhhc2UsIGZsYWdzLCBcCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAg
ICAgICAgICAgICAgXAorICAgICAgfSkKKworI2RlZmluZSBJTlRFUk5BTF9UUkFDRV9FVkVOVF9B
RERfU0NPUEVEKGNhdGVnb3J5LCBuYW1lLCAuLi4pICAgICAgICBcCisgIFBFUkZFVFRPX0lOVEVS
TkFMX1NDT1BFRF9UUkFDS19FVkVOVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgIGNhdGVnb3J5LCA6OnBlcmZldHRvOjpTdGF0aWNTdHJpbmd7bmFtZX0sICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgWyZdKHBlcmZldHRvOjpFdmVudENvbnRleHQgY3R4KSB7ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVzaW5nIDo6cGVyZmV0dG86OmludGVy
bmFsOjpUcmFja0V2ZW50TGVnYWN5OyAgICAgICAgICAgICAgIFwKKyAgICAgICAgVHJhY2tFdmVu
dExlZ2FjeTo6QWRkRGVidWdBbm5vdGF0aW9ucygmY3R4LCAjI19fVkFfQVJHU19fKTsgXAorICAg
ICAgfSkKKworI2RlZmluZSBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfU0NPUEVEX1dJVEhfRkxP
VyhjYXRlZ29yeSwgbmFtZSwgYmluZF9pZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgLi4uKSAgICAgICAgICAgICAgXAorICBQRVJG
RVRUT19JTlRFUk5BTF9TQ09QRURfVFJBQ0tfRVZFTlQoICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgY2F0ZWdvcnksIDo6cGVyZmV0dG86OlN0YXRpY1N0cmluZ3tu
YW1lfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgWyZdKHBlcmZldHRvOjpF
dmVudENvbnRleHQgY3R4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICB1c2luZyA6OnBlcmZldHRvOjppbnRlcm5hbDo6VHJhY2tFdmVudExlZ2FjeTsgICAg
ICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6OnBlcmZldHRvOjppbnRlcm5hbDo6TGVnYWN5
VHJhY2VJZCB0cmFjZV9pZHtiaW5kX2lkfTsgICAgICAgICAgICAgXAorICAgICAgICBUcmFja0V2
ZW50TGVnYWN5OjpXcml0ZUxlZ2FjeUV2ZW50V2l0aElkQW5kVGlkKCAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgICAgICAgc3RkOjptb3ZlKGN0eCksIFRSQUNFX0VWRU5UX1BIQVNFX0JFR0lO
LCBmbGFncywgdHJhY2VfaWQsICAgICAgXAorICAgICAgICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NV
UlJFTlRfVEhSRUFEX0lELCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgXAorICAgICAgfSkK
KworI2RlZmluZSBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9USU1FU1RBTVAocGhhc2Us
IGNhdGVnb3J5LCBuYW1lLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHRpbWVzdGFtcCwgZmxhZ3MsIC4uLikgICBcCisgIFBFUkZFVFRPX0lOVEVS
TkFMX1RSQUNLX0VWRU5UKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICAgICAgY2F0ZWdvcnksIDo6cGVyZmV0dG86OlN0YXRpY1N0cmluZ3tuYW1lfSwgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6cGVyZmV0dG86OmludGVybmFsOjpUcmFja0V2
ZW50TGVnYWN5OjpQaGFzZVRvVHlwZShwaGFzZSksICAgICAgICBcCisgICAgICA6OnBlcmZldHRv
OjpsZWdhY3k6OkNvbnZlcnRUaW1lc3RhbXBUb1RyYWNlVGltZU5zKHRpbWVzdGFtcCksICAgICAg
XAorICAgICAgWyZdKHBlcmZldHRvOjpFdmVudENvbnRleHQgY3R4KSB7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdXNpbmcgOjpwZXJmZXR0bzo6aW50ZXJuYWw6
OlRyYWNrRXZlbnRMZWdhY3k7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRyYWNrRXZl
bnRMZWdhY3k6OldyaXRlTGVnYWN5RXZlbnQoc3RkOjptb3ZlKGN0eCksIHBoYXNlLCBmbGFncywg
XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjX19WQV9BUkdT
X18pOyAgICAgICAgICAgICAgIFwKKyAgICAgIH0pCisKKyNkZWZpbmUgSU5URVJOQUxfVFJBQ0Vf
RVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICBc
CisgICAgcGhhc2UsIGNhdGVnb3J5LCBuYW1lLCBpZCwgdGhyZWFkX2lkLCB0aW1lc3RhbXAsIGZs
YWdzLCAuLi4pICAgICAgICAgICAgICAgXAorICBQRVJGRVRUT19JTlRFUk5BTF9UUkFDS19FVkVO
VCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg
IGNhdGVnb3J5LCA6OnBlcmZldHRvOjpTdGF0aWNTdHJpbmd7bmFtZX0sICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgICA6OnBlcmZldHRvOjppbnRlcm5hbDo6VHJhY2tFdmVu
dExlZ2FjeTo6UGhhc2VUb1R5cGUocGhhc2UpLCAgICAgICAgICAgICAgXAorICAgICAgOjpwZXJm
ZXR0bzo6bGVnYWN5OjpDb252ZXJ0VGltZXN0YW1wVG9UcmFjZVRpbWVOcyh0aW1lc3RhbXApLCAg
ICAgICAgICAgIFwKKyAgICAgIFsmXShwZXJmZXR0bzo6RXZlbnRDb250ZXh0IGN0eCkgeyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVzaW5nIDo6cGVy
ZmV0dG86OmludGVybmFsOjpUcmFja0V2ZW50TGVnYWN5OyAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgICA6OnBlcmZldHRvOjppbnRlcm5hbDo6TGVnYWN5VHJhY2VJZCB0cmFjZV9p
ZHtpZH07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVHJhY2tFdmVudExlZ2FjeTo6
V3JpdGVMZWdhY3lFdmVudFdpdGhJZEFuZFRpZCggICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgICAgICBzdGQ6Om1vdmUoY3R4KSwgcGhhc2UsIGZsYWdzLCB0cmFjZV9pZCwgdGhyZWFk
X2lkLCAjI19fVkFfQVJHU19fKTsgXAorICAgICAgfSkKKworI2RlZmluZSBJTlRFUk5BTF9UUkFD
RV9FVkVOVF9BRERfV0lUSF9JRChwaGFzZSwgY2F0ZWdvcnksIG5hbWUsIGlkLCBmbGFncywgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXAorICBQRVJGRVRUT19JTlRFUk5BTF9UUkFDS19FVkVOVCggICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F0ZWdvcnks
IDo6cGVyZmV0dG86OlN0YXRpY1N0cmluZ3tuYW1lfSwgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgOjpwZXJmZXR0bzo6aW50ZXJuYWw6OlRyYWNrRXZlbnRMZWdhY3k6OlBoYXNl
VG9UeXBlKHBoYXNlKSwgICAgICAgICAgXAorICAgICAgWyZdKHBlcmZldHRvOjpFdmVudENvbnRl
eHQgY3R4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1
c2luZyA6OnBlcmZldHRvOjppbnRlcm5hbDo6VHJhY2tFdmVudExlZ2FjeTsgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICA6OnBlcmZldHRvOjppbnRlcm5hbDo6TGVnYWN5VHJhY2VJZCB0
cmFjZV9pZHtpZH07ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUcmFja0V2ZW50TGVnYWN5
OjpXcml0ZUxlZ2FjeUV2ZW50V2l0aElkQW5kVGlkKCAgICAgICAgICAgICAgICAgICAgXAorICAg
ICAgICAgICAgc3RkOjptb3ZlKGN0eCksIHBoYXNlLCBmbGFncywgdHJhY2VfaWQsICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhS
RUFEX0lELCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgXAorICAgICAgfSkKKworI2RlZmlu
ZSBJTlRFUk5BTF9UUkFDRV9FVkVOVF9NRVRBREFUQV9BREQoY2F0ZWdvcnksIG5hbWUsIC4uLikg
ICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9N
RVRBREFUQSwgY2F0ZWdvcnksIG5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRS
QUNFX0VWRU5UX0ZMQUdfTk9ORSkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGVnYWN5
IHRyYWNpbmcgY29tbW9uIEFQSSAoYWRhcHRlZCBmcm9tIHRyYWNlX2V2ZW50X2NvbW1vbi5oKS4K
Ky8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBUUkFDRV9ESVNBQkxFRF9CWV9ERUZB
VUxUKG5hbWUpICJkaXNhYmxlZC1ieS1kZWZhdWx0LSIgbmFtZQorCisvLyBTY29wZWQgZXZlbnRz
LgorI2RlZmluZSBUUkFDRV9FVkVOVDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUpIFwKKyAgSU5URVJO
QUxfVFJBQ0VfRVZFTlRfQUREX1NDT1BFRChjYXRlZ29yeV9ncm91cCwgbmFtZSkKKyNkZWZpbmUg
VFJBQ0VfRVZFTlRfV0lUSF9GTE9XMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgYmluZF9pZCwgZmxv
d19mbGFncykgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1NDT1BFRF9XSVRIX0ZMT1co
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGJpbmRfaWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZmxvd19mbGFncykKKyNkZWZpbmUgVFJBQ0VfRVZFTlQxKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsKSBcCisgIElOVEVSTkFMX1RS
QUNFX0VWRU5UX0FERF9TQ09QRUQoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGFyZzFfbmFtZSwgYXJn
MV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX1dJVEhfRkxPVzEoY2F0ZWdvcnlfZ3JvdXAsIG5h
bWUsIGJpbmRfaWQsIGZsb3dfZmxhZ3MsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXJnMV9uYW1lLCBhcmcxX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVS
TkFMX1RSQUNFX0VWRU5UX0FERF9TQ09QRURfV0lUSF9GTE9XKGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCBiaW5kX2lkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZsb3dfZmxhZ3MsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UMihj
YXRlZ29yeV9ncm91cCwgbmFtZSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCAgIFwK
KyAgICAgICAgICAgICAgICAgICAgIGFyZzJfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfU0NPUEVE
KGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfV0lUSF9GTE9XMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgYmluZF9pZCwgZmxvd19m
bGFncywgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfbmFtZSwgYXJn
MV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5U
X0FERF9TQ09QRURfV0lUSF9GTE9XKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBiaW5kX2lkLCAgIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mbGFncywg
YXJnMV9uYW1lLCBhcmcxX3ZhbCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKQorCisvLyBJbnN0YW50IGV2ZW50cy4KKyNk
ZWZpbmUgVFJBQ0VfRVZFTlRfSU5TVEFOVDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHNjb3BlKSAg
ICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVO
VF9QSEFTRV9JTlNUQU5ULCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FIHwgc2NvcGUpCisjZGVmaW5lIFRSQUNF
X0VWRU5UX0lOU1RBTlQxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBzY29wZSwgYXJnMV9uYW1lLCBh
cmcxX3ZhbCkgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0Vf
SU5TVEFOVCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSB8IHNjb3BlLCBhcmcxX25hbWUsIGFyZzFfdmFs
KQorI2RlZmluZSBUUkFDRV9FVkVOVF9JTlNUQU5UMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgc2Nv
cGUsIGFyZzFfbmFtZSwgYXJnMV92YWwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJnMl9uYW1lLCBhcmcyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9JTlNUQU5ULCBjYXRlZ29y
eV9ncm91cCwgbmFtZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZF
TlRfRkxBR19OT05FIHwgc2NvcGUsIGFyZzFfbmFtZSwgYXJnMV92YWwsIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5U
X0NPUFlfSU5TVEFOVDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHNjb3BlKSAgICAgICAgICAgICAg
XAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0VfSU5TVEFOVCwg
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNF
X0VWRU5UX0ZMQUdfQ09QWSB8IHNjb3BlKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0lOU1RB
TlQxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBzY29wZSwgYXJnMV9uYW1lLCAgIFwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFT
RV9JTlNUQU5ULCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZIHwgc2NvcGUsIGFyZzFfbmFtZSwgYXJnMV92YWwp
CisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfSU5TVEFOVDIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IHNjb3BlLCBhcmcxX25hbWUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAgICAgICAgIFwKKyAgSU5U
RVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0lOU1RBTlQsIGNhdGVnb3J5
X2dyb3VwLCBuYW1lLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVO
VF9GTEFHX0NPUFkgfCBzY29wZSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
SU5TVEFOVF9XSVRIX0ZMQUdTMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgc2NvcGVfYW5kX2ZsYWdz
KSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9JTlNUQU5U
LCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2NvcGVfYW5kX2ZsYWdzKQorI2RlZmluZSBUUkFDRV9FVkVOVF9JTlNUQU5UX1dJVEhfRkxBR1Mx
KGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBzY29wZV9hbmRfZmxhZ3MsIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX25hbWUsIGFyZzFfdmFsKSAgICAgICAgICAg
ICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9J
TlNUQU5ULCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2NvcGVfYW5kX2ZsYWdzLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorCisvLyBJbnN0YW50
IGV2ZW50cyB3aXRoIGV4cGxpY2l0IHRpbWVzdGFtcHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX0lO
U1RBTlRfV0lUSF9USU1FU1RBTVAwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBzY29wZSwgICBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCkgICAg
ICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX1RJTUVT
VEFNUChUUkFDRV9FVkVOVF9QSEFTRV9JTlNUQU5ULCAgICAgICBcCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgdGltZXN0YW1w
LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVO
VF9GTEFHX05PTkUgfCBzY29wZSkKKworI2RlZmluZSBUUkFDRV9FVkVOVF9JTlNUQU5UX1dJVEhf
VElNRVNUQU1QMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgc2NvcGUsICBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgYXJnX25hbWUsIGFyZ192
YWwpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfVElNRVNUQU1QKCAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfSU5TVEFO
VCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCwgICAgICAgICBcCisgICAgICBUUkFD
RV9FVkVOVF9GTEFHX05PTkUgfCBzY29wZSwgYXJnX25hbWUsIGFyZ192YWwpCisKKy8vIEJlZ2lu
IGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQkVHSU4wKGNhdGVnb3J5X2dyb3VwLCBuYW1l
KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQo
VFJBQ0VfRVZFTlRfUEhBU0VfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBcCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNF
X0VWRU5UX0JFR0lOMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkg
ICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0JFR0lO
LCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJB
Q0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9F
VkVOVF9CRUdJTjIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGFyZzFfbmFtZSwgYXJnMV92YWwsICAg
ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNF
X0VWRU5UX1BIQVNFX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUsIGFyZzFfdmFs
LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKQor
I2RlZmluZSBUUkFDRV9FVkVOVF9CRUdJTl9XSVRIX0ZMQUdTMChjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgZmxhZ3MpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNF
X0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgZmxhZ3MpCisjZGVmaW5lIFRSQUNFX0VWRU5U
X0JFR0lOX1dJVEhfRkxBR1MxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBmbGFncywgYXJnMV9uYW1l
LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChU
UkFDRV9FVkVOVF9QSEFTRV9CRUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsICAgICBcCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZp
bmUgVFJBQ0VfRVZFTlRfQ09QWV9CRUdJTjIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGFyZzFfbmFt
ZSwgYXJnMV92YWwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMl9uYW1l
LCBhcmcyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZF
TlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9u
YW1lLCBhcmcxX3ZhbCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzJfbmFt
ZSwgYXJnMl92YWwpCisKKy8vIEJlZ2luIGV2ZW50cyB3aXRoIGV4cGxpY2l0IHRpbWVzdGFtcHMu
CisjZGVmaW5lIFRSQUNFX0VWRU5UX0JFR0lOX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAwKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaWQsIHRpbWVzdGFtcCkgICAgIFwKKyAgSU5U
RVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJTiwg
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsICAgICAgXAorICAgICAgdGltZXN0
YW1wLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfQkVH
SU5fV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUDAoICAgICAgICAgICAgICAgIFwKKyAgICBjYXRl
Z29yeV9ncm91cCwgbmFtZSwgaWQsIHRocmVhZF9pZCwgdGltZXN0YW1wKSAgICAgICAgICAgICAg
ICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJ
TUVTVEFNUCggICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9B
U1lOQ19CRUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsIFwKKyAgICAg
IHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFDRV9FVkVOVF9D
T1BZX0JFR0lOX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAxKCAgICAgICAgICAgICAgICBcCisg
ICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsIHRpbWVzdGFtcCwgYXJnMV9u
YW1lLCBhcmcxX3ZhbCkgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElE
X0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRf
UEhBU0VfQVNZTkNfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgdGhyZWFkX2lkLCBc
CisgICAgICB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcx
X3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9CRUdJTl9XSVRIX0lEX1RJRF9BTkRfVElN
RVNUQU1QMiggICAgICAgICAgICAgICAgXAorICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwg
dGhyZWFkX2lkLCB0aW1lc3RhbXAsIGFyZzFfbmFtZSwgYXJnMV92YWwsICBcCisgICAgYXJnMl9u
YW1lLCBhcmcyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1F
U1RBTVAoICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZ
TkNfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgdGhyZWFkX2lkLCBcCisgICAgICB0
aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJn
Ml9uYW1lLCAgIFwKKyAgICAgIGFyZzJfdmFsKQorCisvLyBFbmQgZXZlbnRzLgorI2RlZmluZSBU
UkFDRV9FVkVOVF9FTkQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lKSAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0VfRU5E
LCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJB
Q0VfRVZFTlRfRkxBR19OT05FKQorI2RlZmluZSBUUkFDRV9FVkVOVF9FTkQxKGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsKSAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9F
VkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0VfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25h
bWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9FTkQyKGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUsIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICBhcmcyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9FTkQs
IGNhdGVnb3J5X2dyb3VwLCBuYW1lLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUsIGFyZzFfdmFsLCAgICAgICAgIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpCisjZGVmaW5l
IFRSQUNFX0VWRU5UX0VORF9XSVRIX0ZMQUdTMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgZmxhZ3Mp
IFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0VORCwgY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGZsYWdzKQorI2RlZmluZSBUUkFDRV9FVkVOVF9FTkRfV0lUSF9G
TEFHUzEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGZsYWdzLCBhcmcxX25hbWUsICAgIFwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVO
VF9QSEFTRV9FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBmbGFncywgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
Q09QWV9FTkQyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAg
ICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRf
UEhBU0VfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgIFwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgICBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKQorCisvLyBNYXJr
IGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfTUFSS19XSVRIX1RJTUVTVEFNUDAoY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCkgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
X1dJVEhfVElNRVNUQU1QKFRSQUNFX0VWRU5UX1BIQVNFX01BUkssICAgICAgICAgIFwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCB0aW1lc3RhbXAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKworI2RlZmluZSBUUkFDRV9FVkVOVF9NQVJLX1dJVEhf
VElNRVNUQU1QMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgdGltZXN0YW1wLCBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfbmFtZSwgYXJnMV92YWwpICAgICAg
ICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfVElNRVNUQU1QKCAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfTUFS
SywgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCwgICAgICAgICAgICBcCisgICAgICBU
UkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisKKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfTUFSS19XSVRIX1RJTUVTVEFNUDIoICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCwgYXJnMV9u
YW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkgXAorICBJTlRFUk5BTF9UUkFDRV9F
VkVOVF9BRERfV0lUSF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX01BUkssIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCB0aW1lc3RhbXAsICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX05P
TkUsIGFyZzFfbmFtZSwgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpCisKKyNkZWZpbmUg
VFJBQ0VfRVZFTlRfQ09QWV9NQVJLKGNhdGVnb3J5X2dyb3VwLCBuYW1lKSAgICAgICAgICAgICAg
ICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9N
QVJLLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
VFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfTUFSSzEo
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGFyZzFfbmFtZSwgYXJnMV92YWwpIFwKKyAgSU5URVJOQUxf
VFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX01BUkssIGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZ
LCBhcmcxX25hbWUsIGFyZzFfdmFsKQorCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfTUFSS19X
SVRIX1RJTUVTVEFNUChjYXRlZ29yeV9ncm91cCwgbmFtZSwgdGltZXN0YW1wKSBcCisgIElOVEVS
TkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX1RJTUVTVEFNUChUUkFDRV9FVkVOVF9QSEFTRV9NQVJL
LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgdGltZXN0YW1wLCAgICBcCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFkpCisKKy8vIEVu
ZCBldmVudHMgd2l0aCBleHBsaWNpdCB0aHJlYWQgYW5kIHRpbWVzdGFtcC4KKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfRU5EX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAwKGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBpZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGhyZWFkX2lkLCB0aW1lc3RhbXApICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5U
X0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IGlkLCB0aHJlYWRfaWQsICAgICAgXAorICAgICAgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFH
X05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfRU5EX1dJVEhfSURfVElEX0FORF9USU1F
U1RBTVAwKCAgICAgICAgICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0
aHJlYWRfaWQsIHRpbWVzdGFtcCkgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RS
QUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAg
ICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19FTkQsIGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBpZCwgdGhyZWFkX2lkLCBcCisgICAgICB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdf
Q09QWSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9FTkRfV0lUSF9JRF9USURfQU5EX1RJTUVT
VEFNUDEoICAgICAgICAgICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0
aHJlYWRfaWQsIHRpbWVzdGFtcCwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkgXAorICBJTlRFUk5BTF9U
UkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAg
ICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkLCB0aHJlYWRfaWQsICBcCisgICAgICB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZM
QUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9F
TkRfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUDIoICAgICAgICAgICAgICAgICBcCisgICAgY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsIHRpbWVzdGFtcCwgYXJnMV9uYW1lLCBh
cmcxX3ZhbCwgXAorICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
X1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICBcCisgICAgICBU
UkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgdGhy
ZWFkX2lkLCAgXAorICAgICAgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX0NPUFksIGFyZzFf
bmFtZSwgYXJnMV92YWwsIGFyZzJfbmFtZSwgIFwKKyAgICAgIGFyZzJfdmFsKQorCisvLyBDb3Vu
dGVycy4KKyNkZWZpbmUgVFJBQ0VfQ09VTlRFUjEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHZhbHVl
KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChU
UkFDRV9FVkVOVF9QSEFTRV9DT1VOVEVSLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCAidmFsdWUiLCAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGlu
dD4odmFsdWUpKQorI2RlZmluZSBUUkFDRV9DT1VOVEVSX1dJVEhfRkxBRzEoY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGZsYWcsIHZhbHVlKSAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRf
QUREKFRSQUNFX0VWRU5UX1BIQVNFX0NPVU5URVIsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLCAidmFsdWUiLCBzdGF0aWNfY2FzdDxpbnQ+
KHZhbHVlKSkKKyNkZWZpbmUgVFJBQ0VfQ09QWV9DT1VOVEVSMShjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FE
RChUUkFDRV9FVkVOVF9QSEFTRV9DT1VOVEVSLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZLCAidmFsdWUiLCAg
ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PGludD4odmFsdWUpKQorI2RlZmluZSBUUkFDRV9DT1VOVEVSMihjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgdmFsdWUxX25hbWUsIHZhbHVlMV92YWwsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAg
ICAgdmFsdWUyX25hbWUsIHZhbHVlMl92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9DT1VOVEVSLCBj
YXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0Vf
RVZFTlRfRkxBR19OT05FLCB2YWx1ZTFfbmFtZSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odmFsdWUxX3ZhbCksIHZhbHVlMl9uYW1l
LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHZh
bHVlMl92YWwpKQorI2RlZmluZSBUUkFDRV9DT1BZX0NPVU5URVIyKGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCB2YWx1ZTFfbmFtZSwgdmFsdWUxX3ZhbCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB2YWx1ZTJfbmFtZSwgdmFsdWUyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICBcCisg
IElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9DT1VOVEVSLCBjYXRl
Z29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZF
TlRfRkxBR19DT1BZLCB2YWx1ZTFfbmFtZSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odmFsdWUxX3ZhbCksIHZhbHVlMl9uYW1lLCAg
ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVl
Ml92YWwpKQorCisvLyBDb3VudGVycyB3aXRoIGV4cGxpY2l0IHRpbWVzdGFtcHMuCisjZGVmaW5l
IFRSQUNFX0NPVU5URVJfV0lUSF9USU1FU1RBTVAxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCB0aW1l
c3RhbXAsIHZhbHVlKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX1RJTUVTVEFN
UCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVO
VF9QSEFTRV9DT1VOVEVSLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgdGltZXN0YW1wLCAgICAgICAg
ICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICJ2YWx1ZSIsIHN0YXRpY19jYXN0
PGludD4odmFsdWUpKQorCisjZGVmaW5lIFRSQUNFX0NPVU5URVJfV0lUSF9USU1FU1RBTVAyKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCB0aW1lc3RhbXAsICAgICAgXAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB2YWx1ZTFfbmFtZSwgdmFsdWUxX3ZhbCwgdmFsdWUyX25hbWUs
IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUyX3ZhbCkgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRI
X1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJB
Q0VfRVZFTlRfUEhBU0VfQ09VTlRFUiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCwg
ICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgdmFsdWUxX25hbWUsIHN0
YXRpY19jYXN0PGludD4odmFsdWUxX3ZhbCksICAgICBcCisgICAgICB2YWx1ZTJfbmFtZSwgc3Rh
dGljX2Nhc3Q8aW50Pih2YWx1ZTJfdmFsKSkKKworLy8gQ291bnRlcnMgd2l0aCBpZHMuCisjZGVm
aW5lIFRSQUNFX0NPVU5URVJfSUQxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgdmFsdWUpICAg
ICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRS
QUNFX0VWRU5UX1BIQVNFX0NPVU5URVIsIGNhdGVnb3J5X2dyb3VwLCBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlkLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICJ2
YWx1ZSIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PGludD4odmFsdWUpKQorI2RlZmluZSBUUkFDRV9DT1BZX0NPVU5URVJfSUQxKGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBpZCwgdmFsdWUpICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9F
VkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9DT1VOVEVSLCBjYXRlZ29yeV9ncm91
cCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpZCwgVFJBQ0Vf
RVZFTlRfRkxBR19DT1BZLCAidmFsdWUiLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlKSkKKyNkZWZpbmUgVFJBQ0VfQ09VTlRFUl9J
RDIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB2YWx1ZTFfbmFtZSwgdmFsdWUxX3ZhbCwgIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUyX25hbWUsIHZhbHVlMl92YWwpICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhf
SUQoVFJBQ0VfRVZFTlRfUEhBU0VfQ09VTlRFUiwgY2F0ZWdvcnlfZ3JvdXAsIFwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaWQsIFRSQUNFX0VWRU5UX0ZMQUdfTk9O
RSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUx
X25hbWUsIHN0YXRpY19jYXN0PGludD4odmFsdWUxX3ZhbCksIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdmFsdWUyX25hbWUsIHN0YXRpY19jYXN0PGludD4odmFsdWUyX3Zh
bCkpCisjZGVmaW5lIFRSQUNFX0NPUFlfQ09VTlRFUl9JRDIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IGlkLCB2YWx1ZTFfbmFtZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdmFsdWUxX3ZhbCwgdmFsdWUyX25hbWUsIHZhbHVlMl92YWwpICAgICAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0NPVU5URVIs
IGNhdGVnb3J5X2dyb3VwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5h
bWUsIGlkLCBUUkFDRV9FVkVOVF9GTEFHX0NPUFksICAgICAgICAgICBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMV9uYW1lLCBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVl
MV92YWwpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMl9uYW1l
LCBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlMl92YWwpKQorCisvLyBTYW1wbGluZyBwcm9maWxlciBl
dmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX1NBTVBMRV9XSVRIX0lEMShjYXRlZ29yeV9ncm91
cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYXJnMV92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfU0FN
UExFLCBjYXRlZ29yeV9ncm91cCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5hbWUsIGlkLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkKKworLy8gTGVnYWN5IGFzeW5j
IGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfQkVHSU4wKGNhdGVnb3J5X2dyb3Vw
LCBuYW1lLCBpZCkgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQo
VFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfQkVHSU4sIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FKQorI2RlZmluZSBU
UkFDRV9FVkVOVF9BU1lOQ19CRUdJTjEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25h
bWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lE
KFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0JFR0lOLCAgICAgXAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgIFwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBh
cmcxX25hbWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9BU1lOQ19CRUdJTjIoY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfQkVHSU4sIGNhdGVnb3J5
X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwg
YXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0Vf
RVZFTlRfQ09QWV9BU1lOQ19CRUdJTjAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkKSAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNf
QkVHSU4sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
VFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0FTWU5DX0JF
R0lOMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9Q
SEFTRV9BU1lOQ19CRUdJTiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgICAgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFksIGFyZzFf
bmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfQVNZTkNfQkVHSU4yKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICBc
CisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJ
TiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9F
VkVOVF9GTEFHX0NPUFksIGFyZzFfbmFtZSwgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwp
CisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0JFR0lOX1dJVEhfRkxBR1MwKGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBpZCwgZmxhZ3MpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhf
SUQoVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfQkVHSU4sICAgICAgICAgICAgXAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGZsYWdz
KQorCisvLyBMZWdhY3kgYXN5bmMgZXZlbnRzIHdpdGggZXhwbGljaXQgdGltZXN0YW1wcy4KKyNk
ZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfQkVHSU5fV0lUSF9USU1FU1RBTVAwKGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBpZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGltZXN0YW1wKSAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VW
RU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgaWQsICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFE
X0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZF
TlRfQVNZTkNfQkVHSU5fV0lUSF9USU1FU1RBTVAxKCAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRpbWVzdGFtcCwgYXJnMV9uYW1lLCBh
cmcxX3ZhbCkgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhf
SURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNF
X0VWRU5UX1BIQVNFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAg
ICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVBRF9JRCwgdGltZXN0
YW1wLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIFwKKyAgICAgIGFyZzFfbmFtZSwgYXJnMV92YWwp
CisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0JFR0lOX1dJVEhfVElNRVNUQU1QMihjYXRlZ29y
eV9ncm91cCwgbmFtZSwgaWQsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBhcmcxX25hbWUsICAgICAgICAgIFwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsLCBhcmcy
X25hbWUsIGFyZzJfdmFsKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJ
RF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0Vf
RVZFTlRfUEhBU0VfQVNZTkNfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAg
ICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVBRF9JRCwgdGlt
ZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICAgICBcCisgICAgICBhcmcxX25hbWUsIGFy
ZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0FT
WU5DX0JFR0lOX1dJVEhfVElNRVNUQU1QMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIFwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0
YW1wKSAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lE
X1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJB
Q0VfRVZFTlRfUEhBU0VfQVNZTkNfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAg
ICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVBRF9JRCwg
dGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX0NPUFkpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0FT
WU5DX0JFR0lOX1dJVEhfVElNRVNUQU1QX0FORF9GTEFHUzAoICAgICBcCisgICAgY2F0ZWdvcnlf
Z3JvdXAsIG5hbWUsIGlkLCB0aW1lc3RhbXAsIGZsYWdzKSAgICAgICAgICAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAg
ICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJTiwgY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkLCBcCisgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRp
bWVzdGFtcCwgZmxhZ3MpCisKKy8vIExlZ2FjeSBhc3luYyBzdGVwIGludG8gZXZlbnRzLgorI2Rl
ZmluZSBUUkFDRV9FVkVOVF9BU1lOQ19TVEVQX0lOVE8wKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBp
ZCwgc3RlcCkgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZF
TlRfUEhBU0VfQVNZTkNfU1RFUF9JTlRPLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICJzdGVwIiwgc3Rl
cCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfU1RFUF9JTlRPMShjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQsIHN0ZXAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
cmcxX25hbWUsIGFyZzFfdmFsKSAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRf
QUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRS
QUNFX0VWRU5UX1BIQVNFX0FTWU5DX1NURVBfSU5UTywgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgInN0ZXAiLCBzdGVwLCBhcmcxX25h
bWUsIGFyZzFfdmFsKQorCisvLyBMZWdhY3kgYXN5bmMgc3RlcCBpbnRvIGV2ZW50cyB3aXRoIHRp
bWVzdGFtcHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX1NURVBfSU5UT19XSVRIX1RJTUVT
VEFNUDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBcCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCwgdGltZXN0YW1wKSAgICAgICAgICBc
CisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19T
VEVQX0lOVE8sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICBcCisgICAgICBU
UkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRf
RkxBR19OT05FLCAgICBcCisgICAgICAic3RlcCIsIHN0ZXApCisKKy8vIExlZ2FjeSBhc3luYyBz
dGVwIHBhc3QgZXZlbnRzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9BU1lOQ19TVEVQX1BBU1QwKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgc3RlcCkgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRf
QUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfU1RFUF9QQVNULCBcCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAg
ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9G
TEFHX05PTkUsICJzdGVwIiwgc3RlcCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfU1RFUF9Q
QVNUMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHN0ZXAsIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBhcmcxX25hbWUsIGFyZzFfdmFsKSAgICAgICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX1NURVBfUEFTVCwgY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwg
InN0ZXAiLCBzdGVwLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorCisvLyBMZWdhY3kgYXN5bmMgZW5k
IGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfRU5EMChjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQpICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRS
QUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FKQorI2RlZmluZSBUUkFDRV9F
VkVOVF9BU1lOQ19FTkQxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBhcmcx
X3ZhbCkgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9Q
SEFTRV9BU1lOQ19FTkQsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUs
IGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0VORDIoY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKCAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9Q
SEFTRV9BU1lOQ19FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgICAg
ICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwsIGFy
ZzJfbmFtZSwgYXJnMl92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfQVNZTkNfRU5EMChj
YXRlZ29yeV9ncm91cCwgbmFtZSwgaWQpICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERf
V0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19FTkQsIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICBcCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSkKKyNkZWZp
bmUgVFJBQ0VfRVZFTlRfQ09QWV9BU1lOQ19FTkQxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwg
YXJnMV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3Zh
bCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9B
RERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19FTkQsICAgICAgICAgIFwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAg
ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VW
RU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
Q09QWV9BU1lOQ19FTkQyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBh
cmcyX3ZhbCkgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRCggICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BI
QVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICBcCisg
ICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFksIGFyZzFfbmFtZSwgYXJnMV92YWwsIGFyZzJfbmFt
ZSwgYXJnMl92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0VORF9XSVRIX0ZMQUdTMChj
YXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGZsYWdzKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5U
X0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgICAgICAgICAgICBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBp
ZCwgZmxhZ3MpCisKKy8vIExlZ2FjeSBhc3luYyBlbmQgZXZlbnRzIHdpdGggZXhwbGljaXQgdGlt
ZXN0YW1wcy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfRU5EX1dJVEhfVElNRVNUQU1QMChj
YXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0aW1lc3RhbXApICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxf
VFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAg
ICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkLCAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RI
UkVBRF9JRCwgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNF
X0VWRU5UX0FTWU5DX0VORF9XSVRIX1RJTUVTVEFNUDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dGltZXN0YW1wLCBhcmcxX25hbWUsIGFyZzFfdmFsKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5U
X0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCBpZCwgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9U
SFJFQURfSUQsIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCAgICBcCisgICAgICBh
cmcxX25hbWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9BU1lOQ19FTkRfV0lUSF9U
SU1FU1RBTVAyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgYXJnMV9uYW1lLCBh
cmcxX3ZhbCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVO
VF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgICAgICAg
XAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgaWQsICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRf
VEhSRUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgICAgXAorICAgICAg
YXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0Vf
RVZFTlRfQ09QWV9BU1lOQ19FTkRfV0lUSF9USU1FU1RBTVAwKGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCBpZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGltZXN0YW1wKSAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FE
RF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFE
X0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSkKKyNkZWZpbmUgVFJBQ0VfRVZF
TlRfQVNZTkNfRU5EX1dJVEhfVElNRVNUQU1QX0FORF9GTEFHUzAoY2F0ZWdvcnlfZ3JvdXAsIG5h
bWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWQsIHRpbWVzdGFtcCwgZmxhZ3MpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
X1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVB
RF9JRCwgdGltZXN0YW1wLCBmbGFncykKKworLy8gQXN5bmMgZXZlbnRzLgorI2RlZmluZSBUUkFD
RV9FVkVOVF9ORVNUQUJMRV9BU1lOQ19CRUdJTjAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkKSAg
ICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9Q
SEFTRV9ORVNUQUJMRV9BU1lOQ19CRUdJTiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgICAgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisjZGVm
aW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5DX0JFR0lOMShjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgaWQsIGFyZzFfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYXJnMV92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxf
VFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNf
QkVHSU4sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5
X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92
YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5DX0JFR0lOMihjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9B
U1lOQ19CRUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgXAorICAgICAgVFJB
Q0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJf
dmFsKQorCisvLyBBc3luYyBlbmQgZXZlbnRzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9ORVNUQUJM
RV9BU1lOQ19FTkQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICAgICAgIFwKKyAgSU5URVJO
QUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZ
TkNfRU5ELCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RB
QkxFX0FTWU5DX0VORDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIFwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChU
UkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lOQ19FTkQsICAgICBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAg
ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRf
RkxBR19OT05FLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9ORVNU
QUJMRV9BU1lOQ19FTkQyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWwsIGFyZzJfbmFt
ZSwgYXJnMl92YWwpICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQo
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0Vf
RVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQs
ICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92
YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpCisKKy8vIEFzeW5jIGluc3RhbnQgZXZlbnRzLgorI2Rl
ZmluZSBUUkFDRV9FVkVOVF9ORVNUQUJMRV9BU1lOQ19JTlNUQU5UMChjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQpICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRS
QUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0lOU1RBTlQsIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAg
ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9G
TEFHX05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5DX0lOU1RBTlQxKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJnMV9uYW1lLCBhcmcxX3ZhbCkgICAgICAgICAgICAgXAor
ICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9ORVNU
QUJMRV9BU1lOQ19JTlNUQU5ULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUs
IGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9ORVNUQUJMRV9BU1lOQ19JTlNUQU5UMigg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IGlkLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKSAgIFwKKyAgSU5U
RVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNfSU5T
VEFOVCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFH
X05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpCisjZGVmaW5l
IFRSQUNFX0VWRU5UX0NPUFlfTkVTVEFCTEVfQVNZTkNfQkVHSU5fV0lUSF9UVFMyKCAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1l
LCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkgICAgICAgIFwKKyAgSU5URVJOQUxfVFJB
Q0VfRVZFTlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lOQ19CRUdJTiwg
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfRkxB
R19BU1lOQ19UVFMgfCBUUkFDRV9FVkVOVF9GTEFHX0NPUFksIGFyZzFfbmFtZSwgYXJnMV92YWws
IFwKKyAgICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlf
TkVTVEFCTEVfQVNZTkNfRU5EX1dJVEhfVFRTMiggICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9u
YW1lLCBhcmcyX3ZhbCkgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhf
SUQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBU
UkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lOQ19FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCBpZCwgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfRkxBR19BU1lOQ19UVFMgfCBUUkFD
RV9FVkVOVF9GTEFHX0NPUFksIGFyZzFfbmFtZSwgYXJnMV92YWwsIFwKKyAgICAgIGFyZzJfbmFt
ZSwgYXJnMl92YWwpCisKKy8vIEFzeW5jIGV2ZW50cyB3aXRoIGV4cGxpY2l0IHRpbWVzdGFtcHMu
CisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5DX0JFR0lOX1dJVEhfVElNRVNUQU1Q
MChjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIHRpbWVzdGFtcCkgICAgICAgIFwKKyAgSU5U
RVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lO
Q19CRUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgXAorICAgICAgVFJBQ0Vf
RVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdf
Tk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfTkVTVEFCTEVfQVNZTkNfRU5EX1dJVEhfVElNRVNU
QU1QMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCB0aW1lc3RhbXApICAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5D
X0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgXAorICAgICAgVFJBQ0VfRVZF
TlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfTk9O
RSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfTkVTVEFCTEVfQVNZTkNfRU5EX1dJVEhfVElNRVNUQU1Q
MSggICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRp
bWVzdGFtcCwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxf
VFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0VORCwgY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJS
RU5UX1RIUkVBRF9JRCwgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIFwKKyAgICAg
IGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5D
X0lOU1RBTlRfV0lUSF9USU1FU1RBTVAwKCAgICAgICAgICAgICAgIFwKKyAgICBjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQsIHRpbWVzdGFtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFN
UCggICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJM
RV9BU1lOQ19JTlNUQU5ULCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIFwKKyAgICAgIFRSQUNF
X0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVBRF9JRCwgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFH
X05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfTkVTVEFCTEVfQVNZTkNfQkVHSU4wKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9X
SVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0JFR0lOLCBcCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAg
ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VW
RU5UX0ZMQUdfQ09QWSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9ORVNUQUJMRV9BU1lOQ19F
TkQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5U
X0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0VORCwgXAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQs
ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0Vf
RVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX05FU1RBQkxFX0FTWU5D
X0JFR0lOX1dJVEhfVElNRVNUQU1QMCggICAgICAgICAgXAorICAgIGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBpZCwgdGltZXN0YW1wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJ
TlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAg
ICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNfQkVH
SU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgXAorICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NV
UlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSkKKyNkZWZp
bmUgVFJBQ0VfRVZFTlRfQ09QWV9ORVNUQUJMRV9BU1lOQ19FTkRfV0lUSF9USU1FU1RBTVAwKCAg
ICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aW1lc3RhbXApICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lU
SF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VW
RU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBc
CisgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRpbWVzdGFtcCwgVFJB
Q0VfRVZFTlRfRkxBR19DT1BZKQorCisvLyBMZWdhY3kgZmxvdyBldmVudHMuCisjZGVmaW5lIFRS
QUNFX0VWRU5UX0ZMT1dfQkVHSU4wKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICAgICAgIFwK
KyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxP
V19CRUdJTiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRkxPV19CRUdJTjEo
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIGFyZzFfdmFsKSBcCisgIElOVEVS
TkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1dfQkVHSU4s
ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRl
Z29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUsIGFy
ZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9GTE9XX0JFR0lOMihjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQsIGFyZzFfbmFtZSwgYXJnMV92YWwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19C
RUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAgIFwKKyAgICAg
IFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBh
cmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9GTE9XX0JFR0lOMChjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQpICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChU
UkFDRV9FVkVOVF9QSEFTRV9GTE9XX0JFR0lOLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFD
RV9FVkVOVF9DT1BZX0ZMT1dfQkVHSU4xKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9u
YW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWwpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJ
VEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19CRUdJTiwgICAgICAgICAgXAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAg
ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5U
X0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09Q
WV9GTE9XX0JFR0lOMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgXAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFy
ZzJfdmFsKSAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKCAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BI
QVNFX0ZMT1dfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgXAor
ICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25h
bWUsIGFyZzJfdmFsKQorCisvLyBMZWdhY3kgZmxvdyBzdGVwIGV2ZW50cy4KKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfRkxPV19TVEVQMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHN0ZXApICBcCisg
IElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1df
U1RFUCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91
cCwgbmFtZSwgaWQsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJB
Q0VfRVZFTlRfRkxBR19OT05FLCAic3RlcCIsIHN0ZXApCisjZGVmaW5lIFRSQUNFX0VWRU5UX0ZM
T1dfU1RFUDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBzdGVwLCBhcmcxX25hbWUsIFwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRCggICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9Q
SEFTRV9GTE9XX1NURVAsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgIFwK
KyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgInN0ZXAiLCBzdGVwLCBhcmcxX25hbWUsIGFy
ZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0ZMT1dfU1RFUDAoY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCBzdGVwKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lE
KFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1dfU1RFUCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFksICJzdGVw
Iiwgc3RlcCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9GTE9XX1NURVAxKGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBpZCwgc3RlcCwgYXJnMV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRCggICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1df
U1RFUCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAgICBcCisgICAg
ICBUUkFDRV9FVkVOVF9GTEFHX0NPUFksICJzdGVwIiwgc3RlcCwgYXJnMV9uYW1lLCBhcmcxX3Zh
bCkKKworLy8gTGVnYWN5IGZsb3cgZW5kIGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRkxP
V19FTkQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICAgICAgICAgICAgICAgICAgICAgICBc
CisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0ZM
T1dfRU5ELCBjYXRlZ29yeV9ncm91cCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBuYW1lLCBpZCwgVFJBQ0VfRVZFTlRfRkxBR19OT05FKQorI2RlZmluZSBUUkFDRV9FVkVO
VF9GTE9XX0VORF9CSU5EX1RPX0VOQ0xPU0lORzAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkKSAg
ICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhB
U0VfRkxPV19FTkQsIGNhdGVnb3J5X2dyb3VwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0JJTkRf
VE9fRU5DTE9TSU5HKQorI2RlZmluZSBUUkFDRV9FVkVOVF9GTE9XX0VORDEoY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIGFyZzFfdmFsKSAgIFwKKyAgSU5URVJOQUxfVFJBQ0Vf
RVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19FTkQsIGNhdGVnb3J5X2dy
b3VwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlkLCBUUkFD
RV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRkxPV19FTkQyKGNhdGVn
b3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgICBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9F
VkVOVF9QSEFTRV9GTE9XX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbmFtZSwgaWQsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgYXJnMV9u
YW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsLCBhcmcy
X25hbWUsIGFyZzJfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0ZMT1dfRU5EMChjYXRl
Z29yeV9ncm91cCwgbmFtZSwgaWQpICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJB
Q0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19FTkQsIGNhdGVnb3J5
X2dyb3VwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlkLCBU
UkFDRV9FVkVOVF9GTEFHX0NPUFkpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfRkxPV19FTkQx
KGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCAgICAgICAgXAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0Vf
RVZFTlRfUEhBU0VfRkxPV19FTkQsIGNhdGVnb3J5X2dyb3VwLCBcCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5hbWUsIGlkLCBUUkFDRV9FVkVOVF9GTEFHX0NPUFksIGFyZzFf
bmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkKKyNk
ZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9GTE9XX0VORDIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCBhcmcxX25hbWUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAgICAgICAgXAorICBJTlRFUk5B
TF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9GTE9XX0VORCwgY2F0
ZWdvcnlfZ3JvdXAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwg
aWQsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBcCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKQorCisvLyBT
cGVjaWFsIHN0cm9uZ2x5IHR5cGVkIHRyYWNlIGV2ZW50cy4KKy8vIFRPRE8oc2t5b3N0aWwpOiBN
aWdyYXRlIHRoZXNlIHRvIHJlZ3VsYXIgdHJhY2sgZXZlbnQgdHJhY2UgcG9pbnRzLgorI2RlZmlu
ZSBUUkFDRV9UQVNLX0VYRUNVVElPTihydW5fZnVuY3Rpb24sIHRhc2spIFwKKyAgaWYgKGZhbHNl
KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmFzZTo6aWdub3Jl
X3Jlc3VsdChydW5fZnVuY3Rpb24pOyAgICAgICAgICAgXAorICAgIGJhc2U6Omlnbm9yZV9yZXN1
bHQodGFzayk7ICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFRSQUNFX0xPR19N
RVNTQUdFKGZpbGUsIG1lc3NhZ2UsIGxpbmUpIFwKKyAgaWYgKGZhbHNlKSB7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJhc2U6Omlnbm9yZV9yZXN1bHQoZmlsZSk7ICAg
ICAgICAgICAgICAgICBcCisgICAgYmFzZTo6aWdub3JlX3Jlc3VsdChtZXNzYWdlKTsgICAgICAg
ICAgICAgIFwKKyAgICBiYXNlOjppZ25vcmVfcmVzdWx0KGxpbmUpOyAgICAgICAgICAgICAgICAg
XAorICB9CisKKy8vIE1ldGFkYXRhIGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfTUVUQURB
VEExKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsKSBcCisgIElOVEVS
TkFMX1RSQUNFX0VWRU5UX01FVEFEQVRBX0FERChjYXRlZ29yeV9ncm91cCwgbmFtZSwgYXJnMV9u
YW1lLCBhcmcxX3ZhbCkKKworLy8gQ2xvY2sgc3luYyBldmVudHMuCisjZGVmaW5lIFRSQUNFX0VW
RU5UX0NMT0NLX1NZTkNfUkVDRUlWRVIoc3luY19pZCkgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9DTE9DS19T
WU5DLCAiX19tZXRhZGF0YSIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xv
Y2tfc3luYyIsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgInN5bmNfaWQiLCBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzeW5jX2lkKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DTE9DS19TWU5D
X0lTU1VFUihzeW5jX2lkLCBpc3N1ZV90cywgaXNzdWVfZW5kX3RzKSAgICAgICAgXAorICBJTlRF
Uk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfQ0xPQ0tfU1lOQywgIl9f
bWV0YWRhdGEiLCAiY2xvY2tfc3luYyIsIGlzc3VlX2VuZF90cywgXAorICAgICAgVFJBQ0VfRVZF
TlRfRkxBR19OT05FLCAic3luY19pZCIsIHN5bmNfaWQsICJpc3N1ZV90cyIsIGlzc3VlX3RzKQor
CisvLyBPYmplY3QgZXZlbnRzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9PQkpFQ1RfQ1JFQVRFRF9X
SVRIX0lEKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVO
VF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9DUkVBVEVfT0JKRUNULCAgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAg
ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9G
TEFHX05PTkUpCisKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfT0JKRUNUX1NOQVBTSE9UX1dJVEhfSUQo
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNuYXBzaG90KSAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9U
UkFDRV9FVkVOVF9BRERfV0lUSF9JRCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX1NOQVBTSE9UX09CSkVDVCwgY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCAgICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICJzbmFwc2hv
dCIsIHNuYXBzaG90KQorCisjZGVmaW5lIFRSQUNFX0VWRU5UX09CSkVDVF9TTkFQU0hPVF9XSVRI
X0lEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkLCB0aW1lc3RhbXAsIHNuYXBzaG90KSAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9TTkFQU0hPVF9P
QkpFQ1QsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICBcCisgICAgICBUUkFDRV9F
VkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19O
T05FLCBcCisgICAgICAic25hcHNob3QiLCBzbmFwc2hvdCkKKworI2RlZmluZSBUUkFDRV9FVkVO
VF9PQkpFQ1RfREVMRVRFRF9XSVRIX0lEKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgXAorICBJ
TlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9ERUxFVEVf
T0JKRUNULCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisKKy8vIENvbnRleHQgZXZlbnRzLgorI2RlZmlu
ZSBUUkFDRV9FVkVOVF9FTlRFUl9DT05URVhUKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBjb250ZXh0
KSAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BI
QVNFX0VOVEVSX0NPTlRFWFQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGNvbnRleHQsICAgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5U
X0xFQVZFX0NPTlRFWFQoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGNvbnRleHQpICAgIFwKKyAgSU5U
RVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfTEVBVkVfQ09O
VEVYVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91
cCwgbmFtZSwgY29udGV4dCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKworLy8gTWFjcm8gdG8gZWZmaWNpZW50bHkgZGV0ZXJt
aW5lIGlmIGEgZ2l2ZW4gY2F0ZWdvcnkgZ3JvdXAgaXMgZW5hYmxlZC4KKyNkZWZpbmUgVFJBQ0Vf
RVZFTlRfQ0FURUdPUllfR1JPVVBfRU5BQkxFRChjYXRlZ29yeSwgcmV0KSBcCisgIGRvIHsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpy
ZXQgPSBUUkFDRV9FVkVOVF9DQVRFR09SWV9FTkFCTEVEKGNhdGVnb3J5KTsgICAgICAgIFwKKyAg
fSB3aGlsZSAoMCkKKworLy8gTWFjcm8gdG8gZWZmaWNpZW50bHkgZGV0ZXJtaW5lLCB0aHJvdWdo
IHBvbGxpbmcsIGlmIGEgbmV3IHRyYWNlIGhhcyBiZWd1bi4KKy8vIFRPRE8oc2t5b3N0aWwpOiBJ
bXBsZW1lbnQuCisjZGVmaW5lIFRSQUNFX0VWRU5UX0lTX05FV19UUkFDRShyZXQpIFwKKyAgZG8g
eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpyZXQgPSBmYWxzZTsgICAg
ICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKy8vIExlZ2FjeSB0cmFjaW5nIEFQSSAoYWRhcHRlZCBmcm9tIHRyYWNlX2V2ZW50LmgpLgor
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXZSBjYW4gaW1wbGVtZW50IHRoZSBmb2xsb3dp
bmcgc3Vic2V0IG9mIHRoZSBsZWdhY3kgdHJhY2luZyBBUEkgd2l0aG91dAorLy8gaW52b2x2ZW1l
bnQgZnJvbSB0aGUgZW1iZWRkZXIuIEFQSXMgc3VjaCBhcyBUUkFDRV9FVkVOVF9BUElfQUREX1RS
QUNFX0VWRU5UCisvLyBhcmUgc3RpbGwgdXAgdG8gdGhlIGVtYmVkZGVyIHRvIGRlZmluZS4KKwor
I2RlZmluZSBUUkFDRV9TVFJfQ09QWShzdHIpIChzdHIpCisKKyNkZWZpbmUgVFJBQ0VfSURfV0lU
SF9TQ09QRShzY29wZSwgLi4uKSBcCisgIDo6cGVyZmV0dG86OmludGVybmFsOjpMZWdhY3lUcmFj
ZUlkOjpXaXRoU2NvcGUoc2NvcGUsICMjX19WQV9BUkdTX18pCisKKy8vIFVzZSB0aGlzIGZvciBp
ZHMgdGhhdCBhcmUgdW5pcXVlIGFjcm9zcyBwcm9jZXNzZXMuIFRoaXMgYWxsb3dzIGRpZmZlcmVu
dAorLy8gcHJvY2Vzc2VzIHRvIHVzZSB0aGUgc2FtZSBpZCB0byByZWZlciB0byB0aGUgc2FtZSBl
dmVudC4KKyNkZWZpbmUgVFJBQ0VfSURfR0xPQkFMKGlkKSA6OnBlcmZldHRvOjppbnRlcm5hbDo6
TGVnYWN5VHJhY2VJZDo6R2xvYmFsSWQoaWQpCisKKy8vIFVzZSB0aGlzIGZvciBpZHMgdGhhdCBh
cmUgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzLiBUaGlzIGFsbG93cworLy8gZGlmZmVy
ZW50IHByb2Nlc3NlcyB0byB1c2UgdGhlIHNhbWUgaWQgdG8gcmVmZXIgdG8gZGlmZmVyZW50IGV2
ZW50cy4KKyNkZWZpbmUgVFJBQ0VfSURfTE9DQUwoaWQpIDo6cGVyZmV0dG86OmludGVybmFsOjpM
ZWdhY3lUcmFjZUlkOjpMb2NhbElkKGlkKQorCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHVp
bnQ4X3Qgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdHJhY2luZyBpcyBlbmFibGVkIGZvcgorLy8g
dGhlIGdpdmVuIGNhdGVnb3J5IG9yIG5vdC4gQSB6ZXJvIHZhbHVlIG1lYW5zIHRyYWNpbmcgaXMg
ZGlzYWJsZWQgYW5kCisvLyBub24temVybyBpbmRpY2F0ZXMgYXQgbGVhc3Qgb25lIHRyYWNpbmcg
c2Vzc2lvbiBmb3IgdGhpcyBjYXRlZ29yeSBpcyBhY3RpdmUuCisvLyBOb3RlIHRoYXQgY2FsbGVy
cyBzaG91bGQgbm90IG1ha2UgYW55IGFzc3VtcHRpb25zIGF0IHdoYXQgZWFjaCBiaXQgcmVwcmVz
ZW50cworLy8gaW4gdGhlIHN0YXR1cyBieXRlLiBEb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgY2F0
ZWdvcmllcy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVBJX0dFVF9DQVRFR09SWV9HUk9VUF9FTkFC
TEVEKGNhdGVnb3J5KSAgICAgICAgICAgICAgICAgXAorICByZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICBbJl0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljX2Fzc2VydCggICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAg
ITo6UEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFOjppbnRlcm5hbDo6SXNEeW5hbWljQ2F0
ZWdvcnkoICBcCisgICAgICAgICAgICAgICAgY2F0ZWdvcnkpLCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJFbmFibGVkIGZs
YWcgcG9pbnRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGR5bmFtaWMgdHJhY2UgIiAgICAgXAor
ICAgICAgICAgICAgImNhdGVnb3JpZXMuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6UEVS
RkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFOjppbnRlcm5hbDo6a0NvbnN0RXhwckNhdGVnb3J5
UmVnaXN0cnkgXAorICAgICAgICAgIC5HZXRDYXRlZ29yeVN0YXRlKFBFUkZFVFRPX0dFVF9DQVRF
R09SWV9JTkRFWChjYXRlZ29yeSkpKQorCisjZW5kaWYgIC8vIFBFUkZFVFRPX0VOQUJMRV9MRUdB
Q1lfVFJBQ0VfRVZFTlRTCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RS
QUNLX0VWRU5UX0xFR0FDWV9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvdHJhY2tfZXZlbnRfbGVnYWN5LmgiCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvdHJh
Y2suaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBsZWdhY3kgeworCit0ZW1w
bGF0ZSA8PgorYm9vbCBDb252ZXJ0VGhyZWFkSWQoY29uc3QgUGVyZmV0dG9MZWdhY3lDdXJyZW50
VGhyZWFkSWQmLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqLAorICAgICAgICAgICAg
ICAgICAgICAgaW50MzJfdCosCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KikgeworICAv
LyBObyBuZWVkIHRvIG92ZXJyaWRlIGFueXRoaW5nIGZvciBldmVudHMgb24gdG8gdGhlIGN1cnJl
bnQgdGhyZWFkLgorICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsZWdhY3kK
KworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBMZWdhY3lUcmFjZUlkOjpXcml0ZShwcm90
b3M6OnBiemVybzo6VHJhY2tFdmVudDo6TGVnYWN5RXZlbnQqIGV2ZW50LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICB1aW50MzJfdCBldmVudF9mbGFncykgY29uc3QgeworICAvLyBMZWdhY3kg
ZmxvdyBldmVudHMgYWx3YXlzIHVzZSBiaW5kX2lkLgorICBpZiAoZXZlbnRfZmxhZ3MgJgorICAg
ICAgKGxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnRmxvd091dCB8IGxlZ2FjeTo6a1RyYWNlRXZlbnRG
bGFnRmxvd0luKSkgeworICAgIC8vIEZsb3cgYmluZF9pZHMgZG9uJ3QgaGF2ZSBzY29wZXMsIHNv
IHdlIG5lZWQgdG8gbWFuZ2xlIGluLXByb2Nlc3Mgb25lcyB0bworICAgIC8vIGF2b2lkIGNvbGxp
c2lvbnMuCisgICAgaWYgKGlkX2ZsYWdzXyAmIGxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnSGFzTG9j
YWxJZCkgeworICAgICAgZXZlbnQtPnNldF9iaW5kX2lkKHJhd19pZF8gXiBQcm9jZXNzVHJhY2s6
OkN1cnJlbnQoKS51dWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgZXZlbnQtPnNldF9iaW5kX2lk
KHJhd19pZF8pOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICB1aW50MzJfdCBzY29wZV9m
bGFncyA9IGlkX2ZsYWdzXyAmIChsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0lkIHwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5OjprVHJhY2VFdmVudEZsYWdI
YXNMb2NhbElkIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5
OjprVHJhY2VFdmVudEZsYWdIYXNHbG9iYWxJZCk7CisgIHN3aXRjaCAoc2NvcGVfZmxhZ3MpIHsK
KyAgICBjYXNlIGxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnSGFzSWQ6CisgICAgICBldmVudC0+c2V0
X3Vuc2NvcGVkX2lkKHJhd19pZF8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsZWdhY3k6OmtU
cmFjZUV2ZW50RmxhZ0hhc0xvY2FsSWQ6CisgICAgICBldmVudC0+c2V0X2xvY2FsX2lkKHJhd19p
ZF8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0ds
b2JhbElkOgorICAgICAgZXZlbnQtPnNldF9nbG9iYWxfaWQocmF3X2lkXyk7CisgICAgICBicmVh
azsKKyAgfQorICBpZiAoc2NvcGVfKQorICAgIGV2ZW50LT5zZXRfaWRfc2NvcGUoc2NvcGVfKTsK
K30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8K
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFjaW5nL3ZpcnR1YWxfZGVz
dHJ1Y3RvcnMuY2MKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBT
b3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwg
VmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmls
ZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRh
aW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNo
ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw
bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli
dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT
LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl
ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp
YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl
ciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNpbmdfdGxzLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNpbmcuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcv
dHJhY2luZ19iYWNrZW5kLmgiCisKKy8vIFRoaXMgdHJhbnNsYXRpb24gdW5pdCBjb250YWlucyB0
aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBkZXN0cnVjdG9yIG9mIHB1cmUKKy8vIHZpcnR1YWwgaW50
ZXJmYWNlcyBmb3IgdGhlIHNyYy9wdWJsaWM6cHVibGljIHRhcmdldC4gVGhlIGFsdGVybmF0aXZl
IHdvdWxkIGJlCisvLyBpbnRyb2R1Y2luZyBhIG9uZS1saW5lciAuY2MgZmlsZSBmb3IgZWFjaCBw
dXJlIHZpcnR1YWwgaW50ZXJmYWNlLCB3aGljaCBpcworLy8gb3ZlcmtpbGwuIFRoaXMgaXMgZm9y
IGNvbXBsaWFuY2Ugd2l0aCAtV3dlYWstdnRhYmxlcy4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK1RyYWNpbmdUTFM6On5UcmFjaW5nVExTKCkgPSBkZWZh
dWx0OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworVHJhY2luZ0JhY2tlbmQ6On5UcmFj
aW5nQmFja2VuZCgpID0gZGVmYXVsdDsKK1RyYWNpbmdTZXNzaW9uOjp+VHJhY2luZ1Nlc3Npb24o
KSA9IGRlZmF1bHQ7CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcvY29yZS9tZXRhdHJhY2Vfd3JpdGVyLmNjCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBzcmMvdHJhY2luZy9jb3JlL21ldGF0cmFj
ZV93cml0ZXIuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNv
dXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBW
ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxl
IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFp
biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hl
Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBs
aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs
CisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy
IGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj
IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVy
IHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1JDX1RSQUNJTkdfQ09SRV9NRVRBVFJBQ0Vf
V1JJVEVSX0hfCisjZGVmaW5lIFNSQ19UUkFDSU5HX0NPUkVfTUVUQVRSQUNFX1dSSVRFUl9IXwor
CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL21ldGF0cmFjZS5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jh
c2UvdGhyZWFkX2NoZWNrZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2V4dC9iYXNlL3dlYWtfcHRyLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CisKK25hbWVzcGFjZSBiYXNlIHsKK2NsYXNzIFRhc2tSdW5uZXI7Cit9CisKK2NsYXNzIFRyYWNl
V3JpdGVyOworCisvLyBDb21wbGVtZW50cyB0aGUgYmFzZTo6bWV0YXRyYWNlIGluZnJhc3RydWN0
dXJlLgorLy8gSXQgaG9va3MgYSBjYWxsYmFjayB0byBtZXRhdHJhY2U6OkVuYWJsZSgpIGFuZCB3
cml0ZXMgbWV0YXRyYWNlIGV2ZW50cyBpbnRvCisvLyBhIFRyYWNlV3JpdGVyIHdoZW5ldmVyIHRo
ZSBtZXRhdHJhY2UgcmluZyBidWZmZXIgaXMgaGFsZiBmdWxsLgorLy8gSXQgaXMgc2FmZSB0byBj
cmVhdGUgYW5kIGF0dGVtcHQgdG8gc3RhcnQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xh
c3MsCisvLyBob3dldmVyIG9ubHkgdGhlIGZpcnN0IG9uZSB3aWxsIHN1Y2NlZWQgYmVjYXVzZSB0
aGUgbWV0YXRyYWNlIGZyYW1ld29yaworLy8gZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIGluc3Rh
bmNlcy4KKy8vIFRoaXMgY2xhc3MgaXMgZGVmaW5lZCBoZXJlIChpbnN0ZWFkIG9mIGRpcmVjdGx5
IGluIHNyYy9wcm9iZXMvKSBzbyBpdCBjYW4KKy8vIGJlIHJldXNlZCBieSBvdGhlciBjb21wb25l
bnRzIChlLmcuIGhlYXBwcm9mZCkuCitjbGFzcyBNZXRhdHJhY2VXcml0ZXIgeworIHB1YmxpYzoK
KyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtEYXRhU291cmNlTmFtZVtdID0gInBlcmZldHRvLm1l
dGF0cmFjZSI7CisKKyAgTWV0YXRyYWNlV3JpdGVyKCk7CisgIH5NZXRhdHJhY2VXcml0ZXIoKTsK
KworICBNZXRhdHJhY2VXcml0ZXIoY29uc3QgTWV0YXRyYWNlV3JpdGVyJikgPSBkZWxldGU7Cisg
IE1ldGF0cmFjZVdyaXRlciYgb3BlcmF0b3I9KGNvbnN0IE1ldGF0cmFjZVdyaXRlciYpID0gZGVs
ZXRlOworICBNZXRhdHJhY2VXcml0ZXIoTWV0YXRyYWNlV3JpdGVyJiYpID0gZGVsZXRlOworICBN
ZXRhdHJhY2VXcml0ZXImIG9wZXJhdG9yPShNZXRhdHJhY2VXcml0ZXImJikgPSBkZWxldGU7CisK
KyAgdm9pZCBFbmFibGUoYmFzZTo6VGFza1J1bm5lciosIHN0ZDo6dW5pcXVlX3B0cjxUcmFjZVdy
aXRlcj4sIHVpbnQzMl90IHRhZ3MpOworICB2b2lkIERpc2FibGUoKTsKKyAgdm9pZCBXcml0ZUFs
bEFuZEZsdXNoVHJhY2VXcml0ZXIoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNhbGxiYWNrKTsKKwor
IHByaXZhdGU6CisgIHZvaWQgV3JpdGVBbGxBdmFpbGFibGVFdmVudHMoKTsKKworICBib29sIHN0
YXJ0ZWRfID0gZmFsc2U7CisgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyXyA9IG51bGxw
dHI7CisgIHN0ZDo6dW5pcXVlX3B0cjxUcmFjZVdyaXRlcj4gdHJhY2Vfd3JpdGVyXzsKKyAgUEVS
RkVUVE9fVEhSRUFEX0NIRUNLRVIodGhyZWFkX2NoZWNrZXJfKQorICBiYXNlOjpXZWFrUHRyRmFj
dG9yeTxNZXRhdHJhY2VXcml0ZXI+IHdlYWtfcHRyX2ZhY3RvcnlfOyAgLy8gS2VlcCBsYXN0Lgor
fTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gU1JDX1RSQUNJTkdf
Q09SRV9NRVRBVFJBQ0VfV1JJVEVSX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3BlcmZldHRvL3BlcmZldHRvX21ldGF0cmFjZS5w
Ynplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdp
bi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9QRVJGRVRUT19QRVJGRVRUT19NRVRBVFJBQ0VfUFJPVE9fSF8KKyNkZWZpbmUgUEVS
RkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9QRVJGRVRUT19QRVJGRVRUT19NRVRB
VFJBQ0VfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5o
PgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNv
ZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFj
ZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIFBlcmZldHRvTWV0YXRyYWNl
X0FyZzsKKworY2xhc3MgUGVyZmV0dG9NZXRhdHJhY2VfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki85LCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgUGVyZmV0dG9NZXRhdHJh
Y2VfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgUGVyZmV0dG9NZXRhdHJhY2VfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBQZXJmZXR0b01ldGF0cmFjZV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19ldmVudF9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1
aW50MzJfdCBldmVudF9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0K
KyAgYm9vbCBoYXNfY291bnRlcl9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBjb3VudGVyX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50
MzIoKTsgfQorICBib29sIGhhc19ldmVudF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGV2ZW50X25hbWUoKSBjb25zdCB7
IHJldHVybiBhdDw4PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2NvdW50ZXJfbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RD
aGFycyBjb3VudGVyX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3N0cmluZygpOyB9
CisgIGJvb2wgaGFzX2V2ZW50X2R1cmF0aW9uX25zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIHVpbnQzMl90IGV2ZW50X2R1cmF0aW9uX25zKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19jb3VudGVyX3ZhbHVlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgY291bnRlcl92YWx1ZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190aHJlYWRfaWQo
KSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdGhyZWFkX2lk
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19oYXNf
b3ZlcnJ1bnMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBoYXNf
b3ZlcnJ1bnMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhh
c19hcmdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGFyZ3MoKSBj
b25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNyk7IH0K
K307CisKK2NsYXNzIFBlcmZldHRvTWV0YXRyYWNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNz
YWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQZXJmZXR0b01ldGF0cmFjZV9EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0V2ZW50SWRGaWVsZE51bWJlciA9IDEsCisg
ICAga0NvdW50ZXJJZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrRXZlbnROYW1lRmllbGROdW1iZXIg
PSA4LAorICAgIGtDb3VudGVyTmFtZUZpZWxkTnVtYmVyID0gOSwKKyAgICBrRXZlbnREdXJhdGlv
bk5zRmllbGROdW1iZXIgPSAzLAorICAgIGtDb3VudGVyVmFsdWVGaWVsZE51bWJlciA9IDQsCisg
ICAga1RocmVhZElkRmllbGROdW1iZXIgPSA1LAorICAgIGtIYXNPdmVycnVuc0ZpZWxkTnVtYmVy
ID0gNiwKKyAgICBrQXJnc0ZpZWxkTnVtYmVyID0gNywKKyAgfTsKKyAgdXNpbmcgQXJnID0gOjpw
ZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlBlcmZldHRvTWV0YXRyYWNlX0FyZzsKKyAgdm9pZCBz
ZXRfZXZlbnRfaWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X2NvdW50ZXJfaWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2V2ZW50X25hbWUoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoOCwgdmFsdWUuZGF0YSgpLCB2YWx1
ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2V2ZW50X25hbWUoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg4LCBkYXRhLCBzaXplKTsKKyAgfQorICB2
b2lkIHNldF9jb3VudGVyX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoOSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X2NvdW50ZXJfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDksIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2V2ZW50X2R1cmF0aW9uX25z
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9jb3VudGVyX3ZhbHVlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RocmVhZF9pZCh1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaGFzX292ZXJydW5z
KGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFBlcmZldHRvTWV0YXRyYWNlX0FyZz4gVCogYWRkX2FyZ3Mo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig3KTsKKyAgfQorCit9OworCitj
bGFzcyBQZXJmZXR0b01ldGF0cmFjZV9BcmdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFBlcmZldHRvTWV0YXRyYWNlX0Fy
Z19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBQZXJmZXR0b01ldGF0cmFjZV9BcmdfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBQZXJmZXR0b01ldGF0cmFjZV9BcmdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkg
e30KKyAgYm9vbCBoYXNfa2V5KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGtleSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
c3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgdmFsdWUoKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBQZXJmZXR0b01ldGF0cmFjZV9B
cmcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IFBlcmZldHRvTWV0YXRyYWNlX0FyZ19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0tleUZpZWxkTnVtYmVyID0gMSwKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDIsCisg
IH07CisgIHZvaWQgc2V0X2tleShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBl
bmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRf
a2V5KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwg
ZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X3ZhbHVlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBn
dWFyZC4KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2Ug
UHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lv
biAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcv
bGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJs
ZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1
bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICog
V0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHBy
ZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5n
dWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUg
TGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJz
cmMvdHJhY2luZy9jb3JlL21ldGF0cmFjZV93cml0ZXIuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3Rhc2tfcnVubmVyLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJh
Y2luZy9jb3JlL3RyYWNlX3dyaXRlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2RhdGFfc291cmNlX2Rlc2NyaXB0b3IuaCIK
KworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRv
L3RyYWNlL3BlcmZldHRvL3BlcmZldHRvX21ldGF0cmFjZS5wYnplcm8uaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFjZV9w
YWNrZXQucGJ6ZXJvLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIHN0YXRpYworY29u
c3RleHByIGNoYXIgTWV0YXRyYWNlV3JpdGVyOjprRGF0YVNvdXJjZU5hbWVbXTsKKworTWV0YXRy
YWNlV3JpdGVyOjpNZXRhdHJhY2VXcml0ZXIoKSA6IHdlYWtfcHRyX2ZhY3RvcnlfKHRoaXMpIHt9
CisKK01ldGF0cmFjZVdyaXRlcjo6fk1ldGF0cmFjZVdyaXRlcigpIHsKKyAgRGlzYWJsZSgpOwor
fQorCit2b2lkIE1ldGF0cmFjZVdyaXRlcjo6RW5hYmxlKGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tf
cnVubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJh
Y2VXcml0ZXI+IHRyYWNlX3dyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlu
dDMyX3QgdGFncykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7
CisgIGlmIChzdGFydGVkXykgeworICAgIFBFUkZFVFRPX0RGQVRBTF9PUl9FTE9HKCJNZXRhdHJh
Y2UgYWxyZWFkeSBzdGFydGVkIGZyb20gdGhpcyBpbnN0YW5jZSIpOworICAgIHJldHVybjsKKyAg
fQorICB0YXNrX3J1bm5lcl8gPSB0YXNrX3J1bm5lcjsKKyAgdHJhY2Vfd3JpdGVyXyA9IHN0ZDo6
bW92ZSh0cmFjZV93cml0ZXIpOworICBhdXRvIHdlYWtfcHRyID0gd2Vha19wdHJfZmFjdG9yeV8u
R2V0V2Vha1B0cigpOworICBib29sIGVuYWJsZWQgPSBtZXRhdHJhY2U6OkVuYWJsZSgKKyAgICAg
IFt3ZWFrX3B0cl0geworICAgICAgICBpZiAod2Vha19wdHIpCisgICAgICAgICAgd2Vha19wdHIt
PldyaXRlQWxsQXZhaWxhYmxlRXZlbnRzKCk7CisgICAgICB9LAorICAgICAgdGFza19ydW5uZXIs
IHRhZ3MpOworICBpZiAoIWVuYWJsZWQpCisgICAgcmV0dXJuOworICBzdGFydGVkXyA9IHRydWU7
Cit9CisKK3ZvaWQgTWV0YXRyYWNlV3JpdGVyOjpEaXNhYmxlKCkgeworICBQRVJGRVRUT19EQ0hF
Q0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGlmICghc3RhcnRlZF8pCisgICAgcmV0dXJu
OworICBtZXRhdHJhY2U6OkRpc2FibGUoKTsKKyAgc3RhcnRlZF8gPSBmYWxzZTsKKyAgdHJhY2Vf
d3JpdGVyXy5yZXNldCgpOworfQorCit2b2lkIE1ldGF0cmFjZVdyaXRlcjo6V3JpdGVBbGxBdmFp
bGFibGVFdmVudHMoKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJf
KTsKKyAgaWYgKCFzdGFydGVkXykKKyAgICByZXR1cm47CisgIGZvciAoYXV0byBpdCA9IG1ldGF0
cmFjZTo6UmluZ0J1ZmZlcjo6R2V0UmVhZEl0ZXJhdG9yKCk7IGl0OyArK2l0KSB7CisgICAgYXV0
byB0eXBlX2FuZF9pZCA9IGl0LT50eXBlX2FuZF9pZC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2Fj
cXVpcmUpOworICAgIGlmICh0eXBlX2FuZF9pZCA9PSAwKQorICAgICAgYnJlYWs7ICAvLyBTdG9w
IGF0IHRoZSBmaXJzdCBpbmNvbXBsZXRlIGV2ZW50LgorCisgICAgYXV0byBwYWNrZXQgPSB0cmFj
ZV93cml0ZXJfLT5OZXdUcmFjZVBhY2tldCgpOworICAgIHBhY2tldC0+c2V0X3RpbWVzdGFtcChp
dC0+dGltZXN0YW1wX25zKCkpOworICAgIGF1dG8qIGV2dCA9IHBhY2tldC0+c2V0X3BlcmZldHRv
X21ldGF0cmFjZSgpOworICAgIHVpbnQxNl90IHR5cGUgPSB0eXBlX2FuZF9pZCAmIG1ldGF0cmFj
ZTo6UmVjb3JkOjprVHlwZU1hc2s7CisgICAgdWludDE2X3QgaWQgPSB0eXBlX2FuZF9pZCAmIH5t
ZXRhdHJhY2U6OlJlY29yZDo6a1R5cGVNYXNrOworICAgIGlmICh0eXBlID09IG1ldGF0cmFjZTo6
UmVjb3JkOjprVHlwZUNvdW50ZXIpIHsKKyAgICAgIGV2dC0+c2V0X2NvdW50ZXJfaWQoaWQpOwor
ICAgICAgZXZ0LT5zZXRfY291bnRlcl92YWx1ZShpdC0+Y291bnRlcl92YWx1ZSk7CisgICAgfSBl
bHNlIHsKKyAgICAgIGV2dC0+c2V0X2V2ZW50X2lkKGlkKTsKKyAgICAgIGV2dC0+c2V0X2V2ZW50
X2R1cmF0aW9uX25zKGl0LT5kdXJhdGlvbl9ucyk7CisgICAgfQorCisgICAgZXZ0LT5zZXRfdGhy
ZWFkX2lkKHN0YXRpY19jYXN0PHVpbnQzMl90PihpdC0+dGhyZWFkX2lkKSk7CisKKyAgICBpZiAo
bWV0YXRyYWNlOjpSaW5nQnVmZmVyOjpoYXNfb3ZlcnJ1bnMoKSkKKyAgICAgIGV2dC0+c2V0X2hh
c19vdmVycnVucyh0cnVlKTsKKyAgfQorICAvLyBUaGUgfGl0fCBkZXN0cnVjdG9yIHdpbGwgYXV0
b21hdGljYWxseSB1cGRhdGUgdGhlIHJlYWQgaW5kZXggcG9zaXRpb24gaW4KKyAgLy8gdGhlIG1l
dGEtdHJhY2UgcmluZyBidWZmZXIuCit9CisKK3ZvaWQgTWV0YXRyYWNlV3JpdGVyOjpXcml0ZUFs
bEFuZEZsdXNoVHJhY2VXcml0ZXIoCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNhbGxiYWNr
KSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgaWYgKCFz
dGFydGVkXykKKyAgICByZXR1cm47CisgIFdyaXRlQWxsQXZhaWxhYmxlRXZlbnRzKCk7CisgIHRy
YWNlX3dyaXRlcl8tPkZsdXNoKHN0ZDo6bW92ZShjYWxsYmFjaykpOworfQorCit9ICAvLyBuYW1l
c3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFj
aW5nL2NvcmUvcGFja2V0X3N0cmVhbV92YWxpZGF0b3IuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBoZWFkZXI6IHNyYy90cmFjaW5nL2NvcmUvcGFja2V0X3N0cmVhbV92YWxpZGF0b3IuaAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKyNpZm5kZWYgU1JDX1RSQUNJTkdfQ09SRV9QQUNLRVRfU1RSRUFNX1ZBTElEQVRP
Ul9IXworI2RlZmluZSBTUkNfVFJBQ0lOR19DT1JFX1BBQ0tFVF9TVFJFQU1fVkFMSURBVE9SX0hf
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90
cmFjaW5nL2NvcmUvc2xpY2UuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworLy8gQ2hlY2tz
IHRoYXQgdGhlIHN0cmVhbSBvZiB0cmFjZSBwYWNrZXRzIHNlbnQgYnkgdGhlIHByb2R1Y2VyIGlz
IHdlbGwgZm9ybWVkLgorLy8gVGhpcyBpbmNsdWRlczoKKy8vCisvLyAtIENoZWNraW5nIHRoYXQg
dGhlIHBhY2tldHMgYXJlIG5vdCB0cnVuY2F0ZWQuCisvLyAtIFRoZXJlIGFyZSBubyBkYW5nbGlu
ZyBieXRlcyBsZWZ0IG92ZXIgaW4gdGhlIHBhY2tldHMuCisvLyAtIEFueSB0cnVzdGVkIGZpZWxk
cyAoZS5nLiwgdWlkKSBhcmUgbm90IHNldC4KKy8vCisvLyBOb3RlIHRoYXQgd2Ugb25seSB2YWxp
ZGF0ZSB0b3AtbGV2ZWwgZmllbGRzIGluIHRoZSB0cmFjZSBwcm90bzsgc3ViLW1lc3NhZ2VzCisv
LyBhcmUgc2ltcGx5IHNraXBwZWQuCitjbGFzcyBQYWNrZXRTdHJlYW1WYWxpZGF0b3IgeworIHB1
YmxpYzoKKyAgUGFja2V0U3RyZWFtVmFsaWRhdG9yKCkgPSBkZWxldGU7CisKKyAgc3RhdGljIGJv
b2wgVmFsaWRhdGUoY29uc3QgU2xpY2VzJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0
dG8KKworI2VuZGlmICAvLyBTUkNfVFJBQ0lOR19DT1JFX1BBQ0tFVF9TVFJFQU1fVkFMSURBVE9S
X0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFBy
b2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24g
Mi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0
IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29w
eSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xp
Y2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUg
bGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5k
ZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJ
VEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVz
cyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3Vh
Z2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExp
Y2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAic3Jj
L3RyYWNpbmcvY29yZS9wYWNrZXRfc3RyZWFtX3ZhbGlkYXRvci5oIgorCisjaW5jbHVkZSA8aW50
dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS91dGlscy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3Rv
X3V0aWxzLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rv
cy9wZXJmZXR0by90cmFjZS90cmFjZV9wYWNrZXQucGJ6ZXJvLmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIHByb3RvemVybzo6cHJvdG9fdXRpbHM6OlBy
b3RvV2lyZVR5cGU7CisKK2NvbnN0IHVpbnQzMl90IGtSZXNlcnZlZEZpZWxkSWRzW10gPSB7Cisg
ICAgcHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0OjprVHJ1c3RlZFVpZEZpZWxkTnVtYmVyLAor
ICAgIHByb3Rvczo6cGJ6ZXJvOjpUcmFjZVBhY2tldDo6a1RydXN0ZWRQYWNrZXRTZXF1ZW5jZUlk
RmllbGROdW1iZXIsCisgICAgcHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0OjprVHJhY2VDb25m
aWdGaWVsZE51bWJlciwKKyAgICBwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXQ6OmtUcmFjZVN0
YXRzRmllbGROdW1iZXIsCisgICAgcHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0OjprQ29tcHJl
c3NlZFBhY2tldHNGaWVsZE51bWJlciwKKyAgICBwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXQ6
OmtTeW5jaHJvbml6YXRpb25NYXJrZXJGaWVsZE51bWJlciwKK307CisKKy8vIFRoaXMgdHJhbnNs
YXRpb24gdW5pdCBpcyBxdWl0ZSBzdWJ0bGUgYW5kIHBlcmYtc2Vuc2l0aXZlLiBSZW1lbWJlciB0
byBjaGVjaworLy8gQk1fUGFja2V0U3RyZWFtVmFsaWRhdG9yIGluIHBlcmZldHRvX2JlbmNobWFy
a3Mgd2hlbiBtYWtpbmcgY2hhbmdlcy4KKworLy8gQ2hlY2tzIHRoYXQgYSBwYWNrZXQsIHNwcmVh
ZCBvdmVyIHNldmVyYWwgc2xpY2VzLCBpcyB3ZWxsLWZvcm1lZCBhbmQgZG9lc24ndAorLy8gY29u
dGFpbiByZXNlcnZlZCB0b3AtbGV2ZWwgZmllbGRzLgorLy8gVGhlIGNoZWNraW5nIGxvZ2ljIGlz
IGJhc2VkIG9uIGEgc3RhdGUtbWFjaGluZSB0aGF0IHNraXBzIHRoZSBmaWVsZHMnIHBheWxvYWQK
Ky8vIGFuZCBvcGVyYXRlcyBhcyBmb2xsb3dzOgorLy8gICAgICAgICAgICAgICstLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vICst
LS0tLS0tLS0tPiB8IFJlYWQgZmllbGQgcHJlYW1ibGUgKHZhcmludCkgIHwgPC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0rICB8CisvLyB8ICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgfCAgfAorLy8gfCAgICAgICAgICAgICAg
fCAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHwg
IHwKKy8vIHwgICAgICAgPFZhcmludD4gICAgICAgIDxGaXhlZCAzMi82ND4gICAgIDxMZW5ndGgt
ZGVsaW1pdGVkIGZpZWxkPiAgICB8ICB8CisvLyB8ICAgICAgICAgIFYgICAgICAgICAgICAgICAg
ICB8ICAgICAgICAgICAgICAgICAgICAgIFYgICAgICAgICAgICAgICAgfCAgfAorLy8gfCAgKy0t
LS0tLS0tLS0tLS0tLS0tLSsgICAgICAgfCAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLSsg
ICAgICAgIHwgIHwKKy8vIHwgIHwgUmVhZCBmaWVsZCB2YWx1ZSB8ICAgICAgIHwgICAgICAgICAg
ICAgICB8IFJlYWQgbGVuZ3RoICB8ICAgICAgICB8ICB8CisvLyB8ICB8IChhbm90aGVyIHZhcmlu
dCkgfCAgICAgICB8ICAgICAgICAgICAgICAgfCAgICh2YXJpbnQpICAgfCAgICAgICAgfCAgfAor
Ly8gfCAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgfCAgICAgICAgICAgICAgICstLS0tLS0t
LS0tLS0tLSsgICAgICAgIHwgIHwKKy8vIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIFYg
ICAgICAgICAgICAgICAgICAgICAgViAgICAgICAgICAgICAgICB8ICB8CisvLyArLS0tLS0tLS0t
LS0rICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICstLS0tLS0tLS0tLS0tLS0tLSsgICAg
ICAgfCAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgfCBTa2lwIDQvOCBCeXRlcyB8ICAgICB8
IFNraXAgJGxlbiBCeXRlcyB8LS0tLS0tLSsgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgICst
LS0tLS0tLS0tLS0tLS0tKyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICB8CisvLyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK2NsYXNzIFByb3RvRmllbGRQ
YXJzZXJGU00geworIHB1YmxpYzoKKyAgLy8gVGhpcyBtZXRob2QgZWZmZWN0aXZlbHkgY29udGlu
dW91c2x5IHBhcnNlcyB2YXJpbnRzIChlaXRoZXIgZm9yIHRoZSBmaWVsZAorICAvLyBwcmVhbWJs
ZSBvciB0aGUgcGF5bG9hZCBvciB0aGUgc3VibWVzc2FnZSBsZW5ndGgpIGFuZCB0ZWxscyB0aGUg
Y2FsbGVyCisgIC8vICh0aGUgVmFsaWRhdGUoKSBtZXRob2QpIGhvdyBtYW55IGJ5dGVzIHRvIHNr
aXAgdW50aWwgdGhlIG5leHQgZmllbGQuCisgIHNpemVfdCBQdXNoKHVpbnQ4X3Qgb2N0ZXQpIHsK
KyAgICB2YXJpbnRfIHw9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihvY3RldCAmIDB4N0YpIDw8IHZh
cmludF9zaGlmdF87CisgICAgaWYgKG9jdGV0ICYgMHg4MCkgeworICAgICAgdmFyaW50X3NoaWZ0
XyArPSA3OworICAgICAgaWYgKHZhcmludF9zaGlmdF8gPj0gNjQpCisgICAgICAgIHN0YXRlXyA9
IGtJbnZhbGlkVmFySW50OworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHVpbnQ2NF90IHZh
cmludCA9IHZhcmludF87CisgICAgdmFyaW50XyA9IDA7CisgICAgdmFyaW50X3NoaWZ0XyA9IDA7
CisKKyAgICBzd2l0Y2ggKHN0YXRlXykgeworICAgICAgY2FzZSBrRmllbGRQcmVhbWJsZTogewor
ICAgICAgICB1aW50NjRfdCBmaWVsZF90eXBlID0gdmFyaW50ICYgNzsgIC8vIDcgPSAwLi4wMTEx
CisgICAgICAgIGF1dG8gZmllbGRfaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFyaW50ID4+
IDMpOworICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmllbGQgaWQgaXMgcmVzZXJ2ZWQsIGdvIGlu
dG8gYW4gZXJyb3Igc3RhdGUgaWYgaXQgaXMuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgYmFzZTo6QXJyYXlTaXplKGtSZXNlcnZlZEZpZWxkSWRzKTsgKytpKSB7CisgICAgICAgICAg
aWYgKGZpZWxkX2lkID09IGtSZXNlcnZlZEZpZWxkSWRzW2ldKSB7CisgICAgICAgICAgICBzdGF0
ZV8gPSBrV3JvdGVSZXNlcnZlZEZpZWxkOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoZSBmaWVsZCB0eXBlIGlzIGxlZ2l0LCBub3cg
Y2hlY2sgaXQncyB3ZWxsIGZvcm1lZCBhbmQgd2l0aGluCisgICAgICAgIC8vIGJvdW5kYXJpZXMu
CisgICAgICAgIGlmIChmaWVsZF90eXBlID09IHN0YXRpY19jYXN0PHVpbnQ2NF90PihQcm90b1dp
cmVUeXBlOjprVmFySW50KSkgeworICAgICAgICAgIHN0YXRlXyA9IGtWYXJJbnRWYWx1ZTsKKyAg
ICAgICAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09CisgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8dWludDY0X3Q+KFByb3RvV2lyZVR5cGU6OmtGaXhlZDMyKSkgeworICAgICAgICAgIHJl
dHVybiA0OworICAgICAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUgPT0KKyAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oUHJvdG9XaXJlVHlwZTo6a0ZpeGVkNjQpKSB7Cisg
ICAgICAgICAgcmV0dXJuIDg7CisgICAgICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZSA9PQorICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihQcm90b1dpcmVUeXBlOjprTGVu
Z3RoRGVsaW1pdGVkKSkgeworICAgICAgICAgIHN0YXRlXyA9IGtMZW5EZWxpbWl0ZWRMZW47Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGVfID0ga1Vua25vd25GaWVsZFR5cGU7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1Zhcklu
dFZhbHVlOiB7CisgICAgICAgIC8vIENvbnN1bWUgdGhlIGludCBmaWVsZCBwYXlsb2FkIGFuZCBn
byBiYWNrIHRvIHRoZSBuZXh0IGZpZWxkLgorICAgICAgICBzdGF0ZV8gPSBrRmllbGRQcmVhbWJs
ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGNhc2Uga0xlbkRlbGltaXRl
ZExlbjogeworICAgICAgICBpZiAodmFyaW50ID4gcHJvdG96ZXJvOjpwcm90b191dGlsczo6a01h
eE1lc3NhZ2VMZW5ndGgpIHsKKyAgICAgICAgICBzdGF0ZV8gPSBrTWVzc2FnZVRvb0JpZzsKKyAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZV8gPSBrRmllbGRQcmVh
bWJsZTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4odmFyaW50KTsKKyAgICAg
IH0KKworICAgICAgY2FzZSBrV3JvdGVSZXNlcnZlZEZpZWxkOgorICAgICAgY2FzZSBrVW5rbm93
bkZpZWxkVHlwZToKKyAgICAgIGNhc2Uga01lc3NhZ2VUb29CaWc6CisgICAgICBjYXNlIGtJbnZh
bGlkVmFySW50OgorICAgICAgICAvLyBQZXJzaXN0ZW50IGVycm9yIHN0YXRlcy4KKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICB9ICAgICAgICAgIC8vIHN3aXRjaChzdGF0ZV8pCisgICAgcmV0dXJu
IDA7ICAvLyBUbyBrZWVwIEdDQyBoYXBweS4KKyAgfQorCisgIC8vIFF1ZXJpZWQgYXQgdGhlIGVu
ZCBvZiB0aGUgYWxsIHBheWxvYWQuIEEgbWVzc2FnZSBpcyB3ZWxsLWZvcm1lZCBvbmx5CisgIC8v
IGlmIHRoZSBGU00gaXMgYmFjayB0byB0aGUgc3RhdGUgd2hlcmUgaXQgc2hvdWxkIHBhcnNlIHRo
ZSBuZXh0IGZpZWxkIGFuZAorICAvLyBoYXNuJ3Qgc3RhcnRlZCBwYXJzaW5nIGFueSBwcmVhbWJs
ZS4KKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXyA9PSBrRmllbGRQcmVhbWJs
ZSAmJiB2YXJpbnRfc2hpZnRfID09IDA7IH0KKyAgaW50IHN0YXRlKCkgY29uc3QgeyByZXR1cm4g
c3RhdGljX2Nhc3Q8aW50PihzdGF0ZV8pOyB9CisKKyBwcml2YXRlOgorICBlbnVtIFN0YXRlIHsK
KyAgICBrRmllbGRQcmVhbWJsZSA9IDAsICAvLyBQYXJzaW5nIHRoZSB2YXJpbnQgZm9yIHRoZSBm
aWVsZCBwcmVhbWJsZS4KKyAgICBrVmFySW50VmFsdWUsICAgICAgICAvLyBQYXJzaW5nIHRoZSB2
YXJpbnQgdmFsdWUgZm9yIHRoZSBmaWVsZCBwYXlsb2FkLgorICAgIGtMZW5EZWxpbWl0ZWRMZW4s
ICAgIC8vIFBhcnNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgbGVuZ3RoLWRlbGltaXRlZCBmaWVsZC4K
KworICAgIC8vIEVycm9yIHN0YXRlczoKKyAgICBrV3JvdGVSZXNlcnZlZEZpZWxkLCAgLy8gVHJp
ZWQgdG8gc2V0IGEgcmVzZXJ2ZWQgZmllbGQgaWQuCisgICAga1Vua25vd25GaWVsZFR5cGUsICAg
IC8vIEVuY291bnRlcmVkIGFuIGludmFsaWQgZmllbGQgdHlwZS4KKyAgICBrTWVzc2FnZVRvb0Jp
ZywgICAgICAgLy8gU2l6ZSBvZiB0aGUgbGVuZ3RoIGRlbGltaXRlZCBtZXNzYWdlIHdhcyB0b28g
YmlnLgorICAgIGtJbnZhbGlkVmFySW50LCAgICAgICAvLyBWYXJJbnQgbGFyZ2VyIHRoYW4gNjQg
Yml0cy4KKyAgfTsKKworICBTdGF0ZSBzdGF0ZV8gPSBrRmllbGRQcmVhbWJsZTsKKyAgdWludDY0
X3QgdmFyaW50XyA9IDA7CisgIHVpbnQzMl90IHZhcmludF9zaGlmdF8gPSAwOworfTsKKworfSAg
Ly8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworYm9vbCBQYWNrZXRTdHJlYW1WYWxpZGF0b3I6OlZh
bGlkYXRlKGNvbnN0IFNsaWNlcyYgc2xpY2VzKSB7CisgIFByb3RvRmllbGRQYXJzZXJGU00gcGFy
c2VyOworICBzaXplX3Qgc2tpcF9ieXRlcyA9IDA7CisgIGZvciAoY29uc3QgU2xpY2UmIHNsaWNl
IDogc2xpY2VzKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzbGljZS5zaXplOykgewor
ICAgICAgY29uc3Qgc2l6ZV90IHNraXBfYnl0ZXNfY3VyX3NsaWNlID0gc3RkOjptaW4oc2tpcF9i
eXRlcywgc2xpY2Uuc2l6ZSAtIGkpOworICAgICAgaWYgKHNraXBfYnl0ZXNfY3VyX3NsaWNlID4g
MCkgeworICAgICAgICBpICs9IHNraXBfYnl0ZXNfY3VyX3NsaWNlOworICAgICAgICBza2lwX2J5
dGVzIC09IHNraXBfYnl0ZXNfY3VyX3NsaWNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdWlu
dDhfdCBvY3RldCA9ICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc2xpY2Uuc3Rh
cnQpICsgaSk7CisgICAgICAgIHNraXBfYnl0ZXMgPSBwYXJzZXIuUHVzaChvY3RldCk7CisgICAg
ICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHNraXBfYnl0ZXMgPT0gMCAmJiBw
YXJzZXIudmFsaWQoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBQRVJGRVRUT19ETE9HKCJQYWNr
ZXQgdmFsaWRhdGlvbiBlcnJvciAoc3RhdGUgJWQsIHNraXAgPSAlenUpIiwKKyAgICAgICAgICAg
ICAgICBwYXJzZXIuc3RhdGUoKSwgc2tpcF9ieXRlcyk7CisgIHJldHVybiBmYWxzZTsKK30KKwor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNl
OiBzcmMvdHJhY2luZy9jb3JlL3RyYWNlX2J1ZmZlci5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIGhlYWRlcjogc3JjL3RyYWNpbmcvY29yZS90cmFjZV9idWZmZXIuaAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGlj
ZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNl
Iik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdp
dGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2Ug
YXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIu
MAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8g
aW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlz
IGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMg
T1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAq
IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt
aXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNp
Zm5kZWYgU1JDX1RSQUNJTkdfQ09SRV9UUkFDRV9CVUZGRVJfSF8KKyNkZWZpbmUgU1JDX1RSQUNJ
TkdfQ09SRV9UUkFDRV9CVUZGRVJfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUg
PHN0cmluZy5oPgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1
ZGUgPG1hcD4KKyNpbmNsdWRlIDx0dXBsZT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9wYWdlZF9tZW1vcnkuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3Ro
cmVhZF9hbm5vdGF0aW9ucy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L2Jhc2UvdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvYmFzaWNfdHlwZXMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5n
L2NvcmUvc2xpY2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vfc3RhdHMuaCIKKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKKworY2xhc3MgVHJhY2VQYWNrZXQ7CisKKy8vIFRoZSBtYWluIGJ1ZmZlciwgb3duZWQg
YnkgdGhlIHRyYWNpbmcgc2VydmljZSwgd2hlcmUgYWxsIHRoZSB0cmFjZSBkYXRhIGlzCisvLyB1
bHRpbWF0ZWx5IHN0b3JlZCBpbnRvLiBUaGUgc2VydmljZSB3aWxsIG93biBzZXZlcmFsIGluc3Rh
bmNlcyBvZiB0aGlzIGNsYXNzLAorLy8gYXQgbGVhc3Qgb25lIHBlciBhY3RpdmUgY29uc3VtZXIg
KGFzIGRlZmluZWQgaW4gdGhlIHxidWZmZXJzfCBzZWN0aW9uIG9mCisvLyB0cmFjZV9jb25maWcu
cHJvdG8pIGFuZCB3aWxsIGNvcHkgY2h1bmtzIGZyb20gdGhlIHByb2R1Y2VyJ3Mgc2hhcmVkIG1l
bW9yeQorLy8gYnVmZmVycyBpbnRvIGhlcmUgd2hlbiBhIENvbW1pdERhdGEgSVBDIGlzIHJlY2Vp
dmVkLgorLy8KKy8vIFdyaXRpbmcgaW50byB0aGUgYnVmZmVyCisvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQorLy8gRGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgU01CKHMpIHVzaW5nIENvcHlDaHVu
a1VudHJ1c3RlZCgpLiBUaGUgYnVmZmVyIHdpbGwKKy8vIGhlbmNlIGNvbnRhaW4gZGF0YSBjb21p
bmcgZnJvbSBkaWZmZXJlbnQgcHJvZHVjZXJzIGFuZCBkaWZmZXJlbnQgd3JpdGVyCisvLyBzZXF1
ZW5jZXMsIG1vcmUgc3BlY2lmaWNhbGx5OgorLy8gLSBUaGUgc2VydmljZSByZWNlaXZlcyBkYXRh
IGJ5IHNldmVyYWwgcHJvZHVjZXIocyksIGlkZW50aWZpZWQgYnkgdGhlaXIgSUQuCisvLyAtIEVh
Y2ggcHJvZHVjZXIgd3JpdGVzIHNldmVyYWwgc2VxdWVuY2VzIGlkZW50aWZpZWQgYnkgdGhlIHNh
bWUgV3JpdGVySUQuCisvLyAgICh0aGV5IGNvcnJlc3BvbmQgdG8gVHJhY2VXcml0ZXIgaW5zdGFu
Y2VzIGluIHRoZSBwcm9kdWNlcikuCisvLyAtIEVhY2ggV3JpdGVyIHdyaXRlcywgaW4gb3JkZXIs
IHNldmVyYWwgY2h1bmtzLgorLy8gLSBFYWNoIGNodW5rIGNvbnRhaW5zIHplcm8sIG9uZSwgb3Ig
bW9yZSBUcmFjZVBhY2tldChzKSwgb3IgZXZlbiBqdXN0CisvLyAgIGZyYWdtZW50cyBvZiBwYWNr
ZXRzICh3aGVuIHRoZXkgc3BhbiBhY3Jvc3Mgc2V2ZXJhbCBjaHVua3MpLgorLy8KKy8vIFNvIGF0
IGFueSBwb2ludCBpbiB0aW1lLCB0aGUgYnVmZmVyIHdpbGwgY29udGFpbiBhIHZhcmlhYmxlIG51
bWJlciBvZiBsb2dpY2FsCisvLyBzZXF1ZW5jZXMgaWRlbnRpZmllZCBieSB0aGUge1Byb2R1Y2Vy
SUQsIFdyaXRlcklEfSB0dXBsZS4gQW55IGdpdmVuIGNodW5rCisvLyB3aWxsIG9ubHkgY29udGFp
biBwYWNrZXRzIChvciBmcmFnbWVudHMpIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBzZXF1ZW5jZS4K
Ky8vCisvLyBUaGUgYnVmZmVyIG9wZXJhdGVzIGJ5IGRlZmF1bHQgYXMgYSByaW5nIGJ1ZmZlci4K
Ky8vIEl0IGhhcyB0d28gb3ZlcndyaXRlIHBvbGljaWVzOgorLy8gIDEuIGtPdmVyd3JpdGUgKGRl
ZmF1bHQpOiBpZiB0aGUgd3JpdGUgcG9pbnRlciByZWFjaGVzIHRoZSByZWFkIHBvaW50ZXIsIG9s
ZAorLy8gICAgIHVucmVhZCBjaHVua3Mgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBuZXcgY2h1bmtz
LgorLy8gIDIuIGtEaXNjYXJkOiBpZiB0aGUgd3JpdGUgcG9pbnRlciByZWFjaGVzIHRoZSByZWFk
IHBvaW50ZXIsIHVucmVhZCBjaHVua3MKKy8vICAgICBhcmUgcHJlc2VydmVkIGFuZCB0aGUgbmV3
IGNodW5rcyBhcmUgZGlzY2FyZGVkLiBBbnkgZnV0dXJlIHdyaXRlIGJlY29tZXMKKy8vICAgICBh
IG5vLW9wLCBldmVuIGlmIHRoZSByZWFkZXIgbWFuYWdlcyB0byBmdWxseSBjYXRjaCB1cC4gVGhp
cyBpcyBiZWNhdXNlCisvLyAgICAgb25jZSBhIGNodW5rIGlzIGRpc2NhcmRlZCwgdGhlIHNlcXVl
bmNlIG9mIHBhY2tldHMgaXMgYnJva2VuIGFuZCB0cnlpbmcKKy8vICAgICB0byByZWNvdmVyIHdv
dWxkIGJlIHRvbyBoYXJkIChhbHNvIGR1ZSB0byB0aGUgZmFjdCB0aGF0LCBhdCB0aGUgc2FtZQor
Ly8gICAgIHRpbWUsIHdlIGFsbG93IG91dC1vZi1vcmRlciBjb21taXRzIGFuZCBjaHVuayByZS13
cml0ZXMpLgorLy8KKy8vIENodW5rcyBhcmUgKG92ZXIpd3JpdHRlbiBpbiB0aGUgc2FtZSBvcmRl
ciBvZiB0aGUgQ29weUNodW5rVW50cnVzdGVkKCkgY2FsbHMuCisvLyBXaGVuIG92ZXJ3cml0aW5n
IG9sZCBjb250ZW50LCBlbnRpcmUgY2h1bmtzIGFyZSBvdmVyd3JpdHRlbiBvciBjbG9iYmVyZWQu
CisvLyBUaGUgYnVmZmVyIG5ldmVyIGxlYXZlcyBhIHBhcnRpYWwgY2h1bmsgYXJvdW5kLiBDaHVu
a3MnIHBheWxvYWQgaXMgY29waWVkCisvLyBhcy1pcywgYnV0IHRoZWlyIGhlYWRlciBpcyBub3Qg
YW5kIGlzIHJlcGFja2VkIGluIG9yZGVyIHRvIGtlZXAgdGhlCisvLyBQcm9kdWNlcklEIGFyb3Vu
ZC4KKy8vCisvLyBDaHVua3MgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyIG5leHQgdG8gZWFjaCBv
dGhlci4gRWFjaCBjaHVuayBpcyBwcmVmaXhlZCBieQorLy8gYW4gaW5saW5lIGhlYWRlciAoQ2h1
bmtSZWNvcmQpLCB3aGljaCBjb250YWlucyBtb3N0IG9mIHRoZSBmaWVsZHMgb2YgdGhlCisvLyBT
aGFyZWRNZW1vcnlBQkkgQ2h1bmtIZWFkZXIgKyB0aGUgUHJvZHVjZXJJRCArIHRoZSBzaXplIG9m
IHRoZSBwYXlsb2FkLgorLy8gSXQncyBhIGNvbnZlbnRpb25hbCBiaW5hcnkgb2JqZWN0IHN0cmVh
bSBlc3NlbnRpYWxseSwgd2hlcmUgZWFjaCBDaHVua1JlY29yZAorLy8gdGVsbHMgd2hlcmUgaXQg
ZW5kcyBhbmQgaGVuY2Ugd2hlcmUgdG8gZmluZCB0aGUgbmV4dCBvbmUsIGxpa2UgdGhpczoKKy8v
CisvLyAgICAgICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4gMTYgYnl0ZSBib3VuZGFy
eQorLy8gICAgICAgICAgfCBDaHVua1JlY29yZDogICAxNiBieXRlcyB8CisvLyAgICAgICAgICB8
IC0gY2h1bmsgaWQ6ICAgICA0IGJ5dGVzIHwKKy8vICAgICAgICAgIHwgLSBwcm9kdWNlciBpZDog
IDIgYnl0ZXMgfAorLy8gICAgICAgICAgfCAtIHdyaXRlciBpZDogICAgMiBieXRlcyB8CisvLyAg
ICAgICAgICB8IC0gI2ZyYWdtZW50czogICAyIGJ5dGVzIHwKKy8vICAgICstLS0tLSsgLSByZWNv
cmQgc2l6ZTogIDIgYnl0ZXMgfAorLy8gICAgfCAgICAgfCAtIGZsYWdzK3BhZDogICAgNCBieXRl
cyB8CisvLyAgICB8ICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vICAgIHwgICAg
IHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gICAgfCAgICAgOiAgICAgQ2h1bmsgcGF5
bG9hZCAgICAgICA6CisvLyAgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8v
ICAgIHwgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgfCAgICAgfCAgICBP
cHRpb25hbCBwYWRkaW5nICAgICB8CisvLyAgICArLS0tPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSsgMTYgYnl0ZSBib3VuZGFyeQorLy8gICAgICAgICAgfCAgICAgIENodW5rUmVjb3JkICAg
ICAgICB8CisvLyAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgIDoKKy8vIENodW5r
cyBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBhcmUgYWx3YXlzIHJvdW5kZWQgdXAgdG8gMTYgYnl0ZXMg
KHRoYXQgaXMKKy8vIHNpemVvZihDaHVua1JlY29yZCkpLCBpbiBvcmRlciB0byBhdm9pZCBmdXJ0
aGVyIGlubmVyIGZyYWdtZW50YXRpb24uCisvLyBTcGVjaWFsICJwYWRkaW5nIiBjaHVua3MgY2Fu
IGJlIHB1dCBpbiB0aGUgYnVmZmVyLCBlLmcuIGluIHRoZSBjYXNlIHdoZW4gd2UKKy8vIHRyeSB0
byB3cml0ZSBhIGNodW5rIG9mIHNpemUgTiB3aGlsZSB0aGUgd3JpdGUgcG9pbnRlciBpcyBhdCB0
aGUgZW5kIG9mIHRoZQorLy8gYnVmZmVyLCBidXQgdGhlIHdyaXRlIHBvaW50ZXIgaXMgPCBOIGJ5
dGVzIGZyb20gdGhlIGVuZCAoYW5kIGhlbmNlIG5lZWRzIHRvCisvLyB3cmFwIG92ZXIpLgorLy8g
QmVjYXVzZSBvZiB0aGlzLCB0aGUgYnVmZmVyIGlzIHNlbGYtZGVzY3JpYmluZzogdGhlIGNvbnRl
bnRzIG9mIHRoZSBidWZmZXIKKy8vIGNhbiBiZSByZWNvbnN0cnVjdGVkIGJ5IGp1c3QgbG9va2lu
ZyBhdCB0aGUgYnVmZmVyIGNvbnRlbnQgKHRoaXMgd2lsbCBiZQorLy8gcXVpdGUgdXNlZnVsIGlu
IGZ1dHVyZSB0byByZWNvdmVyIHRoZSBidWZmZXIgZnJvbSBjcmFzaCByZXBvcnRzKS4KKy8vCisv
LyBIb3dldmVyLCBpbiBvcmRlciB0byBrZWVwIHNvbWUgb3BlcmF0aW9ucyAocGF0Y2hpbmcgYW5k
IHJlYWRpbmcpIGZhc3QsIGEKKy8vIGxvb2thc2lkZSBpbmRleCBpcyBtYWludGFpbmVkIChpbiB8
aW5kZXhffCksIGtlZXBpbmcgZWFjaCBjaHVuayBpbiB0aGUgYnVmZmVyCisvLyBpbmRleGVkIGJ5
IHRoZWlyIHtQcm9kdWNlcklELCBXcml0ZXJJRCwgQ2h1bmtJRH0gdHVwbGUuCisvLworLy8gUGF0
Y2hpbmcgZGF0YSBvdXQtb2YtYmFuZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8g
VGhpcyBidWZmZXIgYWxzbyBzdXBwb3J0cyBwYXRjaGluZyBjaHVua3MnIHBheWxvYWQgb3V0LW9m
LWJhbmQsIGFmdGVyIHRoZXkKKy8vIGhhdmUgYmVlbiBzdG9yZWQuIFRoaXMgaXMgdG8gYWxsb3cg
cHJvZHVjZXJzIHRvIGJhY2tmaWxsIHRoZSAic2l6ZSIgZmllbGRzCisvLyBvZiB0aGUgcHJvdG9z
IHRoYXQgc3Bhd24gYWNyb3NzIHNldmVyYWwgY2h1bmtzLCB3aGVuIHRoZSBwcmV2aW91cyBjaHVu
a3MgYXJlCisvLyByZXR1cm5lZCB0byB0aGUgc2VydmljZS4gVGhlIE1heWJlUGF0Y2hDaHVua0Nv
bnRlbnRzKCkgZGVhbHMgd2l0aCB0aGUgZmFjdAorLy8gdGhhdCBhIGNodW5rIG1pZ2h0IGhhdmUg
YmVlbiBsb3N0IChiZWNhdXNlIG9mIHdyYXBwaW5nKSBieSB0aGUgdGltZSB0aGUgT09CCisvLyBJ
UEMgY29tZXMuCisvLworLy8gUmVhZGluZyBmcm9tIHRoZSBidWZmZXIKKy8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCisvLyBUaGlzIGNsYXNzIHN1cHBvcnRzIG9uZSByZWFkZXIgb25seSAodGhl
IGNvbnN1bWVyKS4gUmVhZHMgYXJlIE5PVCBpZGVtcG90ZW50CisvLyBhcyB0aGV5IG1vdmUgdGhl
IHJlYWQgY3Vyc29ycyBhcm91bmQuIFJlYWRpbmcgYmFjayB0aGUgYnVmZmVyIGlzIHRoZSBtb3N0
CisvLyBjb25jZXB0dWFsbHkgY29tcGxleCBwYXJ0LiBUaGUgUmVhZE5leHRUcmFjZVBhY2tldCgp
IG1ldGhvZCBvcGVyYXRlcyB3aXRoCisvLyB3aG9sZSBwYWNrZXQgZ3JhbnVsYXJpdHkuIFBhY2tl
dHMgYXJlIHJldHVybmVkIG9ubHkgd2hlbiBhbGwgdGhlaXIgZnJhZ21lbnRzCisvLyBhcmUgYXZh
aWxhYmxlLgorLy8gVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mOgorLy8gLSBHbHVpbmcgcGFja2V0
cyB3aXRoaW4gdGhlIHNhbWUgc2VxdWVuY2UsIGV2ZW4gaWYgdGhleSBhcmUgbm90IHN0b3JlZAor
Ly8gICBhZGphY2VudGx5IGluIHRoZSBidWZmZXIuCisvLyAtIFJlLW9yZGVyaW5nIGNodW5rcyB3
aXRoaW4gYSBzZXF1ZW5jZSAodXNpbmcgdGhlIENodW5rSUQsIHdoaWNoIHdyYXBzKS4KKy8vIC0g
RGV0ZWN0aW5nIGhvbGVzIGluIHBhY2tldCBmcmFnbWVudHMgKGJlY2F1c2Ugb2YgbG9zcyBvZiBj
aHVua3MpLgorLy8gUmVhZHMgZ3VhcmFudGVlIHRoYXQgcGFja2V0cyBmb3IgdGhlIHNhbWUgc2Vx
dWVuY2UgYXJlIHJlYWQgaW4gRklGTyBvcmRlcgorLy8gKGFjY29yZGluZyB0byB0aGVpciBDaHVu
a0lEKSwgYnV0IGRvbid0IGdpdmUgYW55IGd1YXJhbnRlZSBhYm91dCB0aGUgcmVhZAorLy8gb3Jk
ZXIgb2YgcGFja2V0cyBmcm9tIGRpZmZlcmVudCBzZXF1ZW5jZXMsIHNlZSBjb21tZW50cyBpbgor
Ly8gUmVhZE5leHRUcmFjZVBhY2tldCgpIGJlbG93LgorY2xhc3MgVHJhY2VCdWZmZXIgeworIHB1
YmxpYzoKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBJbmxpbmVDaHVua0hlYWRlclNpemU7ICAvLyBG
b3IgdGVzdC9mYWtlX3BhY2tldC57Y2MsaH0uCisKKyAgLy8gU2VlIGNvbW1lbnQgaW4gdGhlIGhl
YWRlciBhYm92ZS4KKyAgZW51bSBPdmVyd3JpdGVQb2xpY3kgeyBrT3ZlcndyaXRlLCBrRGlzY2Fy
ZCB9OworCisgIC8vIEFyZ3VtZW50IGZvciBvdXQtb2YtYmFuZCBwYXRjaGVzIGFwcGxpZWQgdGhy
b3VnaCBUcnlQYXRjaENodW5rQ29udGVudHMoKS4KKyAgc3RydWN0IFBhdGNoIHsKKyAgICAvLyBG
cm9tIFNoYXJlZE1lbW9yeUFCSTo6a1BhY2tldEhlYWRlclNpemUuCisgICAgc3RhdGljIGNvbnN0
ZXhwciBzaXplX3Qga1NpemUgPSA0OworCisgICAgc2l6ZV90IG9mZnNldF91bnRydXN0ZWQ7Cisg
ICAgc3RkOjphcnJheTx1aW50OF90LCBrU2l6ZT4gZGF0YTsKKyAgfTsKKworICAvLyBJZGVudGlm
aWVycyB0aGF0IGFyZSBjb25zdGFudCBmb3IgYSBwYWNrZXQgc2VxdWVuY2UuCisgIHN0cnVjdCBQ
YWNrZXRTZXF1ZW5jZVByb3BlcnRpZXMgeworICAgIFByb2R1Y2VySUQgcHJvZHVjZXJfaWRfdHJ1
c3RlZDsKKyAgICB1aWRfdCBwcm9kdWNlcl91aWRfdHJ1c3RlZDsKKyAgICBXcml0ZXJJRCB3cml0
ZXJfaWQ7CisgIH07CisKKyAgLy8gQ2FuIHJldHVybiBudWxscHRyIGlmIHRoZSBtZW1vcnkgYWxs
b2NhdGlvbiBmYWlscy4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxUcmFjZUJ1ZmZlcj4gQ3Jl
YXRlKHNpemVfdCBzaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgT3ZlcndyaXRlUG9saWN5ID0ga092ZXJ3cml0ZSk7CisKKyAgflRyYWNl
QnVmZmVyKCk7CisKKyAgLy8gQ29waWVzIGEgQ2h1bmsgZnJvbSBhIHByb2R1Y2VyIFNoYXJlZCBN
ZW1vcnkgQnVmZmVyIGludG8gdGhlIHRyYWNlIGJ1ZmZlci4KKyAgLy8gfHNyY3wgcG9pbnRzIHRv
IHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIFNoYXJlZE1lbW9yeUFCSSdzIGNodW5rIHNoYXJlZCB3
aXRoCisgIC8vIGFuIHVudHJ1c3RlZCBwcm9kdWNlci4gInVudHJ1c3RlZCIgaGVyZSBtZWFuczog
dGhlIHByb2R1Y2VyIG1pZ2h0IGJlCisgIC8vIG1hbGljaW91cyBhbmQgbWlnaHQgY2hhbmdlIHxz
cmN8IGNvbmN1cnJlbnRseSB3aGlsZSB3ZSByZWFkIGl0IChpbnRlcm5hbGx5CisgIC8vIHRoaXMg
bWV0aG9kIG1lbWNweSgpLXMgZmlyc3QgdGhlIGNodW5rIGJlZm9yZSBwcm9jZXNzaW5nIGl0KS4g
Tm9uZSBvZiB0aGUKKyAgLy8gYXJndW1lbnRzIHNob3VsZCBiZSB0cnVzdGVkLCB1bmxlc3Mgb3Ro
ZXJ3aXNlIHN0YXRlZC4gV2UgY2FuIHRydXN0IHRoYXQKKyAgLy8gfHNyY3wgcG9pbnRzIHRvIGEg
dmFsaWQgbWVtb3J5IGFyZWEsIGJ1dCBub3QgaXRzIGNvbnRlbnRzLgorICAvLworICAvLyBUaGlz
IG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSBjaHVuay4g
SW4gdGhpcyBjYXNlLAorICAvLyB0aGUgb3JpZ2luYWwgY2h1bmsncyBwYXlsb2FkIHdpbGwgYmUg
b3ZlcnJpZGRlbiBhbmQgaXRzIG51bWJlciBvZiBmcmFnbWVudHMKKyAgLy8gYW5kIGZsYWdzIGFk
anVzdGVkIHRvIG1hdGNoIHxudW1fZnJhZ21lbnRzfCBhbmQgfGNodW5rX2ZsYWdzfC4gVGhlIHNl
cnZpY2UKKyAgLy8gbWF5IHVzZSB0aGlzIHRvIGluc2VydCBwYXJ0aWFsIGNodW5rcyAofGNodW5r
X2NvbXBsZXRlID0gZmFsc2V8KSBiZWZvcmUgdGhlCisgIC8vIHByb2R1Y2VyIGhhcyBjb21taXR0
ZWQgdGhlbS4KKyAgLy8KKyAgLy8gSWYgfGNodW5rX2NvbXBsZXRlfCBpcyB8ZmFsc2V8LCB0aGUg
VHJhY2VCdWZmZXIgd2lsbCBvbmx5IGNvbnNpZGVyIHRoZQorICAvLyBmaXJzdCB8bnVtX2ZyYWdt
ZW50cyAtIDF8IHBhY2tldHMgdG8gYmUgY29tcGxldGUsIHNpbmNlIHRoZSBwcm9kdWNlciBtYXkK
KyAgLy8gbm90IGhhdmUgZmluaXNoZWQgd3JpdGluZyB0aGUgbGF0ZXN0IHBhY2tldC4gUmVhZGlu
ZyBmcm9tIGEgc2VxdWVuY2Ugd2lsbAorICAvLyBhbHNvIG5vdCBwcm9ncmVzcyBwYXN0IGFueSBp
bmNvbXBsZXRlIGNodW5rcyB1bnRpbCB0aGV5IHdlcmUgcmV3cml0dGVuIHdpdGgKKyAgLy8gfGNo
dW5rX2NvbXBsZXRlID0gdHJ1ZXwsIGUuZy4gYWZ0ZXIgYSBwcm9kdWNlcidzIGNvbW1pdC4KKyAg
Ly8KKyAgLy8gVE9ETyhlc2Vja2xlcik6IFBhc3MgaW4gYSBQYWNrZXRTdHJlYW1Qcm9wZXJ0aWVz
IGluc3RlYWQgb2YgaW5kaXZpZHVhbCBJRHMuCisgIHZvaWQgQ29weUNodW5rVW50cnVzdGVkKFBy
b2R1Y2VySUQgcHJvZHVjZXJfaWRfdHJ1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
dWlkX3QgcHJvZHVjZXJfdWlkX3RydXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdy
aXRlcklEIHdyaXRlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtJRCBjaHVu
a19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbnVtX2ZyYWdtZW50cywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaHVua19mbGFncywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgYm9vbCBjaHVua19jb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBz
aXplX3Qgc2l6ZSk7CisgIC8vIEFwcGxpZXMgYSBiYXRjaCBvZiB8cGF0Y2hlc3wgdG8gdGhlIGdp
dmVuIGNodW5rLCBpZiB0aGUgZ2l2ZW4gY2h1bmsgaXMKKyAgLy8gc3RpbGwgaW4gdGhlIGJ1ZmZl
ci4gRG9lcyBub3RoaW5nIGlmIHRoZSBnaXZlbiBDaHVua0lEIGlzIGdvbmUuCisgIC8vIFJldHVy
bnMgdHJ1ZSBpZiB0aGUgY2h1bmsgaGFzIGJlZW4gZm91bmQgYW5kIHBhdGNoZWQsIGZhbHNlIG90
aGVyd2lzZS4KKyAgLy8gfG90aGVyX3BhdGNoZXNfcGVuZGluZ3wgaXMgdXNlZCB0byBkZXRlcm1p
bmUgd2hldGhlciB0aGlzIGlzIHRoZSBvbmx5CisgIC8vIGJhdGNoIG9mIHBhdGNoZXMgZm9yIHRo
ZSBjaHVuayBvciB0aGVyZSBpcyBtb3JlLgorICAvLyBJZiB8b3RoZXJfcGF0Y2hlc19wZW5kaW5n
fCA9PSBmYWxzZSwgdGhlIGNodW5rIGlzIG1hcmtlZCBhcyByZWFkeSB0byBiZQorICAvLyBjb25z
dW1lZC4gSWYgdHJ1ZSwgdGhlIHN0YXRlIG9mIHRoZSBjaHVuayBpcyBub3QgYWx0ZXJlZC4KKyAg
Ym9vbCBUcnlQYXRjaENodW5rQ29udGVudHMoUHJvZHVjZXJJRCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgV3JpdGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENodW5r
SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGNoKiBwYXRjaGVzLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGF0Y2hlc19zaXplLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBib29sIG90aGVyX3BhdGNoZXNfcGVuZGluZyk7CisKKyAg
Ly8gVG8gcmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciB0aGUgY2FsbGVyIG5lZWRzIHRv
OgorICAvLyAgIEJlZ2luUmVhZCgpCisgIC8vICAgd2hpbGUgKFJlYWROZXh0VHJhY2VQYWNrZXQo
cGFja2V0X2ZyYWdtZW50cykpIHsgLi4uIH0KKyAgLy8gTm8gb3RoZXIgY2FsbHMgdG8gYW55IG90
aGVyIG1ldGhvZCBzaG91bGQgYmUgaW50ZXJsZWF2ZWQgYmV0d2VlbgorICAvLyBCZWdpblJlYWQo
KSBhbmQgUmVhZE5leHRUcmFjZVBhY2tldCgpLgorICAvLyBSZWFkcyBpbiB0aGUgVHJhY2VCdWZm
ZXIgYXJlIE5PVCBpZGVtcG90ZW50LgorICB2b2lkIEJlZ2luUmVhZCgpOworCisgIC8vIFJldHVy
bnMgdGhlIG5leHQgcGFja2V0IGluIHRoZSBidWZmZXIsIGlmIGFueSwgYW5kIHRoZSBwcm9kdWNl
cl9pZCwKKyAgLy8gcHJvZHVjZXJfdWlkLCBhbmQgd3JpdGVyX2lkIG9mIHRoZSBwcm9kdWNlci93
cml0ZXIgdGhhdCB3cm90ZSBpdCAoYXMgcGFzc2VkCisgIC8vIGluIHRoZSBDb3B5Q2h1bmtVbnRy
dXN0ZWQoKSBjYWxsKS4gUmV0dXJucyBmYWxzZSBpZiBubyBwYWNrZXRzIGNhbiBiZSByZWFkCisg
IC8vIGF0IHRoaXMgcG9pbnQuIElmIGEgcGFja2V0IHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwKKyAg
Ly8gfHByZXZpb3VzX3BhY2tldF9vbl9zZXF1ZW5jZV9kcm9wcGVkfCBpcyBzZXQgdG8gfHRydWV8
IGlmIHRoZSBwcmV2aW91cworICAvLyBwYWNrZXQgb24gdGhlIHNlcXVlbmNlIHdhcyBkcm9wcGVk
IGZyb20gdGhlIGJ1ZmZlciBiZWZvcmUgaXQgY291bGQgYmUgcmVhZAorICAvLyAoZS5nLiBiZWNh
dXNlIGl0cyBjaHVuayB3YXMgb3ZlcnJpZGRlbiBkdWUgdG8gdGhlIHJpbmcgYnVmZmVyIHdyYXBw
aW5nIG9yCisgIC8vIGR1ZSB0byBhbiBBQkkgdmlvbGF0aW9uKSwgYW5kIHRvIHxmYWxzZXwgb3Ro
ZXJ3aXNlLgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgb25seSBjb21wbGV0ZSBw
YWNrZXRzLiBTcGVjaWZpY2FsbHk6CisgIC8vIFdoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNv
bXBsZXRlIHBhY2tldCBpbiB0aGUgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uCisgIC8vIHJldHVybnMg
dHJ1ZSBhbmQgcG9wdWxhdGVzIHRoZSBUcmFjZVBhY2tldCBhcmd1bWVudCB3aXRoIHRoZSBib3Vu
ZGFyaWVzIG9mCisgIC8vIGVhY2ggZnJhZ21lbnQgZm9yIG9uZSBwYWNrZXQuCisgIC8vIFRyYWNl
UGFja2V0IHdpbGwgaGF2ZSBhdCBsZWFzdCBvbmUgc2xpY2Ugd2hlbiB0aGlzIGZ1bmN0aW9uIHJl
dHVybnMgdHJ1ZS4KKyAgLy8gV2hlbiB0aGVyZSBhcmUgbm8gd2hvbGUgcGFja2V0cyBlbGlnaWJs
ZSB0byByZWFkIChlLmcuIHdlIGFyZSBzdGlsbCBtaXNzaW5nCisgIC8vIGZyYWdtZW50cykgdGhp
cyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICAvLyBUaGlzIGZ1bmN0aW9uIGd1YXJhbnRlZXMg
YWxzbyB0aGF0IHBhY2tldHMgZm9yIGEgZ2l2ZW4KKyAgLy8ge1Byb2R1Y2VySUQsIFdyaXRlcklE
fSBhcmUgcmVhZCBpbiBGSUZPIG9yZGVyLgorICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGd1
YXJhbnRlZSBhbnkgb3JkZXJpbmcgdy5yLnQuIHBhY2tldHMgYmVsb25naW5nIHRvCisgIC8vIGRp
ZmZlcmVudCBXcml0ZXJJRChzKS4gRm9yIGluc3RhbmNlLCBnaXZlbiB0aGUgZm9sbG93aW5nIHBh
Y2tldHMgY29waWVkCisgIC8vIGludG8gdGhlIGJ1ZmZlcjoKKyAgLy8gICB7UHJvZHVjZXJJRDog
MSwgV3JpdGVySUQ6IDF9OiBQMSBQMiBQMworICAvLyAgIHtQcm9kdWNlcklEOiAxLCBXcml0ZXJJ
RDogMn06IFA0IFA1IFA2CisgIC8vICAge1Byb2R1Y2VySUQ6IDIsIFdyaXRlcklEOiAxfTogUDcg
UDggUDkKKyAgLy8gVGhlIGZvbGxvd2luZyByZWFkIHNlcXVlbmNlIGlzIHBvc3NpYmxlOgorICAv
LyAgIFAxLCBQNCwgUDcsIFAyLCBQMywgUDUsIFA4LCBQOSwgUDYKKyAgLy8gQnV0IHRoZSBmb2xs
b3dpbmcgaXMgZ3VhcmFudGVlZCB0byBOT1QgaGFwcGVuOgorICAvLyAgIFAxLCBQNSwgUDcsIFA0
IChQNCBjYW5ub3QgY29tZSBhZnRlciBQNSkKKyAgYm9vbCBSZWFkTmV4dFRyYWNlUGFja2V0KFRy
YWNlUGFja2V0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFNlcXVlbmNlUHJv
cGVydGllcyogc2VxdWVuY2VfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJvb2wqIHByZXZpb3VzX3BhY2tldF9vbl9zZXF1ZW5jZV9kcm9wcGVkKTsKKworICBjb25zdCBU
cmFjZVN0YXRzOjpCdWZmZXJTdGF0cyYgc3RhdHMoKSBjb25zdCB7IHJldHVybiBzdGF0c187IH0K
KyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorCisgcHJpdmF0ZToKKyAg
ZnJpZW5kIGNsYXNzIFRyYWNlQnVmZmVyVGVzdDsKKworICAvLyBDaHVua1JlY29yZCBpcyBhIENo
dW5rIGhlYWRlciBzdG9yZWQgaW5saW5lIGluIHRoZSB8ZGF0YV98IGJ1ZmZlciwgYmVmb3JlCisg
IC8vIHRoZSBjaHVuayBwYXlsb2FkICh0aGUgcGFja2V0cycgZGF0YSkuIFRoZSB8ZGF0YV98IGJ1
ZmZlciBsb29rcyBsaWtlIHRoaXM6CisgIC8vICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t
LS0tLS0tKystLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisgIC8vIHwgQ2h1bmtS
ZWNvcmQgMSB8IENodW5rIHBheWxvYWQgMSAgfHwgQ2h1bmtSZWNvcmQgMiB8IENodW5rIHBheWxv
YWQgMiB8IC4uLgorICAvLyArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSsrLS0t
LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKworICAvLyBNb3N0IG9mIHRoZSBDaHVua1Jl
Y29yZCBmaWVsZHMgYXJlIGNvcGllZCBmcm9tIFNoYXJlZE1lbW9yeUFCSTo6Q2h1bmtIZWFkZXIK
KyAgLy8gKHRoZSBjaHVuayBoZWFkZXIgdXNlZCBpbiB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXJz
KS4KKyAgLy8gQSBDaHVua1JlY29yZCBjYW4gYmUgYSBzcGVjaWFsICJwYWRkaW5nIiByZWNvcmQu
IEluIHRoaXMgY2FzZSBpdHMgcGF5bG9hZAorICAvLyBzaG91bGQgYmUgaWdub3JlZCBhbmQgdGhl
IHJlY29yZCBzaG91bGQgYmUganVzdCBza2lwcGVkLgorICAvLworICAvLyBGdWxsIHBhZ2UgbW92
ZSBvcHRpbWl6YXRpb246CisgIC8vIFRoaXMgc3RydWN0IGhhcyB0byBiZSBleGFjdGx5IChzaXpl
b2YoUGFnZUhlYWRlcikgKyBzaXplb2YoQ2h1bmtIZWFkZXIpKQorICAvLyAoZnJvbSBzaGFyZWRf
bWVtb3J5X2FiaS5oKSB0byBhbGxvdyBmdWxsIHBhZ2UgbW92ZSBvcHRpbWl6YXRpb25zCisgIC8v
IChUT0RPKHByaW1pYW5vKTogbm90IGltcGxlbWVudGVkIHlldCkuIEluIHRoZSBzcGVjaWFsIGNh
c2Ugb2YgbW92aW5nIGEgZnVsbAorICAvLyA0ayBwYWdlIHRoYXQgY29udGFpbnMgb25seSBvbmUg
Y2h1bmssIGluIGZhY3QsIHdlIGNhbiBqdXN0IGFzayB0aGUga2VybmVsCisgIC8vIHRvIG1vdmUg
dGhlIGZ1bGwgU0hNIHBhZ2UgKHNlZSBTUExJQ0VfRl97R0lGVCxNT1ZFfSkgYW5kIG92ZXJsYXkg
dGhlCisgIC8vIENodW5rUmVjb3JkIG9uIHRvcCBvZiB0aGUgbW92ZWQgU01CJ3MgaGVhZGVyIChw
YWdlICsgY2h1bmsgaGVhZGVyKS4KKyAgLy8gVGhpcyBzcGVjaWFsIHJlcXVpcmVtZW50IGlzIGNv
dmVyZWQgYnkgc3RhdGljX2Fzc2VydChzKSBpbiB0aGUgLmNjIGZpbGUuCisgIHN0cnVjdCBDaHVu
a1JlY29yZCB7CisgICAgZXhwbGljaXQgQ2h1bmtSZWNvcmQoc2l6ZV90IHN6KSA6IGZsYWdzezB9
LCBpc19wYWRkaW5nezB9IHsKKyAgICAgIFBFUkZFVFRPX0RDSEVDSyhzeiA+PSBzaXplb2YoQ2h1
bmtSZWNvcmQpICYmCisgICAgICAgICAgICAgICAgICAgICAgc3ogJSBzaXplb2YoQ2h1bmtSZWNv
cmQpID09IDAgJiYgc3ogPD0ga01heFNpemUpOworICAgICAgc2l6ZSA9IHN0YXRpY19jYXN0PGRl
Y2x0eXBlKHNpemUpPihzeik7CisgICAgfQorCisgICAgYm9vbCBpc192YWxpZCgpIGNvbnN0IHsg
cmV0dXJuIHNpemUgIT0gMDsgfQorCisgICAgLy8gS2VlcCB0aGlzIHN0cnVjdHVyZSBwYWNrZWQg
YW5kIGV4YWN0bHkgMTYgYnl0ZXMgKDEyOCBiaXRzKSBiaWcuCisKKyAgICAvLyBbMzIgYml0c10g
TW9ub3RvbmljIGNvdW50ZXIgd2l0aGluIHRoZSBzYW1lIHdyaXRlcl9pZC4KKyAgICBDaHVua0lE
IGNodW5rX2lkID0gMDsKKworICAgIC8vIFsxNiBiaXRzXSBJRCBvZiB0aGUgUHJvZHVjZXIgZnJv
bSB3aGljaCB0aGUgQ2h1bmsgd2FzIGNvcGllZCBmcm9tLgorICAgIFByb2R1Y2VySUQgcHJvZHVj
ZXJfaWQgPSAwOworCisgICAgLy8gWzE2IGJpdHNdIFVuaXF1ZSBwZXIgUHJvZHVjZXIgKGJ1dCBu
b3Qgd2l0aGluIHRoZSBzZXJ2aWNlKS4KKyAgICAvLyBJZiB3cml0ZXJfaWQgPT0ga1dyaXRlcklk
UGFkZGluZyB0aGUgcmVjb3JkIHNob3VsZCBqdXN0IGJlIHNraXBwZWQuCisgICAgV3JpdGVySUQg
d3JpdGVyX2lkID0gMDsKKworICAgIC8vIE51bWJlciBvZiBmcmFnbWVudHMgY29udGFpbmVkIGlu
IHRoZSBjaHVuay4KKyAgICB1aW50MTZfdCBudW1fZnJhZ21lbnRzID0gMDsKKworICAgIC8vIFNp
emUgaW4gYnl0ZXMsIGluY2x1ZGluZyBzaXplb2YoQ2h1bmtSZWNvcmQpIGl0c2VsZi4KKyAgICB1
aW50MTZfdCBzaXplOworCisgICAgdWludDhfdCBmbGFncyA6IDY7ICAvLyBTZWUgU2hhcmVkTWVt
b3J5QUJJOjpDaHVua0hlYWRlcjo6ZmxhZ3MuCisgICAgdWludDhfdCBpc19wYWRkaW5nIDogMTsK
KyAgICB1aW50OF90IHVudXNlZF9mbGFnIDogMTsKKworICAgIC8vIE5vdCBzdHJpY3RseSBuZWVk
ZWQsIGNhbiBiZSByZXVzZWQgZm9yIG1vcmUgZmllbGRzIGluIHRoZSBmdXR1cmUuIEJ1dAorICAg
IC8vIHJpZ2h0IG5vdyBoZWxwcyB0byBzcG90IGNodW5rcyBpbiBoZXggZHVtcHMuCisgICAgY2hh
ciB1bnVzZWRbM10gPSB7J0MnLCAnSCcsICdVJ307CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNp
emVfdCBrTWF4U2l6ZSA9CisgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUoc2l6
ZSk+OjptYXgoKTsKKyAgfTsKKworICAvLyBMb29rYXNpZGUgaW5kZXggZW50cnkuIFRoaXMgc2Vy
dmVzIHR3byBwdXJwb3NlczoKKyAgLy8gMSkgQWxsb3cgYSBmYXN0IGxvb2t1cCBvZiBDaHVua1Jl
Y29yZCBieSB0aGVpciBJRCAodGhlIHR1cGxlCisgIC8vICAge1Byb2R1Y2VySUQsIFdyaXRlcklE
LCBDaHVua0lEfSkuIFRoaXMgaXMgdXNlZCB3aGVuIGFwcGx5aW5nIG91dC1vZi1iYW5kCisgIC8v
ICAgcGF0Y2hlcyB0byB0aGUgY29udGVudHMgb2YgdGhlIGNodW5rcyBhZnRlciB0aGV5IGhhdmUg
YmVlbiBjb3BpZWQgaW50bworICAvLyAgIHRoZSBUcmFjZUJ1ZmZlci4KKyAgLy8gMikga2VlcCB0
aGUgY2h1bmtzIG9yZGVyZWQgYnkgdGhlaXIgSUQuIFRoaXMgaXMgdXNlZCB3aGVuIHJlYWRpbmcg
YmFjay4KKyAgLy8gMykgS2VlcCBtZXRhZGF0YSBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBjaHVu
aywgZS5nLiB3aGV0aGVyIHRoZSBjb250ZW50cworICAvLyAgICBoYXZlIGJlZW4gcmVhZCBhbHJl
YWR5IGFuZCBzaG91bGQgYmUgc2tpcHBlZCBpbiBhIGZ1dHVyZSByZWFkIHBhc3MuCisgIC8vIFRo
aXMgc3RydWN0IHNob3VsZCBub3QgaGF2ZSBhbnkgZmllbGQgdGhhdCBpcyBlc3NlbnRpYWwgZm9y
IHJlY29uc3RydWN0aW5nCisgIC8vIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGZyb20gYSBj
cmFzaCBkdW1wLgorICBzdHJ1Y3QgQ2h1bmtNZXRhIHsKKyAgICAvLyBLZXkgdXNlZCBmb3Igc29y
dGluZyBpbiB0aGUgbWFwLgorICAgIHN0cnVjdCBLZXkgeworICAgICAgS2V5KFByb2R1Y2VySUQg
cCwgV3JpdGVySUQgdywgQ2h1bmtJRCBjKQorICAgICAgICAgIDogcHJvZHVjZXJfaWR7cH0sIHdy
aXRlcl9pZHt3fSwgY2h1bmtfaWR7Y30ge30KKworICAgICAgZXhwbGljaXQgS2V5KGNvbnN0IENo
dW5rUmVjb3JkJiBjcikKKyAgICAgICAgICA6IEtleShjci5wcm9kdWNlcl9pZCwgY3Iud3JpdGVy
X2lkLCBjci5jaHVua19pZCkge30KKworICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgc29ydGluZyBk
b2Vzbid0IGtlZXAgaW50byBhY2NvdW50IHRoZSBmYWN0IHRoYXQgQ2h1bmtJRAorICAgICAgLy8g
d2lsbCB3cmFwIG92ZXIgYXQgc29tZSBwb2ludC4gVGhlIGV4dHJhIGxvZ2ljIGluIFNlcXVlbmNl
SXRlcmF0b3IgZGVhbHMKKyAgICAgIC8vIHdpdGggdGhhdC4KKyAgICAgIGJvb2wgb3BlcmF0b3I8
KGNvbnN0IEtleSYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKHByb2R1
Y2VyX2lkLCB3cml0ZXJfaWQsIGNodW5rX2lkKSA8CisgICAgICAgICAgICAgICBzdGQ6OnRpZShv
dGhlci5wcm9kdWNlcl9pZCwgb3RoZXIud3JpdGVyX2lkLCBvdGhlci5jaHVua19pZCk7CisgICAg
ICB9CisKKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXkmIG90aGVyKSBjb25zdCB7Cisg
ICAgICAgIHJldHVybiBzdGQ6OnRpZShwcm9kdWNlcl9pZCwgd3JpdGVyX2lkLCBjaHVua19pZCkg
PT0KKyAgICAgICAgICAgICAgIHN0ZDo6dGllKG90aGVyLnByb2R1Y2VyX2lkLCBvdGhlci53cml0
ZXJfaWQsIG90aGVyLmNodW5rX2lkKTsKKyAgICAgIH0KKworICAgICAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IEtleSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisK
KyAgICAgIC8vIFRoZXNlIGZpZWxkcyBzaG91bGQgbWF0Y2ggYXQgYWxsIHRpbWVzIHRoZSBjb3Jy
ZXNwb25kaW5nIGZpZWxkcyBpbgorICAgICAgLy8gdGhlIHxjaHVua19yZWNvcmR8LiBUaGV5IGFy
ZSBjb3BpZWQgaGVyZSBwdXJlbHkgZm9yIGVmZmljaWVuY3kgdG8gYXZvaWQKKyAgICAgIC8vIGRl
cmVmZXJlbmNpbmcgdGhlIGJ1ZmZlciBhbGwgdGhlIHRpbWUuCisgICAgICBQcm9kdWNlcklEIHBy
b2R1Y2VyX2lkOworICAgICAgV3JpdGVySUQgd3JpdGVyX2lkOworICAgICAgQ2h1bmtJRCBjaHVu
a19pZDsKKyAgICB9OworCisgICAgZW51bSBJbmRleEZsYWdzIDogdWludDhfdCB7CisgICAgICAv
LyBJZiBzZXQsIHRoZSBjaHVuayBzdGF0ZSB3YXMga0NodW5rQ29tcGxldGUgYXQgdGhlIHRpbWUg
aXQgd2FzIGNvcGllZC4KKyAgICAgIC8vIElmIHVuc2V0LCB0aGUgY2h1bmsgd2FzIHN0aWxsIGtD
aHVua0JlaW5nV3JpdHRlbiB3aGlsZSBjb3BpZWQuIFdoZW4KKyAgICAgIC8vIHJlYWRpbmcgZnJv
bSB0aGUgY2h1bmsncyBzZXF1ZW5jZSwgdGhlIHNlcXVlbmNlIHdpbGwgbm90IGFkdmFuY2UgcGFz
dAorICAgICAgLy8gdGhpcyBjaHVuayB1bnRpbCB0aGlzIGZsYWcgaXMgc2V0LgorICAgICAga0Nv
bXBsZXRlID0gMSA8PCAwLAorCisgICAgICAvLyBJZiBzZXQsIHdlIHNraXBwZWQgdGhlIGxhc3Qg
cGFja2V0IHRoYXQgd2UgcmVhZCBmcm9tIHRoaXMgY2h1bmsgZS5nLgorICAgICAgLy8gYmVjYXVz
ZSB3ZSBpdCB3YXMgYSBjb250aW51YXRpb24gZnJvbSBhIHByZXZpb3VzIGNodW5rIHRoYXQgd2Fz
IGRyb3BwZWQKKyAgICAgIC8vIG9yIGR1ZSB0byBhbiBBQkkgdmlvbGF0aW9uLgorICAgICAga0xh
c3RSZWFkUGFja2V0U2tpcHBlZCA9IDEgPDwgMQorICAgIH07CisKKyAgICBDaHVua01ldGEoQ2h1
bmtSZWNvcmQqIHIsIHVpbnQxNl90IHAsIGJvb2wgY29tcGxldGUsIHVpbnQ4X3QgZiwgdWlkX3Qg
dSkKKyAgICAgICAgOiBjaHVua19yZWNvcmR7cn0sIHRydXN0ZWRfdWlke3V9LCBmbGFnc3tmfSwg
bnVtX2ZyYWdtZW50c3twfSB7CisgICAgICBpZiAoY29tcGxldGUpCisgICAgICAgIGluZGV4X2Zs
YWdzID0ga0NvbXBsZXRlOworICAgIH0KKworICAgIGJvb2wgaXNfY29tcGxldGUoKSBjb25zdCB7
IHJldHVybiBpbmRleF9mbGFncyAmIGtDb21wbGV0ZTsgfQorCisgICAgdm9pZCBzZXRfY29tcGxl
dGUoYm9vbCBjb21wbGV0ZSkgeworICAgICAgaWYgKGNvbXBsZXRlKSB7CisgICAgICAgIGluZGV4
X2ZsYWdzIHw9IGtDb21wbGV0ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4X2ZsYWdz
ICY9IH5rQ29tcGxldGU7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbCBsYXN0X3JlYWRfcGFj
a2V0X3NraXBwZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXhfZmxhZ3MgJiBrTGFzdFJl
YWRQYWNrZXRTa2lwcGVkOworICAgIH0KKworICAgIHZvaWQgc2V0X2xhc3RfcmVhZF9wYWNrZXRf
c2tpcHBlZChib29sIHNraXBwZWQpIHsKKyAgICAgIGlmIChza2lwcGVkKSB7CisgICAgICAgIGlu
ZGV4X2ZsYWdzIHw9IGtMYXN0UmVhZFBhY2tldFNraXBwZWQ7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBpbmRleF9mbGFncyAmPSB+a0xhc3RSZWFkUGFja2V0U2tpcHBlZDsKKyAgICAgIH0KKyAg
ICB9CisKKyAgICBDaHVua1JlY29yZCogY29uc3QgY2h1bmtfcmVjb3JkOyAgLy8gQWRkciBvZiBD
aHVua1JlY29yZCB3aXRoaW4gfGRhdGFffC4KKyAgICBjb25zdCB1aWRfdCB0cnVzdGVkX3VpZDsg
ICAgICAgICAgLy8gdWlkIG9mIHRoZSBwcm9kdWNlci4KKworICAgIC8vIEZsYWdzIHNldCBieSBU
cmFjZUJ1ZmZlciB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIGNodW5rIGluIHRoZSBpbmRleC4K
KyAgICB1aW50OF90IGluZGV4X2ZsYWdzID0gMDsKKworICAgIC8vIENvcnJlc3BvbmQgdG8gfGNo
dW5rX3JlY29yZC0+ZmxhZ3N8IGFuZCB8Y2h1bmtfcmVjb3JkLT5udW1fZnJhZ21lbnRzfC4KKyAg
ICAvLyBDb3BpZWQgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAoYXZvaWRzIGhhdmluZyB0
byBkZXJlZmVyZW5jZQorICAgIC8vIHxjaHVua19yZWNvcmR8IHdoaWxlIGl0ZXJhdGluZyBvdmVy
IENodW5rTWV0YSkgYW5kIHRvIGFpZCBkZWJ1Z2dpbmcgaW4KKyAgICAvLyBjYXNlIHRoZSBidWZm
ZXIgZ2V0cyBjb3JydXB0ZWQuCisgICAgdWludDhfdCBmbGFncyA9IDA7ICAgICAgICAgICAvLyBT
ZWUgU2hhcmVkTWVtb3J5QUJJOjpDaHVua0hlYWRlcjo6ZmxhZ3MuCisgICAgdWludDE2X3QgbnVt
X2ZyYWdtZW50cyA9IDA7ICAvLyBUb3RhbCBudW1iZXIgb2YgcGFja2V0IGZyYWdtZW50cy4KKwor
ICAgIHVpbnQxNl90IG51bV9mcmFnbWVudHNfcmVhZCA9IDA7ICAvLyBOdW1iZXIgb2YgZnJhZ21l
bnRzIGFscmVhZHkgcmVhZC4KKworICAgIC8vIFRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIG5leHQg
ZnJhZ21lbnQgKHRoZSB8bnVtX2ZyYWdtZW50c19yZWFkfC10aCkgdG8gYmUKKyAgICAvLyByZWFk
LiBUaGlzIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBD
aHVua1JlY29yZCdzCisgICAgLy8gcGF5bG9hZCAodGhlIDFzdCBmcmFnbWVudCBzdGFydHMgYXQg
fGNodW5rX3JlY29yZHwgKworICAgIC8vIHNpemVvZihDaHVua1JlY29yZCkpLgorICAgIHVpbnQx
Nl90IGN1cl9mcmFnbWVudF9vZmZzZXQgPSAwOworICB9OworCisgIHVzaW5nIENodW5rTWFwID0g
c3RkOjptYXA8Q2h1bmtNZXRhOjpLZXksIENodW5rTWV0YT47CisKKyAgLy8gQWxsb3dzIHRvIGl0
ZXJhdGUgb3ZlciBhIHN1Yi1zZXF1ZW5jZSBvZiB8aW5kZXhffCBmb3IgYWxsIGtleXMgYmVsb25n
aW5nIHRvCisgIC8vIHRoZSBzYW1lIHtQcm9kdWNlcklELFdyaXRlcklEfS4gRnVydGhlcm1vcmUg
dGFrZXMgaW50byBhY2NvdW50IHRoZSB3cmFwcGluZworICAvLyBvZiBDaHVua0lELiBJbnN0YW5j
ZXMgYXJlIHZhbGlkIG9ubHkgYXMgbG9uZyBhcyB0aGUgfGluZGV4X3wgaXMgbm90IGFsdGVyZWQK
KyAgLy8gKGNhbiBiZSB1c2VkIHNhZmVseSBvbmx5IGJldHdlZW4gYWRqYWNlbnQgUmVhZE5leHRU
cmFjZVBhY2tldCgpIGNhbGxzKS4KKyAgLy8gVGhlIG9yZGVyIG9mIHRoZSBpdGVyYXRpb24gd2ls
bCBwcm9jZWVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgIC8vIHx3cmFwcGluZ19pZHwgKyAx
IC0+IHxzZXFfZW5kfCwgfHNlcV9iZWdpbnwgLT4gfHdyYXBwaW5nX2lkfC4KKyAgLy8gUHJhY3Rp
Y2FsIGV4YW1wbGU6CisgIC8vIC0gQXNzdW1lIHRoYXQga01heENodW5rSUQgPT0gNworICAvLyAt
IEFzc3VtZSB0aGF0IHdlIGhhdmUgYWxsIDggY2h1bmtzIGluIHRoZSByYW5nZSAoMC4uNykuCisg
IC8vIC0gSGVuY2UsIHxzZXFfYmVnaW58ID09IGMwLCB8c2VxX2VuZHwgPT0gYzcKKyAgLy8gLSBB
c3N1bWUgfHdyYXBwaW5nX2lkfCA9IDQgKGM0IGlzIHRoZSBsYXN0IGNodW5rIGNvcGllZCBvdmVy
CisgIC8vICAgdGhyb3VnaCBhIENvcHlDaHVua1VudHJ1c3RlZCgpKS4KKyAgLy8gVGhlIHJlc3Vs
dGluZyBpdGVyYXRpb24gb3JkZXIgd2lsbCBiZTogYzUsIGM2LCBjNywgYzAsIGMxLCBjMiwgYzMs
IGM0LgorICBzdHJ1Y3QgU2VxdWVuY2VJdGVyYXRvciB7CisgICAgLy8gUG9pbnRzIHRvIHRoZSAx
c3Qga2V5ICh0aGUgb25lIHdpdGggdGhlIG51bWVyaWNhbGx5IG1pbiBDaHVua0lEKS4KKyAgICBD
aHVua01hcDo6aXRlcmF0b3Igc2VxX2JlZ2luOworCisgICAgLy8gUG9pbnRzIG9uZSBwYXN0IHRo
ZSBsYXN0IGtleSAodGhlIG9uZSB3aXRoIHRoZSBudW1lcmljYWxseSBtYXggQ2h1bmtJRCkuCisg
ICAgQ2h1bmtNYXA6Oml0ZXJhdG9yIHNlcV9lbmQ7CisKKyAgICAvLyBDdXJyZW50IGl0ZXJhdG9y
LCBhbHdheXMgPj0gc2VxX2JlZ2luICYmIDw9IHNlcV9lbmQuCisgICAgQ2h1bmtNYXA6Oml0ZXJh
dG9yIGN1cjsKKworICAgIC8vIFRoZSBsYXRlc3QgQ2h1bmtJRCB3cml0dGVuLiBEZXRlcm1pbmVz
IHRoZSBzdGFydC9lbmQgb2YgdGhlIHNlcXVlbmNlLgorICAgIENodW5rSUQgd3JhcHBpbmdfaWQ7
CisKKyAgICBib29sIGlzX3ZhbGlkKCkgY29uc3QgeyByZXR1cm4gY3VyICE9IHNlcV9lbmQ7IH0K
KworICAgIFByb2R1Y2VySUQgcHJvZHVjZXJfaWQoKSBjb25zdCB7CisgICAgICBQRVJGRVRUT19E
Q0hFQ0soaXNfdmFsaWQoKSk7CisgICAgICByZXR1cm4gY3VyLT5maXJzdC5wcm9kdWNlcl9pZDsK
KyAgICB9CisKKyAgICBXcml0ZXJJRCB3cml0ZXJfaWQoKSBjb25zdCB7CisgICAgICBQRVJGRVRU
T19EQ0hFQ0soaXNfdmFsaWQoKSk7CisgICAgICByZXR1cm4gY3VyLT5maXJzdC53cml0ZXJfaWQ7
CisgICAgfQorCisgICAgQ2h1bmtJRCBjaHVua19pZCgpIGNvbnN0IHsKKyAgICAgIFBFUkZFVFRP
X0RDSEVDSyhpc192YWxpZCgpKTsKKyAgICAgIHJldHVybiBjdXItPmZpcnN0LmNodW5rX2lkOwor
ICAgIH0KKworICAgIENodW5rTWV0YSYgb3BlcmF0b3IqKCkgeworICAgICAgUEVSRkVUVE9fRENI
RUNLKGlzX3ZhbGlkKCkpOworICAgICAgcmV0dXJuIGN1ci0+c2Vjb25kOworICAgIH0KKworICAg
IC8vIE1vdmVzIHxjdXJ8IHRvIHRoZSBuZXh0IGNodW5rIGluIHRoZSBpbmRleC4KKyAgICAvLyBp
c192YWxpZCgpIHdpbGwgYmVjb21lIGZhbHNlIGFmdGVyIGNhbGxpbmcgdGhpcywgaWYgdGhpcyB3
YXMgdGhlIGxhc3QKKyAgICAvLyBlbnRyeSBvZiB0aGUgc2VxdWVuY2UuCisgICAgdm9pZCBNb3Zl
TmV4dCgpOworCisgICAgdm9pZCBNb3ZlVG9FbmQoKSB7IGN1ciA9IHNlcV9lbmQ7IH0KKyAgfTsK
KworICBlbnVtIGNsYXNzIFJlYWRBaGVhZFJlc3VsdCB7CisgICAga1N1Y2NlZWRlZFJldHVyblNs
aWNlcywKKyAgICBrRmFpbGVkTW92ZVRvTmV4dFNlcXVlbmNlLAorICAgIGtGYWlsZWRTdGF5T25T
YW1lU2VxdWVuY2UsCisgIH07CisKKyAgZW51bSBjbGFzcyBSZWFkUGFja2V0UmVzdWx0IHsKKyAg
ICBrU3VjY2VlZGVkLAorICAgIGtGYWlsZWRJbnZhbGlkUGFja2V0LAorICAgIGtGYWlsZWRFbXB0
eVBhY2tldCwKKyAgfTsKKworICBleHBsaWNpdCBUcmFjZUJ1ZmZlcihPdmVyd3JpdGVQb2xpY3kp
OworICBUcmFjZUJ1ZmZlcihjb25zdCBUcmFjZUJ1ZmZlciYpID0gZGVsZXRlOworICBUcmFjZUJ1
ZmZlciYgb3BlcmF0b3I9KGNvbnN0IFRyYWNlQnVmZmVyJikgPSBkZWxldGU7CisKKyAgYm9vbCBJ
bml0aWFsaXplKHNpemVfdCBzaXplKTsKKworICAvLyBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGFs
bG93cyB0byBpdGVyYXRlIG92ZXIgY2h1bmtzIGluIHRoZSB8aW5kZXhffCB0aGF0CisgIC8vIGhh
dmUgdGhlIHNhbWUge1Byb2R1Y2VySUQsIFdyaXRlcklEfSBvZgorICAvLyB8c2VxX2JlZ2luLmZp
cnN0Lntwcm9kdWNlcix3cml0ZXJ9X2lkfC4gfHNlcV9iZWdpbnwgbXVzdCBiZSBhbiBpdGVyYXRv
ciB0bworICAvLyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHxpbmRleF98IHRoYXQgaGFzIGEgZGlm
ZmVyZW50IHtQcm9kdWNlcklELCBXcml0ZXJJRH0KKyAgLy8gZnJvbSB0aGUgcHJldmlvdXMgb25l
LiBJdCBpcyB2YWxpZCBmb3IgfHNlcV9iZWdpbnwgdG8gYmUgPT0gaW5kZXhfLmVuZCgpCisgIC8v
IChpLmUuIGlmIHRoZSBpbmRleCBpcyBlbXB0eSkuIFRoZSBpdGVyYXRpb24gdGFrZXMgY2FyZSBv
ZiBDaHVua0lEIHdyYXBwaW5nLAorICAvLyBieSB1c2luZyB8bGFzdF9jaHVua19pZF98LgorICBT
ZXF1ZW5jZUl0ZXJhdG9yIEdldFJlYWRJdGVyRm9yU2VxdWVuY2UoQ2h1bmtNYXA6Oml0ZXJhdG9y
IHNlcV9iZWdpbik7CisKKyAgLy8gVXNlZCBhcyBhIGxhc3QgcmVzb3J0IHdoZW4gYSBidWZmZXIg
Y29ycnVwdGlvbiBpcyBkZXRlY3RlZC4KKyAgdm9pZCBDbGVhckNvbnRlbnRzQW5kUmVzZXRSV0N1
cnNvcnMoKTsKKworICAvLyBBZGRzIGEgcGFkZGluZyByZWNvcmQgb2YgdGhlIGdpdmVuIHNpemUg
KG11c3QgYmUgYSBtdWx0aXBsZSBvZgorICAvLyBzaXplb2YoQ2h1bmtSZWNvcmQpKS4KKyAgdm9p
ZCBBZGRQYWRkaW5nUmVjb3JkKHNpemVfdCk7CisKKyAgLy8gTG9vayBmb3IgY29udGlndW91cyBm
cmFnbWVudCBvZiB0aGUgc2FtZSBwYWNrZXQgc3RhcnRpbmcgZnJvbSB8cmVhZF9pdGVyX3wuCisg
IC8vIElmIGEgY29udGlndW91cyBwYWNrZXQgaXMgZm91bmQsIGFsbCB0aGUgZnJhZ21lbnRzIGFy
ZSBwdXNoZWQgaW50bworICAvLyBUcmFjZVBhY2tldCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMg
a1N1Y2NlZWRlZFJldHVyblNsaWNlcy4gSWYgbm90LCB0aGUKKyAgLy8gZnVuY3Rpb24gcmV0dXJu
cyBlaXRoZXIga0ZhaWxlZE1vdmVUb05leHRTZXF1ZW5jZSBvcgorICAvLyBrRmFpbGVkU3RheU9u
U2FtZVNlcXVlbmNlLCB0ZWxsaW5nIHRoZSBjYWxsZXIgdG8gY29udGludWUgbG9va2luZyBmb3IK
KyAgLy8gcGFja2V0cy4KKyAgUmVhZEFoZWFkUmVzdWx0IFJlYWRBaGVhZChUcmFjZVBhY2tldCop
OworCisgIC8vIERlbGV0ZXMgKGJ5IG1hcmtpbmcgdGhlIHJlY29yZCBpbnZhbGlkIGFuZCByZW1v
dmluZyBmb3JtIHRoZSBpbmRleCkgYWxsCisgIC8vIGNodW5rcyBmcm9tIHx3cHRyX3wgdG8gfHdw
dHJffCArIHxieXRlc190b19jbGVhcnwuCisgIC8vIFJldHVybnM6CisgIC8vICAgKiBUaGUgc2l6
ZSBvZiB0aGUgZ2FwIGxlZnQgYmV0d2VlbiB0aGUgbmV4dCB2YWxpZCBDaHVuayBhbmQgdGhlIGVu
ZCBvZgorICAvLyAgICAgdGhlIGRlbGV0aW9uIHJhbmdlLgorICAvLyAgICogMCBpZiBubyBuZXh0
IHZhbGlkIGNodW5rIGV4aXN0cyAoaWYgdGhlIGJ1ZmZlciBpcyBzdGlsbCB6ZXJvZWQpLgorICAv
LyAgICogLTEgaWYgdGhlIGJ1ZmZlciB8b3ZlcndyaXRlX3BvbGljeV98ID09IGtEaXNjYXJkIGFu
ZCB0aGUgZGVsZXRpb24gd291bGQKKyAgLy8gICAgIGNhdXNlIHVucmVhZCBjaHVua3MgdG8gYmUg
b3ZlcndyaXR0ZW4uIEluIHRoaXMgY2FzZSB0aGUgYnVmZmVyIGlzIGxlZnQKKyAgLy8gICAgIHVu
dG91Y2hlZC4KKyAgLy8gR3JhcGhpY2FsbHksIGFzc3VtZSB0aGUgaW5pdGlhbCBzaXR1YXRpb24g
aXMgdGhlIGZvbGxvd2luZyAofHdwdHJffCA9IDEwKS4KKyAgLy8gfDAgICAgICAgIHwxMCAod3B0
cl8pICAgICAgIHwzMCAgICAgICB8NDAgICAgICAgICAgICAgICAgIHw2MAorICAvLyArLS0tLS0t
LS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0t
LS0tLSsKKyAgLy8gfCBDaHVuayAxIHwgQ2h1bmsgMiAgICAgICAgIHwgQ2h1bmsgMyB8IENodW5r
IDQgICAgICAgICAgIHwgQ2h1bmsgNSB8CisgIC8vICstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t
LS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICAvLyAgICAgICAg
ICAgfF9fX19fX19fX0RlbGV0aW9uIHJhbmdlX19fX19fX3x+fnJldHVybiB2YWx1ZX5+fAorICAv
LworICAvLyBBIGNhbGwgdG8gRGVsZXRlTmV4dENodW5rc0ZvcigzMikgd2lsbCByZW1vdmUgY2h1
bmtzIDIsMyw0IGFuZCByZXR1cm4gMTgKKyAgLy8gKDYwIC0gNDIpLCB0aGUgZGlzdGFuY2UgYmV0
d2VlbiBjaHVuayA1IGFuZCB0aGUgZW5kIG9mIHRoZSBkZWxldGlvbiByYW5nZS4KKyAgc3NpemVf
dCBEZWxldGVOZXh0Q2h1bmtzRm9yKHNpemVfdCBieXRlc190b19jbGVhcik7CisKKyAgLy8gRGVj
b2RlcyB0aGUgYm91bmRhcmllcyBvZiB0aGUgbmV4dCBwYWNrZXQgKG9yIGEgZnJhZ21lbnQpIHBv
aW50ZWQgYnkKKyAgLy8gQ2h1bmtNZXRhIGFuZCBwdXNoZXMgdGhhdCBpbnRvIHxUcmFjZVBhY2tl
dHwuIEl0IGFsc28gaW5jcmVtZW50cyB0aGUKKyAgLy8gfG51bV9mcmFnbWVudHNfcmVhZHwgY291
bnRlci4KKyAgLy8gVHJhY2VQYWNrZXQgY2FuIGJlIG51bGxwdHIsIGluIHdoaWNoIGNhc2UgdGhl
IHJlYWQgc3RhdGUgaXMgc3RpbGwgYWR2YW5jZWQuCisgIC8vIFdoZW4gVHJhY2VQYWNrZXQgaXMg
bm90IG51bGxwdHIsIFByb2R1Y2VySUQgbXVzdCBhbHNvIGJlIG5vdCBudWxsIGFuZCB3aWxsCisg
IC8vIGJlIHVwZGF0ZWQgd2l0aCB0aGUgUHJvZHVjZXJJRCB0aGF0IG9yaWdpbmFsbHkgd3JvdGUg
dGhlIGNodW5rLgorICBSZWFkUGFja2V0UmVzdWx0IFJlYWROZXh0UGFja2V0SW5DaHVuayhDaHVu
a01ldGEqLCBUcmFjZVBhY2tldCopOworCisgIHZvaWQgRGNoZWNrSXNBbGlnbmVkQW5kV2l0aGlu
Qm91bmRzKGNvbnN0IHVpbnQ4X3QqIHB0cikgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSyhw
dHIgPj0gYmVnaW4oKSAmJiBwdHIgPD0gZW5kKCkgLSBzaXplb2YoQ2h1bmtSZWNvcmQpKTsKKyAg
ICBQRVJGRVRUT19EQ0hFQ0soCisgICAgICAgIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4o
cHRyKSAmIChhbGlnbm9mKENodW5rUmVjb3JkKSAtIDEpKSA9PSAwKTsKKyAgfQorCisgIENodW5r
UmVjb3JkKiBHZXRDaHVua1JlY29yZEF0KHVpbnQ4X3QqIHB0cikgeworICAgIERjaGVja0lzQWxp
Z25lZEFuZFdpdGhpbkJvdW5kcyhwdHIpOworICAgIC8vIFdlIG1heSBiZSBhY2Nlc3NpbmcgYSBu
ZXcgKGVtcHR5KSByZWNvcmQuCisgICAgZGF0YV8uRW5zdXJlQ29tbWl0dGVkKAorICAgICAgICBz
dGF0aWNfY2FzdDxzaXplX3Q+KHB0ciArIHNpemVvZihDaHVua1JlY29yZCkgLSBiZWdpbigpKSk7
CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q2h1bmtSZWNvcmQqPihwdHIpOworICB9CisK
KyAgdm9pZCBEaXNjYXJkV3JpdGUoKTsKKworICAvLyB8c3JjfCBjYW4gYmUgbnVsbHB0ciAoaW4g
d2hpY2ggY2FzZSB8c2l6ZXwgbXVzdCBiZSA9PQorICAvLyByZWNvcmQuc2l6ZSAtIHNpemVvZihD
aHVua1JlY29yZCkpLCBmb3IgdGhlIGNhc2Ugb2Ygd3JpdGluZyBhIHBhZGRpbmcKKyAgLy8gcmVj
b3JkLiB8d3B0cl98IGlzIE5PVCBhZHZhbmNlZCBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgY2FsbGVy
IG11c3QgZG8gdGhhdC4KKyAgdm9pZCBXcml0ZUNodW5rUmVjb3JkKHVpbnQ4X3QqIHdwdHIsCisg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaHVua1JlY29yZCYgcmVjb3JkLAorICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAg
ICAgICAgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBOb3RlOiB8cmVjb3JkLnNpemV8IHdpbGwgYmUg
c2xpZ2h0bHkgYmlnZ2VyIHRoYW4gfHNpemV8IGJlY2F1c2Ugb2YgdGhlCisgICAgLy8gQ2h1bmtS
ZWNvcmQgaGVhZGVyIGFuZCByb3VuZGluZywgdG8gZW5zdXJlIHRoYXQgYWxsIENodW5rUmVjb3Jk
KHMpIGFyZQorICAgIC8vIG11bHRpcGxlIG9mIHNpemVvZihDaHVua1JlY29yZCkuIFRoZSBpbnZh
cmlhbnQgaXM6CisgICAgLy8gcmVjb3JkLnNpemUgPj0gfHNpemV8ICsgc2l6ZW9mKENodW5rUmVj
b3JkKSAoPT0gaWYgbm8gcm91bmRpbmcpLgorICAgIFBFUkZFVFRPX0RDSEVDSyhzaXplIDw9IENo
dW5rUmVjb3JkOjprTWF4U2l6ZSk7CisgICAgUEVSRkVUVE9fRENIRUNLKHJlY29yZC5zaXplID49
IHNpemVvZihyZWNvcmQpKTsKKyAgICBQRVJGRVRUT19EQ0hFQ0socmVjb3JkLnNpemUgJSBzaXpl
b2YocmVjb3JkKSA9PSAwKTsKKyAgICBQRVJGRVRUT19EQ0hFQ0socmVjb3JkLnNpemUgPj0gc2l6
ZSArIHNpemVvZihyZWNvcmQpKTsKKyAgICBQRVJGRVRUT19DSEVDSyhyZWNvcmQuc2l6ZSA8PSBz
aXplX3RvX2VuZCgpKTsKKyAgICBEY2hlY2tJc0FsaWduZWRBbmRXaXRoaW5Cb3VuZHMod3B0cik7
CisKKyAgICAvLyBXZSBtYXkgYmUgd3JpdGluZyB0byB0aGlzIGFyZWEgZm9yIHRoZSBmaXJzdCB0
aW1lLgorICAgIGRhdGFfLkVuc3VyZUNvbW1pdHRlZChzdGF0aWNfY2FzdDxzaXplX3Q+KHdwdHIg
KyByZWNvcmQuc2l6ZSAtIGJlZ2luKCkpKTsKKworICAgIC8vIERlbGliZXJhdGVseSBub3QgYSAq
RCpDSEVDSy4KKyAgICBQRVJGRVRUT19DSEVDSyh3cHRyICsgc2l6ZW9mKHJlY29yZCkgKyBzaXpl
IDw9IGVuZCgpKTsKKyAgICBtZW1jcHkod3B0ciwgJnJlY29yZCwgc2l6ZW9mKHJlY29yZCkpOwor
ICAgIGlmIChQRVJGRVRUT19MSUtFTFkoc3JjKSkgeworICAgICAgLy8gSWYgdGhlIHByb2R1Y2Vy
IG1vZGlmaWVzIHRoZSBkYXRhIGluIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciB3aGlsZSB3ZQor
ICAgICAgLy8gYXJlIGNvcHlpbmcgaXQgdG8gdGhlIGNlbnRyYWwgYnVmZmVyLCBUU0FOIHdpbGwg
KHJpZ2h0ZnVsbHkpIGZsYWcgdGhhdAorICAgICAgLy8gYXMgYSByYWNlLiBIb3dldmVyIHRoZSBl
bnRpcmUgcHVycG9zZSBvZiBjb3B5aW5nIHRoZSBkYXRhIGludG8gdGhlCisgICAgICAvLyBjZW50
cmFsIGJ1ZmZlciBpcyB0aGF0IHdlIGNhbiB2YWxpZGF0ZSBpdCB3aXRob3V0IHdvcnJ5aW5nIHRo
YXQgdGhlCisgICAgICAvLyBwcm9kdWNlciBjaGFuZ2VzIGl0IGZyb20gdW5kZXIgb3VyIGZlZXQs
IHNvIHRoaXMgcmFjZSBpcyBiZW5pZ24uIFRoZQorICAgICAgLy8gYWx0ZXJuYXRpdmUgd291bGQg
YmUgdG8gdHJ5IGNvbXB1dGluZyB3aGljaCBwYXJ0IG9mIHRoZSBidWZmZXIgaXMgc2FmZQorICAg
ICAgLy8gdG8gcmVhZCAoYXNzdW1pbmcgYSB3ZWxsLWJlaGF2aW5nIGNsaWVudCksIGJ1dCB0aGUg
cmlzayBvZiBpbnRyb2R1Y2luZworICAgICAgLy8gYSBidWcgdGhhdCB3YXkgb3V0d2VpZ2hzIHRo
ZSBiZW5lZml0LgorICAgICAgUEVSRkVUVE9fQU5OT1RBVEVfQkVOSUdOX1JBQ0VfU0laRUQoCisg
ICAgICAgICAgc3JjLCBzaXplLCAiQmVuaWduIHJhY2Ugd2hlbiBjb3B5aW5nIGNodW5rIGZyb20g
c2hhcmVkIG1lbW9yeS4iKQorICAgICAgbWVtY3B5KHdwdHIgKyBzaXplb2YocmVjb3JkKSwgc3Jj
LCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgUEVSRkVUVE9fRENIRUNLKHNpemUgPT0gcmVj
b3JkLnNpemUgLSBzaXplb2YocmVjb3JkKSk7CisgICAgfQorICAgIGNvbnN0IHNpemVfdCByb3Vu
ZGluZ19zaXplID0gcmVjb3JkLnNpemUgLSBzaXplb2YocmVjb3JkKSAtIHNpemU7CisgICAgbWVt
c2V0KHdwdHIgKyBzaXplb2YocmVjb3JkKSArIHNpemUsIDAsIHJvdW5kaW5nX3NpemUpOworICB9
CisKKyAgdWludDhfdCogYmVnaW4oKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PHVp
bnQ4X3QqPihkYXRhXy5HZXQoKSk7IH0KKyAgdWludDhfdCogZW5kKCkgY29uc3QgeyByZXR1cm4g
YmVnaW4oKSArIHNpemVfOyB9CisgIHNpemVfdCBzaXplX3RvX2VuZCgpIGNvbnN0IHsgcmV0dXJu
IHN0YXRpY19jYXN0PHNpemVfdD4oZW5kKCkgLSB3cHRyXyk7IH0KKworICBiYXNlOjpQYWdlZE1l
bW9yeSBkYXRhXzsKKyAgc2l6ZV90IHNpemVfID0gMDsgICAgICAgICAgICAvLyBTaXplIGluIGJ5
dGVzIG9mIHxkYXRhX3wuCisgIHNpemVfdCBtYXhfY2h1bmtfc2l6ZV8gPSAwOyAgLy8gTWF4IHNp
emUgaW4gYnl0ZXMgYWxsb3dlZCBmb3IgYSBjaHVuay4KKyAgdWludDhfdCogd3B0cl8gPSBudWxs
cHRyOyAgICAvLyBXcml0ZSBwb2ludGVyLgorCisgIC8vIEFuIGluZGV4IHRoYXQga2VlcHMgdHJh
Y2sgb2YgdGhlIHBvc2l0aW9ucyBhbmQgbWV0YWRhdGEgb2YgZWFjaAorICAvLyBDaHVua1JlY29y
ZC4KKyAgQ2h1bmtNYXAgaW5kZXhfOworCisgIC8vIFJlYWQgaXRlcmF0b3IgdXNlZCBmb3IgUmVh
ZE5leHQoKS4gSXQgaXMgcmVzZXQgYnkgY2FsbGluZyBCZWdpblJlYWQoKS4KKyAgLy8gSXQgYmVj
b21lcyBpbnZhbGlkIGFmdGVyIGFueSBjYWxsIHRvIG1ldGhvZHMgdGhhdCBhbHRlcnMgdGhlIHxp
bmRleF98LgorICBTZXF1ZW5jZUl0ZXJhdG9yIHJlYWRfaXRlcl87CisKKyAgLy8gU2VlIGNvbW1l
bnRzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuCisgIE92ZXJ3cml0ZVBvbGljeSBvdmVyd3JpdGVf
cG9saWN5XyA9IGtPdmVyd3JpdGU7CisKKyAgLy8gT25seSB1c2VkIHdoZW4gfG92ZXJ3cml0ZV9w
b2xpY3lfID09IGtEaXNjYXJkfC4gVGhpcyBpcyBzZXQgdGhlIGZpcnN0IHRpbWUKKyAgLy8gYSB3
cml0ZSBmYWlscyBiZWNhdXNlIGl0IHdvdWxkIG92ZXJ3cml0ZSB1bnJlYWQgY2h1bmtzLgorICBi
b29sIGRpc2NhcmRfd3JpdGVzXyA9IGZhbHNlOworCisgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBo
aWdoZXN0IENodW5rSUQgd3JpdHRlbiBmb3IgYSBnaXZlbiBzZXF1ZW5jZSwgdGFraW5nCisgIC8v
IGludG8gYWNjb3VudCBhIHBvdGVudGlhbCBvdmVyZmxvdyBvZiBDaHVua0lEcy4gSW4gdGhlIGNh
c2Ugb2Ygb3ZlcmZsb3csCisgIC8vIHN0b3JlcyB0aGUgaGlnaGVzdCBDaHVua0lEIHdyaXR0ZW4g
c2luY2UgdGhlIG92ZXJmbG93LgorICAvLworICAvLyBUT0RPKHByaW1pYW5vKTogc2hvdWxkIGNs
ZWFuIHVwIGtleXMgZnJvbSB0aGlzIG1hcC4gUmlnaHQgbm93IGl0IGdyb3dzCisgIC8vIHdpdGhv
dXQgYm91bmRzIChhbHRob3VnaCByZWFsaXN0aWNhbGx5IGlzIG5vdCBhIHByb2JsZW0gdW5sZXNz
IHdlIGhhdmUgdG9vCisgIC8vIG1hbnkgcHJvZHVjZXJzL3dyaXRlcnMgd2l0aGluIHRoZSBzYW1l
IHRyYWNlIHNlc3Npb24pLgorICBzdGQ6Om1hcDxzdGQ6OnBhaXI8UHJvZHVjZXJJRCwgV3JpdGVy
SUQ+LCBDaHVua0lEPiBsYXN0X2NodW5rX2lkX3dyaXR0ZW5fOworCisgIC8vIFN0YXRpc3RpY3Mg
YWJvdXQgYnVmZmVyIHVzYWdlLgorICBUcmFjZVN0YXRzOjpCdWZmZXJTdGF0cyBzdGF0c187CisK
KyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICBib29sIGNoYW5nZWRfc2luY2VfbGFzdF9y
ZWFkXyA9IGZhbHNlOworI2VuZGlmCisKKyAgLy8gV2hlbiB0cnVlIGRpc2FibGUgc29tZSBEQ0hF
Q0tzIHRoYXQgaGF2ZSBiZWVuIHB1dCBpbiBwbGFjZSB0byBkZXRlY3QKKyAgLy8gYnVncyBpbiB0
aGUgcHJvZHVjZXJzLiBUaGlzIGlzIGZvciB0ZXN0cyB0aGF0IGZlZWQgbWFsaWNpb3VzIGlucHV0
cyBhbmQKKyAgLy8gaGVuY2UgbWltaWMgYSBidWdneSBwcm9kdWNlci4KKyAgYm9vbCBzdXBwcmVz
c19zYW5pdHlfZGNoZWNrc19mb3JfdGVzdGluZ18gPSBmYWxzZTsKK307CisKK30gIC8vIG5hbWVz
cGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIFNSQ19UUkFDSU5HX0NPUkVfVFJBQ0VfQlVGRkVS
X0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFBy
b2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24g
Mi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0
IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29w
eSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xp
Y2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUg
bGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5k
ZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJ
VEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVz
cyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3Vh
Z2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExp
Y2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAic3Jj
L3RyYWNpbmcvY29yZS90cmFjZV9idWZmZXIuaCIKKworI2luY2x1ZGUgPGxpbWl0cz4KKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5n
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQv
YmFzZS91dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5X2FiaS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS90cmFj
ZV9wYWNrZXQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCisjZGVmaW5lIFRSQUNFX0JVRkZFUl9WRVJC
T1NFX0xPR0dJTkcoKSAwICAvLyBTZXQgdG8gMSB3aGVuIGRlYnVnZ2luZyB1bml0dGVzdHMuCisj
aWYgVFJBQ0VfQlVGRkVSX1ZFUkJPU0VfTE9HR0lORygpCisjZGVmaW5lIFRSQUNFX0JVRkZFUl9E
TE9HIFBFUkZFVFRPX0RMT0cKK25hbWVzcGFjZSB7Citjb25zdGV4cHIgY2hhciBrSGV4RGlnaXRz
W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CitzdGQ6OnN0cmluZyBIZXhEdW1wKGNvbnN0IHVpbnQ4
X3QqIHNyYywgc2l6ZV90IHNpemUpIHsKKyAgc3RkOjpzdHJpbmcgYnVmOworICBidWYucmVzZXJ2
ZSg0MDk2ICogNCk7CisgIGNoYXIgbGluZVs2NF07CisgIGNoYXIqIGMgPSBsaW5lOworICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICpjKysgPSBrSGV4RGlnaXRzWyhz
cmNbaV0gPj4gNCkgJiAweDBmXTsKKyAgICAqYysrID0ga0hleERpZ2l0c1soc3JjW2ldID4+IDAp
ICYgMHgwZl07CisgICAgaWYgKGkgJSAxNiA9PSAxNSkgeworICAgICAgYnVmLmFwcGVuZCgiXG4i
KTsKKyAgICAgIGJ1Zi5hcHBlbmQobGluZSk7CisgICAgICBjID0gbGluZTsKKyAgICB9CisgIH0K
KyAgcmV0dXJuIGJ1ZjsKK30KK30gIC8vIG5hbWVzcGFjZQorI2Vsc2UKKyNkZWZpbmUgVFJBQ0Vf
QlVGRkVSX0RMT0coLi4uKSB2b2lkKCkKKyNlbmRpZgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
CituYW1lc3BhY2UgeworY29uc3RleHByIHVpbnQ4X3Qga0ZpcnN0UGFja2V0Q29udGludWVzRnJv
bVByZXZDaHVuayA9CisgICAgU2hhcmVkTWVtb3J5QUJJOjpDaHVua0hlYWRlcjo6a0ZpcnN0UGFj
a2V0Q29udGludWVzRnJvbVByZXZDaHVuazsKK2NvbnN0ZXhwciB1aW50OF90IGtMYXN0UGFja2V0
Q29udGludWVzT25OZXh0Q2h1bmsgPQorICAgIFNoYXJlZE1lbW9yeUFCSTo6Q2h1bmtIZWFkZXI6
OmtMYXN0UGFja2V0Q29udGludWVzT25OZXh0Q2h1bms7Citjb25zdGV4cHIgdWludDhfdCBrQ2h1
bmtOZWVkc1BhdGNoaW5nID0KKyAgICBTaGFyZWRNZW1vcnlBQkk6OkNodW5rSGVhZGVyOjprQ2h1
bmtOZWVkc1BhdGNoaW5nOworfSAgLy8gbmFtZXNwYWNlLgorCitjb25zdGV4cHIgc2l6ZV90IFRy
YWNlQnVmZmVyOjpDaHVua1JlY29yZDo6a01heFNpemU7Citjb25zdGV4cHIgc2l6ZV90IFRyYWNl
QnVmZmVyOjpJbmxpbmVDaHVua0hlYWRlclNpemUgPSBzaXplb2YoQ2h1bmtSZWNvcmQpOworCisv
LyBzdGF0aWMKK3N0ZDo6dW5pcXVlX3B0cjxUcmFjZUJ1ZmZlcj4gVHJhY2VCdWZmZXI6OkNyZWF0
ZShzaXplX3Qgc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBPdmVyd3JpdGVQb2xpY3kgcG9sKSB7CisgIHN0ZDo6dW5pcXVlX3B0
cjxUcmFjZUJ1ZmZlcj4gdHJhY2VfYnVmZmVyKG5ldyBUcmFjZUJ1ZmZlcihwb2wpKTsKKyAgaWYg
KCF0cmFjZV9idWZmZXItPkluaXRpYWxpemUoc2l6ZV9pbl9ieXRlcykpCisgICAgcmV0dXJuIG51
bGxwdHI7CisgIHJldHVybiB0cmFjZV9idWZmZXI7Cit9CisKK1RyYWNlQnVmZmVyOjpUcmFjZUJ1
ZmZlcihPdmVyd3JpdGVQb2xpY3kgcG9sKSA6IG92ZXJ3cml0ZV9wb2xpY3lfKHBvbCkgeworICAv
LyBTZWUgY29tbWVudHMgaW4gQ2h1bmtSZWNvcmQgZm9yIHRoZSByYXRpb25hbGUgb2YgdGhpcy4K
KyAgc3RhdGljX2Fzc2VydChzaXplb2YoQ2h1bmtSZWNvcmQpID09IHNpemVvZihTaGFyZWRNZW1v
cnlBQkk6OlBhZ2VIZWFkZXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzaXplb2YoU2hhcmVkTWVtb3J5QUJJOjpDaHVua0hlYWRlciksCisgICAgICAgICAg
ICAgICAgIkNodW5rUmVjb3JkIG91dCBvZiBzeW5jIHdpdGggdGhlIGxheW91dCBvZiBTaGFyZWRN
ZW1vcnlBQkkiKTsKK30KKworVHJhY2VCdWZmZXI6On5UcmFjZUJ1ZmZlcigpID0gZGVmYXVsdDsK
KworYm9vbCBUcmFjZUJ1ZmZlcjo6SW5pdGlhbGl6ZShzaXplX3Qgc2l6ZSkgeworICBzdGF0aWNf
YXNzZXJ0KAorICAgICAgYmFzZTo6a1BhZ2VTaXplICUgc2l6ZW9mKENodW5rUmVjb3JkKSA9PSAw
LAorICAgICAgInNpemVvZihDaHVua1JlY29yZCkgbXVzdCBiZSBhbiBpbnRlZ2VyIGRpdmlkZXIg
b2YgYSBwYWdlIHNpemUiKTsKKyAgUEVSRkVUVE9fQ0hFQ0soc2l6ZSAlIGJhc2U6OmtQYWdlU2l6
ZSA9PSAwKTsKKyAgZGF0YV8gPSBiYXNlOjpQYWdlZE1lbW9yeTo6QWxsb2NhdGUoCisgICAgICBz
aXplLCBiYXNlOjpQYWdlZE1lbW9yeTo6a01heUZhaWwgfCBiYXNlOjpQYWdlZE1lbW9yeTo6a0Rv
bnRDb21taXQpOworICBpZiAoIWRhdGFfLklzVmFsaWQoKSkgeworICAgIFBFUkZFVFRPX0VMT0co
IlRyYWNlIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAoc2l6ZTogJXp1KSIsIHNpemUpOworICAg
IHJldHVybiBmYWxzZTsKKyAgfQorICBzaXplXyA9IHNpemU7CisgIHN0YXRzXy5zZXRfYnVmZmVy
X3NpemUoc2l6ZSk7CisgIG1heF9jaHVua19zaXplXyA9IHN0ZDo6bWluKHNpemUsIENodW5rUmVj
b3JkOjprTWF4U2l6ZSk7CisgIHdwdHJfID0gYmVnaW4oKTsKKyAgaW5kZXhfLmNsZWFyKCk7Cisg
IGxhc3RfY2h1bmtfaWRfd3JpdHRlbl8uY2xlYXIoKTsKKyAgcmVhZF9pdGVyXyA9IEdldFJlYWRJ
dGVyRm9yU2VxdWVuY2UoaW5kZXhfLmVuZCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE5v
dGU6IHxzcmN8IHBvaW50cyB0byBhIHNobWVtIHJlZ2lvbiB0aGF0IGlzIHNoYXJlZCB3aXRoIHRo
ZSBwcm9kdWNlci4gQXNzdW1lCisvLyB0aGF0IHRoZSBwcm9kdWNlciBpcyBtYWxpY2lvdXMgYW5k
IHdpbGwgY2hhbmdlIHRoZSBjb250ZW50IG9mIHxzcmN8CisvLyB3aGlsZSB3ZSBleGVjdXRlIGhl
cmUuIERvbid0IGRvIGFueSBwcm9jZXNzaW5nIG9uIGl0IG90aGVyIHRoYW4gbWVtY3B5KCkuCit2
b2lkIFRyYWNlQnVmZmVyOjpDb3B5Q2h1bmtVbnRydXN0ZWQoUHJvZHVjZXJJRCBwcm9kdWNlcl9p
ZF90cnVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHBy
b2R1Y2VyX3VpZF90cnVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFdyaXRlcklEIHdyaXRlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBDaHVua0lEIGNodW5rX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHVpbnQxNl90IG51bV9mcmFnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdWludDhfdCBjaHVua19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBib29sIGNodW5rX2NvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICAvLyB8cmVjb3JkX3NpemV8ID0gfHNpemV8ICsg
c2l6ZW9mKENodW5rUmVjb3JkKSwgcm91bmRlZCB1cCB0byBhdm9pZCB0byBlbmQKKyAgLy8gdXAg
aW4gYSBmcmFnbWVudGVkIHN0YXRlIHdoZXJlIHNpemVfdG9fZW5kKCkgPCBzaXplb2YoQ2h1bmtS
ZWNvcmQpLgorICBjb25zdCBzaXplX3QgcmVjb3JkX3NpemUgPQorICAgICAgYmFzZTo6QWxpZ25V
cDxzaXplb2YoQ2h1bmtSZWNvcmQpPihzaXplICsgc2l6ZW9mKENodW5rUmVjb3JkKSk7CisgIGlm
IChQRVJGRVRUT19VTkxJS0VMWShyZWNvcmRfc2l6ZSA+IG1heF9jaHVua19zaXplXykpIHsKKyAg
ICBzdGF0c18uc2V0X2FiaV92aW9sYXRpb25zKHN0YXRzXy5hYmlfdmlvbGF0aW9ucygpICsgMSk7
CisgICAgUEVSRkVUVE9fRENIRUNLKHN1cHByZXNzX3Nhbml0eV9kY2hlY2tzX2Zvcl90ZXN0aW5n
Xyk7CisgICAgcmV0dXJuOworICB9CisKKyAgVFJBQ0VfQlVGRkVSX0RMT0coIkNvcHlDaHVuayBA
ICVsdSwgc2l6ZT0lenUiLCB3cHRyXyAtIGJlZ2luKCksIHJlY29yZF9zaXplKTsKKworI2lmIFBF
UkZFVFRPX0RDSEVDS19JU19PTigpCisgIGNoYW5nZWRfc2luY2VfbGFzdF9yZWFkXyA9IHRydWU7
CisjZW5kaWYKKworICAvLyBJZiB0aGUgY2h1bmsgaGFzbid0IGJlZW4gY29tcGxldGVkLCB3ZSBz
aG91bGQgb25seSBjb25zaWRlciB0aGUgZmlyc3QKKyAgLy8gfG51bV9mcmFnbWVudHMgLSAxfCBw
YWNrZXRzIGNvbXBsZXRlLiBGb3Igc2ltcGxpY2l0eSwgd2Ugc2ltcGx5IGRpc3JlZ2FyZAorICAv
LyB0aGUgbGFzdCBvbmUgd2hlbiB3ZSBjb3B5IHRoZSBjaHVuay4KKyAgaWYgKFBFUkZFVFRPX1VO
TElLRUxZKCFjaHVua19jb21wbGV0ZSkpIHsKKyAgICBpZiAobnVtX2ZyYWdtZW50cyA+IDApIHsK
KyAgICAgIG51bV9mcmFnbWVudHMtLTsKKyAgICAgIC8vIFRoZXNlIGZsYWdzIHNob3VsZCBvbmx5
IGFmZmVjdCB0aGUgbGFzdCBwYWNrZXQgaW4gdGhlIGNodW5rLiBXZSBjbGVhcgorICAgICAgLy8g
dGhlbSwgc28gdGhhdCBUcmFjZUJ1ZmZlciBpcyBhYmxlIHRvIGxvb2sgYXQgdGhlIHJlbWFpbmlu
ZyBwYWNrZXRzIGluCisgICAgICAvLyB0aGlzIGNodW5rLgorICAgICAgY2h1bmtfZmxhZ3MgJj0g
fmtMYXN0UGFja2V0Q29udGludWVzT25OZXh0Q2h1bms7CisgICAgICBjaHVua19mbGFncyAmPSB+
a0NodW5rTmVlZHNQYXRjaGluZzsKKyAgICB9CisgIH0KKworICBDaHVua1JlY29yZCByZWNvcmQo
cmVjb3JkX3NpemUpOworICByZWNvcmQucHJvZHVjZXJfaWQgPSBwcm9kdWNlcl9pZF90cnVzdGVk
OworICByZWNvcmQuY2h1bmtfaWQgPSBjaHVua19pZDsKKyAgcmVjb3JkLndyaXRlcl9pZCA9IHdy
aXRlcl9pZDsKKyAgcmVjb3JkLm51bV9mcmFnbWVudHMgPSBudW1fZnJhZ21lbnRzOworICByZWNv
cmQuZmxhZ3MgPSBjaHVua19mbGFnczsKKyAgQ2h1bmtNZXRhOjpLZXkga2V5KHJlY29yZCk7CisK
KyAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgY29waWVkIHRoZSBzYW1lIGNodW5r
IHByZXZpb3VzbHkuIFRoaXMgbWF5CisgIC8vIGhhcHBlbiBpZiB0aGUgc2VydmljZSBzY3JhcGVz
IGNodW5rcyBpbiBhIHBvdGVudGlhbGx5IGluY29tcGxldGUgc3RhdGUKKyAgLy8gYmVmb3JlIHJl
Y2VpdmluZyBjb21taXQgcmVxdWVzdHMgZm9yIHRoZW0gZnJvbSB0aGUgcHJvZHVjZXIuIE5vdGUg
dGhhdCB0aGUKKyAgLy8gc2VydmljZSBtYXkgc2NyYXBlIGFuZCB0aHVzIG92ZXJyaWRlIGNodW5r
cyBpbiBhcmJpdHJhcnkgb3JkZXIgc2luY2UgdGhlCisgIC8vIGNodW5rcyBhcmVuJ3Qgb3JkZXJl
ZCBpbiB0aGUgU01CLgorICBjb25zdCBhdXRvIGl0ID0gaW5kZXhfLmZpbmQoa2V5KTsKKyAgaWYg
KFBFUkZFVFRPX1VOTElLRUxZKGl0ICE9IGluZGV4Xy5lbmQoKSkpIHsKKyAgICBDaHVua01ldGEq
IHJlY29yZF9tZXRhID0gJml0LT5zZWNvbmQ7CisgICAgQ2h1bmtSZWNvcmQqIHByZXYgPSByZWNv
cmRfbWV0YS0+Y2h1bmtfcmVjb3JkOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG9sZCBjaHVu
aydzIG1ldGFkYXRhIGNvcnJlc3BvbmRzIHRvIHRoZSBuZXcgb25lLgorICAgIC8vIE92ZXJyaWRk
ZW4gY2h1bmtzIHNob3VsZCBuZXZlciBjaGFuZ2Ugc2l6ZSwgc2luY2UgdGhlIHBhZ2UgbGF5b3V0
IGlzCisgICAgLy8gZml4ZWQgcGVyIHdyaXRlci4gVGhlIG51bWJlciBvZiBmcmFnbWVudHMgc2hv
dWxkIGFsc28gbmV2ZXIgZGVjcmVhc2UgYW5kCisgICAgLy8gZmxhZ3Mgc2hvdWxkIG5vdCBiZSBy
ZW1vdmVkLgorICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWShDaHVua01ldGE6OktleSgqcHJldikg
IT0ga2V5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnNpemUgIT0gcmVjb3Jk
X3NpemUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+bnVtX2ZyYWdtZW50cyA+
IG51bV9mcmFnbWVudHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXYtPmZsYWdz
ICYgY2h1bmtfZmxhZ3MpICE9IHByZXYtPmZsYWdzKSkgeworICAgICAgc3RhdHNfLnNldF9hYmlf
dmlvbGF0aW9ucyhzdGF0c18uYWJpX3Zpb2xhdGlvbnMoKSArIDEpOworICAgICAgUEVSRkVUVE9f
RENIRUNLKHN1cHByZXNzX3Nhbml0eV9kY2hlY2tzX2Zvcl90ZXN0aW5nXyk7CisgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzdGFydGVkIHJlYWRpbmcgZnJv
bSBjaHVuayBOKzEgZm9sbG93aW5nIHRoaXMgY2h1bmsgTiwKKyAgICAvLyBkb24ndCBvdmVycmlk
ZSBjaHVuayBOLiBPdGhlcndpc2Ugd2UgbWF5IGVuZCB1cCByZWFkaW5nIGEgcGFja2V0IGZyb20K
KyAgICAvLyBjaHVuayBOIGFmdGVyIGhhdmluZyByZWFkIGZyb20gY2h1bmsgTisxLCB0aGVyZWJ5
IHZpb2xhdGluZyBzZXF1ZW50aWFsCisgICAgLy8gcmVhZCBvZiBwYWNrZXRzLiBUaGlzIHNob3Vs
ZG4ndCBoYXBwZW4gaWYgdGhlIHByb2R1Y2VyIGlzIHdlbGwtYmVoYXZlZCwKKyAgICAvLyBiZWNh
dXNlIGl0IHNob3VsZG4ndCBzdGFydCBjaHVuayBOKzEgYmVmb3JlIGNvbXBsZXRpbmcgY2h1bmsg
Ti4KKyAgICBDaHVua01ldGE6OktleSBzdWJzZXF1ZW50X2tleSA9IGtleTsKKyAgICBzdGF0aWNf
YXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8Q2h1bmtJRD46Om1heCgpID09IGtNYXhDaHVua0lE
LAorICAgICAgICAgICAgICAgICAgIkNodW5rSUQgd3JhcHMiKTsKKyAgICBzdWJzZXF1ZW50X2tl
eS5jaHVua19pZCsrOworICAgIGNvbnN0IGF1dG8gc3Vic2VxdWVudF9pdCA9IGluZGV4Xy5maW5k
KHN1YnNlcXVlbnRfa2V5KTsKKyAgICBpZiAoc3Vic2VxdWVudF9pdCAhPSBpbmRleF8uZW5kKCkg
JiYKKyAgICAgICAgc3Vic2VxdWVudF9pdC0+c2Vjb25kLm51bV9mcmFnbWVudHNfcmVhZCA+IDAp
IHsKKyAgICAgIHN0YXRzXy5zZXRfYWJpX3Zpb2xhdGlvbnMoc3RhdHNfLmFiaV92aW9sYXRpb25z
KCkgKyAxKTsKKyAgICAgIFBFUkZFVFRPX0RDSEVDSyhzdXBwcmVzc19zYW5pdHlfZGNoZWNrc19m
b3JfdGVzdGluZ18pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHRoaXMgY2h1
bmsgd2FzIHByZXZpb3VzbHkgY29waWVkIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGZyYWdtZW50
cyBhbmQKKyAgICAvLyB0aGUgbnVtYmVyIGRpZG4ndCBjaGFuZ2UsIHRoZXJlJ3Mgbm8gbmVlZCB0
byBjb3B5IGl0IGFnYWluLiBJZiB0aGUKKyAgICAvLyBwcmV2aW91cyBjaHVuayB3YXMgY29tcGxl
dGUgYWxyZWFkeSwgdGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlLgorICAgIFBFUkZFVFRP
X0RDSEVDSyhzdXBwcmVzc19zYW5pdHlfZGNoZWNrc19mb3JfdGVzdGluZ18gfHwKKyAgICAgICAg
ICAgICAgICAgICAgIXJlY29yZF9tZXRhLT5pc19jb21wbGV0ZSgpIHx8CisgICAgICAgICAgICAg
ICAgICAgIChjaHVua19jb21wbGV0ZSAmJiBwcmV2LT5udW1fZnJhZ21lbnRzID09IG51bV9mcmFn
bWVudHMpKTsKKyAgICBpZiAocHJldi0+bnVtX2ZyYWdtZW50cyA9PSBudW1fZnJhZ21lbnRzKSB7
CisgICAgICBUUkFDRV9CVUZGRVJfRExPRygiICBza2lwcGluZyByZWNvbW1pdCBvZiBpZGVudGlj
YWwgY2h1bmsiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSBzaG91bGQgbm90
IGhhdmUgcmVhZCBwYXN0IHRoZSBsYXN0IHBhY2tldC4KKyAgICBpZiAocmVjb3JkX21ldGEtPm51
bV9mcmFnbWVudHNfcmVhZCA+IHByZXYtPm51bV9mcmFnbWVudHMpIHsKKyAgICAgIFBFUkZFVFRP
X0VMT0coCisgICAgICAgICAgIlRyYWNlQnVmZmVyIHJlYWQgdG9vIG1hbnkgZnJhZ21lbnRzIGZy
b20gYW4gaW5jb21wbGV0ZSBjaHVuayIpOworICAgICAgUEVSRkVUVE9fRENIRUNLKHN1cHByZXNz
X3Nhbml0eV9kY2hlY2tzX2Zvcl90ZXN0aW5nXyk7CisgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgdWludDhfdCogd3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHByZXYpOworICAg
IFRSQUNFX0JVRkZFUl9ETE9HKCIgIG92ZXJyaWRpbmcgY2h1bmsgQCAlbHUsIHNpemU9JXp1Iiwg
d3B0ciAtIGJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkX3NpemUpOworCisg
ICAgLy8gVXBkYXRlIGNodW5rIG1ldGEgZGF0YSBzdG9yZWQgaW4gdGhlIGluZGV4LCBhcyBpdCBt
YXkgaGF2ZSBjaGFuZ2VkLgorICAgIHJlY29yZF9tZXRhLT5udW1fZnJhZ21lbnRzID0gbnVtX2Zy
YWdtZW50czsKKyAgICByZWNvcmRfbWV0YS0+ZmxhZ3MgPSBjaHVua19mbGFnczsKKyAgICByZWNv
cmRfbWV0YS0+c2V0X2NvbXBsZXRlKGNodW5rX2NvbXBsZXRlKTsKKworICAgIC8vIE92ZXJyaWRl
IHRoZSBDaHVua1JlY29yZCBjb250ZW50cyBhdCB0aGUgb3JpZ2luYWwgfHdwdHJ8LgorICAgIFRS
QUNFX0JVRkZFUl9ETE9HKCIgIGNvcHlpbmcgQCBbJWx1IC0gJWx1XSAlenUiLCB3cHRyIC0gYmVn
aW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3Qod3B0ciAtIGJlZ2luKCkpICsg
cmVjb3JkX3NpemUsIHJlY29yZF9zaXplKTsKKyAgICBXcml0ZUNodW5rUmVjb3JkKHdwdHIsIHJl
Y29yZCwgc3JjLCBzaXplKTsKKyAgICBUUkFDRV9CVUZGRVJfRExPRygiQ2h1bmsgcmF3OiAlcyIs
IEhleER1bXAod3B0ciwgcmVjb3JkX3NpemUpLmNfc3RyKCkpOworICAgIHN0YXRzXy5zZXRfY2h1
bmtzX3Jld3JpdHRlbihzdGF0c18uY2h1bmtzX3Jld3JpdHRlbigpICsgMSk7CisgICAgcmV0dXJu
OworICB9CisKKyAgaWYgKFBFUkZFVFRPX1VOTElLRUxZKGRpc2NhcmRfd3JpdGVzXykpCisgICAg
cmV0dXJuIERpc2NhcmRXcml0ZSgpOworCisgIC8vIElmIHRoZXJlIGlzbid0IGVub3VnaCByb29t
IGZyb20gdGhlIGdpdmVuIHdyaXRlIHBvc2l0aW9uLiBXcml0ZSBhIHBhZGRpbmcKKyAgLy8gcmVj
b3JkIHRvIGNsZWFyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBhbmQgd3JhcCBiYWNrLgorICBjb25z
dCBzaXplX3QgY2FjaGVkX3NpemVfdG9fZW5kID0gc2l6ZV90b19lbmQoKTsKKyAgaWYgKFBFUkZF
VFRPX1VOTElLRUxZKHJlY29yZF9zaXplID4gY2FjaGVkX3NpemVfdG9fZW5kKSkgeworICAgIHNz
aXplX3QgcmVzID0gRGVsZXRlTmV4dENodW5rc0ZvcihjYWNoZWRfc2l6ZV90b19lbmQpOworICAg
IGlmIChyZXMgPT0gLTEpCisgICAgICByZXR1cm4gRGlzY2FyZFdyaXRlKCk7CisgICAgUEVSRkVU
VE9fRENIRUNLKHN0YXRpY19jYXN0PHNpemVfdD4ocmVzKSA8PSBjYWNoZWRfc2l6ZV90b19lbmQp
OworICAgIEFkZFBhZGRpbmdSZWNvcmQoY2FjaGVkX3NpemVfdG9fZW5kKTsKKyAgICB3cHRyXyA9
IGJlZ2luKCk7CisgICAgc3RhdHNfLnNldF93cml0ZV93cmFwX2NvdW50KHN0YXRzXy53cml0ZV93
cmFwX2NvdW50KCkgKyAxKTsKKyAgICBQRVJGRVRUT19EQ0hFQ0soc2l6ZV90b19lbmQoKSA+PSBy
ZWNvcmRfc2l6ZSk7CisgIH0KKworICAvLyBBdCB0aGlzIHBvaW50IGVpdGhlciB8d3B0cl98IHBv
aW50cyB0byBhbiB1bnRvdWNoZWQgcGFydCBvZiB0aGUgYnVmZmVyCisgIC8vIChpLmUuICp3cHRy
XyA9PSAwKSBvciB3ZSBhcmUgYWJvdXQgdG8gb3ZlcndyaXRlIG9uZSBvciBtb3JlIENodW5rUmVj
b3JkKHMpLgorICAvLyBJbiB0aGUgbGF0dGVyIGNhc2Ugd2UgbmVlZCB0byBmaXJzdCBmaWd1cmUg
b3V0IHdoZXJlIHRoZSBuZXh0IHZhbGlkCisgIC8vIENodW5rUmVjb3JkIGlzIChpZiBpdCBleGlz
dHMpIGFuZCBhZGQgcGFkZGluZyBiZXR3ZWVuIHRoZSBuZXcgcmVjb3JkLgorICAvLyBFeGFtcGxl
ICgodykgPT0gd3JpdGUgY3Vyc29yKToKKyAgLy8KKyAgLy8gSW5pdGlhbCBzdGF0ZSAod3Rwcl8g
PT0gMCk6CisgIC8vIHwwICh3KSAgICB8MTAgICAgICAgICAgICAgICB8MzAgICAgICAgICAgICAg
ICAgICB8NTAKKyAgLy8gKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t
LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgLy8gfCBDaHVuayAxIHwgQ2h1bmsgMiAg
ICAgICAgIHwgQ2h1bmsgMyAgICAgICAgICAgIHwgQ2h1bmsgNCAgICAgICAgICAgIHwKKyAgLy8g
Ky0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t
LS0tLS0tLS0tLS0tLSsKKyAgLy8KKyAgLy8gTGV0J3MgYXNzdW1lIHdlIG5vdyB3YW50IG5vdyB3
cml0ZSBhIDV0aCBDaHVuayBvZiBzaXplID09IDM1LiBUaGUgZmluYWwKKyAgLy8gc3RhdGUgc2hv
dWxkIGxvb2sgbGlrZSB0aGlzOgorICAvLyB8MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfDM1ICh3KSAgICAgICAgIHw1MAorICAvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgLy8gfCBDaHVu
ayA1ICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGFkZGluZyBDaHVuayB8IENodW5rIDQgICAg
ICAgICAgICB8CisgIC8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t
LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgIC8vIERlbGV0ZXMgYWxsIGNodW5r
cyBmcm9tIHx3cHRyX3wgdG8gfHdwdHJffCArIHxyZWNvcmRfc2l6ZXwuCisgIHNzaXplX3QgZGVs
X3JlcyA9IERlbGV0ZU5leHRDaHVua3NGb3IocmVjb3JkX3NpemUpOworICBpZiAoZGVsX3JlcyA9
PSAtMSkKKyAgICByZXR1cm4gRGlzY2FyZFdyaXRlKCk7CisgIHNpemVfdCBwYWRkaW5nX3NpemUg
PSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRlbF9yZXMpOworCisgIC8vIE5vdyBmaXJzdCBpbnNlcnQg
dGhlIG5ldyBjaHVuay4gQXQgdGhlIGVuZCwgaWYgbmVjZXNzYXJ5LCBhZGQgdGhlIHBhZGRpbmcu
CisgIHN0YXRzXy5zZXRfY2h1bmtzX3dyaXR0ZW4oc3RhdHNfLmNodW5rc193cml0dGVuKCkgKyAx
KTsKKyAgc3RhdHNfLnNldF9ieXRlc193cml0dGVuKHN0YXRzXy5ieXRlc193cml0dGVuKCkgKyBy
ZWNvcmRfc2l6ZSk7CisgIGF1dG8gaXRfYW5kX2luc2VydGVkID0gaW5kZXhfLmVtcGxhY2UoCisg
ICAgICBrZXksIENodW5rTWV0YShHZXRDaHVua1JlY29yZEF0KHdwdHJfKSwgbnVtX2ZyYWdtZW50
cywgY2h1bmtfY29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICBjaHVua19mbGFncywgcHJv
ZHVjZXJfdWlkX3RydXN0ZWQpKTsKKyAgUEVSRkVUVE9fRENIRUNLKGl0X2FuZF9pbnNlcnRlZC5z
ZWNvbmQpOworICBUUkFDRV9CVUZGRVJfRExPRygiICBjb3B5aW5nIEAgWyVsdSAtICVsdV0gJXp1
Iiwgd3B0cl8gLSBiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3Qod3B0cl8g
LSBiZWdpbigpKSArIHJlY29yZF9zaXplLCByZWNvcmRfc2l6ZSk7CisgIFdyaXRlQ2h1bmtSZWNv
cmQod3B0cl8sIHJlY29yZCwgc3JjLCBzaXplKTsKKyAgVFJBQ0VfQlVGRkVSX0RMT0coIkNodW5r
IHJhdzogJXMiLCBIZXhEdW1wKHdwdHJfLCByZWNvcmRfc2l6ZSkuY19zdHIoKSk7CisgIHdwdHJf
ICs9IHJlY29yZF9zaXplOworICBpZiAod3B0cl8gPj0gZW5kKCkpIHsKKyAgICBQRVJGRVRUT19E
Q0hFQ0socGFkZGluZ19zaXplID09IDApOworICAgIHdwdHJfID0gYmVnaW4oKTsKKyAgICBzdGF0
c18uc2V0X3dyaXRlX3dyYXBfY291bnQoc3RhdHNfLndyaXRlX3dyYXBfY291bnQoKSArIDEpOwor
ICB9CisgIERjaGVja0lzQWxpZ25lZEFuZFdpdGhpbkJvdW5kcyh3cHRyXyk7CisKKyAgLy8gQ2h1
bmtzIG1heSBiZSByZWNlaXZlZCBvdXQgb2Ygb3JkZXIsIHNvIG9ubHkgdXBkYXRlIGxhc3RfY2h1
bmtfaWQgaWYgdGhlCisgIC8vIG5ldyBjaHVua19pZCBpcyBsYXJnZXIuIEJ1dCB0YWtlIGludG8g
YWNjb3VudCBvdmVyZmxvd3MgYnkgb25seSBzZWxlY3RpbmcKKyAgLy8gdGhlIG5ldyBJRCBpZiBp
dHMgZGlzdGFuY2UgdG8gdGhlIGxhdGVzdCBJRCBpcyBzbWFsbGVyIHRoYW4gaGFsZiB0aGUgbnVt
YmVyCisgIC8vIHNwYWNlLgorICAvLworICAvLyBUaGlzIGFjY291bnRzIGZvciBib3RoIHRoZSBj
YXNlIHdoZXJlIHRoZSBuZXcgSUQgaGFzIGp1c3Qgb3ZlcmZsb3duIGFuZAorICAvLyBsYXN0X2No
dW5rX2lkIGJlIHVwZGF0ZWQgZXZlbiB0aG91Z2ggaXQncyBzbWFsbGVyIChlLmcuIHxjaHVua19p
ZHwgPSAxIGFuZAorICAvLyB8bGFzdF9jaHVua19pZHwgPSBrTWF4Q2h1bmtJZDsgY2h1bmtfaWQg
LSBsYXN0X2NodW5rX2lkID0gMCkgYW5kIHRoZSBjYXNlCisgIC8vIHdoZXJlIHRoZSBuZXcgSUQg
aXMgYW4gb3V0LW9mLW9yZGVyIElEIHJpZ2h0IGFmdGVyIGFuIG92ZXJmbG93IGFuZAorICAvLyBs
YXN0X2NodW5rX2lkIHNob3VsZG4ndCBiZSB1cGRhdGVkIGV2ZW4gdGhvdWdoIGl0J3MgbGFyZ2Vy
IChlLmcuIHxjaHVua19pZHwKKyAgLy8gPSBrTWF4Q2h1bmtJZCBhbmQgfGxhc3RfY2h1bmtfaWR8
ID0gMTsgY2h1bmtfaWQgLSBsYXN0X2NodW5rX2lkID0KKyAgLy8ga01heENodW5rSWQgLSAxKS4K
KyAgYXV0byBwcm9kdWNlcl9hbmRfd3JpdGVyX2lkID0gc3RkOjptYWtlX3BhaXIocHJvZHVjZXJf
aWRfdHJ1c3RlZCwgd3JpdGVyX2lkKTsKKyAgQ2h1bmtJRCYgbGFzdF9jaHVua19pZCA9IGxhc3Rf
Y2h1bmtfaWRfd3JpdHRlbl9bcHJvZHVjZXJfYW5kX3dyaXRlcl9pZF07CisgIHN0YXRpY19hc3Nl
cnQoc3RkOjpudW1lcmljX2xpbWl0czxDaHVua0lEPjo6bWF4KCkgPT0ga01heENodW5rSUQsCisg
ICAgICAgICAgICAgICAgIlRoaXMgY29kZSBhc3N1bWVzIHRoYXQgQ2h1bmtJRCB3cmFwcyBhdCBr
TWF4Q2h1bmtJRCIpOworICBpZiAoY2h1bmtfaWQgLSBsYXN0X2NodW5rX2lkIDwga01heENodW5r
SUQgLyAyKSB7CisgICAgbGFzdF9jaHVua19pZCA9IGNodW5rX2lkOworICB9IGVsc2UgeworICAg
IHN0YXRzXy5zZXRfY2h1bmtzX2NvbW1pdHRlZF9vdXRfb2Zfb3JkZXIoCisgICAgICAgIHN0YXRz
Xy5jaHVua3NfY29tbWl0dGVkX291dF9vZl9vcmRlcigpICsgMSk7CisgIH0KKworICBpZiAocGFk
ZGluZ19zaXplKQorICAgIEFkZFBhZGRpbmdSZWNvcmQocGFkZGluZ19zaXplKTsKK30KKworc3Np
emVfdCBUcmFjZUJ1ZmZlcjo6RGVsZXRlTmV4dENodW5rc0ZvcihzaXplX3QgYnl0ZXNfdG9fY2xl
YXIpIHsKKyAgUEVSRkVUVE9fQ0hFQ0soIWRpc2NhcmRfd3JpdGVzXyk7CisKKyAgLy8gRmluZCB0
aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNodW5rIHdoaWNoIGJlZ2lucyBhdCBvciBhZnRlcgor
ICAvLyAofHdwdHJffCArIHxieXRlc3wpLiBOb3RlIHRoYXQgc3VjaCBhIGNodW5rIG1pZ2h0IG5v
dCBleGlzdCBhbmQgd2UgbWlnaHQKKyAgLy8gZWl0aGVyIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGJ1
ZmZlciBvciBhIHplcm9lZCByZWdpb24gb2YgdGhlIGJ1ZmZlci4KKyAgdWludDhfdCogbmV4dF9j
aHVua19wdHIgPSB3cHRyXzsKKyAgdWludDhfdCogc2VhcmNoX2VuZCA9IHdwdHJfICsgYnl0ZXNf
dG9fY2xlYXI7CisgIFRSQUNFX0JVRkZFUl9ETE9HKCJEZWxldGUgWyV6dSAlenVdIiwgd3B0cl8g
LSBiZWdpbigpLCBzZWFyY2hfZW5kIC0gYmVnaW4oKSk7CisgIERjaGVja0lzQWxpZ25lZEFuZFdp
dGhpbkJvdW5kcyh3cHRyXyk7CisgIFBFUkZFVFRPX0RDSEVDSyhzZWFyY2hfZW5kIDw9IGVuZCgp
KTsKKyAgc3RkOjp2ZWN0b3I8Q2h1bmtNYXA6Oml0ZXJhdG9yPiBpbmRleF9kZWxldGU7CisgIHVp
bnQ2NF90IGNodW5rc19vdmVyd3JpdHRlbiA9IHN0YXRzXy5jaHVua3Nfb3ZlcndyaXR0ZW4oKTsK
KyAgdWludDY0X3QgYnl0ZXNfb3ZlcndyaXR0ZW4gPSBzdGF0c18uYnl0ZXNfb3ZlcndyaXR0ZW4o
KTsKKyAgdWludDY0X3QgcGFkZGluZ19ieXRlc19jbGVhcmVkID0gc3RhdHNfLnBhZGRpbmdfYnl0
ZXNfY2xlYXJlZCgpOworICB3aGlsZSAobmV4dF9jaHVua19wdHIgPCBzZWFyY2hfZW5kKSB7Cisg
ICAgY29uc3QgQ2h1bmtSZWNvcmQmIG5leHRfY2h1bmsgPSAqR2V0Q2h1bmtSZWNvcmRBdChuZXh0
X2NodW5rX3B0cik7CisgICAgVFJBQ0VfQlVGRkVSX0RMT0coCisgICAgICAgICIgIHNjYW5uaW5n
IGNodW5rIFslenUgJXp1XSAodmFsaWQ9JWQpIiwgbmV4dF9jaHVua19wdHIgLSBiZWdpbigpLAor
ICAgICAgICBuZXh0X2NodW5rX3B0ciAtIGJlZ2luKCkgKyBuZXh0X2NodW5rLnNpemUsIG5leHRf
Y2h1bmsuaXNfdmFsaWQoKSk7CisKKyAgICAvLyBXZSBqdXN0IHJlYWNoZWQgdGhlIHVudG91Y2hl
ZCBwYXJ0IG9mIHRoZSBidWZmZXIsIGl0J3MgZ29pbmcgdG8gYmUgYWxsCisgICAgLy8gemVyb2Vz
IGZyb20gaGVyZSB0byBlbmQoKS4KKyAgICAvLyBPcHRpbWl6YXRpb246IGlmIGR1cmluZyBJbml0
aWFsaXplKCkgd2UgZmlsbCB0aGUgYnVmZmVyIHdpdGggcGFkZGluZworICAgIC8vIHJlY29yZHMg
d2UgY291bGQgZ2V0IHJpZCBvZiB0aGlzIGJyYW5jaC4KKyAgICBpZiAoUEVSRkVUVE9fVU5MSUtF
TFkoIW5leHRfY2h1bmsuaXNfdmFsaWQoKSkpIHsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBl
biBvbmx5IGF0IHRoZSBmaXJzdCBpdGVyYXRpb24uIFRoZSB6ZXJvZWQgYXJlYSBjYW4KKyAgICAg
IC8vIG9ubHkgYmVnaW4gcHJlY2lzZWx5IGF0IHRoZSB8d3B0cl98LCBub3QgYWZ0ZXIuIE90aGVy
d2lzZSBpdCBtZWFucyB0aGF0CisgICAgICAvLyB3ZSB3cmFwcGVkIGJ1dCBzY3Jld2VkIHVwIHRo
ZSBDaHVua1JlY29yZCBjaGFpbi4KKyAgICAgIFBFUkZFVFRPX0RDSEVDSyhuZXh0X2NodW5rX3B0
ciA9PSB3cHRyXyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgfG5l
eHRfY2h1bmt8IGZyb20gdGhlIGluZGV4LCB1bmxlc3MgaXQncyBhIHBhZGRpbmcgcmVjb3JkIChw
YWRkaW5nCisgICAgLy8gcmVjb3JkcyBhcmUgbm90IHBhcnQgb2YgdGhlIGluZGV4KS4KKyAgICBp
ZiAoUEVSRkVUVE9fTElLRUxZKCFuZXh0X2NodW5rLmlzX3BhZGRpbmcpKSB7CisgICAgICBDaHVu
a01ldGE6OktleSBrZXkobmV4dF9jaHVuayk7CisgICAgICBhdXRvIGl0ID0gaW5kZXhfLmZpbmQo
a2V5KTsKKyAgICAgIGJvb2wgd2lsbF9yZW1vdmUgPSBmYWxzZTsKKyAgICAgIGlmIChQRVJGRVRU
T19MSUtFTFkoaXQgIT0gaW5kZXhfLmVuZCgpKSkgeworICAgICAgICBjb25zdCBDaHVua01ldGEm
IG1ldGEgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkobWV0YS5u
dW1fZnJhZ21lbnRzX3JlYWQgPCBtZXRhLm51bV9mcmFnbWVudHMpKSB7CisgICAgICAgICAgaWYg
KG92ZXJ3cml0ZV9wb2xpY3lfID09IGtEaXNjYXJkKQorICAgICAgICAgICAgcmV0dXJuIC0xOwor
ICAgICAgICAgIGNodW5rc19vdmVyd3JpdHRlbisrOworICAgICAgICAgIGJ5dGVzX292ZXJ3cml0
dGVuICs9IG5leHRfY2h1bmsuc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRleF9kZWxldGUu
cHVzaF9iYWNrKGl0KTsKKyAgICAgICAgd2lsbF9yZW1vdmUgPSB0cnVlOworICAgICAgfQorICAg
ICAgVFJBQ0VfQlVGRkVSX0RMT0coCisgICAgICAgICAgIiAgZGVsIGluZGV4IHslIiBQUkl1MzIg
IiwlIiBQUkl1MzIgIiwldX0gQCBbJWx1IC0gJWx1XSAlZCIsCisgICAgICAgICAga2V5LnByb2R1
Y2VyX2lkLCBrZXkud3JpdGVyX2lkLCBrZXkuY2h1bmtfaWQsCisgICAgICAgICAgbmV4dF9jaHVu
a19wdHIgLSBiZWdpbigpLCBuZXh0X2NodW5rX3B0ciAtIGJlZ2luKCkgKyBuZXh0X2NodW5rLnNp
emUsCisgICAgICAgICAgd2lsbF9yZW1vdmUpOworICAgICAgUEVSRkVUVE9fRENIRUNLKHdpbGxf
cmVtb3ZlKTsKKyAgICB9IGVsc2UgeworICAgICAgcGFkZGluZ19ieXRlc19jbGVhcmVkICs9IG5l
eHRfY2h1bmsuc2l6ZTsKKyAgICB9CisKKyAgICBuZXh0X2NodW5rX3B0ciArPSBuZXh0X2NodW5r
LnNpemU7CisKKyAgICAvLyBXZSBzaG91bGQgbmV2ZXIgaGl0IHRoaXMsIHVubGVzcyB3ZSBtYW5h
Z2VkIHRvIHNjcmV3IHVwIHdoaWxlIHdyaXRpbmcKKyAgICAvLyB0byB0aGUgYnVmZmVyIGFuZCBi
cmVha2luZyB0aGUgQ2h1bmtSZWNvcmQocykgY2hhaW4uCisgICAgLy8gVE9ETyhwcmltaWFubyk6
IFdyaXRlIG1vcmUgbWVhbmluZ2Z1bCBsb2dnaW5nIHdpdGggdGhlIHN0YXR1cyBvZiB0aGUKKyAg
ICAvLyBidWZmZXIsIHRvIGdldCBtb3JlIGFjdGlvbmFibGUgYnVncyBpbiBjYXNlIHdlIGhpdCB0
aGlzLgorICAgIFBFUkZFVFRPX0NIRUNLKG5leHRfY2h1bmtfcHRyIDw9IGVuZCgpKTsKKyAgfQor
CisgIC8vIFJlbW92ZSBmcm9tIHRoZSBpbmRleC4KKyAgZm9yIChhdXRvIGl0IDogaW5kZXhfZGVs
ZXRlKSB7CisgICAgaW5kZXhfLmVyYXNlKGl0KTsKKyAgfQorICBzdGF0c18uc2V0X2NodW5rc19v
dmVyd3JpdHRlbihjaHVua3Nfb3ZlcndyaXR0ZW4pOworICBzdGF0c18uc2V0X2J5dGVzX292ZXJ3
cml0dGVuKGJ5dGVzX292ZXJ3cml0dGVuKTsKKyAgc3RhdHNfLnNldF9wYWRkaW5nX2J5dGVzX2Ns
ZWFyZWQocGFkZGluZ19ieXRlc19jbGVhcmVkKTsKKworICBQRVJGRVRUT19EQ0hFQ0sobmV4dF9j
aHVua19wdHIgPj0gc2VhcmNoX2VuZCAmJiBuZXh0X2NodW5rX3B0ciA8PSBlbmQoKSk7CisgIHJl
dHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihuZXh0X2NodW5rX3B0ciAtIHNlYXJjaF9lbmQpOwor
fQorCit2b2lkIFRyYWNlQnVmZmVyOjpBZGRQYWRkaW5nUmVjb3JkKHNpemVfdCBzaXplKSB7Cisg
IFBFUkZFVFRPX0RDSEVDSyhzaXplID49IHNpemVvZihDaHVua1JlY29yZCkgJiYgc2l6ZSA8PSBD
aHVua1JlY29yZDo6a01heFNpemUpOworICBDaHVua1JlY29yZCByZWNvcmQoc2l6ZSk7CisgIHJl
Y29yZC5pc19wYWRkaW5nID0gMTsKKyAgVFJBQ0VfQlVGRkVSX0RMT0coIkFkZFBhZGRpbmdSZWNv
cmQgQCBbJWx1IC0gJWx1XSAlenUiLCB3cHRyXyAtIGJlZ2luKCksCisgICAgICAgICAgICAgICAg
ICAgIHVpbnRwdHJfdCh3cHRyXyAtIGJlZ2luKCkpICsgc2l6ZSwgc2l6ZSk7CisgIFdyaXRlQ2h1
bmtSZWNvcmQod3B0cl8sIHJlY29yZCwgbnVsbHB0ciwgc2l6ZSAtIHNpemVvZihDaHVua1JlY29y
ZCkpOworICBzdGF0c18uc2V0X3BhZGRpbmdfYnl0ZXNfd3JpdHRlbihzdGF0c18ucGFkZGluZ19i
eXRlc193cml0dGVuKCkgKyBzaXplKTsKKyAgLy8gfHdwdHJffCBpcyBkZWxpYmVyYXRlbHkgbm90
IGFkdmFuY2VkIHdoZW4gd3JpdGluZyBhIHBhZGRpbmcgcmVjb3JkLgorfQorCitib29sIFRyYWNl
QnVmZmVyOjpUcnlQYXRjaENodW5rQ29udGVudHMoUHJvZHVjZXJJRCBwcm9kdWNlcl9pZCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZXJJRCB3cml0ZXJfaWQs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtJRCBjaHVua19p
ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRjaCog
cGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qg
cGF0Y2hlc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgb3RoZXJfcGF0Y2hlc19wZW5kaW5nKSB7CisgIENodW5rTWV0YTo6S2V5IGtleShwcm9kdWNl
cl9pZCwgd3JpdGVyX2lkLCBjaHVua19pZCk7CisgIGF1dG8gaXQgPSBpbmRleF8uZmluZChrZXkp
OworICBpZiAoaXQgPT0gaW5kZXhfLmVuZCgpKSB7CisgICAgc3RhdHNfLnNldF9wYXRjaGVzX2Zh
aWxlZChzdGF0c18ucGF0Y2hlc19mYWlsZWQoKSArIDEpOworICAgIHJldHVybiBmYWxzZTsKKyAg
fQorICBDaHVua01ldGEmIGNodW5rX21ldGEgPSBpdC0+c2Vjb25kOworCisgIC8vIENoZWNrIHRo
YXQgdGhlIGluZGV4IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgYWN0dWFsIFByb2R1Y2VySUQvV3Jp
dGVySUQKKyAgLy8gc3RvcmVkIGluIHRoZSBDaHVua1JlY29yZC4KKyAgUEVSRkVUVE9fRENIRUNL
KENodW5rTWV0YTo6S2V5KCpjaHVua19tZXRhLmNodW5rX3JlY29yZCkgPT0ga2V5KTsKKyAgdWlu
dDhfdCogY2h1bmtfYmVnaW4gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjaHVua19tZXRh
LmNodW5rX3JlY29yZCk7CisgIFBFUkZFVFRPX0RDSEVDSyhjaHVua19iZWdpbiA+PSBiZWdpbigp
KTsKKyAgdWludDhfdCogY2h1bmtfZW5kID0gY2h1bmtfYmVnaW4gKyBjaHVua19tZXRhLmNodW5r
X3JlY29yZC0+c2l6ZTsKKyAgUEVSRkVUVE9fRENIRUNLKGNodW5rX2VuZCA8PSBlbmQoKSk7CisK
KyAgc3RhdGljX2Fzc2VydChQYXRjaDo6a1NpemUgPT0gU2hhcmVkTWVtb3J5QUJJOjprUGFja2V0
SGVhZGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAiUGF0Y2g6OmtTaXplIG91dCBvZiBzeW5jIHdp
dGggU2hhcmVkTWVtb3J5QUJJIik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaGVz
X3NpemU7IGkrKykgeworICAgIHVpbnQ4X3QqIHB0ciA9CisgICAgICAgIGNodW5rX2JlZ2luICsg
c2l6ZW9mKENodW5rUmVjb3JkKSArIHBhdGNoZXNbaV0ub2Zmc2V0X3VudHJ1c3RlZDsKKyAgICBU
UkFDRV9CVUZGRVJfRExPRygiUGF0Y2hDaHVuayB7JSIgUFJJdTMyICIsJSIgUFJJdTMyCisgICAg
ICAgICAgICAgICAgICAgICAgIiwldX0gc2l6ZT0lenUgQCAlenUgd2l0aCB7JTAyeCAlMDJ4ICUw
MnggJTAyeH0gY3VyICIKKyAgICAgICAgICAgICAgICAgICAgICAieyUwMnggJTAyeCAlMDJ4ICUw
Mnh9IiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9pZCwgd3JpdGVyX2lkLCBjaHVu
a19pZCwgY2h1bmtfZW5kIC0gY2h1bmtfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgcGF0
Y2hlc1tpXS5vZmZzZXRfdW50cnVzdGVkLCBwYXRjaGVzW2ldLmRhdGFbMF0sCisgICAgICAgICAg
ICAgICAgICAgICAgcGF0Y2hlc1tpXS5kYXRhWzFdLCBwYXRjaGVzW2ldLmRhdGFbMl0sCisgICAg
ICAgICAgICAgICAgICAgICAgcGF0Y2hlc1tpXS5kYXRhWzNdLCBwdHJbMF0sIHB0clsxXSwgcHRy
WzJdLCBwdHJbM10pOworICAgIGlmIChwdHIgPCBjaHVua19iZWdpbiArIHNpemVvZihDaHVua1Jl
Y29yZCkgfHwKKyAgICAgICAgcHRyID4gY2h1bmtfZW5kIC0gUGF0Y2g6OmtTaXplKSB7CisgICAg
ICAvLyBFaXRoZXIgdGhlIElQQyB3YXMgc28gc2xvdyBhbmQgaW4gdGhlIG1lYW50aW1lIHRoZSB3
cml0ZXIgbWFuYWdlZCB0bworICAgICAgLy8gd3JhcCBvdmVyIHxjaHVua19pZHwgb3IgdGhlIHBy
b2R1Y2VyIHNlbnQgYSBtYWxpY2lvdXMgSVBDLgorICAgICAgc3RhdHNfLnNldF9wYXRjaGVzX2Zh
aWxlZChzdGF0c18ucGF0Y2hlc19mYWlsZWQoKSArIDEpOworICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIC8vIERDSEVDSyB0aGF0IHdlIGFyZSB3cml0aW5nIGludG8gYSB6ZXJvLWZp
bGxlZCBzaXplIGZpZWxkIGFuZCBub3QgaW50bworICAgIC8vIHZhbGlkIGRhdGEuIEl0IHJlbGll
cyBvbiBTY2F0dGVyZWRTdHJlYW1Xcml0ZXI6OlJlc2VydmVCeXRlcygpIHRvCisgICAgLy8gemVy
by1maWxsIHJlc2VydmF0aW9ucyBpbiBkZWJ1ZyBidWlsZHMuCisgICAgY2hhciB6ZXJvW1BhdGNo
OjprU2l6ZV17fTsKKyAgICBQRVJGRVRUT19EQ0hFQ0sobWVtY21wKHB0ciwgJnplcm8sIFBhdGNo
OjprU2l6ZSkgPT0gMCk7CisKKyAgICBtZW1jcHkocHRyLCAmcGF0Y2hlc1tpXS5kYXRhWzBdLCBQ
YXRjaDo6a1NpemUpOworICB9CisgIFRSQUNFX0JVRkZFUl9ETE9HKAorICAgICAgIkNodW5rIHJh
dyAoYWZ0ZXIgcGF0Y2gpOiAlcyIsCisgICAgICBIZXhEdW1wKGNodW5rX2JlZ2luLCBjaHVua19t
ZXRhLmNodW5rX3JlY29yZC0+c2l6ZSkuY19zdHIoKSk7CisKKyAgc3RhdHNfLnNldF9wYXRjaGVz
X3N1Y2NlZWRlZChzdGF0c18ucGF0Y2hlc19zdWNjZWVkZWQoKSArIHBhdGNoZXNfc2l6ZSk7Cisg
IGlmICghb3RoZXJfcGF0Y2hlc19wZW5kaW5nKSB7CisgICAgY2h1bmtfbWV0YS5mbGFncyAmPSB+
a0NodW5rTmVlZHNQYXRjaGluZzsKKyAgICBjaHVua19tZXRhLmNodW5rX3JlY29yZC0+ZmxhZ3Mg
PSBjaHVua19tZXRhLmZsYWdzOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRyYWNl
QnVmZmVyOjpCZWdpblJlYWQoKSB7CisgIHJlYWRfaXRlcl8gPSBHZXRSZWFkSXRlckZvclNlcXVl
bmNlKGluZGV4Xy5iZWdpbigpKTsKKyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICBjaGFu
Z2VkX3NpbmNlX2xhc3RfcmVhZF8gPSBmYWxzZTsKKyNlbmRpZgorfQorCitUcmFjZUJ1ZmZlcjo6
U2VxdWVuY2VJdGVyYXRvciBUcmFjZUJ1ZmZlcjo6R2V0UmVhZEl0ZXJGb3JTZXF1ZW5jZSgKKyAg
ICBDaHVua01hcDo6aXRlcmF0b3Igc2VxX2JlZ2luKSB7CisgIFNlcXVlbmNlSXRlcmF0b3IgaXRl
cjsKKyAgaXRlci5zZXFfYmVnaW4gPSBzZXFfYmVnaW47CisgIGlmIChzZXFfYmVnaW4gPT0gaW5k
ZXhfLmVuZCgpKSB7CisgICAgaXRlci5jdXIgPSBpdGVyLnNlcV9lbmQgPSBpbmRleF8uZW5kKCk7
CisgICAgcmV0dXJuIGl0ZXI7CisgIH0KKworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisg
IC8vIEVpdGhlciB8c2VxX2JlZ2lufCBpcyA9PSBpbmRleF8uYmVnaW4oKSBvciB0aGUgaXRlbSBp
bW1lZGlhdGVseSBiZWZvcmUgbXVzdAorICAvLyBiZWxvbmcgdG8gYSBkaWZmZXJlbnQge1Byb2R1
Y2VySUQsIFdyaXRlcklEfSBzZXF1ZW5jZS4KKyAgaWYgKHNlcV9iZWdpbiAhPSBpbmRleF8uYmVn
aW4oKSAmJiBzZXFfYmVnaW4gIT0gaW5kZXhfLmVuZCgpKSB7CisgICAgYXV0byBwcmV2X2l0ID0g
c2VxX2JlZ2luOworICAgIHByZXZfaXQtLTsKKyAgICBQRVJGRVRUT19EQ0hFQ0soCisgICAgICAg
IHNlcV9iZWdpbiA9PSBpbmRleF8uYmVnaW4oKSB8fAorICAgICAgICBzdGQ6OnRpZShwcmV2X2l0
LT5maXJzdC5wcm9kdWNlcl9pZCwgcHJldl9pdC0+Zmlyc3Qud3JpdGVyX2lkKSA8CisgICAgICAg
ICAgICBzdGQ6OnRpZShzZXFfYmVnaW4tPmZpcnN0LnByb2R1Y2VyX2lkLCBzZXFfYmVnaW4tPmZp
cnN0LndyaXRlcl9pZCkpOworICB9CisjZW5kaWYKKworICAvLyBGaW5kIHRoZSBmaXJzdCBlbnRy
eSB0aGF0IGhhcyBhIGdyZWF0ZXIge1Byb2R1Y2VySUQsIFdyaXRlcklEfSAob3IganVzdAorICAv
LyBpbmRleF8uZW5kKCkgaWYgd2UgcmVhY2hlZCB0aGUgZW5kKS4KKyAgQ2h1bmtNZXRhOjpLZXkg
a2V5ID0gc2VxX2JlZ2luLT5maXJzdDsgIC8vIERlbGliZXJhdGUgY29weS4KKyAga2V5LmNodW5r
X2lkID0ga01heENodW5rSUQ7CisgIGl0ZXIuc2VxX2VuZCA9IGluZGV4Xy51cHBlcl9ib3VuZChr
ZXkpOworICBQRVJGRVRUT19EQ0hFQ0soaXRlci5zZXFfYmVnaW4gIT0gaXRlci5zZXFfZW5kKTsK
KworICAvLyBOb3cgZmluZCB0aGUgZmlyc3QgZW50cnkgYmV0d2VlbiBbc2VxX2JlZ2luLCBzZXFf
ZW5kKSB0aGF0IGlzCisgIC8vID4gbGFzdF9jaHVua19pZF93cml0dGVuXy4gVGhpcyBpcyB3aGVy
ZSB3ZSB0aGUgc2VxdWVuY2Ugd2lsbCBzdGFydCAoc2VlCisgIC8vIG5vdGVzIGFib3V0IHdyYXBw
aW5nIG9mIElEcyBpbiB0aGUgaGVhZGVyKS4KKyAgYXV0byBwcm9kdWNlcl9hbmRfd3JpdGVyX2lk
ID0gc3RkOjptYWtlX3BhaXIoa2V5LnByb2R1Y2VyX2lkLCBrZXkud3JpdGVyX2lkKTsKKyAgUEVS
RkVUVE9fRENIRUNLKGxhc3RfY2h1bmtfaWRfd3JpdHRlbl8uY291bnQocHJvZHVjZXJfYW5kX3dy
aXRlcl9pZCkpOworICBpdGVyLndyYXBwaW5nX2lkID0gbGFzdF9jaHVua19pZF93cml0dGVuX1tw
cm9kdWNlcl9hbmRfd3JpdGVyX2lkXTsKKyAga2V5LmNodW5rX2lkID0gaXRlci53cmFwcGluZ19p
ZDsKKyAgaXRlci5jdXIgPSBpbmRleF8udXBwZXJfYm91bmQoa2V5KTsKKyAgaWYgKGl0ZXIuY3Vy
ID09IGl0ZXIuc2VxX2VuZCkKKyAgICBpdGVyLmN1ciA9IGl0ZXIuc2VxX2JlZ2luOworICByZXR1
cm4gaXRlcjsKK30KKwordm9pZCBUcmFjZUJ1ZmZlcjo6U2VxdWVuY2VJdGVyYXRvcjo6TW92ZU5l
eHQoKSB7CisgIC8vIFN0b3AgaXRlcmF0aW5nIHdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUg
c2VxdWVuY2UuCisgIC8vIE5vdGU6IHxzZXFfYmVnaW58IG1pZ2h0IGJlID09IHxzZXFfZW5kfC4K
KyAgaWYgKGN1ciA9PSBzZXFfZW5kIHx8IGN1ci0+Zmlyc3QuY2h1bmtfaWQgPT0gd3JhcHBpbmdf
aWQpIHsKKyAgICBjdXIgPSBzZXFfZW5kOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIHRo
ZSBjdXJyZW50IGNodW5rIHdhc24ndCBjb21wbGV0ZWQgeWV0LCB3ZSBzaG91bGRuJ3QgYWR2YW5j
ZSBwYXN0IGl0IGFzCisgIC8vIGl0IG1heSBiZSByZXdyaXR0ZW4gd2l0aCBhZGRpdGlvbmFsIHBh
Y2tldHMuCisgIGlmICghY3VyLT5zZWNvbmQuaXNfY29tcGxldGUoKSkgeworICAgIGN1ciA9IHNl
cV9lbmQ7CisgICAgcmV0dXJuOworICB9CisKKyAgQ2h1bmtJRCBsYXN0X2NodW5rX2lkID0gY3Vy
LT5maXJzdC5jaHVua19pZDsKKyAgaWYgKCsrY3VyID09IHNlcV9lbmQpCisgICAgY3VyID0gc2Vx
X2JlZ2luOworCisgIC8vIFRoZXJlIG1heSBiZSBhIG1pc3NpbmcgY2h1bmsgaW4gdGhlIHNlcXVl
bmNlIG9mIGNodW5rcywgaW4gd2hpY2ggY2FzZSB0aGUKKyAgLy8gbmV4dCBjaHVuaydzIElEIHdv
bid0IGZvbGxvdyB0aGUgbGFzdCBvbmUncy4gSWYgc28sIHNraXAgdGhlIHJlc3Qgb2YgdGhlCisg
IC8vIHNlcXVlbmNlLiBXZSdsbCByZXR1cm4gdG8gaXQgbGF0ZXIgb25jZSB0aGUgaG9sZSBpcyBm
aWxsZWQuCisgIGlmIChsYXN0X2NodW5rX2lkICsgMSAhPSBjdXItPmZpcnN0LmNodW5rX2lkKQor
ICAgIGN1ciA9IHNlcV9lbmQ7Cit9CisKK2Jvb2wgVHJhY2VCdWZmZXI6OlJlYWROZXh0VHJhY2VQ
YWNrZXQoCisgICAgVHJhY2VQYWNrZXQqIHBhY2tldCwKKyAgICBQYWNrZXRTZXF1ZW5jZVByb3Bl
cnRpZXMqIHNlcXVlbmNlX3Byb3BlcnRpZXMsCisgICAgYm9vbCogcHJldmlvdXNfcGFja2V0X29u
X3NlcXVlbmNlX2Ryb3BwZWQpIHsKKyAgLy8gTm90ZTogTW92ZU5leHQoKSBtb3ZlcyBvbmx5IHdp
dGhpbiB0aGUgbmV4dCBjaHVuayB3aXRoaW4gdGhlIHNhbWUKKyAgLy8ge1Byb2R1Y2VySUQsIFdy
aXRlcklEfSBzZXF1ZW5jZS4gSGVyZSB3ZSB3YW50IHRvOgorICAvLyAtIHJldHVybiB0aGUgbmV4
dCBwYXRjaGVkK2NvbXBsZXRlIHBhY2tldCBpbiB0aGUgY3VycmVudCBzZXF1ZW5jZSwgaWYgYW55
LgorICAvLyAtIHJldHVybiB0aGUgZmlyc3QgcGF0Y2hlZCtjb21wbGV0ZSBwYWNrZXQgaW4gdGhl
IG5leHQgc2VxdWVuY2UsIGlmIGFueS4KKyAgLy8gLSByZXR1cm4gZmFsc2UgaWYgbm9uZSBvZiB0
aGUgYWJvdmUgaXMgZm91bmQuCisgIFRSQUNFX0JVRkZFUl9ETE9HKCJSZWFkTmV4dFRyYWNlUGFj
a2V0KCkiKTsKKworICAvLyBKdXN0IGluIGNhc2Ugd2UgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhl
c2UgYmVsb3cuCisgICpzZXF1ZW5jZV9wcm9wZXJ0aWVzID0gezAsIGtJbnZhbGlkVWlkLCAwfTsK
KyAgKnByZXZpb3VzX3BhY2tldF9vbl9zZXF1ZW5jZV9kcm9wcGVkID0gZmFsc2U7CisKKyAgLy8g
QXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2VxdWVuY2UgaXRlcmF0aW9uLCB3ZSBjb25zaWRlciB0aGUg
bGFzdCByZWFkIHBhY2tldAorICAvLyBkcm9wcGVkLiBXaGlsZSBpdGVyYXRpbmcgb3ZlciB0aGUg
Y2h1bmtzIGluIHRoZSBzZXF1ZW5jZSwgd2UgdXBkYXRlIHRoaXMKKyAgLy8gZmxhZyBiYXNlZCBv
biBvdXIga25vd2xlZGdlIGFib3V0IHRoZSBsYXN0IHBhY2tldCB0aGF0IHdhcyByZWFkIGZyb20g
ZWFjaAorICAvLyBjaHVuayAofGxhc3RfcmVhZF9wYWNrZXRfc2tpcHBlZHwgaW4gQ2h1bmtNZXRh
KS4KKyAgYm9vbCBwcmV2aW91c19wYWNrZXRfZHJvcHBlZCA9IHRydWU7CisKKyNpZiBQRVJGRVRU
T19EQ0hFQ0tfSVNfT04oKQorICBQRVJGRVRUT19EQ0hFQ0soIWNoYW5nZWRfc2luY2VfbGFzdF9y
ZWFkXyk7CisjZW5kaWYKKyAgZm9yICg7OyByZWFkX2l0ZXJfLk1vdmVOZXh0KCkpIHsKKyAgICBp
ZiAoUEVSRkVUVE9fVU5MSUtFTFkoIXJlYWRfaXRlcl8uaXNfdmFsaWQoKSkpIHsKKyAgICAgIC8v
IFdlIHJhbiBvdXQgb2YgY2h1bmtzIGluIHRoZSBjdXJyZW50IHtQcm9kdWNlcklELCBXcml0ZXJJ
RH0gc2VxdWVuY2Ugb3IKKyAgICAgIC8vIHdlIGp1c3QgcmVhY2hlZCB0aGUgaW5kZXhfLmVuZCgp
LgorCisgICAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkocmVhZF9pdGVyXy5zZXFfZW5kID09IGlu
ZGV4Xy5lbmQoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gV2UgcmVhY2hl
ZCB0aGUgZW5kIG9mIHNlcXVlbmNlLCBtb3ZlIHRvIHRoZSBuZXh0IG9uZS4KKyAgICAgIC8vIE5v
dGU6ICsrcmVhZF9pdGVyXy5zZXFfZW5kIG1pZ2h0IGJlY29tZSBpbmRleF8uZW5kKCksIGJ1dAor
ICAgICAgLy8gR2V0UmVhZEl0ZXJGb3JTZXF1ZW5jZSgpIGtub3dzIGhvdyB0byBkZWFsIHdpdGgg
dGhhdC4KKyAgICAgIHJlYWRfaXRlcl8gPSBHZXRSZWFkSXRlckZvclNlcXVlbmNlKHJlYWRfaXRl
cl8uc2VxX2VuZCk7CisgICAgICBQRVJGRVRUT19EQ0hFQ0socmVhZF9pdGVyXy5pc192YWxpZCgp
ICYmIHJlYWRfaXRlcl8uY3VyICE9IGluZGV4Xy5lbmQoKSk7CisgICAgICBwcmV2aW91c19wYWNr
ZXRfZHJvcHBlZCA9IHRydWU7CisgICAgfQorCisgICAgQ2h1bmtNZXRhKiBjaHVua19tZXRhID0g
JipyZWFkX2l0ZXJfOworCisgICAgLy8gSWYgdGhlIGNodW5rIGhhcyBob2xlcyB0aGF0IGFyZSBh
d2FpdGluZyB0byBiZSBwYXRjaGVkIG91dC1vZi1iYW5kLAorICAgIC8vIHNraXAgdGhlIGN1cnJl
bnQgc2VxdWVuY2UgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lLgorICAgIGlmIChjaHVua19tZXRh
LT5mbGFncyAmIGtDaHVua05lZWRzUGF0Y2hpbmcpIHsKKyAgICAgIHJlYWRfaXRlcl8uTW92ZVRv
RW5kKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjb25zdCBQcm9kdWNlcklEIHRy
dXN0ZWRfcHJvZHVjZXJfaWQgPSByZWFkX2l0ZXJfLnByb2R1Y2VyX2lkKCk7CisgICAgY29uc3Qg
V3JpdGVySUQgd3JpdGVyX2lkID0gcmVhZF9pdGVyXy53cml0ZXJfaWQoKTsKKyAgICBjb25zdCB1
aWRfdCB0cnVzdGVkX3VpZCA9IGNodW5rX21ldGEtPnRydXN0ZWRfdWlkOworCisgICAgLy8gQXQg
dGhpcyBwb2ludCB3ZSBoYXZlIGEgY2h1bmsgaW4gfGNodW5rX21ldGF8IHRoYXQgaGFzIG5vdCBi
ZWVuIGZ1bGx5CisgICAgLy8gcmVhZC4gV2UgZG9uJ3Qga25vdyB5ZXQgd2hldGhlciB3ZSBoYXZl
IGVub3VnaCBkYXRhIHRvIHJlYWQgdGhlIGZ1bGwKKyAgICAvLyBwYWNrZXQgKGluIHRoZSBjYXNl
IGl0J3MgZnJhZ21lbnRlZCBvdmVyIHNldmVyYWwgY2h1bmtzKSBhbmQgd2UgYXJlIGFib3V0Cisg
ICAgLy8gdG8gZmluZCB0aGF0IG91dC4gU3BlY2lmaWNhbGx5OgorICAgIC8vIEEpIElmIHRoZSBm
aXJzdCBmcmFnbWVudCBpcyB1bnJlYWQgYW5kIGlzIGEgZnJhZ21lbnQgY29udGludWluZyBmcm9t
IGEKKyAgICAvLyAgICBwcmV2aW91cyBjaHVuaywgaXQgbWVhbnMgd2UgaGF2ZSBtaXNzZWQgdGhl
IHByZXZpb3VzIENodW5rSUQuIEluCisgICAgLy8gICAgZmFjdCwgaWYgdGhpcyB3YXNuJ3QgdGhl
IGNhc2UsIGEgcHJldmlvdXMgY2FsbCB0byBSZWFkTmV4dCgpIHNob3VsZG4ndAorICAgIC8vICAg
IGhhdmUgbW92ZWQgdGhlIGN1cnNvciB0byB0aGlzIGNodW5rLgorICAgIC8vIEIpIEFueSBmcmFn
bWVudCA+IDAgJiYgPCBsYXN0IGlzIGFsd2F5cyByZWFkYWJsZS4gQnkgZGVmaW5pdGlvbiBhbiBp
bm5lcgorICAgIC8vICAgIHBhY2tldCBpcyBuZXZlciBmcmFnbWVudGVkIGFuZCBoZW5jZSBkb2Vz
bid0IHJlcXVpcmUgbmVpdGhlciBzdGl0Y2hpbmcKKyAgICAvLyAgICBub3IgYW55IG91dC1vZi1i
YW5kIHBhdGNoaW5nLiBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBsYXN0IHBhY2tldAorICAgIC8v
ICAgIGlmZiBpdCBkb2Vzbid0IGNvbnRpbnVlIG9uIHRoZSBuZXh0IGNodW5rLgorICAgIC8vIEMp
IElmIHRoZSBsYXN0IHBhY2tldCAod2hpY2ggbWlnaHQgYmUgYWxzbyB0aGUgb25seSBwYWNrZXQg
aW4gdGhlIGNodW5rKQorICAgIC8vICAgIGlzIGEgZnJhZ21lbnQgYW5kIGNvbnRpbnVlcyBvbiB0
aGUgbmV4dCBjaHVuaywgd2UgcGVlayBhdCB0aGUgbmV4dAorICAgIC8vICAgIGNodW5rcyBhbmQs
IGlmIHdlIGhhdmUgYWxsIG9mIHRoZW0sIG1hcmsgYXMgcmVhZCBhbmQgbW92ZSB0aGUgY3Vyc29y
LgorICAgIC8vCisgICAgLy8gKy0tLS0tLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0tLS0tLS0t
LSsgICstLS0tLS0tLS0tLS0tLS0rCisgICAgLy8gfCBDaHVua0lEOiAxICAgIHwgICB8IENodW5r
SUQ6IDIgICAgICAgIHwgIHwgQ2h1bmtJRDogMyAgICB8CisgICAgLy8gfC0tLS0tLS0tLS0tLS0t
LSsgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0rCisgICAgLy8gfCBQ
YWNrZXQgMSAgICAgIHwgICB8ICAgICAgICAgICAgICAgICAgIHwgIHwgLi4uIFBhY2tldCAzICB8
CisgICAgLy8gfCBQYWNrZXQgMiAgICAgIHwgICB8IC4uLiBQYWNrZXQgMyAgLi4uIHwgIHwgUGFj
a2V0IDQgICAgICB8CisgICAgLy8gfCBQYWNrZXQgMyAgLi4uIHwgICB8ICAgICAgICAgICAgICAg
ICAgIHwgIHwgUGFja2V0IDUgLi4uICB8CisgICAgLy8gKy0tLS0tLS0tLS0tLS0tLSsgICArLS0t
LS0tLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0rCisKKyAgICBQRVJGRVRUT19EQ0hF
Q0soY2h1bmtfbWV0YS0+bnVtX2ZyYWdtZW50c19yZWFkIDw9CisgICAgICAgICAgICAgICAgICAg
IGNodW5rX21ldGEtPm51bV9mcmFnbWVudHMpOworCisgICAgLy8gSWYgd2UgZGlkbid0IHJlYWQg
YW55IHBhY2tldHMgZnJvbSB0aGlzIGNodW5rLCB0aGUgbGFzdCBwYWNrZXQgd2FzIGZyb20KKyAg
ICAvLyB0aGUgcHJldmlvdXMgY2h1bmsgd2UgaXRlcmF0ZWQgb3Zlcjsgc28gZG9uJ3QgdXBkYXRl
CisgICAgLy8gfHByZXZpb3VzX3BhY2tldF9kcm9wcGVkfCBpbiB0aGlzIGNhc2UuCisgICAgaWYg
KGNodW5rX21ldGEtPm51bV9mcmFnbWVudHNfcmVhZCA+IDApCisgICAgICBwcmV2aW91c19wYWNr
ZXRfZHJvcHBlZCA9IGNodW5rX21ldGEtPmxhc3RfcmVhZF9wYWNrZXRfc2tpcHBlZCgpOworCisg
ICAgd2hpbGUgKGNodW5rX21ldGEtPm51bV9mcmFnbWVudHNfcmVhZCA8IGNodW5rX21ldGEtPm51
bV9mcmFnbWVudHMpIHsKKyAgICAgIGVudW0geyBrU2tpcCA9IDAsIGtSZWFkT25lUGFja2V0LCBr
VHJ5UmVhZEFoZWFkIH0gYWN0aW9uOworICAgICAgaWYgKGNodW5rX21ldGEtPm51bV9mcmFnbWVu
dHNfcmVhZCA9PSAwKSB7CisgICAgICAgIGlmIChjaHVua19tZXRhLT5mbGFncyAmIGtGaXJzdFBh
Y2tldENvbnRpbnVlc0Zyb21QcmV2Q2h1bmspIHsKKyAgICAgICAgICBhY3Rpb24gPSBrU2tpcDsg
IC8vIENhc2UgQS4KKyAgICAgICAgfSBlbHNlIGlmIChjaHVua19tZXRhLT5udW1fZnJhZ21lbnRz
ID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAoY2h1bmtfbWV0YS0+ZmxhZ3MgJiBrTGFzdFBh
Y2tldENvbnRpbnVlc09uTmV4dENodW5rKSkgeworICAgICAgICAgIGFjdGlvbiA9IGtUcnlSZWFk
QWhlYWQ7ICAvLyBDYXNlIEMuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWN0aW9uID0g
a1JlYWRPbmVQYWNrZXQ7ICAvLyBDYXNlIEIuCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAo
Y2h1bmtfbWV0YS0+bnVtX2ZyYWdtZW50c19yZWFkIDwKKyAgICAgICAgICAgICAgICAgICAgIGNo
dW5rX21ldGEtPm51bV9mcmFnbWVudHMgLSAxIHx8CisgICAgICAgICAgICAgICAgICEoY2h1bmtf
bWV0YS0+ZmxhZ3MgJiBrTGFzdFBhY2tldENvbnRpbnVlc09uTmV4dENodW5rKSkgeworICAgICAg
ICBhY3Rpb24gPSBrUmVhZE9uZVBhY2tldDsgIC8vIENhc2UgQi4KKyAgICAgIH0gZWxzZSB7Cisg
ICAgICAgIGFjdGlvbiA9IGtUcnlSZWFkQWhlYWQ7ICAvLyBDYXNlIEMuCisgICAgICB9CisKKyAg
ICAgIFRSQUNFX0JVRkZFUl9ETE9HKCIgIGNodW5rICV1LCBwYWNrZXQgJWh1IG9mICVodSwgYWN0
aW9uPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfaXRlcl8uY2h1bmtfaWQoKSwg
Y2h1bmtfbWV0YS0+bnVtX2ZyYWdtZW50c19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAg
Y2h1bmtfbWV0YS0+bnVtX2ZyYWdtZW50cywgYWN0aW9uKTsKKworICAgICAgaWYgKGFjdGlvbiA9
PSBrU2tpcCkgeworICAgICAgICAvLyBUaGlzIGZyYWdtZW50IHdpbGwgYmUgc2tpcHBlZCBmb3Jl
dmVyLCBub3QganVzdCBpbiB0aGlzIFJlYWRQYWNrZXQoKQorICAgICAgICAvLyBpdGVyYXRpb24u
IFRoaXMgaGFwcGVucyBieSB2aXJ0dWUgb2YgUmVhZE5leHRQYWNrZXRJbkNodW5rKCkKKyAgICAg
ICAgLy8gaW5jcmVtZW50aW5nIHRoZSB8bnVtX2ZyYWdtZW50c19yZWFkfCBhbmQgbWFya2luZyB0
aGUgZnJhZ21lbnQgYXMKKyAgICAgICAgLy8gcmVhZCBldmVuIGlmIHdlIGRpZG4ndCByZWFsbHku
CisgICAgICAgIFJlYWROZXh0UGFja2V0SW5DaHVuayhjaHVua19tZXRhLCBudWxscHRyKTsKKyAg
ICAgICAgY2h1bmtfbWV0YS0+c2V0X2xhc3RfcmVhZF9wYWNrZXRfc2tpcHBlZCh0cnVlKTsKKyAg
ICAgICAgcHJldmlvdXNfcGFja2V0X2Ryb3BwZWQgPSB0cnVlOworICAgICAgICBjb250aW51ZTsK
KyAgICAgIH0KKworICAgICAgaWYgKGFjdGlvbiA9PSBrUmVhZE9uZVBhY2tldCkgeworICAgICAg
ICAvLyBUaGUgZWFzeSBwZWFzeSBjYXNlIEIuCisgICAgICAgIFJlYWRQYWNrZXRSZXN1bHQgcmVz
dWx0ID0gUmVhZE5leHRQYWNrZXRJbkNodW5rKGNodW5rX21ldGEsIHBhY2tldCk7CisKKyAgICAg
ICAgaWYgKFBFUkZFVFRPX0xJS0VMWShyZXN1bHQgPT0gUmVhZFBhY2tldFJlc3VsdDo6a1N1Y2Nl
ZWRlZCkpIHsKKyAgICAgICAgICAqc2VxdWVuY2VfcHJvcGVydGllcyA9IHt0cnVzdGVkX3Byb2R1
Y2VyX2lkLCB0cnVzdGVkX3VpZCwgd3JpdGVyX2lkfTsKKyAgICAgICAgICAqcHJldmlvdXNfcGFj
a2V0X29uX3NlcXVlbmNlX2Ryb3BwZWQgPSBwcmV2aW91c19wYWNrZXRfZHJvcHBlZDsKKyAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gUmVhZFBhY2tl
dFJlc3VsdDo6a0ZhaWxlZEVtcHR5UGFja2V0KSB7CisgICAgICAgICAgLy8gV2UgY2FuIGlnbm9y
ZSBhbmQgc2tpcCBlbXB0eSBwYWNrZXRzLgorICAgICAgICAgIFBFUkZFVFRPX0RDSEVDSyhwYWNr
ZXQtPnNsaWNlcygpLmVtcHR5KCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisK
KyAgICAgICAgLy8gSW4gZXh0cmVtZWx5IHJhcmUgY2FzZXMgKHByb2R1Y2VyIGJ1Z2dlZCAvIG1h
bGljaW91cykgdGhlIGNodW5rIG1pZ2h0CisgICAgICAgIC8vIGNvbnRhaW4gYW4gaW52YWxpZCBm
cmFnbWVudC4gSW4gc3VjaCBjYXNlIHdlIGRvbid0IHdhbnQgdG8gc3RhbGwgdGhlCisgICAgICAg
IC8vIHNlcXVlbmNlIGJ1dCBqdXN0IHNraXAgdGhlIGNodW5rIGFuZCBtb3ZlIG9uLiBSZWFkTmV4
dFBhY2tldEluQ2h1bmsoKQorICAgICAgICAvLyBtYXJrcyB0aGUgY2h1bmsgYXMgZnVsbHkgcmVh
ZCwgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byByZWFkIGZyb20gaXQKKyAgICAgICAgLy8gYWdhaW4g
aW4gYSBmdXR1cmUgY2FsbCB0byBSZWFkQnVmZmVycygpLiBJdCBhbHNvIGFscmVhZHkgcmVjb3Jk
cyBhbgorICAgICAgICAvLyBhYmkgdmlvbGF0aW9uIGZvciB0aGlzLgorICAgICAgICBQRVJGRVRU
T19EQ0hFQ0socmVzdWx0ID09IFJlYWRQYWNrZXRSZXN1bHQ6OmtGYWlsZWRJbnZhbGlkUGFja2V0
KTsKKyAgICAgICAgY2h1bmtfbWV0YS0+c2V0X2xhc3RfcmVhZF9wYWNrZXRfc2tpcHBlZCh0cnVl
KTsKKyAgICAgICAgcHJldmlvdXNfcGFja2V0X2Ryb3BwZWQgPSB0cnVlOworICAgICAgICBicmVh
azsKKyAgICAgIH0KKworICAgICAgUEVSRkVUVE9fRENIRUNLKGFjdGlvbiA9PSBrVHJ5UmVhZEFo
ZWFkKTsKKyAgICAgIFJlYWRBaGVhZFJlc3VsdCByYV9yZXMgPSBSZWFkQWhlYWQocGFja2V0KTsK
KyAgICAgIGlmIChyYV9yZXMgPT0gUmVhZEFoZWFkUmVzdWx0OjprU3VjY2VlZGVkUmV0dXJuU2xp
Y2VzKSB7CisgICAgICAgIHN0YXRzXy5zZXRfcmVhZGFoZWFkc19zdWNjZWVkZWQoc3RhdHNfLnJl
YWRhaGVhZHNfc3VjY2VlZGVkKCkgKyAxKTsKKyAgICAgICAgKnNlcXVlbmNlX3Byb3BlcnRpZXMg
PSB7dHJ1c3RlZF9wcm9kdWNlcl9pZCwgdHJ1c3RlZF91aWQsIHdyaXRlcl9pZH07CisgICAgICAg
ICpwcmV2aW91c19wYWNrZXRfb25fc2VxdWVuY2VfZHJvcHBlZCA9IHByZXZpb3VzX3BhY2tldF9k
cm9wcGVkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHJhX3Jl
cyA9PSBSZWFkQWhlYWRSZXN1bHQ6OmtGYWlsZWRNb3ZlVG9OZXh0U2VxdWVuY2UpIHsKKyAgICAg
ICAgLy8gcmVhZGFoZWFkIGRpZG4ndCBmaW5kIGEgY29udGlndW91cyBwYWNrZXQgc2VxdWVuY2Uu
IFdlJ2xsIHRyeSBhZ2FpbgorICAgICAgICAvLyBvbiB0aGUgbmV4dCBSZWFkUGFja2V0KCkgY2Fs
bC4KKyAgICAgICAgc3RhdHNfLnNldF9yZWFkYWhlYWRzX2ZhaWxlZChzdGF0c18ucmVhZGFoZWFk
c19mYWlsZWQoKSArIDEpOworCisgICAgICAgIC8vIFRPRE8ocHJpbWlhbm8pOiBvcHRpbWl6YXRp
b246IHRoaXMgTW92ZVRvRW5kKCkgaXMgdGhlIHJlYXNvbiB3aHkKKyAgICAgICAgLy8gTW92ZU5l
eHQoKSAodGhhdCBpcyBjYWxsZWQgaW4gdGhlIG91dGVyIGZvcig7O01vdmVOZXh0KSkgbmVlZHMg
dG8KKyAgICAgICAgLy8gZGVhbCBncmFjZWZ1bGx5IHdpdGggdGhlIGNhc2Ugb2YgfGN1cnw9PXxz
ZXFfZW5kfC4gTWF5YmUgd2UgY2FuIGRvCisgICAgICAgIC8vIHNvbWV0aGluZyB0byBhdm9pZCB0
aGF0IGNoZWNrIGJ5IHJlc2h1ZmZsaW5nIHRoZSBjb2RlIGhlcmU/CisgICAgICAgIHJlYWRfaXRl
cl8uTW92ZVRvRW5kKCk7CisKKyAgICAgICAgLy8gVGhpcyBicmVhayB3aWxsIGdvIGJhY2sgdG8g
YmVnaW5uaW5nIG9mIHRoZSBmb3IoOztNb3ZlTmV4dCgpKS4gVGhhdAorICAgICAgICAvLyB3aWxs
IG1vdmUgdG8gdGhlIG5leHQgc2VxdWVuY2UgYmVjYXVzZSB3ZSBzZXQgdGhlIHJlYWQgaXRlcmF0
b3IgdG8KKyAgICAgICAgLy8gaXRzIGVuZC4KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAg
ICAgIFBFUkZFVFRPX0RDSEVDSyhyYV9yZXMgPT0gUmVhZEFoZWFkUmVzdWx0OjprRmFpbGVkU3Rh
eU9uU2FtZVNlcXVlbmNlKTsKKworICAgICAgLy8gSW4gdGhpcyBjYXNlIFJlYWRBaGVhZCgpIG1p
Z2h0IGFkdmFuY2UgfHJlYWRfaXRlcl98LCBzbyB3ZSBuZWVkIHRvCisgICAgICAvLyByZS1jYWNo
ZSB0aGUgfGNodW5rX21ldGF8IHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGN1cnJlbnQgY2h1bmsu
CisgICAgICBjaHVua19tZXRhID0gJipyZWFkX2l0ZXJfOworICAgICAgY2h1bmtfbWV0YS0+c2V0
X2xhc3RfcmVhZF9wYWNrZXRfc2tpcHBlZCh0cnVlKTsKKyAgICAgIHByZXZpb3VzX3BhY2tldF9k
cm9wcGVkID0gdHJ1ZTsKKyAgICB9ICAvLyB3aGlsZSguLi4pICBbaXRlcmF0ZSBvdmVyIHBhY2tl
dCBmcmFnbWVudHMgZm9yIHRoZSBjdXJyZW50IGNodW5rXS4KKyAgfSAgICAvLyBmb3IoOztNb3Zl
TmV4dCgpKSBbaXRlcmF0ZSBvdmVyIGNodW5rc10uCit9CisKK1RyYWNlQnVmZmVyOjpSZWFkQWhl
YWRSZXN1bHQgVHJhY2VCdWZmZXI6OlJlYWRBaGVhZChUcmFjZVBhY2tldCogcGFja2V0KSB7Cisg
IHN0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8Q2h1bmtJRD4oa01heENodW5rSUQgKyAxKSA9PSAw
LAorICAgICAgICAgICAgICAgICJyZWx5aW5nIG9uIGtNYXhDaHVua0lEIHRvIHdyYXAgbmF0dXJh
bGx5Iik7CisgIFRSQUNFX0JVRkZFUl9ETE9HKCIgcmVhZGFoZWFkIHN0YXJ0IEAgY2h1bmsgJXUi
LCByZWFkX2l0ZXJfLmNodW5rX2lkKCkpOworICBDaHVua0lEIG5leHRfY2h1bmtfaWQgPSByZWFk
X2l0ZXJfLmNodW5rX2lkKCkgKyAxOworICBTZXF1ZW5jZUl0ZXJhdG9yIGl0ID0gcmVhZF9pdGVy
XzsKKyAgZm9yIChpdC5Nb3ZlTmV4dCgpOyBpdC5pc192YWxpZCgpOyBpdC5Nb3ZlTmV4dCgpLCBu
ZXh0X2NodW5rX2lkKyspIHsKKyAgICAvLyBXZSBzaG91bGQgc3RheSB3aXRoaW4gdGhlIHNhbWUg
c2VxdWVuY2Ugd2hpbGUgaXRlcmF0aW5nIGhlcmUuCisgICAgUEVSRkVUVE9fRENIRUNLKGl0LnBy
b2R1Y2VyX2lkKCkgPT0gcmVhZF9pdGVyXy5wcm9kdWNlcl9pZCgpICYmCisgICAgICAgICAgICAg
ICAgICAgIGl0LndyaXRlcl9pZCgpID09IHJlYWRfaXRlcl8ud3JpdGVyX2lkKCkpOworCisgICAg
VFJBQ0VfQlVGRkVSX0RMT0coIiAgIGV4cGVjdGVkIGNodW5rIElEOiAldSwgYWN0dWFsIElEOiAl
dSIsIG5leHRfY2h1bmtfaWQsCisgICAgICAgICAgICAgICAgICAgICAgaXQuY2h1bmtfaWQoKSk7
CisKKyAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkoKCppdCkubnVtX2ZyYWdtZW50cyA9PSAwKSkK
KyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gSWYgd2UgbWlzcyB0aGUgbmV4dCBjaHVuaywgc3Rv
cCBsb29raW5nIGluIHRoZSBjdXJyZW50IHNlcXVlbmNlIGFuZAorICAgIC8vIHRyeSBhbm90aGVy
IHNlcXVlbmNlLiBUaGlzIGNodW5rIG1pZ2h0IGNvbWUgaW4gdGhlIG5lYXIgZnV0dXJlLgorICAg
IC8vIFRoZSBzZWNvbmQgY29uZGl0aW9uIGlzIHRoZSBlZGdlIGNhc2Ugb2YgYSBidWdneS9tYWxp
Y2lvdXMKKyAgICAvLyBwcm9kdWNlci4gVGhlIENodW5rSUQgaXMgY29udGlndW91cyBidXQgaXRz
IGZsYWdzIGRvbid0IG1ha2Ugc2Vuc2UuCisgICAgaWYgKGl0LmNodW5rX2lkKCkgIT0gbmV4dF9j
aHVua19pZCB8fAorICAgICAgICBQRVJGRVRUT19VTkxJS0VMWSgKKyAgICAgICAgICAgICEoKCpp
dCkuZmxhZ3MgJiBrRmlyc3RQYWNrZXRDb250aW51ZXNGcm9tUHJldkNodW5rKSkpIHsKKyAgICAg
IHJldHVybiBSZWFkQWhlYWRSZXN1bHQ6OmtGYWlsZWRNb3ZlVG9OZXh0U2VxdWVuY2U7CisgICAg
fQorCisgICAgLy8gSWYgdGhlIGNodW5rIGlzIGNvbnRpZ3VvdXMgYnV0IGhhcyBub3QgYmVlbiBw
YXRjaGVkIHlldCBtb3ZlIHRvIHRoZSBuZXh0CisgICAgLy8gc2VxdWVuY2UgYW5kIHRyeSBjb21p
bmcgYmFjayBoZXJlIG9uIHRoZSBuZXh0IFJlYWROZXh0VHJhY2VQYWNrZXQoKSBjYWxsLgorICAg
IC8vIFRPRE8ocHJpbWlhbm8pOiBhZGQgYSB0ZXN0IHRvIGNvdmVyIHRoaXMsIGl0J3MgYSBzdWJ0
bGUgY2FzZS4KKyAgICBpZiAoKCppdCkuZmxhZ3MgJiBrQ2h1bmtOZWVkc1BhdGNoaW5nKQorICAg
ICAgcmV0dXJuIFJlYWRBaGVhZFJlc3VsdDo6a0ZhaWxlZE1vdmVUb05leHRTZXF1ZW5jZTsKKwor
ICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugb2YgYW4gaW50ZXJtZWRpYXRlIGNodW5rIHdoaWNoIGNv
bnRhaW5zIG9ubHkgb25lCisgICAgLy8gZnJhZ21lbnQgd2hpY2ggY29udGludWVzIG9uIHRoZSBu
ZXh0IGNodW5rLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBsYXJnZQorICAgIC8vIHBhY2tldHMsIGUu
Zy46IFtQYWNrZXQwLCBQYWNrZXQxKDApXSBbUGFja2V0MSgxKV0gW1BhY2tldDEoMiksIC4uLl0K
KyAgICAvLyAoUGFja2V0MShYKSA6PSBmcmFnbWVudCBYIG9mIFBhY2tldDEpLgorICAgIGlmICgo
Kml0KS5udW1fZnJhZ21lbnRzID09IDEgJiYKKyAgICAgICAgKCgqaXQpLmZsYWdzICYga0xhc3RQ
YWNrZXRDb250aW51ZXNPbk5leHRDaHVuaykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKwor
ICAgIC8vIFdlIG1hZGUgaXQhIFdlIGdvdCBhbGwgZnJhZ21lbnRzIGZvciB0aGUgcGFja2V0IHdp
dGhvdXQgaG9sZXMuCisgICAgVFJBQ0VfQlVGRkVSX0RMT0coIiAgcmVhZGFoZWFkIHN1Y2Nlc3Mg
QCBjaHVuayAldSIsIGl0LmNodW5rX2lkKCkpOworICAgIFBFUkZFVFRPX0RDSEVDSygoKCppdCku
bnVtX2ZyYWdtZW50cyA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAhKCgqaXQpLmZsYWdz
ICYga0xhc3RQYWNrZXRDb250aW51ZXNPbk5leHRDaHVuaykpIHx8CisgICAgICAgICAgICAgICAg
ICAgICgqaXQpLm51bV9mcmFnbWVudHMgPiAxKTsKKworICAgIC8vIE5vdyBsZXQncyByZS1pdGVy
YXRlIG92ZXIgdGhlIFtyZWFkX2l0ZXJfLCBpdF0gc2VxdWVuY2UgYW5kIG1hcmsKKyAgICAvLyBh
bGwgdGhlIGZyYWdtZW50cyBhcyByZWFkLgorICAgIGJvb2wgcGFja2V0X2NvcnJ1cHRpb24gPSBm
YWxzZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBQRVJGRVRUT19EQ0hFQ0socmVhZF9pdGVyXy5p
c192YWxpZCgpKTsKKyAgICAgIFRSQUNFX0JVRkZFUl9ETE9HKCIgICAgY29tbWl0IGNodW5rICV1
IiwgcmVhZF9pdGVyXy5jaHVua19pZCgpKTsKKyAgICAgIGlmIChQRVJGRVRUT19MSUtFTFkoKCpy
ZWFkX2l0ZXJfKS5udW1fZnJhZ21lbnRzID4gMCkpIHsKKyAgICAgICAgLy8gSW4gdGhlIHVubGlr
ZWx5IGNhc2Ugb2YgYSBjb3JydXB0ZWQgcGFja2V0IChjb3JydXB0ZWQgb3IgZW1wdHkKKyAgICAg
ICAgLy8gZnJhZ21lbnQpLCBpbnZhbGlkYXRlIHRoZSBhbGwgc3RpdGNoaW5nIGFuZCBtb3ZlIG9u
IHRvIHRoZSBuZXh0IGNodW5rCisgICAgICAgIC8vIGluIHRoZSBzYW1lIHNlcXVlbmNlLCBpZiBh
bnkuCisgICAgICAgIHBhY2tldF9jb3JydXB0aW9uIHw9IFJlYWROZXh0UGFja2V0SW5DaHVuaygm
KnJlYWRfaXRlcl8sIHBhY2tldCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVh
ZFBhY2tldFJlc3VsdDo6a0ZhaWxlZEludmFsaWRQYWNrZXQ7CisgICAgICB9CisgICAgICBpZiAo
cmVhZF9pdGVyXy5jdXIgPT0gaXQuY3VyKQorICAgICAgICBicmVhazsKKyAgICAgIHJlYWRfaXRl
cl8uTW92ZU5leHQoKTsKKyAgICB9ICAvLyBmb3IoOzspCisgICAgUEVSRkVUVE9fRENIRUNLKHJl
YWRfaXRlcl8uY3VyID09IGl0LmN1cik7CisKKyAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkocGFj
a2V0X2NvcnJ1cHRpb24pKSB7CisgICAgICAvLyBSZWFkTmV4dFBhY2tldEluQ2h1bmsoKSBhbHJl
YWR5IHJlY29yZHMgYW4gYWJpIHZpb2xhdGlvbiBmb3IgdGhpcyBjYXNlLgorICAgICAgKnBhY2tl
dCA9IFRyYWNlUGFja2V0KCk7ICAvLyBjbGVhci4KKyAgICAgIHJldHVybiBSZWFkQWhlYWRSZXN1
bHQ6OmtGYWlsZWRTdGF5T25TYW1lU2VxdWVuY2U7CisgICAgfQorCisgICAgcmV0dXJuIFJlYWRB
aGVhZFJlc3VsdDo6a1N1Y2NlZWRlZFJldHVyblNsaWNlczsKKyAgfSAgLy8gZm9yKGl0Li4uKSAg
W3JlYWRhaGVhZCBsb29wXQorICByZXR1cm4gUmVhZEFoZWFkUmVzdWx0OjprRmFpbGVkTW92ZVRv
TmV4dFNlcXVlbmNlOworfQorCitUcmFjZUJ1ZmZlcjo6UmVhZFBhY2tldFJlc3VsdCBUcmFjZUJ1
ZmZlcjo6UmVhZE5leHRQYWNrZXRJbkNodW5rKAorICAgIENodW5rTWV0YSogY2h1bmtfbWV0YSwK
KyAgICBUcmFjZVBhY2tldCogcGFja2V0KSB7CisgIFBFUkZFVFRPX0RDSEVDSyhjaHVua19tZXRh
LT5udW1fZnJhZ21lbnRzX3JlYWQgPCBjaHVua19tZXRhLT5udW1fZnJhZ21lbnRzKTsKKyAgUEVS
RkVUVE9fRENIRUNLKCEoY2h1bmtfbWV0YS0+ZmxhZ3MgJiBrQ2h1bmtOZWVkc1BhdGNoaW5nKSk7
CisKKyAgY29uc3QgdWludDhfdCogcmVjb3JkX2JlZ2luID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KGNodW5rX21ldGEtPmNodW5rX3JlY29yZCk7CisgIGNvbnN0IHVp
bnQ4X3QqIHJlY29yZF9lbmQgPSByZWNvcmRfYmVnaW4gKyBjaHVua19tZXRhLT5jaHVua19yZWNv
cmQtPnNpemU7CisgIGNvbnN0IHVpbnQ4X3QqIHBhY2tldHNfYmVnaW4gPSByZWNvcmRfYmVnaW4g
KyBzaXplb2YoQ2h1bmtSZWNvcmQpOworICBjb25zdCB1aW50OF90KiBwYWNrZXRfYmVnaW4gPSBw
YWNrZXRzX2JlZ2luICsgY2h1bmtfbWV0YS0+Y3VyX2ZyYWdtZW50X29mZnNldDsKKworICBpZiAo
UEVSRkVUVE9fVU5MSUtFTFkocGFja2V0X2JlZ2luIDwgcGFja2V0c19iZWdpbiB8fAorICAgICAg
ICAgICAgICAgICAgICAgICAgcGFja2V0X2JlZ2luID49IHJlY29yZF9lbmQpKSB7CisgICAgLy8g
VGhlIHByb2R1Y2VyIGhhcyBhIGJ1ZyBvciBpcyBtYWxpY2lvdXMgYW5kIGRpZCBkZWNsYXJlIHRo
YXQgdGhlIGNodW5rCisgICAgLy8gY29udGFpbnMgbW9yZSBwYWNrZXRzIGJleW9uZCBpdHMgYm91
bmRhcmllcy4KKyAgICBzdGF0c18uc2V0X2FiaV92aW9sYXRpb25zKHN0YXRzXy5hYmlfdmlvbGF0
aW9ucygpICsgMSk7CisgICAgUEVSRkVUVE9fRENIRUNLKHN1cHByZXNzX3Nhbml0eV9kY2hlY2tz
X2Zvcl90ZXN0aW5nXyk7CisgICAgY2h1bmtfbWV0YS0+Y3VyX2ZyYWdtZW50X29mZnNldCA9IDA7
CisgICAgY2h1bmtfbWV0YS0+bnVtX2ZyYWdtZW50c19yZWFkID0gY2h1bmtfbWV0YS0+bnVtX2Zy
YWdtZW50czsKKyAgICBpZiAoUEVSRkVUVE9fTElLRUxZKGNodW5rX21ldGEtPmlzX2NvbXBsZXRl
KCkpKSB7CisgICAgICBzdGF0c18uc2V0X2NodW5rc19yZWFkKHN0YXRzXy5jaHVua3NfcmVhZCgp
ICsgMSk7CisgICAgICBzdGF0c18uc2V0X2J5dGVzX3JlYWQoc3RhdHNfLmJ5dGVzX3JlYWQoKSAr
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfbWV0YS0+Y2h1bmtfcmVjb3JkLT5z
aXplKTsKKyAgICB9CisgICAgcmV0dXJuIFJlYWRQYWNrZXRSZXN1bHQ6OmtGYWlsZWRJbnZhbGlk
UGFja2V0OworICB9CisKKyAgLy8gQSBwYWNrZXQgKG9yIGEgZnJhZ21lbnQpIHN0YXJ0cyB3aXRo
IGEgdmFyaW50IHN0YXRpbmcgaXRzIHNpemUsIGZvbGxvd2VkCisgIC8vIGJ5IGl0cyBjb250ZW50
LiBUaGUgdmFyaW50IHNob3VsZG4ndCBiZSBsYXJnZXIgdGhhbiA0IGJ5dGVzIChqdXN0IGluIGNh
c2UKKyAgLy8gdGhlIHByb2R1Y2VyIGlzIHVzaW5nIGEgcmVkdW5kYW50IGVuY29kaW5nKQorICB1
aW50NjRfdCBwYWNrZXRfc2l6ZSA9IDA7CisgIGNvbnN0IHVpbnQ4X3QqIGhlYWRlcl9lbmQgPQor
ICAgICAgc3RkOjptaW4ocGFja2V0X2JlZ2luICsgcHJvdG96ZXJvOjpwcm90b191dGlsczo6a01l
c3NhZ2VMZW5ndGhGaWVsZFNpemUsCisgICAgICAgICAgICAgICByZWNvcmRfZW5kKTsKKyAgY29u
c3QgdWludDhfdCogcGFja2V0X2RhdGEgPSBwcm90b3plcm86OnByb3RvX3V0aWxzOjpQYXJzZVZh
ckludCgKKyAgICAgIHBhY2tldF9iZWdpbiwgaGVhZGVyX2VuZCwgJnBhY2tldF9zaXplKTsKKwor
ICBjb25zdCB1aW50OF90KiBuZXh0X3BhY2tldCA9IHBhY2tldF9kYXRhICsgcGFja2V0X3NpemU7
CisgIGlmIChQRVJGRVRUT19VTkxJS0VMWShuZXh0X3BhY2tldCA8PSBwYWNrZXRfYmVnaW4gfHwK
KyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGFja2V0ID4gcmVjb3JkX2VuZCkpIHsKKyAg
ICAvLyBJbiBCdWZmZXJFeGhhdXN0ZWRQb2xpY3k6OmtEcm9wIG1vZGUsIFRyYWNlV3JpdGVyIG1h
eSBhYm9ydCBhIGZyYWdtZW50ZWQKKyAgICAvLyBwYWNrZXQgYnkgd3JpdGluZyBhbiBpbnZhbGlk
IHNpemUgaW4gdGhlIGxhc3QgZnJhZ21lbnQncyBoZWFkZXIuIFdlCisgICAgLy8gc2hvdWxkIGhh
bmRsZSB0aGlzIGNhc2Ugd2l0aG91dCByZWNvcmRpbmcgYW4gQUJJIHZpb2xhdGlvbiAoc2luY2Ug
QW5kcm9pZAorICAgIC8vIFIpLgorICAgIGlmIChwYWNrZXRfc2l6ZSAhPSBTaGFyZWRNZW1vcnlB
Qkk6OmtQYWNrZXRTaXplRHJvcFBhY2tldCkgeworICAgICAgc3RhdHNfLnNldF9hYmlfdmlvbGF0
aW9ucyhzdGF0c18uYWJpX3Zpb2xhdGlvbnMoKSArIDEpOworICAgICAgUEVSRkVUVE9fRENIRUNL
KHN1cHByZXNzX3Nhbml0eV9kY2hlY2tzX2Zvcl90ZXN0aW5nXyk7CisgICAgfSBlbHNlIHsKKyAg
ICAgIHN0YXRzXy5zZXRfdHJhY2Vfd3JpdGVyX3BhY2tldF9sb3NzKHN0YXRzXy50cmFjZV93cml0
ZXJfcGFja2V0X2xvc3MoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAxKTsKKyAgICB9CisgICAgY2h1bmtfbWV0YS0+Y3VyX2ZyYWdtZW50X29mZnNldCA9IDA7
CisgICAgY2h1bmtfbWV0YS0+bnVtX2ZyYWdtZW50c19yZWFkID0gY2h1bmtfbWV0YS0+bnVtX2Zy
YWdtZW50czsKKyAgICBpZiAoUEVSRkVUVE9fTElLRUxZKGNodW5rX21ldGEtPmlzX2NvbXBsZXRl
KCkpKSB7CisgICAgICBzdGF0c18uc2V0X2NodW5rc19yZWFkKHN0YXRzXy5jaHVua3NfcmVhZCgp
ICsgMSk7CisgICAgICBzdGF0c18uc2V0X2J5dGVzX3JlYWQoc3RhdHNfLmJ5dGVzX3JlYWQoKSAr
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfbWV0YS0+Y2h1bmtfcmVjb3JkLT5z
aXplKTsKKyAgICB9CisgICAgcmV0dXJuIFJlYWRQYWNrZXRSZXN1bHQ6OmtGYWlsZWRJbnZhbGlk
UGFja2V0OworICB9CisKKyAgY2h1bmtfbWV0YS0+Y3VyX2ZyYWdtZW50X29mZnNldCA9CisgICAg
ICBzdGF0aWNfY2FzdDx1aW50MTZfdD4obmV4dF9wYWNrZXQgLSBwYWNrZXRzX2JlZ2luKTsKKyAg
Y2h1bmtfbWV0YS0+bnVtX2ZyYWdtZW50c19yZWFkKys7CisKKyAgaWYgKFBFUkZFVFRPX1VOTElL
RUxZKGNodW5rX21ldGEtPm51bV9mcmFnbWVudHNfcmVhZCA9PQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNodW5rX21ldGEtPm51bV9mcmFnbWVudHMgJiYKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNodW5rX21ldGEtPmlzX2NvbXBsZXRlKCkpKSB7CisgICAgc3RhdHNfLnNldF9jaHVu
a3NfcmVhZChzdGF0c18uY2h1bmtzX3JlYWQoKSArIDEpOworICAgIHN0YXRzXy5zZXRfYnl0ZXNf
cmVhZChzdGF0c18uYnl0ZXNfcmVhZCgpICsgY2h1bmtfbWV0YS0+Y2h1bmtfcmVjb3JkLT5zaXpl
KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBoYXZlIGF0IGxlYXN0IG9uZSBtb3JlIHBhY2tldCB0
byBwYXJzZS4gSXQgc2hvdWxkIGJlIHdpdGhpbiB0aGUgY2h1bmsuCisgICAgaWYgKGNodW5rX21l
dGEtPmN1cl9mcmFnbWVudF9vZmZzZXQgKyBzaXplb2YoQ2h1bmtSZWNvcmQpID49CisgICAgICAg
IGNodW5rX21ldGEtPmNodW5rX3JlY29yZC0+c2l6ZSkgeworICAgICAgUEVSRkVUVE9fRENIRUNL
KHN1cHByZXNzX3Nhbml0eV9kY2hlY2tzX2Zvcl90ZXN0aW5nXyk7CisgICAgfQorICB9CisKKyAg
Y2h1bmtfbWV0YS0+c2V0X2xhc3RfcmVhZF9wYWNrZXRfc2tpcHBlZChmYWxzZSk7CisKKyAgaWYg
KFBFUkZFVFRPX1VOTElLRUxZKHBhY2tldF9zaXplID09IDApKQorICAgIHJldHVybiBSZWFkUGFj
a2V0UmVzdWx0OjprRmFpbGVkRW1wdHlQYWNrZXQ7CisKKyAgaWYgKFBFUkZFVFRPX0xJS0VMWShw
YWNrZXQpKQorICAgIHBhY2tldC0+QWRkU2xpY2UocGFja2V0X2RhdGEsIHN0YXRpY19jYXN0PHNp
emVfdD4ocGFja2V0X3NpemUpKTsKKworICByZXR1cm4gUmVhZFBhY2tldFJlc3VsdDo6a1N1Y2Nl
ZWRlZDsKK30KKwordm9pZCBUcmFjZUJ1ZmZlcjo6RGlzY2FyZFdyaXRlKCkgeworICBQRVJGRVRU
T19EQ0hFQ0sob3ZlcndyaXRlX3BvbGljeV8gPT0ga0Rpc2NhcmQpOworICBkaXNjYXJkX3dyaXRl
c18gPSB0cnVlOworICBzdGF0c18uc2V0X2NodW5rc19kaXNjYXJkZWQoc3RhdHNfLmNodW5rc19k
aXNjYXJkZWQoKSArIDEpOworICBUUkFDRV9CVUZGRVJfRExPRygiICBkaXNjYXJkaW5nIHdyaXRl
Iik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIHNvdXJjZTogc3JjL3RyYWNpbmcvY29yZS90cmFjaW5nX3NlcnZpY2VfaW1wbC5jYworLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogc3JjL3RyYWNpbmcvY29yZS90cmFjaW5nX3Nl
cnZpY2VfaW1wbC5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4g
U291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2Us
IFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp
bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0
YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFj
aGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFw
cGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJp
YnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJ
UywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRo
ZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lm
aWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5k
ZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTUkNfVFJBQ0lOR19DT1JFX1RSQUNJTkdf
U0VSVklDRV9JTVBMX0hfCisjZGVmaW5lIFNSQ19UUkFDSU5HX0NPUkVfVFJBQ0lOR19TRVJWSUNF
X0lNUExfSF8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgor
I2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5j
bHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
dGltZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
ZXh0L2Jhc2Uvb3B0aW9uYWwuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2V4dC9iYXNlL3dlYWtfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL2Jhc2ljX3R5cGVzLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJh
Y2luZy9jb3JlL2NvbW1pdF9kYXRhX3JlcXVlc3QuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvb2JzZXJ2YWJsZV9ldmVu
dHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4
dC90cmFjaW5nL2NvcmUvc2hhcmVkX21lbW9yeV9hYmkuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vfc3RhdHMu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90
cmFjaW5nL2NvcmUvdHJhY2luZ19zZXJ2aWNlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2NvcmUvZGF0YV9zb3VyY2VfY29uZmlnLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5n
L2NvcmUvZGF0YV9zb3VyY2VfZGVzY3JpcHRvci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29y
ZS90cmFjZV9jb25maWcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InNyYy90cmFjaW5nL2NvcmUvaWRfYWxsb2NhdG9yLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CisKK25hbWVzcGFjZSBiYXNlIHsKK2NsYXNzIFRhc2tSdW5uZXI7Cit9ICAvLyBuYW1lc3BhY2Ug
YmFzZQorCitjbGFzcyBDb25zdW1lcjsKK2NsYXNzIFByb2R1Y2VyOworY2xhc3MgU2hhcmVkTWVt
b3J5OworY2xhc3MgU2hhcmVkTWVtb3J5QXJiaXRlckltcGw7CitjbGFzcyBUcmFjZUJ1ZmZlcjsK
K2NsYXNzIFRyYWNlUGFja2V0OworCisvLyBUaGUgdHJhY2luZyBzZXJ2aWNlIGJ1c2luZXNzIGxv
Z2ljLgorY2xhc3MgVHJhY2luZ1NlcnZpY2VJbXBsIDogcHVibGljIFRyYWNpbmdTZXJ2aWNlIHsK
KyBwcml2YXRlOgorICBzdHJ1Y3QgRGF0YVNvdXJjZUluc3RhbmNlOworCisgcHVibGljOgorICBz
dGF0aWMgY29uc3RleHByIHNpemVfdCBrRGVmYXVsdFNobVBhZ2VTaXplID0gYmFzZTo6a1BhZ2VT
aXplOworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRGVmYXVsdFNobVNpemUgPSAyNTYgKiAx
MDI0dWw7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhTaG1TaXplID0gMzIgKiAxMDI0
ICogMTAyNHVsOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtEYXRhU291cmNlU3RvcFRp
bWVvdXRNcyA9IDUwMDA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrU3luY01hcmtlcltd
ID0gezB4ODIsIDB4NDcsIDB4N2EsIDB4NzYsIDB4YjIsIDB4OGQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIsIDB4YmEsIDB4ODEsIDB4ZGMsIDB4MzMs
IDB4MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQs
IDB4NTcsIDB4YTAsIDB4Nzl9OworCisgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBiZWhpbmQgdGhl
IHNlcnZpY2UgZW5kcG9pbnQgZXhwb3NlZCB0byBlYWNoIHByb2R1Y2VyLgorICBjbGFzcyBQcm9k
dWNlckVuZHBvaW50SW1wbCA6IHB1YmxpYyBUcmFjaW5nU2VydmljZTo6UHJvZHVjZXJFbmRwb2lu
dCB7CisgICBwdWJsaWM6CisgICAgUHJvZHVjZXJFbmRwb2ludEltcGwoUHJvZHVjZXJJRCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgVHJhY2luZ1NlcnZpY2VJbXBsKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpU
YXNrUnVubmVyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWNlciosCisgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2R1Y2VyX25hbWUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wcm9jZXNzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgIGJvb2wgc21iX3NjcmFwaW5nX2VuYWJsZWQpOworICAgIH5Qcm9kdWNlckVuZHBvaW50
SW1wbCgpIG92ZXJyaWRlOworCisgICAgLy8gVHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyRW5kcG9p
bnQgaW1wbGVtZW50YXRpb24uCisgICAgdm9pZCBSZWdpc3RlckRhdGFTb3VyY2UoY29uc3QgRGF0
YVNvdXJjZURlc2NyaXB0b3ImKSBvdmVycmlkZTsKKyAgICB2b2lkIFVucmVnaXN0ZXJEYXRhU291
cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKKyAgICB2b2lkIFJlZ2lzdGVy
VHJhY2VXcml0ZXIodWludDMyX3Qgd3JpdGVyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB1aW50MzJfdCB0YXJnZXRfYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIFVucmVnaXN0
ZXJUcmFjZVdyaXRlcih1aW50MzJfdCB3cml0ZXJfaWQpIG92ZXJyaWRlOworICAgIHZvaWQgQ29t
bWl0RGF0YShjb25zdCBDb21taXREYXRhUmVxdWVzdCYsIENvbW1pdERhdGFDYWxsYmFjaykgb3Zl
cnJpZGU7CisgICAgdm9pZCBTZXR1cFNoYXJlZE1lbW9yeShzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVk
TWVtb3J5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYWdlX3NpemVfYnl0
ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb3ZpZGVkX2J5X3Byb2R1Y2Vy
KTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhY2VXcml0ZXI+IENyZWF0ZVRyYWNlV3JpdGVyKAor
ICAgICAgICBCdWZmZXJJRCwKKyAgICAgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5KSBvdmVycmlk
ZTsKKyAgICBTaGFyZWRNZW1vcnlBcmJpdGVyKiBNYXliZVNoYXJlZE1lbW9yeUFyYml0ZXIoKSBv
dmVycmlkZTsKKyAgICBib29sIElzU2htZW1Qcm92aWRlZEJ5UHJvZHVjZXIoKSBjb25zdCBvdmVy
cmlkZTsKKyAgICB2b2lkIE5vdGlmeUZsdXNoQ29tcGxldGUoRmx1c2hSZXF1ZXN0SUQpIG92ZXJy
aWRlOworICAgIHZvaWQgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWQoRGF0YVNvdXJjZUluc3RhbmNl
SUQpIG92ZXJyaWRlOworICAgIHZvaWQgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoRGF0YVNvdXJj
ZUluc3RhbmNlSUQpIG92ZXJyaWRlOworICAgIFNoYXJlZE1lbW9yeSogc2hhcmVkX21lbW9yeSgp
IGNvbnN0IG92ZXJyaWRlOworICAgIHNpemVfdCBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYigp
IGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgQWN0aXZhdGVUcmlnZ2Vycyhjb25zdCBzdGQ6OnZl
Y3RvcjxzdGQ6OnN0cmluZz4mKSBvdmVycmlkZTsKKyAgICB2b2lkIFN5bmMoc3RkOjpmdW5jdGlv
bjx2b2lkKCk+IGNhbGxiYWNrKSBvdmVycmlkZTsKKworICAgIHZvaWQgT25UcmFjaW5nU2V0dXAo
KTsKKyAgICB2b2lkIFNldHVwRGF0YVNvdXJjZShEYXRhU291cmNlSW5zdGFuY2VJRCwgY29uc3Qg
RGF0YVNvdXJjZUNvbmZpZyYpOworICAgIHZvaWQgU3RhcnREYXRhU291cmNlKERhdGFTb3VyY2VJ
bnN0YW5jZUlELCBjb25zdCBEYXRhU291cmNlQ29uZmlnJik7CisgICAgdm9pZCBTdG9wRGF0YVNv
dXJjZShEYXRhU291cmNlSW5zdGFuY2VJRCk7CisgICAgdm9pZCBGbHVzaChGbHVzaFJlcXVlc3RJ
RCwgY29uc3Qgc3RkOjp2ZWN0b3I8RGF0YVNvdXJjZUluc3RhbmNlSUQ+Jik7CisgICAgdm9pZCBP
bkZyZWVCdWZmZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPEJ1ZmZlcklEPiYgdGFyZ2V0X2J1ZmZlcnMp
OworICAgIHZvaWQgQ2xlYXJJbmNyZW1lbnRhbFN0YXRlKGNvbnN0IHN0ZDo6dmVjdG9yPERhdGFT
b3VyY2VJbnN0YW5jZUlEPiYpOworCisgICAgYm9vbCBpc19hbGxvd2VkX3RhcmdldF9idWZmZXIo
QnVmZmVySUQgYnVmZmVyX2lkKSBjb25zdCB7CisgICAgICByZXR1cm4gYWxsb3dlZF90YXJnZXRf
YnVmZmVyc18uY291bnQoYnVmZmVyX2lkKTsKKyAgICB9CisKKyAgICBiYXNlOjpPcHRpb25hbDxC
dWZmZXJJRD4gYnVmZmVyX2lkX2Zvcl93cml0ZXIoV3JpdGVySUQgd3JpdGVyX2lkKSBjb25zdCB7
CisgICAgICBjb25zdCBhdXRvIGl0ID0gd3JpdGVyc18uZmluZCh3cml0ZXJfaWQpOworICAgICAg
aWYgKGl0ICE9IHdyaXRlcnNfLmVuZCgpKQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAg
ICAgIHJldHVybiBiYXNlOjpudWxsb3B0OworICAgIH0KKworICAgIHVpZF90IHVpZCgpIGNvbnN0
IHsgcmV0dXJuIHVpZF87IH0KKworICAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgVHJhY2lu
Z1NlcnZpY2VJbXBsOworICAgIGZyaWVuZCBjbGFzcyBUcmFjaW5nU2VydmljZUltcGxUZXN0Owor
ICAgIGZyaWVuZCBjbGFzcyBUcmFjaW5nSW50ZWdyYXRpb25UZXN0OworICAgIFByb2R1Y2VyRW5k
cG9pbnRJbXBsKGNvbnN0IFByb2R1Y2VyRW5kcG9pbnRJbXBsJikgPSBkZWxldGU7CisgICAgUHJv
ZHVjZXJFbmRwb2ludEltcGwmIG9wZXJhdG9yPShjb25zdCBQcm9kdWNlckVuZHBvaW50SW1wbCYp
ID0gZGVsZXRlOworCisgICAgUHJvZHVjZXJJRCBjb25zdCBpZF87CisgICAgY29uc3QgdWlkX3Qg
dWlkXzsKKyAgICBUcmFjaW5nU2VydmljZUltcGwqIGNvbnN0IHNlcnZpY2VfOworICAgIGJhc2U6
OlRhc2tSdW5uZXIqIGNvbnN0IHRhc2tfcnVubmVyXzsKKyAgICBQcm9kdWNlciogcHJvZHVjZXJf
OworICAgIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnk+IHNoYXJlZF9tZW1vcnlfOworICAg
IHNpemVfdCBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYl8gPSAwOworICAgIFNoYXJlZE1lbW9y
eUFCSSBzaG1lbV9hYmlfOworICAgIHNpemVfdCBzaG1lbV9zaXplX2hpbnRfYnl0ZXNfID0gMDsK
KyAgICBzaXplX3Qgc2htZW1fcGFnZV9zaXplX2hpbnRfYnl0ZXNfID0gMDsKKyAgICBib29sIGlz
X3NobWVtX3Byb3ZpZGVkX2J5X3Byb2R1Y2VyXyA9IGZhbHNlOworICAgIGNvbnN0IHN0ZDo6c3Ry
aW5nIG5hbWVfOworICAgIGJvb2wgaW5fcHJvY2Vzc187CisgICAgYm9vbCBzbWJfc2NyYXBpbmdf
ZW5hYmxlZF87CisKKyAgICAvLyBTZXQgb2YgdGhlIGdsb2JhbCB0YXJnZXRfYnVmZmVyIElEcyB0
aGF0IHRoZSBwcm9kdWNlciBpcyBjb25maWd1cmVkIHRvCisgICAgLy8gd3JpdGUgaW50byBpbiBh
bnkgYWN0aXZlIHRyYWNpbmcgc2Vzc2lvbi4KKyAgICBzdGQ6OnNldDxCdWZmZXJJRD4gYWxsb3dl
ZF90YXJnZXRfYnVmZmVyc187CisKKyAgICAvLyBNYXBzIHJlZ2lzdGVyZWQgVHJhY2VXcml0ZXIg
SURzIHRvIHRoZWlyIHRhcmdldCBidWZmZXJzIGFzIHJlZ2lzdGVyZWQgYnkKKyAgICAvLyB0aGUg
cHJvZHVjZXIuIE5vdGUgdGhhdCBwcm9kdWNlcnMgYXJlbid0IHJlcXVpcmVkIHRvIHJlZ2lzdGVy
IHRoZWlyCisgICAgLy8gd3JpdGVycywgc28gd2UgbWF5IHNlZSBjb21taXRzIG9mIGNodW5rcyB3
aXRoIFdyaXRlcklEcyB0aGF0IGFyZW4ndAorICAgIC8vIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4g
SG93ZXZlciwgaWYgYSBwcm9kdWNlciBkb2VzIHJlZ2lzdGVyIGEgd3JpdGVyLCB0aGUKKyAgICAv
LyBzZXJ2aWNlIHdpbGwgcHJldmVudCB0aGUgd3JpdGVyIGZyb20gd3JpdGluZyBpbnRvIGFueSBv
dGhlciBidWZmZXIgdGhhbgorICAgIC8vIHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIGl0IGhlcmUu
IFRoZSBCdWZmZXJJRHMgc3RvcmVkIGluIHRoaXMgbWFwIGFyZQorICAgIC8vIHVudHJ1c3RlZCwg
c28gbmVlZCB0byBiZSB2ZXJpZmllZCBhZ2FpbnN0IHxhbGxvd2VkX3RhcmdldF9idWZmZXJzX3wK
KyAgICAvLyBiZWZvcmUgdXNlLgorICAgIHN0ZDo6bWFwPFdyaXRlcklELCBCdWZmZXJJRD4gd3Jp
dGVyc187CisKKyAgICAvLyBUaGlzIGlzIHVzZWQgb25seSBpbiBpbi1wcm9jZXNzIGNvbmZpZ3Vy
YXRpb25zLgorICAgIC8vIFNoYXJlZE1lbW9yeUFyYml0ZXJJbXBsIG1ldGhvZHMgdGhlbXNlbHZl
cyBhcmUgdGhyZWFkLXNhZmUuCisgICAgc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeUFyYml0
ZXJJbXBsPiBpbnByb2Nfc2htZW1fYXJiaXRlcl87CisKKyAgICBQRVJGRVRUT19USFJFQURfQ0hF
Q0tFUih0aHJlYWRfY2hlY2tlcl8pCisgICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8UHJvZHVjZXJF
bmRwb2ludEltcGw+IHdlYWtfcHRyX2ZhY3RvcnlfOyAgLy8gS2VlcCBsYXN0LgorICB9OworCisg
IC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBiZWhpbmQgdGhlIHNlcnZpY2UgZW5kcG9pbnQgZXhwb3Nl
ZCB0byBlYWNoIGNvbnN1bWVyLgorICBjbGFzcyBDb25zdW1lckVuZHBvaW50SW1wbCA6IHB1Ymxp
YyBUcmFjaW5nU2VydmljZTo6Q29uc3VtZXJFbmRwb2ludCB7CisgICBwdWJsaWM6CisgICAgQ29u
c3VtZXJFbmRwb2ludEltcGwoVHJhY2luZ1NlcnZpY2VJbXBsKiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICBiYXNlOjpUYXNrUnVubmVyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb25z
dW1lciosCisgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICB+Q29uc3Vt
ZXJFbmRwb2ludEltcGwoKSBvdmVycmlkZTsKKworICAgIHZvaWQgTm90aWZ5T25UcmFjaW5nRGlz
YWJsZWQoKTsKKyAgICBiYXNlOjpXZWFrUHRyPENvbnN1bWVyRW5kcG9pbnRJbXBsPiBHZXRXZWFr
UHRyKCk7CisKKyAgICAvLyBUcmFjaW5nU2VydmljZTo6Q29uc3VtZXJFbmRwb2ludCBpbXBsZW1l
bnRhdGlvbi4KKyAgICB2b2lkIEVuYWJsZVRyYWNpbmcoY29uc3QgVHJhY2VDb25maWcmLCBiYXNl
OjpTY29wZWRGaWxlKSBvdmVycmlkZTsKKyAgICB2b2lkIENoYW5nZVRyYWNlQ29uZmlnKGNvbnN0
IFRyYWNlQ29uZmlnJiBjZmcpIG92ZXJyaWRlOworICAgIHZvaWQgU3RhcnRUcmFjaW5nKCkgb3Zl
cnJpZGU7CisgICAgdm9pZCBEaXNhYmxlVHJhY2luZygpIG92ZXJyaWRlOworICAgIHZvaWQgUmVh
ZEJ1ZmZlcnMoKSBvdmVycmlkZTsKKyAgICB2b2lkIEZyZWVCdWZmZXJzKCkgb3ZlcnJpZGU7Cisg
ICAgdm9pZCBGbHVzaCh1aW50MzJfdCB0aW1lb3V0X21zLCBGbHVzaENhbGxiYWNrKSBvdmVycmlk
ZTsKKyAgICB2b2lkIERldGFjaChjb25zdCBzdGQ6OnN0cmluZyYga2V5KSBvdmVycmlkZTsKKyAg
ICB2b2lkIEF0dGFjaChjb25zdCBzdGQ6OnN0cmluZyYga2V5KSBvdmVycmlkZTsKKyAgICB2b2lk
IEdldFRyYWNlU3RhdHMoKSBvdmVycmlkZTsKKyAgICB2b2lkIE9ic2VydmVFdmVudHModWludDMy
X3QgZW5hYmxlZF9ldmVudF90eXBlcykgb3ZlcnJpZGU7CisgICAgdm9pZCBRdWVyeVNlcnZpY2VT
dGF0ZShRdWVyeVNlcnZpY2VTdGF0ZUNhbGxiYWNrKSBvdmVycmlkZTsKKyAgICB2b2lkIFF1ZXJ5
Q2FwYWJpbGl0aWVzKFF1ZXJ5Q2FwYWJpbGl0aWVzQ2FsbGJhY2spIG92ZXJyaWRlOworCisgICAg
Ly8gV2lsbCBxdWV1ZSBhIHRhc2sgdG8gbm90aWZ5IHRoZSBjb25zdW1lciBhYm91dCB0aGUgc3Rh
dGUgY2hhbmdlLgorICAgIHZvaWQgT25EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZShjb25z
dCBQcm9kdWNlckVuZHBvaW50SW1wbCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IERhdGFTb3VyY2VJbnN0YW5jZSYpOworICAgIHZvaWQgT25BbGxEYXRh
U291cmNlc1N0YXJ0ZWQoKTsKKworICAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgVHJhY2lu
Z1NlcnZpY2VJbXBsOworICAgIENvbnN1bWVyRW5kcG9pbnRJbXBsKGNvbnN0IENvbnN1bWVyRW5k
cG9pbnRJbXBsJikgPSBkZWxldGU7CisgICAgQ29uc3VtZXJFbmRwb2ludEltcGwmIG9wZXJhdG9y
PShjb25zdCBDb25zdW1lckVuZHBvaW50SW1wbCYpID0gZGVsZXRlOworCisgICAgLy8gUmV0dXJu
cyBhIHBvaW50ZXIgdG8gYW4gT2JzZXJ2YWJsZUV2ZW50cyBvYmplY3QgdGhhdCB0aGUgY2FsbGVy
IGNhbiBmaWxsCisgICAgLy8gYW5kIHNjaGVkdWxlcyBhIHRhc2sgdG8gc2VuZCB0aGUgT2JzZXJ2
YWJsZUV2ZW50cyB0byB0aGUgY29uc3VtZXIuCisgICAgT2JzZXJ2YWJsZUV2ZW50cyogQWRkT2Jz
ZXJ2YWJsZUV2ZW50cygpOworCisgICAgYmFzZTo6VGFza1J1bm5lciogY29uc3QgdGFza19ydW5u
ZXJfOworICAgIFRyYWNpbmdTZXJ2aWNlSW1wbCogY29uc3Qgc2VydmljZV87CisgICAgQ29uc3Vt
ZXIqIGNvbnN0IGNvbnN1bWVyXzsKKyAgICB1aWRfdCBjb25zdCB1aWRfOworICAgIFRyYWNpbmdT
ZXNzaW9uSUQgdHJhY2luZ19zZXNzaW9uX2lkXyA9IDA7CisKKyAgICAvLyBXaGV0aGVyIHRoZSBj
b25zdW1lciBpcyBpbnRlcmVzdGVkIGluIERhdGFTb3VyY2VJbnN0YW5jZSBzdGF0ZSBjaGFuZ2UK
KyAgICAvLyBldmVudHMuCisgICAgdWludDMyX3Qgb2JzZXJ2YWJsZV9ldmVudHNfbWFza18gPSAw
OworCisgICAgLy8gT2JzZXJ2YWJsZUV2ZW50cyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgY29u
c3VtZXIuIElmIHNldCwgYSB0YXNrIHRvCisgICAgLy8gZmx1c2ggdGhlIGV2ZW50cyB0byB0aGUg
Y29uc3VtZXIgaGFzIGJlZW4gcXVldWVkLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxPYnNlcnZhYmxl
RXZlbnRzPiBvYnNlcnZhYmxlX2V2ZW50c187CisKKyAgICBQRVJGRVRUT19USFJFQURfQ0hFQ0tF
Uih0aHJlYWRfY2hlY2tlcl8pCisgICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8Q29uc3VtZXJFbmRw
b2ludEltcGw+IHdlYWtfcHRyX2ZhY3RvcnlfOyAgLy8gS2VlcCBsYXN0LgorICB9OworCisgIGV4
cGxpY2l0IFRyYWNpbmdTZXJ2aWNlSW1wbChzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5OjpG
YWN0b3J5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRhc2tSdW5uZXIq
KTsKKyAgflRyYWNpbmdTZXJ2aWNlSW1wbCgpIG92ZXJyaWRlOworCisgIC8vIENhbGxlZCBieSBQ
cm9kdWNlckVuZHBvaW50SW1wbC4KKyAgdm9pZCBEaXNjb25uZWN0UHJvZHVjZXIoUHJvZHVjZXJJ
RCk7CisgIHZvaWQgUmVnaXN0ZXJEYXRhU291cmNlKFByb2R1Y2VySUQsIGNvbnN0IERhdGFTb3Vy
Y2VEZXNjcmlwdG9yJik7CisgIHZvaWQgVW5yZWdpc3RlckRhdGFTb3VyY2UoUHJvZHVjZXJJRCwg
Y29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworICB2b2lkIENvcHlQcm9kdWNlclBhZ2VJbnRvTG9n
QnVmZmVyKFByb2R1Y2VySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVySUQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtJRCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJRCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fZnJhZ21lbnRzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2h1bmtfZmxhZ3MsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjaHVua19jb21wbGV0ZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOworICB2b2lkIEFwcGx5Q2h1
bmtQYXRjaGVzKFByb2R1Y2VySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3Rk
Ojp2ZWN0b3I8Q29tbWl0RGF0YVJlcXVlc3Q6OkNodW5rVG9QYXRjaD4mKTsKKyAgdm9pZCBOb3Rp
ZnlGbHVzaERvbmVGb3JQcm9kdWNlcihQcm9kdWNlcklELCBGbHVzaFJlcXVlc3RJRCk7CisgIHZv
aWQgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWQoUHJvZHVjZXJJRCwgY29uc3QgRGF0YVNvdXJjZUlu
c3RhbmNlSUQpOworICB2b2lkIE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkKFByb2R1Y2VySUQsIGNv
bnN0IERhdGFTb3VyY2VJbnN0YW5jZUlEKTsKKyAgdm9pZCBBY3RpdmF0ZVRyaWdnZXJzKFByb2R1
Y2VySUQsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdHJpZ2dlcnMpOworCisgIC8v
IENhbGxlZCBieSBDb25zdW1lckVuZHBvaW50SW1wbC4KKyAgYm9vbCBEZXRhY2hDb25zdW1lcihD
b25zdW1lckVuZHBvaW50SW1wbCosIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOworICBib29sIEF0
dGFjaENvbnN1bWVyKENvbnN1bWVyRW5kcG9pbnRJbXBsKiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtl
eSk7CisgIHZvaWQgRGlzY29ubmVjdENvbnN1bWVyKENvbnN1bWVyRW5kcG9pbnRJbXBsKik7Cisg
IGJvb2wgRW5hYmxlVHJhY2luZyhDb25zdW1lckVuZHBvaW50SW1wbCosCisgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBUcmFjZUNvbmZpZyYsCisgICAgICAgICAgICAgICAgICAgICBiYXNlOjpT
Y29wZWRGaWxlKTsKKyAgdm9pZCBDaGFuZ2VUcmFjZUNvbmZpZyhDb25zdW1lckVuZHBvaW50SW1w
bCosIGNvbnN0IFRyYWNlQ29uZmlnJik7CisKKyAgYm9vbCBTdGFydFRyYWNpbmcoVHJhY2luZ1Nl
c3Npb25JRCk7CisgIHZvaWQgRGlzYWJsZVRyYWNpbmcoVHJhY2luZ1Nlc3Npb25JRCwgYm9vbCBk
aXNhYmxlX2ltbWVkaWF0ZWx5ID0gZmFsc2UpOworICB2b2lkIEZsdXNoKFRyYWNpbmdTZXNzaW9u
SUQgdHNpZCwKKyAgICAgICAgICAgICB1aW50MzJfdCB0aW1lb3V0X21zLAorICAgICAgICAgICAg
IENvbnN1bWVyRW5kcG9pbnQ6OkZsdXNoQ2FsbGJhY2spOworICB2b2lkIEZsdXNoQW5kRGlzYWJs
ZVRyYWNpbmcoVHJhY2luZ1Nlc3Npb25JRCk7CisgIGJvb2wgUmVhZEJ1ZmZlcnMoVHJhY2luZ1Nl
c3Npb25JRCwgQ29uc3VtZXJFbmRwb2ludEltcGwqKTsKKyAgdm9pZCBGcmVlQnVmZmVycyhUcmFj
aW5nU2Vzc2lvbklEKTsKKworICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgorICBzdGQ6OnVu
aXF1ZV9wdHI8VHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyRW5kcG9pbnQ+IENvbm5lY3RQcm9kdWNl
cigKKyAgICAgIFByb2R1Y2VyKiwKKyAgICAgIHVpZF90IHVpZCwKKyAgICAgIGNvbnN0IHN0ZDo6
c3RyaW5nJiBwcm9kdWNlcl9uYW1lLAorICAgICAgc2l6ZV90IHNoYXJlZF9tZW1vcnlfc2l6ZV9o
aW50X2J5dGVzID0gMCwKKyAgICAgIGJvb2wgaW5fcHJvY2VzcyA9IGZhbHNlLAorICAgICAgUHJv
ZHVjZXJTTUJTY3JhcGluZ01vZGUgc21iX3NjcmFwaW5nX21vZGUgPQorICAgICAgICAgIFByb2R1
Y2VyU01CU2NyYXBpbmdNb2RlOjprRGVmYXVsdCwKKyAgICAgIHNpemVfdCBzaGFyZWRfbWVtb3J5
X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzID0gMCwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRN
ZW1vcnk+IHNobSA9IG51bGxwdHIpIG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxUcmFj
aW5nU2VydmljZTo6Q29uc3VtZXJFbmRwb2ludD4gQ29ubmVjdENvbnN1bWVyKAorICAgICAgQ29u
c3VtZXIqLAorICAgICAgdWlkX3QpIG92ZXJyaWRlOworCisgIC8vIFNldCB3aGV0aGVyIFNNQiBz
Y3JhcGluZyBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0IG9yIG5vdC4gUHJvZHVjZXJzIGNh
bgorICAvLyBvdmVycmlkZSB0aGlzIHNldHRpbmcgZm9yIHRoZWlyIG93biBTTUJzLgorICB2b2lk
IFNldFNNQlNjcmFwaW5nRW5hYmxlZChib29sIGVuYWJsZWQpIG92ZXJyaWRlIHsKKyAgICBzbWJf
c2NyYXBpbmdfZW5hYmxlZF8gPSBlbmFibGVkOworICB9CisKKyAgLy8gRXhwb3NlZCBtYWlubHkg
Zm9yIHRlc3RpbmcuCisgIHNpemVfdCBudW1fcHJvZHVjZXJzKCkgY29uc3QgeyByZXR1cm4gcHJv
ZHVjZXJzXy5zaXplKCk7IH0KKyAgUHJvZHVjZXJFbmRwb2ludEltcGwqIEdldFByb2R1Y2VyKFBy
b2R1Y2VySUQpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRyYWNpbmdTZXJ2
aWNlSW1wbFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBUcmFjaW5nSW50ZWdyYXRpb25UZXN0OworCisg
IHN0cnVjdCBSZWdpc3RlcmVkRGF0YVNvdXJjZSB7CisgICAgUHJvZHVjZXJJRCBwcm9kdWNlcl9p
ZDsKKyAgICBEYXRhU291cmNlRGVzY3JpcHRvciBkZXNjcmlwdG9yOworICB9OworCisgIC8vIFJl
cHJlc2VudHMgYW4gYWN0aXZlIGRhdGEgc291cmNlIGZvciBhIHRyYWNpbmcgc2Vzc2lvbi4KKyAg
c3RydWN0IERhdGFTb3VyY2VJbnN0YW5jZSB7CisgICAgRGF0YVNvdXJjZUluc3RhbmNlKERhdGFT
b3VyY2VJbnN0YW5jZUlEIGlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhU291
cmNlQ29uZmlnJiBjZmcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5n
JiBkc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vdGlmeV9vbl9zdGFydCwK
KyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlfb25fc3RvcCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCBoYW5kbGVzX2luY3JlbWVudGFsX3N0YXRlX2ludmFsaWRhdGlvbikK
KyAgICAgICAgOiBpbnN0YW5jZV9pZChpZCksCisgICAgICAgICAgY29uZmlnKGNmZyksCisgICAg
ICAgICAgZGF0YV9zb3VyY2VfbmFtZShkc19uYW1lKSwKKyAgICAgICAgICB3aWxsX25vdGlmeV9v
bl9zdGFydChub3RpZnlfb25fc3RhcnQpLAorICAgICAgICAgIHdpbGxfbm90aWZ5X29uX3N0b3Ao
bm90aWZ5X29uX3N0b3ApLAorICAgICAgICAgIGhhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfY2xl
YXIoCisgICAgICAgICAgICAgIGhhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfaW52YWxpZGF0aW9u
KSB7fQorICAgIERhdGFTb3VyY2VJbnN0YW5jZShjb25zdCBEYXRhU291cmNlSW5zdGFuY2UmKSA9
IGRlbGV0ZTsKKyAgICBEYXRhU291cmNlSW5zdGFuY2UmIG9wZXJhdG9yPShjb25zdCBEYXRhU291
cmNlSW5zdGFuY2UmKSA9IGRlbGV0ZTsKKworICAgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGluc3Rh
bmNlX2lkOworICAgIERhdGFTb3VyY2VDb25maWcgY29uZmlnOworICAgIHN0ZDo6c3RyaW5nIGRh
dGFfc291cmNlX25hbWU7CisgICAgYm9vbCB3aWxsX25vdGlmeV9vbl9zdGFydDsKKyAgICBib29s
IHdpbGxfbm90aWZ5X29uX3N0b3A7CisgICAgYm9vbCBoYW5kbGVzX2luY3JlbWVudGFsX3N0YXRl
X2NsZWFyOworCisgICAgZW51bSBEYXRhU291cmNlSW5zdGFuY2VTdGF0ZSB7CisgICAgICBDT05G
SUdVUkVELAorICAgICAgU1RBUlRJTkcsCisgICAgICBTVEFSVEVELAorICAgICAgU1RPUFBJTkcs
CisgICAgICBTVE9QUEVECisgICAgfTsKKyAgICBEYXRhU291cmNlSW5zdGFuY2VTdGF0ZSBzdGF0
ZSA9IENPTkZJR1VSRUQ7CisgIH07CisKKyAgc3RydWN0IFBlbmRpbmdGbHVzaCB7CisgICAgc3Rk
OjpzZXQ8UHJvZHVjZXJJRD4gcHJvZHVjZXJzOworICAgIENvbnN1bWVyRW5kcG9pbnQ6OkZsdXNo
Q2FsbGJhY2sgY2FsbGJhY2s7CisgICAgZXhwbGljaXQgUGVuZGluZ0ZsdXNoKGRlY2x0eXBlKGNh
bGxiYWNrKSBjYikgOiBjYWxsYmFjayhzdGQ6Om1vdmUoY2IpKSB7fQorICB9OworCisgIC8vIEhv
bGRzIHRoZSBzdGF0ZSBvZiBhIHRyYWNpbmcgc2Vzc2lvbi4gQSB0cmFjaW5nIHNlc3Npb24gaXMg
dW5pcXVlbHkgYm91bmQKKyAgLy8gYSBzcGVjaWZpYyBDb25zdW1lci4gRWFjaCBDb25zdW1lciBj
YW4gb3duIG9uZSBvciBtb3JlIHNlc3Npb25zLgorICBzdHJ1Y3QgVHJhY2luZ1Nlc3Npb24gewor
ICAgIGVudW0gU3RhdGUgeworICAgICAgRElTQUJMRUQgPSAwLAorICAgICAgQ09ORklHVVJFRCwK
KyAgICAgIFNUQVJURUQsCisgICAgICBESVNBQkxJTkdfV0FJVElOR19TVE9QX0FDS1MKKyAgICB9
OworCisgICAgVHJhY2luZ1Nlc3Npb24oVHJhY2luZ1Nlc3Npb25JRCwgQ29uc3VtZXJFbmRwb2lu
dEltcGwqLCBjb25zdCBUcmFjZUNvbmZpZyYpOworCisgICAgc2l6ZV90IG51bV9idWZmZXJzKCkg
Y29uc3QgeyByZXR1cm4gYnVmZmVyc19pbmRleC5zaXplKCk7IH0KKworICAgIHVpbnQzMl90IGRl
bGF5X3RvX25leHRfd3JpdGVfcGVyaW9kX21zKCkgY29uc3QgeworICAgICAgUEVSRkVUVE9fRENI
RUNLKHdyaXRlX3BlcmlvZF9tcyA+IDApOworICAgICAgcmV0dXJuIHdyaXRlX3BlcmlvZF9tcyAt
CisgICAgICAgICAgICAgKGJhc2U6OkdldFdhbGxUaW1lTXMoKS5jb3VudCgpICUgd3JpdGVfcGVy
aW9kX21zKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmbHVzaF90aW1lb3V0X21zKCkgeworICAg
ICAgdWludDMyX3QgdGltZW91dF9tcyA9IGNvbmZpZy5mbHVzaF90aW1lb3V0X21zKCk7CisgICAg
ICByZXR1cm4gdGltZW91dF9tcyA/IHRpbWVvdXRfbXMgOiBrRGVmYXVsdEZsdXNoVGltZW91dE1z
OworICAgIH0KKworICAgIHVpbnQzMl90IGRhdGFfc291cmNlX3N0b3BfdGltZW91dF9tcygpIHsK
KyAgICAgIHVpbnQzMl90IHRpbWVvdXRfbXMgPSBjb25maWcuZGF0YV9zb3VyY2Vfc3RvcF90aW1l
b3V0X21zKCk7CisgICAgICByZXR1cm4gdGltZW91dF9tcyA/IHRpbWVvdXRfbXMgOiBrRGF0YVNv
dXJjZVN0b3BUaW1lb3V0TXM7CisgICAgfQorCisgICAgUGFja2V0U2VxdWVuY2VJRCBHZXRQYWNr
ZXRTZXF1ZW5jZUlEKFByb2R1Y2VySUQgcHJvZHVjZXJfaWQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFdyaXRlcklEIHdyaXRlcl9pZCkgeworICAgICAgYXV0byBr
ZXkgPSBzdGQ6Om1ha2VfcGFpcihwcm9kdWNlcl9pZCwgd3JpdGVyX2lkKTsKKyAgICAgIGF1dG8g
aXQgPSBwYWNrZXRfc2VxdWVuY2VfaWRzLmZpbmQoa2V5KTsKKyAgICAgIGlmIChpdCAhPSBwYWNr
ZXRfc2VxdWVuY2VfaWRzLmVuZCgpKQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAg
IC8vIFdlIHNob3VsZG4ndCBydW4gb3V0IG9mIHNlcXVlbmNlIElEcyAocHJvZHVjZXIgSUQgaXMg
MTYgYml0LCB3cml0ZXIgSURzCisgICAgICAvLyBhcmUgbGltaXRlZCB0byAxMDI0KS4KKyAgICAg
IHN0YXRpY19hc3NlcnQoa01heFBhY2tldFNlcXVlbmNlSUQgPiBrTWF4UHJvZHVjZXJJRCAqIGtN
YXhXcml0ZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIlBhY2tldFNlcXVlbmNlSUQgdmFsdWUg
c3BhY2UgZG9lc24ndCBjb3ZlciBzZXJ2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgInNlcXVl
bmNlIElEIGFuZCBhbGwgcHJvZHVjZXIvd3JpdGVyIElEIGNvbWJpbmF0aW9ucyEiKTsKKyAgICAg
IFBFUkZFVFRPX0RDSEVDSyhsYXN0X3BhY2tldF9zZXF1ZW5jZV9pZCA8IGtNYXhQYWNrZXRTZXF1
ZW5jZUlEKTsKKyAgICAgIFBhY2tldFNlcXVlbmNlSUQgc2VxdWVuY2VfaWQgPSArK2xhc3RfcGFj
a2V0X3NlcXVlbmNlX2lkOworICAgICAgcGFja2V0X3NlcXVlbmNlX2lkc1trZXldID0gc2VxdWVu
Y2VfaWQ7CisgICAgICByZXR1cm4gc2VxdWVuY2VfaWQ7CisgICAgfQorCisgICAgRGF0YVNvdXJj
ZUluc3RhbmNlKiBHZXREYXRhU291cmNlSW5zdGFuY2UoCisgICAgICAgIFByb2R1Y2VySUQgcHJv
ZHVjZXJfaWQsCisgICAgICAgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGluc3RhbmNlX2lkKSB7Cisg
ICAgICBmb3IgKGF1dG8mIGluc3Rfa3YgOiBkYXRhX3NvdXJjZV9pbnN0YW5jZXMpIHsKKyAgICAg
ICAgaWYgKGluc3Rfa3YuZmlyc3QgIT0gcHJvZHVjZXJfaWQgfHwKKyAgICAgICAgICAgIGluc3Rf
a3Yuc2Vjb25kLmluc3RhbmNlX2lkICE9IGluc3RhbmNlX2lkKSB7CisgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICZpbnN0X2t2LnNlY29uZDsKKyAgICAgIH0K
KyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgQWxsRGF0YVNvdXJjZUlu
c3RhbmNlc1N0YXJ0ZWQoKSB7CisgICAgICByZXR1cm4gc3RkOjphbGxfb2YoCisgICAgICAgICAg
ZGF0YV9zb3VyY2VfaW5zdGFuY2VzLmJlZ2luKCksIGRhdGFfc291cmNlX2luc3RhbmNlcy5lbmQo
KSwKKyAgICAgICAgICBbXShkZWNsdHlwZShkYXRhX3NvdXJjZV9pbnN0YW5jZXMpOjpjb25zdF9y
ZWZlcmVuY2UgeCkgeworICAgICAgICAgICAgcmV0dXJuIHguc2Vjb25kLnN0YXRlID09IERhdGFT
b3VyY2VJbnN0YW5jZTo6U1RBUlRFRDsKKyAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBib29s
IEFsbERhdGFTb3VyY2VJbnN0YW5jZXNTdG9wcGVkKCkgeworICAgICAgcmV0dXJuIHN0ZDo6YWxs
X29mKAorICAgICAgICAgIGRhdGFfc291cmNlX2luc3RhbmNlcy5iZWdpbigpLCBkYXRhX3NvdXJj
ZV9pbnN0YW5jZXMuZW5kKCksCisgICAgICAgICAgW10oZGVjbHR5cGUoZGF0YV9zb3VyY2VfaW5z
dGFuY2VzKTo6Y29uc3RfcmVmZXJlbmNlIHgpIHsKKyAgICAgICAgICAgIHJldHVybiB4LnNlY29u
ZC5zdGF0ZSA9PSBEYXRhU291cmNlSW5zdGFuY2U6OlNUT1BQRUQ7CisgICAgICAgICAgfSk7Cisg
ICAgfQorCisgICAgY29uc3QgVHJhY2luZ1Nlc3Npb25JRCBpZDsKKworICAgIC8vIFRoZSBjb25z
dW1lciB0aGF0IHN0YXJ0ZWQgdGhlIHNlc3Npb24uCisgICAgLy8gQ2FuIGJlIG51bGxwdHIgaWYg
dGhlIGNvbnN1bWVyIGRldGFjaGVkIGZyb20gdGhlIHNlc3Npb24uCisgICAgQ29uc3VtZXJFbmRw
b2ludEltcGwqIGNvbnN1bWVyX21heWJlX251bGw7CisKKyAgICAvLyBVbml4IHVpZCBvZiB0aGUg
Y29uc3VtZXIuIFRoaXMgaXMgdmFsaWQgZXZlbiBhZnRlciB0aGUgY29uc3VtZXIgZGV0YWNoZXMK
KyAgICAvLyBhbmQgZG9lcyBub3QgY2hhbmdlIGZvciB0aGUgZW50aXJlIGR1cmF0aW9uIG9mIHRo
ZSBzZXNzaW9uLiBJdCBpcyB1c2VkIHRvCisgICAgLy8gcHJldmVudCB0aGF0IGEgY29uc3VtZXIg
cmUtYXR0YWNoZXMgdG8gYSBzZXNzaW9uIGZyb20gYSBkaWZmZXJlbnQgdWlkLgorICAgIHVpZF90
IGNvbnN0IGNvbnN1bWVyX3VpZDsKKworICAgIC8vIFRoZSBsaXN0IG9mIHRyaWdnZXJzIHRoaXMg
c2Vzc2lvbiByZWNlaXZlZCB3aGlsZSBhbGl2ZSBhbmQgdGhlIHRpbWUgdGhleQorICAgIC8vIHdl
cmUgcmVjZWl2ZWQgYXQuIFRoaXMgaXMgdXNlZCB0byBpbnNlcnQgJ2Zha2UnIHBhY2tldHMgYmFj
ayB0byB0aGUKKyAgICAvLyBjb25zdW1lciBzbyB0aGV5IGNhbiB0ZWxsIHdoZW4gc29tZSBldmVu
dCBoYXBwZW5lZC4gVGhlIG9yZGVyIG1hdGNoZXMgdGhlCisgICAgLy8gb3JkZXIgdGhleSB3ZXJl
IHJlY2VpdmVkLgorICAgIHN0cnVjdCBUcmlnZ2VySW5mbyB7CisgICAgICB1aW50NjRfdCBib290
X3RpbWVfbnM7CisgICAgICBzdGQ6OnN0cmluZyB0cmlnZ2VyX25hbWU7CisgICAgICBzdGQ6OnN0
cmluZyBwcm9kdWNlcl9uYW1lOworICAgICAgdWlkX3QgcHJvZHVjZXJfdWlkOworICAgIH07Cisg
ICAgc3RkOjp2ZWN0b3I8VHJpZ2dlckluZm8+IHJlY2VpdmVkX3RyaWdnZXJzOworCisgICAgLy8g
VGhlIHRyYWNlIGNvbmZpZyBwcm92aWRlZCBieSB0aGUgQ29uc3VtZXIgd2hlbiBjYWxsaW5nCisg
ICAgLy8gRW5hYmxlVHJhY2luZygpLCBwbHVzIGFueSB1cGRhdGVzIHBlcmZvcm1lZCBieSBDaGFu
Z2VUcmFjZUNvbmZpZy4KKyAgICBUcmFjZUNvbmZpZyBjb25maWc7CisKKyAgICAvLyBMaXN0IG9m
IGRhdGEgc291cmNlIGluc3RhbmNlcyB0aGF0IGhhdmUgYmVlbiBlbmFibGVkIG9uIHRoZSB2YXJp
b3VzCisgICAgLy8gcHJvZHVjZXJzIGZvciB0aGlzIHRyYWNpbmcgc2Vzc2lvbi4KKyAgICAvLyBU
T0RPKHJzYXZpdHNraSk6IGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIHRoZSBtYXAgc3RydWN0dXJl
IGlzIHVudXNlZAorICAgIC8vIChldmVuIHdoZW4gdGhlIGNhbGxpbmcgY29kZSBoYXMgYSBrZXkp
LiBUaGlzIGlzIGFsc28gYW4gb3Bwb3J0dW5pdHkgdG8KKyAgICAvLyBjb25zaWRlciBhbiBhbHRl
cm5hdGl2ZSBkYXRhIHR5cGUsIGUuZy4gYSBtYXAgb2YgdmVjdG9ycy4KKyAgICBzdGQ6Om11bHRp
bWFwPFByb2R1Y2VySUQsIERhdGFTb3VyY2VJbnN0YW5jZT4gZGF0YV9zb3VyY2VfaW5zdGFuY2Vz
OworCisgICAgLy8gRm9yIGVhY2ggRmx1c2goTikgcmVxdWVzdCwga2VlcHMgdHJhY2sgb2YgdGhl
IHNldCBvZiBwcm9kdWNlcnMgZm9yIHdoaWNoCisgICAgLy8gd2UgYXJlIHN0aWxsIGF3YWl0aW5n
IGEgTm90aWZ5Rmx1c2hDb21wbGV0ZShOKSBhY2suCisgICAgc3RkOjptYXA8Rmx1c2hSZXF1ZXN0
SUQsIFBlbmRpbmdGbHVzaD4gcGVuZGluZ19mbHVzaGVzOworCisgICAgLy8gTWFwcyBhIHBlci10
cmFjZS1zZXNzaW9uIGJ1ZmZlciBpbmRleCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGdsb2JhbAor
ICAgIC8vIEJ1ZmZlcklEIChzaGFyZWQgbmFtZXNwYWNlIGFtb25nc3QgYWxsIGNvbnN1bWVycyku
IFRoaXMgdmVjdG9yIGhhcyBhcworICAgIC8vIG1hbnkgZW50cmllcyBhcyB8Y29uZmlnLmJ1ZmZl
cnNfc2l6ZSgpfC4KKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJRD4gYnVmZmVyc19pbmRleDsKKwor
ICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxQcm9kdWNlcklELCBXcml0ZXJJRD4sIFBhY2tldFNlcXVl
bmNlSUQ+CisgICAgICAgIHBhY2tldF9zZXF1ZW5jZV9pZHM7CisgICAgUGFja2V0U2VxdWVuY2VJ
RCBsYXN0X3BhY2tldF9zZXF1ZW5jZV9pZCA9IGtTZXJ2aWNlUGFja2V0U2VxdWVuY2VJRDsKKwor
ICAgIC8vIFdoZXRoZXIgd2Ugc2hvdWxkIGVtaXQgdGhlIHRyYWNlIHN0YXRzIG5leHQgdGltZSB3
ZSByZWFjaCBFT0Ygd2hpbGUKKyAgICAvLyBwZXJmb3JtaW5nIFJlYWRCdWZmZXJzLgorICAgIGJv
b2wgc2hvdWxkX2VtaXRfc3RhdHMgPSBmYWxzZTsKKworICAgIC8vIFdoZXRoZXIgd2Ugc2hvdWxk
IGVtaXQgdGhlIHN5bmMgbWFya2VyIHRoZSBuZXh0IHRpbWUgUmVhZEJ1ZmZlcnMoKSBpcworICAg
IC8vIGNhbGxlZC4KKyAgICBib29sIHNob3VsZF9lbWl0X3N5bmNfbWFya2VyID0gZmFsc2U7CisK
KyAgICAvLyBXaGV0aGVyIHdlIG1pcnJvcmVkIHRoZSB0cmFjZSBjb25maWcgYmFjayB0byB0aGUg
dHJhY2Ugb3V0cHV0IHlldC4KKyAgICBib29sIGRpZF9lbWl0X2NvbmZpZyA9IGZhbHNlOworCisg
ICAgLy8gV2hldGhlciB3ZSBwdXQgdGhlIHN5c3RlbSBpbmZvIGludG8gdGhlIHRyYWNlIG91dHB1
dCB5ZXQuCisgICAgYm9vbCBkaWRfZW1pdF9zeXN0ZW1faW5mbyA9IGZhbHNlOworCisgICAgLy8g
VGhlIG51bWJlciBvZiByZWNlaXZlZCB0cmlnZ2VycyB3ZSd2ZSBlbWl0dGVkIGludG8gdGhlIHRy
YWNlIG91dHB1dC4KKyAgICBzaXplX3QgbnVtX3RyaWdnZXJzX2VtaXR0ZWRfaW50b190cmFjZSA9
IDA7CisKKyAgICAvLyBQYWNrZXRzIHRoYXQgZmFpbGVkIHZhbGlkYXRpb24gb2YgdGhlIFRydXN0
ZWRQYWNrZXQuCisgICAgdWludDY0X3QgaW52YWxpZF9wYWNrZXRzID0gMDsKKworICAgIC8vIFNl
dCB0byB0cnVlIG9uIHRoZSBmaXJzdCBjYWxsIHRvIE9uQWxsRGF0YVNvdXJjZXNTdGFydGVkKCku
CisgICAgYm9vbCBkaWRfbm90aWZ5X2FsbF9kYXRhX3NvdXJjZV9zdGFydGVkID0gZmFsc2U7Cisg
ICAgYm9vbCBkaWRfZW1pdF9hbGxfZGF0YV9zb3VyY2Vfc3RhcnRlZCA9IGZhbHNlOworICAgIGJh
c2U6OlRpbWVOYW5vcyB0aW1lX2FsbF9kYXRhX3NvdXJjZV9zdGFydGVkID0ge307CisKKyAgICB1
c2luZyBDbG9ja1NuYXBzaG90RGF0YSA9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1
aW50MzJfdCAvKmNsb2NrX2lkKi8sIHVpbnQ2NF90IC8qdHMqLz4+OworCisgICAgLy8gSW5pdGlh
bCBjbG9jayBzbmFwc2hvdCwgY2FwdHVyZWQgYXQgdHJhY2Ugc3RhcnQgdGltZSAod2hlbiBzdGF0
ZSBnb2VzIHRvCisgICAgLy8gVHJhY2luZ1Nlc3Npb246OlNUQVJURUQpLiBFbWl0dGVkIGludG8g
dGhlIHRyYWNlIHdoZW4gdGhlIGNvbnN1bWVyIGZpcnN0CisgICAgLy8gYmVnaW5zIHJlYWRpbmcg
dGhlIHRyYWNlLgorICAgIENsb2NrU25hcHNob3REYXRhIGluaXRpYWxfY2xvY2tfc25hcHNob3Rf
OworCisgICAgLy8gTW9zdCByZWNlbnQgY2xvY2sgc25hcHNob3QsIGNhcHR1cmVkIHBlcmlvZGlj
YWxseSBhZnRlciB0aGUgdHJhY2Ugd2FzCisgICAgLy8gc3RhcnRlZC4gRW1pdHRlZCBpbnRvIHRo
ZSB0cmFjZSB3aGVuIHRoZSBjb25zdW1lciBuZXh0IGNhbGxzCisgICAgLy8gUmVhZEJ1ZmZlcnMo
KS4KKyAgICBDbG9ja1NuYXBzaG90RGF0YSBsYXN0X2Nsb2NrX3NuYXBzaG90XzsKKworICAgIFN0
YXRlIHN0YXRlID0gRElTQUJMRUQ7CisKKyAgICAvLyBJZiB0aGUgY29uc3VtZXIgZGV0YWNoZWQg
dGhlIHNlc3Npb24sIHRoaXMgdmFyaWFibGUgZGVmaW5lcyB0aGUga2V5IHVzZWQKKyAgICAvLyBm
b3IgaWRlbnRpZnlpbmcgdGhlIHNlc3Npb24gbGF0ZXIgd2hlbiByZWF0dGFjaGluZy4KKyAgICBz
dGQ6OnN0cmluZyBkZXRhY2hfa2V5OworCisgICAgLy8gVGhpcyBpcyBzZXQgd2hlbiB0aGUgQ29u
c3VtZXIgY2FsbHMgc2V0cyB8d3JpdGVfaW50b19maWxlfCA9PSB0cnVlIGluIHRoZQorICAgIC8v
IFRyYWNlQ29uZmlnLiBJbiB0aGlzIGNhc2UgdGhpcyByZXByZXNlbnRzIHRoZSBmaWxlIHdlIHNo
b3VsZCBzdHJlYW0gdGhlCisgICAgLy8gdHJhY2UgcGFja2V0cyBpbnRvLCByYXRoZXIgdGhhbiBy
ZXR1cm5pbmcgaXQgdG8gdGhlIGNvbnN1bWVyIHZpYQorICAgIC8vIE9uVHJhY2VEYXRhKCkuCisg
ICAgYmFzZTo6U2NvcGVkRmlsZSB3cml0ZV9pbnRvX2ZpbGU7CisgICAgdWludDMyX3Qgd3JpdGVf
cGVyaW9kX21zID0gMDsKKyAgICB1aW50NjRfdCBtYXhfZmlsZV9zaXplX2J5dGVzID0gMDsKKyAg
ICB1aW50NjRfdCBieXRlc193cml0dGVuX2ludG9fZmlsZSA9IDA7CisgIH07CisKKyAgVHJhY2lu
Z1NlcnZpY2VJbXBsKGNvbnN0IFRyYWNpbmdTZXJ2aWNlSW1wbCYpID0gZGVsZXRlOworICBUcmFj
aW5nU2VydmljZUltcGwmIG9wZXJhdG9yPShjb25zdCBUcmFjaW5nU2VydmljZUltcGwmKSA9IGRl
bGV0ZTsKKworICBEYXRhU291cmNlSW5zdGFuY2UqIFNldHVwRGF0YVNvdXJjZShjb25zdCBUcmFj
ZUNvbmZpZzo6RGF0YVNvdXJjZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFRyYWNlQ29uZmlnOjpQcm9kdWNlckNvbmZpZyYsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyZWREYXRhU291cmNlJiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2luZ1Nlc3Npb24qKTsKKworICAv
LyBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBQcm9kdWNlcklEIHRoYXQgaXMgbm90IGluIHxw
cm9kdWNlcnNffC4KKyAgUHJvZHVjZXJJRCBHZXROZXh0UHJvZHVjZXJJRCgpOworCisgIC8vIFJl
dHVybnMgYSBwb2ludGVyIHRvIHRoZSB8dHJhY2luZ19zZXNzaW9uc198IGVudHJ5IG9yIG51bGxw
dHIgaWYgdGhlCisgIC8vIHNlc3Npb24gZG9lc24ndCBleGlzdHMuCisgIFRyYWNpbmdTZXNzaW9u
KiBHZXRUcmFjaW5nU2Vzc2lvbihUcmFjaW5nU2Vzc2lvbklEKTsKKworICAvLyBSZXR1cm5zIGEg
cG9pbnRlciB0byB0aGUgfHRyYWNpbmdfc2Vzc2lvbnNffCBlbnRyeSwgbWF0Y2hpbmcgdGhlIGdp
dmVuCisgIC8vIHVpZCBhbmQgZGV0YWNoIGtleSwgb3IgbnVsbHB0ciBpZiBubyBzdWNoIHNlc3Np
b24gZXhpc3RzLgorICBUcmFjaW5nU2Vzc2lvbiogR2V0RGV0YWNoZWRTZXNzaW9uKHVpZF90LCBj
b25zdCBzdGQ6OnN0cmluZyYga2V5KTsKKworICAvLyBVcGRhdGUgdGhlIG1lbW9yeSBndWFyZCBy
YWlsIGJ5IHVzaW5nIHRoZSBsYXRlc3QgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgLy8gc2hhcmVk
IG1lbW9yeSBhbmQgdHJhY2UgYnVmZmVycy4KKyAgdm9pZCBVcGRhdGVNZW1vcnlHdWFyZHJhaWwo
KTsKKworICB2b2lkIFN0YXJ0RGF0YVNvdXJjZUluc3RhbmNlKFByb2R1Y2VyRW5kcG9pbnRJbXBs
KiBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nU2Vzc2lv
biogdHJhY2luZ19zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFT
b3VyY2VJbnN0YW5jZSogaW5zdGFuY2UpOworICB2b2lkIFN0b3BEYXRhU291cmNlSW5zdGFuY2Uo
UHJvZHVjZXJFbmRwb2ludEltcGwqIHByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIERhdGFTb3VyY2VJbnN0YW5jZSogaW5zdGFuY2UsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBib29sIGRpc2FibGVfaW1tZWRpYXRlbHkpOworICB2b2lkIFBlcmlv
ZGljU25hcHNob3RUYXNrKFRyYWNpbmdTZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24sCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbml0aWFsX3NuYXBzaG90KTsKKyAgdm9pZCBT
bmFwc2hvdFN5bmNNYXJrZXIoc3RkOjp2ZWN0b3I8VHJhY2VQYWNrZXQ+Kik7CisgIHZvaWQgU25h
cHNob3RDbG9ja3MoVHJhY2luZ1Nlc3Npb246OkNsb2NrU25hcHNob3REYXRhKik7CisgIHZvaWQg
RW1pdENsb2NrU25hcHNob3QoVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lvbiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICBUcmFjaW5nU2Vzc2lvbjo6Q2xvY2tTbmFwc2hvdERhdGEsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXRfcm9vdF90aW1lc3RhbXAsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHJhY2VQYWNrZXQ+Kik7CisgIHZvaWQgU25h
cHNob3RTdGF0cyhUcmFjaW5nU2Vzc2lvbiosIHN0ZDo6dmVjdG9yPFRyYWNlUGFja2V0PiopOwor
ICBUcmFjZVN0YXRzIEdldFRyYWNlU3RhdHMoVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lv
bik7CisgIHZvaWQgTWF5YmVFbWl0U2VydmljZUV2ZW50cyhUcmFjaW5nU2Vzc2lvbiosIHN0ZDo6
dmVjdG9yPFRyYWNlUGFja2V0PiopOworICB2b2lkIE1heWJlRW1pdFRyYWNlQ29uZmlnKFRyYWNp
bmdTZXNzaW9uKiwgc3RkOjp2ZWN0b3I8VHJhY2VQYWNrZXQ+Kik7CisgIHZvaWQgTWF5YmVFbWl0
U3lzdGVtSW5mbyhUcmFjaW5nU2Vzc2lvbiosIHN0ZDo6dmVjdG9yPFRyYWNlUGFja2V0PiopOwor
ICB2b2lkIE1heWJlRW1pdFJlY2VpdmVkVHJpZ2dlcnMoVHJhY2luZ1Nlc3Npb24qLCBzdGQ6OnZl
Y3RvcjxUcmFjZVBhY2tldD4qKTsKKyAgdm9pZCBNYXliZU5vdGlmeUFsbERhdGFTb3VyY2VzU3Rh
cnRlZChUcmFjaW5nU2Vzc2lvbiopOworICB2b2lkIE9uRmx1c2hUaW1lb3V0KFRyYWNpbmdTZXNz
aW9uSUQsIEZsdXNoUmVxdWVzdElEKTsKKyAgdm9pZCBPbkRpc2FibGVUcmFjaW5nVGltZW91dChU
cmFjaW5nU2Vzc2lvbklEKTsKKyAgdm9pZCBEaXNhYmxlVHJhY2luZ05vdGlmeUNvbnN1bWVyQW5k
Rmx1c2hGaWxlKFRyYWNpbmdTZXNzaW9uKik7CisgIHZvaWQgUGVyaW9kaWNGbHVzaFRhc2soVHJh
Y2luZ1Nlc3Npb25JRCwgYm9vbCBwb3N0X25leHRfb25seSk7CisgIHZvaWQgQ29tcGxldGVGbHVz
aChUcmFjaW5nU2Vzc2lvbklEIHRzaWQsCisgICAgICAgICAgICAgICAgICAgICBDb25zdW1lckVu
ZHBvaW50OjpGbHVzaENhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgYm9v
bCBzdWNjZXNzKTsKKyAgdm9pZCBTY3JhcGVTaGFyZWRNZW1vcnlCdWZmZXJzKFRyYWNpbmdTZXNz
aW9uKiB0cmFjaW5nX3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQ
cm9kdWNlckVuZHBvaW50SW1wbCogcHJvZHVjZXIpOworICB2b2lkIFBlcmlvZGljQ2xlYXJJbmNy
ZW1lbnRhbFN0YXRlVGFzayhUcmFjaW5nU2Vzc2lvbklELCBib29sIHBvc3RfbmV4dF9vbmx5KTsK
KyAgVHJhY2VCdWZmZXIqIEdldEJ1ZmZlckJ5SUQoQnVmZmVySUQpOworICB2b2lkIE9uU3RhcnRU
cmlnZ2Vyc1RpbWVvdXQoVHJhY2luZ1Nlc3Npb25JRCB0c2lkKTsKKworICBiYXNlOjpUYXNrUnVu
bmVyKiBjb25zdCB0YXNrX3J1bm5lcl87CisgIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnk6
OkZhY3Rvcnk+IHNobV9mYWN0b3J5XzsKKyAgUHJvZHVjZXJJRCBsYXN0X3Byb2R1Y2VyX2lkXyA9
IDA7CisgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGxhc3RfZGF0YV9zb3VyY2VfaW5zdGFuY2VfaWRf
ID0gMDsKKyAgVHJhY2luZ1Nlc3Npb25JRCBsYXN0X3RyYWNpbmdfc2Vzc2lvbl9pZF8gPSAwOwor
ICBGbHVzaFJlcXVlc3RJRCBsYXN0X2ZsdXNoX3JlcXVlc3RfaWRfID0gMDsKKyAgdWlkX3QgdWlk
XyA9IDA7CisKKyAgLy8gQnVmZmVyIElEcyBhcmUgZ2xvYmFsIGFjcm9zcyBhbGwgY29uc3VtZXJz
IChiZWNhdXNlIGEgUHJvZHVjZXIgY2FuIHByb2R1Y2UKKyAgLy8gZGF0YSBmb3IgbW9yZSB0aGFu
IG9uZSB0cmFjZSBzZXNzaW9uLCBoZW5jZSBtb3JlIHRoYW4gb25lIGNvbnN1bWVyKS4KKyAgSWRB
bGxvY2F0b3I8QnVmZmVySUQ+IGJ1ZmZlcl9pZHNfOworCisgIHN0ZDo6bXVsdGltYXA8c3RkOjpz
dHJpbmcgLypuYW1lKi8sIFJlZ2lzdGVyZWREYXRhU291cmNlPiBkYXRhX3NvdXJjZXNfOworICBz
dGQ6Om1hcDxQcm9kdWNlcklELCBQcm9kdWNlckVuZHBvaW50SW1wbCo+IHByb2R1Y2Vyc187Cisg
IHN0ZDo6c2V0PENvbnN1bWVyRW5kcG9pbnRJbXBsKj4gY29uc3VtZXJzXzsKKyAgc3RkOjptYXA8
VHJhY2luZ1Nlc3Npb25JRCwgVHJhY2luZ1Nlc3Npb24+IHRyYWNpbmdfc2Vzc2lvbnNfOworICBz
dGQ6Om1hcDxCdWZmZXJJRCwgc3RkOjp1bmlxdWVfcHRyPFRyYWNlQnVmZmVyPj4gYnVmZmVyc187
CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiBzZXNzaW9uX3RvX2xhc3RfdHJhY2Vf
c187CisKKyAgYm9vbCBzbWJfc2NyYXBpbmdfZW5hYmxlZF8gPSBmYWxzZTsKKyAgYm9vbCBsb2Nr
ZG93bl9tb2RlXyA9IGZhbHNlOworICB1aW50MzJfdCBtaW5fd3JpdGVfcGVyaW9kX21zXyA9IDEw
MDsgIC8vIE92ZXJyaWRhYmxlIGZvciB0ZXN0aW5nLgorCisgIHVpbnQ4X3Qgc3luY19tYXJrZXJf
cGFja2V0X1szMl07ICAvLyBMYXppbHkgaW5pdGlhbGl6ZWQuCisgIHNpemVfdCBzeW5jX21hcmtl
cl9wYWNrZXRfc2l6ZV8gPSAwOworCisgIC8vIFN0YXRzLgorICB1aW50NjRfdCBjaHVua3NfZGlz
Y2FyZGVkXyA9IDA7CisgIHVpbnQ2NF90IHBhdGNoZXNfZGlzY2FyZGVkXyA9IDA7CisKKyAgUEVS
RkVUVE9fVEhSRUFEX0NIRUNLRVIodGhyZWFkX2NoZWNrZXJfKQorCisgIGJhc2U6OldlYWtQdHJG
YWN0b3J5PFRyYWNpbmdTZXJ2aWNlSW1wbD4KKyAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfOyAgLy8g
S2VlcCBhdCB0aGUgZW5kLgorfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRp
ZiAgLy8gU1JDX1RSQUNJTkdfQ09SRV9UUkFDSU5HX1NFUlZJQ0VfSU1QTF9IXworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2NvcmUvdHJh
Y2luZ19zZXJ2aWNlX2NhcGFiaWxpdGllcy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRo
ZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUg
QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkg
bm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4K
KyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAg
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNz
IHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0
d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24g
YW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9G
IEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNl
IGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICog
bGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BF
UkZFVFRPX1RSQUNJTkdfQ09SRV9UUkFDSU5HX1NFUlZJQ0VfQ0FQQUJJTElUSUVTX0hfCisjZGVm
aW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19DT1JFX1RSQUNJTkdfU0VSVklDRV9DQVBBQklM
SVRJRVNfSF8KKworLy8gQ3JlYXRlcyB0aGUgYWxpYXNlcyBpbiB0aGUgOjpwZXJmZXR0byBuYW1l
c3BhY2UsIGRvaW5nIHRoaW5ncyBsaWtlOgorLy8gdXNpbmcgOjpwZXJmZXR0bzo6Rm9vID0gOjpw
ZXJmZXR0bzo6cHJvdG9zOjpnZW46OkZvby4KKy8vIFNlZSBjb21tZW50cyBpbiBmb3J3YXJkX2Rl
Y2xzLmggZm9yIHRoZSBoaXN0b3JpY2FsIHJlYXNvbnMgb2YgdGhpcworLy8gaW5kaXJlY3Rpb24g
bGF5ZXIuCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90
cmFjaW5nL2NvcmUvZm9yd2FyZF9kZWNscy5oIgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNpbmdfc2VydmljZV9jYXBh
YmlsaXRpZXMuZ2VuLmgiCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NP
UkVfVFJBQ0lOR19TRVJWSUNFX0NBUEFCSUxJVElFU19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2NvcmUvdHJhY2luZ19zZXJ2aWNl
X3N0YXRlLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3Vy
Y2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy
c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g
YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5v
cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj
YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl
ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor
ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs
YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0
aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NP
UkVfVFJBQ0lOR19TRVJWSUNFX1NUQVRFX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJB
Q0lOR19DT1JFX1RSQUNJTkdfU0VSVklDRV9TVEFURV9IXworCisvLyBDcmVhdGVzIHRoZSBhbGlh
c2VzIGluIHRoZSA6OnBlcmZldHRvIG5hbWVzcGFjZSwgZG9pbmcgdGhpbmdzIGxpa2U6CisvLyB1
c2luZyA6OnBlcmZldHRvOjpGb28gPSA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6Rm9vLgorLy8g
U2VlIGNvbW1lbnRzIGluIGZvcndhcmRfZGVjbHMuaCBmb3IgdGhlIGhpc3RvcmljYWwgcmVhc29u
cyBvZiB0aGlzCisvLyBpbmRpcmVjdGlvbiBsYXllci4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9j
b21tb24vdHJhY2luZ19zZXJ2aWNlX3N0YXRlLmdlbi5oIgorCisjZW5kaWYgIC8vIElOQ0xVREVf
UEVSRkVUVE9fVFJBQ0lOR19DT1JFX1RSQUNJTkdfU0VSVklDRV9TVEFURV9IXworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24vdHJhY2Vf
c3RhdHMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxl
ciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fQ09NTU9OX1RSQUNFX1NUQVRTX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1RSQUNFX1NUQVRTX1BST1RPX0hfCisKKyNpbmNs
dWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBw
Ynplcm8geworCitjbGFzcyBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzOworCitjbGFzcyBUcmFjZVN0
YXRzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovMTAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7
CisgcHVibGljOgorICBUcmFjZVN0YXRzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRy
YWNlU3RhdHNfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBUcmFjZVN0YXRzX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2J1ZmZlcl9zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzPiBidWZmZXJfc3RhdHMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfcHJvZHVjZXJzX2Nvbm5l
Y3RlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBwcm9k
dWNlcnNfY29ubmVjdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc19wcm9kdWNlcnNfc2VlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBwcm9kdWNlcnNfc2VlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
YXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZGF0YV9zb3VyY2VzX3JlZ2lzdGVyZWQoKSBjb25z
dCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZGF0YV9zb3VyY2VzX3Jl
Z2lzdGVyZWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wg
aGFzX2RhdGFfc291cmNlc19zZWVuKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IGRhdGFfc291cmNlc19zZWVuKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc190cmFjaW5nX3Nlc3Npb25zKCkgY29uc3QgeyByZXR1
cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHRyYWNpbmdfc2Vzc2lvbnMoKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3RvdGFsX2J1ZmZl
cnMoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdG90YWxf
YnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfY2h1bmtzX2Rpc2NhcmRlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBjaHVua3NfZGlzY2FyZGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191
aW50NjQoKTsgfQorICBib29sIGhhc19wYXRjaGVzX2Rpc2NhcmRlZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDk+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwYXRjaGVzX2Rpc2NhcmRlZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDk+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW52YWxpZF9wYWNr
ZXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbnZh
bGlkX3BhY2tldHMoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS5hc191aW50NjQoKTsgfQorfTsK
KworY2xhc3MgVHJhY2VTdGF0cyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2VTdGF0c19EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga0J1ZmZlclN0YXRzRmllbGROdW1iZXIgPSAxLAorICAgIGtQcm9kdWNlcnND
b25uZWN0ZWRGaWVsZE51bWJlciA9IDIsCisgICAga1Byb2R1Y2Vyc1NlZW5GaWVsZE51bWJlciA9
IDMsCisgICAga0RhdGFTb3VyY2VzUmVnaXN0ZXJlZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrRGF0
YVNvdXJjZXNTZWVuRmllbGROdW1iZXIgPSA1LAorICAgIGtUcmFjaW5nU2Vzc2lvbnNGaWVsZE51
bWJlciA9IDYsCisgICAga1RvdGFsQnVmZmVyc0ZpZWxkTnVtYmVyID0gNywKKyAgICBrQ2h1bmtz
RGlzY2FyZGVkRmllbGROdW1iZXIgPSA4LAorICAgIGtQYXRjaGVzRGlzY2FyZGVkRmllbGROdW1i
ZXIgPSA5LAorICAgIGtJbnZhbGlkUGFja2V0c0ZpZWxkTnVtYmVyID0gMTAsCisgIH07CisgIHVz
aW5nIEJ1ZmZlclN0YXRzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlU3RhdHNf
QnVmZmVyU3RhdHM7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2VTdGF0c19CdWZmZXJT
dGF0cz4gVCogYWRkX2J1ZmZlcl9zdGF0cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDEpOworICB9CisKKyAgdm9pZCBzZXRfcHJvZHVjZXJzX2Nvbm5lY3RlZCh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
cHJvZHVjZXJzX3NlZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2RhdGFfc291cmNlc19yZWdpc3RlcmVkKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kYXRh
X3NvdXJjZXNfc2Vlbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfdHJhY2luZ19zZXNzaW9ucyh1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdG90YWxfYnVmZmVy
cyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfY2h1bmtzX2Rpc2NhcmRlZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGF0Y2hlc19kaXNjYXJkZWQodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2ludmFsaWRfcGFja2V0cyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMCwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzX0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MTksIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgVHJhY2VTdGF0c19CdWZmZXJTdGF0c19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBU
cmFjZVN0YXRzX0J1ZmZlclN0YXRzX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2VTdGF0c19CdWZmZXJTdGF0c19E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19idWZmZXJfc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDEyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYnVmZmVyX3NpemUo
KSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ieXRl
c193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGJ5dGVzX3dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2J5dGVzX292ZXJ3cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBieXRlc19vdmVyd3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGF0
PDEzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2J5dGVzX3JlYWQoKSBjb25zdCB7IHJl
dHVybiBhdDwxND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJ5dGVzX3JlYWQoKSBjb25zdCB7
IHJldHVybiBhdDwxND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wYWRkaW5nX2J5dGVz
X3dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBhdDwxNT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHBhZGRpbmdfYnl0ZXNfd3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDE1PigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX3BhZGRpbmdfYnl0ZXNfY2xlYXJlZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGFkZGluZ19ieXRlc19jbGVhcmVkKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTY+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfY2h1bmtz
X3dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
Y2h1bmtzX3dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2NodW5rc19yZXdyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxp
ZCgpOyB9CisgIHVpbnQ2NF90IGNodW5rc19yZXdyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBhdDwx
MD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19jaHVua3Nfb3ZlcndyaXR0ZW4oKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgY2h1bmtzX292ZXJ3cml0
dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19j
aHVua3NfZGlzY2FyZGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTg+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBjaHVua3NfZGlzY2FyZGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTg+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfY2h1bmtzX3JlYWQoKSBjb25zdCB7IHJldHVybiBhdDwxNz4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGNodW5rc19yZWFkKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTc+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfY2h1bmtzX2NvbW1pdHRlZF9vdXRfb2Zf
b3JkZXIoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGNo
dW5rc19jb21taXR0ZWRfb3V0X29mX29yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkuYXNf
dWludDY0KCk7IH0KKyAgYm9vbCBoYXNfd3JpdGVfd3JhcF9jb3VudCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB3cml0ZV93cmFwX2NvdW50KCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wYXRjaGVzX3N1Y2Nl
ZWRlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwYXRj
aGVzX3N1Y2NlZWRlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfcGF0Y2hlc19mYWlsZWQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgcGF0Y2hlc19mYWlsZWQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3JlYWRhaGVhZHNfc3VjY2VlZGVkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHJlYWRhaGVhZHNfc3VjY2VlZGVk
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19yZWFk
YWhlYWRzX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCByZWFkYWhlYWRzX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfYWJpX3Zpb2xhdGlvbnMoKSBjb25zdCB7IHJldHVybiBhdDw5Pigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYWJpX3Zpb2xhdGlvbnMoKSBjb25zdCB7IHJldHVybiBh
dDw5PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RyYWNlX3dyaXRlcl9wYWNrZXRfbG9z
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE5PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdHJhY2Vf
d3JpdGVyX3BhY2tldF9sb3NzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk+KCkuYXNfdWludDY0KCk7
IH0KK307CisKK2NsYXNzIFRyYWNlU3RhdHNfQnVmZmVyU3RhdHMgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNlU3RhdHNfQnVm
ZmVyU3RhdHNfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtCdWZmZXJTaXplRmll
bGROdW1iZXIgPSAxMiwKKyAgICBrQnl0ZXNXcml0dGVuRmllbGROdW1iZXIgPSAxLAorICAgIGtC
eXRlc092ZXJ3cml0dGVuRmllbGROdW1iZXIgPSAxMywKKyAgICBrQnl0ZXNSZWFkRmllbGROdW1i
ZXIgPSAxNCwKKyAgICBrUGFkZGluZ0J5dGVzV3JpdHRlbkZpZWxkTnVtYmVyID0gMTUsCisgICAg
a1BhZGRpbmdCeXRlc0NsZWFyZWRGaWVsZE51bWJlciA9IDE2LAorICAgIGtDaHVua3NXcml0dGVu
RmllbGROdW1iZXIgPSAyLAorICAgIGtDaHVua3NSZXdyaXR0ZW5GaWVsZE51bWJlciA9IDEwLAor
ICAgIGtDaHVua3NPdmVyd3JpdHRlbkZpZWxkTnVtYmVyID0gMywKKyAgICBrQ2h1bmtzRGlzY2Fy
ZGVkRmllbGROdW1iZXIgPSAxOCwKKyAgICBrQ2h1bmtzUmVhZEZpZWxkTnVtYmVyID0gMTcsCisg
ICAga0NodW5rc0NvbW1pdHRlZE91dE9mT3JkZXJGaWVsZE51bWJlciA9IDExLAorICAgIGtXcml0
ZVdyYXBDb3VudEZpZWxkTnVtYmVyID0gNCwKKyAgICBrUGF0Y2hlc1N1Y2NlZWRlZEZpZWxkTnVt
YmVyID0gNSwKKyAgICBrUGF0Y2hlc0ZhaWxlZEZpZWxkTnVtYmVyID0gNiwKKyAgICBrUmVhZGFo
ZWFkc1N1Y2NlZWRlZEZpZWxkTnVtYmVyID0gNywKKyAgICBrUmVhZGFoZWFkc0ZhaWxlZEZpZWxk
TnVtYmVyID0gOCwKKyAgICBrQWJpVmlvbGF0aW9uc0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrVHJh
Y2VXcml0ZXJQYWNrZXRMb3NzRmllbGROdW1iZXIgPSAxOSwKKyAgfTsKKyAgdm9pZCBzZXRfYnVm
ZmVyX3NpemUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTIsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9ieXRlc193cml0dGVuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ieXRlc19vdmVyd3JpdHRlbih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMywgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2J5dGVzX3JlYWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTQs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYWRkaW5nX2J5dGVzX3dyaXR0ZW4odWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9w
YWRkaW5nX2J5dGVzX2NsZWFyZWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MTYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jaHVua3Nfd3JpdHRlbih1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2h1bmtz
X3Jld3JpdHRlbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMCwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X2NodW5rc19vdmVyd3JpdHRlbih1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2h1bmtzX2Rpc2Nh
cmRlZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxOCwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2NodW5rc19yZWFkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDE3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2h1bmtzX2NvbW1pdHRlZF9vdXRfb2Zf
b3JkZXIodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF93cml0ZV93cmFwX2NvdW50KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYXRjaGVzX3N1Y2NlZWRlZCh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcGF0Y2hlc19mYWlsZWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3JlYWRhaGVhZHNfc3VjY2VlZGVkKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9y
ZWFkYWhlYWRzX2ZhaWxlZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWJpX3Zpb2xhdGlvbnModWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RyYWNlX3dyaXRl
cl9wYWNrZXRfbG9zcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxOSwgdmFs
dWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBO
YW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy90cmFjZV9jb25maWcucGJ6
ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4u
IERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
Q09ORklHX1RSQUNFX0NPTkZJR19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX0NPTkZJR19UUkFDRV9DT05GSUdfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0
ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBl
YXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7
CisKK2NsYXNzIERhdGFTb3VyY2VDb25maWc7CitjbGFzcyBUcmFjZUNvbmZpZ19CdWZmZXJDb25m
aWc7CitjbGFzcyBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZTsKK2NsYXNzIFRyYWNlQ29u
ZmlnX0RhdGFTb3VyY2U7CitjbGFzcyBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXM7Citj
bGFzcyBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZzsKK2NsYXNzIFRyYWNlQ29uZmln
X0luY3JlbWVudGFsU3RhdGVDb25maWc7CitjbGFzcyBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZp
ZzsKK2NsYXNzIFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhOworY2xhc3MgVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZzsKK2NsYXNzIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlcjsK
K2VudW0gQnVpbHRpbkNsb2NrIDogaW50MzJfdDsKK2VudW0gVHJhY2VDb25maWdfQnVmZmVyQ29u
ZmlnX0ZpbGxQb2xpY3kgOiBpbnQzMl90OworZW51bSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5
cGUgOiBpbnQzMl90OworZW51bSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb24gOiBp
bnQzMl90OworZW51bSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlIDogaW50
MzJfdDsKKworZW51bSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb24gOiBpbnQzMl90
IHsKKyAgVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uX0xPQ0tET1dOX1VOQ0hBTkdF
RCA9IDAsCisgIFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9DTEVB
UiA9IDEsCisgIFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9TRVQg
PSAyLAorfTsKKworY29uc3QgVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uIFRyYWNl
Q29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9NSU4gPSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1v
ZGVPcGVyYXRpb25fTE9DS0RPV05fVU5DSEFOR0VEOworY29uc3QgVHJhY2VDb25maWdfTG9ja2Rv
d25Nb2RlT3BlcmF0aW9uIFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9NQVggPSBU
cmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fU0VUOworCitlbnVtIFRy
YWNlQ29uZmlnX0NvbXByZXNzaW9uVHlwZSA6IGludDMyX3QgeworICBUcmFjZUNvbmZpZ19Db21w
cmVzc2lvblR5cGVfQ09NUFJFU1NJT05fVFlQRV9VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNlQ29u
ZmlnX0NvbXByZXNzaW9uVHlwZV9DT01QUkVTU0lPTl9UWVBFX0RFRkxBVEUgPSAxLAorfTsKKwor
Y29uc3QgVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlIFRyYWNlQ29uZmlnX0NvbXByZXNzaW9u
VHlwZV9NSU4gPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGVfQ09NUFJFU1NJT05fVFlQRV9V
TlNQRUNJRklFRDsKK2NvbnN0IFRyYWNlQ29uZmlnX0NvbXByZXNzaW9uVHlwZSBUcmFjZUNvbmZp
Z19Db21wcmVzc2lvblR5cGVfTUFYID0gVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlX0NPTVBS
RVNTSU9OX1RZUEVfREVGTEFURTsKKworZW51bSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1Ry
aWdnZXJNb2RlIDogaW50MzJfdCB7CisgIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dl
ck1vZGVfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdn
ZXJNb2RlX1NUQVJUX1RSQUNJTkcgPSAxLAorICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1Ry
aWdnZXJNb2RlX1NUT1BfVFJBQ0lORyA9IDIsCit9OworCitjb25zdCBUcmFjZUNvbmZpZ19Ucmln
Z2VyQ29uZmlnX1RyaWdnZXJNb2RlIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1v
ZGVfTUlOID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9VTlNQRUNJRklF
RDsKK2NvbnN0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGUgVHJhY2VDb25m
aWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9NQVggPSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnX1RyaWdnZXJNb2RlX1NUT1BfVFJBQ0lORzsKKworZW51bSBUcmFjZUNvbmZpZ19CdWZmZXJD
b25maWdfRmlsbFBvbGljeSA6IGludDMyX3QgeworICBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdf
RmlsbFBvbGljeV9VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19G
aWxsUG9saWN5X1JJTkdfQlVGRkVSID0gMSwKKyAgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0Zp
bGxQb2xpY3lfRElTQ0FSRCA9IDIsCit9OworCitjb25zdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25m
aWdfRmlsbFBvbGljeSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9NSU4gPSBU
cmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9VTlNQRUNJRklFRDsKK2NvbnN0IFRy
YWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZp
Z19GaWxsUG9saWN5X01BWCA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5X0RJ
U0NBUkQ7CisKK2NsYXNzIFRyYWNlQ29uZmlnX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMjksIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBUcmFjZUNvbmZpZ19EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmln
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2J1ZmZlcnMoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmll
bGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gYnVmZmVycygpIGNvbnN0IHsgcmV0
dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxKTsgfQorICBib29sIGhh
c19kYXRhX3NvdXJjZXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4g
ZGF0YV9zb3VyY2VzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+KDIpOyB9CisgIGJvb2wgaGFzX2J1aWx0aW5fZGF0YV9zb3VyY2VzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MjA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBi
dWlsdGluX2RhdGFfc291cmNlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDIwPigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfZHVyYXRpb25fbXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgZHVyYXRpb25fbXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2VuYWJsZV9leHRyYV9ndWFyZHJhaWxzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGJvb2wgZW5hYmxlX2V4dHJhX2d1YXJkcmFp
bHMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19sb2Nr
ZG93bl9tb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
bG9ja2Rvd25fbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc19wcm9kdWNlcnMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4gcHJvZHVjZXJzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+KDYpOyB9CisgIGJvb2wgaGFzX3N0YXRzZF9tZXRhZGF0YSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzdGF0c2Rf
bWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfd3JpdGVfaW50b19maWxlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9Cisg
IGJvb2wgd3JpdGVfaW50b19maWxlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc19ib29sKCk7
IH0KKyAgYm9vbCBoYXNfb3V0cHV0X3BhdGgoKSBjb25zdCB7IHJldHVybiBhdDwyOT4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG91dHB1dF9wYXRoKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mjk+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfZmlsZV93cml0ZV9wZXJp
b2RfbXMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmls
ZV93cml0ZV9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQzMigpOyB9
CisgIGJvb2wgaGFzX21heF9maWxlX3NpemVfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBhdDwxMD4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG1heF9maWxlX3NpemVfYnl0ZXMoKSBjb25zdCB7IHJl
dHVybiBhdDwxMD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ndWFyZHJhaWxfb3ZlcnJp
ZGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBndWFyZHJhaWxfb3ZlcnJpZGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCku
YXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19kZWZlcnJlZF9zdGFydCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDEyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBkZWZlcnJlZF9zdGFydCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDEyPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19mbHVzaF9wZXJpb2RfbXMoKSBj
b25zdCB7IHJldHVybiBhdDwxMz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGZsdXNoX3Blcmlv
ZF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDEzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X2ZsdXNoX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBhdDwxND4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IGZsdXNoX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBhdDwxND4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19kYXRhX3NvdXJjZV9zdG9wX3RpbWVvdXRfbXMoKSBjb25z
dCB7IHJldHVybiBhdDwyMz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGRhdGFfc291cmNlX3N0
b3BfdGltZW91dF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDIzPigpLmFzX3VpbnQzMigpOyB9Cisg
IGJvb2wgaGFzX25vdGlmeV90cmFjZXVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkudmFsaWQo
KTsgfQorICBib29sIG5vdGlmeV90cmFjZXVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkuYXNf
Ym9vbCgpOyB9CisgIGJvb2wgaGFzX3RyaWdnZXJfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0cmlnZ2VyX2NvbmZp
ZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYWN0
aXZhdGVfdHJpZ2dlcnMoKSBjb25zdCB7IHJldHVybiBhdDwxOD4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+
IGFjdGl2YXRlX3RyaWdnZXJzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3pl
cm86OkNvbnN0Q2hhcnM+KDE4KTsgfQorICBib29sIGhhc19pbmNyZW1lbnRhbF9zdGF0ZV9jb25m
aWcoKSBjb25zdCB7IHJldHVybiBhdDwyMT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIGluY3JlbWVudGFsX3N0YXRlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDIx
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYWxsb3dfdXNlcl9idWlsZF90cmFjaW5nKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTk+KCkudmFsaWQoKTsgfQorICBib29sIGFsbG93X3VzZXJfYnVp
bGRfdHJhY2luZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE5PigpLmFzX2Jvb2woKTsgfQorICBib29s
IGhhc191bmlxdWVfc2Vzc2lvbl9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MjI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB1bmlxdWVfc2Vzc2lvbl9uYW1lKCkgY29u
c3QgeyByZXR1cm4gYXQ8MjI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY29tcHJlc3Np
b25fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBj
b21wcmVzc2lvbl90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQ+KCkuYXNfaW50MzIoKTsgfQor
ICBib29sIGhhc19pbmNpZGVudF9yZXBvcnRfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MjU+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBpbmNpZGVudF9yZXBvcnRf
Y29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MjU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c190cmFjZV91dWlkX21zYigpIGNvbnN0IHsgcmV0dXJuIGF0PDI3PigpLnZhbGlkKCk7IH0KKyAg
aW50NjRfdCB0cmFjZV91dWlkX21zYigpIGNvbnN0IHsgcmV0dXJuIGF0PDI3PigpLmFzX2ludDY0
KCk7IH0KKyAgYm9vbCBoYXNfdHJhY2VfdXVpZF9sc2IoKSBjb25zdCB7IHJldHVybiBhdDwyOD4o
KS52YWxpZCgpOyB9CisgIGludDY0X3QgdHJhY2VfdXVpZF9sc2IoKSBjb25zdCB7IHJldHVybiBh
dDwyOD4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZyA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2VD
b25maWdfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtCdWZmZXJzRmllbGROdW1i
ZXIgPSAxLAorICAgIGtEYXRhU291cmNlc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrQnVpbHRpbkRh
dGFTb3VyY2VzRmllbGROdW1iZXIgPSAyMCwKKyAgICBrRHVyYXRpb25Nc0ZpZWxkTnVtYmVyID0g
MywKKyAgICBrRW5hYmxlRXh0cmFHdWFyZHJhaWxzRmllbGROdW1iZXIgPSA0LAorICAgIGtMb2Nr
ZG93bk1vZGVGaWVsZE51bWJlciA9IDUsCisgICAga1Byb2R1Y2Vyc0ZpZWxkTnVtYmVyID0gNiwK
KyAgICBrU3RhdHNkTWV0YWRhdGFGaWVsZE51bWJlciA9IDcsCisgICAga1dyaXRlSW50b0ZpbGVG
aWVsZE51bWJlciA9IDgsCisgICAga091dHB1dFBhdGhGaWVsZE51bWJlciA9IDI5LAorICAgIGtG
aWxlV3JpdGVQZXJpb2RNc0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrTWF4RmlsZVNpemVCeXRlc0Zp
ZWxkTnVtYmVyID0gMTAsCisgICAga0d1YXJkcmFpbE92ZXJyaWRlc0ZpZWxkTnVtYmVyID0gMTEs
CisgICAga0RlZmVycmVkU3RhcnRGaWVsZE51bWJlciA9IDEyLAorICAgIGtGbHVzaFBlcmlvZE1z
RmllbGROdW1iZXIgPSAxMywKKyAgICBrRmx1c2hUaW1lb3V0TXNGaWVsZE51bWJlciA9IDE0LAor
ICAgIGtEYXRhU291cmNlU3RvcFRpbWVvdXRNc0ZpZWxkTnVtYmVyID0gMjMsCisgICAga05vdGlm
eVRyYWNldXJGaWVsZE51bWJlciA9IDE2LAorICAgIGtUcmlnZ2VyQ29uZmlnRmllbGROdW1iZXIg
PSAxNywKKyAgICBrQWN0aXZhdGVUcmlnZ2Vyc0ZpZWxkTnVtYmVyID0gMTgsCisgICAga0luY3Jl
bWVudGFsU3RhdGVDb25maWdGaWVsZE51bWJlciA9IDIxLAorICAgIGtBbGxvd1VzZXJCdWlsZFRy
YWNpbmdGaWVsZE51bWJlciA9IDE5LAorICAgIGtVbmlxdWVTZXNzaW9uTmFtZUZpZWxkTnVtYmVy
ID0gMjIsCisgICAga0NvbXByZXNzaW9uVHlwZUZpZWxkTnVtYmVyID0gMjQsCisgICAga0luY2lk
ZW50UmVwb3J0Q29uZmlnRmllbGROdW1iZXIgPSAyNSwKKyAgICBrVHJhY2VVdWlkTXNiRmllbGRO
dW1iZXIgPSAyNywKKyAgICBrVHJhY2VVdWlkTHNiRmllbGROdW1iZXIgPSAyOCwKKyAgfTsKKyAg
dXNpbmcgQnVmZmVyQ29uZmlnID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlQ29u
ZmlnX0J1ZmZlckNvbmZpZzsKKyAgdXNpbmcgRGF0YVNvdXJjZSA9IDo6cGVyZmV0dG86OnByb3Rv
czo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19EYXRhU291cmNlOworICB1c2luZyBCdWlsdGluRGF0YVNv
dXJjZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19CdWlsdGluRGF0
YVNvdXJjZTsKKyAgdXNpbmcgUHJvZHVjZXJDb25maWcgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBi
emVybzo6VHJhY2VDb25maWdfUHJvZHVjZXJDb25maWc7CisgIHVzaW5nIFN0YXRzZE1ldGFkYXRh
ID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRh
OworICB1c2luZyBHdWFyZHJhaWxPdmVycmlkZXMgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVy
bzo6VHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzOworICB1c2luZyBUcmlnZ2VyQ29uZmln
ID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWc7
CisgIHVzaW5nIEluY3JlbWVudGFsU3RhdGVDb25maWcgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBi
emVybzo6VHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZzsKKyAgdXNpbmcgSW5jaWRl
bnRSZXBvcnRDb25maWcgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2VDb25maWdf
SW5jaWRlbnRSZXBvcnRDb25maWc7CisgIHVzaW5nIExvY2tkb3duTW9kZU9wZXJhdGlvbiA9IDo6
cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRp
b247CisgIHVzaW5nIENvbXByZXNzaW9uVHlwZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJv
OjpUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGU7CisgIHN0YXRpYyBjb25zdCBMb2NrZG93bk1v
ZGVPcGVyYXRpb24gTE9DS0RPV05fVU5DSEFOR0VEID0gVHJhY2VDb25maWdfTG9ja2Rvd25Nb2Rl
T3BlcmF0aW9uX0xPQ0tET1dOX1VOQ0hBTkdFRDsKKyAgc3RhdGljIGNvbnN0IExvY2tkb3duTW9k
ZU9wZXJhdGlvbiBMT0NLRE9XTl9DTEVBUiA9IFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJh
dGlvbl9MT0NLRE9XTl9DTEVBUjsKKyAgc3RhdGljIGNvbnN0IExvY2tkb3duTW9kZU9wZXJhdGlv
biBMT0NLRE9XTl9TRVQgPSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RP
V05fU0VUOworICBzdGF0aWMgY29uc3QgQ29tcHJlc3Npb25UeXBlIENPTVBSRVNTSU9OX1RZUEVf
VU5TUEVDSUZJRUQgPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGVfQ09NUFJFU1NJT05fVFlQ
RV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IENvbXByZXNzaW9uVHlwZSBDT01QUkVTU0lP
Tl9UWVBFX0RFRkxBVEUgPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGVfQ09NUFJFU1NJT05f
VFlQRV9ERUZMQVRFOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX0J1ZmZl
ckNvbmZpZz4gVCogYWRkX2J1ZmZlcnMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2VDb25maWdfRGF0
YVNvdXJjZT4gVCogYWRkX2RhdGFfc291cmNlcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjZUNvbmZp
Z19CdWlsdGluRGF0YVNvdXJjZT4gVCogc2V0X2J1aWx0aW5fZGF0YV9zb3VyY2VzKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjApOworICB9CisKKyAgdm9pZCBzZXRfZHVy
YXRpb25fbXModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2VuYWJsZV9leHRyYV9ndWFyZHJhaWxzKGJvb2wgdmFsdWUpIHsKKyAg
ICBBcHBlbmRUaW55VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sb2NrZG93bl9t
b2RlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVP
cGVyYXRpb24gdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDUsIHZhbHVlKTsKKyAgfQor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnPiBUKiBh
ZGRfcHJvZHVjZXJzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRh
PiBUKiBzZXRfc3RhdHNkX21ldGFkYXRhKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oNyk7CisgIH0KKworICB2b2lkIHNldF93cml0ZV9pbnRvX2ZpbGUoYm9vbCB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X291dHB1
dF9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDI5LCB2
YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfb3V0cHV0X3BhdGgo
Y29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyOSwgZGF0
YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmlsZV93cml0ZV9wZXJpb2RfbXModWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21h
eF9maWxlX3NpemVfYnl0ZXModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTAs
IHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX0d1YXJk
cmFpbE92ZXJyaWRlcz4gVCogc2V0X2d1YXJkcmFpbF9vdmVycmlkZXMoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMSk7CisgIH0KKworICB2b2lkIHNldF9kZWZlcnJlZF9z
dGFydChib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2ZsdXNoX3BlcmlvZF9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgxMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsdXNoX3RpbWVvdXRfbXModWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTQsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9kYXRhX3NvdXJjZV9zdG9wX3RpbWVvdXRfbXModWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMjMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ub3RpZnlfdHJhY2V1cihi
b29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxNiwgdmFsdWUpOworICB9CisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZz4gVCogc2V0X3Ry
aWdnZXJfY29uZmlnKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTcpOwor
ICB9CisKKyAgdm9pZCBhZGRfYWN0aXZhdGVfdHJpZ2dlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMTgsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsK
KyAgfQorICB2b2lkIGFkZF9hY3RpdmF0ZV90cmlnZ2Vycyhjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDE4LCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWc+IFQq
IHNldF9pbmNyZW1lbnRhbF9zdGF0ZV9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigyMSk7CisgIH0KKworICB2b2lkIHNldF9hbGxvd191c2VyX2J1aWxkX3RyYWNp
bmcoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMTksIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF91bmlxdWVfc2Vzc2lvbl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDIyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0K
KyAgdm9pZCBzZXRfdW5pcXVlX3Nlc3Npb25fbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIyLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNl
dF9jb21wcmVzc2lvbl90eXBlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZp
Z19Db21wcmVzc2lvblR5cGUgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDI0LCB2YWx1
ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjZUNvbmZpZ19JbmNpZGVudFJl
cG9ydENvbmZpZz4gVCogc2V0X2luY2lkZW50X3JlcG9ydF9jb25maWcoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNSk7CisgIH0KKworICB2b2lkIHNldF90cmFjZV91dWlk
X21zYihpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDI3LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfdHJhY2VfdXVpZF9sc2IoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyOCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19JbmNpZGVudFJl
cG9ydENvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWdfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25m
aWdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZ19EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXN0aW5hdGlvbl9wYWNrYWdlKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJz
IGRlc3RpbmF0aW9uX3BhY2thZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygp
OyB9CisgIGJvb2wgaGFzX2Rlc3RpbmF0aW9uX2NsYXNzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGRlc3RpbmF0aW9uX2NsYXNz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19wcml2
YWN5X2xldmVsKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
cHJpdmFjeV9sZXZlbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc19za2lwX2Ryb3Bib3goKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0K
KyAgYm9vbCBza2lwX2Ryb3Bib3goKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2Jvb2woKTsg
fQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWcgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNl
Q29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrRGVzdGluYXRpb25QYWNrYWdlRmllbGROdW1iZXIgPSAxLAorICAgIGtEZXN0aW5hdGlv
bkNsYXNzRmllbGROdW1iZXIgPSAyLAorICAgIGtQcml2YWN5TGV2ZWxGaWVsZE51bWJlciA9IDMs
CisgICAga1NraXBEcm9wYm94RmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9kZXN0
aW5hdGlvbl9wYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9kZXN0
aW5hdGlvbl9wYWNrYWdlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGVzdGluYXRpb25fY2xh
c3MoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUu
ZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2Rlc3RpbmF0aW9uX2NsYXNz
KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0
YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJpdmFjeV9sZXZlbChpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9za2lwX2Ryb3Bi
b3goYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9
OworCitjbGFzcyBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBU
cmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWdfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUcmFj
ZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2NsZWFyX3BlcmlvZF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBjbGVhcl9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19JbmNyZW1lbnRh
bFN0YXRlQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2xlYXJQZXJpb2RNc0ZpZWxkTnVtYmVyID0g
MSwKKyAgfTsKKyAgdm9pZCBzZXRfY2xlYXJfcGVyaW9kX21zKHVpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki90cnVlPiB7CisgcHVibGljOgorICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9
CisgIGJvb2wgaGFzX3RyaWdnZXJfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICBpbnQzMl90IHRyaWdnZXJfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
aW50MzIoKTsgfQorICBib29sIGhhc190cmlnZ2VycygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPiB0cmlnZ2VycygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyKTsgfQorICBib29sIGhhc190cmlnZ2VyX3RpbWVvdXRf
bXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdHJpZ2dl
cl90aW1lb3V0X21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsK
KworY2xhc3MgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZ19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RyaWdnZXJNb2RlRmll
bGROdW1iZXIgPSAxLAorICAgIGtUcmlnZ2Vyc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrVHJpZ2dl
clRpbWVvdXRNc0ZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdXNpbmcgVHJpZ2dlciA9IDo6cGVy
ZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI7
CisgIHVzaW5nIFRyaWdnZXJNb2RlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNl
Q29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGU7CisgIHN0YXRpYyBjb25zdCBUcmlnZ2Vy
TW9kZSBVTlNQRUNJRklFRCA9IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVf
VU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBUcmlnZ2VyTW9kZSBTVEFSVF9UUkFDSU5HID0g
VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9TVEFSVF9UUkFDSU5HOworICBz
dGF0aWMgY29uc3QgVHJpZ2dlck1vZGUgU1RPUF9UUkFDSU5HID0gVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZ19UcmlnZ2VyTW9kZV9TVE9QX1RSQUNJTkc7CisgIHZvaWQgc2V0X3RyaWdnZXJfbW9k
ZSg6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19U
cmlnZ2VyTW9kZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19Ucmln
Z2VyPiBUKiBhZGRfdHJpZ2dlcnMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigyKTsKKyAgfQorCisgIHZvaWQgc2V0X3RyaWdnZXJfdGltZW91dF9tcyh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRyYWNl
Q29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlcl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZ19UcmlnZ2VyX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmln
X1RyaWdnZXJDb25maWdfVHJpZ2dlcl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25m
aWdfVHJpZ2dlcl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1l
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJv
b2wgaGFzX3Byb2R1Y2VyX25hbWVfcmVnZXgoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgcHJvZHVjZXJfbmFtZV9yZWdleCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc3RvcF9kZWxh
eV9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzdG9w
X2RlbGF5X21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFjZUNvbmZpZ19U
cmlnZ2VyQ29uZmlnX1RyaWdnZXJfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtO
YW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtQcm9kdWNlck5hbWVSZWdleEZpZWxkTnVtYmVyID0g
MiwKKyAgICBrU3RvcERlbGF5TXNGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X25h
bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUu
ZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciog
ZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAg
fQorICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lX3JlZ2V4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAg
fQorICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lX3JlZ2V4KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVf
dCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfc3RvcF9kZWxheV9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlc19E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzX0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlc19EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRy
YWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlc19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19tYXhfdXBsb2FkX3Blcl9kYXlfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbWF4X3VwbG9hZF9wZXJfZGF5X2J5dGVzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgVHJhY2VD
b25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlk
ZXNfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtNYXhVcGxvYWRQZXJEYXlCeXRl
c0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfbWF4X3VwbG9hZF9wZXJfZGF5X2J5
dGVzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQor
fTsKKworY2xhc3MgVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGFfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRyYWNlQ29u
ZmlnX1N0YXRzZE1ldGFkYXRhX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29u
ZmlnX1N0YXRzZE1ldGFkYXRhX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGFf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdHJpZ2dlcmluZ19hbGVy
dF9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHRyaWdn
ZXJpbmdfYWxlcnRfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfdHJpZ2dlcmluZ19jb25maWdfdWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52
YWxpZCgpOyB9CisgIGludDMyX3QgdHJpZ2dlcmluZ19jb25maWdfdWlkKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RyaWdnZXJpbmdfY29uZmlnX2lk
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdHJpZ2dlcmlu
Z19jb25maWdfaWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9v
bCBoYXNfdHJpZ2dlcmluZ19zdWJzY3JpcHRpb25faWQoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0cmlnZ2VyaW5nX3N1YnNjcmlwdGlvbl9pZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50NjQoKTsgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdf
U3RhdHNkTWV0YWRhdGEgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhX0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrVHJpZ2dlcmluZ0FsZXJ0SWRGaWVsZE51bWJlciA9IDEs
CisgICAga1RyaWdnZXJpbmdDb25maWdVaWRGaWVsZE51bWJlciA9IDIsCisgICAga1RyaWdnZXJp
bmdDb25maWdJZEZpZWxkTnVtYmVyID0gMywKKyAgICBrVHJpZ2dlcmluZ1N1YnNjcmlwdGlvbklk
RmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF90cmlnZ2VyaW5nX2FsZXJ0X2lkKGlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3RyaWdnZXJpbmdfY29uZmlnX3VpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90cmlnZ2VyaW5nX2NvbmZpZ19pZChpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF90cmlnZ2VyaW5nX3N1YnNjcmlwdGlvbl9pZChpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfUHJvZHVjZXJD
b25maWdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypN
QVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+
IHsKKyBwdWJsaWM6CisgIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnX0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnX0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJh
Y2VDb25maWdfUHJvZHVjZXJDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfcHJvZHVjZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBwcm9kdWNlcl9uYW1lKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19zaG1fc2l6ZV9rYigpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzaG1fc2l6ZV9rYigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGFnZV9zaXpl
X2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBhZ2Vf
c2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2Ns
YXNzIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNz
YWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFjZUNvbmZpZ19Qcm9kdWNlckNv
bmZpZ19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1Byb2R1Y2VyTmFtZUZpZWxk
TnVtYmVyID0gMSwKKyAgICBrU2htU2l6ZUtiRmllbGROdW1iZXIgPSAyLAorICAgIGtQYWdlU2l6
ZUtiRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfc2htX3NpemVfa2IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhZ2Vfc2l6ZV9rYih1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRy
YWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JF
UEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBUcmFjZUNvbmZpZ19CdWlsdGlu
RGF0YVNvdXJjZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19CdWls
dGluRGF0YVNvdXJjZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlX0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rpc2FibGVfY2xvY2tfc25h
cHNob3R0aW5nKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGJvb2wgZGlz
YWJsZV9jbG9ja19zbmFwc2hvdHRpbmcoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2Jvb2wo
KTsgfQorICBib29sIGhhc19kaXNhYmxlX3RyYWNlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkudmFsaWQoKTsgfQorICBib29sIGRpc2FibGVfdHJhY2VfY29uZmlnKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfZGlzYWJsZV9zeXN0ZW1faW5m
bygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBib29sIGRpc2FibGVfc3lz
dGVtX2luZm8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhh
c19kaXNhYmxlX3NlcnZpY2VfZXZlbnRzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgp
OyB9CisgIGJvb2wgZGlzYWJsZV9zZXJ2aWNlX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3ByaW1hcnlfdHJhY2VfY2xvY2soKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcmltYXJ5X3RyYWNlX2Nsb2Nr
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3NuYXBz
aG90X2ludGVydmFsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IHNuYXBzaG90X2ludGVydmFsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191
aW50MzIoKTsgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2UgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrRGlzYWJsZUNsb2NrU25hcHNob3R0aW5nRmllbGROdW1iZXIgPSAxLAorICAgIGtE
aXNhYmxlVHJhY2VDb25maWdGaWVsZE51bWJlciA9IDIsCisgICAga0Rpc2FibGVTeXN0ZW1JbmZv
RmllbGROdW1iZXIgPSAzLAorICAgIGtEaXNhYmxlU2VydmljZUV2ZW50c0ZpZWxkTnVtYmVyID0g
NCwKKyAgICBrUHJpbWFyeVRyYWNlQ2xvY2tGaWVsZE51bWJlciA9IDUsCisgICAga1NuYXBzaG90
SW50ZXJ2YWxNc0ZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKyAgdm9pZCBzZXRfZGlzYWJsZV9jbG9j
a19zbmFwc2hvdHRpbmcoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2Rpc2FibGVfdHJhY2VfY29uZmlnKGJvb2wgdmFsdWUpIHsK
KyAgICBBcHBlbmRUaW55VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kaXNhYmxl
X3N5c3RlbV9pbmZvKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDMsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9kaXNhYmxlX3NlcnZpY2VfZXZlbnRzKGJvb2wgdmFsdWUpIHsK
KyAgICBBcHBlbmRUaW55VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wcmltYXJ5
X3RyYWNlX2Nsb2NrKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpCdWlsdGluQ2xvY2sgdmFs
dWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9z
bmFwc2hvdF9pbnRlcnZhbF9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2
LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRyYWNlQ29uZmlnX0RhdGFTb3VyY2VfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoK
KyAgVHJhY2VDb25maWdfRGF0YVNvdXJjZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBU
cmFjZUNvbmZpZ19EYXRhU291cmNlX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2VDb25maWdfRGF0YVNvdXJjZV9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jb25maWcoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY29u
ZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3By
b2R1Y2VyX25hbWVfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hh
cnM+IHByb2R1Y2VyX25hbWVfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpw
cm90b3plcm86OkNvbnN0Q2hhcnM+KDIpOyB9CisgIGJvb2wgaGFzX3Byb2R1Y2VyX25hbWVfcmVn
ZXhfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IHByb2R1
Y2VyX25hbWVfcmVnZXhfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90
b3plcm86OkNvbnN0Q2hhcnM+KDMpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19EYXRhU291
cmNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBUcmFjZUNvbmZpZ19EYXRhU291cmNlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrQ29uZmlnRmllbGROdW1iZXIgPSAxLAorICAgIGtQcm9kdWNlck5hbWVGaWx0ZXJG
aWVsZE51bWJlciA9IDIsCisgICAga1Byb2R1Y2VyTmFtZVJlZ2V4RmlsdGVyRmllbGROdW1iZXIg
PSAzLAorICB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERhdGFTb3VyY2VDb25maWc+IFQq
IHNldF9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAg
fQorCisgIHZvaWQgYWRkX3Byb2R1Y2VyX25hbWVfZmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2
YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsK
KyAgfQorICB2b2lkIGFkZF9wcm9kdWNlcl9uYW1lX2ZpbHRlcihjb25zdCBjaGFyKiBkYXRhLCBz
aXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZv
aWQgYWRkX3Byb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAg
fQorICB2b2lkIGFkZF9wcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcihjb25zdCBjaGFyKiBkYXRh
LCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUpOworICB9Cit9
OworCitjbGFzcyBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRyYWNlQ29uZmln
X0J1ZmZlckNvbmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19C
dWZmZXJDb25maWdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzaXplX2tiKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19maWxsX3BvbGljeSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGZpbGxfcG9saWN5KCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19C
dWZmZXJDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga1NpemVLYkZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmlsbFBvbGlj
eUZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdXNpbmcgRmlsbFBvbGljeSA9IDo6cGVyZmV0dG86
OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeTsKKyAg
c3RhdGljIGNvbnN0IEZpbGxQb2xpY3kgVU5TUEVDSUZJRUQgPSBUcmFjZUNvbmZpZ19CdWZmZXJD
b25maWdfRmlsbFBvbGljeV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IEZpbGxQb2xpY3kg
UklOR19CVUZGRVIgPSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9SSU5HX0JV
RkZFUjsKKyAgc3RhdGljIGNvbnN0IEZpbGxQb2xpY3kgRElTQ0FSRCA9IFRyYWNlQ29uZmlnX0J1
ZmZlckNvbmZpZ19GaWxsUG9saWN5X0RJU0NBUkQ7CisgIHZvaWQgc2V0X3NpemVfa2IodWludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2ZpbGxfcG9saWN5KDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19CdWZm
ZXJDb25maWdfRmlsbFBvbGljeSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFs
dWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBO
YW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Nsb2NrX3NuYXBzaG90LnBi
emVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2lu
LiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X1RSQUNFX0NMT0NLX1NOQVBTSE9UX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fVFJBQ0VfQ0xPQ0tfU05BUFNIT1RfUFJPVE9fSF8KKworI2luY2x1ZGUg
PHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9y
ZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVy
byB7CisKK2NsYXNzIENsb2NrU25hcHNob3RfQ2xvY2s7CitlbnVtIEJ1aWx0aW5DbG9jayA6IGlu
dDMyX3Q7CisKK2VudW0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzIDogaW50MzJf
dCB7CisgIENsb2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19VTktOT1dOID0gMCwKKyAg
Q2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX1JFQUxUSU1FID0gMSwKKyAgQ2xvY2tT
bmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX1JFQUxUSU1FX0NPQVJTRSA9IDIsCisgIENsb2Nr
U25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19NT05PVE9OSUMgPSAzLAorICBDbG9ja1NuYXBz
aG90X0Nsb2NrX0J1aWx0aW5DbG9ja3NfTU9OT1RPTklDX0NPQVJTRSA9IDQsCisgIENsb2NrU25h
cHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19NT05PVE9OSUNfUkFXID0gNSwKKyAgQ2xvY2tTbmFw
c2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX0JPT1RUSU1FID0gNiwKKyAgQ2xvY2tTbmFwc2hvdF9D
bG9ja19CdWlsdGluQ2xvY2tzX0JVSUxUSU5fQ0xPQ0tfTUFYX0lEID0gNjMsCit9OworCitjb25z
dCBDbG9ja1NuYXBzaG90X0Nsb2NrX0J1aWx0aW5DbG9ja3MgQ2xvY2tTbmFwc2hvdF9DbG9ja19C
dWlsdGluQ2xvY2tzX01JTiA9IENsb2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19VTktO
T1dOOworY29uc3QgQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzIENsb2NrU25hcHNo
b3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19NQVggPSBDbG9ja1NuYXBzaG90X0Nsb2NrX0J1aWx0aW5D
bG9ja3NfQlVJTFRJTl9DTE9DS19NQVhfSUQ7CisKK2NsYXNzIENsb2NrU25hcHNob3RfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoK
KyAgQ2xvY2tTbmFwc2hvdF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4p
IDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDbG9ja1NuYXBz
aG90X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgQ2xvY2tTbmFwc2hvdF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19jbG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RC
eXRlcz4gY2xvY2tzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+KDEpOyB9CisgIGJvb2wgaGFzX3ByaW1hcnlfdHJhY2VfY2xvY2soKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcmltYXJ5X3RyYWNlX2Nsb2Nr
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBDbG9j
a1NuYXBzaG90IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBDbG9ja1NuYXBzaG90X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrQ2xvY2tzRmllbGROdW1iZXIgPSAxLAorICAgIGtQcmltYXJ5VHJhY2VDbG9ja0ZpZWxk
TnVtYmVyID0gMiwKKyAgfTsKKyAgdXNpbmcgQ2xvY2sgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBi
emVybzo6Q2xvY2tTbmFwc2hvdF9DbG9jazsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDbG9j
a1NuYXBzaG90X0Nsb2NrPiBUKiBhZGRfY2xvY2tzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMSk7CisgIH0KKworICB2b2lkIHNldF9wcmltYXJ5X3RyYWNlX2Nsb2NrKDo6
cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpCdWlsdGluQ2xvY2sgdmFsdWUpIHsKKyAgICBBcHBl
bmRUaW55VmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQ2xvY2tTbmFwc2hvdF9D
bG9ja19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4g
eworIHB1YmxpYzoKKyAgQ2xvY2tTbmFwc2hvdF9DbG9ja19EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBDbG9ja1NuYXBzaG90X0Nsb2NrX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2xvY2tTbmFwc2hvdF9DbG9j
a19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jbG9ja19pZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjbG9ja19pZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1w
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHRpbWVzdGFt
cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaXNf
aW5jcmVtZW50YWwoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBp
c19pbmNyZW1lbnRhbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfYm9vbCgpOyB9CisgIGJv
b2wgaGFzX3VuaXRfbXVsdGlwbGllcl9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCB1bml0X211bHRpcGxpZXJfbnMoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBDbG9ja1NuYXBzaG90X0Nsb2NrIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBD
bG9ja1NuYXBzaG90X0Nsb2NrX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2xv
Y2tJZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrVGltZXN0YW1wRmllbGROdW1iZXIgPSAyLAorICAg
IGtJc0luY3JlbWVudGFsRmllbGROdW1iZXIgPSAzLAorICAgIGtVbml0TXVsdGlwbGllck5zRmll
bGROdW1iZXIgPSA0LAorICB9OworICB1c2luZyBCdWlsdGluQ2xvY2tzID0gOjpwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OkNsb2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2NrczsKKyAgc3Rh
dGljIGNvbnN0IEJ1aWx0aW5DbG9ja3MgVU5LTk9XTiA9IENsb2NrU25hcHNob3RfQ2xvY2tfQnVp
bHRpbkNsb2Nrc19VTktOT1dOOworICBzdGF0aWMgY29uc3QgQnVpbHRpbkNsb2NrcyBSRUFMVElN
RSA9IENsb2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19SRUFMVElNRTsKKyAgc3RhdGlj
IGNvbnN0IEJ1aWx0aW5DbG9ja3MgUkVBTFRJTUVfQ09BUlNFID0gQ2xvY2tTbmFwc2hvdF9DbG9j
a19CdWlsdGluQ2xvY2tzX1JFQUxUSU1FX0NPQVJTRTsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5D
bG9ja3MgTU9OT1RPTklDID0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX01PTk9U
T05JQzsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5DbG9ja3MgTU9OT1RPTklDX0NPQVJTRSA9IENs
b2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19NT05PVE9OSUNfQ09BUlNFOworICBzdGF0
aWMgY29uc3QgQnVpbHRpbkNsb2NrcyBNT05PVE9OSUNfUkFXID0gQ2xvY2tTbmFwc2hvdF9DbG9j
a19CdWlsdGluQ2xvY2tzX01PTk9UT05JQ19SQVc7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluQ2xv
Y2tzIEJPT1RUSU1FID0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX0JPT1RUSU1F
OworICBzdGF0aWMgY29uc3QgQnVpbHRpbkNsb2NrcyBCVUlMVElOX0NMT0NLX01BWF9JRCA9IENs
b2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19CVUlMVElOX0NMT0NLX01BWF9JRDsKKyAg
dm9pZCBzZXRfY2xvY2tfaWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RpbWVzdGFtcCh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaXNfaW5jcmVtZW50YWwo
Ym9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3VuaXRfbXVsdGlwbGllcl9ucyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg0LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3Bh
Y2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvcGVyZmV0
dG8vdHJhY2luZ19zZXJ2aWNlX2V2ZW50LnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRo
ZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1BFUkZFVFRPX1RSQUNJTkdfU0VSVklD
RV9FVkVOVF9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X1RSQUNFX1BFUkZFVFRPX1RSQUNJTkdfU0VSVklDRV9FVkVOVF9QUk9UT19IXworCisjaW5jbHVk
ZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2Vk
X3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6
ZXJvIHsKKworCitjbGFzcyBUcmFjaW5nU2VydmljZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpw
cm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBUcmFjaW5nU2Vy
dmljZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNpbmdTZXJ2aWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBUcmFjaW5nU2VydmljZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2FsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBib29sIGFsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfYm9vbCgpOyB9Cit9OworCitjbGFzcyBUcmFjaW5n
U2VydmljZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBUcmFjaW5nU2VydmljZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrQWxsRGF0YVNvdXJjZXNTdGFydGVkRmllbGROdW1iZXIgPSAxLAorICB9
OworICB2b2lkIHNldF9hbGxfZGF0YV9zb3VyY2VzX3N0YXJ0ZWQoYm9vbCB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4K
K30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3Vh
cmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRv
L3RyYWNlL3N5c3RlbV9pbmZvLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90
b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19Q
Uk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1NZU1RFTV9JTkZPX1BST1RPX0hfCisjZGVmaW5l
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfU1lTVEVNX0lORk9fUFJPVE9f
SF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2Fn
ZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJv
dG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mgewor
bmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIFV0c25hbWU7CisKK2NsYXNzIFN5c3RlbUluZm9f
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIFN5c3RlbUluZm9fRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU3lzdGVt
SW5mb19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IFN5c3RlbUluZm9fRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfdXRzbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB1dHNuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2FuZHJvaWRfYnVpbGRfZmluZ2VycHJpbnQoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgYW5kcm9pZF9idWlsZF9maW5nZXJwcmludCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNf
c3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfaHooKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgaW50NjRfdCBoeigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsg
fQorfTsKKworY2xhc3MgU3lzdGVtSW5mbyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gU3lzdGVtSW5mb19EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga1V0c25hbWVGaWVsZE51bWJlciA9IDEsCisgICAga0FuZHJvaWRC
dWlsZEZpbmdlcnByaW50RmllbGROdW1iZXIgPSAyLAorICAgIGtIekZpZWxkTnVtYmVyID0gMywK
KyAgfTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBVdHNuYW1lPiBUKiBzZXRfdXRzbmFtZSgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOworICB9CisKKyAgdm9pZCBz
ZXRfYW5kcm9pZF9idWlsZF9maW5nZXJwcmludChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsK
KyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAg
dm9pZCBzZXRfYW5kcm9pZF9idWlsZF9maW5nZXJwcmludChjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQg
c2V0X2h6KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9
Cit9OworCitjbGFzcyBVdHNuYW1lX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBVdHNuYW1lX0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IFV0c25hbWVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBVdHNuYW1lX0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3N5c25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgc3lzbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdmVyc2lvbigpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB2
ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhh
c19yZWxlYXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdENoYXJzIHJlbGVhc2UoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3N0cmlu
ZygpOyB9CisgIGJvb2wgaGFzX21hY2hpbmUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbWFjaGluZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIFV0c25hbWUgOiBwdWJsaWMgOjpw
cm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFV0c25hbWVf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtTeXNuYW1lRmllbGROdW1iZXIgPSAx
LAorICAgIGtWZXJzaW9uRmllbGROdW1iZXIgPSAyLAorICAgIGtSZWxlYXNlRmllbGROdW1iZXIg
PSAzLAorICAgIGtNYWNoaW5lRmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9zeXNu
YW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9zeXNuYW1lKGNvbnN0IGNo
YXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7
CisgIH0KKyAgdm9pZCBzZXRfdmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAg
ICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9p
ZCBzZXRfdmVyc2lvbihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3JlbGVhc2UoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1
ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3JlbGVhc2UoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF9tYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDQsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9tYWNoaW5l
KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgZGF0
YSwgc2l6ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9
IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJpZ2dlci5wYnpl
cm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4g
RE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19U
UkFDRV9UUklHR0VSX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVS
RkVUVE9fVFJBQ0VfVFJJR0dFUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5j
bHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBU
cmlnZ2VyX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBUcmlnZ2VyX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRy
aWdnZXJfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBUcmlnZ2VyX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX3RyaWdnZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0cmlnZ2VyX25hbWUoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3Byb2R1Y2VyX25hbWUoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMg
cHJvZHVjZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAg
Ym9vbCBoYXNfdHJ1c3RlZF9wcm9kdWNlcl91aWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCB0cnVzdGVkX3Byb2R1Y2VyX3VpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgVHJpZ2dlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJpZ2dlcl9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RyaWdnZXJOYW1lRmllbGROdW1iZXIg
PSAxLAorICAgIGtQcm9kdWNlck5hbWVGaWVsZE51bWJlciA9IDIsCisgICAga1RydXN0ZWRQcm9k
dWNlclVpZEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfdHJpZ2dlcl9uYW1lKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF90cmlnZ2VyX25hbWUoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQor
ICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfdHJ1c3Rl
ZF9wcm9kdWNlcl91aWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1
ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVu
ZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICog
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
aWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgor
ICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisg
KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp
bmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli
dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ
VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhl
IExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMg
YW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9jb3JlL3RyYWNpbmdfc2Vy
dmljZV9pbXBsLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1
ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+
CisjaW5jbHVkZSA8cmVnZXg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2lmICFQRVJG
RVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKSAmJiBcCisgICAgIVBFUkZFVFRPX0JVSUxE
RkxBRyhQRVJGRVRUT19PU19OQUNMKQorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxz
eXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZiBQRVJGRVRU
T19CVUlMREZMQUcoUEVSRkVUVE9fT1NfQU5EUk9JRCkKKyNpbmNsdWRlIDxzeXMvc3lzdGVtX3By
b3BlcnRpZXMuaD4KKyNlbmRpZgorCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09T
X0FORFJPSUQpIHx8IFwKKyAgICBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTElOVVgp
IHx8ICAgXAorICAgIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19NQUNPU1gpCisjZGVm
aW5lIFBFUkZFVFRPX0hBU19DSE1PRAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKwor
I2luY2x1ZGUgPGFsZ29yaXRobT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvdGFza19ydW5uZXIuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL2ZpbGVfdXRp
bHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4
dC9iYXNlL21ldGF0cmFjZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L2Jhc2Uvc3RyaW5nX3V0aWxzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS91dGlscy5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2Uvd2F0Y2hkb2cu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90
cmFjaW5nL2NvcmUvY29uc3VtZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvb2JzZXJ2YWJsZV9ldmVudHMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5n
L2NvcmUvcHJvZHVjZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvc2hhcmVkX21lbW9yeS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9zaGFy
ZWRfbWVtb3J5X2FiaS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS90cmFjZV9wYWNrZXQuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2Vf
d3JpdGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc3RhdGljX2J1ZmZlci5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9j
b3JlL2RhdGFfc291cmNlX2Rlc2NyaXB0b3IuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS90cmFjaW5nX3NlcnZpY2VfY2FwYWJp
bGl0aWVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by90cmFjaW5nL2NvcmUvdHJhY2luZ19zZXJ2aWNlX3N0YXRlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9jb3JlL3BhY2tldF9zdHJlYW1fdmFs
aWRhdG9yLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJh
Y2luZy9jb3JlL3NoYXJlZF9tZW1vcnlfYXJiaXRlcl9pbXBsLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9jb3JlL3RyYWNlX2J1ZmZlci5oIgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8v
Y29tbW9uL2J1aWx0aW5fY2xvY2suZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2J1aWx0aW5fY2xvY2sucGJ6ZXJvLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8v
Y29tbW9uL3RyYWNlX3N0YXRzLnBiemVyby5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy90cmFjZV9jb25maWcucGJ6ZXJvLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8v
dHJhY2UvY2xvY2tfc25hcHNob3QucGJ6ZXJvLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvcGVyZmV0dG8vdHJhY2luZ19zZXJ2
aWNlX2V2ZW50LnBiemVyby5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3N5c3RlbV9pbmZvLnBiemVyby5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNl
X3BhY2tldC5wYnplcm8uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InByb3Rvcy9wZXJmZXR0by90cmFjZS90cmlnZ2VyLnBiemVyby5oIgorCisvLyBHZW5lcmFsIG5v
dGU6IHRoaXMgY2xhc3MgbXVzdCBhc3N1bWUgdGhhdCBQcm9kdWNlcnMgYXJlIG1hbGljaW91cyBh
bmQgd2lsbAorLy8gdHJ5IHRvIGNyYXNoIC8gZXhwbG9pdCB0aGlzIGNsYXNzLiBXZSBjYW4gdHJ1
c3QgcG9pbnRlcnMgYmVjYXVzZSB0aGV5IGNvbWUKKy8vIGZyb20gdGhlIElQQyBsYXllciwgYnV0
IHdlIHNob3VsZCBuZXZlciBhc3N1bWUgdGhhdCB0aGF0IHRoZSBwcm9kdWNlciBjYWxscworLy8g
Y29tZSBpbiB0aGUgcmlnaHQgb3JkZXIgb3IgdGhlaXIgYXJndW1lbnRzIGFyZSBzYW5lIC8gd2l0
aGluIGJvdW5kcy4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworbmFtZXNwYWNlIHsKK2NvbnN0
ZXhwciBpbnQga01heEJ1ZmZlcnNQZXJDb25zdW1lciA9IDEyODsKK2NvbnN0ZXhwciB1aW50MzJf
dCBrRGVmYXVsdFNuYXBzaG90c0ludGVydmFsTXMgPSAxMCAqIDEwMDA7Citjb25zdGV4cHIgaW50
IGtEZWZhdWx0V3JpdGVJbnRvRmlsZVBlcmlvZE1zID0gNTAwMDsKK2NvbnN0ZXhwciBpbnQga01h
eENvbmN1cnJlbnRUcmFjaW5nU2Vzc2lvbnMgPSAxNTsKK2NvbnN0ZXhwciBpbnQga01heENvbmN1
cnJlbnRUcmFjaW5nU2Vzc2lvbnNQZXJVaWQgPSA1OworY29uc3RleHByIGludCBrTWF4Q29uY3Vy
cmVudFRyYWNpbmdTZXNzaW9uc0ZvclN0YXRzZFVpZCA9IDEwOworY29uc3RleHByIGludDY0X3Qg
a01pblNlY29uZHNCZXR3ZWVuVHJhY2VzR3VhcmRyYWlsID0gNSAqIDYwOworCitjb25zdGV4cHIg
dWludDMyX3Qga01pbGxpc1BlckhvdXIgPSAzNjAwMDAwOworY29uc3RleHByIHVpbnQzMl90IGtN
YXhUcmFjaW5nRHVyYXRpb25NaWxsaXMgPSA3ICogMjQgKiBrTWlsbGlzUGVySG91cjsKKworLy8g
VGhlc2UgYXBwbHkgb25seSBpZiBlbmFibGVfZXh0cmFfZ3VhcmRyYWlscyBpcyB0cnVlLgorY29u
c3RleHByIHVpbnQzMl90IGtHdWFyZHJhaWxzTWF4VHJhY2luZ0J1ZmZlclNpemVLYiA9IDEyOCAq
IDEwMjQ7Citjb25zdGV4cHIgdWludDMyX3Qga0d1YXJkcmFpbHNNYXhUcmFjaW5nRHVyYXRpb25N
aWxsaXMgPSAyNCAqIGtNaWxsaXNQZXJIb3VyOworCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBF
UkZFVFRPX09TX1dJTikgfHwgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX05BQ0wpCitz
dHJ1Y3QgaW92ZWMgeworICB2b2lkKiBpb3ZfYmFzZTsgIC8vIEFkZHJlc3MKKyAgc2l6ZV90IGlv
dl9sZW47ICAvLyBCbG9jayBzaXplCit9OworCisvLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Yg
d3JpdGV2LiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBnaXZlIHRoZSBhdG9taWNpdHkKKy8vIGd1
YXJhbnRlZXMgb2YgYSByZWFsIHdyaXRldiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGVzZSAo
d2UgYXJlbid0IHdyaXRpbmcKKy8vIHRvIHRoZSBzYW1lIGZpbGUgZnJvbSBhbm90aGVyIHRocmVh
ZCkuCitzc2l6ZV90IHdyaXRldihpbnQgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyogaW92LCBpbnQg
aW92Y250KSB7CisgIHNzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBp
IDwgaW92Y250OyArK2kpIHsKKyAgICBzc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IGJhc2U6OldyaXRl
QWxsKGZkLCBpb3ZbaV0uaW92X2Jhc2UsIGlvdltpXS5pb3ZfbGVuKTsKKyAgICBpZiAoY3VycmVu
dF9zaXplICE9IHN0YXRpY19jYXN0PHNzaXplX3Q+KGlvdltpXS5pb3ZfbGVuKSkKKyAgICAgIHJl
dHVybiAtMTsKKyAgICB0b3RhbF9zaXplICs9IGN1cnJlbnRfc2l6ZTsKKyAgfQorICByZXR1cm4g
dG90YWxfc2l6ZTsKK30KKworI2RlZmluZSBJT1ZfTUFYIDEwMjQgIC8vIExpbnV4IGNvbXBhdGli
bGUgbGltaXQuCisKKy8vIHVpZCBjaGVja2luZyBpcyBhIE5PUCBvbiBXaW5kb3dzLgordWlkX3Qg
Z2V0dWlkKCkgeworICByZXR1cm4gMDsKK30KK3VpZF90IGdldGV1aWQoKSB7CisgIHJldHVybiAw
OworfQorI2VuZGlmICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKSB8fAor
ICAgICAgICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTkFDTCkKKworLy8gUGFy
dGlhbGx5IGVuY29kZXMgYSBDb21taXREYXRhUmVxdWVzdCBpbiBhbiBpbnQzMiBmb3IgdGhlIHB1
cnBvc2VzIG9mCisvLyBtZXRhdHJhY2luZy4gTm90ZSB0aGF0IGl0IGVuY29kZXMgb25seSB0aGUg
Ym90dG9tIDEwIGJpdHMgb2YgdGhlIHByb2R1Y2VyIGlkCisvLyAod2hpY2ggaXMgdGVjaG5pY2Fs
bHkgMTYgYml0cyB3aWRlKS4KKy8vCisvLyBGb3JtYXQgKGJ5IGJpdCByYW5nZSk6CisvLyBbICAg
MzEgXVsgICAgICAgICAzMCBdWyAgICAgICAgICAgICAyOToyMCBdWyAgICAgICAgICAgIDE5OjEw
IF1bICAgICAgICA5OjBdCisvLyBbdW51c2VkXVtoYXMgZmx1c2ggaWRdW251bSBjaHVua3MgdG8g
cGF0Y2hdW251bSBjaHVua3MgdG8gbW92ZV1bcHJvZHVjZXIgaWRdCitzdGF0aWMgaW50MzJfdCBF
bmNvZGVDb21taXREYXRhUmVxdWVzdChQcm9kdWNlcklEIHByb2R1Y2VyX2lkLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWl0RGF0YVJlcXVlc3QmIHJl
cV91bnRydXN0ZWQpIHsKKyAgdWludDMyX3QgY21vdiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihy
ZXFfdW50cnVzdGVkLmNodW5rc190b19tb3ZlX3NpemUoKSk7CisgIHVpbnQzMl90IGNwYXRjaCA9
IHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXFfdW50cnVzdGVkLmNodW5rc190b19wYXRjaF9zaXpl
KCkpOworICB1aW50MzJfdCBoYXNfZmx1c2hfaWQgPSByZXFfdW50cnVzdGVkLmZsdXNoX3JlcXVl
c3RfaWQoKSAhPSAwOworCisgIHVpbnQzMl90IG1hc2sgPSAoMSA8PCAxMCkgLSAxOworICB1aW50
MzJfdCBhY2MgPSAwOworICBhY2MgfD0gaGFzX2ZsdXNoX2lkIDw8IDMwOworICBhY2MgfD0gKGNw
YXRjaCAmIG1hc2spIDw8IDIwOworICBhY2MgfD0gKGNtb3YgJiBtYXNrKSA8PCAxMDsKKyAgYWNj
IHw9IChwcm9kdWNlcl9pZCAmIG1hc2spOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4o
YWNjKTsKK30KKwordm9pZCBTZXJpYWxpemVBbmRBcHBlbmRQYWNrZXQoc3RkOjp2ZWN0b3I8VHJh
Y2VQYWNrZXQ+KiBwYWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2
ZWN0b3I8dWludDhfdD4gcGFja2V0KSB7CisgIFNsaWNlIHNsaWNlID0gU2xpY2U6OkFsbG9jYXRl
KHBhY2tldC5zaXplKCkpOworICBtZW1jcHkoc2xpY2Uub3duX2RhdGEoKSwgcGFja2V0LmRhdGEo
KSwgcGFja2V0LnNpemUoKSk7CisgIHBhY2tldHMtPmVtcGxhY2VfYmFjaygpOworICBwYWNrZXRz
LT5iYWNrKCkuQWRkU2xpY2Uoc3RkOjptb3ZlKHNsaWNlKSk7Cit9CisKK3N0ZDo6dHVwbGU8c2l6
ZV90IC8qc2htX3NpemUqLywgc2l6ZV90IC8qcGFnZV9zaXplKi8+IEVuc3VyZVZhbGlkU2htU2l6
ZXMoCisgICAgc2l6ZV90IHNobV9zaXplLAorICAgIHNpemVfdCBwYWdlX3NpemUpIHsKKyAgLy8g
VGhlb3JldGljYWxseSB0aGUgbWF4IHBhZ2Ugc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIEFCSSBpcyA2
NEtCLgorICAvLyBIb3dldmVyLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBUcmFjZUJ1
ZmZlciAodGhlIG5vbi1zaGFyZWQKKyAgLy8gdXNlcnNwYWNlIGJ1ZmZlciB3aGVyZSB0aGUgc2Vy
dmljZSBjb3BpZXMgZGF0YSkgc3VwcG9ydHMgYXQgbW9zdAorICAvLyAzMksuIFNldHRpbmcgNjRL
ICJ3b3JrcyIgZnJvbSB0aGUgcHJvZHVjZXI8PmNvbnN1bWVyIHZpZXdwb2ludAorICAvLyBidXQg
dGhlbiBjYXVzZXMgdGhlIGRhdGEgdG8gYmUgZGlzY2FyZGVkIHdoZW4gY29weWluZyBpdCBpbnRv
CisgIC8vIFRyYWNlQnVmZmVyLgorICBjb25zdGV4cHIgc2l6ZV90IGtNYXhQYWdlU2l6ZSA9IDMy
ICogMTAyNDsKKyAgc3RhdGljX2Fzc2VydChrTWF4UGFnZVNpemUgPD0gU2hhcmVkTWVtb3J5QUJJ
OjprTWF4UGFnZVNpemUsICIiKTsKKworICBpZiAocGFnZV9zaXplID09IDApCisgICAgcGFnZV9z
aXplID0gVHJhY2luZ1NlcnZpY2VJbXBsOjprRGVmYXVsdFNobVBhZ2VTaXplOworICBpZiAoc2ht
X3NpemUgPT0gMCkKKyAgICBzaG1fc2l6ZSA9IFRyYWNpbmdTZXJ2aWNlSW1wbDo6a0RlZmF1bHRT
aG1TaXplOworCisgIHBhZ2Vfc2l6ZSA9IHN0ZDo6bWluPHNpemVfdD4ocGFnZV9zaXplLCBrTWF4
UGFnZVNpemUpOworICBzaG1fc2l6ZSA9IHN0ZDo6bWluPHNpemVfdD4oc2htX3NpemUsIFRyYWNp
bmdTZXJ2aWNlSW1wbDo6a01heFNobVNpemUpOworCisgIC8vIFBhZ2Ugc2l6ZSBoYXMgdG8gYmUg
bXVsdGlwbGUgb2Ygc3lzdGVtJ3MgcGFnZSBzaXplLgorICBib29sIHBhZ2Vfc2l6ZV9pc192YWxp
ZCA9IHBhZ2Vfc2l6ZSA+PSBiYXNlOjprUGFnZVNpemU7CisgIHBhZ2Vfc2l6ZV9pc192YWxpZCAm
PSBwYWdlX3NpemUgJSBiYXNlOjprUGFnZVNpemUgPT0gMDsKKworICAvLyBPbmx5IGFsbG93IHBv
d2VyIG9mIHR3byBudW1iZXJzIG9mIHBhZ2VzLCBpLmUuIDEsIDIsIDQsIDggcGFnZXMuCisgIHNp
emVfdCBudW1fcGFnZXMgPSBwYWdlX3NpemUgLyBiYXNlOjprUGFnZVNpemU7CisgIHBhZ2Vfc2l6
ZV9pc192YWxpZCAmPSAobnVtX3BhZ2VzICYgKG51bV9wYWdlcyAtIDEpKSA9PSAwOworCisgIGlm
ICghcGFnZV9zaXplX2lzX3ZhbGlkIHx8IHNobV9zaXplIDwgcGFnZV9zaXplIHx8CisgICAgICBz
aG1fc2l6ZSAlIHBhZ2Vfc2l6ZSAhPSAwKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShU
cmFjaW5nU2VydmljZUltcGw6OmtEZWZhdWx0U2htU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRyYWNpbmdTZXJ2aWNlSW1wbDo6a0RlZmF1bHRTaG1QYWdlU2l6ZSk7CisgIH0KKyAg
cmV0dXJuIHN0ZDo6bWFrZV90dXBsZShzaG1fc2l6ZSwgcGFnZV9zaXplKTsKK30KKworYm9vbCBO
YW1lTWF0Y2hlc0ZpbHRlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBuYW1lX2ZpbHRlciwKKyAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBuYW1l
X3JlZ2V4X2ZpbHRlcikgeworICBib29sIGZpbHRlcl9pc19zZXQgPSAhbmFtZV9maWx0ZXIuZW1w
dHkoKSB8fCAhbmFtZV9yZWdleF9maWx0ZXIuZW1wdHkoKTsKKyAgaWYgKCFmaWx0ZXJfaXNfc2V0
KQorICAgIHJldHVybiB0cnVlOworICBib29sIGZpbHRlcl9tYXRjaGVzID0gc3RkOjpmaW5kKG5h
bWVfZmlsdGVyLmJlZ2luKCksIG5hbWVfZmlsdGVyLmVuZCgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG5hbWUpICE9IG5hbWVfZmlsdGVyLmVuZCgpOworICBib29sIGZpbHRl
cl9yZWdleF9tYXRjaGVzID0KKyAgICAgIHN0ZDo6ZmluZF9pZihuYW1lX3JlZ2V4X2ZpbHRlci5i
ZWdpbigpLCBuYW1lX3JlZ2V4X2ZpbHRlci5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBbJl0o
Y29uc3Qgc3RkOjpzdHJpbmcmIHJlZ2V4KSB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
c3RkOjpyZWdleF9tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzdGQ6OnJl
Z2V4KHJlZ2V4LCBzdGQ6OnJlZ2V4OjpleHRlbmRlZCkpOworICAgICAgICAgICAgICAgICAgIH0p
ICE9IG5hbWVfcmVnZXhfZmlsdGVyLmVuZCgpOworICByZXR1cm4gZmlsdGVyX21hdGNoZXMgfHwg
ZmlsdGVyX3JlZ2V4X21hdGNoZXM7Cit9CisKKy8vIFVzZWQgd2hlbiB3cml0ZV9pbnRvX2ZpbGUg
PT0gdHJ1ZSBhbmQgb3V0cHV0X3BhdGggaXMgbm90IGVtcHR5LgorYmFzZTo6U2NvcGVkRmlsZSBD
cmVhdGVUcmFjZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyNpZiBQRVJGRVRUT19C
VUlMREZMQUcoUEVSRkVUVE9fQU5EUk9JRF9CVUlMRCkKKyAgc3RhdGljIGNvbnN0IGNoYXIga0Jh
c2VbXSA9ICIvZGF0YS9taXNjL3BlcmZldHRvLXRyYWNlcy8iOworICBpZiAoIWJhc2U6OlN0YXJ0
c1dpdGgocGF0aCwga0Jhc2UpIHx8IHBhdGgucmZpbmQoJy8nKSAhPSBzdHJsZW4oa0Jhc2UpIC0g
MSkgeworICAgIFBFUkZFVFRPX0VMT0coIkludmFsaWQgb3V0cHV0X3BhdGggJXMuIE9uIEFuZHJv
aWQgaXQgbXVzdCBiZSB3aXRoaW4gJXMuIiwKKyAgICAgICAgICAgICAgICAgIHBhdGguY19zdHIo
KSwga0Jhc2UpOworICAgIHJldHVybiBiYXNlOjpTY29wZWRGaWxlKCk7CisgIH0KKyNlbmRpZgor
ICAvLyBPX0NSRUFUIHwgT19FWENMIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSBleGlzdHMgYWxyZWFk
eS4KKyAgYXV0byBmZCA9IGJhc2U6Ok9wZW5GaWxlKHBhdGgsIE9fUkRXUiB8IE9fQ1JFQVQgfCBP
X0VYQ0wsIDA2MDApOworICBpZiAoIWZkKQorICAgIFBFUkZFVFRPX1BMT0coIkZhaWxlZCB0byBj
cmVhdGUgJXMiLCBwYXRoLmNfc3RyKCkpOworI2lmIGRlZmluZWQoUEVSRkVUVE9fSEFTX0NITU9E
KQorICAvLyBQYXNzaW5nIDA2NDQgZGlyZWN0bHkgYWJvdmUgd29uJ3Qgd29yayBiZWNhdXNlIG9m
IHVtYXNrLgorICBQRVJGRVRUT19DSEVDSyhmY2htb2QoKmZkLCAwNjQ0KSA9PSAwKTsKKyNlbmRp
ZgorICByZXR1cm4gZmQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUaGVzZSBjb25zdGFu
dHMgaW5zdGVhZCBhcmUgZGVmaW5lZCBpbiB0aGUgaGVhZGVyIGJlY2F1c2UgYXJlIHVzZWQgYnkg
dGVzdHMuCitjb25zdGV4cHIgc2l6ZV90IFRyYWNpbmdTZXJ2aWNlSW1wbDo6a0RlZmF1bHRTaG1T
aXplOworY29uc3RleHByIHNpemVfdCBUcmFjaW5nU2VydmljZUltcGw6OmtEZWZhdWx0U2htUGFn
ZVNpemU7CisKK2NvbnN0ZXhwciBzaXplX3QgVHJhY2luZ1NlcnZpY2VJbXBsOjprTWF4U2htU2l6
ZTsKK2NvbnN0ZXhwciB1aW50MzJfdCBUcmFjaW5nU2VydmljZUltcGw6OmtEYXRhU291cmNlU3Rv
cFRpbWVvdXRNczsKK2NvbnN0ZXhwciB1aW50OF90IFRyYWNpbmdTZXJ2aWNlSW1wbDo6a1N5bmNN
YXJrZXJbXTsKKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8VHJhY2luZ1NlcnZpY2U+IFRy
YWNpbmdTZXJ2aWNlOjpDcmVhdGVJbnN0YW5jZSgKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVk
TWVtb3J5OjpGYWN0b3J5PiBzaG1fZmFjdG9yeSwKKyAgICBiYXNlOjpUYXNrUnVubmVyKiB0YXNr
X3J1bm5lcikgeworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFRyYWNpbmdTZXJ2aWNlPigKKyAg
ICAgIG5ldyBUcmFjaW5nU2VydmljZUltcGwoc3RkOjptb3ZlKHNobV9mYWN0b3J5KSwgdGFza19y
dW5uZXIpKTsKK30KKworVHJhY2luZ1NlcnZpY2VJbXBsOjpUcmFjaW5nU2VydmljZUltcGwoCisg
ICAgc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeTo6RmFjdG9yeT4gc2htX2ZhY3RvcnksCisg
ICAgYmFzZTo6VGFza1J1bm5lciogdGFza19ydW5uZXIpCisgICAgOiB0YXNrX3J1bm5lcl8odGFz
a19ydW5uZXIpLAorICAgICAgc2htX2ZhY3RvcnlfKHN0ZDo6bW92ZShzaG1fZmFjdG9yeSkpLAor
ICAgICAgdWlkXyhnZXR1aWQoKSksCisgICAgICBidWZmZXJfaWRzXyhrTWF4VHJhY2VCdWZmZXJJ
RCksCisgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSB7CisgIFBFUkZFVFRPX0RDSEVDSyh0
YXNrX3J1bm5lcl8pOworfQorCitUcmFjaW5nU2VydmljZUltcGw6On5UcmFjaW5nU2VydmljZUlt
cGwoKSB7CisgIC8vIFRPRE8oZm1heWVyKTogaGFuZGxlIHRlYXJkb3duIG9mIGFsbCBQcm9kdWNl
ci4KK30KKworc3RkOjp1bmlxdWVfcHRyPFRyYWNpbmdTZXJ2aWNlOjpQcm9kdWNlckVuZHBvaW50
PgorVHJhY2luZ1NlcnZpY2VJbXBsOjpDb25uZWN0UHJvZHVjZXIoUHJvZHVjZXIqIHByb2R1Y2Vy
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2R1Y2Vy
X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hhcmVk
X21lbW9yeV9zaXplX2hpbnRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBib29sIGluX3Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBQcm9kdWNlclNNQlNjcmFwaW5nTW9kZSBzbWJfc2NyYXBpbmdfbW9kZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9o
aW50X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlx
dWVfcHRyPFNoYXJlZE1lbW9yeT4gc2htKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhy
ZWFkX2NoZWNrZXJfKTsKKworICBpZiAobG9ja2Rvd25fbW9kZV8gJiYgdWlkICE9IGdldGV1aWQo
KSkgeworICAgIFBFUkZFVFRPX0RMT0coIkxvY2tkb3duIG1vZGUuIFJlamVjdGluZyBwcm9kdWNl
ciB3aXRoIFVJRCAlbGQiLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQg
bG9uZz4odWlkKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAocHJvZHVjZXJz
Xy5zaXplKCkgPj0ga01heFByb2R1Y2VySUQpIHsKKyAgICBQRVJGRVRUT19ERkFUQUwoIlRvbyBt
YW55IHByb2R1Y2Vycy4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjb25zdCBQcm9k
dWNlcklEIGlkID0gR2V0TmV4dFByb2R1Y2VySUQoKTsKKyAgUEVSRkVUVE9fRExPRygiUHJvZHVj
ZXIgJSIgUFJJdTE2ICIgY29ubmVjdGVkIiwgaWQpOworCisgIGJvb2wgc21iX3NjcmFwaW5nX2Vu
YWJsZWQgPSBzbWJfc2NyYXBpbmdfZW5hYmxlZF87CisgIHN3aXRjaCAoc21iX3NjcmFwaW5nX21v
ZGUpIHsKKyAgICBjYXNlIFByb2R1Y2VyU01CU2NyYXBpbmdNb2RlOjprRGVmYXVsdDoKKyAgICAg
IGJyZWFrOworICAgIGNhc2UgUHJvZHVjZXJTTUJTY3JhcGluZ01vZGU6OmtFbmFibGVkOgorICAg
ICAgc21iX3NjcmFwaW5nX2VuYWJsZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQ
cm9kdWNlclNNQlNjcmFwaW5nTW9kZTo6a0Rpc2FibGVkOgorICAgICAgc21iX3NjcmFwaW5nX2Vu
YWJsZWQgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBy
b2R1Y2VyRW5kcG9pbnRJbXBsPiBlbmRwb2ludChuZXcgUHJvZHVjZXJFbmRwb2ludEltcGwoCisg
ICAgICBpZCwgdWlkLCB0aGlzLCB0YXNrX3J1bm5lcl8sIHByb2R1Y2VyLCBwcm9kdWNlcl9uYW1l
LCBpbl9wcm9jZXNzLAorICAgICAgc21iX3NjcmFwaW5nX2VuYWJsZWQpKTsKKyAgYXV0byBpdF9h
bmRfaW5zZXJ0ZWQgPSBwcm9kdWNlcnNfLmVtcGxhY2UoaWQsIGVuZHBvaW50LmdldCgpKTsKKyAg
UEVSRkVUVE9fRENIRUNLKGl0X2FuZF9pbnNlcnRlZC5zZWNvbmQpOworICBlbmRwb2ludC0+c2ht
ZW1fc2l6ZV9oaW50X2J5dGVzXyA9IHNoYXJlZF9tZW1vcnlfc2l6ZV9oaW50X2J5dGVzOworICBl
bmRwb2ludC0+c2htZW1fcGFnZV9zaXplX2hpbnRfYnl0ZXNfID0gc2hhcmVkX21lbW9yeV9wYWdl
X3NpemVfaGludF9ieXRlczsKKworICAvLyBQcm9kdWNlcjo6T25Db25uZWN0KCkgc2hvdWxkIHJ1
biBiZWZvcmUgUHJvZHVjZXI6Ok9uVHJhY2luZ1NldHVwKCkuIFRoZQorICAvLyBsYXR0ZXIgbWF5
IGJlIHBvc3RlZCBieSBTZXR1cFNoYXJlZE1lbW9yeSgpIGJlbG93LCBzbyBwb3N0IE9uQ29ubmVj
dCgpIG5vdy4KKyAgdGFza19ydW5uZXJfLT5Qb3N0VGFzayhzdGQ6OmJpbmQoJlByb2R1Y2VyOjpP
bkNvbm5lY3QsIGVuZHBvaW50LT5wcm9kdWNlcl8pKTsKKworICBpZiAoc2htKSB7CisgICAgLy8g
VGhlIHByb2R1Y2VyIHN1cHBsaWVkIGFuIFNNQi4gVGhpcyBpcyB1c2VkIG9ubHkgYnkgQ2hyb21l
OyBpbiB0aGUgbW9zdAorICAgIC8vIGNvbW1vbiBjYXNlcyB0aGUgU01CIGlzIGNyZWF0ZWQgYnkg
dGhlIHNlcnZpY2UgYW5kIHBhc3NlZCB2aWEKKyAgICAvLyBPblRyYWNpbmdTZXR1cCgpLiBWZXJp
ZnkgdGhhdCBpdCBpcyBjb3JyZWN0bHkgc2l6ZWQgYmVmb3JlIHdlIGF0dGVtcHQgdG8KKyAgICAv
LyB1c2UgaXQuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgaGFzIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5
IG9mIHRoZSBTTUIgKGUuZy4KKyAgICAvLyBlbnN1cmUgdGhhdCB0aGUgcHJvZHVjZXIgY2FuJ3Qg
cmVzaXplIGlmIGFmdGVyIHRoZSBmYWN0KS4KKyAgICBzaXplX3Qgc2htX3NpemUsIHBhZ2Vfc2l6
ZTsKKyAgICBzdGQ6OnRpZShzaG1fc2l6ZSwgcGFnZV9zaXplKSA9CisgICAgICAgIEVuc3VyZVZh
bGlkU2htU2l6ZXMoc2htLT5zaXplKCksIGVuZHBvaW50LT5zaG1lbV9wYWdlX3NpemVfaGludF9i
eXRlc18pOworICAgIGlmIChzaG1fc2l6ZSA9PSBzaG0tPnNpemUoKSAmJgorICAgICAgICBwYWdl
X3NpemUgPT0gZW5kcG9pbnQtPnNobWVtX3BhZ2Vfc2l6ZV9oaW50X2J5dGVzXykgeworICAgICAg
UEVSRkVUVE9fRExPRygKKyAgICAgICAgICAiQWRvcHRpbmcgcHJvZHVjZXItcHJvdmlkZWQgU01C
IG9mICV6dSBrQiBmb3IgcHJvZHVjZXIgXCIlc1wiIiwKKyAgICAgICAgICBzaG1fc2l6ZSAvIDEw
MjQsIGVuZHBvaW50LT5uYW1lXy5jX3N0cigpKTsKKyAgICAgIGVuZHBvaW50LT5TZXR1cFNoYXJl
ZE1lbW9yeShzdGQ6Om1vdmUoc2htKSwgcGFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8qcHJvdmlkZWRfYnlfcHJvZHVjZXI9Ki90cnVlKTsKKyAgICB9IGVsc2Ug
eworICAgICAgUEVSRkVUVE9fTE9HKAorICAgICAgICAgICJEaXNjYXJkaW5nIGluY29ycmVjdGx5
IHNpemVkIHByb2R1Y2VyLXByb3ZpZGVkIFNNQiBmb3IgcHJvZHVjZXIgIgorICAgICAgICAgICJc
IiVzXCIsIGZhbGxpbmcgYmFjayB0byBzZXJ2aWNlLXByb3ZpZGVkIFNNQi4gUmVxdWVzdGVkIHNp
emVzOiAlenUgIgorICAgICAgICAgICJCIHRvdGFsLCAlenUgQiBwYWdlIHNpemU7IHN1Z2dlc3Rl
ZCBjb3JyZWN0ZWQgc2l6ZXM6ICV6dSBCIHRvdGFsLCAiCisgICAgICAgICAgIiV6dSBCIHBhZ2Ug
c2l6ZSIsCisgICAgICAgICAgZW5kcG9pbnQtPm5hbWVfLmNfc3RyKCksIHNobS0+c2l6ZSgpLAor
ICAgICAgICAgIGVuZHBvaW50LT5zaG1lbV9wYWdlX3NpemVfaGludF9ieXRlc18sIHNobV9zaXpl
LCBwYWdlX3NpemUpOworICAgICAgc2htLnJlc2V0KCk7CisgICAgfQorICB9CisKKyAgcmV0dXJu
IHN0ZDo6dW5pcXVlX3B0cjxQcm9kdWNlckVuZHBvaW50PihzdGQ6Om1vdmUoZW5kcG9pbnQpKTsK
K30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OkRpc2Nvbm5lY3RQcm9kdWNlcihQcm9kdWNl
cklEIGlkKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAg
UEVSRkVUVE9fRExPRygiUHJvZHVjZXIgJSIgUFJJdTE2ICIgZGlzY29ubmVjdGVkIiwgaWQpOwor
ICBQRVJGRVRUT19EQ0hFQ0socHJvZHVjZXJzXy5jb3VudChpZCkpOworCisgIC8vIFNjcmFwZSBy
ZW1haW5pbmcgY2h1bmtzIGZvciB0aGlzIHByb2R1Y2VyIHRvIGVuc3VyZSB3ZSBkb24ndCBsb3Nl
IGRhdGEuCisgIGlmIChhdXRvKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyKGlkKSkgeworICAgIGZv
ciAoYXV0byYgc2Vzc2lvbl9pZF9hbmRfc2Vzc2lvbiA6IHRyYWNpbmdfc2Vzc2lvbnNfKQorICAg
ICAgU2NyYXBlU2hhcmVkTWVtb3J5QnVmZmVycygmc2Vzc2lvbl9pZF9hbmRfc2Vzc2lvbi5zZWNv
bmQsIHByb2R1Y2VyKTsKKyAgfQorCisgIGZvciAoYXV0byBpdCA9IGRhdGFfc291cmNlc18uYmVn
aW4oKTsgaXQgIT0gZGF0YV9zb3VyY2VzXy5lbmQoKTspIHsKKyAgICBhdXRvIG5leHQgPSBpdDsK
KyAgICBuZXh0Kys7CisgICAgaWYgKGl0LT5zZWNvbmQucHJvZHVjZXJfaWQgPT0gaWQpCisgICAg
ICBVbnJlZ2lzdGVyRGF0YVNvdXJjZShpZCwgaXQtPnNlY29uZC5kZXNjcmlwdG9yLm5hbWUoKSk7
CisgICAgaXQgPSBuZXh0OworICB9CisKKyAgcHJvZHVjZXJzXy5lcmFzZShpZCk7CisgIFVwZGF0
ZU1lbW9yeUd1YXJkcmFpbCgpOworfQorCitUcmFjaW5nU2VydmljZUltcGw6OlByb2R1Y2VyRW5k
cG9pbnRJbXBsKiBUcmFjaW5nU2VydmljZUltcGw6OkdldFByb2R1Y2VyKAorICAgIFByb2R1Y2Vy
SUQgaWQpIGNvbnN0IHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8p
OworICBhdXRvIGl0ID0gcHJvZHVjZXJzXy5maW5kKGlkKTsKKyAgaWYgKGl0ID09IHByb2R1Y2Vy
c18uZW5kKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBpdC0+c2Vjb25kOworfQor
CitzdGQ6OnVuaXF1ZV9wdHI8VHJhY2luZ1NlcnZpY2U6OkNvbnN1bWVyRW5kcG9pbnQ+CitUcmFj
aW5nU2VydmljZUltcGw6OkNvbm5lY3RDb25zdW1lcihDb25zdW1lciogY29uc3VtZXIsIHVpZF90
IHVpZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFBF
UkZFVFRPX0RMT0coIkNvbnN1bWVyICVwIGNvbm5lY3RlZCIsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9p
ZCo+KGNvbnN1bWVyKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lckVuZHBvaW50SW1wbD4g
ZW5kcG9pbnQoCisgICAgICBuZXcgQ29uc3VtZXJFbmRwb2ludEltcGwodGhpcywgdGFza19ydW5u
ZXJfLCBjb25zdW1lciwgdWlkKSk7CisgIGF1dG8gaXRfYW5kX2luc2VydGVkID0gY29uc3VtZXJz
Xy5lbXBsYWNlKGVuZHBvaW50LmdldCgpKTsKKyAgUEVSRkVUVE9fRENIRUNLKGl0X2FuZF9pbnNl
cnRlZC5zZWNvbmQpOworICAvLyBDb25zdW1lciBtaWdodCBnbyBhd2F5IGJlZm9yZSB3ZSdyZSBh
YmxlIHRvIHNlbmQgdGhlIGNvbm5lY3Qgbm90aWZpY2F0aW9uLAorICAvLyBpZiB0aGF0IGlzIHRo
ZSBjYXNlIGp1c3QgYmFpbCBvdXQuCisgIGF1dG8gd2Vha19wdHIgPSBlbmRwb2ludC0+R2V0V2Vh
a1B0cigpOworICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt3ZWFrX3B0cl0geworICAgIGlmICgh
d2Vha19wdHIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2Vha19wdHItPmNvbnN1bWVy
Xy0+T25Db25uZWN0KCk7CisgIH0pOworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPENvbnN1bWVy
RW5kcG9pbnQ+KHN0ZDo6bW92ZShlbmRwb2ludCkpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNl
SW1wbDo6RGlzY29ubmVjdENvbnN1bWVyKENvbnN1bWVyRW5kcG9pbnRJbXBsKiBjb25zdW1lcikg
eworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFBFUkZFVFRP
X0RMT0coIkNvbnN1bWVyICVwIGRpc2Nvbm5lY3RlZCIsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+
KGNvbnN1bWVyKSk7CisgIFBFUkZFVFRPX0RDSEVDSyhjb25zdW1lcnNfLmNvdW50KGNvbnN1bWVy
KSk7CisKKyAgLy8gVE9ETyhwcmltaWFubykgOiBDaGVjayB0aGF0IHRoaXMgaXMgc2FmZSAod2hh
dCBoYXBwZW5zIGlmIHRoZXJlIGFyZQorICAvLyBSZWFkQnVmZmVycygpIGNhbGxzIHBvc3RlZCBp
biB0aGUgbWVhbnRpbWU/IFRoZXkgbmVlZCB0byBiZWNvbWUgbm9vcCkuCisgIGlmIChjb25zdW1l
ci0+dHJhY2luZ19zZXNzaW9uX2lkXykKKyAgICBGcmVlQnVmZmVycyhjb25zdW1lci0+dHJhY2lu
Z19zZXNzaW9uX2lkXyk7ICAvLyBXaWxsIGFsc28gRGlzYWJsZVRyYWNpbmcoKS4KKyAgY29uc3Vt
ZXJzXy5lcmFzZShjb25zdW1lcik7CisKKyAgLy8gQXQgdGhpcyBwb2ludCBubyBtb3JlIHBvaW50
ZXJzIHRvIHxjb25zdW1lcnwgc2hvdWxkIGJlIGFyb3VuZC4KKyAgUEVSRkVUVE9fRENIRUNLKCFz
dGQ6OmFueV9vZigKKyAgICAgIHRyYWNpbmdfc2Vzc2lvbnNfLmJlZ2luKCksIHRyYWNpbmdfc2Vz
c2lvbnNfLmVuZCgpLAorICAgICAgW2NvbnN1bWVyXShjb25zdCBzdGQ6OnBhaXI8Y29uc3QgVHJh
Y2luZ1Nlc3Npb25JRCwgVHJhY2luZ1Nlc3Npb24+JiBrdikgeworICAgICAgICByZXR1cm4ga3Yu
c2Vjb25kLmNvbnN1bWVyX21heWJlX251bGwgPT0gY29uc3VtZXI7CisgICAgICB9KSk7Cit9CisK
K2Jvb2wgVHJhY2luZ1NlcnZpY2VJbXBsOjpEZXRhY2hDb25zdW1lcihDb25zdW1lckVuZHBvaW50
SW1wbCogY29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVh
ZF9jaGVja2VyXyk7CisgIFBFUkZFVFRPX0RMT0coIkNvbnN1bWVyICVwIGRldGFjaGVkIiwgcmVp
bnRlcnByZXRfY2FzdDx2b2lkKj4oY29uc3VtZXIpKTsKKyAgUEVSRkVUVE9fRENIRUNLKGNvbnN1
bWVyc18uY291bnQoY29uc3VtZXIpKTsKKworICBUcmFjaW5nU2Vzc2lvbklEIHRzaWQgPSBjb25z
dW1lci0+dHJhY2luZ19zZXNzaW9uX2lkXzsKKyAgVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vz
c2lvbjsKKyAgaWYgKCF0c2lkIHx8ICEodHJhY2luZ19zZXNzaW9uID0gR2V0VHJhY2luZ1Nlc3Np
b24odHNpZCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoR2V0RGV0YWNoZWRTZXNzaW9u
KGNvbnN1bWVyLT51aWRfLCBrZXkpKSB7CisgICAgUEVSRkVUVE9fRUxPRygiQW5vdGhlciBzZXNz
aW9uIGhhcyBiZWVuIGRldGFjaGVkIHdpdGggdGhlIHNhbWUga2V5IFwiJXNcIiIsCisgICAgICAg
ICAgICAgICAgICBrZXkuY19zdHIoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgUEVS
RkVUVE9fRENIRUNLKHRyYWNpbmdfc2Vzc2lvbi0+Y29uc3VtZXJfbWF5YmVfbnVsbCA9PSBjb25z
dW1lcik7CisgIHRyYWNpbmdfc2Vzc2lvbi0+Y29uc3VtZXJfbWF5YmVfbnVsbCA9IG51bGxwdHI7
CisgIHRyYWNpbmdfc2Vzc2lvbi0+ZGV0YWNoX2tleSA9IGtleTsKKyAgY29uc3VtZXItPnRyYWNp
bmdfc2Vzc2lvbl9pZF8gPSAwOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUcmFjaW5nU2Vy
dmljZUltcGw6OkF0dGFjaENvbnN1bWVyKENvbnN1bWVyRW5kcG9pbnRJbXBsKiBjb25zdW1lciwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmlu
ZyYga2V5KSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAg
UEVSRkVUVE9fRExPRygiQ29uc3VtZXIgJXAgYXR0YWNoaW5nIHRvIHNlc3Npb24gJXMiLAorICAg
ICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGNvbnN1bWVyKSwga2V5LmNfc3Ry
KCkpOworICBQRVJGRVRUT19EQ0hFQ0soY29uc3VtZXJzXy5jb3VudChjb25zdW1lcikpOworCisg
IGlmIChjb25zdW1lci0+dHJhY2luZ19zZXNzaW9uX2lkXykgeworICAgIFBFUkZFVFRPX0VMT0co
CisgICAgICAgICJDYW5ub3QgcmVhdHRhY2ggY29uc3VtZXIgdG8gc2Vzc2lvbiAlcyIKKyAgICAg
ICAgIiB3aGlsZSBpdCBhbHJlYWR5IGF0dGFjaGVkIHRyYWNpbmcgc2Vzc2lvbiBJRCAlIiBQUkl1
NjQsCisgICAgICAgIGtleS5jX3N0cigpLCBjb25zdW1lci0+dHJhY2luZ19zZXNzaW9uX2lkXyk7
CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYXV0byogdHJhY2luZ19zZXNzaW9uID0gR2V0
RGV0YWNoZWRTZXNzaW9uKGNvbnN1bWVyLT51aWRfLCBrZXkpOworICBpZiAoIXRyYWNpbmdfc2Vz
c2lvbikgeworICAgIFBFUkZFVFRPX0VMT0coCisgICAgICAgICJGYWlsZWQgdG8gYXR0YWNoIGNv
bnN1bWVyLCBzZXNzaW9uICclcycgbm90IGZvdW5kIGZvciB1aWQgJWQiLAorICAgICAgICBrZXku
Y19zdHIoKSwgc3RhdGljX2Nhc3Q8aW50Pihjb25zdW1lci0+dWlkXykpOworICAgIHJldHVybiBm
YWxzZTsKKyAgfQorCisgIGNvbnN1bWVyLT50cmFjaW5nX3Nlc3Npb25faWRfID0gdHJhY2luZ19z
ZXNzaW9uLT5pZDsKKyAgdHJhY2luZ19zZXNzaW9uLT5jb25zdW1lcl9tYXliZV9udWxsID0gY29u
c3VtZXI7CisgIHRyYWNpbmdfc2Vzc2lvbi0+ZGV0YWNoX2tleS5jbGVhcigpOworICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBUcmFjaW5nU2VydmljZUltcGw6OkVuYWJsZVRyYWNpbmcoQ29uc3Vt
ZXJFbmRwb2ludEltcGwqIGNvbnN1bWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgVHJhY2VDb25maWcmIGNmZywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJhc2U6OlNjb3BlZEZpbGUgZmQpIHsKKyAgUEVSRkVUVE9fRENIRUNL
X1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBQRVJGRVRUT19ETE9HKCJFbmFibGluZyB0cmFj
aW5nIGZvciBjb25zdW1lciAlcCIsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2
b2lkKj4oY29uc3VtZXIpKTsKKyAgaWYgKGNmZy5sb2NrZG93bl9tb2RlKCkgPT0gVHJhY2VDb25m
aWc6OkxPQ0tET1dOX1NFVCkKKyAgICBsb2NrZG93bl9tb2RlXyA9IHRydWU7CisgIGlmIChjZmcu
bG9ja2Rvd25fbW9kZSgpID09IFRyYWNlQ29uZmlnOjpMT0NLRE9XTl9DTEVBUikKKyAgICBsb2Nr
ZG93bl9tb2RlXyA9IGZhbHNlOworICBUcmFjaW5nU2Vzc2lvbiogdHJhY2luZ19zZXNzaW9uID0K
KyAgICAgIEdldFRyYWNpbmdTZXNzaW9uKGNvbnN1bWVyLT50cmFjaW5nX3Nlc3Npb25faWRfKTsK
KyAgaWYgKHRyYWNpbmdfc2Vzc2lvbikgeworICAgIFBFUkZFVFRPX0RMT0coCisgICAgICAgICJB
IENvbnN1bWVyIGlzIHRyeWluZyB0byBFbmFibGVUcmFjaW5nKCkgYnV0IGFub3RoZXIgdHJhY2lu
ZyBzZXNzaW9uICIKKyAgICAgICAgImlzIGFscmVhZHkgYWN0aXZlIChmb3Jnb3QgYSBjYWxsIHRv
IEZyZWVCdWZmZXJzKCkgPykiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCB1
aW50MzJfdCBtYXhfZHVyYXRpb25fbXMgPSBjZmcuZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBrR3VhcmRyYWlsc01heFRy
YWNpbmdEdXJhdGlvbk1pbGxpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgOiBrTWF4VHJhY2luZ0R1cmF0aW9uTWlsbGlzOworICBpZiAoY2ZnLmR1cmF0aW9uX21zKCkg
PiBtYXhfZHVyYXRpb25fbXMpIHsKKyAgICBQRVJGRVRUT19FTE9HKCJSZXF1ZXN0ZWQgdG9vIGxv
bmcgdHJhY2UgKCUiIFBSSXUzMiAibXMgID4gJSIgUFJJdTMyICIgbXMpIiwKKyAgICAgICAgICAg
ICAgICAgIGNmZy5kdXJhdGlvbl9tcygpLCBtYXhfZHVyYXRpb25fbXMpOworICAgIHJldHVybiBm
YWxzZTsKKyAgfQorCisgIGNvbnN0IGJvb2wgaGFzX3RyaWdnZXJfY29uZmlnID0gY2ZnLnRyaWdn
ZXJfY29uZmlnKCkudHJpZ2dlcl9tb2RlKCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBUcmFjZUNvbmZpZzo6VHJpZ2dlckNvbmZpZzo6VU5TUEVDSUZJRUQ7CisgIGlmICho
YXNfdHJpZ2dlcl9jb25maWcgJiYgKGNmZy50cmlnZ2VyX2NvbmZpZygpLnRyaWdnZXJfdGltZW91
dF9tcygpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnRyaWdnZXJf
Y29uZmlnKCkudHJpZ2dlcl90aW1lb3V0X21zKCkgPgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAga0d1YXJkcmFpbHNNYXhUcmFjaW5nRHVyYXRpb25NaWxsaXMpKSB7CisgICAgUEVS
RkVUVE9fRUxPRygKKyAgICAgICAgIlRyYWNlcyB3aXRoIFNUQVJUX1RSQUNJTkcgdHJpZ2dlcnMg
bXVzdCBwcm92aWRlIGEgcG9zaXRpdmUgIgorICAgICAgICAidHJpZ2dlcl90aW1lb3V0X21zIDwg
NyBkYXlzIChyZWNlaXZlZCAlIiBQUkl1MzIgIm1zKSIsCisgICAgICAgIGNmZy50cmlnZ2VyX2Nv
bmZpZygpLnRyaWdnZXJfdGltZW91dF9tcygpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwor
ICBpZiAoaGFzX3RyaWdnZXJfY29uZmlnICYmIGNmZy5kdXJhdGlvbl9tcygpICE9IDApIHsKKyAg
ICBQRVJGRVRUT19FTE9HKAorICAgICAgICAiZHVyYXRpb25fbXMgd2FzIHNldCwgdGhpcyBtdXN0
IG5vdCBiZSBzZXQgZm9yIHRyYWNlcyB3aXRoIHRyaWdnZXJzLiIpOworICAgIHJldHVybiBmYWxz
ZTsKKyAgfQorCisgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gdHJpZ2dlcnM7Cisg
IGZvciAoY29uc3QgYXV0byYgdHJpZ2dlciA6IGNmZy50cmlnZ2VyX2NvbmZpZygpLnRyaWdnZXJz
KCkpIHsKKyAgICBpZiAoIXRyaWdnZXJzLmluc2VydCh0cmlnZ2VyLm5hbWUoKSkuc2Vjb25kKSB7
CisgICAgICBQRVJGRVRUT19FTE9HKCJEdXBsaWNhdGUgdHJpZ2dlciBuYW1lOiAlcyIsIHRyaWdn
ZXIubmFtZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisg
IGlmIChjZmcuZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKSkgeworICAgIGlmIChjZmcuZGVmZXJy
ZWRfc3RhcnQoKSkgeworICAgICAgUEVSRkVUVE9fRUxPRygKKyAgICAgICAgICAiZGVmZXJyZWRf
c3RhcnQ9dHJ1ZSBpcyBub3Qgc3VwcG9ydGVkIGluIHVuc3VwZXJ2aXNlZCB0cmFjZXMiKTsKKyAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDY0X3QgYnVmX3NpemVfc3VtID0gMDsK
KyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZiA6IGNmZy5idWZmZXJzKCkpCisgICAgICBidWZfc2l6
ZV9zdW0gKz0gYnVmLnNpemVfa2IoKTsKKyAgICBpZiAoYnVmX3NpemVfc3VtID4ga0d1YXJkcmFp
bHNNYXhUcmFjaW5nQnVmZmVyU2l6ZUtiKSB7CisgICAgICBQRVJGRVRUT19FTE9HKCJSZXF1ZXN0
ZWQgdG9vIGxhcmdlIHRyYWNlIGJ1ZmZlciAoJSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAg
ICJrQiAgPiAlIiBQUkl1MzIgIiBrQikiLAorICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZV9z
dW0sIGtHdWFyZHJhaWxzTWF4VHJhY2luZ0J1ZmZlclNpemVLYik7CisgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICB9CisKKyAgaWYgKGNmZy5idWZmZXJzX3NpemUoKSA+IGtNYXhCdWZmZXJz
UGVyQ29uc3VtZXIpIHsKKyAgICBQRVJGRVRUT19FTE9HKCJUb28gbWFueSBidWZmZXJzIGNvbmZp
Z3VyZWQgKCVkKSIsIGNmZy5idWZmZXJzX3NpemUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9
CisKKyAgaWYgKCFjZmcudW5pcXVlX3Nlc3Npb25fbmFtZSgpLmVtcHR5KCkpIHsKKyAgICBjb25z
dCBzdGQ6OnN0cmluZyYgbmFtZSA9IGNmZy51bmlxdWVfc2Vzc2lvbl9uYW1lKCk7CisgICAgZm9y
IChhdXRvJiBrdiA6IHRyYWNpbmdfc2Vzc2lvbnNfKSB7CisgICAgICBpZiAoa3Yuc2Vjb25kLmNv
bmZpZy51bmlxdWVfc2Vzc2lvbl9uYW1lKCkgPT0gbmFtZSkgeworICAgICAgICBQRVJGRVRUT19F
TE9HKAorICAgICAgICAgICAgIkEgdHJhY2Ugd2l0aCB0aGlzIHVuaXF1ZSBzZXNzaW9uIG5hbWUg
KCVzKSBhbHJlYWR5IGV4aXN0cyIsCisgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGNmZy5lbmFibGVf
ZXh0cmFfZ3VhcmRyYWlscygpKSB7CisgICAgLy8gdW5pcXVlX3Nlc3Npb25fbmFtZSBjYW4gYmUg
ZW1wdHkKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9IGNmZy51bmlxdWVfc2Vzc2lvbl9u
YW1lKCk7CisgICAgaW50NjRfdCBub3dfcyA9IGJhc2U6OkdldEJvb3RUaW1lUygpLmNvdW50KCk7
CisKKyAgICAvLyBSZW1vdmUgYW55IGVudHJpZXMgd2hlcmUgdGhlIHRpbWUgbGltaXQgaGFzIHBh
c3NlZCBzbyB0aGlzIG1hcCBkb2Vzbid0CisgICAgLy8gZ3JvdyBpbmRlZmluaXRlbHk6CisgICAg
c3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+JiBzZXNzaW9ucyA9IHNlc3Npb25fdG9fbGFz
dF90cmFjZV9zXzsKKyAgICBmb3IgKGF1dG8gaXQgPSBzZXNzaW9ucy5jYmVnaW4oKTsgaXQgIT0g
c2Vzc2lvbnMuY2VuZCgpOykgeworICAgICAgaWYgKG5vd19zIC0gaXQtPnNlY29uZCA+IGtNaW5T
ZWNvbmRzQmV0d2VlblRyYWNlc0d1YXJkcmFpbCkgeworICAgICAgICBpdCA9IHNlc3Npb25zLmVy
YXNlKGl0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsraXQ7CisgICAgICB9CisgICAgfQor
CisgICAgaW50NjRfdCYgcHJldmlvdXNfcyA9IHNlc3Npb25fdG9fbGFzdF90cmFjZV9zX1tuYW1l
XTsKKyAgICBpZiAocHJldmlvdXNfcyA9PSAwKSB7CisgICAgICBwcmV2aW91c19zID0gbm93X3M7
CisgICAgfSBlbHNlIHsKKyAgICAgIFBFUkZFVFRPX0VMT0coCisgICAgICAgICAgIkEgdHJhY2Ug
d2l0aCB1bmlxdWUgc2Vzc2lvbiBuYW1lIFwiJXNcIiBiZWdhbiBsZXNzIHRoYW4gJSIgUFJJZDY0
CisgICAgICAgICAgInMgYWdvICglIiBQUklkNjQgInMpIiwKKyAgICAgICAgICBuYW1lLmNfc3Ry
KCksIGtNaW5TZWNvbmRzQmV0d2VlblRyYWNlc0d1YXJkcmFpbCwgbm93X3MgLSBwcmV2aW91c19z
KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBjb25zdCBsb25nIHNlc3Np
b25zX2Zvcl91aWQgPSBzdGQ6OmNvdW50X2lmKAorICAgICAgdHJhY2luZ19zZXNzaW9uc18uYmVn
aW4oKSwgdHJhY2luZ19zZXNzaW9uc18uZW5kKCksCisgICAgICBbY29uc3VtZXJdKGNvbnN0IGRl
Y2x0eXBlKHRyYWNpbmdfc2Vzc2lvbnNfKTo6dmFsdWVfdHlwZSYgcykgeworICAgICAgICByZXR1
cm4gcy5zZWNvbmQuY29uc3VtZXJfdWlkID09IGNvbnN1bWVyLT51aWRfOworICAgICAgfSk7CisK
KyAgaW50IHBlcl91aWRfbGltaXQgPSBrTWF4Q29uY3VycmVudFRyYWNpbmdTZXNzaW9uc1BlclVp
ZDsKKyAgaWYgKGNvbnN1bWVyLT51aWRfID09IDEwNjYgLyogQUlEX1NUQVRTRCovKSB7CisgICAg
cGVyX3VpZF9saW1pdCA9IGtNYXhDb25jdXJyZW50VHJhY2luZ1Nlc3Npb25zRm9yU3RhdHNkVWlk
OworICB9CisgIGlmIChzZXNzaW9uc19mb3JfdWlkID49IHBlcl91aWRfbGltaXQpIHsKKyAgICBQ
RVJGRVRUT19FTE9HKAorICAgICAgICAiVG9vIG1hbnkgY29uY3VycmVudCB0cmFjaW5nIHNlc2lv
bnMgKCVsZCkgZm9yIHVpZCAlZCBsaW1pdCBpcyAlZCIsCisgICAgICAgIHNlc3Npb25zX2Zvcl91
aWQsIHN0YXRpY19jYXN0PGludD4oY29uc3VtZXItPnVpZF8pLCBwZXJfdWlkX2xpbWl0KTsKKyAg
ICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBUT0RPKHByaW1pYW5vKTogVGhpcyBpcyBhIHdv
cmthcm91bmQgdG8gcHJldmVudCB0aGF0IGEgcHJvZHVjZXIgZ2V0cyBzdHVjaworICAvLyBpbiBh
IHN0YXRlIHdoZXJlIGl0IHN0YWxscyBieSBkZXNpZ24gYnkgaGF2aW5nIG1vcmUgVHJhY2VXcml0
ZXJJbXBsCisgIC8vIGluc3RhbmNlcyB0aGFuIGZyZWUgcGFnZXMgaW4gdGhlIGJ1ZmZlci4gVGhp
cyBpcyByZWFsbHkgYSBidWcgaW4KKyAgLy8gdHJhY2VfcHJvYmVzIGFuZCB0aGUgd2F5IGl0IGhh
bmRsZXMgc3RhbGxzIGluIHRoZSBzaG1lbSBidWZmZXIuCisgIGlmICh0cmFjaW5nX3Nlc3Npb25z
Xy5zaXplKCkgPj0ga01heENvbmN1cnJlbnRUcmFjaW5nU2Vzc2lvbnMpIHsKKyAgICBQRVJGRVRU
T19FTE9HKCJUb28gbWFueSBjb25jdXJyZW50IHRyYWNpbmcgc2VzaW9ucyAoJXp1KSIsCisgICAg
ICAgICAgICAgICAgICB0cmFjaW5nX3Nlc3Npb25zXy5zaXplKCkpOworICAgIHJldHVybiBmYWxz
ZTsKKyAgfQorCisgIGNvbnN0IFRyYWNpbmdTZXNzaW9uSUQgdHNpZCA9ICsrbGFzdF90cmFjaW5n
X3Nlc3Npb25faWRfOworICB0cmFjaW5nX3Nlc3Npb24gPQorICAgICAgJnRyYWNpbmdfc2Vzc2lv
bnNfLmVtcGxhY2UodHNpZCwgVHJhY2luZ1Nlc3Npb24odHNpZCwgY29uc3VtZXIsIGNmZykpCisg
ICAgICAgICAgIC5maXJzdC0+c2Vjb25kOworCisgIGlmIChjZmcud3JpdGVfaW50b19maWxlKCkp
IHsKKyAgICBpZiAoIWZkIF4gIWNmZy5vdXRwdXRfcGF0aCgpLmVtcHR5KCkpIHsKKyAgICAgIFBF
UkZFVFRPX0VMT0coCisgICAgICAgICAgIldoZW4gd3JpdGVfaW50b19maWxlPT10cnVlIGVpdGhl
ciBhIEZEIG5lZWRzIHRvIGJlIHBhc3NlZCBvciAiCisgICAgICAgICAgIm91dHB1dF9wYXRoIG11
c3QgYmUgcG9wdWxhdGVkIChidXQgbm90IGJvdGgpIik7CisgICAgICB0cmFjaW5nX3Nlc3Npb25z
Xy5lcmFzZSh0c2lkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFjZmcu
b3V0cHV0X3BhdGgoKS5lbXB0eSgpKSB7CisgICAgICBmZCA9IENyZWF0ZVRyYWNlRmlsZShjZmcu
b3V0cHV0X3BhdGgoKSk7CisgICAgICBpZiAoIWZkKSB7CisgICAgICAgIHRyYWNpbmdfc2Vzc2lv
bnNfLmVyYXNlKHRzaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQor
ICAgIHRyYWNpbmdfc2Vzc2lvbi0+d3JpdGVfaW50b19maWxlID0gc3RkOjptb3ZlKGZkKTsKKyAg
ICB1aW50MzJfdCB3cml0ZV9wZXJpb2RfbXMgPSBjZmcuZmlsZV93cml0ZV9wZXJpb2RfbXMoKTsK
KyAgICBpZiAod3JpdGVfcGVyaW9kX21zID09IDApCisgICAgICB3cml0ZV9wZXJpb2RfbXMgPSBr
RGVmYXVsdFdyaXRlSW50b0ZpbGVQZXJpb2RNczsKKyAgICBpZiAod3JpdGVfcGVyaW9kX21zIDwg
bWluX3dyaXRlX3BlcmlvZF9tc18pCisgICAgICB3cml0ZV9wZXJpb2RfbXMgPSBtaW5fd3JpdGVf
cGVyaW9kX21zXzsKKyAgICB0cmFjaW5nX3Nlc3Npb24tPndyaXRlX3BlcmlvZF9tcyA9IHdyaXRl
X3BlcmlvZF9tczsKKyAgICB0cmFjaW5nX3Nlc3Npb24tPm1heF9maWxlX3NpemVfYnl0ZXMgPSBj
ZmcubWF4X2ZpbGVfc2l6ZV9ieXRlcygpOworICAgIHRyYWNpbmdfc2Vzc2lvbi0+Ynl0ZXNfd3Jp
dHRlbl9pbnRvX2ZpbGUgPSAwOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgbG9nIGJ1ZmZl
cnMuCisgIGJvb2wgZGlkX2FsbG9jYXRlX2FsbF9idWZmZXJzID0gdHJ1ZTsKKworICAvLyBBbGxv
Y2F0ZSB0aGUgdHJhY2UgYnVmZmVycy4gQWxzbyBjcmVhdGUgYSBtYXAgdG8gdHJhbnNsYXRlIGEg
Y29uc3VtZXIKKyAgLy8gcmVsYXRpdmUgaW5kZXggKFRyYWNlQ29uZmlnLkRhdGFTb3VyY2VDb25m
aWcudGFyZ2V0X2J1ZmZlcikgaW50byB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBCdWZmZXJJRCwg
d2hpY2ggaXMgYSBnbG9iYWwgSUQgbmFtZXNwYWNlIGZvciB0aGUgc2VydmljZSBhbmQKKyAgLy8g
YWxsIHByb2R1Y2Vycy4KKyAgc2l6ZV90IHRvdGFsX2J1Zl9zaXplX2tiID0gMDsKKyAgY29uc3Qg
c2l6ZV90IG51bV9idWZmZXJzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihjZmcuYnVmZmVyc19zaXpl
KCkpOworICB0cmFjaW5nX3Nlc3Npb24tPmJ1ZmZlcnNfaW5kZXgucmVzZXJ2ZShudW1fYnVmZmVy
cyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7IGkrKykgeworICAgIGNv
bnN0IFRyYWNlQ29uZmlnOjpCdWZmZXJDb25maWcmIGJ1ZmZlcl9jZmcgPSBjZmcuYnVmZmVycygp
W2ldOworICAgIEJ1ZmZlcklEIGdsb2JhbF9pZCA9IGJ1ZmZlcl9pZHNfLkFsbG9jYXRlKCk7Cisg
ICAgaWYgKCFnbG9iYWxfaWQpIHsKKyAgICAgIGRpZF9hbGxvY2F0ZV9hbGxfYnVmZmVycyA9IGZh
bHNlOyAgLy8gV2UgcmFuIG91dCBvZiBJRHMuCisgICAgICBicmVhazsKKyAgICB9CisgICAgdHJh
Y2luZ19zZXNzaW9uLT5idWZmZXJzX2luZGV4LnB1c2hfYmFjayhnbG9iYWxfaWQpOworICAgIGNv
bnN0IHNpemVfdCBidWZfc2l6ZV9ieXRlcyA9IGJ1ZmZlcl9jZmcuc2l6ZV9rYigpICogMTAyNHU7
CisgICAgdG90YWxfYnVmX3NpemVfa2IgKz0gYnVmZmVyX2NmZy5zaXplX2tiKCk7CisgICAgVHJh
Y2VCdWZmZXI6Ok92ZXJ3cml0ZVBvbGljeSBwb2xpY3kgPQorICAgICAgICBidWZmZXJfY2ZnLmZp
bGxfcG9saWN5KCkgPT0gVHJhY2VDb25maWc6OkJ1ZmZlckNvbmZpZzo6RElTQ0FSRAorICAgICAg
ICAgICAgPyBUcmFjZUJ1ZmZlcjo6a0Rpc2NhcmQKKyAgICAgICAgICAgIDogVHJhY2VCdWZmZXI6
OmtPdmVyd3JpdGU7CisgICAgYXV0byBpdF9hbmRfaW5zZXJ0ZWQgPSBidWZmZXJzXy5lbXBsYWNl
KAorICAgICAgICBnbG9iYWxfaWQsIFRyYWNlQnVmZmVyOjpDcmVhdGUoYnVmX3NpemVfYnl0ZXMs
IHBvbGljeSkpOworICAgIFBFUkZFVFRPX0RDSEVDSyhpdF9hbmRfaW5zZXJ0ZWQuc2Vjb25kKTsg
IC8vIGJ1ZmZlcnNfLmNvdW50KGdsb2JhbF9pZCkgPT0gMC4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8
VHJhY2VCdWZmZXI+JiB0cmFjZV9idWZmZXIgPSBpdF9hbmRfaW5zZXJ0ZWQuZmlyc3QtPnNlY29u
ZDsKKyAgICBpZiAoIXRyYWNlX2J1ZmZlcikgeworICAgICAgZGlkX2FsbG9jYXRlX2FsbF9idWZm
ZXJzID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBVcGRhdGVNZW1vcnlH
dWFyZHJhaWwoKTsKKworICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgZWl0aGVyOgorICAvLyAtIEFs
bCB0aGUga01heFRyYWNlQnVmZmVySUQgc2xvdHMgYXJlIHRha2VuLgorICAvLyAtIE9PTSwgb3Is
IG1vcmUgcmVsaXN0aWNhbGx5LCB3ZSBleGhhdXN0ZWQgdmlydHVhbCBtZW1vcnkuCisgIC8vIElu
IGFueSBjYXNlLCBmcmVlIGFsbCB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVycyBhbmQg
YWJvcnQuCisgIC8vIFRPRE8oZm1heWVyKTogYWRkIGEgdGVzdCB0byBjb3ZlciB0aGlzIGNhc2Us
IHRoaXMgaXMgcXVpdGUgc3VidGxlLgorICBpZiAoIWRpZF9hbGxvY2F0ZV9hbGxfYnVmZmVycykg
eworICAgIGZvciAoQnVmZmVySUQgZ2xvYmFsX2lkIDogdHJhY2luZ19zZXNzaW9uLT5idWZmZXJz
X2luZGV4KSB7CisgICAgICBidWZmZXJfaWRzXy5GcmVlKGdsb2JhbF9pZCk7CisgICAgICBidWZm
ZXJzXy5lcmFzZShnbG9iYWxfaWQpOworICAgIH0KKyAgICB0cmFjaW5nX3Nlc3Npb25zXy5lcmFz
ZSh0c2lkKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdW1lci0+dHJhY2luZ19z
ZXNzaW9uX2lkXyA9IHRzaWQ7CisKKyAgLy8gU2V0dXAgdGhlIGRhdGEgc291cmNlcyBvbiB0aGUg
cHJvZHVjZXJzIHdpdGhvdXQgc3RhcnRpbmcgdGhlbS4KKyAgZm9yIChjb25zdCBUcmFjZUNvbmZp
Zzo6RGF0YVNvdXJjZSYgY2ZnX2RhdGFfc291cmNlIDogY2ZnLmRhdGFfc291cmNlcygpKSB7Cisg
ICAgLy8gU2NhbiBhbGwgdGhlIHJlZ2lzdGVyZWQgZGF0YSBzb3VyY2VzIHdpdGggYSBtYXRjaGlu
ZyBuYW1lLgorICAgIGF1dG8gcmFuZ2UgPSBkYXRhX3NvdXJjZXNfLmVxdWFsX3JhbmdlKGNmZ19k
YXRhX3NvdXJjZS5jb25maWcoKS5uYW1lKCkpOworICAgIGZvciAoYXV0byBpdCA9IHJhbmdlLmZp
cnN0OyBpdCAhPSByYW5nZS5zZWNvbmQ7IGl0KyspIHsKKyAgICAgIFRyYWNlQ29uZmlnOjpQcm9k
dWNlckNvbmZpZyBwcm9kdWNlcl9jb25maWc7CisgICAgICBmb3IgKGF1dG8mIGNvbmZpZyA6IGNm
Zy5wcm9kdWNlcnMoKSkgeworICAgICAgICBpZiAoR2V0UHJvZHVjZXIoaXQtPnNlY29uZC5wcm9k
dWNlcl9pZCktPm5hbWVfID09CisgICAgICAgICAgICBjb25maWcucHJvZHVjZXJfbmFtZSgpKSB7
CisgICAgICAgICAgcHJvZHVjZXJfY29uZmlnID0gY29uZmlnOworICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICB9CisgICAgICBTZXR1cERhdGFTb3VyY2UoY2ZnX2RhdGFfc291cmNl
LCBwcm9kdWNlcl9jb25maWcsIGl0LT5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgdHJh
Y2luZ19zZXNzaW9uKTsKKyAgICB9CisgIH0KKworICBib29sIGhhc19zdGFydF90cmlnZ2VyID0g
ZmFsc2U7CisgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigp
OworICBzd2l0Y2ggKGNmZy50cmlnZ2VyX2NvbmZpZygpLnRyaWdnZXJfbW9kZSgpKSB7CisgICAg
Y2FzZSBUcmFjZUNvbmZpZzo6VHJpZ2dlckNvbmZpZzo6VU5TUEVDSUZJRUQ6CisgICAgICAvLyBu
byB0cmlnZ2VycyBhcmUgc3BlY2lmaWVkIHNvIHRoaXMgaXNuJ3QgYSB0cmFjZSB0aGF0IGlzIHVz
aW5nIHRyaWdnZXJzLgorICAgICAgUEVSRkVUVE9fRENIRUNLKCFoYXNfdHJpZ2dlcl9jb25maWcp
OworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmFjZUNvbmZpZzo6VHJpZ2dlckNvbmZpZzo6U1RB
UlRfVFJBQ0lORzoKKyAgICAgIC8vIEZvciB0cmFjZXMgd2hpY2ggdXNlIFNUQVJUX1RSQUNFIHRy
aWdnZXJzIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisgICAgICAvLyB0cmFjaW5nIHNlc3Np
b24gd2lsbCBiZSBjbGVhbmVkIHVwIHdoZW4gaXQgdGltZXMgb3V0LgorICAgICAgaGFzX3N0YXJ0
X3RyaWdnZXIgPSB0cnVlOworICAgICAgdGFza19ydW5uZXJfLT5Qb3N0RGVsYXllZFRhc2soCisg
ICAgICAgICAgW3dlYWtfdGhpcywgdHNpZF0oKSB7CisgICAgICAgICAgICBpZiAod2Vha190aGlz
KQorICAgICAgICAgICAgICB3ZWFrX3RoaXMtPk9uU3RhcnRUcmlnZ2Vyc1RpbWVvdXQodHNpZCk7
CisgICAgICAgICAgfSwKKyAgICAgICAgICBjZmcudHJpZ2dlcl9jb25maWcoKS50cmlnZ2VyX3Rp
bWVvdXRfbXMoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyYWNlQ29uZmlnOjpUcmlnZ2Vy
Q29uZmlnOjpTVE9QX1RSQUNJTkc6CisgICAgICAvLyBVcGRhdGUgdGhlIHRyYWNpbmdfc2Vzc2lv
bidzIGR1cmF0aW9uX21zIHRvIGVuc3VyZSB0aGF0IGlmIG5vIHRyaWdnZXIKKyAgICAgIC8vIGlz
IHJlY2VpdmVkIHRoZSBzZXNzaW9uIHdpbGwgZW5kIGFuZCBiZSBjbGVhbmVkIHVwIGVxdWFsIHRv
IHRoZQorICAgICAgLy8gdGltZW91dC4KKyAgICAgIC8vCisgICAgICAvLyBUT0RPKG51c2tvcyk6
IFJlZmFjdG9yIHRoaXMgc28gdGhhdCByYXRoZXIgdGhlbiBtb2RpZnlpbmcgdGhlIGNvbmZpZyB3
ZQorICAgICAgLy8gaGF2ZSBhIGZpZWxkIHdlIGxvb2sgYXQgb24gdGhlIHRyYWNpbmdfc2Vzc2lv
bi4KKyAgICAgIHRyYWNpbmdfc2Vzc2lvbi0+Y29uZmlnLnNldF9kdXJhdGlvbl9tcygKKyAgICAg
ICAgICBjZmcudHJpZ2dlcl9jb25maWcoKS50cmlnZ2VyX3RpbWVvdXRfbXMoKSk7CisgICAgICBi
cmVhazsKKyAgfQorCisgIHRyYWNpbmdfc2Vzc2lvbi0+c3RhdGUgPSBUcmFjaW5nU2Vzc2lvbjo6
Q09ORklHVVJFRDsKKyAgUEVSRkVUVE9fTE9HKAorICAgICAgIkNvbmZpZ3VyZWQgdHJhY2luZyBz
ZXNzaW9uICUiIFBSSXU2NAorICAgICAgIiwgI3NvdXJjZXM6JXp1LCBkdXJhdGlvbjolZCBtcywg
I2J1ZmZlcnM6JWQsIHRvdGFsICIKKyAgICAgICJidWZmZXIgc2l6ZTolenUgS0IsIHRvdGFsIHNl
c3Npb25zOiV6dSwgdWlkOiVkIHNlc3Npb24gbmFtZTogXCIlc1wiIiwKKyAgICAgIHRzaWQsIGNm
Zy5kYXRhX3NvdXJjZXMoKS5zaXplKCksIHRyYWNpbmdfc2Vzc2lvbi0+Y29uZmlnLmR1cmF0aW9u
X21zKCksCisgICAgICBjZmcuYnVmZmVyc19zaXplKCksIHRvdGFsX2J1Zl9zaXplX2tiLCB0cmFj
aW5nX3Nlc3Npb25zXy5zaXplKCksCisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGNv
bnN1bWVyLT51aWRfKSwKKyAgICAgIGNmZy51bmlxdWVfc2Vzc2lvbl9uYW1lKCkuY19zdHIoKSk7
CisKKyAgLy8gU3RhcnQgdGhlIGRhdGEgc291cmNlcywgdW5sZXNzIHRoaXMgaXMgYSBjYXNlIG9m
IGVhcmx5IHNldHVwICsgZmFzdAorICAvLyB0cmlnZ2VyaW5nLCBlaXRoZXIgdGhyb3VnaCBUcmFj
ZUNvbmZpZy5kZWZlcnJlZF9zdGFydCBvcgorICAvLyBUcmFjZUNvbmZpZy50cmlnZ2VyX2NvbmZp
ZygpLiBJZiBib3RoIGFyZSBzcGVjaWZpZWQgd2hpY2ggZXZlciBvbmUgb2NjdXJzCisgIC8vIGZp
cnN0IHdpbGwgaW5pdGlhdGUgdGhlIHRyYWNlLgorICBpZiAoIWNmZy5kZWZlcnJlZF9zdGFydCgp
ICYmICFoYXNfc3RhcnRfdHJpZ2dlcikKKyAgICByZXR1cm4gU3RhcnRUcmFjaW5nKHRzaWQpOwor
CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6Q2hhbmdlVHJh
Y2VDb25maWcoQ29uc3VtZXJFbmRwb2ludEltcGwqIGNvbnN1bWVyLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNlQ29uZmlnJiB1cGRhdGVkX2Nm
ZykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFRyYWNp
bmdTZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24gPQorICAgICAgR2V0VHJhY2luZ1Nlc3Npb24oY29u
c3VtZXItPnRyYWNpbmdfc2Vzc2lvbl9pZF8pOworICBQRVJGRVRUT19EQ0hFQ0sodHJhY2luZ19z
ZXNzaW9uKTsKKworICBpZiAoKHRyYWNpbmdfc2Vzc2lvbi0+c3RhdGUgIT0gVHJhY2luZ1Nlc3Np
b246OlNUQVJURUQpICYmCisgICAgICAodHJhY2luZ19zZXNzaW9uLT5zdGF0ZSAhPSBUcmFjaW5n
U2Vzc2lvbjo6Q09ORklHVVJFRCkpIHsKKyAgICBQRVJGRVRUT19FTE9HKAorICAgICAgICAiQ2hh
bmdlVHJhY2VDb25maWcoKSB3YXMgY2FsbGVkIGZvciBhIHRyYWNpbmcgc2Vzc2lvbiB3aGljaCBp
c24ndCAiCisgICAgICAgICJydW5uaW5nLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFdl
IG9ubHkgc3VwcG9ydCB1cGRhdGluZyBwcm9kdWNlcl9uYW1lX3sscmVnZXh9X2ZpbHRlciAoYW5k
IHBhc3MtdGhyb3VnaAorICAvLyBjb25maWdzKSBmb3Igbm93OyBudWxsIG91dCBhbnkgY2hhbmdl
YWJsZSBmaWVsZHMgYW5kIG1ha2Ugc3VyZSB0aGUgcmVzdCBhcmUKKyAgLy8gaWRlbnRpY2FsLgor
ICBUcmFjZUNvbmZpZyBuZXdfY29uZmlnX2NvcHkodXBkYXRlZF9jZmcpOworICBmb3IgKGF1dG8m
IGRzX2NmZyA6ICpuZXdfY29uZmlnX2NvcHkubXV0YWJsZV9kYXRhX3NvdXJjZXMoKSkgeworICAg
IGRzX2NmZy5jbGVhcl9wcm9kdWNlcl9uYW1lX2ZpbHRlcigpOworICAgIGRzX2NmZy5jbGVhcl9w
cm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcigpOworICB9CisKKyAgVHJhY2VDb25maWcgY3VycmVu
dF9jb25maWdfY29weSh0cmFjaW5nX3Nlc3Npb24tPmNvbmZpZyk7CisgIGZvciAoYXV0byYgZHNf
Y2ZnIDogKmN1cnJlbnRfY29uZmlnX2NvcHkubXV0YWJsZV9kYXRhX3NvdXJjZXMoKSkgeworICAg
IGRzX2NmZy5jbGVhcl9wcm9kdWNlcl9uYW1lX2ZpbHRlcigpOworICAgIGRzX2NmZy5jbGVhcl9w
cm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcigpOworICB9CisKKyAgaWYgKG5ld19jb25maWdfY29w
eSAhPSBjdXJyZW50X2NvbmZpZ19jb3B5KSB7CisgICAgUEVSRkVUVE9fTE9HKAorICAgICAgICAi
Q2hhbmdlVHJhY2VDb25maWcoKSB3YXMgY2FsbGVkIHdpdGggYSBjb25maWcgY29udGFpbmluZyB1
bnN1cHBvcnRlZCAiCisgICAgICAgICJjaGFuZ2VzOyBvbmx5IGFkZGluZyB0byB0aGUgcHJvZHVj
ZXJfbmFtZV97LHJlZ2V4fV9maWx0ZXIgaXMgIgorICAgICAgICAiY3VycmVudGx5IHN1cHBvcnRl
ZCBhbmQgd2lsbCBoYXZlIGFuIGVmZmVjdC4iKTsKKyAgfQorCisgIGZvciAoVHJhY2VDb25maWc6
OkRhdGFTb3VyY2UmIGNmZ19kYXRhX3NvdXJjZSA6CisgICAgICAgKnRyYWNpbmdfc2Vzc2lvbi0+
Y29uZmlnLm11dGFibGVfZGF0YV9zb3VyY2VzKCkpIHsKKyAgICAvLyBGaW5kIHRoZSB1cGRhdGVk
IHByb2R1Y2VyX2ZpbHRlciBpbiB0aGUgbmV3IGNvbmZpZy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6
OnN0cmluZz4gbmV3X3Byb2R1Y2VyX25hbWVfZmlsdGVyOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6
c3RyaW5nPiBuZXdfcHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXI7CisgICAgYm9vbCBmb3VuZF9k
YXRhX3NvdXJjZSA9IGZhbHNlOworICAgIGZvciAoYXV0byBpdCA6IHVwZGF0ZWRfY2ZnLmRhdGFf
c291cmNlcygpKSB7CisgICAgICBpZiAoY2ZnX2RhdGFfc291cmNlLmNvbmZpZygpLm5hbWUoKSA9
PSBpdC5jb25maWcoKS5uYW1lKCkpIHsKKyAgICAgICAgbmV3X3Byb2R1Y2VyX25hbWVfZmlsdGVy
ID0gaXQucHJvZHVjZXJfbmFtZV9maWx0ZXIoKTsKKyAgICAgICAgbmV3X3Byb2R1Y2VyX25hbWVf
cmVnZXhfZmlsdGVyID0gaXQucHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXIoKTsKKyAgICAgICAg
Zm91bmRfZGF0YV9zb3VyY2UgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9
CisKKyAgICAvLyBCYWlsIG91dCBpZiBkYXRhIHNvdXJjZSBub3QgcHJlc2VudCBpbiB0aGUgbmV3
IGNvbmZpZy4KKyAgICBpZiAoIWZvdW5kX2RhdGFfc291cmNlKSB7CisgICAgICBQRVJGRVRUT19F
TE9HKAorICAgICAgICAgICJDaGFuZ2VUcmFjZUNvbmZpZygpIGNhbGxlZCB3aXRob3V0IGEgY3Vy
cmVudCBkYXRhIHNvdXJjZSBhbHNvICIKKyAgICAgICAgICAicHJlc2VudCBpbiB0aGUgbmV3IGNv
bmZpZzogJXMiLAorICAgICAgICAgIGNmZ19kYXRhX3NvdXJjZS5jb25maWcoKS5uYW1lKCkuY19z
dHIoKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBUT0RPKG95c3RlaW5lKTog
SnVzdCByZXBsYWNpbmcgdGhlIGZpbHRlciBtZWFucyB0aGF0IGlmCisgICAgLy8gdGhlcmUgYXJl
IGFueSBmaWx0ZXIgZW50cmllcyB3aGljaCB3ZXJlIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIGNv
bmZpZywKKyAgICAvLyBidXQgcmVtb3ZlZCBmcm9tIHRoZSBjb25maWcgcGFzc2VkIHRvIENoYW5n
ZVRyYWNlQ29uZmlnLCBhbnkgbWF0Y2hpbmcKKyAgICAvLyBwcm9kdWNlcnMgd2lsbCBrZWVwIHBy
b2R1Y2luZyBidXQgbmV3bHkgYWRkZWQgcHJvZHVjZXJzIGFmdGVyIHRoaXMKKyAgICAvLyBwb2lu
dCB3aWxsIG5ldmVyIHN0YXJ0LgorICAgICpjZmdfZGF0YV9zb3VyY2UubXV0YWJsZV9wcm9kdWNl
cl9uYW1lX2ZpbHRlcigpID0gbmV3X3Byb2R1Y2VyX25hbWVfZmlsdGVyOworICAgICpjZmdfZGF0
YV9zb3VyY2UubXV0YWJsZV9wcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcigpID0KKyAgICAgICAg
bmV3X3Byb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyOworCisgICAgLy8gU2NhbiBhbGwgdGhlIHJl
Z2lzdGVyZWQgZGF0YSBzb3VyY2VzIHdpdGggYSBtYXRjaGluZyBuYW1lLgorICAgIGF1dG8gcmFu
Z2UgPSBkYXRhX3NvdXJjZXNfLmVxdWFsX3JhbmdlKGNmZ19kYXRhX3NvdXJjZS5jb25maWcoKS5u
YW1lKCkpOworICAgIGZvciAoYXV0byBpdCA9IHJhbmdlLmZpcnN0OyBpdCAhPSByYW5nZS5zZWNv
bmQ7IGl0KyspIHsKKyAgICAgIFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBwcm9kdWNlciA9IEdldFBy
b2R1Y2VyKGl0LT5zZWNvbmQucHJvZHVjZXJfaWQpOworICAgICAgUEVSRkVUVE9fRENIRUNLKHBy
b2R1Y2VyKTsKKworICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb2R1Y2VyIG5hbWUgb2YgdGhpcyBk
YXRhIHNvdXJjZSBpcyBwcmVzZW50CisgICAgICAvLyBpbiB0aGUgbmFtZSBmaWx0ZXJzLiBXZSBj
dXJyZW50bHkgb25seSBzdXBwb3J0IG5ldyBmaWx0ZXJzLCBub3QKKyAgICAgIC8vIHJlbW92aW5n
IG9sZCBvbmVzLgorICAgICAgaWYgKCFOYW1lTWF0Y2hlc0ZpbHRlcihwcm9kdWNlci0+bmFtZV8s
IG5ld19wcm9kdWNlcl9uYW1lX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bmV3X3Byb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyKSkgeworICAgICAgICBjb250aW51ZTsKKyAg
ICAgIH0KKworICAgICAgYm9vbCBhbHJlYWR5X3NldHVwID0gZmFsc2U7CisgICAgICBhdXRvJiBk
c19pbnN0YW5jZXMgPSB0cmFjaW5nX3Nlc3Npb24tPmRhdGFfc291cmNlX2luc3RhbmNlczsKKyAg
ICAgIGZvciAoYXV0byBpbnN0YW5jZV9pdCA9IGRzX2luc3RhbmNlcy5iZWdpbigpOworICAgICAg
ICAgICBpbnN0YW5jZV9pdCAhPSBkc19pbnN0YW5jZXMuZW5kKCk7ICsraW5zdGFuY2VfaXQpIHsK
KyAgICAgICAgaWYgKGluc3RhbmNlX2l0LT5maXJzdCA9PSBpdC0+c2Vjb25kLnByb2R1Y2VyX2lk
ICYmCisgICAgICAgICAgICBpbnN0YW5jZV9pdC0+c2Vjb25kLmRhdGFfc291cmNlX25hbWUgPT0K
KyAgICAgICAgICAgICAgICBjZmdfZGF0YV9zb3VyY2UuY29uZmlnKCkubmFtZSgpKSB7CisgICAg
ICAgICAgYWxyZWFkeV9zZXR1cCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgIH0KKworICAgICAgaWYgKGFscmVhZHlfc2V0dXApCisgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAvLyBJZiBpdCB3YXNuJ3QgcHJldmlvdXNseSBzZXR1cCwgc2V0IGl0IHVwIG5vdy4K
KyAgICAgIC8vIChUaGUgcGVyLXByb2R1Y2VyIGNvbmZpZyBpcyBvcHRpb25hbCkuCisgICAgICBU
cmFjZUNvbmZpZzo6UHJvZHVjZXJDb25maWcgcHJvZHVjZXJfY29uZmlnOworICAgICAgZm9yIChh
dXRvJiBjb25maWcgOiB0cmFjaW5nX3Nlc3Npb24tPmNvbmZpZy5wcm9kdWNlcnMoKSkgeworICAg
ICAgICBpZiAocHJvZHVjZXItPm5hbWVfID09IGNvbmZpZy5wcm9kdWNlcl9uYW1lKCkpIHsKKyAg
ICAgICAgICBwcm9kdWNlcl9jb25maWcgPSBjb25maWc7CisgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgIH0KKworICAgICAgRGF0YVNvdXJjZUluc3RhbmNlKiBkc19pbnN0ID0gU2V0
dXBEYXRhU291cmNlKAorICAgICAgICAgIGNmZ19kYXRhX3NvdXJjZSwgcHJvZHVjZXJfY29uZmln
LCBpdC0+c2Vjb25kLCB0cmFjaW5nX3Nlc3Npb24pOworCisgICAgICBpZiAoZHNfaW5zdCAmJiB0
cmFjaW5nX3Nlc3Npb24tPnN0YXRlID09IFRyYWNpbmdTZXNzaW9uOjpTVEFSVEVEKQorICAgICAg
ICBTdGFydERhdGFTb3VyY2VJbnN0YW5jZShwcm9kdWNlciwgdHJhY2luZ19zZXNzaW9uLCBkc19p
bnN0KTsKKyAgICB9CisgIH0KK30KKworYm9vbCBUcmFjaW5nU2VydmljZUltcGw6OlN0YXJ0VHJh
Y2luZyhUcmFjaW5nU2Vzc2lvbklEIHRzaWQpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0
aHJlYWRfY2hlY2tlcl8pOworICBUcmFjaW5nU2Vzc2lvbiogdHJhY2luZ19zZXNzaW9uID0gR2V0
VHJhY2luZ1Nlc3Npb24odHNpZCk7CisgIGlmICghdHJhY2luZ19zZXNzaW9uKSB7CisgICAgUEVS
RkVUVE9fRExPRygiU3RhcnRUcmFjaW5nKCkgZmFpbGVkLCBpbnZhbGlkIHNlc3Npb24gSUQgJSIg
UFJJdTY0LCB0c2lkKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAodHJhY2luZ19z
ZXNzaW9uLT5zdGF0ZSAhPSBUcmFjaW5nU2Vzc2lvbjo6Q09ORklHVVJFRCkgeworICAgIFBFUkZF
VFRPX0RMT0coIlN0YXJ0VHJhY2luZygpIGZhaWxlZCwgaW52YWxpZCBzZXNzaW9uIHN0YXRlOiAl
ZCIsCisgICAgICAgICAgICAgICAgICB0cmFjaW5nX3Nlc3Npb24tPnN0YXRlKTsKKyAgICByZXR1
cm4gZmFsc2U7CisgIH0KKworICB0cmFjaW5nX3Nlc3Npb24tPnN0YXRlID0gVHJhY2luZ1Nlc3Np
b246OlNUQVJURUQ7CisKKyAgLy8gUGVyaW9kaWNhbGx5IHNuYXBzaG90IGNsb2Nrcywgc3RhdHMs
IHN5bmMgbWFya2VycyB3aGlsZSB0aGUgdHJhY2UgaXMKKyAgLy8gYWN0aXZlLiBUaGUgc25hcHNo
b3RzIGFyZSBlbWl0dGVkIG9uIHRoZSBmdXR1cmUgUmVhZEJ1ZmZlcnMoKSBjYWxscywgd2hpY2gK
KyAgLy8gbWVhbnMgdGhhdDoKKyAgLy8gIChhKSBJZiB3ZSdyZSBzdHJlYW1pbmcgdG8gYSBmaWxl
IChvciB0byBhIGNvbnN1bWVyKSB3aGlsZSB0cmFjaW5nLCB3ZQorICAvLyAgICAgIHdyaXRlIHNu
YXBzaG90cyBwZXJpb2RpY2FsbHkgaW50byB0aGUgdHJhY2UuCisgIC8vICAoYikgSWYgUmVhZEJ1
ZmZlcnMoKSBpcyBvbmx5IGNhbGxlZCBhZnRlciB0cmFjaW5nIGVuZHMsIHdlIGVtaXQgdGhlIGxh
dGVzdAorICAvLyAgICAgIHNuYXBzaG90IGludG8gdGhlIHRyYWNlLiBGb3IgY2xvY2sgc25hcHNo
b3RzLCB3ZSBrZWVwIHRyYWNrIG9mIGEKKyAgLy8gICAgICBzbmFwc2hvdCByZWNvcmRlZCBhdCB0
aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uIGFzIHdlbGwgYXMgdGhlIG1vc3QKKyAgLy8gICAg
ICByZWNlbnQgc25hcHNob3QgdGhhdCBzaG93ZWQgc2lnbmlmaWNhbnQgbmV3IGRyaWZ0IGJldHdl
ZW4gZGlmZmVyZW50CisgIC8vICAgICAgY2xvY2tzLiBUaGlzIHdheSwgd2UgZW1pdCB1c2VmdWwg
c25hcHNob3RzIGZvciBib3RoIHN0b3Atd2hlbi1mdWxsIGFuZAorICAvLyAgICAgIHJpbmctYnVm
ZmVyIHRyYWNpbmcgbW9kZXMuCisgIFBlcmlvZGljU25hcHNob3RUYXNrKHRyYWNpbmdfc2Vzc2lv
biwgLyppc19pbml0aWFsX3NuYXBzaG90PSovdHJ1ZSk7CisKKyAgLy8gVHJpZ2dlciBkZWxheWVk
IHRhc2sgaWYgdGhlIHRyYWNlIGlzIHRpbWUgbGltaXRlZC4KKyAgY29uc3QgdWludDMyX3QgdHJh
Y2VfZHVyYXRpb25fbXMgPSB0cmFjaW5nX3Nlc3Npb24tPmNvbmZpZy5kdXJhdGlvbl9tcygpOwor
ICBpZiAodHJhY2VfZHVyYXRpb25fbXMgPiAwKSB7CisgICAgYXV0byB3ZWFrX3RoaXMgPSB3ZWFr
X3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgICAgdGFza19ydW5uZXJfLT5Qb3N0RGVsYXll
ZFRhc2soCisgICAgICAgIFt3ZWFrX3RoaXMsIHRzaWRdIHsKKyAgICAgICAgICAvLyBTa2lwIGVu
dGlyZWx5IHRoZSBmbHVzaCBpZiB0aGUgdHJhY2Ugc2Vzc2lvbiBkb2Vzbid0IGV4aXN0IGFueW1v
cmUuCisgICAgICAgICAgLy8gVGhpcyBpcyB0byBwcmV2ZW50IG1pc2xlYWRpbmcgZXJyb3IgbWVz
c2FnZXMgdG8gYmUgbG9nZ2VkLgorICAgICAgICAgIGlmICghd2Vha190aGlzKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgIGF1dG8qIHRyYWNpbmdfc2Vzc2lvbl9wdHIgPSB3ZWFrX3Ro
aXMtPkdldFRyYWNpbmdTZXNzaW9uKHRzaWQpOworICAgICAgICAgIGlmICghdHJhY2luZ19zZXNz
aW9uX3B0cikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAvLyBJZiB0aGlzIHRyYWNl
IHdhcyB1c2luZyBTVE9QX1RSQUNJTkcgdHJpZ2dlcnMgYW5kIHdlJ3ZlIHNlZW4KKyAgICAgICAg
ICAvLyBvbmUsIHRoZW4gdGhlIHRyaWdnZXIgb3ZlcnJpZGVzIHRoZSBub3JtYWwgdGltZW91dC4g
SW4gdGhpcworICAgICAgICAgIC8vIGNhc2Ugd2UganVzdCByZXR1cm4gYW5kIGxldCB0aGUgb3Ro
ZXIgdGFzayBjbGVhbiB1cCB0aGlzIHRyYWNlLgorICAgICAgICAgIGlmICh0cmFjaW5nX3Nlc3Np
b25fcHRyLT5jb25maWcudHJpZ2dlcl9jb25maWcoKS50cmlnZ2VyX21vZGUoKSA9PQorICAgICAg
ICAgICAgICAgICAgVHJhY2VDb25maWc6OlRyaWdnZXJDb25maWc6OlNUT1BfVFJBQ0lORyAmJgor
ICAgICAgICAgICAgICAhdHJhY2luZ19zZXNzaW9uX3B0ci0+cmVjZWl2ZWRfdHJpZ2dlcnMuZW1w
dHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAvLyBJbiBhbGwgb3RoZXIgY2Fz
ZXMgKFNUQVJUX1RSQUNJTkcgb3Igbm8gdHJpZ2dlcnMpIHdlIGZsdXNoCisgICAgICAgICAgLy8g
YWZ0ZXIgfHRyYWNlX2R1cmF0aW9uX21zfCB1bmNvbmRpdGlvbmFsbHkuCisgICAgICAgICAgd2Vh
a190aGlzLT5GbHVzaEFuZERpc2FibGVUcmFjaW5nKHRzaWQpOworICAgICAgICB9LAorICAgICAg
ICB0cmFjZV9kdXJhdGlvbl9tcyk7CisgIH0KKworICAvLyBTdGFydCB0aGUgcGVyaW9kaWMgZHJh
aW4gdGFza3MgaWYgd2Ugc2hvdWxkIHRvIHNhdmUgdGhlIHRyYWNlIGludG8gYSBmaWxlLgorICBp
ZiAodHJhY2luZ19zZXNzaW9uLT5jb25maWcud3JpdGVfaW50b19maWxlKCkpIHsKKyAgICBhdXRv
IHdlYWtfdGhpcyA9IHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKKyAgICB0YXNrX3J1
bm5lcl8tPlBvc3REZWxheWVkVGFzaygKKyAgICAgICAgW3dlYWtfdGhpcywgdHNpZF0geworICAg
ICAgICAgIGlmICh3ZWFrX3RoaXMpCisgICAgICAgICAgICB3ZWFrX3RoaXMtPlJlYWRCdWZmZXJz
KHRzaWQsIG51bGxwdHIpOworICAgICAgICB9LAorICAgICAgICB0cmFjaW5nX3Nlc3Npb24tPmRl
bGF5X3RvX25leHRfd3JpdGVfcGVyaW9kX21zKCkpOworICB9CisKKyAgLy8gU3RhcnQgdGhlIHBl
cmlvZGljIGZsdXNoIHRhc2tzIGlmIHRoZSBjb25maWcgc3BlY2lmaWVkIGEgZmx1c2ggcGVyaW9k
LgorICBpZiAodHJhY2luZ19zZXNzaW9uLT5jb25maWcuZmx1c2hfcGVyaW9kX21zKCkpCisgICAg
UGVyaW9kaWNGbHVzaFRhc2sodHNpZCwgLypwb3N0X25leHRfb25seT0qL3RydWUpOworCisgIC8v
IFN0YXJ0IHRoZSBwZXJpb2RpYyBpbmNyZW1lbnRhbCBzdGF0ZSBjbGVhciB0YXNrcyBpZiB0aGUg
Y29uZmlnIHNwZWNpZmllZCBhCisgIC8vIHBlcmlvZC4KKyAgaWYgKHRyYWNpbmdfc2Vzc2lvbi0+
Y29uZmlnLmluY3JlbWVudGFsX3N0YXRlX2NvbmZpZygpLmNsZWFyX3BlcmlvZF9tcygpKSB7Cisg
ICAgUGVyaW9kaWNDbGVhckluY3JlbWVudGFsU3RhdGVUYXNrKHRzaWQsIC8qcG9zdF9uZXh0X29u
bHk9Ki90cnVlKTsKKyAgfQorCisgIGZvciAoYXV0byYga3YgOiB0cmFjaW5nX3Nlc3Npb24tPmRh
dGFfc291cmNlX2luc3RhbmNlcykgeworICAgIFByb2R1Y2VySUQgcHJvZHVjZXJfaWQgPSBrdi5m
aXJzdDsKKyAgICBEYXRhU291cmNlSW5zdGFuY2UmIGRhdGFfc291cmNlID0ga3Yuc2Vjb25kOwor
ICAgIFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyKHByb2R1Y2Vy
X2lkKTsKKyAgICBpZiAoIXByb2R1Y2VyKSB7CisgICAgICBQRVJGRVRUT19ERkFUQUwoIlByb2R1
Y2VyIGRvZXMgbm90IGV4aXN0LiIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIFN0YXJ0
RGF0YVNvdXJjZUluc3RhbmNlKHByb2R1Y2VyLCB0cmFjaW5nX3Nlc3Npb24sICZkYXRhX3NvdXJj
ZSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpT
dGFydERhdGFTb3VyY2VJbnN0YW5jZSgKKyAgICBQcm9kdWNlckVuZHBvaW50SW1wbCogcHJvZHVj
ZXIsCisgICAgVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lvbiwKKyAgICBUcmFjaW5nU2Vy
dmljZUltcGw6OkRhdGFTb3VyY2VJbnN0YW5jZSogaW5zdGFuY2UpIHsKKyAgUEVSRkVUVE9fRENI
RUNLKGluc3RhbmNlLT5zdGF0ZSA9PSBEYXRhU291cmNlSW5zdGFuY2U6OkNPTkZJR1VSRUQpOwor
ICBpZiAoaW5zdGFuY2UtPndpbGxfbm90aWZ5X29uX3N0YXJ0KSB7CisgICAgaW5zdGFuY2UtPnN0
YXRlID0gRGF0YVNvdXJjZUluc3RhbmNlOjpTVEFSVElORzsKKyAgfSBlbHNlIHsKKyAgICBpbnN0
YW5jZS0+c3RhdGUgPSBEYXRhU291cmNlSW5zdGFuY2U6OlNUQVJURUQ7CisgIH0KKyAgaWYgKHRy
YWNpbmdfc2Vzc2lvbi0+Y29uc3VtZXJfbWF5YmVfbnVsbCkgeworICAgIHRyYWNpbmdfc2Vzc2lv
bi0+Y29uc3VtZXJfbWF5YmVfbnVsbC0+T25EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZSgK
KyAgICAgICAgKnByb2R1Y2VyLCAqaW5zdGFuY2UpOworICB9CisgIHByb2R1Y2VyLT5TdGFydERh
dGFTb3VyY2UoaW5zdGFuY2UtPmluc3RhbmNlX2lkLCBpbnN0YW5jZS0+Y29uZmlnKTsKKworICAv
LyBJZiBhbGwgZGF0YSBzb3VyY2VzIGFyZSBzdGFydGVkLCBub3RpZnkgdGhlIGNvbnN1bWVyLgor
ICBpZiAoaW5zdGFuY2UtPnN0YXRlID09IERhdGFTb3VyY2VJbnN0YW5jZTo6U1RBUlRFRCkKKyAg
ICBNYXliZU5vdGlmeUFsbERhdGFTb3VyY2VzU3RhcnRlZCh0cmFjaW5nX3Nlc3Npb24pOworfQor
CisvLyBEaXNhYmxlVHJhY2luZyBqdXN0IHN0b3BzIHRoZSBkYXRhIHNvdXJjZXMgYnV0IGRvZXNu
J3QgZnJlZSB1cCBhbnkgYnVmZmVyLgorLy8gVGhpcyBpcyB0byBhbGxvdyB0aGUgY29uc3VtZXIg
dG8gZnJlZXplIHRoZSBidWZmZXJzIChieSBzdG9wcGluZyB0aGUgdHJhY2UpCisvLyBhbmQgdGhl
biBkcmFpbiB0aGUgYnVmZmVycy4gVGhlIGFjdHVhbCB0ZWFyZG93biBvZiB0aGUgVHJhY2luZ1Nl
c3Npb24gaGFwcGVucworLy8gaW4gRnJlZUJ1ZmZlcnMoKS4KK3ZvaWQgVHJhY2luZ1NlcnZpY2VJ
bXBsOjpEaXNhYmxlVHJhY2luZyhUcmFjaW5nU2Vzc2lvbklEIHRzaWQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXNhYmxlX2ltbWVkaWF0ZWx5KSB7Cisg
IFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgVHJhY2luZ1Nlc3Np
b24qIHRyYWNpbmdfc2Vzc2lvbiA9IEdldFRyYWNpbmdTZXNzaW9uKHRzaWQpOworICBpZiAoIXRy
YWNpbmdfc2Vzc2lvbikgeworICAgIC8vIENhbiBoYXBwZW4gaWYgdGhlIGNvbnN1bWVyIGNhbGxz
IHRoaXMgYmVmb3JlIEVuYWJsZVRyYWNpbmcoKSBvciBhZnRlcgorICAgIC8vIEZyZWVCdWZmZXJz
KCkuCisgICAgUEVSRkVUVE9fRExPRygiRGlzYWJsZVRyYWNpbmcoKSBmYWlsZWQsIGludmFsaWQg
c2Vzc2lvbiBJRCAlIiBQUkl1NjQsIHRzaWQpOworICAgIHJldHVybjsKKyAgfQorCisgIHN3aXRj
aCAodHJhY2luZ19zZXNzaW9uLT5zdGF0ZSkgeworICAgIC8vIFNwdXJpb3VzIGNhbGwgdG8gRGlz
YWJsZVRyYWNpbmcoKSB3aGlsZSBhbHJlYWR5IGRpc2FibGVkLCBub3RoaW5nIHRvIGRvLgorICAg
IGNhc2UgVHJhY2luZ1Nlc3Npb246OkRJU0FCTEVEOgorICAgICAgUEVSRkVUVE9fRENIRUNLKHRy
YWNpbmdfc2Vzc2lvbi0+QWxsRGF0YVNvdXJjZUluc3RhbmNlc1N0b3BwZWQoKSk7CisgICAgICBy
ZXR1cm47CisKKyAgICAvLyBUaGlzIGlzIGVpdGhlcjoKKyAgICAvLyBBKSBUaGUgY2FzZSBvZiBh
IGdyYWNlZnVsIERpc2FibGVUcmFjaW5nKCkgY2FsbCBmb2xsb3dlZCBieSBhIGNhbGwgdG8KKyAg
ICAvLyAgICBGcmVlQnVmZmVycygpLCBpZmYgfGRpc2FibGVfaW1tZWRpYXRlbHl8ID09IHRydWUu
IEluIHRoaXMgY2FzZSB3ZSB3YW50CisgICAgLy8gICAgdG8gZm9yY2VmdWxseSB0cmFuc2l0aW9u
IGluIHRoZSBkaXNhYmxlZCBzdGF0ZSB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZQorICAgIC8vICAg
IG91dHN0YW5kaW5nIGFja3MgYmVjYXVzZSB0aGUgYnVmZmVycyBhcmUgZ29pbmcgdG8gYmUgZGVz
dHJveWVkIHNvb24uCisgICAgLy8gQikgQSBzcHVyaW91cyBjYWxsLCBpZmYgfGRpc2FibGVfaW1t
ZWRpYXRlbHl8ID09IGZhbHNlLCBpbiB3aGljaCBjYXNlCisgICAgLy8gICAgdGhlcmUgaXMgbm90
aGluZyB0byBkby4KKyAgICBjYXNlIFRyYWNpbmdTZXNzaW9uOjpESVNBQkxJTkdfV0FJVElOR19T
VE9QX0FDS1M6CisgICAgICBQRVJGRVRUT19EQ0hFQ0soIXRyYWNpbmdfc2Vzc2lvbi0+QWxsRGF0
YVNvdXJjZUluc3RhbmNlc1N0b3BwZWQoKSk7CisgICAgICBpZiAoZGlzYWJsZV9pbW1lZGlhdGVs
eSkKKyAgICAgICAgRGlzYWJsZVRyYWNpbmdOb3RpZnlDb25zdW1lckFuZEZsdXNoRmlsZSh0cmFj
aW5nX3Nlc3Npb24pOworICAgICAgcmV0dXJuOworCisgICAgLy8gQ29udGludWVzIGJlbG93Lgor
ICAgIGNhc2UgVHJhY2luZ1Nlc3Npb246OkNPTkZJR1VSRUQ6CisgICAgICAvLyBJZiB0aGUgc2Vz
c2lvbiBkaWRuJ3QgZXZlbiBzdGFydCB0aGVyZSBpcyBubyBuZWVkIHRvIG9yY2hlc3RyYXRlIGEK
KyAgICAgIC8vIGdyYWNlZnVsIHN0b3Agb2YgZGF0YSBzb3VyY2VzLgorICAgICAgZGlzYWJsZV9p
bW1lZGlhdGVseSA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIC8vIFRoaXMgaXMgdGhlIG5v
bWluYWwgY2FzZSwgY29udGludWVzIGJlbG93LgorICAgIGNhc2UgVHJhY2luZ1Nlc3Npb246OlNU
QVJURUQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGZvciAoYXV0byYgZGF0YV9zb3VyY2VfaW5z
dCA6IHRyYWNpbmdfc2Vzc2lvbi0+ZGF0YV9zb3VyY2VfaW5zdGFuY2VzKSB7CisgICAgY29uc3Qg
UHJvZHVjZXJJRCBwcm9kdWNlcl9pZCA9IGRhdGFfc291cmNlX2luc3QuZmlyc3Q7CisgICAgRGF0
YVNvdXJjZUluc3RhbmNlJiBpbnN0YW5jZSA9IGRhdGFfc291cmNlX2luc3Quc2Vjb25kOworICAg
IFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyKHByb2R1Y2VyX2lk
KTsKKyAgICBQRVJGRVRUT19EQ0hFQ0socHJvZHVjZXIpOworICAgIFBFUkZFVFRPX0RDSEVDSyhp
bnN0YW5jZS5zdGF0ZSA9PSBEYXRhU291cmNlSW5zdGFuY2U6OkNPTkZJR1VSRUQgfHwKKyAgICAg
ICAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPT0gRGF0YVNvdXJjZUluc3RhbmNlOjpTVEFS
VElORyB8fAorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9PSBEYXRhU291cmNl
SW5zdGFuY2U6OlNUQVJURUQpOworICAgIFN0b3BEYXRhU291cmNlSW5zdGFuY2UocHJvZHVjZXIs
IHRyYWNpbmdfc2Vzc2lvbiwgJmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGlzYWJsZV9pbW1lZGlhdGVseSk7CisgIH0KKworICAvLyBFaXRoZXIgdGhpcyByZXF1ZXN0IGlz
IGZsYWdnZWQgd2l0aCB8ZGlzYWJsZV9pbW1lZGlhdGVseXwgb3IgdGhlcmUgYXJlIG5vCisgIC8v
IGRhdGEgc291cmNlcyB0aGF0IGFyZSByZXF1ZXN0aW5nIGEgZmluYWwgaGFuZHNoYWtlLiBJbiBi
b3RoIGNhc2VzIGp1c3QgbWFyaworICAvLyB0aGUgc2Vzc2lvbiBhcyBkaXNhYmxlZCBpbW1lZGlh
dGVseSwgbm90aWZ5IHRoZSBjb25zdW1lciBhbmQgZmx1c2ggdGhlCisgIC8vIHRyYWNlIGZpbGUg
KGlmIHVzZWQpLgorICBpZiAodHJhY2luZ19zZXNzaW9uLT5BbGxEYXRhU291cmNlSW5zdGFuY2Vz
U3RvcHBlZCgpKQorICAgIHJldHVybiBEaXNhYmxlVHJhY2luZ05vdGlmeUNvbnN1bWVyQW5kRmx1
c2hGaWxlKHRyYWNpbmdfc2Vzc2lvbik7CisKKyAgdHJhY2luZ19zZXNzaW9uLT5zdGF0ZSA9IFRy
YWNpbmdTZXNzaW9uOjpESVNBQkxJTkdfV0FJVElOR19TVE9QX0FDS1M7CisgIGF1dG8gd2Vha190
aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOworICB0YXNrX3J1bm5lcl8tPlBv
c3REZWxheWVkVGFzaygKKyAgICAgIFt3ZWFrX3RoaXMsIHRzaWRdIHsKKyAgICAgICAgaWYgKHdl
YWtfdGhpcykKKyAgICAgICAgICB3ZWFrX3RoaXMtPk9uRGlzYWJsZVRyYWNpbmdUaW1lb3V0KHRz
aWQpOworICAgICAgfSwKKyAgICAgIHRyYWNpbmdfc2Vzc2lvbi0+ZGF0YV9zb3VyY2Vfc3RvcF90
aW1lb3V0X21zKCkpOworCisgIC8vIERlbGliZXJhdGVseSBOT1QgcmVtb3ZpbmcgdGhlIHNlc3Np
b24gZnJvbSB8dHJhY2luZ19zZXNzaW9uX3wsIGl0J3Mgc3RpbGwKKyAgLy8gbmVlZGVkIHRvIGNh
bGwgUmVhZEJ1ZmZlcnMoKS4gRnJlZUJ1ZmZlcnMoKSB3aWxsIGVyYXNlKCkgdGhlIHNlc3Npb24u
Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpOb3RpZnlEYXRhU291cmNlU3RhcnRlZCgK
KyAgICBQcm9kdWNlcklEIHByb2R1Y2VyX2lkLAorICAgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGlu
c3RhbmNlX2lkKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsK
KyAgZm9yIChhdXRvJiBrdiA6IHRyYWNpbmdfc2Vzc2lvbnNfKSB7CisgICAgVHJhY2luZ1Nlc3Np
b24mIHRyYWNpbmdfc2Vzc2lvbiA9IGt2LnNlY29uZDsKKyAgICBEYXRhU291cmNlSW5zdGFuY2Uq
IGluc3RhbmNlID0KKyAgICAgICAgdHJhY2luZ19zZXNzaW9uLkdldERhdGFTb3VyY2VJbnN0YW5j
ZShwcm9kdWNlcl9pZCwgaW5zdGFuY2VfaWQpOworCisgICAgaWYgKCFpbnN0YW5jZSkKKyAgICAg
IGNvbnRpbnVlOworCisgICAgLy8gSWYgdGhlIHRyYWNpbmcgc2Vzc2lvbiB3YXMgYWxyZWFkeSBz
dG9wcGVkLCBpZ25vcmUgdGhpcyBub3RpZmljYXRpb24uCisgICAgaWYgKHRyYWNpbmdfc2Vzc2lv
bi5zdGF0ZSAhPSBUcmFjaW5nU2Vzc2lvbjo6U1RBUlRFRCkKKyAgICAgIGNvbnRpbnVlOworCisg
ICAgaWYgKGluc3RhbmNlLT5zdGF0ZSAhPSBEYXRhU291cmNlSW5zdGFuY2U6OlNUQVJUSU5HKSB7
CisgICAgICBQRVJGRVRUT19FTE9HKCJTdGFydGVkIGRhdGEgc291cmNlIGluc3RhbmNlIGluIGlu
Y29ycmVjdCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+c3RhdGUp
OworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaW5zdGFuY2UtPnN0YXRlID0gRGF0YVNv
dXJjZUluc3RhbmNlOjpTVEFSVEVEOworCisgICAgUHJvZHVjZXJFbmRwb2ludEltcGwqIHByb2R1
Y2VyID0gR2V0UHJvZHVjZXIocHJvZHVjZXJfaWQpOworICAgIFBFUkZFVFRPX0RDSEVDSyhwcm9k
dWNlcik7CisgICAgaWYgKHRyYWNpbmdfc2Vzc2lvbi5jb25zdW1lcl9tYXliZV9udWxsKSB7Cisg
ICAgICB0cmFjaW5nX3Nlc3Npb24uY29uc3VtZXJfbWF5YmVfbnVsbC0+T25EYXRhU291cmNlSW5z
dGFuY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAqcHJvZHVjZXIsICppbnN0YW5jZSk7CisgICAg
fQorCisgICAgLy8gSWYgYWxsIGRhdGEgc291cmNlcyBhcmUgc3RhcnRlZCwgbm90aWZ5IHRoZSBj
b25zdW1lci4KKyAgICBNYXliZU5vdGlmeUFsbERhdGFTb3VyY2VzU3RhcnRlZCgmdHJhY2luZ19z
ZXNzaW9uKTsKKyAgfSAgLy8gZm9yICh0cmFjaW5nX3Nlc3Npb24pCit9CisKK3ZvaWQgVHJhY2lu
Z1NlcnZpY2VJbXBsOjpNYXliZU5vdGlmeUFsbERhdGFTb3VyY2VzU3RhcnRlZCgKKyAgICBUcmFj
aW5nU2Vzc2lvbiogdHJhY2luZ19zZXNzaW9uKSB7CisgIGlmICghdHJhY2luZ19zZXNzaW9uLT5j
b25zdW1lcl9tYXliZV9udWxsKQorICAgIHJldHVybjsKKworICBpZiAoIXRyYWNpbmdfc2Vzc2lv
bi0+QWxsRGF0YVNvdXJjZUluc3RhbmNlc1N0YXJ0ZWQoKSkKKyAgICByZXR1cm47CisKKyAgLy8g
SW4gc29tZSByYXJlIGNhc2VzLCB3ZSBjYW4gZ2V0IGluIHRoaXMgc3RhdGUgbW9yZSB0aGFuIG9u
Y2UuIENvbnNpZGVyIHRoZQorICAvLyBmb2xsb3dpbmcgc2NlbmFyaW86IDMgZGF0YSBzb3VyY2Vz
IGFyZSByZWdpc3RlcmVkIC0+IHRyYWNlIHN0YXJ0cyAtPgorICAvLyBhbGwgMyBkYXRhIHNvdXJj
ZXMgYWNrIC0+IE9uQWxsRGF0YVNvdXJjZXNTdGFydGVkKCkgaXMgY2FsbGVkLgorICAvLyBJbWFn
aW5lIG5vdyB0aGF0IGEgNHRoIGRhdGEgc291cmNlIHJlZ2lzdGVycyB3aGlsZSB0aGUgdHJhY2Ug
aXMgb25nb2luZy4KKyAgLy8gVGhpcyB3b3VsZCBoaXQgdGhlIEFsbERhdGFTb3VyY2VJbnN0YW5j
ZXNTdGFydGVkKCkgY29uZGl0aW9uIGFnYWluLgorICAvLyBJbiB0aGlzIGNhc2UsIGhvd2V2ZXIs
IHdlIGRvbid0IHdhbnQgdG8gcmUtbm90aWZ5IHRoZSBjb25zdW1lciBhZ2Fpbi4KKyAgLy8gVGhh
dCB3b3VsZCBiZSB1bmV4cGVjdGVkIChldmVuIGlmLCBwZXJoYXBzLCB0ZWNobmljYWxseSBjb3Jy
ZWN0KSBhbmQKKyAgLy8gdHJpZ2dlciBidWdzIGluIHRoZSBjb25zdW1lci4KKyAgaWYgKHRyYWNp
bmdfc2Vzc2lvbi0+ZGlkX25vdGlmeV9hbGxfZGF0YV9zb3VyY2Vfc3RhcnRlZCkKKyAgICByZXR1
cm47CisKKyAgUEVSRkVUVE9fRExPRygiQWxsIGRhdGEgc291cmNlcyBzdGFydGVkIik7CisgIHRy
YWNpbmdfc2Vzc2lvbi0+ZGlkX25vdGlmeV9hbGxfZGF0YV9zb3VyY2Vfc3RhcnRlZCA9IHRydWU7
CisgIHRyYWNpbmdfc2Vzc2lvbi0+dGltZV9hbGxfZGF0YV9zb3VyY2Vfc3RhcnRlZCA9IGJhc2U6
OkdldEJvb3RUaW1lTnMoKTsKKyAgdHJhY2luZ19zZXNzaW9uLT5jb25zdW1lcl9tYXliZV9udWxs
LT5PbkFsbERhdGFTb3VyY2VzU3RhcnRlZCgpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1w
bDo6Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoCisgICAgUHJvZHVjZXJJRCBwcm9kdWNlcl9pZCwK
KyAgICBEYXRhU291cmNlSW5zdGFuY2VJRCBpbnN0YW5jZV9pZCkgeworICBQRVJGRVRUT19EQ0hF
Q0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGZvciAoYXV0byYga3YgOiB0cmFjaW5nX3Nl
c3Npb25zXykgeworICAgIFRyYWNpbmdTZXNzaW9uJiB0cmFjaW5nX3Nlc3Npb24gPSBrdi5zZWNv
bmQ7CisgICAgRGF0YVNvdXJjZUluc3RhbmNlKiBpbnN0YW5jZSA9CisgICAgICAgIHRyYWNpbmdf
c2Vzc2lvbi5HZXREYXRhU291cmNlSW5zdGFuY2UocHJvZHVjZXJfaWQsIGluc3RhbmNlX2lkKTsK
KworICAgIGlmICghaW5zdGFuY2UpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChpbnN0YW5j
ZS0+c3RhdGUgIT0gRGF0YVNvdXJjZUluc3RhbmNlOjpTVE9QUElORykgeworICAgICAgUEVSRkVU
VE9fRUxPRygiU3RvcHBlZCBkYXRhIHNvdXJjZSBpbnN0YW5jZSBpbiBpbmNvcnJlY3Qgc3RhdGU6
ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPnN0YXRlKTsKKyAgICAgIGNvbnRp
bnVlOworICAgIH0KKworICAgIGluc3RhbmNlLT5zdGF0ZSA9IERhdGFTb3VyY2VJbnN0YW5jZTo6
U1RPUFBFRDsKKworICAgIFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBwcm9kdWNlciA9IEdldFByb2R1
Y2VyKHByb2R1Y2VyX2lkKTsKKyAgICBQRVJGRVRUT19EQ0hFQ0socHJvZHVjZXIpOworICAgIGlm
ICh0cmFjaW5nX3Nlc3Npb24uY29uc3VtZXJfbWF5YmVfbnVsbCkgeworICAgICAgdHJhY2luZ19z
ZXNzaW9uLmNvbnN1bWVyX21heWJlX251bGwtPk9uRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFu
Z2UoCisgICAgICAgICAgKnByb2R1Y2VyLCAqaW5zdGFuY2UpOworICAgIH0KKworICAgIGlmICgh
dHJhY2luZ19zZXNzaW9uLkFsbERhdGFTb3VyY2VJbnN0YW5jZXNTdG9wcGVkKCkpCisgICAgICBj
b250aW51ZTsKKworICAgIGlmICh0cmFjaW5nX3Nlc3Npb24uc3RhdGUgIT0gVHJhY2luZ1Nlc3Np
b246OkRJU0FCTElOR19XQUlUSU5HX1NUT1BfQUNLUykKKyAgICAgIGNvbnRpbnVlOworCisgICAg
Ly8gQWxsIGRhdGEgc291cmNlcyBhY2tlZCB0aGUgdGVybWluYXRpb24uCisgICAgRGlzYWJsZVRy
YWNpbmdOb3RpZnlDb25zdW1lckFuZEZsdXNoRmlsZSgmdHJhY2luZ19zZXNzaW9uKTsKKyAgfSAg
Ly8gZm9yICh0cmFjaW5nX3Nlc3Npb24pCit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpB
Y3RpdmF0ZVRyaWdnZXJzKAorICAgIFByb2R1Y2VySUQgcHJvZHVjZXJfaWQsCisgICAgY29uc3Qg
c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0cmlnZ2VycykgeworICBQRVJGRVRUT19EQ0hFQ0tf
VEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGF1dG8qIHByb2R1Y2VyID0gR2V0UHJvZHVjZXIo
cHJvZHVjZXJfaWQpOworICBQRVJGRVRUT19EQ0hFQ0socHJvZHVjZXIpOworICBmb3IgKGNvbnN0
IGF1dG8mIHRyaWdnZXJfbmFtZSA6IHRyaWdnZXJzKSB7CisgICAgZm9yIChhdXRvJiBpZF9hbmRf
dHJhY2luZ19zZXNzaW9uIDogdHJhY2luZ19zZXNzaW9uc18pIHsKKyAgICAgIGF1dG8mIHRyYWNp
bmdfc2Vzc2lvbiA9IGlkX2FuZF90cmFjaW5nX3Nlc3Npb24uc2Vjb25kOworICAgICAgVHJhY2lu
Z1Nlc3Npb25JRCB0c2lkID0gaWRfYW5kX3RyYWNpbmdfc2Vzc2lvbi5maXJzdDsKKyAgICAgIGF1
dG8gaXRlciA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICB0cmFjaW5nX3Nlc3Npb24uY29uZmln
LnRyaWdnZXJfY29uZmlnKCkudHJpZ2dlcnMoKS5iZWdpbigpLAorICAgICAgICAgIHRyYWNpbmdf
c2Vzc2lvbi5jb25maWcudHJpZ2dlcl9jb25maWcoKS50cmlnZ2VycygpLmVuZCgpLAorICAgICAg
ICAgIFsmdHJpZ2dlcl9uYW1lXShjb25zdCBUcmFjZUNvbmZpZzo6VHJpZ2dlckNvbmZpZzo6VHJp
Z2dlciYgdHJpZ2dlcikgeworICAgICAgICAgICAgcmV0dXJuIHRyaWdnZXIubmFtZSgpID09IHRy
aWdnZXJfbmFtZTsKKyAgICAgICAgICB9KTsKKyAgICAgIGlmIChpdGVyID09IHRyYWNpbmdfc2Vz
c2lvbi5jb25maWcudHJpZ2dlcl9jb25maWcoKS50cmlnZ2VycygpLmVuZCgpKSB7CisgICAgICAg
IGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIHRyaWdnZXIgcmVxdWlyZXMg
YSBjZXJ0YWluIHByb2R1Y2VyIHRvIGhhdmUgc2VudCBpdAorICAgICAgLy8gKG5vbi1lbXB0eSBw
cm9kdWNlcl9uYW1lKCkpIGVuc3VyZSB0aGUgcHJvZHVjZXIgd2hvIHNlbnQgdGhpcyB0cmlnZ2Vy
CisgICAgICAvLyBtYXRjaGVzLgorICAgICAgaWYgKCFpdGVyLT5wcm9kdWNlcl9uYW1lX3JlZ2V4
KCkuZW1wdHkoKSAmJgorICAgICAgICAgICFzdGQ6OnJlZ2V4X21hdGNoKAorICAgICAgICAgICAg
ICBwcm9kdWNlci0+bmFtZV8sCisgICAgICAgICAgICAgIHN0ZDo6cmVnZXgoaXRlci0+cHJvZHVj
ZXJfbmFtZV9yZWdleCgpLCBzdGQ6OnJlZ2V4OjpleHRlbmRlZCkpKSB7CisgICAgICAgIGNvbnRp
bnVlOworICAgICAgfQorCisgICAgICBjb25zdCBib29sIHRyaWdnZXJzX2FscmVhZHlfcmVjZWl2
ZWQgPQorICAgICAgICAgICF0cmFjaW5nX3Nlc3Npb24ucmVjZWl2ZWRfdHJpZ2dlcnMuZW1wdHko
KTsKKyAgICAgIHRyYWNpbmdfc2Vzc2lvbi5yZWNlaXZlZF90cmlnZ2Vycy5wdXNoX2JhY2soCisg
ICAgICAgICAge3N0YXRpY19jYXN0PHVpbnQ2NF90PihiYXNlOjpHZXRCb290VGltZU5zKCkuY291
bnQoKSksIGl0ZXItPm5hbWUoKSwKKyAgICAgICAgICAgcHJvZHVjZXItPm5hbWVfLCBwcm9kdWNl
ci0+dWlkX30pOworICAgICAgYXV0byB3ZWFrX3RoaXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRX
ZWFrUHRyKCk7CisgICAgICBzd2l0Y2ggKHRyYWNpbmdfc2Vzc2lvbi5jb25maWcudHJpZ2dlcl9j
b25maWcoKS50cmlnZ2VyX21vZGUoKSkgeworICAgICAgICBjYXNlIFRyYWNlQ29uZmlnOjpUcmln
Z2VyQ29uZmlnOjpTVEFSVF9UUkFDSU5HOgorICAgICAgICAgIC8vIElmIHRoZSBzZXNzaW9uIGhh
cyBhbHJlYWR5IGJlZW4gdHJpZ2dlcmVkIGFuZCBtb3ZlZCBwYXN0CisgICAgICAgICAgLy8gQ09O
RklHVVJFRCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcmVwZWF0IFN0YXJ0VHJhY2luZy4gVGhpcyB3
b3VsZAorICAgICAgICAgIC8vIHdvcmsgZmluZSAoU3RhcnRUcmFjaW5nIHdvdWxkIHJldHVybiBm
YWxzZSkgYnV0IHdvdWxkIGFkZCBlcnJvcgorICAgICAgICAgIC8vIGxvZ3MuCisgICAgICAgICAg
aWYgKHRyYWNpbmdfc2Vzc2lvbi5zdGF0ZSAhPSBUcmFjaW5nU2Vzc2lvbjo6Q09ORklHVVJFRCkK
KyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgUEVSRkVUVE9fRExPRygiVHJpZ2dlcmlu
ZyAnJXMnIG9uIHRyYWNpbmcgc2Vzc2lvbiAlIiBQUkl1NjQKKyAgICAgICAgICAgICAgICAgICAg
ICAgICIgd2l0aCBkdXJhdGlvbiBvZiAlIiBQUkl1MzIgIm1zLiIsCisgICAgICAgICAgICAgICAg
ICAgICAgICBpdGVyLT5uYW1lKCkuY19zdHIoKSwgdHNpZCwgaXRlci0+c3RvcF9kZWxheV9tcygp
KTsKKyAgICAgICAgICAvLyBXZSBvdmVycmlkZSB0aGUgdHJhY2UgZHVyYXRpb24gdG8gYmUgdGhl
IHRyaWdnZXIncyByZXF1ZXN0ZWQKKyAgICAgICAgICAvLyB2YWx1ZSwgdGhpcyBlbnN1cmVzIHRo
YXQgdGhlIHRyYWNlIHdpbGwgZW5kIGFmdGVyIHRoaXMgYW1vdW50CisgICAgICAgICAgLy8gb2Yg
dGltZSBoYXMgcGFzc2VkLgorICAgICAgICAgIHRyYWNpbmdfc2Vzc2lvbi5jb25maWcuc2V0X2R1
cmF0aW9uX21zKGl0ZXItPnN0b3BfZGVsYXlfbXMoKSk7CisgICAgICAgICAgU3RhcnRUcmFjaW5n
KHRzaWQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRyYWNlQ29uZmlnOjpUcmln
Z2VyQ29uZmlnOjpTVE9QX1RSQUNJTkc6CisgICAgICAgICAgLy8gT25seSBzdG9wIHRoZSB0cmFj
ZSBvbmNlIHRvIGF2b2lkIGNvbmZ1c2luZyBsb2cgbWVzc2FnZXMuIEkuRS4KKyAgICAgICAgICAv
LyB3aGVuIHdlJ3ZlIGFscmVhZHkgaGl0IHRoZSBmaXJzdCB0cmlnZ2VyIHdlJ3ZlIGFscmVhZHkg
UG9zdGVkIHRoZQorICAgICAgICAgIC8vIHRhc2sgdG8gRmx1c2hBbmREaXNhYmxlLiBTbyBhbGwg
ZnV0dXJlIHRyaWdnZXJzIHdpbGwganVzdCBicmVhaworICAgICAgICAgIC8vIG91dC4KKyAgICAg
ICAgICBpZiAodHJpZ2dlcnNfYWxyZWFkeV9yZWNlaXZlZCkKKyAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgICAgUEVSRkVUVE9fRExPRygiVHJpZ2dlcmluZyAnJXMnIG9uIHRyYWNpbmcgc2Vz
c2lvbiAlIiBQUkl1NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBkdXJhdGlvbiBv
ZiAlIiBQUkl1MzIgIm1zLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLT5uYW1lKCku
Y19zdHIoKSwgdHNpZCwgaXRlci0+c3RvcF9kZWxheV9tcygpKTsKKyAgICAgICAgICAvLyBOb3cg
dGhhdCB3ZSd2ZSBzZWVuIGEgdHJpZ2dlciB3ZSBuZWVkIHRvIHN0b3AsIGZsdXNoLCBhbmQgZGlz
YWJsZQorICAgICAgICAgIC8vIHRoaXMgc2Vzc2lvbiBhZnRlciB0aGUgY29uZmlndXJlZCB8c3Rv
cF9kZWxheV9tc3wuCisgICAgICAgICAgdGFza19ydW5uZXJfLT5Qb3N0RGVsYXllZFRhc2soCisg
ICAgICAgICAgICAgIFt3ZWFrX3RoaXMsIHRzaWRdIHsKKyAgICAgICAgICAgICAgICAvLyBTa2lw
IGVudGlyZWx5IHRoZSBmbHVzaCBpZiB0aGUgdHJhY2Ugc2Vzc2lvbiBkb2Vzbid0IGV4aXN0Cisg
ICAgICAgICAgICAgICAgLy8gYW55bW9yZS4gVGhpcyBpcyB0byBwcmV2ZW50IG1pc2xlYWRpbmcg
ZXJyb3IgbWVzc2FnZXMgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyBsb2dnZWQuCisgICAgICAg
ICAgICAgICAgaWYgKHdlYWtfdGhpcyAmJiB3ZWFrX3RoaXMtPkdldFRyYWNpbmdTZXNzaW9uKHRz
aWQpKQorICAgICAgICAgICAgICAgICAgd2Vha190aGlzLT5GbHVzaEFuZERpc2FibGVUcmFjaW5n
KHRzaWQpOworICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAvLyBJZiB0aGlzIHRyaWdn
ZXIgaXMgemVybyB0aGlzIHdpbGwgaW1tZWRpYXRlbHkgZXhlY3V0YWJsZSBhbmQKKyAgICAgICAg
ICAgICAgLy8gd2lsbCBoYXBwZW4gc2hvcnRseS4KKyAgICAgICAgICAgICAgaXRlci0+c3RvcF9k
ZWxheV9tcygpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUcmFjZUNvbmZpZzo6
VHJpZ2dlckNvbmZpZzo6VU5TUEVDSUZJRUQ6CisgICAgICAgICAgUEVSRkVUVE9fRUxPRygiVHJp
Z2dlciBhY3RpdmF0ZWQgYnV0IHRyaWdnZXIgbW9kZSB1bnNwZWNpZmllZC4iKTsKKyAgICAgICAg
ICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gQWx3YXlzIGludm9rZWQga0Rh
dGFTb3VyY2VTdG9wVGltZW91dE1zIGFmdGVyIERpc2FibGVUcmFjaW5nKCkuIEluIG5vbWluYWwK
Ky8vIGNvbmRpdGlvbnMgYWxsIGRhdGEgc291cmNlcyBzaG91bGQgaGF2ZSBhY2tlZCB0aGUgc3Rv
cCBhbmQgdGhpcyB3aWxsIGVhcmx5CisvLyBvdXQuCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6
T25EaXNhYmxlVHJhY2luZ1RpbWVvdXQoVHJhY2luZ1Nlc3Npb25JRCB0c2lkKSB7CisgIFBFUkZF
VFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgVHJhY2luZ1Nlc3Npb24qIHRy
YWNpbmdfc2Vzc2lvbiA9IEdldFRyYWNpbmdTZXNzaW9uKHRzaWQpOworICBpZiAoIXRyYWNpbmdf
c2Vzc2lvbiB8fAorICAgICAgdHJhY2luZ19zZXNzaW9uLT5zdGF0ZSAhPSBUcmFjaW5nU2Vzc2lv
bjo6RElTQUJMSU5HX1dBSVRJTkdfU1RPUF9BQ0tTKSB7CisgICAgcmV0dXJuOyAgLy8gVHJhY2lu
ZyBzZXNzaW9uIHdhcyBzdWNjZXNzZnVsbHkgZGlzYWJsZWQuCisgIH0KKworICBQRVJGRVRUT19J
TE9HKCJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIEFDS3MgZm9yIHRyYWNpbmcgc2Vzc2lvbiAl
IiBQUkl1NjQsCisgICAgICAgICAgICAgICAgdHNpZCk7CisgIFBFUkZFVFRPX0RDSEVDSyghdHJh
Y2luZ19zZXNzaW9uLT5BbGxEYXRhU291cmNlSW5zdGFuY2VzU3RvcHBlZCgpKTsKKyAgRGlzYWJs
ZVRyYWNpbmdOb3RpZnlDb25zdW1lckFuZEZsdXNoRmlsZSh0cmFjaW5nX3Nlc3Npb24pOworfQor
Cit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6RGlzYWJsZVRyYWNpbmdOb3RpZnlDb25zdW1lckFu
ZEZsdXNoRmlsZSgKKyAgICBUcmFjaW5nU2Vzc2lvbiogdHJhY2luZ19zZXNzaW9uKSB7CisgIFBF
UkZFVFRPX0RDSEVDSyh0cmFjaW5nX3Nlc3Npb24tPnN0YXRlICE9IFRyYWNpbmdTZXNzaW9uOjpE
SVNBQkxFRCk7CisgIGZvciAoYXV0byYgaW5zdF9rdiA6IHRyYWNpbmdfc2Vzc2lvbi0+ZGF0YV9z
b3VyY2VfaW5zdGFuY2VzKSB7CisgICAgaWYgKGluc3Rfa3Yuc2Vjb25kLnN0YXRlID09IERhdGFT
b3VyY2VJbnN0YW5jZTo6U1RPUFBFRCkKKyAgICAgIGNvbnRpbnVlOworICAgIGluc3Rfa3Yuc2Vj
b25kLnN0YXRlID0gRGF0YVNvdXJjZUluc3RhbmNlOjpTVE9QUEVEOworICAgIFByb2R1Y2VyRW5k
cG9pbnRJbXBsKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyKGluc3Rfa3YuZmlyc3QpOworICAgIFBF
UkZFVFRPX0RDSEVDSyhwcm9kdWNlcik7CisgICAgaWYgKHRyYWNpbmdfc2Vzc2lvbi0+Y29uc3Vt
ZXJfbWF5YmVfbnVsbCkgeworICAgICAgdHJhY2luZ19zZXNzaW9uLT5jb25zdW1lcl9tYXliZV9u
dWxsLT5PbkRhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlKAorICAgICAgICAgICpwcm9kdWNl
ciwgaW5zdF9rdi5zZWNvbmQpOworICAgIH0KKyAgfQorICB0cmFjaW5nX3Nlc3Npb24tPnN0YXRl
ID0gVHJhY2luZ1Nlc3Npb246OkRJU0FCTEVEOworCisgIC8vIFNjcmFwZSBhbnkgcmVtYWluaW5n
IGNodW5rcyB0aGF0IHdlcmVuJ3QgZmx1c2hlZCBieSB0aGUgcHJvZHVjZXJzLgorICBmb3IgKGF1
dG8mIHByb2R1Y2VyX2lkX2FuZF9wcm9kdWNlciA6IHByb2R1Y2Vyc18pCisgICAgU2NyYXBlU2hh
cmVkTWVtb3J5QnVmZmVycyh0cmFjaW5nX3Nlc3Npb24sIHByb2R1Y2VyX2lkX2FuZF9wcm9kdWNl
ci5zZWNvbmQpOworCisgIGlmICh0cmFjaW5nX3Nlc3Npb24tPndyaXRlX2ludG9fZmlsZSkgewor
ICAgIHRyYWNpbmdfc2Vzc2lvbi0+d3JpdGVfcGVyaW9kX21zID0gMDsKKyAgICBSZWFkQnVmZmVy
cyh0cmFjaW5nX3Nlc3Npb24tPmlkLCBudWxscHRyKTsKKyAgfQorCisgIGlmICh0cmFjaW5nX3Nl
c3Npb24tPmNvbnN1bWVyX21heWJlX251bGwpCisgICAgdHJhY2luZ19zZXNzaW9uLT5jb25zdW1l
cl9tYXliZV9udWxsLT5Ob3RpZnlPblRyYWNpbmdEaXNhYmxlZCgpOworfQorCit2b2lkIFRyYWNp
bmdTZXJ2aWNlSW1wbDo6Rmx1c2goVHJhY2luZ1Nlc3Npb25JRCB0c2lkLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRpbWVvdXRfbXMsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQ29uc3VtZXJFbmRwb2ludDo6Rmx1c2hDYWxsYmFjayBjYWxsYmFjaykg
eworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFRyYWNpbmdT
ZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24gPSBHZXRUcmFjaW5nU2Vzc2lvbih0c2lkKTsKKyAgaWYg
KCF0cmFjaW5nX3Nlc3Npb24pIHsKKyAgICBQRVJGRVRUT19ETE9HKCJGbHVzaCgpIGZhaWxlZCwg
aW52YWxpZCBzZXNzaW9uIElEICUiIFBSSXU2NCwgdHNpZCk7CisgICAgcmV0dXJuOworICB9CisK
KyAgaWYgKCF0aW1lb3V0X21zKQorICAgIHRpbWVvdXRfbXMgPSB0cmFjaW5nX3Nlc3Npb24tPmZs
dXNoX3RpbWVvdXRfbXMoKTsKKworICBpZiAodHJhY2luZ19zZXNzaW9uLT5wZW5kaW5nX2ZsdXNo
ZXMuc2l6ZSgpID4gMTAwMCkgeworICAgIFBFUkZFVFRPX0VMT0coIlRvbyBtYW55IGZsdXNoZXMg
KCV6dSkgcGVuZGluZyBmb3IgdGhlIHRyYWNpbmcgc2Vzc2lvbiIsCisgICAgICAgICAgICAgICAg
ICB0cmFjaW5nX3Nlc3Npb24tPnBlbmRpbmdfZmx1c2hlcy5zaXplKCkpOworICAgIGNhbGxiYWNr
KGZhbHNlKTsKKyAgICByZXR1cm47CisgIH0KKworICBGbHVzaFJlcXVlc3RJRCBmbHVzaF9yZXF1
ZXN0X2lkID0gKytsYXN0X2ZsdXNoX3JlcXVlc3RfaWRfOworICBQZW5kaW5nRmx1c2gmIHBlbmRp
bmdfZmx1c2ggPQorICAgICAgdHJhY2luZ19zZXNzaW9uLT5wZW5kaW5nX2ZsdXNoZXMKKyAgICAg
ICAgICAuZW1wbGFjZV9oaW50KHRyYWNpbmdfc2Vzc2lvbi0+cGVuZGluZ19mbHVzaGVzLmVuZCgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfcmVxdWVzdF9pZCwgUGVuZGluZ0ZsdXNo
KHN0ZDo6bW92ZShjYWxsYmFjaykpKQorICAgICAgICAgIC0+c2Vjb25kOworCisgIC8vIFNlbmQg
YSBmbHVzaCByZXF1ZXN0IHRvIGVhY2ggcHJvZHVjZXIgaW52b2x2ZWQgaW4gdGhlIHRyYWNpbmcg
c2Vzc2lvbi4gSW4KKyAgLy8gb3JkZXIgdG8gaXNzdWUgYSBmbHVzaCByZXF1ZXN0IHdlIGhhdmUg
dG8gYnVpbGQgYSBtYXAgb2YgYWxsIGRhdGEgc291cmNlCisgIC8vIGluc3RhbmNlIGlkcyBlbmFi
bGVkIGZvciBlYWNoIHByb2R1Y2VyLgorICBzdGQ6Om1hcDxQcm9kdWNlcklELCBzdGQ6OnZlY3Rv
cjxEYXRhU291cmNlSW5zdGFuY2VJRD4+IGZsdXNoX21hcDsKKyAgZm9yIChjb25zdCBhdXRvJiBk
YXRhX3NvdXJjZV9pbnN0IDogdHJhY2luZ19zZXNzaW9uLT5kYXRhX3NvdXJjZV9pbnN0YW5jZXMp
IHsKKyAgICBjb25zdCBQcm9kdWNlcklEIHByb2R1Y2VyX2lkID0gZGF0YV9zb3VyY2VfaW5zdC5m
aXJzdDsKKyAgICBjb25zdCBEYXRhU291cmNlSW5zdGFuY2VJRCBkc19pbnN0X2lkID0gZGF0YV9z
b3VyY2VfaW5zdC5zZWNvbmQuaW5zdGFuY2VfaWQ7CisgICAgZmx1c2hfbWFwW3Byb2R1Y2VyX2lk
XS5wdXNoX2JhY2soZHNfaW5zdF9pZCk7CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIGt2IDog
Zmx1c2hfbWFwKSB7CisgICAgUHJvZHVjZXJJRCBwcm9kdWNlcl9pZCA9IGt2LmZpcnN0OworICAg
IFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyKHByb2R1Y2VyX2lk
KTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxEYXRhU291cmNlSW5zdGFuY2VJRD4mIGRhdGFfc291
cmNlcyA9IGt2LnNlY29uZDsKKyAgICBwcm9kdWNlci0+Rmx1c2goZmx1c2hfcmVxdWVzdF9pZCwg
ZGF0YV9zb3VyY2VzKTsKKyAgICBwZW5kaW5nX2ZsdXNoLnByb2R1Y2Vycy5pbnNlcnQocHJvZHVj
ZXJfaWQpOworICB9CisKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIHByb2R1Y2VycyB0byBmbHVzaCAo
cmVhbGlzdGljYWxseSB0aGlzIGhhcHBlbnMgb25seSBpbgorICAvLyBzb21lIHRlc3RzKSBmaXJl
IE9uRmx1c2hUaW1lb3V0KCkgc3RyYWlnaHQgYXdheSwgd2l0aG91dCB3YWl0aW5nLgorICBpZiAo
Zmx1c2hfbWFwLmVtcHR5KCkpCisgICAgdGltZW91dF9tcyA9IDA7CisKKyAgYXV0byB3ZWFrX3Ro
aXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIHRhc2tfcnVubmVyXy0+UG9z
dERlbGF5ZWRUYXNrKAorICAgICAgW3dlYWtfdGhpcywgdHNpZCwgZmx1c2hfcmVxdWVzdF9pZF0g
eworICAgICAgICBpZiAod2Vha190aGlzKQorICAgICAgICAgIHdlYWtfdGhpcy0+T25GbHVzaFRp
bWVvdXQodHNpZCwgZmx1c2hfcmVxdWVzdF9pZCk7CisgICAgICB9LAorICAgICAgdGltZW91dF9t
cyk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpOb3RpZnlGbHVzaERvbmVGb3JQcm9k
dWNlcigKKyAgICBQcm9kdWNlcklEIHByb2R1Y2VyX2lkLAorICAgIEZsdXNoUmVxdWVzdElEIGZs
dXNoX3JlcXVlc3RfaWQpIHsKKyAgZm9yIChhdXRvJiBrdiA6IHRyYWNpbmdfc2Vzc2lvbnNfKSB7
CisgICAgLy8gUmVtb3ZlIGFsbCBwZW5kaW5nIGZsdXNoZXMgPD0gfGZsdXNoX3JlcXVlc3RfaWR8
IGZvciB8cHJvZHVjZXJfaWR8LgorICAgIGF1dG8mIHBlbmRpbmdfZmx1c2hlcyA9IGt2LnNlY29u
ZC5wZW5kaW5nX2ZsdXNoZXM7CisgICAgYXV0byBlbmRfaXQgPSBwZW5kaW5nX2ZsdXNoZXMudXBw
ZXJfYm91bmQoZmx1c2hfcmVxdWVzdF9pZCk7CisgICAgZm9yIChhdXRvIGl0ID0gcGVuZGluZ19m
bHVzaGVzLmJlZ2luKCk7IGl0ICE9IGVuZF9pdDspIHsKKyAgICAgIFBlbmRpbmdGbHVzaCYgcGVu
ZGluZ19mbHVzaCA9IGl0LT5zZWNvbmQ7CisgICAgICBwZW5kaW5nX2ZsdXNoLnByb2R1Y2Vycy5l
cmFzZShwcm9kdWNlcl9pZCk7CisgICAgICBpZiAocGVuZGluZ19mbHVzaC5wcm9kdWNlcnMuZW1w
dHkoKSkgeworICAgICAgICBhdXRvIHdlYWtfdGhpcyA9IHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdl
YWtQdHIoKTsKKyAgICAgICAgVHJhY2luZ1Nlc3Npb25JRCB0c2lkID0ga3YuZmlyc3Q7CisgICAg
ICAgIGF1dG8gY2FsbGJhY2sgPSBzdGQ6Om1vdmUocGVuZGluZ19mbHVzaC5jYWxsYmFjayk7Cisg
ICAgICAgIHRhc2tfcnVubmVyXy0+UG9zdFRhc2soW3dlYWtfdGhpcywgdHNpZCwgY2FsbGJhY2td
KCkgeworICAgICAgICAgIGlmICh3ZWFrX3RoaXMpIHsKKyAgICAgICAgICAgIHdlYWtfdGhpcy0+
Q29tcGxldGVGbHVzaCh0c2lkLCBzdGQ6Om1vdmUoY2FsbGJhY2spLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8qc3VjY2Vzcz0qL3RydWUpOworICAgICAgICAgIH0KKyAg
ICAgICAgfSk7CisgICAgICAgIGl0ID0gcGVuZGluZ19mbHVzaGVzLmVyYXNlKGl0KTsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIGl0Kys7CisgICAgICB9CisgICAgfSAgLy8gZm9yIChwZW5kaW5n
X2ZsdXNoZXMpCisgIH0gICAgLy8gZm9yICh0cmFjaW5nX3Nlc3Npb24pCit9CisKK3ZvaWQgVHJh
Y2luZ1NlcnZpY2VJbXBsOjpPbkZsdXNoVGltZW91dChUcmFjaW5nU2Vzc2lvbklEIHRzaWQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2hSZXF1ZXN0SUQgZmx1
c2hfcmVxdWVzdF9pZCkgeworICBUcmFjaW5nU2Vzc2lvbiogdHJhY2luZ19zZXNzaW9uID0gR2V0
VHJhY2luZ1Nlc3Npb24odHNpZCk7CisgIGlmICghdHJhY2luZ19zZXNzaW9uKQorICAgIHJldHVy
bjsKKyAgYXV0byBpdCA9IHRyYWNpbmdfc2Vzc2lvbi0+cGVuZGluZ19mbHVzaGVzLmZpbmQoZmx1
c2hfcmVxdWVzdF9pZCk7CisgIGlmIChpdCA9PSB0cmFjaW5nX3Nlc3Npb24tPnBlbmRpbmdfZmx1
c2hlcy5lbmQoKSkKKyAgICByZXR1cm47ICAvLyBOb21pbmFsIGNhc2U6IGZsdXNoIHdhcyBjb21w
bGV0ZWQgYW5kIGFja2VkIG9uIHRpbWUuCisKKyAgLy8gSWYgdGhlcmUgd2VyZSBubyBwcm9kdWNl
cnMgdG8gZmx1c2gsIGNvbnNpZGVyIGl0IGEgc3VjY2Vzcy4KKyAgYm9vbCBzdWNjZXNzID0gaXQt
PnNlY29uZC5wcm9kdWNlcnMuZW1wdHkoKTsKKworICBhdXRvIGNhbGxiYWNrID0gc3RkOjptb3Zl
KGl0LT5zZWNvbmQuY2FsbGJhY2spOworICB0cmFjaW5nX3Nlc3Npb24tPnBlbmRpbmdfZmx1c2hl
cy5lcmFzZShpdCk7CisgIENvbXBsZXRlRmx1c2godHNpZCwgc3RkOjptb3ZlKGNhbGxiYWNrKSwg
c3VjY2Vzcyk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpDb21wbGV0ZUZsdXNoKFRy
YWNpbmdTZXNzaW9uSUQgdHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIENvbnN1bWVyRW5kcG9pbnQ6OkZsdXNoQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgVHJhY2luZ1Nl
c3Npb24qIHRyYWNpbmdfc2Vzc2lvbiA9IEdldFRyYWNpbmdTZXNzaW9uKHRzaWQpOworICBpZiAo
dHJhY2luZ19zZXNzaW9uKSB7CisgICAgLy8gUHJvZHVjZXJzIG1heSBub3QgaGF2ZSBiZWVuIGFi
bGUgdG8gZmx1c2ggYWxsIHRoZWlyIGRhdGEsIGV2ZW4gaWYgdGhleQorICAgIC8vIGluZGljYXRl
ZCBmbHVzaCBjb21wbGV0aW9uLiBJZiBwb3NzaWJsZSwgYWxzbyBjb2xsZWN0IHVuY29tbWl0dGVk
IGNodW5rcworICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGV2ZXJ5dGhpbmcgdGhleSB3cm90
ZSBzbyBmYXIuCisgICAgZm9yIChhdXRvJiBwcm9kdWNlcl9pZF9hbmRfcHJvZHVjZXIgOiBwcm9k
dWNlcnNfKSB7CisgICAgICBTY3JhcGVTaGFyZWRNZW1vcnlCdWZmZXJzKHRyYWNpbmdfc2Vzc2lv
biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJfaWRfYW5kX3Byb2R1
Y2VyLnNlY29uZCk7CisgICAgfQorICB9CisgIGNhbGxiYWNrKHN1Y2Nlc3MpOworfQorCit2b2lk
IFRyYWNpbmdTZXJ2aWNlSW1wbDo6U2NyYXBlU2hhcmVkTWVtb3J5QnVmZmVycygKKyAgICBUcmFj
aW5nU2Vzc2lvbiogdHJhY2luZ19zZXNzaW9uLAorICAgIFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBw
cm9kdWNlcikgeworICBpZiAoIXByb2R1Y2VyLT5zbWJfc2NyYXBpbmdfZW5hYmxlZF8pCisgICAg
cmV0dXJuOworCisgIC8vIENhbid0IGNvcHkgY2h1bmtzIGlmIHdlIGRvbid0IGtub3cgYWJvdXQg
YW55IHRyYWNlIHdyaXRlcnMuCisgIGlmIChwcm9kdWNlci0+d3JpdGVyc18uZW1wdHkoKSkKKyAg
ICByZXR1cm47CisKKyAgLy8gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiBPbiBmbHVzaCBvciBz
ZXNzaW9uIGRpc2Nvbm5lY3QsIHRoaXMgbWV0aG9kIGlzCisgIC8vIGNhbGxlZCBmb3IgZWFjaCBw
cm9kdWNlci4gSWYgdGhlIHByb2R1Y2VyIGRvZXNuJ3QgcGFydGljaXBhdGUgaW4gdGhlCisgIC8v
IHNlc3Npb24sIHRoZXJlJ3Mgbm8gbmVlZCB0byBzY2FwZSBpdHMgY2h1bmtzIHJpZ2h0IG5vdy4g
V2UgY2FuIHRlbGwgaWYgYQorICAvLyBwcm9kdWNlciBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHNlc3Np
b24gYnkgY2hlY2tpbmcgaWYgdGhlIHByb2R1Y2VyIGlzIGFsbG93ZWQKKyAgLy8gdG8gd3JpdGUg
aW50byB0aGUgc2Vzc2lvbidzIGxvZyBidWZmZXJzLgorICBjb25zdCBhdXRvJiBzZXNzaW9uX2J1
ZmZlcnMgPSB0cmFjaW5nX3Nlc3Npb24tPmJ1ZmZlcnNfaW5kZXg7CisgIGJvb2wgcHJvZHVjZXJf
aW5fc2Vzc2lvbiA9CisgICAgICBzdGQ6OmFueV9vZihzZXNzaW9uX2J1ZmZlcnMuYmVnaW4oKSwg
c2Vzc2lvbl9idWZmZXJzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgW3Byb2R1Y2VyXShCdWZm
ZXJJRCBidWZmZXJfaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2R1Y2VyLT5h
bGxvd2VkX3RhcmdldF9idWZmZXJzXy5jb3VudChidWZmZXJfaWQpOworICAgICAgICAgICAgICAg
ICAgfSk7CisgIGlmICghcHJvZHVjZXJfaW5fc2Vzc2lvbikKKyAgICByZXR1cm47CisKKyAgUEVS
RkVUVE9fRExPRygiU2NyYXBpbmcgU01CIGZvciBwcm9kdWNlciAlIiBQUkl1MTYsIHByb2R1Y2Vy
LT5pZF8pOworCisgIC8vIEZpbmQgYW5kIGNvcHkgYW55IHVuY29tbWl0dGVkIGNodW5rcyBmcm9t
IHRoZSBTTUIuCisgIC8vCisgIC8vIEluIG5vbWluYWwgY29uZGl0aW9ucywgdGhlIHBhZ2UgbGF5
b3V0IG9mIHRoZSB1c2VkIFNNQiBwYWdlcyBzaG91bGQgbmV2ZXIKKyAgLy8gY2hhbmdlIGJlY2F1
c2UgdGhlIHNlcnZpY2UgaXMgdGhlIG9ubHkgb25lIHdobyBpcyBzdXBwb3NlZCB0byBtb2RpZnkg
dXNlZAorICAvLyBwYWdlcyAodG8gbWFrZSB0aGVtIGZyZWUgYWdhaW4pLgorICAvLworICAvLyBI
b3dldmVyLCB0aGUgY29kZSBoZXJlIG5lZWRzIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSBvZiBhIG1h
bGljaW91cyBwcm9kdWNlcgorICAvLyBhbHRlcmluZyB0aGUgU01CIGluIHVucHJlZGljdGFibGUg
d2F5cy4gVGhhbmtmdWxseSB0aGUgU01CIHNpemUgaXMKKyAgLy8gaW1tdXRhYmxlLCBzbyBhIGNo
dW5rIHdpbGwgYWx3YXlzIHBvaW50IHRvIHNvbWUgdmFsaWQgbWVtb3J5LCBldmVuIGlmIHRoZQor
ICAvLyBwcm9kdWNlciBhbHRlcnMgdGhlIGludGVuZGVkIGxheW91dCBhbmQgY2h1bmsgaGVhZGVy
IGNvbmN1cnJlbnRseS4KKyAgLy8gVWx0aW1hdGVseSBhIG1hbGljaW91cyBwcm9kdWNlciBhbHRl
cmluZyB0aGUgU01CJ3MgY2h1bmsgbGF5b3V0IHdoaWxlIHdlCisgIC8vIGFyZSBpdGVyYXRpbmcg
aW4gdGhpcyBmdW5jdGlvbiBpcyBub3QgYW55IGRpZmZlcmVudCBmcm9tIHRoZSBjYXNlIG9mIGEK
KyAgLy8gbWFsaWNpb3VzIHByb2R1Y2VyIGFza2luZyB0byBjb21taXQgYSBjaHVuayBtYWRlIG9m
IHJhbmRvbSBkYXRhLCB3aGljaCBpcworICAvLyBzb21ldGhpbmcgdGhpcyBjbGFzcyBoYXMgdG8g
ZGVhbCB3aXRoIHJlZ2FyZGxlc3MuCisgIC8vCisgIC8vIFRoZSBvbmx5IGxlZ2l0aW1hdGUgbXV0
YXRpb25zIHRoYXQgY2FuIGhhcHBlbiBmcm9tIHNhbmUgcHJvZHVjZXJzLAorICAvLyBjb25jdXJy
ZW50bHkgdG8gdGhpcyBmdW5jdGlvbiwgYXJlOgorICAvLyAgIEEuIGZyZWUgcGFnZXMgYmVpbmcg
cGFydGl0aW9uZWQsCisgIC8vICAgQi4gZnJlZSBjaHVua3MgYmVpbmcgbWlncmF0ZWQgdG8ga0No
dW5rQmVpbmdXcml0dGVuLAorICAvLyAgIEMuIGtDaHVua0JlaW5nV3JpdHRlbiBjaHVua3MgYmVp
bmcgbWlncmF0ZWQgdG8ga0NodW5rQ29tcGxldGVkLgorCisgIFNoYXJlZE1lbW9yeUFCSSogYWJp
ID0gJnByb2R1Y2VyLT5zaG1lbV9hYmlfOworICAvLyBudW1fcGFnZXMoKSBpcyBpbW11dGFibGUg
YWZ0ZXIgdGhlIFNNQiBpcyBpbml0aWFsaXplZCBhbmQgY2Fubm90IGJlIGNoYW5nZWQKKyAgLy8g
ZXZlbiBieSBhIHByb2R1Y2VyIGV2ZW4gaWYgbWFsaWNpb3VzLgorICBmb3IgKHNpemVfdCBwYWdl
X2lkeCA9IDA7IHBhZ2VfaWR4IDwgYWJpLT5udW1fcGFnZXMoKTsgcGFnZV9pZHgrKykgeworICAg
IHVpbnQzMl90IGxheW91dCA9IGFiaS0+R2V0UGFnZUxheW91dChwYWdlX2lkeCk7CisKKyAgICB1
aW50MzJfdCB1c2VkX2NodW5rcyA9IGFiaS0+R2V0VXNlZENodW5rcyhsYXlvdXQpOyAgLy8gUmV0
dXJucyBhIGJpdG1hcC4KKyAgICAvLyBTa2lwIGVtcHR5IHBhZ2VzLgorICAgIGlmICh1c2VkX2No
dW5rcyA9PSAwKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBTY3JhcGUgdGhlIGNodW5rcyB0
aGF0IGFyZSBjdXJyZW50bHkgdXNlZC4gVGhlc2Ugc2hvdWxkIGJlIGVpdGhlciBpbgorICAgIC8v
IHN0YXRlIGtDaHVua0JlaW5nV3JpdHRlbiBvciBrQ2h1bmtDb21wbGV0ZS4KKyAgICBmb3IgKHVp
bnQzMl90IGNodW5rX2lkeCA9IDA7IHVzZWRfY2h1bmtzOyBjaHVua19pZHgrKywgdXNlZF9jaHVu
a3MgPj49IDEpIHsKKyAgICAgIGlmICghKHVzZWRfY2h1bmtzICYgMSkpCisgICAgICAgIGNvbnRp
bnVlOworCisgICAgICBTaGFyZWRNZW1vcnlBQkk6OkNodW5rU3RhdGUgc3RhdGUgPQorICAgICAg
ICAgIFNoYXJlZE1lbW9yeUFCSTo6R2V0Q2h1bmtTdGF0ZUZyb21MYXlvdXQobGF5b3V0LCBjaHVu
a19pZHgpOworICAgICAgUEVSRkVUVE9fRENIRUNLKHN0YXRlID09IFNoYXJlZE1lbW9yeUFCSTo6
a0NodW5rQmVpbmdXcml0dGVuIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gU2hh
cmVkTWVtb3J5QUJJOjprQ2h1bmtDb21wbGV0ZSk7CisgICAgICBib29sIGNodW5rX2NvbXBsZXRl
ID0gc3RhdGUgPT0gU2hhcmVkTWVtb3J5QUJJOjprQ2h1bmtDb21wbGV0ZTsKKworICAgICAgU2hh
cmVkTWVtb3J5QUJJOjpDaHVuayBjaHVuayA9CisgICAgICAgICAgYWJpLT5HZXRDaHVua1VuY2hl
Y2tlZChwYWdlX2lkeCwgbGF5b3V0LCBjaHVua19pZHgpOworCisgICAgICB1aW50MTZfdCBwYWNr
ZXRfY291bnQ7CisgICAgICB1aW50OF90IGZsYWdzOworICAgICAgLy8gR2V0UGFja2V0Q291bnRB
bmRGbGFncyBoYXMgYWNxdWlyZV9sb2FkIHNlbWFudGljcy4KKyAgICAgIHN0ZDo6dGllKHBhY2tl
dF9jb3VudCwgZmxhZ3MpID0gY2h1bmsuR2V0UGFja2V0Q291bnRBbmRGbGFncygpOworCisgICAg
ICAvLyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGNvcHkgYW4gaW5jb21wbGV0ZSBjaHVuayBpZiB0
aGVyZSdzIGF0IGxlYXN0CisgICAgICAvLyBvbmUgZnVsbCBwYWNrZXQgYXZhaWxhYmxlLiAoVGhl
IHByb2R1Y2VyIG1heSBub3QgaGF2ZSBjb21wbGV0ZWQgdGhlCisgICAgICAvLyBsYXN0IHBhY2tl
dCBpbiBpdCB5ZXQsIHNvIHdlIG5lZWQgYXQgbGVhc3QgMi4pCisgICAgICBpZiAoIWNodW5rX2Nv
bXBsZXRlICYmIHBhY2tldF9jb3VudCA8IDIpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAv
LyBBdCB0aGlzIHBvaW50LCBpdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUgcmVtYWluaW5nIGhlYWRl
ciBmaWVsZHMgb2YKKyAgICAgIC8vIHRoZSBjaHVuay4gRXZlbiBpZiB0aGUgY2h1bmsgd2FzIG9u
bHkganVzdCB0cmFuc2ZlcnJlZCBmcm9tCisgICAgICAvLyBrQ2h1bmtGcmVlIGludG8ga0NodW5r
QmVpbmdXcml0dGVuIHN0YXRlLCB0aGUgaGVhZGVyIHNob3VsZCBiZQorICAgICAgLy8gd3JpdHRl
biBjb21wbGV0ZWx5IG9uY2UgdGhlIHBhY2tldCBjb3VudCBpbmNyZWFzZWQgYWJvdmUgMSAoaXQg
d2FzCisgICAgICAvLyByZXNldCB0byAwIGJ5IHRoZSBzZXJ2aWNlIHdoZW4gdGhlIGNodW5rIHdh
cyBmcmVlZCkuCisKKyAgICAgIFdyaXRlcklEIHdyaXRlcl9pZCA9IGNodW5rLndyaXRlcl9pZCgp
OworICAgICAgYmFzZTo6T3B0aW9uYWw8QnVmZmVySUQ+IHRhcmdldF9idWZmZXJfaWQgPQorICAg
ICAgICAgIHByb2R1Y2VyLT5idWZmZXJfaWRfZm9yX3dyaXRlcih3cml0ZXJfaWQpOworCisgICAg
ICAvLyBXZSBjYW4gb25seSBzY3JhcGUgdGhpcyBjaHVuayBpZiB3ZSBrbm93IHdoaWNoIGxvZyBi
dWZmZXIgdG8gY29weSBpdAorICAgICAgLy8gaW50by4KKyAgICAgIGlmICghdGFyZ2V0X2J1ZmZl
cl9pZCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFNraXAgY2h1bmtzIHRoYXQgZG9u
J3QgYmVsb25nIHRvIHRoZSByZXF1ZXN0ZWQgdHJhY2luZyBzZXNzaW9uLgorICAgICAgYm9vbCB0
YXJnZXRfYnVmZmVyX2JlbG9uZ3NfdG9fc2Vzc2lvbiA9CisgICAgICAgICAgc3RkOjpmaW5kKHNl
c3Npb25fYnVmZmVycy5iZWdpbigpLCBzZXNzaW9uX2J1ZmZlcnMuZW5kKCksCisgICAgICAgICAg
ICAgICAgICAgICp0YXJnZXRfYnVmZmVyX2lkKSAhPSBzZXNzaW9uX2J1ZmZlcnMuZW5kKCk7Cisg
ICAgICBpZiAoIXRhcmdldF9idWZmZXJfYmVsb25nc190b19zZXNzaW9uKQorICAgICAgICBjb250
aW51ZTsKKworICAgICAgdWludDMyX3QgY2h1bmtfaWQgPQorICAgICAgICAgIGNodW5rLmhlYWRl
cigpLT5jaHVua19pZC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworCisgICAgICBD
b3B5UHJvZHVjZXJQYWdlSW50b0xvZ0J1ZmZlcigKKyAgICAgICAgICBwcm9kdWNlci0+aWRfLCBw
cm9kdWNlci0+dWlkXywgd3JpdGVyX2lkLCBjaHVua19pZCwgKnRhcmdldF9idWZmZXJfaWQsCisg
ICAgICAgICAgcGFja2V0X2NvdW50LCBmbGFncywgY2h1bmtfY29tcGxldGUsIGNodW5rLnBheWxv
YWRfYmVnaW4oKSwKKyAgICAgICAgICBjaHVuay5wYXlsb2FkX3NpemUoKSk7CisgICAgfQorICB9
Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpGbHVzaEFuZERpc2FibGVUcmFjaW5nKFRy
YWNpbmdTZXNzaW9uSUQgdHNpZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9j
aGVja2VyXyk7CisgIFBFUkZFVFRPX0RMT0coIlRyaWdnZXJpbmcgZmluYWwgZmx1c2ggZm9yICUi
IFBSSXU2NCwgdHNpZCk7CisgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0
V2Vha1B0cigpOworICBGbHVzaCh0c2lkLCAwLCBbd2Vha190aGlzLCB0c2lkXShib29sIHN1Y2Nl
c3MpIHsKKyAgICBQRVJGRVRUT19ETE9HKCJGbHVzaCBkb25lIChzdWNjZXNzOiAlZCksIGRpc2Fi
bGluZyB0cmFjZSBzZXNzaW9uICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgIHN1Y2Nlc3Ms
IHRzaWQpOworICAgIGlmICghd2Vha190aGlzKQorICAgICAgcmV0dXJuOworICAgIFRyYWNpbmdT
ZXNzaW9uKiBzZXNzaW9uID0gd2Vha190aGlzLT5HZXRUcmFjaW5nU2Vzc2lvbih0c2lkKTsKKyAg
ICBpZiAoc2Vzc2lvbi0+Y29uc3VtZXJfbWF5YmVfbnVsbCkgeworICAgICAgLy8gSWYgdGhlIGNv
bnN1bWVyIGlzIHN0aWxsIGF0dGFjaGVkLCBqdXN0IGRpc2FibGUgdGhlIHNlc3Npb24gYnV0IGdp
dmUgaXQKKyAgICAgIC8vIGEgY2hhbmNlIHRvIHJlYWQgdGhlIGNvbnRlbnRzLgorICAgICAgd2Vh
a190aGlzLT5EaXNhYmxlVHJhY2luZyh0c2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYg
dGhlIGNvbnN1bWVyIGRldGFjaGVkLCBkZXN0cm95IHRoZSBzZXNzaW9uLiBJZiB0aGUgY29uc3Vt
ZXIgZGlkCisgICAgICAvLyBzdGFydCB0aGUgc2Vzc2lvbiBpbiBsb25nLXRyYWNpbmcgbW9kZSwg
dGhlIHNlcnZpY2Ugd2lsbCBoYXZlIHNhdmVkCisgICAgICAvLyB0aGUgY29udGVudHMgdG8gdGhl
IHBhc3NlZCBmaWxlLiBJZiBub3QsIHRoZSBjb250ZW50cyB3aWxsIGJlCisgICAgICAvLyBkZXN0
cm95ZWQuCisgICAgICB3ZWFrX3RoaXMtPkZyZWVCdWZmZXJzKHRzaWQpOworICAgIH0KKyAgfSk7
Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpQZXJpb2RpY0ZsdXNoVGFzayhUcmFjaW5n
U2Vzc2lvbklEIHRzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYm9vbCBwb3N0X25leHRfb25seSkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVh
ZF9jaGVja2VyXyk7CisgIFRyYWNpbmdTZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24gPSBHZXRUcmFj
aW5nU2Vzc2lvbih0c2lkKTsKKyAgaWYgKCF0cmFjaW5nX3Nlc3Npb24gfHwgdHJhY2luZ19zZXNz
aW9uLT5zdGF0ZSAhPSBUcmFjaW5nU2Vzc2lvbjo6U1RBUlRFRCkKKyAgICByZXR1cm47CisKKyAg
dWludDMyX3QgZmx1c2hfcGVyaW9kX21zID0gdHJhY2luZ19zZXNzaW9uLT5jb25maWcuZmx1c2hf
cGVyaW9kX21zKCk7CisgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vh
a1B0cigpOworICB0YXNrX3J1bm5lcl8tPlBvc3REZWxheWVkVGFzaygKKyAgICAgIFt3ZWFrX3Ro
aXMsIHRzaWRdIHsKKyAgICAgICAgaWYgKHdlYWtfdGhpcykKKyAgICAgICAgICB3ZWFrX3RoaXMt
PlBlcmlvZGljRmx1c2hUYXNrKHRzaWQsIC8qcG9zdF9uZXh0X29ubHk9Ki9mYWxzZSk7CisgICAg
ICB9LAorICAgICAgZmx1c2hfcGVyaW9kX21zIC0gKGJhc2U6OkdldFdhbGxUaW1lTXMoKS5jb3Vu
dCgpICUgZmx1c2hfcGVyaW9kX21zKSk7CisKKyAgaWYgKHBvc3RfbmV4dF9vbmx5KQorICAgIHJl
dHVybjsKKworICBQRVJGRVRUT19ETE9HKCJUcmlnZ2VyaW5nIHBlcmlvZGljIGZsdXNoIGZvciB0
cmFjZSBzZXNzaW9uICUiIFBSSXU2NCwgdHNpZCk7CisgIEZsdXNoKHRzaWQsIDAsIFtdKGJvb2wg
c3VjY2VzcykgeworICAgIGlmICghc3VjY2VzcykKKyAgICAgIFBFUkZFVFRPX0VMT0coIlBlcmlv
ZGljIGZsdXNoIHRpbWVkIG91dCIpOworICB9KTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUlt
cGw6OlBlcmlvZGljQ2xlYXJJbmNyZW1lbnRhbFN0YXRlVGFzaygKKyAgICBUcmFjaW5nU2Vzc2lv
bklEIHRzaWQsCisgICAgYm9vbCBwb3N0X25leHRfb25seSkgeworICBQRVJGRVRUT19EQ0hFQ0tf
VEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFRyYWNpbmdTZXNzaW9uKiB0cmFjaW5nX3Nlc3Np
b24gPSBHZXRUcmFjaW5nU2Vzc2lvbih0c2lkKTsKKyAgaWYgKCF0cmFjaW5nX3Nlc3Npb24gfHwg
dHJhY2luZ19zZXNzaW9uLT5zdGF0ZSAhPSBUcmFjaW5nU2Vzc2lvbjo6U1RBUlRFRCkKKyAgICBy
ZXR1cm47CisKKyAgdWludDMyX3QgY2xlYXJfcGVyaW9kX21zID0KKyAgICAgIHRyYWNpbmdfc2Vz
c2lvbi0+Y29uZmlnLmluY3JlbWVudGFsX3N0YXRlX2NvbmZpZygpLmNsZWFyX3BlcmlvZF9tcygp
OworICBhdXRvIHdlYWtfdGhpcyA9IHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKKyAg
dGFza19ydW5uZXJfLT5Qb3N0RGVsYXllZFRhc2soCisgICAgICBbd2Vha190aGlzLCB0c2lkXSB7
CisgICAgICAgIGlmICh3ZWFrX3RoaXMpCisgICAgICAgICAgd2Vha190aGlzLT5QZXJpb2RpY0Ns
ZWFySW5jcmVtZW50YWxTdGF0ZVRhc2soCisgICAgICAgICAgICAgIHRzaWQsIC8qcG9zdF9uZXh0
X29ubHk9Ki9mYWxzZSk7CisgICAgICB9LAorICAgICAgY2xlYXJfcGVyaW9kX21zIC0gKGJhc2U6
OkdldFdhbGxUaW1lTXMoKS5jb3VudCgpICUgY2xlYXJfcGVyaW9kX21zKSk7CisKKyAgaWYgKHBv
c3RfbmV4dF9vbmx5KQorICAgIHJldHVybjsKKworICBQRVJGRVRUT19ETE9HKAorICAgICAgIlBl
cmZvcm1pbmcgcGVyaW9kaWMgaW5jcmVtZW50YWwgc3RhdGUgY2xlYXIgZm9yIHRyYWNlIHNlc3Np
b24gJSIgUFJJdTY0LAorICAgICAgdHNpZCk7CisKKyAgLy8gUXVldWUgdGhlIElQQ3MgdG8gcHJv
ZHVjZXJzIHdpdGggYWN0aXZlIGRhdGEgc291cmNlcyB0aGF0IG9wdGVkIGluLgorICBzdGQ6Om1h
cDxQcm9kdWNlcklELCBzdGQ6OnZlY3RvcjxEYXRhU291cmNlSW5zdGFuY2VJRD4+IGNsZWFyX21h
cDsKKyAgZm9yIChjb25zdCBhdXRvJiBrdiA6IHRyYWNpbmdfc2Vzc2lvbi0+ZGF0YV9zb3VyY2Vf
aW5zdGFuY2VzKSB7CisgICAgUHJvZHVjZXJJRCBwcm9kdWNlcl9pZCA9IGt2LmZpcnN0OworICAg
IGNvbnN0IERhdGFTb3VyY2VJbnN0YW5jZSYgZGF0YV9zb3VyY2UgPSBrdi5zZWNvbmQ7CisgICAg
aWYgKGRhdGFfc291cmNlLmhhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXIpCisgICAgICBj
bGVhcl9tYXBbcHJvZHVjZXJfaWRdLnB1c2hfYmFjayhkYXRhX3NvdXJjZS5pbnN0YW5jZV9pZCk7
CisgIH0KKworICBmb3IgKGNvbnN0IGF1dG8mIGt2IDogY2xlYXJfbWFwKSB7CisgICAgUHJvZHVj
ZXJJRCBwcm9kdWNlcl9pZCA9IGt2LmZpcnN0OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPERhdGFT
b3VyY2VJbnN0YW5jZUlEPiYgZGF0YV9zb3VyY2VzID0ga3Yuc2Vjb25kOworICAgIFByb2R1Y2Vy
RW5kcG9pbnRJbXBsKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyKHByb2R1Y2VyX2lkKTsKKyAgICBp
ZiAoIXByb2R1Y2VyKSB7CisgICAgICBQRVJGRVRUT19ERkFUQUwoIlByb2R1Y2VyIGRvZXMgbm90
IGV4aXN0LiIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHByb2R1Y2VyLT5DbGVhcklu
Y3JlbWVudGFsU3RhdGUoZGF0YV9zb3VyY2VzKTsKKyAgfQorfQorCisvLyBOb3RlOiB3aGVuIHRo
aXMgaXMgY2FsbGVkIHRvIHdyaXRlIGludG8gYSBmaWxlIHBhc3NlZCB3aGVuIHN0YXJ0aW5nIHRy
YWNpbmcKKy8vIHxjb25zdW1lcnwgd2lsbCBiZSA9PSBudWxscHRyIChhcyBvcHBvc2l0ZSB0byB0
aGUgY2FzZSBvZiBhIGNvbnN1bWVyIGFza2luZworLy8gdG8gc2VuZCB0aGUgdHJhY2UgZGF0YSBi
YWNrIG92ZXIgSVBDKS4KK2Jvb2wgVHJhY2luZ1NlcnZpY2VJbXBsOjpSZWFkQnVmZmVycyhUcmFj
aW5nU2Vzc2lvbklEIHRzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Q29uc3VtZXJFbmRwb2ludEltcGwqIGNvbnN1bWVyKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJF
QUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lvbiA9
IEdldFRyYWNpbmdTZXNzaW9uKHRzaWQpOworICBpZiAoIXRyYWNpbmdfc2Vzc2lvbikgeworICAg
IC8vIFRoaXMgd2lsbCBiZSBoaXQgc3lzdGVtYXRpY2FsbHkgZnJvbSB0aGUgUG9zdERlbGF5ZWRU
YXNrIHdoZW4gZGlyZWN0bHkKKyAgICAvLyB3cml0aW5nIGludG8gdGhlIGZpbGUgKGluIHdoaWNo
IGNhc2UgY29uc3VtZXIgPT0gbnVsbHB0cikuIFN1cHByZXNzIHRoZQorICAgIC8vIGxvZyBpbiB0
aGlzIGNhc2UgYXMgaXQncyBqdXN0IHNwYW0uCisgICAgaWYgKGNvbnN1bWVyKSB7CisgICAgICBQ
RVJGRVRUT19ETE9HKCJDYW5ub3QgUmVhZEJ1ZmZlcnMoKTogbm8gdHJhY2luZyBzZXNzaW9uIGlz
IGFjdGl2ZSIpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBXaGVuIGEg
dHJhY2luZyBzZXNzaW9uIGlzIHdhaXRpbmcgZm9yIGEgdHJpZ2dlciBpdCBpcyBjb25zaWRlcmVk
IGVtcHR5LiBJZgorICAvLyBhIHRyYWNpbmcgc2Vzc2lvbiBmaW5pc2hlcyBhbmQgbW92ZXMgaW50
byBESVNBQkxFRCB3aXRob3V0IGV2ZXIgcmVjZWl2aW5nIGEKKyAgLy8gdHJpZ2dlciB0aGUgdHJh
Y2Ugc2hvdWxkIG5ldmVyIHJldHVybiBhbnkgZGF0YS4gVGhpcyBpbmNsdWRlcyB0aGUgc3ludGhl
dGljCisgIC8vIHBhY2tldHMgbGlrZSBUcmFjZUNvbmZpZyBhbmQgQ2xvY2sgc25hcHNob3RzLiBT
byB3ZSBiYWlsIG91dCBlYXJseSBhbmQgbGV0CisgIC8vIHRoZSBjb25zdW1lciBrbm93IHRoZXJl
IGlzIG5vIGRhdGEuCisgIGlmICghdHJhY2luZ19zZXNzaW9uLT5jb25maWcudHJpZ2dlcl9jb25m
aWcoKS50cmlnZ2VycygpLmVtcHR5KCkgJiYKKyAgICAgIHRyYWNpbmdfc2Vzc2lvbi0+cmVjZWl2
ZWRfdHJpZ2dlcnMuZW1wdHkoKSkgeworICAgIFBFUkZFVFRPX0RMT0coCisgICAgICAgICJSZWFk
QnVmZmVycygpOiB0cmFjaW5nIHNlc3Npb24gaGFzIG5vdCByZWNlaXZlZCBhIHRyaWdnZXIgeWV0
LiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB0
aGUgZmlsZSBpcyBjbG9zZWQgYnkgYSBwcmV2aW91cyB0YXNrIGJlY2F1c2UgaXQgcmVhY2hlcwor
ICAvLyB8bWF4X2ZpbGVfc2l6ZV9ieXRlc3wuCisgIGlmICghdHJhY2luZ19zZXNzaW9uLT53cml0
ZV9pbnRvX2ZpbGUgJiYgIWNvbnN1bWVyKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAodHJh
Y2luZ19zZXNzaW9uLT53cml0ZV9pbnRvX2ZpbGUgJiYgY29uc3VtZXIpIHsKKyAgICAvLyBJZiB0
aGUgY29uc3VtZXIgZW5hYmxlZCB0cmFjaW5nIGFuZCBhc2tlZCB0byBzYXZlIHRoZSBjb250ZW50
cyBpbnRvIHRoZQorICAgIC8vIHBhc3NlZCBmaWxlIG1ha2VzIGxpdHRsZSBzZW5zZSB0byBhbHNv
IHRyeSB0byByZWFkIHRoZSBidWZmZXJzIG92ZXIgSVBDLAorICAgIC8vIGFzIHRoYXQgd291bGQg
anVzdCBzdGVhbCBkYXRhIGZyb20gdGhlIHBlcmlvZGljIGRyYWluaW5nIHRhc2suCisgICAgUEVS
RkVUVE9fREZBVEFMKCJDb25zdW1lciB0cnlpbmcgdG8gcmVhZCBmcm9tIHdyaXRlX2ludG9fZmls
ZSBzZXNzaW9uLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFRy
YWNlUGFja2V0PiBwYWNrZXRzOworICBwYWNrZXRzLnJlc2VydmUoMTAyNCk7ICAvLyBKdXN0IGFu
IGVkdWNhdGVkIGd1ZXNzIHRvIGF2b2lkIHRyaXZpYWwgZXhwYW5zaW9ucy4KKworICBpZiAoIXRy
YWNpbmdfc2Vzc2lvbi0+aW5pdGlhbF9jbG9ja19zbmFwc2hvdF8uZW1wdHkoKSkgeworICAgIEVt
aXRDbG9ja1NuYXBzaG90KHRyYWNpbmdfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBz
dGQ6Om1vdmUodHJhY2luZ19zZXNzaW9uLT5pbml0aWFsX2Nsb2NrX3NuYXBzaG90XyksCisgICAg
ICAgICAgICAgICAgICAgICAgLypzZXRfcm9vdF90aW1lc3RhbXA9Ki90cnVlLCAmcGFja2V0cyk7
CisgIH0KKworICBpZiAoIXRyYWNpbmdfc2Vzc2lvbi0+bGFzdF9jbG9ja19zbmFwc2hvdF8uZW1w
dHkoKSkgeworICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcHV0IGEgcm9vdCB0aW1lc3RhbXAgaW4g
cGVyaW9kaWMgY2xvY2sgc25hcHNob3QgcGFja2V0cworICAgIC8vIGFzIHRoZXkgbWF5IGJlIGVt
aXR0ZWQgdmVyeSBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0IHRvIHRoZSBhY3R1YWwgdHJhY2UK
KyAgICAvLyBwYWNrZXRzLCBzaW5jZSBjb25zdW1pbmcgdGhlIHRyYWNlIG1heSBoYXBwZW4gYXQg
YW55IHBvaW50IGFmdGVyIGl0CisgICAgLy8gc3RhcnRzLgorICAgIEVtaXRDbG9ja1NuYXBzaG90
KHRyYWNpbmdfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodHJhY2lu
Z19zZXNzaW9uLT5sYXN0X2Nsb2NrX3NuYXBzaG90XyksCisgICAgICAgICAgICAgICAgICAgICAg
LypzZXRfcm9vdF90aW1lc3RhbXA9Ki9mYWxzZSwgJnBhY2tldHMpOworICB9CisKKyAgaWYgKHRy
YWNpbmdfc2Vzc2lvbi0+c2hvdWxkX2VtaXRfc3luY19tYXJrZXIpIHsKKyAgICBTbmFwc2hvdFN5
bmNNYXJrZXIoJnBhY2tldHMpOworICAgIHRyYWNpbmdfc2Vzc2lvbi0+c2hvdWxkX2VtaXRfc3lu
Y19tYXJrZXIgPSBmYWxzZTsKKyAgfQorCisgIGlmICghdHJhY2luZ19zZXNzaW9uLT5jb25maWcu
YnVpbHRpbl9kYXRhX3NvdXJjZXMoKS5kaXNhYmxlX3RyYWNlX2NvbmZpZygpKSB7CisgICAgTWF5
YmVFbWl0VHJhY2VDb25maWcodHJhY2luZ19zZXNzaW9uLCAmcGFja2V0cyk7CisgICAgTWF5YmVF
bWl0UmVjZWl2ZWRUcmlnZ2Vycyh0cmFjaW5nX3Nlc3Npb24sICZwYWNrZXRzKTsKKyAgfQorICBp
ZiAoIXRyYWNpbmdfc2Vzc2lvbi0+Y29uZmlnLmJ1aWx0aW5fZGF0YV9zb3VyY2VzKCkuZGlzYWJs
ZV9zeXN0ZW1faW5mbygpKQorICAgIE1heWJlRW1pdFN5c3RlbUluZm8odHJhY2luZ19zZXNzaW9u
LCAmcGFja2V0cyk7CisgIGlmICghdHJhY2luZ19zZXNzaW9uLT5jb25maWcuYnVpbHRpbl9kYXRh
X3NvdXJjZXMoKS5kaXNhYmxlX3NlcnZpY2VfZXZlbnRzKCkpCisgICAgTWF5YmVFbWl0U2Vydmlj
ZUV2ZW50cyh0cmFjaW5nX3Nlc3Npb24sICZwYWNrZXRzKTsKKworICBzaXplX3QgcGFja2V0c19i
eXRlcyA9IDA7ICAvLyBTVU0oc2xpY2Uuc2l6ZSgpIGZvciBlYWNoIHNsaWNlIGluIHxwYWNrZXRz
fCkuCisgIHNpemVfdCB0b3RhbF9zbGljZXMgPSAwOyAgIC8vIFNVTSgjc2xpY2VzIGluIHxwYWNr
ZXRzfCkuCisKKyAgLy8gQWRkIHVwIHNpemUgZm9yIHBhY2tldHMgYWRkZWQgYnkgdGhlIE1heWJl
KiBjYWxscyBhYm92ZS4KKyAgZm9yIChjb25zdCBUcmFjZVBhY2tldCYgcGFja2V0IDogcGFja2V0
cykgeworICAgIHBhY2tldHNfYnl0ZXMgKz0gcGFja2V0LnNpemUoKTsKKyAgICB0b3RhbF9zbGlj
ZXMgKz0gcGFja2V0LnNsaWNlcygpLnNpemUoKTsKKyAgfQorCisgIC8vIFRoaXMgaXMgYSByb3Vn
aCB0aHJlc2hvbGQgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHRvIHJlYWQgZnJvbSB0aGUgYnVmZmVy
IGluCisgIC8vIGVhY2ggdGFzay4gVGhpcyBpcyB0byBhdm9pZCBleGVjdXRpbmcgYSBzaW5nbGUg
aHVnZSBzZW5kaW5nIHRhc2sgZm9yIHRvbworICAvLyBsb25nIGFuZCByaXNrIHRvIGhpdCB0aGUg
d2F0Y2hkb2cuIFRoaXMgaXMgKm5vdCogYW4gdXBwZXIgYm91bmQ6IHdlIGp1c3QKKyAgLy8gc3Rv
cCBhY2N1bXVsYXRpbmcgbmV3IHBhY2tldHMgYW5kIFBvc3RUYXNrICphZnRlciogd2UgY3Jvc3Mg
dGhpcyB0aHJlc2hvbGQuCisgIC8vIFRoaXMgY29uc3RhbnQgZXNzZW50aWFsbHkgYmFsYW5jZXMg
dGhlIFBvc3RUYXNrIGFuZCBJUEMgb3ZlcmhlYWQgdnMgdGhlCisgIC8vIHJlc3BvbnNpdmVuZXNz
IG9mIHRoZSBzZXJ2aWNlLiBBbiBleHRyZW1lbHkgc21hbGwgdmFsdWUgd2lsbCBjYXVzZSBvbmUg
SVBDCisgIC8vIGFuZCBvbmUgUG9zdFRhc2sgZm9yIGVhY2ggc2xpY2UgYnV0IHdpbGwga2VlcCB0
aGUgc2VydmljZSBleHRyZW1lbHkKKyAgLy8gcmVzcG9uc2l2ZS4gQW4gZXh0cmVtZWx5IGxhcmdl
IHZhbHVlIHdpbGwgYmF0Y2ggdGhlIHNlbmQgZm9yIHRoZSBmdWxsCisgIC8vIGJ1ZmZlciBpbiBv
bmUgbGFyZ2UgdGFzaywgd2lsbCBoaXQgdGhlIGJsb2NraW5nIHNlbmQoKSBvbmNlIHRoZSBzb2Nr
ZXQKKyAgLy8gYnVmZmVycyBhcmUgZnVsbCBhbmQgaGFuZyB0aGUgc2VydmljZSBmb3IgYSBiaXQg
KHVudGlsIHRoZSBjb25zdW1lcgorICAvLyBjYXRjaGVzIHVwKS4KKyAgc3RhdGljIGNvbnN0ZXhw
ciBzaXplX3Qga0FwcHJveEJ5dGVzUGVyVGFzayA9IDMyNzY4OworICBib29sIGRpZF9oaXRfdGhy
ZXNob2xkID0gZmFsc2U7CisKKyAgLy8gVE9ETyhwcmltaWFubyk6IEV4dGVuZCB0aGUgUmVhZEJ1
ZmZlcnMgQVBJIHRvIGFsbG93IHJlYWRpbmcgb25seSBzb21lCisgIC8vIGJ1ZmZlcnMsIG5vdCBh
bGwgb2YgdGhlbSBpbiBvbmUgZ28uCisgIGZvciAoc2l6ZV90IGJ1Zl9pZHggPSAwOworICAgICAg
IGJ1Zl9pZHggPCB0cmFjaW5nX3Nlc3Npb24tPm51bV9idWZmZXJzKCkgJiYgIWRpZF9oaXRfdGhy
ZXNob2xkOworICAgICAgIGJ1Zl9pZHgrKykgeworICAgIGF1dG8gdGJ1Zl9pdGVyID0gYnVmZmVy
c18uZmluZCh0cmFjaW5nX3Nlc3Npb24tPmJ1ZmZlcnNfaW5kZXhbYnVmX2lkeF0pOworICAgIGlm
ICh0YnVmX2l0ZXIgPT0gYnVmZmVyc18uZW5kKCkpIHsKKyAgICAgIFBFUkZFVFRPX0RGQVRBTCgi
QnVmZmVyIG5vdCBmb3VuZC4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBUcmFjZUJ1
ZmZlciYgdGJ1ZiA9ICp0YnVmX2l0ZXItPnNlY29uZDsKKyAgICB0YnVmLkJlZ2luUmVhZCgpOwor
ICAgIHdoaWxlICghZGlkX2hpdF90aHJlc2hvbGQpIHsKKyAgICAgIFRyYWNlUGFja2V0IHBhY2tl
dDsKKyAgICAgIFRyYWNlQnVmZmVyOjpQYWNrZXRTZXF1ZW5jZVByb3BlcnRpZXMgc2VxdWVuY2Vf
cHJvcGVydGllc3t9OworICAgICAgYm9vbCBwcmV2aW91c19wYWNrZXRfZHJvcHBlZDsKKyAgICAg
IGlmICghdGJ1Zi5SZWFkTmV4dFRyYWNlUGFja2V0KCZwYWNrZXQsICZzZXF1ZW5jZV9wcm9wZXJ0
aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXZpb3VzX3BhY2tl
dF9kcm9wcGVkKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIFBFUkZFVFRPX0RD
SEVDSyhzZXF1ZW5jZV9wcm9wZXJ0aWVzLnByb2R1Y2VyX2lkX3RydXN0ZWQgIT0gMCk7CisgICAg
ICBQRVJGRVRUT19EQ0hFQ0soc2VxdWVuY2VfcHJvcGVydGllcy53cml0ZXJfaWQgIT0gMCk7Cisg
ICAgICBQRVJGRVRUT19EQ0hFQ0soc2VxdWVuY2VfcHJvcGVydGllcy5wcm9kdWNlcl91aWRfdHJ1
c3RlZCAhPSBrSW52YWxpZFVpZCk7CisgICAgICBQRVJGRVRUT19EQ0hFQ0socGFja2V0LnNpemUo
KSA+IDApOworICAgICAgaWYgKCFQYWNrZXRTdHJlYW1WYWxpZGF0b3I6OlZhbGlkYXRlKHBhY2tl
dC5zbGljZXMoKSkpIHsKKyAgICAgICAgdHJhY2luZ19zZXNzaW9uLT5pbnZhbGlkX3BhY2tldHMr
KzsKKyAgICAgICAgUEVSRkVUVE9fRExPRygiRHJvcHBpbmcgaW52YWxpZCBwYWNrZXQiKTsKKyAg
ICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIEFwcGVuZCBhIHNsaWNlIHdpdGgg
dGhlIHRydXN0ZWQgZmllbGQgZGF0YS4gVGhpcyBjYW4ndCBiZSBzcG9vZmVkCisgICAgICAvLyBi
ZWNhdXNlIGFib3ZlIHdlIHZhbGlkYXRlZCB0aGF0IHRoZSBleGlzdGluZyBzbGljZXMgZG9uJ3Qg
Y29udGFpbiBhbnkKKyAgICAgIC8vIHRydXN0ZWQgZmllbGRzLiBGb3IgYWRkZWQgc2FmZXR5IHdl
IGFwcGVuZCBpbnN0ZWFkIG9mIHByZXBlbmRpbmcKKyAgICAgIC8vIGJlY2F1c2UgYWNjb3JkaW5n
IHRvIHByb3RvYnVmIHNlbWFudGljcywgaWYgdGhlIHNhbWUgZmllbGQgaXMKKyAgICAgIC8vIGVu
Y291bnRlcmVkIG11bHRpcGxlIHRpbWVzIHRoZSBsYXN0IGluc3RhbmNlIHRha2VzIHByaW9yaXR5
LiBOb3RlIHRoYXQKKyAgICAgIC8vIHRydW5jYXRlZCBwYWNrZXRzIGFyZSBhbHNvIHJlamVjdGVk
LCBzbyB0aGUgcHJvZHVjZXIgY2FuJ3QgZ2l2ZSB1cyBhCisgICAgICAvLyBwYXJ0aWFsIHBhY2tl
dCAoZS5nLiwgYSB0cnVuY2F0ZWQgc3RyaW5nKSB3aGljaCBvbmx5IGJlY29tZXMgdmFsaWQgd2hl
bgorICAgICAgLy8gdGhlIHRydXN0ZWQgZGF0YSBpcyBhcHBlbmRlZCBoZXJlLgorICAgICAgU2xp
Y2Ugc2xpY2UgPSBTbGljZTo6QWxsb2NhdGUoMzIpOworICAgICAgcHJvdG96ZXJvOjpTdGF0aWNC
dWZmZXJlZDxwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXQ+IHRydXN0ZWRfcGFja2V0KAorICAg
ICAgICAgIHNsaWNlLm93bl9kYXRhKCksIHNsaWNlLnNpemUpOworICAgICAgdHJ1c3RlZF9wYWNr
ZXQtPnNldF90cnVzdGVkX3VpZCgKKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzZXF1
ZW5jZV9wcm9wZXJ0aWVzLnByb2R1Y2VyX3VpZF90cnVzdGVkKSk7CisgICAgICB0cnVzdGVkX3Bh
Y2tldC0+c2V0X3RydXN0ZWRfcGFja2V0X3NlcXVlbmNlX2lkKAorICAgICAgICAgIHRyYWNpbmdf
c2Vzc2lvbi0+R2V0UGFja2V0U2VxdWVuY2VJRCgKKyAgICAgICAgICAgICAgc2VxdWVuY2VfcHJv
cGVydGllcy5wcm9kdWNlcl9pZF90cnVzdGVkLAorICAgICAgICAgICAgICBzZXF1ZW5jZV9wcm9w
ZXJ0aWVzLndyaXRlcl9pZCkpOworICAgICAgaWYgKHByZXZpb3VzX3BhY2tldF9kcm9wcGVkKQor
ICAgICAgICB0cnVzdGVkX3BhY2tldC0+c2V0X3ByZXZpb3VzX3BhY2tldF9kcm9wcGVkKHByZXZp
b3VzX3BhY2tldF9kcm9wcGVkKTsKKyAgICAgIHNsaWNlLnNpemUgPSB0cnVzdGVkX3BhY2tldC5G
aW5hbGl6ZSgpOworICAgICAgcGFja2V0LkFkZFNsaWNlKHN0ZDo6bW92ZShzbGljZSkpOworCisg
ICAgICAvLyBBcHBlbmQgdGhlIHBhY2tldCAoaW5jbHVzaXZlIG9mIHRoZSB0cnVzdGVkIHVpZCkg
dG8gfHBhY2tldHN8LgorICAgICAgcGFja2V0c19ieXRlcyArPSBwYWNrZXQuc2l6ZSgpOworICAg
ICAgdG90YWxfc2xpY2VzICs9IHBhY2tldC5zbGljZXMoKS5zaXplKCk7CisgICAgICBkaWRfaGl0
X3RocmVzaG9sZCA9IHBhY2tldHNfYnl0ZXMgPj0ga0FwcHJveEJ5dGVzUGVyVGFzayAmJgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAhdHJhY2luZ19zZXNzaW9uLT53cml0ZV9pbnRvX2ZpbGU7
CisgICAgICBwYWNrZXRzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocGFja2V0KSk7CisgICAgfSAg
Ly8gZm9yKHBhY2tldHMuLi4pCisgIH0gICAgLy8gZm9yKGJ1ZmZlcnMuLi4pCisKKyAgY29uc3Qg
Ym9vbCBoYXNfbW9yZSA9IGRpZF9oaXRfdGhyZXNob2xkOworCisgIC8vIE9ubHkgZW1pdCB0aGUg
c3RhdHMgd2hlbiB0aGVyZSBpcyBubyBtb3JlIHRyYWNlIGRhdGEgaXMgYXZhaWxhYmxlIHRvIHJl
YWQuCisgIC8vIFRoYXQgd2F5LCBhbnkgcHJvYmxlbXMgdGhhdCBvY2N1ciB3aGlsZSByZWFkaW5n
IGZyb20gdGhlIGJ1ZmZlcnMgYXJlCisgIC8vIHJlZmxlY3RlZCBpbiB0aGUgZW1pdHRlZCBzdGF0
cy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciB1c2UKKyAgLy8gY2FzZXMgd2hl
cmUgUmVhZEJ1ZmZlcnMgaXMgb25seSBldmVyIGNhbGxlZCBhZnRlciB0aGUgdHJhY2luZyBzZXNz
aW9uIGlzCisgIC8vIHN0b3BwZWQuCisgIGlmICghaGFzX21vcmUgJiYgdHJhY2luZ19zZXNzaW9u
LT5zaG91bGRfZW1pdF9zdGF0cykgeworICAgIHNpemVfdCBwcmV2X3BhY2tldHNfc2l6ZSA9IHBh
Y2tldHMuc2l6ZSgpOworICAgIFNuYXBzaG90U3RhdHModHJhY2luZ19zZXNzaW9uLCAmcGFja2V0
cyk7CisgICAgdHJhY2luZ19zZXNzaW9uLT5zaG91bGRfZW1pdF9zdGF0cyA9IGZhbHNlOworCisg
ICAgLy8gQWRkIHNpemVzIG9mIHBhY2tldHMgZW1pdHRlZCBieSBTbmFwc2hvdFN0YXRzLgorICAg
IGZvciAoc2l6ZV90IGkgPSBwcmV2X3BhY2tldHNfc2l6ZTsgaSA8IHBhY2tldHMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgIHBhY2tldHNfYnl0ZXMgKz0gcGFja2V0c1tpXS5zaXplKCk7CisgICAgICB0
b3RhbF9zbGljZXMgKz0gcGFja2V0c1tpXS5zbGljZXMoKS5zaXplKCk7CisgICAgfQorICB9CisK
KyAgLy8gSWYgdGhlIGNhbGxlciBhc2tlZCB1cyB0byB3cml0ZSBpbnRvIGEgZmlsZSBieSBzZXR0
aW5nCisgIC8vIHx3cml0ZV9pbnRvX2ZpbGV8ID09IHRydWUgaW4gdGhlIHRyYWNlIGNvbmZpZywg
ZHJhaW4gdGhlIHBhY2tldHMgcmVhZAorICAvLyAoaWYgYW55KSBpbnRvIHRoZSBnaXZlbiBmaWxl
IGRlc2NyaXB0b3IuCisgIGlmICh0cmFjaW5nX3Nlc3Npb24tPndyaXRlX2ludG9fZmlsZSkgewor
ICAgIGNvbnN0IHVpbnQ2NF90IG1heF9zaXplID0gdHJhY2luZ19zZXNzaW9uLT5tYXhfZmlsZV9z
aXplX2J5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0cmFjaW5nX3Nl
c3Npb24tPm1heF9maWxlX3NpemVfYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA6IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCk7CisKKyAgICAvLyBXaGVu
IHdyaXRpbmcgaW50byBhIGZpbGUsIHRoZSBmaWxlIHNob3VsZCBsb29rIGxpa2UgYSByb290IHRy
YWNlLnByb3RvCisgICAgLy8gbWVzc2FnZS4gRWFjaCBwYWNrZXQgc2hvdWxkIGJlIHByZXBlbmRl
ZCB3aXRoIGEgcHJvdG8gcHJlYW1ibGUgc3RhdGluZworICAgIC8vIGl0cyBmaWVsZCBpZCAod2l0
aGluIHRyYWNlLnByb3RvKSBhbmQgc2l6ZS4gSGVuY2UgdGhlIGFkZGl0aW9uIGJlbG93LgorICAg
IGNvbnN0IHNpemVfdCBtYXhfaW92ZWNzID0gdG90YWxfc2xpY2VzICsgcGFja2V0cy5zaXplKCk7
CisKKyAgICBzaXplX3QgbnVtX2lvdmVjcyA9IDA7CisgICAgYm9vbCBzdG9wX3dyaXRpbmdfaW50
b19maWxlID0gdHJhY2luZ19zZXNzaW9uLT53cml0ZV9wZXJpb2RfbXMgPT0gMDsKKyAgICBzdGQ6
OnVuaXF1ZV9wdHI8c3RydWN0IGlvdmVjW10+IGlvdmVjcyhuZXcgc3RydWN0IGlvdmVjW21heF9p
b3ZlY3NdKTsKKyAgICBzaXplX3QgbnVtX2lvdmVjc19hdF9sYXN0X3BhY2tldCA9IDA7CisgICAg
dWludDY0X3QgYnl0ZXNfYWJvdXRfdG9fYmVfd3JpdHRlbiA9IDA7CisgICAgZm9yIChUcmFjZVBh
Y2tldCYgcGFja2V0IDogcGFja2V0cykgeworICAgICAgc3RkOjp0aWUoaW92ZWNzW251bV9pb3Zl
Y3NdLmlvdl9iYXNlLCBpb3ZlY3NbbnVtX2lvdmVjc10uaW92X2xlbikgPQorICAgICAgICAgIHBh
Y2tldC5HZXRQcm90b1ByZWFtYmxlKCk7CisgICAgICBieXRlc19hYm91dF90b19iZV93cml0dGVu
ICs9IGlvdmVjc1tudW1faW92ZWNzXS5pb3ZfbGVuOworICAgICAgbnVtX2lvdmVjcysrOworICAg
ICAgZm9yIChjb25zdCBTbGljZSYgc2xpY2UgOiBwYWNrZXQuc2xpY2VzKCkpIHsKKyAgICAgICAg
Ly8gd3JpdGV2KCkgZG9lc24ndCBjaGFuZ2UgdGhlIHBhc3NlZCBwb2ludGVyLiBIb3dldmVyLCBz
dHJ1Y3QgaW92ZWMKKyAgICAgICAgLy8gdGFrZSBhIG5vbi1jb25zdCBwdHIgYmVjYXVzZSBpdCdz
IHRoZSBzYW1lIHN0cnVjdCB1c2VkIGJ5IHJlYWR2KCkuCisgICAgICAgIC8vIEhlbmNlIHRoZSBj
b25zdF9jYXN0IGhlcmUuCisgICAgICAgIGNoYXIqIHN0YXJ0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+
KGNvbnN0X2Nhc3Q8dm9pZCo+KHNsaWNlLnN0YXJ0KSk7CisgICAgICAgIGJ5dGVzX2Fib3V0X3Rv
X2JlX3dyaXR0ZW4gKz0gc2xpY2Uuc2l6ZTsKKyAgICAgICAgaW92ZWNzW251bV9pb3ZlY3MrK10g
PSB7c3RhcnQsIHNsaWNlLnNpemV9OworICAgICAgfQorCisgICAgICBpZiAodHJhY2luZ19zZXNz
aW9uLT5ieXRlc193cml0dGVuX2ludG9fZmlsZSArCisgICAgICAgICAgICAgIGJ5dGVzX2Fib3V0
X3RvX2JlX3dyaXR0ZW4gPj0KKyAgICAgICAgICBtYXhfc2l6ZSkgeworICAgICAgICBzdG9wX3dy
aXRpbmdfaW50b19maWxlID0gdHJ1ZTsKKyAgICAgICAgbnVtX2lvdmVjcyA9IG51bV9pb3ZlY3Nf
YXRfbGFzdF9wYWNrZXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBudW1faW92
ZWNzX2F0X2xhc3RfcGFja2V0ID0gbnVtX2lvdmVjczsKKyAgICB9CisgICAgUEVSRkVUVE9fRENI
RUNLKG51bV9pb3ZlY3MgPD0gbWF4X2lvdmVjcyk7CisgICAgaW50IGZkID0gKnRyYWNpbmdfc2Vz
c2lvbi0+d3JpdGVfaW50b19maWxlOworCisgICAgdWludDY0X3QgdG90YWxfd3Jfc2l6ZSA9IDA7
CisKKyAgICAvLyB3cml0ZXYoKSBjYW4gdGFrZSBhdCBtb3N0IElPVl9NQVggZW50cmllcyBwZXIg
Y2FsbC4gQmF0Y2ggdGhlbS4KKyAgICBjb25zdGV4cHIgc2l6ZV90IGtJT1ZNYXggPSBJT1ZfTUFY
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2lvdmVjczsgaSArPSBrSU9WTWF4KSB7
CisgICAgICBpbnQgaW92X2JhdGNoX3NpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHN0ZDo6bWluKG51
bV9pb3ZlY3MgLSBpLCBrSU9WTWF4KSk7CisgICAgICBzc2l6ZV90IHdyX3NpemUgPSBQRVJGRVRU
T19FSU5UUih3cml0ZXYoZmQsICZpb3ZlY3NbaV0sIGlvdl9iYXRjaF9zaXplKSk7CisgICAgICBp
ZiAod3Jfc2l6ZSA8PSAwKSB7CisgICAgICAgIFBFUkZFVFRPX1BMT0coIndyaXRldigpIGZhaWxl
ZCIpOworICAgICAgICBzdG9wX3dyaXRpbmdfaW50b19maWxlID0gdHJ1ZTsKKyAgICAgICAgYnJl
YWs7CisgICAgICB9CisgICAgICB0b3RhbF93cl9zaXplICs9IHN0YXRpY19jYXN0PHNpemVfdD4o
d3Jfc2l6ZSk7CisgICAgfQorCisgICAgdHJhY2luZ19zZXNzaW9uLT5ieXRlc193cml0dGVuX2lu
dG9fZmlsZSArPSB0b3RhbF93cl9zaXplOworCisgICAgUEVSRkVUVE9fRExPRygiRHJhaW5pbmcg
aW50byBmaWxlLCB3cml0dGVuOiAlIiBQUkl1NjQgIiBLQiwgc3RvcDogJWQiLAorICAgICAgICAg
ICAgICAgICAgKHRvdGFsX3dyX3NpemUgKyAxMDIzKSAvIDEwMjQsIHN0b3Bfd3JpdGluZ19pbnRv
X2ZpbGUpOworICAgIGlmIChzdG9wX3dyaXRpbmdfaW50b19maWxlKSB7CisgICAgICAvLyBFbnN1
cmUgYWxsIGRhdGEgd2FzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYmVmb3JlIHdlIGNsb3NlIGl0Lgor
ICAgICAgYmFzZTo6Rmx1c2hGaWxlKGZkKTsKKyAgICAgIHRyYWNpbmdfc2Vzc2lvbi0+d3JpdGVf
aW50b19maWxlLnJlc2V0KCk7CisgICAgICB0cmFjaW5nX3Nlc3Npb24tPndyaXRlX3BlcmlvZF9t
cyA9IDA7CisgICAgICBpZiAodHJhY2luZ19zZXNzaW9uLT5zdGF0ZSA9PSBUcmFjaW5nU2Vzc2lv
bjo6U1RBUlRFRCkKKyAgICAgICAgRGlzYWJsZVRyYWNpbmcodHNpZCk7CisgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICBhdXRvIHdlYWtfdGhpcyA9IHdlYWtfcHRyX2ZhY3RvcnlfLkdl
dFdlYWtQdHIoKTsKKyAgICB0YXNrX3J1bm5lcl8tPlBvc3REZWxheWVkVGFzaygKKyAgICAgICAg
W3dlYWtfdGhpcywgdHNpZF0geworICAgICAgICAgIGlmICh3ZWFrX3RoaXMpCisgICAgICAgICAg
ICB3ZWFrX3RoaXMtPlJlYWRCdWZmZXJzKHRzaWQsIG51bGxwdHIpOworICAgICAgICB9LAorICAg
ICAgICB0cmFjaW5nX3Nlc3Npb24tPmRlbGF5X3RvX25leHRfd3JpdGVfcGVyaW9kX21zKCkpOwor
ICAgIHJldHVybiB0cnVlOworICB9ICAvLyBpZiAodHJhY2luZ19zZXNzaW9uLT53cml0ZV9pbnRv
X2ZpbGUpCisKKyAgaWYgKGhhc19tb3JlKSB7CisgICAgYXV0byB3ZWFrX2NvbnN1bWVyID0gY29u
c3VtZXItPkdldFdlYWtQdHIoKTsKKyAgICBhdXRvIHdlYWtfdGhpcyA9IHdlYWtfcHRyX2ZhY3Rv
cnlfLkdldFdlYWtQdHIoKTsKKyAgICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt3ZWFrX3RoaXMs
IHdlYWtfY29uc3VtZXIsIHRzaWRdIHsKKyAgICAgIGlmICghd2Vha190aGlzIHx8ICF3ZWFrX2Nv
bnN1bWVyKQorICAgICAgICByZXR1cm47CisgICAgICB3ZWFrX3RoaXMtPlJlYWRCdWZmZXJzKHRz
aWQsIHdlYWtfY29uc3VtZXIuZ2V0KCkpOworICAgIH0pOworICB9CisKKyAgLy8gS2VlcCB0aGlz
IGFzIHRhaWwgY2FsbCwganVzdCBpbiBjYXNlIHRoZSBjb25zdW1lciByZS1lbnRlcnMuCisgIGNv
bnN1bWVyLT5jb25zdW1lcl8tPk9uVHJhY2VEYXRhKHN0ZDo6bW92ZShwYWNrZXRzKSwgaGFzX21v
cmUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OkZyZWVC
dWZmZXJzKFRyYWNpbmdTZXNzaW9uSUQgdHNpZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFE
KHRocmVhZF9jaGVja2VyXyk7CisgIFBFUkZFVFRPX0RMT0coIkZyZWVpbmcgYnVmZmVycyBmb3Ig
c2Vzc2lvbiAlIiBQUkl1NjQsIHRzaWQpOworICBUcmFjaW5nU2Vzc2lvbiogdHJhY2luZ19zZXNz
aW9uID0gR2V0VHJhY2luZ1Nlc3Npb24odHNpZCk7CisgIGlmICghdHJhY2luZ19zZXNzaW9uKSB7
CisgICAgUEVSRkVUVE9fRExPRygiRnJlZUJ1ZmZlcnMoKSBmYWlsZWQsIGludmFsaWQgc2Vzc2lv
biBJRCAlIiBQUkl1NjQsIHRzaWQpOworICAgIHJldHVybjsgIC8vIFRPRE8ocHJpbWlhbm8pOiBz
aWduYWwgZmFpbHVyZT8KKyAgfQorICBEaXNhYmxlVHJhY2luZyh0c2lkLCAvKmRpc2FibGVfaW1t
ZWRpYXRlbHk9Ki90cnVlKTsKKworICBQRVJGRVRUT19EQ0hFQ0sodHJhY2luZ19zZXNzaW9uLT5B
bGxEYXRhU291cmNlSW5zdGFuY2VzU3RvcHBlZCgpKTsKKyAgdHJhY2luZ19zZXNzaW9uLT5kYXRh
X3NvdXJjZV9pbnN0YW5jZXMuY2xlYXIoKTsKKworICBmb3IgKGF1dG8mIHByb2R1Y2VyX2VudHJ5
IDogcHJvZHVjZXJzXykgeworICAgIFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBwcm9kdWNlciA9IHBy
b2R1Y2VyX2VudHJ5LnNlY29uZDsKKyAgICBwcm9kdWNlci0+T25GcmVlQnVmZmVycyh0cmFjaW5n
X3Nlc3Npb24tPmJ1ZmZlcnNfaW5kZXgpOworICB9CisKKyAgZm9yIChCdWZmZXJJRCBidWZmZXJf
aWQgOiB0cmFjaW5nX3Nlc3Npb24tPmJ1ZmZlcnNfaW5kZXgpIHsKKyAgICBidWZmZXJfaWRzXy5G
cmVlKGJ1ZmZlcl9pZCk7CisgICAgUEVSRkVUVE9fRENIRUNLKGJ1ZmZlcnNfLmNvdW50KGJ1ZmZl
cl9pZCkgPT0gMSk7CisgICAgYnVmZmVyc18uZXJhc2UoYnVmZmVyX2lkKTsKKyAgfQorICBib29s
IG5vdGlmeV90cmFjZXVyID0gdHJhY2luZ19zZXNzaW9uLT5jb25maWcubm90aWZ5X3RyYWNldXIo
KTsKKyAgdHJhY2luZ19zZXNzaW9uc18uZXJhc2UodHNpZCk7CisgIFVwZGF0ZU1lbW9yeUd1YXJk
cmFpbCgpOworCisgIFBFUkZFVFRPX0xPRygiVHJhY2luZyBzZXNzaW9uICUiIFBSSXU2NCAiIGVu
ZGVkLCB0b3RhbCBzZXNzaW9uczolenUiLCB0c2lkLAorICAgICAgICAgICAgICAgdHJhY2luZ19z
ZXNzaW9uc18uc2l6ZSgpKTsKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19B
TkRST0lEKQorICBzdGF0aWMgY29uc3QgY2hhciBrVHJhY2V1clByb3BbXSA9ICJzeXMudHJhY2Uu
dHJhY2VfZW5kX3NpZ25hbCI7CisgIGlmIChub3RpZnlfdHJhY2V1ciAmJiBfX3N5c3RlbV9wcm9w
ZXJ0eV9zZXQoa1RyYWNldXJQcm9wLCAiMSIpKQorICAgIFBFUkZFVFRPX0VMT0coIkZhaWxlZCB0
byBzZXRwcm9wICVzPTEiLCBrVHJhY2V1clByb3ApOworI2Vsc2UKKyAgYmFzZTo6aWdub3JlX3Jl
c3VsdChub3RpZnlfdHJhY2V1cik7CisjZW5kaWYKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUlt
cGw6OlJlZ2lzdGVyRGF0YVNvdXJjZShQcm9kdWNlcklEIHByb2R1Y2VyX2lkLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhU291cmNlRGVzY3Jp
cHRvciYgZGVzYykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7
CisgIFBFUkZFVFRPX0RMT0coIlByb2R1Y2VyICUiIFBSSXUxNiAiIHJlZ2lzdGVyZWQgZGF0YSBz
b3VyY2UgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICBwcm9kdWNlcl9pZCwgZGVzYy5uYW1lKCku
Y19zdHIoKSk7CisKKyAgUEVSRkVUVE9fRENIRUNLKCFkZXNjLm5hbWUoKS5lbXB0eSgpKTsKKyAg
YXV0byByZWdfZHMgPSBkYXRhX3NvdXJjZXNfLmVtcGxhY2UoZGVzYy5uYW1lKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWREYXRhU291cmNle3Byb2R1
Y2VyX2lkLCBkZXNjfSk7CisKKyAgLy8gSWYgdGhlcmUgYXJlIGV4aXN0aW5nIHRyYWNpbmcgc2Vz
c2lvbnMsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIG5ldworICAvLyBkYXRhIHNvdXJjZSBpcyBl
bmFibGVkIGJ5IGFueSBvZiB0aGVtLgorICBpZiAodHJhY2luZ19zZXNzaW9uc18uZW1wdHkoKSkK
KyAgICByZXR1cm47CisKKyAgUHJvZHVjZXJFbmRwb2ludEltcGwqIHByb2R1Y2VyID0gR2V0UHJv
ZHVjZXIocHJvZHVjZXJfaWQpOworICBpZiAoIXByb2R1Y2VyKSB7CisgICAgUEVSRkVUVE9fREZB
VEFMKCJQcm9kdWNlciBub3QgZm91bmQuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChh
dXRvJiBpdGVyIDogdHJhY2luZ19zZXNzaW9uc18pIHsKKyAgICBUcmFjaW5nU2Vzc2lvbiYgdHJh
Y2luZ19zZXNzaW9uID0gaXRlci5zZWNvbmQ7CisgICAgaWYgKHRyYWNpbmdfc2Vzc2lvbi5zdGF0
ZSAhPSBUcmFjaW5nU2Vzc2lvbjo6U1RBUlRFRCAmJgorICAgICAgICB0cmFjaW5nX3Nlc3Npb24u
c3RhdGUgIT0gVHJhY2luZ1Nlc3Npb246OkNPTkZJR1VSRUQpIHsKKyAgICAgIGNvbnRpbnVlOwor
ICAgIH0KKworICAgIFRyYWNlQ29uZmlnOjpQcm9kdWNlckNvbmZpZyBwcm9kdWNlcl9jb25maWc7
CisgICAgZm9yIChhdXRvJiBjb25maWcgOiB0cmFjaW5nX3Nlc3Npb24uY29uZmlnLnByb2R1Y2Vy
cygpKSB7CisgICAgICBpZiAocHJvZHVjZXItPm5hbWVfID09IGNvbmZpZy5wcm9kdWNlcl9uYW1l
KCkpIHsKKyAgICAgICAgcHJvZHVjZXJfY29uZmlnID0gY29uZmlnOworICAgICAgICBicmVhazsK
KyAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBUcmFjZUNvbmZpZzo6RGF0YVNvdXJjZSYg
Y2ZnX2RhdGFfc291cmNlIDoKKyAgICAgICAgIHRyYWNpbmdfc2Vzc2lvbi5jb25maWcuZGF0YV9z
b3VyY2VzKCkpIHsKKyAgICAgIGlmIChjZmdfZGF0YV9zb3VyY2UuY29uZmlnKCkubmFtZSgpICE9
IGRlc2MubmFtZSgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIERhdGFTb3VyY2VJbnN0YW5j
ZSogZHNfaW5zdCA9IFNldHVwRGF0YVNvdXJjZSgKKyAgICAgICAgICBjZmdfZGF0YV9zb3VyY2Us
IHByb2R1Y2VyX2NvbmZpZywgcmVnX2RzLT5zZWNvbmQsICZ0cmFjaW5nX3Nlc3Npb24pOworICAg
ICAgaWYgKGRzX2luc3QgJiYgdHJhY2luZ19zZXNzaW9uLnN0YXRlID09IFRyYWNpbmdTZXNzaW9u
OjpTVEFSVEVEKQorICAgICAgICBTdGFydERhdGFTb3VyY2VJbnN0YW5jZShwcm9kdWNlciwgJnRy
YWNpbmdfc2Vzc2lvbiwgZHNfaW5zdCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVHJhY2luZ1Nl
cnZpY2VJbXBsOjpTdG9wRGF0YVNvdXJjZUluc3RhbmNlKFByb2R1Y2VyRW5kcG9pbnRJbXBsKiBw
cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFRyYWNpbmdTZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSW5zdGFuY2UqIGluc3RhbmNlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXNh
YmxlX2ltbWVkaWF0ZWx5KSB7CisgIGNvbnN0IERhdGFTb3VyY2VJbnN0YW5jZUlEIGRzX2luc3Rf
aWQgPSBpbnN0YW5jZS0+aW5zdGFuY2VfaWQ7CisgIGlmIChpbnN0YW5jZS0+d2lsbF9ub3RpZnlf
b25fc3RvcCAmJiAhZGlzYWJsZV9pbW1lZGlhdGVseSkgeworICAgIGluc3RhbmNlLT5zdGF0ZSA9
IERhdGFTb3VyY2VJbnN0YW5jZTo6U1RPUFBJTkc7CisgIH0gZWxzZSB7CisgICAgaW5zdGFuY2Ut
PnN0YXRlID0gRGF0YVNvdXJjZUluc3RhbmNlOjpTVE9QUEVEOworICB9CisgIGlmICh0cmFjaW5n
X3Nlc3Npb24tPmNvbnN1bWVyX21heWJlX251bGwpIHsKKyAgICB0cmFjaW5nX3Nlc3Npb24tPmNv
bnN1bWVyX21heWJlX251bGwtPk9uRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2UoCisgICAg
ICAgICpwcm9kdWNlciwgKmluc3RhbmNlKTsKKyAgfQorICBwcm9kdWNlci0+U3RvcERhdGFTb3Vy
Y2UoZHNfaW5zdF9pZCk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpVbnJlZ2lzdGVy
RGF0YVNvdXJjZShQcm9kdWNlcklEIHByb2R1Y2VyX2lkLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIFBF
UkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgUEVSRkVUVE9fRExPRygi
UHJvZHVjZXIgJSIgUFJJdTE2ICIgdW5yZWdpc3RlcmVkIGRhdGEgc291cmNlIFwiJXNcIiIsCisg
ICAgICAgICAgICAgICAgcHJvZHVjZXJfaWQsIG5hbWUuY19zdHIoKSk7CisgIFBFUkZFVFRPX0NI
RUNLKHByb2R1Y2VyX2lkKTsKKyAgUHJvZHVjZXJFbmRwb2ludEltcGwqIHByb2R1Y2VyID0gR2V0
UHJvZHVjZXIocHJvZHVjZXJfaWQpOworICBQRVJGRVRUT19EQ0hFQ0socHJvZHVjZXIpOworICBm
b3IgKGF1dG8mIGt2IDogdHJhY2luZ19zZXNzaW9uc18pIHsKKyAgICBhdXRvJiBkc19pbnN0YW5j
ZXMgPSBrdi5zZWNvbmQuZGF0YV9zb3VyY2VfaW5zdGFuY2VzOworICAgIGJvb2wgcmVtb3ZlZCA9
IGZhbHNlOworICAgIGZvciAoYXV0byBpdCA9IGRzX2luc3RhbmNlcy5iZWdpbigpOyBpdCAhPSBk
c19pbnN0YW5jZXMuZW5kKCk7KSB7CisgICAgICBpZiAoaXQtPmZpcnN0ID09IHByb2R1Y2VyX2lk
ICYmIGl0LT5zZWNvbmQuZGF0YV9zb3VyY2VfbmFtZSA9PSBuYW1lKSB7CisgICAgICAgIERhdGFT
b3VyY2VJbnN0YW5jZUlEIGRzX2luc3RfaWQgPSBpdC0+c2Vjb25kLmluc3RhbmNlX2lkOworICAg
ICAgICBpZiAoaXQtPnNlY29uZC5zdGF0ZSAhPSBEYXRhU291cmNlSW5zdGFuY2U6OlNUT1BQRUQp
IHsKKyAgICAgICAgICBpZiAoaXQtPnNlY29uZC5zdGF0ZSAhPSBEYXRhU291cmNlSW5zdGFuY2U6
OlNUT1BQSU5HKQorICAgICAgICAgICAgU3RvcERhdGFTb3VyY2VJbnN0YW5jZShwcm9kdWNlciwg
Jmt2LnNlY29uZCwgJml0LT5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8qIGRpc2FibGVfaW1tZWRpYXRlbHkgPSAqLyBmYWxzZSk7CisgICAgICAgICAgLy8gTWFy
ayB0aGUgaW5zdGFuY2UgYXMgc3RvcHBlZCBpbW1lZGlhdGVseSwgc2luY2Ugd2UgYXJlCisgICAg
ICAgICAgLy8gdW5yZWdpc3RlcmluZyBpdCBiZWxvdy4KKyAgICAgICAgICBpZiAoaXQtPnNlY29u
ZC5zdGF0ZSA9PSBEYXRhU291cmNlSW5zdGFuY2U6OlNUT1BQSU5HKQorICAgICAgICAgICAgTm90
aWZ5RGF0YVNvdXJjZVN0b3BwZWQocHJvZHVjZXJfaWQsIGRzX2luc3RfaWQpOworICAgICAgICB9
CisgICAgICAgIGl0ID0gZHNfaW5zdGFuY2VzLmVyYXNlKGl0KTsKKyAgICAgICAgcmVtb3ZlZCA9
IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICArK2l0OworICAgICAgfQorICAgIH0gIC8v
IGZvciAoZGF0YV9zb3VyY2VfaW5zdGFuY2VzKQorICAgIGlmIChyZW1vdmVkKQorICAgICAgTWF5
YmVOb3RpZnlBbGxEYXRhU291cmNlc1N0YXJ0ZWQoJmt2LnNlY29uZCk7CisgIH0gIC8vIGZvciAo
dHJhY2luZ19zZXNzaW9uKQorCisgIGZvciAoYXV0byBpdCA9IGRhdGFfc291cmNlc18uYmVnaW4o
KTsgaXQgIT0gZGF0YV9zb3VyY2VzXy5lbmQoKTsgKytpdCkgeworICAgIGlmIChpdC0+c2Vjb25k
LnByb2R1Y2VyX2lkID09IHByb2R1Y2VyX2lkICYmCisgICAgICAgIGl0LT5zZWNvbmQuZGVzY3Jp
cHRvci5uYW1lKCkgPT0gbmFtZSkgeworICAgICAgZGF0YV9zb3VyY2VzXy5lcmFzZShpdCk7Cisg
ICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgUEVSRkVUVE9fREZBVEFMKAorICAgICAgIlRy
aWVkIHRvIHVucmVnaXN0ZXIgYSBub24tZXhpc3RlbnQgZGF0YSBzb3VyY2UgXCIlc1wiIGZvciAi
CisgICAgICAicHJvZHVjZXIgJSIgUFJJdTE2LAorICAgICAgbmFtZS5jX3N0cigpLCBwcm9kdWNl
cl9pZCk7Cit9CisKK1RyYWNpbmdTZXJ2aWNlSW1wbDo6RGF0YVNvdXJjZUluc3RhbmNlKiBUcmFj
aW5nU2VydmljZUltcGw6OlNldHVwRGF0YVNvdXJjZSgKKyAgICBjb25zdCBUcmFjZUNvbmZpZzo6
RGF0YVNvdXJjZSYgY2ZnX2RhdGFfc291cmNlLAorICAgIGNvbnN0IFRyYWNlQ29uZmlnOjpQcm9k
dWNlckNvbmZpZyYgcHJvZHVjZXJfY29uZmlnLAorICAgIGNvbnN0IFJlZ2lzdGVyZWREYXRhU291
cmNlJiBkYXRhX3NvdXJjZSwKKyAgICBUcmFjaW5nU2Vzc2lvbiogdHJhY2luZ19zZXNzaW9uKSB7
CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgUHJvZHVjZXJF
bmRwb2ludEltcGwqIHByb2R1Y2VyID0gR2V0UHJvZHVjZXIoZGF0YV9zb3VyY2UucHJvZHVjZXJf
aWQpOworICBQRVJGRVRUT19EQ0hFQ0socHJvZHVjZXIpOworICAvLyBBbiBleGlzdGluZyBwcm9k
dWNlciB0aGF0IGlzIG5vdCBmdHJhY2UgY291bGQgaGF2ZSByZWdpc3RlcmVkIGl0c2VsZiBhcwor
ICAvLyBmdHJhY2UsIHdlIG11c3Qgbm90IGVuYWJsZSBpdCBpbiB0aGF0IGNhc2UuCisgIGlmIChs
b2NrZG93bl9tb2RlXyAmJiBwcm9kdWNlci0+dWlkXyAhPSB1aWRfKSB7CisgICAgUEVSRkVUVE9f
RExPRygiTG9ja2Rvd24gbW9kZTogbm90IGVuYWJsaW5nIHByb2R1Y2VyICVodSIsIHByb2R1Y2Vy
LT5pZF8pOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIC8vIFRPRE8ocHJpbWlhbm8pOiBB
ZGQgdGVzdHMgZm9yIHJlZ2lzdHJhdGlvbiBvcmRlcmluZyAoZGF0YSBzb3VyY2VzIHZzCisgIC8v
IGNvbnN1bWVycykuCisgIGlmICghTmFtZU1hdGNoZXNGaWx0ZXIocHJvZHVjZXItPm5hbWVfLAor
ICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ19kYXRhX3NvdXJjZS5wcm9kdWNlcl9uYW1lX2Zp
bHRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ19kYXRhX3NvdXJjZS5wcm9kdWNl
cl9uYW1lX3JlZ2V4X2ZpbHRlcigpKSkgeworICAgIFBFUkZFVFRPX0RMT0coIkRhdGEgc291cmNl
OiAlcyBpcyBmaWx0ZXJlZCBvdXQgZm9yIHByb2R1Y2VyOiAlcyIsCisgICAgICAgICAgICAgICAg
ICBjZmdfZGF0YV9zb3VyY2UuY29uZmlnKCkubmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAg
ICAgICBwcm9kdWNlci0+bmFtZV8uY19zdHIoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0K
KworICBhdXRvIHJlbGF0aXZlX2J1ZmZlcl9pZCA9IGNmZ19kYXRhX3NvdXJjZS5jb25maWcoKS50
YXJnZXRfYnVmZmVyKCk7CisgIGlmIChyZWxhdGl2ZV9idWZmZXJfaWQgPj0gdHJhY2luZ19zZXNz
aW9uLT5udW1fYnVmZmVycygpKSB7CisgICAgUEVSRkVUVE9fTE9HKAorICAgICAgICAiVGhlIFRy
YWNlQ29uZmlnIGZvciBEYXRhU291cmNlICVzIHNwZWNpZmllZCBhIHRhcmdldF9idWZmZXIgb3V0
IG9mICIKKyAgICAgICAgImJvdW5kICglZCkuIFNraXBwaW5nIGl0LiIsCisgICAgICAgIGNmZ19k
YXRhX3NvdXJjZS5jb25maWcoKS5uYW1lKCkuY19zdHIoKSwgcmVsYXRpdmVfYnVmZmVyX2lkKTsK
KyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIERh
dGFTb3VyY2VDb25maWcgc3BlY2lmaWVkIGluIHRoZSB0cmFjZSBjb25maWcuIFRoaXMKKyAgLy8g
d2lsbCBiZSBwYXNzZWQgdG8gdGhlIHByb2R1Y2VyIGFmdGVyIHRyYW5zbGF0aW5nIHRoZSB8dGFy
Z2V0X2J1ZmZlcnwgaWQuCisgIC8vIFRoZSB8dGFyZ2V0X2J1ZmZlcnwgcGFyYW1ldGVyIHBhc3Nl
ZCBieSB0aGUgY29uc3VtZXIgaW4gdGhlIHRyYWNlIGNvbmZpZyBpcworICAvLyByZWxhdGl2ZSB0
byB0aGUgYnVmZmVycyBkZWNsYXJlZCBpbiB0aGUgc2FtZSB0cmFjZSBjb25maWcuIFRoaXMgaGFz
IHRvIGJlCisgIC8vIHRyYW5zbGF0ZWQgdG8gdGhlIGdsb2JhbCBCdWZmZXJJRCBiZWZvcmUgcGFz
c2luZyBpdCB0byB0aGUgcHJvZHVjZXJzLCB3aGljaAorICAvLyBkb24ndCBrbm93IGFueXRoaW5n
IGFib3V0IHRyYWNpbmcgc2Vzc2lvbnMgYW5kIGNvbnN1bWVycy4KKworICBEYXRhU291cmNlSW5z
dGFuY2VJRCBpbnN0X2lkID0gKytsYXN0X2RhdGFfc291cmNlX2luc3RhbmNlX2lkXzsKKyAgYXV0
byBpbnNlcnRfaXRlciA9IHRyYWNpbmdfc2Vzc2lvbi0+ZGF0YV9zb3VyY2VfaW5zdGFuY2VzLmVt
cGxhY2UoCisgICAgICBzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsICAvLworICAgICAgc3RkOjpm
b3J3YXJkX2FzX3R1cGxlKHByb2R1Y2VyLT5pZF8pLAorICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1
cGxlKAorICAgICAgICAgIGluc3RfaWQsCisgICAgICAgICAgY2ZnX2RhdGFfc291cmNlLmNvbmZp
ZygpLCAgLy8gIERlbGliZXJhdGUgY29weS4KKyAgICAgICAgICBkYXRhX3NvdXJjZS5kZXNjcmlw
dG9yLm5hbWUoKSwKKyAgICAgICAgICBkYXRhX3NvdXJjZS5kZXNjcmlwdG9yLndpbGxfbm90aWZ5
X29uX3N0YXJ0KCksCisgICAgICAgICAgZGF0YV9zb3VyY2UuZGVzY3JpcHRvci53aWxsX25vdGlm
eV9vbl9zdG9wKCksCisgICAgICAgICAgZGF0YV9zb3VyY2UuZGVzY3JpcHRvci5oYW5kbGVzX2lu
Y3JlbWVudGFsX3N0YXRlX2NsZWFyKCkpKTsKKyAgRGF0YVNvdXJjZUluc3RhbmNlKiBkc19pbnN0
YW5jZSA9ICZpbnNlcnRfaXRlci0+c2Vjb25kOworCisgIC8vIE5ldyBkYXRhIHNvdXJjZSBpbnN0
YW5jZSBzdGFydHMgb3V0IGluIENPTkZJR1VSRUQgc3RhdGUuCisgIGlmICh0cmFjaW5nX3Nlc3Np
b24tPmNvbnN1bWVyX21heWJlX251bGwpIHsKKyAgICB0cmFjaW5nX3Nlc3Npb24tPmNvbnN1bWVy
X21heWJlX251bGwtPk9uRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2UoCisgICAgICAgICpw
cm9kdWNlciwgKmRzX2luc3RhbmNlKTsKKyAgfQorCisgIERhdGFTb3VyY2VDb25maWcmIGRzX2Nv
bmZpZyA9IGRzX2luc3RhbmNlLT5jb25maWc7CisgIGRzX2NvbmZpZy5zZXRfdHJhY2VfZHVyYXRp
b25fbXModHJhY2luZ19zZXNzaW9uLT5jb25maWcuZHVyYXRpb25fbXMoKSk7CisgIGRzX2NvbmZp
Zy5zZXRfc3RvcF90aW1lb3V0X21zKHRyYWNpbmdfc2Vzc2lvbi0+ZGF0YV9zb3VyY2Vfc3RvcF90
aW1lb3V0X21zKCkpOworICBkc19jb25maWcuc2V0X2VuYWJsZV9leHRyYV9ndWFyZHJhaWxzKAor
ICAgICAgdHJhY2luZ19zZXNzaW9uLT5jb25maWcuZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKSk7
CisgIGRzX2NvbmZpZy5zZXRfdHJhY2luZ19zZXNzaW9uX2lkKHRyYWNpbmdfc2Vzc2lvbi0+aWQp
OworICBCdWZmZXJJRCBnbG9iYWxfaWQgPSB0cmFjaW5nX3Nlc3Npb24tPmJ1ZmZlcnNfaW5kZXhb
cmVsYXRpdmVfYnVmZmVyX2lkXTsKKyAgUEVSRkVUVE9fRENIRUNLKGdsb2JhbF9pZCk7CisgIGRz
X2NvbmZpZy5zZXRfdGFyZ2V0X2J1ZmZlcihnbG9iYWxfaWQpOworCisgIFBFUkZFVFRPX0RMT0co
IlNldHRpbmcgdXAgZGF0YSBzb3VyY2UgJXMgd2l0aCB0YXJnZXQgYnVmZmVyICUiIFBSSXUxNiwK
KyAgICAgICAgICAgICAgICBkc19jb25maWcubmFtZSgpLmNfc3RyKCksIGdsb2JhbF9pZCk7Cisg
IGlmICghcHJvZHVjZXItPnNoYXJlZF9tZW1vcnkoKSkgeworICAgIC8vIERldGVybWluZSB0aGUg
U01CIHBhZ2Ugc2l6ZS4gTXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIDRrLgorICAgIC8v
IEFzIGZvciB0aGUgU01CIHNpemUgYmVsb3csIHRoZSBkZWNpc2lvbiB0cmVlIGlzIGFzIGZvbGxv
d3M6CisgICAgLy8gMS4gR2l2ZSBwcmlvcml0eSB0byB3aGF0IGlzIGRlZmluZWQgaW4gdGhlIHRy
YWNlIGNvbmZpZy4KKyAgICAvLyAyLiBJZiB1bnNldCBnaXZlIHByaW9yaXR5IHRvIHRoZSBoaW50
IHBhc3NlZCBieSB0aGUgcHJvZHVjZXIuCisgICAgLy8gMy4gS2VlcCB3aXRoaW4gYm91bmRzIGFu
ZCBlbnN1cmUgaXQncyBhIG11bHRpcGxlIG9mIDRrLgorICAgIHNpemVfdCBwYWdlX3NpemUgPSBw
cm9kdWNlcl9jb25maWcucGFnZV9zaXplX2tiKCkgKiAxMDI0OworICAgIGlmIChwYWdlX3NpemUg
PT0gMCkKKyAgICAgIHBhZ2Vfc2l6ZSA9IHByb2R1Y2VyLT5zaG1lbV9wYWdlX3NpemVfaGludF9i
eXRlc187CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIFNNQiBzaXplLiBNdXN0IGJlIGFuIGludGVn
ZXIgbXVsdGlwbGUgb2YgdGhlIFNNQiBwYWdlIHNpemUuCisgICAgLy8gVGhlIGRlY2lzaW9uIHRy
ZWUgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxLiBHaXZlIHByaW9yaXR5IHRvIHdoYXQgZGVmaW5l
ZCBpbiB0aGUgdHJhY2UgY29uZmlnLgorICAgIC8vIDIuIElmIHVuc2V0IGdpdmUgcHJpb3JpdHkg
dG8gdGhlIGhpbnQgcGFzc2VkIGJ5IHRoZSBwcm9kdWNlci4KKyAgICAvLyAzLiBLZWVwIHdpdGhp
biBib3VuZHMgYW5kIGVuc3VyZSBpdCdzIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZS4KKyAg
ICBzaXplX3Qgc2htX3NpemUgPSBwcm9kdWNlcl9jb25maWcuc2htX3NpemVfa2IoKSAqIDEwMjQ7
CisgICAgaWYgKHNobV9zaXplID09IDApCisgICAgICBzaG1fc2l6ZSA9IHByb2R1Y2VyLT5zaG1l
bV9zaXplX2hpbnRfYnl0ZXNfOworCisgICAgYXV0byB2YWxpZF9zaXplcyA9IEVuc3VyZVZhbGlk
U2htU2l6ZXMoc2htX3NpemUsIHBhZ2Vfc2l6ZSk7CisgICAgaWYgKHZhbGlkX3NpemVzICE9IHN0
ZDo6dGllKHNobV9zaXplLCBwYWdlX3NpemUpKSB7CisgICAgICBQRVJGRVRUT19ETE9HKAorICAg
ICAgICAgICJJbnZhbGlkIGNvbmZpZ3VyZWQgU01CIHNpemVzOiBzaG1fc2l6ZSAlenUgcGFnZV9z
aXplICV6dS4gRmFsbGluZyAiCisgICAgICAgICAgImJhY2sgdG8gc2htX3NpemUgJXp1IHBhZ2Vf
c2l6ZSAlenUuIiwKKyAgICAgICAgICBzaG1fc2l6ZSwgcGFnZV9zaXplLCBzdGQ6OmdldDwwPih2
YWxpZF9zaXplcyksCisgICAgICAgICAgc3RkOjpnZXQ8MT4odmFsaWRfc2l6ZXMpKTsKKyAgICB9
CisgICAgc3RkOjp0aWUoc2htX3NpemUsIHBhZ2Vfc2l6ZSkgPSB2YWxpZF9zaXplczsKKworICAg
IC8vIFRPRE8ocHJpbWlhbm8pOiByaWdodCBub3cgQ3JlYXRlKCkgd2lsbCBzdWljaWRlIGluIGNh
c2Ugb2YgT09NIGlmIHRoZQorICAgIC8vIG1tYXAgZmFpbHMuIFdlIHNob3VsZCBpbnN0ZWFkIGdy
YWNlZnVsbHkgZmFpbCB0aGUgcmVxdWVzdCBhbmQgdGVsbCB0aGUKKyAgICAvLyBjbGllbnQgdG8g
Z28gYXdheS4KKyAgICBQRVJGRVRUT19ETE9HKCJDcmVhdGluZyBTTUIgb2YgJXp1IEtCIGZvciBw
cm9kdWNlciBcIiVzXCIiLCBzaG1fc2l6ZSAvIDEwMjQsCisgICAgICAgICAgICAgICAgICBwcm9k
dWNlci0+bmFtZV8uY19zdHIoKSk7CisgICAgYXV0byBzaGFyZWRfbWVtb3J5ID0gc2htX2ZhY3Rv
cnlfLT5DcmVhdGVTaGFyZWRNZW1vcnkoc2htX3NpemUpOworICAgIHByb2R1Y2VyLT5TZXR1cFNo
YXJlZE1lbW9yeShzdGQ6Om1vdmUoc2hhcmVkX21lbW9yeSksIHBhZ2Vfc2l6ZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLypwcm92aWRlZF9ieV9wcm9kdWNlcj0qL2ZhbHNlKTsK
KyAgfQorICBwcm9kdWNlci0+U2V0dXBEYXRhU291cmNlKGluc3RfaWQsIGRzX2NvbmZpZyk7Cisg
IHJldHVybiBkc19pbnN0YW5jZTsKK30KKworLy8gTm90ZTogYWxsIHRoZSBmaWVsZHMgJSAqX3Ry
dXN0ZWQgb25lcyBhcmUgdW50cnVzdGVkLCBhcyBpbiwgdGhlIFByb2R1Y2VyCisvLyBtaWdodCBi
ZSBseWluZyAvIHJldHVybmluZyBnYXJiYWdlIGNvbnRlbnRzLiB8c3JjfCBhbmQgfHNpemV8IGNh
biBiZSB0cnVzdGVkCisvLyBpbiB0ZXJtcyBvZiBiZWluZyBhIHZhbGlkIHBvaW50ZXIsIGJ1dCBu
b3QgdGhlIGNvbnRlbnRzLgordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OkNvcHlQcm9kdWNlclBh
Z2VJbnRvTG9nQnVmZmVyKAorICAgIFByb2R1Y2VySUQgcHJvZHVjZXJfaWRfdHJ1c3RlZCwKKyAg
ICB1aWRfdCBwcm9kdWNlcl91aWRfdHJ1c3RlZCwKKyAgICBXcml0ZXJJRCB3cml0ZXJfaWQsCisg
ICAgQ2h1bmtJRCBjaHVua19pZCwKKyAgICBCdWZmZXJJRCBidWZmZXJfaWQsCisgICAgdWludDE2
X3QgbnVtX2ZyYWdtZW50cywKKyAgICB1aW50OF90IGNodW5rX2ZsYWdzLAorICAgIGJvb2wgY2h1
bmtfY29tcGxldGUsCisgICAgY29uc3QgdWludDhfdCogc3JjLAorICAgIHNpemVfdCBzaXplKSB7
CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKworICBQcm9kdWNl
ckVuZHBvaW50SW1wbCogcHJvZHVjZXIgPSBHZXRQcm9kdWNlcihwcm9kdWNlcl9pZF90cnVzdGVk
KTsKKyAgaWYgKCFwcm9kdWNlcikgeworICAgIFBFUkZFVFRPX0RGQVRBTCgiUHJvZHVjZXIgbm90
IGZvdW5kLiIpOworICAgIGNodW5rc19kaXNjYXJkZWRfKys7CisgICAgcmV0dXJuOworICB9CisK
KyAgVHJhY2VCdWZmZXIqIGJ1ZiA9IEdldEJ1ZmZlckJ5SUQoYnVmZmVyX2lkKTsKKyAgaWYgKCFi
dWYpIHsKKyAgICBQRVJGRVRUT19ETE9HKCJDb3VsZCBub3QgZmluZCB0YXJnZXQgYnVmZmVyICUi
IFBSSXUxNgorICAgICAgICAgICAgICAgICAgIiBmb3IgcHJvZHVjZXIgJSIgUFJJdTE2LAorICAg
ICAgICAgICAgICAgICAgYnVmZmVyX2lkLCBwcm9kdWNlcl9pZF90cnVzdGVkKTsKKyAgICBjaHVu
a3NfZGlzY2FyZGVkXysrOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFZlcmlmeSB0aGF0IHRo
ZSBwcm9kdWNlciBpcyBhY3R1YWxseSBhbGxvd2VkIHRvIHdyaXRlIGludG8gdGhlIHRhcmdldAor
ICAvLyBidWZmZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBUaGlzIHByZXZlbnRzIGEgbWFs
aWNpb3VzIHByb2R1Y2VyIGZyb20KKyAgLy8gaW5qZWN0aW5nIGRhdGEgaW50byBhIGxvZyBidWZm
ZXIgdGhhdCBiZWxvbmdzIHRvIGEgdHJhY2luZyBzZXNzaW9uIHRoZQorICAvLyBwcm9kdWNlciBp
cyBub3QgcGFydCBvZi4KKyAgaWYgKCFwcm9kdWNlci0+aXNfYWxsb3dlZF90YXJnZXRfYnVmZmVy
KGJ1ZmZlcl9pZCkpIHsKKyAgICBQRVJGRVRUT19FTE9HKCJQcm9kdWNlciAlIiBQUkl1MTYKKyAg
ICAgICAgICAgICAgICAgICIgdHJpZWQgdG8gd3JpdGUgaW50byBmb3JiaWRkZW4gdGFyZ2V0IGJ1
ZmZlciAlIiBQUkl1MTYsCisgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9pZF90cnVzdGVkLCBi
dWZmZXJfaWQpOworICAgIFBFUkZFVFRPX0RGQVRBTCgiRm9yYmlkZGVuIHRhcmdldCBidWZmZXIi
KTsKKyAgICBjaHVua3NfZGlzY2FyZGVkXysrOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElm
IHRoZSB3cml0ZXIgd2FzIHJlZ2lzdGVyZWQgYnkgdGhlIHByb2R1Y2VyLCBpdCBzaG91bGQgb25s
eSB3cml0ZSBpbnRvIHRoZQorICAvLyBidWZmZXIgaXQgd2FzIHJlZ2lzdGVyZWQgd2l0aC4KKyAg
YmFzZTo6T3B0aW9uYWw8QnVmZmVySUQ+IGFzc29jaWF0ZWRfYnVmZmVyID0KKyAgICAgIHByb2R1
Y2VyLT5idWZmZXJfaWRfZm9yX3dyaXRlcih3cml0ZXJfaWQpOworICBpZiAoYXNzb2NpYXRlZF9i
dWZmZXIgJiYgKmFzc29jaWF0ZWRfYnVmZmVyICE9IGJ1ZmZlcl9pZCkgeworICAgIFBFUkZFVFRP
X0VMT0coIldyaXRlciAlIiBQUkl1MTYgIiBvZiBwcm9kdWNlciAlIiBQUkl1MTYKKyAgICAgICAg
ICAgICAgICAgICIgd2FzIHJlZ2lzdGVyZWQgdG8gd3JpdGUgaW50byB0YXJnZXQgYnVmZmVyICUi
IFBSSXUxNgorICAgICAgICAgICAgICAgICAgIiwgYnV0IHRyaWVkIHRvIHdyaXRlIGludG8gYnVm
ZmVyICUiIFBSSXUxNiwKKyAgICAgICAgICAgICAgICAgIHdyaXRlcl9pZCwgcHJvZHVjZXJfaWRf
dHJ1c3RlZCwgKmFzc29jaWF0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgYnVmZmVyX2lk
KTsKKyAgICBQRVJGRVRUT19ERkFUQUwoIldyb25nIHRhcmdldCBidWZmZXIiKTsKKyAgICBjaHVu
a3NfZGlzY2FyZGVkXysrOworICAgIHJldHVybjsKKyAgfQorCisgIGJ1Zi0+Q29weUNodW5rVW50
cnVzdGVkKHByb2R1Y2VyX2lkX3RydXN0ZWQsIHByb2R1Y2VyX3VpZF90cnVzdGVkLCB3cml0ZXJf
aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2lkLCBudW1fZnJhZ21lbnRzLCBj
aHVua19mbGFncywgY2h1bmtfY29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNy
Yywgc2l6ZSk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpBcHBseUNodW5rUGF0Y2hl
cygKKyAgICBQcm9kdWNlcklEIHByb2R1Y2VyX2lkX3RydXN0ZWQsCisgICAgY29uc3Qgc3RkOjp2
ZWN0b3I8Q29tbWl0RGF0YVJlcXVlc3Q6OkNodW5rVG9QYXRjaD4mIGNodW5rc190b19wYXRjaCkg
eworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisKKyAgZm9yIChj
b25zdCBhdXRvJiBjaHVuayA6IGNodW5rc190b19wYXRjaCkgeworICAgIGNvbnN0IENodW5rSUQg
Y2h1bmtfaWQgPSBzdGF0aWNfY2FzdDxDaHVua0lEPihjaHVuay5jaHVua19pZCgpKTsKKyAgICBj
b25zdCBXcml0ZXJJRCB3cml0ZXJfaWQgPSBzdGF0aWNfY2FzdDxXcml0ZXJJRD4oY2h1bmsud3Jp
dGVyX2lkKCkpOworICAgIFRyYWNlQnVmZmVyKiBidWYgPQorICAgICAgICBHZXRCdWZmZXJCeUlE
KHN0YXRpY19jYXN0PEJ1ZmZlcklEPihjaHVuay50YXJnZXRfYnVmZmVyKCkpKTsKKyAgICBzdGF0
aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8Q2h1bmtJRD46Om1heCgpID09IGtNYXhDaHVu
a0lELAorICAgICAgICAgICAgICAgICAgIkFkZCBhICd8fCBjaHVua19pZCA+IGtNYXhDaHVua0lE
JyBiZWxvdyBpZiB0aGlzIGZhaWxzIik7CisgICAgaWYgKCF3cml0ZXJfaWQgfHwgd3JpdGVyX2lk
ID4ga01heFdyaXRlcklEIHx8ICFidWYpIHsKKyAgICAgIC8vIFRoaXMgY2FuIGdlbnVpbmVseSBo
YXBwZW4gd2hlbiB0aGUgdHJhY2UgaXMgc3RvcHBlZC4gVGhlIHByb2R1Y2VycworICAgICAgLy8g
bWlnaHQgc2VlIHRoZSBzdG9wIHNpZ25hbCB3aXRoIHNvbWUgZGVsYXkgYW5kIHRyeSB0byBrZWVw
IHNlbmRpbmcKKyAgICAgIC8vIHBhdGNoZXMgbGVmdCBzb29uIGFmdGVyLgorICAgICAgUEVSRkVU
VE9fRExPRygKKyAgICAgICAgICAiUmVjZWl2ZWQgaW52YWxpZCBjaHVua3NfdG9fcGF0Y2ggcmVx
dWVzdCBmcm9tIFByb2R1Y2VyOiAlIiBQUkl1MTYKKyAgICAgICAgICAiLCBCdWZmZXJJRDogJSIg
UFJJdTMyICIgQ2h1bmtkSUQ6ICUiIFBSSXUzMiAiIFdyaXRlcklEOiAlIiBQUkl1MTYsCisgICAg
ICAgICAgcHJvZHVjZXJfaWRfdHJ1c3RlZCwgY2h1bmsudGFyZ2V0X2J1ZmZlcigpLCBjaHVua19p
ZCwgd3JpdGVyX2lkKTsKKyAgICAgIHBhdGNoZXNfZGlzY2FyZGVkXyArPSBzdGF0aWNfY2FzdDx1
aW50NjRfdD4oY2h1bmsucGF0Y2hlc19zaXplKCkpOworICAgICAgY29udGludWU7CisgICAgfQor
CisgICAgLy8gTm90ZSwgdGhlcmUncyBubyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIHByb2R1
Y2VyIGlzIGFsbG93ZWQgdG8gd3JpdGUKKyAgICAvLyB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBJ
RCAob3IgdGhhdCBpdCdzIHRoZSBjb3JyZWN0IGJ1ZmZlciBJRCBmb3IgYQorICAgIC8vIHJlZ2lz
dGVyZWQgVHJhY2VXcml0ZXIpLiBUaGF0J3MgYmVjYXVzZSBUcmFjZUJ1ZmZlciB1c2VzIHRoZSBw
cm9kdWNlciBJRAorICAgIC8vIGFuZCB3cml0ZXIgSUQgdG8gbG9vayB1cCB0aGUgY2h1bmsgdG8g
cGF0Y2guIElmIHRoZSBwcm9kdWNlciBzcGVjaWZpZXMgYW4KKyAgICAvLyBpbmNvcnJlY3QgYnVm
ZmVyLCB0aGlzIGxvb2t1cCB3aWxsIGZhaWwgYW5kIFRyYWNlQnVmZmVyIHdpbGwgaWdub3JlIHRo
ZQorICAgIC8vIHBhdGNoZXMuIEJlY2F1c2UgdGhlIHByb2R1Y2VyIElEIGlzIHRydXN0ZWQsIHRo
ZXJlJ3MgYWxzbyBubyB3YXkgZm9yIGEKKyAgICAvLyBtYWxpY2lvdXMgcHJvZHVjZXIgdG8gcGF0
Y2ggYW5vdGhlciBwcm9kdWNlcidzIGRhdGEuCisKKyAgICAvLyBTcGVjdWxhdGUgb24gdGhlIGZh
Y3QgdGhhdCB0aGVyZSBhcmUgZ29pbmcgdG8gYmUgYSBsaW1pdGVkIGFtb3VudCBvZgorICAgIC8v
IHBhdGNoZXMgcGVyIHJlcXVlc3QsIHNvIHdlIGNhbiBhbGxvY2F0ZSB0aGUgfHBhdGNoZXN8IGFy
cmF5IG9uIHRoZSBzdGFjay4KKyAgICBzdGQ6OmFycmF5PFRyYWNlQnVmZmVyOjpQYXRjaCwgMTAy
ND4gcGF0Y2hlczsgIC8vIFVuaW5pdGlhbGl6ZWQuCisgICAgaWYgKGNodW5rLnBhdGNoZXMoKS5z
aXplKCkgPiBwYXRjaGVzLnNpemUoKSkgeworICAgICAgUEVSRkVUVE9fRUxPRygiVG9vIG1hbnkg
cGF0Y2hlcyAoJXp1KSBiYXRjaGVkIGluIHRoZSBzYW1lIHJlcXVlc3QiLAorICAgICAgICAgICAg
ICAgICAgICBwYXRjaGVzLnNpemUoKSk7CisgICAgICBQRVJGRVRUT19ERkFUQUwoIlRvbyBtYW55
IHBhdGNoZXMiKTsKKyAgICAgIHBhdGNoZXNfZGlzY2FyZGVkXyArPSBzdGF0aWNfY2FzdDx1aW50
NjRfdD4oY2h1bmsucGF0Y2hlc19zaXplKCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisg
ICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgcGF0Y2ggOiBjaHVuay5wYXRj
aGVzKCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRjaF9kYXRhID0gcGF0Y2guZGF0
YSgpOworICAgICAgaWYgKHBhdGNoX2RhdGEuc2l6ZSgpICE9IHBhdGNoZXNbaV0uZGF0YS5zaXpl
KCkpIHsKKyAgICAgICAgUEVSRkVUVE9fRUxPRygiUmVjZWl2ZWQgcGF0Y2ggZnJvbSBwcm9kdWNl
cjogJSIgUFJJdTE2CisgICAgICAgICAgICAgICAgICAgICAgIiBvZiB1bmV4cGVjdGVkIHNpemUg
JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9pZF90cnVzdGVkLCBwYXRjaF9k
YXRhLnNpemUoKSk7CisgICAgICAgIHBhdGNoZXNfZGlzY2FyZGVkXysrOworICAgICAgICBjb250
aW51ZTsKKyAgICAgIH0KKyAgICAgIHBhdGNoZXNbaV0ub2Zmc2V0X3VudHJ1c3RlZCA9IHBhdGNo
Lm9mZnNldCgpOworICAgICAgbWVtY3B5KCZwYXRjaGVzW2ldLmRhdGFbMF0sIHBhdGNoX2RhdGEu
ZGF0YSgpLCBwYXRjaGVzW2ldLmRhdGEuc2l6ZSgpKTsKKyAgICAgIGkrKzsKKyAgICB9CisgICAg
YnVmLT5UcnlQYXRjaENodW5rQ29udGVudHMocHJvZHVjZXJfaWRfdHJ1c3RlZCwgd3JpdGVyX2lk
LCBjaHVua19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2hlc1swXSwg
aSwgY2h1bmsuaGFzX21vcmVfcGF0Y2hlcygpKTsKKyAgfQorfQorCitUcmFjaW5nU2VydmljZUlt
cGw6OlRyYWNpbmdTZXNzaW9uKiBUcmFjaW5nU2VydmljZUltcGw6OkdldERldGFjaGVkU2Vzc2lv
bigKKyAgICB1aWRfdCB1aWQsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeworICBQRVJG
RVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGZvciAoYXV0byYga3YgOiB0
cmFjaW5nX3Nlc3Npb25zXykgeworICAgIFRyYWNpbmdTZXNzaW9uKiBzZXNzaW9uID0gJmt2LnNl
Y29uZDsKKyAgICBpZiAoc2Vzc2lvbi0+Y29uc3VtZXJfdWlkID09IHVpZCAmJiBzZXNzaW9uLT5k
ZXRhY2hfa2V5ID09IGtleSkgeworICAgICAgUEVSRkVUVE9fRENIRUNLKHNlc3Npb24tPmNvbnN1
bWVyX21heWJlX251bGwgPT0gbnVsbHB0cik7CisgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICB9
CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK1RyYWNpbmdTZXJ2aWNlSW1wbDo6VHJhY2lu
Z1Nlc3Npb24qIFRyYWNpbmdTZXJ2aWNlSW1wbDo6R2V0VHJhY2luZ1Nlc3Npb24oCisgICAgVHJh
Y2luZ1Nlc3Npb25JRCB0c2lkKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2No
ZWNrZXJfKTsKKyAgYXV0byBpdCA9IHRzaWQgPyB0cmFjaW5nX3Nlc3Npb25zXy5maW5kKHRzaWQp
IDogdHJhY2luZ19zZXNzaW9uc18uZW5kKCk7CisgIGlmIChpdCA9PSB0cmFjaW5nX3Nlc3Npb25z
Xy5lbmQoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuICZpdC0+c2Vjb25kOworfQor
CitQcm9kdWNlcklEIFRyYWNpbmdTZXJ2aWNlSW1wbDo6R2V0TmV4dFByb2R1Y2VySUQoKSB7Cisg
IFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgUEVSRkVUVE9fQ0hF
Q0socHJvZHVjZXJzXy5zaXplKCkgPCBrTWF4UHJvZHVjZXJJRCk7CisgIGRvIHsKKyAgICArK2xh
c3RfcHJvZHVjZXJfaWRfOworICB9IHdoaWxlIChwcm9kdWNlcnNfLmNvdW50KGxhc3RfcHJvZHVj
ZXJfaWRfKSB8fCBsYXN0X3Byb2R1Y2VyX2lkXyA9PSAwKTsKKyAgUEVSRkVUVE9fRENIRUNLKGxh
c3RfcHJvZHVjZXJfaWRfID4gMCAmJiBsYXN0X3Byb2R1Y2VyX2lkXyA8PSBrTWF4UHJvZHVjZXJJ
RCk7CisgIHJldHVybiBsYXN0X3Byb2R1Y2VyX2lkXzsKK30KKworVHJhY2VCdWZmZXIqIFRyYWNp
bmdTZXJ2aWNlSW1wbDo6R2V0QnVmZmVyQnlJRChCdWZmZXJJRCBidWZmZXJfaWQpIHsKKyAgYXV0
byBidWZfaXRlciA9IGJ1ZmZlcnNfLmZpbmQoYnVmZmVyX2lkKTsKKyAgaWYgKGJ1Zl9pdGVyID09
IGJ1ZmZlcnNfLmVuZCgpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gJipidWZfaXRl
ci0+c2Vjb25kOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6T25TdGFydFRyaWdnZXJz
VGltZW91dChUcmFjaW5nU2Vzc2lvbklEIHRzaWQpIHsKKyAgLy8gU2tpcCBlbnRpcmVseSB0aGUg
Zmx1c2ggaWYgdGhlIHRyYWNlIHNlc3Npb24gZG9lc24ndCBleGlzdCBhbnltb3JlLgorICAvLyBU
aGlzIGlzIHRvIHByZXZlbnQgbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlcyB0byBiZSBsb2dnZWQu
CisgIC8vCisgIC8vIGlmIHRoZSB0cmFjZSBoYXMgc3RhcnRlZCBmcm9tIHRoZSB0cmlnZ2VyIHdl
IHJlbHkgb24KKyAgLy8gdGhlIHxzdG9wX2RlbGF5X21zfCBmcm9tIHRoZSB0cmlnZ2VyIHNvIGRv
bid0IGZsdXNoIGFuZAorICAvLyBkaXNhYmxlIGlmIHdlJ3ZlIG1vdmVkIGJleW9uZCBhIENPTkZJ
R1VSRUQgc3RhdGUKKyAgYXV0byogdHJhY2luZ19zZXNzaW9uX3B0ciA9IEdldFRyYWNpbmdTZXNz
aW9uKHRzaWQpOworICBpZiAodHJhY2luZ19zZXNzaW9uX3B0ciAmJgorICAgICAgdHJhY2luZ19z
ZXNzaW9uX3B0ci0+c3RhdGUgPT0gVHJhY2luZ1Nlc3Npb246OkNPTkZJR1VSRUQpIHsKKyAgICBQ
RVJGRVRUT19ETE9HKCJEaXNhYmxpbmcgVHJhY2luZ1Nlc3Npb24gJSIgUFJJdTY0CisgICAgICAg
ICAgICAgICAgICAiIHNpbmNlIG5vIHRyaWdnZXJzIGFjdGl2YXRlZC4iLAorICAgICAgICAgICAg
ICAgICAgdHNpZCk7CisgICAgLy8gTm8gZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSBSZWFk
QnVmZmVycygpIHJlZ2FyZGxlc3Mgb2YgaWYgd2UKKyAgICAvLyBjYWxsIEZyZWVCdWZmZXJzKCkg
b3IgRGlzYWJsZVRyYWNpbmcoKS4gVGhpcyBpcyBiZWNhdXNlIGluCisgICAgLy8gU1RPUF9UUkFD
SU5HIHdlIG5lZWQgdGhpcyBwcm9taXNlIGluIGVpdGhlciBjYXNlLCBhbmQgdXNpbmcKKyAgICAv
LyBEaXNhYmxlVHJhY2luZygpIGFsbG93cyBhIGdyYWNlZnVsIHNodXRkb3duLiBDb25zdW1lcnMg
Y2FuIGZvbGxvdworICAgIC8vIHRoZWlyIG5vcm1hbCBwYXRoIGFuZCBjaGVjayB0aGUgYnVmZmVy
cyB0aHJvdWdoIFJlYWRCdWZmZXJzKCkgYW5kCisgICAgLy8gdGhlIGNvZGUgd29uJ3QgaGFuZyBi
ZWNhdXNlIHRoZSB0cmFjaW5nIHNlc3Npb24gd2lsbCBzdGlsbCBiZQorICAgIC8vIGFsaXZlIGp1
c3QgZGlzYWJsZWQuCisgICAgRGlzYWJsZVRyYWNpbmcodHNpZCk7CisgIH0KK30KKwordm9pZCBU
cmFjaW5nU2VydmljZUltcGw6OlVwZGF0ZU1lbW9yeUd1YXJkcmFpbCgpIHsKKyNpZiBQRVJGRVRU
T19CVUlMREZMQUcoUEVSRkVUVE9fV0FUQ0hET0cpCisgIHVpbnQ2NF90IHRvdGFsX2J1ZmZlcl9i
eXRlcyA9IDA7CisKKyAgLy8gU3VtIHVwIGFsbCB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXJzLgor
ICBmb3IgKGNvbnN0IGF1dG8mIGlkX3RvX3Byb2R1Y2VyIDogcHJvZHVjZXJzXykgeworICAgIGlm
IChpZF90b19wcm9kdWNlci5zZWNvbmQtPnNoYXJlZF9tZW1vcnkoKSkKKyAgICAgIHRvdGFsX2J1
ZmZlcl9ieXRlcyArPSBpZF90b19wcm9kdWNlci5zZWNvbmQtPnNoYXJlZF9tZW1vcnkoKS0+c2l6
ZSgpOworICB9CisKKyAgLy8gU3VtIHVwIGFsbCB0aGUgdHJhY2UgYnVmZmVycy4KKyAgZm9yIChj
b25zdCBhdXRvJiBpZF90b19idWZmZXIgOiBidWZmZXJzXykgeworICAgIHRvdGFsX2J1ZmZlcl9i
eXRlcyArPSBpZF90b19idWZmZXIuc2Vjb25kLT5zaXplKCk7CisgIH0KKworICAvLyBTZXQgdGhl
IGd1YXJkIHJhaWwgdG8gMzJNQiArIHRoZSBzdW0gb2YgYWxsIHRoZSBidWZmZXJzIG92ZXIgYSAz
MCBzZWNvbmQKKyAgLy8gaW50ZXJ2YWwuCisgIHVpbnQ2NF90IGd1YXJkcmFpbCA9IGJhc2U6OmtX
YXRjaGRvZ0RlZmF1bHRNZW1vcnlTbGFjayArIHRvdGFsX2J1ZmZlcl9ieXRlczsKKyAgYmFzZTo6
V2F0Y2hkb2c6OkdldEluc3RhbmNlKCktPlNldE1lbW9yeUxpbWl0KGd1YXJkcmFpbCwgMzAgKiAx
MDAwKTsKKyNlbmRpZgorfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6UGVyaW9kaWNTbmFw
c2hvdFRhc2soVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lvbiwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2luaXRpYWxfc25hcHNob3Qp
IHsKKyAgdHJhY2luZ19zZXNzaW9uLT5zaG91bGRfZW1pdF9zeW5jX21hcmtlciA9IHRydWU7Cisg
IHRyYWNpbmdfc2Vzc2lvbi0+c2hvdWxkX2VtaXRfc3RhdHMgPSB0cnVlOworCisgIGlmICghdHJh
Y2luZ19zZXNzaW9uLT5jb25maWcuYnVpbHRpbl9kYXRhX3NvdXJjZXMoKQorICAgICAgICAgICAu
ZGlzYWJsZV9jbG9ja19zbmFwc2hvdHRpbmcoKSkgeworICAgIGlmIChpc19pbml0aWFsX3NuYXBz
aG90KQorICAgICAgU25hcHNob3RDbG9ja3MoJnRyYWNpbmdfc2Vzc2lvbi0+aW5pdGlhbF9jbG9j
a19zbmFwc2hvdF8pOworICAgIFNuYXBzaG90Q2xvY2tzKCZ0cmFjaW5nX3Nlc3Npb24tPmxhc3Rf
Y2xvY2tfc25hcHNob3RfKTsKKyAgfQorCisgIHVpbnQzMl90IGludGVydmFsX21zID0KKyAgICAg
IHRyYWNpbmdfc2Vzc2lvbi0+Y29uZmlnLmJ1aWx0aW5fZGF0YV9zb3VyY2VzKCkuc25hcHNob3Rf
aW50ZXJ2YWxfbXMoKTsKKyAgaWYgKCFpbnRlcnZhbF9tcykKKyAgICBpbnRlcnZhbF9tcyA9IGtE
ZWZhdWx0U25hcHNob3RzSW50ZXJ2YWxNczsKKworICBUcmFjaW5nU2Vzc2lvbklEIHRzaWQgPSB0
cmFjaW5nX3Nlc3Npb24tPmlkOworICBhdXRvIHdlYWtfdGhpcyA9IHdlYWtfcHRyX2ZhY3Rvcnlf
LkdldFdlYWtQdHIoKTsKKyAgdGFza19ydW5uZXJfLT5Qb3N0RGVsYXllZFRhc2soCisgICAgICBb
d2Vha190aGlzLCB0c2lkXSB7CisgICAgICAgIGlmICghd2Vha190aGlzKQorICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgYXV0byogdHJhY2luZ19zZXNzaW9uX3B0ciA9IHdlYWtfdGhpcy0+R2V0
VHJhY2luZ1Nlc3Npb24odHNpZCk7CisgICAgICAgIGlmICghdHJhY2luZ19zZXNzaW9uX3B0cikK
KyAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICh0cmFjaW5nX3Nlc3Npb25fcHRyLT5zdGF0
ZSAhPSBUcmFjaW5nU2Vzc2lvbjo6U1RBUlRFRCkKKyAgICAgICAgICByZXR1cm47CisgICAgICAg
IHdlYWtfdGhpcy0+UGVyaW9kaWNTbmFwc2hvdFRhc2sodHJhY2luZ19zZXNzaW9uX3B0ciwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzX2luaXRpYWxfc25hcHNo
b3Q9Ki9mYWxzZSk7CisgICAgICB9LAorICAgICAgaW50ZXJ2YWxfbXMgLSAoYmFzZTo6R2V0V2Fs
bFRpbWVNcygpLmNvdW50KCkgJSBpbnRlcnZhbF9tcykpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2
aWNlSW1wbDo6U25hcHNob3RTeW5jTWFya2VyKHN0ZDo6dmVjdG9yPFRyYWNlUGFja2V0PiogcGFj
a2V0cykgeworICAvLyBUaGUgc3luYyBtYXJrcyBhcmUgdXNlZCB0byB0b2tlbml6ZSBsYXJnZSB0
cmFjZXMgZWZmaWNpZW50bHkuCisgIC8vIFNlZSBkZXNjcmlwdGlvbiBpbiB0cmFjZV9wYWNrZXQu
cHJvdG8uCisgIGlmIChzeW5jX21hcmtlcl9wYWNrZXRfc2l6ZV8gPT0gMCkgeworICAgIC8vIFRo
ZSBtYXJrZXIgQUJJIGV4cGVjdHMgdGhhdCB0aGUgbWFya2VyIGlzIHdyaXR0ZW4gYWZ0ZXIgdGhl
IHVpZC4KKyAgICAvLyBQcm90b3plcm8gZ3VhcmFudGVlcyB0aGF0IGZpZWxkcyBhcmUgd3JpdHRl
biBpbiB0aGUgc2FtZSBvcmRlciBvZiB0aGUKKyAgICAvLyBjYWxscy4gVGhlIFJlc3luY2hyb25p
emVUcmFjZVN0cmVhbVVzaW5nU3luY01hcmtlciB0ZXN0IHZlcmlmaWVzIHRoZSBBQkkuCisgICAg
cHJvdG96ZXJvOjpTdGF0aWNCdWZmZXJlZDxwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXQ+IHBh
Y2tldCgKKyAgICAgICAgJnN5bmNfbWFya2VyX3BhY2tldF9bMF0sIHNpemVvZihzeW5jX21hcmtl
cl9wYWNrZXRfKSk7CisgICAgcGFja2V0LT5zZXRfdHJ1c3RlZF91aWQoc3RhdGljX2Nhc3Q8aW50
MzJfdD4odWlkXykpOworICAgIHBhY2tldC0+c2V0X3RydXN0ZWRfcGFja2V0X3NlcXVlbmNlX2lk
KGtTZXJ2aWNlUGFja2V0U2VxdWVuY2VJRCk7CisKKyAgICAvLyBLZWVwIHRoaXMgbGFzdC4KKyAg
ICBwYWNrZXQtPnNldF9zeW5jaHJvbml6YXRpb25fbWFya2VyKGtTeW5jTWFya2VyLCBzaXplb2Yo
a1N5bmNNYXJrZXIpKTsKKyAgICBzeW5jX21hcmtlcl9wYWNrZXRfc2l6ZV8gPSBwYWNrZXQuRmlu
YWxpemUoKTsKKyAgfQorICBwYWNrZXRzLT5lbXBsYWNlX2JhY2soKTsKKyAgcGFja2V0cy0+YmFj
aygpLkFkZFNsaWNlKCZzeW5jX21hcmtlcl9wYWNrZXRfWzBdLCBzeW5jX21hcmtlcl9wYWNrZXRf
c2l6ZV8pOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6U25hcHNob3RDbG9ja3MoCisg
ICAgVHJhY2luZ1Nlc3Npb246OkNsb2NrU25hcHNob3REYXRhKiBzbmFwc2hvdF9kYXRhKSB7Cisg
IC8vIE1pbmltdW0gZHJpZnQgdGhhdCBqdXN0aWZpZXMgcmVwbGFjaW5nIGEgcHJpb3IgY2xvY2sg
c25hcHNob3QgdGhhdCBoYXNuJ3QKKyAgLy8gYmVlbiBlbWl0dGVkIGludG8gdGhlIHRyYWNlIHll
dCAoc2VlIGNvbW1lbnQgYmVsb3cpLgorICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1NpZ25p
ZmljYW50RHJpZnROcyA9IDEwICogMTAwMCAqIDEwMDA7ICAvLyAxMCBtcworCisgIFRyYWNpbmdT
ZXNzaW9uOjpDbG9ja1NuYXBzaG90RGF0YSBuZXdfc25hcHNob3RfZGF0YTsKKworI2lmICFQRVJG
RVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTUFDT1NYKSAmJiBcCisgICAgIVBFUkZFVFRPX0JV
SUxERkxBRyhQRVJGRVRUT19PU19XSU4pICYmICAgIFwKKyAgICAhUEVSRkVUVE9fQlVJTERGTEFH
KFBFUkZFVFRPX09TX05BQ0wpCisgIHN0cnVjdCB7CisgICAgY2xvY2tpZF90IGlkOworICAgIHBy
b3Rvczo6cGJ6ZXJvOjpCdWlsdGluQ2xvY2sgdHlwZTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7
CisgIH0gY2xvY2tzW10gPSB7CisgICAgICB7Q0xPQ0tfQk9PVFRJTUUsIHByb3Rvczo6cGJ6ZXJv
OjpCVUlMVElOX0NMT0NLX0JPT1RUSU1FLCB7MCwgMH19LAorICAgICAge0NMT0NLX1JFQUxUSU1F
X0NPQVJTRSwKKyAgICAgICBwcm90b3M6OnBiemVybzo6QlVJTFRJTl9DTE9DS19SRUFMVElNRV9D
T0FSU0UsCisgICAgICAgezAsIDB9fSwKKyAgICAgIHtDTE9DS19NT05PVE9OSUNfQ09BUlNFLAor
ICAgICAgIHByb3Rvczo6cGJ6ZXJvOjpCVUlMVElOX0NMT0NLX01PTk9UT05JQ19DT0FSU0UsCisg
ICAgICAgezAsIDB9fSwKKyAgICAgIHtDTE9DS19SRUFMVElNRSwgcHJvdG9zOjpwYnplcm86OkJV
SUxUSU5fQ0xPQ0tfUkVBTFRJTUUsIHswLCAwfX0sCisgICAgICB7Q0xPQ0tfTU9OT1RPTklDLCBw
cm90b3M6OnBiemVybzo6QlVJTFRJTl9DTE9DS19NT05PVE9OSUMsIHswLCAwfX0sCisgICAgICB7
Q0xPQ0tfTU9OT1RPTklDX1JBVywKKyAgICAgICBwcm90b3M6OnBiemVybzo6QlVJTFRJTl9DTE9D
S19NT05PVE9OSUNfUkFXLAorICAgICAgIHswLCAwfX0sCisgIH07CisgIC8vIEZpcnN0IHNuYXBz
aG90IGFsbCB0aGUgY2xvY2tzIGFzIGF0b21pY2FsbHkgYXMgd2UgY2FuLgorICBmb3IgKGF1dG8m
IGNsb2NrIDogY2xvY2tzKSB7CisgICAgaWYgKGNsb2NrX2dldHRpbWUoY2xvY2suaWQsICZjbG9j
ay50cykgPT0gLTEpCisgICAgICBQRVJGRVRUT19ETE9HKCJjbG9ja19nZXR0aW1lIGZhaWxlZCBm
b3IgY2xvY2sgJWQiLCBjbG9jay5pZCk7CisgIH0KKyAgZm9yIChhdXRvJiBjbG9jayA6IGNsb2Nr
cykgeworICAgIG5ld19zbmFwc2hvdF9kYXRhLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNsb2NrLnR5cGUpLAorICAgICAgICBzdGF0aWNf
Y2FzdDx1aW50NjRfdD4oYmFzZTo6RnJvbVBvc2l4VGltZXNwZWMoY2xvY2sudHMpLmNvdW50KCkp
KSk7CisgIH0KKyNlbHNlICAgLy8gIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19NQUNP
U1gpICYmCisgICAgICAgIC8vICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lOKSAm
JgorICAgICAgICAvLyAhUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX05BQ0wpCisgIGF1
dG8gd2FsbF90aW1lX25zID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJhc2U6OkdldFdhbGxUaW1l
TnMoKS5jb3VudCgpKTsKKyAgLy8gVGhlIGRlZmF1bHQgdHJhY2UgY2xvY2sgaXMgYm9vdCB0aW1l
LCBzbyB3ZSBhbHdheXMgbmVlZCB0byBlbWl0IGEgcGF0aCB0bworICAvLyBpdC4gSG93ZXZlciBz
aW5jZSB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGEgYm9vdCB0aW1lIHNvdXJjZSBvbiB0aGVzZQor
ICAvLyBwbGF0Zm9ybXMsIHByZXRlbmQgdGhhdCB3YWxsIHRpbWUgZXF1YWxzIGJvb3QgdGltZS4K
KyAgbmV3X3NuYXBzaG90X2RhdGEucHVzaF9iYWNrKAorICAgICAgc3RkOjptYWtlX3BhaXIocHJv
dG9zOjpwYnplcm86OkJVSUxUSU5fQ0xPQ0tfQk9PVFRJTUUsIHdhbGxfdGltZV9ucykpOworICBu
ZXdfc25hcHNob3RfZGF0YS5wdXNoX2JhY2soCisgICAgICBzdGQ6Om1ha2VfcGFpcihwcm90b3M6
OnBiemVybzo6QlVJTFRJTl9DTE9DS19NT05PVE9OSUMsIHdhbGxfdGltZV9ucykpOworI2VuZGlm
ICAvLyAhUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX01BQ09TWCkgJiYKKyAgICAgICAg
Ly8gIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pICYmCisgICAgICAgIC8vICFQ
RVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTkFDTCkKKworICAvLyBJZiB3ZSdyZSBhYm91
dCB0byB1cGRhdGUgYSBzZXNzaW9uJ3MgbGF0ZXN0IGNsb2NrIHNuYXBzaG90IHRoYXQgaGFzbid0
IGJlZW4KKyAgLy8gZW1pdHRlZCBpbnRvIHRoZSB0cmFjZSB5ZXQsIGNoZWNrIHdoZXRoZXIgdGhl
IGNsb2NrcyBoYXZlIGRyaWZ0ZWQgZW5vdWdoIHRvCisgIC8vIHdhcnJhbnQgb3ZlcnJpZGluZyB0
aGUgY3VycmVudCBzbmFwc2hvdCB2YWx1ZXMuIFRoZSBvbGRlciBzbmFwc2hvdCB3b3VsZCBiZQor
ICAvLyB2YWxpZCBmb3IgYSBsYXJnZXIgcGFydCBvZiB0aGUgY3VycmVudGx5IGJ1ZmZlcmVkIHRy
YWNlIGRhdGEgYmVjYXVzZSB0aGUKKyAgLy8gY2xvY2sgc3luYyBwcm90b2NvbCBpbiB0cmFjZSBw
cm9jZXNzb3IgdXNlcyB0aGUgbGF0ZXN0IGNsb2NrIDw9IHRpbWVzdGFtcAorICAvLyB0byB0cmFu
c2xhdGUgdGltZXMgKHNlZSBodHRwczovL3BlcmZldHRvLmRldi9kb2NzL2NvbmNlcHRzL2Nsb2Nr
LXN5bmMpLCBzbworICAvLyB3ZSB0cnkgdG8ga2VlcCBpdCBpZiB3ZSBjYW4uCisgIGlmICghc25h
cHNob3RfZGF0YS0+ZW1wdHkoKSkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhzbmFwc2hvdF9kYXRh
LT5zaXplKCkgPT0gbmV3X3NuYXBzaG90X2RhdGEuc2l6ZSgpKTsKKyAgICBQRVJGRVRUT19EQ0hF
Q0soKCpzbmFwc2hvdF9kYXRhKVswXS5maXJzdCA9PQorICAgICAgICAgICAgICAgICAgICBwcm90
b3M6Omdlbjo6QlVJTFRJTl9DTE9DS19CT09UVElNRSk7CisKKyAgICBib29sIHVwZGF0ZV9zbmFw
c2hvdCA9IGZhbHNlOworICAgIHVpbnQ2NF90IG9sZF9ib290X25zID0gKCpzbmFwc2hvdF9kYXRh
KVswXS5zZWNvbmQ7CisgICAgdWludDY0X3QgbmV3X2Jvb3RfbnMgPSBuZXdfc25hcHNob3RfZGF0
YVswXS5zZWNvbmQ7CisgICAgaW50NjRfdCBib290X2RpZmYgPQorICAgICAgICBzdGF0aWNfY2Fz
dDxpbnQ2NF90PihuZXdfYm9vdF9ucykgLSBzdGF0aWNfY2FzdDxpbnQ2NF90PihvbGRfYm9vdF9u
cyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNuYXBzaG90X2RhdGEtPnNpemUoKTsg
aSsrKSB7CisgICAgICB1aW50NjRfdCBvbGRfbnMgPSAoKnNuYXBzaG90X2RhdGEpW2ldLnNlY29u
ZDsKKyAgICAgIHVpbnQ2NF90IG5ld19ucyA9IG5ld19zbmFwc2hvdF9kYXRhW2ldLnNlY29uZDsK
KworICAgICAgaW50NjRfdCBkaWZmID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pihu
ZXdfbnMpIC0gc3RhdGljX2Nhc3Q8aW50NjRfdD4ob2xkX25zKTsKKworICAgICAgLy8gQ29tcGFy
ZSB0aGUgYm9vdHRpbWUgZGVsdGEgYWdhaW5zdCB0aGUgZGVsdGEgb2YgdGhpcyBjbG9jay4KKyAg
ICAgIGlmIChzdGQ6OmFicyhib290X2RpZmYgLSBkaWZmKSA+PSBrU2lnbmlmaWNhbnREcmlmdE5z
KSB7CisgICAgICAgIHVwZGF0ZV9zbmFwc2hvdCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAg
ICAgfQorICAgIH0KKyAgICBpZiAoIXVwZGF0ZV9zbmFwc2hvdCkKKyAgICAgIHJldHVybjsKKyAg
ICBzbmFwc2hvdF9kYXRhLT5jbGVhcigpOworICB9CisKKyAgKnNuYXBzaG90X2RhdGEgPSBzdGQ6
Om1vdmUobmV3X3NuYXBzaG90X2RhdGEpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6
RW1pdENsb2NrU25hcHNob3QoCisgICAgVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lvbiwK
KyAgICBUcmFjaW5nU2Vzc2lvbjo6Q2xvY2tTbmFwc2hvdERhdGEgc25hcHNob3RfZGF0YSwKKyAg
ICBib29sIHNldF9yb290X3RpbWVzdGFtcCwKKyAgICBzdGQ6OnZlY3RvcjxUcmFjZVBhY2tldD4q
IHBhY2tldHMpIHsKKyAgcHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8cHJvdG9zOjpwYnplcm86OlRy
YWNlUGFja2V0PiBwYWNrZXQ7CisgIGlmIChzZXRfcm9vdF90aW1lc3RhbXApIHsKKyAgICAvLyBG
aXJzdCB0aW1lc3RhbXAgZnJvbSB0aGUgc25hcHNob3QgaXMgdGhlIGRlZmF1bHQgdGltZSBkb21h
aW4gKEJPT1RUSU1FIG9uCisgICAgLy8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQsIG9yIHdhbGx0
aW1lIG90aGVyd2lzZSkuCisgICAgUEVSRkVUVE9fRENIRUNLKHNuYXBzaG90X2RhdGFbMF0uZmly
c3QgPT0KKyAgICAgICAgICAgICAgICAgICAgcHJvdG9zOjpnZW46OkJVSUxUSU5fQ0xPQ0tfQk9P
VFRJTUUpOworICAgIHBhY2tldC0+c2V0X3RpbWVzdGFtcChzbmFwc2hvdF9kYXRhWzBdLnNlY29u
ZCk7CisgIH0KKworICBhdXRvKiBzbmFwc2hvdCA9IHBhY2tldC0+c2V0X2Nsb2NrX3NuYXBzaG90
KCk7CisKKyAgcHJvdG9zOjpnZW46OkJ1aWx0aW5DbG9jayB0cmFjZV9jbG9jayA9CisgICAgICB0
cmFjaW5nX3Nlc3Npb24tPmNvbmZpZy5idWlsdGluX2RhdGFfc291cmNlcygpLnByaW1hcnlfdHJh
Y2VfY2xvY2soKTsKKyAgaWYgKCF0cmFjZV9jbG9jaykKKyAgICB0cmFjZV9jbG9jayA9IHByb3Rv
czo6Z2VuOjpCVUlMVElOX0NMT0NLX0JPT1RUSU1FOworICBzbmFwc2hvdC0+c2V0X3ByaW1hcnlf
dHJhY2VfY2xvY2soCisgICAgICBzdGF0aWNfY2FzdDxwcm90b3M6OnBiemVybzo6QnVpbHRpbkNs
b2NrPih0cmFjZV9jbG9jaykpOworCisgIGZvciAoYXV0byYgY2xvY2tfaWRfYW5kX3RzIDogc25h
cHNob3RfZGF0YSkgeworICAgIGF1dG8qIGMgPSBzbmFwc2hvdC0+YWRkX2Nsb2NrcygpOworICAg
IGMtPnNldF9jbG9ja19pZChjbG9ja19pZF9hbmRfdHMuZmlyc3QpOworICAgIGMtPnNldF90aW1l
c3RhbXAoY2xvY2tfaWRfYW5kX3RzLnNlY29uZCk7CisgIH0KKworICBwYWNrZXQtPnNldF90cnVz
dGVkX3VpZChzdGF0aWNfY2FzdDxpbnQzMl90Pih1aWRfKSk7CisgIHBhY2tldC0+c2V0X3RydXN0
ZWRfcGFja2V0X3NlcXVlbmNlX2lkKGtTZXJ2aWNlUGFja2V0U2VxdWVuY2VJRCk7CisgIFNlcmlh
bGl6ZUFuZEFwcGVuZFBhY2tldChwYWNrZXRzLCBwYWNrZXQuU2VyaWFsaXplQXNBcnJheSgpKTsK
K30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OlNuYXBzaG90U3RhdHMoVHJhY2luZ1Nlc3Np
b24qIHRyYWNpbmdfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0ZDo6dmVjdG9yPFRyYWNlUGFja2V0PiogcGFja2V0cykgeworICBwcm90b3plcm86Okhl
YXBCdWZmZXJlZDxwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXQ+IHBhY2tldDsKKyAgcGFja2V0
LT5zZXRfdHJ1c3RlZF91aWQoc3RhdGljX2Nhc3Q8aW50MzJfdD4odWlkXykpOworICBwYWNrZXQt
PnNldF90cnVzdGVkX3BhY2tldF9zZXF1ZW5jZV9pZChrU2VydmljZVBhY2tldFNlcXVlbmNlSUQp
OworICBHZXRUcmFjZVN0YXRzKHRyYWNpbmdfc2Vzc2lvbikuU2VyaWFsaXplKHBhY2tldC0+c2V0
X3RyYWNlX3N0YXRzKCkpOworICBTZXJpYWxpemVBbmRBcHBlbmRQYWNrZXQocGFja2V0cywgcGFj
a2V0LlNlcmlhbGl6ZUFzQXJyYXkoKSk7Cit9CisKK1RyYWNlU3RhdHMgVHJhY2luZ1NlcnZpY2VJ
bXBsOjpHZXRUcmFjZVN0YXRzKFRyYWNpbmdTZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24pIHsKKyAg
VHJhY2VTdGF0cyB0cmFjZV9zdGF0czsKKyAgdHJhY2Vfc3RhdHMuc2V0X3Byb2R1Y2Vyc19jb25u
ZWN0ZWQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHByb2R1Y2Vyc18uc2l6ZSgpKSk7CisgIHRyYWNl
X3N0YXRzLnNldF9wcm9kdWNlcnNfc2VlbihsYXN0X3Byb2R1Y2VyX2lkXyk7CisgIHRyYWNlX3N0
YXRzLnNldF9kYXRhX3NvdXJjZXNfcmVnaXN0ZXJlZCgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQz
Ml90PihkYXRhX3NvdXJjZXNfLnNpemUoKSkpOworICB0cmFjZV9zdGF0cy5zZXRfZGF0YV9zb3Vy
Y2VzX3NlZW4obGFzdF9kYXRhX3NvdXJjZV9pbnN0YW5jZV9pZF8pOworICB0cmFjZV9zdGF0cy5z
ZXRfdHJhY2luZ19zZXNzaW9ucygKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0cmFjaW5n
X3Nlc3Npb25zXy5zaXplKCkpKTsKKyAgdHJhY2Vfc3RhdHMuc2V0X3RvdGFsX2J1ZmZlcnMoc3Rh
dGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcnNfLnNpemUoKSkpOworICB0cmFjZV9zdGF0cy5zZXRf
Y2h1bmtzX2Rpc2NhcmRlZChjaHVua3NfZGlzY2FyZGVkXyk7CisgIHRyYWNlX3N0YXRzLnNldF9w
YXRjaGVzX2Rpc2NhcmRlZChwYXRjaGVzX2Rpc2NhcmRlZF8pOworICB0cmFjZV9zdGF0cy5zZXRf
aW52YWxpZF9wYWNrZXRzKHRyYWNpbmdfc2Vzc2lvbi0+aW52YWxpZF9wYWNrZXRzKTsKKworICBm
b3IgKEJ1ZmZlcklEIGJ1Zl9pZCA6IHRyYWNpbmdfc2Vzc2lvbi0+YnVmZmVyc19pbmRleCkgewor
ICAgIFRyYWNlQnVmZmVyKiBidWYgPSBHZXRCdWZmZXJCeUlEKGJ1Zl9pZCk7CisgICAgaWYgKCFi
dWYpIHsKKyAgICAgIFBFUkZFVFRPX0RGQVRBTCgiQnVmZmVyIG5vdCBmb3VuZC4iKTsKKyAgICAg
IGNvbnRpbnVlOworICAgIH0KKyAgICAqdHJhY2Vfc3RhdHMuYWRkX2J1ZmZlcl9zdGF0cygpID0g
YnVmLT5zdGF0cygpOworICB9ICAvLyBmb3IgKGJ1ZiBpbiBzZXNzaW9uKS4KKyAgcmV0dXJuIHRy
YWNlX3N0YXRzOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6TWF5YmVFbWl0VHJhY2VD
b25maWcoCisgICAgVHJhY2luZ1Nlc3Npb24qIHRyYWNpbmdfc2Vzc2lvbiwKKyAgICBzdGQ6OnZl
Y3RvcjxUcmFjZVBhY2tldD4qIHBhY2tldHMpIHsKKyAgaWYgKHRyYWNpbmdfc2Vzc2lvbi0+ZGlk
X2VtaXRfY29uZmlnKQorICAgIHJldHVybjsKKyAgdHJhY2luZ19zZXNzaW9uLT5kaWRfZW1pdF9j
b25maWcgPSB0cnVlOworICBwcm90b3plcm86OkhlYXBCdWZmZXJlZDxwcm90b3M6OnBiemVybzo6
VHJhY2VQYWNrZXQ+IHBhY2tldDsKKyAgcGFja2V0LT5zZXRfdHJ1c3RlZF91aWQoc3RhdGljX2Nh
c3Q8aW50MzJfdD4odWlkXykpOworICBwYWNrZXQtPnNldF90cnVzdGVkX3BhY2tldF9zZXF1ZW5j
ZV9pZChrU2VydmljZVBhY2tldFNlcXVlbmNlSUQpOworICB0cmFjaW5nX3Nlc3Npb24tPmNvbmZp
Zy5TZXJpYWxpemUocGFja2V0LT5zZXRfdHJhY2VfY29uZmlnKCkpOworICBTZXJpYWxpemVBbmRB
cHBlbmRQYWNrZXQocGFja2V0cywgcGFja2V0LlNlcmlhbGl6ZUFzQXJyYXkoKSk7Cit9CisKK3Zv
aWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpNYXliZUVtaXRTeXN0ZW1JbmZvKAorICAgIFRyYWNpbmdT
ZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24sCisgICAgc3RkOjp2ZWN0b3I8VHJhY2VQYWNrZXQ+KiBw
YWNrZXRzKSB7CisgIGlmICh0cmFjaW5nX3Nlc3Npb24tPmRpZF9lbWl0X3N5c3RlbV9pbmZvKQor
ICAgIHJldHVybjsKKyAgdHJhY2luZ19zZXNzaW9uLT5kaWRfZW1pdF9zeXN0ZW1faW5mbyA9IHRy
dWU7CisgIHByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPHByb3Rvczo6cGJ6ZXJvOjpUcmFjZVBhY2tl
dD4gcGFja2V0OworICBhdXRvKiBpbmZvID0gcGFja2V0LT5zZXRfc3lzdGVtX2luZm8oKTsKKyAg
YmFzZTo6aWdub3JlX3Jlc3VsdChpbmZvKTsgIC8vIEZvciBQRVJGRVRUT19PU19XSU4uCisjaWYg
IVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pICYmIFwKKyAgICAhUEVSRkVUVE9f
QlVJTERGTEFHKFBFUkZFVFRPX09TX05BQ0wpCisgIHN0cnVjdCB1dHNuYW1lIHVuYW1lX2luZm87
CisgIGlmICh1bmFtZSgmdW5hbWVfaW5mbykgPT0gMCkgeworICAgIGF1dG8qIHV0c25hbWVfaW5m
byA9IGluZm8tPnNldF91dHNuYW1lKCk7CisgICAgdXRzbmFtZV9pbmZvLT5zZXRfc3lzbmFtZSh1
bmFtZV9pbmZvLnN5c25hbWUpOworICAgIHV0c25hbWVfaW5mby0+c2V0X3ZlcnNpb24odW5hbWVf
aW5mby52ZXJzaW9uKTsKKyAgICB1dHNuYW1lX2luZm8tPnNldF9tYWNoaW5lKHVuYW1lX2luZm8u
bWFjaGluZSk7CisgICAgdXRzbmFtZV9pbmZvLT5zZXRfcmVsZWFzZSh1bmFtZV9pbmZvLnJlbGVh
c2UpOworICB9CisjZW5kaWYgIC8vICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0lO
KQorI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorICBjaGFyIHZh
bHVlW1BST1BfVkFMVUVfTUFYXTsKKyAgaWYgKF9fc3lzdGVtX3Byb3BlcnR5X2dldCgicm8uYnVp
bGQuZmluZ2VycHJpbnQiLCB2YWx1ZSkpIHsKKyAgICBpbmZvLT5zZXRfYW5kcm9pZF9idWlsZF9m
aW5nZXJwcmludCh2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgUEVSRkVUVE9fRUxPRygiVW5hYmxl
IHRvIHJlYWQgcm8uYnVpbGQuZmluZ2VycHJpbnQiKTsKKyAgfQorICBpbmZvLT5zZXRfaHooc3lz
Y29uZihfU0NfQ0xLX1RDSykpOworI2VuZGlmICAvLyBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVU
VE9fT1NfQU5EUk9JRCkKKyAgcGFja2V0LT5zZXRfdHJ1c3RlZF91aWQoc3RhdGljX2Nhc3Q8aW50
MzJfdD4odWlkXykpOworICBwYWNrZXQtPnNldF90cnVzdGVkX3BhY2tldF9zZXF1ZW5jZV9pZChr
U2VydmljZVBhY2tldFNlcXVlbmNlSUQpOworICBTZXJpYWxpemVBbmRBcHBlbmRQYWNrZXQocGFj
a2V0cywgcGFja2V0LlNlcmlhbGl6ZUFzQXJyYXkoKSk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZp
Y2VJbXBsOjpNYXliZUVtaXRTZXJ2aWNlRXZlbnRzKAorICAgIFRyYWNpbmdTZXNzaW9uKiB0cmFj
aW5nX3Nlc3Npb24sCisgICAgc3RkOjp2ZWN0b3I8VHJhY2VQYWNrZXQ+KiBwYWNrZXRzKSB7Cisg
IGludDY0X3QgYWxsX3N0YXJ0X25zID0gdHJhY2luZ19zZXNzaW9uLT50aW1lX2FsbF9kYXRhX3Nv
dXJjZV9zdGFydGVkLmNvdW50KCk7CisgIGlmICghdHJhY2luZ19zZXNzaW9uLT5kaWRfZW1pdF9h
bGxfZGF0YV9zb3VyY2Vfc3RhcnRlZCAmJiBhbGxfc3RhcnRfbnMgPiAwKSB7CisgICAgdHJhY2lu
Z19zZXNzaW9uLT5kaWRfZW1pdF9hbGxfZGF0YV9zb3VyY2Vfc3RhcnRlZCA9IHRydWU7CisgICAg
cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0PiBwYWNr
ZXQ7CisgICAgcGFja2V0LT5zZXRfdGltZXN0YW1wKHN0YXRpY19jYXN0PHVpbnQ2NF90PihhbGxf
c3RhcnRfbnMpKTsKKyAgICBwYWNrZXQtPnNldF90cnVzdGVkX3VpZChzdGF0aWNfY2FzdDxpbnQz
Ml90Pih1aWRfKSk7CisgICAgcGFja2V0LT5zZXRfdHJ1c3RlZF9wYWNrZXRfc2VxdWVuY2VfaWQo
a1NlcnZpY2VQYWNrZXRTZXF1ZW5jZUlEKTsKKyAgICBwYWNrZXQtPnNldF9zZXJ2aWNlX2V2ZW50
KCktPnNldF9hbGxfZGF0YV9zb3VyY2VzX3N0YXJ0ZWQodHJ1ZSk7CisgICAgU2VyaWFsaXplQW5k
QXBwZW5kUGFja2V0KHBhY2tldHMsIHBhY2tldC5TZXJpYWxpemVBc0FycmF5KCkpOworICB9Cit9
CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpNYXliZUVtaXRSZWNlaXZlZFRyaWdnZXJzKAor
ICAgIFRyYWNpbmdTZXNzaW9uKiB0cmFjaW5nX3Nlc3Npb24sCisgICAgc3RkOjp2ZWN0b3I8VHJh
Y2VQYWNrZXQ+KiBwYWNrZXRzKSB7CisgIFBFUkZFVFRPX0RDSEVDSyh0cmFjaW5nX3Nlc3Npb24t
Pm51bV90cmlnZ2Vyc19lbWl0dGVkX2ludG9fdHJhY2UgPD0KKyAgICAgICAgICAgICAgICAgIHRy
YWNpbmdfc2Vzc2lvbi0+cmVjZWl2ZWRfdHJpZ2dlcnMuc2l6ZSgpKTsKKyAgZm9yIChzaXplX3Qg
aSA9IHRyYWNpbmdfc2Vzc2lvbi0+bnVtX3RyaWdnZXJzX2VtaXR0ZWRfaW50b190cmFjZTsKKyAg
ICAgICBpIDwgdHJhY2luZ19zZXNzaW9uLT5yZWNlaXZlZF90cmlnZ2Vycy5zaXplKCk7ICsraSkg
eworICAgIGNvbnN0IGF1dG8mIGluZm8gPSB0cmFjaW5nX3Nlc3Npb24tPnJlY2VpdmVkX3RyaWdn
ZXJzW2ldOworICAgIHByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPHByb3Rvczo6cGJ6ZXJvOjpUcmFj
ZVBhY2tldD4gcGFja2V0OworICAgIGF1dG8qIHRyaWdnZXIgPSBwYWNrZXQtPnNldF90cmlnZ2Vy
KCk7CisgICAgdHJpZ2dlci0+c2V0X3RyaWdnZXJfbmFtZShpbmZvLnRyaWdnZXJfbmFtZSk7Cisg
ICAgdHJpZ2dlci0+c2V0X3Byb2R1Y2VyX25hbWUoaW5mby5wcm9kdWNlcl9uYW1lKTsKKyAgICB0
cmlnZ2VyLT5zZXRfdHJ1c3RlZF9wcm9kdWNlcl91aWQoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5m
by5wcm9kdWNlcl91aWQpKTsKKworICAgIHBhY2tldC0+c2V0X3RpbWVzdGFtcChpbmZvLmJvb3Rf
dGltZV9ucyk7CisgICAgcGFja2V0LT5zZXRfdHJ1c3RlZF91aWQoc3RhdGljX2Nhc3Q8aW50MzJf
dD4odWlkXykpOworICAgIHBhY2tldC0+c2V0X3RydXN0ZWRfcGFja2V0X3NlcXVlbmNlX2lkKGtT
ZXJ2aWNlUGFja2V0U2VxdWVuY2VJRCk7CisgICAgU2VyaWFsaXplQW5kQXBwZW5kUGFja2V0KHBh
Y2tldHMsIHBhY2tldC5TZXJpYWxpemVBc0FycmF5KCkpOworICAgICsrdHJhY2luZ19zZXNzaW9u
LT5udW1fdHJpZ2dlcnNfZW1pdHRlZF9pbnRvX3RyYWNlOworICB9Cit9CisKKy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vCisvLyBUcmFjaW5nU2VydmljZUltcGw6OkNvbnN1bWVyRW5kcG9pbnRJbXBs
IGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUcmFjaW5nU2Vydmlj
ZUltcGw6OkNvbnN1bWVyRW5kcG9pbnRJbXBsOjpDb25zdW1lckVuZHBvaW50SW1wbCgKKyAgICBU
cmFjaW5nU2VydmljZUltcGwqIHNlcnZpY2UsCisgICAgYmFzZTo6VGFza1J1bm5lciogdGFza19y
dW5uZXIsCisgICAgQ29uc3VtZXIqIGNvbnN1bWVyLAorICAgIHVpZF90IHVpZCkKKyAgICA6IHRh
c2tfcnVubmVyXyh0YXNrX3J1bm5lciksCisgICAgICBzZXJ2aWNlXyhzZXJ2aWNlKSwKKyAgICAg
IGNvbnN1bWVyXyhjb25zdW1lciksCisgICAgICB1aWRfKHVpZCksCisgICAgICB3ZWFrX3B0cl9m
YWN0b3J5Xyh0aGlzKSB7fQorCitUcmFjaW5nU2VydmljZUltcGw6OkNvbnN1bWVyRW5kcG9pbnRJ
bXBsOjp+Q29uc3VtZXJFbmRwb2ludEltcGwoKSB7CisgIHNlcnZpY2VfLT5EaXNjb25uZWN0Q29u
c3VtZXIodGhpcyk7CisgIGNvbnN1bWVyXy0+T25EaXNjb25uZWN0KCk7Cit9CisKK3ZvaWQgVHJh
Y2luZ1NlcnZpY2VJbXBsOjpDb25zdW1lckVuZHBvaW50SW1wbDo6Tm90aWZ5T25UcmFjaW5nRGlz
YWJsZWQoKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAg
YXV0byB3ZWFrX3RoaXMgPSBHZXRXZWFrUHRyKCk7CisgIHRhc2tfcnVubmVyXy0+UG9zdFRhc2so
W3dlYWtfdGhpc10geworICAgIGlmICh3ZWFrX3RoaXMpCisgICAgICB3ZWFrX3RoaXMtPmNvbnN1
bWVyXy0+T25UcmFjaW5nRGlzYWJsZWQoKTsKKyAgfSk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZp
Y2VJbXBsOjpDb25zdW1lckVuZHBvaW50SW1wbDo6RW5hYmxlVHJhY2luZygKKyAgICBjb25zdCBU
cmFjZUNvbmZpZyYgY2ZnLAorICAgIGJhc2U6OlNjb3BlZEZpbGUgZmQpIHsKKyAgUEVSRkVUVE9f
RENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBpZiAoIXNlcnZpY2VfLT5FbmFibGVU
cmFjaW5nKHRoaXMsIGNmZywgc3RkOjptb3ZlKGZkKSkpCisgICAgTm90aWZ5T25UcmFjaW5nRGlz
YWJsZWQoKTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OkNvbnN1bWVyRW5kcG9pbnRJ
bXBsOjpDaGFuZ2VUcmFjZUNvbmZpZygKKyAgICBjb25zdCBUcmFjZUNvbmZpZyYgY2ZnKSB7Cisg
IGlmICghdHJhY2luZ19zZXNzaW9uX2lkXykgeworICAgIFBFUkZFVFRPX0xPRygKKyAgICAgICAg
IkNvbnN1bWVyIGNhbGxlZCBDaGFuZ2VUcmFjZUNvbmZpZygpIGJ1dCB0cmFjaW5nIHdhcyAiCisg
ICAgICAgICJub3QgYWN0aXZlIik7CisgICAgcmV0dXJuOworICB9CisgIHNlcnZpY2VfLT5DaGFu
Z2VUcmFjZUNvbmZpZyh0aGlzLCBjZmcpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6
Q29uc3VtZXJFbmRwb2ludEltcGw6OlN0YXJ0VHJhY2luZygpIHsKKyAgUEVSRkVUVE9fRENIRUNL
X1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBpZiAoIXRyYWNpbmdfc2Vzc2lvbl9pZF8pIHsK
KyAgICBQRVJGRVRUT19MT0coIkNvbnN1bWVyIGNhbGxlZCBTdGFydFRyYWNpbmcoKSBidXQgdHJh
Y2luZyB3YXMgbm90IGFjdGl2ZSIpOworICAgIHJldHVybjsKKyAgfQorICBzZXJ2aWNlXy0+U3Rh
cnRUcmFjaW5nKHRyYWNpbmdfc2Vzc2lvbl9pZF8pOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNl
SW1wbDo6Q29uc3VtZXJFbmRwb2ludEltcGw6OkRpc2FibGVUcmFjaW5nKCkgeworICBQRVJGRVRU
T19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGlmICghdHJhY2luZ19zZXNzaW9u
X2lkXykgeworICAgIFBFUkZFVFRPX0xPRygiQ29uc3VtZXIgY2FsbGVkIERpc2FibGVUcmFjaW5n
KCkgYnV0IHRyYWNpbmcgd2FzIG5vdCBhY3RpdmUiKTsKKyAgICByZXR1cm47CisgIH0KKyAgc2Vy
dmljZV8tPkRpc2FibGVUcmFjaW5nKHRyYWNpbmdfc2Vzc2lvbl9pZF8pOworfQorCit2b2lkIFRy
YWNpbmdTZXJ2aWNlSW1wbDo6Q29uc3VtZXJFbmRwb2ludEltcGw6OlJlYWRCdWZmZXJzKCkgewor
ICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGlmICghdHJhY2lu
Z19zZXNzaW9uX2lkXykgeworICAgIFBFUkZFVFRPX0xPRygiQ29uc3VtZXIgY2FsbGVkIFJlYWRC
dWZmZXJzKCkgYnV0IHRyYWNpbmcgd2FzIG5vdCBhY3RpdmUiKTsKKyAgICBjb25zdW1lcl8tPk9u
VHJhY2VEYXRhKHt9LCAvKiBoYXNfbW9yZSA9ICovIGZhbHNlKTsKKyAgICByZXR1cm47CisgIH0K
KyAgaWYgKCFzZXJ2aWNlXy0+UmVhZEJ1ZmZlcnModHJhY2luZ19zZXNzaW9uX2lkXywgdGhpcykp
IHsKKyAgICBjb25zdW1lcl8tPk9uVHJhY2VEYXRhKHt9LCAvKiBoYXNfbW9yZSA9ICovIGZhbHNl
KTsKKyAgfQorfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6Q29uc3VtZXJFbmRwb2ludElt
cGw6OkZyZWVCdWZmZXJzKCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVj
a2VyXyk7CisgIGlmICghdHJhY2luZ19zZXNzaW9uX2lkXykgeworICAgIFBFUkZFVFRPX0xPRygi
Q29uc3VtZXIgY2FsbGVkIEZyZWVCdWZmZXJzKCkgYnV0IHRyYWNpbmcgd2FzIG5vdCBhY3RpdmUi
KTsKKyAgICByZXR1cm47CisgIH0KKyAgc2VydmljZV8tPkZyZWVCdWZmZXJzKHRyYWNpbmdfc2Vz
c2lvbl9pZF8pOworICB0cmFjaW5nX3Nlc3Npb25faWRfID0gMDsKK30KKwordm9pZCBUcmFjaW5n
U2VydmljZUltcGw6OkNvbnN1bWVyRW5kcG9pbnRJbXBsOjpGbHVzaCh1aW50MzJfdCB0aW1lb3V0
X21zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBGbHVzaENhbGxiYWNrIGNhbGxiYWNrKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhy
ZWFkX2NoZWNrZXJfKTsKKyAgaWYgKCF0cmFjaW5nX3Nlc3Npb25faWRfKSB7CisgICAgUEVSRkVU
VE9fTE9HKCJDb25zdW1lciBjYWxsZWQgRmx1c2goKSBidXQgdHJhY2luZyB3YXMgbm90IGFjdGl2
ZSIpOworICAgIHJldHVybjsKKyAgfQorICBzZXJ2aWNlXy0+Rmx1c2godHJhY2luZ19zZXNzaW9u
X2lkXywgdGltZW91dF9tcywgY2FsbGJhY2spOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1w
bDo6Q29uc3VtZXJFbmRwb2ludEltcGw6OkRldGFjaChjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7
CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgYm9vbCBzdWNj
ZXNzID0gc2VydmljZV8tPkRldGFjaENvbnN1bWVyKHRoaXMsIGtleSk7CisgIGF1dG8gd2Vha190
aGlzID0gR2V0V2Vha1B0cigpOworICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt3ZWFrX3RoaXMs
IHN1Y2Nlc3NdIHsKKyAgICBpZiAod2Vha190aGlzKQorICAgICAgd2Vha190aGlzLT5jb25zdW1l
cl8tPk9uRGV0YWNoKHN1Y2Nlc3MpOworICB9KTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUlt
cGw6OkNvbnN1bWVyRW5kcG9pbnRJbXBsOjpBdHRhY2goY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkg
eworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGJvb2wgc3Vj
Y2VzcyA9IHNlcnZpY2VfLT5BdHRhY2hDb25zdW1lcih0aGlzLCBrZXkpOworICBhdXRvIHdlYWtf
dGhpcyA9IEdldFdlYWtQdHIoKTsKKyAgdGFza19ydW5uZXJfLT5Qb3N0VGFzayhbd2Vha190aGlz
LCBzdWNjZXNzXSB7CisgICAgaWYgKCF3ZWFrX3RoaXMpCisgICAgICByZXR1cm47CisgICAgQ29u
c3VtZXIqIGNvbnN1bWVyID0gd2Vha190aGlzLT5jb25zdW1lcl87CisgICAgVHJhY2luZ1Nlc3Np
b24qIHNlc3Npb24gPQorICAgICAgICB3ZWFrX3RoaXMtPnNlcnZpY2VfLT5HZXRUcmFjaW5nU2Vz
c2lvbih3ZWFrX3RoaXMtPnRyYWNpbmdfc2Vzc2lvbl9pZF8pOworICAgIGlmICghc2Vzc2lvbikg
eworICAgICAgY29uc3VtZXItPk9uQXR0YWNoKGZhbHNlLCBUcmFjZUNvbmZpZygpKTsKKyAgICAg
IHJldHVybjsKKyAgICB9CisgICAgY29uc3VtZXItPk9uQXR0YWNoKHN1Y2Nlc3MsIHNlc3Npb24t
PmNvbmZpZyk7CisgIH0pOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6Q29uc3VtZXJF
bmRwb2ludEltcGw6OkdldFRyYWNlU3RhdHMoKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQo
dGhyZWFkX2NoZWNrZXJfKTsKKyAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgIFRyYWNlU3RhdHMg
c3RhdHM7CisgIFRyYWNpbmdTZXNzaW9uKiBzZXNzaW9uID0gc2VydmljZV8tPkdldFRyYWNpbmdT
ZXNzaW9uKHRyYWNpbmdfc2Vzc2lvbl9pZF8pOworICBpZiAoc2Vzc2lvbikgeworICAgIHN1Y2Nl
c3MgPSB0cnVlOworICAgIHN0YXRzID0gc2VydmljZV8tPkdldFRyYWNlU3RhdHMoc2Vzc2lvbik7
CisgIH0KKyAgYXV0byB3ZWFrX3RoaXMgPSBHZXRXZWFrUHRyKCk7CisgIHRhc2tfcnVubmVyXy0+
UG9zdFRhc2soW3dlYWtfdGhpcywgc3VjY2Vzcywgc3RhdHNdIHsKKyAgICBpZiAod2Vha190aGlz
KQorICAgICAgd2Vha190aGlzLT5jb25zdW1lcl8tPk9uVHJhY2VTdGF0cyhzdWNjZXNzLCBzdGF0
cyk7CisgIH0pOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6Q29uc3VtZXJFbmRwb2lu
dEltcGw6Ok9ic2VydmVFdmVudHMoCisgICAgdWludDMyX3QgZXZlbnRzX21hc2spIHsKKyAgUEVS
RkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBvYnNlcnZhYmxlX2V2ZW50
c19tYXNrXyA9IGV2ZW50c19tYXNrOworICBUcmFjaW5nU2Vzc2lvbiogc2Vzc2lvbiA9IHNlcnZp
Y2VfLT5HZXRUcmFjaW5nU2Vzc2lvbih0cmFjaW5nX3Nlc3Npb25faWRfKTsKKyAgaWYgKCFzZXNz
aW9uKQorICAgIHJldHVybjsKKworICBpZiAob2JzZXJ2YWJsZV9ldmVudHNfbWFza18gJiBPYnNl
cnZhYmxlRXZlbnRzOjpUWVBFX0RBVEFfU09VUkNFU19JTlNUQU5DRVMpIHsKKyAgICAvLyBJc3N1
ZSBpbml0aWFsIHN0YXRlcy4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGt2IDogc2Vzc2lvbi0+ZGF0
YV9zb3VyY2VfaW5zdGFuY2VzKSB7CisgICAgICBQcm9kdWNlckVuZHBvaW50SW1wbCogcHJvZHVj
ZXIgPSBzZXJ2aWNlXy0+R2V0UHJvZHVjZXIoa3YuZmlyc3QpOworICAgICAgUEVSRkVUVE9fRENI
RUNLKHByb2R1Y2VyKTsKKyAgICAgIE9uRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2UoKnBy
b2R1Y2VyLCBrdi5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBPYnNlcnZlRXZl
bnRzKCkgY2FsbCBoYXBwZW5zIGFmdGVyIGRhdGEgc291cmNlcyBoYXZlIGFja2VkIGFscmVhZHkK
KyAgLy8gbm90aWZ5IGltbWVkaWF0ZWx5LgorICBpZiAob2JzZXJ2YWJsZV9ldmVudHNfbWFza18g
JgorICAgICAgT2JzZXJ2YWJsZUV2ZW50czo6VFlQRV9BTExfREFUQV9TT1VSQ0VTX1NUQVJURUQp
IHsKKyAgICBzZXJ2aWNlXy0+TWF5YmVOb3RpZnlBbGxEYXRhU291cmNlc1N0YXJ0ZWQoc2Vzc2lv
bik7CisgIH0KK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OkNvbnN1bWVyRW5kcG9pbnRJ
bXBsOjpPbkRhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlKAorICAgIGNvbnN0IFByb2R1Y2Vy
RW5kcG9pbnRJbXBsJiBwcm9kdWNlciwKKyAgICBjb25zdCBEYXRhU291cmNlSW5zdGFuY2UmIGlu
c3RhbmNlKSB7CisgIGlmICghKG9ic2VydmFibGVfZXZlbnRzX21hc2tfICYKKyAgICAgICAgT2Jz
ZXJ2YWJsZUV2ZW50czo6VFlQRV9EQVRBX1NPVVJDRVNfSU5TVEFOQ0VTKSkgeworICAgIHJldHVy
bjsKKyAgfQorCisgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPSBEYXRhU291cmNlSW5zdGFuY2U6OkNP
TkZJR1VSRUQgJiYKKyAgICAgIGluc3RhbmNlLnN0YXRlICE9IERhdGFTb3VyY2VJbnN0YW5jZTo6
U1RBUlRFRCAmJgorICAgICAgaW5zdGFuY2Uuc3RhdGUgIT0gRGF0YVNvdXJjZUluc3RhbmNlOjpT
VE9QUEVEKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgYXV0byogb2JzZXJ2YWJsZV9ldmVudHMg
PSBBZGRPYnNlcnZhYmxlRXZlbnRzKCk7CisgIGF1dG8qIGNoYW5nZSA9IG9ic2VydmFibGVfZXZl
bnRzLT5hZGRfaW5zdGFuY2Vfc3RhdGVfY2hhbmdlcygpOworICBjaGFuZ2UtPnNldF9wcm9kdWNl
cl9uYW1lKHByb2R1Y2VyLm5hbWVfKTsKKyAgY2hhbmdlLT5zZXRfZGF0YV9zb3VyY2VfbmFtZShp
bnN0YW5jZS5kYXRhX3NvdXJjZV9uYW1lKTsKKyAgaWYgKGluc3RhbmNlLnN0YXRlID09IERhdGFT
b3VyY2VJbnN0YW5jZTo6U1RBUlRFRCkgeworICAgIGNoYW5nZS0+c2V0X3N0YXRlKE9ic2VydmFi
bGVFdmVudHM6OkRBVEFfU09VUkNFX0lOU1RBTkNFX1NUQVRFX1NUQVJURUQpOworICB9IGVsc2Ug
eworICAgIGNoYW5nZS0+c2V0X3N0YXRlKE9ic2VydmFibGVFdmVudHM6OkRBVEFfU09VUkNFX0lO
U1RBTkNFX1NUQVRFX1NUT1BQRUQpOworICB9Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBs
OjpDb25zdW1lckVuZHBvaW50SW1wbDo6T25BbGxEYXRhU291cmNlc1N0YXJ0ZWQoKSB7CisgIGlm
ICghKG9ic2VydmFibGVfZXZlbnRzX21hc2tfICYKKyAgICAgICAgT2JzZXJ2YWJsZUV2ZW50czo6
VFlQRV9BTExfREFUQV9TT1VSQ0VTX1NUQVJURUQpKSB7CisgICAgcmV0dXJuOworICB9CisgIGF1
dG8qIG9ic2VydmFibGVfZXZlbnRzID0gQWRkT2JzZXJ2YWJsZUV2ZW50cygpOworICBvYnNlcnZh
YmxlX2V2ZW50cy0+c2V0X2FsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCh0cnVlKTsKK30KKworYmFz
ZTo6V2Vha1B0cjxUcmFjaW5nU2VydmljZUltcGw6OkNvbnN1bWVyRW5kcG9pbnRJbXBsPgorVHJh
Y2luZ1NlcnZpY2VJbXBsOjpDb25zdW1lckVuZHBvaW50SW1wbDo6R2V0V2Vha1B0cigpIHsKKyAg
UEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICByZXR1cm4gd2Vha19w
dHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOworfQorCitPYnNlcnZhYmxlRXZlbnRzKgorVHJhY2lu
Z1NlcnZpY2VJbXBsOjpDb25zdW1lckVuZHBvaW50SW1wbDo6QWRkT2JzZXJ2YWJsZUV2ZW50cygp
IHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBpZiAoIW9i
c2VydmFibGVfZXZlbnRzXykgeworICAgIG9ic2VydmFibGVfZXZlbnRzXy5yZXNldChuZXcgT2Jz
ZXJ2YWJsZUV2ZW50cygpKTsKKyAgICBhdXRvIHdlYWtfdGhpcyA9IEdldFdlYWtQdHIoKTsKKyAg
ICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt3ZWFrX3RoaXNdIHsKKyAgICAgIGlmICghd2Vha190
aGlzKQorICAgICAgICByZXR1cm47CisKKyAgICAgIC8vIE1vdmUgaW50byBhIHRlbXBvcmFyeSB0
byBhbGxvdyByZWVudHJhbmN5IGluIE9uT2JzZXJ2YWJsZUV2ZW50cy4KKyAgICAgIGF1dG8gb2Jz
ZXJ2YWJsZV9ldmVudHMgPSBzdGQ6Om1vdmUod2Vha190aGlzLT5vYnNlcnZhYmxlX2V2ZW50c18p
OworICAgICAgd2Vha190aGlzLT5jb25zdW1lcl8tPk9uT2JzZXJ2YWJsZUV2ZW50cygqb2JzZXJ2
YWJsZV9ldmVudHMpOworICAgIH0pOworICB9CisgIHJldHVybiBvYnNlcnZhYmxlX2V2ZW50c18u
Z2V0KCk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpDb25zdW1lckVuZHBvaW50SW1w
bDo6UXVlcnlTZXJ2aWNlU3RhdGUoCisgICAgUXVlcnlTZXJ2aWNlU3RhdGVDYWxsYmFjayBjYWxs
YmFjaykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFRy
YWNpbmdTZXJ2aWNlU3RhdGUgc3ZjX3N0YXRlOworCisgIGNvbnN0IGF1dG8mIHNlc3Npb25zID0g
c2VydmljZV8tPnRyYWNpbmdfc2Vzc2lvbnNfOworICBzdmNfc3RhdGUuc2V0X251bV9zZXNzaW9u
cyhzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb25zLnNpemUoKSkpOworCisgIGludCBudW1fc3RhcnRl
ZCA9IDA7CisgIGZvciAoY29uc3QgYXV0byYga3YgOiBzZXNzaW9ucykKKyAgICBudW1fc3RhcnRl
ZCArPSBrdi5zZWNvbmQuc3RhdGUgPT0gVHJhY2luZ1Nlc3Npb246OlN0YXRlOjpTVEFSVEVEID8g
MSA6IDA7CisgIHN2Y19zdGF0ZS5zZXRfbnVtX3Nlc3Npb25zX3N0YXJ0ZWQoc3RhdGljX2Nhc3Q8
aW50PihudW1fc3RhcnRlZCkpOworCisgIGZvciAoY29uc3QgYXV0byYga3YgOiBzZXJ2aWNlXy0+
cHJvZHVjZXJzXykgeworICAgIGF1dG8qIHByb2R1Y2VyID0gc3ZjX3N0YXRlLmFkZF9wcm9kdWNl
cnMoKTsKKyAgICBwcm9kdWNlci0+c2V0X2lkKHN0YXRpY19jYXN0PGludD4oa3YuZmlyc3QpKTsK
KyAgICBwcm9kdWNlci0+c2V0X25hbWUoa3Yuc2Vjb25kLT5uYW1lXyk7CisgICAgcHJvZHVjZXIt
PnNldF91aWQoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocHJvZHVjZXItPnVpZCgpKSk7CisgIH0KKwor
ICBmb3IgKGNvbnN0IGF1dG8mIGt2IDogc2VydmljZV8tPmRhdGFfc291cmNlc18pIHsKKyAgICBj
b25zdCBhdXRvJiByZWdpc3RlcmVkX2RhdGFfc291cmNlID0ga3Yuc2Vjb25kOworICAgIGF1dG8q
IGRhdGFfc291cmNlID0gc3ZjX3N0YXRlLmFkZF9kYXRhX3NvdXJjZXMoKTsKKyAgICAqZGF0YV9z
b3VyY2UtPm11dGFibGVfZHNfZGVzY3JpcHRvcigpID0gcmVnaXN0ZXJlZF9kYXRhX3NvdXJjZS5k
ZXNjcmlwdG9yOworICAgIGRhdGFfc291cmNlLT5zZXRfcHJvZHVjZXJfaWQoCisgICAgICAgIHN0
YXRpY19jYXN0PGludD4ocmVnaXN0ZXJlZF9kYXRhX3NvdXJjZS5wcm9kdWNlcl9pZCkpOworICB9
CisgIGNhbGxiYWNrKC8qc3VjY2Vzcz0qL3RydWUsIHN2Y19zdGF0ZSk7Cit9CisKK3ZvaWQgVHJh
Y2luZ1NlcnZpY2VJbXBsOjpDb25zdW1lckVuZHBvaW50SW1wbDo6UXVlcnlDYXBhYmlsaXRpZXMo
CisgICAgUXVlcnlDYXBhYmlsaXRpZXNDYWxsYmFjayBjYWxsYmFjaykgeworICBQRVJGRVRUT19E
Q0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0
aWVzIGNhcHM7CisgIGNhcHMuc2V0X2hhc19xdWVyeV9jYXBhYmlsaXRpZXModHJ1ZSk7CisgIGNh
cHMuc2V0X2hhc190cmFjZV9jb25maWdfb3V0cHV0X3BhdGgodHJ1ZSk7CisgIGNhcHMuYWRkX29i
c2VydmFibGVfZXZlbnRzKE9ic2VydmFibGVFdmVudHM6OlRZUEVfREFUQV9TT1VSQ0VTX0lOU1RB
TkNFUyk7CisgIGNhcHMuYWRkX29ic2VydmFibGVfZXZlbnRzKE9ic2VydmFibGVFdmVudHM6OlRZ
UEVfQUxMX0RBVEFfU09VUkNFU19TVEFSVEVEKTsKKyAgc3RhdGljX2Fzc2VydChPYnNlcnZhYmxl
RXZlbnRzOjpUeXBlX01BWCA9PQorICAgICAgICAgICAgICAgICAgICBPYnNlcnZhYmxlRXZlbnRz
OjpUWVBFX0FMTF9EQVRBX1NPVVJDRVNfU1RBUlRFRCwKKyAgICAgICAgICAgICAgICAiIik7Cisg
IGNhbGxiYWNrKGNhcHMpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHJhY2lu
Z1NlcnZpY2VJbXBsOjpQcm9kdWNlckVuZHBvaW50SW1wbCBpbXBsZW1lbnRhdGlvbgorLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8KKworVHJhY2luZ1NlcnZpY2VJbXBsOjpQcm9kdWNlckVuZHBvaW50
SW1wbDo6UHJvZHVjZXJFbmRwb2ludEltcGwoCisgICAgUHJvZHVjZXJJRCBpZCwKKyAgICB1aWRf
dCB1aWQsCisgICAgVHJhY2luZ1NlcnZpY2VJbXBsKiBzZXJ2aWNlLAorICAgIGJhc2U6OlRhc2tS
dW5uZXIqIHRhc2tfcnVubmVyLAorICAgIFByb2R1Y2VyKiBwcm9kdWNlciwKKyAgICBjb25zdCBz
dGQ6OnN0cmluZyYgcHJvZHVjZXJfbmFtZSwKKyAgICBib29sIGluX3Byb2Nlc3MsCisgICAgYm9v
bCBzbWJfc2NyYXBpbmdfZW5hYmxlZCkKKyAgICA6IGlkXyhpZCksCisgICAgICB1aWRfKHVpZCks
CisgICAgICBzZXJ2aWNlXyhzZXJ2aWNlKSwKKyAgICAgIHRhc2tfcnVubmVyXyh0YXNrX3J1bm5l
ciksCisgICAgICBwcm9kdWNlcl8ocHJvZHVjZXIpLAorICAgICAgbmFtZV8ocHJvZHVjZXJfbmFt
ZSksCisgICAgICBpbl9wcm9jZXNzXyhpbl9wcm9jZXNzKSwKKyAgICAgIHNtYl9zY3JhcGluZ19l
bmFibGVkXyhzbWJfc2NyYXBpbmdfZW5hYmxlZCksCisgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xyh0
aGlzKSB7fQorCitUcmFjaW5nU2VydmljZUltcGw6OlByb2R1Y2VyRW5kcG9pbnRJbXBsOjp+UHJv
ZHVjZXJFbmRwb2ludEltcGwoKSB7CisgIHNlcnZpY2VfLT5EaXNjb25uZWN0UHJvZHVjZXIoaWRf
KTsKKyAgcHJvZHVjZXJfLT5PbkRpc2Nvbm5lY3QoKTsKK30KKwordm9pZCBUcmFjaW5nU2Vydmlj
ZUltcGw6OlByb2R1Y2VyRW5kcG9pbnRJbXBsOjpSZWdpc3RlckRhdGFTb3VyY2UoCisgICAgY29u
c3QgRGF0YVNvdXJjZURlc2NyaXB0b3ImIGRlc2MpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVB
RCh0aHJlYWRfY2hlY2tlcl8pOworICBpZiAoZGVzYy5uYW1lKCkuZW1wdHkoKSkgeworICAgIFBF
UkZFVFRPX0RMT0coIlJlY2VpdmVkIFJlZ2lzdGVyRGF0YVNvdXJjZSgpIHdpdGggZW1wdHkgbmFt
ZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHNlcnZpY2VfLT5SZWdpc3RlckRhdGFTb3VyY2Uo
aWRfLCBkZXNjKTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OlByb2R1Y2VyRW5kcG9p
bnRJbXBsOjpVbnJlZ2lzdGVyRGF0YVNvdXJjZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFt
ZSkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIHNlcnZp
Y2VfLT5VbnJlZ2lzdGVyRGF0YVNvdXJjZShpZF8sIG5hbWUpOworfQorCit2b2lkIFRyYWNpbmdT
ZXJ2aWNlSW1wbDo6UHJvZHVjZXJFbmRwb2ludEltcGw6OlJlZ2lzdGVyVHJhY2VXcml0ZXIoCisg
ICAgdWludDMyX3Qgd3JpdGVyX2lkLAorICAgIHVpbnQzMl90IHRhcmdldF9idWZmZXIpIHsKKyAg
UEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICB3cml0ZXJzX1tzdGF0
aWNfY2FzdDxXcml0ZXJJRD4od3JpdGVyX2lkKV0gPQorICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVy
SUQ+KHRhcmdldF9idWZmZXIpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6UHJvZHVj
ZXJFbmRwb2ludEltcGw6OlVucmVnaXN0ZXJUcmFjZVdyaXRlcigKKyAgICB1aW50MzJfdCB3cml0
ZXJfaWQpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICB3
cml0ZXJzXy5lcmFzZShzdGF0aWNfY2FzdDxXcml0ZXJJRD4od3JpdGVyX2lkKSk7Cit9CisKK3Zv
aWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpQcm9kdWNlckVuZHBvaW50SW1wbDo6Q29tbWl0RGF0YSgK
KyAgICBjb25zdCBDb21taXREYXRhUmVxdWVzdCYgcmVxX3VudHJ1c3RlZCwKKyAgICBDb21taXRE
YXRhQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRf
Y2hlY2tlcl8pOworCisgIGlmIChtZXRhdHJhY2U6OklzRW5hYmxlZChtZXRhdHJhY2U6OlRBR19U
UkFDRV9TRVJWSUNFKSkgeworICAgIFBFUkZFVFRPX01FVEFUUkFDRV9DT1VOVEVSKFRBR19UUkFD
RV9TRVJWSUNFLCBUUkFDRV9TRVJWSUNFX0NPTU1JVF9EQVRBLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEVuY29kZUNvbW1pdERhdGFSZXF1ZXN0KGlkXywgcmVxX3VudHJ1c3RlZCkp
OworICB9CisKKyAgaWYgKCFzaGFyZWRfbWVtb3J5XykgeworICAgIFBFUkZFVFRPX0RMT0coCisg
ICAgICAgICJBdHRlbXB0ZWQgdG8gY29tbWl0IGRhdGEgYmVmb3JlIHRoZSBzaGFyZWQgbWVtb3J5
IHdhcyBhbGxvY2F0ZWQuIik7CisgICAgcmV0dXJuOworICB9CisgIFBFUkZFVFRPX0RDSEVDSyhz
aG1lbV9hYmlfLmlzX3ZhbGlkKCkpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogcmVxX3Vu
dHJ1c3RlZC5jaHVua3NfdG9fbW92ZSgpKSB7CisgICAgY29uc3QgdWludDMyX3QgcGFnZV9pZHgg
PSBlbnRyeS5wYWdlKCk7CisgICAgaWYgKHBhZ2VfaWR4ID49IHNobWVtX2FiaV8ubnVtX3BhZ2Vz
KCkpCisgICAgICBjb250aW51ZTsgIC8vIEEgYnVnZ3kgb3IgbWFsaWNpb3VzIHByb2R1Y2VyLgor
CisgICAgU2hhcmVkTWVtb3J5QUJJOjpDaHVuayBjaHVuayA9CisgICAgICAgIHNobWVtX2FiaV8u
VHJ5QWNxdWlyZUNodW5rRm9yUmVhZGluZyhwYWdlX2lkeCwgZW50cnkuY2h1bmsoKSk7CisgICAg
aWYgKCFjaHVuay5pc192YWxpZCgpKSB7CisgICAgICBQRVJGRVRUT19ETE9HKCJBc2tlZCB0byBt
b3ZlIGNodW5rICVkOiVkLCBidXQgaXQncyBub3QgY29tcGxldGUiLAorICAgICAgICAgICAgICAg
ICAgICBlbnRyeS5wYWdlKCksIGVudHJ5LmNodW5rKCkpOworICAgICAgY29udGludWU7CisgICAg
fQorCisgICAgLy8gVHJ5QWNxdWlyZUNodW5rRm9yUmVhZGluZygpIGhhcyBsb2FkLWFjcXVpcmUg
c2VtYW50aWNzLiBPbmNlIGFjcXVpcmVkLAorICAgIC8vIHRoZSBBQkkgY29udHJhY3QgZXhwZWN0
cyB0aGUgcHJvZHVjZXIgdG8gbm90IHRvdWNoIHRoZSBjaHVuayBhbnltb3JlCisgICAgLy8gKHVu
dGlsIHRoZSBzZXJ2aWNlIG1hcmtzIHRoYXQgYXMgZnJlZSkuIFRoaXMgaXMgd2h5IGFsbCB0aGUg
cmVhZHMgYmVsb3cKKyAgICAvLyBhcmUganVzdCBtZW1vcnlfb3JkZXJfcmVsYXhlZC4gQWxzbywg
dGhlIGNvZGUgaGVyZSBhc3N1bWVzIHRoYXQgYWxsIHRoaXMKKyAgICAvLyBkYXRhIGNhbiBiZSBt
YWxpY2lvdXMgYW5kIGp1c3QgZ2l2ZXMgdXAgaWYgYW55dGhpbmcgaXMgbWFsZm9ybWVkLgorICAg
IEJ1ZmZlcklEIGJ1ZmZlcl9pZCA9IHN0YXRpY19jYXN0PEJ1ZmZlcklEPihlbnRyeS50YXJnZXRf
YnVmZmVyKCkpOworICAgIGNvbnN0IFNoYXJlZE1lbW9yeUFCSTo6Q2h1bmtIZWFkZXImIGNodW5r
X2hlYWRlciA9ICpjaHVuay5oZWFkZXIoKTsKKyAgICBXcml0ZXJJRCB3cml0ZXJfaWQgPSBjaHVu
a19oZWFkZXIud3JpdGVyX2lkLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAg
Q2h1bmtJRCBjaHVua19pZCA9IGNodW5rX2hlYWRlci5jaHVua19pZC5sb2FkKHN0ZDo6bWVtb3J5
X29yZGVyX3JlbGF4ZWQpOworICAgIGF1dG8gcGFja2V0cyA9IGNodW5rX2hlYWRlci5wYWNrZXRz
LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgdWludDE2X3QgbnVtX2ZyYWdt
ZW50cyA9IHBhY2tldHMuY291bnQ7CisgICAgdWludDhfdCBjaHVua19mbGFncyA9IHBhY2tldHMu
ZmxhZ3M7CisKKyAgICBzZXJ2aWNlXy0+Q29weVByb2R1Y2VyUGFnZUludG9Mb2dCdWZmZXIoCisg
ICAgICAgIGlkXywgdWlkXywgd3JpdGVyX2lkLCBjaHVua19pZCwgYnVmZmVyX2lkLCBudW1fZnJh
Z21lbnRzLCBjaHVua19mbGFncywKKyAgICAgICAgLypjaHVua19jb21wbGV0ZT0qL3RydWUsIGNo
dW5rLnBheWxvYWRfYmVnaW4oKSwgY2h1bmsucGF5bG9hZF9zaXplKCkpOworCisgICAgLy8gVGhp
cyBvbmUgaGFzIHJlbGVhc2Utc3RvcmUgc2VtYW50aWNzLgorICAgIHNobWVtX2FiaV8uUmVsZWFz
ZUNodW5rQXNGcmVlKHN0ZDo6bW92ZShjaHVuaykpOworICB9ICAvLyBmb3IoY2h1bmtzX3RvX21v
dmUpCisKKyAgc2VydmljZV8tPkFwcGx5Q2h1bmtQYXRjaGVzKGlkXywgcmVxX3VudHJ1c3RlZC5j
aHVua3NfdG9fcGF0Y2goKSk7CisKKyAgaWYgKHJlcV91bnRydXN0ZWQuZmx1c2hfcmVxdWVzdF9p
ZCgpKSB7CisgICAgc2VydmljZV8tPk5vdGlmeUZsdXNoRG9uZUZvclByb2R1Y2VyKGlkXywgcmVx
X3VudHJ1c3RlZC5mbHVzaF9yZXF1ZXN0X2lkKCkpOworICB9CisKKyAgLy8gS2VlcCB0aGlzIGlu
dm9jYXRpb24gbGFzdC4gUHJvZHVjZXJJUENTZXJ2aWNlOjpDb21taXREYXRhKCkgcmVsaWVzIG9u
IHRoaXMKKyAgLy8gY2FsbGJhY2sgYmVpbmcgaW52b2tlZCB3aXRoaW4gdGhlIHNhbWUgY2FsbHN0
YWNrIGFuZCBub3QgcG9zdGVkLiBJZiB0aGlzCisgIC8vIGNoYW5nZXMsIHRoZSBjb2RlIHRoZXJl
IG5lZWRzIHRvIGJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCisgIGlmIChjYWxsYmFjaykKKyAgICBj
YWxsYmFjaygpOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6UHJvZHVjZXJFbmRwb2lu
dEltcGw6OlNldHVwU2hhcmVkTWVtb3J5KAorICAgIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1v
cnk+IHNoYXJlZF9tZW1vcnksCisgICAgc2l6ZV90IHBhZ2Vfc2l6ZV9ieXRlcywKKyAgICBib29s
IHByb3ZpZGVkX2J5X3Byb2R1Y2VyKSB7CisgIFBFUkZFVFRPX0RDSEVDSyghc2hhcmVkX21lbW9y
eV8gJiYgIXNobWVtX2FiaV8uaXNfdmFsaWQoKSk7CisgIFBFUkZFVFRPX0RDSEVDSyhwYWdlX3Np
emVfYnl0ZXMgJSAxMDI0ID09IDApOworCisgIHNoYXJlZF9tZW1vcnlfID0gc3RkOjptb3ZlKHNo
YXJlZF9tZW1vcnkpOworICBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYl8gPSBwYWdlX3NpemVf
Ynl0ZXMgLyAxMDI0OworICBpc19zaG1lbV9wcm92aWRlZF9ieV9wcm9kdWNlcl8gPSBwcm92aWRl
ZF9ieV9wcm9kdWNlcjsKKworICBzaG1lbV9hYmlfLkluaXRpYWxpemUocmVpbnRlcnByZXRfY2Fz
dDx1aW50OF90Kj4oc2hhcmVkX21lbW9yeV8tPnN0YXJ0KCkpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgc2hhcmVkX21lbW9yeV8tPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNo
YXJlZF9idWZmZXJfcGFnZV9zaXplX2tiKCkgKiAxMDI0KTsKKyAgaWYgKGluX3Byb2Nlc3NfKSB7
CisgICAgaW5wcm9jX3NobWVtX2FyYml0ZXJfLnJlc2V0KG5ldyBTaGFyZWRNZW1vcnlBcmJpdGVy
SW1wbCgKKyAgICAgICAgc2hhcmVkX21lbW9yeV8tPnN0YXJ0KCksIHNoYXJlZF9tZW1vcnlfLT5z
aXplKCksCisgICAgICAgIHNoYXJlZF9idWZmZXJfcGFnZV9zaXplX2tiXyAqIDEwMjQsIHRoaXMs
IHRhc2tfcnVubmVyXykpOworICB9CisKKyAgT25UcmFjaW5nU2V0dXAoKTsKKyAgc2VydmljZV8t
PlVwZGF0ZU1lbW9yeUd1YXJkcmFpbCgpOworfQorCitTaGFyZWRNZW1vcnkqIFRyYWNpbmdTZXJ2
aWNlSW1wbDo6UHJvZHVjZXJFbmRwb2ludEltcGw6OnNoYXJlZF9tZW1vcnkoKSBjb25zdCB7Cisg
IFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgcmV0dXJuIHNoYXJl
ZF9tZW1vcnlfLmdldCgpOworfQorCitzaXplX3QgVHJhY2luZ1NlcnZpY2VJbXBsOjpQcm9kdWNl
ckVuZHBvaW50SW1wbDo6c2hhcmVkX2J1ZmZlcl9wYWdlX3NpemVfa2IoKQorICAgIGNvbnN0IHsK
KyAgcmV0dXJuIHNoYXJlZF9idWZmZXJfcGFnZV9zaXplX2tiXzsKK30KKwordm9pZCBUcmFjaW5n
U2VydmljZUltcGw6OlByb2R1Y2VyRW5kcG9pbnRJbXBsOjpBY3RpdmF0ZVRyaWdnZXJzKAorICAg
IGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdHJpZ2dlcnMpIHsKKyAgc2VydmljZV8t
PkFjdGl2YXRlVHJpZ2dlcnMoaWRfLCB0cmlnZ2Vycyk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZp
Y2VJbXBsOjpQcm9kdWNlckVuZHBvaW50SW1wbDo6U3RvcERhdGFTb3VyY2UoCisgICAgRGF0YVNv
dXJjZUluc3RhbmNlSUQgZHNfaW5zdF9pZCkgeworICAvLyBUT0RPKHByaW1pYW5vKTogV2hlbiB3
ZSdsbCBzdXBwb3J0IHRlYXJpbmcgZG93biB0aGUgU01CLCBhdCB0aGlzIHBvaW50IHdlCisgIC8v
IHNob3VsZCBzZW5kIHRoZSBQcm9kdWNlciBhIFRlYXJEb3duVHJhY2luZyBpZiBhbGwgaXRzIGRh
dGEgc291cmNlcyBoYXZlCisgIC8vIGJlZW4gZGlzYWJsZWQgKHNlZSBiLzc3NTMyODM5IGFuZCBh
b3NwLzY1NTE3OSBQUzEpLgorICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2Vy
Xyk7CisgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOwor
ICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt3ZWFrX3RoaXMsIGRzX2luc3RfaWRdIHsKKyAgICBp
ZiAod2Vha190aGlzKQorICAgICAgd2Vha190aGlzLT5wcm9kdWNlcl8tPlN0b3BEYXRhU291cmNl
KGRzX2luc3RfaWQpOworICB9KTsKK30KKworU2hhcmVkTWVtb3J5QXJiaXRlcioKK1RyYWNpbmdT
ZXJ2aWNlSW1wbDo6UHJvZHVjZXJFbmRwb2ludEltcGw6Ok1heWJlU2hhcmVkTWVtb3J5QXJiaXRl
cigpIHsKKyAgaWYgKCFpbnByb2Nfc2htZW1fYXJiaXRlcl8pIHsKKyAgICBQRVJGRVRUT19GQVRB
TCgKKyAgICAgICAgIlRoZSBpbi1wcm9jZXNzIFNoYXJlZE1lbW9yeUFyYml0ZXIgY2FuIG9ubHkg
YmUgdXNlZCB3aGVuICIKKyAgICAgICAgIkNyZWF0ZVByb2R1Y2VyIGhhcyBiZWVuIGNhbGxlZCB3
aXRoIGluX3Byb2Nlc3M9dHJ1ZSBhbmQgYWZ0ZXIgdHJhY2luZyAiCisgICAgICAgICJoYXMgc3Rh
cnRlZC4iKTsKKyAgfQorCisgIFBFUkZFVFRPX0RDSEVDSyhpbl9wcm9jZXNzXyk7CisgIHJldHVy
biBpbnByb2Nfc2htZW1fYXJiaXRlcl8uZ2V0KCk7Cit9CisKK2Jvb2wgVHJhY2luZ1NlcnZpY2VJ
bXBsOjpQcm9kdWNlckVuZHBvaW50SW1wbDo6SXNTaG1lbVByb3ZpZGVkQnlQcm9kdWNlcigpCisg
ICAgY29uc3QgeworICByZXR1cm4gaXNfc2htZW1fcHJvdmlkZWRfYnlfcHJvZHVjZXJfOworfQor
CisvLyBDYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCitzdGQ6OnVuaXF1ZV9wdHI8VHJhY2VX
cml0ZXI+CitUcmFjaW5nU2VydmljZUltcGw6OlByb2R1Y2VyRW5kcG9pbnRJbXBsOjpDcmVhdGVU
cmFjZVdyaXRlcigKKyAgICBCdWZmZXJJRCBidWZfaWQsCisgICAgQnVmZmVyRXhoYXVzdGVkUG9s
aWN5IGJ1ZmZlcl9leGhhdXN0ZWRfcG9saWN5KSB7CisgIFBFUkZFVFRPX0RDSEVDSyhNYXliZVNo
YXJlZE1lbW9yeUFyYml0ZXIoKSk7CisgIHJldHVybiBNYXliZVNoYXJlZE1lbW9yeUFyYml0ZXIo
KS0+Q3JlYXRlVHJhY2VXcml0ZXIoYnVmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9leGhhdXN0ZWRfcG9saWN5KTsKK30K
Kwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OlByb2R1Y2VyRW5kcG9pbnRJbXBsOjpOb3RpZnlG
bHVzaENvbXBsZXRlKAorICAgIEZsdXNoUmVxdWVzdElEIGlkKSB7CisgIFBFUkZFVFRPX0RDSEVD
S19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgUEVSRkVUVE9fRENIRUNLKE1heWJlU2hhcmVk
TWVtb3J5QXJiaXRlcigpKTsKKyAgcmV0dXJuIE1heWJlU2hhcmVkTWVtb3J5QXJiaXRlcigpLT5O
b3RpZnlGbHVzaENvbXBsZXRlKGlkKTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OlBy
b2R1Y2VyRW5kcG9pbnRJbXBsOjpPblRyYWNpbmdTZXR1cCgpIHsKKyAgYXV0byB3ZWFrX3RoaXMg
PSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIHRhc2tfcnVubmVyXy0+UG9zdFRh
c2soW3dlYWtfdGhpc10geworICAgIGlmICh3ZWFrX3RoaXMpCisgICAgICB3ZWFrX3RoaXMtPnBy
b2R1Y2VyXy0+T25UcmFjaW5nU2V0dXAoKTsKKyAgfSk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZp
Y2VJbXBsOjpQcm9kdWNlckVuZHBvaW50SW1wbDo6Rmx1c2goCisgICAgRmx1c2hSZXF1ZXN0SUQg
Zmx1c2hfcmVxdWVzdF9pZCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxEYXRhU291cmNlSW5zdGFu
Y2VJRD4mIGRhdGFfc291cmNlcykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9j
aGVja2VyXyk7CisgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0
cigpOworICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt3ZWFrX3RoaXMsIGZsdXNoX3JlcXVlc3Rf
aWQsIGRhdGFfc291cmNlc10geworICAgIGlmICh3ZWFrX3RoaXMpIHsKKyAgICAgIHdlYWtfdGhp
cy0+cHJvZHVjZXJfLT5GbHVzaChmbHVzaF9yZXF1ZXN0X2lkLCBkYXRhX3NvdXJjZXMuZGF0YSgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc291cmNlcy5zaXplKCkp
OworICAgIH0KKyAgfSk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpQcm9kdWNlckVu
ZHBvaW50SW1wbDo6U2V0dXBEYXRhU291cmNlKAorICAgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGRz
X2lkLAorICAgIGNvbnN0IERhdGFTb3VyY2VDb25maWcmIGNvbmZpZykgeworICBQRVJGRVRUT19E
Q0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGFsbG93ZWRfdGFyZ2V0X2J1ZmZlcnNf
Lmluc2VydChzdGF0aWNfY2FzdDxCdWZmZXJJRD4oY29uZmlnLnRhcmdldF9idWZmZXIoKSkpOwor
ICBhdXRvIHdlYWtfdGhpcyA9IHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKKyAgdGFz
a19ydW5uZXJfLT5Qb3N0VGFzayhbd2Vha190aGlzLCBkc19pZCwgY29uZmlnXSB7CisgICAgaWYg
KHdlYWtfdGhpcykKKyAgICAgIHdlYWtfdGhpcy0+cHJvZHVjZXJfLT5TZXR1cERhdGFTb3VyY2Uo
ZHNfaWQsIHN0ZDo6bW92ZShjb25maWcpKTsKKyAgfSk7Cit9CisKK3ZvaWQgVHJhY2luZ1NlcnZp
Y2VJbXBsOjpQcm9kdWNlckVuZHBvaW50SW1wbDo6U3RhcnREYXRhU291cmNlKAorICAgIERhdGFT
b3VyY2VJbnN0YW5jZUlEIGRzX2lkLAorICAgIGNvbnN0IERhdGFTb3VyY2VDb25maWcmIGNvbmZp
ZykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGF1dG8g
d2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOworICB0YXNrX3J1bm5l
cl8tPlBvc3RUYXNrKFt3ZWFrX3RoaXMsIGRzX2lkLCBjb25maWddIHsKKyAgICBpZiAod2Vha190
aGlzKQorICAgICAgd2Vha190aGlzLT5wcm9kdWNlcl8tPlN0YXJ0RGF0YVNvdXJjZShkc19pZCwg
c3RkOjptb3ZlKGNvbmZpZykpOworICB9KTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6
OlByb2R1Y2VyRW5kcG9pbnRJbXBsOjpOb3RpZnlEYXRhU291cmNlU3RhcnRlZCgKKyAgICBEYXRh
U291cmNlSW5zdGFuY2VJRCBkYXRhX3NvdXJjZV9pZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhS
RUFEKHRocmVhZF9jaGVja2VyXyk7CisgIHNlcnZpY2VfLT5Ob3RpZnlEYXRhU291cmNlU3RhcnRl
ZChpZF8sIGRhdGFfc291cmNlX2lkKTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OlBy
b2R1Y2VyRW5kcG9pbnRJbXBsOjpOb3RpZnlEYXRhU291cmNlU3RvcHBlZCgKKyAgICBEYXRhU291
cmNlSW5zdGFuY2VJRCBkYXRhX3NvdXJjZV9pZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFE
KHRocmVhZF9jaGVja2VyXyk7CisgIHNlcnZpY2VfLT5Ob3RpZnlEYXRhU291cmNlU3RvcHBlZChp
ZF8sIGRhdGFfc291cmNlX2lkKTsKK30KKwordm9pZCBUcmFjaW5nU2VydmljZUltcGw6OlByb2R1
Y2VyRW5kcG9pbnRJbXBsOjpPbkZyZWVCdWZmZXJzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJ1
ZmZlcklEPiYgdGFyZ2V0X2J1ZmZlcnMpIHsKKyAgaWYgKGFsbG93ZWRfdGFyZ2V0X2J1ZmZlcnNf
LmVtcHR5KCkpCisgICAgcmV0dXJuOworICBmb3IgKEJ1ZmZlcklEIGJ1ZmZlciA6IHRhcmdldF9i
dWZmZXJzKQorICAgIGFsbG93ZWRfdGFyZ2V0X2J1ZmZlcnNfLmVyYXNlKGJ1ZmZlcik7Cit9CisK
K3ZvaWQgVHJhY2luZ1NlcnZpY2VJbXBsOjpQcm9kdWNlckVuZHBvaW50SW1wbDo6Q2xlYXJJbmNy
ZW1lbnRhbFN0YXRlKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPERhdGFTb3VyY2VJbnN0YW5jZUlE
PiYgZGF0YV9zb3VyY2VzKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNr
ZXJfKTsKKyAgYXV0byB3ZWFrX3RoaXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7
CisgIHRhc2tfcnVubmVyXy0+UG9zdFRhc2soW3dlYWtfdGhpcywgZGF0YV9zb3VyY2VzXSB7Cisg
ICAgaWYgKHdlYWtfdGhpcykgeworICAgICAgd2Vha190aGlzLT5wcm9kdWNlcl8tPkNsZWFySW5j
cmVtZW50YWxTdGF0ZShkYXRhX3NvdXJjZXMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NvdXJjZXMuc2l6ZSgpKTsKKyAgICB9
CisgIH0pOworfQorCit2b2lkIFRyYWNpbmdTZXJ2aWNlSW1wbDo6UHJvZHVjZXJFbmRwb2ludElt
cGw6OlN5bmMoCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNhbGxiYWNrKSB7CisgIHRhc2tf
cnVubmVyXy0+UG9zdFRhc2soY2FsbGJhY2spOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
LworLy8gVHJhY2luZ1NlcnZpY2VJbXBsOjpUcmFjaW5nU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbgor
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVHJhY2luZ1NlcnZpY2VJbXBsOjpUcmFjaW5nU2Vz
c2lvbjo6VHJhY2luZ1Nlc3Npb24oCisgICAgVHJhY2luZ1Nlc3Npb25JRCBzZXNzaW9uX2lkLAor
ICAgIENvbnN1bWVyRW5kcG9pbnRJbXBsKiBjb25zdW1lciwKKyAgICBjb25zdCBUcmFjZUNvbmZp
ZyYgbmV3X2NvbmZpZykKKyAgICA6IGlkKHNlc3Npb25faWQpLAorICAgICAgY29uc3VtZXJfbWF5
YmVfbnVsbChjb25zdW1lciksCisgICAgICBjb25zdW1lcl91aWQoY29uc3VtZXItPnVpZF8pLAor
ICAgICAgY29uZmlnKG5ld19jb25maWcpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bwor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcvaW50ZXJuYWwvaW5f
cHJvY2Vzc190cmFjaW5nX2JhY2tlbmQuY2MKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhl
IEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBB
cGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBu
b3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgor
ICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBo
dHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3Mg
cmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3
YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBh
biAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0Yg
QU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2Ug
Zm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBs
aW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL2luX3Byb2Nlc3Nf
dHJhY2luZ19iYWNrZW5kLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS90YXNrX3J1bm5lci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvcGFnZWRfbWVtb3J5Lmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJh
Y2luZy9jb3JlL3NoYXJlZF9tZW1vcnkuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2luZ19zZXJ2aWNlLmgiCisK
Ky8vIFRPRE8ocHJpbWlhbm8pOiBXaGVuIHRoZSBpbi1wcm9jZXNzIGJhY2tlbmQgaXMgdXNlZCwg
d2Ugc2hvdWxkIG5ldmVyIGVuZCB1cAorLy8gaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIHRocmVh
ZCB3aGVyZSB0aGUgVHJhY2luZ1NlcnZpY2UgYW5kIFByb2R1Y2VyIGxpdmUKKy8vIHdyaXRlcyBh
IHBhY2tldCBhbmQgaGVuY2UgY2FuIGdldCBpbnRvIHRoZSBHZXROZXdDaHVuaygpIHN0YWxsLgor
Ly8gVGhpcyB3b3VsZCBoYXBwZW4gb25seSBpZiB0aGUgQVBJIGNsaWVudCBjb2RlIGNhbGxzIFRy
YWNlKCkgZnJvbSBvbmUgb2YgdGhlCisvLyBjYWxsYmFja3MgaXQgcmVjZWl2ZXMgKGUuZy4gT25T
dGFydCgpLCBPblN0b3AoKSkuIFdlIHNob3VsZCBlaXRoZXIgY2F1c2UgYQorLy8gaGFyZCBjcmFz
aCBvciBpZ25vcmUgdHJhY2VzIGZyb20gdGhhdCB0aHJlYWQgaWYgdGhhdCBoYXBwZW5zLCBiZWNh
dXNlIGl0CisvLyB3aWxsIGRlYWRsb2NrICh0aGUgU2VydmljZSB3aWxsIG5ldmVyIGZyZWUgdXAg
dGhlIFNNQiBiZWNhdXNlIHdvbid0IGV2ZXIgZ2V0CisvLyB0byBydW4gdGhlIHRhc2spLgorCitu
YW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIHsK
KworY2xhc3MgSW5Qcm9jZXNzU2htIDogcHVibGljIFNoYXJlZE1lbW9yeSB7CisgcHVibGljOgor
ICBleHBsaWNpdCBJblByb2Nlc3NTaG0oc2l6ZV90IHNpemUpOworICB+SW5Qcm9jZXNzU2htKCkg
b3ZlcnJpZGU7CisgIHZvaWQqIHN0YXJ0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHNpemVfdCBzaXpl
KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBmZCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0
ZToKKyAgYmFzZTo6UGFnZWRNZW1vcnkgbWVtXzsKK307CisKK2NsYXNzIEluUHJvY2Vzc1NobUZh
Y3RvcnkgOiBwdWJsaWMgU2hhcmVkTWVtb3J5OjpGYWN0b3J5IHsKKyBwdWJsaWM6CisgIH5JblBy
b2Nlc3NTaG1GYWN0b3J5KCkgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1v
cnk+IENyZWF0ZVNoYXJlZE1lbW9yeShzaXplX3QpIG92ZXJyaWRlOworfTsKKworSW5Qcm9jZXNz
U2htOjp+SW5Qcm9jZXNzU2htKCkgPSBkZWZhdWx0OworCitJblByb2Nlc3NTaG06OkluUHJvY2Vz
c1NobShzaXplX3Qgc2l6ZSkKKyAgICA6IG1lbV8oYmFzZTo6UGFnZWRNZW1vcnk6OkFsbG9jYXRl
KHNpemUpKSB7fQorCit2b2lkKiBJblByb2Nlc3NTaG06OnN0YXJ0KCkgY29uc3QgeworICByZXR1
cm4gbWVtXy5HZXQoKTsKK30KKworc2l6ZV90IEluUHJvY2Vzc1NobTo6c2l6ZSgpIGNvbnN0IHsK
KyAgcmV0dXJuIG1lbV8uc2l6ZSgpOworfQorCitpbnQgSW5Qcm9jZXNzU2htOjpmZCgpIGNvbnN0
IHsKKyAgcmV0dXJuIC0xOworfQorCitJblByb2Nlc3NTaG1GYWN0b3J5Ojp+SW5Qcm9jZXNzU2ht
RmFjdG9yeSgpID0gZGVmYXVsdDsKK3N0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnk+IEluUHJv
Y2Vzc1NobUZhY3Rvcnk6OkNyZWF0ZVNoYXJlZE1lbW9yeSgKKyAgICBzaXplX3Qgc2l6ZSkgewor
ICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeT4obmV3IEluUHJvY2Vzc1NobShz
aXplKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK1RyYWNpbmdCYWNrZW5k
KiBJblByb2Nlc3NUcmFjaW5nQmFja2VuZDo6R2V0SW5zdGFuY2UoKSB7CisgIHN0YXRpYyBhdXRv
KiBpbnN0YW5jZSA9IG5ldyBJblByb2Nlc3NUcmFjaW5nQmFja2VuZCgpOworICByZXR1cm4gaW5z
dGFuY2U7Cit9CisKK0luUHJvY2Vzc1RyYWNpbmdCYWNrZW5kOjpJblByb2Nlc3NUcmFjaW5nQmFj
a2VuZCgpIHt9CisKK3N0ZDo6dW5pcXVlX3B0cjxQcm9kdWNlckVuZHBvaW50PiBJblByb2Nlc3NU
cmFjaW5nQmFja2VuZDo6Q29ubmVjdFByb2R1Y2VyKAorICAgIGNvbnN0IENvbm5lY3RQcm9kdWNl
ckFyZ3MmIGFyZ3MpIHsKKyAgUEVSRkVUVE9fRENIRUNLKGFyZ3MudGFza19ydW5uZXItPlJ1bnNU
YXNrc09uQ3VycmVudFRocmVhZCgpKTsKKworICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4g
YXMgd2UgY2FuIGhhdmUgYXQgbW9zdCBvbmUgaW4tcHJvY2VzcyBiYWNrZW5kLgorICBpZiAoc2Vy
dmljZV8pCisgICAgUEVSRkVUVE9fRkFUQUwoIkluUHJvY2Vzc1RyYWNpbmdCYWNrZW5kIGluaXRp
YWxpemVkIHR3aWNlIik7CisKKyAgcmV0dXJuIEdldE9yQ3JlYXRlU2VydmljZShhcmdzLnRhc2tf
cnVubmVyKQorICAgICAgLT5Db25uZWN0UHJvZHVjZXIoYXJncy5wcm9kdWNlciwgLyp1aWQ9Ki8w
LCBhcmdzLnByb2R1Y2VyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNobWVt
X3NpemVfaGludF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5fcHJvY2Vzcz0q
L3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nU2VydmljZTo6UHJvZHVjZXJT
TUJTY3JhcGluZ01vZGU6OmtFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5z
aG1lbV9wYWdlX3NpemVfaGludF9ieXRlcyk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDb25zdW1l
ckVuZHBvaW50PiBJblByb2Nlc3NUcmFjaW5nQmFja2VuZDo6Q29ubmVjdENvbnN1bWVyKAorICAg
IGNvbnN0IENvbm5lY3RDb25zdW1lckFyZ3MmIGFyZ3MpIHsKKyAgcmV0dXJuIEdldE9yQ3JlYXRl
U2VydmljZShhcmdzLnRhc2tfcnVubmVyKQorICAgICAgLT5Db25uZWN0Q29uc3VtZXIoYXJncy5j
b25zdW1lciwgLyp1aWQ9Ki8wKTsKK30KKworVHJhY2luZ1NlcnZpY2UqIEluUHJvY2Vzc1RyYWNp
bmdCYWNrZW5kOjpHZXRPckNyZWF0ZVNlcnZpY2UoCisgICAgYmFzZTo6VGFza1J1bm5lciogdGFz
a19ydW5uZXIpIHsKKyAgaWYgKCFzZXJ2aWNlXykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxJblBy
b2Nlc3NTaG1GYWN0b3J5PiBzaG0obmV3IEluUHJvY2Vzc1NobUZhY3RvcnkoKSk7CisgICAgc2Vy
dmljZV8gPSBUcmFjaW5nU2VydmljZTo6Q3JlYXRlSW5zdGFuY2Uoc3RkOjptb3ZlKHNobSksIHRh
c2tfcnVubmVyKTsKKyAgICBzZXJ2aWNlXy0+U2V0U01CU2NyYXBpbmdFbmFibGVkKHRydWUpOwor
ICB9CisgIHJldHVybiBzZXJ2aWNlXy5nZXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVy
bmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBz
b3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vaXBjL2NvbnN1bWVyX3BvcnQuZ2VuLmNjCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2lwYy9jb25z
dW1lcl9wb3J0Lmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0
byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
SVBDX0NPTlNVTUVSX1BPUlRfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fSVBDX0NPTlNVTUVSX1BPUlRfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRl
IDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1
ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVz
cGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBRdWVyeUNhcGFiaWxpdGllc1Jl
c3BvbnNlOworY2xhc3MgVHJhY2luZ1NlcnZpY2VDYXBhYmlsaXRpZXM7CitjbGFzcyBRdWVyeUNh
cGFiaWxpdGllc1JlcXVlc3Q7CitjbGFzcyBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlOworY2xh
c3MgVHJhY2luZ1NlcnZpY2VTdGF0ZTsKK2NsYXNzIFRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNv
dXJjZTsKK2NsYXNzIERhdGFTb3VyY2VEZXNjcmlwdG9yOworY2xhc3MgVHJhY2luZ1NlcnZpY2VT
dGF0ZV9Qcm9kdWNlcjsKK2NsYXNzIFF1ZXJ5U2VydmljZVN0YXRlUmVxdWVzdDsKK2NsYXNzIE9i
c2VydmVFdmVudHNSZXNwb25zZTsKK2NsYXNzIE9ic2VydmFibGVFdmVudHM7CitjbGFzcyBPYnNl
cnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlOworY2xhc3MgT2JzZXJ2
ZUV2ZW50c1JlcXVlc3Q7CitjbGFzcyBHZXRUcmFjZVN0YXRzUmVzcG9uc2U7CitjbGFzcyBUcmFj
ZVN0YXRzOworY2xhc3MgVHJhY2VTdGF0c19CdWZmZXJTdGF0czsKK2NsYXNzIEdldFRyYWNlU3Rh
dHNSZXF1ZXN0OworY2xhc3MgQXR0YWNoUmVzcG9uc2U7CitjbGFzcyBUcmFjZUNvbmZpZzsKK2Ns
YXNzIFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnOworY2xhc3MgVHJhY2VDb25maWdf
SW5jcmVtZW50YWxTdGF0ZUNvbmZpZzsKK2NsYXNzIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWc7
CitjbGFzcyBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI7CitjbGFzcyBUcmFjZUNv
bmZpZ19HdWFyZHJhaWxPdmVycmlkZXM7CitjbGFzcyBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0
YTsKK2NsYXNzIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnOworY2xhc3MgVHJhY2VDb25maWdf
QnVpbHRpbkRhdGFTb3VyY2U7CitjbGFzcyBUcmFjZUNvbmZpZ19EYXRhU291cmNlOworY2xhc3Mg
RGF0YVNvdXJjZUNvbmZpZzsKK2NsYXNzIFRlc3RDb25maWc7CitjbGFzcyBUZXN0Q29uZmlnX0R1
bW15RmllbGRzOworY2xhc3MgQ2hyb21lQ29uZmlnOworY2xhc3MgVHJhY2VDb25maWdfQnVmZmVy
Q29uZmlnOworY2xhc3MgQXR0YWNoUmVxdWVzdDsKK2NsYXNzIERldGFjaFJlc3BvbnNlOworY2xh
c3MgRGV0YWNoUmVxdWVzdDsKK2NsYXNzIEZsdXNoUmVzcG9uc2U7CitjbGFzcyBGbHVzaFJlcXVl
c3Q7CitjbGFzcyBGcmVlQnVmZmVyc1Jlc3BvbnNlOworY2xhc3MgRnJlZUJ1ZmZlcnNSZXF1ZXN0
OworY2xhc3MgUmVhZEJ1ZmZlcnNSZXNwb25zZTsKK2NsYXNzIFJlYWRCdWZmZXJzUmVzcG9uc2Vf
U2xpY2U7CitjbGFzcyBSZWFkQnVmZmVyc1JlcXVlc3Q7CitjbGFzcyBEaXNhYmxlVHJhY2luZ1Jl
c3BvbnNlOworY2xhc3MgRGlzYWJsZVRyYWNpbmdSZXF1ZXN0OworY2xhc3MgQ2hhbmdlVHJhY2VD
b25maWdSZXNwb25zZTsKK2NsYXNzIENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdDsKK2NsYXNzIFN0
YXJ0VHJhY2luZ1Jlc3BvbnNlOworY2xhc3MgU3RhcnRUcmFjaW5nUmVxdWVzdDsKK2NsYXNzIEVu
YWJsZVRyYWNpbmdSZXNwb25zZTsKK2NsYXNzIEVuYWJsZVRyYWNpbmdSZXF1ZXN0OworZW51bSBP
YnNlcnZhYmxlRXZlbnRzX1R5cGUgOiBpbnQ7CitlbnVtIE9ic2VydmFibGVFdmVudHNfRGF0YVNv
dXJjZUluc3RhbmNlU3RhdGUgOiBpbnQ7CitlbnVtIFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9w
ZXJhdGlvbiA6IGludDsKK2VudW0gVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlIDogaW50Owor
ZW51bSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlIDogaW50OworZW51bSBC
dWlsdGluQ2xvY2sgOiBpbnQ7CitlbnVtIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9s
aWN5IDogaW50OworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJv
dG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3Mg
TWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRP
X0VYUE9SVCBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpD
cHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrQ2Fw
YWJpbGl0aWVzRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIFF1ZXJ5Q2FwYWJpbGl0aWVzUmVz
cG9uc2UoKTsKKyAgflF1ZXJ5Q2FwYWJpbGl0aWVzUmVzcG9uc2UoKSBvdmVycmlkZTsKKyAgUXVl
cnlDYXBhYmlsaXRpZXNSZXNwb25zZShRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlJiYpIG5vZXhj
ZXB0OworICBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlJiBvcGVyYXRvcj0oUXVlcnlDYXBhYmls
aXRpZXNSZXNwb25zZSYmKTsKKyAgUXVlcnlDYXBhYmlsaXRpZXNSZXNwb25zZShjb25zdCBRdWVy
eUNhcGFiaWxpdGllc1Jlc3BvbnNlJik7CisgIFF1ZXJ5Q2FwYWJpbGl0aWVzUmVzcG9uc2UmIG9w
ZXJhdG9yPShjb25zdCBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlJik7CisgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlJikgY29uc3Q7CisgIGJvb2wgb3Bl
cmF0b3IhPShjb25zdCBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlJiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmlu
ZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNz
YWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfY2FwYWJpbGl0aWVzKCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bMV07IH0KKyAgY29uc3QgVHJhY2luZ1NlcnZpY2VDYXBhYmlsaXRpZXMmIGNh
cGFiaWxpdGllcygpIGNvbnN0IHsgcmV0dXJuICpjYXBhYmlsaXRpZXNfOyB9CisgIFRyYWNpbmdT
ZXJ2aWNlQ2FwYWJpbGl0aWVzKiBtdXRhYmxlX2NhcGFiaWxpdGllcygpIHsgX2hhc19maWVsZF8u
c2V0KDEpOyByZXR1cm4gY2FwYWJpbGl0aWVzXy5nZXQoKTsgfQorCisgcHJpdmF0ZToKKyAgOjpw
cm90b3plcm86OkNvcHlhYmxlUHRyPFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzPiBjYXBhYmls
aXRpZXNfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxk
cyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8g
ZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwy
PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgUXVlcnlDYXBh
YmlsaXRpZXNSZXF1ZXN0IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBw
dWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgfTsKKworICBRdWVyeUNhcGFiaWxpdGll
c1JlcXVlc3QoKTsKKyAgflF1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdCgpIG92ZXJyaWRlOworICBR
dWVyeUNhcGFiaWxpdGllc1JlcXVlc3QoUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0JiYpIG5vZXhj
ZXB0OworICBRdWVyeUNhcGFiaWxpdGllc1JlcXVlc3QmIG9wZXJhdG9yPShRdWVyeUNhcGFiaWxp
dGllc1JlcXVlc3QmJik7CisgIFF1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdChjb25zdCBRdWVyeUNh
cGFiaWxpdGllc1JlcXVlc3QmKTsKKyAgUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0JiBvcGVyYXRv
cj0oY29uc3QgUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0Jik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBRdWVyeUNhcGFiaWxpdGllc1JlcXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IFF1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEo
KnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwg
c2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25z
dCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNv
bnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNv
bnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90
b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMg
b2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3Rk
OjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JU
IFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3Nh
Z2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtTZXJ2aWNlU3Rh
dGVGaWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgUXVlcnlTZXJ2aWNlU3RhdGVSZXNwb25zZSgp
OworICB+UXVlcnlTZXJ2aWNlU3RhdGVSZXNwb25zZSgpIG92ZXJyaWRlOworICBRdWVyeVNlcnZp
Y2VTdGF0ZVJlc3BvbnNlKFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UmJikgbm9leGNlcHQ7Cisg
IFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UmIG9wZXJhdG9yPShRdWVyeVNlcnZpY2VTdGF0ZVJl
c3BvbnNlJiYpOworICBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlKGNvbnN0IFF1ZXJ5U2Vydmlj
ZVN0YXRlUmVzcG9uc2UmKTsKKyAgUXVlcnlTZXJ2aWNlU3RhdGVSZXNwb25zZSYgb3BlcmF0b3I9
KGNvbnN0IFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNv
bnN0IFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UmIG90aGVyKSBjb25zdCB7IHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCos
IHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29u
c3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBj
b25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBj
b25zdDsKKworICBib29sIGhhc19zZXJ2aWNlX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMV07IH0KKyAgY29uc3QgVHJhY2luZ1NlcnZpY2VTdGF0ZSYgc2VydmljZV9zdGF0ZSgp
IGNvbnN0IHsgcmV0dXJuICpzZXJ2aWNlX3N0YXRlXzsgfQorICBUcmFjaW5nU2VydmljZVN0YXRl
KiBtdXRhYmxlX3NlcnZpY2Vfc3RhdGUoKSB7IF9oYXNfZmllbGRfLnNldCgxKTsgcmV0dXJuIHNl
cnZpY2Vfc3RhdGVfLmdldCgpOyB9CisKKyBwcml2YXRlOgorICA6OnByb3RvemVybzo6Q29weWFi
bGVQdHI8VHJhY2luZ1NlcnZpY2VTdGF0ZT4gc2VydmljZV9zdGF0ZV87CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9Owor
CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3QgOiBwdWJs
aWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51
bWJlcnMgeworICB9OworCisgIFF1ZXJ5U2VydmljZVN0YXRlUmVxdWVzdCgpOworICB+UXVlcnlT
ZXJ2aWNlU3RhdGVSZXF1ZXN0KCkgb3ZlcnJpZGU7CisgIFF1ZXJ5U2VydmljZVN0YXRlUmVxdWVz
dChRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3QmJikgbm9leGNlcHQ7CisgIFF1ZXJ5U2VydmljZVN0
YXRlUmVxdWVzdCYgb3BlcmF0b3I9KFF1ZXJ5U2VydmljZVN0YXRlUmVxdWVzdCYmKTsKKyAgUXVl
cnlTZXJ2aWNlU3RhdGVSZXF1ZXN0KGNvbnN0IFF1ZXJ5U2VydmljZVN0YXRlUmVxdWVzdCYpOwor
ICBRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBRdWVyeVNlcnZpY2VT
dGF0ZVJlcXVlc3QmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFF1ZXJ5U2VydmljZVN0YXRl
UmVxdWVzdCYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUXVlcnlTZXJ2aWNlU3Rh
dGVSZXF1ZXN0JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKwor
ICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBz
dGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZl
Y3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQg
U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyBwcml2YXRlOgorCisg
IC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0
aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0
ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxk
X3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgT2JzZXJ2ZUV2ZW50c1Jlc3BvbnNl
IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0g
RmllbGROdW1iZXJzIHsKKyAgICBrRXZlbnRzRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIE9i
c2VydmVFdmVudHNSZXNwb25zZSgpOworICB+T2JzZXJ2ZUV2ZW50c1Jlc3BvbnNlKCkgb3ZlcnJp
ZGU7CisgIE9ic2VydmVFdmVudHNSZXNwb25zZShPYnNlcnZlRXZlbnRzUmVzcG9uc2UmJikgbm9l
eGNlcHQ7CisgIE9ic2VydmVFdmVudHNSZXNwb25zZSYgb3BlcmF0b3I9KE9ic2VydmVFdmVudHNS
ZXNwb25zZSYmKTsKKyAgT2JzZXJ2ZUV2ZW50c1Jlc3BvbnNlKGNvbnN0IE9ic2VydmVFdmVudHNS
ZXNwb25zZSYpOworICBPYnNlcnZlRXZlbnRzUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBPYnNl
cnZlRXZlbnRzUmVzcG9uc2UmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE9ic2VydmVFdmVu
dHNSZXNwb25zZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgT2JzZXJ2ZUV2ZW50
c1Jlc3BvbnNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKwor
ICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBz
dGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZl
Y3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQg
U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfZXZl
bnRzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3QgT2JzZXJ2YWJs
ZUV2ZW50cyYgZXZlbnRzKCkgY29uc3QgeyByZXR1cm4gKmV2ZW50c187IH0KKyAgT2JzZXJ2YWJs
ZUV2ZW50cyogbXV0YWJsZV9ldmVudHMoKSB7IF9oYXNfZmllbGRfLnNldCgxKTsgcmV0dXJuIGV2
ZW50c18uZ2V0KCk7IH0KKworIHByaXZhdGU6CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxP
YnNlcnZhYmxlRXZlbnRzPiBldmVudHNfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtu
b3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2
ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsK
KworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRU
T19FWFBPUlQgT2JzZXJ2ZUV2ZW50c1JlcXVlc3QgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1l
c3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtFdmVudHNU
b09ic2VydmVGaWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgT2JzZXJ2ZUV2ZW50c1JlcXVlc3Qo
KTsKKyAgfk9ic2VydmVFdmVudHNSZXF1ZXN0KCkgb3ZlcnJpZGU7CisgIE9ic2VydmVFdmVudHNS
ZXF1ZXN0KE9ic2VydmVFdmVudHNSZXF1ZXN0JiYpIG5vZXhjZXB0OworICBPYnNlcnZlRXZlbnRz
UmVxdWVzdCYgb3BlcmF0b3I9KE9ic2VydmVFdmVudHNSZXF1ZXN0JiYpOworICBPYnNlcnZlRXZl
bnRzUmVxdWVzdChjb25zdCBPYnNlcnZlRXZlbnRzUmVxdWVzdCYpOworICBPYnNlcnZlRXZlbnRz
UmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IE9ic2VydmVFdmVudHNSZXF1ZXN0Jik7CisgIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBPYnNlcnZlRXZlbnRzUmVxdWVzdCYpIGNvbnN0OworICBib29sIG9w
ZXJhdG9yIT0oY29uc3QgT2JzZXJ2ZUV2ZW50c1JlcXVlc3QmIG90aGVyKSBjb25zdCB7IHJldHVy
biAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9p
ZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXko
KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2Uq
KSBjb25zdDsKKworICBpbnQgZXZlbnRzX3RvX29ic2VydmVfc2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IHN0YXRpY19jYXN0PGludD4oZXZlbnRzX3RvX29ic2VydmVfLnNpemUoKSk7IH0KKyAgY29uc3Qg
c3RkOjp2ZWN0b3I8T2JzZXJ2YWJsZUV2ZW50c19UeXBlPiYgZXZlbnRzX3RvX29ic2VydmUoKSBj
b25zdCB7IHJldHVybiBldmVudHNfdG9fb2JzZXJ2ZV87IH0KKyAgc3RkOjp2ZWN0b3I8T2JzZXJ2
YWJsZUV2ZW50c19UeXBlPiogbXV0YWJsZV9ldmVudHNfdG9fb2JzZXJ2ZSgpIHsgcmV0dXJuICZl
dmVudHNfdG9fb2JzZXJ2ZV87IH0KKyAgdm9pZCBjbGVhcl9ldmVudHNfdG9fb2JzZXJ2ZSgpIHsg
ZXZlbnRzX3RvX29ic2VydmVfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfZXZlbnRzX3RvX29ic2Vy
dmUoT2JzZXJ2YWJsZUV2ZW50c19UeXBlIHZhbHVlKSB7IGV2ZW50c190b19vYnNlcnZlXy5lbXBs
YWNlX2JhY2sodmFsdWUpOyB9CisgIE9ic2VydmFibGVFdmVudHNfVHlwZSogYWRkX2V2ZW50c190
b19vYnNlcnZlKCkgeyBldmVudHNfdG9fb2JzZXJ2ZV8uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAm
ZXZlbnRzX3RvX29ic2VydmVfLmJhY2soKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8
T2JzZXJ2YWJsZUV2ZW50c19UeXBlPiBldmVudHNfdG9fb2JzZXJ2ZV87CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9Owor
CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBHZXRUcmFjZVN0YXRzUmVzcG9uc2UgOiBwdWJsaWMg
Ojpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJl
cnMgeworICAgIGtUcmFjZVN0YXRzRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIEdldFRyYWNl
U3RhdHNSZXNwb25zZSgpOworICB+R2V0VHJhY2VTdGF0c1Jlc3BvbnNlKCkgb3ZlcnJpZGU7Cisg
IEdldFRyYWNlU3RhdHNSZXNwb25zZShHZXRUcmFjZVN0YXRzUmVzcG9uc2UmJikgbm9leGNlcHQ7
CisgIEdldFRyYWNlU3RhdHNSZXNwb25zZSYgb3BlcmF0b3I9KEdldFRyYWNlU3RhdHNSZXNwb25z
ZSYmKTsKKyAgR2V0VHJhY2VTdGF0c1Jlc3BvbnNlKGNvbnN0IEdldFRyYWNlU3RhdHNSZXNwb25z
ZSYpOworICBHZXRUcmFjZVN0YXRzUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBHZXRUcmFjZVN0
YXRzUmVzcG9uc2UmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdldFRyYWNlU3RhdHNSZXNw
b25zZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgR2V0VHJhY2VTdGF0c1Jlc3Bv
bnNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29s
IFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0
cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1
aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFs
aXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfdHJhY2Vfc3Rh
dHMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBUcmFjZVN0YXRz
JiB0cmFjZV9zdGF0cygpIGNvbnN0IHsgcmV0dXJuICp0cmFjZV9zdGF0c187IH0KKyAgVHJhY2VT
dGF0cyogbXV0YWJsZV90cmFjZV9zdGF0cygpIHsgX2hhc19maWVsZF8uc2V0KDEpOyByZXR1cm4g
dHJhY2Vfc3RhdHNfLmdldCgpOyB9CisKKyBwcml2YXRlOgorICA6OnByb3RvemVybzo6Q29weWFi
bGVQdHI8VHJhY2VTdGF0cz4gdHJhY2Vfc3RhdHNfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2
ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1
dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmll
bGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQ
RVJGRVRUT19FWFBPUlQgR2V0VHJhY2VTdGF0c1JlcXVlc3QgOiBwdWJsaWMgOjpwcm90b3plcm86
OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICB9Owor
CisgIEdldFRyYWNlU3RhdHNSZXF1ZXN0KCk7CisgIH5HZXRUcmFjZVN0YXRzUmVxdWVzdCgpIG92
ZXJyaWRlOworICBHZXRUcmFjZVN0YXRzUmVxdWVzdChHZXRUcmFjZVN0YXRzUmVxdWVzdCYmKSBu
b2V4Y2VwdDsKKyAgR2V0VHJhY2VTdGF0c1JlcXVlc3QmIG9wZXJhdG9yPShHZXRUcmFjZVN0YXRz
UmVxdWVzdCYmKTsKKyAgR2V0VHJhY2VTdGF0c1JlcXVlc3QoY29uc3QgR2V0VHJhY2VTdGF0c1Jl
cXVlc3QmKTsKKyAgR2V0VHJhY2VTdGF0c1JlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBHZXRUcmFj
ZVN0YXRzUmVxdWVzdCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgR2V0VHJhY2VTdGF0c1Jl
cXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdldFRyYWNlU3RhdHNSZXF1
ZXN0JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29s
IFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0
cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1
aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFs
aXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyBwcml2YXRlOgorCisgIC8vIEFs
bG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0
eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3Ry
aW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9Owor
fTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQXR0YWNoUmVzcG9uc2UgOiBwdWJsaWMgOjpw
cm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMg
eworICAgIGtUcmFjZUNvbmZpZ0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBBdHRhY2hSZXNw
b25zZSgpOworICB+QXR0YWNoUmVzcG9uc2UoKSBvdmVycmlkZTsKKyAgQXR0YWNoUmVzcG9uc2Uo
QXR0YWNoUmVzcG9uc2UmJikgbm9leGNlcHQ7CisgIEF0dGFjaFJlc3BvbnNlJiBvcGVyYXRvcj0o
QXR0YWNoUmVzcG9uc2UmJik7CisgIEF0dGFjaFJlc3BvbnNlKGNvbnN0IEF0dGFjaFJlc3BvbnNl
Jik7CisgIEF0dGFjaFJlc3BvbnNlJiBvcGVyYXRvcj0oY29uc3QgQXR0YWNoUmVzcG9uc2UmKTsK
KyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF0dGFjaFJlc3BvbnNlJikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBBdHRhY2hSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEo
KnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwg
c2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25z
dCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNv
bnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNv
bnN0OworCisgIGJvb2wgaGFzX3RyYWNlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzFdOyB9CisgIGNvbnN0IFRyYWNlQ29uZmlnJiB0cmFjZV9jb25maWcoKSBjb25zdCB7IHJl
dHVybiAqdHJhY2VfY29uZmlnXzsgfQorICBUcmFjZUNvbmZpZyogbXV0YWJsZV90cmFjZV9jb25m
aWcoKSB7IF9oYXNfZmllbGRfLnNldCgxKTsgcmV0dXJuIHRyYWNlX2NvbmZpZ18uZ2V0KCk7IH0K
KworIHByaXZhdGU6CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxUcmFjZUNvbmZpZz4gdHJh
Y2VfY29uZmlnXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBm
aWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnBy
b3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRz
ZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEF0dGFj
aFJlcXVlc3QgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoK
KyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtLZXlGaWVsZE51bWJlciA9IDEsCisgIH07CisK
KyAgQXR0YWNoUmVxdWVzdCgpOworICB+QXR0YWNoUmVxdWVzdCgpIG92ZXJyaWRlOworICBBdHRh
Y2hSZXF1ZXN0KEF0dGFjaFJlcXVlc3QmJikgbm9leGNlcHQ7CisgIEF0dGFjaFJlcXVlc3QmIG9w
ZXJhdG9yPShBdHRhY2hSZXF1ZXN0JiYpOworICBBdHRhY2hSZXF1ZXN0KGNvbnN0IEF0dGFjaFJl
cXVlc3QmKTsKKyAgQXR0YWNoUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IEF0dGFjaFJlcXVlc3Qm
KTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF0dGFjaFJlcXVlc3QmKSBjb25zdDsKKyAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IEF0dGFjaFJlcXVlc3QmIG90aGVyKSBjb25zdCB7IHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCos
IHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29u
c3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBj
b25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBj
b25zdDsKKworICBib29sIGhhc19rZXkoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsg
fQorICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KCkgY29uc3QgeyByZXR1cm4ga2V5XzsgfQorICB2
b2lkIHNldF9rZXkoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IGtleV8gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDEpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBrZXlfe307CisK
KyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21w
YXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAg
c3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmll
bGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBEZXRhY2hSZXNwb25zZSA6IHB1
YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxk
TnVtYmVycyB7CisgIH07CisKKyAgRGV0YWNoUmVzcG9uc2UoKTsKKyAgfkRldGFjaFJlc3BvbnNl
KCkgb3ZlcnJpZGU7CisgIERldGFjaFJlc3BvbnNlKERldGFjaFJlc3BvbnNlJiYpIG5vZXhjZXB0
OworICBEZXRhY2hSZXNwb25zZSYgb3BlcmF0b3I9KERldGFjaFJlc3BvbnNlJiYpOworICBEZXRh
Y2hSZXNwb25zZShjb25zdCBEZXRhY2hSZXNwb25zZSYpOworICBEZXRhY2hSZXNwb25zZSYgb3Bl
cmF0b3I9KGNvbnN0IERldGFjaFJlc3BvbnNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBE
ZXRhY2hSZXNwb25zZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGV0YWNoUmVz
cG9uc2UmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJv
b2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6
c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9y
PHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJp
YWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworIHByaXZhdGU6CisKKyAgLy8g
QWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmls
aXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpz
dHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307
Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBEZXRhY2hSZXF1ZXN0IDogcHVibGljIDo6
cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJz
IHsKKyAgICBrS2V5RmllbGROdW1iZXIgPSAxLAorICB9OworCisgIERldGFjaFJlcXVlc3QoKTsK
KyAgfkRldGFjaFJlcXVlc3QoKSBvdmVycmlkZTsKKyAgRGV0YWNoUmVxdWVzdChEZXRhY2hSZXF1
ZXN0JiYpIG5vZXhjZXB0OworICBEZXRhY2hSZXF1ZXN0JiBvcGVyYXRvcj0oRGV0YWNoUmVxdWVz
dCYmKTsKKyAgRGV0YWNoUmVxdWVzdChjb25zdCBEZXRhY2hSZXF1ZXN0Jik7CisgIERldGFjaFJl
cXVlc3QmIG9wZXJhdG9yPShjb25zdCBEZXRhY2hSZXF1ZXN0Jik7CisgIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBEZXRhY2hSZXF1ZXN0JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBE
ZXRhY2hSZXF1ZXN0JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0K
KworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOwor
ICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6
OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZv
aWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNf
a2V5KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpzdHJp
bmcmIGtleSgpIGNvbnN0IHsgcmV0dXJuIGtleV87IH0KKyAgdm9pZCBzZXRfa2V5KGNvbnN0IHN0
ZDo6c3RyaW5nJiB2YWx1ZSkgeyBrZXlfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQor
CisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcga2V5X3t9OworCisgIC8vIEFsbG93cyB0byBwcmVz
ZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRo
IGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25f
ZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFz
cyBQRVJGRVRUT19FWFBPUlQgRmx1c2hSZXNwb25zZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3Bw
TWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgIH07CisKKyAg
Rmx1c2hSZXNwb25zZSgpOworICB+Rmx1c2hSZXNwb25zZSgpIG92ZXJyaWRlOworICBGbHVzaFJl
c3BvbnNlKEZsdXNoUmVzcG9uc2UmJikgbm9leGNlcHQ7CisgIEZsdXNoUmVzcG9uc2UmIG9wZXJh
dG9yPShGbHVzaFJlc3BvbnNlJiYpOworICBGbHVzaFJlc3BvbnNlKGNvbnN0IEZsdXNoUmVzcG9u
c2UmKTsKKyAgRmx1c2hSZXNwb25zZSYgb3BlcmF0b3I9KGNvbnN0IEZsdXNoUmVzcG9uc2UmKTsK
KyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZsdXNoUmVzcG9uc2UmKSBjb25zdDsKKyAgYm9vbCBv
cGVyYXRvciE9KGNvbnN0IEZsdXNoUmVzcG9uc2UmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNp
emVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qg
b3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25z
dCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25z
dDsKKworIHByaXZhdGU6CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9i
dWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9m
IC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6
Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBG
bHVzaFJlcXVlc3QgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtUaW1lb3V0TXNGaWVsZE51bWJlciA9IDEs
CisgIH07CisKKyAgRmx1c2hSZXF1ZXN0KCk7CisgIH5GbHVzaFJlcXVlc3QoKSBvdmVycmlkZTsK
KyAgRmx1c2hSZXF1ZXN0KEZsdXNoUmVxdWVzdCYmKSBub2V4Y2VwdDsKKyAgRmx1c2hSZXF1ZXN0
JiBvcGVyYXRvcj0oRmx1c2hSZXF1ZXN0JiYpOworICBGbHVzaFJlcXVlc3QoY29uc3QgRmx1c2hS
ZXF1ZXN0Jik7CisgIEZsdXNoUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IEZsdXNoUmVxdWVzdCYp
OworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRmx1c2hSZXF1ZXN0JikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBGbHVzaFJlcXVlc3QmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNp
emVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qg
b3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25z
dCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25z
dDsKKworICBib29sIGhhc190aW1lb3V0X21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9b
MV07IH0KKyAgdWludDMyX3QgdGltZW91dF9tcygpIGNvbnN0IHsgcmV0dXJuIHRpbWVvdXRfbXNf
OyB9CisgIHZvaWQgc2V0X3RpbWVvdXRfbXModWludDMyX3QgdmFsdWUpIHsgdGltZW91dF9tc18g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyBwcml2YXRlOgorICB1aW50MzJfdCB0
aW1lb3V0X21zX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVm
IGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAu
cHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJp
dHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgRnJl
ZUJ1ZmZlcnNSZXNwb25zZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7Cisg
cHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgIH07CisKKyAgRnJlZUJ1ZmZlcnNSZXNw
b25zZSgpOworICB+RnJlZUJ1ZmZlcnNSZXNwb25zZSgpIG92ZXJyaWRlOworICBGcmVlQnVmZmVy
c1Jlc3BvbnNlKEZyZWVCdWZmZXJzUmVzcG9uc2UmJikgbm9leGNlcHQ7CisgIEZyZWVCdWZmZXJz
UmVzcG9uc2UmIG9wZXJhdG9yPShGcmVlQnVmZmVyc1Jlc3BvbnNlJiYpOworICBGcmVlQnVmZmVy
c1Jlc3BvbnNlKGNvbnN0IEZyZWVCdWZmZXJzUmVzcG9uc2UmKTsKKyAgRnJlZUJ1ZmZlcnNSZXNw
b25zZSYgb3BlcmF0b3I9KGNvbnN0IEZyZWVCdWZmZXJzUmVzcG9uc2UmKTsKKyAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IEZyZWVCdWZmZXJzUmVzcG9uc2UmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IEZyZWVCdWZmZXJzUmVzcG9uc2UmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNp
emVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qg
b3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25z
dCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25z
dDsKKworIHByaXZhdGU6CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9i
dWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9m
IC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6
Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBG
cmVlQnVmZmVyc1JlcXVlc3QgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogewor
IHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtCdWZmZXJJZHNGaWVsZE51bWJl
ciA9IDEsCisgIH07CisKKyAgRnJlZUJ1ZmZlcnNSZXF1ZXN0KCk7CisgIH5GcmVlQnVmZmVyc1Jl
cXVlc3QoKSBvdmVycmlkZTsKKyAgRnJlZUJ1ZmZlcnNSZXF1ZXN0KEZyZWVCdWZmZXJzUmVxdWVz
dCYmKSBub2V4Y2VwdDsKKyAgRnJlZUJ1ZmZlcnNSZXF1ZXN0JiBvcGVyYXRvcj0oRnJlZUJ1ZmZl
cnNSZXF1ZXN0JiYpOworICBGcmVlQnVmZmVyc1JlcXVlc3QoY29uc3QgRnJlZUJ1ZmZlcnNSZXF1
ZXN0Jik7CisgIEZyZWVCdWZmZXJzUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IEZyZWVCdWZmZXJz
UmVxdWVzdCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRnJlZUJ1ZmZlcnNSZXF1ZXN0Jikg
Y29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGcmVlQnVmZmVyc1JlcXVlc3QmIG90aGVy
KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlh
bGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNl
cmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90
b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBpbnQgYnVmZmVyX2lkc19zaXplKCkgY29uc3Qg
eyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfaWRzXy5zaXplKCkpOyB9CisgIGNvbnN0
IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyX2lkcygpIGNvbnN0IHsgcmV0dXJuIGJ1ZmZl
cl9pZHNfOyB9CisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiogbXV0YWJsZV9idWZmZXJfaWRzKCkg
eyByZXR1cm4gJmJ1ZmZlcl9pZHNfOyB9CisgIHZvaWQgY2xlYXJfYnVmZmVyX2lkcygpIHsgYnVm
ZmVyX2lkc18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9idWZmZXJfaWRzKHVpbnQzMl90IHZhbHVl
KSB7IGJ1ZmZlcl9pZHNfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAgdWludDMyX3QqIGFkZF9i
dWZmZXJfaWRzKCkgeyBidWZmZXJfaWRzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZidWZmZXJf
aWRzXy5iYWNrKCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBidWZm
ZXJfaWRzXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVs
ZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3Rv
IGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8
Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFJlYWRCdWZm
ZXJzUmVzcG9uc2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgdXNpbmcgU2xpY2UgPSBSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlOworICBlbnVtIEZp
ZWxkTnVtYmVycyB7CisgICAga1NsaWNlc0ZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKworICBSZWFk
QnVmZmVyc1Jlc3BvbnNlKCk7CisgIH5SZWFkQnVmZmVyc1Jlc3BvbnNlKCkgb3ZlcnJpZGU7Cisg
IFJlYWRCdWZmZXJzUmVzcG9uc2UoUmVhZEJ1ZmZlcnNSZXNwb25zZSYmKSBub2V4Y2VwdDsKKyAg
UmVhZEJ1ZmZlcnNSZXNwb25zZSYgb3BlcmF0b3I9KFJlYWRCdWZmZXJzUmVzcG9uc2UmJik7Cisg
IFJlYWRCdWZmZXJzUmVzcG9uc2UoY29uc3QgUmVhZEJ1ZmZlcnNSZXNwb25zZSYpOworICBSZWFk
QnVmZmVyc1Jlc3BvbnNlJiBvcGVyYXRvcj0oY29uc3QgUmVhZEJ1ZmZlcnNSZXNwb25zZSYpOwor
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVhZEJ1ZmZlcnNSZXNwb25zZSYpIGNvbnN0OworICBi
b29sIG9wZXJhdG9yIT0oY29uc3QgUmVhZEJ1ZmZlcnNSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsg
cmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25z
dCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNB
cnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVz
c2FnZSopIGNvbnN0OworCisgIGludCBzbGljZXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRp
Y19jYXN0PGludD4oc2xpY2VzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlYWRC
dWZmZXJzUmVzcG9uc2VfU2xpY2U+JiBzbGljZXMoKSBjb25zdCB7IHJldHVybiBzbGljZXNfOyB9
CisgIHN0ZDo6dmVjdG9yPFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2U+KiBtdXRhYmxlX3NsaWNl
cygpIHsgcmV0dXJuICZzbGljZXNfOyB9CisgIHZvaWQgY2xlYXJfc2xpY2VzKCkgeyBzbGljZXNf
LmNsZWFyKCk7IH0KKyAgUmVhZEJ1ZmZlcnNSZXNwb25zZV9TbGljZSogYWRkX3NsaWNlcygpIHsg
c2xpY2VzXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZzbGljZXNfLmJhY2soKTsgfQorCisgcHJp
dmF0ZToKKyAgc3RkOjp2ZWN0b3I8UmVhZEJ1ZmZlcnNSZXNwb25zZV9TbGljZT4gc2xpY2VzXzsK
KworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNv
bXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgor
ICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mz4gX2hhc19m
aWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFJlYWRCdWZmZXJzUmVzcG9u
c2VfU2xpY2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoK
KyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtEYXRhRmllbGROdW1iZXIgPSAxLAorICAgIGtM
YXN0U2xpY2VGb3JQYWNrZXRGaWVsZE51bWJlciA9IDIsCisgIH07CisKKyAgUmVhZEJ1ZmZlcnNS
ZXNwb25zZV9TbGljZSgpOworICB+UmVhZEJ1ZmZlcnNSZXNwb25zZV9TbGljZSgpIG92ZXJyaWRl
OworICBSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlKFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2Um
Jikgbm9leGNlcHQ7CisgIFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UmIG9wZXJhdG9yPShSZWFk
QnVmZmVyc1Jlc3BvbnNlX1NsaWNlJiYpOworICBSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlKGNv
bnN0IFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UmKTsKKyAgUmVhZEJ1ZmZlcnNSZXNwb25zZV9T
bGljZSYgb3BlcmF0b3I9KGNvbnN0IFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UmKTsKKyAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UmKSBjb25zdDsKKyAg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UmIG90aGVyKSBj
b25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJy
YXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6
ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlh
bGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3pl
cm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19kYXRhKCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEoKSBjb25zdCB7IHJl
dHVybiBkYXRhXzsgfQorICB2b2lkIHNldF9kYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkg
eyBkYXRhXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKyAgdm9pZCBzZXRfZGF0YShj
b25zdCB2b2lkKiBwLCBzaXplX3QgcykgeyBkYXRhXy5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxj
b25zdCBjaGFyKj4ocCksIHMpOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19s
YXN0X3NsaWNlX2Zvcl9wYWNrZXQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQor
ICBib29sIGxhc3Rfc2xpY2VfZm9yX3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIGxhc3Rfc2xpY2Vf
Zm9yX3BhY2tldF87IH0KKyAgdm9pZCBzZXRfbGFzdF9zbGljZV9mb3JfcGFja2V0KGJvb2wgdmFs
dWUpIHsgbGFzdF9zbGljZV9mb3JfcGFja2V0XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7
IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGRhdGFfe307CisgIGJvb2wgbGFzdF9zbGlj
ZV9mb3JfcGFja2V0X3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3Rv
YnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBv
ZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6
OmJpdHNldDwzPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
UmVhZEJ1ZmZlcnNSZXF1ZXN0IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsK
KyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgfTsKKworICBSZWFkQnVmZmVyc1Jl
cXVlc3QoKTsKKyAgflJlYWRCdWZmZXJzUmVxdWVzdCgpIG92ZXJyaWRlOworICBSZWFkQnVmZmVy
c1JlcXVlc3QoUmVhZEJ1ZmZlcnNSZXF1ZXN0JiYpIG5vZXhjZXB0OworICBSZWFkQnVmZmVyc1Jl
cXVlc3QmIG9wZXJhdG9yPShSZWFkQnVmZmVyc1JlcXVlc3QmJik7CisgIFJlYWRCdWZmZXJzUmVx
dWVzdChjb25zdCBSZWFkQnVmZmVyc1JlcXVlc3QmKTsKKyAgUmVhZEJ1ZmZlcnNSZXF1ZXN0JiBv
cGVyYXRvcj0oY29uc3QgUmVhZEJ1ZmZlcnNSZXF1ZXN0Jik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBSZWFkQnVmZmVyc1JlcXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0
IFJlYWRCdWZmZXJzUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVy
cmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsK
KyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRl
OworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgcHJp
dmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMg
Zm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZp
bGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4g
X2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIERpc2FibGVUcmFj
aW5nUmVzcG9uc2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICB9OworCisgIERpc2FibGVUcmFjaW5nUmVzcG9u
c2UoKTsKKyAgfkRpc2FibGVUcmFjaW5nUmVzcG9uc2UoKSBvdmVycmlkZTsKKyAgRGlzYWJsZVRy
YWNpbmdSZXNwb25zZShEaXNhYmxlVHJhY2luZ1Jlc3BvbnNlJiYpIG5vZXhjZXB0OworICBEaXNh
YmxlVHJhY2luZ1Jlc3BvbnNlJiBvcGVyYXRvcj0oRGlzYWJsZVRyYWNpbmdSZXNwb25zZSYmKTsK
KyAgRGlzYWJsZVRyYWNpbmdSZXNwb25zZShjb25zdCBEaXNhYmxlVHJhY2luZ1Jlc3BvbnNlJik7
CisgIERpc2FibGVUcmFjaW5nUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBEaXNhYmxlVHJhY2lu
Z1Jlc3BvbnNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEaXNhYmxlVHJhY2luZ1Jlc3Bv
bnNlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEaXNhYmxlVHJhY2luZ1Jlc3Bv
bnNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29s
IFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0
cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1
aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFs
aXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyBwcml2YXRlOgorCisgIC8vIEFs
bG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0
eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3Ry
aW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9Owor
fTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgRGlzYWJsZVRyYWNpbmdSZXF1ZXN0IDogcHVi
bGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGRO
dW1iZXJzIHsKKyAgfTsKKworICBEaXNhYmxlVHJhY2luZ1JlcXVlc3QoKTsKKyAgfkRpc2FibGVU
cmFjaW5nUmVxdWVzdCgpIG92ZXJyaWRlOworICBEaXNhYmxlVHJhY2luZ1JlcXVlc3QoRGlzYWJs
ZVRyYWNpbmdSZXF1ZXN0JiYpIG5vZXhjZXB0OworICBEaXNhYmxlVHJhY2luZ1JlcXVlc3QmIG9w
ZXJhdG9yPShEaXNhYmxlVHJhY2luZ1JlcXVlc3QmJik7CisgIERpc2FibGVUcmFjaW5nUmVxdWVz
dChjb25zdCBEaXNhYmxlVHJhY2luZ1JlcXVlc3QmKTsKKyAgRGlzYWJsZVRyYWNpbmdSZXF1ZXN0
JiBvcGVyYXRvcj0oY29uc3QgRGlzYWJsZVRyYWNpbmdSZXF1ZXN0Jik7CisgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBEaXNhYmxlVHJhY2luZ1JlcXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IERpc2FibGVUcmFjaW5nUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEo
KnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwg
c2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25z
dCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNv
bnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNv
bnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90
b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMg
b2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3Rk
OjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JU
IENoYW5nZVRyYWNlQ29uZmlnUmVzcG9uc2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3Nh
Z2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICB9OworCisgIENoYW5n
ZVRyYWNlQ29uZmlnUmVzcG9uc2UoKTsKKyAgfkNoYW5nZVRyYWNlQ29uZmlnUmVzcG9uc2UoKSBv
dmVycmlkZTsKKyAgQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZShDaGFuZ2VUcmFjZUNvbmZpZ1Jl
c3BvbnNlJiYpIG5vZXhjZXB0OworICBDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlJiBvcGVyYXRv
cj0oQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSYmKTsKKyAgQ2hhbmdlVHJhY2VDb25maWdSZXNw
b25zZShjb25zdCBDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlJik7CisgIENoYW5nZVRyYWNlQ29u
ZmlnUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlJik7
CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlJikgY29u
c3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlJiBv
dGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90
PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6
cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyBwcml2YXRlOgorCisgIC8vIEFsbG93cyB0
byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAv
LyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVu
a25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKwor
CitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQ2hhbmdlVHJhY2VDb25maWdSZXF1ZXN0IDogcHVibGlj
IDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1i
ZXJzIHsKKyAgICBrVHJhY2VDb25maWdGaWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgQ2hhbmdl
VHJhY2VDb25maWdSZXF1ZXN0KCk7CisgIH5DaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QoKSBvdmVy
cmlkZTsKKyAgQ2hhbmdlVHJhY2VDb25maWdSZXF1ZXN0KENoYW5nZVRyYWNlQ29uZmlnUmVxdWVz
dCYmKSBub2V4Y2VwdDsKKyAgQ2hhbmdlVHJhY2VDb25maWdSZXF1ZXN0JiBvcGVyYXRvcj0oQ2hh
bmdlVHJhY2VDb25maWdSZXF1ZXN0JiYpOworICBDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QoY29u
c3QgQ2hhbmdlVHJhY2VDb25maWdSZXF1ZXN0Jik7CisgIENoYW5nZVRyYWNlQ29uZmlnUmVxdWVz
dCYgb3BlcmF0b3I9KGNvbnN0IENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdCYpOworICBib29sIG9w
ZXJhdG9yPT0oY29uc3QgQ2hhbmdlVHJhY2VDb25maWdSZXF1ZXN0JikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QmIG90aGVyKSBjb25zdCB7
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3Ry
aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1l
c3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc190cmFjZV9jb25maWcoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBUcmFjZUNvbmZpZyYgdHJhY2VfY29uZmlnKCkg
Y29uc3QgeyByZXR1cm4gKnRyYWNlX2NvbmZpZ187IH0KKyAgVHJhY2VDb25maWcqIG11dGFibGVf
dHJhY2VfY29uZmlnKCkgeyBfaGFzX2ZpZWxkXy5zZXQoMSk7IHJldHVybiB0cmFjZV9jb25maWdf
LmdldCgpOyB9CisKKyBwcml2YXRlOgorICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8VHJhY2VD
b25maWc+IHRyYWNlX2NvbmZpZ187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24g
cHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNp
b25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisg
IHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VY
UE9SVCBTdGFydFRyYWNpbmdSZXNwb25zZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2Fn
ZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgIH07CisKKyAgU3RhcnRU
cmFjaW5nUmVzcG9uc2UoKTsKKyAgflN0YXJ0VHJhY2luZ1Jlc3BvbnNlKCkgb3ZlcnJpZGU7Cisg
IFN0YXJ0VHJhY2luZ1Jlc3BvbnNlKFN0YXJ0VHJhY2luZ1Jlc3BvbnNlJiYpIG5vZXhjZXB0Owor
ICBTdGFydFRyYWNpbmdSZXNwb25zZSYgb3BlcmF0b3I9KFN0YXJ0VHJhY2luZ1Jlc3BvbnNlJiYp
OworICBTdGFydFRyYWNpbmdSZXNwb25zZShjb25zdCBTdGFydFRyYWNpbmdSZXNwb25zZSYpOwor
ICBTdGFydFRyYWNpbmdSZXNwb25zZSYgb3BlcmF0b3I9KGNvbnN0IFN0YXJ0VHJhY2luZ1Jlc3Bv
bnNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdGFydFRyYWNpbmdSZXNwb25zZSYpIGNv
bnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RhcnRUcmFjaW5nUmVzcG9uc2UmIG90aGVy
KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlh
bGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNl
cmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90
b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworIHByaXZhdGU6CisKKyAgLy8gQWxsb3dzIHRvIHBy
ZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdp
dGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93
bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2Ns
YXNzIFBFUkZFVFRPX0VYUE9SVCBTdGFydFRyYWNpbmdSZXF1ZXN0IDogcHVibGljIDo6cHJvdG96
ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAg
fTsKKworICBTdGFydFRyYWNpbmdSZXF1ZXN0KCk7CisgIH5TdGFydFRyYWNpbmdSZXF1ZXN0KCkg
b3ZlcnJpZGU7CisgIFN0YXJ0VHJhY2luZ1JlcXVlc3QoU3RhcnRUcmFjaW5nUmVxdWVzdCYmKSBu
b2V4Y2VwdDsKKyAgU3RhcnRUcmFjaW5nUmVxdWVzdCYgb3BlcmF0b3I9KFN0YXJ0VHJhY2luZ1Jl
cXVlc3QmJik7CisgIFN0YXJ0VHJhY2luZ1JlcXVlc3QoY29uc3QgU3RhcnRUcmFjaW5nUmVxdWVz
dCYpOworICBTdGFydFRyYWNpbmdSZXF1ZXN0JiBvcGVyYXRvcj0oY29uc3QgU3RhcnRUcmFjaW5n
UmVxdWVzdCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RhcnRUcmFjaW5nUmVxdWVzdCYp
IGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU3RhcnRUcmFjaW5nUmVxdWVzdCYgb3Ro
ZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZy
b21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4g
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8g
cHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8g
d2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtu
b3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKwor
Y2xhc3MgUEVSRkVUVE9fRVhQT1JUIEVuYWJsZVRyYWNpbmdSZXNwb25zZSA6IHB1YmxpYyA6OnBy
b3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7
CisgICAga0Rpc2FibGVkRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIEVuYWJsZVRyYWNpbmdS
ZXNwb25zZSgpOworICB+RW5hYmxlVHJhY2luZ1Jlc3BvbnNlKCkgb3ZlcnJpZGU7CisgIEVuYWJs
ZVRyYWNpbmdSZXNwb25zZShFbmFibGVUcmFjaW5nUmVzcG9uc2UmJikgbm9leGNlcHQ7CisgIEVu
YWJsZVRyYWNpbmdSZXNwb25zZSYgb3BlcmF0b3I9KEVuYWJsZVRyYWNpbmdSZXNwb25zZSYmKTsK
KyAgRW5hYmxlVHJhY2luZ1Jlc3BvbnNlKGNvbnN0IEVuYWJsZVRyYWNpbmdSZXNwb25zZSYpOwor
ICBFbmFibGVUcmFjaW5nUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBFbmFibGVUcmFjaW5nUmVz
cG9uc2UmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVuYWJsZVRyYWNpbmdSZXNwb25zZSYp
IGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRW5hYmxlVHJhY2luZ1Jlc3BvbnNlJiBv
dGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNl
RnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90
PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6
cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfZGlzYWJsZWQoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBib29sIGRpc2FibGVkKCkgY29uc3QgeyBy
ZXR1cm4gZGlzYWJsZWRfOyB9CisgIHZvaWQgc2V0X2Rpc2FibGVkKGJvb2wgdmFsdWUpIHsgZGlz
YWJsZWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgcHJpdmF0ZToKKyAgYm9v
bCBkaXNhYmxlZF97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1
ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2Yg
LnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpi
aXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEVu
YWJsZVRyYWNpbmdSZXF1ZXN0IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsK
KyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrVHJhY2VDb25maWdGaWVsZE51
bWJlciA9IDEsCisgICAga0F0dGFjaE5vdGlmaWNhdGlvbk9ubHlGaWVsZE51bWJlciA9IDIsCisg
IH07CisKKyAgRW5hYmxlVHJhY2luZ1JlcXVlc3QoKTsKKyAgfkVuYWJsZVRyYWNpbmdSZXF1ZXN0
KCkgb3ZlcnJpZGU7CisgIEVuYWJsZVRyYWNpbmdSZXF1ZXN0KEVuYWJsZVRyYWNpbmdSZXF1ZXN0
JiYpIG5vZXhjZXB0OworICBFbmFibGVUcmFjaW5nUmVxdWVzdCYgb3BlcmF0b3I9KEVuYWJsZVRy
YWNpbmdSZXF1ZXN0JiYpOworICBFbmFibGVUcmFjaW5nUmVxdWVzdChjb25zdCBFbmFibGVUcmFj
aW5nUmVxdWVzdCYpOworICBFbmFibGVUcmFjaW5nUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IEVu
YWJsZVRyYWNpbmdSZXF1ZXN0Jik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFbmFibGVUcmFj
aW5nUmVxdWVzdCYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRW5hYmxlVHJhY2lu
Z1JlcXVlc3QmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisg
IGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0
ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVj
dG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc190cmFj
ZV9jb25maWcoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBUcmFj
ZUNvbmZpZyYgdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gKnRyYWNlX2NvbmZpZ187IH0K
KyAgVHJhY2VDb25maWcqIG11dGFibGVfdHJhY2VfY29uZmlnKCkgeyBfaGFzX2ZpZWxkXy5zZXQo
MSk7IHJldHVybiB0cmFjZV9jb25maWdfLmdldCgpOyB9CisKKyAgYm9vbCBoYXNfYXR0YWNoX25v
dGlmaWNhdGlvbl9vbmx5KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgYm9v
bCBhdHRhY2hfbm90aWZpY2F0aW9uX29ubHkoKSBjb25zdCB7IHJldHVybiBhdHRhY2hfbm90aWZp
Y2F0aW9uX29ubHlfOyB9CisgIHZvaWQgc2V0X2F0dGFjaF9ub3RpZmljYXRpb25fb25seShib29s
IHZhbHVlKSB7IGF0dGFjaF9ub3RpZmljYXRpb25fb25seV8gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDIpOyB9CisKKyBwcml2YXRlOgorICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8VHJhY2VD
b25maWc+IHRyYWNlX2NvbmZpZ187CisgIGJvb2wgYXR0YWNoX25vdGlmaWNhdGlvbl9vbmx5X3t9
OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3Ig
Y29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMu
CisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwzPiBfaGFz
X2ZpZWxkX3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19JUENfQ09OU1VNRVJfUE9SVF9QUk9UT19DUFBfSF8KKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNz
YWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9z
Y2F0dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5
IFBlcmZldHRvIGNwcGdlbl9wbHVnaW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3By
YWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zsb2F0LWVxdWFsIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2lwYy9jb25zdW1lcl9w
b3J0Lmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9z
L3BlcmZldHRvL2NvbmZpZy90cmFjZV9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2J1aWx0aW5fY2xvY2su
Z2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVy
ZmV0dG8vY29uZmlnL2RhdGFfc291cmNlX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvdHJhY2tfZXZlbnQv
dHJhY2tfZXZlbnRfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy90ZXN0X2NvbmZpZy5nZW4uaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcv
c3lzX3N0YXRzL3N5c19zdGF0c19jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL3N5c19zdGF0c19jb3VudGVy
cy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9w
ZXJmZXR0by9jb25maWcvcHJvZmlsaW5nL3BlcmZfZXZlbnRfY29uZmlnLmdlbi5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9w
cm9maWxpbmcvamF2YV9ocHJvZl9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL3Byb2ZpbGluZy9oZWFwcHJv
ZmRfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cHJvdG9zL3BlcmZldHRvL2NvbmZpZy9wcm9jZXNzX3N0YXRzL3Byb2Nlc3Nfc3RhdHNfY29uZmln
Lmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3Bl
cmZldHRvL2NvbmZpZy9wb3dlci9hbmRyb2lkX3Bvd2VyX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvaW5v
ZGVfZmlsZS9pbm9kZV9maWxlX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvZ3B1L3Z1bGthbl9tZW1vcnlf
Y29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJv
dG9zL3BlcmZldHRvL2NvbmZpZy9ncHUvZ3B1X2NvdW50ZXJfY29uZmlnLmdlbi5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9m
dHJhY2UvZnRyYWNlX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvY2hyb21lL2Nocm9tZV9jb25maWcuZ2Vu
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0
dG8vY29uZmlnL2FuZHJvaWQvcGFja2FnZXNfbGlzdF9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2FuZHJv
aWQvYW5kcm9pZF9wb2xsZWRfc3RhdGVfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9hbmRyb2lkL2FuZHJv
aWRfbG9nX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24vYW5kcm9pZF9sb2dfY29uc3RhbnRzLmdlbi5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2Nv
bW1vbi90cmFjZV9zdGF0cy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24vdHJhY2luZ19zZXJ2aWNlX2NhcGFiaWxpdGll
cy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9w
ZXJmZXR0by9jb21tb24vb2JzZXJ2YWJsZV9ldmVudHMuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNpbmdfc2Vy
dmljZV9zdGF0ZS5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InByb3Rvcy9wZXJmZXR0by9jb21tb24vZGF0YV9zb3VyY2VfZGVzY3JpcHRvci5nZW4uaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21t
b24vdHJhY2tfZXZlbnRfZGVzY3JpcHRvci5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24vZ3B1X2NvdW50ZXJfZGVzY3Jp
cHRvci5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rv
cy9wZXJmZXR0by9jb21tb24vb2JzZXJ2YWJsZV9ldmVudHMuZ2VuLmgiCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworCitRdWVyeUNh
cGFiaWxpdGllc1Jlc3BvbnNlOjpRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlKCkgPSBkZWZhdWx0
OworUXVlcnlDYXBhYmlsaXRpZXNSZXNwb25zZTo6flF1ZXJ5Q2FwYWJpbGl0aWVzUmVzcG9uc2Uo
KSA9IGRlZmF1bHQ7CitRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlOjpRdWVyeUNhcGFiaWxpdGll
c1Jlc3BvbnNlKGNvbnN0IFF1ZXJ5Q2FwYWJpbGl0aWVzUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitR
dWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlJiBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlOjpvcGVy
YXRvcj0oY29uc3QgUXVlcnlDYXBhYmlsaXRpZXNSZXNwb25zZSYpID0gZGVmYXVsdDsKK1F1ZXJ5
Q2FwYWJpbGl0aWVzUmVzcG9uc2U6OlF1ZXJ5Q2FwYWJpbGl0aWVzUmVzcG9uc2UoUXVlcnlDYXBh
YmlsaXRpZXNSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitRdWVyeUNhcGFiaWxpdGll
c1Jlc3BvbnNlJiBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlOjpvcGVyYXRvcj0oUXVlcnlDYXBh
YmlsaXRpZXNSZXNwb25zZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgUXVlcnlDYXBhYmlsaXRpZXNS
ZXNwb25zZTo6b3BlcmF0b3I9PShjb25zdCBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlJiBvdGhl
cikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmll
bGRzXworICAgJiYgY2FwYWJpbGl0aWVzXyA9PSBvdGhlci5jYXBhYmlsaXRpZXNfOworfQorCiti
b29sIFF1ZXJ5Q2FwYWJpbGl0aWVzUmVzcG9uc2U6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
IHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wg
cGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMo
cmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52
YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwg
X2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7
CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGNhcGFi
aWxpdGllcyAqLzoKKyAgICAgICAgKCpjYXBhYmlsaXRpZXNfKS5QYXJzZUZyb21TdHJpbmcoZmll
bGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAg
ICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0
ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlOjpT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBR
dWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6
OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNl
cmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30K
Kwordm9pZCBRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86
Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBjYXBhYmlsaXRpZXMKKyAgaWYg
KF9oYXNfZmllbGRfWzFdKSB7CisgICAgKCpjYXBhYmlsaXRpZXNfKS5TZXJpYWxpemUobXNnLT5C
ZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDEpKTsKKyAgfQorCisgIG1z
Zy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2Zp
ZWxkc18uc2l6ZSgpKTsKK30KKworCitRdWVyeUNhcGFiaWxpdGllc1JlcXVlc3Q6OlF1ZXJ5Q2Fw
YWJpbGl0aWVzUmVxdWVzdCgpID0gZGVmYXVsdDsKK1F1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdDo6
flF1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdCgpID0gZGVmYXVsdDsKK1F1ZXJ5Q2FwYWJpbGl0aWVz
UmVxdWVzdDo6UXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0KGNvbnN0IFF1ZXJ5Q2FwYWJpbGl0aWVz
UmVxdWVzdCYpID0gZGVmYXVsdDsKK1F1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdCYgUXVlcnlDYXBh
YmlsaXRpZXNSZXF1ZXN0OjpvcGVyYXRvcj0oY29uc3QgUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0
JikgPSBkZWZhdWx0OworUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0OjpRdWVyeUNhcGFiaWxpdGll
c1JlcXVlc3QoUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsK
K1F1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdCYgUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0OjpvcGVy
YXRvcj0oUXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0JiYpID0gZGVmYXVsdDsKKworYm9vbCBRdWVy
eUNhcGFiaWxpdGllc1JlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgUXVlcnlDYXBhYmlsaXRpZXNS
ZXF1ZXN0JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVy
LnVua25vd25fZmllbGRzXzsKK30KKworYm9vbCBRdWVyeUNhcGFiaWxpdGllc1JlcXVlc3Q6OlBh
cnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9m
aWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90
b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0g
ZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkg
eworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFz
X2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkg
eworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVu
a25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBh
Y2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgUXVlcnlD
YXBhYmlsaXRpZXNSZXF1ZXN0OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitz
dGQ6OnZlY3Rvcjx1aW50OF90PiBRdWVyeUNhcGFiaWxpdGllc1JlcXVlc3Q6OlNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86
Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2Vy
aWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFF1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdDo6U2Vy
aWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgbXNnLT5BcHBlbmRS
YXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXpl
KCkpOworfQorCisKK1F1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2U6OlF1ZXJ5U2VydmljZVN0YXRl
UmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlOjp+UXVlcnlT
ZXJ2aWNlU3RhdGVSZXNwb25zZSgpID0gZGVmYXVsdDsKK1F1ZXJ5U2VydmljZVN0YXRlUmVzcG9u
c2U6OlF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UoY29uc3QgUXVlcnlTZXJ2aWNlU3RhdGVSZXNw
b25zZSYpID0gZGVmYXVsdDsKK1F1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UmIFF1ZXJ5U2Vydmlj
ZVN0YXRlUmVzcG9uc2U6Om9wZXJhdG9yPShjb25zdCBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNl
JikgPSBkZWZhdWx0OworUXVlcnlTZXJ2aWNlU3RhdGVSZXNwb25zZTo6UXVlcnlTZXJ2aWNlU3Rh
dGVSZXNwb25zZShRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlJiYpIG5vZXhjZXB0ID0gZGVmYXVs
dDsKK1F1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UmIFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2U6
Om9wZXJhdG9yPShRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlJiYpID0gZGVmYXVsdDsKKworYm9v
bCBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlOjpvcGVyYXRvcj09KGNvbnN0IFF1ZXJ5U2Vydmlj
ZVN0YXRlUmVzcG9uc2UmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18g
PT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBzZXJ2aWNlX3N0YXRlXyA9PSBvdGhlci5z
ZXJ2aWNlX3N0YXRlXzsKK30KKworYm9vbCBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlOjpQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmll
bGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96
ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRl
Yy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsK
KyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19m
aWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsK
KyAgICAgIGNhc2UgMSAvKiBzZXJ2aWNlX3N0YXRlICovOgorICAgICAgICAoKnNlcnZpY2Vfc3Rh
dGVfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygm
dW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAh
cGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBRdWVy
eVNlcnZpY2VTdGF0ZVJlc3BvbnNlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQor
CitzdGQ6OnZlY3Rvcjx1aW50OF90PiBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlOjpTZXJpYWxp
emVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96
ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNn
LlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNl
OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVs
ZCAxOiBzZXJ2aWNlX3N0YXRlCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgICgqc2Vydmlj
ZV9zdGF0ZV8pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6
TWVzc2FnZT4oMSkpOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25f
ZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK1F1ZXJ5U2Vy
dmljZVN0YXRlUmVxdWVzdDo6UXVlcnlTZXJ2aWNlU3RhdGVSZXF1ZXN0KCkgPSBkZWZhdWx0Owor
UXVlcnlTZXJ2aWNlU3RhdGVSZXF1ZXN0Ojp+UXVlcnlTZXJ2aWNlU3RhdGVSZXF1ZXN0KCkgPSBk
ZWZhdWx0OworUXVlcnlTZXJ2aWNlU3RhdGVSZXF1ZXN0OjpRdWVyeVNlcnZpY2VTdGF0ZVJlcXVl
c3QoY29uc3QgUXVlcnlTZXJ2aWNlU3RhdGVSZXF1ZXN0JikgPSBkZWZhdWx0OworUXVlcnlTZXJ2
aWNlU3RhdGVSZXF1ZXN0JiBRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3Q6Om9wZXJhdG9yPShjb25z
dCBRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3QmKSA9IGRlZmF1bHQ7CitRdWVyeVNlcnZpY2VTdGF0
ZVJlcXVlc3Q6OlF1ZXJ5U2VydmljZVN0YXRlUmVxdWVzdChRdWVyeVNlcnZpY2VTdGF0ZVJlcXVl
c3QmJikgbm9leGNlcHQgPSBkZWZhdWx0OworUXVlcnlTZXJ2aWNlU3RhdGVSZXF1ZXN0JiBRdWVy
eVNlcnZpY2VTdGF0ZVJlcXVlc3Q6Om9wZXJhdG9yPShRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3Qm
JikgPSBkZWZhdWx0OworCitib29sIFF1ZXJ5U2VydmljZVN0YXRlUmVxdWVzdDo6b3BlcmF0b3I9
PShjb25zdCBRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3QmIG90aGVyKSBjb25zdCB7CisgIHJldHVy
biB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfOworfQorCitib29sIFF1
ZXJ5U2VydmljZVN0YXRlUmVxdWVzdDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBz
aXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVs
ZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgp
OworfQorCitzdGQ6OnN0cmluZyBRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3Q6OlNlcmlhbGl6ZUFz
U3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNl
cmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFF1ZXJ5U2Vydmlj
ZVN0YXRlUmVxdWVzdDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86
OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNn
LmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgUXVl
cnlTZXJ2aWNlU3RhdGVSZXF1ZXN0OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRh
dGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworT2JzZXJ2ZUV2ZW50c1Jlc3Bv
bnNlOjpPYnNlcnZlRXZlbnRzUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitPYnNlcnZlRXZlbnRzUmVz
cG9uc2U6On5PYnNlcnZlRXZlbnRzUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitPYnNlcnZlRXZlbnRz
UmVzcG9uc2U6Ok9ic2VydmVFdmVudHNSZXNwb25zZShjb25zdCBPYnNlcnZlRXZlbnRzUmVzcG9u
c2UmKSA9IGRlZmF1bHQ7CitPYnNlcnZlRXZlbnRzUmVzcG9uc2UmIE9ic2VydmVFdmVudHNSZXNw
b25zZTo6b3BlcmF0b3I9KGNvbnN0IE9ic2VydmVFdmVudHNSZXNwb25zZSYpID0gZGVmYXVsdDsK
K09ic2VydmVFdmVudHNSZXNwb25zZTo6T2JzZXJ2ZUV2ZW50c1Jlc3BvbnNlKE9ic2VydmVFdmVu
dHNSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitPYnNlcnZlRXZlbnRzUmVzcG9uc2Um
IE9ic2VydmVFdmVudHNSZXNwb25zZTo6b3BlcmF0b3I9KE9ic2VydmVFdmVudHNSZXNwb25zZSYm
KSA9IGRlZmF1bHQ7CisKK2Jvb2wgT2JzZXJ2ZUV2ZW50c1Jlc3BvbnNlOjpvcGVyYXRvcj09KGNv
bnN0IE9ic2VydmVFdmVudHNSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25v
d25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGV2ZW50c18gPT0gb3Ro
ZXIuZXZlbnRzXzsKK30KKworYm9vbCBPYnNlcnZlRXZlbnRzUmVzcG9uc2U6OlBhcnNlRnJvbUFy
cmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNs
ZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlBy
b3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRG
aWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlm
IChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5z
ZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAg
Y2FzZSAxIC8qIGV2ZW50cyAqLzoKKyAgICAgICAgKCpldmVudHNfKS5QYXJzZUZyb21TdHJpbmco
ZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0Ogor
ICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMu
Ynl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBPYnNlcnZlRXZlbnRzUmVzcG9uc2U6OlNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6
cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1
cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IE9i
c2VydmVFdmVudHNSZXNwb25zZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3Zv
aWQgT2JzZXJ2ZUV2ZW50c1Jlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2Uq
IG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBldmVudHMKKyAgaWYgKF9oYXNfZmllbGRfWzFd
KSB7CisgICAgKCpldmVudHNfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+KDEpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRl
cyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKwor
CitPYnNlcnZlRXZlbnRzUmVxdWVzdDo6T2JzZXJ2ZUV2ZW50c1JlcXVlc3QoKSA9IGRlZmF1bHQ7
CitPYnNlcnZlRXZlbnRzUmVxdWVzdDo6fk9ic2VydmVFdmVudHNSZXF1ZXN0KCkgPSBkZWZhdWx0
OworT2JzZXJ2ZUV2ZW50c1JlcXVlc3Q6Ok9ic2VydmVFdmVudHNSZXF1ZXN0KGNvbnN0IE9ic2Vy
dmVFdmVudHNSZXF1ZXN0JikgPSBkZWZhdWx0OworT2JzZXJ2ZUV2ZW50c1JlcXVlc3QmIE9ic2Vy
dmVFdmVudHNSZXF1ZXN0OjpvcGVyYXRvcj0oY29uc3QgT2JzZXJ2ZUV2ZW50c1JlcXVlc3QmKSA9
IGRlZmF1bHQ7CitPYnNlcnZlRXZlbnRzUmVxdWVzdDo6T2JzZXJ2ZUV2ZW50c1JlcXVlc3QoT2Jz
ZXJ2ZUV2ZW50c1JlcXVlc3QmJikgbm9leGNlcHQgPSBkZWZhdWx0OworT2JzZXJ2ZUV2ZW50c1Jl
cXVlc3QmIE9ic2VydmVFdmVudHNSZXF1ZXN0OjpvcGVyYXRvcj0oT2JzZXJ2ZUV2ZW50c1JlcXVl
c3QmJikgPSBkZWZhdWx0OworCitib29sIE9ic2VydmVFdmVudHNSZXF1ZXN0OjpvcGVyYXRvcj09
KGNvbnN0IE9ic2VydmVFdmVudHNSZXF1ZXN0JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5r
bm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgZXZlbnRzX3RvX29i
c2VydmVfID09IG90aGVyLmV2ZW50c190b19vYnNlcnZlXzsKK30KKworYm9vbCBPYnNlcnZlRXZl
bnRzUmVxdWVzdDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkg
eworICBldmVudHNfdG9fb2JzZXJ2ZV8uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFy
KCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3Rv
RGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChm
aWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQo
ZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2Fz
ZSAxIC8qIGV2ZW50c190b19vYnNlcnZlICovOgorICAgICAgICBldmVudHNfdG9fb2JzZXJ2ZV8u
ZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgmZXZlbnRzX3RvX29ic2VydmVfLmJh
Y2soKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2Vy
aWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAg
IH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30K
Kworc3RkOjpzdHJpbmcgT2JzZXJ2ZUV2ZW50c1JlcXVlc3Q6OlNlcmlhbGl6ZUFzU3RyaW5nKCkg
Y29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdl
PiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFz
U3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IE9ic2VydmVFdmVudHNSZXF1ZXN0
OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVk
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICBy
ZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBPYnNlcnZlRXZlbnRzUmVx
dWVzdDo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8g
RmllbGQgMTogZXZlbnRzX3RvX29ic2VydmUKKyAgZm9yIChhdXRvJiBpdCA6IGV2ZW50c190b19v
YnNlcnZlXykgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGl0KTsKKyAgfQorCisgIG1zZy0+
QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxk
c18uc2l6ZSgpKTsKK30KKworCitHZXRUcmFjZVN0YXRzUmVzcG9uc2U6OkdldFRyYWNlU3RhdHNS
ZXNwb25zZSgpID0gZGVmYXVsdDsKK0dldFRyYWNlU3RhdHNSZXNwb25zZTo6fkdldFRyYWNlU3Rh
dHNSZXNwb25zZSgpID0gZGVmYXVsdDsKK0dldFRyYWNlU3RhdHNSZXNwb25zZTo6R2V0VHJhY2VT
dGF0c1Jlc3BvbnNlKGNvbnN0IEdldFRyYWNlU3RhdHNSZXNwb25zZSYpID0gZGVmYXVsdDsKK0dl
dFRyYWNlU3RhdHNSZXNwb25zZSYgR2V0VHJhY2VTdGF0c1Jlc3BvbnNlOjpvcGVyYXRvcj0oY29u
c3QgR2V0VHJhY2VTdGF0c1Jlc3BvbnNlJikgPSBkZWZhdWx0OworR2V0VHJhY2VTdGF0c1Jlc3Bv
bnNlOjpHZXRUcmFjZVN0YXRzUmVzcG9uc2UoR2V0VHJhY2VTdGF0c1Jlc3BvbnNlJiYpIG5vZXhj
ZXB0ID0gZGVmYXVsdDsKK0dldFRyYWNlU3RhdHNSZXNwb25zZSYgR2V0VHJhY2VTdGF0c1Jlc3Bv
bnNlOjpvcGVyYXRvcj0oR2V0VHJhY2VTdGF0c1Jlc3BvbnNlJiYpID0gZGVmYXVsdDsKKworYm9v
bCBHZXRUcmFjZVN0YXRzUmVzcG9uc2U6Om9wZXJhdG9yPT0oY29uc3QgR2V0VHJhY2VTdGF0c1Jl
c3BvbnNlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVy
LnVua25vd25fZmllbGRzXworICAgJiYgdHJhY2Vfc3RhdHNfID09IG90aGVyLnRyYWNlX3N0YXRz
XzsKK30KKworYm9vbCBHZXRUcmFjZVN0YXRzUmVzcG9uc2U6OlBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7Cisg
IGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2Rl
ciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBm
aWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5p
ZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQu
aWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8q
IHRyYWNlX3N0YXRzICovOgorICAgICAgICAoKnRyYWNlX3N0YXRzXykuUGFyc2VGcm9tU3RyaW5n
KGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoK
KyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVj
LmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgR2V0VHJhY2VTdGF0c1Jlc3BvbnNlOjpT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBH
ZXRUcmFjZVN0YXRzUmVzcG9uc2U6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2
b2lkIEdldFRyYWNlU3RhdHNSZXNwb25zZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdl
KiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogdHJhY2Vfc3RhdHMKKyAgaWYgKF9oYXNfZmll
bGRfWzFdKSB7CisgICAgKCp0cmFjZV9zdGF0c18pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVk
TWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMSkpOworICB9CisKKyAgbXNnLT5BcHBlbmRS
YXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXpl
KCkpOworfQorCisKK0dldFRyYWNlU3RhdHNSZXF1ZXN0OjpHZXRUcmFjZVN0YXRzUmVxdWVzdCgp
ID0gZGVmYXVsdDsKK0dldFRyYWNlU3RhdHNSZXF1ZXN0Ojp+R2V0VHJhY2VTdGF0c1JlcXVlc3Qo
KSA9IGRlZmF1bHQ7CitHZXRUcmFjZVN0YXRzUmVxdWVzdDo6R2V0VHJhY2VTdGF0c1JlcXVlc3Qo
Y29uc3QgR2V0VHJhY2VTdGF0c1JlcXVlc3QmKSA9IGRlZmF1bHQ7CitHZXRUcmFjZVN0YXRzUmVx
dWVzdCYgR2V0VHJhY2VTdGF0c1JlcXVlc3Q6Om9wZXJhdG9yPShjb25zdCBHZXRUcmFjZVN0YXRz
UmVxdWVzdCYpID0gZGVmYXVsdDsKK0dldFRyYWNlU3RhdHNSZXF1ZXN0OjpHZXRUcmFjZVN0YXRz
UmVxdWVzdChHZXRUcmFjZVN0YXRzUmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitHZXRU
cmFjZVN0YXRzUmVxdWVzdCYgR2V0VHJhY2VTdGF0c1JlcXVlc3Q6Om9wZXJhdG9yPShHZXRUcmFj
ZVN0YXRzUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgR2V0VHJhY2VTdGF0c1JlcXVlc3Q6
Om9wZXJhdG9yPT0oY29uc3QgR2V0VHJhY2VTdGF0c1JlcXVlc3QmIG90aGVyKSBjb25zdCB7Cisg
IHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfOworfQorCiti
b29sIEdldFRyYWNlU3RhdHNSZXF1ZXN0OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcs
IHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tl
ZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywg
c2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQo
KTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNf
ZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAg
IH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZp
ZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVh
azsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0
KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdldFRyYWNlU3RhdHNSZXF1ZXN0OjpTZXJpYWxpemVBc1N0
cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6
TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJp
YWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZXRUcmFjZVN0YXRz
UmVxdWVzdDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBC
dWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgp
KTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgR2V0VHJhY2VT
dGF0c1JlcXVlc3Q6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7
CisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtu
b3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitBdHRhY2hSZXNwb25zZTo6QXR0YWNoUmVzcG9u
c2UoKSA9IGRlZmF1bHQ7CitBdHRhY2hSZXNwb25zZTo6fkF0dGFjaFJlc3BvbnNlKCkgPSBkZWZh
dWx0OworQXR0YWNoUmVzcG9uc2U6OkF0dGFjaFJlc3BvbnNlKGNvbnN0IEF0dGFjaFJlc3BvbnNl
JikgPSBkZWZhdWx0OworQXR0YWNoUmVzcG9uc2UmIEF0dGFjaFJlc3BvbnNlOjpvcGVyYXRvcj0o
Y29uc3QgQXR0YWNoUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitBdHRhY2hSZXNwb25zZTo6QXR0YWNo
UmVzcG9uc2UoQXR0YWNoUmVzcG9uc2UmJikgbm9leGNlcHQgPSBkZWZhdWx0OworQXR0YWNoUmVz
cG9uc2UmIEF0dGFjaFJlc3BvbnNlOjpvcGVyYXRvcj0oQXR0YWNoUmVzcG9uc2UmJikgPSBkZWZh
dWx0OworCitib29sIEF0dGFjaFJlc3BvbnNlOjpvcGVyYXRvcj09KGNvbnN0IEF0dGFjaFJlc3Bv
bnNlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVu
a25vd25fZmllbGRzXworICAgJiYgdHJhY2VfY29uZmlnXyA9PSBvdGhlci50cmFjZV9jb25maWdf
OworfQorCitib29sIEF0dGFjaFJlc3BvbnNlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBy
YXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBh
Y2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJh
dywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFs
aWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9o
YXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOwor
ICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiB0cmFjZV9j
b25maWcgKi86CisgICAgICAgICgqdHJhY2VfY29uZmlnXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxk
LmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVz
X2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgQXR0YWNoUmVzcG9uc2U6OlNlcmlhbGl6ZUFzU3Ry
aW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEF0dGFjaFJlc3BvbnNl
OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVk
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICBy
ZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBBdHRhY2hSZXNwb25zZTo6
U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQg
MTogdHJhY2VfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgICgqdHJhY2VfY29u
ZmlnXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPigxKSk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVs
ZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworQXR0YWNoUmVxdWVz
dDo6QXR0YWNoUmVxdWVzdCgpID0gZGVmYXVsdDsKK0F0dGFjaFJlcXVlc3Q6On5BdHRhY2hSZXF1
ZXN0KCkgPSBkZWZhdWx0OworQXR0YWNoUmVxdWVzdDo6QXR0YWNoUmVxdWVzdChjb25zdCBBdHRh
Y2hSZXF1ZXN0JikgPSBkZWZhdWx0OworQXR0YWNoUmVxdWVzdCYgQXR0YWNoUmVxdWVzdDo6b3Bl
cmF0b3I9KGNvbnN0IEF0dGFjaFJlcXVlc3QmKSA9IGRlZmF1bHQ7CitBdHRhY2hSZXF1ZXN0OjpB
dHRhY2hSZXF1ZXN0KEF0dGFjaFJlcXVlc3QmJikgbm9leGNlcHQgPSBkZWZhdWx0OworQXR0YWNo
UmVxdWVzdCYgQXR0YWNoUmVxdWVzdDo6b3BlcmF0b3I9KEF0dGFjaFJlcXVlc3QmJikgPSBkZWZh
dWx0OworCitib29sIEF0dGFjaFJlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgQXR0YWNoUmVxdWVz
dCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtu
b3duX2ZpZWxkc18KKyAgICYmIGtleV8gPT0gb3RoZXIua2V5XzsKK30KKworYm9vbCBBdHRhY2hS
ZXF1ZXN0OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7Cisg
IHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOwor
CisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0
byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgewor
ICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZp
ZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBrZXkgKi86CisgICAgICAgIGZpZWxkLmdldCgm
a2V5Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2Vy
aWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAg
IH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30K
Kworc3RkOjpzdHJpbmcgQXR0YWNoUmVxdWVzdDo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7
CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsK
KyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmco
KTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQXR0YWNoUmVxdWVzdDo6U2VyaWFsaXplQXNB
cnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6
TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJp
YWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQXR0YWNoUmVxdWVzdDo6U2VyaWFsaXplKDo6cHJv
dG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMToga2V5CisgIGlmIChf
aGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDEsIGtleV8pOworICB9CisK
KyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25v
d25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0RldGFjaFJlc3BvbnNlOjpEZXRhY2hSZXNwb25z
ZSgpID0gZGVmYXVsdDsKK0RldGFjaFJlc3BvbnNlOjp+RGV0YWNoUmVzcG9uc2UoKSA9IGRlZmF1
bHQ7CitEZXRhY2hSZXNwb25zZTo6RGV0YWNoUmVzcG9uc2UoY29uc3QgRGV0YWNoUmVzcG9uc2Um
KSA9IGRlZmF1bHQ7CitEZXRhY2hSZXNwb25zZSYgRGV0YWNoUmVzcG9uc2U6Om9wZXJhdG9yPShj
b25zdCBEZXRhY2hSZXNwb25zZSYpID0gZGVmYXVsdDsKK0RldGFjaFJlc3BvbnNlOjpEZXRhY2hS
ZXNwb25zZShEZXRhY2hSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitEZXRhY2hSZXNw
b25zZSYgRGV0YWNoUmVzcG9uc2U6Om9wZXJhdG9yPShEZXRhY2hSZXNwb25zZSYmKSA9IGRlZmF1
bHQ7CisKK2Jvb2wgRGV0YWNoUmVzcG9uc2U6Om9wZXJhdG9yPT0oY29uc3QgRGV0YWNoUmVzcG9u
c2UmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5r
bm93bl9maWVsZHNfOworfQorCitib29sIERldGFjaFJlc3BvbnNlOjpQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigp
OworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0Rl
Y29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQo
KTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmll
bGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZp
ZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGRlZmF1
bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18p
OworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYg
IWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIERldGFjaFJlc3BvbnNlOjpTZXJp
YWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBEZXRh
Y2hSZXNwb25zZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgRGV0YWNo
UmVzcG9uc2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7Cisg
IG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3du
X2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitEZXRhY2hSZXF1ZXN0OjpEZXRhY2hSZXF1ZXN0KCkg
PSBkZWZhdWx0OworRGV0YWNoUmVxdWVzdDo6fkRldGFjaFJlcXVlc3QoKSA9IGRlZmF1bHQ7CitE
ZXRhY2hSZXF1ZXN0OjpEZXRhY2hSZXF1ZXN0KGNvbnN0IERldGFjaFJlcXVlc3QmKSA9IGRlZmF1
bHQ7CitEZXRhY2hSZXF1ZXN0JiBEZXRhY2hSZXF1ZXN0OjpvcGVyYXRvcj0oY29uc3QgRGV0YWNo
UmVxdWVzdCYpID0gZGVmYXVsdDsKK0RldGFjaFJlcXVlc3Q6OkRldGFjaFJlcXVlc3QoRGV0YWNo
UmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitEZXRhY2hSZXF1ZXN0JiBEZXRhY2hSZXF1
ZXN0OjpvcGVyYXRvcj0oRGV0YWNoUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRGV0YWNo
UmVxdWVzdDo6b3BlcmF0b3I9PShjb25zdCBEZXRhY2hSZXF1ZXN0JiBvdGhlcikgY29uc3Qgewor
ICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYg
a2V5XyA9PSBvdGhlci5rZXlfOworfQorCitib29sIERldGFjaFJlcXVlc3Q6OlBhcnNlRnJvbUFy
cmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNs
ZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlBy
b3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRG
aWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlm
IChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5z
ZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAg
Y2FzZSAxIC8qIGtleSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZrZXlfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygm
dW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAh
cGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBEZXRh
Y2hSZXF1ZXN0OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rv
cjx1aW50OF90PiBEZXRhY2hSZXF1ZXN0OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6
OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNl
cmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30K
Kwordm9pZCBEZXRhY2hSZXF1ZXN0OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBrZXkKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7Cisg
ICAgbXNnLT5BcHBlbmRTdHJpbmcoMSwga2V5Xyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKKworRmx1c2hSZXNwb25zZTo6Rmx1c2hSZXNwb25zZSgpID0gZGVmYXVsdDsKK0ZsdXNo
UmVzcG9uc2U6On5GbHVzaFJlc3BvbnNlKCkgPSBkZWZhdWx0OworRmx1c2hSZXNwb25zZTo6Rmx1
c2hSZXNwb25zZShjb25zdCBGbHVzaFJlc3BvbnNlJikgPSBkZWZhdWx0OworRmx1c2hSZXNwb25z
ZSYgRmx1c2hSZXNwb25zZTo6b3BlcmF0b3I9KGNvbnN0IEZsdXNoUmVzcG9uc2UmKSA9IGRlZmF1
bHQ7CitGbHVzaFJlc3BvbnNlOjpGbHVzaFJlc3BvbnNlKEZsdXNoUmVzcG9uc2UmJikgbm9leGNl
cHQgPSBkZWZhdWx0OworRmx1c2hSZXNwb25zZSYgRmx1c2hSZXNwb25zZTo6b3BlcmF0b3I9KEZs
dXNoUmVzcG9uc2UmJikgPSBkZWZhdWx0OworCitib29sIEZsdXNoUmVzcG9uc2U6Om9wZXJhdG9y
PT0oY29uc3QgRmx1c2hSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25f
ZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc187Cit9CisKK2Jvb2wgRmx1c2hSZXNwb25z
ZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtu
b3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6
OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmll
bGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAg
IF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5p
ZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRU
bygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVy
biAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBG
bHVzaFJlc3BvbnNlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86
OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNn
LmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZl
Y3Rvcjx1aW50OF90PiBGbHVzaFJlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsK
K30KKwordm9pZCBGbHVzaFJlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2Uq
IG1zZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNf
LmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworRmx1c2hSZXF1ZXN0OjpG
bHVzaFJlcXVlc3QoKSA9IGRlZmF1bHQ7CitGbHVzaFJlcXVlc3Q6On5GbHVzaFJlcXVlc3QoKSA9
IGRlZmF1bHQ7CitGbHVzaFJlcXVlc3Q6OkZsdXNoUmVxdWVzdChjb25zdCBGbHVzaFJlcXVlc3Qm
KSA9IGRlZmF1bHQ7CitGbHVzaFJlcXVlc3QmIEZsdXNoUmVxdWVzdDo6b3BlcmF0b3I9KGNvbnN0
IEZsdXNoUmVxdWVzdCYpID0gZGVmYXVsdDsKK0ZsdXNoUmVxdWVzdDo6Rmx1c2hSZXF1ZXN0KEZs
dXNoUmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitGbHVzaFJlcXVlc3QmIEZsdXNoUmVx
dWVzdDo6b3BlcmF0b3I9KEZsdXNoUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRmx1c2hS
ZXF1ZXN0OjpvcGVyYXRvcj09KGNvbnN0IEZsdXNoUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAg
cmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHRp
bWVvdXRfbXNfID09IG90aGVyLnRpbWVvdXRfbXNfOworfQorCitib29sIEZsdXNoUmVxdWVzdDo6
UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3du
X2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnBy
b3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQg
PSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgp
KSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9o
YXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgp
KSB7CisgICAgICBjYXNlIDEgLyogdGltZW91dF9tcyAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0
aW1lb3V0X21zXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmll
bGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQo
KTsKK30KKworc3RkOjpzdHJpbmcgRmx1c2hSZXF1ZXN0OjpTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4g
bXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0
cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBGbHVzaFJlcXVlc3Q6OlNlcmlhbGl6
ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cu
U2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEZsdXNoUmVxdWVzdDo6U2VyaWFsaXplKDo6
cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogdGltZW91dF9t
cworICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCB0aW1l
b3V0X21zXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVs
ZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworRnJlZUJ1ZmZlcnNS
ZXNwb25zZTo6RnJlZUJ1ZmZlcnNSZXNwb25zZSgpID0gZGVmYXVsdDsKK0ZyZWVCdWZmZXJzUmVz
cG9uc2U6On5GcmVlQnVmZmVyc1Jlc3BvbnNlKCkgPSBkZWZhdWx0OworRnJlZUJ1ZmZlcnNSZXNw
b25zZTo6RnJlZUJ1ZmZlcnNSZXNwb25zZShjb25zdCBGcmVlQnVmZmVyc1Jlc3BvbnNlJikgPSBk
ZWZhdWx0OworRnJlZUJ1ZmZlcnNSZXNwb25zZSYgRnJlZUJ1ZmZlcnNSZXNwb25zZTo6b3BlcmF0
b3I9KGNvbnN0IEZyZWVCdWZmZXJzUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitGcmVlQnVmZmVyc1Jl
c3BvbnNlOjpGcmVlQnVmZmVyc1Jlc3BvbnNlKEZyZWVCdWZmZXJzUmVzcG9uc2UmJikgbm9leGNl
cHQgPSBkZWZhdWx0OworRnJlZUJ1ZmZlcnNSZXNwb25zZSYgRnJlZUJ1ZmZlcnNSZXNwb25zZTo6
b3BlcmF0b3I9KEZyZWVCdWZmZXJzUmVzcG9uc2UmJikgPSBkZWZhdWx0OworCitib29sIEZyZWVC
dWZmZXJzUmVzcG9uc2U6Om9wZXJhdG9yPT0oY29uc3QgRnJlZUJ1ZmZlcnNSZXNwb25zZSYgb3Ro
ZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2Zp
ZWxkc187Cit9CisKK2Jvb2wgRnJlZUJ1ZmZlcnNSZXNwb25zZTo6UGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsK
KyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNv
ZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7
IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxk
LmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVs
ZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBkZWZhdWx0
OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFk
ZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBGcmVlQnVmZmVyc1Jlc3BvbnNlOjpT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBG
cmVlQnVmZmVyc1Jlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9p
ZCBGcmVlQnVmZmVyc1Jlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRh
dGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworRnJlZUJ1ZmZlcnNSZXF1ZXN0
OjpGcmVlQnVmZmVyc1JlcXVlc3QoKSA9IGRlZmF1bHQ7CitGcmVlQnVmZmVyc1JlcXVlc3Q6On5G
cmVlQnVmZmVyc1JlcXVlc3QoKSA9IGRlZmF1bHQ7CitGcmVlQnVmZmVyc1JlcXVlc3Q6OkZyZWVC
dWZmZXJzUmVxdWVzdChjb25zdCBGcmVlQnVmZmVyc1JlcXVlc3QmKSA9IGRlZmF1bHQ7CitGcmVl
QnVmZmVyc1JlcXVlc3QmIEZyZWVCdWZmZXJzUmVxdWVzdDo6b3BlcmF0b3I9KGNvbnN0IEZyZWVC
dWZmZXJzUmVxdWVzdCYpID0gZGVmYXVsdDsKK0ZyZWVCdWZmZXJzUmVxdWVzdDo6RnJlZUJ1ZmZl
cnNSZXF1ZXN0KEZyZWVCdWZmZXJzUmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitGcmVl
QnVmZmVyc1JlcXVlc3QmIEZyZWVCdWZmZXJzUmVxdWVzdDo6b3BlcmF0b3I9KEZyZWVCdWZmZXJz
UmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRnJlZUJ1ZmZlcnNSZXF1ZXN0OjpvcGVyYXRv
cj09KGNvbnN0IEZyZWVCdWZmZXJzUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVu
a25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGJ1ZmZlcl9pZHNf
ID09IG90aGVyLmJ1ZmZlcl9pZHNfOworfQorCitib29sIEZyZWVCdWZmZXJzUmVxdWVzdDo6UGFy
c2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICBidWZmZXJfaWRz
Xy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJy
b3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUp
OworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZp
ZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxk
Xy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9Cisg
ICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogYnVmZmVyX2lkcyAqLzoK
KyAgICAgICAgYnVmZmVyX2lkc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGZpZWxkLmdldCgm
YnVmZmVyX2lkc18uYmFjaygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAg
ICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0
ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBGcmVlQnVmZmVyc1JlcXVlc3Q6OlNlcmlhbGl6
ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96
ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNn
LlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEZyZWVCdWZm
ZXJzUmVxdWVzdDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86Okhl
YXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdl
dCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgRnJlZUJ1
ZmZlcnNSZXF1ZXN0OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qg
eworICAvLyBGaWVsZCAxOiBidWZmZXJfaWRzCisgIGZvciAoYXV0byYgaXQgOiBidWZmZXJfaWRz
XykgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGl0KTsKKyAgfQorCisgIG1zZy0+QXBwZW5k
UmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6
ZSgpKTsKK30KKworCitSZWFkQnVmZmVyc1Jlc3BvbnNlOjpSZWFkQnVmZmVyc1Jlc3BvbnNlKCkg
PSBkZWZhdWx0OworUmVhZEJ1ZmZlcnNSZXNwb25zZTo6flJlYWRCdWZmZXJzUmVzcG9uc2UoKSA9
IGRlZmF1bHQ7CitSZWFkQnVmZmVyc1Jlc3BvbnNlOjpSZWFkQnVmZmVyc1Jlc3BvbnNlKGNvbnN0
IFJlYWRCdWZmZXJzUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitSZWFkQnVmZmVyc1Jlc3BvbnNlJiBS
ZWFkQnVmZmVyc1Jlc3BvbnNlOjpvcGVyYXRvcj0oY29uc3QgUmVhZEJ1ZmZlcnNSZXNwb25zZSYp
ID0gZGVmYXVsdDsKK1JlYWRCdWZmZXJzUmVzcG9uc2U6OlJlYWRCdWZmZXJzUmVzcG9uc2UoUmVh
ZEJ1ZmZlcnNSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitSZWFkQnVmZmVyc1Jlc3Bv
bnNlJiBSZWFkQnVmZmVyc1Jlc3BvbnNlOjpvcGVyYXRvcj0oUmVhZEJ1ZmZlcnNSZXNwb25zZSYm
KSA9IGRlZmF1bHQ7CisKK2Jvb2wgUmVhZEJ1ZmZlcnNSZXNwb25zZTo6b3BlcmF0b3I9PShjb25z
dCBSZWFkQnVmZmVyc1Jlc3BvbnNlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9m
aWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgc2xpY2VzXyA9PSBvdGhlci5z
bGljZXNfOworfQorCitib29sIFJlYWRCdWZmZXJzUmVzcG9uc2U6OlBhcnNlRnJvbUFycmF5KGNv
bnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgc2xpY2VzXy5jbGVhcigpOworICB1bmtu
b3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6
OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmll
bGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAg
IF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5p
ZCgpKSB7CisgICAgICBjYXNlIDIgLyogc2xpY2VzICovOgorICAgICAgICBzbGljZXNfLmVtcGxh
Y2VfYmFjaygpOworICAgICAgICBzbGljZXNfLmJhY2soKS5QYXJzZUZyb21TdHJpbmcoZmllbGQu
YXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAg
ICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNf
bGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBSZWFkQnVmZmVyc1Jlc3BvbnNlOjpTZXJpYWxpemVB
c1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVy
bzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5T
ZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBSZWFkQnVmZmVy
c1Jlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVh
cEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0
KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBSZWFkQnVm
ZmVyc1Jlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qg
eworICAvLyBGaWVsZCAyOiBzbGljZXMKKyAgZm9yIChhdXRvJiBpdCA6IHNsaWNlc18pIHsKKyAg
ICBpdC5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3Nh
Z2U+KDIpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxk
c18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitSZWFkQnVmZmVyc1Jl
c3BvbnNlX1NsaWNlOjpSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlKCkgPSBkZWZhdWx0OworUmVh
ZEJ1ZmZlcnNSZXNwb25zZV9TbGljZTo6flJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UoKSA9IGRl
ZmF1bHQ7CitSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlOjpSZWFkQnVmZmVyc1Jlc3BvbnNlX1Ns
aWNlKGNvbnN0IFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UmKSA9IGRlZmF1bHQ7CitSZWFkQnVm
ZmVyc1Jlc3BvbnNlX1NsaWNlJiBSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlOjpvcGVyYXRvcj0o
Y29uc3QgUmVhZEJ1ZmZlcnNSZXNwb25zZV9TbGljZSYpID0gZGVmYXVsdDsKK1JlYWRCdWZmZXJz
UmVzcG9uc2VfU2xpY2U6OlJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2UoUmVhZEJ1ZmZlcnNSZXNw
b25zZV9TbGljZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitSZWFkQnVmZmVyc1Jlc3BvbnNlX1Ns
aWNlJiBSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlOjpvcGVyYXRvcj0oUmVhZEJ1ZmZlcnNSZXNw
b25zZV9TbGljZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgUmVhZEJ1ZmZlcnNSZXNwb25zZV9TbGlj
ZTo6b3BlcmF0b3I9PShjb25zdCBSZWFkQnVmZmVyc1Jlc3BvbnNlX1NsaWNlJiBvdGhlcikgY29u
c3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXwor
ICAgJiYgZGF0YV8gPT0gb3RoZXIuZGF0YV8KKyAgICYmIGxhc3Rfc2xpY2VfZm9yX3BhY2tldF8g
PT0gb3RoZXIubGFzdF9zbGljZV9mb3JfcGFja2V0XzsKK30KKworYm9vbCBSZWFkQnVmZmVyc1Jl
c3BvbnNlX1NsaWNlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXpl
KSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZh
bHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZv
ciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUo
KSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0
Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBkYXRhICovOgorICAgICAgICBmaWVs
ZC5nZXQoJmRhdGFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogbGFzdF9zbGlj
ZV9mb3JfcGFja2V0ICovOgorICAgICAgICBmaWVsZC5nZXQoJmxhc3Rfc2xpY2VfZm9yX3BhY2tl
dF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlh
bGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9
CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisK
K3N0ZDo6c3RyaW5nIFJlYWRCdWZmZXJzUmVzcG9uc2VfU2xpY2U6OlNlcmlhbGl6ZUFzU3RyaW5n
KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6
ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFJlYWRCdWZmZXJzUmVzcG9u
c2VfU2xpY2U6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFw
QnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQo
KSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFJlYWRCdWZm
ZXJzUmVzcG9uc2VfU2xpY2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBj
b25zdCB7CisgIC8vIEZpZWxkIDE6IGRhdGEKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAg
bXNnLT5BcHBlbmRTdHJpbmcoMSwgZGF0YV8pOworICB9CisKKyAgLy8gRmllbGQgMjogbGFzdF9z
bGljZV9mb3JfcGFja2V0CisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBwZW5k
VGlueVZhckludCgyLCBsYXN0X3NsaWNlX2Zvcl9wYWNrZXRfKTsKKyAgfQorCisgIG1zZy0+QXBw
ZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18u
c2l6ZSgpKTsKK30KKworCitSZWFkQnVmZmVyc1JlcXVlc3Q6OlJlYWRCdWZmZXJzUmVxdWVzdCgp
ID0gZGVmYXVsdDsKK1JlYWRCdWZmZXJzUmVxdWVzdDo6flJlYWRCdWZmZXJzUmVxdWVzdCgpID0g
ZGVmYXVsdDsKK1JlYWRCdWZmZXJzUmVxdWVzdDo6UmVhZEJ1ZmZlcnNSZXF1ZXN0KGNvbnN0IFJl
YWRCdWZmZXJzUmVxdWVzdCYpID0gZGVmYXVsdDsKK1JlYWRCdWZmZXJzUmVxdWVzdCYgUmVhZEJ1
ZmZlcnNSZXF1ZXN0OjpvcGVyYXRvcj0oY29uc3QgUmVhZEJ1ZmZlcnNSZXF1ZXN0JikgPSBkZWZh
dWx0OworUmVhZEJ1ZmZlcnNSZXF1ZXN0OjpSZWFkQnVmZmVyc1JlcXVlc3QoUmVhZEJ1ZmZlcnNS
ZXF1ZXN0JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1JlYWRCdWZmZXJzUmVxdWVzdCYgUmVhZEJ1
ZmZlcnNSZXF1ZXN0OjpvcGVyYXRvcj0oUmVhZEJ1ZmZlcnNSZXF1ZXN0JiYpID0gZGVmYXVsdDsK
KworYm9vbCBSZWFkQnVmZmVyc1JlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgUmVhZEJ1ZmZlcnNS
ZXF1ZXN0JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVy
LnVua25vd25fZmllbGRzXzsKK30KKworYm9vbCBSZWFkQnVmZmVyc1JlcXVlc3Q6OlBhcnNlRnJv
bUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNf
LmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86
OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJl
YWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAg
IGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxk
Xy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25f
ZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9l
cnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgUmVhZEJ1ZmZlcnNS
ZXF1ZXN0OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBC
dWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgp
KTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1
aW50OF90PiBSZWFkQnVmZmVyc1JlcXVlc3Q6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7Cisg
IDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAg
U2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOwor
fQorCit2b2lkIFJlYWRCdWZmZXJzUmVxdWVzdDo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNz
YWdlKiBtc2cpIGNvbnN0IHsKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmll
bGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0Rpc2FibGVUcmFj
aW5nUmVzcG9uc2U6OkRpc2FibGVUcmFjaW5nUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitEaXNhYmxl
VHJhY2luZ1Jlc3BvbnNlOjp+RGlzYWJsZVRyYWNpbmdSZXNwb25zZSgpID0gZGVmYXVsdDsKK0Rp
c2FibGVUcmFjaW5nUmVzcG9uc2U6OkRpc2FibGVUcmFjaW5nUmVzcG9uc2UoY29uc3QgRGlzYWJs
ZVRyYWNpbmdSZXNwb25zZSYpID0gZGVmYXVsdDsKK0Rpc2FibGVUcmFjaW5nUmVzcG9uc2UmIERp
c2FibGVUcmFjaW5nUmVzcG9uc2U6Om9wZXJhdG9yPShjb25zdCBEaXNhYmxlVHJhY2luZ1Jlc3Bv
bnNlJikgPSBkZWZhdWx0OworRGlzYWJsZVRyYWNpbmdSZXNwb25zZTo6RGlzYWJsZVRyYWNpbmdS
ZXNwb25zZShEaXNhYmxlVHJhY2luZ1Jlc3BvbnNlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0Rp
c2FibGVUcmFjaW5nUmVzcG9uc2UmIERpc2FibGVUcmFjaW5nUmVzcG9uc2U6Om9wZXJhdG9yPShE
aXNhYmxlVHJhY2luZ1Jlc3BvbnNlJiYpID0gZGVmYXVsdDsKKworYm9vbCBEaXNhYmxlVHJhY2lu
Z1Jlc3BvbnNlOjpvcGVyYXRvcj09KGNvbnN0IERpc2FibGVUcmFjaW5nUmVzcG9uc2UmIG90aGVy
KSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVs
ZHNfOworfQorCitib29sIERpc2FibGVUcmFjaW5nUmVzcG9uc2U6OlBhcnNlRnJvbUFycmF5KGNv
bnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7
CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVj
b2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgp
OyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVs
ZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmll
bGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgZGVmYXVs
dDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7
CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAh
ZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgRGlzYWJsZVRyYWNpbmdSZXNwb25z
ZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVy
ZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7Cisg
IHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhf
dD4gRGlzYWJsZVRyYWNpbmdSZXNwb25zZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAg
Ojpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBT
ZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9
CisKK3ZvaWQgRGlzYWJsZVRyYWNpbmdSZXNwb25zZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpN
ZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25f
ZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0Rpc2FibGVU
cmFjaW5nUmVxdWVzdDo6RGlzYWJsZVRyYWNpbmdSZXF1ZXN0KCkgPSBkZWZhdWx0OworRGlzYWJs
ZVRyYWNpbmdSZXF1ZXN0Ojp+RGlzYWJsZVRyYWNpbmdSZXF1ZXN0KCkgPSBkZWZhdWx0OworRGlz
YWJsZVRyYWNpbmdSZXF1ZXN0OjpEaXNhYmxlVHJhY2luZ1JlcXVlc3QoY29uc3QgRGlzYWJsZVRy
YWNpbmdSZXF1ZXN0JikgPSBkZWZhdWx0OworRGlzYWJsZVRyYWNpbmdSZXF1ZXN0JiBEaXNhYmxl
VHJhY2luZ1JlcXVlc3Q6Om9wZXJhdG9yPShjb25zdCBEaXNhYmxlVHJhY2luZ1JlcXVlc3QmKSA9
IGRlZmF1bHQ7CitEaXNhYmxlVHJhY2luZ1JlcXVlc3Q6OkRpc2FibGVUcmFjaW5nUmVxdWVzdChE
aXNhYmxlVHJhY2luZ1JlcXVlc3QmJikgbm9leGNlcHQgPSBkZWZhdWx0OworRGlzYWJsZVRyYWNp
bmdSZXF1ZXN0JiBEaXNhYmxlVHJhY2luZ1JlcXVlc3Q6Om9wZXJhdG9yPShEaXNhYmxlVHJhY2lu
Z1JlcXVlc3QmJikgPSBkZWZhdWx0OworCitib29sIERpc2FibGVUcmFjaW5nUmVxdWVzdDo6b3Bl
cmF0b3I9PShjb25zdCBEaXNhYmxlVHJhY2luZ1JlcXVlc3QmIG90aGVyKSBjb25zdCB7CisgIHJl
dHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfOworfQorCitib29s
IERpc2FibGVUcmFjaW5nUmVxdWVzdDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBz
aXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVs
ZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgp
OworfQorCitzdGQ6OnN0cmluZyBEaXNhYmxlVHJhY2luZ1JlcXVlc3Q6OlNlcmlhbGl6ZUFzU3Ry
aW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IERpc2FibGVUcmFjaW5n
UmVxdWVzdDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBC
dWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgp
KTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgRGlzYWJsZVRy
YWNpbmdSZXF1ZXN0OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qg
eworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5r
bm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZTo6
Q2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSgpID0gZGVmYXVsdDsKK0NoYW5nZVRyYWNlQ29uZmln
UmVzcG9uc2U6On5DaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlKCkgPSBkZWZhdWx0OworQ2hhbmdl
VHJhY2VDb25maWdSZXNwb25zZTo6Q2hhbmdlVHJhY2VDb25maWdSZXNwb25zZShjb25zdCBDaGFu
Z2VUcmFjZUNvbmZpZ1Jlc3BvbnNlJikgPSBkZWZhdWx0OworQ2hhbmdlVHJhY2VDb25maWdSZXNw
b25zZSYgQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZTo6b3BlcmF0b3I9KGNvbnN0IENoYW5nZVRy
YWNlQ29uZmlnUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNl
OjpDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlKENoYW5nZVRyYWNlQ29uZmlnUmVzcG9uc2UmJikg
bm9leGNlcHQgPSBkZWZhdWx0OworQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSYgQ2hhbmdlVHJh
Y2VDb25maWdSZXNwb25zZTo6b3BlcmF0b3I9KENoYW5nZVRyYWNlQ29uZmlnUmVzcG9uc2UmJikg
PSBkZWZhdWx0OworCitib29sIENoYW5nZVRyYWNlQ29uZmlnUmVzcG9uc2U6Om9wZXJhdG9yPT0o
Y29uc3QgQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJu
IHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc187Cit9CisKK2Jvb2wgQ2hh
bmdlVHJhY2VDb25maWdSZXNwb25zZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBz
aXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRf
ZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNp
emUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7
IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2Zp
ZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9
CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVs
ZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7
CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgp
OworfQorCitzdGQ6OnN0cmluZyBDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlOjpTZXJpYWxpemVB
c1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVy
bzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5T
ZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBDaGFuZ2VUcmFj
ZUNvbmZpZ1Jlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVy
bzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZSht
c2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBD
aGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2Uq
IG1zZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNf
LmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworQ2hhbmdlVHJhY2VDb25m
aWdSZXF1ZXN0OjpDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QoKSA9IGRlZmF1bHQ7CitDaGFuZ2VU
cmFjZUNvbmZpZ1JlcXVlc3Q6On5DaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QoKSA9IGRlZmF1bHQ7
CitDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3Q6OkNoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdChjb25z
dCBDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QmKSA9IGRlZmF1bHQ7CitDaGFuZ2VUcmFjZUNvbmZp
Z1JlcXVlc3QmIENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdDo6b3BlcmF0b3I9KGNvbnN0IENoYW5n
ZVRyYWNlQ29uZmlnUmVxdWVzdCYpID0gZGVmYXVsdDsKK0NoYW5nZVRyYWNlQ29uZmlnUmVxdWVz
dDo6Q2hhbmdlVHJhY2VDb25maWdSZXF1ZXN0KENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdCYmKSBu
b2V4Y2VwdCA9IGRlZmF1bHQ7CitDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QmIENoYW5nZVRyYWNl
Q29uZmlnUmVxdWVzdDo6b3BlcmF0b3I9KENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdCYmKSA9IGRl
ZmF1bHQ7CisKK2Jvb2wgQ2hhbmdlVHJhY2VDb25maWdSZXF1ZXN0OjpvcGVyYXRvcj09KGNvbnN0
IENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25v
d25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHRyYWNlX2NvbmZpZ18g
PT0gb3RoZXIudHJhY2VfY29uZmlnXzsKK30KKworYm9vbCBDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVl
c3Q6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5r
bm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAg
Ojpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZp
ZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAg
ICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQu
aWQoKSkgeworICAgICAgY2FzZSAxIC8qIHRyYWNlX2NvbmZpZyAqLzoKKyAgICAgICAgKCp0cmFj
ZV9jb25maWdfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBl
bmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJl
dHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmlu
ZyBDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3Q6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7
Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdDo6U2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgQ2hhbmdlVHJhY2VDb25maWdSZXF1
ZXN0OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBG
aWVsZCAxOiB0cmFjZV9jb25maWcKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgKCp0cmFj
ZV9jb25maWdfKS5TZXJpYWxpemUobXNnLT5CZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86
Ok1lc3NhZ2U+KDEpKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3du
X2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitTdGFydFRy
YWNpbmdSZXNwb25zZTo6U3RhcnRUcmFjaW5nUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitTdGFydFRy
YWNpbmdSZXNwb25zZTo6flN0YXJ0VHJhY2luZ1Jlc3BvbnNlKCkgPSBkZWZhdWx0OworU3RhcnRU
cmFjaW5nUmVzcG9uc2U6OlN0YXJ0VHJhY2luZ1Jlc3BvbnNlKGNvbnN0IFN0YXJ0VHJhY2luZ1Jl
c3BvbnNlJikgPSBkZWZhdWx0OworU3RhcnRUcmFjaW5nUmVzcG9uc2UmIFN0YXJ0VHJhY2luZ1Jl
c3BvbnNlOjpvcGVyYXRvcj0oY29uc3QgU3RhcnRUcmFjaW5nUmVzcG9uc2UmKSA9IGRlZmF1bHQ7
CitTdGFydFRyYWNpbmdSZXNwb25zZTo6U3RhcnRUcmFjaW5nUmVzcG9uc2UoU3RhcnRUcmFjaW5n
UmVzcG9uc2UmJikgbm9leGNlcHQgPSBkZWZhdWx0OworU3RhcnRUcmFjaW5nUmVzcG9uc2UmIFN0
YXJ0VHJhY2luZ1Jlc3BvbnNlOjpvcGVyYXRvcj0oU3RhcnRUcmFjaW5nUmVzcG9uc2UmJikgPSBk
ZWZhdWx0OworCitib29sIFN0YXJ0VHJhY2luZ1Jlc3BvbnNlOjpvcGVyYXRvcj09KGNvbnN0IFN0
YXJ0VHJhY2luZ1Jlc3BvbnNlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVs
ZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXzsKK30KKworYm9vbCBTdGFydFRyYWNpbmdSZXNw
b25zZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1
bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKwor
ICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8g
ZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRG
aWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAg
ICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVs
ZC5pZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBl
bmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJl
dHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmlu
ZyBTdGFydFRyYWNpbmdSZXNwb25zZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6
cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2Vy
aWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30K
Kworc3RkOjp2ZWN0b3I8dWludDhfdD4gU3RhcnRUcmFjaW5nUmVzcG9uc2U6OlNlcmlhbGl6ZUFz
QXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86
Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2Vy
aWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFN0YXJ0VHJhY2luZ1Jlc3BvbnNlOjpTZXJpYWxp
emUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKKworU3RhcnRUcmFjaW5nUmVxdWVzdDo6U3RhcnRUcmFjaW5nUmVxdWVzdCgpID0gZGVm
YXVsdDsKK1N0YXJ0VHJhY2luZ1JlcXVlc3Q6On5TdGFydFRyYWNpbmdSZXF1ZXN0KCkgPSBkZWZh
dWx0OworU3RhcnRUcmFjaW5nUmVxdWVzdDo6U3RhcnRUcmFjaW5nUmVxdWVzdChjb25zdCBTdGFy
dFRyYWNpbmdSZXF1ZXN0JikgPSBkZWZhdWx0OworU3RhcnRUcmFjaW5nUmVxdWVzdCYgU3RhcnRU
cmFjaW5nUmVxdWVzdDo6b3BlcmF0b3I9KGNvbnN0IFN0YXJ0VHJhY2luZ1JlcXVlc3QmKSA9IGRl
ZmF1bHQ7CitTdGFydFRyYWNpbmdSZXF1ZXN0OjpTdGFydFRyYWNpbmdSZXF1ZXN0KFN0YXJ0VHJh
Y2luZ1JlcXVlc3QmJikgbm9leGNlcHQgPSBkZWZhdWx0OworU3RhcnRUcmFjaW5nUmVxdWVzdCYg
U3RhcnRUcmFjaW5nUmVxdWVzdDo6b3BlcmF0b3I9KFN0YXJ0VHJhY2luZ1JlcXVlc3QmJikgPSBk
ZWZhdWx0OworCitib29sIFN0YXJ0VHJhY2luZ1JlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgU3Rh
cnRUcmFjaW5nUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRz
XyA9PSBvdGhlci51bmtub3duX2ZpZWxkc187Cit9CisKK2Jvb2wgU3RhcnRUcmFjaW5nUmVxdWVz
dDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtu
b3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6
OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmll
bGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVs
ZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAg
IF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5p
ZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRU
bygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVy
biAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBT
dGFydFRyYWNpbmdSZXF1ZXN0OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitz
dGQ6OnZlY3Rvcjx1aW50OF90PiBTdGFydFRyYWNpbmdSZXF1ZXN0OjpTZXJpYWxpemVBc0FycmF5
KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6
ZUFzQXJyYXkoKTsKK30KKwordm9pZCBTdGFydFRyYWNpbmdSZXF1ZXN0OjpTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0
ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisK
KworRW5hYmxlVHJhY2luZ1Jlc3BvbnNlOjpFbmFibGVUcmFjaW5nUmVzcG9uc2UoKSA9IGRlZmF1
bHQ7CitFbmFibGVUcmFjaW5nUmVzcG9uc2U6On5FbmFibGVUcmFjaW5nUmVzcG9uc2UoKSA9IGRl
ZmF1bHQ7CitFbmFibGVUcmFjaW5nUmVzcG9uc2U6OkVuYWJsZVRyYWNpbmdSZXNwb25zZShjb25z
dCBFbmFibGVUcmFjaW5nUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitFbmFibGVUcmFjaW5nUmVzcG9u
c2UmIEVuYWJsZVRyYWNpbmdSZXNwb25zZTo6b3BlcmF0b3I9KGNvbnN0IEVuYWJsZVRyYWNpbmdS
ZXNwb25zZSYpID0gZGVmYXVsdDsKK0VuYWJsZVRyYWNpbmdSZXNwb25zZTo6RW5hYmxlVHJhY2lu
Z1Jlc3BvbnNlKEVuYWJsZVRyYWNpbmdSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitF
bmFibGVUcmFjaW5nUmVzcG9uc2UmIEVuYWJsZVRyYWNpbmdSZXNwb25zZTo6b3BlcmF0b3I9KEVu
YWJsZVRyYWNpbmdSZXNwb25zZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRW5hYmxlVHJhY2luZ1Jl
c3BvbnNlOjpvcGVyYXRvcj09KGNvbnN0IEVuYWJsZVRyYWNpbmdSZXNwb25zZSYgb3RoZXIpIGNv
bnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18K
KyAgICYmIGRpc2FibGVkXyA9PSBvdGhlci5kaXNhYmxlZF87Cit9CisKK2Jvb2wgRW5hYmxlVHJh
Y2luZ1Jlc3BvbnNlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXpl
KSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZh
bHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZv
ciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUo
KSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0
Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBkaXNhYmxlZCAqLzoKKyAgICAgICAg
ZmllbGQuZ2V0KCZkaXNhYmxlZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAg
ICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5i
eXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEVuYWJsZVRyYWNpbmdSZXNwb25zZTo6U2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gRW5h
YmxlVHJhY2luZ1Jlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9p
ZCBFbmFibGVUcmFjaW5nUmVzcG9uc2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSog
bXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGRpc2FibGVkCisgIGlmIChfaGFzX2ZpZWxkX1sx
XSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgxLCBkaXNhYmxlZF8pOworICB9CisKKyAg
bXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25f
ZmllbGRzXy5zaXplKCkpOworfQorCisKK0VuYWJsZVRyYWNpbmdSZXF1ZXN0OjpFbmFibGVUcmFj
aW5nUmVxdWVzdCgpID0gZGVmYXVsdDsKK0VuYWJsZVRyYWNpbmdSZXF1ZXN0Ojp+RW5hYmxlVHJh
Y2luZ1JlcXVlc3QoKSA9IGRlZmF1bHQ7CitFbmFibGVUcmFjaW5nUmVxdWVzdDo6RW5hYmxlVHJh
Y2luZ1JlcXVlc3QoY29uc3QgRW5hYmxlVHJhY2luZ1JlcXVlc3QmKSA9IGRlZmF1bHQ7CitFbmFi
bGVUcmFjaW5nUmVxdWVzdCYgRW5hYmxlVHJhY2luZ1JlcXVlc3Q6Om9wZXJhdG9yPShjb25zdCBF
bmFibGVUcmFjaW5nUmVxdWVzdCYpID0gZGVmYXVsdDsKK0VuYWJsZVRyYWNpbmdSZXF1ZXN0OjpF
bmFibGVUcmFjaW5nUmVxdWVzdChFbmFibGVUcmFjaW5nUmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRl
ZmF1bHQ7CitFbmFibGVUcmFjaW5nUmVxdWVzdCYgRW5hYmxlVHJhY2luZ1JlcXVlc3Q6Om9wZXJh
dG9yPShFbmFibGVUcmFjaW5nUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgRW5hYmxlVHJh
Y2luZ1JlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgRW5hYmxlVHJhY2luZ1JlcXVlc3QmIG90aGVy
KSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVs
ZHNfCisgICAmJiB0cmFjZV9jb25maWdfID09IG90aGVyLnRyYWNlX2NvbmZpZ18KKyAgICYmIGF0
dGFjaF9ub3RpZmljYXRpb25fb25seV8gPT0gb3RoZXIuYXR0YWNoX25vdGlmaWNhdGlvbl9vbmx5
XzsKK30KKworYm9vbCBFbmFibGVUcmFjaW5nUmVxdWVzdDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qg
dm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAg
Ym9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVy
IGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZp
ZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlk
KCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5p
ZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyog
dHJhY2VfY29uZmlnICovOgorICAgICAgICAoKnRyYWNlX2NvbmZpZ18pLlBhcnNlRnJvbVN0cmlu
ZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAv
KiBhdHRhY2hfbm90aWZpY2F0aW9uX29ubHkgKi86CisgICAgICAgIGZpZWxkLmdldCgmYXR0YWNo
X25vdGlmaWNhdGlvbl9vbmx5Xyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAg
ICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5
dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgRW5hYmxlVHJhY2luZ1JlcXVlc3Q6OlNlcmlh
bGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJv
dG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4g
bXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEVuYWJs
ZVRyYWNpbmdSZXF1ZXN0OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVy
bzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZSht
c2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBF
bmFibGVUcmFjaW5nUmVxdWVzdDo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cp
IGNvbnN0IHsKKyAgLy8gRmllbGQgMTogdHJhY2VfY29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1sx
XSkgeworICAgICgqdHJhY2VfY29uZmlnXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNz
YWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigxKSk7CisgIH0KKworICAvLyBGaWVsZCAyOiBhdHRh
Y2hfbm90aWZpY2F0aW9uX29ubHkKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5B
cHBlbmRUaW55VmFySW50KDIsIGF0dGFjaF9ub3RpZmljYXRpb25fb25seV8pOworICB9CisKKyAg
bXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25f
ZmllbGRzXy5zaXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5h
bWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0
aWMgcG9wCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL2lwYy9wcm9kdWNlcl9wb3J0Lmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9pcGMvcHJvZHVjZXJfcG9ydC5nZW4uaAorLy8gRE8g
Tk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRl
ZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0lQQ19QUk9EVUNFUl9QT1JUX1BST1RP
X0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0lQQ19QUk9E
VUNFUl9QT1JUX1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8
Yml0c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8
dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0
LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFj
ZSBnZW4geworY2xhc3MgU3luY1Jlc3BvbnNlOworY2xhc3MgU3luY1JlcXVlc3Q7CitjbGFzcyBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZTsKK2NsYXNzIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0Ns
ZWFySW5jcmVtZW50YWxTdGF0ZTsKK2NsYXNzIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0ZsdXNo
OworY2xhc3MgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2U7CitjbGFzcyBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdGFydERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNl
Q29uZmlnOworY2xhc3MgVGVzdENvbmZpZzsKK2NsYXNzIFRlc3RDb25maWdfRHVtbXlGaWVsZHM7
CitjbGFzcyBDaHJvbWVDb25maWc7CitjbGFzcyBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1
cERhdGFTb3VyY2U7CitjbGFzcyBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmc7
CitjbGFzcyBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0OworY2xhc3MgQWN0aXZhdGVUcmlnZ2Vyc1Jl
c3BvbnNlOworY2xhc3MgQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3Q7CitjbGFzcyBOb3RpZnlEYXRh
U291cmNlU3RvcHBlZFJlc3BvbnNlOworY2xhc3MgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1
ZXN0OworY2xhc3MgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZTsKK2NsYXNzIE5vdGlm
eURhdGFTb3VyY2VTdGFydGVkUmVxdWVzdDsKK2NsYXNzIENvbW1pdERhdGFSZXNwb25zZTsKK2Ns
YXNzIFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlOworY2xhc3MgVW5yZWdpc3RlclRyYWNl
V3JpdGVyUmVxdWVzdDsKK2NsYXNzIFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZTsKK2NsYXNz
IFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0OworY2xhc3MgVW5yZWdpc3RlckRhdGFTb3VyY2VS
ZXNwb25zZTsKK2NsYXNzIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDsKK2NsYXNzIFJlZ2lz
dGVyRGF0YVNvdXJjZVJlc3BvbnNlOworY2xhc3MgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDsK
K2NsYXNzIERhdGFTb3VyY2VEZXNjcmlwdG9yOworY2xhc3MgSW5pdGlhbGl6ZUNvbm5lY3Rpb25S
ZXNwb25zZTsKK2NsYXNzIEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdDsKK2VudW0gSW5pdGlh
bGl6ZUNvbm5lY3Rpb25SZXF1ZXN0X1Byb2R1Y2VyU01CU2NyYXBpbmdNb2RlIDogaW50OworZW51
bSBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3RfUHJvZHVjZXJCdWlsZEZsYWdzIDogaW50Owor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBu
YW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30g
IC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFj
ZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitlbnVtIEluaXRpYWxpemVDb25uZWN0aW9uUmVx
dWVzdF9Qcm9kdWNlclNNQlNjcmFwaW5nTW9kZSA6IGludCB7CisgIEluaXRpYWxpemVDb25uZWN0
aW9uUmVxdWVzdF9Qcm9kdWNlclNNQlNjcmFwaW5nTW9kZV9TTUJfU0NSQVBJTkdfVU5TUEVDSUZJ
RUQgPSAwLAorICBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3RfUHJvZHVjZXJTTUJTY3JhcGlu
Z01vZGVfU01CX1NDUkFQSU5HX0VOQUJMRUQgPSAxLAorICBJbml0aWFsaXplQ29ubmVjdGlvblJl
cXVlc3RfUHJvZHVjZXJTTUJTY3JhcGluZ01vZGVfU01CX1NDUkFQSU5HX0RJU0FCTEVEID0gMiwK
K307CitlbnVtIEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdF9Qcm9kdWNlckJ1aWxkRmxhZ3Mg
OiBpbnQgeworICBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3RfUHJvZHVjZXJCdWlsZEZsYWdz
X0JVSUxEX0ZMQUdTX1VOU1BFQ0lGSUVEID0gMCwKKyAgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1
ZXN0X1Byb2R1Y2VyQnVpbGRGbGFnc19CVUlMRF9GTEFHU19EQ0hFQ0tTX09OID0gMSwKKyAgSW5p
dGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0X1Byb2R1Y2VyQnVpbGRGbGFnc19CVUlMRF9GTEFHU19E
Q0hFQ0tTX09GRiA9IDIsCit9OworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgU3luY1Jlc3BvbnNl
IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0g
RmllbGROdW1iZXJzIHsKKyAgfTsKKworICBTeW5jUmVzcG9uc2UoKTsKKyAgflN5bmNSZXNwb25z
ZSgpIG92ZXJyaWRlOworICBTeW5jUmVzcG9uc2UoU3luY1Jlc3BvbnNlJiYpIG5vZXhjZXB0Owor
ICBTeW5jUmVzcG9uc2UmIG9wZXJhdG9yPShTeW5jUmVzcG9uc2UmJik7CisgIFN5bmNSZXNwb25z
ZShjb25zdCBTeW5jUmVzcG9uc2UmKTsKKyAgU3luY1Jlc3BvbnNlJiBvcGVyYXRvcj0oY29uc3Qg
U3luY1Jlc3BvbnNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTeW5jUmVzcG9uc2UmKSBj
b25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN5bmNSZXNwb25zZSYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSopIGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUg
dW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1
cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxk
c187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVS
RkVUVE9fRVhQT1JUIFN5bmNSZXF1ZXN0IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdl
T2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgfTsKKworICBTeW5jUmVx
dWVzdCgpOworICB+U3luY1JlcXVlc3QoKSBvdmVycmlkZTsKKyAgU3luY1JlcXVlc3QoU3luY1Jl
cXVlc3QmJikgbm9leGNlcHQ7CisgIFN5bmNSZXF1ZXN0JiBvcGVyYXRvcj0oU3luY1JlcXVlc3Qm
Jik7CisgIFN5bmNSZXF1ZXN0KGNvbnN0IFN5bmNSZXF1ZXN0Jik7CisgIFN5bmNSZXF1ZXN0JiBv
cGVyYXRvcj0oY29uc3QgU3luY1JlcXVlc3QmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN5
bmNSZXF1ZXN0JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTeW5jUmVxdWVzdCYg
b3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcg
U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhf
dD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6
OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3Mg
dG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAg
Ly8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1
bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisK
KworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIFNldHVwRGF0
YVNvdXJjZSA9IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZTsKKyAgdXNp
bmcgU3RhcnREYXRhU291cmNlID0gR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RhcnREYXRhU291
cmNlOworICB1c2luZyBTdG9wRGF0YVNvdXJjZSA9IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0
b3BEYXRhU291cmNlOworICB1c2luZyBTZXR1cFRyYWNpbmcgPSBHZXRBc3luY0NvbW1hbmRSZXNw
b25zZV9TZXR1cFRyYWNpbmc7CisgIHVzaW5nIEZsdXNoID0gR2V0QXN5bmNDb21tYW5kUmVzcG9u
c2VfRmx1c2g7CisgIHVzaW5nIENsZWFySW5jcmVtZW50YWxTdGF0ZSA9IEdldEFzeW5jQ29tbWFu
ZFJlc3BvbnNlX0NsZWFySW5jcmVtZW50YWxTdGF0ZTsKKyAgZW51bSBGaWVsZE51bWJlcnMgewor
ICAgIGtTZXR1cFRyYWNpbmdGaWVsZE51bWJlciA9IDMsCisgICAga1NldHVwRGF0YVNvdXJjZUZp
ZWxkTnVtYmVyID0gNiwKKyAgICBrU3RhcnREYXRhU291cmNlRmllbGROdW1iZXIgPSAxLAorICAg
IGtTdG9wRGF0YVNvdXJjZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrRmx1c2hGaWVsZE51bWJlciA9
IDUsCisgICAga0NsZWFySW5jcmVtZW50YWxTdGF0ZUZpZWxkTnVtYmVyID0gNywKKyAgfTsKKwor
ICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZSgpOworICB+R2V0QXN5bmNDb21tYW5kUmVzcG9uc2Uo
KSBvdmVycmlkZTsKKyAgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2UoR2V0QXN5bmNDb21tYW5kUmVz
cG9uc2UmJikgbm9leGNlcHQ7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlJiBvcGVyYXRvcj0o
R2V0QXN5bmNDb21tYW5kUmVzcG9uc2UmJik7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlKGNv
bnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlJik7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
JiBvcGVyYXRvcj0oY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2UmKTsKKyAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlJikgY29uc3Q7CisgIGJvb2wgb3Bl
cmF0b3IhPShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsgcmV0
dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2
b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmco
KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJh
eSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2Fn
ZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3NldHVwX3RyYWNpbmcoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1szXTsgfQorICBjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRy
YWNpbmcmIHNldHVwX3RyYWNpbmcoKSBjb25zdCB7IHJldHVybiAqc2V0dXBfdHJhY2luZ187IH0K
KyAgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBUcmFjaW5nKiBtdXRhYmxlX3NldHVwX3Ry
YWNpbmcoKSB7IF9oYXNfZmllbGRfLnNldCgzKTsgcmV0dXJuIHNldHVwX3RyYWNpbmdfLmdldCgp
OyB9CisKKyAgYm9vbCBoYXNfc2V0dXBfZGF0YV9zb3VyY2UoKSBjb25zdCB7IHJldHVybiBfaGFz
X2ZpZWxkX1s2XTsgfQorICBjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFT
b3VyY2UmIHNldHVwX2RhdGFfc291cmNlKCkgY29uc3QgeyByZXR1cm4gKnNldHVwX2RhdGFfc291
cmNlXzsgfQorICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2UqIG11dGFi
bGVfc2V0dXBfZGF0YV9zb3VyY2UoKSB7IF9oYXNfZmllbGRfLnNldCg2KTsgcmV0dXJuIHNldHVw
X2RhdGFfc291cmNlXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX3N0YXJ0X2RhdGFfc291cmNlKCkg
Y29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3QgR2V0QXN5bmNDb21tYW5k
UmVzcG9uc2VfU3RhcnREYXRhU291cmNlJiBzdGFydF9kYXRhX3NvdXJjZSgpIGNvbnN0IHsgcmV0
dXJuICpzdGFydF9kYXRhX3NvdXJjZV87IH0KKyAgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3Rh
cnREYXRhU291cmNlKiBtdXRhYmxlX3N0YXJ0X2RhdGFfc291cmNlKCkgeyBfaGFzX2ZpZWxkXy5z
ZXQoMSk7IHJldHVybiBzdGFydF9kYXRhX3NvdXJjZV8uZ2V0KCk7IH0KKworICBib29sIGhhc19z
dG9wX2RhdGFfc291cmNlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgY29u
c3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2UmIHN0b3BfZGF0YV9zb3Vy
Y2UoKSBjb25zdCB7IHJldHVybiAqc3RvcF9kYXRhX3NvdXJjZV87IH0KKyAgR2V0QXN5bmNDb21t
YW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2UqIG11dGFibGVfc3RvcF9kYXRhX3NvdXJjZSgpIHsg
X2hhc19maWVsZF8uc2V0KDIpOyByZXR1cm4gc3RvcF9kYXRhX3NvdXJjZV8uZ2V0KCk7IH0KKwor
ICBib29sIGhhc19mbHVzaCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIGNv
bnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0ZsdXNoJiBmbHVzaCgpIGNvbnN0IHsgcmV0dXJu
ICpmbHVzaF87IH0KKyAgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2gqIG11dGFibGVfZmx1
c2goKSB7IF9oYXNfZmllbGRfLnNldCg1KTsgcmV0dXJuIGZsdXNoXy5nZXQoKTsgfQorCisgIGJv
b2wgaGFzX2NsZWFyX2luY3JlbWVudGFsX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bN107IH0KKyAgY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRh
bFN0YXRlJiBjbGVhcl9pbmNyZW1lbnRhbF9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuICpjbGVhcl9p
bmNyZW1lbnRhbF9zdGF0ZV87IH0KKyAgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNy
ZW1lbnRhbFN0YXRlKiBtdXRhYmxlX2NsZWFyX2luY3JlbWVudGFsX3N0YXRlKCkgeyBfaGFzX2Zp
ZWxkXy5zZXQoNyk7IHJldHVybiBjbGVhcl9pbmNyZW1lbnRhbF9zdGF0ZV8uZ2V0KCk7IH0KKwor
IHByaXZhdGU6CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxHZXRBc3luY0NvbW1hbmRSZXNw
b25zZV9TZXR1cFRyYWNpbmc+IHNldHVwX3RyYWNpbmdfOworICA6OnByb3RvemVybzo6Q29weWFi
bGVQdHI8R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBEYXRhU291cmNlPiBzZXR1cF9kYXRh
X3NvdXJjZV87CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxHZXRBc3luY0NvbW1hbmRSZXNw
b25zZV9TdGFydERhdGFTb3VyY2U+IHN0YXJ0X2RhdGFfc291cmNlXzsKKyAgOjpwcm90b3plcm86
OkNvcHlhYmxlUHRyPEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlPiBzdG9w
X2RhdGFfc291cmNlXzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPEdldEFzeW5jQ29tbWFu
ZFJlc3BvbnNlX0ZsdXNoPiBmbHVzaF87CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxHZXRB
c3luY0NvbW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGU+IGNsZWFyX2luY3JlbWVu
dGFsX3N0YXRlXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBm
aWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnBy
b3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRz
ZXQ8OD4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEdldEFz
eW5jQ29tbWFuZFJlc3BvbnNlX0NsZWFySW5jcmVtZW50YWxTdGF0ZSA6IHB1YmxpYyA6OnByb3Rv
emVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7Cisg
ICAga0RhdGFTb3VyY2VJZHNGaWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgR2V0QXN5bmNDb21t
YW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlKCk7CisgIH5HZXRBc3luY0NvbW1hbmRS
ZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGUoKSBvdmVycmlkZTsKKyAgR2V0QXN5bmNDb21t
YW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlKEdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
X0NsZWFySW5jcmVtZW50YWxTdGF0ZSYmKSBub2V4Y2VwdDsKKyAgR2V0QXN5bmNDb21tYW5kUmVz
cG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlJiBvcGVyYXRvcj0oR2V0QXN5bmNDb21tYW5kUmVz
cG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlJiYpOworICBHZXRBc3luY0NvbW1hbmRSZXNwb25z
ZV9DbGVhckluY3JlbWVudGFsU3RhdGUoY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xl
YXJJbmNyZW1lbnRhbFN0YXRlJik7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0NsZWFySW5j
cmVtZW50YWxTdGF0ZSYgb3BlcmF0b3I9KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0Ns
ZWFySW5jcmVtZW50YWxTdGF0ZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgR2V0QXN5bmND
b21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlJikgY29uc3Q7CisgIGJvb2wgb3Bl
cmF0b3IhPShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3Rh
dGUmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wg
UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3Ry
aW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVp
bnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxp
emUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBpbnQgZGF0YV9zb3VyY2VfaWRz
X3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRhdGFfc291cmNlX2lkc18u
c2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIGRhdGFfc291cmNlX2lk
cygpIGNvbnN0IHsgcmV0dXJuIGRhdGFfc291cmNlX2lkc187IH0KKyAgc3RkOjp2ZWN0b3I8dWlu
dDY0X3Q+KiBtdXRhYmxlX2RhdGFfc291cmNlX2lkcygpIHsgcmV0dXJuICZkYXRhX3NvdXJjZV9p
ZHNfOyB9CisgIHZvaWQgY2xlYXJfZGF0YV9zb3VyY2VfaWRzKCkgeyBkYXRhX3NvdXJjZV9pZHNf
LmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfZGF0YV9zb3VyY2VfaWRzKHVpbnQ2NF90IHZhbHVlKSB7
IGRhdGFfc291cmNlX2lkc18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICB1aW50NjRfdCogYWRk
X2RhdGFfc291cmNlX2lkcygpIHsgZGF0YV9zb3VyY2VfaWRzXy5lbXBsYWNlX2JhY2soKTsgcmV0
dXJuICZkYXRhX3NvdXJjZV9pZHNfLmJhY2soKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0
b3I8dWludDY0X3Q+IGRhdGFfc291cmNlX2lkc187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZl
IHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0
dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVs
ZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBF
UkZFVFRPX0VYUE9SVCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7
CisgICAga0RhdGFTb3VyY2VJZHNGaWVsZE51bWJlciA9IDEsCisgICAga1JlcXVlc3RJZEZpZWxk
TnVtYmVyID0gMiwKKyAgfTsKKworICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaCgpOwor
ICB+R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2goKSBvdmVycmlkZTsKKyAgR2V0QXN5bmND
b21tYW5kUmVzcG9uc2VfRmx1c2goR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2gmJikgbm9l
eGNlcHQ7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0ZsdXNoJiBvcGVyYXRvcj0oR2V0QXN5
bmNDb21tYW5kUmVzcG9uc2VfRmx1c2gmJik7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0Zs
dXNoKGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0ZsdXNoJik7CisgIEdldEFzeW5jQ29t
bWFuZFJlc3BvbnNlX0ZsdXNoJiBvcGVyYXRvcj0oY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9u
c2VfRmx1c2gmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3Bv
bnNlX0ZsdXNoJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHZXRBc3luY0NvbW1h
bmRSZXNwb25zZV9GbHVzaCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlk
ZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAg
c3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOwor
ICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGludCBk
YXRhX3NvdXJjZV9pZHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZGF0
YV9zb3VyY2VfaWRzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiYg
ZGF0YV9zb3VyY2VfaWRzKCkgY29uc3QgeyByZXR1cm4gZGF0YV9zb3VyY2VfaWRzXzsgfQorICBz
dGQ6OnZlY3Rvcjx1aW50NjRfdD4qIG11dGFibGVfZGF0YV9zb3VyY2VfaWRzKCkgeyByZXR1cm4g
JmRhdGFfc291cmNlX2lkc187IH0KKyAgdm9pZCBjbGVhcl9kYXRhX3NvdXJjZV9pZHMoKSB7IGRh
dGFfc291cmNlX2lkc18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9kYXRhX3NvdXJjZV9pZHModWlu
dDY0X3QgdmFsdWUpIHsgZGF0YV9zb3VyY2VfaWRzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9Cisg
IHVpbnQ2NF90KiBhZGRfZGF0YV9zb3VyY2VfaWRzKCkgeyBkYXRhX3NvdXJjZV9pZHNfLmVtcGxh
Y2VfYmFjaygpOyByZXR1cm4gJmRhdGFfc291cmNlX2lkc18uYmFjaygpOyB9CisKKyAgYm9vbCBo
YXNfcmVxdWVzdF9pZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIHVpbnQ2
NF90IHJlcXVlc3RfaWQoKSBjb25zdCB7IHJldHVybiByZXF1ZXN0X2lkXzsgfQorICB2b2lkIHNl
dF9yZXF1ZXN0X2lkKHVpbnQ2NF90IHZhbHVlKSB7IHJlcXVlc3RfaWRfID0gdmFsdWU7IF9oYXNf
ZmllbGRfLnNldCgyKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGRh
dGFfc291cmNlX2lkc187CisgIHVpbnQ2NF90IHJlcXVlc3RfaWRfe307CisKKyAgLy8gQWxsb3dz
IHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5Cisg
IC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcg
dW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9Owor
CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0
YVNvdXJjZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgor
ICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0luc3RhbmNlSWRGaWVsZE51bWJlciA9IDEsCisg
IH07CisKKyAgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2UoKTsKKyAgfkdl
dEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlKCkgb3ZlcnJpZGU7CisgIEdldEFz
eW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlKEdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
X1N0b3BEYXRhU291cmNlJiYpIG5vZXhjZXB0OworICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9T
dG9wRGF0YVNvdXJjZSYgb3BlcmF0b3I9KEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRh
U291cmNlJiYpOworICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJjZShjb25z
dCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJjZSYpOworICBHZXRBc3luY0Nv
bW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJjZSYgb3BlcmF0b3I9KGNvbnN0IEdldEFzeW5jQ29t
bWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJjZSYpIGNvbnN0OworICBib29sIG9w
ZXJhdG9yIT0oY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2UmIG90
aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19pbnN0YW5jZV9pZCgpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQ2NF90IGluc3RhbmNlX2lkKCkg
Y29uc3QgeyByZXR1cm4gaW5zdGFuY2VfaWRfOyB9CisgIHZvaWQgc2V0X2luc3RhbmNlX2lkKHVp
bnQ2NF90IHZhbHVlKSB7IGluc3RhbmNlX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7
IH0KKworIHByaXZhdGU6CisgIHVpbnQ2NF90IGluc3RhbmNlX2lkX3t9OworCisgIC8vIEFsbG93
cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQor
ICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5n
IHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsK
KworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RhcnRE
YXRhU291cmNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6
CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrTmV3SW5zdGFuY2VJZEZpZWxkTnVtYmVyID0g
MSwKKyAgICBrQ29uZmlnRmllbGROdW1iZXIgPSAyLAorICB9OworCisgIEdldEFzeW5jQ29tbWFu
ZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZSgpOworICB+R2V0QXN5bmNDb21tYW5kUmVzcG9uc2Vf
U3RhcnREYXRhU291cmNlKCkgb3ZlcnJpZGU7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0
YXJ0RGF0YVNvdXJjZShHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdGFydERhdGFTb3VyY2UmJikg
bm9leGNlcHQ7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZSYgb3Bl
cmF0b3I9KEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZSYmKTsKKyAgR2V0
QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RhcnREYXRhU291cmNlKGNvbnN0IEdldEFzeW5jQ29tbWFu
ZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZSYpOworICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9T
dGFydERhdGFTb3VyY2UmIG9wZXJhdG9yPShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9T
dGFydERhdGFTb3VyY2UmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdldEFzeW5jQ29tbWFu
ZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29u
c3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RhcnREYXRhU291cmNlJiBvdGhlcikgY29uc3Qg
eyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNv
bnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0
cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVB
c0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpN
ZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfbmV3X2luc3RhbmNlX2lkKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDY0X3QgbmV3X2luc3RhbmNlX2lkKCkgY29u
c3QgeyByZXR1cm4gbmV3X2luc3RhbmNlX2lkXzsgfQorICB2b2lkIHNldF9uZXdfaW5zdGFuY2Vf
aWQodWludDY0X3QgdmFsdWUpIHsgbmV3X2luc3RhbmNlX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoMSk7IH0KKworICBib29sIGhhc19jb25maWcoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1syXTsgfQorICBjb25zdCBEYXRhU291cmNlQ29uZmlnJiBjb25maWcoKSBjb25zdCB7IHJl
dHVybiAqY29uZmlnXzsgfQorICBEYXRhU291cmNlQ29uZmlnKiBtdXRhYmxlX2NvbmZpZygpIHsg
X2hhc19maWVsZF8uc2V0KDIpOyByZXR1cm4gY29uZmlnXy5nZXQoKTsgfQorCisgcHJpdmF0ZToK
KyAgdWludDY0X3QgbmV3X2luc3RhbmNlX2lkX3t9OworICA6OnByb3RvemVybzo6Q29weWFibGVQ
dHI8RGF0YVNvdXJjZUNvbmZpZz4gY29uZmlnXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUg
dW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1
cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxk
c187CisKKyAgc3RkOjpiaXRzZXQ8Mz4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVS
RkVUVE9fRVhQT1JUIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZSA6IHB1
YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxk
TnVtYmVycyB7CisgICAga05ld0luc3RhbmNlSWRGaWVsZE51bWJlciA9IDEsCisgICAga0NvbmZp
Z0ZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKworICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1
cERhdGFTb3VyY2UoKTsKKyAgfkdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJj
ZSgpIG92ZXJyaWRlOworICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2Uo
R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBEYXRhU291cmNlJiYpIG5vZXhjZXB0OworICBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2UmIG9wZXJhdG9yPShHZXRBc3lu
Y0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2UmJik7CisgIEdldEFzeW5jQ29tbWFuZFJl
c3BvbnNlX1NldHVwRGF0YVNvdXJjZShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1
cERhdGFTb3VyY2UmKTsKKyAgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBEYXRhU291cmNl
JiBvcGVyYXRvcj0oY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBEYXRhU291cmNl
Jik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1
cERhdGFTb3VyY2UmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdldEFzeW5jQ29t
bWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRo
aXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6
ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBv
dmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0
IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0
OworCisgIGJvb2wgaGFzX25ld19pbnN0YW5jZV9pZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzFdOyB9CisgIHVpbnQ2NF90IG5ld19pbnN0YW5jZV9pZCgpIGNvbnN0IHsgcmV0dXJuIG5l
d19pbnN0YW5jZV9pZF87IH0KKyAgdm9pZCBzZXRfbmV3X2luc3RhbmNlX2lkKHVpbnQ2NF90IHZh
bHVlKSB7IG5ld19pbnN0YW5jZV9pZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisK
KyAgYm9vbCBoYXNfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAg
Y29uc3QgRGF0YVNvdXJjZUNvbmZpZyYgY29uZmlnKCkgY29uc3QgeyByZXR1cm4gKmNvbmZpZ187
IH0KKyAgRGF0YVNvdXJjZUNvbmZpZyogbXV0YWJsZV9jb25maWcoKSB7IF9oYXNfZmllbGRfLnNl
dCgyKTsgcmV0dXJuIGNvbmZpZ18uZ2V0KCk7IH0KKworIHByaXZhdGU6CisgIHVpbnQ2NF90IG5l
d19pbnN0YW5jZV9pZF97fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPERhdGFTb3VyY2VD
b25maWc+IGNvbmZpZ187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9i
dWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9m
IC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6
Yml0c2V0PDM+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmcgOiBwdWJsaWMgOjpwcm90b3plcm86
OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtT
aGFyZWRCdWZmZXJQYWdlU2l6ZUtiRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIEdldEFzeW5j
Q29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZygpOworICB+R2V0QXN5bmNDb21tYW5kUmVzcG9u
c2VfU2V0dXBUcmFjaW5nKCkgb3ZlcnJpZGU7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1Nl
dHVwVHJhY2luZyhHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmcmJikgbm9leGNl
cHQ7CisgIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZyYgb3BlcmF0b3I9KEdl
dEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZyYmKTsKKyAgR2V0QXN5bmNDb21tYW5k
UmVzcG9uc2VfU2V0dXBUcmFjaW5nKGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVw
VHJhY2luZyYpOworICBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmcmIG9wZXJh
dG9yPShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmcmKTsKKyAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZyYp
IGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2Vf
U2V0dXBUcmFjaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0K
KworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOwor
ICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6
OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZv
aWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNf
c2hhcmVkX2J1ZmZlcl9wYWdlX3NpemVfa2IoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sx
XTsgfQorICB1aW50MzJfdCBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYigpIGNvbnN0IHsgcmV0
dXJuIHNoYXJlZF9idWZmZXJfcGFnZV9zaXplX2tiXzsgfQorICB2b2lkIHNldF9zaGFyZWRfYnVm
ZmVyX3BhZ2Vfc2l6ZV9rYih1aW50MzJfdCB2YWx1ZSkgeyBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6
ZV9rYl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyBwcml2YXRlOgorICB1aW50
MzJfdCBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYl97fTsKKworICAvLyBBbGxvd3MgdG8gcHJl
c2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0
aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3du
X2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xh
c3MgUEVSRkVUVE9fRVhQT1JUIEdldEFzeW5jQ29tbWFuZFJlcXVlc3QgOiBwdWJsaWMgOjpwcm90
b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgewor
ICB9OworCisgIEdldEFzeW5jQ29tbWFuZFJlcXVlc3QoKTsKKyAgfkdldEFzeW5jQ29tbWFuZFJl
cXVlc3QoKSBvdmVycmlkZTsKKyAgR2V0QXN5bmNDb21tYW5kUmVxdWVzdChHZXRBc3luY0NvbW1h
bmRSZXF1ZXN0JiYpIG5vZXhjZXB0OworICBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0JiBvcGVyYXRv
cj0oR2V0QXN5bmNDb21tYW5kUmVxdWVzdCYmKTsKKyAgR2V0QXN5bmNDb21tYW5kUmVxdWVzdChj
b25zdCBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0Jik7CisgIEdldEFzeW5jQ29tbWFuZFJlcXVlc3Qm
IG9wZXJhdG9yPShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0Jik7CisgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0JiBvdGhlcikgY29uc3QgeyByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
LCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikg
Y29uc3Q7CisKKyBwcml2YXRlOgorCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHBy
b3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9u
cyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBz
dGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBP
UlQgQWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNz
YWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgfTsKKworICBBY3Rp
dmF0ZVRyaWdnZXJzUmVzcG9uc2UoKTsKKyAgfkFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZSgpIG92
ZXJyaWRlOworICBBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UoQWN0aXZhdGVUcmlnZ2Vyc1Jlc3Bv
bnNlJiYpIG5vZXhjZXB0OworICBBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UmIG9wZXJhdG9yPShB
Y3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UmJik7CisgIEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZShj
b25zdCBBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UmKTsKKyAgQWN0aXZhdGVUcmlnZ2Vyc1Jlc3Bv
bnNlJiBvcGVyYXRvcj0oY29uc3QgQWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNlJik7CisgIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UmKSBjb25zdDsKKyAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZSYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSopIGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUg
dW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1
cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxk
c187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVS
RkVUVE9fRVhQT1JUIEFjdGl2YXRlVHJpZ2dlcnNSZXF1ZXN0IDogcHVibGljIDo6cHJvdG96ZXJv
OjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBr
VHJpZ2dlck5hbWVzRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIEFjdGl2YXRlVHJpZ2dlcnNS
ZXF1ZXN0KCk7CisgIH5BY3RpdmF0ZVRyaWdnZXJzUmVxdWVzdCgpIG92ZXJyaWRlOworICBBY3Rp
dmF0ZVRyaWdnZXJzUmVxdWVzdChBY3RpdmF0ZVRyaWdnZXJzUmVxdWVzdCYmKSBub2V4Y2VwdDsK
KyAgQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmIG9wZXJhdG9yPShBY3RpdmF0ZVRyaWdnZXJzUmVx
dWVzdCYmKTsKKyAgQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QoY29uc3QgQWN0aXZhdGVUcmlnZ2Vy
c1JlcXVlc3QmKTsKKyAgQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBB
Y3RpdmF0ZVRyaWdnZXJzUmVxdWVzdCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWN0aXZh
dGVUcmlnZ2Vyc1JlcXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFjdGl2
YXRlVHJpZ2dlcnNSZXF1ZXN0JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJy
aWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwor
ICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7
CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50
IHRyaWdnZXJfbmFtZXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odHJp
Z2dlcl9uYW1lc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4m
IHRyaWdnZXJfbmFtZXMoKSBjb25zdCB7IHJldHVybiB0cmlnZ2VyX25hbWVzXzsgfQorICBzdGQ6
OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfdHJpZ2dlcl9uYW1lcygpIHsgcmV0dXJuICZ0
cmlnZ2VyX25hbWVzXzsgfQorICB2b2lkIGNsZWFyX3RyaWdnZXJfbmFtZXMoKSB7IHRyaWdnZXJf
bmFtZXNfLmNsZWFyKCk7IH0KKyAgdm9pZCBhZGRfdHJpZ2dlcl9uYW1lcyhzdGQ6OnN0cmluZyB2
YWx1ZSkgeyB0cmlnZ2VyX25hbWVzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3Ry
aW5nKiBhZGRfdHJpZ2dlcl9uYW1lcygpIHsgdHJpZ2dlcl9uYW1lc18uZW1wbGFjZV9iYWNrKCk7
IHJldHVybiAmdHJpZ2dlcl9uYW1lc18uYmFjaygpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnZl
Y3RvcjxzdGQ6OnN0cmluZz4gdHJpZ2dlcl9uYW1lc187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNl
cnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGgg
ZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9m
aWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNz
IFBFUkZFVFRPX0VYUE9SVCBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1i
ZXJzIHsKKyAgfTsKKworICBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlKCk7CisgIH5O
b3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlKCkgb3ZlcnJpZGU7CisgIE5vdGlmeURhdGFT
b3VyY2VTdG9wcGVkUmVzcG9uc2UoTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYmKSBu
b2V4Y2VwdDsKKyAgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYgb3BlcmF0b3I9KE5v
dGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2UmJik7CisgIE5vdGlmeURhdGFTb3VyY2VTdG9w
cGVkUmVzcG9uc2UoY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYpOworICBO
b3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlJiBvcGVyYXRvcj0oY29uc3QgTm90aWZ5RGF0
YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTm90aWZ5
RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29u
c3QgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJu
ICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lk
Kiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgp
IGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSop
IGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBw
cm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lv
bnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAg
c3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQ
T1JUIE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdCA6IHB1YmxpYyA6OnByb3RvemVybzo6
Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0Rh
dGFTb3VyY2VJZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBOb3RpZnlEYXRhU291cmNlU3Rv
cHBlZFJlcXVlc3QoKTsKKyAgfk5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdCgpIG92ZXJy
aWRlOworICBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3QoTm90aWZ5RGF0YVNvdXJjZVN0
b3BwZWRSZXF1ZXN0JiYpIG5vZXhjZXB0OworICBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVl
c3QmIG9wZXJhdG9yPShOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3QmJik7CisgIE5vdGlm
eURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdChjb25zdCBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJl
cXVlc3QmKTsKKyAgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1ZXN0JiBvcGVyYXRvcj0oY29u
c3QgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1ZXN0Jik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdCYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX2RhdGFfc291cmNlX2lkKCkgY29uc3QgeyBy
ZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDY0X3QgZGF0YV9zb3VyY2VfaWQoKSBjb25z
dCB7IHJldHVybiBkYXRhX3NvdXJjZV9pZF87IH0KKyAgdm9pZCBzZXRfZGF0YV9zb3VyY2VfaWQo
dWludDY0X3QgdmFsdWUpIHsgZGF0YV9zb3VyY2VfaWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNl
dCgxKTsgfQorCisgcHJpdmF0ZToKKyAgdWludDY0X3QgZGF0YV9zb3VyY2VfaWRfe307CisKKyAg
Ly8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRp
YmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3Rk
OjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDI+IF9oYXNfZmllbGRf
e307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBOb3RpZnlEYXRhU291cmNlU3RhcnRl
ZFJlc3BvbnNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6
CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgfTsKKworICBOb3RpZnlEYXRhU291cmNlU3RhcnRl
ZFJlc3BvbnNlKCk7CisgIH5Ob3RpZnlEYXRhU291cmNlU3RhcnRlZFJlc3BvbnNlKCkgb3ZlcnJp
ZGU7CisgIE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2UoTm90aWZ5RGF0YVNvdXJjZVN0
YXJ0ZWRSZXNwb25zZSYmKSBub2V4Y2VwdDsKKyAgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNw
b25zZSYgb3BlcmF0b3I9KE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2UmJik7CisgIE5v
dGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2UoY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0
ZWRSZXNwb25zZSYpOworICBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlc3BvbnNlJiBvcGVyYXRv
cj0oY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZSYpOworICBib29sIG9wZXJh
dG9yPT0oY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZSYpIGNvbnN0OworICBi
b29sIG9wZXJhdG9yIT0oY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZSYgb3Ro
ZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZy
b21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4g
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8g
cHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8g
d2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtu
b3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKwor
Y2xhc3MgUEVSRkVUVE9fRVhQT1JUIE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVxdWVzdCA6IHB1
YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxk
TnVtYmVycyB7CisgICAga0RhdGFTb3VyY2VJZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBO
b3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QoKTsKKyAgfk5vdGlmeURhdGFTb3VyY2VTdGFy
dGVkUmVxdWVzdCgpIG92ZXJyaWRlOworICBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3Qo
Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0JiYpIG5vZXhjZXB0OworICBOb3RpZnlEYXRh
U291cmNlU3RhcnRlZFJlcXVlc3QmIG9wZXJhdG9yPShOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJl
cXVlc3QmJik7CisgIE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVxdWVzdChjb25zdCBOb3RpZnlE
YXRhU291cmNlU3RhcnRlZFJlcXVlc3QmKTsKKyAgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1
ZXN0JiBvcGVyYXRvcj0oY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0Jik7Cisg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QmKSBj
b25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVx
dWVzdCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9v
bCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpz
dHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8
dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlh
bGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX2RhdGFfc291
cmNlX2lkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgdWludDY0X3QgZGF0
YV9zb3VyY2VfaWQoKSBjb25zdCB7IHJldHVybiBkYXRhX3NvdXJjZV9pZF87IH0KKyAgdm9pZCBz
ZXRfZGF0YV9zb3VyY2VfaWQodWludDY0X3QgdmFsdWUpIHsgZGF0YV9zb3VyY2VfaWRfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgcHJpdmF0ZToKKyAgdWludDY0X3QgZGF0YV9z
b3VyY2VfaWRfe307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYg
ZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5w
cm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0
c2V0PDI+IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBDb21t
aXREYXRhUmVzcG9uc2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1
YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICB9OworCisgIENvbW1pdERhdGFSZXNwb25z
ZSgpOworICB+Q29tbWl0RGF0YVJlc3BvbnNlKCkgb3ZlcnJpZGU7CisgIENvbW1pdERhdGFSZXNw
b25zZShDb21taXREYXRhUmVzcG9uc2UmJikgbm9leGNlcHQ7CisgIENvbW1pdERhdGFSZXNwb25z
ZSYgb3BlcmF0b3I9KENvbW1pdERhdGFSZXNwb25zZSYmKTsKKyAgQ29tbWl0RGF0YVJlc3BvbnNl
KGNvbnN0IENvbW1pdERhdGFSZXNwb25zZSYpOworICBDb21taXREYXRhUmVzcG9uc2UmIG9wZXJh
dG9yPShjb25zdCBDb21taXREYXRhUmVzcG9uc2UmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0
IENvbW1pdERhdGFSZXNwb25zZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29t
bWl0RGF0YVJlc3BvbnNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7
IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRl
OworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBz
dGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7Cisg
IHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyBwcml2YXRl
OgorCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3Ig
Y29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMu
CisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFz
X2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVW5yZWdpc3RlclRyYWNl
V3JpdGVyUmVzcG9uc2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1
YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICB9OworCisgIFVucmVnaXN0ZXJUcmFjZVdy
aXRlclJlc3BvbnNlKCk7CisgIH5VbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSgpIG92ZXJy
aWRlOworICBVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZShVbnJlZ2lzdGVyVHJhY2VXcml0
ZXJSZXNwb25zZSYmKSBub2V4Y2VwdDsKKyAgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2Um
IG9wZXJhdG9yPShVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSYmKTsKKyAgVW5yZWdpc3Rl
clRyYWNlV3JpdGVyUmVzcG9uc2UoY29uc3QgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2Um
KTsKKyAgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBVbnJl
Z2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5y
ZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNv
bnN0IFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
LCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikg
Y29uc3Q7CisKKyBwcml2YXRlOgorCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHBy
b3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9u
cyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBz
dGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBP
UlQgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3Bw
TWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1RyYWNl
V3JpdGVySWRGaWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgVW5yZWdpc3RlclRyYWNlV3JpdGVy
UmVxdWVzdCgpOworICB+VW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCgpIG92ZXJyaWRlOwor
ICBVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0KFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVl
c3QmJikgbm9leGNlcHQ7CisgIFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmIG9wZXJhdG9y
PShVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiYpOworICBVbnJlZ2lzdGVyVHJhY2VXcml0
ZXJSZXF1ZXN0KGNvbnN0IFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmKTsKKyAgVW5yZWdp
c3RlclRyYWNlV3JpdGVyUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IFVucmVnaXN0ZXJUcmFjZVdy
aXRlclJlcXVlc3QmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVucmVnaXN0ZXJUcmFjZVdy
aXRlclJlcXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVucmVnaXN0ZXJU
cmFjZVdyaXRlclJlcXVlc3QmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVy
KTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJp
ZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cisg
IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsK
KyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29s
IGhhc190cmFjZV93cml0ZXJfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQor
ICB1aW50MzJfdCB0cmFjZV93cml0ZXJfaWQoKSBjb25zdCB7IHJldHVybiB0cmFjZV93cml0ZXJf
aWRfOyB9CisgIHZvaWQgc2V0X3RyYWNlX3dyaXRlcl9pZCh1aW50MzJfdCB2YWx1ZSkgeyB0cmFj
ZV93cml0ZXJfaWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgcHJpdmF0ZToK
KyAgdWludDMyX3QgdHJhY2Vfd3JpdGVyX2lkX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2
ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1
dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmll
bGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQ
RVJGRVRUT19FWFBPUlQgUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlIDogcHVibGljIDo6cHJv
dG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsK
KyAgfTsKKworICBSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UoKTsKKyAgflJlZ2lzdGVyVHJh
Y2VXcml0ZXJSZXNwb25zZSgpIG92ZXJyaWRlOworICBSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9u
c2UoUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJiYpIG5vZXhjZXB0OworICBSZWdpc3RlclRy
YWNlV3JpdGVyUmVzcG9uc2UmIG9wZXJhdG9yPShSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2Um
Jik7CisgIFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZShjb25zdCBSZWdpc3RlclRyYWNlV3Jp
dGVyUmVzcG9uc2UmKTsKKyAgUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJiBvcGVyYXRvcj0o
Y29uc3QgUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsgcmV0
dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2
b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmco
KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJh
eSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2Fn
ZSopIGNvbnN0OworCisgcHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93
biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVy
c2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisK
KyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9f
RVhQT1JUIFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0IDogcHVibGljIDo6cHJvdG96ZXJvOjpD
cHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrVHJh
Y2VXcml0ZXJJZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrVGFyZ2V0QnVmZmVyRmllbGROdW1iZXIg
PSAyLAorICB9OworCisgIFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0KCk7CisgIH5SZWdpc3Rl
clRyYWNlV3JpdGVyUmVxdWVzdCgpIG92ZXJyaWRlOworICBSZWdpc3RlclRyYWNlV3JpdGVyUmVx
dWVzdChSZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCYmKSBub2V4Y2VwdDsKKyAgUmVnaXN0ZXJU
cmFjZVdyaXRlclJlcXVlc3QmIG9wZXJhdG9yPShSZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCYm
KTsKKyAgUmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QoY29uc3QgUmVnaXN0ZXJUcmFjZVdyaXRl
clJlcXVlc3QmKTsKKyAgUmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmIG9wZXJhdG9yPShjb25z
dCBSZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qg
UmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNv
bnN0IFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgq
dGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBz
aXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0
IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29u
c3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29u
c3Q7CisKKyAgYm9vbCBoYXNfdHJhY2Vfd3JpdGVyX2lkKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMV07IH0KKyAgdWludDMyX3QgdHJhY2Vfd3JpdGVyX2lkKCkgY29uc3QgeyByZXR1cm4g
dHJhY2Vfd3JpdGVyX2lkXzsgfQorICB2b2lkIHNldF90cmFjZV93cml0ZXJfaWQodWludDMyX3Qg
dmFsdWUpIHsgdHJhY2Vfd3JpdGVyX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0K
KworICBib29sIGhhc190YXJnZXRfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9b
Ml07IH0KKyAgdWludDMyX3QgdGFyZ2V0X2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIHRhcmdldF9i
dWZmZXJfOyB9CisgIHZvaWQgc2V0X3RhcmdldF9idWZmZXIodWludDMyX3QgdmFsdWUpIHsgdGFy
Z2V0X2J1ZmZlcl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisKKyBwcml2YXRlOgor
ICB1aW50MzJfdCB0cmFjZV93cml0ZXJfaWRfe307CisgIHVpbnQzMl90IHRhcmdldF9idWZmZXJf
e307CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZv
ciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxl
cy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDM+IF9o
YXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBVbnJlZ2lzdGVyRGF0
YVNvdXJjZVJlc3BvbnNlIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBw
dWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgfTsKKworICBVbnJlZ2lzdGVyRGF0YVNv
dXJjZVJlc3BvbnNlKCk7CisgIH5VbnJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlKCkgb3ZlcnJp
ZGU7CisgIFVucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UoVW5yZWdpc3RlckRhdGFTb3VyY2VS
ZXNwb25zZSYmKSBub2V4Y2VwdDsKKyAgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZSYgb3Bl
cmF0b3I9KFVucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UmJik7CisgIFVucmVnaXN0ZXJEYXRh
U291cmNlUmVzcG9uc2UoY29uc3QgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZSYpOworICBV
bnJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJiBvcGVyYXRvcj0oY29uc3QgVW5yZWdpc3RlckRh
dGFTb3VyY2VSZXNwb25zZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5yZWdpc3RlckRh
dGFTb3VyY2VSZXNwb25zZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5yZWdp
c3RlckRhdGFTb3VyY2VSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0g
b3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBv
dmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlk
ZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJy
aWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisg
cHJpdmF0ZToKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVs
ZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3Rv
IGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8
Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFVucmVnaXN0
ZXJEYXRhU291cmNlUmVxdWVzdCA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7
CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0RhdGFTb3VyY2VOYW1lRmll
bGROdW1iZXIgPSAxLAorICB9OworCisgIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCgpOwor
ICB+VW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0KCkgb3ZlcnJpZGU7CisgIFVucmVnaXN0ZXJE
YXRhU291cmNlUmVxdWVzdChVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QmJikgbm9leGNlcHQ7
CisgIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYgb3BlcmF0b3I9KFVucmVnaXN0ZXJEYXRh
U291cmNlUmVxdWVzdCYmKTsKKyAgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0KGNvbnN0IFVu
cmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYpOworICBVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVl
c3QmIG9wZXJhdG9yPShjb25zdCBVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QmKTsKKyAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYpIGNvbnN0Owor
ICBib29sIG9wZXJhdG9yIT0oY29uc3QgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0JiBvdGhl
cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJv
bUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJp
YWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBT
ZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJv
dG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfZGF0YV9zb3VyY2VfbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBk
YXRhX3NvdXJjZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gZGF0YV9zb3VyY2VfbmFtZV87IH0KKyAg
dm9pZCBzZXRfZGF0YV9zb3VyY2VfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgZGF0
YV9zb3VyY2VfbmFtZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyBwcml2YXRl
OgorICBzdGQ6OnN0cmluZyBkYXRhX3NvdXJjZV9uYW1lX3t9OworCisgIC8vIEFsbG93cyB0byBw
cmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3
aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25v
d25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitj
bGFzcyBQRVJGRVRUT19FWFBPUlQgUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UgOiBwdWJsaWMg
Ojpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJl
cnMgeworICAgIGtFcnJvckZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBSZWdpc3RlckRhdGFT
b3VyY2VSZXNwb25zZSgpOworICB+UmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UoKSBvdmVycmlk
ZTsKKyAgUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UoUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9u
c2UmJikgbm9leGNlcHQ7CisgIFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJiBvcGVyYXRvcj0o
UmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UmJik7CisgIFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3Bv
bnNlKGNvbnN0IFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJik7CisgIFJlZ2lzdGVyRGF0YVNv
dXJjZVJlc3BvbnNlJiBvcGVyYXRvcj0oY29uc3QgUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2Um
KTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJikg
Y29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBSZWdpc3RlckRhdGFTb3VyY2VSZXNwb25z
ZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQ
YXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJp
bmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWlu
dDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6
ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX2Vycm9yKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9y
KCkgY29uc3QgeyByZXR1cm4gZXJyb3JfOyB9CisgIHZvaWQgc2V0X2Vycm9yKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeyBlcnJvcl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisK
KyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBlcnJvcl97fTsKKworICAvLyBBbGxvd3MgdG8gcHJl
c2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0
aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3du
X2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xh
c3MgUEVSRkVUVE9fRVhQT1JUIFJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QgOiBwdWJsaWMgOjpw
cm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMg
eworICAgIGtEYXRhU291cmNlRGVzY3JpcHRvckZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBS
ZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0KCk7CisgIH5SZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0
KCkgb3ZlcnJpZGU7CisgIFJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QoUmVnaXN0ZXJEYXRhU291
cmNlUmVxdWVzdCYmKSBub2V4Y2VwdDsKKyAgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYgb3Bl
cmF0b3I9KFJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QmJik7CisgIFJlZ2lzdGVyRGF0YVNvdXJj
ZVJlcXVlc3QoY29uc3QgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYpOworICBSZWdpc3RlckRh
dGFTb3VyY2VSZXF1ZXN0JiBvcGVyYXRvcj0oY29uc3QgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVz
dCYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYp
IGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVz
dCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQ
YXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJp
bmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWlu
dDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6
ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX2RhdGFfc291cmNl
X2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBE
YXRhU291cmNlRGVzY3JpcHRvciYgZGF0YV9zb3VyY2VfZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0
dXJuICpkYXRhX3NvdXJjZV9kZXNjcmlwdG9yXzsgfQorICBEYXRhU291cmNlRGVzY3JpcHRvciog
bXV0YWJsZV9kYXRhX3NvdXJjZV9kZXNjcmlwdG9yKCkgeyBfaGFzX2ZpZWxkXy5zZXQoMSk7IHJl
dHVybiBkYXRhX3NvdXJjZV9kZXNjcmlwdG9yXy5nZXQoKTsgfQorCisgcHJpdmF0ZToKKyAgOjpw
cm90b3plcm86OkNvcHlhYmxlUHRyPERhdGFTb3VyY2VEZXNjcmlwdG9yPiBkYXRhX3NvdXJjZV9k
ZXNjcmlwdG9yXzsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBm
aWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnBy
b3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRz
ZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIEluaXRp
YWxpemVDb25uZWN0aW9uUmVzcG9uc2UgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VP
YmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtVc2luZ1NobWVtUHJv
dmlkZWRCeVByb2R1Y2VyRmllbGROdW1iZXIgPSAxLAorICB9OworCisgIEluaXRpYWxpemVDb25u
ZWN0aW9uUmVzcG9uc2UoKTsKKyAgfkluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2UoKSBvdmVy
cmlkZTsKKyAgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZShJbml0aWFsaXplQ29ubmVjdGlv
blJlc3BvbnNlJiYpIG5vZXhjZXB0OworICBJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlJiBv
cGVyYXRvcj0oSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZSYmKTsKKyAgSW5pdGlhbGl6ZUNv
bm5lY3Rpb25SZXNwb25zZShjb25zdCBJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlJik7Cisg
IEluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBJbml0aWFsaXpl
Q29ubmVjdGlvblJlc3BvbnNlJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbml0aWFsaXpl
Q29ubmVjdGlvblJlc3BvbnNlJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbml0
aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9
PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3Qp
IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJy
aWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3Zl
cnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisK
KyAgYm9vbCBoYXNfdXNpbmdfc2htZW1fcHJvdmlkZWRfYnlfcHJvZHVjZXIoKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBib29sIHVzaW5nX3NobWVtX3Byb3ZpZGVkX2J5X3By
b2R1Y2VyKCkgY29uc3QgeyByZXR1cm4gdXNpbmdfc2htZW1fcHJvdmlkZWRfYnlfcHJvZHVjZXJf
OyB9CisgIHZvaWQgc2V0X3VzaW5nX3NobWVtX3Byb3ZpZGVkX2J5X3Byb2R1Y2VyKGJvb2wgdmFs
dWUpIHsgdXNpbmdfc2htZW1fcHJvdmlkZWRfYnlfcHJvZHVjZXJfID0gdmFsdWU7IF9oYXNfZmll
bGRfLnNldCgxKTsgfQorCisgcHJpdmF0ZToKKyAgYm9vbCB1c2luZ19zaG1lbV9wcm92aWRlZF9i
eV9wcm9kdWNlcl97fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1
ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2Yg
LnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpi
aXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIElu
aXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2Fn
ZU9iaiB7CisgcHVibGljOgorICB1c2luZyBQcm9kdWNlclNNQlNjcmFwaW5nTW9kZSA9IEluaXRp
YWxpemVDb25uZWN0aW9uUmVxdWVzdF9Qcm9kdWNlclNNQlNjcmFwaW5nTW9kZTsKKyAgc3RhdGlj
IGNvbnN0ZXhwciBhdXRvIFNNQl9TQ1JBUElOR19VTlNQRUNJRklFRCA9IEluaXRpYWxpemVDb25u
ZWN0aW9uUmVxdWVzdF9Qcm9kdWNlclNNQlNjcmFwaW5nTW9kZV9TTUJfU0NSQVBJTkdfVU5TUEVD
SUZJRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBTTUJfU0NSQVBJTkdfRU5BQkxFRCA9IElu
aXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdF9Qcm9kdWNlclNNQlNjcmFwaW5nTW9kZV9TTUJfU0NS
QVBJTkdfRU5BQkxFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFNNQl9TQ1JBUElOR19ESVNB
QkxFRCA9IEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdF9Qcm9kdWNlclNNQlNjcmFwaW5nTW9k
ZV9TTUJfU0NSQVBJTkdfRElTQUJMRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBQcm9kdWNl
clNNQlNjcmFwaW5nTW9kZV9NSU4gPSBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3RfUHJvZHVj
ZXJTTUJTY3JhcGluZ01vZGVfU01CX1NDUkFQSU5HX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29u
c3RleHByIGF1dG8gUHJvZHVjZXJTTUJTY3JhcGluZ01vZGVfTUFYID0gSW5pdGlhbGl6ZUNvbm5l
Y3Rpb25SZXF1ZXN0X1Byb2R1Y2VyU01CU2NyYXBpbmdNb2RlX1NNQl9TQ1JBUElOR19ESVNBQkxF
RDsKKyAgdXNpbmcgUHJvZHVjZXJCdWlsZEZsYWdzID0gSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1
ZXN0X1Byb2R1Y2VyQnVpbGRGbGFnczsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIEJVSUxEX0ZM
QUdTX1VOU1BFQ0lGSUVEID0gSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0X1Byb2R1Y2VyQnVp
bGRGbGFnc19CVUlMRF9GTEFHU19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRv
IEJVSUxEX0ZMQUdTX0RDSEVDS1NfT04gPSBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3RfUHJv
ZHVjZXJCdWlsZEZsYWdzX0JVSUxEX0ZMQUdTX0RDSEVDS1NfT047CisgIHN0YXRpYyBjb25zdGV4
cHIgYXV0byBCVUlMRF9GTEFHU19EQ0hFQ0tTX09GRiA9IEluaXRpYWxpemVDb25uZWN0aW9uUmVx
dWVzdF9Qcm9kdWNlckJ1aWxkRmxhZ3NfQlVJTERfRkxBR1NfRENIRUNLU19PRkY7CisgIHN0YXRp
YyBjb25zdGV4cHIgYXV0byBQcm9kdWNlckJ1aWxkRmxhZ3NfTUlOID0gSW5pdGlhbGl6ZUNvbm5l
Y3Rpb25SZXF1ZXN0X1Byb2R1Y2VyQnVpbGRGbGFnc19CVUlMRF9GTEFHU19VTlNQRUNJRklFRDsK
KyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFByb2R1Y2VyQnVpbGRGbGFnc19NQVggPSBJbml0aWFs
aXplQ29ubmVjdGlvblJlcXVlc3RfUHJvZHVjZXJCdWlsZEZsYWdzX0JVSUxEX0ZMQUdTX0RDSEVD
S1NfT0ZGOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1NoYXJlZE1lbW9yeVBhZ2VTaXpl
SGludEJ5dGVzRmllbGROdW1iZXIgPSAxLAorICAgIGtTaGFyZWRNZW1vcnlTaXplSGludEJ5dGVz
RmllbGROdW1iZXIgPSAyLAorICAgIGtQcm9kdWNlck5hbWVGaWVsZE51bWJlciA9IDMsCisgICAg
a1NtYlNjcmFwaW5nTW9kZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrQnVpbGRGbGFnc0ZpZWxkTnVt
YmVyID0gNSwKKyAgICBrUHJvZHVjZXJQcm92aWRlZFNobWVtRmllbGROdW1iZXIgPSA2LAorICB9
OworCisgIEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCgpOworICB+SW5pdGlhbGl6ZUNvbm5l
Y3Rpb25SZXF1ZXN0KCkgb3ZlcnJpZGU7CisgIEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdChJ
bml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3QmJikgbm9leGNlcHQ7CisgIEluaXRpYWxpemVDb25u
ZWN0aW9uUmVxdWVzdCYgb3BlcmF0b3I9KEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCYmKTsK
KyAgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0KGNvbnN0IEluaXRpYWxpemVDb25uZWN0aW9u
UmVxdWVzdCYpOworICBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3QmIG9wZXJhdG9yPShjb25z
dCBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3QmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0
IEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0o
Y29uc3QgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0JiBvdGhlcikgY29uc3QgeyByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQq
LCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikg
Y29uc3Q7CisKKyAgYm9vbCBoYXNfc2hhcmVkX21lbW9yeV9wYWdlX3NpemVfaGludF9ieXRlcygp
IGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQzMl90IHNoYXJlZF9tZW1v
cnlfcGFnZV9zaXplX2hpbnRfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBzaGFyZWRfbWVtb3J5X3Bh
Z2Vfc2l6ZV9oaW50X2J5dGVzXzsgfQorICB2b2lkIHNldF9zaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6
ZV9oaW50X2J5dGVzKHVpbnQzMl90IHZhbHVlKSB7IHNoYXJlZF9tZW1vcnlfcGFnZV9zaXplX2hp
bnRfYnl0ZXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX3No
YXJlZF9tZW1vcnlfc2l6ZV9oaW50X2J5dGVzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9b
Ml07IH0KKyAgdWludDMyX3Qgc2hhcmVkX21lbW9yeV9zaXplX2hpbnRfYnl0ZXMoKSBjb25zdCB7
IHJldHVybiBzaGFyZWRfbWVtb3J5X3NpemVfaGludF9ieXRlc187IH0KKyAgdm9pZCBzZXRfc2hh
cmVkX21lbW9yeV9zaXplX2hpbnRfYnl0ZXModWludDMyX3QgdmFsdWUpIHsgc2hhcmVkX21lbW9y
eV9zaXplX2hpbnRfYnl0ZXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJv
b2wgaGFzX3Byb2R1Y2VyX25hbWUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQor
ICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvZHVjZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHByb2R1
Y2VyX25hbWVfOyB9CisgIHZvaWQgc2V0X3Byb2R1Y2VyX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7IHByb2R1Y2VyX25hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsgfQor
CisgIGJvb2wgaGFzX3NtYl9zY3JhcGluZ19tb2RlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bNF07IH0KKyAgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0X1Byb2R1Y2VyU01CU2NyYXBp
bmdNb2RlIHNtYl9zY3JhcGluZ19tb2RlKCkgY29uc3QgeyByZXR1cm4gc21iX3NjcmFwaW5nX21v
ZGVfOyB9CisgIHZvaWQgc2V0X3NtYl9zY3JhcGluZ19tb2RlKEluaXRpYWxpemVDb25uZWN0aW9u
UmVxdWVzdF9Qcm9kdWNlclNNQlNjcmFwaW5nTW9kZSB2YWx1ZSkgeyBzbWJfc2NyYXBpbmdfbW9k
ZV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfYnVpbGRfZmxh
Z3MoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s1XTsgfQorICBJbml0aWFsaXplQ29ubmVj
dGlvblJlcXVlc3RfUHJvZHVjZXJCdWlsZEZsYWdzIGJ1aWxkX2ZsYWdzKCkgY29uc3QgeyByZXR1
cm4gYnVpbGRfZmxhZ3NfOyB9CisgIHZvaWQgc2V0X2J1aWxkX2ZsYWdzKEluaXRpYWxpemVDb25u
ZWN0aW9uUmVxdWVzdF9Qcm9kdWNlckJ1aWxkRmxhZ3MgdmFsdWUpIHsgYnVpbGRfZmxhZ3NfID0g
dmFsdWU7IF9oYXNfZmllbGRfLnNldCg1KTsgfQorCisgIGJvb2wgaGFzX3Byb2R1Y2VyX3Byb3Zp
ZGVkX3NobWVtKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNl07IH0KKyAgYm9vbCBwcm9k
dWNlcl9wcm92aWRlZF9zaG1lbSgpIGNvbnN0IHsgcmV0dXJuIHByb2R1Y2VyX3Byb3ZpZGVkX3No
bWVtXzsgfQorICB2b2lkIHNldF9wcm9kdWNlcl9wcm92aWRlZF9zaG1lbShib29sIHZhbHVlKSB7
IHByb2R1Y2VyX3Byb3ZpZGVkX3NobWVtXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNik7IH0K
KworIHByaXZhdGU6CisgIHVpbnQzMl90IHNoYXJlZF9tZW1vcnlfcGFnZV9zaXplX2hpbnRfYnl0
ZXNfe307CisgIHVpbnQzMl90IHNoYXJlZF9tZW1vcnlfc2l6ZV9oaW50X2J5dGVzX3t9OworICBz
dGQ6OnN0cmluZyBwcm9kdWNlcl9uYW1lX3t9OworICBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVl
c3RfUHJvZHVjZXJTTUJTY3JhcGluZ01vZGUgc21iX3NjcmFwaW5nX21vZGVfe307CisgIEluaXRp
YWxpemVDb25uZWN0aW9uUmVxdWVzdF9Qcm9kdWNlckJ1aWxkRmxhZ3MgYnVpbGRfZmxhZ3Nfe307
CisgIGJvb2wgcHJvZHVjZXJfcHJvdmlkZWRfc2htZW1fe307CisKKyAgLy8gQWxsb3dzIHRvIHBy
ZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdp
dGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93
bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDc+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAv
LyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVz
cGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0lQ
Q19QUk9EVUNFUl9QT1JUX1BST1RPX0NQUF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0
ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5o
IgorLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdp
bgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGln
bm9yZWQgIi1XZmxvYXQtZXF1YWwiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwcm90b3MvcGVyZmV0dG8vaXBjL3Byb2R1Y2VyX3BvcnQuZ2VuLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2RhdGFf
c291cmNlX2Rlc2NyaXB0b3IuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL3RyYWNrX2V2ZW50X2Rlc2NyaXB0b3IuZ2Vu
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0
dG8vY29tbW9uL2dwdV9jb3VudGVyX2Rlc2NyaXB0b3IuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2RhdGFfc291cmNl
X2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBy
b3Rvcy9wZXJmZXR0by9jb25maWcvdHJhY2tfZXZlbnQvdHJhY2tfZXZlbnRfY29uZmlnLmdlbi5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRv
L2NvbmZpZy90ZXN0X2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvc3lzX3N0YXRzL3N5c19zdGF0c19jb25m
aWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3Mv
cGVyZmV0dG8vY29tbW9uL3N5c19zdGF0c19jb3VudGVycy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvZmlsaW5n
L3BlcmZfZXZlbnRfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9wcm9maWxpbmcvamF2YV9ocHJvZl9jb25m
aWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3Mv
cGVyZmV0dG8vY29uZmlnL3Byb2ZpbGluZy9oZWFwcHJvZmRfY29uZmlnLmdlbi5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9w
cm9jZXNzX3N0YXRzL3Byb2Nlc3Nfc3RhdHNfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9wb3dlci9hbmRy
b2lkX3Bvd2VyX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvaW5vZGVfZmlsZS9pbm9kZV9maWxlX2NvbmZp
Zy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9w
ZXJmZXR0by9jb25maWcvZ3B1L3Z1bGthbl9tZW1vcnlfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9ncHUv
Z3B1X2NvdW50ZXJfY29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbmZpZy9mdHJhY2UvZnRyYWNlX2NvbmZpZy5nZW4u
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0
by9jb25maWcvY2hyb21lL2Nocm9tZV9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2FuZHJvaWQvcGFja2Fn
ZXNfbGlzdF9jb25maWcuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL2FuZHJvaWQvYW5kcm9pZF9wb2xsZWRfc3RhdGVf
Y29uZmlnLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJv
dG9zL3BlcmZldHRvL2NvbmZpZy9hbmRyb2lkL2FuZHJvaWRfbG9nX2NvbmZpZy5nZW4uaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21t
b24vYW5kcm9pZF9sb2dfY29uc3RhbnRzLmdlbi5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9jb21taXRfZGF0YV9yZXF1ZXN0
Lmdlbi5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1l
c3BhY2UgZ2VuIHsKKworU3luY1Jlc3BvbnNlOjpTeW5jUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitT
eW5jUmVzcG9uc2U6On5TeW5jUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitTeW5jUmVzcG9uc2U6OlN5
bmNSZXNwb25zZShjb25zdCBTeW5jUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitTeW5jUmVzcG9uc2Um
IFN5bmNSZXNwb25zZTo6b3BlcmF0b3I9KGNvbnN0IFN5bmNSZXNwb25zZSYpID0gZGVmYXVsdDsK
K1N5bmNSZXNwb25zZTo6U3luY1Jlc3BvbnNlKFN5bmNSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRl
ZmF1bHQ7CitTeW5jUmVzcG9uc2UmIFN5bmNSZXNwb25zZTo6b3BlcmF0b3I9KFN5bmNSZXNwb25z
ZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgU3luY1Jlc3BvbnNlOjpvcGVyYXRvcj09KGNvbnN0IFN5
bmNSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBv
dGhlci51bmtub3duX2ZpZWxkc187Cit9CisKK2Jvb2wgU3luY1Jlc3BvbnNlOjpQYXJzZUZyb21B
cnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5j
bGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQ
cm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFk
RmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBp
ZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8u
c2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAg
IGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2Zp
ZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJy
b3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIFN5bmNSZXNwb25zZTo6
U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8
Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJl
dHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4g
U3luY1Jlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cu
Z2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBTeW5j
UmVzcG9uc2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7Cisg
IG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3du
X2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitTeW5jUmVxdWVzdDo6U3luY1JlcXVlc3QoKSA9IGRl
ZmF1bHQ7CitTeW5jUmVxdWVzdDo6flN5bmNSZXF1ZXN0KCkgPSBkZWZhdWx0OworU3luY1JlcXVl
c3Q6OlN5bmNSZXF1ZXN0KGNvbnN0IFN5bmNSZXF1ZXN0JikgPSBkZWZhdWx0OworU3luY1JlcXVl
c3QmIFN5bmNSZXF1ZXN0OjpvcGVyYXRvcj0oY29uc3QgU3luY1JlcXVlc3QmKSA9IGRlZmF1bHQ7
CitTeW5jUmVxdWVzdDo6U3luY1JlcXVlc3QoU3luY1JlcXVlc3QmJikgbm9leGNlcHQgPSBkZWZh
dWx0OworU3luY1JlcXVlc3QmIFN5bmNSZXF1ZXN0OjpvcGVyYXRvcj0oU3luY1JlcXVlc3QmJikg
PSBkZWZhdWx0OworCitib29sIFN5bmNSZXF1ZXN0OjpvcGVyYXRvcj09KGNvbnN0IFN5bmNSZXF1
ZXN0JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVu
a25vd25fZmllbGRzXzsKK30KKworYm9vbCBTeW5jUmVxdWVzdDo6UGFyc2VGcm9tQXJyYXkoY29u
c3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsK
KyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNv
ZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7
IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxk
LmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVs
ZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBkZWZhdWx0
OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsK
KyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFk
ZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBTeW5jUmVxdWVzdDo6U2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3pl
cm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cu
U2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gU3luY1JlcXVl
c3Q6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVy
ZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7Cisg
IHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIFN5bmNSZXF1ZXN0OjpT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICBtc2ctPkFwcGVu
ZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNp
emUoKSk7Cit9CisKKworR2V0QXN5bmNDb21tYW5kUmVzcG9uc2U6OkdldEFzeW5jQ29tbWFuZFJl
c3BvbnNlKCkgPSBkZWZhdWx0OworR2V0QXN5bmNDb21tYW5kUmVzcG9uc2U6On5HZXRBc3luY0Nv
bW1hbmRSZXNwb25zZSgpID0gZGVmYXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlOjpHZXRB
c3luY0NvbW1hbmRSZXNwb25zZShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZSYpID0gZGVm
YXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlJiBHZXRBc3luY0NvbW1hbmRSZXNwb25zZTo6
b3BlcmF0b3I9KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlJikgPSBkZWZhdWx0OworR2V0
QXN5bmNDb21tYW5kUmVzcG9uc2U6OkdldEFzeW5jQ29tbWFuZFJlc3BvbnNlKEdldEFzeW5jQ29t
bWFuZFJlc3BvbnNlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlc3Bv
bnNlJiBHZXRBc3luY0NvbW1hbmRSZXNwb25zZTo6b3BlcmF0b3I9KEdldEFzeW5jQ29tbWFuZFJl
c3BvbnNlJiYpID0gZGVmYXVsdDsKKworYm9vbCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZTo6b3Bl
cmF0b3I9PShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsKKyAg
cmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHNl
dHVwX3RyYWNpbmdfID09IG90aGVyLnNldHVwX3RyYWNpbmdfCisgICAmJiBzZXR1cF9kYXRhX3Nv
dXJjZV8gPT0gb3RoZXIuc2V0dXBfZGF0YV9zb3VyY2VfCisgICAmJiBzdGFydF9kYXRhX3NvdXJj
ZV8gPT0gb3RoZXIuc3RhcnRfZGF0YV9zb3VyY2VfCisgICAmJiBzdG9wX2RhdGFfc291cmNlXyA9
PSBvdGhlci5zdG9wX2RhdGFfc291cmNlXworICAgJiYgZmx1c2hfID09IG90aGVyLmZsdXNoXwor
ICAgJiYgY2xlYXJfaW5jcmVtZW50YWxfc3RhdGVfID09IG90aGVyLmNsZWFyX2luY3JlbWVudGFs
X3N0YXRlXzsKK30KKworYm9vbCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZTo6UGFyc2VGcm9tQXJy
YXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xl
YXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJv
dG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZp
ZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYg
KGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNl
dChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBj
YXNlIDMgLyogc2V0dXBfdHJhY2luZyAqLzoKKyAgICAgICAgKCpzZXR1cF90cmFjaW5nXykuUGFy
c2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAg
ICAgY2FzZSA2IC8qIHNldHVwX2RhdGFfc291cmNlICovOgorICAgICAgICAoKnNldHVwX2RhdGFf
c291cmNlXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAxIC8qIHN0YXJ0X2RhdGFfc291cmNlICovOgorICAgICAgICAo
KnN0YXJ0X2RhdGFfc291cmNlXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmco
KSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyIC8qIHN0b3BfZGF0YV9zb3VyY2UgKi86
CisgICAgICAgICgqc3RvcF9kYXRhX3NvdXJjZV8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19z
dGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNSAvKiBmbHVzaCAqLzoK
KyAgICAgICAgKCpmbHVzaF8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkp
OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNyAvKiBjbGVhcl9pbmNyZW1lbnRhbF9zdGF0
ZSAqLzoKKyAgICAgICAgKCpjbGVhcl9pbmNyZW1lbnRhbF9zdGF0ZV8pLlBhcnNlRnJvbVN0cmlu
ZyhmaWVsZC5hc19zdGRfc3RyaW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6
CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOwor
ICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRl
Yy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJl
ZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAg
cmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90
PiBHZXRBc3luY0NvbW1hbmRSZXNwb25zZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAg
Ojpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBT
ZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9
CisKK3ZvaWQgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDM6IHNldHVwX3RyYWNpbmcKKyAgaWYg
KF9oYXNfZmllbGRfWzNdKSB7CisgICAgKCpzZXR1cF90cmFjaW5nXykuU2VyaWFsaXplKG1zZy0+
QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigzKSk7CisgIH0KKworICAv
LyBGaWVsZCA2OiBzZXR1cF9kYXRhX3NvdXJjZQorICBpZiAoX2hhc19maWVsZF9bNl0pIHsKKyAg
ICAoKnNldHVwX2RhdGFfc291cmNlXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdl
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPig2KSk7CisgIH0KKworICAvLyBGaWVsZCAxOiBzdGFydF9k
YXRhX3NvdXJjZQorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICAoKnN0YXJ0X2RhdGFfc291
cmNlXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNz
YWdlPigxKSk7CisgIH0KKworICAvLyBGaWVsZCAyOiBzdG9wX2RhdGFfc291cmNlCisgIGlmIChf
aGFzX2ZpZWxkX1syXSkgeworICAgICgqc3RvcF9kYXRhX3NvdXJjZV8pLlNlcmlhbGl6ZShtc2ct
PkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oMikpOworICB9CisKKyAg
Ly8gRmllbGQgNTogZmx1c2gKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7CisgICAgKCpmbHVzaF8p
LlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4o
NSkpOworICB9CisKKyAgLy8gRmllbGQgNzogY2xlYXJfaW5jcmVtZW50YWxfc3RhdGUKKyAgaWYg
KF9oYXNfZmllbGRfWzddKSB7CisgICAgKCpjbGVhcl9pbmNyZW1lbnRhbF9zdGF0ZV8pLlNlcmlh
bGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oNykpOwor
ICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCks
IHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNl
X0NsZWFySW5jcmVtZW50YWxTdGF0ZTo6R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNy
ZW1lbnRhbFN0YXRlKCkgPSBkZWZhdWx0OworR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJ
bmNyZW1lbnRhbFN0YXRlOjp+R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRh
bFN0YXRlKCkgPSBkZWZhdWx0OworR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1l
bnRhbFN0YXRlOjpHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGUo
Y29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlJikgPSBk
ZWZhdWx0OworR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlJiBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGU6Om9wZXJhdG9yPShj
b25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGUmKSA9IGRl
ZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGU6Okdl
dEFzeW5jQ29tbWFuZFJlc3BvbnNlX0NsZWFySW5jcmVtZW50YWxTdGF0ZShHZXRBc3luY0NvbW1h
bmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGUmJikgbm9leGNlcHQgPSBkZWZhdWx0Owor
R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlJiBHZXRBc3luY0Nv
bW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGU6Om9wZXJhdG9yPShHZXRBc3luY0Nv
bW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGUmJikgPSBkZWZhdWx0OworCitib29s
IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0NsZWFySW5jcmVtZW50YWxTdGF0ZTo6b3BlcmF0b3I9
PShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGUmIG90
aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9m
aWVsZHNfCisgICAmJiBkYXRhX3NvdXJjZV9pZHNfID09IG90aGVyLmRhdGFfc291cmNlX2lkc187
Cit9CisKK2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRl
OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIGRhdGFf
c291cmNlX2lkc18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wg
cGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMo
cmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52
YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwg
X2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7
CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGRhdGFf
c291cmNlX2lkcyAqLzoKKyAgICAgICAgZGF0YV9zb3VyY2VfaWRzXy5lbXBsYWNlX2JhY2soKTsK
KyAgICAgICAgZmllbGQuZ2V0KCZkYXRhX3NvdXJjZV9pZHNfLmJhY2soKSk7CisgICAgICAgIGJy
ZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8o
JnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4g
IXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgR2V0
QXN5bmNDb21tYW5kUmVzcG9uc2VfQ2xlYXJJbmNyZW1lbnRhbFN0YXRlOjpTZXJpYWxpemVBc1N0
cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6
TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJp
YWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZXRBc3luY0NvbW1h
bmRSZXNwb25zZV9DbGVhckluY3JlbWVudGFsU3RhdGU6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25z
dCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1z
ZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJh
eSgpOworfQorCit2b2lkIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0NsZWFySW5jcmVtZW50YWxT
dGF0ZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8g
RmllbGQgMTogZGF0YV9zb3VyY2VfaWRzCisgIGZvciAoYXV0byYgaXQgOiBkYXRhX3NvdXJjZV9p
ZHNfKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgaXQpOworICB9CisKKyAgbXNnLT5BcHBl
bmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5z
aXplKCkpOworfQorCisKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0ZsdXNoOjpHZXRBc3luY0Nv
bW1hbmRSZXNwb25zZV9GbHVzaCgpID0gZGVmYXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNl
X0ZsdXNoOjp+R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2goKSA9IGRlZmF1bHQ7CitHZXRB
c3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaDo6R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2go
Y29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2gmKSA9IGRlZmF1bHQ7CitHZXRBc3lu
Y0NvbW1hbmRSZXNwb25zZV9GbHVzaCYgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2g6Om9w
ZXJhdG9yPShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaCYpID0gZGVmYXVsdDsK
K0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0ZsdXNoOjpHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9G
bHVzaChHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7
CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaCYgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2Vf
Rmx1c2g6Om9wZXJhdG9yPShHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaCYmKSA9IGRlZmF1
bHQ7CisKK2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2g6Om9wZXJhdG9yPT0oY29u
c3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2gmIG90aGVyKSBjb25zdCB7CisgIHJldHVy
biB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBkYXRhX3Nv
dXJjZV9pZHNfID09IG90aGVyLmRhdGFfc291cmNlX2lkc18KKyAgICYmIHJlcXVlc3RfaWRfID09
IG90aGVyLnJlcXVlc3RfaWRfOworfQorCitib29sIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0Zs
dXNoOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIGRh
dGFfc291cmNlX2lkc18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIGRh
dGFfc291cmNlX2lkcyAqLzoKKyAgICAgICAgZGF0YV9zb3VyY2VfaWRzXy5lbXBsYWNlX2JhY2so
KTsKKyAgICAgICAgZmllbGQuZ2V0KCZkYXRhX3NvdXJjZV9pZHNfLmJhY2soKSk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSAyIC8qIHJlcXVlc3RfaWQgKi86CisgICAgICAgIGZpZWxkLmdl
dCgmcmVxdWVzdF9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAg
IGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBi
cmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19s
ZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX0ZsdXNoOjpT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZV9GbHVzaDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsK
KyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOwor
ICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7
Cit9CisKK3ZvaWQgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfRmx1c2g6OlNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGRhdGFfc291cmNl
X2lkcworICBmb3IgKGF1dG8mIGl0IDogZGF0YV9zb3VyY2VfaWRzXykgeworICAgIG1zZy0+QXBw
ZW5kVmFySW50KDEsIGl0KTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IHJlcXVlc3RfaWQKKyAgaWYg
KF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMiwgcmVxdWVzdF9pZF8p
OworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRh
KCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0dldEFzeW5jQ29tbWFuZFJlc3Bv
bnNlX1N0b3BEYXRhU291cmNlOjpHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJj
ZSgpID0gZGVmYXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlOjp+
R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2UoKSA9IGRlZmF1bHQ7CitHZXRB
c3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJjZTo6R2V0QXN5bmNDb21tYW5kUmVzcG9u
c2VfU3RvcERhdGFTb3VyY2UoY29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFT
b3VyY2UmKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJj
ZSYgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2U6Om9wZXJhdG9yPShjb25z
dCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJjZSYpID0gZGVmYXVsdDsKK0dl
dEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlOjpHZXRBc3luY0NvbW1hbmRSZXNw
b25zZV9TdG9wRGF0YVNvdXJjZShHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJj
ZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0
YVNvdXJjZSYgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2U6Om9wZXJhdG9y
PShHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdG9wRGF0YVNvdXJjZSYmKSA9IGRlZmF1bHQ7CisK
K2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2U6Om9wZXJhdG9yPT0o
Y29uc3QgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2UmIG90aGVyKSBjb25z
dCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisg
ICAmJiBpbnN0YW5jZV9pZF8gPT0gb3RoZXIuaW5zdGFuY2VfaWRfOworfQorCitib29sIEdldEFz
eW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlOjpQYXJzZUZyb21BcnJheShjb25zdCB2
b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBi
b29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIg
ZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmll
bGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQo
KSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlk
KCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBp
bnN0YW5jZV9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZpbnN0YW5jZV9pZF8pOworICAgICAg
ICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVu
ZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0
dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5n
IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0b3BEYXRhU291cmNlOjpTZXJpYWxpemVBc1N0cmlu
ZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVz
c2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxp
emVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZXRBc3luY0NvbW1hbmRS
ZXNwb25zZV9TdG9wRGF0YVNvdXJjZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisK
K3ZvaWQgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RvcERhdGFTb3VyY2U6OlNlcmlhbGl6ZSg6
OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGluc3RhbmNl
X2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGlu
c3RhbmNlX2lkXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9m
aWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworR2V0QXN5bmND
b21tYW5kUmVzcG9uc2VfU3RhcnREYXRhU291cmNlOjpHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9T
dGFydERhdGFTb3VyY2UoKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdGFy
dERhdGFTb3VyY2U6On5HZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdGFydERhdGFTb3VyY2UoKSA9
IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TdGFydERhdGFTb3VyY2U6OkdldEFz
eW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZShjb25zdCBHZXRBc3luY0NvbW1hbmRS
ZXNwb25zZV9TdGFydERhdGFTb3VyY2UmKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNw
b25zZV9TdGFydERhdGFTb3VyY2UmIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNv
dXJjZTo6b3BlcmF0b3I9KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNv
dXJjZSYpID0gZGVmYXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJj
ZTo6R2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RhcnREYXRhU291cmNlKEdldEFzeW5jQ29tbWFu
ZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitHZXRBc3lu
Y0NvbW1hbmRSZXNwb25zZV9TdGFydERhdGFTb3VyY2UmIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
X1N0YXJ0RGF0YVNvdXJjZTo6b3BlcmF0b3I9KEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0
RGF0YVNvdXJjZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2Vf
U3RhcnREYXRhU291cmNlOjpvcGVyYXRvcj09KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
X1N0YXJ0RGF0YVNvdXJjZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRz
XyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIG5ld19pbnN0YW5jZV9pZF8gPT0gb3Ro
ZXIubmV3X2luc3RhbmNlX2lkXworICAgJiYgY29uZmlnXyA9PSBvdGhlci5jb25maWdfOworfQor
Citib29sIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJjZTo6UGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18u
Y2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6
UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAg
aWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRf
LnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAg
ICBjYXNlIDEgLyogbmV3X2luc3RhbmNlX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJm5ld19p
bnN0YW5jZV9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBjb25maWcgKi86
CisgICAgICAgICgqY29uZmlnXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmco
KSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFs
aXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0K
KyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKwor
c3RkOjpzdHJpbmcgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU3RhcnREYXRhU291cmNlOjpTZXJp
YWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnBy
b3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJu
IG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZXRB
c3luY0NvbW1hbmRSZXNwb25zZV9TdGFydERhdGFTb3VyY2U6OlNlcmlhbGl6ZUFzQXJyYXkoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNB
cnJheSgpOworfQorCit2b2lkIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1N0YXJ0RGF0YVNvdXJj
ZTo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmll
bGQgMTogbmV3X2luc3RhbmNlX2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+
QXBwZW5kVmFySW50KDEsIG5ld19pbnN0YW5jZV9pZF8pOworICB9CisKKyAgLy8gRmllbGQgMjog
Y29uZmlnCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgICgqY29uZmlnXykuU2VyaWFsaXpl
KG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyKSk7CisgIH0K
KworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5r
bm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0
dXBEYXRhU291cmNlOjpHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2UoKSA9
IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2U6On5HZXRB
c3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2UoKSA9IGRlZmF1bHQ7CitHZXRBc3lu
Y0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3VyY2U6OkdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
X1NldHVwRGF0YVNvdXJjZShjb25zdCBHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFT
b3VyY2UmKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cERhdGFTb3Vy
Y2UmIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZTo6b3BlcmF0b3I9KGNv
bnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZSYpID0gZGVmYXVsdDsK
K0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZTo6R2V0QXN5bmNDb21tYW5k
UmVzcG9uc2VfU2V0dXBEYXRhU291cmNlKEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0
YVNvdXJjZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9T
ZXR1cERhdGFTb3VyY2UmIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZTo6
b3BlcmF0b3I9KEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZSYmKSA9IGRl
ZmF1bHQ7CisKK2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBEYXRhU291cmNlOjpv
cGVyYXRvcj09KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZSYg
b3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3du
X2ZpZWxkc18KKyAgICYmIG5ld19pbnN0YW5jZV9pZF8gPT0gb3RoZXIubmV3X2luc3RhbmNlX2lk
XworICAgJiYgY29uZmlnXyA9PSBvdGhlci5jb25maWdfOworfQorCitib29sIEdldEFzeW5jQ29t
bWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCog
cmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBw
YWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhy
YXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZh
bGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBf
aGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsK
KyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNlIDEgLyogbmV3X2lu
c3RhbmNlX2lkICovOgorICAgICAgICBmaWVsZC5nZXQoJm5ld19pbnN0YW5jZV9pZF8pOworICAg
ICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBjb25maWcgKi86CisgICAgICAgICgqY29uZmln
XykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7CisgICAgICAgIGJyZWFr
OworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVu
a25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBh
Y2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgR2V0QXN5
bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBEYXRhU291cmNlOjpTZXJpYWxpemVBc1N0cmluZygpIGNv
bnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4g
bXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0
cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZXRBc3luY0NvbW1hbmRSZXNwb25z
ZV9TZXR1cERhdGFTb3VyY2U6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96
ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXpl
KG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lk
IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwRGF0YVNvdXJjZTo6U2VyaWFsaXplKDo6cHJv
dG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogbmV3X2luc3RhbmNl
X2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIG5l
d19pbnN0YW5jZV9pZF8pOworICB9CisKKyAgLy8gRmllbGQgMjogY29uZmlnCisgIGlmIChfaGFz
X2ZpZWxkX1syXSkgeworICAgICgqY29uZmlnXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRN
ZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigyKSk7CisgIH0KKworICBtc2ctPkFwcGVuZFJh
d1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUo
KSk7Cit9CisKKworR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBUcmFjaW5nOjpHZXRBc3lu
Y0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmcoKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1h
bmRSZXNwb25zZV9TZXR1cFRyYWNpbmc6On5HZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRy
YWNpbmcoKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmc6
OkdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZyhjb25zdCBHZXRBc3luY0NvbW1h
bmRSZXNwb25zZV9TZXR1cFRyYWNpbmcmKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNw
b25zZV9TZXR1cFRyYWNpbmcmIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZzo6
b3BlcmF0b3I9KGNvbnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZyYpID0g
ZGVmYXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZzo6R2V0QXN5bmND
b21tYW5kUmVzcG9uc2VfU2V0dXBUcmFjaW5nKEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVw
VHJhY2luZyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRSZXNwb25zZV9T
ZXR1cFRyYWNpbmcmIEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZzo6b3BlcmF0
b3I9KEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZyYmKSA9IGRlZmF1bHQ7CisK
K2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBUcmFjaW5nOjpvcGVyYXRvcj09KGNv
bnN0IEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZyYgb3RoZXIpIGNvbnN0IHsK
KyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYm
IHNoYXJlZF9idWZmZXJfcGFnZV9zaXplX2tiXyA9PSBvdGhlci5zaGFyZWRfYnVmZmVyX3BhZ2Vf
c2l6ZV9rYl87Cit9CisKK2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2VfU2V0dXBUcmFjaW5n
OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25v
d25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6
cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVs
ZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxk
KCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAg
X2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlk
KCkpIHsKKyAgICAgIGNhc2UgMSAvKiBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYiAqLzoKKyAg
ICAgICAgZmllbGQuZ2V0KCZzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYl8pOworICAgICAgICBi
cmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRv
KCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJu
ICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEdl
dEFzeW5jQ29tbWFuZFJlc3BvbnNlX1NldHVwVHJhY2luZzo6U2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNT
dHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gR2V0QXN5bmNDb21tYW5kUmVzcG9u
c2VfU2V0dXBUcmFjaW5nOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVy
bzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZSht
c2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZV9TZXR1cFRyYWNpbmc6OlNlcmlhbGl6ZSg6OnByb3RvemVy
bzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IHNoYXJlZF9idWZmZXJfcGFn
ZV9zaXplX2tiCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50
KDEsIHNoYXJlZF9idWZmZXJfcGFnZV9zaXplX2tiXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJh
d1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUo
KSk7Cit9CisKKworR2V0QXN5bmNDb21tYW5kUmVxdWVzdDo6R2V0QXN5bmNDb21tYW5kUmVxdWVz
dCgpID0gZGVmYXVsdDsKK0dldEFzeW5jQ29tbWFuZFJlcXVlc3Q6On5HZXRBc3luY0NvbW1hbmRS
ZXF1ZXN0KCkgPSBkZWZhdWx0OworR2V0QXN5bmNDb21tYW5kUmVxdWVzdDo6R2V0QXN5bmNDb21t
YW5kUmVxdWVzdChjb25zdCBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0JikgPSBkZWZhdWx0OworR2V0
QXN5bmNDb21tYW5kUmVxdWVzdCYgR2V0QXN5bmNDb21tYW5kUmVxdWVzdDo6b3BlcmF0b3I9KGNv
bnN0IEdldEFzeW5jQ29tbWFuZFJlcXVlc3QmKSA9IGRlZmF1bHQ7CitHZXRBc3luY0NvbW1hbmRS
ZXF1ZXN0OjpHZXRBc3luY0NvbW1hbmRSZXF1ZXN0KEdldEFzeW5jQ29tbWFuZFJlcXVlc3QmJikg
bm9leGNlcHQgPSBkZWZhdWx0OworR2V0QXN5bmNDb21tYW5kUmVxdWVzdCYgR2V0QXN5bmNDb21t
YW5kUmVxdWVzdDo6b3BlcmF0b3I9KEdldEFzeW5jQ29tbWFuZFJlcXVlc3QmJikgPSBkZWZhdWx0
OworCitib29sIEdldEFzeW5jQ29tbWFuZFJlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgR2V0QXN5
bmNDb21tYW5kUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRz
XyA9PSBvdGhlci51bmtub3duX2ZpZWxkc187Cit9CisKK2Jvb2wgR2V0QXN5bmNDb21tYW5kUmVx
dWVzdDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1
bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKwor
ICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8g
ZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRG
aWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAg
ICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVs
ZC5pZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBl
bmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJl
dHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmlu
ZyBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAg
Ojpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBT
ZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOwor
fQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0OjpTZXJpYWxp
emVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96
ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNn
LlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBHZXRBc3luY0NvbW1hbmRSZXF1ZXN0OjpT
ZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICBtc2ctPkFwcGVu
ZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNp
emUoKSk7Cit9CisKKworQWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNlOjpBY3RpdmF0ZVRyaWdnZXJz
UmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2U6On5BY3RpdmF0
ZVRyaWdnZXJzUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2U6
OkFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZShjb25zdCBBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2Um
KSA9IGRlZmF1bHQ7CitBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UmIEFjdGl2YXRlVHJpZ2dlcnNS
ZXNwb25zZTo6b3BlcmF0b3I9KGNvbnN0IEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZSYpID0gZGVm
YXVsdDsKK0FjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZTo6QWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNl
KEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitBY3RpdmF0
ZVRyaWdnZXJzUmVzcG9uc2UmIEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZTo6b3BlcmF0b3I9KEFj
dGl2YXRlVHJpZ2dlcnNSZXNwb25zZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQWN0aXZhdGVUcmln
Z2Vyc1Jlc3BvbnNlOjpvcGVyYXRvcj09KGNvbnN0IEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZSYg
b3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3du
X2ZpZWxkc187Cit9CisKK2Jvb2wgQWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNlOjpQYXJzZUZyb21B
cnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5j
bGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQ
cm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFk
RmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBp
ZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8u
c2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAg
IGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2Zp
ZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJy
b3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEFjdGl2YXRlVHJpZ2dl
cnNSZXNwb25zZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpI
ZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5n
ZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0
b3I8dWludDhfdD4gQWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNlOjpTZXJpYWxpemVBc0FycmF5KCkg
Y29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdl
PiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFz
QXJyYXkoKTsKK30KKwordm9pZCBBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2U6OlNlcmlhbGl6ZSg6
OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIG1zZy0+QXBwZW5kUmF3UHJvdG9C
eXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30K
KworCitBY3RpdmF0ZVRyaWdnZXJzUmVxdWVzdDo6QWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QoKSA9
IGRlZmF1bHQ7CitBY3RpdmF0ZVRyaWdnZXJzUmVxdWVzdDo6fkFjdGl2YXRlVHJpZ2dlcnNSZXF1
ZXN0KCkgPSBkZWZhdWx0OworQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3Q6OkFjdGl2YXRlVHJpZ2dl
cnNSZXF1ZXN0KGNvbnN0IEFjdGl2YXRlVHJpZ2dlcnNSZXF1ZXN0JikgPSBkZWZhdWx0OworQWN0
aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmIEFjdGl2YXRlVHJpZ2dlcnNSZXF1ZXN0OjpvcGVyYXRvcj0o
Y29uc3QgQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmKSA9IGRlZmF1bHQ7CitBY3RpdmF0ZVRyaWdn
ZXJzUmVxdWVzdDo6QWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QoQWN0aXZhdGVUcmlnZ2Vyc1JlcXVl
c3QmJikgbm9leGNlcHQgPSBkZWZhdWx0OworQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmIEFjdGl2
YXRlVHJpZ2dlcnNSZXF1ZXN0OjpvcGVyYXRvcj0oQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmJikg
PSBkZWZhdWx0OworCitib29sIEFjdGl2YXRlVHJpZ2dlcnNSZXF1ZXN0OjpvcGVyYXRvcj09KGNv
bnN0IEFjdGl2YXRlVHJpZ2dlcnNSZXF1ZXN0JiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5r
bm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgdHJpZ2dlcl9uYW1l
c18gPT0gb3RoZXIudHJpZ2dlcl9uYW1lc187Cit9CisKK2Jvb2wgQWN0aXZhdGVUcmlnZ2Vyc1Jl
cXVlc3Q6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAg
dHJpZ2dlcl9uYW1lc18uY2xlYXIoKTsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJv
b2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBk
ZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVs
ZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgp
IDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQo
KSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHRy
aWdnZXJfbmFtZXMgKi86CisgICAgICAgIHRyaWdnZXJfbmFtZXNfLmVtcGxhY2VfYmFjaygpOwor
ICAgICAgICBmaWVsZC5nZXQoJnRyaWdnZXJfbmFtZXNfLmJhY2soKSk7CisgICAgICAgIGJyZWFr
OworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVu
a25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBh
Y2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgQWN0aXZh
dGVUcmlnZ2Vyc1JlcXVlc3Q6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0
ZDo6dmVjdG9yPHVpbnQ4X3Q+IEFjdGl2YXRlVHJpZ2dlcnNSZXF1ZXN0OjpTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpN
ZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlh
bGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBBY3RpdmF0ZVRyaWdnZXJzUmVxdWVzdDo6U2VyaWFs
aXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogdHJp
Z2dlcl9uYW1lcworICBmb3IgKGF1dG8mIGl0IDogdHJpZ2dlcl9uYW1lc18pIHsKKyAgICBtc2ct
PkFwcGVuZFN0cmluZygxLCBpdCk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXMo
dW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKwor
Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZTo6Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRS
ZXNwb25zZSgpID0gZGVmYXVsdDsKK05vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2U6On5O
b3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlKCkgPSBkZWZhdWx0OworTm90aWZ5RGF0YVNv
dXJjZVN0b3BwZWRSZXNwb25zZTo6Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZShjb25z
dCBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlJikgPSBkZWZhdWx0OworTm90aWZ5RGF0
YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZTo6
b3BlcmF0b3I9KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2UmKSA9IGRlZmF1
bHQ7CitOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlOjpOb3RpZnlEYXRhU291cmNlU3Rv
cHBlZFJlc3BvbnNlKE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2UmJikgbm9leGNlcHQg
PSBkZWZhdWx0OworTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYgTm90aWZ5RGF0YVNv
dXJjZVN0b3BwZWRSZXNwb25zZTo6b3BlcmF0b3I9KE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVz
cG9uc2UmJikgPSBkZWZhdWx0OworCitib29sIE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9u
c2U6Om9wZXJhdG9yPT0oY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSYgb3Ro
ZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2Zp
ZWxkc187Cit9CisKK2Jvb2wgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZTo6UGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxk
c18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVy
bzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMu
UmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7Cisg
ICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmll
bGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7Cisg
ICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93
bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2Vk
X2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBOb3RpZnlEYXRh
U291cmNlU3RvcHBlZFJlc3BvbnNlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQor
CitzdGQ6OnZlY3Rvcjx1aW50OF90PiBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlOjpT
ZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6
cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1
cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBOb3RpZnlEYXRhU291cmNlU3Rv
cHBlZFJlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qg
eworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5r
bm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1
ZXN0OjpOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3QoKSA9IGRlZmF1bHQ7CitOb3RpZnlE
YXRhU291cmNlU3RvcHBlZFJlcXVlc3Q6On5Ob3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3Qo
KSA9IGRlZmF1bHQ7CitOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3Q6Ok5vdGlmeURhdGFT
b3VyY2VTdG9wcGVkUmVxdWVzdChjb25zdCBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3Qm
KSA9IGRlZmF1bHQ7CitOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3QmIE5vdGlmeURhdGFT
b3VyY2VTdG9wcGVkUmVxdWVzdDo6b3BlcmF0b3I9KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdG9w
cGVkUmVxdWVzdCYpID0gZGVmYXVsdDsKK05vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdDo6
Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1ZXN0KE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVx
dWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVl
c3QmIE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdDo6b3BlcmF0b3I9KE5vdGlmeURhdGFT
b3VyY2VTdG9wcGVkUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgTm90aWZ5RGF0YVNvdXJj
ZVN0b3BwZWRSZXF1ZXN0OjpvcGVyYXRvcj09KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdG9wcGVk
UmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhl
ci51bmtub3duX2ZpZWxkc18KKyAgICYmIGRhdGFfc291cmNlX2lkXyA9PSBvdGhlci5kYXRhX3Nv
dXJjZV9pZF87Cit9CisKK2Jvb2wgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1ZXN0OjpQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmll
bGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96
ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRl
Yy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsK
KyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19m
aWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsK
KyAgICAgIGNhc2UgMSAvKiBkYXRhX3NvdXJjZV9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZk
YXRhX3NvdXJjZV9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAg
IGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBi
cmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19s
ZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdDo6
U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8
Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJl
dHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4g
Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1ZXN0OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qg
eworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7
CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXko
KTsKK30KKwordm9pZCBOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlcXVlc3Q6OlNlcmlhbGl6ZSg6
OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGRhdGFfc291
cmNlX2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEs
IGRhdGFfc291cmNlX2lkXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5r
bm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworTm90
aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZTo6Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNw
b25zZSgpID0gZGVmYXVsdDsKK05vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2U6On5Ob3Rp
ZnlEYXRhU291cmNlU3RhcnRlZFJlc3BvbnNlKCkgPSBkZWZhdWx0OworTm90aWZ5RGF0YVNvdXJj
ZVN0YXJ0ZWRSZXNwb25zZTo6Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZShjb25zdCBO
b3RpZnlEYXRhU291cmNlU3RhcnRlZFJlc3BvbnNlJikgPSBkZWZhdWx0OworTm90aWZ5RGF0YVNv
dXJjZVN0YXJ0ZWRSZXNwb25zZSYgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZTo6b3Bl
cmF0b3I9KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2UmKSA9IGRlZmF1bHQ7
CitOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlc3BvbnNlOjpOb3RpZnlEYXRhU291cmNlU3RhcnRl
ZFJlc3BvbnNlKE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2UmJikgbm9leGNlcHQgPSBk
ZWZhdWx0OworTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZSYgTm90aWZ5RGF0YVNvdXJj
ZVN0YXJ0ZWRSZXNwb25zZTo6b3BlcmF0b3I9KE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9u
c2UmJikgPSBkZWZhdWx0OworCitib29sIE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2U6
Om9wZXJhdG9yPT0oY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZSYgb3RoZXIp
IGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxk
c187Cit9CisKK2Jvb2wgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZTo6UGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18u
Y2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6
UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAg
aWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRf
LnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAg
ICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9m
aWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vy
cm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBOb3RpZnlEYXRhU291
cmNlU3RhcnRlZFJlc3BvbnNlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90
b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxp
emUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitz
dGQ6OnZlY3Rvcjx1aW50OF90PiBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlc3BvbnNlOjpTZXJp
YWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJv
dG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4g
bXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBOb3RpZnlEYXRhU291cmNlU3RhcnRl
ZFJlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qgewor
ICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93
bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0
OjpOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QoKSA9IGRlZmF1bHQ7CitOb3RpZnlEYXRh
U291cmNlU3RhcnRlZFJlcXVlc3Q6On5Ob3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QoKSA9
IGRlZmF1bHQ7CitOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3Q6Ok5vdGlmeURhdGFTb3Vy
Y2VTdGFydGVkUmVxdWVzdChjb25zdCBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QmKSA9
IGRlZmF1bHQ7CitOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QmIE5vdGlmeURhdGFTb3Vy
Y2VTdGFydGVkUmVxdWVzdDo6b3BlcmF0b3I9KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdGFydGVk
UmVxdWVzdCYpID0gZGVmYXVsdDsKK05vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVxdWVzdDo6Tm90
aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0KE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVxdWVz
dCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3Qm
IE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVxdWVzdDo6b3BlcmF0b3I9KE5vdGlmeURhdGFTb3Vy
Y2VTdGFydGVkUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgTm90aWZ5RGF0YVNvdXJjZVN0
YXJ0ZWRSZXF1ZXN0OjpvcGVyYXRvcj09KGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVx
dWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51
bmtub3duX2ZpZWxkc18KKyAgICYmIGRhdGFfc291cmNlX2lkXyA9PSBvdGhlci5kYXRhX3NvdXJj
ZV9pZF87Cit9CisKK2Jvb2wgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0OjpQYXJzZUZy
b21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRz
Xy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJv
OjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5S
ZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAg
ICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVs
ZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAg
ICAgIGNhc2UgMSAvKiBkYXRhX3NvdXJjZV9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZkYXRh
X3NvdXJjZV9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZp
ZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVh
azsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0
KCk7Cit9CisKK3N0ZDo6c3RyaW5nIE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVxdWVzdDo6U2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gTm90
aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgewor
ICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7Cisg
IFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsK
K30KKwordm9pZCBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3Q6OlNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8vIEZpZWxkIDE6IGRhdGFfc291cmNl
X2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIGRh
dGFfc291cmNlX2lkXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93
bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworQ29tbWl0
RGF0YVJlc3BvbnNlOjpDb21taXREYXRhUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitDb21taXREYXRh
UmVzcG9uc2U6On5Db21taXREYXRhUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitDb21taXREYXRhUmVz
cG9uc2U6OkNvbW1pdERhdGFSZXNwb25zZShjb25zdCBDb21taXREYXRhUmVzcG9uc2UmKSA9IGRl
ZmF1bHQ7CitDb21taXREYXRhUmVzcG9uc2UmIENvbW1pdERhdGFSZXNwb25zZTo6b3BlcmF0b3I9
KGNvbnN0IENvbW1pdERhdGFSZXNwb25zZSYpID0gZGVmYXVsdDsKK0NvbW1pdERhdGFSZXNwb25z
ZTo6Q29tbWl0RGF0YVJlc3BvbnNlKENvbW1pdERhdGFSZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRl
ZmF1bHQ7CitDb21taXREYXRhUmVzcG9uc2UmIENvbW1pdERhdGFSZXNwb25zZTo6b3BlcmF0b3I9
KENvbW1pdERhdGFSZXNwb25zZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgQ29tbWl0RGF0YVJlc3Bv
bnNlOjpvcGVyYXRvcj09KGNvbnN0IENvbW1pdERhdGFSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsK
KyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc187Cit9CisK
K2Jvb2wgQ29tbWl0RGF0YVJlc3BvbnNlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcs
IHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tl
ZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywg
c2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQo
KTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNf
ZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAg
IH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZp
ZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVh
azsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0
KCk7Cit9CisKK3N0ZDo6c3RyaW5nIENvbW1pdERhdGFSZXNwb25zZTo6U2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gQ29tbWl0RGF0YVJlc3Bv
bnNlOjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZl
cmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOwor
ICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBDb21taXREYXRhUmVz
cG9uc2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIG1z
Zy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2Zp
ZWxkc18uc2l6ZSgpKTsKK30KKworCitVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZTo6VW5y
ZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitVbnJlZ2lzdGVyVHJhY2VX
cml0ZXJSZXNwb25zZTo6flVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlKCkgPSBkZWZhdWx0
OworVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2U6OlVucmVnaXN0ZXJUcmFjZVdyaXRlclJl
c3BvbnNlKGNvbnN0IFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJikgPSBkZWZhdWx0Owor
VW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmIFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3Bv
bnNlOjpvcGVyYXRvcj0oY29uc3QgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmKSA9IGRl
ZmF1bHQ7CitVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZTo6VW5yZWdpc3RlclRyYWNlV3Jp
dGVyUmVzcG9uc2UoVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmJikgbm9leGNlcHQgPSBk
ZWZhdWx0OworVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmIFVucmVnaXN0ZXJUcmFjZVdy
aXRlclJlc3BvbnNlOjpvcGVyYXRvcj0oVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmJikg
PSBkZWZhdWx0OworCitib29sIFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlOjpvcGVyYXRv
cj09KGNvbnN0IFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJiBvdGhlcikgY29uc3Qgewor
ICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXzsKK30KKwor
Ym9vbCBVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qg
dm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAg
Ym9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVy
IGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZp
ZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlk
KCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5p
ZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBkZWZhdWx0Ogor
ICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMu
Ynl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNw
b25zZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVm
ZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7
CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWlu
dDhfdD4gVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2U6OlNlcmlhbGl6ZUFzQXJyYXkoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNB
cnJheSgpOworfQorCit2b2lkIFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlOjpTZXJpYWxp
emUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1By
b3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7
Cit9CisKKworVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6VW5yZWdpc3RlclRyYWNlV3Jp
dGVyUmVxdWVzdCgpID0gZGVmYXVsdDsKK1VucmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3Q6On5V
bnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0KCkgPSBkZWZhdWx0OworVW5yZWdpc3RlclRyYWNl
V3JpdGVyUmVxdWVzdDo6VW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdChjb25zdCBVbnJlZ2lz
dGVyVHJhY2VXcml0ZXJSZXF1ZXN0JikgPSBkZWZhdWx0OworVW5yZWdpc3RlclRyYWNlV3JpdGVy
UmVxdWVzdCYgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6b3BlcmF0b3I9KGNvbnN0IFVu
cmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmKSA9IGRlZmF1bHQ7CitVbnJlZ2lzdGVyVHJhY2VX
cml0ZXJSZXF1ZXN0OjpVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0KFVucmVnaXN0ZXJUcmFj
ZVdyaXRlclJlcXVlc3QmJikgbm9leGNlcHQgPSBkZWZhdWx0OworVW5yZWdpc3RlclRyYWNlV3Jp
dGVyUmVxdWVzdCYgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6b3BlcmF0b3I9KFVucmVn
aXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmJikgPSBkZWZhdWx0OworCitib29sIFVucmVnaXN0ZXJU
cmFjZVdyaXRlclJlcXVlc3Q6Om9wZXJhdG9yPT0oY29uc3QgVW5yZWdpc3RlclRyYWNlV3JpdGVy
UmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhl
ci51bmtub3duX2ZpZWxkc18KKyAgICYmIHRyYWNlX3dyaXRlcl9pZF8gPT0gb3RoZXIudHJhY2Vf
d3JpdGVyX2lkXzsKK30KKworYm9vbCBVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0OjpQYXJz
ZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmll
bGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96
ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRl
Yy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsK
KyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19m
aWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsK
KyAgICAgIGNhc2UgMSAvKiB0cmFjZV93cml0ZXJfaWQgKi86CisgICAgICAgIGZpZWxkLmdldCgm
dHJhY2Vfd3JpdGVyX2lkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVz
X2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6
U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8
Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJl
dHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4g
VW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsK
KyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOwor
ICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7
Cit9CisKK3ZvaWQgVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6U2VyaWFsaXplKDo6cHJv
dG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogdHJhY2Vfd3JpdGVy
X2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIHRy
YWNlX3dyaXRlcl9pZF8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25v
d25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK1JlZ2lz
dGVyVHJhY2VXcml0ZXJSZXNwb25zZTo6UmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlKCkgPSBk
ZWZhdWx0OworUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlOjp+UmVnaXN0ZXJUcmFjZVdyaXRl
clJlc3BvbnNlKCkgPSBkZWZhdWx0OworUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlOjpSZWdp
c3RlclRyYWNlV3JpdGVyUmVzcG9uc2UoY29uc3QgUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNl
JikgPSBkZWZhdWx0OworUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJiBSZWdpc3RlclRyYWNl
V3JpdGVyUmVzcG9uc2U6Om9wZXJhdG9yPShjb25zdCBSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9u
c2UmKSA9IGRlZmF1bHQ7CitSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2U6OlJlZ2lzdGVyVHJh
Y2VXcml0ZXJSZXNwb25zZShSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmJikgbm9leGNlcHQg
PSBkZWZhdWx0OworUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlJiBSZWdpc3RlclRyYWNlV3Jp
dGVyUmVzcG9uc2U6Om9wZXJhdG9yPShSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmJikgPSBk
ZWZhdWx0OworCitib29sIFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZTo6b3BlcmF0b3I9PShj
b25zdCBSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UmIG90aGVyKSBjb25zdCB7CisgIHJldHVy
biB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfOworfQorCitib29sIFJl
Z2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3
LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNr
ZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcs
IHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlk
KCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFz
X2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAg
ICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBm
aWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVm
dCgpOworfQorCitzdGQ6OnN0cmluZyBSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2U6OlNlcmlh
bGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJv
dG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4g
bXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFJlZ2lz
dGVyVHJhY2VXcml0ZXJSZXNwb25zZTo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisK
K3ZvaWQgUmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86
Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93
bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworUmVnaXN0
ZXJUcmFjZVdyaXRlclJlcXVlc3Q6OlJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0KCkgPSBkZWZh
dWx0OworUmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3Q6On5SZWdpc3RlclRyYWNlV3JpdGVyUmVx
dWVzdCgpID0gZGVmYXVsdDsKK1JlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0OjpSZWdpc3RlclRy
YWNlV3JpdGVyUmVxdWVzdChjb25zdCBSZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCYpID0gZGVm
YXVsdDsKK1JlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiBSZWdpc3RlclRyYWNlV3JpdGVyUmVx
dWVzdDo6b3BlcmF0b3I9KGNvbnN0IFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JikgPSBkZWZh
dWx0OworUmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3Q6OlJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1
ZXN0KFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1Jl
Z2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiBSZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6b3Bl
cmF0b3I9KFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiYpID0gZGVmYXVsdDsKKworYm9vbCBS
ZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdDo6b3BlcmF0b3I9PShjb25zdCBSZWdpc3RlclRyYWNl
V3JpdGVyUmVxdWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9
PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHRyYWNlX3dyaXRlcl9pZF8gPT0gb3RoZXIu
dHJhY2Vfd3JpdGVyX2lkXworICAgJiYgdGFyZ2V0X2J1ZmZlcl8gPT0gb3RoZXIudGFyZ2V0X2J1
ZmZlcl87Cit9CisKK2Jvb2wgUmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3Q6OlBhcnNlRnJvbUFy
cmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNs
ZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlBy
b3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRG
aWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlm
IChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5z
ZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAg
Y2FzZSAxIC8qIHRyYWNlX3dyaXRlcl9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0cmFjZV93
cml0ZXJfaWRfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogdGFyZ2V0X2J1ZmZl
ciAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZ0YXJnZXRfYnVmZmVyXyk7CisgICAgICAgIGJyZWFr
OworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVu
a25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBh
Y2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgUmVnaXN0
ZXJUcmFjZVdyaXRlclJlcXVlc3Q6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnBy
b3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlh
bGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisK
K3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0OjpTZXJpYWxp
emVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96
ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNn
LlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBSZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVz
dDo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmll
bGQgMTogdHJhY2Vfd3JpdGVyX2lkCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+
QXBwZW5kVmFySW50KDEsIHRyYWNlX3dyaXRlcl9pZF8pOworICB9CisKKyAgLy8gRmllbGQgMjog
dGFyZ2V0X2J1ZmZlcgorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVuZFZh
ckludCgyLCB0YXJnZXRfYnVmZmVyXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0
ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisK
KworVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZTo6VW5yZWdpc3RlckRhdGFTb3VyY2VSZXNw
b25zZSgpID0gZGVmYXVsdDsKK1VucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2U6On5VbnJlZ2lz
dGVyRGF0YVNvdXJjZVJlc3BvbnNlKCkgPSBkZWZhdWx0OworVW5yZWdpc3RlckRhdGFTb3VyY2VS
ZXNwb25zZTo6VW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZShjb25zdCBVbnJlZ2lzdGVyRGF0
YVNvdXJjZVJlc3BvbnNlJikgPSBkZWZhdWx0OworVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25z
ZSYgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZTo6b3BlcmF0b3I9KGNvbnN0IFVucmVnaXN0
ZXJEYXRhU291cmNlUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitVbnJlZ2lzdGVyRGF0YVNvdXJjZVJl
c3BvbnNlOjpVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlKFVucmVnaXN0ZXJEYXRhU291cmNl
UmVzcG9uc2UmJikgbm9leGNlcHQgPSBkZWZhdWx0OworVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNw
b25zZSYgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZTo6b3BlcmF0b3I9KFVucmVnaXN0ZXJE
YXRhU291cmNlUmVzcG9uc2UmJikgPSBkZWZhdWx0OworCitib29sIFVucmVnaXN0ZXJEYXRhU291
cmNlUmVzcG9uc2U6Om9wZXJhdG9yPT0oY29uc3QgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25z
ZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtu
b3duX2ZpZWxkc187Cit9CisKK2Jvb2wgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZTo6UGFy
c2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2Zp
ZWxkc18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3Rv
emVybzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBk
ZWMuUmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7
CisgICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNf
ZmllbGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7
CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5r
bm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFj
a2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBVbnJlZ2lz
dGVyRGF0YVNvdXJjZVJlc3BvbnNlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpw
cm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJp
YWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQor
CitzdGQ6OnZlY3Rvcjx1aW50OF90PiBVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlOjpTZXJp
YWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJv
dG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4g
bXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBVbnJlZ2lzdGVyRGF0YVNvdXJjZVJl
c3BvbnNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICBt
c2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9m
aWVsZHNfLnNpemUoKSk7Cit9CisKKworVW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0OjpVbnJl
Z2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QoKSA9IGRlZmF1bHQ7CitVbnJlZ2lzdGVyRGF0YVNvdXJj
ZVJlcXVlc3Q6On5VbnJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QoKSA9IGRlZmF1bHQ7CitVbnJl
Z2lzdGVyRGF0YVNvdXJjZVJlcXVlc3Q6OlVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdChjb25z
dCBVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QmKSA9IGRlZmF1bHQ7CitVbnJlZ2lzdGVyRGF0
YVNvdXJjZVJlcXVlc3QmIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDo6b3BlcmF0b3I9KGNv
bnN0IFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYpID0gZGVmYXVsdDsKK1VucmVnaXN0ZXJE
YXRhU291cmNlUmVxdWVzdDo6VW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0KFVucmVnaXN0ZXJE
YXRhU291cmNlUmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitVbnJlZ2lzdGVyRGF0YVNv
dXJjZVJlcXVlc3QmIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDo6b3BlcmF0b3I9KFVucmVn
aXN0ZXJEYXRhU291cmNlUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgVW5yZWdpc3RlckRh
dGFTb3VyY2VSZXF1ZXN0OjpvcGVyYXRvcj09KGNvbnN0IFVucmVnaXN0ZXJEYXRhU291cmNlUmVx
dWVzdCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51
bmtub3duX2ZpZWxkc18KKyAgICYmIGRhdGFfc291cmNlX25hbWVfID09IG90aGVyLmRhdGFfc291
cmNlX25hbWVfOworfQorCitib29sIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDo6UGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxk
c18uY2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVy
bzo6UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMu
UmVhZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7Cisg
ICAgaWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmll
bGRfLnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7Cisg
ICAgICBjYXNlIDEgLyogZGF0YV9zb3VyY2VfbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZk
YXRhX3NvdXJjZV9uYW1lXyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVz
X2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0OjpT
ZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6
OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0
dXJuIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBV
bnJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3Q6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7Cisg
IDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAg
U2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOwor
fQorCit2b2lkIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDo6U2VyaWFsaXplKDo6cHJvdG96
ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogZGF0YV9zb3VyY2VfbmFt
ZQorICBpZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFN0cmluZygxLCBkYXRh
X3NvdXJjZV9uYW1lXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93
bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworUmVnaXN0
ZXJEYXRhU291cmNlUmVzcG9uc2U6OlJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlKCkgPSBkZWZh
dWx0OworUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2U6On5SZWdpc3RlckRhdGFTb3VyY2VSZXNw
b25zZSgpID0gZGVmYXVsdDsKK1JlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlOjpSZWdpc3RlckRh
dGFTb3VyY2VSZXNwb25zZShjb25zdCBSZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZSYpID0gZGVm
YXVsdDsKK1JlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJiBSZWdpc3RlckRhdGFTb3VyY2VSZXNw
b25zZTo6b3BlcmF0b3I9KGNvbnN0IFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJikgPSBkZWZh
dWx0OworUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2U6OlJlZ2lzdGVyRGF0YVNvdXJjZVJlc3Bv
bnNlKFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK1Jl
Z2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJiBSZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZTo6b3Bl
cmF0b3I9KFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlJiYpID0gZGVmYXVsdDsKKworYm9vbCBS
ZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZTo6b3BlcmF0b3I9PShjb25zdCBSZWdpc3RlckRhdGFT
b3VyY2VSZXNwb25zZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9
PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIGVycm9yXyA9PSBvdGhlci5lcnJvcl87Cit9
CisKK2Jvb2wgUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2U6OlBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7Cisg
IGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2Rl
ciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBm
aWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5p
ZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQu
aWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8q
IGVycm9yICovOgorICAgICAgICBmaWVsZC5nZXQoJmVycm9yXyk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBwZW5kVG8oJnVua25v
d25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gIXBhY2tl
ZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJpbmcgUmVnaXN0ZXJE
YXRhU291cmNlUmVzcG9uc2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3Rv
emVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6
ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0
ZDo6dmVjdG9yPHVpbnQ4X3Q+IFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlOjpTZXJpYWxpemVB
c0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNl
cmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBSZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZTo6
U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQg
MTogZXJyb3IKKyAgaWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmco
MSwgZXJyb3JfKTsKKyAgfQorCisgIG1zZy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2Zp
ZWxkc18uZGF0YSgpLCB1bmtub3duX2ZpZWxkc18uc2l6ZSgpKTsKK30KKworCitSZWdpc3RlckRh
dGFTb3VyY2VSZXF1ZXN0OjpSZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0KCkgPSBkZWZhdWx0Owor
UmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDo6flJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QoKSA9
IGRlZmF1bHQ7CitSZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0OjpSZWdpc3RlckRhdGFTb3VyY2VS
ZXF1ZXN0KGNvbnN0IFJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QmKSA9IGRlZmF1bHQ7CitSZWdp
c3RlckRhdGFTb3VyY2VSZXF1ZXN0JiBSZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0OjpvcGVyYXRv
cj0oY29uc3QgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYpID0gZGVmYXVsdDsKK1JlZ2lzdGVy
RGF0YVNvdXJjZVJlcXVlc3Q6OlJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QoUmVnaXN0ZXJEYXRh
U291cmNlUmVxdWVzdCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitSZWdpc3RlckRhdGFTb3VyY2VS
ZXF1ZXN0JiBSZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0OjpvcGVyYXRvcj0oUmVnaXN0ZXJEYXRh
U291cmNlUmVxdWVzdCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgUmVnaXN0ZXJEYXRhU291cmNlUmVx
dWVzdDo6b3BlcmF0b3I9PShjb25zdCBSZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0JiBvdGhlcikg
Y29uc3QgeworICByZXR1cm4gdW5rbm93bl9maWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRz
XworICAgJiYgZGF0YV9zb3VyY2VfZGVzY3JpcHRvcl8gPT0gb3RoZXIuZGF0YV9zb3VyY2VfZGVz
Y3JpcHRvcl87Cit9CisKK2Jvb2wgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDo6UGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18u
Y2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6
UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAg
aWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRf
LnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAg
ICBjYXNlIDEgLyogZGF0YV9zb3VyY2VfZGVzY3JpcHRvciAqLzoKKyAgICAgICAgKCpkYXRhX3Nv
dXJjZV9kZXNjcmlwdG9yXykuUGFyc2VGcm9tU3RyaW5nKGZpZWxkLmFzX3N0ZF9zdHJpbmcoKSk7
CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXpl
QW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAg
fQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3Rk
OjpzdHJpbmcgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdDo6U2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNT
dHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gUmVnaXN0ZXJEYXRhU291cmNlUmVx
dWVzdDo6U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZm
ZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsK
KyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0FycmF5KCk7Cit9CisKK3ZvaWQgUmVnaXN0ZXJEYXRh
U291cmNlUmVxdWVzdDo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0
IHsKKyAgLy8gRmllbGQgMTogZGF0YV9zb3VyY2VfZGVzY3JpcHRvcgorICBpZiAoX2hhc19maWVs
ZF9bMV0pIHsKKyAgICAoKmRhdGFfc291cmNlX2Rlc2NyaXB0b3JfKS5TZXJpYWxpemUobXNnLT5C
ZWdpbk5lc3RlZE1lc3NhZ2U8Ojpwcm90b3plcm86Ok1lc3NhZ2U+KDEpKTsKKyAgfQorCisgIG1z
Zy0+QXBwZW5kUmF3UHJvdG9CeXRlcyh1bmtub3duX2ZpZWxkc18uZGF0YSgpLCB1bmtub3duX2Zp
ZWxkc18uc2l6ZSgpKTsKK30KKworCitJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlOjpJbml0
aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlKCkgPSBkZWZhdWx0OworSW5pdGlhbGl6ZUNvbm5lY3Rp
b25SZXNwb25zZTo6fkluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2UoKSA9IGRlZmF1bHQ7CitJ
bml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlOjpJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNl
KGNvbnN0IEluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2UmKSA9IGRlZmF1bHQ7CitJbml0aWFs
aXplQ29ubmVjdGlvblJlc3BvbnNlJiBJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlOjpvcGVy
YXRvcj0oY29uc3QgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZSYpID0gZGVmYXVsdDsKK0lu
aXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2U6OkluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2Uo
SW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitJbml0
aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlJiBJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlOjpv
cGVyYXRvcj0oSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZSYmKSA9IGRlZmF1bHQ7CisKK2Jv
b2wgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZTo6b3BlcmF0b3I9PShjb25zdCBJbml0aWFs
aXplQ29ubmVjdGlvblJlc3BvbnNlJiBvdGhlcikgY29uc3QgeworICByZXR1cm4gdW5rbm93bl9m
aWVsZHNfID09IG90aGVyLnVua25vd25fZmllbGRzXworICAgJiYgdXNpbmdfc2htZW1fcHJvdmlk
ZWRfYnlfcHJvZHVjZXJfID09IG90aGVyLnVzaW5nX3NobWVtX3Byb3ZpZGVkX2J5X3Byb2R1Y2Vy
XzsKK30KKworYm9vbCBJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlOjpQYXJzZUZyb21BcnJh
eShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25vd25fZmllbGRzXy5jbGVh
cigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6cHJvdG96ZXJvOjpQcm90
b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxkKCkpIHsKKyAgICBpZiAo
ZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAgX2hhc19maWVsZF8uc2V0
KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlkKCkpIHsKKyAgICAgIGNh
c2UgMSAvKiB1c2luZ19zaG1lbV9wcm92aWRlZF9ieV9wcm9kdWNlciAqLzoKKyAgICAgICAgZmll
bGQuZ2V0KCZ1c2luZ19zaG1lbV9wcm92aWRlZF9ieV9wcm9kdWNlcl8pOworICAgICAgICBicmVh
azsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlhbGl6ZUFuZEFwcGVuZFRvKCZ1
bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFw
YWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisKK3N0ZDo6c3RyaW5nIEluaXRp
YWxpemVDb25uZWN0aW9uUmVzcG9uc2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6
OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNl
cmlhbGl6ZShtc2cuZ2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9
CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2U6OlNl
cmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpw
cm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVy
biBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEluaXRpYWxpemVDb25uZWN0aW9u
UmVzcG9uc2U6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7Cisg
IC8vIEZpZWxkIDE6IHVzaW5nX3NobWVtX3Byb3ZpZGVkX2J5X3Byb2R1Y2VyCisgIGlmIChfaGFz
X2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgxLCB1c2luZ19zaG1lbV9w
cm92aWRlZF9ieV9wcm9kdWNlcl8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVz
KHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisK
K0luaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdDo6SW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0
KCkgPSBkZWZhdWx0OworSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0Ojp+SW5pdGlhbGl6ZUNv
bm5lY3Rpb25SZXF1ZXN0KCkgPSBkZWZhdWx0OworSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0
OjpJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3QoY29uc3QgSW5pdGlhbGl6ZUNvbm5lY3Rpb25S
ZXF1ZXN0JikgPSBkZWZhdWx0OworSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0JiBJbml0aWFs
aXplQ29ubmVjdGlvblJlcXVlc3Q6Om9wZXJhdG9yPShjb25zdCBJbml0aWFsaXplQ29ubmVjdGlv
blJlcXVlc3QmKSA9IGRlZmF1bHQ7CitJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3Q6OkluaXRp
YWxpemVDb25uZWN0aW9uUmVxdWVzdChJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3QmJikgbm9l
eGNlcHQgPSBkZWZhdWx0OworSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0JiBJbml0aWFsaXpl
Q29ubmVjdGlvblJlcXVlc3Q6Om9wZXJhdG9yPShJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3Qm
JikgPSBkZWZhdWx0OworCitib29sIEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdDo6b3BlcmF0
b3I9PShjb25zdCBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3QmIG90aGVyKSBjb25zdCB7Cisg
IHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBz
aGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzXyA9PSBvdGhlci5zaGFyZWRfbWVtb3J5
X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzXworICAgJiYgc2hhcmVkX21lbW9yeV9zaXplX2hpbnRfYnl0
ZXNfID09IG90aGVyLnNoYXJlZF9tZW1vcnlfc2l6ZV9oaW50X2J5dGVzXworICAgJiYgcHJvZHVj
ZXJfbmFtZV8gPT0gb3RoZXIucHJvZHVjZXJfbmFtZV8KKyAgICYmIHNtYl9zY3JhcGluZ19tb2Rl
XyA9PSBvdGhlci5zbWJfc2NyYXBpbmdfbW9kZV8KKyAgICYmIGJ1aWxkX2ZsYWdzXyA9PSBvdGhl
ci5idWlsZF9mbGFnc18KKyAgICYmIHByb2R1Y2VyX3Byb3ZpZGVkX3NobWVtXyA9PSBvdGhlci5w
cm9kdWNlcl9wcm92aWRlZF9zaG1lbV87Cit9CisKK2Jvb2wgSW5pdGlhbGl6ZUNvbm5lY3Rpb25S
ZXF1ZXN0OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7Cisg
IHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOwor
CisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0
byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgewor
ICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZp
ZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBzaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50
X2J5dGVzICovOgorICAgICAgICBmaWVsZC5nZXQoJnNoYXJlZF9tZW1vcnlfcGFnZV9zaXplX2hp
bnRfYnl0ZXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogc2hhcmVkX21lbW9y
eV9zaXplX2hpbnRfYnl0ZXMgKi86CisgICAgICAgIGZpZWxkLmdldCgmc2hhcmVkX21lbW9yeV9z
aXplX2hpbnRfYnl0ZXNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMgLyogcHJvZHVj
ZXJfbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZwcm9kdWNlcl9uYW1lXyk7CisgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSA0IC8qIHNtYl9zY3JhcGluZ19tb2RlICovOgorICAgICAgICBm
aWVsZC5nZXQoJnNtYl9zY3JhcGluZ19tb2RlXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2Fz
ZSA1IC8qIGJ1aWxkX2ZsYWdzICovOgorICAgICAgICBmaWVsZC5nZXQoJmJ1aWxkX2ZsYWdzXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2IC8qIHByb2R1Y2VyX3Byb3ZpZGVkX3NobWVt
ICovOgorICAgICAgICBmaWVsZC5nZXQoJnByb2R1Y2VyX3Byb3ZpZGVkX3NobWVtXyk7CisgICAg
ICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXplQW5kQXBw
ZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBy
ZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3RkOjpzdHJp
bmcgSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0OjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0
IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4gbXNn
OworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc1N0cmlu
ZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBJbml0aWFsaXplQ29ubmVjdGlvblJlcXVl
c3Q6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVy
ZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7Cisg
IHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIEluaXRpYWxpemVDb25u
ZWN0aW9uUmVxdWVzdDo6U2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0
IHsKKyAgLy8gRmllbGQgMTogc2hhcmVkX21lbW9yeV9wYWdlX3NpemVfaGludF9ieXRlcworICBp
ZiAoX2hhc19maWVsZF9bMV0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgxLCBzaGFyZWRfbWVt
b3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzXyk7CisgIH0KKworICAvLyBGaWVsZCAyOiBzaGFyZWRf
bWVtb3J5X3NpemVfaGludF9ieXRlcworICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCgyLCBzaGFyZWRfbWVtb3J5X3NpemVfaGludF9ieXRlc18pOworICB9CisK
KyAgLy8gRmllbGQgMzogcHJvZHVjZXJfbmFtZQorICBpZiAoX2hhc19maWVsZF9bM10pIHsKKyAg
ICBtc2ctPkFwcGVuZFN0cmluZygzLCBwcm9kdWNlcl9uYW1lXyk7CisgIH0KKworICAvLyBGaWVs
ZCA0OiBzbWJfc2NyYXBpbmdfbW9kZQorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ct
PkFwcGVuZFZhckludCg0LCBzbWJfc2NyYXBpbmdfbW9kZV8pOworICB9CisKKyAgLy8gRmllbGQg
NTogYnVpbGRfZmxhZ3MKKyAgaWYgKF9oYXNfZmllbGRfWzVdKSB7CisgICAgbXNnLT5BcHBlbmRW
YXJJbnQoNSwgYnVpbGRfZmxhZ3NfKTsKKyAgfQorCisgIC8vIEZpZWxkIDY6IHByb2R1Y2VyX3By
b3ZpZGVkX3NobWVtCisgIGlmIChfaGFzX2ZpZWxkX1s2XSkgeworICAgIG1zZy0+QXBwZW5kVGlu
eVZhckludCg2LCBwcm9kdWNlcl9wcm92aWRlZF9zaG1lbV8pOworICB9CisKKyAgbXNnLT5BcHBl
bmRSYXdQcm90b0J5dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5z
aXplKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBw
cm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBnZW4vcHJvdG9zL3BlcmZldHRvL2lwYy93
aXJlX3Byb3RvY29sLmdlbi5jYworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2Vu
L3Byb3Rvcy9wZXJmZXR0by9pcGMvd2lyZV9wcm90b2NvbC5nZW4uaAorLy8gRE8gTk9UIEVESVQu
IEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRlZiBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0lQQ19XSVJFX1BST1RPQ09MX1BST1RPX0NQUF9IXwor
I2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0lQQ19XSVJFX1BST1RPQ09M
X1BST1RPX0NQUF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0c2V0Pgor
I2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFp
dHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9jcHBfbWVzc2FnZV9vYmouaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb3B5YWJsZV9wdHIuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25h
bWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4gewor
Y2xhc3MgSVBDRnJhbWU7CitjbGFzcyBJUENGcmFtZV9SZXF1ZXN0RXJyb3I7CitjbGFzcyBJUENG
cmFtZV9JbnZva2VNZXRob2RSZXBseTsKK2NsYXNzIElQQ0ZyYW1lX0ludm9rZU1ldGhvZDsKK2Ns
YXNzIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHk7CitjbGFzcyBJUENGcmFtZV9CaW5kU2Vydmlj
ZVJlcGx5X01ldGhvZEluZm87CitjbGFzcyBJUENGcmFtZV9CaW5kU2VydmljZTsKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNl
IGdlbgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1l
c3BhY2UgcHJvdG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9z
IHsKK25hbWVzcGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgSVBDRnJhbWUgOiBw
dWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgQmlu
ZFNlcnZpY2UgPSBJUENGcmFtZV9CaW5kU2VydmljZTsKKyAgdXNpbmcgQmluZFNlcnZpY2VSZXBs
eSA9IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHk7CisgIHVzaW5nIEludm9rZU1ldGhvZCA9IElQ
Q0ZyYW1lX0ludm9rZU1ldGhvZDsKKyAgdXNpbmcgSW52b2tlTWV0aG9kUmVwbHkgPSBJUENGcmFt
ZV9JbnZva2VNZXRob2RSZXBseTsKKyAgdXNpbmcgUmVxdWVzdEVycm9yID0gSVBDRnJhbWVfUmVx
dWVzdEVycm9yOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1JlcXVlc3RJZEZpZWxkTnVt
YmVyID0gMiwKKyAgICBrTXNnQmluZFNlcnZpY2VGaWVsZE51bWJlciA9IDMsCisgICAga01zZ0Jp
bmRTZXJ2aWNlUmVwbHlGaWVsZE51bWJlciA9IDQsCisgICAga01zZ0ludm9rZU1ldGhvZEZpZWxk
TnVtYmVyID0gNSwKKyAgICBrTXNnSW52b2tlTWV0aG9kUmVwbHlGaWVsZE51bWJlciA9IDYsCisg
ICAga01zZ1JlcXVlc3RFcnJvckZpZWxkTnVtYmVyID0gNywKKyAgICBrRGF0YUZvclRlc3RpbmdG
aWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgSVBDRnJhbWUoKTsKKyAgfklQQ0ZyYW1lKCkgb3Zl
cnJpZGU7CisgIElQQ0ZyYW1lKElQQ0ZyYW1lJiYpIG5vZXhjZXB0OworICBJUENGcmFtZSYgb3Bl
cmF0b3I9KElQQ0ZyYW1lJiYpOworICBJUENGcmFtZShjb25zdCBJUENGcmFtZSYpOworICBJUENG
cmFtZSYgb3BlcmF0b3I9KGNvbnN0IElQQ0ZyYW1lJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBJUENGcmFtZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgSVBDRnJhbWUmIG90
aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19yZXF1ZXN0X2lkKCkgY29u
c3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgdWludDY0X3QgcmVxdWVzdF9pZCgpIGNv
bnN0IHsgcmV0dXJuIHJlcXVlc3RfaWRfOyB9CisgIHZvaWQgc2V0X3JlcXVlc3RfaWQodWludDY0
X3QgdmFsdWUpIHsgcmVxdWVzdF9pZF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDIpOyB9CisK
KyAgYm9vbCBoYXNfbXNnX2JpbmRfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRf
WzNdOyB9CisgIGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlJiBtc2dfYmluZF9zZXJ2aWNlKCkg
Y29uc3QgeyByZXR1cm4gKm1zZ19iaW5kX3NlcnZpY2VfOyB9CisgIElQQ0ZyYW1lX0JpbmRTZXJ2
aWNlKiBtdXRhYmxlX21zZ19iaW5kX3NlcnZpY2UoKSB7IF9oYXNfZmllbGRfLnNldCgzKTsgcmV0
dXJuIG1zZ19iaW5kX3NlcnZpY2VfLmdldCgpOyB9CisKKyAgYm9vbCBoYXNfbXNnX2JpbmRfc2Vy
dmljZV9yZXBseSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIGNvbnN0IElQ
Q0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHkmIG1zZ19iaW5kX3NlcnZpY2VfcmVwbHkoKSBjb25zdCB7
IHJldHVybiAqbXNnX2JpbmRfc2VydmljZV9yZXBseV87IH0KKyAgSVBDRnJhbWVfQmluZFNlcnZp
Y2VSZXBseSogbXV0YWJsZV9tc2dfYmluZF9zZXJ2aWNlX3JlcGx5KCkgeyBfaGFzX2ZpZWxkXy5z
ZXQoNCk7IHJldHVybiBtc2dfYmluZF9zZXJ2aWNlX3JlcGx5Xy5nZXQoKTsgfQorCisgIGJvb2wg
aGFzX21zZ19pbnZva2VfbWV0aG9kKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07IH0K
KyAgY29uc3QgSVBDRnJhbWVfSW52b2tlTWV0aG9kJiBtc2dfaW52b2tlX21ldGhvZCgpIGNvbnN0
IHsgcmV0dXJuICptc2dfaW52b2tlX21ldGhvZF87IH0KKyAgSVBDRnJhbWVfSW52b2tlTWV0aG9k
KiBtdXRhYmxlX21zZ19pbnZva2VfbWV0aG9kKCkgeyBfaGFzX2ZpZWxkXy5zZXQoNSk7IHJldHVy
biBtc2dfaW52b2tlX21ldGhvZF8uZ2V0KCk7IH0KKworICBib29sIGhhc19tc2dfaW52b2tlX21l
dGhvZF9yZXBseSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzZdOyB9CisgIGNvbnN0IElQ
Q0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5JiBtc2dfaW52b2tlX21ldGhvZF9yZXBseSgpIGNvbnN0
IHsgcmV0dXJuICptc2dfaW52b2tlX21ldGhvZF9yZXBseV87IH0KKyAgSVBDRnJhbWVfSW52b2tl
TWV0aG9kUmVwbHkqIG11dGFibGVfbXNnX2ludm9rZV9tZXRob2RfcmVwbHkoKSB7IF9oYXNfZmll
bGRfLnNldCg2KTsgcmV0dXJuIG1zZ19pbnZva2VfbWV0aG9kX3JlcGx5Xy5nZXQoKTsgfQorCisg
IGJvb2wgaGFzX21zZ19yZXF1ZXN0X2Vycm9yKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9b
N107IH0KKyAgY29uc3QgSVBDRnJhbWVfUmVxdWVzdEVycm9yJiBtc2dfcmVxdWVzdF9lcnJvcigp
IGNvbnN0IHsgcmV0dXJuICptc2dfcmVxdWVzdF9lcnJvcl87IH0KKyAgSVBDRnJhbWVfUmVxdWVz
dEVycm9yKiBtdXRhYmxlX21zZ19yZXF1ZXN0X2Vycm9yKCkgeyBfaGFzX2ZpZWxkXy5zZXQoNyk7
IHJldHVybiBtc2dfcmVxdWVzdF9lcnJvcl8uZ2V0KCk7IH0KKworICBpbnQgZGF0YV9mb3JfdGVz
dGluZ19zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkYXRhX2Zvcl90ZXN0
aW5nXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGF0YV9m
b3JfdGVzdGluZygpIGNvbnN0IHsgcmV0dXJuIGRhdGFfZm9yX3Rlc3RpbmdfOyB9CisgIHN0ZDo6
dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJsZV9kYXRhX2Zvcl90ZXN0aW5nKCkgeyByZXR1cm4g
JmRhdGFfZm9yX3Rlc3RpbmdfOyB9CisgIHZvaWQgY2xlYXJfZGF0YV9mb3JfdGVzdGluZygpIHsg
ZGF0YV9mb3JfdGVzdGluZ18uY2xlYXIoKTsgfQorICB2b2lkIGFkZF9kYXRhX2Zvcl90ZXN0aW5n
KHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGRhdGFfZm9yX3Rlc3RpbmdfLmVtcGxhY2VfYmFjayh2YWx1
ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9kYXRhX2Zvcl90ZXN0aW5nKCkgeyBkYXRhX2Zvcl90
ZXN0aW5nXy5lbXBsYWNlX2JhY2soKTsgcmV0dXJuICZkYXRhX2Zvcl90ZXN0aW5nXy5iYWNrKCk7
IH0KKworIHByaXZhdGU6CisgIHVpbnQ2NF90IHJlcXVlc3RfaWRfe307CisgIDo6cHJvdG96ZXJv
OjpDb3B5YWJsZVB0cjxJUENGcmFtZV9CaW5kU2VydmljZT4gbXNnX2JpbmRfc2VydmljZV87Cisg
IDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5PiBtc2df
YmluZF9zZXJ2aWNlX3JlcGx5XzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPElQQ0ZyYW1l
X0ludm9rZU1ldGhvZD4gbXNnX2ludm9rZV9tZXRob2RfOworICA6OnByb3RvemVybzo6Q29weWFi
bGVQdHI8SVBDRnJhbWVfSW52b2tlTWV0aG9kUmVwbHk+IG1zZ19pbnZva2VfbWV0aG9kX3JlcGx5
XzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPElQQ0ZyYW1lX1JlcXVlc3RFcnJvcj4gbXNn
X3JlcXVlc3RfZXJyb3JfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGF0YV9mb3JfdGVz
dGluZ187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRz
IGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBm
aWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDg+
IF9oYXNfZmllbGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBJUENGcmFtZV9S
ZXF1ZXN0RXJyb3IgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtFcnJvckZpZWxkTnVtYmVyID0gMSwKKyAg
fTsKKworICBJUENGcmFtZV9SZXF1ZXN0RXJyb3IoKTsKKyAgfklQQ0ZyYW1lX1JlcXVlc3RFcnJv
cigpIG92ZXJyaWRlOworICBJUENGcmFtZV9SZXF1ZXN0RXJyb3IoSVBDRnJhbWVfUmVxdWVzdEVy
cm9yJiYpIG5vZXhjZXB0OworICBJUENGcmFtZV9SZXF1ZXN0RXJyb3ImIG9wZXJhdG9yPShJUENG
cmFtZV9SZXF1ZXN0RXJyb3ImJik7CisgIElQQ0ZyYW1lX1JlcXVlc3RFcnJvcihjb25zdCBJUENG
cmFtZV9SZXF1ZXN0RXJyb3ImKTsKKyAgSVBDRnJhbWVfUmVxdWVzdEVycm9yJiBvcGVyYXRvcj0o
Y29uc3QgSVBDRnJhbWVfUmVxdWVzdEVycm9yJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJ
UENGcmFtZV9SZXF1ZXN0RXJyb3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElQ
Q0ZyYW1lX1JlcXVlc3RFcnJvciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3Ro
ZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVy
cmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsK
KyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRl
OworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJv
b2wgaGFzX2Vycm9yKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qg
c3RkOjpzdHJpbmcmIGVycm9yKCkgY29uc3QgeyByZXR1cm4gZXJyb3JfOyB9CisgIHZvaWQgc2V0
X2Vycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBlcnJvcl8gPSB2YWx1ZTsgX2hhc19m
aWVsZF8uc2V0KDEpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBlcnJvcl97fTsKKwor
ICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBh
dGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBz
dGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVs
ZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIElQQ0ZyYW1lX0ludm9rZU1ldGhv
ZFJlcGx5IDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6Cisg
IGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrU3VjY2Vzc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBr
SGFzTW9yZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrUmVwbHlQcm90b0ZpZWxkTnVtYmVyID0gMywK
KyAgfTsKKworICBJUENGcmFtZV9JbnZva2VNZXRob2RSZXBseSgpOworICB+SVBDRnJhbWVfSW52
b2tlTWV0aG9kUmVwbHkoKSBvdmVycmlkZTsKKyAgSVBDRnJhbWVfSW52b2tlTWV0aG9kUmVwbHko
SVBDRnJhbWVfSW52b2tlTWV0aG9kUmVwbHkmJikgbm9leGNlcHQ7CisgIElQQ0ZyYW1lX0ludm9r
ZU1ldGhvZFJlcGx5JiBvcGVyYXRvcj0oSVBDRnJhbWVfSW52b2tlTWV0aG9kUmVwbHkmJik7Cisg
IElQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5KGNvbnN0IElQQ0ZyYW1lX0ludm9rZU1ldGhvZFJl
cGx5Jik7CisgIElQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5JiBvcGVyYXRvcj0oY29uc3QgSVBD
RnJhbWVfSW52b2tlTWV0aG9kUmVwbHkmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IElQQ0Zy
YW1lX0ludm9rZU1ldGhvZFJlcGx5JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJ
UENGcmFtZV9JbnZva2VNZXRob2RSZXBseSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMg
PT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90
KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVy
cmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92
ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0Owor
CisgIGJvb2wgaGFzX3N1Y2Nlc3MoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQor
ICBib29sIHN1Y2Nlc3MoKSBjb25zdCB7IHJldHVybiBzdWNjZXNzXzsgfQorICB2b2lkIHNldF9z
dWNjZXNzKGJvb2wgdmFsdWUpIHsgc3VjY2Vzc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEp
OyB9CisKKyAgYm9vbCBoYXNfaGFzX21vcmUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sy
XTsgfQorICBib29sIGhhc19tb3JlKCkgY29uc3QgeyByZXR1cm4gaGFzX21vcmVfOyB9CisgIHZv
aWQgc2V0X2hhc19tb3JlKGJvb2wgdmFsdWUpIHsgaGFzX21vcmVfID0gdmFsdWU7IF9oYXNfZmll
bGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX3JlcGx5X3Byb3RvKCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bM107IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlcGx5X3Byb3RvKCkgY29u
c3QgeyByZXR1cm4gcmVwbHlfcHJvdG9fOyB9CisgIHZvaWQgc2V0X3JlcGx5X3Byb3RvKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyByZXBseV9wcm90b18gPSB2YWx1ZTsgX2hhc19maWVsZF8u
c2V0KDMpOyB9CisgIHZvaWQgc2V0X3JlcGx5X3Byb3RvKGNvbnN0IHZvaWQqIHAsIHNpemVfdCBz
KSB7IHJlcGx5X3Byb3RvXy5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocCks
IHMpOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworIHByaXZhdGU6CisgIGJvb2wgc3VjY2Vzc197
fTsKKyAgYm9vbCBoYXNfbW9yZV97fTsKKyAgc3RkOjpzdHJpbmcgcmVwbHlfcHJvdG9fe307CisK
KyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21w
YXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAg
c3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDQ+IF9oYXNfZmll
bGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBJUENGcmFtZV9JbnZva2VNZXRo
b2QgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51
bSBGaWVsZE51bWJlcnMgeworICAgIGtTZXJ2aWNlSWRGaWVsZE51bWJlciA9IDEsCisgICAga01l
dGhvZElkRmllbGROdW1iZXIgPSAyLAorICAgIGtBcmdzUHJvdG9GaWVsZE51bWJlciA9IDMsCisg
ICAga0Ryb3BSZXBseUZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKworICBJUENGcmFtZV9JbnZva2VN
ZXRob2QoKTsKKyAgfklQQ0ZyYW1lX0ludm9rZU1ldGhvZCgpIG92ZXJyaWRlOworICBJUENGcmFt
ZV9JbnZva2VNZXRob2QoSVBDRnJhbWVfSW52b2tlTWV0aG9kJiYpIG5vZXhjZXB0OworICBJUENG
cmFtZV9JbnZva2VNZXRob2QmIG9wZXJhdG9yPShJUENGcmFtZV9JbnZva2VNZXRob2QmJik7Cisg
IElQQ0ZyYW1lX0ludm9rZU1ldGhvZChjb25zdCBJUENGcmFtZV9JbnZva2VNZXRob2QmKTsKKyAg
SVBDRnJhbWVfSW52b2tlTWV0aG9kJiBvcGVyYXRvcj0oY29uc3QgSVBDRnJhbWVfSW52b2tlTWV0
aG9kJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJUENGcmFtZV9JbnZva2VNZXRob2QmKSBj
b25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElQQ0ZyYW1lX0ludm9rZU1ldGhvZCYgb3Ro
ZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZy
b21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2Vy
aWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4g
U2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnBy
b3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3NlcnZpY2VfaWQoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50MzJfdCBzZXJ2aWNlX2lkKCkgY29u
c3QgeyByZXR1cm4gc2VydmljZV9pZF87IH0KKyAgdm9pZCBzZXRfc2VydmljZV9pZCh1aW50MzJf
dCB2YWx1ZSkgeyBzZXJ2aWNlX2lkXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKwor
ICBib29sIGhhc19tZXRob2RfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQor
ICB1aW50MzJfdCBtZXRob2RfaWQoKSBjb25zdCB7IHJldHVybiBtZXRob2RfaWRfOyB9CisgIHZv
aWQgc2V0X21ldGhvZF9pZCh1aW50MzJfdCB2YWx1ZSkgeyBtZXRob2RfaWRfID0gdmFsdWU7IF9o
YXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJvb2wgaGFzX2FyZ3NfcHJvdG8oKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnc19wcm90bygp
IGNvbnN0IHsgcmV0dXJuIGFyZ3NfcHJvdG9fOyB9CisgIHZvaWQgc2V0X2FyZ3NfcHJvdG8oY29u
c3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IGFyZ3NfcHJvdG9fID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCgzKTsgfQorICB2b2lkIHNldF9hcmdzX3Byb3RvKGNvbnN0IHZvaWQqIHAsIHNpemVfdCBz
KSB7IGFyZ3NfcHJvdG9fLmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwKSwg
cyk7IF9oYXNfZmllbGRfLnNldCgzKTsgfQorCisgIGJvb2wgaGFzX2Ryb3BfcmVwbHkoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICBib29sIGRyb3BfcmVwbHkoKSBjb25zdCB7
IHJldHVybiBkcm9wX3JlcGx5XzsgfQorICB2b2lkIHNldF9kcm9wX3JlcGx5KGJvb2wgdmFsdWUp
IHsgZHJvcF9yZXBseV8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyBwcml2YXRl
OgorICB1aW50MzJfdCBzZXJ2aWNlX2lkX3t9OworICB1aW50MzJfdCBtZXRob2RfaWRfe307Cisg
IHN0ZDo6c3RyaW5nIGFyZ3NfcHJvdG9fe307CisgIGJvb2wgZHJvcF9yZXBseV97fTsKKworICAv
LyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGli
aWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6
OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8NT4gX2hhc19maWVsZF97
fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVw
bHkgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNp
bmcgTWV0aG9kSW5mbyA9IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbzsKKyAg
ZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtTdWNjZXNzRmllbGROdW1iZXIgPSAxLAorICAgIGtT
ZXJ2aWNlSWRGaWVsZE51bWJlciA9IDIsCisgICAga01ldGhvZHNGaWVsZE51bWJlciA9IDMsCisg
IH07CisKKyAgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseSgpOworICB+SVBDRnJhbWVfQmluZFNl
cnZpY2VSZXBseSgpIG92ZXJyaWRlOworICBJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5KElQQ0Zy
YW1lX0JpbmRTZXJ2aWNlUmVwbHkmJikgbm9leGNlcHQ7CisgIElQQ0ZyYW1lX0JpbmRTZXJ2aWNl
UmVwbHkmIG9wZXJhdG9yPShJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5JiYpOworICBJUENGcmFt
ZV9CaW5kU2VydmljZVJlcGx5KGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHkmKTsKKyAg
SVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseSYgb3BlcmF0b3I9KGNvbnN0IElQQ0ZyYW1lX0JpbmRT
ZXJ2aWNlUmVwbHkmKTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2
aWNlUmVwbHkmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElQQ0ZyYW1lX0JpbmRT
ZXJ2aWNlUmVwbHkmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQor
CisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7Cisg
IHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9p
ZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19z
dWNjZXNzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgYm9vbCBzdWNjZXNz
KCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc187IH0KKyAgdm9pZCBzZXRfc3VjY2Vzcyhib29sIHZh
bHVlKSB7IHN1Y2Nlc3NfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wg
aGFzX3NlcnZpY2VfaWQoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICB1aW50
MzJfdCBzZXJ2aWNlX2lkKCkgY29uc3QgeyByZXR1cm4gc2VydmljZV9pZF87IH0KKyAgdm9pZCBz
ZXRfc2VydmljZV9pZCh1aW50MzJfdCB2YWx1ZSkgeyBzZXJ2aWNlX2lkXyA9IHZhbHVlOyBfaGFz
X2ZpZWxkXy5zZXQoMik7IH0KKworICBpbnQgbWV0aG9kc19zaXplKCkgY29uc3QgeyByZXR1cm4g
c3RhdGljX2Nhc3Q8aW50PihtZXRob2RzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9y
PElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbz4mIG1ldGhvZHMoKSBjb25zdCB7
IHJldHVybiBtZXRob2RzXzsgfQorICBzdGQ6OnZlY3RvcjxJUENGcmFtZV9CaW5kU2VydmljZVJl
cGx5X01ldGhvZEluZm8+KiBtdXRhYmxlX21ldGhvZHMoKSB7IHJldHVybiAmbWV0aG9kc187IH0K
KyAgdm9pZCBjbGVhcl9tZXRob2RzKCkgeyBtZXRob2RzXy5jbGVhcigpOyB9CisgIElQQ0ZyYW1l
X0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbyogYWRkX21ldGhvZHMoKSB7IG1ldGhvZHNfLmVt
cGxhY2VfYmFjaygpOyByZXR1cm4gJm1ldGhvZHNfLmJhY2soKTsgfQorCisgcHJpdmF0ZToKKyAg
Ym9vbCBzdWNjZXNzX3t9OworICB1aW50MzJfdCBzZXJ2aWNlX2lkX3t9OworICBzdGQ6OnZlY3Rv
cjxJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5X01ldGhvZEluZm8+IG1ldGhvZHNfOworCisgIC8v
IEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJp
bGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6
c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw0PiBfaGFzX2ZpZWxkX3t9
OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBs
eV9NZXRob2RJbmZvIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJs
aWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrSWRGaWVsZE51bWJlciA9IDEsCisgICAg
a05hbWVGaWVsZE51bWJlciA9IDIsCisgIH07CisKKyAgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBs
eV9NZXRob2RJbmZvKCk7CisgIH5JUENGcmFtZV9CaW5kU2VydmljZVJlcGx5X01ldGhvZEluZm8o
KSBvdmVycmlkZTsKKyAgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZvKElQQ0Zy
YW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbyYmKSBub2V4Y2VwdDsKKyAgSVBDRnJhbWVf
QmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZvJiBvcGVyYXRvcj0oSVBDRnJhbWVfQmluZFNlcnZp
Y2VSZXBseV9NZXRob2RJbmZvJiYpOworICBJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5X01ldGhv
ZEluZm8oY29uc3QgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZvJik7CisgIElQ
Q0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbyYgb3BlcmF0b3I9KGNvbnN0IElQQ0Zy
YW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbyYpOworICBib29sIG9wZXJhdG9yPT0oY29u
c3QgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZvJikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5X01ldGhvZEluZm8mIG90
aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VG
cm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNl
cmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+
IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpw
cm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19pZCgpIGNvbnN0IHsgcmV0
dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIHVpbnQzMl90IGlkKCkgY29uc3QgeyByZXR1cm4gaWRf
OyB9CisgIHZvaWQgc2V0X2lkKHVpbnQzMl90IHZhbHVlKSB7IGlkXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19m
aWVsZF9bMl07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBu
YW1lXzsgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBuYW1l
XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworIHByaXZhdGU6CisgIHVpbnQzMl90
IGlkX3t9OworICBzdGQ6OnN0cmluZyBuYW1lX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2
ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1
dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmll
bGRzXzsKKworICBzdGQ6OmJpdHNldDwzPiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQ
RVJGRVRUT19FWFBPUlQgSVBDRnJhbWVfQmluZFNlcnZpY2UgOiBwdWJsaWMgOjpwcm90b3plcm86
OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtT
ZXJ2aWNlTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKworICBJUENGcmFtZV9CaW5kU2Vydmlj
ZSgpOworICB+SVBDRnJhbWVfQmluZFNlcnZpY2UoKSBvdmVycmlkZTsKKyAgSVBDRnJhbWVfQmlu
ZFNlcnZpY2UoSVBDRnJhbWVfQmluZFNlcnZpY2UmJikgbm9leGNlcHQ7CisgIElQQ0ZyYW1lX0Jp
bmRTZXJ2aWNlJiBvcGVyYXRvcj0oSVBDRnJhbWVfQmluZFNlcnZpY2UmJik7CisgIElQQ0ZyYW1l
X0JpbmRTZXJ2aWNlKGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlJik7CisgIElQQ0ZyYW1lX0Jp
bmRTZXJ2aWNlJiBvcGVyYXRvcj0oY29uc3QgSVBDRnJhbWVfQmluZFNlcnZpY2UmKTsKKyAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlJikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBJUENGcmFtZV9CaW5kU2VydmljZSYgb3RoZXIpIGNvbnN0IHsgcmV0
dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2
b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmco
KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJh
eSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2Fn
ZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3NlcnZpY2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzFdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUoKSBjb25z
dCB7IHJldHVybiBzZXJ2aWNlX25hbWVfOyB9CisgIHZvaWQgc2V0X3NlcnZpY2VfbmFtZShjb25z
dCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgc2VydmljZV9uYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxk
Xy5zZXQoMSk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV97fTsK
KworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNv
bXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgor
ICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19m
aWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFtZXNwYWNl
IHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fSVBDX1dJUkVfUFJPVE9DT0xfUFJPVE9fQ1BQX0hfCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2Fn
ZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2Nh
dHRlcmVkX2hlYXBfYnVmZmVyLmgiCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRlZCBieSBQ
ZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFn
bWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9pcGMvd2lyZV9wcm90b2Nv
bC5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFt
ZXNwYWNlIGdlbiB7CisKK0lQQ0ZyYW1lOjpJUENGcmFtZSgpID0gZGVmYXVsdDsKK0lQQ0ZyYW1l
Ojp+SVBDRnJhbWUoKSA9IGRlZmF1bHQ7CitJUENGcmFtZTo6SVBDRnJhbWUoY29uc3QgSVBDRnJh
bWUmKSA9IGRlZmF1bHQ7CitJUENGcmFtZSYgSVBDRnJhbWU6Om9wZXJhdG9yPShjb25zdCBJUENG
cmFtZSYpID0gZGVmYXVsdDsKK0lQQ0ZyYW1lOjpJUENGcmFtZShJUENGcmFtZSYmKSBub2V4Y2Vw
dCA9IGRlZmF1bHQ7CitJUENGcmFtZSYgSVBDRnJhbWU6Om9wZXJhdG9yPShJUENGcmFtZSYmKSA9
IGRlZmF1bHQ7CisKK2Jvb2wgSVBDRnJhbWU6Om9wZXJhdG9yPT0oY29uc3QgSVBDRnJhbWUmIG90
aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9m
aWVsZHNfCisgICAmJiByZXF1ZXN0X2lkXyA9PSBvdGhlci5yZXF1ZXN0X2lkXworICAgJiYgbXNn
X2JpbmRfc2VydmljZV8gPT0gb3RoZXIubXNnX2JpbmRfc2VydmljZV8KKyAgICYmIG1zZ19iaW5k
X3NlcnZpY2VfcmVwbHlfID09IG90aGVyLm1zZ19iaW5kX3NlcnZpY2VfcmVwbHlfCisgICAmJiBt
c2dfaW52b2tlX21ldGhvZF8gPT0gb3RoZXIubXNnX2ludm9rZV9tZXRob2RfCisgICAmJiBtc2df
aW52b2tlX21ldGhvZF9yZXBseV8gPT0gb3RoZXIubXNnX2ludm9rZV9tZXRob2RfcmVwbHlfCisg
ICAmJiBtc2dfcmVxdWVzdF9lcnJvcl8gPT0gb3RoZXIubXNnX3JlcXVlc3RfZXJyb3JfCisgICAm
JiBkYXRhX2Zvcl90ZXN0aW5nXyA9PSBvdGhlci5kYXRhX2Zvcl90ZXN0aW5nXzsKK30KKworYm9v
bCBJUENGcmFtZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkg
eworICBkYXRhX2Zvcl90ZXN0aW5nXy5jbGVhcigpOworICB1bmtub3duX2ZpZWxkc18uY2xlYXIo
KTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6UHJvdG9E
ZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVhZEZpZWxk
KCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAgaWYgKGZp
ZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRfLnNldChm
aWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAgICBjYXNl
IDIgLyogcmVxdWVzdF9pZCAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZyZXF1ZXN0X2lkXyk7Cisg
ICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzIC8qIG1zZ19iaW5kX3NlcnZpY2UgKi86CisgICAg
ICAgICgqbXNnX2JpbmRfc2VydmljZV8pLlBhcnNlRnJvbVN0cmluZyhmaWVsZC5hc19zdGRfc3Ry
aW5nKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBtc2dfYmluZF9zZXJ2aWNl
X3JlcGx5ICovOgorICAgICAgICAoKm1zZ19iaW5kX3NlcnZpY2VfcmVwbHlfKS5QYXJzZUZyb21T
dHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl
IDUgLyogbXNnX2ludm9rZV9tZXRob2QgKi86CisgICAgICAgICgqbXNnX2ludm9rZV9tZXRob2Rf
KS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgICBjYXNlIDYgLyogbXNnX2ludm9rZV9tZXRob2RfcmVwbHkgKi86CisgICAgICAgICgq
bXNnX2ludm9rZV9tZXRob2RfcmVwbHlfKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0
cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDcgLyogbXNnX3JlcXVlc3RfZXJy
b3IgKi86CisgICAgICAgICgqbXNnX3JlcXVlc3RfZXJyb3JfKS5QYXJzZUZyb21TdHJpbmcoZmll
bGQuYXNfc3RkX3N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgLyogZGF0
YV9mb3JfdGVzdGluZyAqLzoKKyAgICAgICAgZGF0YV9mb3JfdGVzdGluZ18uZW1wbGFjZV9iYWNr
KCk7CisgICAgICAgIGZpZWxkLmdldCgmZGF0YV9mb3JfdGVzdGluZ18uYmFjaygpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBl
bmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJl
dHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmlu
ZyBJUENGcmFtZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpI
ZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5n
ZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0
b3I8dWludDhfdD4gSVBDRnJhbWU6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJv
dG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFs
aXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2
b2lkIElQQ0ZyYW1lOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3Qg
eworICAvLyBGaWVsZCAyOiByZXF1ZXN0X2lkCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAg
IG1zZy0+QXBwZW5kVmFySW50KDIsIHJlcXVlc3RfaWRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6
IG1zZ19iaW5kX3NlcnZpY2UKKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgKCptc2dfYmlu
ZF9zZXJ2aWNlXykuU2VyaWFsaXplKG1zZy0+QmVnaW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJv
OjpNZXNzYWdlPigzKSk7CisgIH0KKworICAvLyBGaWVsZCA0OiBtc2dfYmluZF9zZXJ2aWNlX3Jl
cGx5CisgIGlmIChfaGFzX2ZpZWxkX1s0XSkgeworICAgICgqbXNnX2JpbmRfc2VydmljZV9yZXBs
eV8pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2Fn
ZT4oNCkpOworICB9CisKKyAgLy8gRmllbGQgNTogbXNnX2ludm9rZV9tZXRob2QKKyAgaWYgKF9o
YXNfZmllbGRfWzVdKSB7CisgICAgKCptc2dfaW52b2tlX21ldGhvZF8pLlNlcmlhbGl6ZShtc2ct
PkJlZ2luTmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oNSkpOworICB9CisKKyAg
Ly8gRmllbGQgNjogbXNnX2ludm9rZV9tZXRob2RfcmVwbHkKKyAgaWYgKF9oYXNfZmllbGRfWzZd
KSB7CisgICAgKCptc2dfaW52b2tlX21ldGhvZF9yZXBseV8pLlNlcmlhbGl6ZShtc2ctPkJlZ2lu
TmVzdGVkTWVzc2FnZTw6OnByb3RvemVybzo6TWVzc2FnZT4oNikpOworICB9CisKKyAgLy8gRmll
bGQgNzogbXNnX3JlcXVlc3RfZXJyb3IKKyAgaWYgKF9oYXNfZmllbGRfWzddKSB7CisgICAgKCpt
c2dfcmVxdWVzdF9lcnJvcl8pLlNlcmlhbGl6ZShtc2ctPkJlZ2luTmVzdGVkTWVzc2FnZTw6OnBy
b3RvemVybzo6TWVzc2FnZT4oNykpOworICB9CisKKyAgLy8gRmllbGQgMTogZGF0YV9mb3JfdGVz
dGluZworICBmb3IgKGF1dG8mIGl0IDogZGF0YV9mb3JfdGVzdGluZ18pIHsKKyAgICBtc2ctPkFw
cGVuZFN0cmluZygxLCBpdCk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5r
bm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworSVBD
RnJhbWVfUmVxdWVzdEVycm9yOjpJUENGcmFtZV9SZXF1ZXN0RXJyb3IoKSA9IGRlZmF1bHQ7CitJ
UENGcmFtZV9SZXF1ZXN0RXJyb3I6On5JUENGcmFtZV9SZXF1ZXN0RXJyb3IoKSA9IGRlZmF1bHQ7
CitJUENGcmFtZV9SZXF1ZXN0RXJyb3I6OklQQ0ZyYW1lX1JlcXVlc3RFcnJvcihjb25zdCBJUENG
cmFtZV9SZXF1ZXN0RXJyb3ImKSA9IGRlZmF1bHQ7CitJUENGcmFtZV9SZXF1ZXN0RXJyb3ImIElQ
Q0ZyYW1lX1JlcXVlc3RFcnJvcjo6b3BlcmF0b3I9KGNvbnN0IElQQ0ZyYW1lX1JlcXVlc3RFcnJv
ciYpID0gZGVmYXVsdDsKK0lQQ0ZyYW1lX1JlcXVlc3RFcnJvcjo6SVBDRnJhbWVfUmVxdWVzdEVy
cm9yKElQQ0ZyYW1lX1JlcXVlc3RFcnJvciYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitJUENGcmFt
ZV9SZXF1ZXN0RXJyb3ImIElQQ0ZyYW1lX1JlcXVlc3RFcnJvcjo6b3BlcmF0b3I9KElQQ0ZyYW1l
X1JlcXVlc3RFcnJvciYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgSVBDRnJhbWVfUmVxdWVzdEVycm9y
OjpvcGVyYXRvcj09KGNvbnN0IElQQ0ZyYW1lX1JlcXVlc3RFcnJvciYgb3RoZXIpIGNvbnN0IHsK
KyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYm
IGVycm9yXyA9PSBvdGhlci5lcnJvcl87Cit9CisKK2Jvb2wgSVBDRnJhbWVfUmVxdWVzdEVycm9y
OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7CisgIHVua25v
d25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOworCisgIDo6
cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0byBmaWVs
ZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVhZEZpZWxk
KCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgeworICAgICAg
X2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZWxkLmlk
KCkpIHsKKyAgICAgIGNhc2UgMSAvKiBlcnJvciAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZlcnJv
cl8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZpZWxkLlNlcmlh
bGl6ZUFuZEFwcGVuZFRvKCZ1bmtub3duX2ZpZWxkc18pOworICAgICAgICBicmVhazsKKyAgICB9
CisgIH0KKyAgcmV0dXJuICFwYWNrZWRfZXJyb3IgJiYgIWRlYy5ieXRlc19sZWZ0KCk7Cit9CisK
K3N0ZDo6c3RyaW5nIElQQ0ZyYW1lX1JlcXVlc3RFcnJvcjo6U2VyaWFsaXplQXNTdHJpbmcoKSBj
b25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+
IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNT
dHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gSVBDRnJhbWVfUmVxdWVzdEVycm9y
OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6SGVhcEJ1ZmZlcmVk
PDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cuZ2V0KCkpOworICBy
ZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBJUENGcmFtZV9SZXF1ZXN0
RXJyb3I6OlNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSogbXNnKSBjb25zdCB7CisgIC8v
IEZpZWxkIDE6IGVycm9yCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5k
U3RyaW5nKDEsIGVycm9yXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5r
bm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworSVBD
RnJhbWVfSW52b2tlTWV0aG9kUmVwbHk6OklQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5KCkgPSBk
ZWZhdWx0OworSVBDRnJhbWVfSW52b2tlTWV0aG9kUmVwbHk6On5JUENGcmFtZV9JbnZva2VNZXRo
b2RSZXBseSgpID0gZGVmYXVsdDsKK0lQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5OjpJUENGcmFt
ZV9JbnZva2VNZXRob2RSZXBseShjb25zdCBJUENGcmFtZV9JbnZva2VNZXRob2RSZXBseSYpID0g
ZGVmYXVsdDsKK0lQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5JiBJUENGcmFtZV9JbnZva2VNZXRo
b2RSZXBseTo6b3BlcmF0b3I9KGNvbnN0IElQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5JikgPSBk
ZWZhdWx0OworSVBDRnJhbWVfSW52b2tlTWV0aG9kUmVwbHk6OklQQ0ZyYW1lX0ludm9rZU1ldGhv
ZFJlcGx5KElQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsK
K0lQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5JiBJUENGcmFtZV9JbnZva2VNZXRob2RSZXBseTo6
b3BlcmF0b3I9KElQQ0ZyYW1lX0ludm9rZU1ldGhvZFJlcGx5JiYpID0gZGVmYXVsdDsKKworYm9v
bCBJUENGcmFtZV9JbnZva2VNZXRob2RSZXBseTo6b3BlcmF0b3I9PShjb25zdCBJUENGcmFtZV9J
bnZva2VNZXRob2RSZXBseSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRz
XyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHN1Y2Nlc3NfID09IG90aGVyLnN1Y2Nl
c3NfCisgICAmJiBoYXNfbW9yZV8gPT0gb3RoZXIuaGFzX21vcmVfCisgICAmJiByZXBseV9wcm90
b18gPT0gb3RoZXIucmVwbHlfcHJvdG9fOworfQorCitib29sIElQQ0ZyYW1lX0ludm9rZU1ldGhv
ZFJlcGx5OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiByYXcsIHNpemVfdCBzaXplKSB7Cisg
IHVua25vd25fZmllbGRzXy5jbGVhcigpOworICBib29sIHBhY2tlZF9lcnJvciA9IGZhbHNlOwor
CisgIDo6cHJvdG96ZXJvOjpQcm90b0RlY29kZXIgZGVjKHJhdywgc2l6ZSk7CisgIGZvciAoYXV0
byBmaWVsZCA9IGRlYy5SZWFkRmllbGQoKTsgZmllbGQudmFsaWQoKTsgZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCkpIHsKKyAgICBpZiAoZmllbGQuaWQoKSA8IF9oYXNfZmllbGRfLnNpemUoKSkgewor
ICAgICAgX2hhc19maWVsZF8uc2V0KGZpZWxkLmlkKCkpOworICAgIH0KKyAgICBzd2l0Y2ggKGZp
ZWxkLmlkKCkpIHsKKyAgICAgIGNhc2UgMSAvKiBzdWNjZXNzICovOgorICAgICAgICBmaWVsZC5n
ZXQoJnN1Y2Nlc3NfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgLyogaGFzX21vcmUg
Ki86CisgICAgICAgIGZpZWxkLmdldCgmaGFzX21vcmVfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDMgLyogcmVwbHlfcHJvdG8gKi86CisgICAgICAgIGZpZWxkLmdldCgmcmVwbHlfcHJv
dG9fKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJp
YWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
fQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQor
CitzdGQ6OnN0cmluZyBJUENGcmFtZV9JbnZva2VNZXRob2RSZXBseTo6U2VyaWFsaXplQXNTdHJp
bmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1l
c3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFs
aXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gSVBDRnJhbWVfSW52b2tl
TWV0aG9kUmVwbHk6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpI
ZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5n
ZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIElQQ0Zy
YW1lX0ludm9rZU1ldGhvZFJlcGx5OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBzdWNjZXNzCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkg
eworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgxLCBzdWNjZXNzXyk7CisgIH0KKworICAvLyBG
aWVsZCAyOiBoYXNfbW9yZQorICBpZiAoX2hhc19maWVsZF9bMl0pIHsKKyAgICBtc2ctPkFwcGVu
ZFRpbnlWYXJJbnQoMiwgaGFzX21vcmVfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IHJlcGx5X3By
b3RvCisgIGlmIChfaGFzX2ZpZWxkX1szXSkgeworICAgIG1zZy0+QXBwZW5kU3RyaW5nKDMsIHJl
cGx5X3Byb3RvXyk7CisgIH0KKworICBtc2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9m
aWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVsZHNfLnNpemUoKSk7Cit9CisKKworSVBDRnJhbWVf
SW52b2tlTWV0aG9kOjpJUENGcmFtZV9JbnZva2VNZXRob2QoKSA9IGRlZmF1bHQ7CitJUENGcmFt
ZV9JbnZva2VNZXRob2Q6On5JUENGcmFtZV9JbnZva2VNZXRob2QoKSA9IGRlZmF1bHQ7CitJUENG
cmFtZV9JbnZva2VNZXRob2Q6OklQQ0ZyYW1lX0ludm9rZU1ldGhvZChjb25zdCBJUENGcmFtZV9J
bnZva2VNZXRob2QmKSA9IGRlZmF1bHQ7CitJUENGcmFtZV9JbnZva2VNZXRob2QmIElQQ0ZyYW1l
X0ludm9rZU1ldGhvZDo6b3BlcmF0b3I9KGNvbnN0IElQQ0ZyYW1lX0ludm9rZU1ldGhvZCYpID0g
ZGVmYXVsdDsKK0lQQ0ZyYW1lX0ludm9rZU1ldGhvZDo6SVBDRnJhbWVfSW52b2tlTWV0aG9kKElQ
Q0ZyYW1lX0ludm9rZU1ldGhvZCYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitJUENGcmFtZV9JbnZv
a2VNZXRob2QmIElQQ0ZyYW1lX0ludm9rZU1ldGhvZDo6b3BlcmF0b3I9KElQQ0ZyYW1lX0ludm9r
ZU1ldGhvZCYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgSVBDRnJhbWVfSW52b2tlTWV0aG9kOjpvcGVy
YXRvcj09KGNvbnN0IElQQ0ZyYW1lX0ludm9rZU1ldGhvZCYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0
dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxkc18KKyAgICYmIHNlcnZp
Y2VfaWRfID09IG90aGVyLnNlcnZpY2VfaWRfCisgICAmJiBtZXRob2RfaWRfID09IG90aGVyLm1l
dGhvZF9pZF8KKyAgICYmIGFyZ3NfcHJvdG9fID09IG90aGVyLmFyZ3NfcHJvdG9fCisgICAmJiBk
cm9wX3JlcGx5XyA9PSBvdGhlci5kcm9wX3JlcGx5XzsKK30KKworYm9vbCBJUENGcmFtZV9JbnZv
a2VNZXRob2Q6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsK
KyAgdW5rbm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7
CisKKyAgOjpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChh
dXRvIGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5S
ZWFkRmllbGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7
CisgICAgICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAo
ZmllbGQuaWQoKSkgeworICAgICAgY2FzZSAxIC8qIHNlcnZpY2VfaWQgKi86CisgICAgICAgIGZp
ZWxkLmdldCgmc2VydmljZV9pZF8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBt
ZXRob2RfaWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmbWV0aG9kX2lkXyk7CisgICAgICAgIGJy
ZWFrOworICAgICAgY2FzZSAzIC8qIGFyZ3NfcHJvdG8gKi86CisgICAgICAgIGZpZWxkLmdldCgm
YXJnc19wcm90b18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNCAvKiBkcm9wX3JlcGx5
ICovOgorICAgICAgICBmaWVsZC5nZXQoJmRyb3BfcmVwbHlfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93
bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2Vk
X2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBJUENGcmFtZV9J
bnZva2VNZXRob2Q6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgeworICA6OnByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cu
Z2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKK3N0ZDo6dmVj
dG9yPHVpbnQ4X3Q+IElQQ0ZyYW1lX0ludm9rZU1ldGhvZDo6U2VyaWFsaXplQXNBcnJheSgpIGNv
bnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6TWVzc2FnZT4g
bXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJpYWxpemVBc0Fy
cmF5KCk7Cit9CisKK3ZvaWQgSVBDRnJhbWVfSW52b2tlTWV0aG9kOjpTZXJpYWxpemUoOjpwcm90
b3plcm86Ok1lc3NhZ2UqIG1zZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBzZXJ2aWNlX2lkCisg
IGlmIChfaGFzX2ZpZWxkX1sxXSkgeworICAgIG1zZy0+QXBwZW5kVmFySW50KDEsIHNlcnZpY2Vf
aWRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDI6IG1ldGhvZF9pZAorICBpZiAoX2hhc19maWVsZF9b
Ml0pIHsKKyAgICBtc2ctPkFwcGVuZFZhckludCgyLCBtZXRob2RfaWRfKTsKKyAgfQorCisgIC8v
IEZpZWxkIDM6IGFyZ3NfcHJvdG8KKyAgaWYgKF9oYXNfZmllbGRfWzNdKSB7CisgICAgbXNnLT5B
cHBlbmRTdHJpbmcoMywgYXJnc19wcm90b18pOworICB9CisKKyAgLy8gRmllbGQgNDogZHJvcF9y
ZXBseQorICBpZiAoX2hhc19maWVsZF9bNF0pIHsKKyAgICBtc2ctPkFwcGVuZFRpbnlWYXJJbnQo
NCwgZHJvcF9yZXBseV8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5dGVzKHVua25v
d25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQorCisKK0lQQ0Zy
YW1lX0JpbmRTZXJ2aWNlUmVwbHk6OklQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHkoKSA9IGRlZmF1
bHQ7CitJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5Ojp+SVBDRnJhbWVfQmluZFNlcnZpY2VSZXBs
eSgpID0gZGVmYXVsdDsKK0lQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHk6OklQQ0ZyYW1lX0JpbmRT
ZXJ2aWNlUmVwbHkoY29uc3QgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseSYpID0gZGVmYXVsdDsK
K0lQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHkmIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHk6Om9w
ZXJhdG9yPShjb25zdCBJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5JikgPSBkZWZhdWx0OworSVBD
RnJhbWVfQmluZFNlcnZpY2VSZXBseTo6SVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseShJUENGcmFt
ZV9CaW5kU2VydmljZVJlcGx5JiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKK0lQQ0ZyYW1lX0JpbmRT
ZXJ2aWNlUmVwbHkmIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHk6Om9wZXJhdG9yPShJUENGcmFt
ZV9CaW5kU2VydmljZVJlcGx5JiYpID0gZGVmYXVsdDsKKworYm9vbCBJUENGcmFtZV9CaW5kU2Vy
dmljZVJlcGx5OjpvcGVyYXRvcj09KGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHkmIG90
aGVyKSBjb25zdCB7CisgIHJldHVybiB1bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9m
aWVsZHNfCisgICAmJiBzdWNjZXNzXyA9PSBvdGhlci5zdWNjZXNzXworICAgJiYgc2VydmljZV9p
ZF8gPT0gb3RoZXIuc2VydmljZV9pZF8KKyAgICYmIG1ldGhvZHNfID09IG90aGVyLm1ldGhvZHNf
OworfQorCitib29sIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHk6OlBhcnNlRnJvbUFycmF5KGNv
bnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgbWV0aG9kc18uY2xlYXIoKTsKKyAgdW5r
bm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAg
Ojpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZp
ZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAg
ICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQu
aWQoKSkgeworICAgICAgY2FzZSAxIC8qIHN1Y2Nlc3MgKi86CisgICAgICAgIGZpZWxkLmdldCgm
c3VjY2Vzc18pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiAvKiBzZXJ2aWNlX2lkICov
OgorICAgICAgICBmaWVsZC5nZXQoJnNlcnZpY2VfaWRfKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ICBjYXNlIDMgLyogbWV0aG9kcyAqLzoKKyAgICAgICAgbWV0aG9kc18uZW1wbGFjZV9iYWNrKCk7
CisgICAgICAgIG1ldGhvZHNfLmJhY2soKS5QYXJzZUZyb21TdHJpbmcoZmllbGQuYXNfc3RkX3N0
cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZC5T
ZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0ZXNfbGVmdCgpOwor
fQorCitzdGQ6OnN0cmluZyBJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5OjpTZXJpYWxpemVBc1N0
cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVybzo6
TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5TZXJp
YWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBJUENGcmFtZV9CaW5k
U2VydmljZVJlcGx5OjpTZXJpYWxpemVBc0FycmF5KCkgY29uc3QgeworICA6OnByb3RvemVybzo6
SGVhcEJ1ZmZlcmVkPDo6cHJvdG96ZXJvOjpNZXNzYWdlPiBtc2c7CisgIFNlcmlhbGl6ZShtc2cu
Z2V0KCkpOworICByZXR1cm4gbXNnLlNlcmlhbGl6ZUFzQXJyYXkoKTsKK30KKwordm9pZCBJUENG
cmFtZV9CaW5kU2VydmljZVJlcGx5OjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1z
ZykgY29uc3QgeworICAvLyBGaWVsZCAxOiBzdWNjZXNzCisgIGlmIChfaGFzX2ZpZWxkX1sxXSkg
eworICAgIG1zZy0+QXBwZW5kVGlueVZhckludCgxLCBzdWNjZXNzXyk7CisgIH0KKworICAvLyBG
aWVsZCAyOiBzZXJ2aWNlX2lkCisgIGlmIChfaGFzX2ZpZWxkX1syXSkgeworICAgIG1zZy0+QXBw
ZW5kVmFySW50KDIsIHNlcnZpY2VfaWRfKTsKKyAgfQorCisgIC8vIEZpZWxkIDM6IG1ldGhvZHMK
KyAgZm9yIChhdXRvJiBpdCA6IG1ldGhvZHNfKSB7CisgICAgaXQuU2VyaWFsaXplKG1zZy0+QmVn
aW5OZXN0ZWRNZXNzYWdlPDo6cHJvdG96ZXJvOjpNZXNzYWdlPigzKSk7CisgIH0KKworICBtc2ct
PkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9maWVs
ZHNfLnNpemUoKSk7Cit9CisKKworSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZv
OjpJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5X01ldGhvZEluZm8oKSA9IGRlZmF1bHQ7CitJUENG
cmFtZV9CaW5kU2VydmljZVJlcGx5X01ldGhvZEluZm86On5JUENGcmFtZV9CaW5kU2VydmljZVJl
cGx5X01ldGhvZEluZm8oKSA9IGRlZmF1bHQ7CitJUENGcmFtZV9CaW5kU2VydmljZVJlcGx5X01l
dGhvZEluZm86OklQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbyhjb25zdCBJUENG
cmFtZV9CaW5kU2VydmljZVJlcGx5X01ldGhvZEluZm8mKSA9IGRlZmF1bHQ7CitJUENGcmFtZV9C
aW5kU2VydmljZVJlcGx5X01ldGhvZEluZm8mIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0
aG9kSW5mbzo6b3BlcmF0b3I9KGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9k
SW5mbyYpID0gZGVmYXVsdDsKK0lQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbzo6
SVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZvKElQQ0ZyYW1lX0JpbmRTZXJ2aWNl
UmVwbHlfTWV0aG9kSW5mbyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitJUENGcmFtZV9CaW5kU2Vy
dmljZVJlcGx5X01ldGhvZEluZm8mIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5m
bzo6b3BlcmF0b3I9KElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbyYmKSA9IGRl
ZmF1bHQ7CisKK2Jvb2wgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZvOjpvcGVy
YXRvcj09KGNvbnN0IElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbyYgb3RoZXIp
IGNvbnN0IHsKKyAgcmV0dXJuIHVua25vd25fZmllbGRzXyA9PSBvdGhlci51bmtub3duX2ZpZWxk
c18KKyAgICYmIGlkXyA9PSBvdGhlci5pZF8KKyAgICYmIG5hbWVfID09IG90aGVyLm5hbWVfOwor
fQorCitib29sIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbzo6UGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCogcmF3LCBzaXplX3Qgc2l6ZSkgeworICB1bmtub3duX2ZpZWxkc18u
Y2xlYXIoKTsKKyAgYm9vbCBwYWNrZWRfZXJyb3IgPSBmYWxzZTsKKworICA6OnByb3RvemVybzo6
UHJvdG9EZWNvZGVyIGRlYyhyYXcsIHNpemUpOworICBmb3IgKGF1dG8gZmllbGQgPSBkZWMuUmVh
ZEZpZWxkKCk7IGZpZWxkLnZhbGlkKCk7IGZpZWxkID0gZGVjLlJlYWRGaWVsZCgpKSB7CisgICAg
aWYgKGZpZWxkLmlkKCkgPCBfaGFzX2ZpZWxkXy5zaXplKCkpIHsKKyAgICAgIF9oYXNfZmllbGRf
LnNldChmaWVsZC5pZCgpKTsKKyAgICB9CisgICAgc3dpdGNoIChmaWVsZC5pZCgpKSB7CisgICAg
ICBjYXNlIDEgLyogaWQgKi86CisgICAgICAgIGZpZWxkLmdldCgmaWRfKTsKKyAgICAgICAgYnJl
YWs7CisgICAgICBjYXNlIDIgLyogbmFtZSAqLzoKKyAgICAgICAgZmllbGQuZ2V0KCZuYW1lXyk7
CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZmllbGQuU2VyaWFsaXpl
QW5kQXBwZW5kVG8oJnVua25vd25fZmllbGRzXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAg
fQorICByZXR1cm4gIXBhY2tlZF9lcnJvciAmJiAhZGVjLmJ5dGVzX2xlZnQoKTsKK30KKworc3Rk
OjpzdHJpbmcgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseV9NZXRob2RJbmZvOjpTZXJpYWxpemVB
c1N0cmluZygpIGNvbnN0IHsKKyAgOjpwcm90b3plcm86OkhlYXBCdWZmZXJlZDw6OnByb3RvemVy
bzo6TWVzc2FnZT4gbXNnOworICBTZXJpYWxpemUobXNnLmdldCgpKTsKKyAgcmV0dXJuIG1zZy5T
ZXJpYWxpemVBc1N0cmluZygpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBJUENGcmFtZV9C
aW5kU2VydmljZVJlcGx5X01ldGhvZEluZm86OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7Cisg
IDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAg
U2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOwor
fQorCit2b2lkIElQQ0ZyYW1lX0JpbmRTZXJ2aWNlUmVwbHlfTWV0aG9kSW5mbzo6U2VyaWFsaXpl
KDo6cHJvdG96ZXJvOjpNZXNzYWdlKiBtc2cpIGNvbnN0IHsKKyAgLy8gRmllbGQgMTogaWQKKyAg
aWYgKF9oYXNfZmllbGRfWzFdKSB7CisgICAgbXNnLT5BcHBlbmRWYXJJbnQoMSwgaWRfKTsKKyAg
fQorCisgIC8vIEZpZWxkIDI6IG5hbWUKKyAgaWYgKF9oYXNfZmllbGRfWzJdKSB7CisgICAgbXNn
LT5BcHBlbmRTdHJpbmcoMiwgbmFtZV8pOworICB9CisKKyAgbXNnLT5BcHBlbmRSYXdQcm90b0J5
dGVzKHVua25vd25fZmllbGRzXy5kYXRhKCksIHVua25vd25fZmllbGRzXy5zaXplKCkpOworfQor
CisKK0lQQ0ZyYW1lX0JpbmRTZXJ2aWNlOjpJUENGcmFtZV9CaW5kU2VydmljZSgpID0gZGVmYXVs
dDsKK0lQQ0ZyYW1lX0JpbmRTZXJ2aWNlOjp+SVBDRnJhbWVfQmluZFNlcnZpY2UoKSA9IGRlZmF1
bHQ7CitJUENGcmFtZV9CaW5kU2VydmljZTo6SVBDRnJhbWVfQmluZFNlcnZpY2UoY29uc3QgSVBD
RnJhbWVfQmluZFNlcnZpY2UmKSA9IGRlZmF1bHQ7CitJUENGcmFtZV9CaW5kU2VydmljZSYgSVBD
RnJhbWVfQmluZFNlcnZpY2U6Om9wZXJhdG9yPShjb25zdCBJUENGcmFtZV9CaW5kU2VydmljZSYp
ID0gZGVmYXVsdDsKK0lQQ0ZyYW1lX0JpbmRTZXJ2aWNlOjpJUENGcmFtZV9CaW5kU2VydmljZShJ
UENGcmFtZV9CaW5kU2VydmljZSYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CitJUENGcmFtZV9CaW5k
U2VydmljZSYgSVBDRnJhbWVfQmluZFNlcnZpY2U6Om9wZXJhdG9yPShJUENGcmFtZV9CaW5kU2Vy
dmljZSYmKSA9IGRlZmF1bHQ7CisKK2Jvb2wgSVBDRnJhbWVfQmluZFNlcnZpY2U6Om9wZXJhdG9y
PT0oY29uc3QgSVBDRnJhbWVfQmluZFNlcnZpY2UmIG90aGVyKSBjb25zdCB7CisgIHJldHVybiB1
bmtub3duX2ZpZWxkc18gPT0gb3RoZXIudW5rbm93bl9maWVsZHNfCisgICAmJiBzZXJ2aWNlX25h
bWVfID09IG90aGVyLnNlcnZpY2VfbmFtZV87Cit9CisKK2Jvb2wgSVBDRnJhbWVfQmluZFNlcnZp
Y2U6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIHJhdywgc2l6ZV90IHNpemUpIHsKKyAgdW5r
bm93bl9maWVsZHNfLmNsZWFyKCk7CisgIGJvb2wgcGFja2VkX2Vycm9yID0gZmFsc2U7CisKKyAg
Ojpwcm90b3plcm86OlByb3RvRGVjb2RlciBkZWMocmF3LCBzaXplKTsKKyAgZm9yIChhdXRvIGZp
ZWxkID0gZGVjLlJlYWRGaWVsZCgpOyBmaWVsZC52YWxpZCgpOyBmaWVsZCA9IGRlYy5SZWFkRmll
bGQoKSkgeworICAgIGlmIChmaWVsZC5pZCgpIDwgX2hhc19maWVsZF8uc2l6ZSgpKSB7CisgICAg
ICBfaGFzX2ZpZWxkXy5zZXQoZmllbGQuaWQoKSk7CisgICAgfQorICAgIHN3aXRjaCAoZmllbGQu
aWQoKSkgeworICAgICAgY2FzZSAxIC8qIHNlcnZpY2VfbmFtZSAqLzoKKyAgICAgICAgZmllbGQu
Z2V0KCZzZXJ2aWNlX25hbWVfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAg
ICAgICBmaWVsZC5TZXJpYWxpemVBbmRBcHBlbmRUbygmdW5rbm93bl9maWVsZHNfKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAhcGFja2VkX2Vycm9yICYmICFkZWMuYnl0
ZXNfbGVmdCgpOworfQorCitzdGQ6OnN0cmluZyBJUENGcmFtZV9CaW5kU2VydmljZTo6U2VyaWFs
aXplQXNTdHJpbmcoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJvOjpIZWFwQnVmZmVyZWQ8Ojpwcm90
b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1zZy5nZXQoKSk7CisgIHJldHVybiBt
c2cuU2VyaWFsaXplQXNTdHJpbmcoKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gSVBDRnJh
bWVfQmluZFNlcnZpY2U6OlNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCB7CisgIDo6cHJvdG96ZXJv
OjpIZWFwQnVmZmVyZWQ8Ojpwcm90b3plcm86Ok1lc3NhZ2U+IG1zZzsKKyAgU2VyaWFsaXplKG1z
Zy5nZXQoKSk7CisgIHJldHVybiBtc2cuU2VyaWFsaXplQXNBcnJheSgpOworfQorCit2b2lkIElQ
Q0ZyYW1lX0JpbmRTZXJ2aWNlOjpTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqIG1zZykg
Y29uc3QgeworICAvLyBGaWVsZCAxOiBzZXJ2aWNlX25hbWUKKyAgaWYgKF9oYXNfZmllbGRfWzFd
KSB7CisgICAgbXNnLT5BcHBlbmRTdHJpbmcoMSwgc2VydmljZV9uYW1lXyk7CisgIH0KKworICBt
c2ctPkFwcGVuZFJhd1Byb3RvQnl0ZXModW5rbm93bl9maWVsZHNfLmRhdGEoKSwgdW5rbm93bl9m
aWVsZHNfLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFt
ZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorI3ByYWdtYSBHQ0MgZGlhZ25vc3Rp
YyBwb3AKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9pcGMvYnVmZmVyZWRf
ZnJhbWVfZGVzZXJpYWxpemVyLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBz
cmMvaXBjL2J1ZmZlcmVkX2ZyYW1lX2Rlc2VyaWFsaXplci5oCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9pcGMvYmFzaWNfdHlwZXMuaAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cisg
KgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhl
ICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21w
bGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhl
IExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9M
SUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh
Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBM
aWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdB
UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w
bGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVy
bmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgor
ICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfSVBDX0JBU0lDX1RZUEVTX0hfCisj
ZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX0lQQ19CQVNJQ19UWVBFU19IXworCisjaW5jbHVk
ZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9jcHBfbWVzc2FnZV9vYmouaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFj
ZSBpcGMgeworCit1c2luZyBQcm90b01lc3NhZ2UgPSA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9i
ajsKK3VzaW5nIFNlcnZpY2VJRCA9IHVpbnQzMl90OwordXNpbmcgTWV0aG9kSUQgPSB1aW50MzJf
dDsKK3VzaW5nIENsaWVudElEID0gdWludDY0X3Q7Cit1c2luZyBSZXF1ZXN0SUQgPSB1aW50NjRf
dDsKKworLy8gVGhpcyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIHNpemUgYWxsb3dlZCBmb3IgYW4g
SVBDIG1lc3NhZ2UuIFRyeWluZyB0byBzZW5kCisvLyBvciByZWNlaXZlIGEgbGFyZ2VyIG1lc3Nh
Z2Ugd2lsbCBoaXQgRENIRUNLKHMpIGFuZCBhdXRvLWRpc2Nvbm5lY3QuCitjb25zdGV4cHIgc2l6
ZV90IGtJUENCdWZmZXJTaXplID0gMTI4ICogMTAyNDsKKworY29uc3RleHByIHVpZF90IGtJbnZh
bGlkVWlkID0gc3RhdGljX2Nhc3Q8dWlkX3Q+KC0xKTsKKworfSAgLy8gbmFtZXNwYWNlIGlwYwor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19F
WFRfSVBDX0JBU0lDX1RZUEVTX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRy
b2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hl
IExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDov
L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVp
cmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQor
ICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFT
IElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0
aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRh
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTUkNfSVBDX0JVRkZFUkVE
X0ZSQU1FX0RFU0VSSUFMSVpFUl9IXworI2RlZmluZSBTUkNfSVBDX0JVRkZFUkVEX0ZSQU1FX0RF
U0VSSUFMSVpFUl9IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxsaXN0Pgor
I2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3BhZ2VkX21lbW9y
eS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0
L2Jhc2UvdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2V4dC9pcGMvYmFzaWNfdHlwZXMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKwor
bmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIElQQ0ZyYW1lOworfSAg
Ly8gbmFtZXNwYWNlIGdlbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvcworCituYW1lc3BhY2UgaXBj
IHsKKwordXNpbmcgRnJhbWUgPSA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6SVBDRnJhbWU7CisK
Ky8vIERlc2VyaWFsaXplcyBpbmNvbWluZyBmcmFtZXMsIHRha2luZyBjYXJlIG9mIGJ1ZmZlcmlu
ZyBhbmQgdG9rZW5pemF0aW9uLgorLy8gVXNlZCBieSBib3RoIGhvc3QgYW5kIGNsaWVudCB0byBk
ZWNvZGUgaW5jb21pbmcgZnJhbWVzLgorLy8KKy8vIFdoaWNoIHByb2JsZW0gZG9lcyBpdCBzb2x2
ZT8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSB3aXJlIHByb3RvY29s
IGlzIGFzIGZvbGxvd3M6CisvLyBbMzItYml0IGZyYW1lIHNpemVdW3Byb3RvLWVuY29kZWQgRnJh
bWVdLCBlLmc6CisvLyBbMDYgMDAgMDAgMDBdWzAwIDExIDIyIDMzIDQ0IDU1IDY2XQorLy8gWzAy
IDAwIDAwIDAwXVtBQSBCQl0KKy8vIFswNCAwMCAwMCAwMF1bQ0MgREQgRUUgRkZdCisvLyBIb3dl
dmVyLCBnaXZlbiB0aGF0IHRoZSBzb2NrZXQgd29ya3MgaW4gU09DS19TVFJFQU0gbW9kZSwgdGhl
IHJlY3YoKSBjYWxscworLy8gbWlnaHQgc2VlIHRoZSBmb2xsb3dpbmc6CisvLyAwNiAwMCAwMAor
Ly8gMDAgMDAgMTEgMjIgMzMgNDQgNTUKKy8vIDY2IDAyIDAwIDAwIDAwIC4uLgorLy8gVGhpcyBj
bGFzcyB0YWtlcyBjYXJlIG9mIGJ1ZmZlcmluZyBlZmZpY2llbnRseSB0aGUgZGF0YSByZWNlaXZl
ZCwgd2l0aG91dAorLy8gbWFraW5nIGFueSBhc3N1bXB0aW9uIG9uIGhvdyB0aGUgaW5jb21pbmcg
ZGF0YSB3aWxsIGJlIGNodW5rZWQgYnkgdGhlIHNvY2tldC4KKy8vIEZvciBpbnN0YW5jZSwgaXQg
aXMgcG9zc2libGUgdGhhdCBhIHJlY3YoKSBkb2Vzbid0IHByb2R1Y2UgYW55IGZyYW1lIChiZWNh
dXNlCisvLyBpdCByZWNlaXZlZCBvbmx5IGEgcGFydCBvZiB0aGUgZnJhbWUpIG9yIHByb2R1Y2Vz
IG1vcmUgdGhhbiBvbmUgZnJhbWUuCisvLworLy8gVXNhZ2UKKy8vIC0tLS0tCisvLyBCb3RoIGhv
c3QgYW5kIGNsaWVudCB1c2UgdGhpcyBhcyBmb2xsb3dzOgorLy8KKy8vIGF1dG8gYnVmID0gcnBj
X2ZyYW1lX2RlY29kZXIuQmVnaW5SZWNlaXZlKCk7CisvLyBzaXplX3QgcnNpemUgPSBzb2NrZXQu
cmVjdihidWYuZmlyc3QsIGJ1Zi5zZWNvbmQpOworLy8gcnBjX2ZyYW1lX2RlY29kZXIuRW5kUmVj
ZWl2ZShyc2l6ZSk7CisvLyB3aGlsZSAoRnJhbWUgZnJhbWUgPSBycGNfZnJhbWVfZGVjb2Rlci5Q
b3BOZXh0RnJhbWUoKSkgeworLy8gICAuLi4gcHJvY2VzcyB8ZnJhbWV8CisvLyB9CisvLworLy8g
RGVzaWduIGdvYWxzOgorLy8gLS0tLS0tLS0tLS0tLQorLy8gLSBPcHRpbWl6ZSBmb3IgdGhlIHJl
YWxpc3RpYyBjYXNlIG9mIGVhY2ggcmVjdigpIHJlY2VpdmluZyBvbmUgb3IgbW9yZQorLy8gICB3
aG9sZSBmcmFtZXMuIEluIHRoaXMgY2FzZSBubyBtZW1tb3ZlIGlzIHBlcmZvcm1lZC4KKy8vIC0g
R3VhcmFudGVlIHRoYXQgZnJhbWVzIGxheSBpbiBhIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9y
eSBhcmVhLgorLy8gICBUaGlzIGFsbG93cyB0byB1c2UgdGhlIHByb3RvYnVmLWxpdGUgZGVzZXJp
YWxpemF0aW9uIEFQSSAoc2NhdHRlcmVkCisvLyAgIGRlc2VyaWFsaXphdGlvbiBpcyBzdXBwb3J0
ZWQgb25seSBieSBsaWJwcm90b2J1Zi1mdWxsKS4KKy8vIC0gUHV0IGEgaGFyZCBib3VuZGFyeSB0
byB0aGUgc2l6ZSBvZiB0aGUgaW5jb21pbmcgYnVmZmVyLiBUaGlzIGlzIHRvIHByZXZlbnQKKy8v
ICAgdGhhdCBhIG1hbGljaW91cyBzZW5kcyBhbiBhYm5vcm1hbGx5IGxhcmdlIGZyYW1lIGFuZCBP
T01zIHVzLgorLy8gLSBTaW1wbGljaXR5OiBqdXN0IHVzZSBhIGxpbmVhciBtbWFwIHJlZ2lvbi4g
Tm8gcmVhbGxvY2F0aW9ucyBvciBzY2F0dGVyaW5nLgorLy8gICBUYWtlcyBjYXJlIG9mIG1hZHZp
c2UoKS1pbmcgdW51c2VkIG1lbW9yeS4KKworY2xhc3MgQnVmZmVyZWRGcmFtZURlc2VyaWFsaXpl
ciB7CisgcHVibGljOgorICBzdHJ1Y3QgUmVjZWl2ZUJ1ZmZlciB7CisgICAgY2hhciogZGF0YTsK
KyAgICBzaXplX3Qgc2l6ZTsKKyAgfTsKKworICAvLyB8bWF4X2NhcGFjaXR5fCBpcyBvdmVycmlk
YWJsZSBvbmx5IGZvciB0ZXN0cy4KKyAgZXhwbGljaXQgQnVmZmVyZWRGcmFtZURlc2VyaWFsaXpl
cihzaXplX3QgbWF4X2NhcGFjaXR5ID0ga0lQQ0J1ZmZlclNpemUpOworICB+QnVmZmVyZWRGcmFt
ZURlc2VyaWFsaXplcigpOworCisgIC8vIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZWFsbHkgYmVs
b25nIGhlcmUgYXMgaXQgZG9lcyBTZXJpYWxpemF0aW9uLCB1bmxpa2UKKyAgLy8gdGhlIHJlc3Qg
b2YgdGhpcyBjbGFzcy4gSG93ZXZlciBpdCBpcyBzbyBzbWFsbCBhbmQgaGFzIHNvIG1hbnkgZGVw
ZW5kZW5jaWVzCisgIC8vIGluIGNvbW1vbiB0aGF0IGRvZXNuJ3QganVzdGlmeSBoYXZpbmcgaXRz
IG93biBjbGFzcy4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZShjb25zdCBGcmFtZSYp
OworCisgIC8vIFJldHVybnMgYSBidWZmZXIgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHJlY3YoKS4g
VGhlIGJ1ZmZlciBpcyBkZWxpYmVyYXRlbHkKKyAgLy8gbm90IGluaXRpYWxpemVkLgorICBSZWNl
aXZlQnVmZmVyIEJlZ2luUmVjZWl2ZSgpOworCisgIC8vIE11c3QgYmUgY2FsbGVkIHNvb24gYWZ0
ZXIgQmVnaW5SZWNlaXZlKCkuCisgIC8vIHxyZWN2X3NpemV8IGlzIHRoZSBudW1iZXIgb2YgdmFs
aWQgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiBpbnRvIHRoZQorICAvLyBidWZmZXIgcHJl
dmlvdXNseSByZXR1cm5lZCBieSBCZWdpblJlY2VpdmUoKSAodGhlIHJldHVybiB2YWx1ZSBvZiBy
ZWN2KCkpLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIGEgaGVhZGVyID4gfG1heF9jYXBhY2l0eXwg
aXMgcmVjZWl2ZWQsIGluIHdoaWNoIGNhc2UgdGhlCisgIC8vIGNhbGxlciBpcyBleHBlY3RlZCB0
byBzaHV0ZG93biB0aGUgc29ja2V0IGFuZCB0ZXJtaW5hdGUgdGhlIGlwYy4KKyAgYm9vbCBFbmRS
ZWNlaXZlKHNpemVfdCByZWN2X3NpemUpIFBFUkZFVFRPX1dBUk5fVU5VU0VEX1JFU1VMVDsKKwor
ICAvLyBEZWNvZGVzIGFuZCByZXR1cm5zIHRoZSBuZXh0IGRlY29kZWQgZnJhbWUgaW4gdGhlIGJ1
ZmZlciBpZiBhbnksIG51bGxwdHIKKyAgLy8gaWYgbm8gZnVydGhlciBmcmFtZXMgaGF2ZSBiZWVu
IGRlY29kZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjxGcmFtZT4gUG9wTmV4dEZyYW1lKCk7CisKKyAg
c2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gY2FwYWNpdHlfOyB9CisgIHNpemVfdCBz
aXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworIHByaXZhdGU6CisgIEJ1ZmZlcmVkRnJh
bWVEZXNlcmlhbGl6ZXIoY29uc3QgQnVmZmVyZWRGcmFtZURlc2VyaWFsaXplciYpID0gZGVsZXRl
OworICBCdWZmZXJlZEZyYW1lRGVzZXJpYWxpemVyJiBvcGVyYXRvcj0oY29uc3QgQnVmZmVyZWRG
cmFtZURlc2VyaWFsaXplciYpID0KKyAgICAgIGRlbGV0ZTsKKworICAvLyBJZiBhIHZhbGlkIGZy
YW1lIGlzIGRlY29kZWQgaXQgaXMgYWRkZWQgdG8gfGRlY29kZWRfZnJhbWVzX3wuCisgIHZvaWQg
RGVjb2RlRnJhbWUoY29uc3QgY2hhciosIHNpemVfdCk7CisKKyAgY2hhciogYnVmKCkgeyByZXR1
cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmXy5HZXQoKSk7IH0KKworICBiYXNlOjpQYWdl
ZE1lbW9yeSBidWZfOworICBjb25zdCBzaXplX3QgY2FwYWNpdHlfID0gMDsgIC8vIHNpemVvZih8
YnVmX3wpLgorCisgIC8vIFRIZSBudW1iZXIgb2YgYnl0ZXMgaW4gfGJ1Zl98IHRoYXQgY29udGFp
biB2YWxpZCBkYXRhIChhcyBhIHJlc3VsdCBvZgorICAvLyBFbmRSZWNlaXZlKCkpLiBUaGlzIGlz
IGFsd2F5cyA8PSB8Y2FwYWNpdHlffC4KKyAgc2l6ZV90IHNpemVfID0gMDsKKworICBzdGQ6Omxp
c3Q8c3RkOjp1bmlxdWVfcHRyPEZyYW1lPj4gZGVjb2RlZF9mcmFtZXNfOworfTsKKworfSAgLy8g
bmFtZXNwYWNlIGlwYworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gU1JD
X0lQQ19CVUZGRVJFRF9GUkFNRV9ERVNFUklBTElaRVJfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVu
ZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICog
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
aWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgor
ICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisg
KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp
bmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli
dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ
VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhl
IExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMg
YW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvaXBjL2J1ZmZlcmVkX2ZyYW1lX2Rlc2Vy
aWFsaXplci5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRo
bT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNl
L3V0aWxzLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rv
cy9wZXJmZXR0by9pcGMvd2lyZV9wcm90b2NvbC5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBpcGMgeworCituYW1lc3BhY2UgeworCisvLyBUaGUgaGVhZGVyIGlzIGp1
c3QgdGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgRnJhbWUgcHJvdG9idWYgbWVzc2FnZS4KK2Nv
bnN0ZXhwciBzaXplX3Qga0hlYWRlclNpemUgPSBzaXplb2YodWludDMyX3QpOworfSAgLy8gbmFt
ZXNwYWNlCisKK0J1ZmZlcmVkRnJhbWVEZXNlcmlhbGl6ZXI6OkJ1ZmZlcmVkRnJhbWVEZXNlcmlh
bGl6ZXIoc2l6ZV90IG1heF9jYXBhY2l0eSkKKyAgICA6IGNhcGFjaXR5XyhtYXhfY2FwYWNpdHkp
IHsKKyAgUEVSRkVUVE9fQ0hFQ0sobWF4X2NhcGFjaXR5ICUgYmFzZTo6a1BhZ2VTaXplID09IDAp
OworICBQRVJGRVRUT19DSEVDSyhtYXhfY2FwYWNpdHkgPiBiYXNlOjprUGFnZVNpemUpOworfQor
CitCdWZmZXJlZEZyYW1lRGVzZXJpYWxpemVyOjp+QnVmZmVyZWRGcmFtZURlc2VyaWFsaXplcigp
ID0gZGVmYXVsdDsKKworQnVmZmVyZWRGcmFtZURlc2VyaWFsaXplcjo6UmVjZWl2ZUJ1ZmZlcgor
QnVmZmVyZWRGcmFtZURlc2VyaWFsaXplcjo6QmVnaW5SZWNlaXZlKCkgeworICAvLyBVcG9uIHRo
ZSBmaXJzdCByZWN2IGluaXRpYWxpemUgdGhlIGJ1ZmZlciB0byB0aGUgbWF4IG1lc3NhZ2Ugc2l6
ZSBidXQKKyAgLy8gcmVsZWFzZSB0aGUgcGh5c2ljYWwgbWVtb3J5IGZvciBhbGwgYnV0IHRoZSBm
aXJzdCBwYWdlLiBUaGUga2VybmVsIHdpbGwKKyAgLy8gYXV0b21hdGljYWxseSBnaXZlIHVzIHBo
eXNpY2FsIHBhZ2VzIGJhY2sgYXMgc29vbiBhcyB3ZSBwYWdlLWZhdWx0IG9uIHRoZW0uCisgIGlm
ICghYnVmXy5Jc1ZhbGlkKCkpIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soc2l6ZV8gPT0gMCk7Cisg
ICAgLy8gVE9ETyhlc2Vja2xlcik6IERvbid0IGNvbW1pdCBhbGwgb2YgdGhlIGJ1ZmZlciBhdCBv
bmNlIG9uIFdpbmRvd3MuCisgICAgYnVmXyA9IGJhc2U6OlBhZ2VkTWVtb3J5OjpBbGxvY2F0ZShj
YXBhY2l0eV8pOworCisgICAgLy8gU3VyZWx5IHdlIGFyZSBnb2luZyB0byB1c2UgYXQgbGVhc3Qg
dGhlIGZpcnN0IHBhZ2UsIGJ1dCB3ZSBtYXkgbm90IG5lZWQKKyAgICAvLyB0aGUgcmVzdCBmb3Ig
YSBiaXQuCisgICAgYnVmXy5BZHZpc2VEb250TmVlZChidWYoKSArIGJhc2U6OmtQYWdlU2l6ZSwg
Y2FwYWNpdHlfIC0gYmFzZTo6a1BhZ2VTaXplKTsKKyAgfQorCisgIFBFUkZFVFRPX0NIRUNLKGNh
cGFjaXR5XyA+IHNpemVfKTsKKyAgcmV0dXJuIFJlY2VpdmVCdWZmZXJ7YnVmKCkgKyBzaXplXywg
Y2FwYWNpdHlfIC0gc2l6ZV99OworfQorCitib29sIEJ1ZmZlcmVkRnJhbWVEZXNlcmlhbGl6ZXI6
OkVuZFJlY2VpdmUoc2l6ZV90IHJlY3Zfc2l6ZSkgeworICBQRVJGRVRUT19DSEVDSyhyZWN2X3Np
emUgKyBzaXplXyA8PSBjYXBhY2l0eV8pOworICBzaXplXyArPSByZWN2X3NpemU7CisKKyAgLy8g
QXQgdGhpcyBwb2ludCB0aGUgY29udGVudHMgYnVmXyBjYW4gY29udGFpbjoKKyAgLy8gQSkgT25s
eSBhIGZyYWdtZW50IG9mIHRoZSBoZWFkZXIgKHRoZSBzaXplIG9mIHRoZSBmcmFtZSkuIEUuZy4s
CisgIC8vICAgIDAzIDAwIDAwICh0aGUgaGVhZGVyIGlzIDQgYnl0ZXMsIG9uZSBpcyBtaXNzaW5n
KS4KKyAgLy8KKyAgLy8gQikgQSBoZWFkZXIgYW5kIGEgcGFydCBvZiB0aGUgZnJhbWUuIEUuZy4s
CisgIC8vICAgICAwNSAwMCAwMCAwMCAgICAgICAgIDExIDIyIDMzCisgIC8vICAgIFsgaGVhZGVy
LCBzaXplPTUgXSAgWyBQYXJ0aWFsIGZyYW1lIF0KKyAgLy8KKyAgLy8gQykgT25lIG9yIG1vcmUg
Y29tcGxldGUgaGVhZGVyK2ZyYW1lLiBFLmcuLAorICAvLyAgICAgMDUgMDAgMDAgMDAgICAgICAg
ICAxMSAyMiAzMyA0NCA1NSAgIDAzIDAwIDAwIDAwICAgICAgICBBQSBCQiBDQworICAvLyAgICBb
IGhlYWRlciwgc2l6ZT01IF0gIFsgV2hvbGUgZnJhbWUgXSAgWyBoZWFkZXIsIHNpemU9MyBdIFsg
V2hvbGUgZnJhbWUgXQorICAvLworICAvLyBEKSBTb21lIGNvbXBsZXRlIGhlYWRlcitmcmFtZShz
KSBhbmQgYSBwYXJ0aWFsIGhlYWRlciBvciBmcmFtZSAoQyArIEEvQikuCisgIC8vCisgIC8vIEMg
SXMgdGhlIG1vcmUgbGlrZWx5IGNhc2UgYW5kIHRoZSBvbmUgd2UgYXJlIG9wdGltaXppbmcgZm9y
LiBBLCBCLCBEIGNhbgorICAvLyBoYXBwZW4gYmVjYXVzZSBvZiB0aGUgc3RyZWFtaW5nIG5hdHVy
ZSBvZiB0aGUgc29ja2V0LgorICAvLyBUaGUgaW52YXJpYW50IG9mIHRoaXMgZnVuY3Rpb24gaXMg
dGhhdCwgd2hlbiBpdCByZXR1cm5zLCBidWZfIGlzIGVpdGhlcgorICAvLyBlbXB0eSAod2UgZHJh
aW5lZCBhbGwgdGhlIGNvbXBsZXRlIGZyYW1lcykgb3Igc3RhcnRzIHdpdGggdGhlIGhlYWRlciBv
ZiB0aGUKKyAgLy8gbmV4dCwgc3RpbGwgaW5jb21wbGV0ZSwgZnJhbWUuCisKKyAgc2l6ZV90IGNv
bnN1bWVkX3NpemUgPSAwOworICBmb3IgKDs7KSB7CisgICAgaWYgKHNpemVfIDwgY29uc3VtZWRf
c2l6ZSArIGtIZWFkZXJTaXplKQorICAgICAgYnJlYWs7ICAvLyBDYXNlIEEsIG5vdCBlbm91Z2gg
ZGF0YSB0byByZWFkIGV2ZW4gdGhlIGhlYWRlci4KKworICAgIC8vIFJlYWQgdGhlIGhlYWRlciBp
bnRvIHxwYXlsb2FkX3NpemV8LgorICAgIHVpbnQzMl90IHBheWxvYWRfc2l6ZSA9IDA7CisgICAg
Y29uc3QgY2hhciogcmRfcHRyID0gYnVmKCkgKyBjb25zdW1lZF9zaXplOworICAgIG1lbWNweShi
YXNlOjpBc3N1bWVMaXR0bGVFbmRpYW4oJnBheWxvYWRfc2l6ZSksIHJkX3B0ciwga0hlYWRlclNp
emUpOworCisgICAgLy8gU2F0dXJhdGUgdGhlIHxwYXlsb2FkX3NpemV8IHRvIHByZXZlbnQgb3Zl
cmZsb3dzLiBUaGUgPiBjYXBhY2l0eV8gY2hlY2sKKyAgICAvLyBiZWxvdyB3aWxsIGFib3J0IHRo
ZSBwYXJzaW5nLgorICAgIHNpemVfdCBuZXh0X2ZyYW1lX3NpemUgPQorICAgICAgICBzdGQ6Om1p
bihzdGF0aWNfY2FzdDxzaXplX3Q+KHBheWxvYWRfc2l6ZSksIGNhcGFjaXR5Xyk7CisgICAgbmV4
dF9mcmFtZV9zaXplICs9IGtIZWFkZXJTaXplOworICAgIHJkX3B0ciArPSBrSGVhZGVyU2l6ZTsK
KworICAgIGlmIChzaXplXyA8IGNvbnN1bWVkX3NpemUgKyBuZXh0X2ZyYW1lX3NpemUpIHsKKyAg
ICAgIC8vIENhc2UgQi4gV2UgZ290IHRoZSBoZWFkZXIgYnV0IG5vdCB0aGUgd2hvbGUgZnJhbWUu
CisgICAgICBpZiAobmV4dF9mcmFtZV9zaXplID4gY2FwYWNpdHlfKSB7CisgICAgICAgIC8vIFRo
ZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gc2h1dCBkb3duIHRoZSBzb2NrZXQgYW5kIGdpdmUgdXAg
YXQgdGhpcworICAgICAgICAvLyBwb2ludC4gSWYgaXQgZG9lc24ndCBkbyB0aGF0IGFuZCBpbnNp
c3RzIGdvaW5nIG9uIGF0IHNvbWUgcG9pbnQgaXQKKyAgICAgICAgLy8gd2lsbCBoaXQgdGhlIGNh
cGFjaXR5IGNoZWNrIGluIEJlZ2luUmVjZWl2ZSgpLgorICAgICAgICBQRVJGRVRUT19MT0coIklQ
QyBGcmFtZSB0b28gbGFyZ2UgKHNpemUgJXp1KSIsIG5leHRfZnJhbWVfc2l6ZSk7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIENh
c2UgQy4gV2UgZ290IGF0IGxlYXN0IG9uZSBoZWFkZXIgYW5kIHdob2xlIGZyYW1lLgorICAgIERl
Y29kZUZyYW1lKHJkX3B0ciwgcGF5bG9hZF9zaXplKTsKKyAgICBjb25zdW1lZF9zaXplICs9IG5l
eHRfZnJhbWVfc2l6ZTsKKyAgfQorCisgIFBFUkZFVFRPX0RDSEVDSyhjb25zdW1lZF9zaXplIDw9
IHNpemVfKTsKKyAgaWYgKGNvbnN1bWVkX3NpemUgPiAwKSB7CisgICAgLy8gU2hpZnQgb3V0IHRo
ZSBjb25zdW1lZCBkYXRhIGZyb20gdGhlIGJ1ZmZlci4gSW4gdGhlIHR5cGljYWwgY2FzZSAoQykK
KyAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIHNoaWZ0IHJlYWxseSwganVzdCBzZXR0aW5nIHNp
emVfID0gMCBpcyBlbm91Z2guCisgICAgLy8gU2hpZnRpbmcgaXMgb25seSBmb3IgdGhlICh1bmxp
a2VseSkgY2FzZSBELgorICAgIHNpemVfIC09IGNvbnN1bWVkX3NpemU7CisgICAgaWYgKHNpemVf
ID4gMCkgeworICAgICAgLy8gQ2FzZSBELiBXZSBjb25zdW1lZCBzb21lIGZyYW1lcyBidXQgdGhl
cmUgaXMgYSBsZWZ0b3ZlciBhdCB0aGUgZW5kIG9mCisgICAgICAvLyB0aGUgYnVmZmVyLiBTaGlm
dCBvdXQgdGhlIGNvbnN1bWVkIGJ5dGVzLCBzbyB0aGF0IG9uIHRoZSBuZXh0IHJvdW5kCisgICAg
ICAvLyB8YnVmX3wgc3RhcnRzIHdpdGggdGhlIGhlYWRlciBvZiB0aGUgbmV4dCB1bmNvbnN1bWVk
IGZyYW1lLgorICAgICAgY29uc3QgY2hhciogbW92ZV9iZWdpbiA9IGJ1ZigpICsgY29uc3VtZWRf
c2l6ZTsKKyAgICAgIFBFUkZFVFRPX0NIRUNLKG1vdmVfYmVnaW4gPiBidWYoKSk7CisgICAgICBQ
RVJGRVRUT19DSEVDSyhtb3ZlX2JlZ2luICsgc2l6ZV8gPD0gYnVmKCkgKyBjYXBhY2l0eV8pOwor
ICAgICAgbWVtbW92ZShidWYoKSwgbW92ZV9iZWdpbiwgc2l6ZV8pOworICAgIH0KKyAgICAvLyBJ
ZiB3ZSBqdXN0IGZpbmlzaGVkIGRlY29kaW5nIGEgbGFyZ2UgZnJhbWUgdGhhdCB1c2VkIG1vcmUg
dGhhbiBvbmUgcGFnZSwKKyAgICAvLyByZWxlYXNlIHRoZSBleHRyYSBtZW1vcnkgaW4gdGhlIGJ1
ZmZlci4gTGFyZ2UgZnJhbWVzIHNob3VsZCBiZSBxdWl0ZQorICAgIC8vIHJhcmUuCisgICAgaWYg
KGNvbnN1bWVkX3NpemUgPiBiYXNlOjprUGFnZVNpemUpIHsKKyAgICAgIHNpemVfdCBzaXplX3Jv
dW5kZWRfdXAgPSAoc2l6ZV8gLyBiYXNlOjprUGFnZVNpemUgKyAxKSAqIGJhc2U6OmtQYWdlU2l6
ZTsKKyAgICAgIGlmIChzaXplX3JvdW5kZWRfdXAgPCBjYXBhY2l0eV8pIHsKKyAgICAgICAgY2hh
ciogbWFkdmlzZV9iZWdpbiA9IGJ1ZigpICsgc2l6ZV9yb3VuZGVkX3VwOworICAgICAgICBjb25z
dCBzaXplX3QgbWFkdmlzZV9zaXplID0gY2FwYWNpdHlfIC0gc2l6ZV9yb3VuZGVkX3VwOworICAg
ICAgICBQRVJGRVRUT19DSEVDSyhtYWR2aXNlX2JlZ2luID4gYnVmKCkgKyBzaXplXyk7CisgICAg
ICAgIFBFUkZFVFRPX0NIRUNLKG1hZHZpc2VfYmVnaW4gKyBtYWR2aXNlX3NpemUgPD0gYnVmKCkg
KyBjYXBhY2l0eV8pOworICAgICAgICBidWZfLkFkdmlzZURvbnROZWVkKG1hZHZpc2VfYmVnaW4s
IG1hZHZpc2Vfc2l6ZSk7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIEF0IHRoaXMgcG9pbnQg
fHNpemVffCA9PSAwIGZvciBjYXNlIEMsID4gMCBmb3IgY2FzZXMgQSwgQiwgRC4KKyAgcmV0dXJu
IHRydWU7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxGcmFtZT4gQnVmZmVyZWRGcmFtZURlc2VyaWFs
aXplcjo6UG9wTmV4dEZyYW1lKCkgeworICBpZiAoZGVjb2RlZF9mcmFtZXNfLmVtcHR5KCkpCisg
ICAgcmV0dXJuIG51bGxwdHI7CisgIHN0ZDo6dW5pcXVlX3B0cjxGcmFtZT4gZnJhbWUgPSBzdGQ6
Om1vdmUoZGVjb2RlZF9mcmFtZXNfLmZyb250KCkpOworICBkZWNvZGVkX2ZyYW1lc18ucG9wX2Zy
b250KCk7CisgIHJldHVybiBmcmFtZTsKK30KKwordm9pZCBCdWZmZXJlZEZyYW1lRGVzZXJpYWxp
emVyOjpEZWNvZGVGcmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAo
c2l6ZSA9PSAwKQorICAgIHJldHVybjsKKyAgc3RkOjp1bmlxdWVfcHRyPEZyYW1lPiBmcmFtZShu
ZXcgRnJhbWUpOworICBpZiAoZnJhbWUtPlBhcnNlRnJvbUFycmF5KGRhdGEsIHNpemUpKQorICAg
IGRlY29kZWRfZnJhbWVzXy5wdXNoX2JhY2soc3RkOjptb3ZlKGZyYW1lKSk7Cit9CisKKy8vIHN0
YXRpYworc3RkOjpzdHJpbmcgQnVmZmVyZWRGcmFtZURlc2VyaWFsaXplcjo6U2VyaWFsaXplKGNv
bnN0IEZyYW1lJiBmcmFtZSkgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXlsb2FkID0gZnJh
bWUuU2VyaWFsaXplQXNBcnJheSgpOworICBjb25zdCB1aW50MzJfdCBwYXlsb2FkX3NpemUgPSBz
dGF0aWNfY2FzdDx1aW50MzJfdD4ocGF5bG9hZC5zaXplKCkpOworICBzdGQ6OnN0cmluZyBidWY7
CisgIGJ1Zi5yZXNpemUoa0hlYWRlclNpemUgKyBwYXlsb2FkX3NpemUpOworICBtZW1jcHkoJmJ1
ZlswXSwgYmFzZTo6QXNzdW1lTGl0dGxlRW5kaWFuKCZwYXlsb2FkX3NpemUpLCBrSGVhZGVyU2l6
ZSk7CisgIG1lbWNweSgmYnVmW2tIZWFkZXJTaXplXSwgcGF5bG9hZC5kYXRhKCksIHBheWxvYWQu
c2l6ZSgpKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlwYworfSAgLy8g
bmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMv
aXBjL2RlZmVycmVkLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRl
L3BlcmZldHRvL2V4dC9pcGMvZGVmZXJyZWQuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQvaXBjL2FzeW5jX3Jlc3VsdC5oCisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBM
aWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vu
c2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ug
d2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5z
ZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0Ut
Mi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0
byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2Ug
aXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElF
UyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgor
ICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBl
cm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwor
I2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9JUENfQVNZTkNfUkVTVUxUX0hfCisjZGVmaW5l
IElOQ0xVREVfUEVSRkVUVE9fRVhUX0lQQ19BU1lOQ19SRVNVTFRfSF8KKworI2luY2x1ZGUgPG1l
bW9yeT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvaXBjL2Jhc2lj
X3R5cGVzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgaXBjIHsKKworLy8g
V3JhcHMgdGhlIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgaW52b2NhdGlvbi4gVGhpcyBpcyB0
aGUgZXF1aXZhbGVudCBvZiBhCisvLyBzdGQ6OnBhaXI8dW5pcXVlX3B0cjxUPiwgYm9vbD4gd2l0
aCBzeW50YWN0aWMgc3VnYXIuIEl0IGlzIHVzZWQgYXMgY2FsbGJhY2sKKy8vIGFyZ3VtZW50IGJ5
IERlZmVycmVkPFQ+LiBUIGlzIGEgUHJvdG9NZXNzYWdlIHN1YmNsYXNzIChpLmUuIGdlbmVyYXRl
ZCAucGIuaCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFzeW5jUmVzdWx0IHsKKyBw
dWJsaWM6CisgIHN0YXRpYyBBc3luY1Jlc3VsdCBDcmVhdGUoKSB7CisgICAgcmV0dXJuIEFzeW5j
UmVzdWx0KHN0ZDo6dW5pcXVlX3B0cjxUPihuZXcgVCgpKSk7CisgIH0KKworICBBc3luY1Jlc3Vs
dChzdGQ6OnVuaXF1ZV9wdHI8VD4gbXNnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgYm9vbCBo
YXNfbW9yZSA9IGZhbHNlLAorICAgICAgICAgICAgICBpbnQgZmQgPSAtMSkKKyAgICAgIDogbXNn
XyhzdGQ6Om1vdmUobXNnKSksIGhhc19tb3JlXyhoYXNfbW9yZSksIGZkXyhmZCkgeworICAgIHN0
YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPFByb3RvTWVzc2FnZSwgVD46OnZhbHVlLCAiVC0+
UHJvdG9NZXNzYWdlIik7CisgIH0KKyAgQXN5bmNSZXN1bHQoQXN5bmNSZXN1bHQmJikgbm9leGNl
cHQgPSBkZWZhdWx0OworICBBc3luY1Jlc3VsdCYgb3BlcmF0b3I9KEFzeW5jUmVzdWx0JiYpID0g
ZGVmYXVsdDsKKworICBib29sIHN1Y2Nlc3MoKSBjb25zdCB7IHJldHVybiAhIW1zZ187IH0KKyAg
ZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3MoKTsgfQorCisg
IGJvb2wgaGFzX21vcmUoKSBjb25zdCB7IHJldHVybiBoYXNfbW9yZV87IH0KKyAgdm9pZCBzZXRf
aGFzX21vcmUoYm9vbCBoYXNfbW9yZSkgeyBoYXNfbW9yZV8gPSBoYXNfbW9yZTsgfQorCisgIHZv
aWQgc2V0X21zZyhzdGQ6OnVuaXF1ZV9wdHI8VD4gbXNnKSB7IG1zZ18gPSBzdGQ6Om1vdmUobXNn
KTsgfQorICBUKiByZWxlYXNlX21zZygpIHsgcmV0dXJuIG1zZ18ucmVsZWFzZSgpOyB9CisgIFQq
IG9wZXJhdG9yLT4oKSB7IHJldHVybiBtc2dfLmdldCgpOyB9CisgIFQmIG9wZXJhdG9yKigpIHsg
cmV0dXJuICptc2dfOyB9CisKKyAgdm9pZCBzZXRfZmQoaW50IGZkKSB7IGZkXyA9IGZkOyB9Cisg
IGludCBmZCgpIGNvbnN0IHsgcmV0dXJuIGZkXzsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlx
dWVfcHRyPFQ+IG1zZ187CisgIGJvb2wgaGFzX21vcmVfID0gZmFsc2U7CisKKyAgLy8gT3B0aW9u
YWwuIE9ubHkgZm9yIG1lc3NhZ2VzIHRoYXQgY29udmV5IGEgZmlsZSBkZXNjcmlwdG9yLCBmb3Ig
c2hhcmluZworICAvLyBtZW1vcnkgYWNyb3NzIHByb2Nlc3Nlcy4KKyAgaW50IGZkXyA9IC0xOwor
fTsKKworfSAgLy8gbmFtZXNwYWNlIGlwYworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNl
bmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfSVBDX0FTWU5DX1JFU1VMVF9IXworLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgor
ICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJM
aWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlh
bmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExp
Y2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNF
TlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3Jl
ZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNl
bnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJB
TlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGll
ZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmlu
ZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICov
CisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfSVBDX0RFRkVSUkVEX0hfCisjZGVmaW5l
IElOQ0xVREVfUEVSRkVUVE9fRVhUX0lQQ19ERUZFUlJFRF9IXworCisjaW5jbHVkZSA8ZnVuY3Rp
b25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9hc3luY19yZXN1
bHQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4
dC9pcGMvYmFzaWNfdHlwZXMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBp
cGMgeworCisvLyBUaGlzIGNsYXNzIGlzIGEgd3JhcHBlciBmb3IgYSBjYWxsYmFjayBoYW5kbGlu
ZyBhc3luYyByZXN1bHRzLgorLy8gVGhlIHByb2JsZW0gdGhpcyBpcyBzb2x2aW5nIGlzIHRoZSBm
b2xsb3dpbmc6IEZvciBlYWNoIHJlc3VsdCBhcmd1bWVudCBvZiB0aGUKKy8vIG1ldGhvZHMgZ2Vu
ZXJhdGVkIGZyb20gdGhlIC5wcm90byBmaWxlOgorLy8gLSBUaGUgY2xpZW50IHdhbnRzIHRvIHNl
ZSBzb21ldGhpbmcgb24gd2hpY2ggaXQgY2FuIEJpbmQoKSBhIGNhbGxiYWNrLCB3aGljaAorLy8g
ICBpcyBpbnZva2VkIGFzeW5jaHJvbm91c2x5IG9uY2UgcmVwbHkgaXMgcmVjZWl2ZWQgZnJvbSB0
aGUgaG9zdC4KKy8vIC0gVGhlIGhvc3Qgd2FudHMgdG8gZXhwb3NlIHNvbWV0aGluZyB0byB1c2Vy
IGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBJUEMKKy8vICAgbWV0aG9kcyB0byBhbGxvdyB0aGVt
IHRvIHByb3ZpZGUgYW4gYXN5bmNocm9ub3VzIHJlcGx5IGJhY2sgdG8gdGhlIGNsaWVudC4KKy8v
ICAgRXZlbnR1YWxseSBldmVuIG1vcmUgdGhhbiBvbmNlLCBmb3IgdGhlIGNhc2Ugc3RyZWFtaW5n
IHJlcGxpZXMuCisvLworLy8gSW4gYm90aCBjYXNlcyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0
IGNhbGxiYWNrcyBkb24ndCBnZXQgbG9zdCBhbG9uZyB0aGUKKy8vIHdheS4gVG8gYWRkcmVzcyB0
aGlzLCB0aGlzIGNsYXNzIHdpbGwgYXV0b21hdGljYWxseSByZWplY3QgdGhlIGNhbGxiYWNrcwor
Ly8gaWYgdGhleSBhcmUgbm90IHJlc29sdmVkIGF0IGRlc3RydWN0b3IgdGltZSAob3IgdGhlIG9i
amVjdCBpcyBzdGQ6Om1vdmUoKSdkKS4KKy8vCisvLyBUaGUgY2xpZW50IGlzIHN1cHBvc2VkIHRv
IHVzZSB0aGlzIGNsYXNzIGFzIGZvbGxvd3M6CisvLyAgIGNsYXNzIEdyZWV0ZXJQcm94eSB7Cisv
LyAgICAgIHZvaWQgU2F5SGVsbG8oY29uc3QgSGVsbG9SZXF1ZXN0JiwgRGVmZXJyZWQ8SGVsbG9S
ZXBseT4gcmVwbHkpCisvLyAgIH0KKy8vICAuLi4KKy8vICBEZWZlcnJlZDxIZWxsb1JlcGx5PiBy
ZXBseTsKKy8vICByZXBseS5CaW5kKFtdIChBc3luY1Jlc3VsdDxIZWxsb1JlcGx5PiByZXBseSkg
eworLy8gICAgc3RkOjpjb3V0IDw8IHJlcGx5LnN1Y2Nlc3MoKSA/IHJlcGx5LT5tZXNzYWdlIDog
ImZhaWx1cmUiOworLy8gIH0pOworLy8gIGhvc3RfcHJveHlfaW5zdGFuY2UuU2F5SGVsbG8ocmVx
LCBzdGQ6Om1vdmUocmVwbHkpKTsKKy8vCisvLyBUaGUgaG9zdCBpbnN0ZWFkIGlzIHN1cHBvc2Vk
IHRvIHVzZSB0aGlzIGFzIGZvbGxvd3M6CisvLyAgIGNsYXNzIEdyZWV0ZXJJbXBsIDogcHVibGlj
IEdyZWV0ZXIgeworLy8gICAgIHZvaWQgU2F5SGVsbG8oY29uc3QgSGVsbG9SZXF1ZXN0JiByZXEs
IERlZmVycmVkPEhlbGxvUmVwbHk+IHJlcGx5KSB7CisvLyAgICAgICAgQXN5bmNSZXN1bHQ8SGVs
bG9SZXBseT4gcmVwbHkgPSBBc3luY1Jlc3VsdDxIZWxsb1JlcGx5Pjo6Q3JlYXRlKCk7CisvLyAg
ICAgICAgcmVwbHktPnNldF9ncmVldGluZygiSGVsbG8gIiArIHJlcS5uYW1lKQorLy8gICAgICAg
IHJlcGx5LlJlc29sdmUoc3RkOjptb3ZlKHJlcGx5KSk7CisvLyAgICAgfQorLy8gICB9CisvLyBP
ciBmb3IgbW9yZSBjb21wbGV4IGNhc2VzLCB0aGUgZGVmZXJyZWQgb2JqZWN0IGNhbiBiZSBzdGQ6
Om1vdmUoKSdkIG91dHNpZGUKKy8vIGFuZCB0aGUgcmVwbHkgY2FuIGNvbnRpbnVlIGFzeW5jaHJv
bm91c2x5IGxhdGVyLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERlZmVycmVkOwor
CitjbGFzcyBEZWZlcnJlZEJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRGVmZXJyZWRCYXNl
KAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEFzeW5jUmVzdWx0PFByb3RvTWVzc2FnZT4pPiBj
YWxsYmFjayA9IG51bGxwdHIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBleHBsaWNp
dCBEZWZlcnJlZEJhc2UoRGVmZXJyZWQ8VD4gb3RoZXIpCisgICAgICA6IGNhbGxiYWNrXyhzdGQ6
Om1vdmUob3RoZXIuY2FsbGJhY2tfKSkge30KKworICB+RGVmZXJyZWRCYXNlKCk7CisgIERlZmVy
cmVkQmFzZShEZWZlcnJlZEJhc2UmJikgbm9leGNlcHQ7CisgIERlZmVycmVkQmFzZSYgb3BlcmF0
b3I9KERlZmVycmVkQmFzZSYmKTsKKyAgdm9pZCBCaW5kKHN0ZDo6ZnVuY3Rpb248dm9pZChBc3lu
Y1Jlc3VsdDxQcm90b01lc3NhZ2U+KT4gY2FsbGJhY2spOworICBib29sIElzQm91bmQoKSBjb25z
dDsKKyAgdm9pZCBSZXNvbHZlKEFzeW5jUmVzdWx0PFByb3RvTWVzc2FnZT4pOworICB2b2lkIFJl
amVjdCgpOworCisgcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgZnJpZW5k
IGNsYXNzIERlZmVycmVkOworICB2b2lkIE1vdmUoRGVmZXJyZWRCYXNlJik7CisKKyAgc3RkOjpm
dW5jdGlvbjx2b2lkKEFzeW5jUmVzdWx0PFByb3RvTWVzc2FnZT4pPiBjYWxsYmFja187Cit9Owor
Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gIC8vIFQgOiBQcm90b01lc3NhZ2Ugc3ViY2xhc3MKK2Ns
YXNzIERlZmVycmVkIDogcHVibGljIERlZmVycmVkQmFzZSB7CisgcHVibGljOgorICBleHBsaWNp
dCBEZWZlcnJlZChzdGQ6OmZ1bmN0aW9uPHZvaWQoQXN5bmNSZXN1bHQ8VD4pPiBjYWxsYmFjayA9
IG51bGxwdHIpIHsKKyAgICBCaW5kKHN0ZDo6bW92ZShjYWxsYmFjaykpOworICB9CisKKyAgLy8g
VGhpcyBtb3ZlIGNvbnN0cnVjdG9yIChhbmQgdGhlIHNpbWlsYXIgb25lIGluIERlZmVycmVkQmFz
ZSkgaXMgbWVhbnQgdG8gYmUKKyAgLy8gY2FsbGVkIG9ubHkgYnkgdGhlIGF1dG9nZW5lcmF0ZWQg
Y29kZS4gVGhlIGNhbGxlciBoYXMgdG8gZ3VhcmFudGVlIHRoYXQgdGhlCisgIC8vIG1vdmVkLWZy
b20gYW5kIG1vdmVkLXRvIHR5cGVzIG1hdGNoLiBUaGUgYmVoYXZpb3IgaXMgb3RoZXJ3aXNlIHVu
ZGVmaW5lZC4KKyAgZXhwbGljaXQgRGVmZXJyZWQoRGVmZXJyZWRCYXNlJiYgb3RoZXIpIHsKKyAg
ICBjYWxsYmFja18gPSBzdGQ6Om1vdmUob3RoZXIuY2FsbGJhY2tfKTsKKyAgICBvdGhlci5jYWxs
YmFja18gPSBudWxscHRyOworICB9CisKKyAgdm9pZCBCaW5kKHN0ZDo6ZnVuY3Rpb248dm9pZChB
c3luY1Jlc3VsdDxUPik+IGNhbGxiYWNrKSB7CisgICAgaWYgKCFjYWxsYmFjaykKKyAgICAgIHJl
dHVybjsKKworICAgIC8vIEhlcmUgd2UgbmVlZCBhIGNhbGxiYWNrIGFkYXB0ZXIgdG8gZG93bmNh
c3QgdGhlIGNhbGxiYWNrIHRvIGEgZ2VuZXJpYworICAgIC8vIGNhbGxiYWNrIHRoYXQgdGFrZXMg
YW4gQXN5bmNSZXN1bHQ8UHJvdG9NZXNzYWdlPiwgc28gdGhhdCBpdCBjYW4gYmUKKyAgICAvLyBz
dG9yZWQgaW4gdGhlIGJhc2UgY2xhc3MgfGNhbGxiYWNrX3wuCisgICAgYXV0byBjYWxsYmFja19h
ZGFwdGVyID0gW2NhbGxiYWNrXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5
bmNSZXN1bHQ8UHJvdG9NZXNzYWdlPiBhc3luY19yZXN1bHRfYmFzZSkgeworICAgICAgLy8gVXBj
YXN0IHRoZSBhc3luY19yZXN1bHQgZnJvbSA8UHJvdG9NZXNzYWdlPiAtPiA8VCA6IFByb3RvTWVz
c2FnZT4uCisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxQcm90b01lc3NhZ2Us
IFQ+Ojp2YWx1ZSwgIlQ6UHJvdG9NZXNzYWdlIik7CisgICAgICBBc3luY1Jlc3VsdDxUPiBhc3lu
Y19yZXN1bHQoCisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+KHN0YXRpY19jYXN0PFQqPihh
c3luY19yZXN1bHRfYmFzZS5yZWxlYXNlX21zZygpKSksCisgICAgICAgICAgYXN5bmNfcmVzdWx0
X2Jhc2UuaGFzX21vcmUoKSwgYXN5bmNfcmVzdWx0X2Jhc2UuZmQoKSk7CisgICAgICBjYWxsYmFj
ayhzdGQ6Om1vdmUoYXN5bmNfcmVzdWx0KSk7CisgICAgfTsKKyAgICBEZWZlcnJlZEJhc2U6OkJp
bmQoY2FsbGJhY2tfYWRhcHRlcik7CisgIH0KKworICAvLyBJZiBubyBtb3JlIG1lc3NhZ2VzIGFy
ZSBleHBlY3RlZCwgfGNhbGxiYWNrX3wgaXMgcmVsZWFzZWQuCisgIHZvaWQgUmVzb2x2ZShBc3lu
Y1Jlc3VsdDxUPiBhc3luY19yZXN1bHQpIHsKKyAgICAvLyBDb252ZXJ0IHRoZSB8YXN5bmNfcmVz
dWx0fCB0byB0aGUgZ2VuZXJpYyBiYXNlIG9uZSAoVCAtPiBQcm90b01lc3NhZ2UpLgorICAgIEFz
eW5jUmVzdWx0PFByb3RvTWVzc2FnZT4gYXN5bmNfcmVzdWx0X2Jhc2UoCisgICAgICAgIHN0ZDo6
dW5pcXVlX3B0cjxQcm90b01lc3NhZ2U+KGFzeW5jX3Jlc3VsdC5yZWxlYXNlX21zZygpKSwKKyAg
ICAgICAgYXN5bmNfcmVzdWx0Lmhhc19tb3JlKCksIGFzeW5jX3Jlc3VsdC5mZCgpKTsKKyAgICBE
ZWZlcnJlZEJhc2U6OlJlc29sdmUoc3RkOjptb3ZlKGFzeW5jX3Jlc3VsdF9iYXNlKSk7CisgIH0K
K307CisKK30gIC8vIG5hbWVzcGFjZSBpcGMKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisj
ZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX0lQQ19ERUZFUlJFRF9IXworLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICog
TGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNl
bnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNl
IHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vu
c2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNF
LTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQg
dG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNl
IGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJ
RVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4K
KyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBw
ZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMv
ZGVmZXJyZWQuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9leHQvYmFzZS91dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
bmFtZXNwYWNlIGlwYyB7CisKK0RlZmVycmVkQmFzZTo6RGVmZXJyZWRCYXNlKAorICAgIHN0ZDo6
ZnVuY3Rpb248dm9pZChBc3luY1Jlc3VsdDxQcm90b01lc3NhZ2U+KT4gY2FsbGJhY2spCisgICAg
OiBjYWxsYmFja18oc3RkOjptb3ZlKGNhbGxiYWNrKSkge30KKworRGVmZXJyZWRCYXNlOjp+RGVm
ZXJyZWRCYXNlKCkgeworICBpZiAoY2FsbGJhY2tfKQorICAgIFJlamVjdCgpOworfQorCisvLyBD
YW4ndCBqdXN0IHVzZSAiPSBkZWZhdWx0IiBoZXJlIGJlY2F1c2UgdGhlIGRlZmF1bHQgbW92ZSBv
cGVyYXRvciBmb3IKKy8vIHN0ZDo6ZnVuY3Rpb24gZG9lc24ndCBuZWNlc3NhcmlseSBzd2FwIGFu
ZCBoZW5jZSBjYW4gbGVhdmUgYSBjb3B5IG9mIHRoZQorLy8gYmluZCBzdGF0ZSBhcm91bmQsIHdo
aWNoIGlzIHVuZGVzaXJhYmxlLgorRGVmZXJyZWRCYXNlOjpEZWZlcnJlZEJhc2UoRGVmZXJyZWRC
YXNlJiYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgTW92ZShvdGhlcik7Cit9CisKK0RlZmVycmVkQmFz
ZSYgRGVmZXJyZWRCYXNlOjpvcGVyYXRvcj0oRGVmZXJyZWRCYXNlJiYgb3RoZXIpIHsKKyAgaWYg
KGNhbGxiYWNrXykKKyAgICBSZWplY3QoKTsKKyAgTW92ZShvdGhlcik7CisgIHJldHVybiAqdGhp
czsKK30KKwordm9pZCBEZWZlcnJlZEJhc2U6Ok1vdmUoRGVmZXJyZWRCYXNlJiBvdGhlcikgewor
ICBjYWxsYmFja18gPSBzdGQ6Om1vdmUob3RoZXIuY2FsbGJhY2tfKTsKKyAgb3RoZXIuY2FsbGJh
Y2tfID0gbnVsbHB0cjsKK30KKwordm9pZCBEZWZlcnJlZEJhc2U6OkJpbmQoCisgICAgc3RkOjpm
dW5jdGlvbjx2b2lkKEFzeW5jUmVzdWx0PFByb3RvTWVzc2FnZT4pPiBjYWxsYmFjaykgeworICBj
YWxsYmFja18gPSBzdGQ6Om1vdmUoY2FsbGJhY2spOworfQorCitib29sIERlZmVycmVkQmFzZTo6
SXNCb3VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuICEhY2FsbGJhY2tfOworfQorCit2b2lkIERlZmVy
cmVkQmFzZTo6UmVzb2x2ZShBc3luY1Jlc3VsdDxQcm90b01lc3NhZ2U+IGFzeW5jX3Jlc3VsdCkg
eworICBpZiAoIWNhbGxiYWNrXykgeworICAgIFBFUkZFVFRPX0RGQVRBTCgiTm8gY2FsbGJhY2sg
c2V0LiIpOworICAgIHJldHVybjsKKyAgfQorICBib29sIGhhc19tb3JlID0gYXN5bmNfcmVzdWx0
Lmhhc19tb3JlKCk7CisgIGNhbGxiYWNrXyhzdGQ6Om1vdmUoYXN5bmNfcmVzdWx0KSk7CisgIGlm
ICghaGFzX21vcmUpCisgICAgY2FsbGJhY2tfID0gbnVsbHB0cjsKK30KKworLy8gUmVzb2x2ZXMg
d2l0aCBhIG51bGxwdHIgfG1zZ198LCBzaWduYWxsaW5nIGZhaWx1cmUgdG8gfGNhbGxiYWNrX3wu
Cit2b2lkIERlZmVycmVkQmFzZTo6UmVqZWN0KCkgeworICBSZXNvbHZlKEFzeW5jUmVzdWx0PFBy
b3RvTWVzc2FnZT4oKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpcGMKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL2lwYy92aXJ0
dWFsX2Rlc3RydWN0b3JzLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNs
dWRlL3BlcmZldHRvL2V4dC9pcGMvY2xpZW50LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRo
ZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1h
eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl
LgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAg
ICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxl
c3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNv
ZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBv
biBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMg
T0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vu
c2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisg
KiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVf
UEVSRkVUVE9fRVhUX0lQQ19DTElFTlRfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRf
SVBDX0NMSUVOVF9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9i
YXNlL3Njb3BlZF9maWxlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9leHQvYmFzZS93ZWFrX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9iYXNpY190eXBlcy5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworCituYW1lc3BhY2UgYmFzZSB7CitjbGFzcyBUYXNrUnVubmVyOworfSAg
Ly8gbmFtZXNwYWNlIGJhc2UKKworbmFtZXNwYWNlIGlwYyB7CitjbGFzcyBTZXJ2aWNlUHJveHk7
CisKKy8vIFRoZSBjbGllbnQtc2lkZSBjbGFzcyB0aGF0IHRhbGtzIHRvIHRoZSBob3N0IG92ZXIg
dGhlIHNvY2tldCBhbmQgbXVsdGlwbGV4ZXMKKy8vIHJlcXVlc3RzIGNvbWluZyBmcm9tIHRoZSB2
YXJpb3VzIGF1dG9nZW5lcmF0ZWQgU2VydmljZVByb3h5IHN0dWJzLgorLy8gVGhpcyBpcyBtZWFu
dCB0byBiZSB1c2VkIGJ5IHRoZSB1c2VyIGNvZGUgYXMgZm9sbG93czoKKy8vIGF1dG8gY2xpZW50
ID0gQ2xpZW50OjpDcmVhdGVJbnN0YW5jZSgic29ja2V0X25hbWUiLCB0YXNrX3J1bm5lcik7Cisv
LyBzdGQ6OnVuaXF1ZV9wdHI8R3JlZXRlclNlcnZpY2U+IHN2YyhuZXcgR3JlZXRlclNlcnZpY2Uo
KSk7CisvLyBjbGllbnQuQmluZFNlcnZpY2Uoc3ZjKTsKKy8vIHN2Yy5PbkNvbm5lY3QoW10gKCkg
eworLy8gICAgc3ZjLlNheUhlbGxvKC4uLiwgLi4uKTsKKy8vIH0pOworY2xhc3MgQ2xpZW50IHsK
KyBwdWJsaWM6CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50PiBDcmVhdGVJbnN0YW5j
ZShjb25zdCBjaGFyKiBzb2NrZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJhc2U6OlRhc2tSdW5uZXIqKTsKKyAgdmlydHVhbCB+Q2xpZW50
KCk7CisKKyAgdmlydHVhbCB2b2lkIEJpbmRTZXJ2aWNlKGJhc2U6OldlYWtQdHI8U2VydmljZVBy
b3h5PikgPSAwOworCisgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBl
eHBsaWNpdGx5LiBEZXN0cm95aW5nIHRoZQorICAvLyBTZXJ2aWNlUHJveHkgaW5zdGFuY2UgaXMg
c3VmZmljaWVudCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHVuYmluZCBpdC4gVGhpcworICAvLyBt
ZXRob2QgaXMgZXhwb3NlZCBvbmx5IGZvciB0aGUgU2VydmljZVByb3h5IGRlc3RydWN0b3IuCisg
IHZpcnR1YWwgdm9pZCBVbmJpbmRTZXJ2aWNlKFNlcnZpY2VJRCkgPSAwOworCisgIC8vIFJldHVy
bnMgKHdpdGggbW92ZSBzZW1hbnRpY3MpIHRoZSBsYXN0IGZpbGUgZGVzY3JpcHRvciByZWNlaXZl
ZCBvbiB0aGUgSVBDCisgIC8vIGNoYW5uZWwuIE5vIGJ1ZmZlcmluZyBpcyBwZXJmb3JtZWQ6IGlm
IGEgc2VydmljZSBzZW5kcyB0d28gZmlsZSBkZXNjcmlwdG9ycworICAvLyBhbmQgdGhlIGNhbGxl
ciBkb2Vzbid0IHJlYWQgdGhlbSBpbW1lZGlhdGVseSwgdGhlIGZpcnN0IG9uZSB3aWxsIGJlCisg
IC8vIGF1dG9tYXRpY2FsbHkgY2xvc2VkIHdoZW4gdGhlIHNlY29uZCBpcyByZWNlaXZlZCAoYW5k
IHdpbGwgaGl0IGEgRENIRUNLIGluCisgIC8vIGRlYnVnIGJ1aWxkcykuCisgIHZpcnR1YWwgYmFz
ZTo6U2NvcGVkRmlsZSBUYWtlUmVjZWl2ZWRGRCgpID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFj
ZSBpcGMKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVS
RkVUVE9fRVhUX0lQQ19DTElFTlRfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6
IGluY2x1ZGUvcGVyZmV0dG8vZXh0L2lwYy9ob3N0LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVy
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91
IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl
bnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICog
ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV
bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs
IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl
ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP
TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp
Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xV
REVfUEVSRkVUVE9fRVhUX0lQQ19IT1NUX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhU
X0lQQ19IT1NUX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3Njb3BlZF9maWxlLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvaXBjL2Jhc2lj
X3R5cGVzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKK25hbWVzcGFjZSBiYXNlIHsKK2Ns
YXNzIFRhc2tSdW5uZXI7Cit9ICAvLyBuYW1lc3BhY2UgYmFzZQorCituYW1lc3BhY2UgaXBjIHsK
KworY2xhc3MgU2VydmljZTsKKworLy8gVGhlIGhvc3Qtc2lkZSBvZiB0aGUgSVBDIGxheWVyLiBU
aGlzIGNsYXNzIGFjdHMgYXMgYSByZWdpc3RyeSBhbmQgcmVxdWVzdAorLy8gZGlzcGF0Y2hlci4g
SXQgbGlzdGVuIG9uIHRoZSBVbml4U29ja2V0IHxzb2NrZXRfbmFtZXwgZm9yIGluY29taW5nIHJl
cXVlc3RzCisvLyAoY29taW5nIENsaWVudCBpbnN0YW5jZXMpIGFuZCBkaXNwYXRjaGVzIHRoZWly
IHJlcXVlc3RzIHRvIHRoZSB2YXJpb3VzCisvLyBTZXJ2aWNlcyBleHBvc2VkLgorY2xhc3MgSG9z
dCB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGFuIGluc3RhbmNlIGFuZCBzdGFydHMgbGlzdGVu
aW5nIG9uIHRoZSBnaXZlbiB8c29ja2V0X25hbWV8LgorICAvLyBSZXR1cm5zIG51bGxwdHIgaWYg
bGlzdGVuaW5nIG9uIHRoZSBzb2NrZXQgZmFpbHMuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8
SG9zdD4gQ3JlYXRlSW5zdGFuY2UoY29uc3QgY2hhciogc29ja2V0X25hbWUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGFza1J1bm5lciopOwor
CisgIC8vIExpa2UgdGhlIGFib3ZlIGJ1dCB0YWtlcyBhIGZpbGUgZGVzY3JpcHRvciB0byBhIHBy
ZS1ib3VuZCB1bml4IHNvY2tldC4KKyAgLy8gUmV0dXJucyBudWxscHRyIGlmIGxpc3RlbmluZyBv
biB0aGUgc29ja2V0IGZhaWxzLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEhvc3Q+IENyZWF0
ZUluc3RhbmNlKGJhc2U6OlNjb3BlZEZpbGUgc29ja2V0X2ZkLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRhc2tSdW5uZXIqKTsKKworICB2aXJ0
dWFsIH5Ib3N0KCk7CisKKyAgLy8gUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgYW5kIG1ha2VzIGl0
IGF2YWlsYWJsZSB0byByZW1vdGUgSVBDIHBlZXJzLgorICAvLyBBbGwgdGhlIGV4cG9zZWQgU2Vy
dmljZSBpbnN0YW5jZXMgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiBkZXN0cm95aW5nIHRoZQorICAv
LyBIb3N0IGluc3RhbmNlIGlmIEV4cG9zZVNlcnZpY2Ugc3VjY2VlZHMgYW5kIHJldHVybnMgdHJ1
ZSwgb3IgaW1tZWRpYXRlbHkKKyAgLy8gYWZ0ZXIgdGhlIGNhbGwgaW4gY2FzZSBvZiBmYWlsdXJl
LgorICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlZ2lzdGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxs
eSByZWdpc3RlcmVkLCBmYWxzZSBpbgorICAvLyBjYXNlIG9mIGVycm9ycyAoZS5nLiwgYW5vdGhl
ciBzZXJ2aWNlIHdpdGggdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5CisgIC8vIHJlZ2lzdGVyZWQp
LgorICB2aXJ0dWFsIGJvb2wgRXhwb3NlU2VydmljZShzdGQ6OnVuaXF1ZV9wdHI8U2VydmljZT4p
ID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpcGMKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0
bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX0lQQ19IT1NUX0hfCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9pcGMvc2Vydmlj
ZS5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4
dC9pcGMvY2xpZW50X2luZm8uaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19F
WFRfSVBDX0NMSUVOVF9JTkZPX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX0lQQ19D
TElFTlRfSU5GT19IXworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9iYXNpY190eXBl
cy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGlwYyB7CisKKy8vIFBhc3Nl
ZCB0byBTZXJ2aWNlKHMpIHRvIGlkZW50aWZ5IHJlbW90ZSBjbGllbnRzLgorY2xhc3MgQ2xpZW50
SW5mbyB7CisgcHVibGljOgorICBDbGllbnRJbmZvKCkgPSBkZWZhdWx0OworICBDbGllbnRJbmZv
KENsaWVudElEIGNsaWVudF9pZCwgdWlkX3QgdWlkKQorICAgICAgOiBjbGllbnRfaWRfKGNsaWVu
dF9pZCksIHVpZF8odWlkKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDbGllbnRJbmZv
JiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiAoY2xpZW50X2lkXyA9PSBvdGhlci5jbGllbnRf
aWRfICYmIHVpZF8gPT0gb3RoZXIudWlkXyk7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0
IENsaWVudEluZm8mIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQor
CisgIC8vIEZvciBtYXA8PiBhbmQgb3RoZXIgc29ydGVkIGNvbnRhaW5lcnMuCisgIGJvb2wgb3Bl
cmF0b3I8KGNvbnN0IENsaWVudEluZm8mIG90aGVyKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENI
RUNLKGNsaWVudF9pZF8gIT0gb3RoZXIuY2xpZW50X2lkXyB8fCAqdGhpcyA9PSBvdGhlcik7Cisg
ICAgcmV0dXJuIGNsaWVudF9pZF8gPCBvdGhlci5jbGllbnRfaWRfOworICB9CisKKyAgYm9vbCBp
c192YWxpZCgpIGNvbnN0IHsgcmV0dXJuIGNsaWVudF9pZF8gIT0gMDsgfQorCisgIC8vIEEgbW9u
b3RvbmljIGNvdW50ZXIuCisgIENsaWVudElEIGNsaWVudF9pZCgpIGNvbnN0IHsgcmV0dXJuIGNs
aWVudF9pZF87IH0KKworICAvLyBQb3NpeCBVc2VyIElELiBDb21lcyBmcm9tIHRoZSBrZXJuZWws
IGNhbiBiZSB0cnVzdGVkLgorICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiB1aWRfOyB9CisK
KyBwcml2YXRlOgorICBDbGllbnRJRCBjbGllbnRfaWRfID0gMDsKKyAgdWlkX3QgdWlkXyA9IGtJ
bnZhbGlkVWlkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGlwYworfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfSVBDX0NMSUVOVF9JTkZP
X0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFBy
b2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24g
Mi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0
IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29w
eSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xp
Y2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUg
bGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5k
ZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJ
VEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVz
cyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3Vh
Z2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExp
Y2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9JUENfU0VSVklDRV9I
XworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9JUENfU0VSVklDRV9IXworCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNl
L3Njb3BlZF9maWxlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9leHQvaXBjL2NsaWVudF9pbmZvLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7Citu
YW1lc3BhY2UgaXBjIHsKKworY2xhc3MgU2VydmljZURlc2NyaXB0b3I7CisKKy8vIFRoZSBiYXNl
IGNsYXNzIGZvciBhbGwgdGhlIGF1dG9nZW5lcmF0ZWQgaG9zdC1zaWRlIHNlcnZpY2UgaW50ZXJm
YWNlcy4KK2NsYXNzIFNlcnZpY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+U2VydmljZSgpOwor
CisgIC8vIE92ZXJyaWRkZW4gYnkgdGhlIGF1dG8tZ2VuZXJhdGVkIGNsYXNzLiBQcm92aWRlcyB0
aGUgbGlzdCBvZiBtZXRob2RzIGFuZAorICAvLyB0aGUgcHJvdG9idWYgKGRlKXNlcmlhbGl6YXRp
b24gZnVuY3Rpb25zIGZvciB0aGVpciBhcmd1bWVudHMuCisgIHZpcnR1YWwgY29uc3QgU2Vydmlj
ZURlc2NyaXB0b3ImIEdldERlc2NyaXB0b3IoKSA9IDA7CisKKyAgLy8gSW52b2tlZCB3aGVuIGEg
cmVtb3RlIGNsaWVudCBkaXNjb25uZWN0cy4gVXNlIGNsaWVudF9pbmZvKCkgdG8gb2J0YWluCisg
IC8vIGRldGFpbHMgYWJvdXQgdGhlIGNsaWVudCB0aGF0IGRpc2Nvbm5lY3RlZC4KKyAgdmlydHVh
bCB2b2lkIE9uQ2xpZW50RGlzY29ubmVjdGVkKCkge30KKworICAvLyBSZXR1cm5zIHRoZSBDbGll
bnRJbmZvIGZvciB0aGUgY3VycmVudCBJUEMgcmVxdWVzdC4gUmV0dXJucyBhbiBpbnZhbGlkCisg
IC8vIENsaWVudEluZm8gaWYgY2FsbGVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIGFuIElQQyBtZXRo
b2QuCisgIGNvbnN0IENsaWVudEluZm8mIGNsaWVudF9pbmZvKCkgeworICAgIFBFUkZFVFRPX0RD
SEVDSyhjbGllbnRfaW5mb18uaXNfdmFsaWQoKSk7CisgICAgcmV0dXJuIGNsaWVudF9pbmZvXzsK
KyAgfQorCisgIGJhc2U6OlNjb3BlZEZpbGUgVGFrZVJlY2VpdmVkRkQoKSB7CisgICAgaWYgKHJl
Y2VpdmVkX2ZkXykKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoKnJlY2VpdmVkX2ZkXyk7CisgICAg
cmV0dXJuIGJhc2U6OlNjb3BlZEZpbGUoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNs
YXNzIEhvc3RJbXBsOworICBDbGllbnRJbmZvIGNsaWVudF9pbmZvXzsKKyAgLy8gVGhpcyBpcyBh
IHBvaW50ZXIgYmVjYXVzZSB0aGUgcmVjZWl2ZWQgZmQgbmVlZHMgdG8gcmVtYWluIG93bmVkIGJ5
IHRoZQorICAvLyBDbGllbnRDb25uZWN0aW9uLCBhcyB3ZSB3aWxsIHByb3ZpZGUgaXQgdG8gYWxs
IG1ldGhvZCBpbnZvY2F0aW9ucworICAvLyBmb3IgdGhhdCBjbGllbnQgdW50aWwgb25lIG9mIHRo
ZW0gY2FsbHMgU2VydmljZTo6VGFrZVJlY2VpdmVkRkQuCisgIC8vCisgIC8vIERpZmZlcmVudCBj
bGllbnRzIG1pZ2h0IGhhdmUgc2VudCBkaWZmZXJlbnQgRkRzIHNvIHRoaXMgY2Fubm90IGJlIG93
bmVkCisgIC8vIGhlcmUuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQgdGhl
cmUgY2FuIGFsd2F5cyBvbmx5IGJlIG9uZSBvdXRzdGFuZGluZworICAvLyBpbnZvY2F0aW9uIHBl
ciBjbGllbnQgdGhhdCBzdXBwbGllcyBhbiBGRCBhbmQgdGhlIGNsaWVudCBuZWVkcyB0bworICAv
LyB3YWl0IGZvciB0aGlzIG9uZSB0byByZXR1cm4gYmVmb3JlIGNhbGxpbmcgYW5vdGhlciBvbmUu
CisgIGJhc2U6OlNjb3BlZEZpbGUqIHJlY2VpdmVkX2ZkXzsKK307CisKK30gIC8vIG5hbWVzcGFj
ZSBpcGMKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVS
RkVUVE9fRVhUX0lQQ19TRVJWSUNFX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBpbmNsdWRlL3BlcmZldHRvL2V4dC9pcGMvc2VydmljZV9wcm94eS5oCisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNl
bnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2Ui
KTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0
aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBh
dAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4w
CisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBp
biB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMg
ZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBP
UiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICog
U2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1p
c3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lm
bmRlZiBJTkNMVURFX1BFUkZFVFRPX0VYVF9JUENfU0VSVklDRV9QUk9YWV9IXworI2RlZmluZSBJ
TkNMVURFX1BFUkZFVFRPX0VYVF9JUENfU0VSVklDRV9QUk9YWV9IXworCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvaXBjL2Jhc2ljX3R5cGVzLmgi
CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVk
ZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS93
ZWFrX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vZXh0L2lwYy9kZWZlcnJlZC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNl
IGlwYyB7CisKK2NsYXNzIENsaWVudDsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworCisvLyBU
aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGNsaWVudC1zaWRlIGF1dG9nZW5lcmF0ZWQgc3R1YnMgdGhh
dCBmb3J3YXJkIG1ldGhvZAorLy8gaW52b2NhdGlvbnMgdG8gdGhlIGhvc3QuIEFsbCB0aGUgbWV0
aG9kcyBvZiB0aGlzIGNsYXNzIGFyZSBtZWFudCB0byBiZSBjYWxsZWQKKy8vIG9ubHkgYnkgdGhl
IGF1dG9nZW5lcmF0ZWQgY29kZS4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBTZXJ2aWNlUHJveHkg
eworIHB1YmxpYzoKKyAgY2xhc3MgRXZlbnRMaXN0ZW5lciB7CisgICBwdWJsaWM6CisgICAgdmly
dHVhbCB+RXZlbnRMaXN0ZW5lcigpOworCisgICAgLy8gQ2FsbGVkIG9uY2UgYWZ0ZXIgQ2xpZW50
OjpCaW5kU2VydmljZSgpIGlmIHRoZSBTZXJ2aWNlUHJveHkgaGFzIGJlZW4KKyAgICAvLyBzdWNj
ZXNzZnVsbHkgYm91bmQgdG8gdGhlIGhvc3QuIEl0IGlzIHBvc3NpYmxlIHRvIHN0YXJ0IHNlbmRp
bmcgSVBDCisgICAgLy8gcmVxdWVzdHMgc29vbiBhZnRlciB0aGlzLgorICAgIHZpcnR1YWwgdm9p
ZCBPbkNvbm5lY3QoKSB7fQorCisgICAgLy8gQ2FsbGVkIGlmIHRoZSBjb25uZWN0aW9uIGZhaWxz
IHRvIGJlIGVzdGFibGlzaGVkIG9yIGRyb3BzIGFmdGVyIGhhdmluZworICAgIC8vIGJlZW4gZXN0
YWJsaXNoZWQuCisgICAgdmlydHVhbCB2b2lkIE9uRGlzY29ubmVjdCgpIHt9CisgIH07CisKKyAg
Ly8gR3VhcmFudGVlcyB0aGF0IG5vIGNhbGxiYWNrIHdpbGwgaGFwcGVuIGFmdGVyIHRoaXMgb2Jq
ZWN0IGhhcyBiZWVuCisgIC8vIGRlc3Ryb3llZC4gVGhlIGNhbGxlciBoYXMgdG8gZ3VhcmFudGVl
IHRoYXQgdGhlIHxldmVudF9saXN0ZW5lcnwgc3RheXMKKyAgLy8gYWxpdmUgYXQgbGVhc3QgYXMg
bG9uZyBhcyB0aGUgU2VydmljZVByb3h5IGluc3RhbmNlLgorICBleHBsaWNpdCBTZXJ2aWNlUHJv
eHkoRXZlbnRMaXN0ZW5lciopOworICB2aXJ0dWFsIH5TZXJ2aWNlUHJveHkoKTsKKworICB2b2lk
IEluaXRpYWxpemVCaW5kaW5nKGJhc2U6OldlYWtQdHI8Q2xpZW50PiwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICBTZXJ2aWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8
c3RkOjpzdHJpbmcsIE1ldGhvZElEPik7CisKKyAgLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbWV0aG9k
cyBpbiB0aGUgYXV0b2dlbmVyYXRlZCBjbGFzc2VzLgorICB2b2lkIEJlZ2luSW52b2tlKGNvbnN0
IHN0ZDo6c3RyaW5nJiBtZXRob2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQcm90
b01lc3NhZ2UmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgRGVmZXJyZWRCYXNlIHJlcGx5
LAorICAgICAgICAgICAgICAgICAgIGludCBmZCA9IC0xKTsKKworICAvLyBDYWxsZWQgYnkgQ2xp
ZW50SW1wbC4KKyAgLy8gfHJlcGx5X2FyZ3N8ID09IG51bGxwdHIgbWVhbnMgcmVxdWVzdCBmYWls
dXJlLgorICB2b2lkIEVuZEludm9rZShSZXF1ZXN0SUQsCisgICAgICAgICAgICAgICAgIHN0ZDo6
dW5pcXVlX3B0cjxQcm90b01lc3NhZ2U+IHJlcGx5X2FyZywKKyAgICAgICAgICAgICAgICAgYm9v
bCBoYXNfbW9yZSk7CisKKyAgLy8gQ2FsbGVkIGJ5IENsaWVudEltcGwuCisgIHZvaWQgT25Db25u
ZWN0KGJvb2wgc3VjY2Vzcyk7CisgIHZvaWQgT25EaXNjb25uZWN0KCk7CisgIGJvb2wgY29ubmVj
dGVkKCkgY29uc3QgeyByZXR1cm4gc2VydmljZV9pZF8gIT0gMDsgfQorCisgIGJhc2U6OldlYWtQ
dHI8U2VydmljZVByb3h5PiBHZXRXZWFrUHRyKCkgY29uc3Q7CisKKyAgLy8gSW1wbGVtZW50ZWQg
YnkgdGhlIGF1dG9nZW5lcmF0ZWQgY2xhc3MuCisgIHZpcnR1YWwgY29uc3QgU2VydmljZURlc2Ny
aXB0b3ImIEdldERlc2NyaXB0b3IoKSA9IDA7CisKKyBwcml2YXRlOgorICBiYXNlOjpXZWFrUHRy
PENsaWVudD4gY2xpZW50XzsKKyAgU2VydmljZUlEIHNlcnZpY2VfaWRfID0gMDsKKyAgc3RkOjpt
YXA8c3RkOjpzdHJpbmcsIE1ldGhvZElEPiByZW1vdGVfbWV0aG9kX2lkc187CisgIHN0ZDo6bWFw
PFJlcXVlc3RJRCwgRGVmZXJyZWRCYXNlPiBwZW5kaW5nX2NhbGxiYWNrc187CisgIEV2ZW50TGlz
dGVuZXIqIGNvbnN0IGV2ZW50X2xpc3RlbmVyXzsKKyAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8U2Vy
dmljZVByb3h5PiB3ZWFrX3B0cl9mYWN0b3J5XzsgIC8vIEtlZXAgbGFzdC4KK307CisKK30gIC8v
IG5hbWVzcGFjZSBpcGMKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElO
Q0xVREVfUEVSRkVUVE9fRVhUX0lQQ19TRVJWSUNFX1BST1hZX0hfCisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNl
ZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsK
KyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0
aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAor
ICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisg
KgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3
cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz
dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD
T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2Vl
IHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Np
b25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9jbGllbnQu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9p
cGMvaG9zdC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vZXh0L2lwYy9zZXJ2aWNlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9leHQvaXBjL3NlcnZpY2VfcHJveHkuaCIKKworLy8gVGhpcyB0cmFuc2xh
dGlvbiB1bml0IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIGRlc3RydWN0b3Igb2Yg
cHVyZQorLy8gdmlydHVhbCBpbnRlcmZhY2VzIGZvciB0aGUgY3VycmVudCBidWlsZCB0YXJnZXQu
IFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZQorLy8gaW50cm9kdWNpbmcgYSBvbmUtbGluZXIgLmNj
IGZpbGUgZm9yIGVhY2ggcHVyZSB2aXJ0dWFsIGludGVyZmFjZSwgd2hpY2ggaXMKKy8vIG92ZXJr
aWxsLiBUaGlzIGlzIGZvciBjb21wbGlhbmNlIHdpdGggLVd3ZWFrLXZ0YWJsZXMuCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgaXBjIHsKKworQ2xpZW50Ojp+Q2xpZW50KCkgPSBk
ZWZhdWx0OworSG9zdDo6fkhvc3QoKSA9IGRlZmF1bHQ7CitTZXJ2aWNlOjp+U2VydmljZSgpID0g
ZGVmYXVsdDsKK1NlcnZpY2VQcm94eTo6RXZlbnRMaXN0ZW5lcjo6fkV2ZW50TGlzdGVuZXIoKSA9
IGRlZmF1bHQ7CisKK30gIC8vIG5hbWVzcGFjZSBpcGMKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0
bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogZ2VuL3Byb3Rvcy9wZXJmZXR0by9p
cGMvY29uc3VtZXJfcG9ydC5pcGMuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6
IGdlbi9wcm90b3MvcGVyZmV0dG8vaXBjL2NvbnN1bWVyX3BvcnQuaXBjLmgKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L2lwYy9zZXJ2aWNlX2Rl
c2NyaXB0b3IuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNv
dXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBW
ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxl
IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFp
biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hl
Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBs
aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs
CisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy
IGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj
IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVy
IHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfSVBDX1NF
UlZJQ0VfREVTQ1JJUFRPUl9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9JUENfU0VS
VklDRV9ERVNDUklQVE9SX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0
cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9iYXNpY190eXBl
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0
L2lwYy9kZWZlcnJlZC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGlwYyB7
CisKK2NsYXNzIFNlcnZpY2U7CisKKy8vIFRoaXMgaXMgYSBwdXJlIGRhdGEgc3RydWN0dXJlIHdo
aWNoIGhvbGRzIGZhY3RvcnkgbWV0aG9kcyBhbmQgc3RyaW5ncyBmb3IgdGhlCisvLyBzZXJ2aWNl
cyBhbmQgdGhlaXIgbWV0aG9kcyB0aGF0IGdldCBnZW5lcmF0ZWQgaW4gdGhlIC5oLy5jYyBmaWxl
cy4KKy8vIEVhY2ggYXV0b2dlbmVyYXRlZCBjbGFzcyBoYXMgYSBHZXREZXNjcmlwdG9yKCkgbWV0
aG9kIHRoYXQgcmV0dXJucyBvbmUKKy8vIGluc3RhbmNlIG9mIHRoZXNlIGFuZCBhbGxvd3MgYm90
aCBjbGllbnQgYW5kIGhvc3RzIHRvIG1hcCBzZXJ2aWNlIGFuZCBtZXRob2QKKy8vIG5hbWVzIHRv
IElEcyBhbmQgcHJvdmlkZSBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgcHJvdG9idWYgZGVjb2Rl
ciBmdWN0aW9ucy4KK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIHN0cnVj
dCBNZXRob2QgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisKKyAgICAvLyBEZWNvZGVyRnVuYyBp
cyBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHN0cmluZyBpbiBpbnB1dAorICAg
IC8vIGNvbnRhaW5pbmcgcHJvdG9idWYgZW5jb2RlZCBkYXRhIGFuZCByZXR1cm5zIGEgZGVjb2Rl
ZCBwcm90b2J1ZiBtZXNzYWdlLgorICAgIHVzaW5nIERlY29kZXJGdW5jID0gc3RkOjp1bmlxdWVf
cHRyPFByb3RvTWVzc2FnZT4gKCopKGNvbnN0IHN0ZDo6c3RyaW5nJik7CisKKyAgICAvLyBGdW5j
dGlvbiBwb2ludGVyIHRvIGRlY29kZSB0aGUgcmVxdWVzdCBhcmd1bWVudCBvZiB0aGUgbWV0aG9k
LgorICAgIERlY29kZXJGdW5jIHJlcXVlc3RfcHJvdG9fZGVjb2RlcjsKKworICAgIC8vIEZ1bmN0
aW9uIHBvaW50ZXIgdG8gZGVjb2RlZCB0aGUgcmVwbHkgYXJndW1lbnQgb2YgdGhlIG1ldGhvZC4K
KyAgICBEZWNvZGVyRnVuYyByZXBseV9wcm90b19kZWNvZGVyOworCisgICAgLy8gRnVuY3Rpb24g
cG9pbnRlciB0aGF0IGRpc3BhdGNoZXMgdGhlIGdlbmVyaWMgcmVxdWVzdCB0byB0aGUgY29ycmVz
cG9uZGluZworICAgIC8vIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KKyAgICB1c2luZyBJbnZva2Vy
RnVuYyA9IHZvaWQgKCopKFNlcnZpY2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgUHJvdG9NZXNzYWdlJiAvKiByZXF1ZXN0X2FyZ3MgKi8sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZEJhc2UgLyogZGVmZXJyZWRfcmVwbHkgKi8pOwor
ICAgIEludm9rZXJGdW5jIGludm9rZXI7CisgIH07CisKKyAgY29uc3QgY2hhciogc2VydmljZV9u
YW1lID0gbnVsbHB0cjsKKworICAvLyBOb3RlIHRoYXQgbWV0aG9kcyBvcmRlciBpcyBub3Qgc3Rh
YmxlLiBDbGllbnQgYW5kIEhvc3QgbWlnaHQgaGF2ZSBkaWZmZXJlbnQKKyAgLy8gbWV0aG9kIGlu
ZGV4ZXMsIGRlcGVuZGluZyBvbiB0aGVpciB2ZXJzaW9ucy4gVGhlIENsaWVudCBjYW4ndCBqdXN0
IHJlbHkKKyAgLy8gb24gdGhlIGluZGV4ZXMgYW5kIGhhcyB0byBrZWVwIGEgW3N0cmluZyAtPiBy
ZW1vdGUgaW5kZXhdIHRyYW5zbGF0aW9uIG1hcC4KKyAgc3RkOjp2ZWN0b3I8TWV0aG9kPiBtZXRo
b2RzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGlwYworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRv
CisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfSVBDX1NFUlZJQ0VfREVTQ1JJUFRP
Ul9IXworLy8gRE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gSVBDCisjaWZu
ZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fSVBDX0NPTlNVTUVSX1BPUlRfUFJP
VE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19JUENfQ09OU1VN
RVJfUE9SVF9QUk9UT19IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9leHQvaXBjL2RlZmVycmVkLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvaXBjL3NlcnZpY2UuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvc2VydmljZV9kZXNjcmlw
dG9yLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9l
eHQvaXBjL3NlcnZpY2VfcHJveHkuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2lwYy9jb25zdW1lcl9wb3J0Lmdlbi5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi9v
YnNlcnZhYmxlX2V2ZW50cy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24vdHJhY2luZ19zZXJ2aWNlX3N0YXRlLmdlbi5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRv
L2NvbW1vbi90cmFjaW5nX3NlcnZpY2VfY2FwYWJpbGl0aWVzLmdlbi5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2NvbW1vbi90cmFjZV9z
dGF0cy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rv
cy9wZXJmZXR0by9jb25maWcvdHJhY2VfY29uZmlnLmdlbi5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworY2xhc3MgQ29uc3Vt
ZXJQb3J0IDogcHVibGljIDo6cGVyZmV0dG86OmlwYzo6U2VydmljZSB7CisgcHJpdmF0ZToKKyAg
c3RhdGljIDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3IqIE5ld0Rlc2NyaXB0b3Io
KTsKKworIHB1YmxpYzoKKyAgfkNvbnN1bWVyUG9ydCgpIG92ZXJyaWRlOworCisgIHN0YXRpYyBj
b25zdCA6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yJiBHZXREZXNjcmlwdG9yU3Rh
dGljKCk7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KKyAgY29uc3QgOjpwZXJmZXR0
bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvciYgR2V0RGVzY3JpcHRvcigpIG92ZXJyaWRlOworCisg
IC8vIE1ldGhvZHMgZnJvbSB0aGUgLnByb3RvIGZpbGUKKyAgdXNpbmcgRGVmZXJyZWRFbmFibGVU
cmFjaW5nUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPEVuYWJsZVRyYWNpbmdS
ZXNwb25zZT47CisgIHZpcnR1YWwgdm9pZCBFbmFibGVUcmFjaW5nKGNvbnN0IEVuYWJsZVRyYWNp
bmdSZXF1ZXN0JiwgRGVmZXJyZWRFbmFibGVUcmFjaW5nUmVzcG9uc2UpID0gMDsKKworICB1c2lu
ZyBEZWZlcnJlZERpc2FibGVUcmFjaW5nUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVy
cmVkPERpc2FibGVUcmFjaW5nUmVzcG9uc2U+OworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZVRyYWNp
bmcoY29uc3QgRGlzYWJsZVRyYWNpbmdSZXF1ZXN0JiwgRGVmZXJyZWREaXNhYmxlVHJhY2luZ1Jl
c3BvbnNlKSA9IDA7CisKKyAgdXNpbmcgRGVmZXJyZWRSZWFkQnVmZmVyc1Jlc3BvbnNlID0gOjpw
ZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxSZWFkQnVmZmVyc1Jlc3BvbnNlPjsKKyAgdmlydHVhbCB2
b2lkIFJlYWRCdWZmZXJzKGNvbnN0IFJlYWRCdWZmZXJzUmVxdWVzdCYsIERlZmVycmVkUmVhZEJ1
ZmZlcnNSZXNwb25zZSkgPSAwOworCisgIHVzaW5nIERlZmVycmVkRnJlZUJ1ZmZlcnNSZXNwb25z
ZSA9IDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWQ8RnJlZUJ1ZmZlcnNSZXNwb25zZT47CisgIHZp
cnR1YWwgdm9pZCBGcmVlQnVmZmVycyhjb25zdCBGcmVlQnVmZmVyc1JlcXVlc3QmLCBEZWZlcnJl
ZEZyZWVCdWZmZXJzUmVzcG9uc2UpID0gMDsKKworICB1c2luZyBEZWZlcnJlZEZsdXNoUmVzcG9u
c2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPEZsdXNoUmVzcG9uc2U+OworICB2aXJ0dWFs
IHZvaWQgRmx1c2goY29uc3QgRmx1c2hSZXF1ZXN0JiwgRGVmZXJyZWRGbHVzaFJlc3BvbnNlKSA9
IDA7CisKKyAgdXNpbmcgRGVmZXJyZWRTdGFydFRyYWNpbmdSZXNwb25zZSA9IDo6cGVyZmV0dG86
OmlwYzo6RGVmZXJyZWQ8U3RhcnRUcmFjaW5nUmVzcG9uc2U+OworICB2aXJ0dWFsIHZvaWQgU3Rh
cnRUcmFjaW5nKGNvbnN0IFN0YXJ0VHJhY2luZ1JlcXVlc3QmLCBEZWZlcnJlZFN0YXJ0VHJhY2lu
Z1Jlc3BvbnNlKSA9IDA7CisKKyAgdXNpbmcgRGVmZXJyZWRDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3Bv
bnNlID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3BvbnNl
PjsKKyAgdmlydHVhbCB2b2lkIENoYW5nZVRyYWNlQ29uZmlnKGNvbnN0IENoYW5nZVRyYWNlQ29u
ZmlnUmVxdWVzdCYsIERlZmVycmVkQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSkgPSAwOworCisg
IHVzaW5nIERlZmVycmVkRGV0YWNoUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVk
PERldGFjaFJlc3BvbnNlPjsKKyAgdmlydHVhbCB2b2lkIERldGFjaChjb25zdCBEZXRhY2hSZXF1
ZXN0JiwgRGVmZXJyZWREZXRhY2hSZXNwb25zZSkgPSAwOworCisgIHVzaW5nIERlZmVycmVkQXR0
YWNoUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPEF0dGFjaFJlc3BvbnNlPjsK
KyAgdmlydHVhbCB2b2lkIEF0dGFjaChjb25zdCBBdHRhY2hSZXF1ZXN0JiwgRGVmZXJyZWRBdHRh
Y2hSZXNwb25zZSkgPSAwOworCisgIHVzaW5nIERlZmVycmVkR2V0VHJhY2VTdGF0c1Jlc3BvbnNl
ID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxHZXRUcmFjZVN0YXRzUmVzcG9uc2U+OworICB2
aXJ0dWFsIHZvaWQgR2V0VHJhY2VTdGF0cyhjb25zdCBHZXRUcmFjZVN0YXRzUmVxdWVzdCYsIERl
ZmVycmVkR2V0VHJhY2VTdGF0c1Jlc3BvbnNlKSA9IDA7CisKKyAgdXNpbmcgRGVmZXJyZWRPYnNl
cnZlRXZlbnRzUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPE9ic2VydmVFdmVu
dHNSZXNwb25zZT47CisgIHZpcnR1YWwgdm9pZCBPYnNlcnZlRXZlbnRzKGNvbnN0IE9ic2VydmVF
dmVudHNSZXF1ZXN0JiwgRGVmZXJyZWRPYnNlcnZlRXZlbnRzUmVzcG9uc2UpID0gMDsKKworICB1
c2luZyBEZWZlcnJlZFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6
OkRlZmVycmVkPFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2U+OworICB2aXJ0dWFsIHZvaWQgUXVl
cnlTZXJ2aWNlU3RhdGUoY29uc3QgUXVlcnlTZXJ2aWNlU3RhdGVSZXF1ZXN0JiwgRGVmZXJyZWRR
dWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlKSA9IDA7CisKKyAgdXNpbmcgRGVmZXJyZWRRdWVyeUNh
cGFiaWxpdGllc1Jlc3BvbnNlID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxRdWVyeUNhcGFi
aWxpdGllc1Jlc3BvbnNlPjsKKyAgdmlydHVhbCB2b2lkIFF1ZXJ5Q2FwYWJpbGl0aWVzKGNvbnN0
IFF1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdCYsIERlZmVycmVkUXVlcnlDYXBhYmlsaXRpZXNSZXNw
b25zZSkgPSAwOworCit9OworCisKK2NsYXNzIENvbnN1bWVyUG9ydFByb3h5IDogcHVibGljIDo6
cGVyZmV0dG86OmlwYzo6U2VydmljZVByb3h5IHsKKyBwdWJsaWM6CisgICBleHBsaWNpdCBDb25z
dW1lclBvcnRQcm94eSg6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VQcm94eTo6RXZlbnRMaXN0ZW5l
ciopOworICAgfkNvbnN1bWVyUG9ydFByb3h5KCkgb3ZlcnJpZGU7CisKKyAgLy8gU2VydmljZVBy
b3h5IGltcGxlbWVudGF0aW9uLgorICBjb25zdCA6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNj
cmlwdG9yJiBHZXREZXNjcmlwdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8gTWV0aG9kcyBmcm9tIHRo
ZSAucHJvdG8gZmlsZQorICB1c2luZyBEZWZlcnJlZEVuYWJsZVRyYWNpbmdSZXNwb25zZSA9IDo6
cGVyZmV0dG86OmlwYzo6RGVmZXJyZWQ8RW5hYmxlVHJhY2luZ1Jlc3BvbnNlPjsKKyAgdm9pZCBF
bmFibGVUcmFjaW5nKGNvbnN0IEVuYWJsZVRyYWNpbmdSZXF1ZXN0JiwgRGVmZXJyZWRFbmFibGVU
cmFjaW5nUmVzcG9uc2UsIGludCBmZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJlZERpc2FibGVU
cmFjaW5nUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPERpc2FibGVUcmFjaW5n
UmVzcG9uc2U+OworICB2b2lkIERpc2FibGVUcmFjaW5nKGNvbnN0IERpc2FibGVUcmFjaW5nUmVx
dWVzdCYsIERlZmVycmVkRGlzYWJsZVRyYWNpbmdSZXNwb25zZSwgaW50IGZkID0gLTEpOworCisg
IHVzaW5nIERlZmVycmVkUmVhZEJ1ZmZlcnNSZXNwb25zZSA9IDo6cGVyZmV0dG86OmlwYzo6RGVm
ZXJyZWQ8UmVhZEJ1ZmZlcnNSZXNwb25zZT47CisgIHZvaWQgUmVhZEJ1ZmZlcnMoY29uc3QgUmVh
ZEJ1ZmZlcnNSZXF1ZXN0JiwgRGVmZXJyZWRSZWFkQnVmZmVyc1Jlc3BvbnNlLCBpbnQgZmQgPSAt
MSk7CisKKyAgdXNpbmcgRGVmZXJyZWRGcmVlQnVmZmVyc1Jlc3BvbnNlID0gOjpwZXJmZXR0bzo6
aXBjOjpEZWZlcnJlZDxGcmVlQnVmZmVyc1Jlc3BvbnNlPjsKKyAgdm9pZCBGcmVlQnVmZmVycyhj
b25zdCBGcmVlQnVmZmVyc1JlcXVlc3QmLCBEZWZlcnJlZEZyZWVCdWZmZXJzUmVzcG9uc2UsIGlu
dCBmZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJlZEZsdXNoUmVzcG9uc2UgPSA6OnBlcmZldHRv
OjppcGM6OkRlZmVycmVkPEZsdXNoUmVzcG9uc2U+OworICB2b2lkIEZsdXNoKGNvbnN0IEZsdXNo
UmVxdWVzdCYsIERlZmVycmVkRmx1c2hSZXNwb25zZSwgaW50IGZkID0gLTEpOworCisgIHVzaW5n
IERlZmVycmVkU3RhcnRUcmFjaW5nUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVk
PFN0YXJ0VHJhY2luZ1Jlc3BvbnNlPjsKKyAgdm9pZCBTdGFydFRyYWNpbmcoY29uc3QgU3RhcnRU
cmFjaW5nUmVxdWVzdCYsIERlZmVycmVkU3RhcnRUcmFjaW5nUmVzcG9uc2UsIGludCBmZCA9IC0x
KTsKKworICB1c2luZyBEZWZlcnJlZENoYW5nZVRyYWNlQ29uZmlnUmVzcG9uc2UgPSA6OnBlcmZl
dHRvOjppcGM6OkRlZmVycmVkPENoYW5nZVRyYWNlQ29uZmlnUmVzcG9uc2U+OworICB2b2lkIENo
YW5nZVRyYWNlQ29uZmlnKGNvbnN0IENoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdCYsIERlZmVycmVk
Q2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSwgaW50IGZkID0gLTEpOworCisgIHVzaW5nIERlZmVy
cmVkRGV0YWNoUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPERldGFjaFJlc3Bv
bnNlPjsKKyAgdm9pZCBEZXRhY2goY29uc3QgRGV0YWNoUmVxdWVzdCYsIERlZmVycmVkRGV0YWNo
UmVzcG9uc2UsIGludCBmZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJlZEF0dGFjaFJlc3BvbnNl
ID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxBdHRhY2hSZXNwb25zZT47CisgIHZvaWQgQXR0
YWNoKGNvbnN0IEF0dGFjaFJlcXVlc3QmLCBEZWZlcnJlZEF0dGFjaFJlc3BvbnNlLCBpbnQgZmQg
PSAtMSk7CisKKyAgdXNpbmcgRGVmZXJyZWRHZXRUcmFjZVN0YXRzUmVzcG9uc2UgPSA6OnBlcmZl
dHRvOjppcGM6OkRlZmVycmVkPEdldFRyYWNlU3RhdHNSZXNwb25zZT47CisgIHZvaWQgR2V0VHJh
Y2VTdGF0cyhjb25zdCBHZXRUcmFjZVN0YXRzUmVxdWVzdCYsIERlZmVycmVkR2V0VHJhY2VTdGF0
c1Jlc3BvbnNlLCBpbnQgZmQgPSAtMSk7CisKKyAgdXNpbmcgRGVmZXJyZWRPYnNlcnZlRXZlbnRz
UmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPE9ic2VydmVFdmVudHNSZXNwb25z
ZT47CisgIHZvaWQgT2JzZXJ2ZUV2ZW50cyhjb25zdCBPYnNlcnZlRXZlbnRzUmVxdWVzdCYsIERl
ZmVycmVkT2JzZXJ2ZUV2ZW50c1Jlc3BvbnNlLCBpbnQgZmQgPSAtMSk7CisKKyAgdXNpbmcgRGVm
ZXJyZWRRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJl
ZDxRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlPjsKKyAgdm9pZCBRdWVyeVNlcnZpY2VTdGF0ZShj
b25zdCBRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3QmLCBEZWZlcnJlZFF1ZXJ5U2VydmljZVN0YXRl
UmVzcG9uc2UsIGludCBmZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJlZFF1ZXJ5Q2FwYWJpbGl0
aWVzUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPFF1ZXJ5Q2FwYWJpbGl0aWVz
UmVzcG9uc2U+OworICB2b2lkIFF1ZXJ5Q2FwYWJpbGl0aWVzKGNvbnN0IFF1ZXJ5Q2FwYWJpbGl0
aWVzUmVxdWVzdCYsIERlZmVycmVkUXVlcnlDYXBhYmlsaXRpZXNSZXNwb25zZSwgaW50IGZkID0g
LTEpOworCit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBw
cm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1Nf
UFJPVE9TX1BFUkZFVFRPX0lQQ19DT05TVU1FUl9QT1JUX1BST1RPX0hfCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9pcGMvY29kZWdlbl9oZWxw
ZXJzLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2Ug
UHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lv
biAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcv
bGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJs
ZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1
bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICog
V0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHBy
ZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5n
dWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUg
TGljZW5zZS4KKyAqLworCisvLyBUaGlzIGZpbGUgaXMgb25seSBtZWFudCB0byBiZSBpbmNsdWRl
ZCBpbiBhdXRvZ2VuZXJhdGVkIC5jYyBmaWxlcy4KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRP
X0VYVF9JUENfQ09ERUdFTl9IRUxQRVJTX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhU
X0lQQ19DT0RFR0VOX0hFTFBFUlNfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9iYXNpY190eXBl
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0
L2lwYy9kZWZlcnJlZC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vZXh0L2lwYy9zZXJ2aWNlLmgiCisKKy8vIEEgdGVtcGxhdGVkIHByb3RvYnVmIG1l
c3NhZ2UgZGVjb2Rlci4gUmV0dXJucyBudWxscHRyIGluIGNhc2Ugb2YgZmFpbHVyZS4KK3RlbXBs
YXRlIDx0eXBlbmFtZSBUPgorOjpzdGQ6OnVuaXF1ZV9wdHI8OjpwZXJmZXR0bzo6aXBjOjpQcm90
b01lc3NhZ2U+IF9JUENfRGVjb2RlcigKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvdG9fZGF0
YSkgeworICA6OnN0ZDo6dW5pcXVlX3B0cjw6OnBlcmZldHRvOjppcGM6OlByb3RvTWVzc2FnZT4g
bXNnKG5ldyBUKCkpOworICBpZiAobXNnLT5QYXJzZUZyb21TdHJpbmcocHJvdG9fZGF0YSkpCisg
ICAgcmV0dXJuIG1zZzsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIFRlbXBsYXRlZCBtZXRo
b2QgZGlzcGF0Y2hlci4gVXNlZCB0byBvYnRhaW4gYSBmdW5jdGlvbiBwb2ludGVyIHRvIGEgZ2l2
ZW4KKy8vIElQQyBtZXRob2QgKE1ldGhvZCkgb2YgYSBnaXZlbiBzZXJ2aWNlIChUU3ZjKSB0aGF0
IGNhbiBiZSBpbnZva2VkIGJ5IHRoZQorLy8gaG9zdC1zaWRlIG1hY2hpbmVyeSBzdGFydGluZyBm
cm9tIGEgZ2VuZXJpYyBTZXJ2aWNlIHBvaW50ZXIgYW5kIGEgZ2VuZXJpYworLy8gUHJvdG9NZXNz
YWdlIHJlcXVlc3QgYXJndW1lbnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFN2YywgICAgLy8gVHlw
ZSBvZiB0aGUgYWN0dWFsIFNlcnZpY2Ugc3ViY2xhc3MuCisgICAgICAgICAgdHlwZW5hbWUgVFJl
cSwgICAgLy8gVHlwZSBvZiB0aGUgcmVxdWVzdCBhcmd1bWVudC4KKyAgICAgICAgICB0eXBlbmFt
ZSBUUmVwbHksICAvLyBUeXBlIG9mIHRoZSByZXBseSBhcmd1bWVudC4KKyAgICAgICAgICB2b2lk
IChUU3ZjOjoqTWV0aG9kKShjb25zdCBUUmVxJiwgOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxU
UmVwbHk+KT4KK3ZvaWQgX0lQQ19JbnZva2VyKDo6cGVyZmV0dG86OmlwYzo6U2VydmljZSogcywK
KyAgICAgICAgICAgICAgICAgIGNvbnN0IDo6cGVyZmV0dG86OmlwYzo6UHJvdG9NZXNzYWdlJiBy
ZXEsCisgICAgICAgICAgICAgICAgICA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkQmFzZSByZXBs
eSkgeworICAoKnN0YXRpY19jYXN0PFRTdmMqPihzKS4qTWV0aG9kKSgKKyAgICAgIHN0YXRpY19j
YXN0PGNvbnN0IFRSZXEmPihyZXEpLAorICAgICAgOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxU
UmVwbHk+KDo6c3RkOjptb3ZlKHJlcGx5KSkpOworfQorCisjZW5kaWYgIC8vIElOQ0xVREVfUEVS
RkVUVE9fRVhUX0lQQ19DT0RFR0VOX0hFTFBFUlNfSF8KKy8vIERPIE5PVCBFRElULiBBdXRvZ2Vu
ZXJhdGVkIGJ5IFBlcmZldHRvIElQQworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicHJvdG9zL3BlcmZldHRvL2lwYy9jb25zdW1lcl9wb3J0LmlwYy5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9jb2RlZ2VuX2hl
bHBlcnMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25h
bWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7Cis6OnBlcmZldHRvOjppcGM6OlNlcnZp
Y2VEZXNjcmlwdG9yKiBDb25zdW1lclBvcnQ6Ok5ld0Rlc2NyaXB0b3IoKSB7CisgIGF1dG8qIGRl
c2MgPSBuZXcgOjpwZXJmZXR0bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvcigpOworICBkZXNjLT5z
ZXJ2aWNlX25hbWUgPSAiQ29uc3VtZXJQb3J0IjsKKworICBkZXNjLT5tZXRob2RzLmVtcGxhY2Vf
YmFjayg6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yOjpNZXRob2R7CisgICAgICJF
bmFibGVUcmFjaW5nIiwKKyAgICAgJl9JUENfRGVjb2RlcjxFbmFibGVUcmFjaW5nUmVxdWVzdD4s
CisgICAgICZfSVBDX0RlY29kZXI8RW5hYmxlVHJhY2luZ1Jlc3BvbnNlPiwKKyAgICAgJl9JUENf
SW52b2tlcjxDb25zdW1lclBvcnQsIEVuYWJsZVRyYWNpbmdSZXF1ZXN0LCBFbmFibGVUcmFjaW5n
UmVzcG9uc2UsICZDb25zdW1lclBvcnQ6OkVuYWJsZVRyYWNpbmc+fSk7CisKKyAgZGVzYy0+bWV0
aG9kcy5lbXBsYWNlX2JhY2soOjpwZXJmZXR0bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvcjo6TWV0
aG9keworICAgICAiRGlzYWJsZVRyYWNpbmciLAorICAgICAmX0lQQ19EZWNvZGVyPERpc2FibGVU
cmFjaW5nUmVxdWVzdD4sCisgICAgICZfSVBDX0RlY29kZXI8RGlzYWJsZVRyYWNpbmdSZXNwb25z
ZT4sCisgICAgICZfSVBDX0ludm9rZXI8Q29uc3VtZXJQb3J0LCBEaXNhYmxlVHJhY2luZ1JlcXVl
c3QsIERpc2FibGVUcmFjaW5nUmVzcG9uc2UsICZDb25zdW1lclBvcnQ6OkRpc2FibGVUcmFjaW5n
Pn0pOworCisgIGRlc2MtPm1ldGhvZHMuZW1wbGFjZV9iYWNrKDo6cGVyZmV0dG86OmlwYzo6U2Vy
dmljZURlc2NyaXB0b3I6Ok1ldGhvZHsKKyAgICAgIlJlYWRCdWZmZXJzIiwKKyAgICAgJl9JUENf
RGVjb2RlcjxSZWFkQnVmZmVyc1JlcXVlc3Q+LAorICAgICAmX0lQQ19EZWNvZGVyPFJlYWRCdWZm
ZXJzUmVzcG9uc2U+LAorICAgICAmX0lQQ19JbnZva2VyPENvbnN1bWVyUG9ydCwgUmVhZEJ1ZmZl
cnNSZXF1ZXN0LCBSZWFkQnVmZmVyc1Jlc3BvbnNlLCAmQ29uc3VtZXJQb3J0OjpSZWFkQnVmZmVy
cz59KTsKKworICBkZXNjLT5tZXRob2RzLmVtcGxhY2VfYmFjayg6OnBlcmZldHRvOjppcGM6OlNl
cnZpY2VEZXNjcmlwdG9yOjpNZXRob2R7CisgICAgICJGcmVlQnVmZmVycyIsCisgICAgICZfSVBD
X0RlY29kZXI8RnJlZUJ1ZmZlcnNSZXF1ZXN0PiwKKyAgICAgJl9JUENfRGVjb2RlcjxGcmVlQnVm
ZmVyc1Jlc3BvbnNlPiwKKyAgICAgJl9JUENfSW52b2tlcjxDb25zdW1lclBvcnQsIEZyZWVCdWZm
ZXJzUmVxdWVzdCwgRnJlZUJ1ZmZlcnNSZXNwb25zZSwgJkNvbnN1bWVyUG9ydDo6RnJlZUJ1ZmZl
cnM+fSk7CisKKyAgZGVzYy0+bWV0aG9kcy5lbXBsYWNlX2JhY2soOjpwZXJmZXR0bzo6aXBjOjpT
ZXJ2aWNlRGVzY3JpcHRvcjo6TWV0aG9keworICAgICAiRmx1c2giLAorICAgICAmX0lQQ19EZWNv
ZGVyPEZsdXNoUmVxdWVzdD4sCisgICAgICZfSVBDX0RlY29kZXI8Rmx1c2hSZXNwb25zZT4sCisg
ICAgICZfSVBDX0ludm9rZXI8Q29uc3VtZXJQb3J0LCBGbHVzaFJlcXVlc3QsIEZsdXNoUmVzcG9u
c2UsICZDb25zdW1lclBvcnQ6OkZsdXNoPn0pOworCisgIGRlc2MtPm1ldGhvZHMuZW1wbGFjZV9i
YWNrKDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3I6Ok1ldGhvZHsKKyAgICAgIlN0
YXJ0VHJhY2luZyIsCisgICAgICZfSVBDX0RlY29kZXI8U3RhcnRUcmFjaW5nUmVxdWVzdD4sCisg
ICAgICZfSVBDX0RlY29kZXI8U3RhcnRUcmFjaW5nUmVzcG9uc2U+LAorICAgICAmX0lQQ19JbnZv
a2VyPENvbnN1bWVyUG9ydCwgU3RhcnRUcmFjaW5nUmVxdWVzdCwgU3RhcnRUcmFjaW5nUmVzcG9u
c2UsICZDb25zdW1lclBvcnQ6OlN0YXJ0VHJhY2luZz59KTsKKworICBkZXNjLT5tZXRob2RzLmVt
cGxhY2VfYmFjayg6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yOjpNZXRob2R7Cisg
ICAgICJDaGFuZ2VUcmFjZUNvbmZpZyIsCisgICAgICZfSVBDX0RlY29kZXI8Q2hhbmdlVHJhY2VD
b25maWdSZXF1ZXN0PiwKKyAgICAgJl9JUENfRGVjb2RlcjxDaGFuZ2VUcmFjZUNvbmZpZ1Jlc3Bv
bnNlPiwKKyAgICAgJl9JUENfSW52b2tlcjxDb25zdW1lclBvcnQsIENoYW5nZVRyYWNlQ29uZmln
UmVxdWVzdCwgQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSwgJkNvbnN1bWVyUG9ydDo6Q2hhbmdl
VHJhY2VDb25maWc+fSk7CisKKyAgZGVzYy0+bWV0aG9kcy5lbXBsYWNlX2JhY2soOjpwZXJmZXR0
bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvcjo6TWV0aG9keworICAgICAiRGV0YWNoIiwKKyAgICAg
Jl9JUENfRGVjb2RlcjxEZXRhY2hSZXF1ZXN0PiwKKyAgICAgJl9JUENfRGVjb2RlcjxEZXRhY2hS
ZXNwb25zZT4sCisgICAgICZfSVBDX0ludm9rZXI8Q29uc3VtZXJQb3J0LCBEZXRhY2hSZXF1ZXN0
LCBEZXRhY2hSZXNwb25zZSwgJkNvbnN1bWVyUG9ydDo6RGV0YWNoPn0pOworCisgIGRlc2MtPm1l
dGhvZHMuZW1wbGFjZV9iYWNrKDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3I6Ok1l
dGhvZHsKKyAgICAgIkF0dGFjaCIsCisgICAgICZfSVBDX0RlY29kZXI8QXR0YWNoUmVxdWVzdD4s
CisgICAgICZfSVBDX0RlY29kZXI8QXR0YWNoUmVzcG9uc2U+LAorICAgICAmX0lQQ19JbnZva2Vy
PENvbnN1bWVyUG9ydCwgQXR0YWNoUmVxdWVzdCwgQXR0YWNoUmVzcG9uc2UsICZDb25zdW1lclBv
cnQ6OkF0dGFjaD59KTsKKworICBkZXNjLT5tZXRob2RzLmVtcGxhY2VfYmFjayg6OnBlcmZldHRv
OjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yOjpNZXRob2R7CisgICAgICJHZXRUcmFjZVN0YXRzIiwK
KyAgICAgJl9JUENfRGVjb2RlcjxHZXRUcmFjZVN0YXRzUmVxdWVzdD4sCisgICAgICZfSVBDX0Rl
Y29kZXI8R2V0VHJhY2VTdGF0c1Jlc3BvbnNlPiwKKyAgICAgJl9JUENfSW52b2tlcjxDb25zdW1l
clBvcnQsIEdldFRyYWNlU3RhdHNSZXF1ZXN0LCBHZXRUcmFjZVN0YXRzUmVzcG9uc2UsICZDb25z
dW1lclBvcnQ6OkdldFRyYWNlU3RhdHM+fSk7CisKKyAgZGVzYy0+bWV0aG9kcy5lbXBsYWNlX2Jh
Y2soOjpwZXJmZXR0bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvcjo6TWV0aG9keworICAgICAiT2Jz
ZXJ2ZUV2ZW50cyIsCisgICAgICZfSVBDX0RlY29kZXI8T2JzZXJ2ZUV2ZW50c1JlcXVlc3Q+LAor
ICAgICAmX0lQQ19EZWNvZGVyPE9ic2VydmVFdmVudHNSZXNwb25zZT4sCisgICAgICZfSVBDX0lu
dm9rZXI8Q29uc3VtZXJQb3J0LCBPYnNlcnZlRXZlbnRzUmVxdWVzdCwgT2JzZXJ2ZUV2ZW50c1Jl
c3BvbnNlLCAmQ29uc3VtZXJQb3J0OjpPYnNlcnZlRXZlbnRzPn0pOworCisgIGRlc2MtPm1ldGhv
ZHMuZW1wbGFjZV9iYWNrKDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3I6Ok1ldGhv
ZHsKKyAgICAgIlF1ZXJ5U2VydmljZVN0YXRlIiwKKyAgICAgJl9JUENfRGVjb2RlcjxRdWVyeVNl
cnZpY2VTdGF0ZVJlcXVlc3Q+LAorICAgICAmX0lQQ19EZWNvZGVyPFF1ZXJ5U2VydmljZVN0YXRl
UmVzcG9uc2U+LAorICAgICAmX0lQQ19JbnZva2VyPENvbnN1bWVyUG9ydCwgUXVlcnlTZXJ2aWNl
U3RhdGVSZXF1ZXN0LCBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlLCAmQ29uc3VtZXJQb3J0OjpR
dWVyeVNlcnZpY2VTdGF0ZT59KTsKKworICBkZXNjLT5tZXRob2RzLmVtcGxhY2VfYmFjayg6OnBl
cmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yOjpNZXRob2R7CisgICAgICJRdWVyeUNhcGFi
aWxpdGllcyIsCisgICAgICZfSVBDX0RlY29kZXI8UXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0PiwK
KyAgICAgJl9JUENfRGVjb2RlcjxRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlPiwKKyAgICAgJl9J
UENfSW52b2tlcjxDb25zdW1lclBvcnQsIFF1ZXJ5Q2FwYWJpbGl0aWVzUmVxdWVzdCwgUXVlcnlD
YXBhYmlsaXRpZXNSZXNwb25zZSwgJkNvbnN1bWVyUG9ydDo6UXVlcnlDYXBhYmlsaXRpZXM+fSk7
CisgIGRlc2MtPm1ldGhvZHMuc2hyaW5rX3RvX2ZpdCgpOworICByZXR1cm4gZGVzYzsKK30KKwor
Citjb25zdCA6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yJiBDb25zdW1lclBvcnQ6
OkdldERlc2NyaXB0b3JTdGF0aWMoKSB7CisgIHN0YXRpYyBhdXRvKiBpbnN0YW5jZSA9IE5ld0Rl
c2NyaXB0b3IoKTsKKyAgcmV0dXJuICppbnN0YW5jZTsKK30KKworLy8gSG9zdC1zaWRlIGRlZmlu
aXRpb25zLgorQ29uc3VtZXJQb3J0Ojp+Q29uc3VtZXJQb3J0KCkgPSBkZWZhdWx0OworCitjb25z
dCA6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yJiBDb25zdW1lclBvcnQ6OkdldERl
c2NyaXB0b3IoKSB7CisgIHJldHVybiBHZXREZXNjcmlwdG9yU3RhdGljKCk7Cit9CisKKy8vIENs
aWVudC1zaWRlIGRlZmluaXRpb25zLgorQ29uc3VtZXJQb3J0UHJveHk6OkNvbnN1bWVyUG9ydFBy
b3h5KDo6cGVyZmV0dG86OmlwYzo6U2VydmljZVByb3h5OjpFdmVudExpc3RlbmVyKiBldmVudF9s
aXN0ZW5lcikKKyAgICA6IDo6cGVyZmV0dG86OmlwYzo6U2VydmljZVByb3h5KGV2ZW50X2xpc3Rl
bmVyKSB7fQorCitDb25zdW1lclBvcnRQcm94eTo6fkNvbnN1bWVyUG9ydFByb3h5KCkgPSBkZWZh
dWx0OworCitjb25zdCA6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yJiBDb25zdW1l
clBvcnRQcm94eTo6R2V0RGVzY3JpcHRvcigpIHsKKyAgcmV0dXJuIENvbnN1bWVyUG9ydDo6R2V0
RGVzY3JpcHRvclN0YXRpYygpOworfQorCit2b2lkIENvbnN1bWVyUG9ydFByb3h5OjpFbmFibGVU
cmFjaW5nKGNvbnN0IEVuYWJsZVRyYWNpbmdSZXF1ZXN0JiByZXF1ZXN0LCBEZWZlcnJlZEVuYWJs
ZVRyYWNpbmdSZXNwb25zZSByZXBseSwgaW50IGZkKSB7CisgIEJlZ2luSW52b2tlKCJFbmFibGVU
cmFjaW5nIiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZEJhc2Uoc3RkOjptb3Zl
KHJlcGx5KSksCisgICAgICAgICAgICAgIGZkKTsKK30KKwordm9pZCBDb25zdW1lclBvcnRQcm94
eTo6RGlzYWJsZVRyYWNpbmcoY29uc3QgRGlzYWJsZVRyYWNpbmdSZXF1ZXN0JiByZXF1ZXN0LCBE
ZWZlcnJlZERpc2FibGVUcmFjaW5nUmVzcG9uc2UgcmVwbHksIGludCBmZCkgeworICBCZWdpbklu
dm9rZSgiRGlzYWJsZVRyYWNpbmciLCByZXF1ZXN0LCA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVk
QmFzZShzdGQ6Om1vdmUocmVwbHkpKSwKKyAgICAgICAgICAgICAgZmQpOworfQorCit2b2lkIENv
bnN1bWVyUG9ydFByb3h5OjpSZWFkQnVmZmVycyhjb25zdCBSZWFkQnVmZmVyc1JlcXVlc3QmIHJl
cXVlc3QsIERlZmVycmVkUmVhZEJ1ZmZlcnNSZXNwb25zZSByZXBseSwgaW50IGZkKSB7CisgIEJl
Z2luSW52b2tlKCJSZWFkQnVmZmVycyIsIHJlcXVlc3QsIDo6cGVyZmV0dG86OmlwYzo6RGVmZXJy
ZWRCYXNlKHN0ZDo6bW92ZShyZXBseSkpLAorICAgICAgICAgICAgICBmZCk7Cit9CisKK3ZvaWQg
Q29uc3VtZXJQb3J0UHJveHk6OkZyZWVCdWZmZXJzKGNvbnN0IEZyZWVCdWZmZXJzUmVxdWVzdCYg
cmVxdWVzdCwgRGVmZXJyZWRGcmVlQnVmZmVyc1Jlc3BvbnNlIHJlcGx5LCBpbnQgZmQpIHsKKyAg
QmVnaW5JbnZva2UoIkZyZWVCdWZmZXJzIiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBjOjpEZWZl
cnJlZEJhc2Uoc3RkOjptb3ZlKHJlcGx5KSksCisgICAgICAgICAgICAgIGZkKTsKK30KKwordm9p
ZCBDb25zdW1lclBvcnRQcm94eTo6Rmx1c2goY29uc3QgRmx1c2hSZXF1ZXN0JiByZXF1ZXN0LCBE
ZWZlcnJlZEZsdXNoUmVzcG9uc2UgcmVwbHksIGludCBmZCkgeworICBCZWdpbkludm9rZSgiRmx1
c2giLCByZXF1ZXN0LCA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkQmFzZShzdGQ6Om1vdmUocmVw
bHkpKSwKKyAgICAgICAgICAgICAgZmQpOworfQorCit2b2lkIENvbnN1bWVyUG9ydFByb3h5OjpT
dGFydFRyYWNpbmcoY29uc3QgU3RhcnRUcmFjaW5nUmVxdWVzdCYgcmVxdWVzdCwgRGVmZXJyZWRT
dGFydFRyYWNpbmdSZXNwb25zZSByZXBseSwgaW50IGZkKSB7CisgIEJlZ2luSW52b2tlKCJTdGFy
dFRyYWNpbmciLCByZXF1ZXN0LCA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkQmFzZShzdGQ6Om1v
dmUocmVwbHkpKSwKKyAgICAgICAgICAgICAgZmQpOworfQorCit2b2lkIENvbnN1bWVyUG9ydFBy
b3h5OjpDaGFuZ2VUcmFjZUNvbmZpZyhjb25zdCBDaGFuZ2VUcmFjZUNvbmZpZ1JlcXVlc3QmIHJl
cXVlc3QsIERlZmVycmVkQ2hhbmdlVHJhY2VDb25maWdSZXNwb25zZSByZXBseSwgaW50IGZkKSB7
CisgIEJlZ2luSW52b2tlKCJDaGFuZ2VUcmFjZUNvbmZpZyIsIHJlcXVlc3QsIDo6cGVyZmV0dG86
OmlwYzo6RGVmZXJyZWRCYXNlKHN0ZDo6bW92ZShyZXBseSkpLAorICAgICAgICAgICAgICBmZCk7
Cit9CisKK3ZvaWQgQ29uc3VtZXJQb3J0UHJveHk6OkRldGFjaChjb25zdCBEZXRhY2hSZXF1ZXN0
JiByZXF1ZXN0LCBEZWZlcnJlZERldGFjaFJlc3BvbnNlIHJlcGx5LCBpbnQgZmQpIHsKKyAgQmVn
aW5JbnZva2UoIkRldGFjaCIsIHJlcXVlc3QsIDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWRCYXNl
KHN0ZDo6bW92ZShyZXBseSkpLAorICAgICAgICAgICAgICBmZCk7Cit9CisKK3ZvaWQgQ29uc3Vt
ZXJQb3J0UHJveHk6OkF0dGFjaChjb25zdCBBdHRhY2hSZXF1ZXN0JiByZXF1ZXN0LCBEZWZlcnJl
ZEF0dGFjaFJlc3BvbnNlIHJlcGx5LCBpbnQgZmQpIHsKKyAgQmVnaW5JbnZva2UoIkF0dGFjaCIs
IHJlcXVlc3QsIDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWRCYXNlKHN0ZDo6bW92ZShyZXBseSkp
LAorICAgICAgICAgICAgICBmZCk7Cit9CisKK3ZvaWQgQ29uc3VtZXJQb3J0UHJveHk6OkdldFRy
YWNlU3RhdHMoY29uc3QgR2V0VHJhY2VTdGF0c1JlcXVlc3QmIHJlcXVlc3QsIERlZmVycmVkR2V0
VHJhY2VTdGF0c1Jlc3BvbnNlIHJlcGx5LCBpbnQgZmQpIHsKKyAgQmVnaW5JbnZva2UoIkdldFRy
YWNlU3RhdHMiLCByZXF1ZXN0LCA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkQmFzZShzdGQ6Om1v
dmUocmVwbHkpKSwKKyAgICAgICAgICAgICAgZmQpOworfQorCit2b2lkIENvbnN1bWVyUG9ydFBy
b3h5OjpPYnNlcnZlRXZlbnRzKGNvbnN0IE9ic2VydmVFdmVudHNSZXF1ZXN0JiByZXF1ZXN0LCBE
ZWZlcnJlZE9ic2VydmVFdmVudHNSZXNwb25zZSByZXBseSwgaW50IGZkKSB7CisgIEJlZ2luSW52
b2tlKCJPYnNlcnZlRXZlbnRzIiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZEJh
c2Uoc3RkOjptb3ZlKHJlcGx5KSksCisgICAgICAgICAgICAgIGZkKTsKK30KKwordm9pZCBDb25z
dW1lclBvcnRQcm94eTo6UXVlcnlTZXJ2aWNlU3RhdGUoY29uc3QgUXVlcnlTZXJ2aWNlU3RhdGVS
ZXF1ZXN0JiByZXF1ZXN0LCBEZWZlcnJlZFF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2UgcmVwbHks
IGludCBmZCkgeworICBCZWdpbkludm9rZSgiUXVlcnlTZXJ2aWNlU3RhdGUiLCByZXF1ZXN0LCA6
OnBlcmZldHRvOjppcGM6OkRlZmVycmVkQmFzZShzdGQ6Om1vdmUocmVwbHkpKSwKKyAgICAgICAg
ICAgICAgZmQpOworfQorCit2b2lkIENvbnN1bWVyUG9ydFByb3h5OjpRdWVyeUNhcGFiaWxpdGll
cyhjb25zdCBRdWVyeUNhcGFiaWxpdGllc1JlcXVlc3QmIHJlcXVlc3QsIERlZmVycmVkUXVlcnlD
YXBhYmlsaXRpZXNSZXNwb25zZSByZXBseSwgaW50IGZkKSB7CisgIEJlZ2luSW52b2tlKCJRdWVy
eUNhcGFiaWxpdGllcyIsIHJlcXVlc3QsIDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWRCYXNlKHN0
ZDo6bW92ZShyZXBseSkpLAorICAgICAgICAgICAgICBmZCk7Cit9Cit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IGdlbi9wcm90b3MvcGVyZmV0dG8vaXBjL3By
b2R1Y2VyX3BvcnQuaXBjLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4v
cHJvdG9zL3BlcmZldHRvL2lwYy9wcm9kdWNlcl9wb3J0LmlwYy5oCisvLyBETyBOT1QgRURJVC4g
QXV0b2dlbmVyYXRlZCBieSBQZXJmZXR0byBJUEMKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BS
T1RPU19QRVJGRVRUT19JUENfUFJPRFVDRVJfUE9SVF9QUk9UT19IXworI2RlZmluZSBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0lQQ19QUk9EVUNFUl9QT1JUX1BST1RPX0hfCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvZGVm
ZXJyZWQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2V4dC9pcGMvc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L2lwYy9zZXJ2aWNlX2Rlc2NyaXB0b3IuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvc2VydmljZV9wcm94eS5o
IgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0
dG8vaXBjL3Byb2R1Y2VyX3BvcnQuZ2VuLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2NvbW1pdF9kYXRhX3JlcXVlc3QuZ2Vu
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0
dG8vY29uZmlnL2RhdGFfc291cmNlX2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb21tb24vZGF0YV9zb3VyY2VfZGVz
Y3JpcHRvci5nZW4uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mg
eworbmFtZXNwYWNlIGdlbiB7CisKK2NsYXNzIFByb2R1Y2VyUG9ydCA6IHB1YmxpYyA6OnBlcmZl
dHRvOjppcGM6OlNlcnZpY2UgeworIHByaXZhdGU6CisgIHN0YXRpYyA6OnBlcmZldHRvOjppcGM6
OlNlcnZpY2VEZXNjcmlwdG9yKiBOZXdEZXNjcmlwdG9yKCk7CisKKyBwdWJsaWM6CisgIH5Qcm9k
dWNlclBvcnQoKSBvdmVycmlkZTsKKworICBzdGF0aWMgY29uc3QgOjpwZXJmZXR0bzo6aXBjOjpT
ZXJ2aWNlRGVzY3JpcHRvciYgR2V0RGVzY3JpcHRvclN0YXRpYygpOworCisgIC8vIFNlcnZpY2Ug
aW1wbGVtZW50YXRpb24uCisgIGNvbnN0IDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0
b3ImIEdldERlc2NyaXB0b3IoKSBvdmVycmlkZTsKKworICAvLyBNZXRob2RzIGZyb20gdGhlIC5w
cm90byBmaWxlCisgIHVzaW5nIERlZmVycmVkSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZSA9
IDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWQ8SW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZT47
CisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplQ29ubmVjdGlvbihjb25zdCBJbml0aWFsaXplQ29u
bmVjdGlvblJlcXVlc3QmLCBEZWZlcnJlZEluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2UpID0g
MDsKKworICB1c2luZyBEZWZlcnJlZFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlID0gOjpwZXJm
ZXR0bzo6aXBjOjpEZWZlcnJlZDxSZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZT47CisgIHZpcnR1
YWwgdm9pZCBSZWdpc3RlckRhdGFTb3VyY2UoY29uc3QgUmVnaXN0ZXJEYXRhU291cmNlUmVxdWVz
dCYsIERlZmVycmVkUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UpID0gMDsKKworICB1c2luZyBE
ZWZlcnJlZFVucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRl
ZmVycmVkPFVucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2U+OworICB2aXJ0dWFsIHZvaWQgVW5y
ZWdpc3RlckRhdGFTb3VyY2UoY29uc3QgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0JiwgRGVm
ZXJyZWRVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlKSA9IDA7CisKKyAgdXNpbmcgRGVmZXJy
ZWRDb21taXREYXRhUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPENvbW1pdERh
dGFSZXNwb25zZT47CisgIHZpcnR1YWwgdm9pZCBDb21taXREYXRhKGNvbnN0IENvbW1pdERhdGFS
ZXF1ZXN0JiwgRGVmZXJyZWRDb21taXREYXRhUmVzcG9uc2UpID0gMDsKKworICB1c2luZyBEZWZl
cnJlZEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxH
ZXRBc3luY0NvbW1hbmRSZXNwb25zZT47CisgIHZpcnR1YWwgdm9pZCBHZXRBc3luY0NvbW1hbmQo
Y29uc3QgR2V0QXN5bmNDb21tYW5kUmVxdWVzdCYsIERlZmVycmVkR2V0QXN5bmNDb21tYW5kUmVz
cG9uc2UpID0gMDsKKworICB1c2luZyBEZWZlcnJlZFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25z
ZSA9IDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWQ8UmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNl
PjsKKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVHJhY2VXcml0ZXIoY29uc3QgUmVnaXN0ZXJUcmFj
ZVdyaXRlclJlcXVlc3QmLCBEZWZlcnJlZFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSkgPSAw
OworCisgIHVzaW5nIERlZmVycmVkVW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UgPSA6OnBl
cmZldHRvOjppcGM6OkRlZmVycmVkPFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlPjsKKyAg
dmlydHVhbCB2b2lkIFVucmVnaXN0ZXJUcmFjZVdyaXRlcihjb25zdCBVbnJlZ2lzdGVyVHJhY2VX
cml0ZXJSZXF1ZXN0JiwgRGVmZXJyZWRVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSkgPSAw
OworCisgIHVzaW5nIERlZmVycmVkTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZSA9IDo6
cGVyZmV0dG86OmlwYzo6RGVmZXJyZWQ8Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZT47
CisgIHZpcnR1YWwgdm9pZCBOb3RpZnlEYXRhU291cmNlU3RhcnRlZChjb25zdCBOb3RpZnlEYXRh
U291cmNlU3RhcnRlZFJlcXVlc3QmLCBEZWZlcnJlZE5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVz
cG9uc2UpID0gMDsKKworICB1c2luZyBEZWZlcnJlZE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVz
cG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPE5vdGlmeURhdGFTb3VyY2VTdG9wcGVk
UmVzcG9uc2U+OworICB2aXJ0dWFsIHZvaWQgTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoY29uc3Qg
Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1ZXN0JiwgRGVmZXJyZWROb3RpZnlEYXRhU291cmNl
U3RvcHBlZFJlc3BvbnNlKSA9IDA7CisKKyAgdXNpbmcgRGVmZXJyZWRBY3RpdmF0ZVRyaWdnZXJz
UmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPEFjdGl2YXRlVHJpZ2dlcnNSZXNw
b25zZT47CisgIHZpcnR1YWwgdm9pZCBBY3RpdmF0ZVRyaWdnZXJzKGNvbnN0IEFjdGl2YXRlVHJp
Z2dlcnNSZXF1ZXN0JiwgRGVmZXJyZWRBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UpID0gMDsKKwor
ICB1c2luZyBEZWZlcnJlZFN5bmNSZXNwb25zZSA9IDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWQ8
U3luY1Jlc3BvbnNlPjsKKyAgdmlydHVhbCB2b2lkIFN5bmMoY29uc3QgU3luY1JlcXVlc3QmLCBE
ZWZlcnJlZFN5bmNSZXNwb25zZSkgPSAwOworCit9OworCisKK2NsYXNzIFByb2R1Y2VyUG9ydFBy
b3h5IDogcHVibGljIDo6cGVyZmV0dG86OmlwYzo6U2VydmljZVByb3h5IHsKKyBwdWJsaWM6Cisg
ICBleHBsaWNpdCBQcm9kdWNlclBvcnRQcm94eSg6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VQcm94
eTo6RXZlbnRMaXN0ZW5lciopOworICAgflByb2R1Y2VyUG9ydFByb3h5KCkgb3ZlcnJpZGU7CisK
KyAgLy8gU2VydmljZVByb3h5IGltcGxlbWVudGF0aW9uLgorICBjb25zdCA6OnBlcmZldHRvOjpp
cGM6OlNlcnZpY2VEZXNjcmlwdG9yJiBHZXREZXNjcmlwdG9yKCkgb3ZlcnJpZGU7CisKKyAgLy8g
TWV0aG9kcyBmcm9tIHRoZSAucHJvdG8gZmlsZQorICB1c2luZyBEZWZlcnJlZEluaXRpYWxpemVD
b25uZWN0aW9uUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPEluaXRpYWxpemVD
b25uZWN0aW9uUmVzcG9uc2U+OworICB2b2lkIEluaXRpYWxpemVDb25uZWN0aW9uKGNvbnN0IElu
aXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCYsIERlZmVycmVkSW5pdGlhbGl6ZUNvbm5lY3Rpb25S
ZXNwb25zZSwgaW50IGZkID0gLTEpOworCisgIHVzaW5nIERlZmVycmVkUmVnaXN0ZXJEYXRhU291
cmNlUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPFJlZ2lzdGVyRGF0YVNvdXJj
ZVJlc3BvbnNlPjsKKyAgdm9pZCBSZWdpc3RlckRhdGFTb3VyY2UoY29uc3QgUmVnaXN0ZXJEYXRh
U291cmNlUmVxdWVzdCYsIERlZmVycmVkUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UsIGludCBm
ZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJlZFVucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2Ug
PSA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkPFVucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2U+
OworICB2b2lkIFVucmVnaXN0ZXJEYXRhU291cmNlKGNvbnN0IFVucmVnaXN0ZXJEYXRhU291cmNl
UmVxdWVzdCYsIERlZmVycmVkVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZSwgaW50IGZkID0g
LTEpOworCisgIHVzaW5nIERlZmVycmVkQ29tbWl0RGF0YVJlc3BvbnNlID0gOjpwZXJmZXR0bzo6
aXBjOjpEZWZlcnJlZDxDb21taXREYXRhUmVzcG9uc2U+OworICB2b2lkIENvbW1pdERhdGEoY29u
c3QgQ29tbWl0RGF0YVJlcXVlc3QmLCBEZWZlcnJlZENvbW1pdERhdGFSZXNwb25zZSwgaW50IGZk
ID0gLTEpOworCisgIHVzaW5nIERlZmVycmVkR2V0QXN5bmNDb21tYW5kUmVzcG9uc2UgPSA6OnBl
cmZldHRvOjppcGM6OkRlZmVycmVkPEdldEFzeW5jQ29tbWFuZFJlc3BvbnNlPjsKKyAgdm9pZCBH
ZXRBc3luY0NvbW1hbmQoY29uc3QgR2V0QXN5bmNDb21tYW5kUmVxdWVzdCYsIERlZmVycmVkR2V0
QXN5bmNDb21tYW5kUmVzcG9uc2UsIGludCBmZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJlZFJl
Z2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSA9IDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWQ8UmVn
aXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlPjsKKyAgdm9pZCBSZWdpc3RlclRyYWNlV3JpdGVyKGNv
bnN0IFJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiwgRGVmZXJyZWRSZWdpc3RlclRyYWNlV3Jp
dGVyUmVzcG9uc2UsIGludCBmZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJlZFVucmVnaXN0ZXJU
cmFjZVdyaXRlclJlc3BvbnNlID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxVbnJlZ2lzdGVy
VHJhY2VXcml0ZXJSZXNwb25zZT47CisgIHZvaWQgVW5yZWdpc3RlclRyYWNlV3JpdGVyKGNvbnN0
IFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmLCBEZWZlcnJlZFVucmVnaXN0ZXJUcmFjZVdy
aXRlclJlc3BvbnNlLCBpbnQgZmQgPSAtMSk7CisKKyAgdXNpbmcgRGVmZXJyZWROb3RpZnlEYXRh
U291cmNlU3RhcnRlZFJlc3BvbnNlID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxOb3RpZnlE
YXRhU291cmNlU3RhcnRlZFJlc3BvbnNlPjsKKyAgdm9pZCBOb3RpZnlEYXRhU291cmNlU3RhcnRl
ZChjb25zdCBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QmLCBEZWZlcnJlZE5vdGlmeURh
dGFTb3VyY2VTdGFydGVkUmVzcG9uc2UsIGludCBmZCA9IC0xKTsKKworICB1c2luZyBEZWZlcnJl
ZE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2UgPSA6OnBlcmZldHRvOjppcGM6OkRlZmVy
cmVkPE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2U+OworICB2b2lkIE5vdGlmeURhdGFT
b3VyY2VTdG9wcGVkKGNvbnN0IE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdCYsIERlZmVy
cmVkTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXNwb25zZSwgaW50IGZkID0gLTEpOworCisgIHVz
aW5nIERlZmVycmVkQWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNlID0gOjpwZXJmZXR0bzo6aXBjOjpE
ZWZlcnJlZDxBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2U+OworICB2b2lkIEFjdGl2YXRlVHJpZ2dl
cnMoY29uc3QgQWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmLCBEZWZlcnJlZEFjdGl2YXRlVHJpZ2dl
cnNSZXNwb25zZSwgaW50IGZkID0gLTEpOworCisgIHVzaW5nIERlZmVycmVkU3luY1Jlc3BvbnNl
ID0gOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZDxTeW5jUmVzcG9uc2U+OworICB2b2lkIFN5bmMo
Y29uc3QgU3luY1JlcXVlc3QmLCBEZWZlcnJlZFN5bmNSZXNwb25zZSwgaW50IGZkID0gLTEpOwor
Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MK
K30gIC8vIG5hbWVzcGFjZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9T
X1BFUkZFVFRPX0lQQ19QUk9EVUNFUl9QT1JUX1BST1RPX0hfCisvLyBETyBOT1QgRURJVC4gQXV0
b2dlbmVyYXRlZCBieSBQZXJmZXR0byBJUEMKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9pcGMvcHJvZHVjZXJfcG9ydC5pcGMuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvY29kZWdl
bl9oZWxwZXJzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworOjpwZXJmZXR0bzo6aXBjOjpT
ZXJ2aWNlRGVzY3JpcHRvciogUHJvZHVjZXJQb3J0OjpOZXdEZXNjcmlwdG9yKCkgeworICBhdXRv
KiBkZXNjID0gbmV3IDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3IoKTsKKyAgZGVz
Yy0+c2VydmljZV9uYW1lID0gIlByb2R1Y2VyUG9ydCI7CisKKyAgZGVzYy0+bWV0aG9kcy5lbXBs
YWNlX2JhY2soOjpwZXJmZXR0bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvcjo6TWV0aG9keworICAg
ICAiSW5pdGlhbGl6ZUNvbm5lY3Rpb24iLAorICAgICAmX0lQQ19EZWNvZGVyPEluaXRpYWxpemVD
b25uZWN0aW9uUmVxdWVzdD4sCisgICAgICZfSVBDX0RlY29kZXI8SW5pdGlhbGl6ZUNvbm5lY3Rp
b25SZXNwb25zZT4sCisgICAgICZfSVBDX0ludm9rZXI8UHJvZHVjZXJQb3J0LCBJbml0aWFsaXpl
Q29ubmVjdGlvblJlcXVlc3QsIEluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2UsICZQcm9kdWNl
clBvcnQ6OkluaXRpYWxpemVDb25uZWN0aW9uPn0pOworCisgIGRlc2MtPm1ldGhvZHMuZW1wbGFj
ZV9iYWNrKDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3I6Ok1ldGhvZHsKKyAgICAg
IlJlZ2lzdGVyRGF0YVNvdXJjZSIsCisgICAgICZfSVBDX0RlY29kZXI8UmVnaXN0ZXJEYXRhU291
cmNlUmVxdWVzdD4sCisgICAgICZfSVBDX0RlY29kZXI8UmVnaXN0ZXJEYXRhU291cmNlUmVzcG9u
c2U+LAorICAgICAmX0lQQ19JbnZva2VyPFByb2R1Y2VyUG9ydCwgUmVnaXN0ZXJEYXRhU291cmNl
UmVxdWVzdCwgUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UsICZQcm9kdWNlclBvcnQ6OlJlZ2lz
dGVyRGF0YVNvdXJjZT59KTsKKworICBkZXNjLT5tZXRob2RzLmVtcGxhY2VfYmFjayg6OnBlcmZl
dHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yOjpNZXRob2R7CisgICAgICJVbnJlZ2lzdGVyRGF0
YVNvdXJjZSIsCisgICAgICZfSVBDX0RlY29kZXI8VW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0
PiwKKyAgICAgJl9JUENfRGVjb2RlcjxVbnJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlPiwKKyAg
ICAgJl9JUENfSW52b2tlcjxQcm9kdWNlclBvcnQsIFVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVz
dCwgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZSwgJlByb2R1Y2VyUG9ydDo6VW5yZWdpc3Rl
ckRhdGFTb3VyY2U+fSk7CisKKyAgZGVzYy0+bWV0aG9kcy5lbXBsYWNlX2JhY2soOjpwZXJmZXR0
bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvcjo6TWV0aG9keworICAgICAiQ29tbWl0RGF0YSIsCisg
ICAgICZfSVBDX0RlY29kZXI8Q29tbWl0RGF0YVJlcXVlc3Q+LAorICAgICAmX0lQQ19EZWNvZGVy
PENvbW1pdERhdGFSZXNwb25zZT4sCisgICAgICZfSVBDX0ludm9rZXI8UHJvZHVjZXJQb3J0LCBD
b21taXREYXRhUmVxdWVzdCwgQ29tbWl0RGF0YVJlc3BvbnNlLCAmUHJvZHVjZXJQb3J0OjpDb21t
aXREYXRhPn0pOworCisgIGRlc2MtPm1ldGhvZHMuZW1wbGFjZV9iYWNrKDo6cGVyZmV0dG86Omlw
Yzo6U2VydmljZURlc2NyaXB0b3I6Ok1ldGhvZHsKKyAgICAgIkdldEFzeW5jQ29tbWFuZCIsCisg
ICAgICZfSVBDX0RlY29kZXI8R2V0QXN5bmNDb21tYW5kUmVxdWVzdD4sCisgICAgICZfSVBDX0Rl
Y29kZXI8R2V0QXN5bmNDb21tYW5kUmVzcG9uc2U+LAorICAgICAmX0lQQ19JbnZva2VyPFByb2R1
Y2VyUG9ydCwgR2V0QXN5bmNDb21tYW5kUmVxdWVzdCwgR2V0QXN5bmNDb21tYW5kUmVzcG9uc2Us
ICZQcm9kdWNlclBvcnQ6OkdldEFzeW5jQ29tbWFuZD59KTsKKworICBkZXNjLT5tZXRob2RzLmVt
cGxhY2VfYmFjayg6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9yOjpNZXRob2R7Cisg
ICAgICJSZWdpc3RlclRyYWNlV3JpdGVyIiwKKyAgICAgJl9JUENfRGVjb2RlcjxSZWdpc3RlclRy
YWNlV3JpdGVyUmVxdWVzdD4sCisgICAgICZfSVBDX0RlY29kZXI8UmVnaXN0ZXJUcmFjZVdyaXRl
clJlc3BvbnNlPiwKKyAgICAgJl9JUENfSW52b2tlcjxQcm9kdWNlclBvcnQsIFJlZ2lzdGVyVHJh
Y2VXcml0ZXJSZXF1ZXN0LCBSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UsICZQcm9kdWNlclBv
cnQ6OlJlZ2lzdGVyVHJhY2VXcml0ZXI+fSk7CisKKyAgZGVzYy0+bWV0aG9kcy5lbXBsYWNlX2Jh
Y2soOjpwZXJmZXR0bzo6aXBjOjpTZXJ2aWNlRGVzY3JpcHRvcjo6TWV0aG9keworICAgICAiVW5y
ZWdpc3RlclRyYWNlV3JpdGVyIiwKKyAgICAgJl9JUENfRGVjb2RlcjxVbnJlZ2lzdGVyVHJhY2VX
cml0ZXJSZXF1ZXN0PiwKKyAgICAgJl9JUENfRGVjb2RlcjxVbnJlZ2lzdGVyVHJhY2VXcml0ZXJS
ZXNwb25zZT4sCisgICAgICZfSVBDX0ludm9rZXI8UHJvZHVjZXJQb3J0LCBVbnJlZ2lzdGVyVHJh
Y2VXcml0ZXJSZXF1ZXN0LCBVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25zZSwgJlByb2R1Y2Vy
UG9ydDo6VW5yZWdpc3RlclRyYWNlV3JpdGVyPn0pOworCisgIGRlc2MtPm1ldGhvZHMuZW1wbGFj
ZV9iYWNrKDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3I6Ok1ldGhvZHsKKyAgICAg
Ik5vdGlmeURhdGFTb3VyY2VTdGFydGVkIiwKKyAgICAgJl9JUENfRGVjb2RlcjxOb3RpZnlEYXRh
U291cmNlU3RhcnRlZFJlcXVlc3Q+LAorICAgICAmX0lQQ19EZWNvZGVyPE5vdGlmeURhdGFTb3Vy
Y2VTdGFydGVkUmVzcG9uc2U+LAorICAgICAmX0lQQ19JbnZva2VyPFByb2R1Y2VyUG9ydCwgTm90
aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0LCBOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlc3Bv
bnNlLCAmUHJvZHVjZXJQb3J0OjpOb3RpZnlEYXRhU291cmNlU3RhcnRlZD59KTsKKworICBkZXNj
LT5tZXRob2RzLmVtcGxhY2VfYmFjayg6OnBlcmZldHRvOjppcGM6OlNlcnZpY2VEZXNjcmlwdG9y
OjpNZXRob2R7CisgICAgICJOb3RpZnlEYXRhU291cmNlU3RvcHBlZCIsCisgICAgICZfSVBDX0Rl
Y29kZXI8Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWRSZXF1ZXN0PiwKKyAgICAgJl9JUENfRGVjb2Rl
cjxOb3RpZnlEYXRhU291cmNlU3RvcHBlZFJlc3BvbnNlPiwKKyAgICAgJl9JUENfSW52b2tlcjxQ
cm9kdWNlclBvcnQsIE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdCwgTm90aWZ5RGF0YVNv
dXJjZVN0b3BwZWRSZXNwb25zZSwgJlByb2R1Y2VyUG9ydDo6Tm90aWZ5RGF0YVNvdXJjZVN0b3Bw
ZWQ+fSk7CisKKyAgZGVzYy0+bWV0aG9kcy5lbXBsYWNlX2JhY2soOjpwZXJmZXR0bzo6aXBjOjpT
ZXJ2aWNlRGVzY3JpcHRvcjo6TWV0aG9keworICAgICAiQWN0aXZhdGVUcmlnZ2VycyIsCisgICAg
ICZfSVBDX0RlY29kZXI8QWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3Q+LAorICAgICAmX0lQQ19EZWNv
ZGVyPEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZT4sCisgICAgICZfSVBDX0ludm9rZXI8UHJvZHVj
ZXJQb3J0LCBBY3RpdmF0ZVRyaWdnZXJzUmVxdWVzdCwgQWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNl
LCAmUHJvZHVjZXJQb3J0OjpBY3RpdmF0ZVRyaWdnZXJzPn0pOworCisgIGRlc2MtPm1ldGhvZHMu
ZW1wbGFjZV9iYWNrKDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3I6Ok1ldGhvZHsK
KyAgICAgIlN5bmMiLAorICAgICAmX0lQQ19EZWNvZGVyPFN5bmNSZXF1ZXN0PiwKKyAgICAgJl9J
UENfRGVjb2RlcjxTeW5jUmVzcG9uc2U+LAorICAgICAmX0lQQ19JbnZva2VyPFByb2R1Y2VyUG9y
dCwgU3luY1JlcXVlc3QsIFN5bmNSZXNwb25zZSwgJlByb2R1Y2VyUG9ydDo6U3luYz59KTsKKyAg
ZGVzYy0+bWV0aG9kcy5zaHJpbmtfdG9fZml0KCk7CisgIHJldHVybiBkZXNjOworfQorCisKK2Nv
bnN0IDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3ImIFByb2R1Y2VyUG9ydDo6R2V0
RGVzY3JpcHRvclN0YXRpYygpIHsKKyAgc3RhdGljIGF1dG8qIGluc3RhbmNlID0gTmV3RGVzY3Jp
cHRvcigpOworICByZXR1cm4gKmluc3RhbmNlOworfQorCisvLyBIb3N0LXNpZGUgZGVmaW5pdGlv
bnMuCitQcm9kdWNlclBvcnQ6On5Qcm9kdWNlclBvcnQoKSA9IGRlZmF1bHQ7CisKK2NvbnN0IDo6
cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3ImIFByb2R1Y2VyUG9ydDo6R2V0RGVzY3Jp
cHRvcigpIHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3JTdGF0aWMoKTsKK30KKworLy8gQ2xpZW50
LXNpZGUgZGVmaW5pdGlvbnMuCitQcm9kdWNlclBvcnRQcm94eTo6UHJvZHVjZXJQb3J0UHJveHko
OjpwZXJmZXR0bzo6aXBjOjpTZXJ2aWNlUHJveHk6OkV2ZW50TGlzdGVuZXIqIGV2ZW50X2xpc3Rl
bmVyKQorICAgIDogOjpwZXJmZXR0bzo6aXBjOjpTZXJ2aWNlUHJveHkoZXZlbnRfbGlzdGVuZXIp
IHt9CisKK1Byb2R1Y2VyUG9ydFByb3h5Ojp+UHJvZHVjZXJQb3J0UHJveHkoKSA9IGRlZmF1bHQ7
CisKK2NvbnN0IDo6cGVyZmV0dG86OmlwYzo6U2VydmljZURlc2NyaXB0b3ImIFByb2R1Y2VyUG9y
dFByb3h5OjpHZXREZXNjcmlwdG9yKCkgeworICByZXR1cm4gUHJvZHVjZXJQb3J0OjpHZXREZXNj
cmlwdG9yU3RhdGljKCk7Cit9CisKK3ZvaWQgUHJvZHVjZXJQb3J0UHJveHk6OkluaXRpYWxpemVD
b25uZWN0aW9uKGNvbnN0IEluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCYgcmVxdWVzdCwgRGVm
ZXJyZWRJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlIHJlcGx5LCBpbnQgZmQpIHsKKyAgQmVn
aW5JbnZva2UoIkluaXRpYWxpemVDb25uZWN0aW9uIiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBj
OjpEZWZlcnJlZEJhc2Uoc3RkOjptb3ZlKHJlcGx5KSksCisgICAgICAgICAgICAgIGZkKTsKK30K
Kwordm9pZCBQcm9kdWNlclBvcnRQcm94eTo6UmVnaXN0ZXJEYXRhU291cmNlKGNvbnN0IFJlZ2lz
dGVyRGF0YVNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIERlZmVycmVkUmVnaXN0ZXJEYXRhU291cmNl
UmVzcG9uc2UgcmVwbHksIGludCBmZCkgeworICBCZWdpbkludm9rZSgiUmVnaXN0ZXJEYXRhU291
cmNlIiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZEJhc2Uoc3RkOjptb3ZlKHJl
cGx5KSksCisgICAgICAgICAgICAgIGZkKTsKK30KKwordm9pZCBQcm9kdWNlclBvcnRQcm94eTo6
VW5yZWdpc3RlckRhdGFTb3VyY2UoY29uc3QgVW5yZWdpc3RlckRhdGFTb3VyY2VSZXF1ZXN0JiBy
ZXF1ZXN0LCBEZWZlcnJlZFVucmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UgcmVwbHksIGludCBm
ZCkgeworICBCZWdpbkludm9rZSgiVW5yZWdpc3RlckRhdGFTb3VyY2UiLCByZXF1ZXN0LCA6OnBl
cmZldHRvOjppcGM6OkRlZmVycmVkQmFzZShzdGQ6Om1vdmUocmVwbHkpKSwKKyAgICAgICAgICAg
ICAgZmQpOworfQorCit2b2lkIFByb2R1Y2VyUG9ydFByb3h5OjpDb21taXREYXRhKGNvbnN0IENv
bW1pdERhdGFSZXF1ZXN0JiByZXF1ZXN0LCBEZWZlcnJlZENvbW1pdERhdGFSZXNwb25zZSByZXBs
eSwgaW50IGZkKSB7CisgIEJlZ2luSW52b2tlKCJDb21taXREYXRhIiwgcmVxdWVzdCwgOjpwZXJm
ZXR0bzo6aXBjOjpEZWZlcnJlZEJhc2Uoc3RkOjptb3ZlKHJlcGx5KSksCisgICAgICAgICAgICAg
IGZkKTsKK30KKwordm9pZCBQcm9kdWNlclBvcnRQcm94eTo6R2V0QXN5bmNDb21tYW5kKGNvbnN0
IEdldEFzeW5jQ29tbWFuZFJlcXVlc3QmIHJlcXVlc3QsIERlZmVycmVkR2V0QXN5bmNDb21tYW5k
UmVzcG9uc2UgcmVwbHksIGludCBmZCkgeworICBCZWdpbkludm9rZSgiR2V0QXN5bmNDb21tYW5k
IiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZEJhc2Uoc3RkOjptb3ZlKHJlcGx5
KSksCisgICAgICAgICAgICAgIGZkKTsKK30KKwordm9pZCBQcm9kdWNlclBvcnRQcm94eTo6UmVn
aXN0ZXJUcmFjZVdyaXRlcihjb25zdCBSZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCYgcmVxdWVz
dCwgRGVmZXJyZWRSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2UgcmVwbHksIGludCBmZCkgewor
ICBCZWdpbkludm9rZSgiUmVnaXN0ZXJUcmFjZVdyaXRlciIsIHJlcXVlc3QsIDo6cGVyZmV0dG86
OmlwYzo6RGVmZXJyZWRCYXNlKHN0ZDo6bW92ZShyZXBseSkpLAorICAgICAgICAgICAgICBmZCk7
Cit9CisKK3ZvaWQgUHJvZHVjZXJQb3J0UHJveHk6OlVucmVnaXN0ZXJUcmFjZVdyaXRlcihjb25z
dCBVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiByZXF1ZXN0LCBEZWZlcnJlZFVucmVnaXN0
ZXJUcmFjZVdyaXRlclJlc3BvbnNlIHJlcGx5LCBpbnQgZmQpIHsKKyAgQmVnaW5JbnZva2UoIlVu
cmVnaXN0ZXJUcmFjZVdyaXRlciIsIHJlcXVlc3QsIDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWRC
YXNlKHN0ZDo6bW92ZShyZXBseSkpLAorICAgICAgICAgICAgICBmZCk7Cit9CisKK3ZvaWQgUHJv
ZHVjZXJQb3J0UHJveHk6Ok5vdGlmeURhdGFTb3VyY2VTdGFydGVkKGNvbnN0IE5vdGlmeURhdGFT
b3VyY2VTdGFydGVkUmVxdWVzdCYgcmVxdWVzdCwgRGVmZXJyZWROb3RpZnlEYXRhU291cmNlU3Rh
cnRlZFJlc3BvbnNlIHJlcGx5LCBpbnQgZmQpIHsKKyAgQmVnaW5JbnZva2UoIk5vdGlmeURhdGFT
b3VyY2VTdGFydGVkIiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBjOjpEZWZlcnJlZEJhc2Uoc3Rk
Ojptb3ZlKHJlcGx5KSksCisgICAgICAgICAgICAgIGZkKTsKK30KKwordm9pZCBQcm9kdWNlclBv
cnRQcm94eTo6Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoY29uc3QgTm90aWZ5RGF0YVNvdXJjZVN0
b3BwZWRSZXF1ZXN0JiByZXF1ZXN0LCBEZWZlcnJlZE5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVz
cG9uc2UgcmVwbHksIGludCBmZCkgeworICBCZWdpbkludm9rZSgiTm90aWZ5RGF0YVNvdXJjZVN0
b3BwZWQiLCByZXF1ZXN0LCA6OnBlcmZldHRvOjppcGM6OkRlZmVycmVkQmFzZShzdGQ6Om1vdmUo
cmVwbHkpKSwKKyAgICAgICAgICAgICAgZmQpOworfQorCit2b2lkIFByb2R1Y2VyUG9ydFByb3h5
OjpBY3RpdmF0ZVRyaWdnZXJzKGNvbnN0IEFjdGl2YXRlVHJpZ2dlcnNSZXF1ZXN0JiByZXF1ZXN0
LCBEZWZlcnJlZEFjdGl2YXRlVHJpZ2dlcnNSZXNwb25zZSByZXBseSwgaW50IGZkKSB7CisgIEJl
Z2luSW52b2tlKCJBY3RpdmF0ZVRyaWdnZXJzIiwgcmVxdWVzdCwgOjpwZXJmZXR0bzo6aXBjOjpE
ZWZlcnJlZEJhc2Uoc3RkOjptb3ZlKHJlcGx5KSksCisgICAgICAgICAgICAgIGZkKTsKK30KKwor
dm9pZCBQcm9kdWNlclBvcnRQcm94eTo6U3luYyhjb25zdCBTeW5jUmVxdWVzdCYgcmVxdWVzdCwg
RGVmZXJyZWRTeW5jUmVzcG9uc2UgcmVwbHksIGludCBmZCkgeworICBCZWdpbkludm9rZSgiU3lu
YyIsIHJlcXVlc3QsIDo6cGVyZmV0dG86OmlwYzo6RGVmZXJyZWRCYXNlKHN0ZDo6bW92ZShyZXBs
eSkpLAorICAgICAgICAgICAgICBmZCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30g
IC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBzb3VyY2U6IHNyYy9iYXNlL3VuaXhfc29ja2V0LmNjCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2V4dC9iYXNlL3VuaXhfc29ja2V0
LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJv
amVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAy
LjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg
aW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5
IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj
ZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBs
YXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRl
ciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lU
SE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNz
IG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFn
ZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGlj
ZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX0JBU0VfVU5JWF9TT0NL
RVRfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19FWFRfQkFTRV9VTklYX1NPQ0tFVF9IXwor
CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRl
IDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3Njb3BlZF9maWxlLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS91
dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
ZXh0L2Jhc2Uvd2Vha19wdHIuaCIKKworc3RydWN0IG1zZ2hkcjsKKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgVGFza1J1bm5lcjsKKworLy8gVXNlIGFy
Yml0cmFyaWx5IGhpZ2ggdmFsdWVzIHRvIGF2b2lkIHRoYXQgc29tZSBjb2RlIGFjY2lkZW50YWxs
eSBlbmRzIHVwCisvLyBhc3N1bWluZyB0aGF0IHRoZXNlIGVudW0gdmFsdWVzIG1hdGNoIHRoZSBz
eXNyb290J3MgU09DS194eHggZGVmaW5lcyByYXRoZXIKKy8vIHRoYW4gdXNpbmcgR2V0U29ja1R5
cGUoKSAvIEdldFNvY2tGYW1pbHkoKS4KK2VudW0gY2xhc3MgU29ja1R5cGUgeyBrU3RyZWFtID0g
MTAwLCBrRGdyYW0sIGtTZXFQYWNrZXQgfTsKK2VudW0gY2xhc3MgU29ja0ZhbWlseSB7IGtVbml4
ID0gMjAwLCBrSW5ldCB9OworCisvLyBVbml4U29ja2V0UmF3IGlzIGEgYmFzaWMgd3JhcHBlciBh
cm91bmQgVU5JWCBzb2NrZXRzLiBJdCBleHBvc2VzIHdyYXBwZXIKKy8vIG1ldGhvZHMgdGhhdCB0
YWtlIGNhcmUgb2YgbW9zdCBjb21tb24gcGl0ZmFsbHMgKGUuZy4sIG1hcmtpbmcgZmQgYXMKKy8v
IE9fQ0xPRVhFQywgYXZvaWRpbmcgU0lHUElQRSwgcHJvcGVybHkgaGFuZGxpbmcgcGFydGlhbCB3
cml0ZXMpLiBJdCBpcyB1c2VkIGFzCisvLyBhIGJ1aWxkaW5nIGJsb2NrIGZvciB0aGUgbW9yZSBz
b3BoaXN0aWNhdGVkIFVuaXhTb2NrZXQgY2xhc3MuCitjbGFzcyBVbml4U29ja2V0UmF3IHsKKyBw
dWJsaWM6CisgIC8vIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgdW5peCBzb2NrZXQuCisgIHN0
YXRpYyBVbml4U29ja2V0UmF3IENyZWF0ZU1heUZhaWwoU29ja0ZhbWlseSBmYW1pbHksIFNvY2tU
eXBlIHR5cGUpOworCisgIC8vIENyYXRlcyBhIHBhaXIgb2YgY29ubmVjdGVkIHNvY2tldHMuCisg
IHN0YXRpYyBzdGQ6OnBhaXI8VW5peFNvY2tldFJhdywgVW5peFNvY2tldFJhdz4gQ3JlYXRlUGFp
cihTb2NrRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgU29ja1R5cGUpOworCisgIC8vIENyZWF0ZXMgYW4gdW5pbml0aWFs
aXplZCB1bml4IHNvY2tldC4KKyAgVW5peFNvY2tldFJhdygpOworCisgIC8vIENyZWF0ZXMgYSB1
bml4IHNvY2tldCBhZG9wdGluZyBhbiBleGlzdGluZyBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgaXMK
KyAgLy8gdHlwaWNhbGx5IHVzZWQgdG8gaW5oZXJpdCBmZHMgZnJvbSBpbml0IHZpYSBlbnZpcm9u
bWVudCB2YXJpYWJsZXMuCisgIFVuaXhTb2NrZXRSYXcoU2NvcGVkRmlsZSwgU29ja0ZhbWlseSwg
U29ja1R5cGUpOworCisgIH5Vbml4U29ja2V0UmF3KCkgPSBkZWZhdWx0OworICBVbml4U29ja2V0
UmF3KFVuaXhTb2NrZXRSYXcmJikgbm9leGNlcHQgPSBkZWZhdWx0OworICBVbml4U29ja2V0UmF3
JiBvcGVyYXRvcj0oVW5peFNvY2tldFJhdyYmKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBCaW5kKGNv
bnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFtZSk7CisgIGJvb2wgTGlzdGVuKCk7CisgIGJvb2wg
Q29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgc29ja2V0X25hbWUpOworICBib29sIFNldFR4VGlt
ZW91dCh1aW50MzJfdCB0aW1lb3V0X21zKTsKKyAgYm9vbCBTZXRSeFRpbWVvdXQodWludDMyX3Qg
dGltZW91dF9tcyk7CisgIHZvaWQgU2h1dGRvd24oKTsKKyAgdm9pZCBTZXRCbG9ja2luZyhib29s
KTsKKyAgYm9vbCBJc0Jsb2NraW5nKCkgY29uc3Q7CisgIHZvaWQgUmV0YWluT25FeGVjKCk7Cisg
IFNvY2tUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorICBTb2NrRmFtaWx5IGZh
bWlseSgpIGNvbnN0IHsgcmV0dXJuIGZhbWlseV87IH0KKyAgaW50IGZkKCkgY29uc3QgeyByZXR1
cm4gKmZkXzsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFm
ZF87IH0KKworICBTY29wZWRGaWxlIFJlbGVhc2VGZCgpIHsgcmV0dXJuIHN0ZDo6bW92ZShmZF8p
OyB9CisKKyAgc3NpemVfdCBTZW5kKGNvbnN0IHZvaWQqIG1zZywKKyAgICAgICAgICAgICAgIHNp
emVfdCBsZW4sCisgICAgICAgICAgICAgICBjb25zdCBpbnQqIHNlbmRfZmRzID0gbnVsbHB0ciwK
KyAgICAgICAgICAgICAgIHNpemVfdCBudW1fZmRzID0gMCk7CisKKyAgLy8gUmUtZW50ZXIgc2Vu
ZG1zZyB1bnRpbCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gc2VudCBvciBhbiBlcnJvciBvY2N1cnMu
CisgIC8vIFRPRE8oZm1heWVyKTogRmlndXJlIG91dCBob3cgdG8gZG8gdGltZW91dHMgaGVyZSBm
b3IgaGVhcHByb2ZkLgorICBzc2l6ZV90IFNlbmRNc2dBbGwoc3RydWN0IG1zZ2hkciogbXNnKTsK
KworICBzc2l6ZV90IFJlY2VpdmUodm9pZCogbXNnLAorICAgICAgICAgICAgICAgICAgc2l6ZV90
IGxlbiwKKyAgICAgICAgICAgICAgICAgIFNjb3BlZEZpbGUqIGZkX3ZlYyA9IG51bGxwdHIsCisg
ICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X2ZpbGVzID0gMCk7CisKKyAgLy8gRXhwb3NlZCBm
b3IgdGVzdGluZyBvbmx5LgorICAvLyBVcGRhdGUgbXNnaGRyIHNvIHN1YnNlcXVlbnQgc2VuZG1z
ZyB3aWxsIHNlbmQgZGF0YSB0aGF0IHJlbWFpbnMgYWZ0ZXIgbgorICAvLyBieXRlcyBoYXZlIGFs
cmVhZHkgYmVlbiBzZW50LgorICBzdGF0aWMgdm9pZCBTaGlmdE1zZ0hkcihzaXplX3Qgbiwgc3Ry
dWN0IG1zZ2hkciogbXNnKTsKKworIHByaXZhdGU6CisgIFVuaXhTb2NrZXRSYXcoU29ja0ZhbWls
eSwgU29ja1R5cGUpOworCisgIFVuaXhTb2NrZXRSYXcoY29uc3QgVW5peFNvY2tldFJhdyYpID0g
ZGVsZXRlOworICBVbml4U29ja2V0UmF3JiBvcGVyYXRvcj0oY29uc3QgVW5peFNvY2tldFJhdyYp
ID0gZGVsZXRlOworCisgIFNjb3BlZEZpbGUgZmRfOworICBTb2NrRmFtaWx5IGZhbWlseV8gPSBT
b2NrRmFtaWx5OjprVW5peDsKKyAgU29ja1R5cGUgdHlwZV8gPSBTb2NrVHlwZTo6a1N0cmVhbTsK
K307CisKKy8vIEEgbm9uLWJsb2NraW5nIFVOSVggZG9tYWluIHNvY2tldC4gQWxsb3dzIGFsc28g
dG8gdHJhbnNmZXIgZmlsZSBkZXNjcmlwdG9ycy4KKy8vIE5vbmUgb2YgdGhlIG1ldGhvZHMgaW4g
dGhpcyBjbGFzcyBhcmUgYmxvY2tpbmcuCisvLyBUaGUgbWFpbiBkZXNpZ24gZ29hbCBpcyBtYWtp
bmcgc3Ryb25nIGd1YXJhbnRlZXMgb24gdGhlIEV2ZW50TGlzdGVuZXIKKy8vIGNhbGxiYWNrcywg
aW4gb3JkZXIgdG8gYXZvaWQgZW5kaW5nIGluIHNvbWUgdW5kZWZpbmVkIHN0YXRlLgorLy8gSW4g
Y2FzZSBvZiBhbnkgZXJyb3IgaXQgd2lsbCBhZ2dyZXNzaXZlbHkganVzdCBzaHV0IGRvd24gdGhl
IHNvY2tldCBhbmQKKy8vIG5vdGlmeSB0aGUgZmFpbHVyZSB3aXRoIE9uQ29ubmVjdChmYWxzZSkg
b3IgT25EaXNjb25uZWN0KCkgZGVwZW5kaW5nIG9uIHRoZQorLy8gc3RhdGUgb2YgdGhlIHNvY2tl
dCAoc2VlIGJlbG93KS4KKy8vIEV2ZW50TGlzdGVuZXIgY2FsbGJhY2tzIHN0b3AgaGFwcGVuaW5n
IGFzIHNvb24gYXMgdGhlIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4KKy8vCisvLyBMaWZlY3ljbGUg
b2YgYSBjbGllbnQgc29ja2V0OgorLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29u
bmVjdCgpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyAgICAgICAgICAg
ICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgICAgICB8
IChzdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGZhaWx1cmUgb3IgU2h1dGRv
d24oKSkKKy8vICAgICAgICAgICAgViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBWCisvLyAgICAgT25Db25uZWN0KHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgIE9uQ29u
bmVjdChmYWxzZSkKKy8vICAgICAgICAgICAgfAorLy8gICAgICAgICAgICBWCisvLyAgICBPbkRh
dGFBdmFpbGFibGUoKQorLy8gICAgICAgICAgICB8CisvLyAgICAgICAgICAgIFYKKy8vICAgICBP
bkRpc2Nvbm5lY3QoKSAgKGZhaWx1cmUgb3Igc2h1dGRvd24pCisvLworLy8KKy8vIExpZmVjeWNs
ZSBvZiBhIHNlcnZlciBzb2NrZXQ6CisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIExp
c3RlbigpICAtLT4gcmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9ycy4KKy8vICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB8CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgor
Ly8gICAgICAgICAgICAgIE9uTmV3SW5jb21pbmdDb25uZWN0aW9uKG5ld19zb2NrZXQpCisvLwor
Ly8gICAgICAgICAgKHxuZXdfc29ja2V0fCBpbmhlcml0cyB0aGUgc2FtZSBFdmVudExpc3RlbmVy
KQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBWCisvLyAgICAgICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpCisv
LyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoZmFpbHVyZSBvciBTaHV0ZG93bigpKQor
Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKKy8vICAgICAgICAgICAgICAgICAgICAg
ICBPbkRpc2Nvbm5lY3QoKQorY2xhc3MgVW5peFNvY2tldCB7CisgcHVibGljOgorICBjbGFzcyBF
dmVudExpc3RlbmVyIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5FdmVudExpc3RlbmVyKCk7
CisKKyAgICAvLyBBZnRlciBMaXN0ZW4oKS4KKyAgICB2aXJ0dWFsIHZvaWQgT25OZXdJbmNvbWlu
Z0Nvbm5lY3Rpb24oCisgICAgICAgIFVuaXhTb2NrZXQqIHNlbGYsCisgICAgICAgIHN0ZDo6dW5p
cXVlX3B0cjxVbml4U29ja2V0PiBuZXdfY29ubmVjdGlvbik7CisKKyAgICAvLyBBZnRlciBDb25u
ZWN0KCksIHdoZXRoZXIgc3VjY2Vzc2Z1bCBvciBub3QuCisgICAgdmlydHVhbCB2b2lkIE9uQ29u
bmVjdChVbml4U29ja2V0KiBzZWxmLCBib29sIGNvbm5lY3RlZCk7CisKKyAgICAvLyBBZnRlciBh
IHN1Y2Nlc3NmdWwgQ29ubmVjdCgpIG9yIE9uTmV3SW5jb21pbmdDb25uZWN0aW9uKCkuIEVpdGhl
ciB0aGUKKyAgICAvLyBvdGhlciBlbmRwb2ludCBkaWQgZGlzY29ubmVjdCBvciBzb21lIG90aGVy
IGVycm9yIGhhcHBlbmVkLgorICAgIHZpcnR1YWwgdm9pZCBPbkRpc2Nvbm5lY3QoVW5peFNvY2tl
dCogc2VsZik7CisKKyAgICAvLyBXaGVuZXZlciB0aGVyZSBpcyBkYXRhIGF2YWlsYWJsZSB0byBS
ZWNlaXZlKCkuIE5vdGUgdGhhdCBzcHVyaW91cyBGRAorICAgIC8vIHdhdGNoIGV2ZW50cyBhcmUg
cG9zc2libGUsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgUmVjZWl2ZSgpIHNvb24gYWZ0ZXIKKyAg
ICAvLyBPbkRhdGFBdmFpbGFibGUoKSByZXR1cm5zIDAgKGp1c3QgaWdub3JlIHRob3NlKS4KKyAg
ICB2aXJ0dWFsIHZvaWQgT25EYXRhQXZhaWxhYmxlKFVuaXhTb2NrZXQqIHNlbGYpOworICB9Owor
CisgIGVudW0gY2xhc3MgU3RhdGUgeworICAgIGtEaXNjb25uZWN0ZWQgPSAwLCAgLy8gRmFpbGVk
IGNvbm5lY3Rpb24sIHBlZXIgZGlzY29ubmVjdGlvbiBvciBTaHV0ZG93bigpLgorICAgIGtDb25u
ZWN0aW5nLCAgLy8gU29vbiBhZnRlciBDb25uZWN0KCksIGJlZm9yZSBpdCBlaXRoZXIgc3VjY2Vl
ZHMgb3IgZmFpbHMuCisgICAga0Nvbm5lY3RlZCwgICAvLyBBZnRlciBhIHN1Y2Nlc3NmdWwgQ29u
bmVjdCgpLgorICAgIGtMaXN0ZW5pbmcgICAgLy8gQWZ0ZXIgTGlzdGVuKCksIHVudGlsIFNodXRk
b3duKCkuCisgIH07CisKKyAgLy8gQ3JlYXRlcyBhIHNvY2tldCBhbmQgc3RhcnRzIGxpc3Rlbmlu
Zy4gSWYgU29ja0ZhbWlseTo6a1VuaXggYW5kCisgIC8vIHxzb2NrZXRfbmFtZXwgc3RhcnRzIHdp
dGggYSAnQCcsIGFuIGFic3RyYWN0IFVOSVggZG1vYWluIHNvY2tldCB3aWxsIGJlCisgIC8vIGNy
ZWF0ZWQgaW5zdGVhZCBvZiBhIGZpbGVzeXN0ZW0tbGlua2VkIFVOSVggc29ja2V0IChMaW51eC9B
bmRyb2lkIG9ubHkpLgorICAvLyBJZiBTb2NrRmFtaWx5OjprSW5ldCwgfHNvY2tldF9uYW1lfCBp
cyBob3N0OnBvcnQgKGUuZy4sICIxLjIuMy40OjgwMDAiKS4KKyAgLy8gUmV0dXJucyBhbHdheXMg
YW4gaW5zdGFuY2UuIEluIGNhc2Ugb2YgZmFpbHVyZSAoZS5nLiwgYW5vdGhlciBzb2NrZXQKKyAg
Ly8gd2l0aCB0aGUgc2FtZSBuYW1lIGlzICBhbHJlYWR5IGxpc3RlbmluZykgdGhlIHJldHVybmVk
IHNvY2tldCB3aWxsIGhhdmUKKyAgLy8gaXNfbGlzdGVuaW5nKCkgPT0gZmFsc2UgYW5kIGxhc3Rf
ZXJyb3IoKSB3aWxsIGNvbnRhaW4gdGhlIGZhaWx1cmUgcmVhc29uLgorICBzdGF0aWMgc3RkOjp1
bmlxdWVfcHRyPFVuaXhTb2NrZXQ+IExpc3Rlbihjb25zdCBzdGQ6OnN0cmluZyYgc29ja2V0X25h
bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlz
dGVuZXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNr
UnVubmVyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29j
a0ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29j
a1R5cGUpOworCisgIC8vIEF0dGFjaGVzIHRvIGEgcHJlLWV4aXN0aW5nIHNvY2tldC4gVGhlIHNv
Y2tldCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGluCisgIC8vIFNPQ0tfU1RSRUFNIG1vZGUgYW5k
IHRoZSBjYWxsZXIgbXVzdCBoYXZlIGNhbGxlZCBiaW5kKCkgb24gaXQuCisgIHN0YXRpYyBzdGQ6
OnVuaXF1ZV9wdHI8VW5peFNvY2tldD4gTGlzdGVuKFNjb3BlZEZpbGUsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXIqLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrUnVubmVyKiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja0ZhbWlseSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja1R5cGUpOworCisgIC8vIENy
ZWF0ZXMgYSBVbml4IGRvbWFpbiBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIHRoZSBsaXN0ZW5pbmcg
ZW5kcG9pbnQuCisgIC8vIFJldHVybnMgYWx3YXlzIGFuIGluc3RhbmNlLiBFdmVudExpc3RlbmVy
OjpPbkNvbm5lY3QoYm9vbCBzdWNjZXNzKSB3aWxsCisgIC8vIGJlIGNhbGxlZCBhbHdheXMsIHdo
ZXRoZXIgdGhlIGNvbm5lY3Rpb24gc3VjY2VlZGVkIG9yIG5vdC4KKyAgc3RhdGljIHN0ZDo6dW5p
cXVlX3B0cjxVbml4U29ja2V0PiBDb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFt
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlz
dGVuZXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFz
a1J1bm5lciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBT
b2NrRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
U29ja1R5cGUpOworCisgIC8vIENvbnN0cnVjdHMgYSBVbml4U29ja2V0IHVzaW5nIHRoZSBnaXZl
biBjb25uZWN0ZWQgc29ja2V0LgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFVuaXhTb2NrZXQ+
IEFkb3B0Q29ubmVjdGVkKFNjb3BlZEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5lciosCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza1J1bm5lciosCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja0ZhbWlseSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Nr
VHlwZSk7CisKKyAgVW5peFNvY2tldChjb25zdCBVbml4U29ja2V0JikgPSBkZWxldGU7CisgIFVu
aXhTb2NrZXQmIG9wZXJhdG9yPShjb25zdCBVbml4U29ja2V0JikgPSBkZWxldGU7CisgIC8vIENh
bm5vdCBiZSBlYXNpbHkgbW92ZWQgYmVjYXVzZSBvZiB0YXNrcyBmcm9tIHRoZSBGaWxlRGVzY3Jp
cHRvcldhdGNoLgorICBVbml4U29ja2V0KFVuaXhTb2NrZXQmJikgPSBkZWxldGU7CisgIFVuaXhT
b2NrZXQmIG9wZXJhdG9yPShVbml4U29ja2V0JiYpID0gZGVsZXRlOworCisgIC8vIFRoaXMgY2xh
c3MgZ2l2ZXMgdGhlIGhhcmQgZ3VhcmFudGVlIHRoYXQgbm8gY2FsbGJhY2sgaXMgY2FsbGVkIG9u
IHRoZQorICAvLyBwYXNzZWQgRXZlbnRMaXN0ZW5lciBpbW1lZGlhdGVseSBhZnRlciB0aGUgb2Jq
ZWN0IGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgLy8gQW55IHF1ZXVlZCBjYWxsYmFjayB3aWxsIGJl
IHNpbGVudGx5IGRyb3BwZWQuCisgIH5Vbml4U29ja2V0KCk7CisKKyAgLy8gU2h1dHMgZG93biB0
aGUgY3VycmVudCBjb25uZWN0aW9uLCBpZiBhbnkuIElmIHRoZSBzb2NrZXQgd2FzIExpc3Rlbigp
LWluZywKKyAgLy8gc3RvcHMgbGlzdGVuaW5nLiBUaGUgc29ja2V0IGdvZXMgYmFjayB0byBrTm90
SW5pdGlhbGl6ZWQgc3RhdGUsIHNvIGl0IGNhbgorICAvLyBiZSByZXVzZWQgd2l0aCBMaXN0ZW4o
KSBvciBDb25uZWN0KCkuCisgIHZvaWQgU2h1dGRvd24oYm9vbCBub3RpZnkpOworCisgIC8vIFJl
dHVybnMgdHJ1ZSBpcyB0aGUgbWVzc2FnZSB3YXMgcXVldWVkLCBmYWxzZSBpZiB0aGVyZSB3YXMg
bm8gc3BhY2UgaW4gdGhlCisgIC8vIG91dHB1dCBidWZmZXIsIGluIHdoaWNoIGNhc2UgdGhlIGNs
aWVudCBzaG91bGQgcmV0cnkgb3IgZ2l2ZSB1cC4KKyAgLy8gSWYgYW55IG90aGVyIGVycm9yIGhh
cHBlbnMgdGhlIHNvY2tldCB3aWxsIGJlIHNodXRkb3duIGFuZAorICAvLyBFdmVudExpc3RlbmVy
OjpPbkRpc2Nvbm5lY3QoKSB3aWxsIGJlIGNhbGxlZC4KKyAgLy8gSWYgdGhlIHNvY2tldCBpcyBu
b3QgY29ubmVjdGVkLCBTZW5kKCkgd2lsbCBqdXN0IHJldHVybiBmYWxzZS4KKyAgLy8gRG9lcyBu
b3QgYXBwZW5kIGEgbnVsbCBzdHJpbmcgdGVybWluYXRvciB0byBtc2cgaW4gYW55IGNhc2UuCisg
IGJvb2wgU2VuZChjb25zdCB2b2lkKiBtc2csIHNpemVfdCBsZW4sIGNvbnN0IGludCogc2VuZF9m
ZHMsIHNpemVfdCBudW1fZmRzKTsKKworICBpbmxpbmUgYm9vbCBTZW5kKGNvbnN0IHZvaWQqIG1z
Zywgc2l6ZV90IGxlbiwgaW50IHNlbmRfZmQgPSAtMSkgeworICAgIGlmIChzZW5kX2ZkICE9IC0x
KQorICAgICAgcmV0dXJuIFNlbmQobXNnLCBsZW4sICZzZW5kX2ZkLCAxKTsKKyAgICByZXR1cm4g
U2VuZChtc2csIGxlbiwgbnVsbHB0ciwgMCk7CisgIH0KKworICBpbmxpbmUgYm9vbCBTZW5kKGNv
bnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICByZXR1cm4gU2VuZChtc2cuY19zdHIoKSwgbXNn
LnNpemUoKSArIDEsIC0xKTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRl
cyAoPD0gfGxlbnwpIHdyaXR0ZW4gaW4gfG1zZ3wgb3IgMCBpZiB0aGVyZQorICAvLyBpcyBubyBk
YXRhIGluIHRoZSBidWZmZXIgdG8gcmVhZCBvciBhbiBlcnJvciBvY2N1cnMgKGluIHdoaWNoIGNh
c2UgYQorICAvLyBFdmVudExpc3RlbmVyOjpPbkRpc2Nvbm5lY3QoKSB3aWxsIGZvbGxvdykuCisg
IC8vIElmIHRoZSBTY29wZWRGaWxlIHBvaW50ZXIgaXMgbm90IG51bGwgYW5kIGEgRkQgaXMgcmVj
ZWl2ZWQsIGl0IG1vdmVzIHRoZQorICAvLyByZWNlaXZlZCBGRCBpbnRvIHRoYXQuIElmIGEgRkQg
aXMgcmVjZWl2ZWQgYnV0IHRoZSBTY29wZWRGaWxlIHBvaW50ZXIgaXMKKyAgLy8gbnVsbCwgdGhl
IEZEIHdpbGwgYmUgYXV0b21hdGljYWxseSBjbG9zZWQuCisgIHNpemVfdCBSZWNlaXZlKHZvaWQq
IG1zZywgc2l6ZV90IGxlbiwgU2NvcGVkRmlsZSosIHNpemVfdCBtYXhfZmlsZXMgPSAxKTsKKwor
ICBpbmxpbmUgc2l6ZV90IFJlY2VpdmUodm9pZCogbXNnLCBzaXplX3QgbGVuKSB7CisgICAgcmV0
dXJuIFJlY2VpdmUobXNnLCBsZW4sIG51bGxwdHIsIDApOworICB9CisKKyAgLy8gT25seSBmb3Ig
dGVzdHMuIFRoaXMgaXMgc2xvd2VyIHRoYW4gUmVjZWl2ZSgpIGFzIGl0IHJlcXVpcmVzIGEgaGVh
cAorICAvLyBhbGxvY2F0aW9uIGFuZCBhIGNvcHkgZm9yIHRoZSBzdGQ6OnN0cmluZy4gR3VhcmFu
dGVlcyB0aGF0IHRoZSByZXR1cm5lZAorICAvLyBzdHJpbmcgaXMgbnVsbCB0ZXJtaW5hdGVkIGV2
ZW4gaWYgdGhlIHVuZGVybHlpbmcgbWVzc2FnZSBzZW50IGJ5IHRoZSBwZWVyCisgIC8vIGlzIG5v
dC4KKyAgc3RkOjpzdHJpbmcgUmVjZWl2ZVN0cmluZyhzaXplX3QgbWF4X2xlbmd0aCA9IDEwMjQp
OworCisgIGJvb2wgaXNfY29ubmVjdGVkKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfID09IFN0YXRl
OjprQ29ubmVjdGVkOyB9CisgIGJvb2wgaXNfbGlzdGVuaW5nKCkgY29uc3QgeyByZXR1cm4gc3Rh
dGVfID09IFN0YXRlOjprTGlzdGVuaW5nOyB9CisgIGludCBmZCgpIGNvbnN0IHsgcmV0dXJuIHNv
Y2tfcmF3Xy5mZCgpOyB9CisgIGludCBsYXN0X2Vycm9yKCkgY29uc3QgeyByZXR1cm4gbGFzdF9l
cnJvcl87IH0KKworICAvLyBVc2VyIElEIG9mIHRoZSBwZWVyLCBhcyByZXR1cm5lZCBieSB0aGUg
a2VybmVsLiBJZiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzCisgIC8vIGFuZCB0aGUgc29ja2V0IGdv
ZXMgaW50byB0aGUga0Rpc2Nvbm5lY3RlZCBzdGF0ZSwgaXQgcmV0YWlucyB0aGUgdWlkIG9mCisg
IC8vIHRoZSBsYXN0IHBlZXIuCisgIHVpZF90IHBlZXJfdWlkKCkgY29uc3QgeworICAgIFBFUkZF
VFRPX0RDSEVDSyghaXNfbGlzdGVuaW5nKCkgJiYgcGVlcl91aWRfICE9IGtJbnZhbGlkVWlkKTsK
KyAgICBpZ25vcmVfcmVzdWx0KGtJbnZhbGlkUGlkKTsgIC8vIFNpbGVuY2Ugd2FybmluZ3MgaW4g
YW1hbGdhbWF0ZWQgYnVpbGRzLgorICAgIHJldHVybiBwZWVyX3VpZF87CisgIH0KKworI2lmIFBF
UkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19MSU5VWCkgfHwgXAorICAgIFBFUkZFVFRPX0JV
SUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorICAvLyBQcm9jZXNzIElEIG9mIHRoZSBwZWVy
LCBhcyByZXR1cm5lZCBieSB0aGUga2VybmVsLiBJZiB0aGUgY2xpZW50CisgIC8vIGRpc2Nvbm5l
Y3RzIGFuZCB0aGUgc29ja2V0IGdvZXMgaW50byB0aGUga0Rpc2Nvbm5lY3RlZCBzdGF0ZSwgaXQK
KyAgLy8gcmV0YWlucyB0aGUgcGlkIG9mIHRoZSBsYXN0IHBlZXIuCisgIC8vCisgIC8vIFRoaXMg
aXMgb25seSBhdmFpbGFibGUgb24gTGludXggLyBBbmRyb2lkLgorICBwaWRfdCBwZWVyX3BpZCgp
IGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIWlzX2xpc3RlbmluZygpICYmIHBlZXJfcGlk
XyAhPSBrSW52YWxpZFBpZCk7CisgICAgcmV0dXJuIHBlZXJfcGlkXzsKKyAgfQorI2VuZGlmCisK
KyAgLy8gVGhpcyBtYWtlcyB0aGUgVW5peFNvY2tldCB1bnVzYWJsZS4KKyAgVW5peFNvY2tldFJh
dyBSZWxlYXNlU29ja2V0KCk7CisKKyBwcml2YXRlOgorICBVbml4U29ja2V0KEV2ZW50TGlzdGVu
ZXIqLCBUYXNrUnVubmVyKiwgU29ja0ZhbWlseSwgU29ja1R5cGUpOworICBVbml4U29ja2V0KEV2
ZW50TGlzdGVuZXIqLAorICAgICAgICAgICAgIFRhc2tSdW5uZXIqLAorICAgICAgICAgICAgIFNj
b3BlZEZpbGUsCisgICAgICAgICAgICAgU3RhdGUsCisgICAgICAgICAgICAgU29ja0ZhbWlseSwK
KyAgICAgICAgICAgICBTb2NrVHlwZSk7CisKKyAgLy8gQ2FsbGVkIG9uY2UgYnkgdGhlIGNvcnJl
c3BvbmRpbmcgcHVibGljIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMuCisgIHZvaWQgRG9Db25uZWN0
KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFtZSk7CisgIHZvaWQgUmVhZFBlZXJDcmVkZW50
aWFscygpOworCisgIHZvaWQgT25FdmVudCgpOworICB2b2lkIE5vdGlmeUNvbm5lY3Rpb25TdGF0
ZShib29sIHN1Y2Nlc3MpOworCisgIFVuaXhTb2NrZXRSYXcgc29ja19yYXdfOworICBTdGF0ZSBz
dGF0ZV8gPSBTdGF0ZTo6a0Rpc2Nvbm5lY3RlZDsKKyAgaW50IGxhc3RfZXJyb3JfID0gMDsKKyAg
dWlkX3QgcGVlcl91aWRfID0ga0ludmFsaWRVaWQ7CisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBF
UkZFVFRPX09TX0xJTlVYKSB8fCBcCisgICAgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09T
X0FORFJPSUQpCisgIHBpZF90IHBlZXJfcGlkXyA9IGtJbnZhbGlkUGlkOworI2VuZGlmCisgIEV2
ZW50TGlzdGVuZXIqIGNvbnN0IGV2ZW50X2xpc3RlbmVyXzsKKyAgVGFza1J1bm5lciogY29uc3Qg
dGFza19ydW5uZXJfOworICBXZWFrUHRyRmFjdG9yeTxVbml4U29ja2V0PiB3ZWFrX3B0cl9mYWN0
b3J5XzsgIC8vIEtlZXAgbGFzdC4KK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBu
YW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX0VYVF9CQVNF
X1VOSVhfU09DS0VUX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdW5peF9zb2NrZXQuaCIKKworI2luY2x1ZGUgPGVy
cm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUg
PG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4K
KyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRl
IDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4K
KworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xv
Z2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2Jhc2UvdGFza19ydW5uZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2V4dC9iYXNlL3N0cmluZ191dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdXRpbHMuaCIKKworI2lmIFBF
UkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19NQUNPU1gpCisjaW5jbHVkZSA8c3lzL3VjcmVk
Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKwor
Ly8gVGhlIENNU0dfKiBtYWNyb3MgdXNlIE5VTEwgaW5zdGVhZCBvZiBudWxscHRyLgorI3ByYWdt
YSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjaWYgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19P
U19NQUNPU1gpCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XemVyby1hcy1udWxs
LXBvaW50ZXItY29uc3RhbnQiCisjZW5kaWYKKworbmFtZXNwYWNlIHsKKworLy8gTVNHX05PU0lH
TkFMIGlzIG5vdCBzdXBwb3J0ZWQgb24gTWFjIE9TIFgsIGJ1dCBpbiB0aGF0IGNhc2UgdGhlIHNv
Y2tldCBpcworLy8gY3JlYXRlZCB3aXRoIFNPX05PU0lHUElQRSAoU2VlIEluaXRpYWxpemVTb2Nr
ZXQoKSkuCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX01BQ09TWCkKK2NvbnN0
ZXhwciBpbnQga05vU2lnUGlwZSA9IDA7CisjZWxzZQorY29uc3RleHByIGludCBrTm9TaWdQaXBl
ID0gTVNHX05PU0lHTkFMOworI2VuZGlmCisKKy8vIEFuZHJvaWQgdGFrZXMgYW4gaW50IGluc3Rl
YWQgb2Ygc29ja2xlbl90IGZvciB0aGUgY29udHJvbCBidWZmZXIgc2l6ZS4KKyNpZiBQRVJGRVRU
T19CVUlMREZMQUcoUEVSRkVUVE9fT1NfQU5EUk9JRCkKK3VzaW5nIENCdWZMZW5UeXBlID0gc2l6
ZV90OworI2Vsc2UKK3VzaW5nIENCdWZMZW5UeXBlID0gc29ja2xlbl90OworI2VuZGlmCisKKy8v
IEEgd3JhcHBlciBhcm91bmQgdmFyaWFibGUtc2l6ZSBzb2NrYWRkciBzdHJ1Y3RzLgorLy8gVGhp
cyBpcyBzb2x2aW5nIHRoZSBmb2xsb3dpbmcgcHJvYmxlbTogd2hlbiBjYWxsaW5nIGNvbm5lY3Qo
KSBvciBiaW5kKCksIHRoZQorLy8gY2FsbGVyIG5lZWRzIHRvIHRha2UgY2FyZSB0byBhbGxvY2F0
ZSB0aGUgcmlnaHQgc3RydWN0IChzb2NrYWRkcl91biBmb3IKKy8vIEFGX1VOSVgsIHNvY2thZGRy
X2luIGZvciBBRl9JTkVUKS4gICBUaG9zZSBzdHJ1Y3RzIGhhdmUgZGlmZmVyZW50IHNpemVzIGFu
ZCwKKy8vIG1vcmUgaW1wb3J0YW50bHksIGFyZSBiaWdnZXIgdGhhbiB0aGUgYmFzZSBzdHJ1Y3Qg
c29ja2FkZHIuCitzdHJ1Y3QgU29ja2FkZHJBbnkgeworICBTb2NrYWRkckFueSgpIDogc2l6ZSgp
IHt9CisgIFNvY2thZGRyQW55KGNvbnN0IHZvaWQqIGFkZHIsIHNvY2tsZW5fdCBzeikgOiBkYXRh
KG5ldyBjaGFyW3N6XSksIHNpemUoc3opIHsKKyAgICBtZW1jcHkoZGF0YS5nZXQoKSwgYWRkciwg
c3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplKSk7CisgIH0KKworICBjb25zdCBzdHJ1Y3Qgc29ja2Fk
ZHIqIGFkZHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3Ry
dWN0IHNvY2thZGRyKj4oZGF0YS5nZXQoKSk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Y2hh
cltdPiBkYXRhOworICBzb2NrbGVuX3Qgc2l6ZTsKK307CisKK2lubGluZSBpbnQgR2V0U29ja0Zh
bWlseShTb2NrRmFtaWx5IGZhbWlseSkgeworICBzd2l0Y2ggKGZhbWlseSkgeworICAgIGNhc2Ug
U29ja0ZhbWlseTo6a1VuaXg6CisgICAgICByZXR1cm4gQUZfVU5JWDsKKyAgICBjYXNlIFNvY2tG
YW1pbHk6OmtJbmV0OgorICAgICAgcmV0dXJuIEFGX0lORVQ7CisgIH0KKyAgUEVSRkVUVE9fQ0hF
Q0soZmFsc2UpOyAgLy8gRm9yIEdDQy4KK30KKworaW5saW5lIGludCBHZXRTb2NrVHlwZShTb2Nr
VHlwZSB0eXBlKSB7CisjaWZkZWYgU09DS19DTE9FWEVDCisgIGNvbnN0ZXhwciBpbnQga1NvY2tD
bG9FeGVjID0gU09DS19DTE9FWEVDOworI2Vsc2UKKyAgY29uc3RleHByIGludCBrU29ja0Nsb0V4
ZWMgPSAwOworI2VuZGlmCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgU29ja1R5cGU6OmtT
dHJlYW06CisgICAgICByZXR1cm4gU09DS19TVFJFQU0gfCBrU29ja0Nsb0V4ZWM7CisgICAgY2Fz
ZSBTb2NrVHlwZTo6a0RncmFtOgorICAgICAgcmV0dXJuIFNPQ0tfREdSQU0gfCBrU29ja0Nsb0V4
ZWM7CisgICAgY2FzZSBTb2NrVHlwZTo6a1NlcVBhY2tldDoKKyAgICAgIHJldHVybiBTT0NLX1NF
UVBBQ0tFVCB8IGtTb2NrQ2xvRXhlYzsKKyAgfQorICBQRVJGRVRUT19DSEVDSyhmYWxzZSk7ICAv
LyBGb3IgR0NDLgorfQorCitTb2NrYWRkckFueSBNYWtlU29ja0FkZHIoU29ja0ZhbWlseSBmYW1p
bHksIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFtZSkgeworICBzd2l0Y2ggKGZhbWlseSkg
eworICAgIGNhc2UgU29ja0ZhbWlseTo6a1VuaXg6IHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl91
biBzYWRkciB7fTsKKyAgICAgIGNvbnN0IHNpemVfdCBuYW1lX2xlbiA9IHNvY2tldF9uYW1lLnNp
emUoKTsKKyAgICAgIGlmIChuYW1lX2xlbiA+PSBzaXplb2Yoc2FkZHIuc3VuX3BhdGgpKSB7Cisg
ICAgICAgIGVycm5vID0gRU5BTUVUT09MT05HOworICAgICAgICByZXR1cm4gU29ja2FkZHJBbnko
KTsKKyAgICAgIH0KKyAgICAgIG1lbWNweShzYWRkci5zdW5fcGF0aCwgc29ja2V0X25hbWUuZGF0
YSgpLCBuYW1lX2xlbik7CisgICAgICBpZiAoc2FkZHIuc3VuX3BhdGhbMF0gPT0gJ0AnKQorICAg
ICAgICBzYWRkci5zdW5fcGF0aFswXSA9ICdcMCc7CisgICAgICBzYWRkci5zdW5fZmFtaWx5ID0g
QUZfVU5JWDsKKyAgICAgIGF1dG8gc2l6ZSA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oCisgICAg
ICAgICAgX19idWlsdGluX29mZnNldG9mKHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyBuYW1lX2xl
biArIDEpOworICAgICAgUEVSRkVUVE9fQ0hFQ0soc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplKSA8
PSBzaXplb2Yoc2FkZHIpKTsKKyAgICAgIHJldHVybiBTb2NrYWRkckFueSgmc2FkZHIsIHNpemUp
OworICAgIH0KKyAgICBjYXNlIFNvY2tGYW1pbHk6OmtJbmV0OiB7CisgICAgICBhdXRvIHBhcnRz
ID0gU3BsaXRTdHJpbmcoc29ja2V0X25hbWUsICI6Iik7CisgICAgICBQRVJGRVRUT19DSEVDSyhw
YXJ0cy5zaXplKCkgPT0gMik7CisgICAgICBzdHJ1Y3QgYWRkcmluZm8qIGFkZHJfaW5mbyA9IG51
bGxwdHI7CisgICAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMge307CisgICAgICBoaW50cy5haV9m
YW1pbHkgPSBBRl9JTkVUOworICAgICAgUEVSRkVUVE9fQ0hFQ0soZ2V0YWRkcmluZm8ocGFydHNb
MF0uY19zdHIoKSwgcGFydHNbMV0uY19zdHIoKSwgJmhpbnRzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJmFkZHJfaW5mbykgPT0gMCk7CisgICAgICBQRVJGRVRUT19DSEVDSyhh
ZGRyX2luZm8tPmFpX2ZhbWlseSA9PSBBRl9JTkVUKTsKKyAgICAgIFNvY2thZGRyQW55IHJlcyhh
ZGRyX2luZm8tPmFpX2FkZHIsIGFkZHJfaW5mby0+YWlfYWRkcmxlbik7CisgICAgICBmcmVlYWRk
cmluZm8oYWRkcl9pbmZvKTsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorICB9CisgIFBFUkZF
VFRPX0NIRUNLKGZhbHNlKTsgIC8vIEZvciBHQ0MuCit9CisKK30gIC8vIG5hbWVzcGFjZQorCisv
LyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyB8IFVuaXhTb2NrZXRSYXcgbWV0aG9kcyB8
CisvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKy8vIHN0YXRpYwordm9pZCBVbml4U29j
a2V0UmF3OjpTaGlmdE1zZ0hkcihzaXplX3Qgbiwgc3RydWN0IG1zZ2hkciogbXNnKSB7CisgIHVz
aW5nIExlblR5cGUgPSBkZWNsdHlwZShtc2ctPm1zZ19pb3ZsZW4pOyAgLy8gTWFjIGFuZCBMaW51
eCBkb24ndCBhZ3JlZS4KKyAgZm9yIChMZW5UeXBlIGkgPSAwOyBpIDwgbXNnLT5tc2dfaW92bGVu
OyArK2kpIHsKKyAgICBzdHJ1Y3QgaW92ZWMqIHZlYyA9ICZtc2ctPm1zZ19pb3ZbaV07CisgICAg
aWYgKG4gPCB2ZWMtPmlvdl9sZW4pIHsKKyAgICAgIC8vIFdlIHNlbnQgYSBwYXJ0IG9mIHRoaXMg
aW92ZWMuCisgICAgICB2ZWMtPmlvdl9iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odmVj
LT5pb3ZfYmFzZSkgKyBuOworICAgICAgdmVjLT5pb3ZfbGVuIC09IG47CisgICAgICBtc2ctPm1z
Z19pb3YgPSB2ZWM7CisgICAgICBtc2ctPm1zZ19pb3ZsZW4gLT0gaTsKKyAgICAgIHJldHVybjsK
KyAgICB9CisgICAgLy8gV2Ugc2VudCB0aGUgd2hvbGUgaW92ZWMuCisgICAgbiAtPSB2ZWMtPmlv
dl9sZW47CisgIH0KKyAgLy8gV2Ugc2VudCBhbGwgdGhlIGlvdmVjcy4KKyAgUEVSRkVUVE9fQ0hF
Q0sobiA9PSAwKTsKKyAgbXNnLT5tc2dfaW92bGVuID0gMDsKKyAgbXNnLT5tc2dfaW92ID0gbnVs
bHB0cjsKK30KKworLy8gc3RhdGljCitVbml4U29ja2V0UmF3IFVuaXhTb2NrZXRSYXc6OkNyZWF0
ZU1heUZhaWwoU29ja0ZhbWlseSBmYW1pbHksIFNvY2tUeXBlIHR5cGUpIHsKKyAgYXV0byBmZCA9
IFNjb3BlZEZpbGUoc29ja2V0KEdldFNvY2tGYW1pbHkoZmFtaWx5KSwgR2V0U29ja1R5cGUodHlw
ZSksIDApKTsKKyAgaWYgKCFmZCkgeworICAgIHJldHVybiBVbml4U29ja2V0UmF3KCk7CisgIH0K
KyAgcmV0dXJuIFVuaXhTb2NrZXRSYXcoc3RkOjptb3ZlKGZkKSwgZmFtaWx5LCB0eXBlKTsKK30K
KworLy8gc3RhdGljCitzdGQ6OnBhaXI8VW5peFNvY2tldFJhdywgVW5peFNvY2tldFJhdz4gVW5p
eFNvY2tldFJhdzo6Q3JlYXRlUGFpcigKKyAgICBTb2NrRmFtaWx5IGZhbWlseSwKKyAgICBTb2Nr
VHlwZSB0eXBlKSB7CisgIGludCBmZHNbMl07CisgIGlmIChzb2NrZXRwYWlyKEdldFNvY2tGYW1p
bHkoZmFtaWx5KSwgR2V0U29ja1R5cGUodHlwZSksIDAsIGZkcykgIT0gMCkKKyAgICByZXR1cm4g
c3RkOjptYWtlX3BhaXIoVW5peFNvY2tldFJhdygpLCBVbml4U29ja2V0UmF3KCkpOworCisgIHJl
dHVybiBzdGQ6Om1ha2VfcGFpcihVbml4U29ja2V0UmF3KFNjb3BlZEZpbGUoZmRzWzBdKSwgZmFt
aWx5LCB0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVuaXhTb2NrZXRSYXcoU2NvcGVk
RmlsZShmZHNbMV0pLCBmYW1pbHksIHR5cGUpKTsKK30KKworVW5peFNvY2tldFJhdzo6VW5peFNv
Y2tldFJhdygpID0gZGVmYXVsdDsKKworVW5peFNvY2tldFJhdzo6VW5peFNvY2tldFJhdyhTb2Nr
RmFtaWx5IGZhbWlseSwgU29ja1R5cGUgdHlwZSkKKyAgICA6IFVuaXhTb2NrZXRSYXcoCisgICAg
ICAgICAgU2NvcGVkRmlsZShzb2NrZXQoR2V0U29ja0ZhbWlseShmYW1pbHkpLCBHZXRTb2NrVHlw
ZSh0eXBlKSwgMCkpLAorICAgICAgICAgIGZhbWlseSwKKyAgICAgICAgICB0eXBlKSB7fQorCitV
bml4U29ja2V0UmF3OjpVbml4U29ja2V0UmF3KFNjb3BlZEZpbGUgZmQsIFNvY2tGYW1pbHkgZmFt
aWx5LCBTb2NrVHlwZSB0eXBlKQorICAgIDogZmRfKHN0ZDo6bW92ZShmZCkpLCBmYW1pbHlfKGZh
bWlseSksIHR5cGVfKHR5cGUpIHsKKyAgUEVSRkVUVE9fQ0hFQ0soZmRfKTsKKyNpZiBQRVJGRVRU
T19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTUFDT1NYKQorICBjb25zdCBpbnQgbm9fc2lncGlwZSA9
IDE7CisgIHNldHNvY2tvcHQoKmZkXywgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmbm9fc2ln
cGlwZSwgc2l6ZW9mKG5vX3NpZ3BpcGUpKTsKKyNlbmRpZgorCisgIGlmIChmYW1pbHkgPT0gU29j
a0ZhbWlseTo6a0luZXQpIHsKKyAgICBpbnQgZmxhZyA9IDE7CisgICAgUEVSRkVUVE9fQ0hFQ0so
CisgICAgICAgICFzZXRzb2Nrb3B0KCpmZF8sIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJmZs
YWcsIHNpemVvZihmbGFnKSkpOworICB9CisKKyAgLy8gVGhlcmUgaXMgbm8gcmVhc29uIHdoeSBh
IHNvY2tldCBzaG91bGQgb3V0bGl2ZSB0aGUgcHJvY2VzcyBpbiBjYXNlIG9mCisgIC8vIGV4ZWMo
KSBieSBkZWZhdWx0LCB0aGlzIGlzIGp1c3Qgd29ya2luZyBhcm91bmQgYSBicm9rZW4gdW5peCBk
ZXNpZ24uCisgIGludCBmY250bF9yZXMgPSBmY250bCgqZmRfLCBGX1NFVEZELCBGRF9DTE9FWEVD
KTsKKyAgUEVSRkVUVE9fQ0hFQ0soZmNudGxfcmVzID09IDApOworfQorCit2b2lkIFVuaXhTb2Nr
ZXRSYXc6OlNldEJsb2NraW5nKGJvb2wgaXNfYmxvY2tpbmcpIHsKKyAgUEVSRkVUVE9fRENIRUNL
KGZkXyk7CisgIGludCBmbGFncyA9IGZjbnRsKCpmZF8sIEZfR0VURkwsIDApOworICBpZiAoIWlz
X2Jsb2NraW5nKSB7CisgICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgfSBlbHNlIHsKKyAgICBm
bGFncyAmPSB+c3RhdGljX2Nhc3Q8aW50PihPX05PTkJMT0NLKTsKKyAgfQorICBib29sIGZjbnRs
X3JlcyA9IGZjbnRsKCpmZF8sIEZfU0VURkwsIGZsYWdzKTsKKyAgUEVSRkVUVE9fQ0hFQ0soZmNu
dGxfcmVzID09IDApOworfQorCit2b2lkIFVuaXhTb2NrZXRSYXc6OlJldGFpbk9uRXhlYygpIHsK
KyAgUEVSRkVUVE9fRENIRUNLKGZkXyk7CisgIGludCBmbGFncyA9IGZjbnRsKCpmZF8sIEZfR0VU
RkQsIDApOworICBmbGFncyAmPSB+c3RhdGljX2Nhc3Q8aW50PihGRF9DTE9FWEVDKTsKKyAgYm9v
bCBmY250bF9yZXMgPSBmY250bCgqZmRfLCBGX1NFVEZELCBmbGFncyk7CisgIFBFUkZFVFRPX0NI
RUNLKGZjbnRsX3JlcyA9PSAwKTsKK30KKworYm9vbCBVbml4U29ja2V0UmF3OjpJc0Jsb2NraW5n
KCkgY29uc3QgeworICBQRVJGRVRUT19EQ0hFQ0soZmRfKTsKKyAgcmV0dXJuIChmY250bCgqZmRf
LCBGX0dFVEZMLCAwKSAmIE9fTk9OQkxPQ0spID09IDA7Cit9CisKK2Jvb2wgVW5peFNvY2tldFJh
dzo6QmluZChjb25zdCBzdGQ6OnN0cmluZyYgc29ja2V0X25hbWUpIHsKKyAgUEVSRkVUVE9fRENI
RUNLKGZkXyk7CisgIFNvY2thZGRyQW55IGFkZHIgPSBNYWtlU29ja0FkZHIoZmFtaWx5Xywgc29j
a2V0X25hbWUpOworICBpZiAoYWRkci5zaXplID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisg
IGlmIChiaW5kKCpmZF8sIGFkZHIuYWRkcigpLCBhZGRyLnNpemUpKSB7CisgICAgUEVSRkVUVE9f
RFBMT0coImJpbmQoJXMpIiwgc29ja2V0X25hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIGZhbHNl
OworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVW5peFNvY2tldFJhdzo6TGlzdGVu
KCkgeworICBQRVJGRVRUT19EQ0hFQ0soZmRfKTsKKyAgUEVSRkVUVE9fRENIRUNLKHR5cGVfID09
IFNvY2tUeXBlOjprU3RyZWFtIHx8IHR5cGVfID09IFNvY2tUeXBlOjprU2VxUGFja2V0KTsKKyAg
cmV0dXJuIGxpc3RlbigqZmRfLCBTT01BWENPTk4pID09IDA7Cit9CisKK2Jvb2wgVW5peFNvY2tl
dFJhdzo6Q29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgc29ja2V0X25hbWUpIHsKKyAgUEVSRkVU
VE9fRENIRUNLKGZkXyk7CisgIFNvY2thZGRyQW55IGFkZHIgPSBNYWtlU29ja0FkZHIoZmFtaWx5
Xywgc29ja2V0X25hbWUpOworICBpZiAoYWRkci5zaXplID09IDApCisgICAgcmV0dXJuIGZhbHNl
OworCisgIGludCByZXMgPSBQRVJGRVRUT19FSU5UUihjb25uZWN0KCpmZF8sIGFkZHIuYWRkcigp
LCBhZGRyLnNpemUpKTsKKyAgaWYgKHJlcyAmJiBlcnJubyAhPSBFSU5QUk9HUkVTUykKKyAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVW5peFNvY2tldFJhdzo6
U2h1dGRvd24oKSB7CisgIHNodXRkb3duKCpmZF8sIFNIVVRfUkRXUik7CisgIGZkXy5yZXNldCgp
OworfQorCisvLyBGb3IgdGhlIGludGVyZXN0ZWQgcmVhZGVyLCBMaW51eCBrZXJuZWwgZGl2ZSB0
byB2ZXJpZnkgdGhpcyBpcyBub3Qgb25seSBhCisvLyB0aGVvcmV0aWNhbCBwb3NzaWJpbGl0eTog
c29ja19zdHJlYW1fc2VuZG1zZywgaWYgc29ja19hbGxvY19zZW5kX3Bza2IgcmV0dXJucworLy8g
TlVMTCBbMV0gKHdoaWNoIGl0IGRvZXMgd2hlbiBpdCBnZXRzIGludGVycnVwdGVkIFsyXSksIHJl
dHVybnMgZWFybHkgd2l0aCB0aGUKKy8vIGFtb3VudCBvZiBieXRlcyBhbHJlYWR5IHNlbnQuCisv
LworLy8gWzFdOgorLy8gaHR0cHM6Ly9lbGl4aXIuYm9vdGxpbi5jb20vbGludXgvdjQuMTguMTAv
c291cmNlL25ldC91bml4L2FmX3VuaXguYyNMMTg3MgorLy8gWzJdOiBodHRwczovL2VsaXhpci5i
b290bGluLmNvbS9saW51eC92NC4xOC4xMC9zb3VyY2UvbmV0L2NvcmUvc29jay5jI0wyMTAxCitz
c2l6ZV90IFVuaXhTb2NrZXRSYXc6OlNlbmRNc2dBbGwoc3RydWN0IG1zZ2hkciogbXNnKSB7Cisg
IC8vIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiBub24tYmxvY2tpbmcgc29ja2V0cy4KKyAg
UEVSRkVUVE9fRENIRUNLKGZkXyk7CisKKyAgc3NpemVfdCB0b3RhbF9zZW50ID0gMDsKKyAgd2hp
bGUgKG1zZy0+bXNnX2lvdikgeworICAgIHNzaXplX3Qgc2VudCA9IFBFUkZFVFRPX0VJTlRSKHNl
bmRtc2coKmZkXywgbXNnLCBrTm9TaWdQaXBlKSk7CisgICAgaWYgKHNlbnQgPD0gMCkgeworICAg
ICAgaWYgKHNlbnQgPT0gLTEgJiYgSXNBZ2FpbihlcnJubykpCisgICAgICAgIHJldHVybiB0b3Rh
bF9zZW50OworICAgICAgcmV0dXJuIHNlbnQ7CisgICAgfQorICAgIHRvdGFsX3NlbnQgKz0gc2Vu
dDsKKyAgICBTaGlmdE1zZ0hkcihzdGF0aWNfY2FzdDxzaXplX3Q+KHNlbnQpLCBtc2cpOworICAg
IC8vIE9ubHkgc2VuZCB0aGUgYW5jaWxsYXJ5IGRhdGEgd2l0aCB0aGUgZmlyc3Qgc2VuZG1zZyBj
YWxsLgorICAgIG1zZy0+bXNnX2NvbnRyb2wgPSBudWxscHRyOworICAgIG1zZy0+bXNnX2NvbnRy
b2xsZW4gPSAwOworICB9CisgIHJldHVybiB0b3RhbF9zZW50OworfQorCitzc2l6ZV90IFVuaXhT
b2NrZXRSYXc6OlNlbmQoY29uc3Qgdm9pZCogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBz
ZW5kX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2Zkcykgewor
ICBQRVJGRVRUT19EQ0hFQ0soZmRfKTsKKyAgbXNnaGRyIG1zZ19oZHIgPSB7fTsKKyAgaW92ZWMg
aW92ID0ge2NvbnN0X2Nhc3Q8dm9pZCo+KG1zZyksIGxlbn07CisgIG1zZ19oZHIubXNnX2lvdiA9
ICZpb3Y7CisgIG1zZ19oZHIubXNnX2lvdmxlbiA9IDE7CisgIGFsaWduYXMoY21zZ2hkcikgY2hh
ciBjb250cm9sX2J1ZlsyNTZdOworCisgIGlmIChudW1fZmRzID4gMCkgeworICAgIGNvbnN0IGF1
dG8gcmF3X2N0bF9kYXRhX3N6ID0gbnVtX2ZkcyAqIHNpemVvZihpbnQpOworICAgIGNvbnN0IENC
dWZMZW5UeXBlIGNvbnRyb2xfYnVmX2xlbiA9CisgICAgICAgIHN0YXRpY19jYXN0PENCdWZMZW5U
eXBlPihDTVNHX1NQQUNFKHJhd19jdGxfZGF0YV9zeikpOworICAgIFBFUkZFVFRPX0NIRUNLKGNv
bnRyb2xfYnVmX2xlbiA8PSBzaXplb2YoY29udHJvbF9idWYpKTsKKyAgICBtZW1zZXQoY29udHJv
bF9idWYsIDAsIHNpemVvZihjb250cm9sX2J1ZikpOworICAgIG1zZ19oZHIubXNnX2NvbnRyb2wg
PSBjb250cm9sX2J1ZjsKKyAgICBtc2dfaGRyLm1zZ19jb250cm9sbGVuID0gY29udHJvbF9idWZf
bGVuOyAgLy8gdXNlZCBieSBDTVNHX0ZJUlNUSERSCisgICAgc3RydWN0IGNtc2doZHIqIGNtc2cg
PSBDTVNHX0ZJUlNUSERSKCZtc2dfaGRyKTsKKyAgICBjbXNnLT5jbXNnX2xldmVsID0gU09MX1NP
Q0tFVDsKKyAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgIGNtc2ctPmNtc2df
bGVuID0gc3RhdGljX2Nhc3Q8Q0J1ZkxlblR5cGU+KENNU0dfTEVOKHJhd19jdGxfZGF0YV9zeikp
OworICAgIG1lbWNweShDTVNHX0RBVEEoY21zZyksIHNlbmRfZmRzLCBudW1fZmRzICogc2l6ZW9m
KGludCkpOworICAgIC8vIG5vdGU6IGlmIHdlIHdlcmUgdG8gc2VuZCBtdWx0aXBsZSBjbXNnaGRy
IHN0cnVjdHVyZXMsIHRoZW4KKyAgICAvLyBtc2dfaGRyLm1zZ19jb250cm9sbGVuIHdvdWxkIG5l
ZWQgdG8gYmUgYWRqdXN0ZWQsIHNlZSAibWFuIDMgY21zZyIuCisgIH0KKworICByZXR1cm4gU2Vu
ZE1zZ0FsbCgmbXNnX2hkcik7Cit9CisKK3NzaXplX3QgVW5peFNvY2tldFJhdzo6UmVjZWl2ZSh2
b2lkKiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZWRGaWxlKiBmZF92ZWMsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heF9maWxlcykgeworICBQRVJGRVRUT19E
Q0hFQ0soZmRfKTsKKyAgbXNnaGRyIG1zZ19oZHIgPSB7fTsKKyAgaW92ZWMgaW92ID0ge21zZywg
bGVufTsKKyAgbXNnX2hkci5tc2dfaW92ID0gJmlvdjsKKyAgbXNnX2hkci5tc2dfaW92bGVuID0g
MTsKKyAgYWxpZ25hcyhjbXNnaGRyKSBjaGFyIGNvbnRyb2xfYnVmWzI1Nl07CisKKyAgaWYgKG1h
eF9maWxlcyA+IDApIHsKKyAgICBtc2dfaGRyLm1zZ19jb250cm9sID0gY29udHJvbF9idWY7Cisg
ICAgbXNnX2hkci5tc2dfY29udHJvbGxlbiA9CisgICAgICAgIHN0YXRpY19jYXN0PENCdWZMZW5U
eXBlPihDTVNHX1NQQUNFKG1heF9maWxlcyAqIHNpemVvZihpbnQpKSk7CisgICAgUEVSRkVUVE9f
Q0hFQ0sobXNnX2hkci5tc2dfY29udHJvbGxlbiA8PSBzaXplb2YoY29udHJvbF9idWYpKTsKKyAg
fQorICBjb25zdCBzc2l6ZV90IHN6ID0gUEVSRkVUVE9fRUlOVFIocmVjdm1zZygqZmRfLCAmbXNn
X2hkciwgMCkpOworICBpZiAoc3ogPD0gMCkgeworICAgIHJldHVybiBzejsKKyAgfQorICBQRVJG
RVRUT19DSEVDSyhzdGF0aWNfY2FzdDxzaXplX3Q+KHN6KSA8PSBsZW4pOworCisgIGludCogZmRz
ID0gbnVsbHB0cjsKKyAgdWludDMyX3QgZmRzX2xlbiA9IDA7CisKKyAgaWYgKG1heF9maWxlcyA+
IDApIHsKKyAgICBmb3IgKGNtc2doZHIqIGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2dfaGRyKTsg
Y21zZzsKKyAgICAgICAgIGNtc2cgPSBDTVNHX05YVEhEUigmbXNnX2hkciwgY21zZykpIHsKKyAg
ICAgIGNvbnN0IHNpemVfdCBwYXlsb2FkX2xlbiA9IGNtc2ctPmNtc2dfbGVuIC0gQ01TR19MRU4o
MCk7CisgICAgICBpZiAoY21zZy0+Y21zZ19sZXZlbCA9PSBTT0xfU09DS0VUICYmIGNtc2ctPmNt
c2dfdHlwZSA9PSBTQ01fUklHSFRTKSB7CisgICAgICAgIFBFUkZFVFRPX0RDSEVDSyhwYXlsb2Fk
X2xlbiAlIHNpemVvZihpbnQpID09IDB1KTsKKyAgICAgICAgUEVSRkVUVE9fQ0hFQ0soZmRzID09
IG51bGxwdHIpOworICAgICAgICBmZHMgPSByZWludGVycHJldF9jYXN0PGludCo+KENNU0dfREFU
QShjbXNnKSk7CisgICAgICAgIGZkc19sZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGF5bG9h
ZF9sZW4gLyBzaXplb2YoaW50KSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG1zZ19o
ZHIubXNnX2ZsYWdzICYgTVNHX1RSVU5DIHx8IG1zZ19oZHIubXNnX2ZsYWdzICYgTVNHX0NUUlVO
QykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBmZHMgJiYgaSA8IGZkc19sZW47ICsraSkKKyAg
ICAgIGNsb3NlKGZkc1tpXSk7CisgICAgZXJybm8gPSBFTVNHU0laRTsKKyAgICByZXR1cm4gLTE7
CisgIH0KKworICBmb3IgKHNpemVfdCBpID0gMDsgZmRzICYmIGkgPCBmZHNfbGVuOyArK2kpIHsK
KyAgICBpZiAoaSA8IG1heF9maWxlcykKKyAgICAgIGZkX3ZlY1tpXS5yZXNldChmZHNbaV0pOwor
ICAgIGVsc2UKKyAgICAgIGNsb3NlKGZkc1tpXSk7CisgIH0KKworICByZXR1cm4gc3o7Cit9CisK
K2Jvb2wgVW5peFNvY2tldFJhdzo6U2V0VHhUaW1lb3V0KHVpbnQzMl90IHRpbWVvdXRfbXMpIHsK
KyAgUEVSRkVUVE9fRENIRUNLKGZkXyk7CisgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQge307Cisg
IHVpbnQzMl90IHRpbWVvdXRfc2VjID0gdGltZW91dF9tcyAvIDEwMDA7CisgIHRpbWVvdXQudHZf
c2VjID0gc3RhdGljX2Nhc3Q8ZGVjbHR5cGUodGltZW91dC50dl9zZWMpPih0aW1lb3V0X3NlYyk7
CisgIHRpbWVvdXQudHZfdXNlYyA9IHN0YXRpY19jYXN0PGRlY2x0eXBlKHRpbWVvdXQudHZfdXNl
Yyk+KAorICAgICAgKHRpbWVvdXRfbXMgLSAodGltZW91dF9zZWMgKiAxMDAwKSkgKiAxMDAwKTsK
KworICByZXR1cm4gc2V0c29ja29wdCgqZmRfLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywKKyAg
ICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnRpbWVvdXQp
LAorICAgICAgICAgICAgICAgICAgICBzaXplb2YodGltZW91dCkpID09IDA7Cit9CisKK2Jvb2wg
VW5peFNvY2tldFJhdzo6U2V0UnhUaW1lb3V0KHVpbnQzMl90IHRpbWVvdXRfbXMpIHsKKyAgUEVS
RkVUVE9fRENIRUNLKGZkXyk7CisgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQge307CisgIHVpbnQz
Ml90IHRpbWVvdXRfc2VjID0gdGltZW91dF9tcyAvIDEwMDA7CisgIHRpbWVvdXQudHZfc2VjID0g
c3RhdGljX2Nhc3Q8ZGVjbHR5cGUodGltZW91dC50dl9zZWMpPih0aW1lb3V0X3NlYyk7CisgIHRp
bWVvdXQudHZfdXNlYyA9IHN0YXRpY19jYXN0PGRlY2x0eXBlKHRpbWVvdXQudHZfdXNlYyk+KAor
ICAgICAgKHRpbWVvdXRfbXMgLSAodGltZW91dF9zZWMgKiAxMDAwKSkgKiAxMDAwKTsKKworICBy
ZXR1cm4gc2V0c29ja29wdCgqZmRfLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywKKyAgICAgICAg
ICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnRpbWVvdXQpLAorICAg
ICAgICAgICAgICAgICAgICBzaXplb2YodGltZW91dCkpID09IDA7Cit9CisKKyNwcmFnbWEgR0ND
IGRpYWdub3N0aWMgcG9wCisKKy8vICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIHwgVW5peFNv
Y2tldCBtZXRob2RzIHwKKy8vICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworLy8gVE9ETyhwcmlt
aWFubyk6IEFkZCBUaHJlYWRDaGVja2VyIHRvIG1ldGhvZHMgb2YgdGhpcyBjbGFzcy4KKworLy8g
c3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8VW5peFNvY2tldD4gVW5peFNvY2tldDo6TGlzdGVuKGNv
bnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5lciogZXZlbnRfbGlzdGVuZXIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tSdW5uZXIqIHRh
c2tfcnVubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBTb2NrRmFtaWx5IHNvY2tfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBTb2NrVHlwZSBzb2NrX3R5cGUpIHsKKyAgYXV0byBzb2NrX3JhdyA9
IFVuaXhTb2NrZXRSYXc6OkNyZWF0ZU1heUZhaWwoc29ja19mYW1pbHksIHNvY2tfdHlwZSk7Cisg
IGlmICghc29ja19yYXcgfHwgIXNvY2tfcmF3LkJpbmQoc29ja2V0X25hbWUpKQorICAgIHJldHVy
biBudWxscHRyOworCisgIC8vIEZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIExpc3RlbigpIG92ZXJs
b2FkIGJlbG93LgorICByZXR1cm4gTGlzdGVuKHNvY2tfcmF3LlJlbGVhc2VGZCgpLCBldmVudF9s
aXN0ZW5lciwgdGFza19ydW5uZXIsIHNvY2tfZmFtaWx5LAorICAgICAgICAgICAgICAgIHNvY2tf
dHlwZSk7Cit9CisKKy8vIHN0YXRpYworc3RkOjp1bmlxdWVfcHRyPFVuaXhTb2NrZXQ+IFVuaXhT
b2NrZXQ6Okxpc3RlbihTY29wZWRGaWxlIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBFdmVudExpc3RlbmVyKiBldmVudF9saXN0ZW5lciwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza1J1bm5lciogdGFz
a19ydW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFNvY2tGYW1pbHkgc29ja19mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFNvY2tUeXBlIHNvY2tfdHlwZSkgeworICByZXR1cm4gc3RkOjp1bmlx
dWVfcHRyPFVuaXhTb2NrZXQ+KAorICAgICAgbmV3IFVuaXhTb2NrZXQoZXZlbnRfbGlzdGVuZXIs
IHRhc2tfcnVubmVyLCBzdGQ6Om1vdmUoZmQpLAorICAgICAgICAgICAgICAgICAgICAgU3RhdGU6
OmtMaXN0ZW5pbmcsIHNvY2tfZmFtaWx5LCBzb2NrX3R5cGUpKTsKK30KKworLy8gc3RhdGljCitz
dGQ6OnVuaXF1ZV9wdHI8VW5peFNvY2tldD4gVW5peFNvY2tldDo6Q29ubmVjdChjb25zdCBzdGQ6
OnN0cmluZyYgc29ja2V0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBFdmVudExpc3RlbmVyKiBldmVudF9saXN0ZW5lciwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tSdW5uZXIqIHRhc2tfcnVu
bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29j
a0ZhbWlseSBzb2NrX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFNvY2tUeXBlIHNvY2tfdHlwZSkgeworICBzdGQ6OnVuaXF1ZV9wdHI8VW5p
eFNvY2tldD4gc29jaygKKyAgICAgIG5ldyBVbml4U29ja2V0KGV2ZW50X2xpc3RlbmVyLCB0YXNr
X3J1bm5lciwgc29ja19mYW1pbHksIHNvY2tfdHlwZSkpOworICBzb2NrLT5Eb0Nvbm5lY3Qoc29j
a2V0X25hbWUpOworICByZXR1cm4gc29jazsKK30KKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9w
dHI8VW5peFNvY2tldD4gVW5peFNvY2tldDo6QWRvcHRDb25uZWN0ZWQoCisgICAgU2NvcGVkRmls
ZSBmZCwKKyAgICBFdmVudExpc3RlbmVyKiBldmVudF9saXN0ZW5lciwKKyAgICBUYXNrUnVubmVy
KiB0YXNrX3J1bm5lciwKKyAgICBTb2NrRmFtaWx5IHNvY2tfZmFtaWx5LAorICAgIFNvY2tUeXBl
IHNvY2tfdHlwZSkgeworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFVuaXhTb2NrZXQ+KAorICAg
ICAgbmV3IFVuaXhTb2NrZXQoZXZlbnRfbGlzdGVuZXIsIHRhc2tfcnVubmVyLCBzdGQ6Om1vdmUo
ZmQpLAorICAgICAgICAgICAgICAgICAgICAgU3RhdGU6OmtDb25uZWN0ZWQsIHNvY2tfZmFtaWx5
LCBzb2NrX3R5cGUpKTsKK30KKworVW5peFNvY2tldDo6VW5peFNvY2tldChFdmVudExpc3RlbmVy
KiBldmVudF9saXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgVGFza1J1bm5lciogdGFz
a19ydW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFNvY2tGYW1pbHkgc29ja19mYW1pbHks
CisgICAgICAgICAgICAgICAgICAgICAgIFNvY2tUeXBlIHNvY2tfdHlwZSkKKyAgICA6IFVuaXhT
b2NrZXQoZXZlbnRfbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgIHRhc2tfcnVubmVyLAorICAg
ICAgICAgICAgICAgICBTY29wZWRGaWxlKCksCisgICAgICAgICAgICAgICAgIFN0YXRlOjprRGlz
Y29ubmVjdGVkLAorICAgICAgICAgICAgICAgICBzb2NrX2ZhbWlseSwKKyAgICAgICAgICAgICAg
ICAgc29ja190eXBlKSB7fQorCitVbml4U29ja2V0OjpVbml4U29ja2V0KEV2ZW50TGlzdGVuZXIq
IGV2ZW50X2xpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICBUYXNrUnVubmVyKiB0YXNr
X3J1bm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NvcGVkRmlsZSBhZG9wdF9mZCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgU3RhdGUgYWRvcHRfc3RhdGUsCisgICAgICAgICAgICAgICAg
ICAgICAgIFNvY2tGYW1pbHkgc29ja19mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgIFNv
Y2tUeXBlIHNvY2tfdHlwZSkKKyAgICA6IGV2ZW50X2xpc3RlbmVyXyhldmVudF9saXN0ZW5lciks
CisgICAgICB0YXNrX3J1bm5lcl8odGFza19ydW5uZXIpLAorICAgICAgd2Vha19wdHJfZmFjdG9y
eV8odGhpcykgeworICBzdGF0ZV8gPSBTdGF0ZTo6a0Rpc2Nvbm5lY3RlZDsKKyAgaWYgKGFkb3B0
X3N0YXRlID09IFN0YXRlOjprRGlzY29ubmVjdGVkKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKCFh
ZG9wdF9mZCk7CisgICAgc29ja19yYXdfID0gVW5peFNvY2tldFJhdzo6Q3JlYXRlTWF5RmFpbChz
b2NrX2ZhbWlseSwgc29ja190eXBlKTsKKyAgICBpZiAoIXNvY2tfcmF3XykgeworICAgICAgbGFz
dF9lcnJvcl8gPSBlcnJubzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAoYWRv
cHRfc3RhdGUgPT0gU3RhdGU6OmtDb25uZWN0ZWQpIHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soYWRv
cHRfZmQpOworICAgIHNvY2tfcmF3XyA9IFVuaXhTb2NrZXRSYXcoc3RkOjptb3ZlKGFkb3B0X2Zk
KSwgc29ja19mYW1pbHksIHNvY2tfdHlwZSk7CisgICAgc3RhdGVfID0gU3RhdGU6OmtDb25uZWN0
ZWQ7CisgICAgUmVhZFBlZXJDcmVkZW50aWFscygpOworICB9IGVsc2UgaWYgKGFkb3B0X3N0YXRl
ID09IFN0YXRlOjprTGlzdGVuaW5nKSB7CisgICAgLy8gV2UgZ2V0IGhlcmUgZnJvbSBMaXN0ZW4o
KS4KKworICAgIC8vIHxhZG9wdF9mZHwgbWlnaHQgZ2VudWluZWx5IGJlIGludmFsaWQgaWYgdGhl
IGJpbmQoKSBmYWlsZWQuCisgICAgaWYgKCFhZG9wdF9mZCkgeworICAgICAgbGFzdF9lcnJvcl8g
PSBlcnJubzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzb2NrX3Jhd18gPSBVbml4U29j
a2V0UmF3KHN0ZDo6bW92ZShhZG9wdF9mZCksIHNvY2tfZmFtaWx5LCBzb2NrX3R5cGUpOworICAg
IGlmICghc29ja19yYXdfLkxpc3RlbigpKSB7CisgICAgICBsYXN0X2Vycm9yXyA9IGVycm5vOwor
ICAgICAgUEVSRkVUVE9fRFBMT0coImxpc3RlbigpIik7CisgICAgICByZXR1cm47CisgICAgfQor
ICAgIHN0YXRlXyA9IFN0YXRlOjprTGlzdGVuaW5nOworICB9IGVsc2UgeworICAgIFBFUkZFVFRP
X0ZBVEFMKCJVbmV4cGVjdGVkIGFkb3B0X3N0YXRlIik7ICAvLyBVbmZlYXNpYmxlLgorICB9CisK
KyAgUEVSRkVUVE9fQ0hFQ0soc29ja19yYXdfKTsKKyAgbGFzdF9lcnJvcl8gPSAwOworCisgIHNv
Y2tfcmF3Xy5TZXRCbG9ja2luZyhmYWxzZSk7CisKKyAgV2Vha1B0cjxVbml4U29ja2V0PiB3ZWFr
X3B0ciA9IHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKKworICB0YXNrX3J1bm5lcl8t
PkFkZEZpbGVEZXNjcmlwdG9yV2F0Y2goc29ja19yYXdfLmZkKCksIFt3ZWFrX3B0cl0geworICAg
IGlmICh3ZWFrX3B0cikKKyAgICAgIHdlYWtfcHRyLT5PbkV2ZW50KCk7CisgIH0pOworfQorCitV
bml4U29ja2V0Ojp+VW5peFNvY2tldCgpIHsKKyAgLy8gVGhlIGltcGxpY2l0IGR0b3Igb2YgfHdl
YWtfcHRyX2ZhY3RvcnlffCB3aWxsIG5vLW9wIHBlbmRpbmcgY2FsbGJhY2tzLgorICBTaHV0ZG93
bih0cnVlKTsKK30KKworVW5peFNvY2tldFJhdyBVbml4U29ja2V0OjpSZWxlYXNlU29ja2V0KCkg
eworICAvLyBUaGlzIHdpbGwgaW52YWxpZGF0ZSBhbnkgcGVuZGluZyBjYWxscyB0byBPbkV2ZW50
LgorICBzdGF0ZV8gPSBTdGF0ZTo6a0Rpc2Nvbm5lY3RlZDsKKyAgaWYgKHNvY2tfcmF3XykKKyAg
ICB0YXNrX3J1bm5lcl8tPlJlbW92ZUZpbGVEZXNjcmlwdG9yV2F0Y2goc29ja19yYXdfLmZkKCkp
OworCisgIHJldHVybiBzdGQ6Om1vdmUoc29ja19yYXdfKTsKK30KKworLy8gQ2FsbGVkIG9ubHkg
YnkgdGhlIENvbm5lY3QoKSBzdGF0aWMgY29uc3RydWN0b3IuCit2b2lkIFVuaXhTb2NrZXQ6OkRv
Q29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgc29ja2V0X25hbWUpIHsKKyAgUEVSRkVUVE9fRENI
RUNLKHN0YXRlXyA9PSBTdGF0ZTo6a0Rpc2Nvbm5lY3RlZCk7CisKKyAgLy8gVGhpcyBpcyB0aGUg
b25seSB0aGluZyB0aGF0IGNhbiBncmFjZWZ1bGx5IGZhaWwgaW4gdGhlIGN0b3IuCisgIGlmICgh
c29ja19yYXdfKQorICAgIHJldHVybiBOb3RpZnlDb25uZWN0aW9uU3RhdGUoZmFsc2UpOworCisg
IGlmICghc29ja19yYXdfLkNvbm5lY3Qoc29ja2V0X25hbWUpKSB7CisgICAgbGFzdF9lcnJvcl8g
PSBlcnJubzsKKyAgICByZXR1cm4gTm90aWZ5Q29ubmVjdGlvblN0YXRlKGZhbHNlKTsKKyAgfQor
CisgIC8vIEF0IHRoaXMgcG9pbnQgZWl0aGVyIGNvbm5lY3QoKSBzdWNjZWVkZWQgb3Igc3RhcnRl
ZCBhc3luY2hyb25vdXNseQorICAvLyAoZXJybm8gPSBFSU5QUk9HUkVTUykuCisgIGxhc3RfZXJy
b3JfID0gMDsKKyAgc3RhdGVfID0gU3RhdGU6OmtDb25uZWN0aW5nOworCisgIC8vIEV2ZW4gaWYg
dGhlIHNvY2tldCBpcyBub24tYmxvY2tpbmcsIGNvbm5lY3RpbmcgdG8gYSBVTklYIHNvY2tldCBj
YW4gYmUKKyAgLy8gYWNrbm93bGVkZ2VkIHN0cmFpZ2h0IGF3YXkgcmF0aGVyIHRoYW4gcmV0dXJu
aW5nIEVJTlBST0dSRVNTLgorICAvLyBUaGUgZGVjaXNpb24gaGVyZSBpcyB0byBkZWFsIHdpdGgg
dGhlIHR3byBjYXNlcyB1bmlmb3JtbHksIGF0IHRoZSBjb3N0IG9mCisgIC8vIGRlbGF5aW5nIHRo
ZSBzdHJhaWdodC1hd2F5LWNvbm5lY3QoKSBjYXNlIGJ5IG9uZSB0YXNrLCB0byBhdm9pZCBkZXBl
bmRpbmcKKyAgLy8gb24gaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBVTklYIHNvY2tldCBvbiB0
aGUgdmFyaW91cyBPU2VzLgorICAvLyBQb3N0aW5nIHRoZSBPbkV2ZW50KCkgYmVsb3cgZW11bGF0
ZXMgYSB3YWtldXAgb2YgdGhlIEZEIHdhdGNoLiBPbkV2ZW50KCksCisgIC8vIHdoaWNoIGtub3dz
IGhvdyB0byBkZWFsIHdpdGggc3B1cmlvdXMgd2FrZXVwcywgd2lsbCBwb2xsIHRoZSBTT19FUlJP
UiBhbmQKKyAgLy8gZXZvbHZlLCBpZiBuZWNlc3NhcnksIHRoZSBzdGF0ZSBpbnRvIGVpdGhlciBr
Q29ubmVjdGVkIG9yIGtEaXNjb25uZWN0ZWQuCisgIFdlYWtQdHI8VW5peFNvY2tldD4gd2Vha19w
dHIgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIHRhc2tfcnVubmVyXy0+UG9z
dFRhc2soW3dlYWtfcHRyXSB7CisgICAgaWYgKHdlYWtfcHRyKQorICAgICAgd2Vha19wdHItPk9u
RXZlbnQoKTsKKyAgfSk7Cit9CisKK3ZvaWQgVW5peFNvY2tldDo6UmVhZFBlZXJDcmVkZW50aWFs
cygpIHsKKyAgLy8gUGVlciBjcmVkZW50aWFscyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gQUZfVU5J
WCBzb2NrZXRzLgorICBpZiAoc29ja19yYXdfLmZhbWlseSgpICE9IFNvY2tGYW1pbHk6OmtVbml4
KQorICAgIHJldHVybjsKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19MSU5V
WCkgfHwgXAorICAgIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19BTkRST0lEKQorICBz
dHJ1Y3QgdWNyZWQgdXNlcl9jcmVkOworICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHVzZXJfY3Jl
ZCk7CisgIGludCBmZCA9IHNvY2tfcmF3Xy5mZCgpOworICBpbnQgcmVzID0gZ2V0c29ja29wdChm
ZCwgU09MX1NPQ0tFVCwgU09fUEVFUkNSRUQsICZ1c2VyX2NyZWQsICZsZW4pOworICBQRVJGRVRU
T19DSEVDSyhyZXMgPT0gMCk7CisgIHBlZXJfdWlkXyA9IHVzZXJfY3JlZC51aWQ7CisgIHBlZXJf
cGlkXyA9IHVzZXJfY3JlZC5waWQ7CisjZWxzZQorICBzdHJ1Y3QgeHVjcmVkIHVzZXJfY3JlZDsK
KyAgc29ja2xlbl90IGxlbiA9IHNpemVvZih1c2VyX2NyZWQpOworICBpbnQgcmVzID0gZ2V0c29j
a29wdChzb2NrX3Jhd18uZmQoKSwgMCwgTE9DQUxfUEVFUkNSRUQsICZ1c2VyX2NyZWQsICZsZW4p
OworICBQRVJGRVRUT19DSEVDSyhyZXMgPT0gMCAmJiB1c2VyX2NyZWQuY3JfdmVyc2lvbiA9PSBY
VUNSRURfVkVSU0lPTik7CisgIHBlZXJfdWlkXyA9IHN0YXRpY19jYXN0PHVpZF90Pih1c2VyX2Ny
ZWQuY3JfdWlkKTsKKy8vIFRoZXJlIGlzIG5vIHBpZCBpbiB0aGUgTE9DQUxfUEVFUkNSRURTIGZv
ciBNYWNPUyAvIEZyZWVCU0QuCisjZW5kaWYKK30KKwordm9pZCBVbml4U29ja2V0OjpPbkV2ZW50
KCkgeworICBpZiAoc3RhdGVfID09IFN0YXRlOjprRGlzY29ubmVjdGVkKQorICAgIHJldHVybjsg
IC8vIFNvbWUgc3B1cmlvdXMgZXZlbnQsIHR5cGljYWxseSBxdWV1ZWQganVzdCBiZWZvcmUgU2h1
dGRvd24oKS4KKworICBpZiAoc3RhdGVfID09IFN0YXRlOjprQ29ubmVjdGVkKQorICAgIHJldHVy
biBldmVudF9saXN0ZW5lcl8tPk9uRGF0YUF2YWlsYWJsZSh0aGlzKTsKKworICBpZiAoc3RhdGVf
ID09IFN0YXRlOjprQ29ubmVjdGluZykgeworICAgIFBFUkZFVFRPX0RDSEVDSyhzb2NrX3Jhd18p
OworICAgIGludCBzb2NrX2VyciA9IEVJTlZBTDsKKyAgICBzb2NrbGVuX3QgZXJyX2xlbiA9IHNp
emVvZihzb2NrX2Vycik7CisgICAgaW50IHJlcyA9CisgICAgICAgIGdldHNvY2tvcHQoc29ja19y
YXdfLmZkKCksIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmc29ja19lcnIsICZlcnJfbGVuKTsKKwor
ICAgIGlmIChyZXMgPT0gMCAmJiBzb2NrX2VyciA9PSBFSU5QUk9HUkVTUykKKyAgICAgIHJldHVy
bjsgIC8vIE5vdCBjb25uZWN0ZWQgeWV0LCBqdXN0IGEgc3B1cmlvdXMgRkQgd2F0Y2ggd2FrZXVw
LgorICAgIGlmIChyZXMgPT0gMCAmJiBzb2NrX2VyciA9PSAwKSB7CisgICAgICBSZWFkUGVlckNy
ZWRlbnRpYWxzKCk7CisgICAgICBzdGF0ZV8gPSBTdGF0ZTo6a0Nvbm5lY3RlZDsKKyAgICAgIHJl
dHVybiBldmVudF9saXN0ZW5lcl8tPk9uQ29ubmVjdCh0aGlzLCB0cnVlIC8qIGNvbm5lY3RlZCAq
Lyk7CisgICAgfQorICAgIFBFUkZFVFRPX0RMT0coIkNvbm5lY3Rpb24gZXJyb3I6ICVzIiwgc3Ry
ZXJyb3Ioc29ja19lcnIpKTsKKyAgICBsYXN0X2Vycm9yXyA9IHNvY2tfZXJyOworICAgIFNodXRk
b3duKGZhbHNlKTsKKyAgICByZXR1cm4gZXZlbnRfbGlzdGVuZXJfLT5PbkNvbm5lY3QodGhpcywg
ZmFsc2UgLyogY29ubmVjdGVkICovKTsKKyAgfQorCisgIC8vIE5ldyBpbmNvbWluZyBjb25uZWN0
aW9uLgorICBpZiAoc3RhdGVfID09IFN0YXRlOjprTGlzdGVuaW5nKSB7CisgICAgLy8gVGhlcmUg
Y291bGQgYmUgbW9yZSB0aGFuIG9uZSBpbmNvbWluZyBjb25uZWN0aW9uIGJlaGluZCBlYWNoIEZE
IHdhdGNoCisgICAgLy8gbm90aWZpY2F0aW9uLiBEcmFpbidlbSBhbGwuCisgICAgZm9yICg7Oykg
eworICAgICAgc3RydWN0IHNvY2thZGRyX2luIGNsaV9hZGRyIHt9OworICAgICAgc29ja2xlbl90
IHNpemUgPSBzaXplb2YoY2xpX2FkZHIpOworICAgICAgU2NvcGVkRmlsZSBuZXdfZmQoUEVSRkVU
VE9fRUlOVFIoYWNjZXB0KAorICAgICAgICAgIHNvY2tfcmF3Xy5mZCgpLCByZWludGVycHJldF9j
YXN0PHNvY2thZGRyKj4oJmNsaV9hZGRyKSwgJnNpemUpKSk7CisgICAgICBpZiAoIW5ld19mZCkK
KyAgICAgICAgcmV0dXJuOworICAgICAgc3RkOjp1bmlxdWVfcHRyPFVuaXhTb2NrZXQ+IG5ld19z
b2NrKG5ldyBVbml4U29ja2V0KAorICAgICAgICAgIGV2ZW50X2xpc3RlbmVyXywgdGFza19ydW5u
ZXJfLCBzdGQ6Om1vdmUobmV3X2ZkKSwgU3RhdGU6OmtDb25uZWN0ZWQsCisgICAgICAgICAgc29j
a19yYXdfLmZhbWlseSgpLCBzb2NrX3Jhd18udHlwZSgpKSk7CisgICAgICBldmVudF9saXN0ZW5l
cl8tPk9uTmV3SW5jb21pbmdDb25uZWN0aW9uKHRoaXMsIHN0ZDo6bW92ZShuZXdfc29jaykpOwor
ICAgIH0KKyAgfQorfQorCitib29sIFVuaXhTb2NrZXQ6OlNlbmQoY29uc3Qgdm9pZCogbXNnLAor
ICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgaW50KiBzZW5kX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2Zk
cykgeworICBpZiAoc3RhdGVfICE9IFN0YXRlOjprQ29ubmVjdGVkKSB7CisgICAgZXJybm8gPSBs
YXN0X2Vycm9yXyA9IEVOT1RDT05OOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNvY2tf
cmF3Xy5TZXRCbG9ja2luZyh0cnVlKTsKKyAgY29uc3Qgc3NpemVfdCBzeiA9IHNvY2tfcmF3Xy5T
ZW5kKG1zZywgbGVuLCBzZW5kX2ZkcywgbnVtX2Zkcyk7CisgIGludCBzYXZlZF9lcnJubyA9IGVy
cm5vOworICBzb2NrX3Jhd18uU2V0QmxvY2tpbmcoZmFsc2UpOworCisgIGlmIChzeiA9PSBzdGF0
aWNfY2FzdDxzc2l6ZV90PihsZW4pKSB7CisgICAgbGFzdF9lcnJvcl8gPSAwOworICAgIHJldHVy
biB0cnVlOworICB9CisKKyAgLy8gSWYgc2VuZG1zZygpIHN1Y2NlZWRzIGJ1dCB0aGUgcmV0dXJu
ZWQgc2l6ZSBpcyA8IHxsZW58IGl0IG1lYW5zIHRoYXQgdGhlCisgIC8vIGVuZHBvaW50IGRpc2Nv
bm5lY3RlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSByZWFkLCBhbmQgd2UgbWFuYWdlZCB0byBzZW5k
CisgIC8vIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSBidWZmZXIuIEluIHRoaXMgY2FzZSB3ZSBzaG91
bGQganVzdCBnaXZlIHVwLgorCisgIGlmIChzeiA8IDAgJiYgKHNhdmVkX2Vycm5vID09IEVBR0FJ
TiB8fCBzYXZlZF9lcnJubyA9PSBFV09VTERCTE9DSykpIHsKKyAgICAvLyBBIGdlbnVpbmUgb3V0
LW9mLWJ1ZmZlci4gVGhlIGNsaWVudCBzaG91bGQgcmV0cnkgb3IgZ2l2ZSB1cC4KKyAgICAvLyBN
YW4gcGFnZXMgc3BlY2lmeSB0aGF0IEVBR0FJTiBhbmQgRVdPVUxEQkxPQ0sgaGF2ZSB0aGUgc2Ft
ZSBzZW1hbnRpYyBoZXJlCisgICAgLy8gYW5kIGNsaWVudHMgc2hvdWxkIGNoZWNrIGZvciBib3Ro
LgorICAgIGxhc3RfZXJyb3JfID0gRUFHQUlOOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisg
IC8vIEVpdGhlciB0aGUgb3RoZXIgZW5kcG9pbnQgZGlzY29ubmVjdGVkIChFQ09OTlJFU0VUKSBv
ciBzb21lIG90aGVyIGVycm9yCisgIC8vIGhhcHBlbmVkLgorICBsYXN0X2Vycm9yXyA9IHNhdmVk
X2Vycm5vOworICBQRVJGRVRUT19EUExPRygic2VuZG1zZygpIGZhaWxlZCIpOworICBTaHV0ZG93
bih0cnVlKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFVuaXhTb2NrZXQ6OlNodXRkb3du
KGJvb2wgbm90aWZ5KSB7CisgIFdlYWtQdHI8VW5peFNvY2tldD4gd2Vha19wdHIgPSB3ZWFrX3B0
cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIGlmIChub3RpZnkpIHsKKyAgICBpZiAoc3RhdGVf
ID09IFN0YXRlOjprQ29ubmVjdGVkKSB7CisgICAgICB0YXNrX3J1bm5lcl8tPlBvc3RUYXNrKFt3
ZWFrX3B0cl0geworICAgICAgICBpZiAod2Vha19wdHIpCisgICAgICAgICAgd2Vha19wdHItPmV2
ZW50X2xpc3RlbmVyXy0+T25EaXNjb25uZWN0KHdlYWtfcHRyLmdldCgpKTsKKyAgICAgIH0pOwor
ICAgIH0gZWxzZSBpZiAoc3RhdGVfID09IFN0YXRlOjprQ29ubmVjdGluZykgeworICAgICAgdGFz
a19ydW5uZXJfLT5Qb3N0VGFzayhbd2Vha19wdHJdIHsKKyAgICAgICAgaWYgKHdlYWtfcHRyKQor
ICAgICAgICAgIHdlYWtfcHRyLT5ldmVudF9saXN0ZW5lcl8tPk9uQ29ubmVjdCh3ZWFrX3B0ci5n
ZXQoKSwgZmFsc2UpOworICAgICAgfSk7CisgICAgfQorICB9CisKKyAgaWYgKHNvY2tfcmF3Xykg
eworICAgIHRhc2tfcnVubmVyXy0+UmVtb3ZlRmlsZURlc2NyaXB0b3JXYXRjaChzb2NrX3Jhd18u
ZmQoKSk7CisgICAgc29ja19yYXdfLlNodXRkb3duKCk7CisgIH0KKyAgc3RhdGVfID0gU3RhdGU6
OmtEaXNjb25uZWN0ZWQ7Cit9CisKK3NpemVfdCBVbml4U29ja2V0OjpSZWNlaXZlKHZvaWQqIG1z
ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBTY29wZWRGaWxlKiBmZF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzaXplX3QgbWF4X2ZpbGVzKSB7CisgIGlmIChzdGF0ZV8gIT0gU3RhdGU6OmtDb25uZWN0
ZWQpIHsKKyAgICBsYXN0X2Vycm9yXyA9IEVOT1RDT05OOworICAgIHJldHVybiAwOworICB9CisK
KyAgY29uc3Qgc3NpemVfdCBzeiA9IHNvY2tfcmF3Xy5SZWNlaXZlKG1zZywgbGVuLCBmZF92ZWMs
IG1heF9maWxlcyk7CisgIGlmIChzeiA8IDAgJiYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9
PSBFV09VTERCTE9DSykpIHsKKyAgICBsYXN0X2Vycm9yXyA9IEVBR0FJTjsKKyAgICByZXR1cm4g
MDsKKyAgfQorICBpZiAoc3ogPD0gMCkgeworICAgIGxhc3RfZXJyb3JfID0gZXJybm87CisgICAg
U2h1dGRvd24odHJ1ZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgUEVSRkVUVE9fQ0hFQ0soc3Rh
dGljX2Nhc3Q8c2l6ZV90PihzeikgPD0gbGVuKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVf
dD4oc3opOworfQorCitzdGQ6OnN0cmluZyBVbml4U29ja2V0OjpSZWNlaXZlU3RyaW5nKHNpemVf
dCBtYXhfbGVuZ3RoKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGJ1ZihuZXcgY2hhcltt
YXhfbGVuZ3RoICsgMV0pOworICBzaXplX3QgcnNpemUgPSBSZWNlaXZlKGJ1Zi5nZXQoKSwgbWF4
X2xlbmd0aCk7CisgIFBFUkZFVFRPX0NIRUNLKHN0YXRpY19jYXN0PHNpemVfdD4ocnNpemUpIDw9
IG1heF9sZW5ndGgpOworICBidWZbc3RhdGljX2Nhc3Q8c2l6ZV90Pihyc2l6ZSldID0gJ1wwJzsK
KyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1Zi5nZXQoKSk7Cit9CisKK3ZvaWQgVW5peFNvY2tldDo6
Tm90aWZ5Q29ubmVjdGlvblN0YXRlKGJvb2wgc3VjY2VzcykgeworICBpZiAoIXN1Y2Nlc3MpCisg
ICAgU2h1dGRvd24oZmFsc2UpOworCisgIFdlYWtQdHI8VW5peFNvY2tldD4gd2Vha19wdHIgPSB3
ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIHRhc2tfcnVubmVyXy0+UG9zdFRhc2so
W3dlYWtfcHRyLCBzdWNjZXNzXSB7CisgICAgaWYgKHdlYWtfcHRyKQorICAgICAgd2Vha19wdHIt
PmV2ZW50X2xpc3RlbmVyXy0+T25Db25uZWN0KHdlYWtfcHRyLmdldCgpLCBzdWNjZXNzKTsKKyAg
fSk7Cit9CisKK1VuaXhTb2NrZXQ6OkV2ZW50TGlzdGVuZXI6On5FdmVudExpc3RlbmVyKCkge30K
K3ZvaWQgVW5peFNvY2tldDo6RXZlbnRMaXN0ZW5lcjo6T25OZXdJbmNvbWluZ0Nvbm5lY3Rpb24o
CisgICAgVW5peFNvY2tldCosCisgICAgc3RkOjp1bmlxdWVfcHRyPFVuaXhTb2NrZXQ+KSB7fQor
dm9pZCBVbml4U29ja2V0OjpFdmVudExpc3RlbmVyOjpPbkNvbm5lY3QoVW5peFNvY2tldCosIGJv
b2wpIHt9Cit2b2lkIFVuaXhTb2NrZXQ6OkV2ZW50TGlzdGVuZXI6Ok9uRGlzY29ubmVjdChVbml4
U29ja2V0Kikge30KK3ZvaWQgVW5peFNvY2tldDo6RXZlbnRMaXN0ZW5lcjo6T25EYXRhQXZhaWxh
YmxlKFVuaXhTb2NrZXQqKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNw
YWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291cmNlOiBzcmMvaXBjL2Ns
aWVudF9pbXBsLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBzcmMvaXBjL2Ns
aWVudF9pbXBsLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBT
b3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwg
VmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmls
ZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRh
aW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNo
ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw
bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli
dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT
LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl
ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp
YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl
ciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNSQ19JUENfQ0xJRU5UX0lNUExfSF8KKyNk
ZWZpbmUgU1JDX0lQQ19DTElFTlRfSU1QTF9IXworCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRl
IDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3Rhc2tfcnVubmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9zY29wZWRfZmlsZS5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2Uv
dW5peF9zb2NrZXQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2V4dC9pcGMvY2xpZW50LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJzcmMvaXBjL2J1ZmZlcmVkX2ZyYW1lX2Rlc2VyaWFsaXplci5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworCituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBnZW4geworY2xh
c3MgSVBDRnJhbWVfQmluZFNlcnZpY2VSZXBseTsKK2NsYXNzIElQQ0ZyYW1lX0ludm9rZU1ldGhv
ZFJlcGx5OworfSAgLy8gbmFtZXNwYWNlIGdlbgorfSAgLy8gbmFtZXNwYWNlIHByb3RvcworCitu
YW1lc3BhY2UgYmFzZSB7CitjbGFzcyBUYXNrUnVubmVyOworfSAgLy8gbmFtZXNwYWNlIGJhc2UK
KworbmFtZXNwYWNlIGlwYyB7CisKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworCitjbGFzcyBD
bGllbnRJbXBsIDogcHVibGljIENsaWVudCwgcHVibGljIGJhc2U6OlVuaXhTb2NrZXQ6OkV2ZW50
TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgQ2xpZW50SW1wbChjb25zdCBjaGFyKiBzb2NrZXRfbmFt
ZSwgYmFzZTo6VGFza1J1bm5lciopOworICB+Q2xpZW50SW1wbCgpIG92ZXJyaWRlOworCisgIC8v
IENsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCBCaW5kU2VydmljZShiYXNlOjpXZWFrUHRy
PFNlcnZpY2VQcm94eT4pIG92ZXJyaWRlOworICB2b2lkIFVuYmluZFNlcnZpY2UoU2VydmljZUlE
KSBvdmVycmlkZTsKKyAgYmFzZTo6U2NvcGVkRmlsZSBUYWtlUmVjZWl2ZWRGRCgpIG92ZXJyaWRl
OworCisgIC8vIGJhc2U6OlVuaXhTb2NrZXQ6OkV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24u
CisgIHZvaWQgT25Db25uZWN0KGJhc2U6OlVuaXhTb2NrZXQqLCBib29sIGNvbm5lY3RlZCkgb3Zl
cnJpZGU7CisgIHZvaWQgT25EaXNjb25uZWN0KGJhc2U6OlVuaXhTb2NrZXQqKSBvdmVycmlkZTsK
KyAgdm9pZCBPbkRhdGFBdmFpbGFibGUoYmFzZTo6VW5peFNvY2tldCopIG92ZXJyaWRlOworCisg
IFJlcXVlc3RJRCBCZWdpbkludm9rZShTZXJ2aWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAg
ICBNZXRob2RJRCByZW1vdGVfbWV0aG9kX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgUHJvdG9NZXNzYWdlJiBtZXRob2RfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgZHJvcF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OldlYWtQdHI8U2Vy
dmljZVByb3h5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCA9IC0xKTsKKworIHBy
aXZhdGU6CisgIHN0cnVjdCBRdWV1ZWRSZXF1ZXN0IHsKKyAgICBRdWV1ZWRSZXF1ZXN0KCk7Cisg
ICAgaW50IHR5cGUgPSAwOyAgLy8gRnJvbSBGcmFtZTo6bXNnX2Nhc2UoKSwgc2VlIHdpcmVfcHJv
dG9jb2wucHJvdG8uCisgICAgUmVxdWVzdElEIHJlcXVlc3RfaWQgPSAwOworICAgIGJhc2U6Oldl
YWtQdHI8U2VydmljZVByb3h5PiBzZXJ2aWNlX3Byb3h5OworCisgICAgLy8gT25seSBmb3IgdHlw
ZSA9PSBrTXNnSW52b2tlTWV0aG9kLgorICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lOworICB9
OworCisgIENsaWVudEltcGwoY29uc3QgQ2xpZW50SW1wbCYpID0gZGVsZXRlOworICBDbGllbnRJ
bXBsJiBvcGVyYXRvcj0oY29uc3QgQ2xpZW50SW1wbCYpID0gZGVsZXRlOworCisgIGJvb2wgU2Vu
ZEZyYW1lKGNvbnN0IEZyYW1lJiwgaW50IGZkID0gLTEpOworICB2b2lkIE9uRnJhbWVSZWNlaXZl
ZChjb25zdCBGcmFtZSYpOworICB2b2lkIE9uQmluZFNlcnZpY2VSZXBseShRdWV1ZWRSZXF1ZXN0
LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm90b3M6Omdlbjo6SVBDRnJhbWVf
QmluZFNlcnZpY2VSZXBseSYpOworICB2b2lkIE9uSW52b2tlTWV0aG9kUmVwbHkoUXVldWVkUmVx
dWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3Rvczo6Z2VuOjpJUENG
cmFtZV9JbnZva2VNZXRob2RSZXBseSYpOworCisgIGJvb2wgaW52b2tpbmdfbWV0aG9kX3JlcGx5
XyA9IGZhbHNlOworICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6VW5peFNvY2tldD4gc29ja187Cisg
IGJhc2U6OlRhc2tSdW5uZXIqIGNvbnN0IHRhc2tfcnVubmVyXzsKKyAgUmVxdWVzdElEIGxhc3Rf
cmVxdWVzdF9pZF8gPSAwOworICBCdWZmZXJlZEZyYW1lRGVzZXJpYWxpemVyIGZyYW1lX2Rlc2Vy
aWFsaXplcl87CisgIGJhc2U6OlNjb3BlZEZpbGUgcmVjZWl2ZWRfZmRfOworICBzdGQ6Om1hcDxS
ZXF1ZXN0SUQsIFF1ZXVlZFJlcXVlc3Q+IHF1ZXVlZF9yZXF1ZXN0c187CisgIHN0ZDo6bWFwPFNl
cnZpY2VJRCwgYmFzZTo6V2Vha1B0cjxTZXJ2aWNlUHJveHk+PiBzZXJ2aWNlX2JpbmRpbmdzXzsK
KworICAvLyBRdWV1ZSBvZiBjYWxscyB0byBCaW5kU2VydmljZSgpIHRoYXQgaGFwcGVuZWQgYmVm
b3JlIHRoZSBzb2NrZXQgY29ubmVjdGVkLgorICBzdGQ6Omxpc3Q8YmFzZTo6V2Vha1B0cjxTZXJ2
aWNlUHJveHk+PiBxdWV1ZWRfYmluZGluZ3NfOworCisgIGJhc2U6OldlYWtQdHJGYWN0b3J5PENs
aWVudD4gd2Vha19wdHJfZmFjdG9yeV87ICAvLyBLZWVwIGxhc3QuCit9OworCit9ICAvLyBuYW1l
c3BhY2UgaXBjCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBTUkNfSVBD
X0NMSUVOVF9JTVBMX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAic3JjL2lwYy9jbGllbnRfaW1wbC5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNp
bmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dXRp
bGl0eT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
YmFzZS90YXNrX3J1bm5lci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L2Jhc2UvdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvc2VydmljZV9kZXNjcmlwdG9yLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvaXBjL3NlcnZp
Y2VfcHJveHkuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJv
dG9zL3BlcmZldHRvL2lwYy93aXJlX3Byb3RvY29sLmdlbi5oIgorCisvLyBUT0RPKHByaW1pYW5v
KTogQWRkIFRocmVhZENoZWNrZXIgZXZlcnl3aGVyZS4KKworLy8gVE9ETyhwcmltaWFubyk6IEFk
ZCB0aW1lb3V0cy4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBpcGMgeworCisv
LyBzdGF0aWMKK3N0ZDo6dW5pcXVlX3B0cjxDbGllbnQ+IENsaWVudDo6Q3JlYXRlSW5zdGFuY2Uo
Y29uc3QgY2hhciogc29ja2V0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyKSB7CisgIHN0ZDo6
dW5pcXVlX3B0cjxDbGllbnQ+IGNsaWVudChuZXcgQ2xpZW50SW1wbChzb2NrZXRfbmFtZSwgdGFz
a19ydW5uZXIpKTsKKyAgcmV0dXJuIGNsaWVudDsKK30KKworQ2xpZW50SW1wbDo6Q2xpZW50SW1w
bChjb25zdCBjaGFyKiBzb2NrZXRfbmFtZSwgYmFzZTo6VGFza1J1bm5lciogdGFza19ydW5uZXIp
CisgICAgOiB0YXNrX3J1bm5lcl8odGFza19ydW5uZXIpLCB3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlz
KSB7CisgIHNvY2tfID0gYmFzZTo6VW5peFNvY2tldDo6Q29ubmVjdChzb2NrZXRfbmFtZSwgdGhp
cywgdGFza19ydW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNl
OjpTb2NrRmFtaWx5OjprVW5peCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJhc2U6OlNvY2tUeXBlOjprU3RyZWFtKTsKK30KKworQ2xpZW50SW1wbDo6fkNsaWVudEltcGwo
KSB7CisgIC8vIEVuc3VyZSB3ZSBhcmUgbm90IGRlc3Ryb3llZCBpbiB0aGUgbWlkZGxlIG9mIGlu
dm9raW5nIGEgcmVwbHkuCisgIFBFUkZFVFRPX0RDSEVDSyghaW52b2tpbmdfbWV0aG9kX3JlcGx5
Xyk7CisgIE9uRGlzY29ubmVjdCgKKyAgICAgIG51bGxwdHIpOyAgLy8gVGhlIGJhc2U6OlVuaXhT
b2NrZXQqIHB0ciBpcyBub3QgdXNlZCBpbiBPbkRpc2Nvbm5lY3QoKS4KK30KKwordm9pZCBDbGll
bnRJbXBsOjpCaW5kU2VydmljZShiYXNlOjpXZWFrUHRyPFNlcnZpY2VQcm94eT4gc2VydmljZV9w
cm94eSkgeworICBpZiAoIXNlcnZpY2VfcHJveHkpCisgICAgcmV0dXJuOworICBpZiAoIXNvY2tf
LT5pc19jb25uZWN0ZWQoKSkgeworICAgIHF1ZXVlZF9iaW5kaW5nc18uZW1wbGFjZV9iYWNrKHNl
cnZpY2VfcHJveHkpOworICAgIHJldHVybjsKKyAgfQorICBSZXF1ZXN0SUQgcmVxdWVzdF9pZCA9
ICsrbGFzdF9yZXF1ZXN0X2lkXzsKKyAgRnJhbWUgZnJhbWU7CisgIGZyYW1lLnNldF9yZXF1ZXN0
X2lkKHJlcXVlc3RfaWQpOworICBGcmFtZTo6QmluZFNlcnZpY2UqIHJlcSA9IGZyYW1lLm11dGFi
bGVfbXNnX2JpbmRfc2VydmljZSgpOworICBjb25zdCBjaGFyKiBjb25zdCBzZXJ2aWNlX25hbWUg
PSBzZXJ2aWNlX3Byb3h5LT5HZXREZXNjcmlwdG9yKCkuc2VydmljZV9uYW1lOworICByZXEtPnNl
dF9zZXJ2aWNlX25hbWUoc2VydmljZV9uYW1lKTsKKyAgaWYgKCFTZW5kRnJhbWUoZnJhbWUpKSB7
CisgICAgUEVSRkVUVE9fRExPRygiQmluZFNlcnZpY2UoJXMpIGZhaWxlZCIsIHNlcnZpY2VfbmFt
ZSk7CisgICAgcmV0dXJuIHNlcnZpY2VfcHJveHktPk9uQ29ubmVjdChmYWxzZSAvKiBzdWNjZXNz
ICovKTsKKyAgfQorICBRdWV1ZWRSZXF1ZXN0IHFyOworICBxci50eXBlID0gRnJhbWU6OmtNc2dC
aW5kU2VydmljZUZpZWxkTnVtYmVyOworICBxci5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKyAg
cXIuc2VydmljZV9wcm94eSA9IHNlcnZpY2VfcHJveHk7CisgIHF1ZXVlZF9yZXF1ZXN0c18uZW1w
bGFjZShyZXF1ZXN0X2lkLCBzdGQ6Om1vdmUocXIpKTsKK30KKwordm9pZCBDbGllbnRJbXBsOjpV
bmJpbmRTZXJ2aWNlKFNlcnZpY2VJRCBzZXJ2aWNlX2lkKSB7CisgIHNlcnZpY2VfYmluZGluZ3Nf
LmVyYXNlKHNlcnZpY2VfaWQpOworfQorCitSZXF1ZXN0SUQgQ2xpZW50SW1wbDo6QmVnaW5JbnZv
a2UoU2VydmljZUlEIHNlcnZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIE1ldGhvZElEIHJlbW90ZV9tZXRob2RfaWQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgUHJvdG9NZXNzYWdlJiBtZXRob2RfYXJncywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRyb3BfcmVwbHksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6V2Vha1B0cjxTZXJ2aWNlUHJveHk+IHNlcnZp
Y2VfcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkKSB7Cisg
IFJlcXVlc3RJRCByZXF1ZXN0X2lkID0gKytsYXN0X3JlcXVlc3RfaWRfOworICBGcmFtZSBmcmFt
ZTsKKyAgZnJhbWUuc2V0X3JlcXVlc3RfaWQocmVxdWVzdF9pZCk7CisgIEZyYW1lOjpJbnZva2VN
ZXRob2QqIHJlcSA9IGZyYW1lLm11dGFibGVfbXNnX2ludm9rZV9tZXRob2QoKTsKKyAgcmVxLT5z
ZXRfc2VydmljZV9pZChzZXJ2aWNlX2lkKTsKKyAgcmVxLT5zZXRfbWV0aG9kX2lkKHJlbW90ZV9t
ZXRob2RfaWQpOworICByZXEtPnNldF9kcm9wX3JlcGx5KGRyb3BfcmVwbHkpOworICByZXEtPnNl
dF9hcmdzX3Byb3RvKG1ldGhvZF9hcmdzLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBpZiAoIVNl
bmRGcmFtZShmcmFtZSwgZmQpKSB7CisgICAgUEVSRkVUVE9fRExPRygiQmVnaW5JbnZva2UoKSBm
YWlsZWQgd2hpbGUgc2VuZGluZyB0aGUgZnJhbWUiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBp
ZiAoZHJvcF9yZXBseSkKKyAgICByZXR1cm4gMDsKKyAgUXVldWVkUmVxdWVzdCBxcjsKKyAgcXIu
dHlwZSA9IEZyYW1lOjprTXNnSW52b2tlTWV0aG9kRmllbGROdW1iZXI7CisgIHFyLnJlcXVlc3Rf
aWQgPSByZXF1ZXN0X2lkOworICBxci5tZXRob2RfbmFtZSA9IG1ldGhvZF9uYW1lOworICBxci5z
ZXJ2aWNlX3Byb3h5ID0gc3RkOjptb3ZlKHNlcnZpY2VfcHJveHkpOworICBxdWV1ZWRfcmVxdWVz
dHNfLmVtcGxhY2UocmVxdWVzdF9pZCwgc3RkOjptb3ZlKHFyKSk7CisgIHJldHVybiByZXF1ZXN0
X2lkOworfQorCitib29sIENsaWVudEltcGw6OlNlbmRGcmFtZShjb25zdCBGcmFtZSYgZnJhbWUs
IGludCBmZCkgeworICAvLyBTZXJpYWxpemUgdGhlIGZyYW1lIGludG8gcHJvdG9idWYsIGFkZCB0
aGUgc2l6ZSBoZWFkZXIsIGFuZCBzZW5kIGl0LgorICBzdGQ6OnN0cmluZyBidWYgPSBCdWZmZXJl
ZEZyYW1lRGVzZXJpYWxpemVyOjpTZXJpYWxpemUoZnJhbWUpOworCisgIC8vIFRPRE8ocHJpbWlh
bm8pOiB0aGlzIHNob3VsZCBkbyBub24tYmxvY2tpbmcgSS9PLiBCdXQgdGhlbiB3aGF0IGlmIHRo
ZQorICAvLyBzb2NrZXQgYnVmZmVyIGlzIGZ1bGw/IFdlIG1pZ2h0IHdhbnQgdG8gZWl0aGVyIGRy
b3AgdGhlIHJlcXVlc3Qgb3IgdGhyb3R0bGUKKyAgLy8gdGhlIHNlbmQgYW5kIFBvc3RUYXNrIHRo
ZSByZXBseSBsYXRlcj8gUmlnaHQgbm93IHdlIGFyZSBtYWtpbmcgU2VuZCgpCisgIC8vIGJsb2Nr
aW5nIGFzIGEgd29ya2Fyb3VuZC4gUHJvcGFnYXRlIGJha3ByZXNzdXJlIHRvIHRoZSBjYWxsZXIg
aW5zdGVhZC4KKyAgYm9vbCByZXMgPSBzb2NrXy0+U2VuZChidWYuZGF0YSgpLCBidWYuc2l6ZSgp
LCBmZCk7CisgIFBFUkZFVFRPX0NIRUNLKHJlcyB8fCAhc29ja18tPmlzX2Nvbm5lY3RlZCgpKTsK
KyAgcmV0dXJuIHJlczsKK30KKwordm9pZCBDbGllbnRJbXBsOjpPbkNvbm5lY3QoYmFzZTo6VW5p
eFNvY2tldCosIGJvb2wgY29ubmVjdGVkKSB7CisgIC8vIERyYWluIHRoZSBCaW5kU2VydmljZSgp
IGNhbGxzIHRoYXQgd2VyZSBxdWV1ZWQgYmVmb3JlIGVzdGFibGlzaGlnIHRoZQorICAvLyBjb25u
ZWN0aW9uIHdpdGggdGhlIGhvc3QuCisgIGZvciAoYmFzZTo6V2Vha1B0cjxTZXJ2aWNlUHJveHk+
JiBzZXJ2aWNlX3Byb3h5IDogcXVldWVkX2JpbmRpbmdzXykgeworICAgIGlmIChjb25uZWN0ZWQp
IHsKKyAgICAgIEJpbmRTZXJ2aWNlKHNlcnZpY2VfcHJveHkpOworICAgIH0gZWxzZSBpZiAoc2Vy
dmljZV9wcm94eSkgeworICAgICAgc2VydmljZV9wcm94eS0+T25Db25uZWN0KGZhbHNlIC8qIHN1
Y2Nlc3MgKi8pOworICAgIH0KKyAgfQorICBxdWV1ZWRfYmluZGluZ3NfLmNsZWFyKCk7Cit9CisK
K3ZvaWQgQ2xpZW50SW1wbDo6T25EaXNjb25uZWN0KGJhc2U6OlVuaXhTb2NrZXQqKSB7CisgIGZv
ciAoYXV0byBpdCA6IHNlcnZpY2VfYmluZGluZ3NfKSB7CisgICAgYmFzZTo6V2Vha1B0cjxTZXJ2
aWNlUHJveHk+JiBzZXJ2aWNlX3Byb3h5ID0gaXQuc2Vjb25kOworICAgIHRhc2tfcnVubmVyXy0+
UG9zdFRhc2soW3NlcnZpY2VfcHJveHldIHsKKyAgICAgIGlmIChzZXJ2aWNlX3Byb3h5KQorICAg
ICAgICBzZXJ2aWNlX3Byb3h5LT5PbkRpc2Nvbm5lY3QoKTsKKyAgICB9KTsKKyAgfQorICBzZXJ2
aWNlX2JpbmRpbmdzXy5jbGVhcigpOworICBxdWV1ZWRfYmluZGluZ3NfLmNsZWFyKCk7Cit9CisK
K3ZvaWQgQ2xpZW50SW1wbDo6T25EYXRhQXZhaWxhYmxlKGJhc2U6OlVuaXhTb2NrZXQqKSB7Cisg
IHNpemVfdCByc2l6ZTsKKyAgZG8geworICAgIGF1dG8gYnVmID0gZnJhbWVfZGVzZXJpYWxpemVy
Xy5CZWdpblJlY2VpdmUoKTsKKyAgICBiYXNlOjpTY29wZWRGaWxlIGZkOworICAgIHJzaXplID0g
c29ja18tPlJlY2VpdmUoYnVmLmRhdGEsIGJ1Zi5zaXplLCAmZmQpOworICAgIGlmIChmZCkgewor
ICAgICAgUEVSRkVUVE9fRENIRUNLKCFyZWNlaXZlZF9mZF8pOworICAgICAgaW50IHJlcyA9IGZj
bnRsKCpmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisgICAgICBQRVJGRVRUT19EQ0hFQ0socmVz
ID09IDApOworICAgICAgcmVjZWl2ZWRfZmRfID0gc3RkOjptb3ZlKGZkKTsKKyAgICB9CisgICAg
aWYgKCFmcmFtZV9kZXNlcmlhbGl6ZXJfLkVuZFJlY2VpdmUocnNpemUpKSB7CisgICAgICAvLyBU
aGUgZW5kcG9pbnQgdHJpZWQgdG8gc2VuZCBhIGZyYW1lIHRoYXQgaXMgd2F5IHRvbyBsYXJnZS4K
KyAgICAgIHJldHVybiBzb2NrXy0+U2h1dGRvd24odHJ1ZSk7ICAvLyBJbiB0dXJuIHdpbGwgdHJp
Z2dlciBhbiBPbkRpc2Nvbm5lY3QoKS4KKyAgICAgIC8vIFRPRE8oZm1heWVyKTogY2hlY2sgdGhp
cy4KKyAgICB9CisgIH0gd2hpbGUgKHJzaXplID4gMCk7CisKKyAgd2hpbGUgKHN0ZDo6dW5pcXVl
X3B0cjxGcmFtZT4gZnJhbWUgPSBmcmFtZV9kZXNlcmlhbGl6ZXJfLlBvcE5leHRGcmFtZSgpKQor
ICAgIE9uRnJhbWVSZWNlaXZlZCgqZnJhbWUpOworfQorCit2b2lkIENsaWVudEltcGw6Ok9uRnJh
bWVSZWNlaXZlZChjb25zdCBGcmFtZSYgZnJhbWUpIHsKKyAgYXV0byBxdWV1ZWRfcmVxdWVzdHNf
aXQgPSBxdWV1ZWRfcmVxdWVzdHNfLmZpbmQoZnJhbWUucmVxdWVzdF9pZCgpKTsKKyAgaWYgKHF1
ZXVlZF9yZXF1ZXN0c19pdCA9PSBxdWV1ZWRfcmVxdWVzdHNfLmVuZCgpKSB7CisgICAgUEVSRkVU
VE9fRExPRygiT25GcmFtZVJlY2VpdmVkKCk6IGdvdCBpbnZhbGlkIHJlcXVlc3RfaWQ9JSIgUFJJ
dTY0LAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGZyYW1lLnJlcXVl
c3RfaWQoKSkpOworICAgIHJldHVybjsKKyAgfQorICBRdWV1ZWRSZXF1ZXN0IHJlcSA9IHN0ZDo6
bW92ZShxdWV1ZWRfcmVxdWVzdHNfaXQtPnNlY29uZCk7CisgIHF1ZXVlZF9yZXF1ZXN0c18uZXJh
c2UocXVldWVkX3JlcXVlc3RzX2l0KTsKKworICBpZiAocmVxLnR5cGUgPT0gRnJhbWU6OmtNc2dC
aW5kU2VydmljZUZpZWxkTnVtYmVyICYmCisgICAgICBmcmFtZS5oYXNfbXNnX2JpbmRfc2Vydmlj
ZV9yZXBseSgpKSB7CisgICAgcmV0dXJuIE9uQmluZFNlcnZpY2VSZXBseShzdGQ6Om1vdmUocmVx
KSwgZnJhbWUubXNnX2JpbmRfc2VydmljZV9yZXBseSgpKTsKKyAgfQorICBpZiAocmVxLnR5cGUg
PT0gRnJhbWU6OmtNc2dJbnZva2VNZXRob2RGaWVsZE51bWJlciAmJgorICAgICAgZnJhbWUuaGFz
X21zZ19pbnZva2VfbWV0aG9kX3JlcGx5KCkpIHsKKyAgICByZXR1cm4gT25JbnZva2VNZXRob2RS
ZXBseShzdGQ6Om1vdmUocmVxKSwgZnJhbWUubXNnX2ludm9rZV9tZXRob2RfcmVwbHkoKSk7Cisg
IH0KKyAgaWYgKGZyYW1lLmhhc19tc2dfcmVxdWVzdF9lcnJvcigpKSB7CisgICAgUEVSRkVUVE9f
RExPRygiSG9zdCBlcnJvcjogJXMiLCBmcmFtZS5tc2dfcmVxdWVzdF9lcnJvcigpLmVycm9yKCku
Y19zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgUEVSRkVUVE9fRExPRygKKyAgICAgICJP
bkZyYW1lUmVjZWl2ZWQoKSByZXF1ZXN0IHR5cGU9JWQsIHJlY2VpdmVkIHVua25vd24gZnJhbWUg
aW4gcmVwbHkgdG8gIgorICAgICAgInJlcXVlc3RfaWQ9JSIgUFJJdTY0LAorICAgICAgcmVxLnR5
cGUsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcmFtZS5yZXF1ZXN0X2lkKCkpKTsKK30KKwordm9p
ZCBDbGllbnRJbXBsOjpPbkJpbmRTZXJ2aWNlUmVwbHkoUXVldWVkUmVxdWVzdCByZXEsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZTo6QmluZFNlcnZpY2VS
ZXBseSYgcmVwbHkpIHsKKyAgYmFzZTo6V2Vha1B0cjxTZXJ2aWNlUHJveHk+JiBzZXJ2aWNlX3By
b3h5ID0gcmVxLnNlcnZpY2VfcHJveHk7CisgIGlmICghc2VydmljZV9wcm94eSkKKyAgICByZXR1
cm47CisgIGNvbnN0IGNoYXIqIHN2Y19uYW1lID0gc2VydmljZV9wcm94eS0+R2V0RGVzY3JpcHRv
cigpLnNlcnZpY2VfbmFtZTsKKyAgaWYgKCFyZXBseS5zdWNjZXNzKCkpIHsKKyAgICBQRVJGRVRU
T19ETE9HKCJCaW5kU2VydmljZSgpOiB1bmtub3duIHNlcnZpY2VfbmFtZT1cIiVzXCIiLCBzdmNf
bmFtZSk7CisgICAgcmV0dXJuIHNlcnZpY2VfcHJveHktPk9uQ29ubmVjdChmYWxzZSAvKiBzdWNj
ZXNzICovKTsKKyAgfQorCisgIGF1dG8gcHJldl9zZXJ2aWNlID0gc2VydmljZV9iaW5kaW5nc18u
ZmluZChyZXBseS5zZXJ2aWNlX2lkKCkpOworICBpZiAocHJldl9zZXJ2aWNlICE9IHNlcnZpY2Vf
YmluZGluZ3NfLmVuZCgpICYmIHByZXZfc2VydmljZS0+c2Vjb25kLmdldCgpKSB7CisgICAgUEVS
RkVUVE9fRExPRygKKyAgICAgICAgIkJpbmRTZXJ2aWNlKCk6IFRyeWluZyB0byBiaW5kIHNlcnZp
Y2UgXCIlc1wiIGJ1dCBhbm90aGVyIHNlcnZpY2UgIgorICAgICAgICAibmFtZWQgXCIlc1wiIGlz
IGFscmVhZHkgYm91bmQgd2l0aCB0aGUgc2FtZSBJRC4iLAorICAgICAgICBzdmNfbmFtZSwgcHJl
dl9zZXJ2aWNlLT5zZWNvbmQtPkdldERlc2NyaXB0b3IoKS5zZXJ2aWNlX25hbWUpOworICAgIHJl
dHVybiBzZXJ2aWNlX3Byb3h5LT5PbkNvbm5lY3QoZmFsc2UgLyogc3VjY2VzcyAqLyk7CisgIH0K
KworICAvLyBCdWlsZCB0aGUgbWV0aG9kIFtuYW1lXSAtPiBbcmVtb3RlX2lkXSBtYXAuCisgIHN0
ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNZXRob2RJRD4gbWV0aG9kczsKKyAgZm9yIChjb25zdCBhdXRv
JiBtZXRob2QgOiByZXBseS5tZXRob2RzKCkpIHsKKyAgICBpZiAobWV0aG9kLm5hbWUoKS5lbXB0
eSgpIHx8IG1ldGhvZC5pZCgpIDw9IDApIHsKKyAgICAgIFBFUkZFVFRPX0RMT0coIk9uQmluZFNl
cnZpY2VSZXBseSgpOiBpbnZhbGlkIG1ldGhvZCBcIiVzXCIgLT4gJSIgUFJJdTY0LAorICAgICAg
ICAgICAgICAgICAgICBtZXRob2QubmFtZSgpLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQ2NF90
PihtZXRob2QuaWQoKSkpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIG1ldGhvZHNbbWV0
aG9kLm5hbWUoKV0gPSBtZXRob2QuaWQoKTsKKyAgfQorICBzZXJ2aWNlX3Byb3h5LT5Jbml0aWFs
aXplQmluZGluZyh3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnNlcnZpY2VfaWQoKSwgc3RkOjptb3ZlKG1ldGhv
ZHMpKTsKKyAgc2VydmljZV9iaW5kaW5nc19bcmVwbHkuc2VydmljZV9pZCgpXSA9IHNlcnZpY2Vf
cHJveHk7CisgIHNlcnZpY2VfcHJveHktPk9uQ29ubmVjdCh0cnVlIC8qIHN1Y2Nlc3MgKi8pOwor
fQorCit2b2lkIENsaWVudEltcGw6Ok9uSW52b2tlTWV0aG9kUmVwbHkoUXVldWVkUmVxdWVzdCBy
ZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWU6Oklu
dm9rZU1ldGhvZFJlcGx5JiByZXBseSkgeworICBiYXNlOjpXZWFrUHRyPFNlcnZpY2VQcm94eT4g
c2VydmljZV9wcm94eSA9IHJlcS5zZXJ2aWNlX3Byb3h5OworICBpZiAoIXNlcnZpY2VfcHJveHkp
CisgICAgcmV0dXJuOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJvdG9NZXNzYWdlPiBkZWNvZGVkX3Jl
cGx5OworICBpZiAocmVwbHkuc3VjY2VzcygpKSB7CisgICAgLy8gSWYgdGhpcyBiZWNvbWVzIGEg
aG90c3BvdCwgb3B0aW1pemUgYnkgbWFpbnRhaW5pbmcgYSBkZWRpY2F0ZWQgaGFzaHRhYmxlLgor
ICAgIGZvciAoY29uc3QgYXV0byYgbWV0aG9kIDogc2VydmljZV9wcm94eS0+R2V0RGVzY3JpcHRv
cigpLm1ldGhvZHMpIHsKKyAgICAgIGlmIChyZXEubWV0aG9kX25hbWUgPT0gbWV0aG9kLm5hbWUp
IHsKKyAgICAgICAgZGVjb2RlZF9yZXBseSA9IG1ldGhvZC5yZXBseV9wcm90b19kZWNvZGVyKHJl
cGx5LnJlcGx5X3Byb3RvKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0K
KyAgY29uc3QgUmVxdWVzdElEIHJlcXVlc3RfaWQgPSByZXEucmVxdWVzdF9pZDsKKyAgaW52b2tp
bmdfbWV0aG9kX3JlcGx5XyA9IHRydWU7CisgIHNlcnZpY2VfcHJveHktPkVuZEludm9rZShyZXF1
ZXN0X2lkLCBzdGQ6Om1vdmUoZGVjb2RlZF9yZXBseSksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZXBseS5oYXNfbW9yZSgpKTsKKyAgaW52b2tpbmdfbWV0aG9kX3JlcGx5XyA9IGZhbHNl
OworCisgIC8vIElmIHRoaXMgaXMgYSBzdHJlYW1pbmcgbWV0aG9kIGFuZCBmdXR1cmUgcmVwbGll
cyB3aWxsIGJlIHJlc29sdmVkLCBwdXQgYmFjaworICAvLyB0aGUgfHJlcXwgd2l0aCB0aGUgY2Fs
bGJhY2sgaW50byB0aGUgc2V0IG9mIGFjdGl2ZSByZXF1ZXN0cy4KKyAgaWYgKHJlcGx5Lmhhc19t
b3JlKCkpCisgICAgcXVldWVkX3JlcXVlc3RzXy5lbXBsYWNlKHJlcXVlc3RfaWQsIHN0ZDo6bW92
ZShyZXEpKTsKK30KKworQ2xpZW50SW1wbDo6UXVldWVkUmVxdWVzdDo6UXVldWVkUmVxdWVzdCgp
ID0gZGVmYXVsdDsKKworYmFzZTo6U2NvcGVkRmlsZSBDbGllbnRJbXBsOjpUYWtlUmVjZWl2ZWRG
RCgpIHsKKyAgcmV0dXJuIHN0ZDo6bW92ZShyZWNlaXZlZF9mZF8pOworfQorCit9ICAvLyBuYW1l
c3BhY2UgaXBjCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBzb3VyY2U6IHNyYy9pcGMvc2VydmljZV9wcm94eS5jYworLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQg
dW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cisg
KiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhl
IExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAq
CisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoK
KyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3Jp
dGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3Ry
aWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09O
RElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0
aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9u
cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvc2VydmljZV9w
cm94eS5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS93ZWFrX3B0ci5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9zZXJ2
aWNlX2Rlc2NyaXB0b3IuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InNyYy9pcGMvY2xpZW50X2ltcGwuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2lwYy93aXJlX3Byb3RvY29sLmdlbi5oIgorCituYW1l
c3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGlwYyB7CisKK1NlcnZpY2VQcm94eTo6U2Vydmlj
ZVByb3h5KEV2ZW50TGlzdGVuZXIqIGV2ZW50X2xpc3RlbmVyKQorICAgIDogZXZlbnRfbGlzdGVu
ZXJfKGV2ZW50X2xpc3RlbmVyKSwgd2Vha19wdHJfZmFjdG9yeV8odGhpcykge30KKworU2Vydmlj
ZVByb3h5Ojp+U2VydmljZVByb3h5KCkgeworICBpZiAoY2xpZW50XyAmJiBjb25uZWN0ZWQoKSkK
KyAgICBjbGllbnRfLT5VbmJpbmRTZXJ2aWNlKHNlcnZpY2VfaWRfKTsKK30KKwordm9pZCBTZXJ2
aWNlUHJveHk6OkluaXRpYWxpemVCaW5kaW5nKAorICAgIGJhc2U6OldlYWtQdHI8Q2xpZW50PiBj
bGllbnQsCisgICAgU2VydmljZUlEIHNlcnZpY2VfaWQsCisgICAgc3RkOjptYXA8c3RkOjpzdHJp
bmcsIE1ldGhvZElEPiByZW1vdGVfbWV0aG9kX2lkcykgeworICBjbGllbnRfID0gc3RkOjptb3Zl
KGNsaWVudCk7CisgIHNlcnZpY2VfaWRfID0gc2VydmljZV9pZDsKKyAgcmVtb3RlX21ldGhvZF9p
ZHNfID0gc3RkOjptb3ZlKHJlbW90ZV9tZXRob2RfaWRzKTsKK30KKwordm9pZCBTZXJ2aWNlUHJv
eHk6OkJlZ2luSW52b2tlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2RfbmFtZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm90b01lc3NhZ2UmIHJlcXVlc3QsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWRCYXNlIHJlcGx5LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGludCBmZCkgeworICAvLyB8cmVwbHl8IHdpbGwgYXV0by1y
ZXNvbHZlIGlmIGl0IGdldHMgb3V0IG9mIHNjb3BlIGVhcmx5LgorICBpZiAoIWNvbm5lY3RlZCgp
KSB7CisgICAgUEVSRkVUVE9fREZBVEFMKCJOb3QgY29ubmVjdGVkLiIpOworICAgIHJldHVybjsK
KyAgfQorICBpZiAoIWNsaWVudF8pCisgICAgcmV0dXJuOyAgLy8gVGhlIENsaWVudCBvYmplY3Qg
aGFzIGJlZW4gZGVzdHJveWVkIGluIHRoZSBtZWFudGltZS4KKworICBhdXRvIHJlbW90ZV9tZXRo
b2RfaXQgPSByZW1vdGVfbWV0aG9kX2lkc18uZmluZChtZXRob2RfbmFtZSk7CisgIFJlcXVlc3RJ
RCByZXF1ZXN0X2lkID0gMDsKKyAgY29uc3QgYm9vbCBkcm9wX3JlcGx5ID0gIXJlcGx5LklzQm91
bmQoKTsKKyAgaWYgKHJlbW90ZV9tZXRob2RfaXQgIT0gcmVtb3RlX21ldGhvZF9pZHNfLmVuZCgp
KSB7CisgICAgcmVxdWVzdF9pZCA9CisgICAgICAgIHN0YXRpY19jYXN0PENsaWVudEltcGwqPihj
bGllbnRfLmdldCgpKQorICAgICAgICAgICAgLT5CZWdpbkludm9rZShzZXJ2aWNlX2lkXywgbWV0
aG9kX25hbWUsIHJlbW90ZV9tZXRob2RfaXQtPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVxdWVzdCwgZHJvcF9yZXBseSwgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZCk7CisgIH0gZWxzZSB7CisgICAgUEVSRkVU
VE9fRExPRygiQ2Fubm90IGZpbmQgbWV0aG9kIFwiJXNcIiBvbiB0aGUgaG9zdCIsIG1ldGhvZF9u
YW1lLmNfc3RyKCkpOworICB9CisKKyAgLy8gV2hlbiBwYXNzaW5nIHxkcm9wX3JlcGx5fCA9PSB0
cnVlLCB0aGUgcmV0dXJuZWQgfHJlcXVlc3RfaWR8IHNob3VsZCBiZSAwLgorICBQRVJGRVRUT19E
Q0hFQ0soIWRyb3BfcmVwbHkgfHwgIXJlcXVlc3RfaWQpOworCisgIGlmICghcmVxdWVzdF9pZCkK
KyAgICByZXR1cm47CisgIFBFUkZFVFRPX0RDSEVDSyhwZW5kaW5nX2NhbGxiYWNrc18uY291bnQo
cmVxdWVzdF9pZCkgPT0gMCk7CisgIHBlbmRpbmdfY2FsbGJhY2tzXy5lbXBsYWNlKHJlcXVlc3Rf
aWQsIHN0ZDo6bW92ZShyZXBseSkpOworfQorCit2b2lkIFNlcnZpY2VQcm94eTo6RW5kSW52b2tl
KFJlcXVlc3RJRCByZXF1ZXN0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6
OnVuaXF1ZV9wdHI8UHJvdG9NZXNzYWdlPiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJvb2wgaGFzX21vcmUpIHsKKyAgYXV0byBjYWxsYmFja19pdCA9IHBlbmRpbmdfY2Fs
bGJhY2tzXy5maW5kKHJlcXVlc3RfaWQpOworICBpZiAoY2FsbGJhY2tfaXQgPT0gcGVuZGluZ19j
YWxsYmFja3NfLmVuZCgpKSB7CisgICAgLy8gRWl0aGVyIHdlIGFyZSBnZXR0aW5nIGEgcmVwbHkg
Zm9yIGEgbWV0aG9kIHdlIG5ldmVyIGludm9rZWQsIG9yIHdlIGFyZQorICAgIC8vIGdldHRpbmcg
YSByZXBseSB0byBhIG1ldGhvZCBtYXJrZWQgZHJvcF9yZXBseSAodGhhdCBoYXMgYmVlbiBpbnZv
a2VkCisgICAgLy8gd2l0aG91dCBiaW5kaW5nIGFueSBjYWxsYmFjayBpbiB0aGUgRGVmZXJlcmQg
cmVzcG9uc2Ugb2JqZWN0KS4KKyAgICBQRVJGRVRUT19ERkFUQUwoIlVuZXhwZWN0ZWQgcmVwbHkg
cmVjZWl2ZWQuIik7CisgICAgcmV0dXJuOworICB9CisgIERlZmVycmVkQmFzZSYgcmVwbHlfY2Fs
bGJhY2sgPSBjYWxsYmFja19pdC0+c2Vjb25kOworICBBc3luY1Jlc3VsdDxQcm90b01lc3NhZ2U+
IHJlcGx5KHN0ZDo6bW92ZShyZXN1bHQpLCBoYXNfbW9yZSk7CisgIHJlcGx5X2NhbGxiYWNrLlJl
c29sdmUoc3RkOjptb3ZlKHJlcGx5KSk7CisgIGlmICghaGFzX21vcmUpCisgICAgcGVuZGluZ19j
YWxsYmFja3NfLmVyYXNlKGNhbGxiYWNrX2l0KTsKK30KKwordm9pZCBTZXJ2aWNlUHJveHk6Ok9u
Q29ubmVjdChib29sIHN1Y2Nlc3MpIHsKKyAgaWYgKHN1Y2Nlc3MpIHsKKyAgICBQRVJGRVRUT19E
Q0hFQ0soc2VydmljZV9pZF8pOworICAgIHJldHVybiBldmVudF9saXN0ZW5lcl8tPk9uQ29ubmVj
dCgpOworICB9CisgIHJldHVybiBldmVudF9saXN0ZW5lcl8tPk9uRGlzY29ubmVjdCgpOworfQor
Cit2b2lkIFNlcnZpY2VQcm94eTo6T25EaXNjb25uZWN0KCkgeworICBwZW5kaW5nX2NhbGxiYWNr
c18uY2xlYXIoKTsgIC8vIFdpbGwgUmVqZWN0KCkgYWxsIHRoZSBwZW5kaW5nIGNhbGxiYWNrcy4K
KyAgZXZlbnRfbGlzdGVuZXJfLT5PbkRpc2Nvbm5lY3QoKTsKK30KKworYmFzZTo6V2Vha1B0cjxT
ZXJ2aWNlUHJveHk+IFNlcnZpY2VQcm94eTo6R2V0V2Vha1B0cigpIGNvbnN0IHsKKyAgcmV0dXJu
IHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlw
YworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gc291
cmNlOiBzcmMvdHJhY2luZy9pcGMvZGVmYXVsdF9zb2NrZXQuY2MKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L3RyYWNpbmcvaXBjL2RlZmF1bHRf
c29ja2V0LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3Vy
Y2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy
c2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBl
eGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4g
YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5v
cmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGlj
YWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRl
ZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAor
ICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
eHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBs
YW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0
aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJTkdf
SVBDX0RFRkFVTFRfU09DS0VUX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJ
TkdfSVBDX0RFRkFVTFRfU09DS0VUX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CisKK1BFUkZFVFRPX0VYUE9SVCBjb25zdCBjaGFyKiBHZXRDb25zdW1lclNvY2tldCgpOworUEVS
RkVUVE9fRVhQT1JUIGNvbnN0IGNoYXIqIEdldFByb2R1Y2VyU29ja2V0KCk7CisKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fRVhUX1RSQUNJ
TkdfSVBDX0RFRkFVTFRfU09DS0VUX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBB
bmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBh
Y2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90
IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAq
IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJl
cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy
ZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFO
WSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZv
ciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGlt
aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvaXBjL2RlZmF1bHRfc29ja2V0
LmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jh
c2UvYnVpbGRfY29uZmlnLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9leHQvaXBjL2Jhc2ljX3R5cGVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL2Jhc2ljX3R5cGVzLmgi
CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworc3RhdGlj
X2Fzc2VydChrSW52YWxpZFVpZCA9PSBpcGM6OmtJbnZhbGlkVWlkLCAia0ludmFsaWRVaWQgbWlz
bWF0Y2hpbmciKTsKKworY29uc3QgY2hhciogR2V0UHJvZHVjZXJTb2NrZXQoKSB7CisgIHN0YXRp
YyBjb25zdCBjaGFyKiBuYW1lID0gZ2V0ZW52KCJQRVJGRVRUT19QUk9EVUNFUl9TT0NLX05BTUUi
KTsKKyAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJG
RVRUT19PU19BTkRST0lEKQorICAgIG5hbWUgPSAiL2Rldi9zb2NrZXQvdHJhY2VkX3Byb2R1Y2Vy
IjsKKyNlbHNlCisgICAgbmFtZSA9ICIvdG1wL3BlcmZldHRvLXByb2R1Y2VyIjsKKyNlbmRpZgor
ICB9CisgIHJldHVybiBuYW1lOworfQorCitjb25zdCBjaGFyKiBHZXRDb25zdW1lclNvY2tldCgp
IHsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUgPSBnZXRlbnYoIlBFUkZFVFRPX0NPTlNVTUVS
X1NPQ0tfTkFNRSIpOworICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisjaWYgUEVSRkVUVE9fQlVJ
TERGTEFHKFBFUkZFVFRPX09TX0FORFJPSUQpCisgICAgbmFtZSA9ICIvZGV2L3NvY2tldC90cmFj
ZWRfY29uc3VtZXIiOworI2Vsc2UKKyAgICBuYW1lID0gIi90bXAvcGVyZmV0dG8tY29uc3VtZXIi
OworI2VuZGlmCisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJm
ZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcvaXBjL21l
bWZkLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBzcmMvdHJhY2luZy9pcGMv
bWVtZmQuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJj
ZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJz
aW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4
Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBh
IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9y
Zy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNh
YmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVk
IHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisg
KiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4
cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxh
bmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRo
ZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1JDX1RSQUNJTkdfSVBDX01FTUZEX0hfCisjZGVm
aW5lIFNSQ19UUkFDSU5HX0lQQ19NRU1GRF9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9zY29wZWRfZmls
ZS5oIgorCisvLyBTb21lIGFuZHJvaWQgYnVpbGQgYm90cyB1c2UgYSBzeXNyb290IHRoYXQgZG9l
c24ndCBzdXBwb3J0IG1lbWZkIHdoZW4KKy8vIGNvbXBpbGluZyBmb3IgdGhlIGhvc3QsIHNvIHdl
IGRlZmluZSB0aGUgZmxhZ3Mgd2UgbmVlZCBvdXJzZWx2ZXMuCisKKy8vIGZyb20gbWVtZmQuaAor
I2lmbmRlZiBNRkRfQ0xPRVhFQworI2RlZmluZSBNRkRfQ0xPRVhFQyAweDAwMDFVCisjZGVmaW5l
IE1GRF9BTExPV19TRUFMSU5HIDB4MDAwMlUKKyNlbmRpZgorCisvLyBmcm9tIGZjbnRsLmgKKyNp
Zm5kZWYgRl9BRERfU0VBTFMKKyNkZWZpbmUgRl9BRERfU0VBTFMgMTAzMworI2RlZmluZSBGX0dF
VF9TRUFMUyAxMDM0CisjZGVmaW5lIEZfU0VBTF9TRUFMIDB4MDAwMQorI2RlZmluZSBGX1NFQUxf
U0hSSU5LIDB4MDAwMgorI2RlZmluZSBGX1NFQUxfR1JPVyAweDAwMDQKKyNkZWZpbmUgRl9TRUFM
X1dSSVRFIDB4MDAwOAorI2VuZGlmCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIFdoZXRo
ZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMgbWVtZmQuCitib29sIEhhc01lbWZkU3Vw
cG9ydCgpOworCisvLyBDYWxsIG1lbWZkKDIpIGlmIGF2YWlsYWJsZSBvbiBwbGF0Zm9ybSBhbmQg
cmV0dXJuIHRoZSBmZCBhcyByZXN1bHQuIFRoaXMgY2FsbAorLy8gYWxzbyBtYWtlcyBhIGtlcm5l
bCB2ZXJzaW9uIGNoZWNrIGZvciBzYWZldHkgb24gb2xkZXIga2VybmVscyAoYi8xMTY3Njk1NTYp
LgorLy8gUmV0dXJucyBhbiBpbnZhbGlkIFNjb3BlZEZpbGUgb24gZmFpbHVyZS4KK2Jhc2U6OlNj
b3BlZEZpbGUgQ3JlYXRlTWVtZmQoY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgaW50IGZsYWdz
KTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gU1JDX1RSQUNJTkdf
SVBDX01FTUZEX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4g
U291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2Us
IFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp
bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0
YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFj
aGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFw
cGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJp
YnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJ
UywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRo
ZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lm
aWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5k
ZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAic3JjL3RyYWNpbmcvaXBjL21lbWZkLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisj
ZGVmaW5lIFBFUkZFVFRPX01FTUZEX0VOQUJMRUQoKSAwCisKKyNpZiBQRVJGRVRUT19NRU1GRF9F
TkFCTEVEKCkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5j
bHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUg
PHVuaXN0ZC5oPgorCisvLyBTb21lIGFuZHJvaWQgYnVpbGQgYm90cyB1c2UgYSBzeXNyb290IHRo
YXQgZG9lc24ndCBzdXBwb3J0IG1lbWZkIHdoZW4KKy8vIGNvbXBpbGluZyBmb3IgdGhlIGhvc3Qs
IHNvIHdlIHJlZGVmaW5lIGl0IGlmIG5lY2Vzc2FyeS4KKyNpZiAhZGVmaW5lZChfX05SX21lbWZk
X2NyZWF0ZSkKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIF9fTlJfbWVtZmRfY3Jl
YXRlIDMxOQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyNkZWZpbmUgX19OUl9tZW1mZF9jcmVh
dGUgMzU2CisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorI2RlZmluZSBfX05SX21lbWZkX2Ny
ZWF0ZSAyNzkKKyNlbGlmIGRlZmluZWQoX19hcm1fXykKKyNkZWZpbmUgX19OUl9tZW1mZF9jcmVh
dGUgMzg1CisjZWxzZQorI2Vycm9yICJ1bnN1cHBvcnRlZCBzeXNyb290IHdpdGhvdXQgbWVtZmQg
c3VwcG9ydCIKKyNlbmRpZgorI2VuZGlmICAvLyAhZGVmaW5lZChfX05SX21lbWZkX2NyZWF0ZSkK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK2Jvb2wgSGFzTWVtZmRTdXBwb3J0KCkgeworICBzdGF0
aWMgYm9vbCBrU3VwcG9ydHNNZW1mZCA9IFtdIHsKKyAgICAvLyBDaGVjayBrZXJuZWwgdmVyc2lv
biBzdXBwb3J0cyBtZW1mZF9jcmVhdGUoKS4gU29tZSBvbGRlciBrZXJuZWxzIHNlZ2ZhdWx0Cisg
ICAgLy8gZXhlY3V0aW5nIG1lbWZkX2NyZWF0ZSgpIHJhdGhlciB0aGFuIHJldHVybmluZyBFTk9T
WVMgKGIvMTE2NzY5NTU2KS4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrUmVxdWlyZWRNYWpv
ciA9IDM7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1JlcXVpcmVkTWlub3IgPSAxNzsKKyAg
ICBzdHJ1Y3QgdXRzbmFtZSB1dHM7CisgICAgaW50IG1ham9yLCBtaW5vcjsKKyAgICBpZiAodW5h
bWUoJnV0cykgPT0gMCAmJiBzdHJjbXAodXRzLnN5c25hbWUsICJMaW51eCIpID09IDAgJiYKKyAg
ICAgICAgc3NjYW5mKHV0cy5yZWxlYXNlLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcikgPT0gMiAm
JgorICAgICAgICAoKG1ham9yIDwga1JlcXVpcmVkTWFqb3IgfHwKKyAgICAgICAgICAobWFqb3Ig
PT0ga1JlcXVpcmVkTWFqb3IgJiYgbWlub3IgPCBrUmVxdWlyZWRNaW5vcikpKSkgeworICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJhc2U6OlNjb3BlZEZpbGUgZmQ7CisgICAgZmQu
cmVzZXQoc3RhdGljX2Nhc3Q8aW50PihzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCAicGVyZmV0
dG9fc2htZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkRfQ0xP
RVhFQyB8IE1GRF9BTExPV19TRUFMSU5HKSkpOworICAgIHJldHVybiAhIWZkOworICB9KCk7Cisg
IHJldHVybiBrU3VwcG9ydHNNZW1mZDsKK30KKworYmFzZTo6U2NvcGVkRmlsZSBDcmVhdGVNZW1m
ZChjb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKKyAgaWYgKCFIYXNNZW1m
ZFN1cHBvcnQoKSkgeworICAgIGVycm5vID0gRU5PU1lTOworICAgIHJldHVybiBiYXNlOjpTY29w
ZWRGaWxlKCk7CisgIH0KKyAgcmV0dXJuIGJhc2U6OlNjb3BlZEZpbGUoCisgICAgICBzdGF0aWNf
Y2FzdDxpbnQ+KHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsIG5hbWUsIGZsYWdzKSkpOworfQor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbHNlICAvLyBQRVJGRVRUT19NRU1GRF9FTkFC
TEVEKCkKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK2Jvb2wgSGFzTWVtZmRTdXBwb3J0KCkgewor
ICByZXR1cm4gZmFsc2U7Cit9CitiYXNlOjpTY29wZWRGaWxlIENyZWF0ZU1lbWZkKGNvbnN0IGNo
YXIqLCB1bnNpZ25lZCBpbnQpIHsKKyAgZXJybm8gPSBFTk9TWVM7CisgIHJldHVybiBiYXNlOjpT
Y29wZWRGaWxlKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBQ
RVJGRVRUT19NRU1GRF9FTkFCTEVEKCkKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6
IHNyYy90cmFjaW5nL2lwYy9wb3NpeF9zaGFyZWRfbWVtb3J5LmNjCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBzcmMvdHJhY2luZy9pcGMvcG9zaXhfc2hhcmVkX21lbW9yeS5oCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBTUkNfVFJBQ0lOR19JUENfUE9TSVhfU0hBUkVEX01FTU9SWV9IXwor
I2RlZmluZSBTUkNfVFJBQ0lOR19JUENfUE9TSVhfU0hBUkVEX01FTU9SWV9IXworCisjaW5jbHVk
ZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvYnVpbGRfY29uZmlnLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9zY29wZWRf
ZmlsZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
ZXh0L3RyYWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CisKKy8vIEltcGxlbWVudHMgdGhlIFNoYXJlZE1lbW9yeSBhbmQgaXRzIGZhY3RvcnkgZm9yIHRo
ZSBwb3NpeC1iYXNlZCB0cmFuc3BvcnQuCitjbGFzcyBQb3NpeFNoYXJlZE1lbW9yeSA6IHB1Ymxp
YyBTaGFyZWRNZW1vcnkgeworIHB1YmxpYzoKKyAgY2xhc3MgRmFjdG9yeSA6IHB1YmxpYyBTaGFy
ZWRNZW1vcnk6OkZhY3RvcnkgeworICAgcHVibGljOgorICAgIH5GYWN0b3J5KCkgb3ZlcnJpZGU7
CisgICAgc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeT4gQ3JlYXRlU2hhcmVkTWVtb3J5KHNp
emVfdCkgb3ZlcnJpZGU7CisgIH07CisKKyAgLy8gQ3JlYXRlIGEgYnJhbmQgbmV3IFNITSByZWdp
b24uCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UG9zaXhTaGFyZWRNZW1vcnk+IENyZWF0ZShz
aXplX3Qgc2l6ZSk7CisKKyAgLy8gTW1hcHMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYW4gZXhpc3Rp
bmcgU0hNIHJlZ2lvbi4gSWYKKyAgLy8gfHJlcXVpcmVfc2VhbHNfaWZfc3VwcG9ydGVkfCBpcyB0
cnVlIGFuZCB0aGUgc3lzdGVtIHN1cHBvcnRzCisgIC8vIG1lbWZkX2NyZWF0ZSgpLCB0aGUgRkQg
aXMgcmVxdWlyZWQgdG8gYmUgYSBzZWFsZWQgbWVtZmQgd2l0aCBGX1NFQUxfU0VBTCwKKyAgLy8g
Rl9TRUFMX0dST1csIGFuZCBGX1NFQUxfU0hSSU5LIHNlYWxzIHNldCAob3RoZXJ3aXNlLCBudWxs
cHRyIGlzIHJldHVybmVkKS4KKyAgLy8gTWF5IGFsc28gcmV0dXJuIG51bGxwdHIgaWYgbWFwcGlu
ZyBmYWlscyBmb3IgYW5vdGhlciByZWFzb24gKGUuZy4gT09NKS4KKyAgc3RhdGljIHN0ZDo6dW5p
cXVlX3B0cjxQb3NpeFNoYXJlZE1lbW9yeT4gQXR0YWNoVG9GZCgKKyAgICAgIGJhc2U6OlNjb3Bl
ZEZpbGUsCisgICAgICBib29sIHJlcXVpcmVfc2VhbHNfaWZfc3VwcG9ydGVkID0gdHJ1ZSk7CisK
KyAgflBvc2l4U2hhcmVkTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgaW50IGZkKCkgY29uc3Qgb3Zl
cnJpZGUgeyByZXR1cm4gZmRfLmdldCgpOyB9CisKKyAgLy8gU2hhcmVkTWVtb3J5IGltcGxlbWVu
dGF0aW9uLgorICB2b2lkKiBzdGFydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHN0YXJ0Xzsg
fQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHNpemVfOyB9CisKKyBw
cml2YXRlOgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFBvc2l4U2hhcmVkTWVtb3J5PiBNYXBG
RChiYXNlOjpTY29wZWRGaWxlLCBzaXplX3QpOworCisgIFBvc2l4U2hhcmVkTWVtb3J5KHZvaWQq
IHN0YXJ0LCBzaXplX3Qgc2l6ZSwgYmFzZTo6U2NvcGVkRmlsZSk7CisgIFBvc2l4U2hhcmVkTWVt
b3J5KGNvbnN0IFBvc2l4U2hhcmVkTWVtb3J5JikgPSBkZWxldGU7CisgIFBvc2l4U2hhcmVkTWVt
b3J5JiBvcGVyYXRvcj0oY29uc3QgUG9zaXhTaGFyZWRNZW1vcnkmKSA9IGRlbGV0ZTsKKworICB2
b2lkKiBjb25zdCBzdGFydF87CisgIGNvbnN0IHNpemVfdCBzaXplXzsKKyAgYmFzZTo6U2NvcGVk
RmlsZSBmZF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBT
UkNfVFJBQ0lOR19JUENfUE9TSVhfU0hBUkVEX01FTU9SWV9IXworLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQg
dW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cisg
KiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhl
IExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAq
CisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoK
KyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3Jp
dGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3Ry
aWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09O
RElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0
aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9u
cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInNyYy90cmFjaW5nL2lwYy9wb3NpeF9zaGFy
ZWRfbWVtb3J5LmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgor
I2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21t
YW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5j
bHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvY29tcGlsZXIuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdGVt
cF9maWxlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJh
Y2luZy9pcGMvbWVtZmQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworbmFtZXNwYWNlIHsK
K2ludCBrRmlsZVNlYWxzID0gRl9TRUFMX1NIUklOSyB8IEZfU0VBTF9HUk9XIHwgRl9TRUFMX1NF
QUw7Cit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8UG9zaXhT
aGFyZWRNZW1vcnk+IFBvc2l4U2hhcmVkTWVtb3J5OjpDcmVhdGUoc2l6ZV90IHNpemUpIHsKKyAg
YmFzZTo6U2NvcGVkRmlsZSBmZCA9CisgICAgICBDcmVhdGVNZW1mZCgicGVyZmV0dG9fc2htZW0i
LCBNRkRfQ0xPRVhFQyB8IE1GRF9BTExPV19TRUFMSU5HKTsKKyAgYm9vbCBpc19tZW1mZCA9ICEh
ZmQ7CisKKyAgLy8gSW4tdHJlZSBidWlsZHMgb25seSBhbGxvdyBtZW1fZmQsIHNvIHdlIGNhbiBp
bnNwZWN0IHRoZSBzZWFscyB0byB2ZXJpZnkgdGhlCisgIC8vIGZkIGlzIGFwcHJvcHJpYXRlbHkg
c2VhbGVkLiBXZSdsbCBjcmFzaCBpbiB0aGUgUEVSRkVUVE9fQ0hFQ0soZmQpIGJlbG93IGlmCisg
IC8vIG1lbWZkX2NyZWF0ZSBmYWlsZWQuCisjaWYgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRU
T19BTkRST0lEX0JVSUxEKQorICBpZiAoIWZkKSB7CisgICAgLy8gVE9ETzogaWYgdGhpcyBmYWls
cyBvbiBBbmRyb2lkIHdlIHNob3VsZCBmYWxsIGJhY2sgb24gYXNobWVtLgorICAgIFBFUkZFVFRP
X0RQTE9HKCJtZW1mZF9jcmVhdGUoKSBmYWlsZWQiKTsKKyAgICBmZCA9IGJhc2U6OlRlbXBGaWxl
OjpDcmVhdGVVbmxpbmtlZCgpLlJlbGVhc2VGRCgpOworICB9CisjZW5kaWYKKworICBQRVJGRVRU
T19DSEVDSyhmZCk7CisgIGludCByZXMgPSBmdHJ1bmNhdGUoZmQuZ2V0KCksIHN0YXRpY19jYXN0
PG9mZl90PihzaXplKSk7CisgIFBFUkZFVFRPX0NIRUNLKHJlcyA9PSAwKTsKKworICBpZiAoaXNf
bWVtZmQpIHsKKyAgICAvLyBXaGVuIG1lbWZkIGlzIHN1cHBvcnRlZCwgZmlsZSBzZWFscyBzaG91
bGQgYmUsIHRvby4KKyAgICByZXMgPSBmY250bCgqZmQsIEZfQUREX1NFQUxTLCBrRmlsZVNlYWxz
KTsKKyAgICBQRVJGRVRUT19EQ0hFQ0socmVzID09IDApOworICB9CisKKyAgcmV0dXJuIE1hcEZE
KHN0ZDo6bW92ZShmZCksIHNpemUpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6dW5pcXVlX3B0cjxQ
b3NpeFNoYXJlZE1lbW9yeT4gUG9zaXhTaGFyZWRNZW1vcnk6OkF0dGFjaFRvRmQoCisgICAgYmFz
ZTo6U2NvcGVkRmlsZSBmZCwKKyAgICBib29sIHJlcXVpcmVfc2VhbHNfaWZfc3VwcG9ydGVkKSB7
CisgIGJvb2wgcmVxdWlyZXNfc2VhbHMgPSByZXF1aXJlX3NlYWxzX2lmX3N1cHBvcnRlZDsKKwor
I2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19BTkRST0lEX0JVSUxEKQorICAvLyBJbi10
cmVlIGtlcm5lbHMgYWxsIHN1cHBvcnQgbWVtZmQuCisgIFBFUkZFVFRPX0NIRUNLKEhhc01lbWZk
U3VwcG9ydCgpKTsKKyNlbHNlCisgIC8vIEluIG91dC1vZi10cmVlIGJ1aWxkcywgd2Ugb25seSBy
ZXF1aXJlIHNlYWxzIGlmIHRoZSBrZXJuZWwgc3VwcG9ydHMgbWVtZmQuCisgIGlmIChyZXF1aXJl
c19zZWFscykKKyAgICByZXF1aXJlc19zZWFscyA9IEhhc01lbWZkU3VwcG9ydCgpOworI2VuZGlm
CisKKyAgaWYgKHJlcXVpcmVzX3NlYWxzKSB7CisgICAgLy8gSWYgdGhlIHN5c3RlbSBzdXBwb3J0
cyBtZW1mZCwgd2UgcmVxdWlyZSBhIHNlYWxlZCBtZW1mZC4KKyAgICBpbnQgcmVzID0gZmNudGwo
KmZkLCBGX0dFVF9TRUFMUyk7CisgICAgaWYgKHJlcyA9PSAtMSB8fCAocmVzICYga0ZpbGVTZWFs
cykgIT0ga0ZpbGVTZWFscykgeworICAgICAgUEVSRkVUVE9fUExPRygiQ291bGRuJ3QgdmVyaWZ5
IGZpbGUgc2VhbHMgb24gc2htZW0gRkQiKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0K
KyAgfQorCisgIHN0cnVjdCBzdGF0IHN0YXRfYnVmID0ge307CisgIGludCByZXMgPSBmc3RhdChm
ZC5nZXQoKSwgJnN0YXRfYnVmKTsKKyAgUEVSRkVUVE9fQ0hFQ0socmVzID09IDAgJiYgc3RhdF9i
dWYuc3Rfc2l6ZSA+IDApOworICByZXR1cm4gTWFwRkQoc3RkOjptb3ZlKGZkKSwgc3RhdGljX2Nh
c3Q8c2l6ZV90PihzdGF0X2J1Zi5zdF9zaXplKSk7Cit9CisKKy8vIHN0YXRpYworc3RkOjp1bmlx
dWVfcHRyPFBvc2l4U2hhcmVkTWVtb3J5PiBQb3NpeFNoYXJlZE1lbW9yeTo6TWFwRkQoYmFzZTo6
U2NvcGVkRmlsZSBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhmZCk7
CisgIFBFUkZFVFRPX0RDSEVDSyhzaXplID4gMCk7CisgIHZvaWQqIHN0YXJ0ID0KKyAgICAgIG1t
YXAobnVsbHB0ciwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQu
Z2V0KCksIDApOworICBQRVJGRVRUT19DSEVDSyhzdGFydCAhPSBNQVBfRkFJTEVEKTsKKyAgcmV0
dXJuIHN0ZDo6dW5pcXVlX3B0cjxQb3NpeFNoYXJlZE1lbW9yeT4oCisgICAgICBuZXcgUG9zaXhT
aGFyZWRNZW1vcnkoc3RhcnQsIHNpemUsIHN0ZDo6bW92ZShmZCkpKTsKK30KKworUG9zaXhTaGFy
ZWRNZW1vcnk6OlBvc2l4U2hhcmVkTWVtb3J5KHZvaWQqIHN0YXJ0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJhc2U6OlNjb3BlZEZpbGUgZmQpCisgICAgOiBzdGFydF8oc3RhcnQp
LCBzaXplXyhzaXplKSwgZmRfKHN0ZDo6bW92ZShmZCkpIHt9CisKK1Bvc2l4U2hhcmVkTWVtb3J5
Ojp+UG9zaXhTaGFyZWRNZW1vcnkoKSB7CisgIG11bm1hcChzdGFydCgpLCBzaXplKCkpOworfQor
CitQb3NpeFNoYXJlZE1lbW9yeTo6RmFjdG9yeTo6fkZhY3RvcnkoKSB7fQorCitzdGQ6OnVuaXF1
ZV9wdHI8U2hhcmVkTWVtb3J5PiBQb3NpeFNoYXJlZE1lbW9yeTo6RmFjdG9yeTo6Q3JlYXRlU2hh
cmVkTWVtb3J5KAorICAgIHNpemVfdCBzaXplKSB7CisgIHJldHVybiBQb3NpeFNoYXJlZE1lbW9y
eTo6Q3JlYXRlKHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFjaW5nL2lwYy9jb25zdW1lci9jb25zdW1l
cl9pcGNfY2xpZW50X2ltcGwuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IHNy
Yy90cmFjaW5nL2lwYy9jb25zdW1lci9jb25zdW1lcl9pcGNfY2xpZW50X2ltcGwuaAorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9leHQvdHJhY2luZy9p
cGMvY29uc3VtZXJfaXBjX2NsaWVudC5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBB
bmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBh
Y2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90
IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAq
IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJl
cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy
ZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFO
WSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZv
ciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGlt
aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZF
VFRPX0VYVF9UUkFDSU5HX0lQQ19DT05TVU1FUl9JUENfQ0xJRU5UX0hfCisjZGVmaW5lIElOQ0xV
REVfUEVSRkVUVE9fRVhUX1RSQUNJTkdfSVBDX0NPTlNVTUVSX0lQQ19DTElFTlRfSF8KKworI2lu
Y2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3RyYWNp
bmdfc2VydmljZS5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCitjbGFzcyBDb25zdW1lcjsK
KworLy8gQWxsb3dzIHRvIGNvbm5lY3QgdG8gYSByZW1vdGUgU2VydmljZSB0aHJvdWdoIGEgVU5J
WCBkb21haW4gc29ja2V0LgorLy8gRXhwb3NlZCB0bzoKKy8vICAgQ29uc3VtZXIocykgb2YgdGhl
IHRyYWNpbmcgbGlicmFyeS4KKy8vIEltcGxlbWVudGVkIGluOgorLy8gICBzcmMvdHJhY2luZy9p
cGMvY29uc3VtZXIvY29uc3VtZXJfaXBjX2NsaWVudF9pbXBsLmNjCitjbGFzcyBQRVJGRVRUT19F
WFBPUlQgQ29uc3VtZXJJUENDbGllbnQgeworIHB1YmxpYzoKKyAgLy8gQ29ubmVjdHMgdG8gdGhl
IHByb2R1Y2VyIHBvcnQgb2YgdGhlIFNlcnZpY2UgbGlzdGVuaW5nIG9uIHRoZSBnaXZlbgorICAv
LyB8c2VydmljZV9zb2NrX25hbWV8LiBJZiB0aGUgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsLCB0
aGUgT25Db25uZWN0KCkKKyAgLy8gbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBhc3luY2hyb25vdXNs
eSBvbiB0aGUgcGFzc2VkIENvbnN1bWVyIGludGVyZmFjZS4KKyAgLy8gSWYgdGhlIGNvbm5lY3Rp
b24gZmFpbHMsIE9uRGlzY29ubmVjdCgpIHdpbGwgYmUgaW52b2tlZCBpbnN0ZWFkLgorICAvLyBU
aGUgcmV0dXJuZWQgQ29uc3VtZXJFbmRwb2ludCBzZXJ2ZXMgYWxzbyB0byBkZWxpbWl0IHRoZSBz
Y29wZSBvZiB0aGUKKyAgLy8gY2FsbGJhY2tzIGludm9rZWQgb24gdGhlIENvbnN1bWVyIGludGVy
ZmFjZTogbm8gbW9yZSBDb25zdW1lciBjYWxsYmFja3MgYXJlCisgIC8vIGludm9rZWQgaW1tZWRp
YXRlbHkgYWZ0ZXIgaXRzIGRlc3RydWN0aW9uIGFuZCBhbnkgcGVuZGluZyBjYWxsYmFjayB3aWxs
IGJlCisgIC8vIGRyb3BwZWQuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VHJhY2luZ1NlcnZp
Y2U6OkNvbnN1bWVyRW5kcG9pbnQ+CisgIENvbm5lY3QoY29uc3QgY2hhciogc2VydmljZV9zb2Nr
X25hbWUsIENvbnN1bWVyKiwgYmFzZTo6VGFza1J1bm5lciopOworCisgcHJvdGVjdGVkOgorICBD
b25zdW1lcklQQ0NsaWVudCgpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZl
dHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19JUENfQ09OU1VN
RVJfSVBDX0NMSUVOVF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBP
cGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNl
bnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhp
cyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5
IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cu
YXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBi
eSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRp
c3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIg
QkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwg
ZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNw
ZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25z
IHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1JDX1RSQUNJTkdfSVBDX0NPTlNV
TUVSX0NPTlNVTUVSX0lQQ19DTElFTlRfSU1QTF9IXworI2RlZmluZSBTUkNfVFJBQ0lOR19JUENf
Q09OU1VNRVJfQ09OU1VNRVJfSVBDX0NMSUVOVF9JTVBMX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQu
aD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9zY29wZWRfZmlsZS5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jh
c2Uvd2Vha19wdHIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2V4dC9pcGMvc2VydmljZV9wcm94eS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9iYXNpY190eXBlcy5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNp
bmcvY29yZS90cmFjZV9wYWNrZXQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2luZ19zZXJ2aWNlLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9p
cGMvY29uc3VtZXJfaXBjX2NsaWVudC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2lwYy9jb25z
dW1lcl9wb3J0LmlwYy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCituYW1lc3BhY2UgYmFz
ZSB7CitjbGFzcyBUYXNrUnVubmVyOworfSAgLy8gbmFtZXNwYWNlIGJhc2UKKworbmFtZXNwYWNl
IGlwYyB7CitjbGFzcyBDbGllbnQ7Cit9ICAvLyBuYW1lc3BhY2UgaXBjCisKK2NsYXNzIENvbnN1
bWVyOworCisvLyBFeHBvc2VzIGEgU2VydmljZSBlbmRwb2ludCB0byBDb25zdW1lcihzKSwgcHJv
eHlpbmcgYWxsIHJlcXVlc3RzIHRocm91Z2ggYQorLy8gSVBDIGNoYW5uZWwgdG8gdGhlIHJlbW90
ZSBTZXJ2aWNlLiBUaGlzIGNsYXNzIGlzIHRoZSBnbHVlIGxheWVyIGJldHdlZW4gdGhlCisvLyBn
ZW5lcmljIFNlcnZpY2UgaW50ZXJmYWNlIGV4cG9zZWQgdG8gdGhlIGNsaWVudHMgb2YgdGhlIGxp
YnJhcnkgYW5kIHRoZQorLy8gYWN0dWFsIElQQyB0cmFuc3BvcnQuCitjbGFzcyBDb25zdW1lcklQ
Q0NsaWVudEltcGwgOiBwdWJsaWMgVHJhY2luZ1NlcnZpY2U6OkNvbnN1bWVyRW5kcG9pbnQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaXBjOjpTZXJ2aWNlUHJveHk6OkV2
ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgQ29uc3VtZXJJUENDbGllbnRJbXBsKGNvbnN0IGNo
YXIqIHNlcnZpY2Vfc29ja19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZXIq
LAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGFza1J1bm5lciopOworICB+Q29uc3Vt
ZXJJUENDbGllbnRJbXBsKCkgb3ZlcnJpZGU7CisKKyAgLy8gVHJhY2luZ1NlcnZpY2U6OkNvbnN1
bWVyRW5kcG9pbnQgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGludm9r
ZWQgYnkgdGhlIGFjdHVhbCBDb25zdW1lcihzKSBjb2RlIGJ5IGNsaWVudHMgb2YgdGhlCisgIC8v
IHRyYWNpbmcgbGlicmFyeSwgd2hpY2gga25vdyBub3RoaW5nIGFib3V0IHRoZSBJUEMgdHJhbnNw
b3J0LgorICB2b2lkIEVuYWJsZVRyYWNpbmcoY29uc3QgVHJhY2VDb25maWcmLCBiYXNlOjpTY29w
ZWRGaWxlKSBvdmVycmlkZTsKKyAgdm9pZCBTdGFydFRyYWNpbmcoKSBvdmVycmlkZTsKKyAgdm9p
ZCBDaGFuZ2VUcmFjZUNvbmZpZyhjb25zdCBUcmFjZUNvbmZpZyYpIG92ZXJyaWRlOworICB2b2lk
IERpc2FibGVUcmFjaW5nKCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVhZEJ1ZmZlcnMoKSBvdmVycmlk
ZTsKKyAgdm9pZCBGcmVlQnVmZmVycygpIG92ZXJyaWRlOworICB2b2lkIEZsdXNoKHVpbnQzMl90
IHRpbWVvdXRfbXMsIEZsdXNoQ2FsbGJhY2spIG92ZXJyaWRlOworICB2b2lkIERldGFjaChjb25z
dCBzdGQ6OnN0cmluZyYga2V5KSBvdmVycmlkZTsKKyAgdm9pZCBBdHRhY2goY29uc3Qgc3RkOjpz
dHJpbmcmIGtleSkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0VHJhY2VTdGF0cygpIG92ZXJyaWRlOwor
ICB2b2lkIE9ic2VydmVFdmVudHModWludDMyX3QgZW5hYmxlZF9ldmVudF90eXBlcykgb3ZlcnJp
ZGU7CisgIHZvaWQgUXVlcnlTZXJ2aWNlU3RhdGUoUXVlcnlTZXJ2aWNlU3RhdGVDYWxsYmFjaykg
b3ZlcnJpZGU7CisgIHZvaWQgUXVlcnlDYXBhYmlsaXRpZXMoUXVlcnlDYXBhYmlsaXRpZXNDYWxs
YmFjaykgb3ZlcnJpZGU7CisKKyAgLy8gaXBjOjpTZXJ2aWNlUHJveHk6OkV2ZW50TGlzdGVuZXIg
aW1wbGVtZW50YXRpb24uCisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGludm9rZWQgYnkgdGhlIElQ
QyBsYXllciwgd2hpY2gga25vd3Mgbm90aGluZyBhYm91dAorICAvLyB0cmFjaW5nLCBjb25zdW1l
cnMgYW5kIGNvbnN1bWVycy4KKyAgdm9pZCBPbkNvbm5lY3QoKSBvdmVycmlkZTsKKyAgdm9pZCBP
bkRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHN0cnVjdCBQZW5kaW5nUXVl
cnlTZXJ2aWNlUmVxdWVzdCB7CisgICAgUXVlcnlTZXJ2aWNlU3RhdGVDYWxsYmFjayBjYWxsYmFj
azsKKworICAgIC8vIEFsbCB0aGUgcmVwbGllcyB3aWxsIGJlIGFwcGVuZGVkIGhlcmUgdW50aWwg
fGhhc19tb3JlfCA9PSBmYWxzZS4KKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtZXJnZWRfcmVz
cDsKKyAgfTsKKworICAvLyBMaXN0IGJlY2F1c2Ugd2UgbmVlZCBzdGFibGUgaXRlcmF0b3JzLgor
ICB1c2luZyBQZW5kaW5nUXVlcnlTZXJ2aWNlUmVxdWVzdHMgPSBzdGQ6Omxpc3Q8UGVuZGluZ1F1
ZXJ5U2VydmljZVJlcXVlc3Q+OworCisgIHZvaWQgT25SZWFkQnVmZmVyc1Jlc3BvbnNlKAorICAg
ICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6UmVhZEJ1ZmZlcnNSZXNwb25zZT4pOwor
ICB2b2lkIE9uRW5hYmxlVHJhY2luZ1Jlc3BvbnNlKAorICAgICAgaXBjOjpBc3luY1Jlc3VsdDxw
cm90b3M6Omdlbjo6RW5hYmxlVHJhY2luZ1Jlc3BvbnNlPik7CisgIHZvaWQgT25RdWVyeVNlcnZp
Y2VTdGF0ZVJlc3BvbnNlKAorICAgICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6UXVl
cnlTZXJ2aWNlU3RhdGVSZXNwb25zZT4sCisgICAgICBQZW5kaW5nUXVlcnlTZXJ2aWNlUmVxdWVz
dHM6Oml0ZXJhdG9yKTsKKworICAvLyBUT0RPKHByaW1pYW5vKTogdGhpbmsgdG8gZHRvciBvcmRl
ciwgZG8gd2UgcmVseSBvbiBhbnkgc3BlY2lmaWMgc2VxdWVuY2U/CisgIENvbnN1bWVyKiBjb25z
dCBjb25zdW1lcl87CisKKyAgLy8gVGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIGNsaWVudCBzb2Nr
ZXQgYW5kIHRha2VzIGNhcmUgb2YgSVBDIHRyYWZmaWMuCisgIHN0ZDo6dW5pcXVlX3B0cjxpcGM6
OkNsaWVudD4gaXBjX2NoYW5uZWxfOworCisgIC8vIFRoZSBwcm94eSBpbnRlcmZhY2UgZm9yIHRo
ZSBjb25zdW1lciBwb3J0IG9mIHRoZSBzZXJ2aWNlLiBJdCBpcyBib3VuZAorICAvLyB0byB8aXBj
X2NoYW5uZWxffCBhbmQgKGRlKXNlcmlhbGl6ZXMgbWV0aG9kIGludm9jYXRpb25zIG92ZXIgdGhl
IHdpcmUuCisgIHByb3Rvczo6Z2VuOjpDb25zdW1lclBvcnRQcm94eSBjb25zdW1lcl9wb3J0XzsK
KworICBib29sIGNvbm5lY3RlZF8gPSBmYWxzZTsKKworICBQZW5kaW5nUXVlcnlTZXJ2aWNlUmVx
dWVzdHMgcGVuZGluZ19xdWVyeV9zdmNfcmVxc187CisKKyAgLy8gV2hlbiBhIHBhY2tldCBpcyB0
b28gYmlnIHRvIGZpdCBpbnRvIGEgUmVhZEJ1ZmZlcnNSZXNwb25zZSBJUEMsIHRoZSBzZXJ2aWNl
CisgIC8vIHdpbGwgY2h1bmsgaXQgaW50byBzZXZlcmFsIElQQ3MsIGVhY2ggY29udGFpbmluZyBm
ZXcgc2xpY2VzIG9mIHRoZSBwYWNrZXQKKyAgLy8gKGEgcGFja2V0J3Mgc2xpY2UgaXMgYWx3YXlz
IGd1YXJhbnRlZWQgdG8gYmUgPDwga0lQQ0J1ZmZlclNpemUpLiBXaGVuCisgIC8vIGNodW5raW5n
IGhhcHBlbnMgdGhpcyBmaWVsZCBhY2N1bXVsYXRlcyB0aGUgc2xpY2VzIHJlY2VpdmVkIHVudGls
IHRoZQorICAvLyBvbmUgd2l0aCB8bGFzdF9zbGljZV9mb3JfcGFja2V0fCA9PSB0cnVlIGlzIHJl
Y2VpdmVkLgorICBUcmFjZVBhY2tldCBwYXJ0aWFsX3BhY2tldF87CisKKyAgLy8gS2VlcCBsYXN0
LgorICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxDb25zdW1lcklQQ0NsaWVudEltcGw+IHdlYWtfcHRy
X2ZhY3RvcnlfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8g
U1JDX1RSQUNJTkdfSVBDX0NPTlNVTUVSX0NPTlNVTUVSX0lQQ19DTElFTlRfSU1QTF9IXworLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cisg
KgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhl
ICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21w
bGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhl
IExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9M
SUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh
Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBM
aWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdB
UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w
bGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVy
bmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgor
ICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInNyYy90cmFjaW5n
L2lwYy9jb25zdW1lci9jb25zdW1lcl9pcGNfY2xpZW50X2ltcGwuaCIKKworI2luY2x1ZGUgPGlu
dHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvdGFza19ydW5uZXIuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvY2xpZW50LmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2lu
Zy9jb3JlL2NvbnN1bWVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL29ic2VydmFibGVfZXZlbnRzLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3Jl
L3RyYWNlX3N0YXRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by90cmFjaW5nL2NvcmUvdHJhY2VfY29uZmlnLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2NvcmUvdHJhY2luZ19zZXJ2aWNl
X3N0YXRlLmgiCisKKy8vIFRPRE8oZm1heWVyKTogQWRkIGEgdGVzdCB0byBjaGVjayB0byB3aGF0
IGhhcHBlbnMgd2hlbiBDb25zdW1lcklQQ0NsaWVudEltcGwKKy8vIGdldHMgZGVzdHJveWVkIHcu
ci50LiB0aGUgQ29uc3VtZXIgcG9pbnRlci4gQWxzbyB0aGluayB0byBsaWZldGltZSBvZiB0aGUK
Ky8vIENvbnN1bWVyKiBkdXJpbmcgdGhlIGNhbGxiYWNrcy4KKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKKworLy8gc3RhdGljLiAoRGVjbGFyZWQgaW4gaW5jbHVkZS90cmFjaW5nL2lwYy9jb25zdW1l
cl9pcGNfY2xpZW50LmgpLgorc3RkOjp1bmlxdWVfcHRyPFRyYWNpbmdTZXJ2aWNlOjpDb25zdW1l
ckVuZHBvaW50PiBDb25zdW1lcklQQ0NsaWVudDo6Q29ubmVjdCgKKyAgICBjb25zdCBjaGFyKiBz
ZXJ2aWNlX3NvY2tfbmFtZSwKKyAgICBDb25zdW1lciogY29uc3VtZXIsCisgICAgYmFzZTo6VGFz
a1J1bm5lciogdGFza19ydW5uZXIpIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxUcmFjaW5n
U2VydmljZTo6Q29uc3VtZXJFbmRwb2ludD4oCisgICAgICBuZXcgQ29uc3VtZXJJUENDbGllbnRJ
bXBsKHNlcnZpY2Vfc29ja19uYW1lLCBjb25zdW1lciwgdGFza19ydW5uZXIpKTsKK30KKworQ29u
c3VtZXJJUENDbGllbnRJbXBsOjpDb25zdW1lcklQQ0NsaWVudEltcGwoY29uc3QgY2hhciogc2Vy
dmljZV9zb2NrX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBDb25zdW1lciogY29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBiYXNlOjpUYXNrUnVubmVyKiB0YXNrX3J1bm5lcikKKyAgICA6IGNvbnN1
bWVyXyhjb25zdW1lciksCisgICAgICBpcGNfY2hhbm5lbF8oaXBjOjpDbGllbnQ6OkNyZWF0ZUlu
c3RhbmNlKHNlcnZpY2Vfc29ja19uYW1lLCB0YXNrX3J1bm5lcikpLAorICAgICAgY29uc3VtZXJf
cG9ydF8odGhpcyAvKiBldmVudF9saXN0ZW5lciAqLyksCisgICAgICB3ZWFrX3B0cl9mYWN0b3J5
Xyh0aGlzKSB7CisgIGlwY19jaGFubmVsXy0+QmluZFNlcnZpY2UoY29uc3VtZXJfcG9ydF8uR2V0
V2Vha1B0cigpKTsKK30KKworQ29uc3VtZXJJUENDbGllbnRJbXBsOjp+Q29uc3VtZXJJUENDbGll
bnRJbXBsKCkgPSBkZWZhdWx0OworCisvLyBDYWxsZWQgYnkgdGhlIElQQyBsYXllciBpZiB0aGUg
QmluZFNlcnZpY2UoKSBzdWNjZWVkcy4KK3ZvaWQgQ29uc3VtZXJJUENDbGllbnRJbXBsOjpPbkNv
bm5lY3QoKSB7CisgIGNvbm5lY3RlZF8gPSB0cnVlOworICBjb25zdW1lcl8tPk9uQ29ubmVjdCgp
OworfQorCit2b2lkIENvbnN1bWVySVBDQ2xpZW50SW1wbDo6T25EaXNjb25uZWN0KCkgeworICBQ
RVJGRVRUT19ETE9HKCJUcmFjaW5nIHNlcnZpY2UgY29ubmVjdGlvbiBmYWlsdXJlIik7CisgIGNv
bm5lY3RlZF8gPSBmYWxzZTsKKyAgY29uc3VtZXJfLT5PbkRpc2Nvbm5lY3QoKTsKK30KKwordm9p
ZCBDb25zdW1lcklQQ0NsaWVudEltcGw6OkVuYWJsZVRyYWNpbmcoY29uc3QgVHJhY2VDb25maWcm
IHRyYWNlX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJhc2U6OlNjb3BlZEZpbGUgZmQpIHsKKyAgaWYgKCFjb25uZWN0ZWRfKSB7CisgICAgUEVSRkVU
VE9fRExPRygiQ2Fubm90IEVuYWJsZVRyYWNpbmcoKSwgbm90IGNvbm5lY3RlZCB0byB0cmFjaW5n
IHNlcnZpY2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90b3M6Omdlbjo6RW5hYmxlVHJh
Y2luZ1JlcXVlc3QgcmVxOworICAqcmVxLm11dGFibGVfdHJhY2VfY29uZmlnKCkgPSB0cmFjZV9j
b25maWc7CisgIGlwYzo6RGVmZXJyZWQ8cHJvdG9zOjpnZW46OkVuYWJsZVRyYWNpbmdSZXNwb25z
ZT4gYXN5bmNfcmVzcG9uc2U7CisgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8u
R2V0V2Vha1B0cigpOworICBhc3luY19yZXNwb25zZS5CaW5kKAorICAgICAgW3dlYWtfdGhpc10o
CisgICAgICAgICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6RW5hYmxlVHJhY2luZ1Jl
c3BvbnNlPiByZXNwb25zZSkgeworICAgICAgICBpZiAod2Vha190aGlzKQorICAgICAgICAgIHdl
YWtfdGhpcy0+T25FbmFibGVUcmFjaW5nUmVzcG9uc2Uoc3RkOjptb3ZlKHJlc3BvbnNlKSk7Cisg
ICAgICB9KTsKKworICAvLyB8ZmR8IHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhpcyBmdW5jdGlvbiBy
ZXR1cm5zLCBidXQgaXQncyBmaW5lIGJlY2F1c2UgdGhlCisgIC8vIElQQyBsYXllciBkdXAoKSdz
IGl0IHdoZW4gc2VuZGluZyB0aGUgSVBDLgorICBjb25zdW1lcl9wb3J0Xy5FbmFibGVUcmFjaW5n
KHJlcSwgc3RkOjptb3ZlKGFzeW5jX3Jlc3BvbnNlKSwgKmZkKTsKK30KKwordm9pZCBDb25zdW1l
cklQQ0NsaWVudEltcGw6OkNoYW5nZVRyYWNlQ29uZmlnKGNvbnN0IFRyYWNlQ29uZmlnJikgewor
ICBpZiAoIWNvbm5lY3RlZF8pIHsKKyAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAiQ2Fubm90
IENoYW5nZVRyYWNlQ29uZmlnKCksIG5vdCBjb25uZWN0ZWQgdG8gdHJhY2luZyBzZXJ2aWNlIik7
CisgICAgcmV0dXJuOworICB9CisKKyAgaXBjOjpEZWZlcnJlZDxwcm90b3M6Omdlbjo6Q2hhbmdl
VHJhY2VDb25maWdSZXNwb25zZT4gYXN5bmNfcmVzcG9uc2U7CisgIGFzeW5jX3Jlc3BvbnNlLkJp
bmQoCisgICAgICBbXShpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpDaGFuZ2VUcmFjZUNv
bmZpZ1Jlc3BvbnNlPiByZXNwb25zZSkgeworICAgICAgICBpZiAoIXJlc3BvbnNlKQorICAgICAg
ICAgIFBFUkZFVFRPX0RMT0coIkNoYW5nZVRyYWNlQ29uZmlnKCkgZmFpbGVkIik7CisgICAgICB9
KTsKKyAgcHJvdG9zOjpnZW46OkNoYW5nZVRyYWNlQ29uZmlnUmVxdWVzdCByZXE7CisgIGNvbnN1
bWVyX3BvcnRfLkNoYW5nZVRyYWNlQ29uZmlnKHJlcSwgc3RkOjptb3ZlKGFzeW5jX3Jlc3BvbnNl
KSk7Cit9CisKK3ZvaWQgQ29uc3VtZXJJUENDbGllbnRJbXBsOjpTdGFydFRyYWNpbmcoKSB7Cisg
IGlmICghY29ubmVjdGVkXykgeworICAgIFBFUkZFVFRPX0RMT0coIkNhbm5vdCBTdGFydFRyYWNp
bmcoKSwgbm90IGNvbm5lY3RlZCB0byB0cmFjaW5nIHNlcnZpY2UiKTsKKyAgICByZXR1cm47Cisg
IH0KKworICBpcGM6OkRlZmVycmVkPHByb3Rvczo6Z2VuOjpTdGFydFRyYWNpbmdSZXNwb25zZT4g
YXN5bmNfcmVzcG9uc2U7CisgIGFzeW5jX3Jlc3BvbnNlLkJpbmQoCisgICAgICBbXShpcGM6OkFz
eW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpTdGFydFRyYWNpbmdSZXNwb25zZT4gcmVzcG9uc2UpIHsK
KyAgICAgICAgaWYgKCFyZXNwb25zZSkKKyAgICAgICAgICBQRVJGRVRUT19ETE9HKCJTdGFydFRy
YWNpbmcoKSBmYWlsZWQiKTsKKyAgICAgIH0pOworICBwcm90b3M6Omdlbjo6U3RhcnRUcmFjaW5n
UmVxdWVzdCByZXE7CisgIGNvbnN1bWVyX3BvcnRfLlN0YXJ0VHJhY2luZyhyZXEsIHN0ZDo6bW92
ZShhc3luY19yZXNwb25zZSkpOworfQorCit2b2lkIENvbnN1bWVySVBDQ2xpZW50SW1wbDo6RGlz
YWJsZVRyYWNpbmcoKSB7CisgIGlmICghY29ubmVjdGVkXykgeworICAgIFBFUkZFVFRPX0RMT0co
IkNhbm5vdCBEaXNhYmxlVHJhY2luZygpLCBub3QgY29ubmVjdGVkIHRvIHRyYWNpbmcgc2Vydmlj
ZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlwYzo6RGVmZXJyZWQ8cHJvdG9zOjpnZW46OkRp
c2FibGVUcmFjaW5nUmVzcG9uc2U+IGFzeW5jX3Jlc3BvbnNlOworICBhc3luY19yZXNwb25zZS5C
aW5kKAorICAgICAgW10oaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6RGlzYWJsZVRyYWNp
bmdSZXNwb25zZT4gcmVzcG9uc2UpIHsKKyAgICAgICAgaWYgKCFyZXNwb25zZSkKKyAgICAgICAg
ICBQRVJGRVRUT19ETE9HKCJEaXNhYmxlVHJhY2luZygpIGZhaWxlZCIpOworICAgICAgfSk7Cisg
IGNvbnN1bWVyX3BvcnRfLkRpc2FibGVUcmFjaW5nKHByb3Rvczo6Z2VuOjpEaXNhYmxlVHJhY2lu
Z1JlcXVlc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGFz
eW5jX3Jlc3BvbnNlKSk7Cit9CisKK3ZvaWQgQ29uc3VtZXJJUENDbGllbnRJbXBsOjpSZWFkQnVm
ZmVycygpIHsKKyAgaWYgKCFjb25uZWN0ZWRfKSB7CisgICAgUEVSRkVUVE9fRExPRygiQ2Fubm90
IFJlYWRCdWZmZXJzKCksIG5vdCBjb25uZWN0ZWQgdG8gdHJhY2luZyBzZXJ2aWNlIik7CisgICAg
cmV0dXJuOworICB9CisKKyAgaXBjOjpEZWZlcnJlZDxwcm90b3M6Omdlbjo6UmVhZEJ1ZmZlcnNS
ZXNwb25zZT4gYXN5bmNfcmVzcG9uc2U7CisKKyAgLy8gVGhlIElQQyBsYXllciBndWFyYW50ZWVz
IHRoYXQgY2FsbGJhY2tzIGFyZSBkZXN0cm95ZWQgYWZ0ZXIgdGhpcyBvYmplY3QKKyAgLy8gaXMg
ZGVzdHJveWVkIChieSB2aXJ0dWUgb2YgZGVzdHJveWluZyB0aGUgfGNvbnN1bWVyX3BvcnRffCku
IEluIHR1cm4gdGhlCisgIC8vIGNvbnRyYWN0IG9mIHRoaXMgY2xhc3MgZXhwZWN0cyB0aGUgY2Fs
bGVyIHRvIG5vdCBkZXN0cm95IHRoZSBDb25zdW1lciBjbGFzcworICAvLyBiZWZvcmUgaGF2aW5n
IGRlc3Ryb3llZCB0aGlzIGNsYXNzLiBIZW5jZSBiaW5kaW5nIHx0aGlzfCBoZXJlIGlzIHNhZmUu
CisgIGFzeW5jX3Jlc3BvbnNlLkJpbmQoCisgICAgICBbdGhpc10oaXBjOjpBc3luY1Jlc3VsdDxw
cm90b3M6Omdlbjo6UmVhZEJ1ZmZlcnNSZXNwb25zZT4gcmVzcG9uc2UpIHsKKyAgICAgICAgT25S
ZWFkQnVmZmVyc1Jlc3BvbnNlKHN0ZDo6bW92ZShyZXNwb25zZSkpOworICAgICAgfSk7CisgIGNv
bnN1bWVyX3BvcnRfLlJlYWRCdWZmZXJzKHByb3Rvczo6Z2VuOjpSZWFkQnVmZmVyc1JlcXVlc3Qo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGFzeW5jX3Jlc3BvbnNl
KSk7Cit9CisKK3ZvaWQgQ29uc3VtZXJJUENDbGllbnRJbXBsOjpPblJlYWRCdWZmZXJzUmVzcG9u
c2UoCisgICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6UmVhZEJ1ZmZlcnNSZXNwb25z
ZT4gcmVzcG9uc2UpIHsKKyAgaWYgKCFyZXNwb25zZSkgeworICAgIFBFUkZFVFRPX0RMT0coIlJl
YWRCdWZmZXJzKCkgZmFpbGVkIik7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6dmVjdG9yPFRy
YWNlUGFja2V0PiB0cmFjZV9wYWNrZXRzOworICBmb3IgKGF1dG8mIHJlc3Bfc2xpY2UgOiByZXNw
b25zZS0+c2xpY2VzKCkpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2xpY2VfZGF0YSA9IHJl
c3Bfc2xpY2UuZGF0YSgpOworICAgIFNsaWNlIHNsaWNlID0gU2xpY2U6OkFsbG9jYXRlKHNsaWNl
X2RhdGEuc2l6ZSgpKTsKKyAgICBtZW1jcHkoc2xpY2Uub3duX2RhdGEoKSwgc2xpY2VfZGF0YS5k
YXRhKCksIHNsaWNlLnNpemUpOworICAgIHBhcnRpYWxfcGFja2V0Xy5BZGRTbGljZShzdGQ6Om1v
dmUoc2xpY2UpKTsKKyAgICBpZiAocmVzcF9zbGljZS5sYXN0X3NsaWNlX2Zvcl9wYWNrZXQoKSkK
KyAgICAgIHRyYWNlX3BhY2tldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShwYXJ0aWFsX3BhY2tl
dF8pKTsKKyAgfQorICBpZiAoIXRyYWNlX3BhY2tldHMuZW1wdHkoKSB8fCAhcmVzcG9uc2UuaGFz
X21vcmUoKSkKKyAgICBjb25zdW1lcl8tPk9uVHJhY2VEYXRhKHN0ZDo6bW92ZSh0cmFjZV9wYWNr
ZXRzKSwgcmVzcG9uc2UuaGFzX21vcmUoKSk7Cit9CisKK3ZvaWQgQ29uc3VtZXJJUENDbGllbnRJ
bXBsOjpPbkVuYWJsZVRyYWNpbmdSZXNwb25zZSgKKyAgICBpcGM6OkFzeW5jUmVzdWx0PHByb3Rv
czo6Z2VuOjpFbmFibGVUcmFjaW5nUmVzcG9uc2U+IHJlc3BvbnNlKSB7CisgIGlmICghcmVzcG9u
c2UgfHwgcmVzcG9uc2UtPmRpc2FibGVkKCkpCisgICAgY29uc3VtZXJfLT5PblRyYWNpbmdEaXNh
YmxlZCgpOworfQorCit2b2lkIENvbnN1bWVySVBDQ2xpZW50SW1wbDo6RnJlZUJ1ZmZlcnMoKSB7
CisgIGlmICghY29ubmVjdGVkXykgeworICAgIFBFUkZFVFRPX0RMT0coIkNhbm5vdCBGcmVlQnVm
ZmVycygpLCBub3QgY29ubmVjdGVkIHRvIHRyYWNpbmcgc2VydmljZSIpOworICAgIHJldHVybjsK
KyAgfQorCisgIHByb3Rvczo6Z2VuOjpGcmVlQnVmZmVyc1JlcXVlc3QgcmVxOworICBpcGM6OkRl
ZmVycmVkPHByb3Rvczo6Z2VuOjpGcmVlQnVmZmVyc1Jlc3BvbnNlPiBhc3luY19yZXNwb25zZTsK
KyAgYXN5bmNfcmVzcG9uc2UuQmluZCgKKyAgICAgIFtdKGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9z
OjpnZW46OkZyZWVCdWZmZXJzUmVzcG9uc2U+IHJlc3BvbnNlKSB7CisgICAgICAgIGlmICghcmVz
cG9uc2UpCisgICAgICAgICAgUEVSRkVUVE9fRExPRygiRnJlZUJ1ZmZlcnMoKSBmYWlsZWQiKTsK
KyAgICAgIH0pOworICBjb25zdW1lcl9wb3J0Xy5GcmVlQnVmZmVycyhyZXEsIHN0ZDo6bW92ZShh
c3luY19yZXNwb25zZSkpOworfQorCit2b2lkIENvbnN1bWVySVBDQ2xpZW50SW1wbDo6Rmx1c2go
dWludDMyX3QgdGltZW91dF9tcywgRmx1c2hDYWxsYmFjayBjYWxsYmFjaykgeworICBpZiAoIWNv
bm5lY3RlZF8pIHsKKyAgICBQRVJGRVRUT19ETE9HKCJDYW5ub3QgRmx1c2goKSwgbm90IGNvbm5l
Y3RlZCB0byB0cmFjaW5nIHNlcnZpY2UiKTsKKyAgICByZXR1cm4gY2FsbGJhY2soLypzdWNjZXNz
PSovZmFsc2UpOworICB9CisKKyAgcHJvdG9zOjpnZW46OkZsdXNoUmVxdWVzdCByZXE7CisgIHJl
cS5zZXRfdGltZW91dF9tcyhzdGF0aWNfY2FzdDx1aW50MzJfdD4odGltZW91dF9tcykpOworICBp
cGM6OkRlZmVycmVkPHByb3Rvczo6Z2VuOjpGbHVzaFJlc3BvbnNlPiBhc3luY19yZXNwb25zZTsK
KyAgYXN5bmNfcmVzcG9uc2UuQmluZCgKKyAgICAgIFtjYWxsYmFja10oaXBjOjpBc3luY1Jlc3Vs
dDxwcm90b3M6Omdlbjo6Rmx1c2hSZXNwb25zZT4gcmVzcG9uc2UpIHsKKyAgICAgICAgY2FsbGJh
Y2soISFyZXNwb25zZSk7CisgICAgICB9KTsKKyAgY29uc3VtZXJfcG9ydF8uRmx1c2gocmVxLCBz
dGQ6Om1vdmUoYXN5bmNfcmVzcG9uc2UpKTsKK30KKwordm9pZCBDb25zdW1lcklQQ0NsaWVudElt
cGw6OkRldGFjaChjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7CisgIGlmICghY29ubmVjdGVkXykg
eworICAgIFBFUkZFVFRPX0RMT0coIkNhbm5vdCBEZXRhY2goKSwgbm90IGNvbm5lY3RlZCB0byB0
cmFjaW5nIHNlcnZpY2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90b3M6Omdlbjo6RGV0
YWNoUmVxdWVzdCByZXE7CisgIHJlcS5zZXRfa2V5KGtleSk7CisgIGlwYzo6RGVmZXJyZWQ8cHJv
dG9zOjpnZW46OkRldGFjaFJlc3BvbnNlPiBhc3luY19yZXNwb25zZTsKKyAgYXV0byB3ZWFrX3Ro
aXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisKKyAgYXN5bmNfcmVzcG9uc2Uu
QmluZCgKKyAgICAgIFt3ZWFrX3RoaXNdKGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OkRl
dGFjaFJlc3BvbnNlPiByZXNwb25zZSkgeworICAgICAgICBpZiAod2Vha190aGlzKQorICAgICAg
ICAgIHdlYWtfdGhpcy0+Y29uc3VtZXJfLT5PbkRldGFjaCghIXJlc3BvbnNlKTsKKyAgICAgIH0p
OworICBjb25zdW1lcl9wb3J0Xy5EZXRhY2gocmVxLCBzdGQ6Om1vdmUoYXN5bmNfcmVzcG9uc2Up
KTsKK30KKwordm9pZCBDb25zdW1lcklQQ0NsaWVudEltcGw6OkF0dGFjaChjb25zdCBzdGQ6OnN0
cmluZyYga2V5KSB7CisgIGlmICghY29ubmVjdGVkXykgeworICAgIFBFUkZFVFRPX0RMT0coIkNh
bm5vdCBBdHRhY2goKSwgbm90IGNvbm5lY3RlZCB0byB0cmFjaW5nIHNlcnZpY2UiKTsKKyAgICBy
ZXR1cm47CisgIH0KKworICB7CisgICAgcHJvdG9zOjpnZW46OkF0dGFjaFJlcXVlc3QgcmVxOwor
ICAgIHJlcS5zZXRfa2V5KGtleSk7CisgICAgaXBjOjpEZWZlcnJlZDxwcm90b3M6Omdlbjo6QXR0
YWNoUmVzcG9uc2U+IGFzeW5jX3Jlc3BvbnNlOworICAgIGF1dG8gd2Vha190aGlzID0gd2Vha19w
dHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOworCisgICAgYXN5bmNfcmVzcG9uc2UuQmluZCgKKyAg
ICAgICAgW3dlYWtfdGhpc10oaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6QXR0YWNoUmVz
cG9uc2U+IHJlc3BvbnNlKSB7CisgICAgICAgICAgaWYgKCF3ZWFrX3RoaXMpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgaWYgKCFyZXNwb25zZSkgeworICAgICAgICAgICAgd2Vha190
aGlzLT5jb25zdW1lcl8tPk9uQXR0YWNoKC8qc3VjY2Vzcz0qL2ZhbHNlLCBUcmFjZUNvbmZpZygp
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgY29uc3QgVHJh
Y2VDb25maWcmIHRyYWNlX2NvbmZpZyA9IHJlc3BvbnNlLT50cmFjZV9jb25maWcoKTsKKworICAg
ICAgICAgIC8vIElmIGF0dGFjaGVkIHN1Y2Nlc2Z1bGx5LCBhbHNvIGF0dGFjaCB0byB0aGUgZW5k
LW9mLXRyYWNlCisgICAgICAgICAgLy8gbm90aWZpY2F0b24gY2FsbGJhY2ssIHZpYSBFbmFibGVU
cmFjaW5nKGF0dGFjaF9ub3RpZmljYXRpb25fb25seSkuCisgICAgICAgICAgcHJvdG9zOjpnZW46
OkVuYWJsZVRyYWNpbmdSZXF1ZXN0IGVuYWJsZV9yZXE7CisgICAgICAgICAgZW5hYmxlX3JlcS5z
ZXRfYXR0YWNoX25vdGlmaWNhdGlvbl9vbmx5KHRydWUpOworICAgICAgICAgIGlwYzo6RGVmZXJy
ZWQ8cHJvdG9zOjpnZW46OkVuYWJsZVRyYWNpbmdSZXNwb25zZT4gZW5hYmxlX3Jlc3A7CisgICAg
ICAgICAgZW5hYmxlX3Jlc3AuQmluZCgKKyAgICAgICAgICAgICAgW3dlYWtfdGhpc10oCisgICAg
ICAgICAgICAgICAgICBpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpFbmFibGVUcmFjaW5n
UmVzcG9uc2U+IHJlc3ApIHsKKyAgICAgICAgICAgICAgICBpZiAod2Vha190aGlzKQorICAgICAg
ICAgICAgICAgICAgd2Vha190aGlzLT5PbkVuYWJsZVRyYWNpbmdSZXNwb25zZShzdGQ6Om1vdmUo
cmVzcCkpOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICB3ZWFrX3RoaXMtPmNvbnN1bWVy
X3BvcnRfLkVuYWJsZVRyYWNpbmcoZW5hYmxlX3JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGVuYWJsZV9yZXNwKSk7CisKKyAg
ICAgICAgICB3ZWFrX3RoaXMtPmNvbnN1bWVyXy0+T25BdHRhY2goLypzdWNjZXNzPSovdHJ1ZSwg
dHJhY2VfY29uZmlnKTsKKyAgICAgICAgfSk7CisgICAgY29uc3VtZXJfcG9ydF8uQXR0YWNoKHJl
cSwgc3RkOjptb3ZlKGFzeW5jX3Jlc3BvbnNlKSk7CisgIH0KK30KKwordm9pZCBDb25zdW1lcklQ
Q0NsaWVudEltcGw6OkdldFRyYWNlU3RhdHMoKSB7CisgIGlmICghY29ubmVjdGVkXykgeworICAg
IFBFUkZFVFRPX0RMT0coIkNhbm5vdCBHZXRUcmFjZVN0YXRzKCksIG5vdCBjb25uZWN0ZWQgdG8g
dHJhY2luZyBzZXJ2aWNlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJvdG9zOjpnZW46Okdl
dFRyYWNlU3RhdHNSZXF1ZXN0IHJlcTsKKyAgaXBjOjpEZWZlcnJlZDxwcm90b3M6Omdlbjo6R2V0
VHJhY2VTdGF0c1Jlc3BvbnNlPiBhc3luY19yZXNwb25zZTsKKworICAvLyBUaGUgSVBDIGxheWVy
IGd1YXJhbnRlZXMgdGhhdCBjYWxsYmFja3MgYXJlIGRlc3Ryb3llZCBhZnRlciB0aGlzIG9iamVj
dAorICAvLyBpcyBkZXN0cm95ZWQgKGJ5IHZpcnR1ZSBvZiBkZXN0cm95aW5nIHRoZSB8Y29uc3Vt
ZXJfcG9ydF98KS4gSW4gdHVybiB0aGUKKyAgLy8gY29udHJhY3Qgb2YgdGhpcyBjbGFzcyBleHBl
Y3RzIHRoZSBjYWxsZXIgdG8gbm90IGRlc3Ryb3kgdGhlIENvbnN1bWVyIGNsYXNzCisgIC8vIGJl
Zm9yZSBoYXZpbmcgZGVzdHJveWVkIHRoaXMgY2xhc3MuIEhlbmNlIGJpbmRpbmcgfHRoaXN8IGhl
cmUgaXMgc2FmZS4KKyAgYXN5bmNfcmVzcG9uc2UuQmluZCgKKyAgICAgIFt0aGlzXShpcGM6OkFz
eW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpHZXRUcmFjZVN0YXRzUmVzcG9uc2U+IHJlc3BvbnNlKSB7
CisgICAgICAgIGlmICghcmVzcG9uc2UpIHsKKyAgICAgICAgICBjb25zdW1lcl8tPk9uVHJhY2VT
dGF0cygvKnN1Y2Nlc3M9Ki9mYWxzZSwgVHJhY2VTdGF0cygpKTsKKyAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZXJfLT5PblRyYWNlU3RhdHMoLypzdWNjZXNzPSov
dHJ1ZSwgcmVzcG9uc2UtPnRyYWNlX3N0YXRzKCkpOworICAgICAgfSk7CisgIGNvbnN1bWVyX3Bv
cnRfLkdldFRyYWNlU3RhdHMocmVxLCBzdGQ6Om1vdmUoYXN5bmNfcmVzcG9uc2UpKTsKK30KKwor
dm9pZCBDb25zdW1lcklQQ0NsaWVudEltcGw6Ok9ic2VydmVFdmVudHModWludDMyX3QgZW5hYmxl
ZF9ldmVudF90eXBlcykgeworICBpZiAoIWNvbm5lY3RlZF8pIHsKKyAgICBQRVJGRVRUT19ETE9H
KCJDYW5ub3QgT2JzZXJ2ZUV2ZW50cygpLCBub3QgY29ubmVjdGVkIHRvIHRyYWNpbmcgc2Vydmlj
ZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHByb3Rvczo6Z2VuOjpPYnNlcnZlRXZlbnRzUmVx
dWVzdCByZXE7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgY29u
c3QgdWludDMyX3QgZXZlbnRfaWQgPSAxdSA8PCBpOworICAgIGlmIChlbmFibGVkX2V2ZW50X3R5
cGVzICYgZXZlbnRfaWQpCisgICAgICByZXEuYWRkX2V2ZW50c190b19vYnNlcnZlKHN0YXRpY19j
YXN0PE9ic2VydmFibGVFdmVudHM6OlR5cGU+KGV2ZW50X2lkKSk7CisgIH0KKworICBpcGM6OkRl
ZmVycmVkPHByb3Rvczo6Z2VuOjpPYnNlcnZlRXZlbnRzUmVzcG9uc2U+IGFzeW5jX3Jlc3BvbnNl
OworICAvLyBUaGUgSVBDIGxheWVyIGd1YXJhbnRlZXMgdGhhdCBjYWxsYmFja3MgYXJlIGRlc3Ry
b3llZCBhZnRlciB0aGlzIG9iamVjdAorICAvLyBpcyBkZXN0cm95ZWQgKGJ5IHZpcnR1ZSBvZiBk
ZXN0cm95aW5nIHRoZSB8Y29uc3VtZXJfcG9ydF98KS4gSW4gdHVybiB0aGUKKyAgLy8gY29udHJh
Y3Qgb2YgdGhpcyBjbGFzcyBleHBlY3RzIHRoZSBjYWxsZXIgdG8gbm90IGRlc3Ryb3kgdGhlIENv
bnN1bWVyIGNsYXNzCisgIC8vIGJlZm9yZSBoYXZpbmcgZGVzdHJveWVkIHRoaXMgY2xhc3MuIEhl
bmNlIGJpbmRpbmcgfHRoaXN8IGhlcmUgaXMgc2FmZS4KKyAgYXN5bmNfcmVzcG9uc2UuQmluZCgK
KyAgICAgIFt0aGlzXShpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpPYnNlcnZlRXZlbnRz
UmVzcG9uc2U+IHJlc3BvbnNlKSB7CisgICAgICAgIC8vIFNraXAgZW1wdHkgcmVzcG9uc2UsIHdo
aWNoIHRoZSBzZXJ2aWNlIHNlbmRzIHRvIGNsb3NlIHRoZSBzdHJlYW0uCisgICAgICAgIGlmICgh
cmVzcG9uc2UuaGFzX21vcmUoKSkgeworICAgICAgICAgIFBFUkZFVFRPX0RDSEVDSyghcmVzcG9u
c2UtPmV2ZW50cygpLmluc3RhbmNlX3N0YXRlX2NoYW5nZXMoKS5zaXplKCkpOworICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lcl8tPk9uT2JzZXJ2YWJsZUV2ZW50
cyhyZXNwb25zZS0+ZXZlbnRzKCkpOworICAgICAgfSk7CisgIGNvbnN1bWVyX3BvcnRfLk9ic2Vy
dmVFdmVudHMocmVxLCBzdGQ6Om1vdmUoYXN5bmNfcmVzcG9uc2UpKTsKK30KKwordm9pZCBDb25z
dW1lcklQQ0NsaWVudEltcGw6OlF1ZXJ5U2VydmljZVN0YXRlKAorICAgIFF1ZXJ5U2VydmljZVN0
YXRlQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgaWYgKCFjb25uZWN0ZWRfKSB7CisgICAgUEVSRkVU
VE9fRExPRygKKyAgICAgICAgIkNhbm5vdCBRdWVyeVNlcnZpY2VTdGF0ZSgpLCBub3QgY29ubmVj
dGVkIHRvIHRyYWNpbmcgc2VydmljZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGF1dG8gaXQg
PSBwZW5kaW5nX3F1ZXJ5X3N2Y19yZXFzXy5pbnNlcnQocGVuZGluZ19xdWVyeV9zdmNfcmVxc18u
ZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0ZDo6
bW92ZShjYWxsYmFjayksIHt9fSk7CisgIHByb3Rvczo6Z2VuOjpRdWVyeVNlcnZpY2VTdGF0ZVJl
cXVlc3QgcmVxOworICBpcGM6OkRlZmVycmVkPHByb3Rvczo6Z2VuOjpRdWVyeVNlcnZpY2VTdGF0
ZVJlc3BvbnNlPiBhc3luY19yZXNwb25zZTsKKyAgYXV0byB3ZWFrX3RoaXMgPSB3ZWFrX3B0cl9m
YWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIGFzeW5jX3Jlc3BvbnNlLkJpbmQoCisgICAgICBbd2Vh
a190aGlzLAorICAgICAgIGl0XShpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpRdWVyeVNl
cnZpY2VTdGF0ZVJlc3BvbnNlPiByZXNwb25zZSkgeworICAgICAgICBpZiAod2Vha190aGlzKQor
ICAgICAgICAgIHdlYWtfdGhpcy0+T25RdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlKHN0ZDo6bW92
ZShyZXNwb25zZSksIGl0KTsKKyAgICAgIH0pOworICBjb25zdW1lcl9wb3J0Xy5RdWVyeVNlcnZp
Y2VTdGF0ZShyZXEsIHN0ZDo6bW92ZShhc3luY19yZXNwb25zZSkpOworfQorCit2b2lkIENvbnN1
bWVySVBDQ2xpZW50SW1wbDo6T25RdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlKAorICAgIGlwYzo6
QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OlF1ZXJ5U2VydmljZVN0YXRlUmVzcG9uc2U+IHJlc3Bv
bnNlLAorICAgIFBlbmRpbmdRdWVyeVNlcnZpY2VSZXF1ZXN0czo6aXRlcmF0b3IgcmVxX2l0KSB7
CisgIFBFUkZFVFRPX0RDSEVDSyhyZXFfaXQtPmNhbGxiYWNrKTsKKworICBpZiAoIXJlc3BvbnNl
KSB7CisgICAgYXV0byBjYWxsYmFjayA9IHN0ZDo6bW92ZShyZXFfaXQtPmNhbGxiYWNrKTsKKyAg
ICBwZW5kaW5nX3F1ZXJ5X3N2Y19yZXFzXy5lcmFzZShyZXFfaXQpOworICAgIGNhbGxiYWNrKGZh
bHNlLCBUcmFjaW5nU2VydmljZVN0YXRlKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRo
ZSBRdWVyeVNlcnZpY2VTdGF0ZSByZXNwb25zZSBjYW4gYmUgc3BsaXQgaW4gc2V2ZXJhbCBjaHVu
a3MgaWYgdGhlCisgIC8vIHNlcnZpY2UgaGFzIHNldmVyYWwgZGF0YSBzb3VyY2VzLiBUaGUgY2xp
ZW50IGlzIHN1cHBvc2VkIHRvIG1lcmdlIGFsbCB0aGUKKyAgLy8gcmVwbGllcy4gVGhlIGVhc2ll
c3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byByZS1zZXJpYWxpemUgdGhlIHBhcnRpYWwKKyAg
Ly8gcmVzcG9uc2UgYW5kIHRoZW4gcmUtZGVjb2RlIHRoZSBtZXJnZWQgcmVzdWx0IGluIG9uZSBz
aG90LgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWVyZ2VkX3Jlc3AgPSByZXFfaXQtPm1lcmdl
ZF9yZXNwOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJ0ID0gcmVzcG9uc2UtPnNlcnZpY2Vf
c3RhdGUoKS5TZXJpYWxpemVBc0FycmF5KCk7CisgIG1lcmdlZF9yZXNwLmluc2VydChtZXJnZWRf
cmVzcC5lbmQoKSwgcGFydC5iZWdpbigpLCBwYXJ0LmVuZCgpKTsKKworICBpZiAocmVzcG9uc2Uu
aGFzX21vcmUoKSkKKyAgICByZXR1cm47CisKKyAgLy8gQWxsIHJlcGxpZXMgaGF2ZSBiZWVuIHJl
Y2VpdmVkLiBEZWNvZGUgdGhlIG1lcmdlZCByZXN1bHQgYW5kIHJlcGx5IHRvIHRoZQorICAvLyBj
YWxsYmFjay4KKyAgcHJvdG9zOjpnZW46OlRyYWNpbmdTZXJ2aWNlU3RhdGUgc3ZjX3N0YXRlOwor
ICBib29sIG9rID0gc3ZjX3N0YXRlLlBhcnNlRnJvbUFycmF5KG1lcmdlZF9yZXNwLmRhdGEoKSwg
bWVyZ2VkX3Jlc3Auc2l6ZSgpKTsKKyAgaWYgKCFvaykKKyAgICBQRVJGRVRUT19FTE9HKCJGYWls
ZWQgdG8gZGVjb2RlIG1lcmdlZCBRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlIik7CisgIGF1dG8g
Y2FsbGJhY2sgPSBzdGQ6Om1vdmUocmVxX2l0LT5jYWxsYmFjayk7CisgIHBlbmRpbmdfcXVlcnlf
c3ZjX3JlcXNfLmVyYXNlKHJlcV9pdCk7CisgIGNhbGxiYWNrKG9rLCBzdGQ6Om1vdmUoc3ZjX3N0
YXRlKSk7Cit9CisKK3ZvaWQgQ29uc3VtZXJJUENDbGllbnRJbXBsOjpRdWVyeUNhcGFiaWxpdGll
cygKKyAgICBRdWVyeUNhcGFiaWxpdGllc0NhbGxiYWNrIGNhbGxiYWNrKSB7CisgIGlmICghY29u
bmVjdGVkXykgeworICAgIFBFUkZFVFRPX0RMT0coCisgICAgICAgICJDYW5ub3QgUXVlcnlDYXBh
YmlsaXRpZXMoKSwgbm90IGNvbm5lY3RlZCB0byB0cmFjaW5nIHNlcnZpY2UiKTsKKyAgICByZXR1
cm47CisgIH0KKworICBwcm90b3M6Omdlbjo6UXVlcnlDYXBhYmlsaXRpZXNSZXF1ZXN0IHJlcTsK
KyAgaXBjOjpEZWZlcnJlZDxwcm90b3M6Omdlbjo6UXVlcnlDYXBhYmlsaXRpZXNSZXNwb25zZT4g
YXN5bmNfcmVzcG9uc2U7CisgIGFzeW5jX3Jlc3BvbnNlLkJpbmQoCisgICAgICBbY2FsbGJhY2td
KAorICAgICAgICAgIGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OlF1ZXJ5Q2FwYWJpbGl0
aWVzUmVzcG9uc2U+IHJlc3BvbnNlKSB7CisgICAgICAgIGlmICghcmVzcG9uc2UpIHsKKyAgICAg
ICAgICAvLyBJZiB0aGUgSVBDIGZhaWxzLCB3ZSBhcmUgdGFsa2luZyB0byBhbiBvbGRlciB2ZXJz
aW9uIG9mIHRoZSBzZXJ2aWNlCisgICAgICAgICAgLy8gdGhhdCBkaWRuJ3Qgc3VwcG9ydCBRdWVy
eUNhcGFiaWxpdGllcyBhdCBhbGwuIEluIHRoaXMgY2FzZSByZXR1cm4KKyAgICAgICAgICAvLyBh
biBlbXB0eSBjYXBhYmlsaXRpZXMgbWVzc2FnZS4KKyAgICAgICAgICBjYWxsYmFjayhUcmFjaW5n
U2VydmljZUNhcGFiaWxpdGllcygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjYWxs
YmFjayhyZXNwb25zZS0+Y2FwYWJpbGl0aWVzKCkpOworICAgICAgICB9CisgICAgICB9KTsKKyAg
Y29uc3VtZXJfcG9ydF8uUXVlcnlDYXBhYmlsaXRpZXMocmVxLCBzdGQ6Om1vdmUoYXN5bmNfcmVz
cG9uc2UpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gc291cmNlOiBzcmMvdHJhY2luZy9pcGMvcHJvZHVjZXIvcHJvZHVjZXJfaXBjX2Ns
aWVudF9pbXBsLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBzcmMvdHJhY2lu
Zy9pcGMvcHJvZHVjZXIvcHJvZHVjZXJfaXBjX2NsaWVudF9pbXBsLmgKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vZXh0L3RyYWNpbmcvaXBjL3Byb2R1
Y2VyX2lwY19jbGllbnQuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBP
cGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNl
bnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhp
cyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5
IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cu
YXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBi
eSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRp
c3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIg
QkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwg
ZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNw
ZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25z
IHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRf
VFJBQ0lOR19JUENfUFJPRFVDRVJfSVBDX0NMSUVOVF9IXworI2RlZmluZSBJTkNMVURFX1BFUkZF
VFRPX0VYVF9UUkFDSU5HX0lQQ19QUk9EVUNFUl9JUENfQ0xJRU5UX0hfCisKKyNpbmNsdWRlIDxt
ZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQv
dHJhY2luZy9jb3JlL3NoYXJlZF9tZW1vcnlfYXJiaXRlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS90cmFjaW5nX3Nl
cnZpY2UuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworY2xhc3MgUHJvZHVjZXI7CisKKy8v
IEFsbG93cyB0byBjb25uZWN0IHRvIGEgcmVtb3RlIFNlcnZpY2UgdGhyb3VnaCBhIFVOSVggZG9t
YWluIHNvY2tldC4KKy8vIEV4cG9zZWQgdG86CisvLyAgIFByb2R1Y2VyKHMpIG9mIHRoZSB0cmFj
aW5nIGxpYnJhcnkuCisvLyBJbXBsZW1lbnRlZCBpbjoKKy8vICAgc3JjL3RyYWNpbmcvaXBjL3By
b2R1Y2VyL3Byb2R1Y2VyX2lwY19jbGllbnRfaW1wbC5jYworY2xhc3MgUEVSRkVUVE9fRVhQT1JU
IFByb2R1Y2VySVBDQ2xpZW50IHsKKyBwdWJsaWM6CisgIC8vIENvbm5lY3RzIHRvIHRoZSBwcm9k
dWNlciBwb3J0IG9mIHRoZSBTZXJ2aWNlIGxpc3RlbmluZyBvbiB0aGUgZ2l2ZW4KKyAgLy8gfHNl
cnZpY2Vfc29ja19uYW1lfC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIE9u
Q29ubmVjdCgpCisgIC8vIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgYXN5bmNocm9ub3VzbHkgb24g
dGhlIHBhc3NlZCBQcm9kdWNlciBpbnRlcmZhY2UuIElmCisgIC8vIHRoZSBjb25uZWN0aW9uIGZh
aWxzLCBPbkRpc2Nvbm5lY3QoKSB3aWxsIGJlIGludm9rZWQgaW5zdGVhZC4gVGhlIHJldHVybmVk
CisgIC8vIFByb2R1Y2VyRW5kcG9pbnQgc2VydmVzIGFsc28gdG8gZGVsaW1pdCB0aGUgc2NvcGUg
b2YgdGhlIGNhbGxiYWNrcyBpbnZva2VkCisgIC8vIG9uIHRoZSBQcm9kdWNlciBpbnRlcmZhY2U6
IG5vIG1vcmUgUHJvZHVjZXIgY2FsbGJhY2tzIGFyZSBpbnZva2VkCisgIC8vIGltbWVkaWF0ZWx5
IGFmdGVyIGl0cyBkZXN0cnVjdGlvbiBhbmQgYW55IHBlbmRpbmcgY2FsbGJhY2sgd2lsbCBiZSBk
cm9wcGVkLgorICAvLyBUbyBwcm92aWRlIGEgcHJvZHVjZXItYWxsb2NhdGVkIHNoYXJlZCBtZW1v
cnkgYnVmZmVyLCBib3RoIHxzaG18IGFuZAorICAvLyB8c2htX2FyYml0ZXJ8IHNob3VsZCBiZSBz
ZXQuIHxzaG1fYXJiaXRlcnwgc2hvdWxkIGJlIGFuIHVuYm91bmQKKyAgLy8gU2hhcmVkTWVtb3J5
QXJiaXRlciBpbnN0YW5jZS4gV2hlbiB8c2htfCBhbmQgfHNobV9hcmJpdGVyfCBhcmUgcHJvdmlk
ZWQsCisgIC8vIHRoZSBzZXJ2aWNlIHdpbGwgYXR0ZW1wdCB0byBhZG9wdCB0aGUgcHJvdmlkZWQg
U01CLiBJZiB0aGlzIGZhaWxzLCB0aGUKKyAgLy8gUHJvZHVjZXJFbmRwb2ludCB3aWxsIGRpc2Nv
bm5lY3QsIGJ1dCB0aGUgU01CIGFuZCBhcmJpdGVyIHdpbGwgcmVtYWluIHZhbGlkCisgIC8vIHVu
dGlsIHRoZSBjbGllbnQgaXMgZGVzdHJveWVkLgorICAvLworICAvLyBUT0RPKGVzZWNrbGVyKTog
U3VwcG9ydCBhZG9wdGlvbiBmYWlsdXJlIG1vcmUgZ3JhY2VmdWxseS4KKyAgc3RhdGljIHN0ZDo6
dW5pcXVlX3B0cjxUcmFjaW5nU2VydmljZTo6UHJvZHVjZXJFbmRwb2ludD4gQ29ubmVjdCgKKyAg
ICAgIGNvbnN0IGNoYXIqIHNlcnZpY2Vfc29ja19uYW1lLAorICAgICAgUHJvZHVjZXIqLAorICAg
ICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2R1Y2VyX25hbWUsCisgICAgICBiYXNlOjpUYXNrUnVu
bmVyKiwKKyAgICAgIFRyYWNpbmdTZXJ2aWNlOjpQcm9kdWNlclNNQlNjcmFwaW5nTW9kZSBzbWJf
c2NyYXBpbmdfbW9kZSA9CisgICAgICAgICAgVHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyU01CU2Ny
YXBpbmdNb2RlOjprRGVmYXVsdCwKKyAgICAgIHNpemVfdCBzaGFyZWRfbWVtb3J5X3NpemVfaGlu
dF9ieXRlcyA9IDAsCisgICAgICBzaXplX3Qgc2hhcmVkX21lbW9yeV9wYWdlX3NpemVfaGludF9i
eXRlcyA9IDAsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5PiBzaG0gPSBudWxs
cHRyLAorICAgICAgc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeUFyYml0ZXI+IHNobV9hcmJp
dGVyID0gbnVsbHB0cik7CisKKyBwcm90ZWN0ZWQ6CisgIFByb2R1Y2VySVBDQ2xpZW50KCkgPSBk
ZWxldGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNM
VURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0lQQ19QUk9EVUNFUl9JUENfQ0xJRU5UX0hfCisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAq
CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg
IkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs
aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg
TGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJ
Q0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFn
cmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp
Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FS
UkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBs
aWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu
aW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisg
Ki8KKworI2lmbmRlZiBTUkNfVFJBQ0lOR19JUENfUFJPRFVDRVJfUFJPRFVDRVJfSVBDX0NMSUVO
VF9JTVBMX0hfCisjZGVmaW5lIFNSQ19UUkFDSU5HX0lQQ19QUk9EVUNFUl9QUk9EVUNFUl9JUENf
Q0xJRU5UX0lNUExfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8c2V0Pgor
I2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L2Jhc2UvdGhyZWFkX2NoZWNrZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvc2VydmljZV9wcm94eS5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNp
bmcvY29yZS9iYXNpY190eXBlcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9zaGFyZWRfbWVtb3J5LmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3Jl
L3RyYWNpbmdfc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvaXBjL3Byb2R1Y2VyX2lwY19jbGllbnQuaCIKKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2lwYy9w
cm9kdWNlcl9wb3J0LmlwYy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCituYW1lc3BhY2Ug
YmFzZSB7CitjbGFzcyBUYXNrUnVubmVyOworfSAgLy8gbmFtZXNwYWNlIGJhc2UKKworbmFtZXNw
YWNlIGlwYyB7CitjbGFzcyBDbGllbnQ7Cit9ICAvLyBuYW1lc3BhY2UgaXBjCisKK2NsYXNzIFBy
b2R1Y2VyOworY2xhc3MgU2hhcmVkTWVtb3J5QXJiaXRlcjsKKworLy8gRXhwb3NlcyBhIFNlcnZp
Y2UgZW5kcG9pbnQgdG8gUHJvZHVjZXIocyksIHByb3h5aW5nIGFsbCByZXF1ZXN0cyB0aHJvdWdo
IGEKKy8vIElQQyBjaGFubmVsIHRvIHRoZSByZW1vdGUgU2VydmljZS4gVGhpcyBjbGFzcyBpcyB0
aGUgZ2x1ZSBsYXllciBiZXR3ZWVuIHRoZQorLy8gZ2VuZXJpYyBTZXJ2aWNlIGludGVyZmFjZSBl
eHBvc2VkIHRvIHRoZSBjbGllbnRzIG9mIHRoZSBsaWJyYXJ5IGFuZCB0aGUKKy8vIGFjdHVhbCBJ
UEMgdHJhbnNwb3J0LgorY2xhc3MgUHJvZHVjZXJJUENDbGllbnRJbXBsIDogcHVibGljIFRyYWNp
bmdTZXJ2aWNlOjpQcm9kdWNlckVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcHVibGljIGlwYzo6U2VydmljZVByb3h5OjpFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6Cisg
IFByb2R1Y2VySVBDQ2xpZW50SW1wbCgKKyAgICAgIGNvbnN0IGNoYXIqIHNlcnZpY2Vfc29ja19u
YW1lLAorICAgICAgUHJvZHVjZXIqLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2R1Y2Vy
X25hbWUsCisgICAgICBiYXNlOjpUYXNrUnVubmVyKiwKKyAgICAgIFRyYWNpbmdTZXJ2aWNlOjpQ
cm9kdWNlclNNQlNjcmFwaW5nTW9kZSwKKyAgICAgIHNpemVfdCBzaGFyZWRfbWVtb3J5X3NpemVf
aGludF9ieXRlcyA9IDAsCisgICAgICBzaXplX3Qgc2hhcmVkX21lbW9yeV9wYWdlX3NpemVfaGlu
dF9ieXRlcyA9IDAsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5PiBzaG0gPSBu
dWxscHRyLAorICAgICAgc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeUFyYml0ZXI+IHNobV9h
cmJpdGVyID0gbnVsbHB0cik7CisgIH5Qcm9kdWNlcklQQ0NsaWVudEltcGwoKSBvdmVycmlkZTsK
KworICAvLyBUcmFjaW5nU2VydmljZTo6UHJvZHVjZXJFbmRwb2ludCBpbXBsZW1lbnRhdGlvbi4K
KyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaW52b2tlZCBieSB0aGUgYWN0dWFsIFByb2R1Y2VyKHMp
IGNvZGUgYnkgY2xpZW50cyBvZiB0aGUKKyAgLy8gdHJhY2luZyBsaWJyYXJ5LCB3aGljaCBrbm93
IG5vdGhpbmcgYWJvdXQgdGhlIElQQyB0cmFuc3BvcnQuCisgIHZvaWQgUmVnaXN0ZXJEYXRhU291
cmNlKGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9yJikgb3ZlcnJpZGU7CisgIHZvaWQgVW5yZWdp
c3RlckRhdGFTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIG92ZXJyaWRlOworICB2b2lk
IFJlZ2lzdGVyVHJhY2VXcml0ZXIodWludDMyX3Qgd3JpdGVyX2lkLCB1aW50MzJfdCB0YXJnZXRf
YnVmZmVyKSBvdmVycmlkZTsKKyAgdm9pZCBVbnJlZ2lzdGVyVHJhY2VXcml0ZXIodWludDMyX3Qg
d3JpdGVyX2lkKSBvdmVycmlkZTsKKyAgdm9pZCBDb21taXREYXRhKGNvbnN0IENvbW1pdERhdGFS
ZXF1ZXN0JiwgQ29tbWl0RGF0YUNhbGxiYWNrKSBvdmVycmlkZTsKKyAgdm9pZCBOb3RpZnlEYXRh
U291cmNlU3RhcnRlZChEYXRhU291cmNlSW5zdGFuY2VJRCkgb3ZlcnJpZGU7CisgIHZvaWQgTm90
aWZ5RGF0YVNvdXJjZVN0b3BwZWQoRGF0YVNvdXJjZUluc3RhbmNlSUQpIG92ZXJyaWRlOworICB2
b2lkIEFjdGl2YXRlVHJpZ2dlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Jikgb3Zl
cnJpZGU7CisgIHZvaWQgU3luYyhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY2FsbGJhY2spIG92ZXJy
aWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxUcmFjZVdyaXRlcj4gQ3JlYXRlVHJhY2VXcml0ZXIo
CisgICAgICBCdWZmZXJJRCB0YXJnZXRfYnVmZmVyLAorICAgICAgQnVmZmVyRXhoYXVzdGVkUG9s
aWN5KSBvdmVycmlkZTsKKyAgU2hhcmVkTWVtb3J5QXJiaXRlciogTWF5YmVTaGFyZWRNZW1vcnlB
cmJpdGVyKCkgb3ZlcnJpZGU7CisgIGJvb2wgSXNTaG1lbVByb3ZpZGVkQnlQcm9kdWNlcigpIGNv
bnN0IG92ZXJyaWRlOworICB2b2lkIE5vdGlmeUZsdXNoQ29tcGxldGUoRmx1c2hSZXF1ZXN0SUQp
IG92ZXJyaWRlOworICBTaGFyZWRNZW1vcnkqIHNoYXJlZF9tZW1vcnkoKSBjb25zdCBvdmVycmlk
ZTsKKyAgc2l6ZV90IHNoYXJlZF9idWZmZXJfcGFnZV9zaXplX2tiKCkgY29uc3Qgb3ZlcnJpZGU7
CisKKyAgLy8gaXBjOjpTZXJ2aWNlUHJveHk6OkV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24u
CisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGludm9rZWQgYnkgdGhlIElQQyBsYXllciwgd2hpY2gg
a25vd3Mgbm90aGluZyBhYm91dAorICAvLyB0cmFjaW5nLCBwcm9kdWNlcnMgYW5kIGNvbnN1bWVy
cy4KKyAgdm9pZCBPbkNvbm5lY3QoKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRpc2Nvbm5lY3QoKSBv
dmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vIEludm9rZWQgc29vbiBhZnRlciBoYXZpbmcgZXN0
YWJsaXNoZWQgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmljZS4KKyAgdm9pZCBPbkNvbm5l
Y3Rpb25Jbml0aWFsaXplZChib29sIGNvbm5lY3Rpb25fc3VjY2VlZGVkLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJvb2wgdXNpbmdfc2htZW1fcHJvdmlkZWRfYnlfcHJvZHVjZXIp
OworCisgIC8vIEludm9rZWQgd2hlbiB0aGUgcmVtb3RlIFNlcnZpY2Ugc2VuZHMgYW4gSVBDIHRv
IHRlbGwgdXMgdG8gZG8gc29tZXRoaW5nCisgIC8vIChlLmcuIHN0YXJ0L3N0b3AgYSBkYXRhIHNv
dXJjZSkuCisgIHZvaWQgT25TZXJ2aWNlUmVxdWVzdChjb25zdCBwcm90b3M6Omdlbjo6R2V0QXN5
bmNDb21tYW5kUmVzcG9uc2UmKTsKKworICAvLyBUT0RPIHRoaW5rIHRvIGRlc3RydWN0aW9uIG9y
ZGVyLCBkbyB3ZSByZWx5IG9uIGFueSBzcGVjaWZpYyBkdG9yIHNlcXVlbmNlPworICBQcm9kdWNl
ciogY29uc3QgcHJvZHVjZXJfOworICBiYXNlOjpUYXNrUnVubmVyKiBjb25zdCB0YXNrX3J1bm5l
cl87CisKKyAgLy8gVGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIGNsaWVudCBzb2NrZXQgYW5kIHRh
a2VzIGNhcmUgb2YgSVBDIHRyYWZmaWMuCisgIHN0ZDo6dW5pcXVlX3B0cjxpcGM6OkNsaWVudD4g
aXBjX2NoYW5uZWxfOworCisgIC8vIFRoZSBwcm94eSBpbnRlcmZhY2UgZm9yIHRoZSBwcm9kdWNl
ciBwb3J0IG9mIHRoZSBzZXJ2aWNlLiBJdCBpcyBib3VuZAorICAvLyB0byB8aXBjX2NoYW5uZWxf
fCBhbmQgKGRlKXNlcmlhbGl6ZXMgbWV0aG9kIGludm9jYXRpb25zIG92ZXIgdGhlIHdpcmUuCisg
IHByb3Rvczo6Z2VuOjpQcm9kdWNlclBvcnRQcm94eSBwcm9kdWNlcl9wb3J0XzsKKworICBzdGQ6
OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5PiBzaGFyZWRfbWVtb3J5XzsKKyAgc3RkOjp1bmlxdWVf
cHRyPFNoYXJlZE1lbW9yeUFyYml0ZXI+IHNoYXJlZF9tZW1vcnlfYXJiaXRlcl87CisgIHNpemVf
dCBzaGFyZWRfYnVmZmVyX3BhZ2Vfc2l6ZV9rYl8gPSAwOworICBzdGQ6OnNldDxEYXRhU291cmNl
SW5zdGFuY2VJRD4gZGF0YV9zb3VyY2VzX3NldHVwXzsKKyAgYm9vbCBjb25uZWN0ZWRfID0gZmFs
c2U7CisgIHN0ZDo6c3RyaW5nIGNvbnN0IG5hbWVfOworICBzaXplX3Qgc2hhcmVkX21lbW9yeV9w
YWdlX3NpemVfaGludF9ieXRlc18gPSAwOworICBzaXplX3Qgc2hhcmVkX21lbW9yeV9zaXplX2hp
bnRfYnl0ZXNfID0gMDsKKyAgVHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyU01CU2NyYXBpbmdNb2Rl
IGNvbnN0IHNtYl9zY3JhcGluZ19tb2RlXzsKKyAgYm9vbCBpc19zaG1lbV9wcm92aWRlZF9ieV9w
cm9kdWNlcl8gPSBmYWxzZTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBw
ZW5kaW5nX3N5bmNfcmVxc187CisgIFBFUkZFVFRPX1RIUkVBRF9DSEVDS0VSKHRocmVhZF9jaGVj
a2VyXykKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIFNSQ19U
UkFDSU5HX0lQQ19QUk9EVUNFUl9QUk9EVUNFUl9JUENfQ0xJRU5UX0lNUExfSF8KKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAq
IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGlj
ZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5j
ZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNl
bnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5T
RS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVk
IHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5z
ZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5U
SUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQu
CisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcg
cGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9pcGMv
cHJvZHVjZXIvcHJvZHVjZXJfaXBjX2NsaWVudF9pbXBsLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBl
cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvdGFza19ydW5uZXIuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvY2xpZW50Lmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJh
Y2luZy9jb3JlL2NvbW1pdF9kYXRhX3JlcXVlc3QuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvcHJvZHVjZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5n
L2NvcmUvc2hhcmVkX21lbW9yeV9hcmJpdGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3RyYWNlX3dyaXRlci5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9j
b3JlL2RhdGFfc291cmNlX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2RhdGFfc291cmNlX2Rlc2NyaXB0b3IuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcv
Y29yZS90cmFjZV9jb25maWcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInNyYy90cmFjaW5nL2lwYy9wb3NpeF9zaGFyZWRfbWVtb3J5LmgiCisKKy8vIFRPRE8oZm1h
eWVyKTogdGhpbmsgdG8gd2hhdCBoYXBwZW5zIHdoZW4gUHJvZHVjZXJJUENDbGllbnRJbXBsIGdl
dHMgZGVzdHJveWVkCisvLyB3LnIudC4gdGhlIFByb2R1Y2VyIHBvaW50ZXIuIEFsc28gdGhpbmsg
dG8gbGlmZXRpbWUgb2YgdGhlIFByb2R1Y2VyKiBkdXJpbmcKKy8vIHRoZSBjYWxsYmFja3MuCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIHN0YXRpYy4gKERlY2xhcmVkIGluIGluY2x1ZGUv
dHJhY2luZy9pcGMvcHJvZHVjZXJfaXBjX2NsaWVudC5oKS4KK3N0ZDo6dW5pcXVlX3B0cjxUcmFj
aW5nU2VydmljZTo6UHJvZHVjZXJFbmRwb2ludD4gUHJvZHVjZXJJUENDbGllbnQ6OkNvbm5lY3Qo
CisgICAgY29uc3QgY2hhciogc2VydmljZV9zb2NrX25hbWUsCisgICAgUHJvZHVjZXIqIHByb2R1
Y2VyLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9kdWNlcl9uYW1lLAorICAgIGJhc2U6OlRh
c2tSdW5uZXIqIHRhc2tfcnVubmVyLAorICAgIFRyYWNpbmdTZXJ2aWNlOjpQcm9kdWNlclNNQlNj
cmFwaW5nTW9kZSBzbWJfc2NyYXBpbmdfbW9kZSwKKyAgICBzaXplX3Qgc2hhcmVkX21lbW9yeV9z
aXplX2hpbnRfYnl0ZXMsCisgICAgc2l6ZV90IHNoYXJlZF9tZW1vcnlfcGFnZV9zaXplX2hpbnRf
Ynl0ZXMsCisgICAgc3RkOjp1bmlxdWVfcHRyPFNoYXJlZE1lbW9yeT4gc2htLAorICAgIHN0ZDo6
dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnlBcmJpdGVyPiBzaG1fYXJiaXRlcikgeworICByZXR1cm4g
c3RkOjp1bmlxdWVfcHRyPFRyYWNpbmdTZXJ2aWNlOjpQcm9kdWNlckVuZHBvaW50PigKKyAgICAg
IG5ldyBQcm9kdWNlcklQQ0NsaWVudEltcGwoc2VydmljZV9zb2NrX25hbWUsIHByb2R1Y2VyLCBw
cm9kdWNlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3J1bm5l
ciwgc21iX3NjcmFwaW5nX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNo
YXJlZF9tZW1vcnlfc2l6ZV9oaW50X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoc2htKSwgc3RkOjptb3ZlKHNobV9hcmJpdGVyKSkp
OworfQorCitQcm9kdWNlcklQQ0NsaWVudEltcGw6OlByb2R1Y2VySVBDQ2xpZW50SW1wbCgKKyAg
ICBjb25zdCBjaGFyKiBzZXJ2aWNlX3NvY2tfbmFtZSwKKyAgICBQcm9kdWNlciogcHJvZHVjZXIs
CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2R1Y2VyX25hbWUsCisgICAgYmFzZTo6VGFza1J1
bm5lciogdGFza19ydW5uZXIsCisgICAgVHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyU01CU2NyYXBp
bmdNb2RlIHNtYl9zY3JhcGluZ19tb2RlLAorICAgIHNpemVfdCBzaGFyZWRfbWVtb3J5X3NpemVf
aGludF9ieXRlcywKKyAgICBzaXplX3Qgc2hhcmVkX21lbW9yeV9wYWdlX3NpemVfaGludF9ieXRl
cywKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2hhcmVkTWVtb3J5PiBzaG0sCisgICAgc3RkOjp1bmlx
dWVfcHRyPFNoYXJlZE1lbW9yeUFyYml0ZXI+IHNobV9hcmJpdGVyKQorICAgIDogcHJvZHVjZXJf
KHByb2R1Y2VyKSwKKyAgICAgIHRhc2tfcnVubmVyXyh0YXNrX3J1bm5lciksCisgICAgICBpcGNf
Y2hhbm5lbF8oaXBjOjpDbGllbnQ6OkNyZWF0ZUluc3RhbmNlKHNlcnZpY2Vfc29ja19uYW1lLCB0
YXNrX3J1bm5lcikpLAorICAgICAgcHJvZHVjZXJfcG9ydF8odGhpcyAvKiBldmVudF9saXN0ZW5l
ciAqLyksCisgICAgICBzaGFyZWRfbWVtb3J5XyhzdGQ6Om1vdmUoc2htKSksCisgICAgICBzaGFy
ZWRfbWVtb3J5X2FyYml0ZXJfKHN0ZDo6bW92ZShzaG1fYXJiaXRlcikpLAorICAgICAgbmFtZV8o
cHJvZHVjZXJfbmFtZSksCisgICAgICBzaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVz
XyhzaGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzKSwKKyAgICAgIHNoYXJlZF9tZW1v
cnlfc2l6ZV9oaW50X2J5dGVzXyhzaGFyZWRfbWVtb3J5X3NpemVfaGludF9ieXRlcyksCisgICAg
ICBzbWJfc2NyYXBpbmdfbW9kZV8oc21iX3NjcmFwaW5nX21vZGUpIHsKKyAgLy8gQ2hlY2sgZm9y
IHByb2R1Y2VyLXByb3ZpZGVkIFNNQiAodXNlZCBieSBDaHJvbWUgZm9yIHN0YXJ0dXAgdHJhY2lu
ZykuCisgIGlmIChzaGFyZWRfbWVtb3J5XykgeworICAgIC8vIFdlIGFsc28gZXhwZWN0IGEgdmFs
aWQgKHVuYm91bmQpIGFyYml0ZXIuIEJpbmQgaXQgdG8gdGhpcyBlbmRwb2ludCBub3cuCisgICAg
UEVSRkVUVE9fQ0hFQ0soc2hhcmVkX21lbW9yeV9hcmJpdGVyXyk7CisgICAgc2hhcmVkX21lbW9y
eV9hcmJpdGVyXy0+QmluZFRvUHJvZHVjZXJFbmRwb2ludCh0aGlzLCB0YXNrX3J1bm5lcl8pOwor
CisgICAgLy8gSWYgdGhlIHNlcnZpY2UgYWNjZXB0cyBvdXIgU01CLCB0aGVuIGl0IG11c3QgbWF0
Y2ggb3VyIHJlcXVlc3RlZCBwYWdlCisgICAgLy8gbGF5b3V0LiBUaGUgcHJvdG9jb2wgZG9lc24n
dCBhbGxvdyB0aGUgc2VydmljZSB0byBjaGFuZ2UgdGhlIHNpemUgYW5kCisgICAgLy8gbGF5b3V0
IHdoZW4gdGhlIFNNQiBpcyBwcm92aWRlZCBieSB0aGUgcHJvZHVjZXIuCisgICAgc2hhcmVkX2J1
ZmZlcl9wYWdlX3NpemVfa2JfID0gc2hhcmVkX21lbW9yeV9wYWdlX3NpemVfaGludF9ieXRlc18g
LyAxMDI0OworICB9CisKKyAgaXBjX2NoYW5uZWxfLT5CaW5kU2VydmljZShwcm9kdWNlcl9wb3J0
Xy5HZXRXZWFrUHRyKCkpOworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2Vy
Xyk7Cit9CisKK1Byb2R1Y2VySVBDQ2xpZW50SW1wbDo6flByb2R1Y2VySVBDQ2xpZW50SW1wbCgp
ID0gZGVmYXVsdDsKKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIgaWYgdGhlIEJpbmRTZXJ2
aWNlKCkgc3VjY2VlZHMuCit2b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6T25Db25uZWN0KCkg
eworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisgIGNvbm5lY3Rl
ZF8gPSB0cnVlOworCisgIC8vIFRoZSBJUEMgbGF5ZXIgZ3VhcmFudGVlcyB0aGF0IGFueSBvdXRz
dGFuZGluZyBjYWxsYmFjayB3aWxsIGJlIGRyb3BwZWQgb24KKyAgLy8gdGhlIGZsb29yIGlmIHBy
b2R1Y2VyX3BvcnRfIGlzIGRlc3Ryb3llZCBiZXR3ZWVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVw
bHkuCisgIC8vIEJpbmRpbmcgfHRoaXN8IGlzIGhlbmNlIHNhZmUuCisgIGlwYzo6RGVmZXJyZWQ8
cHJvdG9zOjpnZW46OkluaXRpYWxpemVDb25uZWN0aW9uUmVzcG9uc2U+IG9uX2luaXQ7CisgIG9u
X2luaXQuQmluZCgKKyAgICAgIFt0aGlzXShpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpJ
bml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlPiByZXNwKSB7CisgICAgICAgIE9uQ29ubmVjdGlv
bkluaXRpYWxpemVkKAorICAgICAgICAgICAgcmVzcC5zdWNjZXNzKCksCisgICAgICAgICAgICBy
ZXNwLnN1Y2Nlc3MoKSA/IHJlc3AtPnVzaW5nX3NobWVtX3Byb3ZpZGVkX2J5X3Byb2R1Y2VyKCkg
OiBmYWxzZSk7CisgICAgICB9KTsKKyAgcHJvdG9zOjpnZW46OkluaXRpYWxpemVDb25uZWN0aW9u
UmVxdWVzdCByZXE7CisgIHJlcS5zZXRfcHJvZHVjZXJfbmFtZShuYW1lXyk7CisgIHJlcS5zZXRf
c2hhcmVkX21lbW9yeV9zaXplX2hpbnRfYnl0ZXMoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzJf
dD4oc2hhcmVkX21lbW9yeV9zaXplX2hpbnRfYnl0ZXNfKSk7CisgIHJlcS5zZXRfc2hhcmVkX21l
bW9yeV9wYWdlX3NpemVfaGludF9ieXRlcygKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pihz
aGFyZWRfbWVtb3J5X3BhZ2Vfc2l6ZV9oaW50X2J5dGVzXykpOworICBzd2l0Y2ggKHNtYl9zY3Jh
cGluZ19tb2RlXykgeworICAgIGNhc2UgVHJhY2luZ1NlcnZpY2U6OlByb2R1Y2VyU01CU2NyYXBp
bmdNb2RlOjprRGVmYXVsdDoKKyAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBtb2RlLCBpdCBk
ZWZhdWx0cyB0byB1c2UgdGhlIHNlcnZpY2UgZGVmYXVsdCBpZgorICAgICAgLy8gdW5zcGVjaWZp
ZWQuCisgICAgICBicmVhazsKKyAgICBjYXNlIFRyYWNpbmdTZXJ2aWNlOjpQcm9kdWNlclNNQlNj
cmFwaW5nTW9kZTo6a0VuYWJsZWQ6CisgICAgICByZXEuc2V0X3NtYl9zY3JhcGluZ19tb2RlKAor
ICAgICAgICAgIHByb3Rvczo6Z2VuOjpJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3Q6OlNNQl9T
Q1JBUElOR19FTkFCTEVEKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhY2luZ1NlcnZpY2U6
OlByb2R1Y2VyU01CU2NyYXBpbmdNb2RlOjprRGlzYWJsZWQ6CisgICAgICByZXEuc2V0X3NtYl9z
Y3JhcGluZ19tb2RlKAorICAgICAgICAgIHByb3Rvczo6Z2VuOjpJbml0aWFsaXplQ29ubmVjdGlv
blJlcXVlc3Q6OlNNQl9TQ1JBUElOR19ESVNBQkxFRCk7CisgICAgICBicmVhazsKKyAgfQorCisg
IGludCBzaG1fZmQgPSAtMTsKKyAgaWYgKHNoYXJlZF9tZW1vcnlfKSB7CisgICAgc2htX2ZkID0g
c2hhcmVkX21lbW9yeV8tPmZkKCk7CisgICAgcmVxLnNldF9wcm9kdWNlcl9wcm92aWRlZF9zaG1l
bSh0cnVlKTsKKyAgfQorCisjaWYgUEVSRkVUVE9fRENIRUNLX0lTX09OKCkKKyAgcmVxLnNldF9i
dWlsZF9mbGFncygKKyAgICAgIHByb3Rvczo6Z2VuOjpJbml0aWFsaXplQ29ubmVjdGlvblJlcXVl
c3Q6OkJVSUxEX0ZMQUdTX0RDSEVDS1NfT04pOworI2Vsc2UKKyAgcmVxLnNldF9idWlsZF9mbGFn
cygKKyAgICAgIHByb3Rvczo6Z2VuOjpJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3Q6OkJVSUxE
X0ZMQUdTX0RDSEVDS1NfT0ZGKTsKKyNlbmRpZgorICBwcm9kdWNlcl9wb3J0Xy5Jbml0aWFsaXpl
Q29ubmVjdGlvbihyZXEsIHN0ZDo6bW92ZShvbl9pbml0KSwgc2htX2ZkKTsKKworICAvLyBDcmVh
dGUgdGhlIGJhY2sgY2hhbm5lbCB0byByZWNlaXZlIGNvbW1hbmRzIGZyb20gdGhlIFNlcnZpY2Uu
CisgIGlwYzo6RGVmZXJyZWQ8cHJvdG9zOjpnZW46OkdldEFzeW5jQ29tbWFuZFJlc3BvbnNlPiBv
bl9jbWQ7CisgIG9uX2NtZC5CaW5kKAorICAgICAgW3RoaXNdKGlwYzo6QXN5bmNSZXN1bHQ8cHJv
dG9zOjpnZW46OkdldEFzeW5jQ29tbWFuZFJlc3BvbnNlPiByZXNwKSB7CisgICAgICAgIGlmICgh
cmVzcCkKKyAgICAgICAgICByZXR1cm47ICAvLyBUaGUgSVBDIGNoYW5uZWwgd2FzIGNsb3NlZCBh
bmQgfHJlc3B8IHdhcyBhdXRvLXJlamVjdGVkLgorICAgICAgICBPblNlcnZpY2VSZXF1ZXN0KCpy
ZXNwKTsKKyAgICAgIH0pOworICBwcm9kdWNlcl9wb3J0Xy5HZXRBc3luY0NvbW1hbmQocHJvdG9z
OjpnZW46OkdldEFzeW5jQ29tbWFuZFJlcXVlc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0ZDo6bW92ZShvbl9jbWQpKTsKKworICAvLyBJZiB0aGVyZSBhcmUgcGVuZGlu
ZyBTeW5jKCkgcmVxdWVzdHMsIHNlbmQgdGhlbSBub3cuCisgIGZvciAoY29uc3QgYXV0byYgcGVu
ZGluZ19zeW5jIDogcGVuZGluZ19zeW5jX3JlcXNfKQorICAgIFN5bmMoc3RkOjptb3ZlKHBlbmRp
bmdfc3luYykpOworICBwZW5kaW5nX3N5bmNfcmVxc18uY2xlYXIoKTsKK30KKwordm9pZCBQcm9k
dWNlcklQQ0NsaWVudEltcGw6Ok9uRGlzY29ubmVjdCgpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RI
UkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBQRVJGRVRUT19ETE9HKCJUcmFjaW5nIHNlcnZpY2Ug
Y29ubmVjdGlvbiBmYWlsdXJlIik7CisgIGNvbm5lY3RlZF8gPSBmYWxzZTsKKyAgcHJvZHVjZXJf
LT5PbkRpc2Nvbm5lY3QoKTsKKyAgZGF0YV9zb3VyY2VzX3NldHVwXy5jbGVhcigpOworfQorCit2
b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6T25Db25uZWN0aW9uSW5pdGlhbGl6ZWQoCisgICAg
Ym9vbCBjb25uZWN0aW9uX3N1Y2NlZWRlZCwKKyAgICBib29sIHVzaW5nX3NobWVtX3Byb3ZpZGVk
X2J5X3Byb2R1Y2VyKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJf
KTsKKyAgLy8gSWYgY29ubmVjdGlvbl9zdWNjZWVkZWQgPT0gZmFsc2UsIHRoZSBPbkRpc2Nvbm5l
Y3QoKSBjYWxsIHdpbGwgZm9sbG93IG5leHQKKyAgLy8gYW5kIHRoZXJlIHdlJ2xsIG5vdGlmeSB0
aGUgfHByb2R1Y2VyX3wuIFRPRE86IGFkZCBhIHRlc3QgZm9yIHRoaXMuCisgIGlmICghY29ubmVj
dGlvbl9zdWNjZWVkZWQpCisgICAgcmV0dXJuOworICBpc19zaG1lbV9wcm92aWRlZF9ieV9wcm9k
dWNlcl8gPSB1c2luZ19zaG1lbV9wcm92aWRlZF9ieV9wcm9kdWNlcjsKKyAgcHJvZHVjZXJfLT5P
bkNvbm5lY3QoKTsKKworICAvLyBCYWlsIG91dCBpZiB0aGUgc2VydmljZSBmYWlsZWQgdG8gYWRv
cHQgb3VyIHByb2R1Y2VyLWFsbG9jYXRlZCBTTUIuCisgIC8vIFRPRE8oZXNlY2tsZXIpOiBIYW5k
bGUgYWRvcHRpb24gZmFpbHVyZSBtb3JlIGdyYWNlZnVsbHkuCisgIGlmIChzaGFyZWRfbWVtb3J5
XyAmJiAhaXNfc2htZW1fcHJvdmlkZWRfYnlfcHJvZHVjZXJfKSB7CisgICAgUEVSRkVUVE9fRExP
RygiU2VydmljZSBmYWlsZWQgYWRvcHQgcHJvZHVjZXItcHJvdmlkZWQgU01CLCBkaXNjb25uZWN0
aW5nLiIpOworICAgIGlwY19jaGFubmVsXy5yZXNldCgpOworICAgIHJldHVybjsKKyAgfQorfQor
Cit2b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6T25TZXJ2aWNlUmVxdWVzdCgKKyAgICBjb25z
dCBwcm90b3M6Omdlbjo6R2V0QXN5bmNDb21tYW5kUmVzcG9uc2UmIGNtZCkgeworICBQRVJGRVRU
T19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7CisKKyAgLy8gVGhpcyBtZXNzYWdlIGlz
IHNlbnQgb25seSB3aGVuIGNvbm5lY3RpbmcgdG8gYSBzZXJ2aWNlIHJ1bm5pbmcgQW5kcm9pZCBR
Ky4KKyAgLy8gU2VlIGNvbW1lbnQgYmVsb3cgaW4ga1N0YXJ0RGF0YVNvdXJjZS4KKyAgaWYgKGNt
ZC5oYXNfc2V0dXBfZGF0YV9zb3VyY2UoKSkgeworICAgIGNvbnN0IGF1dG8mIHJlcSA9IGNtZC5z
ZXR1cF9kYXRhX3NvdXJjZSgpOworICAgIGNvbnN0IERhdGFTb3VyY2VJbnN0YW5jZUlEIGRzaWQg
PSByZXEubmV3X2luc3RhbmNlX2lkKCk7CisgICAgZGF0YV9zb3VyY2VzX3NldHVwXy5pbnNlcnQo
ZHNpZCk7CisgICAgcHJvZHVjZXJfLT5TZXR1cERhdGFTb3VyY2UoZHNpZCwgcmVxLmNvbmZpZygp
KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY21kLmhhc19zdGFydF9kYXRhX3NvdXJjZSgp
KSB7CisgICAgY29uc3QgYXV0byYgcmVxID0gY21kLnN0YXJ0X2RhdGFfc291cmNlKCk7CisgICAg
Y29uc3QgRGF0YVNvdXJjZUluc3RhbmNlSUQgZHNpZCA9IHJlcS5uZXdfaW5zdGFuY2VfaWQoKTsK
KyAgICBjb25zdCBEYXRhU291cmNlQ29uZmlnJiBjZmcgPSByZXEuY29uZmlnKCk7CisgICAgaWYg
KCFkYXRhX3NvdXJjZXNfc2V0dXBfLmNvdW50KGRzaWQpKSB7CisgICAgICAvLyBXaGVuIGNvbm5l
Y3Rpbmcgd2l0aCBhbiBvbGRlciAoQW5kcm9pZCBQKSBzZXJ2aWNlLCB0aGUgc2VydmljZSB3aWxs
IG5vdAorICAgICAgLy8gc2VuZCBhIFNldHVwRGF0YVNvdXJjZSBtZXNzYWdlLiBXZSBzeW50aGVz
aXplIGl0IGhlcmUgaW4gdGhhdCBjYXNlLgorICAgICAgcHJvZHVjZXJfLT5TZXR1cERhdGFTb3Vy
Y2UoZHNpZCwgY2ZnKTsKKyAgICB9CisgICAgcHJvZHVjZXJfLT5TdGFydERhdGFTb3VyY2UoZHNp
ZCwgY2ZnKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY21kLmhhc19zdG9wX2RhdGFfc291
cmNlKCkpIHsKKyAgICBjb25zdCBEYXRhU291cmNlSW5zdGFuY2VJRCBkc2lkID0gY21kLnN0b3Bf
ZGF0YV9zb3VyY2UoKS5pbnN0YW5jZV9pZCgpOworICAgIHByb2R1Y2VyXy0+U3RvcERhdGFTb3Vy
Y2UoZHNpZCk7CisgICAgZGF0YV9zb3VyY2VzX3NldHVwXy5lcmFzZShkc2lkKTsKKyAgICByZXR1
cm47CisgIH0KKworICBpZiAoY21kLmhhc19zZXR1cF90cmFjaW5nKCkpIHsKKyAgICBiYXNlOjpT
Y29wZWRGaWxlIHNobWVtX2ZkID0gaXBjX2NoYW5uZWxfLT5UYWtlUmVjZWl2ZWRGRCgpOworICAg
IGlmIChzaG1lbV9mZCkgeworICAgICAgLy8gVGhpcyBpcyB0aGUgbm9taW5hbCBjYXNlIHVzZWQg
aW4gbW9zdCBjb25maWd1cmF0aW9ucywgd2hlcmUgdGhlIHNlcnZpY2UKKyAgICAgIC8vIHByb3Zp
ZGVzIHRoZSBTTUIuCisgICAgICBQRVJGRVRUT19DSEVDSyghaXNfc2htZW1fcHJvdmlkZWRfYnlf
cHJvZHVjZXJfICYmICFzaGFyZWRfbWVtb3J5Xyk7CisgICAgICAvLyBUT0RPKHByaW1pYW5vKTog
aGFuZGxlIG1tYXAgZmFpbHVyZSBpbiBjYXNlIG9mIE9PTS4KKyAgICAgIHNoYXJlZF9tZW1vcnlf
ID0KKyAgICAgICAgICBQb3NpeFNoYXJlZE1lbW9yeTo6QXR0YWNoVG9GZChzdGQ6Om1vdmUoc2ht
ZW1fZmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVxdWly
ZV9zZWFsc19pZl9zdXBwb3J0ZWQ9Ki9mYWxzZSk7CisgICAgICBzaGFyZWRfYnVmZmVyX3BhZ2Vf
c2l6ZV9rYl8gPQorICAgICAgICAgIGNtZC5zZXR1cF90cmFjaW5nKCkuc2hhcmVkX2J1ZmZlcl9w
YWdlX3NpemVfa2IoKTsKKyAgICAgIHNoYXJlZF9tZW1vcnlfYXJiaXRlcl8gPSBTaGFyZWRNZW1v
cnlBcmJpdGVyOjpDcmVhdGVJbnN0YW5jZSgKKyAgICAgICAgICBzaGFyZWRfbWVtb3J5Xy5nZXQo
KSwgc2hhcmVkX2J1ZmZlcl9wYWdlX3NpemVfa2JfICogMTAyNCwgdGhpcywKKyAgICAgICAgICB0
YXNrX3J1bm5lcl8pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBQcm9kdWNlci1wcm92aWRlZCBT
TUIgKHVzZWQgYnkgQ2hyb21lIGZvciBzdGFydHVwIHRyYWNpbmcpLgorICAgICAgUEVSRkVUVE9f
Q0hFQ0soaXNfc2htZW1fcHJvdmlkZWRfYnlfcHJvZHVjZXJfICYmIHNoYXJlZF9tZW1vcnlfICYm
CisgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbWVtb3J5X2FyYml0ZXJfKTsKKyAgICB9Cisg
ICAgcHJvZHVjZXJfLT5PblRyYWNpbmdTZXR1cCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGlm
IChjbWQuaGFzX2ZsdXNoKCkpIHsKKyAgICAvLyBUaGlzIGNhc3QgYm9pbGVycGxhdGUgaXMgcmVx
dWlyZWQgb25seSBiZWNhdXNlIHByb3RvYnVmIHVzZXMgaXRzIG93bgorICAgIC8vIHVpbnQ2NCBh
bmQgbm90IHN0ZGludCdzIHVpbnQ2NF90LiBPbiBzb21lIDY0IGJpdCBhcmNocyB0aGV5IGRpZmZl
ciBvbiB0aGUKKyAgICAvLyB0eXBlIChsb25nIHZzIGxvbmcgbG9uZykgZXZlbiB0aG91Z2ggdGhl
eSBoYXZlIHRoZSBzYW1lIHNpemUuCisgICAgY29uc3QgYXV0byogZGF0YV9zb3VyY2VfaWRzID0g
Y21kLmZsdXNoKCkuZGF0YV9zb3VyY2VfaWRzKCkuZGF0YSgpOworICAgIHN0YXRpY19hc3NlcnQo
c2l6ZW9mKGRhdGFfc291cmNlX2lkc1swXSkgPT0gc2l6ZW9mKERhdGFTb3VyY2VJbnN0YW5jZUlE
KSwKKyAgICAgICAgICAgICAgICAgICJkYXRhX3NvdXJjZV9pZHMgc2hvdWxkIGJlIDY0LWJpdCIp
OworICAgIHByb2R1Y2VyXy0+Rmx1c2goCisgICAgICAgIGNtZC5mbHVzaCgpLnJlcXVlc3RfaWQo
KSwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEYXRhU291cmNlSW5zdGFuY2VJRCo+
KGRhdGFfc291cmNlX2lkcyksCisgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oY21kLmZsdXNo
KCkuZGF0YV9zb3VyY2VfaWRzKCkuc2l6ZSgpKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYg
KGNtZC5oYXNfY2xlYXJfaW5jcmVtZW50YWxfc3RhdGUoKSkgeworICAgIGNvbnN0IGF1dG8qIGRh
dGFfc291cmNlX2lkcyA9CisgICAgICAgIGNtZC5jbGVhcl9pbmNyZW1lbnRhbF9zdGF0ZSgpLmRh
dGFfc291cmNlX2lkcygpLmRhdGEoKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkYXRhX3Nv
dXJjZV9pZHNbMF0pID09IHNpemVvZihEYXRhU291cmNlSW5zdGFuY2VJRCksCisgICAgICAgICAg
ICAgICAgICAiZGF0YV9zb3VyY2VfaWRzIHNob3VsZCBiZSA2NC1iaXQiKTsKKyAgICBwcm9kdWNl
cl8tPkNsZWFySW5jcmVtZW50YWxTdGF0ZSgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25z
dCBEYXRhU291cmNlSW5zdGFuY2VJRCo+KGRhdGFfc291cmNlX2lkcyksCisgICAgICAgIHN0YXRp
Y19jYXN0PHNpemVfdD4oCisgICAgICAgICAgICBjbWQuY2xlYXJfaW5jcmVtZW50YWxfc3RhdGUo
KS5kYXRhX3NvdXJjZV9pZHMoKS5zaXplKCkpKTsKKyAgICByZXR1cm47CisgIH0KKworICBQRVJG
RVRUT19ERkFUQUwoIlVua25vd24gYXN5bmMgcmVxdWVzdCByZWNlaXZlZCBmcm9tIHRyYWNpbmcg
c2VydmljZSIpOworfQorCit2b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6UmVnaXN0ZXJEYXRh
U291cmNlKAorICAgIGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSB7Cisg
IFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgaWYgKCFjb25uZWN0
ZWRfKSB7CisgICAgUEVSRkVUVE9fRExPRygKKyAgICAgICAgIkNhbm5vdCBSZWdpc3RlckRhdGFT
b3VyY2UoKSwgbm90IGNvbm5lY3RlZCB0byB0cmFjaW5nIHNlcnZpY2UiKTsKKyAgfQorICBwcm90
b3M6Omdlbjo6UmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCByZXE7CisgICpyZXEubXV0YWJsZV9k
YXRhX3NvdXJjZV9kZXNjcmlwdG9yKCkgPSBkZXNjcmlwdG9yOworICBpcGM6OkRlZmVycmVkPHBy
b3Rvczo6Z2VuOjpSZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZT4gYXN5bmNfcmVzcG9uc2U7Cisg
IGFzeW5jX3Jlc3BvbnNlLkJpbmQoCisgICAgICBbXShpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6
Z2VuOjpSZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZT4gcmVzcG9uc2UpIHsKKyAgICAgICAgaWYg
KCFyZXNwb25zZSkKKyAgICAgICAgICBQRVJGRVRUT19ETE9HKCJSZWdpc3RlckRhdGFTb3VyY2Uo
KSBmYWlsZWQ6IGNvbm5lY3Rpb24gcmVzZXQiKTsKKyAgICAgIH0pOworICBwcm9kdWNlcl9wb3J0
Xy5SZWdpc3RlckRhdGFTb3VyY2UocmVxLCBzdGQ6Om1vdmUoYXN5bmNfcmVzcG9uc2UpKTsKK30K
Kwordm9pZCBQcm9kdWNlcklQQ0NsaWVudEltcGw6OlVucmVnaXN0ZXJEYXRhU291cmNlKGNvbnN0
IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2No
ZWNrZXJfKTsKKyAgaWYgKCFjb25uZWN0ZWRfKSB7CisgICAgUEVSRkVUVE9fRExPRygKKyAgICAg
ICAgIkNhbm5vdCBVbnJlZ2lzdGVyRGF0YVNvdXJjZSgpLCBub3QgY29ubmVjdGVkIHRvIHRyYWNp
bmcgc2VydmljZSIpOworICAgIHJldHVybjsKKyAgfQorICBwcm90b3M6Omdlbjo6VW5yZWdpc3Rl
ckRhdGFTb3VyY2VSZXF1ZXN0IHJlcTsKKyAgcmVxLnNldF9kYXRhX3NvdXJjZV9uYW1lKG5hbWUp
OworICBwcm9kdWNlcl9wb3J0Xy5VbnJlZ2lzdGVyRGF0YVNvdXJjZSgKKyAgICAgIHJlcSwgaXBj
OjpEZWZlcnJlZDxwcm90b3M6Omdlbjo6VW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZT4oKSk7
Cit9CisKK3ZvaWQgUHJvZHVjZXJJUENDbGllbnRJbXBsOjpSZWdpc3RlclRyYWNlV3JpdGVyKHVp
bnQzMl90IHdyaXRlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHVpbnQzMl90IHRhcmdldF9idWZmZXIpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RI
UkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBpZiAoIWNvbm5lY3RlZF8pIHsKKyAgICBQRVJGRVRU
T19ETE9HKAorICAgICAgICAiQ2Fubm90IFJlZ2lzdGVyVHJhY2VXcml0ZXIoKSwgbm90IGNvbm5l
Y3RlZCB0byB0cmFjaW5nIHNlcnZpY2UiKTsKKyAgICByZXR1cm47CisgIH0KKyAgcHJvdG9zOjpn
ZW46OlJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0IHJlcTsKKyAgcmVxLnNldF90cmFjZV93cml0
ZXJfaWQod3JpdGVyX2lkKTsKKyAgcmVxLnNldF90YXJnZXRfYnVmZmVyKHRhcmdldF9idWZmZXIp
OworICBwcm9kdWNlcl9wb3J0Xy5SZWdpc3RlclRyYWNlV3JpdGVyKAorICAgICAgcmVxLCBpcGM6
OkRlZmVycmVkPHByb3Rvczo6Z2VuOjpSZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2U+KCkpOwor
fQorCit2b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6VW5yZWdpc3RlclRyYWNlV3JpdGVyKHVp
bnQzMl90IHdyaXRlcl9pZCkgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVj
a2VyXyk7CisgIGlmICghY29ubmVjdGVkXykgeworICAgIFBFUkZFVFRPX0RMT0coCisgICAgICAg
ICJDYW5ub3QgVW5yZWdpc3RlclRyYWNlV3JpdGVyKCksIG5vdCBjb25uZWN0ZWQgdG8gdHJhY2lu
ZyBzZXJ2aWNlIik7CisgICAgcmV0dXJuOworICB9CisgIHByb3Rvczo6Z2VuOjpVbnJlZ2lzdGVy
VHJhY2VXcml0ZXJSZXF1ZXN0IHJlcTsKKyAgcmVxLnNldF90cmFjZV93cml0ZXJfaWQod3JpdGVy
X2lkKTsKKyAgcHJvZHVjZXJfcG9ydF8uVW5yZWdpc3RlclRyYWNlV3JpdGVyKAorICAgICAgcmVx
LCBpcGM6OkRlZmVycmVkPHByb3Rvczo6Z2VuOjpVbnJlZ2lzdGVyVHJhY2VXcml0ZXJSZXNwb25z
ZT4oKSk7Cit9CisKK3ZvaWQgUHJvZHVjZXJJUENDbGllbnRJbXBsOjpDb21taXREYXRhKGNvbnN0
IENvbW1pdERhdGFSZXF1ZXN0JiByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBDb21taXREYXRhQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgUEVSRkVUVE9fRENIRUNL
X1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBpZiAoIWNvbm5lY3RlZF8pIHsKKyAgICBQRVJG
RVRUT19ETE9HKCJDYW5ub3QgQ29tbWl0RGF0YSgpLCBub3QgY29ubmVjdGVkIHRvIHRyYWNpbmcg
c2VydmljZSIpOworICAgIHJldHVybjsKKyAgfQorICBpcGM6OkRlZmVycmVkPHByb3Rvczo6Z2Vu
OjpDb21taXREYXRhUmVzcG9uc2U+IGFzeW5jX3Jlc3BvbnNlOworICAvLyBUT0RPKHByaW1pYW5v
KTogYWRkIGEgdGVzdCB0aGF0IGRlc3Ryb3lzIFByb2R1Y2VySVBDQ2xpZW50SW1wbCBzb29uIGFm
dGVyCisgIC8vIHRoaXMgY2FsbCBhbmQgY2hlY2tzIHRoYXQgdGhlIGNhbGxiYWNrIGlzIGRyb3Bw
ZWQuCisgIGlmIChjYWxsYmFjaykgeworICAgIGFzeW5jX3Jlc3BvbnNlLkJpbmQoCisgICAgICAg
IFtjYWxsYmFja10oaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6Q29tbWl0RGF0YVJlc3Bv
bnNlPiByZXNwb25zZSkgeworICAgICAgICAgIGlmICghcmVzcG9uc2UpIHsKKyAgICAgICAgICAg
IFBFUkZFVFRPX0RMT0coIkNvbW1pdERhdGEoKSBmYWlsZWQ6IGNvbm5lY3Rpb24gcmVzZXQiKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FsbGJhY2soKTsK
KyAgICAgICAgfSk7CisgIH0KKyAgcHJvZHVjZXJfcG9ydF8uQ29tbWl0RGF0YShyZXEsIHN0ZDo6
bW92ZShhc3luY19yZXNwb25zZSkpOworfQorCit2b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6
Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWQoRGF0YVNvdXJjZUluc3RhbmNlSUQgaWQpIHsKKyAgUEVS
RkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBpZiAoIWNvbm5lY3RlZF8p
IHsKKyAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAiQ2Fubm90IE5vdGlmeURhdGFTb3VyY2VT
dGFydGVkKCksIG5vdCBjb25uZWN0ZWQgdG8gdHJhY2luZyBzZXJ2aWNlIik7CisgICAgcmV0dXJu
OworICB9CisgIHByb3Rvczo6Z2VuOjpOb3RpZnlEYXRhU291cmNlU3RhcnRlZFJlcXVlc3QgcmVx
OworICByZXEuc2V0X2RhdGFfc291cmNlX2lkKGlkKTsKKyAgcHJvZHVjZXJfcG9ydF8uTm90aWZ5
RGF0YVNvdXJjZVN0YXJ0ZWQoCisgICAgICByZXEsIGlwYzo6RGVmZXJyZWQ8cHJvdG9zOjpnZW46
Ok5vdGlmeURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2U+KCkpOworfQorCit2b2lkIFByb2R1Y2Vy
SVBDQ2xpZW50SW1wbDo6Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoRGF0YVNvdXJjZUluc3RhbmNl
SUQgaWQpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBp
ZiAoIWNvbm5lY3RlZF8pIHsKKyAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAiQ2Fubm90IE5v
dGlmeURhdGFTb3VyY2VTdG9wcGVkKCksIG5vdCBjb25uZWN0ZWQgdG8gdHJhY2luZyBzZXJ2aWNl
Iik7CisgICAgcmV0dXJuOworICB9CisgIHByb3Rvczo6Z2VuOjpOb3RpZnlEYXRhU291cmNlU3Rv
cHBlZFJlcXVlc3QgcmVxOworICByZXEuc2V0X2RhdGFfc291cmNlX2lkKGlkKTsKKyAgcHJvZHVj
ZXJfcG9ydF8uTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoCisgICAgICByZXEsIGlwYzo6RGVmZXJy
ZWQ8cHJvdG9zOjpnZW46Ok5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2U+KCkpOworfQor
Cit2b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6QWN0aXZhdGVUcmlnZ2VycygKKyAgICBjb25z
dCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRyaWdnZXJzKSB7CisgIFBFUkZFVFRPX0RDSEVD
S19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgaWYgKCFjb25uZWN0ZWRfKSB7CisgICAgUEVS
RkVUVE9fRExPRygKKyAgICAgICAgIkNhbm5vdCBBY3RpdmF0ZVRyaWdnZXJzKCksIG5vdCBjb25u
ZWN0ZWQgdG8gdHJhY2luZyBzZXJ2aWNlIik7CisgICAgcmV0dXJuOworICB9CisgIHByb3Rvczo6
Z2VuOjpBY3RpdmF0ZVRyaWdnZXJzUmVxdWVzdCBwcm90b19yZXE7CisgIGZvciAoY29uc3QgYXV0
byYgbmFtZSA6IHRyaWdnZXJzKSB7CisgICAgKnByb3RvX3JlcS5hZGRfdHJpZ2dlcl9uYW1lcygp
ID0gbmFtZTsKKyAgfQorICBwcm9kdWNlcl9wb3J0Xy5BY3RpdmF0ZVRyaWdnZXJzKAorICAgICAg
cHJvdG9fcmVxLCBpcGM6OkRlZmVycmVkPHByb3Rvczo6Z2VuOjpBY3RpdmF0ZVRyaWdnZXJzUmVz
cG9uc2U+KCkpOworfQorCit2b2lkIFByb2R1Y2VySVBDQ2xpZW50SW1wbDo6U3luYyhzdGQ6OmZ1
bmN0aW9uPHZvaWQoKT4gY2FsbGJhY2spIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJl
YWRfY2hlY2tlcl8pOworICBpZiAoIWNvbm5lY3RlZF8pIHsKKyAgICBwZW5kaW5nX3N5bmNfcmVx
c18uZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjYWxsYmFjaykpOworICAgIHJldHVybjsKKyAgfQor
ICBpcGM6OkRlZmVycmVkPHByb3Rvczo6Z2VuOjpTeW5jUmVzcG9uc2U+IHJlc3A7CisgIHJlc3Au
QmluZChbY2FsbGJhY2tdKGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OlN5bmNSZXNwb25z
ZT4pIHsKKyAgICAvLyBIZXJlIHdlIEFDSyB0aGUgY2FsbGJhY2sgZXZlbiBpZiB0aGUgc2Vydmlj
ZSByZXBsaWVzIHdpdGggYSBmYWlsdXJlCisgICAgLy8gKGkuZS4gdGhlIHNlcnZpY2UgaXMgdG9v
IG9sZCBhbmQgZG9lc24ndCB1bmRlcnN0YW5kIFN5bmMoKSkuIEluIHRoYXQKKyAgICAvLyBjYXNl
IHRoZSBzZXJ2aWNlIGhhcyBzdGlsbCBzZWVuIHRoZSByZXF1ZXN0LCB0aGUgSVBDIHJvdW5kdHJp
cCBpcworICAgIC8vIHN0aWxsIGEgKHdlYWtlcikgbGluZWFyaXphdGlvbiBmZW5jZS4KKyAgICBj
YWxsYmFjaygpOworICB9KTsKKyAgcHJvZHVjZXJfcG9ydF8uU3luYyhwcm90b3M6Omdlbjo6U3lu
Y1JlcXVlc3QoKSwgc3RkOjptb3ZlKHJlc3ApKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPFRyYWNl
V3JpdGVyPiBQcm9kdWNlcklQQ0NsaWVudEltcGw6OkNyZWF0ZVRyYWNlV3JpdGVyKAorICAgIEJ1
ZmZlcklEIHRhcmdldF9idWZmZXIsCisgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5IGJ1ZmZlcl9l
eGhhdXN0ZWRfcG9saWN5KSB7CisgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkgZGlm
ZmVyZW50IHRocmVhZHMuIHxzaGFyZWRfbWVtb3J5X2FyYml0ZXJffCBpcworICAvLyB0aHJlYWQt
c2FmZSBidXQgYmUgYXdhcmUgb2YgYWNjZXNzaW5nIGFueSBvdGhlciBzdGF0ZSBpbiB0aGlzIGZ1
bmN0aW9uLgorICByZXR1cm4gc2hhcmVkX21lbW9yeV9hcmJpdGVyXy0+Q3JlYXRlVHJhY2VXcml0
ZXIodGFyZ2V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJ1ZmZlcl9leGhhdXN0ZWRfcG9saWN5KTsKK30KKworU2hhcmVkTWVtb3J5
QXJiaXRlciogUHJvZHVjZXJJUENDbGllbnRJbXBsOjpNYXliZVNoYXJlZE1lbW9yeUFyYml0ZXIo
KSB7CisgIHJldHVybiBzaGFyZWRfbWVtb3J5X2FyYml0ZXJfLmdldCgpOworfQorCitib29sIFBy
b2R1Y2VySVBDQ2xpZW50SW1wbDo6SXNTaG1lbVByb3ZpZGVkQnlQcm9kdWNlcigpIGNvbnN0IHsK
KyAgcmV0dXJuIGlzX3NobWVtX3Byb3ZpZGVkX2J5X3Byb2R1Y2VyXzsKK30KKwordm9pZCBQcm9k
dWNlcklQQ0NsaWVudEltcGw6Ok5vdGlmeUZsdXNoQ29tcGxldGUoRmx1c2hSZXF1ZXN0SUQgcmVx
X2lkKSB7CisgIHJldHVybiBzaGFyZWRfbWVtb3J5X2FyYml0ZXJfLT5Ob3RpZnlGbHVzaENvbXBs
ZXRlKHJlcV9pZCk7Cit9CisKK1NoYXJlZE1lbW9yeSogUHJvZHVjZXJJUENDbGllbnRJbXBsOjpz
aGFyZWRfbWVtb3J5KCkgY29uc3QgeworICByZXR1cm4gc2hhcmVkX21lbW9yeV8uZ2V0KCk7Cit9
CisKK3NpemVfdCBQcm9kdWNlcklQQ0NsaWVudEltcGw6OnNoYXJlZF9idWZmZXJfcGFnZV9zaXpl
X2tiKCkgY29uc3QgeworICByZXR1cm4gc2hhcmVkX2J1ZmZlcl9wYWdlX3NpemVfa2JfOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3Vy
Y2U6IHNyYy9pcGMvaG9zdF9pbXBsLmNjCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBzcmMvaXBjL2hvc3RfaW1wbC5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRy
b2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hl
IExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDov
L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVp
cmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQor
ICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFT
IElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0
aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRh
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTUkNfSVBDX0hPU1RfSU1Q
TF9IXworI2RlZmluZSBTUkNfSVBDX0hPU1RfSU1QTF9IXworCisjaW5jbHVkZSA8bWFwPgorI2lu
Y2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3Rhc2tfcnVu
bmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9l
eHQvYmFzZS90aHJlYWRfY2hlY2tlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vZXh0L2Jhc2UvdW5peF9zb2NrZXQuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvZGVmZXJyZWQuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9pcGMvaG9z
dC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAic3JjL2lwYy9idWZm
ZXJlZF9mcmFtZV9kZXNlcmlhbGl6ZXIuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVz
cGFjZSBpcGMgeworCitjbGFzcyBIb3N0SW1wbCA6IHB1YmxpYyBIb3N0LCBwdWJsaWMgYmFzZTo6
VW5peFNvY2tldDo6RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBIb3N0SW1wbChjb25zdCBj
aGFyKiBzb2NrZXRfbmFtZSwgYmFzZTo6VGFza1J1bm5lciopOworICBIb3N0SW1wbChiYXNlOjpT
Y29wZWRGaWxlIHNvY2tldF9mZCwgYmFzZTo6VGFza1J1bm5lciopOworICB+SG9zdEltcGwoKSBv
dmVycmlkZTsKKworICAvLyBIb3N0IGltcGxlbWVudGF0aW9uLgorICBib29sIEV4cG9zZVNlcnZp
Y2Uoc3RkOjp1bmlxdWVfcHRyPFNlcnZpY2U+KSBvdmVycmlkZTsKKworICAvLyBiYXNlOjpVbml4
U29ja2V0OjpFdmVudExpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICB2b2lkIE9uTmV3SW5jb21p
bmdDb25uZWN0aW9uKGJhc2U6OlVuaXhTb2NrZXQqLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpVbml4U29ja2V0Pikgb3ZlcnJpZGU7CisgIHZv
aWQgT25EaXNjb25uZWN0KGJhc2U6OlVuaXhTb2NrZXQqKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRh
dGFBdmFpbGFibGUoYmFzZTo6VW5peFNvY2tldCopIG92ZXJyaWRlOworCisgIGNvbnN0IGJhc2U6
OlVuaXhTb2NrZXQqIHNvY2soKSBjb25zdCB7IHJldHVybiBzb2NrXy5nZXQoKTsgfQorCisgcHJp
dmF0ZToKKyAgLy8gT3ducyB0aGUgcGVyLWNsaWVudCByZWNlaXZlIGJ1ZmZlciAoQnVmZmVyZWRG
cmFtZURlc2VyaWFsaXplcikuCisgIHN0cnVjdCBDbGllbnRDb25uZWN0aW9uIHsKKyAgICB+Q2xp
ZW50Q29ubmVjdGlvbigpOworICAgIENsaWVudElEIGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxi
YXNlOjpVbml4U29ja2V0PiBzb2NrOworICAgIEJ1ZmZlcmVkRnJhbWVEZXNlcmlhbGl6ZXIgZnJh
bWVfZGVzZXJpYWxpemVyOworICAgIGJhc2U6OlNjb3BlZEZpbGUgcmVjZWl2ZWRfZmQ7CisgIH07
CisgIHN0cnVjdCBFeHBvc2VkU2VydmljZSB7CisgICAgRXhwb3NlZFNlcnZpY2UoU2VydmljZUlE
LCBjb25zdCBzdGQ6OnN0cmluZyYsIHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlPik7CisgICAgfkV4
cG9zZWRTZXJ2aWNlKCk7CisgICAgRXhwb3NlZFNlcnZpY2UoRXhwb3NlZFNlcnZpY2UmJikgbm9l
eGNlcHQ7CisgICAgRXhwb3NlZFNlcnZpY2UmIG9wZXJhdG9yPShFeHBvc2VkU2VydmljZSYmKTsK
KworICAgIFNlcnZpY2VJRCBpZDsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHN0ZDo6dW5p
cXVlX3B0cjxTZXJ2aWNlPiBpbnN0YW5jZTsKKyAgfTsKKworICBIb3N0SW1wbChjb25zdCBIb3N0
SW1wbCYpID0gZGVsZXRlOworICBIb3N0SW1wbCYgb3BlcmF0b3I9KGNvbnN0IEhvc3RJbXBsJikg
PSBkZWxldGU7CisKKyAgYm9vbCBJbml0aWFsaXplKGNvbnN0IGNoYXIqIHNvY2tldF9uYW1lKTsK
KyAgdm9pZCBPblJlY2VpdmVkRnJhbWUoQ2xpZW50Q29ubmVjdGlvbiosIGNvbnN0IEZyYW1lJik7
CisgIHZvaWQgT25CaW5kU2VydmljZShDbGllbnRDb25uZWN0aW9uKiwgY29uc3QgRnJhbWUmKTsK
KyAgdm9pZCBPbkludm9rZU1ldGhvZChDbGllbnRDb25uZWN0aW9uKiwgY29uc3QgRnJhbWUmKTsK
KyAgdm9pZCBSZXBseVRvTWV0aG9kSW52b2NhdGlvbihDbGllbnRJRCwgUmVxdWVzdElELCBBc3lu
Y1Jlc3VsdDxQcm90b01lc3NhZ2U+KTsKKyAgY29uc3QgRXhwb3NlZFNlcnZpY2UqIEdldFNlcnZp
Y2VCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmKTsKKworICBzdGF0aWMgdm9pZCBTZW5kRnJhbWUo
Q2xpZW50Q29ubmVjdGlvbiosIGNvbnN0IEZyYW1lJiwgaW50IGZkID0gLTEpOworCisgIGJhc2U6
OlRhc2tSdW5uZXIqIGNvbnN0IHRhc2tfcnVubmVyXzsKKyAgc3RkOjptYXA8U2VydmljZUlELCBF
eHBvc2VkU2VydmljZT4gc2VydmljZXNfOworICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6VW5peFNv
Y2tldD4gc29ja187ICAvLyBUaGUgbGlzdGVuaW5nIHNvY2tldC4KKyAgc3RkOjptYXA8Q2xpZW50
SUQsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRDb25uZWN0aW9uPj4gY2xpZW50c187CisgIHN0ZDo6
bWFwPGJhc2U6OlVuaXhTb2NrZXQqLCBDbGllbnRDb25uZWN0aW9uKj4gY2xpZW50c19ieV9zb2Nr
ZXRfOworICBTZXJ2aWNlSUQgbGFzdF9zZXJ2aWNlX2lkXyA9IDA7CisgIENsaWVudElEIGxhc3Rf
Y2xpZW50X2lkXyA9IDA7CisgIFBFUkZFVFRPX1RIUkVBRF9DSEVDS0VSKHRocmVhZF9jaGVja2Vy
XykKKyAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8SG9zdEltcGw+IHdlYWtfcHRyX2ZhY3RvcnlfOyAg
Ly8gS2VlcCBsYXN0LgorfTsKKworfSAgLy8gbmFtZXNwYWNlIGlwYworfSAgLy8gbmFtZXNwYWNl
IHBlcmZldHRvCisKKyNlbmRpZiAgLy8gU1JDX0lQQ19IT1NUX0lNUExfSF8KKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExp
Y2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5z
ZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3
aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl
IGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0y
LjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRv
IGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBp
cyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVT
IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisg
KiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVy
bWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvaXBjL2hvc3RfaW1wbC5o
IgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNs
dWRlIDx1dGlsaXR5PgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9iYXNlL3Rhc2tfcnVubmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS91dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L2lwYy9zZXJ2aWNlLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvaXBjL3NlcnZpY2Vf
ZGVzY3JpcHRvci5oIgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
cm90b3MvcGVyZmV0dG8vaXBjL3dpcmVfcHJvdG9jb2wuZ2VuLmgiCisKKy8vIFRPRE8ocHJpbWlh
bm8pOiBwdXQgbGltaXRzIG9uICNjb25uZWN0aW9ucy91aWQgYW5kIHJlcS4gcXVldWUgKGIvNjkw
OTM3MDUpLgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGlwYyB7CisKKy8vIHN0
YXRpYworc3RkOjp1bmlxdWVfcHRyPEhvc3Q+IEhvc3Q6OkNyZWF0ZUluc3RhbmNlKGNvbnN0IGNo
YXIqIHNvY2tldF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxI
b3N0SW1wbD4gaG9zdChuZXcgSG9zdEltcGwoc29ja2V0X25hbWUsIHRhc2tfcnVubmVyKSk7Cisg
IGlmICghaG9zdC0+c29jaygpIHx8ICFob3N0LT5zb2NrKCktPmlzX2xpc3RlbmluZygpKQorICAg
IHJldHVybiBudWxscHRyOworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEhvc3Q+KHN0ZDo6bW92
ZShob3N0KSk7Cit9CisKKy8vIHN0YXRpYworc3RkOjp1bmlxdWVfcHRyPEhvc3Q+IEhvc3Q6OkNy
ZWF0ZUluc3RhbmNlKGJhc2U6OlNjb3BlZEZpbGUgc29ja2V0X2ZkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVy
KSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxIb3N0SW1wbD4gaG9zdCgKKyAgICAgIG5ldyBIb3N0SW1w
bChzdGQ6Om1vdmUoc29ja2V0X2ZkKSwgdGFza19ydW5uZXIpKTsKKyAgaWYgKCFob3N0LT5zb2Nr
KCkgfHwgIWhvc3QtPnNvY2soKS0+aXNfbGlzdGVuaW5nKCkpCisgICAgcmV0dXJuIG51bGxwdHI7
CisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8SG9zdD4oc3RkOjptb3ZlKGhvc3QpKTsKK30KKwor
SG9zdEltcGw6Okhvc3RJbXBsKGJhc2U6OlNjb3BlZEZpbGUgc29ja2V0X2ZkLCBiYXNlOjpUYXNr
UnVubmVyKiB0YXNrX3J1bm5lcikKKyAgICA6IHRhc2tfcnVubmVyXyh0YXNrX3J1bm5lciksIHdl
YWtfcHRyX2ZhY3RvcnlfKHRoaXMpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRf
Y2hlY2tlcl8pOworICBzb2NrXyA9IGJhc2U6OlVuaXhTb2NrZXQ6Okxpc3RlbihzdGQ6Om1vdmUo
c29ja2V0X2ZkKSwgdGhpcywgdGFza19ydW5uZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBiYXNlOjpTb2NrRmFtaWx5OjprVW5peCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYmFzZTo6U29ja1R5cGU6OmtTdHJlYW0pOworfQorCitIb3N0SW1wbDo6
SG9zdEltcGwoY29uc3QgY2hhciogc29ja2V0X25hbWUsIGJhc2U6OlRhc2tSdW5uZXIqIHRhc2tf
cnVubmVyKQorICAgIDogdGFza19ydW5uZXJfKHRhc2tfcnVubmVyKSwgd2Vha19wdHJfZmFjdG9y
eV8odGhpcykgeworICBQRVJGRVRUT19EQ0hFQ0tfVEhSRUFEKHRocmVhZF9jaGVja2VyXyk7Cisg
IHNvY2tfID0gYmFzZTo6VW5peFNvY2tldDo6TGlzdGVuKHNvY2tldF9uYW1lLCB0aGlzLCB0YXNr
X3J1bm5lcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlNvY2tG
YW1pbHk6OmtVbml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpT
b2NrVHlwZTo6a1N0cmVhbSk7Cit9CisKK0hvc3RJbXBsOjp+SG9zdEltcGwoKSA9IGRlZmF1bHQ7
CisKK2Jvb2wgSG9zdEltcGw6OkV4cG9zZVNlcnZpY2Uoc3RkOjp1bmlxdWVfcHRyPFNlcnZpY2U+
IHNlcnZpY2UpIHsKKyAgUEVSRkVUVE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOwor
ICBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lID0gc2VydmljZS0+R2V0RGVzY3JpcHRv
cigpLnNlcnZpY2VfbmFtZTsKKyAgaWYgKEdldFNlcnZpY2VCeU5hbWUoc2VydmljZV9uYW1lKSkg
eworICAgIFBFUkZFVFRPX0RMT0coIkR1cGxpY2F0ZSBFeHBvc2VTZXJ2aWNlKCk6ICVzIiwgc2Vy
dmljZV9uYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBTZXJ2aWNlSUQg
c2lkID0gKytsYXN0X3NlcnZpY2VfaWRfOworICBFeHBvc2VkU2VydmljZSBleHBvc2VkX3NlcnZp
Y2Uoc2lkLCBzZXJ2aWNlX25hbWUsIHN0ZDo6bW92ZShzZXJ2aWNlKSk7CisgIHNlcnZpY2VzXy5l
bXBsYWNlKHNpZCwgc3RkOjptb3ZlKGV4cG9zZWRfc2VydmljZSkpOworICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBIb3N0SW1wbDo6T25OZXdJbmNvbWluZ0Nvbm5lY3Rpb24oCisgICAgYmFzZTo6
VW5peFNvY2tldCosCisgICAgc3RkOjp1bmlxdWVfcHRyPGJhc2U6OlVuaXhTb2NrZXQ+IG5ld19j
b25uKSB7CisgIFBFUkZFVFRPX0RDSEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgc3Rk
Ojp1bmlxdWVfcHRyPENsaWVudENvbm5lY3Rpb24+IGNsaWVudChuZXcgQ2xpZW50Q29ubmVjdGlv
bigpKTsKKyAgQ2xpZW50SUQgY2xpZW50X2lkID0gKytsYXN0X2NsaWVudF9pZF87CisgIGNsaWVu
dHNfYnlfc29ja2V0X1tuZXdfY29ubi5nZXQoKV0gPSBjbGllbnQuZ2V0KCk7CisgIGNsaWVudC0+
aWQgPSBjbGllbnRfaWQ7CisgIGNsaWVudC0+c29jayA9IHN0ZDo6bW92ZShuZXdfY29ubik7Cisg
IGNsaWVudHNfW2NsaWVudF9pZF0gPSBzdGQ6Om1vdmUoY2xpZW50KTsKK30KKwordm9pZCBIb3N0
SW1wbDo6T25EYXRhQXZhaWxhYmxlKGJhc2U6OlVuaXhTb2NrZXQqIHNvY2spIHsKKyAgUEVSRkVU
VE9fRENIRUNLX1RIUkVBRCh0aHJlYWRfY2hlY2tlcl8pOworICBhdXRvIGl0ID0gY2xpZW50c19i
eV9zb2NrZXRfLmZpbmQoc29jayk7CisgIGlmIChpdCA9PSBjbGllbnRzX2J5X3NvY2tldF8uZW5k
KCkpCisgICAgcmV0dXJuOworICBDbGllbnRDb25uZWN0aW9uKiBjbGllbnQgPSBpdC0+c2Vjb25k
OworICBCdWZmZXJlZEZyYW1lRGVzZXJpYWxpemVyJiBmcmFtZV9kZXNlcmlhbGl6ZXIgPSBjbGll
bnQtPmZyYW1lX2Rlc2VyaWFsaXplcjsKKworICBzaXplX3QgcnNpemU7CisgIGRvIHsKKyAgICBh
dXRvIGJ1ZiA9IGZyYW1lX2Rlc2VyaWFsaXplci5CZWdpblJlY2VpdmUoKTsKKyAgICBiYXNlOjpT
Y29wZWRGaWxlIGZkOworICAgIHJzaXplID0gY2xpZW50LT5zb2NrLT5SZWNlaXZlKGJ1Zi5kYXRh
LCBidWYuc2l6ZSwgJmZkKTsKKyAgICBpZiAoZmQpIHsKKyAgICAgIFBFUkZFVFRPX0RDSEVDSygh
Y2xpZW50LT5yZWNlaXZlZF9mZCk7CisgICAgICBjbGllbnQtPnJlY2VpdmVkX2ZkID0gc3RkOjpt
b3ZlKGZkKTsKKyAgICB9CisgICAgaWYgKCFmcmFtZV9kZXNlcmlhbGl6ZXIuRW5kUmVjZWl2ZShy
c2l6ZSkpCisgICAgICByZXR1cm4gT25EaXNjb25uZWN0KGNsaWVudC0+c29jay5nZXQoKSk7Cisg
IH0gd2hpbGUgKHJzaXplID4gMCk7CisKKyAgZm9yICg7OykgeworICAgIHN0ZDo6dW5pcXVlX3B0
cjxGcmFtZT4gZnJhbWUgPSBmcmFtZV9kZXNlcmlhbGl6ZXIuUG9wTmV4dEZyYW1lKCk7CisgICAg
aWYgKCFmcmFtZSkKKyAgICAgIGJyZWFrOworICAgIE9uUmVjZWl2ZWRGcmFtZShjbGllbnQsICpm
cmFtZSk7CisgIH0KK30KKwordm9pZCBIb3N0SW1wbDo6T25SZWNlaXZlZEZyYW1lKENsaWVudENv
bm5lY3Rpb24qIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBG
cmFtZSYgcmVxX2ZyYW1lKSB7CisgIGlmIChyZXFfZnJhbWUuaGFzX21zZ19iaW5kX3NlcnZpY2Uo
KSkKKyAgICByZXR1cm4gT25CaW5kU2VydmljZShjbGllbnQsIHJlcV9mcmFtZSk7CisgIGlmIChy
ZXFfZnJhbWUuaGFzX21zZ19pbnZva2VfbWV0aG9kKCkpCisgICAgcmV0dXJuIE9uSW52b2tlTWV0
aG9kKGNsaWVudCwgcmVxX2ZyYW1lKTsKKworICBQRVJGRVRUT19ETE9HKCJSZWNlaXZlZCBpbnZh
bGlkIFJQQyBmcmFtZSBmcm9tIGNsaWVudCAlIiBQUkl1NjQsIGNsaWVudC0+aWQpOworICBGcmFt
ZSByZXBseV9mcmFtZTsKKyAgcmVwbHlfZnJhbWUuc2V0X3JlcXVlc3RfaWQocmVxX2ZyYW1lLnJl
cXVlc3RfaWQoKSk7CisgIHJlcGx5X2ZyYW1lLm11dGFibGVfbXNnX3JlcXVlc3RfZXJyb3IoKS0+
c2V0X2Vycm9yKCJ1bmtub3duIHJlcXVlc3QiKTsKKyAgU2VuZEZyYW1lKGNsaWVudCwgcmVwbHlf
ZnJhbWUpOworfQorCit2b2lkIEhvc3RJbXBsOjpPbkJpbmRTZXJ2aWNlKENsaWVudENvbm5lY3Rp
b24qIGNsaWVudCwgY29uc3QgRnJhbWUmIHJlcV9mcmFtZSkgeworICAvLyBCaW5kaW5nIGEgc2Vy
dmljZSBkb2Vzbid0IGRvIGFueXRoaW5nIG1ham9yLiBJdCBqdXN0IHJldHVybnMgYmFjayB0aGUK
KyAgLy8gc2VydmljZSBpZCBhbmQgaXRzIG1ldGhvZCBtYXAuCisgIGNvbnN0IEZyYW1lOjpCaW5k
U2VydmljZSYgcmVxID0gcmVxX2ZyYW1lLm1zZ19iaW5kX3NlcnZpY2UoKTsKKyAgRnJhbWUgcmVw
bHlfZnJhbWU7CisgIHJlcGx5X2ZyYW1lLnNldF9yZXF1ZXN0X2lkKHJlcV9mcmFtZS5yZXF1ZXN0
X2lkKCkpOworICBhdXRvKiByZXBseSA9IHJlcGx5X2ZyYW1lLm11dGFibGVfbXNnX2JpbmRfc2Vy
dmljZV9yZXBseSgpOworICBjb25zdCBFeHBvc2VkU2VydmljZSogc2VydmljZSA9IEdldFNlcnZp
Y2VCeU5hbWUocmVxLnNlcnZpY2VfbmFtZSgpKTsKKyAgaWYgKHNlcnZpY2UpIHsKKyAgICByZXBs
eS0+c2V0X3N1Y2Nlc3ModHJ1ZSk7CisgICAgcmVwbHktPnNldF9zZXJ2aWNlX2lkKHNlcnZpY2Ut
PmlkKTsKKyAgICB1aW50MzJfdCBtZXRob2RfaWQgPSAxOyAgLy8gbWV0aG9kIGlkcyBzdGFydCBh
dCBpbmRleCAxLgorICAgIGZvciAoY29uc3QgYXV0byYgZGVzY19tZXRob2QgOiBzZXJ2aWNlLT5p
bnN0YW5jZS0+R2V0RGVzY3JpcHRvcigpLm1ldGhvZHMpIHsKKyAgICAgIEZyYW1lOjpCaW5kU2Vy
dmljZVJlcGx5OjpNZXRob2RJbmZvKiBtZXRob2RfaW5mbyA9IHJlcGx5LT5hZGRfbWV0aG9kcygp
OworICAgICAgbWV0aG9kX2luZm8tPnNldF9uYW1lKGRlc2NfbWV0aG9kLm5hbWUpOworICAgICAg
bWV0aG9kX2luZm8tPnNldF9pZChtZXRob2RfaWQrKyk7CisgICAgfQorICB9CisgIFNlbmRGcmFt
ZShjbGllbnQsIHJlcGx5X2ZyYW1lKTsKK30KKwordm9pZCBIb3N0SW1wbDo6T25JbnZva2VNZXRo
b2QoQ2xpZW50Q29ubmVjdGlvbiogY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgRnJhbWUmIHJlcV9mcmFtZSkgeworICBjb25zdCBGcmFtZTo6SW52b2tlTWV0aG9k
JiByZXEgPSByZXFfZnJhbWUubXNnX2ludm9rZV9tZXRob2QoKTsKKyAgRnJhbWUgcmVwbHlfZnJh
bWU7CisgIFJlcXVlc3RJRCByZXF1ZXN0X2lkID0gcmVxX2ZyYW1lLnJlcXVlc3RfaWQoKTsKKyAg
cmVwbHlfZnJhbWUuc2V0X3JlcXVlc3RfaWQocmVxdWVzdF9pZCk7CisgIHJlcGx5X2ZyYW1lLm11
dGFibGVfbXNnX2ludm9rZV9tZXRob2RfcmVwbHkoKS0+c2V0X3N1Y2Nlc3MoZmFsc2UpOworICBh
dXRvIHN2Y19pdCA9IHNlcnZpY2VzXy5maW5kKHJlcS5zZXJ2aWNlX2lkKCkpOworICBpZiAoc3Zj
X2l0ID09IHNlcnZpY2VzXy5lbmQoKSkKKyAgICByZXR1cm4gU2VuZEZyYW1lKGNsaWVudCwgcmVw
bHlfZnJhbWUpOyAgLy8gfHN1Y2Nlc3N8ID09IGZhbHNlIGJ5IGRlZmF1bHQuCisKKyAgU2Vydmlj
ZSogc2VydmljZSA9IHN2Y19pdC0+c2Vjb25kLmluc3RhbmNlLmdldCgpOworICBjb25zdCBTZXJ2
aWNlRGVzY3JpcHRvciYgc3ZjID0gc2VydmljZS0+R2V0RGVzY3JpcHRvcigpOworICBjb25zdCBh
dXRvJiBtZXRob2RzID0gc3ZjLm1ldGhvZHM7CisgIGNvbnN0IHVpbnQzMl90IG1ldGhvZF9pZCA9
IHJlcS5tZXRob2RfaWQoKTsKKyAgaWYgKG1ldGhvZF9pZCA9PSAwIHx8IG1ldGhvZF9pZCA+IG1l
dGhvZHMuc2l6ZSgpKQorICAgIHJldHVybiBTZW5kRnJhbWUoY2xpZW50LCByZXBseV9mcmFtZSk7
CisKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3I6Ok1ldGhvZCYgbWV0aG9kID0gbWV0aG9kc1tt
ZXRob2RfaWQgLSAxXTsKKyAgc3RkOjp1bmlxdWVfcHRyPFByb3RvTWVzc2FnZT4gZGVjb2RlZF9y
ZXFfYXJncygKKyAgICAgIG1ldGhvZC5yZXF1ZXN0X3Byb3RvX2RlY29kZXIocmVxLmFyZ3NfcHJv
dG8oKSkpOworICBpZiAoIWRlY29kZWRfcmVxX2FyZ3MpCisgICAgcmV0dXJuIFNlbmRGcmFtZShj
bGllbnQsIHJlcGx5X2ZyYW1lKTsKKworICBEZWZlcnJlZDxQcm90b01lc3NhZ2U+IGRlZmVycmVk
X3JlcGx5OworICBiYXNlOjpXZWFrUHRyPEhvc3RJbXBsPiBob3N0X3dlYWtfcHRyID0gd2Vha19w
dHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOworICBDbGllbnRJRCBjbGllbnRfaWQgPSBjbGllbnQt
PmlkOworCisgIGlmICghcmVxLmRyb3BfcmVwbHkoKSkgeworICAgIGRlZmVycmVkX3JlcGx5LkJp
bmQoW2hvc3Rfd2Vha19wdHIsIGNsaWVudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXF1ZXN0X2lkXShBc3luY1Jlc3VsdDxQcm90b01lc3NhZ2U+IHJlcGx5KSB7CisgICAgICBpZiAo
IWhvc3Rfd2Vha19wdHIpCisgICAgICAgIHJldHVybjsgIC8vIFRoZSByZXBseSBjYW1lIHRvbyBs
YXRlLCB0aGUgSG9zdEltcGwgaGFzIGdvbmUuCisgICAgICBob3N0X3dlYWtfcHRyLT5SZXBseVRv
TWV0aG9kSW52b2NhdGlvbihjbGllbnRfaWQsIHJlcXVlc3RfaWQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocmVwbHkpKTsKKyAgICB9KTsK
KyAgfQorCisgIHNlcnZpY2UtPmNsaWVudF9pbmZvXyA9IENsaWVudEluZm8oY2xpZW50LT5pZCwg
Y2xpZW50LT5zb2NrLT5wZWVyX3VpZCgpKTsKKyAgc2VydmljZS0+cmVjZWl2ZWRfZmRfID0gJmNs
aWVudC0+cmVjZWl2ZWRfZmQ7CisgIG1ldGhvZC5pbnZva2VyKHNlcnZpY2UsICpkZWNvZGVkX3Jl
cV9hcmdzLCBzdGQ6Om1vdmUoZGVmZXJyZWRfcmVwbHkpKTsKKyAgc2VydmljZS0+cmVjZWl2ZWRf
ZmRfID0gbnVsbHB0cjsKKyAgc2VydmljZS0+Y2xpZW50X2luZm9fID0gQ2xpZW50SW5mbygpOwor
fQorCit2b2lkIEhvc3RJbXBsOjpSZXBseVRvTWV0aG9kSW52b2NhdGlvbihDbGllbnRJRCBjbGll
bnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQg
cmVxdWVzdF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5j
UmVzdWx0PFByb3RvTWVzc2FnZT4gcmVwbHkpIHsKKyAgYXV0byBjbGllbnRfaXRlciA9IGNsaWVu
dHNfLmZpbmQoY2xpZW50X2lkKTsKKyAgaWYgKGNsaWVudF9pdGVyID09IGNsaWVudHNfLmVuZCgp
KQorICAgIHJldHVybjsgIC8vIGNsaWVudCBoYXMgZGlzY29ubmVjdGVkIGJ5IHRoZSB0aW1lIHdl
IGdvdCB0aGUgYXN5bmMgcmVwbHkuCisKKyAgQ2xpZW50Q29ubmVjdGlvbiogY2xpZW50ID0gY2xp
ZW50X2l0ZXItPnNlY29uZC5nZXQoKTsKKyAgRnJhbWUgcmVwbHlfZnJhbWU7CisgIHJlcGx5X2Zy
YW1lLnNldF9yZXF1ZXN0X2lkKHJlcXVlc3RfaWQpOworCisgIC8vIFRPRE8oZm1heWVyKTogYWRk
IGEgdGVzdCB0byBndWFyYW50ZWUgdGhhdCB0aGUgcmVwbHkgaXMgY29uc3VtZWQgd2l0aGluIHRo
ZQorICAvLyBzYW1lIGNhbGwgc3RhY2sgYW5kIG5vdCBrZXB0IGFyb3VuZC4gQ29uc3VtZXJJUENT
ZXJ2aWNlOjpPblRyYWNlRGF0YSgpCisgIC8vIHJlbGllcyBvbiB0aGlzIGJlaGF2aW9yLgorICBh
dXRvKiByZXBseV9mcmFtZV9kYXRhID0gcmVwbHlfZnJhbWUubXV0YWJsZV9tc2dfaW52b2tlX21l
dGhvZF9yZXBseSgpOworICByZXBseV9mcmFtZV9kYXRhLT5zZXRfaGFzX21vcmUocmVwbHkuaGFz
X21vcmUoKSk7CisgIGlmIChyZXBseS5zdWNjZXNzKCkpIHsKKyAgICBzdGQ6OnN0cmluZyByZXBs
eV9wcm90byA9IHJlcGx5LT5TZXJpYWxpemVBc1N0cmluZygpOworICAgIHJlcGx5X2ZyYW1lX2Rh
dGEtPnNldF9yZXBseV9wcm90byhyZXBseV9wcm90byk7CisgICAgcmVwbHlfZnJhbWVfZGF0YS0+
c2V0X3N1Y2Nlc3ModHJ1ZSk7CisgIH0KKyAgU2VuZEZyYW1lKGNsaWVudCwgcmVwbHlfZnJhbWUs
IHJlcGx5LmZkKCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgSG9zdEltcGw6OlNlbmRGcmFtZShD
bGllbnRDb25uZWN0aW9uKiBjbGllbnQsIGNvbnN0IEZyYW1lJiBmcmFtZSwgaW50IGZkKSB7Cisg
IHN0ZDo6c3RyaW5nIGJ1ZiA9IEJ1ZmZlcmVkRnJhbWVEZXNlcmlhbGl6ZXI6OlNlcmlhbGl6ZShm
cmFtZSk7CisKKyAgLy8gVE9ETyhwcmltaWFubyk6IHRoaXMgc2hvdWxkIGRvIG5vbi1ibG9ja2lu
ZyBJL08uIEJ1dCB0aGVuIHdoYXQgaWYgdGhlCisgIC8vIHNvY2tldCBidWZmZXIgaXMgZnVsbD8g
V2UgbWlnaHQgd2FudCB0byBlaXRoZXIgZHJvcCB0aGUgcmVxdWVzdCBvciB0aHJvdHRsZQorICAv
LyB0aGUgc2VuZCBhbmQgUG9zdFRhc2sgdGhlIHJlcGx5IGxhdGVyPyBSaWdodCBub3cgd2UgYXJl
IG1ha2luZyBTZW5kKCkKKyAgLy8gYmxvY2tpbmcgYXMgYSB3b3JrYXJvdW5kLiBQcm9wYWdhdGUg
YmFrcHJlc3N1cmUgdG8gdGhlIGNhbGxlciBpbnN0ZWFkLgorICBib29sIHJlcyA9IGNsaWVudC0+
c29jay0+U2VuZChidWYuZGF0YSgpLCBidWYuc2l6ZSgpLCBmZCk7CisgIFBFUkZFVFRPX0NIRUNL
KHJlcyB8fCAhY2xpZW50LT5zb2NrLT5pc19jb25uZWN0ZWQoKSk7Cit9CisKK3ZvaWQgSG9zdElt
cGw6Ok9uRGlzY29ubmVjdChiYXNlOjpVbml4U29ja2V0KiBzb2NrKSB7CisgIFBFUkZFVFRPX0RD
SEVDS19USFJFQUQodGhyZWFkX2NoZWNrZXJfKTsKKyAgYXV0byBpdCA9IGNsaWVudHNfYnlfc29j
a2V0Xy5maW5kKHNvY2spOworICBpZiAoaXQgPT0gY2xpZW50c19ieV9zb2NrZXRfLmVuZCgpKQor
ICAgIHJldHVybjsKKyAgQ2xpZW50SUQgY2xpZW50X2lkID0gaXQtPnNlY29uZC0+aWQ7CisgIENs
aWVudEluZm8gY2xpZW50X2luZm8oY2xpZW50X2lkLCBzb2NrLT5wZWVyX3VpZCgpKTsKKyAgY2xp
ZW50c19ieV9zb2NrZXRfLmVyYXNlKGl0KTsKKyAgUEVSRkVUVE9fRENIRUNLKGNsaWVudHNfLmNv
dW50KGNsaWVudF9pZCkpOworICBjbGllbnRzXy5lcmFzZShjbGllbnRfaWQpOworCisgIGZvciAo
Y29uc3QgYXV0byYgc2VydmljZV9pdCA6IHNlcnZpY2VzXykgeworICAgIFNlcnZpY2UmIHNlcnZp
Y2UgPSAqc2VydmljZV9pdC5zZWNvbmQuaW5zdGFuY2U7CisgICAgc2VydmljZS5jbGllbnRfaW5m
b18gPSBjbGllbnRfaW5mbzsKKyAgICBzZXJ2aWNlLk9uQ2xpZW50RGlzY29ubmVjdGVkKCk7Cisg
ICAgc2VydmljZS5jbGllbnRfaW5mb18gPSBDbGllbnRJbmZvKCk7CisgIH0KK30KKworY29uc3Qg
SG9zdEltcGw6OkV4cG9zZWRTZXJ2aWNlKiBIb3N0SW1wbDo6R2V0U2VydmljZUJ5TmFtZSgKKyAg
ICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAvLyBUaGlzIGNvdWxkIGJlIG9wdGltaXpl
ZCBieSB1c2luZyBhbm90aGVyIG1hcDxuYW1lLFNlcnZpY2VJRD4uIEhvd2V2ZXIgdGhpcworICAv
LyBpcyB1c2VkIG9ubHkgYnkgQmluZC9FeHBvc2VTZXJ2aWNlIHRoYXQgYXJlIHF1aXRlIHJhcmUg
KG9uY2UgcGVyIGNsaWVudAorICAvLyBjb25uZWN0aW9uIGFuZCBvbmNlIHBlciBzZXJ2aWNlIGlu
c3RhbmNlKSwgbm90IHdvcnRoIGl0LgorICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogc2VydmljZXNf
KSB7CisgICAgaWYgKGl0LnNlY29uZC5uYW1lID09IG5hbWUpCisgICAgICByZXR1cm4gJml0LnNl
Y29uZDsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworSG9zdEltcGw6OkV4cG9zZWRTZXJ2
aWNlOjpFeHBvc2VkU2VydmljZShTZXJ2aWNlSUQgaWRfLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZV8sCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlPiBp
bnN0YW5jZV8pCisgICAgOiBpZChpZF8pLCBuYW1lKG5hbWVfKSwgaW5zdGFuY2Uoc3RkOjptb3Zl
KGluc3RhbmNlXykpIHt9CisKK0hvc3RJbXBsOjpFeHBvc2VkU2VydmljZTo6RXhwb3NlZFNlcnZp
Y2UoRXhwb3NlZFNlcnZpY2UmJikgbm9leGNlcHQgPSBkZWZhdWx0OworSG9zdEltcGw6OkV4cG9z
ZWRTZXJ2aWNlJiBIb3N0SW1wbDo6RXhwb3NlZFNlcnZpY2U6Om9wZXJhdG9yPSgKKyAgICBIb3N0
SW1wbDo6RXhwb3NlZFNlcnZpY2UmJikgPSBkZWZhdWx0OworSG9zdEltcGw6OkV4cG9zZWRTZXJ2
aWNlOjp+RXhwb3NlZFNlcnZpY2UoKSA9IGRlZmF1bHQ7CisKK0hvc3RJbXBsOjpDbGllbnRDb25u
ZWN0aW9uOjp+Q2xpZW50Q29ubmVjdGlvbigpID0gZGVmYXVsdDsKKworfSAgLy8gbmFtZXNwYWNl
IGlwYworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4g
c291cmNlOiBzcmMvdHJhY2luZy9pcGMvc2VydmljZS9jb25zdW1lcl9pcGNfc2VydmljZS5jYwor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogc3JjL3RyYWNpbmcvaXBjL3NlcnZpY2Uv
Y29uc3VtZXJfaXBjX3NlcnZpY2UuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5k
cm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNo
ZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1
c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZ
b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6
Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1
aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUK
KyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkg
S0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0
YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1JDX1RSQUNJTkdfSVBD
X1NFUlZJQ0VfQ09OU1VNRVJfSVBDX1NFUlZJQ0VfSF8KKyNkZWZpbmUgU1JDX1RSQUNJTkdfSVBD
X1NFUlZJQ0VfQ09OU1VNRVJfSVBDX1NFUlZJQ0VfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5j
bHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3dlYWtf
cHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9l
eHQvaXBjL2Jhc2ljX3R5cGVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL2NvbnN1bWVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3RyYWNp
bmdfc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vdHJhY2luZy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9pcGMvY29uc3VtZXJfcG9ydC5pcGMu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworbmFtZXNwYWNlIGlwYyB7CitjbGFzcyBIb3N0
OworfSAgLy8gbmFtZXNwYWNlIGlwYworCisvLyBJbXBsZW1lbnRzIHRoZSBDb25zdW1lciBwb3J0
IG9mIHRoZSBJUEMgc2VydmljZS4gVGhpcyBjbGFzcyBwcm94aWVzIHJlcXVlc3RzCisvLyBhbmQg
cmVzcG9uc2VzIGJldHdlZW4gdGhlIGNvcmUgc2VydmljZSBsb2dpYyAofHN2Y198KSBhbmQgcmVt
b3RlIENvbnN1bWVyKHMpCisvLyBvbiB0aGUgSVBDIHNvY2tldCwgdGhyb3VnaCB0aGUgbWV0aG9k
cyBvdmVycmlkZGRlbiBmcm9tIENvbnN1bWVyUG9ydC4KK2NsYXNzIENvbnN1bWVySVBDU2Vydmlj
ZSA6IHB1YmxpYyBwcm90b3M6Omdlbjo6Q29uc3VtZXJQb3J0IHsKKyBwdWJsaWM6CisgIGV4cGxp
Y2l0IENvbnN1bWVySVBDU2VydmljZShUcmFjaW5nU2VydmljZSogY29yZV9zZXJ2aWNlKTsKKyAg
fkNvbnN1bWVySVBDU2VydmljZSgpIG92ZXJyaWRlOworCisgIC8vIENvbnN1bWVyUG9ydCBpbXBs
ZW1lbnRhdGlvbiAoZnJvbSAucHJvdG8gSVBDIGRlZmluaXRpb24pLgorICB2b2lkIEVuYWJsZVRy
YWNpbmcoY29uc3QgcHJvdG9zOjpnZW46OkVuYWJsZVRyYWNpbmdSZXF1ZXN0JiwKKyAgICAgICAg
ICAgICAgICAgICAgIERlZmVycmVkRW5hYmxlVHJhY2luZ1Jlc3BvbnNlKSBvdmVycmlkZTsKKyAg
dm9pZCBTdGFydFRyYWNpbmcoY29uc3QgcHJvdG9zOjpnZW46OlN0YXJ0VHJhY2luZ1JlcXVlc3Qm
LAorICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZFN0YXJ0VHJhY2luZ1Jlc3BvbnNlKSBvdmVy
cmlkZTsKKyAgdm9pZCBDaGFuZ2VUcmFjZUNvbmZpZyhjb25zdCBwcm90b3M6Omdlbjo6Q2hhbmdl
VHJhY2VDb25maWdSZXF1ZXN0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZENo
YW5nZVRyYWNlQ29uZmlnUmVzcG9uc2UpIG92ZXJyaWRlOworICB2b2lkIERpc2FibGVUcmFjaW5n
KGNvbnN0IHByb3Rvczo6Z2VuOjpEaXNhYmxlVHJhY2luZ1JlcXVlc3QmLAorICAgICAgICAgICAg
ICAgICAgICAgIERlZmVycmVkRGlzYWJsZVRyYWNpbmdSZXNwb25zZSkgb3ZlcnJpZGU7CisgIHZv
aWQgUmVhZEJ1ZmZlcnMoY29uc3QgcHJvdG9zOjpnZW46OlJlYWRCdWZmZXJzUmVxdWVzdCYsCisg
ICAgICAgICAgICAgICAgICAgRGVmZXJyZWRSZWFkQnVmZmVyc1Jlc3BvbnNlKSBvdmVycmlkZTsK
KyAgdm9pZCBGcmVlQnVmZmVycyhjb25zdCBwcm90b3M6Omdlbjo6RnJlZUJ1ZmZlcnNSZXF1ZXN0
JiwKKyAgICAgICAgICAgICAgICAgICBEZWZlcnJlZEZyZWVCdWZmZXJzUmVzcG9uc2UpIG92ZXJy
aWRlOworICB2b2lkIEZsdXNoKGNvbnN0IHByb3Rvczo6Z2VuOjpGbHVzaFJlcXVlc3QmLCBEZWZl
cnJlZEZsdXNoUmVzcG9uc2UpIG92ZXJyaWRlOworICB2b2lkIERldGFjaChjb25zdCBwcm90b3M6
Omdlbjo6RGV0YWNoUmVxdWVzdCYsCisgICAgICAgICAgICAgIERlZmVycmVkRGV0YWNoUmVzcG9u
c2UpIG92ZXJyaWRlOworICB2b2lkIEF0dGFjaChjb25zdCBwcm90b3M6Omdlbjo6QXR0YWNoUmVx
dWVzdCYsCisgICAgICAgICAgICAgIERlZmVycmVkQXR0YWNoUmVzcG9uc2UpIG92ZXJyaWRlOwor
ICB2b2lkIEdldFRyYWNlU3RhdHMoY29uc3QgcHJvdG9zOjpnZW46OkdldFRyYWNlU3RhdHNSZXF1
ZXN0JiwKKyAgICAgICAgICAgICAgICAgICAgIERlZmVycmVkR2V0VHJhY2VTdGF0c1Jlc3BvbnNl
KSBvdmVycmlkZTsKKyAgdm9pZCBPYnNlcnZlRXZlbnRzKGNvbnN0IHByb3Rvczo6Z2VuOjpPYnNl
cnZlRXZlbnRzUmVxdWVzdCYsCisgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZE9ic2VydmVF
dmVudHNSZXNwb25zZSkgb3ZlcnJpZGU7CisgIHZvaWQgUXVlcnlTZXJ2aWNlU3RhdGUoY29uc3Qg
cHJvdG9zOjpnZW46OlF1ZXJ5U2VydmljZVN0YXRlUmVxdWVzdCYsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgRGVmZXJyZWRRdWVyeVNlcnZpY2VTdGF0ZVJlc3BvbnNlKSBvdmVycmlkZTsKKyAg
dm9pZCBRdWVyeUNhcGFiaWxpdGllcyhjb25zdCBwcm90b3M6Omdlbjo6UXVlcnlDYXBhYmlsaXRp
ZXNSZXF1ZXN0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZFF1ZXJ5Q2FwYWJp
bGl0aWVzUmVzcG9uc2UpIG92ZXJyaWRlOworICB2b2lkIE9uQ2xpZW50RGlzY29ubmVjdGVkKCkg
b3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICAvLyBBY3RzIGxpa2UgYSBDb25zdW1lciB3aXRoIHRo
ZSBjb3JlIFNlcnZpY2UgYnVzaW5lc3MgbG9naWMgKHdoaWNoIGRvZXNuJ3QKKyAgLy8ga25vdyBh
bnl0aGluZyBhYm91dCB0aGUgcmVtb3RlIHRyYW5zcG9ydCksIGJ1dCBhbGwgaXQgZG9lcyBpcyBw
cm94eWluZworICAvLyBtZXRob2RzIHRvIHRoZSByZW1vdGUgQ29uc3VtZXIgb24gdGhlIG90aGVy
IHNpZGUgb2YgdGhlIElQQyBjaGFubmVsLgorICBjbGFzcyBSZW1vdGVDb25zdW1lciA6IHB1Ymxp
YyBDb25zdW1lciB7CisgICBwdWJsaWM6CisgICAgUmVtb3RlQ29uc3VtZXIoKTsKKyAgICB+UmVt
b3RlQ29uc3VtZXIoKSBvdmVycmlkZTsKKworICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxl
ZCBieSB0aGUgfGNvcmVfc2VydmljZV98IGJ1c2luZXNzIGxvZ2ljLiBUaGVyZSBpcworICAgIC8v
IG5vIGNvbm5lY3Rpb24gaGVyZSwgdGhlc2UgbWV0aG9kcyBhcmUgcG9zdGVkIHN0cmFpZ2h0IGF3
YXkuCisgICAgdm9pZCBPbkNvbm5lY3QoKSBvdmVycmlkZTsKKyAgICB2b2lkIE9uRGlzY29ubmVj
dCgpIG92ZXJyaWRlOworICAgIHZvaWQgT25UcmFjaW5nRGlzYWJsZWQoKSBvdmVycmlkZTsKKyAg
ICB2b2lkIE9uVHJhY2VEYXRhKHN0ZDo6dmVjdG9yPFRyYWNlUGFja2V0PiwgYm9vbCBoYXNfbW9y
ZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBPbkRldGFjaChib29sKSBvdmVycmlkZTsKKyAgICB2b2lk
IE9uQXR0YWNoKGJvb2wsIGNvbnN0IFRyYWNlQ29uZmlnJikgb3ZlcnJpZGU7CisgICAgdm9pZCBP
blRyYWNlU3RhdHMoYm9vbCwgY29uc3QgVHJhY2VTdGF0cyYpIG92ZXJyaWRlOworICAgIHZvaWQg
T25PYnNlcnZhYmxlRXZlbnRzKGNvbnN0IE9ic2VydmFibGVFdmVudHMmKSBvdmVycmlkZTsKKwor
ICAgIHZvaWQgQ2xvc2VPYnNlcnZlRXZlbnRzUmVzcG9uc2VTdHJlYW0oKTsKKworICAgIC8vIFRo
ZSBpbnRlcmZhY2Ugb2J0YWluZWQgZnJvbSB0aGUgY29yZSBzZXJ2aWNlIGJ1c2luZXNzIGxvZ2lj
IHRocm91Z2gKKyAgICAvLyBUcmFjaW5nU2VydmljZTo6Q29ubmVjdENvbnN1bWVyKHRoaXMpLiBU
aGlzIGFsbG93cyB0byBpbnZva2UgbWV0aG9kcyBmb3IKKyAgICAvLyBhIHNwZWNpZmljIENvbnN1
bWVyIG9uIHRoZSBTZXJ2aWNlIGJ1c2luZXNzIGxvZ2ljLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxU
cmFjaW5nU2VydmljZTo6Q29uc3VtZXJFbmRwb2ludD4gc2VydmljZV9lbmRwb2ludDsKKworICAg
IC8vIEFmdGVyIFJlYWRCdWZmZXJzKCkgaXMgaW52b2tlZCwgdGhpcyBiaW5kcyB0aGUgYXN5bmMg
Y2FsbGJhY2sgdGhhdAorICAgIC8vIGFsbG93cyB0byBzdHJlYW0gdHJhY2UgcGFja2V0cyBiYWNr
IHRvIHRoZSBjbGllbnQuCisgICAgRGVmZXJyZWRSZWFkQnVmZmVyc1Jlc3BvbnNlIHJlYWRfYnVm
ZmVyc19yZXNwb25zZTsKKworICAgIC8vIEFmdGVyIEVuYWJsZVRyYWNpbmcoKSBpcyBpbnZva2Vk
LCB0aGlzIGJpbmRzIHRoZSBhc3luYyBjYWxsYmFjayB0aGF0CisgICAgLy8gYWxsb3dzIHRvIHNl
bmQgdGhlIE9uVHJhY2luZ0Rpc2FibGVkIG5vdGlmaWNhdGlvbi4KKyAgICBEZWZlcnJlZEVuYWJs
ZVRyYWNpbmdSZXNwb25zZSBlbmFibGVfdHJhY2luZ19yZXNwb25zZTsKKworICAgIC8vIEFmdGVy
IERldGFjaCgpIGlzIGludm9rZWQsIHRoaXMgYmluZHMgdGhlIGFzeW5jIGNhbGxiYWNrIHRoYXQg
YWxsb3dzIHRvCisgICAgLy8gc2VuZCB0aGUgc2Vzc2lvbiBpZCB0byB0aGUgY29uc3VtZXIuCisg
ICAgRGVmZXJyZWREZXRhY2hSZXNwb25zZSBkZXRhY2hfcmVzcG9uc2U7CisKKyAgICAvLyBBcyBh
Ym92ZSwgYnV0IGZvciB0aGUgQXR0YWNoKCkgY2FzZS4KKyAgICBEZWZlcnJlZEF0dGFjaFJlc3Bv
bnNlIGF0dGFjaF9yZXNwb25zZTsKKworICAgIC8vIEFzIGFib3ZlLCBidXQgZm9yIEdldFRyYWNl
U3RhdHMoKS4KKyAgICBEZWZlcnJlZEdldFRyYWNlU3RhdHNSZXNwb25zZSBnZXRfdHJhY2Vfc3Rh
dHNfcmVzcG9uc2U7CisKKyAgICAvLyBBZnRlciBPYnNlcnZlRXZlbnRzKCkgaXMgaW52b2tlZCwg
dGhpcyBiaW5kcyB0aGUgYXN5bmMgY2FsbGJhY2sgdGhhdAorICAgIC8vIGFsbG93cyB0byBzdHJl
YW0gT2JzZXJ2YWJsZUV2ZW50cyBiYWNrIHRvIHRoZSBjbGllbnQuCisgICAgRGVmZXJyZWRPYnNl
cnZlRXZlbnRzUmVzcG9uc2Ugb2JzZXJ2ZV9ldmVudHNfcmVzcG9uc2U7CisgIH07CisKKyAgLy8g
VGhpcyBoYXMgdG8gYmUgYSBjb250YWluZXIgdGhhdCBkb2Vzbid0IGludmFsaWRhdGUgaXRlcmF0
b3JzLgorICB1c2luZyBQZW5kaW5nRmx1c2hSZXNwb25zZXMgPSBzdGQ6Omxpc3Q8RGVmZXJyZWRG
bHVzaFJlc3BvbnNlPjsKKyAgdXNpbmcgUGVuZGluZ1F1ZXJ5U3ZjUmVzcG9uc2VzID0gc3RkOjps
aXN0PERlZmVycmVkUXVlcnlTZXJ2aWNlU3RhdGVSZXNwb25zZT47CisgIHVzaW5nIFBlbmRpbmdR
dWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlcyA9CisgICAgICBzdGQ6Omxpc3Q8RGVmZXJyZWRRdWVy
eUNhcGFiaWxpdGllc1Jlc3BvbnNlPjsKKworICBDb25zdW1lcklQQ1NlcnZpY2UoY29uc3QgQ29u
c3VtZXJJUENTZXJ2aWNlJikgPSBkZWxldGU7CisgIENvbnN1bWVySVBDU2VydmljZSYgb3BlcmF0
b3I9KGNvbnN0IENvbnN1bWVySVBDU2VydmljZSYpID0gZGVsZXRlOworCisgIC8vIFJldHVybnMg
dGhlIENvbnN1bWVyRW5kcG9pbnQgaW4gdGhlIGNvcmUgYnVzaW5lc3MgbG9naWMgdGhhdCBjb3Jy
ZXNwb25kcyB0bworICAvLyB0aGUgY3VycmVudCBJUEMgcmVxdWVzdC4KKyAgUmVtb3RlQ29uc3Vt
ZXIqIEdldENvbnN1bWVyRm9yQ3VycmVudFJlcXVlc3QoKTsKKworICB2b2lkIE9uRmx1c2hDYWxs
YmFjayhib29sIHN1Y2Nlc3MsIFBlbmRpbmdGbHVzaFJlc3BvbnNlczo6aXRlcmF0b3IpOworICB2
b2lkIE9uUXVlcnlTZXJ2aWNlQ2FsbGJhY2soYm9vbCBzdWNjZXNzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgVHJhY2luZ1NlcnZpY2VTdGF0ZSYsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBQZW5kaW5nUXVlcnlTdmNSZXNwb25zZXM6Oml0ZXJhdG9yKTsKKyAg
dm9pZCBPblF1ZXJ5Q2FwYWJpbGl0aWVzQ2FsbGJhY2soY29uc3QgVHJhY2luZ1NlcnZpY2VDYXBh
YmlsaXRpZXMmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nUXVl
cnlDYXBhYmlsaXRpZXNSZXNwb25zZXM6Oml0ZXJhdG9yKTsKKworICBUcmFjaW5nU2VydmljZSog
Y29uc3QgY29yZV9zZXJ2aWNlXzsKKworICAvLyBNYXBzIElQQyBjbGllbnRzIHRvIENvbnN1bWVy
RW5kcG9pbnQgaW5zdGFuY2VzIHJlZ2lzdGVyZWQgb24gdGhlCisgIC8vIHxjb3JlX3NlcnZpY2Vf
fCBidXNpbmVzcyBsb2dpYy4KKyAgc3RkOjptYXA8aXBjOjpDbGllbnRJRCwgc3RkOjp1bmlxdWVf
cHRyPFJlbW90ZUNvbnN1bWVyPj4gY29uc3VtZXJzXzsKKworICBQZW5kaW5nRmx1c2hSZXNwb25z
ZXMgcGVuZGluZ19mbHVzaF9yZXNwb25zZXNfOworICBQZW5kaW5nUXVlcnlTdmNSZXNwb25zZXMg
cGVuZGluZ19xdWVyeV9zZXJ2aWNlX3Jlc3BvbnNlc187CisgIFBlbmRpbmdRdWVyeUNhcGFiaWxp
dGllc1Jlc3BvbnNlcyBwZW5kaW5nX3F1ZXJ5X2NhcGFiaWxpdGllc19yZXNwb25zZXNfOworCisg
IGJhc2U6OldlYWtQdHJGYWN0b3J5PENvbnN1bWVySVBDU2VydmljZT4gd2Vha19wdHJfZmFjdG9y
eV87ICAvLyBLZWVwIGxhc3QuCit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2Vu
ZGlmICAvLyBTUkNfVFJBQ0lOR19JUENfU0VSVklDRV9DT05TVU1FUl9JUENfU0VSVklDRV9IXwor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInNyYy90cmFj
aW5nL2lwYy9zZXJ2aWNlL2NvbnN1bWVyX2lwY19zZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxpbnR0
eXBlcy5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2Jhc2UvdGFza19ydW5uZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC9iYXNlL3Njb3BlZF9maWxlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvaXBjL2Jhc2ljX3R5cGVz
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQv
aXBjL2hvc3QuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2V4dC90cmFjaW5nL2NvcmUvc2hhcmVkX21lbW9yeV9hYmkuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvc2xpY2Uu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2V4dC90
cmFjaW5nL2NvcmUvdHJhY2VfcGFja2V0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3RyYWNlX3N0YXRzLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9j
b3JlL3RyYWNpbmdfc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL3RyYWNlX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL3RyYWNpbmdf
c2VydmljZV9jYXBhYmlsaXRpZXMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS90cmFjaW5nX3NlcnZpY2Vfc3RhdGUuaCIKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKKworQ29uc3VtZXJJUENTZXJ2aWNlOjpDb25zdW1lcklQQ1Nl
cnZpY2UoVHJhY2luZ1NlcnZpY2UqIGNvcmVfc2VydmljZSkKKyAgICA6IGNvcmVfc2VydmljZV8o
Y29yZV9zZXJ2aWNlKSwgd2Vha19wdHJfZmFjdG9yeV8odGhpcykge30KKworQ29uc3VtZXJJUENT
ZXJ2aWNlOjp+Q29uc3VtZXJJUENTZXJ2aWNlKCkgPSBkZWZhdWx0OworCitDb25zdW1lcklQQ1Nl
cnZpY2U6OlJlbW90ZUNvbnN1bWVyKgorQ29uc3VtZXJJUENTZXJ2aWNlOjpHZXRDb25zdW1lckZv
ckN1cnJlbnRSZXF1ZXN0KCkgeworICBjb25zdCBpcGM6OkNsaWVudElEIGlwY19jbGllbnRfaWQg
PSBpcGM6OlNlcnZpY2U6OmNsaWVudF9pbmZvKCkuY2xpZW50X2lkKCk7CisgIGNvbnN0IHVpZF90
IHVpZCA9IGlwYzo6U2VydmljZTo6Y2xpZW50X2luZm8oKS51aWQoKTsKKyAgUEVSRkVUVE9fQ0hF
Q0soaXBjX2NsaWVudF9pZCk7CisgIGF1dG8gaXQgPSBjb25zdW1lcnNfLmZpbmQoaXBjX2NsaWVu
dF9pZCk7CisgIGlmIChpdCA9PSBjb25zdW1lcnNfLmVuZCgpKSB7CisgICAgYXV0byogcmVtb3Rl
X2NvbnN1bWVyID0gbmV3IFJlbW90ZUNvbnN1bWVyKCk7CisgICAgY29uc3VtZXJzX1tpcGNfY2xp
ZW50X2lkXS5yZXNldChyZW1vdGVfY29uc3VtZXIpOworICAgIHJlbW90ZV9jb25zdW1lci0+c2Vy
dmljZV9lbmRwb2ludCA9CisgICAgICAgIGNvcmVfc2VydmljZV8tPkNvbm5lY3RDb25zdW1lcihy
ZW1vdGVfY29uc3VtZXIsIHVpZCk7CisgICAgcmV0dXJuIHJlbW90ZV9jb25zdW1lcjsKKyAgfQor
ICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5
ZXIuCit2b2lkIENvbnN1bWVySVBDU2VydmljZTo6T25DbGllbnREaXNjb25uZWN0ZWQoKSB7Cisg
IGlwYzo6Q2xpZW50SUQgY2xpZW50X2lkID0gaXBjOjpTZXJ2aWNlOjpjbGllbnRfaW5mbygpLmNs
aWVudF9pZCgpOworICBjb25zdW1lcnNfLmVyYXNlKGNsaWVudF9pZCk7Cit9CisKKy8vIENhbGxl
ZCBieSB0aGUgSVBDIGxheWVyLgordm9pZCBDb25zdW1lcklQQ1NlcnZpY2U6OkVuYWJsZVRyYWNp
bmcoCisgICAgY29uc3QgcHJvdG9zOjpnZW46OkVuYWJsZVRyYWNpbmdSZXF1ZXN0JiByZXEsCisg
ICAgRGVmZXJyZWRFbmFibGVUcmFjaW5nUmVzcG9uc2UgcmVzcCkgeworICBSZW1vdGVDb25zdW1l
ciogcmVtb3RlX2NvbnN1bWVyID0gR2V0Q29uc3VtZXJGb3JDdXJyZW50UmVxdWVzdCgpOworICBp
ZiAocmVxLmF0dGFjaF9ub3RpZmljYXRpb25fb25seSgpKSB7CisgICAgcmVtb3RlX2NvbnN1bWVy
LT5lbmFibGVfdHJhY2luZ19yZXNwb25zZSA9IHN0ZDo6bW92ZShyZXNwKTsKKyAgICByZXR1cm47
CisgIH0KKyAgY29uc3QgVHJhY2VDb25maWcmIHRyYWNlX2NvbmZpZyA9IHJlcS50cmFjZV9jb25m
aWcoKTsKKyAgYmFzZTo6U2NvcGVkRmlsZSBmZDsKKyAgaWYgKHRyYWNlX2NvbmZpZy53cml0ZV9p
bnRvX2ZpbGUoKSAmJiB0cmFjZV9jb25maWcub3V0cHV0X3BhdGgoKS5lbXB0eSgpKQorICAgIGZk
ID0gaXBjOjpTZXJ2aWNlOjpUYWtlUmVjZWl2ZWRGRCgpOworICByZW1vdGVfY29uc3VtZXItPnNl
cnZpY2VfZW5kcG9pbnQtPkVuYWJsZVRyYWNpbmcodHJhY2VfY29uZmlnLCBzdGQ6Om1vdmUoZmQp
KTsKKyAgcmVtb3RlX2NvbnN1bWVyLT5lbmFibGVfdHJhY2luZ19yZXNwb25zZSA9IHN0ZDo6bW92
ZShyZXNwKTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIuCit2b2lkIENvbnN1bWVy
SVBDU2VydmljZTo6U3RhcnRUcmFjaW5nKGNvbnN0IHByb3Rvczo6Z2VuOjpTdGFydFRyYWNpbmdS
ZXF1ZXN0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWRT
dGFydFRyYWNpbmdSZXNwb25zZSByZXNwKSB7CisgIFJlbW90ZUNvbnN1bWVyKiByZW1vdGVfY29u
c3VtZXIgPSBHZXRDb25zdW1lckZvckN1cnJlbnRSZXF1ZXN0KCk7CisgIHJlbW90ZV9jb25zdW1l
ci0+c2VydmljZV9lbmRwb2ludC0+U3RhcnRUcmFjaW5nKCk7CisgIHJlc3AuUmVzb2x2ZShpcGM6
OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpTdGFydFRyYWNpbmdSZXNwb25zZT46OkNyZWF0ZSgp
KTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIuCit2b2lkIENvbnN1bWVySVBDU2Vy
dmljZTo6Q2hhbmdlVHJhY2VDb25maWcoCisgICAgY29uc3QgcHJvdG9zOjpnZW46OkNoYW5nZVRy
YWNlQ29uZmlnUmVxdWVzdCYgcmVxLAorICAgIERlZmVycmVkQ2hhbmdlVHJhY2VDb25maWdSZXNw
b25zZSByZXNwKSB7CisgIFJlbW90ZUNvbnN1bWVyKiByZW1vdGVfY29uc3VtZXIgPSBHZXRDb25z
dW1lckZvckN1cnJlbnRSZXF1ZXN0KCk7CisgIHJlbW90ZV9jb25zdW1lci0+c2VydmljZV9lbmRw
b2ludC0+Q2hhbmdlVHJhY2VDb25maWcocmVxLnRyYWNlX2NvbmZpZygpKTsKKyAgcmVzcC5SZXNv
bHZlKAorICAgICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6Q2hhbmdlVHJhY2VDb25m
aWdSZXNwb25zZT46OkNyZWF0ZSgpKTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIu
Cit2b2lkIENvbnN1bWVySVBDU2VydmljZTo6RGlzYWJsZVRyYWNpbmcoCisgICAgY29uc3QgcHJv
dG9zOjpnZW46OkRpc2FibGVUcmFjaW5nUmVxdWVzdCYsCisgICAgRGVmZXJyZWREaXNhYmxlVHJh
Y2luZ1Jlc3BvbnNlIHJlc3ApIHsKKyAgR2V0Q29uc3VtZXJGb3JDdXJyZW50UmVxdWVzdCgpLT5z
ZXJ2aWNlX2VuZHBvaW50LT5EaXNhYmxlVHJhY2luZygpOworICByZXNwLlJlc29sdmUoaXBjOjpB
c3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6RGlzYWJsZVRyYWNpbmdSZXNwb25zZT46OkNyZWF0ZSgp
KTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIuCit2b2lkIENvbnN1bWVySVBDU2Vy
dmljZTo6UmVhZEJ1ZmZlcnMoY29uc3QgcHJvdG9zOjpnZW46OlJlYWRCdWZmZXJzUmVxdWVzdCYs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWRSZWFkQnVmZmVy
c1Jlc3BvbnNlIHJlc3ApIHsKKyAgUmVtb3RlQ29uc3VtZXIqIHJlbW90ZV9jb25zdW1lciA9IEdl
dENvbnN1bWVyRm9yQ3VycmVudFJlcXVlc3QoKTsKKyAgcmVtb3RlX2NvbnN1bWVyLT5yZWFkX2J1
ZmZlcnNfcmVzcG9uc2UgPSBzdGQ6Om1vdmUocmVzcCk7CisgIHJlbW90ZV9jb25zdW1lci0+c2Vy
dmljZV9lbmRwb2ludC0+UmVhZEJ1ZmZlcnMoKTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMg
bGF5ZXIuCit2b2lkIENvbnN1bWVySVBDU2VydmljZTo6RnJlZUJ1ZmZlcnMoY29uc3QgcHJvdG9z
OjpnZW46OkZyZWVCdWZmZXJzUmVxdWVzdCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgRGVmZXJyZWRGcmVlQnVmZmVyc1Jlc3BvbnNlIHJlc3ApIHsKKyAgR2V0Q29uc3Vt
ZXJGb3JDdXJyZW50UmVxdWVzdCgpLT5zZXJ2aWNlX2VuZHBvaW50LT5GcmVlQnVmZmVycygpOwor
ICByZXNwLlJlc29sdmUoaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6RnJlZUJ1ZmZlcnNS
ZXNwb25zZT46OkNyZWF0ZSgpKTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIuCit2
b2lkIENvbnN1bWVySVBDU2VydmljZTo6Rmx1c2goY29uc3QgcHJvdG9zOjpnZW46OkZsdXNoUmVx
dWVzdCYgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVycmVkRmx1c2hS
ZXNwb25zZSByZXNwKSB7CisgIGF1dG8gaXQgPSBwZW5kaW5nX2ZsdXNoX3Jlc3BvbnNlc18uaW5z
ZXJ0KHBlbmRpbmdfZmx1c2hfcmVzcG9uc2VzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHJlc3ApKTsKKyAgYXV0byB3ZWFrX3Ro
aXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIGF1dG8gY2FsbGJhY2sgPSBb
d2Vha190aGlzLCBpdF0oYm9vbCBzdWNjZXNzKSB7CisgICAgaWYgKHdlYWtfdGhpcykKKyAgICAg
IHdlYWtfdGhpcy0+T25GbHVzaENhbGxiYWNrKHN1Y2Nlc3MsIHN0ZDo6bW92ZShpdCkpOworICB9
OworICBHZXRDb25zdW1lckZvckN1cnJlbnRSZXF1ZXN0KCktPnNlcnZpY2VfZW5kcG9pbnQtPkZs
dXNoKHJlcS50aW1lb3V0X21zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNhbGxiYWNrKSk7Cit9CisKKy8vIENh
bGxlZCBieSB0aGUgSVBDIGxheWVyLgordm9pZCBDb25zdW1lcklQQ1NlcnZpY2U6OkRldGFjaChj
b25zdCBwcm90b3M6Omdlbjo6RGV0YWNoUmVxdWVzdCYgcmVxLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBEZWZlcnJlZERldGFjaFJlc3BvbnNlIHJlc3ApIHsKKyAgLy8gT25EZXRh
Y2goKSB3aWxsIHJlc29sdmUgdGhlIHxkZXRhY2hfcmVzcG9uc2V8LgorICBSZW1vdGVDb25zdW1l
ciogcmVtb3RlX2NvbnN1bWVyID0gR2V0Q29uc3VtZXJGb3JDdXJyZW50UmVxdWVzdCgpOworICBy
ZW1vdGVfY29uc3VtZXItPmRldGFjaF9yZXNwb25zZSA9IHN0ZDo6bW92ZShyZXNwKTsKKyAgcmVt
b3RlX2NvbnN1bWVyLT5zZXJ2aWNlX2VuZHBvaW50LT5EZXRhY2gocmVxLmtleSgpKTsKK30KKwor
Ly8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIuCit2b2lkIENvbnN1bWVySVBDU2VydmljZTo6QXR0
YWNoKGNvbnN0IHByb3Rvczo6Z2VuOjpBdHRhY2hSZXF1ZXN0JiByZXEsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIERlZmVycmVkQXR0YWNoUmVzcG9uc2UgcmVzcCkgeworICAvLyBP
bkF0dGFjaCgpIHdpbGwgcmVzb2x2ZSB0aGUgfGF0dGFjaF9yZXNwb25zZXwuCisgIFJlbW90ZUNv
bnN1bWVyKiByZW1vdGVfY29uc3VtZXIgPSBHZXRDb25zdW1lckZvckN1cnJlbnRSZXF1ZXN0KCk7
CisgIHJlbW90ZV9jb25zdW1lci0+YXR0YWNoX3Jlc3BvbnNlID0gc3RkOjptb3ZlKHJlc3ApOwor
ICByZW1vdGVfY29uc3VtZXItPnNlcnZpY2VfZW5kcG9pbnQtPkF0dGFjaChyZXEua2V5KCkpOwor
fQorCisvLyBDYWxsZWQgYnkgdGhlIElQQyBsYXllci4KK3ZvaWQgQ29uc3VtZXJJUENTZXJ2aWNl
OjpHZXRUcmFjZVN0YXRzKGNvbnN0IHByb3Rvczo6Z2VuOjpHZXRUcmFjZVN0YXRzUmVxdWVzdCYs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZEdldFRyYWNl
U3RhdHNSZXNwb25zZSByZXNwKSB7CisgIC8vIE9uVHJhY2VTdGF0cygpIHdpbGwgcmVzb2x2ZSB0
aGUgfGdldF90cmFjZV9zdGF0c19yZXNwb25zZXwuCisgIFJlbW90ZUNvbnN1bWVyKiByZW1vdGVf
Y29uc3VtZXIgPSBHZXRDb25zdW1lckZvckN1cnJlbnRSZXF1ZXN0KCk7CisgIHJlbW90ZV9jb25z
dW1lci0+Z2V0X3RyYWNlX3N0YXRzX3Jlc3BvbnNlID0gc3RkOjptb3ZlKHJlc3ApOworICByZW1v
dGVfY29uc3VtZXItPnNlcnZpY2VfZW5kcG9pbnQtPkdldFRyYWNlU3RhdHMoKTsKK30KKworLy8g
Q2FsbGVkIGJ5IHRoZSBJUEMgbGF5ZXIuCit2b2lkIENvbnN1bWVySVBDU2VydmljZTo6T2JzZXJ2
ZUV2ZW50cygKKyAgICBjb25zdCBwcm90b3M6Omdlbjo6T2JzZXJ2ZUV2ZW50c1JlcXVlc3QmIHJl
cSwKKyAgICBEZWZlcnJlZE9ic2VydmVFdmVudHNSZXNwb25zZSByZXNwKSB7CisgIFJlbW90ZUNv
bnN1bWVyKiByZW1vdGVfY29uc3VtZXIgPSBHZXRDb25zdW1lckZvckN1cnJlbnRSZXF1ZXN0KCk7
CisKKyAgLy8gSWYgdGhlcmUncyBhIHByaW9yIHN0cmVhbSwgY2xvc2UgaXQgc28gdGhhdCBjbGll
bnQgY2FuIGNsZWFuIGl0IHVwLgorICByZW1vdGVfY29uc3VtZXItPkNsb3NlT2JzZXJ2ZUV2ZW50
c1Jlc3BvbnNlU3RyZWFtKCk7CisKKyAgcmVtb3RlX2NvbnN1bWVyLT5vYnNlcnZlX2V2ZW50c19y
ZXNwb25zZSA9IHN0ZDo6bW92ZShyZXNwKTsKKworICB1aW50MzJfdCBldmVudHNfbWFzayA9IDA7
CisgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHJlcS5ldmVudHNfdG9fb2JzZXJ2ZSgpKSB7Cisg
ICAgZXZlbnRzX21hc2sgfD0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHR5cGUpOworICB9CisgIHJl
bW90ZV9jb25zdW1lci0+c2VydmljZV9lbmRwb2ludC0+T2JzZXJ2ZUV2ZW50cyhldmVudHNfbWFz
ayk7CisKKyAgLy8gSWYgbm8gZXZlbnRzIGFyZSB0byBiZSBvYnNlcnZlZCwgY2xvc2UgdGhlIHN0
cmVhbSBpbW1lZGlhdGVseSBzbyB0aGF0IHRoZQorICAvLyBjbGllbnQgY2FuIGNsZWFuIHVwLgor
ICBpZiAoZXZlbnRzX21hc2sgPT0gMCkKKyAgICByZW1vdGVfY29uc3VtZXItPkNsb3NlT2JzZXJ2
ZUV2ZW50c1Jlc3BvbnNlU3RyZWFtKCk7Cit9CisKKy8vIENhbGxlZCBieSB0aGUgSVBDIGxheWVy
Lgordm9pZCBDb25zdW1lcklQQ1NlcnZpY2U6OlF1ZXJ5U2VydmljZVN0YXRlKAorICAgIGNvbnN0
IHByb3Rvczo6Z2VuOjpRdWVyeVNlcnZpY2VTdGF0ZVJlcXVlc3QmLAorICAgIERlZmVycmVkUXVl
cnlTZXJ2aWNlU3RhdGVSZXNwb25zZSByZXNwKSB7CisgIFJlbW90ZUNvbnN1bWVyKiByZW1vdGVf
Y29uc3VtZXIgPSBHZXRDb25zdW1lckZvckN1cnJlbnRSZXF1ZXN0KCk7CisgIGF1dG8gaXQgPSBw
ZW5kaW5nX3F1ZXJ5X3NlcnZpY2VfcmVzcG9uc2VzXy5pbnNlcnQoCisgICAgICBwZW5kaW5nX3F1
ZXJ5X3NlcnZpY2VfcmVzcG9uc2VzXy5lbmQoKSwgc3RkOjptb3ZlKHJlc3ApKTsKKyAgYXV0byB3
ZWFrX3RoaXMgPSB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7CisgIGF1dG8gY2FsbGJh
Y2sgPSBbd2Vha190aGlzLCBpdF0oYm9vbCBzdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFRyYWNpbmdTZXJ2aWNlU3RhdGUmIHN2Y19zdGF0ZSkgeworICAg
IGlmICh3ZWFrX3RoaXMpCisgICAgICB3ZWFrX3RoaXMtPk9uUXVlcnlTZXJ2aWNlQ2FsbGJhY2so
c3VjY2Vzcywgc3ZjX3N0YXRlLCBzdGQ6Om1vdmUoaXQpKTsKKyAgfTsKKyAgcmVtb3RlX2NvbnN1
bWVyLT5zZXJ2aWNlX2VuZHBvaW50LT5RdWVyeVNlcnZpY2VTdGF0ZShjYWxsYmFjayk7Cit9CisK
Ky8vIENhbGxlZCBieSB0aGUgc2VydmljZSBpbiByZXNwb25zZSB0byBzZXJ2aWNlX2VuZHBvaW50
LT5RdWVyeVNlcnZpY2VTdGF0ZSgpLgordm9pZCBDb25zdW1lcklQQ1NlcnZpY2U6Ok9uUXVlcnlT
ZXJ2aWNlQ2FsbGJhY2soCisgICAgYm9vbCBzdWNjZXNzLAorICAgIGNvbnN0IFRyYWNpbmdTZXJ2
aWNlU3RhdGUmIHN2Y19zdGF0ZSwKKyAgICBQZW5kaW5nUXVlcnlTdmNSZXNwb25zZXM6Oml0ZXJh
dG9yIHBlbmRpbmdfcmVzcG9uc2VfaXQpIHsKKyAgRGVmZXJyZWRRdWVyeVNlcnZpY2VTdGF0ZVJl
c3BvbnNlIHJlc3BvbnNlKHN0ZDo6bW92ZSgqcGVuZGluZ19yZXNwb25zZV9pdCkpOworICBwZW5k
aW5nX3F1ZXJ5X3NlcnZpY2VfcmVzcG9uc2VzXy5lcmFzZShwZW5kaW5nX3Jlc3BvbnNlX2l0KTsK
KyAgaWYgKCFzdWNjZXNzKSB7CisgICAgcmVzcG9uc2UuUmVqZWN0KCk7CisgICAgcmV0dXJuOwor
ICB9CisKKyAgLy8gVGhlIFRyYWNpbmdTZXJ2aWNlU3RhdGUgb2JqZWN0IG1pZ2h0IGJlIHRvbyBi
aWcgdG8gZml0IGludG8gYSBzaW5nbGUgSVBDCisgIC8vIG1lc3NhZ2UgYmVjYXVzZSBpdCBjb250
YWlucyB0aGUgRGF0YVNvdXJjZURlc2NyaXB0b3Igb2YgZWFjaCBkYXRhIHNvdXJjZS4KKyAgLy8g
SGVyZSB3ZSBzcGxpdCBpdCBpbiBjaHVua3MgdG8gZml0IGluIHRoZSBJUEMgbGltaXQsIG9ic2Vy
dmluZyB0aGUKKyAgLy8gZm9sbG93aW5nIHJ1bGU6IGVhY2ggY2h1bmsgbXVzdCBiZSBpbnZpZGlk
dWFsbHkgYSB2YWxpZCBUcmFjaW5nU2VydmljZVN0YXRlCisgIC8vIG1lc3NhZ2U7IGFsbCB0aGUg
Y2h1bmtzIGNvbmNhdGVuYXRlZCB0b2dldGhlciBtdXN0IGZvcm0gdGhlIG9yaWdpbmFsCisgIC8v
IG1lc3NhZ2UuIFRoaXMgaXMgdG8gZGVhbCB3aXRoIHRoZSBsZWdhY3kgQVBJIHRoYXQgd2FzIGp1
c3Qgc2VuZGluZyBvbmUKKyAgLy8gd2hvbGUgbWVzc2FnZSAoZmFpbGluZyBpbiBwcmVzZW5jZSBv
ZiB0b28gbWFueSBkYXRhIHNvdXJjZXMsIGIvMTUzMTQyMTE0KS4KKyAgLy8gVGhlIG1lc3NhZ2Ug
aXMgc3BsaXQgYXMgZm9sbG93czogd2UgdGFrZSB0aGUgd2hvbGUgVHJhY2luZ1NlcnZpY2VTdGF0
ZSwKKyAgLy8gdGFrZSBvdXQgdGhlIGRhdGEgc291cmNlcyBzZWN0aW9uICh3aGljaCBpcyBhIHRv
cC1sZXZlbCByZXBlYXRlZCBmaWVsZCkKKyAgLy8gYW5kIHJlLWFkZCB0aGVtIG9uZS1ieS1vbmUu
IElmLCBpbiB0aGUgcHJvY2VzcyBvZiBhcHBlbmRpbmcsIHRoZSBJUEMgbXNnCisgIC8vIHNpemUg
aXMgcmVhY2hlZCwgYSBuZXcgY2h1bmsgaXMgY3JlYXRlZC4gVGhpcyBhc3N1bWVzIHRoYXQgdGhl
IHJlc3Qgb2YKKyAgLy8gVHJhY2luZ1NlcnZpY2VTdGF0ZSBmaXRzIGluIG9uZSBJUEMgbWVzc2Fn
ZSBhbmQgZWFjaCBEYXRhU291cmNlRGVzY3JpcHRvcgorICAvLyBmaXRzIGluIHRoZSB3b3JzdCBj
YXNlIGluIGEgZGVkaWNhdGVkIG1lc3NhZ2UgKHdoaWNoIGlzIHRydWUsIGJlY2F1c2UKKyAgLy8g
b3RoZXJ3aXNlIHRoZSBSZWdpc3RlckRhdGFTb3VyY2UoKSB3aGljaCBwYXNzZXMgdGhlIGRlc2Ny
aXB0b3IgaW4gdGhlIGZpcnN0CisgIC8vIHBsYWNlIHdvdWxkIGZhaWwpLgorCisgIHN0ZDo6dmVj
dG9yPHVpbnQ4X3Q+IGNodW5rZWRfcmVwbHk7CisKKyAgLy8gVHJhbnNtaXRzIHRoZSBjdXJyZW50
IGNodW5rIGFuZCBzdGFydHMgYSBuZXcgb25lLgorICBib29sIHNlbnRfZW9mID0gZmFsc2U7Cisg
IGF1dG8gc2VuZF9jaHVua2VkX3JlcGx5ID0gWyZjaHVua2VkX3JlcGx5LCAmcmVzcG9uc2UsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZW50X2VvZl0oYm9vbCBoYXNfbW9yZSkgewor
ICAgIFBFUkZFVFRPX0NIRUNLKCFzZW50X2VvZik7CisgICAgc2VudF9lb2YgPSAhaGFzX21vcmU7
CisgICAgYXV0byByZXNwID0KKyAgICAgICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6
UXVlcnlTZXJ2aWNlU3RhdGVSZXNwb25zZT46OkNyZWF0ZSgpOworICAgIHJlc3Auc2V0X2hhc19t
b3JlKGhhc19tb3JlKTsKKyAgICBQRVJGRVRUT19DSEVDSyhyZXNwLT5tdXRhYmxlX3NlcnZpY2Vf
c3RhdGUoKS0+UGFyc2VGcm9tQXJyYXkoCisgICAgICAgIGNodW5rZWRfcmVwbHkuZGF0YSgpLCBj
aHVua2VkX3JlcGx5LnNpemUoKSkpOworICAgIGNodW5rZWRfcmVwbHkuY2xlYXIoKTsKKyAgICBy
ZXNwb25zZS5SZXNvbHZlKHN0ZDo6bW92ZShyZXNwKSk7CisgIH07CisKKyAgLy8gQ3JlYXRlIGEg
Y29weSBvZiB0aGUgd2hvbGUgcmVzcG9uc2UgYW5kIGN1dCBhd2F5IHRoZSBkYXRhX3NvdXJjZXMg
c2VjdGlvbi4KKyAgcHJvdG9zOjpnZW46OlRyYWNpbmdTZXJ2aWNlU3RhdGUgc3ZjX3N0YXRlX2Nv
cHkgPSBzdmNfc3RhdGU7CisgIGF1dG8gZGF0YV9zb3VyY2VzID0gc3RkOjptb3ZlKCpzdmNfc3Rh
dGVfY29weS5tdXRhYmxlX2RhdGFfc291cmNlcygpKTsKKyAgY2h1bmtlZF9yZXBseSA9IHN2Y19z
dGF0ZV9jb3B5LlNlcmlhbGl6ZUFzQXJyYXkoKTsKKworICAvLyBOb3cgcmUtYWRkIHRoZW0gZml0
dGluZyB3aXRoaW4gdGhlIElQQyBtZXNzYWdlIGxpbWl0cyAoLSBzb21lIG1hcmdpbiBmb3IKKyAg
Ly8gdGhlIG91dGVyIElQQyBmcmFtZSkuCisgIGNvbnN0ZXhwciBzaXplX3Qga01heE1zZ1NpemUg
PSBpcGM6OmtJUENCdWZmZXJTaXplIC0gMTI4OworICBmb3IgKGNvbnN0IGF1dG8mIGRhdGFfc291
cmNlIDogZGF0YV9zb3VyY2VzKSB7CisgICAgcHJvdG9zOjpnZW46OlRyYWNpbmdTZXJ2aWNlU3Rh
dGUgdG1wOworICAgIHRtcC5tdXRhYmxlX2RhdGFfc291cmNlcygpLT5lbXBsYWNlX2JhY2soc3Rk
Ojptb3ZlKGRhdGFfc291cmNlKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY2h1bmsgPSB0
bXAuU2VyaWFsaXplQXNBcnJheSgpOworICAgIGlmIChjaHVua2VkX3JlcGx5LnNpemUoKSArIGNo
dW5rLnNpemUoKSA8IGtNYXhNc2dTaXplKSB7CisgICAgICBjaHVua2VkX3JlcGx5Lmluc2VydChj
aHVua2VkX3JlcGx5LmVuZCgpLCBjaHVuay5iZWdpbigpLCBjaHVuay5lbmQoKSk7CisgICAgfSBl
bHNlIHsKKyAgICAgIHNlbmRfY2h1bmtlZF9yZXBseSgvKmhhc19tb3JlPSovdHJ1ZSk7CisgICAg
ICBjaHVua2VkX3JlcGx5ID0gc3RkOjptb3ZlKGNodW5rKTsKKyAgICB9CisgIH0KKworICBQRVJG
RVRUT19EQ0hFQ0soIWNodW5rZWRfcmVwbHkuZW1wdHkoKSk7CisgIHNlbmRfY2h1bmtlZF9yZXBs
eSgvKmhhc19tb3JlPSovZmFsc2UpOworICBQRVJGRVRUT19DSEVDSyhzZW50X2VvZik7Cit9CisK
Ky8vIENhbGxlZCBieSB0aGUgc2VydmljZSBpbiByZXNwb25zZSB0byBhIHNlcnZpY2VfZW5kcG9p
bnQtPkZsdXNoKCkgcmVxdWVzdC4KK3ZvaWQgQ29uc3VtZXJJUENTZXJ2aWNlOjpPbkZsdXNoQ2Fs
bGJhY2soCisgICAgYm9vbCBzdWNjZXNzLAorICAgIFBlbmRpbmdGbHVzaFJlc3BvbnNlczo6aXRl
cmF0b3IgcGVuZGluZ19yZXNwb25zZV9pdCkgeworICBEZWZlcnJlZEZsdXNoUmVzcG9uc2UgcmVz
cG9uc2Uoc3RkOjptb3ZlKCpwZW5kaW5nX3Jlc3BvbnNlX2l0KSk7CisgIHBlbmRpbmdfZmx1c2hf
cmVzcG9uc2VzXy5lcmFzZShwZW5kaW5nX3Jlc3BvbnNlX2l0KTsKKyAgaWYgKHN1Y2Nlc3MpIHsK
KyAgICByZXNwb25zZS5SZXNvbHZlKGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OkZsdXNo
UmVzcG9uc2U+OjpDcmVhdGUoKSk7CisgIH0gZWxzZSB7CisgICAgcmVzcG9uc2UuUmVqZWN0KCk7
CisgIH0KK30KKwordm9pZCBDb25zdW1lcklQQ1NlcnZpY2U6OlF1ZXJ5Q2FwYWJpbGl0aWVzKAor
ICAgIGNvbnN0IHByb3Rvczo6Z2VuOjpRdWVyeUNhcGFiaWxpdGllc1JlcXVlc3QmLAorICAgIERl
ZmVycmVkUXVlcnlDYXBhYmlsaXRpZXNSZXNwb25zZSByZXNwKSB7CisgIFJlbW90ZUNvbnN1bWVy
KiByZW1vdGVfY29uc3VtZXIgPSBHZXRDb25zdW1lckZvckN1cnJlbnRSZXF1ZXN0KCk7CisgIGF1
dG8gaXQgPSBwZW5kaW5nX3F1ZXJ5X2NhcGFiaWxpdGllc19yZXNwb25zZXNfLmluc2VydCgKKyAg
ICAgIHBlbmRpbmdfcXVlcnlfY2FwYWJpbGl0aWVzX3Jlc3BvbnNlc18uZW5kKCksIHN0ZDo6bW92
ZShyZXNwKSk7CisgIGF1dG8gd2Vha190aGlzID0gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0
cigpOworICBhdXRvIGNhbGxiYWNrID0gW3dlYWtfdGhpcywgaXRdKGNvbnN0IFRyYWNpbmdTZXJ2
aWNlQ2FwYWJpbGl0aWVzJiBjYXBzKSB7CisgICAgaWYgKHdlYWtfdGhpcykKKyAgICAgIHdlYWtf
dGhpcy0+T25RdWVyeUNhcGFiaWxpdGllc0NhbGxiYWNrKGNhcHMsIHN0ZDo6bW92ZShpdCkpOwor
ICB9OworICByZW1vdGVfY29uc3VtZXItPnNlcnZpY2VfZW5kcG9pbnQtPlF1ZXJ5Q2FwYWJpbGl0
aWVzKGNhbGxiYWNrKTsKK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBzZXJ2aWNlIGluIHJlc3BvbnNl
IHRvIHNlcnZpY2VfZW5kcG9pbnQtPlF1ZXJ5Q2FwYWJpbGl0aWVzKCkuCit2b2lkIENvbnN1bWVy
SVBDU2VydmljZTo6T25RdWVyeUNhcGFiaWxpdGllc0NhbGxiYWNrKAorICAgIGNvbnN0IFRyYWNp
bmdTZXJ2aWNlQ2FwYWJpbGl0aWVzJiBjYXBzLAorICAgIFBlbmRpbmdRdWVyeUNhcGFiaWxpdGll
c1Jlc3BvbnNlczo6aXRlcmF0b3IgcGVuZGluZ19yZXNwb25zZV9pdCkgeworICBEZWZlcnJlZFF1
ZXJ5Q2FwYWJpbGl0aWVzUmVzcG9uc2UgcmVzcG9uc2Uoc3RkOjptb3ZlKCpwZW5kaW5nX3Jlc3Bv
bnNlX2l0KSk7CisgIHBlbmRpbmdfcXVlcnlfY2FwYWJpbGl0aWVzX3Jlc3BvbnNlc18uZXJhc2Uo
cGVuZGluZ19yZXNwb25zZV9pdCk7CisgIGF1dG8gcmVzcCA9CisgICAgICBpcGM6OkFzeW5jUmVz
dWx0PHByb3Rvczo6Z2VuOjpRdWVyeUNhcGFiaWxpdGllc1Jlc3BvbnNlPjo6Q3JlYXRlKCk7Cisg
ICpyZXNwLT5tdXRhYmxlX2NhcGFiaWxpdGllcygpID0gY2FwczsKKyAgcmVzcG9uc2UuUmVzb2x2
ZShzdGQ6Om1vdmUocmVzcCkpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVt
b3RlQ29uc3VtZXIgbWV0aG9kcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ29uc3VtZXJJ
UENTZXJ2aWNlOjpSZW1vdGVDb25zdW1lcjo6UmVtb3RlQ29uc3VtZXIoKSA9IGRlZmF1bHQ7CitD
b25zdW1lcklQQ1NlcnZpY2U6OlJlbW90ZUNvbnN1bWVyOjp+UmVtb3RlQ29uc3VtZXIoKSA9IGRl
ZmF1bHQ7CisKKy8vIEludm9rZWQgYnkgdGhlIHxjb3JlX3NlcnZpY2VffCBidXNpbmVzcyBsb2dp
YyBhZnRlciB0aGUgQ29ubmVjdENvbnN1bWVyKCkKKy8vIGNhbGwuIFRoZXJlIGlzIG5vdGhpbmcg
dG8gZG8gaGVyZSwgd2UgcmVhbGx5IGV4cGVjdGVkIHRoZSBDb25uZWN0Q29uc3VtZXIoKQorLy8g
dG8ganVzdCB3b3JrIGluIHRoZSBsb2NhbCBjYXNlLgordm9pZCBDb25zdW1lcklQQ1NlcnZpY2U6
OlJlbW90ZUNvbnN1bWVyOjpPbkNvbm5lY3QoKSB7fQorCisvLyBJbnZva2VkIGJ5IHRoZSB8Y29y
ZV9zZXJ2aWNlX3wgYnVzaW5lc3MgbG9naWMgYWZ0ZXIgd2UgZGVzdHJveSB0aGUKKy8vIHxzZXJ2
aWNlX2VuZHBvaW50fCAoaW4gdGhlIFJlbW90ZUNvbnN1bWVyIGR0b3IpLgordm9pZCBDb25zdW1l
cklQQ1NlcnZpY2U6OlJlbW90ZUNvbnN1bWVyOjpPbkRpc2Nvbm5lY3QoKSB7fQorCit2b2lkIENv
bnN1bWVySVBDU2VydmljZTo6UmVtb3RlQ29uc3VtZXI6Ok9uVHJhY2luZ0Rpc2FibGVkKCkgewor
ICBpZiAoZW5hYmxlX3RyYWNpbmdfcmVzcG9uc2UuSXNCb3VuZCgpKSB7CisgICAgYXV0byByZXN1
bHQgPQorICAgICAgICBpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpFbmFibGVUcmFjaW5n
UmVzcG9uc2U+OjpDcmVhdGUoKTsKKyAgICByZXN1bHQtPnNldF9kaXNhYmxlZCh0cnVlKTsKKyAg
ICBlbmFibGVfdHJhY2luZ19yZXNwb25zZS5SZXNvbHZlKHN0ZDo6bW92ZShyZXN1bHQpKTsKKyAg
fQorfQorCit2b2lkIENvbnN1bWVySVBDU2VydmljZTo6UmVtb3RlQ29uc3VtZXI6Ok9uVHJhY2VE
YXRhKAorICAgIHN0ZDo6dmVjdG9yPFRyYWNlUGFja2V0PiB0cmFjZV9wYWNrZXRzLAorICAgIGJv
b2wgaGFzX21vcmUpIHsKKyAgaWYgKCFyZWFkX2J1ZmZlcnNfcmVzcG9uc2UuSXNCb3VuZCgpKQor
ICAgIHJldHVybjsKKworICBhdXRvIHJlc3VsdCA9IGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpn
ZW46OlJlYWRCdWZmZXJzUmVzcG9uc2U+OjpDcmVhdGUoKTsKKworICAvLyBBIFRyYWNlUGFja2V0
IG1pZ2h0IGJlIHRvbyBiaWcgdG8gZml0IGludG8gYSBzaW5nbGUgSVBDIG1lc3NhZ2UgKG1heAor
ICAvLyBrSVBDQnVmZmVyU2l6ZSkuIEhvd2V2ZXIgYSBUcmFjZVBhY2tldCBpcyBtYWRlIG9mIHNs
aWNlcyBhbmQgZWFjaCBzbGljZQorICAvLyBpcyB3YXkgc21hbGxlciB0aGFuIGtJUENCdWZmZXJT
aXplIChhIHNsaWNlIHNpemUgaXMgZWZmZWN0aXZlbHkgYm91bmRlZCBieQorICAvLyB0aGUgbWF4
IGNodW5rIHNpemUgb2YgdGhlIFNoYXJlZE1lbW9yeUFCSSkuIFdoZW4gc2VuZGluZyBhIFRyYWNl
UGFja2V0LAorICAvLyBpZiBpdHMgc2xpY2VzIGRvbid0IGZpdCB3aXRoaW4gb25lIElQQywgY2h1
bmsgdGhlbSBvdmVyIHNldmVyYWwgY29udGlndW91cworICAvLyBJUENzIHVzaW5nIHRoZSB8bGFz
dF9zbGljZV9mb3JfcGFja2V0fCBmb3IgZ2x1ZWluZyBvbiB0aGUgb3RoZXIgc2lkZS4KKyAgc3Rh
dGljX2Fzc2VydChpcGM6OmtJUENCdWZmZXJTaXplID49IFNoYXJlZE1lbW9yeUFCSTo6a01heFBh
Z2VTaXplICogMiwKKyAgICAgICAgICAgICAgICAia0lQQ0J1ZmZlclNpemUgdG9vIHNtYWxsIGdp
dmVuIHRoZSBtYXggcG9zc2libGUgc2xpY2Ugc2l6ZSIpOworCisgIGF1dG8gc2VuZF9pcGNfcmVw
bHkgPSBbdGhpcywgJnJlc3VsdF0oYm9vbCBtb3JlKSB7CisgICAgcmVzdWx0LnNldF9oYXNfbW9y
ZShtb3JlKTsKKyAgICByZWFkX2J1ZmZlcnNfcmVzcG9uc2UuUmVzb2x2ZShzdGQ6Om1vdmUocmVz
dWx0KSk7CisgICAgcmVzdWx0ID0gaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6UmVhZEJ1
ZmZlcnNSZXNwb25zZT46OkNyZWF0ZSgpOworICB9OworCisgIHNpemVfdCBhcHByb3hfcmVwbHlf
c2l6ZSA9IDA7CisgIGZvciAoY29uc3QgVHJhY2VQYWNrZXQmIHRyYWNlX3BhY2tldCA6IHRyYWNl
X3BhY2tldHMpIHsKKyAgICBzaXplX3QgbnVtX3NsaWNlc19sZWZ0X2Zvcl9wYWNrZXQgPSB0cmFj
ZV9wYWNrZXQuc2xpY2VzKCkuc2l6ZSgpOworICAgIGZvciAoY29uc3QgU2xpY2UmIHNsaWNlIDog
dHJhY2VfcGFja2V0LnNsaWNlcygpKSB7CisgICAgICAvLyBDaGVjayBpZiB0aGlzIHNsaWNlIHdv
dWxkIGNhdXNlIHRoZSBJUEMgdG8gb3ZlcmZsb3cgaXRzIG1heCBzaXplIGFuZCwKKyAgICAgIC8v
IGlmIHRoYXQgaXMgdGhlIGNhc2UsIHNwbGl0IHRoZSBJUENzLiBUaGUgIjE2IiBhbmQgIjY0IiBi
ZWxvdyBhcmUKKyAgICAgIC8vIG92ZXItZXN0aW1hdGlvbnMgb2YsIHJlc3BlY3RpdmVseToKKyAg
ICAgIC8vIDE2OiB0aGUgcHJlYW1ibGUgdGhhdCBwcmVmaXhlcyBlYWNoIHNsaWNlICh0aGVyZSBh
cmUgMiB4IHNpemUgZmllbGRzCisgICAgICAvLyAgICAgaW4gdGhlIHByb3RvICsgdGhlIHxsYXN0
X3NsaWNlX2Zvcl9wYWNrZXR8IGJvb2wpLgorICAgICAgLy8gNjQ6IHRoZSBvdmVyaGVhZCBvZiB0
aGUgSVBDIEludm9rZU1ldGhvZFJlcGx5ICsgd2lyZV9wcm90b2NvbCdzIGZyYW1lLgorICAgICAg
Ly8gSWYgdGhlc2UgZXN0aW1hdGlvbnMgYXJlIHdyb25nLCBCdWZmZXJlZEZyYW1lRGVzZXJpYWxp
emVyOjpTZXJpYWxpemUoKQorICAgICAgLy8gd2lsbCBoaXQgYSBEQ0hFQ0sgYW55d2F5cy4KKyAg
ICAgIGNvbnN0IHNpemVfdCBhcHByb3hfc2xpY2Vfc2l6ZSA9IHNsaWNlLnNpemUgKyAxNjsKKyAg
ICAgIGlmIChhcHByb3hfcmVwbHlfc2l6ZSArIGFwcHJveF9zbGljZV9zaXplID4gaXBjOjprSVBD
QnVmZmVyU2l6ZSAtIDY0KSB7CisgICAgICAgIC8vIElmIHdlIGhpdCB0aGlzIENIRUNLIHdlIGdv
dCBhIHNpbmdsZSBzbGljZSB0aGF0IGlzID4ga0lQQ0J1ZmZlclNpemUuCisgICAgICAgIFBFUkZF
VFRPX0NIRUNLKHJlc3VsdC0+c2xpY2VzX3NpemUoKSA+IDApOworICAgICAgICBzZW5kX2lwY19y
ZXBseSgvKmhhc19tb3JlPSovdHJ1ZSk7CisgICAgICAgIGFwcHJveF9yZXBseV9zaXplID0gMDsK
KyAgICAgIH0KKyAgICAgIGFwcHJveF9yZXBseV9zaXplICs9IGFwcHJveF9zbGljZV9zaXplOwor
CisgICAgICBhdXRvKiByZXNfc2xpY2UgPSByZXN1bHQtPmFkZF9zbGljZXMoKTsKKyAgICAgIHJl
c19zbGljZS0+c2V0X2xhc3Rfc2xpY2VfZm9yX3BhY2tldCgtLW51bV9zbGljZXNfbGVmdF9mb3Jf
cGFja2V0ID09IDApOworICAgICAgcmVzX3NsaWNlLT5zZXRfZGF0YShzbGljZS5zdGFydCwgc2xp
Y2Uuc2l6ZSk7CisgICAgfQorICB9CisgIHNlbmRfaXBjX3JlcGx5KGhhc19tb3JlKTsKK30KKwor
dm9pZCBDb25zdW1lcklQQ1NlcnZpY2U6OlJlbW90ZUNvbnN1bWVyOjpPbkRldGFjaChib29sIHN1
Y2Nlc3MpIHsKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgc3RkOjptb3ZlKGRldGFjaF9yZXNwb25z
ZSkuUmVqZWN0KCk7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gcmVzcCA9IGlwYzo6QXN5bmNS
ZXN1bHQ8cHJvdG9zOjpnZW46OkRldGFjaFJlc3BvbnNlPjo6Q3JlYXRlKCk7CisgIHN0ZDo6bW92
ZShkZXRhY2hfcmVzcG9uc2UpLlJlc29sdmUoc3RkOjptb3ZlKHJlc3ApKTsKK30KKwordm9pZCBD
b25zdW1lcklQQ1NlcnZpY2U6OlJlbW90ZUNvbnN1bWVyOjpPbkF0dGFjaCgKKyAgICBib29sIHN1
Y2Nlc3MsCisgICAgY29uc3QgVHJhY2VDb25maWcmIHRyYWNlX2NvbmZpZykgeworICBpZiAoIXN1
Y2Nlc3MpIHsKKyAgICBzdGQ6Om1vdmUoYXR0YWNoX3Jlc3BvbnNlKS5SZWplY3QoKTsKKyAgICBy
ZXR1cm47CisgIH0KKyAgYXV0byByZXNwb25zZSA9IGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpn
ZW46OkF0dGFjaFJlc3BvbnNlPjo6Q3JlYXRlKCk7CisgICpyZXNwb25zZS0+bXV0YWJsZV90cmFj
ZV9jb25maWcoKSA9IHRyYWNlX2NvbmZpZzsKKyAgc3RkOjptb3ZlKGF0dGFjaF9yZXNwb25zZSku
UmVzb2x2ZShzdGQ6Om1vdmUocmVzcG9uc2UpKTsKK30KKwordm9pZCBDb25zdW1lcklQQ1NlcnZp
Y2U6OlJlbW90ZUNvbnN1bWVyOjpPblRyYWNlU3RhdHMoYm9vbCBzdWNjZXNzLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhY2VT
dGF0cyYgc3RhdHMpIHsKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgc3RkOjptb3ZlKGdldF90cmFj
ZV9zdGF0c19yZXNwb25zZSkuUmVqZWN0KCk7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gcmVz
cG9uc2UgPQorICAgICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6R2V0VHJhY2VTdGF0
c1Jlc3BvbnNlPjo6Q3JlYXRlKCk7CisgICpyZXNwb25zZS0+bXV0YWJsZV90cmFjZV9zdGF0cygp
ID0gc3RhdHM7CisgIHN0ZDo6bW92ZShnZXRfdHJhY2Vfc3RhdHNfcmVzcG9uc2UpLlJlc29sdmUo
c3RkOjptb3ZlKHJlc3BvbnNlKSk7Cit9CisKK3ZvaWQgQ29uc3VtZXJJUENTZXJ2aWNlOjpSZW1v
dGVDb25zdW1lcjo6T25PYnNlcnZhYmxlRXZlbnRzKAorICAgIGNvbnN0IE9ic2VydmFibGVFdmVu
dHMmIGV2ZW50cykgeworICBpZiAoIW9ic2VydmVfZXZlbnRzX3Jlc3BvbnNlLklzQm91bmQoKSkK
KyAgICByZXR1cm47CisKKyAgYXV0byByZXN1bHQgPSBpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6
Z2VuOjpPYnNlcnZlRXZlbnRzUmVzcG9uc2U+OjpDcmVhdGUoKTsKKyAgcmVzdWx0LnNldF9oYXNf
bW9yZSh0cnVlKTsKKyAgKnJlc3VsdC0+bXV0YWJsZV9ldmVudHMoKSA9IGV2ZW50czsKKyAgb2Jz
ZXJ2ZV9ldmVudHNfcmVzcG9uc2UuUmVzb2x2ZShzdGQ6Om1vdmUocmVzdWx0KSk7Cit9CisKK3Zv
aWQgQ29uc3VtZXJJUENTZXJ2aWNlOjpSZW1vdGVDb25zdW1lcjo6Q2xvc2VPYnNlcnZlRXZlbnRz
UmVzcG9uc2VTdHJlYW0oKSB7CisgIGlmICghb2JzZXJ2ZV9ldmVudHNfcmVzcG9uc2UuSXNCb3Vu
ZCgpKQorICAgIHJldHVybjsKKworICBhdXRvIHJlc3VsdCA9IGlwYzo6QXN5bmNSZXN1bHQ8cHJv
dG9zOjpnZW46Ok9ic2VydmVFdmVudHNSZXNwb25zZT46OkNyZWF0ZSgpOworICByZXN1bHQuc2V0
X2hhc19tb3JlKGZhbHNlKTsKKyAgb2JzZXJ2ZV9ldmVudHNfcmVzcG9uc2UuUmVzb2x2ZShzdGQ6
Om1vdmUocmVzdWx0KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIHNvdXJjZTogc3JjL3RyYWNpbmcvaXBjL3NlcnZpY2UvcHJvZHVjZXJf
aXBjX3NlcnZpY2UuY2MKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IHNyYy90cmFj
aW5nL2lwYy9zZXJ2aWNlL3Byb2R1Y2VyX2lwY19zZXJ2aWNlLmgKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2Vk
IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwor
ICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo
ZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cisg
KgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAq
CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdy
aXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0
cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENP
TkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUg
dGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lv
bnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVm
IFNSQ19UUkFDSU5HX0lQQ19TRVJWSUNFX1BST0RVQ0VSX0lQQ19TRVJWSUNFX0hfCisjZGVmaW5l
IFNSQ19UUkFDSU5HX0lQQ19TRVJWSUNFX1BST0RVQ0VSX0lQQ19TRVJWSUNFX0hfCisKKyNpbmNs
dWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8
c3RyaW5nPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9leHQvYmFzZS93ZWFrX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vZXh0L2lwYy9iYXNpY190eXBlcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9wcm9kdWNlci5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3Ry
YWNpbmcvY29yZS90cmFjaW5nX3NlcnZpY2UuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL2lwYy9wcm9kdWNlcl9wb3J0LmlwYy5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworCituYW1lc3BhY2UgaXBjIHsKK2NsYXNzIEhvc3Q7Cit9
ICAvLyBuYW1lc3BhY2UgaXBjCisKKy8vIEltcGxlbWVudHMgdGhlIFByb2R1Y2VyIHBvcnQgb2Yg
dGhlIElQQyBzZXJ2aWNlLiBUaGlzIGNsYXNzIHByb3hpZXMgcmVxdWVzdHMKKy8vIGFuZCByZXNw
b25zZXMgYmV0d2VlbiB0aGUgY29yZSBzZXJ2aWNlIGxvZ2ljICh8c3ZjX3wpIGFuZCByZW1vdGUg
UHJvZHVjZXIocykKKy8vIG9uIHRoZSBJUEMgc29ja2V0LCB0aHJvdWdoIHRoZSBtZXRob2RzIG92
ZXJyaWRkZGVuIGZyb20gUHJvZHVjZXJQb3J0LgorY2xhc3MgUHJvZHVjZXJJUENTZXJ2aWNlIDog
cHVibGljIHByb3Rvczo6Z2VuOjpQcm9kdWNlclBvcnQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQg
UHJvZHVjZXJJUENTZXJ2aWNlKFRyYWNpbmdTZXJ2aWNlKiBjb3JlX3NlcnZpY2UpOworICB+UHJv
ZHVjZXJJUENTZXJ2aWNlKCkgb3ZlcnJpZGU7CisKKyAgLy8gUHJvZHVjZXJQb3J0IGltcGxlbWVu
dGF0aW9uIChmcm9tIC5wcm90byBJUEMgZGVmaW5pdGlvbikuCisgIHZvaWQgSW5pdGlhbGl6ZUNv
bm5lY3Rpb24oY29uc3QgcHJvdG9zOjpnZW46OkluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCYs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWRJbml0aWFsaXplQ29ubmVjdGlv
blJlc3BvbnNlKSBvdmVycmlkZTsKKyAgdm9pZCBSZWdpc3RlckRhdGFTb3VyY2UoY29uc3QgcHJv
dG9zOjpnZW46OlJlZ2lzdGVyRGF0YVNvdXJjZVJlcXVlc3QmLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICBEZWZlcnJlZFJlZ2lzdGVyRGF0YVNvdXJjZVJlc3BvbnNlKSBvdmVycmlkZTsKKyAg
dm9pZCBVbnJlZ2lzdGVyRGF0YVNvdXJjZShjb25zdCBwcm90b3M6Omdlbjo6VW5yZWdpc3RlckRh
dGFTb3VyY2VSZXF1ZXN0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZFVu
cmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UpIG92ZXJyaWRlOworICB2b2lkIFJlZ2lzdGVyVHJh
Y2VXcml0ZXIoY29uc3QgcHJvdG9zOjpnZW46OlJlZ2lzdGVyVHJhY2VXcml0ZXJSZXF1ZXN0JiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVycmVkUmVnaXN0ZXJUcmFjZVdyaXRlclJl
c3BvbnNlKSBvdmVycmlkZTsKKyAgdm9pZCBVbnJlZ2lzdGVyVHJhY2VXcml0ZXIoY29uc3QgcHJv
dG9zOjpnZW46OlVucmVnaXN0ZXJUcmFjZVdyaXRlclJlcXVlc3QmLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBEZWZlcnJlZFVucmVnaXN0ZXJUcmFjZVdyaXRlclJlc3BvbnNlKSBvdmVy
cmlkZTsKKyAgdm9pZCBDb21taXREYXRhKGNvbnN0IHByb3Rvczo6Z2VuOjpDb21taXREYXRhUmVx
dWVzdCYsCisgICAgICAgICAgICAgICAgICBEZWZlcnJlZENvbW1pdERhdGFSZXNwb25zZSkgb3Zl
cnJpZGU7CisgIHZvaWQgTm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWQoCisgICAgICBjb25zdCBwcm90
b3M6Omdlbjo6Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXF1ZXN0JiwKKyAgICAgIERlZmVycmVk
Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWRSZXNwb25zZSkgb3ZlcnJpZGU7CisgIHZvaWQgTm90aWZ5
RGF0YVNvdXJjZVN0b3BwZWQoCisgICAgICBjb25zdCBwcm90b3M6Omdlbjo6Tm90aWZ5RGF0YVNv
dXJjZVN0b3BwZWRSZXF1ZXN0JiwKKyAgICAgIERlZmVycmVkTm90aWZ5RGF0YVNvdXJjZVN0b3Bw
ZWRSZXNwb25zZSkgb3ZlcnJpZGU7CisgIHZvaWQgQWN0aXZhdGVUcmlnZ2Vycyhjb25zdCBwcm90
b3M6Omdlbjo6QWN0aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmLAorICAgICAgICAgICAgICAgICAgICAg
ICAgRGVmZXJyZWRBY3RpdmF0ZVRyaWdnZXJzUmVzcG9uc2UpIG92ZXJyaWRlOworCisgIHZvaWQg
R2V0QXN5bmNDb21tYW5kKGNvbnN0IHByb3Rvczo6Z2VuOjpHZXRBc3luY0NvbW1hbmRSZXF1ZXN0
JiwKKyAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWRHZXRBc3luY0NvbW1hbmRSZXNwb25z
ZSkgb3ZlcnJpZGU7CisgIHZvaWQgU3luYyhjb25zdCBwcm90b3M6Omdlbjo6U3luY1JlcXVlc3Qm
LCBEZWZlcnJlZFN5bmNSZXNwb25zZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25DbGllbnREaXNjb25u
ZWN0ZWQoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIC8vIEFjdHMgbGlrZSBhIFByb2R1Y2Vy
IHdpdGggdGhlIGNvcmUgU2VydmljZSBidXNpbmVzcyBsb2dpYyAod2hpY2ggZG9lc24ndAorICAv
LyBrbm93IGFueXRoaW5nIGFib3V0IHRoZSByZW1vdGUgdHJhbnNwb3J0KSwgYnV0IGFsbCBpdCBk
b2VzIGlzIHByb3h5aW5nCisgIC8vIG1ldGhvZHMgdG8gdGhlIHJlbW90ZSBQcm9kdWNlciBvbiB0
aGUgb3RoZXIgc2lkZSBvZiB0aGUgSVBDIGNoYW5uZWwuCisgIGNsYXNzIFJlbW90ZVByb2R1Y2Vy
IDogcHVibGljIFByb2R1Y2VyIHsKKyAgIHB1YmxpYzoKKyAgICBSZW1vdGVQcm9kdWNlcigpOwor
ICAgIH5SZW1vdGVQcm9kdWNlcigpIG92ZXJyaWRlOworCisgICAgLy8gVGhlc2UgbWV0aG9kcyBh
cmUgY2FsbGVkIGJ5IHRoZSB8Y29yZV9zZXJ2aWNlX3wgYnVzaW5lc3MgbG9naWMuIFRoZXJlIGlz
CisgICAgLy8gbm8gY29ubmVjdGlvbiBoZXJlLCB0aGVzZSBtZXRob2RzIGFyZSBwb3N0ZWQgc3Ry
YWlnaHQgYXdheS4KKyAgICB2b2lkIE9uQ29ubmVjdCgpIG92ZXJyaWRlOworICAgIHZvaWQgT25E
aXNjb25uZWN0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBTZXR1cERhdGFTb3VyY2UoRGF0YVNvdXJj
ZUluc3RhbmNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVNvdXJjZUNv
bmZpZyYpIG92ZXJyaWRlOworICAgIHZvaWQgU3RhcnREYXRhU291cmNlKERhdGFTb3VyY2VJbnN0
YW5jZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFTb3VyY2VDb25maWcm
KSBvdmVycmlkZTsKKyAgICB2b2lkIFN0b3BEYXRhU291cmNlKERhdGFTb3VyY2VJbnN0YW5jZUlE
KSBvdmVycmlkZTsKKyAgICB2b2lkIE9uVHJhY2luZ1NldHVwKCkgb3ZlcnJpZGU7CisgICAgdm9p
ZCBGbHVzaChGbHVzaFJlcXVlc3RJRCwKKyAgICAgICAgICAgICAgIGNvbnN0IERhdGFTb3VyY2VJ
bnN0YW5jZUlEKiBkYXRhX3NvdXJjZV9pZHMsCisgICAgICAgICAgICAgICBzaXplX3QgbnVtX2Rh
dGFfc291cmNlcykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIENsZWFySW5jcmVtZW50YWxTdGF0ZShj
b25zdCBEYXRhU291cmNlSW5zdGFuY2VJRCogZGF0YV9zb3VyY2VfaWRzLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fZGF0YV9zb3VyY2VzKSBvdmVycmlkZTsKKwor
ICAgIHZvaWQgU2VuZFNldHVwVHJhY2luZygpOworCisgICAgLy8gVGhlIGludGVyZmFjZSBvYnRh
aW5lZCBmcm9tIHRoZSBjb3JlIHNlcnZpY2UgYnVzaW5lc3MgbG9naWMgdGhyb3VnaAorICAgIC8v
IFNlcnZpY2U6OkNvbm5lY3RQcm9kdWNlcih0aGlzKS4gVGhpcyBhbGxvd3MgdG8gaW52b2tlIG1l
dGhvZHMgZm9yIGEKKyAgICAvLyBzcGVjaWZpYyBQcm9kdWNlciBvbiB0aGUgU2VydmljZSBidXNp
bmVzcyBsb2dpYy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhY2luZ1NlcnZpY2U6OlByb2R1Y2Vy
RW5kcG9pbnQ+IHNlcnZpY2VfZW5kcG9pbnQ7CisKKyAgICAvLyBUaGUgYmFjay1jaGFubmVsIChi
YXNlZCBvbiBhIG5ldmVyIGVuZGluZyBzdHJlYW0gcmVxdWVzdCkgdGhhdCBhbGxvd3MgdXMKKyAg
ICAvLyB0byBzZW5kIGFzeW5jaHJvbm91cyBjb21tYW5kcyB0byB0aGUgcmVtb3RlIFByb2R1Y2Vy
IChlLmcuIHN0YXJ0L3N0b3AgYQorICAgIC8vIGRhdGEgc291cmNlKS4KKyAgICBEZWZlcnJlZEdl
dEFzeW5jQ29tbWFuZFJlc3BvbnNlIGFzeW5jX3Byb2R1Y2VyX2NvbW1hbmRzOworCisgICAgLy8g
U2V0IGlmIHRoZSBzZXJ2aWNlIGNhbGxzIE9uVHJhY2luZ1NldHVwKCkgYmVmb3JlIHRoZQorICAg
IC8vIHxhc3luY19wcm9kdWNlcl9jb21tYW5kc3wgd2FzIGJvdW5kIGJ5IHRoZSBzZXJ2aWNlLiBJ
biB0aGlzIGNhc2UsIHdlCisgICAgLy8gZm9yd2FyZCB0aGUgU2V0dXBUcmFjaW5nIGNvbW1hbmQg
d2hlbiBpdCBpcyBib3VuZCBsYXRlci4KKyAgICBib29sIHNlbmRfc2V0dXBfdHJhY2luZ19vbl9h
c3luY19jb21tYW5kc19ib3VuZCA9IGZhbHNlOworICB9OworCisgIFByb2R1Y2VySVBDU2Vydmlj
ZShjb25zdCBQcm9kdWNlcklQQ1NlcnZpY2UmKSA9IGRlbGV0ZTsKKyAgUHJvZHVjZXJJUENTZXJ2
aWNlJiBvcGVyYXRvcj0oY29uc3QgUHJvZHVjZXJJUENTZXJ2aWNlJikgPSBkZWxldGU7CisKKyAg
Ly8gUmV0dXJucyB0aGUgUHJvZHVjZXJFbmRwb2ludCBpbiB0aGUgY29yZSBidXNpbmVzcyBsb2dp
YyB0aGF0IGNvcnJlc3BvbmRzIHRvCisgIC8vIHRoZSBjdXJyZW50IElQQyByZXF1ZXN0LgorICBS
ZW1vdGVQcm9kdWNlciogR2V0UHJvZHVjZXJGb3JDdXJyZW50UmVxdWVzdCgpOworCisgIFRyYWNp
bmdTZXJ2aWNlKiBjb25zdCBjb3JlX3NlcnZpY2VfOworCisgIC8vIE1hcHMgSVBDIGNsaWVudHMg
dG8gUHJvZHVjZXJFbmRwb2ludCBpbnN0YW5jZXMgcmVnaXN0ZXJlZCBvbiB0aGUKKyAgLy8gfGNv
cmVfc2VydmljZV98IGJ1c2luZXNzIGxvZ2ljLgorICBzdGQ6Om1hcDxpcGM6OkNsaWVudElELCBz
dGQ6OnVuaXF1ZV9wdHI8UmVtb3RlUHJvZHVjZXI+PiBwcm9kdWNlcnNfOworCisgIC8vIExpc3Qg
YmVjYXVzZSBwb2ludGVycyBuZWVkIHRvIGJlIHN0YWJsZS4KKyAgc3RkOjpsaXN0PERlZmVycmVk
U3luY1Jlc3BvbnNlPiBwZW5kaW5nX3N5bmNzXzsKKworICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxQ
cm9kdWNlcklQQ1NlcnZpY2U+IHdlYWtfcHRyX2ZhY3RvcnlfOyAgLy8gS2VlcCBsYXN0LgorfTsK
KworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gU1JDX1RSQUNJTkdfSVBD
X1NFUlZJQ0VfUFJPRFVDRVJfSVBDX1NFUlZJQ0VfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVy
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91
IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl
bnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICog
ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV
bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs
IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl
ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP
TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp
Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9pcGMvc2VydmljZS9wcm9kdWNl
cl9pcGNfc2VydmljZS5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3Rhc2tfcnVu
bmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9l
eHQvaXBjL2hvc3QuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2V4dC9pcGMvc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS9jb21taXRfZGF0YV9yZXF1ZXN0Lmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJh
Y2luZy9jb3JlL3RyYWNpbmdfc2VydmljZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2RhdGFfc291cmNlX2NvbmZpZy5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9j
b3JlL2RhdGFfc291cmNlX2Rlc2NyaXB0b3IuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInNyYy90cmFjaW5nL2lwYy9wb3NpeF9zaGFyZWRfbWVtb3J5LmgiCisKKy8v
IFRoZSByZW1vdGUgUHJvZHVjZXIocykgYXJlIG5vdCB0cnVzdGVkLiBBbGwgdGhlIG1ldGhvZHMg
ZnJvbSB0aGUgUHJvZHVjZXJQb3J0CisvLyBJUEMgbGF5ZXIgKGUuZy4gUmVnaXN0ZXJEYXRhU291
cmNlKCkpIG11c3QgYXNzdW1lIHRoYXQgdGhlIHJlbW90ZSBQcm9kdWNlciBpcworLy8gY29tcHJv
bWlzZWQuCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKK1Byb2R1Y2VySVBDU2VydmljZTo6UHJv
ZHVjZXJJUENTZXJ2aWNlKFRyYWNpbmdTZXJ2aWNlKiBjb3JlX3NlcnZpY2UpCisgICAgOiBjb3Jl
X3NlcnZpY2VfKGNvcmVfc2VydmljZSksIHdlYWtfcHRyX2ZhY3RvcnlfKHRoaXMpIHt9CisKK1By
b2R1Y2VySVBDU2VydmljZTo6flByb2R1Y2VySVBDU2VydmljZSgpID0gZGVmYXVsdDsKKworUHJv
ZHVjZXJJUENTZXJ2aWNlOjpSZW1vdGVQcm9kdWNlcioKK1Byb2R1Y2VySVBDU2VydmljZTo6R2V0
UHJvZHVjZXJGb3JDdXJyZW50UmVxdWVzdCgpIHsKKyAgY29uc3QgaXBjOjpDbGllbnRJRCBpcGNf
Y2xpZW50X2lkID0gaXBjOjpTZXJ2aWNlOjpjbGllbnRfaW5mbygpLmNsaWVudF9pZCgpOworICBQ
RVJGRVRUT19DSEVDSyhpcGNfY2xpZW50X2lkKTsKKyAgYXV0byBpdCA9IHByb2R1Y2Vyc18uZmlu
ZChpcGNfY2xpZW50X2lkKTsKKyAgaWYgKGl0ID09IHByb2R1Y2Vyc18uZW5kKCkpCisgICAgcmV0
dXJuIG51bGxwdHI7CisgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOworfQorCisvLyBDYWxsZWQg
YnkgdGhlIHJlbW90ZSBQcm9kdWNlciB0aHJvdWdoIHRoZSBJUEMgY2hhbm5lbCBzb29uIGFmdGVy
IGNvbm5lY3RpbmcuCit2b2lkIFByb2R1Y2VySVBDU2VydmljZTo6SW5pdGlhbGl6ZUNvbm5lY3Rp
b24oCisgICAgY29uc3QgcHJvdG9zOjpnZW46OkluaXRpYWxpemVDb25uZWN0aW9uUmVxdWVzdCYg
cmVxLAorICAgIERlZmVycmVkSW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXNwb25zZSByZXNwb25zZSkg
eworICBjb25zdCBhdXRvJiBjbGllbnRfaW5mbyA9IGlwYzo6U2VydmljZTo6Y2xpZW50X2luZm8o
KTsKKyAgY29uc3QgaXBjOjpDbGllbnRJRCBpcGNfY2xpZW50X2lkID0gY2xpZW50X2luZm8uY2xp
ZW50X2lkKCk7CisgIFBFUkZFVFRPX0NIRUNLKGlwY19jbGllbnRfaWQpOworCisgIGlmIChwcm9k
dWNlcnNfLmNvdW50KGlwY19jbGllbnRfaWQpID4gMCkgeworICAgIFBFUkZFVFRPX0RMT0coCisg
ICAgICAgICJUaGUgcmVtb3RlIFByb2R1Y2VyIGlzIHRyeWluZyB0byByZS1pbml0aWFsaXplIHRo
ZSBjb25uZWN0aW9uIik7CisgICAgcmV0dXJuIHJlc3BvbnNlLlJlamVjdCgpOworICB9CisKKyAg
Ly8gQ3JlYXRlIGEgbmV3IGVudHJ5LgorICBzdGQ6OnVuaXF1ZV9wdHI8UmVtb3RlUHJvZHVjZXI+
IHByb2R1Y2VyKG5ldyBSZW1vdGVQcm9kdWNlcigpKTsKKworICBUcmFjaW5nU2VydmljZTo6UHJv
ZHVjZXJTTUJTY3JhcGluZ01vZGUgc21iX3NjcmFwaW5nX21vZGUgPQorICAgICAgVHJhY2luZ1Nl
cnZpY2U6OlByb2R1Y2VyU01CU2NyYXBpbmdNb2RlOjprRGVmYXVsdDsKKyAgc3dpdGNoIChyZXEu
c21iX3NjcmFwaW5nX21vZGUoKSkgeworICAgIGNhc2UgcHJvdG9zOjpnZW46OkluaXRpYWxpemVD
b25uZWN0aW9uUmVxdWVzdDo6U01CX1NDUkFQSU5HX1VOU1BFQ0lGSUVEOgorICAgICAgYnJlYWs7
CisgICAgY2FzZSBwcm90b3M6Omdlbjo6SW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0OjpTTUJf
U0NSQVBJTkdfRElTQUJMRUQ6CisgICAgICBzbWJfc2NyYXBpbmdfbW9kZSA9IFRyYWNpbmdTZXJ2
aWNlOjpQcm9kdWNlclNNQlNjcmFwaW5nTW9kZTo6a0Rpc2FibGVkOworICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBwcm90b3M6Omdlbjo6SW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1ZXN0OjpTTUJfU0NS
QVBJTkdfRU5BQkxFRDoKKyAgICAgIHNtYl9zY3JhcGluZ19tb2RlID0gVHJhY2luZ1NlcnZpY2U6
OlByb2R1Y2VyU01CU2NyYXBpbmdNb2RlOjprRW5hYmxlZDsKKyAgICAgIGJyZWFrOworICB9CisK
KyAgYm9vbCBkY2hlY2tfbWlzbWF0Y2ggPSBmYWxzZTsKKyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNf
T04oKQorICBkY2hlY2tfbWlzbWF0Y2ggPQorICAgICAgcmVxLmJ1aWxkX2ZsYWdzKCkgPT0KKyAg
ICAgIHByb3Rvczo6Z2VuOjpJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3Q6OkJVSUxEX0ZMQUdT
X0RDSEVDS1NfT0ZGOworI2Vsc2UKKyAgZGNoZWNrX21pc21hdGNoID0KKyAgICAgIHJlcS5idWls
ZF9mbGFncygpID09CisgICAgICBwcm90b3M6Omdlbjo6SW5pdGlhbGl6ZUNvbm5lY3Rpb25SZXF1
ZXN0OjpCVUlMRF9GTEFHU19EQ0hFQ0tTX09OOworI2VuZGlmCisgIGlmIChkY2hlY2tfbWlzbWF0
Y2gpIHsKKyAgICBQRVJGRVRUT19MT0coCisgICAgICAgICJUaGUgcHJvZHVjZXIgYW5kIHRoZSBz
ZXJ2aWNlIGJpbmFyaWVzIGFyZSBidWlsdCB1c2luZyBkaWZmZXJlbnQgIgorICAgICAgICAiREVC
VUcvTkRFQlVHIGZsYWdzLiBUaGlzIHdpbGwgbGlrZWx5IGNhdXNlIGNyYXNoZXMuIik7CisgIH0K
KworICAvLyBJZiB0aGUgcHJvZHVjZXIgcHJvdmlkZWQgYW4gU01CLCB0ZWxsIHRoZSBzZXJ2aWNl
IHRvIGF0dGVtcHQgdG8gYWRvcHQgaXQuCisgIHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnk+
IHNobWVtOworICBpZiAocmVxLnByb2R1Y2VyX3Byb3ZpZGVkX3NobWVtKCkpIHsKKyAgICBiYXNl
OjpTY29wZWRGaWxlIHNobWVtX2ZkID0gaXBjOjpTZXJ2aWNlOjpUYWtlUmVjZWl2ZWRGRCgpOwor
ICAgIGlmIChzaG1lbV9mZCkgeworICAgICAgc2htZW0gPSBQb3NpeFNoYXJlZE1lbW9yeTo6QXR0
YWNoVG9GZCgKKyAgICAgICAgICBzdGQ6Om1vdmUoc2htZW1fZmQpLCAvKnJlcXVpcmVfc2VhbHNf
aWZfc3VwcG9ydGVkPSovdHJ1ZSk7CisgICAgICBpZiAoIXNobWVtKSB7CisgICAgICAgIFBFUkZF
VFRPX0VMT0coCisgICAgICAgICAgICAiQ291bGRuJ3QgbWFwIHByb2R1Y2VyLXByb3ZpZGVkIFNN
QiwgZmFsbGluZyBiYWNrIHRvICIKKyAgICAgICAgICAgICJzZXJ2aWNlLXByb3ZpZGVkIFNNQiIp
OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAg
ICJJbml0aWFsaXplQ29ubmVjdGlvblJlcXVlc3QncyBwcm9kdWNlcl9wcm92aWRlZF9zaG1lbSBm
bGFnIGlzIHNldCAiCisgICAgICAgICAgImJ1dCB0aGUgcHJvZHVjZXIgZGlkbid0IHByb3ZpZGUg
YW4gRkQiKTsKKyAgICB9CisgIH0KKworICAvLyBDb25uZWN0UHJvZHVjZXIgd2lsbCBjYWxsIE9u
Q29ubmVjdCgpIG9uIHRoZSBuZXh0IHRhc2suCisgIHByb2R1Y2VyLT5zZXJ2aWNlX2VuZHBvaW50
ID0gY29yZV9zZXJ2aWNlXy0+Q29ubmVjdFByb2R1Y2VyKAorICAgICAgcHJvZHVjZXIuZ2V0KCks
IGNsaWVudF9pbmZvLnVpZCgpLCByZXEucHJvZHVjZXJfbmFtZSgpLAorICAgICAgcmVxLnNoYXJl
ZF9tZW1vcnlfc2l6ZV9oaW50X2J5dGVzKCksCisgICAgICAvKmluX3Byb2Nlc3M9Ki9mYWxzZSwg
c21iX3NjcmFwaW5nX21vZGUsCisgICAgICByZXEuc2hhcmVkX21lbW9yeV9wYWdlX3NpemVfaGlu
dF9ieXRlcygpLCBzdGQ6Om1vdmUoc2htZW0pKTsKKworICAvLyBDb3VsZCBoYXBwZW4gaWYgdGhl
IHNlcnZpY2UgaGFzIHRvbyBtYW55IHByb2R1Y2VycyBjb25uZWN0ZWQuCisgIGlmICghcHJvZHVj
ZXItPnNlcnZpY2VfZW5kcG9pbnQpIHsKKyAgICByZXNwb25zZS5SZWplY3QoKTsKKyAgICByZXR1
cm47CisgIH0KKworICBib29sIHVzaW5nX3Byb2R1Y2VyX3NobWVtID0KKyAgICAgIHByb2R1Y2Vy
LT5zZXJ2aWNlX2VuZHBvaW50LT5Jc1NobWVtUHJvdmlkZWRCeVByb2R1Y2VyKCk7CisKKyAgcHJv
ZHVjZXJzXy5lbXBsYWNlKGlwY19jbGllbnRfaWQsIHN0ZDo6bW92ZShwcm9kdWNlcikpOworICAv
LyBCZWNhdXNlIG9mIHRoZSBzdGQ6Om1vdmUoKSB8cHJvZHVjZXJ8IGlzIGludmFsaWQgYWZ0ZXIg
dGhpcyBwb2ludC4KKworICBhdXRvIGFzeW5jX3JlcyA9CisgICAgICBpcGM6OkFzeW5jUmVzdWx0
PHByb3Rvczo6Z2VuOjpJbml0aWFsaXplQ29ubmVjdGlvblJlc3BvbnNlPjo6Q3JlYXRlKCk7Cisg
IGFzeW5jX3Jlcy0+c2V0X3VzaW5nX3NobWVtX3Byb3ZpZGVkX2J5X3Byb2R1Y2VyKHVzaW5nX3By
b2R1Y2VyX3NobWVtKTsKKyAgcmVzcG9uc2UuUmVzb2x2ZShzdGQ6Om1vdmUoYXN5bmNfcmVzKSk7
Cit9CisKKy8vIENhbGxlZCBieSB0aGUgcmVtb3RlIFByb2R1Y2VyIHRocm91Z2ggdGhlIElQQyBj
aGFubmVsLgordm9pZCBQcm9kdWNlcklQQ1NlcnZpY2U6OlJlZ2lzdGVyRGF0YVNvdXJjZSgKKyAg
ICBjb25zdCBwcm90b3M6Omdlbjo6UmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYgcmVxLAorICAg
IERlZmVycmVkUmVnaXN0ZXJEYXRhU291cmNlUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgUmVtb3Rl
UHJvZHVjZXIqIHByb2R1Y2VyID0gR2V0UHJvZHVjZXJGb3JDdXJyZW50UmVxdWVzdCgpOworICBp
ZiAoIXByb2R1Y2VyKSB7CisgICAgUEVSRkVUVE9fRExPRygKKyAgICAgICAgIlByb2R1Y2VyIGlu
dm9rZWQgUmVnaXN0ZXJEYXRhU291cmNlKCkgYmVmb3JlIEluaXRpYWxpemVDb25uZWN0aW9uKCki
KTsKKyAgICBpZiAocmVzcG9uc2UuSXNCb3VuZCgpKQorICAgICAgcmVzcG9uc2UuUmVqZWN0KCk7
CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgRGF0YVNvdXJjZURlc2NyaXB0b3ImIGRzZCA9
IHJlcS5kYXRhX3NvdXJjZV9kZXNjcmlwdG9yKCk7CisgIEdldFByb2R1Y2VyRm9yQ3VycmVudFJl
cXVlc3QoKS0+c2VydmljZV9lbmRwb2ludC0+UmVnaXN0ZXJEYXRhU291cmNlKGRzZCk7CisKKyAg
Ly8gUmVnaXN0ZXJEYXRhU291cmNlIGRvZXNuJ3QgZXhwZWN0IGFueSBtZWFuaW5nZnVsIHJlc3Bv
bnNlLgorICBpZiAocmVzcG9uc2UuSXNCb3VuZCgpKSB7CisgICAgcmVzcG9uc2UuUmVzb2x2ZSgK
KyAgICAgICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6UmVnaXN0ZXJEYXRhU291cmNl
UmVzcG9uc2U+OjpDcmVhdGUoKSk7CisgIH0KK30KKworLy8gQ2FsbGVkIGJ5IHRoZSBJUEMgbGF5
ZXIuCit2b2lkIFByb2R1Y2VySVBDU2VydmljZTo6T25DbGllbnREaXNjb25uZWN0ZWQoKSB7Cisg
IGlwYzo6Q2xpZW50SUQgY2xpZW50X2lkID0gaXBjOjpTZXJ2aWNlOjpjbGllbnRfaW5mbygpLmNs
aWVudF9pZCgpOworICBQRVJGRVRUT19ETE9HKCJDbGllbnQgJSIgUFJJdTY0ICIgZGlzY29ubmVj
dGVkIiwgY2xpZW50X2lkKTsKKyAgcHJvZHVjZXJzXy5lcmFzZShjbGllbnRfaWQpOworfQorCisv
LyBUT0RPKGZtYXllcik6IHRlc3Qgd2hhdCBoYXBwZW5zIGlmIHdlIHJlY2VpdmUgdGhlIGZvbGxv
d2luZyB0YXNrcywgaW4gb3JkZXI6CisvLyBSZWdpc3RlckRhdGFTb3VyY2UsIFVucmVnaXN0ZXJE
YXRhU291cmNlLCBPbkRhdGFTb3VyY2VSZWdpc3RlcmVkLgorLy8gd2hpY2ggZXNzZW50aWFsbHkg
bWVhbnMgdGhhdCB0aGUgY2xpZW50IHBvc3RlZCBiYWNrIHRvIGJhY2sgYQorLy8gUmVxaXN0ZXJE
YXRhU291cmNlIGFuZCBVbnJlZ2lzdGVyRGF0YVNvdXJjZSBzcGVjdWxhdGluZyBvbiB0aGUgbmV4
dCBpZC4KKy8vIENhbGxlZCBieSB0aGUgcmVtb3RlIFNlcnZpY2UgdGhyb3VnaCB0aGUgSVBDIGNo
YW5uZWwuCit2b2lkIFByb2R1Y2VySVBDU2VydmljZTo6VW5yZWdpc3RlckRhdGFTb3VyY2UoCisg
ICAgY29uc3QgcHJvdG9zOjpnZW46OlVucmVnaXN0ZXJEYXRhU291cmNlUmVxdWVzdCYgcmVxLAor
ICAgIERlZmVycmVkVW5yZWdpc3RlckRhdGFTb3VyY2VSZXNwb25zZSByZXNwb25zZSkgeworICBS
ZW1vdGVQcm9kdWNlciogcHJvZHVjZXIgPSBHZXRQcm9kdWNlckZvckN1cnJlbnRSZXF1ZXN0KCk7
CisgIGlmICghcHJvZHVjZXIpIHsKKyAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAiUHJvZHVj
ZXIgaW52b2tlZCBVbnJlZ2lzdGVyRGF0YVNvdXJjZSgpIGJlZm9yZSAiCisgICAgICAgICJJbml0
aWFsaXplQ29ubmVjdGlvbigpIik7CisgICAgaWYgKHJlc3BvbnNlLklzQm91bmQoKSkKKyAgICAg
IHJlc3BvbnNlLlJlamVjdCgpOworICAgIHJldHVybjsKKyAgfQorICBwcm9kdWNlci0+c2Vydmlj
ZV9lbmRwb2ludC0+VW5yZWdpc3RlckRhdGFTb3VyY2UocmVxLmRhdGFfc291cmNlX25hbWUoKSk7
CisKKyAgLy8gVW5yZWdpc3RlckRhdGFTb3VyY2UgZG9lc24ndCBleHBlY3QgYW55IG1lYW5pbmdm
dWwgcmVzcG9uc2UuCisgIGlmIChyZXNwb25zZS5Jc0JvdW5kKCkpIHsKKyAgICByZXNwb25zZS5S
ZXNvbHZlKAorICAgICAgICBpcGM6OkFzeW5jUmVzdWx0PHByb3Rvczo6Z2VuOjpVbnJlZ2lzdGVy
RGF0YVNvdXJjZVJlc3BvbnNlPjo6Q3JlYXRlKCkpOworICB9Cit9CisKK3ZvaWQgUHJvZHVjZXJJ
UENTZXJ2aWNlOjpSZWdpc3RlclRyYWNlV3JpdGVyKAorICAgIGNvbnN0IHByb3Rvczo6Z2VuOjpS
ZWdpc3RlclRyYWNlV3JpdGVyUmVxdWVzdCYgcmVxLAorICAgIERlZmVycmVkUmVnaXN0ZXJUcmFj
ZVdyaXRlclJlc3BvbnNlIHJlc3BvbnNlKSB7CisgIFJlbW90ZVByb2R1Y2VyKiBwcm9kdWNlciA9
IEdldFByb2R1Y2VyRm9yQ3VycmVudFJlcXVlc3QoKTsKKyAgaWYgKCFwcm9kdWNlcikgeworICAg
IFBFUkZFVFRPX0RMT0coCisgICAgICAgICJQcm9kdWNlciBpbnZva2VkIFJlZ2lzdGVyVHJhY2VX
cml0ZXIoKSBiZWZvcmUgIgorICAgICAgICAiSW5pdGlhbGl6ZUNvbm5lY3Rpb24oKSIpOworICAg
IGlmIChyZXNwb25zZS5Jc0JvdW5kKCkpCisgICAgICByZXNwb25zZS5SZWplY3QoKTsKKyAgICBy
ZXR1cm47CisgIH0KKyAgcHJvZHVjZXItPnNlcnZpY2VfZW5kcG9pbnQtPlJlZ2lzdGVyVHJhY2VX
cml0ZXIocmVxLnRyYWNlX3dyaXRlcl9pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXEudGFyZ2V0X2J1ZmZlcigpKTsKKworICAvLyBSZWdp
c3RlclRyYWNlV3JpdGVyIGRvZXNuJ3QgZXhwZWN0IGFueSBtZWFuaW5nZnVsIHJlc3BvbnNlLgor
ICBpZiAocmVzcG9uc2UuSXNCb3VuZCgpKSB7CisgICAgcmVzcG9uc2UuUmVzb2x2ZSgKKyAgICAg
ICAgaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6UmVnaXN0ZXJUcmFjZVdyaXRlclJlc3Bv
bnNlPjo6Q3JlYXRlKCkpOworICB9Cit9CisKK3ZvaWQgUHJvZHVjZXJJUENTZXJ2aWNlOjpVbnJl
Z2lzdGVyVHJhY2VXcml0ZXIoCisgICAgY29uc3QgcHJvdG9zOjpnZW46OlVucmVnaXN0ZXJUcmFj
ZVdyaXRlclJlcXVlc3QmIHJlcSwKKyAgICBEZWZlcnJlZFVucmVnaXN0ZXJUcmFjZVdyaXRlclJl
c3BvbnNlIHJlc3BvbnNlKSB7CisgIFJlbW90ZVByb2R1Y2VyKiBwcm9kdWNlciA9IEdldFByb2R1
Y2VyRm9yQ3VycmVudFJlcXVlc3QoKTsKKyAgaWYgKCFwcm9kdWNlcikgeworICAgIFBFUkZFVFRP
X0RMT0coCisgICAgICAgICJQcm9kdWNlciBpbnZva2VkIFVucmVnaXN0ZXJUcmFjZVdyaXRlcigp
IGJlZm9yZSAiCisgICAgICAgICJJbml0aWFsaXplQ29ubmVjdGlvbigpIik7CisgICAgaWYgKHJl
c3BvbnNlLklzQm91bmQoKSkKKyAgICAgIHJlc3BvbnNlLlJlamVjdCgpOworICAgIHJldHVybjsK
KyAgfQorICBwcm9kdWNlci0+c2VydmljZV9lbmRwb2ludC0+VW5yZWdpc3RlclRyYWNlV3JpdGVy
KHJlcS50cmFjZV93cml0ZXJfaWQoKSk7CisKKyAgLy8gVW5yZWdpc3RlclRyYWNlV3JpdGVyIGRv
ZXNuJ3QgZXhwZWN0IGFueSBtZWFuaW5nZnVsIHJlc3BvbnNlLgorICBpZiAocmVzcG9uc2UuSXNC
b3VuZCgpKSB7CisgICAgcmVzcG9uc2UuUmVzb2x2ZSgKKyAgICAgICAgaXBjOjpBc3luY1Jlc3Vs
dDxwcm90b3M6Omdlbjo6VW5yZWdpc3RlclRyYWNlV3JpdGVyUmVzcG9uc2U+OjpDcmVhdGUoKSk7
CisgIH0KK30KKwordm9pZCBQcm9kdWNlcklQQ1NlcnZpY2U6OkNvbW1pdERhdGEoY29uc3QgcHJv
dG9zOjpnZW46OkNvbW1pdERhdGFSZXF1ZXN0JiByZXEsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBEZWZlcnJlZENvbW1pdERhdGFSZXNwb25zZSByZXNwKSB7CisgIFJlbW90
ZVByb2R1Y2VyKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyRm9yQ3VycmVudFJlcXVlc3QoKTsKKyAg
aWYgKCFwcm9kdWNlcikgeworICAgIFBFUkZFVFRPX0RMT0coCisgICAgICAgICJQcm9kdWNlciBp
bnZva2VkIENvbW1pdERhdGEoKSBiZWZvcmUgSW5pdGlhbGl6ZUNvbm5lY3Rpb24oKSIpOworICAg
IGlmIChyZXNwLklzQm91bmQoKSkKKyAgICAgIHJlc3AuUmVqZWN0KCk7CisgICAgcmV0dXJuOwor
ICB9CisKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBzZW5kIGEgcmVzcG9uc2UgaWYgdGhlIGNsaWVu
dCBkaWRuJ3QgYXR0YWNoIGEgY2FsbGJhY2sgdG8KKyAgLy8gdGhlIG9yaWdpbmFsIHJlcXVlc3Qu
IERvaW5nIHNvIHdvdWxkIGdlbmVyYXRlIHVubmVjZXNzYXJ5IHdha2V1cHMgYW5kCisgIC8vIGNv
bnRleHQgc3dpdGNoZXMuCisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjYWxsYmFjazsKKyAgaWYg
KHJlc3AuSXNCb3VuZCgpKSB7CisgICAgLy8gQ2FwdHVyaW5nIHxyZXNwfCBieSByZWZlcmVuY2Ug
aGVyZSBzcGVjdWxhdGVzIG9uIHRoZSBmYWN0IHRoYXQKKyAgICAvLyBDb21taXREYXRhKCkgaW4g
dHJhY2luZ19zZXJ2aWNlX2ltcGwuY2MgaW52b2tlcyB0aGUgcGFzc2VkIGNhbGxiYWNrCisgICAg
Ly8gaW5saW5lLCB3aXRob3V0IHBvc3RpbmcgaXQuIElmIHRoYXQgYXNzdW1wdGlvbiBjaGFuZ2Vz
IHRoaXMgY29kZSBuZWVkcyB0bworICAgIC8vIHdyYXAgdGhlIHJlc3BvbnNlIGluIGEgc2hhcmVk
X3B0ciAoQysxMSBsYW1iZGFzIGRvbid0IHN1cHBvcnQgbW92ZSkgYW5kCisgICAgLy8gdXNlIGEg
d2VhayBwdHIgaW4gdGhlIGNhbGxlci4KKyAgICBjYWxsYmFjayA9IFsmcmVzcF0geworICAgICAg
cmVzcC5SZXNvbHZlKGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OkNvbW1pdERhdGFSZXNw
b25zZT46OkNyZWF0ZSgpKTsKKyAgICB9OworICB9CisgIHByb2R1Y2VyLT5zZXJ2aWNlX2VuZHBv
aW50LT5Db21taXREYXRhKHJlcSwgY2FsbGJhY2spOworfQorCit2b2lkIFByb2R1Y2VySVBDU2Vy
dmljZTo6Tm90aWZ5RGF0YVNvdXJjZVN0YXJ0ZWQoCisgICAgY29uc3QgcHJvdG9zOjpnZW46Ok5v
dGlmeURhdGFTb3VyY2VTdGFydGVkUmVxdWVzdCYgcmVxdWVzdCwKKyAgICBEZWZlcnJlZE5vdGlm
eURhdGFTb3VyY2VTdGFydGVkUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgUmVtb3RlUHJvZHVjZXIq
IHByb2R1Y2VyID0gR2V0UHJvZHVjZXJGb3JDdXJyZW50UmVxdWVzdCgpOworICBpZiAoIXByb2R1
Y2VyKSB7CisgICAgUEVSRkVUVE9fRExPRygKKyAgICAgICAgIlByb2R1Y2VyIGludm9rZWQgTm90
aWZ5RGF0YVNvdXJjZVN0YXJ0ZWQoKSBiZWZvcmUgIgorICAgICAgICAiSW5pdGlhbGl6ZUNvbm5l
Y3Rpb24oKSIpOworICAgIGlmIChyZXNwb25zZS5Jc0JvdW5kKCkpCisgICAgICByZXNwb25zZS5S
ZWplY3QoKTsKKyAgICByZXR1cm47CisgIH0KKyAgcHJvZHVjZXItPnNlcnZpY2VfZW5kcG9pbnQt
Pk5vdGlmeURhdGFTb3VyY2VTdGFydGVkKHJlcXVlc3QuZGF0YV9zb3VyY2VfaWQoKSk7CisKKyAg
Ly8gTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQgc2hvdWxkbid0IGV4cGVjdCBhbnkgbWVhbmluZ2Z1
bCByZXNwb25zZSwgYXZvaWQKKyAgLy8gYSB1c2VsZXNzIElQQyBpbiB0aGF0IGNhc2UuCisgIGlm
IChyZXNwb25zZS5Jc0JvdW5kKCkpIHsKKyAgICByZXNwb25zZS5SZXNvbHZlKGlwYzo6QXN5bmNS
ZXN1bHQ8CisgICAgICAgICAgICAgICAgICAgICBwcm90b3M6Omdlbjo6Tm90aWZ5RGF0YVNvdXJj
ZVN0YXJ0ZWRSZXNwb25zZT46OkNyZWF0ZSgpKTsKKyAgfQorfQorCit2b2lkIFByb2R1Y2VySVBD
U2VydmljZTo6Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoCisgICAgY29uc3QgcHJvdG9zOjpnZW46
Ok5vdGlmeURhdGFTb3VyY2VTdG9wcGVkUmVxdWVzdCYgcmVxdWVzdCwKKyAgICBEZWZlcnJlZE5v
dGlmeURhdGFTb3VyY2VTdG9wcGVkUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgUmVtb3RlUHJvZHVj
ZXIqIHByb2R1Y2VyID0gR2V0UHJvZHVjZXJGb3JDdXJyZW50UmVxdWVzdCgpOworICBpZiAoIXBy
b2R1Y2VyKSB7CisgICAgUEVSRkVUVE9fRExPRygKKyAgICAgICAgIlByb2R1Y2VyIGludm9rZWQg
Tm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQoKSBiZWZvcmUgIgorICAgICAgICAiSW5pdGlhbGl6ZUNv
bm5lY3Rpb24oKSIpOworICAgIGlmIChyZXNwb25zZS5Jc0JvdW5kKCkpCisgICAgICByZXNwb25z
ZS5SZWplY3QoKTsKKyAgICByZXR1cm47CisgIH0KKyAgcHJvZHVjZXItPnNlcnZpY2VfZW5kcG9p
bnQtPk5vdGlmeURhdGFTb3VyY2VTdG9wcGVkKHJlcXVlc3QuZGF0YV9zb3VyY2VfaWQoKSk7CisK
KyAgLy8gTm90aWZ5RGF0YVNvdXJjZVN0b3BwZWQgc2hvdWxkbid0IGV4cGVjdCBhbnkgbWVhbmlu
Z2Z1bCByZXNwb25zZSwgYXZvaWQKKyAgLy8gYSB1c2VsZXNzIElQQyBpbiB0aGF0IGNhc2UuCisg
IGlmIChyZXNwb25zZS5Jc0JvdW5kKCkpIHsKKyAgICByZXNwb25zZS5SZXNvbHZlKGlwYzo6QXN5
bmNSZXN1bHQ8CisgICAgICAgICAgICAgICAgICAgICBwcm90b3M6Omdlbjo6Tm90aWZ5RGF0YVNv
dXJjZVN0b3BwZWRSZXNwb25zZT46OkNyZWF0ZSgpKTsKKyAgfQorfQorCit2b2lkIFByb2R1Y2Vy
SVBDU2VydmljZTo6QWN0aXZhdGVUcmlnZ2VycygKKyAgICBjb25zdCBwcm90b3M6Omdlbjo6QWN0
aXZhdGVUcmlnZ2Vyc1JlcXVlc3QmIHByb3RvX3JlcSwKKyAgICBEZWZlcnJlZEFjdGl2YXRlVHJp
Z2dlcnNSZXNwb25zZSByZXNwKSB7CisgIFJlbW90ZVByb2R1Y2VyKiBwcm9kdWNlciA9IEdldFBy
b2R1Y2VyRm9yQ3VycmVudFJlcXVlc3QoKTsKKyAgaWYgKCFwcm9kdWNlcikgeworICAgIFBFUkZF
VFRPX0RMT0coCisgICAgICAgICJQcm9kdWNlciBpbnZva2VkIEFjdGl2YXRlVHJpZ2dlcnMoKSBi
ZWZvcmUgSW5pdGlhbGl6ZUNvbm5lY3Rpb24oKSIpOworICAgIGlmIChyZXNwLklzQm91bmQoKSkK
KyAgICAgIHJlc3AuUmVqZWN0KCk7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6dmVjdG9yPHN0
ZDo6c3RyaW5nPiB0cmlnZ2VyczsKKyAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogcHJvdG9fcmVx
LnRyaWdnZXJfbmFtZXMoKSkgeworICAgIHRyaWdnZXJzLnB1c2hfYmFjayhuYW1lKTsKKyAgfQor
ICBwcm9kdWNlci0+c2VydmljZV9lbmRwb2ludC0+QWN0aXZhdGVUcmlnZ2Vycyh0cmlnZ2Vycyk7
CisgIC8vIEFjdGl2YXRlVHJpZ2dlcnMgc2hvdWxkbid0IGV4cGVjdCBhbnkgbWVhbmluZ2Z1bCBy
ZXNwb25zZSwgYXZvaWQKKyAgLy8gYSB1c2VsZXNzIElQQyBpbiB0aGF0IGNhc2UuCisgIGlmIChy
ZXNwLklzQm91bmQoKSkgeworICAgIHJlc3AuUmVzb2x2ZSgKKyAgICAgICAgaXBjOjpBc3luY1Jl
c3VsdDxwcm90b3M6Omdlbjo6QWN0aXZhdGVUcmlnZ2Vyc1Jlc3BvbnNlPjo6Q3JlYXRlKCkpOwor
ICB9Cit9CisKK3ZvaWQgUHJvZHVjZXJJUENTZXJ2aWNlOjpHZXRBc3luY0NvbW1hbmQoCisgICAg
Y29uc3QgcHJvdG9zOjpnZW46OkdldEFzeW5jQ29tbWFuZFJlcXVlc3QmLAorICAgIERlZmVycmVk
R2V0QXN5bmNDb21tYW5kUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgUmVtb3RlUHJvZHVjZXIqIHBy
b2R1Y2VyID0gR2V0UHJvZHVjZXJGb3JDdXJyZW50UmVxdWVzdCgpOworICBpZiAoIXByb2R1Y2Vy
KSB7CisgICAgUEVSRkVUVE9fRExPRygKKyAgICAgICAgIlByb2R1Y2VyIGludm9rZWQgR2V0QXN5
bmNDb21tYW5kKCkgYmVmb3JlICIKKyAgICAgICAgIkluaXRpYWxpemVDb25uZWN0aW9uKCkiKTsK
KyAgICByZXR1cm4gcmVzcG9uc2UuUmVqZWN0KCk7CisgIH0KKyAgLy8gS2VlcCB0aGUgYmFjayBj
aGFubmVsIG9wZW4sIHdpdGhvdXQgZXZlciByZXNvbHZpbmcgdGhlIGlwYzo6RGVmZXJyZWQgZnVs
bHksCisgIC8vIHRvIHNlbmQgYXN5bmMgY29tbWFuZHMgdG8gdGhlIFJlbW90ZVByb2R1Y2VyIChl
LmcuLCBzdGFydGluZy9zdG9wcGluZyBhCisgIC8vIGRhdGEgc291cmNlKS4KKyAgcHJvZHVjZXIt
PmFzeW5jX3Byb2R1Y2VyX2NvbW1hbmRzID0gc3RkOjptb3ZlKHJlc3BvbnNlKTsKKworICAvLyBT
ZXJ2aWNlIG1heSBhbHJlYWR5IGhhdmUgaXNzdWVkIHRoZSBPblRyYWNpbmdTZXR1cCgpIGV2ZW50
LCBpbiB3aGljaCBjYXNlCisgIC8vIHdlIHNob3VsZCBmb3J3YXJkIGl0IHRvIHRoZSBwcm9kdWNl
ciBub3cuCisgIGlmIChwcm9kdWNlci0+c2VuZF9zZXR1cF90cmFjaW5nX29uX2FzeW5jX2NvbW1h
bmRzX2JvdW5kKQorICAgIHByb2R1Y2VyLT5TZW5kU2V0dXBUcmFjaW5nKCk7Cit9CisKK3ZvaWQg
UHJvZHVjZXJJUENTZXJ2aWNlOjpTeW5jKGNvbnN0IHByb3Rvczo6Z2VuOjpTeW5jUmVxdWVzdCYs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZFN5bmNSZXNwb25zZSByZXNw
KSB7CisgIFJlbW90ZVByb2R1Y2VyKiBwcm9kdWNlciA9IEdldFByb2R1Y2VyRm9yQ3VycmVudFJl
cXVlc3QoKTsKKyAgaWYgKCFwcm9kdWNlcikgeworICAgIFBFUkZFVFRPX0RMT0coIlByb2R1Y2Vy
IGludm9rZWQgU3luYygpIGJlZm9yZSBJbml0aWFsaXplQ29ubmVjdGlvbigpIik7CisgICAgcmV0
dXJuIHJlc3AuUmVqZWN0KCk7CisgIH0KKyAgYXV0byB3ZWFrX3RoaXMgPSB3ZWFrX3B0cl9mYWN0
b3J5Xy5HZXRXZWFrUHRyKCk7CisgIGF1dG8gcmVzcF9pdCA9IHBlbmRpbmdfc3luY3NfLmluc2Vy
dChwZW5kaW5nX3N5bmNzXy5lbmQoKSwgc3RkOjptb3ZlKHJlc3ApKTsKKyAgYXV0byBjYWxsYmFj
ayA9IFt3ZWFrX3RoaXMsIHJlc3BfaXRdKCkgeworICAgIGlmICghd2Vha190aGlzKQorICAgICAg
cmV0dXJuOworICAgIGF1dG8gcGVuZGluZ19yZXNwID0gc3RkOjptb3ZlKCpyZXNwX2l0KTsKKyAg
ICB3ZWFrX3RoaXMtPnBlbmRpbmdfc3luY3NfLmVyYXNlKHJlc3BfaXQpOworICAgIHBlbmRpbmdf
cmVzcC5SZXNvbHZlKGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OlN5bmNSZXNwb25zZT46
OkNyZWF0ZSgpKTsKKyAgfTsKKyAgcHJvZHVjZXItPnNlcnZpY2VfZW5kcG9pbnQtPlN5bmMoY2Fs
bGJhY2spOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVtb3RlUHJvZHVjZXIg
bWV0aG9kcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZHVjZXJJUENTZXJ2aWNlOjpS
ZW1vdGVQcm9kdWNlcjo6UmVtb3RlUHJvZHVjZXIoKSA9IGRlZmF1bHQ7CitQcm9kdWNlcklQQ1Nl
cnZpY2U6OlJlbW90ZVByb2R1Y2VyOjp+UmVtb3RlUHJvZHVjZXIoKSA9IGRlZmF1bHQ7CisKKy8v
IEludm9rZWQgYnkgdGhlIHxjb3JlX3NlcnZpY2VffCBidXNpbmVzcyBsb2dpYyBhZnRlciB0aGUg
Q29ubmVjdFByb2R1Y2VyKCkKKy8vIGNhbGwuIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSwg
d2UgcmVhbGx5IGV4cGVjdGVkIHRoZSBDb25uZWN0UHJvZHVjZXIoKQorLy8gdG8ganVzdCB3b3Jr
IGluIHRoZSBsb2NhbCBjYXNlLgordm9pZCBQcm9kdWNlcklQQ1NlcnZpY2U6OlJlbW90ZVByb2R1
Y2VyOjpPbkNvbm5lY3QoKSB7fQorCisvLyBJbnZva2VkIGJ5IHRoZSB8Y29yZV9zZXJ2aWNlX3wg
YnVzaW5lc3MgbG9naWMgYWZ0ZXIgd2UgZGVzdHJveSB0aGUKKy8vIHxzZXJ2aWNlX2VuZHBvaW50
fCAoaW4gdGhlIFJlbW90ZVByb2R1Y2VyIGR0b3IpLgordm9pZCBQcm9kdWNlcklQQ1NlcnZpY2U6
OlJlbW90ZVByb2R1Y2VyOjpPbkRpc2Nvbm5lY3QoKSB7fQorCisvLyBJbnZva2VkIGJ5IHRoZSB8
Y29yZV9zZXJ2aWNlX3wgYnVzaW5lc3MgbG9naWMgd2hlbiBpdCB3YW50cyB0byBjcmVhdGUgYSBu
ZXcKKy8vIGRhdGEgc291cmNlLgordm9pZCBQcm9kdWNlcklQQ1NlcnZpY2U6OlJlbW90ZVByb2R1
Y2VyOjpTZXR1cERhdGFTb3VyY2UoCisgICAgRGF0YVNvdXJjZUluc3RhbmNlSUQgZHNpZCwKKyAg
ICBjb25zdCBEYXRhU291cmNlQ29uZmlnJiBjZmcpIHsKKyAgaWYgKCFhc3luY19wcm9kdWNlcl9j
b21tYW5kcy5Jc0JvdW5kKCkpIHsKKyAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAiVGhlIFNl
cnZpY2UgdHJpZWQgdG8gY3JlYXRlIGEgbmV3IGRhdGEgc291cmNlIGJ1dCB0aGUgcmVtb3RlIFBy
b2R1Y2VyICIKKyAgICAgICAgImhhcyBub3QgeWV0IGluaXRpYWxpemVkIHRoZSBjb25uZWN0aW9u
Iik7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gY21kID0gaXBjOjpBc3luY1Jlc3VsdDxwcm90
b3M6Omdlbjo6R2V0QXN5bmNDb21tYW5kUmVzcG9uc2U+OjpDcmVhdGUoKTsKKyAgY21kLnNldF9o
YXNfbW9yZSh0cnVlKTsKKyAgY21kLT5tdXRhYmxlX3NldHVwX2RhdGFfc291cmNlKCktPnNldF9u
ZXdfaW5zdGFuY2VfaWQoZHNpZCk7CisgICpjbWQtPm11dGFibGVfc2V0dXBfZGF0YV9zb3VyY2Uo
KS0+bXV0YWJsZV9jb25maWcoKSA9IGNmZzsKKyAgYXN5bmNfcHJvZHVjZXJfY29tbWFuZHMuUmVz
b2x2ZShzdGQ6Om1vdmUoY21kKSk7Cit9CisKKy8vIEludm9rZWQgYnkgdGhlIHxjb3JlX3NlcnZp
Y2VffCBidXNpbmVzcyBsb2dpYyB3aGVuIGl0IHdhbnRzIHRvIHN0YXJ0IGEgbmV3CisvLyBkYXRh
IHNvdXJjZS4KK3ZvaWQgUHJvZHVjZXJJUENTZXJ2aWNlOjpSZW1vdGVQcm9kdWNlcjo6U3RhcnRE
YXRhU291cmNlKAorICAgIERhdGFTb3VyY2VJbnN0YW5jZUlEIGRzaWQsCisgICAgY29uc3QgRGF0
YVNvdXJjZUNvbmZpZyYgY2ZnKSB7CisgIGlmICghYXN5bmNfcHJvZHVjZXJfY29tbWFuZHMuSXNC
b3VuZCgpKSB7CisgICAgUEVSRkVUVE9fRExPRygKKyAgICAgICAgIlRoZSBTZXJ2aWNlIHRyaWVk
IHRvIHN0YXJ0IGEgbmV3IGRhdGEgc291cmNlIGJ1dCB0aGUgcmVtb3RlIFByb2R1Y2VyICIKKyAg
ICAgICAgImhhcyBub3QgeWV0IGluaXRpYWxpemVkIHRoZSBjb25uZWN0aW9uIik7CisgICAgcmV0
dXJuOworICB9CisgIGF1dG8gY21kID0gaXBjOjpBc3luY1Jlc3VsdDxwcm90b3M6Omdlbjo6R2V0
QXN5bmNDb21tYW5kUmVzcG9uc2U+OjpDcmVhdGUoKTsKKyAgY21kLnNldF9oYXNfbW9yZSh0cnVl
KTsKKyAgY21kLT5tdXRhYmxlX3N0YXJ0X2RhdGFfc291cmNlKCktPnNldF9uZXdfaW5zdGFuY2Vf
aWQoZHNpZCk7CisgICpjbWQtPm11dGFibGVfc3RhcnRfZGF0YV9zb3VyY2UoKS0+bXV0YWJsZV9j
b25maWcoKSA9IGNmZzsKKyAgYXN5bmNfcHJvZHVjZXJfY29tbWFuZHMuUmVzb2x2ZShzdGQ6Om1v
dmUoY21kKSk7Cit9CisKK3ZvaWQgUHJvZHVjZXJJUENTZXJ2aWNlOjpSZW1vdGVQcm9kdWNlcjo6
U3RvcERhdGFTb3VyY2UoCisgICAgRGF0YVNvdXJjZUluc3RhbmNlSUQgZHNpZCkgeworICBpZiAo
IWFzeW5jX3Byb2R1Y2VyX2NvbW1hbmRzLklzQm91bmQoKSkgeworICAgIFBFUkZFVFRPX0RMT0co
CisgICAgICAgICJUaGUgU2VydmljZSB0cmllZCB0byBzdG9wIGEgZGF0YSBzb3VyY2UgYnV0IHRo
ZSByZW1vdGUgUHJvZHVjZXIgIgorICAgICAgICAiaGFzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgdGhl
IGNvbm5lY3Rpb24iKTsKKyAgICByZXR1cm47CisgIH0KKyAgYXV0byBjbWQgPSBpcGM6OkFzeW5j
UmVzdWx0PHByb3Rvczo6Z2VuOjpHZXRBc3luY0NvbW1hbmRSZXNwb25zZT46OkNyZWF0ZSgpOwor
ICBjbWQuc2V0X2hhc19tb3JlKHRydWUpOworICBjbWQtPm11dGFibGVfc3RvcF9kYXRhX3NvdXJj
ZSgpLT5zZXRfaW5zdGFuY2VfaWQoZHNpZCk7CisgIGFzeW5jX3Byb2R1Y2VyX2NvbW1hbmRzLlJl
c29sdmUoc3RkOjptb3ZlKGNtZCkpOworfQorCit2b2lkIFByb2R1Y2VySVBDU2VydmljZTo6UmVt
b3RlUHJvZHVjZXI6Ok9uVHJhY2luZ1NldHVwKCkgeworICBpZiAoIWFzeW5jX3Byb2R1Y2VyX2Nv
bW1hbmRzLklzQm91bmQoKSkgeworICAgIC8vIFNlcnZpY2UgbWF5IGNhbGwgdGhpcyBiZWZvcmUg
dGhlIHByb2R1Y2VyIGlzc3VlZCBHZXRBc3luY0NvbW1hbmQuCisgICAgc2VuZF9zZXR1cF90cmFj
aW5nX29uX2FzeW5jX2NvbW1hbmRzX2JvdW5kID0gdHJ1ZTsKKyAgICByZXR1cm47CisgIH0KKyAg
U2VuZFNldHVwVHJhY2luZygpOworfQorCit2b2lkIFByb2R1Y2VySVBDU2VydmljZTo6UmVtb3Rl
UHJvZHVjZXI6OlNlbmRTZXR1cFRyYWNpbmcoKSB7CisgIFBFUkZFVFRPX0NIRUNLKGFzeW5jX3By
b2R1Y2VyX2NvbW1hbmRzLklzQm91bmQoKSk7CisgIFBFUkZFVFRPX0NIRUNLKHNlcnZpY2VfZW5k
cG9pbnQtPnNoYXJlZF9tZW1vcnkoKSk7CisgIGF1dG8gY21kID0gaXBjOjpBc3luY1Jlc3VsdDxw
cm90b3M6Omdlbjo6R2V0QXN5bmNDb21tYW5kUmVzcG9uc2U+OjpDcmVhdGUoKTsKKyAgY21kLnNl
dF9oYXNfbW9yZSh0cnVlKTsKKyAgYXV0byBzZXR1cF90cmFjaW5nID0gY21kLT5tdXRhYmxlX3Nl
dHVwX3RyYWNpbmcoKTsKKyAgaWYgKCFzZXJ2aWNlX2VuZHBvaW50LT5Jc1NobWVtUHJvdmlkZWRC
eVByb2R1Y2VyKCkpIHsKKyAgICAvLyBOb21pbmFsIGNhc2UgKCUgQ2hyb21lKTogc2VydmljZSBw
cm92aWRlcyBTTUIuCisgICAgc2V0dXBfdHJhY2luZy0+c2V0X3NoYXJlZF9idWZmZXJfcGFnZV9z
aXplX2tiKAorICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VydmljZV9lbmRwb2ludC0+
c2hhcmVkX2J1ZmZlcl9wYWdlX3NpemVfa2IoKSkpOworICAgIGNvbnN0IGludCBzaG1fZmQgPQor
ICAgICAgICBzdGF0aWNfY2FzdDxQb3NpeFNoYXJlZE1lbW9yeSo+KHNlcnZpY2VfZW5kcG9pbnQt
PnNoYXJlZF9tZW1vcnkoKSkKKyAgICAgICAgICAgIC0+ZmQoKTsKKyAgICBjbWQuc2V0X2ZkKHNo
bV9mZCk7CisgIH0KKyAgYXN5bmNfcHJvZHVjZXJfY29tbWFuZHMuUmVzb2x2ZShzdGQ6Om1vdmUo
Y21kKSk7Cit9CisKK3ZvaWQgUHJvZHVjZXJJUENTZXJ2aWNlOjpSZW1vdGVQcm9kdWNlcjo6Rmx1
c2goCisgICAgRmx1c2hSZXF1ZXN0SUQgZmx1c2hfcmVxdWVzdF9pZCwKKyAgICBjb25zdCBEYXRh
U291cmNlSW5zdGFuY2VJRCogZGF0YV9zb3VyY2VfaWRzLAorICAgIHNpemVfdCBudW1fZGF0YV9z
b3VyY2VzKSB7CisgIGlmICghYXN5bmNfcHJvZHVjZXJfY29tbWFuZHMuSXNCb3VuZCgpKSB7Cisg
ICAgUEVSRkVUVE9fRExPRygKKyAgICAgICAgIlRoZSBTZXJ2aWNlIHRyaWVkIHRvIHJlcXVlc3Qg
YSBmbHVzaCBidXQgdGhlIHJlbW90ZSBQcm9kdWNlciBoYXMgbm90ICIKKyAgICAgICAgInlldCBp
bml0aWFsaXplZCB0aGUgY29ubmVjdGlvbiIpOworICAgIHJldHVybjsKKyAgfQorICBhdXRvIGNt
ZCA9IGlwYzo6QXN5bmNSZXN1bHQ8cHJvdG9zOjpnZW46OkdldEFzeW5jQ29tbWFuZFJlc3BvbnNl
Pjo6Q3JlYXRlKCk7CisgIGNtZC5zZXRfaGFzX21vcmUodHJ1ZSk7CisgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbnVtX2RhdGFfc291cmNlczsgaSsrKQorICAgIGNtZC0+bXV0YWJsZV9mbHVzaCgp
LT5hZGRfZGF0YV9zb3VyY2VfaWRzKGRhdGFfc291cmNlX2lkc1tpXSk7CisgIGNtZC0+bXV0YWJs
ZV9mbHVzaCgpLT5zZXRfcmVxdWVzdF9pZChmbHVzaF9yZXF1ZXN0X2lkKTsKKyAgYXN5bmNfcHJv
ZHVjZXJfY29tbWFuZHMuUmVzb2x2ZShzdGQ6Om1vdmUoY21kKSk7Cit9CisKK3ZvaWQgUHJvZHVj
ZXJJUENTZXJ2aWNlOjpSZW1vdGVQcm9kdWNlcjo6Q2xlYXJJbmNyZW1lbnRhbFN0YXRlKAorICAg
IGNvbnN0IERhdGFTb3VyY2VJbnN0YW5jZUlEKiBkYXRhX3NvdXJjZV9pZHMsCisgICAgc2l6ZV90
IG51bV9kYXRhX3NvdXJjZXMpIHsKKyAgaWYgKCFhc3luY19wcm9kdWNlcl9jb21tYW5kcy5Jc0Jv
dW5kKCkpIHsKKyAgICBQRVJGRVRUT19ETE9HKAorICAgICAgICAiVGhlIFNlcnZpY2UgdHJpZWQg
dG8gcmVxdWVzdCBhbiBpbmNyZW1lbnRhbCBzdGF0ZSBpbnZhbGlkYXRpb24sIGJ1dCAiCisgICAg
ICAgICJ0aGUgcmVtb3RlIFByb2R1Y2VyIGhhcyBub3QgeWV0IGluaXRpYWxpemVkIHRoZSBjb25u
ZWN0aW9uIik7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gY21kID0gaXBjOjpBc3luY1Jlc3Vs
dDxwcm90b3M6Omdlbjo6R2V0QXN5bmNDb21tYW5kUmVzcG9uc2U+OjpDcmVhdGUoKTsKKyAgY21k
LnNldF9oYXNfbW9yZSh0cnVlKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fZGF0YV9z
b3VyY2VzOyBpKyspCisgICAgY21kLT5tdXRhYmxlX2NsZWFyX2luY3JlbWVudGFsX3N0YXRlKCkt
PmFkZF9kYXRhX3NvdXJjZV9pZHMoCisgICAgICAgIGRhdGFfc291cmNlX2lkc1tpXSk7CisgIGFz
eW5jX3Byb2R1Y2VyX2NvbW1hbmRzLlJlc29sdmUoc3RkOjptb3ZlKGNtZCkpOworfQorCit9ICAv
LyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNy
Yy90cmFjaW5nL2lwYy9zZXJ2aWNlL3NlcnZpY2VfaXBjX2hvc3RfaW1wbC5jYworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogc3JjL3RyYWNpbmcvaXBjL3NlcnZpY2Uvc2VydmljZV9p
cGNfaG9zdF9pbXBsLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUv
cGVyZmV0dG8vZXh0L3RyYWNpbmcvaXBjL3NlcnZpY2VfaXBjX2hvc3QuaAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGlj
ZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNl
Iik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdp
dGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2Ug
YXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIu
MAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8g
aW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlz
IGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMg
T1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAq
IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt
aXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNp
Zm5kZWYgSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19JUENfU0VSVklDRV9JUENfSE9TVF9I
XworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0VYVF9UUkFDSU5HX0lQQ19TRVJWSUNFX0lQQ19I
T1NUX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvYmFzZS9zY29wZWRfZmlsZS5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3RyYWNpbmcv
Y29yZS9iYXNpY190eXBlcy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJh
c2UgeworY2xhc3MgVGFza1J1bm5lcjsKK30gIC8vIG5hbWVzcGFjZSBiYXNlLgorCitjbGFzcyBU
cmFjaW5nU2VydmljZTsKKworLy8gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSAo
YnVzaW5lc3MgbG9naWMgKyBVTklYIHNvY2tldCB0cmFuc3BvcnQpLgorLy8gRXhwb3NlZCB0bzoK
Ky8vICAgVGhlIGNvZGUgaW4gdGhlIHRyYWNpbmcgY2xpZW50IHRoYXQgd2lsbCBob3N0IHRoZSBz
ZXJ2aWNlIGUuZy4sIHRyYWNlZC4KKy8vIEltcGxlbWVudGVkIGluOgorLy8gICBzcmMvdHJhY2lu
Zy9pcGMvc2VydmljZS9zZXJ2aWNlX2lwY19ob3N0X2ltcGwuY2MKK2NsYXNzIFBFUkZFVFRPX0VY
UE9SVCBTZXJ2aWNlSVBDSG9zdCB7CisgcHVibGljOgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRy
PFNlcnZpY2VJUENIb3N0PiBDcmVhdGVJbnN0YW5jZShiYXNlOjpUYXNrUnVubmVyKik7CisgIHZp
cnR1YWwgflNlcnZpY2VJUENIb3N0KCk7CisKKyAgLy8gU3RhcnQgbGlzdGVuaW5nIG9uIHRoZSBQ
cm9kdWNlciAmIENvbnN1bWVyIHBvcnRzLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YKKyAgLy8g
ZmFpbHVyZSAoZS5nLiwgc29tZXRoaW5nIGVsc2UgaXMgbGlzdGVuaW5nIG9uIHxzb2NrZXRfbmFt
ZXwpLgorICB2aXJ0dWFsIGJvb2wgU3RhcnQoY29uc3QgY2hhciogcHJvZHVjZXJfc29ja2V0X25h
bWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdW1lcl9zb2NrZXRfbmFt
ZSkgPSAwOworCisgIC8vIExpa2UgdGhlIGFib3ZlLCBidXQgdGFrZXMgdHdvIGZpbGUgZGVzY3Jp
cHRvcnMgdG8gYWxyZWFkeSBib3VuZCBzb2NrZXRzLgorICAvLyBUaGlzIGlzIHVzZWQgd2hlbiBi
dWlsZGluZyBhcyBwYXJ0IG9mIHRoZSBBbmRyb2lkIHRyZWUsIHdoZXJlIGluaXQgb3BlbnMKKyAg
Ly8gYW5kIGJpbmRzIHRoZSBzb2NrZXQgYmVvcmUgZXhlYygpLWluZyB1cy4KKyAgdmlydHVhbCBi
b29sIFN0YXJ0KGJhc2U6OlNjb3BlZEZpbGUgcHJvZHVjZXJfc29ja2V0X2ZkLAorICAgICAgICAg
ICAgICAgICAgICAgYmFzZTo6U2NvcGVkRmlsZSBjb25zdW1lcl9zb2NrZXRfZmQpID0gMDsKKwor
ICB2aXJ0dWFsIFRyYWNpbmdTZXJ2aWNlKiBzZXJ2aWNlKCkgY29uc3QgPSAwOworCisgcHJvdGVj
dGVkOgorICBTZXJ2aWNlSVBDSG9zdCgpOworCisgcHJpdmF0ZToKKyAgU2VydmljZUlQQ0hvc3Qo
Y29uc3QgU2VydmljZUlQQ0hvc3QmKSA9IGRlbGV0ZTsKKyAgU2VydmljZUlQQ0hvc3QmIG9wZXJh
dG9yPShjb25zdCBTZXJ2aWNlSVBDSG9zdCYpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNw
YWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19FWFRfVFJBQ0lOR19J
UENfU0VSVklDRV9JUENfSE9TVF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5k
cm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNo
ZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1
c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZ
b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6
Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1
aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUK
KyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkg
S0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0
YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1JDX1RSQUNJTkdfSVBD
X1NFUlZJQ0VfU0VSVklDRV9JUENfSE9TVF9JTVBMX0hfCisjZGVmaW5lIFNSQ19UUkFDSU5HX0lQ
Q19TRVJWSUNFX1NFUlZJQ0VfSVBDX0hPU1RfSU1QTF9IXworCisjaW5jbHVkZSA8bWVtb3J5Pgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJh
Y2luZy9pcGMvc2VydmljZV9pcGNfaG9zdC5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworCitu
YW1lc3BhY2UgaXBjIHsKK2NsYXNzIEhvc3Q7Cit9CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBv
ZiB0aGUgSVBDIGhvc3QgZm9yIHRoZSB0cmFjaW5nIHNlcnZpY2UuIFRoaXMgY2xhc3MgZG9lcwor
Ly8gdmVyeSBmZXcgdGhpbmdzOiBpdCBtb3N0bHkgaW5pdGlhbGl6ZXMgdGhlIElQQyB0cmFuc3Bv
cnQuIFRoZSBhY3R1YWwKKy8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJUEMgPD4gU2VydmljZSBi
dXNpbmVzcyBsb2dpYyBnbHVlIGxpdmVzIGluCisvLyBwcm9kdWNlcl9pcGNfc2VydmljZS5jYyBh
bmQgY29uc3VtZXJfaXBjX3NlcnZpY2UuY2MuCitjbGFzcyBTZXJ2aWNlSVBDSG9zdEltcGwgOiBw
dWJsaWMgU2VydmljZUlQQ0hvc3QgeworIHB1YmxpYzoKKyAgU2VydmljZUlQQ0hvc3RJbXBsKGJh
c2U6OlRhc2tSdW5uZXIqKTsKKyAgflNlcnZpY2VJUENIb3N0SW1wbCgpIG92ZXJyaWRlOworCisg
IC8vIFNlcnZpY2VJUENIb3N0IGltcGxlbWVudGF0aW9uLgorICBib29sIFN0YXJ0KGNvbnN0IGNo
YXIqIHByb2R1Y2VyX3NvY2tldF9uYW1lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN1
bWVyX3NvY2tldF9uYW1lKSBvdmVycmlkZTsKKyAgYm9vbCBTdGFydChiYXNlOjpTY29wZWRGaWxl
IHByb2R1Y2VyX3NvY2tldF9mZCwKKyAgICAgICAgICAgICBiYXNlOjpTY29wZWRGaWxlIGNvbnN1
bWVyX3NvY2tldF9mZCkgb3ZlcnJpZGU7CisKKyAgVHJhY2luZ1NlcnZpY2UqIHNlcnZpY2UoKSBj
b25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGJvb2wgRG9TdGFydCgpOworICB2b2lkIFNo
dXRkb3duKCk7CisKKyAgYmFzZTo6VGFza1J1bm5lciogY29uc3QgdGFza19ydW5uZXJfOworICBz
dGQ6OnVuaXF1ZV9wdHI8VHJhY2luZ1NlcnZpY2U+IHN2Y187ICAvLyBUaGUgc2VydmljZSBidXNp
bmVzcyBsb2dpYy4KKworICAvLyBUaGUgSVBDIGhvc3QgdGhhdCBsaXN0ZW5zIG9uIHRoZSBQcm9k
dWNlciBzb2NrZXQuIEl0IG93bnMgdGhlCisgIC8vIFBvc2l4U2VydmljZVByb2R1Y2VyUG9ydCBp
bnN0YW5jZSB3aGljaCBkZWFscyB3aXRoIGFsbCBwcm9kdWNlcnMnIElQQyhzKS4KKyAgc3RkOjp1
bmlxdWVfcHRyPGlwYzo6SG9zdD4gcHJvZHVjZXJfaXBjX3BvcnRfOworCisgIC8vIEFzIGFib3Zl
LCBidXQgZm9yIHRoZSBDb25zdW1lciBwb3J0LgorICBzdGQ6OnVuaXF1ZV9wdHI8aXBjOjpIb3N0
PiBjb25zdW1lcl9pcGNfcG9ydF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKwor
I2VuZGlmICAvLyBTUkNfVFJBQ0lOR19JUENfU0VSVklDRV9TRVJWSUNFX0lQQ19IT1NUX0lNUExf
SF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJv
amVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAy
LjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg
aW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5
IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj
ZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBs
YXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRl
ciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lU
SE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNz
IG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFn
ZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGlj
ZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMv
dHJhY2luZy9pcGMvc2VydmljZS9zZXJ2aWNlX2lwY19ob3N0X2ltcGwuaCIKKworLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL3Rhc2tf
cnVubmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9leHQvaXBjL2hvc3QuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2V4dC90cmFjaW5nL2NvcmUvdHJhY2luZ19zZXJ2aWNlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJzcmMvdHJhY2luZy9pcGMvcG9zaXhfc2hhcmVk
X21lbW9yeS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAic3JjL3Ry
YWNpbmcvaXBjL3NlcnZpY2UvY29uc3VtZXJfaXBjX3NlcnZpY2UuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInNyYy90cmFjaW5nL2lwYy9zZXJ2aWNlL3Byb2R1Y2Vy
X2lwY19zZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIFRPRE8oZm1heWVy
KTogaW1wbGVtZW50IHBlci11aWQgY29ubmVjdGlvbiBsaW1pdCAoYi82OTA5MzcwNSkuCisKKy8v
IEltcGxlbWVudHMgdGhlIHB1YmxpY2x5IGV4cG9zZWQgZmFjdG9yeSBtZXRob2QgZGVjbGFyZWQg
aW4KKy8vIGluY2x1ZGUvdHJhY2luZy9wb3NpeF9pcGMvcG9zaXhfc2VydmljZV9ob3N0LmguCitz
dGQ6OnVuaXF1ZV9wdHI8U2VydmljZUlQQ0hvc3Q+IFNlcnZpY2VJUENIb3N0OjpDcmVhdGVJbnN0
YW5jZSgKKyAgICBiYXNlOjpUYXNrUnVubmVyKiB0YXNrX3J1bm5lcikgeworICByZXR1cm4gc3Rk
Ojp1bmlxdWVfcHRyPFNlcnZpY2VJUENIb3N0PihuZXcgU2VydmljZUlQQ0hvc3RJbXBsKHRhc2tf
cnVubmVyKSk7Cit9CisKK1NlcnZpY2VJUENIb3N0SW1wbDo6U2VydmljZUlQQ0hvc3RJbXBsKGJh
c2U6OlRhc2tSdW5uZXIqIHRhc2tfcnVubmVyKQorICAgIDogdGFza19ydW5uZXJfKHRhc2tfcnVu
bmVyKSB7fQorCitTZXJ2aWNlSVBDSG9zdEltcGw6On5TZXJ2aWNlSVBDSG9zdEltcGwoKSB7fQor
Citib29sIFNlcnZpY2VJUENIb3N0SW1wbDo6U3RhcnQoY29uc3QgY2hhciogcHJvZHVjZXJfc29j
a2V0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29u
c3VtZXJfc29ja2V0X25hbWUpIHsKKyAgUEVSRkVUVE9fQ0hFQ0soIXN2Y18pOyAgLy8gQ2hlY2sg
aWYgYWxyZWFkeSBzdGFydGVkLgorCisgIC8vIEluaXRpYWxpemUgdGhlIElQQyB0cmFuc3BvcnQu
CisgIHByb2R1Y2VyX2lwY19wb3J0XyA9CisgICAgICBpcGM6Okhvc3Q6OkNyZWF0ZUluc3RhbmNl
KHByb2R1Y2VyX3NvY2tldF9uYW1lLCB0YXNrX3J1bm5lcl8pOworICBjb25zdW1lcl9pcGNfcG9y
dF8gPQorICAgICAgaXBjOjpIb3N0OjpDcmVhdGVJbnN0YW5jZShjb25zdW1lcl9zb2NrZXRfbmFt
ZSwgdGFza19ydW5uZXJfKTsKKyAgcmV0dXJuIERvU3RhcnQoKTsKK30KKworYm9vbCBTZXJ2aWNl
SVBDSG9zdEltcGw6OlN0YXJ0KGJhc2U6OlNjb3BlZEZpbGUgcHJvZHVjZXJfc29ja2V0X2ZkLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlNjb3BlZEZpbGUgY29uc3VtZXJf
c29ja2V0X2ZkKSB7CisgIFBFUkZFVFRPX0NIRUNLKCFzdmNfKTsgIC8vIENoZWNrIGlmIGFscmVh
ZHkgc3RhcnRlZC4KKworICAvLyBJbml0aWFsaXplIHRoZSBJUEMgdHJhbnNwb3J0LgorICBwcm9k
dWNlcl9pcGNfcG9ydF8gPQorICAgICAgaXBjOjpIb3N0OjpDcmVhdGVJbnN0YW5jZShzdGQ6Om1v
dmUocHJvZHVjZXJfc29ja2V0X2ZkKSwgdGFza19ydW5uZXJfKTsKKyAgY29uc3VtZXJfaXBjX3Bv
cnRfID0KKyAgICAgIGlwYzo6SG9zdDo6Q3JlYXRlSW5zdGFuY2Uoc3RkOjptb3ZlKGNvbnN1bWVy
X3NvY2tldF9mZCksIHRhc2tfcnVubmVyXyk7CisgIHJldHVybiBEb1N0YXJ0KCk7Cit9CisKK2Jv
b2wgU2VydmljZUlQQ0hvc3RJbXBsOjpEb1N0YXJ0KCkgeworICAvLyBDcmVhdGUgYW5kIGluaXRp
YWxpemUgdGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IHRyYWNpbmcgYnVzaW5lc3MgbG9naWMuCisg
IHN0ZDo6dW5pcXVlX3B0cjxTaGFyZWRNZW1vcnk6OkZhY3Rvcnk+IHNobV9mYWN0b3J5KAorICAg
ICAgbmV3IFBvc2l4U2hhcmVkTWVtb3J5OjpGYWN0b3J5KCkpOworICBzdmNfID0gVHJhY2luZ1Nl
cnZpY2U6OkNyZWF0ZUluc3RhbmNlKHN0ZDo6bW92ZShzaG1fZmFjdG9yeSksIHRhc2tfcnVubmVy
Xyk7CisKKyAgaWYgKCFwcm9kdWNlcl9pcGNfcG9ydF8gfHwgIWNvbnN1bWVyX2lwY19wb3J0Xykg
eworICAgIFNodXRkb3duKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVE9ETyhm
bWF5ZXIpOiBhZGQgYSB0ZXN0IHRoYXQgZGVzdHJveWVzIHRoZSBTZXJ2aWNlSVBDSG9zdEltcGwg
c29vbiBhZnRlcgorICAvLyBTdGFydCgpIGFuZCBjaGVja3MgdGhhdCBubyBzcHVyaW91cyBjYWxs
YmFja3MgYXJlIGlzc3VlZC4KKyAgYm9vbCBwcm9kdWNlcl9zZXJ2aWNlX2V4cG9zZWQgPSBwcm9k
dWNlcl9pcGNfcG9ydF8tPkV4cG9zZVNlcnZpY2UoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aXBj
OjpTZXJ2aWNlPihuZXcgUHJvZHVjZXJJUENTZXJ2aWNlKHN2Y18uZ2V0KCkpKSk7CisgIFBFUkZF
VFRPX0NIRUNLKHByb2R1Y2VyX3NlcnZpY2VfZXhwb3NlZCk7CisKKyAgYm9vbCBjb25zdW1lcl9z
ZXJ2aWNlX2V4cG9zZWQgPSBjb25zdW1lcl9pcGNfcG9ydF8tPkV4cG9zZVNlcnZpY2UoCisgICAg
ICBzdGQ6OnVuaXF1ZV9wdHI8aXBjOjpTZXJ2aWNlPihuZXcgQ29uc3VtZXJJUENTZXJ2aWNlKHN2
Y18uZ2V0KCkpKSk7CisgIFBFUkZFVFRPX0NIRUNLKGNvbnN1bWVyX3NlcnZpY2VfZXhwb3NlZCk7
CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK1RyYWNpbmdTZXJ2aWNlKiBTZXJ2aWNlSVBDSG9zdElt
cGw6OnNlcnZpY2UoKSBjb25zdCB7CisgIHJldHVybiBzdmNfLmdldCgpOworfQorCit2b2lkIFNl
cnZpY2VJUENIb3N0SW1wbDo6U2h1dGRvd24oKSB7CisgIC8vIFRPRE8ocHJpbWlhbm8pOiBhZGQg
YSB0ZXN0IHRoYXQgY2F1c2VzIHRoZSBTaHV0ZG93bigpIGFuZCBjaGVja3MgdGhhdCBubworICAv
LyBzcHVyaW91cyBjYWxsYmFja3MgYXJlIGlzc3VlZC4KKyAgcHJvZHVjZXJfaXBjX3BvcnRfLnJl
c2V0KCk7CisgIGNvbnN1bWVyX2lwY19wb3J0Xy5yZXNldCgpOworICBzdmNfLnJlc2V0KCk7Cit9
CisKKy8vIERlZmluaXRpb25zIGZvciB0aGUgYmFzZSBjbGFzcyBjdG9yL2R0b3IuCitTZXJ2aWNl
SVBDSG9zdDo6U2VydmljZUlQQ0hvc3QoKSA9IGRlZmF1bHQ7CitTZXJ2aWNlSVBDSG9zdDo6flNl
cnZpY2VJUENIb3N0KCkgPSBkZWZhdWx0OworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBzb3VyY2U6IHNyYy90cmFjaW5nL2ludGVybmFsL3N5c3Rl
bV90cmFjaW5nX2JhY2tlbmQuY2MKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUg
TGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNl
IHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91
IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8v
d3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWly
ZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisg
KiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMg
SVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJ
TkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRo
ZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0
aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3N5c3RlbV90cmFjaW5nX2Jh
Y2tlbmQuaCIKKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vYmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9iYXNlL3Rhc2tfcnVubmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9jb3JlL3RyYWNpbmdfc2VydmljZS5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0L3Ry
YWNpbmcvaXBjL2RlZmF1bHRfc29ja2V0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9leHQvdHJhY2luZy9pcGMvcHJvZHVjZXJfaXBjX2NsaWVudC5o
IgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gc3Rh
dGljCitUcmFjaW5nQmFja2VuZCogU3lzdGVtVHJhY2luZ0JhY2tlbmQ6OkdldEluc3RhbmNlKCkg
eworICBzdGF0aWMgYXV0byogaW5zdGFuY2UgPSBuZXcgU3lzdGVtVHJhY2luZ0JhY2tlbmQoKTsK
KyAgcmV0dXJuIGluc3RhbmNlOworfQorCitTeXN0ZW1UcmFjaW5nQmFja2VuZDo6U3lzdGVtVHJh
Y2luZ0JhY2tlbmQoKSB7fQorCitzdGQ6OnVuaXF1ZV9wdHI8UHJvZHVjZXJFbmRwb2ludD4gU3lz
dGVtVHJhY2luZ0JhY2tlbmQ6OkNvbm5lY3RQcm9kdWNlcigKKyAgICBjb25zdCBDb25uZWN0UHJv
ZHVjZXJBcmdzJiBhcmdzKSB7CisgIFBFUkZFVFRPX0RDSEVDSyhhcmdzLnRhc2tfcnVubmVyLT5S
dW5zVGFza3NPbkN1cnJlbnRUaHJlYWQoKSk7CisKKyAgYXV0byBlbmRwb2ludCA9IFByb2R1Y2Vy
SVBDQ2xpZW50OjpDb25uZWN0KAorICAgICAgR2V0UHJvZHVjZXJTb2NrZXQoKSwgYXJncy5wcm9k
dWNlciwgYXJncy5wcm9kdWNlcl9uYW1lLCBhcmdzLnRhc2tfcnVubmVyLAorICAgICAgVHJhY2lu
Z1NlcnZpY2U6OlByb2R1Y2VyU01CU2NyYXBpbmdNb2RlOjprRW5hYmxlZCwKKyAgICAgIGFyZ3Mu
c2htZW1fc2l6ZV9oaW50X2J5dGVzLCBhcmdzLnNobWVtX3BhZ2Vfc2l6ZV9oaW50X2J5dGVzKTsK
KyAgUEVSRkVUVE9fQ0hFQ0soZW5kcG9pbnQpOworICByZXR1cm4gZW5kcG9pbnQ7Cit9CisKK3N0
ZDo6dW5pcXVlX3B0cjxDb25zdW1lckVuZHBvaW50PiBTeXN0ZW1UcmFjaW5nQmFja2VuZDo6Q29u
bmVjdENvbnN1bWVyKAorICAgIGNvbnN0IENvbm5lY3RDb25zdW1lckFyZ3MmKSB7CisgIFBFUkZF
VFRPX0ZBVEFMKAorICAgICAgIlRyYWNlIHNlc3Npb24gY3JlYXRpb24gaXMgbm90IHN1cHBvcnRl
ZCB5ZXQgd2hlbiB1c2luZyB0aGUgc3lzdGVtICIKKyAgICAgICJ0cmFjaW5nIGJhY2tlbmQuIFVz
ZSB0aGUgcGVyZmV0dG8gY21kbGluZSBjbGllbnQgaW5zdGVhZCB0byBzdGFydCAiCisgICAgICAi
c3lzdGVtLXdpZGUgdHJhY2luZyBzZXNzaW9ucyIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50
ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IHNvdXJjZTogc3JjL3RyYWNpbmcvcGxhdGZvcm1fcG9zaXguY2MKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2Vk
IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwor
ICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo
ZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cisg
KgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAq
CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdy
aXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0
cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENP
TkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUg
dGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lv
bnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZp
Zy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vZXh0
L2Jhc2UvZmlsZV91dGlscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vZXh0L2Jhc2UvdGhyZWFkX3Rhc2tfcnVubmVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNp
bmdfdGxzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by90cmFjaW5nL3BsYXRmb3JtLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNlX3dyaXRlcl9iYXNlLmgiCisKKyNpbmNsdWRlIDxw
dGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisK
K25hbWVzcGFjZSB7CisKK2NsYXNzIFBsYXRmb3JtUG9zaXggOiBwdWJsaWMgUGxhdGZvcm0gewor
IHB1YmxpYzoKKyAgUGxhdGZvcm1Qb3NpeCgpOworICB+UGxhdGZvcm1Qb3NpeCgpIG92ZXJyaWRl
OworCisgIFRocmVhZExvY2FsT2JqZWN0KiBHZXRPckNyZWF0ZVRocmVhZExvY2FsT2JqZWN0KCkg
b3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpUYXNrUnVubmVyPiBDcmVhdGVUYXNr
UnVubmVyKAorICAgICAgY29uc3QgQ3JlYXRlVGFza1J1bm5lckFyZ3MmKSBvdmVycmlkZTsKKyAg
c3RkOjpzdHJpbmcgR2V0Q3VycmVudFByb2Nlc3NOYW1lKCkgb3ZlcnJpZGU7CisKKyBwcml2YXRl
OgorICBwdGhyZWFkX2tleV90IHRsc19rZXlfe307Cit9OworCisvLyBUT0RPKHByaW1pYW5vKTog
bWFrZSBiYXNlOjpUaHJlYWRUYXNrUnVubmVyIGRpcmVjdGx5IGluaGVyaXQgVGFza1J1bm5lciwg
c28KKy8vIHdlIGNhbiBhdm9pZCB0aGlzIGJvaWxlcnBsYXRlLgorY2xhc3MgVGFza1J1bm5lcklu
c3RhbmNlIDogcHVibGljIGJhc2U6OlRhc2tSdW5uZXIgeworIHB1YmxpYzoKKyAgVGFza1J1bm5l
ckluc3RhbmNlKCk7CisgIH5UYXNrUnVubmVySW5zdGFuY2UoKSBvdmVycmlkZTsKKworICB2b2lk
IFBvc3RUYXNrKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPikgb3ZlcnJpZGU7CisgIHZvaWQgUG9zdERl
bGF5ZWRUYXNrKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiwgdWludDMyX3QgZGVsYXlfbXMpIG92ZXJy
aWRlOworICB2b2lkIEFkZEZpbGVEZXNjcmlwdG9yV2F0Y2goaW50IGZkLCBzdGQ6OmZ1bmN0aW9u
PHZvaWQoKT4pIG92ZXJyaWRlOworICB2b2lkIFJlbW92ZUZpbGVEZXNjcmlwdG9yV2F0Y2goaW50
IGZkKSBvdmVycmlkZTsKKyAgYm9vbCBSdW5zVGFza3NPbkN1cnJlbnRUaHJlYWQoKSBjb25zdCBv
dmVycmlkZTsKKworIHByaXZhdGU6CisgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXIgdGhyZWFkX3Rh
c2tfcnVubmVyXzsKK307CisKK3VzaW5nIFRocmVhZExvY2FsT2JqZWN0ID0gUGxhdGZvcm06OlRo
cmVhZExvY2FsT2JqZWN0OworCitQbGF0Zm9ybVBvc2l4OjpQbGF0Zm9ybVBvc2l4KCkgeworICBh
dXRvIHRsc19kdG9yID0gW10odm9pZCogb2JqKSB7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PFRo
cmVhZExvY2FsT2JqZWN0Kj4ob2JqKTsKKyAgfTsKKyAgUEVSRkVUVE9fQ0hFQ0socHRocmVhZF9r
ZXlfY3JlYXRlKCZ0bHNfa2V5XywgdGxzX2R0b3IpID09IDApOworfQorCitQbGF0Zm9ybVBvc2l4
Ojp+UGxhdGZvcm1Qb3NpeCgpIHsKKyAgcHRocmVhZF9rZXlfZGVsZXRlKHRsc19rZXlfKTsKK30K
KworVGhyZWFkTG9jYWxPYmplY3QqIFBsYXRmb3JtUG9zaXg6OkdldE9yQ3JlYXRlVGhyZWFkTG9j
YWxPYmplY3QoKSB7CisgIC8vIEluIGNocm9taXVtIHRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVk
IHVzaW5nIGJhc2U6OlRocmVhZExvY2FsU3RvcmFnZS4KKyAgYXV0byB0bHMgPSBzdGF0aWNfY2Fz
dDxUaHJlYWRMb2NhbE9iamVjdCo+KHB0aHJlYWRfZ2V0c3BlY2lmaWModGxzX2tleV8pKTsKKyAg
aWYgKCF0bHMpIHsKKyAgICB0bHMgPSBUaHJlYWRMb2NhbE9iamVjdDo6Q3JlYXRlSW5zdGFuY2Uo
KS5yZWxlYXNlKCk7CisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyh0bHNfa2V5XywgdGxzKTsKKyAg
fQorICByZXR1cm4gdGxzOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6VGFza1J1bm5lcj4g
UGxhdGZvcm1Qb3NpeDo6Q3JlYXRlVGFza1J1bm5lcigKKyAgICBjb25zdCBDcmVhdGVUYXNrUnVu
bmVyQXJncyYpIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpUYXNrUnVubmVyPihu
ZXcgVGFza1J1bm5lckluc3RhbmNlKCkpOworfQorCitzdGQ6OnN0cmluZyBQbGF0Zm9ybVBvc2l4
OjpHZXRDdXJyZW50UHJvY2Vzc05hbWUoKSB7CisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZF
VFRPX09TX0xJTlVYKSB8fCBcCisgICAgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0FO
RFJPSUQpCisgIHN0ZDo6c3RyaW5nIGNtZGxpbmU7CisgIGJhc2U6OlJlYWRGaWxlKCIvcHJvYy9z
ZWxmL2NtZGxpbmUiLCAmY21kbGluZSk7CisgIHJldHVybiBjbWRsaW5lLnN1YnN0cigwLCBjbWRs
aW5lLmZpbmQoJ1wwJykpOworI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX01B
Q09TWCkKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGdldHByb2duYW1lKCkpOworI2Vsc2UKKyAgcmV0
dXJuICJ1bmtub3duX3Byb2R1Y2VyIjsKKyNlbmRpZgorfQorCitUYXNrUnVubmVySW5zdGFuY2U6
OlRhc2tSdW5uZXJJbnN0YW5jZSgpCisgICAgOiB0aHJlYWRfdGFza19ydW5uZXJfKGJhc2U6OlRo
cmVhZFRhc2tSdW5uZXI6OkNyZWF0ZUFuZFN0YXJ0KCkpIHt9CitUYXNrUnVubmVySW5zdGFuY2U6
On5UYXNrUnVubmVySW5zdGFuY2UoKSA9IGRlZmF1bHQ7Cit2b2lkIFRhc2tSdW5uZXJJbnN0YW5j
ZTo6UG9zdFRhc2soc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMpIHsKKyAgdGhyZWFkX3Rhc2tf
cnVubmVyXy5nZXQoKS0+UG9zdFRhc2soZnVuYyk7Cit9CisKK3ZvaWQgVGFza1J1bm5lckluc3Rh
bmNlOjpQb3N0RGVsYXllZFRhc2soc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5X21zKSB7Cisg
IHRocmVhZF90YXNrX3J1bm5lcl8uZ2V0KCktPlBvc3REZWxheWVkVGFzayhmdW5jLCBkZWxheV9t
cyk7Cit9CisKK3ZvaWQgVGFza1J1bm5lckluc3RhbmNlOjpBZGRGaWxlRGVzY3JpcHRvcldhdGNo
KGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jKSB7CisgIHRocmVhZF90YXNrX3J1bm5lcl8uZ2V0
KCktPkFkZEZpbGVEZXNjcmlwdG9yV2F0Y2goZmQsIGZ1bmMpOworfQorCit2b2lkIFRhc2tSdW5u
ZXJJbnN0YW5jZTo6UmVtb3ZlRmlsZURlc2NyaXB0b3JXYXRjaChpbnQgZmQpIHsKKyAgdGhyZWFk
X3Rhc2tfcnVubmVyXy5nZXQoKS0+UmVtb3ZlRmlsZURlc2NyaXB0b3JXYXRjaChmZCk7Cit9CisK
K2Jvb2wgVGFza1J1bm5lckluc3RhbmNlOjpSdW5zVGFza3NPbkN1cnJlbnRUaHJlYWQoKSBjb25z
dCB7CisgIHJldHVybiB0aHJlYWRfdGFza19ydW5uZXJfLmdldCgpLT5SdW5zVGFza3NPbkN1cnJl
bnRUaHJlYWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworUGxhdGZvcm0q
IFBsYXRmb3JtOjpHZXREZWZhdWx0UGxhdGZvcm0oKSB7CisgIHN0YXRpYyBQbGF0Zm9ybVBvc2l4
KiBpbnN0YW5jZSA9IG5ldyBQbGF0Zm9ybVBvc2l4KCk7CisgIHJldHVybiBpbnN0YW5jZTsKK30K
KworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3Rm
L3BlcmZldHRvL3BlcmZldHRvLmggYi9Tb3VyY2UvV1RGL3d0Zi9wZXJmZXR0by9wZXJmZXR0by5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmNmMjVlZWEyMTAzMTFhYjEyYjRhNzc0MmJlYmRhZjhjOWI4ZGQ5MmIKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV1RGL3d0Zi9wZXJmZXR0by9wZXJmZXR0by5oCkBAIC0w
LDAgKzEsNDI0MjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNv
dXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBW
ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxl
IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFp
biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hl
Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBs
aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs
CisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy
IGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj
IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVy
IHRoZSBMaWNlbnNlLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRl
ZCBieSBnZW5fYW1hbGdhbWF0ZWQuIERvIG5vdCBlZGl0LgorCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcuaAorLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2J1ZmZlcl9leGhhdXN0
ZWRfcG9saWN5LmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBT
b3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwg
VmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmls
ZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRh
aW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNo
ZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBw
bGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmli
dXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lT
LAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhl
ciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZp
YyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRl
ciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19C
VUZGRVJfRVhIQVVTVEVEX1BPTElDWV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJ
TkdfQlVGRkVSX0VYSEFVU1RFRF9QT0xJQ1lfSF8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKwor
Ly8gRGV0ZXJtaW5lcyBob3cgU2hhcmVkTWVtb3J5QXJiaXRlckltcGw6OkdldE5ld0NodW5rKCkg
YmVoYXZlcyB3aGVuIG5vIGZyZWUKKy8vIGNodW5rcyBhcmUgYXZhaWxhYmxlLgorZW51bSBjbGFz
cyBCdWZmZXJFeGhhdXN0ZWRQb2xpY3kgeworICAvLyBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbDo6
R2V0TmV3Q2h1bmsoKSB3aWxsIHN0YWxsIGlmIG5vIGZyZWUgU01CIGNodW5rIGlzCisgIC8vIGF2
YWlsYWJsZSBhbmQgd2FpdCBmb3IgdGhlIHRyYWNpbmcgc2VydmljZSB0byBmcmVlIG9uZS4gTm90
ZSB0aGF0IHRoaXMKKyAgLy8gcmVxdWlyZXMgdGhhdCBtZXNzYWdlcyB0aGUgYXJiaXRlciBzZW5k
cyB0byB0aGUgdHJhY2luZyBzZXJ2aWNlIChmcm9tIGFueQorICAvLyBUcmFjZVdyaXRlciB0aHJl
YWQpIHdpbGwgYmUgcmVjZWl2ZWQgYnkgaXQsIGV2ZW4gaWYgYWxsIFRyYWNlV3JpdGVyIHRocmVh
ZHMKKyAgLy8gYXJlIHN0YWxsZWQuCisgIGtTdGFsbCwKKworICAvLyBTaGFyZWRNZW1vcnlBcmJp
dGVySW1wbDo6R2V0TmV3Q2h1bmsoKSB3aWxsIHJldHVybiBhbiBpbnZhbGlkIGNodW5rIGlmIG5v
CisgIC8vIGZyZWUgU01CIGNodW5rIGlzIGF2YWlsYWJsZS4gSW4gdGhpcyBjYXNlLCB0aGUgVHJh
Y2VXcml0ZXIgd2lsbCBmYWxsIGJhY2sKKyAgLy8gdG8gYSBnYXJiYWdlIGNodW5rIGFuZCBkcm9w
IHdyaXR0ZW4gZGF0YSB1bnRpbCBhY3F1aXJpbmcgYSBmdXR1cmUgY2h1bmsKKyAgLy8gc3VjY2Vl
ZHMgYWdhaW4uCisgIGtEcm9wLAorCisgIC8vIFRPRE8oZXNlY2tsZXIpOiBTd2l0Y2ggdG8ga0Ry
b3AgYnkgZGVmYXVsdCBhbmQgY2hhbmdlIHRoZSBBbmRyb2lkIGNvZGUgdG8KKyAgLy8gZXhwbGlj
aXRseSByZXF1ZXN0IGtTdGFsbCBpbnN0ZWFkLgorICBrRGVmYXVsdCA9IGtTdGFsbAorfTsKKwor
fSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19U
UkFDSU5HX0JVRkZFUl9FWEhBVVNURURfUE9MSUNZX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvY29yZS9kYXRhX3NvdXJjZV9jb25m
aWcuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90
cmFjaW5nL2NvcmUvZm9yd2FyZF9kZWNscy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRo
ZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUg
QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkg
bm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4K
KyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAg
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNz
IHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0
d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24g
YW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9G
IEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNl
IGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICog
bGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BF
UkZFVFRPX1RSQUNJTkdfQ09SRV9GT1JXQVJEX0RFQ0xTX0hfCisjZGVmaW5lIElOQ0xVREVfUEVS
RkVUVE9fVFJBQ0lOR19DT1JFX0ZPUldBUkRfREVDTFNfSF8KKworLy8gRm9yd2FyZCBkZWNsYXJl
cyBjbGFzc2VzIHRoYXQgYXJlIGdlbmVyYXRlZCBhdCBidWlsZC10aW1lIGZyb20gcHJvdG9zLgor
Ly8gRmlyc3Qgb2YgYWxsLCB3aHkgYXJlIHdlIGZvcndhcmQgZGVjbGFyaW5nIGF0IGFsbD8KKy8v
ICAxLiBDaHJvbWl1bSBkaXZlcmdlcyBmcm9tIHRoZSBHb29nbGUgc3R5bGUgZ3VpZGUgb24gdGhp
cywgYmVjYXVzZSBmb3J3YXJkCisvLyAgICAgZGVjbGFyYXRpb25zIHR5cGljYWxseSBtYWtlIGJ1
aWxkIHRpbWVzIGZhc3RlciwgYW5kIHRoYXQncyBhIGRlc2lyYWJsZQorLy8gICAgIHByb3BlcnR5
IGZvciBhIGxhcmdlIGFuZCBjb21wbGV4IGNvZGViYXNlLgorLy8gIDIuIEFkZGluZyAjaW5jbHVk
ZSB0byBidWlsZC10aW1lLWdlbmVyYXRlZCBoZWFkZXJzIGZyb20gaGVhZGVycyB0eXBpY2FsbHkK
Ky8vICAgICBjcmVhdGVzIHN1YnRsZSBidWlsZCBlcnJvcnMgdGhhdCBhcmUgaGFyZCB0byBzcG90
IGluIEdOLiBUaGlzIGlzIGJlY2F1c2UKKy8vICAgICBvbmNlIGEgc3RhbmRhcmQgaGVhZGVyIChz
YXkgZm9vLmgpIGhhcyBhbiAjaW5jbHVkZSAicHJvdG9zL2Zvby5nZW4uaCIsCisvLyAgICAgdGhl
IGJ1aWxkIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gZm9vLmggbmVlZHMgdG8gZGVwZW5kIG9uIHRo
ZSBnZW5ydWxlCisvLyAgICAgdGhhdCBnZW5lcmF0ZXMgZm9vLmdlbi5oLiBUaGlzIGlzIGFjaGll
dmFibGUgdXNpbmcgcHVibGljX2RlcHMgaW4gR04gYnV0CisvLyAgICAgaXMgbm90IHRlc3RhYmxl
IC8gZW5mb3JjZWFibGUsIGhlbmNlIHRvbyBlYXN5IHRvIGdldCB3cm9uZy4KKworLy8gSGlzdG9y
aWNhbGx5IHRoZSBjbGFzc2VzIGJlbG93IHVzZWQgdG8gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGNv
cnJlc3BvbmRpbmcKKy8vIC5wcm90byhzKSBhdCBDTCAqY2hlY2staW4qIHRpbWUgKCE9IGJ1aWxk
IHRpbWUpIGluIHRoZSA6OnBlcmZldHRvIG5hbWVzcGFjZS4KKy8vIE5vd2FkYXlzIHdlIGhhdmUg
Y29kZSBldmVyeXdoZXJlIHRoYXQgYXNzdW1lIHRoZSByaWdodCBjbGFzcyBpcworLy8gOjpwZXJm
ZXR0bzo6VHJhY2VDb25maWcgb3IgdGhlIGxpa2UuIEJhY2sgdGhlbiBvdGhlciBoZWFkZXJzIGNv
dWxkIGp1c3QKKy8vIGZvcndhcmQgZGVjbGFyZWQgOjpwZXJmZXR0bzo6VHJhY2VDb25maWcuIFRo
ZXNlIGRheXMsIHRoZSByZWFsIGNsYXNzIGlzCisvLyA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6
VHJhY2VDb25maWcgYW5kIGNvcmUvdHJhY2VfY29uZmlnLmggYWxpYXNlcyB0aGF0IGFzCisvLyB1
c2luZyA6OnBlcmZldHRvOjpUcmFjZUNvbmZpZyA9IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpU
cmFjZUNvbmZpZy4KKy8vIEluIEMrKyBvbmUgY2Fubm90IGZvcndhcmQgZGVjbGFyZSBhIHR5cGUg
YWxpYXMgKGJ1dCBvbmx5IHRoZSBhbGlhc2VkIHR5cGUpLgorLy8gSGVuY2UgdGhpcyBoZWFkZXIs
IHdoaWNoIHNob3VsZCBiZSB1c2VkIGV2ZXJ5IHRpbWUgb25lIHdhbnRzIHRvIGZvcndhcmQKKy8v
IGRlY2xhcmUgY2xhc3NlcyBsaWtlIFRyYWNlQ29uZmlnLgorCisvLyBUaGUgb3ZlcmFsbCBwbGFu
IGlzIHRoYXQsIHdoZW4gb25lIG9mIHRoZSBjbGFzc2VzIGJlbG93IGlzIG5lZWRlZDoKKy8vIFRo
ZSAuaCBmaWxlIGluY2x1ZGVzIHRoaXMgZmlsZS4KKy8vIFRoZSAuY2MgZmlsZSBpbmNsdWRlcyBw
ZXJmZXR0by90cmFjaW5nL2NvcmUvdHJhY2VfY29uZmlnLmggKG9yIGVxdWl2KS4gVGhhdAorLy8g
aGVhZGVyIHdpbGwgcHVsbCB0aGUgZnVsbCBkZWNsYXJhdGlvbiBmcm9tIHRyYWNlX2NvbmZpZy5n
ZW4uaCBhbmQgd2lsbCBhbHNvCisvLyBzZXR1cCB0aGUgYWxpYXMgaW4gdGhlIDo6cGVyZmV0dG8g
bmFtZXNwYWNlLgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7Citu
YW1lc3BhY2UgZ2VuIHsKKworY2xhc3MgQ2hyb21lQ29uZmlnOworY2xhc3MgQ29tbWl0RGF0YVJl
cXVlc3Q7CitjbGFzcyBEYXRhU291cmNlQ29uZmlnOworY2xhc3MgRGF0YVNvdXJjZURlc2NyaXB0
b3I7CitjbGFzcyBPYnNlcnZhYmxlRXZlbnRzOworY2xhc3MgVHJhY2VDb25maWc7CitjbGFzcyBU
cmFjZVN0YXRzOworY2xhc3MgVHJhY2luZ1NlcnZpY2VDYXBhYmlsaXRpZXM7CitjbGFzcyBUcmFj
aW5nU2VydmljZVN0YXRlOworCit9ICAvLyBuYW1lc3BhY2UgZ2VuCit9ICAvLyBuYW1lc3BhY2Ug
cHJvdG9zCisKK3VzaW5nIENocm9tZUNvbmZpZyA9IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpD
aHJvbWVDb25maWc7Cit1c2luZyBDb21taXREYXRhUmVxdWVzdCA9IDo6cGVyZmV0dG86OnByb3Rv
czo6Z2VuOjpDb21taXREYXRhUmVxdWVzdDsKK3VzaW5nIERhdGFTb3VyY2VDb25maWcgPSA6OnBl
cmZldHRvOjpwcm90b3M6Omdlbjo6RGF0YVNvdXJjZUNvbmZpZzsKK3VzaW5nIERhdGFTb3VyY2VE
ZXNjcmlwdG9yID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpnZW46OkRhdGFTb3VyY2VEZXNjcmlwdG9y
OwordXNpbmcgT2JzZXJ2YWJsZUV2ZW50cyA9IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpPYnNl
cnZhYmxlRXZlbnRzOwordXNpbmcgVHJhY2VDb25maWcgPSA6OnBlcmZldHRvOjpwcm90b3M6Omdl
bjo6VHJhY2VDb25maWc7Cit1c2luZyBUcmFjZVN0YXRzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpn
ZW46OlRyYWNlU3RhdHM7Cit1c2luZyBUcmFjaW5nU2VydmljZUNhcGFiaWxpdGllcyA9CisgICAg
OjpwZXJmZXR0bzo6cHJvdG9zOjpnZW46OlRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzOwordXNp
bmcgVHJhY2luZ1NlcnZpY2VTdGF0ZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6Z2VuOjpUcmFjaW5n
U2VydmljZVN0YXRlOworCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJ
TkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfQ09SRV9GT1JXQVJEX0RFQ0xTX0hfCisvLyBnZW5fYW1h
bGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9kYXRhX3Nv
dXJjZV9jb25maWcuZ2VuLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1
ZGUvcGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL2Jhc2UvZXhwb3J0LmgKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS9idWlsZF9jb25m
aWcuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL2J1aWxkX2NvbmZpZy9w
ZXJmZXR0b19idWlsZF9mbGFncy5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRy
b2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hl
IExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDov
L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVp
cmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQor
ICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFT
IElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0
aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRh
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gR2VuZXJhdGVkIGJ5IC4uLy4uL2du
L3dyaXRlX2J1aWxkZmxhZ19oZWFkZXIucHkKKworLy8gZml4X2luY2x1ZGVfZ3VhcmRzOiBvZmYK
KyNpZm5kZWYgR0VOX0JVSUxEX0NPTkZJR19QRVJGRVRUT19CVUlMRF9GTEFHU19IXworI2RlZmlu
ZSBHRU5fQlVJTERfQ09ORklHX1BFUkZFVFRPX0JVSUxEX0ZMQUdTX0hfCisKKy8vIGNsYW5nLWZv
cm1hdCBvZmYKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19BTkRS
T0lEX0JVSUxEKCkgKDApCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVU
VE9fQ0hST01JVU1fQlVJTEQoKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklO
RV9QRVJGRVRUT19TVEFOREFMT05FX0JVSUxEKCkgKDApCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxE
RkxBR19ERUZJTkVfUEVSRkVUVE9fU1RBUlRfREFFTU9OUygpICgxKQorI2RlZmluZSBQRVJGRVRU
T19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0lQQygpICgxKQorI2RlZmluZSBQRVJGRVRUT19C
VUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX1dBVENIRE9HKCkgKDApCisjZGVmaW5lIFBFUkZFVFRP
X0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fQ09NUE9ORU5UX0JVSUxEKCkgKDApCisjZGVmaW5l
IFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fRk9SQ0VfRExPR19PTigpICgwKQor
I2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0ZPUkNFX0RMT0dfT0ZG
KCkgKDApCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fVkVSQk9T
RV9MT0dTKCkgKDEpCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
VkVSU0lPTl9HRU4oKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJG
RVRUT19UUF9QRVJDRU5USUxFKCkgKDApCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJ
TkVfUEVSRkVUVE9fVFBfTElORU5PSVNFKCkgKDApCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxB
R19ERUZJTkVfUEVSRkVUVE9fVFBfSFRUUEQoKSAoMCkKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERG
TEFHX0RFRklORV9QRVJGRVRUT19UUF9KU09OKCkgKDEpCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxE
RkxBR19ERUZJTkVfUEVSRkVUVE9fTE9DQUxfU1lNQk9MSVpFUigpICgwKQorI2RlZmluZSBQRVJG
RVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX1pMSUIoKSAoMSkKKworLy8gY2xhbmctZm9y
bWF0IG9uCisjZW5kaWYgIC8vIEdFTl9CVUlMRF9DT05GSUdfUEVSRkVUVE9fQlVJTERfRkxBR1Nf
SF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJv
amVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAy
LjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQg
aW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5
IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj
ZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBs
YXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRl
ciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lU
SE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNz
IG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFn
ZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGlj
ZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9CVUlMRF9DT05GSUdf
SF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19CQVNFX0JVSUxEX0NPTkZJR19IXworCisvLyBB
bGxvd3MgdG8gZGVmaW5lIGJ1aWxkIGZsYWdzIHRoYXQgZ2l2ZSBhIGNvbXBpbGVyIGVycm9yIGlm
IHRoZSBoZWFkZXIgdGhhdAorLy8gZGVmaW5lZCB0aGUgZmxhZyBpcyBub3QgaW5jbHVkZWQsIGlu
c3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlICNpZiBibG9jay4KKyNkZWZpbmUgUEVSRkVU
VE9fQlVJTERGTEFHX0NBVF9JTkRJUkVDVChhLCBiKSBhIyNiCisjZGVmaW5lIFBFUkZFVFRPX0JV
SUxERkxBR19DQVQoYSwgYikgUEVSRkVUVE9fQlVJTERGTEFHX0NBVF9JTkRJUkVDVChhLCBiKQor
I2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUcoZmxhZykgXAorICAoUEVSRkVUVE9fQlVJTERGTEFH
X0NBVChQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FXywgZmxhZykoKSkKKworI2lmIGRlZmluZWQo
X19BTkRST0lEX18pCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
T1NfQU5EUk9JRCgpIDEKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRU
T19PU19NQUNPU1goKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVU
VE9fT1NfTElOVVgoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVU
VE9fT1NfV0lOKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRP
X09TX1dBU00oKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
T1NfRlVDSFNJQSgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRU
T19PU19OQUNMKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRP
X09TX0lPUygpIDAKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorI2RlZmluZSBQRVJGRVRUT19C
VUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX0FORFJPSUQoKSAwCisjZGVmaW5lIFBFUkZFVFRP
X0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfTUFDT1NYKCkgMQorI2RlZmluZSBQRVJGRVRU
T19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX0xJTlVYKCkgMAorI2RlZmluZSBQRVJGRVRU
T19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX1dJTigpIDAKKyNkZWZpbmUgUEVSRkVUVE9f
QlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19XQVNNKCkgMAorI2RlZmluZSBQRVJGRVRUT19C
VUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX0ZVQ0hTSUEoKSAwCisjZGVmaW5lIFBFUkZFVFRP
X0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfTkFDTCgpIDAKKy8vIEluY2x1ZGUgVEFSR0VU
X09TX0lQSE9ORSB3aGVuIG9uIF9fQVBQTEVfXyBzeXN0ZW1zLgorI2luY2x1ZGUgPFRhcmdldENv
bmRpdGlvbmFscy5oPgorI2lmIGRlZmluZWQoVEFSR0VUX09TX0lQSE9ORSkgJiYgVEFSR0VUX09T
X0lQSE9ORQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX0lP
UygpIDEKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
T1NfSU9TKCkgMAorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyNkZWZpbmUgUEVS
RkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19BTkRST0lEKCkgMAorI2RlZmluZSBQ
RVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX01BQ09TWCgpIDAKKyNkZWZpbmUg
UEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19MSU5VWCgpIDEKKyNkZWZpbmUg
UEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19XSU4oKSAwCisjZGVmaW5lIFBF
UkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfV0FTTSgpIDAKKyNkZWZpbmUgUEVS
RkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19GVUNIU0lBKCkgMAorI2RlZmluZSBQ
RVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX05BQ0woKSAwCisjZGVmaW5lIFBF
UkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfSU9TKCkgMAorI2VsaWYgZGVmaW5l
ZChfV0lOMzIpCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1Nf
QU5EUk9JRCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19P
U19NQUNPU1goKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
T1NfTElOVVgoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
T1NfV0lOKCkgMQorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09T
X1dBU00oKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1Nf
RlVDSFNJQSgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19P
U19OQUNMKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09T
X0lPUygpIDAKKyNlbGlmIGRlZmluZWQoX19FTVNDUklQVEVOX18pCisjZGVmaW5lIFBFUkZFVFRP
X0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfQU5EUk9JRCgpIDAKKyNkZWZpbmUgUEVSRkVU
VE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19NQUNPU1goKSAwCisjZGVmaW5lIFBFUkZF
VFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfTElOVVgoKSAwCisjZGVmaW5lIFBFUkZF
VFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfV0lOKCkgMAorI2RlZmluZSBQRVJGRVRU
T19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX1dBU00oKSAxCisjZGVmaW5lIFBFUkZFVFRP
X0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfRlVDSFNJQSgpIDAKKyNkZWZpbmUgUEVSRkVU
VE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19OQUNMKCkgMAorI2RlZmluZSBQRVJGRVRU
T19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX0lPUygpIDAKKyNlbGlmIGRlZmluZWQoX19G
dWNoc2lhX18pCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1Nf
QU5EUk9JRCgpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19P
U19NQUNPU1goKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
T1NfTElOVVgoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9f
T1NfV0lOKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09T
X1dBU00oKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1Nf
RlVDSFNJQSgpIDEKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19P
U19OQUNMKCkgMAorI2RlZmluZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09T
X0lPUygpIDAKKyNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisjZGVmaW5lIFBFUkZF
VFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfQU5EUk9JRCgpIDAKKyNkZWZpbmUgUEVS
RkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19NQUNPU1goKSAwCisjZGVmaW5lIFBF
UkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfTElOVVgoKSAwCisjZGVmaW5lIFBF
UkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfV0lOKCkgMAorI2RlZmluZSBQRVJG
RVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX1dBU00oKSAwCisjZGVmaW5lIFBFUkZF
VFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fT1NfRlVDSFNJQSgpIDAKKyNkZWZpbmUgUEVS
RkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19PU19OQUNMKCkgMQorI2RlZmluZSBQRVJG
RVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX09TX0lPUygpIDAKKyNlbHNlCisjZXJyb3Ig
T1Mgbm90IHN1cHBvcnRlZCAoc2VlIGJ1aWxkX2NvbmZpZy5oKQorI2VuZGlmCisKKyNpZiBkZWZp
bmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRU
T19DT01QSUxFUl9DTEFORygpIDEKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9Q
RVJGRVRUT19DT01QSUxFUl9HQ0MoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJ
TkVfUEVSRkVUVE9fQ09NUElMRVJfTVNWQygpIDAKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pIC8v
IENhcmVmdWw6IENsYW5nIGFsc28gZGVmaW5lcyB0aGlzIQorI2RlZmluZSBQRVJGRVRUT19CVUlM
REZMQUdfREVGSU5FX1BFUkZFVFRPX0NPTVBJTEVSX0NMQU5HKCkgMAorI2RlZmluZSBQRVJGRVRU
T19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0NPTVBJTEVSX0dDQygpIDEKKyNkZWZpbmUgUEVS
RkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19DT01QSUxFUl9NU1ZDKCkgMAorI2VsaWYg
ZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJG
RVRUT19DT01QSUxFUl9DTEFORygpIDAKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklO
RV9QRVJGRVRUT19DT01QSUxFUl9HQ0MoKSAwCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19E
RUZJTkVfUEVSRkVUVE9fQ09NUElMRVJfTVNWQygpIDEKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRP
X0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fQ09NUElMRVJfQ0xBTkcoKSAwCisjZGVmaW5lIFBF
UkZFVFRPX0JVSUxERkxBR19ERUZJTkVfUEVSRkVUVE9fQ09NUElMRVJfR0NDKCkgMAorI2RlZmlu
ZSBQRVJGRVRUT19CVUlMREZMQUdfREVGSU5FX1BFUkZFVFRPX0NPTVBJTEVSX01TVkMoKSAwCisj
ZW5kaWYKKworI2lmIGRlZmluZWQoUEVSRkVUVE9fQlVJTERfV0lUSF9BTkRST0lEX1VTRVJERUJV
RykKKyNkZWZpbmUgUEVSRkVUVE9fQlVJTERGTEFHX0RFRklORV9QRVJGRVRUT19BTkRST0lEX1VT
RVJERUJVR19CVUlMRCgpIDEKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX0JVSUxERkxBR19ERUZJ
TkVfUEVSRkVUVE9fQU5EUk9JRF9VU0VSREVCVUdfQlVJTEQoKSAwCisjZW5kaWYKKworLy8gcGVy
ZmV0dG9fYnVpbGRfZmxhZ3MuaCBjb250YWlucyB0aGUgdHdlYWthYmxlIGJ1aWxkIGZsYWdzIGRl
ZmluZWQgdmlhIEdOLgorLy8gLSBJbiBHTiBidWlsZHMgKGUuZy4sIHN0YW5kYWxvbmUsIGNocm9t
aXVtLCB2OCkgdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdAorLy8gICBidWlsZCB0aW1lIHZpYSB0
aGUgZ2VuX3J1bGUgLy9nbi9nZW5fYnVpbGRmbGFncy4KKy8vIC0gSW4gQW5kcm9pZCBpbi10cmVl
IGJ1aWxkcywgdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSB0b29scy9nZW5fYW5kcm9pZF9icAor
Ly8gICBhbmQgY2hlY2tlZCBpbiBpbnRvIGluY2x1ZGUvcGVyZmV0dG8vYmFzZS9idWlsZF9jb25m
aWdzL2FuZHJvaWRfdHJlZS8uIFRoZQorLy8gICBkZWZhdWx0IGNmbGFncyBhZGQgdGhpcyBwYXRo
IHRvIHRoZSBkZWZhdWx0IGluY2x1ZGUgcGF0aC4KKy8vIC0gU2ltaWxhcmx5LCBpbiBiYXplbCBi
dWlsZHMsIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgdG9vbHMvZ2VuX2JhemVsIGFuZAorLy8g
ICBjaGVja2VkIGluIGludG8gaW5jbHVkZS9wZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZ3MvYmF6
ZWwvLgorLy8gLSBJbiBhbWFnbGFtYXRlZCBidWlsZHMsIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQg
YnkgdG9vbHMvZ2VuX2FtYWxnYW1hdGVkIGFuZAorLy8gICBhZGRlZCB0byB0aGUgYW1hbGdhbWF0
ZWQgaGVhZGVycy4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvX2J1aWxkX2ZsYWdzLmgiICAvLyBuby1pbmNsdWRlLXZpb2xhdGlvbi1jaGVjaworCisjZW5k
aWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9CVUlMRF9DT05GSUdfSF8KKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExp
Y2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5z
ZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3
aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl
IGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0y
LjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRv
IGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBp
cyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVT
IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisg
KiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVy
bWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisj
aWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9FWFBPUlRfSF8KKyNkZWZpbmUgSU5DTFVERV9Q
RVJGRVRUT19CQVNFX0VYUE9SVF9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorCisjaWYgUEVSRkVUVE9fQlVJ
TERGTEFHKFBFUkZFVFRPX0NPTVBPTkVOVF9CVUlMRCkKKworI2lmIFBFUkZFVFRPX0JVSUxERkxB
RyhQRVJGRVRUT19PU19XSU4pCisKKyNpZiBkZWZpbmVkKFBFUkZFVFRPX0lNUExFTUVOVEFUSU9O
KQorI2RlZmluZSBQRVJGRVRUT19FWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZWxzZQor
I2RlZmluZSBQRVJGRVRUT19FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKwor
I2Vsc2UgIC8vIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisKKyNpZiBkZWZp
bmVkKFBFUkZFVFRPX0lNUExFTUVOVEFUSU9OKQorI2RlZmluZSBQRVJGRVRUT19FWFBPUlQgX19h
dHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbHNlCisjZGVmaW5lIFBFUkZF
VFRPX0VYUE9SVAorI2VuZGlmCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZF
VFRPX09TX1dJTikKKworI2Vsc2UgIC8vICFQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fQ09N
UE9ORU5UX0JVSUxEKQorCisjZGVmaW5lIFBFUkZFVFRPX0VYUE9SVAorCisjZW5kaWYgIC8vIFBF
UkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19DT01QT05FTlRfQlVJTEQpCisKKyNlbmRpZiAgLy8g
SU5DTFVERV9QRVJGRVRUT19CQVNFX0VYUE9SVF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
OSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIg
dGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3Ug
bWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vu
c2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAg
ICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVu
bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywg
c29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVk
IG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9O
UyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGlj
ZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQK
KyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVE
RV9QRVJGRVRUT19QUk9UT1pFUk9fQ1BQX01FU1NBR0VfT0JKX0hfCisjZGVmaW5lIElOQ0xVREVf
UEVSRkVUVE9fUFJPVE9aRVJPX0NQUF9NRVNTQUdFX09CSl9IXworCisjaW5jbHVkZSA8c3RkaW50
Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCitu
YW1lc3BhY2UgcHJvdG96ZXJvIHsKKworLy8gQmFzZSBjbGFzcyBmb3IgZ2VuZXJhdGVkIC5nZW4u
aCBjbGFzc2VzLCB3aGljaCBhcmUgZnVsbCBDKysgb2JqZWN0cyB0aGF0CisvLyBzdXBwb3J0IGJv
dGggc2VyIGFuZCBkZXNlcmlhbGl6YXRpb24gKGJ1dCBhcmUgbm90IHplcm8tY29weSkuCisvLyBU
aGlzIGlzIG9ubHkgdXNlZCBieSB0aGUgImNwcCIgdGFyZ2V0cyBub3QgdGhlICJwYnplcm8iIG9u
ZXMuCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgQ3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICB2
aXJ0dWFsIH5DcHBNZXNzYWdlT2JqKCk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgU2VyaWFsaXpl
QXNTdHJpbmcoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2Vy
aWFsaXplQXNBcnJheSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIFBhcnNlRnJvbUFycmF5
KGNvbnN0IHZvaWQqLCBzaXplX3QpID0gMDsKKworICBib29sIFBhcnNlRnJvbVN0cmluZyhjb25z
dCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIFBhcnNlRnJvbUFycmF5KHN0ci5kYXRh
KCksIHN0ci5zaXplKCkpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisK
KyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fQ1BQX01FU1NBR0VfT0JKX0hf
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3Rv
emVyby9jb3B5YWJsZV9wdHIuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19Q
Uk9UT1pFUk9fQ09QWUFCTEVfUFRSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9a
RVJPX0NPUFlBQkxFX1BUUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgcHJv
dG96ZXJvIHsKKworLy8gVGhpcyBjbGFzcyBpcyBlc3NlbnRpYWxseSBhIHN0ZDo6dmVjdG9yPFQ+
IG9mIGZpeGVkIHNpemUgPSAxLgorLy8gSXQncyBhIHBvaW50ZXIgd3JhcHBlciB3aXRoIGRlZXAg
Y29weWluZyBhbmQgZGVlcCBlcXVhbGl0eSBjb21wYXJpc29uLgorLy8gQXQgYWxsIGVmZmVjdHMg
dGhpcyB3cmFwcGVyIGJlaGF2ZXMgbGlrZSB0aGUgdW5kZXJseWluZyBULCB3aXRoIHRoZSBleGNl
cHRpb24KKy8vIG9mIHRoZSBoZWFwIGluZGlyZWN0aW9uLgorLy8gQ29udmVyc2VseSB0byBhIHN0
ZDo6dW5pcXVlX3B0ciwgdGhlIHBvaW50ZXIgd2lsbCBiZSBhbHdheXMgdmFsaWQsIG5ldmVyCisv
LyBudWxsLiBUaGUgcHJvYmxlbSBpdCBzb2x2ZXMgaXMgdGhlIGZvbGxvd2luZzogd2hlbiBnZW5l
cmF0aW5nIEMrKyBjbGFzc2VzCisvLyBmcm9tIHByb3RvIGZpbGVzLCB3ZSB3YW50IHRvIGtlZXAg
ZWFjaCBoZWFkZXIgaGVybWV0aWMgKGkuZS4gbm90ICNpbmNsdWRlCisvLyBoZWFkZXJzIG9mIGRl
cGVuZGVudCB0eXBlcykuIEFzIHN1Y2ggd2UgY2FuJ3QgZGlyZWN0bHkgaW5zdGFudGlhdGUgVAor
Ly8gZmllbGQgbWVtYmVycyBidXQgd2UgY2FuIGluc3RlYWQgcmVseSBvbiBwb2ludGVycywgc28g
b25seSB0aGUgLmNjIGZpbGUgbmVlZHMKKy8vIHRvIHNlZSB0aGUgYWN0dWFsIGRlZmluaXRpb24g
b2YgVC4gSWYgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIHdlcmUgbW92ZS1vbmx5IHdlCisvLyBjb3Vs
ZCBqdXN0IHVzZSBhIHVuaXF1ZV9wdHIgdGhlcmUuIEJ1dCB0aGV5IGFyZW4ndCwgaGVuY2UgdGhp
cyB3cmFwcGVyLgorLy8gQ29udmVyZXNlbHkgdG8gdW5pcXVlX3B0ciwgdGhpcyB3cmFwcGVyOgor
Ly8gLSBEZWZhdWx0IGNvbnN0cnVjdHMgdGhlIFQgaW5zdGFuY2UgaW4gaXRzIGNvbnN0cnVjdG9y
LgorLy8gLSBJbXBsZW1lbnRzIGRlZXAgY29tcGFyaXNvbiBpbiBvcGVyYXRvcj09IGluc3RlYWQg
b2YgcG9pbnRlciBjb21wYXJpc29uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDb3B5
YWJsZVB0ciB7CisgcHVibGljOgorICBDb3B5YWJsZVB0cigpIDogcHRyXyhuZXcgVCgpKSB7fQor
ICB+Q29weWFibGVQdHIoKSA9IGRlZmF1bHQ7CisKKyAgLy8gQ29weSBvcGVyYXRvcnMuCisgIENv
cHlhYmxlUHRyKGNvbnN0IENvcHlhYmxlUHRyJiBvdGhlcikgOiBwdHJfKG5ldyBUKCpvdGhlci5w
dHJfKSkge30KKyAgQ29weWFibGVQdHImIG9wZXJhdG9yPShjb25zdCBDb3B5YWJsZVB0ciYgb3Ro
ZXIpIHsKKyAgICAqcHRyXyA9ICpvdGhlci5wdHJfOworICAgIHJldHVybiAqdGhpczsKKyAgfQor
CisgIC8vIE1vdmUgb3BlcmF0b3JzLgorICBDb3B5YWJsZVB0cihDb3B5YWJsZVB0ciYmIG90aGVy
KSBub2V4Y2VwdCA6IHB0cl8oc3RkOjptb3ZlKG90aGVyLnB0cl8pKSB7CisgICAgb3RoZXIucHRy
Xy5yZXNldChuZXcgVCgpKTsKKyAgfQorCisgIENvcHlhYmxlUHRyJiBvcGVyYXRvcj0oQ29weWFi
bGVQdHImJiBvdGhlcikgeworICAgIHB0cl8gPSBzdGQ6Om1vdmUob3RoZXIucHRyXyk7CisgICAg
b3RoZXIucHRyXy5yZXNldChuZXcgVCgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBU
KiBnZXQoKSB7IHJldHVybiBwdHJfLmdldCgpOyB9CisgIGNvbnN0IFQqIGdldCgpIGNvbnN0IHsg
cmV0dXJuIHB0cl8uZ2V0KCk7IH0KKworICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gcHRyXy5n
ZXQoKTsgfQorICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcHRyXy5nZXQo
KTsgfQorCisgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICpwdHJfOyB9CisgIGNvbnN0IFQmIG9w
ZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpwdHJfOyB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBDb3B5YWJsZVB0ciYgbGhzLCBjb25zdCBDb3B5YWJsZVB0ciYgcmhzKSB7Cisg
ICAgcmV0dXJuICpsaHMgPT0gKnJoczsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0o
Y29uc3QgQ29weWFibGVQdHImIGxocywgY29uc3QgQ29weWFibGVQdHImIHJocykgeworICAgIC8v
IEluIHRoZW9yeSB0aGUgdW5kZXJseWluZyB0eXBlIG1pZ2h0IGhhdmUgYSBzcGVjaWFsIG9wZXJh
dG9yIT0KKyAgICAvLyBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBub3QganVzdCAhKHggPT0geSku
IFJlc3BlY3QgdGhhdC4KKyAgICByZXR1cm4gKmxocyAhPSAqcmhzOworICB9CisKKyBwcml2YXRl
OgorICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcHRyXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90
b3plcm8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19DT1BZQUJMRV9Q
VFJfSF8KKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZldHRvIGNwcGdlbl9w
bHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfREFU
QV9TT1VSQ0VfQ09ORklHX1BST1RPX0NQUF9IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX0NPTkZJR19EQVRBX1NPVVJDRV9DT05GSUdfUFJPVE9fQ1BQX0hfCisKKyNp
bmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgor
I2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdl
X29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBEYXRhU291cmNlQ29u
ZmlnOworY2xhc3MgVGVzdENvbmZpZzsKK2NsYXNzIFRlc3RDb25maWdfRHVtbXlGaWVsZHM7Citj
bGFzcyBDaHJvbWVDb25maWc7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVz
cGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNlIHByb3RvemVybyB7
CitjbGFzcyBNZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKKworY2xhc3Mg
UEVSRkVUVE9fRVhQT1JUIERhdGFTb3VyY2VDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNw
cE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtOYW1l
RmllbGROdW1iZXIgPSAxLAorICAgIGtUYXJnZXRCdWZmZXJGaWVsZE51bWJlciA9IDIsCisgICAg
a1RyYWNlRHVyYXRpb25Nc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrU3RvcFRpbWVvdXRNc0ZpZWxk
TnVtYmVyID0gNywKKyAgICBrRW5hYmxlRXh0cmFHdWFyZHJhaWxzRmllbGROdW1iZXIgPSA2LAor
ICAgIGtUcmFjaW5nU2Vzc2lvbklkRmllbGROdW1iZXIgPSA0LAorICAgIGtGdHJhY2VDb25maWdG
aWVsZE51bWJlciA9IDEwMCwKKyAgICBrSW5vZGVGaWxlQ29uZmlnRmllbGROdW1iZXIgPSAxMDIs
CisgICAga1Byb2Nlc3NTdGF0c0NvbmZpZ0ZpZWxkTnVtYmVyID0gMTAzLAorICAgIGtTeXNTdGF0
c0NvbmZpZ0ZpZWxkTnVtYmVyID0gMTA0LAorICAgIGtIZWFwcHJvZmRDb25maWdGaWVsZE51bWJl
ciA9IDEwNSwKKyAgICBrSmF2YUhwcm9mQ29uZmlnRmllbGROdW1iZXIgPSAxMTAsCisgICAga0Fu
ZHJvaWRQb3dlckNvbmZpZ0ZpZWxkTnVtYmVyID0gMTA2LAorICAgIGtBbmRyb2lkTG9nQ29uZmln
RmllbGROdW1iZXIgPSAxMDcsCisgICAga0dwdUNvdW50ZXJDb25maWdGaWVsZE51bWJlciA9IDEw
OCwKKyAgICBrUGFja2FnZXNMaXN0Q29uZmlnRmllbGROdW1iZXIgPSAxMDksCisgICAga1BlcmZF
dmVudENvbmZpZ0ZpZWxkTnVtYmVyID0gMTExLAorICAgIGtWdWxrYW5NZW1vcnlDb25maWdGaWVs
ZE51bWJlciA9IDExMiwKKyAgICBrVHJhY2tFdmVudENvbmZpZ0ZpZWxkTnVtYmVyID0gMTEzLAor
ICAgIGtBbmRyb2lkUG9sbGVkU3RhdGVDb25maWdGaWVsZE51bWJlciA9IDExNCwKKyAgICBrQ2hy
b21lQ29uZmlnRmllbGROdW1iZXIgPSAxMDEsCisgICAga0xlZ2FjeUNvbmZpZ0ZpZWxkTnVtYmVy
ID0gMTAwMCwKKyAgICBrRm9yVGVzdGluZ0ZpZWxkTnVtYmVyID0gMTAwMSwKKyAgfTsKKworICBE
YXRhU291cmNlQ29uZmlnKCk7CisgIH5EYXRhU291cmNlQ29uZmlnKCkgb3ZlcnJpZGU7CisgIERh
dGFTb3VyY2VDb25maWcoRGF0YVNvdXJjZUNvbmZpZyYmKSBub2V4Y2VwdDsKKyAgRGF0YVNvdXJj
ZUNvbmZpZyYgb3BlcmF0b3I9KERhdGFTb3VyY2VDb25maWcmJik7CisgIERhdGFTb3VyY2VDb25m
aWcoY29uc3QgRGF0YVNvdXJjZUNvbmZpZyYpOworICBEYXRhU291cmNlQ29uZmlnJiBvcGVyYXRv
cj0oY29uc3QgRGF0YVNvdXJjZUNvbmZpZyYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGF0
YVNvdXJjZUNvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGF0YVNvdXJj
ZUNvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAg
Ym9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3Rk
OjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0
b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNl
cmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX25hbWUo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYg
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQor
CisgIGJvb2wgaGFzX3RhcmdldF9idWZmZXIoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sy
XTsgfQorICB1aW50MzJfdCB0YXJnZXRfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gdGFyZ2V0X2J1
ZmZlcl87IH0KKyAgdm9pZCBzZXRfdGFyZ2V0X2J1ZmZlcih1aW50MzJfdCB2YWx1ZSkgeyB0YXJn
ZXRfYnVmZmVyXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc190
cmFjZV9kdXJhdGlvbl9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIHVp
bnQzMl90IHRyYWNlX2R1cmF0aW9uX21zKCkgY29uc3QgeyByZXR1cm4gdHJhY2VfZHVyYXRpb25f
bXNfOyB9CisgIHZvaWQgc2V0X3RyYWNlX2R1cmF0aW9uX21zKHVpbnQzMl90IHZhbHVlKSB7IHRy
YWNlX2R1cmF0aW9uX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29s
IGhhc19zdG9wX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s3XTsgfQor
ICB1aW50MzJfdCBzdG9wX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBzdG9wX3RpbWVvdXRf
bXNfOyB9CisgIHZvaWQgc2V0X3N0b3BfdGltZW91dF9tcyh1aW50MzJfdCB2YWx1ZSkgeyBzdG9w
X3RpbWVvdXRfbXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg3KTsgfQorCisgIGJvb2wgaGFz
X2VuYWJsZV9leHRyYV9ndWFyZHJhaWxzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNl07
IH0KKyAgYm9vbCBlbmFibGVfZXh0cmFfZ3VhcmRyYWlscygpIGNvbnN0IHsgcmV0dXJuIGVuYWJs
ZV9leHRyYV9ndWFyZHJhaWxzXzsgfQorICB2b2lkIHNldF9lbmFibGVfZXh0cmFfZ3VhcmRyYWls
cyhib29sIHZhbHVlKSB7IGVuYWJsZV9leHRyYV9ndWFyZHJhaWxzXyA9IHZhbHVlOyBfaGFzX2Zp
ZWxkXy5zZXQoNik7IH0KKworICBib29sIGhhc190cmFjaW5nX3Nlc3Npb25faWQoKSBjb25zdCB7
IHJldHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICB1aW50NjRfdCB0cmFjaW5nX3Nlc3Npb25faWQo
KSBjb25zdCB7IHJldHVybiB0cmFjaW5nX3Nlc3Npb25faWRfOyB9CisgIHZvaWQgc2V0X3RyYWNp
bmdfc2Vzc2lvbl9pZCh1aW50NjRfdCB2YWx1ZSkgeyB0cmFjaW5nX3Nlc3Npb25faWRfID0gdmFs
dWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdHJhY2Vf
Y29uZmlnX3JhdygpIGNvbnN0IHsgcmV0dXJuIGZ0cmFjZV9jb25maWdfOyB9CisgIHZvaWQgc2V0
X2Z0cmFjZV9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsgZnRyYWNlX2NvbmZp
Z18gPSByYXc7IF9oYXNfZmllbGRfLnNldCgxMDApOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcm
IGlub2RlX2ZpbGVfY29uZmlnX3JhdygpIGNvbnN0IHsgcmV0dXJuIGlub2RlX2ZpbGVfY29uZmln
XzsgfQorICB2b2lkIHNldF9pbm9kZV9maWxlX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgeyBpbm9kZV9maWxlX2NvbmZpZ18gPSByYXc7IF9oYXNfZmllbGRfLnNldCgxMDIpOyB9
CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2Nlc3Nfc3RhdHNfY29uZmlnX3JhdygpIGNvbnN0
IHsgcmV0dXJuIHByb2Nlc3Nfc3RhdHNfY29uZmlnXzsgfQorICB2b2lkIHNldF9wcm9jZXNzX3N0
YXRzX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeyBwcm9jZXNzX3N0YXRzX2Nv
bmZpZ18gPSByYXc7IF9oYXNfZmllbGRfLnNldCgxMDMpOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJp
bmcmIHN5c19zdGF0c19jb25maWdfcmF3KCkgY29uc3QgeyByZXR1cm4gc3lzX3N0YXRzX2NvbmZp
Z187IH0KKyAgdm9pZCBzZXRfc3lzX3N0YXRzX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgeyBzeXNfc3RhdHNfY29uZmlnXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDEwNCk7IH0K
KworICBjb25zdCBzdGQ6OnN0cmluZyYgaGVhcHByb2ZkX2NvbmZpZ19yYXcoKSBjb25zdCB7IHJl
dHVybiBoZWFwcHJvZmRfY29uZmlnXzsgfQorICB2b2lkIHNldF9oZWFwcHJvZmRfY29uZmlnX3Jh
dyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7IGhlYXBwcm9mZF9jb25maWdfID0gcmF3OyBfaGFz
X2ZpZWxkXy5zZXQoMTA1KTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqYXZhX2hwcm9mX2Nv
bmZpZ19yYXcoKSBjb25zdCB7IHJldHVybiBqYXZhX2hwcm9mX2NvbmZpZ187IH0KKyAgdm9pZCBz
ZXRfamF2YV9ocHJvZl9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsgamF2YV9o
cHJvZl9jb25maWdfID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoMTEwKTsgfQorCisgIGNvbnN0IHN0
ZDo6c3RyaW5nJiBhbmRyb2lkX3Bvd2VyX2NvbmZpZ19yYXcoKSBjb25zdCB7IHJldHVybiBhbmRy
b2lkX3Bvd2VyX2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfYW5kcm9pZF9wb3dlcl9jb25maWdfcmF3
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsgYW5kcm9pZF9wb3dlcl9jb25maWdfID0gcmF3OyBf
aGFzX2ZpZWxkXy5zZXQoMTA2KTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbmRyb2lkX2xv
Z19jb25maWdfcmF3KCkgY29uc3QgeyByZXR1cm4gYW5kcm9pZF9sb2dfY29uZmlnXzsgfQorICB2
b2lkIHNldF9hbmRyb2lkX2xvZ19jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsg
YW5kcm9pZF9sb2dfY29uZmlnXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDEwNyk7IH0KKworICBj
b25zdCBzdGQ6OnN0cmluZyYgZ3B1X2NvdW50ZXJfY29uZmlnX3JhdygpIGNvbnN0IHsgcmV0dXJu
IGdwdV9jb3VudGVyX2NvbmZpZ187IH0KKyAgdm9pZCBzZXRfZ3B1X2NvdW50ZXJfY29uZmlnX3Jh
dyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7IGdwdV9jb3VudGVyX2NvbmZpZ18gPSByYXc7IF9o
YXNfZmllbGRfLnNldCgxMDgpOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VzX2xp
c3RfY29uZmlnX3JhdygpIGNvbnN0IHsgcmV0dXJuIHBhY2thZ2VzX2xpc3RfY29uZmlnXzsgfQor
ICB2b2lkIHNldF9wYWNrYWdlc19saXN0X2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgeyBwYWNrYWdlc19saXN0X2NvbmZpZ18gPSByYXc7IF9oYXNfZmllbGRfLnNldCgxMDkpOyB9
CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHBlcmZfZXZlbnRfY29uZmlnX3JhdygpIGNvbnN0IHsg
cmV0dXJuIHBlcmZfZXZlbnRfY29uZmlnXzsgfQorICB2b2lkIHNldF9wZXJmX2V2ZW50X2NvbmZp
Z19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeyBwZXJmX2V2ZW50X2NvbmZpZ18gPSByYXc7
IF9oYXNfZmllbGRfLnNldCgxMTEpOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHZ1bGthbl9t
ZW1vcnlfY29uZmlnX3JhdygpIGNvbnN0IHsgcmV0dXJuIHZ1bGthbl9tZW1vcnlfY29uZmlnXzsg
fQorICB2b2lkIHNldF92dWxrYW5fbWVtb3J5X2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgeyB2dWxrYW5fbWVtb3J5X2NvbmZpZ18gPSByYXc7IF9oYXNfZmllbGRfLnNldCgxMTIp
OyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYWNrX2V2ZW50X2NvbmZpZ19yYXcoKSBjb25z
dCB7IHJldHVybiB0cmFja19ldmVudF9jb25maWdfOyB9CisgIHZvaWQgc2V0X3RyYWNrX2V2ZW50
X2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeyB0cmFja19ldmVudF9jb25maWdf
ID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoMTEzKTsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBh
bmRyb2lkX3BvbGxlZF9zdGF0ZV9jb25maWdfcmF3KCkgY29uc3QgeyByZXR1cm4gYW5kcm9pZF9w
b2xsZWRfc3RhdGVfY29uZmlnXzsgfQorICB2b2lkIHNldF9hbmRyb2lkX3BvbGxlZF9zdGF0ZV9j
b25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsgYW5kcm9pZF9wb2xsZWRfc3RhdGVf
Y29uZmlnXyA9IHJhdzsgX2hhc19maWVsZF8uc2V0KDExNCk7IH0KKworICBib29sIGhhc19jaHJv
bWVfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTAxXTsgfQorICBjb25zdCBD
aHJvbWVDb25maWcmIGNocm9tZV9jb25maWcoKSBjb25zdCB7IHJldHVybiAqY2hyb21lX2NvbmZp
Z187IH0KKyAgQ2hyb21lQ29uZmlnKiBtdXRhYmxlX2Nocm9tZV9jb25maWcoKSB7IF9oYXNfZmll
bGRfLnNldCgxMDEpOyByZXR1cm4gY2hyb21lX2NvbmZpZ18uZ2V0KCk7IH0KKworICBib29sIGhh
c19sZWdhY3lfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTAwMF07IH0KKyAg
Y29uc3Qgc3RkOjpzdHJpbmcmIGxlZ2FjeV9jb25maWcoKSBjb25zdCB7IHJldHVybiBsZWdhY3lf
Y29uZmlnXzsgfQorICB2b2lkIHNldF9sZWdhY3lfY29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiB2
YWx1ZSkgeyBsZWdhY3lfY29uZmlnXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTAwMCk7IH0K
KworICBib29sIGhhc19mb3JfdGVzdGluZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEw
MDFdOyB9CisgIGNvbnN0IFRlc3RDb25maWcmIGZvcl90ZXN0aW5nKCkgY29uc3QgeyByZXR1cm4g
KmZvcl90ZXN0aW5nXzsgfQorICBUZXN0Q29uZmlnKiBtdXRhYmxlX2Zvcl90ZXN0aW5nKCkgeyBf
aGFzX2ZpZWxkXy5zZXQoMTAwMSk7IHJldHVybiBmb3JfdGVzdGluZ18uZ2V0KCk7IH0KKworIHBy
aXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfe307CisgIHVpbnQzMl90IHRhcmdldF9idWZmZXJf
e307CisgIHVpbnQzMl90IHRyYWNlX2R1cmF0aW9uX21zX3t9OworICB1aW50MzJfdCBzdG9wX3Rp
bWVvdXRfbXNfe307CisgIGJvb2wgZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHNfe307CisgIHVpbnQ2
NF90IHRyYWNpbmdfc2Vzc2lvbl9pZF97fTsKKyAgc3RkOjpzdHJpbmcgZnRyYWNlX2NvbmZpZ187
ICAvLyBbbGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyBpbm9kZV9maWxlX2NvbmZpZ187ICAvLyBb
bGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyBwcm9jZXNzX3N0YXRzX2NvbmZpZ187ICAvLyBbbGF6
eT10cnVlXQorICBzdGQ6OnN0cmluZyBzeXNfc3RhdHNfY29uZmlnXzsgIC8vIFtsYXp5PXRydWVd
CisgIHN0ZDo6c3RyaW5nIGhlYXBwcm9mZF9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3Rk
OjpzdHJpbmcgamF2YV9ocHJvZl9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJp
bmcgYW5kcm9pZF9wb3dlcl9jb25maWdfOyAgLy8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcg
YW5kcm9pZF9sb2dfY29uZmlnXzsgIC8vIFtsYXp5PXRydWVdCisgIHN0ZDo6c3RyaW5nIGdwdV9j
b3VudGVyX2NvbmZpZ187ICAvLyBbbGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyBwYWNrYWdlc19s
aXN0X2NvbmZpZ187ICAvLyBbbGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyBwZXJmX2V2ZW50X2Nv
bmZpZ187ICAvLyBbbGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyB2dWxrYW5fbWVtb3J5X2NvbmZp
Z187ICAvLyBbbGF6eT10cnVlXQorICBzdGQ6OnN0cmluZyB0cmFja19ldmVudF9jb25maWdfOyAg
Ly8gW2xhenk9dHJ1ZV0KKyAgc3RkOjpzdHJpbmcgYW5kcm9pZF9wb2xsZWRfc3RhdGVfY29uZmln
XzsgIC8vIFtsYXp5PXRydWVdCisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxDaHJvbWVDb25m
aWc+IGNocm9tZV9jb25maWdfOworICBzdGQ6OnN0cmluZyBsZWdhY3lfY29uZmlnX3t9OworICA6
OnByb3RvemVybzo6Q29weWFibGVQdHI8VGVzdENvbmZpZz4gZm9yX3Rlc3RpbmdfOworCisgIC8v
IEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJp
bGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6
c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwxMDAyPiBfaGFzX2ZpZWxk
X3t9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJv
dG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BS
T1RPU19QRVJGRVRUT19DT05GSUdfREFUQV9TT1VSQ0VfQ09ORklHX1BST1RPX0NQUF9IXworLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cisg
KgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhl
ICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21w
bGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhl
IExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9M
SUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh
Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBM
aWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdB
UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w
bGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVy
bmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgor
ICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0NPUkVfREFUQV9TT1VSQ0Vf
Q09ORklHX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19DT1JFX0RBVEFfU09V
UkNFX0NPTkZJR19IXworCisvLyBDcmVhdGVzIHRoZSBhbGlhc2VzIGluIHRoZSA6OnBlcmZldHRv
IG5hbWVzcGFjZSwgZG9pbmcgdGhpbmdzIGxpa2U6CisvLyB1c2luZyA6OnBlcmZldHRvOjpGb28g
PSA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6Rm9vLgorLy8gU2VlIGNvbW1lbnRzIGluIGZvcndh
cmRfZGVjbHMuaCBmb3IgdGhlIGhpc3RvcmljYWwgcmVhc29ucyBvZiB0aGlzCisvLyBpbmRpcmVj
dGlvbiBsYXllci4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25maWcvZGF0YV9zb3VyY2VfY29u
ZmlnLmdlbi5oIgorCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19DT1JFX0RB
VEFfU09VUkNFX0NPTkZJR19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5j
bHVkZS9wZXJmZXR0by90cmFjaW5nL2NvcmUvZGF0YV9zb3VyY2VfZGVzY3JpcHRvci5oCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9k
YXRhX3NvdXJjZV9kZXNjcmlwdG9yLmdlbi5oCisvLyBETyBOT1QgRURJVC4gQXV0b2dlbmVyYXRl
ZCBieSBQZXJmZXR0byBjcHBnZW5fcGx1Z2luCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9U
T1NfUEVSRkVUVE9fQ09NTU9OX0RBVEFfU09VUkNFX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisj
ZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0RBVEFfU09VUkNF
X0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRl
IDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRl
IDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0ci5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBv
cnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNw
YWNlIGdlbiB7CitjbGFzcyBEYXRhU291cmNlRGVzY3JpcHRvcjsKK30gIC8vIG5hbWVzcGFjZSBw
ZXJmZXR0bworfSAgLy8gbmFtZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCitu
YW1lc3BhY2UgcHJvdG96ZXJvIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJv
dG96ZXJvCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVz
cGFjZSBnZW4geworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgRGF0YVNvdXJjZURlc2NyaXB0b3Ig
OiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBG
aWVsZE51bWJlcnMgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtXaWxsTm90aWZ5
T25TdG9wRmllbGROdW1iZXIgPSAyLAorICAgIGtXaWxsTm90aWZ5T25TdGFydEZpZWxkTnVtYmVy
ID0gMywKKyAgICBrSGFuZGxlc0luY3JlbWVudGFsU3RhdGVDbGVhckZpZWxkTnVtYmVyID0gNCwK
KyAgICBrR3B1Q291bnRlckRlc2NyaXB0b3JGaWVsZE51bWJlciA9IDUsCisgICAga1RyYWNrRXZl
bnREZXNjcmlwdG9yRmllbGROdW1iZXIgPSA2LAorICB9OworCisgIERhdGFTb3VyY2VEZXNjcmlw
dG9yKCk7CisgIH5EYXRhU291cmNlRGVzY3JpcHRvcigpIG92ZXJyaWRlOworICBEYXRhU291cmNl
RGVzY3JpcHRvcihEYXRhU291cmNlRGVzY3JpcHRvciYmKSBub2V4Y2VwdDsKKyAgRGF0YVNvdXJj
ZURlc2NyaXB0b3ImIG9wZXJhdG9yPShEYXRhU291cmNlRGVzY3JpcHRvciYmKTsKKyAgRGF0YVNv
dXJjZURlc2NyaXB0b3IoY29uc3QgRGF0YVNvdXJjZURlc2NyaXB0b3ImKTsKKyAgRGF0YVNvdXJj
ZURlc2NyaXB0b3ImIG9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlRGVzY3JpcHRvciYpOworICBi
b29sIG9wZXJhdG9yPT0oY29uc3QgRGF0YVNvdXJjZURlc2NyaXB0b3ImKSBjb25zdDsKKyAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IERhdGFTb3VyY2VEZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0
IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmlu
ZygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0Fy
cmF5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNz
YWdlKikgY29uc3Q7CisKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmll
bGRfWzFdOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFt
ZV87IH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgbmFtZV8g
PSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEpOyB9CisKKyAgYm9vbCBoYXNfd2lsbF9ub3RpZnlf
b25fc3RvcCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGJvb2wgd2lsbF9u
b3RpZnlfb25fc3RvcCgpIGNvbnN0IHsgcmV0dXJuIHdpbGxfbm90aWZ5X29uX3N0b3BfOyB9Cisg
IHZvaWQgc2V0X3dpbGxfbm90aWZ5X29uX3N0b3AoYm9vbCB2YWx1ZSkgeyB3aWxsX25vdGlmeV9v
bl9zdG9wXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc193aWxs
X25vdGlmeV9vbl9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNdOyB9CisgIGJv
b2wgd2lsbF9ub3RpZnlfb25fc3RhcnQoKSBjb25zdCB7IHJldHVybiB3aWxsX25vdGlmeV9vbl9z
dGFydF87IH0KKyAgdm9pZCBzZXRfd2lsbF9ub3RpZnlfb25fc3RhcnQoYm9vbCB2YWx1ZSkgeyB3
aWxsX25vdGlmeV9vbl9zdGFydF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyAg
Ym9vbCBoYXNfaGFuZGxlc19pbmNyZW1lbnRhbF9zdGF0ZV9jbGVhcigpIGNvbnN0IHsgcmV0dXJu
IF9oYXNfZmllbGRfWzRdOyB9CisgIGJvb2wgaGFuZGxlc19pbmNyZW1lbnRhbF9zdGF0ZV9jbGVh
cigpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXJfOyB9Cisg
IHZvaWQgc2V0X2hhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXIoYm9vbCB2YWx1ZSkgeyBo
YW5kbGVzX2luY3JlbWVudGFsX3N0YXRlX2NsZWFyXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQo
NCk7IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ3B1X2NvdW50ZXJfZGVzY3JpcHRvcl9yYXco
KSBjb25zdCB7IHJldHVybiBncHVfY291bnRlcl9kZXNjcmlwdG9yXzsgfQorICB2b2lkIHNldF9n
cHVfY291bnRlcl9kZXNjcmlwdG9yX3Jhdyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7IGdwdV9j
b3VudGVyX2Rlc2NyaXB0b3JfID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoNSk7IH0KKworICBjb25z
dCBzdGQ6OnN0cmluZyYgdHJhY2tfZXZlbnRfZGVzY3JpcHRvcl9yYXcoKSBjb25zdCB7IHJldHVy
biB0cmFja19ldmVudF9kZXNjcmlwdG9yXzsgfQorICB2b2lkIHNldF90cmFja19ldmVudF9kZXNj
cmlwdG9yX3Jhdyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7IHRyYWNrX2V2ZW50X2Rlc2NyaXB0
b3JfID0gcmF3OyBfaGFzX2ZpZWxkXy5zZXQoNik7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3Ry
aW5nIG5hbWVfe307CisgIGJvb2wgd2lsbF9ub3RpZnlfb25fc3RvcF97fTsKKyAgYm9vbCB3aWxs
X25vdGlmeV9vbl9zdGFydF97fTsKKyAgYm9vbCBoYW5kbGVzX2luY3JlbWVudGFsX3N0YXRlX2Ns
ZWFyX3t9OworICBzdGQ6OnN0cmluZyBncHVfY291bnRlcl9kZXNjcmlwdG9yXzsgIC8vIFtsYXp5
PXRydWVdCisgIHN0ZDo6c3RyaW5nIHRyYWNrX2V2ZW50X2Rlc2NyaXB0b3JfOyAgLy8gW2xhenk9
dHJ1ZV0KKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMg
Zm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZp
bGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8Nz4g
X2hhc19maWVsZF97fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworfSAgLy8gbmFt
ZXNwYWNlIHByb3RvcworfSAgLy8gbmFtZXNwYWNlIGdlbgorCisjZW5kaWYgIC8vIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0RBVEFfU09VUkNFX0RFU0NSSVBUT1JfUFJP
VE9fQ1BQX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291
cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZl
cnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUg
ZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWlu
IGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUu
b3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxp
Y2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0
ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywK
KyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIg
ZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMg
bGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIg
dGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfQ09S
RV9EQVRBX1NPVVJDRV9ERVNDUklQVE9SX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJB
Q0lOR19DT1JFX0RBVEFfU09VUkNFX0RFU0NSSVBUT1JfSF8KKworLy8gQ3JlYXRlcyB0aGUgYWxp
YXNlcyBpbiB0aGUgOjpwZXJmZXR0byBuYW1lc3BhY2UsIGRvaW5nIHRoaW5ncyBsaWtlOgorLy8g
dXNpbmcgOjpwZXJmZXR0bzo6Rm9vID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpnZW46OkZvby4KKy8v
IFNlZSBjb21tZW50cyBpbiBmb3J3YXJkX2RlY2xzLmggZm9yIHRoZSBoaXN0b3JpY2FsIHJlYXNv
bnMgb2YgdGhpcworLy8gaW5kaXJlY3Rpb24gbGF5ZXIuCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2NvcmUvZm9yd2FyZF9kZWNscy5oIgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8v
Y29tbW9uL2RhdGFfc291cmNlX2Rlc2NyaXB0b3IuZ2VuLmgiCisKKyNlbmRpZiAgLy8gSU5DTFVE
RV9QRVJGRVRUT19UUkFDSU5HX0NPUkVfREFUQV9TT1VSQ0VfREVTQ1JJUFRPUl9IXworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2NvcmUv
dHJhY2VfY29uZmlnLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90
b3MvcGVyZmV0dG8vY29uZmlnL3RyYWNlX2NvbmZpZy5nZW4uaAorLy8gRE8gTk9UIEVESVQuIEF1
dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lmbmRlZiBQRVJGRVRUT19Q
Uk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19UUkFDRV9DT05GSUdfUFJPVE9fQ1BQX0hfCisj
ZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1RSQUNFX0NPTkZJ
R19QUk9UT19DUFBfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4K
KyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJh
aXRzPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCitu
YW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsK
K2NsYXNzIFRyYWNlQ29uZmlnOworY2xhc3MgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25m
aWc7CitjbGFzcyBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnOworY2xhc3MgVHJh
Y2VDb25maWdfVHJpZ2dlckNvbmZpZzsKK2NsYXNzIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdf
VHJpZ2dlcjsKK2NsYXNzIFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlczsKK2NsYXNzIFRy
YWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhOworY2xhc3MgVHJhY2VDb25maWdfUHJvZHVjZXJDb25m
aWc7CitjbGFzcyBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZTsKK2NsYXNzIFRyYWNlQ29u
ZmlnX0RhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlQ29uZmlnOworY2xhc3MgVGVzdENvbmZp
ZzsKK2NsYXNzIFRlc3RDb25maWdfRHVtbXlGaWVsZHM7CitjbGFzcyBDaHJvbWVDb25maWc7Citj
bGFzcyBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWc7CitlbnVtIFRyYWNlQ29uZmlnX0xvY2tkb3du
TW9kZU9wZXJhdGlvbiA6IGludDsKK2VudW0gVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlIDog
aW50OworZW51bSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlIDogaW50Owor
ZW51bSBCdWlsdGluQ2xvY2sgOiBpbnQ7CitlbnVtIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19G
aWxsUG9saWN5IDogaW50OworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisKK25hbWVzcGFjZSBwcm90b3plcm8gewor
Y2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworbmFtZXNwYWNlIHBl
cmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitlbnVtIFRyYWNl
Q29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbiA6IGludCB7CisgIFRyYWNlQ29uZmlnX0xvY2tk
b3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9VTkNIQU5HRUQgPSAwLAorICBUcmFjZUNvbmZpZ19M
b2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fQ0xFQVIgPSAxLAorICBUcmFjZUNvbmZpZ19M
b2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fU0VUID0gMiwKK307CitlbnVtIFRyYWNlQ29u
ZmlnX0NvbXByZXNzaW9uVHlwZSA6IGludCB7CisgIFRyYWNlQ29uZmlnX0NvbXByZXNzaW9uVHlw
ZV9DT01QUkVTU0lPTl9UWVBFX1VOU1BFQ0lGSUVEID0gMCwKKyAgVHJhY2VDb25maWdfQ29tcHJl
c3Npb25UeXBlX0NPTVBSRVNTSU9OX1RZUEVfREVGTEFURSA9IDEsCit9OworZW51bSBUcmFjZUNv
bmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlIDogaW50IHsKKyAgVHJhY2VDb25maWdfVHJp
Z2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNlQ29uZmlnX1Ry
aWdnZXJDb25maWdfVHJpZ2dlck1vZGVfU1RBUlRfVFJBQ0lORyA9IDEsCisgIFRyYWNlQ29uZmln
X1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVfU1RPUF9UUkFDSU5HID0gMiwKK307CitlbnVtIFRy
YWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5IDogaW50IHsKKyAgVHJhY2VDb25maWdf
QnVmZmVyQ29uZmlnX0ZpbGxQb2xpY3lfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFjZUNvbmZpZ19C
dWZmZXJDb25maWdfRmlsbFBvbGljeV9SSU5HX0JVRkZFUiA9IDEsCisgIFRyYWNlQ29uZmlnX0J1
ZmZlckNvbmZpZ19GaWxsUG9saWN5X0RJU0NBUkQgPSAyLAorfTsKKworY2xhc3MgUEVSRkVUVE9f
RVhQT1JUIFRyYWNlQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsK
KyBwdWJsaWM6CisgIHVzaW5nIEJ1ZmZlckNvbmZpZyA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZp
ZzsKKyAgdXNpbmcgRGF0YVNvdXJjZSA9IFRyYWNlQ29uZmlnX0RhdGFTb3VyY2U7CisgIHVzaW5n
IEJ1aWx0aW5EYXRhU291cmNlID0gVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2U7CisgIHVz
aW5nIFByb2R1Y2VyQ29uZmlnID0gVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWc7CisgIHVzaW5n
IFN0YXRzZE1ldGFkYXRhID0gVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGE7CisgIHVzaW5nIEd1
YXJkcmFpbE92ZXJyaWRlcyA9IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlczsKKyAgdXNp
bmcgVHJpZ2dlckNvbmZpZyA9IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWc7CisgIHVzaW5nIElu
Y3JlbWVudGFsU3RhdGVDb25maWcgPSBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmln
OworICB1c2luZyBJbmNpZGVudFJlcG9ydENvbmZpZyA9IFRyYWNlQ29uZmlnX0luY2lkZW50UmVw
b3J0Q29uZmlnOworICB1c2luZyBMb2NrZG93bk1vZGVPcGVyYXRpb24gPSBUcmFjZUNvbmZpZ19M
b2NrZG93bk1vZGVPcGVyYXRpb247CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBMT0NLRE9XTl9V
TkNIQU5HRUQgPSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fVU5D
SEFOR0VEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gTE9DS0RPV05fQ0xFQVIgPSBUcmFjZUNv
bmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fQ0xFQVI7CisgIHN0YXRpYyBjb25z
dGV4cHIgYXV0byBMT0NLRE9XTl9TRVQgPSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRp
b25fTE9DS0RPV05fU0VUOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gTG9ja2Rvd25Nb2RlT3Bl
cmF0aW9uX01JTiA9IFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9V
TkNIQU5HRUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBMb2NrZG93bk1vZGVPcGVyYXRpb25f
TUFYID0gVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uX0xPQ0tET1dOX1NFVDsKKyAg
dXNpbmcgQ29tcHJlc3Npb25UeXBlID0gVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gQ09NUFJFU1NJT05fVFlQRV9VTlNQRUNJRklFRCA9IFRyYWNl
Q29uZmlnX0NvbXByZXNzaW9uVHlwZV9DT01QUkVTU0lPTl9UWVBFX1VOU1BFQ0lGSUVEOworICBz
dGF0aWMgY29uc3RleHByIGF1dG8gQ09NUFJFU1NJT05fVFlQRV9ERUZMQVRFID0gVHJhY2VDb25m
aWdfQ29tcHJlc3Npb25UeXBlX0NPTVBSRVNTSU9OX1RZUEVfREVGTEFURTsKKyAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIENvbXByZXNzaW9uVHlwZV9NSU4gPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lv
blR5cGVfQ09NUFJFU1NJT05fVFlQRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0ZXhwciBh
dXRvIENvbXByZXNzaW9uVHlwZV9NQVggPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGVfQ09N
UFJFU1NJT05fVFlQRV9ERUZMQVRFOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0J1ZmZl
cnNGaWVsZE51bWJlciA9IDEsCisgICAga0RhdGFTb3VyY2VzRmllbGROdW1iZXIgPSAyLAorICAg
IGtCdWlsdGluRGF0YVNvdXJjZXNGaWVsZE51bWJlciA9IDIwLAorICAgIGtEdXJhdGlvbk1zRmll
bGROdW1iZXIgPSAzLAorICAgIGtFbmFibGVFeHRyYUd1YXJkcmFpbHNGaWVsZE51bWJlciA9IDQs
CisgICAga0xvY2tkb3duTW9kZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrUHJvZHVjZXJzRmllbGRO
dW1iZXIgPSA2LAorICAgIGtTdGF0c2RNZXRhZGF0YUZpZWxkTnVtYmVyID0gNywKKyAgICBrV3Jp
dGVJbnRvRmlsZUZpZWxkTnVtYmVyID0gOCwKKyAgICBrT3V0cHV0UGF0aEZpZWxkTnVtYmVyID0g
MjksCisgICAga0ZpbGVXcml0ZVBlcmlvZE1zRmllbGROdW1iZXIgPSA5LAorICAgIGtNYXhGaWxl
U2l6ZUJ5dGVzRmllbGROdW1iZXIgPSAxMCwKKyAgICBrR3VhcmRyYWlsT3ZlcnJpZGVzRmllbGRO
dW1iZXIgPSAxMSwKKyAgICBrRGVmZXJyZWRTdGFydEZpZWxkTnVtYmVyID0gMTIsCisgICAga0Zs
dXNoUGVyaW9kTXNGaWVsZE51bWJlciA9IDEzLAorICAgIGtGbHVzaFRpbWVvdXRNc0ZpZWxkTnVt
YmVyID0gMTQsCisgICAga0RhdGFTb3VyY2VTdG9wVGltZW91dE1zRmllbGROdW1iZXIgPSAyMywK
KyAgICBrTm90aWZ5VHJhY2V1ckZpZWxkTnVtYmVyID0gMTYsCisgICAga1RyaWdnZXJDb25maWdG
aWVsZE51bWJlciA9IDE3LAorICAgIGtBY3RpdmF0ZVRyaWdnZXJzRmllbGROdW1iZXIgPSAxOCwK
KyAgICBrSW5jcmVtZW50YWxTdGF0ZUNvbmZpZ0ZpZWxkTnVtYmVyID0gMjEsCisgICAga0FsbG93
VXNlckJ1aWxkVHJhY2luZ0ZpZWxkTnVtYmVyID0gMTksCisgICAga1VuaXF1ZVNlc3Npb25OYW1l
RmllbGROdW1iZXIgPSAyMiwKKyAgICBrQ29tcHJlc3Npb25UeXBlRmllbGROdW1iZXIgPSAyNCwK
KyAgICBrSW5jaWRlbnRSZXBvcnRDb25maWdGaWVsZE51bWJlciA9IDI1LAorICAgIGtUcmFjZVV1
aWRNc2JGaWVsZE51bWJlciA9IDI3LAorICAgIGtUcmFjZVV1aWRMc2JGaWVsZE51bWJlciA9IDI4
LAorICB9OworCisgIFRyYWNlQ29uZmlnKCk7CisgIH5UcmFjZUNvbmZpZygpIG92ZXJyaWRlOwor
ICBUcmFjZUNvbmZpZyhUcmFjZUNvbmZpZyYmKSBub2V4Y2VwdDsKKyAgVHJhY2VDb25maWcmIG9w
ZXJhdG9yPShUcmFjZUNvbmZpZyYmKTsKKyAgVHJhY2VDb25maWcoY29uc3QgVHJhY2VDb25maWcm
KTsKKyAgVHJhY2VDb25maWcmIG9wZXJhdG9yPShjb25zdCBUcmFjZUNvbmZpZyYpOworICBib29s
IG9wZXJhdG9yPT0oY29uc3QgVHJhY2VDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9
KGNvbnN0IFRyYWNlQ29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJy
aWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwor
ICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7
CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgaW50
IGJ1ZmZlcnNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnVmZmVyc18u
c2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxUcmFjZUNvbmZpZ19CdWZmZXJDb25maWc+
JiBidWZmZXJzKCkgY29uc3QgeyByZXR1cm4gYnVmZmVyc187IH0KKyAgc3RkOjp2ZWN0b3I8VHJh
Y2VDb25maWdfQnVmZmVyQ29uZmlnPiogbXV0YWJsZV9idWZmZXJzKCkgeyByZXR1cm4gJmJ1ZmZl
cnNfOyB9CisgIHZvaWQgY2xlYXJfYnVmZmVycygpIHsgYnVmZmVyc18uY2xlYXIoKTsgfQorICBU
cmFjZUNvbmZpZ19CdWZmZXJDb25maWcqIGFkZF9idWZmZXJzKCkgeyBidWZmZXJzXy5lbXBsYWNl
X2JhY2soKTsgcmV0dXJuICZidWZmZXJzXy5iYWNrKCk7IH0KKworICBpbnQgZGF0YV9zb3VyY2Vz
X3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRhdGFfc291cmNlc18uc2l6
ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxUcmFjZUNvbmZpZ19EYXRhU291cmNlPiYgZGF0
YV9zb3VyY2VzKCkgY29uc3QgeyByZXR1cm4gZGF0YV9zb3VyY2VzXzsgfQorICBzdGQ6OnZlY3Rv
cjxUcmFjZUNvbmZpZ19EYXRhU291cmNlPiogbXV0YWJsZV9kYXRhX3NvdXJjZXMoKSB7IHJldHVy
biAmZGF0YV9zb3VyY2VzXzsgfQorICB2b2lkIGNsZWFyX2RhdGFfc291cmNlcygpIHsgZGF0YV9z
b3VyY2VzXy5jbGVhcigpOyB9CisgIFRyYWNlQ29uZmlnX0RhdGFTb3VyY2UqIGFkZF9kYXRhX3Nv
dXJjZXMoKSB7IGRhdGFfc291cmNlc18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmZGF0YV9zb3Vy
Y2VzXy5iYWNrKCk7IH0KKworICBib29sIGhhc19idWlsdGluX2RhdGFfc291cmNlcygpIGNvbnN0
IHsgcmV0dXJuIF9oYXNfZmllbGRfWzIwXTsgfQorICBjb25zdCBUcmFjZUNvbmZpZ19CdWlsdGlu
RGF0YVNvdXJjZSYgYnVpbHRpbl9kYXRhX3NvdXJjZXMoKSBjb25zdCB7IHJldHVybiAqYnVpbHRp
bl9kYXRhX3NvdXJjZXNfOyB9CisgIFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlKiBtdXRh
YmxlX2J1aWx0aW5fZGF0YV9zb3VyY2VzKCkgeyBfaGFzX2ZpZWxkXy5zZXQoMjApOyByZXR1cm4g
YnVpbHRpbl9kYXRhX3NvdXJjZXNfLmdldCgpOyB9CisKKyAgYm9vbCBoYXNfZHVyYXRpb25fbXMo
KSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICB1aW50MzJfdCBkdXJhdGlvbl9t
cygpIGNvbnN0IHsgcmV0dXJuIGR1cmF0aW9uX21zXzsgfQorICB2b2lkIHNldF9kdXJhdGlvbl9t
cyh1aW50MzJfdCB2YWx1ZSkgeyBkdXJhdGlvbl9tc18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0
KDMpOyB9CisKKyAgYm9vbCBoYXNfZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1s0XTsgfQorICBib29sIGVuYWJsZV9leHRyYV9ndWFyZHJhaWxzKCkg
Y29uc3QgeyByZXR1cm4gZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHNfOyB9CisgIHZvaWQgc2V0X2Vu
YWJsZV9leHRyYV9ndWFyZHJhaWxzKGJvb2wgdmFsdWUpIHsgZW5hYmxlX2V4dHJhX2d1YXJkcmFp
bHNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg0KTsgfQorCisgIGJvb2wgaGFzX2xvY2tkb3du
X21vZGUoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1s1XTsgfQorICBUcmFjZUNvbmZpZ19M
b2NrZG93bk1vZGVPcGVyYXRpb24gbG9ja2Rvd25fbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGxvY2tk
b3duX21vZGVfOyB9CisgIHZvaWQgc2V0X2xvY2tkb3duX21vZGUoVHJhY2VDb25maWdfTG9ja2Rv
d25Nb2RlT3BlcmF0aW9uIHZhbHVlKSB7IGxvY2tkb3duX21vZGVfID0gdmFsdWU7IF9oYXNfZmll
bGRfLnNldCg1KTsgfQorCisgIGludCBwcm9kdWNlcnNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0
YXRpY19jYXN0PGludD4ocHJvZHVjZXJzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9y
PFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnPiYgcHJvZHVjZXJzKCkgY29uc3QgeyByZXR1cm4g
cHJvZHVjZXJzXzsgfQorICBzdGQ6OnZlY3RvcjxUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZz4q
IG11dGFibGVfcHJvZHVjZXJzKCkgeyByZXR1cm4gJnByb2R1Y2Vyc187IH0KKyAgdm9pZCBjbGVh
cl9wcm9kdWNlcnMoKSB7IHByb2R1Y2Vyc18uY2xlYXIoKTsgfQorICBUcmFjZUNvbmZpZ19Qcm9k
dWNlckNvbmZpZyogYWRkX3Byb2R1Y2VycygpIHsgcHJvZHVjZXJzXy5lbXBsYWNlX2JhY2soKTsg
cmV0dXJuICZwcm9kdWNlcnNfLmJhY2soKTsgfQorCisgIGJvb2wgaGFzX3N0YXRzZF9tZXRhZGF0
YSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzddOyB9CisgIGNvbnN0IFRyYWNlQ29uZmln
X1N0YXRzZE1ldGFkYXRhJiBzdGF0c2RfbWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiAqc3RhdHNk
X21ldGFkYXRhXzsgfQorICBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSogbXV0YWJsZV9zdGF0
c2RfbWV0YWRhdGEoKSB7IF9oYXNfZmllbGRfLnNldCg3KTsgcmV0dXJuIHN0YXRzZF9tZXRhZGF0
YV8uZ2V0KCk7IH0KKworICBib29sIGhhc193cml0ZV9pbnRvX2ZpbGUoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1s4XTsgfQorICBib29sIHdyaXRlX2ludG9fZmlsZSgpIGNvbnN0IHsgcmV0
dXJuIHdyaXRlX2ludG9fZmlsZV87IH0KKyAgdm9pZCBzZXRfd3JpdGVfaW50b19maWxlKGJvb2wg
dmFsdWUpIHsgd3JpdGVfaW50b19maWxlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoOCk7IH0K
KworICBib29sIGhhc19vdXRwdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzI5
XTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X3BhdGgoKSBjb25zdCB7IHJldHVybiBv
dXRwdXRfcGF0aF87IH0KKyAgdm9pZCBzZXRfb3V0cHV0X3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7IG91dHB1dF9wYXRoXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMjkpOyB9CisK
KyAgYm9vbCBoYXNfZmlsZV93cml0ZV9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1s5XTsgfQorICB1aW50MzJfdCBmaWxlX3dyaXRlX3BlcmlvZF9tcygpIGNvbnN0IHsgcmV0
dXJuIGZpbGVfd3JpdGVfcGVyaW9kX21zXzsgfQorICB2b2lkIHNldF9maWxlX3dyaXRlX3Blcmlv
ZF9tcyh1aW50MzJfdCB2YWx1ZSkgeyBmaWxlX3dyaXRlX3BlcmlvZF9tc18gPSB2YWx1ZTsgX2hh
c19maWVsZF8uc2V0KDkpOyB9CisKKyAgYm9vbCBoYXNfbWF4X2ZpbGVfc2l6ZV9ieXRlcygpIGNv
bnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEwXTsgfQorICB1aW50NjRfdCBtYXhfZmlsZV9zaXpl
X2J5dGVzKCkgY29uc3QgeyByZXR1cm4gbWF4X2ZpbGVfc2l6ZV9ieXRlc187IH0KKyAgdm9pZCBz
ZXRfbWF4X2ZpbGVfc2l6ZV9ieXRlcyh1aW50NjRfdCB2YWx1ZSkgeyBtYXhfZmlsZV9zaXplX2J5
dGVzXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTApOyB9CisKKyAgYm9vbCBoYXNfZ3VhcmRy
YWlsX292ZXJyaWRlcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzExXTsgfQorICBjb25z
dCBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMmIGd1YXJkcmFpbF9vdmVycmlkZXMoKSBj
b25zdCB7IHJldHVybiAqZ3VhcmRyYWlsX292ZXJyaWRlc187IH0KKyAgVHJhY2VDb25maWdfR3Vh
cmRyYWlsT3ZlcnJpZGVzKiBtdXRhYmxlX2d1YXJkcmFpbF9vdmVycmlkZXMoKSB7IF9oYXNfZmll
bGRfLnNldCgxMSk7IHJldHVybiBndWFyZHJhaWxfb3ZlcnJpZGVzXy5nZXQoKTsgfQorCisgIGJv
b2wgaGFzX2RlZmVycmVkX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTJdOyB9
CisgIGJvb2wgZGVmZXJyZWRfc3RhcnQoKSBjb25zdCB7IHJldHVybiBkZWZlcnJlZF9zdGFydF87
IH0KKyAgdm9pZCBzZXRfZGVmZXJyZWRfc3RhcnQoYm9vbCB2YWx1ZSkgeyBkZWZlcnJlZF9zdGFy
dF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDEyKTsgfQorCisgIGJvb2wgaGFzX2ZsdXNoX3Bl
cmlvZF9tcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzEzXTsgfQorICB1aW50MzJfdCBm
bHVzaF9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBmbHVzaF9wZXJpb2RfbXNfOyB9CisgIHZv
aWQgc2V0X2ZsdXNoX3BlcmlvZF9tcyh1aW50MzJfdCB2YWx1ZSkgeyBmbHVzaF9wZXJpb2RfbXNf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxMyk7IH0KKworICBib29sIGhhc19mbHVzaF90aW1l
b3V0X21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMTRdOyB9CisgIHVpbnQzMl90IGZs
dXNoX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBmbHVzaF90aW1lb3V0X21zXzsgfQorICB2
b2lkIHNldF9mbHVzaF90aW1lb3V0X21zKHVpbnQzMl90IHZhbHVlKSB7IGZsdXNoX3RpbWVvdXRf
bXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxNCk7IH0KKworICBib29sIGhhc19kYXRhX3Nv
dXJjZV9zdG9wX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syM107IH0K
KyAgdWludDMyX3QgZGF0YV9zb3VyY2Vfc3RvcF90aW1lb3V0X21zKCkgY29uc3QgeyByZXR1cm4g
ZGF0YV9zb3VyY2Vfc3RvcF90aW1lb3V0X21zXzsgfQorICB2b2lkIHNldF9kYXRhX3NvdXJjZV9z
dG9wX3RpbWVvdXRfbXModWludDMyX3QgdmFsdWUpIHsgZGF0YV9zb3VyY2Vfc3RvcF90aW1lb3V0
X21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMjMpOyB9CisKKyAgYm9vbCBoYXNfbm90aWZ5
X3RyYWNldXIoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxNl07IH0KKyAgYm9vbCBub3Rp
ZnlfdHJhY2V1cigpIGNvbnN0IHsgcmV0dXJuIG5vdGlmeV90cmFjZXVyXzsgfQorICB2b2lkIHNl
dF9ub3RpZnlfdHJhY2V1cihib29sIHZhbHVlKSB7IG5vdGlmeV90cmFjZXVyXyA9IHZhbHVlOyBf
aGFzX2ZpZWxkXy5zZXQoMTYpOyB9CisKKyAgYm9vbCBoYXNfdHJpZ2dlcl9jb25maWcoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxN107IH0KKyAgY29uc3QgVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZyYgdHJpZ2dlcl9jb25maWcoKSBjb25zdCB7IHJldHVybiAqdHJpZ2dlcl9jb25maWdf
OyB9CisgIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcqIG11dGFibGVfdHJpZ2dlcl9jb25maWco
KSB7IF9oYXNfZmllbGRfLnNldCgxNyk7IHJldHVybiB0cmlnZ2VyX2NvbmZpZ18uZ2V0KCk7IH0K
KworICBpbnQgYWN0aXZhdGVfdHJpZ2dlcnNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19j
YXN0PGludD4oYWN0aXZhdGVfdHJpZ2dlcnNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0
b3I8c3RkOjpzdHJpbmc+JiBhY3RpdmF0ZV90cmlnZ2VycygpIGNvbnN0IHsgcmV0dXJuIGFjdGl2
YXRlX3RyaWdnZXJzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfYWN0
aXZhdGVfdHJpZ2dlcnMoKSB7IHJldHVybiAmYWN0aXZhdGVfdHJpZ2dlcnNfOyB9CisgIHZvaWQg
Y2xlYXJfYWN0aXZhdGVfdHJpZ2dlcnMoKSB7IGFjdGl2YXRlX3RyaWdnZXJzXy5jbGVhcigpOyB9
CisgIHZvaWQgYWRkX2FjdGl2YXRlX3RyaWdnZXJzKHN0ZDo6c3RyaW5nIHZhbHVlKSB7IGFjdGl2
YXRlX3RyaWdnZXJzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRf
YWN0aXZhdGVfdHJpZ2dlcnMoKSB7IGFjdGl2YXRlX3RyaWdnZXJzXy5lbXBsYWNlX2JhY2soKTsg
cmV0dXJuICZhY3RpdmF0ZV90cmlnZ2Vyc18uYmFjaygpOyB9CisKKyAgYm9vbCBoYXNfaW5jcmVt
ZW50YWxfc3RhdGVfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjFdOyB9Cisg
IGNvbnN0IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcmIGluY3JlbWVudGFsX3N0
YXRlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuICppbmNyZW1lbnRhbF9zdGF0ZV9jb25maWdfOyB9
CisgIFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcqIG11dGFibGVfaW5jcmVtZW50
YWxfc3RhdGVfY29uZmlnKCkgeyBfaGFzX2ZpZWxkXy5zZXQoMjEpOyByZXR1cm4gaW5jcmVtZW50
YWxfc3RhdGVfY29uZmlnXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX2FsbG93X3VzZXJfYnVpbGRf
dHJhY2luZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzE5XTsgfQorICBib29sIGFsbG93
X3VzZXJfYnVpbGRfdHJhY2luZygpIGNvbnN0IHsgcmV0dXJuIGFsbG93X3VzZXJfYnVpbGRfdHJh
Y2luZ187IH0KKyAgdm9pZCBzZXRfYWxsb3dfdXNlcl9idWlsZF90cmFjaW5nKGJvb2wgdmFsdWUp
IHsgYWxsb3dfdXNlcl9idWlsZF90cmFjaW5nXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMTkp
OyB9CisKKyAgYm9vbCBoYXNfdW5pcXVlX3Nlc3Npb25fbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9o
YXNfZmllbGRfWzIyXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgdW5pcXVlX3Nlc3Npb25fbmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIHVuaXF1ZV9zZXNzaW9uX25hbWVfOyB9CisgIHZvaWQgc2V0X3Vu
aXF1ZV9zZXNzaW9uX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IHVuaXF1ZV9zZXNz
aW9uX25hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyMik7IH0KKworICBib29sIGhhc19j
b21wcmVzc2lvbl90eXBlKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMjRdOyB9CisgIFRy
YWNlQ29uZmlnX0NvbXByZXNzaW9uVHlwZSBjb21wcmVzc2lvbl90eXBlKCkgY29uc3QgeyByZXR1
cm4gY29tcHJlc3Npb25fdHlwZV87IH0KKyAgdm9pZCBzZXRfY29tcHJlc3Npb25fdHlwZShUcmFj
ZUNvbmZpZ19Db21wcmVzc2lvblR5cGUgdmFsdWUpIHsgY29tcHJlc3Npb25fdHlwZV8gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDI0KTsgfQorCisgIGJvb2wgaGFzX2luY2lkZW50X3JlcG9ydF9j
b25maWcoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syNV07IH0KKyAgY29uc3QgVHJhY2VD
b25maWdfSW5jaWRlbnRSZXBvcnRDb25maWcmIGluY2lkZW50X3JlcG9ydF9jb25maWcoKSBjb25z
dCB7IHJldHVybiAqaW5jaWRlbnRfcmVwb3J0X2NvbmZpZ187IH0KKyAgVHJhY2VDb25maWdfSW5j
aWRlbnRSZXBvcnRDb25maWcqIG11dGFibGVfaW5jaWRlbnRfcmVwb3J0X2NvbmZpZygpIHsgX2hh
c19maWVsZF8uc2V0KDI1KTsgcmV0dXJuIGluY2lkZW50X3JlcG9ydF9jb25maWdfLmdldCgpOyB9
CisKKyAgYm9vbCBoYXNfdHJhY2VfdXVpZF9tc2IoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1syN107IH0KKyAgaW50NjRfdCB0cmFjZV91dWlkX21zYigpIGNvbnN0IHsgcmV0dXJuIHRyYWNl
X3V1aWRfbXNiXzsgfQorICB2b2lkIHNldF90cmFjZV91dWlkX21zYihpbnQ2NF90IHZhbHVlKSB7
IHRyYWNlX3V1aWRfbXNiXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMjcpOyB9CisKKyAgYm9v
bCBoYXNfdHJhY2VfdXVpZF9sc2IoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1syOF07IH0K
KyAgaW50NjRfdCB0cmFjZV91dWlkX2xzYigpIGNvbnN0IHsgcmV0dXJuIHRyYWNlX3V1aWRfbHNi
XzsgfQorICB2b2lkIHNldF90cmFjZV91dWlkX2xzYihpbnQ2NF90IHZhbHVlKSB7IHRyYWNlX3V1
aWRfbHNiXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMjgpOyB9CisKKyBwcml2YXRlOgorICBz
dGQ6OnZlY3RvcjxUcmFjZUNvbmZpZ19CdWZmZXJDb25maWc+IGJ1ZmZlcnNfOworICBzdGQ6OnZl
Y3RvcjxUcmFjZUNvbmZpZ19EYXRhU291cmNlPiBkYXRhX3NvdXJjZXNfOworICA6OnByb3RvemVy
bzo6Q29weWFibGVQdHI8VHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2U+IGJ1aWx0aW5fZGF0
YV9zb3VyY2VzXzsKKyAgdWludDMyX3QgZHVyYXRpb25fbXNfe307CisgIGJvb2wgZW5hYmxlX2V4
dHJhX2d1YXJkcmFpbHNfe307CisgIFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbiBs
b2NrZG93bl9tb2RlX3t9OworICBzdGQ6OnZlY3RvcjxUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZp
Zz4gcHJvZHVjZXJzXzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPFRyYWNlQ29uZmlnX1N0
YXRzZE1ldGFkYXRhPiBzdGF0c2RfbWV0YWRhdGFfOworICBib29sIHdyaXRlX2ludG9fZmlsZV97
fTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0X3BhdGhfe307CisgIHVpbnQzMl90IGZpbGVfd3JpdGVf
cGVyaW9kX21zX3t9OworICB1aW50NjRfdCBtYXhfZmlsZV9zaXplX2J5dGVzX3t9OworICA6OnBy
b3RvemVybzo6Q29weWFibGVQdHI8VHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzPiBndWFy
ZHJhaWxfb3ZlcnJpZGVzXzsKKyAgYm9vbCBkZWZlcnJlZF9zdGFydF97fTsKKyAgdWludDMyX3Qg
Zmx1c2hfcGVyaW9kX21zX3t9OworICB1aW50MzJfdCBmbHVzaF90aW1lb3V0X21zX3t9OworICB1
aW50MzJfdCBkYXRhX3NvdXJjZV9zdG9wX3RpbWVvdXRfbXNfe307CisgIGJvb2wgbm90aWZ5X3Ry
YWNldXJfe307CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxUcmFjZUNvbmZpZ19UcmlnZ2Vy
Q29uZmlnPiB0cmlnZ2VyX2NvbmZpZ187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhY3Rp
dmF0ZV90cmlnZ2Vyc187CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxUcmFjZUNvbmZpZ19J
bmNyZW1lbnRhbFN0YXRlQ29uZmlnPiBpbmNyZW1lbnRhbF9zdGF0ZV9jb25maWdfOworICBib29s
IGFsbG93X3VzZXJfYnVpbGRfdHJhY2luZ197fTsKKyAgc3RkOjpzdHJpbmcgdW5pcXVlX3Nlc3Np
b25fbmFtZV97fTsKKyAgVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlIGNvbXByZXNzaW9uX3R5
cGVfe307CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxUcmFjZUNvbmZpZ19JbmNpZGVudFJl
cG9ydENvbmZpZz4gaW5jaWRlbnRfcmVwb3J0X2NvbmZpZ187CisgIGludDY0X3QgdHJhY2VfdXVp
ZF9tc2Jfe307CisgIGludDY0X3QgdHJhY2VfdXVpZF9sc2Jfe307CisKKyAgLy8gQWxsb3dzIHRv
IHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8v
IHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5r
bm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDMwPiBfaGFzX2ZpZWxkX3t9OworfTsKKwor
CitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWcg
OiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBG
aWVsZE51bWJlcnMgeworICAgIGtEZXN0aW5hdGlvblBhY2thZ2VGaWVsZE51bWJlciA9IDEsCisg
ICAga0Rlc3RpbmF0aW9uQ2xhc3NGaWVsZE51bWJlciA9IDIsCisgICAga1ByaXZhY3lMZXZlbEZp
ZWxkTnVtYmVyID0gMywKKyAgICBrU2tpcERyb3Bib3hGaWVsZE51bWJlciA9IDQsCisgIH07CisK
KyAgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWcoKTsKKyAgflRyYWNlQ29uZmlnX0lu
Y2lkZW50UmVwb3J0Q29uZmlnKCkgb3ZlcnJpZGU7CisgIFRyYWNlQ29uZmlnX0luY2lkZW50UmVw
b3J0Q29uZmlnKFRyYWNlQ29uZmlnX0luY2lkZW50UmVwb3J0Q29uZmlnJiYpIG5vZXhjZXB0Owor
ICBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZyYgb3BlcmF0b3I9KFRyYWNlQ29uZmln
X0luY2lkZW50UmVwb3J0Q29uZmlnJiYpOworICBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENv
bmZpZyhjb25zdCBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZyYpOworICBUcmFjZUNv
bmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZyYgb3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnX0lu
Y2lkZW50UmVwb3J0Q29uZmlnJik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZp
Z19JbmNpZGVudFJlcG9ydENvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
VHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWcmIG90aGVyKSBjb25zdCB7IHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCos
IHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29u
c3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBj
b25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBj
b25zdDsKKworICBib29sIGhhc19kZXN0aW5hdGlvbl9wYWNrYWdlKCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlc3RpbmF0aW9uX3BhY2th
Z2UoKSBjb25zdCB7IHJldHVybiBkZXN0aW5hdGlvbl9wYWNrYWdlXzsgfQorICB2b2lkIHNldF9k
ZXN0aW5hdGlvbl9wYWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBkZXN0aW5hdGlv
bl9wYWNrYWdlXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19k
ZXN0aW5hdGlvbl9jbGFzcygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGNv
bnN0IHN0ZDo6c3RyaW5nJiBkZXN0aW5hdGlvbl9jbGFzcygpIGNvbnN0IHsgcmV0dXJuIGRlc3Rp
bmF0aW9uX2NsYXNzXzsgfQorICB2b2lkIHNldF9kZXN0aW5hdGlvbl9jbGFzcyhjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsgZGVzdGluYXRpb25fY2xhc3NfID0gdmFsdWU7IF9oYXNfZmllbGRf
LnNldCgyKTsgfQorCisgIGJvb2wgaGFzX3ByaXZhY3lfbGV2ZWwoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1szXTsgfQorICBpbnQzMl90IHByaXZhY3lfbGV2ZWwoKSBjb25zdCB7IHJldHVy
biBwcml2YWN5X2xldmVsXzsgfQorICB2b2lkIHNldF9wcml2YWN5X2xldmVsKGludDMyX3QgdmFs
dWUpIHsgcHJpdmFjeV9sZXZlbF8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyAg
Ym9vbCBoYXNfc2tpcF9kcm9wYm94KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07IH0K
KyAgYm9vbCBza2lwX2Ryb3Bib3goKSBjb25zdCB7IHJldHVybiBza2lwX2Ryb3Bib3hfOyB9Cisg
IHZvaWQgc2V0X3NraXBfZHJvcGJveChib29sIHZhbHVlKSB7IHNraXBfZHJvcGJveF8gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBkZXN0
aW5hdGlvbl9wYWNrYWdlX3t9OworICBzdGQ6OnN0cmluZyBkZXN0aW5hdGlvbl9jbGFzc197fTsK
KyAgaW50MzJfdCBwcml2YWN5X2xldmVsX3t9OworICBib29sIHNraXBfZHJvcGJveF97fTsKKwor
ICAvLyBBbGxvd3MgdG8gcHJlc2VydmUgdW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBh
dGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBz
dGQ6OnN0cmluZyB1bmtub3duX2ZpZWxkc187CisKKyAgc3RkOjpiaXRzZXQ8NT4gX2hhc19maWVs
ZF97fTsKK307CisKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNlQ29uZmlnX0luY3JlbWVu
dGFsU3RhdGVDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1
YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtDbGVhclBlcmlvZE1zRmllbGROdW1i
ZXIgPSAxLAorICB9OworCisgIFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcoKTsK
KyAgflRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWcoKSBvdmVycmlkZTsKKyAgVHJh
Y2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyhUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0
YXRlQ29uZmlnJiYpIG5vZXhjZXB0OworICBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29u
ZmlnJiBvcGVyYXRvcj0oVHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyYmKTsKKyAg
VHJhY2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZyhjb25zdCBUcmFjZUNvbmZpZ19JbmNy
ZW1lbnRhbFN0YXRlQ29uZmlnJik7CisgIFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25m
aWcmIG9wZXJhdG9yPShjb25zdCBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnJik7
CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29u
ZmlnJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFjZUNvbmZpZ19JbmNyZW1l
bnRhbFN0YXRlQ29uZmlnJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7
IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3QpIG92ZXJyaWRl
OworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBz
dGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7Cisg
IHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisKKyAgYm9vbCBo
YXNfY2xlYXJfcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAg
dWludDMyX3QgY2xlYXJfcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gY2xlYXJfcGVyaW9kX21z
XzsgfQorICB2b2lkIHNldF9jbGVhcl9wZXJpb2RfbXModWludDMyX3QgdmFsdWUpIHsgY2xlYXJf
cGVyaW9kX21zXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworIHByaXZhdGU6Cisg
IHVpbnQzMl90IGNsZWFyX3BlcmlvZF9tc197fTsKKworICAvLyBBbGxvd3MgdG8gcHJlc2VydmUg
dW5rbm93biBwcm90b2J1ZiBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBmdXR1
cmUgdmVyc2lvbnMgb2YgLnByb3RvIGZpbGVzLgorICBzdGQ6OnN0cmluZyB1bmtub3duX2ZpZWxk
c187CisKKyAgc3RkOjpiaXRzZXQ8Mj4gX2hhc19maWVsZF97fTsKK307CisKKworY2xhc3MgUEVS
RkVUVE9fRVhQT1JUIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcgOiBwdWJsaWMgOjpwcm90b3pl
cm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdXNpbmcgVHJpZ2dlciA9IFRyYWNlQ29u
ZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlcjsKKyAgdXNpbmcgVHJpZ2dlck1vZGUgPSBUcmFjZUNv
bmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlOworICBzdGF0aWMgY29uc3RleHByIGF1dG8g
VU5TUEVDSUZJRUQgPSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlX1VOU1BF
Q0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gU1RBUlRfVFJBQ0lORyA9IFRyYWNlQ29u
ZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVfU1RBUlRfVFJBQ0lORzsKKyAgc3RhdGljIGNv
bnN0ZXhwciBhdXRvIFNUT1BfVFJBQ0lORyA9IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJp
Z2dlck1vZGVfU1RPUF9UUkFDSU5HOworICBzdGF0aWMgY29uc3RleHByIGF1dG8gVHJpZ2dlck1v
ZGVfTUlOID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9VTlNQRUNJRklF
RDsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRyaWdnZXJNb2RlX01BWCA9IFRyYWNlQ29uZmln
X1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVfU1RPUF9UUkFDSU5HOworICBlbnVtIEZpZWxkTnVt
YmVycyB7CisgICAga1RyaWdnZXJNb2RlRmllbGROdW1iZXIgPSAxLAorICAgIGtUcmlnZ2Vyc0Zp
ZWxkTnVtYmVyID0gMiwKKyAgICBrVHJpZ2dlclRpbWVvdXRNc0ZpZWxkTnVtYmVyID0gMywKKyAg
fTsKKworICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnKCk7CisgIH5UcmFjZUNvbmZpZ19Ucmln
Z2VyQ29uZmlnKCkgb3ZlcnJpZGU7CisgIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcoVHJhY2VD
b25maWdfVHJpZ2dlckNvbmZpZyYmKSBub2V4Y2VwdDsKKyAgVHJhY2VDb25maWdfVHJpZ2dlckNv
bmZpZyYgb3BlcmF0b3I9KFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWcmJik7CisgIFRyYWNlQ29u
ZmlnX1RyaWdnZXJDb25maWcoY29uc3QgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyYpOworICBU
cmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnJiBvcGVyYXRvcj0oY29uc3QgVHJhY2VDb25maWdfVHJp
Z2dlckNvbmZpZyYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2VDb25maWdfVHJp
Z2dlckNvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisK
KyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAg
c3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2
ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lk
IFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3Ry
aWdnZXJfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIFRyYWNlQ29u
ZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGUgdHJpZ2dlcl9tb2RlKCkgY29uc3QgeyByZXR1
cm4gdHJpZ2dlcl9tb2RlXzsgfQorICB2b2lkIHNldF90cmlnZ2VyX21vZGUoVHJhY2VDb25maWdf
VHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZSB2YWx1ZSkgeyB0cmlnZ2VyX21vZGVfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGludCB0cmlnZ2Vyc19zaXplKCkgY29uc3QgeyBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0cmlnZ2Vyc18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6
OnZlY3RvcjxUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI+JiB0cmlnZ2VycygpIGNv
bnN0IHsgcmV0dXJuIHRyaWdnZXJzXzsgfQorICBzdGQ6OnZlY3RvcjxUcmFjZUNvbmZpZ19Ucmln
Z2VyQ29uZmlnX1RyaWdnZXI+KiBtdXRhYmxlX3RyaWdnZXJzKCkgeyByZXR1cm4gJnRyaWdnZXJz
XzsgfQorICB2b2lkIGNsZWFyX3RyaWdnZXJzKCkgeyB0cmlnZ2Vyc18uY2xlYXIoKTsgfQorICBU
cmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXIqIGFkZF90cmlnZ2VycygpIHsgdHJpZ2dl
cnNfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnRyaWdnZXJzXy5iYWNrKCk7IH0KKworICBib29s
IGhhc190cmlnZ2VyX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsg
fQorICB1aW50MzJfdCB0cmlnZ2VyX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiB0cmlnZ2Vy
X3RpbWVvdXRfbXNfOyB9CisgIHZvaWQgc2V0X3RyaWdnZXJfdGltZW91dF9tcyh1aW50MzJfdCB2
YWx1ZSkgeyB0cmlnZ2VyX3RpbWVvdXRfbXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgzKTsg
fQorCisgcHJpdmF0ZToKKyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZSB0
cmlnZ2VyX21vZGVfe307CisgIHN0ZDo6dmVjdG9yPFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdf
VHJpZ2dlcj4gdHJpZ2dlcnNfOworICB1aW50MzJfdCB0cmlnZ2VyX3RpbWVvdXRfbXNfe307CisK
KyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21w
YXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAg
c3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDQ+IF9oYXNfZmll
bGRfe307Cit9OworCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFjZUNvbmZpZ19UcmlnZ2Vy
Q29uZmlnX1RyaWdnZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1
YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAor
ICAgIGtQcm9kdWNlck5hbWVSZWdleEZpZWxkTnVtYmVyID0gMiwKKyAgICBrU3RvcERlbGF5TXNG
aWVsZE51bWJlciA9IDMsCisgIH07CisKKyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19Ucmln
Z2VyKCk7CisgIH5UcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXIoKSBvdmVycmlkZTsK
KyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyKFRyYWNlQ29uZmlnX1RyaWdnZXJD
b25maWdfVHJpZ2dlciYmKSBub2V4Y2VwdDsKKyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19U
cmlnZ2VyJiBvcGVyYXRvcj0oVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyJiYpOwor
ICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXIoY29uc3QgVHJhY2VDb25maWdfVHJp
Z2dlckNvbmZpZ19UcmlnZ2VyJik7CisgIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dl
ciYgb3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlciYpOwor
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2Vy
JikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnX1RyaWdnZXImIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQor
CisgIGJvb2wgUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7Cisg
IHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6
dmVjdG9yPHVpbnQ4X3Q+IFNlcmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9p
ZCBTZXJpYWxpemUoOjpwcm90b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19u
YW1lKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgY29uc3Qgc3RkOjpzdHJp
bmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBuYW1lXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMSk7
IH0KKworICBib29sIGhhc19wcm9kdWNlcl9uYW1lX3JlZ2V4KCkgY29uc3QgeyByZXR1cm4gX2hh
c19maWVsZF9bMl07IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2R1Y2VyX25hbWVfcmVnZXgo
KSBjb25zdCB7IHJldHVybiBwcm9kdWNlcl9uYW1lX3JlZ2V4XzsgfQorICB2b2lkIHNldF9wcm9k
dWNlcl9uYW1lX3JlZ2V4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeyBwcm9kdWNlcl9uYW1l
X3JlZ2V4XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKworICBib29sIGhhc19zdG9w
X2RlbGF5X21zKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bM107IH0KKyAgdWludDMyX3Qg
c3RvcF9kZWxheV9tcygpIGNvbnN0IHsgcmV0dXJuIHN0b3BfZGVsYXlfbXNfOyB9CisgIHZvaWQg
c2V0X3N0b3BfZGVsYXlfbXModWludDMyX3QgdmFsdWUpIHsgc3RvcF9kZWxheV9tc18gPSB2YWx1
ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1l
X3t9OworICBzdGQ6OnN0cmluZyBwcm9kdWNlcl9uYW1lX3JlZ2V4X3t9OworICB1aW50MzJfdCBz
dG9wX2RlbGF5X21zX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3Rv
YnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBv
ZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6
OmJpdHNldDw0PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
VHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzIDogcHVibGljIDo6cHJvdG96ZXJvOjpDcHBN
ZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmllbGROdW1iZXJzIHsKKyAgICBrTWF4VXBs
b2FkUGVyRGF5Qnl0ZXNGaWVsZE51bWJlciA9IDEsCisgIH07CisKKyAgVHJhY2VDb25maWdfR3Vh
cmRyYWlsT3ZlcnJpZGVzKCk7CisgIH5UcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMoKSBv
dmVycmlkZTsKKyAgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzKFRyYWNlQ29uZmlnX0d1
YXJkcmFpbE92ZXJyaWRlcyYmKSBub2V4Y2VwdDsKKyAgVHJhY2VDb25maWdfR3VhcmRyYWlsT3Zl
cnJpZGVzJiBvcGVyYXRvcj0oVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzJiYpOworICBU
cmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMoY29uc3QgVHJhY2VDb25maWdfR3VhcmRyYWls
T3ZlcnJpZGVzJik7CisgIFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYgb3BlcmF0b3I9
KGNvbnN0IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlcyYpOworICBib29sIG9wZXJhdG9y
PT0oY29uc3QgVHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzJikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXMmIG90aGVyKSBj
b25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9tQXJy
YXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6
ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlh
bGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90b3pl
cm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc19tYXhfdXBsb2FkX3Blcl9kYXlfYnl0
ZXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICB1aW50NjRfdCBtYXhfdXBs
b2FkX3Blcl9kYXlfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBtYXhfdXBsb2FkX3Blcl9kYXlfYnl0
ZXNfOyB9CisgIHZvaWQgc2V0X21heF91cGxvYWRfcGVyX2RheV9ieXRlcyh1aW50NjRfdCB2YWx1
ZSkgeyBtYXhfdXBsb2FkX3Blcl9kYXlfYnl0ZXNfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgx
KTsgfQorCisgcHJpdmF0ZToKKyAgdWludDY0X3QgbWF4X3VwbG9hZF9wZXJfZGF5X2J5dGVzX3t9
OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3Ig
Y29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMu
CisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDwyPiBfaGFz
X2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2VDb25maWdfU3Rh
dHNkTWV0YWRhdGEgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogeworIHB1Ymxp
YzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtUcmlnZ2VyaW5nQWxlcnRJZEZpZWxkTnVt
YmVyID0gMSwKKyAgICBrVHJpZ2dlcmluZ0NvbmZpZ1VpZEZpZWxkTnVtYmVyID0gMiwKKyAgICBr
VHJpZ2dlcmluZ0NvbmZpZ0lkRmllbGROdW1iZXIgPSAzLAorICAgIGtUcmlnZ2VyaW5nU3Vic2Ny
aXB0aW9uSWRGaWVsZE51bWJlciA9IDQsCisgIH07CisKKyAgVHJhY2VDb25maWdfU3RhdHNkTWV0
YWRhdGEoKTsKKyAgflRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhKCkgb3ZlcnJpZGU7CisgIFRy
YWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhKFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhJiYpIG5v
ZXhjZXB0OworICBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSYgb3BlcmF0b3I9KFRyYWNlQ29u
ZmlnX1N0YXRzZE1ldGFkYXRhJiYpOworICBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YShjb25z
dCBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSYpOworICBUcmFjZUNvbmZpZ19TdGF0c2RNZXRh
ZGF0YSYgb3BlcmF0b3I9KGNvbnN0IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhJik7CisgIGJv
b2wgb3BlcmF0b3I9PShjb25zdCBUcmFjZUNvbmZpZ19TdGF0c2RNZXRhZGF0YSYpIGNvbnN0Owor
ICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGEmIG90aGVy
KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQorCisgIGJvb2wgUGFyc2VGcm9t
QXJyYXkoY29uc3Qgdm9pZCosIHNpemVfdCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIFNlcmlh
bGl6ZUFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNl
cmlhbGl6ZUFzQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXJpYWxpemUoOjpwcm90
b3plcm86Ok1lc3NhZ2UqKSBjb25zdDsKKworICBib29sIGhhc190cmlnZ2VyaW5nX2FsZXJ0X2lk
KCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMV07IH0KKyAgaW50NjRfdCB0cmlnZ2VyaW5n
X2FsZXJ0X2lkKCkgY29uc3QgeyByZXR1cm4gdHJpZ2dlcmluZ19hbGVydF9pZF87IH0KKyAgdm9p
ZCBzZXRfdHJpZ2dlcmluZ19hbGVydF9pZChpbnQ2NF90IHZhbHVlKSB7IHRyaWdnZXJpbmdfYWxl
cnRfaWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX3RyaWdn
ZXJpbmdfY29uZmlnX3VpZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzJdOyB9CisgIGlu
dDMyX3QgdHJpZ2dlcmluZ19jb25maWdfdWlkKCkgY29uc3QgeyByZXR1cm4gdHJpZ2dlcmluZ19j
b25maWdfdWlkXzsgfQorICB2b2lkIHNldF90cmlnZ2VyaW5nX2NvbmZpZ191aWQoaW50MzJfdCB2
YWx1ZSkgeyB0cmlnZ2VyaW5nX2NvbmZpZ191aWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgy
KTsgfQorCisgIGJvb2wgaGFzX3RyaWdnZXJpbmdfY29uZmlnX2lkKCkgY29uc3QgeyByZXR1cm4g
X2hhc19maWVsZF9bM107IH0KKyAgaW50NjRfdCB0cmlnZ2VyaW5nX2NvbmZpZ19pZCgpIGNvbnN0
IHsgcmV0dXJuIHRyaWdnZXJpbmdfY29uZmlnX2lkXzsgfQorICB2b2lkIHNldF90cmlnZ2VyaW5n
X2NvbmZpZ19pZChpbnQ2NF90IHZhbHVlKSB7IHRyaWdnZXJpbmdfY29uZmlnX2lkXyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoMyk7IH0KKworICBib29sIGhhc190cmlnZ2VyaW5nX3N1YnNjcmlw
dGlvbl9pZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIGludDY0X3QgdHJp
Z2dlcmluZ19zdWJzY3JpcHRpb25faWQoKSBjb25zdCB7IHJldHVybiB0cmlnZ2VyaW5nX3N1YnNj
cmlwdGlvbl9pZF87IH0KKyAgdm9pZCBzZXRfdHJpZ2dlcmluZ19zdWJzY3JpcHRpb25faWQoaW50
NjRfdCB2YWx1ZSkgeyB0cmlnZ2VyaW5nX3N1YnNjcmlwdGlvbl9pZF8gPSB2YWx1ZTsgX2hhc19m
aWVsZF8uc2V0KDQpOyB9CisKKyBwcml2YXRlOgorICBpbnQ2NF90IHRyaWdnZXJpbmdfYWxlcnRf
aWRfe307CisgIGludDMyX3QgdHJpZ2dlcmluZ19jb25maWdfdWlkX3t9OworICBpbnQ2NF90IHRy
aWdnZXJpbmdfY29uZmlnX2lkX3t9OworICBpbnQ2NF90IHRyaWdnZXJpbmdfc3Vic2NyaXB0aW9u
X2lkX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3RvYnVmIGZpZWxk
cyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8g
ZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6OmJpdHNldDw1
PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2VDb25m
aWdfUHJvZHVjZXJDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86OkNwcE1lc3NhZ2VPYmogewor
IHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAgIGtQcm9kdWNlck5hbWVGaWVsZE51
bWJlciA9IDEsCisgICAga1NobVNpemVLYkZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGFnZVNpemVL
YkZpZWxkTnVtYmVyID0gMywKKyAgfTsKKworICBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZygp
OworICB+VHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcoKSBvdmVycmlkZTsKKyAgVHJhY2VDb25m
aWdfUHJvZHVjZXJDb25maWcoVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcmJikgbm9leGNlcHQ7
CisgIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnJiBvcGVyYXRvcj0oVHJhY2VDb25maWdfUHJv
ZHVjZXJDb25maWcmJik7CisgIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnKGNvbnN0IFRyYWNl
Q29uZmlnX1Byb2R1Y2VyQ29uZmlnJik7CisgIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnJiBv
cGVyYXRvcj0oY29uc3QgVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWcmKTsKKyAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnJikgY29uc3Q7CisgIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZyYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNT
dHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6
TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3Byb2R1Y2VyX25hbWUoKSBjb25zdCB7IHJl
dHVybiBfaGFzX2ZpZWxkX1sxXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvZHVjZXJfbmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIHByb2R1Y2VyX25hbWVfOyB9CisgIHZvaWQgc2V0X3Byb2R1Y2Vy
X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IHByb2R1Y2VyX25hbWVfID0gdmFsdWU7
IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX3NobV9zaXplX2tiKCkgY29uc3Qg
eyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAgdWludDMyX3Qgc2htX3NpemVfa2IoKSBjb25z
dCB7IHJldHVybiBzaG1fc2l6ZV9rYl87IH0KKyAgdm9pZCBzZXRfc2htX3NpemVfa2IodWludDMy
X3QgdmFsdWUpIHsgc2htX3NpemVfa2JfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQor
CisgIGJvb2wgaGFzX3BhZ2Vfc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzNd
OyB9CisgIHVpbnQzMl90IHBhZ2Vfc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJuIHBhZ2Vfc2l6ZV9r
Yl87IH0KKyAgdm9pZCBzZXRfcGFnZV9zaXplX2tiKHVpbnQzMl90IHZhbHVlKSB7IHBhZ2Vfc2l6
ZV9rYl8gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDMpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6
OnN0cmluZyBwcm9kdWNlcl9uYW1lX3t9OworICB1aW50MzJfdCBzaG1fc2l6ZV9rYl97fTsKKyAg
dWludDMyX3QgcGFnZV9zaXplX2tiX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtu
b3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2
ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsK
KworICBzdGQ6OmJpdHNldDw0PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRU
T19FWFBPUlQgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2UgOiBwdWJsaWMgOjpwcm90b3pl
cm86OkNwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgZW51bSBGaWVsZE51bWJlcnMgeworICAg
IGtEaXNhYmxlQ2xvY2tTbmFwc2hvdHRpbmdGaWVsZE51bWJlciA9IDEsCisgICAga0Rpc2FibGVU
cmFjZUNvbmZpZ0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrRGlzYWJsZVN5c3RlbUluZm9GaWVsZE51
bWJlciA9IDMsCisgICAga0Rpc2FibGVTZXJ2aWNlRXZlbnRzRmllbGROdW1iZXIgPSA0LAorICAg
IGtQcmltYXJ5VHJhY2VDbG9ja0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrU25hcHNob3RJbnRlcnZh
bE1zRmllbGROdW1iZXIgPSA2LAorICB9OworCisgIFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291
cmNlKCk7CisgIH5UcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSgpIG92ZXJyaWRlOworICBU
cmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZShUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJj
ZSYmKSBub2V4Y2VwdDsKKyAgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2UmIG9wZXJhdG9y
PShUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZSYmKTsKKyAgVHJhY2VDb25maWdfQnVpbHRp
bkRhdGFTb3VyY2UoY29uc3QgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2UmKTsKKyAgVHJh
Y2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2UmIG9wZXJhdG9yPShjb25zdCBUcmFjZUNvbmZpZ19C
dWlsdGluRGF0YVNvdXJjZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2VDb25maWdf
QnVpbHRpbkRhdGFTb3VyY2UmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRyYWNl
Q29uZmlnX0J1aWx0aW5EYXRhU291cmNlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9
PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXplX3Qp
IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92ZXJy
aWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qgb3Zl
cnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7CisK
KyAgYm9vbCBoYXNfZGlzYWJsZV9jbG9ja19zbmFwc2hvdHRpbmcoKSBjb25zdCB7IHJldHVybiBf
aGFzX2ZpZWxkX1sxXTsgfQorICBib29sIGRpc2FibGVfY2xvY2tfc25hcHNob3R0aW5nKCkgY29u
c3QgeyByZXR1cm4gZGlzYWJsZV9jbG9ja19zbmFwc2hvdHRpbmdfOyB9CisgIHZvaWQgc2V0X2Rp
c2FibGVfY2xvY2tfc25hcHNob3R0aW5nKGJvb2wgdmFsdWUpIHsgZGlzYWJsZV9jbG9ja19zbmFw
c2hvdHRpbmdfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQorCisgIGJvb2wgaGFzX2Rp
c2FibGVfdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bMl07IH0KKyAg
Ym9vbCBkaXNhYmxlX3RyYWNlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGRpc2FibGVfdHJhY2Vf
Y29uZmlnXzsgfQorICB2b2lkIHNldF9kaXNhYmxlX3RyYWNlX2NvbmZpZyhib29sIHZhbHVlKSB7
IGRpc2FibGVfdHJhY2VfY29uZmlnXyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoMik7IH0KKwor
ICBib29sIGhhc19kaXNhYmxlX3N5c3RlbV9pbmZvKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVs
ZF9bM107IH0KKyAgYm9vbCBkaXNhYmxlX3N5c3RlbV9pbmZvKCkgY29uc3QgeyByZXR1cm4gZGlz
YWJsZV9zeXN0ZW1faW5mb187IH0KKyAgdm9pZCBzZXRfZGlzYWJsZV9zeXN0ZW1faW5mbyhib29s
IHZhbHVlKSB7IGRpc2FibGVfc3lzdGVtX2luZm9fID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgz
KTsgfQorCisgIGJvb2wgaGFzX2Rpc2FibGVfc2VydmljZV9ldmVudHMoKSBjb25zdCB7IHJldHVy
biBfaGFzX2ZpZWxkX1s0XTsgfQorICBib29sIGRpc2FibGVfc2VydmljZV9ldmVudHMoKSBjb25z
dCB7IHJldHVybiBkaXNhYmxlX3NlcnZpY2VfZXZlbnRzXzsgfQorICB2b2lkIHNldF9kaXNhYmxl
X3NlcnZpY2VfZXZlbnRzKGJvb2wgdmFsdWUpIHsgZGlzYWJsZV9zZXJ2aWNlX2V2ZW50c18gPSB2
YWx1ZTsgX2hhc19maWVsZF8uc2V0KDQpOyB9CisKKyAgYm9vbCBoYXNfcHJpbWFyeV90cmFjZV9j
bG9jaygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzVdOyB9CisgIEJ1aWx0aW5DbG9jayBw
cmltYXJ5X3RyYWNlX2Nsb2NrKCkgY29uc3QgeyByZXR1cm4gcHJpbWFyeV90cmFjZV9jbG9ja187
IH0KKyAgdm9pZCBzZXRfcHJpbWFyeV90cmFjZV9jbG9jayhCdWlsdGluQ2xvY2sgdmFsdWUpIHsg
cHJpbWFyeV90cmFjZV9jbG9ja18gPSB2YWx1ZTsgX2hhc19maWVsZF8uc2V0KDUpOyB9CisKKyAg
Ym9vbCBoYXNfc25hcHNob3RfaW50ZXJ2YWxfbXMoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxk
X1s2XTsgfQorICB1aW50MzJfdCBzbmFwc2hvdF9pbnRlcnZhbF9tcygpIGNvbnN0IHsgcmV0dXJu
IHNuYXBzaG90X2ludGVydmFsX21zXzsgfQorICB2b2lkIHNldF9zbmFwc2hvdF9pbnRlcnZhbF9t
cyh1aW50MzJfdCB2YWx1ZSkgeyBzbmFwc2hvdF9pbnRlcnZhbF9tc18gPSB2YWx1ZTsgX2hhc19m
aWVsZF8uc2V0KDYpOyB9CisKKyBwcml2YXRlOgorICBib29sIGRpc2FibGVfY2xvY2tfc25hcHNo
b3R0aW5nX3t9OworICBib29sIGRpc2FibGVfdHJhY2VfY29uZmlnX3t9OworICBib29sIGRpc2Fi
bGVfc3lzdGVtX2luZm9fe307CisgIGJvb2wgZGlzYWJsZV9zZXJ2aWNlX2V2ZW50c197fTsKKyAg
QnVpbHRpbkNsb2NrIHByaW1hcnlfdHJhY2VfY2xvY2tfe307CisgIHVpbnQzMl90IHNuYXBzaG90
X2ludGVydmFsX21zX3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1bmtub3duIHByb3Rv
YnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBv
ZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRzXzsKKworICBzdGQ6
OmJpdHNldDw3PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQg
VHJhY2VDb25maWdfRGF0YVNvdXJjZSA6IHB1YmxpYyA6OnByb3RvemVybzo6Q3BwTWVzc2FnZU9i
aiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga0NvbmZpZ0ZpZWxkTnVt
YmVyID0gMSwKKyAgICBrUHJvZHVjZXJOYW1lRmlsdGVyRmllbGROdW1iZXIgPSAyLAorICAgIGtQ
cm9kdWNlck5hbWVSZWdleEZpbHRlckZpZWxkTnVtYmVyID0gMywKKyAgfTsKKworICBUcmFjZUNv
bmZpZ19EYXRhU291cmNlKCk7CisgIH5UcmFjZUNvbmZpZ19EYXRhU291cmNlKCkgb3ZlcnJpZGU7
CisgIFRyYWNlQ29uZmlnX0RhdGFTb3VyY2UoVHJhY2VDb25maWdfRGF0YVNvdXJjZSYmKSBub2V4
Y2VwdDsKKyAgVHJhY2VDb25maWdfRGF0YVNvdXJjZSYgb3BlcmF0b3I9KFRyYWNlQ29uZmlnX0Rh
dGFTb3VyY2UmJik7CisgIFRyYWNlQ29uZmlnX0RhdGFTb3VyY2UoY29uc3QgVHJhY2VDb25maWdf
RGF0YVNvdXJjZSYpOworICBUcmFjZUNvbmZpZ19EYXRhU291cmNlJiBvcGVyYXRvcj0oY29uc3Qg
VHJhY2VDb25maWdfRGF0YVNvdXJjZSYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2VD
b25maWdfRGF0YVNvdXJjZSYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2VD
b25maWdfRGF0YVNvdXJjZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlk
ZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAg
c3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOwor
ICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGJvb2wg
aGFzX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9CisgIGNvbnN0IERh
dGFTb3VyY2VDb25maWcmIGNvbmZpZygpIGNvbnN0IHsgcmV0dXJuICpjb25maWdfOyB9CisgIERh
dGFTb3VyY2VDb25maWcqIG11dGFibGVfY29uZmlnKCkgeyBfaGFzX2ZpZWxkXy5zZXQoMSk7IHJl
dHVybiBjb25maWdfLmdldCgpOyB9CisKKyAgaW50IHByb2R1Y2VyX25hbWVfZmlsdGVyX3NpemUo
KSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHByb2R1Y2VyX25hbWVfZmlsdGVyXy5z
aXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHJvZHVjZXJfbmFt
ZV9maWx0ZXIoKSBjb25zdCB7IHJldHVybiBwcm9kdWNlcl9uYW1lX2ZpbHRlcl87IH0KKyAgc3Rk
Ojp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX3Byb2R1Y2VyX25hbWVfZmlsdGVyKCkgeyBy
ZXR1cm4gJnByb2R1Y2VyX25hbWVfZmlsdGVyXzsgfQorICB2b2lkIGNsZWFyX3Byb2R1Y2VyX25h
bWVfZmlsdGVyKCkgeyBwcm9kdWNlcl9uYW1lX2ZpbHRlcl8uY2xlYXIoKTsgfQorICB2b2lkIGFk
ZF9wcm9kdWNlcl9uYW1lX2ZpbHRlcihzdGQ6OnN0cmluZyB2YWx1ZSkgeyBwcm9kdWNlcl9uYW1l
X2ZpbHRlcl8uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBzdGQ6OnN0cmluZyogYWRkX3Byb2R1
Y2VyX25hbWVfZmlsdGVyKCkgeyBwcm9kdWNlcl9uYW1lX2ZpbHRlcl8uZW1wbGFjZV9iYWNrKCk7
IHJldHVybiAmcHJvZHVjZXJfbmFtZV9maWx0ZXJfLmJhY2soKTsgfQorCisgIGludCBwcm9kdWNl
cl9uYW1lX3JlZ2V4X2ZpbHRlcl9zaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50
Pihwcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl8uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZl
Y3RvcjxzdGQ6OnN0cmluZz4mIHByb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyKCkgY29uc3QgeyBy
ZXR1cm4gcHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXJfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6
c3RyaW5nPiogbXV0YWJsZV9wcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcigpIHsgcmV0dXJuICZw
cm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcl87IH0KKyAgdm9pZCBjbGVhcl9wcm9kdWNlcl9uYW1l
X3JlZ2V4X2ZpbHRlcigpIHsgcHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXJfLmNsZWFyKCk7IH0K
KyAgdm9pZCBhZGRfcHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXIoc3RkOjpzdHJpbmcgdmFsdWUp
IHsgcHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXJfLmVtcGxhY2VfYmFjayh2YWx1ZSk7IH0KKyAg
c3RkOjpzdHJpbmcqIGFkZF9wcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcigpIHsgcHJvZHVjZXJf
bmFtZV9yZWdleF9maWx0ZXJfLmVtcGxhY2VfYmFjaygpOyByZXR1cm4gJnByb2R1Y2VyX25hbWVf
cmVnZXhfZmlsdGVyXy5iYWNrKCk7IH0KKworIHByaXZhdGU6CisgIDo6cHJvdG96ZXJvOjpDb3B5
YWJsZVB0cjxEYXRhU291cmNlQ29uZmlnPiBjb25maWdfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0
cmluZz4gcHJvZHVjZXJfbmFtZV9maWx0ZXJfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4g
cHJvZHVjZXJfbmFtZV9yZWdleF9maWx0ZXJfOworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2ZSB1
bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1dHVy
ZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmllbGRz
XzsKKworICBzdGQ6OmJpdHNldDw0PiBfaGFzX2ZpZWxkX3t9OworfTsKKworCitjbGFzcyBQRVJG
RVRUT19FWFBPUlQgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJv
OjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIHVzaW5nIEZpbGxQb2xpY3kgPSBUcmFjZUNv
bmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeTsKKyAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIFVO
U1BFQ0lGSUVEID0gVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQb2xpY3lfVU5TUEVDSUZJ
RUQ7CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBSSU5HX0JVRkZFUiA9IFRyYWNlQ29uZmlnX0J1
ZmZlckNvbmZpZ19GaWxsUG9saWN5X1JJTkdfQlVGRkVSOworICBzdGF0aWMgY29uc3RleHByIGF1
dG8gRElTQ0FSRCA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5X0RJU0NBUkQ7
CisgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBGaWxsUG9saWN5X01JTiA9IFRyYWNlQ29uZmlnX0J1
ZmZlckNvbmZpZ19GaWxsUG9saWN5X1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3RleHByIGF1
dG8gRmlsbFBvbGljeV9NQVggPSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9E
SVNDQVJEOworICBlbnVtIEZpZWxkTnVtYmVycyB7CisgICAga1NpemVLYkZpZWxkTnVtYmVyID0g
MSwKKyAgICBrRmlsbFBvbGljeUZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKworICBUcmFjZUNvbmZp
Z19CdWZmZXJDb25maWcoKTsKKyAgflRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZygpIG92ZXJyaWRl
OworICBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcoVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnJiYp
IG5vZXhjZXB0OworICBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcmIG9wZXJhdG9yPShUcmFjZUNv
bmZpZ19CdWZmZXJDb25maWcmJik7CisgIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyhjb25zdCBU
cmFjZUNvbmZpZ19CdWZmZXJDb25maWcmKTsKKyAgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnJiBv
cGVyYXRvcj0oY29uc3QgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnJik7CisgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWcmKSBjb25zdDsKKyAgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0
dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2
b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmco
KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJh
eSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2Fn
ZSopIGNvbnN0OworCisgIGJvb2wgaGFzX3NpemVfa2IoKSBjb25zdCB7IHJldHVybiBfaGFzX2Zp
ZWxkX1sxXTsgfQorICB1aW50MzJfdCBzaXplX2tiKCkgY29uc3QgeyByZXR1cm4gc2l6ZV9rYl87
IH0KKyAgdm9pZCBzZXRfc2l6ZV9rYih1aW50MzJfdCB2YWx1ZSkgeyBzaXplX2tiXyA9IHZhbHVl
OyBfaGFzX2ZpZWxkXy5zZXQoMSk7IH0KKworICBib29sIGhhc19maWxsX3BvbGljeSgpIGNvbnN0
IHsgcmV0dXJuIF9oYXNfZmllbGRfWzRdOyB9CisgIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19G
aWxsUG9saWN5IGZpbGxfcG9saWN5KCkgY29uc3QgeyByZXR1cm4gZmlsbF9wb2xpY3lfOyB9Cisg
IHZvaWQgc2V0X2ZpbGxfcG9saWN5KFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5
IHZhbHVlKSB7IGZpbGxfcG9saWN5XyA9IHZhbHVlOyBfaGFzX2ZpZWxkXy5zZXQoNCk7IH0KKwor
IHByaXZhdGU6CisgIHVpbnQzMl90IHNpemVfa2Jfe307CisgIFRyYWNlQ29uZmlnX0J1ZmZlckNv
bmZpZ19GaWxsUG9saWN5IGZpbGxfcG9saWN5X3t9OworCisgIC8vIEFsbG93cyB0byBwcmVzZXJ2
ZSB1bmtub3duIHByb3RvYnVmIGZpZWxkcyBmb3IgY29tcGF0aWJpbGl0eQorICAvLyB3aXRoIGZ1
dHVyZSB2ZXJzaW9ucyBvZiAucHJvdG8gZmlsZXMuCisgIHN0ZDo6c3RyaW5nIHVua25vd25fZmll
bGRzXzsKKworICBzdGQ6OmJpdHNldDw1PiBfaGFzX2ZpZWxkX3t9OworfTsKKworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2Ug
Z2VuCisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdf
VFJBQ0VfQ09ORklHX1BST1RPX0NQUF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUg
QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFw
YWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5v
dCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisg
KiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0
dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBy
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
cmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu
ICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBB
TlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBm
b3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxp
bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJG
RVRUT19UUkFDSU5HX0NPUkVfVFJBQ0VfQ09ORklHX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVU
VE9fVFJBQ0lOR19DT1JFX1RSQUNFX0NPTkZJR19IXworCisvLyBDcmVhdGVzIHRoZSBhbGlhc2Vz
IGluIHRoZSA6OnBlcmZldHRvIG5hbWVzcGFjZSwgZG9pbmcgdGhpbmdzIGxpa2U6CisvLyB1c2lu
ZyA6OnBlcmZldHRvOjpGb28gPSA6OnBlcmZldHRvOjpwcm90b3M6Omdlbjo6Rm9vLgorLy8gU2Vl
IGNvbW1lbnRzIGluIGZvcndhcmRfZGVjbHMuaCBmb3IgdGhlIGhpc3RvcmljYWwgcmVhc29ucyBv
ZiB0aGlzCisvLyBpbmRpcmVjdGlvbiBsYXllci4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by9jb25m
aWcvdHJhY2VfY29uZmlnLmdlbi5oIgorCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJB
Q0lOR19DT1JFX1RSQUNFX0NPTkZJR19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRl
cjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2RhdGFfc291cmNlLmgKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS9jb21waWxlci5oCisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAq
CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg
IkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs
aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg
TGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJ
Q0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFn
cmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp
Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FS
UkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBs
aWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu
aW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisg
Ki8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX0JBU0VfQ09NUElMRVJfSF8KKyNkZWZpbmUg
SU5DTFVERV9QRVJGRVRUT19CQVNFX0NPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0
cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFz
ZS9idWlsZF9jb25maWcuaCIKKworI2RlZmluZSBQRVJGRVRUT19MSUtFTFkoX3gpIF9fYnVpbHRp
bl9leHBlY3QoISEoX3gpLCAxKQorI2RlZmluZSBQRVJGRVRUT19VTkxJS0VMWShfeCkgX19idWls
dGluX2V4cGVjdCghIShfeCksIDApCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVk
KF9fY2xhbmdfXykKKyNkZWZpbmUgUEVSRkVUVE9fV0FSTl9VTlVTRURfUkVTVUxUIF9fYXR0cmli
dXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpCisjZWxzZQorI2RlZmluZSBQRVJGRVRUT19XQVJO
X1VOVVNFRF9SRVNVTFQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5l
IFBFUkZFVFRPX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18p
KQorI2RlZmluZSBQRVJGRVRUT19OT19JTkxJTkUgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9f
KSkKKyNlbHNlCisvLyBHQ0MgaXMgdG9vIHBlZGFudGljIGFuZCBvZnRlbiBmYWlscyB3aXRoIHRo
ZSBlcnJvcjoKKy8vICJhbHdheXNfaW5saW5lIGZ1bmN0aW9uIG1pZ2h0IG5vdCBiZSBpbmxpbmFi
bGUiCisjZGVmaW5lIFBFUkZFVFRPX0FMV0FZU19JTkxJTkUKKyNkZWZpbmUgUEVSRkVUVE9fTk9f
SU5MSU5FCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19jbGFu
Z19fKQorI2RlZmluZSBQRVJGRVRUT19ERUJVR19GVU5DVElPTl9JREVOVElGSUVSKCkgX19QUkVU
VFlfRlVOQ1RJT05fXworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUEVSRkVUVE9f
REVCVUdfRlVOQ1RJT05fSURFTlRJRklFUigpIF9fRlVOQ1NJR19fCisjZWxzZQorI2RlZmluZSBQ
RVJGRVRUT19ERUJVR19GVU5DVElPTl9JREVOVElGSUVSKCkgXAorICBzdGF0aWNfYXNzZXJ0KGZh
bHNlLCAiTm90IGltcGxlbWVudGVkIGZvciB0aGlzIGNvbXBpbGVyIikKKyNlbmRpZgorCisjaWYg
ZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFBFUkZFVFRP
X1BSSU5URl9GT1JNQVQoeCwgeSkgXAorICBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJp
bnRmX18sIHgsIHkpKSkKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX1BSSU5URl9GT1JNQVQoeCwg
eSkKKyNlbmRpZgorCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0lPUykKKy8v
IFRPRE8oYi8xNTg4MTQwNjgpOiBGb3IgaU9TIGJ1aWxkcywgdGhyZWFkX2xvY2FsIGlzIG9ubHkg
c3VwcG9ydGVkIHNpbmNlIGlPUworLy8gOC4gV2UnZCBoYXZlIHRvIHVzZSBwdGhyZWFkIGZvciB0
aHJlYWQgbG9jYWwgZGF0YSBpbnN0ZWFkIGhlcmUuIEZvciBub3csIGp1c3QKKy8vIGRlZmluZSBp
dCB0byBub3RoaW5nIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgcnVubmluZyBwZXJmZXR0byBvciB0
aGUgY2xpZW50CisvLyBsaWIgb24gaU9TIHJpZ2h0IG5vdy4KKyNkZWZpbmUgUEVSRkVUVE9fVEhS
RUFEX0xPQ0FMCisjZWxzZQorI2RlZmluZSBQRVJGRVRUT19USFJFQURfTE9DQUwgdGhyZWFkX2xv
Y2FsCisjZW5kaWYKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBiYXNlIHsKKwor
dGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CitpbmxpbmUgdm9pZCBpZ25vcmVfcmVzdWx0KGNvbnN0
IFQmLi4uKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBlcmZl
dHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19CQVNFX0NPTVBJTEVSX0hfCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3RvemVyby9t
ZXNzYWdlLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0
dG8vYmFzZS9sb2dnaW5nLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQg
T3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGlj
ZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRo
aXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1h
eSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3
LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQg
YnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBk
aXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMi
IEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQs
IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBz
cGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9u
cyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFT
RV9MT0dHSU5HX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9MT0dHSU5HX0hfCisK
KyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIHN0cmVycm9y
LgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNl
L2J1aWxkX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vYmFzZS9jb21waWxlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworLy8gSWdub3JlIEdDQyB3YXJuaW5n
IGFib3V0IGEgbWlzc2luZyBhcmd1bWVudCBmb3IgYSB2YXJpYWRpYyBtYWNybyBwYXJhbWV0ZXIu
CisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKy8vIFRPRE8ocHJpbWlhbm8pOiBtb3ZlIHRo
aXMgdG8gYmFzZS9idWlsZF9jb25maWcuaCwgdHVybiBpbnRvCisvLyBQRVJGRVRUT19CVUlMREZM
QUcoRENIRUNLX0lTX09OKSBhbmQgdXBkYXRlIGNhbGwgc2l0ZXMgdG8gdXNlIHRoYXQgaW5zdGVh
ZC4KKyNpZiBkZWZpbmVkKE5ERUJVRykgJiYgIWRlZmluZWQoRENIRUNLX0FMV0FZU19PTikKKyNk
ZWZpbmUgUEVSRkVUVE9fRENIRUNLX0lTX09OKCkgMAorI2Vsc2UKKyNkZWZpbmUgUEVSRkVUVE9f
RENIRUNLX0lTX09OKCkgMQorI2VuZGlmCisKKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVU
VE9fRk9SQ0VfRExPR19PTikKKyNkZWZpbmUgUEVSRkVUVE9fRExPR19JU19PTigpIDEKKyNlbGlm
IFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19GT1JDRV9ETE9HX09GRikKKyNkZWZpbmUgUEVS
RkVUVE9fRExPR19JU19PTigpIDAKKyNlbHNlCisjZGVmaW5lIFBFUkZFVFRPX0RMT0dfSVNfT04o
KSBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBFUkZFVFRP
X0FORFJPSURfQVNZTkNfU0FGRV9MT0cpCisjaWYgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRU
T19PU19BTkRST0lEKSB8fCBcCisgICAgIVBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19BTkRS
T0lEX0JVSUxEKQorI2Vycm9yICJBc3luYy1zYWZlIGxvZ2dpbmcgaXMgbGltaXRlZCB0byBBbmRy
b2lkIHRyZWUgYnVpbGRzIgorI2VuZGlmCisvLyBGb3IgYmluYXJpZXMgd2hpY2ggbmVlZCBhIHZl
cnkgbGlnaHR3ZWlnaHQgbG9nZ2luZyBpbXBsZW1lbnRhdGlvbi4KKy8vIE5vdGUgdGhhdCB0aGlz
IGhlYWRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBhbmRyb2lkL2xvZy5oLgorI2luY2x1ZGUgPGFz
eW5jX3NhZmUvbG9nLmg+CisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfQU5E
Uk9JRCkKKy8vIE5vcm1hbCBhbmRyb2lkIGxvZ2dpbmcuCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cu
aD4KKyNlbmRpZgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCisv
LyBDb25zdGV4cHIgZnVuY3Rpb25zIHRvIGV4dHJhY3QgYmFzZW5hbWUoX19GSUxFX18pLCBlLmcu
OiAuLi9mb28vZi5jIC0+IGYuYyAuCitjb25zdGV4cHIgY29uc3QgY2hhciogU3RyRW5kKGNvbnN0
IGNoYXIqIHMpIHsKKyAgcmV0dXJuICpzID8gU3RyRW5kKHMgKyAxKSA6IHM7Cit9CisKK2NvbnN0
ZXhwciBjb25zdCBjaGFyKiBCYXNlbmFtZVJlY3Vyc2l2ZShjb25zdCBjaGFyKiBzLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJlZ2luLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVuZCkgewor
ICByZXR1cm4gKCpzID09ICcvJyAmJiBzIDwgZW5kKQorICAgICAgICAgICAgID8gKHMgKyAxKQor
ICAgICAgICAgICAgIDogKChzID4gYmVnaW4pID8gQmFzZW5hbWVSZWN1cnNpdmUocyAtIDEsIGJl
Z2luLCBlbmQpIDogcyk7Cit9CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBCYXNlbmFtZShjb25z
dCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIEJhc2VuYW1lUmVjdXJzaXZlKFN0ckVuZChzdHIpLCBz
dHIsIFN0ckVuZChzdHIpKTsKK30KKworZW51bSBMb2dMZXYgeyBrTG9nRGVidWcgPSAwLCBrTG9n
SW5mbywga0xvZ0ltcG9ydGFudCwga0xvZ0Vycm9yIH07CisKK1BFUkZFVFRPX0VYUE9SVCB2b2lk
IExvZ01lc3NhZ2UoTG9nTGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBjaGFyKiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSBQRVJGRVRUT19QUklOVEZfRk9STUFUKDQs
IDUpOworCisjaWYgZGVmaW5lZChQRVJGRVRUT19BTkRST0lEX0FTWU5DX1NBRkVfTE9HKQorI2Rl
ZmluZSBQRVJGRVRUT19YTE9HKGxldmVsLCBmbXQsIC4uLikgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzeW5jX3Nh
ZmVfZm9ybWF0X2xvZygoQU5EUk9JRF9MT0dfREVCVUcgKyBsZXZlbCksICJwZXJmZXR0byIsICAg
ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6JWQgIiBmbXQsIDo6cGVy
ZmV0dG86OmJhc2U6OkJhc2VuYW1lKF9fRklMRV9fKSwgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICB9IHdoaWxlICgwKQorI2Vsc2UgIC8vIGRlZmluZWQoUEVSRkVUVE9fQU5EUk9JRF9BU1lO
Q19TQUZFX0xPRykKKyNkZWZpbmUgUEVSRkVUVE9fWExPRyhsZXZlbCwgZm10LCAuLi4pICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDo6cGVyZmV0dG86OmJhc2U6Okxv
Z01lc3NhZ2UobGV2ZWwsIDo6cGVyZmV0dG86OmJhc2U6OkJhc2VuYW1lKF9fRklMRV9fKSwgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBmbXQsICMjX19WQV9BUkdT
X18pCisjZW5kaWYgIC8vIGRlZmluZWQoUEVSRkVUVE9fQU5EUk9JRF9BU1lOQ19TQUZFX0xPRykK
KworI2RlZmluZSBQRVJGRVRUT19JTU1FRElBVEVfQ1JBU0goKSBcCisgIGRvIHsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2J1aWx0aW5fdHJhcCgpOyAgICAgICAgICAgICAg
XAorICAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOyAgICAgICBcCisgIH0gd2hpbGUgKDApCisK
KyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fVkVSQk9TRV9MT0dTKQorI2RlZmluZSBQ
RVJGRVRUT19MT0coZm10LCAuLi4pIFwKKyAgUEVSRkVUVE9fWExPRyg6OnBlcmZldHRvOjpiYXNl
OjprTG9nSW5mbywgZm10LCAjI19fVkFfQVJHU19fKQorI2Vsc2UgIC8vIFBFUkZFVFRPX0JVSUxE
RkxBRyhQRVJGRVRUT19WRVJCT1NFX0xPR1MpCisjZGVmaW5lIFBFUkZFVFRPX0xPRyguLi4pIDo6
cGVyZmV0dG86OmJhc2U6Omlnbm9yZV9yZXN1bHQoX19WQV9BUkdTX18pCisjZW5kaWYgIC8vIFBF
UkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19WRVJCT1NFX0xPR1MpCisKKyNkZWZpbmUgUEVSRkVU
VE9fSUxPRyhmbXQsIC4uLikgXAorICBQRVJGRVRUT19YTE9HKDo6cGVyZmV0dG86OmJhc2U6OmtM
b2dJbXBvcnRhbnQsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUEVSRkVUVE9fRUxPRyhm
bXQsIC4uLikgXAorICBQRVJGRVRUT19YTE9HKDo6cGVyZmV0dG86OmJhc2U6OmtMb2dFcnJvciwg
Zm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBQRVJGRVRUT19GQVRBTChmbXQsIC4uLikgICAg
ICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBFUkZF
VFRPX1BMT0coZm10LCAjI19fVkFfQVJHU19fKTsgXAorICAgIFBFUkZFVFRPX0lNTUVESUFURV9D
UkFTSCgpOyAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBFUkZFVFRPX1BMT0co
eCwgLi4uKSBcCisgIFBFUkZFVFRPX0VMT0coeCAiIChlcnJubzogJWQsICVzKSIsICMjX19WQV9B
UkdTX18sIGVycm5vLCBzdHJlcnJvcihlcnJubykpCisKKyNpZiBQRVJGRVRUT19ETE9HX0lTX09O
KCkKKworI2RlZmluZSBQRVJGRVRUT19ETE9HKGZtdCwgLi4uKSBcCisgIFBFUkZFVFRPX1hMT0co
OjpwZXJmZXR0bzo6YmFzZTo6a0xvZ0RlYnVnLCBmbXQsICMjX19WQV9BUkdTX18pCisKKyNkZWZp
bmUgUEVSRkVUVE9fRFBMT0coeCwgLi4uKSBcCisgIFBFUkZFVFRPX0RMT0coeCAiIChlcnJubzog
JWQsICVzKSIsICMjX19WQV9BUkdTX18sIGVycm5vLCBzdHJlcnJvcihlcnJubykpCisKKyNlbHNl
ICAvLyBQRVJGRVRUT19ETE9HX0lTX09OKCkKKworI2RlZmluZSBQRVJGRVRUT19ETE9HKC4uLikg
OjpwZXJmZXR0bzo6YmFzZTo6aWdub3JlX3Jlc3VsdChfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUEVS
RkVUVE9fRFBMT0coLi4uKSA6OnBlcmZldHRvOjpiYXNlOjppZ25vcmVfcmVzdWx0KF9fVkFfQVJH
U19fKQorCisjZW5kaWYgIC8vIFBFUkZFVFRPX0RMT0dfSVNfT04oKQorCisjaWYgUEVSRkVUVE9f
RENIRUNLX0lTX09OKCkKKworI2RlZmluZSBQRVJGRVRUT19EQ0hFQ0soeCkgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkoISh4KSkpIHsgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgUEVSRkVUVE9fUExPRygiJXMiLCAiUEVSRkVUVE9fQ0hFQ0so
IiAjeCAiKSIpOyBcCisgICAgICBQRVJGRVRUT19JTU1FRElBVEVfQ1JBU0goKTsgICAgICAgICAg
ICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBFUkZFVFRPX0NIRUNLKHgpIFBF
UkZFVFRPX0RDSEVDSyh4KQorCisjZGVmaW5lIFBFUkZFVFRPX0RGQVRBTChmbXQsIC4uLikgICAg
ICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUEVSRkVU
VE9fUExPRyhmbXQsICMjX19WQV9BUkdTX18pOyBcCisgICAgUEVSRkVUVE9fSU1NRURJQVRFX0NS
QVNIKCk7ICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUEVSRkVUVE9fREZBVEFM
X09SX0VMT0coLi4uKSBQRVJGRVRUT19ERkFUQUwoX19WQV9BUkdTX18pCisKKyNlbHNlICAvLyBQ
RVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorCisjZGVmaW5lIFBFUkZFVFRPX0RDSEVDSyh4KSBcCisg
IGRvIHsgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlICYmICh4KSkKKwor
I2RlZmluZSBQRVJGRVRUT19DSEVDSyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
IGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkoISh4KSkpIHsgICAgICAgICAgICAgICAgICAgXAorICAg
ICAgUEVSRkVUVE9fUExPRygiJXMiLCAiUEVSRkVUVE9fQ0hFQ0soIiAjeCAiKSIpOyBcCisgICAg
ICBQRVJGRVRUT19JTU1FRElBVEVfQ1JBU0goKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdo
aWxlICgwKQorCisjZGVmaW5lIFBFUkZFVFRPX0RGQVRBTCguLi4pIDo6cGVyZmV0dG86OmJhc2U6
Omlnbm9yZV9yZXN1bHQoX19WQV9BUkdTX18pCisjZGVmaW5lIFBFUkZFVFRPX0RGQVRBTF9PUl9F
TE9HKC4uLikgUEVSRkVUVE9fRUxPRyhfX1ZBX0FSR1NfXykKKworI2VuZGlmICAvLyBQRVJGRVRU
T19EQ0hFQ0tfSVNfT04oKQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNl
IHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19CQVNFX0xPR0dJTkdfSF8K
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vcHJvdG96
ZXJvL2NvbnRpZ3VvdXNfbWVtb3J5X3JhbmdlLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRo
ZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1h
eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl
LgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAg
ICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxl
c3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNv
ZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBv
biBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMg
T0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vu
c2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisg
KiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVf
UEVSRkVUVE9fUFJPVE9aRVJPX0NPTlRJR1VPVVNfTUVNT1JZX1JBTkdFX0hfCisjZGVmaW5lIElO
Q0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX0NPTlRJR1VPVVNfTUVNT1JZX1JBTkdFX0hfCisKKyNp
bmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQu
aD4KKworbmFtZXNwYWNlIHByb3RvemVybyB7CisKKy8vIEtlZXAgdGhpcyBzdHJ1Y3QgdHJpdmlh
bGx5IGNvbnN0cnVjdGlibGUgKG5vIGN0b3JzLCBubyBkZWZhdWx0IGluaXRpYWxpemVycykuCitz
dHJ1Y3QgQ29udGlndW91c01lbW9yeVJhbmdlIHsKKyAgdWludDhfdCogYmVnaW47CisgIHVpbnQ4
X3QqIGVuZDsgIC8vIFNUTCBzdHlsZTogb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZm
ZXIuCisKKyAgaW5saW5lIGJvb2wgaXNfdmFsaWQoKSBjb25zdCB7IHJldHVybiBiZWdpbiAhPSBu
dWxscHRyOyB9CisgIGlubGluZSB2b2lkIHJlc2V0KCkgeyBiZWdpbiA9IG51bGxwdHI7IH0KKyAg
aW5saW5lIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pihl
bmQgLSBiZWdpbik7IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlm
ICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19DT05USUdVT1VTX01FTU9SWV9SQU5HRV9I
XworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fdXRpbHMuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19Q
Uk9UT1pFUk9fUFJPVE9fVVRJTFNfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pF
Uk9fUFJPVE9fVVRJTFNfSF8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3Rk
ZGVmLmg+CisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBw
cm90b3plcm8geworbmFtZXNwYWNlIHByb3RvX3V0aWxzIHsKKworLy8gU2VlIGh0dHBzOi8vZGV2
ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZyB3aXJlIHR5
cGVzLgorLy8gVGhpcyBpcyBhIHR5cGUgZW5jb2RlZCBpbnRvIHRoZSBwcm90byB0aGF0IHByb3Zp
ZGVzIGp1c3QgZW5vdWdoIGluZm8gdG8KKy8vIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgZm9sbG93
aW5nIHZhbHVlLgorZW51bSBjbGFzcyBQcm90b1dpcmVUeXBlIDogdWludDMyX3QgeworICBrVmFy
SW50ID0gMCwKKyAga0ZpeGVkNjQgPSAxLAorICBrTGVuZ3RoRGVsaW1pdGVkID0gMiwKKyAga0Zp
eGVkMzIgPSA1LAorfTsKKworLy8gVGhpcyBpcyB0aGUgdHlwZSBkZWZpbmVkIGluIHRoZSBwcm90
byBmb3IgZWFjaCBmaWVsZC4gVGhpcyBpbmZvcm1hdGlvbgorLy8gaXMgdXNlZCB0byBkZWNpZGUg
dGhlIHRyYW5zbGF0aW9uIHN0cmF0ZWd5IHdoZW4gd3JpdGluZyB0aGUgdHJhY2UuCitlbnVtIGNs
YXNzIFByb3RvU2NoZW1hVHlwZSB7CisgIGtVbmtub3duID0gMCwKKyAga0RvdWJsZSwKKyAga0Zs
b2F0LAorICBrSW50NjQsCisgIGtVaW50NjQsCisgIGtJbnQzMiwKKyAga0ZpeGVkNjQsCisgIGtG
aXhlZDMyLAorICBrQm9vbCwKKyAga1N0cmluZywKKyAga0dyb3VwLCAgLy8gRGVwcmVjYXRlZCAo
cHJvdG8yIG9ubHkpCisgIGtNZXNzYWdlLAorICBrQnl0ZXMsCisgIGtVaW50MzIsCisgIGtFbnVt
LAorICBrU2ZpeGVkMzIsCisgIGtTZml4ZWQ2NCwKKyAga1NpbnQzMiwKKyAga1NpbnQ2NCwKK307
CisKK2lubGluZSBjb25zdCBjaGFyKiBQcm90b1NjaGVtYVRvU3RyaW5nKFByb3RvU2NoZW1hVHlw
ZSB2KSB7CisgIHN3aXRjaCAodikgeworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprVW5rbm93
bjoKKyAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtE
b3VibGU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6
OmtGbG9hdDoKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBl
OjprSW50NjQ6CisgICAgICByZXR1cm4gImludDY0IjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlw
ZTo6a1VpbnQ2NDoKKyAgICAgIHJldHVybiAidWludDY0IjsKKyAgICBjYXNlIFByb3RvU2NoZW1h
VHlwZTo6a0ludDMyOgorICAgICAgcmV0dXJuICJpbnQzMiI7CisgICAgY2FzZSBQcm90b1NjaGVt
YVR5cGU6OmtGaXhlZDY0OgorICAgICAgcmV0dXJuICJmaXhlZDY0IjsKKyAgICBjYXNlIFByb3Rv
U2NoZW1hVHlwZTo6a0ZpeGVkMzI6CisgICAgICByZXR1cm4gImZpeGVkMzIiOworICAgIGNhc2Ug
UHJvdG9TY2hlbWFUeXBlOjprQm9vbDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSBQ
cm90b1NjaGVtYVR5cGU6OmtTdHJpbmc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgY2Fz
ZSBQcm90b1NjaGVtYVR5cGU6OmtHcm91cDoKKyAgICAgIHJldHVybiAiZ3JvdXAiOworICAgIGNh
c2UgUHJvdG9TY2hlbWFUeXBlOjprTWVzc2FnZToKKyAgICAgIHJldHVybiAibWVzc2FnZSI7Cisg
ICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtCeXRlczoKKyAgICAgIHJldHVybiAiYnl0ZXMiOwor
ICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprVWludDMyOgorICAgICAgcmV0dXJuICJ1aW50MzIi
OworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprRW51bToKKyAgICAgIHJldHVybiAiZW51bSI7
CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtTZml4ZWQzMjoKKyAgICAgIHJldHVybiAic2Zp
eGVkMzIiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprU2ZpeGVkNjQ6CisgICAgICByZXR1
cm4gInNmaXhlZDY0IjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlwZTo6a1NpbnQzMjoKKyAgICAg
IHJldHVybiAic2ludDMyIjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlwZTo6a1NpbnQ2NDoKKyAg
ICAgIHJldHVybiAic2ludDY0IjsKKyAgfQorICAvLyBGb3IgZ2NjOgorICBQRVJGRVRUT19EQ0hF
Q0soZmFsc2UpOworICByZXR1cm4gIiI7Cit9CisKKy8vIE1heGltdW0gbWVzc2FnZSBzaXplIHN1
cHBvcnRlZDogMjU2IE1pQiAoNCB4IDctYml0IGR1ZSB0byB2YXJpbnQgZW5jb2RpbmcpLgorY29u
c3RleHByIHNpemVfdCBrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZSA9IDQ7Citjb25zdGV4cHIgc2l6
ZV90IGtNYXhNZXNzYWdlTGVuZ3RoID0gKDF1IDw8IChrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZSAq
IDcpKSAtIDE7CisKKy8vIEZpZWxkIHRhZyBpcyBlbmNvZGVkIGFzIDMyLWJpdCB2YXJpbnQgKDUg
Ynl0ZXMgYXQgbW9zdCkuCisvLyBMYXJnZXN0IHZhbHVlIG9mIHNpbXBsZSAobm90IGxlbmd0aC1k
ZWxpbWl0ZWQpIGZpZWxkIGlzIDY0LWJpdCB2YXJpbnQKKy8vICgxMCBieXRlcyBhdCBtb3N0KS4g
MTUgYnl0ZXMgYnVmZmVyIGlzIGVub3VnaCB0byBzdG9yZSBhIHNpbXBsZSBmaWVsZC4KK2NvbnN0
ZXhwciBzaXplX3Qga01heFRhZ0VuY29kZWRTaXplID0gNTsKK2NvbnN0ZXhwciBzaXplX3Qga01h
eFNpbXBsZUZpZWxkRW5jb2RlZFNpemUgPSBrTWF4VGFnRW5jb2RlZFNpemUgKyAxMDsKKworLy8g
UHJvdG8gdHlwZXM6IChpbnR8dWludHxzaW50KSgzMnw2NCksIGJvb2wsIGVudW0uCitjb25zdGV4
cHIgdWludDMyX3QgTWFrZVRhZ1ZhckludCh1aW50MzJfdCBmaWVsZF9pZCkgeworICByZXR1cm4g
KGZpZWxkX2lkIDw8IDMpIHwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFByb3RvV2lyZVR5cGU6OmtW
YXJJbnQpOworfQorCisvLyBQcm90byB0eXBlczogZml4ZWQ2NCwgc2ZpeGVkNjQsIGZpeGVkMzIs
IHNmaXhlZDMyLCBkb3VibGUsIGZsb2F0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdGV4
cHIgdWludDMyX3QgTWFrZVRhZ0ZpeGVkKHVpbnQzMl90IGZpZWxkX2lkKSB7CisgIHN0YXRpY19h
c3NlcnQoc2l6ZW9mKFQpID09IDggfHwgc2l6ZW9mKFQpID09IDQsICJWYWx1ZSBtdXN0IGJlIDQg
b3IgOCBieXRlcyIpOworICByZXR1cm4gKGZpZWxkX2lkIDw8IDMpIHwKKyAgICAgICAgIHN0YXRp
Y19jYXN0PHVpbnQzMl90Pigoc2l6ZW9mKFQpID09IDggPyBQcm90b1dpcmVUeXBlOjprRml4ZWQ2
NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFByb3Rv
V2lyZVR5cGU6OmtGaXhlZDMyKSk7Cit9CisKKy8vIFByb3RvIHR5cGVzOiBzdHJpbmcsIGJ5dGVz
LCBlbWJlZGRlZCBtZXNzYWdlcy4KK2NvbnN0ZXhwciB1aW50MzJfdCBNYWtlVGFnTGVuZ3RoRGVs
aW1pdGVkKHVpbnQzMl90IGZpZWxkX2lkKSB7CisgIHJldHVybiAoZmllbGRfaWQgPDwgMykgfAor
ICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFByb3RvV2lyZVR5cGU6OmtMZW5ndGhEZWxp
bWl0ZWQpOworfQorCisvLyBQcm90byB0eXBlczogc2ludDY0LCBzaW50MzIuCit0ZW1wbGF0ZSA8
dHlwZW5hbWUgVD4KK2lubGluZSB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8VD46OnR5cGUg
WmlnWmFnRW5jb2RlKFQgdmFsdWUpIHsKKyAgdXNpbmcgVW5zaWduZWRUeXBlID0gdHlwZW5hbWUg
c3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlOworCisgIC8vIFJpZ2h0LXNoaWZ0IG9mIG5lZ2F0
aXZlIHZhbHVlcyBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKyAgLy8gQXNzZXJ0IHRoZSBp
bXBsZW1lbnRhdGlvbiBkb2VzIHdoYXQgd2UgZXhwZWN0LCB3aGljaCBpcyB0aGF0IHNoaWZ0aW5n
IGFueQorICAvLyBwb3NpdGl2ZSB2YWx1ZSBieSBzaXplb2YoVCkgKiA4IC0gMSBnaXZlcyBhbiBh
bGwgMCBiaXRtYXAsIGFuZCBhIG5lZ2F0aXZlCisgIC8vIHZhbHVlIGdpdmVzIGFuZCBhbGwgMSBi
aXRtYXAuCisgIGNvbnN0ZXhwciB1aW50NjRfdCBrVW5zaWduZWRaZXJvID0gMHU7CisgIGNvbnN0
ZXhwciBpbnQ2NF90IGtOZWdhdGl2ZU9uZSA9IC0xOworICBjb25zdGV4cHIgaW50NjRfdCBrUG9z
aXRpdmVPbmUgPSAxOworICBzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PHVpbnQ2NF90PihrTmVn
YXRpdmVPbmUgPj4gNjMpID09IH5rVW5zaWduZWRaZXJvLAorICAgICAgICAgICAgICAgICJpbXBs
ZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFzc3VtZWQgcmlnaHRzaGlmdCIpOworICBzdGF0
aWNfYXNzZXJ0KHN0YXRpY19jYXN0PHVpbnQ2NF90PihrUG9zaXRpdmVPbmUgPj4gNjMpID09IGtV
bnNpZ25lZFplcm8sCisgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1
cHBvcnQgYXNzdW1lZCByaWdodHNoaWZ0Iik7CisKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDxVbnNp
Z25lZFR5cGU+KHZhbHVlKSA8PCAxKSBeCisgICAgICAgICBzdGF0aWNfY2FzdDxVbnNpZ25lZFR5
cGU+KHZhbHVlID4+IChzaXplb2YoVCkgKiA4IC0gMSkpOworfQorCisvLyBQcm90byB0eXBlczog
c2ludDY0LCBzaW50MzIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB0eXBlbmFtZSBz
dGQ6Om1ha2Vfc2lnbmVkPFQ+Ojp0eXBlIFppZ1phZ0RlY29kZShUIHZhbHVlKSB7CisgIHVzaW5n
IFVuc2lnbmVkVHlwZSA9IHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZTsKKyAg
YXV0byB1X3ZhbHVlID0gc3RhdGljX2Nhc3Q8VW5zaWduZWRUeXBlPih2YWx1ZSk7CisgIHJldHVy
biBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6Om1ha2Vfc2lnbmVkPFQ+Ojp0eXBlPigKKyAgICAg
ICgodV92YWx1ZSA+PiAxKSBeIC0odV92YWx1ZSAmIDEpKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBl
bmFtZSBUPgoraW5saW5lIHVpbnQ4X3QqIFdyaXRlVmFySW50KFQgdmFsdWUsIHVpbnQ4X3QqIHRh
cmdldCkgeworICAvLyBJZiB2YWx1ZSBpcyA8PSAwIHdlIG11c3QgZmlyc3Qgc2lnbiBleHRlbmQg
dG8gaW50NjRfdCAoc2VlIFsxXSkuCisgIC8vIEZpbmFsbHkgd2UgYWx3YXlzIGNhc3QgdG8gYW4g
dW5zaWduZWQgdmFsdWUgdG8gdG8gYXZvaWQgYXJpdGhtZXRpYworICAvLyAoc2lnbiBleHBhbmRp
bmcpIHNoaWZ0cyBpbiB0aGUgd2hpbGUgbG9vcC4KKyAgLy8gWzFdOiAiSWYgeW91IHVzZSBpbnQz
MiBvciBpbnQ2NCBhcyB0aGUgdHlwZSBmb3IgYSBuZWdhdGl2ZSBudW1iZXIsIHRoZQorICAvLyBy
ZXN1bHRpbmcgdmFyaW50IGlzIGFsd2F5cyB0ZW4gYnl0ZXMgbG9uZyIuCisgIC8vIC0gZGV2ZWxv
cGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZworICAvLyBTbyBm
b3IgZWFjaCBpbnB1dCB0eXBlIHdlIGRvIHRoZSBmb2xsb3dpbmcgY2FzdHM6CisgIC8vIHVpbnRY
X3QgLT4gdWludFhfdCAtPiB1aW50WF90CisgIC8vIGludDhfdCAgLT4gaW50NjRfdCAtPiB1aW50
NjRfdAorICAvLyBpbnQxNl90IC0+IGludDY0X3QgLT4gdWludDY0X3QKKyAgLy8gaW50MzJfdCAt
PiBpbnQ2NF90IC0+IHVpbnQ2NF90CisgIC8vIGludDY0X3QgLT4gaW50NjRfdCAtPiB1aW50NjRf
dAorICB1c2luZyBNYXliZUV4dGVuZGVkVHlwZSA9CisgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRp
dGlvbmFsPHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLCBULCBpbnQ2NF90Pjo6dHlwZTsKKyAg
dXNpbmcgVW5zaWduZWRUeXBlID0gdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPE1heWJlRXh0
ZW5kZWRUeXBlPjo6dHlwZTsKKworICBNYXliZUV4dGVuZGVkVHlwZSBleHRlbmRlZF92YWx1ZSA9
IHN0YXRpY19jYXN0PE1heWJlRXh0ZW5kZWRUeXBlPih2YWx1ZSk7CisgIFVuc2lnbmVkVHlwZSB1
bnNpZ25lZF92YWx1ZSA9IHN0YXRpY19jYXN0PFVuc2lnbmVkVHlwZT4oZXh0ZW5kZWRfdmFsdWUp
OworCisgIHdoaWxlICh1bnNpZ25lZF92YWx1ZSA+PSAweDgwKSB7CisgICAgKnRhcmdldCsrID0g
c3RhdGljX2Nhc3Q8dWludDhfdD4odW5zaWduZWRfdmFsdWUpIHwgMHg4MDsKKyAgICB1bnNpZ25l
ZF92YWx1ZSA+Pj0gNzsKKyAgfQorICAqdGFyZ2V0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odW5z
aWduZWRfdmFsdWUpOworICByZXR1cm4gdGFyZ2V0ICsgMTsKK30KKworLy8gV3JpdGVzIGEgZml4
ZWQtc2l6ZSByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHx2YWx1ZXwuIFRoaXMgaXMK
Ky8vIHVzZWQgdG8gYmFja2ZpbGwgZml4ZWQtc2l6ZSByZXNlcnZhdGlvbnMgZm9yIHRoZSBsZW5n
dGggZmllbGQgdXNpbmcgYQorLy8gbm9uLWNhbm9uaWNhbCB2YXJpbnQgZW5jb2RpbmcgKGUuZy4g
XHg4MVx4ODBceDgwXHgwMCBpbnN0ZWFkIG9mIFx4MDEpLgorLy8gU2VlIGh0dHBzOi8vZ2l0aHVi
LmNvbS9nb29nbGUvcHJvdG9idWYvaXNzdWVzLzE1MzAuCisvLyBJbiBwYXJ0aWN1bGFyLCB0aGlz
IGlzIHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlcy4gVGhlIHNpemUgb2YgYSBuZXN0ZWQgbWVzc2Fn
ZQorLy8gaXMgbm90IGtub3duIHVudGlsIGFsbCBpdHMgZmllbGQgaGF2ZSBiZWVuIHdyaXR0ZW4u
IHxrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZXwKKy8vIGJ5dGVzIGFyZSByZXNlcnZlZCB0byBlbmNv
ZGUgdGhlIHNpemUgZmllbGQgYW5kIGJhY2tmaWxsZWQgYXQgdGhlIGVuZC4KK2lubGluZSB2b2lk
IFdyaXRlUmVkdW5kYW50VmFySW50KHVpbnQzMl90IHZhbHVlLCB1aW50OF90KiBidWYpIHsKKyAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZTsgKytpKSB7Cisg
ICAgY29uc3QgdWludDhfdCBtc2IgPSAoaSA8IGtNZXNzYWdlTGVuZ3RoRmllbGRTaXplIC0gMSkg
PyAweDgwIDogMDsKKyAgICBidWZbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YWx1ZSkgfCBt
c2I7CisgICAgdmFsdWUgPj49IDc7CisgIH0KK30KKwordGVtcGxhdGUgPHVpbnQzMl90IGZpZWxk
X2lkPgordm9pZCBTdGF0aWNBc3NlcnRTaW5nbGVCeXRlUHJlYW1ibGUoKSB7CisgIHN0YXRpY19h
c3NlcnQoZmllbGRfaWQgPCAxNiwKKyAgICAgICAgICAgICAgICAiUHJvdG8gZmllbGQgaWQgdG9v
IGJpZyB0byBmaXQgaW4gYSBzaW5nbGUgYnl0ZSBwcmVhbWJsZSIpOworfQorCisvLyBQYXJzZXMg
YSBWYXJJbnQgZnJvbSB0aGUgZW5jb2RlZCBidWZmZXIgW3N0YXJ0LCBlbmQpLiB8ZW5kfCBpcyBT
VEwtc3R5bGUgYW5kCisvLyBwb2ludHMgb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIGJ1ZmZlci4K
Ky8vIFRoZSBwYXJzZWQgaW50IHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgb3V0cHV0IGFyZyB8dmFs
dWV8LiBSZXR1cm5zIGEgcG9pbnRlcgorLy8gdG8gdGhlIG5leHQgdW5jb25zdW1lZCBieXRlIChz
byBzdGFydCA8IHJldHZhbCA8PSBlbmQpIG9yIHxzdGFydHwgaWYgdGhlCisvLyBWYXJJbnQgY291
bGQgbm90IGJlIGZ1bGx5IHBhcnNlZCBiZWNhdXNlIHRoZXJlIHdhcyBub3QgZW5vdWdoIHNwYWNl
IGluIHRoZQorLy8gYnVmZmVyLgoraW5saW5lIGNvbnN0IHVpbnQ4X3QqIFBhcnNlVmFySW50KGNv
bnN0IHVpbnQ4X3QqIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IHVpbnQ4X3QqIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50
NjRfdCogb3V0X3ZhbHVlKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHBvcyA9IHN0YXJ0OworICB1aW50
NjRfdCB2YWx1ZSA9IDA7CisgIGZvciAodWludDMyX3Qgc2hpZnQgPSAwOyBwb3MgPCBlbmQgJiYg
c2hpZnQgPCA2NHU7IHNoaWZ0ICs9IDcpIHsKKyAgICAvLyBDYWNoZSAqcG9zIGludG8gfGN1cl9i
eXRlfCB0byBwcmV2ZW50IHRoYXQgdGhlIGNvbXBpbGVyIGRlcmVmZXJlbmNlcyB0aGUKKyAgICAv
LyBwb2ludGVyIHR3aWNlIChoZXJlIGFuZCBpbiB0aGUgaWYoKSBiZWxvdykgZHVlIHRvIGNoYXIq
IGFsaWFzaW5nIHJ1bGVzLgorICAgIHVpbnQ4X3QgY3VyX2J5dGUgPSAqcG9zKys7CisgICAgdmFs
dWUgfD0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGN1cl9ieXRlICYgMHg3ZikgPDwgc2hpZnQ7Cisg
ICAgaWYgKChjdXJfYnl0ZSAmIDB4ODApID09IDApIHsKKyAgICAgIC8vIEluIHZhbGlkIGNhc2Vz
IHdlIGdldCBoZXJlLgorICAgICAgKm91dF92YWx1ZSA9IHZhbHVlOworICAgICAgcmV0dXJuIHBv
czsKKyAgICB9CisgIH0KKyAgKm91dF92YWx1ZSA9IDA7CisgIHJldHVybiBzdGFydDsKK30KKwor
fSAgLy8gbmFtZXNwYWNlIHByb3RvX3V0aWxzCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisK
KyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUFJPVE9fVVRJTFNfSF8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vcHJvdG96ZXJv
L3NjYXR0ZXJlZF9zdHJlYW1fd3JpdGVyLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhl
IEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBB
cGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBu
b3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgor
ICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBo
dHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3Mg
cmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3
YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBh
biAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0Yg
QU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2Ug
Zm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBs
aW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVS
RkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9TVFJFQU1fV1JJVEVSX0hfCisjZGVmaW5lIElOQ0xV
REVfUEVSRkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9TVFJFQU1fV1JJVEVSX0hfCisKKyNpbmNs
dWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4K
KyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vYmFzZS9jb21waWxlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb250aWd1b3VzX21lbW9y
eV9yYW5nZS5oIgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKKworLy8gVGhpcyBjbGFzcyBkZWFs
cyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvYmxlbTogYXBwZW5kLW9ubHkgcHJvdG8gbWVzc2FnZXMg
d2FudAorLy8gdG8gd3JpdGUgYSBzdHJlYW0gb2YgYnl0ZXMsIHdpdGhvdXQgY2FyaW5nIGFib3V0
IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKy8vIHVuZGVybHlpbmcgYnVmZmVyICh3aGljaCBj
b25jcmV0ZWx5IHdpbGwgYmUgZWl0aGVyIHRoZSB0cmFjZSByaW5nIGJ1ZmZlcgorLy8gb3IgYSBo
ZWFwLWFsbG9jYXRlZCBidWZmZXIpLiBUaGUgbWFpbiBkZWFsIGlzOiBwcm90byBtZXNzYWdlcyBk
b24ndCBrbm93IGluCisvLyBhZHZhbmNlIHdoYXQgdGhlaXIgc2l6ZSB3aWxsIGJlLgorLy8gRHVl
IHRvIHRoZSB0cmFjaW5nIGJ1ZmZlciBiZWluZyBzcGxpdCBpbnRvIGZpeGVkLXNpemUgY2h1bmtz
LCBvbiBzb21lCisvLyBvY2Nhc2lvbnMsIHRoZXNlIHdyaXRlcyBuZWVkIHRvIGJlIHNwcmVhZCBv
dmVyIHR3byAob3IgbW9yZSkgbm9uLWNvbnRpZ3VvdXMKKy8vIGNodW5rcyBvZiBtZW1vcnkuIFNp
bWlsYXJseSwgd2hlbiB0aGUgYnVmZmVyIGlzIGJhY2tlZCBieSB0aGUgaGVhcCwgd2Ugd2FudAor
Ly8gdG8gYXZvaWQgcmVhbGxvYygpIGNhbGxzLCBhcyB0aGV5IG1pZ2h0IGNhdXNlIGEgZnVsbCBj
b3B5IG9mIHRoZSBjb250ZW50cworLy8gb2YgdGhlIGJ1ZmZlci4KKy8vIFRoZSBwdXJwb3NlIG9m
IHRoaXMgY2xhc3MgaXMgdG8gYWJzdHJhY3QgYXdheSB0aGUgbm9uLWNvbnRpZ3VvdXMgd3JpdGUg
bG9naWMuCisvLyBUaGlzIGNsYXNzIGtub3dzIGhvdyB0byBkZWFsIHdpdGggd3JpdGVzIGFzIGxv
bmcgYXMgdGhleSBmYWxsIGluIHRoZSBzYW1lCisvLyBDb250aWd1b3VzTWVtb3J5UmFuZ2UgYW5k
IGRlZmVycyB0aGUgY2h1bmstY2hhaW5pbmcgbG9naWMgdG8gdGhlIERlbGVnYXRlLgorY2xhc3Mg
UEVSRkVUVE9fRVhQT1JUIFNjYXR0ZXJlZFN0cmVhbVdyaXRlciB7CisgcHVibGljOgorICBjbGFz
cyBQRVJGRVRUT19FWFBPUlQgRGVsZWdhdGUgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkRl
bGVnYXRlKCk7CisgICAgdmlydHVhbCBDb250aWd1b3VzTWVtb3J5UmFuZ2UgR2V0TmV3QnVmZmVy
KCkgPSAwOworICB9OworCisgIGV4cGxpY2l0IFNjYXR0ZXJlZFN0cmVhbVdyaXRlcihEZWxlZ2F0
ZSogZGVsZWdhdGUpOworICB+U2NhdHRlcmVkU3RyZWFtV3JpdGVyKCk7CisKKyAgaW5saW5lIHZv
aWQgV3JpdGVCeXRlKHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBpZiAod3JpdGVfcHRyXyA+PSBjdXJf
cmFuZ2VfLmVuZCkKKyAgICAgIEV4dGVuZCgpOworICAgICp3cml0ZV9wdHJfKysgPSB2YWx1ZTsK
KyAgfQorCisgIC8vIEFzc3VtZXMgdGhhdCB0aGUgY2FsbGVyIGNoZWNrZWQgdGhhdCB0aGVyZSBp
cyBlbm91Z2ggaGVhZHJvb20uCisgIC8vIFRPRE8ocHJpbWlhbm8pOiBwZXJmIG9wdGltaXphdGlv
biwgdGhpcyBpcyBhIHRyYWNpbmcgaG90IHBhdGguIFRoZQorICAvLyBjb21waWxlciBjYW4gbWFr
ZSBzdHJvbmcgb3B0aW1pemF0aW9uIG9uIG1lbWNweSBpZiB0aGUgc2l6ZSBhcmcgaXMgYQorICAv
LyBjb25zdGV4cHIuIE1ha2UgYSB0ZW1wbGF0ZWQgdmFyaWFudCBvZiB0aGlzIGZvciBmaXhlZC1z
aXplIHdyaXRlcy4KKyAgLy8gVE9ETyhwcmltaWFubyk6IHJlc3RyaWN0IC8gbm9hbGlhcyBtaWdo
dCBhbHNvIGhlbHAuCisgIGlubGluZSB2b2lkIFdyaXRlQnl0ZXNVbnNhZmUoY29uc3QgdWludDhf
dCogc3JjLCBzaXplX3Qgc2l6ZSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IGVuZCA9IHdyaXRlX3B0
cl8gKyBzaXplOworICAgIGFzc2VydChlbmQgPD0gY3VyX3JhbmdlXy5lbmQpOworICAgIG1lbWNw
eSh3cml0ZV9wdHJfLCBzcmMsIHNpemUpOworICAgIHdyaXRlX3B0cl8gPSBlbmQ7CisgIH0KKwor
ICBpbmxpbmUgdm9pZCBXcml0ZUJ5dGVzKGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNpemUp
IHsKKyAgICB1aW50OF90KiBjb25zdCBlbmQgPSB3cml0ZV9wdHJfICsgc2l6ZTsKKyAgICBpZiAo
UEVSRkVUVE9fTElLRUxZKGVuZCA8PSBjdXJfcmFuZ2VfLmVuZCkpCisgICAgICByZXR1cm4gV3Jp
dGVCeXRlc1Vuc2FmZShzcmMsIHNpemUpOworICAgIFdyaXRlQnl0ZXNTbG93UGF0aChzcmMsIHNp
emUpOworICB9CisKKyAgdm9pZCBXcml0ZUJ5dGVzU2xvd1BhdGgoY29uc3QgdWludDhfdCogc3Jj
LCBzaXplX3Qgc2l6ZSk7CisKKyAgLy8gUmVzZXJ2ZXMgYSBmaXhlZCBhbW91bnQgb2YgYnl0ZXMg
dG8gYmUgYmFja2ZpbGxlZCBsYXRlci4gVGhlIHJlc2VydmVkIHJhbmdlCisgIC8vIGlzIGd1YXJh
bnRlZWQgdG8gYmUgY29udGlndW91cyBhbmQgbm90IHNwYW4gYWNyb3NzIGNodW5rcy4gfHNpemV8
IGhhcyB0byBiZQorICAvLyA8PSB0aGFuIHRoZSBzaXplIG9mIGEgbmV3IGJ1ZmZlciByZXR1cm5l
ZCBieSB0aGUgRGVsZWdhdGU6OkdldE5ld0J1ZmZlcigpLgorICB1aW50OF90KiBSZXNlcnZlQnl0
ZXMoc2l6ZV90IHNpemUpOworCisgIC8vIEZhc3QgKGJ1dCB1bnNhZmUpIHZlcnNpb24gb2YgdGhl
IGFib3ZlLiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBwcmV2aW91c2x5CisgIC8vIGNoZWNrZWQgdGhh
dCB0aGVyZSBhcmUgYXQgbGVhc3QgfHNpemV8IGNvbnRpZ3VvdXMgYnl0ZXMgYXZhaWxhYmxlLgor
ICAvLyBSZXR1cm5zIG9ubHkgdGhlIHN0YXJ0IHBvaW50ZXIgb2YgdGhlIHJlc2VydmF0aW9uLgor
ICB1aW50OF90KiBSZXNlcnZlQnl0ZXNVbnNhZmUoc2l6ZV90IHNpemUpIHsKKyAgICB1aW50OF90
KiBiZWdpbiA9IHdyaXRlX3B0cl87CisgICAgd3JpdGVfcHRyXyArPSBzaXplOworICAgIGFzc2Vy
dCh3cml0ZV9wdHJfIDw9IGN1cl9yYW5nZV8uZW5kKTsKKyAgICByZXR1cm4gYmVnaW47CisgIH0K
KworICAvLyBSZXNldHMgdGhlIGJ1ZmZlciBib3VuZGFyaWVzIGFuZCB0aGUgd3JpdGUgcG9pbnRl
ciB0byB0aGUgZ2l2ZW4gfHJhbmdlfC4KKyAgLy8gU3Vic2VxdWVudCBXcml0ZUJ5dGUocykgd2ls
bCB3cml0ZSBpbnRvIHxyYW5nZXwuCisgIHZvaWQgUmVzZXQoQ29udGlndW91c01lbW9yeVJhbmdl
IHJhbmdlKTsKKworICAvLyBOdW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJ5dGVzIGluIHxjdXJf
cmFuZ2VffCB0aGF0IGNhbiBiZSB3cml0dGVuIHdpdGhvdXQKKyAgLy8gcmVxdWVzdGluZyBhIG5l
dyBidWZmZXIuCisgIHNpemVfdCBieXRlc19hdmFpbGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJu
IHN0YXRpY19jYXN0PHNpemVfdD4oY3VyX3JhbmdlXy5lbmQgLSB3cml0ZV9wdHJfKTsKKyAgfQor
CisgIHVpbnQ4X3QqIHdyaXRlX3B0cigpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX3B0cl87IH0KKwor
ICB1aW50NjRfdCB3cml0dGVuKCkgY29uc3QgeworICAgIHJldHVybiB3cml0dGVuX3ByZXZpb3Vz
bHlfICsKKyAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHdyaXRlX3B0cl8gLSBjdXJf
cmFuZ2VfLmJlZ2luKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU2NhdHRlcmVkU3RyZWFtV3JpdGVy
KGNvbnN0IFNjYXR0ZXJlZFN0cmVhbVdyaXRlciYpID0gZGVsZXRlOworICBTY2F0dGVyZWRTdHJl
YW1Xcml0ZXImIG9wZXJhdG9yPShjb25zdCBTY2F0dGVyZWRTdHJlYW1Xcml0ZXImKSA9IGRlbGV0
ZTsKKworICB2b2lkIEV4dGVuZCgpOworCisgIERlbGVnYXRlKiBjb25zdCBkZWxlZ2F0ZV87Cisg
IENvbnRpZ3VvdXNNZW1vcnlSYW5nZSBjdXJfcmFuZ2VfOworICB1aW50OF90KiB3cml0ZV9wdHJf
OworICB1aW50NjRfdCB3cml0dGVuX3ByZXZpb3VzbHlfID0gMDsKK307CisKK30gIC8vIG5hbWVz
cGFjZSBwcm90b3plcm8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19T
Q0FUVEVSRURfU1RSRUFNX1dSSVRFUl9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUg
QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFw
YWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5v
dCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisg
KiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0
dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBy
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
cmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFu
ICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBB
TlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBm
b3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxp
bWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJG
RVRUT19QUk9UT1pFUk9fTUVTU0FHRV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1BST1RP
WkVST19NRVNTQUdFX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpbnQu
aD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0
eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvbnRpZ3VvdXNfbWVtb3J5X3JhbmdlLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9zY2F0dGVyZWRfc3RyZWFtX3dyaXRlci5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHNobV9mdXp6IHsKK2NsYXNzIEZha2VQcm9kdWNlcjsK
K30gIC8vIG5hbWVzcGFjZSBzaG1fZnV6egorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKK25h
bWVzcGFjZSBwcm90b3plcm8geworCitjbGFzcyBNZXNzYWdlSGFuZGxlQmFzZTsKKworLy8gQmFz
ZSBjbGFzcyBleHRlbmRlZCBieSB0aGUgcHJvdG8gQysrIHN0dWJzIGdlbmVyYXRlZCBieSB0aGUg
UHJvdG9aZXJvCisvLyBjb21waWxlci4gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgbWluaW1hbCBy
dW50aW1lIHJlcXVpcmVkIHRvIHN1cHBvcnQKKy8vIGFwcGVuZC1vbmx5IG9wZXJhdGlvbnMgYW5k
IGlzIGRlc2lnbmVkIGZvciBwZXJmb3JtYW5jZS4gTm9uZSBvZiB0aGUgbWV0aG9kcworLy8gcmVx
dWlyZSBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KK2NsYXNzIFBFUkZFVFRPX0VYUE9S
VCBNZXNzYWdlIHsKKyBwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBNZXNzYWdlSGFuZGxlQmFzZTsK
KworICAvLyBBZGp1c3QgdGhlIHxuZXN0ZWRfbWVzc2FnZXNfYXJlbmFffCBzaXplIHdoZW4gY2hh
bmdpbmcgdGhpcywgb3IgdGhlCisgIC8vIHN0YXRpY19hc3NlcnQgaW4gdGhlIC5jYyBmaWxlIHdp
bGwgYmFyay4KKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4TmVzdGluZ0RlcHRoID0g
MTA7CisKKyAgLy8gQ3RvciBhbmQgRHRvciBvZiBNZXNzYWdlIGFyZSBuZXZlciBjYWxsZWQsIHdp
dGggdGhlIGV4ZWNlcHRpb24KKyAgLy8gb2Ygcm9vdCAobm9uLW5lc3RlZCkgbWVzc2FnZXMuIE5l
c3RlZCBtZXNzYWdlcyBhcmUgYWxsb2NhdGVkIHZpYSBwbGFjZW1lbnQKKyAgLy8gbmV3IGluIHRo
ZSB8bmVzdGVkX21lc3NhZ2VzX2FyZW5hX3wgYW5kIGltcGxpY3RseSBkZXN0cm95ZWQgd2hlbiB0
aGUgYXJlbmEKKyAgLy8gb2YgdGhlIHJvb3QgbWVzc2FnZSBnb2VzIGF3YXkuIFRoaXMgaXMgZmlu
ZSBhcyBsb25nIGFzIGFsbCB0aGUgZmllbGRzIGFyZQorICAvLyBQT0RzLCB3aGljaCBpcyBjaGVj
a2VkIGJ5IHRoZSBzdGF0aWNfYXNzZXJ0IGluIHRoZSBjdG9yIChzZWUgdGhlIFJlc2V0KCkKKyAg
Ly8gbWV0aG9kIGluIHRoZSAuY2MgZmlsZSkuCisgIE1lc3NhZ2UoKSA9IGRlZmF1bHQ7CisKKyAg
Ly8gQ2xlYXJzIHVwIHRoZSBzdGF0ZSwgYWxsb3dpbmcgdGhlIG1lc3NhZ2UgdG8gYmUgcmV1c2Vk
IGFzIGEgZnJlc2ggb25lLgorICB2b2lkIFJlc2V0KFNjYXR0ZXJlZFN0cmVhbVdyaXRlciopOwor
CisgIC8vIENvbW1pdHMgYWxsIHRoZSBjaGFuZ2VzIHRvIHRoZSBidWZmZXIgKGJhY2tmaWxscyB0
aGUgc2l6ZSBmaWVsZCBvZiB0aGlzIGFuZAorICAvLyBhbGwgbmVzdGVkIG1lc3NhZ2VzKSBhbmQg
c2VhbHMgdGhlIG1lc3NhZ2UuIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UKKyAgLy8g
KGFuZCBhbGwgbmVzdGVkIHN1Yi1tZXNzYWdlcyksIHdpdGhvdXQgdGFraW5nIGludG8gYWNjb3Vu
dCBhbnkgY2h1bmtpbmcuCisgIC8vIEZpbmFsaXplIGlzIGlkZW1wb3RlbnQgYW5kIGNhbiBiZSBj
YWxsZWQgc2V2ZXJhbCB0aW1lcyB3L28gc2lkZSBlZmZlY3RzLgorICB1aW50MzJfdCBGaW5hbGl6
ZSgpOworCisgIC8vIE9wdGlvbmFsLiBJZiBpc192YWxpZCgpID09IHRydWUsIHRoZSBjb3JyZXNw
b25kaW5nIG1lbW9yeSByZWdpb24gKGl0cworICAvLyBsZW5ndGggPT0gcHJvdG9fdXRpbHM6OmtN
ZXNzYWdlTGVuZ3RoRmllbGRTaXplKSBpcyBiYWNrZmlsbGVkIHdpdGggdGhlIHNpemUKKyAgLy8g
b2YgdGhpcyBtZXNzYWdlIChtaW51cyB8c2l6ZV9hbHJlYWR5X3dyaXR0ZW58IGJlbG93KS4gVGhp
cyBpcyB0aGUgbWVjaGFuaXNtCisgIC8vIHVzZWQgYnkgbWVzc2FnZXMgdG8gYmFja2ZpbGwgdGhl
aXIgY29ycmVzcG9uZGluZyBzaXplIGZpZWxkIGluIHRoZSBwYXJlbnQKKyAgLy8gbWVzc2FnZS4K
KyAgdWludDhfdCogc2l6ZV9maWVsZCgpIGNvbnN0IHsgcmV0dXJuIHNpemVfZmllbGRfOyB9Cisg
IHZvaWQgc2V0X3NpemVfZmllbGQodWludDhfdCogc2l6ZV9maWVsZCkgeyBzaXplX2ZpZWxkXyA9
IHNpemVfZmllbGQ7IH0KKworICAvLyBUaGlzIGlzIHRvIGRlYWwgd2l0aCBjYXNlIG9mIGJhY2tm
aWxsaW5nIHRoZSBzaXplIG9mIGEgcm9vdCAobm9uLW5lc3RlZCkKKyAgLy8gbWVzc2FnZSB3aGlj
aCBpcyBzcGxpdCBpbnRvIG11bHRpcGxlIGNodW5rcy4gVXBvbiBmaW5hbGl6YXRpb24gb25seSB0
aGUKKyAgLy8gcGFydGlhbCBzaXplIHRoYXQgbGllcyBpbiB0aGUgbGFzdCBjaHVuayBoYXMgdG8g
YmUgYmFja2ZpbGxlZC4KKyAgdm9pZCBpbmNfc2l6ZV9hbHJlYWR5X3dyaXR0ZW4odWludDMyX3Qg
c3opIHsgc2l6ZV9hbHJlYWR5X3dyaXR0ZW5fICs9IHN6OyB9CisKKyAgTWVzc2FnZSogbmVzdGVk
X21lc3NhZ2UoKSB7IHJldHVybiBuZXN0ZWRfbWVzc2FnZV87IH0KKworICBib29sIGlzX2ZpbmFs
aXplZCgpIGNvbnN0IHsgcmV0dXJuIGZpbmFsaXplZF87IH0KKworI2lmIFBFUkZFVFRPX0RDSEVD
S19JU19PTigpCisgIHZvaWQgc2V0X2hhbmRsZShNZXNzYWdlSGFuZGxlQmFzZSogaGFuZGxlKSB7
IGhhbmRsZV8gPSBoYW5kbGU7IH0KKyNlbmRpZgorCisgIC8vIFByb3RvIHR5cGVzOiB1aW50NjQs
IHVpbnQzMiwgaW50NjQsIGludDMyLCBib29sLCBlbnVtLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VD4KKyAgdm9pZCBBcHBlbmRWYXJJbnQodWludDMyX3QgZmllbGRfaWQsIFQgdmFsdWUpIHsKKyAg
ICBpZiAobmVzdGVkX21lc3NhZ2VfKQorICAgICAgRW5kTmVzdGVkTWVzc2FnZSgpOworCisgICAg
dWludDhfdCBidWZmZXJbcHJvdG9fdXRpbHM6OmtNYXhTaW1wbGVGaWVsZEVuY29kZWRTaXplXTsK
KyAgICB1aW50OF90KiBwb3MgPSBidWZmZXI7CisKKyAgICBwb3MgPSBwcm90b191dGlsczo6V3Jp
dGVWYXJJbnQocHJvdG9fdXRpbHM6Ok1ha2VUYWdWYXJJbnQoZmllbGRfaWQpLCBwb3MpOworICAg
IC8vIFdyaXRlVmFySW50IGVuY29kZXMgc2lnbmVkIHZhbHVlcyBpbiB0d28ncyBjb21wbGVtZW50
IGZvcm0uCisgICAgcG9zID0gcHJvdG9fdXRpbHM6OldyaXRlVmFySW50KHZhbHVlLCBwb3MpOwor
ICAgIFdyaXRlVG9TdHJlYW0oYnVmZmVyLCBwb3MpOworICB9CisKKyAgLy8gUHJvdG8gdHlwZXM6
IHNpbnQ2NCwgc2ludDMyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBBcHBlbmRT
aWduZWRWYXJJbnQodWludDMyX3QgZmllbGRfaWQsIFQgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoZmllbGRfaWQsIHByb3RvX3V0aWxzOjpaaWdaYWdFbmNvZGUodmFsdWUpKTsKKyAgfQorCisg
IC8vIFByb3RvIHR5cGVzOiBib29sLCBlbnVtIChzbWFsbCkuCisgIC8vIEZhc3RlciB2ZXJzaW9u
IG9mIEFwcGVuZFZhckludCBmb3IgdGlueSBudW1iZXJzLgorICB2b2lkIEFwcGVuZFRpbnlWYXJJ
bnQodWludDMyX3QgZmllbGRfaWQsIGludDMyX3QgdmFsdWUpIHsKKyAgICBQRVJGRVRUT19EQ0hF
Q0soMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDB4ODApOworICAgIGlmIChuZXN0ZWRfbWVzc2FnZV8p
CisgICAgICBFbmROZXN0ZWRNZXNzYWdlKCk7CisKKyAgICB1aW50OF90IGJ1ZmZlcltwcm90b191
dGlsczo6a01heFNpbXBsZUZpZWxkRW5jb2RlZFNpemVdOworICAgIHVpbnQ4X3QqIHBvcyA9IGJ1
ZmZlcjsKKyAgICAvLyBNYWtlVGFnVmFySW50IGdldHMgc3VwZXIgb3B0aW1pemVkIGhlcmUgZm9y
IGNvbnN0ZXhwci4KKyAgICBwb3MgPSBwcm90b191dGlsczo6V3JpdGVWYXJJbnQocHJvdG9fdXRp
bHM6Ok1ha2VUYWdWYXJJbnQoZmllbGRfaWQpLCBwb3MpOworICAgICpwb3MrKyA9IHN0YXRpY19j
YXN0PHVpbnQ4X3Q+KHZhbHVlKTsKKyAgICBXcml0ZVRvU3RyZWFtKGJ1ZmZlciwgcG9zKTsKKyAg
fQorCisgIC8vIFByb3RvIHR5cGVzOiBmaXhlZDY0LCBzZml4ZWQ2NCwgZml4ZWQzMiwgc2ZpeGVk
MzIsIGRvdWJsZSwgZmxvYXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIEFwcGVu
ZEZpeGVkKHVpbnQzMl90IGZpZWxkX2lkLCBUIHZhbHVlKSB7CisgICAgaWYgKG5lc3RlZF9tZXNz
YWdlXykKKyAgICAgIEVuZE5lc3RlZE1lc3NhZ2UoKTsKKworICAgIHVpbnQ4X3QgYnVmZmVyW3By
b3RvX3V0aWxzOjprTWF4U2ltcGxlRmllbGRFbmNvZGVkU2l6ZV07CisgICAgdWludDhfdCogcG9z
ID0gYnVmZmVyOworCisgICAgcG9zID0gcHJvdG9fdXRpbHM6OldyaXRlVmFySW50KHByb3RvX3V0
aWxzOjpNYWtlVGFnRml4ZWQ8VD4oZmllbGRfaWQpLCBwb3MpOworICAgIG1lbWNweShwb3MsICZ2
YWx1ZSwgc2l6ZW9mKFQpKTsKKyAgICBwb3MgKz0gc2l6ZW9mKFQpOworICAgIC8vIFRPRE86IE9w
dGltaXplIG1lbWNweSBwZXJmb3JtYW5jZSwgc2VlIGh0dHA6Ly9jcmJ1Zy5jb20vNjI0MzExIC4K
KyAgICBXcml0ZVRvU3RyZWFtKGJ1ZmZlciwgcG9zKTsKKyAgfQorCisgIHZvaWQgQXBwZW5kU3Ry
aW5nKHVpbnQzMl90IGZpZWxkX2lkLCBjb25zdCBjaGFyKiBzdHIpOworCisgIHZvaWQgQXBwZW5k
U3RyaW5nKHVpbnQzMl90IGZpZWxkX2lkLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAg
QXBwZW5kQnl0ZXMoZmllbGRfaWQsIHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOworICB9CisKKyAg
dm9pZCBBcHBlbmRCeXRlcyh1aW50MzJfdCBmaWVsZF9pZCwgY29uc3Qgdm9pZCogdmFsdWUsIHNp
emVfdCBzaXplKTsKKworICAvLyBBcHBlbmQgcmF3IGJ5dGVzIGZvciBhIGZpZWxkLCB1c2luZyB0
aGUgc3VwcGxpZWQgfHJhbmdlc3wgdG8KKyAgLy8gY29weSBmcm9tIHxudW1fcmFuZ2VzfCBpbmRp
dmlkdWFsIGJ1ZmZlcnMuCisgIHNpemVfdCBBcHBlbmRTY2F0dGVyZWRCeXRlcyh1aW50MzJfdCBm
aWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRpZ3VvdXNNZW1vcnlS
YW5nZSogcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9y
YW5nZXMpOworCisgIC8vIEJlZ2lucyBhIG5lc3RlZCBtZXNzYWdlLCB1c2luZyB0aGUgc3RhdGlj
IHN0b3JhZ2UgcHJvdmlkZWQgYnkgdGhlIHBhcmVudAorICAvLyBjbGFzcyAoc2VlIGNvbW1lbnQg
aW4gfG5lc3RlZF9tZXNzYWdlc19hcmVuYV98KS4gVGhlIG5lc3RlZCBtZXNzYWdlIGVuZHMKKyAg
Ly8gZWl0aGVyIHdoZW4gRmluYWxpemUoKSBpcyBjYWxsZWQgb3Igd2hlbiBhbnkgb3RoZXIgQXBw
ZW5kKiBtZXRob2QgaXMgY2FsbGVkCisgIC8vIGluIHRoZSBwYXJlbnQgY2xhc3MuCisgIC8vIFRo
ZSB0ZW1wbGF0ZSBhcmd1bWVudCBUIGlzIHN1cHBvc2VkIHRvIGJlIGEgc3R1YiBjbGFzcyBhdXRv
IGdlbmVyYXRlZCBmcm9tCisgIC8vIGEgLnByb3RvLCBoZW5jZSBhIHN1YmNsYXNzIG9mIE1lc3Nh
Z2UuCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBUKiBCZWdpbk5lc3RlZE1lc3NhZ2UodWludDMy
X3QgZmllbGRfaWQpIHsKKyAgICAvLyBUaGlzIGlzIHRvIHByZXZlbnQgc3ViY2xhc3NlcyAod2hp
Y2ggc2hvdWxkIGJlIGF1dG9nZW5lcmF0ZWQsIHRob3VnaCksIHRvCisgICAgLy8gaW50cm9kdWNl
IGV4dHJhIHN0YXRlIGZpZWxkcyAod2hpY2ggd291bGRuJ3QgYmUgaW5pdGlhbGl6ZWQgYnkgUmVz
ZXQoKSkuCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8TWVzc2FnZSwgVD46OnZh
bHVlLAorICAgICAgICAgICAgICAgICAgIlQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIE1lc3NhZ2Ui
KTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoTWVzc2FnZSksCisgICAg
ICAgICAgICAgICAgICAiTWVzc2FnZSBzdWJjbGFzc2VzIGNhbm5vdCBpbnRyb2R1Y2UgZXh0cmEg
c3RhdGUuIik7CisgICAgVCogbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KG5lc3RlZF9t
ZXNzYWdlc19hcmVuYV8pOworICAgIEJlZ2luTmVzdGVkTWVzc2FnZUludGVybmFsKGZpZWxkX2lk
LCBtZXNzYWdlKTsKKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorCisgIFNjYXR0ZXJlZFN0cmVh
bVdyaXRlciogc3RyZWFtX3dyaXRlcl9mb3JfdGVzdGluZygpIHsgcmV0dXJuIHN0cmVhbV93cml0
ZXJfOyB9CisKKyAgLy8gQXBwZW5kcyBzb21lIHJhdyBieXRlcyB0byB0aGUgbWVzc2FnZS4gVGhl
IHVzZS1jYXNlIGZvciB0aGlzIGlzIHByZXNlcnZpbmcKKyAgLy8gdW5rbm93biBmaWVsZHMgaW4g
dGhlIGRlY29kZSAtPiByZS1lbmNvZGUgcGF0aCBvZiB4eHguZ2VuLmNjIGNsYXNzZXMKKyAgLy8g
Z2VuZXJhdGVkIGJ5IHRoZSBjcHBnZW5fcGx1Z2luLmNjLgorICAvLyBUaGUgY2FsbGVyIG5lZWRz
IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBhcHBlbmRlZCBkYXRhIGlzIHByb3Blcmx5CisgIC8vIHBy
b3RvLWVuY29kZWQgYW5kIGVhY2ggZmllbGQgaGFzIGEgcHJvdG8gcHJlYW1ibGUuCisgIHZvaWQg
QXBwZW5kUmF3UHJvdG9CeXRlcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IGNvbnN0IHVpbnQ4X3QqIHNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRh
dGEpOworICAgIFdyaXRlVG9TdHJlYW0oc3JjLCBzcmMgKyBzaXplKTsKKyAgfQorCisgcHJpdmF0
ZToKKyAgTWVzc2FnZShjb25zdCBNZXNzYWdlJikgPSBkZWxldGU7CisgIE1lc3NhZ2UmIG9wZXJh
dG9yPShjb25zdCBNZXNzYWdlJikgPSBkZWxldGU7CisKKyAgdm9pZCBCZWdpbk5lc3RlZE1lc3Nh
Z2VJbnRlcm5hbCh1aW50MzJfdCBmaWVsZF9pZCwgTWVzc2FnZSopOworCisgIC8vIENhbGxlZCBi
eSBGaW5hbGl6ZSBhbmQgQXBwZW5kKiBtZXRob2RzLgorICB2b2lkIEVuZE5lc3RlZE1lc3NhZ2Uo
KTsKKworICB2b2lkIFdyaXRlVG9TdHJlYW0oY29uc3QgdWludDhfdCogc3JjX2JlZ2luLCBjb25z
dCB1aW50OF90KiBzcmNfZW5kKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKCFmaW5hbGl6ZWRfKTsK
KyAgICBQRVJGRVRUT19EQ0hFQ0soc3JjX2JlZ2luIDw9IHNyY19lbmQpOworICAgIGNvbnN0IHVp
bnQzMl90IHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3JjX2VuZCAtIHNyY19iZWdpbik7
CisgICAgc3RyZWFtX3dyaXRlcl8tPldyaXRlQnl0ZXMoc3JjX2JlZ2luLCBzaXplKTsKKyAgICBz
aXplXyArPSBzaXplOworICB9CisKKyAgLy8gT25seSBQT0QgZmllbGRzIGFyZSBhbGxvd2VkLiBU
aGlzIGNsYXNzJ3MgZHRvciBpcyBuZXZlciBjYWxsZWQuCisgIC8vIFNlZSB0aGUgY29tbWVudCBv
biB0aGUgc3RhdGljX2Fzc2VydCBpbiB0aGUgY29ycmVzcG9uZGluZyAuY2MgZmlsZS4KKworICAv
LyBUaGUgc3RyZWFtIHdyaXRlciBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIHNlcmlhbGl6YXRpb24u
CisgIFNjYXR0ZXJlZFN0cmVhbVdyaXRlciogc3RyZWFtX3dyaXRlcl87CisKKyAgdWludDhfdCog
c2l6ZV9maWVsZF87CisKKyAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHNpemUgb2YgdGhlIGN1cnJl
bnQgbWVzc2FnZS4KKyAgdWludDMyX3Qgc2l6ZV87CisKKyAgLy8gU2VlIGNvbW1lbnQgZm9yIGlu
Y19zaXplX2FscmVhZHlfd3JpdHRlbigpLgorICB1aW50MzJfdCBzaXplX2FscmVhZHlfd3JpdHRl
bl87CisKKyAgLy8gV2hlbiB0cnVlLCBubyBtb3JlIGNoYW5nZXMgdG8gdGhlIG1lc3NhZ2UgYXJl
IGFsbG93ZWQuIFRoaXMgaXMgdG8gRENIRUNLCisgIC8vIGF0dGVtcHRzIG9mIHdyaXRpbmcgdG8g
YSBtZXNzYWdlIHdoaWNoIGhhcyBiZWVuIEZpbmFsaXplKCktZC4KKyAgYm9vbCBmaW5hbGl6ZWRf
OworCisgIC8vIFVzZWQgdG8gZGV0ZWN0IGF0dGVtcHMgdG8gY3JlYXRlIG1lc3NhZ2VzIHdpdGgg
YSBuZXN0aW5nIGxldmVsID4KKyAgLy8ga01heE5lc3RpbmdEZXB0aC4gfG5lc3RpbmdfZGVwdGhf
fCA9PSAwIGZvciByb290IChub24tbmVzdGVkKSBtZXNzYWdlcy4KKyAgdWludDhfdCBuZXN0aW5n
X2RlcHRoXzsKKworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgIC8vIEN1cnJlbnQgZ2Vu
ZXJhdGlvbiBvZiBtZXNzYWdlLiBJbmNyZW1lbnRlZCBvbiBSZXNldC4KKyAgLy8gVXNlZCB0byBk
ZXRlY3Qgc3RhbGUgaGFuZGxlcy4KKyAgdWludDMyX3QgZ2VuZXJhdGlvbl87CisKKyAgTWVzc2Fn
ZUhhbmRsZUJhc2UqIGhhbmRsZV87CisjZW5kaWYKKworICAvLyBQb2ludGVyIHRvIHRoZSBsYXN0
IGNoaWxkIG1lc3NhZ2UgY3JlYXRlZCB0aHJvdWdoIEJlZ2luTmVzdGVkTWVzc2FnZSgpLCBpZgor
ICAvLyBhbnksIG51bGxwdHIgb3RoZXJ3aXNlLiBUaGVyZSBpcyBubyBuZWVkIHRvIGtlZXAgdHJh
Y2sgb2YgbW9yZSB0aGFuIG9uZQorICAvLyBtZXNzYWdlIHBlciBuZXN0aW5nIGxldmVsIGFzIHRo
ZSBwcm90by16ZXJvIEFQSSBjb250cmFjdCBtYW5kYXRlcyB0aGF0CisgIC8vIG5lc3RlZCBmaWVs
ZHMgY2FuIGJlIGZpbGxlZCBvbmx5IGluIGEgc3RhY2tlZCBmYXNoaW9uLiBJbiBvdGhlciB3b3Jk
cywKKyAgLy8gbmVzdGVkIG1lc3NhZ2VzIGFyZSBmaW5hbGl6ZWQgYW5kIHNlYWxlZCB3aGVuIGFu
eSBvdGhlciBmaWVsZCBpcyBzZXQgaW4gdGhlCisgIC8vIHBhcmVudCBtZXNzYWdlIChvciB0aGUg
cGFyZW50IG1lc3NhZ2UgaXRzZWxmIGlzIGZpbmFsaXplZCkgYW5kIGNhbm5vdCBiZQorICAvLyBh
Y2Nlc3NlZCBhbnltb3JlIGFmdGVyd2FyZHMuCisgIC8vIFRPRE8ocHJpbWlhbm8pOiBvcHRpbWl6
YXRpb246IEkgdGhpbmsgdGhhdCBuZXN0ZWRfbWVzc2FnZV8sIHdoZW4gbm9uLW51bGwuCisgIC8v
IHdpbGwgYWx3YXlzIGJlIEAgKHRoaXMpICsgb2Zmc2V0b2YobmVzdGVkX21lc3NhZ2VzX2FyZW5h
XykuCisgIE1lc3NhZ2UqIG5lc3RlZF9tZXNzYWdlXzsKKworICAvLyBUaGUgcm9vdCBtZXNzYWdl
IG93bnMgdGhlIHN0b3JhZ2UgZm9yIGFsbCBpdHMgbmVzdGVkIG1lc3NhZ2VzLCB1cCB0byBhIG1h
eAorICAvLyBvZiBrTWF4TmVzdGluZ0RlcHRoIGxldmVscyAoc2VlIHRoZSAuY2MgZmlsZSkuIE5v
dGUgdGhhdCB0aGUgYm91bmRhcmllcyBvZgorICAvLyB0aGUgYXJlbmEgYXJlIG1lYW5pbmdmdWwg
b25seSBmb3IgdGhlIHJvb3QgbWVzc2FnZS4KKyAgLy8gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3Qg
cHV0IHRoZSBzaXplb2YoKSBtYXRoIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3Qgc2l6ZW9mCisgIC8v
IHRoZSBjdXJyZW50IGNsYXNzIGluIGEgaGVhZGVyLiBIb3dldmVyIHRoZSAuY2MgZmlsZSBoYXMg
YSBzdGF0aWNfYXNzZXJ0CisgIC8vIHRoYXQgZ3VhcmFudGVlcyB0aGF0IChzZWUgdGhlIFJlc2V0
KCkgbWV0aG9kIGluIHRoZSAuY2MgZmlsZSkuCisgIGFsaWduYXMoc2l6ZW9mKHZvaWQqKSkgdWlu
dDhfdCBuZXN0ZWRfbWVzc2FnZXNfYXJlbmFfWzUxMl07CisKKyAgLy8gRE8gTk9UIGFkZCBhbnkg
ZmllbGRzIGJlbG93IHxuZXN0ZWRfbWVzc2FnZXNfYXJlbmFffC4gVGhlIG1lbW9yeSBsYXlvdXQg
b2YKKyAgLy8gbmVzdGVkIG1lc3NhZ2VzIHdvdWxkIG92ZXJmbG93IHRoZSBzdG9yYWdlIGFsbG9j
YXRlZCBieSB0aGUgcm9vdCBtZXNzYWdlLgorfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVy
bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX01FU1NBR0VfSF8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vcHJvdG96ZXJv
L21lc3NhZ2VfaGFuZGxlLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQg
T3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGlj
ZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRo
aXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1h
eSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3
LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQg
YnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBk
aXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMi
IEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQs
IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBz
cGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9u
cyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fUFJP
VE9aRVJPX01FU1NBR0VfSEFORExFX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9a
RVJPX01FU1NBR0VfSEFORExFX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L21lc3NhZ2UuaCIKKworbmFtZXNwYWNlIHByb3RvemVybyB7CisKK2NsYXNzIE1lc3NhZ2U7CisK
Ky8vIE1lc3NhZ2VIYW5kbGUgYWxsb3dzIHRvIGRlY291cGxlIHRoZSBsaWZldGltZSBvZiBhIHBy
b3RvIG1lc3NhZ2UKKy8vIGZyb20gdGhlIHVuZGVybHlpbmcgc3RvcmFnZS4gSXQgZ2l2ZXMgdGhl
IGZvbGxvd2luZyBndWFyYW50ZWVzOgorLy8gLSBUaGUgdW5kZXJseWluZyBtZXNzYWdlIGlzIGZp
bmFsaXplZCAoaWYgc3RpbGwgYWxpdmUpIGlmIHRoZSBoYW5kbGUgZ29lcworLy8gICBvdXQgb2Yg
c2NvcGUuCisvLyAtIEluIERlYnVnIC8gRENIRUNLX0FMV0FZU19PTiBidWlsZHMsIHRoZSBoYW5k
bGUgYmVjb21lcyBudWxsIG9uY2UgdGhlCisvLyAgIG1lc3NhZ2UgaXMgZmluYWxpemVkLiBUaGlz
IGlzIHRvIGVuZm9yY2UgdGhlIGFwcGVuZC1vbmx5IEFQSS4gRm9yIGluc3RhbmNlCisvLyAgIHdo
ZW4gYWRkaW5nIHR3byByZXBlYXRlZCBtZXNzYWdlcywgdGhlIGFkZGl0aW9uIG9mIHRoZSAybmQg
b25lIGZvcmNlcworLy8gICB0aGUgZmluYWxpemF0aW9uIG9mIHRoZSBmaXJzdC4KKy8vIFRoaW5r
IGFib3V0IHRoaXMgYXMgYSBXZWFrUHRyPE1lc3NhZ2U+IHdoaWNoIGNhbGxzCisvLyBNZXNzYWdl
OjpGaW5hbGl6ZSgpIHdoZW4gZ29pbmcgb3V0IG9mIHNjb3BlLgorCitjbGFzcyBQRVJGRVRUT19F
WFBPUlQgTWVzc2FnZUhhbmRsZUJhc2UgeworIHB1YmxpYzoKKyAgfk1lc3NhZ2VIYW5kbGVCYXNl
KCk7CisKKyAgLy8gTW92ZS1vbmx5IHR5cGUuCisgIE1lc3NhZ2VIYW5kbGVCYXNlKE1lc3NhZ2VI
YW5kbGVCYXNlJiYpIG5vZXhjZXB0OworICBNZXNzYWdlSGFuZGxlQmFzZSYgb3BlcmF0b3I9KE1l
c3NhZ2VIYW5kbGVCYXNlJiYpOworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Qgewor
I2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgICAgUEVSRkVUVE9fRENIRUNLKCFtZXNzYWdl
XyB8fCBnZW5lcmF0aW9uXyA9PSBtZXNzYWdlXy0+Z2VuZXJhdGlvbl8pOworI2VuZGlmCisgICAg
cmV0dXJuICEhbWVzc2FnZV87CisgIH0KKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgTWVzc2Fn
ZUhhbmRsZUJhc2UoTWVzc2FnZSogPSBudWxscHRyKTsKKyAgTWVzc2FnZSogb3BlcmF0b3ItPigp
IGNvbnN0IHsKKyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICAgIFBFUkZFVFRPX0RDSEVD
SyghbWVzc2FnZV8gfHwgZ2VuZXJhdGlvbl8gPT0gbWVzc2FnZV8tPmdlbmVyYXRpb25fKTsKKyNl
bmRpZgorICAgIHJldHVybiBtZXNzYWdlXzsKKyAgfQorICBNZXNzYWdlJiBvcGVyYXRvciooKSBj
b25zdCB7IHJldHVybiAqKG9wZXJhdG9yLT4oKSk7IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBj
bGFzcyBNZXNzYWdlOworICBNZXNzYWdlSGFuZGxlQmFzZShjb25zdCBNZXNzYWdlSGFuZGxlQmFz
ZSYpID0gZGVsZXRlOworICBNZXNzYWdlSGFuZGxlQmFzZSYgb3BlcmF0b3I9KGNvbnN0IE1lc3Nh
Z2VIYW5kbGVCYXNlJikgPSBkZWxldGU7CisKKyAgdm9pZCByZXNldF9tZXNzYWdlKCkgeworICAg
IC8vIFRoaXMgaXMgY2FsbGVkIGJ5IE1lc3NhZ2U6OkZpbmFsaXplKCkuCisgICAgUEVSRkVUVE9f
RENIRUNLKG1lc3NhZ2VfLT5pc19maW5hbGl6ZWQoKSk7CisgICAgbWVzc2FnZV8gPSBudWxscHRy
OworICB9CisKKyAgdm9pZCBNb3ZlKE1lc3NhZ2VIYW5kbGVCYXNlJiYpOworCisgIHZvaWQgRmlu
YWxpemVNZXNzYWdlKCkgeyBtZXNzYWdlXy0+RmluYWxpemUoKTsgfQorCisgIE1lc3NhZ2UqIG1l
c3NhZ2VfOworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgIHVpbnQzMl90IGdlbmVyYXRp
b25fOworI2VuZGlmCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE1lc3NhZ2VI
YW5kbGUgOiBwdWJsaWMgTWVzc2FnZUhhbmRsZUJhc2UgeworIHB1YmxpYzoKKyAgTWVzc2FnZUhh
bmRsZSgpIDogTWVzc2FnZUhhbmRsZShudWxscHRyKSB7fQorICBleHBsaWNpdCBNZXNzYWdlSGFu
ZGxlKFQqIG1lc3NhZ2UpIDogTWVzc2FnZUhhbmRsZUJhc2UobWVzc2FnZSkge30KKworICBleHBs
aWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gTWVzc2FnZUhhbmRsZUJhc2U6Om9w
ZXJhdG9yIGJvb2woKTsgfQorCisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8VCY+KE1lc3NhZ2VIYW5kbGVCYXNlOjpvcGVyYXRvciooKSk7CisgIH0KKwor
ICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oTWVz
c2FnZUhhbmRsZUJhc2U6Om9wZXJhdG9yLT4oKSk7CisgIH0KKworICBUKiBnZXQoKSBjb25zdCB7
IHJldHVybiBzdGF0aWNfY2FzdDxUKj4oTWVzc2FnZUhhbmRsZUJhc2U6Om9wZXJhdG9yLT4oKSk7
IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlmICAvLyBJTkNMVURF
X1BFUkZFVFRPX1BST1RPWkVST19NRVNTQUdFX0hBTkRMRV9IXworLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2ludGVybmFsL2Jhc2ljX3R5
cGVzLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2Ug
UHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lv
biAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl
cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBj
b3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcv
bGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJs
ZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1
bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICog
V0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHBy
ZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5n
dWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUg
TGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5B
TF9CQVNJQ19UWVBFU19IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJO
QUxfQkFTSUNfVFlQRVNfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlu
dC5oPgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8g
QSBzdGF0aWNfYXNzZXJ0IGluIHRyYWNpbmdfbXV4ZXJfaW1wbC5jYyBndWFyYW50ZWVzIHRoYXQg
dGhpcyBzdGF5cyBpbiBzeW5jCisvLyB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRyYWNpbmcvY29y
ZS9iYXNpY190eXBlcy5oCit1c2luZyBCdWZmZXJJZCA9IHVpbnQxNl90OworCisvLyBUaGlzIGlz
IGEgZGlyZWN0IGluZGV4IGluIHRoZSBUcmFjaW5nTXV4ZXI6OmJhY2tlbmRzXyB2ZWN0b3IuCisv
LyBCYWNrZW5kcyBhcmUgb25seSBhZGRlZCBhbmQgbmV2ZXIgcmVtb3ZlZC4KK3VzaW5nIFRyYWNp
bmdCYWNrZW5kSWQgPSBzaXplX3Q7CisKKy8vIE1heCBudW1iZXJzIG9mIGRhdGEgc291cmNlcyB0
aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgcHJvY2Vzcy4KK2NvbnN0ZXhwciBzaXplX3Qga01h
eERhdGFTb3VyY2VzID0gMzI7CisKKy8vIE1heCBpbnN0YW5jZXMgZm9yIGVhY2ggZGF0YSBzb3Vy
Y2UgdHlwZS4gVGhpcyB0eXBpY2FsbHkgbWF0Y2hlcyB0aGUKKy8vICJtYXggbnVtYmVyIG9mIGNv
bmN1cnJlbnQgdHJhY2luZyBzZXNzaW9ucyIuIEhvd2V2ZXIgcmVtZW1iZXIgdGhhdCBhIGRhdGEK
Ky8vIHNvdXJjZSBjYW4gYmUgaW5zdGFudGlhdGVkIG1vcmUgdGhhbiBvbmNlIHdpdGhpbiBvbmUg
dHJhY2luZyBzZXNzaW9uIGJ5CisvLyBjcmVhdGluZyB0d28gZW50cmllcyBmb3IgaXQgaW4gdGhl
IHRyYWNlIGNvbmZpZy4KK2NvbnN0ZXhwciBzaXplX3Qga01heERhdGFTb3VyY2VJbnN0YW5jZXMg
PSA4OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0
bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9CQVNJQ19U
WVBFU19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0
by90cmFjaW5nL2ludGVybmFsL2RhdGFfc291cmNlX2ludGVybmFsLmgKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy90cmFjZV93cml0ZXJf
YmFzZS5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNl
IFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn
L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi
bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAq
IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhl
IExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfVFJBQ0Vf
V1JJVEVSX0JBU0VfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNFX1dS
SVRFUl9CQVNFX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9tZXNzYWdlX2hhbmRsZS5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8g
eworCituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworY2xhc3MgVHJhY2VQ
YWNrZXQ7Cit9ICAvLyBuYW1lc3BhY2UgcGJ6ZXJvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCisK
Ky8vIFRoZSBiYXJlLW1pbmltdW0gc3Vic2V0IG9mIHRoZSBUcmFjZVdyaXRlciBpbnRlcmZhY2Ug
dGhhdCBpcyBleHBvc2VkIGFzIGEKKy8vIGZ1bGx5IHB1YmxpYyBBUEkuCisvLyBTZWUgY29tbWVu
dHMgaW4gL2luY2x1ZGUvcGVyZmV0dG8vZXh0L3RyYWNpbmcvY29yZS90cmFjZV93cml0ZXIuaC4K
K2NsYXNzIFRyYWNlV3JpdGVyQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UcmFjZVdyaXRl
ckJhc2UoKTsKKworICB2aXJ0dWFsIHByb3RvemVybzo6TWVzc2FnZUhhbmRsZTxwcm90b3M6OnBi
emVybzo6VHJhY2VQYWNrZXQ+CisgIE5ld1RyYWNlUGFja2V0KCkgPSAwOworCisgIHZpcnR1YWwg
dm9pZCBGbHVzaChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY2FsbGJhY2sgPSB7fSkgPSAwOworICB2
aXJ0dWFsIHVpbnQ2NF90IHdyaXR0ZW4oKSBjb25zdCA9IDA7Cit9OworCit9ICAvLyBuYW1lc3Bh
Y2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfVFJBQ0Vf
V1JJVEVSX0JBU0VfSF8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3Bl
biBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5z
ZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMg
ZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBv
YnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFw
YWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkg
YXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0
cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJB
U0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVp
dGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVj
aWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1
bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lO
R19JTlRFUk5BTF9EQVRBX1NPVVJDRV9JTlRFUk5BTF9IXworI2RlZmluZSBJTkNMVURFX1BFUkZF
VFRPX1RSQUNJTkdfSU5URVJOQUxfREFUQV9TT1VSQ0VfSU5URVJOQUxfSF8KKworI2luY2x1ZGUg
PHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5j
bHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5Pgor
I2luY2x1ZGUgPG11dGV4PgorCisvLyBObyBwZXJmZXR0byBoZWFkZXJzIChvdGhlciB0aGFuIHRy
YWNpbmcvYXBpIGFuZCBwcm90b3plcm8pIHNob3VsZCBiZSBoZXJlLgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9idWZmZXJfZXhoYXVzdGVk
X3BvbGljeS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vdHJhY2luZy9pbnRlcm5hbC9iYXNpY190eXBlcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjZV93cml0ZXJfYmFzZS5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIFRy
YWNlV3JpdGVyQmFzZTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgVHJhY2luZ1RM
UzsKKworLy8gVGhpcyBtYWludGFpbnMgdGhlIGludGVybmFsIHN0YXRlIG9mIGEgZGF0YSBzb3Vy
Y2UgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIG9ubHkKKy8vIHRvIGltcGxlbWVudCB0aGUgdHJhY2lu
ZyBtZWNoYW5pY3MgYW5kIGlzIG5vdCBleHBvc2VkIHRvIHRoZSBBUEkgY2xpZW50LgorLy8gVGhl
cmUgaXMgb25lIG9mIHRoZXNlIG9iamVjdCBwZXIgRGF0YVNvdXJjZSBpbnN0YW5jZSAodXAgdG8K
Ky8vIGtNYXhEYXRhU291cmNlSW5zdGFuY2VzKS4KK3N0cnVjdCBEYXRhU291cmNlU3RhdGUgewor
ICAvLyBUaGlzIGJvb2xlYW4gZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIERhdGFTb3VyY2U6
OlRyYWNlKCkgbWV0aG9kIHNob3VsZAorICAvLyBkbyBzb21ldGhpbmcgb3IgYmUgYSBuby1vcC4g
VGhpcyBmbGFnIGRvZXNuJ3QgZ2l2ZSB0aGUgZnVsbCBndWFyYW50ZWUKKyAgLy8gdGhhdCB0cmFj
aW5nIGRhdGEgd2lsbCBiZSB2aXNpYmxlIGluIHRoZSB0cmFjZSwgaXQganVzdCBtYWtlcyBpdCBz
byB0aGF0CisgIC8vIHRoZSBjbGllbnQgYXR0ZW1wcyB3cml0aW5nIHRyYWNlIGRhdGEgYW5kIGlu
dGVyYWN0aW5nIHdpdGggdGhlIHNlcnZpY2UuCisgIC8vIEZvciBpbnN0YW5jZSwgd2hlbiBhIHRy
YWNpbmcgc2Vzc2lvbiBlbmRzIHRoZSBzZXJ2aWNlIHdpbGwgcmVqZWN0IGRhdGEKKyAgLy8gY29t
bWl0cyB0aGF0IGFycml2ZSB0b28gbGF0ZSBldmVuIGlmIHRoZSBwcm9kdWNlciBoYXNuJ3QgcmVj
ZWl2ZWQgdGhlIHN0b3AKKyAgLy8gSVBDIG1lc3NhZ2UuCisgIC8vIFRoaXMgZmxhZyBpcyBzZXQg
cmlnaHQgYmVmb3JlIGNhbGxpbmcgT25TdGFydCgpIGFuZCBjbGVhcmVkIHJpZ2h0IGJlZm9yZQor
ICAvLyBjYWxsaW5nIE9uU3RvcCgpLCB1bmxlc3MgdXNpbmcgSGFuZGxlU3RvcEFzeW5jaHJvbm91
c2x5KCkgKHNlZSBjb21tZW50cworICAvLyBpbiBkYXRhX3NvdXJjZS5oKS4KKyAgLy8gS2VlcCB0
aGlzIGZsYWcgYXMgdGhlIGZpcnN0IGZpZWxkLiBUaGlzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8g
ZGlyZWN0bHkKKyAgLy8gZGVyZWZlcmVuY2UgdGhlIERhdGFTb3VyY2VTdGF0ZSogcG9pbnRlciBp
biB0aGUgdHJhY2UgZmFzdC1wYXRoIHdpdGhvdXQKKyAgLy8gZG9pbmcgZXh0cmEgcG9pbnRyIGFy
aXRobWV0aWMuCisgIGJvb2wgdHJhY2VfbGFtYmRhX2VuYWJsZWQgPSBmYWxzZTsKKworICAvLyBU
aGUgY2VudHJhbCBidWZmZXIgaWQgdGhhdCBhbGwgVHJhY2VXcml0ZXIocykgY3JlYXRlZCBieSB0
aGlzIGRhdGEgc291cmNlCisgIC8vIG11c3QgdGFyZ2V0LgorICBCdWZmZXJJZCBidWZmZXJfaWQg
PSAwOworCisgIC8vIFRoZSBpbmRleCB3aXRoaW4gVHJhY2luZ011eGVySW1wbC5iYWNrZW5kc18u
IFByYWN0aWNhbGx5IGl0IGFsbG93cyB0bworICAvLyBsb29rdXAgdGhlIFByb2R1Y2VyIG9iamVj
dCwgYW5kIGhlbmNlIHRoZSBJUEMgY2hhbm5lbCwgZm9yIHRoaXMgZGF0YQorICAvLyBzb3VyY2Uu
CisgIFRyYWNpbmdCYWNrZW5kSWQgYmFja2VuZF9pZCA9IDA7CisKKyAgLy8gVGhlIGluc3RhbmNl
IGlkIGFzIGFzc2lnbmVkIGJ5IHRoZSB0cmFjaW5nIHNlcnZpY2UuIE5vdGUgdGhhdCBiZWNhdXNl
IGEKKyAgLy8gcHJvY2VzcyBjYW4gYmUgY29ubmVjdGVkIHRvID4xIHNlcnZpY2VzLCB0aGlzIElE
IGlzIG5vdCBnbG9iYWxseSB1bmlxdWUgYnV0CisgIC8vIGlzIG9ubHkgdW5pcXVlIHdpdGhpbiB0
aGUgc2NvcGUgb2YgaXRzIGJhY2tlbmQuCisgIC8vIE9ubHkgdGhlIHR1cGxlIChiYWNrZW5kX2lk
LCBkYXRhX3NvdXJjZV9pbnN0YW5jZV9pZCkgaXMgZ2xvYmFsbHkgdW5pcXVlLgorICB1aW50NjRf
dCBkYXRhX3NvdXJjZV9pbnN0YW5jZV9pZCA9IDA7CisKKyAgLy8gQSBoYXNoIG9mIHRoZSB0cmFj
ZSBjb25maWcgdXNlZCBieSB0aGlzIGluc3RhbmNlLiBUaGlzIGlzIHVzZWQgdG8KKyAgLy8gZGUt
ZHVwbGljYXRlIGluc3RhbmNlcyBmb3IgZGF0YSBzb3VyY2VzIHdpdGggaWRlbnRpY2FsIG5hbWVz
IChlLmcuLCB0cmFjaworICAvLyBldmVudCkuCisgIHVpbnQ2NF90IGNvbmZpZ19oYXNoID0gMDsK
KworICAvLyBUaGlzIGxvY2sgaXMgbm90IGhlbGQgdG8gaW1wbGVtZW50IFRyYWNlKCkgYW5kIGl0
J3MgdXNlZCBvbmx5IGlmIHRoZSB0cmFjZQorICAvLyBjb2RlIHdhbnRzIHRvIGFjY2VzcyBpdHMg
b3duIGRhdGEgc291cmNlIHN0YXRlLgorICAvLyBUaGlzIGlzIHRvIHByZXZlbnQgdGhhdCBhY2Nl
c3NpbmcgdGhlIGRhdGEgc291cmNlIG9uIGFuIGFyYml0cmFyeSBlbWJlZGRlcgorICAvLyB0aHJl
YWQgcmFjZXMgd2l0aCB0aGUgaW50ZXJuYWwgSVBDIHRocmVhZCBkZXN0cm95aW5nIHRoZSBkYXRh
IHNvdXJjZQorICAvLyBiZWNhdXNlIG9mIGEgZW5kLW9mLXRyYWNpbmcgbm90aWZpY2F0aW9uIGZy
b20gdGhlIHNlcnZpY2UuCisgIHN0ZDo6cmVjdXJzaXZlX211dGV4IGxvY2s7CisgIHN0ZDo6dW5p
cXVlX3B0cjxEYXRhU291cmNlQmFzZT4gZGF0YV9zb3VyY2U7Cit9OworCisvLyBUaGlzIGlzIHRv
IGFsbG93IGxhenktaW5pdGlhbGl6YXRpb24gYW5kIGF2b2lkIHN0YXRpYyBpbml0aWFsaXplcnMg
YW5kCisvLyBhdC1leGl0IGRlc3RydWN0b3JzLiBBbGwgdGhlIGVudHJpZXMgYXJlIGluaXRpYWxp
emVkIHZpYSBwbGFjZW1lbnQtbmV3IHdoZW4KKy8vIERhdGFTb3VyY2U6OlJlZ2lzdGVyKCkgaXMg
Y2FsbGVkLCBzZWUgVHJhY2luZ011eGVySW1wbDo6UmVnaXN0ZXJEYXRhU291cmNlKCkuCitzdHJ1
Y3QgRGF0YVNvdXJjZVN0YXRlU3RvcmFnZSB7CisgIGFsaWduYXMoRGF0YVNvdXJjZVN0YXRlKSBj
aGFyIHN0b3JhZ2Vbc2l6ZW9mKERhdGFTb3VyY2VTdGF0ZSlde307Cit9OworCisvLyBQZXItRGF0
YVNvdXJjZS10eXBlIGdsb2JhbCBzdGF0ZS4KK3N0cnVjdCBEYXRhU291cmNlU3RhdGljU3RhdGUg
eworICAvLyBVbmlxdWUgaW5kZXggb2YgdGhlIGRhdGEgc291cmNlLCBhc3NpZ25lZCBhdCByZWdp
c3RyYXRpb24gdGltZS4KKyAgdWludDMyX3QgaW5kZXggPSBrTWF4RGF0YVNvdXJjZXM7CisKKyAg
Ly8gQSBiaXRtYXAgdGhhdCB0ZWxscyBhYm91dCB0aGUgdmFsaWRpdHkgb2YgZWFjaCB8aW5zdGFu
Y2VzfCBlbnRyeS4gV2hlbiB0aGUKKyAgLy8gaS10aCBiaXQgb2YgdGhlIGJpdG1hcCBpdCdzIHNl
dCwgaW5zdGFuY2VzW2ldIGlzIHZhbGlkLgorICBzdGQ6OmF0b21pYzx1aW50MzJfdD4gdmFsaWRf
aW5zdGFuY2Vze307CisgIHN0ZDo6YXJyYXk8RGF0YVNvdXJjZVN0YXRlU3RvcmFnZSwga01heERh
dGFTb3VyY2VJbnN0YW5jZXM+IGluc3RhbmNlc3t9OworCisgIC8vIENhbiBiZSB1c2VkIHdpdGgg
YSBjYWNoZWQgfHZhbGlkX2luc3RhbmNlc3wgYml0bWFwLgorICBEYXRhU291cmNlU3RhdGUqIFRy
eUdldENhY2hlZCh1aW50MzJfdCBjYWNoZWRfYml0bWFwLCBzaXplX3QgbikgeworICAgIHJldHVy
biBjYWNoZWRfYml0bWFwICYgKDEgPDwgbikKKyAgICAgICAgICAgICAgID8gcmVpbnRlcnByZXRf
Y2FzdDxEYXRhU291cmNlU3RhdGUqPigmaW5zdGFuY2VzW25dKQorICAgICAgICAgICAgICAgOiBu
dWxscHRyOworICB9CisKKyAgRGF0YVNvdXJjZVN0YXRlKiBUcnlHZXQoc2l6ZV90IG4pIHsKKyAg
ICByZXR1cm4gVHJ5R2V0Q2FjaGVkKHZhbGlkX2luc3RhbmNlcy5sb2FkKHN0ZDo6bWVtb3J5X29y
ZGVyX2FjcXVpcmUpLCBuKTsKKyAgfQorCisgIHZvaWQgQ29tcGlsZXJBc3NlcnRzKCkgeworICAg
IHN0YXRpY19hc3NlcnQoc2l6ZW9mKHZhbGlkX2luc3RhbmNlcy5sb2FkKCkpICogOCA+PSBrTWF4
RGF0YVNvdXJjZUluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICJrTWF4RGF0YVNvdXJjZUlu
c3RhbmNlcyB0b28gaGlnaCIpOworICB9Cit9OworCisvLyBQZXItRGF0YVNvdXJjZS1pbnN0YW5j
ZSB0aHJlYWQtbG9jYWwgc3RhdGUuCitzdHJ1Y3QgRGF0YVNvdXJjZUluc3RhbmNlVGhyZWFkTG9j
YWxTdGF0ZSB7CisgIHVzaW5nIEluY3JlbWVudGFsU3RhdGVQb2ludGVyID0gc3RkOjp1bmlxdWVf
cHRyPHZvaWQsIHZvaWQgKCopKHZvaWQqKT47CisKKyAgdm9pZCBSZXNldCgpIHsKKyAgICB0cmFj
ZV93cml0ZXIucmVzZXQoKTsKKyAgICBpbmNyZW1lbnRhbF9zdGF0ZS5yZXNldCgpOworICAgIGJh
Y2tlbmRfaWQgPSAwOworICAgIGJ1ZmZlcl9pZCA9IDA7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9w
dHI8VHJhY2VXcml0ZXJCYXNlPiB0cmFjZV93cml0ZXI7CisgIEluY3JlbWVudGFsU3RhdGVQb2lu
dGVyIGluY3JlbWVudGFsX3N0YXRlID0ge251bGxwdHIsIFtdKHZvaWQqKSB7fX07CisgIFRyYWNp
bmdCYWNrZW5kSWQgYmFja2VuZF9pZDsKKyAgQnVmZmVySWQgYnVmZmVyX2lkOworfTsKKworLy8g
UGVyLURhdGFTb3VyY2UtdHlwZSB0aHJlYWQtbG9jYWwgc3RhdGUuCitzdHJ1Y3QgRGF0YVNvdXJj
ZVRocmVhZExvY2FsU3RhdGUgeworICBEYXRhU291cmNlU3RhdGljU3RhdGUqIHN0YXRpY19zdGF0
ZSA9IG51bGxwdHI7CisKKyAgLy8gUG9pbnRlciB0byB0aGUgcGFyZW50IHRscyBvYmplY3QgdGhh
dCBob2xkcyB1cy4gVXNlZCB0byByZXRyaWV2ZSB0aGUKKyAgLy8gZ2VuZXJhdGlvbiwgd2hpY2gg
aXMgcGVyLWdsb2JhbC1UTFMgYW5kIG5vdCBwZXIgZGF0YS1zb3VyY2UuCisgIFRyYWNpbmdUTFMq
IHJvb3RfdGxzID0gbnVsbHB0cjsKKworICAvLyBPbmUgZW50cnkgcGVyIGVhY2ggZGF0YSBzb3Vy
Y2UgaW5zdGFuY2UuCisgIHN0ZDo6YXJyYXk8RGF0YVNvdXJjZUluc3RhbmNlVGhyZWFkTG9jYWxT
dGF0ZSwga01heERhdGFTb3VyY2VJbnN0YW5jZXM+CisgICAgICBwZXJfaW5zdGFuY2V7fTsKK307
CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisK
KyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX0RBVEFfU09VUkNF
X0lOVEVSTkFMX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3Bl
cmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2luZ19tdXhlci5oCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2lu
Z190bHMuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0
by90cmFjaW5nL3BsYXRmb3JtLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUg
TGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNl
IHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91
IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8v
d3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWly
ZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisg
KiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMg
SVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJ
TkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRo
ZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0
aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9f
VFJBQ0lOR19QTEFURk9STV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfUExB
VEZPUk1fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisj
aW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisKK25hbWVz
cGFjZSBwZXJmZXR0byB7CisKK25hbWVzcGFjZSBiYXNlIHsKK2NsYXNzIFRhc2tSdW5uZXI7Cit9
ICAvLyBuYW1lc3BhY2UgYmFzZQorCisvLyBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgdG8g
YWJzdHJhY3QgZGVwZW5kZW5jaWVzIG9uIHBsYXRmb3JtLXNwZWNpZmljCisvLyBwcmltaXRpdmVz
IHRoYXQgY2Fubm90IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBwZXJmZXR0byBjb2RlYmFzZSBhbmQg
bXVzdCBiZQorLy8gcHJvdmlkZWQgb3Igb3ZlcnJpZGRlbiBieSB0aGUgZW1iZWRkZXIuCisvLyBU
aGlzIGlzLCBmb3IgaW5zdGFuY2UsIGZvciBjYXNlcyB3aGVyZSB3ZSB3YW50IHRvIHVzZSBzb21l
IHBhcnRpY3VsYXIKKy8vIGJhc2U6OiBjbGFzcyBpbiBDaHJvbWUgYW5kIHByb3ZpZGUgaW5zdGVh
ZCBQT1NJWCBmYWxsYmFja3MgZm9yIG90aGVyCisvLyBlbWJlZGRlcnMuCisKKy8vIEJhc2UgY2xh
c3MgZm9yIHRocmVhZC1sb2NhbCBvYmplY3RzLiBUaGlzIGlzIHRvIGdldCBhIGJhc2ljIG9iamVj
dCB2dGFibGUgYW5kCisvLyBkZWxlZ2F0ZSBkZXN0cnVjdGlvbiB0byB0aGUgZW1iZWRkZXIuIFNl
ZSBQbGF0Zm9ybTo6Q3JlYXRlVGhyZWFkTG9jYWxPYmplY3QuCitjbGFzcyBQRVJGRVRUT19FWFBP
UlQgUGxhdGZvcm1UaHJlYWRMb2NhbE9iamVjdCB7CisgcHVibGljOgorICAvLyBJbXBsZW1lbnRl
ZCBieSBwZXJmZXR0byBpbnRlcm5hbCBjb2RlLiBUaGUgZW1iZWRkZXIgbXVzdCBjYWxsIHRoaXMg
d2hlbgorICAvLyBpbXBsZW1lbnRpbmcgR2V0T3JDcmVhdGVUaHJlYWRMb2NhbE9iamVjdCgpIHRv
IGNyZWF0ZSBhbiBpbnN0YW5jZSBmb3IgdGhlCisgIC8vIGZpcnN0IHRpbWUgb24gZWFjaCB0aHJl
YWQuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UGxhdGZvcm1UaHJlYWRMb2NhbE9iamVjdD4g
Q3JlYXRlSW5zdGFuY2UoKTsKKyAgdmlydHVhbCB+UGxhdGZvcm1UaHJlYWRMb2NhbE9iamVjdCgp
OworfTsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFBsYXRmb3JtIHsKKyBwdWJsaWM6CisgIC8v
IEVtYmVkZGVycyBjYW4gdXNlIHRoaXMgdW5sZXNzIHRoZXkgaGF2ZSBjdXN0b20gbmVlZHMgKGUu
Zy4gQ2hyb21lIHdhbnRpbmcKKyAgLy8gdG8gdXNlIGl0cyBvd24gYmFzZSBjbGFzcyBmb3IgVExT
KS4KKyAgc3RhdGljIFBsYXRmb3JtKiBHZXREZWZhdWx0UGxhdGZvcm0oKTsKKworICB2aXJ0dWFs
IH5QbGF0Zm9ybSgpOworCisgIC8vIENyZWF0ZXMgYSB0aHJlYWQtbG9jYWwgb2JqZWN0LiBUaGUg
ZW1iZWRkZXIgbXVzdDoKKyAgLy8gLSBDcmVhdGUgYW4gaW5zdGFuY2UgcGVyLXRocmVhZCBjYWxs
aW5nIFRocmVhZExvY2FsT2JqZWN0OjpDcmVhdGVJbnN0YW5jZS4KKyAgLy8gLSBPd24gdGhlIGxp
ZmV0aW1lIG9mIHRoZSByZXR1cm5lZCBvYmplY3QgYXMgbG9uZyBhcyB0aGUgdGhyZWFkIGlzIGFs
aXZlLgorICAvLyAtIERlc3Ryb3kgaXQgd2hlbiB0aGUgdGhyZWFkIGV4aXRzLgorICAvLyBQZXJm
ZXR0byByZXF1aXJlcyBvbmx5IG9uZSB0aHJlYWQtbG9jYWwgb2JqZWN0IG92ZXJhbGwgKG9idmlv
dXNseSwgb25lCisgIC8vIGluc3RhbmNlIHBlci10aHJlYWQpIGZyb20gdGhlIGVtYmVkZGVyLgor
ICB1c2luZyBUaHJlYWRMb2NhbE9iamVjdCA9IDo6cGVyZmV0dG86OlBsYXRmb3JtVGhyZWFkTG9j
YWxPYmplY3Q7CisgIHZpcnR1YWwgVGhyZWFkTG9jYWxPYmplY3QqIEdldE9yQ3JlYXRlVGhyZWFk
TG9jYWxPYmplY3QoKSA9IDA7CisKKyAgLy8gQ3JlYXRlcyBhIHNlcXVlbmNlZCB0YXNrIHJ1bm5l
ci4gVGhlIGVhc2llc3QgaW1wbGVtZW50YXRpb24gaXMgdG8gY3JlYXRlCisgIC8vIGEgbmV3IHRo
cmVhZCAoZS5nLiB1c2UgYmFzZTo6VGhyZWFkVGFza1J1bm5lcikgYnV0IHRoaXMgY2FuIGFsc28g
YmUKKyAgLy8gaW1wbGVtZW50ZWQgaW4gc29tZSBtb3JlIGNsZXZlciB3YXkgKGUuZy4gdXNpbmcg
Y2hyb21pdW1zJ3Mgc2NoZWR1bGVyKS4KKyAgc3RydWN0IENyZWF0ZVRhc2tSdW5uZXJBcmdzIHt9
OworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxiYXNlOjpUYXNrUnVubmVyPiBDcmVhdGVUYXNr
UnVubmVyKAorICAgICAgY29uc3QgQ3JlYXRlVGFza1J1bm5lckFyZ3MmKSA9IDA7CisKKyAgLy8g
VXNlZCB0byBkZXJpdmUgdGhlIHByb2R1Y2VyIG5hbWUuIE1vc3RseSByZWxldmFudCB3aGVuIHVz
aW5nIHRoZQorICAvLyBrU3lzdGVtQmFja2VuZCBtb2RlLiBJdCBjYW4gYmUgYW4gYXJiaXRyYXJ5
IHN0cmluZyB3aGVuIHVzaW5nIHRoZQorICAvLyBpbi1wcm9jZXNzIG1vZGUuCisgIHZpcnR1YWwg
c3RkOjpzdHJpbmcgR2V0Q3VycmVudFByb2Nlc3NOYW1lKCkgPSAwOworfTsKKworfSAgLy8gbmFt
ZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1BM
QVRGT1JNX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291
cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZl
cnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUg
ZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWlu
IGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUu
b3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxp
Y2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0
ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywK
KyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIg
ZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMg
bGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIg
dGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5U
RVJOQUxfVFJBQ0lOR19UTFNfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lO
VEVSTkFMX1RSQUNJTkdfVExTX0hfCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxtZW1v
cnk+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Ry
YWNpbmcvaW50ZXJuYWwvYmFzaWNfdHlwZXMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvZGF0YV9zb3VyY2VfaW50ZXJu
YWwuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Ry
YWNpbmcvcGxhdGZvcm0uaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworY2xhc3MgVHJhY2VX
cml0ZXJCYXNlOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBPcmdhbml6YXRpb24gb2Yg
dGhlIHRocmVhZC1sb2NhbCBzdG9yYWdlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCisvLyBGaXJzdCBvZiBhbGwsIHJlbWVtYmVyIHRoZSBjYXJkaW5hbGl0eSBv
ZiB0aGUgcHJvYmxlbTogYXQgYW55IHBvaW50IGluIHRpbWUKKy8vIHRoZXJlIGFyZSBNIGRhdGEg
c291cmNlcyByZWdpc3RlcmVkIChpLmUuIG51bWJlciBvZiBzdWJjbGFzc2VzIG9mIERhdGFTb3Vy
Y2UpCisvLyBhbmQgdXAgdG8gTiBjb25jdXJyZW50IGluc3RhbmNlcyBmb3IgZWFjaCBkYXRhIHNv
dXJjZSwgc28gdXAgdG8gTSAqIE4gdG90YWwKKy8vIGRhdGEgc291cmNlIGluc3RhbmNlcyBhcm91
bmQuCisvLyBFYWNoIGRhdGEgc291cmNlIGluc3RhbmNlIGNhbiBiZSBhY2Nlc3NlZCBieSBUIHRo
cmVhZHMgKG5vIHVwcGVyIGJvdW5kKS4KKy8vIFdlIGNhbiBzYWZlbHkgcHV0IGhhcmQgbGltaXRz
IGJvdGggdG8gTSBhbmQgTiAoaS5lLiBzYXkgdGhhdCB3ZSBzdXBwb3J0IGF0CisvLyBtb3N0IDMy
IGRhdGEgc291cmNlIHR5cGVzIHBlciBwcm9jZXNzIGFuZCB1cCB0byA4IGNvbmN1cnJlbnQgaW5z
dGFuY2VzKS4KKy8vCisvLyBXZSB3YW50IHRvIG1ha2UgaXQgc28gZnJvbSB0aGUgUGxhdGZvcm0g
dmlld3BvaW50LCB3ZSB1c2Ugb25seSBvbmUgZ2xvYmFsCisvLyBUTFMgb2JqZWN0LCBzbyBUIGlu
c3RhbmNlcyBpbiB0b3RhbCwgb25lIHBlciB0aHJlYWQsIHJlZ2FyZGxlc3Mgb2YgTSBhbmQgTi4K
Ky8vIFRoaXMgYWxsb3dzIHRvIGRlYWwgd2l0aCBhdC10aHJlYWQtZXhpdCBkZXN0cnVjdGlvbiBv
bmx5IGluIG9uZSBwbGFjZSwgcmF0aGVyCisvLyB0aGFuIE4sIE0gb3IgTSAqIE4uCisvLworLy8g
VmlzdWFsbHk6CisvLyAgICAgICAgICAgICAgICAgICAgIFsgICAgVGhyZWFkIDEgICBdIFsgICAg
VGhyZWFkIDIgICBdIFsgICAgVGhyZWFkIFQgICBdCisvLyAgICAgICAgICAgICAgICAgICAgICst
LS0tLS0tLS0tLS0tLS0rICstLS0tLS0tLS0tLS0tLS0rICstLS0tLS0tLS0tLS0tLS0rCisvLyBE
YXRhIHNvdXJjZSBGb28gICAgIHwgICAgICAgICAgICAgICB8IHwgICAgICAgICAgICAgICB8IHwg
ICAgICAgICAgICAgICB8CisvLyAgSW5zdGFuY2UgMSAgICAgICAgIHwgICAgIFRMUyAgICAgICB8
IHwgICAgIFRMUyAgICAgICB8IHwgICAgIFRMUyAgICAgICB8CisvLyAgSW5zdGFuY2UgMiAgICAg
ICAgIHwgICAgT2JqZWN0ICAgICB8IHwgICAgT2JqZWN0ICAgICB8IHwgICAgT2JqZWN0ICAgICB8
CisvLyAgSW5zdGFuY2UgMyAgICAgICAgIHwgICAgICAgICAgICAgICB8IHwgICAgICAgICAgICAg
ICB8IHwgICAgICAgICAgICAgICB8CisvLyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAg
ICAgICB8IHwgICAgICAgICAgICAgICB8IHwgICAgICAgICAgICAgICB8CisvLyBEYXRhIHNvdXJj
ZSBCYXIgICAgIHwgICAgICAgICAgICAgICB8IHwgICAgICAgICAgICAgICB8IHwgICAgICAgICAg
ICAgICB8CisvLyAgSW5zdGFuY2UgMSAgICAgICAgIHwgICAgICAgICAgICAgICB8IHwgICAgICAg
ICAgICAgICB8IHwgICAgICAgICAgICAgICB8CisvLyAgSW5zdGFuY2UgMiAgICAgICAgIHwgICAg
ICAgICAgICAgICB8IHwgICAgICAgICAgICAgICB8IHwgICAgICAgICAgICAgICB8CisvLyAgICAg
ICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rICstLS0tLS0tLS0tLS0tLS0rICstLS0t
LS0tLS0tLS0tLS0rCisvLworLy8gRWFjaCBUTFMgT2JqZWN0IGlzIG9yZ2FuaXplZCBhcyBhbiBh
cnJheSBvZiBNIERhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlLgorLy8gRWFjaCBEU1RMUyBpdHNl
bGYgaXMgYW4gYXJyYXkgb2YgdXAgdG8gTiBwZXItaW5zdGFuY2Ugb2JqZWN0cy4KKy8vIFRoZSBv
bmx5IHBlci1pbnN0YW5jZSBvYmplY3QgZm9yIG5vdyBpcyB0aGUgVHJhY2VXcml0ZXIuCisvLyBT
byBmb3IgZWFjaCBkYXRhIHNvdXJjZSwgZm9yIGVhY2ggaW5zdGFuY2UsIGZvciBlYWNoIHRocmVh
ZCB3ZSBrZWVwIG9uZQorLy8gVHJhY2VXcml0ZXIuCisvLyBUaGUgbG9va3VwIGlzIE8oMSk6IEdp
dmVuIHRoZSBUTFMgb2JqZWN0LCB0aGUgVHJhY2VXcml0ZXIgaXMganVzdCB0bHNbTV1bTl0uCitj
bGFzcyBUcmFjaW5nVExTIDogcHVibGljIFBsYXRmb3JtOjpUaHJlYWRMb2NhbE9iamVjdCB7Cisg
cHVibGljOgorICB+VHJhY2luZ1RMUygpIG92ZXJyaWRlOworCisgIC8vIFRoaXMgaXMgY2hlY2tl
ZCBhZ2FpbnN0IFRyYWNlTXV4ZXJJbXBsJ3MgZ2xvYmFsIGdlbmVyYXRpb24gY291bnRlciB0bwor
ICAvLyBoYW5kbGUgZGVzdHJ1Y3Rpb24gb2YgVHJhY2VXcml0ZXIocykgdGhhdCBiZWxvbmcgdG8g
ZGF0YSBzb3VyY2VzIHRoYXQKKyAgLy8gaGF2ZSBiZWVuIHN0b3BwZWQuIFdoZW4gdGhlIHR3byBu
dW1iZXJzIGRpdmVyZ2UsIGEgc2NhbiBvZiBhbGwgdGhlCisgIC8vIHRocmVhZC1sb2NhbCBUcmFj
ZVdyaXRlcihzKSBpcyBpc3N1ZWQuCisgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwOworCisgIC8v
IEJ5IGRlZmF1bHQgYWxsIGRhdGEgc291cmNlIGluc3RhbmNlcyBoYXZlIGluZGVwZW5kZW50IHRo
cmVhZC1sb2NhbCBzdGF0ZQorICAvLyAoc2VlIGFib3ZlKS4KKyAgc3RkOjphcnJheTxEYXRhU291
cmNlVGhyZWFkTG9jYWxTdGF0ZSwga01heERhdGFTb3VyY2VzPiBkYXRhX3NvdXJjZXNfdGxze307
CisKKyAgLy8gVHJhY2sgZXZlbnQgZGF0YSBzb3VyY2VzLCBob3dldmVyLCBzaGFyZSB0aGUgc2Ft
ZSB0aHJlYWQtbG9jYWwgc3RhdGUgaW4KKyAgLy8gb3JkZXIgdG8gYmUgYWJsZSB0byBzaGFyZSB0
cmFjZSB3cml0ZXJzIGFuZCBpbnRlcm5pbmcgc3RhdGUgYWNyb3NzIGFsbAorICAvLyB0cmFjayBl
dmVudCBjYXRlZ29yaWVzLgorICBEYXRhU291cmNlVGhyZWFkTG9jYWxTdGF0ZSB0cmFja19ldmVu
dF90bHN7fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNl
IHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFM
X1RSQUNJTkdfVExTX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJ
TkdfSU5URVJOQUxfVFJBQ0lOR19NVVhFUl9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1RS
QUNJTkdfSU5URVJOQUxfVFJBQ0lOR19NVVhFUl9IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2lu
Y2x1ZGUgPG1lbW9yeT4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL2Jh
c2ljX3R5cGVzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNpbmdfdGxzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3BsYXRmb3JtLmgiCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIFRyYWNlV3JpdGVy
QmFzZTsKK3N0cnVjdCBUcmFjaW5nSW5pdEFyZ3M7CitjbGFzcyBUcmFjaW5nU2Vzc2lvbjsKKwor
bmFtZXNwYWNlIGludGVybmFsIHsKKworc3RydWN0IERhdGFTb3VyY2VTdGF0aWNTdGF0ZTsKKwor
Ly8gVGhpcyBjbGFzcyBhY3RzIGFzIGEgYnJpZGdlIGJldHdlZW4gdGhlIHB1YmxpYyBBUEkgbWV0
aG9kcyBhbmQgdGhlCisvLyBUcmFjaW5nQmFja2VuZChzKS4gSXQgZXhwb3NlcyBhIHNpbXBsaWZp
ZWQgdmlldyBvZiB0aGUgd29ybGQgdG8gdGhlIEFQSQorLy8gbWV0aG9kcywgc28gdGhhdCB0aGV5
IGRvbid0IGhhdmUgdG8gY2FyZSBhYm91dCB0aGUgbXVsdGlwbGljaXR5IG9mIGJhY2tlbmRzLgor
Ly8gSXQgaGFuZGxlcyBhbGwgdGhlIGJvb2trZWVwaW5nIHRvIG1hcCBkYXRhIHNvdXJjZSBpbnN0
YW5jZXMgYW5kIHRyYWNlIHdyaXRlcnMKKy8vIHRvIHRoZSB2YXJpb3VzIGJhY2tlbmRzLgorLy8g
U2VlIHRyYWNpbmdfbXV4ZXJfaW1wbC5oIGZvciB0aGUgZnVsbCBwaWN0dXJlLiBUaGlzIGNsYXNz
IGNvbnRhaW5zIG9ubHkgdGhlCisvLyBmZXdlciBmaWVsZHMgYW5kIG1ldGhvZHMgdGhhdCBuZWVk
IHRvIGJlIGV4cG9zZWQgdG8gcHVibGljLyBoZWFkZXJzLiBGaWVsZHMKKy8vIGFuZCBtZXRob2Rz
IHRoYXQgYXJlIHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGVtIHNob3VsZCBnbyBpbnRvCisvLyBz
cmMvdHJhY2luZy9pbnRlcm5hbC90cmFjaW5nX211eGVyX2ltcGwuaCBpbnN0ZWFkOiB0aGF0IG9u
ZSBjYW4gcHVsbCBpbgorLy8gcGVyZmV0dG8gaGVhZGVycyBvdXRzaWRlIG9mIHB1YmxpYywgdGhp
cyBvbmUgY2Fubm90LgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNpbmdNdXhlciB7CisgcHVi
bGljOgorICBzdGF0aWMgVHJhY2luZ011eGVyKiBHZXQoKSB7IHJldHVybiBpbnN0YW5jZV87IH0K
KworICB2aXJ0dWFsIH5UcmFjaW5nTXV4ZXIoKTsKKworICBUcmFjaW5nVExTKiBHZXRPckNyZWF0
ZVRyYWNpbmdUTFMoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYWNpbmdUTFMqPihwbGF0
Zm9ybV8tPkdldE9yQ3JlYXRlVGhyZWFkTG9jYWxPYmplY3QoKSk7CisgIH0KKworICAvLyBUaGlz
IG1ldGhvZCBjYW4gZmFpbCBhbmQgcmV0dXJuIGZhbHNlIGlmIHRyeWluZyB0byByZWdpc3RlciBt
b3JlIHRoYW4KKyAgLy8ga01heERhdGFTb3VyY2VzIHR5cGVzLgorICB1c2luZyBEYXRhU291cmNl
RmFjdG9yeSA9IHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPERhdGFTb3VyY2VCYXNlPigp
PjsKKyAgdmlydHVhbCBib29sIFJlZ2lzdGVyRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlRGVz
Y3JpcHRvciYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUZh
Y3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZVN0YXRp
Y1N0YXRlKikgPSAwOworCisgIC8vIEl0IGlkZW50aWZpZXMgdGhlIHJpZ2h0IGJhY2tlbmQgYW5k
IGZvcndhcmRzIHRoZSBjYWxsIHRvIGl0LgorICAvLyBUaGUgcmV0dXJuZWQgVHJhY2VXcml0ZXIg
bXVzdCBiZSB1c2VkIHdpdGhpbiB0aGUgc2FtZSBzZXF1ZW5jZSAoZm9yIG1vc3QKKyAgLy8gcHJv
amVjdHMgdGhpcyBtZWFucyAic2FtZSB0aHJlYWQiKS4gQWx0ZXJuYXRpdmVseSB0aGUgY2xpZW50
IG5lZWRzIHRvIHRha2UKKyAgLy8gY2FyZSBvZiB1c2luZyBzeW5jaHJvbml6YXRpb24gcHJpbWl0
aXZlcyB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzZXMuCisgIHZpcnR1YWwgc3RkOjp1bmlx
dWVfcHRyPFRyYWNlV3JpdGVyQmFzZT4gQ3JlYXRlVHJhY2VXcml0ZXIoCisgICAgICBEYXRhU291
cmNlU3RhdGUqLAorICAgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5IGJ1ZmZlcl9leGhhdXN0ZWRf
cG9saWN5KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lTdG9wcGVkVHJhY2VXcml0ZXJz
Rm9yQ3VycmVudFRocmVhZCgpID0gMDsKKworICB1aW50MzJfdCBnZW5lcmF0aW9uKHN0ZDo6bWVt
b3J5X29yZGVyIG9yZCkgeyByZXR1cm4gZ2VuZXJhdGlvbl8ubG9hZChvcmQpOyB9CisKKyBwcm90
ZWN0ZWQ6CisgIGV4cGxpY2l0IFRyYWNpbmdNdXhlcihQbGF0Zm9ybSogcGxhdGZvcm0pIDogcGxh
dGZvcm1fKHBsYXRmb3JtKSB7fQorCisgIHN0YXRpYyBUcmFjaW5nTXV4ZXIqIGluc3RhbmNlXzsK
KyAgUGxhdGZvcm0qIGNvbnN0IHBsYXRmb3JtXyA9IG51bGxwdHI7CisKKyAgLy8gSW5jcmVtZW50
ZWQgZXZlcnkgdGltZSBhIGRhdGEgc291cmNlIGlzIGRlc3Ryb3llZC4gU2VlIHRyYWNpbmdfdGxz
LmguCisgIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBnZW5lcmF0aW9uX3t9OworfTsKKworfSAgLy8g
bmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAv
LyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfVFJBQ0lOR19NVVhFUl9IXworLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2xv
Y2tlZF9oYW5kbGUuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVu
IFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNl
LCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBm
aWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9i
dGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBh
Y2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBh
cHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3Ry
aWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFT
SVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0
aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNp
ZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVu
ZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5H
X0xPQ0tFRF9IQU5ETEVfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0xPQ0tF
RF9IQU5ETEVfSF8KKworI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
CisvLyBUaGlzIGlzIHVzZWQgZm9yIEdldERhdGFTb3VyY2VMb2NrZWQoKSwgaW4gdGhlIChyYXJl
KSBjYXNlIHdoZXJlIHRoZQorLy8gdHJhY2luZyBjb2RlIHdhbnRzIHRvIGFjY2VzcyB0aGUgc3Rh
dGUgb2YgaXRzIGRhdGEgc291cmNlIGZyb20gdGhlIFRyYWNlKCkKKy8vIG1ldGhvZC4KK3RlbXBs
YXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTG9ja2VkSGFuZGxlIHsKKyBwdWJsaWM6CisgIExvY2tl
ZEhhbmRsZShzdGQ6OnJlY3Vyc2l2ZV9tdXRleCogbXR4LCBUKiBvYmopIDogbG9ja18oKm10eCks
IG9ial8ob2JqKSB7fQorICBMb2NrZWRIYW5kbGUoKSA9IGRlZmF1bHQ7ICAvLyBGb3IgdGhlIGlu
dmFsaWQgY2FzZS4KKyAgTG9ja2VkSGFuZGxlKExvY2tlZEhhbmRsZSYmKSA9IGRlZmF1bHQ7Cisg
IExvY2tlZEhhbmRsZSYgb3BlcmF0b3I9KExvY2tlZEhhbmRsZSYmKSA9IGRlZmF1bHQ7CisKKyAg
Ym9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG9ial87IH0KKyAgZXhwbGljaXQgb3BlcmF0b3Ig
Ym9vbCgpIGNvbnN0IHsgcmV0dXJuIHZhbGlkKCk7IH0KKworICBUKiBvcGVyYXRvci0+KCkgewor
ICAgIGFzc2VydCh2YWxpZCgpKTsKKyAgICByZXR1cm4gb2JqXzsKKyAgfQorCisgIFQmIG9wZXJh
dG9yKigpIHsgcmV0dXJuICoodGhpcy0+b3BlcmF0b3ItPigpKTsgfQorCisgcHJpdmF0ZToKKyAg
c3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9ja187CisgIFQqIG9ial8g
PSBudWxscHRyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8g
SU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0xPQ0tFRF9IQU5ETEVfSF8KKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2VfcGFja2V0
LnBiemVyby5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZl
dHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2Vk
IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwor
ICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRo
ZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cisg
KgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAq
CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdy
aXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0
cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENP
TkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUg
dGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lv
bnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVm
IElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1BBQ0tFRF9SRVBFQVRFRF9GSUVMRFNfSF8KKyNk
ZWZpbmUgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUEFDS0VEX1JFUEVBVEVEX0ZJRUxEU19I
XworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxt
ZW1vcnk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwcm90b3plcm8geworCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3Nl
cyB1c2VkIHdoZW4gZW5jb2RpbmcgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KKy8vIFRvIGVuY29k
ZSBzdWNoIGEgZmllbGQsIHRoZSBjYWxsZXIgaXMgZmlyc3QgZXhwZWN0ZWQgdG8gYWNjdW11bGF0
ZSBhbGwgb2YgdGhlCisvLyB2YWx1ZXMgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgKGRl
cGVuZGluZyBvbiB0aGUgd2lyZSB0eXBlIG9mIHRoZQorLy8gaW5kaXZpZHVhbCBlbGVtZW50cyks
IGRlZmluZWQgYmVsb3c6CisvLyAqIHByb3RvemVybzo6UGFja2VkVmFySW50CisvLyAqIHByb3Rv
emVybzo6UGFja2VkRml4ZWRTaXplSW50PC8qZWxlbWVudF90eXBlPSovIHVpbnQzMl90PgorLy8g
VGhlbiB0aGF0IGJ1ZmZlciBpcyBwYXNzZWQgdG8gdGhlIHByb3RvemVyby1nZW5lcmF0ZWQgc2V0
dGVycyBhcyBhbiBhcmd1bWVudC4KKy8vIEFmdGVyIGNhbGxpbmcgdGhlIHNldHRlciwgdGhlIGJ1
ZmZlciBjYW4gYmUgZGVzdHJveWVkLgorLy8KKy8vIEFuIGV4YW1wbGUgb2YgZW5jb2RpbmcgYSBw
YWNrZWQgZmllbGQ6CisvLyAgIHByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPHByb3RvemVybzo6TWVz
c2FnZT4gbXNnOworLy8gICBwcm90b3plcm86OlBhY2tlZFZhckludCBidWY7CisvLyAgIGJ1Zi5B
cHBlbmQoNDIpOworLy8gICBidWYuQXBwZW5kKC0xKTsKKy8vICAgbXNnLT5zZXRfZmllbGRuYW1l
KGJ1Zik7CisvLyAgIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworCitjbGFzcyBQYWNrZWRCdWZm
ZXJCYXNlIHsKKyBwdWJsaWM6CisgIFBhY2tlZEJ1ZmZlckJhc2UoKSB7IFJlc2V0KCk7IH0KKwor
ICAvLyBDb3B5IG9yIG1vdmUgaXMgZGlzYWJsZWQgZHVlIHRvIHBvaW50ZXJzIHRvIHN0YWNrIGFk
ZHJlc3Nlcy4KKyAgUGFja2VkQnVmZmVyQmFzZShjb25zdCBQYWNrZWRCdWZmZXJCYXNlJikgPSBk
ZWxldGU7CisgIFBhY2tlZEJ1ZmZlckJhc2UoUGFja2VkQnVmZmVyQmFzZSYmKSA9IGRlbGV0ZTsK
KyAgUGFja2VkQnVmZmVyQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFBhY2tlZEJ1ZmZlckJhc2UmKSA9
IGRlbGV0ZTsKKyAgUGFja2VkQnVmZmVyQmFzZSYgb3BlcmF0b3I9KFBhY2tlZEJ1ZmZlckJhc2Um
JikgPSBkZWxldGU7CisKKyAgdm9pZCBSZXNldCgpOworCisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEo
KSBjb25zdCB7IHJldHVybiBzdG9yYWdlX2JlZ2luXzsgfQorCisgIHNpemVfdCBzaXplKCkgY29u
c3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHdyaXRlX3B0cl8gLSBzdG9yYWdl
X2JlZ2luXyk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBHcm93SWZOZWVkZWQoKSB7Cisg
ICAgUEVSRkVUVE9fRENIRUNLKHdyaXRlX3B0cl8gPj0gc3RvcmFnZV9iZWdpbl8gJiYgd3JpdGVf
cHRyXyA8PSBzdG9yYWdlX2VuZF8pOworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWSh3cml0ZV9w
dHJfICsga01heEVsZW1lbnRTaXplID4gc3RvcmFnZV9lbmRfKSkgeworICAgICAgR3Jvd1Nsb3dw
YXRoKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBHcm93U2xvd3BhdGgoKTsKKworICAvLyBtYXgo
dWludDY0X3QgdmFyaW50IGVuY29kaW5nLCBiaWdnZXN0IGZpeGVkIHR5cGUgKHVpbnQ2NCkpLgor
ICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4RWxlbWVudFNpemUgPSAxMDsKKworICAvLyBT
byBzaXplb2YodGhpcykgPT0gOGsuCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtPblN0YWNr
U3RvcmFnZVNpemUgPSA4MTkyIC0gMzI7CisKKyAgdWludDhfdCogc3RvcmFnZV9iZWdpbl87Cisg
IHVpbnQ4X3QqIHN0b3JhZ2VfZW5kXzsKKyAgdWludDhfdCogd3JpdGVfcHRyXzsKKyAgc3RkOjp1
bmlxdWVfcHRyPHVpbnQ4X3RbXT4gaGVhcF9idWZfOworICBhbGlnbmFzKHVpbnQ2NF90KSB1aW50
OF90IHN0YWNrX2J1Zl9ba09uU3RhY2tTdG9yYWdlU2l6ZV07Cit9OworCitjbGFzcyBQYWNrZWRW
YXJJbnQgOiBwdWJsaWMgUGFja2VkQnVmZmVyQmFzZSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVD4KKyAgdm9pZCBBcHBlbmQoVCB2YWx1ZSkgeworICAgIEdyb3dJZk5lZWRlZCgp
OworICAgIHdyaXRlX3B0cl8gPSBwcm90b191dGlsczo6V3JpdGVWYXJJbnQodmFsdWUsIHdyaXRl
X3B0cl8pOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCAvKiBlLmcuIHVpbnQzMl90
IGZvciBGaXhlZDMyICovPgorY2xhc3MgUGFja2VkRml4ZWRTaXplSW50IDogcHVibGljIFBhY2tl
ZEJ1ZmZlckJhc2UgeworIHB1YmxpYzoKKyAgdm9pZCBBcHBlbmQoVCB2YWx1ZSkgeworICAgIHN0
YXRpY19hc3NlcnQoc2l6ZW9mKFQpID09IDQgfHwgc2l6ZW9mKFQpID09IDgsCisgICAgICAgICAg
ICAgICAgICAiUGFja2VkRml4ZWRTaXplSW50IHNob3VsZCBiZSB1c2VkIG9ubHkgd2l0aCAzMi82
NC1iaXQgaW50cyIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpIDw9IGtNYXhFbGVtZW50
U2l6ZSwKKyAgICAgICAgICAgICAgICAgICJrTWF4RWxlbWVudFNpemUgbmVlZHMgdG8gYmUgdXBk
YXRlZCIpOworICAgIEdyb3dJZk5lZWRlZCgpOworICAgIFBFUkZFVFRPX0RDSEVDSyhyZWludGVy
cHJldF9jYXN0PHNpemVfdD4od3JpdGVfcHRyXykgJSBhbGlnbm9mKFQpID09IDApOworICAgIG1l
bWNweShyZWludGVycHJldF9jYXN0PFQqPih3cml0ZV9wdHJfKSwgJnZhbHVlLCBzaXplb2YoVCkp
OworICAgIHdyaXRlX3B0cl8gKz0gc2l6ZW9mKFQpOworICB9Cit9OworCit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG96ZXJvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEU19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjog
aW5jbHVkZS9wZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3RvemVyby9maWVsZC5oCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19GSUVMRF9IXworI2Rl
ZmluZSBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19GSUVMRF9IXworCisjaW5jbHVkZSA8c3Rk
aW50Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9jb250aWd1b3VzX21lbW9yeV9yYW5nZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFj
ZSBwcm90b3plcm8geworCitzdHJ1Y3QgQ29uc3RCeXRlcyB7CisgIHN0ZDo6c3RyaW5nIFRvU3Rk
U3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0
PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSk7CisgIH0KKworICBjb25zdCB1aW50OF90KiBkYXRh
OworICBzaXplX3Qgc2l6ZTsKK307CisKK3N0cnVjdCBDb25zdENoYXJzIHsKKyAgLy8gQWxsb3cg
aW1wbGljaXQgY29udmVyc2lvbiB0byBwZXJmZXR0bydzIGJhc2U6OlN0cmluZ1ZpZXcgd2l0aG91
dCBkZXBlbmRpbmcKKyAgLy8gb24gcGVyZmV0dG8vYmFzZSBvciB2aWNldmVyc2EuCisgIHN0YXRp
YyBjb25zdGV4cHIgYm9vbCBrQ29udmVydGlibGVUb1N0cmluZ1ZpZXcgPSB0cnVlOworICBzdGQ6
OnN0cmluZyBUb1N0ZFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6c3RyaW5nKGRhdGEsIHNp
emUpOyB9CisKKyAgY29uc3QgY2hhciogZGF0YTsKKyAgc2l6ZV90IHNpemU7Cit9OworCisvLyBB
IHByb3RvYnVmIGZpZWxkIGRlY29kZWQgYnkgdGhlIHByb3RvemVybyBwcm90byBkZWNvZGVycy4g
SXQgZXhwb3NlcworLy8gY29udmVuaWVuY2UgYWNjZXNzb3JzIHdpdGggbWluaW1hbCBkZWJ1ZyBj
aGVja3MuCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgYm90aCBieSB0aGUgaXRlcmF0b3ItYmFzZWQg
UHJvdG9EZWNvZGVyIGFuZCBieSB0aGUKKy8vIG9uZS1zaG90IFR5cGVkUHJvdG9EZWNvZGVyLgor
Ly8gSWYgdGhlIGZpZWxkIGlzIG5vdCB2YWxpZCB0aGUgYWNjZXNzb3JzIGNvbnNpc3RlbnRseSBy
ZXR1cm4gemVyby1pbnRlZ2VycyBvcgorLy8gbnVsbCBzdHJpbmdzLgorY2xhc3MgRmllbGQgewor
IHB1YmxpYzoKKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIGlkXyAhPSAwOyB9CisgIHVp
bnQxNl90IGlkKCkgY29uc3QgeyByZXR1cm4gaWRfOyB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIGJv
b2woKSBjb25zdCB7IHJldHVybiB2YWxpZCgpOyB9CisKKyAgcHJvdG9fdXRpbHM6OlByb3RvV2ly
ZVR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICBhdXRvIHJlcyA9IHN0YXRpY19jYXN0PHByb3RvX3V0
aWxzOjpQcm90b1dpcmVUeXBlPih0eXBlXyk7CisgICAgUEVSRkVUVE9fRENIRUNLKHJlcyA9PSBw
cm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCB8fAorICAgICAgICAgICAgICAgICAg
ICByZXMgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtMZW5ndGhEZWxpbWl0ZWQgfHwK
KyAgICAgICAgICAgICAgICAgICAgcmVzID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjpr
Rml4ZWQzMiB8fAorICAgICAgICAgICAgICAgICAgICByZXMgPT0gcHJvdG9fdXRpbHM6OlByb3Rv
V2lyZVR5cGU6OmtGaXhlZDY0KTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgYm9vbCBhc19i
b29sKCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSyghdmFsaWQoKSB8fCB0eXBlKCkgPT0g
cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQpOworICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxib29sPihpbnRfdmFsdWVfKTsKKyAgfQorCisgIHVpbnQzMl90IGFzX3VpbnQzMigpIGNv
bnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3RvX3V0
aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50IHx8CisgICAgICAgICAgICAgICAgICAgIHR5cGUo
KSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIpOworICAgIHJldHVybiBz
dGF0aWNfY2FzdDx1aW50MzJfdD4oaW50X3ZhbHVlXyk7CisgIH0KKworICBpbnQzMl90IGFzX2lu
dDMyKCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSyghdmFsaWQoKSB8fCB0eXBlKCkgPT0g
cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQgfHwKKyAgICAgICAgICAgICAgICAg
ICAgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprRml4ZWQzMik7CisgICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KGludF92YWx1ZV8pOworICB9CisKKyAgaW50MzJf
dCBhc19zaW50MzIoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgpIHx8IHR5
cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCk7CisgICAgcmV0dXJu
IHByb3RvX3V0aWxzOjpaaWdaYWdEZWNvZGUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGludF92YWx1
ZV8pKTsKKyAgfQorCisgIHVpbnQ2NF90IGFzX3VpbnQ2NCgpIGNvbnN0IHsKKyAgICBQRVJGRVRU
T19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBl
OjprVmFySW50IHx8CisgICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBwcm90b191dGlsczo6
UHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09
IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprRml4ZWQ2NCk7CisgICAgcmV0dXJuIGludF92
YWx1ZV87CisgIH0KKworICBpbnQ2NF90IGFzX2ludDY0KCkgY29uc3QgeworICAgIFBFUkZFVFRP
X0RDSEVDSyghdmFsaWQoKSB8fCB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6
OmtWYXJJbnQgfHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQ
cm90b1dpcmVUeXBlOjprRml4ZWQzMiB8fAorICAgICAgICAgICAgICAgICAgICB0eXBlKCkgPT0g
cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtGaXhlZDY0KTsKKyAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8aW50NjRfdD4oaW50X3ZhbHVlXyk7CisgIH0KKworICBpbnQ2NF90IGFzX3NpbnQ2NCgp
IGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3Rv
X3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50KTsKKyAgICByZXR1cm4gcHJvdG9fdXRpbHM6
OlppZ1phZ0RlY29kZShzdGF0aWNfY2FzdDx1aW50NjRfdD4oaW50X3ZhbHVlXykpOworICB9CisK
KyAgZmxvYXQgYXNfZmxvYXQoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgp
IHx8IHR5cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIpOworICAg
IGZsb2F0IHJlczsKKyAgICB1aW50MzJfdCB2YWx1ZTMyID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+
KGludF92YWx1ZV8pOworICAgIG1lbWNweSgmcmVzLCAmdmFsdWUzMiwgc2l6ZW9mKHJlcykpOwor
ICAgIHJldHVybiByZXM7CisgIH0KKworICBkb3VibGUgYXNfZG91YmxlKCkgY29uc3QgeworICAg
IFBFUkZFVFRPX0RDSEVDSyghdmFsaWQoKSB8fCB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3Rv
V2lyZVR5cGU6OmtGaXhlZDY0KTsKKyAgICBkb3VibGUgcmVzOworICAgIG1lbWNweSgmcmVzLCAm
aW50X3ZhbHVlXywgc2l6ZW9mKHJlcykpOworICAgIHJldHVybiByZXM7CisgIH0KKworICBDb25z
dENoYXJzIGFzX3N0cmluZygpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkg
fHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVU
eXBlOjprTGVuZ3RoRGVsaW1pdGVkKTsKKyAgICByZXR1cm4gQ29uc3RDaGFyc3tyZWludGVycHJl
dF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhKCkpLCBzaXplX307CisgIH0KKworICBzdGQ6OnN0cmlu
ZyBhc19zdGRfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gYXNfc3RyaW5nKCkuVG9TdGRTdHJpbmco
KTsgfQorCisgIENvbnN0Qnl0ZXMgYXNfYnl0ZXMoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENI
RUNLKCF2YWxpZCgpIHx8CisgICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBwcm90b191dGls
czo6UHJvdG9XaXJlVHlwZTo6a0xlbmd0aERlbGltaXRlZCk7CisgICAgcmV0dXJuIENvbnN0Qnl0
ZXN7ZGF0YSgpLCBzaXplX307CisgIH0KKworICBjb25zdCB1aW50OF90KiBkYXRhKCkgY29uc3Qg
eworICAgIFBFUkZFVFRPX0RDSEVDSyghdmFsaWQoKSB8fAorICAgICAgICAgICAgICAgICAgICB0
eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtMZW5ndGhEZWxpbWl0ZWQpOwor
ICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpbnRfdmFsdWVfKTsK
KyAgfQorCisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSyghdmFs
aWQoKSB8fAorICAgICAgICAgICAgICAgICAgICB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3Rv
V2lyZVR5cGU6OmtMZW5ndGhEZWxpbWl0ZWQpOworICAgIHJldHVybiBzaXplXzsKKyAgfQorCisg
IHVpbnQ2NF90IHJhd19pbnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBpbnRfdmFsdWVfOyB9CisK
KyAgdm9pZCBpbml0aWFsaXplKHVpbnQxNl90IGlkLAorICAgICAgICAgICAgICAgICAgdWludDhf
dCB0eXBlLAorICAgICAgICAgICAgICAgICAgdWludDY0X3QgaW50X3ZhbHVlLAorICAgICAgICAg
ICAgICAgICAgdWludDMyX3Qgc2l6ZSkgeworICAgIGlkXyA9IGlkOworICAgIHR5cGVfID0gdHlw
ZTsKKyAgICBpbnRfdmFsdWVfID0gaW50X3ZhbHVlOworICAgIHNpemVfID0gc2l6ZTsKKyAgfQor
CisgIC8vIEZvciB1c2Ugd2l0aCB0ZW1wbGF0ZXMuIFRoaXMgaXMgdXNlZCBieSBSZXBlYXRlZEZp
ZWxkSXRlcmF0b3I6Om9wZXJhdG9yKigpLgorICB2b2lkIGdldChib29sKiB2YWwpIGNvbnN0IHsg
KnZhbCA9IGFzX2Jvb2woKTsgfQorICB2b2lkIGdldCh1aW50MzJfdCogdmFsKSBjb25zdCB7ICp2
YWwgPSBhc191aW50MzIoKTsgfQorICB2b2lkIGdldChpbnQzMl90KiB2YWwpIGNvbnN0IHsgKnZh
bCA9IGFzX2ludDMyKCk7IH0KKyAgdm9pZCBnZXQodWludDY0X3QqIHZhbCkgY29uc3QgeyAqdmFs
ID0gYXNfdWludDY0KCk7IH0KKyAgdm9pZCBnZXQoaW50NjRfdCogdmFsKSBjb25zdCB7ICp2YWwg
PSBhc19pbnQ2NCgpOyB9CisgIHZvaWQgZ2V0KGZsb2F0KiB2YWwpIGNvbnN0IHsgKnZhbCA9IGFz
X2Zsb2F0KCk7IH0KKyAgdm9pZCBnZXQoZG91YmxlKiB2YWwpIGNvbnN0IHsgKnZhbCA9IGFzX2Rv
dWJsZSgpOyB9CisgIHZvaWQgZ2V0KHN0ZDo6c3RyaW5nKiB2YWwpIGNvbnN0IHsgKnZhbCA9IGFz
X3N0ZF9zdHJpbmcoKTsgfQorICB2b2lkIGdldChDb25zdENoYXJzKiB2YWwpIGNvbnN0IHsgKnZh
bCA9IGFzX3N0cmluZygpOyB9CisgIHZvaWQgZ2V0KENvbnN0Qnl0ZXMqIHZhbCkgY29uc3QgeyAq
dmFsID0gYXNfYnl0ZXMoKTsgfQorICB2b2lkIGdldF9zaWduZWQoaW50MzJfdCogdmFsKSBjb25z
dCB7ICp2YWwgPSBhc19zaW50MzIoKTsgfQorICB2b2lkIGdldF9zaWduZWQoaW50NjRfdCogdmFs
KSBjb25zdCB7ICp2YWwgPSBhc19zaW50NjQoKTsgfQorCisgIC8vIEZvciBlbnVtIHR5cGVzLgor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUg
c3RkOjplbmFibGVfaWY8c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSwgVD46OnR5cGU+CisgIHZvaWQg
Z2V0KFQqIHZhbCkgY29uc3QgeworICAgICp2YWwgPSBzdGF0aWNfY2FzdDxUPihhc19pbnQzMigp
KTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZXMgdGhlIGZpZWxkIGJhY2sgaW50byBhIHByb3RvLWVu
Y29kZWQgYnl0ZSBzdHJlYW0gYW5kIGFwcGVuZHMgaXQKKyAgLy8gdG8gfGRzdHwuIHxkc3R8IGlz
IHJlc2l6ZWQgYWNjb3JkaW5nbHkuCisgIHZvaWQgU2VyaWFsaXplQW5kQXBwZW5kVG8oc3RkOjpz
dHJpbmcqIGRzdCkgY29uc3Q7CisKKyAgLy8gU2VyaWFsaXplcyB0aGUgZmllbGQgYmFjayBpbnRv
IGEgcHJvdG8tZW5jb2RlZCBieXRlIHN0cmVhbSBhbmQgYXBwZW5kcyBpdAorICAvLyB0byB8ZHN0
fC4gfGRzdHwgaXMgcmVzaXplZCBhY2NvcmRpbmdseS4KKyAgdm9pZCBTZXJpYWxpemVBbmRBcHBl
bmRUbyhzdGQ6OnZlY3Rvcjx1aW50OF90PiogZHN0KSBjb25zdDsKKworIHByaXZhdGU6CisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIHZvaWQgU2VyaWFsaXplQW5kQXBwZW5kVG9J
bnRlcm5hbChDb250YWluZXIqIGRzdCkgY29uc3Q7CisKKyAgLy8gRmllbGRzIGFyZSBkZWxpYmVy
YXRlbHkgbm90IGluaXRpYWxpemVkIHRvIGtlZXAgdGhlIGNsYXNzIHRyaXZpYWxseQorICAvLyBj
b25zdHJ1Y3RpYmxlLiBJdCBtYWtlcyBhIGxhcmdlIHBlcmYgZGlmZmVyZW5jZSBmb3IgUHJvdG9E
ZWNvZGVyLgorCisgIHVpbnQ2NF90IGludF92YWx1ZV87ICAvLyBJbiBrTGVuZ3RoRGVsaW1pdGVk
IHRoaXMgY29udGFpbnMgdGhlIGRhdGEoKSBhZGRyLgorICB1aW50MzJfdCBzaXplXzsgICAgICAg
Ly8gT25seSB2YWxpZCB3aGVuIHdoZW4gdHlwZSA9PSBrTGVuZ3RoRGVsaW1pdGVkLgorICB1aW50
MTZfdCBpZF87ICAgICAgICAgLy8gUHJvdG8gZmllbGQgb3JkaW5hbC4KKyAgdWludDhfdCB0eXBl
XzsgICAgICAgIC8vIHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlLgorfTsKKworLy8gVGhlIEZp
ZWxkIHN0cnVjdCBpcyB1c2VkIGluIGEgbG90IG9mIHBlcmYtc2Vuc2l0aXZlIGNvbnRleHRzLgor
c3RhdGljX2Fzc2VydChzaXplb2YoRmllbGQpID09IDE2LCAiRmllbGQgc3RydWN0IHRvbyBiaWci
KTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVS
RkVUVE9fUFJPVE9aRVJPX0ZJRUxEX0hfCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBB
bmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBh
Y2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90
IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAq
IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0
cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJl
cXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2Fy
ZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
IkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFO
WSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZv
ciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGlt
aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZF
VFRPX1BST1RPWkVST19QUk9UT19ERUNPREVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9f
UFJPVE9aRVJPX1BST1RPX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1
ZGUgPGFycmF5PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvY29tcGlsZXIu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
bG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL2ZpZWxkLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHByb3Rv
emVybyB7CisKKy8vIEEgZ2VuZXJpYyBwcm90b2J1ZiBkZWNvZGVyLiBEb2Vzbid0IHJlcXVpcmUg
YW55IGtub3dsZWRnZSBhYm91dCB0aGUgcHJvdG8KKy8vIHNjaGVtYS4gSXQgdG9rZW5pemVzIGZp
ZWxkcywgcmV0cmlldmVzIHRoZWlyIElEIGFuZCB0eXBlIGFuZCBleHBvc2VzCisvLyBhY2Nlc3Nv
cnMgdG8gcmV0cmlldmUgaXRzIHZhbHVlcy4KKy8vIEl0IGRvZXMgTk9UIHJlY3Vyc2UgaW4gbmVz
dGVkIHN1Ym1lc3NhZ2VzLCBpbnN0ZWFkIGl0IGp1c3QgY29tcHV0ZXMgdGhlaXIKKy8vIGJvdW5k
YXJpZXMsIHJlY3Vyc2lvbiBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuCisvLyBUaGlzIGNsYXNzIGlz
IGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gcGVyZi1zZW5zaXRpdmUgY29udGV4dHMuIEl0IGRvZXMg
bm90CisvLyBhbGxvY2F0ZSBhbmQgZG9lcyBub3QgcGVyZm9ybSBhbnkgcHJvdG8gc2VtYW50aWMg
Y2hlY2tzIChlLmcuIHJlcGVhdGVkIC8KKy8vIHJlcXVpcmVkIC8gb3B0aW9uYWwpLiBJdCdzIHN1
cHBvc2VkbHkgc2FmZSB3cnQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMKKy8vIChzZWUg
cHJvdG9fZGVjb2Rlcl9mdXp6ZXIuY2MpLgorLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYWxzbyBhcyBh
IGJ1aWxkaW5nIGJsb2NrIGZvciBUeXBlZFByb3RvRGVjb2RlciwgdXNlZCB3aGVuCisvLyB0aGUg
c2NoZW1hIGlzIGtub3duIGF0IGNvbXBpbGUgdGltZS4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBQ
cm90b0RlY29kZXIgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIFByb3RvRGVjb2RlciB1c2lu
ZyB0aGUgZ2l2ZW4gfGJ1ZmZlcnwgd2l0aCBzaXplIHxsZW5ndGh8IGJ5dGVzLgorICBQcm90b0Rl
Y29kZXIoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQorICAgICAgOiBiZWdpbl8o
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSksCisgICAgICAgIGVuZF8o
YmVnaW5fICsgbGVuZ3RoKSwKKyAgICAgICAgcmVhZF9wdHJfKGJlZ2luXykge30KKyAgUHJvdG9E
ZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIDogUHJvdG9EZWNvZGVyKHN0ci5kYXRhKCks
IHN0ci5zaXplKCkpIHt9CisgIFByb3RvRGVjb2Rlcihjb25zdCBDb25zdEJ5dGVzJiBjYikgOiBQ
cm90b0RlY29kZXIoY2IuZGF0YSwgY2Iuc2l6ZSkge30KKworICAvLyBSZWFkcyB0aGUgbmV4dCBm
aWVsZCBmcm9tIHRoZSBidWZmZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFkIGN1cnNvci4gSWYgYQor
ICAvLyBmdWxsIGZpZWxkIGNhbm5vdCBiZSByZWFkLCB0aGUgcmV0dXJuZWQgRmllbGQgd2lsbCBi
ZSBpbnZhbGlkIChpLmUuCisgIC8vIGZpZWxkLnZhbGlkKCkgPT0gZmFsc2UpLgorICBGaWVsZCBS
ZWFkRmllbGQoKTsKKworICAvLyBGaW5kcyB0aGUgZmlyc3QgZmllbGQgd2l0aCB0aGUgZ2l2ZW4g
aWQuIERvZXNuJ3QgYWZmZWN0IHRoZSByZWFkIGN1cnNvci4KKyAgRmllbGQgRmluZEZpZWxkKHVp
bnQzMl90IGZpZWxkX2lkKTsKKworICAvLyBSZXNldHMgdGhlIHJlYWQgY3Vyc29yIHRvIHRoZSBz
dGFydCBvZiB0aGUgYnVmZmVyLgorICB2b2lkIFJlc2V0KCkgeyByZWFkX3B0cl8gPSBiZWdpbl87
IH0KKworICAvLyBSZXNldHMgdGhlIHJlYWQgY3Vyc29yIHRvIHRoZSBnaXZlbiBwb3NpdGlvbiAo
bXVzdCBiZSB3aXRoaW4gdGhlIGJ1ZmZlcikuCisgIHZvaWQgUmVzZXQoY29uc3QgdWludDhfdCog
cG9zKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKHBvcyA+PSBiZWdpbl8gJiYgcG9zIDwgZW5kXyk7
CisgICAgcmVhZF9wdHJfID0gcG9zOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgcG9zaXRpb24g
b2YgcmVhZCBjdXJzb3IsIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICBz
aXplX3QgcmVhZF9vZmZzZXQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJl
YWRfcHRyXyAtIGJlZ2luXyk7IH0KKworICBzaXplX3QgYnl0ZXNfbGVmdCgpIGNvbnN0IHsKKyAg
ICBQRVJGRVRUT19EQ0hFQ0socmVhZF9wdHJfIDw9IGVuZF8pOworICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxzaXplX3Q+KGVuZF8gLSByZWFkX3B0cl8pOworICB9CisKKyAgY29uc3QgdWludDhfdCog
YmVnaW4oKSBjb25zdCB7IHJldHVybiBiZWdpbl87IH0KKyAgY29uc3QgdWludDhfdCogZW5kKCkg
Y29uc3QgeyByZXR1cm4gZW5kXzsgfQorCisgcHJvdGVjdGVkOgorICBjb25zdCB1aW50OF90KiBj
b25zdCBiZWdpbl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZF87CisgIGNvbnN0IHVpbnQ4
X3QqIHJlYWRfcHRyXyA9IG51bGxwdHI7Cit9OworCisvLyBBbiBpdGVyYXRvci1saWtlIGNsYXNz
IHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHJlcGVhdGVkIGZpZWxkcy4gVXNlZCBieQorLy8gVHlw
ZWRQcm90b0RlY29kZXIuIFRoZSBpdGVyYXRpb24gc2VxdWVuY2UgaXMgYSBiaXQgY291bnRlci1p
bnR1aXRpdmUgZHVlIHRvCisvLyB0aGUgZmFjdCB0aGF0IGZpZWxkc19bZmllbGRfaWRdIGhvbGRz
IHRoZSAqbGFzdCogdmFsdWUgb2YgdGhlIGZpZWxkLCBub3QgdGhlCisvLyBmaXJzdCwgYnV0IHRo
ZSByZW1haW5pbmcgc3RvcmFnZSBob2xkcyByZXBlYXRlZCBmaWVsZHMgaW4gRklGTyBvcmRlci4K
Ky8vIEFzc3VtZSB0aGF0IHdlIHB1c2ggdGhlIDEwLDExLDEyIGludG8gYSByZXBlYXRlZCBmaWVs
ZCB3aXRoIElEPTEuCisvLworLy8gRGVjb2RlciBtZW1vcnkgbGF5b3V0OiAgWyAgZmllbGRzIHN0
b3JhZ2UgIF0gWyByZXBlYXRlZCBmaWVsZHMgc3RvcmFnZSBdCisvLyAxc3QgaXRlcmF0aW9uOiAg
ICAgICAgICAgMTAKKy8vIDJuZCBpdGVyYXRpb246ICAgICAgICAgICAxMSAgICAgICAgICAgICAg
ICAgICAxMAorLy8gM3JkIGl0ZXJhdGlvbjogICAgICAgICAgIDEyICAgICAgICAgICAgICAgICAg
IDEwIDExCisvLworLy8gV2Ugc3RhcnQgdGhlIGl0ZXJhdGlvbiBAIGZpZWxkc19bbnVtX2ZpZWxk
c10sIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKKy8vIHJlcGVhdGVkIGZpZWxkcyBzdG9yYWdl
LCBwcm9jZWVkIHVudGlsIHRoZSBlbmQgYW5kIGxhc3RseSBqdW1wIEAgZmllbGRzX1tpZF0uCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkRmllbGRJdGVyYXRvciB7CisgcHVi
bGljOgorICBSZXBlYXRlZEZpZWxkSXRlcmF0b3IodWludDMyX3QgZmllbGRfaWQsCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZCogYmVnaW4sCisgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBGaWVsZCogZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmll
bGQqIGxhc3QpCisgICAgICA6IGZpZWxkX2lkXyhmaWVsZF9pZCksIGl0ZXJfKGJlZ2luKSwgZW5k
XyhlbmQpLCBsYXN0XyhsYXN0KSB7CisgICAgRmluZE5leHRNYXRjaGluZ0lkKCk7CisgIH0KKwor
ICAvLyBDb25zdHJ1Y3RzIGFuIGludmFsaWQgaXRlcmF0b3IuCisgIFJlcGVhdGVkRmllbGRJdGVy
YXRvcigpCisgICAgICA6IGZpZWxkX2lkXygwdSksIGl0ZXJfKG51bGxwdHIpLCBlbmRfKG51bGxw
dHIpLCBsYXN0XyhudWxscHRyKSB7fQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25z
dCB7IHJldHVybiBpdGVyXyAhPSBlbmRfOyB9CisgIGNvbnN0IEZpZWxkJiBmaWVsZCgpIGNvbnN0
IHsgcmV0dXJuICppdGVyXzsgfQorCisgIFQgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIFQgdmFs
e307CisgICAgaXRlcl8tPmdldCgmdmFsKTsKKyAgICByZXR1cm4gdmFsOworICB9CisgIGNvbnN0
IEZpZWxkKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gaXRlcl87IH0KKworICBSZXBlYXRl
ZEZpZWxkSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKGl0ZXJf
ICE9IGVuZF8pOworICAgIGlmIChpdGVyXyA9PSBsYXN0XykgeworICAgICAgaXRlcl8gPSBlbmRf
OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICArK2l0ZXJfOworICAgIEZpbmROZXh0
TWF0Y2hpbmdJZCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFJlcGVhdGVkRmllbGRJ
dGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhpdGVyXyAhPSBl
bmRfKTsKKyAgICBSZXBlYXRlZEZpZWxkSXRlcmF0b3IgaXQoKnRoaXMpOworICAgICsrKCp0aGlz
KTsKKyAgICByZXR1cm4gaXQ7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgRmluZE5leHRNYXRj
aGluZ0lkKCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhpdGVyXyAhPSBsYXN0Xyk7CisgICAgZm9y
ICg7IGl0ZXJfICE9IGVuZF87ICsraXRlcl8pIHsKKyAgICAgIGlmIChpdGVyXy0+aWQoKSA9PSBm
aWVsZF9pZF8pCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXRlcl8gPSBsYXN0Xy0+dmFs
aWQoKSA/IGxhc3RfIDogZW5kXzsKKyAgfQorCisgIHVpbnQzMl90IGZpZWxkX2lkXzsKKworICAv
LyBJbml0aWFsbHkgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcGVhdGVkIGZpZWxk
IHN0b3JhZ2UsIHRoZW4gaXMKKyAgLy8gaW5jcmVtZW50ZWQgYXMgd2UgY2FsbCBvcGVyYXRvcisr
KCkuCisgIGNvbnN0IEZpZWxkKiBpdGVyXzsKKworICAvLyBBbHdheXMgcG9pbnRzIHRvIGZpZWxk
c19bc2l6ZV9dLCBpLmUuIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RvcmFnZS4KKyAgY29uc3QgRmll
bGQqIGVuZF87CisKKyAgLy8gQWx3YXlzIHBvaW50cyB0byBmaWVsZHNfW2ZpZWxkX2lkXS4KKyAg
Y29uc3QgRmllbGQqIGxhc3RfOworfTsKKworLy8gQXMgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yLCBi
dXQgYWxsb3dzIGl0ZXJhdGluZyBvdmVyIGEgcGFja2VkIHJlcGVhdGVkIGZpZWxkCisvLyAod2hp
Y2ggd2lsbCBiZSBpbml0aWFsbHkgc3RvcmVkIGFzIGEgc2luZ2xlIGxlbmd0aC1kZWxpbWl0ZWQg
ZmllbGQpLgorLy8gU2VlIHxHZXRQYWNrZWRSZXBlYXRlZEZpZWxkfCBmb3IgZGV0YWlscy4KKy8v
CisvLyBBc3N1bWVzIGxpdHRsZSBlbmRpYW5uZXNzLCBhbmQgdGhhdCB0aGUgaW5wdXQgYnVmZmVy
cyBhcmUgd2VsbCBmb3JtZWQgLQorLy8gY29udGFpbmluZyBhbiBleGFjdCBtdWx0aXBsZSBvZiBl
bmNvZGVkIGVsZW1lbnRzLgordGVtcGxhdGUgPHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlIHdp
cmVfdHlwZSwgdHlwZW5hbWUgQ3BwVHlwZT4KK2NsYXNzIFBhY2tlZFJlcGVhdGVkRmllbGRJdGVy
YXRvciB7CisgcHVibGljOgorICBQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3IoY29uc3QgdWlu
dDhfdCogZGF0YV9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBz
aXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcGFyc2VfZXJyb3JfcHRy
KQorICAgICAgOiBkYXRhX2VuZF8oZGF0YV9iZWdpbiA/IGRhdGFfYmVnaW4gKyBzaXplIDogbnVs
bHB0ciksCisgICAgICAgIHJlYWRfcHRyXyhkYXRhX2JlZ2luKSwKKyAgICAgICAgcGFyc2VfZXJy
b3JfKHBhcnNlX2Vycm9yX3B0cikgeworICAgIHVzaW5nIHByb3RvX3V0aWxzOjpQcm90b1dpcmVU
eXBlOworICAgIHN0YXRpY19hc3NlcnQod2lyZV90eXBlID09IFByb3RvV2lyZVR5cGU6OmtWYXJJ
bnQgfHwKKyAgICAgICAgICAgICAgICAgICAgICB3aXJlX3R5cGUgPT0gUHJvdG9XaXJlVHlwZTo6
a0ZpeGVkMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICB3aXJlX3R5cGUgPT0gUHJvdG9XaXJl
VHlwZTo6a0ZpeGVkNjQsCisgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0eXBlIik7CisKKyAg
ICBQRVJGRVRUT19EQ0hFQ0socGFyc2VfZXJyb3JfcHRyKTsKKworICAgIC8vIEVpdGhlciB0aGUg
ZmllbGQgaXMgdW5zZXQgKGFuZCB0aGVyZSBhcmUgbm8gZGF0YSBwb2ludGVyKSwgb3IgdGhlIGZp
ZWxkCisgICAgLy8gaXMgc2V0IHdpdGggYSB6ZXJvIGxlbmd0aCBwYXlsb2FkLiBNYXJrIHRoZSBp
dGVyYXRvciBhcyBpbnZhbGlkIGluIGJvdGgKKyAgICAvLyBjYXNlcy4KKyAgICBpZiAoc2l6ZSA9
PSAwKSB7CisgICAgICBjdXJyX3ZhbHVlX3ZhbGlkXyA9IGZhbHNlOworICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGlmICgod2lyZV90eXBlID09IFByb3RvV2lyZVR5cGU6OmtGaXhlZDMyICYm
IChzaXplICUgNCkgIT0gMCkgfHwKKyAgICAgICAgKHdpcmVfdHlwZSA9PSBQcm90b1dpcmVUeXBl
OjprRml4ZWQ2NCAmJiAoc2l6ZSAlIDgpICE9IDApKSB7CisgICAgICAqcGFyc2VfZXJyb3JfID0g
dHJ1ZTsKKyAgICAgIGN1cnJfdmFsdWVfdmFsaWRfID0gZmFsc2U7CisgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgKysoKnRoaXMpOworICB9CisKKyAgY29uc3QgQ3BwVHlwZSBvcGVyYXRvcioo
KSBjb25zdCB7IHJldHVybiBjdXJyX3ZhbHVlXzsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29s
KCkgY29uc3QgeyByZXR1cm4gY3Vycl92YWx1ZV92YWxpZF87IH0KKworICBQYWNrZWRSZXBlYXRl
ZEZpZWxkSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgdXNpbmcgcHJvdG9fdXRpbHM6OlBy
b3RvV2lyZVR5cGU7CisKKyAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkoIWN1cnJfdmFsdWVfdmFs
aWRfKSkKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWShy
ZWFkX3B0cl8gPT0gZGF0YV9lbmRfKSkgeworICAgICAgY3Vycl92YWx1ZV92YWxpZF8gPSBmYWxz
ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpZiAod2lyZV90eXBlID09IFBy
b3RvV2lyZVR5cGU6OmtWYXJJbnQpIHsKKyAgICAgIHVpbnQ2NF90IG5ld192YWx1ZSA9IDA7Cisg
ICAgICBjb25zdCB1aW50OF90KiBuZXdfcG9zID0KKyAgICAgICAgICBwcm90b191dGlsczo6UGFy
c2VWYXJJbnQocmVhZF9wdHJfLCBkYXRhX2VuZF8sICZuZXdfdmFsdWUpOworCisgICAgICBpZiAo
UEVSRkVUVE9fVU5MSUtFTFkobmV3X3BvcyA9PSByZWFkX3B0cl8pKSB7CisgICAgICAgIC8vIEZh
aWxlZCB0byBkZWNvZGUgdGhlIHZhcmludCAocHJvYmFibHkgaW5jb21wbGV0ZSBidWZmZXIpLgor
ICAgICAgICAqcGFyc2VfZXJyb3JfID0gdHJ1ZTsKKyAgICAgICAgY3Vycl92YWx1ZV92YWxpZF8g
PSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRfcHRyXyA9IG5ld19wb3M7Cisg
ICAgICAgIGN1cnJfdmFsdWVfID0gc3RhdGljX2Nhc3Q8Q3BwVHlwZT4obmV3X3ZhbHVlKTsKKyAg
ICAgIH0KKyAgICB9IGVsc2UgeyAgLy8ga0ZpeGVkMzIgb3Iga0ZpeGVkNjQKKyAgICAgIGNvbnN0
ZXhwciBzaXplX3Qga1N0ZXAgPSB3aXJlX3R5cGUgPT0gUHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIg
PyA0IDogODsKKworICAgICAgLy8gTkI6IHRoZSByYXcgYnVmZmVyIGlzIG5vdCBndWFyYW50ZWVk
IHRvIGJlIGFsaWduZWQsIHNvIG5laXRoZXIgYXJlCisgICAgICAvLyB0aGVzZSBjb3BpZXMuCisg
ICAgICBtZW1jcHkoJmN1cnJfdmFsdWVfLCByZWFkX3B0cl8sIHNpemVvZihDcHBUeXBlKSk7Cisg
ICAgICByZWFkX3B0cl8gKz0ga1N0ZXA7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworICB9
CisKKyAgUGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAg
UGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yIGl0KCp0aGlzKTsKKyAgICArKygqdGhpcyk7Cisg
ICAgcmV0dXJuIGl0OworICB9CisKKyBwcml2YXRlOgorICAvLyBNaWdodCBiZSBudWxsIGlmIHRo
ZSBiYWNraW5nIHByb3RvIGZpZWxkIGlzbid0IHNldC4KKyAgY29uc3QgdWludDhfdCogY29uc3Qg
ZGF0YV9lbmRfOworCisgIC8vIFRoZSBpdGVyYXRvciBsb29rcyBhaGVhZCBieSBhbiBlbGVtZW50
LCBzbyB8Y3Vycl92YWx1ZXwgaG9sZHMgdGhlIHZhbHVlCisgIC8vIHRvIGJlIHJldHVybmVkIHdo
ZW4gdGhlIGNhbGxlciBkZXJlZmVyZW5jZXMgdGhlIGl0ZXJhdG9yLCBhbmQgfHJlYWRfcHRyX3wK
KyAgLy8gcG9pbnRzIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIGRlY29k
ZWQuCisgIC8vIHxyZWFkX3B0cl98IG1pZ2h0IGJlIG51bGwgaWYgdGhlIGJhY2tpbmcgcHJvdG8g
ZmllbGQgaXNuJ3Qgc2V0LgorICBjb25zdCB1aW50OF90KiByZWFkX3B0cl87CisgIENwcFR5cGUg
Y3Vycl92YWx1ZV8gPSAwOworCisgIC8vIFNldCB0byBmYWxzZSBvbmNlIHdlJ3ZlIGV4aGF1c3Rl
ZCB0aGUgaXRlcmF0b3IsIG9yIGVuY291bnRlcmVkIGFuIGVycm9yLgorICBib29sIGN1cnJfdmFs
dWVfdmFsaWRfID0gdHJ1ZTsKKworICAvLyBXaGVyZSB0byBzZXQgcGFyc2luZyBlcnJvcnMsIHN1
cHBsaWVkIGJ5IHRoZSBjYWxsZXIuCisgIGJvb2wqIGNvbnN0IHBhcnNlX2Vycm9yXzsKK307CisK
Ky8vIFRoaXMgZGVjb2RlciBsb2FkcyBhbGwgZmllbGRzIHVwZnJvbnQsIHdpdGhvdXQgcmVjdXJz
aW5nIGluIG5lc3RlZCBtZXNzYWdlcy4KKy8vIEl0IGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZv
ciB0eXBlZCBkZWNvZGVycyBnZW5lcmF0ZWQgYnkgdGhlIHBiemVybyBwbHVnaW4uCisvLyBUaGUg
c3BsaXQgYmV0d2VlbiBUeXBlZFByb3RvRGVjb2RlckJhc2UgYW5kIFR5cGVkUHJvdG9EZWNvZGVy
PD4gaXMgdG8gaGF2ZQorLy8gdW5pcXVlIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIGxpa2UgUGFy
c2VBbGxGaWVsZHMoKSBhbmQgRXhwYW5kSGVhcFN0b3JhZ2UoKS4KKy8vIFRoZSBzdG9yYWdlIChl
aXRoZXIgb24tc3RhY2sgb3Igb24taGVhcCkgZm9yIHRoaXMgY2xhc3MgaXMgb3JnYW5pemVkIGFz
CisvLyBmb2xsb3dzOgorLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpZWxkc18gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vIFsgZmllbGQgMCAoaW52YWxpZCkgXSBbIGZpZWxkcyAx
IC4uIE4gXSBbIHJlcGVhdGVkIGZpZWxkcyBdCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgXgorLy8gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbnVtX2ZpZWxkc18gICAgICAgIHNpemVfCitjbGFzcyBQRVJG
RVRUT19FWFBPUlQgVHlwZWRQcm90b0RlY29kZXJCYXNlIDogcHVibGljIFByb3RvRGVjb2RlciB7
CisgcHVibGljOgorICAvLyBJZiB0aGUgZmllbGQgfGlkfCBpcyBrbm93biBhdCBjb21waWxlIHRp
bWUsIHByZWZlciB0aGUgdGVtcGxhdGVkCisgIC8vIHNwZWNpYWxpemF0aW9uIGF0PGtGaWVsZE51
bWJlcj4oKS4KKyAgY29uc3QgRmllbGQmIEdldCh1aW50MzJfdCBpZCkgY29uc3QgeworICAgIHJl
dHVybiBQRVJGRVRUT19MSUtFTFkoaWQgPCBudW1fZmllbGRzXykgPyBmaWVsZHNfW2lkXSA6IGZp
ZWxkc19bMF07CisgIH0KKworICAvLyBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGFsbG93cyB0byBp
dGVyYXRlIG92ZXIgYWxsIGluc3RhbmNlcyBvZiBhIHJlcGVhdGVkCisgIC8vIGZpZWxkIGdpdmVu
IGl0cyBpZC4gRXhhbXBsZSB1c2FnZToKKyAgLy8gICBmb3IgKGF1dG8gaXQgPSBkZWNvZGVyLkdl
dFJlcGVhdGVkPGludDMyX3Q+KE4pOyBpdDsgKytpdCkgeyAuLi4gfQorICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVD4KKyAgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPFQ+IEdldFJlcGVhdGVkKHVpbnQzMl90
IGZpZWxkX2lkKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRJdGVyYXRvcjxUPihm
aWVsZF9pZCwgJmZpZWxkc19bbnVtX2ZpZWxkc19dLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJmZpZWxkc19bc2l6ZV9dLCAmZmllbGRzX1tmaWVsZF9pZF0pOworICB9CisK
KyAgLy8gUmV0dXJucyBhbiBvYmplY3RzIHRoYXQgYWxsb3dzIHRvIGl0ZXJhdGUgb3ZlciBhbGwg
ZW50cmllcyBvZiBhIHBhY2tlZAorICAvLyByZXBlYXRlZCBmaWVsZCBnaXZlbiBpdHMgaWQgYW5k
IHR5cGUuIFRoZSB8d2lyZV90eXBlfCBpcyBuZWNlc3NhcnkgZm9yCisgIC8vIGRlY29kaW5nIHRo
ZSBwYWNrZWQgZmllbGQsIHRoZSB8Y3BwX3R5cGV8IGlzIGZvciBjb252ZW5pZW5jZSAmIHN0cm9u
Z2VyCisgIC8vIHR5cGluZy4KKyAgLy8KKyAgLy8gVGhlIGNhbGxlciBtdXN0IGFsc28gc3VwcGx5
IGEgcG9pbnRlciB0byBhIGJvb2wgdGhhdCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUKKyAgLy8gcGFj
a2VkIGJ1ZmZlciBpcyBmb3VuZCB0byBiZSBtYWxmb3JtZWQgd2hpbGUgaXRlcmF0aW5nIChzbyB5
b3UgbmVlZCB0bworICAvLyBleGhhdXN0IHRoZSBpdGVyYXRvciBpZiB5b3Ugd2FudCB0byBjaGVj
ayB0aGUgZnVsbCBleHRlbnQgb2YgdGhlIGJ1ZmZlcikuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB1
bmxpa2Ugc3RhbmRhcmQgcHJvdG9idWYgcGFyc2VycywgcHJvdG96ZXJvIGRvZXMgbm90IGFsbG93
CisgIC8vIHRyZWF0aW5nIG9mIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMgYXMgbm9uLXBhY2tlZCBh
bmQgdmljZS12ZXJzYSAodGhlcmVmb3JlCisgIC8vIG5vdCBtYWtpbmcgdGhlIHBhY2tlZCBvcHRp
b24gZm9yd2FyZHMgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlKS4gU28KKyAgLy8gdGhlIGNhbGxl
ciBuZWVkcyB0byB1c2UgdGhlIHJpZ2h0IGFjY2Vzc29yIGZvciBjb3JyZWN0IHJlc3VsdHMuCisg
IHRlbXBsYXRlIDxwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZSB3aXJlX3R5cGUsIHR5cGVuYW1l
IGNwcF90eXBlPgorICBQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3I8d2lyZV90eXBlLCBjcHBf
dHlwZT4gR2V0UGFja2VkUmVwZWF0ZWQoCisgICAgICB1aW50MzJfdCBmaWVsZF9pZCwKKyAgICAg
IGJvb2wqIHBhcnNlX2Vycm9yX2xvY2F0aW9uKSBjb25zdCB7CisgICAgY29uc3QgRmllbGQmIGZp
ZWxkID0gR2V0KGZpZWxkX2lkKTsKKyAgICBpZiAoZmllbGQudmFsaWQoKSkgeworICAgICAgcmV0
dXJuIFBhY2tlZFJlcGVhdGVkRmllbGRJdGVyYXRvcjx3aXJlX3R5cGUsIGNwcF90eXBlPigKKyAg
ICAgICAgICBmaWVsZC5kYXRhKCksIGZpZWxkLnNpemUoKSwgcGFyc2VfZXJyb3JfbG9jYXRpb24p
OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9y
PHdpcmVfdHlwZSwgY3BwX3R5cGU+KAorICAgICAgICAgIG51bGxwdHIsIDAsIHBhcnNlX2Vycm9y
X2xvY2F0aW9uKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgVHlwZWRQcm90b0RlY29k
ZXJCYXNlKEZpZWxkKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qg
bnVtX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAor
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmZmVyLAorICAgICAgICAg
ICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKKyAgICAgIDogUHJvdG9EZWNvZGVyKGJ1ZmZl
ciwgbGVuZ3RoKSwKKyAgICAgICAgZmllbGRzXyhzdG9yYWdlKSwKKyAgICAgICAgbnVtX2ZpZWxk
c18obnVtX2ZpZWxkcyksCisgICAgICAgIHNpemVfKG51bV9maWVsZHMpLAorICAgICAgICBjYXBh
Y2l0eV8oY2FwYWNpdHkpIHsKKyAgICAvLyBUaGUgcmVhc29uIHdoeSBGaWVsZCBuZWVkcyB0byBi
ZSB0cml2aWFsbHkgZGUvY29uc3RydWN0aWJsZSBpcyB0byBhdm9pZAorICAgIC8vIGltcGxpY2l0
IGluaXRpYWxpemVycyBvbiBhbGwgdGhlIH4xMDAwIGVudHJpZXMuIFdlIG5lZWQgaXQgdG8gaW5p
dGlhbGl6ZQorICAgIC8vIG9ubHkgb24gdGhlIGZpcnN0IHxtYXhfZmllbGRfaWR8IGZpZWxkcywg
dGhlIHJlbWFpbmluZyBjYXBhY2l0eSBkb2Vzbid0CisgICAgLy8gcmVxdWlyZSBpbml0aWFsaXph
dGlvbi4KKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU8
RmllbGQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfdHJpdmlhbGx5
X2Rlc3RydWN0aWJsZTxGaWVsZD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgc3Rk
Ojppc190cml2aWFsPEZpZWxkPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiRmllbGQgbXVz
dCBiZSBhIHRyaXZpYWwgYWdncmVnYXRlIHR5cGUiKTsKKyAgICBtZW1zZXQoZmllbGRzXywgMCwg
c2l6ZW9mKEZpZWxkKSAqIG51bV9maWVsZHNfKTsKKyAgfQorCisgIHZvaWQgUGFyc2VBbGxGaWVs
ZHMoKTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGUgZGVmYXVsdCBvbi1zdGFjayBzdG9yYWdlIGlz
IGV4aGF1c3RlZCBhbmQgbmV3IHJlcGVhdGVkCisgIC8vIGZpZWxkcyBuZWVkIHRvIGJlIHB1c2hl
ZC4KKyAgdm9pZCBFeHBhbmRIZWFwU3RvcmFnZSgpOworCisgIC8vIFVzZWQgb25seSBpbiBwcmVz
ZW5jZSBvZiBhIGxhcmdlIG51bWJlciBvZiByZXBlYXRlZCBmaWVsZHMsIHdoZW4gdGhlCisgIC8v
IGRlZmF1bHQgb24tc3RhY2sgc3RvcmFnZSBpcyBleGhhdXN0ZWQuCisgIHN0ZDo6dW5pcXVlX3B0
cjxGaWVsZFtdPiBoZWFwX3N0b3JhZ2VfOworCisgIC8vIFBvaW50cyB0byB0aGUgc3RvcmFnZSwg
ZWl0aGVyIG9uLXN0YWNrIChkZWZhdWx0LCBwcm92aWRlZCBieSB0aGUgdGVtcGxhdGUKKyAgLy8g
c3BlY2lhbGl6YXRpb24pIG9yIHxoZWFwX3N0b3JhZ2VffCBhZnRlciBFeHBhbmRIZWFwU3RvcmFn
ZSgpIGlzIGNhbGxlZCwgaW4KKyAgLy8gY2FzZSBvZiBhIGxhcmdlIG51bWJlciBvZiByZXBlYXRl
ZCBmaWVsZHMuCisgIEZpZWxkKiBmaWVsZHNfOworCisgIC8vIE51bWJlciBvZiBmaWVsZHMgd2l0
aG91dCBhY2NvdW50aW5nIHJlcGVhdGVkIHN0b3JhZ2UuIFRoaXMgaXMgZXF1YWwgdG8KKyAgLy8g
TUFYX0ZJRUxEX0lEICsgMSAodG8gYWNjb3VudCBmb3IgdGhlIGludmFsaWQgMHRoIGZpZWxkKS4K
KyAgLy8gVGhpcyB2YWx1ZSBpcyBhbHdheXMgPD0gc2l6ZV8gKGFuZCBoZW5jZSA8PSBjYXBhY2l0
eSk7CisgIHVpbnQzMl90IG51bV9maWVsZHNfOworCisgIC8vIE51bWJlciBvZiBhY3RpdmUgfGZp
ZWxkc198IGVudHJpZXMuIFRoaXMgaXMgaW5pdGlhbGx5IGVxdWFsIHRvIHRoZSBoaWdoZXN0Cisg
IC8vIG51bWJlciBvZiBmaWVsZHMgZm9yIHRoZSBtZXNzYWdlIChudW1fZmllbGRzXyA9PSBNQVhf
RklFTERfSUQgKyAxKSBhbmQgY2FuCisgIC8vIGdyb3cgdXAgdG8gfGNhcGFjaXR5X3wgaW4gdGhl
IGNhc2Ugb2YgcmVwZWF0ZWQgZmllbGRzLgorICB1aW50MzJfdCBzaXplXzsKKworICAvLyBJbml0
aWFsbHkgZXF1YWwgdG8ga0ZpZWxkc0NhcGFjaXR5IG9mIHRoZSBUeXBlZFByb3RvRGVjb2Rlcgor
ICAvLyBzcGVjaWFsaXphdGlvbi4gQ2FuIGdyb3cgd2hlbiBmYWxsaW5nIGJhY2sgb24gaGVhcC1i
YXNlZCBzdG9yYWdlLCBpbiB3aGljaAorICAvLyBjYXNlIGl0IHJlcHJlc2VudHMgdGhlIHNpemUg
KCNmaWVsZHMgd2l0aCBlYWNoIGVudHJ5IG9mIGEgcmVwZWF0ZWQgZmllbGQKKyAgLy8gY291bnRl
ZCBpbmRpdmlkdWFsbHkpIG9mIHRoZSB8aGVhcF9zdG9yYWdlX3wgYXJyYXkuCisgIHVpbnQzMl90
IGNhcGFjaXR5XzsKK307CisKKy8vIFRlbXBsYXRlIGNsYXNzIGluc3RhbnRpYXRlZCBieSB0aGUg
YXV0by1nZW5lcmF0ZWQgZGVjb2RlciBjbGFzc2VzIGRlY2xhcmVkIGluCisvLyB4eHgucGJ6ZXJv
LmggZmlsZXMuCit0ZW1wbGF0ZSA8aW50IE1BWF9GSUVMRF9JRCwgYm9vbCBIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz4KK2NsYXNzIFR5cGVkUHJvdG9EZWNvZGVyIDogcHVibGljIFR5cGVk
UHJvdG9EZWNvZGVyQmFzZSB7CisgcHVibGljOgorICBUeXBlZFByb3RvRGVjb2Rlcihjb25zdCB1
aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCisgICAgICA6IFR5cGVkUHJvdG9EZWNvZGVy
QmFzZShvbl9zdGFja19zdG9yYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q
bnVtX2ZpZWxkcz0qL01BWF9GSUVMRF9JRCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0
KE1BWF9GSUVMRF9JRCA8PSBrTWF4RGVjb2RlckZpZWxkSWQsICJGaWVsZCBvcmRpbmFsIHRvbyBo
aWdoIik7CisgICAgVHlwZWRQcm90b0RlY29kZXJCYXNlOjpQYXJzZUFsbEZpZWxkcygpOworICB9
CisKKyAgdGVtcGxhdGUgPHVpbnQzMl90IEZJRUxEX0lEPgorICBjb25zdCBGaWVsZCYgYXQoKSBj
b25zdCB7CisgICAgc3RhdGljX2Fzc2VydChGSUVMRF9JRCA8PSBNQVhfRklFTERfSUQsICJGSUVM
RF9JRCA+IE1BWF9GSUVMRF9JRCIpOworICAgIHJldHVybiBmaWVsZHNfW0ZJRUxEX0lEXTsKKyAg
fQorCisgIFR5cGVkUHJvdG9EZWNvZGVyKFR5cGVkUHJvdG9EZWNvZGVyJiYgb3RoZXIpIG5vZXhj
ZXB0CisgICAgICA6IFR5cGVkUHJvdG9EZWNvZGVyQmFzZShzdGQ6Om1vdmUob3RoZXIpKSB7Cisg
ICAgLy8gSWYgdGhlIG1vdmVkLWZyb20gZGVjb2RlciB3YXMgdXNpbmcgb24tc3RhY2sgc3RvcmFn
ZSwgd2UgbmVlZCB0byB1cGRhdGUKKyAgICAvLyBvdXIgcG9pbnRlciB0byBwb2ludCB0byB0aGlz
IGRlY29kZXIncyBvbi1zdGFjayBzdG9yYWdlLgorICAgIGlmIChmaWVsZHNfID09IG90aGVyLm9u
X3N0YWNrX3N0b3JhZ2VfKSB7CisgICAgICBmaWVsZHNfID0gb25fc3RhY2tfc3RvcmFnZV87Cisg
ICAgICBtZW1jcHkob25fc3RhY2tfc3RvcmFnZV8sIG90aGVyLm9uX3N0YWNrX3N0b3JhZ2VfLAor
ICAgICAgICAgICAgIHNpemVvZihvbl9zdGFja19zdG9yYWdlXykpOworICAgIH0KKyAgfQorCisg
cHJpdmF0ZToKKyAgLy8gSW4gdGhlIGNhc2Ugb2Ygbm9uLXJlcGVhdGVkIGZpZWxkcywgdGhpcyBj
b25zdGFudCBkZWZpbmVzIHRoZSBoaWdoZXN0IGZpZWxkCisgIC8vIGlkIHdlIGFyZSBhYmxlIHRv
IGRlY29kZS4gVGhpcyBpcyB0byBsaW1pdCB0aGUgb24tc3RhY2sgc3RvcmFnZS4KKyAgLy8gSW4g
dGhlIGNhc2Ugb2YgcmVwZWF0ZWQgZmllbGRzLCB0aGlzIGNvbnN0YW50IGRlZmluZXMgdGhlIG1h
eCBudW1iZXIgb2YKKyAgLy8gcmVwZWF0ZWQgZmllbGRzIHRoYXQgd2UnbGwgYmUgYWJsZSB0byBz
dG9yZSBiZWZvcmUgZmFsbGluZyBiYWNrIG9uIHRoZQorICAvLyBoZWFwLiBLZWVwIHRoaXMgdmFs
dWUgaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gcHJvdG96ZXJvX2dlbmVyYXRvci5jYy4KKyAgc3Rh
dGljIGNvbnN0ZXhwciBzaXplX3Qga01heERlY29kZXJGaWVsZElkID0gOTk5OworCisgIC8vIElm
IHdlIHRoZSBtZXNzYWdlIGhhcyBubyByZXBlYXRlZCBmaWVsZHMgd2UgbmVlZCBhdCBtb3N0IE4g
RmllbGQgZW50cmllcworICAvLyBpbiB0aGUgb24tc3RhY2sgc3RvcmFnZSwgd2hlcmUgTiBpcyB0
aGUgaGlnaGVzdCBmaWVsZCBpZC4KKyAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgc29tZSByb29tIHRv
IHN0b3JlIHJlcGVhdGVkIGZpZWxkcy4KKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFj
aXR5ID0KKyAgICAgIDEgKyAoSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFMgPyBrTWF4RGVj
b2RlckZpZWxkSWQgOiBNQVhfRklFTERfSUQpOworCisgIEZpZWxkIG9uX3N0YWNrX3N0b3JhZ2Vf
W2tDYXBhY2l0eV07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKKyNlbmRpZiAg
Ly8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUFJPVE9fREVDT0RFUl9IXworLy8gQXV0b2dl
bmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisK
KyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDRV9QQUNL
RVRfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFD
RV9UUkFDRV9QQUNLRVRfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUg
PHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIEFuZHJvaWRM
b2dQYWNrZXQ7CitjbGFzcyBCYXR0ZXJ5Q291bnRlcnM7CitjbGFzcyBDaHJvbWVCZW5jaG1hcmtN
ZXRhZGF0YTsKK2NsYXNzIENocm9tZUV2ZW50QnVuZGxlOworY2xhc3MgQ2hyb21lTWV0YWRhdGFQ
YWNrZXQ7CitjbGFzcyBDbG9ja1NuYXBzaG90OworY2xhc3MgQ3B1SW5mbzsKK2NsYXNzIERlb2Jm
dXNjYXRpb25NYXBwaW5nOworY2xhc3MgRnRyYWNlRXZlbnRCdW5kbGU7CitjbGFzcyBGdHJhY2VT
dGF0czsKK2NsYXNzIEdwdUNvdW50ZXJFdmVudDsKK2NsYXNzIEdwdUxvZzsKK2NsYXNzIEdwdU1l
bVRvdGFsRXZlbnQ7CitjbGFzcyBHcHVSZW5kZXJTdGFnZUV2ZW50OworY2xhc3MgR3JhcGhpY3NG
cmFtZUV2ZW50OworY2xhc3MgSGVhcEdyYXBoOworY2xhc3MgSW5pdGlhbERpc3BsYXlTdGF0ZTsK
K2NsYXNzIElub2RlRmlsZU1hcDsKK2NsYXNzIEludGVybmVkRGF0YTsKK2NsYXNzIE1vZHVsZVN5
bWJvbHM7CitjbGFzcyBQYWNrYWdlc0xpc3Q7CitjbGFzcyBQZXJmU2FtcGxlOworY2xhc3MgUGVy
ZmV0dG9NZXRhdHJhY2U7CitjbGFzcyBQb3dlclJhaWxzOworY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0
b3I7CitjbGFzcyBQcm9jZXNzU3RhdHM7CitjbGFzcyBQcm9jZXNzVHJlZTsKK2NsYXNzIFByb2Zp
bGVQYWNrZXQ7CitjbGFzcyBQcm9maWxlZEZyYW1lU3ltYm9sczsKK2NsYXNzIFNtYXBzUGFja2V0
OworY2xhc3MgU3RyZWFtaW5nUHJvZmlsZVBhY2tldDsKK2NsYXNzIFN5c1N0YXRzOworY2xhc3Mg
U3lzdGVtSW5mbzsKK2NsYXNzIFRlc3RFdmVudDsKK2NsYXNzIFRocmVhZERlc2NyaXB0b3I7Citj
bGFzcyBUcmFjZUNvbmZpZzsKK2NsYXNzIFRyYWNlUGFja2V0RGVmYXVsdHM7CitjbGFzcyBUcmFj
ZVN0YXRzOworY2xhc3MgVHJhY2luZ1NlcnZpY2VFdmVudDsKK2NsYXNzIFRyYWNrRGVzY3JpcHRv
cjsKK2NsYXNzIFRyYWNrRXZlbnQ7CitjbGFzcyBUcmlnZ2VyOworY2xhc3MgVnVsa2FuQXBpRXZl
bnQ7CitjbGFzcyBWdWxrYW5NZW1vcnlFdmVudDsKKworZW51bSBUcmFjZVBhY2tldF9TZXF1ZW5j
ZUZsYWdzIDogaW50MzJfdCB7CisgIFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3NfU0VRX1VOU1BF
Q0lGSUVEID0gMCwKKyAgVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19TRVFfSU5DUkVNRU5UQUxf
U1RBVEVfQ0xFQVJFRCA9IDEsCisgIFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3NfU0VRX05FRURT
X0lOQ1JFTUVOVEFMX1NUQVRFID0gMiwKK307CisKK2NvbnN0IFRyYWNlUGFja2V0X1NlcXVlbmNl
RmxhZ3MgVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19NSU4gPSBUcmFjZVBhY2tldF9TZXF1ZW5j
ZUZsYWdzX1NFUV9VTlNQRUNJRklFRDsKK2NvbnN0IFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3Mg
VHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19NQVggPSBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdz
X1NFUV9ORUVEU19JTkNSRU1FTlRBTF9TVEFURTsKKworY2xhc3MgVHJhY2VQYWNrZXRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki85MDAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgVHJhY2VQYWNrZXRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVHJhY2VQYWNr
ZXRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBUcmFjZVBhY2tldF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc190aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc190aW1lc3RhbXBfY2xvY2tfaWQoKSBjb25zdCB7IHJldHVybiBhdDw1
OD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHRpbWVzdGFtcF9jbG9ja19pZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDU4PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3Byb2Nlc3NfdHJlZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBwcm9jZXNzX3RyZWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfcHJvY2Vzc19zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwcm9jZXNzX3N0YXRzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8OT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lub2RlX2ZpbGVfbWFwKCkg
Y29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIGlub2RlX2ZpbGVfbWFwKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19ieXRlcygpOyB9
CisgIGJvb2wgaGFzX2Nocm9tZV9ldmVudHMoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2hyb21lX2V2ZW50cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jbG9ja19zbmFwc2hvdCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBjbG9ja19zbmFwc2hvdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19zeXNfc3RhdHMoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc3lzX3N0YXRzKCkgY29uc3QgeyByZXR1cm4g
YXQ8Nz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3RyYWNrX2V2ZW50KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0cmFj
a19ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MzM+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyB0cmFjZV9jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwz
Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Z0cmFjZV9zdGF0cygpIGNvbnN0IHsgcmV0
dXJuIGF0PDM0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZnRyYWNl
X3N0YXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8MzQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c190cmFjZV9zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM1PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgdHJhY2Vfc3RhdHMoKSBjb25zdCB7IHJldHVybiBhdDwzNT4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Byb2ZpbGVfcGFja2V0KCkgY29uc3QgeyByZXR1
cm4gYXQ8Mzc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwcm9maWxl
X3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfYmF0dGVyeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgYmF0dGVyeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM4PigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfcG93ZXJfcmFpbHMoKSBjb25zdCB7IHJldHVybiBhdDw0MD4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHBvd2VyX3JhaWxzKCkgY29u
c3QgeyByZXR1cm4gYXQ8NDA+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19hbmRyb2lkX2xv
ZygpIGNvbnN0IHsgcmV0dXJuIGF0PDM5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMgYW5kcm9pZF9sb2coKSBjb25zdCB7IHJldHVybiBhdDwzOT4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX3N5c3RlbV9pbmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8NDU+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzeXN0ZW1faW5mbygpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfdHJpZ2dlcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
dHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfcGFja2FnZXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ3PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcGFja2FnZXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDQ3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2hyb21lX2JlbmNobWFya19tZXRhZGF0
YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMgY2hyb21lX2JlbmNobWFya19tZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ4
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfcGVyZmV0dG9fbWV0YXRyYWNlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8NDk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBw
ZXJmZXR0b19tZXRhdHJhY2UoKSBjb25zdCB7IHJldHVybiBhdDw0OT4oKS5hc19ieXRlcygpOyB9
CisgIGJvb2wgaGFzX2Nocm9tZV9tZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDUxPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2hyb21lX21ldGFkYXRhKCkgY29u
c3QgeyByZXR1cm4gYXQ8NTE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19ncHVfY291bnRl
cl9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDUyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgZ3B1X2NvdW50ZXJfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw1Mj4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2dwdV9yZW5kZXJfc3RhZ2VfZXZlbnQoKSBjb25z
dCB7IHJldHVybiBhdDw1Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGdwdV9yZW5kZXJfc3RhZ2VfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw1Mz4oKS5hc19ieXRl
cygpOyB9CisgIGJvb2wgaGFzX3N0cmVhbWluZ19wcm9maWxlX3BhY2tldCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDU0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc3RyZWFt
aW5nX3Byb2ZpbGVfcGFja2V0KCkgY29uc3QgeyByZXR1cm4gYXQ8NTQ+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19oZWFwX2dyYXBoKCkgY29uc3QgeyByZXR1cm4gYXQ8NTY+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBoZWFwX2dyYXBoKCkgY29uc3QgeyByZXR1
cm4gYXQ8NTY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19ncmFwaGljc19mcmFtZV9ldmVu
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMgZ3JhcGhpY3NfZnJhbWVfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw1Nz4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Z1bGthbl9tZW1vcnlfZXZlbnQoKSBjb25zdCB7IHJl
dHVybiBhdDw2Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHZ1bGth
bl9tZW1vcnlfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw2Mj4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX2dwdV9sb2coKSBjb25zdCB7IHJldHVybiBhdDw2Mz4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGdwdV9sb2coKSBjb25zdCB7IHJldHVybiBhdDw2Mz4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Z1bGthbl9hcGlfZXZlbnQoKSBjb25zdCB7IHJl
dHVybiBhdDw2NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHZ1bGth
bl9hcGlfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw2NT4oKS5hc19ieXRlcygpOyB9CisgIGJv
b2wgaGFzX3BlcmZfc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gYXQ8NjY+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwZXJmX3NhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDY2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY3B1X2luZm8oKSBjb25zdCB7IHJldHVy
biBhdDw2Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNwdV9pbmZv
KCkgY29uc3QgeyByZXR1cm4gYXQ8Njc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19zbWFw
c19wYWNrZXQoKSBjb25zdCB7IHJldHVybiBhdDw2OD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzIHNtYXBzX3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY4PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2VydmljZV9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDY5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc2VydmljZV9ldmVu
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfaW5p
dGlhbF9kaXNwbGF5X3N0YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8NzA+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBpbml0aWFsX2Rpc3BsYXlfc3RhdGUoKSBjb25zdCB7
IHJldHVybiBhdDw3MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2dwdV9tZW1fdG90YWxf
ZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw3MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzIGdwdV9tZW1fdG90YWxfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw3MT4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Byb2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSBjb25z
dCB7IHJldHVybiBhdDw1NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IHByb2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSBjb25zdCB7IHJldHVybiBhdDw1NT4oKS5hc19ieXRl
cygpOyB9CisgIGJvb2wgaGFzX21vZHVsZV9zeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gYXQ8NjE+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBtb2R1bGVfc3ltYm9scygp
IGNvbnN0IHsgcmV0dXJuIGF0PDYxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZGVvYmZ1
c2NhdGlvbl9tYXBwaW5nKCkgY29uc3QgeyByZXR1cm4gYXQ8NjQ+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBkZW9iZnVzY2F0aW9uX21hcHBpbmcoKSBjb25zdCB7IHJl
dHVybiBhdDw2ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3RyYWNrX2Rlc2NyaXB0b3Io
KSBjb25zdCB7IHJldHVybiBhdDw2MD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIHRyYWNrX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBhdDw2MD4oKS5hc19ieXRl
cygpOyB9CisgIGJvb2wgaGFzX3Byb2Nlc3NfZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIGF0
PDQzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcHJvY2Vzc19kZXNj
cmlwdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8NDM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c190aHJlYWRfZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ0PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdGhyZWFkX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJl
dHVybiBhdDw0ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Z0cmFjZV9ldmVudHMoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgZnRyYWNlX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19zeW5jaHJvbml6YXRpb25fbWFya2VyKCkgY29uc3QgeyByZXR1cm4gYXQ8MzY+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzeW5jaHJvbml6YXRpb25f
bWFya2VyKCkgY29uc3QgeyByZXR1cm4gYXQ8MzY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19jb21wcmVzc2VkX3BhY2tldHMoKSBjb25zdCB7IHJldHVybiBhdDw1MD4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNvbXByZXNzZWRfcGFja2V0cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDUwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZm9yX3Rlc3RpbmcoKSBj
b25zdCB7IHJldHVybiBhdDw5MDA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBmb3JfdGVzdGluZygpIGNvbnN0IHsgcmV0dXJuIGF0PDkwMD4oKS5hc19ieXRlcygpOyB9
CisgIGJvb2wgaGFzX3RydXN0ZWRfdWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgp
OyB9CisgIGludDMyX3QgdHJ1c3RlZF91aWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2lu
dDMyKCk7IH0KKyAgYm9vbCBoYXNfdHJ1c3RlZF9wYWNrZXRfc2VxdWVuY2VfaWQoKSBjb25zdCB7
IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHRydXN0ZWRfcGFja2V0X3Nl
cXVlbmNlX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9v
bCBoYXNfaW50ZXJuZWRfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEyPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW50ZXJuZWRfZGF0YSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDEyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2VxdWVuY2VfZmxhZ3MoKSBjb25z
dCB7IHJldHVybiBhdDwxMz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHNlcXVlbmNlX2ZsYWdz
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfaW5j
cmVtZW50YWxfc3RhdGVfY2xlYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQxPigpLnZhbGlkKCk7
IH0KKyAgYm9vbCBpbmNyZW1lbnRhbF9zdGF0ZV9jbGVhcmVkKCkgY29uc3QgeyByZXR1cm4gYXQ8
NDE+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3RyYWNlX3BhY2tldF9kZWZhdWx0cygpIGNv
bnN0IHsgcmV0dXJuIGF0PDU5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgdHJhY2VfcGFja2V0X2RlZmF1bHRzKCkgY29uc3QgeyByZXR1cm4gYXQ8NTk+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19wcmV2aW91c19wYWNrZXRfZHJvcHBlZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDQyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBwcmV2aW91c19wYWNrZXRfZHJvcHBlZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDQyPigpLmFzX2Jvb2woKTsgfQorfTsKKworY2xhc3MgVHJhY2VQ
YWNrZXQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IFRyYWNlUGFja2V0X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
VGltZXN0YW1wRmllbGROdW1iZXIgPSA4LAorICAgIGtUaW1lc3RhbXBDbG9ja0lkRmllbGROdW1i
ZXIgPSA1OCwKKyAgICBrUHJvY2Vzc1RyZWVGaWVsZE51bWJlciA9IDIsCisgICAga1Byb2Nlc3NT
dGF0c0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrSW5vZGVGaWxlTWFwRmllbGROdW1iZXIgPSA0LAor
ICAgIGtDaHJvbWVFdmVudHNGaWVsZE51bWJlciA9IDUsCisgICAga0Nsb2NrU25hcHNob3RGaWVs
ZE51bWJlciA9IDYsCisgICAga1N5c1N0YXRzRmllbGROdW1iZXIgPSA3LAorICAgIGtUcmFja0V2
ZW50RmllbGROdW1iZXIgPSAxMSwKKyAgICBrVHJhY2VDb25maWdGaWVsZE51bWJlciA9IDMzLAor
ICAgIGtGdHJhY2VTdGF0c0ZpZWxkTnVtYmVyID0gMzQsCisgICAga1RyYWNlU3RhdHNGaWVsZE51
bWJlciA9IDM1LAorICAgIGtQcm9maWxlUGFja2V0RmllbGROdW1iZXIgPSAzNywKKyAgICBrQmF0
dGVyeUZpZWxkTnVtYmVyID0gMzgsCisgICAga1Bvd2VyUmFpbHNGaWVsZE51bWJlciA9IDQwLAor
ICAgIGtBbmRyb2lkTG9nRmllbGROdW1iZXIgPSAzOSwKKyAgICBrU3lzdGVtSW5mb0ZpZWxkTnVt
YmVyID0gNDUsCisgICAga1RyaWdnZXJGaWVsZE51bWJlciA9IDQ2LAorICAgIGtQYWNrYWdlc0xp
c3RGaWVsZE51bWJlciA9IDQ3LAorICAgIGtDaHJvbWVCZW5jaG1hcmtNZXRhZGF0YUZpZWxkTnVt
YmVyID0gNDgsCisgICAga1BlcmZldHRvTWV0YXRyYWNlRmllbGROdW1iZXIgPSA0OSwKKyAgICBr
Q2hyb21lTWV0YWRhdGFGaWVsZE51bWJlciA9IDUxLAorICAgIGtHcHVDb3VudGVyRXZlbnRGaWVs
ZE51bWJlciA9IDUyLAorICAgIGtHcHVSZW5kZXJTdGFnZUV2ZW50RmllbGROdW1iZXIgPSA1MywK
KyAgICBrU3RyZWFtaW5nUHJvZmlsZVBhY2tldEZpZWxkTnVtYmVyID0gNTQsCisgICAga0hlYXBH
cmFwaEZpZWxkTnVtYmVyID0gNTYsCisgICAga0dyYXBoaWNzRnJhbWVFdmVudEZpZWxkTnVtYmVy
ID0gNTcsCisgICAga1Z1bGthbk1lbW9yeUV2ZW50RmllbGROdW1iZXIgPSA2MiwKKyAgICBrR3B1
TG9nRmllbGROdW1iZXIgPSA2MywKKyAgICBrVnVsa2FuQXBpRXZlbnRGaWVsZE51bWJlciA9IDY1
LAorICAgIGtQZXJmU2FtcGxlRmllbGROdW1iZXIgPSA2NiwKKyAgICBrQ3B1SW5mb0ZpZWxkTnVt
YmVyID0gNjcsCisgICAga1NtYXBzUGFja2V0RmllbGROdW1iZXIgPSA2OCwKKyAgICBrU2Vydmlj
ZUV2ZW50RmllbGROdW1iZXIgPSA2OSwKKyAgICBrSW5pdGlhbERpc3BsYXlTdGF0ZUZpZWxkTnVt
YmVyID0gNzAsCisgICAga0dwdU1lbVRvdGFsRXZlbnRGaWVsZE51bWJlciA9IDcxLAorICAgIGtQ
cm9maWxlZEZyYW1lU3ltYm9sc0ZpZWxkTnVtYmVyID0gNTUsCisgICAga01vZHVsZVN5bWJvbHNG
aWVsZE51bWJlciA9IDYxLAorICAgIGtEZW9iZnVzY2F0aW9uTWFwcGluZ0ZpZWxkTnVtYmVyID0g
NjQsCisgICAga1RyYWNrRGVzY3JpcHRvckZpZWxkTnVtYmVyID0gNjAsCisgICAga1Byb2Nlc3NE
ZXNjcmlwdG9yRmllbGROdW1iZXIgPSA0MywKKyAgICBrVGhyZWFkRGVzY3JpcHRvckZpZWxkTnVt
YmVyID0gNDQsCisgICAga0Z0cmFjZUV2ZW50c0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrU3luY2hy
b25pemF0aW9uTWFya2VyRmllbGROdW1iZXIgPSAzNiwKKyAgICBrQ29tcHJlc3NlZFBhY2tldHNG
aWVsZE51bWJlciA9IDUwLAorICAgIGtGb3JUZXN0aW5nRmllbGROdW1iZXIgPSA5MDAsCisgICAg
a1RydXN0ZWRVaWRGaWVsZE51bWJlciA9IDMsCisgICAga1RydXN0ZWRQYWNrZXRTZXF1ZW5jZUlk
RmllbGROdW1iZXIgPSAxMCwKKyAgICBrSW50ZXJuZWREYXRhRmllbGROdW1iZXIgPSAxMiwKKyAg
ICBrU2VxdWVuY2VGbGFnc0ZpZWxkTnVtYmVyID0gMTMsCisgICAga0luY3JlbWVudGFsU3RhdGVD
bGVhcmVkRmllbGROdW1iZXIgPSA0MSwKKyAgICBrVHJhY2VQYWNrZXREZWZhdWx0c0ZpZWxkTnVt
YmVyID0gNTksCisgICAga1ByZXZpb3VzUGFja2V0RHJvcHBlZEZpZWxkTnVtYmVyID0gNDIsCisg
IH07CisgIHVzaW5nIFNlcXVlbmNlRmxhZ3MgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6
VHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnczsKKyAgc3RhdGljIGNvbnN0IFNlcXVlbmNlRmxhZ3Mg
U0VRX1VOU1BFQ0lGSUVEID0gVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19TRVFfVU5TUEVDSUZJ
RUQ7CisgIHN0YXRpYyBjb25zdCBTZXF1ZW5jZUZsYWdzIFNFUV9JTkNSRU1FTlRBTF9TVEFURV9D
TEVBUkVEID0gVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19TRVFfSU5DUkVNRU5UQUxfU1RBVEVf
Q0xFQVJFRDsKKyAgc3RhdGljIGNvbnN0IFNlcXVlbmNlRmxhZ3MgU0VRX05FRURTX0lOQ1JFTUVO
VEFMX1NUQVRFID0gVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19TRVFfTkVFRFNfSU5DUkVNRU5U
QUxfU1RBVEU7CisgIHZvaWQgc2V0X3RpbWVzdGFtcCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGltZXN0YW1wX2Nsb2NrX2lk
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDU4LCB2YWx1ZSk7CisgIH0KKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9jZXNzVHJlZT4gVCogc2V0X3Byb2Nlc3NfdHJlZSgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBQcm9jZXNzU3RhdHM+IFQqIHNldF9wcm9jZXNzX3N0YXRzKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oOSk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IElub2RlRmlsZU1hcD4gVCogc2V0X2lub2RlX2ZpbGVfbWFwKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IENocm9tZUV2ZW50QnVuZGxlPiBUKiBzZXRfY2hyb21lX2V2ZW50cygpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBDbG9ja1NuYXBzaG90PiBUKiBzZXRfY2xvY2tfc25hcHNob3QoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gU3lzU3RhdHM+IFQqIHNldF9zeXNfc3RhdHMoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPig3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJh
Y2tFdmVudD4gVCogc2V0X3RyYWNrX2V2ZW50KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oMTEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjZUNvbmZp
Zz4gVCogc2V0X3RyYWNlX2NvbmZpZygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDMzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRnRyYWNlU3RhdHM+IFQq
IHNldF9mdHJhY2Vfc3RhdHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigz
NCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlU3RhdHM+IFQqIHNldF90
cmFjZV9zdGF0cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDM1KTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUHJvZmlsZVBhY2tldD4gVCogc2V0X3Byb2Zp
bGVfcGFja2V0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzcpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCYXR0ZXJ5Q291bnRlcnM+IFQqIHNldF9iYXR0
ZXJ5KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzgpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQb3dlclJhaWxzPiBUKiBzZXRfcG93ZXJfcmFpbHMoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0MCk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IEFuZHJvaWRMb2dQYWNrZXQ+IFQqIHNldF9hbmRyb2lkX2xvZygpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDM5KTsKKyAgfQorCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gU3lzdGVtSW5mbz4gVCogc2V0X3N5c3RlbV9pbmZvKCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNDUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBUcmlnZ2VyPiBUKiBzZXRfdHJpZ2dlcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDQ2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUGFja2Fn
ZXNMaXN0PiBUKiBzZXRfcGFja2FnZXNfbGlzdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDQ3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lQmVu
Y2htYXJrTWV0YWRhdGE+IFQqIHNldF9jaHJvbWVfYmVuY2htYXJrX21ldGFkYXRhKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNDgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBQZXJmZXR0b01ldGF0cmFjZT4gVCogc2V0X3BlcmZldHRvX21ldGF0cmFjZSgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ5KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lTWV0YWRhdGFQYWNrZXQ+IFQqIHNldF9jaHJvbWVfbWV0
YWRhdGEoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1MSk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEdwdUNvdW50ZXJFdmVudD4gVCogc2V0X2dwdV9jb3Vu
dGVyX2V2ZW50KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNTIpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBHcHVSZW5kZXJTdGFnZUV2ZW50PiBUKiBzZXRf
Z3B1X3JlbmRlcl9zdGFnZV9ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDUzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU3RyZWFtaW5nUHJvZmls
ZVBhY2tldD4gVCogc2V0X3N0cmVhbWluZ19wcm9maWxlX3BhY2tldCgpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDU0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gSGVhcEdyYXBoPiBUKiBzZXRfaGVhcF9ncmFwaCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDU2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3JhcGhp
Y3NGcmFtZUV2ZW50PiBUKiBzZXRfZ3JhcGhpY3NfZnJhbWVfZXZlbnQoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IFZ1bGthbk1lbW9yeUV2ZW50PiBUKiBzZXRfdnVsa2FuX21lbW9yeV9ldmVudCgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDYyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gR3B1TG9nPiBUKiBzZXRfZ3B1X2xvZygpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDYzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVnVs
a2FuQXBpRXZlbnQ+IFQqIHNldF92dWxrYW5fYXBpX2V2ZW50KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oNjUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQ
ZXJmU2FtcGxlPiBUKiBzZXRfcGVyZl9zYW1wbGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPig2Nik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENwdUluZm8+
IFQqIHNldF9jcHVfaW5mbygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDY3
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU21hcHNQYWNrZXQ+IFQqIHNldF9z
bWFwc19wYWNrZXQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2OCk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNpbmdTZXJ2aWNlRXZlbnQ+IFQqIHNl
dF9zZXJ2aWNlX2V2ZW50KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjkp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJbml0aWFsRGlzcGxheVN0YXRlPiBU
KiBzZXRfaW5pdGlhbF9kaXNwbGF5X3N0YXRlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oNzApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBHcHVNZW1Ub3Rh
bEV2ZW50PiBUKiBzZXRfZ3B1X21lbV90b3RhbF9ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDcxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUHJv
ZmlsZWRGcmFtZVN5bWJvbHM+IFQqIHNldF9wcm9maWxlZF9mcmFtZV9zeW1ib2xzKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNTUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBNb2R1bGVTeW1ib2xzPiBUKiBzZXRfbW9kdWxlX3N5bWJvbHMoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IERlb2JmdXNjYXRpb25NYXBwaW5nPiBUKiBzZXRfZGVvYmZ1c2NhdGlvbl9tYXBw
aW5nKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjQpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFja0Rlc2NyaXB0b3I+IFQqIHNldF90cmFja19kZXNj
cmlwdG9yKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjApOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9jZXNzRGVzY3JpcHRvcj4gVCogc2V0X3Byb2Nl
c3NfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQzKTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVGhyZWFkRGVzY3JpcHRvcj4gVCogc2V0
X3RocmVhZF9kZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
NDQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGdHJhY2VFdmVudEJ1bmRsZT4g
VCogc2V0X2Z0cmFjZV9ldmVudHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigxKTsKKyAgfQorCisgIHZvaWQgc2V0X3N5bmNocm9uaXphdGlvbl9tYXJrZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMzYsIHZhbHVlLmRhdGEoKSwgdmFs
dWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9zeW5jaHJvbml6YXRpb25fbWFya2VyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMzYsIGRhdGEs
IHNpemUpOworICB9CisgIHZvaWQgc2V0X2NvbXByZXNzZWRfcGFja2V0cyhjb25zdCBzdGQ6OnN0
cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg1MCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5z
aXplKCkpOworICB9CisgIHZvaWQgc2V0X2NvbXByZXNzZWRfcGFja2V0cyhjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUwLCBkYXRhLCBzaXplKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRlc3RFdmVudD4gVCogc2V0X2Zvcl90ZXN0
aW5nKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oOTAwKTsKKyAgfQorCisg
IHZvaWQgc2V0X3RydXN0ZWRfdWlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RydXN0ZWRfcGFja2V0X3NlcXVlbmNlX2lkKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEwLCB2YWx1ZSk7CisgIH0KKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQgPSBJbnRlcm5lZERhdGE+IFQqIHNldF9pbnRlcm5lZF9kYXRhKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTIpOworICB9CisKKyAgdm9pZCBz
ZXRfc2VxdWVuY2VfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbmNyZW1lbnRhbF9zdGF0ZV9jbGVhcmVkKGJvb2wg
dmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDQxLCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBUcmFjZVBhY2tldERlZmF1bHRzPiBUKiBzZXRfdHJhY2VfcGFja2V0
X2RlZmF1bHRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNTkpOworICB9
CisKKyAgdm9pZCBzZXRfcHJldmlvdXNfcGFja2V0X2Ryb3BwZWQoYm9vbCB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoNDIsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2Uu
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1
YXJkLgorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQ
cm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9u
IDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2Vw
dCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNv
cHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9s
aWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxl
IGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBX
SVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJl
c3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1
YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBM
aWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0RBVEFfU09V
UkNFX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19EQVRBX1NPVVJDRV9IXwor
CisvLyBUaGlzIGhlYWRlciBjb250YWlucyB0aGUga2V5IGNsYXNzIChEYXRhU291cmNlKSB0aGF0
IGEgcHJvZHVjZXIgYXBwIHNob3VsZAorLy8gb3ZlcnJpZGUgaW4gb3JkZXIgdG8gY3JlYXRlIGEg
Y3VzdG9tIGRhdGEgc291cmNlIHRoYXQgZ2V0cyB0cmFjaW5nIFN0YXJ0L1N0b3AKKy8vIG5vdGlm
aWNhdGlvbnMgYW5kIGVtaXRzIHRyYWNpbmcgZGF0YS4KKworI2luY2x1ZGUgPGFzc2VydC5oPgor
I2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJy
YXk+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8
bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9jb21waWxlci5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vbWVzc2FnZV9oYW5kbGUuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3ku
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNp
bmcvY29yZS9mb3J3YXJkX2RlY2xzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL2Jhc2ljX3R5cGVzLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFs
L2RhdGFfc291cmNlX2ludGVybmFsLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNpbmdfbXV4ZXIuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvbG9ja2Vk
X2hhbmRsZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vdHJhY2luZy90cmFjZV93cml0ZXJfYmFzZS5oIgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2VfcGFja2V0LnBiemVy
by5oIgorCisvLyBQRVJGRVRUT19DT01QT05FTlRfRVhQT1JUIGlzIHVzZWQgdG8gbWFyayBzeW1i
b2xzIGluIFBlcmZldHRvJ3MgaGVhZGVycworLy8gKHR5cGljYWxseSB0ZW1wbGF0ZXMpIHRoYXQg
YXJlIGRlZmluZWQgYnkgdGhlIHVzZXIgb3V0c2lkZSBvZiBQZXJmZXR0byBhbmQKKy8vIHNob3Vs
ZCBiZSBtYWRlIHZpc2libGUgb3V0c2lkZSB0aGUgY3VycmVudCBtb2R1bGUuIChlLmcuLCBpbiBD
aHJvbWUncworLy8gY29tcG9uZW50IGJ1aWxkKS4KKyNpZiAhZGVmaW5lZChQRVJGRVRUT19DT01Q
T05FTlRfRVhQT1JUKQorI2RlZmluZSBQRVJGRVRUT19DT01QT05FTlRfRVhQT1JUCisjZW5kaWYK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBUcmFj
aW5nTXV4ZXJJbXBsOworY2xhc3MgVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0cnk7Cit0ZW1wbGF0
ZSA8dHlwZW5hbWUsIGNvbnN0IGludGVybmFsOjpUcmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeSo+
CitjbGFzcyBUcmFja0V2ZW50RGF0YVNvdXJjZTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAor
CisvLyBCYXNlIGNsYXNzIHdpdGggdGhlIHZpcnR1YWwgbWV0aG9kcyB0byBnZXQgc3RhcnQvc3Rv
cCBub3RpZmljYXRpb25zLgorLy8gRW1iZWRkZXJzIGFyZSBzdXBwb3NlZCB0byBkZXJpdmUgdGhl
IHRlbXBsYXRlZCB2ZXJzaW9uIGJlbG93LCBub3QgdGhpcyBvbmUuCitjbGFzcyBQRVJGRVRUT19F
WFBPUlQgRGF0YVNvdXJjZUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RGF0YVNvdXJjZUJh
c2UoKTsKKworICAvLyBUT0RPKHByaW1pYW5vKTogY2hhbmdlIHRoZSBjb25zdCYgYXJncyBiZWxv
dyB0byBiZSBwb2ludGVycyBpbnN0ZWFkLiBJdAorICAvLyBtYWtlcyBpdCBtb3JlIGF3a3dhcmQg
dG8gaGFuZGxlIG91dHB1dCBhcmd1bWVudHMgYW5kIHJlcXVpcmUgbXV0YWJsZShzKS4KKyAgLy8g
VGhpcyByZXF1aXJlcyBzeW5jaHJvbml6aW5nIGEgYnJlYWtpbmcgQVBJIGNoYW5nZSBmb3IgZXhp
c3RpbmcgZW1iZWRkZXJzLgorCisgIC8vIE9uU2V0dXAoKSBpcyBpbnZva2VkIHdoZW4gdHJhY2lu
ZyBpcyBjb25maWd1cmVkLiBJbiBtb3N0IGNhc2VzIHRoaXMgaGFwcGVucworICAvLyBqdXN0IGJl
Zm9yZSBzdGFydGluZyB0aGUgdHJhY2UuIEluIHRoZSBjYXNlIG9mIGRlZmVycmVkIHN0YXJ0IChz
ZWUKKyAgLy8gZGVmZXJyZWRfc3RhcnQgaW4gdHJhY2VfY29uZmlnLnByb3RvKSBzdGFydCBtaWdo
dCBoYXBwZW4gbGF0ZXIuCisgIGNsYXNzIFNldHVwQXJncyB7CisgICBwdWJsaWM6CisgICAgLy8g
VGhpcyBpcyB2YWxpZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIE9uU2V0dXAoKSBjYWxs
IGFuZCBtdXN0IG5vdAorICAgIC8vIGJlIHJldGFpbmVkLgorICAgIGNvbnN0IERhdGFTb3VyY2VD
b25maWcqIGNvbmZpZyA9IG51bGxwdHI7CisKKyAgICAvLyBUaGUgaW5kZXggb2YgdGhpcyBkYXRh
IHNvdXJjZSBpbnN0YW5jZSAoMC4ua01heERhdGFTb3VyY2VJbnN0YW5jZXMgLSAxKS4KKyAgICB1
aW50MzJfdCBpbnRlcm5hbF9pbnN0YW5jZV9pbmRleCA9IDA7CisgIH07CisgIHZpcnR1YWwgdm9p
ZCBPblNldHVwKGNvbnN0IFNldHVwQXJncyYpOworCisgIGNsYXNzIFN0YXJ0QXJncyB7CisgICBw
dWJsaWM6CisgICAgLy8gVGhlIGluZGV4IG9mIHRoaXMgZGF0YSBzb3VyY2UgaW5zdGFuY2UgKDAu
LmtNYXhEYXRhU291cmNlSW5zdGFuY2VzIC0gMSkuCisgICAgdWludDMyX3QgaW50ZXJuYWxfaW5z
dGFuY2VfaW5kZXggPSAwOworICB9OworICB2aXJ0dWFsIHZvaWQgT25TdGFydChjb25zdCBTdGFy
dEFyZ3MmKTsKKworICBjbGFzcyBTdG9wQXJncyB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+
U3RvcEFyZ3MoKTsKKworICAgIC8vIEhhbmRsZUFzeW5jaHJvbm91c2x5KCkgY2FuIG9wdGlvbmFs
bHkgYmUgY2FsbGVkIHRvIGRlZmVyIHRoZSB0cmFjaW5nCisgICAgLy8gc2Vzc2lvbiBzdG9wIGFu
ZCB3cml0ZSB0cmFjaW5nIGRhdGEganVzdCBiZWZvcmUgc3RvcHBpbmcuCisgICAgLy8gVGhpcyBm
dW5jdGlvbiByZXR1cm5zIGEgY2xvc3VyZSB0aGF0IG11c3QgYmUgaW52b2tlZCBhZnRlciB0aGUg
bGFzdAorICAgIC8vIHRyYWNlIGV2ZW50cyBoYXZlIGJlZW4gZW1pdHRlZC4gVGhlIHJldHVybmVk
IGNsb3N1cmUgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgLy8gYW55IHRocmVhZC4gVGhlIGNhbGxl
ciBhbHNvIG5lZWRzIHRvIGV4cGxpY2l0bHkgY2FsbCBUcmFjZUNvbnRleHQuRmx1c2goKQorICAg
IC8vIGZyb20gdGhlIGxhc3QgVHJhY2UoKSBsYW1iZGEgaW52b2NhdGlvbiBiZWNhdXNlIG5vIG90
aGVyIGltcGxpY2l0IGZsdXNoZXMKKyAgICAvLyB3aWxsIGhhcHBlbiBhZnRlciB0aGUgc3RvcCBz
aWduYWwuCisgICAgLy8gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHRyYWNpbmcg
c2VydmljZSB3aWxsIGRlZmVyIHRoZSBzdG9wIG9mCisgICAgLy8gdGhlIHRyYWNpbmcgc2Vzc2lv
biB1bnRpbCB0aGUgcmV0dXJuZWQgY2xvc3VyZSBpcyBpbnZva2VkLgorICAgIC8vIEhvd2V2ZXIs
IHRoZSBjYWxsZXIgY2Fubm90IGhhbmcgb250byB0aGlzIGNsb3N1cmUgZm9yIHRvbyBsb25nLiBU
aGUKKyAgICAvLyB0cmFjaW5nIHNlcnZpY2Ugd2lsbCBmb3JjZWZ1bGx5IHN0b3AgdGhlIHRyYWNp
bmcgc2Vzc2lvbiB3aXRob3V0IHdhaXRpbmcKKyAgICAvLyBmb3IgcGVuZGluZyBwcm9kdWNlcnMg
YWZ0ZXIgVHJhY2VDb25maWcuZGF0YV9zb3VyY2Vfc3RvcF90aW1lb3V0X21zCisgICAgLy8gKGRl
ZmF1bHQ6IDVzLCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBDb25zdW1lcnMgd2hlbiBzdGFydGluZyBh
IHRyYWNlKS4KKyAgICAvLyBJZiB0aGUgY2xvc3VyZSBpcyBjYWxsZWQgYWZ0ZXIgdGhpcyB0aW1l
b3V0IGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkIGFuZAorICAgIC8vIHRoZSB0cmFjZSBkYXRhIGVt
aXR0ZWQgd2lsbCBub3QgYmUgcHJlc2VudCBpbiB0aGUgdHJhY2UuIE5vIG90aGVyCisgICAgLy8g
ZnVuY3Rpb25hbCBzaWRlIGVmZmVjdHMgKGUuZy4gY3Jhc2hlcyBvciBjb3JydXB0aW9ucykgd2ls
bCBoYXBwZW4uIEluCisgICAgLy8gb3RoZXIgd29yZHMsIGl0IGlzIGZpbmUgdG8gYWNjaWRlbnRh
bGx5IGhvbGQgb250byB0aGlzIGNsb3N1cmUgZm9yIHRvbworICAgIC8vIGxvbmcgYnV0LCBpZiB0
aGF0IGhhcHBlbnMsIHNvbWUgdHJhY2luZyBkYXRhIHdpbGwgYmUgbG9zdC4KKyAgICB2aXJ0dWFs
IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBIYW5kbGVTdG9wQXN5bmNocm9ub3VzbHkoKSBjb25zdCA9
IDA7CisKKyAgICAvLyBUaGUgaW5kZXggb2YgdGhpcyBkYXRhIHNvdXJjZSBpbnN0YW5jZSAoMC4u
a01heERhdGFTb3VyY2VJbnN0YW5jZXMgLSAxKS4KKyAgICB1aW50MzJfdCBpbnRlcm5hbF9pbnN0
YW5jZV9pbmRleCA9IDA7CisgIH07CisgIHZpcnR1YWwgdm9pZCBPblN0b3AoY29uc3QgU3RvcEFy
Z3MmKTsKK307CisKK3N0cnVjdCBEZWZhdWx0RGF0YVNvdXJjZVRyYWl0cyB7CisgIC8vIHxJbmNy
ZW1lbnRhbFN0YXRlVHlwZXwgY2FuIG9wdGlvbmFsbHkgYmUgdXNlZCBzdG9yZSBjdXN0b20gcGVy
LXNlcXVlbmNlCisgIC8vIGluY3JlbWVudGFsIGRhdGEgKGUuZy4sIGludGVybmluZyB0YWJsZXMp
LiBJdCBzaG91bGQgaGF2ZSBhIENsZWFyKCkgbWV0aG9kCisgIC8vIGZvciB3aGVuIGluY3JlbWVu
dGFsIHN0YXRlIG5lZWRzIHRvIGJlIGNsZWFyZWQuIFNlZQorICAvLyBUcmFjZUNvbnRleHQ6Okdl
dEluY3JlbWVudGFsU3RhdGUoKS4KKyAgdXNpbmcgSW5jcmVtZW50YWxTdGF0ZVR5cGUgPSB2b2lk
OworCisgIC8vIEFsbG93cyBvdmVycmlkaW5nIHdoYXQgdHlwZSBvZiB0aHJlYWQtbG9jYWwgc3Rh
dGUgY29uZmlndXJhdGlvbiB0aGUgZGF0YQorICAvLyBzb3VyY2UgdXNlcy4gQnkgZGVmYXVsdCBl
dmVyeSBkYXRhIHNvdXJjZSBnZXRzIGluZGVwZW5kZW50IHRocmVhZC1sb2NhbAorICAvLyBzdGF0
ZSwgd2hpY2ggbWVhbnMgZXZlcnkgaW5zdGFuY2UgdXNlcyBzZXBhcmF0ZSB0cmFjZSB3cml0ZXJz
IGFuZAorICAvLyBpbmNyZW1lbnRhbCBzdGF0ZSBldmVuIG9uIHRoZSBzYW1lIHRocmVhZC4gU29t
ZSBkYXRhIHNvdXJjZXMgKG1vc3Qgbm90YWJseQorICAvLyB0aGUgdHJhY2sgZXZlbnQgZGF0YSBz
b3VyY2UpIHdhbnQgdG8gc2hhcmUgdHJhY2Ugd3JpdGVycyBhbmQgaW5jcmVtZW50YWwKKyAgLy8g
c3RhdGUgb24gdGhlIHNhbWUgdGhyZWFkLgorICBzdGF0aWMgaW50ZXJuYWw6OkRhdGFTb3VyY2VU
aHJlYWRMb2NhbFN0YXRlKiBHZXREYXRhU291cmNlVExTKAorICAgICAgaW50ZXJuYWw6OkRhdGFT
b3VyY2VTdGF0aWNTdGF0ZSogc3RhdGljX3N0YXRlLAorICAgICAgaW50ZXJuYWw6OlRyYWNpbmdU
TFMqIHJvb3RfdGxzKSB7CisgICAgYXV0byogZHNfdGxzID0gJnJvb3RfdGxzLT5kYXRhX3NvdXJj
ZXNfdGxzW3N0YXRpY19zdGF0ZS0+aW5kZXhdOworICAgIC8vIFRoZSBwZXItdHlwZSBUTFMgaXMg
ZWl0aGVyIHplcm8taW5pdGlhbGl6ZWQgb3IgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKKyAg
ICAvLyBmb3IgdGhpcyBzcGVjaWZpYyBkYXRhIHNvdXJjZSB0eXBlLgorICAgIGFzc2VydCghZHNf
dGxzLT5zdGF0aWNfc3RhdGUgfHwKKyAgICAgICAgICAgZHNfdGxzLT5zdGF0aWNfc3RhdGUtPmlu
ZGV4ID09IHN0YXRpY19zdGF0ZS0+aW5kZXgpOworICAgIHJldHVybiBkc190bHM7CisgIH0KK307
CisKKy8vIFRlbXBsYXRlZCBiYXNlIGNsYXNzIG1lYW50IHRvIGJlIGRlcml2ZWQgYnkgZW1iZWRk
ZXJzIHRvIGNyZWF0ZSBhIGN1c3RvbSBkYXRhCisvLyBzb3VyY2UuIERhdGFTb3VyY2VUeXBlIG11
c3QgYmUgdGhlIHR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3MgaXRzZWxmLCBlLmcuOgorLy8gY2xh
c3MgTXlEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlPE15RGF0YVNvdXJjZT4gey4u
Ln0uCisvLworLy8gfERhdGFTb3VyY2VUcmFpdHN8IGFsbG93cyBjdXN0b21pemluZyB0aGUgYmVo
YXZpb3Igb2YgdGhlIGRhdGEgc291cmNlLiBTZWUKKy8vIHxEZWZhdWx0RGF0YVNvdXJjZVRyYWl0
c3wuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVNvdXJjZVR5cGUsCisgICAgICAgICAgdHlwZW5h
bWUgRGF0YVNvdXJjZVRyYWl0cyA9IERlZmF1bHREYXRhU291cmNlVHJhaXRzPgorY2xhc3MgRGF0
YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisgIHN0cnVjdCBEZWZhdWx0VHJhY2VQ
b2ludFRyYWl0czsKKworIHB1YmxpYzoKKyAgLy8gVGhlIEJ1ZmZlckV4aGF1c3RlZFBvbGljeSB0
byB1c2UgZm9yIFRyYWNlV3JpdGVycyBvZiB0aGlzIERhdGFTb3VyY2UuCisgIC8vIE92ZXJyaWRl
IHRoaXMgaW4geW91ciBEYXRhU291cmNlIGNsYXNzIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCwgd2hp
Y2ggaXMgdG8KKyAgLy8gZHJvcCBkYXRhIG9uIHNoYXJlZCBtZW1vcnkgb3ZlcnJ1bnMuCisgIGNv
bnN0ZXhwciBzdGF0aWMgQnVmZmVyRXhoYXVzdGVkUG9saWN5IGtCdWZmZXJFeGhhdXN0ZWRQb2xp
Y3kgPQorICAgICAgQnVmZmVyRXhoYXVzdGVkUG9saWN5OjprRHJvcDsKKworICAvLyBBcmd1bWVu
dCBwYXNzZWQgdG8gdGhlIGxhbWJkYSBmdW5jdGlvbiBwYXNzZWQgdG8gVHJhY2UoKSAoYmVsb3cp
LgorICBjbGFzcyBUcmFjZUNvbnRleHQgeworICAgcHVibGljOgorICAgIHVzaW5nIFRyYWNlUGFj
a2V0SGFuZGxlID0KKyAgICAgICAgOjpwcm90b3plcm86Ok1lc3NhZ2VIYW5kbGU8OjpwZXJmZXR0
bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0PjsKKworICAgIFRyYWNlQ29udGV4dChUcmFj
ZUNvbnRleHQmJikgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIH5UcmFjZUNvbnRleHQoKSA9IGRl
ZmF1bHQ7CisKKyAgICBUcmFjZVBhY2tldEhhbmRsZSBOZXdUcmFjZVBhY2tldCgpIHsKKyAgICAg
IHJldHVybiB0bHNfaW5zdF8tPnRyYWNlX3dyaXRlci0+TmV3VHJhY2VQYWNrZXQoKTsKKyAgICB9
CisKKyAgICAvLyBGb3JjZXMgYSBjb21taXQgb2YgdGhlIHRocmVhZC1sb2NhbCB0cmFjaW5nIGRh
dGEgd3JpdHRlbiBzbyBmYXIgdG8gdGhlCisgICAgLy8gc2VydmljZS4gVGhpcyBpcyBhbG1vc3Qg
bmV2ZXIgcmVxdWlyZWQgKHRyYWNpbmcgZGF0YSBpcyBwZXJpb2RpY2FsbHkKKyAgICAvLyBjb21t
aXR0ZWQgYXMgdHJhY2UgcGFnZXMgYXJlIGZpbGxlZCB1cCkgYW5kIGhhcyBhIG5vbi1uZWdsaWdp
YmxlCisgICAgLy8gcGVyZm9ybWFuY2UgaGl0IChyZXF1aXJlcyBhbiBJUEMgKyByZWZyZXNoIG9m
IHRoZSBjdXJyZW50IHRocmVhZC1sb2NhbAorICAgIC8vIGNodW5rKS4gVGhlIG9ubHkgY2FzZSB3
aGVuIHRoaXMgc2hvdWxkIGJlIHVzZWQgaXMgd2hlbiBoYW5kbGluZyBPblN0b3AoKQorICAgIC8v
IGFzeW5jaHJvbm91c2x5LCB0byBlbnN1cmUgc3VyZSB0aGF0IHRoZSBkYXRhIGlzIGNvbW1pdHRl
ZCBiZWZvcmUgdGhlCisgICAgLy8gU3RvcCB0aW1lb3V0IGV4cGlyZXMuCisgICAgLy8gVGhlIFRy
YWNlUGFja2V0SGFuZGxlIG9idGFpbmVkIGJ5IHRoZSBsYXN0IE5ld1RyYWNlUGFja2V0KCkgY2Fs
bCBtdXN0IGJlCisgICAgLy8gZmluYWxpemVkIGJlZm9yZSBjYWxsaW5nIEZsdXNoKCkgKGVpdGhl
ciBpbXBsaWNpdGx5IGJ5IGdvaW5nIG91dCBvZiBzY29wZQorICAgIC8vIG9yIGJ5IGV4cGxpY2l0
bHkgY2FsbGluZyBGaW5hbGl6ZSgpKS4KKyAgICAvLyB8Y2J8IGlzIGFuIG9wdGlvbmFsIGNhbGxi
YWNrLiBXaGVuIG5vbi1udWxsIGl0IHdpbGwgcmVxdWVzdCB0aGUKKyAgICAvLyBzZXJ2aWNlIHRv
IEFDSyB0aGUgZmx1c2ggYW5kIHdpbGwgYmUgaW52b2tlZCBvbiBhbiBpbnRlcm5hbCB0aHJlYWQg
YWZ0ZXIKKyAgICAvLyB0aGUgc2VydmljZSBoYXMgIGFja25vd2xlZGdlZCBpdC4gVGhlIGNhbGxi
YWNrIG1pZ2h0IGJlIE5FVkVSIElOVk9LRUQgaWYKKyAgICAvLyB0aGUgc2VydmljZSBjcmFzaGVz
IG9yIHRoZSBJUEMgY29ubmVjdGlvbiBpcyBkcm9wcGVkLgorICAgIHZvaWQgRmx1c2goc3RkOjpm
dW5jdGlvbjx2b2lkKCk+IGNiID0ge30pIHsKKyAgICAgIHRsc19pbnN0Xy0+dHJhY2Vfd3JpdGVy
LT5GbHVzaChjYik7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVz
IHdyaXR0ZW4gb24gdGhlIGN1cnJlbnQgdGhyZWFkIGJ5IHRoZSBjdXJyZW50CisgICAgLy8gZGF0
YS1zb3VyY2Ugc2luY2UgaXRzIGNyZWF0aW9uLgorICAgIC8vIFRoaXMgY2FuIGJlIHVzZWZ1bCBm
b3Igc3BsaXR0aW5nIHByb3RvcyB0aGF0IG1pZ2h0IGdyb3cgdmVyeSBsYXJnZS4KKyAgICB1aW50
NjRfdCB3cml0dGVuKCkgeyByZXR1cm4gdGxzX2luc3RfLT50cmFjZV93cml0ZXItPndyaXR0ZW4o
KTsgfQorCisgICAgLy8gUmV0dXJucyBhIFJBSUkgaGFuZGxlIHRvIGFjY2VzcyB0aGUgZGF0YSBz
b3VyY2UgaW5zdGFuY2UsIGd1YXJhbnRlZWluZworICAgIC8vIHRoYXQgaXQgd29uJ3QgYmUgZGVs
ZXRlZCBvbiBhbm90aGVyIHRocmVhZCAoYmVjYXVzZSBvZiB0cmFjZSBzdG9wcGluZykKKyAgICAv
LyB3aGlsZSBhY2Nlc3NpbmcgaXQgZnJvbSB3aXRoaW4gdGhlIFRyYWNlKCkgbGFtYmRhLgorICAg
IC8vIFRoZSByZXR1cm5lZCBoYW5kbGUgY2FuIGJlIGludmFsaWQgKG51bGxwdHIpIGlmIHRyYWNp
bmcgaXMgc3RvcHBlZAorICAgIC8vIGltbWVkaWF0ZWx5IGJlZm9yZSBjYWxsaW5nIHRoaXMuIFRo
ZSBjYWxsZXIgaXMgc3VwcG9zZWQgdG8gY2hlY2sgZm9yIGl0cworICAgIC8vIHZhbGlkaXR5IGJl
Zm9yZSB1c2luZyBpdC4gQWZ0ZXIgY2hlY2tpbmcsIHRoZSBoYW5kbGUgaXMgZ3VhcmFudGVlZCB0
bworICAgIC8vIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlIGdvZXMgb3V0IG9mIHNjb3Bl
LgorICAgIExvY2tlZEhhbmRsZTxEYXRhU291cmNlVHlwZT4gR2V0RGF0YVNvdXJjZUxvY2tlZCgp
IHsKKyAgICAgIGF1dG8qIGludGVybmFsX3N0YXRlID0gc3RhdGljX3N0YXRlXy5UcnlHZXQoaW5z
dGFuY2VfaW5kZXhfKTsKKyAgICAgIGlmICghaW50ZXJuYWxfc3RhdGUpCisgICAgICAgIHJldHVy
biBMb2NrZWRIYW5kbGU8RGF0YVNvdXJjZVR5cGU+KCk7CisgICAgICByZXR1cm4gTG9ja2VkSGFu
ZGxlPERhdGFTb3VyY2VUeXBlPigKKyAgICAgICAgICAmaW50ZXJuYWxfc3RhdGUtPmxvY2ssCisg
ICAgICAgICAgc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZVR5cGUqPihpbnRlcm5hbF9zdGF0ZS0+ZGF0
YV9zb3VyY2UuZ2V0KCkpKTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBEYXRhU291cmNlVHJhaXRz
OjpJbmNyZW1lbnRhbFN0YXRlVHlwZSogR2V0SW5jcmVtZW50YWxTdGF0ZSgpIHsKKyAgICAgIHJl
dHVybiByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIERhdGFTb3VyY2VUcmFpdHM6OkluY3JlbWVu
dGFsU3RhdGVUeXBlKj4oCisgICAgICAgICAgdGxzX2luc3RfLT5pbmNyZW1lbnRhbF9zdGF0ZS5n
ZXQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEYXRhU291cmNl
OworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgY29uc3QgaW50ZXJuYWw6OlRyYWNrRXZlbnRDYXRl
Z29yeVJlZ2lzdHJ5Kj4KKyAgICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRyYWNrRXZlbnREYXRh
U291cmNlOworICAgIFRyYWNlQ29udGV4dChpbnRlcm5hbDo6RGF0YVNvdXJjZUluc3RhbmNlVGhy
ZWFkTG9jYWxTdGF0ZSogdGxzX2luc3QsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluc3Rh
bmNlX2luZGV4KQorICAgICAgICA6IHRsc19pbnN0Xyh0bHNfaW5zdCksIGluc3RhbmNlX2luZGV4
XyhpbnN0YW5jZV9pbmRleCkge30KKyAgICBUcmFjZUNvbnRleHQoY29uc3QgVHJhY2VDb250ZXh0
JikgPSBkZWxldGU7CisgICAgVHJhY2VDb250ZXh0JiBvcGVyYXRvcj0oY29uc3QgVHJhY2VDb250
ZXh0JikgPSBkZWxldGU7CisKKyAgICBpbnRlcm5hbDo6RGF0YVNvdXJjZUluc3RhbmNlVGhyZWFk
TG9jYWxTdGF0ZSogY29uc3QgdGxzX2luc3RfOworICAgIHVpbnQzMl90IGNvbnN0IGluc3RhbmNl
X2luZGV4XzsKKyAgfTsKKworICAvLyBUaGUgbWFpbiB0cmFjaW5nIG1ldGhvZC4gVHJhY2luZyBj
b2RlIHNob3VsZCBjYWxsIHRoaXMgcGFzc2luZyBhIGxhbWJkYSBhcworICAvLyBhcmd1bWVudCwg
d2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTogdm9pZChUcmFjZUNvbnRleHQpLgorICAvLyBU
aGUgbGFtYmRhIHdpbGwgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGkuZS4sIGFsd2F5cyBiZWZv
cmUgVHJhY2UoKQorICAvLyByZXR1cm5zKSBvbmx5IGlmIHRyYWNpbmcgaXMgZW5hYmxlZCBhbmQg
dGhlIGRhdGEgc291cmNlIGhhcyBiZWVuIGVuYWJsZWQgaW4KKyAgLy8gdGhlIHRyYWNpbmcgY29u
ZmlnLgorICAvLyBUaGUgbGFtYmRhIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgcGVyIFRy
YWNlKCkgY2FsbCwgaW4gdGhlIGNhc2Ugb2YKKyAgLy8gY29uY3VycmVudCB0cmFjaW5nIHNlc3Np
b25zIChvciBldmVuIGlmIHRoZSBkYXRhIHNvdXJjZSBpcyBpbnN0YW50aWF0ZWQKKyAgLy8gdHdp
Y2Ugd2l0aGluIHRoZSBzYW1lIHRyYWNlIGNvbmZpZykuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBM
YW1iZGE+CisgIHN0YXRpYyB2b2lkIFRyYWNlKExhbWJkYSB0cmFjaW5nX2ZuKSB7CisgICAgQ2Fs
bElmRW5hYmxlZDxEZWZhdWx0VHJhY2VQb2ludFRyYWl0cz4oWyZ0cmFjaW5nX2ZuXSh1aW50MzJf
dCBpbnN0YW5jZXMpIHsKKyAgICAgIFRyYWNlV2l0aEluc3RhbmNlczxEZWZhdWx0VHJhY2VQb2lu
dFRyYWl0cz4oaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGQ6Om1vdmUodHJhY2luZ19mbikpOworICAgIH0pOworICB9CisKKyAg
Ly8gQW4gZWZmaWNpZW50IHRyYWNlIHBvaW50IGd1YXJkIGZvciBjaGVja2luZyBpZiB0aGlzIGRh
dGEgc291cmNlIGlzIGFjdGl2ZS4KKyAgLy8gfGNhbGxiYWNrfCBpcyBhIGZ1bmN0aW9uIHdoaWNo
IHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlcmUgYXJlIGFjdGl2ZQorICAvLyBpbnN0YW5jZXMu
IEl0IGlzIGdpdmVuIGFuIGluc3RhbmNlIHN0YXRlIHBhcmFtZXRlciwgd2hpY2ggc2hvdWxkIGJl
IHBhc3NlZAorICAvLyB0byBUcmFjZVdpdGhJbnN0YW5jZXMoKSB0byBhY3R1YWxseSByZWNvcmQg
dHJhY2UgZGF0YS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRyYWl0cyA9IERlZmF1bHRUcmFjZVBv
aW50VHJhaXRzLCB0eXBlbmFtZSBDYWxsYmFjaz4KKyAgc3RhdGljIHZvaWQgQ2FsbElmRW5hYmxl
ZChDYWxsYmFjayBjYWxsYmFjaykgUEVSRkVUVE9fQUxXQVlTX0lOTElORSB7CisgICAgLy8gfGlu
c3RhbmNlc3wgaXMgYSBwZXItY2xhc3MgYml0bWFwIHRoYXQgdGVsbHM6CisgICAgLy8gMS4gSWYg
dGhlIGRhdGEgc291cmNlIGlzIGVuYWJsZWQgYXQgYWxsLgorICAgIC8vIDIuIFRoZSBpbmRleCBv
ZiB0aGUgc2xvdCB3aXRoaW4gfHN0YXRpY19zdGF0ZV98IHRoYXQgaG9sZHMgdGhlIGluc3RhbmNl
CisgICAgLy8gICAgc3RhdGUuIEluIHR1cm4gdGhpcyBhbGxvd3MgdG8gbWFwIHRoZSBkYXRhIHNv
dXJjZSB0byB0aGUgdHJhY2luZworICAgIC8vICAgIHNlc3Npb24gYW5kIGJ1ZmZlcnMuCisgICAg
Ly8gbWVtb3J5X29yZGVyX3JlbGF4ZWQgaXMgb2theSBiZWNhdXNlOgorICAgIC8vIC0gfGluc3Rh
bmNlc3wgaXMgcmUtcmVhZCB3aXRoIGFuIGFjcXVpcmUgYmFycmllciBiZWxvdyBpZiB0aGlzIHN1
Y2NlZWRzLgorICAgIC8vIC0gVGhlIGNvZGUgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgYWNx
dWlyZS1sb2FkIGlzIGJhc2VkIG9uIHN0YXRpYworICAgIC8vICAgIHN0b3JhZ2Ugd2hpY2ggaGFz
IGluZGVmaW5pdGUgbGlmZXRpbWUuCisgICAgdWludDMyX3QgaW5zdGFuY2VzID0KKyAgICAgICAg
VHJhaXRzOjpHZXRBY3RpdmVJbnN0YW5jZXMoKS0+bG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxh
eGVkKTsKKworICAgIC8vIFRoaXMgaXMgdGhlIHRyYWNpbmcgZmFzdC1wYXRoLiBCYWlsIG91dCBp
bW1lZGlhdGVseSBpZiB0cmFjaW5nIGlzIG5vdAorICAgIC8vIGVuYWJsZWQgKG9yIHRyYWNpbmcg
aXMgZW5hYmxlZCBidXQgbm90IGZvciB0aGlzIGRhdGEgc291cmNlKS4KKyAgICBpZiAoUEVSRkVU
VE9fTElLRUxZKCFpbnN0YW5jZXMpKQorICAgICAgcmV0dXJuOworICAgIGNhbGxiYWNrKGluc3Rh
bmNlcyk7CisgIH0KKworICAvLyBUaGUgImxvd2VyIGhhbGYiIG9mIGEgdHJhY2UgcG9pbnQgd2hp
Y2ggYWN0dWFsbHkgcGVyZm9ybXMgdHJhY2luZyBhZnRlcgorICAvLyB0aGlzIGRhdGEgc291cmNl
IGhhcyBiZWVuIGRldGVybWluZWQgdG8gYmUgYWN0aXZlLgorICAvLyB8aW5zdGFuY2VzfCBtdXN0
IGJlIHRoZSBpbnN0YW5jZSBzdGF0ZSB2YWx1ZSByZXRyaWV2ZWQgdGhyb3VnaAorICAvLyBDYWxs
SWZFbmFibGVkKCkuCisgIC8vIHx0cmFjaW5nX2ZufCB3aWxsIGJlIGNhbGxlZCB0byByZWNvcmQg
dHJhY2UgZGF0YSBhcyBpbiBUcmFjZSgpLgorICAvLworICAvLyBUT0RPKHByaW1pYW5vKTogYWxs
IHRoZSBzdHVmZiBiZWxvdyBzaG91bGQgYmUgb3V0bGluZWQgZnJvbSB0aGUgdHJhY2UKKyAgLy8g
cG9pbnQuIE9yIGF0IGxlYXN0IHdlIHNob3VsZCBoYXZlIHNvbWUgY29tcGlsZS10aW1lIHRyYWl0
cyBsaWtlCisgIC8vIGtPcHRpbWl6ZUJpbmFyeVNpemUgLyBrT3B0aW1pemVUcmFjaW5nTGF0ZW5j
eS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRyYWl0cyA9IERlZmF1bHRUcmFjZVBvaW50VHJhaXRz
LCB0eXBlbmFtZSBMYW1iZGE+CisgIHN0YXRpYyB2b2lkIFRyYWNlV2l0aEluc3RhbmNlcyh1aW50
MzJfdCBpbnN0YW5jZXMsIExhbWJkYSB0cmFjaW5nX2ZuKSB7CisgICAgUEVSRkVUVE9fRENIRUNL
KGluc3RhbmNlcyk7CisgICAgY29uc3RleHByIGF1dG8ga01heERhdGFTb3VyY2VJbnN0YW5jZXMg
PSBpbnRlcm5hbDo6a01heERhdGFTb3VyY2VJbnN0YW5jZXM7CisKKyAgICAvLyBTZWUgdHJhY2lu
Z19tdXhlci5oIGZvciB0aGUgc3RydWN0dXJlIG9mIHRoZSBUTFMuCisgICAgYXV0byogdHJhY2lu
Z19pbXBsID0gaW50ZXJuYWw6OlRyYWNpbmdNdXhlcjo6R2V0KCk7CisgICAgaWYgKFBFUkZFVFRP
X1VOTElLRUxZKCF0bHNfc3RhdGVfKSkKKyAgICAgIHRsc19zdGF0ZV8gPSBHZXRPckNyZWF0ZURh
dGFTb3VyY2VUTFMoJnN0YXRpY19zdGF0ZV8pOworCisgICAgLy8gVHJhY2luZ1RMUzo6Z2VuZXJh
dGlvbiBpcyBhIGdsb2JhbCBtb25vdG9uaWMgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkCisg
ICAgLy8gZXZlcnkgdGltZSBhIHRyYWNpbmcgc2Vzc2lvbiBpcyBzdG9wcGVkLiBXZSB1c2UgdGhh
dCBhcyBhIHNpZ25hbCB0byBmb3JjZQorICAgIC8vIGEgc2xvdy1wYXRoIGdhcmJhZ2UgY29sbGVj
dGlvbiBvZiBhbGwgdGhlIHRyYWNlIHdyaXRlcnMgZm9yIHRoZSBjdXJyZW50CisgICAgLy8gdGhy
ZWFkIGFuZCB0byBkZXN0cm95IHRoZSBvbmVzIHRoYXQgYmVsb25nIHRvIHRyYWNpbmcgc2Vzc2lv
bnMgdGhhdCBoYXZlCisgICAgLy8gZW5kZWQuIFRoaXMgaXMgdG8gYXZvaWQgaGF2aW5nIHRvbyBt
YW55IFRyYWNlV3JpdGVyIGluc3RhbmNlcyBhbGl2ZSwgZWFjaAorICAgIC8vIGhvbGRpbmcgb250
byBvbmUgY2h1bmsgb2YgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyLgorICAgIC8vIFJhdGlvbmFs
ZSB3aHkgbWVtb3J5X29yZGVyX3JlbGF4ZWQgc2hvdWxkIGJlIGZpbmU6CisgICAgLy8gLSBUaGUg
VHJhY2VXcml0ZXIgb2JqZWN0IHRoYXQgd2UgdXNlIGlzIGFsd2F5cyBjb25zdHJ1Y3RlZCBhbmQg
ZGVzdHJ1Y3RlZAorICAgIC8vICAgb24gdGhlIGN1cnJlbnQgdGhyZWFkLiBUaGVyZSBpcyBubyBy
aXNrIG9mIGFjY2Vzc2luZyBhIGhhbGYtaW5pdGlhbGl6ZWQKKyAgICAvLyAgIFRyYWNlV3JpdGVy
ICh3aGljaCB3b3VsZCBiZSByZWFsbHkgYmFkKS4KKyAgICAvLyAtIEluIHRoZSB3b3JzdCBjYXNl
LCBpbiB0aGUgY2FzZSBvZiBhIHJhY2Ugb24gdGhlIGdlbmVyYXRpb24gY2hlY2ssIHdlCisgICAg
Ly8gICBtaWdodCBlbmQgdXAgdXNpbmcgYSBUcmFjZVdyaXRlciBmb3IgdGhlIHNhbWUgZGF0YSBz
b3VyY2UgdGhhdCBiZWxvbmdzCisgICAgLy8gICB0byBhIHN0b3BwZWQgc2Vzc2lvbi4gVGhpcyBp
cyBub3QgcmVhbGx5IHdyb25nLCBhcyB3ZSBkb24ndCBnaXZlIGFueQorICAgIC8vICAgZ3VhcmFu
dGVlIG9uIHRoZSBnbG9iYWwgYXRvbWljaXR5IG9mIHRoZSBzdG9wLiBJbiB0aGUgd29yc3QgY2Fz
ZSB0aGUKKyAgICAvLyAgIHNlcnZpY2Ugd2lsbCByZWplY3QgdGhlIGRhdGEgY29tbWl0IGlmIHRo
aXMgYXJyaXZlcyB0b28gbGF0ZS4KKworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWSgKKyAgICAg
ICAgICAgIHRsc19zdGF0ZV8tPnJvb3RfdGxzLT5nZW5lcmF0aW9uICE9CisgICAgICAgICAgICB0
cmFjaW5nX2ltcGwtPmdlbmVyYXRpb24oc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpKSB7Cisg
ICAgICAvLyBXaWxsIHVwZGF0ZSByb290X3Rscy0+Z2VuZXJhdGlvbi4KKyAgICAgIHRyYWNpbmdf
aW1wbC0+RGVzdHJveVN0b3BwZWRUcmFjZVdyaXRlcnNGb3JDdXJyZW50VGhyZWFkKCk7CisgICAg
fQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtNYXhEYXRhU291cmNlSW5zdGFuY2Vz
OyBpKyspIHsKKyAgICAgIGludGVybmFsOjpEYXRhU291cmNlU3RhdGUqIGluc3RhbmNlX3N0YXRl
ID0KKyAgICAgICAgICBzdGF0aWNfc3RhdGVfLlRyeUdldENhY2hlZChpbnN0YW5jZXMsIGkpOwor
ICAgICAgaWYgKCFpbnN0YW5jZV9zdGF0ZSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8v
IEV2ZW4gaWYgd2UgcGFzc2VkIHRoZSBjaGVjayBhYm92ZSwgdGhlIERhdGFTb3VyY2VJbnN0YW5j
ZSBtaWdodCBiZQorICAgICAgLy8gc3RpbGwgZGVzdHJveWVkIGNvbmN1cnJlbnRseSB3aGlsZSB0
aGlzIGNvZGUgcnVucy4gVGhlIGNvZGUgYmVsb3cgaXMKKyAgICAgIC8vIGRlc2lnbmVkIHRvIGRl
YWwgd2l0aCBzdWNoIHJhY2UsIGFzIGZvbGxvd3M6CisgICAgICAvLyAtIFdlIGRvbid0IGFjY2Vz
cyB0aGUgdXNlci1kZWZpbmVkIGRhdGEgc291cmNlIGluc3RhbmNlIHN0YXRlLiBUaGUgb25seQor
ICAgICAgLy8gICBiaXRzIG9mIHN0YXRlIHdlIHVzZSBhcmUgfGJhY2tlbmRfaWR8IGFuZCB8YnVm
ZmVyX2lkfC4KKyAgICAgIC8vIC0gQmV5b25kIHRob3NlIHR3byBpbnRlZ2Vycywgd2UgYWNjZXNz
IG9ubHkgdGhlIFRyYWNlV3JpdGVyIGhlcmUuIFRoZQorICAgICAgLy8gICBUcmFjZVdyaXRlciBp
cyBhbHdheXMgc2FmZSBiZWNhdXNlIGl0IGxpdmVzIG9uIHRoZSBUTFMuCisgICAgICAvLyAtIHxp
bnN0YW5jZV9zdGF0ZXwgaXMgYmFja2VkIGJ5IHN0YXRpYyBzdG9yYWdlLCBzbyB0aGUgcG9pbnRl
ciBpcworICAgICAgLy8gICBhbHdheXMgdmFsaWQsIGV2ZW4gYWZ0ZXIgdGhlIGRhdGEgc291cmNl
IGluc3RhbmNlIGlzIGRlc3Ryb3llZC4KKyAgICAgIC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSByYWNl
LW9uLWRlc3RydWN0aW9uLCB3ZSdsbCBzdGlsbCBzZWUgdGhlIGxhdGVzdAorICAgICAgLy8gICBi
YWNrZW5kX2lkIGFuZCBidWZmZXJfaWQgYW5kIGluIHRoZSB3b3JzdCBjYXNlIGtlZXAgdHJ5aW5n
IHdyaXRpbmcKKyAgICAgIC8vICAgaW50byB0aGUgdHJhY2luZyBzaGFyZWQgbWVtb3J5IGJ1ZmZl
ciBhZnRlciBzdG9wcGVkLiBCdXQgdGhpcyBpc24ndAorICAgICAgLy8gICByZWFsbHkgYW55IHdv
cnNlIHRoYW4gdGhlIGNhc2Ugb2YgdGhlIHN0b3AgSVBDIGJlaW5nIGRlbGF5ZWQgYnkgdGhlCisg
ICAgICAvLyAgIGtlcm5lbCBzY2hlZHVsZXIuIFRoZSB0cmFjaW5nIHNlcnZpY2UgaXMgcm9idXN0
IGFnYWluc3QgZGF0YSBjb21taXQKKyAgICAgIC8vICAgYXR0ZW1wcyBtYWRlIGFmdGVyIHRyYWNp
bmcgaXMgc3RvcHBlZC4KKyAgICAgIC8vIFRoZXJlIGlzIGEgdGhlb3JldGljYWwgcmFjZSB0aGF0
IHdvdWxkIGNhc2UgdGhlIHdyb25nIGJlaGF2aW9yIHcuci50CisgICAgICAvLyB3cml0aW5nIGRh
dGEgaW4gdGhlIHdyb25nIGJ1ZmZlciwgYnV0IGl0J3Mgc28gcmFyZSB0aGF0IHdlIGlnbm9yZSBp
dDoKKyAgICAgIC8vIGlmIHRoZSBkYXRhIHNvdXJjZSBpcyBzdG9wcGVkIGFuZCBzdGFydGVkIGtN
YXhEYXRhU291cmNlSW5zdGFuY2VzCisgICAgICAvLyB0aW1lcyAoc28gdGhhdCB0aGUgc2FtZSBp
ZCBpcyByZWN5Y2xlZCkgd2hpbGUgd2UgYXJlIGluIHRoaXMgZnVuY3Rpb24sCisgICAgICAvLyB3
ZSBtaWdodCBlbmQgdXAgcmV1c2luZyB0aGUgb2xkIGRhdGEgc291cmNlJ3MgYmFja2VuZF9pZCBh
bmQgYnVmZmVyX2lkCisgICAgICAvLyBmb3IgdGhlIG5ldyBvbmUsIGJlY2F1c2Ugd2UgZG9uJ3Qg
c2VlIHRoZSBnZW5lcmF0aW9uIGNoYW5nZSBwYXN0IHRoaXMKKyAgICAgIC8vIHBvaW50LiBCdXQg
c3RvcHBpbmcgYW5kIHN0YXJ0aW5nIHRyYWNpbmcgKGV2ZW4gb25jZSkgdGFrZXMgc28gbXVjaAor
ICAgICAgLy8gaGFuZHNoYWtpbmcgdG8gbWFrZSB0aGlzIGV4dHJlbWVseSB1bnJlYWxpc3RpYy4K
KworICAgICAgYXV0byYgdGxzX2luc3QgPSB0bHNfc3RhdGVfLT5wZXJfaW5zdGFuY2VbaV07Cisg
ICAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkoIXRsc19pbnN0LnRyYWNlX3dyaXRlcikpIHsKKyAg
ICAgICAgLy8gSGVyZSB3ZSBuZWVkIGFuIGFjcXVpcmUgYmFycmllciwgd2hpY2ggbWF0Y2hlcyB0
aGUgcmVsZWFzZS1zdG9yZSBtYWRlCisgICAgICAgIC8vIGJ5IFRyYWNpbmdNdXhlckltcGw6OlNl
dHVwRGF0YVNvdXJjZSgpLCB0byBlbnN1cmUgdGhhdCB0aGUgYmFja2VuZF9pZAorICAgICAgICAv
LyBhbmQgYnVmZmVyX2lkIGFyZSBjb25zaXN0ZW50LgorICAgICAgICBpbnN0YW5jZXMgPQorICAg
ICAgICAgICAgVHJhaXRzOjpHZXRBY3RpdmVJbnN0YW5jZXMoKS0+bG9hZChzdGQ6Om1lbW9yeV9v
cmRlcl9hY3F1aXJlKTsKKyAgICAgICAgaW5zdGFuY2Vfc3RhdGUgPSBzdGF0aWNfc3RhdGVfLlRy
eUdldENhY2hlZChpbnN0YW5jZXMsIGkpOworICAgICAgICBpZiAoIWluc3RhbmNlX3N0YXRlIHx8
ICFpbnN0YW5jZV9zdGF0ZS0+dHJhY2VfbGFtYmRhX2VuYWJsZWQpCisgICAgICAgICAgcmV0dXJu
OworICAgICAgICB0bHNfaW5zdC5iYWNrZW5kX2lkID0gaW5zdGFuY2Vfc3RhdGUtPmJhY2tlbmRf
aWQ7CisgICAgICAgIHRsc19pbnN0LmJ1ZmZlcl9pZCA9IGluc3RhbmNlX3N0YXRlLT5idWZmZXJf
aWQ7CisgICAgICAgIHRsc19pbnN0LnRyYWNlX3dyaXRlciA9IHRyYWNpbmdfaW1wbC0+Q3JlYXRl
VHJhY2VXcml0ZXIoCisgICAgICAgICAgICBpbnN0YW5jZV9zdGF0ZSwgRGF0YVNvdXJjZVR5cGU6
OmtCdWZmZXJFeGhhdXN0ZWRQb2xpY3kpOworICAgICAgICBDcmVhdGVJbmNyZW1lbnRhbFN0YXRl
KAorICAgICAgICAgICAgJnRsc19pbnN0LAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5h
bWUgRGF0YVNvdXJjZVRyYWl0czo6SW5jcmVtZW50YWxTdGF0ZVR5cGUqPigKKyAgICAgICAgICAg
ICAgICBudWxscHRyKSk7CisKKyAgICAgICAgLy8gRXZlbiBpbiB0aGUgY2FzZSBvZiBvdXQtb2Yt
SURzLCBTaGFyZWRNZW1vcnlBcmJpdGVySW1wbCByZXR1cm5zIGEKKyAgICAgICAgLy8gTnVsbFRy
YWNlV3JpdGVyLiBUaGUgcmV0dXJuZWQgcG9pbnRlciBzaG91bGQgbmV2ZXIgYmUgbnVsbC4KKyAg
ICAgICAgYXNzZXJ0KHRsc19pbnN0LnRyYWNlX3dyaXRlcik7CisgICAgICB9CisKKyAgICAgIHRy
YWNpbmdfZm4oVHJhY2VDb250ZXh0KCZ0bHNfaW5zdCwgaSkpOworICAgIH0KKyAgfQorCisgIC8v
IFJlZ2lzdGVycyB0aGUgZGF0YSBzb3VyY2Ugb24gYWxsIHRyYWNpbmcgYmFja2VuZHMsIGluY2x1
ZGluZyBvbmVzIHRoYXQKKyAgLy8gY29ubmVjdCBhZnRlciB0aGUgcmVnaXN0cmF0aW9uLiBEb2lu
ZyBzbyBlbmFibGVzIHRoZSBkYXRhIHNvdXJjZSB0byByZWNlaXZlCisgIC8vIFNldHVwL1N0YXJ0
L1N0b3Agbm90aWZpY2F0aW9ucyBhbmQgbWFrZXMgdGhlIFRyYWNlKCkgbWV0aG9kIHdvcmsgd2hl
bgorICAvLyB0cmFjaW5nIGlzIGVuYWJsZWQgYW5kIHRoZSBkYXRhIHNvdXJjZSBpcyBzZWxlY3Rl
ZC4KKyAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBUcmFjaW5nOjpJbml0aWFsaXplKCku
CisgIC8vIENhbiByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIGZhaWx1cmUgaWYgYXR0ZW1waW5nIHRv
IHJlZ2lzdGVyIG1vcmUgdGhhbgorICAvLyBrTWF4RGF0YVNvdXJjZXMgKDMyKSBkYXRhIHNvdXJj
ZXMgdHlwZXMgb3IgaWYgdHJhY2luZyBoYXNuJ3QgYmVlbgorICAvLyBpbml0aWFsaXplZC4KKyAg
c3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgRGF0YVNvdXJjZURlc2NyaXB0b3ImIGRlc2NyaXB0
b3IpIHsKKyAgICAvLyBTaWxlbmNlcyAtV3VudXNlZC12YXJpYWJsZSB3YXJuaW5nIGluIGNhc2Ug
dGhlIHRyYWNlIG1ldGhvZCBpcyBub3QgdXNlZAorICAgIC8vIGJ5IHRoZSB0cmFuc2xhdGlvbiB1
bml0IHRoYXQgZGVjbGFyZXMgdGhlIGRhdGEgc291cmNlLgorICAgICh2b2lkKXN0YXRpY19zdGF0
ZV87CisgICAgKHZvaWQpdGxzX3N0YXRlXzsKKworICAgIGF1dG8gZmFjdG9yeSA9IFtdIHsKKyAg
ICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGF0YVNvdXJjZUJhc2U+KG5ldyBEYXRhU291cmNl
VHlwZSgpKTsKKyAgICB9OworICAgIGF1dG8qIHRyYWNpbmdfaW1wbCA9IGludGVybmFsOjpUcmFj
aW5nTXV4ZXI6OkdldCgpOworICAgIGlmICghdHJhY2luZ19pbXBsKQorICAgICAgcmV0dXJuIGZh
bHNlOworICAgIHJldHVybiB0cmFjaW5nX2ltcGwtPlJlZ2lzdGVyRGF0YVNvdXJjZShkZXNjcmlw
dG9yLCBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmc3RhdGljX3N0YXRlXyk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRyYWl0cyBmb3IgY3Vz
dG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIGEgc3BlY2lmaWMgdHJhY2UgcG9pbnQuCisgIHN0cnVj
dCBEZWZhdWx0VHJhY2VQb2ludFRyYWl0cyB7CisgICAgLy8gQnkgZGVmYXVsdCwgZXZlcnkgY2Fs
bCB0byBEYXRhU291cmNlOjpUcmFjZSgpIHdpbGwgcmVjb3JkIHRyYWNlIGV2ZW50cworICAgIC8v
IGZvciBldmVyeSBhY3RpdmUgaW5zdGFuY2Ugb2YgdGhhdCBkYXRhIHNvdXJjZS4gQSBzaW5nbGUg
dHJhY2UgcG9pbnQgY2FuLAorICAgIC8vIGhvd2V2ZXIsIHVzZSBhIGN1c3RvbSBzZXQgb2YgZW5h
YmxlIGZsYWdzIGZvciBtb3JlIGZpbmUgZ3JhaW5lZCBjb250cm9sCisgICAgLy8gb2Ygd2hlbiB0
aGF0IHRyYWNlIHBvaW50IGlzIGFjdGl2ZS4KKyAgICAvLworICAgIC8vIERBTkdFUjogd2hlbiBk
b2luZyB0aGlzLCB0aGUgZGF0YSBzb3VyY2UgbXVzdCB1c2UgdGhlIGFwcHJvcHJpYXRlIG1lbW9y
eQorICAgIC8vIGZlbmNlcyB3aGVuIGNoYW5naW5nIHRoZSBzdGF0ZSBvZiB0aGUgYml0bWFwLgor
ICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjphdG9taWM8dWludDMyX3Q+KiBHZXRBY3RpdmVJbnN0
YW5jZXMoKSB7CisgICAgICByZXR1cm4gJnN0YXRpY19zdGF0ZV8udmFsaWRfaW5zdGFuY2VzOwor
ICAgIH0KKyAgfTsKKworICAvLyBDcmVhdGUgdGhlIHVzZXIgcHJvdmlkZWQgaW5jcmVtZW50YWwg
c3RhdGUgaW4gdGhlIGdpdmVuIHRocmVhZC1sb2NhbAorICAvLyBzdG9yYWdlLiBOb3RlOiBUaGUg
c2Vjb25kIHBhcmFtZXRlciBoZXJlIGlzIHVzZWQgdG8gc3BlY2lhbGl6ZSB0aGUgY2FzZQorICAv
LyB3aGVyZSB0aGVyZSBpcyBubyBpbmNyZW1lbnRhbCBzdGF0ZSB0eXBlLgorICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVD4KKyAgc3RhdGljIHZvaWQgQ3JlYXRlSW5jcmVtZW50YWxTdGF0ZSgKKyAgICAg
IGludGVybmFsOjpEYXRhU291cmNlSW5zdGFuY2VUaHJlYWRMb2NhbFN0YXRlKiB0bHNfaW5zdCwK
KyAgICAgIGNvbnN0IFQqKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKCF0bHNfaW5zdC0+aW5jcmVt
ZW50YWxfc3RhdGUpOworICAgIHRsc19pbnN0LT5pbmNyZW1lbnRhbF9zdGF0ZSA9CisgICAgICAg
IGludGVybmFsOjpEYXRhU291cmNlSW5zdGFuY2VUaHJlYWRMb2NhbFN0YXRlOjpJbmNyZW1lbnRh
bFN0YXRlUG9pbnRlcigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KG5ldyBU
KCkpLAorICAgICAgICAgICAgW10odm9pZCogcCkgeyBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxU
Kj4ocCk7IH0pOworICB9CisgIHN0YXRpYyB2b2lkIENyZWF0ZUluY3JlbWVudGFsU3RhdGUoCisg
ICAgICBpbnRlcm5hbDo6RGF0YVNvdXJjZUluc3RhbmNlVGhyZWFkTG9jYWxTdGF0ZSosCisgICAg
ICBjb25zdCB2b2lkKikge30KKworICAvLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIG9iamVjdCBp
cyBvbmUgcGVyLXRocmVhZCBwZXItZGF0YS1zb3VyY2UtdHlwZSwgTk9UCisgIC8vIHBlciBkYXRh
LXNvdXJjZSAqaW5zdGFuY2UqLgorICBzdGF0aWMgaW50ZXJuYWw6OkRhdGFTb3VyY2VUaHJlYWRM
b2NhbFN0YXRlKiBHZXRPckNyZWF0ZURhdGFTb3VyY2VUTFMoCisgICAgICBpbnRlcm5hbDo6RGF0
YVNvdXJjZVN0YXRpY1N0YXRlKiBzdGF0aWNfc3RhdGUpIHsKKyNpZiBQRVJGRVRUT19CVUlMREZM
QUcoUEVSRkVUVE9fT1NfSU9TKQorICAgIFBFUkZFVFRPX0ZBVEFMKCJEYXRhIHNvdXJjZSBUTFMg
bm90IHN1cHBvcnRlZCBvbiBpT1MsIHNlZSBiLzE1ODgxNDA2OCIpOworI2VuZGlmCisgICAgYXV0
byogdHJhY2luZ19pbXBsID0gaW50ZXJuYWw6OlRyYWNpbmdNdXhlcjo6R2V0KCk7CisgICAgaW50
ZXJuYWw6OlRyYWNpbmdUTFMqIHJvb3RfdGxzID0gdHJhY2luZ19pbXBsLT5HZXRPckNyZWF0ZVRy
YWNpbmdUTFMoKTsKKyAgICBpbnRlcm5hbDo6RGF0YVNvdXJjZVRocmVhZExvY2FsU3RhdGUqIGRz
X3RscyA9CisgICAgICAgIERhdGFTb3VyY2VUcmFpdHM6OkdldERhdGFTb3VyY2VUTFMoc3RhdGlj
X3N0YXRlLCByb290X3Rscyk7CisgICAgLy8gV2Uga2VlcCByZS1pbml0aWFsaXppbmcgYXMgdGhl
IGluaXRpYWxpemF0aW9uIGlzIGlkZW1wb3RlbnQgYW5kIG5vdCB3b3J0aAorICAgIC8vIHRoZSBj
b2RlIGZvciBleHRyYSBjaGVja3MuCisgICAgZHNfdGxzLT5zdGF0aWNfc3RhdGUgPSBzdGF0aWNf
c3RhdGU7CisgICAgYXNzZXJ0KCFkc190bHMtPnJvb3RfdGxzIHx8IGRzX3Rscy0+cm9vdF90bHMg
PT0gcm9vdF90bHMpOworICAgIGRzX3Rscy0+cm9vdF90bHMgPSByb290X3RsczsKKyAgICByZXR1
cm4gZHNfdGxzOworICB9CisKKyAgLy8gU3RhdGljIHN0YXRlLiBBY2Nlc3NlZCBieSB0aGUgc3Rh
dGljIFRyYWNlKCkgbWV0aG9kIGZhc3RwYXRocy4KKyAgc3RhdGljIGludGVybmFsOjpEYXRhU291
cmNlU3RhdGljU3RhdGUgc3RhdGljX3N0YXRlXzsKKworICAvLyBUaGlzIFRMUyBvYmplY3QgaXMg
YSBjYWNoZWQgcmF3IHBvaW50ZXIgYW5kIGhhcyBkZWxpYmVyYXRlbHkgbm8gZGVzdHJ1Y3Rvci4K
KyAgLy8gVGhlIFBsYXRmb3JtIGltcGxlbWVudGF0aW9uIGlzIHN1cHBvc2VkIHRvIGNyZWF0ZSBh
bmQgbWFuYWdlIHRoZSBsaWZldGltZQorICAvLyBvZiB0aGUgUGxhdGZvcm06OlRocmVhZExvY2Fs
T2JqZWN0IGFuZCB0YWtlIGNhcmUgb2YgZGVzdHJveWluZyBpdC4KKyAgLy8gVGhpcyBpcyBiZWNh
dXNlIG5vbi1QT0QgdGhyZWFkX2xvY2FsIHZhcmlhYmxlcyBoYXZlIHN1YnRsZXRpZXMgKGdsb2Jh
bAorICAvLyBkZXN0cnVjdG9ycykgdGhhdCB3ZSBuZWVkIHRvIGRlZmVyIHRvIHRoZSBlbWJlZGRl
ci4gSW4gY2hyb21pdW0ncyBwbGF0Zm9ybQorICAvLyBpbXBsZW1lbnRhdGlvbiwgZm9yIGluc3Rh
bmNlLCB0aGUgdGxzIHNsb3QgaXMgaW1wbGVtZW50ZWQgdXNpbmcKKyAgLy8gY2hyb21pdW0ncyBi
YXNlOjpUaHJlYWRMb2NhbFN0b3JhZ2UuCisgIHN0YXRpYyBQRVJGRVRUT19USFJFQURfTE9DQUwg
aW50ZXJuYWw6OkRhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlKiB0bHNfc3RhdGVfOworfTsKKwor
Ly8gc3RhdGljCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRD4KK2ludGVybmFsOjpE
YXRhU291cmNlU3RhdGljU3RhdGUgRGF0YVNvdXJjZTxULCBEPjo6c3RhdGljX3N0YXRlXzsKKy8v
IHN0YXRpYwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEQ+CitQRVJGRVRUT19USFJF
QURfTE9DQUwgaW50ZXJuYWw6OkRhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlKgorICAgIERhdGFT
b3VyY2U8VCwgRD46OnRsc19zdGF0ZV87CisKK30gIC8vIG5hbWVzcGFjZSBwZXJmZXR0bworCisv
LyBJZiBwbGFjZWQgYXQgdGhlIGVuZCBvZiBhIG1hY3JvIGRlY2xhcmF0aW9uLCBlYXRzIHRoZSBz
ZW1pY29sb24gYXQgdGhlIGVuZCBvZgorLy8gdGhlIG1hY3JvIGludm9jYXRpb24gKGUuZy4sICJN
QUNSTyguLi4pOyIpIHRvIGF2b2lkIHdhcm5pbmdzIGFib3V0IGV4dHJhCisvLyBzZW1pY29sb25z
LgorI2RlZmluZSBQRVJGRVRUT19JTlRFUk5BTF9TV0FMTE9XX1NFTUlDT0xPTigpIFwKKyAgZXh0
ZXJuIGludCBwZXJmZXR0b19pbnRlcm5hbF91bnVzZWQKKworLy8gVGhpcyBtYWNybyBtdXN0IGJl
IHVzZWQgb25jZSBmb3IgZWFjaCBkYXRhIHNvdXJjZSBuZXh0IHRvIHRoZSBkYXRhIHNvdXJjZSdz
CisvLyBkZWNsYXJhdGlvbi4KKyNkZWZpbmUgUEVSRkVUVE9fREVDTEFSRV9EQVRBX1NPVVJDRV9T
VEFUSUNfTUVNQkVSUyguLi4pICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQRVJG
RVRUT19DT01QT05FTlRfRVhQT1JUIHBlcmZldHRvOjppbnRlcm5hbDo6RGF0YVNvdXJjZVN0YXRp
Y1N0YXRlIFwKKyAgICAgIHBlcmZldHRvOjpEYXRhU291cmNlPF9fVkFfQVJHU19fPjo6c3RhdGlj
X3N0YXRlXzsgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQRVJGRVRUT19DT01Q
T05FTlRfRVhQT1JUIHRocmVhZF9sb2NhbCBwZXJmZXR0bzo6aW50ZXJuYWw6OiAgICAgICAgIFwK
KyAgICAgIERhdGFTb3VyY2VUaHJlYWRMb2NhbFN0YXRlKiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgcGVyZmV0dG86OkRhdGFTb3VyY2U8X19WQV9BUkdT
X18+Ojp0bHNfc3RhdGVfCisKKy8vIFRoaXMgbWFjcm8gbXVzdCBiZSB1c2VkIG9uY2UgZm9yIGVh
Y2ggZGF0YSBzb3VyY2UgaW4gb25lIHNvdXJjZSBmaWxlIHRvCisvLyBhbGxvY2F0ZSBzdGF0aWMg
c3RvcmFnZSBmb3IgdGhlIGRhdGEgc291cmNlJ3Mgc3RhdGljIHN0YXRlLgorI2RlZmluZSBQRVJG
RVRUT19ERUZJTkVfREFUQV9TT1VSQ0VfU1RBVElDX01FTUJFUlMoLi4uKSAgICAgICAgICAgICAg
IFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgIFBFUkZFVFRPX0NPTVBPTkVOVF9FWFBPUlQgcGVyZmV0dG86
OmludGVybmFsOjpEYXRhU291cmNlU3RhdGljU3RhdGUgXAorICAgICAgcGVyZmV0dG86OkRhdGFT
b3VyY2U8X19WQV9BUkdTX18+OjpzdGF0aWNfc3RhdGVfe307ICAgICAgICAgICAgIFwKKyAgdGVt
cGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgIFBFUkZFVFRPX0NPTVBPTkVOVF9FWFBPUlQgdGhyZWFkX2xvY2FsIHBlcmZl
dHRvOjppbnRlcm5hbDo6ICAgICAgICAgXAorICAgICAgRGF0YVNvdXJjZVRocmVhZExvY2FsU3Rh
dGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBwZXJm
ZXR0bzo6RGF0YVNvdXJjZTxfX1ZBX0FSR1NfXz46OnRsc19zdGF0ZV8gPSBudWxscHRyCisKKyNl
bmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0RBVEFfU09VUkNFX0hfCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvdHJhY2lu
Zy5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Ry
YWNpbmcvaW50ZXJuYWwvaW5fcHJvY2Vzc190cmFjaW5nX2JhY2tlbmQuaAorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL3RyYWNpbmdfYmFj
a2VuZC5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNl
IFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn
L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi
bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAq
IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhl
IExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfVFJBQ0lO
R19CQUNLRU5EX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDSU5HX0JB
Q0tFTkRfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhwb3J0Lmgi
CisKKy8vIFRoZSBlbWJlZGRlciBjYW4gKGJ1dCBkb2Vzbid0IGhhdmUgdG8pIGV4dGVuZCB0aGUg
VHJhY2luZ0JhY2tlbmQgY2xhc3MgYW5kCisvLyBwYXNzIGFzIGFuIGFyZ3VtZW50IHRvIFRyYWNp
bmc6OkluaXRpYWxpemUoa0N1c3RvbUJhY2tlbmQpIHRvIG92ZXJyaWRlIHRoZQorLy8gd2F5IHRv
IHJlYWNoIHRoZSBzZXJ2aWNlLiBUaGlzIGlzIGZvciBwZWN1bGlhciBjYXNlcyB3aGVyZSB0aGUg
ZW1iZWRkZXIgaGFzCisvLyBhIG11bHRpLXByb2Nlc3MgYXJjaGl0ZWN0dXJlIGFuZCB3YW50cyB0
byBvdmVycmlkZSB0aGUgSVBDIHRyYW5zcG9ydC4gVGhlCisvLyByZWFsIHVzZS1jYXNlIGZvciB0
aGlzIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcgaXMgY2hyb21pdW0gKCsgTW9qbyBJUEMpLgorLy8g
RXh0ZW5kaW5nIHRoaXMgY2xhc3MgcmVxdWlyZXMgZGVwZW5kaW5nIG9uIHRoZSBmdWxsIHNldCBv
ZiBwZXJmZXR0byBoZWFkZXJzCisvLyAobm90IGp1c3QgL3B1YmxpYy8pLiBDb250YWN0IHRoZSB0
ZWFtIGJlZm9yZSBkb2luZyBzbyBhcyB0aGUgbm9uLXB1YmxpYworLy8gaGVhZGVycyBhcmUgbm90
IGd1YXJhbnRlZWQgdG8gYmUgQVBJIHN0YWJsZS4KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKwor
bmFtZXNwYWNlIGJhc2UgeworY2xhc3MgVGFza1J1bm5lcjsKK30KKworLy8gVGhlc2UgY2xhc3Nl
cyBhcmUgZGVjbGFyZWQgaW4gaGVhZGVycyBvdXRzaWRlIG9mIC9wdWJsaWMvLgorY2xhc3MgQ29u
c3VtZXI7CitjbGFzcyBDb25zdW1lckVuZHBvaW50OworY2xhc3MgUHJvZHVjZXI7CitjbGFzcyBQ
cm9kdWNlckVuZHBvaW50OworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2luZ0JhY2tlbmQg
eworIHB1YmxpYzoKKyAgdmlydHVhbCB+VHJhY2luZ0JhY2tlbmQoKTsKKworICAvLyBDb25uZWN0
cyBhIFByb2R1Y2VyIGluc3RhbmNlIGFuZCBvYnRhaW5zIGEgUHJvZHVjZXJFbmRwb2ludCwgd2hp
Y2ggaXMKKyAgLy8gZXNzZW50aWFsbHkgYSAxOjEgY2hhbm5lbCBiZXR3ZWVuIG9uZSBQcm9kdWNl
ciBhbmQgdGhlIFNlcnZpY2UuCisgIC8vIFRvIGRpc2Nvbm5lY3QganVzdCBkZXN0cm95IHRoZSBy
ZXR1cm5lZCBlbmRwb2ludCBvYmplY3QuIEl0IGlzIHNhZmUgdG8KKyAgLy8gZGVzdHJveSB0aGUg
UHJvZHVjZXIgb25jZSBQcm9kdWNlcjo6T25EaXNjb25uZWN0KCkgaGFzIGJlZW4gaW52b2tlZC4K
KyAgc3RydWN0IENvbm5lY3RQcm9kdWNlckFyZ3MgeworICAgIHN0ZDo6c3RyaW5nIHByb2R1Y2Vy
X25hbWU7CisKKyAgICAvLyBUaGUgUHJvZHVjZXIgb2JqZWN0IHRoYXQgd2lsbCByZWNlaXZlIGNh
bGxzIGxpa2UgU3RhcnQvU3RvcERhdGFTb3VyY2UoKS4KKyAgICAvLyBUaGUgY2FsbGVyIGhhcyB0
byBndWFyYW50ZWUgdGhhdCB0aGlzIG9iamVjdCBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZQorICAg
IC8vIHJldHVybmVkIFByb2R1Y2VyRW5kcG9pbnQgaXMgYWxpdmUuCisgICAgUHJvZHVjZXIqIHBy
b2R1Y2VyID0gbnVsbHB0cjsKKworICAgIC8vIFRoZSB0YXNrIHJ1bm5lciB3aGVyZSB0aGUgUHJv
ZHVjZXIgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBvbnRvLgorICAgIC8vIFRoZSBjYWxsZXIgaGFz
IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBwYXNzZWQgVGFza1J1bm5lciBpcyB2YWxpZCBhcyBsb25n
CisgICAgLy8gYXMgdGhlIHJldHVybmVkIFByb2R1Y2VyRW5kcG9pbnQgaXMgYWxpdmUuCisgICAg
OjpwZXJmZXR0bzo6YmFzZTo6VGFza1J1bm5lciogdGFza19ydW5uZXIgPSBudWxscHRyOworCisg
ICAgLy8gVGhlc2UgZ2V0IHByb3BhZ2F0ZWQgZnJvbSBUcmFjaW5nSW5pdEFyZ3MgYW5kIGFyZSBv
cHRpb25hbGx5IHByb3ZpZGVkIGJ5CisgICAgLy8gdGhlIGNsaWVudCB3aGVuIGNhbGxpbmcgVHJh
Y2luZzo6SW5pdGlhbGl6ZSgpLgorICAgIHVpbnQzMl90IHNobWVtX3NpemVfaGludF9ieXRlcyA9
IDA7CisgICAgdWludDMyX3Qgc2htZW1fcGFnZV9zaXplX2hpbnRfYnl0ZXMgPSAwOworICB9Owor
CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFByb2R1Y2VyRW5kcG9pbnQ+IENvbm5lY3RQcm9k
dWNlcigKKyAgICAgIGNvbnN0IENvbm5lY3RQcm9kdWNlckFyZ3MmKSA9IDA7CisKKyAgLy8gQXMg
YWJvdmUsIGZvciB0aGUgQ29uc3VtZXItc2lkZS4KKyAgc3RydWN0IENvbm5lY3RDb25zdW1lckFy
Z3MgeworICAgIC8vIFRoZSBDb25zdW1lciBvYmplY3QgdGhhdCB3aWxsIHJlY2VpdmUgY2FsbHMg
bGlrZSBPblRyYWNpbmdEaXNhYmxlZCgpLAorICAgIC8vIE9uVHJhY2VEYXRhKCkuCisgICAgQ29u
c3VtZXIqIGNvbnN1bWVye307CisKKyAgICAvLyBUaGUgdGFzayBydW5uZXIgd2hlcmUgdGhlIENv
bnN1bWVyIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgb250by4KKyAgICA6OnBlcmZldHRvOjpiYXNl
OjpUYXNrUnVubmVyKiB0YXNrX3J1bm5lcnt9OworICB9OworICB2aXJ0dWFsIHN0ZDo6dW5pcXVl
X3B0cjxDb25zdW1lckVuZHBvaW50PiBDb25uZWN0Q29uc3VtZXIoCisgICAgICBjb25zdCBDb25u
ZWN0Q29uc3VtZXJBcmdzJikgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisK
KyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNJTkdfQkFDS0VORF9IXwor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0
CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAo
dGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBj
b21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2Yg
dGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl
cy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBv
ciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VU
IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig
aW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdv
dmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNl
LgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX0lOX1BS
T0NFU1NfVFJBQ0lOR19CQUNLRU5EX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lO
R19JTlRFUk5BTF9JTl9QUk9DRVNTX1RSQUNJTkdfQkFDS0VORF9IXworCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy90cmFjaW5n
X2JhY2tlbmQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKworbmFtZXNwYWNlIGJhc2Ugewor
Y2xhc3MgVGFza1J1bm5lcjsKK30KKworY2xhc3MgUHJvZHVjZXI7CitjbGFzcyBUcmFjaW5nU2Vy
dmljZTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBidWlsdC1pbiBpbXBsZW1lbnRh
dGlvbiBvZiBUcmFjaW5nQmFja2VuZCB0aGF0IGNyZWF0ZXMgYSB0cmFjaW5nIHNlcnZpY2UKKy8v
IGluc3RhbmNlIGluLXByb2Nlc3MuIEluc3RhbnRpYXRlZCB3aGVuIHRoZSBlbWJlZGRlciBjYWxs
cworLy8gVHJhY2luZzo6SW5pdGlhbGl6ZShrSW5Qcm9jZXNzQmFja2VuZCkuIFNvbHZlcyBtb3N0
IGluLWFwcC1vbmx5IHRyYWNpbmcKKy8vIHVzZS1jYXNlcy4KK2NsYXNzIFBFUkZFVFRPX0VYUE9S
VCBJblByb2Nlc3NUcmFjaW5nQmFja2VuZCA6IHB1YmxpYyBUcmFjaW5nQmFja2VuZCB7CisgcHVi
bGljOgorICBzdGF0aWMgVHJhY2luZ0JhY2tlbmQqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gVHJh
Y2luZ0JhY2tlbmQgaW1wbGVtZW50YXRpb24uCisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9kdWNlckVu
ZHBvaW50PiBDb25uZWN0UHJvZHVjZXIoCisgICAgICBjb25zdCBDb25uZWN0UHJvZHVjZXJBcmdz
Jikgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lckVuZHBvaW50PiBDb25uZWN0
Q29uc3VtZXIoCisgICAgICBjb25zdCBDb25uZWN0Q29uc3VtZXJBcmdzJikgb3ZlcnJpZGU7CisK
KyBwcml2YXRlOgorICBJblByb2Nlc3NUcmFjaW5nQmFja2VuZCgpOworICBUcmFjaW5nU2Vydmlj
ZSogR2V0T3JDcmVhdGVTZXJ2aWNlKGJhc2U6OlRhc2tSdW5uZXIqKTsKKworICBzdGQ6OnVuaXF1
ZV9wdHI8VHJhY2luZ1NlcnZpY2U+IHNlcnZpY2VfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGlu
dGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BF
UkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfSU5fUFJPQ0VTU19UUkFDSU5HX0JBQ0tFTkRfSF8KKy8v
IGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vdHJhY2luZy9p
bnRlcm5hbC9zeXN0ZW1fdHJhY2luZ19iYWNrZW5kLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVy
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91
IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl
bnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICog
ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV
bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs
IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl
ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP
TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp
Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xV
REVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9TWVNURU1fVFJBQ0lOR19CQUNLRU5EX0hfCisj
ZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9TWVNURU1fVFJBQ0lOR19C
QUNLRU5EX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by90cmFjaW5nL3RyYWNpbmdfYmFja2VuZC5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworCituYW1lc3BhY2UgYmFzZSB7CitjbGFzcyBUYXNrUnVubmVyOworfQorCitjbGFzcyBQ
cm9kdWNlcjsKKworLy8gQSBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbiBvZiBUcmFjaW5nQmFja2Vu
ZCB0aGF0IGNvbm5lY3RzIHRvIHRoZSBzeXN0ZW0KKy8vIHRyYWNpbmcgZGFlbW9uICh0cmFjZWQp
IHZpYSBhIFVOSVggc29ja2V0IHVzaW5nIHRoZSBwZXJmZXR0byBidWlsdC1pbgorLy8gcHJvdG8t
YmFzZWQgSVBDIG1lY2hhbmlzbS4gSW5zdGFudGlhdGVkIHdoZW4gdGhlIGVtYmVkZGVyIGNhbGxz
CisvLyBUcmFjaW5nOjpJbml0aWFsaXplKGtTeXN0ZW1CYWNrZW5kKS4gSXQgYWxsb3dzIHRvIGdl
dCBhcHAtdHJhY2VzIGZ1c2VkCisvLyB0b2dldGhlciB3aXRoIHN5c3RlbSB0cmFjZXMsIHVzZWZ1
bCB0byBjb3JyZWxhdGUgb24gdGhlIHRpbWVsaW5lIHN5c3RlbQorLy8gZXZlbnRzIChlLmcuIHNj
aGVkdWxpbmcgc2xpY2VzIGZyb20gdGhlIGtlcm5lbCkgd2l0aCBpbi1hcHAgZXZlbnRzLgorbmFt
ZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBTeXN0ZW1UcmFjaW5nQmFj
a2VuZCA6IHB1YmxpYyBUcmFjaW5nQmFja2VuZCB7CisgcHVibGljOgorICBzdGF0aWMgVHJhY2lu
Z0JhY2tlbmQqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gVHJhY2luZ0JhY2tlbmQgaW1wbGVtZW50
YXRpb24uCisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9kdWNlckVuZHBvaW50PiBDb25uZWN0UHJvZHVj
ZXIoCisgICAgICBjb25zdCBDb25uZWN0UHJvZHVjZXJBcmdzJikgb3ZlcnJpZGU7CisgIHN0ZDo6
dW5pcXVlX3B0cjxDb25zdW1lckVuZHBvaW50PiBDb25uZWN0Q29uc3VtZXIoCisgICAgICBjb25z
dCBDb25uZWN0Q29uc3VtZXJBcmdzJikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBTeXN0ZW1U
cmFjaW5nQmFja2VuZCgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBu
YW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdf
SU5URVJOQUxfU1lTVEVNX1RSQUNJTkdfQkFDS0VORF9IXworLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5k
ZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5
b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExp
Y2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisg
KiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAq
IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGlu
Zywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1
dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElU
SU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUg
TGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBh
bmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5D
TFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNJTkdfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRU
T19UUkFDSU5HX1RSQUNJTkdfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0
ZGludC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5j
bHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9jb21waWxlci5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2lu
Zy9jb3JlL2ZvcndhcmRfZGVjbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvaW5fcHJvY2Vzc190cmFjaW5nX2JhY2tl
bmQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Ry
YWNpbmcvaW50ZXJuYWwvc3lzdGVtX3RyYWNpbmdfYmFja2VuZC5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgVHJhY2luZ011eGVySW1wbDsK
K30KKworY2xhc3MgVHJhY2luZ0JhY2tlbmQ7CitjbGFzcyBQbGF0Zm9ybTsKK2NsYXNzIFRyYWNp
bmdTZXNzaW9uOyAgLy8gRGVjbGFyZWQgYmVsb3cuCisKK2VudW0gQmFja2VuZFR5cGUgOiB1aW50
MzJfdCB7CisgIGtVbnNwZWNpZmllZEJhY2tlbmQgPSAwLAorCisgIC8vIENvbm5lY3RzIHRvIGEg
cHJldmlvdXNseS1pbml0aWFsaXplZCBwZXJmZXR0byB0cmFjaW5nIGJhY2tlbmQgZm9yCisgIC8v
IGluLXByb2Nlc3MuIElmIHRoZSBpbi1wcm9jZXNzIGJhY2tlbmQgaGFzIG5vdCBiZWVuIHByZXZp
b3VzbHkgaW5pdGlhbGl6ZWQKKyAgLy8gaXQgd2lsbCBkbyBzbyBhbmQgY3JlYXRlIHRoZSB0cmFj
aW5nIHNlcnZpY2Ugb24gYSBkZWRpY2F0ZWQgdGhyZWFkLgorICBrSW5Qcm9jZXNzQmFja2VuZCA9
IDEgPDwgMCwKKworICAvLyBDb25uZWN0cyB0byB0aGUgc3lzdGVtIHRyYWNpbmcgc2VydmljZSAo
ZS5nLiBvbiBMaW51eC9BbmRyb2lkL01hYyB1c2VzIGEKKyAgLy8gbmFtZWQgVU5JWCBzb2NrZXQp
LgorICBrU3lzdGVtQmFja2VuZCA9IDEgPDwgMSwKKworICAvLyBVc2VkIHRvIHByb3ZpZGUgYSBj
dXN0b20gSVBDIHRyYW5zcG9ydCB0byBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlLgorICAvLyBUcmFj
aW5nSW5pdEFyZ3M6OmN1c3RvbV9iYWNrZW5kIG11c3QgYmUgbm9uLW51bGwgYW5kIHBvaW50IHRv
IGFuCisgIC8vIGluZGVmaW5pdGVseSBsaXZlZCBpbnN0YW5jZS4KKyAga0N1c3RvbUJhY2tlbmQg
PSAxIDw8IDIsCit9OworCitzdHJ1Y3QgVHJhY2luZ0luaXRBcmdzIHsKKyAgdWludDMyX3QgYmFj
a2VuZHMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBvciBtb3JlIEJhY2tlbmRGbGFn
cy4KKyAgVHJhY2luZ0JhY2tlbmQqIGN1c3RvbV9iYWNrZW5kID0gbnVsbHB0cjsgIC8vIFtPcHRp
b25hbF0uCisKKyAgLy8gW09wdGlvbmFsXSBQbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbi4gSXQgYWxs
b3dzIHRoZSBlbWJlZGRlciB0byB0YWtlIGNvbnRyb2wKKyAgLy8gb2YgcGxhdGZvcm0tc3BlY2lm
aWMgYml0cyBsaWtlIHRocmVhZCBjcmVhdGlvbiBhbmQgVExTIHNsb3QgaGFuZGxpbmcuIElmCisg
IC8vIG5vdCBzZXQgaXQgd2lsbCB1c2UgUGxhdGZvcm06OkdldERlZmF1bHRQbGF0Zm9ybSgpLgor
ICBQbGF0Zm9ybSogcGxhdGZvcm0gPSBudWxscHRyOworCisgIC8vIFtPcHRpb25hbF0gVHVuZSB0
aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgYmV0d2VlbiB0aGUgY3VycmVudAor
ICAvLyBwcm9jZXNzIGFuZCB0aGUgc2VydmljZSBiYWNrZW5kKHMpLiBUaGlzIGlzIGEgdHJhZGUt
b2ZmIGJldHdlZW4gbWVtb3J5CisgIC8vIGZvb3RwcmludCBhbmQgdGhlIGFiaWxpdHkgdG8gc3Vz
dGFpbiBidXJzdHMgb2YgdHJhY2Ugd3JpdGVzIChzZWUgY29tbWVudHMKKyAgLy8gaW4gc2hhcmVk
X21lbW9yeV9hYmkuaCkuCisgIC8vIElmIHNldCwgdGhlIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBs
ZSBvZiA0S0IuIFRoZSB2YWx1ZSBjYW4gYmUgaWdub3JlZCBpZgorICAvLyBsYXJnZXIgdGhhbiBr
TWF4U2htU2l6ZSAoMzJNQikgb3Igbm90IGEgbXVsdGlwbGUgb2YgNEtCLgorICB1aW50MzJfdCBz
aG1lbV9zaXplX2hpbnRfa2IgPSAwOworCisgIC8vIFtPcHRpb25hbF0gU3BlY2lmaWVzIHRoZSBw
cmVmZXJyZWQgc2l6ZSBvZiBlYWNoIHBhZ2UgaW4gdGhlIHNobWVtIGJ1ZmZlci4KKyAgLy8gVGhp
cyBpcyBhIHRyYWRlLW9mZiBiZXR3ZWVuIElQQyBvdmVyaGVhZCBhbmQgZnJhZ21lbnRhdGlvbi9l
ZmZpY2llbmN5IG9mCisgIC8vIHRoZSBzaG1lbSBidWZmZXIgaW4gcHJlc2VuY2Ugb2YgbXVsdGlw
bGUgd3JpdGVyIHRocmVhZHMuCisgIC8vIE11c3QgYmUgb25lIG9mIFs0LCA4LCAxNiwgMzJdLgor
ICB1aW50MzJfdCBzaG1lbV9wYWdlX3NpemVfaGludF9rYiA9IDA7CisKKyBwcm90ZWN0ZWQ6Cisg
IGZyaWVuZCBjbGFzcyBUcmFjaW5nOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRyYWNpbmdN
dXhlckltcGw7CisKKyAgLy8gVXNlZCBvbmx5IGJ5IHRoZSBEQ0hFQ0sgaW4gdHJhY2luZy5jYywg
dG8gY2hlY2sgdGhhdCB0aGUgY29uZmlnIGlzIHRoZQorICAvLyBzYW1lIGluIGNhc2Ugb2YgcmUt
aW5pdGlhbGl6YXRpb24uCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUcmFjaW5nSW5pdEFyZ3Mm
IG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dGllKGJhY2tlbmRzLCBjdXN0b21fYmFj
a2VuZCwgcGxhdGZvcm0sIHNobWVtX3NpemVfaGludF9rYiwKKyAgICAgICAgICAgICAgICAgICAg
c2htZW1fcGFnZV9zaXplX2hpbnRfa2IsIGluX3Byb2Nlc3NfYmFja2VuZF9mYWN0b3J5XywKKyAg
ICAgICAgICAgICAgICAgICAgc3lzdGVtX2JhY2tlbmRfZmFjdG9yeV8sIGRjaGVja19pc19vbl8p
ID09CisgICAgICAgICAgIHN0ZDo6dGllKG90aGVyLmJhY2tlbmRzLCBvdGhlci5jdXN0b21fYmFj
a2VuZCwgb3RoZXIucGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgIG90aGVyLnNobWVtX3Np
emVfaGludF9rYiwgb3RoZXIuc2htZW1fcGFnZV9zaXplX2hpbnRfa2IsCisgICAgICAgICAgICAg
ICAgICAgIG90aGVyLmluX3Byb2Nlc3NfYmFja2VuZF9mYWN0b3J5XywKKyAgICAgICAgICAgICAg
ICAgICAgb3RoZXIuc3lzdGVtX2JhY2tlbmRfZmFjdG9yeV8sIG90aGVyLmRjaGVja19pc19vbl8p
OworICB9CisKKyAgdXNpbmcgQmFja2VuZEZhY3RvcnlGdW5jdGlvbiA9IFRyYWNpbmdCYWNrZW5k
KiAoKikoKTsKKyAgQmFja2VuZEZhY3RvcnlGdW5jdGlvbiBpbl9wcm9jZXNzX2JhY2tlbmRfZmFj
dG9yeV8gPSBudWxscHRyOworICBCYWNrZW5kRmFjdG9yeUZ1bmN0aW9uIHN5c3RlbV9iYWNrZW5k
X2ZhY3RvcnlfID0gbnVsbHB0cjsKKyAgYm9vbCBkY2hlY2tfaXNfb25fID0gUEVSRkVUVE9fRENI
RUNLX0lTX09OKCk7Cit9OworCisvLyBUaGUgZW50cnktcG9pbnQgZm9yIHVzaW5nIHBlcmZldHRv
LgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNpbmcgeworIHB1YmxpYzoKKyAgLy8gSW5pdGlh
bGl6ZXMgUGVyZmV0dG8gd2l0aCB0aGUgZ2l2ZW4gYmFja2VuZHMgaW4gdGhlIGNhbGxpbmcgcHJv
Y2VzcyBhbmQvb3IKKyAgLy8gd2l0aCBhIHVzZXItcHJvdmlkZWQgYmFja2VuZC4gTm8tb3AgaWYg
Y2FsbGVkIG1vcmUgdGhhbiBvbmNlLgorICBzdGF0aWMgaW5saW5lIHZvaWQgSW5pdGlhbGl6ZShj
b25zdCBUcmFjaW5nSW5pdEFyZ3MmIGFyZ3MpCisgICAgICBQRVJGRVRUT19BTFdBWVNfSU5MSU5F
IHsKKyAgICBUcmFjaW5nSW5pdEFyZ3MgYXJnc19jb3B5KGFyZ3MpOworICAgIC8vIFRoaXMgY29k
ZSBpcyBpbmxpbmVkIHRvIGFsbG93IGRlYWQtY29kZSBlbGltaW5hdGlvbiBmb3IgdW51c2VkIGJh
Y2tlbmRzLgorICAgIC8vIFRoaXMgc2F2ZXMgfjIwMCBLQiB3aGVuIG5vdCB1c2luZyB0aGUgaW4t
cHJvY2VzcyBiYWNrZW5kIChiLzE0ODE5ODk5MykuCisgICAgLy8gVGhlIGxvZ2ljIGJlaGluZCBp
dCBpcyB0aGUgZm9sbG93aW5nOgorICAgIC8vIE5vdGhpbmcgb3RoZXIgdGhhbiB0aGUgY29kZSBi
ZWxvdyByZWZlcmVuY2VzIHRoZSB0d28gR2V0SW5zdGFuY2UoKQorICAgIC8vIG1ldGhvZHMuIEZy
b20gYSBsaW5rZXItZ3JhcGggdmlld3BvaW50LCB0aG9zZSBHZXRJbnN0YW5jZSgpIHB1bGwgaW4g
bWFueQorICAgIC8vIG90aGVyIHBpZWNlcyBvZiB0aGUgY29kZWJhc2UgKGUuZy4gSW5Qcm9jZXNz
VHJhY2luZ0JhY2tlbmQgcHVsbHMgdGhlCisgICAgLy8gd2hvbGUgVHJhY2luZ1NlcnZpY2VJbXBs
LCBTeXN0ZW1UcmFjaW5nQmFja2VuZCBwdWxscyB0aGUgd2hvbGUgLy9pcGMKKyAgICAvLyBsYXll
cikuIER1ZSB0byB0aGUgaW5saW5lLCB0aGUgY29tcGlsZXIgY2FuIHNlZSB0aHJvdWdoIHRoZSBj
b2RlIGFuZAorICAgIC8vIHJlYWxpemUgdGhhdCBzb21lIGJyYW5jaGVzIGFyZSBhbHdheXMgbm90
IHRha2VuLiBXaGVuIHRoYXQgaGFwcGVucywgbm8KKyAgICAvLyByZWZlcmVuY2UgdG8gdGhlIGJh
Y2tlbmRzJyBHZXRJbnN0YW5jZSgpIGlzIGVtaXR0ZWQgYW5kIHRoYXQgYWxsb3dzIHRoZQorICAg
IC8vIGxpbmtlciBHQyB0byBnZXQgcmlkIG9mIHRoZSBlbnRpcmUgc2V0IG9mIGRlcGVuZGVuY2ll
cy4KKyAgICBpZiAoYXJncy5iYWNrZW5kcyAmIGtJblByb2Nlc3NCYWNrZW5kKSB7CisgICAgICBh
cmdzX2NvcHkuaW5fcHJvY2Vzc19iYWNrZW5kX2ZhY3RvcnlfID0KKyAgICAgICAgICAmaW50ZXJu
YWw6OkluUHJvY2Vzc1RyYWNpbmdCYWNrZW5kOjpHZXRJbnN0YW5jZTsKKyAgICB9CisgICAgaWYg
KGFyZ3MuYmFja2VuZHMgJiBrU3lzdGVtQmFja2VuZCkgeworICAgICAgYXJnc19jb3B5LnN5c3Rl
bV9iYWNrZW5kX2ZhY3RvcnlfID0KKyAgICAgICAgICAmaW50ZXJuYWw6OlN5c3RlbVRyYWNpbmdC
YWNrZW5kOjpHZXRJbnN0YW5jZTsKKyAgICB9CisgICAgSW5pdGlhbGl6ZUludGVybmFsKGFyZ3Nf
Y29weSk7CisgIH0KKworICAvLyBTdGFydCBhIG5ldyB0cmFjaW5nIHNlc3Npb24gdXNpbmcgdGhl
IGdpdmVuIHRyYWNpbmcgYmFja2VuZC4gVXNlCisgIC8vIHxrVW5zcGVjaWZpZWRCYWNrZW5kfCB0
byBzZWxlY3QgYW4gYXZhaWxhYmxlIGJhY2tlbmQgYXV0b21hdGljYWxseS4KKyAgLy8gRm9yIHRo
ZSBtb21lbnQgdGhpcyBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gaW5pdGlhbGl6aW5nIHRyYWNpbmcg
aW4KKyAgLy8ga0luUHJvY2VzcyBtb2RlLiBGb3IgdGhlIHN5c3RlbSBtb2RlIHVzZSB0aGUgJ2Jp
bi9wZXJmZXR0bycgY21kbGluZSBjbGllbnQuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VHJh
Y2luZ1Nlc3Npb24+IE5ld1RyYWNlKAorICAgICAgQmFja2VuZFR5cGUgPSBrVW5zcGVjaWZpZWRC
YWNrZW5kKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemVJbnRlcm5hbChj
b25zdCBUcmFjaW5nSW5pdEFyZ3MmKTsKKworICBUcmFjaW5nKCkgPSBkZWxldGU7Cit9OworCitj
bGFzcyBQRVJGRVRUT19FWFBPUlQgVHJhY2luZ1Nlc3Npb24geworIHB1YmxpYzoKKyAgdmlydHVh
bCB+VHJhY2luZ1Nlc3Npb24oKTsKKworICAvLyBDb25maWd1cmUgdGhlIHNlc3Npb24gcGFzc2lu
ZyB0aGUgdHJhY2UgY29uZmlnLgorICAvLyBJZiBhIHdyaXRhYmxlIGZpbGUgaGFuZGxlIGlzIGdp
dmVuIHRocm91Z2ggfGZkfCwgdGhlIHRyYWNlIHdpbGwKKyAgLy8gYXV0b21hdGljYWxseSB3cml0
dGVuIHRvIHRoYXQgZmlsZS4gT3RoZXJ3aXNlIHlvdSBzaG91bGQgY2FsbCBSZWFkVHJhY2UoKQor
ICAvLyB0byByZXRyaWV2ZSB0aGUgdHJhY2UgZGF0YS4gVGhpcyBjYWxsIGRvZXMgbm90IHRha2Ug
b3duZXJzaGlwIG9mIHxmZHwuCisgIC8vIFRPRE8ocHJpbWlhbm8pOiBhZGQgYW4gZXJyb3IgY2Fs
bGJhY2suCisgIHZpcnR1YWwgdm9pZCBTZXR1cChjb25zdCBUcmFjZUNvbmZpZyYsIGludCBmZCA9
IC0xKSA9IDA7CisKKyAgLy8gRW5hYmxlIHRyYWNpbmcgYXN5bmNocm9ub3VzbHkuCisgIHZpcnR1
YWwgdm9pZCBTdGFydCgpID0gMDsKKworICAvLyBFbmFibGUgdHJhY2luZyBhbmQgYmxvY2sgdW50
aWwgdHJhY2luZyBoYXMgc3RhcnRlZC4gTm90ZSB0aGF0IGlmIGRhdGEKKyAgLy8gc291cmNlcyBh
cmUgcmVnaXN0ZXJlZCBhZnRlciB0aGlzIGNhbGwgd2FzIGluaXRpYXRlZCwgdGhlIGNhbGwgbWF5
IHJldHVybgorICAvLyBiZWZvcmUgdGhlIGFkZGl0aW9uYWwgZGF0YSBzb3VyY2VzIGhhdmUgc3Rh
cnRlZC4gQWxzbywgaWYgb3RoZXIgcHJvZHVjZXJzCisgIC8vIChlLmcuLCB3aXRoIHN5c3RlbS13
aWRlIHRyYWNpbmcpIGhhdmUgcmVnaXN0ZXJlZCBkYXRhIHNvdXJjZXMgd2l0aG91dCBzdGFydAor
ICAvLyBub3RpZmljYXRpb24gc3VwcG9ydCwgdGhpcyBjYWxsIG1heSByZXR1cm4gYmVmb3JlIHRo
b3NlIGRhdGEgc291cmNlcyBoYXZlCisgIC8vIHN0YXJ0ZWQuCisgIHZpcnR1YWwgdm9pZCBTdGFy
dEJsb2NraW5nKCkgPSAwOworCisgIC8vIERpc2FibGUgdHJhY2luZyBhc3luY2hyb25vdXNseS4K
KyAgLy8gVXNlIFNldE9uU3RvcENhbGxiYWNrKCkgdG8gZ2V0IGEgbm90aWZpY2F0aW9uIHdoZW4g
dGhlIHRyYWNpbmcgc2Vzc2lvbiBpcworICAvLyBmdWxseSBzdG9wcGVkIGFuZCBhbGwgZGF0YSBz
b3VyY2VzIGhhdmUgYWNrZWQuCisgIHZpcnR1YWwgdm9pZCBTdG9wKCkgPSAwOworCisgIC8vIERp
c2FibGUgdHJhY2luZyBhbmQgYmxvY2sgdW50aWwgdHJhY2luZyBoYXMgc3RvcHBlZC4KKyAgdmly
dHVhbCB2b2lkIFN0b3BCbG9ja2luZygpID0gMDsKKworICAvLyBUaGlzIGNhbGxiYWNrIHdpbGwg
YmUgaW52b2tlZCB3aGVuIHRyYWNpbmcgaXMgZGlzYWJsZWQuCisgIC8vIFRoaXMgY2FuIGhhcHBl
biBlaXRoZXIgd2hlbiBleHBsaWNpdGx5IGNhbGxpbmcgVHJhY2luZ1Nlc3Npb24uU3RvcCgpIG9y
CisgIC8vIHdoZW4gdGhlIHRyYWNlIHJlYWNoZXMgaXRzIHxkdXJhdGlvbl9tc3wgdGltZSBsaW1p
dC4KKyAgLy8gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgb24gYW4gaW50ZXJuYWwgcGVy
ZmV0dG8gdGhyZWFkLgorICB2aXJ0dWFsIHZvaWQgU2V0T25TdG9wQ2FsbGJhY2soc3RkOjpmdW5j
dGlvbjx2b2lkKCk+KSA9IDA7CisKKyAgLy8gU3RydWN0IHBhc3NlZCBhcyBhcmd1bWVudCB0byB0
aGUgY2FsbGJhY2sgcGFzc2VkIHRvIFJlYWRUcmFjZSgpLgorICAvLyBbZGF0YSwgc2l6ZV0gaXMg
Z3VhcmFudGVlZCB0byBjb250YWluIDEgb3IgbW9yZSBmdWxsIHRyYWNlIHBhY2tldHMsIHdoaWNo
CisgIC8vIGNhbiBiZSBkZWNvZGVkIHVzaW5nIHRyYWNlLnByb3RvLiBObyBwYXJ0aWFsIG9yIHRy
dW5jYXRlZCBwYWNrZXRzIGFyZQorICAvLyBleHBvc2VkLiBJZiB0aGUgdHJhY2UgaXMgZW1wdHkg
dGhpcyByZXR1cm5zIGEgemVyby1zaXplZCBudWxscHRyIHdpdGgKKyAgLy8gfGhhc19tb3JlfCA9
PSB0cnVlIHRvIHNpZ25hbCBFT0YuCisgIC8vIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2Vk
IG9uIGFuIGludGVybmFsIHBlcmZldHRvIHRocmVhZC4KKyAgc3RydWN0IFJlYWRUcmFjZUNhbGxi
YWNrQXJncyB7CisgICAgY29uc3QgY2hhciogZGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IHNp
emUgPSAwOworCisgICAgLy8gV2hlbiBmYWxzZSwgdGhpcyB3aWxsIGJlIHRoZSBsYXN0IGludm9j
YXRpb24gb2YgdGhlIGNhbGxiYWNrIGZvciB0aGlzCisgICAgLy8gcmVhZCBjeWNsZS4KKyAgICBi
b29sIGhhc19tb3JlID0gZmFsc2U7CisgIH07CisKKyAgLy8gUmVhZHMgYmFjayB0aGUgdHJhY2Ug
ZGF0YSAocmF3IHByb3RvYnVmLWVuY29kZWQgYnl0ZXMpIGFzeW5jaHJvbm91c2x5LgorICAvLyBD
YW4gYmUgY2FsbGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHRyYWNlLCB0eXBpY2FsbHkgYnV0
IG5vdCBuZWNlc3NhcmlseSwKKyAgLy8gYWZ0ZXIgc3RvcHBpbmcuIFJlYWRpbmcgdGhlIHRyYWNl
IGRhdGEgaXMgYSBkZXN0cnVjdGl2ZSBvcGVyYXRpb24gdy5yLnQuCisgIC8vIGNvbnRlbnRzIG9m
IHRoZSB0cmFjZSBidWZmZXIgYW5kIGlzIG5vdCBpZGVtcG90ZW50LgorICAvLyBBIHNpbmdsZSBS
ZWFkVHJhY2UoKSBjYWxsIGNhbiB5aWVsZCA+MSBjYWxsYmFjayBpbnZvY2F0aW9ucywgdW50aWwK
KyAgLy8gfGhhc19tb3JlfCBpcyBmYWxzZS4KKyAgdXNpbmcgUmVhZFRyYWNlQ2FsbGJhY2sgPSBz
dGQ6OmZ1bmN0aW9uPHZvaWQoUmVhZFRyYWNlQ2FsbGJhY2tBcmdzKT47CisgIHZpcnR1YWwgdm9p
ZCBSZWFkVHJhY2UoUmVhZFRyYWNlQ2FsbGJhY2spID0gMDsKKworICAvLyBTeW5jaHJvbm91cyB2
ZXJzaW9uIG9mIFJlYWRUcmFjZSgpLiBJdCBibG9ja3MgdGhlIGNhbGxpbmcgdGhyZWFkIHVudGls
IGFsbAorICAvLyB0aGUgdHJhY2UgY29udGVudHMgYXJlIHJlYWQuIFRoaXMgaXMgc2xvdyBhbmQg
aW5lZmZpY2llbnQgKGludm9sdmVzIG1vcmUKKyAgLy8gY29waWVzKSBhbmQgaXMgbWFpbmx5IGlu
dGVuZGVkIGZvciB0ZXN0aW5nLgorICBzdGQ6OnZlY3RvcjxjaGFyPiBSZWFkVHJhY2VCbG9ja2lu
ZygpOworCisgIC8vIFN0cnVjdCBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGNhbGxiYWNr
IGZvciBHZXRUcmFjZVN0YXRzKCkuIENvbnRhaW5zCisgIC8vIHN0YXRpc3RpY3MgYWJvdXQgdGhl
IHRyYWNpbmcgc2Vzc2lvbi4KKyAgc3RydWN0IEdldFRyYWNlU3RhdHNDYWxsYmFja0FyZ3Mgewor
ICAgIC8vIFdoZXRoZXIgb3Igbm90IHF1ZXJ5aW5nIHN0YXRpc3RpY3Mgc3VjY2VlZGVkLgorICAg
IGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIC8vIFNlcmlhbGl6ZWQgVHJhY2VTdGF0cyBwcm90
b2J1ZiBtZXNzYWdlLiBUbyBkZWNvZGU6CisgICAgLy8KKyAgICAvLyAgIHBlcmZldHRvOjpwcm90
b3M6Omdlbjo6VHJhY2VTdGF0cyB0cmFjZV9zdGF0czsKKyAgICAvLyAgIHRyYWNlX3N0YXRzLlBh
cnNlRnJvbUFycmF5KGFyZ3MudHJhY2Vfc3RhdHNfZGF0YS5kYXRhKCksCisgICAgLy8gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnRyYWNlX3N0YXRzX2RhdGEuc2l6ZSgpKTsKKyAg
ICAvLworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRyYWNlX3N0YXRzX2RhdGE7CisgIH07CisK
KyAgLy8gUmVxdWVzdHMgYSBzbmFwc2hvdCBvZiBzdGF0aXN0aWNhbCBkYXRhIGZvciB0aGlzIHRy
YWNpbmcgc2Vzc2lvbi4gT25seSBvbmUKKyAgLy8gcXVlcnkgbWF5IGJlIGFjdGl2ZSBhdCBhIHRp
bWUuIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGludGVybmFsCisgIC8vIHBl
cmZldHRvIHRocmVhZC4KKyAgdXNpbmcgR2V0VHJhY2VTdGF0c0NhbGxiYWNrID0gc3RkOjpmdW5j
dGlvbjx2b2lkKEdldFRyYWNlU3RhdHNDYWxsYmFja0FyZ3MpPjsKKyAgdmlydHVhbCB2b2lkIEdl
dFRyYWNlU3RhdHMoR2V0VHJhY2VTdGF0c0NhbGxiYWNrKSA9IDA7CisKKyAgLy8gU3luY2hyb25v
dXMgdmVyc2lvbiBvZiBHZXRUcmFjZVN0YXRzKCkgZm9yIGNvbnZlbmllbmNlLgorICBHZXRUcmFj
ZVN0YXRzQ2FsbGJhY2tBcmdzIEdldFRyYWNlU3RhdHNCbG9ja2luZygpOworfTsKKworfSAgLy8g
bmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5H
X1RSQUNJTkdfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVy
ZmV0dG8vdHJhY2luZy90cmFja19ldmVudC5oCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBpbmNsdWRlL3BlcmZldHRvL2Jhc2UvdGltZS5oCisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRl
ciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlv
dSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGlj
ZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAq
ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICog
VW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5n
LCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0
ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJ
T05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBM
aWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFu
ZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNM
VURFX1BFUkZFVFRPX0JBU0VfVElNRV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0JBU0Vf
VElNRV9IXworCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2J1aWxkX2Nv
bmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
YmFzZS9sb2dnaW5nLmgiCisKKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTUFD
T1NYKQorI2luY2x1ZGUgPG1hY2gvbWFjaF9pbml0Lmg+CisjaW5jbHVkZSA8bWFjaC9tYWNoX3Bv
cnQuaD4KKyNpbmNsdWRlIDxtYWNoL21hY2hfdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvdGhyZWFk
X2FjdC5oPgorI2VuZGlmCisKKyNpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfV0FT
TSkKKyNpbmNsdWRlIDxlbXNjcmlwdGVuL2Vtc2NyaXB0ZW4uaD4KKyNlbmRpZgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGJhc2UgeworCit1c2luZyBUaW1lU2Vjb25kcyA9IHN0
ZDo6Y2hyb25vOjpzZWNvbmRzOwordXNpbmcgVGltZU1pbGxpcyA9IHN0ZDo6Y2hyb25vOjptaWxs
aXNlY29uZHM7Cit1c2luZyBUaW1lTmFub3MgPSBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM7CisK
K2lubGluZSBUaW1lTmFub3MgRnJvbVBvc2l4VGltZXNwZWMoY29uc3Qgc3RydWN0IHRpbWVzcGVj
JiB0cykgeworICByZXR1cm4gVGltZU5hbm9zKHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHRz
LnR2X25zZWMpOworfQorCit2b2lkIFNsZWVwTWljcm9zZWNvbmRzKHVuc2lnbmVkIGludGVydmFs
X3VzKTsKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisKK1RpbWVO
YW5vcyBHZXRXYWxsVGltZU5zKCk7CitUaW1lTmFub3MgR2V0VGhyZWFkQ1BVVGltZU5zKCk7CisK
Ky8vIFRPRE86IENsb2NrIHRoYXQgY291bnRzIHRpbWUgZHVyaW5nIHN1c3BlbmQgaXMgbm90IGlt
cGxlbWVudGVkIG9uIFdpbmRvd3MuCitpbmxpbmUgVGltZU5hbm9zIEdldEJvb3RUaW1lTnMoKSB7
CisgIHJldHVybiBHZXRXYWxsVGltZU5zKCk7Cit9CisKKyNlbGlmIFBFUkZFVFRPX0JVSUxERkxB
RyhQRVJGRVRUT19PU19NQUNPU1gpCisKK2lubGluZSBUaW1lTmFub3MgR2V0V2FsbFRpbWVOcygp
IHsKKyAgYXV0byBpbml0X3RpbWVfZmFjdG9yID0gW10oKSAtPiB1aW50NjRfdCB7CisgICAgbWFj
aF90aW1lYmFzZV9pbmZvX2RhdGFfdCB0aW1lYmFzZV9pbmZvOworICAgIG1hY2hfdGltZWJhc2Vf
aW5mbygmdGltZWJhc2VfaW5mbyk7CisgICAgcmV0dXJuIHRpbWViYXNlX2luZm8ubnVtZXIgLyB0
aW1lYmFzZV9pbmZvLmRlbm9tOworICB9OworCisgIHN0YXRpYyB1aW50NjRfdCBtb25vdG9uaWNf
dGltZWJhc2VfZmFjdG9yID0gaW5pdF90aW1lX2ZhY3RvcigpOworICByZXR1cm4gVGltZU5hbm9z
KG1hY2hfYWJzb2x1dGVfdGltZSgpICogbW9ub3RvbmljX3RpbWViYXNlX2ZhY3Rvcik7Cit9CisK
Ky8vIFRPRE86IENsb2NrIHRoYXQgY291bnRzIHRpbWUgZHVyaW5nIHN1c3BlbmQgaXMgbm90IGlt
cGxlbWVudGVkIG9uIE1hYy4KK2lubGluZSBUaW1lTmFub3MgR2V0Qm9vdFRpbWVOcygpIHsKKyAg
cmV0dXJuIEdldFdhbGxUaW1lTnMoKTsKK30KKworaW5saW5lIFRpbWVOYW5vcyBHZXRUaHJlYWRD
UFVUaW1lTnMoKSB7CisgIG1hY2hfcG9ydF90IHRoaXNfdGhyZWFkID0gbWFjaF90aHJlYWRfc2Vs
ZigpOworICBtYWNoX21zZ190eXBlX251bWJlcl90IGNvdW50ID0gVEhSRUFEX0JBU0lDX0lORk9f
Q09VTlQ7CisgIHRocmVhZF9iYXNpY19pbmZvX2RhdGFfdCBpbmZve307CisgIGtlcm5fcmV0dXJu
X3Qga3IgPQorICAgICAgdGhyZWFkX2luZm8odGhpc190aHJlYWQsIFRIUkVBRF9CQVNJQ19JTkZP
LAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx0aHJlYWRfaW5mb190PigmaW5m
byksICZjb3VudCk7CisgIG1hY2hfcG9ydF9kZWFsbG9jYXRlKG1hY2hfdGFza19zZWxmKCksIHRo
aXNfdGhyZWFkKTsKKworICBpZiAoa3IgIT0gS0VSTl9TVUNDRVNTKSB7CisgICAgUEVSRkVUVE9f
REZBVEFMKCJGYWlsZWQgdG8gZ2V0IENQVSB0aW1lLiIpOworICAgIHJldHVybiBUaW1lTmFub3Mo
MCk7CisgIH0KKyAgcmV0dXJuIFRpbWVOYW5vcyhpbmZvLnVzZXJfdGltZS5zZWNvbmRzICogMTAw
MDAwMDAwMExMICsKKyAgICAgICAgICAgICAgICAgICBpbmZvLnVzZXJfdGltZS5taWNyb3NlY29u
ZHMgKiAxMDAwTEwgKworICAgICAgICAgICAgICAgICAgIGluZm8uc3lzdGVtX3RpbWUuc2Vjb25k
cyAqIDEwMDAwMDAwMDBMTCArCisgICAgICAgICAgICAgICAgICAgaW5mby5zeXN0ZW1fdGltZS5t
aWNyb3NlY29uZHMgKiAxMDAwTEwpOworfQorCisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVS
RkVUVE9fT1NfV0FTTSkKKworaW5saW5lIFRpbWVOYW5vcyBHZXRXYWxsVGltZU5zKCkgeworICBy
ZXR1cm4gVGltZU5hbm9zKHN0YXRpY19jYXN0PHVpbnQ2NF90PihlbXNjcmlwdGVuX2dldF9ub3co
KSkgKiAxMDAwMDAwKTsKK30KKworaW5saW5lIFRpbWVOYW5vcyBHZXRUaHJlYWRDUFVUaW1lTnMo
KSB7CisgIHJldHVybiBUaW1lTmFub3MoMCk7Cit9CisKKy8vIFRPRE86IENsb2NrIHRoYXQgY291
bnRzIHRpbWUgZHVyaW5nIHN1c3BlbmQgaXMgbm90IGltcGxlbWVudGVkIG9uIFdBU00uCitpbmxp
bmUgVGltZU5hbm9zIEdldEJvb3RUaW1lTnMoKSB7CisgIHJldHVybiBHZXRXYWxsVGltZU5zKCk7
Cit9CisKKyNlbGlmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19OQUNMKQorCisvLyBU
cmFjaW5nIHRpbWUgZG9lc24ndCBuZWVkIHRvIHdvcmsgb24gTmFDbCBzaW5jZSBpdHMgZ29pbmcg
YXdheSBzaG9ydGx5LiBXZQorLy8ganVzdCBuZWVkIHRvIGNvbXBpbGUgb24gaXQuIFRoZSBvbmx5
IGZ1bmN0aW9uIE5hQ2wgY291bGQgc3VwcG9ydCBpcworLy8gR2V0V2FsbFRpbWVOcygpLCBidXQg
dG8gcHJldmVudCBmYWxzZSBob3BlIHdlIGxlYXZlIGl0IHVuaW1wbGVtZW50ZWQuCisKK2lubGlu
ZSBUaW1lTmFub3MgR2V0V2FsbFRpbWVOcygpIHsKKyAgcmV0dXJuIFRpbWVOYW5vcygwKTsKK30K
KworaW5saW5lIFRpbWVOYW5vcyBHZXRUaHJlYWRDUFVUaW1lTnMoKSB7CisgIHJldHVybiBUaW1l
TmFub3MoMCk7Cit9CisKK2lubGluZSBUaW1lTmFub3MgR2V0Qm9vdFRpbWVOcygpIHsKKyAgcmV0
dXJuIFRpbWVOYW5vcygwKTsKK30KKworI2Vsc2UgIC8vIHBvc2l4CisKK2NvbnN0ZXhwciBjbG9j
a2lkX3Qga1dhbGxUaW1lQ2xvY2tTb3VyY2UgPSBDTE9DS19NT05PVE9OSUM7CisKK2lubGluZSBU
aW1lTmFub3MgR2V0VGltZUludGVybmFsTnMoY2xvY2tpZF90IGNsa19pZCkgeworICBzdHJ1Y3Qg
dGltZXNwZWMgdHMgPSB7fTsKKyAgUEVSRkVUVE9fQ0hFQ0soY2xvY2tfZ2V0dGltZShjbGtfaWQs
ICZ0cykgPT0gMCk7CisgIHJldHVybiBGcm9tUG9zaXhUaW1lc3BlYyh0cyk7Cit9CisKKy8vIFJl
dHVybiBucyBmcm9tIGJvb3QuIENvbnZlcnNlbHkgdG8gR2V0V2FsbFRpbWVOcywgdGhpcyBjbG9j
ayBjb3VudHMgYWxzbyB0aW1lCisvLyBkdXJpbmcgc3VzcGVuZCAod2hlbiBzdXBwb3J0ZWQpLgor
aW5saW5lIFRpbWVOYW5vcyBHZXRCb290VGltZU5zKCkgeworICAvLyBEZXRlcm1pbmUgaWYgQ0xP
Q0tfQk9PVFRJTUUgaXMgYXZhaWxhYmxlIG9uIHRoZSBmaXJzdCBjYWxsLgorICBzdGF0aWMgY29u
c3QgY2xvY2tpZF90IGtCb290VGltZUNsb2NrU291cmNlID0gW10geworICAgIHN0cnVjdCB0aW1l
c3BlYyB0cyA9IHt9OworICAgIGludCByZXMgPSBjbG9ja19nZXR0aW1lKENMT0NLX0JPT1RUSU1F
LCAmdHMpOworICAgIHJldHVybiByZXMgPT0gMCA/IENMT0NLX0JPT1RUSU1FIDoga1dhbGxUaW1l
Q2xvY2tTb3VyY2U7CisgIH0oKTsKKyAgcmV0dXJuIEdldFRpbWVJbnRlcm5hbE5zKGtCb290VGlt
ZUNsb2NrU291cmNlKTsKK30KKworaW5saW5lIFRpbWVOYW5vcyBHZXRXYWxsVGltZU5zKCkgewor
ICByZXR1cm4gR2V0VGltZUludGVybmFsTnMoa1dhbGxUaW1lQ2xvY2tTb3VyY2UpOworfQorCitp
bmxpbmUgVGltZU5hbm9zIEdldFRocmVhZENQVVRpbWVOcygpIHsKKyAgcmV0dXJuIEdldFRpbWVJ
bnRlcm5hbE5zKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKTsKK30KKyNlbmRpZgorCitpbmxpbmUg
VGltZVNlY29uZHMgR2V0Qm9vdFRpbWVTKCkgeworICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0
aW9uX2Nhc3Q8VGltZVNlY29uZHM+KEdldEJvb3RUaW1lTnMoKSk7Cit9CisKK2lubGluZSBUaW1l
TWlsbGlzIEdldFdhbGxUaW1lTXMoKSB7CisgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25f
Y2FzdDxUaW1lTWlsbGlzPihHZXRXYWxsVGltZU5zKCkpOworfQorCitpbmxpbmUgVGltZVNlY29u
ZHMgR2V0V2FsbFRpbWVTKCkgeworICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8
VGltZVNlY29uZHM+KEdldFdhbGxUaW1lTnMoKSk7Cit9CisKK2lubGluZSBzdHJ1Y3QgdGltZXNw
ZWMgVG9Qb3NpeFRpbWVzcGVjKFRpbWVNaWxsaXMgdGltZSkgeworICBzdHJ1Y3QgdGltZXNwZWMg
dHMge307CisgIGNvbnN0IGxvbmcgdGltZV9zID0gc3RhdGljX2Nhc3Q8bG9uZz4odGltZS5jb3Vu
dCgpIC8gMTAwMCk7CisgIHRzLnR2X3NlYyA9IHRpbWVfczsKKyAgdHMudHZfbnNlYyA9IChzdGF0
aWNfY2FzdDxsb25nPih0aW1lLmNvdW50KCkpIC0gdGltZV9zICogMTAwMEwpICogMTAwMDAwMEw7
CisgIHJldHVybiB0czsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFj
ZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9USU1FX0hfCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNpbmcv
aW50ZXJuYWwvdHJhY2tfZXZlbnRfZGF0YV9zb3VyY2UuaAorLy8gZ2VuX2FtYWxnYW1hdGVkIGJl
Z2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2V2ZW50X2NvbnRleHQuaAorLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL2lu
dGVybmFsL3RyYWNrX2V2ZW50X2ludGVybmFsLmgKKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBo
ZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS9mbGF0X3NldC5oCisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNl
ZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsK
KyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0
aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAor
ICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisg
KgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3
cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz
dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD
T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2Vl
IHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Np
b25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRl
ZiBJTkNMVURFX1BFUkZFVFRPX0JBU0VfRkxBVF9TRVRfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJG
RVRUT19CQVNFX0ZMQVRfU0VUX0hfCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8
dmVjdG9yPgorCisvLyBBIHZlY3Rvci1iYXNlZCBzZXQ6OnNldC1saWtlIGNvbnRhaW5lci4KKy8v
IEl0J3MgbW9yZSBjYWNoZSBmcmllbmRseSB0aGFuIHN0ZDo6KnNldCBhbmQgcGVyZm9ybXMgZm9y
IGNhc2VzIHdoZXJlOgorLy8gMS4gQSBoaWdoIG51bWJlciBvZiBkdXBlcyBpcyBleHBlY3RlZCAo
ZS5nLiBwaWQgdHJhY2tpbmcgaW4gZnRyYWNlKS4KKy8vIDIuIFRoZSB3b3JraW5nIHNldCBpcyBz
bWFsbCAoaHVuZHJlZHMgb2YgZWxlbWVudHMpLgorCisvLyBQZXJmb3JtYW5jZSBjaGFyYWN0ZXJp
c3RpY3MgKGZvciB1bmlmb3JtbHkgcmFuZG9tIGluc2VydGlvbiBvcmRlcik6CisvLyAtIEZvciBz
bWFsbGVyIGluc2VydGlvbnMgKHVwIHRvIH41MDApLCBpdCBvdXRwZXJmb3JtcyBib3RoIHN0ZDo6
c2V0PGludD4gYW5kCisvLyAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQ+IGJ5IH4zeC4KKy8vIC0g
VXAgdW50aWwgNGsgaW5zZXJ0aW9ucywgaXQgaXMgYWx3YXlzIGZhc3RlciB0aGFuIHN0ZDo6c2V0
PGludD4uCisvLyAtIHVub3JkZXJlZF9zZXQ8aW50PiBpcyBmYXN0ZXIgd2l0aCBtb3JlIHRoYW4g
MmsgaW5zZXJ0aW9ucy4KKy8vIC0gdW5vcmRlcmVkX3NldCwgaG93ZXZlciwgaXQncyBsZXNzIG1l
bW9yeSBlZmZpY2llbnQgYW5kIGhhcyBtb3JlIGNhdmVhdHMKKy8vICAgKHNlZSBjaHJvbWl1bSdz
IGJhc2UvY29udGFpbmVycy9SRUFETUUubWQpLgorLy8KKy8vIFNlZSBmbGF0X3NldF9iZW5jaG1h
cmsuY2MgYW5kIHRoZSBjaGFydHMgaW4gZ28vcGVyZmV0dG8taW50LXNldC1iZW5jaG1hcmsuCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKK3RlbXBsYXRlIDx0eXBl
bmFtZSBUPgorY2xhc3MgRmxhdFNldCB7CisgcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0g
VDsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IGNvbnN0IFQqOworICB1c2luZyBpdGVyYXRvciA9
IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0
b3IgPSB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxUPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgRmxhdFNl
dCgpID0gZGVmYXVsdDsKKworICAvLyBNYWlubHkgZm9yIHRlc3RzLiBEZWxpYmVyYXRlbHkgbm90
IG1hcmtlZCBhcyAiZXhwaWNpdCIuCisgIEZsYXRTZXQoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+
IGluaXRpYWwpIDogZW50cmllc18oaW5pdGlhbCkgeworICAgIHN0ZDo6c29ydChlbnRyaWVzXy5i
ZWdpbigpLCBlbnRyaWVzXy5lbmQoKSk7CisgICAgZW50cmllc18uZXJhc2Uoc3RkOjp1bmlxdWUo
ZW50cmllc18uYmVnaW4oKSwgZW50cmllc18uZW5kKCkpLAorICAgICAgICAgICAgICAgICAgIGVu
dHJpZXNfLmVuZCgpKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoVCB2YWx1ZSkgY29u
c3QgeworICAgIGF1dG8gZW50cmllc19lbmQgPSBlbnRyaWVzXy5lbmQoKTsKKyAgICBhdXRvIGl0
ID0gc3RkOjpsb3dlcl9ib3VuZChlbnRyaWVzXy5iZWdpbigpLCBlbnRyaWVzX2VuZCwgdmFsdWUp
OworICAgIHJldHVybiAoaXQgIT0gZW50cmllc19lbmQgJiYgKml0ID09IHZhbHVlKSA/IGl0IDog
ZW50cmllc19lbmQ7CisgIH0KKworICBzaXplX3QgY291bnQoVCB2YWx1ZSkgY29uc3QgeyByZXR1
cm4gZmluZCh2YWx1ZSkgPT0gZW50cmllc18uZW5kKCkgPyAwIDogMTsgfQorCisgIHN0ZDo6cGFp
cjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KFQgdmFsdWUpIHsKKyAgICBhdXRvIGVudHJpZXNfZW5k
ID0gZW50cmllc18uZW5kKCk7CisgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoZW50cmll
c18uYmVnaW4oKSwgZW50cmllc19lbmQsIHZhbHVlKTsKKyAgICBpZiAoaXQgIT0gZW50cmllc19l
bmQgJiYgKml0ID09IHZhbHVlKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0LCBmYWxz
ZSk7CisgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZCB8aXR8IGlzIGVpdGhlciBlbmQo
KSBvciB0aGUgbmV4dCBpdGVtIHN0cmljdGx5CisgICAgLy8gZ3JlYXRlciB0aGFuIHx2YWx1ZXwu
IEluIGJvdGggY2FzZXMgd2Ugd2FudCB0byBpbnNlcnQganVzdCBiZWZvcmUgdGhhdC4KKyAgICBp
dCA9IGVudHJpZXNfLmluc2VydChpdCwgc3RkOjptb3ZlKHZhbHVlKSk7CisgICAgcmV0dXJuIHN0
ZDo6bWFrZV9wYWlyKGl0LCB0cnVlKTsKKyAgfQorCisgIHNpemVfdCBlcmFzZShUIHZhbHVlKSB7
CisgICAgYXV0byBpdCA9IGZpbmQodmFsdWUpOworICAgIGlmIChpdCA9PSBlbnRyaWVzXy5lbmQo
KSkKKyAgICAgIHJldHVybiAwOworICAgIGVudHJpZXNfLmVyYXNlKGl0KTsKKyAgICByZXR1cm4g
MTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7IGVudHJpZXNfLmNsZWFyKCk7IH0KKworICBib29s
IGVtcHR5KCkgY29uc3QgeyByZXR1cm4gZW50cmllc18uZW1wdHkoKTsgfQorICB2b2lkIHJlc2Vy
dmUoc2l6ZV90IG4pIHsgZW50cmllc18ucmVzZXJ2ZShuKTsgfQorICBzaXplX3Qgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIGVudHJpZXNfLnNpemUoKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigp
IGNvbnN0IHsgcmV0dXJuIGVudHJpZXNfLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5k
KCkgY29uc3QgeyByZXR1cm4gZW50cmllc18uZW5kKCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6
dmVjdG9yPFQ+IGVudHJpZXNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5h
bWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9GTEFU
X1NFVF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0
by9wcm90b3plcm8vc2NhdHRlcmVkX2hlYXBfYnVmZmVyLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVu
ZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICog
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
aWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgor
ICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisg
KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp
bmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli
dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ
VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhl
IExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMg
YW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElO
Q0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9IRUFQX0JVRkZFUl9IXworI2RlZmlu
ZSBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FUVEVSRURfSEVBUF9CVUZGRVJfSF8KKwor
I2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4
cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
YmFzZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX3N0cmVhbV93cml0ZXIuaCIKKworbmFtZXNwYWNl
IHByb3RvemVybyB7CisKK2NsYXNzIE1lc3NhZ2U7CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBT
Y2F0dGVyZWRIZWFwQnVmZmVyCisgICAgOiBwdWJsaWMgcHJvdG96ZXJvOjpTY2F0dGVyZWRTdHJl
YW1Xcml0ZXI6OkRlbGVnYXRlIHsKKyBwdWJsaWM6CisgIGNsYXNzIFBFUkZFVFRPX0VYUE9SVCBT
bGljZSB7CisgICBwdWJsaWM6CisgICAgU2xpY2UoKTsKKyAgICBleHBsaWNpdCBTbGljZShzaXpl
X3Qgc2l6ZSk7CisgICAgU2xpY2UoU2xpY2UmJiBzbGljZSkgbm9leGNlcHQ7CisgICAgflNsaWNl
KCk7CisgICAgU2xpY2UmIG9wZXJhdG9yPShTbGljZSYmKTsKKworICAgIGlubGluZSBwcm90b3pl
cm86OkNvbnRpZ3VvdXNNZW1vcnlSYW5nZSBHZXRUb3RhbFJhbmdlKCkgY29uc3QgeworICAgICAg
cmV0dXJuIHtidWZmZXJfLmdldCgpLCBidWZmZXJfLmdldCgpICsgc2l6ZV99OworICAgIH0KKwor
ICAgIGlubGluZSBwcm90b3plcm86OkNvbnRpZ3VvdXNNZW1vcnlSYW5nZSBHZXRVc2VkUmFuZ2Uo
KSBjb25zdCB7CisgICAgICByZXR1cm4ge2J1ZmZlcl8uZ2V0KCksIGJ1ZmZlcl8uZ2V0KCkgKyBz
aXplXyAtIHVudXNlZF9ieXRlc199OworICAgIH0KKworICAgIHVpbnQ4X3QqIHN0YXJ0KCkgY29u
c3QgeyByZXR1cm4gYnVmZmVyXy5nZXQoKTsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyBy
ZXR1cm4gc2l6ZV87IH0KKyAgICBzaXplX3QgdW51c2VkX2J5dGVzKCkgY29uc3QgeyByZXR1cm4g
dW51c2VkX2J5dGVzXzsgfQorICAgIHZvaWQgc2V0X3VudXNlZF9ieXRlcyhzaXplX3QgdW51c2Vk
X2J5dGVzKSB7CisgICAgICBQRVJGRVRUT19EQ0hFQ0sodW51c2VkX2J5dGVzXyA8PSBzaXplXyk7
CisgICAgICB1bnVzZWRfYnl0ZXNfID0gdW51c2VkX2J5dGVzOworICAgIH0KKworICAgIHZvaWQg
Q2xlYXIoKTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBi
dWZmZXJfOworICAgIHNpemVfdCBzaXplXzsKKyAgICBzaXplX3QgdW51c2VkX2J5dGVzXzsKKyAg
fTsKKworICBTY2F0dGVyZWRIZWFwQnVmZmVyKHNpemVfdCBpbml0aWFsX3NsaWNlX3NpemVfYnl0
ZXMgPSAxMjgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heGltdW1fc2xpY2Vfc2l6
ZV9ieXRlcyA9IDEyOCAqIDEwMjQpOworICB+U2NhdHRlcmVkSGVhcEJ1ZmZlcigpIG92ZXJyaWRl
OworCisgIC8vIHByb3RvemVybzo6U2NhdHRlcmVkU3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSBpbXBs
ZW1lbnRhdGlvbi4KKyAgcHJvdG96ZXJvOjpDb250aWd1b3VzTWVtb3J5UmFuZ2UgR2V0TmV3QnVm
ZmVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gU3RpdGNoIGFsbCB0aGUgc2xpY2VzIGludG8gYSBzaW5n
bGUgY29udGlndW91cyBidWZmZXIuCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFN0aXRjaFNsaWNl
cygpOworCisgIC8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcmFuZ2VzIHBvaW50IGJhY2sgdG8g
dGhpcyBidWZmZXIgYW5kIHRodXMgY2Fubm90CisgIC8vIG91dGxpdmUgaXQuCisgIHN0ZDo6dmVj
dG9yPHByb3RvemVybzo6Q29udGlndW91c01lbW9yeVJhbmdlPiBHZXRSYW5nZXMoKTsKKworICBj
b25zdCBzdGQ6OnZlY3RvcjxTbGljZT4mIHNsaWNlcygpIGNvbnN0IHsgcmV0dXJuIHNsaWNlc187
IH0KKworICB2b2lkIHNldF93cml0ZXIocHJvdG96ZXJvOjpTY2F0dGVyZWRTdHJlYW1Xcml0ZXIq
IHdyaXRlcikgeworICAgIHdyaXRlcl8gPSB3cml0ZXI7CisgIH0KKworICAvLyBVcGRhdGUgdW51
c2VkX2J5dGVzKCkgb2YgdGhlIGN1cnJlbnQgfFNsaWNlfCBiYXNlZCBvbiB0aGUgd3JpdGVyJ3Mg
c3RhdGUuCisgIHZvaWQgQWRqdXN0VXNlZFNpemVPZkN1cnJlbnRTbGljZSgpOworCisgIC8vIFJl
dHVybnMgdGhlIHRvdGFsIHNpemUgdGhlIHNsaWNlcyBvY2N1cHkgaW4gaGVhcCBtZW1vcnkgKGlu
Y2x1ZGluZyB1bnVzZWQpLgorICBzaXplX3QgR2V0VG90YWxTaXplKCk7CisKKyAgLy8gUmVzZXQg
dGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGJ1dCByZXRhaW4gb25lIHNsaWNlIGFsbG9jYXRp
b24gKGlmIGl0CisgIC8vIGV4aXN0cykgdG8gYmUgcmV1c2VkIGZvciBmdXR1cmUgd3JpdGVzLgor
ICB2b2lkIFJlc2V0KCk7CisKKyBwcml2YXRlOgorICBzaXplX3QgbmV4dF9zbGljZV9zaXplXzsK
KyAgY29uc3Qgc2l6ZV90IG1heGltdW1fc2xpY2Vfc2l6ZV87CisgIHByb3RvemVybzo6U2NhdHRl
cmVkU3RyZWFtV3JpdGVyKiB3cml0ZXJfID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8U2xpY2U+
IHNsaWNlc187CisKKyAgLy8gVXNlZCB0byBrZWVwIGFuIGFsbG9jYXRlZCBzbGljZSBhcm91bmQg
YWZ0ZXIgdGhpcyBidWZmZXIgaXMgcmVzZXQuCisgIFNsaWNlIGNhY2hlZF9zbGljZV87Cit9Owor
CisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGhlYXAtYmFzZWQgcHJvdG96ZXJvIG1lc3Nh
Z2VzIGluIG9uZSBsaW5lLgorLy8gVXNlZnVsIHdoZW4gbWFudWFsbHkgc2VyaWFsaXppbmcgYSBw
cm90b3plcm8gbWVzc2FnZSAocHJpbWFyaWx5IGluCisvLyB0ZXN0cy91dGlsaXRpZXMpLiBTbyBp
bnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmc6CisvLyAgIHByb3RvemVybzo6TXlNZXNzYWdlIG1zZzsK
Ky8vICAgcHJvdG96ZXJvOjpTY2F0dGVyZWRIZWFwQnVmZmVyIHNoYjsKKy8vICAgcHJvdG96ZXJv
OjpTY2F0dGVyZWRTdHJlYW1Xcml0ZXIgd3JpdGVyKCZzaGIpOworLy8gICBzaGIuc2V0X3dyaXRl
cigmd3JpdGVyKTsKKy8vICAgbXNnLlJlc2V0KCZ3cml0ZXIpOworLy8gICAuLi4KKy8vIFlvdSBj
YW4gd3JpdGU6CisvLyAgIHByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPHByb3RvemVybzo6TXlNZXNz
YWdlPiBtc2c7CisvLyAgIG1zZy0+c2V0X3N0dWZmKC4uLik7CisvLyAgIG1zZy5TZXJpYWxpemVB
c1N0cmluZygpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQgPSA6OnByb3RvemVybzo6TWVzc2FnZT4K
K2NsYXNzIEhlYXBCdWZmZXJlZCB7CisgcHVibGljOgorICBIZWFwQnVmZmVyZWQoKSA6IEhlYXBC
dWZmZXJlZCg0MDk2LCA0MDk2KSB7fQorICBIZWFwQnVmZmVyZWQoc2l6ZV90IGluaXRpYWxfc2xp
Y2Vfc2l6ZV9ieXRlcywgc2l6ZV90IG1heGltdW1fc2xpY2Vfc2l6ZV9ieXRlcykKKyAgICAgIDog
c2hiXyhpbml0aWFsX3NsaWNlX3NpemVfYnl0ZXMsIG1heGltdW1fc2xpY2Vfc2l6ZV9ieXRlcyks
CisgICAgICAgIHdyaXRlcl8oJnNoYl8pIHsKKyAgICBzaGJfLnNldF93cml0ZXIoJndyaXRlcl8p
OworICAgIG1zZ18uUmVzZXQoJndyaXRlcl8pOworICB9CisKKyAgLy8gVGhpcyBjYW4ndCBiZSBu
ZWl0aGVyIGNvcGllZCBub3IgbW92ZWQgYmVjYXVzZSBNZXNzYWdlIGhhbmRzIG91dCBwb2ludGVy
cworICAvLyB0byBpdHNlbGYgd2hlbiBjcmVhdGluZyBzdWJtZXNzYWdlcy4KKyAgSGVhcEJ1ZmZl
cmVkKGNvbnN0IEhlYXBCdWZmZXJlZCYpID0gZGVsZXRlOworICBIZWFwQnVmZmVyZWQmIG9wZXJh
dG9yPShjb25zdCBIZWFwQnVmZmVyZWQmKSA9IGRlbGV0ZTsKKyAgSGVhcEJ1ZmZlcmVkKEhlYXBC
dWZmZXJlZCYmKSA9IGRlbGV0ZTsKKyAgSGVhcEJ1ZmZlcmVkJiBvcGVyYXRvcj0oSGVhcEJ1ZmZl
cmVkJiYpID0gZGVsZXRlOworCisgIFQqIGdldCgpIHsgcmV0dXJuICZtc2dfOyB9CisgIFQqIG9w
ZXJhdG9yLT4oKSB7IHJldHVybiAmbXNnXzsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJl
dHVybiBzaGJfLnNsaWNlcygpLmVtcHR5KCk7IH0KKworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBT
ZXJpYWxpemVBc0FycmF5KCkgeworICAgIG1zZ18uRmluYWxpemUoKTsKKyAgICByZXR1cm4gc2hi
Xy5TdGl0Y2hTbGljZXMoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5n
KCkgeworICAgIGF1dG8gdmVjID0gU2VyaWFsaXplQXNBcnJheSgpOworICAgIHJldHVybiBzdGQ6
OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2ZWMuZGF0YSgpKSwgdmVjLnNp
emUoKSk7CisgIH0KKworICBzdGQ6OnZlY3Rvcjxwcm90b3plcm86OkNvbnRpZ3VvdXNNZW1vcnlS
YW5nZT4gR2V0UmFuZ2VzKCkgeworICAgIG1zZ18uRmluYWxpemUoKTsKKyAgICByZXR1cm4gc2hi
Xy5HZXRSYW5nZXMoKTsKKyAgfQorCisgIHZvaWQgUmVzZXQoKSB7CisgICAgc2hiXy5SZXNldCgp
OworICAgIHdyaXRlcl8uUmVzZXQocHJvdG96ZXJvOjpDb250aWd1b3VzTWVtb3J5UmFuZ2V7fSk7
CisgICAgbXNnXy5SZXNldCgmd3JpdGVyXyk7CisgICAgUEVSRkVUVE9fRENIRUNLKGVtcHR5KCkp
OworICB9CisKKyBwcml2YXRlOgorICBTY2F0dGVyZWRIZWFwQnVmZmVyIHNoYl87CisgIFNjYXR0
ZXJlZFN0cmVhbVdyaXRlciB3cml0ZXJfOworICBUIG1zZ187Cit9OworCit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG96ZXJvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fU0NB
VFRFUkVEX0hFQVBfQlVGRkVSX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBp
bmNsdWRlL3BlcmZldHRvL3RyYWNpbmcvZGVidWdfYW5ub3RhdGlvbi5oCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50
L2RlYnVnX2Fubm90YXRpb24ucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3Rv
WmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfREVCVUdfQU5OT1RBVElPTl9Q
Uk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RS
QUNLX0VWRU5UX0RFQlVHX0FOTk9UQVRJT05fUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5o
PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9m
aWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2Ns
YXNzIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZTsKK2VudW0gRGVidWdBbm5vdGF0aW9uX05l
c3RlZFZhbHVlX05lc3RlZFR5cGUgOiBpbnQzMl90OworCitlbnVtIERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlIDogaW50MzJfdCB7CisgIERlYnVnQW5ub3RhdGlvbl9OZXN0
ZWRWYWx1ZV9OZXN0ZWRUeXBlX1VOU1BFQ0lGSUVEID0gMCwKKyAgRGVidWdBbm5vdGF0aW9uX05l
c3RlZFZhbHVlX05lc3RlZFR5cGVfRElDVCA9IDEsCisgIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRW
YWx1ZV9OZXN0ZWRUeXBlX0FSUkFZID0gMiwKK307CisKK2NvbnN0IERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRU
eXBlX01JTiA9IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlX1VOU1BFQ0lG
SUVEOworY29uc3QgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGUgRGVidWdB
bm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVfTUFYID0gRGVidWdBbm5vdGF0aW9uX05l
c3RlZFZhbHVlX05lc3RlZFR5cGVfQVJSQVk7CisKK2NsYXNzIERlYnVnQW5ub3RhdGlvbk5hbWVf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIERlYnVnQW5ub3RhdGlvbk5hbWVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgRGVidWdBbm5vdGF0aW9uTmFtZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IERlYnVnQW5ub3RhdGlvbk5hbWVfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaWlkKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgRGVidWdBbm5vdGF0
aW9uTmFtZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gRGVidWdBbm5vdGF0aW9uTmFtZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMiwK
KyAgfTsKKyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAg
fQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAg
QXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIERlYnVnQW5ub3Rh
dGlvbl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzEwLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+
IHsKKyBwdWJsaWM6CisgIERlYnVnQW5ub3RhdGlvbl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBEZWJ1Z0Fubm90YXRpb25fRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBEZWJ1Z0Fubm90YXRpb25fRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZV9paWQoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbmFtZV9paWQoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVy
biBhdDwxMD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBj
b25zdCB7IHJldHVybiBhdDwxMD4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19ib29sX3Zh
bHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGJvb2wgYm9vbF92YWx1
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3VpbnRf
dmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdWlu
dF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDY0
X3QgaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX2RvdWJsZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQor
ICBkb3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19kb3VibGUo
KTsgfQorICBib29sIGhhc19zdHJpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgc3RyaW5nX3ZhbHVlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19wb2ludGVyX3ZhbHVl
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBvaW50ZXJf
dmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X25lc3RlZF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBuZXN0ZWRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw4Pigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbGVnYWN5X2pzb25fdmFsdWUoKSBjb25zdCB7IHJl
dHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbGVnYWN5
X2pzb25fdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3N0cmluZygpOyB9Cit9Owor
CitjbGFzcyBEZWJ1Z0Fubm90YXRpb24gOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IERlYnVnQW5ub3RhdGlvbl9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga05hbWVJaWRGaWVsZE51bWJlciA9IDEsCisgICAga05hbWVG
aWVsZE51bWJlciA9IDEwLAorICAgIGtCb29sVmFsdWVGaWVsZE51bWJlciA9IDIsCisgICAga1Vp
bnRWYWx1ZUZpZWxkTnVtYmVyID0gMywKKyAgICBrSW50VmFsdWVGaWVsZE51bWJlciA9IDQsCisg
ICAga0RvdWJsZVZhbHVlRmllbGROdW1iZXIgPSA1LAorICAgIGtTdHJpbmdWYWx1ZUZpZWxkTnVt
YmVyID0gNiwKKyAgICBrUG9pbnRlclZhbHVlRmllbGROdW1iZXIgPSA3LAorICAgIGtOZXN0ZWRW
YWx1ZUZpZWxkTnVtYmVyID0gOCwKKyAgICBrTGVnYWN5SnNvblZhbHVlRmllbGROdW1iZXIgPSA5
LAorICB9OworICB1c2luZyBOZXN0ZWRWYWx1ZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJv
OjpEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU7CisgIHZvaWQgc2V0X25hbWVfaWlkKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEwLCB2
YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBj
aGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEwLCBkYXRhLCBzaXpl
KTsKKyAgfQorICB2b2lkIHNldF9ib29sX3ZhbHVlKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRU
aW55VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91aW50X3ZhbHVlKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9p
bnRfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSkgeworICAgIEFwcGVuZEZp
eGVkKDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RkOjpz
dHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5z
aXplKCkpOworICB9CisgIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCBjaGFyKiBkYXRhLCBz
aXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDYsIGRhdGEsIHNpemUpOworICB9CisgIHZv
aWQgc2V0X3BvaW50ZXJfdmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NywgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGVidWdBbm5vdGF0aW9u
X05lc3RlZFZhbHVlPiBUKiBzZXRfbmVzdGVkX3ZhbHVlKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oOCk7CisgIH0KKworICB2b2lkIHNldF9sZWdhY3lfanNvbl92YWx1ZShj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg5LCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbGVnYWN5X2pzb25fdmFsdWUoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg5LCBkYXRhLCBz
aXplKTsKKyAgfQorfTsKKworY2xhc3MgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovOCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6
CisgIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBEZWJ1Z0Fubm90YXRp
b25fTmVzdGVkVmFsdWVfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
bmVzdGVkX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBuZXN0ZWRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc19kaWN0X2tleXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFy
cz4gZGljdF9rZXlzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Q2hhcnM+KDIpOyB9CisgIGJvb2wgaGFzX2RpY3RfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGRpY3RfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gR2V0
UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDMpOyB9CisgIGJvb2wgaGFzX2FycmF5
X3ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBhcnJheV92
YWx1ZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4oNCk7IH0KKyAgYm9vbCBoYXNfaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52
YWxpZCgpOyB9CisgIGludDY0X3QgaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5h
c19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2RvdWJsZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkudmFsaWQoKTsgfQorICBkb3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4g
YXQ8Nj4oKS5hc19kb3VibGUoKTsgfQorICBib29sIGhhc19ib29sX3ZhbHVlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIGJvb2wgYm9vbF92YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDc+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBz
dHJpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX3N0cmluZygpOyB9Cit9Owor
CitjbGFzcyBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWUgOiBwdWJsaWMgOjpwcm90b3plcm86
Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05lc3RlZFR5cGVG
aWVsZE51bWJlciA9IDEsCisgICAga0RpY3RLZXlzRmllbGROdW1iZXIgPSAyLAorICAgIGtEaWN0
VmFsdWVzRmllbGROdW1iZXIgPSAzLAorICAgIGtBcnJheVZhbHVlc0ZpZWxkTnVtYmVyID0gNCwK
KyAgICBrSW50VmFsdWVGaWVsZE51bWJlciA9IDUsCisgICAga0RvdWJsZVZhbHVlRmllbGROdW1i
ZXIgPSA2LAorICAgIGtCb29sVmFsdWVGaWVsZE51bWJlciA9IDcsCisgICAga1N0cmluZ1ZhbHVl
RmllbGROdW1iZXIgPSA4LAorICB9OworICB1c2luZyBOZXN0ZWRUeXBlID0gOjpwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlOwor
ICBzdGF0aWMgY29uc3QgTmVzdGVkVHlwZSBVTlNQRUNJRklFRCA9IERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgTmVzdGVk
VHlwZSBESUNUID0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVfRElDVDsK
KyAgc3RhdGljIGNvbnN0IE5lc3RlZFR5cGUgQVJSQVkgPSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVk
VmFsdWVfTmVzdGVkVHlwZV9BUlJBWTsKKyAgdm9pZCBzZXRfbmVzdGVkX3R5cGUoOjpwZXJmZXR0
bzo6cHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBl
IHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBh
ZGRfZGljdF9rZXlzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9kaWN0X2tl
eXMoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBk
YXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERlYnVnQW5ub3RhdGlv
bl9OZXN0ZWRWYWx1ZT4gVCogYWRkX2RpY3RfdmFsdWVzKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERlYnVn
QW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZT4gVCogYWRkX2FycmF5X3ZhbHVlcygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQpOworICB9CisKKyAgdm9pZCBzZXRfaW50X3ZhbHVl
KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2RvdWJsZV92YWx1ZShkb3VibGUgdmFsdWUpIHsKKyAgICBBcHBlbmRGaXhlZCg2LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYm9vbF92YWx1ZShib29sIHZhbHVlKSB7CisgICAgQXBw
ZW5kVGlueVZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDgsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg4LCBkYXRhLCBzaXplKTsK
KyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNw
YWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
OSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIg
dGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3Ug
bWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vu
c2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAg
ICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVu
bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywg
c29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVk
IG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9O
UyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGlj
ZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQK
KyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVE
RV9QRVJGRVRUT19UUkFDSU5HX0RFQlVHX0FOTk9UQVRJT05fSF8KKyNkZWZpbmUgSU5DTFVERV9Q
RVJGRVRUT19UUkFDSU5HX0RFQlVHX0FOTk9UQVRJT05fSF8KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19l
dmVudC9kZWJ1Z19hbm5vdGF0aW9uLnBiemVyby5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisK
KyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgeworLy8g
c3RkOjp1bmRlcmx5aW5nX3R5cGUgY2FuJ3QgYmUgdXNlZCB3aXRoIG5vbi1lbnVtIHR5cGVzLCBz
byB3ZSBuZWVkIHRoaXMKKy8vIGluZGlyZWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJv
b2wgPSBzdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IHNhZmVfdW5kZXJseWluZ190eXBl
IHsKKyAgdXNpbmcgdHlwZSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBl
OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc2FmZV91bmRlcmx5aW5nX3R5
cGU8VCwgZmFsc2U+IHsKKyAgdXNpbmcgdHlwZSA9IFQ7Cit9OworfSAgLy8gbmFtZXNwYWNlCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnpl
cm8geworY2xhc3MgRGVidWdBbm5vdGF0aW9uOworfSAgLy8gbmFtZXNwYWNlIHBiemVybworfSAg
Ly8gbmFtZXNwYWNlIHByb3RvcworCisvLyBBIGJhc2UgY2xhc3MgZm9yIGN1c3RvbSB0cmFjayBl
dmVudCBkZWJ1ZyBhbm5vdGF0aW9ucy4KK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBEZWJ1Z0Fubm90
YXRpb24geworIHB1YmxpYzoKKyAgRGVidWdBbm5vdGF0aW9uKCkgPSBkZWZhdWx0OworICB2aXJ0
dWFsIH5EZWJ1Z0Fubm90YXRpb24oKTsKKworICAvLyBDYWxsZWQgdG8gd3JpdGUgdGhlIGNvbnRl
bnRzIG9mIHRoZSBkZWJ1ZyBhbm5vdGF0aW9uIGludG8gdGhlIHRyYWNlLgorICB2aXJ0dWFsIHZv
aWQgQWRkKHByb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90YXRpb24qKSBjb25zdCA9IDA7Cit9Owor
CituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gT3ZlcmxvYWRzIGZvciBhbGwgdGhlIHN1cHBvcnRl
ZCBidWlsdCBpbiBkZWJ1ZyBhbm5vdGF0aW9uIHR5cGVzLiBOdW1lcmljCisvLyB0eXBlcyBhcmUg
aGFuZGxlZCB3aXRoIHRlbXBsYXRlcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIG92ZXJsb2FkaW5n
CisvLyBwbGF0Zm9ybS1zcGVjaWZpYyB0eXBlcyAoZS5nLiwgc2l6ZV90KS4KK3ZvaWQgUEVSRkVU
VE9fRVhQT1JUIFdyaXRlRGVidWdBbm5vdGF0aW9uKHByb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90
YXRpb24qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
Y2hhciopOwordm9pZCBQRVJGRVRUT19FWFBPUlQgV3JpdGVEZWJ1Z0Fubm90YXRpb24ocHJvdG9z
OjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYpOwordm9pZCBQRVJGRVRUT19FWFBPUlQg
V3JpdGVEZWJ1Z0Fubm90YXRpb24ocHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbiosCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKik7Cit2
b2lkIFBFUkZFVFRPX0VYUE9SVCBXcml0ZURlYnVnQW5ub3RhdGlvbihwcm90b3M6OnBiemVybzo6
RGVidWdBbm5vdGF0aW9uKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IERlYnVnQW5ub3RhdGlvbiYpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3Zv
aWQgV3JpdGVEZWJ1Z0Fubm90YXRpb24oCisgICAgcHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3Rh
dGlvbiogYW5ub3RhdGlvbiwKKyAgICBUIHZhbHVlLAorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxl
X2lmPHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlPjo6dHlwZSogPQorICAgICAgICBu
dWxscHRyKSB7CisgIGFubm90YXRpb24tPnNldF9kb3VibGVfdmFsdWUoc3RhdGljX2Nhc3Q8ZG91
YmxlPih2YWx1ZSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgV3JpdGVEZWJ1
Z0Fubm90YXRpb24oCisgICAgcHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbiogYW5ub3Rh
dGlvbiwKKyAgICBUIHZhbHVlLAorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNf
aW50ZWdyYWw8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0ZDo6
aXNfc2FtZTxULCBib29sPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWU+Ojp0eXBlKiA9IG51bGxwdHIpIHsKKyAgYW5ub3RhdGlv
bi0+c2V0X2ludF92YWx1ZSh2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9p
ZCBXcml0ZURlYnVnQW5ub3RhdGlvbigKKyAgICBwcm90b3M6OnBiemVybzo6RGVidWdBbm5vdGF0
aW9uKiBhbm5vdGF0aW9uLAorICAgIFQgdmFsdWUsCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVf
aWY8CisgICAgICAgIHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgJiYKKyAgICAgICAgc3RkOjppc19z
aWduZWQ8dHlwZW5hbWUgc2FmZV91bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU+Ojp2YWx1ZT46OnR5
cGUqID0KKyAgICAgICAgbnVsbHB0cikgeworICBhbm5vdGF0aW9uLT5zZXRfaW50X3ZhbHVlKHZh
bHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFdyaXRlRGVidWdBbm5vdGF0
aW9uKAorICAgIHByb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90YXRpb24qIGFubm90YXRpb24sCisg
ICAgVCB2YWx1ZSwKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46
OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc191bnNpZ25lZDx0
eXBlbmFtZSBzYWZlX3VuZGVybHlpbmdfdHlwZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVD46OnR5cGU+Ojp2YWx1ZT46OnR5cGUqID0gbnVsbHB0cikgeworICBhbm5vdGF0aW9u
LT5zZXRfdWludF92YWx1ZSh2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9p
ZCBXcml0ZURlYnVnQW5ub3RhdGlvbigKKyAgICBwcm90b3M6OnBiemVybzo6RGVidWdBbm5vdGF0
aW9uKiBhbm5vdGF0aW9uLAorICAgIFQgdmFsdWUsCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVf
aWY8c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAhc3RkOjppc19zYW1lPFQsIGJvb2w+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlPjo6dHlwZSogPSBudWxscHRyKSB7
CisgIGFubm90YXRpb24tPnNldF91aW50X3ZhbHVlKHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5
cGVuYW1lIFQ+Cit2b2lkIFdyaXRlRGVidWdBbm5vdGF0aW9uKAorICAgIHByb3Rvczo6cGJ6ZXJv
OjpEZWJ1Z0Fubm90YXRpb24qIGFubm90YXRpb24sCisgICAgVCB2YWx1ZSwKKyAgICB0eXBlbmFt
ZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlPjo6dHlwZSogPSBu
dWxscHRyKSB7CisgIGFubm90YXRpb24tPnNldF9ib29sX3ZhbHVlKHZhbHVlKTsKK30KKwordGVt
cGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFdyaXRlRGVidWdBbm5vdGF0aW9uKHByb3Rvczo6cGJ6
ZXJvOjpEZWJ1Z0Fubm90YXRpb24qIGFubm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUPiYgdmFsdWUpIHsKKyAgV3JpdGVEZWJ1Z0Fubm90
YXRpb24oYW5ub3RhdGlvbiwgKnZhbHVlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFs
Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRP
X1RSQUNJTkdfREVCVUdfQU5OT1RBVElPTl9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL3RyYWNrLmgKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS9wcm9jX3V0aWxzLmgKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElD
RU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdy
ZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj
ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJS
QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp
ZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p
bmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAq
LworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9QUk9DX1VUSUxTX0hfCisjZGVmaW5l
IElOQ0xVREVfUEVSRkVUVE9fQkFTRV9QUk9DX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQu
aD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFz
ZS9idWlsZF9jb25maWcuaCIKKworI2lmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19X
SU4pCisjaW5jbHVkZSA8V2luZG93cy5oPgorI2luY2x1ZGUgPHByb2Nlc3N0aHJlYWRzYXBpLmg+
CisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfRlVDSFNJQSkKKyNpbmNsdWRl
IDx6aXJjb24vcHJvY2Vzcy5oPgorI2luY2x1ZGUgPHppcmNvbi90eXBlcy5oPgorI2Vsc2UKKyNp
bmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNw
YWNlIGJhc2UgeworCisjaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0ZVQ0hTSUEp
Cit1c2luZyBQbGF0Zm9ybVByb2Nlc3NJZCA9IHp4X2hhbmRsZV90OworaW5saW5lIFBsYXRmb3Jt
UHJvY2Vzc0lkIEdldFByb2Nlc3NJZCgpIHsKKyAgcmV0dXJuIHp4X3Byb2Nlc3Nfc2VsZigpOwor
fQorI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX1dJTikKK3VzaW5nIFBsYXRm
b3JtUHJvY2Vzc0lkID0gdWludDY0X3Q7CitpbmxpbmUgUGxhdGZvcm1Qcm9jZXNzSWQgR2V0UHJv
Y2Vzc0lkKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KEdldEN1cnJlbnRQcm9j
ZXNzSWQoKSk7Cit9CisjZWxzZQordXNpbmcgUGxhdGZvcm1Qcm9jZXNzSWQgPSBwaWRfdDsKK2lu
bGluZSBQbGF0Zm9ybVByb2Nlc3NJZCBHZXRQcm9jZXNzSWQoKSB7CisgIHJldHVybiBnZXRwaWQo
KTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBl
cmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19CQVNFX1BST0NfVVRJTFNfSF8K
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vYmFzZS90
aHJlYWRfdXRpbHMuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVu
IFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNl
LCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBm
aWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9i
dGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBh
Y2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBh
cHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3Ry
aWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFT
SVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0
aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNp
ZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVu
ZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19CQVNFX1RI
UkVBRF9VVElMU19IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX0JBU0VfVEhSRUFEX1VUSUxT
X0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9idWlsZF9jb25maWcuaCIKKworI2lmIFBFUkZFVFRP
X0JVSUxERkxBRyhQRVJGRVRUT19PU19XSU4pCisjaW5jbHVkZSA8V2luZG93cy5oPgorI2luY2x1
ZGUgPHByb2Nlc3N0aHJlYWRzYXBpLmg+CisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVU
VE9fT1NfRlVDSFNJQSkKKyNpbmNsdWRlIDx6aXJjb24vcHJvY2Vzcy5oPgorI2luY2x1ZGUgPHpp
cmNvbi90eXBlcy5oPgorI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0xJTlVY
KSB8fCBcCisgICAgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09TX0FORFJPSUQpCisjaW5j
bHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1
bmlzdGQuaD4KKyNlbHNlCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgYmFzZSB7CisKKyNpZiBQRVJGRVRUT19CVUlMREZMQUco
UEVSRkVUVE9fT1NfQU5EUk9JRCkKK3VzaW5nIFBsYXRmb3JtVGhyZWFkSWQgPSBwaWRfdDsKK2lu
bGluZSBQbGF0Zm9ybVRocmVhZElkIEdldFRocmVhZElkKCkgeworICByZXR1cm4gZ2V0dGlkKCk7
Cit9CisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfTElOVVgpCit1c2luZyBQ
bGF0Zm9ybVRocmVhZElkID0gcGlkX3Q7CitpbmxpbmUgUGxhdGZvcm1UaHJlYWRJZCBHZXRUaHJl
YWRJZCgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHBpZF90PihzeXNjYWxsKF9fTlJfZ2V0dGlk
KSk7Cit9CisjZWxpZiBQRVJGRVRUT19CVUlMREZMQUcoUEVSRkVUVE9fT1NfRlVDSFNJQSkKK3Vz
aW5nIFBsYXRmb3JtVGhyZWFkSWQgPSB6eF9oYW5kbGVfdDsKK2lubGluZSBQbGF0Zm9ybVRocmVh
ZElkIEdldFRocmVhZElkKCkgeworICByZXR1cm4genhfdGhyZWFkX3NlbGYoKTsKK30KKyNlbGlm
IFBFUkZFVFRPX0JVSUxERkxBRyhQRVJGRVRUT19PU19NQUNPU1gpCit1c2luZyBQbGF0Zm9ybVRo
cmVhZElkID0gdWludDY0X3Q7CitpbmxpbmUgUGxhdGZvcm1UaHJlYWRJZCBHZXRUaHJlYWRJZCgp
IHsKKyAgdWludDY0X3QgdGlkOworICBwdGhyZWFkX3RocmVhZGlkX25wKG51bGxwdHIsICZ0aWQp
OworICByZXR1cm4gdGlkOworfQorI2VsaWYgUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRPX09T
X1dJTikKK3VzaW5nIFBsYXRmb3JtVGhyZWFkSWQgPSB1aW50NjRfdDsKK2lubGluZSBQbGF0Zm9y
bVRocmVhZElkIEdldFRocmVhZElkKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+
KEdldEN1cnJlbnRUaHJlYWRJZCgpKTsKK30KKyNlbGlmIFBFUkZFVFRPX0JVSUxERkxBRyhQRVJG
RVRUT19PU19OQUNMKQordXNpbmcgUGxhdGZvcm1UaHJlYWRJZCA9IHBpZF90OworaW5saW5lIFBs
YXRmb3JtVGhyZWFkSWQgR2V0VGhyZWFkSWQoKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0
PGludDMyX3Q+KHB0aHJlYWRfc2VsZigpKTsKK30KKyNlbHNlICAvLyBEZWZhdWx0IHRvIHB0aHJl
YWRzIGluIGNhc2Ugbm8gT1MgaXMgc2V0LgordXNpbmcgUGxhdGZvcm1UaHJlYWRJZCA9IHB0aHJl
YWRfdDsKK2lubGluZSBQbGF0Zm9ybVRocmVhZElkIEdldFRocmVhZElkKCkgeworICByZXR1cm4g
cHRocmVhZF9zZWxmKCk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8v
IG5hbWVzcGFjZSBwZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fQkFTRV9U
SFJFQURfVVRJTFNfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90
b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdHJhY2tfZGVzY3JpcHRvci5nZW4uaAorLy8g
RE8gTk9UIEVESVQuIEF1dG9nZW5lcmF0ZWQgYnkgUGVyZmV0dG8gY3BwZ2VuX3BsdWdpbgorI2lm
bmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX1RS
QUNLX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9U
T1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfREVTQ1JJUFRPUl9QUk9UT19DUFBf
SF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDx2
ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vY3Bw
X21lc3NhZ2Vfb2JqLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vY29weWFibGVfcHRyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2VuIHsKK2NsYXNzIFRyYWNr
RGVzY3JpcHRvcjsKK2NsYXNzIENvdW50ZXJEZXNjcmlwdG9yOworY2xhc3MgQ2hyb21lVGhyZWFk
RGVzY3JpcHRvcjsKK2NsYXNzIFRocmVhZERlc2NyaXB0b3I7CitjbGFzcyBDaHJvbWVQcm9jZXNz
RGVzY3JpcHRvcjsKK2NsYXNzIFByb2Nlc3NEZXNjcmlwdG9yOworZW51bSBDb3VudGVyRGVzY3Jp
cHRvcl9CdWlsdGluQ291bnRlclR5cGUgOiBpbnQ7CitlbnVtIENvdW50ZXJEZXNjcmlwdG9yX1Vu
aXQgOiBpbnQ7CitlbnVtIENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZSA6IGludDsK
K2VudW0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlIDogaW50OworZW51bSBDaHJv
bWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZSA6IGludDsKK2VudW0gUHJvY2Vzc0Rlc2Ny
aXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGUgOiBpbnQ7Cit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8K
K30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKworbmFtZXNwYWNl
IHByb3RvemVybyB7CitjbGFzcyBNZXNzYWdlOworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybwor
CituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgZ2Vu
IHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNrRGVzY3JpcHRvciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6Q3BwTWVzc2FnZU9iaiB7CisgcHVibGljOgorICBlbnVtIEZpZWxkTnVtYmVycyB7
CisgICAga1V1aWRGaWVsZE51bWJlciA9IDEsCisgICAga1BhcmVudFV1aWRGaWVsZE51bWJlciA9
IDUsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIsCisgICAga1Byb2Nlc3NGaWVsZE51bWJlciA9
IDMsCisgICAga0Nocm9tZVByb2Nlc3NGaWVsZE51bWJlciA9IDYsCisgICAga1RocmVhZEZpZWxk
TnVtYmVyID0gNCwKKyAgICBrQ2hyb21lVGhyZWFkRmllbGROdW1iZXIgPSA3LAorICAgIGtDb3Vu
dGVyRmllbGROdW1iZXIgPSA4LAorICB9OworCisgIFRyYWNrRGVzY3JpcHRvcigpOworICB+VHJh
Y2tEZXNjcmlwdG9yKCkgb3ZlcnJpZGU7CisgIFRyYWNrRGVzY3JpcHRvcihUcmFja0Rlc2NyaXB0
b3ImJikgbm9leGNlcHQ7CisgIFRyYWNrRGVzY3JpcHRvciYgb3BlcmF0b3I9KFRyYWNrRGVzY3Jp
cHRvciYmKTsKKyAgVHJhY2tEZXNjcmlwdG9yKGNvbnN0IFRyYWNrRGVzY3JpcHRvciYpOworICBU
cmFja0Rlc2NyaXB0b3ImIG9wZXJhdG9yPShjb25zdCBUcmFja0Rlc2NyaXB0b3ImKTsKKyAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IFRyYWNrRGVzY3JpcHRvciYpIGNvbnN0OworICBib29sIG9wZXJh
dG9yIT0oY29uc3QgVHJhY2tEZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhp
cyA9PSBvdGhlcik7IH0KKworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqLCBzaXpl
X3QpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IG92
ZXJyaWRlOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVBc0FycmF5KCkgY29uc3Qg
b3ZlcnJpZGU7CisgIHZvaWQgU2VyaWFsaXplKDo6cHJvdG96ZXJvOjpNZXNzYWdlKikgY29uc3Q7
CisKKyAgYm9vbCBoYXNfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzFdOyB9Cisg
IHVpbnQ2NF90IHV1aWQoKSBjb25zdCB7IHJldHVybiB1dWlkXzsgfQorICB2b2lkIHNldF91dWlk
KHVpbnQ2NF90IHZhbHVlKSB7IHV1aWRfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgxKTsgfQor
CisgIGJvb2wgaGFzX3BhcmVudF91dWlkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNV07
IH0KKyAgdWludDY0X3QgcGFyZW50X3V1aWQoKSBjb25zdCB7IHJldHVybiBwYXJlbnRfdXVpZF87
IH0KKyAgdm9pZCBzZXRfcGFyZW50X3V1aWQodWludDY0X3QgdmFsdWUpIHsgcGFyZW50X3V1aWRf
ID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCg1KTsgfQorCisgIGJvb2wgaGFzX25hbWUoKSBjb25z
dCB7IHJldHVybiBfaGFzX2ZpZWxkX1syXTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7IG5hbWVfID0gdmFsdWU7IF9oYXNfZmllbGRfLnNldCgyKTsgfQorCisgIGJv
b2wgaGFzX3Byb2Nlc3MoKSBjb25zdCB7IHJldHVybiBfaGFzX2ZpZWxkX1szXTsgfQorICBjb25z
dCBQcm9jZXNzRGVzY3JpcHRvciYgcHJvY2VzcygpIGNvbnN0IHsgcmV0dXJuICpwcm9jZXNzXzsg
fQorICBQcm9jZXNzRGVzY3JpcHRvciogbXV0YWJsZV9wcm9jZXNzKCkgeyBfaGFzX2ZpZWxkXy5z
ZXQoMyk7IHJldHVybiBwcm9jZXNzXy5nZXQoKTsgfQorCisgIGJvb2wgaGFzX2Nocm9tZV9wcm9j
ZXNzKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNl07IH0KKyAgY29uc3QgQ2hyb21lUHJv
Y2Vzc0Rlc2NyaXB0b3ImIGNocm9tZV9wcm9jZXNzKCkgY29uc3QgeyByZXR1cm4gKmNocm9tZV9w
cm9jZXNzXzsgfQorICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvciogbXV0YWJsZV9jaHJvbWVfcHJv
Y2VzcygpIHsgX2hhc19maWVsZF8uc2V0KDYpOyByZXR1cm4gY2hyb21lX3Byb2Nlc3NfLmdldCgp
OyB9CisKKyAgYm9vbCBoYXNfdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bNF07
IH0KKyAgY29uc3QgVGhyZWFkRGVzY3JpcHRvciYgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gKnRo
cmVhZF87IH0KKyAgVGhyZWFkRGVzY3JpcHRvciogbXV0YWJsZV90aHJlYWQoKSB7IF9oYXNfZmll
bGRfLnNldCg0KTsgcmV0dXJuIHRocmVhZF8uZ2V0KCk7IH0KKworICBib29sIGhhc19jaHJvbWVf
dGhyZWFkKCkgY29uc3QgeyByZXR1cm4gX2hhc19maWVsZF9bN107IH0KKyAgY29uc3QgQ2hyb21l
VGhyZWFkRGVzY3JpcHRvciYgY2hyb21lX3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuICpjaHJvbWVf
dGhyZWFkXzsgfQorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yKiBtdXRhYmxlX2Nocm9tZV90aHJl
YWQoKSB7IF9oYXNfZmllbGRfLnNldCg3KTsgcmV0dXJuIGNocm9tZV90aHJlYWRfLmdldCgpOyB9
CisKKyAgYm9vbCBoYXNfY291bnRlcigpIGNvbnN0IHsgcmV0dXJuIF9oYXNfZmllbGRfWzhdOyB9
CisgIGNvbnN0IENvdW50ZXJEZXNjcmlwdG9yJiBjb3VudGVyKCkgY29uc3QgeyByZXR1cm4gKmNv
dW50ZXJfOyB9CisgIENvdW50ZXJEZXNjcmlwdG9yKiBtdXRhYmxlX2NvdW50ZXIoKSB7IF9oYXNf
ZmllbGRfLnNldCg4KTsgcmV0dXJuIGNvdW50ZXJfLmdldCgpOyB9CisKKyBwcml2YXRlOgorICB1
aW50NjRfdCB1dWlkX3t9OworICB1aW50NjRfdCBwYXJlbnRfdXVpZF97fTsKKyAgc3RkOjpzdHJp
bmcgbmFtZV97fTsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPFByb2Nlc3NEZXNjcmlwdG9y
PiBwcm9jZXNzXzsKKyAgOjpwcm90b3plcm86OkNvcHlhYmxlUHRyPENocm9tZVByb2Nlc3NEZXNj
cmlwdG9yPiBjaHJvbWVfcHJvY2Vzc187CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJsZVB0cjxUaHJl
YWREZXNjcmlwdG9yPiB0aHJlYWRfOworICA6OnByb3RvemVybzo6Q29weWFibGVQdHI8Q2hyb21l
VGhyZWFkRGVzY3JpcHRvcj4gY2hyb21lX3RocmVhZF87CisgIDo6cHJvdG96ZXJvOjpDb3B5YWJs
ZVB0cjxDb3VudGVyRGVzY3JpcHRvcj4gY291bnRlcl87CisKKyAgLy8gQWxsb3dzIHRvIHByZXNl
cnZlIHVua25vd24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGgg
ZnV0dXJlIHZlcnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9m
aWVsZHNfOworCisgIHN0ZDo6Yml0c2V0PDk+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBu
YW1lc3BhY2UgcGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFj
ZSBnZW4KKworI2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNF
X1RSQUNLX0VWRU5UX1RSQUNLX0RFU0NSSVBUT1JfUFJPVE9fQ1BQX0hfCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50
L3RyYWNrX2Rlc2NyaXB0b3IucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3Rv
WmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVFJBQ0tfREVTQ1JJUFRPUl9Q
Uk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RS
QUNLX0VWRU5UX1RSQUNLX0RFU0NSSVBUT1JfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5o
PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9m
aWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2Ns
YXNzIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yOworY2xhc3MgQ2hyb21lVGhyZWFkRGVzY3JpcHRv
cjsKK2NsYXNzIENvdW50ZXJEZXNjcmlwdG9yOworY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0b3I7Citj
bGFzcyBUaHJlYWREZXNjcmlwdG9yOworCitjbGFzcyBUcmFja0Rlc2NyaXB0b3JfRGVjb2RlciA6
IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki84
LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6Cisg
IFRyYWNrRGVzY3JpcHRvcl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4p
IDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFja0Rlc2Ny
aXB0b3JfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBUcmFja0Rlc2NyaXB0b3JfRGVjb2Rlcihjb25zdCA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6
ZSkge30KKyAgYm9vbCBoYXNfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCB1dWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19wYXJlbnRfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBwYXJlbnRfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNf
dWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19wcm9jZXNzKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHByb2Nlc3Mo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2hyb21l
X3Byb2Nlc3MoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgY2hyb21lX3Byb2Nlc3MoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRocmVhZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jaHJvbWVfdGhyZWFkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGNocm9tZV90aHJlYWQoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX2J5dGVzKCk7IH0KKyAg
Ym9vbCBoYXNfY291bnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBjb3VudGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5h
c19ieXRlcygpOyB9Cit9OworCitjbGFzcyBUcmFja0Rlc2NyaXB0b3IgOiBwdWJsaWMgOjpwcm90
b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNrRGVzY3Jp
cHRvcl9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1V1aWRGaWVsZE51bWJlciA9
IDEsCisgICAga1BhcmVudFV1aWRGaWVsZE51bWJlciA9IDUsCisgICAga05hbWVGaWVsZE51bWJl
ciA9IDIsCisgICAga1Byb2Nlc3NGaWVsZE51bWJlciA9IDMsCisgICAga0Nocm9tZVByb2Nlc3NG
aWVsZE51bWJlciA9IDYsCisgICAga1RocmVhZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrQ2hyb21l
VGhyZWFkRmllbGROdW1iZXIgPSA3LAorICAgIGtDb3VudGVyRmllbGROdW1iZXIgPSA4LAorICB9
OworICB2b2lkIHNldF91dWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYXJlbnRfdXVpZCh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gUHJvY2Vzc0Rlc2NyaXB0b3I+IFQqIHNldF9wcm9jZXNzKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yPiBUKiBzZXRfY2hyb21lX3Byb2Nl
c3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2KTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gVGhyZWFkRGVzY3JpcHRvcj4gVCogc2V0X3RocmVhZCgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQpOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yPiBUKiBzZXRfY2hyb21lX3RocmVh
ZCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDcpOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQgPSBDb3VudGVyRGVzY3JpcHRvcj4gVCogc2V0X2NvdW50ZXIoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig4KTsKKyAgfQorCit9OworCit9IC8v
IE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8v
IEluY2x1ZGUgZ3VhcmQuCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJ
TkdfVFJBQ0tfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNLX0hfCisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvZXhw
b3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9i
YXNlL3Byb2NfdXRpbHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2Jhc2UvdGhyZWFkX3V0aWxzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZV9oYW5kbGUuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9zY2F0
dGVyZWRfaGVhcF9idWZmZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFjZV9wYWNrZXQucGJ6ZXJvLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJh
Y2tfZXZlbnQvdHJhY2tfZGVzY3JpcHRvci5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC90cmFja19k
ZXNjcmlwdG9yLnBiemVyby5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWFw
PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGlu
dGVybmFsIHsKK2NsYXNzIFRyYWNrUmVnaXN0cnk7Cit9CisKKy8vIFRyYWNrIGV2ZW50cyBhcmUg
cmVjb3JkZWQgb24gYSB0aW1lbGluZSB0cmFjaywgd2hpY2ggbWFpbnRhaW5zIHRoZSByZWxhdGl2
ZQorLy8gdGltZSBvcmRlcmluZyBvZiBhbGwgZXZlbnRzIG9uIHRoYXQgdHJhY2suIEVhY2ggdGhy
ZWFkIGhhcyBpdHMgb3duIGRlZmF1bHQKKy8vIHRyYWNrIChUaHJlYWRUcmFjayksIHdoaWNoIGlz
IGJ5IGRlZmF1bHQgd2hlcmUgYWxsIHRyYWNrIGV2ZW50cyBhcmUgd3JpdHRlbi4KKy8vIFRocmVh
ZCB0cmFja3MgYXJlIGdyb3VwZWQgdW5kZXIgdGhlaXIgaG9zdGluZyBwcm9jZXNzIChQcm9jZXNz
VHJhY2spLgorCisvLyBFdmVudHMgd2hpY2ggYXJlbid0IHN0cmljdGx5IHNjb3BlZCB0byBhIHRo
cmVhZCBvciBhIHByb2Nlc3MsIG9yIGRvbid0CisvLyBjb3JyZXNwb25kIHRvIHN5bmNocm9ub3Vz
IGNvZGUgZXhlY3V0aW9uIG9uIGEgdGhyZWFkIGNhbiB1c2UgYSBjdXN0b20KKy8vIHRyYWNrIChU
cmFjaywgVGhyZWFkVHJhY2sgb3IgUHJvY2Vzc1RyYWNrKS4gQSBUcmFjayBvYmplY3QgY2FuIGFs
c28KKy8vIG9wdGlvbmFsbHkgYmUgcGFyZW50ZWQgdG8gYSB0aHJlYWQgb3IgYSBwcm9jZXNzLgor
Ly8KKy8vIEEgdHJhY2sgaXMgcmVwcmVzZW50ZWQgYnkgYSB1dWlkLCB3aGljaCBtdXN0IGJlIHVu
aXF1ZSBhY3Jvc3MgdGhlIGVudGlyZQorLy8gcmVjb3JkZWQgdHJhY2UuCisvLworLy8gRm9yIGV4
YW1wbGUsIHRvIHJlY29yZCBhbiBldmVudCB0aGF0IGJlZ2lucyBhbmQgZW5kcyBvbiBkaWZmZXJl
bnQgdGhyZWFkcywKKy8vIHVzZSBhIG1hdGNoaW5nIGlkIHRvIHRpZSB0aGUgYmVnaW4gYW5kIGVu
ZCBldmVudHMgdG9nZXRoZXI6CisvLworLy8gICBUUkFDRV9FVkVOVF9CRUdJTigiY2F0ZWdvcnki
LCAiQXN5bmNFdmVudCIsIHBlcmZldHRvOjpUcmFjayg4MDg2KSk7CisvLyAgIC4uLgorLy8gICBU
UkFDRV9FVkVOVF9FTkQoImNhdGVnb3J5IiwgcGVyZmV0dG86OlRyYWNrKDgwODYpKTsKKy8vCisv
LyBUcmFja3MgY2FuIGFsc28gYmUgYW5ub3RhdGVkIHdpdGggbWV0YWRhdGE6CisvLworLy8gICBh
dXRvIGRlc2MgPSB0cmFjay5TZXJpYWxpemUoKTsKKy8vICAgZGVzYy5zZXRfbmFtZSgiTXlUcmFj
ayIpOworLy8gICBwZXJmZXR0bzo6VHJhY2tFdmVudDo6U2V0VHJhY2tEZXNjcmlwdG9yKHRyYWNr
LCBkZXNjKTsKKy8vCisvLyBUaHJlYWRzIGFuZCBwcm9jZXNzZXMgY2FuIGFsc28gYmUgbmFtZWQg
aW4gYSBzaW1pbGFyIHdheSwgZS5nLjoKKy8vCisvLyAgIGF1dG8gZGVzYyA9IHBlcmZldHRvOjpQ
cm9jZXNzVHJhY2s6OkN1cnJlbnQoKS5TZXJpYWxpemUoKTsKKy8vICAgZGVzYy5tdXRhYmxlX3By
b2Nlc3MoKS0+c2V0X3Byb2Nlc3NfbmFtZSgiTXlQcm9jZXNzIik7CisvLyAgIHBlcmZldHRvOjpU
cmFja0V2ZW50OjpTZXRUcmFja0Rlc2NyaXB0b3IoCisvLyAgICAgICBwZXJmZXR0bzo6UHJvY2Vz
c1RyYWNrOjpDdXJyZW50KCksIGRlc2MpOworLy8KKy8vIFRoZSBtZXRhZGF0YSByZW1haW5zIHZh
bGlkIGJldHdlZW4gdHJhY2luZyBzZXNzaW9ucy4gVG8gZnJlZSB1cCBkYXRhIGZvciBhCisvLyB0
cmFjaywgY2FsbCBFcmFzZVRyYWNrRGVzY3JpcHRvcjoKKy8vCisvLyAgIHBlcmZldHRvOjpUcmFj
a0V2ZW50OjpFcmFzZVRyYWNrRGVzY3JpcHRvcih0cmFjayk7CisvLworc3RydWN0IFBFUkZFVFRP
X0VYUE9SVCBUcmFjayB7CisgIGNvbnN0IHVpbnQ2NF90IHV1aWQ7CisgIGNvbnN0IHVpbnQ2NF90
IHBhcmVudF91dWlkOworICBjb25zdGV4cHIgVHJhY2soKSA6IHV1aWQoMCksIHBhcmVudF91dWlk
KDApIHt9CisKKyAgLy8gQ29uc3RydWN0IGEgdHJhY2sgd2l0aCBpZGVudGlmaWVyIHxpZHwsIG9w
dGlvbmFsbHkgcGFyZW50ZWQgdW5kZXIgfHBhcmVudHwuCisgIC8vIElmIG5vIHBhcmVudCBpcyBz
cGVjaWZpZWQsIHRoZSB0cmFjaydzIHBhcmVudCBpcyB0aGUgY3VycmVudCBwcm9jZXNzJ3MKKyAg
Ly8gdHJhY2suCisgIC8vCisgIC8vIFRvIG1pbmltaXplIHRoZSBjaGFuY2VzIGZvciBhY2NpZGVu
dGFsIGlkIGNvbGxpc2lvbnMgYWNyb3NzIHByb2Nlc3NlcywgdGhlCisgIC8vIHRyYWNrJ3MgZWZm
ZWN0aXZlIHV1aWQgaXMgZ2VuZXJhdGVkIGJ5IHhvcnJpbmcgfGlkfCB3aXRoIGEgcmFuZG9tLAor
ICAvLyBwZXItcHJvY2VzcyBjb29raWUuCisgIGV4cGxpY2l0IFRyYWNrKHVpbnQ2NF90IGlkLCBU
cmFjayBwYXJlbnQgPSBNYWtlUHJvY2Vzc1RyYWNrKCkpCisgICAgICA6IHV1aWQoaWQgXiBwYXJl
bnQudXVpZCksIHBhcmVudF91dWlkKHBhcmVudC51dWlkKSB7fQorCisgIGV4cGxpY2l0IG9wZXJh
dG9yIGJvb2woKSBjb25zdCB7IHJldHVybiB1dWlkOyB9CisgIHZvaWQgU2VyaWFsaXplKHByb3Rv
czo6cGJ6ZXJvOjpUcmFja0Rlc2NyaXB0b3IqKSBjb25zdDsKKyAgcHJvdG9zOjpnZW46OlRyYWNr
RGVzY3JpcHRvciBTZXJpYWxpemUoKSBjb25zdDsKKworICAvLyBDb25zdHJ1Y3QgYSBnbG9iYWwg
dHJhY2sgd2l0aCBpZGVudGlmaWVyIHxpZHwuCisgIC8vCisgIC8vIEJld2FyZTogdGhlIGdsb2Jh
bGx5IHVuaXF1ZSB8aWR8IHNob3VsZCBiZSBjaG9zZW4gY2FyZWZ1bGx5IHRvIGF2b2lkCisgIC8v
IGFjY2lkZW50YWwgY2xhc2hlcyB3aXRoIHRyYWNrIGlkZW50aWZpZXJzIGVtaXR0ZWQgYnkgb3Ro
ZXIgcHJvZHVjZXJzLgorICBzdGF0aWMgVHJhY2sgR2xvYmFsKHVpbnQ2NF90IGlkKSB7IHJldHVy
biBUcmFjayhpZCwgVHJhY2soKSk7IH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIFRyYWNrIE1h
a2VUaHJlYWRUcmFjayhiYXNlOjpQbGF0Zm9ybVRocmVhZElkIHRpZCkgeworICAgIC8vIElmIHRp
ZCB3ZXJlIDAgaGVyZSAod2hpY2ggaXMgYW4gaW52YWxpZCB0aWQpLCB3ZSB3b3VsZCBjcmVhdGUg
YSB0aHJlYWQKKyAgICAvLyB0cmFjayB3aXRoIGEgdXVpZCB0aGF0IGNvbmZsaWN0cyB3aXRoIHRo
ZSBjb3JyZXNwb25kaW5nIFByb2Nlc3NUcmFjay4KKyAgICBQRVJGRVRUT19EQ0hFQ0sodGlkICE9
IDApOworICAgIHJldHVybiBUcmFjayhzdGF0aWNfY2FzdDx1aW50NjRfdD4odGlkKSwgTWFrZVBy
b2Nlc3NUcmFjaygpKTsKKyAgfQorCisgIHN0YXRpYyBUcmFjayBNYWtlUHJvY2Vzc1RyYWNrKCkg
eyByZXR1cm4gVHJhY2socHJvY2Vzc191dWlkLCBUcmFjaygpKTsgfQorCisgcHJpdmF0ZToKKyAg
ZnJpZW5kIGNsYXNzIGludGVybmFsOjpUcmFja1JlZ2lzdHJ5OworICBzdGF0aWMgdWludDY0X3Qg
cHJvY2Vzc191dWlkOworfTsKKworLy8gQSBwcm9jZXNzIHRyYWNrIHJlcHJlc2VudHMgZXZlbnRz
IHRoYXQgZGVzY3JpYmUgdGhlIHN0YXRlIG9mIHRoZSBlbnRpcmUKKy8vIGFwcGxpY2F0aW9uIChl
LmcuLCBjb3VudGVyIGV2ZW50cykuIEN1cnJlbnRseSBhIFByb2Nlc3NUcmFjayBjYW4gb25seQor
Ly8gcmVwcmVzZW50IHRoZSBjdXJyZW50IHByb2Nlc3MuCitzdHJ1Y3QgUEVSRkVUVE9fRVhQT1JU
IFByb2Nlc3NUcmFjayA6IHB1YmxpYyBUcmFjayB7CisgIGNvbnN0IGJhc2U6OlBsYXRmb3JtUHJv
Y2Vzc0lkIHBpZDsKKworICBzdGF0aWMgUHJvY2Vzc1RyYWNrIEN1cnJlbnQoKSB7IHJldHVybiBQ
cm9jZXNzVHJhY2soKTsgfQorCisgIHZvaWQgU2VyaWFsaXplKHByb3Rvczo6cGJ6ZXJvOjpUcmFj
a0Rlc2NyaXB0b3IqKSBjb25zdDsKKyAgcHJvdG9zOjpnZW46OlRyYWNrRGVzY3JpcHRvciBTZXJp
YWxpemUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIFByb2Nlc3NUcmFjaygpIDogVHJhY2soTWFr
ZVByb2Nlc3NUcmFjaygpKSwgcGlkKGJhc2U6OkdldFByb2Nlc3NJZCgpKSB7fQorfTsKKworLy8g
QSB0aHJlYWQgdHJhY2sgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdGhyZWFkIG9mIGV4
ZWN1dGlvbi4gQ3VycmVudGx5CisvLyBvbmx5IHRocmVhZHMgaW4gdGhlIGN1cnJlbnQgcHJvY2Vz
cyBjYW4gYmUgcmVmZXJlbmNlZC4KK3N0cnVjdCBQRVJGRVRUT19FWFBPUlQgVGhyZWFkVHJhY2sg
OiBwdWJsaWMgVHJhY2sgeworICBjb25zdCBiYXNlOjpQbGF0Zm9ybVByb2Nlc3NJZCBwaWQ7Cisg
IGNvbnN0IGJhc2U6OlBsYXRmb3JtVGhyZWFkSWQgdGlkOworCisgIHN0YXRpYyBUaHJlYWRUcmFj
ayBDdXJyZW50KCkgeyByZXR1cm4gVGhyZWFkVHJhY2soYmFzZTo6R2V0VGhyZWFkSWQoKSk7IH0K
KworICAvLyBSZXByZXNlbnRzIGEgdGhyZWFkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgIHN0
YXRpYyBUaHJlYWRUcmFjayBGb3JUaHJlYWQoYmFzZTo6UGxhdGZvcm1UaHJlYWRJZCB0aWRfKSB7
CisgICAgcmV0dXJuIFRocmVhZFRyYWNrKHRpZF8pOworICB9CisKKyAgdm9pZCBTZXJpYWxpemUo
cHJvdG9zOjpwYnplcm86OlRyYWNrRGVzY3JpcHRvciopIGNvbnN0OworICBwcm90b3M6Omdlbjo6
VHJhY2tEZXNjcmlwdG9yIFNlcmlhbGl6ZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZXhwbGlj
aXQgVGhyZWFkVHJhY2soYmFzZTo6UGxhdGZvcm1UaHJlYWRJZCB0aWRfKQorICAgICAgOiBUcmFj
ayhNYWtlVGhyZWFkVHJhY2sodGlkXykpLAorICAgICAgICBwaWQoUHJvY2Vzc1RyYWNrOjpDdXJy
ZW50KCkucGlkKSwKKyAgICAgICAgdGlkKHRpZF8pIHt9Cit9OworCituYW1lc3BhY2UgaW50ZXJu
YWwgeworCisvLyBLZWVwcyBhIG1hcCBvZiB1dWlkcyB0byBzZXJpYWxpemVkIHRyYWNrIGRlc2Ny
aXB0b3JzIGFuZCBwcm92aWRlcyBhCisvLyB0aHJlYWQtc2FmZSB3YXkgdG8gcmVhZCBhbmQgd3Jp
dGUgdGhlbS4gRWFjaCB0cmFjZSB3cml0ZXIga2VlcHMgYSBUTFMgc2V0IG9mCisvLyB0aGUgdHJh
Y2tzIGl0IGhhcyBzZWVuIChzZWUgVHJhY2tFdmVudEluY3JlbWVudGFsU3RhdGUpLiBJbiB0aGUg
Y29tbW9uIGNhc2UsCisvLyB0aGlzIHJlZ2lzdHJ5IGlzIG5vdCBjb25zdWx0ZWQgKGFuZCBubyBs
b2NrcyBhcmUgdGFrZW4pLiBIb3dldmVyIHdoZW4gYSBuZXcKKy8vIHRyYWNrIGlzIHNlZW4sIHRo
aXMgcmVnaXN0cnkgaXMgdXNlZCB0byB3cml0ZSBlaXRoZXIgMSkgdGhlIGRlZmF1bHQKKy8vIGRl
c2NyaXB0b3IgZm9yIHRoYXQgdHJhY2sgKHNlZSAqVHJhY2s6OlNlcmlhbGl6ZSkgb3IgMikgYSBz
ZXJpYWxpemVkCisvLyBkZXNjcmlwdG9yIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkgd2hpY2ggbWF5
IGhhdmUgYWRkaXRpb25hbCBtZXRhZGF0YSAoZS5nLiwKKy8vIHRyYWNrIG5hbWUpLgorLy8gVE9E
Tyhlc2Vja2xlcik6IFJlbW92ZSBQRVJGRVRUT19FWFBPUlQgb25jZSBDaHJvbWl1bSBubyBsb25n
ZXIgY2FsbHMKKy8vIFRyYWNrUmVnaXN0cnk6OkluaXRpYWxpemVJbnN0YW5jZSgpIGRpcmVjdGx5
LgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNrUmVnaXN0cnkgeworIHB1YmxpYzoKKyAgdXNp
bmcgU2VyaWFsaXplZFRyYWNrRGVzY3JpcHRvciA9IHN0ZDo6c3RyaW5nOworCisgIFRyYWNrUmVn
aXN0cnkoKTsKKyAgflRyYWNrUmVnaXN0cnkoKTsKKworICBzdGF0aWMgdm9pZCBJbml0aWFsaXpl
SW5zdGFuY2UoKTsKKyAgc3RhdGljIFRyYWNrUmVnaXN0cnkqIEdldCgpIHsgcmV0dXJuIGluc3Rh
bmNlXzsgfQorCisgIHZvaWQgRXJhc2VUcmFjayhUcmFjayk7CisKKyAgLy8gU3RvcmUgbWV0YWRh
dGEgZm9yIHx0cmFja3wgaW4gdGhlIHJlZ2lzdHJ5LiB8ZmlsbF9mdW5jdGlvbnwgaXMgY2FsbGVk
CisgIC8vIHN5bmNocm9ub3VzbHkgdG8gcmVjb3JkIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3Ig
dGhlIHRyYWNrLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhY2tUeXBlPgorICB2b2lkIFVwZGF0
ZVRyYWNrKAorICAgICAgY29uc3QgVHJhY2tUeXBlJiB0cmFjaywKKyAgICAgIHN0ZDo6ZnVuY3Rp
b248dm9pZChwcm90b3M6OnBiemVybzo6VHJhY2tEZXNjcmlwdG9yKik+IGZpbGxfZnVuY3Rpb24p
IHsKKyAgICBVcGRhdGVUcmFja0ltcGwodHJhY2ssIFsmXShwcm90b3M6OnBiemVybzo6VHJhY2tE
ZXNjcmlwdG9yKiBkZXNjKSB7CisgICAgICB0cmFjay5TZXJpYWxpemUoZGVzYyk7CisgICAgICBm
aWxsX2Z1bmN0aW9uKGRlc2MpOworICAgIH0pOworICB9CisKKyAgLy8gVGhpcyB2YXJpYW50IGxl
dHMgdGhlIHVzZXIgc3VwcGx5IGEgc2VyaWFsaXplZCB0cmFjayBkZXNjcmlwdG9yIGRpcmVjdGx5
LgorICB2b2lkIFVwZGF0ZVRyYWNrKFRyYWNrLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXpl
ZF9kZXNjKTsKKworICAvLyBJZiB8dHJhY2t8IGV4aXN0cyBpbiB0aGUgcmVnaXN0cnksIHdyaXRl
IG91dCB0aGUgc2VyaWFsaXplZCB0cmFjaworICAvLyBkZXNjcmlwdG9yIGZvciBpdCBpbnRvIHxw
YWNrZXR8LiBPdGhlcndpc2UganVzdCB0aGUgZXBoZW1lcmFsIHRyYWNrIG9iamVjdAorICAvLyBp
cyBzZXJpYWxpemVkIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgbWV0YWRhdGEuCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUcmFja1R5cGU+CisgIHZvaWQgU2VyaWFsaXplVHJhY2soCisgICAgICBjb25z
dCBUcmFja1R5cGUmIHRyYWNrLAorICAgICAgcHJvdG96ZXJvOjpNZXNzYWdlSGFuZGxlPHByb3Rv
czo6cGJ6ZXJvOjpUcmFjZVBhY2tldD4gcGFja2V0KSB7CisgICAgLy8gSWYgdGhlIHRyYWNrIGhh
cyBleHRyYSBtZXRhZGF0YSAocmVjb3JkZWQgd2l0aCBVcGRhdGVUcmFjayksIGl0IHdpbGwgYmUK
KyAgICAvLyBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIFRvIG1pbmltaXplIHRoZSB0aW1lIHRoZSBs
b2NrIGlzIGhlbGQsIG1ha2UgYSBjb3B5CisgICAgLy8gb2YgdGhlIGRhdGEgaGVsZCBpbiB0aGUg
cmVnaXN0cnkgYW5kIHdyaXRlIGl0IG91dHNpZGUgdGhlIGxvY2suCisgICAgc3RkOjpzdHJpbmcg
ZGVzY19jb3B5OworICAgIHsKKyAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2Nr
KG11dGV4Xyk7CisgICAgICBjb25zdCBhdXRvJiBpdCA9IHRyYWNrc18uZmluZCh0cmFjay51dWlk
KTsKKyAgICAgIGlmIChpdCAhPSB0cmFja3NfLmVuZCgpKSB7CisgICAgICAgIGRlc2NfY29weSA9
IGl0LT5zZWNvbmQ7CisgICAgICAgIFBFUkZFVFRPX0RDSEVDSyghZGVzY19jb3B5LmVtcHR5KCkp
OworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWRlc2NfY29weS5lbXB0eSgpKSB7CisgICAgICBX
cml0ZVRyYWNrRGVzY3JpcHRvcihzdGQ6Om1vdmUoZGVzY19jb3B5KSwgc3RkOjptb3ZlKHBhY2tl
dCkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2Ugd2UganVzdCB3cml0ZSB0aGUg
YmFzaWMgZGVzY3JpcHRvciBmb3IgdGhpcyB0eXBlIG9mIHRyYWNrCisgICAgICAvLyAoZS5nLiwg
anVzdCB1dWlkLCBubyBuYW1lKS4KKyAgICAgIHRyYWNrLlNlcmlhbGl6ZShwYWNrZXQtPnNldF90
cmFja19kZXNjcmlwdG9yKCkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIFdyaXRlVHJh
Y2tEZXNjcmlwdG9yKAorICAgICAgY29uc3QgU2VyaWFsaXplZFRyYWNrRGVzY3JpcHRvciYgZGVz
YywKKyAgICAgIHByb3RvemVybzo6TWVzc2FnZUhhbmRsZTxwcm90b3M6OnBiemVybzo6VHJhY2VQ
YWNrZXQ+IHBhY2tldCk7CisKKyBwcml2YXRlOgorICB2b2lkIFVwZGF0ZVRyYWNrSW1wbCgKKyAg
ICAgIFRyYWNrLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHByb3Rvczo6cGJ6ZXJvOjpUcmFj
a0Rlc2NyaXB0b3IqKT4gZmlsbF9mdW5jdGlvbik7CisKKyAgc3RkOjptdXRleCBtdXRleF87Cisg
IHN0ZDo6bWFwPHVpbnQ2NF90IC8qIHV1aWQgKi8sIFNlcmlhbGl6ZWRUcmFja0Rlc2NyaXB0b3I+
IHRyYWNrc187CisKKyAgc3RhdGljIFRyYWNrUmVnaXN0cnkqIGluc3RhbmNlXzsKK307CisKK30g
IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRp
ZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNLX0hfCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9idWlsdGluX2Nsb2Nr
LnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1
Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTU1PTl9CVUlMVElOX0NMT0NLX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0JVSUxUSU5fQ0xPQ0tfUFJPVE9fSF8KKworI2luY2x1
ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tl
ZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBi
emVybyB7CisKKworZW51bSBCdWlsdGluQ2xvY2sgOiBpbnQzMl90IHsKKyAgQlVJTFRJTl9DTE9D
S19VTktOT1dOID0gMCwKKyAgQlVJTFRJTl9DTE9DS19SRUFMVElNRSA9IDEsCisgIEJVSUxUSU5f
Q0xPQ0tfUkVBTFRJTUVfQ09BUlNFID0gMiwKKyAgQlVJTFRJTl9DTE9DS19NT05PVE9OSUMgPSAz
LAorICBCVUlMVElOX0NMT0NLX01PTk9UT05JQ19DT0FSU0UgPSA0LAorICBCVUlMVElOX0NMT0NL
X01PTk9UT05JQ19SQVcgPSA1LAorICBCVUlMVElOX0NMT0NLX0JPT1RUSU1FID0gNiwKKyAgQlVJ
TFRJTl9DTE9DS19NQVhfSUQgPSA2MywKK307CisKK2NvbnN0IEJ1aWx0aW5DbG9jayBCdWlsdGlu
Q2xvY2tfTUlOID0gQlVJTFRJTl9DTE9DS19VTktOT1dOOworY29uc3QgQnVpbHRpbkNsb2NrIEJ1
aWx0aW5DbG9ja19NQVggPSBCVUlMVElOX0NMT0NLX01BWF9JRDsKKworfSAvLyBOYW1lc3BhY2Uu
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1
YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0
by90cmFjZS9pbnRlcm5lZF9kYXRhL2ludGVybmVkX2RhdGEucGJ6ZXJvLmgKKy8vIEF1dG9nZW5l
cmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisj
aWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfSU5URVJORURfREFU
QV9JTlRFUk5FRF9EQVRBX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fVFJBQ0VfSU5URVJORURfREFUQV9JTlRFUk5FRF9EQVRBX1BST1RPX0hfCisKKyNp
bmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
YWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxz
LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFj
ZSBwYnplcm8geworCitjbGFzcyBDYWxsc3RhY2s7CitjbGFzcyBEZWJ1Z0Fubm90YXRpb25OYW1l
OworY2xhc3MgRXZlbnRDYXRlZ29yeTsKK2NsYXNzIEV2ZW50TmFtZTsKK2NsYXNzIEZyYW1lOwor
Y2xhc3MgSW50ZXJuZWRHcHVSZW5kZXJTdGFnZVNwZWNpZmljYXRpb247CitjbGFzcyBJbnRlcm5l
ZEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEludGVybmVkU3RyaW5nOworY2xhc3MgTG9nTWVzc2Fn
ZUJvZHk7CitjbGFzcyBNYXBwaW5nOworY2xhc3MgUHJvZmlsZWRGcmFtZVN5bWJvbHM7CitjbGFz
cyBTb3VyY2VMb2NhdGlvbjsKKworY2xhc3MgSW50ZXJuZWREYXRhX0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMjQsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBJbnRlcm5l
ZERhdGFfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSW50ZXJuZWREYXRhX0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgSW50ZXJuZWREYXRhX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X2V2ZW50X2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4gZXZlbnRfY2F0ZWdvcmllcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPigxKTsgfQorICBib29sIGhhc19ldmVudF9uYW1lcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0
ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBldmVudF9uYW1lcygpIGNvbnN0IHsgcmV0
dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyKTsgfQorICBib29sIGhh
c19kZWJ1Z19hbm5vdGF0aW9uX25hbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+IGRlYnVnX2Fubm90YXRpb25fbmFtZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBl
YXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMyk7IH0KKyAgYm9vbCBoYXNfc291cmNlX2xv
Y2F0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBzb3VyY2Vf
bG9jYXRpb25zKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0
Qnl0ZXM+KDQpOyB9CisgIGJvb2wgaGFzX2xvZ19tZXNzYWdlX2JvZHkoKSBjb25zdCB7IHJldHVy
biBhdDwyMD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0
b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGxvZ19tZXNzYWdlX2JvZHkoKSBjb25zdCB7IHJl
dHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMjApOyB9CisgIGJvb2wg
aGFzX2J1aWxkX2lkcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4g
YnVpbGRfaWRzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0
Qnl0ZXM+KDE2KTsgfQorICBib29sIGhhc19tYXBwaW5nX3BhdGhzKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9y
PDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBtYXBwaW5nX3BhdGhzKCkgY29uc3QgeyByZXR1cm4g
R2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDE3KTsgfQorICBib29sIGhhc19z
b3VyY2VfcGF0aHMoKSBjb25zdCB7IHJldHVybiBhdDwxOD4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IHNv
dXJjZV9wYXRocygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzPigxOCk7IH0KKyAgYm9vbCBoYXNfZnVuY3Rpb25fbmFtZXMoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRv
cjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZnVuY3Rpb25fbmFtZXMoKSBjb25zdCB7IHJldHVy
biBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNSk7IH0KKyAgYm9vbCBoYXNf
cHJvZmlsZWRfZnJhbWVfc3ltYm9scygpIGNvbnN0IHsgcmV0dXJuIGF0PDIxPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29u
c3RCeXRlcz4gcHJvZmlsZWRfZnJhbWVfc3ltYm9scygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVh
dGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyMSk7IH0KKyAgYm9vbCBoYXNfbWFwcGluZ3Mo
KSBjb25zdCB7IHJldHVybiBhdDwxOT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IG1hcHBpbmdzKCkgY29u
c3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDE5KTsgfQor
ICBib29sIGhhc19mcmFtZXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4gZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0
Qnl0ZXM+KDYpOyB9CisgIGJvb2wgaGFzX2NhbGxzdGFja3MoKSBjb25zdCB7IHJldHVybiBhdDw3
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnBy
b3RvemVybzo6Q29uc3RCeXRlcz4gY2FsbHN0YWNrcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVh
dGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig3KTsgfQorICBib29sIGhhc192dWxrYW5fbWVt
b3J5X2tleXMoKSBjb25zdCB7IHJldHVybiBhdDwyMj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IHZ1bGth
bl9tZW1vcnlfa2V5cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzPigyMik7IH0KKyAgYm9vbCBoYXNfZ3JhcGhpY3NfY29udGV4dHMoKSBjb25zdCB7
IHJldHVybiBhdDwyMz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxk
SXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGdyYXBoaWNzX2NvbnRleHRzKCkgY29u
c3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIzKTsgfQor
ICBib29sIGhhc19ncHVfc3BlY2lmaWNhdGlvbnMoKSBjb25zdCB7IHJldHVybiBhdDwyND4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3pl
cm86OkNvbnN0Qnl0ZXM+IGdwdV9zcGVjaWZpY2F0aW9ucygpIGNvbnN0IHsgcmV0dXJuIEdldFJl
cGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyNCk7IH0KK307CisKK2NsYXNzIEludGVy
bmVkRGF0YSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gSW50ZXJuZWREYXRhX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrRXZlbnRDYXRlZ29yaWVzRmllbGROdW1iZXIgPSAxLAorICAgIGtFdmVudE5hbWVzRmllbGRO
dW1iZXIgPSAyLAorICAgIGtEZWJ1Z0Fubm90YXRpb25OYW1lc0ZpZWxkTnVtYmVyID0gMywKKyAg
ICBrU291cmNlTG9jYXRpb25zRmllbGROdW1iZXIgPSA0LAorICAgIGtMb2dNZXNzYWdlQm9keUZp
ZWxkTnVtYmVyID0gMjAsCisgICAga0J1aWxkSWRzRmllbGROdW1iZXIgPSAxNiwKKyAgICBrTWFw
cGluZ1BhdGhzRmllbGROdW1iZXIgPSAxNywKKyAgICBrU291cmNlUGF0aHNGaWVsZE51bWJlciA9
IDE4LAorICAgIGtGdW5jdGlvbk5hbWVzRmllbGROdW1iZXIgPSA1LAorICAgIGtQcm9maWxlZEZy
YW1lU3ltYm9sc0ZpZWxkTnVtYmVyID0gMjEsCisgICAga01hcHBpbmdzRmllbGROdW1iZXIgPSAx
OSwKKyAgICBrRnJhbWVzRmllbGROdW1iZXIgPSA2LAorICAgIGtDYWxsc3RhY2tzRmllbGROdW1i
ZXIgPSA3LAorICAgIGtWdWxrYW5NZW1vcnlLZXlzRmllbGROdW1iZXIgPSAyMiwKKyAgICBrR3Jh
cGhpY3NDb250ZXh0c0ZpZWxkTnVtYmVyID0gMjMsCisgICAga0dwdVNwZWNpZmljYXRpb25zRmll
bGROdW1iZXIgPSAyNCwKKyAgfTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFdmVudENhdGVn
b3J5PiBUKiBhZGRfZXZlbnRfY2F0ZWdvcmllcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFdmVudE5hbWU+
IFQqIGFkZF9ldmVudF9uYW1lcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBEZWJ1Z0Fubm90YXRpb25OYW1l
PiBUKiBhZGRfZGVidWdfYW5ub3RhdGlvbl9uYW1lcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTb3VyY2VM
b2NhdGlvbj4gVCogYWRkX3NvdXJjZV9sb2NhdGlvbnMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gTG9nTWVz
c2FnZUJvZHk+IFQqIGFkZF9sb2dfbWVzc2FnZV9ib2R5KCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMjApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJbnRl
cm5lZFN0cmluZz4gVCogYWRkX2J1aWxkX2lkcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDE2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRT
dHJpbmc+IFQqIGFkZF9tYXBwaW5nX3BhdGhzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oMTcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJbnRlcm5lZFN0
cmluZz4gVCogYWRkX3NvdXJjZV9wYXRocygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDE4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRTdHJp
bmc+IFQqIGFkZF9mdW5jdGlvbl9uYW1lcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9maWxlZEZyYW1l
U3ltYm9scz4gVCogYWRkX3Byb2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigyMSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IE1hcHBpbmc+IFQqIGFkZF9tYXBwaW5ncygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDE5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRnJhbWU+IFQqIGFk
ZF9mcmFtZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2KTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2FsbHN0YWNrPiBUKiBhZGRfY2FsbHN0YWNrcygp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDcpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBJbnRlcm5lZFN0cmluZz4gVCogYWRkX3Z1bGthbl9tZW1vcnlfa2V5
cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIyKTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRHcmFwaGljc0NvbnRleHQ+IFQqIGFkZF9ncmFw
aGljc19jb250ZXh0cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIzKTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRHcHVSZW5kZXJTdGFnZVNw
ZWNpZmljYXRpb24+IFQqIGFkZF9ncHVfc3BlY2lmaWNhdGlvbnMoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigyNCk7CisgIH0KKworfTsKKworfSAvLyBOYW1lc3BhY2UuCit9
IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJk
LgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90
cmFjZS90cmFja19ldmVudC90cmFja19ldmVudC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBi
eSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYg
UEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9UUkFDS19F
VkVOVF9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RS
QUNFX1RSQUNLX0VWRU5UX1RSQUNLX0VWRU5UX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYu
aD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRf
ZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitj
bGFzcyBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGU7CitjbGFzcyBDaHJvbWVGcmFtZVJl
cG9ydGVyOworY2xhc3MgQ2hyb21lSGlzdG9ncmFtU2FtcGxlOworY2xhc3MgQ2hyb21lS2V5ZWRT
ZXJ2aWNlOworY2xhc3MgQ2hyb21lTGF0ZW5jeUluZm87CitjbGFzcyBDaHJvbWVMZWdhY3lJcGM7
CitjbGFzcyBDaHJvbWVVc2VyRXZlbnQ7CitjbGFzcyBEZWJ1Z0Fubm90YXRpb247CitjbGFzcyBM
b2dNZXNzYWdlOworY2xhc3MgVGFza0V4ZWN1dGlvbjsKK2NsYXNzIFRyYWNrRXZlbnRfTGVnYWN5
RXZlbnQ7CitlbnVtIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbiA6IGludDMy
X3Q7CitlbnVtIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGUgOiBpbnQz
Ml90OworZW51bSBUcmFja0V2ZW50X1R5cGUgOiBpbnQzMl90OworCitlbnVtIFRyYWNrRXZlbnRf
VHlwZSA6IGludDMyX3QgeworICBUcmFja0V2ZW50X1R5cGVfVFlQRV9VTlNQRUNJRklFRCA9IDAs
CisgIFRyYWNrRXZlbnRfVHlwZV9UWVBFX1NMSUNFX0JFR0lOID0gMSwKKyAgVHJhY2tFdmVudF9U
eXBlX1RZUEVfU0xJQ0VfRU5EID0gMiwKKyAgVHJhY2tFdmVudF9UeXBlX1RZUEVfSU5TVEFOVCA9
IDMsCisgIFRyYWNrRXZlbnRfVHlwZV9UWVBFX0NPVU5URVIgPSA0LAorfTsKKworY29uc3QgVHJh
Y2tFdmVudF9UeXBlIFRyYWNrRXZlbnRfVHlwZV9NSU4gPSBUcmFja0V2ZW50X1R5cGVfVFlQRV9V
TlNQRUNJRklFRDsKK2NvbnN0IFRyYWNrRXZlbnRfVHlwZSBUcmFja0V2ZW50X1R5cGVfTUFYID0g
VHJhY2tFdmVudF9UeXBlX1RZUEVfQ09VTlRFUjsKKworZW51bSBUcmFja0V2ZW50X0xlZ2FjeUV2
ZW50X0Zsb3dEaXJlY3Rpb24gOiBpbnQzMl90IHsKKyAgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9G
bG93RGlyZWN0aW9uX0ZMT1dfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFja0V2ZW50X0xlZ2FjeUV2
ZW50X0Zsb3dEaXJlY3Rpb25fRkxPV19JTiA9IDEsCisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRf
Rmxvd0RpcmVjdGlvbl9GTE9XX09VVCA9IDIsCisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxv
d0RpcmVjdGlvbl9GTE9XX0lOT1VUID0gMywKK307CisKK2NvbnN0IFRyYWNrRXZlbnRfTGVnYWN5
RXZlbnRfRmxvd0RpcmVjdGlvbiBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb25f
TUlOID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX0ZMT1dfVU5TUEVDSUZJ
RUQ7Citjb25zdCBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb24gVHJhY2tFdmVu
dF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX01BWCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRf
Rmxvd0RpcmVjdGlvbl9GTE9XX0lOT1VUOworCitlbnVtIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRf
SW5zdGFudEV2ZW50U2NvcGUgOiBpbnQzMl90IHsKKyAgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9J
bnN0YW50RXZlbnRTY29wZV9TQ09QRV9VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNrRXZlbnRfTGVn
YWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfR0xPQkFMID0gMSwKKyAgVHJhY2tFdmVu
dF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9TQ09QRV9QUk9DRVNTID0gMiwKKyAgVHJh
Y2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9TQ09QRV9USFJFQUQgPSAzLAor
fTsKKworY29uc3QgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZSBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX01JTiA9IFRyYWNrRXZlbnRfTGVn
YWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVU5TUEVDSUZJRUQ7Citjb25zdCBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlIFRyYWNrRXZlbnRfTGVnYWN5RXZl
bnRfSW5zdGFudEV2ZW50U2NvcGVfTUFYID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50
RXZlbnRTY29wZV9TQ09QRV9USFJFQUQ7CisKK2NsYXNzIEV2ZW50TmFtZV9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXZl
bnROYW1lX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV2ZW50TmFtZV9EZWNvZGVyKGNv
bnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0
IEV2ZW50TmFtZV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19paWQo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaWlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19uYW1lKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJz
IG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFz
cyBFdmVudE5hbWUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IEV2ZW50TmFtZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsK
KyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5k
Qnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIEV2ZW50Q2F0ZWdvcnlfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIEV2ZW50Q2F0ZWdvcnlfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXZlbnRD
YXRlZ29yeV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IEV2ZW50Q2F0ZWdvcnlfRGVjb2Rlcihjb25zdCA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6
ZSkge30KKyAgYm9vbCBoYXNfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19z
dHJpbmcoKTsgfQorfTsKKworY2xhc3MgRXZlbnRDYXRlZ29yeSA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXZlbnRDYXRlZ29yeV9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrTmFtZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uYW1l
KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRh
dGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRh
dGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0K
K307CisKK2NsYXNzIFRyYWNrRXZlbnREZWZhdWx0c19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMxLCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgVHJhY2tFdmVudERlZmF1
bHRzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNrRXZlbnREZWZhdWx0c19EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4
cGxpY2l0IFRyYWNrRXZlbnREZWZhdWx0c19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc190cmFja191dWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCB0cmFja191dWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfZXh0cmFfY291bnRlcl90cmFja191dWlkcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDMxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJ
dGVyYXRvcjx1aW50NjRfdD4gZXh0cmFfY291bnRlcl90cmFja191dWlkcygpIGNvbnN0IHsgcmV0
dXJuIEdldFJlcGVhdGVkPHVpbnQ2NF90PigzMSk7IH0KK307CisKK2NsYXNzIFRyYWNrRXZlbnRE
ZWZhdWx0cyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gVHJhY2tFdmVudERlZmF1bHRzX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrVHJhY2tVdWlkRmllbGROdW1iZXIgPSAxMSwKKyAgICBrRXh0cmFDb3VudGVyVHJh
Y2tVdWlkc0ZpZWxkTnVtYmVyID0gMzEsCisgIH07CisgIHZvaWQgc2V0X3RyYWNrX3V1aWQodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB2b2lk
IGFkZF9leHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMxLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRyYWNrRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8zMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6
CisgIFRyYWNrRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6
IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVHJhY2tFdmVudF9E
ZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRl
cnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9Cisg
IGV4cGxpY2l0IFRyYWNrRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfY2F0ZWdvcnlfaWlkcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPHVpbnQ2NF90PiBjYXRlZ29yeV9p
aWRzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8dWludDY0X3Q+KDMpOyB9CisgIGJvb2wg
aGFzX2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBhdDwyMj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+
IGNhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29u
c3RDaGFycz4oMjIpOyB9CisgIGJvb2wgaGFzX25hbWVfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTA+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBuYW1lX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDEwPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBh
dDwyMz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25z
dCB7IHJldHVybiBhdDwyMz4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc190eXBlKCkgY29u
c3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdHlwZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDk+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190cmFja191dWlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB0cmFja191dWlkKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfY291bnRl
cl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMwPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBj
b3VudGVyX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzA+KCkuYXNfaW50NjQoKTsgfQorICBi
b29sIGhhc19leHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzKCkgY29uc3QgeyByZXR1cm4gYXQ8MzE+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPHVpbnQ2
NF90PiBleHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0
ZWQ8dWludDY0X3Q+KDMxKTsgfQorICBib29sIGhhc19leHRyYV9jb3VudGVyX3ZhbHVlcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDEyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjxpbnQ2NF90PiBleHRyYV9jb3VudGVyX3ZhbHVlcygpIGNvbnN0IHsgcmV0
dXJuIEdldFJlcGVhdGVkPGludDY0X3Q+KDEyKTsgfQorICBib29sIGhhc19kZWJ1Z19hbm5vdGF0
aW9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBkZWJ1Z19hbm5v
dGF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzPig0KTsgfQorICBib29sIGhhc190YXNrX2V4ZWN1dGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0
PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0YXNrX2V4ZWN1dGlv
bigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19sb2df
bWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgbG9nX21lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyMT4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX2NjX3NjaGVkdWxlcl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2Nfc2NoZWR1
bGVyX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19jaHJvbWVfdXNlcl9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI1PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2hyb21lX3VzZXJfZXZlbnQoKSBjb25zdCB7
IHJldHVybiBhdDwyNT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9rZXllZF9z
ZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBjaHJvbWVfa2V5ZWRfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI2
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2hyb21lX2xlZ2FjeV9pcGMoKSBjb25zdCB7
IHJldHVybiBhdDwyNz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNo
cm9tZV9sZWdhY3lfaXBjKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjc+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19jaHJvbWVfaGlzdG9ncmFtX3NhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI4
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2hyb21lX2hpc3RvZ3Jh
bV9zYW1wbGUoKSBjb25zdCB7IHJldHVybiBhdDwyOD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wg
aGFzX2Nocm9tZV9sYXRlbmN5X2luZm8oKSBjb25zdCB7IHJldHVybiBhdDwyOT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9tZV9sYXRlbmN5X2luZm8oKSBjb25z
dCB7IHJldHVybiBhdDwyOT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9mcmFt
ZV9yZXBvcnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDMyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgY2hyb21lX2ZyYW1lX3JlcG9ydGVyKCkgY29uc3QgeyByZXR1cm4g
YXQ8MzI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190aW1lc3RhbXBfZGVsdGFfdXMoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0aW1lc3RhbXBfZGVs
dGFfdXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNf
dGltZXN0YW1wX2Fic29sdXRlX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkudmFsaWQoKTsg
fQorICBpbnQ2NF90IHRpbWVzdGFtcF9hYnNvbHV0ZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE2
PigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfdGhyZWFkX3RpbWVfZGVsdGFfdXMoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0aHJlYWRfdGltZV9kZWx0
YV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc190
aHJlYWRfdGltZV9hYnNvbHV0ZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE3PigpLnZhbGlkKCk7
IH0KKyAgaW50NjRfdCB0aHJlYWRfdGltZV9hYnNvbHV0ZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0
PDE3PigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50
X2RlbHRhKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGhy
ZWFkX2luc3RydWN0aW9uX2NvdW50X2RlbHRhKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc19p
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9hYnNvbHV0ZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDIwPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0aHJlYWRfaW5z
dHJ1Y3Rpb25fY291bnRfYWJzb2x1dGUoKSBjb25zdCB7IHJldHVybiBhdDwyMD4oKS5hc19pbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX2xlZ2FjeV9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBsZWdhY3lfZXZlbnQoKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLmFzX2J5dGVzKCk7IH0KK307CisKK2NsYXNzIFRyYWNrRXZlbnQg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IFRyYWNrRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDYXRlZ29y
eUlpZHNGaWVsZE51bWJlciA9IDMsCisgICAga0NhdGVnb3JpZXNGaWVsZE51bWJlciA9IDIyLAor
ICAgIGtOYW1lSWlkRmllbGROdW1iZXIgPSAxMCwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMjMs
CisgICAga1R5cGVGaWVsZE51bWJlciA9IDksCisgICAga1RyYWNrVXVpZEZpZWxkTnVtYmVyID0g
MTEsCisgICAga0NvdW50ZXJWYWx1ZUZpZWxkTnVtYmVyID0gMzAsCisgICAga0V4dHJhQ291bnRl
clRyYWNrVXVpZHNGaWVsZE51bWJlciA9IDMxLAorICAgIGtFeHRyYUNvdW50ZXJWYWx1ZXNGaWVs
ZE51bWJlciA9IDEyLAorICAgIGtEZWJ1Z0Fubm90YXRpb25zRmllbGROdW1iZXIgPSA0LAorICAg
IGtUYXNrRXhlY3V0aW9uRmllbGROdW1iZXIgPSA1LAorICAgIGtMb2dNZXNzYWdlRmllbGROdW1i
ZXIgPSAyMSwKKyAgICBrQ2NTY2hlZHVsZXJTdGF0ZUZpZWxkTnVtYmVyID0gMjQsCisgICAga0No
cm9tZVVzZXJFdmVudEZpZWxkTnVtYmVyID0gMjUsCisgICAga0Nocm9tZUtleWVkU2VydmljZUZp
ZWxkTnVtYmVyID0gMjYsCisgICAga0Nocm9tZUxlZ2FjeUlwY0ZpZWxkTnVtYmVyID0gMjcsCisg
ICAga0Nocm9tZUhpc3RvZ3JhbVNhbXBsZUZpZWxkTnVtYmVyID0gMjgsCisgICAga0Nocm9tZUxh
dGVuY3lJbmZvRmllbGROdW1iZXIgPSAyOSwKKyAgICBrQ2hyb21lRnJhbWVSZXBvcnRlckZpZWxk
TnVtYmVyID0gMzIsCisgICAga1RpbWVzdGFtcERlbHRhVXNGaWVsZE51bWJlciA9IDEsCisgICAg
a1RpbWVzdGFtcEFic29sdXRlVXNGaWVsZE51bWJlciA9IDE2LAorICAgIGtUaHJlYWRUaW1lRGVs
dGFVc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrVGhyZWFkVGltZUFic29sdXRlVXNGaWVsZE51bWJl
ciA9IDE3LAorICAgIGtUaHJlYWRJbnN0cnVjdGlvbkNvdW50RGVsdGFGaWVsZE51bWJlciA9IDgs
CisgICAga1RocmVhZEluc3RydWN0aW9uQ291bnRBYnNvbHV0ZUZpZWxkTnVtYmVyID0gMjAsCisg
ICAga0xlZ2FjeUV2ZW50RmllbGROdW1iZXIgPSA2LAorICB9OworICB1c2luZyBMZWdhY3lFdmVu
dCA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50X0xlZ2FjeUV2ZW50Owor
ICB1c2luZyBUeXBlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnRfVHlw
ZTsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9VTlNQRUNJRklFRCA9IFRyYWNrRXZlbnRfVHlw
ZV9UWVBFX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NMSUNFX0JFR0lO
ID0gVHJhY2tFdmVudF9UeXBlX1RZUEVfU0xJQ0VfQkVHSU47CisgIHN0YXRpYyBjb25zdCBUeXBl
IFRZUEVfU0xJQ0VfRU5EID0gVHJhY2tFdmVudF9UeXBlX1RZUEVfU0xJQ0VfRU5EOworICBzdGF0
aWMgY29uc3QgVHlwZSBUWVBFX0lOU1RBTlQgPSBUcmFja0V2ZW50X1R5cGVfVFlQRV9JTlNUQU5U
OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0NPVU5URVIgPSBUcmFja0V2ZW50X1R5cGVfVFlQ
RV9DT1VOVEVSOworICB2b2lkIGFkZF9jYXRlZ29yeV9paWRzKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9jYXRlZ29yaWVzKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIyLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBhZGRfY2F0ZWdvcmllcyhjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIyLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9uYW1lX2lpZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxMCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMjMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoMjMsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3R5cGUo
OjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnRfVHlwZSB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RyYWNrX3V1aWQo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9jb3VudGVyX3ZhbHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MzAsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9leHRyYV9jb3VudGVyX3RyYWNrX3V1aWRzKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBhZGRfZXh0cmFfY291bnRlcl92YWx1ZXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxMiwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGVidWdBbm5v
dGF0aW9uPiBUKiBhZGRfZGVidWdfYW5ub3RhdGlvbnMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVGFza0V4
ZWN1dGlvbj4gVCogc2V0X3Rhc2tfZXhlY3V0aW9uKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oNSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IExvZ01lc3Nh
Z2U+IFQqIHNldF9sb2dfbWVzc2FnZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDIxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lQ29tcG9zaXRv
clNjaGVkdWxlclN0YXRlPiBUKiBzZXRfY2Nfc2NoZWR1bGVyX3N0YXRlKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBDaHJvbWVVc2VyRXZlbnQ+IFQqIHNldF9jaHJvbWVfdXNlcl9ldmVudCgpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gQ2hyb21lS2V5ZWRTZXJ2aWNlPiBUKiBzZXRfY2hyb21lX2tleWVkX3NlcnZpY2Uo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNik7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUxlZ2FjeUlwYz4gVCogc2V0X2Nocm9tZV9sZWdhY3lf
aXBjKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjcpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDaHJvbWVIaXN0b2dyYW1TYW1wbGU+IFQqIHNldF9jaHJv
bWVfaGlzdG9ncmFtX3NhbXBsZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDI4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lTGF0ZW5jeUluZm8+
IFQqIHNldF9jaHJvbWVfbGF0ZW5jeV9pbmZvKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oMjkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDaHJvbWVGcmFt
ZVJlcG9ydGVyPiBUKiBzZXRfY2hyb21lX2ZyYW1lX3JlcG9ydGVyKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzIpOworICB9CisKKyAgdm9pZCBzZXRfdGltZXN0YW1wX2Rl
bHRhX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3RpbWVzdGFtcF9hYnNvbHV0ZV91cyhpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDE2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGhyZWFkX3RpbWVfZGVs
dGFfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfdGhyZWFkX3RpbWVfYWJzb2x1dGVfdXMoaW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RocmVhZF9pbnN0cnVj
dGlvbl9jb3VudF9kZWx0YShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDgsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF90aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnRfYWJzb2x1dGUo
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyMCwgdmFsdWUpOworICB9CisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudD4gVCogc2V0X2xlZ2Fj
eV9ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDYpOworICB9CisK
K307CisKK2NsYXNzIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xOSwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBUcmFja0V2ZW50
X0xlZ2FjeUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNrRXZlbnRfTGVn
YWN5RXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWVfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG5hbWVfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19waGFzZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBoYXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2R1cmF0aW9uX3VzKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgZHVyYXRpb25fdXMoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfdGhyZWFkX2R1cmF0aW9uX3VzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGhyZWFkX2R1cmF0
aW9uX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X3RocmVhZF9pbnN0cnVjdGlvbl9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE1PigpLnZhbGlk
KCk7IH0KKyAgaW50NjRfdCB0aHJlYWRfaW5zdHJ1Y3Rpb25fZGVsdGEoKSBjb25zdCB7IHJldHVy
biBhdDwxNT4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3Vuc2NvcGVkX2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHVuc2NvcGVkX2lkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19sb2NhbF9pZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbG9jYWxfaWQo
KSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19nbG9i
YWxfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGds
b2JhbF9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2lkX3Njb3BlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdENoYXJzIGlkX3Njb3BlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19z
dHJpbmcoKTsgfQorICBib29sIGhhc191c2VfYXN5bmNfdHRzKCkgY29uc3QgeyByZXR1cm4gYXQ8
OT4oKS52YWxpZCgpOyB9CisgIGJvb2wgdXNlX2FzeW5jX3R0cygpIGNvbnN0IHsgcmV0dXJuIGF0
PDk+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2JpbmRfaWQoKSBjb25zdCB7IHJldHVybiBh
dDw4PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYmluZF9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDg+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYmluZF90b19lbmNsb3NpbmcoKSBjb25z
dCB7IHJldHVybiBhdDwxMj4oKS52YWxpZCgpOyB9CisgIGJvb2wgYmluZF90b19lbmNsb3Npbmco
KSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfZmxvd19k
aXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBhdDwxMz4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
Zmxvd19kaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBhdDwxMz4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX2luc3RhbnRfZXZlbnRfc2NvcGUoKSBjb25zdCB7IHJldHVybiBhdDwxND4oKS52
YWxpZCgpOyB9CisgIGludDMyX3QgaW5zdGFudF9ldmVudF9zY29wZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE0PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGlkX292ZXJyaWRlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTg+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBpZF9vdmVycmlkZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE4PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGlkX292ZXJy
aWRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHRpZF9v
dmVycmlkZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE5PigpLmFzX2ludDMyKCk7IH0KK307CisKK2Ns
YXNzIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ug
eworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lSWlkRmllbGROdW1iZXIgPSAxLAor
ICAgIGtQaGFzZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrRHVyYXRpb25Vc0ZpZWxkTnVtYmVyID0g
MywKKyAgICBrVGhyZWFkRHVyYXRpb25Vc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrVGhyZWFkSW5z
dHJ1Y3Rpb25EZWx0YUZpZWxkTnVtYmVyID0gMTUsCisgICAga1Vuc2NvcGVkSWRGaWVsZE51bWJl
ciA9IDYsCisgICAga0xvY2FsSWRGaWVsZE51bWJlciA9IDEwLAorICAgIGtHbG9iYWxJZEZpZWxk
TnVtYmVyID0gMTEsCisgICAga0lkU2NvcGVGaWVsZE51bWJlciA9IDcsCisgICAga1VzZUFzeW5j
VHRzRmllbGROdW1iZXIgPSA5LAorICAgIGtCaW5kSWRGaWVsZE51bWJlciA9IDgsCisgICAga0Jp
bmRUb0VuY2xvc2luZ0ZpZWxkTnVtYmVyID0gMTIsCisgICAga0Zsb3dEaXJlY3Rpb25GaWVsZE51
bWJlciA9IDEzLAorICAgIGtJbnN0YW50RXZlbnRTY29wZUZpZWxkTnVtYmVyID0gMTQsCisgICAg
a1BpZE92ZXJyaWRlRmllbGROdW1iZXIgPSAxOCwKKyAgICBrVGlkT3ZlcnJpZGVGaWVsZE51bWJl
ciA9IDE5LAorICB9OworICB1c2luZyBGbG93RGlyZWN0aW9uID0gOjpwZXJmZXR0bzo6cHJvdG9z
OjpwYnplcm86OlRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbjsKKyAgdXNpbmcg
SW5zdGFudEV2ZW50U2NvcGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVu
dF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZTsKKyAgc3RhdGljIGNvbnN0IEZsb3dEaXJl
Y3Rpb24gRkxPV19VTlNQRUNJRklFRCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVj
dGlvbl9GTE9XX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgRmxvd0RpcmVjdGlvbiBGTE9X
X0lOID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX0ZMT1dfSU47CisgIHN0
YXRpYyBjb25zdCBGbG93RGlyZWN0aW9uIEZMT1dfT1VUID0gVHJhY2tFdmVudF9MZWdhY3lFdmVu
dF9GbG93RGlyZWN0aW9uX0ZMT1dfT1VUOworICBzdGF0aWMgY29uc3QgRmxvd0RpcmVjdGlvbiBG
TE9XX0lOT1VUID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX0ZMT1dfSU5P
VVQ7CisgIHN0YXRpYyBjb25zdCBJbnN0YW50RXZlbnRTY29wZSBTQ09QRV9VTlNQRUNJRklFRCA9
IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVU5TUEVDSUZJ
RUQ7CisgIHN0YXRpYyBjb25zdCBJbnN0YW50RXZlbnRTY29wZSBTQ09QRV9HTE9CQUwgPSBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX0dMT0JBTDsKKyAgc3Rh
dGljIGNvbnN0IEluc3RhbnRFdmVudFNjb3BlIFNDT1BFX1BST0NFU1MgPSBUcmFja0V2ZW50X0xl
Z2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX1BST0NFU1M7CisgIHN0YXRpYyBjb25z
dCBJbnN0YW50RXZlbnRTY29wZSBTQ09QRV9USFJFQUQgPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50
X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX1RIUkVBRDsKKyAgdm9pZCBzZXRfbmFtZV9paWQodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3BoYXNlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2R1cmF0aW9uX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RocmVhZF9kdXJhdGlvbl91cyhpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF90aHJlYWRfaW5zdHJ1Y3Rpb25fZGVsdGEoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Vuc2NvcGVkX2lkKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sb2Nh
bF9pZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMCwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2dsb2JhbF9pZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgxMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lkX3Njb3BlKGNvbnN0IHN0ZDo6c3RyaW5n
JiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDcsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgfQorICB2b2lkIHNldF9pZF9zY29wZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDcsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3Vz
ZV9hc3luY190dHMoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoOSwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X2JpbmRfaWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2JpbmRfdG9fZW5jbG9zaW5nKGJvb2wg
dmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfZmxvd19kaXJlY3Rpb24oOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnRf
TGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbiB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQo
MTMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbnN0YW50X2V2ZW50X3Njb3BlKDo6cGVyZmV0
dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNj
b3BlIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxNCwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3BpZF9vdmVycmlkZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE4
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGlkX292ZXJyaWRlKGludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMTksIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2Uu
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1
YXJkLgorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQ
cm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9u
IDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2Vw
dCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNv
cHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9s
aWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxl
IGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBX
SVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJl
c3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1
YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBM
aWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFM
X1RSQUNLX0VWRU5UX0lOVEVSTkFMX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lO
R19JTlRFUk5BTF9UUkFDS19FVkVOVF9JTlRFUk5BTF9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2ZsYXRfc2V0LmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVk
X2hlYXBfYnVmZmVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by90cmFjaW5nL2NvcmUvZm9yd2FyZF9kZWNscy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9kZWJ1Z19hbm5vdGF0aW9uLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5n
L3RyYWNlX3dyaXRlcl9iYXNlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNrLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29tbW9uL2J1aWx0aW5fY2xvY2sucGJ6ZXJv
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0
dG8vdHJhY2UvaW50ZXJuZWRfZGF0YS9pbnRlcm5lZF9kYXRhLnBiemVyby5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNr
X2V2ZW50L3RyYWNrX2V2ZW50LnBiemVyby5oIgorCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4K
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK2NsYXNzIEV2ZW50Q29udGV4dDsKK3N0cnVjdCBDYXRl
Z29yeTsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIGdlbiB7CitjbGFzcyBUcmFja0V2
ZW50Q29uZmlnOworfSAgLy8gbmFtZXNwYWNlIGdlbgorbmFtZXNwYWNlIHBiemVybyB7CitjbGFz
cyBEZWJ1Z0Fubm90YXRpb247Cit9ICAvLyBuYW1lc3BhY2UgcGJ6ZXJvCit9ICAvLyBuYW1lc3Bh
Y2UgcHJvdG9zCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBUcmFja0V2ZW50Q2F0ZWdv
cnlSZWdpc3RyeTsKKworY2xhc3MgQmFzZVRyYWNrRXZlbnRJbnRlcm5lZERhdGFJbmRleCB7Cisg
cHVibGljOgorICB2aXJ0dWFsIH5CYXNlVHJhY2tFdmVudEludGVybmVkRGF0YUluZGV4KCk7CisK
KyNpZiBQRVJGRVRUT19EQ0hFQ0tfSVNfT04oKQorICBjb25zdCBjaGFyKiB0eXBlX2lkXyA9IG51
bGxwdHI7CisjZW5kaWYgIC8vIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCit9OworCitzdHJ1Y3Qg
VHJhY2tFdmVudEluY3JlbWVudGFsU3RhdGUgeworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBr
TWF4SW50ZXJuZWREYXRhRmllbGRzID0gMzI7CisKKyAgYm9vbCB3YXNfY2xlYXJlZCA9IHRydWU7
CisKKyAgLy8gQSBoZWFwLWFsbG9jYXRlZCBtZXNzYWdlIGZvciBzdG9yaW5nIG5ld2x5IHNlZW4g
aW50ZXJuZWQgZGF0YSB3aGlsZSB3ZSBhcmUKKyAgLy8gaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5n
IGEgdHJhY2sgZXZlbnQuIFdoZW4gYSB0cmFjayBldmVudCB3YW50cyB0byB3cml0ZQorICAvLyBu
ZXcgaW50ZXJuZWQgZGF0YSBpbnRvIHRoZSB0cmFjZSwgaXQgaXMgZmlyc3Qgc2VyaWFsaXplZCBp
bnRvIHRoaXMgbWVzc2FnZQorICAvLyBhbmQgdGhlbiBmbHVzaGVkIHRvIHRoZSByZWFsIHRyYWNl
IGluIEV2ZW50Q29udGV4dCB3aGVuIHRoZSBwYWNrZXQgZW5kcy4KKyAgLy8gVGhlIG1lc3NhZ2Ug
aXMgY2FjaGVkIGhlcmUgYXMgYSBwYXJ0IG9mIGluY3JlbWVudGFsIHN0YXRlIHNvIHRoYXQgd2Ug
Y2FuCisgIC8vIHJldXNlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhbGxvY2F0aW9uIGZvciBzdWJz
ZXF1ZW50bHkgd3JpdHRlbiBpbnRlcm5lZAorICAvLyBkYXRhLgorICBwcm90b3plcm86OkhlYXBC
dWZmZXJlZDxwcm90b3M6OnBiemVybzo6SW50ZXJuZWREYXRhPgorICAgICAgc2VyaWFsaXplZF9p
bnRlcm5lZF9kYXRhOworCisgIC8vIEluLW1lbW9yeSBpbmRpY2VzIGZvciBsb29raW5nIHVwIGlu
dGVybmVkIGRhdGEgaWRzLgorICAvLyBGb3IgZWFjaCBpbnRlcm4tYWJsZSBmaWVsZCAodXAgdG8g
YSBtYXggb2YgMzIpIHdlIGtlZXAgYSBkaWN0aW9uYXJ5IG9mCisgIC8vIGZpZWxkLXZhbHVlIC0+
IGludGVybmluZy1rZXkuIERlcGVuZGluZyBvbiB0aGUgdHlwZSB3ZSBlaXRoZXIga2VlcCB0aGUg
ZnVsbAorICAvLyB2YWx1ZSBvciBhIGhhc2ggb2YgaXQgKFNlZSB0cmFja19ldmVudF9pbnRlcm5l
ZF9kYXRhX2luZGV4LmgpCisgIHVzaW5nIEludGVybmVkRGF0YUluZGV4ID0KKyAgICAgIHN0ZDo6
cGFpcjwvKiBpbnRlcm5lZF9kYXRhLnByb3RvIGZpZWxkIG51bWJlciAqLyBzaXplX3QsCisgICAg
ICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2VUcmFja0V2ZW50SW50ZXJuZWREYXRhSW5k
ZXg+PjsKKyAgc3RkOjphcnJheTxJbnRlcm5lZERhdGFJbmRleCwga01heEludGVybmVkRGF0YUZp
ZWxkcz4gaW50ZXJuZWRfZGF0YV9pbmRpY2VzID0KKyAgICAgIHt9OworCisgIC8vIFRyYWNrIHV1
aWRzIGZvciB3aGljaCB3ZSBoYXZlIHdyaXR0ZW4gZGVzY3JpcHRvcnMgaW50byB0aGUgdHJhY2Uu
IElmIGEKKyAgLy8gdHJhY2UgZXZlbnQgdXNlcyBhIHRyYWNrIHdoaWNoIGlzIG5vdCBpbiB0aGlz
IHNldCwgd2UnbGwgd3JpdGUgb3V0IGEKKyAgLy8gZGVzY3JpcHRvciBmb3IgaXQuCisgIGJhc2U6
OkZsYXRTZXQ8dWludDY0X3Q+IHNlZW5fdHJhY2tzOworCisgIC8vIER5bmFtaWNhbGx5IHJlZ2lz
dGVyZWQgY2F0ZWdvcnkgbmFtZXMgdGhhdCBoYXZlIGJlZW4gZW5jb3VudGVyZWQgZHVyaW5nCisg
IC8vIHRoaXMgdHJhY2luZyBzZXNzaW9uLiBUaGUgdmFsdWUgaW4gdGhlIG1hcCBpbmRpY2F0ZXMg
d2hldGhlciB0aGUgY2F0ZWdvcnkKKyAgLy8gaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgc3Rk
Ojp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBkeW5hbWljX2NhdGVnb3JpZXM7Cit9
OworCisvLyBUaGUgYmFja2VuZCBwb3J0aW9uIG9mIHRoZSB0cmFjayBldmVudCB0cmFjZSBwb2lu
dCBpbXBsZW1lbnRpb24uIE91dGxpbmVkIHRvCisvLyBhIHNlcGFyYXRlIC5jYyBmaWxlIHNvIGl0
IGNhbiBiZSBzaGFyZWQgYnkgZGlmZmVyZW50IHRyYWNrIGV2ZW50IGNhdGVnb3J5CisvLyBuYW1l
c3BhY2VzLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNrRXZlbnRJbnRlcm5hbCB7CisgcHVi
bGljOgorICBzdGF0aWMgYm9vbCBJbml0aWFsaXplKAorICAgICAgY29uc3QgVHJhY2tFdmVudENh
dGVnb3J5UmVnaXN0cnkmLAorICAgICAgYm9vbCAoKnJlZ2lzdGVyX2RhdGFfc291cmNlKShjb25z
dCBEYXRhU291cmNlRGVzY3JpcHRvciYpKTsKKworICBzdGF0aWMgdm9pZCBFbmFibGVUcmFjaW5n
KGNvbnN0IFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5JiByZWdpc3RyeSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBwcm90b3M6Omdlbjo6VHJhY2tFdmVudENvbmZpZyYgY29u
ZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluc3RhbmNlX2luZGV4
KTsKKyAgc3RhdGljIHZvaWQgRGlzYWJsZVRyYWNpbmcoY29uc3QgVHJhY2tFdmVudENhdGVnb3J5
UmVnaXN0cnkmIHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJf
dCBpbnN0YW5jZV9pbmRleCk7CisgIHN0YXRpYyBib29sIElzQ2F0ZWdvcnlFbmFibGVkKGNvbnN0
IFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5JiByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgcHJvdG9zOjpnZW46OlRyYWNrRXZlbnRDb25maWcmIGNvbmZp
ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2F0ZWdvcnkmIGNhdGVn
b3J5KTsKKworICBzdGF0aWMgcGVyZmV0dG86OkV2ZW50Q29udGV4dCBXcml0ZUV2ZW50KAorICAg
ICAgVHJhY2VXcml0ZXJCYXNlKiwKKyAgICAgIFRyYWNrRXZlbnRJbmNyZW1lbnRhbFN0YXRlKiwK
KyAgICAgIGNvbnN0IENhdGVnb3J5KiBjYXRlZ29yeSwKKyAgICAgIGNvbnN0IGNoYXIqIG5hbWUs
CisgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUsCisgICAg
ICB1aW50NjRfdCB0aW1lc3RhbXAgPSBHZXRUaW1lTnMoKSk7CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQ+CisgIHN0YXRpYyB2b2lkIEFkZERlYnVnQW5ub3RhdGlvbihwZXJmZXR0bzo6RXZlbnRD
b250ZXh0KiBldmVudF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCYmIHZhbHVl
KSB7CisgICAgYXV0byBhbm5vdGF0aW9uID0gQWRkRGVidWdBbm5vdGF0aW9uKGV2ZW50X2N0eCwg
bmFtZSk7CisgICAgV3JpdGVEZWJ1Z0Fubm90YXRpb24oYW5ub3RhdGlvbiwgdmFsdWUpOworICB9
CisKKyAgLy8gSWYgdGhlIGdpdmVuIHRyYWNrIGhhc24ndCBiZWVuIHNlZW4gYnkgdGhlIHRyYWNl
IHdyaXRlciB5ZXQsIHdyaXRlIGEKKyAgLy8gZGVzY3JpcHRvciBmb3IgaXQgaW50byB0aGUgdHJh
Y2UuIERvZXNuJ3QgdGFrZSBhIGxvY2sgdW5sZXNzIHRoZSB0cmFjaworICAvLyBkZXNjcmlwdG9y
IGlzIG5ldy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRyYWNrVHlwZT4KKyAgc3RhdGljIHZvaWQg
V3JpdGVUcmFja0Rlc2NyaXB0b3JJZk5lZWRlZCgKKyAgICAgIGNvbnN0IFRyYWNrVHlwZSYgdHJh
Y2ssCisgICAgICBUcmFjZVdyaXRlckJhc2UqIHRyYWNlX3dyaXRlciwKKyAgICAgIFRyYWNrRXZl
bnRJbmNyZW1lbnRhbFN0YXRlKiBpbmNyX3N0YXRlKSB7CisgICAgYXV0byBpdF9hbmRfaW5zZXJ0
ZWQgPSBpbmNyX3N0YXRlLT5zZWVuX3RyYWNrcy5pbnNlcnQodHJhY2sudXVpZCk7CisgICAgaWYg
KFBFUkZFVFRPX0xJS0VMWSghaXRfYW5kX2luc2VydGVkLnNlY29uZCkpCisgICAgICByZXR1cm47
CisgICAgV3JpdGVUcmFja0Rlc2NyaXB0b3IodHJhY2ssIHRyYWNlX3dyaXRlcik7CisgIH0KKwor
ICAvLyBVbmNvbmRpdGlvbmFsbHkgd3JpdGUgYSB0cmFjayBkZXNjcmlwdG9yIGludG8gdGhlIHRy
YWNlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhY2tUeXBlPgorICBzdGF0aWMgdm9pZCBXcml0
ZVRyYWNrRGVzY3JpcHRvcihjb25zdCBUcmFja1R5cGUmIHRyYWNrLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBUcmFjZVdyaXRlckJhc2UqIHRyYWNlX3dyaXRlcikgeworICAg
IFRyYWNrUmVnaXN0cnk6OkdldCgpLT5TZXJpYWxpemVUcmFjaygKKyAgICAgICAgdHJhY2ssIE5l
d1RyYWNlUGFja2V0KHRyYWNlX3dyaXRlciwgR2V0VGltZU5zKCkpKTsKKyAgfQorCisgIC8vIEdl
dCB0aGUgY3VycmVudCB0aW1lIGluIG5hbm9zZWNvbmRzIGluIHRoZSB0cmFjZSBjbG9jayB0aW1l
YmFzZS4KKyAgc3RhdGljIHVpbnQ2NF90IEdldFRpbWVOcygpOworCisgIC8vIEdldCB0aGUgY2xv
Y2sgdXNlZCBieSBHZXRUaW1lTnMoKS4KKyAgc3RhdGljIGNvbnN0ZXhwciBwcm90b3M6OnBiemVy
bzo6QnVpbHRpbkNsb2NrIEdldENsb2NrSWQoKSB7CisjaWYgIVBFUkZFVFRPX0JVSUxERkxBRyhQ
RVJGRVRUT19PU19NQUNPU1gpICYmIFwKKyAgICAhUEVSRkVUVE9fQlVJTERGTEFHKFBFUkZFVFRP
X09TX1dJTikKKyAgICByZXR1cm4gcHJvdG9zOjpwYnplcm86OkJVSUxUSU5fQ0xPQ0tfQk9PVFRJ
TUU7CisjZWxzZQorICAgIHJldHVybiBwcm90b3M6OnBiemVybzo6QlVJTFRJTl9DTE9DS19NT05P
VE9OSUM7CisjZW5kaWYKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgUmVzZXRJbmNy
ZW1lbnRhbFN0YXRlKFRyYWNlV3JpdGVyQmFzZSosIHVpbnQ2NF90IHRpbWVzdGFtcCk7CisgIHN0
YXRpYyBwcm90b3plcm86Ok1lc3NhZ2VIYW5kbGU8cHJvdG9zOjpwYnplcm86OlRyYWNlUGFja2V0
PiBOZXdUcmFjZVBhY2tldCgKKyAgICAgIFRyYWNlV3JpdGVyQmFzZSosCisgICAgICB1aW50NjRf
dCB0aW1lc3RhbXAsCisgICAgICB1aW50MzJfdCBzZXFfZmxhZ3MgPQorICAgICAgICAgIHByb3Rv
czo6cGJ6ZXJvOjpUcmFjZVBhY2tldDo6U0VRX05FRURTX0lOQ1JFTUVOVEFMX1NUQVRFKTsKKyAg
c3RhdGljIHByb3Rvczo6cGJ6ZXJvOjpEZWJ1Z0Fubm90YXRpb24qIEFkZERlYnVnQW5ub3RhdGlv
bigKKyAgICAgIHBlcmZldHRvOjpFdmVudENvbnRleHQqLAorICAgICAgY29uc3QgY2hhciogbmFt
ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwZXJm
ZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9UUkFD
S19FVkVOVF9JTlRFUk5BTF9IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9p
ZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBM
aWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2Ug
dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3Ug
bWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93
d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJl
ZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAq
IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJ
UyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lO
RCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhl
IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19U
UkFDSU5HX0VWRU5UX0NPTlRFWFRfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5H
X0VWRU5UX0NPTlRFWFRfSF8KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2VfaGFuZGxlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFsL3RyYWNrX2V2
ZW50X2ludGVybmFsLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
cm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2VfcGFja2V0LnBiemVyby5oIgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIFRyYWNrRXZlbnRJbnRlcm5h
bDsKK30KKworLy8gQWxsb3dzIGFkZGluZyBjdXN0b20gYXJndW1lbnRzIGludG8gdHJhY2sgZXZl
bnRzLiBFeGFtcGxlOgorLy8KKy8vICAgVFJBQ0VfRVZFTlRfQkVHSU4oImNhdGVnb3J5IiwgIlRp
dGxlIiwKKy8vICAgICAgICAgICAgICAgICAgICAgW10ocGVyZmV0dG86OkV2ZW50Q29udGV4dCBj
dHgpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICBhdXRvKiBkYmcgPSBjdHguZXZlbnQoKS0+
YWRkX2RlYnVnX2Fubm90YXRpb25zKCk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgZGJnLT5z
ZXRfbmFtZSgibmFtZSIpOworLy8gICAgICAgICAgICAgICAgICAgICAgIGRiZy0+c2V0X2ludF92
YWx1ZSgxMjM0KTsKKy8vICAgICAgICAgICAgICAgICAgICAgfSk7CisvLworY2xhc3MgUEVSRkVU
VE9fRVhQT1JUIEV2ZW50Q29udGV4dCB7CisgcHVibGljOgorICBFdmVudENvbnRleHQoRXZlbnRD
b250ZXh0JiYpID0gZGVmYXVsdDsKKworICAvLyBGb3IgQ2hyb21pdW0gZHVyaW5nIHRoZSB0cmFu
c2l0aW9uIHBoYXNlIHRvIHRoZSBjbGllbnQgbGlicmFyeS4KKyAgLy8gVE9ETyhlc2Vja2xlcik6
IFJlbW92ZSBvbmNlIENocm9taXVtIGhhcyBzd2l0Y2hlZCB0byBjbGllbnQgbGliIGVudGlyZWx5
LgorICBleHBsaWNpdCBFdmVudENvbnRleHQocHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQqIGV2
ZW50KQorICAgICAgOiBldmVudF8oZXZlbnQpLCBpbmNyZW1lbnRhbF9zdGF0ZV8obnVsbHB0cikg
e30KKworICB+RXZlbnRDb250ZXh0KCk7CisKKyAgcHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQq
IGV2ZW50KCkgY29uc3QgeyByZXR1cm4gZXZlbnRfOyB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0
ZSA8dHlwZW5hbWUsIHNpemVfdCwgdHlwZW5hbWUsIHR5cGVuYW1lPgorICBmcmllbmQgY2xhc3Mg
VHJhY2tFdmVudEludGVybmVkRGF0YUluZGV4OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRy
YWNrRXZlbnRJbnRlcm5hbDsKKworICB1c2luZyBUcmFjZVBhY2tldEhhbmRsZSA9CisgICAgICA6
OnByb3RvemVybzo6TWVzc2FnZUhhbmRsZTxwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXQ+Owor
CisgIEV2ZW50Q29udGV4dChUcmFjZVBhY2tldEhhbmRsZSwgaW50ZXJuYWw6OlRyYWNrRXZlbnRJ
bmNyZW1lbnRhbFN0YXRlKik7CisgIEV2ZW50Q29udGV4dChjb25zdCBFdmVudENvbnRleHQmKSA9
IGRlbGV0ZTsKKworICBUcmFjZVBhY2tldEhhbmRsZSB0cmFjZV9wYWNrZXRfOworICBwcm90b3M6
OnBiemVybzo6VHJhY2tFdmVudCogZXZlbnRfOworICBpbnRlcm5hbDo6VHJhY2tFdmVudEluY3Jl
bWVudGFsU3RhdGUqIGluY3JlbWVudGFsX3N0YXRlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBw
ZXJmZXR0bworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19FVkVOVF9DT05U
RVhUX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRv
L3RyYWNpbmcvdHJhY2tfZXZlbnRfY2F0ZWdvcnlfcmVnaXN0cnkuaAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5z
ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7
CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgg
dGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQK
KyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAor
ICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4g
d3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRp
c3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1Ig
Q09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNl
ZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNz
aW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5k
ZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNLX0VWRU5UX0NBVEVHT1JZX1JFR0lTVFJZ
X0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19FVkVOVF9DQVRFR09S
WV9SRUdJU1RSWV9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by90cmFjaW5nL2RhdGFfc291cmNlLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwor
I2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworY2xhc3MgRHluYW1pY0NhdGVnb3J5OworCisvLyBBIGNvbXBpbGUtdGltZSByZXByZXNl
bnRhdGlvbiBvZiBhIHRyYWNrIGV2ZW50IGNhdGVnb3J5LiBTZWUKKy8vIFBFUkZFVFRPX0RFRklO
RV9DQVRFR09SSUVTIGZvciByZWdpc3RlcmluZyB5b3VyIG93biBjYXRlZ29yaWVzLgorc3RydWN0
IFBFUkZFVFRPX0VYUE9SVCBDYXRlZ29yeSB7CisgIHVzaW5nIFRhZ3MgPSBzdGQ6OmFycmF5PGNv
bnN0IGNoYXIqLCA0PjsKKworICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gbnVsbHB0cjsKKyAg
Y29uc3QgY2hhciogY29uc3QgZGVzY3JpcHRpb24gPSBudWxscHRyOworICBjb25zdCBUYWdzIHRh
Z3MgPSB7fTsKKworICBjb25zdGV4cHIgQ2F0ZWdvcnkoY29uc3QgQ2F0ZWdvcnkmKSA9IGRlZmF1
bHQ7CisgIGNvbnN0ZXhwciBleHBsaWNpdCBDYXRlZ29yeShjb25zdCBjaGFyKiBuYW1lXykKKyAg
ICAgIDogbmFtZShDaGVja0lzVmFsaWRDYXRlZ29yeShuYW1lXykpLAorICAgICAgICBuYW1lX3Np
emVzXyhDb21wdXRlTmFtZVNpemVzKG5hbWVfKSkge30KKworICBjb25zdGV4cHIgQ2F0ZWdvcnkg
U2V0RGVzY3JpcHRpb24oY29uc3QgY2hhciogZGVzY3JpcHRpb25fKSBjb25zdCB7CisgICAgcmV0
dXJuIENhdGVnb3J5KG5hbWUsIGRlc2NyaXB0aW9uXywgdGFncywgbmFtZV9zaXplc18pOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgIGNvbnN0ZXhwciBDYXRlZ29yeSBT
ZXRUYWdzKEFyZ3MmJi4uLiBhcmdzKSBjb25zdCB7CisgICAgcmV0dXJuIENhdGVnb3J5KG5hbWUs
IGRlc2NyaXB0aW9uLCB7c3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4ufSwKKyAgICAgICAgICAg
ICAgICAgICAgbmFtZV9zaXplc18pOworICB9CisKKyAgLy8gQSBjb21tYSBzZXBhcmF0ZWQgbGlz
dCBvZiBtdWx0aXBsZSBjYXRlZ29yaWVzIHRvIGJlIHVzZWQgaW4gYSBzaW5nbGUgdHJhY2UKKyAg
Ly8gcG9pbnQuCisgIHN0YXRpYyBjb25zdGV4cHIgQ2F0ZWdvcnkgR3JvdXAoY29uc3QgY2hhciog
bmFtZXMpIHsKKyAgICByZXR1cm4gQ2F0ZWdvcnkobmFtZXMsIEFsbG93R3JvdXB7fSk7CisgIH0K
KworICAvLyBVc2VkIGZvciBwYXJzaW5nIGR5bmFtaWMgY2F0ZWdvcnkgZ3JvdXBzLiBOb3RlIHRo
YXQgfG5hbWV8IGFuZAorICAvLyB8RHluYW1pY0NhdGVnb3J5fCBtdXN0IG91dGxpdmUgdGhlIHJl
dHVybmVkIG9iamVjdCBiZWNhdXNlIHRoZSBjYXRlZ29yeQorICAvLyBuYW1lIGlzbid0IGNvcGll
ZC4KKyAgc3RhdGljIENhdGVnb3J5IEZyb21EeW5hbWljQ2F0ZWdvcnkoY29uc3QgY2hhciogbmFt
ZSk7CisgIHN0YXRpYyBDYXRlZ29yeSBGcm9tRHluYW1pY0NhdGVnb3J5KGNvbnN0IER5bmFtaWND
YXRlZ29yeSYpOworCisgIGNvbnN0ZXhwciBib29sIElzR3JvdXAoKSBjb25zdCB7IHJldHVybiBH
ZXROYW1lU2l6ZSgxKSA+IDA7IH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFj
dGVyIGluIHRoZSBjYXRlZ29yeSBuYW1lLiBOb3QgdmFsaWQgZm9yCisgIC8vIGNhdGVnb3J5IGdy
b3Vwcy4KKyAgc2l6ZV90IG5hbWVfc2l6ZSgpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0so
IUlzR3JvdXAoKSk7CisgICAgcmV0dXJuIEdldE5hbWVTaXplKDApOworICB9CisKKyAgLy8gSXRl
cmF0ZXMgb3ZlciBhbGwgdGhlIG1lbWJlcnMgb2YgdGhpcyBjYXRlZ29yeSBncm91cCwgb3IganVz
dCB0aGUgbmFtZSBvZgorICAvLyB0aGUgY2F0ZWdvcnkgaXRzZWxmIGlmIHRoaXMgaXNuJ3QgYSBj
YXRlZ29yeSBncm91cC4gUmV0dXJuIGZhbHNlIGZyb20KKyAgLy8gfGNhbGxiYWNrfCB0byBzdG9w
IGl0ZXJhdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgRm9yRWFjaEdyb3Vw
TWVtYmVyKFQgY2FsbGJhY2spIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lX3B0ciA9IG5h
bWU7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChzaXplX3QgbmFtZV9zaXplID0gR2V0
TmFtZVNpemUoaSsrKSkgeworICAgICAgaWYgKCFjYWxsYmFjayhuYW1lX3B0ciwgbmFtZV9zaXpl
KSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuYW1lX3B0ciArPSBuYW1lX3NpemUgKyAxOworICAg
IH0KKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heEdyb3Vw
U2l6ZSA9IDQ7CisgIHVzaW5nIE5hbWVTaXplcyA9IHN0ZDo6YXJyYXk8dWludDhfdCwga01heEdy
b3VwU2l6ZT47CisKKyAgY29uc3RleHByIENhdGVnb3J5KGNvbnN0IGNoYXIqIG5hbWVfLAorICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb25fLAorICAgICAgICAgICAg
ICAgICAgICAgVGFncyB0YWdzXywKKyAgICAgICAgICAgICAgICAgICAgIE5hbWVTaXplcyBuYW1l
X3NpemVzKQorICAgICAgOiBuYW1lKG5hbWVfKSwKKyAgICAgICAgZGVzY3JpcHRpb24oZGVzY3Jp
cHRpb25fKSwKKyAgICAgICAgdGFncyh0YWdzXyksCisgICAgICAgIG5hbWVfc2l6ZXNfKG5hbWVf
c2l6ZXMpIHt9CisKKyAgZW51bSBBbGxvd0dyb3VwIHt9OworICBjb25zdGV4cHIgQ2F0ZWdvcnko
Y29uc3QgY2hhciogbmFtZV8sIEFsbG93R3JvdXApCisgICAgICA6IG5hbWUoQ2hlY2tJc1ZhbGlk
Q2F0ZWdvcnlHcm91cChuYW1lXykpLAorICAgICAgICBuYW1lX3NpemVzXyhDb21wdXRlTmFtZVNp
emVzKG5hbWVfKSkge30KKworICBjb25zdGV4cHIgc2l6ZV90IEdldE5hbWVTaXplKHNpemVfdCBp
KSBjb25zdCB7CisgICAgcmV0dXJuIGkgPCBuYW1lX3NpemVzXy5zaXplKCkgPyBuYW1lX3NpemVz
X1tpXSA6IDA7CisgIH0KKworICBzdGF0aWMgY29uc3RleHByIE5hbWVTaXplcyBDb21wdXRlTmFt
ZVNpemVzKGNvbnN0IGNoYXIqIHMpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KGtNYXhHcm91cFNpemUg
PT0gNCwgIlVuZXhwZWN0ZWQgbWF4aW11bSBjYXRlZ29yeSBncm91cCBzaXplIik7CisgICAgcmV0
dXJuIE5hbWVTaXplc3t7c3RhdGljX2Nhc3Q8dWludDhfdD4oR2V0TnRoTmFtZVNpemUoMCwgcywg
cykpLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEdldE50aE5h
bWVTaXplKDEsIHMsIHMpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50
OF90PihHZXROdGhOYW1lU2l6ZSgyLCBzLCBzKSksCisgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8dWludDhfdD4oR2V0TnRoTmFtZVNpemUoMywgcywgcykpfX07CisgIH0KKworICBz
dGF0aWMgY29uc3RleHByIHB0cmRpZmZfdCBHZXROdGhOYW1lU2l6ZShpbnQgbiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RhcnQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVu
ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50
ZXIgPSAwKSB7CisgICAgcmV0dXJuICghKmVuZCB8fCAqZW5kID09ICcsJykKKyAgICAgICAgICAg
ICAgID8gKCghKmVuZCB8fCBjb3VudGVyID09IG4pCisgICAgICAgICAgICAgICAgICAgICAgPyAo
Y291bnRlciA9PSBuID8gZW5kIC0gc3RhcnQgOiAwKQorICAgICAgICAgICAgICAgICAgICAgIDog
R2V0TnRoTmFtZVNpemUobiwgZW5kICsgMSwgZW5kICsgMSwgY291bnRlciArIDEpKQorICAgICAg
ICAgICAgICAgOiBHZXROdGhOYW1lU2l6ZShuLCBzdGFydCwgZW5kICsgMSwgY291bnRlcik7Cisg
IH0KKworICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIENoZWNrSXNWYWxpZENhdGVnb3J5
KGNvbnN0IGNoYXIqIG4pIHsKKyAgICAvLyBXZSBqdXN0IHJlcGxhY2UgaW52YWxpZCBpbnB1dCB3
aXRoIGEgbnVsbHB0ciBoZXJlOyBpdCB3aWxsIHRyaWdnZXIgYQorICAgIC8vIHN0YXRpYyBhc3Nl
cnQgaW4gVHJhY2tFdmVudENhdGVnb3J5UmVnaXN0cnk6OlZhbGlkYXRlQ2F0ZWdvcmllcygpLgor
ICAgIHJldHVybiBHZXROdGhOYW1lU2l6ZSgxLCBuLCBuKSA/IG51bGxwdHIgOiBuOworICB9CisK
KyAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBDaGVja0lzVmFsaWRDYXRlZ29yeUdyb3Vw
KGNvbnN0IGNoYXIqIG4pIHsKKyAgICAvLyBTYW1lIGFzIGFib3ZlOiByZXBsYWNlIGludmFsaWQg
aW5wdXQgd2l0aCBudWxscHRyLgorICAgIHJldHVybiAhR2V0TnRoTmFtZVNpemUoMSwgbiwgbikg
fHwgR2V0TnRoTmFtZVNpemUoa01heEdyb3VwU2l6ZSwgbiwgbikKKyAgICAgICAgICAgICAgID8g
bnVsbHB0cgorICAgICAgICAgICAgICAgOiBuOworICB9CisKKyAgLy8gQW4gYXJyYXkgb2YgbGVu
Z3RocyBvZiB0aGUgZGlmZmVyZW50IG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5
LgorICAvLyBJZiB0aGlzIGNhdGVnb3J5IGRvZXNuJ3QgcmVwcmVzZW50IGEgZ3JvdXAgb2YgbXVs
dGlwbGUgY2F0ZWdvcmllcywgb25seSB0aGUKKyAgLy8gZmlyc3QgZWxlbWVudCBpcyBub24temVy
by4KKyAgY29uc3QgTmFtZVNpemVzIG5hbWVfc2l6ZXNfID0ge307Cit9OworCisvLyBEeW5hbWlj
YWxseSBjb25zdHJ1Y3RlZCBjYXRlZ29yeSBuYW1lcyBzaG91bGQgbWFya2VkIGFzIHN1Y2ggdGhy
b3VnaCB0aGlzCisvLyBjb250YWluZXIgdHlwZSB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IGZvciB0
cmFjZSBwb2ludHMgdG8gYWNjaWRlbnRhbGx5IHN0YXJ0CisvLyB1c2luZyBkeW5hbWljIGNhdGVn
b3JpZXMuIEV2ZW50cyB3aXRoIGR5bmFtaWMgY2F0ZWdvcmllcyB3aWxsIGFsd2F5cyBiZQorLy8g
c2xpZ2h0bHkgbW9yZSBleHBlbnNpdmUgdGhhbiByZWd1bGFyIGV2ZW50cywgc28gdXNlIHRoZW0g
c3BhcmluZ2x5LgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIER5bmFtaWNDYXRlZ29yeSBmaW5hbCB7
CisgcHVibGljOgorICBleHBsaWNpdCBEeW5hbWljQ2F0ZWdvcnkoY29uc3Qgc3RkOjpzdHJpbmcm
IG5hbWVfKSA6IG5hbWUobmFtZV8pIHt9CisgIGV4cGxpY2l0IER5bmFtaWNDYXRlZ29yeShjb25z
dCBjaGFyKiBuYW1lXykgOiBuYW1lKG5hbWVfKSB7fQorICBEeW5hbWljQ2F0ZWdvcnkoKSB7fQor
ICB+RHluYW1pY0NhdGVnb3J5KCkgPSBkZWZhdWx0OworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG5h
bWU7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjb25zdGV4cHIgY29uc3QgY2hhciog
TnVsbENhdGVnb3J5KGNvbnN0IGNoYXIqKSB7CisgIHJldHVybiBudWxscHRyOworfQorCitwZXJm
ZXR0bzo6RHluYW1pY0NhdGVnb3J5IE51bGxDYXRlZ29yeShjb25zdCBwZXJmZXR0bzo6RHluYW1p
Y0NhdGVnb3J5Jik7CisKK2NvbnN0ZXhwciBib29sIFN0cmluZ01hdGNoZXNQcmVmaXgoY29uc3Qg
Y2hhciogc3RyLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgcmV0dXJuICEqc3RyID8gISpwcmVm
aXgKKyAgICAgICAgICAgICAgIDogISpwcmVmaXggPyB0cnVlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgIDogKnN0ciAhPSAqcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ID8gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmdNYXRjaGVz
UHJlZml4KHN0ciArIDEsIHByZWZpeCArIDEpOworfQorCitjb25zdGV4cHIgYm9vbCBJc1N0cmlu
Z0luUHJlZml4TGlzdChjb25zdCBjaGFyKikgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBs
YXRlIDx0eXBlbmFtZS4uLiBBcmdzPgorY29uc3RleHByIGJvb2wgSXNTdHJpbmdJblByZWZpeExp
c3QoY29uc3QgY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgY2hhciogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
QXJncy4uLiBhcmdzKSB7CisgIHJldHVybiBTdHJpbmdNYXRjaGVzUHJlZml4KHN0ciwgcHJlZml4
KSB8fAorICAgICAgICAgSXNTdHJpbmdJblByZWZpeExpc3Qoc3RyLCBzdGQ6OmZvcndhcmQ8QXJn
cz4oYXJncykuLi4pOworfQorCisvLyBIb2xkcyBhbGwgdGhlIHJlZ2lzdGVyZWQgY2F0ZWdvcmll
cyBmb3Igb25lIGNhdGVnb3J5IG5hbWVzcGFjZS4gU2VlCisvLyBQRVJGRVRUT19ERUZJTkVfQ0FU
RUdPUklFUyBmb3IgYnVpbGRpbmcgdGhlIHJlZ2lzdHJ5LgorY2xhc3MgUEVSRkVUVE9fRVhQT1JU
IFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5IHsKKyBwdWJsaWM6CisgIGNvbnN0ZXhwciBUcmFj
a0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeShzaXplX3QgY2F0ZWdvcnlfY291bnQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXRlZ29yeSogY2F0ZWdvcmllcywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXRvbWljPHVpbnQ4
X3Q+KiBzdGF0ZV9zdG9yYWdlKQorICAgICAgOiBjYXRlZ29yaWVzXyhjYXRlZ29yaWVzKSwKKyAg
ICAgICAgY2F0ZWdvcnlfY291bnRfKGNhdGVnb3J5X2NvdW50KSwKKyAgICAgICAgc3RhdGVfc3Rv
cmFnZV8oc3RhdGVfc3RvcmFnZSkgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIHNpemVv
ZihzdGF0ZV9zdG9yYWdlWzBdLmxvYWQoKSkgKiA4ID49IGtNYXhEYXRhU291cmNlSW5zdGFuY2Vz
LAorICAgICAgICAiVGhlIGNhdGVnb3J5IHN0YXRlIG11c3QgaGF2ZSBlbm91Z2ggYml0cyBmb3Ig
YWxsIHBvc3NpYmxlIGRhdGEgc291cmNlICIKKyAgICAgICAgImluc3RhbmNlcyIpOworICB9CisK
KyAgc2l6ZV90IGNhdGVnb3J5X2NvdW50KCkgY29uc3QgeyByZXR1cm4gY2F0ZWdvcnlfY291bnRf
OyB9CisKKyAgLy8gUmV0dXJucyBhIGNhdGVnb3J5IGJhc2VkIG9uIGl0cyBpbmRleC4KKyAgY29u
c3QgQ2F0ZWdvcnkqIEdldENhdGVnb3J5KHNpemVfdCBpbmRleCkgY29uc3Q7CisKKyAgLy8gVHVy
biB0cmFjaW5nIG9uIG9yIG9mZiBmb3IgdGhlIGdpdmVuIGNhdGVnb3J5IGluIGEgdHJhY2sgZXZl
bnQgZGF0YSBzb3VyY2UKKyAgLy8gaW5zdGFuY2UuCisgIHZvaWQgRW5hYmxlQ2F0ZWdvcnlGb3JJ
bnN0YW5jZShzaXplX3QgY2F0ZWdvcnlfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1aW50MzJfdCBpbnN0YW5jZV9pbmRleCkgY29uc3Q7CisgIHZvaWQgRGlzYWJsZUNh
dGVnb3J5Rm9ySW5zdGFuY2Uoc2l6ZV90IGNhdGVnb3J5X2luZGV4LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluc3RhbmNlX2luZGV4KSBjb25zdDsKKworICBj
b25zdGV4cHIgc3RkOjphdG9taWM8dWludDhfdD4qIEdldENhdGVnb3J5U3RhdGUoCisgICAgICBz
aXplX3QgY2F0ZWdvcnlfaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gJnN0YXRlX3N0b3JhZ2Vf
W2NhdGVnb3J5X2luZGV4XTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRy
YWNlIHBvaW50IHN1cHBvcnQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8KKyAgLy8gKFRo
ZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCBieSB0aGUgdHJhY2sgZXZlbnQgdHJhY2UgcG9p
bnQKKyAgLy8gaW1wbGVtZW50YXRpb24gYW5kIHR5cGljYWxseSBkb24ndCBuZWVkIHRvIGJlIGNh
bGxlZCBieSBvdGhlciBjb2RlLikKKworICAvLyBBdCBjb21waWxlIHRpbWUsIHR1cm4gYSBjYXRl
Z29yeSBuYW1lIGludG8gYW4gaW5kZXggaW50byB0aGUgcmVnaXN0cnkuCisgIC8vIFJldHVybnMg
a0ludmFsaWRDYXRlZ29yeUluZGV4IGlmIHRoZSBjYXRlZ29yeSB3YXMgbm90IGZvdW5kLCBvcgor
ICAvLyBrRHluYW1pY0NhdGVnb3J5SW5kZXggaWYgfGlzX2R5bmFtaWN8IGlzIHRydWUgb3IgYSBE
eW5hbWljQ2F0ZWdvcnkgd2FzCisgIC8vIHBhc3NlZCBpbi4KKyAgc3RhdGljIGNvbnN0ZXhwciBz
aXplX3Qga0ludmFsaWRDYXRlZ29yeUluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigtMSk7Cisg
IHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtEeW5hbWljQ2F0ZWdvcnlJbmRleCA9IHN0YXRpY19j
YXN0PHNpemVfdD4oLTIpOworICBjb25zdGV4cHIgc2l6ZV90IEZpbmQoY29uc3QgY2hhciogbmFt
ZSwgYm9vbCBpc19keW5hbWljKSBjb25zdCB7CisgICAgcmV0dXJuIENoZWNrSXNWYWxpZENhdGVn
b3J5SW5kZXgoRmluZEltcGwobmFtZSwgaXNfZHluYW1pYykpOworICB9CisKKyAgY29uc3RleHBy
IHNpemVfdCBGaW5kKGNvbnN0IER5bmFtaWNDYXRlZ29yeSYsIGJvb2wpIGNvbnN0IHsKKyAgICBy
ZXR1cm4ga0R5bmFtaWNDYXRlZ29yeUluZGV4OworICB9CisKKyAgY29uc3RleHByIGJvb2wgVmFs
aWRhdGVDYXRlZ29yaWVzKHNpemVfdCBpbmRleCA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gKGlu
ZGV4ID09IGNhdGVnb3J5X2NvdW50XykKKyAgICAgICAgICAgICAgID8gdHJ1ZQorICAgICAgICAg
ICAgICAgOiBJc1ZhbGlkQ2F0ZWdvcnlOYW1lKGNhdGVnb3JpZXNfW2luZGV4XS5uYW1lKQorICAg
ICAgICAgICAgICAgICAgICAgPyBWYWxpZGF0ZUNhdGVnb3JpZXMoaW5kZXggKyAxKQorICAgICAg
ICAgICAgICAgICAgICAgOiBmYWxzZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVE9ETyhza3lv
c3RpbCk6IE1ha2UgdGhlIGNvbXBpbGUtdGltZSByb3V0aW5lcyBuaWNlciB3aXRoIEMrKzE0Lgor
ICBjb25zdGV4cHIgc2l6ZV90IEZpbmRJbXBsKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYm9vbCBpc19keW5hbWljLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNpemVfdCBpbmRleCA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gaXNfZHluYW1pYyA/
IGtEeW5hbWljQ2F0ZWdvcnlJbmRleAorICAgICAgICAgICAgICAgICAgICAgIDogKGluZGV4ID09
IGNhdGVnb3J5X2NvdW50XykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGtJbnZhbGlk
Q2F0ZWdvcnlJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nRXEoY2F0
ZWdvcmllc19baW5kZXhdLm5hbWUsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgPyBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmluZElt
cGwobmFtZSwgZmFsc2UsIGluZGV4ICsgMSk7CisgIH0KKworICAvLyBBIGNvbXBpbGUgdGltZSBo
ZWxwZXIgZm9yIGNoZWNraW5nIHRoYXQgYSBjYXRlZ29yeSBpbmRleCBpcyB2YWxpZC4KKyAgc3Rh
dGljIGNvbnN0ZXhwciBzaXplX3QgQ2hlY2tJc1ZhbGlkQ2F0ZWdvcnlJbmRleChzaXplX3QgaW5k
ZXgpIHsKKyAgICAvLyBSZWxpZXMgb24gUEVSRkVUVE9fQ0hFQ0soKSAoYW5kIHRoZSBzdXJyb3Vu
ZGluZyBsYW1iZGEpIGJlaW5nIGEKKyAgICAvLyBub24tY29uc3RleHByIGZ1bmN0aW9uLCB3aGlj
aCB3aWxsIGZhaWwgdGhlIGJ1aWxkIGlmIHRoZSBnaXZlbiB8aW5kZXh8IGlzCisgICAgLy8gaW52
YWxpZC4gVGhlIGZ1bm55IGZvcm1hdHRpbmcgaGVyZSBpcyBzbyB0aGF0IGNsYW5nIHNob3dzIHRo
ZSBjb21tZW50CisgICAgLy8gYmVsb3cgYXMgcGFydCBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAg
ICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgcmV0dXJuIGluZGV4ICE9IGtJbnZhbGlkQ2F0ZWdv
cnlJbmRleCA/IGluZGV4IDogXAorICAgICAgICAvKiBJbnZhbGlkIGNhdGVnb3J5IC0tIGFkZCBp
dCB0byBQRVJGRVRUT19ERUZJTkVfQ0FURUdPUklFUygpLiAqLyBbXSB7CisgICAgICAgIFBFUkZF
VFRPX0NIRUNLKAorICAgICAgICAgICAgZmFsc2UgJiYKKyAgICAgICAgICAgICJBIHRyYWNrIGV2
ZW50IHVzZWQgYW4gdW5rbm93biBjYXRlZ29yeS4gUGxlYXNlIGFkZCBpdCB0byAiCisgICAgICAg
ICAgICAiUEVSRkVUVE9fREVGSU5FX0NBVEVHT1JJRVMoKS4iKTsKKyAgICAgICAgcmV0dXJuIGtJ
bnZhbGlkQ2F0ZWdvcnlJbmRleDsKKyAgICAgIH0oKTsKKyAgICAvLyBjbGFuZy1mb3JtYXQgb24K
KyAgfQorCisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBJc1ZhbGlkQ2F0ZWdvcnlOYW1lKGNvbnN0
IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gKCFuYW1lIHx8ICpuYW1lID09ICdcIicgfHwgKm5h
bWUgPT0gJyonIHx8ICpuYW1lID09ICcgJykKKyAgICAgICAgICAgICAgID8gZmFsc2UKKyAgICAg
ICAgICAgICAgIDogKm5hbWUgPyBJc1ZhbGlkQ2F0ZWdvcnlOYW1lKG5hbWUgKyAxKSA6IHRydWU7
CisgIH0KKworICBzdGF0aWMgY29uc3RleHByIGJvb2wgU3RyaW5nRXEoY29uc3QgY2hhciogYSwg
Y29uc3QgY2hhciogYikgeworICAgIHJldHVybiAqYSAhPSAqYiA/IGZhbHNlCisgICAgICAgICAg
ICAgICAgICAgIDogKCEqYSB8fCAhKmIpID8gKCphID09ICpiKSA6IFN0cmluZ0VxKGEgKyAxLCBi
ICsgMSk7CisgIH0KKworICBjb25zdCBDYXRlZ29yeSogY29uc3QgY2F0ZWdvcmllc187CisgIGNv
bnN0IHNpemVfdCBjYXRlZ29yeV9jb3VudF87CisgIHN0ZDo6YXRvbWljPHVpbnQ4X3Q+KiBjb25z
dCBzdGF0ZV9zdG9yYWdlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8g
bmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5H
X1RSQUNLX0VWRU5UX0NBVEVHT1JZX1JFR0lTVFJZX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVn
aW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy90cmFja19ldmVudC90cmFja19l
dmVudF9jb25maWcuZ2VuLmgKKy8vIERPIE5PVCBFRElULiBBdXRvZ2VuZXJhdGVkIGJ5IFBlcmZl
dHRvIGNwcGdlbl9wbHVnaW4KKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19DT05GSUdfVFJBQ0tfRVZFTlRfVFJBQ0tfRVZFTlRfQ09ORklHX1BST1RPX0NQUF9IXworI2Rl
ZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19UUkFDS19FVkVOVF9U
UkFDS19FVkVOVF9DT05GSUdfUFJPVE9fQ1BQX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNp
bmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNp
bmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NwcF9tZXNzYWdlX29iai5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2NvcHlhYmxlX3B0
ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFz
ZS9leHBvcnQuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mgewor
bmFtZXNwYWNlIGdlbiB7CitjbGFzcyBUcmFja0V2ZW50Q29uZmlnOworfSAgLy8gbmFtZXNwYWNl
IHBlcmZldHRvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9zCit9ICAvLyBuYW1lc3BhY2UgZ2VuCisK
K25hbWVzcGFjZSBwcm90b3plcm8geworY2xhc3MgTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBw
cm90b3plcm8KKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFt
ZXNwYWNlIGdlbiB7CisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBUcmFja0V2ZW50Q29uZmlnIDog
cHVibGljIDo6cHJvdG96ZXJvOjpDcHBNZXNzYWdlT2JqIHsKKyBwdWJsaWM6CisgIGVudW0gRmll
bGROdW1iZXJzIHsKKyAgICBrRGlzYWJsZWRDYXRlZ29yaWVzRmllbGROdW1iZXIgPSAxLAorICAg
IGtFbmFibGVkQ2F0ZWdvcmllc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrRGlzYWJsZWRUYWdzRmll
bGROdW1iZXIgPSAzLAorICAgIGtFbmFibGVkVGFnc0ZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKwor
ICBUcmFja0V2ZW50Q29uZmlnKCk7CisgIH5UcmFja0V2ZW50Q29uZmlnKCkgb3ZlcnJpZGU7Cisg
IFRyYWNrRXZlbnRDb25maWcoVHJhY2tFdmVudENvbmZpZyYmKSBub2V4Y2VwdDsKKyAgVHJhY2tF
dmVudENvbmZpZyYgb3BlcmF0b3I9KFRyYWNrRXZlbnRDb25maWcmJik7CisgIFRyYWNrRXZlbnRD
b25maWcoY29uc3QgVHJhY2tFdmVudENvbmZpZyYpOworICBUcmFja0V2ZW50Q29uZmlnJiBvcGVy
YXRvcj0oY29uc3QgVHJhY2tFdmVudENvbmZpZyYpOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qg
VHJhY2tFdmVudENvbmZpZyYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2tF
dmVudENvbmZpZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisK
KyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAg
c3RkOjpzdHJpbmcgU2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp2
ZWN0b3I8dWludDhfdD4gU2VyaWFsaXplQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lk
IFNlcmlhbGl6ZSg6OnByb3RvemVybzo6TWVzc2FnZSopIGNvbnN0OworCisgIGludCBkaXNhYmxl
ZF9jYXRlZ29yaWVzX3NpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGRpc2Fi
bGVkX2NhdGVnb3JpZXNfLnNpemUoKSk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJp
bmc+JiBkaXNhYmxlZF9jYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gZGlzYWJsZWRfY2F0ZWdv
cmllc187IH0KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2Rpc2FibGVkX2Nh
dGVnb3JpZXMoKSB7IHJldHVybiAmZGlzYWJsZWRfY2F0ZWdvcmllc187IH0KKyAgdm9pZCBjbGVh
cl9kaXNhYmxlZF9jYXRlZ29yaWVzKCkgeyBkaXNhYmxlZF9jYXRlZ29yaWVzXy5jbGVhcigpOyB9
CisgIHZvaWQgYWRkX2Rpc2FibGVkX2NhdGVnb3JpZXMoc3RkOjpzdHJpbmcgdmFsdWUpIHsgZGlz
YWJsZWRfY2F0ZWdvcmllc18uZW1wbGFjZV9iYWNrKHZhbHVlKTsgfQorICBzdGQ6OnN0cmluZyog
YWRkX2Rpc2FibGVkX2NhdGVnb3JpZXMoKSB7IGRpc2FibGVkX2NhdGVnb3JpZXNfLmVtcGxhY2Vf
YmFjaygpOyByZXR1cm4gJmRpc2FibGVkX2NhdGVnb3JpZXNfLmJhY2soKTsgfQorCisgIGludCBl
bmFibGVkX2NhdGVnb3JpZXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4o
ZW5hYmxlZF9jYXRlZ29yaWVzXy5zaXplKCkpOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6
c3RyaW5nPiYgZW5hYmxlZF9jYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gZW5hYmxlZF9jYXRl
Z29yaWVzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG11dGFibGVfZW5hYmxlZF9j
YXRlZ29yaWVzKCkgeyByZXR1cm4gJmVuYWJsZWRfY2F0ZWdvcmllc187IH0KKyAgdm9pZCBjbGVh
cl9lbmFibGVkX2NhdGVnb3JpZXMoKSB7IGVuYWJsZWRfY2F0ZWdvcmllc18uY2xlYXIoKTsgfQor
ICB2b2lkIGFkZF9lbmFibGVkX2NhdGVnb3JpZXMoc3RkOjpzdHJpbmcgdmFsdWUpIHsgZW5hYmxl
ZF9jYXRlZ29yaWVzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRf
ZW5hYmxlZF9jYXRlZ29yaWVzKCkgeyBlbmFibGVkX2NhdGVnb3JpZXNfLmVtcGxhY2VfYmFjaygp
OyByZXR1cm4gJmVuYWJsZWRfY2F0ZWdvcmllc18uYmFjaygpOyB9CisKKyAgaW50IGRpc2FibGVk
X3RhZ3Nfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZGlzYWJsZWRfdGFn
c18uc2l6ZSgpKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRpc2FibGVk
X3RhZ3MoKSBjb25zdCB7IHJldHVybiBkaXNhYmxlZF90YWdzXzsgfQorICBzdGQ6OnZlY3Rvcjxz
dGQ6OnN0cmluZz4qIG11dGFibGVfZGlzYWJsZWRfdGFncygpIHsgcmV0dXJuICZkaXNhYmxlZF90
YWdzXzsgfQorICB2b2lkIGNsZWFyX2Rpc2FibGVkX3RhZ3MoKSB7IGRpc2FibGVkX3RhZ3NfLmNs
ZWFyKCk7IH0KKyAgdm9pZCBhZGRfZGlzYWJsZWRfdGFncyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBk
aXNhYmxlZF90YWdzXy5lbXBsYWNlX2JhY2sodmFsdWUpOyB9CisgIHN0ZDo6c3RyaW5nKiBhZGRf
ZGlzYWJsZWRfdGFncygpIHsgZGlzYWJsZWRfdGFnc18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAm
ZGlzYWJsZWRfdGFnc18uYmFjaygpOyB9CisKKyAgaW50IGVuYWJsZWRfdGFnc19zaXplKCkgY29u
c3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihlbmFibGVkX3RhZ3NfLnNpemUoKSk7IH0KKyAg
Y29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBlbmFibGVkX3RhZ3MoKSBjb25zdCB7IHJl
dHVybiBlbmFibGVkX3RhZ3NfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbXV0YWJs
ZV9lbmFibGVkX3RhZ3MoKSB7IHJldHVybiAmZW5hYmxlZF90YWdzXzsgfQorICB2b2lkIGNsZWFy
X2VuYWJsZWRfdGFncygpIHsgZW5hYmxlZF90YWdzXy5jbGVhcigpOyB9CisgIHZvaWQgYWRkX2Vu
YWJsZWRfdGFncyhzdGQ6OnN0cmluZyB2YWx1ZSkgeyBlbmFibGVkX3RhZ3NfLmVtcGxhY2VfYmFj
ayh2YWx1ZSk7IH0KKyAgc3RkOjpzdHJpbmcqIGFkZF9lbmFibGVkX3RhZ3MoKSB7IGVuYWJsZWRf
dGFnc18uZW1wbGFjZV9iYWNrKCk7IHJldHVybiAmZW5hYmxlZF90YWdzXy5iYWNrKCk7IH0KKwor
IHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkaXNhYmxlZF9jYXRlZ29yaWVz
XzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVuYWJsZWRfY2F0ZWdvcmllc187CisgIHN0
ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkaXNhYmxlZF90YWdzXzsKKyAgc3RkOjp2ZWN0b3I8c3Rk
OjpzdHJpbmc+IGVuYWJsZWRfdGFnc187CisKKyAgLy8gQWxsb3dzIHRvIHByZXNlcnZlIHVua25v
d24gcHJvdG9idWYgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggZnV0dXJlIHZl
cnNpb25zIG9mIC5wcm90byBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgdW5rbm93bl9maWVsZHNfOwor
CisgIHN0ZDo6Yml0c2V0PDU+IF9oYXNfZmllbGRfe307Cit9OworCit9ICAvLyBuYW1lc3BhY2Ug
cGVyZmV0dG8KK30gIC8vIG5hbWVzcGFjZSBwcm90b3MKK30gIC8vIG5hbWVzcGFjZSBnZW4KKwor
I2VuZGlmICAvLyBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19UUkFDS19F
VkVOVF9UUkFDS19FVkVOVF9DT05GSUdfUFJPVE9fQ1BQX0hfCisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1
bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAq
IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUg
TGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoK
KyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgor
ICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0
aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJp
YnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05E
SVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRo
ZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25z
IGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJ
TkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSU5URVJOQUxfVFJBQ0tfRVZFTlRfREFUQV9TT1VSQ0Vf
SF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX1RSQUNLX0VWRU5U
X0RBVEFfU09VUkNFX0hfCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2Jhc2UvY29tcGlsZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlX2hhbmRsZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9jb3JlL2RhdGFf
c291cmNlX2NvbmZpZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vdHJhY2luZy9kYXRhX3NvdXJjZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9ldmVudF9jb250ZXh0LmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2ludGVybmFs
L3RyYWNrX2V2ZW50X2ludGVybmFsLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNrLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50X2NhdGVnb3J5X3Jl
Z2lzdHJ5LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3Mv
cGVyZmV0dG8vY29tbW9uL2J1aWx0aW5fY2xvY2sucGJ6ZXJvLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vY29uZmlnL3RyYWNrX2V2ZW50
L3RyYWNrX2V2ZW50X2NvbmZpZy5nZW4uaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInByb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC90cmFja19ldmVudC5w
Ynplcm8uaCIKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgcGVyZmV0dG8g
eworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKKy8vIEEgdGVtcGxhdGUgaGVs
cGVyIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgdHlwZSBjYW4gYmUgdXNlZCBhcyBhIHRyYWNr
IGV2ZW50CisvLyBsYW1iZGEsIGkuZS4sIGl0IGhhcyB0aGUgc2lnbmF0dXJlICJ2b2lkKEV2ZW50
Q29udGV4dCkiLiBUaGlzIGlzIGFjaGlldmVkIGJ5CisvLyBjaGVja2luZyB0aGF0IHdlIGNhbiBw
YXNzIGFuIEV2ZW50Q29udGV4dCB2YWx1ZSAodGhlIGlubmVyIGRlY2x2YWwpIGludG8gYSBUCisv
LyBpbnN0YW5jZSAodGhlIG91dGVyIGRlY2x2YWwpLiBJZiB0aGlzIGlzIGEgdmFsaWQgZXhwcmVz
c2lvbiwgdGhlIHJlc3VsdAorLy8gZXZhbHVhdGVzIHRvIHNpemVvZigwKSwgaS5lLiwgdHJ1ZS4K
Ky8vIFRPRE8oc2t5b3N0aWwpOiBSZXBsYWNlIHRoaXMgd2l0aCBzdGQ6OmlzX2NvbnZlcnRpYmxl
PHN0ZDo6ZnVuY3Rpb248Li4uPj4KKy8vIG9uY2Ugd2UgaGF2ZSBDKysxNC4KK3RlbXBsYXRlIDx0
eXBlbmFtZSBUPgorc3RhdGljIGNvbnN0ZXhwciBib29sIElzVmFsaWRUcmFjZUxhbWJkYUltcGwo
CisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RhdGljX2Nhc3Q8Ym9vbD4oCisgICAgICAg
IHNpemVvZihzdGQ6OmRlY2x2YWw8VD4oKShzdGQ6OmRlY2x2YWw8RXZlbnRDb250ZXh0PigpKSwg
MCkpPjo6dHlwZSogPQorICAgICAgICBudWxscHRyKSB7CisgIHJldHVybiB0cnVlOworfQorCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBJc1ZhbGlkVHJhY2VM
YW1iZGFJbXBsKC4uLikgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFt
ZSBUPgorc3RhdGljIGNvbnN0ZXhwciBib29sIElzVmFsaWRUcmFjZUxhbWJkYSgpIHsKKyAgcmV0
dXJuIElzVmFsaWRUcmFjZUxhbWJkYUltcGw8VD4obnVsbHB0cik7Cit9CisKK30gIC8vIG5hbWVz
cGFjZQorCitzdHJ1Y3QgVHJhY2tFdmVudERhdGFTb3VyY2VUcmFpdHMgOiBwdWJsaWMgcGVyZmV0
dG86OkRlZmF1bHREYXRhU291cmNlVHJhaXRzIHsKKyAgdXNpbmcgSW5jcmVtZW50YWxTdGF0ZVR5
cGUgPSBUcmFja0V2ZW50SW5jcmVtZW50YWxTdGF0ZTsKKworICAvLyBVc2UgYSBvbmUgc2hhcmVk
IFRMUyBzbG90IHNvIHRoYXQgYWxsIHRyYWNrIGV2ZW50IGRhdGEgc291cmNlcyB3cml0ZSBpbnRv
CisgIC8vIHRoZSBzYW1lIHNlcXVlbmNlIGFuZCBzaGFyZSBpbnRlcm5pbmcgZGljdGlvbmFyaWVz
LgorICBzdGF0aWMgRGF0YVNvdXJjZVRocmVhZExvY2FsU3RhdGUqIEdldERhdGFTb3VyY2VUTFMo
RGF0YVNvdXJjZVN0YXRpY1N0YXRlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFRyYWNpbmdUTFMqIHJvb3RfdGxzKSB7CisgICAgcmV0dXJu
ICZyb290X3Rscy0+dHJhY2tfZXZlbnRfdGxzOworICB9Cit9OworCisvLyBBIGhlbHBlciB0aGF0
IGVuc3VyZXMgbW92YWJsZSBkZWJ1ZyBhbm5vdGF0aW9ucyBhcmUgcGFzc2VkIGJ5IHZhbHVlIHRv
CisvLyBtaW5pbWl6ZSBiaW5hcnkgc2l6ZSBhdCB0aGUgY2FsbCBzaXRlLCB3aGlsZSBhbGxvd2lu
ZyBub24tbW92YWJsZSBhbmQKKy8vIG5vbi1jb3BpYWJsZSBhcmd1bWVudHMgdG8gYmUgcGFzc2Vk
IGJ5IHJlZmVyZW5jZS4KKy8vIFRPRE8oc2t5b3N0aWwpOiBSZW1vdmUgdGhpcyB3aXRoIEMrKzE3
LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRGVidWdBbm5vdGF0aW9uQXJnIHsKKyAg
dXNpbmcgdHlwZSA9IHR5cGVuYW1lIHN0ZDo6CisgICAgICBjb25kaXRpb25hbDxzdGQ6OmlzX21v
dmVfY29uc3RydWN0aWJsZTxUPjo6dmFsdWUsIFQsIFQmJj46OnR5cGU7Cit9OworCisvLyBBIGdl
bmVyaWMgdHJhY2sgZXZlbnQgZGF0YSBzb3VyY2Ugd2hpY2ggaXMgaW5zdGFudGlhdGVkIG9uY2Ug
cGVyIHRyYWNrIGV2ZW50CisvLyBjYXRlZ29yeSBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5h
bWUgRGF0YVNvdXJjZVR5cGUsIGNvbnN0IFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5KiBSZWdp
c3RyeT4KK2NsYXNzIFRyYWNrRXZlbnREYXRhU291cmNlCisgICAgOiBwdWJsaWMgRGF0YVNvdXJj
ZTxEYXRhU291cmNlVHlwZSwgVHJhY2tFdmVudERhdGFTb3VyY2VUcmFpdHM+IHsKKyAgdXNpbmcg
QmFzZSA9IERhdGFTb3VyY2U8RGF0YVNvdXJjZVR5cGUsIFRyYWNrRXZlbnREYXRhU291cmNlVHJh
aXRzPjsKKworIHB1YmxpYzoKKyAgLy8gRGF0YVNvdXJjZSBpbXBsZW1lbnRhdGlvbi4KKyAgdm9p
ZCBPblNldHVwKGNvbnN0IERhdGFTb3VyY2VCYXNlOjpTZXR1cEFyZ3MmIGFyZ3MpIG92ZXJyaWRl
IHsKKyAgICBhdXRvIGNvbmZpZ19yYXcgPSBhcmdzLmNvbmZpZy0+dHJhY2tfZXZlbnRfY29uZmln
X3JhdygpOworICAgIGJvb2wgb2sgPSBjb25maWdfLlBhcnNlRnJvbUFycmF5KGNvbmZpZ19yYXcu
ZGF0YSgpLCBjb25maWdfcmF3LnNpemUoKSk7CisgICAgUEVSRkVUVE9fRENIRUNLKG9rKTsKKyAg
ICBUcmFja0V2ZW50SW50ZXJuYWw6OkVuYWJsZVRyYWNpbmcoKlJlZ2lzdHJ5LCBjb25maWdfLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmludGVybmFsX2luc3Rh
bmNlX2luZGV4KTsKKyAgfQorCisgIHZvaWQgT25TdGFydChjb25zdCBEYXRhU291cmNlQmFzZTo6
U3RhcnRBcmdzJikgb3ZlcnJpZGUge30KKworICB2b2lkIE9uU3RvcChjb25zdCBEYXRhU291cmNl
QmFzZTo6U3RvcEFyZ3MmIGFyZ3MpIG92ZXJyaWRlIHsKKyAgICBUcmFja0V2ZW50SW50ZXJuYWw6
OkRpc2FibGVUcmFjaW5nKCpSZWdpc3RyeSwgYXJncy5pbnRlcm5hbF9pbnN0YW5jZV9pbmRleCk7
CisgIH0KKworICBzdGF0aWMgdm9pZCBGbHVzaCgpIHsKKyAgICBCYXNlOjp0ZW1wbGF0ZSBUcmFj
ZShbXSh0eXBlbmFtZSBCYXNlOjpUcmFjZUNvbnRleHQgY3R4KSB7IGN0eC5GbHVzaCgpOyB9KTsK
KyAgfQorCisgIC8vIERldGVybWluZSBpZiB0cmFjaW5nIGZvciB0aGUgZ2l2ZW4gc3RhdGljIGNh
dGVnb3J5IGlzIGVuYWJsZWQuCisgIHRlbXBsYXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRleD4KKyAg
c3RhdGljIGJvb2wgSXNDYXRlZ29yeUVuYWJsZWQoKSB7CisgICAgcmV0dXJuIFJlZ2lzdHJ5LT5H
ZXRDYXRlZ29yeVN0YXRlKENhdGVnb3J5SW5kZXgpCisgICAgICAgIC0+bG9hZChzdGQ6Om1lbW9y
eV9vcmRlcl9yZWxheGVkKTsKKyAgfQorCisgIC8vIERldGVybWluZSBpZiB0cmFjaW5nIGZvciB0
aGUgZ2l2ZW4gZHluYW1pYyBjYXRlZ29yeSBpcyBlbmFibGVkLgorICBzdGF0aWMgYm9vbCBJc0R5
bmFtaWNDYXRlZ29yeUVuYWJsZWQoCisgICAgICBjb25zdCBEeW5hbWljQ2F0ZWdvcnkmIGR5bmFt
aWNfY2F0ZWdvcnkpIHsKKyAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKKyAgICBCYXNlOjp0ZW1w
bGF0ZSBUcmFjZShbJl0odHlwZW5hbWUgQmFzZTo6VHJhY2VDb250ZXh0IGN0eCkgeworICAgICAg
ZW5hYmxlZCA9IElzRHluYW1pY0NhdGVnb3J5RW5hYmxlZCgmY3R4LCBkeW5hbWljX2NhdGVnb3J5
KTsKKyAgICB9KTsKKyAgICByZXR1cm4gZW5hYmxlZDsKKyAgfQorCisgIC8vIFRoaXMgaXMgdGhl
IGlubGluZWQgZW50cnlwb2ludCBmb3IgYWxsIHRyYWNrIGV2ZW50IHRyYWNlIHBvaW50cy4gSXQg
dHJpZXMKKyAgLy8gdG8gYmUgYXMgbGlnaHR3ZWlnaHQgYXMgcG9zc2libGUgaW4gdGVybXMgb2Yg
aW5zdHJ1Y3Rpb25zIGFuZCBhaW1zIHRvCisgIC8vIGNvbXBpbGUgZG93biB0byBhbiB1bmxpa2Vs
eSBjb25kaXRpb25hbCBqdW1wIHRvIHRoZSBhY3R1YWwgdHJhY2Ugd3JpdGluZworICAvLyBmdW5j
dGlvbi4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4LCB0eXBlbmFtZSBDYWxsYmFj
az4KKyAgc3RhdGljIHZvaWQgQ2FsbElmQ2F0ZWdvcnlFbmFibGVkKENhbGxiYWNrIGNhbGxiYWNr
KSBQRVJGRVRUT19BTFdBWVNfSU5MSU5FIHsKKyAgICBCYXNlOjp0ZW1wbGF0ZSBDYWxsSWZFbmFi
bGVkPENhdGVnb3J5VHJhY2VQb2ludFRyYWl0czxDYXRlZ29yeUluZGV4Pj4oCisgICAgICAgIFsm
Y2FsbGJhY2tdKHVpbnQzMl90IGluc3RhbmNlcykgeyBjYWxsYmFjayhpbnN0YW5jZXMpOyB9KTsK
KyAgfQorCisgIC8vIE9uY2Ugd2UndmUgZGV0ZXJtaW5lZCB0cmFjaW5nIHRvIGJlIGVuYWJsZWQg
Zm9yIHRoaXMgY2F0ZWdvcnksIGFjdHVhbGx5CisgIC8vIHdyaXRlIGEgdHJhY2UgZXZlbnQgb250
byB0aGlzIHRocmVhZCdzIGRlZmF1bHQgdHJhY2suIE91dGxpbmVkIHRvIGF2b2lkCisgIC8vIGJs
b2F0aW5nIGNvZGUgKG1vc3RseSBzdGFjayBkZXB0aCkgYXQgdGhlIGFjdHVhbCB0cmFjZSBwb2lu
dC4KKyAgLy8KKyAgLy8gVG8gbWluaW1pemUgY2FsbCBvdmVyaGVhZCBhdCBlYWNoIHRyYWNlIHBv
aW50LCB3ZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcKKyAgLy8gdHJhY2UgcG9pbnQgYXJndW1lbnQg
dmFyaWFudHM6CisgIC8vCisgIC8vIC0gTm9uZQorICAvLyAtIExhbWJkYQorICAvLyAtIExhbWJk
YSArIHRpbWVzdGFtcAorICAvLyAtIE9uZSBkZWJ1ZyBhbm5vdGF0aW9uCisgIC8vIC0gVHdvIGRl
YnVnIGFubm90YXRpb25zCisgIC8vIC0gVHJhY2sKKyAgLy8gLSBUcmFjayArIExhbWJkYQorICAv
LyAtIFRyYWNrICsgdGltZXN0YW1wCisgIC8vIC0gVHJhY2sgKyBMYW1iZGEgKyB0aW1lc3RhbXAK
KyAgLy8gLSBUcmFjayArIG9uZSBkZWJ1ZyBhbm5vdGF0aW9uCisgIC8vIC0gVHJhY2sgKyB0d28g
ZGVidWcgYW5ub3RhdGlvbnMKKworICAvLyBUcmFjZSBwb2ludCB3aGljaCB0YWtlcyBubyBhcmd1
bWVudHMuCisgIHRlbXBsYXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRleCwgdHlwZW5hbWUgQ2F0ZWdv
cnlUeXBlPgorICBzdGF0aWMgdm9pZCBUcmFjZUZvckNhdGVnb3J5KHVpbnQzMl90IGluc3RhbmNl
cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXRlZ29yeVR5cGUmIGR5
bmFtaWNfY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hh
ciogZXZlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSkKKyAgICAgIFBFUkZFVFRPX05P
X0lOTElORSB7CisgICAgVHJhY2VGb3JDYXRlZ29yeUltcGw8Q2F0ZWdvcnlJbmRleD4oaW5zdGFu
Y2VzLCBkeW5hbWljX2NhdGVnb3J5LCBldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHR5cGUpOworICB9CisKKyAgLy8gVHJhY2UgcG9pbnQgd2hpY2gg
dGFrZXMgYSBsYW1iZGEgZnVuY3Rpb24gYXJndW1lbnQuCisgIHRlbXBsYXRlIDxzaXplX3QgQ2F0
ZWdvcnlJbmRleCwKKyAgICAgICAgICAgIHR5cGVuYW1lIENhdGVnb3J5VHlwZSwKKyAgICAgICAg
ICAgIHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rpb24gPSB2b2lkICgqKShFdmVudENvbnRleHQpLAor
ICAgICAgICAgICAgdHlwZW5hbWUgQXJndW1lbnRGdW5jdGlvbkNoZWNrID0gdHlwZW5hbWUgc3Rk
OjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgSXNWYWxpZFRyYWNlTGFtYmRhPEFyZ3VtZW50
RnVuY3Rpb24+KCk+Ojp0eXBlPgorICBzdGF0aWMgdm9pZCBUcmFjZUZvckNhdGVnb3J5KHVpbnQz
Ml90IGluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXRl
Z29yeVR5cGUmIGR5bmFtaWNfY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlR5cGUgdHlwZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEZ1bmN0aW9uIGFyZ19mdW5jdGlvbikK
KyAgICAgIFBFUkZFVFRPX05PX0lOTElORSB7CisgICAgVHJhY2VGb3JDYXRlZ29yeUltcGw8Q2F0
ZWdvcnlJbmRleD4oCisgICAgICAgIGluc3RhbmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRf
bmFtZSwgdHlwZSwgVHJhY2soKSwKKyAgICAgICAgVHJhY2tFdmVudEludGVybmFsOjpHZXRUaW1l
TnMoKSwgc3RkOjptb3ZlKGFyZ19mdW5jdGlvbikpOworICB9CisKKyAgLy8gVHJhY2UgcG9pbnQg
d2hpY2ggdGFrZXMgYSBsYW1iZGEgZnVuY3Rpb24gYXJndW1lbnQgYW5kIGFuIG92ZXJyaWRkZW4K
KyAgLy8gdGltZXN0YW1wLiB8dGltZXN0YW1wfCBtdXN0IGJlIGluIG5hbm9zZWNvbmRzIGluIHRo
ZSB0cmFjZSBjbG9jayB0aW1lYmFzZS4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4
LAorICAgICAgICAgICAgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAorICAgICAgICAgICAgdHlwZW5h
bWUgQXJndW1lbnRGdW5jdGlvbiA9IHZvaWQgKCopKEV2ZW50Q29udGV4dCksCisgICAgICAgICAg
ICB0eXBlbmFtZSBBcmd1bWVudEZ1bmN0aW9uQ2hlY2sgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9p
ZjwKKyAgICAgICAgICAgICAgICBJc1ZhbGlkVHJhY2VMYW1iZGE8QXJndW1lbnRGdW5jdGlvbj4o
KT46OnR5cGU+CisgIHN0YXRpYyB2b2lkIFRyYWNlRm9yQ2F0ZWdvcnkodWludDMyX3QgaW5zdGFu
Y2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhdGVnb3J5VHlwZSYg
ZHluYW1pY19jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBj
aGFyKiBldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZldHRv
Ojpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBBcmd1bWVudEZ1bmN0aW9uIGFyZ19mdW5jdGlvbikKKyAgICAgIFBFUkZFVFRP
X05PX0lOTElORSB7CisgICAgVHJhY2VGb3JDYXRlZ29yeUltcGw8Q2F0ZWdvcnlJbmRleD4oaW5z
dGFuY2VzLCBkeW5hbWljX2NhdGVnb3J5LCBldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIFRyYWNrKCksIHRpbWVzdGFtcCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoYXJnX2Z1bmN0aW9uKSk7
CisgIH0KKworICAvLyBUaGlzIHZhcmlhbnQgb2YgdGhlIGlubmVyIHRyYWNlIHBvaW50IHRha2Vz
IGEgVHJhY2sgYXJndW1lbnQgd2hpY2ggY2FuIGJlCisgIC8vIHVzZWQgdG8gZW1pdCBldmVudHMg
b24gYSBub24tZGVmYXVsdCB0cmFjay4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4
LAorICAgICAgICAgICAgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAorICAgICAgICAgICAgdHlwZW5h
bWUgVHJhY2tUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlQ2hlY2sgPSB0eXBl
bmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxl
PFRyYWNrVHlwZSwgVHJhY2s+Ojp2YWx1ZT46OnR5cGU+CisgIHN0YXRpYyB2b2lkIFRyYWNlRm9y
Q2F0ZWdvcnkodWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IENhdGVnb3J5VHlwZSYgZHluYW1pY19jYXRlZ29yeSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBldmVudF9uYW1lLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VHlw
ZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrVHlwZSYg
dHJhY2spIFBFUkZFVFRPX05PX0lOTElORSB7CisgICAgVHJhY2VGb3JDYXRlZ29yeUltcGw8Q2F0
ZWdvcnlJbmRleD4oaW5zdGFuY2VzLCBkeW5hbWljX2NhdGVnb3J5LCBldmVudF9uYW1lLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHRyYWNrKTsKKyAgfQor
CisgIC8vIFRyYWNlIHBvaW50IHdpdGggYSB0cmFjayBhbmQgYSBsYW1iZGEgZnVuY3Rpb24uCisg
IHRlbXBsYXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRy
YWNrVHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIENhdGVnb3J5VHlwZSwKKyAgICAgICAgICAg
IHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rpb24gPSB2b2lkICgqKShFdmVudENvbnRleHQpLAorICAg
ICAgICAgICAgdHlwZW5hbWUgQXJndW1lbnRGdW5jdGlvbkNoZWNrID0gdHlwZW5hbWUgc3RkOjpl
bmFibGVfaWY8CisgICAgICAgICAgICAgICAgSXNWYWxpZFRyYWNlTGFtYmRhPEFyZ3VtZW50RnVu
Y3Rpb24+KCk+Ojp0eXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlQ2hlY2sgPSB0
eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRp
YmxlPFRyYWNrVHlwZSwgVHJhY2s+Ojp2YWx1ZT46OnR5cGU+CisgIHN0YXRpYyB2b2lkIFRyYWNl
Rm9yQ2F0ZWdvcnkodWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IENhdGVnb3J5VHlwZSYgZHluYW1pY19jYXRlZ29yeSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBldmVudF9uYW1lLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6
VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrVHlw
ZSYgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRGdW5jdGlv
biBhcmdfZnVuY3Rpb24pCisgICAgICBQRVJGRVRUT19OT19JTkxJTkUgeworICAgIFRyYWNlRm9y
Q2F0ZWdvcnlJbXBsPENhdGVnb3J5SW5kZXg+KAorICAgICAgICBpbnN0YW5jZXMsIGR5bmFtaWNf
Y2F0ZWdvcnksIGV2ZW50X25hbWUsIHR5cGUsIHRyYWNrLAorICAgICAgICBUcmFja0V2ZW50SW50
ZXJuYWw6OkdldFRpbWVOcygpLCBzdGQ6Om1vdmUoYXJnX2Z1bmN0aW9uKSk7CisgIH0KKworICAv
LyBUcmFjZSBwb2ludCB3aXRoIGEgdHJhY2sgYW5kIG92ZXJyaWRkZW4gdGltZXN0YW1wLgorICB0
ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5SW5kZXgsCisgICAgICAgICAgICB0eXBlbmFtZSBDYXRl
Z29yeVR5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBUcmFja1R5cGUsCisgICAgICAgICAgICB0
eXBlbmFtZSBUcmFja1R5cGVDaGVjayA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAg
ICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VHJhY2tUeXBlLCBUcmFjaz46OnZhbHVlPjo6
dHlwZT4KKyAgc3RhdGljIHZvaWQgVHJhY2VGb3JDYXRlZ29yeSh1aW50MzJfdCBpbnN0YW5jZXMs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2F0ZWdvcnlUeXBlJiBkeW5h
bWljX2NhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIq
IGV2ZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmV0dG86OnBy
b3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgVHJhY2tUeXBlJiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIFBFUkZFVFRPX05PX0lOTElORSB7CisgICAg
VHJhY2VGb3JDYXRlZ29yeUltcGw8Q2F0ZWdvcnlJbmRleD4oaW5zdGFuY2VzLCBkeW5hbWljX2Nh
dGVnb3J5LCBldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHR5cGUsIHRyYWNrLCB0aW1lc3RhbXApOworICB9CisKKyAgLy8gVHJhY2UgcG9pbnQgd2l0
aCBhIHRyYWNrLCBhIGxhbWJkYSBmdW5jdGlvbiBhbmQgYW4gb3ZlcnJpZGRlbiB0aW1lc3RhbXAu
CisgIC8vIHx0aW1lc3RhbXB8IG11c3QgYmUgaW4gbmFub3NlY29uZHMgaW4gdGhlIHRyYWNlIGNs
b2NrIHRpbWViYXNlLgorICB0ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5SW5kZXgsCisgICAgICAg
ICAgICB0eXBlbmFtZSBUcmFja1R5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBDYXRlZ29yeVR5
cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmd1bWVudEZ1bmN0aW9uID0gdm9pZCAoKikoRXZl
bnRDb250ZXh0KSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rpb25DaGVjayA9
IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgIElzVmFsaWRUcmFjZUxh
bWJkYTxBcmd1bWVudEZ1bmN0aW9uPigpPjo6dHlwZT4KKyAgc3RhdGljIHZvaWQgVHJhY2VGb3JD
YXRlZ29yeSh1aW50MzJfdCBpbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgQ2F0ZWdvcnlUeXBlJiBkeW5hbWljX2NhdGVnb3J5LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV2ZW50X25hbWUsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUeXBl
IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhY2tUeXBlJiB0
cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXAs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRGdW5jdGlvbiBhcmdfZnVu
Y3Rpb24pCisgICAgICBQRVJGRVRUT19OT19JTkxJTkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlJ
bXBsPENhdGVnb3J5SW5kZXg+KGluc3RhbmNlcywgZHluYW1pY19jYXRlZ29yeSwgZXZlbnRfbmFt
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCB0cmFjaywg
dGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6
bW92ZShhcmdfZnVuY3Rpb24pKTsKKyAgfQorCisgIC8vIFRyYWNlIHBvaW50IHdpdGggb25lIGRl
YnVnIGFubm90YXRpb24uCisgIC8vCisgIC8vIFRoaXMgdHlwZSBvZiB0cmFjZSBwb2ludCBpcyBp
bXBsZW1lbnRlZCB3aXRoIGFuIGlubmVyIGhlbHBlciBmdW5jdGlvbiB3aGljaAorICAvLyBlbnN1
cmVzIHxhcmdfdmFsdWV8IGlzIG9ubHkgcGFzc2VkIGJ5IHJlZmVyZW5jZSB3aGVuIHJlcXVpcmVk
IChpLmUuLCB3aXRoIGEKKyAgLy8gY3VzdG9tIERlYnVnQW5ub3RhdGlvbiB0eXBlKS4gVGhpcyBh
dm9pZHMgdGhlIGJpbmFyeSBhbmQgcnVudGltZSBvdmVyaGVhZAorICAvLyBvZiB1bm5lY2Vzc2Fy
aWx5IHBhc3NpbmcgYWxsIHR5cGVzIGRlYnVnIGFubm90YXRpb25zIGJ5IHJlZmVyZW5jZS4KKyAg
Ly8KKyAgLy8gTm90ZSB0aGF0IGZvciB0aGlzIHRvIHdvcmsgd2VsbCwgdGhlIF9vdXRlcl8gZnVu
Y3Rpb24gKHRoaXMgZnVuY3Rpb24pIGhhcworICAvLyB0byBiZSBpbmxpbmVkIGF0IHRoZSBjYWxs
IHNpdGUgd2hpbGUgdGhlIF9pbm5lcl8gZnVuY3Rpb24KKyAgLy8gKFRyYWNlRm9yQ2F0ZWdvcnlX
aXRoRGVidWdBbm5vdGF0aW9ucykgaXMgc3RpbGwgb3V0bGluZWQgdG8gbWluaW1pemUKKyAgLy8g
b3ZlcmFsbCBiaW5hcnkgc2l6ZS4KKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4LCB0
eXBlbmFtZSBDYXRlZ29yeVR5cGUsIHR5cGVuYW1lIEFyZ1R5cGU+CisgIHN0YXRpYyB2b2lkIFRy
YWNlRm9yQ2F0ZWdvcnkodWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IENhdGVnb3J5VHlwZSYgZHluYW1pY19jYXRlZ29yeSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBldmVudF9uYW1lLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVu
dDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIq
IGFyZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGUmJiBhcmdf
dmFsdWUpIFBFUkZFVFRPX0FMV0FZU19JTkxJTkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlXaXRo
RGVidWdBbm5vdGF0aW9uczxDYXRlZ29yeUluZGV4LCBDYXRlZ29yeVR5cGUsIFRyYWNrLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdUeXBlPigKKyAgICAgICAg
aW5zdGFuY2VzLCBkeW5hbWljX2NhdGVnb3J5LCBldmVudF9uYW1lLCB0eXBlLCBUcmFjaygpLCBh
cmdfbmFtZSwKKyAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ1R5cGU+KGFyZ192YWx1ZSkpOworICB9
CisKKyAgLy8gQSBvbmUgYXJndW1lbnQgdHJhY2UgcG9pbnQgd2hpY2ggdGFrZXMgYW4gZXhwbGlj
aXQgdHJhY2suCisgIHRlbXBsYXRlIDxzaXplX3QgQ2F0ZWdvcnlJbmRleCwKKyAgICAgICAgICAg
IHR5cGVuYW1lIENhdGVnb3J5VHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWNrVHlwZSwK
KyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ1R5cGU+CisgIHN0YXRpYyB2b2lkIFRyYWNlRm9yQ2F0
ZWdvcnkodWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IENhdGVnb3J5VHlwZSYgZHluYW1pY19jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBjaGFyKiBldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VHlwZSB0
eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrVHlwZSYgdHJh
Y2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJnX25hbWUs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnVHlwZSYmIGFyZ192YWx1ZSkgUEVS
RkVUVE9fQUxXQVlTX0lOTElORSB7CisgICAgUEVSRkVUVE9fRENIRUNLKHRyYWNrKTsKKyAgICBU
cmFjZUZvckNhdGVnb3J5V2l0aERlYnVnQW5ub3RhdGlvbnM8Q2F0ZWdvcnlJbmRleCwgQ2F0ZWdv
cnlUeXBlLCBUcmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEFyZ1R5cGU+KAorICAgICAgICBpbnN0YW5jZXMsIGR5bmFtaWNfY2F0ZWdvcnksIGV2ZW50
X25hbWUsIHR5cGUsIHRyYWNrLCBhcmdfbmFtZSwKKyAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ1R5
cGU+KGFyZ192YWx1ZSkpOworICB9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29yeUluZGV4
LAorICAgICAgICAgICAgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAorICAgICAgICAgICAgdHlwZW5h
bWUgVHJhY2tUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJnVHlwZT4KKyAgc3RhdGljIHZv
aWQgVHJhY2VGb3JDYXRlZ29yeVdpdGhEZWJ1Z0Fubm90YXRpb25zKAorICAgICAgdWludDMyX3Qg
aW5zdGFuY2VzLAorICAgICAgY29uc3QgQ2F0ZWdvcnlUeXBlJiBkeW5hbWljX2NhdGVnb3J5LAor
ICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwKKyAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBi
emVybzo6VHJhY2tFdmVudDo6VHlwZSB0eXBlLAorICAgICAgY29uc3QgVHJhY2tUeXBlJiB0cmFj
aywKKyAgICAgIGNvbnN0IGNoYXIqIGFyZ19uYW1lLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6
OkRlYnVnQW5ub3RhdGlvbkFyZzxBcmdUeXBlPjo6dHlwZSBhcmdfdmFsdWUpCisgICAgICBQRVJG
RVRUT19OT19JTkxJTkUgeworICAgIFRyYWNlRm9yQ2F0ZWdvcnlJbXBsPENhdGVnb3J5SW5kZXg+
KAorICAgICAgICBpbnN0YW5jZXMsIGR5bmFtaWNfY2F0ZWdvcnksIGV2ZW50X25hbWUsIHR5cGUs
IHRyYWNrLAorICAgICAgICBUcmFja0V2ZW50SW50ZXJuYWw6OkdldFRpbWVOcygpLCBbJl0oRXZl
bnRDb250ZXh0IGV2ZW50X2N0eCkgeworICAgICAgICAgIFRyYWNrRXZlbnRJbnRlcm5hbDo6QWRk
RGVidWdBbm5vdGF0aW9uKCZldmVudF9jdHgsIGFyZ19uYW1lLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ192YWx1ZSk7CisgICAgICAgIH0pOwor
ICB9CisKKyAgLy8gVHJhY2UgcG9pbnQgd2l0aCB0d28gZGVidWcgYW5ub3RhdGlvbnMuIE5vdGUg
dGhhdCB3ZSBvbmx5IHN1cHBvcnQgdXAgdG8gdHdvCisgIC8vIGRpcmVjdCBkZWJ1ZyBhbm5vdGF0
aW9ucy4gRm9yIG1vcmUgY29tcGxpY2F0ZWQgYXJndW1lbnRzLCB5b3Ugc2hvdWxkCisgIC8vIGRl
ZmluZSB5b3VyIG93biBhcmd1bWVudCB0eXBlIGluIHRyYWNrX2V2ZW50LnByb3RvIGFuZCB1c2Ug
YSBsYW1iZGEgdG8gZmlsbAorICAvLyBpdCBpbiB5b3VyIHRyYWNlIHBvaW50LgorICB0ZW1wbGF0
ZSA8c2l6ZV90IENhdGVnb3J5SW5kZXgsCisgICAgICAgICAgICB0eXBlbmFtZSBDYXRlZ29yeVR5
cGUsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmdUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUg
QXJnVHlwZTI+CisgIHN0YXRpYyB2b2lkIFRyYWNlRm9yQ2F0ZWdvcnkodWludDMyX3QgaW5zdGFu
Y2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhdGVnb3J5VHlwZSYg
ZHluYW1pY19jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBj
aGFyKiBldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZldHRv
Ojpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ19uYW1lLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEFyZ1R5cGUmJiBhcmdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgY2hhciogYXJnX25hbWUyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEFyZ1R5cGUyJiYgYXJnX3ZhbHVlMikgUEVSRkVUVE9fQUxXQVlTX0lOTElORSB7Cisg
ICAgVHJhY2VGb3JDYXRlZ29yeVdpdGhEZWJ1Z0Fubm90YXRpb25zPENhdGVnb3J5SW5kZXgsIENh
dGVnb3J5VHlwZSwgVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEFyZ1R5cGUsIEFyZ1R5cGUyPigKKyAgICAgICAgaW5zdGFuY2VzLCBkeW5hbWljX2NhdGVn
b3J5LCBldmVudF9uYW1lLCB0eXBlLCBUcmFjaygpLCBhcmdfbmFtZSwKKyAgICAgICAgc3RkOjpm
b3J3YXJkPEFyZ1R5cGU+KGFyZ192YWx1ZSksIGFyZ19uYW1lMiwKKyAgICAgICAgc3RkOjpmb3J3
YXJkPEFyZ1R5cGUyPihhcmdfdmFsdWUyKSk7CisgIH0KKworICAvLyBBIHR3byBhcmd1bWVudCB0
cmFjZSBwb2ludCB3aGljaCB0YWtlcyBhbiBleHBsaWNpdCB0cmFjay4KKyAgdGVtcGxhdGUgPHNp
emVfdCBDYXRlZ29yeUluZGV4LAorICAgICAgICAgICAgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAor
ICAgICAgICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJn
VHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ1R5cGUyPgorICBzdGF0aWMgdm9pZCBUcmFj
ZUZvckNhdGVnb3J5KHVpbnQzMl90IGluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNfY2F0ZWdvcnksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6
OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFja1R5
cGUmIHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFy
Z19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGUmJiBhcmdfdmFs
dWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJnX25hbWUy
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGUyJiYgYXJnX3ZhbHVlMikg
UEVSRkVUVE9fQUxXQVlTX0lOTElORSB7CisgICAgUEVSRkVUVE9fRENIRUNLKHRyYWNrKTsKKyAg
ICBUcmFjZUZvckNhdGVnb3J5V2l0aERlYnVnQW5ub3RhdGlvbnM8Q2F0ZWdvcnlJbmRleCwgQ2F0
ZWdvcnlUeXBlLCBUcmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEFyZ1R5cGUsIEFyZ1R5cGUyPigKKyAgICAgICAgaW5zdGFuY2VzLCBkeW5hbWljX2Nh
dGVnb3J5LCBldmVudF9uYW1lLCB0eXBlLCB0cmFjaywgYXJnX25hbWUsCisgICAgICAgIHN0ZDo6
Zm9yd2FyZDxBcmdUeXBlPihhcmdfdmFsdWUpLCBhcmdfbmFtZTIsCisgICAgICAgIHN0ZDo6Zm9y
d2FyZDxBcmdUeXBlMj4oYXJnX3ZhbHVlMikpOworICB9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBD
YXRlZ29yeUluZGV4LAorICAgICAgICAgICAgdHlwZW5hbWUgQ2F0ZWdvcnlUeXBlLAorICAgICAg
ICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJnVHlwZSwK
KyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ1R5cGUyPgorICBzdGF0aWMgdm9pZCBUcmFjZUZvckNh
dGVnb3J5V2l0aERlYnVnQW5ub3RhdGlvbnMoCisgICAgICB1aW50MzJfdCBpbnN0YW5jZXMsCisg
ICAgICBjb25zdCBDYXRlZ29yeVR5cGUmIGR5bmFtaWNfY2F0ZWdvcnksCisgICAgICBjb25zdCBj
aGFyKiBldmVudF9uYW1lLAorICAgICAgcGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2
ZW50OjpUeXBlIHR5cGUsCisgICAgICBUcmFja1R5cGUgdHJhY2ssCisgICAgICBjb25zdCBjaGFy
KiBhcmdfbmFtZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWJ1Z0Fubm90YXRpb25Bcmc8
QXJnVHlwZT46OnR5cGUgYXJnX3ZhbHVlLAorICAgICAgY29uc3QgY2hhciogYXJnX25hbWUyLAor
ICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlYnVnQW5ub3RhdGlvbkFyZzxBcmdUeXBlMj46OnR5
cGUgYXJnX3ZhbHVlMikKKyAgICAgIFBFUkZFVFRPX05PX0lOTElORSB7CisgICAgVHJhY2VGb3JD
YXRlZ29yeUltcGw8Q2F0ZWdvcnlJbmRleD4oCisgICAgICAgIGluc3RhbmNlcywgZHluYW1pY19j
YXRlZ29yeSwgZXZlbnRfbmFtZSwgdHlwZSwgdHJhY2ssCisgICAgICAgIFRyYWNrRXZlbnRJbnRl
cm5hbDo6R2V0VGltZU5zKCksIFsmXShFdmVudENvbnRleHQgZXZlbnRfY3R4KSB7CisgICAgICAg
ICAgVHJhY2tFdmVudEludGVybmFsOjpBZGREZWJ1Z0Fubm90YXRpb24oJmV2ZW50X2N0eCwgYXJn
X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJnX3ZhbHVlKTsKKyAgICAgICAgICBUcmFja0V2ZW50SW50ZXJuYWw6OkFkZERlYnVnQW5ub3Rh
dGlvbigmZXZlbnRfY3R4LCBhcmdfbmFtZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJnX3ZhbHVlMik7CisgICAgICAgIH0pOworICB9CisKKyAg
Ly8gSW5pdGlhbGl6ZSB0aGUgdHJhY2sgZXZlbnQgbGlicmFyeS4gU2hvdWxkIGJlIGNhbGxlZCBi
ZWZvcmUgdHJhY2luZyBpcworICAvLyBlbmFibGVkLgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcigp
IHsKKyAgICAvLyBSZWdpc3RyYXRpb24gaXMgcGVyZm9ybWVkIG91dC1vZi1saW5lIHNvIHVzZXJz
IGRvbid0IG5lZWQgdG8gZGVwZW5kIG9uCisgICAgLy8gRGF0YVNvdXJjZURlc2NyaXB0b3IgQysr
IGJpbmRpbmdzLgorICAgIHJldHVybiBUcmFja0V2ZW50SW50ZXJuYWw6OkluaXRpYWxpemUoCisg
ICAgICAgICpSZWdpc3RyeSwKKyAgICAgICAgW10oY29uc3QgRGF0YVNvdXJjZURlc2NyaXB0b3Im
IGRzZCkgeyByZXR1cm4gQmFzZTo6UmVnaXN0ZXIoZHNkKTsgfSk7CisgIH0KKworICAvLyBSZWNv
cmQgbWV0YWRhdGEgYWJvdXQgZGlmZmVyZW50IHR5cGVzIG9mIHRpbWVsaW5lIHRyYWNrcy4gU2Vl
IFRyYWNrLgorICBzdGF0aWMgdm9pZCBTZXRUcmFja0Rlc2NyaXB0b3IoY29uc3QgVHJhY2smIHRy
YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvdG9zOjpnZW46
OlRyYWNrRGVzY3JpcHRvciYgZGVzYykgeworICAgIFBFUkZFVFRPX0RDSEVDSyh0cmFjay51dWlk
ID09IGRlc2MudXVpZCgpKTsKKyAgICBUcmFja1JlZ2lzdHJ5OjpHZXQoKS0+VXBkYXRlVHJhY2so
dHJhY2ssIGRlc2MuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgICAgQmFzZTo6dGVtcGxhdGUgVHJh
Y2UoWyZdKHR5cGVuYW1lIEJhc2U6OlRyYWNlQ29udGV4dCBjdHgpIHsKKyAgICAgIFRyYWNrRXZl
bnRJbnRlcm5hbDo6V3JpdGVUcmFja0Rlc2NyaXB0b3IoCisgICAgICAgICAgdHJhY2ssIGN0eC50
bHNfaW5zdF8tPnRyYWNlX3dyaXRlci5nZXQoKSk7CisgICAgfSk7CisgIH0KKworICAvLyBERVBS
RUNBVEVELiBPbmx5IGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBzdGF0aWMg
dm9pZCBTZXRUcmFja0Rlc2NyaXB0b3IoCisgICAgICBjb25zdCBUcmFjayYgdHJhY2ssCisgICAg
ICBzdGQ6OmZ1bmN0aW9uPHZvaWQocHJvdG9zOjpwYnplcm86OlRyYWNrRGVzY3JpcHRvciopPiBj
YWxsYmFjaykgeworICAgIFNldFRyYWNrRGVzY3JpcHRvckltcGwodHJhY2ssIHN0ZDo6bW92ZShj
YWxsYmFjaykpOworICB9CisKKyAgLy8gREVQUkVDQVRFRC4gT25seSBrZXB0IGZvciBiYWNrd2Fy
ZHMgY29tcGF0aWJpbGl0eS4KKyAgc3RhdGljIHZvaWQgU2V0UHJvY2Vzc0Rlc2NyaXB0b3IoCisg
ICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQocHJvdG9zOjpwYnplcm86OlRyYWNrRGVzY3JpcHRvciop
PiBjYWxsYmFjaywKKyAgICAgIGNvbnN0IFByb2Nlc3NUcmFjayYgdHJhY2sgPSBQcm9jZXNzVHJh
Y2s6OkN1cnJlbnQoKSkgeworICAgIFNldFRyYWNrRGVzY3JpcHRvckltcGwoc3RkOjptb3ZlKHRy
YWNrKSwgc3RkOjptb3ZlKGNhbGxiYWNrKSk7CisgIH0KKworICAvLyBERVBSRUNBVEVELiBPbmx5
IGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBzdGF0aWMgdm9pZCBTZXRUaHJl
YWREZXNjcmlwdG9yKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHByb3Rvczo6cGJ6ZXJvOjpU
cmFja0Rlc2NyaXB0b3IqKT4gY2FsbGJhY2ssCisgICAgICBjb25zdCBUaHJlYWRUcmFjayYgdHJh
Y2sgPSBUaHJlYWRUcmFjazo6Q3VycmVudCgpKSB7CisgICAgU2V0VHJhY2tEZXNjcmlwdG9ySW1w
bChzdGQ6Om1vdmUodHJhY2spLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgfQorCisgIHN0YXRp
YyB2b2lkIEVyYXNlVHJhY2tEZXNjcmlwdG9yKGNvbnN0IFRyYWNrJiB0cmFjaykgeworICAgIFRy
YWNrUmVnaXN0cnk6OkdldCgpLT5FcmFzZVRyYWNrKHRyYWNrKTsKKyAgfQorCisgIC8vIFJldHVy
bnMgdGhlIGN1cnJlbnQgdHJhY2UgdGltZXN0YW1wIGluIG5hbm9zZWNvbmRzLiBOb3RlIHRoZSBy
ZXR1cm5lZAorICAvLyB0aW1lYmFzZSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3Jt
LCBidXQgd2lsbCBhbHdheXMgbWF0Y2ggdGhlCisgIC8vIHRpbWVzdGFtcHMgcmVjb3JkZWQgYnkg
dHJhY2sgZXZlbnRzIChzZWUgR2V0VHJhY2VDbG9ja0lkKS4KKyAgc3RhdGljIHVpbnQ2NF90IEdl
dFRyYWNlVGltZU5zKCkgeyByZXR1cm4gVHJhY2tFdmVudEludGVybmFsOjpHZXRUaW1lTnMoKTsg
fQorCisgIC8vIFJldHVybnMgdGhlIHR5cGUgb2YgY2xvY2sgdXNlZCBieSBHZXRUcmFjZVRpbWVO
cygpLgorICBzdGF0aWMgY29uc3RleHByIHByb3Rvczo6cGJ6ZXJvOjpCdWlsdGluQ2xvY2sgR2V0
VHJhY2VDbG9ja0lkKCkgeworICAgIHJldHVybiBUcmFja0V2ZW50SW50ZXJuYWw6OkdldENsb2Nr
SWQoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gRWFjaCBjYXRlZ29yeSBoYXMgaXRzIG93biBl
bmFibGVkL2Rpc2FibGVkIHN0YXRlLCBzdG9yZWQgaW4gdGhlIGNhdGVnb3J5CisgIC8vIHJlZ2lz
dHJ5LgorICB0ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5SW5kZXg+CisgIHN0cnVjdCBDYXRlZ29y
eVRyYWNlUG9pbnRUcmFpdHMgeworICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjphdG9taWM8dWlu
dDhfdD4qIEdldEFjdGl2ZUluc3RhbmNlcygpIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoCisgICAg
ICAgICAgQ2F0ZWdvcnlJbmRleCAhPSBUcmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeTo6a0ludmFs
aWRDYXRlZ29yeUluZGV4LAorICAgICAgICAgICJJbnZhbGlkIGNhdGVnb3J5IGluZGV4Iik7Cisg
ICAgICByZXR1cm4gUmVnaXN0cnktPkdldENhdGVnb3J5U3RhdGUoQ2F0ZWdvcnlJbmRleCk7Cisg
ICAgfQorICB9OworCisgIC8vIFRPRE8oc2t5b3N0aWwpOiBNYWtlIHxDYXRlZ29yeUluZGV4fCBh
IHJlZ3VsYXIgcGFyYW1ldGVyIHRvIHJldXNlIHRyYWNlCisgIC8vIHBvaW50IGNvZGUgYWNyb3Nz
IGRpZmZlcmVudCBjYXRlZ29yaWVzLgorICB0ZW1wbGF0ZSA8c2l6ZV90IENhdGVnb3J5SW5kZXgs
CisgICAgICAgICAgICB0eXBlbmFtZSBDYXRlZ29yeVR5cGUsCisgICAgICAgICAgICB0eXBlbmFt
ZSBUcmFja1R5cGUgPSBUcmFjaywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZ3VtZW50RnVuY3Rp
b24gPSB2b2lkICgqKShFdmVudENvbnRleHQpLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJndW1l
bnRGdW5jdGlvbkNoZWNrID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAg
ICAgSXNWYWxpZFRyYWNlTGFtYmRhPEFyZ3VtZW50RnVuY3Rpb24+KCk+Ojp0eXBlLAorICAgICAg
ICAgICAgdHlwZW5hbWUgVHJhY2tUeXBlQ2hlY2sgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwK
KyAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFRyYWNrVHlwZSwgVHJhY2s+Ojp2
YWx1ZT46OnR5cGU+CisgIHN0YXRpYyB2b2lkIFRyYWNlRm9yQ2F0ZWdvcnlJbXBsKAorICAgICAg
dWludDMyX3QgaW5zdGFuY2VzLAorICAgICAgY29uc3QgQ2F0ZWdvcnlUeXBlJiBkeW5hbWljX2Nh
dGVnb3J5LAorICAgICAgY29uc3QgY2hhciogZXZlbnRfbmFtZSwKKyAgICAgIHBlcmZldHRvOjpw
cm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VHlwZSB0eXBlLAorICAgICAgY29uc3QgVHJhY2tU
eXBlJiB0cmFjayA9IFRyYWNrKCksCisgICAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSBUcmFja0V2
ZW50SW50ZXJuYWw6OkdldFRpbWVOcygpLAorICAgICAgQXJndW1lbnRGdW5jdGlvbiBhcmdfZnVu
Y3Rpb24gPSBbXShFdmVudENvbnRleHQpIHsKKyAgICAgIH0pIFBFUkZFVFRPX0FMV0FZU19JTkxJ
TkUgeworICAgIFRyYWNlV2l0aEluc3RhbmNlczxDYXRlZ29yeUluZGV4PigKKyAgICAgICAgaW5z
dGFuY2VzLCBbJl0odHlwZW5hbWUgQmFzZTo6VHJhY2VDb250ZXh0IGN0eCkgeworICAgICAgICAg
IC8vIElmIHRoaXMgY2F0ZWdvcnkgaXMgZHluYW1pYywgZmlyc3QgY2hlY2sgd2hldGhlciBpdCdz
IGVuYWJsZWQuCisgICAgICAgICAgY29uc3RleHByIGJvb2wga0lzRHluYW1pYyA9CisgICAgICAg
ICAgICAgIENhdGVnb3J5SW5kZXggPT0KKyAgICAgICAgICAgICAgVHJhY2tFdmVudENhdGVnb3J5
UmVnaXN0cnk6OmtEeW5hbWljQ2F0ZWdvcnlJbmRleDsKKyAgICAgICAgICBpZiAoa0lzRHluYW1p
YyAmJiAhSXNEeW5hbWljQ2F0ZWdvcnlFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmY3R4LCBEeW5hbWljQ2F0ZWdvcnl7ZHluYW1pY19jYXRlZ29yeX0pKSB7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgeworICAgICAgICAgICAg
Ly8gVE9ETyhza3lvc3RpbCk6IEludGVybiBjYXRlZ29yaWVzIGF0IGNvbXBpbGUgdGltZS4KKyAg
ICAgICAgICAgIGNvbnN0IENhdGVnb3J5KiBzdGF0aWNfY2F0ZWdvcnkgPQorICAgICAgICAgICAg
ICAgIGtJc0R5bmFtaWMgPyBudWxscHRyIDogUmVnaXN0cnktPkdldENhdGVnb3J5KENhdGVnb3J5
SW5kZXgpOworICAgICAgICAgICAgYXV0byBldmVudF9jdHggPSBUcmFja0V2ZW50SW50ZXJuYWw6
OldyaXRlRXZlbnQoCisgICAgICAgICAgICAgICAgY3R4LnRsc19pbnN0Xy0+dHJhY2Vfd3JpdGVy
LmdldCgpLCBjdHguR2V0SW5jcmVtZW50YWxTdGF0ZSgpLAorICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXRlZ29yeSwgZXZlbnRfbmFtZSwgdHlwZSwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIGlm
IChrSXNEeW5hbWljKSB7CisgICAgICAgICAgICAgIENhdGVnb3J5IGNhdGVnb3J5eworICAgICAg
ICAgICAgICAgICAgQ2F0ZWdvcnk6OkZyb21EeW5hbWljQ2F0ZWdvcnkoZHluYW1pY19jYXRlZ29y
eSl9OworICAgICAgICAgICAgICBjYXRlZ29yeS5Gb3JFYWNoR3JvdXBNZW1iZXIoCisgICAgICAg
ICAgICAgICAgICBbJl0oY29uc3QgY2hhciogbWVtYmVyX25hbWUsIHNpemVfdCBuYW1lX3NpemUp
IHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRfY3R4LmV2ZW50KCktPmFkZF9jYXRlZ29yaWVz
KG1lbWJlcl9uYW1lLCBuYW1lX3NpemUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYg
KHRyYWNrKQorICAgICAgICAgICAgICBldmVudF9jdHguZXZlbnQoKS0+c2V0X3RyYWNrX3V1aWQo
dHJhY2sudXVpZCk7CisgICAgICAgICAgICBhcmdfZnVuY3Rpb24oc3RkOjptb3ZlKGV2ZW50X2N0
eCkpOworICAgICAgICAgIH0gIC8vIGV2ZW50X2N0eAorCisgICAgICAgICAgaWYgKHRyYWNrKSB7
CisgICAgICAgICAgICBUcmFja0V2ZW50SW50ZXJuYWw6OldyaXRlVHJhY2tEZXNjcmlwdG9ySWZO
ZWVkZWQoCisgICAgICAgICAgICAgICAgdHJhY2ssIGN0eC50bHNfaW5zdF8tPnRyYWNlX3dyaXRl
ci5nZXQoKSwKKyAgICAgICAgICAgICAgICBjdHguR2V0SW5jcmVtZW50YWxTdGF0ZSgpKTsKKyAg
ICAgICAgICB9CisgICAgICAgIH0pOworICB9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBDYXRlZ29y
eUluZGV4LCB0eXBlbmFtZSBMYW1iZGE+CisgIHN0YXRpYyB2b2lkIFRyYWNlV2l0aEluc3RhbmNl
cyh1aW50MzJfdCBpbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM
YW1iZGEgbGFtYmRhKSBQRVJGRVRUT19BTFdBWVNfSU5MSU5FIHsKKyAgICBpZiAoQ2F0ZWdvcnlJ
bmRleCA9PSBUcmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeTo6a0R5bmFtaWNDYXRlZ29yeUluZGV4
KSB7CisgICAgICBCYXNlOjp0ZW1wbGF0ZSBUcmFjZVdpdGhJbnN0YW5jZXMoaW5zdGFuY2VzLCBz
dGQ6Om1vdmUobGFtYmRhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJhc2U6OnRlbXBsYXRlIFRy
YWNlV2l0aEluc3RhbmNlczwKKyAgICAgICAgICBDYXRlZ29yeVRyYWNlUG9pbnRUcmFpdHM8Q2F0
ZWdvcnlJbmRleD4+KGluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShsYW1iZGEpKTsKKyAgICB9CisgIH0KKworICAv
LyBSZWNvcmRzIGEgdHJhY2sgZGVzY3JpcHRvciBpbnRvIHRoZSB0cmFjayBkZXNjcmlwdG9yIHJl
Z2lzdHJ5IGFuZCwgaWYgd2UKKyAgLy8gYXJlIHRyYWNpbmcsIGFsc28gbWlycm9ycyB0aGUgZGVz
Y3JpcHRvciBpbnRvIHRoZSB0cmFjZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFRyYWNrVHlwZT4K
KyAgc3RhdGljIHZvaWQgU2V0VHJhY2tEZXNjcmlwdG9ySW1wbCgKKyAgICAgIGNvbnN0IFRyYWNr
VHlwZSYgdHJhY2ssCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQocHJvdG9zOjpwYnplcm86OlRy
YWNrRGVzY3JpcHRvciopPiBjYWxsYmFjaykgeworICAgIFRyYWNrUmVnaXN0cnk6OkdldCgpLT5V
cGRhdGVUcmFjayh0cmFjaywgc3RkOjptb3ZlKGNhbGxiYWNrKSk7CisgICAgQmFzZTo6dGVtcGxh
dGUgVHJhY2UoWyZdKHR5cGVuYW1lIEJhc2U6OlRyYWNlQ29udGV4dCBjdHgpIHsKKyAgICAgIFRy
YWNrRXZlbnRJbnRlcm5hbDo6V3JpdGVUcmFja0Rlc2NyaXB0b3IoCisgICAgICAgICAgdHJhY2ss
IGN0eC50bHNfaW5zdF8tPnRyYWNlX3dyaXRlci5nZXQoKSk7CisgICAgfSk7CisgIH0KKworICAv
LyBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBkeW5hbWljIGNhdGVnb3J5IGlzIGVuYWJsZWQsIGZp
cnN0IGJ5IGNoZWNraW5nIHRoZQorICAvLyBwZXItdHJhY2Ugd3JpdGVyIGNhY2hlIG9yIGJ5IGZh
bGxpbmcgYmFjayB0byBjb21wdXRpbmcgaXQgYmFzZWQgb24gdGhlCisgIC8vIHRyYWNlIGNvbmZp
ZyBmb3IgdGhlIGdpdmVuIHNlc3Npb24uCisgIHN0YXRpYyBib29sIElzRHluYW1pY0NhdGVnb3J5
RW5hYmxlZCgKKyAgICAgIHR5cGVuYW1lIEJhc2U6OlRyYWNlQ29udGV4dCogY3R4LAorICAgICAg
Y29uc3QgRHluYW1pY0NhdGVnb3J5JiBkeW5hbWljX2NhdGVnb3J5KSB7CisgICAgYXV0byBpbmNy
X3N0YXRlID0gY3R4LT5HZXRJbmNyZW1lbnRhbFN0YXRlKCk7CisgICAgYXV0byBpdCA9IGluY3Jf
c3RhdGUtPmR5bmFtaWNfY2F0ZWdvcmllcy5maW5kKGR5bmFtaWNfY2F0ZWdvcnkubmFtZSk7Cisg
ICAgaWYgKGl0ID09IGluY3Jfc3RhdGUtPmR5bmFtaWNfY2F0ZWdvcmllcy5lbmQoKSkgeworICAg
ICAgLy8gV2UgaGF2ZW4ndCBzZWVuIHRoaXMgY2F0ZWdvcnkgYmVmb3JlLiBMZXQncyBmaWd1cmUg
b3V0IGlmIGl0J3MgZW5hYmxlZC4KKyAgICAgIC8vIFRoaXMgcmVxdWlyZXMgZ3JhYmJpbmcgYSBs
b2NrIHRvIHJlYWQgdGhlIHNlc3Npb24ncyB0cmFjZSBjb25maWcuCisgICAgICBhdXRvIGRzID0g
Y3R4LT5HZXREYXRhU291cmNlTG9ja2VkKCk7CisgICAgICBDYXRlZ29yeSBjYXRlZ29yeXtDYXRl
Z29yeTo6RnJvbUR5bmFtaWNDYXRlZ29yeShkeW5hbWljX2NhdGVnb3J5KX07CisgICAgICBib29s
IGVuYWJsZWQgPSBUcmFja0V2ZW50SW50ZXJuYWw6OklzQ2F0ZWdvcnlFbmFibGVkKAorICAgICAg
ICAgICpSZWdpc3RyeSwgZHMtPmNvbmZpZ18sIGNhdGVnb3J5KTsKKyAgICAgIC8vIFRPRE8oc2t5
b3N0aWwpOiBDYXAgdGhlIHNpemUgb2YgfGR5bmFtaWNfY2F0ZWdvcmllc3wuCisgICAgICBpbmNy
X3N0YXRlLT5keW5hbWljX2NhdGVnb3JpZXNbZHluYW1pY19jYXRlZ29yeS5uYW1lXSA9IGVuYWJs
ZWQ7CisgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICB9CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7
CisgIH0KKworICAvLyBDb25maWcgZm9yIHRoZSBjdXJyZW50IHRyYWNpbmcgc2Vzc2lvbi4KKyAg
cHJvdG9zOjpnZW46OlRyYWNrRXZlbnRDb25maWcgY29uZmlnXzsKK307CisKK30gIC8vIG5hbWVz
cGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNlbmRpZiAgLy8gSU5D
TFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX1RSQUNLX0VWRU5UX0RBVEFfU09VUkNFX0hf
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3RyYWNp
bmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfbWFjcm9zLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVy
IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91
IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNl
bnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICog
ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBV
bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcs
IHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRl
ZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElP
TlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExp
Y2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5k
CisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xV
REVfUEVSRkVUVE9fVFJBQ0lOR19JTlRFUk5BTF9UUkFDS19FVkVOVF9NQUNST1NfSF8KKyNkZWZp
bmUgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX1RSQUNLX0VWRU5UX01BQ1JPU19I
XworCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdW5kZXJseWluZyBtYWNyb3MgZm9yIHRoZSB0cmFj
ZSBwb2ludCB0cmFjayBldmVudAorLy8gaW1wbGVtZW50YXRpb24uIFBlcmZldHRvIEFQSSB1c2Vy
cyB0eXBpY2FsbHkgZG9uJ3QgbmVlZCB0byB1c2UgYW55dGhpbmcgaGVyZQorLy8gZGlyZWN0bHku
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2Uv
Y29tcGlsZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfZGF0YV9zb3VyY2UuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvdHJhY2tfZXZl
bnRfY2F0ZWdvcnlfcmVnaXN0cnkuaCIKKworLy8gSWdub3JlIEdDQyB3YXJuaW5nIGFib3V0IGEg
bWlzc2luZyBhcmd1bWVudCBmb3IgYSB2YXJpYWRpYyBtYWNybyBwYXJhbWV0ZXIuCisjcHJhZ21h
IEdDQyBzeXN0ZW1faGVhZGVyCisKKy8vIERlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGZvciBiYWNr
aW5nIGEgY2F0ZWdvcnkgcmVnaXN0cnkuCisvLworLy8gRWFjaCBjYXRlZ29yeSBoYXMgb25lIGVu
YWJsZWQvZGlzYWJsZWQgYml0IHBlciBwb3NzaWJsZSBkYXRhIHNvdXJjZSBpbnN0YW5jZS4KKy8v
IFRoZSBiaXRzIGFyZSBwYWNrZWQsIGkuZS4sIGVhY2ggYnl0ZSBob2xkcyB0aGUgc3RhdGUgZm9y
IGluc3RhbmNlcy4gVG8KKy8vIGltcHJvdmUgY2FjaGUgbG9jYWxpdHksIHRoZSBiaXRzIGZvciBl
YWNoIGluc3RhbmNlIGFyZSBzdG9yZWQgc2VwYXJhdGVseSBmcm9tCisvLyB0aGUgbmFtZXMgb2Yg
dGhlIGNhdGVnb3JpZXM6CisvLworLy8gICBieXRlIDAgICAgICAgICAgICAgICAgICAgICAgYnl0
ZSAxCisvLyAgIChpbnN0MCwgaW5zdDEsIC4uLiwgaW5zdDcpLCAoaW5zdDAsIGluc3QxLCAuLi4s
IGluc3Q3KQorLy8KKyNkZWZpbmUgUEVSRkVUVE9fSU5URVJOQUxfREVDTEFSRV9DQVRFR09SSUVT
KC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGludGVybmFs
IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgY29uc3RleHByIDo6cGVyZmV0dG86OkNhdGVnb3J5IGtDYXRlZ29yaWVzW10gPSB7X19W
QV9BUkdTX199OyAgICAgICAgICAgICAgIFwKKyAgY29uc3RleHByIHNpemVfdCBrQ2F0ZWdvcnlD
b3VudCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg
IHNpemVvZihrQ2F0ZWdvcmllcykgLyBzaXplb2Yoa0NhdGVnb3JpZXNbMF0pOyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgLyogVGhlIHBlci1pbnN0YW5jZSBlbmFibGUvZGlzYWJsZSBz
dGF0ZSBwZXIgY2F0ZWdvcnkgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgZXh0ZXJuIHN0ZDo6
YXRvbWljPHVpbnQ4X3Q+IGdfY2F0ZWdvcnlfc3RhdGVfc3RvcmFnZVtrQ2F0ZWdvcnlDb3VudF07
ICAgICAgIFwKKyAgLyogVGhlIGNhdGVnb3J5IHJlZ2lzdHJ5IHdoaWNoIG1lZGlhdGVzIGFjY2Vz
cyB0byB0aGUgYWJvdmUgc3RydWN0dXJlcy4gKi8gIFwKKyAgLyogVGhlIHJlZ2lzdHJ5IGlzIHVz
ZWQgZm9yIHR3byBwdXJwb3NlczogKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgLyoqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogICAgMSkgRm9yIGxvb2tpbmcgdXAgY2F0ZWdv
cmllcyBhdCBidWlsZCAoY29uc3RleHByKSB0aW1lLiAqLyAgICAgICAgICAgIFwKKyAgLyogICAg
MikgRm9yIGRlY2xhcmluZyB0aGUgcGVyLW5hbWVzcGFjZSBUcmFja0V2ZW50IGRhdGEgc291cmNl
LiAqLyAgICAgICAgIFwKKyAgLyoqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogQmVjYXVzZSB1c2Fn
ZSAjMSByZXF1aXJlcyBhIGNvbnN0ZXhwciB0eXBlIGFuZCB1c2FnZSAjMiByZXF1aXJlcyBhbiAq
LyAgIFwKKyAgLyogZXh0ZXJuIHR5cGUgKHRvIGF2b2lkIGRlY2xhcmluZyBhIHR5cGUgYmFzZWQg
b24gYSB0cmFuc2xhdGlvbi11bml0ICovICAgIFwKKyAgLyogdmFyaWFibGUpLCB3ZSBuZWVkIHR3
byBzZXBhcmF0ZSBjb3BpZXMgb2YgdGhlIHJlZ2lzdHJ5IHdpdGggZGlmZmVyZW50ICovIFwKKyAg
Lyogc3RvcmFnZSBzcGVjaWZpZXJzLiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgLyoqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogVE9ETyhz
a3lvc3RpbCk6IFVuaWZ5IHRoZXNlIHVzaW5nIGEgQysrMTcgaW5saW5lIGNvbnN0ZXhwciB2YXJp
YWJsZS4gKi8gIFwKKyAgY29uc3RleHByIDo6cGVyZmV0dG86OmludGVybmFsOjpUcmFja0V2ZW50
Q2F0ZWdvcnlSZWdpc3RyeSAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGtDb25zdEV4cHJDYXRl
Z29yeVJlZ2lzdHJ5KGtDYXRlZ29yeUNvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ2F0ZWdvcmllc1swXSwgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICZnX2NhdGVnb3J5X3N0YXRlX3N0b3JhZ2VbMF0pOyAgICAgICAgICAgICAgIFwKKyAgUEVS
RkVUVE9fQ09NUE9ORU5UX0VYUE9SVCBleHRlcm4gY29uc3QgOjpwZXJmZXR0bzo6aW50ZXJuYWw6
OiAgICAgICAgICAgICAgIFwKKyAgICAgIFRyYWNrRXZlbnRDYXRlZ29yeVJlZ2lzdHJ5IGtDYXRl
Z29yeVJlZ2lzdHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljX2Fzc2Vy
dChrQ29uc3RFeHByQ2F0ZWdvcnlSZWdpc3RyeS5WYWxpZGF0ZUNhdGVnb3JpZXMoKSwgICAgICAg
ICAgICAgIFwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBjYXRlZ29yeSBuYW1lcyBmb3VuZCIp
OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgLy8gbmFtZXNwYWNlIGludGVy
bmFsCisKKy8vIEluIGEgLmNjIGZpbGUsIGRlY2xhcmVzIHN0b3JhZ2UgZm9yIGVhY2ggY2F0ZWdv
cnkncyBydW50aW1lIHN0YXRlLgorI2RlZmluZSBQRVJGRVRUT19JTlRFUk5BTF9DQVRFR09SWV9T
VE9SQUdFKCkgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RkOjphdG9taWM8
dWludDhfdD4gZ19jYXRlZ29yeV9zdGF0ZV9zdG9yYWdlW2tDYXRlZ29yeUNvdW50XTsgXAorICBQ
RVJGRVRUT19DT01QT05FTlRfRVhQT1JUIGNvbnN0ZXhwciA6OnBlcmZldHRvOjppbnRlcm5hbDo6
ICAgICBcCisgICAgICBUcmFja0V2ZW50Q2F0ZWdvcnlSZWdpc3RyeSBrQ2F0ZWdvcnlSZWdpc3Ry
eSggICAgICAgICAgICAgIFwKKyAgICAgICAgICBrQ2F0ZWdvcnlDb3VudCwgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICZrQ2F0ZWdvcmllc1swXSwg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgJmdfY2F0
ZWdvcnlfc3RhdGVfc3RvcmFnZVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAg
Ly8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIERlZmluZXMgdGhlIFRyYWNrRXZlbnQgZGF0YSBz
b3VyY2UgZm9yIHRoZSBjdXJyZW50IHRyYWNrIGV2ZW50IG5hbWVzcGFjZS4KKyNkZWZpbmUgUEVS
RkVUVE9fSU5URVJOQUxfREVDTEFSRV9UUkFDS19FVkVOVF9EQVRBX1NPVVJDRSgpIFwKKyAgc3Ry
dWN0IFBFUkZFVFRPX0NPTVBPTkVOVF9FWFBPUlQgVHJhY2tFdmVudCAgICAgICAgICAgICAgIFwK
KyAgICAgIDogcHVibGljIDo6cGVyZmV0dG86OmludGVybmFsOjpUcmFja0V2ZW50RGF0YVNvdXJj
ZTwgIFwKKyAgICAgICAgICAgIFRyYWNrRXZlbnQsICZpbnRlcm5hbDo6a0NhdGVnb3J5UmVnaXN0
cnk+IHt9CisKKy8vIEF0IGNvbXBpbGUgdGltZSwgdHVybnMgYSBjYXRlZ29yeSBuYW1lIHJlcHJl
c2VudGVkIGJ5IGEgc3RhdGljIHN0cmluZyBpbnRvIGFuCisvLyBpbmRleCBpbnRvIHRoZSBjdXJy
ZW50IGNhdGVnb3J5IHJlZ2lzdHJ5LiBBIGJ1aWxkIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGlm
CisvLyB0aGUgY2F0ZWdvcnkgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBvciBhZGRlZCB0byB0aGUg
bGlzdCBvZiBhbGxvd2VkIGR5bmFtaWMKKy8vIGNhdGVnb3JpZXMuIFNlZSBQRVJGRVRUT19ERUZJ
TkVfQ0FURUdPUklFUy4KKyNkZWZpbmUgUEVSRkVUVE9fR0VUX0NBVEVHT1JZX0lOREVYKGNhdGVn
b3J5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDo6UEVSRkVUVE9fVFJB
Q0tfRVZFTlRfTkFNRVNQQUNFOjppbnRlcm5hbDo6a0NvbnN0RXhwckNhdGVnb3J5UmVnaXN0cnku
RmluZCggXAorICAgICAgY2F0ZWdvcnksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6UEVSRkVUVE9fVFJBQ0tf
RVZFTlRfTkFNRVNQQUNFOjppbnRlcm5hbDo6SXNEeW5hbWljQ2F0ZWdvcnkoY2F0ZWdvcnkpKQor
CisvLyBHZW5lcmF0ZSBhIHVuaXF1ZSB2YXJpYWJsZSBuYW1lIHdpdGggYSBnaXZlbiBwcmVmaXgu
CisjZGVmaW5lIFBFUkZFVFRPX0lOVEVSTkFMX0NPTkNBVDIoYSwgYikgYSMjYgorI2RlZmluZSBQ
RVJGRVRUT19JTlRFUk5BTF9DT05DQVQoYSwgYikgUEVSRkVUVE9fSU5URVJOQUxfQ09OQ0FUMihh
LCBiKQorI2RlZmluZSBQRVJGRVRUT19VSUQocHJlZml4KSBQRVJGRVRUT19JTlRFUk5BTF9DT05D
QVQocHJlZml4LCBfX0xJTkVfXykKKworLy8gRWZmaWNpZW50bHkgZGV0ZXJtaW5lcyB3aGV0aGVy
IHRyYWNpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIGNhdGVnb3J5LCBhbmQKKy8vIGlmIHNv
LCBlbWl0cyBvbmUgdHJhY2UgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorI2RlZmlu
ZSBQRVJGRVRUT19JTlRFUk5BTF9UUkFDS19FVkVOVChjYXRlZ29yeSwgLi4uKSAgICAgICAgICAg
ICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lc3BhY2UgdG5zID0gOjpQ
RVJGRVRUT19UUkFDS19FVkVOVF9OQU1FU1BBQ0U7ICAgICAgICAgICAgICAgICAgICAgXAorICAg
IC8qIENvbXB1dGUgdGhlIGNhdGVnb3J5IGluZGV4IG91dHNpZGUgdGhlIGxhbWJkYSB0byB3b3Jr
IGFyb3VuZCBhICovICBcCisgICAgLyogR0NDIDcgYnVnICovICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdGV4cHIgYXV0byBQ
RVJGRVRUT19VSUQoa0NhdEluZGV4KSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICBQRVJGRVRUT19HRVRfQ0FURUdPUllfSU5ERVgoY2F0ZWdvcnkpOyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHRuczo6aW50ZXJuYWw6OklzRHluYW1pY0NhdGVn
b3J5KGNhdGVnb3J5KSkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRuczo6VHJhY2tF
dmVudDo6Q2FsbElmRW5hYmxlZChbJl0odWludDMyX3QgaW5zdGFuY2VzKSB7ICAgICAgICAgICAg
XAorICAgICAgICB0bnM6OlRyYWNrRXZlbnQ6OlRyYWNlRm9yQ2F0ZWdvcnk8UEVSRkVUVE9fVUlE
KGtDYXRJbmRleCk+KCAgICAgICBcCisgICAgICAgICAgICBpbnN0YW5jZXMsIGNhdGVnb3J5LCAj
I19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0pOyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0bnM6OlRyYWNrRXZlbnQ6OkNhbGxJZkNh
dGVnb3J5RW5hYmxlZDxQRVJGRVRUT19VSUQoa0NhdEluZGV4KT4oICAgIFwKKyAgICAgICAgICBb
Jl0odWludDMyX3QgaW5zdGFuY2VzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgICAgICAgICAgLyogVE9ETyhza3lvc3RpbCk6IEdldCByaWQgb2YgdGhlIGNh
dGVnb3J5IG5hbWUgcGFyYW1ldGVyLiAqLyBcCisgICAgICAgICAgICB0bnM6OlRyYWNrRXZlbnQ6
OlRyYWNlRm9yQ2F0ZWdvcnk8UEVSRkVUVE9fVUlEKGtDYXRJbmRleCk+KCAgIFwKKyAgICAgICAg
ICAgICAgICBpbnN0YW5jZXMsIG51bGxwdHIsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3
aGlsZSAoZmFsc2UpCisKKyNkZWZpbmUgUEVSRkVUVE9fSU5URVJOQUxfU0NPUEVEX1RSQUNLX0VW
RU5UKGNhdGVnb3J5LCBuYW1lLCAuLi4pICAgICAgICAgICAgIFwKKyAgc3RydWN0IFBFUkZFVFRP
X1VJRChTY29wZWRFdmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBzdHJ1Y3QgRXZlbnRGaW5hbGl6ZXIgeyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC8qIFRoZSBwYXJhbWV0ZXIgaXMg
YW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiBJdCBhbGxvd3MgdGhlICAgICAgICAgICovIFwKKyAg
ICAgIC8qIGFub255bW91cyBzdHJ1Y3QgdG8gdXNlIGFnZ3JlZ2F0ZSBpbml0aWFsaXphdGlvbiB0
byBpbnZva2UgdGhlICAgICovIFwKKyAgICAgIC8qIGxhbWJkYSAod2hpY2ggZW1pdHMgdGhlIEJF
R0lOIGV2ZW50IGFuZCByZXR1cm5zIGFuIGludGVnZXIpICAgICAgICovIFwKKyAgICAgIC8qIHdp
dGggdGhlIHByb3BlciByZWZlcmVuY2UgY2FwdHVyZSBmb3IgYW55ICAgICAgICAgICAgICAgICAg
ICAgICAgICovIFwKKyAgICAgIC8qIFRyYWNrRXZlbnRBcmd1bWVudEZ1bmN0aW9uIGluIHxfX1ZB
X0FSR1NfX3wuIFRoaXMgaXMgcmVxdWlyZWQgc28gICovIFwKKyAgICAgIC8qIHRoYXQgdGhlIHNj
b3BlZCBldmVudCBpcyBleGFjdGx5IE9ORSBsaW5lIGFuZCBjYW4ndCBlc2NhcGUgdGhlICAgICov
IFwKKyAgICAgIC8qIHNjb3BlIGlmIHVzZWQgaW4gYSBzaW5nbGUgbGluZSBpZiBzdGF0ZW1lbnQu
ICAgICAgICAgICAgICAgICAgICAgICovIFwKKyAgICAgIEV2ZW50RmluYWxpemVyKC4uLikge30g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg
IH5FdmVudEZpbmFsaXplcigpIHsgVFJBQ0VfRVZFTlRfRU5EKGNhdGVnb3J5KTsgfSAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICB9IGZpbmFsaXplcjsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBQRVJGRVRUT19V
SUQoc2NvcGVkX2V2ZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBbJl0oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0JFR0lO
KGNhdGVnb3J5LCBuYW1lLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9KCkgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisj
ZGVmaW5lIFBFUkZFVFRPX0lOVEVSTkFMX0NBVEVHT1JZX0VOQUJMRUQoY2F0ZWdvcnkpICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgKDo6UEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNF
OjppbnRlcm5hbDo6SXNEeW5hbWljQ2F0ZWdvcnkoY2F0ZWdvcnkpICAgXAorICAgICAgID8gOjpQ
RVJGRVRUT19UUkFDS19FVkVOVF9OQU1FU1BBQ0U6OlRyYWNrRXZlbnQ6OiAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgICAgICAgICAgSXNEeW5hbWljQ2F0ZWdvcnlFbmFibGVkKDo6cGVyZmV0
dG86OkR5bmFtaWNDYXRlZ29yeShjYXRlZ29yeSkpIFwKKyAgICAgICA6IDo6UEVSRkVUVE9fVFJB
Q0tfRVZFTlRfTkFNRVNQQUNFOjpUcmFja0V2ZW50OjpJc0NhdGVnb3J5RW5hYmxlZDwgICAgXAor
ICAgICAgICAgICAgIFBFUkZFVFRPX0dFVF9DQVRFR09SWV9JTkRFWChjYXRlZ29yeSk+KCkpCisK
KyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0lOVEVSTkFMX1RSQUNLX0VWRU5U
X01BQ1JPU19IXworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNv
dXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBW
ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxl
IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFp
biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hl
Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBs
aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs
CisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy
IGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj
IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVy
IHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RS
QUNLX0VWRU5UX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19FVkVO
VF9IXworCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9i
YXNlL3RpbWUuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfZGF0YV9zb3VyY2UuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwv
dHJhY2tfZXZlbnRfaW50ZXJuYWwuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvaW50ZXJuYWwvdHJhY2tfZXZlbnRfbWFjcm9zLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3Ry
YWNrLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90
cmFjaW5nL3RyYWNrX2V2ZW50X2NhdGVnb3J5X3JlZ2lzdHJ5LmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQv
dHJhY2tfZXZlbnQucGJ6ZXJvLmgiCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gVGhp
cyBmaWxlIGNvbnRhaW5zIGEgc2V0IG9mIG1hY3JvcyBkZXNpZ25lZCBmb3IgaW5zdHJ1bWVudGlu
ZyBhcHBsaWNhdGlvbnMKKy8vIHdpdGggdHJhY2sgZXZlbnQgdHJhY2UgcG9pbnRzLiBXaGlsZSB0
aGUgdW5kZXJseWluZyBUcmFja0V2ZW50IEFQSSBjYW4gYWxzbworLy8gYmUgdXNlZCBkaXJlY3Rs
eSwgZG9pbmcgc28gZWZmaWNpZW50bHkgcmVxdWlyZXMgc29tZSBjYXJlIChlLmcuLCB0byBhdm9p
ZAorLy8gZXZhbHVhdGluZyBhcmd1bWVudHMgd2hpbGUgdHJhY2luZyBpcyBkaXNhYmxlZCkuIFRo
ZXNlIHR5cGVzIG9mIG9wdGltaXphdGlvbnMKKy8vIGFyZSBhYnN0cmFjdGVkIGF3YXkgYnkgdGhl
IG1hY3JvcyBiZWxvdy4KKy8vCisvLyA9PT09PT09PT09PT09PT09CisvLyBRdWlja3N0YXJ0IGd1
aWRlCisvLyA9PT09PT09PT09PT09PT09CisvLworLy8gICBUbyBhZGQgdHJhY2sgZXZlbnRzIHRv
IHlvdXIgYXBwbGljYXRpb24sIGZpcnN0IGRlZmluZSB5b3VyIGNhdGVnb3JpZXMgaW4sCisvLyAg
IGUuZy4sIG15X3RyYWNpbmcuaDoKKy8vCisvLyAgICAgICBQRVJGRVRUT19ERUZJTkVfQ0FURUdP
UklFUygKKy8vICAgICAgICAgICBwZXJmZXR0bzo6Q2F0ZWdvcnkoImJhc2UiKSwKKy8vICAgICAg
ICAgICBwZXJmZXR0bzo6Q2F0ZWdvcnkoInY4IiksCisvLyAgICAgICAgICAgcGVyZmV0dG86OkNh
dGVnb3J5KCJjYyIpKTsKKy8vCisvLyAgIFRoZW4gaW4gYSBzaW5nbGUgLmNjIGZpbGUsIGUuZy4s
IG15X3RyYWNpbmcuY2M6CisvLworLy8gICAgICAgI2luY2x1ZGUgIm15X3RyYWNpbmcuaCIKKy8v
ICAgICAgIFBFUkZFVFRPX1RSQUNLX0VWRU5UX1NUQVRJQ19TVE9SQUdFKCk7CisvLworLy8gICBG
aW5hbGx5LCByZWdpc3RlciB0cmFjayBldmVudHMgYXQgc3RhcnR1cCwgYWZ0ZXIgd2hpY2ggeW91
IGNhbiByZWNvcmQKKy8vICAgZXZlbnRzIHdpdGggdGhlIFRSQUNFX0VWRU5UIG1hY3JvczoKKy8v
CisvLyAgICAgICAjaW5jbHVkZSAibXlfdHJhY2luZy5oIgorLy8KKy8vICAgICAgIGludCBtYWlu
KCkgeworLy8gICAgICAgICBwZXJmZXR0bzo6VHJhY2tFdmVudDo6UmVnaXN0ZXIoKTsKKy8vCisv
LyAgICAgICAgIC8vIEEgYmFzaWMgdHJhY2sgZXZlbnQgd2l0aCBqdXN0IGEgbmFtZS4KKy8vICAg
ICAgICAgVFJBQ0VfRVZFTlQoImNhdGVnb3J5IiwgIk15RXZlbnQiKTsKKy8vCisvLyAgICAgICAg
IC8vIEEgdHJhY2sgZXZlbnQgd2l0aCAodXAgdG8gdHdvKSBkZWJ1ZyBhbm5vdGF0aW9ucy4KKy8v
ICAgICAgICAgVFJBQ0VfRVZFTlQoImNhdGVnb3J5IiwgIk15RXZlbnQiLCAicGFyYW1ldGVyIiwg
NDIpOworLy8KKy8vICAgICAgICAgLy8gQSB0cmFjayBldmVudCB3aXRoIGEgc3Ryb25nbHkgdHlw
ZWQgcGFyYW1ldGVyLgorLy8gICAgICAgICBUUkFDRV9FVkVOVCgiY2F0ZWdvcnkiLCAiTXlFdmVu
dCIsIFtdKHBlcmZldHRvOjpFdmVudENvbnRleHQgY3R4KSB7CisvLyAgICAgICAgICAgY3R4LmV2
ZW50KCktPnNldF9mb28oNDIpOworLy8gICAgICAgICAgIGN0eC5ldmVudCgpLT5zZXRfYmFyKC41
Zik7CisvLyAgICAgICAgIH0pOworLy8gICAgICAgfQorLy8KKy8vICBOb3RlIHRoYXQgdHJhY2sg
ZXZlbnRzIG11c3QgYmUgbmVzdGVkIGNvbnNpc3RlbnRseSwgaS5lLiwgdGhlIGZvbGxvd2luZyBp
cworLy8gIG5vdCBhbGxvd2VkOgorLy8KKy8vICAgIFRSQUNFX0VWRU5UX0JFR0lOKCJhIiwgImJh
ciIsIC4uLik7CisvLyAgICBUUkFDRV9FVkVOVF9CRUdJTigiYiIsICJmb28iLCAuLi4pOworLy8g
ICAgVFJBQ0VfRVZFTlRfRU5EKCJhIik7ICAvLyAiZm9vIiBtdXN0IGJlIGNsb3NlZCBiZWZvcmUg
ImJhciIuCisvLyAgICBUUkFDRV9FVkVOVF9FTkQoImIiKTsKKy8vCisvLyA9PT09PT09PT09PT09
PT09PT09PQorLy8gSW1wbGVtZW50YXRpb24gbm90ZXMKKy8vID09PT09PT09PT09PT09PT09PT09
CisvLworLy8gVGhlIHRyYWNrIGV2ZW50IGxpYnJhcnkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2lu
ZyBsYXllcnMgYW5kIGNvbXBvbmVudHMuIFRoZQorLy8gY2xhc3NlcyB0aGUgaW50ZXJuYWwgbmFt
ZXNwYWNlIHNob3VsZG4ndCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYworLy8gQVBJ
LgorLy8gICAgICAgICAgICAgICAgICAgIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS4KKy8vICAgICAgICAgICAgICAgLi0tLS18ICBUUkFDRV9FVkVOVCAgICAgICAgICAgICAgICAg
ICB8LS0tLS4KKy8vICAgICAgd3JpdGUgICB8ICAgICB8ICAgLSBBcHAgaW5zdHJ1bWVudGF0aW9u
IHBvaW50ICB8ICAgICB8ICB3cml0ZQorLy8gICAgICBldmVudCAgIHwgICAgICctLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLScgICAgIHwgIGFyZ3VtZW50cworLy8gICAgICAgICAgICAg
IFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKKy8vICAuLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4gICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLgorLy8gIHwgVHJhY2tFdmVudCAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8
IEV2ZW50Q29udGV4dCAgICAgICAgICAgICAgICB8CisvLyAgfCAgLSBSZWdpc3RyeSBvZiBldmVu
dCBjYXRlZ29yaWVzICB8ICAgIHwgIC0gT25lIHRyYWNrIGV2ZW50IGluc3RhbmNlIHwKKy8vICAn
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScgICAgJy0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tJworLy8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxvb2sgdXAKKy8vICAgICAgICAgICAgICB8IGlz
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludGVybmluZyBpZHMK
Ky8vICAgICAgICAgICAgICBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBWCisvLyAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uICAgIC4tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKy8vICB8IGludGVybmFsOjpUcmFja0V2ZW50RGF0
YVNvdXJjZSAgIHwgICAgfCBUcmFja0V2ZW50SW50ZXJuZWREYXRhSW5kZXggfAorLy8gIHwgLSBQ
ZXJmZXR0byBkYXRhIHNvdXJjZSAgICAgICAgICAgfCAgICB8IC0gQ29ycmVzcG9uZHMgdG8gYSBm
aWVsZCBpbiB8CisvLyAgfCAtIEhhcyBUcmFja0V2ZW50SW5jcmVtZW50YWxTdGF0ZSB8ICAgIHwg
ICBpbiBpbnRlcm5lZF9kYXRhLnByb3RvICAgIHwKKy8vICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLScgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworLy8gICAg
ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIF4K
Ky8vICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICBvd25zICgxOm1hbnkp
ICAgICB8CisvLyAgICAgICAgICAgICAgfCB3cml0ZSBldmVudCAgICAgICctLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tJworLy8gICAgICAgICAgICAgIFYKKy8vICAuLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS4KKy8vICB8IGludGVybmFsOjpUcmFja0V2ZW50SW50ZXJuYWwgICAg
IHwKKy8vICB8IC0gT3V0bGluZWQgY29kZSB0byBzZXJpYWxpemUgICAgIHwKKy8vICB8ICAgb25l
IHRyYWNrIGV2ZW50ICAgICAgICAgICAgICAgIHwKKy8vICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLScKKy8vCisKKy8vIEVhY2ggY29tcGlsYXRpb24gdW5pdCBjYW4gYmUgaW4g
ZXhhY3RseSBvbmUgdHJhY2sgZXZlbnQgbmFtZXNwYWNlLAorLy8gYWxsb3dpbmcgdGhlIG92ZXJh
bGwgcHJvZ3JhbSB0byB1c2UgbXVsdGlwbGUgdHJhY2sgZXZlbnQgZGF0YSBzb3VyY2VzIGFuZAor
Ly8gY2F0ZWdvcnkgbGlzdHMgaWYgbmVjZXNzYXJ5LiBVc2UgdGhpcyBtYWNybyB0byBzZWxlY3Qg
dGhlIG5hbWVzcGFjZSBmb3IgdGhlCisvLyBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuCisvLwor
Ly8gSWYgdGhlIHByb2dyYW0gdXNlcyBtdWx0aXBsZSB0cmFjayBldmVudCBuYW1lc3BhY2VzLCBj
YXRlZ29yeSAmIHRyYWNrIGV2ZW50CisvLyByZWdpc3RyYXRpb24gKHNlZSBxdWlja3N0YXJ0IGFi
b3ZlKSBuZWVkcyB0byBoYXBwZW4gZm9yIGJvdGggbmFtZXNwYWNlcworLy8gc2VwYXJhdGVseS4K
KyNpZm5kZWYgUEVSRkVUVE9fVFJBQ0tfRVZFTlRfTkFNRVNQQUNFCisjZGVmaW5lIFBFUkZFVFRP
X1RSQUNLX0VWRU5UX05BTUVTUEFDRSBwZXJmZXR0bworI2VuZGlmCisKKy8vIERlcHJlY2F0ZWQ7
IHNlZSBwZXJmZXR0bzo6Q2F0ZWdvcnkoKS4KKyNkZWZpbmUgUEVSRkVUVE9fQ0FURUdPUlkobmFt
ZSkgXAorICA6OnBlcmZldHRvOjpDYXRlZ29yeSB7ICNuYW1lIH0KKworLy8gSW50ZXJuYWwgaGVs
cGVycyBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBnaXZlbiBjYXRlZ29yeSBpcyBkZWZpbmVkIGF0IGJ1
aWxkIG9yCisvLyBydW50aW1lLgorbmFtZXNwYWNlIFBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVT
UEFDRSB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBCeSBkZWZhdWx0IG5vIHN0YXRpY2Fs
bHkgZGVmaW5lZCBjYXRlZ29yaWVzIGFyZSBkeW5hbWljLCBidXQgdGhpcyBjYW4gYmUKKy8vIG92
ZXJyaWRkZW4gd2l0aCBQRVJGRVRUT19ERUZJTkVfVEVTVF9DQVRFR09SWV9QUkVGSVhFUy4KK3Rl
bXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorY29uc3RleHByIGJvb2wgSXNEeW5hbWljQ2F0ZWdvcnko
Y29uc3QgY2hhciopIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBFeHBsaWNpdGx5IGR5bmFt
aWMgY2F0ZWdvcmllcyBhcmUgYWx3YXlzIGR5bmFtaWMuCitjb25zdGV4cHIgYm9vbCBJc0R5bmFt
aWNDYXRlZ29yeShjb25zdCA6OnBlcmZldHRvOjpEeW5hbWljQ2F0ZWdvcnkmKSB7CisgIHJldHVy
biB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBQ
RVJGRVRUT19UUkFDS19FVkVOVF9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKKwor
Ly8gQSB3cmFwcGVyIGZvciBtYXJraW5nIHN0cmluZ3MgdGhhdCBjYW4ndCBiZSBkZXRlcm1pbmVk
IHRvIGJlIHN0YXRpYyBhdCBidWlsZAorLy8gdGltZSwgYnV0IGFyZSBpbiBmYWN0IHN0YXRpYy4K
K2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBTdGF0aWNTdHJpbmcgZmluYWwgeworIHB1YmxpYzoKKyAg
Y29uc3QgY2hhciogdmFsdWU7CisKKyAgb3BlcmF0b3IgY29uc3QgY2hhciooKSBjb25zdCB7IHJl
dHVybiB2YWx1ZTsgfQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSB2b2lkPgorY29uc3RleHByIGJvb2wgSXNTdGF0aWNTdHJpbmcoY29uc3QgY2hh
ciopIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUID0gdm9pZD4K
K2NvbnN0ZXhwciBib29sIElzU3RhdGljU3RyaW5nKC4uLikgeworICByZXR1cm4gZmFsc2U7Cit9
CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisK
Ky8vIE5vcm1hbGx5IGFsbCBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkIHN0YXRpY2FsbHkgYXQgYnVp
bGQtdGltZSAoc2VlCisvLyBQRVJGRVRUT19ERUZJTkVfQ0FURUdPUklFUykuIEhvd2V2ZXIsIHNv
bWUgY2F0ZWdvcmllcyBhcmUgb25seSB1c2VkIGZvcgorLy8gdGVzdGluZywgYW5kIHdlIHNob3Vs
ZG4ndCBwdWJsaXNoIHRoZW0gdG8gdGhlIHRyYWNpbmcgc2VydmljZSBvciBpbmNsdWRlIHRoZW0K
Ky8vIGluIGEgcHJvZHVjdGlvbiBiaW5hcnkuIFVzZSB0aGlzIG1hY3JvIHRvIGRlZmluZSBhIGxp
c3Qgb2YgcHJlZml4ZXMgZm9yIHRoZXNlCisvLyB0eXBlcyBvZiBjYXRlZ29yaWVzLiBOb3RlIHRo
YXQgdHJhY2UgcG9pbnRzIHVzaW5nIHRoZXNlIGNhdGVnb3JpZXMgd2lsbCBiZQorLy8gc2xpZ2h0
bHkgbGVzcyBlZmZpY2llbnQgY29tcGFyZWQgdG8gcmVndWxhciB0cmFjZSBwb2ludHMuCisjZGVm
aW5lIFBFUkZFVFRPX0RFRklORV9URVNUX0NBVEVHT1JZX1BSRUZJWEVTKC4uLikgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIFBFUkZFVFRPX1RSQUNLX0VWRU5UX05BTUVTUEFD
RSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgaW50ZXJuYWwg
eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
IHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgY29uc3RleHByIGJvb2wgSXNEeW5hbWljQ2F0ZWdvcnkoY29u
c3QgY2hhciogbmFtZSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiA6OnBlcmZl
dHRvOjppbnRlcm5hbDo6SXNTdHJpbmdJblByZWZpeExpc3QobmFtZSwgX19WQV9BUkdTX18pOyBc
CisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgfSAvKiBuYW1lc3BhY2UgaW50ZXJuYWwgKi8gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IC8qIG5hbWVzcGFj
ZSBQRVJGRVRUT19UUkFDS19FVkVOVF9OQU1FU1BBQ0UgKi8gICAgICAgICAgICAgICAgICAgICAg
ICBcCisgIFBFUkZFVFRPX0lOVEVSTkFMX1NXQUxMT1dfU0VNSUNPTE9OKCkKKworLy8gUmVnaXN0
ZXIgdGhlIHNldCBvZiBhdmFpbGFibGUgY2F0ZWdvcmllcyBieSBwYXNzaW5nIGEgbGlzdCBvZiBj
YXRlZ29yaWVzIHRvCisvLyB0aGlzIG1hY3JvOiBQRVJGRVRUT19DQVRFR09SWShjYXQxKSwgUEVS
RkVUVE9fQ0FURUdPUlkoY2F0MiksIC4uLgorI2RlZmluZSBQRVJGRVRUT19ERUZJTkVfQ0FURUdP
UklFUyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgUEVSRkVUVE9f
VFJBQ0tfRVZFTlRfTkFNRVNQQUNFIHsgICAgICAgICAgICAgICAgICAgXAorICAvKiBUaGUgbGlz
dCBvZiBjYXRlZ29yeSBuYW1lcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQ
RVJGRVRUT19JTlRFUk5BTF9ERUNMQVJFX0NBVEVHT1JJRVMoX19WQV9BUkdTX18pICAgICAgICAg
ICAgXAorICAvKiBUaGUgdHJhY2sgZXZlbnQgZGF0YSBzb3VyY2UgZm9yIHRoaXMgc2V0IG9mIGNh
dGVnb3JpZXMgKi8gXAorICBQRVJGRVRUT19JTlRFUk5BTF9ERUNMQVJFX1RSQUNLX0VWRU5UX0RB
VEFfU09VUkNFKCk7ICAgICAgICAgXAorICB9IC8qIG5hbWVzcGFjZSBQRVJGRVRUT19UUkFDS19F
VkVOVF9OQU1FU1BBQ0UgKi8gICAgICAgICAgICAgXAorICBQRVJGRVRUT19ERUNMQVJFX0RBVEFf
U09VUkNFX1NUQVRJQ19NRU1CRVJTKCAgICAgICAgICAgICAgICAgXAorICAgICAgUEVSRkVUVE9f
VFJBQ0tfRVZFTlRfTkFNRVNQQUNFOjpUcmFja0V2ZW50LCAgICAgICAgICAgICAgXAorICAgICAg
cGVyZmV0dG86OmludGVybmFsOjpUcmFja0V2ZW50RGF0YVNvdXJjZVRyYWl0cykKKworLy8gQWxs
b2NhdGUgc3RvcmFnZSBmb3IgZWFjaCBjYXRlZ29yeSBieSB1c2luZyB0aGlzIG1hY3JvIG9uY2Ug
cGVyIHRyYWNrIGV2ZW50CisvLyBuYW1lc3BhY2UuCisjZGVmaW5lIFBFUkZFVFRPX1RSQUNLX0VW
RU5UX1NUQVRJQ19TVE9SQUdFKCkgICAgICBcCisgIG5hbWVzcGFjZSBQRVJGRVRUT19UUkFDS19F
VkVOVF9OQU1FU1BBQ0UgeyAgICAgICBcCisgIFBFUkZFVFRPX0lOVEVSTkFMX0NBVEVHT1JZX1NU
T1JBR0UoKSAgICAgICAgICAgICBcCisgIH0gLyogbmFtZXNwYWNlIFBFUkZFVFRPX1RSQUNLX0VW
RU5UX05BTUVTUEFDRSAqLyBcCisgIFBFUkZFVFRPX0RFRklORV9EQVRBX1NPVVJDRV9TVEFUSUNf
TUVNQkVSUyggICAgICBcCisgICAgICBQRVJGRVRUT19UUkFDS19FVkVOVF9OQU1FU1BBQ0U6OlRy
YWNrRXZlbnQsICBcCisgICAgICBwZXJmZXR0bzo6aW50ZXJuYWw6OlRyYWNrRXZlbnREYXRhU291
cmNlVHJhaXRzKQorCisvLyBJZ25vcmUgR0NDIHdhcm5pbmcgYWJvdXQgYSBtaXNzaW5nIGFyZ3Vt
ZW50IGZvciBhIHZhcmlhZGljIG1hY3JvIHBhcmFtZXRlci4KKyNwcmFnbWEgR0NDIHN5c3RlbV9o
ZWFkZXIKKworLy8gRW5zdXJlIHRoYXQgfHN0cmluZ3wgaXMgYSBzdGF0aWMgY29uc3RhbnQgc3Ry
aW5nLgorLy8KKy8vIElmIHlvdSBnZXQgYSBjb21waWxlciBmYWlsdXJlIGhlcmUsIHlvdSBhcmUg
bW9zdCBsaWtlbHkgdHJ5aW5nIHRvIHVzZQorLy8gVFJBQ0VfRVZFTlQgd2l0aCBhIGR5bmFtaWMg
ZXZlbnQgbmFtZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIGZpeCB0aGlzOgorLy8KKy8vIDEpIElm
IHRoZSBldmVudCBuYW1lIGlzIGFjdHVhbGx5IGR5bmFtaWMgKGUuZy4sIHN0ZDo6c3RyaW5nKSwg
d3JpdGUgaXQgaW50bworLy8gICAgdGhlIGV2ZW50IG1hbnVhbGx5OgorLy8KKy8vICAgICAgVFJB
Q0VfRVZFTlQoImNhdGVnb3J5IiwgbnVsbHB0ciwgWyZdKHBlcmZldHRvOjpFdmVudENvbnRleHQg
Y3R4KSB7CisvLyAgICAgICAgY3R4LmV2ZW50KCktPnNldF9uYW1lKGR5bmFtaWNfbmFtZSk7Cisv
LyAgICAgIH0pOworLy8KKy8vIDIpIElmIHRoZSBuYW1lIGlzIHN0YXRpYywgYnV0IHRoZSBwb2lu
dGVyIGlzIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHdyYXAgaXQKKy8vICAgIHdpdGggcGVyZmV0dG86
OlN0YXRpY1N0cmluZzoKKy8vCisvLyAgICAgIFRSQUNFX0VWRU5UKCJjYXRlZ29yeSIsIHBlcmZl
dHRvOjpTdGF0aWNTdHJpbmd7bmFtZX0pOworLy8KKy8vICAgIERBTkdFUjogVXNpbmcgcGVyZmV0
dG86OlN0YXRpY1N0cmluZyB3aXRoIHN0cmluZ3Mgd2hvc2UgY29udGVudHMgY2hhbmdlCisvLyAg
ICAgICAgICAgIGR5bmFtaWNhbGx5IGNhbiBjYXVzZSBzaWxlbnQgdHJhY2UgZGF0YSBjb3JydXB0
aW9uLgorLy8KKyNkZWZpbmUgUEVSRkVUVE9fR0VUX1NUQVRJQ19TVFJJTkcoc3RyaW5nKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgWyZdKCkgeyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBz
dGF0aWNfYXNzZXJ0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0cmluZyksIDo6
cGVyZmV0dG86OlN0YXRpY1N0cmluZz46OnZhbHVlIHx8IFwKKyAgICAgICAgICAgIDo6cGVyZmV0
dG86OmludGVybmFsOjpJc1N0YXRpY1N0cmluZyhzdHJpbmcpLCAgICAgICAgICAgICAgICAgIFwK
KyAgICAgICAgIlN0cmluZyBtdXN0IGJlIHN0YXRpYyIpOyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+
KHN0cmluZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSgpCisKKy8vIEJl
Z2luIGEgc2xpY2UgdW5kZXIgfGNhdGVnb3J5fCB3aXRoIHRoZSB0aXRsZSB8bmFtZXwuIEJvdGgg
c3RyaW5ncyBtdXN0IGJlCisvLyBzdGF0aWMgY29uc3RhbnRzLiBUaGUgdHJhY2sgZXZlbnQgaXMg
b25seSByZWNvcmRlZCBpZiB8Y2F0ZWdvcnl8IGlzIGVuYWJsZWQKKy8vIGZvciBhIHRyYWNpbmcg
c2Vzc2lvbi4KKy8vCisvLyBUaGUgc2xpY2UgaXMgdGhyZWFkLXNjb3BlZCAoaS5lLiwgd3JpdHRl
biB0byB0aGUgZGVmYXVsdCB0cmFjayBvZiB0aGUgY3VycmVudAorLy8gdGhyZWFkKSB1bmxlc3Mg
b3ZlcnJpZGRlbiB3aXRoIGEgY3VzdG9tIHRyYWNrIG9iamVjdCAoc2VlIFRyYWNrKS4KKy8vCisv
LyB8bmFtZXwgbXVzdCBiZSBhIHN0cmluZyB3aXRoIHN0YXRpYyBsaWZldGltZSAoaS5lLiwgdGhl
IHNhbWUKKy8vIGFkZHJlc3MgbXVzdCBub3QgYmUgdXNlZCBmb3IgYSBkaWZmZXJlbnQgZXZlbnQg
bmFtZSBpbiB0aGUgZnV0dXJlKS4gSWYgeW91CisvLyB3YW50IHRvIHVzZSBhIGR5bmFtaWNhbGx5
IGFsbG9jYXRlZCBuYW1lLCBkbyB0aGlzOgorLy8KKy8vICBUUkFDRV9FVkVOVCgiY2F0ZWdvcnki
LCBudWxscHRyLCBbJl0ocGVyZmV0dG86OkV2ZW50Q29udGV4dCBjdHgpIHsKKy8vICAgIGN0eC5l
dmVudCgpLT5zZXRfbmFtZShkeW5hbWljX25hbWUpOworLy8gIH0pOworLy8KKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfQkVHSU4oY2F0ZWdvcnksIG5hbWUsIC4uLikgICAgXAorICBQRVJGRVRUT19JTlRF
Uk5BTF9UUkFDS19FVkVOVCggICAgICAgICAgICAgICAgICBcCisgICAgICBjYXRlZ29yeSwgUEVS
RkVUVE9fR0VUX1NUQVRJQ19TVFJJTkcobmFtZSksIFwKKyAgICAgIDo6cGVyZmV0dG86OnByb3Rv
czo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUWVBFX1NMSUNFX0JFR0lOLCAjI19fVkFfQVJHU19fKQor
CisvLyBFbmQgYSBzbGljZSB1bmRlciB8Y2F0ZWdvcnl8LgorI2RlZmluZSBUUkFDRV9FVkVOVF9F
TkQoY2F0ZWdvcnksIC4uLikgXAorICBQRVJGRVRUT19JTlRFUk5BTF9UUkFDS19FVkVOVCggICAg
ICAgXAorICAgICAgY2F0ZWdvcnksIG51bGxwdHIsICAgICAgICAgICAgICAgXAorICAgICAgOjpw
ZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlRZUEVfU0xJQ0VfRU5ELCAjI19f
VkFfQVJHU19fKQorCisvLyBCZWdpbiBhIHNsaWNlIHdoaWNoIGdldHMgYXV0b21hdGljYWxseSBj
bG9zZWQgd2hlbiBnb2luZyBvdXQgb2Ygc2NvcGUuCisjZGVmaW5lIFRSQUNFX0VWRU5UKGNhdGVn
b3J5LCBuYW1lLCAuLi4pIFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfU0NPUEVEX1RSQUNLX0VWRU5U
KGNhdGVnb3J5LCBuYW1lLCAjI19fVkFfQVJHU19fKQorCisvLyBFbWl0IGEgc2xpY2Ugd2hpY2gg
aGFzIHplcm8gZHVyYXRpb24uCisjZGVmaW5lIFRSQUNFX0VWRU5UX0lOU1RBTlQoY2F0ZWdvcnks
IG5hbWUsIC4uLikgIFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfVFJBQ0tfRVZFTlQoICAgICAgICAg
ICAgICAgICAgXAorICAgICAgY2F0ZWdvcnksIFBFUkZFVFRPX0dFVF9TVEFUSUNfU1RSSU5HKG5h
bWUpLCBcCisgICAgICA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VFlQ
RV9JTlNUQU5ULCAjI19fVkFfQVJHU19fKQorCisvLyBFZmZpY2llbnRseSBkZXRlcm1pbmUgaWYg
dGhlIGdpdmVuIHN0YXRpYyBvciBkeW5hbWljIHRyYWNlIGNhdGVnb3J5IG9yCisvLyBjYXRlZ29y
eSBncm91cCBpcyBlbmFibGVkIGZvciB0cmFjaW5nLgorI2RlZmluZSBUUkFDRV9FVkVOVF9DQVRF
R09SWV9FTkFCTEVEKGNhdGVnb3J5KSBcCisgIFBFUkZFVFRPX0lOVEVSTkFMX0NBVEVHT1JZX0VO
QUJMRUQoY2F0ZWdvcnkpCisKKy8vIFRPRE8oc2t5b3N0aWwpOiBBZGQgZmxvdyBldmVudHMuCisv
LyBUT0RPKHNreW9zdGlsKTogQWRkIGNvdW50ZXJzLgorCisjZW5kaWYgIC8vIElOQ0xVREVfUEVS
RkVUVE9fVFJBQ0lOR19UUkFDS19FVkVOVF9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50X2ludGVybmVkX2RhdGFf
aW5kZXguaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJj
ZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJz
aW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4
Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBh
IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9y
Zy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNh
YmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVk
IHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisg
KiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4
cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxh
bmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRo
ZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX1RSQUNL
X0VWRU5UX0lOVEVSTkVEX0RBVEFfSU5ERVhfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19U
UkFDSU5HX1RSQUNLX0VWRU5UX0lOVEVSTkVEX0RBVEFfSU5ERVhfSF8KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vdHJhY2luZy9pbnRlcm5hbC90cmFj
a19ldmVudF9pbnRlcm5hbC5oIgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9iYXNlL2NvbXBpbGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2V2ZW50X2NvbnRleHQuaCIKKworI2luY2x1
ZGUgPG1hcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFw
PgorCisvLyBUaGlzIGZpbGUgaGFzIHRlbXBsYXRlcyBmb3IgZGVmaW5pbmcgeW91ciBvd24gaW50
ZXJuZWQgZGF0YSB0eXBlcyB0byBiZSB1c2VkCisvLyB3aXRoIHRyYWNrIGV2ZW50LiBJbnRlcm5l
ZCBkYXRhIGNhbiBiZSB1c2VmdWwgZm9yIGF2b2lkaW5nIHJlcGVhdGluZyB0aGUgc2FtZQorLy8g
Y29uc3RhbnQgZGF0YSAoZS5nLiwgc3RyaW5ncykgdGhyb3VnaG91dCB0aGUgdHJhY2UuCisvLwor
Ly8gPT09PT09PT09PT09PQorLy8gRXhhbXBsZSB1c2FnZQorLy8gPT09PT09PT09PT09PQorLy8K
Ky8vIEZpcnN0IGRlZmluZSBhbiBpbnRlcm5pbmcgaW5kZXggZm9yIHlvdXIgdHlwZS4gSXQgc2hv
dWxkIG1hcCB0byBhIHNwZWNpZmljCisvLyBmaWVsZCBvZiBpbnRlcm5lZF9kYXRhLnByb3RvIGFu
ZCBkZWZpbmUgaG93IHRoZSBpbnRlcm5lZCBkYXRhIGlzIHdyaXR0ZW4gaW50bworLy8gdGhhdCBt
ZXNzYWdlLgorLy8KKy8vICAgc3RydWN0IE15SW50ZXJuZWREYXRhCisvLyAgICAgICA6IHB1Ymxp
YyBwZXJmZXR0bzo6VHJhY2tFdmVudEludGVybmVkRGF0YUluZGV4PAorLy8gICAgICAgICAgIE15
SW50ZXJuZWREYXRhLAorLy8gICAgICAgICAgIHBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6SW50
ZXJuZWREYXRhOjprTXlJbnRlcm5lZERhdGFGaWVsZE51bWJlciwKKy8vICAgICAgICAgICBjb25z
dCBjaGFyKj4geworLy8gICAgIHN0YXRpYyB2b2lkIEFkZChwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OkludGVybmVkRGF0YSogaW50ZXJuZWRfZGF0YSwKKy8vICAgICAgICAgICAgICAgICAgICAg
IHNpemVfdCBpaWQsCisvLyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSkg
eworLy8gICAgICAgYXV0byBteV9kYXRhID0gaW50ZXJuZWRfZGF0YS0+YWRkX215X2ludGVybmVk
X2RhdGEoKTsKKy8vICAgICAgIG15X2RhdGEtPnNldF9paWQoaWlkKTsKKy8vICAgICAgIG15X2Rh
dGEtPnNldF92YWx1ZSh2YWx1ZSk7CisvLyAgICAgfQorLy8gICB9OworLy8KKy8vIE5leHQsIHVz
ZSB5b3VyIGludGVybmVkIGRhdGEgaW4gYSB0cmFjZSBwb2ludCBhcyBzaG93biBiZWxvdy4gVGhl
IGludGVybmVkCisvLyBzdHJpbmcgd2lsbCBvbmx5IGJlIGVtaXR0ZWQgdGhlIGZpcnN0IHRpbWUg
dGhlIHRyYWNlIHBvaW50IGlzIGhpdC4KKy8vCisvLyAgIFRSQUNFX0VWRU5UX0JFR0lOKAorLy8g
ICAgICAiY2F0ZWdvcnkiLCAiRXZlbnQiLCBbJl0ocGVyZmV0dG86OkV2ZW50Q29udGV4dCBjdHgp
IHsKKy8vICAgICAgICBhdXRvIG15X21lc3NhZ2UgPSBjdHguZXZlbnQoKS0+c2V0X215X21lc3Nh
Z2UoKTsKKy8vICAgICAgICBzaXplX3QgaWlkID0gTXlJbnRlcm5lZERhdGE6OkdldCgmY3R4LCAi
U29tZSBkYXRhIik7CisvLyAgICAgICAgbXlfbWVzc2FnZS0+c2V0X2lpZChpaWQpOworLy8gICAg
ICB9KTsKKy8vCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CisKKy8vIEJ5IGRlZmF1bHQsIHRoZSBp
bnRlcm5pbmcgaW5kZXggc3RvcmVzIGEgZnVsbCBjb3B5IG9mIHRoZSBpbnRlcm5lZCBkYXRhLiBU
aGlzCisvLyBlbnN1cmVzIHRoZSBzYW1lIGRhdGEgaXMgYWx3YXlzIG1hcHBlZCB0byB0aGUgc2Ft
ZSBpbnRlcm5pbmcgaWQsIGFuZCB0aGVyZSBpcworLy8gbm8gZGFuZ2VyIG9mIGNvbGxpc2lvbnMu
IFRoaXMgY29tZXMgYXQgdGhlIGNvc3Qgb2YgbWVtb3J5IHVzYWdlLCBob3dldmVyLCBzbworLy8g
Y29uc2lkZXIgdXNpbmcgSGFzaGVkSW50ZXJuZWREYXRhVHJhaXRzIGlmIHRoYXQgbWF5IGJlIGFu
IGlzc3VlLgorLy8KKy8vIFRoaXMgdHlwZSBvZiBpbmRleCBhbHNvIHBlcmZvcm1zIGhhc2hpbmcg
b24gdGhlIHN0b3JlZCBkYXRhIGZvciBsb29rdXBzOyBmb3IKKy8vIHR5cGVzIHdoZXJlIHRoaXMg
aXNuJ3QgbmVjZXNzYXJ5IChlLmcuLCByYXcgY29uc3QgY2hhciopLCB1c2UKKy8vIFNtYWxsSW50
ZXJuZWREYXRhVHJhaXRzLgorc3RydWN0IEJpZ0ludGVybmVkRGF0YVRyYWl0cyB7CisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGU+CisgIGNsYXNzIEluZGV4IHsKKyAgIHB1YmxpYzoKKyAg
ICBib29sIExvb2tVcE9ySW5zZXJ0KHNpemVfdCogaWlkLCBjb25zdCBWYWx1ZVR5cGUmIHZhbHVl
KSB7CisgICAgICBzaXplX3QgbmV4dF9pZCA9IGRhdGFfLnNpemUoKSArIDE7CisgICAgICBhdXRv
IGl0X2FuZF9pbnNlcnRlZCA9IGRhdGFfLmluc2VydChzdGQ6Om1ha2VfcGFpcih2YWx1ZSwgbmV4
dF9pZCkpOworICAgICAgaWYgKCFpdF9hbmRfaW5zZXJ0ZWQuc2Vjb25kKSB7CisgICAgICAgICpp
aWQgPSBpdF9hbmRfaW5zZXJ0ZWQuZmlyc3QtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICB9CisgICAgICAqaWlkID0gbmV4dF9pZDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZhbHVlVHlwZSwgc2l6
ZV90PiBkYXRhXzsKKyAgfTsKK307CisKKy8vIFRoaXMgdHlwZSBvZiBpbnRlcm5pbmcgaW5kZXgg
a2VlcHMgZnVsbCBjb3BpZXMgb2YgaW50ZXJuZWQgZGF0YSB3aXRob3V0CisvLyBoYXNoaW5nIHRo
ZSB2YWx1ZXMuIFRoaXMgaXMgYSBnb29kIGZpdCBmb3Igc21hbGwgdHlwZXMgdGhhdCBjYW4gYmUg
ZGlyZWN0bHkKKy8vIHVzZWQgYXMgaW5kZXgga2V5cy4KK3N0cnVjdCBTbWFsbEludGVybmVkRGF0
YVRyYWl0cyB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGU+CisgIGNsYXNzIEluZGV4
IHsKKyAgIHB1YmxpYzoKKyAgICBib29sIExvb2tVcE9ySW5zZXJ0KHNpemVfdCogaWlkLCBjb25z
dCBWYWx1ZVR5cGUmIHZhbHVlKSB7CisgICAgICBzaXplX3QgbmV4dF9pZCA9IGRhdGFfLnNpemUo
KSArIDE7CisgICAgICBhdXRvIGl0X2FuZF9pbnNlcnRlZCA9IGRhdGFfLmluc2VydChzdGQ6Om1h
a2VfcGFpcih2YWx1ZSwgbmV4dF9pZCkpOworICAgICAgaWYgKCFpdF9hbmRfaW5zZXJ0ZWQuc2Vj
b25kKSB7CisgICAgICAgICppaWQgPSBpdF9hbmRfaW5zZXJ0ZWQuZmlyc3QtPnNlY29uZDsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAqaWlkID0gbmV4dF9pZDsKKyAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjptYXA8VmFsdWVU
eXBlLCBzaXplX3Q+IGRhdGFfOworICB9OworfTsKKworLy8gVGhpcyB0eXBlIG9mIGludGVybmlu
ZyBpbmRleCBvbmx5IHN0b3JlcyB0aGUgaGFzaCBvZiB0aGUgaW50ZXJuZWQgdmFsdWVzCisvLyBp
bnN0ZWFkIG9mIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcy4gVGhpcyBpcyBtb3JlIGVmZmljaWVudCBp
biB0ZXJtcyBvZiBtZW1vcnkKKy8vIHVzYWdlLCBidXQgYXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBu
byBoYXNoIGNvbGxpc2lvbnMuIElmIGEgaGFzaCBjb2xsaXNpb24KKy8vIG9jY3VycywgdHdvIG9y
IG1vcmUgdmFsdWVzIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBzYW1lIGludGVybmluZyBpZC4KKy8v
CisvLyBOb3RlIHRoYXQgdGhlIGdpdmVuIHR5cGUgbXVzdCBoYXZlIGEgc3BlY2lhbGl6YXRpb24g
Zm9yIHN0ZDo6aGFzaC4KK3N0cnVjdCBIYXNoZWRJbnRlcm5lZERhdGFUcmFpdHMgeworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVmFsdWVUeXBlPgorICBjbGFzcyBJbmRleCB7CisgICBwdWJsaWM6Cisg
ICAgYm9vbCBMb29rVXBPckluc2VydChzaXplX3QqIGlpZCwgY29uc3QgVmFsdWVUeXBlJiB2YWx1
ZSkgeworICAgICAgYXV0byBrZXkgPSBzdGQ6Omhhc2g8VmFsdWVUeXBlPigpKHZhbHVlKTsKKyAg
ICAgIHNpemVfdCBuZXh0X2lkID0gZGF0YV8uc2l6ZSgpICsgMTsKKyAgICAgIGF1dG8gaXRfYW5k
X2luc2VydGVkID0gZGF0YV8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgbmV4dF9pZCkpOwor
ICAgICAgaWYgKCFpdF9hbmRfaW5zZXJ0ZWQuc2Vjb25kKSB7CisgICAgICAgICppaWQgPSBpdF9h
bmRfaW5zZXJ0ZWQuZmlyc3QtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9
CisgICAgICAqaWlkID0gbmV4dF9pZDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
IHByaXZhdGU6CisgICAgc3RkOjptYXA8c2l6ZV90LCBzaXplX3Q+IGRhdGFfOworICB9OworfTsK
KworLy8gQSB0ZW1wbGF0ZWQgYmFzZSBjbGFzcyBmb3IgYW4gaW50ZXJuZWQgZGF0YSB0eXBlIHdo
aWNoIGNvcnJlc3BvbmRzIHRvIGEgZmllbGQKKy8vIGluIGludGVybmVkX2RhdGEucHJvdG8uCisv
LworLy8gfEludGVybmVkRGF0YVR5cGV8IG11c3QgYmUgdGhlIHR5cGUgb2YgdGhlIHN1YmNsYXNz
LgorLy8gfEZpZWxkTnVtYmVyfCBpcyB0aGUgY29ycmVzcG9uZGluZyBwcm90b2J1ZiBmaWVsZCBp
biBJbnRlcm5lZERhdGEuCisvLyB8VmFsdWVUeXBlfCBpcyB0aGUgdHlwZSB3aGljaCBpcyBzdG9y
ZWQgaW4gdGhlIGluZGV4LiBJdCBtdXN0IGJlIGNvcHlhYmxlLgorLy8gfFRyYWl0c3wgY2FuIGJl
IHVzZWQgdG8gY3VzdG9taXplIHRoZSBzdG9yYWdlIGFuZCBsb29rdXAgbWVjaGFuaXNtLgorLy8K
Ky8vIFRoZSBzdWJjbGFzcyBzaG91bGQgZGVmaW5lIGEgc3RhdGljIG1ldGhvZCB3aXRoIHRoZSBm
b2xsb3dpbmcgc2lnbmF0dXJlIGZvcgorLy8gY29tbWl0dGluZyBpbnRlcm5lZCBkYXRhIHRvZ2V0
aGVyIHdpdGggdGhlIGludGVybmluZyBpZCB8aWlkfCBpbnRvIHRoZSB0cmFjZToKKy8vCisvLyAg
IHN0YXRpYyB2b2lkIEFkZChwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkludGVybmVkRGF0YSos
CisvLyAgICAgICAgICAgICAgICAgICBzaXplX3QgaWlkLAorLy8gICAgICAgICAgICAgICAgICAg
Y29uc3QgVmFsdWVUeXBlJiB2YWx1ZSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEludGVybmVk
RGF0YVR5cGUsCisgICAgICAgICAgc2l6ZV90IEZpZWxkTnVtYmVyLAorICAgICAgICAgIHR5cGVu
YW1lIFZhbHVlVHlwZSwKKyAgICAgICAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBoYXNoaW5nIGZv
ciBwb2ludGVycyBieSBkZWZhdWx0LgorICAgICAgICAgIHR5cGVuYW1lIFRyYWl0cyA9CisgICAg
ICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8KHN0ZDo6aXNfcG9pbnRlcjxWYWx1
ZVR5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
U21hbGxJbnRlcm5lZERhdGFUcmFpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgQmlnSW50ZXJuZWREYXRhVHJhaXRzPjo6dHlwZT4KK2NsYXNzIFRyYWNrRXZlbnRJ
bnRlcm5lZERhdGFJbmRleAorICAgIDogcHVibGljIGludGVybmFsOjpCYXNlVHJhY2tFdmVudElu
dGVybmVkRGF0YUluZGV4IHsKKyBwdWJsaWM6CisgIC8vIFJldHVybiBhbiBpbnRlcm5pbmcgaWQg
Zm9yIHx2YWx1ZXwuIFRoZSByZXR1cm5lZCBpZCBjYW4gYmUgaW1tZWRpYXRlbHkKKyAgLy8gd3Jp
dHRlbiB0byB0aGUgdHJhY2UuIFRoZSBvcHRpb25hbCB8YWRkX2FyZ3N8IGFyZSBwYXNzZWQgdG8g
dGhlIEFkZCgpCisgIC8vIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4K
KyAgc3RhdGljIHNpemVfdCBHZXQoRXZlbnRDb250ZXh0KiBjdHgsCisgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIEFyZ3MmJi4u
LiBhZGRfYXJncykgeworICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSB2YWx1ZSBleGlzdHMgaW4g
dGhlIGRpY3Rpb25hcnkuCisgICAgYXV0byBpbmRleF9mb3JfZmllbGQgPSBHZXRPckNyZWF0ZUlu
ZGV4Rm9yRmllbGQoY3R4LT5pbmNyZW1lbnRhbF9zdGF0ZV8pOworICAgIHNpemVfdCBpaWQ7Cisg
ICAgaWYgKFBFUkZFVFRPX0xJS0VMWShpbmRleF9mb3JfZmllbGQtPmluZGV4Xy5Mb29rVXBPcklu
c2VydCgmaWlkLCB2YWx1ZSkpKSB7CisgICAgICBQRVJGRVRUT19EQ0hFQ0soaWlkKTsKKyAgICAg
IHJldHVybiBpaWQ7CisgICAgfQorCisgICAgLy8gSWYgbm90LCB3ZSBuZWVkIHRvIHNlcmlhbGl6
ZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJuZWQgdmFsdWUgaW50bworICAgIC8vIHRoZSBo
ZWFwIGJ1ZmZlcmVkIG1lc3NhZ2UgKHdoaWNoIGlzIGNvbW1pdHRlZCB0byB0aGUgdHJhY2Ugd2hl
biB0aGUKKyAgICAvLyBwYWNrZXQgZW5kcykuCisgICAgUEVSRkVUVE9fRENIRUNLKGlpZCk7Cisg
ICAgSW50ZXJuZWREYXRhVHlwZTo6QWRkKAorICAgICAgICBjdHgtPmluY3JlbWVudGFsX3N0YXRl
Xy0+c2VyaWFsaXplZF9pbnRlcm5lZF9kYXRhLmdldCgpLCBpaWQsCisgICAgICAgIHN0ZDo6bW92
ZSh2YWx1ZSksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhZGRfYXJncykuLi4pOworICAgIHJldHVybiBp
aWQ7CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBJbnRlcm5lZERhdGFUeXBlKiBHZXRPckNy
ZWF0ZUluZGV4Rm9yRmllbGQoCisgICAgICBpbnRlcm5hbDo6VHJhY2tFdmVudEluY3JlbWVudGFs
U3RhdGUqIGluY3JlbWVudGFsX3N0YXRlKSB7CisgICAgLy8gRmFzdCBwYXRoOiBsb29rIGZvciBt
YXRjaGluZyBmaWVsZCBudW1iZXIuCisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGluY3Jl
bWVudGFsX3N0YXRlLT5pbnRlcm5lZF9kYXRhX2luZGljZXMpIHsKKyAgICAgIGlmIChlbnRyeS5m
aXJzdCA9PSBGaWVsZE51bWJlcikgeworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgICAg
ICAgIGlmIChzdHJjbXAoUEVSRkVUVE9fREVCVUdfRlVOQ1RJT05fSURFTlRJRklFUigpLAorICAg
ICAgICAgICAgICAgICAgIGVudHJ5LnNlY29uZC0+dHlwZV9pZF8pKSB7CisgICAgICAgICAgUEVS
RkVUVE9fRkFUQUwoCisgICAgICAgICAgICAgICJJbnRlcm5lZCBkYXRhIGFjY2Vzc2VkIHVuZGVy
IGRpZmZlcmVudCB0eXBlcyEgUHJldmlvdXMgdHlwZTogIgorICAgICAgICAgICAgICAiJXMuIE5l
dyB0eXBlOiAlcy4iLAorICAgICAgICAgICAgICBlbnRyeS5zZWNvbmQtPnR5cGVfaWRfLCBQRVJG
RVRUT19ERUJVR19GVU5DVElPTl9JREVOVElGSUVSKCkpOworICAgICAgICB9CisjZW5kaWYgIC8v
IFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0
PEludGVybmVkRGF0YVR5cGUqPihlbnRyeS5zZWNvbmQuZ2V0KCkpOworICAgICAgfQorICAgIH0K
KyAgICAvLyBObyBtYXRjaCAtLSBhZGQgYSBuZXcgZW50cnkgZm9yIHRoaXMgZmllbGQuCisgICAg
Zm9yIChhdXRvJiBlbnRyeSA6IGluY3JlbWVudGFsX3N0YXRlLT5pbnRlcm5lZF9kYXRhX2luZGlj
ZXMpIHsKKyAgICAgIGlmICghZW50cnkuZmlyc3QpIHsKKyAgICAgICAgZW50cnkuZmlyc3QgPSBG
aWVsZE51bWJlcjsKKyAgICAgICAgZW50cnkuc2Vjb25kLnJlc2V0KG5ldyBJbnRlcm5lZERhdGFU
eXBlKCkpOworI2lmIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgICAgICAgIGVudHJ5LnNlY29u
ZC0+dHlwZV9pZF8gPSBQRVJGRVRUT19ERUJVR19GVU5DVElPTl9JREVOVElGSUVSKCk7CisjZW5k
aWYgIC8vIFBFUkZFVFRPX0RDSEVDS19JU19PTigpCisgICAgICAgIHJldHVybiByZWludGVycHJl
dF9jYXN0PEludGVybmVkRGF0YVR5cGUqPihlbnRyeS5zZWNvbmQuZ2V0KCkpOworICAgICAgfQor
ICAgIH0KKyAgICAvLyBPdXQgb2Ygc3BhY2UgaW4gdGhlIGludGVybmVkIGRhdGEgaW5kZXggdGFi
bGUuCisgICAgUEVSRkVUVE9fQ0hFQ0soZmFsc2UpOworICB9CisKKyAgLy8gVGhlIGFjdHVhbCBp
bnRlcm5pbmcgZGljdGlvbmFyeSBmb3IgdGhpcyB0eXBlIG9mIGludGVybmVkIGRhdGEuIFRoZSBh
Y3R1YWwKKyAgLy8gY29udGFpbmVyIHR5cGUgaXMgZGVmaW5lZCBieSB8VHJhaXRzfCwgaGVuY2Ug
dGhlIGV4dHJhIGxheWVyIG9mIHRlbXBsYXRlCisgIC8vIGluZGlyZWN0aW9uIGhlcmUuCisgIHR5
cGVuYW1lIFRyYWl0czo6dGVtcGxhdGUgSW5kZXg8VmFsdWVUeXBlPiBpbmRleF87Cit9OworCit9
ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RS
QUNJTkdfVFJBQ0tfRVZFTlRfSU5URVJORURfREFUQV9JTkRFWF9IXworLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50X2xl
Z2FjeS5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNl
IFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp
b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn
L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi
bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAq
IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw
cmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu
Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhl
IExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfVFJBQ0tf
RVZFTlRfTEVHQUNZX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fVFJBQ0lOR19UUkFDS19F
VkVOVF9MRUdBQ1lfSF8KKworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBjb21wYXRpYmlsaXR5IHNo
aW0gYmV0d2VlbiBsZWdhY3kgKENocm9tZSwgVjgpIHRyYWNlCisvLyBldmVudCBtYWNyb3MgYW5k
IHRyYWNrIGV2ZW50cy4gVG8gYXZvaWQgYWNjaWRlbnRhbGx5IGludHJvZHVjaW5nIGxlZ2FjeQor
Ly8gZXZlbnRzIGluIG5ldyBjb2RlLCB0aGUgUEVSRkVUVE9fRU5BQkxFX0xFR0FDWV9UUkFDRV9F
VkVOVFMgbWFjcm8gbXVzdCBiZSBzZXQKKy8vIHRvIDEgYWN0aXZhdGUgdGhlIGNvbXBhdGliaWxp
dHkgbGF5ZXIuCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL2Jhc2UvY29tcGlsZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3RyYWNpbmcvdHJhY2tfZXZlbnQuaCIKKworI2luY2x1ZGUgPHN0ZGludC5o
PgorCisjaWZuZGVmIFBFUkZFVFRPX0VOQUJMRV9MRUdBQ1lfVFJBQ0VfRVZFTlRTCisjZGVmaW5l
IFBFUkZFVFRPX0VOQUJMRV9MRUdBQ1lfVFJBQ0VfRVZFTlRTIDAKKyNlbmRpZgorCisvLyBJZ25v
cmUgR0NDIHdhcm5pbmcgYWJvdXQgYSBtaXNzaW5nIGFyZ3VtZW50IGZvciBhIHZhcmlhZGljIG1h
Y3JvIHBhcmFtZXRlci4KKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQorLy8gQ29uc3RhbnRzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1l
c3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIGxlZ2FjeSB7CisKK2VudW0gVHJhY2VFdmVudEZs
YWcgeworICBrVHJhY2VFdmVudEZsYWdOb25lID0gMCwKKyAga1RyYWNlRXZlbnRGbGFnQ29weSA9
IDF1IDw8IDAsCisgIGtUcmFjZUV2ZW50RmxhZ0hhc0lkID0gMXUgPDwgMSwKKyAga1RyYWNlRXZl
bnRGbGFnU2NvcGVPZmZzZXQgPSAxdSA8PCAyLAorICBrVHJhY2VFdmVudEZsYWdTY29wZUV4dHJh
ID0gMXUgPDwgMywKKyAga1RyYWNlRXZlbnRGbGFnRXhwbGljaXRUaW1lc3RhbXAgPSAxdSA8PCA0
LAorICBrVHJhY2VFdmVudEZsYWdBc3luY1RUUyA9IDF1IDw8IDUsCisgIGtUcmFjZUV2ZW50Rmxh
Z0JpbmRUb0VuY2xvc2luZyA9IDF1IDw8IDYsCisgIGtUcmFjZUV2ZW50RmxhZ0Zsb3dJbiA9IDF1
IDw8IDcsCisgIGtUcmFjZUV2ZW50RmxhZ0Zsb3dPdXQgPSAxdSA8PCA4LAorICBrVHJhY2VFdmVu
dEZsYWdIYXNDb250ZXh0SWQgPSAxdSA8PCA5LAorICBrVHJhY2VFdmVudEZsYWdIYXNQcm9jZXNz
SWQgPSAxdSA8PCAxMCwKKyAga1RyYWNlRXZlbnRGbGFnSGFzTG9jYWxJZCA9IDF1IDw8IDExLAor
ICBrVHJhY2VFdmVudEZsYWdIYXNHbG9iYWxJZCA9IDF1IDw8IDEyLAorICAvLyBUT0RPKGVzZWNr
bGVyKTogUmVtb3ZlIG9uY2Ugd2UgaGF2ZSBuYXRpdmUgc3VwcG9ydCBmb3IgdHlwZWQgcHJvdG8g
ZXZlbnRzCisgIC8vIGluIFRSQUNFX0VWRU5UIG1hY3Jvcy4KKyAga1RyYWNlRXZlbnRGbGFnVHlw
ZWRQcm90b0FyZ3MgPSAxdSA8PCAxNSwKKyAga1RyYWNlRXZlbnRGbGFnSmF2YVN0cmluZ0xpdGVy
YWxzID0gMXUgPDwgMTYsCit9OworCitlbnVtIFBlcmZldHRvTGVnYWN5Q3VycmVudFRocmVhZElk
IHsga0N1cnJlbnRUaHJlYWRJZCB9OworCit9ICAvLyBuYW1lc3BhY2UgbGVnYWN5Cit9ICAvLyBu
YW1lc3BhY2UgcGVyZmV0dG8KKworI2lmIFBFUkZFVFRPX0VOQUJMRV9MRUdBQ1lfVFJBQ0VfRVZF
TlRTCisvLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFs
IG5hbWVzcGFjZSwgc2luY2UgdGhleSB3ZXJlCisvLyBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGFz
IG1hY3Jvcy4KKworLy8gRXZlbnQgcGhhc2VzLgorc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNF
X0VWRU5UX1BIQVNFX0JFR0lOID0gJ0InOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VW
RU5UX1BIQVNFX0VORCA9ICdFJzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9Q
SEFTRV9DT01QTEVURSA9ICdYJzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9Q
SEFTRV9JTlNUQU5UID0gJ0knOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BI
QVNFX0FTWU5DX0JFR0lOID0gJ1MnOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5U
X1BIQVNFX0FTWU5DX1NURVBfSU5UTyA9ICdUJzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFD
RV9FVkVOVF9QSEFTRV9BU1lOQ19TVEVQX1BBU1QgPSAncCc7CitzdGF0aWMgY29uc3RleHByIGNo
YXIgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfRU5EID0gJ0YnOworc3RhdGljIGNvbnN0ZXhwciBj
aGFyIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0JFR0lOID0gJ2InOworc3RhdGlj
IGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0VORCA9ICdl
JzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lO
Q19JTlNUQU5UID0gJ24nOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNF
X0ZMT1dfQkVHSU4gPSAncyc7CitzdGF0aWMgY29uc3RleHByIGNoYXIgVFJBQ0VfRVZFTlRfUEhB
U0VfRkxPV19TVEVQID0gJ3QnOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BI
QVNFX0ZMT1dfRU5EID0gJ2YnOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BI
QVNFX01FVEFEQVRBID0gJ00nOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BI
QVNFX0NPVU5URVIgPSAnQyc7CitzdGF0aWMgY29uc3RleHByIGNoYXIgVFJBQ0VfRVZFTlRfUEhB
U0VfU0FNUExFID0gJ1AnOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1BIQVNF
X0NSRUFURV9PQkpFQ1QgPSAnTic7CitzdGF0aWMgY29uc3RleHByIGNoYXIgVFJBQ0VfRVZFTlRf
UEhBU0VfU05BUFNIT1RfT0JKRUNUID0gJ08nOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIFRSQUNF
X0VWRU5UX1BIQVNFX0RFTEVURV9PQkpFQ1QgPSAnRCc7CitzdGF0aWMgY29uc3RleHByIGNoYXIg
VFJBQ0VfRVZFTlRfUEhBU0VfTUVNT1JZX0RVTVAgPSAndic7CitzdGF0aWMgY29uc3RleHByIGNo
YXIgVFJBQ0VfRVZFTlRfUEhBU0VfTUFSSyA9ICdSJzsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBU
UkFDRV9FVkVOVF9QSEFTRV9DTE9DS19TWU5DID0gJ2MnOworc3RhdGljIGNvbnN0ZXhwciBjaGFy
IFRSQUNFX0VWRU5UX1BIQVNFX0VOVEVSX0NPTlRFWFQgPSAnKCc7CitzdGF0aWMgY29uc3RleHBy
IGNoYXIgVFJBQ0VfRVZFTlRfUEhBU0VfTEVBVkVfQ09OVEVYVCA9ICcpJzsKKworLy8gRmxhZ3Mg
Zm9yIGNoYW5naW5nIHRoZSBiZWhhdmlvciBvZiBUUkFDRV9FVkVOVF9BUElfQUREX1RSQUNFX0VW
RU5ULgorc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX05PTkUgPQor
ICAgIHBlcmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ05vbmU7CitzdGF0aWMgY29uc3Rl
eHByIHVpbnQzMl90IFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSA9CisgICAgcGVyZmV0dG86OmxlZ2Fj
eTo6a1RyYWNlRXZlbnRGbGFnQ29weTsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBQ0Vf
RVZFTlRfRkxBR19IQVNfSUQgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50Rmxh
Z0hhc0lkOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX1NDT1BF
X09GRlNFVCA9CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnU2NvcGVPZmZz
ZXQ7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQUNFX0VWRU5UX0ZMQUdfU0NPUEVfRVhU
UkEgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ1Njb3BlRXh0cmE7Citz
dGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQUNFX0VWRU5UX0ZMQUdfRVhQTElDSVRfVElNRVNU
QU1QID0KKyAgICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VFdmVudEZsYWdFeHBsaWNpdFRpbWVz
dGFtcDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVFJBQ0VfRVZFTlRfRkxBR19BU1lOQ19U
VFMgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0FzeW5jVFRTOworc3Rh
dGljIGNvbnN0ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX0JJTkRfVE9fRU5DTE9TSU5H
ID0KKyAgICBwZXJmZXR0bzo6bGVnYWN5OjprVHJhY2VFdmVudEZsYWdCaW5kVG9FbmNsb3Npbmc7
CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQUNFX0VWRU5UX0ZMQUdfRkxPV19JTiA9Cisg
ICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnRmxvd0luOworc3RhdGljIGNvbnN0
ZXhwciB1aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX0ZMT1dfT1VUID0KKyAgICBwZXJmZXR0bzo6
bGVnYWN5OjprVHJhY2VFdmVudEZsYWdGbG93T3V0Oworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJf
dCBUUkFDRV9FVkVOVF9GTEFHX0hBU19DT05URVhUX0lEID0KKyAgICBwZXJmZXR0bzo6bGVnYWN5
OjprVHJhY2VFdmVudEZsYWdIYXNDb250ZXh0SWQ7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90
IFRSQUNFX0VWRU5UX0ZMQUdfSEFTX1BST0NFU1NfSUQgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6
OmtUcmFjZUV2ZW50RmxhZ0hhc1Byb2Nlc3NJZDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qg
VFJBQ0VfRVZFTlRfRkxBR19IQVNfTE9DQUxfSUQgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6OmtU
cmFjZUV2ZW50RmxhZ0hhc0xvY2FsSWQ7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQUNF
X0VWRU5UX0ZMQUdfSEFTX0dMT0JBTF9JRCA9CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNl
RXZlbnRGbGFnSGFzR2xvYmFsSWQ7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQUNFX0VW
RU5UX0ZMQUdfVFlQRURfUFJPVE9fQVJHUyA9CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a1RyYWNl
RXZlbnRGbGFnVHlwZWRQcm90b0FyZ3M7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFRSQUNF
X0VWRU5UX0ZMQUdfSkFWQV9TVFJJTkdfTElURVJBTFMgPQorICAgIHBlcmZldHRvOjpsZWdhY3k6
OmtUcmFjZUV2ZW50RmxhZ0phdmFTdHJpbmdMaXRlcmFsczsKKworc3RhdGljIGNvbnN0ZXhwciB1
aW50MzJfdCBUUkFDRV9FVkVOVF9GTEFHX1NDT1BFX01BU0sgPQorICAgIFRSQUNFX0VWRU5UX0ZM
QUdfU0NPUEVfT0ZGU0VUIHwgVFJBQ0VfRVZFTlRfRkxBR19TQ09QRV9FWFRSQTsKKworLy8gVHlw
ZSB2YWx1ZXMgZm9yIGlkZW50aWZ5aW5nIHR5cGVzIGluIHRoZSBUcmFjZVZhbHVlIHVuaW9uLgor
c3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFRSQUNFX1ZBTFVFX1RZUEVfQk9PTCA9IDE7CitzdGF0
aWMgY29uc3RleHByIHVpbnQ4X3QgVFJBQ0VfVkFMVUVfVFlQRV9VSU5UID0gMjsKK3N0YXRpYyBj
b25zdGV4cHIgdWludDhfdCBUUkFDRV9WQUxVRV9UWVBFX0lOVCA9IDM7CitzdGF0aWMgY29uc3Rl
eHByIHVpbnQ4X3QgVFJBQ0VfVkFMVUVfVFlQRV9ET1VCTEUgPSA0Oworc3RhdGljIGNvbnN0ZXhw
ciB1aW50OF90IFRSQUNFX1ZBTFVFX1RZUEVfUE9JTlRFUiA9IDU7CitzdGF0aWMgY29uc3RleHBy
IHVpbnQ4X3QgVFJBQ0VfVkFMVUVfVFlQRV9TVFJJTkcgPSA2Oworc3RhdGljIGNvbnN0ZXhwciB1
aW50OF90IFRSQUNFX1ZBTFVFX1RZUEVfQ09QWV9TVFJJTkcgPSA3Oworc3RhdGljIGNvbnN0ZXhw
ciB1aW50OF90IFRSQUNFX1ZBTFVFX1RZUEVfQ09OVkVSVEFCTEUgPSA4OworCisvLyBFbnVtIHJl
ZmxlY3RpbmcgdGhlIHNjb3BlIG9mIGFuIElOU1RBTlQgZXZlbnQuIE11c3QgZml0IHdpdGhpbgor
Ly8gVFJBQ0VfRVZFTlRfRkxBR19TQ09QRV9NQVNLLgorc3RhdGljIGNvbnN0ZXhwciB1aW50OF90
IFRSQUNFX0VWRU5UX1NDT1BFX0dMT0JBTCA9IDB1IDw8IDI7CitzdGF0aWMgY29uc3RleHByIHVp
bnQ4X3QgVFJBQ0VfRVZFTlRfU0NPUEVfUFJPQ0VTUyA9IDF1IDw8IDI7CitzdGF0aWMgY29uc3Rl
eHByIHVpbnQ4X3QgVFJBQ0VfRVZFTlRfU0NPUEVfVEhSRUFEID0gMnUgPDwgMjsKKworc3RhdGlj
IGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1NDT1BFX05BTUVfR0xPQkFMID0gJ2cnOworc3Rh
dGljIGNvbnN0ZXhwciBjaGFyIFRSQUNFX0VWRU5UX1NDT1BFX05BTUVfUFJPQ0VTUyA9ICdwJzsK
K3N0YXRpYyBjb25zdGV4cHIgY2hhciBUUkFDRV9FVkVOVF9TQ09QRV9OQU1FX1RIUkVBRCA9ICd0
JzsKKworc3RhdGljIGNvbnN0ZXhwciBhdXRvIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVB
RF9JRCA9CisgICAgcGVyZmV0dG86OmxlZ2FjeTo6a0N1cnJlbnRUaHJlYWRJZDsKKworI2VuZGlm
ICAvLyBQRVJGRVRUT19FTkFCTEVfTEVHQUNZX1RSQUNFX0VWRU5UUworCisvLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisvLyBJbnRlcm5hbCBsZWdhY3kgdHJhY2UgcG9pbnQgaW1wbGVtZW50YXRpb24u
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3Bh
Y2UgbGVnYWN5IHsKKworLy8gVGhlIGZvbGxvd2luZyB1c2VyLXByb3ZpZGVkIGFkYXB0b3JzIGFy
ZSB1c2VkIHRvIHNlcmlhbGl6ZSB1c2VyLWRlZmluZWQKKy8vIHRocmVhZCBpZCBhbmQgdGltZSB0
eXBlcyBpbnRvIHRyYWNrIGV2ZW50cy4gRm9yIGZ1bGwgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIK
Ky8vIHNob3VsZCBhbHNvIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBhcHByb3ByaWF0ZWx5
OgorLy8KKy8vICAgI2RlZmluZSBUUkFDRV9USU1FX1RJQ0tTX05PVygpIC4uLgorLy8gICAjZGVm
aW5lIFRSQUNFX1RJTUVfTk9XKCkgLi4uCisKKy8vIFVzZXItcHJvdmlkZWQgZnVuY3Rpb24gdG8g
Y29udmVydCBhbiBhYnN0cmFjdCB0aHJlYWQgaWQgaW50byBlaXRoZXIgYSB0cmFjaworLy8gdXVp
ZCBvciBhIHBpZC90aWQgb3ZlcnJpZGUuIFJldHVybiB0cnVlIGlmIHRoZSBjb252ZXJzaW9uIHN1
Y2NlZWRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBDb252ZXJ0VGhyZWFkSWQoY29u
c3QgVCYsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogdHJhY2tfdXVpZF9vdXQsCisg
ICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwaWRfb3ZlcnJpZGVfb3V0LAorICAgICAgICAg
ICAgICAgICAgICAgaW50MzJfdCogdGlkX292ZXJyaWRlX291dCk7CisKKy8vIFVzZXItcHJvdmlk
ZWQgZnVuY3Rpb24gdG8gY29udmVydCBhbiBhYnN0cmFjdCB0aW1lc3RhbXAgaW50byB0aGUgdHJh
Y2UgY2xvY2sKKy8vIHRpbWViYXNlIGluIG5hbm9zZWNvbmRzLgordGVtcGxhdGUgPHR5cGVuYW1l
IFQ+Cit1aW50NjRfdCBDb252ZXJ0VGltZXN0YW1wVG9UcmFjZVRpbWVOcyhjb25zdCBUJik7CisK
Ky8vIEJ1aWx0LWluIGltcGxlbWVudGF0aW9uIGZvciBldmVudHMgcmVmZXJyaW5nIHRvIHRoZSBj
dXJyZW50IHRocmVhZC4KK3RlbXBsYXRlIDw+Citib29sIFBFUkZFVFRPX0VYUE9SVCBDb252ZXJ0
VGhyZWFkSWQoY29uc3QgUGVyZmV0dG9MZWdhY3lDdXJyZW50VGhyZWFkSWQmLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbnQzMl90Kik7CisKK30gIC8vIG5hbWVzcGFjZSBsZWdhY3kKKworbmFtZXNw
YWNlIGludGVybmFsIHsKKworLy8gTGVnYWN5VHJhY2VJZCBlbmNhcHN1bGF0ZXMgYW4gSUQgdGhh
dCBjYW4gZWl0aGVyIGJlIGFuIGludGVnZXIgb3IgcG9pbnRlci4KK2NsYXNzIFBFUkZFVFRPX0VY
UE9SVCBMZWdhY3lUcmFjZUlkIHsKKyBwdWJsaWM6CisgIC8vIENhbiBiZSBjb21iaW5lZCB3aXRo
IFdpdGhTY29wZS4KKyAgY2xhc3MgTG9jYWxJZCB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQg
TG9jYWxJZChjb25zdCB2b2lkKiByYXdfaWQpCisgICAgICAgIDogcmF3X2lkXyhzdGF0aWNfY2Fz
dDx1aW50NjRfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJhd19pZCkpKSB7fQorICAg
IGV4cGxpY2l0IExvY2FsSWQodWludDY0X3QgcmF3X2lkKSA6IHJhd19pZF8ocmF3X2lkKSB7fQor
ICAgIHVpbnQ2NF90IHJhd19pZCgpIGNvbnN0IHsgcmV0dXJuIHJhd19pZF87IH0KKworICAgcHJp
dmF0ZToKKyAgICB1aW50NjRfdCByYXdfaWRfOworICB9OworCisgIC8vIENhbiBiZSBjb21iaW5l
ZCB3aXRoIFdpdGhTY29wZS4KKyAgY2xhc3MgR2xvYmFsSWQgeworICAgcHVibGljOgorICAgIGV4
cGxpY2l0IEdsb2JhbElkKHVpbnQ2NF90IHJhd19pZCkgOiByYXdfaWRfKHJhd19pZCkge30KKyAg
ICB1aW50NjRfdCByYXdfaWQoKSBjb25zdCB7IHJldHVybiByYXdfaWRfOyB9CisKKyAgIHByaXZh
dGU6CisgICAgdWludDY0X3QgcmF3X2lkXzsKKyAgfTsKKworICBjbGFzcyBXaXRoU2NvcGUgewor
ICAgcHVibGljOgorICAgIFdpdGhTY29wZShjb25zdCBjaGFyKiBzY29wZSwgdWludDY0X3QgcmF3
X2lkKQorICAgICAgICA6IHNjb3BlXyhzY29wZSksIHJhd19pZF8ocmF3X2lkKSB7fQorICAgIFdp
dGhTY29wZShjb25zdCBjaGFyKiBzY29wZSwgTG9jYWxJZCBsb2NhbF9pZCkKKyAgICAgICAgOiBz
Y29wZV8oc2NvcGUpLCByYXdfaWRfKGxvY2FsX2lkLnJhd19pZCgpKSB7CisgICAgICBpZF9mbGFn
c18gPSBsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0xvY2FsSWQ7CisgICAgfQorICAgIFdpdGhT
Y29wZShjb25zdCBjaGFyKiBzY29wZSwgR2xvYmFsSWQgZ2xvYmFsX2lkKQorICAgICAgICA6IHNj
b3BlXyhzY29wZSksIHJhd19pZF8oZ2xvYmFsX2lkLnJhd19pZCgpKSB7CisgICAgICBpZF9mbGFn
c18gPSBsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0dsb2JhbElkOworICAgIH0KKyAgICBXaXRo
U2NvcGUoY29uc3QgY2hhciogc2NvcGUsIHVpbnQ2NF90IHByZWZpeCwgdWludDY0X3QgcmF3X2lk
KQorICAgICAgICA6IHNjb3BlXyhzY29wZSksIGhhc19wcmVmaXhfKHRydWUpLCBwcmVmaXhfKHBy
ZWZpeCksIHJhd19pZF8ocmF3X2lkKSB7fQorICAgIFdpdGhTY29wZShjb25zdCBjaGFyKiBzY29w
ZSwgdWludDY0X3QgcHJlZml4LCBHbG9iYWxJZCBnbG9iYWxfaWQpCisgICAgICAgIDogc2NvcGVf
KHNjb3BlKSwKKyAgICAgICAgICBoYXNfcHJlZml4Xyh0cnVlKSwKKyAgICAgICAgICBwcmVmaXhf
KHByZWZpeCksCisgICAgICAgICAgcmF3X2lkXyhnbG9iYWxfaWQucmF3X2lkKCkpIHsKKyAgICAg
IGlkX2ZsYWdzXyA9IGxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnSGFzR2xvYmFsSWQ7CisgICAgfQor
ICAgIHVpbnQ2NF90IHJhd19pZCgpIGNvbnN0IHsgcmV0dXJuIHJhd19pZF87IH0KKyAgICBjb25z
dCBjaGFyKiBzY29wZSgpIGNvbnN0IHsgcmV0dXJuIHNjb3BlXzsgfQorICAgIGJvb2wgaGFzX3By
ZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGhhc19wcmVmaXhfOyB9CisgICAgdWludDY0X3QgcHJlZml4
KCkgY29uc3QgeyByZXR1cm4gcHJlZml4XzsgfQorICAgIHVpbnQzMl90IGlkX2ZsYWdzKCkgY29u
c3QgeyByZXR1cm4gaWRfZmxhZ3NfOyB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgY2hhciog
c2NvcGVfID0gbnVsbHB0cjsKKyAgICBib29sIGhhc19wcmVmaXhfID0gZmFsc2U7CisgICAgdWlu
dDY0X3QgcHJlZml4XzsKKyAgICB1aW50NjRfdCByYXdfaWRfOworICAgIHVpbnQzMl90IGlkX2Zs
YWdzXyA9IGxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnSGFzSWQ7CisgIH07CisKKyAgTGVnYWN5VHJh
Y2VJZChjb25zdCB2b2lkKiByYXdfaWQpCisgICAgICA6IHJhd19pZF8oc3RhdGljX2Nhc3Q8dWlu
dDY0X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihyYXdfaWQpKSkgeworICAgIGlkX2Zs
YWdzXyA9IGxlZ2FjeTo6a1RyYWNlRXZlbnRGbGFnSGFzTG9jYWxJZDsKKyAgfQorICBleHBsaWNp
dCBMZWdhY3lUcmFjZUlkKHVpbnQ2NF90IHJhd19pZCkgOiByYXdfaWRfKHJhd19pZCkge30KKyAg
ZXhwbGljaXQgTGVnYWN5VHJhY2VJZCh1aW50MzJfdCByYXdfaWQpIDogcmF3X2lkXyhyYXdfaWQp
IHt9CisgIGV4cGxpY2l0IExlZ2FjeVRyYWNlSWQodWludDE2X3QgcmF3X2lkKSA6IHJhd19pZF8o
cmF3X2lkKSB7fQorICBleHBsaWNpdCBMZWdhY3lUcmFjZUlkKHVpbnQ4X3QgcmF3X2lkKSA6IHJh
d19pZF8ocmF3X2lkKSB7fQorICBleHBsaWNpdCBMZWdhY3lUcmFjZUlkKGludDY0X3QgcmF3X2lk
KQorICAgICAgOiByYXdfaWRfKHN0YXRpY19jYXN0PHVpbnQ2NF90PihyYXdfaWQpKSB7fQorICBl
eHBsaWNpdCBMZWdhY3lUcmFjZUlkKGludDMyX3QgcmF3X2lkKQorICAgICAgOiByYXdfaWRfKHN0
YXRpY19jYXN0PHVpbnQ2NF90PihyYXdfaWQpKSB7fQorICBleHBsaWNpdCBMZWdhY3lUcmFjZUlk
KGludDE2X3QgcmF3X2lkKQorICAgICAgOiByYXdfaWRfKHN0YXRpY19jYXN0PHVpbnQ2NF90Pihy
YXdfaWQpKSB7fQorICBleHBsaWNpdCBMZWdhY3lUcmFjZUlkKGludDhfdCByYXdfaWQpCisgICAg
ICA6IHJhd19pZF8oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJhd19pZCkpIHt9CisgIGV4cGxpY2l0
IExlZ2FjeVRyYWNlSWQoTG9jYWxJZCByYXdfaWQpIDogcmF3X2lkXyhyYXdfaWQucmF3X2lkKCkp
IHsKKyAgICBpZF9mbGFnc18gPSBsZWdhY3k6OmtUcmFjZUV2ZW50RmxhZ0hhc0xvY2FsSWQ7Cisg
IH0KKyAgZXhwbGljaXQgTGVnYWN5VHJhY2VJZChHbG9iYWxJZCByYXdfaWQpIDogcmF3X2lkXyhy
YXdfaWQucmF3X2lkKCkpIHsKKyAgICBpZF9mbGFnc18gPSBsZWdhY3k6OmtUcmFjZUV2ZW50Rmxh
Z0hhc0dsb2JhbElkOworICB9CisgIGV4cGxpY2l0IExlZ2FjeVRyYWNlSWQoV2l0aFNjb3BlIHNj
b3BlZF9pZCkKKyAgICAgIDogc2NvcGVfKHNjb3BlZF9pZC5zY29wZSgpKSwKKyAgICAgICAgaGFz
X3ByZWZpeF8oc2NvcGVkX2lkLmhhc19wcmVmaXgoKSksCisgICAgICAgIHByZWZpeF8oc2NvcGVk
X2lkLnByZWZpeCgpKSwKKyAgICAgICAgcmF3X2lkXyhzY29wZWRfaWQucmF3X2lkKCkpLAorICAg
ICAgICBpZF9mbGFnc18oc2NvcGVkX2lkLmlkX2ZsYWdzKCkpIHt9CisKKyAgdWludDY0X3QgcmF3
X2lkKCkgY29uc3QgeyByZXR1cm4gcmF3X2lkXzsgfQorICBjb25zdCBjaGFyKiBzY29wZSgpIGNv
bnN0IHsgcmV0dXJuIHNjb3BlXzsgfQorICBib29sIGhhc19wcmVmaXgoKSBjb25zdCB7IHJldHVy
biBoYXNfcHJlZml4XzsgfQorICB1aW50NjRfdCBwcmVmaXgoKSBjb25zdCB7IHJldHVybiBwcmVm
aXhfOyB9CisgIHVpbnQzMl90IGlkX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gaWRfZmxhZ3NfOyB9
CisKKyAgdm9pZCBXcml0ZShwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6TGVnYWN5RXZlbnQq
LAorICAgICAgICAgICAgIHVpbnQzMl90IGV2ZW50X2ZsYWdzKSBjb25zdDsKKworIHByaXZhdGU6
CisgIGNvbnN0IGNoYXIqIHNjb3BlXyA9IG51bGxwdHI7CisgIGJvb2wgaGFzX3ByZWZpeF8gPSBm
YWxzZTsKKyAgdWludDY0X3QgcHJlZml4XzsKKyAgdWludDY0X3QgcmF3X2lkXzsKKyAgdWludDMy
X3QgaWRfZmxhZ3NfID0gbGVnYWN5OjprVHJhY2VFdmVudEZsYWdIYXNJZDsKK307CisKK30gIC8v
IG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHBlcmZldHRvCisKKyNpZiBQRVJG
RVRUT19FTkFCTEVfTEVHQUNZX1RSQUNFX0VWRU5UUworCituYW1lc3BhY2UgcGVyZmV0dG8gewor
bmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFRyYWNrRXZlbnRM
ZWdhY3kgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0ZXhwciBwcm90b3M6OnBiemVybzo6VHJh
Y2tFdmVudDo6VHlwZSBQaGFzZVRvVHlwZShjaGFyIHBoYXNlKSB7CisgICAgLy8gY2xhbmctZm9y
bWF0IG9mZgorICAgIHJldHVybiAocGhhc2UgPT0gVFJBQ0VfRVZFTlRfUEhBU0VfQkVHSU4pID8K
KyAgICAgICAgICAgICAgIHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUWVBFX1NMSUNFX0JF
R0lOIDoKKyAgICAgICAgICAgKHBoYXNlID09IFRSQUNFX0VWRU5UX1BIQVNFX0VORCkgPworICAg
ICAgICAgICAgICAgcHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OlRZUEVfU0xJQ0VfRU5EIDoK
KyAgICAgICAgICAgKHBoYXNlID09IFRSQUNFX0VWRU5UX1BIQVNFX0lOU1RBTlQpID8KKyAgICAg
ICAgICAgICAgIHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpUWVBFX0lOU1RBTlQgOgorICAg
ICAgICAgICBwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VFlQRV9VTlNQRUNJRklFRDsKKyAg
ICAvLyBjbGFuZy1mb3JtYXQgb24KKyAgfQorCisgIC8vIFJlZHVjZSBiaW5hcnkgc2l6ZSBvdmVy
aGVhZCBieSBvdXRsaW5pbmcgbW9zdCBvZiB0aGUgY29kZSBmb3Igd3JpdGluZyBhCisgIC8vIGxl
Z2FjeSB0cmFjZSBldmVudC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgIHN0YXRp
YyB2b2lkIFdyaXRlTGVnYWN5RXZlbnQoRXZlbnRDb250ZXh0IGN0eCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjaGFyIHBoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3Mm
Ji4uLiBhcmdzKSBQRVJGRVRUT19OT19JTkxJTkUgeworICAgIEFkZERlYnVnQW5ub3RhdGlvbnMo
JmN0eCwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICBTZXRUcmFja0lmTmVlZGVk
KCZjdHgsIGZsYWdzKTsKKyAgICBpZiAoTmVlZExlZ2FjeUZsYWdzKHBoYXNlLCBmbGFncykpIHsK
KyAgICAgIGF1dG8gbGVnYWN5X2V2ZW50ID0gY3R4LmV2ZW50KCktPnNldF9sZWdhY3lfZXZlbnQo
KTsKKyAgICAgIFNldExlZ2FjeUZsYWdzKGxlZ2FjeV9ldmVudCwgcGhhc2UsIGZsYWdzKTsKKyAg
ICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhyZWFkSWRUeXBlLCB0eXBlbmFtZS4u
LiBBcmdzPgorICBzdGF0aWMgdm9pZCBXcml0ZUxlZ2FjeUV2ZW50V2l0aElkQW5kVGlkKEV2ZW50
Q29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2hhciBwaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1
aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBMZWdhY3lUcmFjZUlkJiBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJZFR5cGUmIHRocmVhZF9pZCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzJiYuLi4gYXJncykgUEVSRkVUVE9f
Tk9fSU5MSU5FIHsKKyAgICAvLworICAgIC8vIE92ZXJyaWRlcyB0byBjb25zaWRlcjoKKyAgICAv
LworICAgIC8vIDEuIElmIHdlIGhhdmUgYW4gaWQsIHdlIG5lZWQgdG8gd3JpdGUge3Vuc2NvcGVk
LGxvY2FsLGdsb2JhbH1faWQgYW5kL29yCisgICAgLy8gICAgYmluZF9pZC4KKyAgICAvLyAyLiBJ
ZiB3ZSBoYXZlIGEgdGhyZWFkIGlkLCB3ZSBuZWVkIHRvIHdyaXRlIHRyYWNrX3V1aWQoKSBvcgor
ICAgIC8vICAgIHtwaWQsdGlkfV9vdmVycmlkZS4gVGhpcyBoYXBwZW5zIGluIGVtYmVkZGVyIGNv
ZGUgc2luY2UgdGhlIHRocmVhZCBpZAorICAgIC8vICAgIGlzIGVtYmVkZGVyLXNwZWNpZmllZC4K
KyAgICAvLyAzLiBJZiB3ZSBoYXZlIGEgdGltZXN0YW1wLCB3ZSBuZWVkIHRvIHdyaXRlIGEgZGlm
ZmVyZW50IHRpbWVzdGFtcCBpbiB0aGUKKyAgICAvLyAgICB0cmFjZSBwYWNrZXQgaXRzZWxmIGFu
ZCBtYWtlIHN1cmUgVHJhY2tFdmVudCB3b24ndCB3cml0ZSBvbmUKKyAgICAvLyAgICBpbnRlcm5h
bGx5LiBUaGlzIGlzIGFscmVhZHkgZG9uZSBhdCB0aGUgY2FsbCBzaXRlLgorICAgIC8vCisgICAg
ZmxhZ3MgfD0gaWQuaWRfZmxhZ3MoKTsKKyAgICBBZGREZWJ1Z0Fubm90YXRpb25zKCZjdHgsIHN0
ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgaW50MzJfdCBwaWRfb3ZlcnJpZGUgPSAw
OworICAgIGludDMyX3QgdGlkX292ZXJyaWRlID0gMDsKKyAgICB1aW50NjRfdCB0cmFja191dWlk
ID0gMDsKKyAgICBpZiAobGVnYWN5OjpDb252ZXJ0VGhyZWFkSWQodGhyZWFkX2lkLCAmdHJhY2tf
dXVpZCwgJnBpZF9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRp
ZF9vdmVycmlkZSkgJiYKKyAgICAgICAgdHJhY2tfdXVpZCkgeworICAgICAgaWYgKHRyYWNrX3V1
aWQgIT0gVGhyZWFkVHJhY2s6OkN1cnJlbnQoKS51dWlkKQorICAgICAgICBjdHguZXZlbnQoKS0+
c2V0X3RyYWNrX3V1aWQodHJhY2tfdXVpZCk7CisgICAgfSBlbHNlIGlmIChwaWRfb3ZlcnJpZGUg
fHwgdGlkX292ZXJyaWRlKSB7CisgICAgICAvLyBFeHBsaWNpdGx5IGNsZWFyIHRoZSB0cmFjayBz
byB0aGUgb3ZlcnJpZGVzIGJlbG93IHRha2UgZWZmZWN0LgorICAgICAgY3R4LmV2ZW50KCktPnNl
dF90cmFja191dWlkKDApOworICAgIH0gZWxzZSB7CisgICAgICAvLyBObyBwaWQvdGlkL3RyYWNr
IG92ZXJyaWRlcyA9PiBvYmV5IHRoZSBmbGFncyBpbnN0ZWFkLgorICAgICAgU2V0VHJhY2tJZk5l
ZWRlZCgmY3R4LCBmbGFncyk7CisgICAgfQorICAgIGlmIChOZWVkTGVnYWN5RmxhZ3MocGhhc2Us
IGZsYWdzKSB8fCBwaWRfb3ZlcnJpZGUgfHwgdGlkX292ZXJyaWRlKSB7CisgICAgICBhdXRvIGxl
Z2FjeV9ldmVudCA9IGN0eC5ldmVudCgpLT5zZXRfbGVnYWN5X2V2ZW50KCk7CisgICAgICBTZXRM
ZWdhY3lGbGFncyhsZWdhY3lfZXZlbnQsIHBoYXNlLCBmbGFncyk7CisgICAgICBpZiAoaWQuaWRf
ZmxhZ3MoKSkKKyAgICAgICAgaWQuV3JpdGUobGVnYWN5X2V2ZW50LCBmbGFncyk7CisgICAgICBp
ZiAocGlkX292ZXJyaWRlKQorICAgICAgICBsZWdhY3lfZXZlbnQtPnNldF9waWRfb3ZlcnJpZGUo
cGlkX292ZXJyaWRlKTsKKyAgICAgIGlmICh0aWRfb3ZlcnJpZGUpCisgICAgICAgIGxlZ2FjeV9l
dmVudC0+c2V0X3RpZF9vdmVycmlkZSh0aWRfb3ZlcnJpZGUpOworICAgIH0KKyAgfQorCisgIC8v
IE5vIGFyZ3VtZW50cy4KKyAgc3RhdGljIHZvaWQgQWRkRGVidWdBbm5vdGF0aW9ucyhFdmVudENv
bnRleHQqKSB7fQorCisgIC8vIE9uZSBhcmd1bWVudC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFy
Z1R5cGU+CisgIHN0YXRpYyB2b2lkIEFkZERlYnVnQW5ub3RhdGlvbnMoRXZlbnRDb250ZXh0KiBj
dHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJnX25h
bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnVHlwZSYmIGFyZ192YWx1
ZSkgeworICAgIFRyYWNrRXZlbnRJbnRlcm5hbDo6QWRkRGVidWdBbm5vdGF0aW9uKGN0eCwgYXJn
X25hbWUsIGFyZ192YWx1ZSk7CisgIH0KKworICAvLyBUd28gYXJndW1lbnRzLgorICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgQXJnVHlwZTI+CisgIHN0YXRpYyB2b2lkIEFk
ZERlYnVnQW5ub3RhdGlvbnMoRXZlbnRDb250ZXh0KiBjdHgsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJnX25hbWUsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQXJnVHlwZSYmIGFyZ192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcmdfbmFtZTIsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQXJnVHlwZTImJiBhcmdfdmFsdWUyKSB7CisgICAgVHJhY2tFdmVudElu
dGVybmFsOjpBZGREZWJ1Z0Fubm90YXRpb24oY3R4LCBhcmdfbmFtZSwgYXJnX3ZhbHVlKTsKKyAg
ICBUcmFja0V2ZW50SW50ZXJuYWw6OkFkZERlYnVnQW5ub3RhdGlvbihjdHgsIGFyZ19uYW1lMiwg
YXJnX3ZhbHVlMik7CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIFNldFRyYWNrSWZO
ZWVkZWQoRXZlbnRDb250ZXh0KiBjdHgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgLy8gTm90ZTog
VGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gc2V0IExlZ2FjeUV2ZW50OjppbnN0YW50X2V2ZW50X3Nj
b3BlLgorICAgIGF1dG8gc2NvcGUgPSBmbGFncyAmIFRSQUNFX0VWRU5UX0ZMQUdfU0NPUEVfTUFT
SzsKKyAgICBzd2l0Y2ggKHNjb3BlKSB7CisgICAgICBjYXNlIFRSQUNFX0VWRU5UX1NDT1BFX0dM
T0JBTDoKKyAgICAgICAgY3R4LT5ldmVudCgpLT5zZXRfdHJhY2tfdXVpZCgwKTsKKyAgICAgICAg
YnJlYWs7CisgICAgICBjYXNlIFRSQUNFX0VWRU5UX1NDT1BFX1BST0NFU1M6CisgICAgICAgIGN0
eC0+ZXZlbnQoKS0+c2V0X3RyYWNrX3V1aWQoUHJvY2Vzc1RyYWNrOjpDdXJyZW50KCkudXVpZCk7
CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgVFJBQ0VfRVZFTlRf
U0NPUEVfVEhSRUFEOgorICAgICAgICAvLyBUaHJlYWQgc2NvcGUgaXMgYWxyZWFkeSB0aGUgZGVm
YXVsdC4KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgc3RhdGljIGJvb2wgTmVlZExl
Z2FjeUZsYWdzKGNoYXIgcGhhc2UsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKFBoYXNlVG9U
eXBlKHBoYXNlKSA9PSBwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VFlQRV9VTlNQRUNJRklF
RCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIC8vIFRPRE8oc2t5b3N0aWwpOiBJbXBsZW1lbnQv
ZGVwcmVjYXRlOgorICAgIC8vIC0gVFJBQ0VfRVZFTlRfRkxBR19FWFBMSUNJVF9USU1FU1RBTVAK
KyAgICAvLyAtIFRSQUNFX0VWRU5UX0ZMQUdfSEFTX0NPTlRFWFRfSUQKKyAgICAvLyAtIFRSQUNF
X0VWRU5UX0ZMQUdfSEFTX1BST0NFU1NfSUQKKyAgICAvLyAtIFRSQUNFX0VWRU5UX0ZMQUdfVFlQ
RURfUFJPVE9fQVJHUworICAgIC8vIC0gVFJBQ0VfRVZFTlRfRkxBR19KQVZBX1NUUklOR19MSVRF
UkFMUworICAgIHJldHVybiBmbGFncyAmCisgICAgICAgICAgIChUUkFDRV9FVkVOVF9GTEFHX0hB
U19JRCB8IFRSQUNFX0VWRU5UX0ZMQUdfSEFTX0xPQ0FMX0lEIHwKKyAgICAgICAgICAgIFRSQUNF
X0VWRU5UX0ZMQUdfSEFTX0dMT0JBTF9JRCB8IFRSQUNFX0VWRU5UX0ZMQUdfQVNZTkNfVFRTIHwK
KyAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQklORF9UT19FTkNMT1NJTkcgfCBUUkFDRV9F
VkVOVF9GTEFHX0ZMT1dfSU4gfAorICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19GTE9XX09V
VCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTZXRMZWdhY3lGbGFncygKKyAgICAgIHByb3Rvczo6
cGJ6ZXJvOjpUcmFja0V2ZW50OjpMZWdhY3lFdmVudCogbGVnYWN5X2V2ZW50LAorICAgICAgY2hh
ciBwaGFzZSwKKyAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKFBoYXNlVG9UeXBlKHBo
YXNlKSA9PSBwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudDo6VFlQRV9VTlNQRUNJRklFRCkKKyAg
ICAgIGxlZ2FjeV9ldmVudC0+c2V0X3BoYXNlKHBoYXNlKTsKKyAgICBpZiAoZmxhZ3MgJiBUUkFD
RV9FVkVOVF9GTEFHX0FTWU5DX1RUUykKKyAgICAgIGxlZ2FjeV9ldmVudC0+c2V0X3VzZV9hc3lu
Y190dHModHJ1ZSk7CisgICAgaWYgKGZsYWdzICYgVFJBQ0VfRVZFTlRfRkxBR19CSU5EX1RPX0VO
Q0xPU0lORykKKyAgICAgIGxlZ2FjeV9ldmVudC0+c2V0X2JpbmRfdG9fZW5jbG9zaW5nKHRydWUp
OworCisgICAgY29uc3QgYXV0byBrRmxvd0luID0gVFJBQ0VfRVZFTlRfRkxBR19GTE9XX0lOOwor
ICAgIGNvbnN0IGF1dG8ga0Zsb3dPdXQgPSBUUkFDRV9FVkVOVF9GTEFHX0ZMT1dfT1VUOworICAg
IGNvbnN0IGF1dG8ga0Zsb3dJbk91dCA9IGtGbG93SW4gfCBrRmxvd091dDsKKyAgICBpZiAoKGZs
YWdzICYga0Zsb3dJbk91dCkgPT0ga0Zsb3dJbk91dCkgeworICAgICAgbGVnYWN5X2V2ZW50LT5z
ZXRfZmxvd19kaXJlY3Rpb24oCisgICAgICAgICAgcHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6
OkxlZ2FjeUV2ZW50OjpGTE9XX0lOT1VUKTsKKyAgICB9IGVsc2UgaWYgKGZsYWdzICYga0Zsb3dJ
bikgeworICAgICAgbGVnYWN5X2V2ZW50LT5zZXRfZmxvd19kaXJlY3Rpb24oCisgICAgICAgICAg
cHJvdG9zOjpwYnplcm86OlRyYWNrRXZlbnQ6OkxlZ2FjeUV2ZW50OjpGTE9XX0lOKTsKKyAgICB9
IGVsc2UgaWYgKGZsYWdzICYga0Zsb3dPdXQpIHsKKyAgICAgIGxlZ2FjeV9ldmVudC0+c2V0X2Zs
b3dfZGlyZWN0aW9uKAorICAgICAgICAgIHByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50OjpMZWdh
Y3lFdmVudDo6RkxPV19PVVQpOworICAgIH0KKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGlu
dGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcGVyZmV0dG8KKworLy8gSW1wbGVtZW50YXRpb25zIGZv
ciB0aGUgSU5URVJOQUxfKiBhZGFwdGVyIG1hY3JvcyB1c2VkIGJ5IHRoZSB0cmFjZSBwb2ludHMK
Ky8vIGJlbG93LgorI2RlZmluZSBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQocGhhc2UsIGNhdGVn
b3J5LCBuYW1lLCBmbGFncywgLi4uKSAgICAgIFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfVFJBQ0tf
RVZFTlQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBj
YXRlZ29yeSwgOjpwZXJmZXR0bzo6U3RhdGljU3RyaW5ne25hbWV9LCAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgOjpwZXJmZXR0bzo6aW50ZXJuYWw6OlRyYWNrRXZlbnRMZWdhY3k6
OlBoYXNlVG9UeXBlKHBoYXNlKSwgICAgICAgIFwKKyAgICAgIFsmXShwZXJmZXR0bzo6RXZlbnRD
b250ZXh0IGN0eCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg
IHVzaW5nIDo6cGVyZmV0dG86OmludGVybmFsOjpUcmFja0V2ZW50TGVnYWN5OyAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICBUcmFja0V2ZW50TGVnYWN5OjpXcml0ZUxlZ2FjeUV2ZW50KHN0
ZDo6bW92ZShjdHgpLCBwaGFzZSwgZmxhZ3MsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICBcCisgICAgICB9
KQorCisjZGVmaW5lIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9TQ09QRUQoY2F0ZWdvcnksIG5h
bWUsIC4uLikgICAgICAgIFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfU0NPUEVEX1RSQUNLX0VWRU5U
KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F0ZWdvcnksIDo6cGVyZmV0
dG86OlN0YXRpY1N0cmluZ3tuYW1lfSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBbJl0o
cGVyZmV0dG86OkV2ZW50Q29udGV4dCBjdHgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICAgICAgdXNpbmcgOjpwZXJmZXR0bzo6aW50ZXJuYWw6OlRyYWNrRXZlbnRMZWdhY3k7
ICAgICAgICAgICAgICAgXAorICAgICAgICBUcmFja0V2ZW50TGVnYWN5OjpBZGREZWJ1Z0Fubm90
YXRpb25zKCZjdHgsICMjX19WQV9BUkdTX18pOyBcCisgICAgICB9KQorCisjZGVmaW5lIElOVEVS
TkFMX1RSQUNFX0VWRU5UX0FERF9TQ09QRURfV0lUSF9GTE9XKGNhdGVnb3J5LCBuYW1lLCBiaW5k
X2lkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZsYWdzLCAuLi4pICAgICAgICAgICAgICBcCisgIFBFUkZFVFRPX0lOVEVSTkFMX1NDT1BFRF9U
UkFDS19FVkVOVCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBj
YXRlZ29yeSwgOjpwZXJmZXR0bzo6U3RhdGljU3RyaW5ne25hbWV9LCAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgICBbJl0ocGVyZmV0dG86OkV2ZW50Q29udGV4dCBjdHgpIHsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVzaW5nIDo6cGVyZmV0
dG86OmludGVybmFsOjpUcmFja0V2ZW50TGVnYWN5OyAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgIDo6cGVyZmV0dG86OmludGVybmFsOjpMZWdhY3lUcmFjZUlkIHRyYWNlX2lke2JpbmRf
aWR9OyAgICAgICAgICAgICBcCisgICAgICAgIFRyYWNrRXZlbnRMZWdhY3k6OldyaXRlTGVnYWN5
RXZlbnRXaXRoSWRBbmRUaWQoICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGQ6
Om1vdmUoY3R4KSwgVFJBQ0VfRVZFTlRfUEhBU0VfQkVHSU4sIGZsYWdzLCB0cmFjZV9pZCwgICAg
ICBcCisgICAgICAgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsICMjX19W
QV9BUkdTX18pOyAgICAgICAgICAgICBcCisgICAgICB9KQorCisjZGVmaW5lIElOVEVSTkFMX1RS
QUNFX0VWRU5UX0FERF9XSVRIX1RJTUVTVEFNUChwaGFzZSwgY2F0ZWdvcnksIG5hbWUsICAgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1w
LCBmbGFncywgLi4uKSAgIFwKKyAgUEVSRkVUVE9fSU5URVJOQUxfVFJBQ0tfRVZFTlQoICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXRlZ29yeSwgOjpw
ZXJmZXR0bzo6U3RhdGljU3RyaW5ne25hbWV9LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgOjpwZXJmZXR0bzo6aW50ZXJuYWw6OlRyYWNrRXZlbnRMZWdhY3k6OlBoYXNlVG9UeXBl
KHBoYXNlKSwgICAgICAgIFwKKyAgICAgIDo6cGVyZmV0dG86OmxlZ2FjeTo6Q29udmVydFRpbWVz
dGFtcFRvVHJhY2VUaW1lTnModGltZXN0YW1wKSwgICAgICBcCisgICAgICBbJl0ocGVyZmV0dG86
OkV2ZW50Q29udGV4dCBjdHgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICB1c2luZyA6OnBlcmZldHRvOjppbnRlcm5hbDo6VHJhY2tFdmVudExlZ2FjeTsgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVHJhY2tFdmVudExlZ2FjeTo6V3JpdGVMZWdhY3lF
dmVudChzdGQ6Om1vdmUoY3R4KSwgcGhhc2UsIGZsYWdzLCBcCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgXAor
ICAgICAgfSkKKworI2RlZmluZSBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURf
QU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgIFwKKyAgICBwaGFzZSwgY2F0ZWdvcnks
IG5hbWUsIGlkLCB0aHJlYWRfaWQsIHRpbWVzdGFtcCwgZmxhZ3MsIC4uLikgICAgICAgICAgICAg
ICBcCisgIFBFUkZFVFRPX0lOVEVSTkFMX1RSQUNLX0VWRU5UKCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F0ZWdvcnksIDo6cGVyZmV0dG86
OlN0YXRpY1N0cmluZ3tuYW1lfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgIDo6cGVyZmV0dG86OmludGVybmFsOjpUcmFja0V2ZW50TGVnYWN5OjpQaGFzZVRvVHlwZShw
aGFzZSksICAgICAgICAgICAgICBcCisgICAgICA6OnBlcmZldHRvOjpsZWdhY3k6OkNvbnZlcnRU
aW1lc3RhbXBUb1RyYWNlVGltZU5zKHRpbWVzdGFtcCksICAgICAgICAgICAgXAorICAgICAgWyZd
KHBlcmZldHRvOjpFdmVudENvbnRleHQgY3R4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgICAgdXNpbmcgOjpwZXJmZXR0bzo6aW50ZXJuYWw6OlRyYWNr
RXZlbnRMZWdhY3k7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDo6cGVyZmV0
dG86OmludGVybmFsOjpMZWdhY3lUcmFjZUlkIHRyYWNlX2lke2lkfTsgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgICAgICBUcmFja0V2ZW50TGVnYWN5OjpXcml0ZUxlZ2FjeUV2ZW50V2l0aElk
QW5kVGlkKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShj
dHgpLCBwaGFzZSwgZmxhZ3MsIHRyYWNlX2lkLCB0aHJlYWRfaWQsICMjX19WQV9BUkdTX18pOyBc
CisgICAgICB9KQorCisjZGVmaW5lIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKHBo
YXNlLCBjYXRlZ29yeSwgbmFtZSwgaWQsIGZsYWdzLCBcCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
IFBFUkZFVFRPX0lOVEVSTkFMX1RSQUNLX0VWRU5UKCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgICBjYXRlZ29yeSwgOjpwZXJmZXR0bzo6U3RhdGljU3Ry
aW5ne25hbWV9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OnBlcmZldHRv
OjppbnRlcm5hbDo6VHJhY2tFdmVudExlZ2FjeTo6UGhhc2VUb1R5cGUocGhhc2UpLCAgICAgICAg
ICBcCisgICAgICBbJl0ocGVyZmV0dG86OkV2ZW50Q29udGV4dCBjdHgpIHsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVzaW5nIDo6cGVyZmV0dG86OmludGVy
bmFsOjpUcmFja0V2ZW50TGVnYWN5OyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDo6
cGVyZmV0dG86OmludGVybmFsOjpMZWdhY3lUcmFjZUlkIHRyYWNlX2lke2lkfTsgICAgICAgICAg
ICAgICAgICBcCisgICAgICAgIFRyYWNrRXZlbnRMZWdhY3k6OldyaXRlTGVnYWN5RXZlbnRXaXRo
SWRBbmRUaWQoICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGQ6Om1vdmUoY3R4
KSwgcGhhc2UsIGZsYWdzLCB0cmFjZV9pZCwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
ICAgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsICMjX19WQV9BUkdTX18p
OyAgICAgICAgICAgICBcCisgICAgICB9KQorCisjZGVmaW5lIElOVEVSTkFMX1RSQUNFX0VWRU5U
X01FVEFEQVRBX0FERChjYXRlZ29yeSwgbmFtZSwgLi4uKSAgICAgICAgIFwKKyAgSU5URVJOQUxf
VFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX01FVEFEQVRBLCBjYXRlZ29yeSwgbmFt
ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FKQor
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMZWdhY3kgdHJhY2luZyBjb21tb24gQVBJIChh
ZGFwdGVkIGZyb20gdHJhY2VfZXZlbnRfY29tbW9uLmgpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQorCisjZGVmaW5lIFRSQUNFX0RJU0FCTEVEX0JZX0RFRkFVTFQobmFtZSkgImRpc2FibGVkLWJ5
LWRlZmF1bHQtIiBuYW1lCisKKy8vIFNjb3BlZCBldmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5U
MChjYXRlZ29yeV9ncm91cCwgbmFtZSkgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfU0NP
UEVEKGNhdGVnb3J5X2dyb3VwLCBuYW1lKQorI2RlZmluZSBUUkFDRV9FVkVOVF9XSVRIX0ZMT1cw
KGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBiaW5kX2lkLCBmbG93X2ZsYWdzKSAgXAorICBJTlRFUk5B
TF9UUkFDRV9FVkVOVF9BRERfU0NPUEVEX1dJVEhfRkxPVyhjYXRlZ29yeV9ncm91cCwgbmFtZSwg
YmluZF9pZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
bG93X2ZsYWdzKQorI2RlZmluZSBUUkFDRV9FVkVOVDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGFy
ZzFfbmFtZSwgYXJnMV92YWwpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1NDT1BFRChj
YXRlZ29yeV9ncm91cCwgbmFtZSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0Vf
RVZFTlRfV0lUSF9GTE9XMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgYmluZF9pZCwgZmxvd19mbGFn
cywgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX25hbWUsIGFyZzFfdmFs
KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1ND
T1BFRF9XSVRIX0ZMT1coY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGJpbmRfaWQsIFwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mbGFncywgYXJnMV9uYW1l
LCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlQyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBh
cmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUsICAgXAorICAgICAgICAgICAgICAgICAgICAg
YXJnMl92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9TQ09QRUQoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IGFyZzFfbmFtZSwgYXJnMV92YWwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBhcmcyX25hbWUsIGFyZzJfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9XSVRIX0ZMT1cyKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBiaW5kX2lkLCBmbG93X2ZsYWdzLCAgICBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcy
X3ZhbCkgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1NDT1BFRF9XSVRIX0ZMT1co
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGJpbmRfaWQsICAgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmbG93X2ZsYWdzLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBc
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzJfbmFtZSwg
YXJnMl92YWwpCisKKy8vIEluc3RhbnQgZXZlbnRzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9JTlNU
QU5UMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgc2NvcGUpICAgICAgICAgICAgICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0lOU1RBTlQsIGNhdGVn
b3J5X2dyb3VwLCBuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVO
VF9GTEFHX05PTkUgfCBzY29wZSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfSU5TVEFOVDEoY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIHNjb3BlLCBhcmcxX25hbWUsIGFyZzFfdmFsKSBcCisgIElOVEVSTkFM
X1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9JTlNUQU5ULCBjYXRlZ29yeV9ncm91
cCwgbmFtZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxB
R19OT05FIHwgc2NvcGUsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5U
X0lOU1RBTlQyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBzY29wZSwgYXJnMV9uYW1lLCBhcmcxX3Zh
bCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
KFRSQUNFX0VWRU5UX1BIQVNFX0lOU1RBTlQsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCAgICBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUgfCBzY29wZSwg
YXJnMV9uYW1lLCBhcmcxX3ZhbCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMl9u
YW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9JTlNUQU5UMChjYXRlZ29y
eV9ncm91cCwgbmFtZSwgc2NvcGUpICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VW
RU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9JTlNUQU5ULCBjYXRlZ29yeV9ncm91cCwgbmFtZSwg
XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZIHwgc2Nv
cGUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfSU5TVEFOVDEoY2F0ZWdvcnlfZ3JvdXAsIG5h
bWUsIHNjb3BlLCBhcmcxX25hbWUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFyZzFfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJO
QUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0lOU1RBTlQsIGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFH
X0NPUFkgfCBzY29wZSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
Q09QWV9JTlNUQU5UMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgc2NvcGUsIGFyZzFfbmFtZSwgICAg
ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWwsIGFyZzJfbmFt
ZSwgYXJnMl92YWwpICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQo
VFJBQ0VfRVZFTlRfUEhBU0VfSU5TVEFOVCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsICAgIFwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSB8IHNjb3BlLCBh
cmcxX25hbWUsIGFyZzFfdmFsLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25h
bWUsIGFyZzJfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9JTlNUQU5UX1dJVEhfRkxBR1MwKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBzY29wZV9hbmRfZmxhZ3MpIFwKKyAgSU5URVJOQUxfVFJBQ0Vf
RVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0lOU1RBTlQsIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZV9hbmRfZmxhZ3MpCisjZGVm
aW5lIFRSQUNFX0VWRU5UX0lOU1RBTlRfV0lUSF9GTEFHUzEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IHNjb3BlX2FuZF9mbGFncywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFyZzFfbmFtZSwgYXJnMV92YWwpICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxf
VFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0lOU1RBTlQsIGNhdGVnb3J5X2dyb3Vw
LCBuYW1lLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZV9hbmRfZmxhZ3Ms
IGFyZzFfbmFtZSwgYXJnMV92YWwpCisKKy8vIEluc3RhbnQgZXZlbnRzIHdpdGggZXhwbGljaXQg
dGltZXN0YW1wcy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfSU5TVEFOVF9XSVRIX1RJTUVTVEFNUDAo
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHNjb3BlLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wKSAgICAgICAgICAgICAgICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfVElNRVNUQU1QKFRSQUNFX0VWRU5UX1BIQVNF
X0lOU1RBTlQsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCB0aW1lc3RhbXAsIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSB8IHNjb3BlKQor
CisjZGVmaW5lIFRSQUNFX0VWRU5UX0lOU1RBTlRfV0lUSF9USU1FU1RBTVAxKGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBzY29wZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGltZXN0YW1wLCBhcmdfbmFtZSwgYXJnX3ZhbCkgXAorICBJTlRFUk5BTF9UUkFD
RV9FVkVOVF9BRERfV0lUSF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9JTlNUQU5ULCBjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgdGltZXN0YW1wLCAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSB8IHNj
b3BlLCBhcmdfbmFtZSwgYXJnX3ZhbCkKKworLy8gQmVnaW4gZXZlbnRzLgorI2RlZmluZSBUUkFD
RV9FVkVOVF9CRUdJTjAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUpICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9CRUdJ
TiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRS
QUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQkVHSU4xKGNhdGVnb3J5
X2dyb3VwLCBuYW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsKSAgICAgXAorICBJTlRFUk5BTF9UUkFD
RV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0VfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFy
ZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0JFR0lOMihjYXRlZ29yeV9n
cm91cCwgbmFtZSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgICAgIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0VfQkVHSU4sIGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9F
VkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwsICAgIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0JF
R0lOX1dJVEhfRkxBR1MwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBmbGFncykgXAorICBJTlRFUk5B
TF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0VfQkVHSU4sIGNhdGVnb3J5X2dyb3Vw
LCBuYW1lLCBmbGFncykKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQkVHSU5fV0lUSF9GTEFHUzEoY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGZsYWdzLCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0JFR0lO
LCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZsYWdzLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0JF
R0lOMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAgICAg
ICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhB
U0VfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCAgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZLCBhcmcxX25hbWUsIGFyZzFfdmFsLCAgICAgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKworLy8gQmVn
aW4gZXZlbnRzIHdpdGggZXhwbGljaXQgdGltZXN0YW1wcy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
QkVHSU5fV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRocmVhZF9pZCwgdGltZXN0YW1wKSAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERf
V0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwg
aWQsIHRocmVhZF9pZCwgICAgICBcCisgICAgICB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdf
Tk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9CRUdJTl9XSVRIX0lEX1RJRF9BTkRfVElN
RVNUQU1QMCggICAgICAgICAgICAgICAgXAorICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwg
dGhyZWFkX2lkLCB0aW1lc3RhbXApICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFM
X1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQsIHRocmVhZF9pZCwgXAorICAgICAgdGltZXN0YW1wLCBUUkFDRV9FVkVO
VF9GTEFHX0NPUFkpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfQkVHSU5fV0lUSF9JRF9USURf
QU5EX1RJTUVTVEFNUDEoICAgICAgICAgICAgICAgIFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgaWQsIHRocmVhZF9pZCwgdGltZXN0YW1wLCBhcmcxX25hbWUsIGFyZzFfdmFsKSAgXAorICBJ
TlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJTiwgY2F0
ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsIFwKKyAgICAgIHRpbWVzdGFtcCwgVFJB
Q0VfRVZFTlRfRkxBR19DT1BZLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9F
VkVOVF9DT1BZX0JFR0lOX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAyKCAgICAgICAgICAgICAg
ICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsIHRpbWVzdGFtcCwg
YXJnMV9uYW1lLCBhcmcxX3ZhbCwgIFwKKyAgICBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9U
UkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAg
ICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJTiwgY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsIFwKKyAgICAgIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRf
RkxBR19DT1BZLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUsICAgXAorICAgICAgYXJn
Ml92YWwpCisKKy8vIEVuZCBldmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX0VORDAoY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RS
QUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisj
ZGVmaW5lIFRSQUNFX0VWRU5UX0VORDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGFyZzFfbmFtZSwg
YXJnMV92YWwpICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9Q
SEFTRV9FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5l
IFRSQUNFX0VWRU5UX0VORDIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGFyZzFfbmFtZSwgYXJnMV92
YWwsIGFyZzJfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzJfdmFsKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJB
Q0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05P
TkUsIGFyZzFfbmFtZSwgYXJnMV92YWwsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRU5EX1dJVEhf
RkxBR1MwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBmbGFncykgXAorICBJTlRFUk5BTF9UUkFDRV9F
VkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0VfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgZmxh
Z3MpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0VORF9XSVRIX0ZMQUdTMShjYXRlZ29yeV9ncm91cCwg
bmFtZSwgZmxhZ3MsIGFyZzFfbmFtZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYXJnMV92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0VORCwgY2F0ZWdvcnlf
Z3JvdXAsIG5hbWUsIGZsYWdzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX25h
bWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0VORDIoY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGFyZzFfbmFtZSwgYXJnMV92YWwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgICAgICAgICAgICAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERChUUkFDRV9FVkVOVF9QSEFTRV9FTkQsIGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxB
R19DT1BZLCBhcmcxX25hbWUsIGFyZzFfdmFsLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFyZzJfbmFtZSwgYXJnMl92YWwpCisKKy8vIE1hcmsgZXZlbnRzLgorI2RlZmluZSBUUkFD
RV9FVkVOVF9NQVJLX1dJVEhfVElNRVNUQU1QMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgdGltZXN0
YW1wKSAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9USU1FU1RBTVAoVFJBQ0Vf
RVZFTlRfUEhBU0VfTUFSSywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCwgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05F
KQorCisjZGVmaW5lIFRSQUNFX0VWRU5UX01BUktfV0lUSF9USU1FU1RBTVAxKGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCB0aW1lc3RhbXAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYXJnMV9uYW1lLCBhcmcxX3ZhbCkgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9U
UkFDRV9FVkVOVF9BRERfV0lUSF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9NQVJLLCBjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgdGltZXN0YW1wLCAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwg
YXJnMV9uYW1lLCBhcmcxX3ZhbCkKKworI2RlZmluZSBUUkFDRV9FVkVOVF9NQVJLX1dJVEhfVElN
RVNUQU1QMiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXRl
Z29yeV9ncm91cCwgbmFtZSwgdGltZXN0YW1wLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25h
bWUsIGFyZzJfdmFsKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX1RJTUVTVEFN
UCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZF
TlRfUEhBU0VfTUFSSywgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCwgICAgICAgICAg
ICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBhcmcxX3Zh
bCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKworI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX01BUkso
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxf
VFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX01BUkssIGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFkp
CisKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9NQVJLMShjYXRlZ29yeV9ncm91cCwgbmFtZSwg
YXJnMV9uYW1lLCBhcmcxX3ZhbCkgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0Vf
RVZFTlRfUEhBU0VfTUFSSywgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsICBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFksIGFyZzFfbmFtZSwgYXJnMV92YWwp
CisKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9NQVJLX1dJVEhfVElNRVNUQU1QKGNhdGVnb3J5
X2dyb3VwLCBuYW1lLCB0aW1lc3RhbXApIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJ
VEhfVElNRVNUQU1QKFRSQUNFX0VWRU5UX1BIQVNFX01BUkssICAgICAgICAgICAgIFwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCB0aW1lc3RhbXAsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSkKKworLy8gRW5kIGV2ZW50cyB3aXRoIGV4cGxpY2l0
IHRocmVhZCBhbmQgdGltZXN0YW1wLgorI2RlZmluZSBUUkFDRV9FVkVOVF9FTkRfV0lUSF9JRF9U
SURfQU5EX1RJTUVTVEFNUDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaWQsIHRpbWVz
dGFtcCkgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9U
SU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhB
U0VfQVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRocmVhZF9pZCwgICAgICBc
CisgICAgICB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0Vf
RVZFTlRfQ09QWV9FTkRfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUDAoICAgICAgICAgICAgICAg
IFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRocmVhZF9pZCwgdGltZXN0YW1wKSAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURf
VElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5U
X1BIQVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsIFwK
KyAgICAgIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFDRV9F
VkVOVF9DT1BZX0VORF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QMSggICAgICAgICAgICAgICAg
IFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRocmVhZF9pZCwgdGltZXN0YW1wLCBh
cmcxX25hbWUsIGFyZzFfdmFsKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lE
X1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZF
TlRfUEhBU0VfQVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRocmVhZF9pZCwg
IFwKKyAgICAgIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19DT1BZLCBhcmcxX25hbWUsIGFy
ZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0VORF9XSVRIX0lEX1RJRF9BTkRfVElN
RVNUQU1QMiggICAgICAgICAgICAgICAgIFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQs
IHRocmVhZF9pZCwgdGltZXN0YW1wLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBcCisgICAgYXJnMl9u
YW1lLCBhcmcyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVT
VEFNUCggICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5D
X0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aHJlYWRfaWQsICBcCisgICAgICB0aW1l
c3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9u
YW1lLCAgXAorICAgICAgYXJnMl92YWwpCisKKy8vIENvdW50ZXJzLgorI2RlZmluZSBUUkFDRV9D
T1VOVEVSMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0NPVU5U
RVIsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBU
UkFDRV9FVkVOVF9GTEFHX05PTkUsICJ2YWx1ZSIsICAgICAgICAgICAgICAgICAgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpCisjZGVmaW5lIFRS
QUNFX0NPVU5URVJfV0lUSF9GTEFHMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgZmxhZywgdmFsdWUp
ICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BREQoVFJBQ0VfRVZFTlRfUEhBU0Vf
Q09VTlRFUiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZsYWcsICJ2YWx1ZSIsIHN0YXRpY19jYXN0PGludD4odmFsdWUpKQorI2RlZmluZSBUUkFD
RV9DT1BZX0NPVU5URVIxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCB2YWx1ZSkgICAgICAgICAgICAg
ICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0NP
VU5URVIsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICBUUkFDRV9FVkVOVF9GTEFHX0NPUFksICJ2YWx1ZSIsICAgICAgICAgICAgICAgICAgXAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpCisjZGVmaW5l
IFRSQUNFX0NPVU5URVIyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCB2YWx1ZTFfbmFtZSwgdmFsdWUx
X3ZhbCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTJfbmFtZSwgdmFsdWUy
X3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZF
TlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0NPVU5URVIsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBc
CisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIHZhbHVl
MV9uYW1lLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8aW50Pih2YWx1ZTFfdmFsKSwgdmFsdWUyX25hbWUsICAgICAgIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odmFsdWUyX3ZhbCkpCisjZGVmaW5lIFRS
QUNFX0NPUFlfQ09VTlRFUjIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHZhbHVlMV9uYW1lLCB2YWx1
ZTFfdmFsLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMl9uYW1lLCB2YWx1
ZTJfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRf
QUREKFRSQUNFX0VWRU5UX1BIQVNFX0NPVU5URVIsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFksIHZhbHVlMV9u
YW1lLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8aW50Pih2YWx1ZTFfdmFsKSwgdmFsdWUyX25hbWUsICAgICAgIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odmFsdWUyX3ZhbCkpCisKKy8vIENvdW50ZXJz
IHdpdGggZXhwbGljaXQgdGltZXN0YW1wcy4KKyNkZWZpbmUgVFJBQ0VfQ09VTlRFUl9XSVRIX1RJ
TUVTVEFNUDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRpbWVzdGFtcCwgdmFsdWUpIFwKKyAgSU5U
RVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0NPVU5URVIsIGNhdGVn
b3J5X2dyb3VwLCBuYW1lLCB0aW1lc3RhbXAsICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VW
RU5UX0ZMQUdfTk9ORSwgInZhbHVlIiwgc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpCisKKyNkZWZp
bmUgVFJBQ0VfQ09VTlRFUl9XSVRIX1RJTUVTVEFNUDIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIHRp
bWVzdGFtcCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZh
bHVlMV9uYW1lLCB2YWx1ZTFfdmFsLCB2YWx1ZTJfbmFtZSwgXAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB2YWx1ZTJfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfVElNRVNUQU1QKCAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9DT1VOVEVS
LCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgdGltZXN0YW1wLCAgICAgICAgICAgXAorICAgICAgVFJB
Q0VfRVZFTlRfRkxBR19OT05FLCB2YWx1ZTFfbmFtZSwgc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZTFf
dmFsKSwgICAgIFwKKyAgICAgIHZhbHVlMl9uYW1lLCBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlMl92
YWwpKQorCisvLyBDb3VudGVycyB3aXRoIGlkcy4KKyNkZWZpbmUgVFJBQ0VfQ09VTlRFUl9JRDEo
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfQ09VTlRF
UiwgY2F0ZWdvcnlfZ3JvdXAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bmFtZSwgaWQsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgInZhbHVlIiwgIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpCisjZGVmaW5l
IFRSQUNFX0NPUFlfQ09VTlRFUl9JRDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB2YWx1ZSkg
ICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNF
X0VWRU5UX1BIQVNFX0NPVU5URVIsIGNhdGVnb3J5X2dyb3VwLCBcCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5hbWUsIGlkLCBUUkFDRV9FVkVOVF9GTEFHX0NPUFksICJ2YWx1
ZSIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGlu
dD4odmFsdWUpKQorI2RlZmluZSBUUkFDRV9DT1VOVEVSX0lEMihjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgaWQsIHZhbHVlMV9uYW1lLCB2YWx1ZTFfdmFsLCAgXAorICAgICAgICAgICAgICAgICAgICAg
ICAgICB2YWx1ZTJfbmFtZSwgdmFsdWUyX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9D
T1VOVEVSLCBjYXRlZ29yeV9ncm91cCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBuYW1lLCBpZCwgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCAgICAgICAgICAgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTFfbmFtZSwgc3RhdGljX2Nhc3Q8aW50
Pih2YWx1ZTFfdmFsKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1
ZTJfbmFtZSwgc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZTJfdmFsKSkKKyNkZWZpbmUgVFJBQ0VfQ09Q
WV9DT1VOVEVSX0lEMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHZhbHVlMV9uYW1lLCAgICAg
ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTFfdmFsLCB2YWx1ZTJf
bmFtZSwgdmFsdWUyX3ZhbCkgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
X1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfQ09VTlRFUiwgY2F0ZWdvcnlfZ3JvdXAsIFwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaWQsIFRSQUNFX0VWRU5UX0ZM
QUdfQ09QWSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dmFsdWUxX25hbWUsIHN0YXRpY19jYXN0PGludD4odmFsdWUxX3ZhbCksIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUyX25hbWUsIHN0YXRpY19jYXN0PGludD4odmFs
dWUyX3ZhbCkpCisKKy8vIFNhbXBsaW5nIHByb2ZpbGVyIGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0Vf
RVZFTlRfU0FNUExFX1dJVEhfSUQxKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1l
LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVO
VF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9TQU1QTEUsIGNhdGVnb3J5X2dyb3VwLCAg
IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaWQsIFRSQUNFX0VW
RU5UX0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGFyZzFfdmFsKQorCisvLyBMZWdhY3kgYXN5bmMgZXZlbnRzLgorI2RlZmluZSBUUkFD
RV9FVkVOVF9BU1lOQ19CRUdJTjAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkKSAgICAgICAgXAor
ICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9BU1lO
Q19CRUdJTiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBUUkFDRV9FVkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0JFR0lO
MShjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgXAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYXJnMV92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfQVNZ
TkNfQkVHSU4sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVn
b3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisj
ZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0JFR0lOMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQs
IGFyZzFfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWws
IGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
X1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFD
RV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAg
ICAgXAorICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBh
cmcyX25hbWUsIGFyZzJfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0FTWU5DX0JFR0lO
MChjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQpICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9B
RERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJTiwgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFkp
CisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfQVNZTkNfQkVHSU4xKGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBpZCwgYXJnMV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFyZzFfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RS
QUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0JFR0lOLCAgICAg
ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3Vw
LCBuYW1lLCBpZCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZp
bmUgVFJBQ0VfRVZFTlRfQ09QWV9BU1lOQ19CRUdJTjIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJn
MV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZF
TlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFt
ZSwgaWQsICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9u
YW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
QVNZTkNfQkVHSU5fV0lUSF9GTEFHUzAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBmbGFncykg
XAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9B
U1lOQ19CRUdJTiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgZmxhZ3MpCisKKy8vIExlZ2FjeSBhc3luYyBl
dmVudHMgd2l0aCBleHBsaWNpdCB0aW1lc3RhbXBzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9BU1lO
Q19CRUdJTl9XSVRIX1RJTUVTVEFNUDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBcCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXApICAg
ICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FO
RF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhB
U0VfQVNZTkNfQkVHSU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICBcCisg
ICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRpbWVzdGFtcCwgVFJBQ0Vf
RVZFTlRfRkxBR19OT05FKQorI2RlZmluZSBUUkFDRV9FVkVOVF9BU1lOQ19CRUdJTl9XSVRIX1RJ
TUVTVEFNUDEoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhdGVnb3J5X2dyb3Vw
LCBuYW1lLCBpZCwgdGltZXN0YW1wLCBhcmcxX25hbWUsIGFyZzFfdmFsKSAgICAgICAgICAgICAg
XAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCgg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfQkVH
SU4sIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgXAorICAgICAgVFJBQ0Vf
RVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdf
Tk9ORSwgXAorICAgICAgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
QVNZTkNfQkVHSU5fV0lUSF9USU1FU1RBTVAyKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAg
ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1l
c3RhbXAsIGFyZzFfbmFtZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19CRUdJ
TiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAgXAorICAgICAgVFJB
Q0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZM
QUdfTk9ORSwgICAgIFwKKyAgICAgIGFyZzFfbmFtZSwgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJn
Ml92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfQVNZTkNfQkVHSU5fV0lUSF9USU1FU1RB
TVAwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXApICAgICAgICAgICAgICAgIFwK
KyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19C
RUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAgXAorICAgICAg
VFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5U
X0ZMQUdfQ09QWSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfQkVHSU5fV0lUSF9USU1FU1RB
TVBfQU5EX0ZMQUdTMCggICAgIFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRpbWVz
dGFtcCwgZmxhZ3MpICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
X1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5U
X1BIQVNFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIFwKKyAgICAgIFRS
QUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVBRF9JRCwgdGltZXN0YW1wLCBmbGFncykKKworLy8g
TGVnYWN5IGFzeW5jIHN0ZXAgaW50byBldmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5D
X1NURVBfSU5UTzAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBzdGVwKSAgXAorICBJTlRFUk5B
TF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9BU1lOQ19TVEVQX0lO
VE8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgInN0ZXAiLCBzdGVwKQorI2RlZmluZSBUUkFDRV9FVkVO
VF9BU1lOQ19TVEVQX0lOVE8xKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgc3RlcCwgXAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfbmFtZSwgYXJnMV92YWwpICAg
ICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRCggICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNf
U1RFUF9JTlRPLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgXAorICAgICAgVFJBQ0VfRVZF
TlRfRkxBR19OT05FLCAic3RlcCIsIHN0ZXAsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisKKy8vIExl
Z2FjeSBhc3luYyBzdGVwIGludG8gZXZlbnRzIHdpdGggdGltZXN0YW1wcy4KKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfQVNZTkNfU1RFUF9JTlRPX1dJVEhfVElNRVNUQU1QMChjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGVwLCB0aW1lc3RhbXApICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZF
TlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX1NURVBfSU5UTywgY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5U
X1RIUkVBRF9JRCwgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICAgIFwKKyAgICAg
ICJzdGVwIiwgc3RlcCkKKworLy8gTGVnYWN5IGFzeW5jIHN0ZXAgcGFzdCBldmVudHMuCisjZGVm
aW5lIFRSQUNFX0VWRU5UX0FTWU5DX1NURVBfUEFTVDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCBzdGVwKSAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVO
VF9QSEFTRV9BU1lOQ19TVEVQX1BBU1QsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgInN0ZXAiLCBzdGVw
KQorI2RlZmluZSBUUkFDRV9FVkVOVF9BU1lOQ19TVEVQX1BBU1QxKGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBpZCwgc3RlcCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFy
ZzFfbmFtZSwgYXJnMV92YWwpICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9B
RERfV0lUSF9JRCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJB
Q0VfRVZFTlRfUEhBU0VfQVNZTkNfU1RFUF9QQVNULCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQs
ICAgXAorICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCAic3RlcCIsIHN0ZXAsIGFyZzFfbmFt
ZSwgYXJnMV92YWwpCisKKy8vIExlZ2FjeSBhc3luYyBlbmQgZXZlbnRzLgorI2RlZmluZSBUUkFD
RV9FVkVOVF9BU1lOQ19FTkQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNf
RU5ELCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3Vw
LCBuYW1lLCBpZCwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFD
RV9FVkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0VORDEoY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIGFyZzFfdmFsKSBcCisgIElOVEVSTkFMX1RS
QUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgICAgICAg
ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dy
b3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkK
KyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfRU5EMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQs
IGFyZzFfbmFtZSwgYXJnMV92YWwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
cmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJO
QUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0FTWU5DX0VORCwgY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5U
X0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNk
ZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9BU1lOQ19FTkQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBp
ZCkgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BI
QVNFX0FTWU5DX0VORCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRl
Z29yeV9ncm91cCwgbmFtZSwgaWQsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0FT
WU5DX0VORDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIFwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsKSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5U
X1BIQVNFX0FTWU5DX0VORCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgIFwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZLCBhcmcxX25h
bWUsIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0FTWU5DX0VORDIoY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfQVNZTkNfRU5ELCBjYXRlZ29y
eV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdf
Q09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUg
VFJBQ0VfRVZFTlRfQVNZTkNfRU5EX1dJVEhfRkxBR1MwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBp
ZCwgZmxhZ3MpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZF
TlRfUEhBU0VfQVNZTkNfRU5ELCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBmbGFncykKKworLy8gTGVnYWN5
IGFzeW5jIGVuZCBldmVudHMgd2l0aCBleHBsaWNpdCB0aW1lc3RhbXBzLgorI2RlZmluZSBUUkFD
RV9FVkVOVF9BU1lOQ19FTkRfV0lUSF9USU1FU1RBTVAwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBp
ZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVz
dGFtcCkgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9J
RF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZF
TlRfUEhBU0VfQVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAg
XAorICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIFRS
QUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVNZTkNfRU5EX1dJVEhf
VElNRVNUQU1QMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGFyZzFfbmFtZSwg
YXJnMV92YWwpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9U
SU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BI
QVNFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAg
IFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVBRF9JRCwgdGltZXN0YW1wLCBU
UkFDRV9FVkVOVF9GTEFHX05PTkUsICAgIFwKKyAgICAgIGFyZzFfbmFtZSwgYXJnMV92YWwpCisj
ZGVmaW5lIFRSQUNFX0VWRU5UX0FTWU5DX0VORF9XSVRIX1RJTUVTVEFNUDIoY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdGltZXN0YW1wLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkg
ICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRf
VElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9Q
SEFTRV9BU1lOQ19FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgICAg
ICBcCisgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRpbWVzdGFtcCwg
VFJBQ0VfRVZFTlRfRkxBR19OT05FLCAgICBcCisgICAgICBhcmcxX25hbWUsIGFyZzFfdmFsLCBh
cmcyX25hbWUsIGFyZzJfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0FTWU5DX0VORF9X
SVRIX1RJTUVTVEFNUDAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXApICAgICAgICAg
ICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSURfVElEX0FORF9USU1F
U1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0Vf
QVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgICAgICBcCisg
ICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRpbWVzdGFtcCwgVFJBQ0Vf
RVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFDRV9FVkVOVF9BU1lOQ19FTkRfV0lUSF9USU1F
U1RBTVBfQU5EX0ZMQUdTMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgXAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgdGltZXN0YW1wLCBm
bGFncykgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRF9USURfQU5EX1RJTUVT
VEFNUCggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0Vf
QVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgICAgICAgXAor
ICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3RhbXAsIGZsYWdz
KQorCisvLyBBc3luYyBldmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5D
X0JFR0lOMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQpICAgICAgICBcCisgIElOVEVSTkFMX1RS
QUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0JF
R0lOLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3Vw
LCBuYW1lLCBpZCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfTkVTVEFC
TEVfQVNZTkNfQkVHSU4xKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBcCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9J
RChUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lOQ19CRUdJTiwgICAgIFwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNF
X0VWRU5UX0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZF
TlRfTkVTVEFCTEVfQVNZTkNfQkVHSU4yKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9u
YW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3Zh
bCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9B
RERfV0lUSF9JRCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9n
cm91cCwgbmFtZSwgaWQsICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFy
ZzFfbmFtZSwgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpCisKKy8vIEFzeW5jIGVuZCBl
dmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5DX0VORDAoY2F0ZWdvcnlf
Z3JvdXAsIG5hbWUsIGlkKSAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lU
SF9JRChUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lOQ19FTkQsIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAg
ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZM
QUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfTkVTVEFCTEVfQVNZTkNfRU5EMShjYXRlZ29y
eV9ncm91cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGFyZzFfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
IElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX05FU1RB
QkxFX0FTWU5DX0VORCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwg
YXJnMV92YWwpCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RBQkxFX0FTWU5DX0VORDIoY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkgICAgICAgXAor
ICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRCggICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9B
U1lOQ19FTkQsIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgIFwKKyAgICAgIFRSQUNF
X0VWRU5UX0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3Zh
bCkKKworLy8gQXN5bmMgaW5zdGFudCBldmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX05FU1RB
QkxFX0FTWU5DX0lOU1RBTlQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICAgICAgIFwKKyAg
SU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfTkVTVEFC
TEVfQVNZTkNfSU5TVEFOVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
YXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfTkVTVEFCTEVfQVNZTkNfSU5TVEFOVDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
cmcxX25hbWUsIGFyZzFfdmFsKSAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5U
X0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0lOU1RBTlQsIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IGlkLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRS
QUNFX0VWRU5UX05FU1RBQkxFX0FTWU5DX0lOU1RBTlQyKCAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgYXJnMV92
YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERf
V0lUSF9JRCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBU
UkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lOQ19JTlNUQU5ULCBjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQsIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgYXJnMV9uYW1lLCBhcmcx
X3ZhbCwgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9ORVNU
QUJMRV9BU1lOQ19CRUdJTl9XSVRIX1RUUzIoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUs
IGFyZzJfdmFsKSAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRCgg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNF
X0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwgbmFtZSwg
aWQsICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX0FTWU5DX1RUUyB8IFRSQUNFX0VW
RU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBhcmcxX3ZhbCwgXAorICAgICAgYXJnMl9uYW1lLCBh
cmcyX3ZhbCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9ORVNUQUJMRV9BU1lOQ19FTkRfV0lU
SF9UVFMyKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5h
bWUsIGlkLCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKSAgICAgICAg
XAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRCggICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RB
QkxFX0FTWU5DX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICBcCisgICAg
ICBUUkFDRV9FVkVOVF9GTEFHX0FTWU5DX1RUUyB8IFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJn
MV9uYW1lLCBhcmcxX3ZhbCwgXAorICAgICAgYXJnMl9uYW1lLCBhcmcyX3ZhbCkKKworLy8gQXN5
bmMgZXZlbnRzIHdpdGggZXhwbGljaXQgdGltZXN0YW1wcy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRf
TkVTVEFCTEVfQVNZTkNfQkVHSU5fV0lUSF9USU1FU1RBTVAwKGNhdGVnb3J5X2dyb3VwLCBuYW1l
LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZCwgdGltZXN0YW1wKSAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERf
V0lUSF9JRF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0JFR0lOLCBjYXRlZ29yeV9ncm91
cCwgbmFtZSwgaWQsICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJF
QURfSUQsIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19OT05FKQorI2RlZmluZSBUUkFDRV9F
VkVOVF9ORVNUQUJMRV9BU1lOQ19FTkRfV0lUSF9USU1FU1RBTVAwKGNhdGVnb3J5X2dyb3VwLCBu
YW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWQsIHRpbWVzdGFtcCkgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQURE
X1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg
ICAgVFJBQ0VfRVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQsICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURf
SUQsIHRpbWVzdGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19OT05FKQorI2RlZmluZSBUUkFDRV9FVkVO
VF9ORVNUQUJMRV9BU1lOQ19FTkRfV0lUSF9USU1FU1RBTVAxKCAgICAgICAgICAgICAgICAgICAg
XAorICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgdGltZXN0YW1wLCBhcmcxX25hbWUsIGFy
ZzFfdmFsKSAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9J
RF9USURfQU5EX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0Vf
RVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQs
ICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhSRUFEX0lELCB0aW1lc3Rh
bXAsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgXAorICAgICAgYXJnMV9uYW1lLCBhcmcxX3ZhbCkK
KyNkZWZpbmUgVFJBQ0VfRVZFTlRfTkVTVEFCTEVfQVNZTkNfSU5TVEFOVF9XSVRIX1RJTUVTVEFN
UDAoICAgICAgICAgICAgICAgXAorICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgdGltZXN0
YW1wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNF
X0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX05FU1RBQkxFX0FTWU5DX0lOU1RBTlQsIGNhdGVn
b3J5X2dyb3VwLCBuYW1lLCBpZCwgXAorICAgICAgVFJBQ0VfRVZFTlRfQVBJX0NVUlJFTlRfVEhS
RUFEX0lELCB0aW1lc3RhbXAsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0Vf
RVZFTlRfQ09QWV9ORVNUQUJMRV9BU1lOQ19CRUdJTjAoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlk
KSAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhB
U0VfTkVTVEFCTEVfQVNZTkNfQkVHSU4sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgIFwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorI2RlZmlu
ZSBUUkFDRV9FVkVOVF9DT1BZX05FU1RBQkxFX0FTWU5DX0VORDAoY2F0ZWdvcnlfZ3JvdXAsIG5h
bWUsIGlkKSAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZF
TlRfUEhBU0VfTkVTVEFCTEVfQVNZTkNfRU5ELCBcCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX0NPUFkpCisjZGVm
aW5lIFRSQUNFX0VWRU5UX0NPUFlfTkVTVEFCTEVfQVNZTkNfQkVHSU5fV0lUSF9USU1FU1RBTVAw
KCAgICAgICAgICBcCisgICAgY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCB0aW1lc3RhbXApICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FE
RF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1QKCAgICAgICAgICAgICAgICAgICBcCisgICAgICBU
UkFDRV9FVkVOVF9QSEFTRV9ORVNUQUJMRV9BU1lOQ19CRUdJTiwgY2F0ZWdvcnlfZ3JvdXAsIG5h
bWUsIGlkLCBcCisgICAgICBUUkFDRV9FVkVOVF9BUElfQ1VSUkVOVF9USFJFQURfSUQsIHRpbWVz
dGFtcCwgVFJBQ0VfRVZFTlRfRkxBR19DT1BZKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX05F
U1RBQkxFX0FTWU5DX0VORF9XSVRIX1RJTUVTVEFNUDAoICAgICAgICAgIFwKKyAgICBjYXRlZ29y
eV9ncm91cCwgbmFtZSwgaWQsIHRpbWVzdGFtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEX1RJRF9BTkRfVElNRVNUQU1Q
KCAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfTkVTVEFCTEVfQVNZ
TkNfRU5ELCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQ
SV9DVVJSRU5UX1RIUkVBRF9JRCwgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX0NPUFkpCisK
Ky8vIExlZ2FjeSBmbG93IGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRkxPV19CRUdJTjAo
Y2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkKSAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVO
VF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9GTE9XX0JFR0lOLCBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05F
KQorI2RlZmluZSBUUkFDRV9FVkVOVF9GTE9XX0JFR0lOMShjYXRlZ29yeV9ncm91cCwgbmFtZSwg
aWQsIGFyZzFfbmFtZSwgYXJnMV92YWwpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJ
VEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19CRUdJTiwgICAgICAgICAgICAgICBcCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwg
ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBU
UkFDRV9FVkVOVF9GTEFHX05PTkUsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNF
X0VWRU5UX0ZMT1dfQkVHSU4yKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBh
cmcxX3ZhbCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyX25hbWUsIGFy
ZzJfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZF
TlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgICBUUkFDRV9FVkVOVF9QSEFTRV9GTE9XX0JFR0lOLCBjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQsICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05F
LCBhcmcxX25hbWUsIGFyZzFfdmFsLCBhcmcyX25hbWUsIGFyZzJfdmFsKQorI2RlZmluZSBUUkFD
RV9FVkVOVF9DT1BZX0ZMT1dfQkVHSU4wKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkgICBcCisg
IElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1df
QkVHSU4sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfZ3Jv
dXAsIG5hbWUsIGlkLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBU
UkFDRV9FVkVOVF9GTEFHX0NPUFkpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NPUFlfRkxPV19CRUdJ
TjEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmcxX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFT
RV9GTE9XX0JFR0lOLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19DT1BZLCBhcmcxX25hbWUs
IGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZX0ZMT1dfQkVHSU4yKGNhdGVnb3J5
X2dyb3VwLCBuYW1lLCBpZCwgYXJnMV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpICAgICAgIFwKKyAgSU5U
RVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19CRUdJTiwgY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFH
X0NPUFksIGFyZzFfbmFtZSwgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpCisKKy8vIExl
Z2FjeSBmbG93IHN0ZXAgZXZlbnRzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9GTE9XX1NURVAwKGNh
dGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgc3RlcCkgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRf
QUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19TVEVQLCBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgXAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICJz
dGVwIiwgc3RlcCkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRkxPV19TVEVQMShjYXRlZ29yeV9ncm91
cCwgbmFtZSwgaWQsIHN0ZXAsIGFyZzFfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGFyZzFfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElO
VEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1dfU1RFUCwgY2F0ZWdv
cnlfZ3JvdXAsIG5hbWUsIGlkLCAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRfRkxB
R19OT05FLCAic3RlcCIsIHN0ZXAsIGFyZzFfbmFtZSwgYXJnMV92YWwpCisjZGVmaW5lIFRSQUNF
X0VWRU5UX0NPUFlfRkxPV19TVEVQMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHN0ZXApIFwK
KyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxP
V19TVEVQLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29y
eV9ncm91cCwgbmFtZSwgaWQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgInN0ZXAiLCBzdGVwKQorI2RlZmluZSBUUkFD
RV9FVkVOVF9DT1BZX0ZMT1dfU1RFUDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBzdGVwLCBh
cmcxX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFs
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VW
RU5UX0FERF9XSVRIX0lEKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19TVEVQLCBjYXRlZ29yeV9ncm91cCwg
bmFtZSwgaWQsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQ09Q
WSwgInN0ZXAiLCBzdGVwLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorCisvLyBMZWdhY3kgZmxvdyBl
bmQgZXZlbnRzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9GTE9XX0VORDAoY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZF
TlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRkxPV19FTkQsIGNhdGVnb3J5X2dyb3Vw
LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlkLCBUUkFDRV9F
VkVOVF9GTEFHX05PTkUpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0ZMT1dfRU5EX0JJTkRfVE9fRU5D
TE9TSU5HMChjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQpICAgICAgXAorICBJTlRFUk5BTF9UUkFD
RV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9GTE9XX0VORCwgY2F0ZWdvcnlf
Z3JvdXAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaWQsICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfQklORF9UT19FTkNMT1NJTkcpCisjZGVmaW5l
IFRSQUNFX0VWRU5UX0ZMT1dfRU5EMShjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGFyZzFfbmFt
ZSwgYXJnMV92YWwpICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFD
RV9FVkVOVF9QSEFTRV9GTE9XX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaWQsIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgYXJn
MV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsKQor
I2RlZmluZSBUUkFDRV9FVkVOVF9GTE9XX0VORDIoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkLCBh
cmcxX25hbWUsIGFyZzFfdmFsLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFy
ZzJfbmFtZSwgYXJnMl92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVS
TkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1dfRU5ELCBj
YXRlZ29yeV9ncm91cCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1l
LCBpZCwgVFJBQ0VfRVZFTlRfRkxBR19OT05FLCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpCisjZGVm
aW5lIFRSQUNFX0VWRU5UX0NPUFlfRkxPV19FTkQwKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCkg
ICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChU
UkFDRV9FVkVOVF9QSEFTRV9GTE9XX0VORCwgY2F0ZWdvcnlfZ3JvdXAsIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaWQsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSkK
KyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ09QWV9GTE9XX0VORDEoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUs
IGlkLCBhcmcxX25hbWUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFyZzFfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRF
Uk5BTF9UUkFDRV9FVkVOVF9BRERfV0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9GTE9XX0VORCwg
Y2F0ZWdvcnlfZ3JvdXAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFt
ZSwgaWQsIFRSQUNFX0VWRU5UX0ZMQUdfQ09QWSwgYXJnMV9uYW1lLCBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGFyZzFfdmFsKQorI2RlZmluZSBUUkFDRV9FVkVOVF9DT1BZ
X0ZMT1dfRU5EMihjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIGFyZzFfbmFtZSwgICAgICAgIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMV92YWwsIGFyZzJfbmFtZSwg
YXJnMl92YWwpICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRI
X0lEKFRSQUNFX0VWRU5UX1BIQVNFX0ZMT1dfRU5ELCBjYXRlZ29yeV9ncm91cCwgXAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpZCwgVFJBQ0VfRVZFTlRfRkxBR19D
T1BZLCBhcmcxX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJn
MV92YWwsIGFyZzJfbmFtZSwgYXJnMl92YWwpCisKKy8vIFNwZWNpYWwgc3Ryb25nbHkgdHlwZWQg
dHJhY2UgZXZlbnRzLgorLy8gVE9ETyhza3lvc3RpbCk6IE1pZ3JhdGUgdGhlc2UgdG8gcmVndWxh
ciB0cmFjayBldmVudCB0cmFjZSBwb2ludHMuCisjZGVmaW5lIFRSQUNFX1RBU0tfRVhFQ1VUSU9O
KHJ1bl9mdW5jdGlvbiwgdGFzaykgXAorICBpZiAoZmFsc2UpIHsgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFwKKyAgICBiYXNlOjppZ25vcmVfcmVzdWx0KHJ1bl9mdW5jdGlvbik7
ICAgICAgICAgICBcCisgICAgYmFzZTo6aWdub3JlX3Jlc3VsdCh0YXNrKTsgICAgICAgICAgICAg
ICAgICAgXAorICB9CisKKyNkZWZpbmUgVFJBQ0VfTE9HX01FU1NBR0UoZmlsZSwgbWVzc2FnZSwg
bGluZSkgXAorICBpZiAoZmFsc2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgYmFzZTo6aWdub3JlX3Jlc3VsdChmaWxlKTsgICAgICAgICAgICAgICAgIFwKKyAgICBi
YXNlOjppZ25vcmVfcmVzdWx0KG1lc3NhZ2UpOyAgICAgICAgICAgICAgXAorICAgIGJhc2U6Omln
bm9yZV9yZXN1bHQobGluZSk7ICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gTWV0YWRhdGEg
ZXZlbnRzLgorI2RlZmluZSBUUkFDRV9FVkVOVF9NRVRBREFUQTEoY2F0ZWdvcnlfZ3JvdXAsIG5h
bWUsIGFyZzFfbmFtZSwgYXJnMV92YWwpIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZFTlRfTUVUQURB
VEFfQUREKGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBhcmcxX25hbWUsIGFyZzFfdmFsKQorCisvLyBD
bG9jayBzeW5jIGV2ZW50cy4KKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ0xPQ0tfU1lOQ19SRUNFSVZF
UihzeW5jX2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0Vf
RVZFTlRfQUREKFRSQUNFX0VWRU5UX1BIQVNFX0NMT0NLX1NZTkMsICJfX21ldGFkYXRhIiwgICAg
IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbG9ja19zeW5jIiwgVFJBQ0VfRVZFTlRf
RkxBR19OT05FLCAic3luY19pZCIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNf
aWQpCisjZGVmaW5lIFRSQUNFX0VWRU5UX0NMT0NLX1NZTkNfSVNTVUVSKHN5bmNfaWQsIGlzc3Vl
X3RzLCBpc3N1ZV9lbmRfdHMpICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9X
SVRIX1RJTUVTVEFNUCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
ICBUUkFDRV9FVkVOVF9QSEFTRV9DTE9DS19TWU5DLCAiX19tZXRhZGF0YSIsICJjbG9ja19zeW5j
IiwgaXNzdWVfZW5kX3RzLCBcCisgICAgICBUUkFDRV9FVkVOVF9GTEFHX05PTkUsICJzeW5jX2lk
Iiwgc3luY19pZCwgImlzc3VlX3RzIiwgaXNzdWVfdHMpCisKKy8vIE9iamVjdCBldmVudHMuCisj
ZGVmaW5lIFRSQUNFX0VWRU5UX09CSkVDVF9DUkVBVEVEX1dJVEhfSUQoY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lEKFRSQUNFX0VW
RU5UX1BIQVNFX0NSRUFURV9PQkpFQ1QsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAgICBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSkKKworI2RlZmluZSBU
UkFDRV9FVkVOVF9PQkpFQ1RfU05BUFNIT1RfV0lUSF9JRChjYXRlZ29yeV9ncm91cCwgbmFtZSwg
aWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNo
b3QpICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FERF9XSVRIX0lE
KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJBQ0VfRVZFTlRf
UEhBU0VfU05BUFNIT1RfT0JKRUNULCBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsICAgIFwKKyAg
ICAgIFRSQUNFX0VWRU5UX0ZMQUdfTk9ORSwgInNuYXBzaG90Iiwgc25hcHNob3QpCisKKyNkZWZp
bmUgVFJBQ0VfRVZFTlRfT0JKRUNUX1NOQVBTSE9UX1dJVEhfSURfQU5EX1RJTUVTVEFNUCggICAg
ICAgICAgICAgICAgIFwKKyAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwgaWQsIHRpbWVzdGFtcCwg
c25hcHNob3QpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfVFJBQ0VfRVZF
TlRfQUREX1dJVEhfSURfVElEX0FORF9USU1FU1RBTVAoICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgIFRSQUNFX0VWRU5UX1BIQVNFX1NOQVBTSE9UX09CSkVDVCwgY2F0ZWdvcnlfZ3JvdXAs
IG5hbWUsIGlkLCAgICAgICAgIFwKKyAgICAgIFRSQUNFX0VWRU5UX0FQSV9DVVJSRU5UX1RIUkVB
RF9JRCwgdGltZXN0YW1wLCBUUkFDRV9FVkVOVF9GTEFHX05PTkUsIFwKKyAgICAgICJzbmFwc2hv
dCIsIHNuYXBzaG90KQorCisjZGVmaW5lIFRSQUNFX0VWRU5UX09CSkVDVF9ERUxFVEVEX1dJVEhf
SUQoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGlkKSBcCisgIElOVEVSTkFMX1RSQUNFX0VWRU5UX0FE
RF9XSVRIX0lEKFRSQUNFX0VWRU5UX1BIQVNFX0RFTEVURV9PQkpFQ1QsICBcCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBpZCwgICAgICAg
ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VWRU5UX0ZMQUdf
Tk9ORSkKKworLy8gQ29udGV4dCBldmVudHMuCisjZGVmaW5lIFRSQUNFX0VWRU5UX0VOVEVSX0NP
TlRFWFQoY2F0ZWdvcnlfZ3JvdXAsIG5hbWUsIGNvbnRleHQpICAgIFwKKyAgSU5URVJOQUxfVFJB
Q0VfRVZFTlRfQUREX1dJVEhfSUQoVFJBQ0VfRVZFTlRfUEhBU0VfRU5URVJfQ09OVEVYVCwgXAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9ncm91cCwgbmFtZSwg
Y29udGV4dCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0VW
RU5UX0ZMQUdfTk9ORSkKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfTEVBVkVfQ09OVEVYVChjYXRlZ29y
eV9ncm91cCwgbmFtZSwgY29udGV4dCkgICAgXAorICBJTlRFUk5BTF9UUkFDRV9FVkVOVF9BRERf
V0lUSF9JRChUUkFDRV9FVkVOVF9QSEFTRV9MRUFWRV9DT05URVhULCBcCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2dyb3VwLCBuYW1lLCBjb250ZXh0LCAgIFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVZFTlRfRkxBR19OT05F
KQorCisvLyBNYWNybyB0byBlZmZpY2llbnRseSBkZXRlcm1pbmUgaWYgYSBnaXZlbiBjYXRlZ29y
eSBncm91cCBpcyBlbmFibGVkLgorI2RlZmluZSBUUkFDRV9FVkVOVF9DQVRFR09SWV9HUk9VUF9F
TkFCTEVEKGNhdGVnb3J5LCByZXQpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKnJldCA9IFRSQUNFX0VWRU5UX0NBVEVH
T1JZX0VOQUJMRUQoY2F0ZWdvcnkpOyAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvLyBNYWNy
byB0byBlZmZpY2llbnRseSBkZXRlcm1pbmUsIHRocm91Z2ggcG9sbGluZywgaWYgYSBuZXcgdHJh
Y2UgaGFzIGJlZ3VuLgorLy8gVE9ETyhza3lvc3RpbCk6IEltcGxlbWVudC4KKyNkZWZpbmUgVFJB
Q0VfRVZFTlRfSVNfTkVXX1RSQUNFKHJldCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgKnJldCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgIFwKKyAg
fSB3aGlsZSAoMCkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGVnYWN5IHRyYWNpbmcg
QVBJIChhZGFwdGVkIGZyb20gdHJhY2VfZXZlbnQuaCkuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CisKKy8vIFdlIGNhbiBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBzdWJzZXQgb2YgdGhlIGxlZ2Fj
eSB0cmFjaW5nIEFQSSB3aXRob3V0CisvLyBpbnZvbHZlbWVudCBmcm9tIHRoZSBlbWJlZGRlci4g
QVBJcyBzdWNoIGFzIFRSQUNFX0VWRU5UX0FQSV9BRERfVFJBQ0VfRVZFTlQKKy8vIGFyZSBzdGls
bCB1cCB0byB0aGUgZW1iZWRkZXIgdG8gZGVmaW5lLgorCisjZGVmaW5lIFRSQUNFX1NUUl9DT1BZ
KHN0cikgKHN0cikKKworI2RlZmluZSBUUkFDRV9JRF9XSVRIX1NDT1BFKHNjb3BlLCAuLi4pIFwK
KyAgOjpwZXJmZXR0bzo6aW50ZXJuYWw6OkxlZ2FjeVRyYWNlSWQ6OldpdGhTY29wZShzY29wZSwg
IyNfX1ZBX0FSR1NfXykKKworLy8gVXNlIHRoaXMgZm9yIGlkcyB0aGF0IGFyZSB1bmlxdWUgYWNy
b3NzIHByb2Nlc3Nlcy4gVGhpcyBhbGxvd3MgZGlmZmVyZW50CisvLyBwcm9jZXNzZXMgdG8gdXNl
IHRoZSBzYW1lIGlkIHRvIHJlZmVyIHRvIHRoZSBzYW1lIGV2ZW50LgorI2RlZmluZSBUUkFDRV9J
RF9HTE9CQUwoaWQpIDo6cGVyZmV0dG86OmludGVybmFsOjpMZWdhY3lUcmFjZUlkOjpHbG9iYWxJ
ZChpZCkKKworLy8gVXNlIHRoaXMgZm9yIGlkcyB0aGF0IGFyZSB1bmlxdWUgd2l0aGluIGEgc2lu
Z2xlIHByb2Nlc3MuIFRoaXMgYWxsb3dzCisvLyBkaWZmZXJlbnQgcHJvY2Vzc2VzIHRvIHVzZSB0
aGUgc2FtZSBpZCB0byByZWZlciB0byBkaWZmZXJlbnQgZXZlbnRzLgorI2RlZmluZSBUUkFDRV9J
RF9MT0NBTChpZCkgOjpwZXJmZXR0bzo6aW50ZXJuYWw6OkxlZ2FjeVRyYWNlSWQ6OkxvY2FsSWQo
aWQpCisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIGEgdWludDhfdCB3aGljaCBpbmRpY2F0ZXMg
d2hldGhlciB0cmFjaW5nIGlzIGVuYWJsZWQgZm9yCisvLyB0aGUgZ2l2ZW4gY2F0ZWdvcnkgb3Ig
bm90LiBBIHplcm8gdmFsdWUgbWVhbnMgdHJhY2luZyBpcyBkaXNhYmxlZCBhbmQKKy8vIG5vbi16
ZXJvIGluZGljYXRlcyBhdCBsZWFzdCBvbmUgdHJhY2luZyBzZXNzaW9uIGZvciB0aGlzIGNhdGVn
b3J5IGlzIGFjdGl2ZS4KKy8vIE5vdGUgdGhhdCBjYWxsZXJzIHNob3VsZCBub3QgbWFrZSBhbnkg
YXNzdW1wdGlvbnMgYXQgd2hhdCBlYWNoIGJpdCByZXByZXNlbnRzCisvLyBpbiB0aGUgc3RhdHVz
IGJ5dGUuIERvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBjYXRlZ29yaWVzLgorI2RlZmluZSBUUkFD
RV9FVkVOVF9BUElfR0VUX0NBVEVHT1JZX0dST1VQX0VOQUJMRUQoY2F0ZWdvcnkpICAgICAgICAg
ICAgICAgICBcCisgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFsmXSB7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICBzdGF0aWNfYXNzZXJ0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAhOjpQRVJGRVRUT19UUkFDS19FVkVO
VF9OQU1FU1BBQ0U6OmludGVybmFsOjpJc0R5bmFtaWNDYXRlZ29yeSggIFwKKyAgICAgICAgICAg
ICAgICBjYXRlZ29yeSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICAgICAgIkVuYWJsZWQgZmxhZyBwb2ludGVycyBhcmUgbm90IHN1
cHBvcnRlZCBmb3IgZHluYW1pYyB0cmFjZSAiICAgICBcCisgICAgICAgICAgICAiY2F0ZWdvcmll
cy4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOjpQRVJGRVRUT19UUkFDS19FVkVOVF9OQU1F
U1BBQ0U6OmludGVybmFsOjprQ29uc3RFeHByQ2F0ZWdvcnlSZWdpc3RyeSBcCisgICAgICAgICAg
LkdldENhdGVnb3J5U3RhdGUoUEVSRkVUVE9fR0VUX0NBVEVHT1JZX0lOREVYKGNhdGVnb3J5KSkp
CisKKyNlbmRpZiAgLy8gUEVSRkVUVE9fRU5BQkxFX0xFR0FDWV9UUkFDRV9FVkVOVFMKKworI2Vu
ZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfVFJBQ0tfRVZFTlRfTEVHQUNZX0hfCisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK
KyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0
aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNv
bXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0
aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz
L0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9y
IGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQg
V0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBp
bXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292
ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2Uu
CisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1RSQUNJTkdfSF8KKyNkZWZpbmUgSU5D
TFVERV9QRVJGRVRUT19UUkFDSU5HX0hfCisKKy8vIFRoaXMgaGVhZGVycyB3cmFwcyBhbGwgdGhl
IGhlYWRlcnMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgcHVibGljIFBlcmZldHRvCisvLyBUcmFjaW5n
IEFQSS4gRW1iZWRkZXJzIHNob3VsZCBwcmVmZXJhYmx5IHVzZSB0aGlzIG9uZSBoZWFkZXIgdG8g
YXZvaWQgaGF2aW5nCisvLyB0byBmaWd1cmUgb3V0IHRoZSB2YXJpb3VzIHNldCBvZiBoZWFkZXIg
cmVxdWlyZWQgZm9yIGVhY2ggY2xhc3MuCisvLyBUaGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBz
aG91bGQgYmUgbGFyZ2UgcHJvamVjdHMgd2hlcmUgYnVpbGQgdGltZSBpcyBhCisvLyBjb25jZXJu
IChlLmcuIGNocm9taXVtKSwgd2hpY2ggbWlnaCBwcmVmZXIgc3RpY2tpbmcgdG8gc3RyaWN0IElX
WVUuCisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Ry
YWNpbmcvYnVmZmVyX2V4aGF1c3RlZF9wb2xpY3kuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvY29yZS9kYXRhX3NvdXJjZV9jb25maWcu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNp
bmcvY29yZS9kYXRhX3NvdXJjZV9kZXNjcmlwdG9yLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2NvcmUvdHJhY2VfY29uZmlnLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL2Rh
dGFfc291cmNlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by90cmFjaW5nL3BsYXRmb3JtLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3RyYWNpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvdHJhY2luZ19iYWNrZW5kLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by90cmFjaW5nL3Ry
YWNrX2V2ZW50LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by90cmFjaW5nL3RyYWNrX2V2ZW50X2ludGVybmVkX2RhdGFfaW5kZXguaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3RyYWNpbmcvdHJhY2tfZXZl
bnRfbGVnYWN5LmgiCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19UUkFDSU5HX0hfCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1v
bi9hbmRyb2lkX2xvZ19jb25zdGFudHMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhl
IFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZF
VFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0FORFJPSURfTE9HX0NPTlNUQU5UU19Q
Uk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9B
TkRST0lEX0xPR19DT05TVEFOVFNfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lu
Y2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZl
dHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworZW51bSBB
bmRyb2lkTG9nSWQgOiBpbnQzMl90IHsKKyAgTElEX0RFRkFVTFQgPSAwLAorICBMSURfUkFESU8g
PSAxLAorICBMSURfRVZFTlRTID0gMiwKKyAgTElEX1NZU1RFTSA9IDMsCisgIExJRF9DUkFTSCA9
IDQsCisgIExJRF9TVEFUUyA9IDUsCisgIExJRF9TRUNVUklUWSA9IDYsCisgIExJRF9LRVJORUwg
PSA3LAorfTsKKworY29uc3QgQW5kcm9pZExvZ0lkIEFuZHJvaWRMb2dJZF9NSU4gPSBMSURfREVG
QVVMVDsKK2NvbnN0IEFuZHJvaWRMb2dJZCBBbmRyb2lkTG9nSWRfTUFYID0gTElEX0tFUk5FTDsK
KworZW51bSBBbmRyb2lkTG9nUHJpb3JpdHkgOiBpbnQzMl90IHsKKyAgUFJJT19VTlNQRUNJRklF
RCA9IDAsCisgIFBSSU9fVU5VU0VEID0gMSwKKyAgUFJJT19WRVJCT1NFID0gMiwKKyAgUFJJT19E
RUJVRyA9IDMsCisgIFBSSU9fSU5GTyA9IDQsCisgIFBSSU9fV0FSTiA9IDUsCisgIFBSSU9fRVJS
T1IgPSA2LAorICBQUklPX0ZBVEFMID0gNywKK307CisKK2NvbnN0IEFuZHJvaWRMb2dQcmlvcml0
eSBBbmRyb2lkTG9nUHJpb3JpdHlfTUlOID0gUFJJT19VTlNQRUNJRklFRDsKK2NvbnN0IEFuZHJv
aWRMb2dQcmlvcml0eSBBbmRyb2lkTG9nUHJpb3JpdHlfTUFYID0gUFJJT19GQVRBTDsKKworfSAv
LyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAv
LyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3By
b3Rvcy9wZXJmZXR0by9jb21tb24vYnVpbHRpbl9jbG9jay5wYnplcm8uaAorLy8gQXV0b2dlbmVy
YXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNp
Zm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fQlVJTFRJTl9DTE9D
S19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1P
Tl9CVUlMVElOX0NMT0NLX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRl
IDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
cHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCisKK2VudW0gQnVpbHRp
bkNsb2NrIDogaW50MzJfdCB7CisgIEJVSUxUSU5fQ0xPQ0tfVU5LTk9XTiA9IDAsCisgIEJVSUxU
SU5fQ0xPQ0tfUkVBTFRJTUUgPSAxLAorICBCVUlMVElOX0NMT0NLX1JFQUxUSU1FX0NPQVJTRSA9
IDIsCisgIEJVSUxUSU5fQ0xPQ0tfTU9OT1RPTklDID0gMywKKyAgQlVJTFRJTl9DTE9DS19NT05P
VE9OSUNfQ09BUlNFID0gNCwKKyAgQlVJTFRJTl9DTE9DS19NT05PVE9OSUNfUkFXID0gNSwKKyAg
QlVJTFRJTl9DTE9DS19CT09UVElNRSA9IDYsCisgIEJVSUxUSU5fQ0xPQ0tfTUFYX0lEID0gNjMs
Cit9OworCitjb25zdCBCdWlsdGluQ2xvY2sgQnVpbHRpbkNsb2NrX01JTiA9IEJVSUxUSU5fQ0xP
Q0tfVU5LTk9XTjsKK2NvbnN0IEJ1aWx0aW5DbG9jayBCdWlsdGluQ2xvY2tfTUFYID0gQlVJTFRJ
Tl9DTE9DS19NQVhfSUQ7CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8v
IE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL2NvbW1pdF9kYXRhX3Jl
cXVlc3QucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxl
ciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fQ09NTU9OX0NPTU1JVF9EQVRBX1JFUVVFU1RfUFJPVE9fSF8KKyNkZWZpbmUgUEVS
RkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fQ09NTUlUX0RBVEFfUkVRVUVTVF9Q
Uk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9t
ZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3Rv
cyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtU
b1BhdGNoOworY2xhc3MgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX1BhdGNoOworY2xh
c3MgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlOworCitjbGFzcyBDb21taXREYXRhUmVx
dWVzdF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7
CisgcHVibGljOgorICBDb21taXREYXRhUmVxdWVzdF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBDb21taXREYXRhUmVxdWVzdF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENvbW1pdERhdGFSZXF1ZXN0X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2NodW5rc190b19tb3ZlKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZp
ZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGNodW5rc190b19tb3ZlKCkgY29u
c3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDEpOyB9Cisg
IGJvb2wgaGFzX2NodW5rc190b19wYXRjaCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzPiBjaHVua3NfdG9fcGF0Y2goKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMik7IH0KKyAgYm9vbCBoYXNfZmx1c2hfcmVxdWVzdF9p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBmbHVzaF9y
ZXF1ZXN0X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorfTsKKwor
Y2xhc3MgQ29tbWl0RGF0YVJlcXVlc3QgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IENvbW1pdERhdGFSZXF1ZXN0X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2h1bmtzVG9Nb3ZlRmllbGROdW1iZXIgPSAxLAorICAg
IGtDaHVua3NUb1BhdGNoRmllbGROdW1iZXIgPSAyLAorICAgIGtGbHVzaFJlcXVlc3RJZEZpZWxk
TnVtYmVyID0gMywKKyAgfTsKKyAgdXNpbmcgQ2h1bmtzVG9Nb3ZlID0gOjpwZXJmZXR0bzo6cHJv
dG9zOjpwYnplcm86OkNvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZTsKKyAgdXNpbmcgQ2h1
bmtUb1BhdGNoID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNvbW1pdERhdGFSZXF1ZXN0
X0NodW5rVG9QYXRjaDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDb21taXREYXRhUmVxdWVz
dF9DaHVua3NUb01vdmU+IFQqIGFkZF9jaHVua3NfdG9fbW92ZSgpIHsKKyAgICByZXR1cm4gQmVn
aW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBD
b21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2g+IFQqIGFkZF9jaHVua3NfdG9fcGF0Y2goKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyKTsKKyAgfQorCisgIHZvaWQgc2V0
X2ZsdXNoX3JlcXVlc3RfaWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1
YmxpYzoKKyAgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoX0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaF9EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENv
bW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc190YXJnZXRfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIHVpbnQzMl90IHRhcmdldF9idWZmZXIoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3dyaXRlcl9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB3cml0ZXJfaWQoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2NodW5rX2lkKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNodW5rX2lkKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19wYXRjaGVzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRl
cmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IHBhdGNoZXMoKSBjb25zdCB7IHJldHVybiBH
ZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNCk7IH0KKyAgYm9vbCBoYXNfaGFz
X21vcmVfcGF0Y2hlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBib29s
IGhhc19tb3JlX3BhdGNoZXMoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2Jvb2woKTsgfQor
fTsKKworY2xhc3MgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtUb1BhdGNoIDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDb21taXREYXRh
UmVxdWVzdF9DaHVua1RvUGF0Y2hfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtU
YXJnZXRCdWZmZXJGaWVsZE51bWJlciA9IDEsCisgICAga1dyaXRlcklkRmllbGROdW1iZXIgPSAy
LAorICAgIGtDaHVua0lkRmllbGROdW1iZXIgPSAzLAorICAgIGtQYXRjaGVzRmllbGROdW1iZXIg
PSA0LAorICAgIGtIYXNNb3JlUGF0Y2hlc0ZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdXNpbmcg
UGF0Y2ggPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6Q29tbWl0RGF0YVJlcXVlc3RfQ2h1
bmtUb1BhdGNoX1BhdGNoOworICB2b2lkIHNldF90YXJnZXRfYnVmZmVyKHVpbnQzMl90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF93cml0ZXJf
aWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2NodW5rX2lkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENvbW1pdERhdGFSZXF1ZXN0
X0NodW5rVG9QYXRjaF9QYXRjaD4gVCogYWRkX3BhdGNoZXMoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisgIHZvaWQgc2V0X2hhc19tb3JlX3BhdGNoZXMo
Ym9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2hfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENv
bW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaF9QYXRjaF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBDb21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2hfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBD
b21taXREYXRhUmVxdWVzdF9DaHVua1RvUGF0Y2hfUGF0Y2hfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIHVpbnQzMl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWlu
dDMyKCk7IH0KKyAgYm9vbCBoYXNfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBkYXRhKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBDb21taXREYXRhUmVxdWVzdF9DaHVua1Rv
UGF0Y2hfUGF0Y2ggOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IENvbW1pdERhdGFSZXF1ZXN0X0NodW5rVG9QYXRjaF9QYXRjaF9EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga09mZnNldEZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrRGF0YUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfb2Zmc2V0KHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9k
YXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9kYXRhKGNvbnN0IHVpbnQ4
X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7
CisgIH0KK307CisKK2NsYXNzIENvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZV9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgQ29tbWl0RGF0YVJlcXVlc3RfQ2h1bmtzVG9Nb3ZlX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IENvbW1pdERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZV9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENvbW1pdERh
dGFSZXF1ZXN0X0NodW5rc1RvTW92ZV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19wYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IHBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wg
aGFzX2NodW5rKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGNodW5rKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhh
c190YXJnZXRfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IHRhcmdldF9idWZmZXIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigp
OyB9Cit9OworCitjbGFzcyBDb21taXREYXRhUmVxdWVzdF9DaHVua3NUb01vdmUgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IENvbW1p
dERhdGFSZXF1ZXN0X0NodW5rc1RvTW92ZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga1BhZ2VGaWVsZE51bWJlciA9IDEsCisgICAga0NodW5rRmllbGROdW1iZXIgPSAyLAorICAg
IGtUYXJnZXRCdWZmZXJGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X3BhZ2UodWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2NodW5rKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF90YXJnZXRfYnVmZmVyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24v
ZGF0YV9zb3VyY2VfZGVzY3JpcHRvci5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUg
UHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVU
VE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fREFUQV9TT1VSQ0VfREVTQ1JJUFRPUl9Q
Uk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9E
QVRBX1NPVVJDRV9ERVNDUklQVE9SX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNp
bmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRz
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBH
cHVDb3VudGVyRGVzY3JpcHRvcjsKK2NsYXNzIFRyYWNrRXZlbnREZXNjcmlwdG9yOworCitjbGFz
cyBEYXRhU291cmNlRGVzY3JpcHRvcl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRGF0YVNvdXJjZURlc2NyaXB0b3JfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRGF0YVNvdXJjZURlc2NyaXB0b3JfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBEYXRhU291cmNlRGVzY3JpcHRvcl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmlu
ZygpOyB9CisgIGJvb2wgaGFzX3dpbGxfbm90aWZ5X29uX3N0b3AoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCB3aWxsX25vdGlmeV9vbl9zdG9wKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfd2lsbF9ub3RpZnlfb25fc3Rh
cnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgYm9vbCB3aWxsX25vdGlm
eV9vbl9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wg
aGFzX2hhbmRsZXNfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXIoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBoYW5kbGVzX2luY3JlbWVudGFsX3N0YXRlX2NsZWFyKCkg
Y29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfZ3B1X2NvdW50
ZXJfZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBncHVfY291bnRlcl9kZXNjcmlwdG9yKCkgY29uc3QgeyByZXR1
cm4gYXQ8NT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3RyYWNrX2V2ZW50X2Rlc2NyaXB0
b3IoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMgdHJhY2tfZXZlbnRfZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
YXNfYnl0ZXMoKTsgfQorfTsKKworY2xhc3MgRGF0YVNvdXJjZURlc2NyaXB0b3IgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IERhdGFT
b3VyY2VEZXNjcmlwdG9yX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrV2lsbE5vdGlmeU9uU3RvcEZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrV2lsbE5vdGlmeU9uU3RhcnRGaWVsZE51bWJlciA9IDMsCisgICAga0hhbmRsZXNJbmNyZW1l
bnRhbFN0YXRlQ2xlYXJGaWVsZE51bWJlciA9IDQsCisgICAga0dwdUNvdW50ZXJEZXNjcmlwdG9y
RmllbGROdW1iZXIgPSA1LAorICAgIGtUcmFja0V2ZW50RGVzY3JpcHRvckZpZWxkTnVtYmVyID0g
NiwKKyAgfTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAg
ICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9p
ZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3dpbGxfbm90aWZ5X29uX3N0b3Ao
Ym9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3dpbGxfbm90aWZ5X29uX3N0YXJ0KGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55
VmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9oYW5kbGVzX2luY3JlbWVudGFsX3N0
YXRlX2NsZWFyKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDQsIHZhbHVlKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yPiBUKiBz
ZXRfZ3B1X2NvdW50ZXJfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDUpOworICB9CisKKyAgdm9pZCBzZXRfZ3B1X2NvdW50ZXJfZGVzY3JpcHRvcl9yYXco
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeworICAgIHJldHVybiBBcHBlbmRCeXRlcyg1LCByYXcu
ZGF0YSgpLCByYXcuc2l6ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJh
Y2tFdmVudERlc2NyaXB0b3I+IFQqIHNldF90cmFja19ldmVudF9kZXNjcmlwdG9yKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworICB2b2lkIHNldF90cmFj
a19ldmVudF9kZXNjcmlwdG9yX3Jhdyhjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSB7CisgICAgcmV0
dXJuIEFwcGVuZEJ5dGVzKDYsIHJhdy5kYXRhKCksIHJhdy5zaXplKCkpOworICB9CisKK307CisK
K30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRp
ZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdl
bi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL2Rlc2NyaXB0b3IucGJ6ZXJvLmgKKy8vIEF1dG9nZW5l
cmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisj
aWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX0RFU0NSSVBUT1Jf
UFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05f
REVTQ1JJUFRPUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3Rk
aW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3Rv
X2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgRGVzY3JpcHRvclBy
b3RvOworY2xhc3MgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U7CitjbGFzcyBFbnVtRGVz
Y3JpcHRvclByb3RvOworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOworY2xhc3MgRmll
bGREZXNjcmlwdG9yUHJvdG87CitjbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvOworY2xhc3MgT25l
b2ZEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBPbmVvZk9wdGlvbnM7CitlbnVtIEZpZWxkRGVzY3Jp
cHRvclByb3RvX0xhYmVsIDogaW50MzJfdDsKK2VudW0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlw
ZSA6IGludDMyX3Q7CisKK2VudW0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSA6IGludDMyX3Qg
eworICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFID0gMSwKKyAgRmllbGRE
ZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUID0gMiwKKyAgRmllbGREZXNjcmlwdG9yUHJv
dG9fVHlwZV9UWVBFX0lOVDY0ID0gMywKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBF
X1VJTlQ2NCA9IDQsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9JTlQzMiA9IDUs
CisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0ID0gNiwKKyAgRmllbGRE
ZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVEMzIgPSA3LAorICBGaWVsZERlc2NyaXB0b3JQ
cm90b19UeXBlX1RZUEVfQk9PTCA9IDgsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQ
RV9TVFJJTkcgPSA5LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfR1JPVVAgPSAx
MCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0UgPSAxMSwKKyAgRmll
bGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JZVEVTID0gMTIsCisgIEZpZWxkRGVzY3JpcHRv
clByb3RvX1R5cGVfVFlQRV9VSU5UMzIgPSAxMywKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlw
ZV9UWVBFX0VOVU0gPSAxNCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhF
RDMyID0gMTUsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TRklYRUQ2NCA9IDE2
LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDMyID0gMTcsCisgIEZpZWxk
RGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UNjQgPSAxOCwKK307CisKK2NvbnN0IEZpZWxk
RGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9NSU4gPSBGaWVs
ZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFOworY29uc3QgRmllbGREZXNjcmlwdG9y
UHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX01BWCA9IEZpZWxkRGVzY3JpcHRv
clByb3RvX1R5cGVfVFlQRV9TSU5UNjQ7CisKK2VudW0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFi
ZWwgOiBpbnQzMl90IHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9O
QUwgPSAxLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVFVSVJFRCA9IDIs
CisgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUEVBVEVEID0gMywKK307CisK
K2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvX0xh
YmVsX01JTiA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX09QVElPTkFMOworY29u
c3QgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxf
TUFYID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfUkVQRUFURUQ7CisKK2NsYXNz
IE9uZW9mT3B0aW9uc19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgT25lb2ZPcHRpb25zX0RlY29kZXIoY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9Cisg
IGV4cGxpY2l0IE9uZW9mT3B0aW9uc19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE9uZW9mT3B0aW9uc19EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorfTsKKworY2xhc3MgT25lb2ZPcHRpb25zIDogcHVibGljIDo6
cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBPbmVvZk9w
dGlvbnNfRGVjb2RlcjsKK307CisKK2NsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEVudW1WYWx1ZURlc2NyaXB0
b3JQcm90b19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENo
YXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wg
aGFzX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IG51bWJlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xh
c3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9f
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAor
ICAgIGtOdW1iZXJGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF9udW1iZXIoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIEVudW1EZXNjcmlwdG9yUHJvdG9fRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgRW51bURlc2Ny
aXB0b3JQcm90b19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFbnVtRGVzY3JpcHRvclBy
b3RvX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgRW51bURlc2NyaXB0b3JQcm90b19EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpw
cm90b3plcm86OkNvbnN0Qnl0ZXM+IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIpOyB9CisgIGJvb2wgaGFzX3Jlc2VydmVkX25hbWUo
KSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gcmVzZXJ2ZWRfbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPig1KTsg
fQorfTsKKworY2xhc3MgRW51bURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRW51bURlc2NyaXB0b3JQcm90
b19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEs
CisgICAga1ZhbHVlRmllbGROdW1iZXIgPSAyLAorICAgIGtSZXNlcnZlZE5hbWVGaWVsZE51bWJl
ciA9IDUsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7
CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9Cisg
IHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBl
bmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEVu
dW1WYWx1ZURlc2NyaXB0b3JQcm90bz4gVCogYWRkX3ZhbHVlKCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IGNo
YXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7
CisgIH0KK307CisKK2NsYXNzIE9uZW9mRGVzY3JpcHRvclByb3RvX0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNf
Tk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBPbmVvZkRl
c2NyaXB0b3JQcm90b19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBPbmVvZkRlc2NyaXB0
b3JQcm90b19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IE9uZW9mRGVzY3JpcHRvclByb3RvX0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBvcHRpb25z
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBPbmVv
ZkRlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gT25lb2ZEZXNjcmlwdG9yUHJvdG9fRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtPcHRpb25zRmll
bGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2
YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsK
KyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBPbmVvZk9wdGlvbnM+IFQqIHNldF9vcHRpb25zKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworfTsKKworY2xhc3MgRmllbGREZXNjcmlwdG9yUHJv
dG9fRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhf
RklFTERfSUQ9Ki85LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsK
KyBwdWJsaWM6CisgIEZpZWxkRGVzY3JpcHRvclByb3RvX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IEZpZWxkRGVzY3JpcHRvclByb3RvX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRmllbGREZXNjcmlwdG9yUHJv
dG9fRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBu
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19u
dW1iZXIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBudW1i
ZXIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGFi
ZWwoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBsYWJlbCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190eXBlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdHlwZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190eXBlX25hbWUoKSBj
b25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgdHlwZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19zdHJpbmcoKTsgfQorICBi
b29sIGhhc19leHRlbmRlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RDaGFycyBleHRlbmRlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
YXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBkZWZhdWx0X3Zh
bHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19v
bmVvZl9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IG9uZW9mX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc19pbnQzMigpOyB9Cit9Owor
CitjbGFzcyBGaWVsZERlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICAg
IGtOdW1iZXJGaWVsZE51bWJlciA9IDMsCisgICAga0xhYmVsRmllbGROdW1iZXIgPSA0LAorICAg
IGtUeXBlRmllbGROdW1iZXIgPSA1LAorICAgIGtUeXBlTmFtZUZpZWxkTnVtYmVyID0gNiwKKyAg
ICBrRXh0ZW5kZWVGaWVsZE51bWJlciA9IDIsCisgICAga0RlZmF1bHRWYWx1ZUZpZWxkTnVtYmVy
ID0gNywKKyAgICBrT25lb2ZJbmRleEZpZWxkTnVtYmVyID0gOSwKKyAgfTsKKyAgdXNpbmcgVHlw
ZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBl
OworICB1c2luZyBMYWJlbCA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpGaWVsZERlc2Ny
aXB0b3JQcm90b19MYWJlbDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9ET1VCTEUgPSBGaWVs
ZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFOworICBzdGF0aWMgY29uc3QgVHlwZSBU
WVBFX0ZMT0FUID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUOworICBzdGF0
aWMgY29uc3QgVHlwZSBUWVBFX0lOVDY0ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBF
X0lOVDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1VJTlQ2NCA9IEZpZWxkRGVzY3JpcHRv
clByb3RvX1R5cGVfVFlQRV9VSU5UNjQ7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfSU5UMzIg
PSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzI7CisgIHN0YXRpYyBjb25zdCBU
eXBlIFRZUEVfRklYRUQ2NCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0
OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZJWEVEMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90
b19UeXBlX1RZUEVfRklYRUQzMjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9CT09MID0gRmll
bGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JPT0w7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZ
UEVfU1RSSU5HID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NUUklORzsKKyAgc3Rh
dGljIGNvbnN0IFR5cGUgVFlQRV9HUk9VUCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQ
RV9HUk9VUDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9NRVNTQUdFID0gRmllbGREZXNjcmlw
dG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0U7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfQllU
RVMgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQllURVM7CisgIHN0YXRpYyBjb25z
dCBUeXBlIFRZUEVfVUlOVDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQz
MjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9FTlVNID0gRmllbGREZXNjcmlwdG9yUHJvdG9f
VHlwZV9UWVBFX0VOVU07CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0ZJWEVEMzIgPSBGaWVs
ZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVEMzI7CisgIHN0YXRpYyBjb25zdCBUeXBl
IFRZUEVfU0ZJWEVENjQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVENjQ7
CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0lOVDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9f
VHlwZV9UWVBFX1NJTlQzMjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9TSU5UNjQgPSBGaWVs
ZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0OworICBzdGF0aWMgY29uc3QgTGFiZWwg
TEFCRUxfT1BUSU9OQUwgPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05B
TDsKKyAgc3RhdGljIGNvbnN0IExhYmVsIExBQkVMX1JFUVVJUkVEID0gRmllbGREZXNjcmlwdG9y
UHJvdG9fTGFiZWxfTEFCRUxfUkVRVUlSRUQ7CisgIHN0YXRpYyBjb25zdCBMYWJlbCBMQUJFTF9S
RVBFQVRFRCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUEVBVEVEOworICB2
b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNv
bnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwg
c2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnVtYmVyKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xhYmVsKDo6cGVyZmV0dG86OnBy
b3Rvczo6cGJ6ZXJvOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSkgeworICAgIEFw
cGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3R5cGUoOjpwZXJmZXR0
bzo6cHJvdG9zOjpwYnplcm86OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpIHsKKyAg
ICBBcHBlbmRUaW55VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90eXBlX25hbWUo
Y29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNiwgdmFsdWUuZGF0
YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDYsIGRhdGEsIHNpemUpOwor
ICB9CisgIHZvaWQgc2V0X2V4dGVuZGVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lk
IHNldF9leHRlbmRlZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoY29u
c3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNywgdmFsdWUuZGF0YSgp
LCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg3LCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9vbmVvZl9pbmRleChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDksIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRGVzY3JpcHRvclByb3RvX0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMTAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGlj
OgorICBEZXNjcmlwdG9yUHJvdG9fRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRGVzY3Jp
cHRvclByb3RvX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgRGVzY3JpcHRvclByb3RvX0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfZmllbGQoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZmllbGQoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRl
ZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMik7IH0KKyAgYm9vbCBoYXNfZXh0ZW5zaW9uKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRl
ZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGV4dGVuc2lvbigpIGNvbnN0
IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig2KTsgfQorICBi
b29sIGhhc19uZXN0ZWRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzPiBuZXN0ZWRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzPigzKTsgfQorICBib29sIGhhc19lbnVtX3R5cGUoKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRv
cjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZW51bV90eXBlKCkgY29uc3QgeyByZXR1cm4gR2V0
UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDQpOyB9CisgIGJvb2wgaGFzX29uZW9m
X2RlY2woKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gb25lb2ZfZGVj
bCgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig4
KTsgfQorICBib29sIGhhc19yZXNlcnZlZF9yYW5nZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPiByZXNlcnZlZF9yYW5nZSgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVh
dGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig5KTsgfQorICBib29sIGhhc19yZXNlcnZlZF9u
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiByZXNlcnZlZF9u
YW1lKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+
KDEwKTsgfQorfTsKKworY2xhc3MgRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBEZXNjcmlwdG9yUHJvdG9f
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAor
ICAgIGtGaWVsZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2
LAorICAgIGtOZXN0ZWRUeXBlRmllbGROdW1iZXIgPSAzLAorICAgIGtFbnVtVHlwZUZpZWxkTnVt
YmVyID0gNCwKKyAgICBrT25lb2ZEZWNsRmllbGROdW1iZXIgPSA4LAorICAgIGtSZXNlcnZlZFJh
bmdlRmllbGROdW1iZXIgPSA5LAorICAgIGtSZXNlcnZlZE5hbWVGaWVsZE51bWJlciA9IDEwLAor
ICB9OworICB1c2luZyBSZXNlcnZlZFJhbmdlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86
OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0
ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFs
dWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVf
dCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBGaWVsZERlc2NyaXB0b3JQcm90bz4gVCogYWRkX2ZpZWxkKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IEZpZWxkRGVzY3JpcHRvclByb3RvPiBUKiBhZGRfZXh0ZW5zaW9uKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IERlc2NyaXB0b3JQcm90bz4gVCogYWRkX25lc3RlZF90eXBlKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IEVudW1EZXNjcmlwdG9yUHJvdG8+IFQqIGFkZF9lbnVtX3R5cGUoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gT25lb2ZEZXNjcmlwdG9yUHJvdG8+IFQqIGFkZF9vbmVvZl9kZWNsKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oOCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlPiBUKiBhZGRfcmVzZXJ2ZWRf
cmFuZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig5KTsKKyAgfQorCisg
IHZvaWQgYWRkX3Jlc2VydmVkX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAg
QXBwZW5kQnl0ZXMoMTAsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lk
IGFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAg
QXBwZW5kQnl0ZXMoMTAsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFzcyBEZXNjcmlwdG9y
UHJvdG9fUmVzZXJ2ZWRSYW5nZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFu
Z2VfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVk
UmFuZ2VfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICBpbnQzMl90IGVuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50
MzIoKTsgfQorfTsKKworY2xhc3MgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgOiBwdWJs
aWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IERl
c2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrU3RhcnRGaWVsZE51bWJlciA9IDEsCisgICAga0VuZEZpZWxkTnVtYmVyID0gMiwKKyAg
fTsKKyAgdm9pZCBzZXRfc3RhcnQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgx
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZW5kKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBGaWxlRGVzY3JpcHRvclByb3Rv
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMTEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7Cisg
cHVibGljOgorICBGaWxlRGVzY3JpcHRvclByb3RvX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEZpbGVEZXNjcmlwdG9yUHJvdG9fRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5k
YXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGaWxlRGVzY3JpcHRvclByb3RvX0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfcGFja2Fn
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RDaGFycyBwYWNrYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQor
ICBib29sIGhhc19kZXBlbmRlbmN5KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0
Q2hhcnM+IGRlcGVuZGVuY3koKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVy
bzo6Q29uc3RDaGFycz4oMyk7IH0KKyAgYm9vbCBoYXNfcHVibGljX2RlcGVuZGVuY3koKSBjb25z
dCB7IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZp
ZWxkSXRlcmF0b3I8aW50MzJfdD4gcHVibGljX2RlcGVuZGVuY3koKSBjb25zdCB7IHJldHVybiBH
ZXRSZXBlYXRlZDxpbnQzMl90PigxMCk7IH0KKyAgYm9vbCBoYXNfd2Vha19kZXBlbmRlbmN5KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0
ZWRGaWVsZEl0ZXJhdG9yPGludDMyX3Q+IHdlYWtfZGVwZW5kZW5jeSgpIGNvbnN0IHsgcmV0dXJu
IEdldFJlcGVhdGVkPGludDMyX3Q+KDExKTsgfQorICBib29sIGhhc19tZXNzYWdlX3R5cGUoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gbWVzc2FnZV90eXBlKCkgY29u
c3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDQpOyB9Cisg
IGJvb2wgaGFzX2VudW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzPiBlbnVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6
Q29uc3RCeXRlcz4oNSk7IH0KKyAgYm9vbCBoYXNfZXh0ZW5zaW9uKCkgY29uc3QgeyByZXR1cm4g
YXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGV4dGVuc2lvbigpIGNvbnN0IHsgcmV0dXJuIEdldFJl
cGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig3KTsgfQorfTsKKworY2xhc3MgRmlsZURl
c2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgor
ICB1c2luZyBEZWNvZGVyID0gRmlsZURlc2NyaXB0b3JQcm90b19EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1BhY2thZ2VGaWVsZE51
bWJlciA9IDIsCisgICAga0RlcGVuZGVuY3lGaWVsZE51bWJlciA9IDMsCisgICAga1B1YmxpY0Rl
cGVuZGVuY3lGaWVsZE51bWJlciA9IDEwLAorICAgIGtXZWFrRGVwZW5kZW5jeUZpZWxkTnVtYmVy
ID0gMTEsCisgICAga01lc3NhZ2VUeXBlRmllbGROdW1iZXIgPSA0LAorICAgIGtFbnVtVHlwZUZp
ZWxkTnVtYmVyID0gNSwKKyAgICBrRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA3LAorICB9OworICB2
b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNv
bnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwg
c2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFja2FnZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUp
IHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0K
KyAgdm9pZCBzZXRfcGFja2FnZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgYWRkX2RlcGVuZGVuY3ko
Y29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0
YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIGFkZF9wdWJsaWNfZGVwZW5kZW5jeShpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEwLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfd2Vha19kZXBlbmRlbmN5
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERlc2NyaXB0b3JQcm90bz4gVCogYWRkX21lc3NhZ2VfdHlw
ZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQpOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQgPSBFbnVtRGVzY3JpcHRvclByb3RvPiBUKiBhZGRfZW51bV90eXBl
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNSk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IEZpZWxkRGVzY3JpcHRvclByb3RvPiBUKiBhZGRfZXh0ZW5zaW9u
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNyk7CisgIH0KKworfTsKKwor
Y2xhc3MgRmlsZURlc2NyaXB0b3JTZXRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlw
ZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFU
RURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgRmlsZURlc2NyaXB0b3JTZXRfRGVjb2Rl
cihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRh
dGEsIGxlbikge30KKyAgZXhwbGljaXQgRmlsZURlc2NyaXB0b3JTZXRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGaWxl
RGVzY3JpcHRvclNldF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19m
aWxlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpS
ZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGZpbGUoKSBjb25z
dCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KK307
CisKK2NsYXNzIEZpbGVEZXNjcmlwdG9yU2V0IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBGaWxlRGVzY3JpcHRvclNldF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga0ZpbGVGaWVsZE51bWJlciA9IDEsCisgIH07Cisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRmlsZURlc2NyaXB0b3JQcm90bz4gVCogYWRkX2ZpbGUo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCit9OworCit9
IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYg
IC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4v
cHJvdG9zL3BlcmZldHRvL2NvbW1vbi9ncHVfY291bnRlcl9kZXNjcmlwdG9yLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9H
UFVfQ09VTlRFUl9ERVNDUklQVE9SX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fQ09NTU9OX0dQVV9DT1VOVEVSX0RFU0NSSVBUT1JfUFJPVE9fSF8KKwor
I2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRp
bHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNw
YWNlIHBiemVybyB7CisKK2NsYXNzIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJCbG9j
azsKK2NsYXNzIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjOworZW51bSBHcHVD
b3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3JvdXAgOiBpbnQzMl90OworZW51bSBHcHVDb3Vu
dGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdCA6IGludDMyX3Q7CisKK2VudW0gR3B1Q291bnRlckRl
c2NyaXB0b3JfR3B1Q291bnRlckdyb3VwIDogaW50MzJfdCB7CisgIEdwdUNvdW50ZXJEZXNjcmlw
dG9yX0dwdUNvdW50ZXJHcm91cF9VTkNMQVNTSUZJRUQgPSAwLAorICBHcHVDb3VudGVyRGVzY3Jp
cHRvcl9HcHVDb3VudGVyR3JvdXBfU1lTVEVNID0gMSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3Jf
R3B1Q291bnRlckdyb3VwX1ZFUlRJQ0VTID0gMiwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1
Q291bnRlckdyb3VwX0ZSQUdNRU5UUyA9IDMsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNv
dW50ZXJHcm91cF9QUklNSVRJVkVTID0gNCwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291
bnRlckdyb3VwX01FTU9SWSA9IDUsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJH
cm91cF9DT01QVVRFID0gNiwKK307CisKK2NvbnN0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNv
dW50ZXJHcm91cCBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3JvdXBfTUlOID0gR3B1
Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3VwX1VOQ0xBU1NJRklFRDsKK2NvbnN0IEdw
dUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJHcm91cCBHcHVDb3VudGVyRGVzY3JpcHRvcl9H
cHVDb3VudGVyR3JvdXBfTUFYID0gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3Vw
X0NPTVBVVEU7CisKK2VudW0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXQgOiBpbnQz
Ml90IHsKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfTk9ORSA9IDAsCisgIEdw
dUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0JJVCA9IDEsCisgIEdwdUNvdW50ZXJEZXNj
cmlwdG9yX01lYXN1cmVVbml0X0tJTE9CSVQgPSAyLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9N
ZWFzdXJlVW5pdF9NRUdBQklUID0gMywKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVu
aXRfR0lHQUJJVCA9IDQsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1RFUkFC
SVQgPSA1LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9QRVRBQklUID0gNiwK
KyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfQllURSA9IDcsCisgIEdwdUNvdW50
ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0tJTE9CWVRFID0gOCwKKyAgR3B1Q291bnRlckRlc2Ny
aXB0b3JfTWVhc3VyZVVuaXRfTUVHQUJZVEUgPSA5LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9N
ZWFzdXJlVW5pdF9HSUdBQllURSA9IDEwLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJl
VW5pdF9URVJBQllURSA9IDExLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9Q
RVRBQllURSA9IDEyLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9IRVJUWiA9
IDEzLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9LSUxPSEVSVFogPSAxNCwK
KyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfTUVHQUhFUlRaID0gMTUsCisgIEdw
dUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0dJR0FIRVJUWiA9IDE2LAorICBHcHVDb3Vu
dGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9URVJBSEVSVFogPSAxNywKKyAgR3B1Q291bnRlckRl
c2NyaXB0b3JfTWVhc3VyZVVuaXRfUEVUQUhFUlRaID0gMTgsCisgIEdwdUNvdW50ZXJEZXNjcmlw
dG9yX01lYXN1cmVVbml0X05BTk9TRUNPTkQgPSAxOSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3Jf
TWVhc3VyZVVuaXRfTUlDUk9TRUNPTkQgPSAyMCwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVh
c3VyZVVuaXRfTUlMTElTRUNPTkQgPSAyMSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3Vy
ZVVuaXRfU0VDT05EID0gMjIsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X01J
TlVURSA9IDIzLAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9IT1VSID0gMjQs
CisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1ZFUlRFWCA9IDI1LAorICBHcHVD
b3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9QSVhFTCA9IDI2LAorICBHcHVDb3VudGVyRGVz
Y3JpcHRvcl9NZWFzdXJlVW5pdF9UUklBTkdMRSA9IDI3LAorICBHcHVDb3VudGVyRGVzY3JpcHRv
cl9NZWFzdXJlVW5pdF9QUklNSVRJVkUgPSAzOCwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVh
c3VyZVVuaXRfRlJBR01FTlQgPSAzOSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVu
aXRfTUlMTElXQVRUID0gMjgsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1dB
VFQgPSAyOSwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfS0lMT1dBVFQgPSAz
MCwKKyAgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfSk9VTEUgPSAzMSwKKyAgR3B1
Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfVk9MVCA9IDMyLAorICBHcHVDb3VudGVyRGVz
Y3JpcHRvcl9NZWFzdXJlVW5pdF9BTVBFUkUgPSAzMywKKyAgR3B1Q291bnRlckRlc2NyaXB0b3Jf
TWVhc3VyZVVuaXRfQ0VMU0lVUyA9IDM0LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJl
VW5pdF9GQUhSRU5IRUlUID0gMzUsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0
X0tFTFZJTiA9IDM2LAorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9QRVJDRU5U
ID0gMzcsCisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0lOU1RSVUNUSU9OID0g
NDAsCit9OworCitjb25zdCBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdCBHcHVDb3Vu
dGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9NSU4gPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFz
dXJlVW5pdF9OT05FOworY29uc3QgR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXQgR3B1
Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfTUFYID0gR3B1Q291bnRlckRlc2NyaXB0b3Jf
TWVhc3VyZVVuaXRfSU5TVFJVQ1RJT047CisKK2NsYXNzIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJs
aWM6CisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgR3B1Q291bnRlckRlc2NyaXB0b3JfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfc3BlY3MoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVy
YXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gc3BlY3MoKSBjb25zdCB7IHJldHVybiBHZXRS
ZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfYmxvY2tz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGJsb2NrcygpIGNvbnN0
IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyKTsgfQorICBi
b29sIGhhc19taW5fc2FtcGxpbmdfcGVyaW9kX25zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IG1pbl9zYW1wbGluZ19wZXJpb2RfbnMoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX21heF9zYW1wbGluZ19wZXJp
b2RfbnMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbWF4
X3NhbXBsaW5nX3BlcmlvZF9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7
IH0KKyAgYm9vbCBoYXNfc3VwcG9ydHNfaW5zdHJ1bWVudGVkX3NhbXBsaW5nKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGJvb2wgc3VwcG9ydHNfaW5zdHJ1bWVudGVkX3Nh
bXBsaW5nKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19ib29sKCk7IH0KK307CisKK2NsYXNz
IEdwdUNvdW50ZXJEZXNjcmlwdG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga1NwZWNzRmllbGROdW1iZXIgPSAxLAorICAgIGtCbG9j
a3NGaWVsZE51bWJlciA9IDIsCisgICAga01pblNhbXBsaW5nUGVyaW9kTnNGaWVsZE51bWJlciA9
IDMsCisgICAga01heFNhbXBsaW5nUGVyaW9kTnNGaWVsZE51bWJlciA9IDQsCisgICAga1N1cHBv
cnRzSW5zdHJ1bWVudGVkU2FtcGxpbmdGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHVzaW5nIEdw
dUNvdW50ZXJTcGVjID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkdwdUNvdW50ZXJEZXNj
cmlwdG9yX0dwdUNvdW50ZXJTcGVjOworICB1c2luZyBHcHVDb3VudGVyQmxvY2sgPSA6OnBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2Nr
OworICB1c2luZyBHcHVDb3VudGVyR3JvdXAgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6
R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3VwOworICB1c2luZyBNZWFzdXJlVW5p
dCA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFz
dXJlVW5pdDsKKyAgc3RhdGljIGNvbnN0IEdwdUNvdW50ZXJHcm91cCBVTkNMQVNTSUZJRUQgPSBH
cHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3JvdXBfVU5DTEFTU0lGSUVEOworICBzdGF0
aWMgY29uc3QgR3B1Q291bnRlckdyb3VwIFNZU1RFTSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dw
dUNvdW50ZXJHcm91cF9TWVNURU07CisgIHN0YXRpYyBjb25zdCBHcHVDb3VudGVyR3JvdXAgVkVS
VElDRVMgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyR3JvdXBfVkVSVElDRVM7Cisg
IHN0YXRpYyBjb25zdCBHcHVDb3VudGVyR3JvdXAgRlJBR01FTlRTID0gR3B1Q291bnRlckRlc2Ny
aXB0b3JfR3B1Q291bnRlckdyb3VwX0ZSQUdNRU5UUzsKKyAgc3RhdGljIGNvbnN0IEdwdUNvdW50
ZXJHcm91cCBQUklNSVRJVkVTID0gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3Vw
X1BSSU1JVElWRVM7CisgIHN0YXRpYyBjb25zdCBHcHVDb3VudGVyR3JvdXAgTUVNT1JZID0gR3B1
Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdyb3VwX01FTU9SWTsKKyAgc3RhdGljIGNvbnN0
IEdwdUNvdW50ZXJHcm91cCBDT01QVVRFID0gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRl
ckdyb3VwX0NPTVBVVEU7CisgIHN0YXRpYyBjb25zdCBNZWFzdXJlVW5pdCBOT05FID0gR3B1Q291
bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfTk9ORTsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVV
bml0IEJJVCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0JJVDsKKyAgc3RhdGlj
IGNvbnN0IE1lYXN1cmVVbml0IEtJTE9CSVQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJl
VW5pdF9LSUxPQklUOworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVuaXQgTUVHQUJJVCA9IEdwdUNv
dW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X01FR0FCSVQ7CisgIHN0YXRpYyBjb25zdCBNZWFz
dXJlVW5pdCBHSUdBQklUID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfR0lHQUJJ
VDsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IFRFUkFCSVQgPSBHcHVDb3VudGVyRGVzY3Jp
cHRvcl9NZWFzdXJlVW5pdF9URVJBQklUOworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVuaXQgUEVU
QUJJVCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1BFVEFCSVQ7CisgIHN0YXRp
YyBjb25zdCBNZWFzdXJlVW5pdCBCWVRFID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVu
aXRfQllURTsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IEtJTE9CWVRFID0gR3B1Q291bnRl
ckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfS0lMT0JZVEU7CisgIHN0YXRpYyBjb25zdCBNZWFzdXJl
VW5pdCBNRUdBQllURSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X01FR0FCWVRF
OworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVuaXQgR0lHQUJZVEUgPSBHcHVDb3VudGVyRGVzY3Jp
cHRvcl9NZWFzdXJlVW5pdF9HSUdBQllURTsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IFRF
UkFCWVRFID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfVEVSQUJZVEU7CisgIHN0
YXRpYyBjb25zdCBNZWFzdXJlVW5pdCBQRVRBQllURSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01l
YXN1cmVVbml0X1BFVEFCWVRFOworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVuaXQgSEVSVFogPSBH
cHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9IRVJUWjsKKyAgc3RhdGljIGNvbnN0IE1l
YXN1cmVVbml0IEtJTE9IRVJUWiA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0tJ
TE9IRVJUWjsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IE1FR0FIRVJUWiA9IEdwdUNvdW50
ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X01FR0FIRVJUWjsKKyAgc3RhdGljIGNvbnN0IE1lYXN1
cmVVbml0IEdJR0FIRVJUWiA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0dJR0FI
RVJUWjsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IFRFUkFIRVJUWiA9IEdwdUNvdW50ZXJE
ZXNjcmlwdG9yX01lYXN1cmVVbml0X1RFUkFIRVJUWjsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVV
bml0IFBFVEFIRVJUWiA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1BFVEFIRVJU
WjsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IE5BTk9TRUNPTkQgPSBHcHVDb3VudGVyRGVz
Y3JpcHRvcl9NZWFzdXJlVW5pdF9OQU5PU0VDT05EOworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVu
aXQgTUlDUk9TRUNPTkQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9NSUNST1NF
Q09ORDsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IE1JTExJU0VDT05EID0gR3B1Q291bnRl
ckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfTUlMTElTRUNPTkQ7CisgIHN0YXRpYyBjb25zdCBNZWFz
dXJlVW5pdCBTRUNPTkQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9TRUNPTkQ7
CisgIHN0YXRpYyBjb25zdCBNZWFzdXJlVW5pdCBNSU5VVEUgPSBHcHVDb3VudGVyRGVzY3JpcHRv
cl9NZWFzdXJlVW5pdF9NSU5VVEU7CisgIHN0YXRpYyBjb25zdCBNZWFzdXJlVW5pdCBIT1VSID0g
R3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfSE9VUjsKKyAgc3RhdGljIGNvbnN0IE1l
YXN1cmVVbml0IFZFUlRFWCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1ZFUlRF
WDsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IFBJWEVMID0gR3B1Q291bnRlckRlc2NyaXB0
b3JfTWVhc3VyZVVuaXRfUElYRUw7CisgIHN0YXRpYyBjb25zdCBNZWFzdXJlVW5pdCBUUklBTkdM
RSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X1RSSUFOR0xFOworICBzdGF0aWMg
Y29uc3QgTWVhc3VyZVVuaXQgUFJJTUlUSVZFID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3Vy
ZVVuaXRfUFJJTUlUSVZFOworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVuaXQgRlJBR01FTlQgPSBH
cHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9GUkFHTUVOVDsKKyAgc3RhdGljIGNvbnN0
IE1lYXN1cmVVbml0IE1JTExJV0FUVCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0
X01JTExJV0FUVDsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IFdBVFQgPSBHcHVDb3VudGVy
RGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9XQVRUOworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVuaXQg
S0lMT1dBVFQgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJlVW5pdF9LSUxPV0FUVDsKKyAg
c3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IEpPVUxFID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVh
c3VyZVVuaXRfSk9VTEU7CisgIHN0YXRpYyBjb25zdCBNZWFzdXJlVW5pdCBWT0xUID0gR3B1Q291
bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfVk9MVDsKKyAgc3RhdGljIGNvbnN0IE1lYXN1cmVV
bml0IEFNUEVSRSA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0FNUEVSRTsKKyAg
c3RhdGljIGNvbnN0IE1lYXN1cmVVbml0IENFTFNJVVMgPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9N
ZWFzdXJlVW5pdF9DRUxTSVVTOworICBzdGF0aWMgY29uc3QgTWVhc3VyZVVuaXQgRkFIUkVOSEVJ
VCA9IEdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0X0ZBSFJFTkhFSVQ7CisgIHN0YXRp
YyBjb25zdCBNZWFzdXJlVW5pdCBLRUxWSU4gPSBHcHVDb3VudGVyRGVzY3JpcHRvcl9NZWFzdXJl
VW5pdF9LRUxWSU47CisgIHN0YXRpYyBjb25zdCBNZWFzdXJlVW5pdCBQRVJDRU5UID0gR3B1Q291
bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfUEVSQ0VOVDsKKyAgc3RhdGljIGNvbnN0IE1lYXN1
cmVVbml0IElOU1RSVUNUSU9OID0gR3B1Q291bnRlckRlc2NyaXB0b3JfTWVhc3VyZVVuaXRfSU5T
VFJVQ1RJT047CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3B1Q291bnRlckRlc2NyaXB0b3Jf
R3B1Q291bnRlclNwZWM+IFQqIGFkZF9zcGVjcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBHcHVDb3VudGVy
RGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2s+IFQqIGFkZF9ibG9ja3MoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyKTsKKyAgfQorCisgIHZvaWQgc2V0X21pbl9zYW1wbGlu
Z19wZXJpb2RfbnModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X21heF9zYW1wbGluZ19wZXJpb2RfbnModWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N1cHBvcnRz
X2luc3RydW1lbnRlZF9zYW1wbGluZyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhcklu
dCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNv
dW50ZXJCbG9ja19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90
cnVlPiB7CisgcHVibGljOgorICBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyQmxvY2tf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291
bnRlckJsb2NrX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2Nr
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Jsb2NrX2lkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGJsb2NrX2lkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19ibG9ja19jYXBh
Y2l0eSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBibG9j
a19jYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9v
bCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19zdHJpbmco
KTsgfQorICBib29sIGhhc19kZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBkZXNjcmlwdGlvbigpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY291bnRlcl9pZHMoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjx1aW50MzJfdD4gY291bnRlcl9pZHMoKSBjb25zdCB7IHJldHVybiBHZXRS
ZXBlYXRlZDx1aW50MzJfdD4oNSk7IH0KK307CisKK2NsYXNzIEdwdUNvdW50ZXJEZXNjcmlwdG9y
X0dwdUNvdW50ZXJCbG9jayA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckJsb2Nr
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQmxvY2tJZEZpZWxkTnVtYmVyID0g
MSwKKyAgICBrQmxvY2tDYXBhY2l0eUZpZWxkTnVtYmVyID0gMiwKKyAgICBrTmFtZUZpZWxkTnVt
YmVyID0gMywKKyAgICBrRGVzY3JpcHRpb25GaWVsZE51bWJlciA9IDQsCisgICAga0NvdW50ZXJJ
ZHNGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Jsb2NrX2lkKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ibG9j
a19jYXBhY2l0eSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBB
cHBlbmRCeXRlcygzLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBz
ZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDMsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2Rlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIHZhbHVlLmRhdGEoKSwgdmFsdWUu
c2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9kZXNjcmlwdGlvbihjb25zdCBjaGFyKiBkYXRhLCBz
aXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIGRhdGEsIHNpemUpOworICB9CisgIHZv
aWQgYWRkX2NvdW50ZXJfaWRzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUs
IHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRl
clNwZWNfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypN
QVhfRklFTERfSUQ9Ki8xMCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+
IHsKKyBwdWJsaWM6CisgIEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJTcGVjX0RlY29k
ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rlcihk
YXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEdwdUNvdW50ZXJEZXNjcmlwdG9yX0dwdUNvdW50ZXJT
cGVjX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgR3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlclNwZWNfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfY291bnRlcl9pZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjb3VudGVyX2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5h
bWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2Rl
c2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdENoYXJzIGRlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19z
dHJpbmcoKTsgfQorICBib29sIGhhc19pbnRfcGVha192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDU+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGludF9wZWFrX3ZhbHVlKCkgY29uc3QgeyByZXR1
cm4gYXQ8NT4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2RvdWJsZV9wZWFrX3ZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIGRvdWJsZSBkb3VibGVfcGVha192
YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfZG91YmxlKCk7IH0KKyAgYm9vbCBoYXNf
bnVtZXJhdG9yX3VuaXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8aW50MzJfdD4gbnVtZXJhdG9yX3VuaXRz
KCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8aW50MzJfdD4oNyk7IH0KKyAgYm9vbCBoYXNf
ZGVub21pbmF0b3JfdW5pdHMoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjxpbnQzMl90PiBkZW5vbWluYXRvcl91
bml0cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPGludDMyX3Q+KDgpOyB9CisgIGJvb2wg
aGFzX3NlbGVjdF9ieV9kZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9
CisgIGJvb2wgc2VsZWN0X2J5X2RlZmF1bHQoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX2Jv
b2woKTsgfQorICBib29sIGhhc19ncm91cHMoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8aW50MzJfdD4gZ3Jv
dXBzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8aW50MzJfdD4oMTApOyB9Cit9OworCitj
bGFzcyBHcHVDb3VudGVyRGVzY3JpcHRvcl9HcHVDb3VudGVyU3BlYyA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gR3B1Q291bnRlckRl
c2NyaXB0b3JfR3B1Q291bnRlclNwZWNfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAg
IGtDb3VudGVySWRGaWVsZE51bWJlciA9IDEsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIsCisg
ICAga0Rlc2NyaXB0aW9uRmllbGROdW1iZXIgPSAzLAorICAgIGtJbnRQZWFrVmFsdWVGaWVsZE51
bWJlciA9IDUsCisgICAga0RvdWJsZVBlYWtWYWx1ZUZpZWxkTnVtYmVyID0gNiwKKyAgICBrTnVt
ZXJhdG9yVW5pdHNGaWVsZE51bWJlciA9IDcsCisgICAga0Rlbm9taW5hdG9yVW5pdHNGaWVsZE51
bWJlciA9IDgsCisgICAga1NlbGVjdEJ5RGVmYXVsdEZpZWxkTnVtYmVyID0gOSwKKyAgICBrR3Jv
dXBzRmllbGROdW1iZXIgPSAxMCwKKyAgfTsKKyAgdm9pZCBzZXRfY291bnRlcl9pZCh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
bmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1
ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOwor
ICB9CisgIHZvaWQgc2V0X2Rlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIHNldF9kZXNjcmlwdGlvbihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2ludF9wZWFrX3Zh
bHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2RvdWJsZV9wZWFrX3ZhbHVlKGRvdWJsZSB2YWx1ZSkgeworICAgIEFwcGVuZEZp
eGVkKDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9udW1lcmF0b3JfdW5pdHMoOjpwZXJmZXR0
bzo6cHJvdG9zOjpwYnplcm86OkdwdUNvdW50ZXJEZXNjcmlwdG9yX01lYXN1cmVVbml0IHZhbHVl
KSB7CisgICAgQXBwZW5kVGlueVZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfZGVu
b21pbmF0b3JfdW5pdHMoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkdwdUNvdW50ZXJEZXNj
cmlwdG9yX01lYXN1cmVVbml0IHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg4LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VsZWN0X2J5X2RlZmF1bHQoYm9vbCB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgYWRkX2dyb3Vwcyg6OnBl
cmZldHRvOjpwcm90b3M6OnBiemVybzo6R3B1Q291bnRlckRlc2NyaXB0b3JfR3B1Q291bnRlckdy
b3VwIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxMCwgdmFsdWUpOworICB9Cit9Owor
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5k
aWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBn
ZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi9vYnNlcnZhYmxlX2V2ZW50cy5wYnplcm8uaAorLy8g
QXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVE
SVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fT0JT
RVJWQUJMRV9FVkVOVFNfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19DT01NT05fT0JTRVJWQUJMRV9FVkVOVFNfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0
ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBl
YXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7
CisKK2NsYXNzIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVDaGFuZ2U7
CitlbnVtIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGUgOiBpbnQzMl90
OworCitlbnVtIE9ic2VydmFibGVFdmVudHNfVHlwZSA6IGludDMyX3QgeworICBPYnNlcnZhYmxl
RXZlbnRzX1R5cGVfVFlQRV9VTlNQRUNJRklFRCA9IDAsCisgIE9ic2VydmFibGVFdmVudHNfVHlw
ZV9UWVBFX0RBVEFfU09VUkNFU19JTlNUQU5DRVMgPSAxLAorICBPYnNlcnZhYmxlRXZlbnRzX1R5
cGVfVFlQRV9BTExfREFUQV9TT1VSQ0VTX1NUQVJURUQgPSAyLAorfTsKKworY29uc3QgT2JzZXJ2
YWJsZUV2ZW50c19UeXBlIE9ic2VydmFibGVFdmVudHNfVHlwZV9NSU4gPSBPYnNlcnZhYmxlRXZl
bnRzX1R5cGVfVFlQRV9VTlNQRUNJRklFRDsKK2NvbnN0IE9ic2VydmFibGVFdmVudHNfVHlwZSBP
YnNlcnZhYmxlRXZlbnRzX1R5cGVfTUFYID0gT2JzZXJ2YWJsZUV2ZW50c19UeXBlX1RZUEVfQUxM
X0RBVEFfU09VUkNFU19TVEFSVEVEOworCitlbnVtIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJj
ZUluc3RhbmNlU3RhdGUgOiBpbnQzMl90IHsKKyAgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNl
SW5zdGFuY2VTdGF0ZV9EQVRBX1NPVVJDRV9JTlNUQU5DRV9TVEFURV9TVE9QUEVEID0gMSwKKyAg
T2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZV9EQVRBX1NPVVJDRV9JTlNU
QU5DRV9TVEFURV9TVEFSVEVEID0gMiwKK307CisKK2NvbnN0IE9ic2VydmFibGVFdmVudHNfRGF0
YVNvdXJjZUluc3RhbmNlU3RhdGUgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VT
dGF0ZV9NSU4gPSBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlX0RBVEFf
U09VUkNFX0lOU1RBTkNFX1NUQVRFX1NUT1BQRUQ7Citjb25zdCBPYnNlcnZhYmxlRXZlbnRzX0Rh
dGFTb3VyY2VJbnN0YW5jZVN0YXRlIE9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNl
U3RhdGVfTUFYID0gT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZV9EQVRB
X1NPVVJDRV9JTlNUQU5DRV9TVEFURV9TVEFSVEVEOworCitjbGFzcyBPYnNlcnZhYmxlRXZlbnRz
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBw
dWJsaWM6CisgIE9ic2VydmFibGVFdmVudHNfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
T2JzZXJ2YWJsZUV2ZW50c19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE9ic2VydmFibGVFdmVudHNfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaW5zdGFuY2Vfc3RhdGVfY2hhbmdlcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRG
aWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBpbnN0YW5jZV9zdGF0ZV9jaGFu
Z2VzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+
KDEpOyB9CisgIGJvb2wgaGFzX2FsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBib29sIGFsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYm9vbCgpOyB9Cit9OworCitjbGFzcyBPYnNlcnZh
YmxlRXZlbnRzIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBPYnNlcnZhYmxlRXZlbnRzX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrSW5zdGFuY2VTdGF0ZUNoYW5nZXNGaWVsZE51bWJlciA9IDEsCisgICAga0FsbERh
dGFTb3VyY2VzU3RhcnRlZEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdXNpbmcgRGF0YVNvdXJj
ZUluc3RhbmNlU3RhdGVDaGFuZ2UgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6T2JzZXJ2
YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZTsKKyAgdXNpbmcgVHlwZSA9
IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpPYnNlcnZhYmxlRXZlbnRzX1R5cGU7CisgIHVz
aW5nIERhdGFTb3VyY2VJbnN0YW5jZVN0YXRlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86
Ok9ic2VydmFibGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGU7CisgIHN0YXRpYyBjb25z
dCBUeXBlIFRZUEVfVU5TUEVDSUZJRUQgPSBPYnNlcnZhYmxlRXZlbnRzX1R5cGVfVFlQRV9VTlNQ
RUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9EQVRBX1NPVVJDRVNfSU5TVEFOQ0VT
ID0gT2JzZXJ2YWJsZUV2ZW50c19UeXBlX1RZUEVfREFUQV9TT1VSQ0VTX0lOU1RBTkNFUzsKKyAg
c3RhdGljIGNvbnN0IFR5cGUgVFlQRV9BTExfREFUQV9TT1VSQ0VTX1NUQVJURUQgPSBPYnNlcnZh
YmxlRXZlbnRzX1R5cGVfVFlQRV9BTExfREFUQV9TT1VSQ0VTX1NUQVJURUQ7CisgIHN0YXRpYyBj
b25zdCBEYXRhU291cmNlSW5zdGFuY2VTdGF0ZSBEQVRBX1NPVVJDRV9JTlNUQU5DRV9TVEFURV9T
VE9QUEVEID0gT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZV9EQVRBX1NP
VVJDRV9JTlNUQU5DRV9TVEFURV9TVE9QUEVEOworICBzdGF0aWMgY29uc3QgRGF0YVNvdXJjZUlu
c3RhbmNlU3RhdGUgREFUQV9TT1VSQ0VfSU5TVEFOQ0VfU1RBVEVfU1RBUlRFRCA9IE9ic2VydmFi
bGVFdmVudHNfRGF0YVNvdXJjZUluc3RhbmNlU3RhdGVfREFUQV9TT1VSQ0VfSU5TVEFOQ0VfU1RB
VEVfU1RBUlRFRDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBPYnNlcnZhYmxlRXZlbnRzX0Rh
dGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlPiBUKiBhZGRfaW5zdGFuY2Vfc3RhdGVfY2hhbmdl
cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOworICB9CisKKyAgdm9p
ZCBzZXRfYWxsX2RhdGFfc291cmNlc19zdGFydGVkKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRU
aW55VmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgT2JzZXJ2YWJsZUV2ZW50c19E
YXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgT2JzZXJ2YWJsZUV2ZW50c19E
YXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBPYnNlcnZhYmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlQ2hhbmdlX0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZV9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19wcm9kdWNlcl9uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHBy
b2R1Y2VyX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJv
b2wgaGFzX2RhdGFfc291cmNlX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgZGF0YV9zb3VyY2VfbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc3RhdGUoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBzdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgT2JzZXJ2YWJsZUV2ZW50c19E
YXRhU291cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gT2JzZXJ2YWJsZUV2ZW50c19EYXRhU291
cmNlSW5zdGFuY2VTdGF0ZUNoYW5nZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a1Byb2R1Y2VyTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrRGF0YVNvdXJjZU5hbWVGaWVsZE51
bWJlciA9IDIsCisgICAga1N0YXRlRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9w
cm9kdWNlcl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9wcm9kdWNl
cl9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
MSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGF0YV9zb3VyY2VfbmFtZShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfZGF0YV9zb3VyY2VfbmFtZShjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOwor
ICB9CisgIHZvaWQgc2V0X3N0YXRlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpPYnNlcnZh
YmxlRXZlbnRzX0RhdGFTb3VyY2VJbnN0YW5jZVN0YXRlIHZhbHVlKSB7CisgICAgQXBwZW5kVGlu
eVZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1l
c3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29tbW9uL3N5
c19zdGF0c19jb3VudGVycy5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9a
ZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fU1lTX1NUQVRTX0NPVU5URVJTX1BST1RPX0hfCisj
ZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09NTU9OX1NZU19TVEFUU19D
T1VOVEVSU19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50
Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2Rl
Y29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNw
YWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitlbnVtIE1lbWluZm9Db3VudGVy
cyA6IGludDMyX3QgeworICBNRU1JTkZPX1VOU1BFQ0lGSUVEID0gMCwKKyAgTUVNSU5GT19NRU1f
VE9UQUwgPSAxLAorICBNRU1JTkZPX01FTV9GUkVFID0gMiwKKyAgTUVNSU5GT19NRU1fQVZBSUxB
QkxFID0gMywKKyAgTUVNSU5GT19CVUZGRVJTID0gNCwKKyAgTUVNSU5GT19DQUNIRUQgPSA1LAor
ICBNRU1JTkZPX1NXQVBfQ0FDSEVEID0gNiwKKyAgTUVNSU5GT19BQ1RJVkUgPSA3LAorICBNRU1J
TkZPX0lOQUNUSVZFID0gOCwKKyAgTUVNSU5GT19BQ1RJVkVfQU5PTiA9IDksCisgIE1FTUlORk9f
SU5BQ1RJVkVfQU5PTiA9IDEwLAorICBNRU1JTkZPX0FDVElWRV9GSUxFID0gMTEsCisgIE1FTUlO
Rk9fSU5BQ1RJVkVfRklMRSA9IDEyLAorICBNRU1JTkZPX1VORVZJQ1RBQkxFID0gMTMsCisgIE1F
TUlORk9fTUxPQ0tFRCA9IDE0LAorICBNRU1JTkZPX1NXQVBfVE9UQUwgPSAxNSwKKyAgTUVNSU5G
T19TV0FQX0ZSRUUgPSAxNiwKKyAgTUVNSU5GT19ESVJUWSA9IDE3LAorICBNRU1JTkZPX1dSSVRF
QkFDSyA9IDE4LAorICBNRU1JTkZPX0FOT05fUEFHRVMgPSAxOSwKKyAgTUVNSU5GT19NQVBQRUQg
PSAyMCwKKyAgTUVNSU5GT19TSE1FTSA9IDIxLAorICBNRU1JTkZPX1NMQUIgPSAyMiwKKyAgTUVN
SU5GT19TTEFCX1JFQ0xBSU1BQkxFID0gMjMsCisgIE1FTUlORk9fU0xBQl9VTlJFQ0xBSU1BQkxF
ID0gMjQsCisgIE1FTUlORk9fS0VSTkVMX1NUQUNLID0gMjUsCisgIE1FTUlORk9fUEFHRV9UQUJM
RVMgPSAyNiwKKyAgTUVNSU5GT19DT01NSVRfTElNSVQgPSAyNywKKyAgTUVNSU5GT19DT01NSVRF
RF9BUyA9IDI4LAorICBNRU1JTkZPX1ZNQUxMT0NfVE9UQUwgPSAyOSwKKyAgTUVNSU5GT19WTUFM
TE9DX1VTRUQgPSAzMCwKKyAgTUVNSU5GT19WTUFMTE9DX0NIVU5LID0gMzEsCisgIE1FTUlORk9f
Q01BX1RPVEFMID0gMzIsCisgIE1FTUlORk9fQ01BX0ZSRUUgPSAzMywKK307CisKK2NvbnN0IE1l
bWluZm9Db3VudGVycyBNZW1pbmZvQ291bnRlcnNfTUlOID0gTUVNSU5GT19VTlNQRUNJRklFRDsK
K2NvbnN0IE1lbWluZm9Db3VudGVycyBNZW1pbmZvQ291bnRlcnNfTUFYID0gTUVNSU5GT19DTUFf
RlJFRTsKKworZW51bSBWbXN0YXRDb3VudGVycyA6IGludDMyX3QgeworICBWTVNUQVRfVU5TUEVD
SUZJRUQgPSAwLAorICBWTVNUQVRfTlJfRlJFRV9QQUdFUyA9IDEsCisgIFZNU1RBVF9OUl9BTExP
Q19CQVRDSCA9IDIsCisgIFZNU1RBVF9OUl9JTkFDVElWRV9BTk9OID0gMywKKyAgVk1TVEFUX05S
X0FDVElWRV9BTk9OID0gNCwKKyAgVk1TVEFUX05SX0lOQUNUSVZFX0ZJTEUgPSA1LAorICBWTVNU
QVRfTlJfQUNUSVZFX0ZJTEUgPSA2LAorICBWTVNUQVRfTlJfVU5FVklDVEFCTEUgPSA3LAorICBW
TVNUQVRfTlJfTUxPQ0sgPSA4LAorICBWTVNUQVRfTlJfQU5PTl9QQUdFUyA9IDksCisgIFZNU1RB
VF9OUl9NQVBQRUQgPSAxMCwKKyAgVk1TVEFUX05SX0ZJTEVfUEFHRVMgPSAxMSwKKyAgVk1TVEFU
X05SX0RJUlRZID0gMTIsCisgIFZNU1RBVF9OUl9XUklURUJBQ0sgPSAxMywKKyAgVk1TVEFUX05S
X1NMQUJfUkVDTEFJTUFCTEUgPSAxNCwKKyAgVk1TVEFUX05SX1NMQUJfVU5SRUNMQUlNQUJMRSA9
IDE1LAorICBWTVNUQVRfTlJfUEFHRV9UQUJMRV9QQUdFUyA9IDE2LAorICBWTVNUQVRfTlJfS0VS
TkVMX1NUQUNLID0gMTcsCisgIFZNU1RBVF9OUl9PVkVSSEVBRCA9IDE4LAorICBWTVNUQVRfTlJf
VU5TVEFCTEUgPSAxOSwKKyAgVk1TVEFUX05SX0JPVU5DRSA9IDIwLAorICBWTVNUQVRfTlJfVk1T
Q0FOX1dSSVRFID0gMjEsCisgIFZNU1RBVF9OUl9WTVNDQU5fSU1NRURJQVRFX1JFQ0xBSU0gPSAy
MiwKKyAgVk1TVEFUX05SX1dSSVRFQkFDS19URU1QID0gMjMsCisgIFZNU1RBVF9OUl9JU09MQVRF
RF9BTk9OID0gMjQsCisgIFZNU1RBVF9OUl9JU09MQVRFRF9GSUxFID0gMjUsCisgIFZNU1RBVF9O
Ul9TSE1FTSA9IDI2LAorICBWTVNUQVRfTlJfRElSVElFRCA9IDI3LAorICBWTVNUQVRfTlJfV1JJ
VFRFTiA9IDI4LAorICBWTVNUQVRfTlJfUEFHRVNfU0NBTk5FRCA9IDI5LAorICBWTVNUQVRfV09S
S0lOR1NFVF9SRUZBVUxUID0gMzAsCisgIFZNU1RBVF9XT1JLSU5HU0VUX0FDVElWQVRFID0gMzEs
CisgIFZNU1RBVF9XT1JLSU5HU0VUX05PREVSRUNMQUlNID0gMzIsCisgIFZNU1RBVF9OUl9BTk9O
X1RSQU5TUEFSRU5UX0hVR0VQQUdFUyA9IDMzLAorICBWTVNUQVRfTlJfRlJFRV9DTUEgPSAzNCwK
KyAgVk1TVEFUX05SX1NXQVBDQUNIRSA9IDM1LAorICBWTVNUQVRfTlJfRElSVFlfVEhSRVNIT0xE
ID0gMzYsCisgIFZNU1RBVF9OUl9ESVJUWV9CQUNLR1JPVU5EX1RIUkVTSE9MRCA9IDM3LAorICBW
TVNUQVRfUEdQR0lOID0gMzgsCisgIFZNU1RBVF9QR1BHT1VUID0gMzksCisgIFZNU1RBVF9QR1BH
T1VUQ0xFQU4gPSA0MCwKKyAgVk1TVEFUX1BTV1BJTiA9IDQxLAorICBWTVNUQVRfUFNXUE9VVCA9
IDQyLAorICBWTVNUQVRfUEdBTExPQ19ETUEgPSA0MywKKyAgVk1TVEFUX1BHQUxMT0NfTk9STUFM
ID0gNDQsCisgIFZNU1RBVF9QR0FMTE9DX01PVkFCTEUgPSA0NSwKKyAgVk1TVEFUX1BHRlJFRSA9
IDQ2LAorICBWTVNUQVRfUEdBQ1RJVkFURSA9IDQ3LAorICBWTVNUQVRfUEdERUFDVElWQVRFID0g
NDgsCisgIFZNU1RBVF9QR0ZBVUxUID0gNDksCisgIFZNU1RBVF9QR01BSkZBVUxUID0gNTAsCisg
IFZNU1RBVF9QR1JFRklMTF9ETUEgPSA1MSwKKyAgVk1TVEFUX1BHUkVGSUxMX05PUk1BTCA9IDUy
LAorICBWTVNUQVRfUEdSRUZJTExfTU9WQUJMRSA9IDUzLAorICBWTVNUQVRfUEdTVEVBTF9LU1dB
UERfRE1BID0gNTQsCisgIFZNU1RBVF9QR1NURUFMX0tTV0FQRF9OT1JNQUwgPSA1NSwKKyAgVk1T
VEFUX1BHU1RFQUxfS1NXQVBEX01PVkFCTEUgPSA1NiwKKyAgVk1TVEFUX1BHU1RFQUxfRElSRUNU
X0RNQSA9IDU3LAorICBWTVNUQVRfUEdTVEVBTF9ESVJFQ1RfTk9STUFMID0gNTgsCisgIFZNU1RB
VF9QR1NURUFMX0RJUkVDVF9NT1ZBQkxFID0gNTksCisgIFZNU1RBVF9QR1NDQU5fS1NXQVBEX0RN
QSA9IDYwLAorICBWTVNUQVRfUEdTQ0FOX0tTV0FQRF9OT1JNQUwgPSA2MSwKKyAgVk1TVEFUX1BH
U0NBTl9LU1dBUERfTU9WQUJMRSA9IDYyLAorICBWTVNUQVRfUEdTQ0FOX0RJUkVDVF9ETUEgPSA2
MywKKyAgVk1TVEFUX1BHU0NBTl9ESVJFQ1RfTk9STUFMID0gNjQsCisgIFZNU1RBVF9QR1NDQU5f
RElSRUNUX01PVkFCTEUgPSA2NSwKKyAgVk1TVEFUX1BHU0NBTl9ESVJFQ1RfVEhST1RUTEUgPSA2
NiwKKyAgVk1TVEFUX1BHSU5PREVTVEVBTCA9IDY3LAorICBWTVNUQVRfU0xBQlNfU0NBTk5FRCA9
IDY4LAorICBWTVNUQVRfS1NXQVBEX0lOT0RFU1RFQUwgPSA2OSwKKyAgVk1TVEFUX0tTV0FQRF9M
T1dfV01BUktfSElUX1FVSUNLTFkgPSA3MCwKKyAgVk1TVEFUX0tTV0FQRF9ISUdIX1dNQVJLX0hJ
VF9RVUlDS0xZID0gNzEsCisgIFZNU1RBVF9QQUdFT1VUUlVOID0gNzIsCisgIFZNU1RBVF9BTExP
Q1NUQUxMID0gNzMsCisgIFZNU1RBVF9QR1JPVEFURUQgPSA3NCwKKyAgVk1TVEFUX0RST1BfUEFH
RUNBQ0hFID0gNzUsCisgIFZNU1RBVF9EUk9QX1NMQUIgPSA3NiwKKyAgVk1TVEFUX1BHTUlHUkFU
RV9TVUNDRVNTID0gNzcsCisgIFZNU1RBVF9QR01JR1JBVEVfRkFJTCA9IDc4LAorICBWTVNUQVRf
Q09NUEFDVF9NSUdSQVRFX1NDQU5ORUQgPSA3OSwKKyAgVk1TVEFUX0NPTVBBQ1RfRlJFRV9TQ0FO
TkVEID0gODAsCisgIFZNU1RBVF9DT01QQUNUX0lTT0xBVEVEID0gODEsCisgIFZNU1RBVF9DT01Q
QUNUX1NUQUxMID0gODIsCisgIFZNU1RBVF9DT01QQUNUX0ZBSUwgPSA4MywKKyAgVk1TVEFUX0NP
TVBBQ1RfU1VDQ0VTUyA9IDg0LAorICBWTVNUQVRfQ09NUEFDVF9EQUVNT05fV0FLRSA9IDg1LAor
ICBWTVNUQVRfVU5FVklDVEFCTEVfUEdTX0NVTExFRCA9IDg2LAorICBWTVNUQVRfVU5FVklDVEFC
TEVfUEdTX1NDQU5ORUQgPSA4NywKKyAgVk1TVEFUX1VORVZJQ1RBQkxFX1BHU19SRVNDVUVEID0g
ODgsCisgIFZNU1RBVF9VTkVWSUNUQUJMRV9QR1NfTUxPQ0tFRCA9IDg5LAorICBWTVNUQVRfVU5F
VklDVEFCTEVfUEdTX01VTkxPQ0tFRCA9IDkwLAorICBWTVNUQVRfVU5FVklDVEFCTEVfUEdTX0NM
RUFSRUQgPSA5MSwKKyAgVk1TVEFUX1VORVZJQ1RBQkxFX1BHU19TVFJBTkRFRCA9IDkyLAorICBW
TVNUQVRfTlJfWlNQQUdFUyA9IDkzLAorICBWTVNUQVRfTlJfSU9OX0hFQVAgPSA5NCwKKyAgVk1T
VEFUX05SX0dQVV9IRUFQID0gOTUsCit9OworCitjb25zdCBWbXN0YXRDb3VudGVycyBWbXN0YXRD
b3VudGVyc19NSU4gPSBWTVNUQVRfVU5TUEVDSUZJRUQ7Citjb25zdCBWbXN0YXRDb3VudGVycyBW
bXN0YXRDb3VudGVyc19NQVggPSBWTVNUQVRfTlJfR1BVX0hFQVA7CisKK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBn
dWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vY29tbW9uL3RyYWNlX3N0YXRzLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQ
cm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9UUkFDRV9TVEFUU19QUk9UT19IXworI2Rl
ZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9UUkFDRV9TVEFUU19Q
Uk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9t
ZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3Rv
cyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgVHJhY2VTdGF0c19CdWZmZXJTdGF0czsK
KworY2xhc3MgVHJhY2VTdGF0c19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEwLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgVHJhY2VTdGF0c19EZWNvZGVyKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7
fQorICBleHBsaWNpdCBUcmFjZVN0YXRzX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2VTdGF0c19EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19idWZmZXJfc3RhdHMoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVy
YXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gYnVmZmVyX3N0YXRzKCkgY29uc3QgeyByZXR1
cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDEpOyB9CisgIGJvb2wgaGFz
X3Byb2R1Y2Vyc19jb25uZWN0ZWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgdWludDMyX3QgcHJvZHVjZXJzX2Nvbm5lY3RlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
YXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcHJvZHVjZXJzX3NlZW4oKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcHJvZHVjZXJzX3NlZW4oKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2RhdGFfc291cmNlc19y
ZWdpc3RlcmVkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGRhdGFfc291cmNlc19yZWdpc3RlcmVkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50
MzIoKTsgfQorICBib29sIGhhc19kYXRhX3NvdXJjZXNfc2VlbigpIGNvbnN0IHsgcmV0dXJuIGF0
PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkYXRhX3NvdXJjZXNfc2VlbigpIGNvbnN0IHsg
cmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfdHJhY2luZ19zZXNzaW9u
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB0cmFjaW5n
X3Nlc3Npb25zKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc190b3RhbF9idWZmZXJzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IHRvdGFsX2J1ZmZlcnMoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX2NodW5rc19kaXNjYXJkZWQoKSBjb25zdCB7IHJldHVybiBhdDw4
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgY2h1bmtzX2Rpc2NhcmRlZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDg+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcGF0Y2hlc19kaXNjYXJkZWQo
KSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGF0Y2hlc19k
aXNjYXJkZWQoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2ludmFsaWRfcGFja2V0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgaW52YWxpZF9wYWNrZXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkuYXNf
dWludDY0KCk7IH0KK307CisKK2NsYXNzIFRyYWNlU3RhdHMgOiBwdWJsaWMgOjpwcm90b3plcm86
Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNlU3RhdHNfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtCdWZmZXJTdGF0c0ZpZWxkTnVtYmVyID0gMSwK
KyAgICBrUHJvZHVjZXJzQ29ubmVjdGVkRmllbGROdW1iZXIgPSAyLAorICAgIGtQcm9kdWNlcnNT
ZWVuRmllbGROdW1iZXIgPSAzLAorICAgIGtEYXRhU291cmNlc1JlZ2lzdGVyZWRGaWVsZE51bWJl
ciA9IDQsCisgICAga0RhdGFTb3VyY2VzU2VlbkZpZWxkTnVtYmVyID0gNSwKKyAgICBrVHJhY2lu
Z1Nlc3Npb25zRmllbGROdW1iZXIgPSA2LAorICAgIGtUb3RhbEJ1ZmZlcnNGaWVsZE51bWJlciA9
IDcsCisgICAga0NodW5rc0Rpc2NhcmRlZEZpZWxkTnVtYmVyID0gOCwKKyAgICBrUGF0Y2hlc0Rp
c2NhcmRlZEZpZWxkTnVtYmVyID0gOSwKKyAgICBrSW52YWxpZFBhY2tldHNGaWVsZE51bWJlciA9
IDEwLAorICB9OworICB1c2luZyBCdWZmZXJTdGF0cyA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6
ZXJvOjpUcmFjZVN0YXRzX0J1ZmZlclN0YXRzOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRy
YWNlU3RhdHNfQnVmZmVyU3RhdHM+IFQqIGFkZF9idWZmZXJfc3RhdHMoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCisgIHZvaWQgc2V0X3Byb2R1Y2Vyc19j
b25uZWN0ZWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3Byb2R1Y2Vyc19zZWVuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kYXRhX3NvdXJjZXNfcmVnaXN0
ZXJlZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfZGF0YV9zb3VyY2VzX3NlZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RyYWNpbmdfc2Vzc2lvbnModWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3RvdGFsX2J1ZmZlcnModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNywg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NodW5rc19kaXNjYXJkZWQodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhdGNoZXNf
ZGlzY2FyZGVkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDksIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9pbnZhbGlkX3BhY2tldHModWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMTAsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgVHJhY2VTdGF0c19CdWZm
ZXJTdGF0c19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzE5LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFs
c2U+IHsKKyBwdWJsaWM6CisgIFRyYWNlU3RhdHNfQnVmZmVyU3RhdHNfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgVHJhY2VTdGF0c19CdWZmZXJTdGF0c19EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlU3Rh
dHNfQnVmZmVyU3RhdHNfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
YnVmZmVyX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGJ1ZmZlcl9zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfYnl0ZXNfd3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBieXRlc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19ieXRlc19vdmVyd3JpdHRlbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDEzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYnl0ZXNfb3ZlcndyaXR0ZW4oKSBj
b25zdCB7IHJldHVybiBhdDwxMz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ieXRlc19y
ZWFkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBieXRl
c19yZWFkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfcGFkZGluZ19ieXRlc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8MTU+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBwYWRkaW5nX2J5dGVzX3dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBh
dDwxNT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wYWRkaW5nX2J5dGVzX2NsZWFyZWQo
KSBjb25zdCB7IHJldHVybiBhdDwxNj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBhZGRpbmdf
Ynl0ZXNfY2xlYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2NodW5rc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IGNodW5rc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19jaHVua3NfcmV3cml0dGVuKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjaHVua3NfcmV3cml0dGVuKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTA+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfY2h1bmtzX292
ZXJ3cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGNodW5rc19vdmVyd3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7
IH0KKyAgYm9vbCBoYXNfY2h1bmtzX2Rpc2NhcmRlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE4Pigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3QgY2h1bmtzX2Rpc2NhcmRlZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE4PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NodW5rc19yZWFkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTc+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjaHVua3NfcmVhZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE3PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NodW5rc19j
b21taXR0ZWRfb3V0X29mX29yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBjaHVua3NfY29tbWl0dGVkX291dF9vZl9vcmRlcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDExPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3dyaXRlX3dyYXBfY291bnQo
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgd3JpdGVfd3Jh
cF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfcGF0Y2hlc19zdWNjZWVkZWQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgcGF0Y2hlc19zdWNjZWVkZWQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3BhdGNoZXNfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4g
YXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBhdGNoZXNfZmFpbGVkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19yZWFkYWhlYWRzX3N1Y2Nl
ZWRlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCByZWFk
YWhlYWRzX3N1Y2NlZWRlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfcmVhZGFoZWFkc19mYWlsZWQoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgcmVhZGFoZWFkc19mYWlsZWQoKSBjb25zdCB7IHJldHVybiBh
dDw4PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2FiaV92aW9sYXRpb25zKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGFiaV92aW9sYXRpb25zKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc190cmFjZV93
cml0ZXJfcGFja2V0X2xvc3MoKSBjb25zdCB7IHJldHVybiBhdDwxOT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IHRyYWNlX3dyaXRlcl9wYWNrZXRfbG9zcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE5
PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzIDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBUcmFjZVN0YXRzX0J1ZmZlclN0YXRzX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrQnVmZmVyU2l6ZUZpZWxkTnVtYmVyID0gMTIsCisgICAga0J5dGVzV3JpdHRlbkZpZWxkTnVt
YmVyID0gMSwKKyAgICBrQnl0ZXNPdmVyd3JpdHRlbkZpZWxkTnVtYmVyID0gMTMsCisgICAga0J5
dGVzUmVhZEZpZWxkTnVtYmVyID0gMTQsCisgICAga1BhZGRpbmdCeXRlc1dyaXR0ZW5GaWVsZE51
bWJlciA9IDE1LAorICAgIGtQYWRkaW5nQnl0ZXNDbGVhcmVkRmllbGROdW1iZXIgPSAxNiwKKyAg
ICBrQ2h1bmtzV3JpdHRlbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ2h1bmtzUmV3cml0dGVuRmll
bGROdW1iZXIgPSAxMCwKKyAgICBrQ2h1bmtzT3ZlcndyaXR0ZW5GaWVsZE51bWJlciA9IDMsCisg
ICAga0NodW5rc0Rpc2NhcmRlZEZpZWxkTnVtYmVyID0gMTgsCisgICAga0NodW5rc1JlYWRGaWVs
ZE51bWJlciA9IDE3LAorICAgIGtDaHVua3NDb21taXR0ZWRPdXRPZk9yZGVyRmllbGROdW1iZXIg
PSAxMSwKKyAgICBrV3JpdGVXcmFwQ291bnRGaWVsZE51bWJlciA9IDQsCisgICAga1BhdGNoZXNT
dWNjZWVkZWRGaWVsZE51bWJlciA9IDUsCisgICAga1BhdGNoZXNGYWlsZWRGaWVsZE51bWJlciA9
IDYsCisgICAga1JlYWRhaGVhZHNTdWNjZWVkZWRGaWVsZE51bWJlciA9IDcsCisgICAga1JlYWRh
aGVhZHNGYWlsZWRGaWVsZE51bWJlciA9IDgsCisgICAga0FiaVZpb2xhdGlvbnNGaWVsZE51bWJl
ciA9IDksCisgICAga1RyYWNlV3JpdGVyUGFja2V0TG9zc0ZpZWxkTnVtYmVyID0gMTksCisgIH07
CisgIHZvaWQgc2V0X2J1ZmZlcl9zaXplKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDEyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYnl0ZXNfd3JpdHRlbih1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYnl0
ZXNfb3ZlcndyaXR0ZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTMsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9ieXRlc19yZWFkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDE0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFkZGluZ19ieXRlc193
cml0dGVuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE1LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcGFkZGluZ19ieXRlc19jbGVhcmVkKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDE2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2h1bmtzX3dyaXR0
ZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2NodW5rc19yZXdyaXR0ZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMTAsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jaHVua3Nfb3ZlcndyaXR0ZW4odWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2NodW5rc19kaXNjYXJkZWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MTgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jaHVua3NfcmVhZCh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NodW5rc19j
b21taXR0ZWRfb3V0X29mX29yZGVyKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDExLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfd3JpdGVfd3JhcF9jb3VudCh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGF0
Y2hlc19zdWNjZWVkZWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3BhdGNoZXNfZmFpbGVkKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZWFkYWhlYWRzX3N1
Y2NlZWRlZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcmVhZGFoZWFkc19mYWlsZWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2FiaV92aW9sYXRpb25zKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDksIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF90cmFjZV93cml0ZXJfcGFja2V0X2xvc3ModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMTksIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24v
dHJhY2luZ19zZXJ2aWNlX2NhcGFiaWxpdGllcy5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBi
eSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYg
UEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT01NT05fVFJBQ0lOR19TRVJWSUNFX0NB
UEFCSUxJVElFU19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTU1PTl9UUkFDSU5HX1NFUlZJQ0VfQ0FQQUJJTElUSUVTX1BST1RPX0hfCisKKyNpbmNs
dWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBw
Ynplcm8geworCitlbnVtIE9ic2VydmFibGVFdmVudHNfVHlwZSA6IGludDMyX3Q7CisKK2NsYXNz
IFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JF
UEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFRyYWNpbmdTZXJ2aWNlQ2FwYWJp
bGl0aWVzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNpbmdTZXJ2aWNlQ2FwYWJp
bGl0aWVzX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgVHJhY2luZ1NlcnZpY2VDYXBhYmlsaXRpZXNfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaGFzX3F1ZXJ5X2NhcGFiaWxpdGllcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBib29sIGhhc19xdWVyeV9jYXBhYmls
aXRpZXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19v
YnNlcnZhYmxlX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPGludDMyX3Q+IG9ic2VydmFibGVfZXZl
bnRzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8aW50MzJfdD4oMik7IH0KKyAgYm9vbCBo
YXNfaGFzX3RyYWNlX2NvbmZpZ19vdXRwdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
dmFsaWQoKTsgfQorICBib29sIGhhc190cmFjZV9jb25maWdfb3V0cHV0X3BhdGgoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX2Jvb2woKTsgfQorfTsKKworY2xhc3MgVHJhY2luZ1NlcnZpY2VD
YXBhYmlsaXRpZXMgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IFRyYWNpbmdTZXJ2aWNlQ2FwYWJpbGl0aWVzX0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrSGFzUXVlcnlDYXBhYmlsaXRpZXNGaWVsZE51bWJlciA9IDEs
CisgICAga09ic2VydmFibGVFdmVudHNGaWVsZE51bWJlciA9IDIsCisgICAga0hhc1RyYWNlQ29u
ZmlnT3V0cHV0UGF0aEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfaGFzX3F1ZXJ5
X2NhcGFiaWxpdGllcyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBhZGRfb2JzZXJ2YWJsZV9ldmVudHMoOjpwZXJmZXR0bzo6cHJvdG9z
OjpwYnplcm86Ok9ic2VydmFibGVFdmVudHNfVHlwZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlW
YXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2hhc190cmFjZV9jb25maWdfb3V0cHV0
X3BhdGgoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMywgdmFsdWUpOworICB9
Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2Uu
CisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbW1vbi90cmFjaW5nX3NlcnZpY2Vfc3RhdGUucGJ6
ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4u
IERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
Q09NTU9OX1RSQUNJTkdfU0VSVklDRV9TVEFURV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19Q
Uk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9UUkFDSU5HX1NFUlZJQ0VfU1RBVEVfUFJPVE9f
SF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2Fn
ZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJv
dG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mgewor
bmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIERhdGFTb3VyY2VEZXNjcmlwdG9yOworY2xhc3Mg
VHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlOworY2xhc3MgVHJhY2luZ1NlcnZpY2VTdGF0
ZV9Qcm9kdWNlcjsKKworY2xhc3MgVHJhY2luZ1NlcnZpY2VTdGF0ZV9EZWNvZGVyIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBUcmFjaW5n
U2VydmljZVN0YXRlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNpbmdTZXJ2aWNl
U3RhdGVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBUcmFjaW5nU2VydmljZVN0YXRlX0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX3Byb2R1Y2VycygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPiBwcm9kdWNlcnMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfZGF0YV9zb3VyY2VzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRl
ZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGRhdGFfc291cmNlcygpIGNv
bnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyKTsgfQor
ICBib29sIGhhc19udW1fc2Vzc2lvbnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7
IH0KKyAgaW50MzJfdCBudW1fc2Vzc2lvbnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2lu
dDMyKCk7IH0KKyAgYm9vbCBoYXNfbnVtX3Nlc3Npb25zX3N0YXJ0ZWQoKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBudW1fc2Vzc2lvbnNfc3RhcnRlZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgVHJhY2luZ1Nl
cnZpY2VTdGF0ZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1
c2luZyBEZWNvZGVyID0gVHJhY2luZ1NlcnZpY2VTdGF0ZV9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga1Byb2R1Y2Vyc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrRGF0YVNvdXJjZXNG
aWVsZE51bWJlciA9IDIsCisgICAga051bVNlc3Npb25zRmllbGROdW1iZXIgPSAzLAorICAgIGtO
dW1TZXNzaW9uc1N0YXJ0ZWRGaWVsZE51bWJlciA9IDQsCisgIH07CisgIHVzaW5nIFByb2R1Y2Vy
ID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVj
ZXI7CisgIHVzaW5nIERhdGFTb3VyY2UgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJh
Y2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRy
YWNpbmdTZXJ2aWNlU3RhdGVfUHJvZHVjZXI+IFQqIGFkZF9wcm9kdWNlcnMoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlPiBUKiBhZGRfZGF0YV9zb3VyY2Vz
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworICB2b2lk
IHNldF9udW1fc2Vzc2lvbnMoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnVtX3Nlc3Npb25zX3N0YXJ0ZWQoaW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRyYWNp
bmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVHJhY2luZ1NlcnZpY2VTdGF0ZV9E
YXRhU291cmNlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNpbmdTZXJ2aWNlU3Rh
dGVfRGF0YVNvdXJjZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNpbmdTZXJ2aWNlU3RhdGVfRGF0YVNvdXJjZV9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kc19kZXNjcmlwdG9yKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIGRzX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfcHJvZHVjZXJfaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgaW50MzJfdCBwcm9kdWNlcl9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50
MzIoKTsgfQorfTsKKworY2xhc3MgVHJhY2luZ1NlcnZpY2VTdGF0ZV9EYXRhU291cmNlIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBU
cmFjaW5nU2VydmljZVN0YXRlX0RhdGFTb3VyY2VfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qg
eworICAgIGtEc0Rlc2NyaXB0b3JGaWVsZE51bWJlciA9IDEsCisgICAga1Byb2R1Y2VySWRGaWVs
ZE51bWJlciA9IDIsCisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGF0YVNvdXJjZURl
c2NyaXB0b3I+IFQqIHNldF9kc19kZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMSk7CisgIH0KKworICB2b2lkIHNldF9wcm9kdWNlcl9pZChpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgVHJh
Y2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVHJhY2luZ1NlcnZpY2VTdGF0ZV9Q
cm9kdWNlcl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQ
cm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFjaW5nU2VydmljZVN0YXRl
X1Byb2R1Y2VyX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgVHJhY2luZ1NlcnZpY2VTdGF0ZV9Qcm9kdWNlcl9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c19pbnQzMigpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdWlkKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2Vy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBUcmFjaW5nU2VydmljZVN0YXRlX1Byb2R1Y2VyX0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrSWRGaWVsZE51bWJlciA9IDEsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIs
CisgICAga1VpZEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfaWQoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFt
ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5k
YXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBk
YXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9
CisgIHZvaWQgc2V0X3VpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8g
TmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb21tb24vdHJhY2tfZXZlbnRfZGVz
Y3JpcHRvci5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBp
bGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19DT01NT05fVFJBQ0tfRVZFTlRfREVTQ1JJUFRPUl9QUk9UT19IXworI2RlZmlu
ZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTU1PTl9UUkFDS19FVkVOVF9ERVND
UklQVE9SX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQu
aD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVj
b2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3Bh
Y2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBUcmFja0V2ZW50Q2F0ZWdv
cnk7CisKK2NsYXNzIFRyYWNrRXZlbnREZXNjcmlwdG9yX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFRyYWNrRXZlbnREZXNj
cmlwdG9yX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNrRXZlbnREZXNjcmlwdG9y
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgVHJhY2tFdmVudERlc2NyaXB0b3JfRGVjb2Rlcihjb25zdCA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6
ZSkge30KKyAgYm9vbCBoYXNfYXZhaWxhYmxlX2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4gYXZhaWxhYmxlX2NhdGVnb3JpZXMoKSBjb25zdCB7IHJl
dHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KK307CisKK2Ns
YXNzIFRyYWNrRXZlbnREZXNjcmlwdG9yIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFja0V2ZW50RGVzY3JpcHRvcl9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga0F2YWlsYWJsZUNhdGVnb3JpZXNGaWVsZE51bWJl
ciA9IDEsCisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2tFdmVudENhdGVnb3J5
PiBUKiBhZGRfYXZhaWxhYmxlX2NhdGVnb3JpZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigxKTsKKyAgfQorCit9OworCitjbGFzcyBUcmFja0V2ZW50Q2F0ZWdvcnlfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1Ymxp
YzoKKyAgVHJhY2tFdmVudENhdGVnb3J5X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRy
YWNrRXZlbnRDYXRlZ29yeV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNrRXZlbnRDYXRlZ29yeV9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2Rlc2NyaXB0aW9uKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENo
YXJzIGRlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQor
ICBib29sIGhhc190YWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+
IHRhZ3MoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFy
cz4oMyk7IH0KK307CisKK2NsYXNzIFRyYWNrRXZlbnRDYXRlZ29yeSA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2tFdmVudENh
dGVnb3J5X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrRGVzY3JpcHRpb25GaWVsZE51bWJlciA9IDIsCisgICAga1RhZ3NGaWVsZE51
bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9
CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBB
cHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9kZXNjcmlwdGlvbihj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfZGVzY3JpcHRpb24oY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIGFkZF90YWdzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFk
ZF90YWdzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
MywgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3Bh
Y2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL2FuZHJv
aWQvYW5kcm9pZF9sb2dfY29uZmlnLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQ
cm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19BTkRST0lEX0FORFJPSURfTE9HX0NPTkZJ
R19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJ
R19BTkRST0lEX0FORFJPSURfTE9HX0NPTkZJR19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVm
Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVk
X2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKwor
ZW51bSBBbmRyb2lkTG9nSWQgOiBpbnQzMl90OworZW51bSBBbmRyb2lkTG9nUHJpb3JpdHkgOiBp
bnQzMl90OworCitjbGFzcyBBbmRyb2lkTG9nQ29uZmlnX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIEFuZHJvaWRMb2dDb25m
aWdfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQW5kcm9pZExvZ0NvbmZpZ19EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IEFuZHJvaWRMb2dDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfbG9nX2lkcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPGludDMyX3Q+IGxvZ19pZHMoKSBjb25zdCB7
IHJldHVybiBHZXRSZXBlYXRlZDxpbnQzMl90PigxKTsgfQorICBib29sIGhhc19taW5fcHJpbygp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG1pbl9wcmlvKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2ZpbHRlcl90
YWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpS
ZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IGZpbHRlcl90YWdz
KCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+KDQp
OyB9Cit9OworCitjbGFzcyBBbmRyb2lkTG9nQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBBbmRyb2lkTG9nQ29uZmlnX0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTG9nSWRzRmllbGROdW1iZXIgPSAxLAor
ICAgIGtNaW5QcmlvRmllbGROdW1iZXIgPSAzLAorICAgIGtGaWx0ZXJUYWdzRmllbGROdW1iZXIg
PSA0LAorICB9OworICB2b2lkIGFkZF9sb2dfaWRzKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJv
OjpBbmRyb2lkTG9nSWQgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9taW5fcHJpbyg6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6QW5k
cm9pZExvZ1ByaW9yaXR5IHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgzLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBhZGRfZmlsdGVyX3RhZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7
CisgICAgQXBwZW5kQnl0ZXMoNCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9Cisg
IHZvaWQgYWRkX2ZpbHRlcl90YWdzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoNCwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBn
dWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vY29uZmlnL2FuZHJvaWQvYW5kcm9pZF9wb2xsZWRfc3RhdGVfY29uZmlnLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19B
TkRST0lEX0FORFJPSURfUE9MTEVEX1NUQVRFX0NPTkZJR19QUk9UT19IXworI2RlZmluZSBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19BTkRST0lEX0FORFJPSURfUE9MTEVE
X1NUQVRFX0NPTkZJR19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8
c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3By
b3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
bmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBBbmRyb2lk
UG9sbGVkU3RhdGVDb25maWdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklF
TERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEFuZHJvaWRQb2xsZWRTdGF0ZUNvbmZpZ19EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWdfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBBbmRyb2lkUG9sbGVkU3RhdGVDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkg
e30KKyAgYm9vbCBoYXNfcG9sbF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBwb2xsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIo
KTsgfQorfTsKKworY2xhc3MgQW5kcm9pZFBvbGxlZFN0YXRlQ29uZmlnIDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBBbmRyb2lkUG9s
bGVkU3RhdGVDb25maWdfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQb2xsTXNG
aWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X3BvbGxfbXModWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFj
ZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUg
Z3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL2NvbmZpZy9hbmRyb2lkL3BhY2thZ2VzX2xpc3RfY29uZmlnLnBiemVyby5oCisvLyBBdXRv
Z2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4K
KworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19BTkRST0lE
X1BBQ0tBR0VTX0xJU1RfQ09ORklHX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fQ09ORklHX0FORFJPSURfUEFDS0FHRVNfTElTVF9DT05GSUdfUFJPVE9f
SF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2Fn
ZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJv
dG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mgewor
bmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgUGFja2FnZXNMaXN0Q29uZmlnX0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6Cisg
IFBhY2thZ2VzTGlzdENvbmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBQYWNrYWdl
c0xpc3RDb25maWdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBQYWNrYWdlc0xpc3RDb25maWdfRGVjb2Rlcihjb25zdCA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRh
LCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGFja2FnZV9uYW1lX2ZpbHRlcigpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0
ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiBwYWNrYWdlX25hbWVfZmlsdGVyKCkgY29u
c3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+KDEpOyB9Cit9
OworCitjbGFzcyBQYWNrYWdlc0xpc3RDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFBhY2thZ2VzTGlzdENvbmZpZ19EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1BhY2thZ2VOYW1lRmlsdGVyRmllbGROdW1i
ZXIgPSAxLAorICB9OworICB2b2lkIGFkZF9wYWNrYWdlX25hbWVfZmlsdGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUu
c2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9wYWNrYWdlX25hbWVfZmlsdGVyKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7Cisg
IH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFj
ZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBo
ZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL2Z0cmFjZS9mdHJhY2VfY29uZmlnLnBi
emVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2lu
LiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X0NPTkZJR19GVFJBQ0VfRlRSQUNFX0NPTkZJR19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19Q
Uk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19GVFJBQ0VfRlRSQUNFX0NPTkZJR19QUk9UT19I
XworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdl
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90
b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7Citu
YW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgRnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZp
ZzsKKworY2xhc3MgRnRyYWNlQ29uZmlnX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5
cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMTIsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBGdHJhY2VDb25maWdfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgRnRyYWNlQ29uZmlnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRnRyYWNlQ29uZmln
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Z0cmFjZV9ldmVudHMo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gZnRyYWNlX2V2ZW50cygp
IGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPigxKTsg
fQorICBib29sIGhhc19hdHJhY2VfY2F0ZWdvcmllcygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96
ZXJvOjpDb25zdENoYXJzPiBhdHJhY2VfY2F0ZWdvcmllcygpIGNvbnN0IHsgcmV0dXJuIEdldFJl
cGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPigyKTsgfQorICBib29sIGhhc19hdHJhY2Vf
YXBwcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiBhdHJhY2VfYXBw
cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPigz
KTsgfQorICBib29sIGhhc19idWZmZXJfc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYnVmZmVyX3NpemVfa2IoKSBjb25zdCB7IHJldHVybiBh
dDwxMD4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19kcmFpbl9wZXJpb2RfbXMoKSBjb25z
dCB7IHJldHVybiBhdDwxMT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGRyYWluX3BlcmlvZF9t
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2Nv
bXBhY3Rfc2NoZWQoKSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIGNvbXBhY3Rfc2NoZWQoKSBjb25zdCB7IHJldHVybiBhdDwxMj4o
KS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBGdHJhY2VDb25maWcgOiBwdWJsaWMgOjpwcm90
b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEZ0cmFjZUNvbmZp
Z19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0Z0cmFjZUV2ZW50c0ZpZWxkTnVt
YmVyID0gMSwKKyAgICBrQXRyYWNlQ2F0ZWdvcmllc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrQXRy
YWNlQXBwc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrQnVmZmVyU2l6ZUtiRmllbGROdW1iZXIgPSAx
MCwKKyAgICBrRHJhaW5QZXJpb2RNc0ZpZWxkTnVtYmVyID0gMTEsCisgICAga0NvbXBhY3RTY2hl
ZEZpZWxkTnVtYmVyID0gMTIsCisgIH07CisgIHVzaW5nIENvbXBhY3RTY2hlZENvbmZpZyA9IDo6
cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpGdHJhY2VDb25maWdfQ29tcGFjdFNjaGVkQ29uZmln
OworICB2b2lkIGFkZF9mdHJhY2VfZXZlbnRzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIGFkZF9mdHJhY2VfZXZlbnRzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBhZGRfYXRyYWNlX2Nh
dGVnb3JpZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwg
dmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2F0cmFjZV9jYXRl
Z29yaWVzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
MiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBhZGRfYXRyYWNlX2FwcHMoY29uc3Qgc3RkOjpz
dHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5z
aXplKCkpOworICB9CisgIHZvaWQgYWRkX2F0cmFjZV9hcHBzKGNvbnN0IGNoYXIqIGRhdGEsIHNp
emVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfYnVmZmVyX3NpemVfa2IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MTAsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kcmFpbl9wZXJpb2RfbXModWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IEZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWc+IFQqIHNldF9jb21wYWN0
X3NjaGVkKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTIpOworICB9CisK
K307CisKK2NsYXNzIEZ0cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWdfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEZ0
cmFjZUNvbmZpZ19Db21wYWN0U2NoZWRDb25maWdfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgRnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZ19EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEZ0cmFjZUNvbmZp
Z19Db21wYWN0U2NoZWRDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBib29s
IGVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2Jvb2woKTsgfQorfTsKKworY2xh
c3MgRnRyYWNlQ29uZmlnX0NvbXBhY3RTY2hlZENvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRnRyYWNlQ29uZmlnX0NvbXBh
Y3RTY2hlZENvbmZpZ19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0VuYWJsZWRG
aWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X2VuYWJsZWQoYm9vbCB2YWx1ZSkgewor
ICAgIEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFj
ZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUg
Z3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL2NvbmZpZy9ncHUvZ3B1X2NvdW50ZXJfY29uZmlnLnBiemVyby5oCisvLyBBdXRvZ2VuZXJh
dGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lm
bmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19HUFVfR1BVX0NPVU5U
RVJfQ09ORklHX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fQ09ORklHX0dQVV9HUFVfQ09VTlRFUl9DT05GSUdfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0
ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBl
YXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7
CisKKworY2xhc3MgR3B1Q291bnRlckNvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBHcHVDb3VudGVyQ29uZmlnX0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEdwdUNvdW50ZXJDb25maWdfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBH
cHVDb3VudGVyQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X2NvdW50ZXJfcGVyaW9kX25zKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IGNvdW50ZXJfcGVyaW9kX25zKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191
aW50NjQoKTsgfQorICBib29sIGhhc19jb3VudGVyX2lkcygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPHVpbnQz
Ml90PiBjb3VudGVyX2lkcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPHVpbnQzMl90Pigy
KTsgfQorICBib29sIGhhc19pbnN0cnVtZW50ZWRfc2FtcGxpbmcoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBpbnN0cnVtZW50ZWRfc2FtcGxpbmcoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19maXhfZ3B1X2Nsb2NrKCkg
Y29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGJvb2wgZml4X2dwdV9jbG9jaygp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfYm9vbCgpOyB9Cit9OworCitjbGFzcyBHcHVDb3Vu
dGVyQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBHcHVDb3VudGVyQ29uZmlnX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrQ291bnRlclBlcmlvZE5zRmllbGROdW1iZXIgPSAxLAorICAgIGtDb3VudGVySWRz
RmllbGROdW1iZXIgPSAyLAorICAgIGtJbnN0cnVtZW50ZWRTYW1wbGluZ0ZpZWxkTnVtYmVyID0g
MywKKyAgICBrRml4R3B1Q2xvY2tGaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2Nv
dW50ZXJfcGVyaW9kX25zKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIGFkZF9jb3VudGVyX2lkcyh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5zdHJ1bWVudGVkX3Nh
bXBsaW5nKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDMsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9maXhfZ3B1X2Nsb2NrKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvZ3B1
L3Z1bGthbl9tZW1vcnlfY29uZmlnLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQ
cm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19HUFVfVlVMS0FOX01FTU9SWV9DT05GSUdf
UFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdf
R1BVX1ZVTEtBTl9NRU1PUllfQ09ORklHX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4K
KyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmll
bGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCisKK2Ns
YXNzIFZ1bGthbk1lbW9yeUNvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVnVsa2FuTWVtb3J5Q29uZmlnX0RlY29k
ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rlcihk
YXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFZ1bGthbk1lbW9yeUNvbmZpZ19EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFZ1
bGthbk1lbW9yeUNvbmZpZ19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhh
c190cmFja19kcml2ZXJfbWVtb3J5X3VzYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIGJvb2wgdHJhY2tfZHJpdmVyX21lbW9yeV91c2FnZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3RyYWNrX2RldmljZV9tZW1vcnlfdXNh
Z2UoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCB0cmFja19kZXZp
Y2VfbWVtb3J5X3VzYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19ib29sKCk7IH0KK307
CisKK2NsYXNzIFZ1bGthbk1lbW9yeUNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVnVsa2FuTWVtb3J5Q29uZmlnX0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVHJhY2tEcml2ZXJNZW1vcnlVc2FnZUZpZWxk
TnVtYmVyID0gMSwKKyAgICBrVHJhY2tEZXZpY2VNZW1vcnlVc2FnZUZpZWxkTnVtYmVyID0gMiwK
KyAgfTsKKyAgdm9pZCBzZXRfdHJhY2tfZHJpdmVyX21lbW9yeV91c2FnZShib29sIHZhbHVlKSB7
CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdHJhY2tf
ZGV2aWNlX21lbW9yeV91c2FnZShib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgy
LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9
IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL2lub2RlX2ZpbGUv
aW5vZGVfZmlsZV9jb25maWcucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3Rv
WmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX0lOT0RFX0ZJTEVfSU5PREVfRklMRV9DT05GSUdf
UFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdf
SU5PREVfRklMRV9JTk9ERV9GSUxFX0NPTkZJR19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVm
Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVk
X2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKwor
Y2xhc3MgSW5vZGVGaWxlQ29uZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnk7CisKK2NsYXNzIElu
b2RlRmlsZUNvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki90cnVlPiB7CisgcHVibGljOgorICBJbm9kZUZpbGVDb25maWdfRGVjb2Rlcihjb25zdCB1aW50
OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30K
KyAgZXhwbGljaXQgSW5vZGVGaWxlQ29uZmlnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSW5vZGVGaWxlQ29uZmlnX0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3NjYW5faW50ZXJ2YWxfbXMo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgc2Nhbl9pbnRl
cnZhbF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfc2Nhbl9kZWxheV9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1
aW50MzJfdCBzY2FuX2RlbGF5X21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIo
KTsgfQorICBib29sIGhhc19zY2FuX2JhdGNoX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgc2Nhbl9iYXRjaF9zaXplKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19kb19ub3Rfc2NhbigpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBib29sIGRvX25vdF9zY2FuKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfc2Nhbl9tb3VudF9wb2ludHMo
KSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gc2Nhbl9tb3VudF9wb2lu
dHMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4o
NSk7IH0KKyAgYm9vbCBoYXNfbW91bnRfcG9pbnRfbWFwcGluZygpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBtb3VudF9wb2ludF9tYXBwaW5nKCkgY29uc3QgeyByZXR1
cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDYpOyB9Cit9OworCitjbGFz
cyBJbm9kZUZpbGVDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IElub2RlRmlsZUNvbmZpZ19EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga1NjYW5JbnRlcnZhbE1zRmllbGROdW1iZXIgPSAxLAorICAgIGtTY2Fu
RGVsYXlNc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2NhbkJhdGNoU2l6ZUZpZWxkTnVtYmVyID0g
MywKKyAgICBrRG9Ob3RTY2FuRmllbGROdW1iZXIgPSA0LAorICAgIGtTY2FuTW91bnRQb2ludHNG
aWVsZE51bWJlciA9IDUsCisgICAga01vdW50UG9pbnRNYXBwaW5nRmllbGROdW1iZXIgPSA2LAor
ICB9OworICB1c2luZyBNb3VudFBvaW50TWFwcGluZ0VudHJ5ID0gOjpwZXJmZXR0bzo6cHJvdG9z
OjpwYnplcm86Oklub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5OworICB2b2lk
IHNldF9zY2FuX2ludGVydmFsX21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zY2FuX2RlbGF5X21zKHVpbnQzMl90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zY2FuX2Jh
dGNoX3NpemUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2RvX25vdF9zY2FuKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9zY2FuX21vdW50X3BvaW50cyhjb25z
dCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCB2YWx1ZS5kYXRhKCks
IHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBhZGRfc2Nhbl9tb3VudF9wb2ludHMoY29uc3Qg
Y2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCBkYXRhLCBzaXpl
KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElub2RlRmlsZUNvbmZpZ19Nb3VudFBv
aW50TWFwcGluZ0VudHJ5PiBUKiBhZGRfbW91bnRfcG9pbnRfbWFwcGluZygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDYpOworICB9CisKK307CisKK2NsYXNzIElub2RlRmls
ZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIElub2RlRmlsZUNvbmZpZ19N
b3VudFBvaW50TWFwcGluZ0VudHJ5X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IElub2Rl
RmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSW5vZGVGaWxlQ29u
ZmlnX01vdW50UG9pbnRNYXBwaW5nRW50cnlfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfbW91bnRwb2ludCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBtb3VudHBvaW50KCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19zY2FuX3Jvb3RzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRl
cmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IHNjYW5fcm9vdHMoKSBjb25zdCB7IHJldHVy
biBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMik7IH0KK307CisKK2NsYXNz
IElub2RlRmlsZUNvbmZpZ19Nb3VudFBvaW50TWFwcGluZ0VudHJ5IDogcHVibGljIDo6cHJvdG96
ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJbm9kZUZpbGVDb25m
aWdfTW91bnRQb2ludE1hcHBpbmdFbnRyeV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga01vdW50cG9pbnRGaWVsZE51bWJlciA9IDEsCisgICAga1NjYW5Sb290c0ZpZWxkTnVtYmVy
ID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfbW91bnRwb2ludChjb25zdCBzdGQ6OnN0cmluZyYgdmFs
dWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cisg
IH0KKyAgdm9pZCBzZXRfbW91bnRwb2ludChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgYWRkX3NjYW5f
cm9vdHMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX3NjYW5fcm9vdHMoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBz
aXplKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8g
TmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvcG93ZXIvYW5kcm9pZF9w
b3dlcl9jb25maWcucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBj
b21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fQ09ORklHX1BPV0VSX0FORFJPSURfUE9XRVJfQ09ORklHX1BST1RPX0hf
CisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1BPV0VSX0FO
RFJPSURfUE9XRVJfQ09ORklHX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNs
dWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0
byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitlbnVtIEFuZHJv
aWRQb3dlckNvbmZpZ19CYXR0ZXJ5Q291bnRlcnMgOiBpbnQzMl90OworCitlbnVtIEFuZHJvaWRQ
b3dlckNvbmZpZ19CYXR0ZXJ5Q291bnRlcnMgOiBpbnQzMl90IHsKKyAgQW5kcm9pZFBvd2VyQ29u
ZmlnX0JhdHRlcnlDb3VudGVyc19CQVRURVJZX0NPVU5URVJfVU5TUEVDSUZJRUQgPSAwLAorICBB
bmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRFUllfQ09VTlRFUl9DSEFSR0Ug
PSAxLAorICBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRFUllfQ09VTlRF
Ul9DQVBBQ0lUWV9QRVJDRU5UID0gMiwKKyAgQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3Vu
dGVyc19CQVRURVJZX0NPVU5URVJfQ1VSUkVOVCA9IDMsCisgIEFuZHJvaWRQb3dlckNvbmZpZ19C
YXR0ZXJ5Q291bnRlcnNfQkFUVEVSWV9DT1VOVEVSX0NVUlJFTlRfQVZHID0gNCwKK307CisKK2Nv
bnN0IEFuZHJvaWRQb3dlckNvbmZpZ19CYXR0ZXJ5Q291bnRlcnMgQW5kcm9pZFBvd2VyQ29uZmln
X0JhdHRlcnlDb3VudGVyc19NSU4gPSBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJz
X0JBVFRFUllfQ09VTlRFUl9VTlNQRUNJRklFRDsKK2NvbnN0IEFuZHJvaWRQb3dlckNvbmZpZ19C
YXR0ZXJ5Q291bnRlcnMgQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlDb3VudGVyc19NQVggPSBB
bmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRFUllfQ09VTlRFUl9DVVJSRU5U
X0FWRzsKKworY2xhc3MgQW5kcm9pZFBvd2VyQ29uZmlnX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIEFuZHJvaWRQb3dlckNv
bmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBBbmRyb2lkUG93ZXJDb25maWdfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBBbmRyb2lkUG93ZXJDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfYmF0dGVyeV9wb2xsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIHVpbnQzMl90IGJhdHRlcnlfcG9sbF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfYmF0dGVyeV9jb3VudGVycygpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0
ZXJhdG9yPGludDMyX3Q+IGJhdHRlcnlfY291bnRlcnMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBl
YXRlZDxpbnQzMl90PigyKTsgfQorICBib29sIGhhc19jb2xsZWN0X3Bvd2VyX3JhaWxzKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGJvb2wgY29sbGVjdF9wb3dlcl9yYWls
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfYm9vbCgpOyB9Cit9OworCitjbGFzcyBBbmRy
b2lkUG93ZXJDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEFuZHJvaWRQb3dlckNvbmZpZ19EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga0JhdHRlcnlQb2xsTXNGaWVsZE51bWJlciA9IDEsCisgICAga0JhdHRl
cnlDb3VudGVyc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ29sbGVjdFBvd2VyUmFpbHNGaWVsZE51
bWJlciA9IDMsCisgIH07CisgIHVzaW5nIEJhdHRlcnlDb3VudGVycyA9IDo6cGVyZmV0dG86OnBy
b3Rvczo6cGJ6ZXJvOjpBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzOworICBzdGF0
aWMgY29uc3QgQmF0dGVyeUNvdW50ZXJzIEJBVFRFUllfQ09VTlRFUl9VTlNQRUNJRklFRCA9IEFu
ZHJvaWRQb3dlckNvbmZpZ19CYXR0ZXJ5Q291bnRlcnNfQkFUVEVSWV9DT1VOVEVSX1VOU1BFQ0lG
SUVEOworICBzdGF0aWMgY29uc3QgQmF0dGVyeUNvdW50ZXJzIEJBVFRFUllfQ09VTlRFUl9DSEFS
R0UgPSBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRFUllfQ09VTlRFUl9D
SEFSR0U7CisgIHN0YXRpYyBjb25zdCBCYXR0ZXJ5Q291bnRlcnMgQkFUVEVSWV9DT1VOVEVSX0NB
UEFDSVRZX1BFUkNFTlQgPSBBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzX0JBVFRF
UllfQ09VTlRFUl9DQVBBQ0lUWV9QRVJDRU5UOworICBzdGF0aWMgY29uc3QgQmF0dGVyeUNvdW50
ZXJzIEJBVFRFUllfQ09VTlRFUl9DVVJSRU5UID0gQW5kcm9pZFBvd2VyQ29uZmlnX0JhdHRlcnlD
b3VudGVyc19CQVRURVJZX0NPVU5URVJfQ1VSUkVOVDsKKyAgc3RhdGljIGNvbnN0IEJhdHRlcnlD
b3VudGVycyBCQVRURVJZX0NPVU5URVJfQ1VSUkVOVF9BVkcgPSBBbmRyb2lkUG93ZXJDb25maWdf
QmF0dGVyeUNvdW50ZXJzX0JBVFRFUllfQ09VTlRFUl9DVVJSRU5UX0FWRzsKKyAgdm9pZCBzZXRf
YmF0dGVyeV9wb2xsX21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIGFkZF9iYXR0ZXJ5X2NvdW50ZXJzKDo6cGVyZmV0dG86OnByb3Rv
czo6cGJ6ZXJvOjpBbmRyb2lkUG93ZXJDb25maWdfQmF0dGVyeUNvdW50ZXJzIHZhbHVlKSB7Cisg
ICAgQXBwZW5kVGlueVZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29sbGVjdF9w
b3dlcl9yYWlscyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgzLCB2YWx1ZSk7
CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3Byb2Nlc3Nfc3RhdHMvcHJvY2Vz
c19zdGF0c19jb25maWcucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVy
byBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1BST0NFU1NfU1RBVFNfUFJPQ0VTU19TVEFUU19DT05G
SUdfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05G
SUdfUFJPQ0VTU19TVEFUU19QUk9DRVNTX1NUQVRTX0NPTkZJR19QUk9UT19IXworCisjaW5jbHVk
ZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2Vk
X3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6
ZXJvIHsKKworZW51bSBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzIDogaW50MzJfdDsKKworZW51
bSBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzIDogaW50MzJfdCB7CisgIFByb2Nlc3NTdGF0c0Nv
bmZpZ19RdWlya3NfUVVJUktTX1VOU1BFQ0lGSUVEID0gMCwKKyAgUHJvY2Vzc1N0YXRzQ29uZmln
X1F1aXJrc19ESVNBQkxFX0lOSVRJQUxfRFVNUCA9IDEsCisgIFByb2Nlc3NTdGF0c0NvbmZpZ19R
dWlya3NfRElTQUJMRV9PTl9ERU1BTkQgPSAyLAorfTsKKworY29uc3QgUHJvY2Vzc1N0YXRzQ29u
ZmlnX1F1aXJrcyBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzX01JTiA9IFByb2Nlc3NTdGF0c0Nv
bmZpZ19RdWlya3NfUVVJUktTX1VOU1BFQ0lGSUVEOworY29uc3QgUHJvY2Vzc1N0YXRzQ29uZmln
X1F1aXJrcyBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzX01BWCA9IFByb2Nlc3NTdGF0c0NvbmZp
Z19RdWlya3NfRElTQUJMRV9PTl9ERU1BTkQ7CisKK2NsYXNzIFByb2Nlc3NTdGF0c0NvbmZpZ19E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzgsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVi
bGljOgorICBQcm9jZXNzU3RhdHNDb25maWdfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
UHJvY2Vzc1N0YXRzQ29uZmlnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgUHJvY2Vzc1N0YXRzQ29uZmlnX0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3F1aXJrcygpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9y
PGludDMyX3Q+IHF1aXJrcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPGludDMyX3Q+KDEp
OyB9CisgIGJvb2wgaGFzX3NjYW5fYWxsX3Byb2Nlc3Nlc19vbl9zdGFydCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBib29sIHNjYW5fYWxsX3Byb2Nlc3Nlc19vbl9zdGFy
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3JlY29y
ZF90aHJlYWRfbmFtZXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgYm9v
bCByZWNvcmRfdGhyZWFkX25hbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19ib29sKCk7
IH0KKyAgYm9vbCBoYXNfcHJvY19zdGF0c19wb2xsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4o
KS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHByb2Nfc3RhdHNfcG9sbF9tcygpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcHJvY19zdGF0c19jYWNoZV90
dGxfbXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcHJv
Y19zdGF0c19jYWNoZV90dGxfbXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX3JlY29yZF90aHJlYWRfdGltZV9pbl9zdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICBib29sIHJlY29yZF90aHJlYWRfdGltZV9pbl9zdGF0
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3RocmVh
ZF90aW1lX2luX3N0YXRlX2NhY2hlX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgdGhyZWFkX3RpbWVfaW5fc3RhdGVfY2FjaGVfc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDg+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIFByb2Nlc3NTdGF0
c0NvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gUHJvY2Vzc1N0YXRzQ29uZmlnX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrUXVpcmtzRmllbGROdW1iZXIgPSAxLAorICAgIGtTY2FuQWxsUHJvY2Vzc2VzT25T
dGFydEZpZWxkTnVtYmVyID0gMiwKKyAgICBrUmVjb3JkVGhyZWFkTmFtZXNGaWVsZE51bWJlciA9
IDMsCisgICAga1Byb2NTdGF0c1BvbGxNc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrUHJvY1N0YXRz
Q2FjaGVUdGxNc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrUmVjb3JkVGhyZWFkVGltZUluU3RhdGVG
aWVsZE51bWJlciA9IDcsCisgICAga1RocmVhZFRpbWVJblN0YXRlQ2FjaGVTaXplRmllbGROdW1i
ZXIgPSA4LAorICB9OworICB1c2luZyBRdWlya3MgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVy
bzo6UHJvY2Vzc1N0YXRzQ29uZmlnX1F1aXJrczsKKyAgc3RhdGljIGNvbnN0IFF1aXJrcyBRVUlS
S1NfVU5TUEVDSUZJRUQgPSBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzX1FVSVJLU19VTlNQRUNJ
RklFRDsKKyAgc3RhdGljIGNvbnN0IFF1aXJrcyBESVNBQkxFX0lOSVRJQUxfRFVNUCA9IFByb2Nl
c3NTdGF0c0NvbmZpZ19RdWlya3NfRElTQUJMRV9JTklUSUFMX0RVTVA7CisgIHN0YXRpYyBjb25z
dCBRdWlya3MgRElTQUJMRV9PTl9ERU1BTkQgPSBQcm9jZXNzU3RhdHNDb25maWdfUXVpcmtzX0RJ
U0FCTEVfT05fREVNQU5EOworICB2b2lkIGFkZF9xdWlya3MoOjpwZXJmZXR0bzo6cHJvdG9zOjpw
Ynplcm86OlByb2Nlc3NTdGF0c0NvbmZpZ19RdWlya3MgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zY2FuX2FsbF9wcm9jZXNzZXNfb25f
c3RhcnQoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3JlY29yZF90aHJlYWRfbmFtZXMoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVu
ZFRpbnlWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Byb2Nfc3RhdHNfcG9sbF9t
cyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcHJvY19zdGF0c19jYWNoZV90dGxfbXModWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3JlY29yZF90aHJlYWRfdGlt
ZV9pbl9zdGF0ZShib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg3LCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfdGhyZWFkX3RpbWVfaW5fc3RhdGVfY2FjaGVfc2l6ZSh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8g
TmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8g
SW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90
b3MvcGVyZmV0dG8vY29uZmlnL3Byb2ZpbGluZy9oZWFwcHJvZmRfY29uZmlnLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19Q
Uk9GSUxJTkdfSEVBUFBST0ZEX0NPTkZJR19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9U
T1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19QUk9GSUxJTkdfSEVBUFBST0ZEX0NPTkZJR19QUk9U
T19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNz
YWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7
CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgSGVhcHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNE
dW1wQ29uZmlnOworCitjbGFzcyBIZWFwcHJvZmRDb25maWdfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yMCwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIEhlYXBwcm9mZENv
bmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBIZWFwcHJvZmRDb25maWdfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBIZWFwcHJvZmRDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3Qgc2FtcGxpbmdfaW50ZXJ2YWxfYnl0ZXMoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3Byb2Nlc3NfY21kbGluZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0
ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiBwcm9jZXNzX2NtZGxpbmUo
KSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMik7
IH0KKyAgYm9vbCBoYXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8dWludDY0X3Q+IHBpZCgpIGNvbnN0
IHsgcmV0dXJuIEdldFJlcGVhdGVkPHVpbnQ2NF90Pig0KTsgfQorICBib29sIGhhc19oZWFwcygp
IGNvbnN0IHsgcmV0dXJuIGF0PDIwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gaGVhcHMoKSBjb25zdCB7
IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMjApOyB9CisgIGJv
b2wgaGFzX2FsbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBib29sIGFs
bCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX21pbl9h
bm9ueW1vdXNfbWVtb3J5X2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8MTU+KCkudmFsaWQoKTsgfQor
ICB1aW50MzJfdCBtaW5fYW5vbnltb3VzX21lbW9yeV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDE1
PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX21heF9oZWFwcHJvZmRfbWVtb3J5X2tiKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtYXhfaGVhcHBy
b2ZkX21lbW9yeV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLmFzX3VpbnQzMigpOyB9Cisg
IGJvb2wgaGFzX21heF9oZWFwcHJvZmRfY3B1X3NlY3MoKSBjb25zdCB7IHJldHVybiBhdDwxNz4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG1heF9oZWFwcHJvZmRfY3B1X3NlY3MoKSBjb25zdCB7
IHJldHVybiBhdDwxNz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19za2lwX3N5bWJvbF9w
cmVmaXgoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gc2tpcF9zeW1i
b2xfcHJlZml4KCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0
Q2hhcnM+KDcpOyB9CisgIGJvb2wgaGFzX2NvbnRpbnVvdXNfZHVtcF9jb25maWcoKSBjb25zdCB7
IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY29u
dGludW91c19kdW1wX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19zaG1lbV9zaXplX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNobWVtX3NpemVfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBh
dDw4PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Jsb2NrX2NsaWVudCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICBib29sIGJsb2NrX2NsaWVudCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDk+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2Jsb2NrX2NsaWVudF90aW1l
b3V0X3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBi
bG9ja19jbGllbnRfdGltZW91dF91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE0PigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX25vX3N0YXJ0dXAoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52
YWxpZCgpOyB9CisgIGJvb2wgbm9fc3RhcnR1cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFz
X2Jvb2woKTsgfQorICBib29sIGhhc19ub19ydW5uaW5nKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+
KCkudmFsaWQoKTsgfQorICBib29sIG5vX3J1bm5pbmcoKSBjb25zdCB7IHJldHVybiBhdDwxMT4o
KS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfaWRsZV9hbGxvY2F0aW9ucygpIGNvbnN0IHsgcmV0
dXJuIGF0PDEyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBpZGxlX2FsbG9jYXRpb25zKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTI+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2R1bXBfYXRfbWF4KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQorICBib29sIGR1bXBfYXRfbWF4KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTM+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2Rpc2FibGVf
Zm9ya190ZWFyZG93bigpIGNvbnN0IHsgcmV0dXJuIGF0PDE4PigpLnZhbGlkKCk7IH0KKyAgYm9v
bCBkaXNhYmxlX2ZvcmtfdGVhcmRvd24oKSBjb25zdCB7IHJldHVybiBhdDwxOD4oKS5hc19ib29s
KCk7IH0KKyAgYm9vbCBoYXNfZGlzYWJsZV92Zm9ya19kZXRlY3Rpb24oKSBjb25zdCB7IHJldHVy
biBhdDwxOT4oKS52YWxpZCgpOyB9CisgIGJvb2wgZGlzYWJsZV92Zm9ya19kZXRlY3Rpb24oKSBj
b25zdCB7IHJldHVybiBhdDwxOT4oKS5hc19ib29sKCk7IH0KK307CisKK2NsYXNzIEhlYXBwcm9m
ZENvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gSGVhcHByb2ZkQ29uZmlnX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrU2FtcGxpbmdJbnRlcnZhbEJ5dGVzRmllbGROdW1iZXIgPSAxLAorICAgIGtQcm9jZXNz
Q21kbGluZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGlkRmllbGROdW1iZXIgPSA0LAorICAgIGtI
ZWFwc0ZpZWxkTnVtYmVyID0gMjAsCisgICAga0FsbEZpZWxkTnVtYmVyID0gNSwKKyAgICBrTWlu
QW5vbnltb3VzTWVtb3J5S2JGaWVsZE51bWJlciA9IDE1LAorICAgIGtNYXhIZWFwcHJvZmRNZW1v
cnlLYkZpZWxkTnVtYmVyID0gMTYsCisgICAga01heEhlYXBwcm9mZENwdVNlY3NGaWVsZE51bWJl
ciA9IDE3LAorICAgIGtTa2lwU3ltYm9sUHJlZml4RmllbGROdW1iZXIgPSA3LAorICAgIGtDb250
aW51b3VzRHVtcENvbmZpZ0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrU2htZW1TaXplQnl0ZXNGaWVs
ZE51bWJlciA9IDgsCisgICAga0Jsb2NrQ2xpZW50RmllbGROdW1iZXIgPSA5LAorICAgIGtCbG9j
a0NsaWVudFRpbWVvdXRVc0ZpZWxkTnVtYmVyID0gMTQsCisgICAga05vU3RhcnR1cEZpZWxkTnVt
YmVyID0gMTAsCisgICAga05vUnVubmluZ0ZpZWxkTnVtYmVyID0gMTEsCisgICAga0lkbGVBbGxv
Y2F0aW9uc0ZpZWxkTnVtYmVyID0gMTIsCisgICAga0R1bXBBdE1heEZpZWxkTnVtYmVyID0gMTMs
CisgICAga0Rpc2FibGVGb3JrVGVhcmRvd25GaWVsZE51bWJlciA9IDE4LAorICAgIGtEaXNhYmxl
VmZvcmtEZXRlY3Rpb25GaWVsZE51bWJlciA9IDE5LAorICB9OworICB1c2luZyBDb250aW51b3Vz
RHVtcENvbmZpZyA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpIZWFwcHJvZmRDb25maWdf
Q29udGludW91c0R1bXBDb25maWc7CisgIHZvaWQgc2V0X3NhbXBsaW5nX2ludGVydmFsX2J5dGVz
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2
b2lkIGFkZF9wcm9jZXNzX2NtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAg
QXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQg
YWRkX3Byb2Nlc3NfY21kbGluZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgYWRkX3BpZCh1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRf
aGVhcHMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMjAsIHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9oZWFwcyhjb25zdCBj
aGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIwLCBkYXRhLCBzaXpl
KTsKKyAgfQorICB2b2lkIHNldF9hbGwoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJ
bnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21pbl9hbm9ueW1vdXNfbWVtb3J5X2tiKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE1LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbWF4X2hlYXBwcm9mZF9tZW1vcnlfa2IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMTYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9tYXhfaGVhcHByb2ZkX2NwdV9z
ZWNzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE3LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBhZGRfc2tpcF9zeW1ib2xfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDcsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQor
ICB2b2lkIGFkZF9za2lwX3N5bWJvbF9wcmVmaXgoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNp
emUpIHsKKyAgICBBcHBlbmRCeXRlcyg3LCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZz4gVCogc2V0
X2NvbnRpbnVvdXNfZHVtcF9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPig2KTsKKyAgfQorCisgIHZvaWQgc2V0X3NobWVtX3NpemVfYnl0ZXModWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Jsb2Nr
X2NsaWVudChib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg5LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfYmxvY2tfY2xpZW50X3RpbWVvdXRfdXModWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMTQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ub19zdGFydHVw
KGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEwLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfbm9fcnVubmluZyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgx
MSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lkbGVfYWxsb2NhdGlvbnMoYm9vbCB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoMTIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kdW1w
X2F0X21heChib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2Rpc2FibGVfZm9ya190ZWFyZG93bihib29sIHZhbHVlKSB7CisgICAg
QXBwZW5kVGlueVZhckludCgxOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Rpc2FibGVfdmZv
cmtfZGV0ZWN0aW9uKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDE5LCB2YWx1
ZSk7CisgIH0KK307CisKK2NsYXNzIEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZp
Z19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgSGVhcHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnX0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZp
Z19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9
CisgIGV4cGxpY2l0IEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZ19EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kdW1wX3BoYXNlX21zKCkgY29uc3Qg
eyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGR1bXBfcGhhc2VfbXMoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2R1bXBfaW50
ZXJ2YWxfbXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
ZHVtcF9pbnRlcnZhbF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0K
K307CisKK2NsYXNzIEhlYXBwcm9mZENvbmZpZ19Db250aW51b3VzRHVtcENvbmZpZyA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSGVh
cHByb2ZkQ29uZmlnX0NvbnRpbnVvdXNEdW1wQ29uZmlnX0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrRHVtcFBoYXNlTXNGaWVsZE51bWJlciA9IDUsCisgICAga0R1bXBJbnRlcnZh
bE1zRmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNldF9kdW1wX3BoYXNlX21zKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9kdW1wX2ludGVydmFsX21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYs
IHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30g
Ly8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcvcHJvZmlsaW5nL2ph
dmFfaHByb2ZfY29uZmlnLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1pl
cm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9U
T1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19QUk9GSUxJTkdfSkFWQV9IUFJPRl9DT05GSUdfUFJP
VE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfUFJP
RklMSU5HX0pBVkFfSFBST0ZfQ09ORklHX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4K
KyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmll
bGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFz
cyBKYXZhSHByb2ZDb25maWdfQ29udGludW91c0R1bXBDb25maWc7CisKK2NsYXNzIEphdmFIcHJv
ZkNvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVl
PiB7CisgcHVibGljOgorICBKYXZhSHByb2ZDb25maWdfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgSmF2YUhwcm9mQ29uZmlnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSmF2YUhwcm9mQ29uZmlnX0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3Byb2Nlc3NfY21kbGluZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVs
ZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiBwcm9jZXNzX2NtZGxpbmUoKSBjb25z
dCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMSk7IH0KKyAg
Ym9vbCBoYXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8dWludDY0X3Q+IHBpZCgpIGNvbnN0IHsgcmV0
dXJuIEdldFJlcGVhdGVkPHVpbnQ2NF90PigyKTsgfQorICBib29sIGhhc19jb250aW51b3VzX2R1
bXBfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzIGNvbnRpbnVvdXNfZHVtcF9jb25maWcoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWluX2Fub255bW91c19tZW1vcnlfa2Io
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbWluX2Fub255
bW91c19tZW1vcnlfa2IoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9Cisg
IGJvb2wgaGFzX2R1bXBfc21hcHMoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0K
KyAgYm9vbCBkdW1wX3NtYXBzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19ib29sKCk7IH0K
K307CisKK2NsYXNzIEphdmFIcHJvZkNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSmF2YUhwcm9mQ29uZmlnX0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrUHJvY2Vzc0NtZGxpbmVGaWVsZE51bWJlciA9IDEs
CisgICAga1BpZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ29udGludW91c0R1bXBDb25maWdGaWVs
ZE51bWJlciA9IDMsCisgICAga01pbkFub255bW91c01lbW9yeUtiRmllbGROdW1iZXIgPSA0LAor
ICAgIGtEdW1wU21hcHNGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHVzaW5nIENvbnRpbnVvdXNE
dW1wQ29uZmlnID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkphdmFIcHJvZkNvbmZpZ19D
b250aW51b3VzRHVtcENvbmZpZzsKKyAgdm9pZCBhZGRfcHJvY2Vzc19jbWRsaW5lKGNvbnN0IHN0
ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFs
dWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9wcm9jZXNzX2NtZGxpbmUoY29uc3QgY2hhciog
ZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAg
fQorICB2b2lkIGFkZF9waWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSmF2YUhwcm9mQ29uZmlnX0Nv
bnRpbnVvdXNEdW1wQ29uZmlnPiBUKiBzZXRfY29udGludW91c19kdW1wX2NvbmZpZygpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMpOworICB9CisKKyAgdm9pZCBzZXRfbWlu
X2Fub255bW91c19tZW1vcnlfa2IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2R1bXBfc21hcHMoYm9vbCB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBKYXZhSHByb2ZD
b25maWdfQ29udGludW91c0R1bXBDb25maWdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEphdmFIcHJvZkNvbmZpZ19Db250
aW51b3VzRHVtcENvbmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4p
IDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBKYXZhSHByb2ZD
b25maWdfQ29udGludW91c0R1bXBDb25maWdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJh
dy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBKYXZhSHByb2ZDb25maWdfQ29u
dGludW91c0R1bXBDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfZHVtcF9waGFzZV9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1
aW50MzJfdCBkdW1wX3BoYXNlX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIo
KTsgfQorICBib29sIGhhc19kdW1wX2ludGVydmFsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGR1bXBfaW50ZXJ2YWxfbXMoKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBKYXZhSHByb2ZDb25maWdfQ29u
dGludW91c0R1bXBDb25maWcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEphdmFIcHJvZkNvbmZpZ19Db250aW51b3VzRHVtcENvbmZp
Z19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0R1bXBQaGFzZU1zRmllbGROdW1i
ZXIgPSAxLAorICAgIGtEdW1wSW50ZXJ2YWxNc0ZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9p
ZCBzZXRfZHVtcF9waGFzZV9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgx
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHVtcF9pbnRlcnZhbF9tcyh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNw
YWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVk
ZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVy
ZmV0dG8vY29uZmlnL3Byb2ZpbGluZy9wZXJmX2V2ZW50X2NvbmZpZy5wYnplcm8uaAorLy8gQXV0
b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQu
CisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfUFJPRklM
SU5HX1BFUkZfRVZFTlRfQ09ORklHX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fQ09ORklHX1BST0ZJTElOR19QRVJGX0VWRU5UX0NPTkZJR19QUk9UT19I
XworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdl
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90
b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7Citu
YW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBQZXJmRXZlbnRDb25maWdfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xMCwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFBl
cmZFdmVudENvbmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBQZXJmRXZlbnRDb25m
aWdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBQZXJmRXZlbnRDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkg
e30KKyAgYm9vbCBoYXNfYWxsX2NwdXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgYm9vbCBhbGxfY3B1cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfYm9vbCgpOyB9
CisgIGJvb2wgaGFzX3NhbXBsaW5nX2ZyZXF1ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBzYW1wbGluZ19mcmVxdWVuY3koKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3JpbmdfYnVmZmVyX3JlYWRfcGVy
aW9kX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHJp
bmdfYnVmZmVyX3JlYWRfcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50
MzIoKTsgfQorICBib29sIGhhc19yaW5nX2J1ZmZlcl9wYWdlcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCByaW5nX2J1ZmZlcl9wYWdlcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGFyZ2V0X3BpZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRG
aWVsZEl0ZXJhdG9yPGludDMyX3Q+IHRhcmdldF9waWQoKSBjb25zdCB7IHJldHVybiBHZXRSZXBl
YXRlZDxpbnQzMl90Pig0KTsgfQorICBib29sIGhhc190YXJnZXRfY21kbGluZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0
ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiB0YXJnZXRfY21kbGluZSgpIGNvbnN0IHsg
cmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPig1KTsgfQorICBib29s
IGhhc19leGNsdWRlX3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPGludDMyX3Q+IGV4Y2x1ZGVfcGlkKCkg
Y29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8aW50MzJfdD4oNik7IH0KKyAgYm9vbCBoYXNfZXhj
bHVkZV9jbWRsaW5lKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IGV4
Y2x1ZGVfY21kbGluZSgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpD
b25zdENoYXJzPig3KTsgfQorICBib29sIGhhc19yZW1vdGVfZGVzY3JpcHRvcl90aW1lb3V0X21z
KCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHJlbW90ZV9k
ZXNjcmlwdG9yX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX3Vud2luZF9zdGF0ZV9jbGVhcl9wZXJpb2RfbXMoKSBjb25zdCB7IHJl
dHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHVud2luZF9zdGF0ZV9jbGVhcl9w
ZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS5hc191aW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgUGVyZkV2ZW50Q29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQZXJmRXZlbnRDb25maWdfRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtBbGxDcHVzRmllbGROdW1iZXIgPSAxLAorICAgIGtTYW1wbGlu
Z0ZyZXF1ZW5jeUZpZWxkTnVtYmVyID0gMiwKKyAgICBrUmluZ0J1ZmZlclJlYWRQZXJpb2RNc0Zp
ZWxkTnVtYmVyID0gOCwKKyAgICBrUmluZ0J1ZmZlclBhZ2VzRmllbGROdW1iZXIgPSAzLAorICAg
IGtUYXJnZXRQaWRGaWVsZE51bWJlciA9IDQsCisgICAga1RhcmdldENtZGxpbmVGaWVsZE51bWJl
ciA9IDUsCisgICAga0V4Y2x1ZGVQaWRGaWVsZE51bWJlciA9IDYsCisgICAga0V4Y2x1ZGVDbWRs
aW5lRmllbGROdW1iZXIgPSA3LAorICAgIGtSZW1vdGVEZXNjcmlwdG9yVGltZW91dE1zRmllbGRO
dW1iZXIgPSA5LAorICAgIGtVbndpbmRTdGF0ZUNsZWFyUGVyaW9kTXNGaWVsZE51bWJlciA9IDEw
LAorICB9OworICB2b2lkIHNldF9hbGxfY3B1cyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlu
eVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2FtcGxpbmdfZnJlcXVlbmN5KHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9yaW5nX2J1ZmZlcl9yZWFkX3BlcmlvZF9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmluZ19idWZmZXJfcGFnZXMo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZv
aWQgYWRkX3RhcmdldF9waWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfdGFyZ2V0X2NtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgYWRkX3RhcmdldF9jbWRsaW5lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVf
dCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBh
ZGRfZXhjbHVkZV9waWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBhZGRfZXhjbHVkZV9jbWRsaW5lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2
YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDcsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsK
KyAgfQorICB2b2lkIGFkZF9leGNsdWRlX2NtZGxpbmUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90
IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg3LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNl
dF9yZW1vdGVfZGVzY3JpcHRvcl90aW1lb3V0X21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91bndpbmRfc3RhdGVfY2xlYXJf
cGVyaW9kX21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEwLCB2YWx1ZSk7
CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vY29uZmlnL3N5c19zdGF0cy9zeXNfc3RhdHNf
Y29uZmlnLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGls
ZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9T
X1BFUkZFVFRPX0NPTkZJR19TWVNfU1RBVFNfU1lTX1NUQVRTX0NPTkZJR19QUk9UT19IXworI2Rl
ZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19TWVNfU1RBVFNfU1lT
X1NUQVRTX0NPTkZJR19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8
c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3By
b3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
bmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworZW51bSBNZW1pbmZvQ291
bnRlcnMgOiBpbnQzMl90OworZW51bSBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnMgOiBpbnQz
Ml90OworZW51bSBWbXN0YXRDb3VudGVycyA6IGludDMyX3Q7CisKK2VudW0gU3lzU3RhdHNDb25m
aWdfU3RhdENvdW50ZXJzIDogaW50MzJfdCB7CisgIFN5c1N0YXRzQ29uZmlnX1N0YXRDb3VudGVy
c19TVEFUX1VOU1BFQ0lGSUVEID0gMCwKKyAgU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzX1NU
QVRfQ1BVX1RJTUVTID0gMSwKKyAgU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzX1NUQVRfSVJR
X0NPVU5UUyA9IDIsCisgIFN5c1N0YXRzQ29uZmlnX1N0YXRDb3VudGVyc19TVEFUX1NPRlRJUlFf
Q09VTlRTID0gMywKKyAgU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzX1NUQVRfRk9SS19DT1VO
VCA9IDQsCit9OworCitjb25zdCBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnMgU3lzU3RhdHND
b25maWdfU3RhdENvdW50ZXJzX01JTiA9IFN5c1N0YXRzQ29uZmlnX1N0YXRDb3VudGVyc19TVEFU
X1VOU1BFQ0lGSUVEOworY29uc3QgU3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzIFN5c1N0YXRz
Q29uZmlnX1N0YXRDb3VudGVyc19NQVggPSBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnNfU1RB
VF9GT1JLX0NPVU5UOworCitjbGFzcyBTeXNTdGF0c0NvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6
cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05P
TlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBTeXNTdGF0c0Nv
bmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBTeXNTdGF0c0NvbmZpZ19EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IFN5c1N0YXRzQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX21lbWluZm9fcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9
CisgIHVpbnQzMl90IG1lbWluZm9fcGVyaW9kX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50MzIoKTsgfQorICBib29sIGhhc19tZW1pbmZvX2NvdW50ZXJzKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0
b3I8aW50MzJfdD4gbWVtaW5mb19jb3VudGVycygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVk
PGludDMyX3Q+KDIpOyB9CisgIGJvb2wgaGFzX3Ztc3RhdF9wZXJpb2RfbXMoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgdm1zdGF0X3BlcmlvZF9tcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdm1zdGF0X2Nv
dW50ZXJzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8aW50MzJfdD4gdm1zdGF0X2NvdW50ZXJzKCkgY29uc3Qg
eyByZXR1cm4gR2V0UmVwZWF0ZWQ8aW50MzJfdD4oNCk7IH0KKyAgYm9vbCBoYXNfc3RhdF9wZXJp
b2RfbXMoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgc3Rh
dF9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJv
b2wgaGFzX3N0YXRfY291bnRlcnMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjxpbnQzMl90PiBzdGF0X2NvdW50
ZXJzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8aW50MzJfdD4oNik7IH0KK307CisKK2Ns
YXNzIFN5c1N0YXRzQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBTeXNTdGF0c0NvbmZpZ19EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga01lbWluZm9QZXJpb2RNc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrTWVt
aW5mb0NvdW50ZXJzRmllbGROdW1iZXIgPSAyLAorICAgIGtWbXN0YXRQZXJpb2RNc0ZpZWxkTnVt
YmVyID0gMywKKyAgICBrVm1zdGF0Q291bnRlcnNGaWVsZE51bWJlciA9IDQsCisgICAga1N0YXRQ
ZXJpb2RNc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrU3RhdENvdW50ZXJzRmllbGROdW1iZXIgPSA2
LAorICB9OworICB1c2luZyBTdGF0Q291bnRlcnMgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVy
bzo6U3lzU3RhdHNDb25maWdfU3RhdENvdW50ZXJzOworICBzdGF0aWMgY29uc3QgU3RhdENvdW50
ZXJzIFNUQVRfVU5TUEVDSUZJRUQgPSBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnNfU1RBVF9V
TlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IFN0YXRDb3VudGVycyBTVEFUX0NQVV9USU1FUyA9
IFN5c1N0YXRzQ29uZmlnX1N0YXRDb3VudGVyc19TVEFUX0NQVV9USU1FUzsKKyAgc3RhdGljIGNv
bnN0IFN0YXRDb3VudGVycyBTVEFUX0lSUV9DT1VOVFMgPSBTeXNTdGF0c0NvbmZpZ19TdGF0Q291
bnRlcnNfU1RBVF9JUlFfQ09VTlRTOworICBzdGF0aWMgY29uc3QgU3RhdENvdW50ZXJzIFNUQVRf
U09GVElSUV9DT1VOVFMgPSBTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnNfU1RBVF9TT0ZUSVJR
X0NPVU5UUzsKKyAgc3RhdGljIGNvbnN0IFN0YXRDb3VudGVycyBTVEFUX0ZPUktfQ09VTlQgPSBT
eXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnNfU1RBVF9GT1JLX0NPVU5UOworICB2b2lkIHNldF9t
ZW1pbmZvX3BlcmlvZF9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfbWVtaW5mb19jb3VudGVycyg6OnBlcmZldHRvOjpwcm90
b3M6OnBiemVybzo6TWVtaW5mb0NvdW50ZXJzIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhcklu
dCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdm1zdGF0X3BlcmlvZF9tcyh1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfdm1z
dGF0X2NvdW50ZXJzKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpWbXN0YXRDb3VudGVycyB2
YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X3N0YXRfcGVyaW9kX21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZh
bHVlKTsKKyAgfQorICB2b2lkIGFkZF9zdGF0X2NvdW50ZXJzKDo6cGVyZmV0dG86OnByb3Rvczo6
cGJ6ZXJvOjpTeXNTdGF0c0NvbmZpZ19TdGF0Q291bnRlcnMgdmFsdWUpIHsKKyAgICBBcHBlbmRU
aW55VmFySW50KDYsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by9jb25maWcv
dHJhY2tfZXZlbnQvdHJhY2tfZXZlbnRfY29uZmlnLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVk
IGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRl
ZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19UUkFDS19FVkVOVF9UUkFD
S19FVkVOVF9DT05GSUdfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19DT05GSUdfVFJBQ0tfRVZFTlRfVFJBQ0tfRVZFTlRfQ09ORklHX1BST1RPX0hfCisK
KyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0
aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVz
cGFjZSBwYnplcm8geworCisKK2NsYXNzIFRyYWNrRXZlbnRDb25maWdfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgVHJhY2tF
dmVudENvbmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50Q29uZmln
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgVHJhY2tFdmVudENvbmZpZ19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19kaXNhYmxlZF9jYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90
b3plcm86OkNvbnN0Q2hhcnM+IGRpc2FibGVkX2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBH
ZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMSk7IH0KKyAgYm9vbCBoYXNfZW5h
YmxlZF9jYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+
IGVuYWJsZWRfY2F0ZWdvcmllcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdENoYXJzPigyKTsgfQorICBib29sIGhhc19kaXNhYmxlZF90YWdzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxk
SXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IGRpc2FibGVkX3RhZ3MoKSBjb25zdCB7
IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oMyk7IH0KKyAgYm9v
bCBoYXNfZW5hYmxlZF90YWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hh
cnM+IGVuYWJsZWRfdGFncygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJv
OjpDb25zdENoYXJzPig0KTsgfQorfTsKKworY2xhc3MgVHJhY2tFdmVudENvbmZpZyA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJh
Y2tFdmVudENvbmZpZ19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0Rpc2FibGVk
Q2F0ZWdvcmllc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrRW5hYmxlZENhdGVnb3JpZXNGaWVsZE51
bWJlciA9IDIsCisgICAga0Rpc2FibGVkVGFnc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrRW5hYmxl
ZFRhZ3NGaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgYWRkX2Rpc2FibGVkX2NhdGVnb3Jp
ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUu
ZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2Rpc2FibGVkX2NhdGVnb3Jp
ZXMoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBk
YXRhLCBzaXplKTsKKyAgfQorICB2b2lkIGFkZF9lbmFibGVkX2NhdGVnb3JpZXMoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1
ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2VuYWJsZWRfY2F0ZWdvcmllcyhjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOwor
ICB9CisgIHZvaWQgYWRkX2Rpc2FibGVkX3RhZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7
CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9Cisg
IHZvaWQgYWRkX2Rpc2FibGVkX3RhZ3MoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsK
KyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIGFkZF9lbmFibGVk
X3RhZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2VuYWJsZWRfdGFncyhj
b25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIGRhdGEs
IHNpemUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9jaHJvbWUvY2hyb21l
X2NvbmZpZy5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBp
bGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19DT05GSUdfQ0hST01FX0NIUk9NRV9DT05GSUdfUFJPVE9fSF8KKyNkZWZpbmUg
UEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19DT05GSUdfQ0hST01FX0NIUk9NRV9DT05G
SUdfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVy
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBw
cm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgQ2hyb21lQ29uZmlnX0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBDaHJvbWVDb25maWdfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2hyb21lQ29u
ZmlnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgQ2hyb21lQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9
CisgIGJvb2wgaGFzX3RyYWNlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0cmFjZV9jb25maWcoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3ByaXZhY3lfZmlsdGVyaW5n
X2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBwcml2
YWN5X2ZpbHRlcmluZ19lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19ib29sKCk7
IH0KK307CisKK2NsYXNzIENocm9tZUNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2hyb21lQ29uZmlnX0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrVHJhY2VDb25maWdGaWVsZE51bWJlciA9IDEsCisgICAg
a1ByaXZhY3lGaWx0ZXJpbmdFbmFibGVkRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNl
dF90cmFjZV9jb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0
ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3RyYWNl
X2NvbmZpZyhjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3ByaXZhY3lfZmlsdGVyaW5nX2VuYWJs
ZWQoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9
OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisj
ZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy9kYXRhX3NvdXJjZV9jb25maWcucGJ6ZXJvLmgK
Ky8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5P
VCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklH
X0RBVEFfU09VUkNFX0NPTkZJR19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX0NPTkZJR19EQVRBX1NPVVJDRV9DT05GSUdfUFJPVE9fSF8KKworI2luY2x1
ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tl
ZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIK
KworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBi
emVybyB7CisKK2NsYXNzIEFuZHJvaWRMb2dDb25maWc7CitjbGFzcyBBbmRyb2lkUG9sbGVkU3Rh
dGVDb25maWc7CitjbGFzcyBBbmRyb2lkUG93ZXJDb25maWc7CitjbGFzcyBDaHJvbWVDb25maWc7
CitjbGFzcyBGdHJhY2VDb25maWc7CitjbGFzcyBHcHVDb3VudGVyQ29uZmlnOworY2xhc3MgSGVh
cHByb2ZkQ29uZmlnOworY2xhc3MgSW5vZGVGaWxlQ29uZmlnOworY2xhc3MgSmF2YUhwcm9mQ29u
ZmlnOworY2xhc3MgUGFja2FnZXNMaXN0Q29uZmlnOworY2xhc3MgUGVyZkV2ZW50Q29uZmlnOwor
Y2xhc3MgUHJvY2Vzc1N0YXRzQ29uZmlnOworY2xhc3MgU3lzU3RhdHNDb25maWc7CitjbGFzcyBU
ZXN0Q29uZmlnOworY2xhc3MgVHJhY2tFdmVudENvbmZpZzsKK2NsYXNzIFZ1bGthbk1lbW9yeUNv
bmZpZzsKKworY2xhc3MgRGF0YVNvdXJjZUNvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzExNCwgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBEYXRhU291cmNlQ29u
ZmlnX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IERhdGFTb3VyY2VDb25maWdfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBEYXRhU291cmNlQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5n
KCk7IH0KKyAgYm9vbCBoYXNfdGFyZ2V0X2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCB0YXJnZXRfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc190cmFjZV9kdXJhdGlvbl9tcygpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB0cmFjZV9kdXJhdGlvbl9t
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3Rv
cF90aW1lb3V0X21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IHN0b3BfdGltZW91dF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDMyKCk7
IH0KKyAgYm9vbCBoYXNfZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKSBjb25zdCB7IHJldHVybiBh
dDw2PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBlbmFibGVfZXh0cmFfZ3VhcmRyYWlscygpIGNvbnN0
IHsgcmV0dXJuIGF0PDY+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3RyYWNpbmdfc2Vzc2lv
bl9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB0cmFj
aW5nX3Nlc3Npb25faWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2Z0cmFjZV9jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMDA+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmdHJhY2VfY29uZmlnKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTAwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfaW5vZGVfZmlsZV9jb25m
aWcoKSBjb25zdCB7IHJldHVybiBhdDwxMDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBpbm9kZV9maWxlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDEwMj4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Byb2Nlc3Nfc3RhdHNfY29uZmlnKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTAzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcHJv
Y2Vzc19zdGF0c19jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMDM+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19zeXNfc3RhdHNfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA0Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc3lzX3N0YXRzX2NvbmZpZygp
IGNvbnN0IHsgcmV0dXJuIGF0PDEwND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2hlYXBw
cm9mZF9jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMDU+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBoZWFwcHJvZmRfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTA1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfamF2YV9ocHJvZl9jb25maWcoKSBjb25z
dCB7IHJldHVybiBhdDwxMTA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBqYXZhX2hwcm9mX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDExMD4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX2FuZHJvaWRfcG93ZXJfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTA2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYW5kcm9pZF9wb3dl
cl9jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMDY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19hbmRyb2lkX2xvZ19jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMDc+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBhbmRyb2lkX2xvZ19jb25maWcoKSBjb25z
dCB7IHJldHVybiBhdDwxMDc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19ncHVfY291bnRl
cl9jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMDg+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBncHVfY291bnRlcl9jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwx
MDg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19wYWNrYWdlc19saXN0X2NvbmZpZygpIGNv
bnN0IHsgcmV0dXJuIGF0PDEwOT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIHBhY2thZ2VzX2xpc3RfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA5PigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfcGVyZl9ldmVudF9jb25maWcoKSBjb25zdCB7IHJldHVybiBh
dDwxMTE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwZXJmX2V2ZW50
X2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDExMT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wg
aGFzX3Z1bGthbl9tZW1vcnlfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MTEyPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdnVsa2FuX21lbW9yeV9jb25maWcoKSBj
b25zdCB7IHJldHVybiBhdDwxMTI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190cmFja19l
dmVudF9jb25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMTM+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyB0cmFja19ldmVudF9jb25maWcoKSBjb25zdCB7IHJldHVybiBh
dDwxMTM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19hbmRyb2lkX3BvbGxlZF9zdGF0ZV9j
b25maWcoKSBjb25zdCB7IHJldHVybiBhdDwxMTQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBhbmRyb2lkX3BvbGxlZF9zdGF0ZV9jb25maWcoKSBjb25zdCB7IHJldHVy
biBhdDwxMTQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jaHJvbWVfY29uZmlnKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTAxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgY2hyb21lX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDEwMT4oKS5hc19ieXRlcygpOyB9
CisgIC8vIGZpZWxkIGxlZ2FjeV9jb25maWcgb21pdHRlZCBiZWNhdXNlIGl0cyBpZCBpcyB0b28g
aGlnaAorICAvLyBmaWVsZCBmb3JfdGVzdGluZyBvbWl0dGVkIGJlY2F1c2UgaXRzIGlkIGlzIHRv
byBoaWdoCit9OworCitjbGFzcyBEYXRhU291cmNlQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBEYXRhU291cmNlQ29uZmln
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwK
KyAgICBrVGFyZ2V0QnVmZmVyRmllbGROdW1iZXIgPSAyLAorICAgIGtUcmFjZUR1cmF0aW9uTXNG
aWVsZE51bWJlciA9IDMsCisgICAga1N0b3BUaW1lb3V0TXNGaWVsZE51bWJlciA9IDcsCisgICAg
a0VuYWJsZUV4dHJhR3VhcmRyYWlsc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrVHJhY2luZ1Nlc3Np
b25JZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrRnRyYWNlQ29uZmlnRmllbGROdW1iZXIgPSAxMDAs
CisgICAga0lub2RlRmlsZUNvbmZpZ0ZpZWxkTnVtYmVyID0gMTAyLAorICAgIGtQcm9jZXNzU3Rh
dHNDb25maWdGaWVsZE51bWJlciA9IDEwMywKKyAgICBrU3lzU3RhdHNDb25maWdGaWVsZE51bWJl
ciA9IDEwNCwKKyAgICBrSGVhcHByb2ZkQ29uZmlnRmllbGROdW1iZXIgPSAxMDUsCisgICAga0ph
dmFIcHJvZkNvbmZpZ0ZpZWxkTnVtYmVyID0gMTEwLAorICAgIGtBbmRyb2lkUG93ZXJDb25maWdG
aWVsZE51bWJlciA9IDEwNiwKKyAgICBrQW5kcm9pZExvZ0NvbmZpZ0ZpZWxkTnVtYmVyID0gMTA3
LAorICAgIGtHcHVDb3VudGVyQ29uZmlnRmllbGROdW1iZXIgPSAxMDgsCisgICAga1BhY2thZ2Vz
TGlzdENvbmZpZ0ZpZWxkTnVtYmVyID0gMTA5LAorICAgIGtQZXJmRXZlbnRDb25maWdGaWVsZE51
bWJlciA9IDExMSwKKyAgICBrVnVsa2FuTWVtb3J5Q29uZmlnRmllbGROdW1iZXIgPSAxMTIsCisg
ICAga1RyYWNrRXZlbnRDb25maWdGaWVsZE51bWJlciA9IDExMywKKyAgICBrQW5kcm9pZFBvbGxl
ZFN0YXRlQ29uZmlnRmllbGROdW1iZXIgPSAxMTQsCisgICAga0Nocm9tZUNvbmZpZ0ZpZWxkTnVt
YmVyID0gMTAxLAorICAgIGtMZWdhY3lDb25maWdGaWVsZE51bWJlciA9IDEwMDAsCisgICAga0Zv
clRlc3RpbmdGaWVsZE51bWJlciA9IDEwMDEsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF90YXJnZXRfYnVmZmVyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90cmFjZV9kdXJhdGlvbl9tcyh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RvcF90
aW1lb3V0X21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9lbmFibGVfZXh0cmFfZ3VhcmRyYWlscyhib29sIHZhbHVlKSB7Cisg
ICAgQXBwZW5kVGlueVZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdHJhY2luZ19z
ZXNzaW9uX2lkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEZ0cmFjZUNvbmZpZz4gVCogc2V0X2Z0cmFj
ZV9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMDApOworICB9
CisKKyAgdm9pZCBzZXRfZnRyYWNlX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
eworICAgIHJldHVybiBBcHBlbmRCeXRlcygxMDAsIHJhdy5kYXRhKCksIHJhdy5zaXplKCkpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJbm9kZUZpbGVDb25maWc+IFQqIHNldF9p
bm9kZV9maWxlX2NvbmZpZygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEw
Mik7CisgIH0KKworICB2b2lkIHNldF9pbm9kZV9maWxlX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgeworICAgIHJldHVybiBBcHBlbmRCeXRlcygxMDIsIHJhdy5kYXRhKCksIHJh
dy5zaXplKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9jZXNzU3RhdHND
b25maWc+IFQqIHNldF9wcm9jZXNzX3N0YXRzX2NvbmZpZygpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDEwMyk7CisgIH0KKworICB2b2lkIHNldF9wcm9jZXNzX3N0YXRzX2Nv
bmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeworICAgIHJldHVybiBBcHBlbmRCeXRl
cygxMDMsIHJhdy5kYXRhKCksIHJhdy5zaXplKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBTeXNTdGF0c0NvbmZpZz4gVCogc2V0X3N5c19zdGF0c19jb25maWcoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMDQpOworICB9CisKKyAgdm9pZCBzZXRfc3lz
X3N0YXRzX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgeworICAgIHJldHVybiBB
cHBlbmRCeXRlcygxMDQsIHJhdy5kYXRhKCksIHJhdy5zaXplKCkpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBIZWFwcHJvZmRDb25maWc+IFQqIHNldF9oZWFwcHJvZmRfY29uZmln
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTA1KTsKKyAgfQorCisgIHZv
aWQgc2V0X2hlYXBwcm9mZF9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsKKyAg
ICByZXR1cm4gQXBwZW5kQnl0ZXMoMTA1LCByYXcuZGF0YSgpLCByYXcuc2l6ZSgpKTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSmF2YUhwcm9mQ29uZmlnPiBUKiBzZXRfamF2YV9o
cHJvZl9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMTApOwor
ICB9CisKKyAgdm9pZCBzZXRfamF2YV9ocHJvZl9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIHsKKyAgICByZXR1cm4gQXBwZW5kQnl0ZXMoMTEwLCByYXcuZGF0YSgpLCByYXcuc2l6
ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQW5kcm9pZFBvd2VyQ29uZmln
PiBUKiBzZXRfYW5kcm9pZF9wb3dlcl9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigxMDYpOworICB9CisKKyAgdm9pZCBzZXRfYW5kcm9pZF9wb3dlcl9jb25maWdf
cmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsKKyAgICByZXR1cm4gQXBwZW5kQnl0ZXMoMTA2
LCByYXcuZGF0YSgpLCByYXcuc2l6ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gQW5kcm9pZExvZ0NvbmZpZz4gVCogc2V0X2FuZHJvaWRfbG9nX2NvbmZpZygpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEwNyk7CisgIH0KKworICB2b2lkIHNldF9hbmRy
b2lkX2xvZ19jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsKKyAgICByZXR1cm4g
QXBwZW5kQnl0ZXMoMTA3LCByYXcuZGF0YSgpLCByYXcuc2l6ZSgpKTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gR3B1Q291bnRlckNvbmZpZz4gVCogc2V0X2dwdV9jb3VudGVyX2Nv
bmZpZygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEwOCk7CisgIH0KKwor
ICB2b2lkIHNldF9ncHVfY291bnRlcl9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IHsKKyAgICByZXR1cm4gQXBwZW5kQnl0ZXMoMTA4LCByYXcuZGF0YSgpLCByYXcuc2l6ZSgpKTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUGFja2FnZXNMaXN0Q29uZmlnPiBUKiBz
ZXRfcGFja2FnZXNfbGlzdF9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigxMDkpOworICB9CisKKyAgdm9pZCBzZXRfcGFja2FnZXNfbGlzdF9jb25maWdfcmF3KGNv
bnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsKKyAgICByZXR1cm4gQXBwZW5kQnl0ZXMoMTA5LCByYXcu
ZGF0YSgpLCByYXcuc2l6ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUGVy
ZkV2ZW50Q29uZmlnPiBUKiBzZXRfcGVyZl9ldmVudF9jb25maWcoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigxMTEpOworICB9CisKKyAgdm9pZCBzZXRfcGVyZl9ldmVudF9j
b25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsKKyAgICByZXR1cm4gQXBwZW5kQnl0
ZXMoMTExLCByYXcuZGF0YSgpLCByYXcuc2l6ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gVnVsa2FuTWVtb3J5Q29uZmlnPiBUKiBzZXRfdnVsa2FuX21lbW9yeV9jb25maWco
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMTIpOworICB9CisKKyAgdm9p
ZCBzZXRfdnVsa2FuX21lbW9yeV9jb25maWdfcmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIHsK
KyAgICByZXR1cm4gQXBwZW5kQnl0ZXMoMTEyLCByYXcuZGF0YSgpLCByYXcuc2l6ZSgpKTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2tFdmVudENvbmZpZz4gVCogc2V0X3Ry
YWNrX2V2ZW50X2NvbmZpZygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEx
Myk7CisgIH0KKworICB2b2lkIHNldF90cmFja19ldmVudF9jb25maWdfcmF3KGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIHsKKyAgICByZXR1cm4gQXBwZW5kQnl0ZXMoMTEzLCByYXcuZGF0YSgpLCBy
YXcuc2l6ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQW5kcm9pZFBvbGxl
ZFN0YXRlQ29uZmlnPiBUKiBzZXRfYW5kcm9pZF9wb2xsZWRfc3RhdGVfY29uZmlnKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTE0KTsKKyAgfQorCisgIHZvaWQgc2V0X2Fu
ZHJvaWRfcG9sbGVkX3N0YXRlX2NvbmZpZ19yYXcoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgewor
ICAgIHJldHVybiBBcHBlbmRCeXRlcygxMTQsIHJhdy5kYXRhKCksIHJhdy5zaXplKCkpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDaHJvbWVDb25maWc+IFQqIHNldF9jaHJvbWVf
Y29uZmlnKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTAxKTsKKyAgfQor
CisgIHZvaWQgc2V0X2xlZ2FjeV9jb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMTAwMCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9Cisg
IHZvaWQgc2V0X2xlZ2FjeV9jb25maWcoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsK
KyAgICBBcHBlbmRCeXRlcygxMDAwLCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IFRlc3RDb25maWc+IFQqIHNldF9mb3JfdGVzdGluZygpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEwMDEpOworICB9CisKK307CisKK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBn
dWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vY29uZmlnL3Rlc3RfY29uZmlnLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQ
cm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19URVNUX0NPTkZJR19QUk9UT19IXworI2Rl
ZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX0NPTkZJR19URVNUX0NPTkZJR19Q
Uk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9t
ZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3Rv
cyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgVGVzdENvbmZpZ19EdW1teUZpZWxkczsK
KworY2xhc3MgVGVzdENvbmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVGVzdENvbmZpZ19EZWNvZGVyKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7
fQorICBleHBsaWNpdCBUZXN0Q29uZmlnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVGVzdENvbmZpZ19EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19tZXNzYWdlX2NvdW50KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1lc3NhZ2VfY291bnQoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX21heF9tZXNzYWdl
c19wZXJfc2Vjb25kKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IG1heF9tZXNzYWdlc19wZXJfc2Vjb25kKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19zZWVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxp
ZCgpOyB9CisgIHVpbnQzMl90IHNlZWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX21lc3NhZ2Vfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBtZXNzYWdlX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NlbmRfYmF0Y2hfb25fcmVnaXN0ZXIoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBzZW5kX2JhdGNoX29uX3Jl
Z2lzdGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNf
ZHVtbXlfZmllbGRzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIGR1bW15X2ZpZWxkcygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
YXNfYnl0ZXMoKTsgfQorfTsKKworY2xhc3MgVGVzdENvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVGVzdENvbmZpZ19EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga01lc3NhZ2VDb3VudEZpZWxkTnVtYmVyID0g
MSwKKyAgICBrTWF4TWVzc2FnZXNQZXJTZWNvbmRGaWVsZE51bWJlciA9IDIsCisgICAga1NlZWRG
aWVsZE51bWJlciA9IDMsCisgICAga01lc3NhZ2VTaXplRmllbGROdW1iZXIgPSA0LAorICAgIGtT
ZW5kQmF0Y2hPblJlZ2lzdGVyRmllbGROdW1iZXIgPSA1LAorICAgIGtEdW1teUZpZWxkc0ZpZWxk
TnVtYmVyID0gNiwKKyAgfTsKKyAgdXNpbmcgRHVtbXlGaWVsZHMgPSA6OnBlcmZldHRvOjpwcm90
b3M6OnBiemVybzo6VGVzdENvbmZpZ19EdW1teUZpZWxkczsKKyAgdm9pZCBzZXRfbWVzc2FnZV9j
b3VudCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfbWF4X21lc3NhZ2VzX3Blcl9zZWNvbmQodWludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NlZWQodWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21l
c3NhZ2Vfc2l6ZSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfc2VuZF9iYXRjaF9vbl9yZWdpc3Rlcihib29sIHZhbHVlKSB7Cisg
ICAgQXBwZW5kVGlueVZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBUZXN0Q29uZmlnX0R1bW15RmllbGRzPiBUKiBzZXRfZHVtbXlfZmllbGRzKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworfTsKKworY2xhc3MgVGVz
dENvbmZpZ19EdW1teUZpZWxkc19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzE0LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRlc3RDb25maWdfRHVtbXlGaWVsZHNfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVGVzdENvbmZpZ19EdW1teUZpZWxkc19EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IFRlc3RDb25maWdfRHVtbXlGaWVsZHNfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfZmllbGRfdWludDMyKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgp
OyB9CisgIHVpbnQzMl90IGZpZWxkX3VpbnQzMigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
dWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmllbGRfaW50MzIoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBmaWVsZF9pbnQzMigpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19maWVsZF91aW50NjQoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZmllbGRfdWludDY0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19maWVsZF9pbnQ2NCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGZpZWxkX2ludDY0
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2ZpZWxk
X2ZpeGVkNjQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
ZmllbGRfZml4ZWQ2NCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfZmllbGRfc2ZpeGVkNjQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7
IH0KKyAgaW50NjRfdCBmaWVsZF9zZml4ZWQ2NCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNf
aW50NjQoKTsgfQorICBib29sIGhhc19maWVsZF9maXhlZDMyKCkgY29uc3QgeyByZXR1cm4gYXQ8
Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGZpZWxkX2ZpeGVkMzIoKSBjb25zdCB7IHJldHVy
biBhdDw3PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2ZpZWxkX3NmaXhlZDMyKCkgY29u
c3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZmllbGRfc2ZpeGVkMzIo
KSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmllbGRf
ZG91YmxlKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIGRvdWJsZSBmaWVs
ZF9kb3VibGUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX2RvdWJsZSgpOyB9CisgIGJvb2wg
aGFzX2ZpZWxkX2Zsb2F0KCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICBm
bG9hdCBmaWVsZF9mbG9hdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFzX2Zsb2F0KCk7IH0K
KyAgYm9vbCBoYXNfZmllbGRfc2ludDY0KCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQo
KTsgfQorICBpbnQ2NF90IGZpZWxkX3NpbnQ2NCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFz
X2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfZmllbGRfc2ludDMyKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGZpZWxkX3NpbnQzMigpIGNvbnN0IHsgcmV0dXJu
IGF0PDEyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmllbGRfc3RyaW5nKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBm
aWVsZF9zdHJpbmcoKSBjb25zdCB7IHJldHVybiBhdDwxMz4oKS5hc19zdHJpbmcoKTsgfQorICBi
b29sIGhhc19maWVsZF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE0PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZmllbGRfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBh
dDwxND4oKS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBUZXN0Q29uZmlnX0R1bW15RmllbGRz
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBUZXN0Q29uZmlnX0R1bW15RmllbGRzX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrRmllbGRVaW50MzJGaWVsZE51bWJlciA9IDEsCisgICAga0ZpZWxkSW50MzJGaWVsZE51
bWJlciA9IDIsCisgICAga0ZpZWxkVWludDY0RmllbGROdW1iZXIgPSAzLAorICAgIGtGaWVsZElu
dDY0RmllbGROdW1iZXIgPSA0LAorICAgIGtGaWVsZEZpeGVkNjRGaWVsZE51bWJlciA9IDUsCisg
ICAga0ZpZWxkU2ZpeGVkNjRGaWVsZE51bWJlciA9IDYsCisgICAga0ZpZWxkRml4ZWQzMkZpZWxk
TnVtYmVyID0gNywKKyAgICBrRmllbGRTZml4ZWQzMkZpZWxkTnVtYmVyID0gOCwKKyAgICBrRmll
bGREb3VibGVGaWVsZE51bWJlciA9IDksCisgICAga0ZpZWxkRmxvYXRGaWVsZE51bWJlciA9IDEw
LAorICAgIGtGaWVsZFNpbnQ2NEZpZWxkTnVtYmVyID0gMTEsCisgICAga0ZpZWxkU2ludDMyRmll
bGROdW1iZXIgPSAxMiwKKyAgICBrRmllbGRTdHJpbmdGaWVsZE51bWJlciA9IDEzLAorICAgIGtG
aWVsZEJ5dGVzRmllbGROdW1iZXIgPSAxNCwKKyAgfTsKKyAgdm9pZCBzZXRfZmllbGRfdWludDMy
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9maWVsZF9pbnQzMihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9maWVsZF91aW50NjQodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZpZWxkX2ludDY0
KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2ZpZWxkX2ZpeGVkNjQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRGaXhlZCg1
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmllbGRfc2ZpeGVkNjQoaW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZEZpeGVkKDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9maWVsZF9maXhl
ZDMyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kRml4ZWQoNywgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2ZpZWxkX3NmaXhlZDMyKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRGaXhl
ZCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmllbGRfZG91YmxlKGRvdWJsZSB2YWx1ZSkg
eworICAgIEFwcGVuZEZpeGVkKDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9maWVsZF9mbG9h
dChmbG9hdCB2YWx1ZSkgeworICAgIEFwcGVuZEZpeGVkKDEwLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfZmllbGRfc2ludDY0KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRTaWduZWRWYXJJ
bnQoMTEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9maWVsZF9zaW50MzIoaW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFNpZ25lZFZhckludCgxMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2ZpZWxkX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRl
cygxMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2ZpZWxk
X3N0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDEzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9maWVsZF9ieXRlcyhjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxNCwgdmFsdWUuZGF0YSgpLCB2YWx1
ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2ZpZWxkX2J5dGVzKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMTQsIGRhdGEsIHNpemUpOworICB9
Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2Uu
CisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL2NvbmZpZy90cmFjZV9jb25maWcucGJ6ZXJvLmgKKy8v
IEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBF
RElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fQ09ORklHX1RS
QUNFX0NPTkZJR19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX0NPTkZJR19UUkFDRV9DT05GSUdfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgor
I2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVs
ZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBl
cmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNz
IERhdGFTb3VyY2VDb25maWc7CitjbGFzcyBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWc7CitjbGFz
cyBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZTsKK2NsYXNzIFRyYWNlQ29uZmlnX0RhdGFT
b3VyY2U7CitjbGFzcyBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXM7CitjbGFzcyBUcmFj
ZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZzsKK2NsYXNzIFRyYWNlQ29uZmlnX0luY3JlbWVu
dGFsU3RhdGVDb25maWc7CitjbGFzcyBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZzsKK2NsYXNz
IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhOworY2xhc3MgVHJhY2VDb25maWdfVHJpZ2dlckNv
bmZpZzsKK2NsYXNzIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlcjsKK2VudW0gQnVp
bHRpbkNsb2NrIDogaW50MzJfdDsKK2VudW0gVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQ
b2xpY3kgOiBpbnQzMl90OworZW51bSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGUgOiBpbnQz
Ml90OworZW51bSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb24gOiBpbnQzMl90Owor
ZW51bSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlIDogaW50MzJfdDsKKwor
ZW51bSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb24gOiBpbnQzMl90IHsKKyAgVHJh
Y2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uX0xPQ0tET1dOX1VOQ0hBTkdFRCA9IDAsCisg
IFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9DTEVBUiA9IDEsCisg
IFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NLRE9XTl9TRVQgPSAyLAorfTsK
KworY29uc3QgVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9uIFRyYWNlQ29uZmlnX0xv
Y2tkb3duTW9kZU9wZXJhdGlvbl9NSU4gPSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRp
b25fTE9DS0RPV05fVU5DSEFOR0VEOworY29uc3QgVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3Bl
cmF0aW9uIFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9NQVggPSBUcmFjZUNvbmZp
Z19Mb2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fU0VUOworCitlbnVtIFRyYWNlQ29uZmln
X0NvbXByZXNzaW9uVHlwZSA6IGludDMyX3QgeworICBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5
cGVfQ09NUFJFU1NJT05fVFlQRV9VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNlQ29uZmlnX0NvbXBy
ZXNzaW9uVHlwZV9DT01QUkVTU0lPTl9UWVBFX0RFRkxBVEUgPSAxLAorfTsKKworY29uc3QgVHJh
Y2VDb25maWdfQ29tcHJlc3Npb25UeXBlIFRyYWNlQ29uZmlnX0NvbXByZXNzaW9uVHlwZV9NSU4g
PSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGVfQ09NUFJFU1NJT05fVFlQRV9VTlNQRUNJRklF
RDsKK2NvbnN0IFRyYWNlQ29uZmlnX0NvbXByZXNzaW9uVHlwZSBUcmFjZUNvbmZpZ19Db21wcmVz
c2lvblR5cGVfTUFYID0gVHJhY2VDb25maWdfQ29tcHJlc3Npb25UeXBlX0NPTVBSRVNTSU9OX1RZ
UEVfREVGTEFURTsKKworZW51bSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2Rl
IDogaW50MzJfdCB7CisgIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVfVU5T
UEVDSUZJRUQgPSAwLAorICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2RlX1NU
QVJUX1RSQUNJTkcgPSAxLAorICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXJNb2Rl
X1NUT1BfVFJBQ0lORyA9IDIsCit9OworCitjb25zdCBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmln
X1RyaWdnZXJNb2RlIFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVfTUlOID0g
VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9VTlNQRUNJRklFRDsKK2NvbnN0
IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGUgVHJhY2VDb25maWdfVHJpZ2dl
ckNvbmZpZ19UcmlnZ2VyTW9kZV9NQVggPSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdn
ZXJNb2RlX1NUT1BfVFJBQ0lORzsKKworZW51bSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmls
bFBvbGljeSA6IGludDMyX3QgeworICBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGlj
eV9VTlNQRUNJRklFRCA9IDAsCisgIFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5
X1JJTkdfQlVGRkVSID0gMSwKKyAgVHJhY2VDb25maWdfQnVmZmVyQ29uZmlnX0ZpbGxQb2xpY3lf
RElTQ0FSRCA9IDIsCit9OworCitjb25zdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBv
bGljeSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9NSU4gPSBUcmFjZUNvbmZp
Z19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9VTlNQRUNJRklFRDsKK2NvbnN0IFRyYWNlQ29uZmln
X0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9s
aWN5X01BWCA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19GaWxsUG9saWN5X0RJU0NBUkQ7CisK
K2NsYXNzIFRyYWNlQ29uZmlnX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMjksIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBUcmFjZUNvbmZpZ19EZWNvZGVyKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7
fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2J1ZmZlcnMoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRv
cjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gYnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIEdldFJl
cGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxKTsgfQorICBib29sIGhhc19kYXRhX3Nv
dXJjZXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZGF0YV9zb3Vy
Y2VzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+
KDIpOyB9CisgIGJvb2wgaGFzX2J1aWx0aW5fZGF0YV9zb3VyY2VzKCkgY29uc3QgeyByZXR1cm4g
YXQ8MjA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBidWlsdGluX2Rh
dGFfc291cmNlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDIwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfZHVyYXRpb25fbXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgZHVyYXRpb25fbXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX2VuYWJsZV9leHRyYV9ndWFyZHJhaWxzKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS52YWxpZCgpOyB9CisgIGJvb2wgZW5hYmxlX2V4dHJhX2d1YXJkcmFpbHMoKSBjb25z
dCB7IHJldHVybiBhdDw0PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19sb2NrZG93bl9tb2Rl
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbG9ja2Rvd25f
bW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19w
cm9kdWNlcnMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gcHJvZHVj
ZXJzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+
KDYpOyB9CisgIGJvb2wgaGFzX3N0YXRzZF9tZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzdGF0c2RfbWV0YWRhdGEo
KSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfd3JpdGVf
aW50b19maWxlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIGJvb2wgd3Jp
dGVfaW50b19maWxlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc19ib29sKCk7IH0KKyAgYm9v
bCBoYXNfb3V0cHV0X3BhdGgoKSBjb25zdCB7IHJldHVybiBhdDwyOT4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG91dHB1dF9wYXRoKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mjk+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfZmlsZV93cml0ZV9wZXJpb2RfbXMoKSBj
b25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmlsZV93cml0ZV9w
ZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wg
aGFzX21heF9maWxlX3NpemVfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IG1heF9maWxlX3NpemVfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBhdDwx
MD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ndWFyZHJhaWxfb3ZlcnJpZGVzKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBndWFyZHJhaWxfb3ZlcnJpZGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19kZWZlcnJlZF9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEyPigp
LnZhbGlkKCk7IH0KKyAgYm9vbCBkZWZlcnJlZF9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEy
PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19mbHVzaF9wZXJpb2RfbXMoKSBjb25zdCB7IHJl
dHVybiBhdDwxMz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGZsdXNoX3BlcmlvZF9tcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDEzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2ZsdXNoX3Rp
bWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBhdDwxND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGZsdXNoX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVybiBhdDwxND4oKS5hc191aW50MzIoKTsg
fQorICBib29sIGhhc19kYXRhX3NvdXJjZV9zdG9wX3RpbWVvdXRfbXMoKSBjb25zdCB7IHJldHVy
biBhdDwyMz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGRhdGFfc291cmNlX3N0b3BfdGltZW91
dF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDIzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X25vdGlmeV90cmFjZXVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkudmFsaWQoKTsgfQorICBi
b29sIG5vdGlmeV90cmFjZXVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkuYXNfYm9vbCgpOyB9
CisgIGJvb2wgaGFzX3RyaWdnZXJfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MTc+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0cmlnZ2VyX2NvbmZpZygpIGNvbnN0
IHsgcmV0dXJuIGF0PDE3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYWN0aXZhdGVfdHJp
Z2dlcnMoKSBjb25zdCB7IHJldHVybiBhdDwxOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IGFjdGl2YXRl
X3RyaWdnZXJzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0
Q2hhcnM+KDE4KTsgfQorICBib29sIGhhc19pbmNyZW1lbnRhbF9zdGF0ZV9jb25maWcoKSBjb25z
dCB7IHJldHVybiBhdDwyMT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGluY3JlbWVudGFsX3N0YXRlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDIxPigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfYWxsb3dfdXNlcl9idWlsZF90cmFjaW5nKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTk+KCkudmFsaWQoKTsgfQorICBib29sIGFsbG93X3VzZXJfYnVpbGRfdHJhY2lu
ZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE5PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc191bmlx
dWVfc2Vzc2lvbl9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MjI+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RDaGFycyB1bmlxdWVfc2Vzc2lvbl9uYW1lKCkgY29uc3QgeyByZXR1
cm4gYXQ8MjI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY29tcHJlc3Npb25fdHlwZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBjb21wcmVzc2lv
bl90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQ+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhh
c19pbmNpZGVudF9yZXBvcnRfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8MjU+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBpbmNpZGVudF9yZXBvcnRfY29uZmlnKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MjU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190cmFjZV91
dWlkX21zYigpIGNvbnN0IHsgcmV0dXJuIGF0PDI3PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0
cmFjZV91dWlkX21zYigpIGNvbnN0IHsgcmV0dXJuIGF0PDI3PigpLmFzX2ludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfdHJhY2VfdXVpZF9sc2IoKSBjb25zdCB7IHJldHVybiBhdDwyOD4oKS52YWxpZCgp
OyB9CisgIGludDY0X3QgdHJhY2VfdXVpZF9sc2IoKSBjb25zdCB7IHJldHVybiBhdDwyOD4oKS5h
c19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2VDb25maWdfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtCdWZmZXJzRmllbGROdW1iZXIgPSAxLAor
ICAgIGtEYXRhU291cmNlc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrQnVpbHRpbkRhdGFTb3VyY2Vz
RmllbGROdW1iZXIgPSAyMCwKKyAgICBrRHVyYXRpb25Nc0ZpZWxkTnVtYmVyID0gMywKKyAgICBr
RW5hYmxlRXh0cmFHdWFyZHJhaWxzRmllbGROdW1iZXIgPSA0LAorICAgIGtMb2NrZG93bk1vZGVG
aWVsZE51bWJlciA9IDUsCisgICAga1Byb2R1Y2Vyc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrU3Rh
dHNkTWV0YWRhdGFGaWVsZE51bWJlciA9IDcsCisgICAga1dyaXRlSW50b0ZpbGVGaWVsZE51bWJl
ciA9IDgsCisgICAga091dHB1dFBhdGhGaWVsZE51bWJlciA9IDI5LAorICAgIGtGaWxlV3JpdGVQ
ZXJpb2RNc0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrTWF4RmlsZVNpemVCeXRlc0ZpZWxkTnVtYmVy
ID0gMTAsCisgICAga0d1YXJkcmFpbE92ZXJyaWRlc0ZpZWxkTnVtYmVyID0gMTEsCisgICAga0Rl
ZmVycmVkU3RhcnRGaWVsZE51bWJlciA9IDEyLAorICAgIGtGbHVzaFBlcmlvZE1zRmllbGROdW1i
ZXIgPSAxMywKKyAgICBrRmx1c2hUaW1lb3V0TXNGaWVsZE51bWJlciA9IDE0LAorICAgIGtEYXRh
U291cmNlU3RvcFRpbWVvdXRNc0ZpZWxkTnVtYmVyID0gMjMsCisgICAga05vdGlmeVRyYWNldXJG
aWVsZE51bWJlciA9IDE2LAorICAgIGtUcmlnZ2VyQ29uZmlnRmllbGROdW1iZXIgPSAxNywKKyAg
ICBrQWN0aXZhdGVUcmlnZ2Vyc0ZpZWxkTnVtYmVyID0gMTgsCisgICAga0luY3JlbWVudGFsU3Rh
dGVDb25maWdGaWVsZE51bWJlciA9IDIxLAorICAgIGtBbGxvd1VzZXJCdWlsZFRyYWNpbmdGaWVs
ZE51bWJlciA9IDE5LAorICAgIGtVbmlxdWVTZXNzaW9uTmFtZUZpZWxkTnVtYmVyID0gMjIsCisg
ICAga0NvbXByZXNzaW9uVHlwZUZpZWxkTnVtYmVyID0gMjQsCisgICAga0luY2lkZW50UmVwb3J0
Q29uZmlnRmllbGROdW1iZXIgPSAyNSwKKyAgICBrVHJhY2VVdWlkTXNiRmllbGROdW1iZXIgPSAy
NywKKyAgICBrVHJhY2VVdWlkTHNiRmllbGROdW1iZXIgPSAyOCwKKyAgfTsKKyAgdXNpbmcgQnVm
ZmVyQ29uZmlnID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlQ29uZmlnX0J1ZmZl
ckNvbmZpZzsKKyAgdXNpbmcgRGF0YVNvdXJjZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJv
OjpUcmFjZUNvbmZpZ19EYXRhU291cmNlOworICB1c2luZyBCdWlsdGluRGF0YVNvdXJjZSA9IDo6
cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJjZTsK
KyAgdXNpbmcgUHJvZHVjZXJDb25maWcgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJh
Y2VDb25maWdfUHJvZHVjZXJDb25maWc7CisgIHVzaW5nIFN0YXRzZE1ldGFkYXRhID0gOjpwZXJm
ZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhOworICB1c2lu
ZyBHdWFyZHJhaWxPdmVycmlkZXMgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2VD
b25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzOworICB1c2luZyBUcmlnZ2VyQ29uZmlnID0gOjpwZXJm
ZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWc7CisgIHVzaW5n
IEluY3JlbWVudGFsU3RhdGVDb25maWcgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJh
Y2VDb25maWdfSW5jcmVtZW50YWxTdGF0ZUNvbmZpZzsKKyAgdXNpbmcgSW5jaWRlbnRSZXBvcnRD
b25maWcgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2VDb25maWdfSW5jaWRlbnRS
ZXBvcnRDb25maWc7CisgIHVzaW5nIExvY2tkb3duTW9kZU9wZXJhdGlvbiA9IDo6cGVyZmV0dG86
OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb247CisgIHVz
aW5nIENvbXByZXNzaW9uVHlwZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNv
bmZpZ19Db21wcmVzc2lvblR5cGU7CisgIHN0YXRpYyBjb25zdCBMb2NrZG93bk1vZGVPcGVyYXRp
b24gTE9DS0RPV05fVU5DSEFOR0VEID0gVHJhY2VDb25maWdfTG9ja2Rvd25Nb2RlT3BlcmF0aW9u
X0xPQ0tET1dOX1VOQ0hBTkdFRDsKKyAgc3RhdGljIGNvbnN0IExvY2tkb3duTW9kZU9wZXJhdGlv
biBMT0NLRE9XTl9DTEVBUiA9IFRyYWNlQ29uZmlnX0xvY2tkb3duTW9kZU9wZXJhdGlvbl9MT0NL
RE9XTl9DTEVBUjsKKyAgc3RhdGljIGNvbnN0IExvY2tkb3duTW9kZU9wZXJhdGlvbiBMT0NLRE9X
Tl9TRVQgPSBUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb25fTE9DS0RPV05fU0VUOwor
ICBzdGF0aWMgY29uc3QgQ29tcHJlc3Npb25UeXBlIENPTVBSRVNTSU9OX1RZUEVfVU5TUEVDSUZJ
RUQgPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGVfQ09NUFJFU1NJT05fVFlQRV9VTlNQRUNJ
RklFRDsKKyAgc3RhdGljIGNvbnN0IENvbXByZXNzaW9uVHlwZSBDT01QUkVTU0lPTl9UWVBFX0RF
RkxBVEUgPSBUcmFjZUNvbmZpZ19Db21wcmVzc2lvblR5cGVfQ09NUFJFU1NJT05fVFlQRV9ERUZM
QVRFOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZz4g
VCogYWRkX2J1ZmZlcnMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2VDb25maWdfRGF0YVNvdXJjZT4g
VCogYWRkX2RhdGFfc291cmNlcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjZUNvbmZpZ19CdWlsdGlu
RGF0YVNvdXJjZT4gVCogc2V0X2J1aWx0aW5fZGF0YV9zb3VyY2VzKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjApOworICB9CisKKyAgdm9pZCBzZXRfZHVyYXRpb25fbXMo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2VuYWJsZV9leHRyYV9ndWFyZHJhaWxzKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRU
aW55VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sb2NrZG93bl9tb2RlKDo6cGVy
ZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19Mb2NrZG93bk1vZGVPcGVyYXRpb24g
dmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnPiBUKiBhZGRfcHJvZHVj
ZXJzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhPiBUKiBzZXRf
c3RhdHNkX21ldGFkYXRhKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNyk7
CisgIH0KKworICB2b2lkIHNldF93cml0ZV9pbnRvX2ZpbGUoYm9vbCB2YWx1ZSkgeworICAgIEFw
cGVuZFRpbnlWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X291dHB1dF9wYXRoKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDI5LCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfb3V0cHV0X3BhdGgoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyOSwgZGF0YSwgc2l6ZSk7
CisgIH0KKyAgdm9pZCBzZXRfZmlsZV93cml0ZV9wZXJpb2RfbXModWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21heF9maWxlX3Np
emVfYnl0ZXModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTAsIHZhbHVlKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJy
aWRlcz4gVCogc2V0X2d1YXJkcmFpbF9vdmVycmlkZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPigxMSk7CisgIH0KKworICB2b2lkIHNldF9kZWZlcnJlZF9zdGFydChib29s
IHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxMiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2ZsdXNoX3BlcmlvZF9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgx
MywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsdXNoX3RpbWVvdXRfbXModWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kYXRh
X3NvdXJjZV9zdG9wX3RpbWVvdXRfbXModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMjMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ub3RpZnlfdHJhY2V1cihib29sIHZhbHVl
KSB7CisgICAgQXBwZW5kVGlueVZhckludCgxNiwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZz4gVCogc2V0X3RyaWdnZXJfY29u
ZmlnKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTcpOworICB9CisKKyAg
dm9pZCBhZGRfYWN0aXZhdGVfdHJpZ2dlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMTgsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIGFkZF9hY3RpdmF0ZV90cmlnZ2Vycyhjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDE4LCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IFRyYWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWc+IFQqIHNldF9pbmNy
ZW1lbnRhbF9zdGF0ZV9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigyMSk7CisgIH0KKworICB2b2lkIHNldF9hbGxvd191c2VyX2J1aWxkX3RyYWNpbmcoYm9vbCB2
YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMTksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF91bmlxdWVfc2Vzc2lvbl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDIyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBz
ZXRfdW5pcXVlX3Nlc3Npb25fbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDIyLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9jb21wcmVz
c2lvbl90eXBlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19Db21wcmVz
c2lvblR5cGUgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDI0LCB2YWx1ZSk7CisgIH0K
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZp
Zz4gVCogc2V0X2luY2lkZW50X3JlcG9ydF9jb25maWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPigyNSk7CisgIH0KKworICB2b2lkIHNldF90cmFjZV91dWlkX21zYihpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDI3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfdHJhY2VfdXVpZF9sc2IoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyOCwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZp
Z19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWdfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWdfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBUcmFjZUNvbmZpZ19JbmNpZGVudFJlcG9ydENvbmZpZ19EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19kZXN0aW5hdGlvbl9wYWNrYWdlKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGRlc3RpbmF0
aW9uX3BhY2thZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJv
b2wgaGFzX2Rlc3RpbmF0aW9uX2NsYXNzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGRlc3RpbmF0aW9uX2NsYXNzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19wcml2YWN5X2xldmVs
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcHJpdmFjeV9s
ZXZlbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19z
a2lwX2Ryb3Bib3goKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBz
a2lwX2Ryb3Bib3goKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2Jvb2woKTsgfQorfTsKKwor
Y2xhc3MgVHJhY2VDb25maWdfSW5jaWRlbnRSZXBvcnRDb25maWcgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNlQ29uZmlnX0lu
Y2lkZW50UmVwb3J0Q29uZmlnX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGVz
dGluYXRpb25QYWNrYWdlRmllbGROdW1iZXIgPSAxLAorICAgIGtEZXN0aW5hdGlvbkNsYXNzRmll
bGROdW1iZXIgPSAyLAorICAgIGtQcml2YWN5TGV2ZWxGaWVsZE51bWJlciA9IDMsCisgICAga1Nr
aXBEcm9wYm94RmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9kZXN0aW5hdGlvbl9w
YWNrYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9kZXN0aW5hdGlvbl9w
YWNrYWdlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
MSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGVzdGluYXRpb25fY2xhc3MoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2Rlc3RpbmF0aW9uX2NsYXNzKGNvbnN0IGNo
YXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcHJpdmFjeV9sZXZlbChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9za2lwX2Ryb3Bib3goYm9vbCB2
YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFz
cyBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29kZXIgOiBwdWJsaWMgOjpw
cm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBUcmFjZUNvbmZp
Z19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRy
YWNlQ29uZmlnX0luY3JlbWVudGFsU3RhdGVDb25maWdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19J
bmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX2NsZWFyX3BlcmlvZF9tcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBjbGVhcl9wZXJpb2RfbXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFz
X3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29u
ZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBUcmFjZUNvbmZpZ19JbmNyZW1lbnRhbFN0YXRlQ29uZmlnX0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrQ2xlYXJQZXJpb2RNc0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsK
KyAgdm9pZCBzZXRfY2xlYXJfcGVyaW9kX21zKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfVHJpZ2dlckNv
bmZpZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7
CisgcHVibGljOgorICBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUcmFjZUNv
bmZpZ19UcmlnZ2VyQ29uZmlnX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX3RyaWdnZXJfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBp
bnQzMl90IHRyaWdnZXJfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc190cmlnZ2VycygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzPiB0cmlnZ2VycygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzPigyKTsgfQorICBib29sIGhhc190cmlnZ2VyX3RpbWVvdXRfbXMoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdHJpZ2dlcl90aW1lb3V0
X21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3Mg
VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RyaWdnZXJNb2RlRmllbGROdW1iZXIg
PSAxLAorICAgIGtUcmlnZ2Vyc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrVHJpZ2dlclRpbWVvdXRN
c0ZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdXNpbmcgVHJpZ2dlciA9IDo6cGVyZmV0dG86OnBy
b3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19UcmlnZ2VyQ29uZmlnX1RyaWdnZXI7CisgIHVzaW5n
IFRyaWdnZXJNb2RlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRyYWNlQ29uZmlnX1Ry
aWdnZXJDb25maWdfVHJpZ2dlck1vZGU7CisgIHN0YXRpYyBjb25zdCBUcmlnZ2VyTW9kZSBVTlNQ
RUNJRklFRCA9IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dlck1vZGVfVU5TUEVDSUZJ
RUQ7CisgIHN0YXRpYyBjb25zdCBUcmlnZ2VyTW9kZSBTVEFSVF9UUkFDSU5HID0gVHJhY2VDb25m
aWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9kZV9TVEFSVF9UUkFDSU5HOworICBzdGF0aWMgY29u
c3QgVHJpZ2dlck1vZGUgU1RPUF9UUkFDSU5HID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19U
cmlnZ2VyTW9kZV9TVE9QX1RSQUNJTkc7CisgIHZvaWQgc2V0X3RyaWdnZXJfbW9kZSg6OnBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyTW9k
ZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyPiBUKiBh
ZGRfdHJpZ2dlcnMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyKTsKKyAg
fQorCisgIHZvaWQgc2V0X3RyaWdnZXJfdGltZW91dF9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRyYWNlQ29uZmlnX1Ry
aWdnZXJDb25maWdfVHJpZ2dlcl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVHJhY2VDb25maWdfVHJpZ2dlckNvbmZpZ19U
cmlnZ2VyX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX1RyaWdnZXJD
b25maWdfVHJpZ2dlcl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX1RyaWdnZXJDb25maWdfVHJpZ2dl
cl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5h
bWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3By
b2R1Y2VyX25hbWVfcmVnZXgoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Q2hhcnMgcHJvZHVjZXJfbmFtZV9yZWdleCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc3RvcF9kZWxheV9tcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzdG9wX2RlbGF5X21z
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgVHJh
Y2VDb25maWdfVHJpZ2dlckNvbmZpZ19UcmlnZ2VyIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNz
YWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFjZUNvbmZpZ19UcmlnZ2VyQ29u
ZmlnX1RyaWdnZXJfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGRO
dW1iZXIgPSAxLAorICAgIGtQcm9kdWNlck5hbWVSZWdleEZpZWxkTnVtYmVyID0gMiwKKyAgICBr
U3RvcERlbGF5TXNGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF9wcm9kdWNlcl9uYW1lX3JlZ2V4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lk
IHNldF9wcm9kdWNlcl9uYW1lX3JlZ2V4KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RvcF9k
ZWxheV9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7Cisg
IH0KK307CisKK2NsYXNzIFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlc19EZWNvZGVyIDog
cHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEs
IC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAg
VHJhY2VDb25maWdfR3VhcmRyYWlsT3ZlcnJpZGVzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IFRyYWNlQ29uZmlnX0d1YXJkcmFpbE92ZXJyaWRlc19EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmln
X0d1YXJkcmFpbE92ZXJyaWRlc19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19tYXhfdXBsb2FkX3Blcl9kYXlfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgbWF4X3VwbG9hZF9wZXJfZGF5X2J5dGVzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfR3Vh
cmRyYWlsT3ZlcnJpZGVzIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBUcmFjZUNvbmZpZ19HdWFyZHJhaWxPdmVycmlkZXNfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtNYXhVcGxvYWRQZXJEYXlCeXRlc0ZpZWxkTnVt
YmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfbWF4X3VwbG9hZF9wZXJfZGF5X2J5dGVzKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xh
c3MgVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGFfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVy
bzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURf
UkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRyYWNlQ29uZmlnX1N0YXRz
ZE1ldGFkYXRhX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX1N0YXRz
ZE1ldGFkYXRhX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgVHJhY2VDb25maWdfU3RhdHNkTWV0YWRhdGFfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdHJpZ2dlcmluZ19hbGVydF9pZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHRyaWdnZXJpbmdfYWxl
cnRfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNf
dHJpZ2dlcmluZ19jb25maWdfdWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9
CisgIGludDMyX3QgdHJpZ2dlcmluZ19jb25maWdfdWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RyaWdnZXJpbmdfY29uZmlnX2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdHJpZ2dlcmluZ19jb25maWdf
aWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfdHJp
Z2dlcmluZ19zdWJzY3JpcHRpb25faWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7
IH0KKyAgaW50NjRfdCB0cmlnZ2VyaW5nX3N1YnNjcmlwdGlvbl9pZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkuYXNfaW50NjQoKTsgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfU3RhdHNkTWV0
YWRhdGEgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IFRyYWNlQ29uZmlnX1N0YXRzZE1ldGFkYXRhX0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrVHJpZ2dlcmluZ0FsZXJ0SWRGaWVsZE51bWJlciA9IDEsCisgICAga1Ry
aWdnZXJpbmdDb25maWdVaWRGaWVsZE51bWJlciA9IDIsCisgICAga1RyaWdnZXJpbmdDb25maWdJ
ZEZpZWxkTnVtYmVyID0gMywKKyAgICBrVHJpZ2dlcmluZ1N1YnNjcmlwdGlvbklkRmllbGROdW1i
ZXIgPSA0LAorICB9OworICB2b2lkIHNldF90cmlnZ2VyaW5nX2FsZXJ0X2lkKGludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RyaWdn
ZXJpbmdfY29uZmlnX3VpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF90cmlnZ2VyaW5nX2NvbmZpZ19pZChpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90cmlnZ2Vy
aW5nX3N1YnNjcmlwdGlvbl9pZChpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQs
IHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfUHJvZHVjZXJDb25maWdfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IFRyYWNlQ29uZmlnX1Byb2R1Y2VyQ29uZmlnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2VDb25maWdf
UHJvZHVjZXJDb25maWdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
cHJvZHVjZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RDaGFycyBwcm9kdWNlcl9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19zaG1fc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzaG1fc2l6ZV9rYigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGFnZV9zaXplX2tiKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBhZ2Vfc2l6ZV9rYigp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIFRyYWNl
Q29uZmlnX1Byb2R1Y2VyQ29uZmlnIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFjZUNvbmZpZ19Qcm9kdWNlckNvbmZpZ19EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1Byb2R1Y2VyTmFtZUZpZWxkTnVtYmVyID0g
MSwKKyAgICBrU2htU2l6ZUtiRmllbGROdW1iZXIgPSAyLAorICAgIGtQYWdlU2l6ZUtiRmllbGRO
dW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6
ZSgpKTsKKyAgfQorICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNp
emVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfc2htX3NpemVfa2IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhZ2Vfc2l6ZV9rYih1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRyYWNlQ29uZmln
X0J1aWx0aW5EYXRhU291cmNlX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNvdXJj
ZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19CdWlsdGluRGF0YVNv
dXJjZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IFRyYWNlQ29uZmlnX0J1aWx0aW5EYXRhU291cmNlX0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rpc2FibGVfY2xvY2tfc25hcHNob3R0aW5n
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGJvb2wgZGlzYWJsZV9jbG9j
a19zbmFwc2hvdHRpbmcoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2Jvb2woKTsgfQorICBi
b29sIGhhc19kaXNhYmxlX3RyYWNlX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFs
aWQoKTsgfQorICBib29sIGRpc2FibGVfdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfZGlzYWJsZV9zeXN0ZW1faW5mbygpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBib29sIGRpc2FibGVfc3lzdGVtX2luZm8o
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19kaXNhYmxl
X3NlcnZpY2VfZXZlbnRzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGJv
b2wgZGlzYWJsZV9zZXJ2aWNlX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfYm9v
bCgpOyB9CisgIGJvb2wgaGFzX3ByaW1hcnlfdHJhY2VfY2xvY2soKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcmltYXJ5X3RyYWNlX2Nsb2NrKCkgY29uc3Qg
eyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3NuYXBzaG90X2ludGVy
dmFsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHNu
YXBzaG90X2ludGVydmFsX21zKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsg
fQorfTsKKworY2xhc3MgVHJhY2VDb25maWdfQnVpbHRpbkRhdGFTb3VyY2UgOiBwdWJsaWMgOjpw
cm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNlQ29u
ZmlnX0J1aWx0aW5EYXRhU291cmNlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
RGlzYWJsZUNsb2NrU25hcHNob3R0aW5nRmllbGROdW1iZXIgPSAxLAorICAgIGtEaXNhYmxlVHJh
Y2VDb25maWdGaWVsZE51bWJlciA9IDIsCisgICAga0Rpc2FibGVTeXN0ZW1JbmZvRmllbGROdW1i
ZXIgPSAzLAorICAgIGtEaXNhYmxlU2VydmljZUV2ZW50c0ZpZWxkTnVtYmVyID0gNCwKKyAgICBr
UHJpbWFyeVRyYWNlQ2xvY2tGaWVsZE51bWJlciA9IDUsCisgICAga1NuYXBzaG90SW50ZXJ2YWxN
c0ZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKyAgdm9pZCBzZXRfZGlzYWJsZV9jbG9ja19zbmFwc2hv
dHRpbmcoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2Rpc2FibGVfdHJhY2VfY29uZmlnKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBl
bmRUaW55VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kaXNhYmxlX3N5c3RlbV9p
bmZvKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDMsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9kaXNhYmxlX3NlcnZpY2VfZXZlbnRzKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBl
bmRUaW55VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wcmltYXJ5X3RyYWNlX2Ns
b2NrKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpCdWlsdGluQ2xvY2sgdmFsdWUpIHsKKyAg
ICBBcHBlbmRUaW55VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zbmFwc2hvdF9p
bnRlcnZhbF9tcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIFRyYWNlQ29uZmlnX0RhdGFTb3VyY2VfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgVHJhY2VD
b25maWdfRGF0YVNvdXJjZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4p
IDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZp
Z19EYXRhU291cmNlX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3
LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2VDb25maWdfRGF0YVNvdXJjZV9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jb25maWcoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY29uZmlnKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Byb2R1Y2VyX25h
bWVfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IHByb2R1
Y2VyX25hbWVfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86
OkNvbnN0Q2hhcnM+KDIpOyB9CisgIGJvb2wgaGFzX3Byb2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVy
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IHByb2R1Y2VyX25hbWVf
cmVnZXhfZmlsdGVyKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Q2hhcnM+KDMpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19EYXRhU291cmNlIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBU
cmFjZUNvbmZpZ19EYXRhU291cmNlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
Q29uZmlnRmllbGROdW1iZXIgPSAxLAorICAgIGtQcm9kdWNlck5hbWVGaWx0ZXJGaWVsZE51bWJl
ciA9IDIsCisgICAga1Byb2R1Y2VyTmFtZVJlZ2V4RmlsdGVyRmllbGROdW1iZXIgPSAzLAorICB9
OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERhdGFTb3VyY2VDb25maWc+IFQqIHNldF9jb25m
aWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCisgIHZv
aWQgYWRkX3Byb2R1Y2VyX25hbWVfZmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIGFkZF9wcm9kdWNlcl9uYW1lX2ZpbHRlcihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgYWRkX3By
b2R1Y2VyX25hbWVfcmVnZXhfZmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lk
IGFkZF9wcm9kdWNlcl9uYW1lX3JlZ2V4X2ZpbHRlcihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFz
cyBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRyYWNlQ29uZmlnX0J1ZmZlckNv
bmZpZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25m
aWdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRGVjb2Rlcihjb25zdCA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCBy
YXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBzaXplX2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50MzIoKTsgfQorICBib29sIGhhc19maWxsX3BvbGljeSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGZpbGxfcG9saWN5KCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBUcmFjZUNvbmZpZ19CdWZmZXJDb25m
aWcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZpZ19EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga1NpemVLYkZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmlsbFBvbGljeUZpZWxkTnVt
YmVyID0gNCwKKyAgfTsKKyAgdXNpbmcgRmlsbFBvbGljeSA9IDo6cGVyZmV0dG86OnByb3Rvczo6
cGJ6ZXJvOjpUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeTsKKyAgc3RhdGljIGNv
bnN0IEZpbGxQb2xpY3kgVU5TUEVDSUZJRUQgPSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmls
bFBvbGljeV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IEZpbGxQb2xpY3kgUklOR19CVUZG
RVIgPSBUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdfRmlsbFBvbGljeV9SSU5HX0JVRkZFUjsKKyAg
c3RhdGljIGNvbnN0IEZpbGxQb2xpY3kgRElTQ0FSRCA9IFRyYWNlQ29uZmlnX0J1ZmZlckNvbmZp
Z19GaWxsUG9saWN5X0RJU0NBUkQ7CisgIHZvaWQgc2V0X3NpemVfa2IodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZpbGxfcG9s
aWN5KDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFjZUNvbmZpZ19CdWZmZXJDb25maWdf
RmlsbFBvbGljeSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9
Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2Uu
CisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Nsb2NrX3NuYXBzaG90LnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0NM
T0NLX1NOQVBTSE9UX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVS
RkVUVE9fVFJBQ0VfQ0xPQ0tfU05BUFNIT1RfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5o
PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9m
aWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2Ns
YXNzIENsb2NrU25hcHNob3RfQ2xvY2s7CitlbnVtIEJ1aWx0aW5DbG9jayA6IGludDMyX3Q7CisK
K2VudW0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzIDogaW50MzJfdCB7CisgIENs
b2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19VTktOT1dOID0gMCwKKyAgQ2xvY2tTbmFw
c2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX1JFQUxUSU1FID0gMSwKKyAgQ2xvY2tTbmFwc2hvdF9D
bG9ja19CdWlsdGluQ2xvY2tzX1JFQUxUSU1FX0NPQVJTRSA9IDIsCisgIENsb2NrU25hcHNob3Rf
Q2xvY2tfQnVpbHRpbkNsb2Nrc19NT05PVE9OSUMgPSAzLAorICBDbG9ja1NuYXBzaG90X0Nsb2Nr
X0J1aWx0aW5DbG9ja3NfTU9OT1RPTklDX0NPQVJTRSA9IDQsCisgIENsb2NrU25hcHNob3RfQ2xv
Y2tfQnVpbHRpbkNsb2Nrc19NT05PVE9OSUNfUkFXID0gNSwKKyAgQ2xvY2tTbmFwc2hvdF9DbG9j
a19CdWlsdGluQ2xvY2tzX0JPT1RUSU1FID0gNiwKKyAgQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWls
dGluQ2xvY2tzX0JVSUxUSU5fQ0xPQ0tfTUFYX0lEID0gNjMsCit9OworCitjb25zdCBDbG9ja1Nu
YXBzaG90X0Nsb2NrX0J1aWx0aW5DbG9ja3MgQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xv
Y2tzX01JTiA9IENsb2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19VTktOT1dOOworY29u
c3QgQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzIENsb2NrU25hcHNob3RfQ2xvY2tf
QnVpbHRpbkNsb2Nrc19NQVggPSBDbG9ja1NuYXBzaG90X0Nsb2NrX0J1aWx0aW5DbG9ja3NfQlVJ
TFRJTl9DTE9DS19NQVhfSUQ7CisKK2NsYXNzIENsb2NrU25hcHNob3RfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgQ2xvY2tT
bmFwc2hvdF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQ
cm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDbG9ja1NuYXBzaG90X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgQ2xvY2tTbmFwc2hvdF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19jbG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gY2xv
Y2tzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+
KDEpOyB9CisgIGJvb2wgaGFzX3ByaW1hcnlfdHJhY2VfY2xvY2soKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcmltYXJ5X3RyYWNlX2Nsb2NrKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBDbG9ja1NuYXBzaG90
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBDbG9ja1NuYXBzaG90X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2xv
Y2tzRmllbGROdW1iZXIgPSAxLAorICAgIGtQcmltYXJ5VHJhY2VDbG9ja0ZpZWxkTnVtYmVyID0g
MiwKKyAgfTsKKyAgdXNpbmcgQ2xvY2sgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6Q2xv
Y2tTbmFwc2hvdF9DbG9jazsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDbG9ja1NuYXBzaG90
X0Nsb2NrPiBUKiBhZGRfY2xvY2tzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8
VD4oMSk7CisgIH0KKworICB2b2lkIHNldF9wcmltYXJ5X3RyYWNlX2Nsb2NrKDo6cGVyZmV0dG86
OnByb3Rvczo6cGJ6ZXJvOjpCdWlsdGluQ2xvY2sgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFy
SW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQ2xvY2tTbmFwc2hvdF9DbG9ja19EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgQ2xvY2tTbmFwc2hvdF9DbG9ja19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBD
bG9ja1NuYXBzaG90X0Nsb2NrX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2xvY2tTbmFwc2hvdF9DbG9ja19EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jbG9ja19pZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjbG9ja19pZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1wKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHRpbWVzdGFtcCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaXNfaW5jcmVtZW50
YWwoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBpc19pbmNyZW1l
bnRhbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3Vu
aXRfbXVsdGlwbGllcl9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCB1bml0X211bHRpcGxpZXJfbnMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3Vp
bnQ2NCgpOyB9Cit9OworCitjbGFzcyBDbG9ja1NuYXBzaG90X0Nsb2NrIDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDbG9ja1NuYXBz
aG90X0Nsb2NrX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2xvY2tJZEZpZWxk
TnVtYmVyID0gMSwKKyAgICBrVGltZXN0YW1wRmllbGROdW1iZXIgPSAyLAorICAgIGtJc0luY3Jl
bWVudGFsRmllbGROdW1iZXIgPSAzLAorICAgIGtVbml0TXVsdGlwbGllck5zRmllbGROdW1iZXIg
PSA0LAorICB9OworICB1c2luZyBCdWlsdGluQ2xvY2tzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpw
Ynplcm86OkNsb2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2NrczsKKyAgc3RhdGljIGNvbnN0
IEJ1aWx0aW5DbG9ja3MgVU5LTk9XTiA9IENsb2NrU25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nr
c19VTktOT1dOOworICBzdGF0aWMgY29uc3QgQnVpbHRpbkNsb2NrcyBSRUFMVElNRSA9IENsb2Nr
U25hcHNob3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19SRUFMVElNRTsKKyAgc3RhdGljIGNvbnN0IEJ1
aWx0aW5DbG9ja3MgUkVBTFRJTUVfQ09BUlNFID0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGlu
Q2xvY2tzX1JFQUxUSU1FX0NPQVJTRTsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5DbG9ja3MgTU9O
T1RPTklDID0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX01PTk9UT05JQzsKKyAg
c3RhdGljIGNvbnN0IEJ1aWx0aW5DbG9ja3MgTU9OT1RPTklDX0NPQVJTRSA9IENsb2NrU25hcHNo
b3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19NT05PVE9OSUNfQ09BUlNFOworICBzdGF0aWMgY29uc3Qg
QnVpbHRpbkNsb2NrcyBNT05PVE9OSUNfUkFXID0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGlu
Q2xvY2tzX01PTk9UT05JQ19SQVc7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluQ2xvY2tzIEJPT1RU
SU1FID0gQ2xvY2tTbmFwc2hvdF9DbG9ja19CdWlsdGluQ2xvY2tzX0JPT1RUSU1FOworICBzdGF0
aWMgY29uc3QgQnVpbHRpbkNsb2NrcyBCVUlMVElOX0NMT0NLX01BWF9JRCA9IENsb2NrU25hcHNo
b3RfQ2xvY2tfQnVpbHRpbkNsb2Nrc19CVUlMVElOX0NMT0NLX01BWF9JRDsKKyAgdm9pZCBzZXRf
Y2xvY2tfaWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3RpbWVzdGFtcCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaXNfaW5jcmVtZW50YWwoYm9vbCB2YWx1
ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Vu
aXRfbXVsdGlwbGllcl9ucyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2
YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8v
IE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJpZ2dlci5wYnplcm8u
aAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8g
Tk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFD
RV9UUklHR0VSX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfVFJJR0dFUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVk
ZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8g
eworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBUcmln
Z2VyX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBUcmlnZ2VyX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyaWdn
ZXJfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBUcmlnZ2VyX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX3RyaWdnZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0cmlnZ2VyX25hbWUoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3Byb2R1Y2VyX25hbWUoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgcHJv
ZHVjZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9v
bCBoYXNfdHJ1c3RlZF9wcm9kdWNlcl91aWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCB0cnVzdGVkX3Byb2R1Y2VyX3VpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgVHJpZ2dlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJpZ2dlcl9EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RyaWdnZXJOYW1lRmllbGROdW1iZXIgPSAx
LAorICAgIGtQcm9kdWNlck5hbWVGaWVsZE51bWJlciA9IDIsCisgICAga1RydXN0ZWRQcm9kdWNl
clVpZEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfdHJpZ2dlcl9uYW1lKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF90cmlnZ2VyX25hbWUoY29uc3QgY2hhciog
ZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAg
fQorICB2b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIHNldF9wcm9kdWNlcl9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfdHJ1c3RlZF9w
cm9kdWNlcl91aWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7
CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2Uvc3lzdGVtX2luZm8ucGJ6ZXJvLmgK
Ky8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5P
VCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
U1lTVEVNX0lORk9fUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19UUkFDRV9TWVNURU1fSU5GT19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+Cisj
aW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxk
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3Mg
VXRzbmFtZTsKKworY2xhc3MgU3lzdGVtSW5mb19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgU3lzdGVtSW5mb19EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBTeXN0ZW1JbmZvX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU3lzdGVtSW5mb19E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc191dHNuYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHV0
c25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
YW5kcm9pZF9idWlsZF9maW5nZXJwcmludCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBhbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19oeigp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGh6KCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBTeXN0ZW1JbmZvIDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBTeXN0ZW1JbmZvX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVXRzbmFtZUZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrQW5kcm9pZEJ1aWxkRmluZ2VycHJpbnRGaWVsZE51bWJlciA9
IDIsCisgICAga0h6RmllbGROdW1iZXIgPSAzLAorICB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IFV0c25hbWU+IFQqIHNldF91dHNuYW1lKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oMSk7CisgIH0KKworICB2b2lkIHNldF9hbmRyb2lkX2J1aWxkX2ZpbmdlcnByaW50
KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRh
dGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9hbmRyb2lkX2J1aWxkX2Zpbmdl
cnByaW50KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
MiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfaHooaW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFV0c25hbWVfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIFV0c25hbWVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVXRzbmFtZV9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IFV0c25hbWVfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfc3lz
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBzeXNuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsg
fQorICBib29sIGhhc192ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3JlbGVhc2UoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgcmVsZWFzZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfbWFjaGluZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RD
aGFycyBtYWNoaW5lKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19zdHJpbmcoKTsgfQorfTsK
KworY2xhc3MgVXRzbmFtZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gVXRzbmFtZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga1N5c25hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1ZlcnNpb25GaWVsZE51bWJlciA9
IDIsCisgICAga1JlbGVhc2VGaWVsZE51bWJlciA9IDMsCisgICAga01hY2hpbmVGaWVsZE51bWJl
ciA9IDQsCisgIH07CisgIHZvaWQgc2V0X3N5c25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9
CisgIHZvaWQgc2V0X3N5c25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAg
ICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF92ZXJzaW9uKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF92ZXJzaW9uKGNvbnN0IGNoYXIqIGRh
dGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0K
KyAgdm9pZCBzZXRfcmVsZWFzZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBl
bmRCeXRlcygzLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRf
cmVsZWFzZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDMsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X21hY2hpbmUoY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXpl
KCkpOworICB9CisgIHZvaWQgc2V0X21hY2hpbmUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNp
emUpIHsKKyAgICBBcHBlbmRCeXRlcyg0LCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworfSAvLyBO
YW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJ
bmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rv
cy9wZXJmZXR0by90cmFjZS9hbmRyb2lkL2FuZHJvaWRfbG9nLnBiemVyby5oCisvLyBBdXRvZ2Vu
ZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKwor
I2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0FORFJPSURfQU5E
Uk9JRF9MT0dfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9BTkRST0lEX0FORFJPSURfTE9HX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYu
aD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRf
ZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitj
bGFzcyBBbmRyb2lkTG9nUGFja2V0X0xvZ0V2ZW50OworY2xhc3MgQW5kcm9pZExvZ1BhY2tldF9M
b2dFdmVudF9Bcmc7CitjbGFzcyBBbmRyb2lkTG9nUGFja2V0X1N0YXRzOworZW51bSBBbmRyb2lk
TG9nSWQgOiBpbnQzMl90OworZW51bSBBbmRyb2lkTG9nUHJpb3JpdHkgOiBpbnQzMl90OworCitj
bGFzcyBBbmRyb2lkTG9nUGFja2V0X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIEFuZHJvaWRMb2dQYWNrZXRfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgQW5kcm9pZExvZ1BhY2tldF9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEFuZHJvaWRM
b2dQYWNrZXRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZXZlbnRz
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGV2ZW50cygpIGNvbnN0
IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxKTsgfQorICBi
b29sIGhhc19zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBzdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYnl0
ZXMoKTsgfQorfTsKKworY2xhc3MgQW5kcm9pZExvZ1BhY2tldCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQW5kcm9pZExvZ1BhY2tl
dF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0V2ZW50c0ZpZWxkTnVtYmVyID0g
MSwKKyAgICBrU3RhdHNGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHVzaW5nIExvZ0V2ZW50ID0g
OjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkFuZHJvaWRMb2dQYWNrZXRfTG9nRXZlbnQ7Cisg
IHVzaW5nIFN0YXRzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkFuZHJvaWRMb2dQYWNr
ZXRfU3RhdHM7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQW5kcm9pZExvZ1BhY2tldF9Mb2dF
dmVudD4gVCogYWRkX2V2ZW50cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBBbmRyb2lkTG9nUGFja2V0X1N0
YXRzPiBUKiBzZXRfc3RhdHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigy
KTsKKyAgfQorCit9OworCitjbGFzcyBBbmRyb2lkTG9nUGFja2V0X1N0YXRzX0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBB
bmRyb2lkTG9nUGFja2V0X1N0YXRzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEFuZHJv
aWRMb2dQYWNrZXRfU3RhdHNfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBBbmRyb2lkTG9nUGFja2V0X1N0YXRzX0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX251bV90b3RhbCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBudW1fdG90YWwoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX251bV9mYWlsZWQoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbnVtX2ZhaWxlZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnVtX3Nr
aXBwZWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbnVt
X3NraXBwZWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitj
bGFzcyBBbmRyb2lkTG9nUGFja2V0X1N0YXRzIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBBbmRyb2lkTG9nUGFja2V0X1N0YXRzX0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTnVtVG90YWxGaWVsZE51bWJlciA9IDEs
CisgICAga051bUZhaWxlZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrTnVtU2tpcHBlZEZpZWxkTnVt
YmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfbnVtX3RvdGFsKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9udW1fZmFpbGVkKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9udW1fc2tpcHBlZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEFuZHJvaWRMb2dQYWNrZXRfTG9nRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki85LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoK
KyAgQW5kcm9pZExvZ1BhY2tldF9Mb2dFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBBbmRyb2lkTG9nUGFja2V0X0xvZ0V2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQW5kcm9pZExvZ1BhY2tldF9M
b2dFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19sb2dfaWQo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBsb2dfaWQoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcGlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHRpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc191aWQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCB1aWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFz
X2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHRpbWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfdGFnKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHRhZygpIGNvbnN0IHsgcmV0
dXJuIGF0PDY+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfcHJpbygpIGNvbnN0IHsgcmV0
dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHByaW8oKSBjb25zdCB7IHJldHVybiBh
dDw3PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBtZXNzYWdlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19hcmdzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRl
ZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGFyZ3MoKSBjb25zdCB7IHJl
dHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oOSk7IH0KK307CisKK2Ns
YXNzIEFuZHJvaWRMb2dQYWNrZXRfTG9nRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEFuZHJvaWRMb2dQYWNrZXRfTG9nRXZl
bnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtMb2dJZEZpZWxkTnVtYmVyID0g
MSwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAyLAorICAgIGtUaWRGaWVsZE51bWJlciA9IDMsCisg
ICAga1VpZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrVGltZXN0YW1wRmllbGROdW1iZXIgPSA1LAor
ICAgIGtUYWdGaWVsZE51bWJlciA9IDYsCisgICAga1ByaW9GaWVsZE51bWJlciA9IDcsCisgICAg
a01lc3NhZ2VGaWVsZE51bWJlciA9IDgsCisgICAga0FyZ3NGaWVsZE51bWJlciA9IDksCisgIH07
CisgIHVzaW5nIEFyZyA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpBbmRyb2lkTG9nUGFj
a2V0X0xvZ0V2ZW50X0FyZzsKKyAgdm9pZCBzZXRfbG9nX2lkKDo6cGVyZmV0dG86OnByb3Rvczo6
cGJ6ZXJvOjpBbmRyb2lkTG9nSWQgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9waWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGlkKGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3VpZChpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90aW1l
c3RhbXAodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3RhZyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRC
eXRlcyg2LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfdGFn
KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNiwgZGF0
YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJpbyg6OnBlcmZldHRvOjpwcm90b3M6OnBiemVy
bzo6QW5kcm9pZExvZ1ByaW9yaXR5IHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg3LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUp
IHsKKyAgICBBcHBlbmRCeXRlcyg4LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0K
KyAgdm9pZCBzZXRfbWVzc2FnZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDgsIGRhdGEsIHNpemUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gQW5kcm9pZExvZ1BhY2tldF9Mb2dFdmVudF9Bcmc+IFQqIGFkZF9hcmdzKCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oOSk7CisgIH0KKworfTsKKworY2xhc3MgQW5kcm9p
ZExvZ1BhY2tldF9Mb2dFdmVudF9BcmdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlw
ZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFU
RURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEFuZHJvaWRMb2dQYWNrZXRfTG9nRXZl
bnRfQXJnX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEFuZHJvaWRMb2dQYWNrZXRfTG9n
RXZlbnRfQXJnX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgQW5kcm9pZExvZ1BhY2tldF9Mb2dFdmVudF9BcmdfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19pbnRfdmFsdWUo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBpbnRfdmFsdWUo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfZmxvYXRf
dmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgZmxvYXQgZmxvYXRf
dmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2Zsb2F0KCk7IH0KKyAgYm9vbCBoYXNf
c3RyaW5nX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdENoYXJzIHN0cmluZ192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCku
YXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEFuZHJvaWRMb2dQYWNrZXRfTG9nRXZlbnRfQXJn
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBBbmRyb2lkTG9nUGFja2V0X0xvZ0V2ZW50X0FyZ19EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga0ludFZhbHVlRmllbGROdW1i
ZXIgPSAyLAorICAgIGtGbG9hdFZhbHVlRmllbGROdW1iZXIgPSAzLAorICAgIGtTdHJpbmdWYWx1
ZUZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmlu
ZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUo
KSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2ludF92
YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9mbG9hdF92YWx1ZShmbG9hdCB2YWx1ZSkgeworICAgIEFwcGVuZEZpeGVkKDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIGRhdGEsIHNpemUpOworICB9Cit9OworCit9IC8v
IE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8v
IEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJv
dG9zL3BlcmZldHRvL3RyYWNlL2FuZHJvaWQvZ3B1X21lbV9ldmVudC5wYnplcm8uaAorLy8gQXV0
b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQu
CisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9BTkRST0lE
X0dQVV9NRU1fRVZFTlRfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9BTkRST0lEX0dQVV9NRU1fRVZFTlRfUFJPVE9fSF8KKworI2luY2x1ZGUg
PHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9y
ZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVy
byB7CisKKworY2xhc3MgR3B1TWVtVG90YWxFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgR3B1TWVtVG90YWxFdmVu
dF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBHcHVNZW1Ub3RhbEV2ZW50X0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgR3B1TWVtVG90YWxFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19ncHVfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgZ3B1X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
cGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19z
aXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNpemUo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBHcHVN
ZW1Ub3RhbEV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBHcHVNZW1Ub3RhbEV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrR3B1SWRGaWVsZE51bWJlciA9IDEsCisgICAga1BpZEZpZWxkTnVtYmVyID0g
MiwKKyAgICBrU2l6ZUZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfZ3B1X2lkKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9waWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3NpemUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgor
fSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdh
bWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2FuZHJvaWQvZ3Jh
cGhpY3NfZnJhbWVfZXZlbnQucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3Rv
WmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfQU5EUk9JRF9HUkFQSElDU19GUkFNRV9FVkVOVF9Q
Uk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0FO
RFJPSURfR1JBUEhJQ1NfRlJBTUVfRVZFTlRfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5o
PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9m
aWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2Ns
YXNzIEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudDsKK2VudW0gR3JhcGhpY3NGcmFtZUV2
ZW50X0J1ZmZlckV2ZW50VHlwZSA6IGludDMyX3Q7CisKK2VudW0gR3JhcGhpY3NGcmFtZUV2ZW50
X0J1ZmZlckV2ZW50VHlwZSA6IGludDMyX3QgeworICBHcmFwaGljc0ZyYW1lRXZlbnRfQnVmZmVy
RXZlbnRUeXBlX1VOU1BFQ0lGSUVEID0gMCwKKyAgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2
ZW50VHlwZV9ERVFVRVVFID0gMSwKKyAgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlw
ZV9RVUVVRSA9IDIsCisgIEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGVfUE9TVCA9
IDMsCisgIEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGVfQUNRVUlSRV9GRU5DRSA9
IDQsCisgIEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGVfTEFUQ0ggPSA1LAorICBH
cmFwaGljc0ZyYW1lRXZlbnRfQnVmZmVyRXZlbnRUeXBlX0hXQ19DT01QT1NJVElPTl9RVUVVRUQg
PSA2LAorICBHcmFwaGljc0ZyYW1lRXZlbnRfQnVmZmVyRXZlbnRUeXBlX0ZBTExCQUNLX0NPTVBP
U0lUSU9OID0gNywKKyAgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9QUkVTRU5U
X0ZFTkNFID0gOCwKKyAgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9SRUxFQVNF
X0ZFTkNFID0gOSwKKyAgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9NT0RJRlkg
PSAxMCwKKyAgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9ERVRBQ0ggPSAxMSwK
KyAgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9BVFRBQ0ggPSAxMiwKKyAgR3Jh
cGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9DQU5DRUwgPSAxMywKK307CisKK2NvbnN0
IEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGUgR3JhcGhpY3NGcmFtZUV2ZW50X0J1
ZmZlckV2ZW50VHlwZV9NSU4gPSBHcmFwaGljc0ZyYW1lRXZlbnRfQnVmZmVyRXZlbnRUeXBlX1VO
U1BFQ0lGSUVEOworY29uc3QgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZSBHcmFw
aGljc0ZyYW1lRXZlbnRfQnVmZmVyRXZlbnRUeXBlX01BWCA9IEdyYXBoaWNzRnJhbWVFdmVudF9C
dWZmZXJFdmVudFR5cGVfQ0FOQ0VMOworCitjbGFzcyBHcmFwaGljc0ZyYW1lRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIEdyYXBoaWNzRnJhbWVFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBHcmFw
aGljc0ZyYW1lRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCBy
YXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBHcmFwaGljc0ZyYW1lRXZlbnRfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfYnVmZmVyX2V2ZW50KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJ1ZmZlcl9l
dmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfYnl0ZXMoKTsgfQorfTsKKworY2xhc3Mg
R3JhcGhpY3NGcmFtZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBHcmFwaGljc0ZyYW1lRXZlbnRfRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtCdWZmZXJFdmVudEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAg
dXNpbmcgQnVmZmVyRXZlbnQgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6R3JhcGhpY3NG
cmFtZUV2ZW50X0J1ZmZlckV2ZW50OworICB1c2luZyBCdWZmZXJFdmVudFR5cGUgPSA6OnBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6R3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZTsK
KyAgc3RhdGljIGNvbnN0IEJ1ZmZlckV2ZW50VHlwZSBVTlNQRUNJRklFRCA9IEdyYXBoaWNzRnJh
bWVFdmVudF9CdWZmZXJFdmVudFR5cGVfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBCdWZm
ZXJFdmVudFR5cGUgREVRVUVVRSA9IEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGVf
REVRVUVVRTsKKyAgc3RhdGljIGNvbnN0IEJ1ZmZlckV2ZW50VHlwZSBRVUVVRSA9IEdyYXBoaWNz
RnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGVfUVVFVUU7CisgIHN0YXRpYyBjb25zdCBCdWZmZXJF
dmVudFR5cGUgUE9TVCA9IEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGVfUE9TVDsK
KyAgc3RhdGljIGNvbnN0IEJ1ZmZlckV2ZW50VHlwZSBBQ1FVSVJFX0ZFTkNFID0gR3JhcGhpY3NG
cmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9BQ1FVSVJFX0ZFTkNFOworICBzdGF0aWMgY29uc3Qg
QnVmZmVyRXZlbnRUeXBlIExBVENIID0gR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlw
ZV9MQVRDSDsKKyAgc3RhdGljIGNvbnN0IEJ1ZmZlckV2ZW50VHlwZSBIV0NfQ09NUE9TSVRJT05f
UVVFVUVEID0gR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9IV0NfQ09NUE9TSVRJ
T05fUVVFVUVEOworICBzdGF0aWMgY29uc3QgQnVmZmVyRXZlbnRUeXBlIEZBTExCQUNLX0NPTVBP
U0lUSU9OID0gR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9GQUxMQkFDS19DT01Q
T1NJVElPTjsKKyAgc3RhdGljIGNvbnN0IEJ1ZmZlckV2ZW50VHlwZSBQUkVTRU5UX0ZFTkNFID0g
R3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9QUkVTRU5UX0ZFTkNFOworICBzdGF0
aWMgY29uc3QgQnVmZmVyRXZlbnRUeXBlIFJFTEVBU0VfRkVOQ0UgPSBHcmFwaGljc0ZyYW1lRXZl
bnRfQnVmZmVyRXZlbnRUeXBlX1JFTEVBU0VfRkVOQ0U7CisgIHN0YXRpYyBjb25zdCBCdWZmZXJF
dmVudFR5cGUgTU9ESUZZID0gR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9NT0RJ
Rlk7CisgIHN0YXRpYyBjb25zdCBCdWZmZXJFdmVudFR5cGUgREVUQUNIID0gR3JhcGhpY3NGcmFt
ZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9ERVRBQ0g7CisgIHN0YXRpYyBjb25zdCBCdWZmZXJFdmVu
dFR5cGUgQVRUQUNIID0gR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50VHlwZV9BVFRBQ0g7
CisgIHN0YXRpYyBjb25zdCBCdWZmZXJFdmVudFR5cGUgQ0FOQ0VMID0gR3JhcGhpY3NGcmFtZUV2
ZW50X0J1ZmZlckV2ZW50VHlwZV9DQU5DRUw7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3Jh
cGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50PiBUKiBzZXRfYnVmZmVyX2V2ZW50KCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMSk7CisgIH0KKworfTsKKworY2xhc3MgR3Jh
cGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JF
UEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBHcmFwaGljc0ZyYW1lRXZlbnRf
QnVmZmVyRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgR3JhcGhpY3NGcmFtZUV2
ZW50X0J1ZmZlckV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgR3JhcGhpY3NGcmFtZUV2ZW50X0J1ZmZlckV2ZW50
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2ZyYW1lX251bWJlcigp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmcmFtZV9udW1i
ZXIoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3R5
cGUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCB0eXBlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2xheWVyX25h
bWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Q2hhcnMgbGF5ZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7
IH0KKyAgYm9vbCBoYXNfZHVyYXRpb25fbnMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgZHVyYXRpb25fbnMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2J1ZmZlcl9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBidWZmZXJfaWQoKSBjb25zdCB7IHJldHVybiBhdDw1
PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBHcmFwaGljc0ZyYW1lRXZlbnRfQnVmZmVy
RXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IEdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudF9EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga0ZyYW1lTnVtYmVyRmllbGROdW1iZXIgPSAxLAorICAgIGtUeXBl
RmllbGROdW1iZXIgPSAyLAorICAgIGtMYXllck5hbWVGaWVsZE51bWJlciA9IDMsCisgICAga0R1
cmF0aW9uTnNGaWVsZE51bWJlciA9IDQsCisgICAga0J1ZmZlcklkRmllbGROdW1iZXIgPSA1LAor
ICB9OworICB2b2lkIHNldF9mcmFtZV9udW1iZXIodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3R5cGUoOjpwZXJmZXR0bzo6cHJv
dG9zOjpwYnplcm86OkdyYXBoaWNzRnJhbWVFdmVudF9CdWZmZXJFdmVudFR5cGUgdmFsdWUpIHsK
KyAgICBBcHBlbmRUaW55VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYXllcl9u
YW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9sYXllcl9uYW1lKGNvbnN0
IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgZGF0YSwgc2l6
ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHVyYXRpb25fbnModWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2J1ZmZlcl9pZCh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8g
TmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8g
SW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90
b3MvcGVyZmV0dG8vdHJhY2UvYW5kcm9pZC9pbml0aWFsX2Rpc3BsYXlfc3RhdGUucGJ6ZXJvLmgK
Ky8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5P
VCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
QU5EUk9JRF9JTklUSUFMX0RJU1BMQVlfU1RBVEVfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9f
UFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9BTkRST0lEX0lOSVRJQUxfRElTUExBWV9TVEFU
RV9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHBy
b3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBJbml0aWFsRGlzcGxheVN0YXRl
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBJbml0aWFsRGlzcGxheVN0YXRlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEluaXRpYWxEaXNwbGF5U3RhdGVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5k
YXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBJbml0aWFsRGlzcGxheVN0YXRlX0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rpc3BsYXlfc3RhdGUoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBkaXNwbGF5X3N0YXRl
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2JyaWdo
dG5lc3MoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgZG91YmxlIGJyaWdo
dG5lc3MoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2RvdWJsZSgpOyB9Cit9OworCitjbGFz
cyBJbml0aWFsRGlzcGxheVN0YXRlIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJbml0aWFsRGlzcGxheVN0YXRlX0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGlzcGxheVN0YXRlRmllbGROdW1iZXIgPSAxLAorICAg
IGtCcmlnaHRuZXNzRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9kaXNwbGF5X3N0
YXRlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2JyaWdodG5lc3MoZG91YmxlIHZhbHVlKSB7CisgICAgQXBwZW5kRml4ZWQoMiwg
dmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2FuZHJvaWQvcGFja2Fn
ZXNfbGlzdC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBp
bGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9BTkRST0lEX1BBQ0tBR0VTX0xJU1RfUFJPVE9fSF8KKyNkZWZpbmUg
UEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9BTkRST0lEX1BBQ0tBR0VTX0xJ
U1RfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVy
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBw
cm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIFBhY2thZ2VzTGlzdF9QYWNrYWdl
SW5mbzsKKworY2xhc3MgUGFja2FnZXNMaXN0X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JF
UEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFBhY2thZ2VzTGlzdF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBQYWNrYWdlc0xpc3RfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBQYWNrYWdlc0xp
c3RfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGFja2FnZXMoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gcGFja2FnZXMoKSBjb25zdCB7
IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KKyAgYm9v
bCBoYXNfcGFyc2VfZXJyb3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
Ym9vbCBwYXJzZV9lcnJvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYm9vbCgpOyB9Cisg
IGJvb2wgaGFzX3JlYWRfZXJyb3IoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgYm9vbCByZWFkX2Vycm9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19ib29sKCk7IH0K
K307CisKK2NsYXNzIFBhY2thZ2VzTGlzdCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUGFja2FnZXNMaXN0X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrUGFja2FnZXNGaWVsZE51bWJlciA9IDEsCisgICAga1BhcnNl
RXJyb3JGaWVsZE51bWJlciA9IDIsCisgICAga1JlYWRFcnJvckZpZWxkTnVtYmVyID0gMywKKyAg
fTsKKyAgdXNpbmcgUGFja2FnZUluZm8gPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6UGFj
a2FnZXNMaXN0X1BhY2thZ2VJbmZvOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFBhY2thZ2Vz
TGlzdF9QYWNrYWdlSW5mbz4gVCogYWRkX3BhY2thZ2VzKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMSk7CisgIH0KKworICB2b2lkIHNldF9wYXJzZV9lcnJvcihib29sIHZh
bHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
cmVhZF9lcnJvcihib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgzLCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIFBhY2thZ2VzTGlzdF9QYWNrYWdlSW5mb19EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUGFj
a2FnZXNMaXN0X1BhY2thZ2VJbmZvX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFBhY2th
Z2VzTGlzdF9QYWNrYWdlSW5mb19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEo
KSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFBhY2thZ2VzTGlzdF9QYWNrYWdlSW5mb19E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3VpZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB1aWQoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2RlYnVnZ2FibGUo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBkZWJ1Z2dhYmxlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfcHJvZmlsZWFi
bGVfZnJvbV9zaGVsbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBib29s
IHByb2ZpbGVhYmxlX2Zyb21fc2hlbGwoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2Jvb2wo
KTsgfQorICBib29sIGhhc192ZXJzaW9uX2NvZGUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZh
bGlkKCk7IH0KKyAgaW50NjRfdCB2ZXJzaW9uX2NvZGUoKSBjb25zdCB7IHJldHVybiBhdDw1Pigp
LmFzX2ludDY0KCk7IH0KK307CisKK2NsYXNzIFBhY2thZ2VzTGlzdF9QYWNrYWdlSW5mbyA6IHB1
YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0g
UGFja2FnZXNMaXN0X1BhY2thZ2VJbmZvX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrVWlkRmllbGROdW1iZXIgPSAyLAorICAgIGtE
ZWJ1Z2dhYmxlRmllbGROdW1iZXIgPSAzLAorICAgIGtQcm9maWxlYWJsZUZyb21TaGVsbEZpZWxk
TnVtYmVyID0gNCwKKyAgICBrVmVyc2lvbkNvZGVGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZv
aWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMo
MSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBz
aXplKTsKKyAgfQorICB2b2lkIHNldF91aWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RlYnVnZ2FibGUoYm9vbCB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Byb2Zp
bGVhYmxlX2Zyb21fc2hlbGwoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3ZlcnNpb25fY29kZShpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9
IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJk
LgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90
cmFjZS9jaHJvbWUvY2hyb21lX2JlbmNobWFya19tZXRhZGF0YS5wYnplcm8uaAorLy8gQXV0b2dl
bmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisK
KyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9DSFJPTUVfQ0hS
T01FX0JFTkNITUFSS19NRVRBREFUQV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1Nf
UFJPVE9TX1BFUkZFVFRPX1RSQUNFX0NIUk9NRV9DSFJPTUVfQkVOQ0hNQVJLX01FVEFEQVRBX1BS
T1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21l
c3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9z
IHsKK25hbWVzcGFjZSBwYnplcm8geworCisKK2NsYXNzIENocm9tZUJlbmNobWFya01ldGFkYXRh
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovOSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBw
dWJsaWM6CisgIENocm9tZUJlbmNobWFya01ldGFkYXRhX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IENocm9tZUJlbmNobWFya01ldGFkYXRhX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2hyb21lQmVuY2htYXJr
TWV0YWRhdGFfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfYmVuY2ht
YXJrX3N0YXJ0X3RpbWVfdXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
aW50NjRfdCBiZW5jaG1hcmtfc3RhcnRfdGltZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
YXNfaW50NjQoKTsgfQorICBib29sIGhhc19zdG9yeV9ydW5fdGltZV91cygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHN0b3J5X3J1bl90aW1lX3VzKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2JlbmNobWFya19u
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdENoYXJzIGJlbmNobWFya19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19zdHJp
bmcoKTsgfQorICBib29sIGhhc19iZW5jaG1hcmtfZGVzY3JpcHRpb24oKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgYmVuY2htYXJr
X2Rlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19zdHJpbmcoKTsgfQorICBi
b29sIGhhc19sYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RDaGFycyBsYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3Ry
aW5nKCk7IH0KKyAgYm9vbCBoYXNfc3RvcnlfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBzdG9yeV9uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19zdG9yeV90YWdzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRl
ZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+IHN0b3J5X3RhZ3MoKSBjb25z
dCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RDaGFycz4oNyk7IH0KKyAg
Ym9vbCBoYXNfc3RvcnlfcnVuX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgp
OyB9CisgIGludDMyX3Qgc3RvcnlfcnVuX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5h
c19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2hhZF9mYWlsdXJlcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDk+KCkudmFsaWQoKTsgfQorICBib29sIGhhZF9mYWlsdXJlcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDk+KCkuYXNfYm9vbCgpOyB9Cit9OworCitjbGFzcyBDaHJvbWVCZW5jaG1hcmtNZXRhZGF0YSA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gQ2hyb21lQmVuY2htYXJrTWV0YWRhdGFfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qgewor
ICAgIGtCZW5jaG1hcmtTdGFydFRpbWVVc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrU3RvcnlSdW5U
aW1lVXNGaWVsZE51bWJlciA9IDIsCisgICAga0JlbmNobWFya05hbWVGaWVsZE51bWJlciA9IDMs
CisgICAga0JlbmNobWFya0Rlc2NyaXB0aW9uRmllbGROdW1iZXIgPSA0LAorICAgIGtMYWJlbEZp
ZWxkTnVtYmVyID0gNSwKKyAgICBrU3RvcnlOYW1lRmllbGROdW1iZXIgPSA2LAorICAgIGtTdG9y
eVRhZ3NGaWVsZE51bWJlciA9IDcsCisgICAga1N0b3J5UnVuSW5kZXhGaWVsZE51bWJlciA9IDgs
CisgICAga0hhZEZhaWx1cmVzRmllbGROdW1iZXIgPSA5LAorICB9OworICB2b2lkIHNldF9iZW5j
aG1hcmtfc3RhcnRfdGltZV91cyhpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zdG9yeV9ydW5fdGltZV91cyhpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9iZW5jaG1h
cmtfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCB2
YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfYmVuY2htYXJrX25h
bWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBk
YXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9iZW5jaG1hcmtfZGVzY3JpcHRpb24oY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2JlbmNobWFya19kZXNjcmlwdGlvbihjb25z
dCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIGRhdGEsIHNp
emUpOworICB9CisgIHZvaWQgc2V0X2xhYmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIHNldF9sYWJlbChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDUsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3N0b3J5X25hbWUoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNiwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3N0b3J5X25hbWUoY29uc3QgY2hhciogZGF0
YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg2LCBkYXRhLCBzaXplKTsKKyAgfQor
ICB2b2lkIGFkZF9zdG9yeV90YWdzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDcsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFk
ZF9zdG9yeV90YWdzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5k
Qnl0ZXMoNywgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RvcnlfcnVuX2luZGV4KGlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2hhZF9mYWlsdXJlcyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg5LCB2
YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8v
IE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvY2hyb21lL2Nocm9tZV9t
ZXRhZGF0YS5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBp
bGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9DSFJPTUVfQ0hST01FX01FVEFEQVRBX1BST1RPX0hfCisjZGVmaW5l
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfQ0hST01FX0NIUk9NRV9NRVRB
REFUQV9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+
CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29k
ZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNl
IHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgQmFja2dyb3VuZFRyYWNpbmdN
ZXRhZGF0YTsKK2NsYXNzIEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGU7Citj
bGFzcyBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX0hpc3RvZ3JhbVJ1bGU7
CitjbGFzcyBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX05hbWVkUnVsZTsK
K2VudW0gQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9OYW1lZFJ1bGVfRXZl
bnRUeXBlIDogaW50MzJfdDsKK2VudW0gQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2Vy
UnVsZV9UcmlnZ2VyVHlwZSA6IGludDMyX3Q7CisKK2VudW0gQmFja2dyb3VuZFRyYWNpbmdNZXRh
ZGF0YV9UcmlnZ2VyUnVsZV9UcmlnZ2VyVHlwZSA6IGludDMyX3QgeworICBCYWNrZ3JvdW5kVHJh
Y2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX1RyaWdnZXJUeXBlX1RSSUdHRVJfVU5TUEVDSUZJRUQg
PSAwLAorICBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX1RyaWdnZXJUeXBl
X01PTklUT1JfQU5EX0RVTVBfV0hFTl9TUEVDSUZJQ19ISVNUT0dSQU1fQU5EX1ZBTFVFID0gMSwK
KyAgQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9UcmlnZ2VyVHlwZV9NT05J
VE9SX0FORF9EVU1QX1dIRU5fVFJJR0dFUl9OQU1FRCA9IDIsCit9OworCitjb25zdCBCYWNrZ3Jv
dW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX1RyaWdnZXJUeXBlIEJhY2tncm91bmRUcmFj
aW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfVHJpZ2dlclR5cGVfTUlOID0gQmFja2dyb3VuZFRyYWNp
bmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9UcmlnZ2VyVHlwZV9UUklHR0VSX1VOU1BFQ0lGSUVEOwor
Y29uc3QgQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9UcmlnZ2VyVHlwZSBC
YWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX1RyaWdnZXJUeXBlX01BWCA9IEJh
Y2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfVHJpZ2dlclR5cGVfTU9OSVRPUl9B
TkRfRFVNUF9XSEVOX1RSSUdHRVJfTkFNRUQ7CisKK2VudW0gQmFja2dyb3VuZFRyYWNpbmdNZXRh
ZGF0YV9UcmlnZ2VyUnVsZV9OYW1lZFJ1bGVfRXZlbnRUeXBlIDogaW50MzJfdCB7CisgIEJhY2tn
cm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxlX0V2ZW50VHlwZV9VTlNQ
RUNJRklFRCA9IDAsCisgIEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFt
ZWRSdWxlX0V2ZW50VHlwZV9TRVNTSU9OX1JFU1RPUkUgPSAxLAorICBCYWNrZ3JvdW5kVHJhY2lu
Z01ldGFkYXRhX1RyaWdnZXJSdWxlX05hbWVkUnVsZV9FdmVudFR5cGVfTkFWSUdBVElPTiA9IDIs
CisgIEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxlX0V2ZW50
VHlwZV9TVEFSVFVQID0gMywKKyAgQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVs
ZV9OYW1lZFJ1bGVfRXZlbnRUeXBlX1JFQUNIRURfQ09ERSA9IDQsCisgIEJhY2tncm91bmRUcmFj
aW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxlX0V2ZW50VHlwZV9URVNUX1JVTEUgPSAx
MDAwLAorfTsKKworY29uc3QgQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9O
YW1lZFJ1bGVfRXZlbnRUeXBlIEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVf
TmFtZWRSdWxlX0V2ZW50VHlwZV9NSU4gPSBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdn
ZXJSdWxlX05hbWVkUnVsZV9FdmVudFR5cGVfVU5TUEVDSUZJRUQ7Citjb25zdCBCYWNrZ3JvdW5k
VHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX05hbWVkUnVsZV9FdmVudFR5cGUgQmFja2dyb3Vu
ZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9OYW1lZFJ1bGVfRXZlbnRUeXBlX01BWCA9IEJh
Y2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxlX0V2ZW50VHlwZV9U
RVNUX1JVTEU7CisKK2NsYXNzIEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgQmFj
a2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBCYWNr
Z3JvdW5kVHJhY2luZ01ldGFkYXRhX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0
YV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc190cmlnZ2VyZWRfcnVs
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyB0cmlnZ2VyZWRfcnVsZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19hY3RpdmVfcnVsZXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVy
bzo6Q29uc3RCeXRlcz4gYWN0aXZlX3J1bGVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIpOyB9Cit9OworCitjbGFzcyBCYWNrZ3JvdW5kVHJh
Y2luZ01ldGFkYXRhIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrVHJpZ2dlcmVkUnVsZUZpZWxkTnVtYmVyID0gMSwKKyAgICBr
QWN0aXZlUnVsZXNGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHVzaW5nIFRyaWdnZXJSdWxlID0g
OjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJp
Z2dlclJ1bGU7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmFja2dyb3VuZFRyYWNpbmdNZXRh
ZGF0YV9UcmlnZ2VyUnVsZT4gVCogc2V0X3RyaWdnZXJlZF9ydWxlKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGU+IFQqIGFkZF9hY3RpdmVfcnVs
ZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyKTsKKyAgfQorCit9Owor
CitjbGFzcyBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBC
YWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX0RlY29kZXIoY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9Cisg
IGV4cGxpY2l0IEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3RyaWdnZXJfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHRyaWdnZXJfdHlwZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19oaXN0b2dyYW1fcnVsZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBo
aXN0b2dyYW1fcnVsZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19uYW1lZF9ydWxlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG5hbWVkX3J1bGUoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLmFzX2J5dGVzKCk7IH0KK307CisKK2NsYXNzIEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFf
VHJpZ2dlclJ1bGUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtUcmlnZ2VyVHlwZUZpZWxkTnVtYmVyID0g
MSwKKyAgICBrSGlzdG9ncmFtUnVsZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrTmFtZWRSdWxlRmll
bGROdW1iZXIgPSAzLAorICB9OworICB1c2luZyBIaXN0b2dyYW1SdWxlID0gOjpwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OkJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfSGlz
dG9ncmFtUnVsZTsKKyAgdXNpbmcgTmFtZWRSdWxlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OkJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxlOworICB1
c2luZyBUcmlnZ2VyVHlwZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpCYWNrZ3JvdW5k
VHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX1RyaWdnZXJUeXBlOworICBzdGF0aWMgY29uc3Qg
VHJpZ2dlclR5cGUgVFJJR0dFUl9VTlNQRUNJRklFRCA9IEJhY2tncm91bmRUcmFjaW5nTWV0YWRh
dGFfVHJpZ2dlclJ1bGVfVHJpZ2dlclR5cGVfVFJJR0dFUl9VTlNQRUNJRklFRDsKKyAgc3RhdGlj
IGNvbnN0IFRyaWdnZXJUeXBlIE1PTklUT1JfQU5EX0RVTVBfV0hFTl9TUEVDSUZJQ19ISVNUT0dS
QU1fQU5EX1ZBTFVFID0gQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9Ucmln
Z2VyVHlwZV9NT05JVE9SX0FORF9EVU1QX1dIRU5fU1BFQ0lGSUNfSElTVE9HUkFNX0FORF9WQUxV
RTsKKyAgc3RhdGljIGNvbnN0IFRyaWdnZXJUeXBlIE1PTklUT1JfQU5EX0RVTVBfV0hFTl9UUklH
R0VSX05BTUVEID0gQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9UcmlnZ2Vy
VHlwZV9NT05JVE9SX0FORF9EVU1QX1dIRU5fVFJJR0dFUl9OQU1FRDsKKyAgdm9pZCBzZXRfdHJp
Z2dlcl90eXBlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpCYWNrZ3JvdW5kVHJhY2luZ01l
dGFkYXRhX1RyaWdnZXJSdWxlX1RyaWdnZXJUeXBlIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZh
ckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCYWNrZ3JvdW5k
VHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX0hpc3RvZ3JhbVJ1bGU+IFQqIHNldF9oaXN0b2dy
YW1fcnVsZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdn
ZXJSdWxlX05hbWVkUnVsZT4gVCogc2V0X25hbWVkX3J1bGUoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigzKTsKKyAgfQorCit9OworCitjbGFzcyBCYWNrZ3JvdW5kVHJhY2lu
Z01ldGFkYXRhX1RyaWdnZXJSdWxlX05hbWVkUnVsZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmFja2dyb3VuZFRyYWNp
bmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9OYW1lZFJ1bGVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9OYW1lZFJ1bGVfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX05hbWVkUnVsZV9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19ldmVudF90eXBlKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZXZlbnRfdHlwZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgQmFja2dyb3Vu
ZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9OYW1lZFJ1bGUgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJhY2tncm91bmRUcmFj
aW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxlX0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrRXZlbnRUeXBlRmllbGROdW1iZXIgPSAxLAorICB9OworICB1c2luZyBFdmVu
dFR5cGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6QmFja2dyb3VuZFRyYWNpbmdNZXRh
ZGF0YV9UcmlnZ2VyUnVsZV9OYW1lZFJ1bGVfRXZlbnRUeXBlOworICBzdGF0aWMgY29uc3QgRXZl
bnRUeXBlIFVOU1BFQ0lGSUVEID0gQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVs
ZV9OYW1lZFJ1bGVfRXZlbnRUeXBlX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgRXZlbnRU
eXBlIFNFU1NJT05fUkVTVE9SRSA9IEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1
bGVfTmFtZWRSdWxlX0V2ZW50VHlwZV9TRVNTSU9OX1JFU1RPUkU7CisgIHN0YXRpYyBjb25zdCBF
dmVudFR5cGUgTkFWSUdBVElPTiA9IEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1
bGVfTmFtZWRSdWxlX0V2ZW50VHlwZV9OQVZJR0FUSU9OOworICBzdGF0aWMgY29uc3QgRXZlbnRU
eXBlIFNUQVJUVVAgPSBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX05hbWVk
UnVsZV9FdmVudFR5cGVfU1RBUlRVUDsKKyAgc3RhdGljIGNvbnN0IEV2ZW50VHlwZSBSRUFDSEVE
X0NPREUgPSBCYWNrZ3JvdW5kVHJhY2luZ01ldGFkYXRhX1RyaWdnZXJSdWxlX05hbWVkUnVsZV9F
dmVudFR5cGVfUkVBQ0hFRF9DT0RFOworICBzdGF0aWMgY29uc3QgRXZlbnRUeXBlIFRFU1RfUlVM
RSA9IEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxlX0V2ZW50
VHlwZV9URVNUX1JVTEU7CisgIHZvaWQgc2V0X2V2ZW50X3R5cGUoOjpwZXJmZXR0bzo6cHJvdG9z
OjpwYnplcm86OkJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfTmFtZWRSdWxl
X0V2ZW50VHlwZSB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KK307
CisKK2NsYXNzIEJhY2tncm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfSGlzdG9ncmFt
UnVsZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4g
eworIHB1YmxpYzoKKyAgQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9IaXN0
b2dyYW1SdWxlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJhY2tncm91bmRUcmFjaW5n
TWV0YWRhdGFfVHJpZ2dlclJ1bGVfSGlzdG9ncmFtUnVsZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEJhY2tncm91bmRU
cmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfSGlzdG9ncmFtUnVsZV9EZWNvZGVyKGNvbnN0IDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEs
IHJhdy5zaXplKSB7fQorICBib29sIGhhc19oaXN0b2dyYW1fbmFtZV9oYXNoKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGhpc3RvZ3JhbV9uYW1lX2hhc2go
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2hpc3Rv
Z3JhbV9taW5fdHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBp
bnQ2NF90IGhpc3RvZ3JhbV9taW5fdHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNf
aW50NjQoKTsgfQorICBib29sIGhhc19oaXN0b2dyYW1fbWF4X3RyaWdnZXIoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBoaXN0b2dyYW1fbWF4X3RyaWdnZXIo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KK307CisKK2NsYXNzIEJhY2tn
cm91bmRUcmFjaW5nTWV0YWRhdGFfVHJpZ2dlclJ1bGVfSGlzdG9ncmFtUnVsZSA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmFja2dy
b3VuZFRyYWNpbmdNZXRhZGF0YV9UcmlnZ2VyUnVsZV9IaXN0b2dyYW1SdWxlX0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrSGlzdG9ncmFtTmFtZUhhc2hGaWVsZE51bWJlciA9IDEs
CisgICAga0hpc3RvZ3JhbU1pblRyaWdnZXJGaWVsZE51bWJlciA9IDIsCisgICAga0hpc3RvZ3Jh
bU1heFRyaWdnZXJGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2hpc3RvZ3JhbV9u
YW1lX2hhc2godWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRGaXhlZCgxLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfaGlzdG9ncmFtX21pbl90cmlnZ2VyKGludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2hpc3RvZ3JhbV9tYXhf
dHJpZ2dlcihpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorfTsKKworY2xhc3MgQ2hyb21lTWV0YWRhdGFQYWNrZXRfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENocm9tZU1ldGFk
YXRhUGFja2V0X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENocm9tZU1ldGFkYXRhUGFj
a2V0X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgQ2hyb21lTWV0YWRhdGFQYWNrZXRfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfYmFja2dyb3VuZF90cmFjaW5nX21ldGFkYXRhKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJh
Y2tncm91bmRfdHJhY2luZ19tZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19jaHJvbWVfdmVyc2lvbl9jb2RlKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgY2hyb21lX3ZlcnNpb25fY29kZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgQ2hyb21lTWV0YWRh
dGFQYWNrZXQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IENocm9tZU1ldGFkYXRhUGFja2V0X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YUZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrQ2hyb21lVmVyc2lvbkNvZGVGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gQmFja2dyb3VuZFRyYWNpbmdNZXRhZGF0YT4gVCogc2V0X2JhY2tncm91bmRf
dHJhY2luZ19tZXRhZGF0YSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEp
OworICB9CisKKyAgdm9pZCBzZXRfY2hyb21lX3ZlcnNpb25fY29kZShpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2Uu
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1
YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0
by90cmFjZS9jaHJvbWUvY2hyb21lX3RyYWNlX2V2ZW50LnBiemVyby5oCisvLyBBdXRvZ2VuZXJh
dGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lm
bmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0NIUk9NRV9DSFJPTUVf
VFJBQ0VfRVZFTlRfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19UUkFDRV9DSFJPTUVfQ0hST01FX1RSQUNFX0VWRU5UX1BST1RPX0hfCisKKyNpbmNsdWRl
IDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRf
cmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnpl
cm8geworCitjbGFzcyBDaHJvbWVMZWdhY3lKc29uVHJhY2U7CitjbGFzcyBDaHJvbWVNZXRhZGF0
YTsKK2NsYXNzIENocm9tZVN0cmluZ1RhYmxlRW50cnk7CitjbGFzcyBDaHJvbWVUcmFjZUV2ZW50
OworY2xhc3MgQ2hyb21lVHJhY2VFdmVudF9Bcmc7CitjbGFzcyBDaHJvbWVUcmFjZWRWYWx1ZTsK
K2VudW0gQ2hyb21lTGVnYWN5SnNvblRyYWNlX1RyYWNlVHlwZSA6IGludDMyX3Q7CitlbnVtIENo
cm9tZVRyYWNlZFZhbHVlX05lc3RlZFR5cGUgOiBpbnQzMl90OworCitlbnVtIENocm9tZUxlZ2Fj
eUpzb25UcmFjZV9UcmFjZVR5cGUgOiBpbnQzMl90IHsKKyAgQ2hyb21lTGVnYWN5SnNvblRyYWNl
X1RyYWNlVHlwZV9VU0VSX1RSQUNFID0gMCwKKyAgQ2hyb21lTGVnYWN5SnNvblRyYWNlX1RyYWNl
VHlwZV9TWVNURU1fVFJBQ0UgPSAxLAorfTsKKworY29uc3QgQ2hyb21lTGVnYWN5SnNvblRyYWNl
X1RyYWNlVHlwZSBDaHJvbWVMZWdhY3lKc29uVHJhY2VfVHJhY2VUeXBlX01JTiA9IENocm9tZUxl
Z2FjeUpzb25UcmFjZV9UcmFjZVR5cGVfVVNFUl9UUkFDRTsKK2NvbnN0IENocm9tZUxlZ2FjeUpz
b25UcmFjZV9UcmFjZVR5cGUgQ2hyb21lTGVnYWN5SnNvblRyYWNlX1RyYWNlVHlwZV9NQVggPSBD
aHJvbWVMZWdhY3lKc29uVHJhY2VfVHJhY2VUeXBlX1NZU1RFTV9UUkFDRTsKKworZW51bSBDaHJv
bWVUcmFjZWRWYWx1ZV9OZXN0ZWRUeXBlIDogaW50MzJfdCB7CisgIENocm9tZVRyYWNlZFZhbHVl
X05lc3RlZFR5cGVfRElDVCA9IDAsCisgIENocm9tZVRyYWNlZFZhbHVlX05lc3RlZFR5cGVfQVJS
QVkgPSAxLAorfTsKKworY29uc3QgQ2hyb21lVHJhY2VkVmFsdWVfTmVzdGVkVHlwZSBDaHJvbWVU
cmFjZWRWYWx1ZV9OZXN0ZWRUeXBlX01JTiA9IENocm9tZVRyYWNlZFZhbHVlX05lc3RlZFR5cGVf
RElDVDsKK2NvbnN0IENocm9tZVRyYWNlZFZhbHVlX05lc3RlZFR5cGUgQ2hyb21lVHJhY2VkVmFs
dWVfTmVzdGVkVHlwZV9NQVggPSBDaHJvbWVUcmFjZWRWYWx1ZV9OZXN0ZWRUeXBlX0FSUkFZOwor
CitjbGFzcyBDaHJvbWVFdmVudEJ1bmRsZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBDaHJvbWVFdmVudEJ1bmRsZV9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDaHJvbWVFdmVudEJ1bmRsZV9EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENo
cm9tZUV2ZW50QnVuZGxlX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X3RyYWNlX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiB0
cmFjZV9ldmVudHMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29u
c3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfbWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnBy
b3RvemVybzo6Q29uc3RCeXRlcz4gbWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRl
ZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMik7IH0KKyAgYm9vbCBoYXNfbGVnYWN5X2Z0cmFj
ZV9vdXRwdXQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gbGVnYWN5
X2Z0cmFjZV9vdXRwdXQoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6
Q29uc3RDaGFycz4oNCk7IH0KKyAgYm9vbCBoYXNfbGVnYWN5X2pzb25fdHJhY2UoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJ
dGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gbGVnYWN5X2pzb25fdHJhY2UoKSBjb25z
dCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNSk7IH0KKyAg
Ym9vbCBoYXNfc3RyaW5nX3RhYmxlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0
Qnl0ZXM+IHN0cmluZ190YWJsZSgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPigzKTsgfQorfTsKKworY2xhc3MgQ2hyb21lRXZlbnRCdW5kbGUgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IENocm9tZUV2ZW50QnVuZGxlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVHJh
Y2VFdmVudHNGaWVsZE51bWJlciA9IDEsCisgICAga01ldGFkYXRhRmllbGROdW1iZXIgPSAyLAor
ICAgIGtMZWdhY3lGdHJhY2VPdXRwdXRGaWVsZE51bWJlciA9IDQsCisgICAga0xlZ2FjeUpzb25U
cmFjZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrU3RyaW5nVGFibGVGaWVsZE51bWJlciA9IDMsCisg
IH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lVHJhY2VFdmVudD4gVCogYWRkX3Ry
YWNlX2V2ZW50cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDaHJvbWVNZXRhZGF0YT4gVCogYWRkX21ldGFk
YXRhKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworICB2
b2lkIGFkZF9sZWdhY3lfZnRyYWNlX291dHB1dChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsK
KyAgICBBcHBlbmRCeXRlcyg0LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAg
dm9pZCBhZGRfbGVnYWN5X2Z0cmFjZV9vdXRwdXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNp
emUpIHsKKyAgICBBcHBlbmRCeXRlcyg0LCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IENocm9tZUxlZ2FjeUpzb25UcmFjZT4gVCogYWRkX2xlZ2FjeV9qc29uX3Ry
YWNlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNSk7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZVN0cmluZ1RhYmxlRW50cnk+IFQqIGFkZF9zdHJp
bmdfdGFibGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzKTsKKyAgfQor
Cit9OworCitjbGFzcyBDaHJvbWVMZWdhY3lKc29uVHJhY2VfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENocm9tZUxlZ2Fj
eUpzb25UcmFjZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDaHJvbWVMZWdhY3lKc29u
VHJhY2VfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBDaHJvbWVMZWdhY3lKc29uVHJhY2VfRGVjb2Rlcihjb25zdCA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCBy
YXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMy
KCk7IH0KKyAgYm9vbCBoYXNfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBkYXRhKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgQ2hyb21lTGVnYWN5SnNvblRyYWNlIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBD
aHJvbWVMZWdhY3lKc29uVHJhY2VfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtU
eXBlRmllbGROdW1iZXIgPSAxLAorICAgIGtEYXRhRmllbGROdW1iZXIgPSAyLAorICB9OworICB1
c2luZyBUcmFjZVR5cGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6Q2hyb21lTGVnYWN5
SnNvblRyYWNlX1RyYWNlVHlwZTsKKyAgc3RhdGljIGNvbnN0IFRyYWNlVHlwZSBVU0VSX1RSQUNF
ID0gQ2hyb21lTGVnYWN5SnNvblRyYWNlX1RyYWNlVHlwZV9VU0VSX1RSQUNFOworICBzdGF0aWMg
Y29uc3QgVHJhY2VUeXBlIFNZU1RFTV9UUkFDRSA9IENocm9tZUxlZ2FjeUpzb25UcmFjZV9UcmFj
ZVR5cGVfU1lTVEVNX1RSQUNFOworICB2b2lkIHNldF90eXBlKDo6cGVyZmV0dG86OnByb3Rvczo6
cGJ6ZXJvOjpDaHJvbWVMZWdhY3lKc29uVHJhY2VfVHJhY2VUeXBlIHZhbHVlKSB7CisgICAgQXBw
ZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGF0YShjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfZGF0YShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFz
cyBDaHJvbWVNZXRhZGF0YV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQ2hyb21lTWV0YWRhdGFfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgQ2hyb21lTWV0YWRhdGFfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBDaHJvbWVNZXRhZGF0YV9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3N0cmlu
Z192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RDaGFycyBzdHJpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0
cmluZygpOyB9CisgIGJvb2wgaGFzX2Jvb2xfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LnZhbGlkKCk7IH0KKyAgYm9vbCBib29sX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5h
c19ib29sKCk7IH0KKyAgYm9vbCBoYXNfaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4o
KS52YWxpZCgpOyB9CisgIGludDY0X3QgaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4o
KS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2pzb25fdmFsdWUoKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMganNvbl92YWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIENocm9t
ZU1ldGFkYXRhIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBDaHJvbWVNZXRhZGF0YV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1N0cmluZ1ZhbHVlRmllbGROdW1iZXIg
PSAyLAorICAgIGtCb29sVmFsdWVGaWVsZE51bWJlciA9IDMsCisgICAga0ludFZhbHVlRmllbGRO
dW1iZXIgPSA0LAorICAgIGtKc29uVmFsdWVGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQg
c2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwg
dmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qg
Y2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXpl
KTsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9
CisgIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2Jvb2xf
dmFsdWUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMywgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2ludF92YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9qc29uX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5n
JiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgfQorICB2b2lkIHNldF9qc29uX3ZhbHVlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBz
aXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNz
IENocm9tZVRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIENocm9tZVRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgQ2hyb21lVHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENocm9tZVRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFy
cyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhh
c190aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50NjRf
dCB0aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDY0KCk7IH0KKyAgYm9v
bCBoYXNfcGhhc2UoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBwaGFzZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhh
c190aHJlYWRfaWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCB0aHJlYWRfaWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2ludDMyKCk7IH0KKyAgYm9v
bCBoYXNfZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCBkdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50NjQoKTsgfQorICBi
b29sIGhhc190aHJlYWRfZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7
IH0KKyAgaW50NjRfdCB0aHJlYWRfZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFz
X2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2NvcGUoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgc2NvcGUoKSBjb25zdCB7IHJldHVy
biBhdDw3PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2lkKCkgY29uc3QgeyByZXR1cm4g
YXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDk+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCku
YXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfY2F0ZWdvcnlfZ3JvdXBfbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDEwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgY2F0
ZWdvcnlfZ3JvdXBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFzX3N0cmluZygpOyB9
CisgIGJvb2wgaGFzX3Byb2Nlc3NfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS52YWxpZCgp
OyB9CisgIGludDMyX3QgcHJvY2Vzc19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX2lu
dDMyKCk7IH0KKyAgYm9vbCBoYXNfdGhyZWFkX3RpbWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDEyPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0aHJlYWRfdGltZXN0YW1wKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTI+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19iaW5kX2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBiaW5kX2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYXJncygpIGNvbnN0
IHsgcmV0dXJuIGF0PDE0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmll
bGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gYXJncygpIGNvbnN0IHsgcmV0dXJu
IEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxNCk7IH0KKyAgYm9vbCBoYXNf
bmFtZV9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE1PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgbmFtZV9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE1PigpLmFzX3VpbnQzMigpOyB9Cisg
IGJvb2wgaGFzX2NhdGVnb3J5X2dyb3VwX25hbWVfaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDwx
Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNhdGVnb3J5X2dyb3VwX25hbWVfaW5kZXgoKSBj
b25zdCB7IHJldHVybiBhdDwxNj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgQ2hyb21l
VHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1
c2luZyBEZWNvZGVyID0gQ2hyb21lVHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1RpbWVzdGFtcEZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrUGhhc2VGaWVsZE51bWJlciA9IDMsCisgICAga1RocmVhZElkRmllbGROdW1i
ZXIgPSA0LAorICAgIGtEdXJhdGlvbkZpZWxkTnVtYmVyID0gNSwKKyAgICBrVGhyZWFkRHVyYXRp
b25GaWVsZE51bWJlciA9IDYsCisgICAga1Njb3BlRmllbGROdW1iZXIgPSA3LAorICAgIGtJZEZp
ZWxkTnVtYmVyID0gOCwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDksCisgICAga0NhdGVnb3J5
R3JvdXBOYW1lRmllbGROdW1iZXIgPSAxMCwKKyAgICBrUHJvY2Vzc0lkRmllbGROdW1iZXIgPSAx
MSwKKyAgICBrVGhyZWFkVGltZXN0YW1wRmllbGROdW1iZXIgPSAxMiwKKyAgICBrQmluZElkRmll
bGROdW1iZXIgPSAxMywKKyAgICBrQXJnc0ZpZWxkTnVtYmVyID0gMTQsCisgICAga05hbWVJbmRl
eEZpZWxkTnVtYmVyID0gMTUsCisgICAga0NhdGVnb3J5R3JvdXBOYW1lSW5kZXhGaWVsZE51bWJl
ciA9IDE2LAorICB9OworICB1c2luZyBBcmcgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6
Q2hyb21lVHJhY2VFdmVudF9Bcmc7CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsK
KyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF90aW1lc3Rh
bXAoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcGhhc2UoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGhyZWFkX2lkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2R1cmF0aW9uKGludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RocmVh
ZF9kdXJhdGlvbihpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9zY29wZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBB
cHBlbmRCeXRlcyg3LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBz
ZXRfc2NvcGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRl
cyg3LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9pZCh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxhZ3ModWludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2NhdGVnb3J5X2dyb3VwX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMTAsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNl
dF9jYXRlZ29yeV9ncm91cF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMTAsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3Byb2Nlc3Nf
aWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3RocmVhZF90aW1lc3RhbXAoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2JpbmRfaWQodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMTMsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IENocm9tZVRyYWNlRXZlbnRfQXJnPiBUKiBhZGRfYXJncygpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE0KTsKKyAgfQorCisgIHZvaWQgc2V0X25hbWVfaW5kZXgo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTUsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9jYXRlZ29yeV9ncm91cF9uYW1lX2luZGV4KHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDE2LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIENocm9tZVRyYWNlRXZl
bnRfQXJnX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovMTAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxz
ZT4geworIHB1YmxpYzoKKyAgQ2hyb21lVHJhY2VFdmVudF9BcmdfRGVjb2Rlcihjb25zdCB1aW50
OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30K
KyAgZXhwbGljaXQgQ2hyb21lVHJhY2VFdmVudF9BcmdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBDaHJvbWVUcmFjZUV2
ZW50X0FyZ19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENo
YXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wg
aGFzX2Jvb2xfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgYm9v
bCBib29sX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19ib29sKCk7IH0KKyAgYm9v
bCBoYXNfdWludF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCB1aW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pbnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7
IH0KKyAgaW50NjRfdCBpbnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2ludDY0
KCk7IH0KKyAgYm9vbCBoYXNfZG91YmxlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52
YWxpZCgpOyB9CisgIGRvdWJsZSBkb3VibGVfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw1Pigp
LmFzX2RvdWJsZSgpOyB9CisgIGJvb2wgaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBzdHJpbmdfdmFs
dWUoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3Bv
aW50ZXJfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgcG9pbnRlcl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfanNvbl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBqc29uX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4g
YXQ8OD4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc190cmFjZWRfdmFsdWUoKSBjb25zdCB7
IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRy
YWNlZF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfbmFtZV9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICB1
aW50MzJfdCBuYW1lX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc191aW50MzIoKTsg
fQorfTsKKworY2xhc3MgQ2hyb21lVHJhY2VFdmVudF9BcmcgOiBwdWJsaWMgOjpwcm90b3plcm86
Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IENocm9tZVRyYWNlRXZlbnRf
QXJnX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0g
MSwKKyAgICBrQm9vbFZhbHVlRmllbGROdW1iZXIgPSAyLAorICAgIGtVaW50VmFsdWVGaWVsZE51
bWJlciA9IDMsCisgICAga0ludFZhbHVlRmllbGROdW1iZXIgPSA0LAorICAgIGtEb3VibGVWYWx1
ZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrU3RyaW5nVmFsdWVGaWVsZE51bWJlciA9IDYsCisgICAg
a1BvaW50ZXJWYWx1ZUZpZWxkTnVtYmVyID0gNywKKyAgICBrSnNvblZhbHVlRmllbGROdW1iZXIg
PSA4LAorICAgIGtUcmFjZWRWYWx1ZUZpZWxkTnVtYmVyID0gMTAsCisgICAga05hbWVJbmRleEZp
ZWxkTnVtYmVyID0gOSwKKyAgfTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYg
dmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7
CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2Jvb2xfdmFs
dWUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3VpbnRfdmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ludF92YWx1ZShpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kb3VibGVfdmFsdWUo
ZG91YmxlIHZhbHVlKSB7CisgICAgQXBwZW5kRml4ZWQoNSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3N0cmluZ192YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRC
eXRlcyg2LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfc3Ry
aW5nX3ZhbHVlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0
ZXMoNiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcG9pbnRlcl92YWx1ZSh1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
anNvbl92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg4
LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfanNvbl92YWx1
ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDgsIGRh
dGEsIHNpemUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lVHJhY2VkVmFs
dWU+IFQqIHNldF90cmFjZWRfdmFsdWUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigxMCk7CisgIH0KKworICB2b2lkIHNldF9uYW1lX2luZGV4KHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDksIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQ2hyb21lU3Ry
aW5nVGFibGVFbnRyeV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQ2hyb21lU3RyaW5nVGFibGVFbnRyeV9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBDaHJvbWVTdHJpbmdUYWJsZUVudHJ5X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2hy
b21lU3RyaW5nVGFibGVFbnRyeV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RDaGFycyB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5n
KCk7IH0KKyAgYm9vbCBoYXNfaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgaW50MzJfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsg
fQorfTsKKworY2xhc3MgQ2hyb21lU3RyaW5nVGFibGVFbnRyeSA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2hyb21lU3RyaW5nVGFi
bGVFbnRyeV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1ZhbHVlRmllbGROdW1i
ZXIgPSAxLAorICAgIGtJbmRleEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfdmFs
dWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUu
ZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3ZhbHVlKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfaW5kZXgoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIENocm9tZVRyYWNlZFZhbHVlX0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOCwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIENo
cm9tZVRyYWNlZFZhbHVlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENocm9tZVRyYWNl
ZFZhbHVlX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgQ2hyb21lVHJhY2VkVmFsdWVfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfbmVzdGVkX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LnZhbGlkKCk7IH0KKyAgaW50MzJfdCBuZXN0ZWRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19kaWN0X2tleXMoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6
OnByb3RvemVybzo6Q29uc3RDaGFycz4gZGljdF9rZXlzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVw
ZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+KDIpOyB9CisgIGJvb2wgaGFzX2RpY3RfdmFs
dWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpS
ZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGRpY3RfdmFsdWVz
KCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDMp
OyB9CisgIGJvb2wgaGFzX2FycmF5X3ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzPiBhcnJheV92YWx1ZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNCk7IH0KKyAgYm9vbCBoYXNfaW50X3ZhbHVlKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgaW50X3ZhbHVlKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2RvdWJsZV92YWx1
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBkb3VibGUgZG91YmxlX3Zh
bHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19kb3VibGUoKTsgfQorICBib29sIGhhc19i
b29sX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIGJvb2wgYm9v
bF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFz
X3N0cmluZ192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RDaGFycyBzdHJpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw4Pigp
LmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBDaHJvbWVUcmFjZWRWYWx1ZSA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2hyb21l
VHJhY2VkVmFsdWVfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOZXN0ZWRUeXBl
RmllbGROdW1iZXIgPSAxLAorICAgIGtEaWN0S2V5c0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrRGlj
dFZhbHVlc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrQXJyYXlWYWx1ZXNGaWVsZE51bWJlciA9IDQs
CisgICAga0ludFZhbHVlRmllbGROdW1iZXIgPSA1LAorICAgIGtEb3VibGVWYWx1ZUZpZWxkTnVt
YmVyID0gNiwKKyAgICBrQm9vbFZhbHVlRmllbGROdW1iZXIgPSA3LAorICAgIGtTdHJpbmdWYWx1
ZUZpZWxkTnVtYmVyID0gOCwKKyAgfTsKKyAgdXNpbmcgTmVzdGVkVHlwZSA9IDo6cGVyZmV0dG86
OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVUcmFjZWRWYWx1ZV9OZXN0ZWRUeXBlOworICBzdGF0aWMg
Y29uc3QgTmVzdGVkVHlwZSBESUNUID0gQ2hyb21lVHJhY2VkVmFsdWVfTmVzdGVkVHlwZV9ESUNU
OworICBzdGF0aWMgY29uc3QgTmVzdGVkVHlwZSBBUlJBWSA9IENocm9tZVRyYWNlZFZhbHVlX05l
c3RlZFR5cGVfQVJSQVk7CisgIHZvaWQgc2V0X25lc3RlZF90eXBlKDo6cGVyZmV0dG86OnByb3Rv
czo6cGJ6ZXJvOjpDaHJvbWVUcmFjZWRWYWx1ZV9OZXN0ZWRUeXBlIHZhbHVlKSB7CisgICAgQXBw
ZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfZGljdF9rZXlzKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9kaWN0X2tleXMoY29uc3QgY2hhciogZGF0
YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZVRyYWNlZFZhbHVlPiBUKiBhZGRfZGljdF92
YWx1ZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lVHJhY2VkVmFsdWU+IFQqIGFkZF9hcnJheV92
YWx1ZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisg
IHZvaWQgc2V0X2ludF92YWx1ZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kb3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKSB7Cisg
ICAgQXBwZW5kRml4ZWQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Jvb2xfdmFsdWUoYm9v
bCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNywgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3N0cmluZ192YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRC
eXRlcyg4LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfc3Ry
aW5nX3ZhbHVlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0
ZXMoOCwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1l
c3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZmls
ZXN5c3RlbS9pbm9kZV9maWxlX21hcC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUg
UHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVU
VE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GSUxFU1lTVEVNX0lOT0RFX0ZJTEVfTUFQ
X1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
RklMRVNZU1RFTV9JTk9ERV9GSUxFX01BUF9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+
CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2Zp
ZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xh
c3MgSW5vZGVGaWxlTWFwX0VudHJ5OworZW51bSBJbm9kZUZpbGVNYXBfRW50cnlfVHlwZSA6IGlu
dDMyX3Q7CisKK2VudW0gSW5vZGVGaWxlTWFwX0VudHJ5X1R5cGUgOiBpbnQzMl90IHsKKyAgSW5v
ZGVGaWxlTWFwX0VudHJ5X1R5cGVfVU5LTk9XTiA9IDAsCisgIElub2RlRmlsZU1hcF9FbnRyeV9U
eXBlX0ZJTEUgPSAxLAorICBJbm9kZUZpbGVNYXBfRW50cnlfVHlwZV9ESVJFQ1RPUlkgPSAyLAor
fTsKKworY29uc3QgSW5vZGVGaWxlTWFwX0VudHJ5X1R5cGUgSW5vZGVGaWxlTWFwX0VudHJ5X1R5
cGVfTUlOID0gSW5vZGVGaWxlTWFwX0VudHJ5X1R5cGVfVU5LTk9XTjsKK2NvbnN0IElub2RlRmls
ZU1hcF9FbnRyeV9UeXBlIElub2RlRmlsZU1hcF9FbnRyeV9UeXBlX01BWCA9IElub2RlRmlsZU1h
cF9FbnRyeV9UeXBlX0RJUkVDVE9SWTsKKworY2xhc3MgSW5vZGVGaWxlTWFwX0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIElu
b2RlRmlsZU1hcF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBJbm9kZUZpbGVNYXBfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBJbm9kZUZpbGVNYXBfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfYmxvY2tfZGV2aWNlX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IGJsb2NrX2RldmljZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
dWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbW91bnRfcG9pbnRzKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpw
cm90b3plcm86OkNvbnN0Q2hhcnM+IG1vdW50X3BvaW50cygpIGNvbnN0IHsgcmV0dXJuIEdldFJl
cGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPigyKTsgfQorICBib29sIGhhc19lbnRyaWVz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGVudHJpZXMoKSBjb25z
dCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMyk7IH0KK307
CisKK2NsYXNzIElub2RlRmlsZU1hcCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7Cisg
cHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW5vZGVGaWxlTWFwX0RlY29kZXI7CisgIGVudW0g
OiBpbnQzMl90IHsKKyAgICBrQmxvY2tEZXZpY2VJZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTW91
bnRQb2ludHNGaWVsZE51bWJlciA9IDIsCisgICAga0VudHJpZXNGaWVsZE51bWJlciA9IDMsCisg
IH07CisgIHVzaW5nIEVudHJ5ID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86Oklub2RlRmls
ZU1hcF9FbnRyeTsKKyAgdm9pZCBzZXRfYmxvY2tfZGV2aWNlX2lkKHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9tb3VudF9wb2lu
dHMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUu
ZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX21vdW50X3BvaW50cyhjb25z
dCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNp
emUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW5vZGVGaWxlTWFwX0VudHJ5PiBU
KiBhZGRfZW50cmllcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMpOwor
ICB9CisKK307CisKK2NsYXNzIElub2RlRmlsZU1hcF9FbnRyeV9EZWNvZGVyIDogcHVibGljIDo6
cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05P
TlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBJbm9kZUZpbGVN
YXBfRW50cnlfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVk
UHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSW5vZGVGaWxlTWFwX0VudHJ5
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgSW5vZGVGaWxlTWFwX0VudHJ5X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2lub2RlX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBpbm9kZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3BhdGhzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90
b3plcm86OkNvbnN0Q2hhcnM+IHBhdGhzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpw
cm90b3plcm86OkNvbnN0Q2hhcnM+KDIpOyB9CisgIGJvb2wgaGFzX3R5cGUoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBJbm9kZUZpbGVNYXBfRW50cnkgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IElub2RlRmlsZU1hcF9FbnRyeV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lu
b2RlTnVtYmVyRmllbGROdW1iZXIgPSAxLAorICAgIGtQYXRoc0ZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrVHlwZUZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdXNpbmcgVHlwZSA9IDo6cGVyZmV0dG86
OnByb3Rvczo6cGJ6ZXJvOjpJbm9kZUZpbGVNYXBfRW50cnlfVHlwZTsKKyAgc3RhdGljIGNvbnN0
IFR5cGUgVU5LTk9XTiA9IElub2RlRmlsZU1hcF9FbnRyeV9UeXBlX1VOS05PV047CisgIHN0YXRp
YyBjb25zdCBUeXBlIEZJTEUgPSBJbm9kZUZpbGVNYXBfRW50cnlfVHlwZV9GSUxFOworICBzdGF0
aWMgY29uc3QgVHlwZSBESVJFQ1RPUlkgPSBJbm9kZUZpbGVNYXBfRW50cnlfVHlwZV9ESVJFQ1RP
Ulk7CisgIHZvaWQgc2V0X2lub2RlX251bWJlcih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfcGF0aHMoY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXpl
KCkpOworICB9CisgIHZvaWQgYWRkX3BhdGhzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXpl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfdHlw
ZSg6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6SW5vZGVGaWxlTWFwX0VudHJ5X1R5cGUgdmFs
dWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBO
YW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJ
bmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rv
cy9wZXJmZXR0by90cmFjZS9mdHJhY2UvZnRyYWNlX2V2ZW50LnBiemVyby5oCisvLyBBdXRvZ2Vu
ZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKwor
I2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9GVFJB
Q0VfRVZFTlRfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9GVFJBQ0VfRlRSQUNFX0VWRU5UX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYu
aD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRf
ZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFj
ZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitj
bGFzcyBBbGxvY1BhZ2VzSW9tbXVFbmRGdHJhY2VFdmVudDsKK2NsYXNzIEFsbG9jUGFnZXNJb21t
dUZhaWxGdHJhY2VFdmVudDsKK2NsYXNzIEFsbG9jUGFnZXNJb21tdVN0YXJ0RnRyYWNlRXZlbnQ7
CitjbGFzcyBBbGxvY1BhZ2VzU3lzRW5kRnRyYWNlRXZlbnQ7CitjbGFzcyBBbGxvY1BhZ2VzU3lz
RmFpbEZ0cmFjZUV2ZW50OworY2xhc3MgQWxsb2NQYWdlc1N5c1N0YXJ0RnRyYWNlRXZlbnQ7Citj
bGFzcyBCaW5kZXJMb2NrRnRyYWNlRXZlbnQ7CitjbGFzcyBCaW5kZXJMb2NrZWRGdHJhY2VFdmVu
dDsKK2NsYXNzIEJpbmRlclNldFByaW9yaXR5RnRyYWNlRXZlbnQ7CitjbGFzcyBCaW5kZXJUcmFu
c2FjdGlvbkFsbG9jQnVmRnRyYWNlRXZlbnQ7CitjbGFzcyBCaW5kZXJUcmFuc2FjdGlvbkZ0cmFj
ZUV2ZW50OworY2xhc3MgQmluZGVyVHJhbnNhY3Rpb25SZWNlaXZlZEZ0cmFjZUV2ZW50OworY2xh
c3MgQmluZGVyVW5sb2NrRnRyYWNlRXZlbnQ7CitjbGFzcyBCbG9ja0Jpb0JhY2ttZXJnZUZ0cmFj
ZUV2ZW50OworY2xhc3MgQmxvY2tCaW9Cb3VuY2VGdHJhY2VFdmVudDsKK2NsYXNzIEJsb2NrQmlv
Q29tcGxldGVGdHJhY2VFdmVudDsKK2NsYXNzIEJsb2NrQmlvRnJvbnRtZXJnZUZ0cmFjZUV2ZW50
OworY2xhc3MgQmxvY2tCaW9RdWV1ZUZ0cmFjZUV2ZW50OworY2xhc3MgQmxvY2tCaW9SZW1hcEZ0
cmFjZUV2ZW50OworY2xhc3MgQmxvY2tEaXJ0eUJ1ZmZlckZ0cmFjZUV2ZW50OworY2xhc3MgQmxv
Y2tHZXRycUZ0cmFjZUV2ZW50OworY2xhc3MgQmxvY2tQbHVnRnRyYWNlRXZlbnQ7CitjbGFzcyBC
bG9ja1JxQWJvcnRGdHJhY2VFdmVudDsKK2NsYXNzIEJsb2NrUnFDb21wbGV0ZUZ0cmFjZUV2ZW50
OworY2xhc3MgQmxvY2tScUluc2VydEZ0cmFjZUV2ZW50OworY2xhc3MgQmxvY2tScUlzc3VlRnRy
YWNlRXZlbnQ7CitjbGFzcyBCbG9ja1JxUmVtYXBGdHJhY2VFdmVudDsKK2NsYXNzIEJsb2NrUnFS
ZXF1ZXVlRnRyYWNlRXZlbnQ7CitjbGFzcyBCbG9ja1NsZWVwcnFGdHJhY2VFdmVudDsKK2NsYXNz
IEJsb2NrU3BsaXRGdHJhY2VFdmVudDsKK2NsYXNzIEJsb2NrVG91Y2hCdWZmZXJGdHJhY2VFdmVu
dDsKK2NsYXNzIEJsb2NrVW5wbHVnRnRyYWNlRXZlbnQ7CitjbGFzcyBDZ3JvdXBBdHRhY2hUYXNr
RnRyYWNlRXZlbnQ7CitjbGFzcyBDZ3JvdXBEZXN0cm95Um9vdEZ0cmFjZUV2ZW50OworY2xhc3Mg
Q2dyb3VwTWtkaXJGdHJhY2VFdmVudDsKK2NsYXNzIENncm91cFJlbGVhc2VGdHJhY2VFdmVudDsK
K2NsYXNzIENncm91cFJlbW91bnRGdHJhY2VFdmVudDsKK2NsYXNzIENncm91cFJlbmFtZUZ0cmFj
ZUV2ZW50OworY2xhc3MgQ2dyb3VwUm1kaXJGdHJhY2VFdmVudDsKK2NsYXNzIENncm91cFNldHVw
Um9vdEZ0cmFjZUV2ZW50OworY2xhc3MgQ2dyb3VwVHJhbnNmZXJUYXNrc0Z0cmFjZUV2ZW50Owor
Y2xhc3MgQ2xrRGlzYWJsZUZ0cmFjZUV2ZW50OworY2xhc3MgQ2xrRW5hYmxlRnRyYWNlRXZlbnQ7
CitjbGFzcyBDbGtTZXRSYXRlRnRyYWNlRXZlbnQ7CitjbGFzcyBDbG9ja0Rpc2FibGVGdHJhY2VF
dmVudDsKK2NsYXNzIENsb2NrRW5hYmxlRnRyYWNlRXZlbnQ7CitjbGFzcyBDbG9ja1NldFJhdGVG
dHJhY2VFdmVudDsKK2NsYXNzIENwdUZyZXF1ZW5jeUZ0cmFjZUV2ZW50OworY2xhc3MgQ3B1RnJl
cXVlbmN5TGltaXRzRnRyYWNlRXZlbnQ7CitjbGFzcyBDcHVJZGxlRnRyYWNlRXZlbnQ7CitjbGFz
cyBEbWFBbGxvY0NvbnRpZ3VvdXNSZXRyeUZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEFsbG9jRGFC
bG9ja3NGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRBbGxvY2F0ZUJsb2Nrc0Z0cmFjZUV2ZW50Owor
Y2xhc3MgRXh0NEFsbG9jYXRlSW5vZGVGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRCZWdpbk9yZGVy
ZWRUcnVuY2F0ZUZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NENvbGxhcHNlUmFuZ2VGdHJhY2VFdmVu
dDsKK2NsYXNzIEV4dDREYVJlbGVhc2VTcGFjZUZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NERhUmVz
ZXJ2ZVNwYWNlRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RGFVcGRhdGVSZXNlcnZlU3BhY2VGdHJh
Y2VFdmVudDsKK2NsYXNzIEV4dDREYVdyaXRlQmVnaW5GdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRE
YVdyaXRlRW5kRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RGFXcml0ZVBhZ2VzRXh0ZW50RnRyYWNl
RXZlbnQ7CitjbGFzcyBFeHQ0RGFXcml0ZVBhZ2VzRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RGly
ZWN0SU9FbnRlckZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NERpcmVjdElPRXhpdEZ0cmFjZUV2ZW50
OworY2xhc3MgRXh0NERpc2NhcmRCbG9ja3NGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDREaXNjYXJk
UHJlYWxsb2NhdGlvbnNGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDREcm9wSW5vZGVGdHJhY2VFdmVu
dDsKK2NsYXNzIEV4dDRFc0NhY2hlRXh0ZW50RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RXNGaW5k
RGVsYXllZEV4dGVudFJhbmdlRW50ZXJGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRFc0ZpbmREZWxh
eWVkRXh0ZW50UmFuZ2VFeGl0RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RXNJbnNlcnRFeHRlbnRG
dHJhY2VFdmVudDsKK2NsYXNzIEV4dDRFc0xvb2t1cEV4dGVudEVudGVyRnRyYWNlRXZlbnQ7Citj
bGFzcyBFeHQ0RXNMb29rdXBFeHRlbnRFeGl0RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RXNSZW1v
dmVFeHRlbnRGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRFc1Nocmlua0NvdW50RnRyYWNlRXZlbnQ7
CitjbGFzcyBFeHQ0RXNTaHJpbmtGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRFc1Nocmlua1NjYW5F
bnRlckZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEVzU2hyaW5rU2NhbkV4aXRGdHJhY2VFdmVudDsK
K2NsYXNzIEV4dDRFdmljdElub2RlRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RXh0Q29udmVydFRv
SW5pdGlhbGl6ZWRFbnRlckZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEV4dENvbnZlcnRUb0luaXRp
YWxpemVkRmFzdHBhdGhGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRFeHRIYW5kbGVVbndyaXR0ZW5F
eHRlbnRzRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RXh0SW5DYWNoZUZ0cmFjZUV2ZW50OworY2xh
c3MgRXh0NEV4dExvYWRFeHRlbnRGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRFeHRNYXBCbG9ja3NF
bnRlckZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEV4dE1hcEJsb2Nrc0V4aXRGdHJhY2VFdmVudDsK
K2NsYXNzIEV4dDRFeHRQdXRJbkNhY2hlRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RXh0UmVtb3Zl
U3BhY2VEb25lRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0RXh0UmVtb3ZlU3BhY2VGdHJhY2VFdmVu
dDsKK2NsYXNzIEV4dDRFeHRSbUlkeEZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEV4dFJtTGVhZkZ0
cmFjZUV2ZW50OworY2xhc3MgRXh0NEV4dFNob3dFeHRlbnRGdHJhY2VFdmVudDsKK2NsYXNzIEV4
dDRGYWxsb2NhdGVFbnRlckZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEZhbGxvY2F0ZUV4aXRGdHJh
Y2VFdmVudDsKK2NsYXNzIEV4dDRGaW5kRGVsYWxsb2NSYW5nZUZ0cmFjZUV2ZW50OworY2xhc3Mg
RXh0NEZvcmdldEZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEZyZWVCbG9ja3NGdHJhY2VFdmVudDsK
K2NsYXNzIEV4dDRGcmVlSW5vZGVGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRHZXRJbXBsaWVkQ2x1
c3RlckFsbG9jRXhpdEZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEdldFJlc2VydmVkQ2x1c3RlckFs
bG9jRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0SW5kTWFwQmxvY2tzRW50ZXJGdHJhY2VFdmVudDsK
K2NsYXNzIEV4dDRJbmRNYXBCbG9ja3NFeGl0RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0SW5zZXJ0
UmFuZ2VGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRJbnZhbGlkYXRlcGFnZUZ0cmFjZUV2ZW50Owor
Y2xhc3MgRXh0NEpvdXJuYWxTdGFydEZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NEpvdXJuYWxTdGFy
dFJlc2VydmVkRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0Sm91cm5hbGxlZEludmFsaWRhdGVwYWdl
RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0Sm91cm5hbGxlZFdyaXRlRW5kRnRyYWNlRXZlbnQ7Citj
bGFzcyBFeHQ0TG9hZElub2RlQml0bWFwRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0TG9hZElub2Rl
RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0TWFya0lub2RlRGlydHlGdHJhY2VFdmVudDsKK2NsYXNz
IEV4dDRNYkJpdG1hcExvYWRGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRNYkJ1ZGR5Qml0bWFwTG9h
ZEZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NE1iRGlzY2FyZFByZWFsbG9jYXRpb25zRnRyYWNlRXZl
bnQ7CitjbGFzcyBFeHQ0TWJOZXdHcm91cFBhRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0TWJOZXdJ
bm9kZVBhRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0TWJSZWxlYXNlR3JvdXBQYUZ0cmFjZUV2ZW50
OworY2xhc3MgRXh0NE1iUmVsZWFzZUlub2RlUGFGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRNYmFs
bG9jQWxsb2NGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRNYmFsbG9jRGlzY2FyZEZ0cmFjZUV2ZW50
OworY2xhc3MgRXh0NE1iYWxsb2NGcmVlRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0TWJhbGxvY1By
ZWFsbG9jRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0T3RoZXJJbm9kZVVwZGF0ZVRpbWVGdHJhY2VF
dmVudDsKK2NsYXNzIEV4dDRQdW5jaEhvbGVGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRSZWFkQmxv
Y2tCaXRtYXBMb2FkRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0UmVhZHBhZ2VGdHJhY2VFdmVudDsK
K2NsYXNzIEV4dDRSZWxlYXNlcGFnZUZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NFJlbW92ZUJsb2Nr
c0Z0cmFjZUV2ZW50OworY2xhc3MgRXh0NFJlcXVlc3RCbG9ja3NGdHJhY2VFdmVudDsKK2NsYXNz
IEV4dDRSZXF1ZXN0SW5vZGVGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRTeW5jRmlsZUVudGVyRnRy
YWNlRXZlbnQ7CitjbGFzcyBFeHQ0U3luY0ZpbGVFeGl0RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0
U3luY0ZzRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0VHJpbUFsbEZyZWVGdHJhY2VFdmVudDsKK2Ns
YXNzIEV4dDRUcmltRXh0ZW50RnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0VHJ1bmNhdGVFbnRlckZ0
cmFjZUV2ZW50OworY2xhc3MgRXh0NFRydW5jYXRlRXhpdEZ0cmFjZUV2ZW50OworY2xhc3MgRXh0
NFVubGlua0VudGVyRnRyYWNlRXZlbnQ7CitjbGFzcyBFeHQ0VW5saW5rRXhpdEZ0cmFjZUV2ZW50
OworY2xhc3MgRXh0NFdyaXRlQmVnaW5GdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRXcml0ZUVuZEZ0
cmFjZUV2ZW50OworY2xhc3MgRXh0NFdyaXRlcGFnZUZ0cmFjZUV2ZW50OworY2xhc3MgRXh0NFdy
aXRlcGFnZXNGdHJhY2VFdmVudDsKK2NsYXNzIEV4dDRXcml0ZXBhZ2VzUmVzdWx0RnRyYWNlRXZl
bnQ7CitjbGFzcyBFeHQ0WmVyb1JhbmdlRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzRG9TdWJtaXRC
aW9GdHJhY2VFdmVudDsKK2NsYXNzIEYyZnNFdmljdElub2RlRnRyYWNlRXZlbnQ7CitjbGFzcyBG
MmZzRmFsbG9jYXRlRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzR2V0RGF0YUJsb2NrRnRyYWNlRXZl
bnQ7CitjbGFzcyBGMmZzR2V0VmljdGltRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzSWdldEV4aXRG
dHJhY2VFdmVudDsKK2NsYXNzIEYyZnNJZ2V0RnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzTmV3SW5v
ZGVGdHJhY2VFdmVudDsKK2NsYXNzIEYyZnNSZWFkcGFnZUZ0cmFjZUV2ZW50OworY2xhc3MgRjJm
c1Jlc2VydmVOZXdCbG9ja0Z0cmFjZUV2ZW50OworY2xhc3MgRjJmc1NldFBhZ2VEaXJ0eUZ0cmFj
ZUV2ZW50OworY2xhc3MgRjJmc1N1Ym1pdFdyaXRlUGFnZUZ0cmFjZUV2ZW50OworY2xhc3MgRjJm
c1N5bmNGaWxlRW50ZXJGdHJhY2VFdmVudDsKK2NsYXNzIEYyZnNTeW5jRmlsZUV4aXRGdHJhY2VF
dmVudDsKK2NsYXNzIEYyZnNTeW5jRnNGdHJhY2VFdmVudDsKK2NsYXNzIEYyZnNUcnVuY2F0ZUJs
b2Nrc0VudGVyRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzVHJ1bmNhdGVCbG9ja3NFeGl0RnRyYWNl
RXZlbnQ7CitjbGFzcyBGMmZzVHJ1bmNhdGVEYXRhQmxvY2tzUmFuZ2VGdHJhY2VFdmVudDsKK2Ns
YXNzIEYyZnNUcnVuY2F0ZUZ0cmFjZUV2ZW50OworY2xhc3MgRjJmc1RydW5jYXRlSW5vZGVCbG9j
a3NFbnRlckZ0cmFjZUV2ZW50OworY2xhc3MgRjJmc1RydW5jYXRlSW5vZGVCbG9ja3NFeGl0RnRy
YWNlRXZlbnQ7CitjbGFzcyBGMmZzVHJ1bmNhdGVOb2RlRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZz
VHJ1bmNhdGVOb2Rlc0VudGVyRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzVHJ1bmNhdGVOb2Rlc0V4
aXRGdHJhY2VFdmVudDsKK2NsYXNzIEYyZnNUcnVuY2F0ZVBhcnRpYWxOb2Rlc0Z0cmFjZUV2ZW50
OworY2xhc3MgRjJmc1VubGlua0VudGVyRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzVW5saW5rRXhp
dEZ0cmFjZUV2ZW50OworY2xhc3MgRjJmc1ZtUGFnZU1rd3JpdGVGdHJhY2VFdmVudDsKK2NsYXNz
IEYyZnNXcml0ZUJlZ2luRnRyYWNlRXZlbnQ7CitjbGFzcyBGMmZzV3JpdGVDaGVja3BvaW50RnRy
YWNlRXZlbnQ7CitjbGFzcyBGMmZzV3JpdGVFbmRGdHJhY2VFdmVudDsKK2NsYXNzIEZlbmNlRGVz
dHJveUZ0cmFjZUV2ZW50OworY2xhc3MgRmVuY2VFbmFibGVTaWduYWxGdHJhY2VFdmVudDsKK2Ns
YXNzIEZlbmNlSW5pdEZ0cmFjZUV2ZW50OworY2xhc3MgRmVuY2VTaWduYWxlZEZ0cmFjZUV2ZW50
OworY2xhc3MgR2VuZXJpY0Z0cmFjZUV2ZW50OworY2xhc3MgR3B1RnJlcXVlbmN5RnRyYWNlRXZl
bnQ7CitjbGFzcyBHcHVNZW1Ub3RhbEZ0cmFjZUV2ZW50OworY2xhc3MgSTJjUmVhZEZ0cmFjZUV2
ZW50OworY2xhc3MgSTJjUmVwbHlGdHJhY2VFdmVudDsKK2NsYXNzIEkyY1Jlc3VsdEZ0cmFjZUV2
ZW50OworY2xhc3MgSTJjV3JpdGVGdHJhY2VFdmVudDsKK2NsYXNzIElvbW11TWFwUmFuZ2VGdHJh
Y2VFdmVudDsKK2NsYXNzIElvbW11U2VjUHRibE1hcFJhbmdlRW5kRnRyYWNlRXZlbnQ7CitjbGFz
cyBJb21tdVNlY1B0YmxNYXBSYW5nZVN0YXJ0RnRyYWNlRXZlbnQ7CitjbGFzcyBJb25BbGxvY0J1
ZmZlckVuZEZ0cmFjZUV2ZW50OworY2xhc3MgSW9uQWxsb2NCdWZmZXJGYWlsRnRyYWNlRXZlbnQ7
CitjbGFzcyBJb25BbGxvY0J1ZmZlckZhbGxiYWNrRnRyYWNlRXZlbnQ7CitjbGFzcyBJb25BbGxv
Y0J1ZmZlclN0YXJ0RnRyYWNlRXZlbnQ7CitjbGFzcyBJb25CdWZmZXJDcmVhdGVGdHJhY2VFdmVu
dDsKK2NsYXNzIElvbkJ1ZmZlckRlc3Ryb3lGdHJhY2VFdmVudDsKK2NsYXNzIElvbkNwQWxsb2NS
ZXRyeUZ0cmFjZUV2ZW50OworY2xhc3MgSW9uQ3BTZWN1cmVCdWZmZXJFbmRGdHJhY2VFdmVudDsK
K2NsYXNzIElvbkNwU2VjdXJlQnVmZmVyU3RhcnRGdHJhY2VFdmVudDsKK2NsYXNzIElvbkhlYXBH
cm93RnRyYWNlRXZlbnQ7CitjbGFzcyBJb25IZWFwU2hyaW5rRnRyYWNlRXZlbnQ7CitjbGFzcyBJ
b25QcmVmZXRjaGluZ0Z0cmFjZUV2ZW50OworY2xhc3MgSW9uU2VjdXJlQ21hQWRkVG9Qb29sRW5k
RnRyYWNlRXZlbnQ7CitjbGFzcyBJb25TZWN1cmVDbWFBZGRUb1Bvb2xTdGFydEZ0cmFjZUV2ZW50
OworY2xhc3MgSW9uU2VjdXJlQ21hQWxsb2NhdGVFbmRGdHJhY2VFdmVudDsKK2NsYXNzIElvblNl
Y3VyZUNtYUFsbG9jYXRlU3RhcnRGdHJhY2VFdmVudDsKK2NsYXNzIElvblNlY3VyZUNtYVNocmlu
a1Bvb2xFbmRGdHJhY2VFdmVudDsKK2NsYXNzIElvblNlY3VyZUNtYVNocmlua1Bvb2xTdGFydEZ0
cmFjZUV2ZW50OworY2xhc3MgSW9uU3RhdEZ0cmFjZUV2ZW50OworY2xhc3MgSXBpRW50cnlGdHJh
Y2VFdmVudDsKK2NsYXNzIElwaUV4aXRGdHJhY2VFdmVudDsKK2NsYXNzIElwaVJhaXNlRnRyYWNl
RXZlbnQ7CitjbGFzcyBJcnFIYW5kbGVyRW50cnlGdHJhY2VFdmVudDsKK2NsYXNzIElycUhhbmRs
ZXJFeGl0RnRyYWNlRXZlbnQ7CitjbGFzcyBLZnJlZUZ0cmFjZUV2ZW50OworY2xhc3MgS21hbGxv
Y0Z0cmFjZUV2ZW50OworY2xhc3MgS21hbGxvY05vZGVGdHJhY2VFdmVudDsKK2NsYXNzIEttZW1D
YWNoZUFsbG9jRnRyYWNlRXZlbnQ7CitjbGFzcyBLbWVtQ2FjaGVBbGxvY05vZGVGdHJhY2VFdmVu
dDsKK2NsYXNzIEttZW1DYWNoZUZyZWVGdHJhY2VFdmVudDsKK2NsYXNzIExvd21lbW9yeUtpbGxG
dHJhY2VFdmVudDsKK2NsYXNzIE1hcmtWaWN0aW1GdHJhY2VFdmVudDsKK2NsYXNzIE1kcENtZEtp
Y2tvZmZGdHJhY2VFdmVudDsKK2NsYXNzIE1kcENtZFBpbmdwb25nRG9uZUZ0cmFjZUV2ZW50Owor
Y2xhc3MgTWRwQ21kUmVhZHB0ckRvbmVGdHJhY2VFdmVudDsKK2NsYXNzIE1kcENtZFJlbGVhc2VC
d0Z0cmFjZUV2ZW50OworY2xhc3MgTWRwQ21kV2FpdFBpbmdwb25nRnRyYWNlRXZlbnQ7CitjbGFz
cyBNZHBDb21taXRGdHJhY2VFdmVudDsKK2NsYXNzIE1kcENvbXBhcmVCd0Z0cmFjZUV2ZW50Owor
Y2xhc3MgTWRwTWlzckNyY0Z0cmFjZUV2ZW50OworY2xhc3MgTWRwTWl4ZXJVcGRhdGVGdHJhY2VF
dmVudDsKK2NsYXNzIE1kcFBlcmZQcmVmaWxsQ2FsY0Z0cmFjZUV2ZW50OworY2xhc3MgTWRwUGVy
ZlNldE90RnRyYWNlRXZlbnQ7CitjbGFzcyBNZHBQZXJmU2V0UGFuaWNMdXRzRnRyYWNlRXZlbnQ7
CitjbGFzcyBNZHBQZXJmU2V0UW9zTHV0c0Z0cmFjZUV2ZW50OworY2xhc3MgTWRwUGVyZlNldFdt
TGV2ZWxzRnRyYWNlRXZlbnQ7CitjbGFzcyBNZHBQZXJmVXBkYXRlQnVzRnRyYWNlRXZlbnQ7Citj
bGFzcyBNZHBTc3BwQ2hhbmdlRnRyYWNlRXZlbnQ7CitjbGFzcyBNZHBTc3BwU2V0RnRyYWNlRXZl
bnQ7CitjbGFzcyBNZHBUcmFjZUNvdW50ZXJGdHJhY2VFdmVudDsKK2NsYXNzIE1kcFZpZGVvVW5k
ZXJydW5Eb25lRnRyYWNlRXZlbnQ7CitjbGFzcyBNaWdyYXRlUGFnZXNFbmRGdHJhY2VFdmVudDsK
K2NsYXNzIE1pZ3JhdGVQYWdlc1N0YXJ0RnRyYWNlRXZlbnQ7CitjbGFzcyBNaWdyYXRlUmV0cnlG
dHJhY2VFdmVudDsKK2NsYXNzIE1tQ29tcGFjdGlvbkJlZ2luRnRyYWNlRXZlbnQ7CitjbGFzcyBN
bUNvbXBhY3Rpb25EZWZlckNvbXBhY3Rpb25GdHJhY2VFdmVudDsKK2NsYXNzIE1tQ29tcGFjdGlv
bkRlZmVyUmVzZXRGdHJhY2VFdmVudDsKK2NsYXNzIE1tQ29tcGFjdGlvbkRlZmVycmVkRnRyYWNl
RXZlbnQ7CitjbGFzcyBNbUNvbXBhY3Rpb25FbmRGdHJhY2VFdmVudDsKK2NsYXNzIE1tQ29tcGFj
dGlvbkZpbmlzaGVkRnRyYWNlRXZlbnQ7CitjbGFzcyBNbUNvbXBhY3Rpb25Jc29sYXRlRnJlZXBh
Z2VzRnRyYWNlRXZlbnQ7CitjbGFzcyBNbUNvbXBhY3Rpb25Jc29sYXRlTWlncmF0ZXBhZ2VzRnRy
YWNlRXZlbnQ7CitjbGFzcyBNbUNvbXBhY3Rpb25LY29tcGFjdGRTbGVlcEZ0cmFjZUV2ZW50Owor
Y2xhc3MgTW1Db21wYWN0aW9uS2NvbXBhY3RkV2FrZUZ0cmFjZUV2ZW50OworY2xhc3MgTW1Db21w
YWN0aW9uTWlncmF0ZXBhZ2VzRnRyYWNlRXZlbnQ7CitjbGFzcyBNbUNvbXBhY3Rpb25TdWl0YWJs
ZUZ0cmFjZUV2ZW50OworY2xhc3MgTW1Db21wYWN0aW9uVHJ5VG9Db21wYWN0UGFnZXNGdHJhY2VF
dmVudDsKK2NsYXNzIE1tQ29tcGFjdGlvbldha2V1cEtjb21wYWN0ZEZ0cmFjZUV2ZW50OworY2xh
c3MgTW1FdmVudFJlY29yZEZ0cmFjZUV2ZW50OworY2xhc3MgTW1GaWxlbWFwQWRkVG9QYWdlQ2Fj
aGVGdHJhY2VFdmVudDsKK2NsYXNzIE1tRmlsZW1hcERlbGV0ZUZyb21QYWdlQ2FjaGVGdHJhY2VF
dmVudDsKK2NsYXNzIE1tUGFnZUFsbG9jRXh0ZnJhZ0Z0cmFjZUV2ZW50OworY2xhc3MgTW1QYWdl
QWxsb2NGdHJhY2VFdmVudDsKK2NsYXNzIE1tUGFnZUFsbG9jWm9uZUxvY2tlZEZ0cmFjZUV2ZW50
OworY2xhc3MgTW1QYWdlRnJlZUJhdGNoZWRGdHJhY2VFdmVudDsKK2NsYXNzIE1tUGFnZUZyZWVG
dHJhY2VFdmVudDsKK2NsYXNzIE1tUGFnZVBjcHVEcmFpbkZ0cmFjZUV2ZW50OworY2xhc3MgTW1W
bXNjYW5EaXJlY3RSZWNsYWltQmVnaW5GdHJhY2VFdmVudDsKK2NsYXNzIE1tVm1zY2FuRGlyZWN0
UmVjbGFpbUVuZEZ0cmFjZUV2ZW50OworY2xhc3MgTW1WbXNjYW5Lc3dhcGRTbGVlcEZ0cmFjZUV2
ZW50OworY2xhc3MgTW1WbXNjYW5Lc3dhcGRXYWtlRnRyYWNlRXZlbnQ7CitjbGFzcyBPb21TY29y
ZUFkalVwZGF0ZUZ0cmFjZUV2ZW50OworY2xhc3MgUHJpbnRGdHJhY2VFdmVudDsKK2NsYXNzIFJl
Z3VsYXRvckRpc2FibGVDb21wbGV0ZUZ0cmFjZUV2ZW50OworY2xhc3MgUmVndWxhdG9yRGlzYWJs
ZUZ0cmFjZUV2ZW50OworY2xhc3MgUmVndWxhdG9yRW5hYmxlQ29tcGxldGVGdHJhY2VFdmVudDsK
K2NsYXNzIFJlZ3VsYXRvckVuYWJsZURlbGF5RnRyYWNlRXZlbnQ7CitjbGFzcyBSZWd1bGF0b3JF
bmFibGVGdHJhY2VFdmVudDsKK2NsYXNzIFJlZ3VsYXRvclNldFZvbHRhZ2VDb21wbGV0ZUZ0cmFj
ZUV2ZW50OworY2xhc3MgUmVndWxhdG9yU2V0Vm9sdGFnZUZ0cmFjZUV2ZW50OworY2xhc3MgUm90
YXRvckJ3QW9Bc0NvbnRleHRGdHJhY2VFdmVudDsKK2NsYXNzIFJzc1N0YXRGdHJhY2VFdmVudDsK
K2NsYXNzIFNjaGVkQmxvY2tlZFJlYXNvbkZ0cmFjZUV2ZW50OworY2xhc3MgU2NoZWRDcHVIb3Rw
bHVnRnRyYWNlRXZlbnQ7CitjbGFzcyBTY2hlZFByb2Nlc3NFeGVjRnRyYWNlRXZlbnQ7CitjbGFz
cyBTY2hlZFByb2Nlc3NFeGl0RnRyYWNlRXZlbnQ7CitjbGFzcyBTY2hlZFByb2Nlc3NGb3JrRnRy
YWNlRXZlbnQ7CitjbGFzcyBTY2hlZFByb2Nlc3NGcmVlRnRyYWNlRXZlbnQ7CitjbGFzcyBTY2hl
ZFByb2Nlc3NIYW5nRnRyYWNlRXZlbnQ7CitjbGFzcyBTY2hlZFByb2Nlc3NXYWl0RnRyYWNlRXZl
bnQ7CitjbGFzcyBTY2hlZFN3aXRjaEZ0cmFjZUV2ZW50OworY2xhc3MgU2NoZWRXYWtldXBGdHJh
Y2VFdmVudDsKK2NsYXNzIFNjaGVkV2FrZXVwTmV3RnRyYWNlRXZlbnQ7CitjbGFzcyBTY2hlZFdh
a2luZ0Z0cmFjZUV2ZW50OworY2xhc3MgU2NtQ2FsbEVuZEZ0cmFjZUV2ZW50OworY2xhc3MgU2Nt
Q2FsbFN0YXJ0RnRyYWNlRXZlbnQ7CitjbGFzcyBTZGVUcmFjaW5nTWFya1dyaXRlRnRyYWNlRXZl
bnQ7CitjbGFzcyBTaWduYWxEZWxpdmVyRnRyYWNlRXZlbnQ7CitjbGFzcyBTaWduYWxHZW5lcmF0
ZUZ0cmFjZUV2ZW50OworY2xhc3MgU21idXNSZWFkRnRyYWNlRXZlbnQ7CitjbGFzcyBTbWJ1c1Jl
cGx5RnRyYWNlRXZlbnQ7CitjbGFzcyBTbWJ1c1Jlc3VsdEZ0cmFjZUV2ZW50OworY2xhc3MgU21i
dXNXcml0ZUZ0cmFjZUV2ZW50OworY2xhc3MgU29mdGlycUVudHJ5RnRyYWNlRXZlbnQ7CitjbGFz
cyBTb2Z0aXJxRXhpdEZ0cmFjZUV2ZW50OworY2xhc3MgU29mdGlycVJhaXNlRnRyYWNlRXZlbnQ7
CitjbGFzcyBTdXNwZW5kUmVzdW1lRnRyYWNlRXZlbnQ7CitjbGFzcyBTeW5jUHRGdHJhY2VFdmVu
dDsKK2NsYXNzIFN5bmNUaW1lbGluZUZ0cmFjZUV2ZW50OworY2xhc3MgU3luY1dhaXRGdHJhY2VF
dmVudDsKK2NsYXNzIFN5c0VudGVyRnRyYWNlRXZlbnQ7CitjbGFzcyBTeXNFeGl0RnRyYWNlRXZl
bnQ7CitjbGFzcyBUYXNrTmV3dGFza0Z0cmFjZUV2ZW50OworY2xhc3MgVGFza1JlbmFtZUZ0cmFj
ZUV2ZW50OworY2xhc3MgVHJhY2luZ01hcmtXcml0ZUZ0cmFjZUV2ZW50OworY2xhc3MgV29ya3F1
ZXVlQWN0aXZhdGVXb3JrRnRyYWNlRXZlbnQ7CitjbGFzcyBXb3JrcXVldWVFeGVjdXRlRW5kRnRy
YWNlRXZlbnQ7CitjbGFzcyBXb3JrcXVldWVFeGVjdXRlU3RhcnRGdHJhY2VFdmVudDsKK2NsYXNz
IFdvcmtxdWV1ZVF1ZXVlV29ya0Z0cmFjZUV2ZW50OworY2xhc3MgWmVyb0Z0cmFjZUV2ZW50Owor
CitjbGFzcyBGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzM0MCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3RpbWVzdGFtcCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB0aW1lc3RhbXAoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBwaWQoKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3ByaW50KCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHByaW50KCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3NjaGVkX3N3
aXRjaCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBzY2hlZF9zd2l0Y2goKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfY3B1X2ZyZXF1ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY3B1X2ZyZXF1ZW5jeSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY3B1X2ZyZXF1
ZW5jeV9saW1pdHMoKSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIGNwdV9mcmVxdWVuY3lfbGltaXRzKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jcHVfaWRsZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDEzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY3B1X2lk
bGUoKSBjb25zdCB7IHJldHVybiBhdDwxMz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Ns
b2NrX2VuYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgY2xvY2tfZW5hYmxlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCku
YXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jbG9ja19kaXNhYmxlKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBjbG9ja19kaXNh
YmxlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19j
bG9ja19zZXRfcmF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgY2xvY2tfc2V0X3JhdGUoKSBjb25zdCB7IHJldHVybiBhdDwx
Nj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3NjaGVkX3dha2V1cCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc2NoZWRf
d2FrZXVwKCkgY29uc3QgeyByZXR1cm4gYXQ8MTc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19zY2hlZF9ibG9ja2VkX3JlYXNvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDE4PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc2NoZWRfYmxvY2tlZF9yZWFzb24oKSBjb25z
dCB7IHJldHVybiBhdDwxOD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3NjaGVkX2NwdV9o
b3RwbHVnKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBzY2hlZF9jcHVfaG90cGx1ZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE5Pigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2NoZWRfd2FraW5nKCkgY29uc3QgeyByZXR1cm4g
YXQ8MjA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzY2hlZF93YWtp
bmcoKSBjb25zdCB7IHJldHVybiBhdDwyMD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lw
aV9lbnRyeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgaXBpX2VudHJ5KCkgY29uc3QgeyByZXR1cm4gYXQ8MjE+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19pcGlfZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDIyPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaXBpX2V4aXQoKSBjb25zdCB7IHJl
dHVybiBhdDwyMj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lwaV9yYWlzZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDIzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
aXBpX3JhaXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19zb2Z0aXJxX2VudHJ5KCkgY29uc3QgeyByZXR1cm4gYXQ8MjQ+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzb2Z0aXJxX2VudHJ5KCkgY29uc3QgeyByZXR1cm4g
YXQ8MjQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19zb2Z0aXJxX2V4aXQoKSBjb25zdCB7
IHJldHVybiBhdDwyNT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHNv
ZnRpcnFfZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfc29mdGlycV9yYWlzZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI2PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc29mdGlycV9yYWlzZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfaTJjX3JlYWQoKSBjb25zdCB7IHJl
dHVybiBhdDwyNz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGkyY19y
ZWFkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19p
MmNfd3JpdGUoKSBjb25zdCB7IHJldHVybiBhdDwyOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzIGkyY193cml0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI4PigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfaTJjX3Jlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI5Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaTJjX3Jlc3VsdCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfaTJjX3JlcGx5KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MzA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBpMmNfcmVwbHkoKSBjb25zdCB7IHJldHVybiBhdDwzMD4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX3NtYnVzX3JlYWQoKSBjb25zdCB7IHJldHVybiBhdDwzMT4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHNtYnVzX3JlYWQoKSBjb25zdCB7IHJldHVybiBh
dDwzMT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3NtYnVzX3dyaXRlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MzI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzbWJ1
c193cml0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfc21idXNfcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gYXQ8MzM+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBzbWJ1c19yZXN1bHQoKSBjb25zdCB7IHJldHVybiBhdDwz
Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3NtYnVzX3JlcGx5KCkgY29uc3QgeyByZXR1
cm4gYXQ8MzQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBzbWJ1c19y
ZXBseSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
bG93bWVtb3J5X2tpbGwoKSBjb25zdCB7IHJldHVybiBhdDwzNT4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGxvd21lbW9yeV9raWxsKCkgY29uc3QgeyByZXR1cm4gYXQ8
MzU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19pcnFfaGFuZGxlcl9lbnRyeSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDM2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
aXJxX2hhbmRsZXJfZW50cnkoKSBjb25zdCB7IHJldHVybiBhdDwzNj4oKS5hc19ieXRlcygpOyB9
CisgIGJvb2wgaGFzX2lycV9oYW5kbGVyX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwzNz4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGlycV9oYW5kbGVyX2V4aXQoKSBj
b25zdCB7IHJldHVybiBhdDwzNz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3N5bmNfcHQo
KSBjb25zdCB7IHJldHVybiBhdDwzOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIHN5bmNfcHQoKSBjb25zdCB7IHJldHVybiBhdDwzOD4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX3N5bmNfdGltZWxpbmUoKSBjb25zdCB7IHJldHVybiBhdDwzOT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHN5bmNfdGltZWxpbmUoKSBjb25zdCB7IHJl
dHVybiBhdDwzOT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3N5bmNfd2FpdCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
c3luY193YWl0KCkgY29uc3QgeyByZXR1cm4gYXQ8NDA+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19leHQ0X2RhX3dyaXRlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXQ8NDE+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2RhX3dyaXRlX2JlZ2luKCkgY29u
c3QgeyByZXR1cm4gYXQ8NDE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2RhX3dy
aXRlX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgZXh0NF9kYV93cml0ZV9lbmQoKSBjb25zdCB7IHJldHVybiBhdDw0Mj4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfc3luY19maWxlX2VudGVyKCkgY29uc3Qg
eyByZXR1cm4gYXQ8NDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBl
eHQ0X3N5bmNfZmlsZV9lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQzPigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfZXh0NF9zeW5jX2ZpbGVfZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ0
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9zeW5jX2ZpbGVf
ZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
YmxvY2tfcnFfaXNzdWUoKSBjb25zdCB7IHJldHVybiBhdDw0NT4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJsb2NrX3JxX2lzc3VlKCkgY29uc3QgeyByZXR1cm4gYXQ8
NDU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tbV92bXNjYW5fZGlyZWN0X3JlY2xhaW1f
YmVnaW4oKSBjb25zdCB7IHJldHVybiBhdDw0Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzIG1tX3Ztc2Nhbl9kaXJlY3RfcmVjbGFpbV9iZWdpbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbW1fdm1zY2FuX2RpcmVjdF9y
ZWNsYWltX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgbW1fdm1zY2FuX2RpcmVjdF9yZWNsYWltX2VuZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbW1fdm1zY2FuX2tzd2Fw
ZF93YWtlKCkgY29uc3QgeyByZXR1cm4gYXQ8NDg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBtbV92bXNjYW5fa3N3YXBkX3dha2UoKSBjb25zdCB7IHJldHVybiBhdDw0
OD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21tX3Ztc2Nhbl9rc3dhcGRfc2xlZXAoKSBj
b25zdCB7IHJldHVybiBhdDw0OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIG1tX3Ztc2Nhbl9rc3dhcGRfc2xlZXAoKSBjb25zdCB7IHJldHVybiBhdDw0OT4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX2JpbmRlcl90cmFuc2FjdGlvbigpIGNvbnN0IHsgcmV0dXJu
IGF0PDUwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmluZGVyX3Ry
YW5zYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8NTA+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19iaW5kZXJfdHJhbnNhY3Rpb25fcmVjZWl2ZWQoKSBjb25zdCB7IHJldHVybiBhdDw1MT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJpbmRlcl90cmFuc2FjdGlv
bl9yZWNlaXZlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDUxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfYmluZGVyX3NldF9wcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGF0PDUyPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmluZGVyX3NldF9wcmlvcml0eSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDUyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYmluZGVyX2xv
Y2soKSBjb25zdCB7IHJldHVybiBhdDw1Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIGJpbmRlcl9sb2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8NTM+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19iaW5kZXJfbG9ja2VkKCkgY29uc3QgeyByZXR1cm4gYXQ8NTQ+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBiaW5kZXJfbG9ja2VkKCkgY29u
c3QgeyByZXR1cm4gYXQ8NTQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19iaW5kZXJfdW5s
b2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8NTU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBiaW5kZXJfdW5sb2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8NTU+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc193b3JrcXVldWVfYWN0aXZhdGVfd29yaygpIGNvbnN0IHsgcmV0
dXJuIGF0PDU2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgd29ya3F1
ZXVlX2FjdGl2YXRlX3dvcmsoKSBjb25zdCB7IHJldHVybiBhdDw1Nj4oKS5hc19ieXRlcygpOyB9
CisgIGJvb2wgaGFzX3dvcmtxdWV1ZV9leGVjdXRlX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU3
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgd29ya3F1ZXVlX2V4ZWN1
dGVfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8NTc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c193b3JrcXVldWVfZXhlY3V0ZV9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU4PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgd29ya3F1ZXVlX2V4ZWN1dGVfc3RhcnQo
KSBjb25zdCB7IHJldHVybiBhdDw1OD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3dvcmtx
dWV1ZV9xdWV1ZV93b3JrKCkgY29uc3QgeyByZXR1cm4gYXQ8NTk+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyB3b3JrcXVldWVfcXVldWVfd29yaygpIGNvbnN0IHsgcmV0
dXJuIGF0PDU5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfcmVndWxhdG9yX2Rpc2FibGUo
KSBjb25zdCB7IHJldHVybiBhdDw2MD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIHJlZ3VsYXRvcl9kaXNhYmxlKCkgY29uc3QgeyByZXR1cm4gYXQ8NjA+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19yZWd1bGF0b3JfZGlzYWJsZV9jb21wbGV0ZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDYxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcmVn
dWxhdG9yX2Rpc2FibGVfY29tcGxldGUoKSBjb25zdCB7IHJldHVybiBhdDw2MT4oKS5hc19ieXRl
cygpOyB9CisgIGJvb2wgaGFzX3JlZ3VsYXRvcl9lbmFibGUoKSBjb25zdCB7IHJldHVybiBhdDw2
Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHJlZ3VsYXRvcl9lbmFi
bGUoKSBjb25zdCB7IHJldHVybiBhdDw2Mj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Jl
Z3VsYXRvcl9lbmFibGVfY29tcGxldGUoKSBjb25zdCB7IHJldHVybiBhdDw2Mz4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHJlZ3VsYXRvcl9lbmFibGVfY29tcGxldGUo
KSBjb25zdCB7IHJldHVybiBhdDw2Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3JlZ3Vs
YXRvcl9lbmFibGVfZGVsYXkoKSBjb25zdCB7IHJldHVybiBhdDw2ND4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHJlZ3VsYXRvcl9lbmFibGVfZGVsYXkoKSBjb25zdCB7
IHJldHVybiBhdDw2ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3JlZ3VsYXRvcl9zZXRf
dm9sdGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgcmVndWxhdG9yX3NldF92b2x0YWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8
NjU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfY29t
cGxldGUoKSBjb25zdCB7IHJldHVybiBhdDw2Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzIHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9jb21wbGV0ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDY2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2dyb3VwX2F0dGFjaF90YXNr
KCkgY29uc3QgeyByZXR1cm4gYXQ8Njc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBjZ3JvdXBfYXR0YWNoX3Rhc2soKSBjb25zdCB7IHJldHVybiBhdDw2Nz4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX2Nncm91cF9ta2RpcigpIGNvbnN0IHsgcmV0dXJuIGF0PDY4
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2dyb3VwX21rZGlyKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Njg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jZ3JvdXBf
cmVtb3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgY2dyb3VwX3JlbW91bnQoKSBjb25zdCB7IHJldHVybiBhdDw2OT4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nncm91cF9ybWRpcigpIGNvbnN0IHsgcmV0dXJuIGF0
PDcwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2dyb3VwX3JtZGly
KCkgY29uc3QgeyByZXR1cm4gYXQ8NzA+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jZ3Jv
dXBfdHJhbnNmZXJfdGFza3MoKSBjb25zdCB7IHJldHVybiBhdDw3MT4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNncm91cF90cmFuc2Zlcl90YXNrcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDcxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2dyb3VwX2Rlc3Ryb3lf
cm9vdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDcyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgY2dyb3VwX2Rlc3Ryb3lfcm9vdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDcyPigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2dyb3VwX3JlbGVhc2UoKSBjb25zdCB7IHJldHVy
biBhdDw3Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNncm91cF9y
ZWxlYXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8NzM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19jZ3JvdXBfcmVuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8NzQ+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBjZ3JvdXBfcmVuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8
NzQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jZ3JvdXBfc2V0dXBfcm9vdCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDc1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
Y2dyb3VwX3NldHVwX3Jvb3QoKSBjb25zdCB7IHJldHVybiBhdDw3NT4oKS5hc19ieXRlcygpOyB9
CisgIGJvb2wgaGFzX21kcF9jbWRfa2lja29mZigpIGNvbnN0IHsgcmV0dXJuIGF0PDc2PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbWRwX2NtZF9raWNrb2ZmKCkgY29u
c3QgeyByZXR1cm4gYXQ8NzY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tZHBfY29tbWl0
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nzc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBtZHBfY29tbWl0KCkgY29uc3QgeyByZXR1cm4gYXQ8Nzc+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19tZHBfcGVyZl9zZXRfb3QoKSBjb25zdCB7IHJldHVybiBhdDw3OD4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1kcF9wZXJmX3NldF9vdCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDc4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWRwX3NzcHBf
Y2hhbmdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nzk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBtZHBfc3NwcF9jaGFuZ2UoKSBjb25zdCB7IHJldHVybiBhdDw3OT4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3RyYWNpbmdfbWFya193cml0ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDgwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdHJhY2lu
Z19tYXJrX3dyaXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8ODA+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19tZHBfY21kX3Bpbmdwb25nX2RvbmUoKSBjb25zdCB7IHJldHVybiBhdDw4MT4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1kcF9jbWRfcGluZ3BvbmdfZG9u
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDgxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWRw
X2NvbXBhcmVfYncoKSBjb25zdCB7IHJldHVybiBhdDw4Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIG1kcF9jb21wYXJlX2J3KCkgY29uc3QgeyByZXR1cm4gYXQ8ODI+
KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tZHBfcGVyZl9zZXRfcGFuaWNfbHV0cygpIGNv
bnN0IHsgcmV0dXJuIGF0PDgzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgbWRwX3BlcmZfc2V0X3BhbmljX2x1dHMoKSBjb25zdCB7IHJldHVybiBhdDw4Mz4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX21kcF9zc3BwX3NldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg0
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbWRwX3NzcHBfc2V0KCkg
Y29uc3QgeyByZXR1cm4gYXQ8ODQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tZHBfY21k
X3JlYWRwdHJfZG9uZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg1PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgbWRwX2NtZF9yZWFkcHRyX2RvbmUoKSBjb25zdCB7IHJldHVy
biBhdDw4NT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21kcF9taXNyX2NyYygpIGNvbnN0
IHsgcmV0dXJuIGF0PDg2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
bWRwX21pc3JfY3JjKCkgY29uc3QgeyByZXR1cm4gYXQ8ODY+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19tZHBfcGVyZl9zZXRfcW9zX2x1dHMoKSBjb25zdCB7IHJldHVybiBhdDw4Nz4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1kcF9wZXJmX3NldF9xb3NfbHV0
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDg3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWRw
X3RyYWNlX2NvdW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDw4OD4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1kcF90cmFjZV9jb3VudGVyKCkgY29uc3QgeyByZXR1cm4g
YXQ8ODg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tZHBfY21kX3JlbGVhc2VfYncoKSBj
b25zdCB7IHJldHVybiBhdDw4OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIG1kcF9jbWRfcmVsZWFzZV9idygpIGNvbnN0IHsgcmV0dXJuIGF0PDg5PigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfbWRwX21peGVyX3VwZGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDkw
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbWRwX21peGVyX3VwZGF0
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDkwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWRw
X3BlcmZfc2V0X3dtX2xldmVscygpIGNvbnN0IHsgcmV0dXJuIGF0PDkxPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbWRwX3BlcmZfc2V0X3dtX2xldmVscygpIGNvbnN0
IHsgcmV0dXJuIGF0PDkxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWRwX3ZpZGVvX3Vu
ZGVycnVuX2RvbmUoKSBjb25zdCB7IHJldHVybiBhdDw5Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIG1kcF92aWRlb191bmRlcnJ1bl9kb25lKCkgY29uc3QgeyByZXR1
cm4gYXQ8OTI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tZHBfY21kX3dhaXRfcGluZ3Bv
bmcoKSBjb25zdCB7IHJldHVybiBhdDw5Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIG1kcF9jbWRfd2FpdF9waW5ncG9uZygpIGNvbnN0IHsgcmV0dXJuIGF0PDkzPigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWRwX3BlcmZfcHJlZmlsbF9jYWxjKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OTQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBt
ZHBfcGVyZl9wcmVmaWxsX2NhbGMoKSBjb25zdCB7IHJldHVybiBhdDw5ND4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX21kcF9wZXJmX3VwZGF0ZV9idXMoKSBjb25zdCB7IHJldHVybiBhdDw5
NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1kcF9wZXJmX3VwZGF0
ZV9idXMoKSBjb25zdCB7IHJldHVybiBhdDw5NT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFz
X3JvdGF0b3JfYndfYW9fYXNfY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDk2PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcm90YXRvcl9id19hb19hc19jb250ZXh0
KCkgY29uc3QgeyByZXR1cm4gYXQ8OTY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tbV9m
aWxlbWFwX2FkZF90b19wYWdlX2NhY2hlKCkgY29uc3QgeyByZXR1cm4gYXQ8OTc+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBtbV9maWxlbWFwX2FkZF90b19wYWdlX2Nh
Y2hlKCkgY29uc3QgeyByZXR1cm4gYXQ8OTc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19t
bV9maWxlbWFwX2RlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUoKSBjb25zdCB7IHJldHVybiBhdDw5OD4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1tX2ZpbGVtYXBfZGVsZXRl
X2Zyb21fcGFnZV9jYWNoZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDk4PigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfbW1fY29tcGFjdGlvbl9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGF0PDk5Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbW1fY29tcGFjdGlvbl9iZWdp
bigpIGNvbnN0IHsgcmV0dXJuIGF0PDk5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbW1f
Y29tcGFjdGlvbl9kZWZlcl9jb21wYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8MTAwPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbW1fY29tcGFjdGlvbl9kZWZlcl9j
b21wYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8MTAwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfbW1fY29tcGFjdGlvbl9kZWZlcnJlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwMT4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1tX2NvbXBhY3Rpb25fZGVmZXJy
ZWQoKSBjb25zdCB7IHJldHVybiBhdDwxMDE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19t
bV9jb21wYWN0aW9uX2RlZmVyX3Jlc2V0KCkgY29uc3QgeyByZXR1cm4gYXQ8MTAyPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbW1fY29tcGFjdGlvbl9kZWZlcl9yZXNl
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwMj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21t
X2NvbXBhY3Rpb25fZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8MTAzPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbW1fY29tcGFjdGlvbl9lbmQoKSBjb25zdCB7IHJldHVy
biBhdDwxMDM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19tbV9jb21wYWN0aW9uX2Zpbmlz
aGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgbW1fY29tcGFjdGlvbl9maW5pc2hlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEw
ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21tX2NvbXBhY3Rpb25faXNvbGF0ZV9mcmVl
cGFnZXMoKSBjb25zdCB7IHJldHVybiBhdDwxMDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBtbV9jb21wYWN0aW9uX2lzb2xhdGVfZnJlZXBhZ2VzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTA1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbW1fY29tcGFjdGlvbl9p
c29sYXRlX21pZ3JhdGVwYWdlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDEwNj4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1tX2NvbXBhY3Rpb25faXNvbGF0ZV9taWdyYXRl
cGFnZXMoKSBjb25zdCB7IHJldHVybiBhdDwxMDY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19tbV9jb21wYWN0aW9uX2tjb21wYWN0ZF9zbGVlcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwNz4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1tX2NvbXBhY3Rpb25fa2Nv
bXBhY3RkX3NsZWVwKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA3PigpLmFzX2J5dGVzKCk7IH0KKyAg
Ym9vbCBoYXNfbW1fY29tcGFjdGlvbl9rY29tcGFjdGRfd2FrZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDEwOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1tX2NvbXBhY3Rp
b25fa2NvbXBhY3RkX3dha2UoKSBjb25zdCB7IHJldHVybiBhdDwxMDg+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19tbV9jb21wYWN0aW9uX21pZ3JhdGVwYWdlcygpIGNvbnN0IHsgcmV0dXJu
IGF0PDEwOT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1tX2NvbXBh
Y3Rpb25fbWlncmF0ZXBhZ2VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA5PigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfbW1fY29tcGFjdGlvbl9zdWl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDExMD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1tX2NvbXBhY3Rp
b25fc3VpdGFibGUoKSBjb25zdCB7IHJldHVybiBhdDwxMTA+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19tbV9jb21wYWN0aW9uX3RyeV90b19jb21wYWN0X3BhZ2VzKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTExPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbW1fY29t
cGFjdGlvbl90cnlfdG9fY29tcGFjdF9wYWdlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDExMT4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21tX2NvbXBhY3Rpb25fd2FrZXVwX2tjb21wYWN0ZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDExMj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIG1tX2NvbXBhY3Rpb25fd2FrZXVwX2tjb21wYWN0ZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDExMj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3N1c3BlbmRfcmVzdW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTEzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
c3VzcGVuZF9yZXN1bWUoKSBjb25zdCB7IHJldHVybiBhdDwxMTM+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19zY2hlZF93YWtldXBfbmV3KCkgY29uc3QgeyByZXR1cm4gYXQ8MTE0PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc2NoZWRfd2FrZXVwX25ldygpIGNv
bnN0IHsgcmV0dXJuIGF0PDExND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Jsb2NrX2Jp
b19iYWNrbWVyZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxMTU+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBibG9ja19iaW9fYmFja21lcmdlKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTE1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tfYmlvX2JvdW5jZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDExNj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIGJsb2NrX2Jpb19ib3VuY2UoKSBjb25zdCB7IHJldHVybiBhdDwxMTY+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19ibG9ja19iaW9fY29tcGxldGUoKSBjb25zdCB7IHJldHVybiBhdDwx
MTc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBibG9ja19iaW9fY29t
cGxldGUoKSBjb25zdCB7IHJldHVybiBhdDwxMTc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19ibG9ja19iaW9fZnJvbnRtZXJnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDExOD4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJsb2NrX2Jpb19mcm9udG1lcmdlKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTE4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tfYmlv
X3F1ZXVlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgYmxvY2tfYmlvX3F1ZXVlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE5Pigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tfYmlvX3JlbWFwKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTIwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmxvY2tf
YmlvX3JlbWFwKCkgY29uc3QgeyByZXR1cm4gYXQ8MTIwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfYmxvY2tfZGlydHlfYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTIxPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmxvY2tfZGlydHlfYnVmZmVyKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTIxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tfZ2V0
cnEoKSBjb25zdCB7IHJldHVybiBhdDwxMjI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBibG9ja19nZXRycSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEyMj4oKS5hc19ieXRl
cygpOyB9CisgIGJvb2wgaGFzX2Jsb2NrX3BsdWcoKSBjb25zdCB7IHJldHVybiBhdDwxMjM+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBibG9ja19wbHVnKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTIzPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tfcnFfYWJv
cnQoKSBjb25zdCB7IHJldHVybiBhdDwxMjQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBibG9ja19ycV9hYm9ydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEyND4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX2Jsb2NrX3JxX2NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTI1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmxvY2tfcnFf
Y29tcGxldGUoKSBjb25zdCB7IHJldHVybiBhdDwxMjU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19ibG9ja19ycV9pbnNlcnQoKSBjb25zdCB7IHJldHVybiBhdDwxMjY+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBibG9ja19ycV9pbnNlcnQoKSBjb25zdCB7IHJl
dHVybiBhdDwxMjY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19ibG9ja19ycV9yZW1hcCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDEyOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIGJsb2NrX3JxX3JlbWFwKCkgY29uc3QgeyByZXR1cm4gYXQ8MTI4PigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tfcnFfcmVxdWV1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEy
OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJsb2NrX3JxX3JlcXVl
dWUoKSBjb25zdCB7IHJldHVybiBhdDwxMjk+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19i
bG9ja19zbGVlcHJxKCkgY29uc3QgeyByZXR1cm4gYXQ8MTMwPigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgYmxvY2tfc2xlZXBycSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEz
MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Jsb2NrX3NwbGl0KCkgY29uc3QgeyByZXR1
cm4gYXQ8MTMxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmxvY2tf
c3BsaXQoKSBjb25zdCB7IHJldHVybiBhdDwxMzE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19ibG9ja190b3VjaF9idWZmZXIoKSBjb25zdCB7IHJldHVybiBhdDwxMzI+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBibG9ja190b3VjaF9idWZmZXIoKSBjb25zdCB7
IHJldHVybiBhdDwxMzI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19ibG9ja191bnBsdWco
KSBjb25zdCB7IHJldHVybiBhdDwxMzM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBibG9ja191bnBsdWcoKSBjb25zdCB7IHJldHVybiBhdDwxMzM+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19leHQ0X2FsbG9jX2RhX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDEzND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfYWxsb2Nf
ZGFfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfZXh0NF9hbGxvY2F0ZV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDwxMzU+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2FsbG9jYXRlX2Jsb2Nrcygp
IGNvbnN0IHsgcmV0dXJuIGF0PDEzNT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRf
YWxsb2NhdGVfaW5vZGUoKSBjb25zdCB7IHJldHVybiBhdDwxMzY+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2FsbG9jYXRlX2lub2RlKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTM2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9iZWdpbl9vcmRlcmVk
X3RydW5jYXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9iZWdpbl9vcmRlcmVkX3RydW5jYXRlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTM3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9jb2xsYXBzZV9y
YW5nZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEzOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzIGV4dDRfY29sbGFwc2VfcmFuZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxMzg+
KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2RhX3JlbGVhc2Vfc3BhY2UoKSBjb25z
dCB7IHJldHVybiBhdDwxMzk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBleHQ0X2RhX3JlbGVhc2Vfc3BhY2UoKSBjb25zdCB7IHJldHVybiBhdDwxMzk+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2RhX3Jlc2VydmVfc3BhY2UoKSBjb25zdCB7IHJldHVy
biBhdDwxNDA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2Rh
X3Jlc2VydmVfc3BhY2UoKSBjb25zdCB7IHJldHVybiBhdDwxNDA+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19leHQ0X2RhX3VwZGF0ZV9yZXNlcnZlX3NwYWNlKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTQxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9kYV91
cGRhdGVfcmVzZXJ2ZV9zcGFjZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE0MT4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX2V4dDRfZGFfd3JpdGVfcGFnZXMoKSBjb25zdCB7IHJldHVybiBhdDwx
NDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2RhX3dyaXRl
X3BhZ2VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfZXh0NF9kYV93cml0ZV9wYWdlc19leHRlbnQoKSBjb25zdCB7IHJldHVybiBhdDwxNDM+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2RhX3dyaXRlX3BhZ2Vz
X2V4dGVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE0Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wg
aGFzX2V4dDRfZGlyZWN0X2lvX2VudGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ0PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9kaXJlY3RfaW9fZW50ZXIoKSBj
b25zdCB7IHJldHVybiBhdDwxNDQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2Rp
cmVjdF9pb19leGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ1PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9kaXJlY3RfaW9fZXhpdCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE0NT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfZGlzY2FyZF9ibG9ja3Mo
KSBjb25zdCB7IHJldHVybiBhdDwxNDY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBleHQ0X2Rpc2NhcmRfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ2PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTQ3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ3Pigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9kcm9wX2lub2RlKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTQ4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9k
cm9wX2lub2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfZXh0NF9lc19jYWNoZV9leHRlbnQoKSBjb25zdCB7IHJldHVybiBhdDwxNDk+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2VzX2NhY2hlX2V4dGVudCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE0OT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRf
ZXNfZmluZF9kZWxheWVkX2V4dGVudF9yYW5nZV9lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE1
MD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfZXNfZmluZF9k
ZWxheWVkX2V4dGVudF9yYW5nZV9lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE1MD4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfZXNfZmluZF9kZWxheWVkX2V4dGVudF9yYW5nZV9l
eGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MTUxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgZXh0NF9lc19maW5kX2RlbGF5ZWRfZXh0ZW50X3JhbmdlX2V4aXQoKSBjb25z
dCB7IHJldHVybiBhdDwxNTE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2VzX2lu
c2VydF9leHRlbnQoKSBjb25zdCB7IHJldHVybiBhdDwxNTI+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2VzX2luc2VydF9leHRlbnQoKSBjb25zdCB7IHJldHVy
biBhdDwxNTI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2VzX2xvb2t1cF9leHRl
bnRfZW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDwxNTM+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBleHQ0X2VzX2xvb2t1cF9leHRlbnRfZW50ZXIoKSBjb25zdCB7IHJl
dHVybiBhdDwxNTM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2VzX2xvb2t1cF9l
eHRlbnRfZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE1ND4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfZXNfbG9va3VwX2V4dGVudF9leGl0KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTU0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9lc19yZW1vdmVf
ZXh0ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MTU1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgZXh0NF9lc19yZW1vdmVfZXh0ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8
MTU1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9lc19zaHJpbmsoKSBjb25zdCB7
IHJldHVybiBhdDwxNTY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBl
eHQ0X2VzX3NocmluaygpIGNvbnN0IHsgcmV0dXJuIGF0PDE1Nj4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX2V4dDRfZXNfc2hyaW5rX2NvdW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MTU3Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9lc19zaHJpbmtfY291
bnQoKSBjb25zdCB7IHJldHVybiBhdDwxNTc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19l
eHQ0X2VzX3Nocmlua19zY2FuX2VudGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MTU4PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9lc19zaHJpbmtfc2Nhbl9lbnRl
cigpIGNvbnN0IHsgcmV0dXJuIGF0PDE1OD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4
dDRfZXNfc2hyaW5rX3NjYW5fZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE1OT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfZXNfc2hyaW5rX3NjYW5fZXhpdCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE1OT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRf
ZXZpY3RfaW5vZGUoKSBjb25zdCB7IHJldHVybiBhdDwxNjA+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2V2aWN0X2lub2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTYwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9leHRfY29udmVydF90b19pbml0
aWFsaXplZF9lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE2MT4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWRfZW50
ZXIoKSBjb25zdCB7IHJldHVybiBhdDwxNjE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19l
eHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkX2Zhc3RwYXRoKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTYyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9leHRf
Y29udmVydF90b19pbml0aWFsaXplZF9mYXN0cGF0aCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE2Mj4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfZXh0X2hhbmRsZV91bndyaXR0ZW5fZXh0
ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE2Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzIGV4dDRfZXh0X2hhbmRsZV91bndyaXR0ZW5fZXh0ZW50cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDE2Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfZXh0X2luX2Nh
Y2hlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTY0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgZXh0NF9leHRfaW5fY2FjaGUoKSBjb25zdCB7IHJldHVybiBhdDwxNjQ+KCku
YXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2V4dF9sb2FkX2V4dGVudCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE2NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4
dDRfZXh0X2xvYWRfZXh0ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MTY1PigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfZXh0NF9leHRfbWFwX2Jsb2Nrc19lbnRlcigpIGNvbnN0IHsgcmV0dXJu
IGF0PDE2Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfZXh0
X21hcF9ibG9ja3NfZW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDwxNjY+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19leHQ0X2V4dF9tYXBfYmxvY2tzX2V4aXQoKSBjb25zdCB7IHJldHVybiBh
dDwxNjc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2V4dF9t
YXBfYmxvY2tzX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwxNjc+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19leHQ0X2V4dF9wdXRfaW5fY2FjaGUoKSBjb25zdCB7IHJldHVybiBhdDwxNjg+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2V4dF9wdXRfaW5f
Y2FjaGUoKSBjb25zdCB7IHJldHVybiBhdDwxNjg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19leHQ0X2V4dF9yZW1vdmVfc3BhY2UoKSBjb25zdCB7IHJldHVybiBhdDwxNjk+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoKSBj
b25zdCB7IHJldHVybiBhdDwxNjk+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2V4
dF9yZW1vdmVfc3BhY2VfZG9uZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE3MD4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfZXh0X3JlbW92ZV9zcGFjZV9kb25lKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTcwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9l
eHRfcm1faWR4KCkgY29uc3QgeyByZXR1cm4gYXQ8MTcxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9leHRfcm1faWR4KCkgY29uc3QgeyByZXR1cm4gYXQ8MTcx
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9leHRfcm1fbGVhZigpIGNvbnN0IHsg
cmV0dXJuIGF0PDE3Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4
dDRfZXh0X3JtX2xlYWYoKSBjb25zdCB7IHJldHVybiBhdDwxNzI+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19leHQ0X2V4dF9zaG93X2V4dGVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE3Mz4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfZXh0X3Nob3dfZXh0
ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MTczPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
ZXh0NF9mYWxsb2NhdGVfZW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDwxNzQ+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2ZhbGxvY2F0ZV9lbnRlcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE3ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfZmFsbG9j
YXRlX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwxNzU+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBleHQ0X2ZhbGxvY2F0ZV9leGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8
MTc1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9maW5kX2RlbGFsbG9jX3Jhbmdl
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTc2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMgZXh0NF9maW5kX2RlbGFsbG9jX3JhbmdlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTc2
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9mb3JnZXQoKSBjb25zdCB7IHJldHVy
biBhdDwxNzc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2Zv
cmdldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE3Nz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFz
X2V4dDRfZnJlZV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDwxNzg+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2ZyZWVfYmxvY2tzKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTc4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9mcmVlX2lub2RlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTc5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMgZXh0NF9mcmVlX2lub2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTc5PigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9nZXRfaW1wbGllZF9jbHVzdGVyX2FsbG9jX2V4aXQoKSBj
b25zdCB7IHJldHVybiBhdDwxODA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBleHQ0X2dldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2NfZXhpdCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE4MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfZ2V0X3Jlc2VydmVkX2Ns
dXN0ZXJfYWxsb2MoKSBjb25zdCB7IHJldHVybiBhdDwxODE+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2dldF9yZXNlcnZlZF9jbHVzdGVyX2FsbG9jKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTgxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9pbmRf
bWFwX2Jsb2Nrc19lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE4Mj4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfaW5kX21hcF9ibG9ja3NfZW50ZXIoKSBjb25z
dCB7IHJldHVybiBhdDwxODI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2luZF9t
YXBfYmxvY2tzX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwxODM+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2luZF9tYXBfYmxvY2tzX2V4aXQoKSBjb25zdCB7
IHJldHVybiBhdDwxODM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X2luc2VydF9y
YW5nZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE4ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzIGV4dDRfaW5zZXJ0X3JhbmdlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTg0Pigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9pbnZhbGlkYXRlcGFnZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE4NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4
dDRfaW52YWxpZGF0ZXBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxODU+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19leHQ0X2pvdXJuYWxfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwxODY+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2pvdXJuYWxfc3Rh
cnQoKSBjb25zdCB7IHJldHVybiBhdDwxODY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19l
eHQ0X2pvdXJuYWxfc3RhcnRfcmVzZXJ2ZWQoKSBjb25zdCB7IHJldHVybiBhdDwxODc+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2pvdXJuYWxfc3RhcnRfcmVz
ZXJ2ZWQoKSBjb25zdCB7IHJldHVybiBhdDwxODc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19leHQ0X2pvdXJuYWxsZWRfaW52YWxpZGF0ZXBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxODg+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2pvdXJuYWxsZWRf
aW52YWxpZGF0ZXBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwxODg+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19leHQ0X2pvdXJuYWxsZWRfd3JpdGVfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTg5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9qb3VybmFs
bGVkX3dyaXRlX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE4OT4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX2V4dDRfbG9hZF9pbm9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE5MD4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfbG9hZF9pbm9kZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE5MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfbG9hZF9p
bm9kZV9iaXRtYXAoKSBjb25zdCB7IHJldHVybiBhdDwxOTE+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X2xvYWRfaW5vZGVfYml0bWFwKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTkxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9tYXJrX2lub2RlX2Rp
cnR5KCkgY29uc3QgeyByZXR1cm4gYXQ8MTkyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgZXh0NF9tYXJrX2lub2RlX2RpcnR5KCkgY29uc3QgeyByZXR1cm4gYXQ8MTky
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9tYl9iaXRtYXBfbG9hZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE5Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGV4dDRfbWJfYml0bWFwX2xvYWQoKSBjb25zdCB7IHJldHVybiBhdDwxOTM+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19leHQ0X21iX2J1ZGR5X2JpdG1hcF9sb2FkKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTk0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9t
Yl9idWRkeV9iaXRtYXBfbG9hZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE5ND4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX2V4dDRfbWJfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucygpIGNvbnN0IHsg
cmV0dXJuIGF0PDE5NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4
dDRfbWJfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDE5NT4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfbWJfbmV3X2dyb3VwX3BhKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTk2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0
NF9tYl9uZXdfZ3JvdXBfcGEoKSBjb25zdCB7IHJldHVybiBhdDwxOTY+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19leHQ0X21iX25ld19pbm9kZV9wYSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE5
Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfbWJfbmV3X2lu
b2RlX3BhKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfZXh0NF9tYl9yZWxlYXNlX2dyb3VwX3BhKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk4PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9tYl9yZWxlYXNlX2dyb3Vw
X3BhKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
ZXh0NF9tYl9yZWxlYXNlX2lub2RlX3BhKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk5PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9tYl9yZWxlYXNlX2lub2RlX3Bh
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTk5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0
NF9tYmFsbG9jX2FsbG9jKCkgY29uc3QgeyByZXR1cm4gYXQ8MjAwPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9tYmFsbG9jX2FsbG9jKCkgY29uc3QgeyByZXR1
cm4gYXQ8MjAwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9tYmFsbG9jX2Rpc2Nh
cmQoKSBjb25zdCB7IHJldHVybiBhdDwyMDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBleHQ0X21iYWxsb2NfZGlzY2FyZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDIwMT4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfbWJhbGxvY19mcmVlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MjAyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0
NF9tYmFsbG9jX2ZyZWUoKSBjb25zdCB7IHJldHVybiBhdDwyMDI+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19leHQ0X21iYWxsb2NfcHJlYWxsb2MoKSBjb25zdCB7IHJldHVybiBhdDwyMDM+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X21iYWxsb2NfcHJl
YWxsb2MoKSBjb25zdCB7IHJldHVybiBhdDwyMDM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19leHQ0X290aGVyX2lub2RlX3VwZGF0ZV90aW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MjA0Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF9vdGhlcl9pbm9kZV91
cGRhdGVfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIwND4oKS5hc19ieXRlcygpOyB9CisgIGJv
b2wgaGFzX2V4dDRfcHVuY2hfaG9sZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIwNT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfcHVuY2hfaG9sZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDIwNT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfcmVhZF9ibG9j
a19iaXRtYXBfbG9hZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDIwNj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfcmVhZF9ibG9ja19iaXRtYXBfbG9hZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDIwNj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfcmVhZHBh
Z2UoKSBjb25zdCB7IHJldHVybiBhdDwyMDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBleHQ0X3JlYWRwYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjA3PigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF9yZWxlYXNlcGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDIwOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfcmVsZWFz
ZXBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyMDg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19leHQ0X3JlbW92ZV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDwyMDk+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X3JlbW92ZV9ibG9ja3MoKSBjb25zdCB7
IHJldHVybiBhdDwyMDk+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X3JlcXVlc3Rf
YmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8MjEwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgZXh0NF9yZXF1ZXN0X2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDIx
MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfcmVxdWVzdF9pbm9kZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDIxMT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGV4dDRfcmVxdWVzdF9pbm9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIxMT4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX2V4dDRfc3luY19mcygpIGNvbnN0IHsgcmV0dXJuIGF0PDIxMj4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfc3luY19mcygpIGNvbnN0
IHsgcmV0dXJuIGF0PDIxMj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfdHJpbV9h
bGxfZnJlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIxMz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzIGV4dDRfdHJpbV9hbGxfZnJlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIx
Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfdHJpbV9leHRlbnQoKSBjb25zdCB7
IHJldHVybiBhdDwyMTQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBl
eHQ0X3RyaW1fZXh0ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MjE0PigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfZXh0NF90cnVuY2F0ZV9lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDIxNT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfdHJ1bmNhdGVfZW50
ZXIoKSBjb25zdCB7IHJldHVybiBhdDwyMTU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19l
eHQ0X3RydW5jYXRlX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwyMTY+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X3RydW5jYXRlX2V4aXQoKSBjb25zdCB7IHJl
dHVybiBhdDwyMTY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X3VubGlua19lbnRl
cigpIGNvbnN0IHsgcmV0dXJuIGF0PDIxNz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIGV4dDRfdW5saW5rX2VudGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MjE3PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF91bmxpbmtfZXhpdCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDIxOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfdW5s
aW5rX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwyMTg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19leHQ0X3dyaXRlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXQ8MjE5PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF93cml0ZV9iZWdpbigpIGNvbnN0IHsg
cmV0dXJuIGF0PDIxOT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2V4dDRfd3JpdGVfZW5k
KCkgY29uc3QgeyByZXR1cm4gYXQ8MjMwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMgZXh0NF93cml0ZV9lbmQoKSBjb25zdCB7IHJldHVybiBhdDwyMzA+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19leHQ0X3dyaXRlcGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDIz
MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGV4dDRfd3JpdGVwYWdl
KCkgY29uc3QgeyByZXR1cm4gYXQ8MjMxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0
NF93cml0ZXBhZ2VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MjMyPigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgZXh0NF93cml0ZXBhZ2VzKCkgY29uc3QgeyByZXR1cm4gYXQ8
MjMyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZXh0NF93cml0ZXBhZ2VzX3Jlc3VsdCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDIzMz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIGV4dDRfd3JpdGVwYWdlc19yZXN1bHQoKSBjb25zdCB7IHJldHVybiBhdDwyMzM+KCku
YXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19leHQ0X3plcm9fcmFuZ2UoKSBjb25zdCB7IHJldHVy
biBhdDwyMzQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBleHQ0X3pl
cm9fcmFuZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyMzQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc190YXNrX25ld3Rhc2soKSBjb25zdCB7IHJldHVybiBhdDwyMzU+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0YXNrX25ld3Rhc2soKSBjb25zdCB7IHJldHVybiBh
dDwyMzU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190YXNrX3JlbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDIzNj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRh
c2tfcmVuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MjM2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfc2NoZWRfcHJvY2Vzc19leGVjKCkgY29uc3QgeyByZXR1cm4gYXQ8MjM3PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc2NoZWRfcHJvY2Vzc19leGVjKCkgY29u
c3QgeyByZXR1cm4gYXQ8MjM3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2NoZWRfcHJv
Y2Vzc19leGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjM4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMgc2NoZWRfcHJvY2Vzc19leGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8
MjM4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2NoZWRfcHJvY2Vzc19mb3JrKCkgY29u
c3QgeyByZXR1cm4gYXQ8MjM5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgc2NoZWRfcHJvY2Vzc19mb3JrKCkgY29uc3QgeyByZXR1cm4gYXQ8MjM5PigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfc2NoZWRfcHJvY2Vzc19mcmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8
MjQwPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc2NoZWRfcHJvY2Vz
c19mcmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfc2NoZWRfcHJvY2Vzc19oYW5nKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQxPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc2NoZWRfcHJvY2Vzc19oYW5nKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MjQxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2NoZWRfcHJvY2Vz
c193YWl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjQyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgc2NoZWRfcHJvY2Vzc193YWl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjQy
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc19kb19zdWJtaXRfYmlvKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MjQzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
ZjJmc19kb19zdWJtaXRfYmlvKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQzPigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfZjJmc19ldmljdF9pbm9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI0ND4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGYyZnNfZXZpY3RfaW5vZGUo
KSBjb25zdCB7IHJldHVybiBhdDwyNDQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19mMmZz
X2ZhbGxvY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI0NT4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIGYyZnNfZmFsbG9jYXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjQ1
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc19nZXRfZGF0YV9ibG9jaygpIGNvbnN0
IHsgcmV0dXJuIGF0PDI0Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGYyZnNfZ2V0X2RhdGFfYmxvY2soKSBjb25zdCB7IHJldHVybiBhdDwyNDY+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19mMmZzX2dldF92aWN0aW0oKSBjb25zdCB7IHJldHVybiBhdDwyNDc+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmMmZzX2dldF92aWN0aW0o
KSBjb25zdCB7IHJldHVybiBhdDwyNDc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19mMmZz
X2lnZXQoKSBjb25zdCB7IHJldHVybiBhdDwyNDg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBmMmZzX2lnZXQoKSBjb25zdCB7IHJldHVybiBhdDwyNDg+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19mMmZzX2lnZXRfZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI0
OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGYyZnNfaWdldF9leGl0
KCkgY29uc3QgeyByZXR1cm4gYXQ8MjQ5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJm
c19uZXdfaW5vZGUoKSBjb25zdCB7IHJldHVybiBhdDwyNTA+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBmMmZzX25ld19pbm9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI1
MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2YyZnNfcmVhZHBhZ2UoKSBjb25zdCB7IHJl
dHVybiBhdDwyNTE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmMmZz
X3JlYWRwYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjUxPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfZjJmc19yZXNlcnZlX25ld19ibG9jaygpIGNvbnN0IHsgcmV0dXJuIGF0PDI1Mj4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGYyZnNfcmVzZXJ2ZV9uZXdfYmxv
Y2soKSBjb25zdCB7IHJldHVybiBhdDwyNTI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19m
MmZzX3NldF9wYWdlX2RpcnR5KCkgY29uc3QgeyByZXR1cm4gYXQ8MjUzPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZjJmc19zZXRfcGFnZV9kaXJ0eSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI1Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2YyZnNfc3VibWl0X3dy
aXRlX3BhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyNTQ+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBmMmZzX3N1Ym1pdF93cml0ZV9wYWdlKCkgY29uc3QgeyByZXR1cm4g
YXQ8MjU0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc19zeW5jX2ZpbGVfZW50ZXIo
KSBjb25zdCB7IHJldHVybiBhdDwyNTU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBmMmZzX3N5bmNfZmlsZV9lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI1NT4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2YyZnNfc3luY19maWxlX2V4aXQoKSBjb25zdCB7IHJl
dHVybiBhdDwyNTY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmMmZz
X3N5bmNfZmlsZV9leGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjU2PigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfZjJmc19zeW5jX2ZzKCkgY29uc3QgeyByZXR1cm4gYXQ8MjU3PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZjJmc19zeW5jX2ZzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MjU3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc190cnVuY2F0ZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI1OD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzIGYyZnNfdHJ1bmNhdGUoKSBjb25zdCB7IHJldHVybiBhdDwyNTg+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19mMmZzX3RydW5jYXRlX2Jsb2Nrc19lbnRlcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI1OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGYyZnNf
dHJ1bmNhdGVfYmxvY2tzX2VudGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MjU5PigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfZjJmc190cnVuY2F0ZV9ibG9ja3NfZXhpdCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI2MD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGYyZnNf
dHJ1bmNhdGVfYmxvY2tzX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwyNjA+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19mMmZzX3RydW5jYXRlX2RhdGFfYmxvY2tzX3JhbmdlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MjYxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
ZjJmc190cnVuY2F0ZV9kYXRhX2Jsb2Nrc19yYW5nZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI2MT4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2YyZnNfdHJ1bmNhdGVfaW5vZGVfYmxvY2tzX2Vu
dGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MjYyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgZjJmc190cnVuY2F0ZV9pbm9kZV9ibG9ja3NfZW50ZXIoKSBjb25zdCB7IHJl
dHVybiBhdDwyNjI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19mMmZzX3RydW5jYXRlX2lu
b2RlX2Jsb2Nrc19leGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjYzPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZjJmc190cnVuY2F0ZV9pbm9kZV9ibG9ja3NfZXhpdCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI2Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2YyZnNf
dHJ1bmNhdGVfbm9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI2ND4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGYyZnNfdHJ1bmNhdGVfbm9kZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI2ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2YyZnNfdHJ1bmNhdGVfbm9kZXNf
ZW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDwyNjU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBmMmZzX3RydW5jYXRlX25vZGVzX2VudGVyKCkgY29uc3QgeyByZXR1cm4g
YXQ8MjY1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc190cnVuY2F0ZV9ub2Rlc19l
eGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjY2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgZjJmc190cnVuY2F0ZV9ub2Rlc19leGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8
MjY2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc190cnVuY2F0ZV9wYXJ0aWFsX25v
ZGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MjY3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgZjJmc190cnVuY2F0ZV9wYXJ0aWFsX25vZGVzKCkgY29uc3QgeyByZXR1cm4g
YXQ8MjY3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc191bmxpbmtfZW50ZXIoKSBj
b25zdCB7IHJldHVybiBhdDwyNjg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBmMmZzX3VubGlua19lbnRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI2OD4oKS5hc19ieXRl
cygpOyB9CisgIGJvb2wgaGFzX2YyZnNfdW5saW5rX2V4aXQoKSBjb25zdCB7IHJldHVybiBhdDwy
Njk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmMmZzX3VubGlua19l
eGl0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjY5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
ZjJmc192bV9wYWdlX21rd3JpdGUoKSBjb25zdCB7IHJldHVybiBhdDwyNzA+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmMmZzX3ZtX3BhZ2VfbWt3cml0ZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI3MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2YyZnNfd3JpdGVf
YmVnaW4oKSBjb25zdCB7IHJldHVybiBhdDwyNzE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBmMmZzX3dyaXRlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXQ8MjcxPigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZjJmc193cml0ZV9jaGVja3BvaW50KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MjcyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
ZjJmc193cml0ZV9jaGVja3BvaW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MjcyPigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfZjJmc193cml0ZV9lbmQoKSBjb25zdCB7IHJldHVybiBhdDwyNzM+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmMmZzX3dyaXRlX2VuZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI3Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2FsbG9j
X3BhZ2VzX2lvbW11X2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI3ND4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGFsbG9jX3BhZ2VzX2lvbW11X2VuZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI3ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2FsbG9jX3BhZ2VzX2lv
bW11X2ZhaWwoKSBjb25zdCB7IHJldHVybiBhdDwyNzU+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBhbGxvY19wYWdlc19pb21tdV9mYWlsKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mjc1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYWxsb2NfcGFnZXNfaW9tbXVfc3Rh
cnQoKSBjb25zdCB7IHJldHVybiBhdDwyNzY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBhbGxvY19wYWdlc19pb21tdV9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI3
Nj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2FsbG9jX3BhZ2VzX3N5c19lbmQoKSBjb25z
dCB7IHJldHVybiBhdDwyNzc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBhbGxvY19wYWdlc19zeXNfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjc3PigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfYWxsb2NfcGFnZXNfc3lzX2ZhaWwoKSBjb25zdCB7IHJldHVybiBh
dDwyNzg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBhbGxvY19wYWdl
c19zeXNfZmFpbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI3OD4oKS5hc19ieXRlcygpOyB9CisgIGJv
b2wgaGFzX2FsbG9jX3BhZ2VzX3N5c19zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI3OT4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGFsbG9jX3BhZ2VzX3N5c19zdGFy
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI3OT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Rt
YV9hbGxvY19jb250aWd1b3VzX3JldHJ5KCkgY29uc3QgeyByZXR1cm4gYXQ8MjgwPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZG1hX2FsbG9jX2NvbnRpZ3VvdXNfcmV0
cnkoKSBjb25zdCB7IHJldHVybiBhdDwyODA+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19p
b21tdV9tYXBfcmFuZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyODE+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBpb21tdV9tYXBfcmFuZ2UoKSBjb25zdCB7IHJldHVybiBh
dDwyODE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19pb21tdV9zZWNfcHRibF9tYXBfcmFu
Z2VfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8MjgyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgaW9tbXVfc2VjX3B0YmxfbWFwX3JhbmdlX2VuZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI4Mj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lvbW11X3NlY19wdGJsX21h
cF9yYW5nZV9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI4Mz4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGlvbW11X3NlY19wdGJsX21hcF9yYW5nZV9zdGFydCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI4Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lvbl9hbGxv
Y19idWZmZXJfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg0PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgaW9uX2FsbG9jX2J1ZmZlcl9lbmQoKSBjb25zdCB7IHJldHVy
biBhdDwyODQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19pb25fYWxsb2NfYnVmZmVyX2Zh
aWwoKSBjb25zdCB7IHJldHVybiBhdDwyODU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBpb25fYWxsb2NfYnVmZmVyX2ZhaWwoKSBjb25zdCB7IHJldHVybiBhdDwyODU+
KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19pb25fYWxsb2NfYnVmZmVyX2ZhbGxiYWNrKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mjg2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMgaW9uX2FsbG9jX2J1ZmZlcl9mYWxsYmFjaygpIGNvbnN0IHsgcmV0dXJuIGF0PDI4Nj4o
KS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lvbl9hbGxvY19idWZmZXJfc3RhcnQoKSBjb25z
dCB7IHJldHVybiBhdDwyODc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBpb25fYWxsb2NfYnVmZmVyX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg3PigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfaW9uX2NwX2FsbG9jX3JldHJ5KCkgY29uc3QgeyByZXR1cm4g
YXQ8Mjg4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW9uX2NwX2Fs
bG9jX3JldHJ5KCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfaW9uX2NwX3NlY3VyZV9idWZmZXJfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg5Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW9uX2NwX3NlY3VyZV9idWZm
ZXJfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg5PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfaW9uX2NwX3NlY3VyZV9idWZmZXJfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwyOTA+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBpb25fY3Bfc2VjdXJlX2J1ZmZl
cl9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI5MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wg
aGFzX2lvbl9wcmVmZXRjaGluZygpIGNvbnN0IHsgcmV0dXJuIGF0PDI5MT4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGlvbl9wcmVmZXRjaGluZygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI5MT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lvbl9zZWN1cmVfY21hX2Fk
ZF90b19wb29sX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI5Mj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGlvbl9zZWN1cmVfY21hX2FkZF90b19wb29sX2VuZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI5Mj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lvbl9zZWN1
cmVfY21hX2FkZF90b19wb29sX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8MjkzPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW9uX3NlY3VyZV9jbWFfYWRkX3RvX3Bv
b2xfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwyOTM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19pb25fc2VjdXJlX2NtYV9hbGxvY2F0ZV9lbmQoKSBjb25zdCB7IHJldHVybiBhdDwyOTQ+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBpb25fc2VjdXJlX2NtYV9h
bGxvY2F0ZV9lbmQoKSBjb25zdCB7IHJldHVybiBhdDwyOTQ+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19pb25fc2VjdXJlX2NtYV9hbGxvY2F0ZV9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI5NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGlvbl9zZWN1cmVf
Y21hX2FsbG9jYXRlX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mjk1PigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfaW9uX3NlY3VyZV9jbWFfc2hyaW5rX3Bvb2xfZW5kKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mjk2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW9u
X3NlY3VyZV9jbWFfc2hyaW5rX3Bvb2xfZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjk2PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfaW9uX3NlY3VyZV9jbWFfc2hyaW5rX3Bvb2xfc3RhcnQo
KSBjb25zdCB7IHJldHVybiBhdDwyOTc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBpb25fc2VjdXJlX2NtYV9zaHJpbmtfcG9vbF9zdGFydCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI5Nz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2tmcmVlKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mjk4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMga2ZyZWUo
KSBjb25zdCB7IHJldHVybiBhdDwyOTg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19rbWFs
bG9jKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjk5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMga21hbGxvYygpIGNvbnN0IHsgcmV0dXJuIGF0PDI5OT4oKS5hc19ieXRlcygp
OyB9CisgIGJvb2wgaGFzX2ttYWxsb2Nfbm9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMwMD4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGttYWxsb2Nfbm9kZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDMwMD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2ttZW1fY2FjaGVf
YWxsb2MoKSBjb25zdCB7IHJldHVybiBhdDwzMDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBrbWVtX2NhY2hlX2FsbG9jKCkgY29uc3QgeyByZXR1cm4gYXQ8MzAxPigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfa21lbV9jYWNoZV9hbGxvY19ub2RlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MzAyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
a21lbV9jYWNoZV9hbGxvY19ub2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzAyPigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfa21lbV9jYWNoZV9mcmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzAz
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMga21lbV9jYWNoZV9mcmVl
KCkgY29uc3QgeyByZXR1cm4gYXQ8MzAzPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWln
cmF0ZV9wYWdlc19lbmQoKSBjb25zdCB7IHJldHVybiBhdDwzMDQ+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBtaWdyYXRlX3BhZ2VzX2VuZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDMwND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21pZ3JhdGVfcGFnZXNfc3RhcnQo
KSBjb25zdCB7IHJldHVybiBhdDwzMDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBtaWdyYXRlX3BhZ2VzX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8MzA1PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWlncmF0ZV9yZXRyeSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDMwNj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG1pZ3JhdGVfcmV0
cnkoKSBjb25zdCB7IHJldHVybiBhdDwzMDY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19t
bV9wYWdlX2FsbG9jKCkgY29uc3QgeyByZXR1cm4gYXQ8MzA3PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgbW1fcGFnZV9hbGxvYygpIGNvbnN0IHsgcmV0dXJuIGF0PDMw
Nz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21tX3BhZ2VfYWxsb2NfZXh0ZnJhZygpIGNv
bnN0IHsgcmV0dXJuIGF0PDMwOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIG1tX3BhZ2VfYWxsb2NfZXh0ZnJhZygpIGNvbnN0IHsgcmV0dXJuIGF0PDMwOD4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX21tX3BhZ2VfYWxsb2Nfem9uZV9sb2NrZWQoKSBjb25zdCB7
IHJldHVybiBhdDwzMDk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBt
bV9wYWdlX2FsbG9jX3pvbmVfbG9ja2VkKCkgY29uc3QgeyByZXR1cm4gYXQ8MzA5PigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfbW1fcGFnZV9mcmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzEw
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbW1fcGFnZV9mcmVlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MzEwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbW1fcGFn
ZV9mcmVlX2JhdGNoZWQoKSBjb25zdCB7IHJldHVybiBhdDwzMTE+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyBtbV9wYWdlX2ZyZWVfYmF0Y2hlZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDMxMT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21tX3BhZ2VfcGNwdV9kcmFp
bigpIGNvbnN0IHsgcmV0dXJuIGF0PDMxMj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIG1tX3BhZ2VfcGNwdV9kcmFpbigpIGNvbnN0IHsgcmV0dXJuIGF0PDMxMj4oKS5h
c19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Jzc19zdGF0KCkgY29uc3QgeyByZXR1cm4gYXQ8MzEz
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcnNzX3N0YXQoKSBjb25z
dCB7IHJldHVybiBhdDwzMTM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19pb25faGVhcF9z
aHJpbmsoKSBjb25zdCB7IHJldHVybiBhdDwzMTQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyBpb25faGVhcF9zaHJpbmsoKSBjb25zdCB7IHJldHVybiBhdDwzMTQ+KCku
YXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19pb25faGVhcF9ncm93KCkgY29uc3QgeyByZXR1cm4g
YXQ8MzE1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW9uX2hlYXBf
Z3JvdygpIGNvbnN0IHsgcmV0dXJuIGF0PDMxNT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFz
X2ZlbmNlX2luaXQoKSBjb25zdCB7IHJldHVybiBhdDwzMTY+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBmZW5jZV9pbml0KCkgY29uc3QgeyByZXR1cm4gYXQ8MzE2Pigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfZmVuY2VfZGVzdHJveSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDMxNz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGZlbmNlX2Rl
c3Ryb3koKSBjb25zdCB7IHJldHVybiBhdDwzMTc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19mZW5jZV9lbmFibGVfc2lnbmFsKCkgY29uc3QgeyByZXR1cm4gYXQ8MzE4PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZmVuY2VfZW5hYmxlX3NpZ25hbCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDMxOD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2ZlbmNlX3NpZ25h
bGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8MzE5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgZmVuY2Vfc2lnbmFsZWQoKSBjb25zdCB7IHJldHVybiBhdDwzMTk+KCkuYXNf
Ynl0ZXMoKTsgfQorICBib29sIGhhc19jbGtfZW5hYmxlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzIw
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2xrX2VuYWJsZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDMyMD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nsa19kaXNh
YmxlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzIxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMgY2xrX2Rpc2FibGUoKSBjb25zdCB7IHJldHVybiBhdDwzMjE+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19jbGtfc2V0X3JhdGUoKSBjb25zdCB7IHJldHVybiBhdDwzMjI+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBjbGtfc2V0X3JhdGUoKSBj
b25zdCB7IHJldHVybiBhdDwzMjI+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19iaW5kZXJf
dHJhbnNhY3Rpb25fYWxsb2NfYnVmKCkgY29uc3QgeyByZXR1cm4gYXQ8MzIzPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmluZGVyX3RyYW5zYWN0aW9uX2FsbG9jX2J1
ZigpIGNvbnN0IHsgcmV0dXJuIGF0PDMyMz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Np
Z25hbF9kZWxpdmVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MzI0PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgc2lnbmFsX2RlbGl2ZXIoKSBjb25zdCB7IHJldHVybiBhdDwz
MjQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19zaWduYWxfZ2VuZXJhdGUoKSBjb25zdCB7
IHJldHVybiBhdDwzMjU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBz
aWduYWxfZ2VuZXJhdGUoKSBjb25zdCB7IHJldHVybiBhdDwzMjU+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19vb21fc2NvcmVfYWRqX3VwZGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMyNj4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIG9vbV9zY29yZV9hZGpfdXBk
YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzI2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
Z2VuZXJpYygpIGNvbnN0IHsgcmV0dXJuIGF0PDMyNz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzIGdlbmVyaWMoKSBjb25zdCB7IHJldHVybiBhdDwzMjc+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19tbV9ldmVudF9yZWNvcmQoKSBjb25zdCB7IHJldHVybiBhdDwz
Mjg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBtbV9ldmVudF9yZWNv
cmQoKSBjb25zdCB7IHJldHVybiBhdDwzMjg+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19z
eXNfZW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDwzMjk+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBzeXNfZW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDwzMjk+KCkuYXNf
Ynl0ZXMoKTsgfQorICBib29sIGhhc19zeXNfZXhpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDMzMD4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHN5c19leGl0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MzMwPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfemVybygpIGNvbnN0
IHsgcmV0dXJuIGF0PDMzMT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IHplcm8oKSBjb25zdCB7IHJldHVybiBhdDwzMzE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhh
c19ncHVfZnJlcXVlbmN5KCkgY29uc3QgeyByZXR1cm4gYXQ8MzMyPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZ3B1X2ZyZXF1ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDMzMj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3NkZV90cmFjaW5nX21hcmtfd3JpdGUo
KSBjb25zdCB7IHJldHVybiBhdDwzMzM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBzZGVfdHJhY2luZ19tYXJrX3dyaXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzMzPigp
LmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbWFya192aWN0aW0oKSBjb25zdCB7IHJldHVybiBh
dDwzMzQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBtYXJrX3ZpY3Rp
bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMzND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2lv
bl9zdGF0KCkgY29uc3QgeyByZXR1cm4gYXQ8MzM1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgaW9uX3N0YXQoKSBjb25zdCB7IHJldHVybiBhdDwzMzU+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc19pb25fYnVmZmVyX2NyZWF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDMzNj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGlvbl9idWZmZXJf
Y3JlYXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MzM2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfaW9uX2J1ZmZlcl9kZXN0cm95KCkgY29uc3QgeyByZXR1cm4gYXQ8MzM3PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW9uX2J1ZmZlcl9kZXN0cm95KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MzM3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2NtX2NhbGxfc3Rh
cnQoKSBjb25zdCB7IHJldHVybiBhdDwzMzg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBzY21fY2FsbF9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDMzOD4oKS5hc19i
eXRlcygpOyB9CisgIGJvb2wgaGFzX3NjbV9jYWxsX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDMz
OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHNjbV9jYWxsX2VuZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDMzOT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2dwdV9t
ZW1fdG90YWwoKSBjb25zdCB7IHJldHVybiBhdDwzNDA+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBncHVfbWVtX3RvdGFsKCkgY29uc3QgeyByZXR1cm4gYXQ8MzQwPigp
LmFzX2J5dGVzKCk7IH0KK307CisKK2NsYXNzIEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96
ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RpbWVzdGFtcEZpZWxkTnVtYmVyID0g
MSwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAyLAorICAgIGtQcmludEZpZWxkTnVtYmVyID0gMywK
KyAgICBrU2NoZWRTd2l0Y2hGaWVsZE51bWJlciA9IDQsCisgICAga0NwdUZyZXF1ZW5jeUZpZWxk
TnVtYmVyID0gMTEsCisgICAga0NwdUZyZXF1ZW5jeUxpbWl0c0ZpZWxkTnVtYmVyID0gMTIsCisg
ICAga0NwdUlkbGVGaWVsZE51bWJlciA9IDEzLAorICAgIGtDbG9ja0VuYWJsZUZpZWxkTnVtYmVy
ID0gMTQsCisgICAga0Nsb2NrRGlzYWJsZUZpZWxkTnVtYmVyID0gMTUsCisgICAga0Nsb2NrU2V0
UmF0ZUZpZWxkTnVtYmVyID0gMTYsCisgICAga1NjaGVkV2FrZXVwRmllbGROdW1iZXIgPSAxNywK
KyAgICBrU2NoZWRCbG9ja2VkUmVhc29uRmllbGROdW1iZXIgPSAxOCwKKyAgICBrU2NoZWRDcHVI
b3RwbHVnRmllbGROdW1iZXIgPSAxOSwKKyAgICBrU2NoZWRXYWtpbmdGaWVsZE51bWJlciA9IDIw
LAorICAgIGtJcGlFbnRyeUZpZWxkTnVtYmVyID0gMjEsCisgICAga0lwaUV4aXRGaWVsZE51bWJl
ciA9IDIyLAorICAgIGtJcGlSYWlzZUZpZWxkTnVtYmVyID0gMjMsCisgICAga1NvZnRpcnFFbnRy
eUZpZWxkTnVtYmVyID0gMjQsCisgICAga1NvZnRpcnFFeGl0RmllbGROdW1iZXIgPSAyNSwKKyAg
ICBrU29mdGlycVJhaXNlRmllbGROdW1iZXIgPSAyNiwKKyAgICBrSTJjUmVhZEZpZWxkTnVtYmVy
ID0gMjcsCisgICAga0kyY1dyaXRlRmllbGROdW1iZXIgPSAyOCwKKyAgICBrSTJjUmVzdWx0Rmll
bGROdW1iZXIgPSAyOSwKKyAgICBrSTJjUmVwbHlGaWVsZE51bWJlciA9IDMwLAorICAgIGtTbWJ1
c1JlYWRGaWVsZE51bWJlciA9IDMxLAorICAgIGtTbWJ1c1dyaXRlRmllbGROdW1iZXIgPSAzMiwK
KyAgICBrU21idXNSZXN1bHRGaWVsZE51bWJlciA9IDMzLAorICAgIGtTbWJ1c1JlcGx5RmllbGRO
dW1iZXIgPSAzNCwKKyAgICBrTG93bWVtb3J5S2lsbEZpZWxkTnVtYmVyID0gMzUsCisgICAga0ly
cUhhbmRsZXJFbnRyeUZpZWxkTnVtYmVyID0gMzYsCisgICAga0lycUhhbmRsZXJFeGl0RmllbGRO
dW1iZXIgPSAzNywKKyAgICBrU3luY1B0RmllbGROdW1iZXIgPSAzOCwKKyAgICBrU3luY1RpbWVs
aW5lRmllbGROdW1iZXIgPSAzOSwKKyAgICBrU3luY1dhaXRGaWVsZE51bWJlciA9IDQwLAorICAg
IGtFeHQ0RGFXcml0ZUJlZ2luRmllbGROdW1iZXIgPSA0MSwKKyAgICBrRXh0NERhV3JpdGVFbmRG
aWVsZE51bWJlciA9IDQyLAorICAgIGtFeHQ0U3luY0ZpbGVFbnRlckZpZWxkTnVtYmVyID0gNDMs
CisgICAga0V4dDRTeW5jRmlsZUV4aXRGaWVsZE51bWJlciA9IDQ0LAorICAgIGtCbG9ja1JxSXNz
dWVGaWVsZE51bWJlciA9IDQ1LAorICAgIGtNbVZtc2NhbkRpcmVjdFJlY2xhaW1CZWdpbkZpZWxk
TnVtYmVyID0gNDYsCisgICAga01tVm1zY2FuRGlyZWN0UmVjbGFpbUVuZEZpZWxkTnVtYmVyID0g
NDcsCisgICAga01tVm1zY2FuS3N3YXBkV2FrZUZpZWxkTnVtYmVyID0gNDgsCisgICAga01tVm1z
Y2FuS3N3YXBkU2xlZXBGaWVsZE51bWJlciA9IDQ5LAorICAgIGtCaW5kZXJUcmFuc2FjdGlvbkZp
ZWxkTnVtYmVyID0gNTAsCisgICAga0JpbmRlclRyYW5zYWN0aW9uUmVjZWl2ZWRGaWVsZE51bWJl
ciA9IDUxLAorICAgIGtCaW5kZXJTZXRQcmlvcml0eUZpZWxkTnVtYmVyID0gNTIsCisgICAga0Jp
bmRlckxvY2tGaWVsZE51bWJlciA9IDUzLAorICAgIGtCaW5kZXJMb2NrZWRGaWVsZE51bWJlciA9
IDU0LAorICAgIGtCaW5kZXJVbmxvY2tGaWVsZE51bWJlciA9IDU1LAorICAgIGtXb3JrcXVldWVB
Y3RpdmF0ZVdvcmtGaWVsZE51bWJlciA9IDU2LAorICAgIGtXb3JrcXVldWVFeGVjdXRlRW5kRmll
bGROdW1iZXIgPSA1NywKKyAgICBrV29ya3F1ZXVlRXhlY3V0ZVN0YXJ0RmllbGROdW1iZXIgPSA1
OCwKKyAgICBrV29ya3F1ZXVlUXVldWVXb3JrRmllbGROdW1iZXIgPSA1OSwKKyAgICBrUmVndWxh
dG9yRGlzYWJsZUZpZWxkTnVtYmVyID0gNjAsCisgICAga1JlZ3VsYXRvckRpc2FibGVDb21wbGV0
ZUZpZWxkTnVtYmVyID0gNjEsCisgICAga1JlZ3VsYXRvckVuYWJsZUZpZWxkTnVtYmVyID0gNjIs
CisgICAga1JlZ3VsYXRvckVuYWJsZUNvbXBsZXRlRmllbGROdW1iZXIgPSA2MywKKyAgICBrUmVn
dWxhdG9yRW5hYmxlRGVsYXlGaWVsZE51bWJlciA9IDY0LAorICAgIGtSZWd1bGF0b3JTZXRWb2x0
YWdlRmllbGROdW1iZXIgPSA2NSwKKyAgICBrUmVndWxhdG9yU2V0Vm9sdGFnZUNvbXBsZXRlRmll
bGROdW1iZXIgPSA2NiwKKyAgICBrQ2dyb3VwQXR0YWNoVGFza0ZpZWxkTnVtYmVyID0gNjcsCisg
ICAga0Nncm91cE1rZGlyRmllbGROdW1iZXIgPSA2OCwKKyAgICBrQ2dyb3VwUmVtb3VudEZpZWxk
TnVtYmVyID0gNjksCisgICAga0Nncm91cFJtZGlyRmllbGROdW1iZXIgPSA3MCwKKyAgICBrQ2dy
b3VwVHJhbnNmZXJUYXNrc0ZpZWxkTnVtYmVyID0gNzEsCisgICAga0Nncm91cERlc3Ryb3lSb290
RmllbGROdW1iZXIgPSA3MiwKKyAgICBrQ2dyb3VwUmVsZWFzZUZpZWxkTnVtYmVyID0gNzMsCisg
ICAga0Nncm91cFJlbmFtZUZpZWxkTnVtYmVyID0gNzQsCisgICAga0Nncm91cFNldHVwUm9vdEZp
ZWxkTnVtYmVyID0gNzUsCisgICAga01kcENtZEtpY2tvZmZGaWVsZE51bWJlciA9IDc2LAorICAg
IGtNZHBDb21taXRGaWVsZE51bWJlciA9IDc3LAorICAgIGtNZHBQZXJmU2V0T3RGaWVsZE51bWJl
ciA9IDc4LAorICAgIGtNZHBTc3BwQ2hhbmdlRmllbGROdW1iZXIgPSA3OSwKKyAgICBrVHJhY2lu
Z01hcmtXcml0ZUZpZWxkTnVtYmVyID0gODAsCisgICAga01kcENtZFBpbmdwb25nRG9uZUZpZWxk
TnVtYmVyID0gODEsCisgICAga01kcENvbXBhcmVCd0ZpZWxkTnVtYmVyID0gODIsCisgICAga01k
cFBlcmZTZXRQYW5pY0x1dHNGaWVsZE51bWJlciA9IDgzLAorICAgIGtNZHBTc3BwU2V0RmllbGRO
dW1iZXIgPSA4NCwKKyAgICBrTWRwQ21kUmVhZHB0ckRvbmVGaWVsZE51bWJlciA9IDg1LAorICAg
IGtNZHBNaXNyQ3JjRmllbGROdW1iZXIgPSA4NiwKKyAgICBrTWRwUGVyZlNldFFvc0x1dHNGaWVs
ZE51bWJlciA9IDg3LAorICAgIGtNZHBUcmFjZUNvdW50ZXJGaWVsZE51bWJlciA9IDg4LAorICAg
IGtNZHBDbWRSZWxlYXNlQndGaWVsZE51bWJlciA9IDg5LAorICAgIGtNZHBNaXhlclVwZGF0ZUZp
ZWxkTnVtYmVyID0gOTAsCisgICAga01kcFBlcmZTZXRXbUxldmVsc0ZpZWxkTnVtYmVyID0gOTEs
CisgICAga01kcFZpZGVvVW5kZXJydW5Eb25lRmllbGROdW1iZXIgPSA5MiwKKyAgICBrTWRwQ21k
V2FpdFBpbmdwb25nRmllbGROdW1iZXIgPSA5MywKKyAgICBrTWRwUGVyZlByZWZpbGxDYWxjRmll
bGROdW1iZXIgPSA5NCwKKyAgICBrTWRwUGVyZlVwZGF0ZUJ1c0ZpZWxkTnVtYmVyID0gOTUsCisg
ICAga1JvdGF0b3JCd0FvQXNDb250ZXh0RmllbGROdW1iZXIgPSA5NiwKKyAgICBrTW1GaWxlbWFw
QWRkVG9QYWdlQ2FjaGVGaWVsZE51bWJlciA9IDk3LAorICAgIGtNbUZpbGVtYXBEZWxldGVGcm9t
UGFnZUNhY2hlRmllbGROdW1iZXIgPSA5OCwKKyAgICBrTW1Db21wYWN0aW9uQmVnaW5GaWVsZE51
bWJlciA9IDk5LAorICAgIGtNbUNvbXBhY3Rpb25EZWZlckNvbXBhY3Rpb25GaWVsZE51bWJlciA9
IDEwMCwKKyAgICBrTW1Db21wYWN0aW9uRGVmZXJyZWRGaWVsZE51bWJlciA9IDEwMSwKKyAgICBr
TW1Db21wYWN0aW9uRGVmZXJSZXNldEZpZWxkTnVtYmVyID0gMTAyLAorICAgIGtNbUNvbXBhY3Rp
b25FbmRGaWVsZE51bWJlciA9IDEwMywKKyAgICBrTW1Db21wYWN0aW9uRmluaXNoZWRGaWVsZE51
bWJlciA9IDEwNCwKKyAgICBrTW1Db21wYWN0aW9uSXNvbGF0ZUZyZWVwYWdlc0ZpZWxkTnVtYmVy
ID0gMTA1LAorICAgIGtNbUNvbXBhY3Rpb25Jc29sYXRlTWlncmF0ZXBhZ2VzRmllbGROdW1iZXIg
PSAxMDYsCisgICAga01tQ29tcGFjdGlvbktjb21wYWN0ZFNsZWVwRmllbGROdW1iZXIgPSAxMDcs
CisgICAga01tQ29tcGFjdGlvbktjb21wYWN0ZFdha2VGaWVsZE51bWJlciA9IDEwOCwKKyAgICBr
TW1Db21wYWN0aW9uTWlncmF0ZXBhZ2VzRmllbGROdW1iZXIgPSAxMDksCisgICAga01tQ29tcGFj
dGlvblN1aXRhYmxlRmllbGROdW1iZXIgPSAxMTAsCisgICAga01tQ29tcGFjdGlvblRyeVRvQ29t
cGFjdFBhZ2VzRmllbGROdW1iZXIgPSAxMTEsCisgICAga01tQ29tcGFjdGlvbldha2V1cEtjb21w
YWN0ZEZpZWxkTnVtYmVyID0gMTEyLAorICAgIGtTdXNwZW5kUmVzdW1lRmllbGROdW1iZXIgPSAx
MTMsCisgICAga1NjaGVkV2FrZXVwTmV3RmllbGROdW1iZXIgPSAxMTQsCisgICAga0Jsb2NrQmlv
QmFja21lcmdlRmllbGROdW1iZXIgPSAxMTUsCisgICAga0Jsb2NrQmlvQm91bmNlRmllbGROdW1i
ZXIgPSAxMTYsCisgICAga0Jsb2NrQmlvQ29tcGxldGVGaWVsZE51bWJlciA9IDExNywKKyAgICBr
QmxvY2tCaW9Gcm9udG1lcmdlRmllbGROdW1iZXIgPSAxMTgsCisgICAga0Jsb2NrQmlvUXVldWVG
aWVsZE51bWJlciA9IDExOSwKKyAgICBrQmxvY2tCaW9SZW1hcEZpZWxkTnVtYmVyID0gMTIwLAor
ICAgIGtCbG9ja0RpcnR5QnVmZmVyRmllbGROdW1iZXIgPSAxMjEsCisgICAga0Jsb2NrR2V0cnFG
aWVsZE51bWJlciA9IDEyMiwKKyAgICBrQmxvY2tQbHVnRmllbGROdW1iZXIgPSAxMjMsCisgICAg
a0Jsb2NrUnFBYm9ydEZpZWxkTnVtYmVyID0gMTI0LAorICAgIGtCbG9ja1JxQ29tcGxldGVGaWVs
ZE51bWJlciA9IDEyNSwKKyAgICBrQmxvY2tScUluc2VydEZpZWxkTnVtYmVyID0gMTI2LAorICAg
IGtCbG9ja1JxUmVtYXBGaWVsZE51bWJlciA9IDEyOCwKKyAgICBrQmxvY2tScVJlcXVldWVGaWVs
ZE51bWJlciA9IDEyOSwKKyAgICBrQmxvY2tTbGVlcHJxRmllbGROdW1iZXIgPSAxMzAsCisgICAg
a0Jsb2NrU3BsaXRGaWVsZE51bWJlciA9IDEzMSwKKyAgICBrQmxvY2tUb3VjaEJ1ZmZlckZpZWxk
TnVtYmVyID0gMTMyLAorICAgIGtCbG9ja1VucGx1Z0ZpZWxkTnVtYmVyID0gMTMzLAorICAgIGtF
eHQ0QWxsb2NEYUJsb2Nrc0ZpZWxkTnVtYmVyID0gMTM0LAorICAgIGtFeHQ0QWxsb2NhdGVCbG9j
a3NGaWVsZE51bWJlciA9IDEzNSwKKyAgICBrRXh0NEFsbG9jYXRlSW5vZGVGaWVsZE51bWJlciA9
IDEzNiwKKyAgICBrRXh0NEJlZ2luT3JkZXJlZFRydW5jYXRlRmllbGROdW1iZXIgPSAxMzcsCisg
ICAga0V4dDRDb2xsYXBzZVJhbmdlRmllbGROdW1iZXIgPSAxMzgsCisgICAga0V4dDREYVJlbGVh
c2VTcGFjZUZpZWxkTnVtYmVyID0gMTM5LAorICAgIGtFeHQ0RGFSZXNlcnZlU3BhY2VGaWVsZE51
bWJlciA9IDE0MCwKKyAgICBrRXh0NERhVXBkYXRlUmVzZXJ2ZVNwYWNlRmllbGROdW1iZXIgPSAx
NDEsCisgICAga0V4dDREYVdyaXRlUGFnZXNGaWVsZE51bWJlciA9IDE0MiwKKyAgICBrRXh0NERh
V3JpdGVQYWdlc0V4dGVudEZpZWxkTnVtYmVyID0gMTQzLAorICAgIGtFeHQ0RGlyZWN0SU9FbnRl
ckZpZWxkTnVtYmVyID0gMTQ0LAorICAgIGtFeHQ0RGlyZWN0SU9FeGl0RmllbGROdW1iZXIgPSAx
NDUsCisgICAga0V4dDREaXNjYXJkQmxvY2tzRmllbGROdW1iZXIgPSAxNDYsCisgICAga0V4dDRE
aXNjYXJkUHJlYWxsb2NhdGlvbnNGaWVsZE51bWJlciA9IDE0NywKKyAgICBrRXh0NERyb3BJbm9k
ZUZpZWxkTnVtYmVyID0gMTQ4LAorICAgIGtFeHQ0RXNDYWNoZUV4dGVudEZpZWxkTnVtYmVyID0g
MTQ5LAorICAgIGtFeHQ0RXNGaW5kRGVsYXllZEV4dGVudFJhbmdlRW50ZXJGaWVsZE51bWJlciA9
IDE1MCwKKyAgICBrRXh0NEVzRmluZERlbGF5ZWRFeHRlbnRSYW5nZUV4aXRGaWVsZE51bWJlciA9
IDE1MSwKKyAgICBrRXh0NEVzSW5zZXJ0RXh0ZW50RmllbGROdW1iZXIgPSAxNTIsCisgICAga0V4
dDRFc0xvb2t1cEV4dGVudEVudGVyRmllbGROdW1iZXIgPSAxNTMsCisgICAga0V4dDRFc0xvb2t1
cEV4dGVudEV4aXRGaWVsZE51bWJlciA9IDE1NCwKKyAgICBrRXh0NEVzUmVtb3ZlRXh0ZW50Rmll
bGROdW1iZXIgPSAxNTUsCisgICAga0V4dDRFc1Nocmlua0ZpZWxkTnVtYmVyID0gMTU2LAorICAg
IGtFeHQ0RXNTaHJpbmtDb3VudEZpZWxkTnVtYmVyID0gMTU3LAorICAgIGtFeHQ0RXNTaHJpbmtT
Y2FuRW50ZXJGaWVsZE51bWJlciA9IDE1OCwKKyAgICBrRXh0NEVzU2hyaW5rU2NhbkV4aXRGaWVs
ZE51bWJlciA9IDE1OSwKKyAgICBrRXh0NEV2aWN0SW5vZGVGaWVsZE51bWJlciA9IDE2MCwKKyAg
ICBrRXh0NEV4dENvbnZlcnRUb0luaXRpYWxpemVkRW50ZXJGaWVsZE51bWJlciA9IDE2MSwKKyAg
ICBrRXh0NEV4dENvbnZlcnRUb0luaXRpYWxpemVkRmFzdHBhdGhGaWVsZE51bWJlciA9IDE2MiwK
KyAgICBrRXh0NEV4dEhhbmRsZVVud3JpdHRlbkV4dGVudHNGaWVsZE51bWJlciA9IDE2MywKKyAg
ICBrRXh0NEV4dEluQ2FjaGVGaWVsZE51bWJlciA9IDE2NCwKKyAgICBrRXh0NEV4dExvYWRFeHRl
bnRGaWVsZE51bWJlciA9IDE2NSwKKyAgICBrRXh0NEV4dE1hcEJsb2Nrc0VudGVyRmllbGROdW1i
ZXIgPSAxNjYsCisgICAga0V4dDRFeHRNYXBCbG9ja3NFeGl0RmllbGROdW1iZXIgPSAxNjcsCisg
ICAga0V4dDRFeHRQdXRJbkNhY2hlRmllbGROdW1iZXIgPSAxNjgsCisgICAga0V4dDRFeHRSZW1v
dmVTcGFjZUZpZWxkTnVtYmVyID0gMTY5LAorICAgIGtFeHQ0RXh0UmVtb3ZlU3BhY2VEb25lRmll
bGROdW1iZXIgPSAxNzAsCisgICAga0V4dDRFeHRSbUlkeEZpZWxkTnVtYmVyID0gMTcxLAorICAg
IGtFeHQ0RXh0Um1MZWFmRmllbGROdW1iZXIgPSAxNzIsCisgICAga0V4dDRFeHRTaG93RXh0ZW50
RmllbGROdW1iZXIgPSAxNzMsCisgICAga0V4dDRGYWxsb2NhdGVFbnRlckZpZWxkTnVtYmVyID0g
MTc0LAorICAgIGtFeHQ0RmFsbG9jYXRlRXhpdEZpZWxkTnVtYmVyID0gMTc1LAorICAgIGtFeHQ0
RmluZERlbGFsbG9jUmFuZ2VGaWVsZE51bWJlciA9IDE3NiwKKyAgICBrRXh0NEZvcmdldEZpZWxk
TnVtYmVyID0gMTc3LAorICAgIGtFeHQ0RnJlZUJsb2Nrc0ZpZWxkTnVtYmVyID0gMTc4LAorICAg
IGtFeHQ0RnJlZUlub2RlRmllbGROdW1iZXIgPSAxNzksCisgICAga0V4dDRHZXRJbXBsaWVkQ2x1
c3RlckFsbG9jRXhpdEZpZWxkTnVtYmVyID0gMTgwLAorICAgIGtFeHQ0R2V0UmVzZXJ2ZWRDbHVz
dGVyQWxsb2NGaWVsZE51bWJlciA9IDE4MSwKKyAgICBrRXh0NEluZE1hcEJsb2Nrc0VudGVyRmll
bGROdW1iZXIgPSAxODIsCisgICAga0V4dDRJbmRNYXBCbG9ja3NFeGl0RmllbGROdW1iZXIgPSAx
ODMsCisgICAga0V4dDRJbnNlcnRSYW5nZUZpZWxkTnVtYmVyID0gMTg0LAorICAgIGtFeHQ0SW52
YWxpZGF0ZXBhZ2VGaWVsZE51bWJlciA9IDE4NSwKKyAgICBrRXh0NEpvdXJuYWxTdGFydEZpZWxk
TnVtYmVyID0gMTg2LAorICAgIGtFeHQ0Sm91cm5hbFN0YXJ0UmVzZXJ2ZWRGaWVsZE51bWJlciA9
IDE4NywKKyAgICBrRXh0NEpvdXJuYWxsZWRJbnZhbGlkYXRlcGFnZUZpZWxkTnVtYmVyID0gMTg4
LAorICAgIGtFeHQ0Sm91cm5hbGxlZFdyaXRlRW5kRmllbGROdW1iZXIgPSAxODksCisgICAga0V4
dDRMb2FkSW5vZGVGaWVsZE51bWJlciA9IDE5MCwKKyAgICBrRXh0NExvYWRJbm9kZUJpdG1hcEZp
ZWxkTnVtYmVyID0gMTkxLAorICAgIGtFeHQ0TWFya0lub2RlRGlydHlGaWVsZE51bWJlciA9IDE5
MiwKKyAgICBrRXh0NE1iQml0bWFwTG9hZEZpZWxkTnVtYmVyID0gMTkzLAorICAgIGtFeHQ0TWJC
dWRkeUJpdG1hcExvYWRGaWVsZE51bWJlciA9IDE5NCwKKyAgICBrRXh0NE1iRGlzY2FyZFByZWFs
bG9jYXRpb25zRmllbGROdW1iZXIgPSAxOTUsCisgICAga0V4dDRNYk5ld0dyb3VwUGFGaWVsZE51
bWJlciA9IDE5NiwKKyAgICBrRXh0NE1iTmV3SW5vZGVQYUZpZWxkTnVtYmVyID0gMTk3LAorICAg
IGtFeHQ0TWJSZWxlYXNlR3JvdXBQYUZpZWxkTnVtYmVyID0gMTk4LAorICAgIGtFeHQ0TWJSZWxl
YXNlSW5vZGVQYUZpZWxkTnVtYmVyID0gMTk5LAorICAgIGtFeHQ0TWJhbGxvY0FsbG9jRmllbGRO
dW1iZXIgPSAyMDAsCisgICAga0V4dDRNYmFsbG9jRGlzY2FyZEZpZWxkTnVtYmVyID0gMjAxLAor
ICAgIGtFeHQ0TWJhbGxvY0ZyZWVGaWVsZE51bWJlciA9IDIwMiwKKyAgICBrRXh0NE1iYWxsb2NQ
cmVhbGxvY0ZpZWxkTnVtYmVyID0gMjAzLAorICAgIGtFeHQ0T3RoZXJJbm9kZVVwZGF0ZVRpbWVG
aWVsZE51bWJlciA9IDIwNCwKKyAgICBrRXh0NFB1bmNoSG9sZUZpZWxkTnVtYmVyID0gMjA1LAor
ICAgIGtFeHQ0UmVhZEJsb2NrQml0bWFwTG9hZEZpZWxkTnVtYmVyID0gMjA2LAorICAgIGtFeHQ0
UmVhZHBhZ2VGaWVsZE51bWJlciA9IDIwNywKKyAgICBrRXh0NFJlbGVhc2VwYWdlRmllbGROdW1i
ZXIgPSAyMDgsCisgICAga0V4dDRSZW1vdmVCbG9ja3NGaWVsZE51bWJlciA9IDIwOSwKKyAgICBr
RXh0NFJlcXVlc3RCbG9ja3NGaWVsZE51bWJlciA9IDIxMCwKKyAgICBrRXh0NFJlcXVlc3RJbm9k
ZUZpZWxkTnVtYmVyID0gMjExLAorICAgIGtFeHQ0U3luY0ZzRmllbGROdW1iZXIgPSAyMTIsCisg
ICAga0V4dDRUcmltQWxsRnJlZUZpZWxkTnVtYmVyID0gMjEzLAorICAgIGtFeHQ0VHJpbUV4dGVu
dEZpZWxkTnVtYmVyID0gMjE0LAorICAgIGtFeHQ0VHJ1bmNhdGVFbnRlckZpZWxkTnVtYmVyID0g
MjE1LAorICAgIGtFeHQ0VHJ1bmNhdGVFeGl0RmllbGROdW1iZXIgPSAyMTYsCisgICAga0V4dDRV
bmxpbmtFbnRlckZpZWxkTnVtYmVyID0gMjE3LAorICAgIGtFeHQ0VW5saW5rRXhpdEZpZWxkTnVt
YmVyID0gMjE4LAorICAgIGtFeHQ0V3JpdGVCZWdpbkZpZWxkTnVtYmVyID0gMjE5LAorICAgIGtF
eHQ0V3JpdGVFbmRGaWVsZE51bWJlciA9IDIzMCwKKyAgICBrRXh0NFdyaXRlcGFnZUZpZWxkTnVt
YmVyID0gMjMxLAorICAgIGtFeHQ0V3JpdGVwYWdlc0ZpZWxkTnVtYmVyID0gMjMyLAorICAgIGtF
eHQ0V3JpdGVwYWdlc1Jlc3VsdEZpZWxkTnVtYmVyID0gMjMzLAorICAgIGtFeHQ0WmVyb1Jhbmdl
RmllbGROdW1iZXIgPSAyMzQsCisgICAga1Rhc2tOZXd0YXNrRmllbGROdW1iZXIgPSAyMzUsCisg
ICAga1Rhc2tSZW5hbWVGaWVsZE51bWJlciA9IDIzNiwKKyAgICBrU2NoZWRQcm9jZXNzRXhlY0Zp
ZWxkTnVtYmVyID0gMjM3LAorICAgIGtTY2hlZFByb2Nlc3NFeGl0RmllbGROdW1iZXIgPSAyMzgs
CisgICAga1NjaGVkUHJvY2Vzc0ZvcmtGaWVsZE51bWJlciA9IDIzOSwKKyAgICBrU2NoZWRQcm9j
ZXNzRnJlZUZpZWxkTnVtYmVyID0gMjQwLAorICAgIGtTY2hlZFByb2Nlc3NIYW5nRmllbGROdW1i
ZXIgPSAyNDEsCisgICAga1NjaGVkUHJvY2Vzc1dhaXRGaWVsZE51bWJlciA9IDI0MiwKKyAgICBr
RjJmc0RvU3VibWl0QmlvRmllbGROdW1iZXIgPSAyNDMsCisgICAga0YyZnNFdmljdElub2RlRmll
bGROdW1iZXIgPSAyNDQsCisgICAga0YyZnNGYWxsb2NhdGVGaWVsZE51bWJlciA9IDI0NSwKKyAg
ICBrRjJmc0dldERhdGFCbG9ja0ZpZWxkTnVtYmVyID0gMjQ2LAorICAgIGtGMmZzR2V0VmljdGlt
RmllbGROdW1iZXIgPSAyNDcsCisgICAga0YyZnNJZ2V0RmllbGROdW1iZXIgPSAyNDgsCisgICAg
a0YyZnNJZ2V0RXhpdEZpZWxkTnVtYmVyID0gMjQ5LAorICAgIGtGMmZzTmV3SW5vZGVGaWVsZE51
bWJlciA9IDI1MCwKKyAgICBrRjJmc1JlYWRwYWdlRmllbGROdW1iZXIgPSAyNTEsCisgICAga0Yy
ZnNSZXNlcnZlTmV3QmxvY2tGaWVsZE51bWJlciA9IDI1MiwKKyAgICBrRjJmc1NldFBhZ2VEaXJ0
eUZpZWxkTnVtYmVyID0gMjUzLAorICAgIGtGMmZzU3VibWl0V3JpdGVQYWdlRmllbGROdW1iZXIg
PSAyNTQsCisgICAga0YyZnNTeW5jRmlsZUVudGVyRmllbGROdW1iZXIgPSAyNTUsCisgICAga0Yy
ZnNTeW5jRmlsZUV4aXRGaWVsZE51bWJlciA9IDI1NiwKKyAgICBrRjJmc1N5bmNGc0ZpZWxkTnVt
YmVyID0gMjU3LAorICAgIGtGMmZzVHJ1bmNhdGVGaWVsZE51bWJlciA9IDI1OCwKKyAgICBrRjJm
c1RydW5jYXRlQmxvY2tzRW50ZXJGaWVsZE51bWJlciA9IDI1OSwKKyAgICBrRjJmc1RydW5jYXRl
QmxvY2tzRXhpdEZpZWxkTnVtYmVyID0gMjYwLAorICAgIGtGMmZzVHJ1bmNhdGVEYXRhQmxvY2tz
UmFuZ2VGaWVsZE51bWJlciA9IDI2MSwKKyAgICBrRjJmc1RydW5jYXRlSW5vZGVCbG9ja3NFbnRl
ckZpZWxkTnVtYmVyID0gMjYyLAorICAgIGtGMmZzVHJ1bmNhdGVJbm9kZUJsb2Nrc0V4aXRGaWVs
ZE51bWJlciA9IDI2MywKKyAgICBrRjJmc1RydW5jYXRlTm9kZUZpZWxkTnVtYmVyID0gMjY0LAor
ICAgIGtGMmZzVHJ1bmNhdGVOb2Rlc0VudGVyRmllbGROdW1iZXIgPSAyNjUsCisgICAga0YyZnNU
cnVuY2F0ZU5vZGVzRXhpdEZpZWxkTnVtYmVyID0gMjY2LAorICAgIGtGMmZzVHJ1bmNhdGVQYXJ0
aWFsTm9kZXNGaWVsZE51bWJlciA9IDI2NywKKyAgICBrRjJmc1VubGlua0VudGVyRmllbGROdW1i
ZXIgPSAyNjgsCisgICAga0YyZnNVbmxpbmtFeGl0RmllbGROdW1iZXIgPSAyNjksCisgICAga0Yy
ZnNWbVBhZ2VNa3dyaXRlRmllbGROdW1iZXIgPSAyNzAsCisgICAga0YyZnNXcml0ZUJlZ2luRmll
bGROdW1iZXIgPSAyNzEsCisgICAga0YyZnNXcml0ZUNoZWNrcG9pbnRGaWVsZE51bWJlciA9IDI3
MiwKKyAgICBrRjJmc1dyaXRlRW5kRmllbGROdW1iZXIgPSAyNzMsCisgICAga0FsbG9jUGFnZXNJ
b21tdUVuZEZpZWxkTnVtYmVyID0gMjc0LAorICAgIGtBbGxvY1BhZ2VzSW9tbXVGYWlsRmllbGRO
dW1iZXIgPSAyNzUsCisgICAga0FsbG9jUGFnZXNJb21tdVN0YXJ0RmllbGROdW1iZXIgPSAyNzYs
CisgICAga0FsbG9jUGFnZXNTeXNFbmRGaWVsZE51bWJlciA9IDI3NywKKyAgICBrQWxsb2NQYWdl
c1N5c0ZhaWxGaWVsZE51bWJlciA9IDI3OCwKKyAgICBrQWxsb2NQYWdlc1N5c1N0YXJ0RmllbGRO
dW1iZXIgPSAyNzksCisgICAga0RtYUFsbG9jQ29udGlndW91c1JldHJ5RmllbGROdW1iZXIgPSAy
ODAsCisgICAga0lvbW11TWFwUmFuZ2VGaWVsZE51bWJlciA9IDI4MSwKKyAgICBrSW9tbXVTZWNQ
dGJsTWFwUmFuZ2VFbmRGaWVsZE51bWJlciA9IDI4MiwKKyAgICBrSW9tbXVTZWNQdGJsTWFwUmFu
Z2VTdGFydEZpZWxkTnVtYmVyID0gMjgzLAorICAgIGtJb25BbGxvY0J1ZmZlckVuZEZpZWxkTnVt
YmVyID0gMjg0LAorICAgIGtJb25BbGxvY0J1ZmZlckZhaWxGaWVsZE51bWJlciA9IDI4NSwKKyAg
ICBrSW9uQWxsb2NCdWZmZXJGYWxsYmFja0ZpZWxkTnVtYmVyID0gMjg2LAorICAgIGtJb25BbGxv
Y0J1ZmZlclN0YXJ0RmllbGROdW1iZXIgPSAyODcsCisgICAga0lvbkNwQWxsb2NSZXRyeUZpZWxk
TnVtYmVyID0gMjg4LAorICAgIGtJb25DcFNlY3VyZUJ1ZmZlckVuZEZpZWxkTnVtYmVyID0gMjg5
LAorICAgIGtJb25DcFNlY3VyZUJ1ZmZlclN0YXJ0RmllbGROdW1iZXIgPSAyOTAsCisgICAga0lv
blByZWZldGNoaW5nRmllbGROdW1iZXIgPSAyOTEsCisgICAga0lvblNlY3VyZUNtYUFkZFRvUG9v
bEVuZEZpZWxkTnVtYmVyID0gMjkyLAorICAgIGtJb25TZWN1cmVDbWFBZGRUb1Bvb2xTdGFydEZp
ZWxkTnVtYmVyID0gMjkzLAorICAgIGtJb25TZWN1cmVDbWFBbGxvY2F0ZUVuZEZpZWxkTnVtYmVy
ID0gMjk0LAorICAgIGtJb25TZWN1cmVDbWFBbGxvY2F0ZVN0YXJ0RmllbGROdW1iZXIgPSAyOTUs
CisgICAga0lvblNlY3VyZUNtYVNocmlua1Bvb2xFbmRGaWVsZE51bWJlciA9IDI5NiwKKyAgICBr
SW9uU2VjdXJlQ21hU2hyaW5rUG9vbFN0YXJ0RmllbGROdW1iZXIgPSAyOTcsCisgICAga0tmcmVl
RmllbGROdW1iZXIgPSAyOTgsCisgICAga0ttYWxsb2NGaWVsZE51bWJlciA9IDI5OSwKKyAgICBr
S21hbGxvY05vZGVGaWVsZE51bWJlciA9IDMwMCwKKyAgICBrS21lbUNhY2hlQWxsb2NGaWVsZE51
bWJlciA9IDMwMSwKKyAgICBrS21lbUNhY2hlQWxsb2NOb2RlRmllbGROdW1iZXIgPSAzMDIsCisg
ICAga0ttZW1DYWNoZUZyZWVGaWVsZE51bWJlciA9IDMwMywKKyAgICBrTWlncmF0ZVBhZ2VzRW5k
RmllbGROdW1iZXIgPSAzMDQsCisgICAga01pZ3JhdGVQYWdlc1N0YXJ0RmllbGROdW1iZXIgPSAz
MDUsCisgICAga01pZ3JhdGVSZXRyeUZpZWxkTnVtYmVyID0gMzA2LAorICAgIGtNbVBhZ2VBbGxv
Y0ZpZWxkTnVtYmVyID0gMzA3LAorICAgIGtNbVBhZ2VBbGxvY0V4dGZyYWdGaWVsZE51bWJlciA9
IDMwOCwKKyAgICBrTW1QYWdlQWxsb2Nab25lTG9ja2VkRmllbGROdW1iZXIgPSAzMDksCisgICAg
a01tUGFnZUZyZWVGaWVsZE51bWJlciA9IDMxMCwKKyAgICBrTW1QYWdlRnJlZUJhdGNoZWRGaWVs
ZE51bWJlciA9IDMxMSwKKyAgICBrTW1QYWdlUGNwdURyYWluRmllbGROdW1iZXIgPSAzMTIsCisg
ICAga1Jzc1N0YXRGaWVsZE51bWJlciA9IDMxMywKKyAgICBrSW9uSGVhcFNocmlua0ZpZWxkTnVt
YmVyID0gMzE0LAorICAgIGtJb25IZWFwR3Jvd0ZpZWxkTnVtYmVyID0gMzE1LAorICAgIGtGZW5j
ZUluaXRGaWVsZE51bWJlciA9IDMxNiwKKyAgICBrRmVuY2VEZXN0cm95RmllbGROdW1iZXIgPSAz
MTcsCisgICAga0ZlbmNlRW5hYmxlU2lnbmFsRmllbGROdW1iZXIgPSAzMTgsCisgICAga0ZlbmNl
U2lnbmFsZWRGaWVsZE51bWJlciA9IDMxOSwKKyAgICBrQ2xrRW5hYmxlRmllbGROdW1iZXIgPSAz
MjAsCisgICAga0Nsa0Rpc2FibGVGaWVsZE51bWJlciA9IDMyMSwKKyAgICBrQ2xrU2V0UmF0ZUZp
ZWxkTnVtYmVyID0gMzIyLAorICAgIGtCaW5kZXJUcmFuc2FjdGlvbkFsbG9jQnVmRmllbGROdW1i
ZXIgPSAzMjMsCisgICAga1NpZ25hbERlbGl2ZXJGaWVsZE51bWJlciA9IDMyNCwKKyAgICBrU2ln
bmFsR2VuZXJhdGVGaWVsZE51bWJlciA9IDMyNSwKKyAgICBrT29tU2NvcmVBZGpVcGRhdGVGaWVs
ZE51bWJlciA9IDMyNiwKKyAgICBrR2VuZXJpY0ZpZWxkTnVtYmVyID0gMzI3LAorICAgIGtNbUV2
ZW50UmVjb3JkRmllbGROdW1iZXIgPSAzMjgsCisgICAga1N5c0VudGVyRmllbGROdW1iZXIgPSAz
MjksCisgICAga1N5c0V4aXRGaWVsZE51bWJlciA9IDMzMCwKKyAgICBrWmVyb0ZpZWxkTnVtYmVy
ID0gMzMxLAorICAgIGtHcHVGcmVxdWVuY3lGaWVsZE51bWJlciA9IDMzMiwKKyAgICBrU2RlVHJh
Y2luZ01hcmtXcml0ZUZpZWxkTnVtYmVyID0gMzMzLAorICAgIGtNYXJrVmljdGltRmllbGROdW1i
ZXIgPSAzMzQsCisgICAga0lvblN0YXRGaWVsZE51bWJlciA9IDMzNSwKKyAgICBrSW9uQnVmZmVy
Q3JlYXRlRmllbGROdW1iZXIgPSAzMzYsCisgICAga0lvbkJ1ZmZlckRlc3Ryb3lGaWVsZE51bWJl
ciA9IDMzNywKKyAgICBrU2NtQ2FsbFN0YXJ0RmllbGROdW1iZXIgPSAzMzgsCisgICAga1NjbUNh
bGxFbmRGaWVsZE51bWJlciA9IDMzOSwKKyAgICBrR3B1TWVtVG90YWxGaWVsZE51bWJlciA9IDM0
MCwKKyAgfTsKKyAgdm9pZCBzZXRfdGltZXN0YW1wKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9waWQodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gUHJpbnRGdHJhY2VFdmVudD4gVCogc2V0X3ByaW50KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFNj
aGVkU3dpdGNoRnRyYWNlRXZlbnQ+IFQqIHNldF9zY2hlZF9zd2l0Y2goKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gQ3B1RnJlcXVlbmN5RnRyYWNlRXZlbnQ+IFQqIHNldF9jcHVfZnJlcXVlbmN5KCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBDcHVGcmVxdWVuY3lMaW1pdHNGdHJhY2VFdmVudD4gVCogc2V0X2NwdV9mcmVx
dWVuY3lfbGltaXRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTIpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDcHVJZGxlRnRyYWNlRXZlbnQ+IFQqIHNl
dF9jcHVfaWRsZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEzKTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2xvY2tFbmFibGVGdHJhY2VFdmVudD4gVCog
c2V0X2Nsb2NrX2VuYWJsZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE0
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2xvY2tEaXNhYmxlRnRyYWNlRXZl
bnQ+IFQqIHNldF9jbG9ja19kaXNhYmxlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMTUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDbG9ja1NldFJhdGVG
dHJhY2VFdmVudD4gVCogc2V0X2Nsb2NrX3NldF9yYXRlKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMTYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTY2hl
ZFdha2V1cEZ0cmFjZUV2ZW50PiBUKiBzZXRfc2NoZWRfd2FrZXVwKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBTY2hlZEJsb2NrZWRSZWFzb25GdHJhY2VFdmVudD4gVCogc2V0X3NjaGVkX2Jsb2NrZWRfcmVh
c29uKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTgpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTY2hlZENwdUhvdHBsdWdGdHJhY2VFdmVudD4gVCogc2V0
X3NjaGVkX2NwdV9ob3RwbHVnKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
MTkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTY2hlZFdha2luZ0Z0cmFjZUV2
ZW50PiBUKiBzZXRfc2NoZWRfd2FraW5nKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMjApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJcGlFbnRyeUZ0cmFj
ZUV2ZW50PiBUKiBzZXRfaXBpX2VudHJ5KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMjEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJcGlFeGl0RnRyYWNl
RXZlbnQ+IFQqIHNldF9pcGlfZXhpdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDIyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSXBpUmFpc2VGdHJhY2VF
dmVudD4gVCogc2V0X2lwaV9yYWlzZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDIzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU29mdGlycUVudHJ5RnRy
YWNlRXZlbnQ+IFQqIHNldF9zb2Z0aXJxX2VudHJ5KCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMjQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTb2Z0aXJx
RXhpdEZ0cmFjZUV2ZW50PiBUKiBzZXRfc29mdGlycV9leGl0KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMjUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBT
b2Z0aXJxUmFpc2VGdHJhY2VFdmVudD4gVCogc2V0X3NvZnRpcnFfcmFpc2UoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IEkyY1JlYWRGdHJhY2VFdmVudD4gVCogc2V0X2kyY19yZWFkKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBJMmNXcml0ZUZ0cmFjZUV2ZW50PiBUKiBzZXRfaTJjX3dyaXRlKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBJMmNSZXN1bHRGdHJhY2VFdmVudD4gVCogc2V0X2kyY19yZXN1bHQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyOSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IEkyY1JlcGx5RnRyYWNlRXZlbnQ+IFQqIHNldF9pMmNfcmVwbHkoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IFNtYnVzUmVhZEZ0cmFjZUV2ZW50PiBUKiBzZXRfc21idXNfcmVhZCgpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gU21idXNXcml0ZUZ0cmFjZUV2ZW50PiBUKiBzZXRfc21idXNfd3JpdGUoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMik7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IFNtYnVzUmVzdWx0RnRyYWNlRXZlbnQ+IFQqIHNldF9zbWJ1c19yZXN1bHQo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMyk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IFNtYnVzUmVwbHlGdHJhY2VFdmVudD4gVCogc2V0X3NtYnVzX3Jl
cGx5KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzQpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBMb3dtZW1vcnlLaWxsRnRyYWNlRXZlbnQ+IFQqIHNldF9s
b3dtZW1vcnlfa2lsbCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDM1KTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSXJxSGFuZGxlckVudHJ5RnRyYWNlRXZl
bnQ+IFQqIHNldF9pcnFfaGFuZGxlcl9lbnRyeSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDM2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSXJxSGFuZGxl
ckV4aXRGdHJhY2VFdmVudD4gVCogc2V0X2lycV9oYW5kbGVyX2V4aXQoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzNyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IFN5bmNQdEZ0cmFjZUV2ZW50PiBUKiBzZXRfc3luY19wdCgpIHsKKyAgICByZXR1cm4gQmVn
aW5OZXN0ZWRNZXNzYWdlPFQ+KDM4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
U3luY1RpbWVsaW5lRnRyYWNlRXZlbnQ+IFQqIHNldF9zeW5jX3RpbWVsaW5lKCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBTeW5jV2FpdEZ0cmFjZUV2ZW50PiBUKiBzZXRfc3luY193YWl0KCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNDApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBFeHQ0RGFXcml0ZUJlZ2luRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2RhX3dyaXRl
X2JlZ2luKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNDEpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RGFXcml0ZUVuZEZ0cmFjZUV2ZW50PiBUKiBz
ZXRfZXh0NF9kYV93cml0ZV9lbmQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
Pig0Mik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRTeW5jRmlsZUVudGVy
RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X3N5bmNfZmlsZV9lbnRlcigpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gRXh0NFN5bmNGaWxlRXhpdEZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9zeW5jX2ZpbGVfZXhp
dCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ0KTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gQmxvY2tScUlzc3VlRnRyYWNlRXZlbnQ+IFQqIHNldF9ibG9j
a19ycV9pc3N1ZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ1KTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gTW1WbXNjYW5EaXJlY3RSZWNsYWltQmVnaW5G
dHJhY2VFdmVudD4gVCogc2V0X21tX3Ztc2Nhbl9kaXJlY3RfcmVjbGFpbV9iZWdpbigpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gTW1WbXNjYW5EaXJlY3RSZWNsYWltRW5kRnRyYWNlRXZlbnQ+IFQqIHNldF9t
bV92bXNjYW5fZGlyZWN0X3JlY2xhaW1fZW5kKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oNDcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNbVZtc2Nhbktz
d2FwZFdha2VGdHJhY2VFdmVudD4gVCogc2V0X21tX3Ztc2Nhbl9rc3dhcGRfd2FrZSgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gTW1WbXNjYW5Lc3dhcGRTbGVlcEZ0cmFjZUV2ZW50PiBUKiBzZXRfbW1fdm1z
Y2FuX2tzd2FwZF9zbGVlcCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ5
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmluZGVyVHJhbnNhY3Rpb25GdHJh
Y2VFdmVudD4gVCogc2V0X2JpbmRlcl90cmFuc2FjdGlvbigpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDUwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmlu
ZGVyVHJhbnNhY3Rpb25SZWNlaXZlZEZ0cmFjZUV2ZW50PiBUKiBzZXRfYmluZGVyX3RyYW5zYWN0
aW9uX3JlY2VpdmVkKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNTEpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCaW5kZXJTZXRQcmlvcml0eUZ0cmFjZUV2
ZW50PiBUKiBzZXRfYmluZGVyX3NldF9wcmlvcml0eSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDUyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmluZGVy
TG9ja0Z0cmFjZUV2ZW50PiBUKiBzZXRfYmluZGVyX2xvY2soKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPig1Myk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEJp
bmRlckxvY2tlZEZ0cmFjZUV2ZW50PiBUKiBzZXRfYmluZGVyX2xvY2tlZCgpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDU0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gQmluZGVyVW5sb2NrRnRyYWNlRXZlbnQ+IFQqIHNldF9iaW5kZXJfdW5sb2NrKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNTUpOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBXb3JrcXVldWVBY3RpdmF0ZVdvcmtGdHJhY2VFdmVudD4gVCogc2V0X3dv
cmtxdWV1ZV9hY3RpdmF0ZV93b3JrKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8
VD4oNTYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBXb3JrcXVldWVFeGVjdXRl
RW5kRnRyYWNlRXZlbnQ+IFQqIHNldF93b3JrcXVldWVfZXhlY3V0ZV9lbmQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IFdvcmtxdWV1ZUV4ZWN1dGVTdGFydEZ0cmFjZUV2ZW50PiBUKiBzZXRfd29ya3F1ZXVl
X2V4ZWN1dGVfc3RhcnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1OCk7
CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFdvcmtxdWV1ZVF1ZXVlV29ya0Z0cmFj
ZUV2ZW50PiBUKiBzZXRfd29ya3F1ZXVlX3F1ZXVlX3dvcmsoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPig1OSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFJl
Z3VsYXRvckRpc2FibGVGdHJhY2VFdmVudD4gVCogc2V0X3JlZ3VsYXRvcl9kaXNhYmxlKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjApOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBSZWd1bGF0b3JEaXNhYmxlQ29tcGxldGVGdHJhY2VFdmVudD4gVCogc2V0
X3JlZ3VsYXRvcl9kaXNhYmxlX2NvbXBsZXRlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oNjEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBSZWd1bGF0b3JF
bmFibGVGdHJhY2VFdmVudD4gVCogc2V0X3JlZ3VsYXRvcl9lbmFibGUoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2Mik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IFJlZ3VsYXRvckVuYWJsZUNvbXBsZXRlRnRyYWNlRXZlbnQ+IFQqIHNldF9yZWd1bGF0b3Jf
ZW5hYmxlX2NvbXBsZXRlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjMp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBSZWd1bGF0b3JFbmFibGVEZWxheUZ0
cmFjZUV2ZW50PiBUKiBzZXRfcmVndWxhdG9yX2VuYWJsZV9kZWxheSgpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDY0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gUmVndWxhdG9yU2V0Vm9sdGFnZUZ0cmFjZUV2ZW50PiBUKiBzZXRfcmVndWxhdG9yX3NldF92
b2x0YWdlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjUpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBSZWd1bGF0b3JTZXRWb2x0YWdlQ29tcGxldGVGdHJh
Y2VFdmVudD4gVCogc2V0X3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV9jb21wbGV0ZSgpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDY2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gQ2dyb3VwQXR0YWNoVGFza0Z0cmFjZUV2ZW50PiBUKiBzZXRfY2dyb3VwX2F0dGFj
aF90YXNrKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjcpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDZ3JvdXBNa2RpckZ0cmFjZUV2ZW50PiBUKiBzZXRf
Y2dyb3VwX21rZGlyKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjgpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDZ3JvdXBSZW1vdW50RnRyYWNlRXZlbnQ+
IFQqIHNldF9jZ3JvdXBfcmVtb3VudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDY5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2dyb3VwUm1kaXJGdHJh
Y2VFdmVudD4gVCogc2V0X2Nncm91cF9ybWRpcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDcwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2dyb3VwVHJh
bnNmZXJUYXNrc0Z0cmFjZUV2ZW50PiBUKiBzZXRfY2dyb3VwX3RyYW5zZmVyX3Rhc2tzKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNzEpOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBDZ3JvdXBEZXN0cm95Um9vdEZ0cmFjZUV2ZW50PiBUKiBzZXRfY2dyb3Vw
X2Rlc3Ryb3lfcm9vdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDcyKTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2dyb3VwUmVsZWFzZUZ0cmFjZUV2ZW50
PiBUKiBzZXRfY2dyb3VwX3JlbGVhc2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPig3Myk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENncm91cFJlbmFtZUZ0
cmFjZUV2ZW50PiBUKiBzZXRfY2dyb3VwX3JlbmFtZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDc0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2dyb3Vw
U2V0dXBSb290RnRyYWNlRXZlbnQ+IFQqIHNldF9jZ3JvdXBfc2V0dXBfcm9vdCgpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDc1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gTWRwQ21kS2lja29mZkZ0cmFjZUV2ZW50PiBUKiBzZXRfbWRwX2NtZF9raWNrb2Zm
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNzYpOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQgPSBNZHBDb21taXRGdHJhY2VFdmVudD4gVCogc2V0X21kcF9jb21t
aXQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig3Nyk7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1kcFBlcmZTZXRPdEZ0cmFjZUV2ZW50PiBUKiBzZXRfbWRw
X3BlcmZfc2V0X290KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNzgpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNZHBTc3BwQ2hhbmdlRnRyYWNlRXZlbnQ+
IFQqIHNldF9tZHBfc3NwcF9jaGFuZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPig3OSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNpbmdNYXJrV3Jp
dGVGdHJhY2VFdmVudD4gVCogc2V0X3RyYWNpbmdfbWFya193cml0ZSgpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDgwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gTWRwQ21kUGluZ3BvbmdEb25lRnRyYWNlRXZlbnQ+IFQqIHNldF9tZHBfY21kX3Bpbmdwb25n
X2RvbmUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig4MSk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1kcENvbXBhcmVCd0Z0cmFjZUV2ZW50PiBUKiBzZXRf
bWRwX2NvbXBhcmVfYncoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig4Mik7
CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1kcFBlcmZTZXRQYW5pY0x1dHNGdHJh
Y2VFdmVudD4gVCogc2V0X21kcF9wZXJmX3NldF9wYW5pY19sdXRzKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oODMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBNZHBTc3BwU2V0RnRyYWNlRXZlbnQ+IFQqIHNldF9tZHBfc3NwcF9zZXQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig4NCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IE1kcENtZFJlYWRwdHJEb25lRnRyYWNlRXZlbnQ+IFQqIHNldF9tZHBfY21kX3JlYWRw
dHJfZG9uZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDg1KTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gTWRwTWlzckNyY0Z0cmFjZUV2ZW50PiBUKiBzZXRf
bWRwX21pc3JfY3JjKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oODYpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNZHBQZXJmU2V0UW9zTHV0c0Z0cmFjZUV2
ZW50PiBUKiBzZXRfbWRwX3BlcmZfc2V0X3Fvc19sdXRzKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oODcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNZHBU
cmFjZUNvdW50ZXJGdHJhY2VFdmVudD4gVCogc2V0X21kcF90cmFjZV9jb3VudGVyKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oODgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBNZHBDbWRSZWxlYXNlQndGdHJhY2VFdmVudD4gVCogc2V0X21kcF9jbWRfcmVs
ZWFzZV9idygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDg5KTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gTWRwTWl4ZXJVcGRhdGVGdHJhY2VFdmVudD4gVCog
c2V0X21kcF9taXhlcl91cGRhdGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
Pig5MCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1kcFBlcmZTZXRXbUxldmVs
c0Z0cmFjZUV2ZW50PiBUKiBzZXRfbWRwX3BlcmZfc2V0X3dtX2xldmVscygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDkxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gTWRwVmlkZW9VbmRlcnJ1bkRvbmVGdHJhY2VFdmVudD4gVCogc2V0X21kcF92aWRlb191
bmRlcnJ1bl9kb25lKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oOTIpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNZHBDbWRXYWl0UGluZ3BvbmdGdHJhY2VF
dmVudD4gVCogc2V0X21kcF9jbWRfd2FpdF9waW5ncG9uZygpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDkzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gTWRw
UGVyZlByZWZpbGxDYWxjRnRyYWNlRXZlbnQ+IFQqIHNldF9tZHBfcGVyZl9wcmVmaWxsX2NhbGMo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig5NCk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IE1kcFBlcmZVcGRhdGVCdXNGdHJhY2VFdmVudD4gVCogc2V0X21k
cF9wZXJmX3VwZGF0ZV9idXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig5
NSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFJvdGF0b3JCd0FvQXNDb250ZXh0
RnRyYWNlRXZlbnQ+IFQqIHNldF9yb3RhdG9yX2J3X2FvX2FzX2NvbnRleHQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig5Nik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IE1tRmlsZW1hcEFkZFRvUGFnZUNhY2hlRnRyYWNlRXZlbnQ+IFQqIHNldF9tbV9maWxl
bWFwX2FkZF90b19wYWdlX2NhY2hlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8
VD4oOTcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNbUZpbGVtYXBEZWxldGVG
cm9tUGFnZUNhY2hlRnRyYWNlRXZlbnQ+IFQqIHNldF9tbV9maWxlbWFwX2RlbGV0ZV9mcm9tX3Bh
Z2VfY2FjaGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig5OCk7CisgIH0K
KworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1tQ29tcGFjdGlvbkJlZ2luRnRyYWNlRXZlbnQ+
IFQqIHNldF9tbV9jb21wYWN0aW9uX2JlZ2luKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oOTkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNbUNvbXBhY3Rp
b25EZWZlckNvbXBhY3Rpb25GdHJhY2VFdmVudD4gVCogc2V0X21tX2NvbXBhY3Rpb25fZGVmZXJf
Y29tcGFjdGlvbigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEwMCk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1tQ29tcGFjdGlvbkRlZmVycmVkRnRyYWNl
RXZlbnQ+IFQqIHNldF9tbV9jb21wYWN0aW9uX2RlZmVycmVkKCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMTAxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
TW1Db21wYWN0aW9uRGVmZXJSZXNldEZ0cmFjZUV2ZW50PiBUKiBzZXRfbW1fY29tcGFjdGlvbl9k
ZWZlcl9yZXNldCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEwMik7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1tQ29tcGFjdGlvbkVuZEZ0cmFjZUV2ZW50
PiBUKiBzZXRfbW1fY29tcGFjdGlvbl9lbmQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVz
c2FnZTxUPigxMDMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNbUNvbXBhY3Rp
b25GaW5pc2hlZEZ0cmFjZUV2ZW50PiBUKiBzZXRfbW1fY29tcGFjdGlvbl9maW5pc2hlZCgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEwNCk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IE1tQ29tcGFjdGlvbklzb2xhdGVGcmVlcGFnZXNGdHJhY2VFdmVudD4g
VCogc2V0X21tX2NvbXBhY3Rpb25faXNvbGF0ZV9mcmVlcGFnZXMoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigxMDUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBNbUNvbXBhY3Rpb25Jc29sYXRlTWlncmF0ZXBhZ2VzRnRyYWNlRXZlbnQ+IFQqIHNldF9tbV9j
b21wYWN0aW9uX2lzb2xhdGVfbWlncmF0ZXBhZ2VzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMTA2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gTW1Db21w
YWN0aW9uS2NvbXBhY3RkU2xlZXBGdHJhY2VFdmVudD4gVCogc2V0X21tX2NvbXBhY3Rpb25fa2Nv
bXBhY3RkX3NsZWVwKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTA3KTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gTW1Db21wYWN0aW9uS2NvbXBhY3RkV2Fr
ZUZ0cmFjZUV2ZW50PiBUKiBzZXRfbW1fY29tcGFjdGlvbl9rY29tcGFjdGRfd2FrZSgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEwOCk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IE1tQ29tcGFjdGlvbk1pZ3JhdGVwYWdlc0Z0cmFjZUV2ZW50PiBUKiBzZXRf
bW1fY29tcGFjdGlvbl9taWdyYXRlcGFnZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVz
c2FnZTxUPigxMDkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNbUNvbXBhY3Rp
b25TdWl0YWJsZUZ0cmFjZUV2ZW50PiBUKiBzZXRfbW1fY29tcGFjdGlvbl9zdWl0YWJsZSgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDExMCk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IE1tQ29tcGFjdGlvblRyeVRvQ29tcGFjdFBhZ2VzRnRyYWNlRXZlbnQ+
IFQqIHNldF9tbV9jb21wYWN0aW9uX3RyeV90b19jb21wYWN0X3BhZ2VzKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTExKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gTW1Db21wYWN0aW9uV2FrZXVwS2NvbXBhY3RkRnRyYWNlRXZlbnQ+IFQqIHNldF9tbV9j
b21wYWN0aW9uX3dha2V1cF9rY29tcGFjdGQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVz
c2FnZTxUPigxMTIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTdXNwZW5kUmVz
dW1lRnRyYWNlRXZlbnQ+IFQqIHNldF9zdXNwZW5kX3Jlc3VtZSgpIHsKKyAgICByZXR1cm4gQmVn
aW5OZXN0ZWRNZXNzYWdlPFQ+KDExMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IFNjaGVkV2FrZXVwTmV3RnRyYWNlRXZlbnQ+IFQqIHNldF9zY2hlZF93YWtldXBfbmV3KCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTE0KTsKKyAgfQorCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gQmxvY2tCaW9CYWNrbWVyZ2VGdHJhY2VFdmVudD4gVCogc2V0X2Jsb2Nr
X2Jpb19iYWNrbWVyZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMTUp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCbG9ja0Jpb0JvdW5jZUZ0cmFjZUV2
ZW50PiBUKiBzZXRfYmxvY2tfYmlvX2JvdW5jZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDExNik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEJsb2NrQmlv
Q29tcGxldGVGdHJhY2VFdmVudD4gVCogc2V0X2Jsb2NrX2Jpb19jb21wbGV0ZSgpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDExNyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IEJsb2NrQmlvRnJvbnRtZXJnZUZ0cmFjZUV2ZW50PiBUKiBzZXRfYmxvY2tfYmlv
X2Zyb250bWVyZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMTgpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCbG9ja0Jpb1F1ZXVlRnRyYWNlRXZlbnQ+
IFQqIHNldF9ibG9ja19iaW9fcXVldWUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigxMTkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCbG9ja0Jpb1JlbWFw
RnRyYWNlRXZlbnQ+IFQqIHNldF9ibG9ja19iaW9fcmVtYXAoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigxMjApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBC
bG9ja0RpcnR5QnVmZmVyRnRyYWNlRXZlbnQ+IFQqIHNldF9ibG9ja19kaXJ0eV9idWZmZXIoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMjEpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBCbG9ja0dldHJxRnRyYWNlRXZlbnQ+IFQqIHNldF9ibG9ja19nZXRy
cSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEyMik7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEJsb2NrUGx1Z0Z0cmFjZUV2ZW50PiBUKiBzZXRfYmxvY2tf
cGx1ZygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEyMyk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEJsb2NrUnFBYm9ydEZ0cmFjZUV2ZW50PiBUKiBzZXRf
YmxvY2tfcnFfYWJvcnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMjQp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCbG9ja1JxQ29tcGxldGVGdHJhY2VF
dmVudD4gVCogc2V0X2Jsb2NrX3JxX2NvbXBsZXRlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMTI1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmxvY2tS
cUluc2VydEZ0cmFjZUV2ZW50PiBUKiBzZXRfYmxvY2tfcnFfaW5zZXJ0KCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTI2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gQmxvY2tScVJlbWFwRnRyYWNlRXZlbnQ+IFQqIHNldF9ibG9ja19ycV9yZW1hcCgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEyOCk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IEJsb2NrUnFSZXF1ZXVlRnRyYWNlRXZlbnQ+IFQqIHNldF9ibG9ja19y
cV9yZXF1ZXVlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTI5KTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmxvY2tTbGVlcHJxRnRyYWNlRXZlbnQ+IFQq
IHNldF9ibG9ja19zbGVlcHJxKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
MTMwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmxvY2tTcGxpdEZ0cmFjZUV2
ZW50PiBUKiBzZXRfYmxvY2tfc3BsaXQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigxMzEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCbG9ja1RvdWNoQnVm
ZmVyRnRyYWNlRXZlbnQ+IFQqIHNldF9ibG9ja190b3VjaF9idWZmZXIoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxMzIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBCbG9ja1VucGx1Z0Z0cmFjZUV2ZW50PiBUKiBzZXRfYmxvY2tfdW5wbHVnKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTMzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gRXh0NEFsbG9jRGFCbG9ja3NGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfYWxs
b2NfZGFfYmxvY2tzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTM0KTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEFsbG9jYXRlQmxvY2tzRnRyYWNl
RXZlbnQ+IFQqIHNldF9leHQ0X2FsbG9jYXRlX2Jsb2NrcygpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDEzNSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4
dDRBbGxvY2F0ZUlub2RlRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2FsbG9jYXRlX2lub2RlKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTM2KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gRXh0NEJlZ2luT3JkZXJlZFRydW5jYXRlRnRyYWNlRXZlbnQ+IFQq
IHNldF9leHQ0X2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPigxMzcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0
Q29sbGFwc2VSYW5nZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9jb2xsYXBzZV9yYW5nZSgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEzOCk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IEV4dDREYVJlbGVhc2VTcGFjZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0
NF9kYV9yZWxlYXNlX3NwYWNlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
MTM5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NERhUmVzZXJ2ZVNwYWNl
RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2RhX3Jlc2VydmVfc3BhY2UoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNDApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBFeHQ0RGFVcGRhdGVSZXNlcnZlU3BhY2VGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZGFf
dXBkYXRlX3Jlc2VydmVfc3BhY2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigxNDEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RGFXcml0ZVBhZ2Vz
RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2RhX3dyaXRlX3BhZ2VzKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTQyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gRXh0NERhV3JpdGVQYWdlc0V4dGVudEZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9kYV93cml0
ZV9wYWdlc19leHRlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNDMp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RGlyZWN0SU9FbnRlckZ0cmFj
ZUV2ZW50PiBUKiBzZXRfZXh0NF9kaXJlY3RfaW9fZW50ZXIoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigxNDQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBF
eHQ0RGlyZWN0SU9FeGl0RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2RpcmVjdF9pb19leGl0KCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTQ1KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gRXh0NERpc2NhcmRCbG9ja3NGdHJhY2VFdmVudD4gVCogc2V0X2V4
dDRfZGlzY2FyZF9ibG9ja3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigx
NDYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RGlzY2FyZFByZWFsbG9j
YXRpb25zRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNDcpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBFeHQ0RHJvcElub2RlRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2Ry
b3BfaW5vZGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNDgpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXNDYWNoZUV4dGVudEZ0cmFjZUV2ZW50
PiBUKiBzZXRfZXh0NF9lc19jYWNoZV9leHRlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigxNDkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXNG
aW5kRGVsYXllZEV4dGVudFJhbmdlRW50ZXJGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXNfZmlu
ZF9kZWxheWVkX2V4dGVudF9yYW5nZV9lbnRlcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDE1MCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRFc0Zp
bmREZWxheWVkRXh0ZW50UmFuZ2VFeGl0RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2VzX2ZpbmRf
ZGVsYXllZF9leHRlbnRfcmFuZ2VfZXhpdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDE1MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRFc0luc2Vy
dEV4dGVudEZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9lc19pbnNlcnRfZXh0ZW50KCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTUyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gRXh0NEVzTG9va3VwRXh0ZW50RW50ZXJGdHJhY2VFdmVudD4gVCogc2V0X2V4
dDRfZXNfbG9va3VwX2V4dGVudF9lbnRlcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDE1Myk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRFc0xvb2t1
cEV4dGVudEV4aXRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXNfbG9va3VwX2V4dGVudF9leGl0
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTU0KTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEVzUmVtb3ZlRXh0ZW50RnRyYWNlRXZlbnQ+IFQqIHNl
dF9leHQ0X2VzX3JlbW92ZV9leHRlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigxNTUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXNTaHJpbmtG
dHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXNfc2hyaW5rKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMTU2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0
NEVzU2hyaW5rQ291bnRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXNfc2hyaW5rX2NvdW50KCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTU3KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gRXh0NEVzU2hyaW5rU2NhbkVudGVyRnRyYWNlRXZlbnQ+IFQqIHNl
dF9leHQ0X2VzX3Nocmlua19zY2FuX2VudGVyKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oMTU4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEVzU2hy
aW5rU2NhbkV4aXRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXNfc2hyaW5rX3NjYW5fZXhpdCgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE1OSk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRFdmljdElub2RlRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0
X2V2aWN0X2lub2RlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTYwKTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEV4dENvbnZlcnRUb0luaXRpYWxp
emVkRW50ZXJGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6
ZWRfZW50ZXIoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNjEpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXh0Q29udmVydFRvSW5pdGlhbGl6ZWRG
YXN0cGF0aEZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXpl
ZF9mYXN0cGF0aCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE2Mik7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRFeHRIYW5kbGVVbndyaXR0ZW5FeHRl
bnRzRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2V4dF9oYW5kbGVfdW53cml0dGVuX2V4dGVudHMo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNjMpOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXh0SW5DYWNoZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0
NF9leHRfaW5fY2FjaGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNjQp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXh0TG9hZEV4dGVudEZ0cmFj
ZUV2ZW50PiBUKiBzZXRfZXh0NF9leHRfbG9hZF9leHRlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigxNjUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBF
eHQ0RXh0TWFwQmxvY2tzRW50ZXJGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXh0X21hcF9ibG9j
a3NfZW50ZXIoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNjYpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXh0TWFwQmxvY2tzRXhpdEZ0cmFjZUV2
ZW50PiBUKiBzZXRfZXh0NF9leHRfbWFwX2Jsb2Nrc19leGl0KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMTY3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
RXh0NEV4dFB1dEluQ2FjaGVGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZXh0X3B1dF9pbl9jYWNo
ZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE2OCk7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRFeHRSZW1vdmVTcGFjZUZ0cmFjZUV2ZW50PiBUKiBz
ZXRfZXh0NF9leHRfcmVtb3ZlX3NwYWNlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMTY5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEV4dFJlbW92
ZVNwYWNlRG9uZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9leHRfcmVtb3ZlX3NwYWNlX2RvbmUo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNzApOworICB9CisKKyAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXh0Um1JZHhGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRf
ZXh0X3JtX2lkeCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE3MSk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRFeHRSbUxlYWZGdHJhY2VFdmVudD4g
VCogc2V0X2V4dDRfZXh0X3JtX2xlYWYoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigxNzIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RXh0U2hvd0V4
dGVudEZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9leHRfc2hvd19leHRlbnQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNzMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBFeHQ0RmFsbG9jYXRlRW50ZXJGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZmFsbG9j
YXRlX2VudGVyKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTc0KTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEZhbGxvY2F0ZUV4aXRGdHJhY2VFdmVu
dD4gVCogc2V0X2V4dDRfZmFsbG9jYXRlX2V4aXQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigxNzUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0Rmlu
ZERlbGFsbG9jUmFuZ2VGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZmluZF9kZWxhbGxvY19yYW5n
ZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE3Nik7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRGb3JnZXRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRf
Zm9yZ2V0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTc3KTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEZyZWVCbG9ja3NGdHJhY2VFdmVudD4gVCog
c2V0X2V4dDRfZnJlZV9ibG9ja3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigxNzgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0RnJlZUlub2RlRnRy
YWNlRXZlbnQ+IFQqIHNldF9leHQ0X2ZyZWVfaW5vZGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPigxNzkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0
R2V0SW1wbGllZENsdXN0ZXJBbGxvY0V4aXRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfZ2V0X2lt
cGxpZWRfY2x1c3Rlcl9hbGxvY19leGl0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMTgwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEdldFJlc2Vy
dmVkQ2x1c3RlckFsbG9jRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2dldF9yZXNlcnZlZF9jbHVz
dGVyX2FsbG9jKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTgxKTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NEluZE1hcEJsb2Nrc0VudGVyRnRyYWNl
RXZlbnQ+IFQqIHNldF9leHQ0X2luZF9tYXBfYmxvY2tzX2VudGVyKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTgyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gRXh0NEluZE1hcEJsb2Nrc0V4aXRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfaW5kX21hcF9i
bG9ja3NfZXhpdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE4Myk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRJbnNlcnRSYW5nZUZ0cmFjZUV2ZW50
PiBUKiBzZXRfZXh0NF9pbnNlcnRfcmFuZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVz
c2FnZTxUPigxODQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0SW52YWxp
ZGF0ZXBhZ2VGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfaW52YWxpZGF0ZXBhZ2UoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxODUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBFeHQ0Sm91cm5hbFN0YXJ0RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X2pvdXJu
YWxfc3RhcnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxODYpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0Sm91cm5hbFN0YXJ0UmVzZXJ2ZWRGdHJh
Y2VFdmVudD4gVCogc2V0X2V4dDRfam91cm5hbF9zdGFydF9yZXNlcnZlZCgpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE4Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IEV4dDRKb3VybmFsbGVkSW52YWxpZGF0ZXBhZ2VGdHJhY2VFdmVudD4gVCogc2V0X2V4
dDRfam91cm5hbGxlZF9pbnZhbGlkYXRlcGFnZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDE4OCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRKb3Vy
bmFsbGVkV3JpdGVFbmRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfam91cm5hbGxlZF93cml0ZV9l
bmQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxODkpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0TG9hZElub2RlRnRyYWNlRXZlbnQ+IFQqIHNldF9l
eHQ0X2xvYWRfaW5vZGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxOTAp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0TG9hZElub2RlQml0bWFwRnRy
YWNlRXZlbnQ+IFQqIHNldF9leHQ0X2xvYWRfaW5vZGVfYml0bWFwKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTkxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gRXh0NE1hcmtJbm9kZURpcnR5RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X21hcmtfaW5vZGVf
ZGlydHkoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxOTIpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0TWJCaXRtYXBMb2FkRnRyYWNlRXZlbnQ+IFQq
IHNldF9leHQ0X21iX2JpdG1hcF9sb2FkKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMTkzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NE1iQnVkZHlC
aXRtYXBMb2FkRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X21iX2J1ZGR5X2JpdG1hcF9sb2FkKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTk0KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gRXh0NE1iRGlzY2FyZFByZWFsbG9jYXRpb25zRnRyYWNlRXZlbnQ+
IFQqIHNldF9leHQ0X21iX2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigxOTUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBFeHQ0TWJOZXdHcm91cFBhRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X21iX25ld19ncm91cF9w
YSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE5Nik7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRNYk5ld0lub2RlUGFGdHJhY2VFdmVudD4gVCogc2V0
X2V4dDRfbWJfbmV3X2lub2RlX3BhKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8
VD4oMTk3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NE1iUmVsZWFzZUdy
b3VwUGFGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfbWJfcmVsZWFzZV9ncm91cF9wYSgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE5OCk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IEV4dDRNYlJlbGVhc2VJbm9kZVBhRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0
X21iX3JlbGVhc2VfaW5vZGVfcGEoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigxOTkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0TWJhbGxvY0FsbG9j
RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X21iYWxsb2NfYWxsb2MoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigyMDApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBFeHQ0TWJhbGxvY0Rpc2NhcmRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfbWJhbGxvY19kaXNj
YXJkKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjAxKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NE1iYWxsb2NGcmVlRnRyYWNlRXZlbnQ+IFQqIHNl
dF9leHQ0X21iYWxsb2NfZnJlZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDIwMik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRNYmFsbG9jUHJlYWxs
b2NGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfbWJhbGxvY19wcmVhbGxvYygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIwMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IEV4dDRPdGhlcklub2RlVXBkYXRlVGltZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF9v
dGhlcl9pbm9kZV91cGRhdGVfdGltZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDIwNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRQdW5jaEhvbGVG
dHJhY2VFdmVudD4gVCogc2V0X2V4dDRfcHVuY2hfaG9sZSgpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDIwNSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4
dDRSZWFkQmxvY2tCaXRtYXBMb2FkRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X3JlYWRfYmxvY2tf
Yml0bWFwX2xvYWQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMDYpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0UmVhZHBhZ2VGdHJhY2VFdmVudD4g
VCogc2V0X2V4dDRfcmVhZHBhZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigyMDcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0UmVsZWFzZXBhZ2VG
dHJhY2VFdmVudD4gVCogc2V0X2V4dDRfcmVsZWFzZXBhZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigyMDgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBF
eHQ0UmVtb3ZlQmxvY2tzRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X3JlbW92ZV9ibG9ja3MoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMDkpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBFeHQ0UmVxdWVzdEJsb2Nrc0Z0cmFjZUV2ZW50PiBUKiBzZXRfZXh0
NF9yZXF1ZXN0X2Jsb2NrcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIx
MCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRSZXF1ZXN0SW5vZGVGdHJh
Y2VFdmVudD4gVCogc2V0X2V4dDRfcmVxdWVzdF9pbm9kZSgpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDIxMSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4
dDRTeW5jRnNGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfc3luY19mcygpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIxMik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IEV4dDRUcmltQWxsRnJlZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF90cmltX2FsbF9mcmVl
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjEzKTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NFRyaW1FeHRlbnRGdHJhY2VFdmVudD4gVCogc2V0X2V4
dDRfdHJpbV9leHRlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMTQp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0VHJ1bmNhdGVFbnRlckZ0cmFj
ZUV2ZW50PiBUKiBzZXRfZXh0NF90cnVuY2F0ZV9lbnRlcigpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDIxNSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4
dDRUcnVuY2F0ZUV4aXRGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfdHJ1bmNhdGVfZXhpdCgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIxNik7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IEV4dDRVbmxpbmtFbnRlckZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF91
bmxpbmtfZW50ZXIoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMTcpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBFeHQ0VW5saW5rRXhpdEZ0cmFjZUV2ZW50
PiBUKiBzZXRfZXh0NF91bmxpbmtfZXhpdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDIxOCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRXcml0ZUJl
Z2luRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X3dyaXRlX2JlZ2luKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjE5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gRXh0NFdyaXRlRW5kRnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X3dyaXRlX2VuZCgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIzMCk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IEV4dDRXcml0ZXBhZ2VGdHJhY2VFdmVudD4gVCogc2V0X2V4dDRfd3JpdGVw
YWdlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjMxKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRXh0NFdyaXRlcGFnZXNGdHJhY2VFdmVudD4gVCogc2V0
X2V4dDRfd3JpdGVwYWdlcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIz
Mik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEV4dDRXcml0ZXBhZ2VzUmVzdWx0
RnRyYWNlRXZlbnQ+IFQqIHNldF9leHQ0X3dyaXRlcGFnZXNfcmVzdWx0KCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjMzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gRXh0NFplcm9SYW5nZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZXh0NF96ZXJvX3JhbmdlKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjM0KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gVGFza05ld3Rhc2tGdHJhY2VFdmVudD4gVCogc2V0X3Rhc2tfbmV3
dGFzaygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIzNSk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRhc2tSZW5hbWVGdHJhY2VFdmVudD4gVCogc2V0X3Rh
c2tfcmVuYW1lKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjM2KTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU2NoZWRQcm9jZXNzRXhlY0Z0cmFjZUV2ZW50
PiBUKiBzZXRfc2NoZWRfcHJvY2Vzc19leGVjKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oMjM3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU2NoZWRQcm9j
ZXNzRXhpdEZ0cmFjZUV2ZW50PiBUKiBzZXRfc2NoZWRfcHJvY2Vzc19leGl0KCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjM4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gU2NoZWRQcm9jZXNzRm9ya0Z0cmFjZUV2ZW50PiBUKiBzZXRfc2NoZWRfcHJvY2Vz
c19mb3JrKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjM5KTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU2NoZWRQcm9jZXNzRnJlZUZ0cmFjZUV2ZW50PiBU
KiBzZXRfc2NoZWRfcHJvY2Vzc19mcmVlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMjQwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU2NoZWRQcm9jZXNz
SGFuZ0Z0cmFjZUV2ZW50PiBUKiBzZXRfc2NoZWRfcHJvY2Vzc19oYW5nKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjQxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gU2NoZWRQcm9jZXNzV2FpdEZ0cmFjZUV2ZW50PiBUKiBzZXRfc2NoZWRfcHJvY2Vzc193
YWl0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjQyKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRjJmc0RvU3VibWl0QmlvRnRyYWNlRXZlbnQ+IFQqIHNl
dF9mMmZzX2RvX3N1Ym1pdF9iaW8oKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigyNDMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGMmZzRXZpY3RJbm9kZUZ0
cmFjZUV2ZW50PiBUKiBzZXRfZjJmc19ldmljdF9pbm9kZSgpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDI0NCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEYy
ZnNGYWxsb2NhdGVGdHJhY2VFdmVudD4gVCogc2V0X2YyZnNfZmFsbG9jYXRlKCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjQ1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gRjJmc0dldERhdGFCbG9ja0Z0cmFjZUV2ZW50PiBUKiBzZXRfZjJmc19nZXRfZGF0
YV9ibG9jaygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI0Nik7CisgIH0K
KworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEYyZnNHZXRWaWN0aW1GdHJhY2VFdmVudD4gVCog
c2V0X2YyZnNfZ2V0X3ZpY3RpbSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDI0Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEYyZnNJZ2V0RnRyYWNlRXZl
bnQ+IFQqIHNldF9mMmZzX2lnZXQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigyNDgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGMmZzSWdldEV4aXRGdHJh
Y2VFdmVudD4gVCogc2V0X2YyZnNfaWdldF9leGl0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMjQ5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRjJmc05l
d0lub2RlRnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX25ld19pbm9kZSgpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI1MCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IEYyZnNSZWFkcGFnZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZjJmc19yZWFkcGFnZSgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI1MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IEYyZnNSZXNlcnZlTmV3QmxvY2tGdHJhY2VFdmVudD4gVCogc2V0X2YyZnNf
cmVzZXJ2ZV9uZXdfYmxvY2soKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigy
NTIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGMmZzU2V0UGFnZURpcnR5RnRy
YWNlRXZlbnQ+IFQqIHNldF9mMmZzX3NldF9wYWdlX2RpcnR5KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMjUzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
RjJmc1N1Ym1pdFdyaXRlUGFnZUZ0cmFjZUV2ZW50PiBUKiBzZXRfZjJmc19zdWJtaXRfd3JpdGVf
cGFnZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI1NCk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEYyZnNTeW5jRmlsZUVudGVyRnRyYWNlRXZlbnQ+IFQq
IHNldF9mMmZzX3N5bmNfZmlsZV9lbnRlcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDI1NSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEYyZnNTeW5jRmls
ZUV4aXRGdHJhY2VFdmVudD4gVCogc2V0X2YyZnNfc3luY19maWxlX2V4aXQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNTYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBGMmZzU3luY0ZzRnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX3N5bmNfZnMoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNTcpOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBGMmZzVHJ1bmNhdGVGdHJhY2VFdmVudD4gVCogc2V0X2YyZnNfdHJ1bmNh
dGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNTgpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGMmZzVHJ1bmNhdGVCbG9ja3NFbnRlckZ0cmFjZUV2ZW50
PiBUKiBzZXRfZjJmc190cnVuY2F0ZV9ibG9ja3NfZW50ZXIoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigyNTkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBG
MmZzVHJ1bmNhdGVCbG9ja3NFeGl0RnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX3RydW5jYXRlX2Js
b2Nrc19leGl0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjYwKTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRjJmc1RydW5jYXRlRGF0YUJsb2Nrc1Jhbmdl
RnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX3RydW5jYXRlX2RhdGFfYmxvY2tzX3JhbmdlKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjYxKTsKKyAgfQorCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gRjJmc1RydW5jYXRlSW5vZGVCbG9ja3NFbnRlckZ0cmFjZUV2ZW50PiBU
KiBzZXRfZjJmc190cnVuY2F0ZV9pbm9kZV9ibG9ja3NfZW50ZXIoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigyNjIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBGMmZzVHJ1bmNhdGVJbm9kZUJsb2Nrc0V4aXRGdHJhY2VFdmVudD4gVCogc2V0X2YyZnNfdHJ1
bmNhdGVfaW5vZGVfYmxvY2tzX2V4aXQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigyNjMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGMmZzVHJ1bmNhdGVO
b2RlRnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX3RydW5jYXRlX25vZGUoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNjQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBGMmZzVHJ1bmNhdGVOb2Rlc0VudGVyRnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX3RydW5j
YXRlX25vZGVzX2VudGVyKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjY1
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRjJmc1RydW5jYXRlTm9kZXNFeGl0
RnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX3RydW5jYXRlX25vZGVzX2V4aXQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNjYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBGMmZzVHJ1bmNhdGVQYXJ0aWFsTm9kZXNGdHJhY2VFdmVudD4gVCogc2V0X2YyZnNf
dHJ1bmNhdGVfcGFydGlhbF9ub2RlcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDI2Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEYyZnNVbmxpbmtFbnRl
ckZ0cmFjZUV2ZW50PiBUKiBzZXRfZjJmc191bmxpbmtfZW50ZXIoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigyNjgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBGMmZzVW5saW5rRXhpdEZ0cmFjZUV2ZW50PiBUKiBzZXRfZjJmc191bmxpbmtfZXhpdCgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI2OSk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IEYyZnNWbVBhZ2VNa3dyaXRlRnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZz
X3ZtX3BhZ2VfbWt3cml0ZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI3
MCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEYyZnNXcml0ZUJlZ2luRnRyYWNl
RXZlbnQ+IFQqIHNldF9mMmZzX3dyaXRlX2JlZ2luKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMjcxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRjJmc1dy
aXRlQ2hlY2twb2ludEZ0cmFjZUV2ZW50PiBUKiBzZXRfZjJmc193cml0ZV9jaGVja3BvaW50KCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjcyKTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gRjJmc1dyaXRlRW5kRnRyYWNlRXZlbnQ+IFQqIHNldF9mMmZzX3dy
aXRlX2VuZCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI3Myk7CisgIH0K
KworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEFsbG9jUGFnZXNJb21tdUVuZEZ0cmFjZUV2ZW50
PiBUKiBzZXRfYWxsb2NfcGFnZXNfaW9tbXVfZW5kKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMjc0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQWxsb2NQ
YWdlc0lvbW11RmFpbEZ0cmFjZUV2ZW50PiBUKiBzZXRfYWxsb2NfcGFnZXNfaW9tbXVfZmFpbCgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI3NSk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IEFsbG9jUGFnZXNJb21tdVN0YXJ0RnRyYWNlRXZlbnQ+IFQqIHNl
dF9hbGxvY19wYWdlc19pb21tdV9zdGFydCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDI3Nik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEFsbG9jUGFnZXNT
eXNFbmRGdHJhY2VFdmVudD4gVCogc2V0X2FsbG9jX3BhZ2VzX3N5c19lbmQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNzcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBBbGxvY1BhZ2VzU3lzRmFpbEZ0cmFjZUV2ZW50PiBUKiBzZXRfYWxsb2NfcGFnZXNf
c3lzX2ZhaWwoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNzgpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBBbGxvY1BhZ2VzU3lzU3RhcnRGdHJhY2VFdmVu
dD4gVCogc2V0X2FsbG9jX3BhZ2VzX3N5c19zdGFydCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDI3OSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERtYUFs
bG9jQ29udGlndW91c1JldHJ5RnRyYWNlRXZlbnQ+IFQqIHNldF9kbWFfYWxsb2NfY29udGlndW91
c19yZXRyeSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI4MCk7CisgIH0K
KworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElvbW11TWFwUmFuZ2VGdHJhY2VFdmVudD4gVCog
c2V0X2lvbW11X21hcF9yYW5nZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDI4MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElvbW11U2VjUHRibE1hcFJh
bmdlRW5kRnRyYWNlRXZlbnQ+IFQqIHNldF9pb21tdV9zZWNfcHRibF9tYXBfcmFuZ2VfZW5kKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjgyKTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gSW9tbXVTZWNQdGJsTWFwUmFuZ2VTdGFydEZ0cmFjZUV2ZW50PiBU
KiBzZXRfaW9tbXVfc2VjX3B0YmxfbWFwX3JhbmdlX3N0YXJ0KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMjgzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
SW9uQWxsb2NCdWZmZXJFbmRGdHJhY2VFdmVudD4gVCogc2V0X2lvbl9hbGxvY19idWZmZXJfZW5k
KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjg0KTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gSW9uQWxsb2NCdWZmZXJGYWlsRnRyYWNlRXZlbnQ+IFQqIHNl
dF9pb25fYWxsb2NfYnVmZmVyX2ZhaWwoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigyODUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJb25BbGxvY0J1ZmZl
ckZhbGxiYWNrRnRyYWNlRXZlbnQ+IFQqIHNldF9pb25fYWxsb2NfYnVmZmVyX2ZhbGxiYWNrKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjg2KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gSW9uQWxsb2NCdWZmZXJTdGFydEZ0cmFjZUV2ZW50PiBUKiBzZXRf
aW9uX2FsbG9jX2J1ZmZlcl9zdGFydCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDI4Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElvbkNwQWxsb2NSZXRy
eUZ0cmFjZUV2ZW50PiBUKiBzZXRfaW9uX2NwX2FsbG9jX3JldHJ5KCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjg4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gSW9uQ3BTZWN1cmVCdWZmZXJFbmRGdHJhY2VFdmVudD4gVCogc2V0X2lvbl9jcF9zZWN1cmVf
YnVmZmVyX2VuZCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI4OSk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElvbkNwU2VjdXJlQnVmZmVyU3RhcnRGdHJh
Y2VFdmVudD4gVCogc2V0X2lvbl9jcF9zZWN1cmVfYnVmZmVyX3N0YXJ0KCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjkwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gSW9uUHJlZmV0Y2hpbmdGdHJhY2VFdmVudD4gVCogc2V0X2lvbl9wcmVmZXRjaGluZygp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI5MSk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IElvblNlY3VyZUNtYUFkZFRvUG9vbEVuZEZ0cmFjZUV2ZW50PiBU
KiBzZXRfaW9uX3NlY3VyZV9jbWFfYWRkX3RvX3Bvb2xfZW5kKCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMjkyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
SW9uU2VjdXJlQ21hQWRkVG9Qb29sU3RhcnRGdHJhY2VFdmVudD4gVCogc2V0X2lvbl9zZWN1cmVf
Y21hX2FkZF90b19wb29sX3N0YXJ0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8
VD4oMjkzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW9uU2VjdXJlQ21hQWxs
b2NhdGVFbmRGdHJhY2VFdmVudD4gVCogc2V0X2lvbl9zZWN1cmVfY21hX2FsbG9jYXRlX2VuZCgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI5NCk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IElvblNlY3VyZUNtYUFsbG9jYXRlU3RhcnRGdHJhY2VFdmVudD4g
VCogc2V0X2lvbl9zZWN1cmVfY21hX2FsbG9jYXRlX3N0YXJ0KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMjk1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
SW9uU2VjdXJlQ21hU2hyaW5rUG9vbEVuZEZ0cmFjZUV2ZW50PiBUKiBzZXRfaW9uX3NlY3VyZV9j
bWFfc2hyaW5rX3Bvb2xfZW5kKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
Mjk2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW9uU2VjdXJlQ21hU2hyaW5r
UG9vbFN0YXJ0RnRyYWNlRXZlbnQ+IFQqIHNldF9pb25fc2VjdXJlX2NtYV9zaHJpbmtfcG9vbF9z
dGFydCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI5Nyk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEtmcmVlRnRyYWNlRXZlbnQ+IFQqIHNldF9rZnJlZSgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI5OCk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IEttYWxsb2NGdHJhY2VFdmVudD4gVCogc2V0X2ttYWxsb2MoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyOTkpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBLbWFsbG9jTm9kZUZ0cmFjZUV2ZW50PiBUKiBzZXRfa21hbGxvY19u
b2RlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzAwKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gS21lbUNhY2hlQWxsb2NGdHJhY2VFdmVudD4gVCogc2V0
X2ttZW1fY2FjaGVfYWxsb2MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigz
MDEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBLbWVtQ2FjaGVBbGxvY05vZGVG
dHJhY2VFdmVudD4gVCogc2V0X2ttZW1fY2FjaGVfYWxsb2Nfbm9kZSgpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMwMik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IEttZW1DYWNoZUZyZWVGdHJhY2VFdmVudD4gVCogc2V0X2ttZW1fY2FjaGVfZnJlZSgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMwMyk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IE1pZ3JhdGVQYWdlc0VuZEZ0cmFjZUV2ZW50PiBUKiBzZXRfbWlncmF0
ZV9wYWdlc19lbmQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMDQpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNaWdyYXRlUGFnZXNTdGFydEZ0cmFjZUV2
ZW50PiBUKiBzZXRfbWlncmF0ZV9wYWdlc19zdGFydCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDMwNSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1pZ3Jh
dGVSZXRyeUZ0cmFjZUV2ZW50PiBUKiBzZXRfbWlncmF0ZV9yZXRyeSgpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMwNik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IE1tUGFnZUFsbG9jRnRyYWNlRXZlbnQ+IFQqIHNldF9tbV9wYWdlX2FsbG9jKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzA3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gTW1QYWdlQWxsb2NFeHRmcmFnRnRyYWNlRXZlbnQ+IFQqIHNldF9tbV9wYWdl
X2FsbG9jX2V4dGZyYWcoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMDgp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNbVBhZ2VBbGxvY1pvbmVMb2NrZWRG
dHJhY2VFdmVudD4gVCogc2V0X21tX3BhZ2VfYWxsb2Nfem9uZV9sb2NrZWQoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMDkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBNbVBhZ2VGcmVlRnRyYWNlRXZlbnQ+IFQqIHNldF9tbV9wYWdlX2ZyZWUoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMTApOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBNbVBhZ2VGcmVlQmF0Y2hlZEZ0cmFjZUV2ZW50PiBUKiBzZXRfbW1fcGFn
ZV9mcmVlX2JhdGNoZWQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMTEp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNbVBhZ2VQY3B1RHJhaW5GdHJhY2VF
dmVudD4gVCogc2V0X21tX3BhZ2VfcGNwdV9kcmFpbigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0
ZWRNZXNzYWdlPFQ+KDMxMik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFJzc1N0
YXRGdHJhY2VFdmVudD4gVCogc2V0X3Jzc19zdGF0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMzEzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW9uSGVh
cFNocmlua0Z0cmFjZUV2ZW50PiBUKiBzZXRfaW9uX2hlYXBfc2hyaW5rKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzE0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gSW9uSGVhcEdyb3dGdHJhY2VFdmVudD4gVCogc2V0X2lvbl9oZWFwX2dyb3coKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMTUpOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBGZW5jZUluaXRGdHJhY2VFdmVudD4gVCogc2V0X2ZlbmNlX2luaXQoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMTYpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBGZW5jZURlc3Ryb3lGdHJhY2VFdmVudD4gVCogc2V0X2ZlbmNlX2Rl
c3Ryb3koKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMTcpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGZW5jZUVuYWJsZVNpZ25hbEZ0cmFjZUV2ZW50PiBU
KiBzZXRfZmVuY2VfZW5hYmxlX3NpZ25hbCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDMxOCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEZlbmNlU2lnbmFs
ZWRGdHJhY2VFdmVudD4gVCogc2V0X2ZlbmNlX3NpZ25hbGVkKCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMzE5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
Q2xrRW5hYmxlRnRyYWNlRXZlbnQ+IFQqIHNldF9jbGtfZW5hYmxlKCkgeworICAgIHJldHVybiBC
ZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzIwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gQ2xrRGlzYWJsZUZ0cmFjZUV2ZW50PiBUKiBzZXRfY2xrX2Rpc2FibGUoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMjEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBDbGtTZXRSYXRlRnRyYWNlRXZlbnQ+IFQqIHNldF9jbGtfc2V0X3JhdGUoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMjIpOworICB9CisKKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBCaW5kZXJUcmFuc2FjdGlvbkFsbG9jQnVmRnRyYWNlRXZlbnQ+IFQqIHNl
dF9iaW5kZXJfdHJhbnNhY3Rpb25fYWxsb2NfYnVmKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMzIzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU2lnbmFs
RGVsaXZlckZ0cmFjZUV2ZW50PiBUKiBzZXRfc2lnbmFsX2RlbGl2ZXIoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMjQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBTaWduYWxHZW5lcmF0ZUZ0cmFjZUV2ZW50PiBUKiBzZXRfc2lnbmFsX2dlbmVyYXRlKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzI1KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gT29tU2NvcmVBZGpVcGRhdGVGdHJhY2VFdmVudD4gVCogc2V0X29v
bV9zY29yZV9hZGpfdXBkYXRlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
MzI2KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR2VuZXJpY0Z0cmFjZUV2ZW50
PiBUKiBzZXRfZ2VuZXJpYygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMy
Nyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE1tRXZlbnRSZWNvcmRGdHJhY2VF
dmVudD4gVCogc2V0X21tX2V2ZW50X3JlY29yZCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDMyOCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFN5c0VudGVy
RnRyYWNlRXZlbnQ+IFQqIHNldF9zeXNfZW50ZXIoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigzMjkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTeXNFeGl0
RnRyYWNlRXZlbnQ+IFQqIHNldF9zeXNfZXhpdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDMzMCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFplcm9GdHJh
Y2VFdmVudD4gVCogc2V0X3plcm8oKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxU
PigzMzEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBHcHVGcmVxdWVuY3lGdHJh
Y2VFdmVudD4gVCogc2V0X2dwdV9mcmVxdWVuY3koKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigzMzIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTZGVUcmFj
aW5nTWFya1dyaXRlRnRyYWNlRXZlbnQ+IFQqIHNldF9zZGVfdHJhY2luZ19tYXJrX3dyaXRlKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzMzKTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gTWFya1ZpY3RpbUZ0cmFjZUV2ZW50PiBUKiBzZXRfbWFya192aWN0
aW0oKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzMzQpOworICB9CisKKyAg
dGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJb25TdGF0RnRyYWNlRXZlbnQ+IFQqIHNldF9pb25fc3Rh
dCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMzNSk7CisgIH0KKworICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElvbkJ1ZmZlckNyZWF0ZUZ0cmFjZUV2ZW50PiBUKiBzZXRf
aW9uX2J1ZmZlcl9jcmVhdGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigz
MzYpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJb25CdWZmZXJEZXN0cm95RnRy
YWNlRXZlbnQ+IFQqIHNldF9pb25fYnVmZmVyX2Rlc3Ryb3koKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigzMzcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBT
Y21DYWxsU3RhcnRGdHJhY2VFdmVudD4gVCogc2V0X3NjbV9jYWxsX3N0YXJ0KCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzM4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gU2NtQ2FsbEVuZEZ0cmFjZUV2ZW50PiBUKiBzZXRfc2NtX2NhbGxfZW5kKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMzM5KTsKKyAgfQorCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gR3B1TWVtVG90YWxGdHJhY2VFdmVudD4gVCogc2V0X2dwdV9tZW1fdG90
YWwoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzNDApOworICB9CisKK307
CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNl
bmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6
IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2Z0cmFjZV9ldmVudF9idW5kbGUucGJ6
ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4u
IERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
VFJBQ0VfRlRSQUNFX0ZUUkFDRV9FVkVOVF9CVU5ETEVfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVU
VE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfRlRSQUNFX0VWRU5UX0JVTkRM
RV9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIu
aCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3Rv
emVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHBy
b3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgRnRyYWNlRXZlbnQ7CitjbGFzcyBG
dHJhY2VFdmVudEJ1bmRsZV9Db21wYWN0U2NoZWQ7CisKK2NsYXNzIEZ0cmFjZUV2ZW50QnVuZGxl
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBw
dWJsaWM6CisgIEZ0cmFjZUV2ZW50QnVuZGxlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEZ0cmFjZUV2ZW50QnVuZGxlX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRnRyYWNlRXZlbnRCdW5kbGVfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfY3B1KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNwdSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
YXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3Rv
emVybzo6Q29uc3RCeXRlcz4gZXZlbnQoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnBy
b3RvemVybzo6Q29uc3RCeXRlcz4oMik7IH0KKyAgYm9vbCBoYXNfbG9zdF9ldmVudHMoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBsb3N0X2V2ZW50cygpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2NvbXBhY3Rfc2NoZWQo
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMgY29tcGFjdF9zY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfYnl0ZXMoKTsg
fQorfTsKKworY2xhc3MgRnRyYWNlRXZlbnRCdW5kbGUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEZ0cmFjZUV2ZW50QnVuZGxlX0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ3B1RmllbGROdW1iZXIgPSAxLAorICAg
IGtFdmVudEZpZWxkTnVtYmVyID0gMiwKKyAgICBrTG9zdEV2ZW50c0ZpZWxkTnVtYmVyID0gMywK
KyAgICBrQ29tcGFjdFNjaGVkRmllbGROdW1iZXIgPSA0LAorICB9OworICB1c2luZyBDb21wYWN0
U2NoZWQgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6RnRyYWNlRXZlbnRCdW5kbGVfQ29t
cGFjdFNjaGVkOworICB2b2lkIHNldF9jcHUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMSwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRnRyYWNlRXZl
bnQ+IFQqIGFkZF9ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIp
OworICB9CisKKyAgdm9pZCBzZXRfbG9zdF9ldmVudHMoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVu
ZFRpbnlWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRnRy
YWNlRXZlbnRCdW5kbGVfQ29tcGFjdFNjaGVkPiBUKiBzZXRfY29tcGFjdF9zY2hlZCgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQpOworICB9CisKK307CisKK2NsYXNzIEZ0
cmFjZUV2ZW50QnVuZGxlX0NvbXBhY3RTY2hlZF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzExLCAvKkhBU19OT05QQUNLRURf
UkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgRnRyYWNlRXZlbnRCdW5kbGVf
Q29tcGFjdFNjaGVkX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEZ0cmFjZUV2ZW50QnVu
ZGxlX0NvbXBhY3RTY2hlZF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEZ0cmFjZUV2ZW50QnVuZGxlX0NvbXBhY3RTY2hl
ZF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19pbnRlcm5fdGFibGUo
KSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gaW50ZXJuX3RhYmxlKCkg
Y29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+KDUpOyB9
CisgIGJvb2wgaGFzX3N3aXRjaF90aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlBhY2tlZFJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnBy
b3RvemVybzo6cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQsIHVpbnQ2NF90PiBz
d2l0Y2hfdGltZXN0YW1wKGJvb2wqIHBhcnNlX2Vycm9yX3B0cikgY29uc3QgeyByZXR1cm4gR2V0
UGFja2VkUmVwZWF0ZWQ8Ojpwcm90b3plcm86OnByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjpr
VmFySW50LCB1aW50NjRfdD4oMSwgcGFyc2VfZXJyb3JfcHRyKTsgfQorICBib29sIGhhc19zd2l0
Y2hfcHJldl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6UGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpwcm90b191
dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCwgaW50NjRfdD4gc3dpdGNoX3ByZXZfc3RhdGUo
Ym9vbCogcGFyc2VfZXJyb3JfcHRyKSBjb25zdCB7IHJldHVybiBHZXRQYWNrZWRSZXBlYXRlZDw6
OnByb3RvemVybzo6cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQsIGludDY0X3Q+
KDIsIHBhcnNlX2Vycm9yX3B0cik7IH0KKyAgYm9vbCBoYXNfc3dpdGNoX25leHRfcGlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpQYWNrZWRSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OnByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBl
OjprVmFySW50LCBpbnQzMl90PiBzd2l0Y2hfbmV4dF9waWQoYm9vbCogcGFyc2VfZXJyb3JfcHRy
KSBjb25zdCB7IHJldHVybiBHZXRQYWNrZWRSZXBlYXRlZDw6OnByb3RvemVybzo6cHJvdG9fdXRp
bHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQsIGludDMyX3Q+KDMsIHBhcnNlX2Vycm9yX3B0cik7
IH0KKyAgYm9vbCBoYXNfc3dpdGNoX25leHRfcHJpbygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6
cHJvdG96ZXJvOjpwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCwgaW50MzJfdD4g
c3dpdGNoX25leHRfcHJpbyhib29sKiBwYXJzZV9lcnJvcl9wdHIpIGNvbnN0IHsgcmV0dXJuIEdl
dFBhY2tlZFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6
a1ZhckludCwgaW50MzJfdD4oNCwgcGFyc2VfZXJyb3JfcHRyKTsgfQorICBib29sIGhhc19zd2l0
Y2hfbmV4dF9jb21tX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OnBy
b3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50LCB1aW50MzJfdD4gc3dpdGNoX25leHRf
Y29tbV9pbmRleChib29sKiBwYXJzZV9lcnJvcl9wdHIpIGNvbnN0IHsgcmV0dXJuIEdldFBhY2tl
ZFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1Zhcklu
dCwgdWludDMyX3Q+KDYsIHBhcnNlX2Vycm9yX3B0cik7IH0KKyAgYm9vbCBoYXNfd2FraW5nX3Rp
bWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6UGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpwcm90b191dGlsczo6
UHJvdG9XaXJlVHlwZTo6a1ZhckludCwgdWludDY0X3Q+IHdha2luZ190aW1lc3RhbXAoYm9vbCog
cGFyc2VfZXJyb3JfcHRyKSBjb25zdCB7IHJldHVybiBHZXRQYWNrZWRSZXBlYXRlZDw6OnByb3Rv
emVybzo6cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQsIHVpbnQ2NF90Pig3LCBw
YXJzZV9lcnJvcl9wdHIpOyB9CisgIGJvb2wgaGFzX3dha2luZ19waWQoKSBjb25zdCB7IHJldHVy
biBhdDw4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlBhY2tlZFJlcGVhdGVkRmllbGRJ
dGVyYXRvcjw6OnByb3RvemVybzo6cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQs
IGludDMyX3Q+IHdha2luZ19waWQoYm9vbCogcGFyc2VfZXJyb3JfcHRyKSBjb25zdCB7IHJldHVy
biBHZXRQYWNrZWRSZXBlYXRlZDw6OnByb3RvemVybzo6cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5
cGU6OmtWYXJJbnQsIGludDMyX3Q+KDgsIHBhcnNlX2Vycm9yX3B0cik7IH0KKyAgYm9vbCBoYXNf
d2FraW5nX3RhcmdldF9jcHUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlBhY2tlZFJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6cHJv
dG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQsIGludDMyX3Q+IHdha2luZ190YXJnZXRf
Y3B1KGJvb2wqIHBhcnNlX2Vycm9yX3B0cikgY29uc3QgeyByZXR1cm4gR2V0UGFja2VkUmVwZWF0
ZWQ8Ojpwcm90b3plcm86OnByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50LCBpbnQz
Ml90Pig5LCBwYXJzZV9lcnJvcl9wdHIpOyB9CisgIGJvb2wgaGFzX3dha2luZ19wcmlvKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UGFja2VkUmVw
ZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpwcm90b191dGlsczo6UHJvdG9XaXJlVHlw
ZTo6a1ZhckludCwgaW50MzJfdD4gd2FraW5nX3ByaW8oYm9vbCogcGFyc2VfZXJyb3JfcHRyKSBj
b25zdCB7IHJldHVybiBHZXRQYWNrZWRSZXBlYXRlZDw6OnByb3RvemVybzo6cHJvdG9fdXRpbHM6
OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQsIGludDMyX3Q+KDEwLCBwYXJzZV9lcnJvcl9wdHIpOyB9
CisgIGJvb2wgaGFzX3dha2luZ19jb21tX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6
cHJvdG96ZXJvOjpwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCwgdWludDMyX3Q+
IHdha2luZ19jb21tX2luZGV4KGJvb2wqIHBhcnNlX2Vycm9yX3B0cikgY29uc3QgeyByZXR1cm4g
R2V0UGFja2VkUmVwZWF0ZWQ8Ojpwcm90b3plcm86OnByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBl
OjprVmFySW50LCB1aW50MzJfdD4oMTEsIHBhcnNlX2Vycm9yX3B0cik7IH0KK307CisKK2NsYXNz
IEZ0cmFjZUV2ZW50QnVuZGxlX0NvbXBhY3RTY2hlZCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRnRyYWNlRXZlbnRCdW5kbGVfQ29t
cGFjdFNjaGVkX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrSW50ZXJuVGFibGVG
aWVsZE51bWJlciA9IDUsCisgICAga1N3aXRjaFRpbWVzdGFtcEZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrU3dpdGNoUHJldlN0YXRlRmllbGROdW1iZXIgPSAyLAorICAgIGtTd2l0Y2hOZXh0UGlkRmll
bGROdW1iZXIgPSAzLAorICAgIGtTd2l0Y2hOZXh0UHJpb0ZpZWxkTnVtYmVyID0gNCwKKyAgICBr
U3dpdGNoTmV4dENvbW1JbmRleEZpZWxkTnVtYmVyID0gNiwKKyAgICBrV2FraW5nVGltZXN0YW1w
RmllbGROdW1iZXIgPSA3LAorICAgIGtXYWtpbmdQaWRGaWVsZE51bWJlciA9IDgsCisgICAga1dh
a2luZ1RhcmdldENwdUZpZWxkTnVtYmVyID0gOSwKKyAgICBrV2FraW5nUHJpb0ZpZWxkTnVtYmVy
ID0gMTAsCisgICAga1dha2luZ0NvbW1JbmRleEZpZWxkTnVtYmVyID0gMTEsCisgIH07CisgIHZv
aWQgYWRkX2ludGVybl90YWJsZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBl
bmRCeXRlcyg1LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBhZGRf
aW50ZXJuX3RhYmxlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5k
Qnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3dpdGNoX3RpbWVzdGFtcChj
b25zdCA6OnByb3RvemVybzo6UGFja2VkVmFySW50JiBwYWNrZWRfYnVmZmVyKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMSwgcGFja2VkX2J1ZmZlci5kYXRhKCksIHBhY2tlZF9idWZmZXIuc2l6ZSgpKTsK
KyAgfQorICB2b2lkIHNldF9zd2l0Y2hfcHJldl9zdGF0ZShjb25zdCA6OnByb3RvemVybzo6UGFj
a2VkVmFySW50JiBwYWNrZWRfYnVmZmVyKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgcGFja2VkX2J1
ZmZlci5kYXRhKCksIHBhY2tlZF9idWZmZXIuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9zd2l0
Y2hfbmV4dF9waWQoY29uc3QgOjpwcm90b3plcm86OlBhY2tlZFZhckludCYgcGFja2VkX2J1ZmZl
cikgeworICAgIEFwcGVuZEJ5dGVzKDMsIHBhY2tlZF9idWZmZXIuZGF0YSgpLCBwYWNrZWRfYnVm
ZmVyLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfc3dpdGNoX25leHRfcHJpbyhjb25zdCA6OnBy
b3RvemVybzo6UGFja2VkVmFySW50JiBwYWNrZWRfYnVmZmVyKSB7CisgICAgQXBwZW5kQnl0ZXMo
NCwgcGFja2VkX2J1ZmZlci5kYXRhKCksIHBhY2tlZF9idWZmZXIuc2l6ZSgpKTsKKyAgfQorICB2
b2lkIHNldF9zd2l0Y2hfbmV4dF9jb21tX2luZGV4KGNvbnN0IDo6cHJvdG96ZXJvOjpQYWNrZWRW
YXJJbnQmIHBhY2tlZF9idWZmZXIpIHsKKyAgICBBcHBlbmRCeXRlcyg2LCBwYWNrZWRfYnVmZmVy
LmRhdGEoKSwgcGFja2VkX2J1ZmZlci5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3dha2luZ190
aW1lc3RhbXAoY29uc3QgOjpwcm90b3plcm86OlBhY2tlZFZhckludCYgcGFja2VkX2J1ZmZlcikg
eworICAgIEFwcGVuZEJ5dGVzKDcsIHBhY2tlZF9idWZmZXIuZGF0YSgpLCBwYWNrZWRfYnVmZmVy
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfd2FraW5nX3BpZChjb25zdCA6OnByb3RvemVybzo6
UGFja2VkVmFySW50JiBwYWNrZWRfYnVmZmVyKSB7CisgICAgQXBwZW5kQnl0ZXMoOCwgcGFja2Vk
X2J1ZmZlci5kYXRhKCksIHBhY2tlZF9idWZmZXIuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF93
YWtpbmdfdGFyZ2V0X2NwdShjb25zdCA6OnByb3RvemVybzo6UGFja2VkVmFySW50JiBwYWNrZWRf
YnVmZmVyKSB7CisgICAgQXBwZW5kQnl0ZXMoOSwgcGFja2VkX2J1ZmZlci5kYXRhKCksIHBhY2tl
ZF9idWZmZXIuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF93YWtpbmdfcHJpbyhjb25zdCA6OnBy
b3RvemVybzo6UGFja2VkVmFySW50JiBwYWNrZWRfYnVmZmVyKSB7CisgICAgQXBwZW5kQnl0ZXMo
MTAsIHBhY2tlZF9idWZmZXIuZGF0YSgpLCBwYWNrZWRfYnVmZmVyLnNpemUoKSk7CisgIH0KKyAg
dm9pZCBzZXRfd2FraW5nX2NvbW1faW5kZXgoY29uc3QgOjpwcm90b3plcm86OlBhY2tlZFZhcklu
dCYgcGFja2VkX2J1ZmZlcikgeworICAgIEFwcGVuZEJ5dGVzKDExLCBwYWNrZWRfYnVmZmVyLmRh
dGEoKSwgcGFja2VkX2J1ZmZlci5zaXplKCkpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4K
K30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3Vh
cmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRv
L3RyYWNlL2Z0cmFjZS9mdHJhY2Vfc3RhdHMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkg
dGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX0ZUUkFDRV9TVEFUU19Q
Uk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZU
UkFDRV9GVFJBQ0VfU1RBVFNfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1
ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIEZ0cmFj
ZUNwdVN0YXRzOworZW51bSBGdHJhY2VTdGF0c19QaGFzZSA6IGludDMyX3Q7CisKK2VudW0gRnRy
YWNlU3RhdHNfUGhhc2UgOiBpbnQzMl90IHsKKyAgRnRyYWNlU3RhdHNfUGhhc2VfVU5TUEVDSUZJ
RUQgPSAwLAorICBGdHJhY2VTdGF0c19QaGFzZV9TVEFSVF9PRl9UUkFDRSA9IDEsCisgIEZ0cmFj
ZVN0YXRzX1BoYXNlX0VORF9PRl9UUkFDRSA9IDIsCit9OworCitjb25zdCBGdHJhY2VTdGF0c19Q
aGFzZSBGdHJhY2VTdGF0c19QaGFzZV9NSU4gPSBGdHJhY2VTdGF0c19QaGFzZV9VTlNQRUNJRklF
RDsKK2NvbnN0IEZ0cmFjZVN0YXRzX1BoYXNlIEZ0cmFjZVN0YXRzX1BoYXNlX01BWCA9IEZ0cmFj
ZVN0YXRzX1BoYXNlX0VORF9PRl9UUkFDRTsKKworY2xhc3MgRnRyYWNlU3RhdHNfRGVjb2RlciA6
IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8y
LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAg
RnRyYWNlU3RhdHNfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRnRyYWNlU3RhdHNfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBGdHJhY2VTdGF0c19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19waGFzZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IHBoYXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X2NwdV9zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBjcHVf
c3RhdHMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4oMik7IH0KK307CisKK2NsYXNzIEZ0cmFjZVN0YXRzIDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBGdHJhY2VTdGF0c19EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga1BoYXNlRmllbGROdW1iZXIgPSAxLAorICAgIGtD
cHVTdGF0c0ZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdXNpbmcgUGhhc2UgPSA6OnBlcmZldHRv
Ojpwcm90b3M6OnBiemVybzo6RnRyYWNlU3RhdHNfUGhhc2U7CisgIHN0YXRpYyBjb25zdCBQaGFz
ZSBVTlNQRUNJRklFRCA9IEZ0cmFjZVN0YXRzX1BoYXNlX1VOU1BFQ0lGSUVEOworICBzdGF0aWMg
Y29uc3QgUGhhc2UgU1RBUlRfT0ZfVFJBQ0UgPSBGdHJhY2VTdGF0c19QaGFzZV9TVEFSVF9PRl9U
UkFDRTsKKyAgc3RhdGljIGNvbnN0IFBoYXNlIEVORF9PRl9UUkFDRSA9IEZ0cmFjZVN0YXRzX1Bo
YXNlX0VORF9PRl9UUkFDRTsKKyAgdm9pZCBzZXRfcGhhc2UoOjpwZXJmZXR0bzo6cHJvdG9zOjpw
Ynplcm86OkZ0cmFjZVN0YXRzX1BoYXNlIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgx
LCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGdHJhY2VDcHVTdGF0cz4g
VCogYWRkX2NwdV9zdGF0cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIp
OworICB9CisKK307CisKK2NsYXNzIEZ0cmFjZUNwdVN0YXRzX0RlY29kZXIgOiBwdWJsaWMgOjpw
cm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOSwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGdHJhY2VDcHVT
dGF0c19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGdHJhY2VDcHVTdGF0c19EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IEZ0cmFjZUNwdVN0YXRzX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2NwdSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBj
cHUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Vu
dHJpZXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZW50
cmllcygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
b3ZlcnJ1bigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBv
dmVycnVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19jb21taXRfb3ZlcnJ1bigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBjb21taXRfb3ZlcnJ1bigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfYnl0ZXNfcmVhZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBieXRlc19yZWFkKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19vbGRlc3RfZXZlbnRfdHMoKSBjb25zdCB7IHJldHVy
biBhdDw2PigpLnZhbGlkKCk7IH0KKyAgZG91YmxlIG9sZGVzdF9ldmVudF90cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkuYXNfZG91YmxlKCk7IH0KKyAgYm9vbCBoYXNfbm93X3RzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIGRvdWJsZSBub3dfdHMoKSBjb25zdCB7IHJl
dHVybiBhdDw3PigpLmFzX2RvdWJsZSgpOyB9CisgIGJvb2wgaGFzX2Ryb3BwZWRfZXZlbnRzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRyb3BwZWRfZXZl
bnRzKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19y
ZWFkX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCByZWFkX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkuYXNfdWludDY0KCk7IH0KK307
CisKK2NsYXNzIEZ0cmFjZUNwdVN0YXRzIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBGdHJhY2VDcHVTdGF0c19EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0NwdUZpZWxkTnVtYmVyID0gMSwKKyAgICBrRW50cmllc0Zp
ZWxkTnVtYmVyID0gMiwKKyAgICBrT3ZlcnJ1bkZpZWxkTnVtYmVyID0gMywKKyAgICBrQ29tbWl0
T3ZlcnJ1bkZpZWxkTnVtYmVyID0gNCwKKyAgICBrQnl0ZXNSZWFkRmllbGROdW1iZXIgPSA1LAor
ICAgIGtPbGRlc3RFdmVudFRzRmllbGROdW1iZXIgPSA2LAorICAgIGtOb3dUc0ZpZWxkTnVtYmVy
ID0gNywKKyAgICBrRHJvcHBlZEV2ZW50c0ZpZWxkTnVtYmVyID0gOCwKKyAgICBrUmVhZEV2ZW50
c0ZpZWxkTnVtYmVyID0gOSwKKyAgfTsKKyAgdm9pZCBzZXRfY3B1KHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9lbnRyaWVzKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9vdmVycnVuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9jb21taXRfb3ZlcnJ1bih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYnl0ZXNfcmVhZCh1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfb2xkZXN0X2V2ZW50X3RzKGRvdWJsZSB2YWx1ZSkgeworICAgIEFwcGVuZEZpeGVkKDYsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9ub3dfdHMoZG91YmxlIHZhbHVlKSB7CisgICAgQXBwZW5k
Rml4ZWQoNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Ryb3BwZWRfZXZlbnRzKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9y
ZWFkX2V2ZW50cyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg5LCB2YWx1ZSk7
CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL3Rlc3RfYnVuZGxlX3dy
YXBwZXIucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxl
ciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1RFU1RfQlVORExFX1dSQVBQRVJfUFJPVE9fSF8KKyNkZWZp
bmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfVEVTVF9CVU5E
TEVfV1JBUFBFUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3Rk
aW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3Rv
X2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgRnRyYWNlRXZlbnRC
dW5kbGU7CisKK2NsYXNzIFRlc3RCdW5kbGVXcmFwcGVyX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFRlc3RCdW5kbGVXcmFw
cGVyX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRlc3RCdW5kbGVXcmFwcGVyX0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgVGVzdEJ1bmRsZVdyYXBwZXJfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfYmVmb3JlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdENoYXJzIGJlZm9yZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
c3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfYnVuZGxlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3pl
cm86OkNvbnN0Qnl0ZXM+IGJ1bmRsZSgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzPigyKTsgfQorICBib29sIGhhc19hZnRlcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBhZnRlcigp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIFRlc3RC
dW5kbGVXcmFwcGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBUZXN0QnVuZGxlV3JhcHBlcl9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga0JlZm9yZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrQnVuZGxlRmllbGROdW1i
ZXIgPSAyLAorICAgIGtBZnRlckZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfYmVm
b3JlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9iZWZvcmUoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEZ0cmFjZUV2ZW50QnVuZGxlPiBUKiBhZGRf
YnVuZGxlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKwor
ICB2b2lkIHNldF9hZnRlcihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRC
eXRlcygzLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfYWZ0
ZXIoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBk
YXRhLCBzaXplKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4K
K30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvZ2Vu
ZXJpYy5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVy
IHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9GVFJBQ0VfR0VORVJJQ19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19Q
Uk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9HRU5FUklDX1BST1RPX0hfCisKKyNp
bmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
YWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxz
LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFj
ZSBwYnplcm8geworCitjbGFzcyBHZW5lcmljRnRyYWNlRXZlbnRfRmllbGQ7CisKK2NsYXNzIEdl
bmVyaWNGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki90cnVlPiB7CisgcHVibGljOgorICBHZW5lcmljRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgR2VuZXJpY0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgR2VuZXJpY0Z0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2V2ZW50
X25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Q2hhcnMgZXZlbnRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5n
KCk7IH0KKyAgYm9vbCBoYXNfZmllbGQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29u
c3RCeXRlcz4gZmllbGQoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6
Q29uc3RCeXRlcz4oMik7IH0KK307CisKK2NsYXNzIEdlbmVyaWNGdHJhY2VFdmVudCA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gR2Vu
ZXJpY0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRXZlbnRO
YW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtGaWVsZEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAg
dXNpbmcgRmllbGQgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6R2VuZXJpY0Z0cmFjZUV2
ZW50X0ZpZWxkOworICB2b2lkIHNldF9ldmVudF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAg
fQorICB2b2lkIHNldF9ldmVudF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBHZW5lcmljRnRyYWNlRXZlbnRfRmllbGQ+IFQqIGFkZF9maWVsZCgpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIpOworICB9CisKK307CisKK2NsYXNzIEdlbmVy
aWNGdHJhY2VFdmVudF9GaWVsZF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgR2VuZXJpY0Z0cmFjZUV2ZW50X0ZpZWxkX0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEdlbmVyaWNGdHJhY2VFdmVudF9GaWVsZF9EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4
cGxpY2l0IEdlbmVyaWNGdHJhY2VFdmVudF9GaWVsZF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3N0cl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBzdHJfdmFsdWUoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2ludF92YWx1
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGludF92YWx1
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc191aW50
X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHVp
bnRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitj
bGFzcyBHZW5lcmljRnRyYWNlRXZlbnRfRmllbGQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEdlbmVyaWNGdHJhY2VFdmVudF9GaWVs
ZF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05hbWVGaWVsZE51bWJlciA9IDEs
CisgICAga1N0clZhbHVlRmllbGROdW1iZXIgPSAzLAorICAgIGtJbnRWYWx1ZUZpZWxkTnVtYmVy
ID0gNCwKKyAgICBrVWludFZhbHVlRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9u
YW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfc3RyX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lk
IHNldF9zdHJfdmFsdWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBl
bmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9pbnRfdmFsdWUoaW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
dWludF92YWx1ZSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7
CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2JpbmRlci5wYnplcm8u
aAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8g
Tk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFD
RV9GVFJBQ0VfQklOREVSX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fVFJBQ0VfRlRSQUNFX0JJTkRFUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVm
Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVk
X2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKwor
CitjbGFzcyBCaW5kZXJUcmFuc2FjdGlvbkFsbG9jQnVmRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJp
bmRlclRyYW5zYWN0aW9uQWxsb2NCdWZGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBCaW5kZXJUcmFuc2FjdGlvbkFsbG9jQnVmRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBC
aW5kZXJUcmFuc2FjdGlvbkFsbG9jQnVmRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfZGF0YV9zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRhdGFfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
YXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZGVidWdfaWQoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBkZWJ1Z19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19vZmZzZXRzX3NpemUoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgb2Zmc2V0c19zaXplKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgQmluZGVyVHJhbnNhY3Rp
b25BbGxvY0J1ZkZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCaW5kZXJUcmFuc2FjdGlvbkFsbG9jQnVmRnRyYWNl
RXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEYXRhU2l6ZUZpZWxkTnVt
YmVyID0gMSwKKyAgICBrRGVidWdJZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrT2Zmc2V0c1NpemVG
aWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2RhdGFfc2l6ZSh1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGVidWdf
aWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfb2Zmc2V0c19zaXplKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQmluZGVyVW5sb2NrRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIEJpbmRlclVubG9ja0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEJpbmRlclVubG9ja0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmluZGVyVW5sb2NrRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdGFnKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJz
IHRhZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNz
IEJpbmRlclVubG9ja0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCaW5kZXJVbmxvY2tGdHJhY2VFdmVudF9EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RhZ0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsK
KyAgdm9pZCBzZXRfdGFnKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF90YWco
Y29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRh
LCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgQmluZGVyTG9ja2VkRnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIEJpbmRlckxvY2tlZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEJpbmRlckxvY2tlZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmluZGVyTG9ja2VkRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdGFnKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHRh
ZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEJp
bmRlckxvY2tlZEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCaW5kZXJMb2NrZWRGdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RhZ0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAg
dm9pZCBzZXRfdGFnKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF90YWcoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBz
aXplKTsKKyAgfQorfTsKKworY2xhc3MgQmluZGVyTG9ja0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBC
aW5kZXJMb2NrRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmluZGVy
TG9ja0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmluZGVyTG9ja0Z0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3RhZygpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0YWcoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBCaW5kZXJMb2NrRnRy
YWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IEJpbmRlckxvY2tGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga1RhZ0ZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfdGFnKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF90YWcoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorfTsK
KworY2xhc3MgQmluZGVyU2V0UHJpb3JpdHlGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6
cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05P
TlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmluZGVyU2V0
UHJpb3JpdHlGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBCaW5kZXJT
ZXRQcmlvcml0eUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmluZGVyU2V0UHJpb3JpdHlGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19wcm9jKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcHJvYygpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190aHJlYWQoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCB0aHJlYWQoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfb2xkX3ByaW8oKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgb2xkX3ByaW8oKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX25ld19wcmlvKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG5ld19wcmlvKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19kZXNpcmVkX3By
aW8oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZGVzaXJl
ZF9wcmlvKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xh
c3MgQmluZGVyU2V0UHJpb3JpdHlGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmluZGVyU2V0UHJpb3JpdHlGdHJh
Y2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1Byb2NGaWVsZE51bWJl
ciA9IDEsCisgICAga1RocmVhZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrT2xkUHJpb0ZpZWxkTnVt
YmVyID0gMywKKyAgICBrTmV3UHJpb0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrRGVzaXJlZFByaW9G
aWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X3Byb2MoaW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGhyZWFkKGludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X29sZF9wcmlvKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9uZXdfcHJpbyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGVzaXJlZF9wcmlvKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQmlu
ZGVyVHJhbnNhY3Rpb25SZWNlaXZlZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCaW5kZXJUcmFuc2Fj
dGlvblJlY2VpdmVkRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmlu
ZGVyVHJhbnNhY3Rpb25SZWNlaXZlZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmluZGVyVHJhbnNh
Y3Rpb25SZWNlaXZlZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RlYnVnX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9Cisg
IGludDMyX3QgZGVidWdfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0K
K307CisKK2NsYXNzIEJpbmRlclRyYW5zYWN0aW9uUmVjZWl2ZWRGdHJhY2VFdmVudCA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmlu
ZGVyVHJhbnNhY3Rpb25SZWNlaXZlZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrRGVidWdJZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfZGVi
dWdfaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0K
K307CisKK2NsYXNzIEJpbmRlclRyYW5zYWN0aW9uRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki83LCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJpbmRl
clRyYW5zYWN0aW9uRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmlu
ZGVyVHJhbnNhY3Rpb25GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEJpbmRlclRyYW5zYWN0aW9uRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGVidWdf
aWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBkZWJ1Z19p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190YXJn
ZXRfbm9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHRh
cmdldF9ub2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX3RvX3Byb2MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCB0b19wcm9jKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX3RvX3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHRvX3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc19yZXBseSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHJlcGx5KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX2NvZGUoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
Y29kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNf
ZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxh
Z3MoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBC
aW5kZXJUcmFuc2FjdGlvbkZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCaW5kZXJUcmFuc2FjdGlvbkZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGVidWdJZEZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrVGFyZ2V0Tm9kZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrVG9Qcm9jRmllbGRO
dW1iZXIgPSAzLAorICAgIGtUb1RocmVhZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrUmVwbHlGaWVs
ZE51bWJlciA9IDUsCisgICAga0NvZGVGaWVsZE51bWJlciA9IDYsCisgICAga0ZsYWdzRmllbGRO
dW1iZXIgPSA3LAorICB9OworICB2b2lkIHNldF9kZWJ1Z19pZChpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90YXJnZXRfbm9kZShp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF90b19wcm9jKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3RvX3RocmVhZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZXBseShpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jb2RlKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9mbGFncyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7Cisg
IH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFj
ZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBo
ZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2Jsb2NrLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZU
UkFDRV9CTE9DS19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZF
VFRPX1RSQUNFX0ZUUkFDRV9CTE9DS19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+Cisj
aW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxk
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFz
cyBCbG9ja1VucGx1Z0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5
cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVB
VEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCbG9ja1VucGx1Z0Z0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVj
b2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJsb2NrVW5wbHVnRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBCbG9ja1VucGx1Z0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX25yX3JxKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9
CisgIGludDMyX3QgbnJfcnEoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0K
KyAgYm9vbCBoYXNfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RDaGFycyBjb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19z
dHJpbmcoKTsgfQorfTsKKworY2xhc3MgQmxvY2tVbnBsdWdGdHJhY2VFdmVudCA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmxvY2tV
bnBsdWdGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05yUnFG
aWVsZE51bWJlciA9IDEsCisgICAga0NvbW1GaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQg
c2V0X25yX3JxKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygy
LCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgQmxvY2tUb3VjaEJ1ZmZlckZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBCbG9ja1RvdWNoQnVmZmVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgQmxvY2tUb3VjaEJ1ZmZlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmxv
Y2tUb3VjaEJ1ZmZlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBzZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNz
IEJsb2NrVG91Y2hCdWZmZXJGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmxvY2tUb3VjaEJ1ZmZlckZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAx
LAorICAgIGtTZWN0b3JGaWVsZE51bWJlciA9IDIsCisgICAga1NpemVGaWVsZE51bWJlciA9IDMs
CisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zaXplKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3Mg
QmxvY2tTcGxpdEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCbG9ja1NwbGl0RnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmxvY2tTcGxpdEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgQmxvY2tTcGxpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBzZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX25ld19zZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgbmV3X3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfcndicygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RDaGFycyByd2JzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19z
dHJpbmcoKTsgfQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0oKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBCbG9ja1NwbGl0RnRyYWNlRXZlbnQg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IEJsb2NrU3BsaXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSAyLAorICAg
IGtOZXdTZWN0b3JGaWVsZE51bWJlciA9IDMsCisgICAga1J3YnNGaWVsZE51bWJlciA9IDQsCisg
ICAga0NvbW1GaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2Vj
dG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9uZXdfc2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAg
fQorICB2b2lkIHNldF9yd2JzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAg
QXBwZW5kQnl0ZXMoNCwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIGRhdGEsIHNpemUpOworICB9Cit9OworCitj
bGFzcyBCbG9ja1NsZWVwcnFGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmxvY2tTbGVlcHJxRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmxvY2tTbGVlcHJxRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBCbG9ja1NsZWVwcnFGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19zZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3Qgc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19ucl9zZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19yd2JzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHJ3YnMoKSBjb25zdCB7IHJldHVybiBh
dDw0PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2NvbW0oKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgY29tbSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEJsb2NrU2xlZXBy
cUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBCbG9ja1NsZWVwcnFGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrU2VjdG9yRmllbGRO
dW1iZXIgPSAyLAorICAgIGtOclNlY3RvckZpZWxkTnVtYmVyID0gMywKKyAgICBrUndic0ZpZWxk
TnVtYmVyID0gNCwKKyAgICBrQ29tbUZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRf
ZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9zZWN0b3IodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X25yX3NlY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcndicyhjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg0LCB2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfcndicyhjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0
X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCBkYXRhLCBzaXplKTsK
KyAgfQorfTsKKworY2xhc3MgQmxvY2tScVJlcXVldWVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmxv
Y2tScVJlcXVldWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBCbG9j
a1JxUmVxdWV1ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmxvY2tScVJlcXVldWVGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zZWN0b3IoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc2VjdG9yKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ucl9zZWN0b3IoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbnJfc2VjdG9yKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19lcnJvcnMoKSBjb25z
dCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBlcnJvcnMoKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcndicygpIGNvbnN0IHsg
cmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyByd2Jz
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19jbWQo
KSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Q2hhcnMgY21kKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19zdHJpbmcoKTsgfQorfTsKKwor
Y2xhc3MgQmxvY2tScVJlcXVldWVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmxvY2tScVJlcXVldWVGdHJhY2VF
dmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0g
MSwKKyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSAyLAorICAgIGtOclNlY3RvckZpZWxkTnVtYmVy
ID0gMywKKyAgICBrRXJyb3JzRmllbGROdW1iZXIgPSA0LAorICAgIGtSd2JzRmllbGROdW1iZXIg
PSA1LAorICAgIGtDbWRGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfc2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9ucl9zZWN0b3IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Vycm9ycyhpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IGNoYXIqIGRhdGEsIHNp
emVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfY21kKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDYs
IHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jbWQoY29uc3Qg
Y2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg2LCBkYXRhLCBzaXpl
KTsKKyAgfQorfTsKKworY2xhc3MgQmxvY2tScVJlbWFwRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki83LCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJs
b2NrUnFSZW1hcEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJsb2Nr
UnFSZW1hcEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmxvY2tScVJlbWFwRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG5yX3NlY3RvcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfb2xkX2RldigpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBvbGRfZGV2KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19vbGRfc2VjdG9yKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG9sZF9zZWN0b3IoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25yX2Jpb3Mo
KSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbnJfYmlvcygp
IGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcndicygp
IGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RD
aGFycyByd2JzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19zdHJpbmcoKTsgfQorfTsKKwor
Y2xhc3MgQmxvY2tScVJlbWFwRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJsb2NrUnFSZW1hcEZ0cmFjZUV2ZW50
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAor
ICAgIGtTZWN0b3JGaWVsZE51bWJlciA9IDIsCisgICAga05yU2VjdG9yRmllbGROdW1iZXIgPSAz
LAorICAgIGtPbGREZXZGaWVsZE51bWJlciA9IDQsCisgICAga09sZFNlY3RvckZpZWxkTnVtYmVy
ID0gNSwKKyAgICBrTnJCaW9zRmllbGROdW1iZXIgPSA2LAorICAgIGtSd2JzRmllbGROdW1iZXIg
PSA3LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NlY3Rvcih1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnJfc2VjdG9y
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9vbGRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9vbGRfc2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ucl9iaW9zKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9y
d2JzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDcsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNywgZGF0YSwgc2l6ZSk7Cisg
IH0KK307CisKK2NsYXNzIEJsb2NrUnFJbnNlcnRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzcsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmxvY2tS
cUluc2VydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJsb2NrUnFJ
bnNlcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEJsb2NrUnFJbnNlcnRGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zZWN0b3IoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ucl9zZWN0b3IoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19ieXRlcygpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBieXRlcygpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcndicygpIGNvbnN0IHsgcmV0dXJu
IGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyByd2JzKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19jb21tKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJz
IGNvbW0oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFz
X2NtZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBjbWQoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3N0cmluZygpOyB9Cit9
OworCitjbGFzcyBCbG9ja1JxSW5zZXJ0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86
Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJsb2NrUnFJbnNlcnRGdHJh
Y2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSAyLAorICAgIGtOclNlY3RvckZpZWxkTnVt
YmVyID0gMywKKyAgICBrQnl0ZXNGaWVsZE51bWJlciA9IDQsCisgICAga1J3YnNGaWVsZE51bWJl
ciA9IDUsCisgICAga0NvbW1GaWVsZE51bWJlciA9IDYsCisgICAga0NtZEZpZWxkTnVtYmVyID0g
NywKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zZWN0b3IodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25yX3NlY3Rvcih1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfYnl0ZXModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3J3YnMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAg
QXBwZW5kQnl0ZXMoNSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQg
c2V0X3J3YnMoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRl
cyg1LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IHN0ZDo6c3RyaW5n
JiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDYsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoNiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfY21kKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDcsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jbWQoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg3LCBkYXRhLCBzaXplKTsKKyAgfQorfTsK
KworY2xhc3MgQmxvY2tScUNvbXBsZXRlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82LCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJsb2NrUnFDb21w
bGV0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJsb2NrUnFDb21w
bGV0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmxvY2tScUNvbXBsZXRlRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG5yX3NlY3RvcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZXJyb3JzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZXJyb3JzKCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3J3YnMoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgcndicygpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY21kKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJz
IGNtZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNz
IEJsb2NrUnFDb21wbGV0ZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCbG9ja1JxQ29tcGxldGVGdHJhY2VFdmVu
dF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwK
KyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSAyLAorICAgIGtOclNlY3RvckZpZWxkTnVtYmVyID0g
MywKKyAgICBrRXJyb3JzRmllbGROdW1iZXIgPSA0LAorICAgIGtSd2JzRmllbGROdW1iZXIgPSA1
LAorICAgIGtDbWRGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
c2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9ucl9zZWN0b3IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Vycm9ycyhpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IHN0
ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFs
dWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVf
dCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfY21kKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDYsIHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jbWQoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg2LCBkYXRhLCBzaXplKTsK
KyAgfQorfTsKKworY2xhc3MgQmxvY2tScUFib3J0RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82LCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJsb2Nr
UnFBYm9ydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJsb2NrUnFB
Ym9ydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmxvY2tScUFib3J0RnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG5yX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZXJyb3JzKCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZXJyb3JzKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3J3YnMoKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgcndicygpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY21kKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNt
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEJs
b2NrUnFBYm9ydEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCbG9ja1JxQWJvcnRGdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrU2Vj
dG9yRmllbGROdW1iZXIgPSAyLAorICAgIGtOclNlY3RvckZpZWxkTnVtYmVyID0gMywKKyAgICBr
RXJyb3JzRmllbGROdW1iZXIgPSA0LAorICAgIGtSd2JzRmllbGROdW1iZXIgPSA1LAorICAgIGtD
bWRGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VjdG9yKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9ucl9zZWN0b3IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2Vycm9ycyhpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IHN0ZDo6c3RyaW5n
JiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfY21kKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDYsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jbWQoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg2LCBkYXRhLCBzaXplKTsKKyAgfQorfTsK
KworY2xhc3MgQmxvY2tQbHVnRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVy
bzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19OT05QQUNLRURf
UkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJsb2NrUGx1Z0Z0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJsb2NrUGx1Z0Z0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgQmxvY2tQbHVnRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkg
e30KKyAgYm9vbCBoYXNfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBjb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgQmxvY2tQbHVnRnRyYWNlRXZlbnQgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJsb2Nr
UGx1Z0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29tbUZp
ZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfY29tbShjb25zdCBzdGQ6OnN0cmluZyYg
dmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7
CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFzcyBCbG9ja0dl
dHJxRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0Rl
Y29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERT
PSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJsb2NrR2V0cnFGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBCbG9ja0dldHJxRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBCbG9j
a0dldHJxRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRl
digpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2Vj
dG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNlY3Rv
cigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnJf
c2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG5y
X3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfcndicygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RDaGFycyByd2JzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19zdHJpbmcoKTsg
fQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFz
X3N0cmluZygpOyB9Cit9OworCitjbGFzcyBCbG9ja0dldHJxRnRyYWNlRXZlbnQgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJsb2Nr
R2V0cnFGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSAyLAorICAgIGtOclNlY3Rv
ckZpZWxkTnVtYmVyID0gMywKKyAgICBrUndic0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrQ29tbUZp
ZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zZWN0b3IodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X25yX3NlY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcndicyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBB
cHBlbmRCeXRlcyg0LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBz
ZXRfcndicyhjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDQsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsK
KyAgICBBcHBlbmRCeXRlcyg1LCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgQmxvY2tE
aXJ0eUJ1ZmZlckZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCbG9ja0RpcnR5QnVmZmVyRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmxvY2tEaXJ0eUJ1ZmZlckZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgQmxvY2tEaXJ0eUJ1ZmZlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBzZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0
KCk7IH0KK307CisKK2NsYXNzIEJsb2NrRGlydHlCdWZmZXJGdHJhY2VFdmVudCA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmxvY2tE
aXJ0eUJ1ZmZlckZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
RGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtTZWN0b3JGaWVsZE51bWJlciA9IDIsCisgICAga1Np
emVGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VjdG9yKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9zaXplKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsK
KyAgfQorfTsKKworY2xhc3MgQmxvY2tCaW9SZW1hcEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCbG9j
a0Jpb1JlbWFwRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmxvY2tC
aW9SZW1hcEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmxvY2tCaW9SZW1hcEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBzZWN0b3IoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25yX3NlY3RvcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBucl9zZWN0b3IoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX29sZF9kZXYoKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgb2xkX2RldigpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfb2xkX3NlY3RvcigpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBvbGRfc2VjdG9yKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19yd2JzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENo
YXJzIHJ3YnMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3N0cmluZygpOyB9Cit9OworCitj
bGFzcyBCbG9ja0Jpb1JlbWFwRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJsb2NrQmlvUmVtYXBGdHJhY2VFdmVu
dF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwK
KyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSAyLAorICAgIGtOclNlY3RvckZpZWxkTnVtYmVyID0g
MywKKyAgICBrT2xkRGV2RmllbGROdW1iZXIgPSA0LAorICAgIGtPbGRTZWN0b3JGaWVsZE51bWJl
ciA9IDUsCisgICAga1J3YnNGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2Rldih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfc2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9ucl9zZWN0b3IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29sZF9kZXYodWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29sZF9z
ZWN0b3IodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3J3YnMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5k
Qnl0ZXMoNiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3J3
YnMoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg2LCBk
YXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgQmxvY2tCaW9RdWV1ZUZ0cmFjZUV2ZW50X0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBCbG9ja0Jpb1F1ZXVlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgQmxvY2tCaW9RdWV1ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmxvY2tCaW9RdWV1ZUZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rldigp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NlY3RvcigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBzZWN0b3IoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25yX3NlY3Rvcigp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBucl9zZWN0b3Io
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3J3YnMo
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Q2hhcnMgcndicygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9v
bCBoYXNfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RDaGFycyBjb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmco
KTsgfQorfTsKKworY2xhc3MgQmxvY2tCaW9RdWV1ZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCbG9ja0Jpb1F1
ZXVlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVs
ZE51bWJlciA9IDEsCisgICAga1NlY3RvckZpZWxkTnVtYmVyID0gMiwKKyAgICBrTnJTZWN0b3JG
aWVsZE51bWJlciA9IDMsCisgICAga1J3YnNGaWVsZE51bWJlciA9IDQsCisgICAga0NvbW1GaWVs
ZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VjdG9yKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9u
cl9zZWN0b3IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3J3YnMoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoNCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X3J3YnMoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg0
LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IHN0ZDo6c3RyaW5nJiB2
YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsK
KyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIEJsb2NrQmlv
RnJvbnRtZXJnZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCbG9ja0Jpb0Zyb250bWVyZ2VGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBCbG9ja0Jpb0Zyb250bWVyZ2VGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IEJsb2NrQmlvRnJvbnRtZXJnZUZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBzZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25yX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBucl9zZWN0b3IoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3J3YnMoKSBjb25zdCB7IHJldHVybiBh
dDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgcndicygpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY29tbSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBj
b21tKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3Mg
QmxvY2tCaW9Gcm9udG1lcmdlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJsb2NrQmlvRnJvbnRtZXJnZUZ0cmFj
ZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIg
PSAxLAorICAgIGtTZWN0b3JGaWVsZE51bWJlciA9IDIsCisgICAga05yU2VjdG9yRmllbGROdW1i
ZXIgPSAzLAorICAgIGtSd2JzRmllbGROdW1iZXIgPSA0LAorICAgIGtDb21tRmllbGROdW1iZXIg
PSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NlY3Rvcih1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnJfc2VjdG9y
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9yd2JzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDQsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNv
bnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgZGF0YSwg
c2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsK
KyAgICBBcHBlbmRCeXRlcyg1LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAg
dm9pZCBzZXRfY29tbShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDUsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFzcyBCbG9ja0Jpb0NvbXBsZXRl
RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29k
ZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
ZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJsb2NrQmlvQ29tcGxldGVGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBCbG9ja0Jpb0NvbXBsZXRlRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBCbG9ja0Jpb0NvbXBsZXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6
ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IHNlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIHVpbnQzMl90IG5yX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMy
KCk7IH0KKyAgYm9vbCBoYXNfZXJyb3IoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7
IH0KKyAgaW50MzJfdCBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19yd2JzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHJ3YnMoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFz
X3N0cmluZygpOyB9Cit9OworCitjbGFzcyBCbG9ja0Jpb0NvbXBsZXRlRnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IEJsb2NrQmlvQ29tcGxldGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSAyLAor
ICAgIGtOclNlY3RvckZpZWxkTnVtYmVyID0gMywKKyAgICBrRXJyb3JGaWVsZE51bWJlciA9IDQs
CisgICAga1J3YnNGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
c2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9ucl9zZWN0b3IodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Vycm9yKGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3J3YnMoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgdmFsdWUuZGF0YSgpLCB2YWx1
ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3J3YnMoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90
IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xh
c3MgQmxvY2tCaW9Cb3VuY2VGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmxvY2tCaW9Cb3VuY2VGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQ
cm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBCbG9ja0Jpb0JvdW5jZUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgQmxvY2tCaW9Cb3VuY2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRh
dGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191
aW50NjQoKTsgfQorICBib29sIGhhc19zZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3Qgc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191
aW50NjQoKTsgfQorICBib29sIGhhc19ucl9zZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19yd2JzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHJ3YnMoKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2NvbW0oKSBjb25zdCB7IHJl
dHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgY29tbSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEJsb2Nr
QmlvQm91bmNlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJsb2NrQmlvQm91bmNlRnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga1Nl
Y3RvckZpZWxkTnVtYmVyID0gMiwKKyAgICBrTnJTZWN0b3JGaWVsZE51bWJlciA9IDMsCisgICAg
a1J3YnNGaWVsZE51bWJlciA9IDQsCisgICAga0NvbW1GaWVsZE51bWJlciA9IDUsCisgIH07Cisg
IHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ucl9zZWN0b3IodWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3J3YnMo
Y29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgdmFsdWUuZGF0
YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3J3YnMoY29uc3QgY2hhciogZGF0
YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg0LCBkYXRhLCBzaXplKTsKKyAgfQor
ICB2b2lkIHNldF9jb21tKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jb21t
KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0
YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIEJsb2NrQmlvQmFja21lcmdlRnRyYWNlRXZlbnRf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIEJsb2NrQmlvQmFja21lcmdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50
OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30K
KyAgZXhwbGljaXQgQmxvY2tCaW9CYWNrbWVyZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEJsb2Nr
QmlvQmFja21lcmdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHNlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IG5yX3NlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfcndicygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RDaGFycyByd2JzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19zdHJp
bmcoKTsgfQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0oKSBjb25zdCB7IHJldHVybiBhdDw1
PigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBCbG9ja0Jpb0JhY2ttZXJnZUZ0cmFjZUV2
ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBCbG9ja0Jpb0JhY2ttZXJnZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtTZWN0b3JGaWVsZE51bWJl
ciA9IDIsCisgICAga05yU2VjdG9yRmllbGROdW1iZXIgPSAzLAorICAgIGtSd2JzRmllbGROdW1i
ZXIgPSA0LAorICAgIGtDb21tRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3NlY3Rvcih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnJfc2VjdG9yKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6
ZSgpKTsKKyAgfQorICB2b2lkIHNldF9yd2JzKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXpl
KSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29t
bShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCB2YWx1ZS5k
YXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBjaGFyKiBk
YXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIGRhdGEsIHNpemUpOworICB9
Cit9OworCitjbGFzcyBCbG9ja1JxSXNzdWVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6
cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzcsIC8qSEFTX05P
TlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmxvY2tScUlz
c3VlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6
IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmxvY2tScUlzc3Vl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBCbG9ja1JxSXNzdWVGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19zZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19ucl9zZWN0b3IoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbnJfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19ieXRlcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBieXRlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcndicygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyByd2JzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0o
KSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2NtZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RD
aGFycyBjbWQoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3N0cmluZygpOyB9Cit9OworCitj
bGFzcyBCbG9ja1JxSXNzdWVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQmxvY2tScUlzc3VlRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisg
ICAga1NlY3RvckZpZWxkTnVtYmVyID0gMiwKKyAgICBrTnJTZWN0b3JGaWVsZE51bWJlciA9IDMs
CisgICAga0J5dGVzRmllbGROdW1iZXIgPSA0LAorICAgIGtSd2JzRmllbGROdW1iZXIgPSA1LAor
ICAgIGtDb21tRmllbGROdW1iZXIgPSA2LAorICAgIGtDbWRGaWVsZE51bWJlciA9IDcsCisgIH07
CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VjdG9yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ucl9zZWN0b3IodWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2J5
dGVzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9yd2JzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9yd2Jz
KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0
YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUp
IHsKKyAgICBBcHBlbmRCeXRlcyg2LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0K
KyAgdm9pZCBzZXRfY29tbShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDYsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2NtZChjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg3LCB2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfY21kKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBz
aXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNywgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK30gLy8g
TmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8g
SW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90
b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2Nncm91cC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRl
ZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5k
ZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfQ0dST1VQX1BS
T1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRS
QUNFX0NHUk9VUF9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3Rk
aW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3Rv
X2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFt
ZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBDZ3JvdXBTZXR1
cFJvb3RGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQ2dyb3VwU2V0dXBSb290RnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2dyb3VwU2V0dXBSb290RnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBDZ3JvdXBTZXR1cFJvb3RGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19yb290KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgp
OyB9CisgIGludDMyX3Qgcm9vdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19zc19tYXNrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9
CisgIHVpbnQzMl90IHNzX21hc2soKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
YXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIENncm91cFNldHVwUm9vdEZ0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBDZ3JvdXBTZXR1cFJvb3RGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga1Jvb3RGaWVsZE51bWJlciA9IDEsCisgICAga1NzTWFza0ZpZWxkTnVtYmVyID0gMiwK
KyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfcm9vdChpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9z
c19tYXNrKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9u
YW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMywg
ZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIENncm91cFJlbmFtZUZ0cmFjZUV2ZW50X0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBDZ3JvdXBSZW5hbWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBDZ3JvdXBSZW5hbWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENncm91cFJlbmFtZUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3Jvb3QoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCByb290KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2lkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgaWQoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfY25hbWUoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgY25hbWUoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBDZ3JvdXBSZW5h
bWVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgor
ICB1c2luZyBEZWNvZGVyID0gQ2dyb3VwUmVuYW1lRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtSb290RmllbGROdW1iZXIgPSAxLAorICAgIGtJZEZpZWxkTnVt
YmVyID0gMiwKKyAgICBrQ25hbWVGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X3Jv
b3QoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfY25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAg
QXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQg
c2V0X2NuYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0
ZXMoMywgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIENncm91cFJlbGVhc2VGdHJhY2VF
dmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4g
eworIHB1YmxpYzoKKyAgQ2dyb3VwUmVsZWFzZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IENncm91cFJlbGVhc2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENncm91cFJl
bGVhc2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhh
c19yb290KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qgcm9v
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19pZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGlkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2NuYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNu
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3Mg
Q2dyb3VwUmVsZWFzZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDZ3JvdXBSZWxlYXNlRnRyYWNlRXZlbnRfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtSb290RmllbGROdW1iZXIgPSAxLAorICAg
IGtJZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ25hbWVGaWVsZE51bWJlciA9IDMsCisgIH07Cisg
IHZvaWQgc2V0X3Jvb3QoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X2NuYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMywgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIENncm91cERl
c3Ryb3lSb290RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENncm91cERlc3Ryb3lSb290RnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2dyb3VwRGVzdHJveVJvb3RGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IENncm91cERlc3Ryb3lSb290RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcm9vdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJvb3QoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFz
X2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3NfbWFzaygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBzc19tYXNrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50MzIoKTsgfQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBDZ3JvdXBEZXN0cm95Um9vdEZ0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBDZ3JvdXBEZXN0cm95Um9vdEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrUm9vdEZpZWxkTnVtYmVyID0gMSwKKyAgICBrU3NNYXNrRmll
bGROdW1iZXIgPSAyLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNl
dF9yb290KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3NzX21hc2sodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9
CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBB
cHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgQ2dyb3VwVHJhbnNm
ZXJUYXNrc0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBDZ3JvdXBUcmFuc2ZlclRhc2tzRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2dyb3VwVHJhbnNmZXJUYXNrc0Z0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgQ2dyb3VwVHJhbnNmZXJUYXNrc0Z0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RzdF9yb290KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZHN0X3Jvb3QoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZHN0X2lkKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZHN0X2lkKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
YXNfaW50MzIoKTsgfQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0oKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2NuYW1lKCkgY29uc3QgeyByZXR1
cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNuYW1lKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgQ2dyb3Vw
VHJhbnNmZXJUYXNrc0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDZ3JvdXBUcmFuc2ZlclRhc2tzRnRyYWNlRXZl
bnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEc3RSb290RmllbGROdW1iZXIg
PSAxLAorICAgIGtEc3RJZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAz
LAorICAgIGtDb21tRmllbGROdW1iZXIgPSA0LAorICAgIGtDbmFtZUZpZWxkTnVtYmVyID0gNSwK
KyAgfTsKKyAgdm9pZCBzZXRfZHN0X3Jvb3QoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHN0X2lkKGludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BpZChpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9j
b21tKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgZGF0YSwgc2l6ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfY25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoNSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X2NuYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
NSwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIENncm91cFJtZGlyRnRyYWNlRXZlbnRf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIENncm91cFJtZGlyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgQ2dyb3VwUm1kaXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENncm91cFJtZGlyRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcm9vdCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJvb3QoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfaWQoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19jbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBjbmFtZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIENncm91cFJtZGly
RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IENncm91cFJtZGlyRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtSb290RmllbGROdW1iZXIgPSAxLAorICAgIGtJZEZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrQ25hbWVGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X3Jvb3Qo
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfY25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X2NuYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
MywgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIENncm91cFJlbW91bnRGdHJhY2VFdmVu
dF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgQ2dyb3VwUmVtb3VudEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9Cisg
IGV4cGxpY2l0IENncm91cFJlbW91bnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENncm91cFJlbW91
bnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19y
b290KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qgcm9vdCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19zc19tYXNr
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHNzX21hc2so
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX25hbWUo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7IH0KK307CisK
K2NsYXNzIENncm91cFJlbW91bnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2dyb3VwUmVtb3VudEZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrUm9vdEZpZWxkTnVtYmVyID0g
MSwKKyAgICBrU3NNYXNrRmllbGROdW1iZXIgPSAyLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAz
LAorICB9OworICB2b2lkIHNldF9yb290KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NzX21hc2sodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKwor
Y2xhc3MgQ2dyb3VwTWtkaXJGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQ2dyb3VwTWtkaXJGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDZ3JvdXBNa2RpckZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgQ2dyb3VwTWtkaXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19yb290KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgp
OyB9CisgIGludDMyX3Qgcm9vdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBp
bnQzMl90IGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX2NuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdENoYXJzIGNuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19zdHJpbmco
KTsgfQorfTsKKworY2xhc3MgQ2dyb3VwTWtkaXJGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2dyb3VwTWtkaXJG
dHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1Jvb3RGaWVsZE51
bWJlciA9IDEsCisgICAga0lkRmllbGROdW1iZXIgPSAyLAorICAgIGtDbmFtZUZpZWxkTnVtYmVy
ID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfcm9vdChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pZChpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jbmFtZShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfY25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKwor
Y2xhc3MgQ2dyb3VwQXR0YWNoVGFza0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBDZ3JvdXBBdHRhY2hU
YXNrRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6
IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2dyb3VwQXR0YWNo
VGFza0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2dyb3VwQXR0YWNoVGFza0Z0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RzdF9yb290KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZHN0X3Jvb3QoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZHN0X2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZHN0X2lkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8
ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0oKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2NuYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNu
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3Mg
Q2dyb3VwQXR0YWNoVGFza0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDZ3JvdXBBdHRhY2hUYXNrRnRyYWNlRXZl
bnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEc3RSb290RmllbGROdW1iZXIg
PSAxLAorICAgIGtEc3RJZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAz
LAorICAgIGtDb21tRmllbGROdW1iZXIgPSA0LAorICAgIGtDbmFtZUZpZWxkTnVtYmVyID0gNSwK
KyAgfTsKKyAgdm9pZCBzZXRfZHN0X3Jvb3QoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHN0X2lkKGludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BpZChpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9j
b21tKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIHZhbHVl
LmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwgZGF0YSwgc2l6ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfY25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoNSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X2NuYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
NSwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3Bh
Y2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNl
L2Nsay5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVy
IHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9GVFJBQ0VfQ0xLX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX0NMS19QUk9UT19IXworCisjaW5jbHVkZSA8
c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3Jl
cGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCitu
YW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJv
IHsKKworCitjbGFzcyBDbGtTZXRSYXRlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENsa1NldFJhdGVG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDbGtTZXRSYXRlRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBDbGtTZXRSYXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCBy
YXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19yYXRlKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHJhdGUoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBDbGtTZXRSYXRlRnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IENsa1NldFJhdGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1JhdGVGaWVsZE51bWJlciA9IDIsCisgIH07Cisg
IHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0
ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUo
Y29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRh
LCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9yYXRlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQ2xrRGlzYWJsZUZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBDbGtEaXNhYmxlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgQ2xrRGlzYWJsZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2xrRGlzYWJsZUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2Ns
YXNzIENsa0Rpc2FibGVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2xrRGlzYWJsZUZ0cmFjZUV2ZW50X0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsK
KyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRC
eXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFt
ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRh
dGEsIHNpemUpOworICB9Cit9OworCitjbGFzcyBDbGtFbmFibGVGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgQ2xrRW5hYmxlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2xr
RW5hYmxlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBDbGtFbmFibGVGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBDbGtFbmFibGVG
dHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1
c2luZyBEZWNvZGVyID0gQ2xrRW5hYmxlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICB9OworICB2b2lkIHNldF9uYW1l
KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRh
dGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRh
dGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0K
K307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4K
KyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFk
ZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2NvbXBhY3Rpb24ucGJ6ZXJvLmgK
Ky8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5P
VCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
RlRSQUNFX0NPTVBBQ1RJT05fUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfQ09NUEFDVElPTl9QUk9UT19IXworCisjaW5jbHVkZSA8
c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3Jl
cGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCitu
YW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJv
IHsKKworCitjbGFzcyBNbUNvbXBhY3Rpb25XYWtldXBLY29tcGFjdGRGdHJhY2VFdmVudF9EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgTW1Db21wYWN0aW9uV2FrZXVwS2NvbXBhY3RkRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uV2FrZXVwS2NvbXBhY3RkRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQor
ICBleHBsaWNpdCBNbUNvbXBhY3Rpb25XYWtldXBLY29tcGFjdGRGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uaWQoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBuaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfb3JkZXIoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgaW50MzJfdCBvcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNf
aW50MzIoKTsgfQorICBib29sIGhhc19jbGFzc3pvbmVfaWR4KCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNsYXNzem9uZV9pZHgoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNbUNvbXBhY3Rpb25XYWtldXBL
Y29tcGFjdGRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gTW1Db21wYWN0aW9uV2FrZXVwS2NvbXBhY3RkRnRyYWNl
RXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOaWRGaWVsZE51bWJlciA9
IDEsCisgICAga09yZGVyRmllbGROdW1iZXIgPSAyLAorICAgIGtDbGFzc3pvbmVJZHhGaWVsZE51
bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X25pZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vcmRlcihpbnQzMl90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jbGFzc3pv
bmVfaWR4KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorfTsKKworY2xhc3MgTW1Db21wYWN0aW9uVHJ5VG9Db21wYWN0UGFnZXNGdHJhY2VFdmVudF9E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgTW1Db21wYWN0aW9uVHJ5VG9Db21wYWN0UGFnZXNGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBNbUNvbXBhY3Rpb25UcnlUb0NvbXBhY3RQYWdlc0Z0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uVHJ5VG9Db21wYWN0UGFnZXNGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19vcmRlcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG9yZGVyKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2dmcF9tYXNrKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGdmcF9tYXNrKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19tb2RlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1vZGUoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNbUNvbXBhY3Rpb25UcnlU
b0NvbXBhY3RQYWdlc0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNbUNvbXBhY3Rpb25UcnlUb0NvbXBhY3RQYWdl
c0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrT3JkZXJGaWVs
ZE51bWJlciA9IDEsCisgICAga0dmcE1hc2tGaWVsZE51bWJlciA9IDIsCisgICAga01vZGVGaWVs
ZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X29yZGVyKGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2dmcF9tYXNrKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9tb2RlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorfTsKKworY2xhc3MgTW1Db21wYWN0aW9uU3VpdGFibGVGdHJhY2VFdmVudF9EZWNvZGVyIDog
cHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQs
IC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAg
TW1Db21wYWN0aW9uU3VpdGFibGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBNbUNvbXBhY3Rpb25TdWl0YWJsZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgTW1Db21wYWN0
aW9uU3VpdGFibGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19uaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBuaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNf
aWR4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGlkeCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfb3JkZXIo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBvcmRlcigpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19yZXQoKSBjb25z
dCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCByZXQoKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIE1tQ29tcGFjdGlvblN1aXRh
YmxlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IE1tQ29tcGFjdGlvblN1aXRhYmxlRnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOaWRGaWVsZE51bWJlciA9IDEsCisgICAga0lk
eEZpZWxkTnVtYmVyID0gMiwKKyAgICBrT3JkZXJGaWVsZE51bWJlciA9IDMsCisgICAga1JldEZp
ZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfbmlkKGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lkeCh1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb3Jk
ZXIoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUp
OworICB9Cit9OworCitjbGFzcyBNbUNvbXBhY3Rpb25NaWdyYXRlcGFnZXNGdHJhY2VFdmVudF9E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgTW1Db21wYWN0aW9uTWlncmF0ZXBhZ2VzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uTWlncmF0ZXBhZ2VzRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBNbUNvbXBhY3Rpb25NaWdyYXRlcGFnZXNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRh
dGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19ucl9taWdyYXRlZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBucl9taWdyYXRlZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnJfZmFpbGVkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG5yX2ZhaWxlZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIE1tQ29tcGFjdGlv
bk1pZ3JhdGVwYWdlc0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNbUNvbXBhY3Rpb25NaWdyYXRlcGFnZXNGdHJh
Y2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05yTWlncmF0ZWRGaWVs
ZE51bWJlciA9IDEsCisgICAga05yRmFpbGVkRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lk
IHNldF9ucl9taWdyYXRlZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnJfZmFpbGVkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTW1Db21wYWN0aW9uS2Nv
bXBhY3RkV2FrZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBNbUNvbXBhY3Rpb25LY29tcGFjdGRXYWtl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uS2Nv
bXBhY3RkV2FrZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uS2NvbXBhY3RkV2Fr
ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG5pZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19vcmRlcigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG9yZGVyKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2NsYXNzem9uZV9pZHgo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgY2xhc3N6b25l
X2lkeCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNz
IE1tQ29tcGFjdGlvbktjb21wYWN0ZFdha2VGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTW1Db21wYWN0aW9uS2Nv
bXBhY3RkV2FrZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
TmlkRmllbGROdW1iZXIgPSAxLAorICAgIGtPcmRlckZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ2xh
c3N6b25lSWR4RmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9uaWQoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb3Jk
ZXIoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfY2xhc3N6b25lX2lkeCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1tQ29tcGFjdGlvbktjb21wYWN0ZFNsZWVw
RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29k
ZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
ZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1tQ29tcGFjdGlvbktjb21wYWN0ZFNsZWVwRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uS2NvbXBhY3RkU2xl
ZXBGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbktjb21wYWN0ZFNsZWVwRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbmlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBNbUNvbXBhY3Rpb25LY29t
cGFjdGRTbGVlcEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNbUNvbXBhY3Rpb25LY29tcGFjdGRTbGVlcEZ0cmFj
ZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmlkRmllbGROdW1iZXIg
PSAxLAorICB9OworICB2b2lkIHNldF9uaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1tQ29tcGFjdGlvbklzb2xhdGVNaWdy
YXRlcGFnZXNGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTW1Db21wYWN0aW9uSXNvbGF0ZU1pZ3JhdGVw
YWdlc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlv
bklzb2xhdGVNaWdyYXRlcGFnZXNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbklz
b2xhdGVNaWdyYXRlcGFnZXNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19zdGFydF9wZm4oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3Qgc3RhcnRfcGZuKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19lbmRfcGZuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxp
ZCgpOyB9CisgIHVpbnQ2NF90IGVuZF9wZm4oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX25yX3NjYW5uZWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbnJfc2Nhbm5lZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnJfdGFrZW4oKSBjb25zdCB7IHJldHVybiBh
dDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbnJfdGFrZW4oKSBjb25zdCB7IHJldHVybiBh
dDw0PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBNbUNvbXBhY3Rpb25Jc29sYXRlTWln
cmF0ZXBhZ2VzRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1tQ29tcGFjdGlvbklzb2xhdGVNaWdyYXRlcGFnZXNG
dHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1N0YXJ0UGZuRmll
bGROdW1iZXIgPSAxLAorICAgIGtFbmRQZm5GaWVsZE51bWJlciA9IDIsCisgICAga05yU2Nhbm5l
ZEZpZWxkTnVtYmVyID0gMywKKyAgICBrTnJUYWtlbkZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAg
dm9pZCBzZXRfc3RhcnRfcGZuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9lbmRfcGZuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ucl9zY2FubmVkKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9ucl90YWtlbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIE1tQ29tcGFjdGlvbklzb2xhdGVGcmVlcGFnZXNGdHJhY2VFdmVu
dF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgTW1Db21wYWN0aW9uSXNvbGF0ZUZyZWVwYWdlc0Z0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rlcihk
YXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbklzb2xhdGVGcmVlcGFnZXNGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbklzb2xhdGVGcmVlcGFnZXNGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19zdGFydF9wZm4oKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc3RhcnRfcGZuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19lbmRfcGZu
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGVuZF9wZm4o
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25yX3Nj
YW5uZWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbnJf
c2Nhbm5lZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfbnJfdGFrZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgbnJfdGFrZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2NCgpOyB9Cit9Owor
CitjbGFzcyBNbUNvbXBhY3Rpb25Jc29sYXRlRnJlZXBhZ2VzRnRyYWNlRXZlbnQgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1tQ29t
cGFjdGlvbklzb2xhdGVGcmVlcGFnZXNGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga1N0YXJ0UGZuRmllbGROdW1iZXIgPSAxLAorICAgIGtFbmRQZm5GaWVsZE51
bWJlciA9IDIsCisgICAga05yU2Nhbm5lZEZpZWxkTnVtYmVyID0gMywKKyAgICBrTnJUYWtlbkZp
ZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfc3RhcnRfcGZuKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9lbmRfcGZu
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9ucl9zY2FubmVkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ucl90YWtlbih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1tQ29tcGFjdGlvbkZp
bmlzaGVkRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklF
TERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1tQ29tcGFjdGlvbkZpbmlzaGVkRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uRmluaXNoZWRGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbkZpbmlzaGVkRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmlkKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbmlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2lkeCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBpZHgoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3Vp
bnQzMigpOyB9CisgIGJvb2wgaGFzX29yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxp
ZCgpOyB9CisgIGludDMyX3Qgb3JkZXIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMy
KCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9
CisgIGludDMyX3QgcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9Cit9
OworCitjbGFzcyBNbUNvbXBhY3Rpb25GaW5pc2hlZEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNbUNvbXBhY3Rp
b25GaW5pc2hlZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
TmlkRmllbGROdW1iZXIgPSAxLAorICAgIGtJZHhGaWVsZE51bWJlciA9IDIsCisgICAga09yZGVy
RmllbGROdW1iZXIgPSAzLAorICAgIGtSZXRGaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQg
c2V0X25pZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9pZHgodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X29yZGVyKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3JldChpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTW1Db21wYWN0
aW9uRW5kRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklF
TERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1tQ29tcGFjdGlvbkVuZEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbkVuZEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgTW1Db21wYWN0aW9uRW5kRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfem9uZV9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCB6b25lX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19taWdyYXRlX3BmbigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBtaWdyYXRlX3BmbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZnJlZV9wZm4oKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZnJlZV9wZm4oKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3pvbmVfZW5kKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHpvbmVfZW5kKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zeW5jKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHN5bmMoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3N0YXR1cygpIGNvbnN0
IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHN0YXR1cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgTW1Db21wYWN0aW9uRW5k
RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IE1tQ29tcGFjdGlvbkVuZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrWm9uZVN0YXJ0RmllbGROdW1iZXIgPSAxLAorICAgIGtNaWdy
YXRlUGZuRmllbGROdW1iZXIgPSAyLAorICAgIGtGcmVlUGZuRmllbGROdW1iZXIgPSAzLAorICAg
IGtab25lRW5kRmllbGROdW1iZXIgPSA0LAorICAgIGtTeW5jRmllbGROdW1iZXIgPSA1LAorICAg
IGtTdGF0dXNGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X3pvbmVfc3RhcnQodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X21pZ3JhdGVfcGZuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9mcmVlX3Bmbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfem9uZV9lbmQodWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N5
bmModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3N0YXR1cyhpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZh
bHVlKTsKKyAgfQorfTsKKworY2xhc3MgTW1Db21wYWN0aW9uRGVmZXJSZXNldEZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBNbUNvbXBhY3Rpb25EZWZlclJlc2V0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uRGVmZXJSZXNldEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgTW1Db21wYWN0aW9uRGVmZXJSZXNldEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IG5pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIo
KTsgfQorICBib29sIGhhc19pZHgoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgdWludDMyX3QgaWR4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBp
bnQzMl90IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJv
b2wgaGFzX2NvbnNpZGVyZWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgY29uc2lkZXJlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7
IH0KKyAgYm9vbCBoYXNfZGVmZXJfc2hpZnQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgZGVmZXJfc2hpZnQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX29yZGVyX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG9yZGVyX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDY+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgTW1Db21wYWN0aW9uRGVmZXJSZXNl
dEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBNbUNvbXBhY3Rpb25EZWZlclJlc2V0RnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOaWRGaWVsZE51bWJlciA9IDEsCisgICAga0lk
eEZpZWxkTnVtYmVyID0gMiwKKyAgICBrT3JkZXJGaWVsZE51bWJlciA9IDMsCisgICAga0NvbnNp
ZGVyZWRGaWVsZE51bWJlciA9IDQsCisgICAga0RlZmVyU2hpZnRGaWVsZE51bWJlciA9IDUsCisg
ICAga09yZGVyRmFpbGVkRmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNldF9uaWQoaW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfaWR4KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9vcmRlcihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jb25zaWRlcmVkKHVpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kZWZlcl9zaGlmdCh1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfb3JkZXJfZmFpbGVkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBNbUNvbXBhY3Rpb25EZWZlcnJlZEZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBNbUNvbXBhY3Rpb25EZWZlcnJlZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbkRlZmVycmVkRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBNbUNvbXBhY3Rpb25EZWZlcnJlZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX25pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICBpbnQzMl90IG5pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQor
ICBib29sIGhhc19pZHgoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3QgaWR4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X2NvbnNpZGVyZWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgY29uc2lkZXJlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfZGVmZXJfc2hpZnQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0K
KyAgdWludDMyX3QgZGVmZXJfc2hpZnQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX29yZGVyX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
dmFsaWQoKTsgfQorICBpbnQzMl90IG9yZGVyX2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+
KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgTW1Db21wYWN0aW9uRGVmZXJyZWRGdHJhY2VF
dmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gTW1Db21wYWN0aW9uRGVmZXJyZWRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga05pZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrSWR4RmllbGROdW1i
ZXIgPSAyLAorICAgIGtPcmRlckZpZWxkTnVtYmVyID0gMywKKyAgICBrQ29uc2lkZXJlZEZpZWxk
TnVtYmVyID0gNCwKKyAgICBrRGVmZXJTaGlmdEZpZWxkTnVtYmVyID0gNSwKKyAgICBrT3JkZXJG
YWlsZWRGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X25pZChpbnQzMl90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pZHgodWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X29yZGVyKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2NvbnNpZGVyZWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RlZmVyX3NoaWZ0KHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vcmRl
cl9mYWlsZWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7Cisg
IH0KK307CisKK2NsYXNzIE1tQ29tcGFjdGlvbkRlZmVyQ29tcGFjdGlvbkZ0cmFjZUV2ZW50X0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBNbUNvbXBhY3Rpb25EZWZlckNvbXBhY3Rpb25GdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBNbUNvbXBhY3Rpb25EZWZlckNvbXBhY3Rpb25GdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9
CisgIGV4cGxpY2l0IE1tQ29tcGFjdGlvbkRlZmVyQ29tcGFjdGlvbkZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25pZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG5pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19pZHgoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgaWR4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQz
MigpOyB9CisgIGJvb2wgaGFzX2NvbnNpZGVyZWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZh
bGlkKCk7IH0KKyAgdWludDMyX3QgY29uc2lkZXJlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCku
YXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZGVmZXJfc2hpZnQoKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZGVmZXJfc2hpZnQoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX29yZGVyX2ZhaWxlZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG9yZGVyX2ZhaWxlZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgTW1Db21wYWN0
aW9uRGVmZXJDb21wYWN0aW9uRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1tQ29tcGFjdGlvbkRlZmVyQ29tcGFj
dGlvbkZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmlkRmll
bGROdW1iZXIgPSAxLAorICAgIGtJZHhGaWVsZE51bWJlciA9IDIsCisgICAga09yZGVyRmllbGRO
dW1iZXIgPSAzLAorICAgIGtDb25zaWRlcmVkRmllbGROdW1iZXIgPSA0LAorICAgIGtEZWZlclNo
aWZ0RmllbGROdW1iZXIgPSA1LAorICAgIGtPcmRlckZhaWxlZEZpZWxkTnVtYmVyID0gNiwKKyAg
fTsKKyAgdm9pZCBzZXRfbmlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lkeCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb3JkZXIoaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29uc2lkZXJl
ZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfZGVmZXJfc2hpZnQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29yZGVyX2ZhaWxlZChpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTW1Db21wYWN0
aW9uQmVnaW5GdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTW1Db21wYWN0aW9uQmVnaW5GdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBNbUNvbXBhY3Rpb25CZWdpbkZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgTW1Db21wYWN0aW9uQmVnaW5GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRh
dGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc196b25lX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHpvbmVfc3RhcnQoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX21pZ3JhdGVfcGZuKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG1pZ3JhdGVfcGZuKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mcmVlX3Bmbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBmcmVlX3Bmbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfem9uZV9l
bmQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgem9uZV9l
bmQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3N5
bmMoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgc3luYygp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIE1tQ29t
cGFjdGlvbkJlZ2luRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1tQ29tcGFjdGlvbkJlZ2luRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtab25lU3RhcnRGaWVsZE51bWJlciA9
IDEsCisgICAga01pZ3JhdGVQZm5GaWVsZE51bWJlciA9IDIsCisgICAga0ZyZWVQZm5GaWVsZE51
bWJlciA9IDMsCisgICAga1pvbmVFbmRGaWVsZE51bWJlciA9IDQsCisgICAga1N5bmNGaWVsZE51
bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X3pvbmVfc3RhcnQodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21pZ3JhdGVfcGZu
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9mcmVlX3Bmbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfem9uZV9lbmQodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N5bmModWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVz
cGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1
ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3Bl
cmZldHRvL3RyYWNlL2Z0cmFjZS9leHQ0LnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRo
ZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9FWFQ0X1BST1RPX0hfCisj
ZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX0VYVDRf
UFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
bWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90
b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgRXh0NFplcm9SYW5nZUZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBFeHQ0WmVyb1JhbmdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50
OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30K
KyAgZXhwbGljaXQgRXh0NFplcm9SYW5nZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NFplcm9S
YW5nZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX29mZnNldCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IG9mZnNldCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfbW9kZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG1vZGUoKSBjb25zdCB7IHJldHVybiBhdDw1
PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRaZXJvUmFuZ2VGdHJhY2VFdmVudCA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gRXh0NFplcm9SYW5nZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAg
a09mZnNldEZpZWxkTnVtYmVyID0gMywKKyAgICBrTGVuRmllbGROdW1iZXIgPSA0LAorICAgIGtN
b2RlRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfb2Zmc2V0KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2xlbihpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9tb2RlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0V3JpdGVwYWdlc1Jlc3Vs
dEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNv
ZGVyPC8qTUFYX0ZJRUxEX0lEPSovNywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0q
L2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0V3JpdGVwYWdlc1Jlc3VsdEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRXcml0ZXBhZ2VzUmVzdWx0RnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBFeHQ0V3JpdGVwYWdlc1Jlc3VsdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX3JldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsg
fQorICBpbnQzMl90IHJldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQor
ICBib29sIGhhc19wYWdlc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgp
OyB9CisgIGludDMyX3QgcGFnZXNfd3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNf
aW50MzIoKTsgfQorICBib29sIGhhc19wYWdlc19za2lwcGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8
NT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgcGFnZXNfc2tpcHBlZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDU+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc193cml0ZWJhY2tfaW5kZXgoKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgd3JpdGViYWNrX2luZGV4
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zeW5j
X21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBzeW5j
X21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNz
IEV4dDRXcml0ZXBhZ2VzUmVzdWx0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRXcml0ZXBhZ2VzUmVzdWx0
RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51
bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUmV0RmllbGROdW1iZXIg
PSAzLAorICAgIGtQYWdlc1dyaXR0ZW5GaWVsZE51bWJlciA9IDQsCisgICAga1BhZ2VzU2tpcHBl
ZEZpZWxkTnVtYmVyID0gNSwKKyAgICBrV3JpdGViYWNrSW5kZXhGaWVsZE51bWJlciA9IDYsCisg
ICAga1N5bmNNb2RlRmllbGROdW1iZXIgPSA3LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3BhZ2VzX3dyaXR0ZW4oaW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFnZXNfc2tpcHBlZChp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF93cml0ZWJhY2tfaW5kZXgodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N5bmNfbW9kZShpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NFdyaXRlcGFn
ZXNGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEwLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERT
PSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRXcml0ZXBhZ2VzRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRh
dGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NFdyaXRlcGFnZXNGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IEV4dDRXcml0ZXBhZ2VzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkg
e30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfbnJfdG9fd3JpdGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCBucl90b193cml0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsgfQor
ICBib29sIGhhc19wYWdlc19za2lwcGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgp
OyB9CisgIGludDY0X3QgcGFnZXNfc2tpcHBlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNf
aW50NjQoKTsgfQorICBib29sIGhhc19yYW5nZV9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHJhbmdlX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8
NT4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3JhbmdlX2VuZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHJhbmdlX2VuZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDY+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc193cml0ZWJhY2tfaW5kZXgoKSBjb25z
dCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgd3JpdGViYWNrX2luZGV4
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zeW5j
X21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBzeW5j
X21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNf
Zm9yX2t1cGRhdGUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgZm9yX2t1cGRhdGUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQzMigpOyB9Cisg
IGJvb2wgaGFzX3JhbmdlX2N5Y2xpYygpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLnZhbGlkKCk7
IH0KKyAgdWludDMyX3QgcmFuZ2VfY3ljbGljKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkuYXNf
dWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRXcml0ZXBhZ2VzRnRyYWNlRXZlbnQgOiBwdWJs
aWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4
dDRXcml0ZXBhZ2VzRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAg
IGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrTnJU
b1dyaXRlRmllbGROdW1iZXIgPSAzLAorICAgIGtQYWdlc1NraXBwZWRGaWVsZE51bWJlciA9IDQs
CisgICAga1JhbmdlU3RhcnRGaWVsZE51bWJlciA9IDUsCisgICAga1JhbmdlRW5kRmllbGROdW1i
ZXIgPSA2LAorICAgIGtXcml0ZWJhY2tJbmRleEZpZWxkTnVtYmVyID0gNywKKyAgICBrU3luY01v
ZGVGaWVsZE51bWJlciA9IDgsCisgICAga0Zvckt1cGRhdGVGaWVsZE51bWJlciA9IDksCisgICAg
a1JhbmdlQ3ljbGljRmllbGROdW1iZXIgPSAxMCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X25yX3RvX3dyaXRlKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhZ2VzX3NraXBwZWQoaW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmFuZ2Vf
c3RhcnQoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfcmFuZ2VfZW5kKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3dyaXRlYmFja19pbmRleCh1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3luY19t
b2RlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2Zvcl9rdXBkYXRlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yYW5nZV9jeWNsaWModWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMTAsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NFdy
aXRlcGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0V3JpdGVwYWdlRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NFdyaXRlcGFnZUZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgRXh0NFdyaXRlcGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGluZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xh
c3MgRXh0NFdyaXRlcGFnZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0V3JpdGVwYWdlRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisg
ICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrSW5kZXhGaWVsZE51bWJlciA9IDMsCisgIH07
CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbmRleCh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRXcml0
ZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9E
ZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxE
Uz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0V3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0V3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0
IEV4dDRXcml0ZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBp
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3Bv
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHBvcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25z
dCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGVuKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19jb3BpZWQoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgY29waWVkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NFdyaXRlRW5kRnRy
YWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IEV4dDRXcml0ZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9
IDIsCisgICAga1Bvc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrTGVuRmllbGROdW1iZXIgPSA0LAor
ICAgIGtDb3BpZWRGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
aW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9wb3MoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jb3BpZWQodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0V3JpdGVC
ZWdpbkZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9E
ZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxE
Uz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0V3JpdGVCZWdpbkZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rlcihk
YXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRXcml0ZUJlZ2luRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBFeHQ0V3JpdGVCZWdpbkZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX3BvcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHBv
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19sZW4o
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGVuKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19mbGFncygpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmbGFncygpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRXcml0ZUJl
Z2luRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEV4dDRXcml0ZUJlZ2luRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxk
TnVtYmVyID0gMiwKKyAgICBrUG9zRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJl
ciA9IDQsCisgICAga0ZsYWdzRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcG9zKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxhZ3ModWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0
VW5saW5rRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0VW5saW5rRXhpdEZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVj
b2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRVbmxpbmtFeGl0RnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQor
ICBleHBsaWNpdCBFeHQ0VW5saW5rRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX3JldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHJldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xh
c3MgRXh0NFVubGlua0V4aXRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NFVubGlua0V4aXRGdHJhY2VFdmVu
dF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwK
KyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtSZXRGaWVsZE51bWJlciA9IDMsCisgIH07
CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZXQoaW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRVbmxpbmtF
bnRlckZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9E
ZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxE
Uz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0VW5saW5rRW50ZXJGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0VW5saW5rRW50ZXJGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4
cGxpY2l0IEV4dDRVbmxpbmtFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX3BhcmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBwYXJlbnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50NjRf
dCBzaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFz
cyBFeHQ0VW5saW5rRW50ZXJGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NFVubGlua0VudGVyRnRyYWNlRXZl
bnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEs
CisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGFyZW50RmllbGROdW1iZXIgPSAzLAor
ICAgIGtTaXplRmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lu
byh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcGFyZW50KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9zaXplKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0VHJ1bmNhdGVFeGl0RnRyYWNl
RXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypN
QVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+
IHsKKyBwdWJsaWM6CisgIEV4dDRUcnVuY2F0ZUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBFeHQ0VHJ1bmNhdGVFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBF
eHQ0VHJ1bmNhdGVFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
YmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJs
b2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNz
IEV4dDRUcnVuY2F0ZUV4aXRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NFRydW5jYXRlRXhpdEZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAx
LAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga0Jsb2Nrc0ZpZWxkTnVtYmVyID0gMywK
KyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Jsb2Nrcyh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4
dDRUcnVuY2F0ZUVudGVyRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRUcnVuY2F0ZUVudGVyRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVk
UHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NFRydW5jYXRlRW50ZXJG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5z
aXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRUcnVuY2F0ZUVudGVyRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNf
dWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNf
dWludDY0KCk7IH0KK307CisKK2NsYXNzIEV4dDRUcnVuY2F0ZUVudGVyRnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IEV4dDRUcnVuY2F0ZUVudGVyRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qg
eworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrQmxvY2tzRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lu
byh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfYmxvY2tzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NFRyaW1FeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgRXh0NFRyaW1FeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBFeHQ0VHJpbUV4dGVudEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NFRyaW1FeHRlbnRGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXZfbWFq
b3IoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBkZXZfbWFq
b3IoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZGV2
X21pbm9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZGV2
X21pbm9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X2dyb3VwKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGdy
b3VwKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19z
dGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHN0YXJ0
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2xlbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGxlbigpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NFRyaW1FeHRl
bnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgor
ICB1c2luZyBEZWNvZGVyID0gRXh0NFRyaW1FeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0Rldk1ham9yRmllbGROdW1iZXIgPSAxLAorICAgIGtEZXZN
aW5vckZpZWxkTnVtYmVyID0gMiwKKyAgICBrR3JvdXBGaWVsZE51bWJlciA9IDMsCisgICAga1N0
YXJ0RmllbGROdW1iZXIgPSA0LAorICAgIGtMZW5GaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZv
aWQgc2V0X2Rldl9tYWpvcihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9kZXZfbWlub3IoaW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZ3JvdXAodWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXJ0
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2xlbihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsK
KyAgfQorfTsKKworY2xhc3MgRXh0NFRyaW1BbGxGcmVlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4
dDRUcmltQWxsRnJlZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4
dDRUcmltQWxsRnJlZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NFRyaW1BbGxGcmVlRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2X21ham9y
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZGV2X21ham9y
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2Rldl9t
aW5vcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGRldl9t
aW5vcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19n
cm91cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBncm91
cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3Rh
cnQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBzdGFydCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19sZW4oKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBsZW4oKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRUcmltQWxsRnJl
ZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBFeHQ0VHJpbUFsbEZyZWVGdHJhY2VFdmVudF9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0Rldk1ham9yRmllbGROdW1iZXIgPSAxLAorICAgIGtEZXZN
aW5vckZpZWxkTnVtYmVyID0gMiwKKyAgICBrR3JvdXBGaWVsZE51bWJlciA9IDMsCisgICAga1N0
YXJ0RmllbGROdW1iZXIgPSA0LAorICAgIGtMZW5GaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZv
aWQgc2V0X2Rldl9tYWpvcihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9kZXZfbWlub3IoaW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZ3JvdXAodWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXJ0
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2xlbihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsK
KyAgfQorfTsKKworY2xhc3MgRXh0NFN5bmNGc0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNf
Tk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0U3lu
Y0ZzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6
IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NFN5bmNGc0Z0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgRXh0NFN5bmNGc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX3dhaXQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCB3YWl0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigp
OyB9Cit9OworCitjbGFzcyBFeHQ0U3luY0ZzRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRTeW5jRnNGdHJh
Y2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrV2FpdEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF93YWl0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOwor
ICB9Cit9OworCitjbGFzcyBFeHQ0UmVxdWVzdElub2RlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4
dDRSZXF1ZXN0SW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBF
eHQ0UmVxdWVzdElub2RlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJh
dy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0UmVxdWVzdElub2RlRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZGlyKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRpcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbW9kZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtb2RlKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NFJlcXVlc3RJbm9kZUZ0cmFj
ZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5n
IERlY29kZXIgPSBFeHQ0UmVxdWVzdElub2RlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0RpckZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrTW9kZUZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9kaXIodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X21vZGUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0UmVxdWVzdEJsb2Nrc0Z0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMTAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgRXh0NFJlcXVlc3RCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7
fQorICBleHBsaWNpdCBFeHQ0UmVxdWVzdEJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0
NFJlcXVlc3RCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
aW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19s
ZW4oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19sb2dpY2Fs
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxvZ2ljYWwo
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2xsZWZ0
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxsZWZ0KCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19scmlnaHQo
KSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbHJpZ2h0KCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19nb2FsKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGdvYWwoKSBjb25z
dCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3BsZWZ0KCkgY29u
c3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBsZWZ0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8OD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wcmlnaHQoKSBjb25z
dCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcHJpZ2h0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8OT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0
IHsgcmV0dXJuIGF0PDEwPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7
IHJldHVybiBhdDwxMD4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NFJlcXVlc3RC
bG9ja3NGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gRXh0NFJlcXVlc3RCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5v
RmllbGROdW1iZXIgPSAyLAorICAgIGtMZW5GaWVsZE51bWJlciA9IDMsCisgICAga0xvZ2ljYWxG
aWVsZE51bWJlciA9IDQsCisgICAga0xsZWZ0RmllbGROdW1iZXIgPSA1LAorICAgIGtMcmlnaHRG
aWVsZE51bWJlciA9IDYsCisgICAga0dvYWxGaWVsZE51bWJlciA9IDcsCisgICAga1BsZWZ0Rmll
bGROdW1iZXIgPSA4LAorICAgIGtQcmlnaHRGaWVsZE51bWJlciA9IDksCisgICAga0ZsYWdzRmll
bGROdW1iZXIgPSAxMCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xl
bih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfbG9naWNhbCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGxlZnQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xyaWdodCh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZ29hbCh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcGxlZnQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3ByaWdodCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg5LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMTAsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NFJlbW92
ZUJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0UmVtb3ZlQmxvY2tzRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NFJlbW92ZUJsb2Nrc0Z0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgRXh0NFJlbW92ZUJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX2Zyb20oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgZnJvbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfdG8oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgdG8oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X3BhcnRpYWwoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBw
YXJ0aWFsKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X2VlX3BibGsoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
ZWVfcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfZWVfbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBlZV9sYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19lZV9sZW4oKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgZWVfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgRXh0NFJlbW92ZUJsb2Nrc0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0UmVtb3ZlQmxvY2tzRnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJl
ciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrRnJvbUZpZWxkTnVtYmVyID0g
MywKKyAgICBrVG9GaWVsZE51bWJlciA9IDQsCisgICAga1BhcnRpYWxGaWVsZE51bWJlciA9IDUs
CisgICAga0VlUGJsa0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrRWVMYmxrRmllbGROdW1iZXIgPSA3
LAorICAgIGtFZUxlbkZpZWxkTnVtYmVyID0gOCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2Zyb20odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RvKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYXJ0aWFsKGludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2VlX3BibGso
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2VlX2xibGsodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNywgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2VlX2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCg4LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRSZWxlYXNlcGFnZUZ0cmFj
ZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBFeHQ0UmVsZWFzZXBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBFeHQ0UmVsZWFzZXBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4
dDRSZWxlYXNlcGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBp
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lu
ZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGluZGV4
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgRXh0
NFJlbGVhc2VwYWdlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRSZWxlYXNlcGFnZUZ0cmFjZUV2ZW50X0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAg
IGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga0luZGV4RmllbGROdW1iZXIgPSAzLAorICB9Owor
ICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5kZXgodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0UmVhZHBh
Z2VGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NFJlYWRwYWdlRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgRXh0NFJlYWRwYWdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBF
eHQ0UmVhZHBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5v
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbmRl
eCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbmRleCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIEV4dDRS
ZWFkcGFnZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0UmVhZHBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmll
bGROdW1iZXIgPSAyLAorICAgIGtJbmRleEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBz
ZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2luZGV4KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NFJlYWRCbG9ja0JpdG1h
cExvYWRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NFJlYWRCbG9ja0JpdG1hcExvYWRGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0UmVhZEJsb2NrQml0bWFwTG9h
ZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3
LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NFJlYWRCbG9ja0JpdG1hcExvYWRGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ncm91cCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBncm91cCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRSZWFkQmxvY2tCaXRtYXBM
b2FkRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEV4dDRSZWFkQmxvY2tCaXRtYXBMb2FkRnRyYWNlRXZlbnRfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAg
a0dyb3VwRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2dyb3Vw
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsK
KworY2xhc3MgRXh0NFB1bmNoSG9sZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0UHVuY2hIb2xl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NFB1bmNoSG9sZUZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgRXh0NFB1bmNoSG9sZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX29mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQo
KTsgfQorICBpbnQ2NF90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQo
KTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0K
KyAgaW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2ludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IG1vZGUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0KK307CisKK2Ns
YXNzIEV4dDRQdW5jaEhvbGVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NFB1bmNoSG9sZUZ0cmFjZUV2ZW50
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAor
ICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga09mZnNldEZpZWxkTnVtYmVyID0gMywKKyAg
ICBrTGVuRmllbGROdW1iZXIgPSA0LAorICAgIGtNb2RlRmllbGROdW1iZXIgPSA1LAorICB9Owor
ICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb2Zmc2V0KGludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbihpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9t
b2RlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9
OworCitjbGFzcyBFeHQ0T3RoZXJJbm9kZVVwZGF0ZVRpbWVGdHJhY2VFdmVudF9EZWNvZGVyIDog
cHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYs
IC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAg
RXh0NE90aGVySW5vZGVVcGRhdGVUaW1lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgRXh0NE90aGVySW5vZGVVcGRhdGVUaW1lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBF
eHQ0T3RoZXJJbm9kZVVwZGF0ZVRpbWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19vcmlnX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBvcmlnX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfdWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9v
bCBoYXNfZ2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGdpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNf
bW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtb2Rl
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0
NE90aGVySW5vZGVVcGRhdGVUaW1lRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRPdGhlcklub2RlVXBkYXRl
VGltZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2Rmll
bGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga09yaWdJbm9GaWVs
ZE51bWJlciA9IDMsCisgICAga1VpZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrR2lkRmllbGROdW1i
ZXIgPSA1LAorICAgIGtNb2RlRmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNldF9kZXYo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfb3JpZ19pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3VpZCh1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZ2lkKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9t
b2RlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQor
fTsKKworY2xhc3MgRXh0NE1iYWxsb2NQcmVhbGxvY0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMTAsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0
NE1iYWxsb2NQcmVhbGxvY0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEV4dDRNYmFsbG9jUHJlYWxsb2NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRNYmFsbG9jUHJl
YWxsb2NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhh
c19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8o
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19vcmlnX2xvZ2lj
YWwoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgb3JpZ19s
b2dpY2FsKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhh
c19vcmlnX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMy
X3Qgb3JpZ19zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc19vcmlnX2dyb3VwKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IG9yaWdfZ3JvdXAoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX29yaWdfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgp
OyB9CisgIGludDMyX3Qgb3JpZ19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2ludDMy
KCk7IH0KKyAgYm9vbCBoYXNfcmVzdWx0X2xvZ2ljYWwoKSBjb25zdCB7IHJldHVybiBhdDw3Pigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcmVzdWx0X2xvZ2ljYWwoKSBjb25zdCB7IHJldHVybiBh
dDw3PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3Jlc3VsdF9zdGFydCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJlc3VsdF9zdGFydCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDg+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19yZXN1bHRfZ3JvdXAo
KSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcmVzdWx0X2dy
b3VwKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19y
ZXN1bHRfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IHJlc3VsdF9sZW4oKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS5hc19pbnQzMigpOyB9Cit9Owor
CitjbGFzcyBFeHQ0TWJhbGxvY1ByZWFsbG9jRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRNYmFsbG9jUHJl
YWxsb2NGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtPcmlnTG9naWNh
bEZpZWxkTnVtYmVyID0gMywKKyAgICBrT3JpZ1N0YXJ0RmllbGROdW1iZXIgPSA0LAorICAgIGtP
cmlnR3JvdXBGaWVsZE51bWJlciA9IDUsCisgICAga09yaWdMZW5GaWVsZE51bWJlciA9IDYsCisg
ICAga1Jlc3VsdExvZ2ljYWxGaWVsZE51bWJlciA9IDcsCisgICAga1Jlc3VsdFN0YXJ0RmllbGRO
dW1iZXIgPSA4LAorICAgIGtSZXN1bHRHcm91cEZpZWxkTnVtYmVyID0gOSwKKyAgICBrUmVzdWx0
TGVuRmllbGROdW1iZXIgPSAxMCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X29yaWdfbG9naWNhbCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb3JpZ19zdGFydChpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vcmlnX2dyb3VwKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9vcmlnX2xlbihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9yZXN1bHRfbG9naWNhbCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmVzdWx0X3N0YXJ0KGludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X3Jlc3VsdF9ncm91cCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg5LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmVzdWx0X2xlbihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEwLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRNYmFsbG9jRnJlZUZ0
cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2Zh
bHNlPiB7CisgcHVibGljOgorICBFeHQ0TWJhbGxvY0ZyZWVGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBFeHQ0TWJhbGxvY0ZyZWVGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0
IEV4dDRNYmFsbG9jRnJlZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9
CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X3Jlc3VsdF9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHJlc3VsdF9zdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQor
ICBib29sIGhhc19yZXN1bHRfZ3JvdXAoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7
IH0KKyAgdWludDMyX3QgcmVzdWx0X2dyb3VwKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19yZXN1bHRfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS52YWxpZCgpOyB9CisgIGludDMyX3QgcmVzdWx0X2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NE1iYWxsb2NGcmVlRnRyYWNlRXZlbnQg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IEV4dDRNYmFsbG9jRnJlZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisg
ICAga1Jlc3VsdFN0YXJ0RmllbGROdW1iZXIgPSAzLAorICAgIGtSZXN1bHRHcm91cEZpZWxkTnVt
YmVyID0gNCwKKyAgICBrUmVzdWx0TGVuRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNl
dF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmVzdWx0X3N0YXJ0KGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Jlc3VsdF9ncm91cCh1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcmVzdWx0X2xlbihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZh
bHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NE1iYWxsb2NEaXNjYXJkRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIEV4dDRNYmFsbG9jRGlzY2FyZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9Cisg
IGV4cGxpY2l0IEV4dDRNYmFsbG9jRGlzY2FyZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NE1i
YWxsb2NEaXNjYXJkRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlu
bygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmVz
dWx0X3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
cmVzdWx0X3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJv
b2wgaGFzX3Jlc3VsdF9ncm91cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQor
ICB1aW50MzJfdCByZXN1bHRfZ3JvdXAoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX3Jlc3VsdF9sZW4oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCByZXN1bHRfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5h
c19pbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0TWJhbGxvY0Rpc2NhcmRGdHJhY2VFdmVudCA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gRXh0NE1iYWxsb2NEaXNjYXJkRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMy
X3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwK
KyAgICBrUmVzdWx0U3RhcnRGaWVsZE51bWJlciA9IDMsCisgICAga1Jlc3VsdEdyb3VwRmllbGRO
dW1iZXIgPSA0LAorICAgIGtSZXN1bHRMZW5GaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQg
c2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZXN1bHRfc3RhcnQoaW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmVzdWx0X2dyb3Vw
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9yZXN1bHRfbGVuKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0TWJhbGxvY0FsbG9jRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8yMCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBFeHQ0TWJhbGxvY0FsbG9jRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgRXh0NE1iYWxsb2NBbGxvY0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NE1iYWxs
b2NBbGxvY0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBk
ZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lu
bygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX29yaWdfbG9n
aWNhbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBvcmln
X2xvZ2ljYWwoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wg
aGFzX29yaWdfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCBvcmlnX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX29yaWdfZ3JvdXAoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0K
KyAgdWludDMyX3Qgb3JpZ19ncm91cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMy
KCk7IH0KKyAgYm9vbCBoYXNfb3JpZ19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBvcmlnX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfaW50
MzIoKTsgfQorICBib29sIGhhc19nb2FsX2xvZ2ljYWwoKSBjb25zdCB7IHJldHVybiBhdDw3Pigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZ29hbF9sb2dpY2FsKCkgY29uc3QgeyByZXR1cm4gYXQ8
Nz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19nb2FsX3N0YXJ0KCkgY29uc3QgeyByZXR1
cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZ29hbF9zdGFydCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDg+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19nb2FsX2dyb3VwKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGdvYWxfZ3JvdXAoKSBjb25z
dCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2dvYWxfbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGdvYWxfbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MTA+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19yZXN1bHRf
bG9naWNhbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
cmVzdWx0X2xvZ2ljYWwoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc19yZXN1bHRfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS52YWxpZCgp
OyB9CisgIGludDMyX3QgcmVzdWx0X3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkuYXNf
aW50MzIoKTsgfQorICBib29sIGhhc19yZXN1bHRfZ3JvdXAoKSBjb25zdCB7IHJldHVybiBhdDwx
Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHJlc3VsdF9ncm91cCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDEzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3Jlc3VsdF9sZW4oKSBjb25zdCB7
IHJldHVybiBhdDwxND4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmVzdWx0X2xlbigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE0PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZm91bmQoKSBjb25z
dCB7IHJldHVybiBhdDwxNT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGZvdW5kKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTU+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZ3JvdXBzKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBncm91cHMoKSBjb25z
dCB7IHJldHVybiBhdDwxNj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19idWRkeSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE3PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYnVkZHkoKSBjb25z
dCB7IHJldHVybiBhdDwxNz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19mbGFncygpIGNv
bnN0IHsgcmV0dXJuIGF0PDE4PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25z
dCB7IHJldHVybiBhdDwxOD4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc190YWlsKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTk+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB0YWlsKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTk+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfY3IoKSBjb25zdCB7
IHJldHVybiBhdDwyMD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNyKCkgY29uc3QgeyByZXR1
cm4gYXQ8MjA+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRNYmFsbG9jQWxsb2NG
dHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1
c2luZyBEZWNvZGVyID0gRXh0NE1iYWxsb2NBbGxvY0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51
bWJlciA9IDIsCisgICAga09yaWdMb2dpY2FsRmllbGROdW1iZXIgPSAzLAorICAgIGtPcmlnU3Rh
cnRGaWVsZE51bWJlciA9IDQsCisgICAga09yaWdHcm91cEZpZWxkTnVtYmVyID0gNSwKKyAgICBr
T3JpZ0xlbkZpZWxkTnVtYmVyID0gNiwKKyAgICBrR29hbExvZ2ljYWxGaWVsZE51bWJlciA9IDcs
CisgICAga0dvYWxTdGFydEZpZWxkTnVtYmVyID0gOCwKKyAgICBrR29hbEdyb3VwRmllbGROdW1i
ZXIgPSA5LAorICAgIGtHb2FsTGVuRmllbGROdW1iZXIgPSAxMCwKKyAgICBrUmVzdWx0TG9naWNh
bEZpZWxkTnVtYmVyID0gMTEsCisgICAga1Jlc3VsdFN0YXJ0RmllbGROdW1iZXIgPSAxMiwKKyAg
ICBrUmVzdWx0R3JvdXBGaWVsZE51bWJlciA9IDEzLAorICAgIGtSZXN1bHRMZW5GaWVsZE51bWJl
ciA9IDE0LAorICAgIGtGb3VuZEZpZWxkTnVtYmVyID0gMTUsCisgICAga0dyb3Vwc0ZpZWxkTnVt
YmVyID0gMTYsCisgICAga0J1ZGR5RmllbGROdW1iZXIgPSAxNywKKyAgICBrRmxhZ3NGaWVsZE51
bWJlciA9IDE4LAorICAgIGtUYWlsRmllbGROdW1iZXIgPSAxOSwKKyAgICBrQ3JGaWVsZE51bWJl
ciA9IDIwLAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb3JpZ19sb2dp
Y2FsKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9vcmlnX3N0YXJ0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29yaWdfZ3JvdXAodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29yaWdfbGVuKGlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2dvYWxfbG9naWNhbCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZ29hbF9zdGFydChpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9nb2FsX2dyb3VwKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9nb2FsX2xlbihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEwLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcmVzdWx0X2xvZ2ljYWwodWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZXN1bHRfc3RhcnQoaW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3Jlc3VsdF9ncm91cCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMywg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Jlc3VsdF9sZW4oaW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZvdW5kKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
Z3JvdXBzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE2LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfYnVkZHkodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MTcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RhaWwodWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9j
cih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyMCwgdmFsdWUpOworICB9Cit9
OworCitjbGFzcyBFeHQ0TWJSZWxlYXNlSW5vZGVQYUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0
TWJSZWxlYXNlSW5vZGVQYUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEV4dDRNYlJlbGVhc2VJbm9kZVBhRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0TWJSZWxlYXNl
SW5vZGVQYUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBk
ZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lu
bygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Jsb2NrKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJsb2NrKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19jb3VudCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjb3VudCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRNYlJlbGVh
c2VJbm9kZVBhRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRNYlJlbGVhc2VJbm9kZVBhRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisg
ICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrQmxvY2tGaWVsZE51bWJlciA9IDMsCisgICAg
a0NvdW50RmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfYmxvY2sodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X2NvdW50KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NE1iUmVsZWFzZUdyb3VwUGFGdHJh
Y2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxz
ZT4geworIHB1YmxpYzoKKyAgRXh0NE1iUmVsZWFzZUdyb3VwUGFGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0TWJSZWxlYXNlR3JvdXBQYUZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgRXh0NE1iUmVsZWFzZUdyb3VwUGFGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEs
IHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19wYV9wc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgcGFfcHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19wYV9sZW4oKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcGFfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5h
c191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NE1iUmVsZWFzZUdyb3VwUGFGdHJhY2VFdmVu
dCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNv
ZGVyID0gRXh0NE1iUmVsZWFzZUdyb3VwUGFGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGFQc3RhcnRGaWVsZE51
bWJlciA9IDIsCisgICAga1BhTGVuRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9k
ZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3BhX3BzdGFydCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFfbGVuKHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NE1iTmV3SW5vZGVQ
YUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNv
ZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0q
L2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0TWJOZXdJbm9kZVBhRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRh
dGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NE1iTmV3SW5vZGVQYUZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgRXh0NE1iTmV3SW5vZGVQYUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX3BhX3BzdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBwYV9wc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX3BhX2xzdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBwYV9sc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX3BhX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBwYV9sZW4oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQz
MigpOyB9Cit9OworCitjbGFzcyBFeHQ0TWJOZXdJbm9kZVBhRnRyYWNlRXZlbnQgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRN
Yk5ld0lub2RlUGFGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtQYVBz
dGFydEZpZWxkTnVtYmVyID0gMywKKyAgICBrUGFMc3RhcnRGaWVsZE51bWJlciA9IDQsCisgICAg
a1BhTGVuRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcGFfcHN0YXJ0KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9wYV9sc3RhcnQodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhX2xlbih1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4
dDRNYk5ld0dyb3VwUGFGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NE1iTmV3R3JvdXBQYUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRNYk5ld0dyb3VwUGFGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IEV4dDRNYk5ld0dyb3VwUGFGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19wYV9wc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgcGFfcHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19wYV9sc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGFfbHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8
ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wYV9sZW4oKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcGFfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8
NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NE1iTmV3R3JvdXBQYUZ0cmFjZUV2
ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBFeHQ0TWJOZXdHcm91cFBhRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0g
MiwKKyAgICBrUGFQc3RhcnRGaWVsZE51bWJlciA9IDMsCisgICAga1BhTHN0YXJ0RmllbGROdW1i
ZXIgPSA0LAorICAgIGtQYUxlbkZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3BhX3BzdGFydCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFfbHN0YXJ0KHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYV9s
ZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9
OworCitjbGFzcyBFeHQ0TWJEaXNjYXJkUHJlYWxsb2NhdGlvbnNGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgRXh0NE1iRGlzY2FyZFByZWFsbG9jYXRpb25zRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgRXh0NE1iRGlzY2FyZFByZWFsbG9jYXRpb25zRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBFeHQ0TWJEaXNjYXJkUHJlYWxsb2NhdGlvbnNGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19uZWVkZWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgaW50MzJfdCBuZWVkZWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFz
X2ludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRNYkRpc2NhcmRQcmVhbGxvY2F0aW9uc0Z0cmFj
ZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5n
IERlY29kZXIgPSBFeHQ0TWJEaXNjYXJkUHJlYWxsb2NhdGlvbnNGdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmVl
ZGVkRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25lZWRlZChp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKwor
Y2xhc3MgRXh0NE1iQnVkZHlCaXRtYXBMb2FkRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRNYkJ1
ZGR5Qml0bWFwTG9hZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4
dDRNYkJ1ZGR5Qml0bWFwTG9hZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NE1iQnVkZHlCaXRt
YXBMb2FkRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRl
digpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZ3Jv
dXAoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZ3JvdXAo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0
TWJCdWRkeUJpdG1hcExvYWRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NE1iQnVkZHlCaXRtYXBMb2FkRnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJl
ciA9IDEsCisgICAga0dyb3VwRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9kZXYo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2dyb3VwKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorfTsKKworY2xhc3MgRXh0NE1iQml0bWFwTG9hZEZ0cmFjZUV2ZW50X0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBFeHQ0TWJCaXRtYXBMb2FkRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgRXh0NE1iQml0bWFwTG9hZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NE1iQml0bWFwTG9h
ZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rl
digpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2dyb3VwKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGdyb3VwKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NE1iQml0
bWFwTG9hZEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0TWJCaXRtYXBMb2FkRnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0dy
b3VwRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2dyb3VwKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKwor
Y2xhc3MgRXh0NE1hcmtJbm9kZURpcnR5RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRNYXJrSW5v
ZGVEaXJ0eUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRNYXJr
SW5vZGVEaXJ0eUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NE1hcmtJbm9kZURpcnR5RnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaXAoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaXAoKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBFeHQ0TWFya0lub2RlRGlydHlGdHJhY2VFdmVu
dCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNv
ZGVyID0gRXh0NE1hcmtJbm9kZURpcnR5RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0g
MiwKKyAgICBrSXBGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
aW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9pcCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1
ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRMb2FkSW5vZGVCaXRtYXBGdHJhY2VFdmVudF9EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgRXh0NExvYWRJbm9kZUJpdG1hcEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9Cisg
IGV4cGxpY2l0IEV4dDRMb2FkSW5vZGVCaXRtYXBGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRM
b2FkSW5vZGVCaXRtYXBGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19ncm91cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBncm91cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2Ns
YXNzIEV4dDRMb2FkSW5vZGVCaXRtYXBGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NExvYWRJbm9kZUJpdG1h
cEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGRO
dW1iZXIgPSAxLAorICAgIGtHcm91cEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRf
ZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9ncm91cCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRMb2FkSW5vZGVGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgRXh0NExvYWRJbm9kZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEV4dDRMb2FkSW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRMb2FkSW5vZGVGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgRXh0NExvYWRJbm9kZUZ0cmFjZUV2
ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBFeHQ0TG9hZElub2RlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMy
X3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwK
KyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0Sm91cm5hbGxlZFdy
aXRlRW5kRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklF
TERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRKb3VybmFsbGVkV3JpdGVFbmRGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0Sm91cm5hbGxlZFdyaXRlRW5k
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0Sm91cm5hbGxlZFdyaXRlRW5kRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcG9zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS52YWxpZCgpOyB9CisgIGludDY0X3QgcG9zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19p
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX2NvcGllZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBjb3BpZWQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigp
OyB9Cit9OworCitjbGFzcyBFeHQ0Sm91cm5hbGxlZFdyaXRlRW5kRnRyYWNlRXZlbnQgOiBwdWJs
aWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4
dDRKb3VybmFsbGVkV3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAor
ICAgIGtQb3NGaWVsZE51bWJlciA9IDMsCisgICAga0xlbkZpZWxkTnVtYmVyID0gNCwKKyAgICBr
Q29waWVkRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcG9zKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29waWVkKHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEpvdXJuYWxsZWRJ
bnZhbGlkYXRlcGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5
cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVB
VEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0Sm91cm5hbGxlZEludmFsaWRh
dGVwYWdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEpvdXJu
YWxsZWRJbnZhbGlkYXRlcGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NEpvdXJuYWxsZWRJ
bnZhbGlkYXRlcGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBp
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lu
ZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGluZGV4
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19vZmZz
ZXQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgb2Zmc2V0
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19sZW5n
dGgoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGVuZ3Ro
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0
NEpvdXJuYWxsZWRJbnZhbGlkYXRlcGFnZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0Sm91cm5hbGxlZElu
dmFsaWRhdGVwYWdlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAg
IGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrSW5k
ZXhGaWVsZE51bWJlciA9IDMsCisgICAga09mZnNldEZpZWxkTnVtYmVyID0gNCwKKyAgICBrTGVu
Z3RoRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfaW5kZXgodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X29mZnNldCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuZ3RoKHVpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEpvdXJuYWxT
dGFydFJlc2VydmVkRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlw
ZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFU
RURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRKb3VybmFsU3RhcnRSZXNlcnZl
ZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRKb3VybmFsU3Rh
cnRSZXNlcnZlZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NEpvdXJuYWxTdGFydFJlc2VydmVk
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaXAoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaXAoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Jsb2NrcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGJsb2NrcygpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEpvdXJuYWxTdGFydFJl
c2VydmVkRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRKb3VybmFsU3RhcnRSZXNlcnZlZEZ0cmFjZUV2ZW50
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAor
ICAgIGtJcEZpZWxkTnVtYmVyID0gMiwKKyAgICBrQmxvY2tzRmllbGROdW1iZXIgPSAzLAorICB9
OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lwKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ibG9ja3MoaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRKb3Vy
bmFsU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEpvdXJuYWxTdGFydEZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVj
b2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRKb3VybmFsU3RhcnRGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9
CisgIGV4cGxpY2l0IEV4dDRKb3VybmFsU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEs
IHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19pcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBpcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9Cisg
IGludDMyX3QgYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX3Jzdl9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCByc3ZfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigp
OyB9CisgIGJvb2wgaGFzX25ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7
IH0KKyAgaW50MzJfdCBuYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigp
OyB9Cit9OworCitjbGFzcyBFeHQ0Sm91cm5hbFN0YXJ0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpw
cm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRKb3Vy
bmFsU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0Rl
dkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSXBGaWVsZE51bWJlciA9IDIsCisgICAga0Jsb2Nrc0Zp
ZWxkTnVtYmVyID0gMywKKyAgICBrUnN2QmxvY2tzRmllbGROdW1iZXIgPSA0LAorICAgIGtOYmxv
Y2tzRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lwKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9ibG9ja3MoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcnN2X2Jsb2NrcyhpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uYmxvY2tzKGludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0SW52YWxp
ZGF0ZXBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEludmFsaWRhdGVwYWdlRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEludmFsaWRhdGVwYWdlRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBFeHQ0SW52YWxpZGF0ZXBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgp
OyB9CisgIHVpbnQzMl90IGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMy
KCk7IH0KK307CisKK2NsYXNzIEV4dDRJbnZhbGlkYXRlcGFnZUZ0cmFjZUV2ZW50IDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0
SW52YWxpZGF0ZXBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtJ
bmRleEZpZWxkTnVtYmVyID0gMywKKyAgICBrT2Zmc2V0RmllbGROdW1iZXIgPSA0LAorICAgIGtM
ZW5ndGhGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9pbmRleCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfb2Zmc2V0KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZW5ndGgodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0SW5zZXJ0
UmFuZ2VGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEluc2VydFJhbmdlRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEluc2VydFJhbmdlRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBFeHQ0SW5zZXJ0UmFuZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19vZmZzZXQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9v
bCBoYXNfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qg
bGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBF
eHQ0SW5zZXJ0UmFuZ2VGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEluc2VydFJhbmdlRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisg
ICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrT2Zmc2V0RmllbGROdW1iZXIgPSAzLAorICAg
IGtMZW5GaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9vZmZzZXQoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfbGVuKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0SW5kTWFwQmxvY2tzRXhpdEZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovOCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBFeHQ0SW5kTWFwQmxvY2tzRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRJbmRNYXBCbG9ja3NFeGl0RnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBFeHQ0SW5kTWFwQmxvY2tzRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBi
b29sIGhhc19wYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IHBibGsoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
bGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNf
bGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbWZsYWdz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1mbGFncygp
IGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkg
Y29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmV0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8OD4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0SW5kTWFwQmxv
Y2tzRXhpdEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0SW5kTWFwQmxvY2tzRXhpdEZ0cmFjZUV2ZW50X0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAg
IGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga0ZsYWdzRmllbGROdW1iZXIgPSAzLAorICAgIGtQ
YmxrRmllbGROdW1iZXIgPSA0LAorICAgIGtMYmxrRmllbGROdW1iZXIgPSA1LAorICAgIGtMZW5G
aWVsZE51bWJlciA9IDYsCisgICAga01mbGFnc0ZpZWxkTnVtYmVyID0gNywKKyAgICBrUmV0Rmll
bGROdW1iZXIgPSA4LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxh
Z3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3BibGsodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2xibGsodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbWZsYWdzKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9yZXQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0K
K307CisKK2NsYXNzIEV4dDRJbmRNYXBCbG9ja3NFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBF
eHQ0SW5kTWFwQmxvY2tzRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBFeHQ0SW5kTWFwQmxvY2tzRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRJbmRN
YXBCbG9ja3NFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBp
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xi
bGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGJsaygp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25z
dCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0SW5kTWFwQmxv
Y2tzRW50ZXJGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEluZE1hcEJsb2Nrc0VudGVyRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisg
ICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrTGJsa0ZpZWxkTnVtYmVyID0gMywKKyAgICBr
TGVuRmllbGROdW1iZXIgPSA0LAorICAgIGtGbGFnc0ZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAg
dm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xibGsodWludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxh
Z3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9
OworCitjbGFzcyBFeHQ0R2V0UmVzZXJ2ZWRDbHVzdGVyQWxsb2NGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgRXh0NEdldFJlc2VydmVkQ2x1c3RlckFsbG9jRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgRXh0NEdldFJlc2VydmVkQ2x1c3RlckFsbG9jRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBFeHQ0R2V0UmVzZXJ2ZWRDbHVzdGVyQWxsb2NGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19sYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgp
OyB9CisgIHVpbnQzMl90IGxibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQor
ICB1aW50MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9Cit9
OworCitjbGFzcyBFeHQ0R2V0UmVzZXJ2ZWRDbHVzdGVyQWxsb2NGdHJhY2VFdmVudCA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0
NEdldFJlc2VydmVkQ2x1c3RlckFsbG9jRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0g
MiwKKyAgICBrTGJsa0ZpZWxkTnVtYmVyID0gMywKKyAgICBrTGVuRmllbGROdW1iZXIgPSA0LAor
ICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGJsayh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKwor
Y2xhc3MgRXh0NEdldEltcGxpZWRDbHVzdGVyQWxsb2NFeGl0RnRyYWNlRXZlbnRfRGVjb2RlciA6
IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82
LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6Cisg
IEV4dDRHZXRJbXBsaWVkQ2x1c3RlckFsbG9jRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IEV4dDRHZXRJbXBsaWVkQ2x1c3RlckFsbG9jRXhpdEZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgRXh0NEdldEltcGxpZWRDbHVzdGVyQWxsb2NFeGl0RnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
YXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBwYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191
aW50NjQoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIo
KTsgfQorICBib29sIGhhc19yZXQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCByZXQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2ludDMyKCk7IH0KK307
CisKK2NsYXNzIEV4dDRHZXRJbXBsaWVkQ2x1c3RlckFsbG9jRXhpdEZ0cmFjZUV2ZW50IDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBF
eHQ0R2V0SW1wbGllZENsdXN0ZXJBbGxvY0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmxhZ3NGaWVsZE51
bWJlciA9IDIsCisgICAga0xibGtGaWVsZE51bWJlciA9IDMsCisgICAga1BibGtGaWVsZE51bWJl
ciA9IDQsCisgICAga0xlbkZpZWxkTnVtYmVyID0gNSwKKyAgICBrUmV0RmllbGROdW1iZXIgPSA2
LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYmxrKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9w
YmxrKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9sZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3JldChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDYsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEZyZWVJbm9kZUZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBFeHQ0RnJlZUlub2RlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgRXh0NEZyZWVJbm9kZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NEZyZWVJbm9k
ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rl
digpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3VpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB1aWQoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2dpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBnaWQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw1
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw2
PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
YXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRGcmVlSW5vZGVGdHJhY2VFdmVudCA6IHB1
YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0g
RXh0NEZyZWVJbm9kZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga1Vp
ZEZpZWxkTnVtYmVyID0gMywKKyAgICBrR2lkRmllbGROdW1iZXIgPSA0LAorICAgIGtCbG9ja3NG
aWVsZE51bWJlciA9IDUsCisgICAga01vZGVGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQg
c2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91aWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2dpZCh1aW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmxvY2tzKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9tb2RlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsK
KyAgfQorfTsKKworY2xhc3MgRXh0NEZyZWVCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0
NEZyZWVCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0
RnJlZUJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NEZyZWVCbG9ja3NGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ibG9jaygpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBibG9jaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfY291bnQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgY291bnQoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS52YWxpZCgpOyB9CisgIGludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFz
X2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFs
aWQoKTsgfQorICB1aW50MzJfdCBtb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50
MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEZyZWVCbG9ja3NGdHJhY2VFdmVudCA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEZy
ZWVCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0Rl
dkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtCbG9ja0Zp
ZWxkTnVtYmVyID0gMywKKyAgICBrQ291bnRGaWVsZE51bWJlciA9IDQsCisgICAga0ZsYWdzRmll
bGROdW1iZXIgPSA1LAorICAgIGtNb2RlRmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNl
dF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmxvY2sodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NvdW50KHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyhp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9tb2RlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsK
KyAgfQorfTsKKworY2xhc3MgRXh0NEZvcmdldEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNf
Tk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0Rm9y
Z2V0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6
IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEZvcmdldEZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgRXh0NEZvcmdldEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX2Jsb2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IGJsb2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pc19tZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQo
KTsgfQorICBpbnQzMl90IGlzX21ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19p
bnQzMigpOyB9CisgIGJvb2wgaGFzX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMy
KCk7IH0KK307CisKK2NsYXNzIEV4dDRGb3JnZXRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEZvcmdldEZ0
cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1i
ZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga0Jsb2NrRmllbGROdW1iZXIg
PSAzLAorICAgIGtJc01ldGFkYXRhRmllbGROdW1iZXIgPSA0LAorICAgIGtNb2RlRmllbGROdW1i
ZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmxvY2sodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2lzX21ldGFkYXRhKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X21vZGUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RmluZERlbGFsbG9jUmFuZ2VG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzcsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEZpbmREZWxhbGxvY1JhbmdlRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEZpbmREZWxhbGxvY1JhbmdlRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBFeHQ0RmluZERlbGFsbG9jUmFuZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19mcm9tKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgp
OyB9CisgIHVpbnQzMl90IGZyb20oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX3RvKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IHRvKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBi
b29sIGhhc19yZXZlcnNlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGlu
dDMyX3QgcmV2ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc19mb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IGZvdW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX2ZvdW5kX2JsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICB1aW50
MzJfdCBmb3VuZF9ibGsoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQzMigpOyB9Cit9
OworCitjbGFzcyBFeHQ0RmluZERlbGFsbG9jUmFuZ2VGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEZpbmRE
ZWxhbGxvY1JhbmdlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAg
IGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrRnJv
bUZpZWxkTnVtYmVyID0gMywKKyAgICBrVG9GaWVsZE51bWJlciA9IDQsCisgICAga1JldmVyc2VG
aWVsZE51bWJlciA9IDUsCisgICAga0ZvdW5kRmllbGROdW1iZXIgPSA2LAorICAgIGtGb3VuZEJs
a0ZpZWxkTnVtYmVyID0gNywKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2Zyb20odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3RvKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9yZXZlcnNlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZvdW5kKGludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZvdW5kX2Js
ayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KK307
CisKK2NsYXNzIEV4dDRGYWxsb2NhdGVFeGl0RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRGYWxs
b2NhdGVFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEZh
bGxvY2F0ZUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRGYWxsb2NhdGVFeGl0RnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcG9zKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgcG9zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3JldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCku
dmFsaWQoKTsgfQorICBpbnQzMl90IHJldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50
MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEZhbGxvY2F0ZUV4aXRGdHJhY2VFdmVudCA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0
NEZhbGxvY2F0ZUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtQ
b3NGaWVsZE51bWJlciA9IDMsCisgICAga0Jsb2Nrc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrUmV0
RmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
cG9zKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2Jsb2Nrcyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RmFsbG9jYXRlRW50ZXJGdHJh
Y2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxz
ZT4geworIHB1YmxpYzoKKyAgRXh0NEZhbGxvY2F0ZUVudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgRXh0NEZhbGxvY2F0ZUVudGVyRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBFeHQ0RmFsbG9jYXRlRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19vZmZzZXQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9v
bCBoYXNfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qg
bGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX21v
ZGUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBtb2RlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BvcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHBvcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkuYXNfaW50NjQoKTsgfQorfTsKKworY2xhc3MgRXh0NEZhbGxvY2F0ZUVu
dGVyRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEV4dDRGYWxsb2NhdGVFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9G
aWVsZE51bWJlciA9IDIsCisgICAga09mZnNldEZpZWxkTnVtYmVyID0gMywKKyAgICBrTGVuRmll
bGROdW1iZXIgPSA0LAorICAgIGtNb2RlRmllbGROdW1iZXIgPSA1LAorICAgIGtQb3NGaWVsZE51
bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vZmZzZXQo
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbGVuKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X21vZGUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcG9zKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXh0U2hvd0V4dGVudEZ0
cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2Zh
bHNlPiB7CisgcHVibGljOgorICBFeHQ0RXh0U2hvd0V4dGVudEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRFeHRTaG93RXh0ZW50RnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBFeHQ0RXh0U2hvd0V4dGVudEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX3BibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBs
YmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19s
ZW4oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEV4
dFNob3dFeHRlbnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7Cisg
cHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEV4dFNob3dFeHRlbnRGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtQYmxrRmllbGROdW1iZXIgPSAzLAorICAgIGtM
YmxrRmllbGROdW1iZXIgPSA0LAorICAgIGtMZW5GaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZv
aWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYmxrKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYmxrKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZW4o
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBFeHQ0RXh0Um1MZWFmRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki83LCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRFeHRSbUxlYWZG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0Um1MZWFmRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0Um1MZWFmRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
dWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxp
ZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfcGFydGlhbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQo
KTsgfQorICBpbnQ2NF90IHBhcnRpYWwoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0
KCk7IH0KKyAgYm9vbCBoYXNfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7
IH0KKyAgdWludDMyX3Qgc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX2VlX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7
IH0KKyAgdWludDMyX3QgZWVfbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMy
KCk7IH0KKyAgYm9vbCBoYXNfZWVfcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBlZV9wYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19lZV9sZW4oKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBlZV9sZW4oKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX2ludDMy
KCk7IH0KK307CisKK2NsYXNzIEV4dDRFeHRSbUxlYWZGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEV4dFJt
TGVhZkZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2Rmll
bGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga1BhcnRpYWxGaWVs
ZE51bWJlciA9IDMsCisgICAga1N0YXJ0RmllbGROdW1iZXIgPSA0LAorICAgIGtFZUxibGtGaWVs
ZE51bWJlciA9IDUsCisgICAga0VlUGJsa0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrRWVMZW5GaWVs
ZE51bWJlciA9IDcsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYXJ0
aWFsKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3N0YXJ0KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9lZV9sYmxrKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9lZV9wYmxrKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9lZV9s
ZW4oaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KK307
CisKK2NsYXNzIEV4dDRFeHRSbUlkeEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0RXh0Um1JZHhG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0Um1JZHhGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IEV4dDRFeHRSbUlkeEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX3BibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0K
K307CisKK2NsYXNzIEV4dDRFeHRSbUlkeEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RXh0Um1JZHhGdHJh
Y2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtQYmxrRmllbGROdW1iZXIgPSAz
LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGJsayh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4
dDRFeHRSZW1vdmVTcGFjZURvbmVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzcsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEV4dFJlbW92ZVNw
YWNlRG9uZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRFeHRS
ZW1vdmVTcGFjZURvbmVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRFeHRSZW1vdmVTcGFjZURv
bmVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19k
ZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zdGFydCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzdGFydCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZW5kKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGVuZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZGVwdGgoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBkZXB0aCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDU+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19wYXJ0aWFsKCkgY29uc3QgeyByZXR1cm4g
YXQ8Nj4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgcGFydGlhbCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19laF9lbnRyaWVzKCkgY29uc3QgeyByZXR1
cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGVoX2VudHJpZXMoKSBjb25zdCB7IHJl
dHVybiBhdDw3PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0RXh0UmVtb3ZlU3Bh
Y2VEb25lRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRFeHRSZW1vdmVTcGFjZURvbmVGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtTdGFydEZpZWxkTnVtYmVyID0gMywKKyAgICBr
RW5kRmllbGROdW1iZXIgPSA0LAorICAgIGtEZXB0aEZpZWxkTnVtYmVyID0gNSwKKyAgICBrUGFy
dGlhbEZpZWxkTnVtYmVyID0gNiwKKyAgICBrRWhFbnRyaWVzRmllbGROdW1iZXIgPSA3LAorICB9
OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RhcnQodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2VuZCh1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfZGVwdGgoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcGFydGlhbChpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9laF9lbnRyaWVzKHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEV4dFJl
bW92ZVNwYWNlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRFeHRSZW1vdmVTcGFjZUZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRFeHRSZW1vdmVTcGFjZUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgRXh0NEV4dFJlbW92ZVNwYWNlRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
YXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3Qgc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBlbmQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9
CisgIGJvb2wgaGFzX2RlcHRoKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9Cisg
IGludDMyX3QgZGVwdGgoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0KK307
CisKK2NsYXNzIEV4dDRFeHRSZW1vdmVTcGFjZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96
ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RXh0UmVtb3Zl
U3BhY2VGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtTdGFydEZpZWxk
TnVtYmVyID0gMywKKyAgICBrRW5kRmllbGROdW1iZXIgPSA0LAorICAgIGtEZXB0aEZpZWxkTnVt
YmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXJ0KHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9lbmQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2RlcHRoKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXh0UHV0SW5DYWNoZUZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBFeHQ0RXh0UHV0SW5DYWNoZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IEV4dDRFeHRQdXRJbkNhY2hlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0
RXh0UHV0SW5DYWNoZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBp
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xi
bGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGJsaygp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3RhcnQoKSBjb25z
dCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc3RhcnQoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBFeHQ0RXh0UHV0SW5D
YWNoZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RXh0UHV0SW5DYWNoZUZ0cmFjZUV2ZW50X0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9G
aWVsZE51bWJlciA9IDIsCisgICAga0xibGtGaWVsZE51bWJlciA9IDMsCisgICAga0xlbkZpZWxk
TnVtYmVyID0gNCwKKyAgICBrU3RhcnRGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0
X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9sYmxrKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZW4odWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXJ0KHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xh
c3MgRXh0NEV4dE1hcEJsb2Nrc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJv
dG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzgsIC8qSEFTX05PTlBB
Q0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEV4dE1hcEJs
b2Nrc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0
TWFwQmxvY2tzRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NEV4dE1hcEJsb2Nrc0V4aXRG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGJsaygpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwYmxrKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19sYmxrKCkgY29uc3QgeyByZXR1cm4g
YXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxibGsoKSBjb25zdCB7IHJldHVybiBhdDw1
PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDY+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX21mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBtZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3JldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IHJldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfaW50MzIo
KTsgfQorfTsKKworY2xhc3MgRXh0NEV4dE1hcEJsb2Nrc0V4aXRGdHJhY2VFdmVudCA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0
NEV4dE1hcEJsb2Nrc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAg
IGtGbGFnc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrUGJsa0ZpZWxkTnVtYmVyID0gNCwKKyAgICBr
TGJsa0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrTGVuRmllbGROdW1iZXIgPSA2LAorICAgIGtNZmxh
Z3NGaWVsZE51bWJlciA9IDcsCisgICAga1JldEZpZWxkTnVtYmVyID0gOCwKKyAgfTsKKyAgdm9p
ZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYmxrKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYmxr
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9sZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X21mbGFncyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXh0TWFwQmxv
Y2tzRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEV4dE1hcEJsb2Nrc0VudGVyRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEV4dE1hcEJsb2Nrc0VudGVy
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0TWFwQmxvY2tzRW50ZXJGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19sYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFs
aWQoKTsgfQorICB1aW50MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgp
OyB9CisgIHVpbnQzMl90IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIo
KTsgfQorfTsKKworY2xhc3MgRXh0NEV4dE1hcEJsb2Nrc0VudGVyRnRyYWNlRXZlbnQgOiBwdWJs
aWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4
dDRFeHRNYXBCbG9ja3NFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisg
ICAga0xibGtGaWVsZE51bWJlciA9IDMsCisgICAga0xlbkZpZWxkTnVtYmVyID0gNCwKKyAgICBr
RmxhZ3NGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9sYmxrKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9sZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEV4dExvYWRFeHRl
bnRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEV4dExvYWRFeHRlbnRGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0TG9hZEV4dGVudEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgRXh0NEV4dExvYWRFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19wYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IHBibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2Ns
YXNzIEV4dDRFeHRMb2FkRXh0ZW50RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRFeHRMb2FkRXh0ZW50RnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJl
ciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGJsa0ZpZWxkTnVtYmVyID0g
MywKKyAgICBrTGJsa0ZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3BibGsodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xibGsodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXh0SW5DYWNoZUZ0cmFj
ZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBFeHQ0RXh0SW5DYWNoZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IEV4dDRFeHRJbkNhY2hlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0
RXh0SW5DYWNoZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8o
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xibGso
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGJsaygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmV0KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0RXh0SW5DYWNoZUZ0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBFeHQ0RXh0SW5DYWNoZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0g
OiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJl
ciA9IDIsCisgICAga0xibGtGaWVsZE51bWJlciA9IDMsCisgICAga1JldEZpZWxkTnVtYmVyID0g
NCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xibGsodWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Jl
dChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsK
KworY2xhc3MgRXh0NEV4dEhhbmRsZVVud3JpdHRlbkV4dGVudHNGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzgsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgRXh0NEV4dEhhbmRsZVVud3JpdHRlbkV4dGVudHNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBFeHQ0RXh0SGFuZGxlVW53cml0dGVuRXh0ZW50c0Z0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgRXh0NEV4dEhhbmRsZVVud3JpdHRlbkV4dGVudHNGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
dmFsaWQoKTsgfQorICBpbnQzMl90IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19p
bnQzMigpOyB9CisgIGJvb2wgaGFzX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMy
KCk7IH0KKyAgYm9vbCBoYXNfcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBwYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQorICBi
b29sIGhhc19hbGxvY2F0ZWQoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgYWxsb2NhdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50MzIoKTsg
fQorICBib29sIGhhc19uZXdibGsoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgbmV3YmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50NjQoKTsg
fQorfTsKKworY2xhc3MgRXh0NEV4dEhhbmRsZVVud3JpdHRlbkV4dGVudHNGdHJhY2VFdmVudCA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gRXh0NEV4dEhhbmRsZVVud3JpdHRlbkV4dGVudHNGdHJhY2VFdmVudF9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGRO
dW1iZXIgPSAyLAorICAgIGtGbGFnc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrTGJsa0ZpZWxkTnVt
YmVyID0gNCwKKyAgICBrUGJsa0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrTGVuRmllbGROdW1iZXIg
PSA2LAorICAgIGtBbGxvY2F0ZWRGaWVsZE51bWJlciA9IDcsCisgICAga05ld2Jsa0ZpZWxkTnVt
YmVyID0gOCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsYWdzKGlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2xibGsodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3BibGsodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWxsb2NhdGVkKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9u
ZXdibGsodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9
Cit9OworCitjbGFzcyBFeHQ0RXh0Q29udmVydFRvSW5pdGlhbGl6ZWRGYXN0cGF0aEZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovMTAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4g
eworIHB1YmxpYzoKKyAgRXh0NEV4dENvbnZlcnRUb0luaXRpYWxpemVkRmFzdHBhdGhGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0Q29udmVydFRvSW5pdGlh
bGl6ZWRGYXN0cGF0aEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NEV4dENvbnZlcnRUb0luaXRp
YWxpemVkRmFzdHBhdGhGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
aW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19t
X2xibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbV9s
YmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19t
X2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtX2xl
bigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdV9s
YmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHVfbGJs
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdV9s
ZW4oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdV9sZW4o
KSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3VfcGJs
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB1X3BibGso
KSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lfbGJs
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBpX2xibGso
KSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2lfbGVu
KCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGlfbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19pX3BibGso
KSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlfcGJsaygp
IGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBFeHQ0
RXh0Q29udmVydFRvSW5pdGlhbGl6ZWRGYXN0cGF0aEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RXh0Q29u
dmVydFRvSW5pdGlhbGl6ZWRGYXN0cGF0aEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9
IDIsCisgICAga01MYmxrRmllbGROdW1iZXIgPSAzLAorICAgIGtNTGVuRmllbGROdW1iZXIgPSA0
LAorICAgIGtVTGJsa0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrVUxlbkZpZWxkTnVtYmVyID0gNiwK
KyAgICBrVVBibGtGaWVsZE51bWJlciA9IDcsCisgICAga0lMYmxrRmllbGROdW1iZXIgPSA4LAor
ICAgIGtJTGVuRmllbGROdW1iZXIgPSA5LAorICAgIGtJUGJsa0ZpZWxkTnVtYmVyID0gMTAsCisg
IH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgx
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9tX2xibGsodWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21fbGVu
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF91X2xibGsodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3VfbGVuKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91X3BibGsodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lfbGJsayh1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfaV9sZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X2lfcGJsayh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxMCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXh0Q29udmVydFRvSW5pdGlh
bGl6ZWRFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0RXh0Q29udmVydFRvSW5pdGlhbGl6
ZWRFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRFeHRD
b252ZXJ0VG9Jbml0aWFsaXplZEVudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0RXh0Q29u
dmVydFRvSW5pdGlhbGl6ZWRFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX21fbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50
MzJfdCBtX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJv
b2wgaGFzX21fbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IG1fbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc191X2xibGsoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgdV9sYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc191X2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCB1X2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfdV9wYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHVfcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2Ns
YXNzIEV4dDRFeHRDb252ZXJ0VG9Jbml0aWFsaXplZEVudGVyRnRyYWNlRXZlbnQgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRF
eHRDb252ZXJ0VG9Jbml0aWFsaXplZEVudGVyRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrTUxibGtGaWVsZE51bWJlciA9IDMsCisgICAga01MZW5GaWVsZE51bWJlciA9
IDQsCisgICAga1VMYmxrRmllbGROdW1iZXIgPSA1LAorICAgIGtVTGVuRmllbGROdW1iZXIgPSA2
LAorICAgIGtVUGJsa0ZpZWxkTnVtYmVyID0gNywKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X21fbGJsayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgz
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbV9sZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3VfbGJsayh1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdV9s
ZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3VfcGJsayh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2
YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRFdmljdElub2RlRnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIEV4dDRFdmljdElub2RlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgRXh0NEV2aWN0SW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDRFdmljdElub2RlRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmxpbmsoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBubGluaygpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEV2aWN0SW5vZGVGdHJhY2VF
dmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gRXh0NEV2aWN0SW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAy
LAorICAgIGtObGlua0ZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X25saW5rKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXNTaHJpbmtTY2FuRXhpdEZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBFeHQ0RXNTaHJpbmtTY2FuRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IEV4dDRFc1Nocmlua1NjYW5FeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBFeHQ0RXNTaHJpbmtTY2FuRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX25yX3NocnVuaygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICBpbnQzMl90IG5yX3NocnVuaygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIo
KTsgfQorICBib29sIGhhc19jYWNoZV9jbnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBjYWNoZV9jbnQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2lu
dDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRFc1Nocmlua1NjYW5FeGl0RnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IEV4dDRFc1Nocmlua1NjYW5FeGl0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMy
X3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga05yU2hydW5rRmllbGROdW1iZXIg
PSAyLAorICAgIGtDYWNoZUNudEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfZGV2
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9ucl9zaHJ1bmsoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2FjaGVfY250KGludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXNTaHJpbmtTY2Fu
RW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEVzU2hyaW5rU2NhbkVudGVyRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEVzU2hyaW5rU2NhbkVudGVyRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0RXNTaHJpbmtTY2FuRW50ZXJGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ucl90b19zY2FuKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbnJfdG9fc2NhbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19jYWNoZV9jbnQoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBjYWNoZV9jbnQoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRFc1Nocmlua1Nj
YW5FbnRlckZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RXNTaHJpbmtTY2FuRW50ZXJGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrTnJUb1NjYW5GaWVsZE51bWJlciA9IDIsCisgICAga0NhY2hlQ250RmllbGROdW1iZXIgPSAz
LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25yX3RvX3NjYW4oaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2FjaGVfY250
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBFeHQ0RXNTaHJpbmtDb3VudEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpw
cm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0RXNTaHJp
bmtDb3VudEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDRFc1No
cmlua0NvdW50RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0RXNTaHJpbmtDb3VudEZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25yX3RvX3NjYW4oKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBucl90b19zY2FuKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2NhY2hlX2NudCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGNhY2hlX2NudCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEVz
U2hyaW5rQ291bnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7Cisg
cHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NEVzU2hyaW5rQ291bnRGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrTnJUb1NjYW5GaWVsZE51bWJlciA9IDIsCisgICAga0NhY2hlQ250RmllbGROdW1iZXIgPSAz
LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25yX3RvX3NjYW4oaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2FjaGVfY250
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBFeHQ0RXNTaHJpbmtGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEVzU2hyaW5rRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVk
UHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEVzU2hyaW5rRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBFeHQ0RXNTaHJpbmtGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEs
IHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19ucl9zaHJ1bmsoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCBucl9zaHJ1bmsoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFz
X2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfc2Nhbl90aW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNjYW5fdGltZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnJfc2tpcHBlZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG5yX3NraXBwZWQoKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcmV0cmllZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJldHJpZWQoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRFc1Nocmlua0Z0cmFjZUV2
ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBFeHQ0RXNTaHJpbmtGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrTnJTaHJ1bmtGaWVsZE51bWJlciA9
IDIsCisgICAga1NjYW5UaW1lRmllbGROdW1iZXIgPSAzLAorICAgIGtOclNraXBwZWRGaWVsZE51
bWJlciA9IDQsCisgICAga1JldHJpZWRGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0
X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfbnJfc2hydW5rKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NjYW5fdGltZSh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnJfc2tpcHBlZChp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9yZXRyaWVkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUp
OworICB9Cit9OworCitjbGFzcyBFeHQ0RXNSZW1vdmVFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgRXh0NEVzUmVtb3ZlRXh0ZW50RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgRXh0NEVzUmVtb3ZlRXh0ZW50RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0RXNSZW1v
dmVFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
ZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19p
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19sYmxrKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgbGJsaygpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLmFzX2ludDY0KCk7IH0KK307CisKK2NsYXNzIEV4dDRFc1JlbW92ZUV4dGVudEZ0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBFeHQ0RXNSZW1vdmVFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGRO
dW1iZXIgPSAyLAorICAgIGtMYmxrRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJl
ciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYmxrKGludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2xlbihpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQor
fTsKKworY2xhc3MgRXh0NEVzTG9va3VwRXh0ZW50RXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNywg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBF
eHQ0RXNMb29rdXBFeHRlbnRFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgRXh0NEVzTG9va3VwRXh0ZW50RXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NEVz
TG9va3VwRXh0ZW50RXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9
CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X2xibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGJs
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGVu
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGJsaygpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwYmxrKCkgY29uc3Qg
eyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zdGF0dXMoKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc3RhdHVzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mb3VuZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGZvdW5kKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0RXNMb29rdXBFeHRl
bnRFeGl0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRFc0xvb2t1cEV4dGVudEV4aXRGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtMYmxrRmllbGROdW1iZXIgPSAzLAorICAgIGtM
ZW5GaWVsZE51bWJlciA9IDQsCisgICAga1BibGtGaWVsZE51bWJlciA9IDUsCisgICAga1N0YXR1
c0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrRm91bmRGaWVsZE51bWJlciA9IDcsCisgIH07CisgIHZv
aWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYmxrKHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZW4odWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BibGso
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3N0YXR1cyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfZm91bmQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg3LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRFc0xvb2t1cEV4dGVudEVudGVy
RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29k
ZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
ZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRFc0xvb2t1cEV4dGVudEVudGVyRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0NEVzTG9va3VwRXh0ZW50RW50ZXJGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IEV4dDRFc0xvb2t1cEV4dGVudEVudGVyRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
YXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBsYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191
aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEVzTG9va3VwRXh0ZW50RW50ZXJGdHJhY2VFdmVu
dCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNv
ZGVyID0gRXh0NEVzTG9va3VwRXh0ZW50RW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1i
ZXIgPSAyLAorICAgIGtMYmxrRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9kZXYo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfbGJsayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRFc0luc2VydEV4dGVudEZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBFeHQ0RXNJbnNlcnRFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBFeHQ0RXNJbnNlcnRFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0
IEV4dDRFc0luc2VydEV4dGVudEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
bGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNf
bGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGJsaygp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwYmxrKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zdGF0dXMoKSBj
b25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc3RhdHVzKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgRXh0NEVzSW5z
ZXJ0RXh0ZW50RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRFc0luc2VydEV4dGVudEZ0cmFjZUV2ZW50X0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAg
IGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga0xibGtGaWVsZE51bWJlciA9IDMsCisgICAga0xl
bkZpZWxkTnVtYmVyID0gNCwKKyAgICBrUGJsa0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrU3RhdHVz
RmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
bGJsayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfbGVuKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9wYmxrKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zdGF0dXModWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RXNG
aW5kRGVsYXllZEV4dGVudFJhbmdlRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpw
cm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBFeHQ0RXNGaW5k
RGVsYXllZEV4dGVudFJhbmdlRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IEV4dDRFc0ZpbmREZWxheWVkRXh0ZW50UmFuZ2VFeGl0RnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBFeHQ0RXNGaW5kRGVsYXllZEV4dGVudFJhbmdlRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMy
KCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9
CisgIHVpbnQzMl90IGxlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0K
KyAgYm9vbCBoYXNfcGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBwYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19zdGF0dXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorfTsK
KworY2xhc3MgRXh0NEVzRmluZERlbGF5ZWRFeHRlbnRSYW5nZUV4aXRGdHJhY2VFdmVudCA6IHB1
YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0g
RXh0NEVzRmluZERlbGF5ZWRFeHRlbnRSYW5nZUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGRO
dW1iZXIgPSAyLAorICAgIGtMYmxrRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJl
ciA9IDQsCisgICAga1BibGtGaWVsZE51bWJlciA9IDUsCisgICAga1N0YXR1c0ZpZWxkTnVtYmVy
ID0gNiwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xibGsodWludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfcGJsayh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RhdHVzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEVzRmluZERlbGF5ZWRF
eHRlbnRSYW5nZUVudGVyRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRFc0ZpbmREZWxheWVkRXh0
ZW50UmFuZ2VFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4
dDRFc0ZpbmREZWxheWVkRXh0ZW50UmFuZ2VFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0
NEVzRmluZERlbGF5ZWRFeHRlbnRSYW5nZUVudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRh
LCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7
IH0KKyAgYm9vbCBoYXNfbGJsaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQor
ICB1aW50MzJfdCBsYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQor
fTsKKworY2xhc3MgRXh0NEVzRmluZERlbGF5ZWRFeHRlbnRSYW5nZUVudGVyRnRyYWNlRXZlbnQg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IEV4dDRFc0ZpbmREZWxheWVkRXh0ZW50UmFuZ2VFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9G
aWVsZE51bWJlciA9IDIsCisgICAga0xibGtGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQg
c2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYmxrKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEVzQ2FjaGVFeHRlbnRG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgRXh0NEVzQ2FjaGVFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RXNDYWNoZUV4dGVudEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgRXh0NEVzQ2FjaGVFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19sYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IGxibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wg
aGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBs
ZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3Bi
bGsoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGJsaygp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc3RhdHVz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHN0YXR1cygp
IGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRF
c0NhY2hlRXh0ZW50RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRFc0NhY2hlRXh0ZW50RnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisg
ICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrTGJsa0ZpZWxkTnVtYmVyID0gMywKKyAgICBr
TGVuRmllbGROdW1iZXIgPSA0LAorICAgIGtQYmxrRmllbGROdW1iZXIgPSA1LAorICAgIGtTdGF0
dXNGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9sYmxrKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9sZW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BibGsodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXR1cyh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRE
cm9wSW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NERyb3BJbm9kZUZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDREcm9wSW5vZGVGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4
cGxpY2l0IEV4dDREcm9wSW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19kcm9wKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
ZHJvcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3Mg
RXh0NERyb3BJbm9kZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RHJvcElub2RlRnRyYWNlRXZlbnRfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAg
a0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrRHJvcEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAg
dm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Ryb3AoaW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDREaXNjYXJkUHJl
YWxsb2NhdGlvbnNGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NERpc2NhcmRQcmVhbGxvY2F0aW9u
c0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDREaXNjYXJkUHJl
YWxsb2NhdGlvbnNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDREaXNjYXJkUHJlYWxsb2NhdGlv
bnNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19k
ZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgRXh0NERpc2NhcmRQ
cmVhbGxvY2F0aW9uc0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RGlzY2FyZFByZWFsbG9jYXRpb25zRnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJl
ciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOwor
ICB9Cit9OworCitjbGFzcyBFeHQ0RGlzY2FyZEJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBF
eHQ0RGlzY2FyZEJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEV4dDREaXNjYXJkQmxvY2tzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0RGlzY2FyZEJsb2Nr
c0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rl
digpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2JsaygpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBibGsoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NvdW50KCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGNvdW50KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgRXh0NERpc2NhcmRCbG9j
a3NGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgor
ICB1c2luZyBEZWNvZGVyID0gRXh0NERpc2NhcmRCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrQmxrRmll
bGROdW1iZXIgPSAyLAorICAgIGtDb3VudEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBz
ZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9ibGsodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NvdW50KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NERpcmVjdElPRXhpdEZ0
cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2Zh
bHNlPiB7CisgcHVibGljOgorICBFeHQ0RGlyZWN0SU9FeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgRXh0NERpcmVjdElPRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgRXh0NERpcmVjdElPRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX3BvcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHBv
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19sZW4o
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbGVuKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ydygpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJ3KCkgY29uc3QgeyByZXR1
cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3JldCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+
KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NERpcmVjdElPRXhpdEZ0cmFjZUV2ZW50
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBFeHQ0RGlyZWN0SU9FeGl0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMy
X3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwK
KyAgICBrUG9zRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJlciA9IDQsCisgICAg
a1J3RmllbGROdW1iZXIgPSA1LAorICAgIGtSZXRGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZv
aWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wb3MoaW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ydyhpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9yZXQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0K
K307CisKK2NsYXNzIEV4dDREaXJlY3RJT0VudGVyRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDRE
aXJlY3RJT0VudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRXh0
NERpcmVjdElPRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDREaXJlY3RJT0VudGVyRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcG9zKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgcG9zKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3J3KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxp
ZCgpOyB9CisgIGludDMyX3QgcncoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7
IH0KK307CisKK2NsYXNzIEV4dDREaXJlY3RJT0VudGVyRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpw
cm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDREaXJl
Y3RJT0VudGVyRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtE
ZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUG9zRmll
bGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJlciA9IDQsCisgICAga1J3RmllbGROdW1i
ZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcG9zKGludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2xlbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfcncoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1
ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDREYVdyaXRlUGFnZXNFeHRlbnRGdHJhY2VFdmVudF9E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgRXh0NERhV3JpdGVQYWdlc0V4dGVudEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IEV4dDREYVdyaXRlUGFnZXNFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IEV4dDREYVdyaXRlUGFnZXNFeHRlbnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19sYmxrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IGxibGsoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGZs
YWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3Mg
RXh0NERhV3JpdGVQYWdlc0V4dGVudEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RGFXcml0ZVBhZ2VzRXh0
ZW50RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVs
ZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrTGJsa0ZpZWxkTnVt
YmVyID0gMywKKyAgICBrTGVuRmllbGROdW1iZXIgPSA0LAorICAgIGtGbGFnc0ZpZWxkTnVtYmVy
ID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xibGsodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RGFXcml0ZVBhZ2VzRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8xMCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBFeHQ0RGFXcml0ZVBhZ2VzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgRXh0NERhV3JpdGVQYWdlc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NERhV3Jp
dGVQYWdlc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBk
ZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lu
bygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2ZpcnN0X3Bh
Z2UoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZmlyc3Rf
cGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
bnJfdG9fd3JpdGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50NjRf
dCBucl90b193cml0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50NjQoKTsgfQorICBi
b29sIGhhc19zeW5jX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAg
aW50MzJfdCBzeW5jX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0K
KyAgYm9vbCBoYXNfYl9ibG9ja25yKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IGJfYmxvY2tucigpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfYl9zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgp
OyB9CisgIHVpbnQzMl90IGJfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDMy
KCk7IH0KKyAgYm9vbCBoYXNfYl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBiX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50
MzIoKTsgfQorICBib29sIGhhc19pb19kb25lKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxp
ZCgpOyB9CisgIGludDMyX3QgaW9fZG9uZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkuYXNfaW50
MzIoKTsgfQorICBib29sIGhhc19wYWdlc193cml0dGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+
KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBhZ2VzX3dyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBh
dDwxMD4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0RGFXcml0ZVBhZ2VzRnRyYWNl
RXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IEV4dDREYVdyaXRlUGFnZXNGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIg
PSAyLAorICAgIGtGaXJzdFBhZ2VGaWVsZE51bWJlciA9IDMsCisgICAga05yVG9Xcml0ZUZpZWxk
TnVtYmVyID0gNCwKKyAgICBrU3luY01vZGVGaWVsZE51bWJlciA9IDUsCisgICAga0JCbG9ja25y
RmllbGROdW1iZXIgPSA2LAorICAgIGtCU2l6ZUZpZWxkTnVtYmVyID0gNywKKyAgICBrQlN0YXRl
RmllbGROdW1iZXIgPSA4LAorICAgIGtJb0RvbmVGaWVsZE51bWJlciA9IDksCisgICAga1BhZ2Vz
V3JpdHRlbkZpZWxkTnVtYmVyID0gMTAsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5v
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9maXJzdF9wYWdlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ucl90b193cml0ZShpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zeW5jX21vZGUoaW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfYl9ibG9ja25yKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9iX3NpemUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Jfc3RhdGUodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lvX2RvbmUo
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg5LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcGFnZXNfd3JpdHRlbihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEw
LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDREYVVwZGF0ZVJlc2VydmVTcGFjZUZ0cmFj
ZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovOSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBFeHQ0RGFVcGRhdGVSZXNlcnZlU3BhY2VGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RGFVcGRhdGVSZXNlcnZlU3BhY2VGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IEV4dDREYVVwZGF0ZVJlc2VydmVTcGFjZUZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc191c2VkX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHVzZWRfYmxvY2tzKCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3Jlc2VydmVkX2RhdGFfYmxvY2tz
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmVzZXJ2ZWRf
ZGF0YV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0KKyAgYm9v
bCBoYXNfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCByZXNlcnZlZF9tZXRhX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19hbGxvY2F0ZWRfbWV0YV9ibG9ja3MoKSBj
b25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBhbGxvY2F0ZWRfbWV0
YV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBo
YXNfcXVvdGFfY2xhaW0oKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCBxdW90YV9jbGFpbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfaW50MzIoKTsgfQor
ICBib29sIGhhc19tb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IG1vZGUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQzMigpOyB9Cit9Owor
CitjbGFzcyBFeHQ0RGFVcGRhdGVSZXNlcnZlU3BhY2VGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NERhVXBk
YXRlUmVzZXJ2ZVNwYWNlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qgewor
ICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBr
SUJsb2Nrc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrVXNlZEJsb2Nrc0ZpZWxkTnVtYmVyID0gNCwK
KyAgICBrUmVzZXJ2ZWREYXRhQmxvY2tzRmllbGROdW1iZXIgPSA1LAorICAgIGtSZXNlcnZlZE1l
dGFCbG9ja3NGaWVsZE51bWJlciA9IDYsCisgICAga0FsbG9jYXRlZE1ldGFCbG9ja3NGaWVsZE51
bWJlciA9IDcsCisgICAga1F1b3RhQ2xhaW1GaWVsZE51bWJlciA9IDgsCisgICAga01vZGVGaWVs
ZE51bWJlciA9IDksCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pX2Js
b2Nrcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfdXNlZF9ibG9ja3MoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MoaW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
cmVzZXJ2ZWRfbWV0YV9ibG9ja3MoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWxsb2NhdGVkX21ldGFfYmxvY2tzKGludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3F1
b3RhX2NsYWltKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X21vZGUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
OSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0RGFSZXNlcnZlU3BhY2VGdHJhY2VFdmVu
dF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzcsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgRXh0NERhUmVzZXJ2ZVNwYWNlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgRXh0NERhUmVzZXJ2ZVNwYWNlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBF
eHQ0RGFSZXNlcnZlU3BhY2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19pX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBpX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCByZXNlcnZlZF9kYXRhX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDQ+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19yZXNlcnZlZF9tZXRhX2Jsb2NrcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJlc2VydmVkX21ldGFf
YmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbW9k
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbWRf
bmVlZGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbWRf
bmVlZGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFz
cyBFeHQ0RGFSZXNlcnZlU3BhY2VGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NERhUmVzZXJ2ZVNwYWNlRnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJl
ciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrSUJsb2Nrc0ZpZWxkTnVtYmVy
ID0gMywKKyAgICBrUmVzZXJ2ZWREYXRhQmxvY2tzRmllbGROdW1iZXIgPSA0LAorICAgIGtSZXNl
cnZlZE1ldGFCbG9ja3NGaWVsZE51bWJlciA9IDUsCisgICAga01vZGVGaWVsZE51bWJlciA9IDYs
CisgICAga01kTmVlZGVkRmllbGROdW1iZXIgPSA3LAorICB9OworICB2b2lkIHNldF9kZXYodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfaV9ibG9ja3ModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Jlc2VydmVkX2RhdGFfYmxvY2tzKGludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X3Jlc2VydmVkX21ldGFfYmxvY2tzKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21vZGUodWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21kX25lZWRlZChpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3Mg
RXh0NERhUmVsZWFzZVNwYWNlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVy
bzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki84LCAvKkhBU19OT05QQUNLRURf
UkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEV4dDREYVJlbGVhc2VTcGFj
ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDREYVJlbGVhc2VT
cGFjZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NERhUmVsZWFzZVNwYWNlRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2ZyZWVkX2Jsb2NrcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGZyZWVkX2Jsb2NrcygpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19yZXNlcnZlZF9kYXRh
X2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJl
c2VydmVkX2RhdGFfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9
CisgIGJvb2wgaGFzX3Jlc2VydmVkX21ldGFfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4o
KS52YWxpZCgpOyB9CisgIGludDMyX3QgcmVzZXJ2ZWRfbWV0YV9ibG9ja3MoKSBjb25zdCB7IHJl
dHVybiBhdDw2PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfYWxsb2NhdGVkX21ldGFfYmxv
Y2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgYWxsb2Nh
dGVkX21ldGFfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3QgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfdWludDMyKCk7IH0KK307CisK
K2NsYXNzIEV4dDREYVJlbGVhc2VTcGFjZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0RGFSZWxlYXNlU3Bh
Y2VGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxk
TnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtJQmxvY2tzRmllbGRO
dW1iZXIgPSAzLAorICAgIGtGcmVlZEJsb2Nrc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrUmVzZXJ2
ZWREYXRhQmxvY2tzRmllbGROdW1iZXIgPSA1LAorICAgIGtSZXNlcnZlZE1ldGFCbG9ja3NGaWVs
ZE51bWJlciA9IDYsCisgICAga0FsbG9jYXRlZE1ldGFCbG9ja3NGaWVsZE51bWJlciA9IDcsCisg
ICAga01vZGVGaWVsZE51bWJlciA9IDgsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5v
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9pX2Jsb2Nrcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZnJlZWRfYmxvY2tzKGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Jlc2VydmVkX2RhdGFf
YmxvY2tzKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3Jlc2VydmVkX21ldGFfYmxvY2tzKGludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9tZXRhX2Js
b2NrcyhpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9tb2RlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDgsIHZh
bHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NENvbGxhcHNlUmFuZ2VGdHJhY2VFdmVudF9EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgRXh0NENvbGxhcHNlUmFuZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBFeHQ0Q29sbGFwc2VSYW5nZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRXh0NENvbGxh
cHNlUmFuZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
ZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19p
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19vZmZzZXQo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBvZmZzZXQoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgbGVuKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBFeHQ0Q29sbGFwc2VSYW5n
ZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBFeHQ0Q29sbGFwc2VSYW5nZUZ0cmFjZUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVs
ZE51bWJlciA9IDIsCisgICAga09mZnNldEZpZWxkTnVtYmVyID0gMywKKyAgICBrTGVuRmllbGRO
dW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb2Zmc2V0
KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2xlbihpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsK
KyAgfQorfTsKKworY2xhc3MgRXh0NEJlZ2luT3JkZXJlZFRydW5jYXRlRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIEV4dDRCZWdpbk9yZGVyZWRUcnVuY2F0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IEV4dDRCZWdpbk9yZGVyZWRUcnVuY2F0ZUZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgRXh0NEJlZ2luT3JkZXJlZFRydW5jYXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRh
LCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7
IH0KKyAgYm9vbCBoYXNfbmV3X3NpemUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7
IH0KKyAgaW50NjRfdCBuZXdfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50NjQo
KTsgfQorfTsKKworY2xhc3MgRXh0NEJlZ2luT3JkZXJlZFRydW5jYXRlRnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IEV4dDRCZWdpbk9yZGVyZWRUcnVuY2F0ZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9
IDIsCisgICAga05ld1NpemVGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2Rldih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9uZXdfc2l6ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEFsbG9jYXRlSW5vZGVGdHJhY2VF
dmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4g
eworIHB1YmxpYzoKKyAgRXh0NEFsbG9jYXRlSW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBFeHQ0QWxsb2NhdGVJbm9kZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0
PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQg
RXh0NEFsbG9jYXRlSW5vZGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19kaXIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGly
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19tb2Rl
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1vZGUoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0QWxs
b2NhdGVJbm9kZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFeHQ0QWxsb2NhdGVJbm9kZUZ0cmFjZUV2ZW50X0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAg
IGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga0RpckZpZWxkTnVtYmVyID0gMywKKyAgICBrTW9k
ZUZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2Rpcih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfbW9kZSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2
YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRBbGxvY2F0ZUJsb2Nrc0Z0cmFjZUV2ZW50X0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovMTEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgRXh0NEFsbG9jYXRlQmxvY2tzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50
OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30K
KyAgZXhwbGljaXQgRXh0NEFsbG9jYXRlQmxvY2tzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0
QWxsb2NhdGVCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
aW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19i
bG9jaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBibG9j
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbGVu
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbG9naWNhbCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBsb2dpY2FsKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19sbGVmdCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBsbGVmdCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbHJpZ2h0KCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxyaWdodCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZ29hbCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBnb2FsKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wbGVmdCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwbGVmdCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDk+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcHJpZ2h0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwcmlnaHQoKSBjb25zdCB7
IHJldHVybiBhdDwxMD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0
IHsgcmV0dXJuIGF0PDExPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7
IHJldHVybiBhdDwxMT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRXh0NEFsbG9jYXRl
QmxvY2tzRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDRBbGxvY2F0ZUJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJ
bm9GaWVsZE51bWJlciA9IDIsCisgICAga0Jsb2NrRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5G
aWVsZE51bWJlciA9IDQsCisgICAga0xvZ2ljYWxGaWVsZE51bWJlciA9IDUsCisgICAga0xsZWZ0
RmllbGROdW1iZXIgPSA2LAorICAgIGtMcmlnaHRGaWVsZE51bWJlciA9IDcsCisgICAga0dvYWxG
aWVsZE51bWJlciA9IDgsCisgICAga1BsZWZ0RmllbGROdW1iZXIgPSA5LAorICAgIGtQcmlnaHRG
aWVsZE51bWJlciA9IDEwLAorICAgIGtGbGFnc0ZpZWxkTnVtYmVyID0gMTEsCisgIH07CisgIHZv
aWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ibG9jayh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sb2dp
Y2FsKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9sbGVmdCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbHJpZ2h0KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9nb2FsKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wbGVmdCh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg5LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcHJpZ2h0KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEwLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NEFsbG9jRGFCbG9ja3NGdHJh
Y2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxz
ZT4geworIHB1YmxpYzoKKyAgRXh0NEFsbG9jRGFCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBFeHQ0QWxsb2NEYUJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgRXh0NEFsbG9jRGFCbG9ja3NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19kYXRhX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1
aW50MzJfdCBkYXRhX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7
IH0KKyAgYm9vbCBoYXNfbWV0YV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgbWV0YV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFz
X3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0QWxsb2NEYUJsb2Nrc0Z0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBFeHQ0QWxsb2NEYUJsb2Nrc0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisg
ICAga0RhdGFCbG9ja3NGaWVsZE51bWJlciA9IDMsCisgICAga01ldGFCbG9ja3NGaWVsZE51bWJl
ciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kYXRhX2Jsb2Nr
cyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfbWV0YV9ibG9ja3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBFeHQ0U3luY0ZpbGVFeGl0RnRyYWNlRXZlbnRf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIEV4dDRTeW5jRmlsZUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4
X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQor
ICBleHBsaWNpdCBFeHQ0U3luY0ZpbGVFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFeHQ0U3lu
Y0ZpbGVFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
aW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmV0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBFeHQ0U3luY0ZpbGVF
eGl0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEV4dDRTeW5jRmlsZUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmll
bGROdW1iZXIgPSAyLAorICAgIGtSZXRGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0
X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9yZXQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEV4dDRTeW5jRmlsZUVudGVyRnRyYWNl
RXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypN
QVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+
IHsKKyBwdWJsaWM6CisgIEV4dDRTeW5jRmlsZUVudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgRXh0NFN5bmNGaWxlRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0
IEV4dDRTeW5jRmlsZUVudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkg
e30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfcGFyZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfZGF0YXN5bmMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBkYXRhc3luYygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgRXh0NFN5bmNGaWxlRW50ZXJGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRXh0NFN5bmNGaWxlRW50ZXJG
dHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVt
YmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtQYXJlbnRGaWVsZE51bWJl
ciA9IDMsCisgICAga0RhdGFzeW5jRmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9k
ZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFyZW50KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kYXRhc3luYyhpbnQzMl90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRXh0NERh
V3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NERhV3JpdGVFbmRGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29k
ZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFeHQ0RGFXcml0ZUVuZEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgRXh0NERhV3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBi
b29sIGhhc19wb3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50NjRf
dCBwb3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNf
bGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfY29waWVk
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNvcGllZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEV4dDRE
YVdyaXRlRW5kRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDREYVdyaXRlRW5kRnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lu
b0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUG9zRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVs
ZE51bWJlciA9IDQsCisgICAga0NvcGllZEZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBz
ZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BvcyhpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZW4odWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NvcGllZCh1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2Ns
YXNzIEV4dDREYVdyaXRlQmVnaW5GdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRXh0NERhV3JpdGVCZWdp
bkZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEV4dDREYVdyaXRlQmVn
aW5GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEV4dDREYVdyaXRlQmVnaW5GdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19wb3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgaW50NjRfdCBwb3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0
KCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9
CisgIHVpbnQzMl90IGxlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0K
KyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9Cit9
OworCitjbGFzcyBFeHQ0RGFXcml0ZUJlZ2luRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV4dDREYVdyaXRlQmVn
aW5GdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxk
TnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtQb3NGaWVsZE51bWJl
ciA9IDMsCisgICAga0xlbkZpZWxkTnVtYmVyID0gNCwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9
IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wb3MoaW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVu
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9mbGFncyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1
ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2YyZnMucGJ6ZXJv
LmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERP
IE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJB
Q0VfRlRSQUNFX0YyRlNfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9GVFJBQ0VfRjJGU19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+
CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2Zp
ZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2Ug
cGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitj
bGFzcyBGMmZzV3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRjJmc1dyaXRlRW5kRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc1dyaXRlRW5kRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBGMmZzV3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19wb3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCBwb3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBo
YXNfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxl
bigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfY29w
aWVkKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNvcGll
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEYy
ZnNXcml0ZUVuZEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBGMmZzV3JpdGVFbmRGdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5v
RmllbGROdW1iZXIgPSAyLAorICAgIGtQb3NGaWVsZE51bWJlciA9IDMsCisgICAga0xlbkZpZWxk
TnVtYmVyID0gNCwKKyAgICBrQ29waWVkRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNl
dF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcG9zKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29waWVkKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xh
c3MgRjJmc1dyaXRlQ2hlY2twb2ludEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGMmZzV3JpdGVDaGVj
a3BvaW50RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc1dyaXRl
Q2hlY2twb2ludEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRjJmc1dyaXRlQ2hlY2twb2ludEZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lzX3Vtb3VudCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBpc191bW91bnQoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX21zZygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFy
cyBtc2coKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFz
cyBGMmZzV3JpdGVDaGVja3BvaW50RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEYyZnNXcml0ZUNoZWNrcG9pbnRG
dHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVt
YmVyID0gMSwKKyAgICBrSXNVbW91bnRGaWVsZE51bWJlciA9IDIsCisgICAga01zZ0ZpZWxkTnVt
YmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pc191bW91bnQodWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21z
Zyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCB2YWx1ZS5k
YXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbXNnKGNvbnN0IGNoYXIqIGRh
dGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgZGF0YSwgc2l6ZSk7CisgIH0K
K307CisKK2NsYXNzIEYyZnNXcml0ZUJlZ2luRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEYyZnNXcml0
ZUJlZ2luRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc1dyaXRl
QmVnaW5GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEYyZnNXcml0ZUJlZ2luRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
YXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcG9zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIGludDY0X3QgcG9zKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9
CisgIGJvb2wgaGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQor
fTsKKworY2xhc3MgRjJmc1dyaXRlQmVnaW5GdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRjJmc1dyaXRlQmVnaW5G
dHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVt
YmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtQb3NGaWVsZE51bWJlciA9
IDMsCisgICAga0xlbkZpZWxkTnVtYmVyID0gNCwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDUs
CisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wb3MoaW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9mbGFncyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIEYyZnNWbVBhZ2VNa3dyaXRlRnRyYWNlRXZlbnRfRGVjb2RlciA6
IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82
LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6Cisg
IEYyZnNWbVBhZ2VNa3dyaXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgRjJmc1ZtUGFnZU1rd3JpdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEYyZnNWbVBhZ2VNa3dy
aXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
ZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZGlyKCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZGlyKCkgY29uc3QgeyByZXR1cm4gYXQ8
ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8
NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19kaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+
KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGRpcnR5KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5h
c19pbnQzMigpOyB9Cit9OworCitjbGFzcyBGMmZzVm1QYWdlTWt3cml0ZUZ0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBGMmZzVm1QYWdlTWt3cml0ZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisg
ICAga1R5cGVGaWVsZE51bWJlciA9IDMsCisgICAga0RpckZpZWxkTnVtYmVyID0gNCwKKyAgICBr
SW5kZXhGaWVsZE51bWJlciA9IDUsCisgICAga0RpcnR5RmllbGROdW1iZXIgPSA2LAorICB9Owor
ICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdHlwZShpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kaXIoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5k
ZXgodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2RpcnR5KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFs
dWUpOworICB9Cit9OworCitjbGFzcyBGMmZzVW5saW5rRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBGMmZzVW5saW5rRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEYyZnNVbmxpbmtFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJh
dy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzVW5saW5rRXhpdEZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3JldCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRjJmc1VubGlua0V4aXRGdHJhY2VFdmVudCA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gRjJmc1VubGlua0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAg
IGtSZXRGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9yZXQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7Cisg
IH0KK307CisKK2NsYXNzIEYyZnNVbmxpbmtFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGMmZz
VW5saW5rRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGMmZz
VW5saW5rRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEYyZnNVbmxpbmtFbnRlckZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NpemUoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDw1Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEYyZnNVbmxpbmtFbnRlckZ0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBGMmZzVW5saW5rRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1i
ZXIgPSAyLAorICAgIGtTaXplRmllbGROdW1iZXIgPSAzLAorICAgIGtCbG9ja3NGaWVsZE51bWJl
ciA9IDQsCisgICAga05hbWVGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2Rldih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9zaXplKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Jsb2Nrcyh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCB2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFz
cyBGMmZzVHJ1bmNhdGVQYXJ0aWFsTm9kZXNGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6
cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05P
TlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRjJmc1RydW5j
YXRlUGFydGlhbE5vZGVzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
RjJmc1RydW5jYXRlUGFydGlhbE5vZGVzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzVHJ1bmNh
dGVQYXJ0aWFsTm9kZXNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
aW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19u
aWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbmlkKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19kZXB0aCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGRlcHRoKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2VycigpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGVycigpIGNvbnN0IHsgcmV0
dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRjJmc1RydW5jYXRlUGFydGlh
bE5vZGVzRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEYyZnNUcnVuY2F0ZVBhcnRpYWxOb2Rlc0Z0cmFjZUV2ZW50
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAor
ICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga05pZEZpZWxkTnVtYmVyID0gMywKKyAgICBr
RGVwdGhGaWVsZE51bWJlciA9IDQsCisgICAga0VyckZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAg
dm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25pZCh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGVwdGgoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZXJy
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBGMmZzVHJ1bmNhdGVOb2Rlc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRjJmc1Ry
dW5jYXRlTm9kZXNFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
RjJmc1RydW5jYXRlTm9kZXNFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzVHJ1bmNhdGVO
b2Rlc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
ZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19p
bm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19yZXQoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCByZXQoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEYyZnNUcnVuY2F0ZU5v
ZGVzRXhpdEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBGMmZzVHJ1bmNhdGVOb2Rlc0V4aXRGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtSZXRGaWVsZE51bWJlciA9IDMsCisgIH07Cisg
IHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZXQoaW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEYyZnNUcnVuY2F0ZU5v
ZGVzRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRjJmc1RydW5jYXRlTm9kZXNFbnRlckZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEYyZnNUcnVuY2F0ZU5vZGVzRW50
ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEYyZnNUcnVuY2F0ZU5vZGVzRW50ZXJGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19uaWQoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbmlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5h
c191aW50MzIoKTsgfQorICBib29sIGhhc19ibGtfYWRkcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBibGtfYWRkcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEYyZnNUcnVuY2F0ZU5vZGVzRW50ZXJGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gRjJmc1RydW5jYXRlTm9kZXNFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVs
ZE51bWJlciA9IDIsCisgICAga05pZEZpZWxkTnVtYmVyID0gMywKKyAgICBrQmxrQWRkckZpZWxk
TnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25pZCh1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfYmxrX2FkZHIodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFs
dWUpOworICB9Cit9OworCitjbGFzcyBGMmZzVHJ1bmNhdGVOb2RlRnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIEYyZnNUcnVuY2F0ZU5vZGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBGMmZzVHJ1bmNhdGVOb2RlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzVHJ1bmNhdGVO
b2RlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
ZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmlkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG5pZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfYmxrX2FkZHIoKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYmxrX2FkZHIoKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBGMmZzVHJ1bmNhdGVO
b2RlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEYyZnNUcnVuY2F0ZU5vZGVGdHJhY2VFdmVudF9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmll
bGROdW1iZXIgPSAyLAorICAgIGtOaWRGaWVsZE51bWJlciA9IDMsCisgICAga0Jsa0FkZHJGaWVs
ZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5vKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uaWQo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2Jsa19hZGRyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZh
bHVlKTsKKyAgfQorfTsKKworY2xhc3MgRjJmc1RydW5jYXRlSW5vZGVCbG9ja3NFeGl0RnRyYWNl
RXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypN
QVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+
IHsKKyBwdWJsaWM6CisgIEYyZnNUcnVuY2F0ZUlub2RlQmxvY2tzRXhpdEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEYyZnNUcnVuY2F0ZUlub2RlQmxvY2tzRXhpdEZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgRjJmc1RydW5jYXRlSW5vZGVCbG9ja3NFeGl0RnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5h
c19pbnQzMigpOyB9Cit9OworCitjbGFzcyBGMmZzVHJ1bmNhdGVJbm9kZUJsb2Nrc0V4aXRGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gRjJmc1RydW5jYXRlSW5vZGVCbG9ja3NFeGl0RnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lu
b0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUmV0RmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lk
IHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzVHJ1bmNhdGVJbm9kZUJs
b2Nrc0VudGVyRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEYyZnNUcnVuY2F0ZUlub2RlQmxvY2tzRW50
ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGMmZzVHJ1bmNhdGVJ
bm9kZUJsb2Nrc0VudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJh
dy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzVHJ1bmNhdGVJbm9kZUJs
b2Nrc0VudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
aW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHNpemUoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tzKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJsb2NrcygpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZnJvbSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBmcm9tKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgRjJmc1RydW5jYXRlSW5v
ZGVCbG9ja3NFbnRlckZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBGMmZzVHJ1bmNhdGVJbm9kZUJsb2Nrc0VudGVy
RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51
bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2l6ZUZpZWxkTnVtYmVy
ID0gMywKKyAgICBrQmxvY2tzRmllbGROdW1iZXIgPSA0LAorICAgIGtGcm9tRmllbGROdW1iZXIg
PSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2l6ZShpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9i
bG9ja3ModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2Zyb20odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzVHJ1bmNhdGVEYXRhQmxvY2tzUmFuZ2VGdHJh
Y2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxz
ZT4geworIHB1YmxpYzoKKyAgRjJmc1RydW5jYXRlRGF0YUJsb2Nrc1JhbmdlRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc1RydW5jYXRlRGF0YUJsb2Nrc1Jhbmdl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzVHJ1bmNhdGVEYXRhQmxvY2tzUmFuZ2VGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19uaWQoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbmlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19vZnMoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgb2ZzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19mcmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxp
ZCgpOyB9CisgIGludDMyX3QgZnJlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIo
KTsgfQorfTsKKworY2xhc3MgRjJmc1RydW5jYXRlRGF0YUJsb2Nrc1JhbmdlRnRyYWNlRXZlbnQg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IEYyZnNUcnVuY2F0ZURhdGFCbG9ja3NSYW5nZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51
bWJlciA9IDIsCisgICAga05pZEZpZWxkTnVtYmVyID0gMywKKyAgICBrT2ZzRmllbGROdW1iZXIg
PSA0LAorICAgIGtGcmVlRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfbmlkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vZnModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZyZWUoaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEYyZnNUcnVu
Y2F0ZUJsb2Nrc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRjJmc1RydW5jYXRlQmxvY2tzRXhp
dEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEYyZnNUcnVuY2F0ZUJs
b2Nrc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEo
KSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEYyZnNUcnVuY2F0ZUJsb2Nrc0V4aXRGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19yZXQoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCByZXQoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEYyZnNUcnVuY2F0ZUJsb2Nrc0V4aXRGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gRjJmc1RydW5jYXRlQmxvY2tzRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVs
ZE51bWJlciA9IDIsCisgICAga1JldEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRf
ZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3JldChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRjJmc1RydW5jYXRlQmxvY2tzRW50ZXJG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgRjJmc1RydW5jYXRlQmxvY2tzRW50ZXJGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29k
ZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGMmZzVHJ1bmNhdGVCbG9ja3NFbnRlckZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgRjJmc1RydW5jYXRlQmxvY2tzRW50ZXJGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIGludDY0X3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50
NjQoKTsgfQorICBib29sIGhhc19ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19mcm9tKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IGZyb20oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgp
OyB9Cit9OworCitjbGFzcyBGMmZzVHJ1bmNhdGVCbG9ja3NFbnRlckZ0cmFjZUV2ZW50IDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBG
MmZzVHJ1bmNhdGVCbG9ja3NFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIs
CisgICAga1NpemVGaWVsZE51bWJlciA9IDMsCisgICAga0Jsb2Nrc0ZpZWxkTnVtYmVyID0gNCwK
KyAgICBrRnJvbUZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9p
bm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3NpemUoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmxvY2tzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mcm9tKHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRjJmc1RydW5j
YXRlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0Rl
Y29kZXI8LypNQVhfRklFTERfSUQ9Ki84LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERT
PSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEYyZnNUcnVuY2F0ZUZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IEYyZnNUcnVuY2F0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0
PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQg
RjJmc1RydW5jYXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlu
bygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcGlu
bygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwaW5vKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19tb2RlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1vZGUoKSBjb25z
dCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NpemUoKSBjb25z
dCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBzaXplKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NT4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25saW5rKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG5saW5rKCkgY29uc3QgeyByZXR1
cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19ibG9ja3MoKSBjb25zdCB7IHJl
dHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYmxvY2tzKCkgY29uc3QgeyByZXR1
cm4gYXQ8Nz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19hZHZpc2UoKSBjb25zdCB7IHJl
dHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYWR2aXNlKCkgY29uc3QgeyByZXR1
cm4gYXQ8OD4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRjJmc1RydW5jYXRlRnRyYWNl
RXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IEYyZnNUcnVuY2F0ZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIs
CisgICAga1Bpbm9GaWVsZE51bWJlciA9IDMsCisgICAga01vZGVGaWVsZE51bWJlciA9IDQsCisg
ICAga1NpemVGaWVsZE51bWJlciA9IDUsCisgICAga05saW5rRmllbGROdW1iZXIgPSA2LAorICAg
IGtCbG9ja3NGaWVsZE51bWJlciA9IDcsCisgICAga0FkdmlzZUZpZWxkTnVtYmVyID0gOCwKKyAg
fTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Bpbm8odWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21vZGUodWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3NpemUoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfbmxpbmsodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Jsb2Nrcyh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWR2aXNlKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3Mg
RjJmc1N5bmNGc0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGMmZzU3luY0ZzRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc1N5bmNGc0Z0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgRjJmc1N5bmNGc0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2RpcnR5KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
ZGlydHkoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNf
d2FpdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHdhaXQo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEYyZnNT
eW5jRnNGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gRjJmc1N5bmNGc0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtEaXJ0eUZpZWxk
TnVtYmVyID0gMiwKKyAgICBrV2FpdEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRf
ZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9kaXJ0eShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF93YWl0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzU3luY0ZpbGVFeGl0RnRyYWNl
RXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypN
QVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+
IHsKKyBwdWJsaWM6CisgIEYyZnNTeW5jRmlsZUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBGMmZzU3luY0ZpbGVFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBG
MmZzU3luY0ZpbGVFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
bmVlZF9jcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBu
ZWVkX2NwKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhh
c19kYXRhc3luYygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IGRhdGFzeW5jKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX3JldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHJl
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRjJm
c1N5bmNGaWxlRXhpdEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBGMmZzU3luY0ZpbGVFeGl0RnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisg
ICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrTmVlZENwRmllbGROdW1iZXIgPSAzLAorICAg
IGtEYXRhc3luY0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrUmV0RmllbGROdW1iZXIgPSA1LAorICB9
OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmVlZF9jcCh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGF0YXN5
bmMoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUp
OworICB9Cit9OworCitjbGFzcyBGMmZzU3luY0ZpbGVFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
OCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBGMmZzU3luY0ZpbGVFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEYyZnNTeW5jRmlsZUVudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzU3luY0ZpbGVF
bnRlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3Bpbm8oKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGlubygpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbW9kZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtb2RlKCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19zaXplKCkgY29uc3QgeyByZXR1
cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDU+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19ubGluaygpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBubGluaygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8
Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYWR2aXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8
OD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGFkdmlzZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+
KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEYyZnNTeW5jRmlsZUVudGVyRnRyYWNlRXZl
bnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IEYyZnNTeW5jRmlsZUVudGVyRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0g
MiwKKyAgICBrUGlub0ZpZWxkTnVtYmVyID0gMywKKyAgICBrTW9kZUZpZWxkTnVtYmVyID0gNCwK
KyAgICBrU2l6ZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrTmxpbmtGaWVsZE51bWJlciA9IDYsCisg
ICAga0Jsb2Nrc0ZpZWxkTnVtYmVyID0gNywKKyAgICBrQWR2aXNlRmllbGROdW1iZXIgPSA4LAor
ICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGlubyh1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbW9kZSh1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfc2l6ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9ubGluayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmxvY2tzKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9hZHZpc2UodWludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9Cit9OworCitjbGFz
cyBGMmZzU3VibWl0V3JpdGVQYWdlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEYyZnNTdWJtaXRXcml0
ZVBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4p
IDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGMmZzU3VibWl0
V3JpdGVQYWdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzU3VibWl0V3JpdGVQYWdlRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Jsb2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGJsb2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5h
c191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRjJmc1N1Ym1pdFdyaXRlUGFnZUZ0cmFjZUV2ZW50
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBGMmZzU3VibWl0V3JpdGVQYWdlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0g
MiwKKyAgICBrVHlwZUZpZWxkTnVtYmVyID0gMywKKyAgICBrSW5kZXhGaWVsZE51bWJlciA9IDQs
CisgICAga0Jsb2NrRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfdHlwZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9pbmRleCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmxvY2sodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzU2V0
UGFnZURpcnR5RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEYyZnNTZXRQYWdlRGlydHlGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGMmZzU2V0UGFnZURpcnR5RnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBGMmZzU2V0UGFnZURpcnR5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRh
LCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7
IH0KKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQor
ICBpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfZGlyKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMy
X3QgZGlyKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlu
ZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19k
aXJ0eSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGRpcnR5
KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBGMmZz
U2V0UGFnZURpcnR5RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEYyZnNTZXRQYWdlRGlydHlGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAgIGtUeXBlRmllbGROdW1iZXIgPSAzLAorICAgIGtE
aXJGaWVsZE51bWJlciA9IDQsCisgICAga0luZGV4RmllbGROdW1iZXIgPSA1LAorICAgIGtEaXJ0
eUZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X3R5cGUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfZGlyKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2luZGV4KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kaXJ0eShpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRjJmc1Jlc2Vy
dmVOZXdCbG9ja0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGMmZzUmVzZXJ2ZU5ld0Jsb2NrRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc1Jlc2VydmVOZXdCbG9ja0Z0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgRjJmc1Jlc2VydmVOZXdCbG9ja0Z0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBuaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX29mc19pbl9ub2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG9mc19pbl9ub2RlKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgRjJmc1Jlc2VydmVOZXdCbG9ja0Z0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBGMmZzUmVzZXJ2ZU5ld0Jsb2NrRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga05pZEZpZWxk
TnVtYmVyID0gMiwKKyAgICBrT2ZzSW5Ob2RlRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lk
IHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X25pZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb2ZzX2luX25vZGUodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzUmVhZHBh
Z2VGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRjJmc1JlYWRwYWdlRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgRjJmc1JlYWRwYWdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBG
MmZzUmVhZHBhZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5v
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbmRl
eCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbmRleCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYmxrYWRk
cigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBibGthZGRy
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc190eXBl
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdHlwZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgRjJmc1JlYWRw
YWdlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEYyZnNSZWFkcGFnZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51
bWJlciA9IDIsCisgICAga0luZGV4RmllbGROdW1iZXIgPSAzLAorICAgIGtCbGthZGRyRmllbGRO
dW1iZXIgPSA0LAorICAgIGtUeXBlRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9k
ZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5kZXgodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Jsa2FkZHIodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3R5cGUoaW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2Ns
YXNzIEYyZnNOZXdJbm9kZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JF
UEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGMmZzTmV3SW5vZGVGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGMmZzTmV3SW5vZGVGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9
CisgIGV4cGxpY2l0IEYyZnNOZXdJbm9kZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX3JldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHJldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xh
c3MgRjJmc05ld0lub2RlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ug
eworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEYyZnNOZXdJbm9kZUZ0cmFjZUV2ZW50X0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAxLAorICAg
IGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga1JldEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAg
dm9pZCBzZXRfZGV2KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3JldChpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgRjJmc0lnZXRFeGl0RnRy
YWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8
LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFs
c2U+IHsKKyBwdWJsaWM6CisgIEYyZnNJZ2V0RXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IEYyZnNJZ2V0RXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRjJmc0ln
ZXRFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRl
digpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5v
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmV0KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBGMmZzSWdldEV4aXRGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gRjJmc0lnZXRFeGl0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0g
MiwKKyAgICBrUmV0RmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9Cit9OworCitjbGFzcyBGMmZzSWdldEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOCwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGMmZz
SWdldEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEYyZnNJZ2V0RnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzSWdldEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX3Bpbm8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAg
dWludDY0X3QgcGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50
MzJfdCBtb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19u
bGluaygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBubGlu
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfYmxv
Y2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJsb2Nr
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYWR2
aXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGFkdmlz
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEYy
ZnNJZ2V0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEYyZnNJZ2V0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVt
YmVyID0gMiwKKyAgICBrUGlub0ZpZWxkTnVtYmVyID0gMywKKyAgICBrTW9kZUZpZWxkTnVtYmVy
ID0gNCwKKyAgICBrU2l6ZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrTmxpbmtGaWVsZE51bWJlciA9
IDYsCisgICAga0Jsb2Nrc0ZpZWxkTnVtYmVyID0gNywKKyAgICBrQWR2aXNlRmllbGROdW1iZXIg
PSA4LAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGlubyh1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
bW9kZSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfc2l6ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9ubGluayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmxvY2tzKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9hZHZpc2Uo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBGMmZzR2V0VmljdGltRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xMCwgLypIQVNfTk9OUEFD
S0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGMmZzR2V0VmljdGlt
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc0dldFZpY3RpbUZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgRjJmc0dldFZpY3RpbUZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQz
MigpOyB9CisgIGJvb2wgaGFzX2djX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBnY190eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQz
MigpOyB9CisgIGJvb2wgaGFzX2FsbG9jX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCBhbGxvY19tb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5h
c19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2djX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDw1Pigp
LnZhbGlkKCk7IH0KKyAgaW50MzJfdCBnY19tb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5h
c19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3ZpY3RpbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCB2aWN0aW0oKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX29mc191bml0KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4o
KS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG9mc191bml0KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4o
KS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19wcmVfdmljdGltKCkgY29uc3QgeyByZXR1cm4g
YXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHByZV92aWN0aW0oKSBjb25zdCB7IHJldHVy
biBhdDw4PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3ByZWZyZWUoKSBjb25zdCB7IHJl
dHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcHJlZnJlZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDk+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZnJlZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDEwPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZnJlZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDEwPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBGMmZzR2V0VmljdGltRnRyYWNl
RXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IEYyZnNHZXRWaWN0aW1GdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrVHlwZUZpZWxkTnVtYmVyID0g
MiwKKyAgICBrR2NUeXBlRmllbGROdW1iZXIgPSAzLAorICAgIGtBbGxvY01vZGVGaWVsZE51bWJl
ciA9IDQsCisgICAga0djTW9kZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrVmljdGltRmllbGROdW1i
ZXIgPSA2LAorICAgIGtPZnNVbml0RmllbGROdW1iZXIgPSA3LAorICAgIGtQcmVWaWN0aW1GaWVs
ZE51bWJlciA9IDgsCisgICAga1ByZWZyZWVGaWVsZE51bWJlciA9IDksCisgICAga0ZyZWVGaWVs
ZE51bWJlciA9IDEwLAorICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3R5cGUoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZ2Nf
dHlwZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9hbGxvY19tb2RlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2djX21vZGUoaW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdmljdGltKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9v
ZnNfdW5pdCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcHJlX3ZpY3RpbSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJlZnJlZSh1aW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg5LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZnJlZSh1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMCwgdmFsdWUpOworICB9Cit9OworCitj
bGFzcyBGMmZzR2V0RGF0YUJsb2NrRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82LCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEYyZnNHZXREYXRhQmxv
Y2tGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGMmZzR2V0RGF0YUJs
b2NrRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCBy
YXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzR2V0RGF0YUJsb2NrRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
YXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaWJsb2NrKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlibG9jaygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
YXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYmhfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYmhfc3RhcnQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2JoX3NpemUoKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYmhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDU+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8
Nj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5h
c19pbnQzMigpOyB9Cit9OworCitjbGFzcyBGMmZzR2V0RGF0YUJsb2NrRnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IEYyZnNHZXREYXRhQmxvY2tGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0RldkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW5vRmllbGROdW1iZXIgPSAyLAorICAg
IGtJYmxvY2tGaWVsZE51bWJlciA9IDMsCisgICAga0JoU3RhcnRGaWVsZE51bWJlciA9IDQsCisg
ICAga0JoU2l6ZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrUmV0RmllbGROdW1iZXIgPSA2LAorICB9
OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaWJsb2NrKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9iaF9zdGFy
dCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfYmhfc2l6ZSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzRmFsbG9jYXRlRnRyYWNlRXZl
bnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhf
RklFTERfSUQ9Ki84LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsK
KyBwdWJsaWM6CisgIEYyZnNGYWxsb2NhdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4
X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQor
ICBleHBsaWNpdCBGMmZzRmFsbG9jYXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzRmFsbG9j
YXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
ZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGRldigp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5vKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlubygpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbW9kZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG1vZGUoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfb2Zmc2V0KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJu
IGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGxlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4o
KS52YWxpZCgpOyB9CisgIGludDY0X3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNf
aW50NjQoKTsgfQorICBib29sIGhhc19ibG9ja3MoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191
aW50NjQoKTsgfQorICBib29sIGhhc19yZXQoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCByZXQoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX2ludDMyKCk7
IH0KK307CisKK2NsYXNzIEYyZnNGYWxsb2NhdGVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRjJmc0ZhbGxvY2F0
ZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGRO
dW1iZXIgPSAxLAorICAgIGtJbm9GaWVsZE51bWJlciA9IDIsCisgICAga01vZGVGaWVsZE51bWJl
ciA9IDMsCisgICAga09mZnNldEZpZWxkTnVtYmVyID0gNCwKKyAgICBrTGVuRmllbGROdW1iZXIg
PSA1LAorICAgIGtTaXplRmllbGROdW1iZXIgPSA2LAorICAgIGtCbG9ja3NGaWVsZE51bWJlciA9
IDcsCisgICAga1JldEZpZWxkTnVtYmVyID0gOCwKKyAgfTsKKyAgdm9pZCBzZXRfZGV2KHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X21vZGUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb2Zmc2V0KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbihpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zaXplKGludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2Jsb2Nrcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzRXZpY3RJbm9kZUZ0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovOCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBGMmZzRXZpY3RJbm9kZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEYyZnNFdmljdElub2RlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGMmZzRXZpY3RJbm9kZUZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Rldigp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkZXYoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lubygpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpbm8oKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3Bpbm8oKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGlubygpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbW9kZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8
ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8
NT4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCku
YXNfaW50NjQoKTsgfQorICBib29sIGhhc19ubGluaygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBubGluaygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNf
dWludDMyKCk7IH0KKyAgYm9vbCBoYXNfYmxvY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52
YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNf
dWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYWR2aXNlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52
YWxpZCgpOyB9CisgIHVpbnQzMl90IGFkdmlzZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNf
dWludDMyKCk7IH0KK307CisKK2NsYXNzIEYyZnNFdmljdElub2RlRnRyYWNlRXZlbnQgOiBwdWJs
aWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEYy
ZnNFdmljdElub2RlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAg
IGtEZXZGaWVsZE51bWJlciA9IDEsCisgICAga0lub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGlu
b0ZpZWxkTnVtYmVyID0gMywKKyAgICBrTW9kZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrU2l6ZUZp
ZWxkTnVtYmVyID0gNSwKKyAgICBrTmxpbmtGaWVsZE51bWJlciA9IDYsCisgICAga0Jsb2Nrc0Zp
ZWxkTnVtYmVyID0gNywKKyAgICBrQWR2aXNlRmllbGROdW1iZXIgPSA4LAorICB9OworICB2b2lk
IHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2lubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGlubyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbW9kZSh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2l6ZShp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9ubGluayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfYmxvY2tzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9hZHZpc2UodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBGMmZzRG9TdWJt
aXRCaW9GdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRjJmc0RvU3VibWl0QmlvRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgRjJmc0RvU3VibWl0QmlvRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBGMmZzRG9TdWJtaXRCaW9GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19kZXYoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgZGV2KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19idHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQor
ICBpbnQzMl90IGJ0eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX3N5bmMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3Qgc3luYygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9v
bCBoYXNfc2VjdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IHNlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBzaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xh
c3MgRjJmc0RvU3VibWl0QmlvRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEYyZnNEb1N1Ym1pdEJpb0Z0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRGV2RmllbGROdW1iZXIgPSAx
LAorICAgIGtCdHlwZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrU3luY0ZpZWxkTnVtYmVyID0gMywK
KyAgICBrU2VjdG9yRmllbGROdW1iZXIgPSA0LAorICAgIGtTaXplRmllbGROdW1iZXIgPSA1LAor
ICB9OworICB2b2lkIHNldF9kZXYodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2J0eXBlKGludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N5bmModWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NlY3Rv
cih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfc2l6ZSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1
ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2ZlbmNlLnBiemVy
by5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBE
TyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RS
QUNFX0ZUUkFDRV9GRU5DRV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9T
X1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9GRU5DRV9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVm
Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVk
X2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKwor
CitjbGFzcyBGZW5jZVNpZ25hbGVkRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEZlbmNlU2lnbmFsZWRG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGZW5jZVNpZ25hbGVkRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBGZW5jZVNpZ25hbGVkRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjb250ZXh0KCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19kcml2ZXIoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgZHJpdmVyKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19zZXFubygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzZXFubygpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGltZWxpbmUoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgdGltZWxpbmUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3N0cmluZygpOyB9Cit9Owor
CitjbGFzcyBGZW5jZVNpZ25hbGVkRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEZlbmNlU2lnbmFsZWRGdHJhY2VF
dmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0NvbnRleHRGaWVsZE51bWJl
ciA9IDEsCisgICAga0RyaXZlckZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2Vxbm9GaWVsZE51bWJl
ciA9IDMsCisgICAga1RpbWVsaW5lRmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9j
b250ZXh0KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9kcml2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X2RyaXZlcihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3NlcW5vKHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90aW1lbGluZShj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg0LCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfdGltZWxpbmUoY29uc3QgY2hhciog
ZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg0LCBkYXRhLCBzaXplKTsKKyAg
fQorfTsKKworY2xhc3MgRmVuY2VFbmFibGVTaWduYWxGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgRmVu
Y2VFbmFibGVTaWduYWxGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBG
ZW5jZUVuYWJsZVNpZ25hbEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgRmVuY2VFbmFibGVTaWduYWxG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jb250
ZXh0KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNvbnRl
eHQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2Ry
aXZlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBkcml2ZXIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9
CisgIGJvb2wgaGFzX3NlcW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IHNlcW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc190aW1lbGluZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0aW1lbGluZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEZlbmNlRW5hYmxlU2lnbmFsRnRyYWNlRXZl
bnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IEZlbmNlRW5hYmxlU2lnbmFsRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtDb250ZXh0RmllbGROdW1iZXIgPSAxLAorICAgIGtEcml2ZXJGaWVsZE51
bWJlciA9IDIsCisgICAga1NlcW5vRmllbGROdW1iZXIgPSAzLAorICAgIGtUaW1lbGluZUZpZWxk
TnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfY29udGV4dCh1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHJpdmVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9kcml2ZXIoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQorICB2
b2lkIHNldF9zZXFubyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGltZWxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7
CisgICAgQXBwZW5kQnl0ZXMoNCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9Cisg
IHZvaWQgc2V0X3RpbWVsaW5lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAg
QXBwZW5kQnl0ZXMoNCwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIEZlbmNlRGVzdHJv
eUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNv
ZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0q
L2ZhbHNlPiB7CisgcHVibGljOgorICBGZW5jZURlc3Ryb3lGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBGZW5jZURlc3Ryb3lGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEZl
bmNlRGVzdHJveUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX2NvbnRleHQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3QgY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfZHJpdmVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdENoYXJzIGRyaXZlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNf
c3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc2Vxbm8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgdWludDMyX3Qgc2Vxbm8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3Vp
bnQzMigpOyB9CisgIGJvb2wgaGFzX3RpbWVsaW5lKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHRpbWVsaW5lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgRmVuY2VEZXN0cm95RnRy
YWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IEZlbmNlRGVzdHJveUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrQ29udGV4dEZpZWxkTnVtYmVyID0gMSwKKyAgICBrRHJpdmVyRmllbGRO
dW1iZXIgPSAyLAorICAgIGtTZXFub0ZpZWxkTnVtYmVyID0gMywKKyAgICBrVGltZWxpbmVGaWVs
ZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2NvbnRleHQodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RyaXZlcihjb25z
dCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCks
IHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfZHJpdmVyKGNvbnN0IGNoYXIqIGRhdGEs
IHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAg
dm9pZCBzZXRfc2Vxbm8odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3RpbWVsaW5lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDQsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQor
ICB2b2lkIHNldF90aW1lbGluZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDQsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFzcyBGZW5jZUluaXRG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgRmVuY2VJbml0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgRmVuY2VJbml0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBGZW5jZUluaXRG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jb250
ZXh0KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNvbnRl
eHQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2Ry
aXZlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBkcml2ZXIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9
CisgIGJvb2wgaGFzX3NlcW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IHNlcW5vKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc190aW1lbGluZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0aW1lbGluZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEZlbmNlSW5pdEZ0cmFjZUV2ZW50IDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBG
ZW5jZUluaXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0Nv
bnRleHRGaWVsZE51bWJlciA9IDEsCisgICAga0RyaXZlckZpZWxkTnVtYmVyID0gMiwKKyAgICBr
U2Vxbm9GaWVsZE51bWJlciA9IDMsCisgICAga1RpbWVsaW5lRmllbGROdW1iZXIgPSA0LAorICB9
OworICB2b2lkIHNldF9jb250ZXh0KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kcml2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X2RyaXZlcihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3NlcW5vKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF90aW1lbGluZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRl
cyg0LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfdGltZWxp
bmUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg0LCBk
YXRhLCBzaXplKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4K
K30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvZmls
ZW1hcC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVy
IHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9GVFJBQ0VfRklMRU1BUF9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19Q
Uk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9GSUxFTUFQX1BST1RPX0hfCisKKyNp
bmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
YWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxz
LmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFj
ZSBwYnplcm8geworCisKK2NsYXNzIE1tRmlsZW1hcERlbGV0ZUZyb21QYWdlQ2FjaGVGdHJhY2VF
dmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4g
eworIHB1YmxpYzoKKyAgTW1GaWxlbWFwRGVsZXRlRnJvbVBhZ2VDYWNoZUZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1tRmlsZW1hcERlbGV0ZUZyb21QYWdlQ2FjaGVG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5z
aXplKCkpIHt9CisgIGV4cGxpY2l0IE1tRmlsZW1hcERlbGV0ZUZyb21QYWdlQ2FjaGVGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19wZm4oKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGZuKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pX2lubygpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpX2lubygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaW5kZXgoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW5kZXgoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NfZGV2KCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNfZGV2KCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wYWdlKCkgY29uc3QgeyByZXR1cm4g
YXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDw1
PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBNbUZpbGVtYXBEZWxldGVGcm9tUGFnZUNh
Y2hlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IE1tRmlsZW1hcERlbGV0ZUZyb21QYWdlQ2FjaGVGdHJhY2VFdmVu
dF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1BmbkZpZWxkTnVtYmVyID0gMSwK
KyAgICBrSUlub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrSW5kZXhGaWVsZE51bWJlciA9IDMsCisg
ICAga1NEZXZGaWVsZE51bWJlciA9IDQsCisgICAga1BhZ2VGaWVsZE51bWJlciA9IDUsCisgIH07
CisgIHZvaWQgc2V0X3Bmbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaV9pbm8odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2luZGV4KHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zX2Rldih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcGFnZSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIE1tRmlsZW1hcEFkZFRvUGFnZUNhY2hlRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIE1tRmlsZW1hcEFkZFRvUGFnZUNhY2hlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgTW1GaWxlbWFwQWRkVG9QYWdlQ2FjaGVGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IE1tRmlsZW1hcEFkZFRvUGFnZUNhY2hlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCBy
YXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGZuKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIHVpbnQ2NF90IHBmbigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfaV9pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgaV9pbm8oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19zX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBzX2RldigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfcGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBwYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorfTsK
KworY2xhc3MgTW1GaWxlbWFwQWRkVG9QYWdlQ2FjaGVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTW1GaWxlbWFw
QWRkVG9QYWdlQ2FjaGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga1BmbkZpZWxkTnVtYmVyID0gMSwKKyAgICBrSUlub0ZpZWxkTnVtYmVyID0gMiwKKyAgICBr
SW5kZXhGaWVsZE51bWJlciA9IDMsCisgICAga1NEZXZGaWVsZE51bWJlciA9IDQsCisgICAga1Bh
Z2VGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X3Bmbih1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaV9pbm8odWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2luZGV4KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9zX2Rldih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFnZSh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4K
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJh
Y2UvZnRyYWNlL2Z0cmFjZS5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9a
ZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfRlRSQUNFX1BST1RPX0hfCisjZGVmaW5l
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX0ZUUkFDRV9QUk9U
T19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNz
YWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7
CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBQcmludEZ0cmFjZUV2ZW50X0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBQcmludEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFByaW50RnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBQcmludEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX2lwKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IGlwKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19idWYoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Q2hhcnMgYnVmKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19z
dHJpbmcoKTsgfQorfTsKKworY2xhc3MgUHJpbnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUHJpbnRGdHJhY2VF
dmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lwRmllbGROdW1iZXIgPSAx
LAorICAgIGtCdWZGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2lwKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9i
dWYoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUu
ZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2J1Zihjb25zdCBjaGFyKiBk
YXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9
Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2Uu
CisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9ncHVfbWVtLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZU
UkFDRV9HUFVfTUVNX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVS
RkVUVE9fVFJBQ0VfRlRSQUNFX0dQVV9NRU1fUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5o
PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9m
aWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKwor
Y2xhc3MgR3B1TWVtVG90YWxGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgR3B1TWVtVG90YWxGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBHcHVNZW1Ub3RhbEZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgR3B1TWVtVG90YWxGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19ncHVfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgZ3B1X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50
MzIoKTsgfQorICBib29sIGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgdWludDMyX3QgcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsg
fQorICBib29sIGhhc19zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IHNpemUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9Cit9
OworCitjbGFzcyBHcHVNZW1Ub3RhbEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBHcHVNZW1Ub3RhbEZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrR3B1SWRGaWVsZE51bWJlciA9
IDEsCisgICAga1BpZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2l6ZUZpZWxkTnVtYmVyID0gMywK
KyAgfTsKKyAgdm9pZCBzZXRfZ3B1X2lkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9waWQodWludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NpemUodWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIElu
Y2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9z
L3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9pMmMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkg
dGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX0kyQ19QUk9UT19IXwor
I2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9JMkNf
UFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
bWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90
b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgU21idXNSZXBseUZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBTbWJ1c1JlcGx5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgU21idXNSZXBseUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihy
YXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU21idXNSZXBseUZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2FkYXB0ZXJfbnIo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBhZGFwdGVyX25y
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2FkZHIo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYWRkcigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmxhZ3MoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2NvbW1hbmQoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgY29tbWFuZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxlbigpIGNvbnN0IHsg
cmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcHJvdG9jb2woKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcHJvdG9jb2woKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBTbWJ1c1JlcGx5
RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IFNtYnVzUmVwbHlGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga0FkYXB0ZXJOckZpZWxkTnVtYmVyID0gMSwKKyAgICBrQWRkckZpZWxk
TnVtYmVyID0gMiwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDMsCisgICAga0NvbW1hbmRGaWVs
ZE51bWJlciA9IDQsCisgICAga0xlbkZpZWxkTnVtYmVyID0gNSwKKyAgICBrUHJvdG9jb2xGaWVs
ZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2FkYXB0ZXJfbnIoaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWRkcih1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X2NvbW1hbmQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJvdG9jb2wodWludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9Cit9OworCitjbGFz
cyBTbWJ1c1Jlc3VsdEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5
cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNywgLypIQVNfTk9OUEFDS0VEX1JFUEVB
VEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTbWJ1c1Jlc3VsdEZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVj
b2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFNtYnVzUmVzdWx0RnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBTbWJ1c1Jlc3VsdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2FkYXB0ZXJfbnIoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBhZGFwdGVyX25yKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19p
bnQzMigpOyB9CisgIGJvb2wgaGFzX2FkZHIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgYWRkcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMy
KCk7IH0KKyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7
IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX3JlYWRfd3JpdGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgcmVhZF93cml0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNf
dWludDMyKCk7IH0KKyAgYm9vbCBoYXNfY29tbWFuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBjb21tYW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5h
c191aW50MzIoKTsgfQorICBib29sIGhhc19yZXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCByZXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2ludDMy
KCk7IH0KKyAgYm9vbCBoYXNfcHJvdG9jb2woKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgcHJvdG9jb2woKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3Vp
bnQzMigpOyB9Cit9OworCitjbGFzcyBTbWJ1c1Jlc3VsdEZ0cmFjZUV2ZW50IDogcHVibGljIDo6
cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTbWJ1c1Jl
c3VsdEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQWRhcHRl
ck5yRmllbGROdW1iZXIgPSAxLAorICAgIGtBZGRyRmllbGROdW1iZXIgPSAyLAorICAgIGtGbGFn
c0ZpZWxkTnVtYmVyID0gMywKKyAgICBrUmVhZFdyaXRlRmllbGROdW1iZXIgPSA0LAorICAgIGtD
b21tYW5kRmllbGROdW1iZXIgPSA1LAorICAgIGtSZXNGaWVsZE51bWJlciA9IDYsCisgICAga1By
b3RvY29sRmllbGROdW1iZXIgPSA3LAorICB9OworICB2b2lkIHNldF9hZGFwdGVyX25yKGludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2FkZHIodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZWFkX3dyaXRlKHVpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jb21tYW5kKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9yZXMoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfcHJvdG9jb2wodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTbWJ1c1dyaXRlRnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki82LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIFNtYnVzV3JpdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBT
bWJ1c1dyaXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTbWJ1c1dyaXRlRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfYWRhcHRlcl9ucigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGFkYXB0ZXJfbnIoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfYWRkcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBhZGRyKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfY29tbWFuZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjb21tYW5kKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJl
dHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGVuKCkgY29uc3QgeyByZXR1cm4g
YXQ8NT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19wcm90b2NvbCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBwcm90b2NvbCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDY+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIFNtYnVzV3JpdGVGdHJhY2VF
dmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gU21idXNXcml0ZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrQWRhcHRlck5yRmllbGROdW1iZXIgPSAxLAorICAgIGtBZGRyRmllbGROdW1iZXIg
PSAyLAorICAgIGtGbGFnc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrQ29tbWFuZEZpZWxkTnVtYmVy
ID0gNCwKKyAgICBrTGVuRmllbGROdW1iZXIgPSA1LAorICAgIGtQcm90b2NvbEZpZWxkTnVtYmVy
ID0gNiwKKyAgfTsKKyAgdm9pZCBzZXRfYWRhcHRlcl9ucihpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9hZGRyKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFn
cyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfY29tbWFuZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wcm90b2NvbCh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFNtYnVz
UmVhZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9E
ZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxE
Uz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTbWJ1c1JlYWRGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBTbWJ1c1JlYWRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFNtYnVz
UmVhZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X2FkYXB0ZXJfbnIoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBhZGFwdGVyX25yKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJv
b2wgaGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19hZGRyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGFkZHIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X2NvbW1hbmQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
Y29tbWFuZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfcHJvdG9jb2woKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgcHJvdG9jb2woKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9Cit9Owor
CitjbGFzcyBTbWJ1c1JlYWRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gU21idXNSZWFkRnRyYWNlRXZlbnRfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtBZGFwdGVyTnJGaWVsZE51bWJlciA9IDEs
CisgICAga0ZsYWdzRmllbGROdW1iZXIgPSAyLAorICAgIGtBZGRyRmllbGROdW1iZXIgPSAzLAor
ICAgIGtDb21tYW5kRmllbGROdW1iZXIgPSA0LAorICAgIGtQcm90b2NvbEZpZWxkTnVtYmVyID0g
NSwKKyAgfTsKKyAgdm9pZCBzZXRfYWRhcHRlcl9ucihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWRkcih1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfY29tbWFuZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJvdG9jb2wodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBJMmNSZXBseUZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBJMmNSZXBseUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEkyY1JlcGx5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5k
YXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBJMmNSZXBseUZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2FkYXB0ZXJfbnIoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBhZGFwdGVyX25yKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX21zZ19ucigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtc2dfbnIoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2FkZHIoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYWRkcigpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2J1ZigpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBidWYoKSBjb25zdCB7IHJldHVybiBhdDw2Pigp
LmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBJMmNSZXBseUZ0cmFjZUV2ZW50IDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJMmNS
ZXBseUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQWRhcHRl
ck5yRmllbGROdW1iZXIgPSAxLAorICAgIGtNc2dOckZpZWxkTnVtYmVyID0gMiwKKyAgICBrQWRk
ckZpZWxkTnVtYmVyID0gMywKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDQsCisgICAga0xlbkZp
ZWxkTnVtYmVyID0gNSwKKyAgICBrQnVmRmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNl
dF9hZGFwdGVyX25yKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X21zZ19ucih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWRkcih1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxhZ3ModWludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2xlbih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfYnVmKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZh
bHVlKTsKKyAgfQorfTsKKworY2xhc3MgSTJjUmVzdWx0RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEky
Y1Jlc3VsdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEkyY1Jlc3Vs
dEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3
LnNpemUoKSkge30KKyAgZXhwbGljaXQgSTJjUmVzdWx0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfYWRhcHRlcl9ucigpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGFkYXB0ZXJfbnIoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfbnJfbXNncygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBucl9tc2dzKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19yZXQoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCByZXQoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIEkyY1Jlc3VsdEZ0cmFjZUV2ZW50IDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJ
MmNSZXN1bHRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0Fk
YXB0ZXJOckZpZWxkTnVtYmVyID0gMSwKKyAgICBrTnJNc2dzRmllbGROdW1iZXIgPSAyLAorICAg
IGtSZXRGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2FkYXB0ZXJfbnIoaW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
bnJfbXNncyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcmV0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBJMmNXcml0ZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJ
MmNXcml0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEkyY1dyaXRl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBJMmNXcml0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2FkYXB0ZXJfbnIoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBhZGFwdGVyX25yKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX21zZ19ucigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtc2dfbnIoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2FkZHIoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYWRkcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3Vp
bnQzMigpOyB9CisgIGJvb2wgaGFzX2J1ZigpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBidWYoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQzMigp
OyB9Cit9OworCitjbGFzcyBJMmNXcml0ZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJMmNXcml0ZUZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQWRhcHRlck5yRmllbGROdW1i
ZXIgPSAxLAorICAgIGtNc2dOckZpZWxkTnVtYmVyID0gMiwKKyAgICBrQWRkckZpZWxkTnVtYmVy
ID0gMywKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDQsCisgICAga0xlbkZpZWxkTnVtYmVyID0g
NSwKKyAgICBrQnVmRmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNldF9hZGFwdGVyX25y
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X21zZ19ucih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWRkcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
YnVmKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQor
fTsKKworY2xhc3MgSTJjUmVhZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJMmNSZWFkRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSTJjUmVhZEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgSTJjUmVhZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX2FkYXB0ZXJfbnIoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCBhZGFwdGVyX25yKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigp
OyB9CisgIGJvb2wgaGFzX21zZ19ucigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBtc2dfbnIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX2FkZHIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgdWludDMyX3QgYWRkcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0K
KyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9Cisg
IGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50
MzJfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitj
bGFzcyBJMmNSZWFkRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEkyY1JlYWRGdHJhY2VFdmVudF9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga0FkYXB0ZXJOckZpZWxkTnVtYmVyID0gMSwKKyAgICBr
TXNnTnJGaWVsZE51bWJlciA9IDIsCisgICAga0FkZHJGaWVsZE51bWJlciA9IDMsCisgICAga0Zs
YWdzRmllbGROdW1iZXIgPSA0LAorICAgIGtMZW5GaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZv
aWQgc2V0X2FkYXB0ZXJfbnIoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbXNnX25yKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9hZGRyKHVpbnQzMl90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyh1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbGVuKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsK
KyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNw
YWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvaW9uLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZU
UkFDRV9JT05fUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9GVFJBQ0VfSU9OX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNs
dWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0
byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCisKK2NsYXNzIElv
blN0YXRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgSW9uU3RhdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IElvblN0YXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IElvblN0YXRG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19idWZm
ZXJfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgYnVm
ZmVyX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhh
c19sZW4oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBsZW4o
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfdG90YWxf
YWxsb2NhdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHRvdGFsX2FsbG9jYXRlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0K
K307CisKK2NsYXNzIElvblN0YXRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW9uU3RhdEZ0cmFjZUV2ZW50X0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQnVmZmVySWRGaWVsZE51bWJlciA9IDEs
CisgICAga0xlbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrVG90YWxBbGxvY2F0ZWRGaWVsZE51bWJl
ciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2J1ZmZlcl9pZCh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKGludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RvdGFs
X2FsbG9jYXRlZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7
CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2lwaS5wYnplcm8uaAor
Ly8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9U
IEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9G
VFJBQ0VfSVBJX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfRlRSQUNFX0lQSV9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5j
bHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBJ
cGlSYWlzZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJcGlSYWlzZUZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IElwaVJhaXNlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBJcGlS
YWlzZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X3RhcmdldF9jcHVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IHRhcmdldF9jcHVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc19yZWFzb24oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Q2hhcnMgcmVhc29uKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgSXBpUmFpc2VGdHJhY2VFdmVudCA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSXBpUmFp
c2VGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RhcmdldENw
dXNGaWVsZE51bWJlciA9IDEsCisgICAga1JlYXNvbkZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAg
dm9pZCBzZXRfdGFyZ2V0X2NwdXModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3JlYXNvbihjb25zdCBzdGQ6OnN0cmluZyYgdmFs
dWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cisg
IH0KKyAgdm9pZCBzZXRfcmVhc29uKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIElwaUV4aXRG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgSXBpRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IElwaUV4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IElwaUV4aXRGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19yZWFzb24oKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgcmVhc29uKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorfTsKKwor
Y2xhc3MgSXBpRXhpdEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJcGlFeGl0RnRyYWNlRXZlbnRfRGVjb2RlcjsK
KyAgZW51bSA6IGludDMyX3QgeworICAgIGtSZWFzb25GaWVsZE51bWJlciA9IDEsCisgIH07Cisg
IHZvaWQgc2V0X3JlYXNvbihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRC
eXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfcmVh
c29uKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwg
ZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIElwaUVudHJ5RnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIElwaUVudHJ5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSXBp
RW50cnlGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IElwaUVudHJ5RnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcmVhc29uKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHJlYXNvbigpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIElwaUVudHJ5
RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IElwaUVudHJ5RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtSZWFzb25GaWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X3Jl
YXNvbihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1
ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfcmVhc29uKGNvbnN0IGNo
YXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7
CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdp
biBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNlL2lycS5wYnplcm8uaAor
Ly8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9U
IEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9G
VFJBQ0VfSVJRX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfRlRSQUNFX0lSUV9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5j
bHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0
dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBJ
cnFIYW5kbGVyRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5
cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVB
VEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJcnFIYW5kbGVyRXhpdEZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IElycUhhbmRsZXJFeGl0RnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBJcnFIYW5kbGVyRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2lycSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IGlycSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIo
KTsgfQorICBib29sIGhhc19yZXQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCByZXQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KK307
CisKK2NsYXNzIElycUhhbmRsZXJFeGl0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86
Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IElycUhhbmRsZXJFeGl0RnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtJcnFGaWVsZE51bWJl
ciA9IDEsCisgICAga1JldEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfaXJxKGlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3JldChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorfTsKKworY2xhc3MgSXJxSGFuZGxlckVudHJ5RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIElycUhh
bmRsZXJFbnRyeUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IElycUhh
bmRsZXJFbnRyeUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSXJxSGFuZGxlckVudHJ5RnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaXJxKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgaXJxKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfaGFuZGxlcigp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBoYW5kbGVyKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgSXJxSGFu
ZGxlckVudHJ5RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IElycUhhbmRsZXJFbnRyeUZ0cmFjZUV2ZW50X0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrSXJxRmllbGROdW1iZXIgPSAxLAorICAgIGtO
YW1lRmllbGROdW1iZXIgPSAyLAorICAgIGtIYW5kbGVyRmllbGROdW1iZXIgPSAzLAorICB9Owor
ICB2b2lkIHNldF9pcnEoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAg
ICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9p
ZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2hhbmRsZXIodWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTb2Z0
aXJxUmFpc2VGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgU29mdGlycVJhaXNlRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU29mdGlycVJhaXNlRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBTb2Z0aXJxUmFpc2VGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc192ZWMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgdmVjKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorfTsK
KworY2xhc3MgU29mdGlycVJhaXNlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFNvZnRpcnFSYWlzZUZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVmVjRmllbGROdW1iZXIgPSAx
LAorICB9OworICB2b2lkIHNldF92ZWModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTb2Z0aXJxRXhpdEZ0cmFjZUV2ZW50X0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBTb2Z0aXJxRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IFNvZnRpcnFFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJh
dy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTb2Z0aXJxRXhpdEZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3ZlYygpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB2ZWMoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBTb2Z0aXJxRXhpdEZ0cmFj
ZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5n
IERlY29kZXIgPSBTb2Z0aXJxRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrVmVjRmllbGROdW1iZXIgPSAxLAorICB9OworICB2b2lkIHNldF92ZWModWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCitj
bGFzcyBTb2Z0aXJxRW50cnlGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgU29mdGlycUVudHJ5RnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU29mdGlycUVudHJ5RnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBTb2Z0aXJxRW50cnlGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc192ZWMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgdmVjKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIo
KTsgfQorfTsKKworY2xhc3MgU29mdGlycUVudHJ5RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90
b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFNvZnRpcnFFbnRy
eUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVmVjRmllbGRO
dW1iZXIgPSAxLAorICB9OworICB2b2lkIHNldF92ZWModWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8g
TmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNl
L2Z0cmFjZS9rbWVtLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8g
Y29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1Nf
UFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9LTUVNX1BST1RPX0hfCisjZGVmaW5lIFBFUkZF
VFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX0tNRU1fUFJPVE9fSF8KKwor
I2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRp
bHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNw
YWNlIHBiemVybyB7CisKKworY2xhc3MgSW9uQnVmZmVyRGVzdHJveUZ0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBJb25CdWZmZXJEZXN0cm95RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgSW9uQnVmZmVyRGVzdHJveUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSW9uQnVmZmVyRGVz
dHJveUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X2FkZHIoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYWRk
cigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbGVu
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGxlbigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIElvbkJ1ZmZl
ckRlc3Ryb3lGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gSW9uQnVmZmVyRGVzdHJveUZ0cmFjZUV2ZW50X0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQWRkckZpZWxkTnVtYmVyID0gMSwKKyAgICBr
TGVuRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9hZGRyKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZW4odWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCitj
bGFzcyBJb25CdWZmZXJDcmVhdGVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgSW9uQnVmZmVyQ3JlYXRl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSW9uQnVmZmVyQ3JlYXRl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBJb25CdWZmZXJDcmVhdGVGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19hZGRyKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGFkZHIoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFz
X3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBJb25CdWZmZXJDcmVhdGVGdHJhY2VFdmVudCA6IHB1
YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0g
SW9uQnVmZmVyQ3JlYXRlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qgewor
ICAgIGtBZGRyRmllbGROdW1iZXIgPSAxLAorICAgIGtMZW5GaWVsZE51bWJlciA9IDIsCisgIH07
CisgIHZvaWQgc2V0X2FkZHIodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIElvbkhlYXBHcm93RnRyYWNlRXZl
bnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhf
RklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsK
KyBwdWJsaWM6CisgIElvbkhlYXBHcm93RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgSW9uSGVhcEdyb3dGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IElvbkhlYXBHcm93RnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaGVhcF9u
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdENoYXJzIGhlYXBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7
IH0KKyAgYm9vbCBoYXNfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IGxlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfdG90YWxfYWxsb2NhdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgp
OyB9CisgIGludDY0X3QgdG90YWxfYWxsb2NhdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5h
c19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBJb25IZWFwR3Jvd0Z0cmFjZUV2ZW50IDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJb25I
ZWFwR3Jvd0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrSGVh
cE5hbWVGaWVsZE51bWJlciA9IDEsCisgICAga0xlbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrVG90
YWxBbGxvY2F0ZWRGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2hlYXBfbmFtZShj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfaGVhcF9uYW1lKGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90b3RhbF9hbGxvY2F0ZWQoaW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIElvbkhlYXBT
aHJpbmtGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgSW9uSGVhcFNocmlua0Z0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rlcihk
YXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IElvbkhlYXBTaHJpbmtGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IElvbkhlYXBTaHJpbmtGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19oZWFwX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgaGVhcF9uYW1lKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc190b3RhbF9hbGxvY2F0ZWQoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0b3RhbF9hbGxvY2F0ZWQoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KK307CisKK2NsYXNzIElvbkhlYXBTaHJp
bmtGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgor
ICB1c2luZyBEZWNvZGVyID0gSW9uSGVhcFNocmlua0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrSGVhcE5hbWVGaWVsZE51bWJlciA9IDEsCisgICAga0xlbkZp
ZWxkTnVtYmVyID0gMiwKKyAgICBrVG90YWxBbGxvY2F0ZWRGaWVsZE51bWJlciA9IDMsCisgIH07
CisgIHZvaWQgc2V0X2hlYXBfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBB
cHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBz
ZXRfaGVhcF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5k
Qnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90b3RhbF9h
bGxvY2F0ZWQoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7Cisg
IH0KK307CisKK2NsYXNzIFJzc1N0YXRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJv
dG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBB
Q0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUnNzU3RhdEZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFJzc1N0YXRGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRl
cnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9Cisg
IGV4cGxpY2l0IFJzc1N0YXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19tZW1iZXIoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCBtZW1iZXIoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0K
KyAgYm9vbCBoYXNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBp
bnQ2NF90IHNpemUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDY0KCk7IH0KKyAgYm9v
bCBoYXNfY3VycigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBjdXJyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhh
c19tbV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBt
bV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNz
IFJzc1N0YXRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gUnNzU3RhdEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrTWVtYmVyRmllbGROdW1iZXIgPSAxLAorICAgIGtTaXplRmll
bGROdW1iZXIgPSAyLAorICAgIGtDdXJyRmllbGROdW1iZXIgPSAzLAorICAgIGtNbUlkRmllbGRO
dW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9tZW1iZXIoaW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2l6ZShpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jdXJy
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9tbV9pZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1
ZSk7CisgIH0KK307CisKK2NsYXNzIE1tUGFnZVBjcHVEcmFpbkZ0cmFjZUV2ZW50X0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
NCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBNbVBhZ2VQY3B1RHJhaW5GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBNbVBhZ2VQY3B1RHJhaW5GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1tUGFnZVBjcHVEcmFpbkZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX21pZ3Jh
dGV0eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbWln
cmF0ZXR5cGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBo
YXNfb3JkZXIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
b3JkZXIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X3BhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGFn
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcGZu
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBmbigpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIE1tUGFnZVBj
cHVEcmFpbkZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBNbVBhZ2VQY3B1RHJhaW5GdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga01pZ3JhdGV0eXBlRmllbGROdW1iZXIgPSAxLAor
ICAgIGtPcmRlckZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGFnZUZpZWxkTnVtYmVyID0gMywKKyAg
ICBrUGZuRmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9taWdyYXRldHlwZShpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9vcmRlcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfcGFnZSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgz
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGZuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTW1QYWdlRnJlZUJhdGNoZWRG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgTW1QYWdlRnJlZUJhdGNoZWRGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBNbVBhZ2VGcmVlQmF0Y2hlZEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgTW1QYWdlRnJlZUJhdGNoZWRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19jb2xkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgp
OyB9CisgIGludDMyX3QgY29sZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19wYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IHBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX3BmbigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBwZm4oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitj
bGFzcyBNbVBhZ2VGcmVlQmF0Y2hlZEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNbVBhZ2VGcmVlQmF0Y2hlZEZ0
cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29sZEZpZWxkTnVt
YmVyID0gMSwKKyAgICBrUGFnZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGZuRmllbGROdW1iZXIg
PSAzLAorICB9OworICB2b2lkIHNldF9jb2xkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhZ2UodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Bmbih1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNz
IE1tUGFnZUZyZWVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTW1QYWdlRnJlZUZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rl
cihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1tUGFnZUZyZWVGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IE1tUGFnZUZyZWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1
aW50MzJfdCBvcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfcGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBwYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19wZm4oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
cGZuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3Mg
TW1QYWdlRnJlZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNbVBhZ2VGcmVlRnRyYWNlRXZlbnRfRGVjb2RlcjsK
KyAgZW51bSA6IGludDMyX3QgeworICAgIGtPcmRlckZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGFn
ZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrUGZuRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lk
IHNldF9vcmRlcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcGFnZSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGZuKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTW1QYWdlQWxsb2Nab25l
TG9ja2VkRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklF
TERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1tUGFnZUFsbG9jWm9uZUxvY2tlZEZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1tUGFnZUFsbG9jWm9uZUxvY2tlZEZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgTW1QYWdlQWxsb2Nab25lTG9ja2VkRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbWlncmF0ZXR5cGUoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBtaWdyYXRldHlwZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19vcmRlcigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBvcmRlcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGFnZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwYWdlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wZm4oKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGZuKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgTW1QYWdlQWxsb2Nab25lTG9ja2Vk
RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IE1tUGFnZUFsbG9jWm9uZUxvY2tlZEZ0cmFjZUV2ZW50X0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTWlncmF0ZXR5cGVGaWVsZE51bWJlciA9IDEsCisg
ICAga09yZGVyRmllbGROdW1iZXIgPSAyLAorICAgIGtQYWdlRmllbGROdW1iZXIgPSAzLAorICAg
IGtQZm5GaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X21pZ3JhdGV0eXBlKGludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X29yZGVyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9wYWdlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wZm4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBNbVBhZ2VBbGxvY0V4dGZyYWdG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzcsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgTW1QYWdlQWxsb2NFeHRmcmFnRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRh
dGEsIGxlbikge30KKyAgZXhwbGljaXQgTW1QYWdlQWxsb2NFeHRmcmFnRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBNbVBhZ2VBbGxvY0V4dGZyYWdGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19hbGxvY19taWdyYXRldHlwZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGFsbG9jX21pZ3JhdGV0eXBlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2FsbG9jX29yZGVyKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgYWxsb2Nfb3JkZXIo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmFsbGJh
Y2tfbWlncmF0ZXR5cGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCBmYWxsYmFja19taWdyYXRldHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50
MzIoKTsgfQorICBib29sIGhhc19mYWxsYmFja19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGZhbGxiYWNrX29yZGVyKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BhZ2UoKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfY2hhbmdlX293bmVyc2hpcCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGNoYW5nZV9vd25lcnNoaXAoKSBj
b25zdCB7IHJldHVybiBhdDw2PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGZuKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBmbigpIGNvbnN0IHsg
cmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIE1tUGFnZUFsbG9jRXh0
ZnJhZ0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBNbVBhZ2VBbGxvY0V4dGZyYWdGdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga0FsbG9jTWlncmF0ZXR5cGVGaWVsZE51bWJlciA9
IDEsCisgICAga0FsbG9jT3JkZXJGaWVsZE51bWJlciA9IDIsCisgICAga0ZhbGxiYWNrTWlncmF0
ZXR5cGVGaWVsZE51bWJlciA9IDMsCisgICAga0ZhbGxiYWNrT3JkZXJGaWVsZE51bWJlciA9IDQs
CisgICAga1BhZ2VGaWVsZE51bWJlciA9IDUsCisgICAga0NoYW5nZU93bmVyc2hpcEZpZWxkTnVt
YmVyID0gNiwKKyAgICBrUGZuRmllbGROdW1iZXIgPSA3LAorICB9OworICB2b2lkIHNldF9hbGxv
Y19taWdyYXRldHlwZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9hbGxvY19vcmRlcihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mYWxsYmFja19taWdyYXRldHlw
ZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9mYWxsYmFja19vcmRlcihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYWdlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jaGFuZ2Vfb3duZXJzaGlw
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3Bmbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIE1tUGFnZUFsbG9jRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1tUGFn
ZUFsbG9jRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTW1QYWdlQWxs
b2NGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1tUGFnZUFsbG9jRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZ2ZwX2ZsYWdzKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGdmcF9mbGFncygpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbWlncmF0ZXR5cGUoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBtaWdyYXRldHlwZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19vcmRlcigpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBvcmRlcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGFnZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwYWdlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wZm4oKSBjb25zdCB7IHJl
dHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGZuKCkgY29uc3QgeyByZXR1cm4g
YXQ8NT4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgTW1QYWdlQWxsb2NGdHJhY2VFdmVu
dCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNv
ZGVyID0gTW1QYWdlQWxsb2NGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0dmcEZsYWdzRmllbGROdW1iZXIgPSAxLAorICAgIGtNaWdyYXRldHlwZUZpZWxkTnVt
YmVyID0gMiwKKyAgICBrT3JkZXJGaWVsZE51bWJlciA9IDMsCisgICAga1BhZ2VGaWVsZE51bWJl
ciA9IDQsCisgICAga1BmbkZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfZ2ZwX2Zs
YWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9taWdyYXRldHlwZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vcmRlcih1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGFnZSh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGZu
KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsK
KworY2xhc3MgTWlncmF0ZVJldHJ5RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1pZ3JhdGVSZXRyeUZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1pZ3JhdGVSZXRyeUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgTWlncmF0ZVJldHJ5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRh
LCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdHJpZXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LnZhbGlkKCk7IH0KKyAgaW50MzJfdCB0cmllcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNf
aW50MzIoKTsgfQorfTsKKworY2xhc3MgTWlncmF0ZVJldHJ5RnRyYWNlRXZlbnQgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1pZ3Jh
dGVSZXRyeUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVHJp
ZXNGaWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X3RyaWVzKGludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBNaWdyYXRl
UGFnZXNTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBNaWdyYXRlUGFnZXNTdGFydEZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1pZ3JhdGVQYWdlc1N0YXJ0RnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBNaWdyYXRlUGFnZXNTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX21vZGUoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBtb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c19pbnQzMigpOyB9Cit9OworCitjbGFzcyBNaWdyYXRlUGFnZXNTdGFydEZ0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBNaWdyYXRlUGFnZXNTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrTW9kZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfbW9kZShpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xh
c3MgTWlncmF0ZVBhZ2VzRW5kRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVy
bzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19OT05QQUNLRURf
UkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1pZ3JhdGVQYWdlc0VuZEZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1pZ3JhdGVQYWdlc0VuZEZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgTWlncmF0ZVBhZ2VzRW5kRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG1vZGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIE1pZ3JhdGVQYWdlc0VuZEZ0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBNaWdyYXRlUGFnZXNFbmRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga01vZGVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X21vZGUoaW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNz
IEttZW1DYWNoZUZyZWVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgS21lbUNhY2hlRnJlZUZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEttZW1DYWNoZUZyZWVGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9
CisgIGV4cGxpY2l0IEttZW1DYWNoZUZyZWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19jYWxsX3NpdGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3QgY2FsbF9zaXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wdHIoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcHRyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191
aW50NjQoKTsgfQorfTsKKworY2xhc3MgS21lbUNhY2hlRnJlZUZ0cmFjZUV2ZW50IDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBLbWVt
Q2FjaGVGcmVlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtD
YWxsU2l0ZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUHRyRmllbGROdW1iZXIgPSAyLAorICB9Owor
ICB2b2lkIHNldF9jYWxsX3NpdGUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3B0cih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEttZW1DYWNoZUFsbG9jTm9k
ZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNv
ZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0q
L2ZhbHNlPiB7CisgcHVibGljOgorICBLbWVtQ2FjaGVBbGxvY05vZGVGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBLbWVtQ2FjaGVBbGxvY05vZGVGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRl
cnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9Cisg
IGV4cGxpY2l0IEttZW1DYWNoZUFsbG9jTm9kZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2J5dGVzX2FsbG9jKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJ5dGVzX2FsbG9jKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19ieXRlc19yZXEoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYnl0ZXNfcmVxKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19jYWxsX3NpdGUoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgY2FsbF9zaXRlKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19nZnBfZmxhZ3Mo
KSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZ2ZwX2ZsYWdz
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19ub2Rl
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qgbm9kZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19wdHIoKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcHRyKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgS21lbUNhY2hlQWxsb2NO
b2RlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IEttZW1DYWNoZUFsbG9jTm9kZUZ0cmFjZUV2ZW50X0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQnl0ZXNBbGxvY0ZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrQnl0ZXNSZXFGaWVsZE51bWJlciA9IDIsCisgICAga0NhbGxTaXRlRmllbGROdW1iZXIgPSAz
LAorICAgIGtHZnBGbGFnc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrTm9kZUZpZWxkTnVtYmVyID0g
NSwKKyAgICBrUHRyRmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNldF9ieXRlc19hbGxv
Yyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfYnl0ZXNfcmVxKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jYWxsX3NpdGUodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2dmcF9mbGFncyh1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfbm9kZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9wdHIodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBLbWVtQ2FjaGVBbGxvY0Z0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBLbWVtQ2FjaGVBbGxvY0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEttZW1DYWNoZUFsbG9jRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBLbWVtQ2FjaGVBbGxvY0Z0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2J5dGVz
X2FsbG9jKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJ5
dGVzX2FsbG9jKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19ieXRlc19yZXEoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgYnl0ZXNfcmVxKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19jYWxsX3NpdGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgY2FsbF9zaXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19nZnBfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgZ2ZwX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19wdHIoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgcHRyKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQo
KTsgfQorfTsKKworY2xhc3MgS21lbUNhY2hlQWxsb2NGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gS21lbUNhY2hl
QWxsb2NGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0J5dGVz
QWxsb2NGaWVsZE51bWJlciA9IDEsCisgICAga0J5dGVzUmVxRmllbGROdW1iZXIgPSAyLAorICAg
IGtDYWxsU2l0ZUZpZWxkTnVtYmVyID0gMywKKyAgICBrR2ZwRmxhZ3NGaWVsZE51bWJlciA9IDQs
CisgICAga1B0ckZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfYnl0ZXNfYWxsb2Mo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2J5dGVzX3JlcSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2FsbF9zaXRlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9nZnBfZmxhZ3ModWludDMy
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X3B0cih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0K
K307CisKK2NsYXNzIEttYWxsb2NOb2RlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki82LCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEttYWxsb2NOb2Rl
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgS21hbGxvY05vZGVGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IEttYWxsb2NOb2RlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRh
LCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfYnl0ZXNfYWxsb2MoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYnl0ZXNfYWxsb2MoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2J5dGVzX3JlcSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBieXRlc19yZXEoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NhbGxfc2l0ZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjYWxsX3NpdGUoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2dmcF9mbGFn
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBnZnBfZmxh
Z3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX25v
ZGUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBub2RlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3B0cigpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwdHIoKSBjb25zdCB7
IHJldHVybiBhdDw2PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBLbWFsbG9jTm9kZUZ0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBLbWFsbG9jTm9kZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrQnl0ZXNBbGxvY0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrQnl0ZXNSZXFG
aWVsZE51bWJlciA9IDIsCisgICAga0NhbGxTaXRlRmllbGROdW1iZXIgPSAzLAorICAgIGtHZnBG
bGFnc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrTm9kZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrUHRy
RmllbGROdW1iZXIgPSA2LAorICB9OworICB2b2lkIHNldF9ieXRlc19hbGxvYyh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYnl0
ZXNfcmVxKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9jYWxsX3NpdGUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2dmcF9mbGFncyh1aW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbm9kZShpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9wdHIodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9
Cit9OworCitjbGFzcyBLbWFsbG9jRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEttYWxsb2NGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBLbWFsbG9jRnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBLbWFsbG9jRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfYnl0ZXNfYWxsb2MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3QgYnl0ZXNfYWxsb2MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX2J5dGVzX3JlcSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBieXRlc19yZXEoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NhbGxfc2l0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjYWxsX3NpdGUoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2dmcF9mbGFncygpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBnZnBfZmxhZ3MoKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3B0cigpIGNvbnN0IHsgcmV0
dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwdHIoKSBjb25zdCB7IHJldHVybiBh
dDw1PigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBLbWFsbG9jRnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IEttYWxsb2NGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0J5
dGVzQWxsb2NGaWVsZE51bWJlciA9IDEsCisgICAga0J5dGVzUmVxRmllbGROdW1iZXIgPSAyLAor
ICAgIGtDYWxsU2l0ZUZpZWxkTnVtYmVyID0gMywKKyAgICBrR2ZwRmxhZ3NGaWVsZE51bWJlciA9
IDQsCisgICAga1B0ckZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfYnl0ZXNfYWxs
b2ModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2J5dGVzX3JlcSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY2FsbF9zaXRlKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9nZnBfZmxhZ3ModWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3B0cih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7Cisg
IH0KK307CisKK2NsYXNzIEtmcmVlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEtmcmVlRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgS2ZyZWVGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IEtmcmVlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfY2FsbF9zaXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IGNhbGxfc2l0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfcHRyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IHB0cigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KK307CisK
K2NsYXNzIEtmcmVlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEtmcmVlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtDYWxsU2l0ZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUHRy
RmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9jYWxsX3NpdGUodWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3B0cih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisK
K2NsYXNzIElvblNlY3VyZUNtYVNocmlua1Bvb2xTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJ
b25TZWN1cmVDbWFTaHJpbmtQb29sU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4
X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQor
ICBleHBsaWNpdCBJb25TZWN1cmVDbWFTaHJpbmtQb29sU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IElvblNlY3VyZUNtYVNocmlua1Bvb2xTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2RyYWluZWRfc2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkcmFpbmVkX3NpemUoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NraXBwZWRfc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBza2lwcGVkX3NpemUo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBJb25T
ZWN1cmVDbWFTaHJpbmtQb29sU3RhcnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW9uU2VjdXJlQ21hU2hyaW5r
UG9vbFN0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtE
cmFpbmVkU2l6ZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrU2tpcHBlZFNpemVGaWVsZE51bWJlciA9
IDIsCisgIH07CisgIHZvaWQgc2V0X2RyYWluZWRfc2l6ZSh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2tpcHBlZF9zaXplKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKwor
Y2xhc3MgSW9uU2VjdXJlQ21hU2hyaW5rUG9vbEVuZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJb25T
ZWN1cmVDbWFTaHJpbmtQb29sRW5kRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgSW9uU2VjdXJlQ21hU2hyaW5rUG9vbEVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSW9u
U2VjdXJlQ21hU2hyaW5rUG9vbEVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2RyYWluZWRfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBkcmFpbmVkX3NpemUoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NraXBwZWRfc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBza2lwcGVkX3NpemUoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBJb25TZWN1cmVDbWFT
aHJpbmtQb29sRW5kRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IElvblNlY3VyZUNtYVNocmlua1Bvb2xFbmRGdHJh
Y2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0RyYWluZWRTaXplRmll
bGROdW1iZXIgPSAxLAorICAgIGtTa2lwcGVkU2l6ZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAg
dm9pZCBzZXRfZHJhaW5lZF9zaXplKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9za2lwcGVkX3NpemUodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBJb25TZWN1
cmVDbWFBbGxvY2F0ZVN0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVy
bzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURf
UkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIElvblNlY3VyZUNtYUFsbG9j
YXRlU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBJb25TZWN1
cmVDbWFBbGxvY2F0ZVN0YXJ0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBJb25TZWN1cmVDbWFBbGxv
Y2F0ZVN0YXJ0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfYWxpZ24oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgYWxpZ24oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19oZWFwX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Q2hhcnMgaGVhcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19z
dHJpbmcoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQo
KTsgfQorfTsKKworY2xhc3MgSW9uU2VjdXJlQ21hQWxsb2NhdGVTdGFydEZ0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBJb25TZWN1cmVDbWFBbGxvY2F0ZVN0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtBbGlnbkZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmxhZ3NGaWVsZE51
bWJlciA9IDIsCisgICAga0hlYXBOYW1lRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51
bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2FsaWduKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaGVh
cF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9oZWFwX25hbWUoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBz
aXplKTsKKyAgfQorICB2b2lkIHNldF9sZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBJb25TZWN1cmVDbWFBbGxvY2F0ZUVu
ZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNv
ZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0q
L2ZhbHNlPiB7CisgcHVibGljOgorICBJb25TZWN1cmVDbWFBbGxvY2F0ZUVuZEZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVj
b2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IElvblNlY3VyZUNtYUFsbG9jYXRlRW5kRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBJb25TZWN1cmVDbWFBbGxvY2F0ZUVuZEZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2FsaWduKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGFsaWduKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaGVhcF9uYW1lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGhlYXBf
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNf
bGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGxlbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIElvblNl
Y3VyZUNtYUFsbG9jYXRlRW5kRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IElvblNlY3VyZUNtYUFsbG9jYXRlRW5k
RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtBbGlnbkZpZWxk
TnVtYmVyID0gMSwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDIsCisgICAga0hlYXBOYW1lRmll
bGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0
X2FsaWduKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9mbGFncyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaGVhcF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2
YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsK
KyAgfQorICB2b2lkIHNldF9oZWFwX25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUp
IHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9sZW4o
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBJb25TZWN1cmVDbWFBZGRUb1Bvb2xTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJ
b25TZWN1cmVDbWFBZGRUb1Bvb2xTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9Cisg
IGV4cGxpY2l0IElvblNlY3VyZUNtYUFkZFRvUG9vbFN0YXJ0RnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBJb25TZWN1cmVDbWFBZGRUb1Bvb2xTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2lzX3ByZWZldGNoKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGlzX3ByZWZldGNoKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19wb29sX3RvdGFsKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcG9vbF90b3RhbCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgSW9uU2VjdXJlQ21hQWRkVG9Qb29s
U3RhcnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gSW9uU2VjdXJlQ21hQWRkVG9Qb29sU3RhcnRGdHJhY2VFdmVu
dF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lzUHJlZmV0Y2hGaWVsZE51bWJl
ciA9IDEsCisgICAga0xlbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrUG9vbFRvdGFsRmllbGROdW1i
ZXIgPSAzLAorICB9OworICB2b2lkIHNldF9pc19wcmVmZXRjaCh1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9w
b29sX3RvdGFsKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9Cit9OworCitjbGFzcyBJb25TZWN1cmVDbWFBZGRUb1Bvb2xFbmRGdHJhY2VFdmVudF9EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgSW9uU2VjdXJlQ21hQWRkVG9Qb29sRW5kRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgSW9uU2VjdXJlQ21hQWRkVG9Qb29sRW5kRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBJb25TZWN1cmVDbWFBZGRUb1Bvb2xFbmRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEs
IHJhdy5zaXplKSB7fQorICBib29sIGhhc19pc19wcmVmZXRjaCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBpc19wcmVmZXRjaCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGxlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcG9vbF90b3RhbCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBvb2xfdG90YWwoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIElvblNlY3VyZUNtYUFkZFRvUG9v
bEVuZEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBJb25TZWN1cmVDbWFBZGRUb1Bvb2xFbmRGdHJhY2VFdmVudF9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lzUHJlZmV0Y2hGaWVsZE51bWJlciA9
IDEsCisgICAga0xlbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrUG9vbFRvdGFsRmllbGROdW1iZXIg
PSAzLAorICB9OworICB2b2lkIHNldF9pc19wcmVmZXRjaCh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGVuKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wb29s
X3RvdGFsKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9
Cit9OworCitjbGFzcyBJb25QcmVmZXRjaGluZ0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNf
Tk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJb25QcmVm
ZXRjaGluZ0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IElvblByZWZl
dGNoaW5nRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBJb25QcmVmZXRjaGluZ0Z0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBJb25QcmVmZXRjaGluZ0Z0cmFjZUV2
ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBJb25QcmVmZXRjaGluZ0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrTGVuRmllbGROdW1iZXIgPSAxLAorICB9OworICB2b2lkIHNldF9sZW4odWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCitj
bGFzcyBJb25DcFNlY3VyZUJ1ZmZlclN0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIElvbkNwU2Vj
dXJlQnVmZmVyU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBJ
b25DcFNlY3VyZUJ1ZmZlclN0YXJ0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBJb25DcFNlY3VyZUJ1
ZmZlclN0YXJ0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfYWxpZ24oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgYWxpZ24oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19oZWFwX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Q2hhcnMgaGVhcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19z
dHJpbmcoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQo
KTsgfQorfTsKKworY2xhc3MgSW9uQ3BTZWN1cmVCdWZmZXJTdGFydEZ0cmFjZUV2ZW50IDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJ
b25DcFNlY3VyZUJ1ZmZlclN0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMy
X3QgeworICAgIGtBbGlnbkZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9
IDIsCisgICAga0hlYXBOYW1lRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJlciA9
IDQsCisgIH07CisgIHZvaWQgc2V0X2FsaWduKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaGVhcF9uYW1l
KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIHZhbHVlLmRh
dGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9oZWFwX25hbWUoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9sZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
NCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBJb25DcFNlY3VyZUJ1ZmZlckVuZEZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBJb25DcFNlY3VyZUJ1ZmZlckVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IElvbkNwU2VjdXJlQnVmZmVyRW5kRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBJb25DcFNlY3VyZUJ1ZmZlckVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX2FsaWduKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIHVpbnQ2NF90IGFsaWduKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICB1aW50NjRfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0
KCk7IH0KKyAgYm9vbCBoYXNfaGVhcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGhlYXBfbmFtZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGxlbigpIGNvbnN0IHsgcmV0dXJuIGF0
PDQ+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIElvbkNwU2VjdXJlQnVmZmVyRW5kRnRy
YWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IElvbkNwU2VjdXJlQnVmZmVyRW5kRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtBbGlnbkZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmxhZ3NG
aWVsZE51bWJlciA9IDIsCisgICAga0hlYXBOYW1lRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5G
aWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2FsaWduKHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyh1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfaGVhcF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9oZWFwX25h
bWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBk
YXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9sZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBJb25DcEFsbG9jUmV0cnlG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgSW9uQ3BBbGxvY1JldHJ5RnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgSW9uQ3BBbGxvY1JldHJ5RnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNp
dCBJb25DcEFsbG9jUmV0cnlGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc190cmllcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICBpbnQzMl90IHRyaWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9Cit9
OworCitjbGFzcyBJb25DcEFsbG9jUmV0cnlGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW9uQ3BBbGxvY1JldHJ5
RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtUcmllc0ZpZWxk
TnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfdHJpZXMoaW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIElvbkFsbG9jQnVmZmVy
U3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgSW9uQWxsb2NCdWZmZXJTdGFydEZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVj
b2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IElvbkFsbG9jQnVmZmVyU3RhcnRGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IElvbkFsbG9jQnVmZmVyU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jbGllbnRfbmFtZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBjbGllbnRf
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNf
ZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxh
Z3MoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2hl
YXBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVy
bzo6Q29uc3RDaGFycyBoZWFwX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3N0cmlu
ZygpOyB9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX21hc2soKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgbWFzaygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KK307
CisKK2NsYXNzIElvbkFsbG9jQnVmZmVyU3RhcnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW9uQWxsb2NCdWZm
ZXJTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2xp
ZW50TmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDIsCisgICAg
a0hlYXBOYW1lRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJlciA9IDQsCisgICAg
a01hc2tGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2NsaWVudF9uYW1lKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jbGllbnRfbmFtZShjb25zdCBjaGFyKiBk
YXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9
CisgIHZvaWQgc2V0X2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9oZWFwX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X2hlYXBfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2xlbih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbWFzayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIElvbkFsbG9jQnVmZmVyRmFsbGJhY2tGdHJhY2VFdmVudF9EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgSW9uQWxsb2NCdWZmZXJGYWxsYmFja0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IElvbkFsbG9jQnVmZmVyRmFsbGJhY2tGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0
IElvbkFsbG9jQnVmZmVyRmFsbGJhY2tGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5z
aXplKSB7fQorICBib29sIGhhc19jbGllbnRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBjbGllbnRfbmFtZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfZXJyb3IoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBlcnJvcigpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19mbGFncygpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfaGVhcF9uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGhl
YXBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBo
YXNfbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGxl
bigpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbWFz
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtYXNrKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgSW9uQWxs
b2NCdWZmZXJGYWxsYmFja0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJb25BbGxvY0J1ZmZlckZhbGxiYWNrRnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDbGllbnROYW1lRmll
bGROdW1iZXIgPSAxLAorICAgIGtFcnJvckZpZWxkTnVtYmVyID0gMiwKKyAgICBrRmxhZ3NGaWVs
ZE51bWJlciA9IDMsCisgICAga0hlYXBOYW1lRmllbGROdW1iZXIgPSA0LAorICAgIGtMZW5GaWVs
ZE51bWJlciA9IDUsCisgICAga01hc2tGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0
X2NsaWVudF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jbGllbnRf
bmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEs
IGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2Vycm9yKGludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsYWdzKHVpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9o
ZWFwX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNCwg
dmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2hlYXBfbmFtZShj
b25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQsIGRhdGEs
IHNpemUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbWFzayh1aW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIElvbkFsbG9j
QnVmZmVyRmFpbEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJb25BbGxvY0J1ZmZlckZhaWxGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBJb25BbGxvY0J1ZmZlckZhaWxGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IElvbkFsbG9jQnVmZmVyRmFpbEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2NsaWVudF9uYW1lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNsaWVu
dF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhh
c19lcnJvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGVy
cm9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Zs
YWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGZsYWdz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19oZWFw
X25hbWUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Q2hhcnMgaGVhcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19zdHJpbmco
KTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19tYXNrKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IG1hc2soKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQzMigpOyB9Cit9Owor
CitjbGFzcyBJb25BbGxvY0J1ZmZlckZhaWxGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW9uQWxsb2NCdWZmZXJG
YWlsRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDbGllbnRO
YW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtFcnJvckZpZWxkTnVtYmVyID0gMiwKKyAgICBrRmxh
Z3NGaWVsZE51bWJlciA9IDMsCisgICAga0hlYXBOYW1lRmllbGROdW1iZXIgPSA0LAorICAgIGtM
ZW5GaWVsZE51bWJlciA9IDUsCisgICAga01hc2tGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZv
aWQgc2V0X2NsaWVudF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9j
bGllbnRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2Vycm9yKGludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZsYWdzKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9oZWFwX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0
ZXMoNCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2hlYXBf
bmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDQs
IGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2xlbih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbWFzayh1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIElv
bkFsbG9jQnVmZmVyRW5kRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIElvbkFsbG9jQnVmZmVyRW5kRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVk
UHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSW9uQWxsb2NCdWZmZXJFbmRG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5z
aXplKCkpIHt9CisgIGV4cGxpY2l0IElvbkFsbG9jQnVmZmVyRW5kRnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfY2xpZW50X25hbWUoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgY2xp
ZW50X25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wg
aGFzX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhh
c19oZWFwX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Q2hhcnMgaGVhcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19z
dHJpbmcoKTsgfQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19tYXNrKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9
CisgIHVpbnQzMl90IG1hc2soKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9
Cit9OworCitjbGFzcyBJb25BbGxvY0J1ZmZlckVuZEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJb25BbGxvY0J1
ZmZlckVuZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2xp
ZW50TmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmxhZ3NGaWVsZE51bWJlciA9IDIsCisgICAg
a0hlYXBOYW1lRmllbGROdW1iZXIgPSAzLAorICAgIGtMZW5GaWVsZE51bWJlciA9IDQsCisgICAg
a01hc2tGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2NsaWVudF9uYW1lKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jbGllbnRfbmFtZShjb25zdCBjaGFyKiBk
YXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9
CisgIHZvaWQgc2V0X2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9oZWFwX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X2hlYXBfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2xlbih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbWFzayh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIElvbW11U2VjUHRibE1hcFJhbmdlU3RhcnRGdHJhY2VFdmVudF9E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgSW9tbXVTZWNQdGJsTWFwUmFuZ2VTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IElvbW11U2VjUHRibE1hcFJhbmdlU3RhcnRGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRl
cnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9Cisg
IGV4cGxpY2l0IElvbW11U2VjUHRibE1hcFJhbmdlU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19sZW4oKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbGVuKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5h
c191aW50NjQoKTsgfQorICBib29sIGhhc19udW0oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCBudW0oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMy
KCk7IH0KKyAgYm9vbCBoYXNfcGEoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgdWludDMyX3QgcGEoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9Cisg
IGJvb2wgaGFzX3NlY19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBp
bnQzMl90IHNlY19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc192YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCB2YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNz
IElvbW11U2VjUHRibE1hcFJhbmdlU3RhcnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW9tbXVTZWNQdGJsTWFw
UmFuZ2VTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
TGVuRmllbGROdW1iZXIgPSAxLAorICAgIGtOdW1GaWVsZE51bWJlciA9IDIsCisgICAga1BhRmll
bGROdW1iZXIgPSAzLAorICAgIGtTZWNJZEZpZWxkTnVtYmVyID0gNCwKKyAgICBrVmFGaWVsZE51
bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X2xlbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnVtKGludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9zZWNfaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfdmEodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBJb21tdVNlY1B0YmxNYXBSYW5nZUVuZEZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBJb21tdVNlY1B0YmxNYXBSYW5nZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IElvbW11U2VjUHRibE1hcFJhbmdlRW5kRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQor
ICBleHBsaWNpdCBJb21tdVNlY1B0YmxNYXBSYW5nZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2xlbigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBsZW4oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX251bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IG51bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIo
KTsgfQorICBib29sIGhhc19wYSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQor
ICB1aW50MzJfdCBwYSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfc2VjX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGlu
dDMyX3Qgc2VjX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJv
b2wgaGFzX3ZhKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHZhKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3Mg
SW9tbXVTZWNQdGJsTWFwUmFuZ2VFbmRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSW9tbXVTZWNQdGJsTWFwUmFu
Z2VFbmRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0xlbkZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrTnVtRmllbGROdW1iZXIgPSAyLAorICAgIGtQYUZpZWxkTnVt
YmVyID0gMywKKyAgICBrU2VjSWRGaWVsZE51bWJlciA9IDQsCisgICAga1ZhRmllbGROdW1iZXIg
PSA1LAorICB9OworICB2b2lkIHNldF9sZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X251bShpbnQzMl90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYSh1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2Vj
X2lkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3ZhKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVl
KTsKKyAgfQorfTsKKworY2xhc3MgSW9tbXVNYXBSYW5nZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBJ
b21tdU1hcFJhbmdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSW9t
bXVNYXBSYW5nZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSW9tbXVNYXBSYW5nZUZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2NodW5rX3NpemUoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgY2h1bmtfc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbGVuKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGxlbigpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcGEoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcGEoKSBjb25zdCB7IHJldHVy
biBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3ZhKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHZhKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4o
KS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgSW9tbXVNYXBSYW5nZUZ0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBJb21tdU1hcFJhbmdlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qgewor
ICAgIGtDaHVua1NpemVGaWVsZE51bWJlciA9IDEsCisgICAga0xlbkZpZWxkTnVtYmVyID0gMiwK
KyAgICBrUGFGaWVsZE51bWJlciA9IDMsCisgICAga1ZhRmllbGROdW1iZXIgPSA0LAorICB9Owor
ICB2b2lkIHNldF9jaHVua19zaXplKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZW4odWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhKHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF92YSh1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KK307CisKK2Ns
YXNzIERtYUFsbG9jQ29udGlndW91c1JldHJ5RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIERtYUFsbG9j
Q29udGlndW91c1JldHJ5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
RG1hQWxsb2NDb250aWd1b3VzUmV0cnlGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IERtYUFsbG9jQ29u
dGlndW91c1JldHJ5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfdHJpZXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCB0cmllcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgRG1hQWxsb2NDb250aWd1b3VzUmV0cnlGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRG1hQWxsb2NDb250
aWd1b3VzUmV0cnlGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a1RyaWVzRmllbGROdW1iZXIgPSAxLAorICB9OworICB2b2lkIHNldF90cmllcyhpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQWxs
b2NQYWdlc1N5c1N0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEFsbG9jUGFnZXNTeXNTdGFydEZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEFsbG9jUGFnZXNTeXNTdGFy
dEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3
LnNpemUoKSkge30KKyAgZXhwbGljaXQgQWxsb2NQYWdlc1N5c1N0YXJ0RnRyYWNlRXZlbnRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZ2ZwX2ZsYWdzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGdmcF9mbGFncygpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfb3JkZXIoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgb3JkZXIoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBBbGxvY1BhZ2VzU3lz
U3RhcnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gQWxsb2NQYWdlc1N5c1N0YXJ0RnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtHZnBGbGFnc0ZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrT3JkZXJGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2dmcF9mbGFncyh1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfb3JkZXIodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOwor
ICB9Cit9OworCitjbGFzcyBBbGxvY1BhZ2VzU3lzRmFpbEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBB
bGxvY1BhZ2VzU3lzRmFpbEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IEFsbG9jUGFnZXNTeXNGYWlsRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBBbGxvY1BhZ2VzU3lzRmFp
bEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2dm
cF9mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBn
ZnBfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wg
aGFzX29yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xh
c3MgQWxsb2NQYWdlc1N5c0ZhaWxGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQWxsb2NQYWdlc1N5c0ZhaWxGdHJh
Y2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0dmcEZsYWdzRmllbGRO
dW1iZXIgPSAxLAorICAgIGtPcmRlckZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRf
Z2ZwX2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9vcmRlcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgyLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEFsbG9jUGFnZXNTeXNFbmRGdHJhY2VFdmVu
dF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgQWxsb2NQYWdlc1N5c0VuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IEFsbG9jUGFnZXNTeXNFbmRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEFsbG9j
UGFnZXNTeXNFbmRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19nZnBfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgZ2ZwX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsg
fQorICBib29sIGhhc19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQor
ICB1aW50MzJfdCBvcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0K
K307CisKK2NsYXNzIEFsbG9jUGFnZXNTeXNFbmRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQWxsb2NQYWdlc1N5
c0VuZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrR2ZwRmxh
Z3NGaWVsZE51bWJlciA9IDEsCisgICAga09yZGVyRmllbGROdW1iZXIgPSAyLAorICB9OworICB2
b2lkIHNldF9nZnBfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X29yZGVyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQWxsb2NQYWdlc0lvbW11U3Rh
cnRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQWxsb2NQYWdlc0lvbW11U3RhcnRGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29k
ZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBBbGxvY1BhZ2VzSW9tbXVTdGFydEZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
ZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkg
e30KKyAgZXhwbGljaXQgQWxsb2NQYWdlc0lvbW11U3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19nZnBfZmxhZ3MoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZ2ZwX2ZsYWdzKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19vcmRlcigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBvcmRlcigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIEFsbG9jUGFnZXNJb21tdVN0YXJ0
RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IEFsbG9jUGFnZXNJb21tdVN0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlcjsK
KyAgZW51bSA6IGludDMyX3QgeworICAgIGtHZnBGbGFnc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBr
T3JkZXJGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2dmcF9mbGFncyh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
b3JkZXIodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
Cit9OworCitjbGFzcyBBbGxvY1BhZ2VzSW9tbXVGYWlsRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEFs
bG9jUGFnZXNJb21tdUZhaWxGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBBbGxvY1BhZ2VzSW9tbXVGYWlsRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBBbGxvY1BhZ2VzSW9t
bXVGYWlsRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfZ2ZwX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IGdmcF9mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfb3JkZXIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3Qgb3JkZXIoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9Cit9Owor
CitjbGFzcyBBbGxvY1BhZ2VzSW9tbXVGYWlsRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEFsbG9jUGFnZXNJb21t
dUZhaWxGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0dmcEZs
YWdzRmllbGROdW1iZXIgPSAxLAorICAgIGtPcmRlckZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAg
dm9pZCBzZXRfZ2ZwX2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vcmRlcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEFsbG9jUGFnZXNJb21tdUVu
ZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNv
ZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0q
L2ZhbHNlPiB7CisgcHVibGljOgorICBBbGxvY1BhZ2VzSW9tbXVFbmRGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBBbGxvY1BhZ2VzSW9tbXVFbmRGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRl
cnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9Cisg
IGV4cGxpY2l0IEFsbG9jUGFnZXNJb21tdUVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2dmcF9mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBnZnBfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX29yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgQWxsb2NQYWdlc0lvbW11RW5kRnRyYWNlRXZl
bnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IEFsbG9jUGFnZXNJb21tdUVuZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrR2ZwRmxhZ3NGaWVsZE51bWJlciA9IDEsCisgICAga09yZGVyRmllbGRO
dW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9nZnBfZmxhZ3ModWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29yZGVyKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworfSAv
LyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAv
LyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3By
b3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvbG93bWVtb3J5a2lsbGVyLnBiemVyby5oCisvLyBB
dXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJ
VC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFD
RV9MT1dNRU1PUllLSUxMRVJfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfTE9XTUVNT1JZS0lMTEVSX1BST1RPX0hfCisKKyNpbmNs
dWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBw
Ynplcm8geworCisKK2NsYXNzIExvd21lbW9yeUtpbGxGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTG93
bWVtb3J5S2lsbEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IExvd21l
bW9yeUtpbGxGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEo
KSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IExvd21lbW9yeUtpbGxGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0o
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3BpZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19wYWdlY2FjaGVfc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHBhZ2VjYWNo
ZV9zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X3BhZ2VjYWNoZV9saW1pdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBp
bnQ2NF90IHBhZ2VjYWNoZV9saW1pdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50NjQo
KTsgfQorICBib29sIGhhc19mcmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9
CisgIGludDY0X3QgZnJlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50NjQoKTsgfQor
fTsKKworY2xhc3MgTG93bWVtb3J5S2lsbEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBMb3dtZW1vcnlLaWxsRnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDb21tRmllbGROdW1i
ZXIgPSAxLAorICAgIGtQaWRGaWVsZE51bWJlciA9IDIsCisgICAga1BhZ2VjYWNoZVNpemVGaWVs
ZE51bWJlciA9IDMsCisgICAga1BhZ2VjYWNoZUxpbWl0RmllbGROdW1iZXIgPSA0LAorICAgIGtG
cmVlRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF9jb21tKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6
ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXpl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGlk
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3BhZ2VjYWNoZV9zaXplKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhZ2VjYWNoZV9saW1pdChpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mcmVlKGlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCit9
IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYg
IC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4v
cHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9tZHNzLnBiemVyby5oCisvLyBBdXRvZ2VuZXJh
dGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lm
bmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9NRFNTX1BS
T1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRS
QUNFX01EU1NfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlu
dC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19k
ZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVz
cGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgUm90YXRvckJ3QW9B
c0NvbnRleHRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUm90YXRvckJ3QW9Bc0NvbnRleHRGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBSb3RhdG9yQndBb0FzQ29udGV4dEZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNp
emUoKSkge30KKyAgZXhwbGljaXQgUm90YXRvckJ3QW9Bc0NvbnRleHRGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19zdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIFJvdGF0b3JCd0FvQXNDb250ZXh0
RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IFJvdGF0b3JCd0FvQXNDb250ZXh0RnRyYWNlRXZlbnRfRGVjb2RlcjsK
KyAgZW51bSA6IGludDMyX3QgeworICAgIGtTdGF0ZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAg
dm9pZCBzZXRfc3RhdGUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFs
dWUpOworICB9Cit9OworCitjbGFzcyBNZHBQZXJmVXBkYXRlQnVzRnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIE1kcFBlcmZVcGRhdGVCdXNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBNZHBQZXJmVXBkYXRlQnVzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBQZXJmVXBkYXRl
QnVzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
Y2xpZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgY2xp
ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2Fi
X3F1b3RhKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGFi
X3F1b3RhKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19pYl9xdW90YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBpYl9xdW90YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KK307CisK
K2NsYXNzIE1kcFBlcmZVcGRhdGVCdXNGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTWRwUGVyZlVwZGF0ZUJ1c0Z0
cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ2xpZW50RmllbGRO
dW1iZXIgPSAxLAorICAgIGtBYlF1b3RhRmllbGROdW1iZXIgPSAyLAorICAgIGtJYlF1b3RhRmll
bGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9jbGllbnQoaW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWJfcXVvdGEodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2liX3F1b3RhKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVl
KTsKKyAgfQorfTsKKworY2xhc3MgTWRwUGVyZlByZWZpbGxDYWxjRnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8xMCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBNZHBQZXJmUHJlZmlsbENhbGNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBNZHBQZXJmUHJlZmlsbENhbGNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1kcFBlcmZQ
cmVmaWxsQ2FsY0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX3BudW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgcG51bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfbGF0ZW5jeV9idWYoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3QgbGF0ZW5jeV9idWYoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9
CisgIGJvb2wgaGFzX290KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IG90KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc195X2J1ZigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCB5X2J1ZigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfeV9zY2FsZXIoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgeV9zY2FsZXIoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJv
b2wgaGFzX3BwX2xpbmVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IHBwX2xpbmVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQor
ICBib29sIGhhc19wcF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQor
ICB1aW50MzJfdCBwcF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDMyKCk7
IH0KKyAgYm9vbCBoYXNfcG9zdF9zYygpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsg
fQorICB1aW50MzJfdCBwb3N0X3NjKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50MzIo
KTsgfQorICBib29sIGhhc19mYmNfYnl0ZXMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgZmJjX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19wcmVmaWxsX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTA+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBwcmVmaWxsX2J5dGVzKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTA+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIE1kcFBlcmZQcmVmaWxsQ2Fs
Y0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBNZHBQZXJmUHJlZmlsbENhbGNGdHJhY2VFdmVudF9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga1BudW1GaWVsZE51bWJlciA9IDEsCisgICAga0xhdGVu
Y3lCdWZGaWVsZE51bWJlciA9IDIsCisgICAga090RmllbGROdW1iZXIgPSAzLAorICAgIGtZQnVm
RmllbGROdW1iZXIgPSA0LAorICAgIGtZU2NhbGVyRmllbGROdW1iZXIgPSA1LAorICAgIGtQcExp
bmVzRmllbGROdW1iZXIgPSA2LAorICAgIGtQcEJ5dGVzRmllbGROdW1iZXIgPSA3LAorICAgIGtQ
b3N0U2NGaWVsZE51bWJlciA9IDgsCisgICAga0ZiY0J5dGVzRmllbGROdW1iZXIgPSA5LAorICAg
IGtQcmVmaWxsQnl0ZXNGaWVsZE51bWJlciA9IDEwLAorICB9OworICB2b2lkIHNldF9wbnVtKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9sYXRlbmN5X2J1Zih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb3QodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3lfYnVmKHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF95X3NjYWxlcih1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfcHBfbGluZXModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3BwX2J5dGVzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wb3N0X3NjKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mYmNf
Ynl0ZXModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3ByZWZpbGxfYnl0ZXModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMTAsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTWRwQ21kV2FpdFBpbmdwb25nRnRy
YWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8
LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFs
c2U+IHsKKyBwdWJsaWM6CisgIE1kcENtZFdhaXRQaW5ncG9uZ0Z0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IE1kcENtZFdhaXRQaW5ncG9uZ0Z0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgTWRwQ21kV2FpdFBpbmdwb25nRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfY3RsX251bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICB1aW50MzJfdCBjdGxfbnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19raWNrb2ZmX2NudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGtpY2tvZmZfY250KCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBNZHBDbWRXYWl0UGluZ3BvbmdGdHJhY2VF
dmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gTWRwQ21kV2FpdFBpbmdwb25nRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtDdGxOdW1GaWVsZE51bWJlciA9IDEsCisgICAga0tpY2tvZmZDbnRG
aWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2N0bF9udW0odWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2tpY2tvZmZf
Y250KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9
OworCitjbGFzcyBNZHBWaWRlb1VuZGVycnVuRG9uZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBNZHBW
aWRlb1VuZGVycnVuRG9uZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IE1kcFZpZGVvVW5kZXJydW5Eb25lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBWaWRlb1VuZGVy
cnVuRG9uZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2N0bF9udW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgY3RsX251bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9v
bCBoYXNfdW5kZXJydW5fY250KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IHVuZGVycnVuX2NudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMy
KCk7IH0KK307CisKK2NsYXNzIE1kcFZpZGVvVW5kZXJydW5Eb25lRnRyYWNlRXZlbnQgOiBwdWJs
aWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1k
cFZpZGVvVW5kZXJydW5Eb25lRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qg
eworICAgIGtDdGxOdW1GaWVsZE51bWJlciA9IDEsCisgICAga1VuZGVycnVuQ250RmllbGROdW1i
ZXIgPSAyLAorICB9OworICB2b2lkIHNldF9jdGxfbnVtKHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91bmRlcnJ1bl9jbnQodWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCitj
bGFzcyBNZHBQZXJmU2V0V21MZXZlbHNGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJv
dG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzgsIC8qSEFTX05PTlBB
Q0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTWRwUGVyZlNldFdt
TGV2ZWxzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTWRwUGVyZlNl
dFdtTGV2ZWxzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBQZXJmU2V0V21MZXZlbHNGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19wbnVtKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBudW0oKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3VzZV9zcGFjZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB1c2Vfc3BhY2UoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3ByaW9yaXR5
X2J5dGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBy
aW9yaXR5X2J5dGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBi
b29sIGhhc193bTAoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3Qgd20wKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhh
c193bTEoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgd20x
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc193bTIo
KSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgd20yKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19tYl9jbnQoKSBj
b25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbWJfY250KCkgY29u
c3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19tYl9zaXplKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1iX3NpemUoKSBj
b25zdCB7IHJldHVybiBhdDw4PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNZHBQZXJm
U2V0V21MZXZlbHNGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7Cisg
cHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTWRwUGVyZlNldFdtTGV2ZWxzRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQbnVtRmllbGROdW1iZXIgPSAxLAor
ICAgIGtVc2VTcGFjZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrUHJpb3JpdHlCeXRlc0ZpZWxkTnVt
YmVyID0gMywKKyAgICBrV20wRmllbGROdW1iZXIgPSA0LAorICAgIGtXbTFGaWVsZE51bWJlciA9
IDUsCisgICAga1dtMkZpZWxkTnVtYmVyID0gNiwKKyAgICBrTWJDbnRGaWVsZE51bWJlciA9IDcs
CisgICAga01iU2l6ZUZpZWxkTnVtYmVyID0gOCwKKyAgfTsKKyAgdm9pZCBzZXRfcG51bSh1aW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfdXNlX3NwYWNlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9wcmlvcml0eV9ieXRlcyh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfd20wKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF93bTEo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3dtMih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfbWJfY250KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9tYl9zaXplKHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTWRwTWl4ZXJV
cGRhdGVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTWRwTWl4ZXJVcGRhdGVGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBNZHBNaXhlclVwZGF0ZUZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgTWRwTWl4ZXJVcGRhdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19taXhlcl9udW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3QgbWl4ZXJfbnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191
aW50MzIoKTsgfQorfTsKKworY2xhc3MgTWRwTWl4ZXJVcGRhdGVGdHJhY2VFdmVudCA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTWRw
TWl4ZXJVcGRhdGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a01peGVyTnVtRmllbGROdW1iZXIgPSAxLAorICB9OworICB2b2lkIHNldF9taXhlcl9udW0odWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9Cit9OworCitj
bGFzcyBNZHBDbWRSZWxlYXNlQndGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTWRwQ21kUmVsZWFzZUJ3
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTWRwQ21kUmVsZWFzZUJ3
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcu
c2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBDbWRSZWxlYXNlQndGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jdGxfbnVtKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGN0bF9udW0oKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNZHBDbWRSZWxlYXNlQndGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gTWRwQ21kUmVsZWFzZUJ3RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtDdGxOdW1GaWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0
X2N0bF9udW0odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOwor
ICB9Cit9OworCitjbGFzcyBNZHBUcmFjZUNvdW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTWRw
VHJhY2VDb3VudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTWRw
VHJhY2VDb3VudGVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5k
YXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBUcmFjZUNvdW50ZXJGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19waWQoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwaWQoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfY291bnRlcl9uYW1lKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJz
IGNvdW50ZXJfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAg
Ym9vbCBoYXNfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgTWRwVHJhY2VDb3VudGVyRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1kcFRyYWNlQ291bnRlckZ0cmFj
ZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrUGlkRmllbGROdW1iZXIg
PSAxLAorICAgIGtDb3VudGVyTmFtZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrVmFsdWVGaWVsZE51
bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jb3VudGVyX25hbWUoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2NvdW50ZXJfbmFtZShjb25zdCBjaGFyKiBk
YXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9
CisgIHZvaWQgc2V0X3ZhbHVlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBNZHBQZXJmU2V0UW9zTHV0c0Z0cmFjZUV2ZW50X0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovNywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBNZHBQZXJmU2V0UW9zTHV0c0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9Cisg
IGV4cGxpY2l0IE1kcFBlcmZTZXRRb3NMdXRzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBQZXJm
U2V0UW9zTHV0c0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX3BudW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgcG51bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfZm10KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGZt
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfaW50
ZigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBpbnRmKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19yb3QoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgcm90KCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19mbCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmbCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDU+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbHV0KCkgY29uc3QgeyByZXR1cm4g
YXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGx1dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGluZWFyKCkgY29uc3QgeyByZXR1cm4gYXQ8
Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGxpbmVhcigpIGNvbnN0IHsgcmV0dXJuIGF0PDc+
KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIE1kcFBlcmZTZXRRb3NMdXRzRnRyYWNlRXZl
bnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IE1kcFBlcmZTZXRRb3NMdXRzRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtQbnVtRmllbGROdW1iZXIgPSAxLAorICAgIGtGbXRGaWVsZE51bWJlciA9
IDIsCisgICAga0ludGZGaWVsZE51bWJlciA9IDMsCisgICAga1JvdEZpZWxkTnVtYmVyID0gNCwK
KyAgICBrRmxGaWVsZE51bWJlciA9IDUsCisgICAga0x1dEZpZWxkTnVtYmVyID0gNiwKKyAgICBr
TGluZWFyRmllbGROdW1iZXIgPSA3LAorICB9OworICB2b2lkIHNldF9wbnVtKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbXQo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X2ludGYodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3JvdCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZmwodWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2x1dCh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGluZWFy
KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorfTsK
KworY2xhc3MgTWRwTWlzckNyY0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBNZHBNaXNyQ3JjRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTWRwTWlzckNyY0Z0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgTWRwTWlzckNyY0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX2Jsb2NrX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIHVpbnQzMl90IGJsb2NrX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc192c3luY19jbnQoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdnN5bmNfY250KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4o
KS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19jcmMoKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LnZhbGlkKCk7IH0KKyAgdWludDMyX3QgY3JjKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191
aW50MzIoKTsgfQorfTsKKworY2xhc3MgTWRwTWlzckNyY0Z0cmFjZUV2ZW50IDogcHVibGljIDo6
cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNZHBNaXNy
Q3JjRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtCbG9ja0lk
RmllbGROdW1iZXIgPSAxLAorICAgIGtWc3luY0NudEZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ3Jj
RmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9ibG9ja19pZCh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdnN5bmNf
Y250KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9jcmModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9Cit9OworCitjbGFzcyBNZHBDbWRSZWFkcHRyRG9uZUZ0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBNZHBDbWRSZWFkcHRyRG9uZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IE1kcENtZFJlYWRwdHJEb25lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBDbWRSZWFk
cHRyRG9uZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2N0bF9udW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgY3RsX251bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9v
bCBoYXNfa29mZl9jbnQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCBrb2ZmX2NudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorfTsK
KworY2xhc3MgTWRwQ21kUmVhZHB0ckRvbmVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTWRwQ21kUmVhZHB0ckRv
bmVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0N0bE51bUZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrS29mZkNudEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9p
ZCBzZXRfY3RsX251bSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfa29mZl9jbnQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1kcFNzcHBTZXRGdHJhY2VFdmVu
dF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzE2LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsK
KyBwdWJsaWM6CisgIE1kcFNzcHBTZXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBNZHBTc3BwU2V0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBTc3BwU2V0RnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbnVtKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG51bSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGxheV9jbnQoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcGxheV9jbnQoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX21peGVyKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1peGVyKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19zdGFnZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzdGFnZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZmxhZ3MoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJl
dHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2Zvcm1hdCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBmb3JtYXQoKSBjb25zdCB7IHJl
dHVybiBhdDw2PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2ltZ193KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGltZ193KCkgY29uc3QgeyByZXR1
cm4gYXQ8Nz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19pbWdfaCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBpbWdfaCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDg+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3JjX3goKSBjb25zdCB7IHJldHVy
biBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgc3JjX3goKSBjb25zdCB7IHJldHVybiBh
dDw5PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NyY195KCkgY29uc3QgeyByZXR1cm4g
YXQ8MTA+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzcmNfeSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDEwPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NyY193KCkgY29uc3QgeyByZXR1cm4g
YXQ8MTE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzcmNfdygpIGNvbnN0IHsgcmV0dXJuIGF0
PDExPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NyY19oKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzcmNfaCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDEyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF94KCkgY29uc3QgeyByZXR1cm4g
YXQ8MTM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3RfeCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDEzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF95KCkgY29uc3QgeyByZXR1cm4g
YXQ8MTQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3RfeSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF93KCkgY29uc3QgeyByZXR1cm4g
YXQ8MTU+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3RfdygpIGNvbnN0IHsgcmV0dXJuIGF0
PDE1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF9oKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3RfaCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE2PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNZHBTc3BwU2V0RnRyYWNlRXZlbnQg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IE1kcFNzcHBTZXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga051bUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGxheUNudEZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrTWl4ZXJGaWVsZE51bWJlciA9IDMsCisgICAga1N0YWdlRmllbGROdW1iZXIgPSA0LAorICAg
IGtGbGFnc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrRm9ybWF0RmllbGROdW1iZXIgPSA2LAorICAg
IGtJbWdXRmllbGROdW1iZXIgPSA3LAorICAgIGtJbWdIRmllbGROdW1iZXIgPSA4LAorICAgIGtT
cmNYRmllbGROdW1iZXIgPSA5LAorICAgIGtTcmNZRmllbGROdW1iZXIgPSAxMCwKKyAgICBrU3Jj
V0ZpZWxkTnVtYmVyID0gMTEsCisgICAga1NyY0hGaWVsZE51bWJlciA9IDEyLAorICAgIGtEc3RY
RmllbGROdW1iZXIgPSAxMywKKyAgICBrRHN0WUZpZWxkTnVtYmVyID0gMTQsCisgICAga0RzdFdG
aWVsZE51bWJlciA9IDE1LAorICAgIGtEc3RIRmllbGROdW1iZXIgPSAxNiwKKyAgfTsKKyAgdm9p
ZCBzZXRfbnVtKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9wbGF5X2NudCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbWl4ZXIodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YWdlKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9mbGFncyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfZm9ybWF0KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbWdfdyh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW1nX2godWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Ny
Y194KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDksIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9zcmNfeSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMCwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NyY193KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDExLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3JjX2godWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kc3Rf
eCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMywgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2RzdF95KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE0LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHN0X3codWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMTUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kc3RfaCh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxNiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBNZHBQ
ZXJmU2V0UGFuaWNMdXRzRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1kcFBlcmZTZXRQYW5pY0x1dHNG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlw
ZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBNZHBQZXJmU2V0UGFuaWNM
dXRzRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCBy
YXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBQZXJmU2V0UGFuaWNMdXRzRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcG51bSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBwbnVtKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19mbXQoKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgZm10KCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19tb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1vZGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigp
LmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3BhbmljX2x1dCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBwYW5pY19sdXQoKSBjb25zdCB7IHJldHVybiBh
dDw0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3JvYnVzdF9sdXQoKSBjb25zdCB7IHJl
dHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgcm9idXN0X2x1dCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIE1kcFBlcmZTZXRQYW5p
Y0x1dHNGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gTWRwUGVyZlNldFBhbmljTHV0c0Z0cmFjZUV2ZW50X0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrUG51bUZpZWxkTnVtYmVyID0gMSwKKyAgICBr
Rm10RmllbGROdW1iZXIgPSAyLAorICAgIGtNb2RlRmllbGROdW1iZXIgPSAzLAorICAgIGtQYW5p
Y0x1dEZpZWxkTnVtYmVyID0gNCwKKyAgICBrUm9idXN0THV0RmllbGROdW1iZXIgPSA1LAorICB9
OworICB2b2lkIHNldF9wbnVtKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbXQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21vZGUodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhbmljX2x1
dCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcm9idXN0X2x1dCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1
LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1kcENvbXBhcmVCd0Z0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovOCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBNZHBDb21wYXJlQndGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBNZHBDb21wYXJlQndGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1kcENvbXBhcmVCd0Z0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25ld19hYigpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBuZXdfYWIoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25ld19pYigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBuZXdfaWIoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25ld193YigpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBuZXdfd2IoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX29sZF9hYigpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBvbGRfYWIoKSBjb25z
dCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX29sZF9pYigpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBvbGRfaWIoKSBjb25z
dCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX29sZF93YigpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBvbGRfd2IoKSBjb25z
dCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3BhcmFtc19jaGFu
Z2VkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBhcmFt
c19jaGFuZ2VkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc191cGRhdGVfYncoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3QgdXBkYXRlX2J3KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50MzIoKTsgfQor
fTsKKworY2xhc3MgTWRwQ29tcGFyZUJ3RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86
Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1kcENvbXBhcmVCd0Z0cmFj
ZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmV3QWJGaWVsZE51bWJl
ciA9IDEsCisgICAga05ld0liRmllbGROdW1iZXIgPSAyLAorICAgIGtOZXdXYkZpZWxkTnVtYmVy
ID0gMywKKyAgICBrT2xkQWJGaWVsZE51bWJlciA9IDQsCisgICAga09sZEliRmllbGROdW1iZXIg
PSA1LAorICAgIGtPbGRXYkZpZWxkTnVtYmVyID0gNiwKKyAgICBrUGFyYW1zQ2hhbmdlZEZpZWxk
TnVtYmVyID0gNywKKyAgICBrVXBkYXRlQndGaWVsZE51bWJlciA9IDgsCisgIH07CisgIHZvaWQg
c2V0X25ld19hYih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfbmV3X2liKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uZXdfd2IodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29sZF9hYih1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfb2xkX2liKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9vbGRfd2IodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BhcmFtc19jaGFuZ2VkKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91cGRh
dGVfYncodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9
Cit9OworCitjbGFzcyBNZHBDbWRQaW5ncG9uZ0RvbmVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTWRw
Q21kUGluZ3BvbmdEb25lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
TWRwQ21kUGluZ3BvbmdEb25lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBDbWRQaW5ncG9uZ0Rv
bmVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19j
dGxfbnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGN0
bF9udW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X2ludGZfbnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGludGZfbnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19wcF9udW0oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgcHBfbnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19rb2ZmX2NudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IGtvZmZfY250KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9Cit9Owor
CitjbGFzcyBNZHBDbWRQaW5ncG9uZ0RvbmVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTWRwQ21kUGluZ3BvbmdE
b25lRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDdGxOdW1G
aWVsZE51bWJlciA9IDEsCisgICAga0ludGZOdW1GaWVsZE51bWJlciA9IDIsCisgICAga1BwTnVt
RmllbGROdW1iZXIgPSAzLAorICAgIGtLb2ZmQ250RmllbGROdW1iZXIgPSA0LAorICB9OworICB2
b2lkIHNldF9jdGxfbnVtKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9pbnRmX251bSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHBfbnVtKHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9rb2Zm
X2NudChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQor
fTsKKworY2xhc3MgVHJhY2luZ01hcmtXcml0ZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNf
Tk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBUcmFjaW5n
TWFya1dyaXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVHJhY2lu
Z01hcmtXcml0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2luZ01hcmtXcml0ZUZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3BpZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190cmFjZV9uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHRy
YWNlX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wg
aGFzX3RyYWNlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IHRyYWNlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsg
fQorfTsKKworY2xhc3MgVHJhY2luZ01hcmtXcml0ZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFjaW5nTWFy
a1dyaXRlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQaWRG
aWVsZE51bWJlciA9IDEsCisgICAga1RyYWNlTmFtZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrVHJh
Y2VCZWdpbkZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RyYWNl
X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3RyYWNlX25hbWUoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBz
aXplKTsKKyAgfQorICB2b2lkIHNldF90cmFjZV9iZWdpbih1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1kcFNzcHBDaGFuZ2VG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzE2LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
ZmFsc2U+IHsKKyBwdWJsaWM6CisgIE1kcFNzcHBDaGFuZ2VGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBNZHBTc3BwQ2hhbmdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBN
ZHBTc3BwQ2hhbmdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfbnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IG51bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfcGxheV9jbnQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMy
X3QgcGxheV9jbnQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJv
b2wgaGFzX21peGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IG1peGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29s
IGhhc19zdGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBzdGFnZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qg
ZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X2Zvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBm
b3JtYXQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X2ltZ193KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGlt
Z193KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19p
bWdfaCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBpbWdf
aCgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3Jj
X3goKSBjb25zdCB7IHJldHVybiBhdDw5PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3Qgc3JjX3go
KSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NyY195
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzcmNfeSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NyY193
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzcmNfdygp
IGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3NyY19o
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzcmNfaCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDEyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF94
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3RfeCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDEzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF95
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3RfeSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE0PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF93
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTU+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3Rfdygp
IGNvbnN0IHsgcmV0dXJuIGF0PDE1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2RzdF9o
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBkc3RfaCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNZHBT
c3BwQ2hhbmdlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1kcFNzcHBDaGFuZ2VGdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga051bUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGxh
eUNudEZpZWxkTnVtYmVyID0gMiwKKyAgICBrTWl4ZXJGaWVsZE51bWJlciA9IDMsCisgICAga1N0
YWdlRmllbGROdW1iZXIgPSA0LAorICAgIGtGbGFnc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrRm9y
bWF0RmllbGROdW1iZXIgPSA2LAorICAgIGtJbWdXRmllbGROdW1iZXIgPSA3LAorICAgIGtJbWdI
RmllbGROdW1iZXIgPSA4LAorICAgIGtTcmNYRmllbGROdW1iZXIgPSA5LAorICAgIGtTcmNZRmll
bGROdW1iZXIgPSAxMCwKKyAgICBrU3JjV0ZpZWxkTnVtYmVyID0gMTEsCisgICAga1NyY0hGaWVs
ZE51bWJlciA9IDEyLAorICAgIGtEc3RYRmllbGROdW1iZXIgPSAxMywKKyAgICBrRHN0WUZpZWxk
TnVtYmVyID0gMTQsCisgICAga0RzdFdGaWVsZE51bWJlciA9IDE1LAorICAgIGtEc3RIRmllbGRO
dW1iZXIgPSAxNiwKKyAgfTsKKyAgdm9pZCBzZXRfbnVtKHVpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wbGF5X2NudCh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
bWl4ZXIodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3N0YWdlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mbGFncyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZm9ybWF0KHVpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbWdf
dyh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfaW1nX2godWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3NyY194KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zcmNfeSh1aW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxMCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NyY193KHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDExLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfc3JjX2godWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTIsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9kc3RfeCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RzdF95KHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDE0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHN0X3codWlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTUsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9kc3RfaCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxNiwgdmFsdWUp
OworICB9Cit9OworCitjbGFzcyBNZHBQZXJmU2V0T3RGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTWRw
UGVyZlNldE90RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qg
bGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTWRwUGVy
ZlNldE90RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBQZXJmU2V0T3RGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19wbnVtKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBudW0oKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3hpbl9pZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB4aW5faWQoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3JkX2xpbSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCByZF9saW0oKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2lzX3ZiaWZfcnQoKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgaXNfdmJpZl9ydCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIE1kcFBlcmZTZXRPdEZ0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBNZHBQZXJmU2V0T3RGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga1BudW1GaWVsZE51bWJlciA9IDEsCisgICAga1hpbklkRmllbGROdW1i
ZXIgPSAyLAorICAgIGtSZExpbUZpZWxkTnVtYmVyID0gMywKKyAgICBrSXNWYmlmUnRGaWVsZE51
bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X3BudW0odWludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3hpbl9pZCh1aW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmRf
bGltKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9pc192YmlmX3J0KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDQsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgTWRwQ29tbWl0RnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIE1kcENvbW1pdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE1k
cENvbW1pdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgTWRwQ29tbWl0RnRyYWNlRXZlbnRfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbnVtKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG51bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfcGxheV9jbnQoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgcGxheV9jbnQoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2Nsa19yYXRlKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNsa19yYXRlKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19iYW5kd2lkdGgoKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYmFuZHdpZHRoKCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgTWRwQ29tbWl0RnRy
YWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IE1kcENvbW1pdEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrTnVtRmllbGROdW1iZXIgPSAxLAorICAgIGtQbGF5Q250RmllbGROdW1iZXIg
PSAyLAorICAgIGtDbGtSYXRlRmllbGROdW1iZXIgPSAzLAorICAgIGtCYW5kd2lkdGhGaWVsZE51
bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X251bSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGxheV9jbnQodWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Ns
a19yYXRlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9iYW5kd2lkdGgodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBNZHBDbWRLaWNrb2ZmRnRyYWNlRXZlbnRf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIE1kcENtZEtpY2tvZmZGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBNZHBDbWRLaWNrb2ZmRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNZHBDbWRLaWNrb2Zm
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfY3Rs
X251bSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjdGxf
bnVtKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19r
aWNrb2ZmX2NudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IGtpY2tvZmZfY250KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9Cit9Owor
CitjbGFzcyBNZHBDbWRLaWNrb2ZmRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE1kcENtZEtpY2tvZmZGdHJhY2VF
dmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0N0bE51bUZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrS2lja29mZkNudEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRf
Y3RsX251bSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfa2lja29mZl9jbnQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3Bh
Y2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9h
bWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRyYWNl
L21tX2V2ZW50LnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29t
cGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9NTV9FVkVOVF9QUk9UT19IXworI2RlZmluZSBQRVJG
RVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9NTV9FVkVOVF9QUk9UT19I
XworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdl
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90
b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7Citu
YW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBNbUV2ZW50UmVjb3JkRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIE1tRXZlbnRSZWNvcmRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBNbUV2ZW50UmVjb3JkRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBNbUV2ZW50UmVjb3JkRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfYXZnX2xh
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBhdmdfbGF0
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19jb3Vu
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBjb3VudCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbWF4X2xh
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBtYXhfbGF0
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc190eXBl
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHR5cGUoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNbUV2ZW50
UmVjb3JkRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IE1tRXZlbnRSZWNvcmRGdHJhY2VFdmVudF9EZWNvZGVyOwor
ICBlbnVtIDogaW50MzJfdCB7CisgICAga0F2Z0xhdEZpZWxkTnVtYmVyID0gMSwKKyAgICBrQ291
bnRGaWVsZE51bWJlciA9IDIsCisgICAga01heExhdEZpZWxkTnVtYmVyID0gMywKKyAgICBrVHlw
ZUZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfYXZnX2xhdCh1aW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY291bnQo
dWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X21heF9sYXQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3R5cGUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNw
YWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFj
ZS9vb20ucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxl
ciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1Nf
UEVSRkVUVE9fVFJBQ0VfRlRSQUNFX09PTV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9U
T1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9PT01fUFJPVE9fSF8KKworI2luY2x1ZGUg
PHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9y
ZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVy
byB7CisKKworY2xhc3MgTWFya1ZpY3RpbUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpw
cm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBNYXJrVmljdGlt
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTWFya1ZpY3RpbUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgTWFya1ZpY3RpbUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIo
KTsgfQorfTsKKworY2xhc3MgTWFya1ZpY3RpbUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96
ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBNYXJrVmljdGltRnRy
YWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQaWRGaWVsZE51bWJl
ciA9IDEsCisgIH07CisgIHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgT29tU2NvcmVBZGpVcGRhdGVGdHJh
Y2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxz
ZT4geworIHB1YmxpYzoKKyAgT29tU2NvcmVBZGpVcGRhdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBPb21TY29yZUFkalVwZGF0ZUZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgT29tU2NvcmVBZGpVcGRhdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvbW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX29vbV9zY29yZV9hZGooKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBvb21fc2NvcmVfYWRqKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgT29tU2NvcmVBZGpVcGRhdGVGdHJhY2VF
dmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gT29tU2NvcmVBZGpVcGRhdGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga0NvbW1GaWVsZE51bWJlciA9IDEsCisgICAga09vbVNjb3JlQWRqRmll
bGROdW1iZXIgPSAyLAorICAgIGtQaWRGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0
X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9vb21fc2NvcmVfYWRqKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2Uu
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1
YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0
by90cmFjZS9mdHJhY2UvcG93ZXIucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFBy
b3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1BPV0VSX1BST1RPX0hfCisjZGVm
aW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1BPV0VSX1BS
T1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21l
c3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9z
IHsKK25hbWVzcGFjZSBwYnplcm8geworCisKK2NsYXNzIEdwdUZyZXF1ZW5jeUZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBHcHVGcmVxdWVuY3lGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBHcHVGcmVxdWVuY3lGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEdwdUZyZXF1ZW5jeUZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2dwdV9p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBncHVfaWQo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3N0YXRl
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHN0YXRlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgR3B1RnJl
cXVlbmN5RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEdwdUZyZXF1ZW5jeUZ0cmFjZUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrR3B1SWRGaWVsZE51bWJlciA9IDEsCisgICAga1N0YXRl
RmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9ncHVfaWQodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXRlKHVp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKwor
Y2xhc3MgU3VzcGVuZFJlc3VtZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTdXNwZW5kUmVzdW1lRnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVk
UHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU3VzcGVuZFJlc3VtZUZ0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgU3VzcGVuZFJlc3VtZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2FjdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBhY3Rpb24oKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3ZhbCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHZhbCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19zdGFydCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIFN1c3BlbmRSZXN1bWVGdHJhY2VFdmVu
dCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNv
ZGVyID0gU3VzcGVuZFJlc3VtZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrQWN0aW9uRmllbGROdW1iZXIgPSAxLAorICAgIGtWYWxGaWVsZE51bWJlciA9IDIs
CisgICAga1N0YXJ0RmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9hY3Rpb24oY29u
c3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgp
LCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2FjdGlvbihjb25zdCBjaGFyKiBkYXRh
LCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9Cisg
IHZvaWQgc2V0X3ZhbChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9zdGFydCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIENsb2NrU2V0UmF0ZUZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBDbG9ja1NldFJhdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBDbG9ja1NldFJhdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENsb2NrU2V0UmF0ZUZ0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9v
bCBoYXNfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3Qgc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2NwdV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBjcHVfaWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitj
bGFzcyBDbG9ja1NldFJhdGVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2xvY2tTZXRSYXRlRnRyYWNlRXZlbnRf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAor
ICAgIGtTdGF0ZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ3B1SWRGaWVsZE51bWJlciA9IDMsCisg
IH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0
X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygx
LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9zdGF0ZSh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY3B1X2lkKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xh
c3MgQ2xvY2tEaXNhYmxlRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENsb2NrRGlzYWJsZUZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENsb2NrRGlzYWJsZUZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgQ2xvY2tEaXNhYmxlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfY3B1X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGNwdV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIENsb2NrRGlzYWJsZUZ0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBDbG9ja0Rpc2FibGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1N0YXRlRmllbGROdW1iZXIgPSAyLAorICAg
IGtDcHVJZEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qg
c2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0
X3N0YXRlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9jcHVfaWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBDbG9ja0VuYWJsZUZ0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBDbG9ja0VuYWJsZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IENsb2NrRW5hYmxlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5k
YXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBDbG9ja0VuYWJsZUZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc3Rh
dGUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc3RhdGUo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NwdV9p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjcHVfaWQo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBDbG9j
a0VuYWJsZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBDbG9ja0VuYWJsZUZ0cmFjZUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrU3RhdGVG
aWVsZE51bWJlciA9IDIsCisgICAga0NwdUlkRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lk
IHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEs
IHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0
IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6
ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RhdGUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NwdV9pZCh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIENwdUlkbGVG
dHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9m
YWxzZT4geworIHB1YmxpYzoKKyAgQ3B1SWRsZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IENwdUlkbGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENwdUlkbGVGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19zdGF0ZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBzdGF0ZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfY3B1X2lkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGNwdV9pZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIENwdUlkbGVGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gQ3B1SWRsZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrU3RhdGVGaWVsZE51bWJlciA9IDEsCisgICAga0NwdUlkRmllbGROdW1iZXIgPSAy
LAorICB9OworICB2b2lkIHNldF9zdGF0ZSh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY3B1X2lkKHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgQ3B1RnJlcXVl
bmN5TGltaXRzRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENwdUZyZXF1ZW5jeUxpbWl0c0Z0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENwdUZyZXF1ZW5jeUxpbWl0c0Z0cmFj
ZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgQ3B1RnJlcXVlbmN5TGltaXRzRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbWluX2ZyZXEoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbWluX2ZyZXEoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX21heF9mcmVxKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IG1heF9mcmVxKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19jcHVfaWQoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgY3B1X2lkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgQ3B1RnJlcXVlbmN5TGlt
aXRzRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IENwdUZyZXF1ZW5jeUxpbWl0c0Z0cmFjZUV2ZW50X0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTWluRnJlcUZpZWxkTnVtYmVyID0gMSwKKyAgICBr
TWF4RnJlcUZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ3B1SWRGaWVsZE51bWJlciA9IDMsCisgIH07
CisgIHZvaWQgc2V0X21pbl9mcmVxKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9tYXhfZnJlcSh1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY3B1X2lkKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworY2xh
c3MgQ3B1RnJlcXVlbmN5RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENwdUZyZXF1ZW5jeUZ0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENwdUZyZXF1ZW5jeUZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgQ3B1RnJlcXVlbmN5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgdWludDMyX3Qgc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQz
MigpOyB9CisgIGJvb2wgaGFzX2NwdV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBjcHVfaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQz
MigpOyB9Cit9OworCitjbGFzcyBDcHVGcmVxdWVuY3lGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ3B1RnJlcXVl
bmN5RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtTdGF0ZUZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrQ3B1SWRGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQg
c2V0X3N0YXRlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9jcHVfaWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMiwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1h
bGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9y
YXdfc3lzY2FsbHMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBj
b21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1JBV19TWVNDQUxMU19QUk9UT19IXworI2RlZmlu
ZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9SQVdfU1lTQ0FM
TFNfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVy
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBw
cm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgU3lzRXhpdEZ0cmFjZUV2ZW50
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7Cisg
cHVibGljOgorICBTeXNFeGl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgU3lzRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU3lzRXhpdEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2lkKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52
YWxpZCgpOyB9CisgIGludDY0X3QgcmV0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQ2
NCgpOyB9Cit9OworCitjbGFzcyBTeXNFeGl0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3pl
cm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFN5c0V4aXRGdHJhY2VF
dmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lkRmllbGROdW1iZXIgPSAx
LAorICAgIGtSZXRGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2lkKGludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Jl
dChpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsK
KworY2xhc3MgU3lzRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgU3lzRW50ZXJGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBTeXNFbnRlckZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJl
dF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhw
bGljaXQgU3lzRW50ZXJGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQ2
NF90IGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFz
cyBTeXNFbnRlckZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTeXNFbnRlckZ0cmFjZUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrSWRGaWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQg
c2V0X2lkKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2Uu
CisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9yZWd1bGF0b3IucGJ6ZXJvLmgK
Ky8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5P
VCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
RlRSQUNFX1JFR1VMQVRPUl9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9T
X1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9SRUdVTEFUT1JfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0
ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBl
YXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7
CisKKworY2xhc3MgUmVndWxhdG9yU2V0Vm9sdGFnZUNvbXBsZXRlRnRyYWNlRXZlbnRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIFJlZ3VsYXRvclNldFZvbHRhZ2VDb21wbGV0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IFJlZ3VsYXRvclNldFZvbHRhZ2VDb21wbGV0ZUZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgUmVndWxhdG9yU2V0Vm9sdGFnZUNvbXBsZXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc192YWwoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdmFsKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgUmVndWxhdG9yU2V0Vm9sdGFn
ZUNvbXBsZXRlRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFJlZ3VsYXRvclNldFZvbHRhZ2VDb21wbGV0ZUZ0cmFj
ZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrVmFsRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9uYW1lKGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEo
KSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEs
IHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAg
dm9pZCBzZXRfdmFsKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorfTsKKworY2xhc3MgUmVndWxhdG9yU2V0Vm9sdGFnZUZ0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBSZWd1bGF0b3JTZXRWb2x0YWdlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgUmVndWxhdG9yU2V0Vm9sdGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgUmVndWxh
dG9yU2V0Vm9sdGFnZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3Ry
aW5nKCk7IH0KKyAgYm9vbCBoYXNfbWluKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIGludDMyX3QgbWluKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9
CisgIGJvb2wgaGFzX21heCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBp
bnQzMl90IG1heCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgUmVndWxhdG9yU2V0Vm9sdGFnZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBSZWd1bGF0b3JTZXRWb2x0
YWdlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmll
bGROdW1iZXIgPSAxLAorICAgIGtNaW5GaWVsZE51bWJlciA9IDIsCisgICAga01heEZpZWxkTnVt
YmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUp
IHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0K
KyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X21pbihpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9tYXgo
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisK
K2NsYXNzIFJlZ3VsYXRvckVuYWJsZURlbGF5RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFJlZ3VsYXRv
ckVuYWJsZURlbGF5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgUmVn
dWxhdG9yRW5hYmxlRGVsYXlGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFJlZ3VsYXRvckVuYWJsZURl
bGF5RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQor
fTsKKworY2xhc3MgUmVndWxhdG9yRW5hYmxlRGVsYXlGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUmVndWxhdG9y
RW5hYmxlRGVsYXlGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a05hbWVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpz
dHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5z
aXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNp
emUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3Mg
UmVndWxhdG9yRW5hYmxlQ29tcGxldGVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJv
dG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBB
Q0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUmVndWxhdG9yRW5h
YmxlQ29tcGxldGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBSZWd1
bGF0b3JFbmFibGVDb21wbGV0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgUmVndWxhdG9yRW5hYmxl
Q29tcGxldGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygp
OyB9Cit9OworCitjbGFzcyBSZWd1bGF0b3JFbmFibGVDb21wbGV0ZUZ0cmFjZUV2ZW50IDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBS
ZWd1bGF0b3JFbmFibGVDb21wbGV0ZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfbmFtZShj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRh
LCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9Cit9
OworCitjbGFzcyBSZWd1bGF0b3JFbmFibGVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6
cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05P
TlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUmVndWxhdG9y
RW5hYmxlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgUmVndWxhdG9y
RW5hYmxlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBSZWd1bGF0b3JFbmFibGVGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBSZWd1
bGF0b3JFbmFibGVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7Cisg
cHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUmVndWxhdG9yRW5hYmxlRnRyYWNlRXZlbnRfRGVj
b2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGROdW1iZXIgPSAxLAorICB9
OworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVu
ZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9u
YW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwg
ZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIFJlZ3VsYXRvckRpc2FibGVDb21wbGV0ZUZ0
cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2Zh
bHNlPiB7CisgcHVibGljOgorICBSZWd1bGF0b3JEaXNhYmxlQ29tcGxldGVGdHJhY2VFdmVudF9E
ZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29k
ZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBSZWd1bGF0b3JEaXNhYmxlQ29tcGxldGVGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IFJlZ3VsYXRvckRpc2FibGVDb21wbGV0ZUZ0cmFjZUV2ZW50X0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIFJlZ3Vs
YXRvckRpc2FibGVDb21wbGV0ZUZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNz
YWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBSZWd1bGF0b3JEaXNhYmxlQ29tcGxl
dGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05hbWVGaWVs
ZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAg
ICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgUmVndWxhdG9y
RGlzYWJsZUZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBSZWd1bGF0b3JEaXNhYmxlRnRyYWNlRXZlbnRf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgUmVndWxhdG9yRGlzYWJsZUZ0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgUmVndWxhdG9yRGlzYWJsZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwg
cmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIFJlZ3VsYXRvckRpc2FibGVGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gUmVndWxhdG9yRGlzYWJsZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0g
OiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRf
bmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1
ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOwor
ICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3Bh
Y2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4g
aGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2Z0cmFjZS9zY2hlZC5wYnplcm8uaAor
Ly8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9U
IEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9G
VFJBQ0VfU0NIRURfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19UUkFDRV9GVFJBQ0VfU0NIRURfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgor
I2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVs
ZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBl
cmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworY2xh
c3MgU2NoZWRQcm9jZXNzV2FpdEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTY2hlZFByb2Nlc3NXYWl0
RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU2NoZWRQcm9jZXNzV2Fp
dEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3
LnNpemUoKSkge30KKyAgZXhwbGljaXQgU2NoZWRQcm9jZXNzV2FpdEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2NvbW0oKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgY29tbSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfcGlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcGlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3ByaW8oKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcmlvKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBTY2hlZFByb2Nlc3NXYWl0RnRyYWNl
RXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IFNjaGVkUHJvY2Vzc1dhaXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga0NvbW1GaWVsZE51bWJlciA9IDEsCisgICAga1BpZEZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrUHJpb0ZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfY29tbShj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBjaGFyKiBkYXRh
LCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9Cisg
IHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9wcmlvKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTY2hlZFByb2Nlc3NIYW5nRnRyYWNlRXZl
bnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhf
RklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsK
KyBwdWJsaWM6CisgIFNjaGVkUHJvY2Vzc0hhbmdGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7
fQorICBleHBsaWNpdCBTY2hlZFByb2Nlc3NIYW5nRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTY2hl
ZFByb2Nlc3NIYW5nRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RDaGFycyBjb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJp
bmcoKTsgfQorICBib29sIGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7
IH0KKyAgaW50MzJfdCBwaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0K
K307CisKK2NsYXNzIFNjaGVkUHJvY2Vzc0hhbmdGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gU2NoZWRQcm9jZXNz
SGFuZ0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29tbUZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNl
dF9jb21tKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9jb21tKGNvbnN0IGNo
YXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTY2hlZFByb2Nlc3NGcmVlRnRyYWNlRXZlbnRf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIFNjaGVkUHJvY2Vzc0ZyZWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4
X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQor
ICBleHBsaWNpdCBTY2hlZFByb2Nlc3NGcmVlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTY2hlZFBy
b2Nlc3NGcmVlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RDaGFycyBjb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmco
KTsgfQorICBib29sIGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCBwaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfcHJpbygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHByaW8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2Ns
YXNzIFNjaGVkUHJvY2Vzc0ZyZWVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gU2NoZWRQcm9jZXNzRnJlZUZ0cmFj
ZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29tbUZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAyLAorICAgIGtQcmlvRmllbGROdW1iZXIgPSAz
LAorICB9OworICB2b2lkIHNldF9jb21tKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lk
IHNldF9jb21tKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0
ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3ByaW8oaW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNz
IFNjaGVkUHJvY2Vzc0ZvcmtGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgU2NoZWRQcm9jZXNzRm9ya0Z0
cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFNjaGVkUHJvY2Vzc0ZvcmtG
dHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5z
aXplKCkpIHt9CisgIGV4cGxpY2l0IFNjaGVkUHJvY2Vzc0ZvcmtGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19wYXJlbnRfY29tbSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBwYXJl
bnRfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBo
YXNfcGFyZW50X3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHBhcmVudF9waWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfY2hpbGRfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBjaGlsZF9jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19jaGlsZF9waWQoKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBjaGlsZF9waWQoKSBjb25zdCB7IHJldHVy
biBhdDw0PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIFNjaGVkUHJvY2Vzc0ZvcmtGdHJh
Y2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gU2NoZWRQcm9jZXNzRm9ya0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0g
OiBpbnQzMl90IHsKKyAgICBrUGFyZW50Q29tbUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGFyZW50
UGlkRmllbGROdW1iZXIgPSAyLAorICAgIGtDaGlsZENvbW1GaWVsZE51bWJlciA9IDMsCisgICAg
a0NoaWxkUGlkRmllbGROdW1iZXIgPSA0LAorICB9OworICB2b2lkIHNldF9wYXJlbnRfY29tbShj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfcGFyZW50X2NvbW0oY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9wYXJlbnRfcGlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NoaWxkX2NvbW0oY29uc3Qgc3RkOjpz
dHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5z
aXplKCkpOworICB9CisgIHZvaWQgc2V0X2NoaWxkX2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF9jaGlsZF9waWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1
ZSk7CisgIH0KK307CisKK2NsYXNzIFNjaGVkUHJvY2Vzc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgU2NoZWRQcm9jZXNzRXhpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IFNjaGVkUHJvY2Vzc0V4aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFNjaGVkUHJvY2Vzc0V4
aXRGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19j
b21tKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdENoYXJzIGNvbW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9Cisg
IGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhh
c190Z2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdGdp
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19wcmlv
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcHJpbygpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgU2NoZWRQcm9j
ZXNzRXhpdEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBTY2hlZFByb2Nlc3NFeGl0RnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDb21tRmllbGROdW1iZXIgPSAxLAorICAgIGtQ
aWRGaWVsZE51bWJlciA9IDIsCisgICAga1RnaWRGaWVsZE51bWJlciA9IDMsCisgICAga1ByaW9G
aWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsK
KyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9waWQoaW50
MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfdGdpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9wcmlvKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwg
dmFsdWUpOworICB9Cit9OworCitjbGFzcyBTY2hlZFByb2Nlc3NFeGVjRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIFNjaGVkUHJvY2Vzc0V4ZWNGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3Qq
IGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBl
eHBsaWNpdCBTY2hlZFByb2Nlc3NFeGVjRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTY2hlZFByb2Nl
c3NFeGVjRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfZmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Q2hhcnMgZmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0
cmluZygpOyB9CisgIGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICBpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19vbGRfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIGludDMyX3Qgb2xkX3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsg
fQorfTsKKworY2xhc3MgU2NoZWRQcm9jZXNzRXhlY0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTY2hlZFByb2Nl
c3NFeGVjRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtGaWxl
bmFtZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAyLAorICAgIGtPbGRQ
aWRGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X2ZpbGVuYW1lKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUu
c2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9maWxlbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQg
c2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9vbGRfcGlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTY2hlZFdha2V1cE5ld0Z0cmFjZUV2ZW50X0Rl
Y29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxE
X0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVi
bGljOgorICBTY2hlZFdha2V1cE5ld0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IFNjaGVkV2FrZXVwTmV3RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTY2hlZFdha2V1cE5l
d0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2Nv
bW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Q2hhcnMgY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAg
Ym9vbCBoYXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMy
X3QgcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X3ByaW8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcmlv
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3N1Y2Nl
c3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBzdWNjZXNz
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3Rhcmdl
dF9jcHUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCB0YXJn
ZXRfY3B1KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFz
cyBTY2hlZFdha2V1cE5ld0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTY2hlZFdha2V1cE5ld0Z0cmFjZUV2ZW50
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29tbUZpZWxkTnVtYmVyID0gMSwK
KyAgICBrUGlkRmllbGROdW1iZXIgPSAyLAorICAgIGtQcmlvRmllbGROdW1iZXIgPSAzLAorICAg
IGtTdWNjZXNzRmllbGROdW1iZXIgPSA0LAorICAgIGtUYXJnZXRDcHVGaWVsZE51bWJlciA9IDUs
CisgIH07CisgIHZvaWQgc2V0X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAg
QXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQg
c2V0X2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRl
cygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9waWQoaW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJpbyhpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9z
dWNjZXNzKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3RhcmdldF9jcHUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFNjaGVkV2FraW5nRnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIFNjaGVkV2FraW5nRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgU2NoZWRXYWtpbmdGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFNjaGVkV2FraW5nRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfY29tbSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBj
b21tKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19w
aWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwaWQoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcHJpbygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHByaW8oKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3VjY2VzcygpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHN1Y2Nlc3MoKSBjb25zdCB7
IHJldHVybiBhdDw0PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGFyZ2V0X2NwdSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHRhcmdldF9jcHUoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIFNjaGVkV2Fr
aW5nRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IFNjaGVkV2FraW5nRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtDb21tRmllbGROdW1iZXIgPSAxLAorICAgIGtQaWRGaWVsZE51
bWJlciA9IDIsCisgICAga1ByaW9GaWVsZE51bWJlciA9IDMsCisgICAga1N1Y2Nlc3NGaWVsZE51
bWJlciA9IDQsCisgICAga1RhcmdldENwdUZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBz
ZXRfY29tbShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2
YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbShjb25zdCBj
aGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUp
OworICB9CisgIHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wcmlvKGludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N1Y2Nlc3MoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGFy
Z2V0X2NwdShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAg
fQorfTsKKworY2xhc3MgU2NoZWRDcHVIb3RwbHVnRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhB
U19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFNjaGVk
Q3B1SG90cGx1Z0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFNjaGVk
Q3B1SG90cGx1Z0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU2NoZWRDcHVIb3RwbHVnRnRyYWNlRXZl
bnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfYWZmZWN0ZWRfY3B1
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgYWZmZWN0ZWRf
Y3B1KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2Vy
cm9yKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZXJyb3Io
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfc3RhdHVz
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qgc3RhdHVzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBTY2hlZENw
dUhvdHBsdWdGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gU2NoZWRDcHVIb3RwbHVnRnRyYWNlRXZlbnRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtBZmZlY3RlZENwdUZpZWxkTnVtYmVyID0gMSwK
KyAgICBrRXJyb3JGaWVsZE51bWJlciA9IDIsCisgICAga1N0YXR1c0ZpZWxkTnVtYmVyID0gMywK
KyAgfTsKKyAgdm9pZCBzZXRfYWZmZWN0ZWRfY3B1KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Vycm9yKGludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXR1cyhp
bnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKwor
Y2xhc3MgU2NoZWRCbG9ja2VkUmVhc29uRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFNjaGVkQmxvY2tl
ZFJlYXNvbkZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFNjaGVkQmxv
Y2tlZFJlYXNvbkZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU2NoZWRCbG9ja2VkUmVhc29uRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcGlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2NhbGxlcigpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjYWxsZXIoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lvX3dhaXQoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgaW9fd2FpdCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIFNjaGVkQmxvY2tlZFJl
YXNvbkZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBTY2hlZEJsb2NrZWRSZWFzb25GdHJhY2VFdmVudF9EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga1BpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrQ2Fs
bGVyRmllbGROdW1iZXIgPSAyLAorICAgIGtJb1dhaXRGaWVsZE51bWJlciA9IDMsCisgIH07Cisg
IHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9jYWxsZXIodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2lvX3dhaXQodWludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTY2hlZFdh
a2V1cEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9E
ZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxE
Uz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTY2hlZFdha2V1cEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IFNjaGVkV2FrZXVwRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBT
Y2hlZFdha2V1cEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX2NvbW0oKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Q2hhcnMgY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5n
KCk7IH0KKyAgYm9vbCBoYXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9
CisgIGludDMyX3QgcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX3ByaW8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCBwcmlvKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX3N1Y2Nlc3MoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBzdWNjZXNzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX3RhcmdldF9jcHUoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCB0YXJnZXRfY3B1KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9Cit9
OworCitjbGFzcyBTY2hlZFdha2V1cEZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTY2hlZFdha2V1cEZ0cmFjZUV2
ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29tbUZpZWxkTnVtYmVyID0g
MSwKKyAgICBrUGlkRmllbGROdW1iZXIgPSAyLAorICAgIGtQcmlvRmllbGROdW1iZXIgPSAzLAor
ICAgIGtTdWNjZXNzRmllbGROdW1iZXIgPSA0LAorICAgIGtUYXJnZXRDcHVGaWVsZE51bWJlciA9
IDUsCisgIH07CisgIHZvaWQgc2V0X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Cisg
ICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZv
aWQgc2V0X2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRC
eXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9waWQoaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJpbyhpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9zdWNjZXNzKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3RhcmdldF9jcHUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFNjaGVkU3dpdGNoRnRyYWNlRXZlbnRf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki83LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBw
dWJsaWM6CisgIFNjaGVkU3dpdGNoRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgU2NoZWRTd2l0Y2hGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFNjaGVkU3dpdGNoRnRyYWNl
RXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcHJldl9jb21t
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25z
dENoYXJzIHByZXZfY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0K
KyAgYm9vbCBoYXNfcHJldl9waWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCBwcmV2X3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19wcmV2X3ByaW8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7
IH0KKyAgaW50MzJfdCBwcmV2X3ByaW8oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMy
KCk7IH0KKyAgYm9vbCBoYXNfcHJldl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFs
aWQoKTsgfQorICBpbnQ2NF90IHByZXZfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFz
X2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmV4dF9jb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5leHRfY29tbSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfbmV4dF9waWQoKSBj
b25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBuZXh0X3BpZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19uZXh0X3ByaW8o
KSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBuZXh0X3ByaW8o
KSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIFNjaGVk
U3dpdGNoRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IFNjaGVkU3dpdGNoRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtQcmV2Q29tbUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUHJl
dlBpZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrUHJldlByaW9GaWVsZE51bWJlciA9IDMsCisgICAg
a1ByZXZTdGF0ZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrTmV4dENvbW1GaWVsZE51bWJlciA9IDUs
CisgICAga05leHRQaWRGaWVsZE51bWJlciA9IDYsCisgICAga05leHRQcmlvRmllbGROdW1iZXIg
PSA3LAorICB9OworICB2b2lkIHNldF9wcmV2X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9
CisgIHZvaWQgc2V0X3ByZXZfY29tbShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3ByZXZfcGlk
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3ByZXZfcHJpbyhpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9wcmV2X3N0YXRlKGludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25leHRfY29tbShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg1LCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmV4dF9jb21tKGNvbnN0IGNoYXIqIGRhdGEs
IHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAg
dm9pZCBzZXRfbmV4dF9waWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmV4dF9wcmlvKGludDMyX3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNywgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8g
TmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisv
LyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNl
L2Z0cmFjZS9zY20ucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBj
b21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1NDTV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0ZUUkFDRV9TQ01fUFJPVE9fSF8KKworI2lu
Y2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Bh
Y2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNl
IHBiemVybyB7CisKKworY2xhc3MgU2NtQ2FsbEVuZEZ0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMCwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTY21D
YWxsRW5kRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVu
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU2NtQ2FsbEVu
ZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3
LnNpemUoKSkge30KKyAgZXhwbGljaXQgU2NtQ2FsbEVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9Cit9OworCitjbGFzcyBTY21DYWxsRW5kRnRyYWNlRXZlbnQgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IFNjbUNhbGxFbmRGdHJhY2VFdmVudF9EZWNvZGVyOworfTsKKworY2xhc3MgU2NtQ2FsbFN0YXJ0
RnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29k
ZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
ZmFsc2U+IHsKKyBwdWJsaWM6CisgIFNjbUNhbGxTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IFNjbUNhbGxTdGFydEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU2Nt
Q2FsbFN0YXJ0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfYXJnaW5mbygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
MzJfdCBhcmdpbmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBi
b29sIGhhc194MCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCB4MCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
eDUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgeDUoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBTY21DYWxs
U3RhcnRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGlj
OgorICB1c2luZyBEZWNvZGVyID0gU2NtQ2FsbFN0YXJ0RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtBcmdpbmZvRmllbGROdW1iZXIgPSAxLAorICAgIGtYMEZp
ZWxkTnVtYmVyID0gMiwKKyAgICBrWDVGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0
X2FyZ2luZm8odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3gwKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF94NSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1l
c3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdl
bl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvZnRy
YWNlL3NkZS5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBp
bGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfU0RFX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BS
T1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1NERV9QUk9UT19IXworCisjaW5jbHVk
ZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2Vk
X3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6
ZXJvIHsKKworCitjbGFzcyBTZGVUcmFjaW5nTWFya1dyaXRlRnRyYWNlRXZlbnRfRGVjb2RlciA6
IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81
LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6Cisg
IFNkZVRyYWNpbmdNYXJrV3JpdGVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBTZGVUcmFjaW5nTWFya1dyaXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTZGVUcmFjaW5n
TWFya1dyaXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
cGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3Ry
YWNlX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Q2hhcnMgdHJhY2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3Ry
aW5nKCk7IH0KKyAgYm9vbCBoYXNfdHJhY2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
dmFsaWQoKTsgfQorICB1aW50MzJfdCB0cmFjZV90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc191aW50MzIoKTsgfQorICBib29sIGhhc192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5h
c19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RyYWNlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gYXQ8
NT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHRyYWNlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4g
YXQ8NT4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgU2RlVHJhY2luZ01hcmtXcml0ZUZ0
cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBTZGVUcmFjaW5nTWFya1dyaXRlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtQaWRGaWVsZE51bWJlciA9IDEsCisgICAga1RyYWNlTmFt
ZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrVHJhY2VUeXBlRmllbGROdW1iZXIgPSAzLAorICAgIGtW
YWx1ZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrVHJhY2VCZWdpbkZpZWxkTnVtYmVyID0gNSwKKyAg
fTsKKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RyYWNlX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X3RyYWNlX25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUp
IHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF90cmFj
ZV90eXBlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF92YWx1ZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90cmFjZV9iZWdpbih1aW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgor
fSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFy
ZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8v
dHJhY2UvZnRyYWNlL3NpZ25hbC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJv
dG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9f
UFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfU0lHTkFMX1BST1RPX0hfCisjZGVm
aW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1NJR05BTF9Q
Uk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9t
ZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3Rv
cyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBTaWduYWxHZW5lcmF0ZUZ0cmFjZUV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBTaWduYWxHZW5lcmF0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWlu
dDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9
CisgIGV4cGxpY2l0IFNpZ25hbEdlbmVyYXRlRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTaWduYWxH
ZW5lcmF0ZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2NvZGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBj
b2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2Nv
bW0oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Q2hhcnMgY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAg
Ym9vbCBoYXNfZ3JvdXAoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCBncm91cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29s
IGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBw
aWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcmVz
dWx0KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcmVzdWx0
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3NpZygp
IGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHNpZygpIGNvbnN0
IHsgcmV0dXJuIGF0PDY+KCkuYXNfaW50MzIoKTsgfQorfTsKKworY2xhc3MgU2lnbmFsR2VuZXJh
dGVGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgor
ICB1c2luZyBEZWNvZGVyID0gU2lnbmFsR2VuZXJhdGVGdHJhY2VFdmVudF9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0NvZGVGaWVsZE51bWJlciA9IDEsCisgICAga0NvbW1GaWVs
ZE51bWJlciA9IDIsCisgICAga0dyb3VwRmllbGROdW1iZXIgPSAzLAorICAgIGtQaWRGaWVsZE51
bWJlciA9IDQsCisgICAga1Jlc3VsdEZpZWxkTnVtYmVyID0gNSwKKyAgICBrU2lnRmllbGROdW1i
ZXIgPSA2LAorICB9OworICB2b2lkIHNldF9jb2RlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXpl
KCkpOworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUp
IHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9ncm91
cChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9waWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfcmVzdWx0KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NpZyhpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDYsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgU2lnbmFsRGVsaXZlckZ0
cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2Zh
bHNlPiB7CisgcHVibGljOgorICBTaWduYWxEZWxpdmVyRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgU2lnbmFsRGVsaXZlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU2ln
bmFsRGVsaXZlckZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX2NvZGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBjb2RlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X3NhX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHNhX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19zaWcoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBz
aWcoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIFNp
Z25hbERlbGl2ZXJGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7Cisg
cHVibGljOgorICB1c2luZyBEZWNvZGVyID0gU2lnbmFsRGVsaXZlckZ0cmFjZUV2ZW50X0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29kZUZpZWxkTnVtYmVyID0gMSwKKyAgICBr
U2FGbGFnc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2lnRmllbGROdW1iZXIgPSAzLAorICB9Owor
ICB2b2lkIHNldF9jb2RlKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3NhX2ZsYWdzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zaWcoaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBn
dWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vdHJhY2UvZnRyYWNlL3N5bmMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFBy
b3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1NZTkNfUFJPVE9fSF8KKyNkZWZp
bmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfU1lOQ19QUk9U
T19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNz
YWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7
CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBTeW5jV2FpdEZ0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBTeW5jV2FpdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFN5
bmNXYWl0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTeW5jV2FpdEZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc3RhdHVzKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qgc3RhdHVzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2JlZ2luKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGJlZ2luKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xhc3MgU3luY1dhaXRGdHJhY2VF
dmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gU3luY1dhaXRGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga05hbWVGaWVsZE51bWJlciA9IDEsCisgICAga1N0YXR1c0ZpZWxkTnVtYmVyID0gMiwK
KyAgICBrQmVnaW5GaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qg
c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2
YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF9zdGF0dXMoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfYmVnaW4odWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTeW5jVGltZWxpbmVGdHJhY2VFdmVudF9E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgU3luY1RpbWVsaW5lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgU3luY1RpbWVsaW5lRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTeW5jVGltZWxpbmVGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENo
YXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wg
aGFzX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpDb25zdENoYXJzIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmco
KTsgfQorfTsKKworY2xhc3MgU3luY1RpbWVsaW5lRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90
b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFN5bmNUaW1lbGlu
ZUZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUZpZWxk
TnVtYmVyID0gMSwKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0
X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBB
cHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBz
ZXRfdmFsdWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRl
cygyLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworY2xhc3MgU3luY1B0RnRyYWNlRXZlbnRfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIFN5bmNQdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFN5
bmNQdEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU3luY1B0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdGltZWxpbmUoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgdGltZWxpbmUoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3ZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENo
YXJzIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorfTsKKwor
Y2xhc3MgU3luY1B0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFN5bmNQdEZ0cmFjZUV2ZW50X0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrVGltZWxpbmVGaWVsZE51bWJlciA9IDEsCisgICAga1Zh
bHVlRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF90aW1lbGluZShjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfdGltZWxpbmUoY29uc3QgY2hhciogZGF0YSwgc2l6
ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygy
LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfdmFsdWUoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBz
aXplKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8g
TmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2Uvc3lzdHJhY2Uu
cGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVn
aW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfRlRSQUNFX1NZU1RSQUNFX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfRlRSQUNFX1NZU1RSQUNFX1BST1RPX0hfCisKKyNpbmNs
dWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBw
Ynplcm8geworCisKK2NsYXNzIFplcm9GdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJv
dG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBB
Q0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgWmVyb0Z0cmFjZUV2
ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFplcm9GdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IFplcm9GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19mbGFnKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
ZmxhZygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19u
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9Cisg
IGJvb2wgaGFzX3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQz
Ml90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhh
c192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHZh
bHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBa
ZXJvRnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IFplcm9GdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga0ZsYWdGaWVsZE51bWJlciA9IDEsCisgICAga05hbWVGaWVsZE51bWJlciA9
IDIsCisgICAga1BpZEZpZWxkTnVtYmVyID0gMywKKyAgICBrVmFsdWVGaWVsZE51bWJlciA9IDQs
CisgIH07CisgIHZvaWQgc2V0X2ZsYWcoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFs
dWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cisg
IH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3BpZChpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF92
YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQor
fTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgor
I2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRl
cjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2UvdGFzay5wYnplcm8uaAorLy8gQXV0
b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQu
CisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0Vf
VEFTS19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RS
QUNFX0ZUUkFDRV9UQVNLX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRl
IDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
cHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCisKK2NsYXNzIFRhc2tS
ZW5hbWVGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVGFza1JlbmFtZUZ0cmFjZUV2ZW50X0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IFRhc2tSZW5hbWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRh
c2tSZW5hbWVGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBw
aWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfb2xk
Y29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBvbGRjb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsg
fQorICBib29sIGhhc19uZXdjb21tKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5ld2NvbW0oKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX29vbV9zY29yZV9hZGooKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBvb21fc2NvcmVfYWRqKCkgY29uc3Qg
eyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBUYXNrUmVuYW1lRnRy
YWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IFRhc2tSZW5hbWVGdHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga1BpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrT2xkY29tbUZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrTmV3Y29tbUZpZWxkTnVtYmVyID0gMywKKyAgICBrT29tU2NvcmVBZGpGaWVs
ZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vbGRjb21tKGNvbnN0IHN0
ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFs
dWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9vbGRjb21tKGNvbnN0IGNoYXIqIGRhdGEsIHNp
emVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbmV3Y29tbShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRl
cygzLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmV3Y29t
bShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIGRh
dGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X29vbV9zY29yZV9hZGooaW50MzJfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFRhc2tOZXd0
YXNrRnRyYWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0Rl
Y29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERT
PSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRhc2tOZXd0YXNrRnRyYWNlRXZlbnRfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgVGFza05ld3Rhc2tGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0
IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxj
b25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFRh
c2tOZXd0YXNrRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qg
cGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2Nv
bW0oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNv
bnN0Q2hhcnMgY29tbSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAg
Ym9vbCBoYXNfY2xvbmVfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgY2xvbmVfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX29vbV9zY29yZV9hZGooKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LnZhbGlkKCk7IH0KKyAgaW50MzJfdCBvb21fc2NvcmVfYWRqKCkgY29uc3QgeyByZXR1cm4gYXQ8
ND4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBUYXNrTmV3dGFza0Z0cmFjZUV2ZW50IDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBUYXNrTmV3dGFza0Z0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrUGlkRmllbGROdW1iZXIgPSAxLAorICAgIGtDb21tRmllbGROdW1iZXIgPSAyLAorICAgIGtD
bG9uZUZsYWdzRmllbGROdW1iZXIgPSAzLAorICAgIGtPb21TY29yZUFkakZpZWxkTnVtYmVyID0g
NCwKKyAgfTsKKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZh
bHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwor
ICB9CisgIHZvaWQgc2V0X2NvbW0oY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAg
ICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9jbG9uZV9mbGFn
cyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfb29tX3Njb3JlX2FkaihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDQsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4K
K30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2Uvdm1z
Y2FuLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIg
cGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BF
UkZFVFRPX1RSQUNFX0ZUUkFDRV9WTVNDQU5fUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfVk1TQ0FOX1BST1RPX0hfCisKKyNpbmNs
dWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBw
Ynplcm8geworCisKK2NsYXNzIE1tVm1zY2FuS3N3YXBkU2xlZXBGdHJhY2VFdmVudF9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoK
KyAgTW1WbXNjYW5Lc3dhcGRTbGVlcEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IE1tVm1zY2FuS3N3YXBkU2xlZXBGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1tVm1zY2Fu
S3N3YXBkU2xlZXBGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBi
b29sIGhhc19uaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBuaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNz
IE1tVm1zY2FuS3N3YXBkU2xlZXBGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTW1WbXNjYW5Lc3dhcGRTbGVlcEZ0
cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmlkRmllbGROdW1i
ZXIgPSAxLAorICB9OworICB2b2lkIHNldF9uaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgxLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1tVm1zY2FuS3N3YXBkV2FrZUZ0
cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2Zh
bHNlPiB7CisgcHVibGljOgorICBNbVZtc2Nhbktzd2FwZFdha2VGdHJhY2VFdmVudF9EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBNbVZtc2Nhbktzd2FwZFdha2VGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4
cGxpY2l0IE1tVm1zY2FuS3N3YXBkV2FrZUZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90
b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3
LnNpemUpIHt9CisgIGJvb2wgaGFzX25pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICBpbnQzMl90IG5pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQor
ICBpbnQzMl90IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9Cit9
OworCitjbGFzcyBNbVZtc2Nhbktzd2FwZFdha2VGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTW1WbXNjYW5Lc3dh
cGRXYWtlRnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOaWRG
aWVsZE51bWJlciA9IDEsCisgICAga09yZGVyRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lk
IHNldF9uaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfb3JkZXIoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIE1tVm1zY2FuRGlyZWN0UmVjbGFpbUVuZEZ0cmFj
ZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBNbVZtc2NhbkRpcmVjdFJlY2xhaW1FbmRGdHJhY2VFdmVudF9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBNbVZtc2NhbkRpcmVjdFJlY2xhaW1FbmRGdHJhY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IE1tVm1zY2FuRGlyZWN0UmVjbGFpbUVuZEZ0cmFjZUV2ZW50X0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25yX3JlY2xhaW1lZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBucl9yZWNsYWltZWQoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBNbVZtc2Nh
bkRpcmVjdFJlY2xhaW1FbmRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTW1WbXNjYW5EaXJlY3RSZWNsYWltRW5k
RnRyYWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOclJlY2xhaW1l
ZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfbnJfcmVjbGFpbWVkKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3Mg
TW1WbXNjYW5EaXJlY3RSZWNsYWltQmVnaW5GdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6
cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05P
TlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTW1WbXNjYW5E
aXJlY3RSZWNsYWltQmVnaW5GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBNbVZtc2NhbkRpcmVjdFJlY2xhaW1CZWdpbkZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgTW1WbXNj
YW5EaXJlY3RSZWNsYWltQmVnaW5GdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19vcmRlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICBpbnQzMl90IG9yZGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9
CisgIGJvb2wgaGFzX21heV93cml0ZXBhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBtYXlfd3JpdGVwYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2dmcF9mbGFncygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBnZnBfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBNbVZtc2NhbkRpcmVjdFJlY2xhaW1CZWdp
bkZ0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6Cisg
IHVzaW5nIERlY29kZXIgPSBNbVZtc2NhbkRpcmVjdFJlY2xhaW1CZWdpbkZ0cmFjZUV2ZW50X0Rl
Y29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrT3JkZXJGaWVsZE51bWJlciA9IDEsCisg
ICAga01heVdyaXRlcGFnZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrR2ZwRmxhZ3NGaWVsZE51bWJl
ciA9IDMsCisgIH07CisgIHZvaWQgc2V0X29yZGVyKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21heV93cml0ZXBhZ2UoaW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
Z2ZwX2ZsYWdzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsK
KyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNw
YWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9mdHJhY2Uvd29ya3F1ZXVlLnBiemVy
by5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBE
TyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RS
QUNFX0ZUUkFDRV9XT1JLUVVFVUVfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BS
T1RPU19QRVJGRVRUT19UUkFDRV9GVFJBQ0VfV09SS1FVRVVFX1BST1RPX0hfCisKKyNpbmNsdWRl
IDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRf
cmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnpl
cm8geworCisKK2NsYXNzIFdvcmtxdWV1ZVF1ZXVlV29ya0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNSwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBX
b3JrcXVldWVRdWV1ZVdvcmtGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBXb3JrcXVldWVRdWV1ZVdvcmtGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90
Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFdvcmtxdWV1ZVF1ZXVl
V29ya0Z0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X3dvcmsoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgd29y
aygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZnVu
Y3Rpb24oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZnVu
Y3Rpb24oKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X3dvcmtxdWV1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCB3b3JrcXVldWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX3JlcV9jcHUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWlu
dDMyX3QgcmVxX2NwdSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAg
Ym9vbCBoYXNfY3B1KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQz
Ml90IGNwdSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2Ns
YXNzIFdvcmtxdWV1ZVF1ZXVlV29ya0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBXb3JrcXVldWVRdWV1ZVdvcmtG
dHJhY2VFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1dvcmtGaWVsZE51
bWJlciA9IDEsCisgICAga0Z1bmN0aW9uRmllbGROdW1iZXIgPSAyLAorICAgIGtXb3JrcXVldWVG
aWVsZE51bWJlciA9IDMsCisgICAga1JlcUNwdUZpZWxkTnVtYmVyID0gNCwKKyAgICBrQ3B1Rmll
bGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNldF93b3JrKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mdW5jdGlvbih1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfd29ya3F1ZXVlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9yZXFfY3B1KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jcHUodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBXb3JrcXVldWVF
eGVjdXRlU3RhcnRGdHJhY2VFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgV29ya3F1ZXVlRXhlY3V0ZVN0YXJ0RnRy
YWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVk
UHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgV29ya3F1ZXVlRXhlY3V0ZVN0
YXJ0RnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCBy
YXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBXb3JrcXVldWVFeGVjdXRlU3RhcnRGdHJhY2VFdmVu
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc193b3JrKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHdvcmsoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Z1bmN0aW9uKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGZ1bmN0aW9uKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgV29ya3F1ZXVlRXhl
Y3V0ZVN0YXJ0RnRyYWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFdvcmtxdWV1ZUV4ZWN1dGVTdGFydEZ0cmFjZUV2ZW50
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrV29ya0ZpZWxkTnVtYmVyID0gMSwK
KyAgICBrRnVuY3Rpb25GaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X3dvcmsodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2Z1bmN0aW9uKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorfTsKKworY2xhc3MgV29ya3F1ZXVlRXhlY3V0ZUVuZEZ0cmFjZUV2ZW50X0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBXb3JrcXVldWVFeGVjdXRlRW5kRnRyYWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgV29ya3F1ZXVlRXhlY3V0ZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgV29ya3F1
ZXVlRXhlY3V0ZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9Cisg
IGJvb2wgaGFzX3dvcmsoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3Qgd29yaygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KK307CisK
K2NsYXNzIFdvcmtxdWV1ZUV4ZWN1dGVFbmRGdHJhY2VFdmVudCA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gV29ya3F1ZXVlRXhlY3V0
ZUVuZEZ0cmFjZUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrV29ya0Zp
ZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfd29yayh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFdvcmtxdWV1ZUFj
dGl2YXRlV29ya0Z0cmFjZUV2ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBXb3JrcXVldWVBY3RpdmF0ZVdvcmtGdHJh
Y2VFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQ
cm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBXb3JrcXVldWVBY3RpdmF0ZVdv
cmtGdHJhY2VFdmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFdvcmtxdWV1ZUFjdGl2YXRlV29ya0Z0cmFjZUV2ZW50
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3dvcmsoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgd29yaygpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIFdvcmtxdWV1ZUFjdGl2YXRl
V29ya0Z0cmFjZUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBXb3JrcXVldWVBY3RpdmF0ZVdvcmtGdHJhY2VFdmVudF9EZWNv
ZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1dvcmtGaWVsZE51bWJlciA9IDEsCisgIH07
CisgIHZvaWQgc2V0X3dvcmsodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwg
dmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2dwdS9ncHVfY291bnRl
cl9ldmVudC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBp
bGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9HUFVfR1BVX0NPVU5URVJfRVZFTlRfUFJPVE9fSF8KKyNkZWZpbmUg
UEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9HUFVfR1BVX0NPVU5URVJfRVZF
TlRfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgor
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVy
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBw
cm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIEdwdUNvdW50ZXJEZXNjcmlwdG9y
OworY2xhc3MgR3B1Q291bnRlckV2ZW50X0dwdUNvdW50ZXI7CisKK2NsYXNzIEdwdUNvdW50ZXJF
dmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7
CisgcHVibGljOgorICBHcHVDb3VudGVyRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgR3B1Q291bnRlckV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgR3B1Q291bnRlckV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2NvdW50ZXJfZGVzY3JpcHRvcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBj
b3VudGVyX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfY291bnRlcnMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RC
eXRlcz4gY291bnRlcnMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6
Q29uc3RCeXRlcz4oMik7IH0KKyAgYm9vbCBoYXNfZ3B1X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZ3B1X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBHcHVDb3VudGVyRXZlbnQgOiBwdWJsaWMgOjpw
cm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEdwdUNvdW50
ZXJFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0NvdW50ZXJEZXNjcmlw
dG9yRmllbGROdW1iZXIgPSAxLAorICAgIGtDb3VudGVyc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBr
R3B1SWRGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHVzaW5nIEdwdUNvdW50ZXIgPSA6OnBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6R3B1Q291bnRlckV2ZW50X0dwdUNvdW50ZXI7CisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gR3B1Q291bnRlckRlc2NyaXB0b3I+IFQqIHNldF9jb3VudGVyX2Rl
c2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3B1Q291bnRlckV2ZW50X0dwdUNvdW50ZXI+IFQq
IGFkZF9jb3VudGVycygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIpOwor
ICB9CisKKyAgdm9pZCBzZXRfZ3B1X2lkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBHcHVDb3VudGVyRXZlbnRfR3B1Q291bnRl
cl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgR3B1Q291bnRlckV2ZW50X0dwdUNvdW50ZXJfRGVjb2Rlcihjb25zdCB1aW50
OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30K
KyAgZXhwbGljaXQgR3B1Q291bnRlckV2ZW50X0dwdUNvdW50ZXJfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBHcHVDb3Vu
dGVyRXZlbnRfR3B1Q291bnRlcl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19jb3VudGVyX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IGNvdW50ZXJfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9
CisgIGJvb2wgaGFzX2ludF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICBpbnQ2NF90IGludF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50NjQo
KTsgfQorICBib29sIGhhc19kb3VibGVfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgZG91YmxlIGRvdWJsZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
YXNfZG91YmxlKCk7IH0KK307CisKK2NsYXNzIEdwdUNvdW50ZXJFdmVudF9HcHVDb3VudGVyIDog
cHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIg
PSBHcHVDb3VudGVyRXZlbnRfR3B1Q291bnRlcl9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0NvdW50ZXJJZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrSW50VmFsdWVGaWVsZE51bWJl
ciA9IDIsCisgICAga0RvdWJsZVZhbHVlRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNl
dF9jb3VudGVyX2lkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9pbnRfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2
YWx1ZSkgeworICAgIEFwcGVuZEZpeGVkKDMsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1l
c3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNs
dWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by90cmFjZS9ncHUvZ3B1X2xvZy5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0
aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVS
RkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9HUFVfR1BVX0xPR19QUk9UT19IXwor
I2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0dQVV9HUFVfTE9H
X1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJv
dG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitlbnVtIEdwdUxvZ19TZXZlcml0eSA6IGludDMy
X3Q7CisKK2VudW0gR3B1TG9nX1NldmVyaXR5IDogaW50MzJfdCB7CisgIEdwdUxvZ19TZXZlcml0
eV9MT0dfU0VWRVJJVFlfVU5TUEVDSUZJRUQgPSAwLAorICBHcHVMb2dfU2V2ZXJpdHlfTE9HX1NF
VkVSSVRZX1ZFUkJPU0UgPSAxLAorICBHcHVMb2dfU2V2ZXJpdHlfTE9HX1NFVkVSSVRZX0RFQlVH
ID0gMiwKKyAgR3B1TG9nX1NldmVyaXR5X0xPR19TRVZFUklUWV9JTkZPID0gMywKKyAgR3B1TG9n
X1NldmVyaXR5X0xPR19TRVZFUklUWV9XQVJOSU5HID0gNCwKKyAgR3B1TG9nX1NldmVyaXR5X0xP
R19TRVZFUklUWV9FUlJPUiA9IDUsCit9OworCitjb25zdCBHcHVMb2dfU2V2ZXJpdHkgR3B1TG9n
X1NldmVyaXR5X01JTiA9IEdwdUxvZ19TZXZlcml0eV9MT0dfU0VWRVJJVFlfVU5TUEVDSUZJRUQ7
Citjb25zdCBHcHVMb2dfU2V2ZXJpdHkgR3B1TG9nX1NldmVyaXR5X01BWCA9IEdwdUxvZ19TZXZl
cml0eV9MT0dfU0VWRVJJVFlfRVJST1I7CisKK2NsYXNzIEdwdUxvZ19EZWNvZGVyIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgR3B1TG9n
X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVj
b2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEdwdUxvZ19EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEdwdUxvZ19E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19zZXZlcml0eSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHNldmVyaXR5KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RhZygpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyB0YWco
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2xvZ19t
ZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpDb25zdENoYXJzIGxvZ19tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19zdHJp
bmcoKTsgfQorfTsKKworY2xhc3MgR3B1TG9nIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBHcHVMb2dfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtTZXZlcml0eUZpZWxkTnVtYmVyID0gMSwKKyAgICBrVGFnRmllbGRO
dW1iZXIgPSAyLAorICAgIGtMb2dNZXNzYWdlRmllbGROdW1iZXIgPSAzLAorICB9OworICB1c2lu
ZyBTZXZlcml0eSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpHcHVMb2dfU2V2ZXJpdHk7
CisgIHN0YXRpYyBjb25zdCBTZXZlcml0eSBMT0dfU0VWRVJJVFlfVU5TUEVDSUZJRUQgPSBHcHVM
b2dfU2V2ZXJpdHlfTE9HX1NFVkVSSVRZX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgU2V2
ZXJpdHkgTE9HX1NFVkVSSVRZX1ZFUkJPU0UgPSBHcHVMb2dfU2V2ZXJpdHlfTE9HX1NFVkVSSVRZ
X1ZFUkJPU0U7CisgIHN0YXRpYyBjb25zdCBTZXZlcml0eSBMT0dfU0VWRVJJVFlfREVCVUcgPSBH
cHVMb2dfU2V2ZXJpdHlfTE9HX1NFVkVSSVRZX0RFQlVHOworICBzdGF0aWMgY29uc3QgU2V2ZXJp
dHkgTE9HX1NFVkVSSVRZX0lORk8gPSBHcHVMb2dfU2V2ZXJpdHlfTE9HX1NFVkVSSVRZX0lORk87
CisgIHN0YXRpYyBjb25zdCBTZXZlcml0eSBMT0dfU0VWRVJJVFlfV0FSTklORyA9IEdwdUxvZ19T
ZXZlcml0eV9MT0dfU0VWRVJJVFlfV0FSTklORzsKKyAgc3RhdGljIGNvbnN0IFNldmVyaXR5IExP
R19TRVZFUklUWV9FUlJPUiA9IEdwdUxvZ19TZXZlcml0eV9MT0dfU0VWRVJJVFlfRVJST1I7Cisg
IHZvaWQgc2V0X3NldmVyaXR5KDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpHcHVMb2dfU2V2
ZXJpdHkgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF90YWcoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMo
MiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3RhZyhjb25z
dCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNp
emUpOworICB9CisgIHZvaWQgc2V0X2xvZ19tZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAg
fQorICB2b2lkIHNldF9sb2dfbWVzc2FnZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUpOworICB9Cit9OworCit9IC8vIE5hbWVz
cGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1
ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3Bl
cmZldHRvL3RyYWNlL2dwdS9ncHVfcmVuZGVyX3N0YWdlX2V2ZW50LnBiemVyby5oCisvLyBBdXRv
Z2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4K
KworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0dQVV9HUFVf
UkVOREVSX1NUQUdFX0VWRU5UX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9U
T1NfUEVSRkVUVE9fVFJBQ0VfR1BVX0dQVV9SRU5ERVJfU1RBR0VfRVZFTlRfUFJPVE9fSF8KKwor
I2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1h
bGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRp
bHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNw
YWNlIHBiemVybyB7CisKK2NsYXNzIEdwdVJlbmRlclN0YWdlRXZlbnRfRXh0cmFEYXRhOworY2xh
c3MgR3B1UmVuZGVyU3RhZ2VFdmVudF9TcGVjaWZpY2F0aW9uczsKK2NsYXNzIEdwdVJlbmRlclN0
YWdlRXZlbnRfU3BlY2lmaWNhdGlvbnNfQ29udGV4dFNwZWM7CitjbGFzcyBHcHVSZW5kZXJTdGFn
ZUV2ZW50X1NwZWNpZmljYXRpb25zX0Rlc2NyaXB0aW9uOworZW51bSBJbnRlcm5lZEdwdVJlbmRl
clN0YWdlU3BlY2lmaWNhdGlvbl9SZW5kZXJTdGFnZUNhdGVnb3J5IDogaW50MzJfdDsKK2VudW0g
SW50ZXJuZWRHcmFwaGljc0NvbnRleHRfQXBpIDogaW50MzJfdDsKKworZW51bSBJbnRlcm5lZEdw
dVJlbmRlclN0YWdlU3BlY2lmaWNhdGlvbl9SZW5kZXJTdGFnZUNhdGVnb3J5IDogaW50MzJfdCB7
CisgIEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9uX1JlbmRlclN0YWdlQ2F0ZWdv
cnlfT1RIRVIgPSAwLAorICBJbnRlcm5lZEdwdVJlbmRlclN0YWdlU3BlY2lmaWNhdGlvbl9SZW5k
ZXJTdGFnZUNhdGVnb3J5X0dSQVBISUNTID0gMSwKKyAgSW50ZXJuZWRHcHVSZW5kZXJTdGFnZVNw
ZWNpZmljYXRpb25fUmVuZGVyU3RhZ2VDYXRlZ29yeV9DT01QVVRFID0gMiwKK307CisKK2NvbnN0
IEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9uX1JlbmRlclN0YWdlQ2F0ZWdvcnkg
SW50ZXJuZWRHcHVSZW5kZXJTdGFnZVNwZWNpZmljYXRpb25fUmVuZGVyU3RhZ2VDYXRlZ29yeV9N
SU4gPSBJbnRlcm5lZEdwdVJlbmRlclN0YWdlU3BlY2lmaWNhdGlvbl9SZW5kZXJTdGFnZUNhdGVn
b3J5X09USEVSOworY29uc3QgSW50ZXJuZWRHcHVSZW5kZXJTdGFnZVNwZWNpZmljYXRpb25fUmVu
ZGVyU3RhZ2VDYXRlZ29yeSBJbnRlcm5lZEdwdVJlbmRlclN0YWdlU3BlY2lmaWNhdGlvbl9SZW5k
ZXJTdGFnZUNhdGVnb3J5X01BWCA9IEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9u
X1JlbmRlclN0YWdlQ2F0ZWdvcnlfQ09NUFVURTsKKworZW51bSBJbnRlcm5lZEdyYXBoaWNzQ29u
dGV4dF9BcGkgOiBpbnQzMl90IHsKKyAgSW50ZXJuZWRHcmFwaGljc0NvbnRleHRfQXBpX1VOREVG
SU5FRCA9IDAsCisgIEludGVybmVkR3JhcGhpY3NDb250ZXh0X0FwaV9PUEVOX0dMID0gMSwKKyAg
SW50ZXJuZWRHcmFwaGljc0NvbnRleHRfQXBpX1ZVTEtBTiA9IDIsCisgIEludGVybmVkR3JhcGhp
Y3NDb250ZXh0X0FwaV9PUEVOX0NMID0gMywKK307CisKK2NvbnN0IEludGVybmVkR3JhcGhpY3ND
b250ZXh0X0FwaSBJbnRlcm5lZEdyYXBoaWNzQ29udGV4dF9BcGlfTUlOID0gSW50ZXJuZWRHcmFw
aGljc0NvbnRleHRfQXBpX1VOREVGSU5FRDsKK2NvbnN0IEludGVybmVkR3JhcGhpY3NDb250ZXh0
X0FwaSBJbnRlcm5lZEdyYXBoaWNzQ29udGV4dF9BcGlfTUFYID0gSW50ZXJuZWRHcmFwaGljc0Nv
bnRleHRfQXBpX09QRU5fQ0w7CisKK2NsYXNzIEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZp
Y2F0aW9uX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBJbnRlcm5lZEdwdVJlbmRlclN0YWdlU3BlY2lmaWNhdGlvbl9EZWNv
ZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIo
ZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBJbnRlcm5lZEdwdVJlbmRlclN0YWdlU3BlY2lmaWNh
dGlvbl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9uX0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2lpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpaWQoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfZGVzY3JpcHRpb24oKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgZGVzY3JpcHRpb24oKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3N0cmluZygpOyB9Cisg
IGJvb2wgaGFzX2NhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9Cisg
IGludDMyX3QgY2F0ZWdvcnkoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2ludDMyKCk7IH0K
K307CisKK2NsYXNzIEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9uIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBJbnRl
cm5lZEdwdVJlbmRlclN0YWdlU3BlY2lmaWNhdGlvbl9EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMiwK
KyAgICBrRGVzY3JpcHRpb25GaWVsZE51bWJlciA9IDMsCisgICAga0NhdGVnb3J5RmllbGROdW1i
ZXIgPSA0LAorICB9OworICB1c2luZyBSZW5kZXJTdGFnZUNhdGVnb3J5ID0gOjpwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OkludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9uX1JlbmRl
clN0YWdlQ2F0ZWdvcnk7CisgIHN0YXRpYyBjb25zdCBSZW5kZXJTdGFnZUNhdGVnb3J5IE9USEVS
ID0gSW50ZXJuZWRHcHVSZW5kZXJTdGFnZVNwZWNpZmljYXRpb25fUmVuZGVyU3RhZ2VDYXRlZ29y
eV9PVEhFUjsKKyAgc3RhdGljIGNvbnN0IFJlbmRlclN0YWdlQ2F0ZWdvcnkgR1JBUEhJQ1MgPSBJ
bnRlcm5lZEdwdVJlbmRlclN0YWdlU3BlY2lmaWNhdGlvbl9SZW5kZXJTdGFnZUNhdGVnb3J5X0dS
QVBISUNTOworICBzdGF0aWMgY29uc3QgUmVuZGVyU3RhZ2VDYXRlZ29yeSBDT01QVVRFID0gSW50
ZXJuZWRHcHVSZW5kZXJTdGFnZVNwZWNpZmljYXRpb25fUmVuZGVyU3RhZ2VDYXRlZ29yeV9DT01Q
VVRFOworICB2b2lkIHNldF9paWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9
CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBB
cHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9kZXNjcmlwdGlvbihj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfZGVzY3JpcHRpb24oY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9jYXRlZ29yeSg6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6SW50
ZXJuZWRHcHVSZW5kZXJTdGFnZVNwZWNpZmljYXRpb25fUmVuZGVyU3RhZ2VDYXRlZ29yeSB2YWx1
ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBJ
bnRlcm5lZEdyYXBoaWNzQ29udGV4dF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgSW50ZXJuZWRHcmFwaGljc0NvbnRleHRf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgSW50ZXJuZWRHcmFwaGljc0NvbnRleHRfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBJbnRlcm5lZEdyYXBoaWNzQ29udGV4dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJv
OjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXpl
KSB7fQorICBib29sIGhhc19paWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQor
ICBib29sIGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCBwaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBo
YXNfYXBpKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgYXBp
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBJbnRl
cm5lZEdyYXBoaWNzQ29udGV4dCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVi
bGljOgorICB1c2luZyBEZWNvZGVyID0gSW50ZXJuZWRHcmFwaGljc0NvbnRleHRfRGVjb2RlcjsK
KyAgZW51bSA6IGludDMyX3QgeworICAgIGtJaWRGaWVsZE51bWJlciA9IDEsCisgICAga1BpZEZp
ZWxkTnVtYmVyID0gMiwKKyAgICBrQXBpRmllbGROdW1iZXIgPSAzLAorICB9OworICB1c2luZyBB
cGkgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6SW50ZXJuZWRHcmFwaGljc0NvbnRleHRf
QXBpOworICBzdGF0aWMgY29uc3QgQXBpIFVOREVGSU5FRCA9IEludGVybmVkR3JhcGhpY3NDb250
ZXh0X0FwaV9VTkRFRklORUQ7CisgIHN0YXRpYyBjb25zdCBBcGkgT1BFTl9HTCA9IEludGVybmVk
R3JhcGhpY3NDb250ZXh0X0FwaV9PUEVOX0dMOworICBzdGF0aWMgY29uc3QgQXBpIFZVTEtBTiA9
IEludGVybmVkR3JhcGhpY3NDb250ZXh0X0FwaV9WVUxLQU47CisgIHN0YXRpYyBjb25zdCBBcGkg
T1BFTl9DTCA9IEludGVybmVkR3JhcGhpY3NDb250ZXh0X0FwaV9PUEVOX0NMOworICB2b2lkIHNl
dF9paWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3BpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9hcGkoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86Oklu
dGVybmVkR3JhcGhpY3NDb250ZXh0X0FwaSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQo
MywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBHcHVSZW5kZXJTdGFnZUV2ZW50X0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MTUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgor
ICBHcHVSZW5kZXJTdGFnZUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90
IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEdwdVJl
bmRlclN0YWdlRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCBy
YXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBHcHVSZW5kZXJTdGFnZUV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2V2ZW50X2lkKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGV2ZW50X2lkKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19kdXJhdGlvbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBkdXJhdGlvbigpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaHdfcXVldWVfaWlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBod19xdWV1ZV9paWQo
KSBjb25zdCB7IHJldHVybiBhdDwxMz4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zdGFn
ZV9paWQoKSBjb25zdCB7IHJldHVybiBhdDwxND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHN0
YWdlX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE0PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2dwdV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBncHVfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wg
aGFzX2NvbnRleHQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfcmVuZGVyX3RhcmdldF9oYW5kbGUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlk
KCk7IH0KKyAgdWludDY0X3QgcmVuZGVyX3RhcmdldF9oYW5kbGUoKSBjb25zdCB7IHJldHVybiBh
dDw4PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3N1Ym1pc3Npb25faWQoKSBjb25zdCB7
IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHN1Ym1pc3Npb25faWQoKSBj
b25zdCB7IHJldHVybiBhdDwxMD4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19leHRyYV9k
YXRhKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpS
ZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGV4dHJhX2RhdGEo
KSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNik7
IH0KKyAgYm9vbCBoYXNfcmVuZGVyX3Bhc3NfaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHJlbmRlcl9wYXNzX2hhbmRsZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDk+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmVuZGVyX3N1YnBhc3NfaW5k
ZXhfbWFzaygpIGNvbnN0IHsgcmV0dXJuIGF0PDE1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjx1aW50NjRfdD4gcmVuZGVyX3N1YnBhc3NfaW5kZXhf
bWFzaygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPHVpbnQ2NF90PigxNSk7IH0KKyAgYm9v
bCBoYXNfY29tbWFuZF9idWZmZXJfaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBjb21tYW5kX2J1ZmZlcl9oYW5kbGUoKSBjb25zdCB7IHJldHVy
biBhdDwxMj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zcGVjaWZpY2F0aW9ucygpIGNv
bnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBzcGVjaWZpY2F0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19od19xdWV1ZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsg
fQorICBpbnQzMl90IGh3X3F1ZXVlX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQz
MigpOyB9CisgIGJvb2wgaGFzX3N0YWdlX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxp
ZCgpOyB9CisgIGludDMyX3Qgc3RhZ2VfaWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2lu
dDMyKCk7IH0KK307CisKK2NsYXNzIEdwdVJlbmRlclN0YWdlRXZlbnQgOiBwdWJsaWMgOjpwcm90
b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEdwdVJlbmRlclN0
YWdlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtFdmVudElkRmllbGRO
dW1iZXIgPSAxLAorICAgIGtEdXJhdGlvbkZpZWxkTnVtYmVyID0gMiwKKyAgICBrSHdRdWV1ZUlp
ZEZpZWxkTnVtYmVyID0gMTMsCisgICAga1N0YWdlSWlkRmllbGROdW1iZXIgPSAxNCwKKyAgICBr
R3B1SWRGaWVsZE51bWJlciA9IDExLAorICAgIGtDb250ZXh0RmllbGROdW1iZXIgPSA1LAorICAg
IGtSZW5kZXJUYXJnZXRIYW5kbGVGaWVsZE51bWJlciA9IDgsCisgICAga1N1Ym1pc3Npb25JZEZp
ZWxkTnVtYmVyID0gMTAsCisgICAga0V4dHJhRGF0YUZpZWxkTnVtYmVyID0gNiwKKyAgICBrUmVu
ZGVyUGFzc0hhbmRsZUZpZWxkTnVtYmVyID0gOSwKKyAgICBrUmVuZGVyU3VicGFzc0luZGV4TWFz
a0ZpZWxkTnVtYmVyID0gMTUsCisgICAga0NvbW1hbmRCdWZmZXJIYW5kbGVGaWVsZE51bWJlciA9
IDEyLAorICAgIGtTcGVjaWZpY2F0aW9uc0ZpZWxkTnVtYmVyID0gNywKKyAgICBrSHdRdWV1ZUlk
RmllbGROdW1iZXIgPSAzLAorICAgIGtTdGFnZUlkRmllbGROdW1iZXIgPSA0LAorICB9OworICB1
c2luZyBFeHRyYURhdGEgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6R3B1UmVuZGVyU3Rh
Z2VFdmVudF9FeHRyYURhdGE7CisgIHVzaW5nIFNwZWNpZmljYXRpb25zID0gOjpwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OkdwdVJlbmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlvbnM7CisgIHZv
aWQgc2V0X2V2ZW50X2lkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9kdXJhdGlvbih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaHdfcXVldWVfaWlkKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfc3RhZ2VfaWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE0LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfZ3B1X2lkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jb250ZXh0KHVpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZW5kZXJf
dGFyZ2V0X2hhbmRsZSh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3VibWlzc2lvbl9pZCh1aW50MzJfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxMCwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
R3B1UmVuZGVyU3RhZ2VFdmVudF9FeHRyYURhdGE+IFQqIGFkZF9leHRyYV9kYXRhKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNik7CisgIH0KKworICB2b2lkIHNldF9yZW5k
ZXJfcGFzc19oYW5kbGUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFs
dWUpOworICB9CisgIHZvaWQgYWRkX3JlbmRlcl9zdWJwYXNzX2luZGV4X21hc2sodWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9j
b21tYW5kX2J1ZmZlcl9oYW5kbGUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MTIsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEdwdVJlbmRlclN0YWdl
RXZlbnRfU3BlY2lmaWNhdGlvbnM+IFQqIHNldF9zcGVjaWZpY2F0aW9ucygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDcpOworICB9CisKKyAgdm9pZCBzZXRfaHdfcXVldWVf
aWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfc3RhZ2VfaWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2
YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEdwdVJlbmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlv
bnNfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhf
RklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4gewor
IHB1YmxpYzoKKyAgR3B1UmVuZGVyU3RhZ2VFdmVudF9TcGVjaWZpY2F0aW9uc19EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBHcHVSZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmljYXRpb25zX0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgR3B1UmVuZGVyU3RhZ2VFdmVudF9TcGVjaWZpY2F0aW9uc19EZWNvZGVyKGNvbnN0
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRh
dGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jb250ZXh0X3NwZWMoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY29udGV4dF9z
cGVjKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2h3
X3F1ZXVlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGh3X3F1ZXVl
KCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIp
OyB9CisgIGJvb2wgaGFzX3N0YWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0
Qnl0ZXM+IHN0YWdlKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+KDMpOyB9Cit9OworCitjbGFzcyBHcHVSZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmlj
YXRpb25zIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5n
IERlY29kZXIgPSBHcHVSZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmljYXRpb25zX0RlY29kZXI7Cisg
IGVudW0gOiBpbnQzMl90IHsKKyAgICBrQ29udGV4dFNwZWNGaWVsZE51bWJlciA9IDEsCisgICAg
a0h3UXVldWVGaWVsZE51bWJlciA9IDIsCisgICAga1N0YWdlRmllbGROdW1iZXIgPSAzLAorICB9
OworICB1c2luZyBDb250ZXh0U3BlYyA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpHcHVS
ZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmljYXRpb25zX0NvbnRleHRTcGVjOworICB1c2luZyBEZXNj
cmlwdGlvbiA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpHcHVSZW5kZXJTdGFnZUV2ZW50
X1NwZWNpZmljYXRpb25zX0Rlc2NyaXB0aW9uOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEdw
dVJlbmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlvbnNfQ29udGV4dFNwZWM+IFQqIHNldF9jb250
ZXh0X3NwZWMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3B1UmVuZGVyU3RhZ2VFdmVudF9TcGVjaWZpY2F0
aW9uc19EZXNjcmlwdGlvbj4gVCogYWRkX2h3X3F1ZXVlKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEdwdVJl
bmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlvbnNfRGVzY3JpcHRpb24+IFQqIGFkZF9zdGFnZSgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMpOworICB9CisKK307CisKK2Ns
YXNzIEdwdVJlbmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlvbnNfRGVzY3JpcHRpb25fRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6
CisgIEdwdVJlbmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlvbnNfRGVzY3JpcHRpb25fRGVjb2Rl
cihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRh
dGEsIGxlbikge30KKyAgZXhwbGljaXQgR3B1UmVuZGVyU3RhZ2VFdmVudF9TcGVjaWZpY2F0aW9u
c19EZXNjcmlwdGlvbl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEdwdVJlbmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlv
bnNfRGVzY3JpcHRpb25fRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNf
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQor
ICBib29sIGhhc19kZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBkZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEdwdVJlbmRlclN0YWdlRXZlbnRf
U3BlY2lmaWNhdGlvbnNfRGVzY3JpcHRpb24gOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ug
eworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEdwdVJlbmRlclN0YWdlRXZlbnRfU3BlY2lm
aWNhdGlvbnNfRGVzY3JpcHRpb25fRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtO
YW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtEZXNjcmlwdGlvbkZpZWxkTnVtYmVyID0gMiwKKyAg
fTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBl
bmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRf
bmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEs
IGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2Rlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6
ZSgpKTsKKyAgfQorICB2b2lkIHNldF9kZXNjcmlwdGlvbihjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9Cit9OworCitj
bGFzcyBHcHVSZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmljYXRpb25zX0NvbnRleHRTcGVjX0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBHcHVSZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmljYXRpb25zX0NvbnRleHRTcGVjX0RlY29k
ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rlcihk
YXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEdwdVJlbmRlclN0YWdlRXZlbnRfU3BlY2lmaWNhdGlv
bnNfQ29udGV4dFNwZWNfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCBy
YXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBHcHVSZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmljYXRp
b25zX0NvbnRleHRTcGVjX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X2NvbnRleHQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
Y29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcGlk
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9Cit9OworCitjbGFzcyBHcHVS
ZW5kZXJTdGFnZUV2ZW50X1NwZWNpZmljYXRpb25zX0NvbnRleHRTcGVjIDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBHcHVSZW5kZXJT
dGFnZUV2ZW50X1NwZWNpZmljYXRpb25zX0NvbnRleHRTcGVjX0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrQ29udGV4dEZpZWxkTnVtYmVyID0gMSwKKyAgICBrUGlkRmllbGROdW1i
ZXIgPSAyLAorICB9OworICB2b2lkIHNldF9jb250ZXh0KHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9waWQoaW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEdwdVJl
bmRlclN0YWdlRXZlbnRfRXh0cmFEYXRhX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5
cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVB
VEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBHcHVSZW5kZXJTdGFnZUV2ZW50X0V4
dHJhRGF0YV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQ
cm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBHcHVSZW5kZXJTdGFnZUV2ZW50
X0V4dHJhRGF0YV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5z
aXplKCkpIHt9CisgIGV4cGxpY2l0IEdwdVJlbmRlclN0YWdlRXZlbnRfRXh0cmFEYXRhX0RlY29k
ZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdmFsdWUoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3N0cmluZygpOyB9Cit9OworCitj
bGFzcyBHcHVSZW5kZXJTdGFnZUV2ZW50X0V4dHJhRGF0YSA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gR3B1UmVuZGVyU3RhZ2VFdmVu
dF9FeHRyYURhdGFfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtOYW1lRmllbGRO
dW1iZXIgPSAxLAorICAgIGtWYWx1ZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRf
bmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1
ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOwor
ICB9CisgIHZvaWQgc2V0X3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNl
dF92YWx1ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDIsIGRhdGEsIHNpemUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNw
YWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL2dwdS92
dWxrYW5fYXBpX2V2ZW50LnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1pl
cm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9U
T1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0dQVV9WVUxLQU5fQVBJX0VWRU5UX1BST1RPX0hfCisj
ZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfR1BVX1ZVTEtBTl9B
UElfRVZFTlRfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlu
dC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19k
ZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVz
cGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIFZ1bGthbkFwaUV2ZW50
X1ZrRGVidWdVdGlsc09iamVjdE5hbWU7CitjbGFzcyBWdWxrYW5BcGlFdmVudF9Wa1F1ZXVlU3Vi
bWl0OworCitjbGFzcyBWdWxrYW5BcGlFdmVudF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVnVsa2FuQXBpRXZlbnRfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVnVsa2FuQXBpRXZlbnRfRGVjb2Rlcihjb25zdCBz
dGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBWdWxr
YW5BcGlFdmVudF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc192a19k
ZWJ1Z191dGlsc19vYmplY3RfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB2a19kZWJ1Z191dGlsc19vYmplY3RfbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc192a19xdWV1
ZV9zdWJtaXQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgdmtfcXVldWVfc3VibWl0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c19ieXRlcygpOyB9Cit9OworCitjbGFzcyBWdWxrYW5BcGlFdmVudCA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVnVsa2FuQXBpRXZl
bnRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtWa0RlYnVnVXRpbHNPYmplY3RO
YW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtWa1F1ZXVlU3VibWl0RmllbGROdW1iZXIgPSAyLAor
ICB9OworICB1c2luZyBWa0RlYnVnVXRpbHNPYmplY3ROYW1lID0gOjpwZXJmZXR0bzo6cHJvdG9z
OjpwYnplcm86OlZ1bGthbkFwaUV2ZW50X1ZrRGVidWdVdGlsc09iamVjdE5hbWU7CisgIHVzaW5n
IFZrUXVldWVTdWJtaXQgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VnVsa2FuQXBpRXZl
bnRfVmtRdWV1ZVN1Ym1pdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBWdWxrYW5BcGlFdmVu
dF9Wa0RlYnVnVXRpbHNPYmplY3ROYW1lPiBUKiBzZXRfdmtfZGVidWdfdXRpbHNfb2JqZWN0X25h
bWUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gVnVsa2FuQXBpRXZlbnRfVmtRdWV1ZVN1Ym1pdD4gVCogc2V0
X3ZrX3F1ZXVlX3N1Ym1pdCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIp
OworICB9CisKK307CisKK2NsYXNzIFZ1bGthbkFwaUV2ZW50X1ZrUXVldWVTdWJtaXRfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki82LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoK
KyAgVnVsa2FuQXBpRXZlbnRfVmtRdWV1ZVN1Ym1pdF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBWdWxrYW5BcGlFdmVudF9Wa1F1ZXVlU3VibWl0X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVnVsa2FuQXBpRXZl
bnRfVmtRdWV1ZVN1Ym1pdF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhh
c19kdXJhdGlvbl9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBkdXJhdGlvbl9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0K
KyAgYm9vbCBoYXNfcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVp
bnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9v
bCBoYXNfdGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IHRpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNf
dmtfcXVldWUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
dmtfcXVldWUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX3ZrX2NvbW1hbmRfYnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPHVpbnQ2NF90PiB2a19jb21t
YW5kX2J1ZmZlcnMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDx1aW50NjRfdD4oNSk7IH0K
KyAgYm9vbCBoYXNfc3VibWlzc2lvbl9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBzdWJtaXNzaW9uX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5h
c191aW50MzIoKTsgfQorfTsKKworY2xhc3MgVnVsa2FuQXBpRXZlbnRfVmtRdWV1ZVN1Ym1pdCA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gVnVsa2FuQXBpRXZlbnRfVmtRdWV1ZVN1Ym1pdF9EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga0R1cmF0aW9uTnNGaWVsZE51bWJlciA9IDEsCisgICAga1BpZEZpZWxkTnVtYmVy
ID0gMiwKKyAgICBrVGlkRmllbGROdW1iZXIgPSAzLAorICAgIGtWa1F1ZXVlRmllbGROdW1iZXIg
PSA0LAorICAgIGtWa0NvbW1hbmRCdWZmZXJzRmllbGROdW1iZXIgPSA1LAorICAgIGtTdWJtaXNz
aW9uSWRGaWVsZE51bWJlciA9IDYsCisgIH07CisgIHZvaWQgc2V0X2R1cmF0aW9uX25zKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9waWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3RpZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdmtfcXVldWUodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgYWRkX3ZrX2NvbW1hbmRfYnVmZmVy
cyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfc3VibWlzc2lvbl9pZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCg2LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFZ1bGthbkFwaUV2ZW50X1ZrRGVidWdVdGls
c09iamVjdE5hbWVfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29k
ZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
ZmFsc2U+IHsKKyBwdWJsaWM6CisgIFZ1bGthbkFwaUV2ZW50X1ZrRGVidWdVdGlsc09iamVjdE5h
bWVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVnVsa2FuQXBpRXZlbnRfVmtEZWJ1Z1V0
aWxzT2JqZWN0TmFtZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFZ1bGthbkFwaUV2ZW50X1ZrRGVidWdVdGlsc09iamVj
dE5hbWVfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdmtfZGV2aWNlKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHZrX2RldmljZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfb2JqZWN0X3R5
cGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBvYmplY3Rf
dHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19v
YmplY3QoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgb2Jq
ZWN0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19v
YmplY3RfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RDaGFycyBvYmplY3RfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNf
c3RyaW5nKCk7IH0KK307CisKK2NsYXNzIFZ1bGthbkFwaUV2ZW50X1ZrRGVidWdVdGlsc09iamVj
dE5hbWUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IFZ1bGthbkFwaUV2ZW50X1ZrRGVidWdVdGlsc09iamVjdE5hbWVfRGVjb2RlcjsK
KyAgZW51bSA6IGludDMyX3QgeworICAgIGtQaWRGaWVsZE51bWJlciA9IDEsCisgICAga1ZrRGV2
aWNlRmllbGROdW1iZXIgPSAyLAorICAgIGtPYmplY3RUeXBlRmllbGROdW1iZXIgPSAzLAorICAg
IGtPYmplY3RGaWVsZE51bWJlciA9IDQsCisgICAga09iamVjdE5hbWVGaWVsZE51bWJlciA9IDUs
CisgIH07CisgIHZvaWQgc2V0X3BpZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdmtfZGV2aWNlKHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9vYmplY3RfdHlw
ZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9vYmplY3QodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X29iamVjdF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1
ZSkgeworICAgIEFwcGVuZEJ5dGVzKDUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAg
fQorICB2b2lkIHNldF9vYmplY3RfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDUsIGRhdGEsIHNpemUpOworICB9Cit9OworCit9IC8vIE5hbWVz
cGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1
ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3Bl
cmZldHRvL3RyYWNlL2dwdS92dWxrYW5fbWVtb3J5X2V2ZW50LnBiemVyby5oCisvLyBBdXRvZ2Vu
ZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKwor
I2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0dQVV9WVUxLQU5f
TUVNT1JZX0VWRU5UX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVS
RkVUVE9fVFJBQ0VfR1BVX1ZVTEtBTl9NRU1PUllfRVZFTlRfUFJPVE9fSF8KKworI2luY2x1ZGUg
PHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9y
ZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVy
byB7CisKK2NsYXNzIFZ1bGthbk1lbW9yeUV2ZW50QW5ub3RhdGlvbjsKK2VudW0gVnVsa2FuTWVt
b3J5RXZlbnRfQWxsb2NhdGlvblNjb3BlIDogaW50MzJfdDsKK2VudW0gVnVsa2FuTWVtb3J5RXZl
bnRfT3BlcmF0aW9uIDogaW50MzJfdDsKK2VudW0gVnVsa2FuTWVtb3J5RXZlbnRfU291cmNlIDog
aW50MzJfdDsKKworZW51bSBWdWxrYW5NZW1vcnlFdmVudF9Tb3VyY2UgOiBpbnQzMl90IHsKKyAg
VnVsa2FuTWVtb3J5RXZlbnRfU291cmNlX1NPVVJDRV9VTlNQRUNJRklFRCA9IDAsCisgIFZ1bGth
bk1lbW9yeUV2ZW50X1NvdXJjZV9TT1VSQ0VfRFJJVkVSID0gMSwKKyAgVnVsa2FuTWVtb3J5RXZl
bnRfU291cmNlX1NPVVJDRV9ERVZJQ0UgPSAyLAorICBWdWxrYW5NZW1vcnlFdmVudF9Tb3VyY2Vf
U09VUkNFX0RFVklDRV9NRU1PUlkgPSAzLAorICBWdWxrYW5NZW1vcnlFdmVudF9Tb3VyY2VfU09V
UkNFX0JVRkZFUiA9IDQsCisgIFZ1bGthbk1lbW9yeUV2ZW50X1NvdXJjZV9TT1VSQ0VfSU1BR0Ug
PSA1LAorfTsKKworY29uc3QgVnVsa2FuTWVtb3J5RXZlbnRfU291cmNlIFZ1bGthbk1lbW9yeUV2
ZW50X1NvdXJjZV9NSU4gPSBWdWxrYW5NZW1vcnlFdmVudF9Tb3VyY2VfU09VUkNFX1VOU1BFQ0lG
SUVEOworY29uc3QgVnVsa2FuTWVtb3J5RXZlbnRfU291cmNlIFZ1bGthbk1lbW9yeUV2ZW50X1Nv
dXJjZV9NQVggPSBWdWxrYW5NZW1vcnlFdmVudF9Tb3VyY2VfU09VUkNFX0lNQUdFOworCitlbnVt
IFZ1bGthbk1lbW9yeUV2ZW50X09wZXJhdGlvbiA6IGludDMyX3QgeworICBWdWxrYW5NZW1vcnlF
dmVudF9PcGVyYXRpb25fT1BfVU5TUEVDSUZJRUQgPSAwLAorICBWdWxrYW5NZW1vcnlFdmVudF9P
cGVyYXRpb25fT1BfQ1JFQVRFID0gMSwKKyAgVnVsa2FuTWVtb3J5RXZlbnRfT3BlcmF0aW9uX09Q
X0RFU1RST1kgPSAyLAorICBWdWxrYW5NZW1vcnlFdmVudF9PcGVyYXRpb25fT1BfQklORCA9IDMs
CisgIFZ1bGthbk1lbW9yeUV2ZW50X09wZXJhdGlvbl9PUF9ERVNUUk9ZX0JPVU5EID0gNCwKKyAg
VnVsa2FuTWVtb3J5RXZlbnRfT3BlcmF0aW9uX09QX0FOTk9UQVRJT05TID0gNSwKK307CisKK2Nv
bnN0IFZ1bGthbk1lbW9yeUV2ZW50X09wZXJhdGlvbiBWdWxrYW5NZW1vcnlFdmVudF9PcGVyYXRp
b25fTUlOID0gVnVsa2FuTWVtb3J5RXZlbnRfT3BlcmF0aW9uX09QX1VOU1BFQ0lGSUVEOworY29u
c3QgVnVsa2FuTWVtb3J5RXZlbnRfT3BlcmF0aW9uIFZ1bGthbk1lbW9yeUV2ZW50X09wZXJhdGlv
bl9NQVggPSBWdWxrYW5NZW1vcnlFdmVudF9PcGVyYXRpb25fT1BfQU5OT1RBVElPTlM7CisKK2Vu
dW0gVnVsa2FuTWVtb3J5RXZlbnRfQWxsb2NhdGlvblNjb3BlIDogaW50MzJfdCB7CisgIFZ1bGth
bk1lbW9yeUV2ZW50X0FsbG9jYXRpb25TY29wZV9TQ09QRV9VTlNQRUNJRklFRCA9IDAsCisgIFZ1
bGthbk1lbW9yeUV2ZW50X0FsbG9jYXRpb25TY29wZV9TQ09QRV9DT01NQU5EID0gMSwKKyAgVnVs
a2FuTWVtb3J5RXZlbnRfQWxsb2NhdGlvblNjb3BlX1NDT1BFX09CSkVDVCA9IDIsCisgIFZ1bGth
bk1lbW9yeUV2ZW50X0FsbG9jYXRpb25TY29wZV9TQ09QRV9DQUNIRSA9IDMsCisgIFZ1bGthbk1l
bW9yeUV2ZW50X0FsbG9jYXRpb25TY29wZV9TQ09QRV9ERVZJQ0UgPSA0LAorICBWdWxrYW5NZW1v
cnlFdmVudF9BbGxvY2F0aW9uU2NvcGVfU0NPUEVfSU5TVEFOQ0UgPSA1LAorfTsKKworY29uc3Qg
VnVsa2FuTWVtb3J5RXZlbnRfQWxsb2NhdGlvblNjb3BlIFZ1bGthbk1lbW9yeUV2ZW50X0FsbG9j
YXRpb25TY29wZV9NSU4gPSBWdWxrYW5NZW1vcnlFdmVudF9BbGxvY2F0aW9uU2NvcGVfU0NPUEVf
VU5TUEVDSUZJRUQ7Citjb25zdCBWdWxrYW5NZW1vcnlFdmVudF9BbGxvY2F0aW9uU2NvcGUgVnVs
a2FuTWVtb3J5RXZlbnRfQWxsb2NhdGlvblNjb3BlX01BWCA9IFZ1bGthbk1lbW9yeUV2ZW50X0Fs
bG9jYXRpb25TY29wZV9TQ09QRV9JTlNUQU5DRTsKKworY2xhc3MgVnVsa2FuTWVtb3J5RXZlbnRf
RGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklF
TERfSUQ9Ki8yMCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBw
dWJsaWM6CisgIFZ1bGthbk1lbW9yeUV2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IFZ1bGthbk1lbW9yeUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVnVsa2FuTWVtb3J5RXZlbnRfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfc291cmNlKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX29wZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG9wZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc190aW1lc3RhbXAoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0aW1lc3RhbXAoKSBjb25zdCB7IHJl
dHVybiBhdDwzPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfcGlkKCkgY29uc3QgeyByZXR1
cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDQ+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbWVtb3J5X2FkZHJlc3MoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbWVtb3J5X2FkZHJlc3MoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX21lbW9yeV9z
aXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG1lbW9y
eV9zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhh
c19jYWxsZXJfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGNhbGxlcl9paWQoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2FsbG9jYXRpb25fc2NvcGUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBhbGxvY2F0aW9uX3Njb3BlKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4o
KS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2Fubm90YXRpb25zKCkgY29uc3QgeyByZXR1cm4g
YXQ8OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGFubm90YXRpb25zKCkgY29uc3QgeyByZXR1cm4gR2V0
UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDkpOyB9CisgIGJvb2wgaGFzX2Rldmlj
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZGV2aWNl
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZGV2
aWNlX21lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE3PigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgZGV2aWNlX21lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE3PigpLmFzX3VpbnQ2NCgpOyB9
CisgIGJvb2wgaGFzX21lbW9yeV90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTg+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBtZW1vcnlfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE4PigpLmFz
X3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2hlYXAoKSBjb25zdCB7IHJldHVybiBhdDwxOT4oKS52
YWxpZCgpOyB9CisgIHVpbnQzMl90IGhlYXAoKSBjb25zdCB7IHJldHVybiBhdDwxOT4oKS5hc191
aW50MzIoKTsgfQorICBib29sIGhhc19vYmplY3RfaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gYXQ8
MjA+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBvYmplY3RfaGFuZGxlKCkgY29uc3QgeyByZXR1
cm4gYXQ8MjA+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIFZ1bGthbk1lbW9yeUV2ZW50
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBWdWxrYW5NZW1vcnlFdmVudF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAg
a1NvdXJjZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrT3BlcmF0aW9uRmllbGROdW1iZXIgPSAyLAor
ICAgIGtUaW1lc3RhbXBGaWVsZE51bWJlciA9IDMsCisgICAga1BpZEZpZWxkTnVtYmVyID0gNCwK
KyAgICBrTWVtb3J5QWRkcmVzc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrTWVtb3J5U2l6ZUZpZWxk
TnVtYmVyID0gNiwKKyAgICBrQ2FsbGVySWlkRmllbGROdW1iZXIgPSA3LAorICAgIGtBbGxvY2F0
aW9uU2NvcGVGaWVsZE51bWJlciA9IDgsCisgICAga0Fubm90YXRpb25zRmllbGROdW1iZXIgPSA5
LAorICAgIGtEZXZpY2VGaWVsZE51bWJlciA9IDE2LAorICAgIGtEZXZpY2VNZW1vcnlGaWVsZE51
bWJlciA9IDE3LAorICAgIGtNZW1vcnlUeXBlRmllbGROdW1iZXIgPSAxOCwKKyAgICBrSGVhcEZp
ZWxkTnVtYmVyID0gMTksCisgICAga09iamVjdEhhbmRsZUZpZWxkTnVtYmVyID0gMjAsCisgIH07
CisgIHVzaW5nIFNvdXJjZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpWdWxrYW5NZW1v
cnlFdmVudF9Tb3VyY2U7CisgIHVzaW5nIE9wZXJhdGlvbiA9IDo6cGVyZmV0dG86OnByb3Rvczo6
cGJ6ZXJvOjpWdWxrYW5NZW1vcnlFdmVudF9PcGVyYXRpb247CisgIHVzaW5nIEFsbG9jYXRpb25T
Y29wZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpWdWxrYW5NZW1vcnlFdmVudF9BbGxv
Y2F0aW9uU2NvcGU7CisgIHN0YXRpYyBjb25zdCBTb3VyY2UgU09VUkNFX1VOU1BFQ0lGSUVEID0g
VnVsa2FuTWVtb3J5RXZlbnRfU291cmNlX1NPVVJDRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNv
bnN0IFNvdXJjZSBTT1VSQ0VfRFJJVkVSID0gVnVsa2FuTWVtb3J5RXZlbnRfU291cmNlX1NPVVJD
RV9EUklWRVI7CisgIHN0YXRpYyBjb25zdCBTb3VyY2UgU09VUkNFX0RFVklDRSA9IFZ1bGthbk1l
bW9yeUV2ZW50X1NvdXJjZV9TT1VSQ0VfREVWSUNFOworICBzdGF0aWMgY29uc3QgU291cmNlIFNP
VVJDRV9ERVZJQ0VfTUVNT1JZID0gVnVsa2FuTWVtb3J5RXZlbnRfU291cmNlX1NPVVJDRV9ERVZJ
Q0VfTUVNT1JZOworICBzdGF0aWMgY29uc3QgU291cmNlIFNPVVJDRV9CVUZGRVIgPSBWdWxrYW5N
ZW1vcnlFdmVudF9Tb3VyY2VfU09VUkNFX0JVRkZFUjsKKyAgc3RhdGljIGNvbnN0IFNvdXJjZSBT
T1VSQ0VfSU1BR0UgPSBWdWxrYW5NZW1vcnlFdmVudF9Tb3VyY2VfU09VUkNFX0lNQUdFOworICBz
dGF0aWMgY29uc3QgT3BlcmF0aW9uIE9QX1VOU1BFQ0lGSUVEID0gVnVsa2FuTWVtb3J5RXZlbnRf
T3BlcmF0aW9uX09QX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgT3BlcmF0aW9uIE9QX0NS
RUFURSA9IFZ1bGthbk1lbW9yeUV2ZW50X09wZXJhdGlvbl9PUF9DUkVBVEU7CisgIHN0YXRpYyBj
b25zdCBPcGVyYXRpb24gT1BfREVTVFJPWSA9IFZ1bGthbk1lbW9yeUV2ZW50X09wZXJhdGlvbl9P
UF9ERVNUUk9ZOworICBzdGF0aWMgY29uc3QgT3BlcmF0aW9uIE9QX0JJTkQgPSBWdWxrYW5NZW1v
cnlFdmVudF9PcGVyYXRpb25fT1BfQklORDsKKyAgc3RhdGljIGNvbnN0IE9wZXJhdGlvbiBPUF9E
RVNUUk9ZX0JPVU5EID0gVnVsa2FuTWVtb3J5RXZlbnRfT3BlcmF0aW9uX09QX0RFU1RST1lfQk9V
TkQ7CisgIHN0YXRpYyBjb25zdCBPcGVyYXRpb24gT1BfQU5OT1RBVElPTlMgPSBWdWxrYW5NZW1v
cnlFdmVudF9PcGVyYXRpb25fT1BfQU5OT1RBVElPTlM7CisgIHN0YXRpYyBjb25zdCBBbGxvY2F0
aW9uU2NvcGUgU0NPUEVfVU5TUEVDSUZJRUQgPSBWdWxrYW5NZW1vcnlFdmVudF9BbGxvY2F0aW9u
U2NvcGVfU0NPUEVfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBBbGxvY2F0aW9uU2NvcGUg
U0NPUEVfQ09NTUFORCA9IFZ1bGthbk1lbW9yeUV2ZW50X0FsbG9jYXRpb25TY29wZV9TQ09QRV9D
T01NQU5EOworICBzdGF0aWMgY29uc3QgQWxsb2NhdGlvblNjb3BlIFNDT1BFX09CSkVDVCA9IFZ1
bGthbk1lbW9yeUV2ZW50X0FsbG9jYXRpb25TY29wZV9TQ09QRV9PQkpFQ1Q7CisgIHN0YXRpYyBj
b25zdCBBbGxvY2F0aW9uU2NvcGUgU0NPUEVfQ0FDSEUgPSBWdWxrYW5NZW1vcnlFdmVudF9BbGxv
Y2F0aW9uU2NvcGVfU0NPUEVfQ0FDSEU7CisgIHN0YXRpYyBjb25zdCBBbGxvY2F0aW9uU2NvcGUg
U0NPUEVfREVWSUNFID0gVnVsa2FuTWVtb3J5RXZlbnRfQWxsb2NhdGlvblNjb3BlX1NDT1BFX0RF
VklDRTsKKyAgc3RhdGljIGNvbnN0IEFsbG9jYXRpb25TY29wZSBTQ09QRV9JTlNUQU5DRSA9IFZ1
bGthbk1lbW9yeUV2ZW50X0FsbG9jYXRpb25TY29wZV9TQ09QRV9JTlNUQU5DRTsKKyAgdm9pZCBz
ZXRfc291cmNlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpWdWxrYW5NZW1vcnlFdmVudF9T
b3VyY2UgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9vcGVyYXRpb24oOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlZ1bGthbk1lbW9y
eUV2ZW50X09wZXJhdGlvbiB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3RpbWVzdGFtcChpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9waWQodWludDMyX3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21lbW9yeV9hZGRy
ZXNzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kRml4ZWQoNSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X21lbW9yeV9zaXplKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jYWxsZXJfaWlkKHVpbnQ2NF90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9hbGxvY2F0aW9u
X3Njb3BlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpWdWxrYW5NZW1vcnlFdmVudF9BbGxv
Y2F0aW9uU2NvcGUgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDgsIHZhbHVlKTsKKyAg
fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFZ1bGthbk1lbW9yeUV2ZW50QW5ub3RhdGlvbj4g
VCogYWRkX2Fubm90YXRpb25zKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
OSk7CisgIH0KKworICB2b2lkIHNldF9kZXZpY2UodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRGaXhlZCgxNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RldmljZV9tZW1vcnkodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRGaXhlZCgxNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X21lbW9yeV90eXBlKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE4LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaGVhcCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X29iamVjdF9oYW5kbGUodWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRGaXhlZCgyMCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBW
dWxrYW5NZW1vcnlFdmVudEFubm90YXRpb25fRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6
VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQ
RUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFZ1bGthbk1lbW9yeUV2ZW50QW5u
b3RhdGlvbl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQ
cm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBWdWxrYW5NZW1vcnlFdmVudEFu
bm90YXRpb25fRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBWdWxrYW5NZW1vcnlFdmVudEFubm90YXRpb25fRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfa2V5X2lpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBrZXlfaWlkKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pbnRfdmFsdWUoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBpbnRfdmFsdWUoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfZG91YmxlX3ZhbHVlKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGRvdWJsZSBkb3VibGVfdmFsdWUoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLmFzX2RvdWJsZSgpOyB9CisgIGJvb2wgaGFzX3N0cmluZ19p
aWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgc3RyaW5n
X2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNz
IFZ1bGthbk1lbW9yeUV2ZW50QW5ub3RhdGlvbiA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVnVsa2FuTWVtb3J5RXZlbnRBbm5vdGF0
aW9uX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrS2V5SWlkRmllbGROdW1iZXIg
PSAxLAorICAgIGtJbnRWYWx1ZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrRG91YmxlVmFsdWVGaWVs
ZE51bWJlciA9IDMsCisgICAga1N0cmluZ0lpZEZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9p
ZCBzZXRfa2V5X2lpZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW50X3ZhbHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RvdWJsZV92YWx1ZShkb3VibGUg
dmFsdWUpIHsKKyAgICBBcHBlbmRGaXhlZCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3Ry
aW5nX2lpZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7Cisg
IH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFj
ZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBo
ZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvcHJvZmlsaW5nL2hlYXBfZ3JhcGgucGJ6
ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4u
IERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
VFJBQ0VfUFJPRklMSU5HX0hFQVBfR1JBUEhfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9QUk9GSUxJTkdfSEVBUF9HUkFQSF9QUk9UT19IXwor
CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191
dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1l
c3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgSGVhcEdyYXBoT2JqZWN0OworY2xhc3MgSGVhcEdyYXBo
Um9vdDsKK2NsYXNzIEhlYXBHcmFwaFR5cGU7CitjbGFzcyBJbnRlcm5lZFN0cmluZzsKK2NsYXNz
IE9iZnVzY2F0ZWRDbGFzczsKK2NsYXNzIE9iZnVzY2F0ZWRNZW1iZXI7CitlbnVtIEhlYXBHcmFw
aFJvb3RfVHlwZSA6IGludDMyX3Q7CisKK2VudW0gSGVhcEdyYXBoUm9vdF9UeXBlIDogaW50MzJf
dCB7CisgIEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX1VOS05PV04gPSAwLAorICBIZWFwR3JhcGhS
b290X1R5cGVfUk9PVF9KTklfR0xPQkFMID0gMSwKKyAgSGVhcEdyYXBoUm9vdF9UeXBlX1JPT1Rf
Sk5JX0xPQ0FMID0gMiwKKyAgSGVhcEdyYXBoUm9vdF9UeXBlX1JPT1RfSkFWQV9GUkFNRSA9IDMs
CisgIEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX05BVElWRV9TVEFDSyA9IDQsCisgIEhlYXBHcmFw
aFJvb3RfVHlwZV9ST09UX1NUSUNLWV9DTEFTUyA9IDUsCisgIEhlYXBHcmFwaFJvb3RfVHlwZV9S
T09UX1RIUkVBRF9CTE9DSyA9IDYsCisgIEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX01PTklUT1Jf
VVNFRCA9IDcsCisgIEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX1RIUkVBRF9PQkpFQ1QgPSA4LAor
ICBIZWFwR3JhcGhSb290X1R5cGVfUk9PVF9JTlRFUk5FRF9TVFJJTkcgPSA5LAorICBIZWFwR3Jh
cGhSb290X1R5cGVfUk9PVF9GSU5BTElaSU5HID0gMTAsCisgIEhlYXBHcmFwaFJvb3RfVHlwZV9S
T09UX0RFQlVHR0VSID0gMTEsCisgIEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX1JFRkVSRU5DRV9D
TEVBTlVQID0gMTIsCisgIEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX1ZNX0lOVEVSTkFMID0gMTMs
CisgIEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX0pOSV9NT05JVE9SID0gMTQsCit9OworCitjb25z
dCBIZWFwR3JhcGhSb290X1R5cGUgSGVhcEdyYXBoUm9vdF9UeXBlX01JTiA9IEhlYXBHcmFwaFJv
b3RfVHlwZV9ST09UX1VOS05PV047Citjb25zdCBIZWFwR3JhcGhSb290X1R5cGUgSGVhcEdyYXBo
Um9vdF9UeXBlX01BWCA9IEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX0pOSV9NT05JVE9SOworCitj
bGFzcyBIZWFwR3JhcGhfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0Rl
Y29kZXI8LypNQVhfRklFTERfSUQ9Ki85LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERT
PSovdHJ1ZT4geworIHB1YmxpYzoKKyAgSGVhcEdyYXBoX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IEhlYXBHcmFwaF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEhlYXBHcmFwaF9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlk
KCk7IH0KKyAgaW50MzJfdCBwaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7
IH0KKyAgYm9vbCBoYXNfb2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzPiBvYmplY3RzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86
OkNvbnN0Qnl0ZXM+KDIpOyB9CisgIGJvb2wgaGFzX3Jvb3RzKCkgY29uc3QgeyByZXR1cm4gYXQ8
Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpw
cm90b3plcm86OkNvbnN0Qnl0ZXM+IHJvb3RzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDcpOyB9CisgIGJvb2wgaGFzX3R5cGVzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxk
SXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IHR5cGVzKCkgY29uc3QgeyByZXR1cm4g
R2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDkpOyB9CisgIGJvb2wgaGFzX3R5
cGVfbmFtZXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gdHlwZV9u
YW1lcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
PigzKTsgfQorICBib29sIGhhc19maWVsZF9uYW1lcygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCku
dmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPiBmaWVsZF9uYW1lcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVk
PDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig0KTsgfQorICBib29sIGhhc19sb2NhdGlvbl9uYW1l
cygpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVw
ZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBsb2NhdGlvbl9uYW1l
cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig4
KTsgfQorICBib29sIGhhc19jb250aW51ZWQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlk
KCk7IH0KKyAgYm9vbCBjb250aW51ZWQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2Jvb2wo
KTsgfQorICBib29sIGhhc19pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsg
fQorICB1aW50NjRfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDY0KCk7
IH0KK307CisKK2NsYXNzIEhlYXBHcmFwaCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gSGVhcEdyYXBoX0RlY29kZXI7CisgIGVudW0g
OiBpbnQzMl90IHsKKyAgICBrUGlkRmllbGROdW1iZXIgPSAxLAorICAgIGtPYmplY3RzRmllbGRO
dW1iZXIgPSAyLAorICAgIGtSb290c0ZpZWxkTnVtYmVyID0gNywKKyAgICBrVHlwZXNGaWVsZE51
bWJlciA9IDksCisgICAga1R5cGVOYW1lc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrRmllbGROYW1l
c0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrTG9jYXRpb25OYW1lc0ZpZWxkTnVtYmVyID0gOCwKKyAg
ICBrQ29udGludWVkRmllbGROdW1iZXIgPSA1LAorICAgIGtJbmRleEZpZWxkTnVtYmVyID0gNiwK
KyAgfTsKKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MSwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSGVhcEdyYXBoT2JqZWN0
PiBUKiBhZGRfb2JqZWN0cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBIZWFwR3JhcGhSb290PiBUKiBhZGRf
cm9vdHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig3KTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSGVhcEdyYXBoVHlwZT4gVCogYWRkX3R5cGVzKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oOSk7CisgIH0KKworICB0ZW1wbGF0ZSA8
dHlwZW5hbWUgVCA9IEludGVybmVkU3RyaW5nPiBUKiBhZGRfdHlwZV9uYW1lcygpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBJbnRlcm5lZFN0cmluZz4gVCogYWRkX2ZpZWxkX25hbWVzKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IEludGVybmVkU3RyaW5nPiBUKiBhZGRfbG9jYXRpb25fbmFtZXMoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPig4KTsKKyAgfQorCisgIHZvaWQgc2V0X2NvbnRpbnVlZChi
b29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfaW5kZXgodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUp
OworICB9Cit9OworCitjbGFzcyBIZWFwR3JhcGhPYmplY3RfRGVjb2RlciA6IHB1YmxpYyA6OnBy
b3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki81LCAvKkhBU19OT05Q
QUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEhlYXBHcmFwaE9i
amVjdF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90
b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBIZWFwR3JhcGhPYmplY3RfRGVjb2Rl
cihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBs
aWNpdCBIZWFwR3JhcGhPYmplY3RfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
aWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3R5
cGVfaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdHlw
ZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
c2VsZl9zaXplKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IHNlbGZfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfcmVmZXJlbmNlX2ZpZWxkX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3pl
cm86OnByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50LCB1aW50NjRfdD4gcmVmZXJl
bmNlX2ZpZWxkX2lkKGJvb2wqIHBhcnNlX2Vycm9yX3B0cikgY29uc3QgeyByZXR1cm4gR2V0UGFj
a2VkUmVwZWF0ZWQ8Ojpwcm90b3plcm86OnByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFy
SW50LCB1aW50NjRfdD4oNCwgcGFyc2VfZXJyb3JfcHRyKTsgfQorICBib29sIGhhc19yZWZlcmVu
Y2Vfb2JqZWN0X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OnByb3RvX3V0
aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50LCB1aW50NjRfdD4gcmVmZXJlbmNlX29iamVjdF9p
ZChib29sKiBwYXJzZV9lcnJvcl9wdHIpIGNvbnN0IHsgcmV0dXJuIEdldFBhY2tlZFJlcGVhdGVk
PDo6cHJvdG96ZXJvOjpwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCwgdWludDY0
X3Q+KDUsIHBhcnNlX2Vycm9yX3B0cik7IH0KK307CisKK2NsYXNzIEhlYXBHcmFwaE9iamVjdCA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gSGVhcEdyYXBoT2JqZWN0X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrSWRG
aWVsZE51bWJlciA9IDEsCisgICAga1R5cGVJZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2VsZlNp
emVGaWVsZE51bWJlciA9IDMsCisgICAga1JlZmVyZW5jZUZpZWxkSWRGaWVsZE51bWJlciA9IDQs
CisgICAga1JlZmVyZW5jZU9iamVjdElkRmllbGROdW1iZXIgPSA1LAorICB9OworICB2b2lkIHNl
dF9pZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfdHlwZV9pZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VsZl9zaXplKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yZWZlcmVuY2VfZmll
bGRfaWQoY29uc3QgOjpwcm90b3plcm86OlBhY2tlZFZhckludCYgcGFja2VkX2J1ZmZlcikgewor
ICAgIEFwcGVuZEJ5dGVzKDQsIHBhY2tlZF9idWZmZXIuZGF0YSgpLCBwYWNrZWRfYnVmZmVyLnNp
emUoKSk7CisgIH0KKyAgdm9pZCBzZXRfcmVmZXJlbmNlX29iamVjdF9pZChjb25zdCA6OnByb3Rv
emVybzo6UGFja2VkVmFySW50JiBwYWNrZWRfYnVmZmVyKSB7CisgICAgQXBwZW5kQnl0ZXMoNSwg
cGFja2VkX2J1ZmZlci5kYXRhKCksIHBhY2tlZF9idWZmZXIuc2l6ZSgpKTsKKyAgfQorfTsKKwor
Y2xhc3MgSGVhcEdyYXBoVHlwZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgSGVhcEdyYXBoVHlwZV9EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBIZWFwR3JhcGhUeXBlX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSGVhcEdyYXBoVHlwZV9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19pZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbG9jYXRpb25faWQoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbG9jYXRpb25faWQoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2NsYXNzX25hbWUoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hh
cnMgY2xhc3NfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfc3RyaW5nKCk7IH0KK307
CisKK2NsYXNzIEhlYXBHcmFwaFR5cGUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEhlYXBHcmFwaFR5cGVfRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtJZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTG9jYXRpb25JZEZp
ZWxkTnVtYmVyID0gMiwKKyAgICBrQ2xhc3NOYW1lRmllbGROdW1iZXIgPSAzLAorICB9OworICB2
b2lkIHNldF9pZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfbG9jYXRpb25faWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NsYXNzX25hbWUoY29uc3Qgc3Rk
OjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1
ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2NsYXNzX25hbWUoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorfTsK
KworY2xhc3MgSGVhcEdyYXBoUm9vdF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgSGVhcEdyYXBoUm9vdF9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBIZWFwR3JhcGhSb290X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJp
bmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4
X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSGVhcEdyYXBoUm9v
dF9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19vYmplY3RfaWRzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpQYWNrZWRS
ZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OnByb3RvX3V0aWxzOjpQcm90b1dpcmVU
eXBlOjprVmFySW50LCB1aW50NjRfdD4gb2JqZWN0X2lkcyhib29sKiBwYXJzZV9lcnJvcl9wdHIp
IGNvbnN0IHsgcmV0dXJuIEdldFBhY2tlZFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpwcm90b191dGls
czo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCwgdWludDY0X3Q+KDEsIHBhcnNlX2Vycm9yX3B0cik7
IH0KKyAgYm9vbCBoYXNfcm9vdF90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIGludDMyX3Qgcm9vdF90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQz
MigpOyB9Cit9OworCitjbGFzcyBIZWFwR3JhcGhSb290IDogcHVibGljIDo6cHJvdG96ZXJvOjpN
ZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBIZWFwR3JhcGhSb290X0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrT2JqZWN0SWRzRmllbGROdW1iZXIgPSAxLAor
ICAgIGtSb290VHlwZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdXNpbmcgVHlwZSA9IDo6cGVy
ZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpIZWFwR3JhcGhSb290X1R5cGU7CisgIHN0YXRpYyBjb25z
dCBUeXBlIFJPT1RfVU5LTk9XTiA9IEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX1VOS05PV047Cisg
IHN0YXRpYyBjb25zdCBUeXBlIFJPT1RfSk5JX0dMT0JBTCA9IEhlYXBHcmFwaFJvb3RfVHlwZV9S
T09UX0pOSV9HTE9CQUw7CisgIHN0YXRpYyBjb25zdCBUeXBlIFJPT1RfSk5JX0xPQ0FMID0gSGVh
cEdyYXBoUm9vdF9UeXBlX1JPT1RfSk5JX0xPQ0FMOworICBzdGF0aWMgY29uc3QgVHlwZSBST09U
X0pBVkFfRlJBTUUgPSBIZWFwR3JhcGhSb290X1R5cGVfUk9PVF9KQVZBX0ZSQU1FOworICBzdGF0
aWMgY29uc3QgVHlwZSBST09UX05BVElWRV9TVEFDSyA9IEhlYXBHcmFwaFJvb3RfVHlwZV9ST09U
X05BVElWRV9TVEFDSzsKKyAgc3RhdGljIGNvbnN0IFR5cGUgUk9PVF9TVElDS1lfQ0xBU1MgPSBI
ZWFwR3JhcGhSb290X1R5cGVfUk9PVF9TVElDS1lfQ0xBU1M7CisgIHN0YXRpYyBjb25zdCBUeXBl
IFJPT1RfVEhSRUFEX0JMT0NLID0gSGVhcEdyYXBoUm9vdF9UeXBlX1JPT1RfVEhSRUFEX0JMT0NL
OworICBzdGF0aWMgY29uc3QgVHlwZSBST09UX01PTklUT1JfVVNFRCA9IEhlYXBHcmFwaFJvb3Rf
VHlwZV9ST09UX01PTklUT1JfVVNFRDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgUk9PVF9USFJFQURf
T0JKRUNUID0gSGVhcEdyYXBoUm9vdF9UeXBlX1JPT1RfVEhSRUFEX09CSkVDVDsKKyAgc3RhdGlj
IGNvbnN0IFR5cGUgUk9PVF9JTlRFUk5FRF9TVFJJTkcgPSBIZWFwR3JhcGhSb290X1R5cGVfUk9P
VF9JTlRFUk5FRF9TVFJJTkc7CisgIHN0YXRpYyBjb25zdCBUeXBlIFJPT1RfRklOQUxJWklORyA9
IEhlYXBHcmFwaFJvb3RfVHlwZV9ST09UX0ZJTkFMSVpJTkc7CisgIHN0YXRpYyBjb25zdCBUeXBl
IFJPT1RfREVCVUdHRVIgPSBIZWFwR3JhcGhSb290X1R5cGVfUk9PVF9ERUJVR0dFUjsKKyAgc3Rh
dGljIGNvbnN0IFR5cGUgUk9PVF9SRUZFUkVOQ0VfQ0xFQU5VUCA9IEhlYXBHcmFwaFJvb3RfVHlw
ZV9ST09UX1JFRkVSRU5DRV9DTEVBTlVQOworICBzdGF0aWMgY29uc3QgVHlwZSBST09UX1ZNX0lO
VEVSTkFMID0gSGVhcEdyYXBoUm9vdF9UeXBlX1JPT1RfVk1fSU5URVJOQUw7CisgIHN0YXRpYyBj
b25zdCBUeXBlIFJPT1RfSk5JX01PTklUT1IgPSBIZWFwR3JhcGhSb290X1R5cGVfUk9PVF9KTklf
TU9OSVRPUjsKKyAgdm9pZCBzZXRfb2JqZWN0X2lkcyhjb25zdCA6OnByb3RvemVybzo6UGFja2Vk
VmFySW50JiBwYWNrZWRfYnVmZmVyKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgcGFja2VkX2J1ZmZl
ci5kYXRhKCksIHBhY2tlZF9idWZmZXIuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9yb290X3R5
cGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkhlYXBHcmFwaFJvb3RfVHlwZSB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBEZW9i
ZnVzY2F0aW9uTWFwcGluZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki90cnVlPiB7CisgcHVibGljOgorICBEZW9iZnVzY2F0aW9uTWFwcGluZ19EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBEZW9iZnVzY2F0aW9uTWFwcGluZ19EZWNvZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IERlb2Jm
dXNjYXRpb25NYXBwaW5nX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJh
dykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFz
X3BhY2thZ2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RDaGFycyBwYWNrYWdlX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3ZlcnNpb25fY29kZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHZlcnNpb25fY29kZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19vYmZ1c2NhdGVkX2NsYXNzZXMo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gb2JmdXNjYXRlZF9jbGFz
c2VzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+
KDMpOyB9Cit9OworCitjbGFzcyBEZW9iZnVzY2F0aW9uTWFwcGluZyA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gRGVvYmZ1c2NhdGlv
bk1hcHBpbmdfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQYWNrYWdlTmFtZUZp
ZWxkTnVtYmVyID0gMSwKKyAgICBrVmVyc2lvbkNvZGVGaWVsZE51bWJlciA9IDIsCisgICAga09i
ZnVzY2F0ZWRDbGFzc2VzRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9wYWNrYWdl
X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3BhY2thZ2VfbmFtZShj
b25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEs
IHNpemUpOworICB9CisgIHZvaWQgc2V0X3ZlcnNpb25fY29kZShpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IE9iZnVzY2F0ZWRDbGFzcz4gVCogYWRkX29iZnVzY2F0ZWRfY2xhc3NlcygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMpOworICB9CisKK307CisKK2NsYXNzIE9iZnVzY2F0
ZWRDbGFzc19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVl
PiB7CisgcHVibGljOgorICBPYmZ1c2NhdGVkQ2xhc3NfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgT2JmdXNjYXRlZENsYXNzX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgT2JmdXNjYXRlZENsYXNzX0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX29iZnVzY2F0ZWRfbmFtZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBv
YmZ1c2NhdGVkX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9Cisg
IGJvb2wgaGFzX2Rlb2JmdXNjYXRlZF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGRlb2JmdXNjYXRlZF9uYW1lKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19vYmZ1c2NhdGVk
X21lbWJlcnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gb2JmdXNj
YXRlZF9tZW1iZXJzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+KDMpOyB9Cit9OworCitjbGFzcyBPYmZ1c2NhdGVkQ2xhc3MgOiBwdWJsaWMgOjpw
cm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IE9iZnVzY2F0
ZWRDbGFzc19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga09iZnVzY2F0ZWROYW1l
RmllbGROdW1iZXIgPSAxLAorICAgIGtEZW9iZnVzY2F0ZWROYW1lRmllbGROdW1iZXIgPSAyLAor
ICAgIGtPYmZ1c2NhdGVkTWVtYmVyc0ZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRf
b2JmdXNjYXRlZF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9vYmZ1
c2NhdGVkX25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRC
eXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9kZW9iZnVzY2F0ZWRfbmFtZShj
b25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRh
KCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfZGVvYmZ1c2NhdGVkX25hbWUoY29u
c3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBz
aXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IE9iZnVzY2F0ZWRNZW1iZXI+IFQq
IGFkZF9vYmZ1c2NhdGVkX21lbWJlcnMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigzKTsKKyAgfQorCit9OworCitjbGFzcyBPYmZ1c2NhdGVkTWVtYmVyX0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwg
LypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBP
YmZ1c2NhdGVkTWVtYmVyX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IE9iZnVzY2F0ZWRN
ZW1iZXJfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBPYmZ1c2NhdGVkTWVtYmVyX0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX29iZnVzY2F0ZWRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBvYmZ1c2NhdGVkX25hbWUo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2Rlb2Jm
dXNjYXRlZF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdENoYXJzIGRlb2JmdXNjYXRlZF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgT2JmdXNjYXRlZE1lbWJlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gT2Jm
dXNjYXRlZE1lbWJlcl9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga09iZnVzY2F0
ZWROYW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtEZW9iZnVzY2F0ZWROYW1lRmllbGROdW1iZXIg
PSAyLAorICB9OworICB2b2lkIHNldF9vYmZ1c2NhdGVkX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgc2V0X29iZnVzY2F0ZWRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQg
c2V0X2Rlb2JmdXNjYXRlZF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNl
dF9kZW9iZnVzY2F0ZWRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAg
IEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4K
K30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3Vh
cmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRv
L3RyYWNlL3Byb2ZpbGluZy9wcm9maWxlX2NvbW1vbi5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRl
ZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5k
ZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9QUk9GSUxJTkdfUFJPRklM
RV9DT01NT05fUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9QUk9GSUxJTkdfUFJPRklMRV9DT01NT05fUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0
ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBl
YXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFt
ZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7
CisKK2NsYXNzIEFkZHJlc3NTeW1ib2xzOworY2xhc3MgTGluZTsKKworY2xhc3MgQ2FsbHN0YWNr
X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJ
RUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBw
dWJsaWM6CisgIENhbGxzdGFja19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDYWxsc3Rh
Y2tfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBDYWxsc3RhY2tfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAg
Ym9vbCBoYXNfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfZnJhbWVfaWRzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8dWludDY0X3Q+IGZyYW1lX2lkcygpIGNvbnN0
IHsgcmV0dXJuIEdldFJlcGVhdGVkPHVpbnQ2NF90PigyKTsgfQorfTsKKworY2xhc3MgQ2FsbHN0
YWNrIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBDYWxsc3RhY2tfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtJaWRG
aWVsZE51bWJlciA9IDEsCisgICAga0ZyYW1lSWRzRmllbGROdW1iZXIgPSAyLAorICB9OworICB2
b2lkIHNldF9paWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUp
OworICB9CisgIHZvaWQgYWRkX2ZyYW1lX2lkcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgyLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIEZyYW1lX0RlY29kZXIgOiBwdWJs
aWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBGcmFt
ZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBGcmFtZV9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEZyYW1lX0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2lpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBpaWQoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Z1bmN0aW9uX25hbWVfaWQoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgZnVuY3Rpb25fbmFtZV9p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbWFw
cGluZ19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBt
YXBwaW5nX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19yZWxfcGMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgcmVsX3BjKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorfTsKKwor
Y2xhc3MgRnJhbWUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IEZyYW1lX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
SWlkRmllbGROdW1iZXIgPSAxLAorICAgIGtGdW5jdGlvbk5hbWVJZEZpZWxkTnVtYmVyID0gMiwK
KyAgICBrTWFwcGluZ0lkRmllbGROdW1iZXIgPSAzLAorICAgIGtSZWxQY0ZpZWxkTnVtYmVyID0g
NCwKKyAgfTsKKyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mdW5jdGlvbl9uYW1lX2lkKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9t
YXBwaW5nX2lkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9yZWxfcGModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoNCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBNYXBwaW5nX0RlY29kZXIgOiBwdWJsaWMg
Ojpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOCwgLypIQVNf
Tk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIE1hcHBpbmdf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgTWFwcGluZ19EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1hcHBpbmdf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaWlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfYnVpbGRfaWQoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgYnVpbGRfaWQoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2V4YWN0X29mZnNldCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBleGFjdF9vZmZzZXQo
KSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3N0YXJ0
X29mZnNldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBz
dGFydF9vZmZzZXQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJv
b2wgaGFzX3N0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIHVpbnQ2
NF90IHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19lbmQoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
ZW5kKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19s
b2FkX2JpYXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qg
bG9hZF9iaWFzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19wYXRoX3N0cmluZ19pZHMoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjx1aW50NjRfdD4gcGF0aF9zdHJp
bmdfaWRzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8dWludDY0X3Q+KDcpOyB9Cit9Owor
CitjbGFzcyBNYXBwaW5nIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBNYXBwaW5nX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsK
KyAgICBrSWlkRmllbGROdW1iZXIgPSAxLAorICAgIGtCdWlsZElkRmllbGROdW1iZXIgPSAyLAor
ICAgIGtFeGFjdE9mZnNldEZpZWxkTnVtYmVyID0gOCwKKyAgICBrU3RhcnRPZmZzZXRGaWVsZE51
bWJlciA9IDMsCisgICAga1N0YXJ0RmllbGROdW1iZXIgPSA0LAorICAgIGtFbmRGaWVsZE51bWJl
ciA9IDUsCisgICAga0xvYWRCaWFzRmllbGROdW1iZXIgPSA2LAorICAgIGtQYXRoU3RyaW5nSWRz
RmllbGROdW1iZXIgPSA3LAorICB9OworICB2b2lkIHNldF9paWQodWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2J1aWxkX2lkKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9leGFjdF9vZmZzZXQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N0YXJ0X29mZnNldCh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RhcnQodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2VuZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfbG9hZF9iaWFzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9wYXRoX3N0cmluZ19pZHModWludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBNb2R1
bGVTeW1ib2xzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3Ry
dWU+IHsKKyBwdWJsaWM6CisgIE1vZHVsZVN5bWJvbHNfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgTW9kdWxlU3ltYm9sc19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEo
KSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IE1vZHVsZVN5bWJvbHNfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBwYXRoKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19idWlsZF9pZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBi
dWlsZF9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBo
YXNfYWRkcmVzc19zeW1ib2xzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0
ZXM+IGFkZHJlc3Nfc3ltYm9scygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPigzKTsgfQorfTsKKworY2xhc3MgTW9kdWxlU3ltYm9scyA6IHB1Ymxp
YyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gTW9k
dWxlU3ltYm9sc19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1BhdGhGaWVsZE51
bWJlciA9IDEsCisgICAga0J1aWxkSWRGaWVsZE51bWJlciA9IDIsCisgICAga0FkZHJlc3NTeW1i
b2xzRmllbGROdW1iZXIgPSAzLAorICB9OworICB2b2lkIHNldF9wYXRoKGNvbnN0IHN0ZDo6c3Ry
aW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6
ZSgpKTsKKyAgfQorICB2b2lkIHNldF9wYXRoKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXpl
KSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfYnVp
bGRfaWQoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFs
dWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2J1aWxkX2lkKGNvbnN0
IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6
ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBBZGRyZXNzU3ltYm9scz4gVCogYWRk
X2FkZHJlc3Nfc3ltYm9scygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMp
OworICB9CisKK307CisKK2NsYXNzIEFkZHJlc3NTeW1ib2xzX0RlY29kZXIgOiBwdWJsaWMgOjpw
cm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9O
UEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIEFkZHJlc3NTeW1i
b2xzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEFkZHJlc3NTeW1ib2xzX0RlY29kZXIo
Y29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9j
YXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGlj
aXQgQWRkcmVzc1N5bWJvbHNfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBo
YXNfYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRf
dCBhZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19saW5lcygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBsaW5l
cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigy
KTsgfQorfTsKKworY2xhc3MgQWRkcmVzc1N5bWJvbHMgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEFkZHJlc3NTeW1ib2xzX0RlY29k
ZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrQWRkcmVzc0ZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrTGluZXNGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2FkZHJlc3ModWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gTGluZT4gVCogYWRkX2xpbmVzKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworfTsKKworY2xhc3MgTGluZV9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgTGlu
ZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBMaW5lX0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgTGluZV9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19mdW5jdGlvbl9uYW1lKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJz
IGZ1bmN0aW9uX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9Cisg
IGJvb2wgaGFzX3NvdXJjZV9maWxlX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgc291cmNlX2ZpbGVfbmFtZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfbGluZV9udW1iZXIo
KSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbGluZV9udW1i
ZXIoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9Cit9OworCitjbGFzcyBM
aW5lIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBMaW5lX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRnVuY3Rpb25O
YW1lRmllbGROdW1iZXIgPSAxLAorICAgIGtTb3VyY2VGaWxlTmFtZUZpZWxkTnVtYmVyID0gMiwK
KyAgICBrTGluZU51bWJlckZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfZnVuY3Rp
b25fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2
YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfZnVuY3Rpb25fbmFt
ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRh
dGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3NvdXJjZV9maWxlX25hbWUoY29uc3Qgc3RkOjpz
dHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5z
aXplKCkpOworICB9CisgIHZvaWQgc2V0X3NvdXJjZV9maWxlX25hbWUoY29uc3QgY2hhciogZGF0
YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQor
ICB2b2lkIHNldF9saW5lX251bWJlcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhcklu
dCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFByb2ZpbGVkRnJhbWVTeW1ib2xzX0RlY29k
ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lE
PSovNCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6
CisgIFByb2ZpbGVkRnJhbWVTeW1ib2xzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFBy
b2ZpbGVkRnJhbWVTeW1ib2xzX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgUHJvZmlsZWRGcmFtZVN5bWJvbHNfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfZnJhbWVfaWlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGZyYW1lX2lpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZnVuY3Rpb25fbmFtZV9p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVw
ZWF0ZWRGaWVsZEl0ZXJhdG9yPHVpbnQ2NF90PiBmdW5jdGlvbl9uYW1lX2lkKCkgY29uc3QgeyBy
ZXR1cm4gR2V0UmVwZWF0ZWQ8dWludDY0X3Q+KDIpOyB9CisgIGJvb2wgaGFzX2ZpbGVfbmFtZV9p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVw
ZWF0ZWRGaWVsZEl0ZXJhdG9yPHVpbnQ2NF90PiBmaWxlX25hbWVfaWQoKSBjb25zdCB7IHJldHVy
biBHZXRSZXBlYXRlZDx1aW50NjRfdD4oMyk7IH0KKyAgYm9vbCBoYXNfbGluZV9udW1iZXIoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjx1aW50MzJfdD4gbGluZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBHZXRS
ZXBlYXRlZDx1aW50MzJfdD4oNCk7IH0KK307CisKK2NsYXNzIFByb2ZpbGVkRnJhbWVTeW1ib2xz
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBQcm9maWxlZEZyYW1lU3ltYm9sc19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga0ZyYW1lSWlkRmllbGROdW1iZXIgPSAxLAorICAgIGtGdW5jdGlvbk5hbWVJZEZpZWxkTnVt
YmVyID0gMiwKKyAgICBrRmlsZU5hbWVJZEZpZWxkTnVtYmVyID0gMywKKyAgICBrTGluZU51bWJl
ckZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfZnJhbWVfaWlkKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9mdW5j
dGlvbl9uYW1lX2lkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorICB2b2lkIGFkZF9maWxlX25hbWVfaWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgYWRkX2xpbmVfbnVtYmVyKHVpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorfTsKKworY2xh
c3MgSW50ZXJuZWRTdHJpbmdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklF
TERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEludGVybmVkU3RyaW5nX0RlY29kZXIoY29uc3Qg
dWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4p
IHt9CisgIGV4cGxpY2l0IEludGVybmVkU3RyaW5nX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgSW50ZXJuZWRTdHJpbmdf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaWlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc3RyKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHN0cigpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfYnl0ZXMoKTsgfQorfTsKKworY2xhc3MgSW50ZXJuZWRTdHJp
bmcgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVj
b2RlciA9IEludGVybmVkU3RyaW5nX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
SWlkRmllbGROdW1iZXIgPSAxLAorICAgIGtTdHJGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZv
aWQgc2V0X2lpZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfc3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNl
dF9zdHIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRl
cygyLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9wcm9m
aWxpbmcvcHJvZmlsZV9wYWNrZXQucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFBy
b3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRP
X1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfUFJPRklMSU5HX1BST0ZJTEVfUEFDS0VUX1BS
T1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfUFJP
RklMSU5HX1BST0ZJTEVfUEFDS0VUX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNp
bmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRz
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJm
ZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBD
YWxsc3RhY2s7CitjbGFzcyBGcmFtZTsKK2NsYXNzIEludGVybmVkU3RyaW5nOworY2xhc3MgTWFw
cGluZzsKK2NsYXNzIFByb2ZpbGVQYWNrZXRfSGVhcFNhbXBsZTsKK2NsYXNzIFByb2ZpbGVQYWNr
ZXRfSGlzdG9ncmFtOworY2xhc3MgUHJvZmlsZVBhY2tldF9IaXN0b2dyYW1fQnVja2V0OworY2xh
c3MgUHJvZmlsZVBhY2tldF9Qcm9jZXNzSGVhcFNhbXBsZXM7CitjbGFzcyBQcm9maWxlUGFja2V0
X1Byb2Nlc3NTdGF0czsKK2VudW0gUGVyZlNhbXBsZV9TYW1wbGVTa2lwUmVhc29uIDogaW50MzJf
dDsKK2VudW0gUHJvZmlsaW5nX0NwdU1vZGUgOiBpbnQzMl90OworZW51bSBQcm9maWxpbmdfU3Rh
Y2tVbndpbmRFcnJvciA6IGludDMyX3Q7CisKK2VudW0gUGVyZlNhbXBsZV9TYW1wbGVTa2lwUmVh
c29uIDogaW50MzJfdCB7CisgIFBlcmZTYW1wbGVfU2FtcGxlU2tpcFJlYXNvbl9QUk9GSUxFUl9T
S0lQX1VOS05PV04gPSAwLAorICBQZXJmU2FtcGxlX1NhbXBsZVNraXBSZWFzb25fUFJPRklMRVJf
U0tJUF9SRUFEX1NUQUdFID0gMSwKKyAgUGVyZlNhbXBsZV9TYW1wbGVTa2lwUmVhc29uX1BST0ZJ
TEVSX1NLSVBfVU5XSU5EX1NUQUdFID0gMiwKKyAgUGVyZlNhbXBsZV9TYW1wbGVTa2lwUmVhc29u
X1BST0ZJTEVSX1NLSVBfVU5XSU5EX0VOUVVFVUUgPSAzLAorfTsKKworY29uc3QgUGVyZlNhbXBs
ZV9TYW1wbGVTa2lwUmVhc29uIFBlcmZTYW1wbGVfU2FtcGxlU2tpcFJlYXNvbl9NSU4gPSBQZXJm
U2FtcGxlX1NhbXBsZVNraXBSZWFzb25fUFJPRklMRVJfU0tJUF9VTktOT1dOOworY29uc3QgUGVy
ZlNhbXBsZV9TYW1wbGVTa2lwUmVhc29uIFBlcmZTYW1wbGVfU2FtcGxlU2tpcFJlYXNvbl9NQVgg
PSBQZXJmU2FtcGxlX1NhbXBsZVNraXBSZWFzb25fUFJPRklMRVJfU0tJUF9VTldJTkRfRU5RVUVV
RTsKKworZW51bSBQcm9maWxpbmdfQ3B1TW9kZSA6IGludDMyX3QgeworICBQcm9maWxpbmdfQ3B1
TW9kZV9NT0RFX1VOS05PV04gPSAwLAorICBQcm9maWxpbmdfQ3B1TW9kZV9NT0RFX0tFUk5FTCA9
IDEsCisgIFByb2ZpbGluZ19DcHVNb2RlX01PREVfVVNFUiA9IDIsCisgIFByb2ZpbGluZ19DcHVN
b2RlX01PREVfSFlQRVJWSVNPUiA9IDMsCisgIFByb2ZpbGluZ19DcHVNb2RlX01PREVfR1VFU1Rf
S0VSTkVMID0gNCwKKyAgUHJvZmlsaW5nX0NwdU1vZGVfTU9ERV9HVUVTVF9VU0VSID0gNSwKK307
CisKK2NvbnN0IFByb2ZpbGluZ19DcHVNb2RlIFByb2ZpbGluZ19DcHVNb2RlX01JTiA9IFByb2Zp
bGluZ19DcHVNb2RlX01PREVfVU5LTk9XTjsKK2NvbnN0IFByb2ZpbGluZ19DcHVNb2RlIFByb2Zp
bGluZ19DcHVNb2RlX01BWCA9IFByb2ZpbGluZ19DcHVNb2RlX01PREVfR1VFU1RfVVNFUjsKKwor
ZW51bSBQcm9maWxpbmdfU3RhY2tVbndpbmRFcnJvciA6IGludDMyX3QgeworICBQcm9maWxpbmdf
U3RhY2tVbndpbmRFcnJvcl9VTldJTkRfRVJST1JfVU5LTk9XTiA9IDAsCisgIFByb2ZpbGluZ19T
dGFja1Vud2luZEVycm9yX1VOV0lORF9FUlJPUl9OT05FID0gMSwKKyAgUHJvZmlsaW5nX1N0YWNr
VW53aW5kRXJyb3JfVU5XSU5EX0VSUk9SX01FTU9SWV9JTlZBTElEID0gMiwKKyAgUHJvZmlsaW5n
X1N0YWNrVW53aW5kRXJyb3JfVU5XSU5EX0VSUk9SX1VOV0lORF9JTkZPID0gMywKKyAgUHJvZmls
aW5nX1N0YWNrVW53aW5kRXJyb3JfVU5XSU5EX0VSUk9SX1VOU1VQUE9SVEVEID0gNCwKKyAgUHJv
ZmlsaW5nX1N0YWNrVW53aW5kRXJyb3JfVU5XSU5EX0VSUk9SX0lOVkFMSURfTUFQID0gNSwKKyAg
UHJvZmlsaW5nX1N0YWNrVW53aW5kRXJyb3JfVU5XSU5EX0VSUk9SX01BWF9GUkFNRVNfRVhDRUVE
RUQgPSA2LAorICBQcm9maWxpbmdfU3RhY2tVbndpbmRFcnJvcl9VTldJTkRfRVJST1JfUkVQRUFU
RURfRlJBTUUgPSA3LAorICBQcm9maWxpbmdfU3RhY2tVbndpbmRFcnJvcl9VTldJTkRfRVJST1Jf
SU5WQUxJRF9FTEYgPSA4LAorfTsKKworY29uc3QgUHJvZmlsaW5nX1N0YWNrVW53aW5kRXJyb3Ig
UHJvZmlsaW5nX1N0YWNrVW53aW5kRXJyb3JfTUlOID0gUHJvZmlsaW5nX1N0YWNrVW53aW5kRXJy
b3JfVU5XSU5EX0VSUk9SX1VOS05PV047Citjb25zdCBQcm9maWxpbmdfU3RhY2tVbndpbmRFcnJv
ciBQcm9maWxpbmdfU3RhY2tVbndpbmRFcnJvcl9NQVggPSBQcm9maWxpbmdfU3RhY2tVbndpbmRF
cnJvcl9VTldJTkRfRVJST1JfSU5WQUxJRF9FTEY7CisKK2NsYXNzIFBlcmZTYW1wbGVfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki8xOCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBQZXJmU2FtcGxlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFBlcmZTYW1wbGVf
RGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQor
ICBleHBsaWNpdCBQZXJmU2FtcGxlX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX2NwdSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBjcHUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFz
X3BpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBwaWQo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX3RpZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB0aWQoKSBjb25z
dCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2NwdV9tb2RlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgY3B1X21vZGUoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfY2FsbHN0YWNr
X2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjYWxs
c3RhY2tfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc191bndpbmRfZXJyb3IoKSBjb25zdCB7IHJldHVybiBhdDwxNj4oKS52YWxpZCgpOyB9Cisg
IGludDMyX3QgdW53aW5kX2Vycm9yKCkgY29uc3QgeyByZXR1cm4gYXQ8MTY+KCkuYXNfaW50MzIo
KTsgfQorICBib29sIGhhc19rZXJuZWxfcmVjb3Jkc19sb3N0KCkgY29uc3QgeyByZXR1cm4gYXQ8
MTc+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBrZXJuZWxfcmVjb3Jkc19sb3N0KCkgY29uc3Qg
eyByZXR1cm4gYXQ8MTc+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2FtcGxlX3NraXBw
ZWRfcmVhc29uKCkgY29uc3QgeyByZXR1cm4gYXQ8MTg+KCkudmFsaWQoKTsgfQorICBpbnQzMl90
IHNhbXBsZV9za2lwcGVkX3JlYXNvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDE4PigpLmFzX2ludDMy
KCk7IH0KK307CisKK2NsYXNzIFBlcmZTYW1wbGUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFBlcmZTYW1wbGVfRGVjb2RlcjsKKyAg
ZW51bSA6IGludDMyX3QgeworICAgIGtDcHVGaWVsZE51bWJlciA9IDEsCisgICAga1BpZEZpZWxk
TnVtYmVyID0gMiwKKyAgICBrVGlkRmllbGROdW1iZXIgPSAzLAorICAgIGtDcHVNb2RlRmllbGRO
dW1iZXIgPSA1LAorICAgIGtDYWxsc3RhY2tJaWRGaWVsZE51bWJlciA9IDQsCisgICAga1Vud2lu
ZEVycm9yRmllbGROdW1iZXIgPSAxNiwKKyAgICBrS2VybmVsUmVjb3Jkc0xvc3RGaWVsZE51bWJl
ciA9IDE3LAorICAgIGtTYW1wbGVTa2lwcGVkUmVhc29uRmllbGROdW1iZXIgPSAxOCwKKyAgfTsK
KyAgdXNpbmcgU2FtcGxlU2tpcFJlYXNvbiA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpQ
ZXJmU2FtcGxlX1NhbXBsZVNraXBSZWFzb247CisgIHN0YXRpYyBjb25zdCBTYW1wbGVTa2lwUmVh
c29uIFBST0ZJTEVSX1NLSVBfVU5LTk9XTiA9IFBlcmZTYW1wbGVfU2FtcGxlU2tpcFJlYXNvbl9Q
Uk9GSUxFUl9TS0lQX1VOS05PV047CisgIHN0YXRpYyBjb25zdCBTYW1wbGVTa2lwUmVhc29uIFBS
T0ZJTEVSX1NLSVBfUkVBRF9TVEFHRSA9IFBlcmZTYW1wbGVfU2FtcGxlU2tpcFJlYXNvbl9QUk9G
SUxFUl9TS0lQX1JFQURfU1RBR0U7CisgIHN0YXRpYyBjb25zdCBTYW1wbGVTa2lwUmVhc29uIFBS
T0ZJTEVSX1NLSVBfVU5XSU5EX1NUQUdFID0gUGVyZlNhbXBsZV9TYW1wbGVTa2lwUmVhc29uX1BS
T0ZJTEVSX1NLSVBfVU5XSU5EX1NUQUdFOworICBzdGF0aWMgY29uc3QgU2FtcGxlU2tpcFJlYXNv
biBQUk9GSUxFUl9TS0lQX1VOV0lORF9FTlFVRVVFID0gUGVyZlNhbXBsZV9TYW1wbGVTa2lwUmVh
c29uX1BST0ZJTEVSX1NLSVBfVU5XSU5EX0VOUVVFVUU7CisgIHZvaWQgc2V0X2NwdSh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
cGlkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF90aWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2NwdV9tb2RlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJv
OjpQcm9maWxpbmdfQ3B1TW9kZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X2NhbGxzdGFja19paWQodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Vud2luZF9lcnJvcig6
OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6UHJvZmlsaW5nX1N0YWNrVW53aW5kRXJyb3IgdmFs
dWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDE2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
a2VybmVsX3JlY29yZHNfbG9zdCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgx
NywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NhbXBsZV9za2lwcGVkX3JlYXNvbig6OnBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6UGVyZlNhbXBsZV9TYW1wbGVTa2lwUmVhc29uIHZhbHVlKSB7
CisgICAgQXBwZW5kVGlueVZhckludCgxOCwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBQcm9m
aWxpbmdfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypN
QVhfRklFTERfSUQ9Ki8wLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+
IHsKKyBwdWJsaWM6CisgIFByb2ZpbGluZ19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBQ
cm9maWxpbmdfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBQcm9maWxpbmdfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkg
e30KK307CisKK2NsYXNzIFByb2ZpbGluZyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUHJvZmlsaW5nX0RlY29kZXI7CisgIHVzaW5n
IENwdU1vZGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6UHJvZmlsaW5nX0NwdU1vZGU7
CisgIHVzaW5nIFN0YWNrVW53aW5kRXJyb3IgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6
UHJvZmlsaW5nX1N0YWNrVW53aW5kRXJyb3I7CisgIHN0YXRpYyBjb25zdCBDcHVNb2RlIE1PREVf
VU5LTk9XTiA9IFByb2ZpbGluZ19DcHVNb2RlX01PREVfVU5LTk9XTjsKKyAgc3RhdGljIGNvbnN0
IENwdU1vZGUgTU9ERV9LRVJORUwgPSBQcm9maWxpbmdfQ3B1TW9kZV9NT0RFX0tFUk5FTDsKKyAg
c3RhdGljIGNvbnN0IENwdU1vZGUgTU9ERV9VU0VSID0gUHJvZmlsaW5nX0NwdU1vZGVfTU9ERV9V
U0VSOworICBzdGF0aWMgY29uc3QgQ3B1TW9kZSBNT0RFX0hZUEVSVklTT1IgPSBQcm9maWxpbmdf
Q3B1TW9kZV9NT0RFX0hZUEVSVklTT1I7CisgIHN0YXRpYyBjb25zdCBDcHVNb2RlIE1PREVfR1VF
U1RfS0VSTkVMID0gUHJvZmlsaW5nX0NwdU1vZGVfTU9ERV9HVUVTVF9LRVJORUw7CisgIHN0YXRp
YyBjb25zdCBDcHVNb2RlIE1PREVfR1VFU1RfVVNFUiA9IFByb2ZpbGluZ19DcHVNb2RlX01PREVf
R1VFU1RfVVNFUjsKKyAgc3RhdGljIGNvbnN0IFN0YWNrVW53aW5kRXJyb3IgVU5XSU5EX0VSUk9S
X1VOS05PV04gPSBQcm9maWxpbmdfU3RhY2tVbndpbmRFcnJvcl9VTldJTkRfRVJST1JfVU5LTk9X
TjsKKyAgc3RhdGljIGNvbnN0IFN0YWNrVW53aW5kRXJyb3IgVU5XSU5EX0VSUk9SX05PTkUgPSBQ
cm9maWxpbmdfU3RhY2tVbndpbmRFcnJvcl9VTldJTkRfRVJST1JfTk9ORTsKKyAgc3RhdGljIGNv
bnN0IFN0YWNrVW53aW5kRXJyb3IgVU5XSU5EX0VSUk9SX01FTU9SWV9JTlZBTElEID0gUHJvZmls
aW5nX1N0YWNrVW53aW5kRXJyb3JfVU5XSU5EX0VSUk9SX01FTU9SWV9JTlZBTElEOworICBzdGF0
aWMgY29uc3QgU3RhY2tVbndpbmRFcnJvciBVTldJTkRfRVJST1JfVU5XSU5EX0lORk8gPSBQcm9m
aWxpbmdfU3RhY2tVbndpbmRFcnJvcl9VTldJTkRfRVJST1JfVU5XSU5EX0lORk87CisgIHN0YXRp
YyBjb25zdCBTdGFja1Vud2luZEVycm9yIFVOV0lORF9FUlJPUl9VTlNVUFBPUlRFRCA9IFByb2Zp
bGluZ19TdGFja1Vud2luZEVycm9yX1VOV0lORF9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgc3RhdGlj
IGNvbnN0IFN0YWNrVW53aW5kRXJyb3IgVU5XSU5EX0VSUk9SX0lOVkFMSURfTUFQID0gUHJvZmls
aW5nX1N0YWNrVW53aW5kRXJyb3JfVU5XSU5EX0VSUk9SX0lOVkFMSURfTUFQOworICBzdGF0aWMg
Y29uc3QgU3RhY2tVbndpbmRFcnJvciBVTldJTkRfRVJST1JfTUFYX0ZSQU1FU19FWENFRURFRCA9
IFByb2ZpbGluZ19TdGFja1Vud2luZEVycm9yX1VOV0lORF9FUlJPUl9NQVhfRlJBTUVTX0VYQ0VF
REVEOworICBzdGF0aWMgY29uc3QgU3RhY2tVbndpbmRFcnJvciBVTldJTkRfRVJST1JfUkVQRUFU
RURfRlJBTUUgPSBQcm9maWxpbmdfU3RhY2tVbndpbmRFcnJvcl9VTldJTkRfRVJST1JfUkVQRUFU
RURfRlJBTUU7CisgIHN0YXRpYyBjb25zdCBTdGFja1Vud2luZEVycm9yIFVOV0lORF9FUlJPUl9J
TlZBTElEX0VMRiA9IFByb2ZpbGluZ19TdGFja1Vud2luZEVycm9yX1VOV0lORF9FUlJPUl9JTlZB
TElEX0VMRjsKK307CisKK2NsYXNzIFN0cmVhbWluZ1Byb2ZpbGVQYWNrZXRfRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgU3Ry
ZWFtaW5nUHJvZmlsZVBhY2tldF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBTdHJlYW1p
bmdQcm9maWxlUGFja2V0X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwg
cmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU3RyZWFtaW5nUHJvZmlsZVBhY2tldF9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19jYWxsc3RhY2tfaWlkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxk
SXRlcmF0b3I8dWludDY0X3Q+IGNhbGxzdGFja19paWQoKSBjb25zdCB7IHJldHVybiBHZXRSZXBl
YXRlZDx1aW50NjRfdD4oMSk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1wX2RlbHRhX3VzKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZp
ZWxkSXRlcmF0b3I8aW50NjRfdD4gdGltZXN0YW1wX2RlbHRhX3VzKCkgY29uc3QgeyByZXR1cm4g
R2V0UmVwZWF0ZWQ8aW50NjRfdD4oMik7IH0KKyAgYm9vbCBoYXNfcHJvY2Vzc19wcmlvcml0eSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHByb2Nlc3NfcHJp
b3JpdHkoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNz
IFN0cmVhbWluZ1Byb2ZpbGVQYWNrZXQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFN0cmVhbWluZ1Byb2ZpbGVQYWNrZXRfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDYWxsc3RhY2tJaWRGaWVsZE51bWJlciA9IDEs
CisgICAga1RpbWVzdGFtcERlbHRhVXNGaWVsZE51bWJlciA9IDIsCisgICAga1Byb2Nlc3NQcmlv
cml0eUZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBhZGRfY2FsbHN0YWNrX2lpZCh1aW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBh
ZGRfdGltZXN0YW1wX2RlbHRhX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQo
MiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Byb2Nlc3NfcHJpb3JpdHkoaW50MzJfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFByb2Zp
bGVQYWNrZXRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8
LypNQVhfRklFTERfSUQ9Ki83LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1
ZT4geworIHB1YmxpYzoKKyAgUHJvZmlsZVBhY2tldF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBQcm9maWxlUGFja2V0X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgUHJvZmlsZVBhY2tldF9EZWNvZGVyKGNvbnN0
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRh
dGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19zdHJpbmdzKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpw
cm90b3plcm86OkNvbnN0Qnl0ZXM+IHN0cmluZ3MoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRl
ZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfbWFwcGluZ3MoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gbWFwcGluZ3MoKSBjb25zdCB7
IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNCk7IH0KKyAgYm9v
bCBoYXNfZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGZy
YW1lcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
PigyKTsgfQorICBib29sIGhhc19jYWxsc3RhY2tzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3pl
cm86OkNvbnN0Qnl0ZXM+IGNhbGxzdGFja3MoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMyk7IH0KKyAgYm9vbCBoYXNfcHJvY2Vzc19kdW1wcygp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0
ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBwcm9jZXNzX2R1bXBzKCkg
Y29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDUpOyB9
CisgIGJvb2wgaGFzX2NvbnRpbnVlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsg
fQorICBib29sIGNvbnRpbnVlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfYm9vbCgpOyB9
CisgIGJvb2wgaGFzX2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc191aW50NjQoKTsgfQor
fTsKKworY2xhc3MgUHJvZmlsZVBhY2tldCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUHJvZmlsZVBhY2tldF9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga1N0cmluZ3NGaWVsZE51bWJlciA9IDEsCisgICAga01hcHBp
bmdzRmllbGROdW1iZXIgPSA0LAorICAgIGtGcmFtZXNGaWVsZE51bWJlciA9IDIsCisgICAga0Nh
bGxzdGFja3NGaWVsZE51bWJlciA9IDMsCisgICAga1Byb2Nlc3NEdW1wc0ZpZWxkTnVtYmVyID0g
NSwKKyAgICBrQ29udGludWVkRmllbGROdW1iZXIgPSA2LAorICAgIGtJbmRleEZpZWxkTnVtYmVy
ID0gNywKKyAgfTsKKyAgdXNpbmcgSGVhcFNhbXBsZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6
ZXJvOjpQcm9maWxlUGFja2V0X0hlYXBTYW1wbGU7CisgIHVzaW5nIEhpc3RvZ3JhbSA9IDo6cGVy
ZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpQcm9maWxlUGFja2V0X0hpc3RvZ3JhbTsKKyAgdXNpbmcg
UHJvY2Vzc1N0YXRzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlByb2ZpbGVQYWNrZXRf
UHJvY2Vzc1N0YXRzOworICB1c2luZyBQcm9jZXNzSGVhcFNhbXBsZXMgPSA6OnBlcmZldHRvOjpw
cm90b3M6OnBiemVybzo6UHJvZmlsZVBhY2tldF9Qcm9jZXNzSGVhcFNhbXBsZXM7CisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRTdHJpbmc+IFQqIGFkZF9zdHJpbmdzKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IE1hcHBpbmc+IFQqIGFkZF9tYXBwaW5ncygpIHsKKyAgICByZXR1cm4gQmVnaW5O
ZXN0ZWRNZXNzYWdlPFQ+KDQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBGcmFt
ZT4gVCogYWRkX2ZyYW1lcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDYWxsc3RhY2s+IFQqIGFkZF9jYWxs
c3RhY2tzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMyk7CisgIH0KKwor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFByb2ZpbGVQYWNrZXRfUHJvY2Vzc0hlYXBTYW1wbGVz
PiBUKiBhZGRfcHJvY2Vzc19kdW1wcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDUpOworICB9CisKKyAgdm9pZCBzZXRfY29udGludWVkKGJvb2wgdmFsdWUpIHsKKyAgICBB
cHBlbmRUaW55VmFySW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbmRleCh1aW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNz
IFByb2ZpbGVQYWNrZXRfUHJvY2Vzc0hlYXBTYW1wbGVzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90
b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMTEsIC8qSEFTX05PTlBB
Q0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBQcm9maWxlUGFja2V0
X1Byb2Nlc3NIZWFwU2FtcGxlc19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBs
ZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBQcm9maWxl
UGFja2V0X1Byb2Nlc3NIZWFwU2FtcGxlc19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFByb2ZpbGVQYWNrZXRfUHJvY2Vz
c0hlYXBTYW1wbGVzX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3Bp
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwaWQoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2Zyb21fc3Rh
cnR1cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBib29sIGZyb21fc3Rh
cnR1cCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3Jl
amVjdGVkX2NvbmN1cnJlbnQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAg
Ym9vbCByZWplY3RlZF9jb25jdXJyZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19ib29s
KCk7IH0KKyAgYm9vbCBoYXNfZGlzY29ubmVjdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52
YWxpZCgpOyB9CisgIGJvb2wgZGlzY29ubmVjdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5h
c19ib29sKCk7IH0KKyAgYm9vbCBoYXNfYnVmZmVyX292ZXJyYW4oKSBjb25zdCB7IHJldHVybiBh
dDw3PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBidWZmZXJfb3ZlcnJhbigpIGNvbnN0IHsgcmV0dXJu
IGF0PDc+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2J1ZmZlcl9jb3JydXB0ZWQoKSBjb25z
dCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBidWZmZXJfY29ycnVwdGVkKCkg
Y29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfaGl0X2d1YXJk
cmFpbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBoaXRfZ3Vh
cmRyYWlsKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFz
X2hlYXBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OkNvbnN0Q2hhcnMgaGVhcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkuYXNf
c3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHRpbWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc3RhdHMoKSBjb25zdCB7IHJldHVybiBhdDw1
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgc3RhdHMoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2FtcGxlcygpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVs
ZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBzYW1wbGVzKCkgY29uc3QgeyByZXR1
cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIpOyB9Cit9OworCitjbGFz
cyBQcm9maWxlUGFja2V0X1Byb2Nlc3NIZWFwU2FtcGxlcyA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUHJvZmlsZVBhY2tldF9Qcm9j
ZXNzSGVhcFNhbXBsZXNfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQaWRGaWVs
ZE51bWJlciA9IDEsCisgICAga0Zyb21TdGFydHVwRmllbGROdW1iZXIgPSAzLAorICAgIGtSZWpl
Y3RlZENvbmN1cnJlbnRGaWVsZE51bWJlciA9IDQsCisgICAga0Rpc2Nvbm5lY3RlZEZpZWxkTnVt
YmVyID0gNiwKKyAgICBrQnVmZmVyT3ZlcnJhbkZpZWxkTnVtYmVyID0gNywKKyAgICBrQnVmZmVy
Q29ycnVwdGVkRmllbGROdW1iZXIgPSA4LAorICAgIGtIaXRHdWFyZHJhaWxGaWVsZE51bWJlciA9
IDEwLAorICAgIGtIZWFwTmFtZUZpZWxkTnVtYmVyID0gMTEsCisgICAga1RpbWVzdGFtcEZpZWxk
TnVtYmVyID0gOSwKKyAgICBrU3RhdHNGaWVsZE51bWJlciA9IDUsCisgICAga1NhbXBsZXNGaWVs
ZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X3BpZCh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZnJvbV9zdGFydHVwKGJv
b2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF9yZWplY3RlZF9jb25jdXJyZW50KGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFy
SW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kaXNjb25uZWN0ZWQoYm9vbCB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2J1ZmZl
cl9vdmVycmFuKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDcsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9idWZmZXJfY29ycnVwdGVkKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBl
bmRUaW55VmFySW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9oaXRfZ3VhcmRyYWlsKGJv
b2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEwLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfaGVhcF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDExLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfaGVh
cF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMo
MTEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3RpbWVzdGFtcCh1aW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCg5LCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBQcm9maWxlUGFja2V0X1Byb2Nlc3NTdGF0cz4gVCogc2V0X3N0YXRzKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IFByb2ZpbGVQYWNrZXRfSGVhcFNhbXBsZT4gVCogYWRkX3NhbXBsZXMoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyKTsKKyAgfQorCit9OworCitjbGFzcyBQ
cm9maWxlUGFja2V0X1Byb2Nlc3NTdGF0c19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUHJvZmlsZVBhY2tldF9Qcm9jZXNz
U3RhdHNfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgUHJvZmlsZVBhY2tldF9Qcm9jZXNz
U3RhdHNfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBQcm9maWxlUGFja2V0X1Byb2Nlc3NTdGF0c19EZWNvZGVyKGNvbnN0
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRh
dGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc191bndpbmRpbmdfZXJyb3JzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHVud2luZGluZ19lcnJvcnMoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2hlYXBfc2Ft
cGxlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBoZWFw
X3NhbXBsZXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX21hcF9yZXBhcnNlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBtYXBfcmVwYXJzZXMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX3Vud2luZGluZ190aW1lX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHVud2luZGluZ190aW1lX3Vz
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3RvdGFs
X3Vud2luZGluZ190aW1lX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IHRvdGFsX3Vud2luZGluZ190aW1lX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4o
KS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgUHJvZmlsZVBhY2tldF9Qcm9jZXNzU3RhdHMg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IFByb2ZpbGVQYWNrZXRfUHJvY2Vzc1N0YXRzX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90
IHsKKyAgICBrVW53aW5kaW5nRXJyb3JzRmllbGROdW1iZXIgPSAxLAorICAgIGtIZWFwU2FtcGxl
c0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrTWFwUmVwYXJzZXNGaWVsZE51bWJlciA9IDMsCisgICAg
a1Vud2luZGluZ1RpbWVVc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrVG90YWxVbndpbmRpbmdUaW1l
VXNGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHZvaWQgc2V0X3Vud2luZGluZ19lcnJvcnModWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2hlYXBfc2FtcGxlcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbWFwX3JlcGFyc2VzKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IFByb2ZpbGVQYWNrZXRfSGlzdG9ncmFtPiBUKiBzZXRfdW53aW5kaW5nX3RpbWVfdXMoKSB7Cisg
ICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0KTsKKyAgfQorCisgIHZvaWQgc2V0X3Rv
dGFsX3Vud2luZGluZ190aW1lX3VzKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3MgUHJvZmlsZVBhY2tldF9IaXN0b2dyYW1fRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1Ymxp
YzoKKyAgUHJvZmlsZVBhY2tldF9IaXN0b2dyYW1fRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgUHJvZmlsZVBhY2tldF9IaXN0b2dyYW1fRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJh
dy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBQcm9maWxlUGFja2V0X0hpc3Rv
Z3JhbV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19idWNrZXRzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRl
ZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGJ1Y2tldHMoKSBjb25zdCB7
IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KK307CisK
K2NsYXNzIFByb2ZpbGVQYWNrZXRfSGlzdG9ncmFtIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNz
YWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQcm9maWxlUGFja2V0X0hpc3RvZ3Jh
bV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0J1Y2tldHNGaWVsZE51bWJlciA9
IDEsCisgIH07CisgIHVzaW5nIEJ1Y2tldCA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpQ
cm9maWxlUGFja2V0X0hpc3RvZ3JhbV9CdWNrZXQ7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
UHJvZmlsZVBhY2tldF9IaXN0b2dyYW1fQnVja2V0PiBUKiBhZGRfYnVja2V0cygpIHsKKyAgICBy
ZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOworICB9CisKK307CisKK2NsYXNzIFByb2Zp
bGVQYWNrZXRfSGlzdG9ncmFtX0J1Y2tldF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpU
eXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBF
QVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUHJvZmlsZVBhY2tldF9IaXN0b2dy
YW1fQnVja2V0X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBl
ZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFByb2ZpbGVQYWNrZXRfSGlz
dG9ncmFtX0J1Y2tldF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFByb2ZpbGVQYWNrZXRfSGlzdG9ncmFtX0J1Y2tldF9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc191cHBlcl9saW1pdCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB1cHBlcl9saW1pdCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbWF4X2J1
Y2tldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBib29sIG1heF9idWNr
ZXQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19jb3Vu
dCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjb3VudCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIFByb2Zp
bGVQYWNrZXRfSGlzdG9ncmFtX0J1Y2tldCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUHJvZmlsZVBhY2tldF9IaXN0b2dyYW1fQnVj
a2V0X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVXBwZXJMaW1pdEZpZWxkTnVt
YmVyID0gMSwKKyAgICBrTWF4QnVja2V0RmllbGROdW1iZXIgPSAyLAorICAgIGtDb3VudEZpZWxk
TnVtYmVyID0gMywKKyAgfTsKKyAgdm9pZCBzZXRfdXBwZXJfbGltaXQodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X21heF9idWNr
ZXQoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2NvdW50KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorfTsKKworY2xhc3MgUHJvZmlsZVBhY2tldF9IZWFwU2FtcGxlX0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
OCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBQcm9maWxlUGFja2V0X0hlYXBTYW1wbGVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
UHJvZmlsZVBhY2tldF9IZWFwU2FtcGxlX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgUHJvZmlsZVBhY2tldF9IZWFwU2Ft
cGxlX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFBy
b3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2NhbGxzdGFja19p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBjYWxsc3Rh
Y2tfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X3NlbGZfYWxsb2NhdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IHNlbGZfYWxsb2NhdGVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQo
KTsgfQorICBib29sIGhhc19zZWxmX2ZyZWVkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxp
ZCgpOyB9CisgIHVpbnQ2NF90IHNlbGZfZnJlZWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NlbGZfaWRsZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+
KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBzZWxmX2lkbGUoKSBjb25zdCB7IHJldHVybiBhdDw3
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3NlbGZfbWF4KCkgY29uc3QgeyByZXR1cm4g
YXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNlbGZfbWF4KCkgY29uc3QgeyByZXR1cm4g
YXQ8OD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc190aW1lc3RhbXAoKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdGltZXN0YW1wKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19hbGxvY19jb3VudCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBhbGxvY19jb3VudCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZnJlZV9j
b3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBmcmVl
X2NvdW50KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xh
c3MgUHJvZmlsZVBhY2tldF9IZWFwU2FtcGxlIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQcm9maWxlUGFja2V0X0hlYXBTYW1wbGVf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtDYWxsc3RhY2tJZEZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrU2VsZkFsbG9jYXRlZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrU2VsZkZyZWVk
RmllbGROdW1iZXIgPSAzLAorICAgIGtTZWxmSWRsZUZpZWxkTnVtYmVyID0gNywKKyAgICBrU2Vs
Zk1heEZpZWxkTnVtYmVyID0gOCwKKyAgICBrVGltZXN0YW1wRmllbGROdW1iZXIgPSA0LAorICAg
IGtBbGxvY0NvdW50RmllbGROdW1iZXIgPSA1LAorICAgIGtGcmVlQ291bnRGaWVsZE51bWJlciA9
IDYsCisgIH07CisgIHZvaWQgc2V0X2NhbGxzdGFja19pZCh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VsZl9hbGxvY2F0ZWQo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZv
aWQgc2V0X3NlbGZfZnJlZWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NlbGZfaWRsZSh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2VsZl9tYXgodWludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X3RpbWVzdGFtcCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfYWxsb2NfY291bnQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBl
bmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZyZWVfY291bnQodWludDY0X3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIElu
Y2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9z
L3BlcmZldHRvL3RyYWNlL3Byb2ZpbGluZy9zbWFwcy5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRl
ZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5k
ZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9QUk9GSUxJTkdfU01BUFNf
UFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9Q
Uk9GSUxJTkdfU01BUFNfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUg
PHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsK
K25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIFNtYXBzRW50
cnk7CisKK2NsYXNzIFNtYXBzUGFja2V0X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5
cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVB
VEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFNtYXBzUGFja2V0X0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IFNtYXBzUGFja2V0X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3Qq
PihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgU21hcHNQYWNrZXRfRGVj
b2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGlkKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfZW50cmllcygpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9y
PDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBlbnRyaWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVw
ZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIpOyB9Cit9OworCitjbGFzcyBTbWFwc1Bh
Y2tldCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gU21hcHNQYWNrZXRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQ
aWRGaWVsZE51bWJlciA9IDEsCisgICAga0VudHJpZXNGaWVsZE51bWJlciA9IDIsCisgIH07Cisg
IHZvaWQgc2V0X3BpZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1
ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTbWFwc0VudHJ5PiBUKiBhZGRfZW50
cmllcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIpOworICB9CisKK307
CisKK2NsYXNzIFNtYXBzRW50cnlfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFNtYXBzRW50cnlfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgU21hcHNFbnRyeV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcp
IDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3
LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFNtYXBzRW50cnlfRGVjb2Rlcihj
b25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJh
dy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBwYXRoKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19zaXplX2tiKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNpemVfa2IoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3ByaXZhdGVfZGly
dHlfa2IoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcHJp
dmF0ZV9kaXJ0eV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfc3dhcF9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBzd2FwX2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQor
fTsKKworY2xhc3MgU21hcHNFbnRyeSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7Cisg
cHVibGljOgorICB1c2luZyBEZWNvZGVyID0gU21hcHNFbnRyeV9EZWNvZGVyOworICBlbnVtIDog
aW50MzJfdCB7CisgICAga1BhdGhGaWVsZE51bWJlciA9IDEsCisgICAga1NpemVLYkZpZWxkTnVt
YmVyID0gMiwKKyAgICBrUHJpdmF0ZURpcnR5S2JGaWVsZE51bWJlciA9IDMsCisgICAga1N3YXBL
YkZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfcGF0aChjb25zdCBzdGQ6OnN0cmlu
ZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUo
KSk7CisgIH0KKyAgdm9pZCBzZXRfcGF0aChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDEsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3NpemVf
a2IodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3ByaXZhdGVfZGlydHlfa2IodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N3YXBfa2IodWludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFj
ZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUg
Z3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZl
dHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9jb21wb3NpdG9yX3NjaGVkdWxlcl9zdGF0ZS5w
Ynplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdp
bi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfQ09NUE9TSVRPUl9TQ0hFRFVMRVJfU1RBVEVfUFJP
VE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFD
S19FVkVOVF9DSFJPTUVfQ09NUE9TSVRPUl9TQ0hFRFVMRVJfU1RBVEVfUFJPVE9fSF8KKworI2lu
Y2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Bh
Y2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNl
IHBiemVybyB7CisKK2NsYXNzIEJlZ2luRnJhbWVBcmdzOworY2xhc3MgQmVnaW5GcmFtZU9ic2Vy
dmVyU3RhdGU7CitjbGFzcyBCZWdpbkZyYW1lU291cmNlU3RhdGU7CitjbGFzcyBCZWdpbkltcGxG
cmFtZUFyZ3M7CitjbGFzcyBCZWdpbkltcGxGcmFtZUFyZ3NfVGltZXN0YW1wc0luVXM7CitjbGFz
cyBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lOworY2xhc3MgQ2hyb21lQ29tcG9zaXRvclN0
YXRlTWFjaGluZV9NYWpvclN0YXRlOworY2xhc3MgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGlu
ZV9NaW5vclN0YXRlOworY2xhc3MgQ29tcG9zaXRvclRpbWluZ0hpc3Rvcnk7CitjbGFzcyBTb3Vy
Y2VMb2NhdGlvbjsKK2VudW0gQmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlIDogaW50
MzJfdDsKK2VudW0gQmVnaW5JbXBsRnJhbWVBcmdzX1N0YXRlIDogaW50MzJfdDsKK2VudW0gQ2hy
b21lQ29tcG9zaXRvclNjaGVkdWxlckFjdGlvbiA6IGludDMyX3Q7CitlbnVtIENocm9tZUNvbXBv
c2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZSA6IGludDMyX3Q7
CitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxG
cmFtZVN0YXRlIDogaW50MzJfdDsKK2VudW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
YWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGUgOiBpbnQzMl90OworZW51bSBDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGUg
OiBpbnQzMl90OworZW51bSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVf
TGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGUgOiBpbnQzMl90OworZW51bSBDaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfU2Nyb2xsSGFuZGxlclN0YXRlIDogaW50MzJfdDsKK2Vu
dW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0eSA6
IGludDMyX3Q7CisKK2VudW0gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlckFjdGlvbiA6IGludDMy
X3QgeworICBDQ19TQ0hFRFVMRVJfQUNUSU9OX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ0NfU0NIRURV
TEVSX0FDVElPTl9OT05FID0gMSwKKyAgQ0NfU0NIRURVTEVSX0FDVElPTl9TRU5EX0JFR0lOX01B
SU5fRlJBTUUgPSAyLAorICBDQ19TQ0hFRFVMRVJfQUNUSU9OX0NPTU1JVCA9IDMsCisgIENDX1ND
SEVEVUxFUl9BQ1RJT05fQUNUSVZBVEVfU1lOQ19UUkVFID0gNCwKKyAgQ0NfU0NIRURVTEVSX0FD
VElPTl9EUkFXX0lGX1BPU1NJQkxFID0gNSwKKyAgQ0NfU0NIRURVTEVSX0FDVElPTl9EUkFXX0ZP
UkNFRCA9IDYsCisgIENDX1NDSEVEVUxFUl9BQ1RJT05fRFJBV19BQk9SVCA9IDcsCisgIENDX1ND
SEVEVUxFUl9BQ1RJT05fQkVHSU5fTEFZRVJfVFJFRV9GUkFNRV9TSU5LX0NSRUFUSU9OID0gOCwK
KyAgQ0NfU0NIRURVTEVSX0FDVElPTl9QUkVQQVJFX1RJTEVTID0gOSwKKyAgQ0NfU0NIRURVTEVS
X0FDVElPTl9JTlZBTElEQVRFX0xBWUVSX1RSRUVfRlJBTUVfU0lOSyA9IDEwLAorICBDQ19TQ0hF
RFVMRVJfQUNUSU9OX1BFUkZPUk1fSU1QTF9TSURFX0lOVkFMSURBVElPTiA9IDExLAorICBDQ19T
Q0hFRFVMRVJfQUNUSU9OX05PVElGWV9CRUdJTl9NQUlOX0ZSQU1FX05PVF9FWFBFQ1RFRF9VTlRJ
TCA9IDEyLAorICBDQ19TQ0hFRFVMRVJfQUNUSU9OX05PVElGWV9CRUdJTl9NQUlOX0ZSQU1FX05P
VF9FWFBFQ1RFRF9TT09OID0gMTMsCit9OworCitjb25zdCBDaHJvbWVDb21wb3NpdG9yU2NoZWR1
bGVyQWN0aW9uIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJBY3Rpb25fTUlOID0gQ0NfU0NIRURV
TEVSX0FDVElPTl9VTlNQRUNJRklFRDsKK2NvbnN0IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJB
Y3Rpb24gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlckFjdGlvbl9NQVggPSBDQ19TQ0hFRFVMRVJf
QUNUSU9OX05PVElGWV9CRUdJTl9NQUlOX0ZSQU1FX05PVF9FWFBFQ1RFRF9TT09OOworCitlbnVt
IEJlZ2luSW1wbEZyYW1lQXJnc19TdGF0ZSA6IGludDMyX3QgeworICBCZWdpbkltcGxGcmFtZUFy
Z3NfU3RhdGVfQkVHSU5fRlJBTUVfRklOSVNIRUQgPSAwLAorICBCZWdpbkltcGxGcmFtZUFyZ3Nf
U3RhdGVfQkVHSU5fRlJBTUVfVVNJTkcgPSAxLAorfTsKKworY29uc3QgQmVnaW5JbXBsRnJhbWVB
cmdzX1N0YXRlIEJlZ2luSW1wbEZyYW1lQXJnc19TdGF0ZV9NSU4gPSBCZWdpbkltcGxGcmFtZUFy
Z3NfU3RhdGVfQkVHSU5fRlJBTUVfRklOSVNIRUQ7Citjb25zdCBCZWdpbkltcGxGcmFtZUFyZ3Nf
U3RhdGUgQmVnaW5JbXBsRnJhbWVBcmdzX1N0YXRlX01BWCA9IEJlZ2luSW1wbEZyYW1lQXJnc19T
dGF0ZV9CRUdJTl9GUkFNRV9VU0lORzsKKworZW51bSBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1l
QXJnc1R5cGUgOiBpbnQzMl90IHsKKyAgQmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBl
X0JFR0lOX0ZSQU1FX0FSR1NfVFlQRV9VTlNQRUNJRklFRCA9IDAsCisgIEJlZ2luRnJhbWVBcmdz
X0JlZ2luRnJhbWVBcmdzVHlwZV9CRUdJTl9GUkFNRV9BUkdTX1RZUEVfSU5WQUxJRCA9IDEsCisg
IEJlZ2luRnJhbWVBcmdzX0JlZ2luRnJhbWVBcmdzVHlwZV9CRUdJTl9GUkFNRV9BUkdTX1RZUEVf
Tk9STUFMID0gMiwKKyAgQmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlX0JFR0lOX0ZS
QU1FX0FSR1NfVFlQRV9NSVNTRUQgPSAzLAorfTsKKworY29uc3QgQmVnaW5GcmFtZUFyZ3NfQmVn
aW5GcmFtZUFyZ3NUeXBlIEJlZ2luRnJhbWVBcmdzX0JlZ2luRnJhbWVBcmdzVHlwZV9NSU4gPSBC
ZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGVfQkVHSU5fRlJBTUVfQVJHU19UWVBFX1VO
U1BFQ0lGSUVEOworY29uc3QgQmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlIEJlZ2lu
RnJhbWVBcmdzX0JlZ2luRnJhbWVBcmdzVHlwZV9NQVggPSBCZWdpbkZyYW1lQXJnc19CZWdpbkZy
YW1lQXJnc1R5cGVfQkVHSU5fRlJBTUVfQVJHU19UWVBFX01JU1NFRDsKKworZW51bSBDaHJvbWVD
b21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfVHJlZVByaW9yaXR5IDogaW50MzJfdCB7
CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHlf
VFJFRV9QUklPUklUWV9VTlNQRUNJRklFRCA9IDAsCisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1h
Y2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHlfVFJFRV9QUklPUklUWV9TQU1FX1BSSU9SSVRZ
X0ZPUl9CT1RIX1RSRUVTID0gMSwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5v
clN0YXRlX1RyZWVQcmlvcml0eV9UUkVFX1BSSU9SSVRZX1NNT09USE5FU1NfVEFLRVNfUFJJT1JJ
VFkgPSAyLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfVHJlZVBy
aW9yaXR5X1RSRUVfUFJJT1JJVFlfTkVXX0NPTlRFTlRfVEFLRVNfUFJJT1JJVFkgPSAzLAorfTsK
KworY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlv
cml0eSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfVHJlZVByaW9yaXR5
X01JTiA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3Jp
dHlfVFJFRV9QUklPUklUWV9VTlNQRUNJRklFRDsKK2NvbnN0IENocm9tZUNvbXBvc2l0b3JTdGF0
ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHkgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFj
aGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0eV9NQVggPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVN
YWNoaW5lX01pbm9yU3RhdGVfVHJlZVByaW9yaXR5X1RSRUVfUFJJT1JJVFlfTkVXX0NPTlRFTlRf
VEFLRVNfUFJJT1JJVFk7CisKK2VudW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5v
clN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZSA6IGludDMyX3QgeworICBDaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfU2Nyb2xsSGFuZGxlclN0YXRlX1NDUk9MTF9IQU5ETEVS
X1VOU1BFQ0lGSUVEID0gMCwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0
YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZV9TQ1JPTExfQUZGRUNUU19TQ1JPTExfSEFORExFUiA9IDEs
CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9TY3JvbGxIYW5kbGVy
U3RhdGVfU0NST0xMX0RPRVNfTk9UX0FGRkVDVF9TQ1JPTExfSEFORExFUiA9IDIsCit9OworCitj
b25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfU2Nyb2xsSGFuZGxl
clN0YXRlIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9TY3JvbGxIYW5k
bGVyU3RhdGVfTUlOID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Nj
cm9sbEhhbmRsZXJTdGF0ZV9TQ1JPTExfSEFORExFUl9VTlNQRUNJRklFRDsKK2NvbnN0IENocm9t
ZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9TY3JvbGxIYW5kbGVyU3RhdGUgQ2hy
b21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1Njcm9sbEhhbmRsZXJTdGF0ZV9N
QVggPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfU2Nyb2xsSGFuZGxl
clN0YXRlX1NDUk9MTF9ET0VTX05PVF9BRkZFQ1RfU0NST0xMX0hBTkRMRVI7CisKK2VudW0gQ2hy
b21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGUg
OiBpbnQzMl90IHsKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0Jl
Z2luSW1wbEZyYW1lU3RhdGVfQkVHSU5fSU1QTF9GUkFNRV9VTlNQRUNJRklFRCA9IDAsCisgIENo
cm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRl
X0JFR0lOX0lNUExfRlJBTUVfSURMRSA9IDEsCisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hp
bmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlX0JFR0lOX0lNUExfRlJBTUVfSU5TSURF
X0JFR0lOX0ZSQU1FID0gMiwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0
YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGVfQkVHSU5fSU1QTF9GUkFNRV9JTlNJREVfREVBRExJTkUg
PSAzLAorfTsKKworY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRl
X0JlZ2luSW1wbEZyYW1lU3RhdGUgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0
YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGVfTUlOID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGlu
ZV9NYWpvclN0YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGVfQkVHSU5fSU1QTF9GUkFNRV9VTlNQRUNJ
RklFRDsKK2NvbnN0IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdp
bkltcGxGcmFtZVN0YXRlIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9C
ZWdpbkltcGxGcmFtZVN0YXRlX01BWCA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFq
b3JTdGF0ZV9CZWdpbkltcGxGcmFtZVN0YXRlX0JFR0lOX0lNUExfRlJBTUVfSU5TSURFX0RFQURM
SU5FOworCitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdp
bk1haW5GcmFtZVN0YXRlIDogaW50MzJfdCB7CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hp
bmVfTWFqb3JTdGF0ZV9CZWdpbk1haW5GcmFtZVN0YXRlX0JFR0lOX01BSU5fRlJBTUVfVU5TUEVD
SUZJRUQgPSAwLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVn
aW5NYWluRnJhbWVTdGF0ZV9CRUdJTl9NQUlOX0ZSQU1FX0lETEUgPSAxLAorICBDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5NYWluRnJhbWVTdGF0ZV9CRUdJTl9N
QUlOX0ZSQU1FX1NFTlQgPSAyLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9y
U3RhdGVfQmVnaW5NYWluRnJhbWVTdGF0ZV9CRUdJTl9NQUlOX0ZSQU1FX1JFQURZX1RPX0NPTU1J
VCA9IDMsCit9OworCitjb25zdCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3Rh
dGVfQmVnaW5NYWluRnJhbWVTdGF0ZSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9y
U3RhdGVfQmVnaW5NYWluRnJhbWVTdGF0ZV9NSU4gPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNo
aW5lX01ham9yU3RhdGVfQmVnaW5NYWluRnJhbWVTdGF0ZV9CRUdJTl9NQUlOX0ZSQU1FX1VOU1BF
Q0lGSUVEOworY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0Jl
Z2luTWFpbkZyYW1lU3RhdGUgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRl
X0JlZ2luTWFpbkZyYW1lU3RhdGVfTUFYID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
YWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGVfQkVHSU5fTUFJTl9GUkFNRV9SRUFEWV9UT19D
T01NSVQ7CisKK2VudW0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xh
eWVyVHJlZUZyYW1lU2lua1N0YXRlIDogaW50MzJfdCB7CisgIENocm9tZUNvbXBvc2l0b3JTdGF0
ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFtZVNpbmtTdGF0ZV9MQVlFUl9UUkVFX0ZS
QU1FX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpv
clN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJBTUVfTk9ORSA9IDEs
CisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFt
ZVNpbmtTdGF0ZV9MQVlFUl9UUkVFX0ZSQU1FX0FDVElWRSA9IDIsCisgIENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFtZVNpbmtTdGF0ZV9MQVlFUl9U
UkVFX0ZSQU1FX0NSRUFUSU5HID0gMywKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
YWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJBTUVfV0FJVElO
R19GT1JfRklSU1RfQ09NTUlUID0gNCwKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
YWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJBTUVfV0FJVElO
R19GT1JfRklSU1RfQUNUSVZBVElPTiA9IDUsCit9OworCitjb25zdCBDaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGUgQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX01J
TiA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFt
ZVNpbmtTdGF0ZV9MQVlFUl9UUkVFX0ZSQU1FX1VOU1BFQ0lGSUVEOworY29uc3QgQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlIENo
cm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFtZVNpbmtT
dGF0ZV9NQVggPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJU
cmVlRnJhbWVTaW5rU3RhdGVfTEFZRVJfVFJFRV9GUkFNRV9XQUlUSU5HX0ZPUl9GSVJTVF9BQ1RJ
VkFUSU9OOworCitlbnVtIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9G
b3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZSA6IGludDMyX3QgeworICBDaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VE
X1JFRFJBV19VTlNQRUNJRklFRCA9IDAsCisgIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVf
TWFqb3JTdGF0ZV9Gb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZV9GT1JDRURfUkVEUkFXX0lETEUg
PSAxLAorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVk
cmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19XQUlUSU5HX0ZPUl9DT01NSVQgPSAyLAor
ICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25U
aW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19XQUlUSU5HX0ZPUl9BQ1RJVkFUSU9OID0gMywKKyAg
Q2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0ZvcmNlZFJlZHJhd09uVGlt
ZW91dFN0YXRlX0ZPUkNFRF9SRURSQVdfV0FJVElOR19GT1JfRFJBVyA9IDQsCit9OworCitjb25z
dCBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25U
aW1lb3V0U3RhdGUgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0ZvcmNl
ZFJlZHJhd09uVGltZW91dFN0YXRlX01JTiA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVf
TWFqb3JTdGF0ZV9Gb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZV9GT1JDRURfUkVEUkFXX1VOU1BF
Q0lGSUVEOworY29uc3QgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0Zv
cmNlZFJlZHJhd09uVGltZW91dFN0YXRlIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFq
b3JTdGF0ZV9Gb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZV9NQVggPSBDaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VE
X1JFRFJBV19XQUlUSU5HX0ZPUl9EUkFXOworCitlbnVtIENocm9tZUNvbXBvc2l0b3JTY2hlZHVs
ZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZSA6IGludDMyX3QgeworICBDaHJvbWVD
b21wb3NpdG9yU2NoZWR1bGVyU3RhdGVfQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVfREVBRExJ
TkVfTU9ERV9VTlNQRUNJRklFRCA9IDAsCisgIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0
ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX05PTkUgPSAxLAorICBD
aHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGVfQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVf
REVBRExJTkVfTU9ERV9JTU1FRElBVEUgPSAyLAorICBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVy
U3RhdGVfQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVfREVBRExJTkVfTU9ERV9SRUdVTEFSID0g
MywKKyAgQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1lRGVhZGxp
bmVNb2RlX0RFQURMSU5FX01PREVfTEFURSA9IDQsCisgIENocm9tZUNvbXBvc2l0b3JTY2hlZHVs
ZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX0JMT0NLRUQg
PSA1LAorfTsKKworY29uc3QgQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1w
bEZyYW1lRGVhZGxpbmVNb2RlIENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbklt
cGxGcmFtZURlYWRsaW5lTW9kZV9NSU4gPSBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGVf
QmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVfREVBRExJTkVfTU9ERV9VTlNQRUNJRklFRDsKK2Nv
bnN0IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5l
TW9kZSBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGVfQmVnaW5JbXBsRnJhbWVEZWFkbGlu
ZU1vZGVfTUFYID0gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1l
RGVhZGxpbmVNb2RlX0RFQURMSU5FX01PREVfQkxPQ0tFRDsKKworY2xhc3MgQ29tcG9zaXRvclRp
bWluZ0hpc3RvcnlfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29k
ZXI8LypNQVhfRklFTERfSUQ9Ki83LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
ZmFsc2U+IHsKKyBwdWJsaWM6CisgIENvbXBvc2l0b3JUaW1pbmdIaXN0b3J5X0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IENvbXBvc2l0b3JUaW1pbmdIaXN0b3J5X0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ29t
cG9zaXRvclRpbWluZ0hpc3RvcnlfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9jcml0aWNhbF9lc3RpbWF0ZV9kZWx0YV91cygp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGJlZ2luX21haW5f
ZnJhbWVfcXVldWVfY3JpdGljYWxfZXN0aW1hdGVfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9u
b3RfY3JpdGljYWxfZXN0aW1hdGVfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgaW50NjRfdCBiZWdpbl9tYWluX2ZyYW1lX3F1ZXVlX25vdF9jcml0aWNhbF9l
c3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50NjQoKTsgfQor
ICBib29sIGhhc19iZWdpbl9tYWluX2ZyYW1lX3N0YXJ0X3RvX3JlYWR5X3RvX2NvbW1pdF9lc3Rp
bWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2
NF90IGJlZ2luX21haW5fZnJhbWVfc3RhcnRfdG9fcmVhZHlfdG9fY29tbWl0X2VzdGltYXRlX2Rl
bHRhX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X2NvbW1pdF90b19yZWFkeV90b19hY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGNvbW1pdF90b19yZWFkeV90b19h
Y3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50
NjQoKTsgfQorICBib29sIGhhc19wcmVwYXJlX3RpbGVzX2VzdGltYXRlX2RlbHRhX3VzKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgcHJlcGFyZV90aWxlc19l
c3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50NjQoKTsgfQor
ICBib29sIGhhc19hY3RpdmF0ZV9lc3RpbWF0ZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIGF0
PDY+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGFjdGl2YXRlX2VzdGltYXRlX2RlbHRhX3VzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2RyYXdfZXN0
aW1hdGVfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgaW50
NjRfdCBkcmF3X2VzdGltYXRlX2RlbHRhX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19p
bnQ2NCgpOyB9Cit9OworCitjbGFzcyBDb21wb3NpdG9yVGltaW5nSGlzdG9yeSA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ29tcG9z
aXRvclRpbWluZ0hpc3RvcnlfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtCZWdp
bk1haW5GcmFtZVF1ZXVlQ3JpdGljYWxFc3RpbWF0ZURlbHRhVXNGaWVsZE51bWJlciA9IDEsCisg
ICAga0JlZ2luTWFpbkZyYW1lUXVldWVOb3RDcml0aWNhbEVzdGltYXRlRGVsdGFVc0ZpZWxkTnVt
YmVyID0gMiwKKyAgICBrQmVnaW5NYWluRnJhbWVTdGFydFRvUmVhZHlUb0NvbW1pdEVzdGltYXRl
RGVsdGFVc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrQ29tbWl0VG9SZWFkeVRvQWN0aXZhdGVFc3Rp
bWF0ZURlbHRhVXNGaWVsZE51bWJlciA9IDQsCisgICAga1ByZXBhcmVUaWxlc0VzdGltYXRlRGVs
dGFVc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrQWN0aXZhdGVFc3RpbWF0ZURlbHRhVXNGaWVsZE51
bWJlciA9IDYsCisgICAga0RyYXdFc3RpbWF0ZURlbHRhVXNGaWVsZE51bWJlciA9IDcsCisgIH07
CisgIHZvaWQgc2V0X2JlZ2luX21haW5fZnJhbWVfcXVldWVfY3JpdGljYWxfZXN0aW1hdGVfZGVs
dGFfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfYmVnaW5fbWFpbl9mcmFtZV9xdWV1ZV9ub3RfY3JpdGljYWxfZXN0aW1hdGVf
ZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfYmVnaW5fbWFpbl9mcmFtZV9zdGFydF90b19yZWFkeV90b19jb21taXRf
ZXN0aW1hdGVfZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY29tbWl0X3RvX3JlYWR5X3RvX2FjdGl2YXRlX2VzdGlt
YXRlX2RlbHRhX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X3ByZXBhcmVfdGlsZXNfZXN0aW1hdGVfZGVsdGFfdXMoaW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
YWN0aXZhdGVfZXN0aW1hdGVfZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZHJhd19lc3RpbWF0ZV9kZWx0YV91cyhp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsKKyAgfQorfTsKKwor
Y2xhc3MgQmVnaW5GcmFtZVNvdXJjZVN0YXRlX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86
OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNCwgLypIQVNfTk9OUEFDS0VEX1JF
UEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCZWdpbkZyYW1lU291cmNlU3Rh
dGVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmVnaW5GcmFtZVNvdXJjZVN0YXRlX0Rl
Y29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAg
ZXhwbGljaXQgQmVnaW5GcmFtZVNvdXJjZVN0YXRlX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX3NvdXJjZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICB1aW50MzJfdCBzb3VyY2VfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3Vp
bnQzMigpOyB9CisgIGJvb2wgaGFzX3BhdXNlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFs
aWQoKTsgfQorICBib29sIHBhdXNlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYm9vbCgp
OyB9CisgIGJvb2wgaGFzX251bV9vYnNlcnZlcnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgdWludDMyX3QgbnVtX29ic2VydmVycygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGFzdF9iZWdpbl9mcmFtZV9hcmdzKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGxhc3RfYmVnaW5fZnJhbWVfYXJncygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfYnl0ZXMo
KTsgfQorfTsKKworY2xhc3MgQmVnaW5GcmFtZVNvdXJjZVN0YXRlIDogcHVibGljIDo6cHJvdG96
ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCZWdpbkZyYW1lU291
cmNlU3RhdGVfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtTb3VyY2VJZEZpZWxk
TnVtYmVyID0gMSwKKyAgICBrUGF1c2VkRmllbGROdW1iZXIgPSAyLAorICAgIGtOdW1PYnNlcnZl
cnNGaWVsZE51bWJlciA9IDMsCisgICAga0xhc3RCZWdpbkZyYW1lQXJnc0ZpZWxkTnVtYmVyID0g
NCwKKyAgfTsKKyAgdm9pZCBzZXRfc291cmNlX2lkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wYXVzZWQoYm9vbCB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X251bV9v
YnNlcnZlcnModWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOwor
ICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmVnaW5GcmFtZUFyZ3M+IFQqIHNldF9sYXN0
X2JlZ2luX2ZyYW1lX2FyZ3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig0
KTsKKyAgfQorCit9OworCitjbGFzcyBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZV9EZWNvZGVyIDog
cHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIs
IC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAg
QmVnaW5GcmFtZU9ic2VydmVyU3RhdGVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQmVn
aW5GcmFtZU9ic2VydmVyU3RhdGVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0ZV9E
ZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0Rl
Y29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19kcm9wcGVkX2JlZ2luX2Zy
YW1lX2FyZ3MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBk
cm9wcGVkX2JlZ2luX2ZyYW1lX2FyZ3MoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDY0
KCk7IH0KKyAgYm9vbCBoYXNfbGFzdF9iZWdpbl9mcmFtZV9hcmdzKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGxhc3RfYmVnaW5f
ZnJhbWVfYXJncygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYnl0ZXMoKTsgfQorfTsKKwor
Y2xhc3MgQmVnaW5GcmFtZU9ic2VydmVyU3RhdGUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3Nh
Z2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJlZ2luRnJhbWVPYnNlcnZlclN0YXRl
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrRHJvcHBlZEJlZ2luRnJhbWVBcmdz
RmllbGROdW1iZXIgPSAxLAorICAgIGtMYXN0QmVnaW5GcmFtZUFyZ3NGaWVsZE51bWJlciA9IDIs
CisgIH07CisgIHZvaWQgc2V0X2Ryb3BwZWRfYmVnaW5fZnJhbWVfYXJncyhpbnQ2NF90IHZhbHVl
KSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IEJlZ2luRnJhbWVBcmdzPiBUKiBzZXRfbGFzdF9iZWdpbl9mcmFtZV9hcmdzKCkgewor
ICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKworfTsKKworY2xhc3Mg
QmVnaW5JbXBsRnJhbWVBcmdzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJv
dG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovNiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBCZWdpbkltcGxGcmFtZUFyZ3NfRGVjb2Rlcihj
b25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEs
IGxlbikge30KKyAgZXhwbGljaXQgQmVnaW5JbXBsRnJhbWVBcmdzX0RlY29kZXIoY29uc3Qgc3Rk
OjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0
IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmVnaW5J
bXBsRnJhbWVBcmdzX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3Vw
ZGF0ZWRfYXRfdXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50NjRf
dCB1cGRhdGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2ZpbmlzaGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIGludDY0X3QgZmluaXNoZWRfYXRfdXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFz
X2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgaW50MzJfdCBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50
MzIoKTsgfQorICBib29sIGhhc19jdXJyZW50X2FyZ3MoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY3VycmVudF9hcmdzKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2xhc3RfYXJncygp
IGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBsYXN0X2FyZ3MoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2J5dGVzKCk7IH0KKyAg
Ym9vbCBoYXNfdGltZXN0YW1wc19pbl91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0aW1lc3RhbXBzX2luX3VzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nj4oKS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBCZWdpbkltcGxGcmFt
ZUFyZ3MgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IEJlZ2luSW1wbEZyYW1lQXJnc19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga1VwZGF0ZWRBdFVzRmllbGROdW1iZXIgPSAxLAorICAgIGtGaW5pc2hlZEF0VXNGaWVs
ZE51bWJlciA9IDIsCisgICAga1N0YXRlRmllbGROdW1iZXIgPSAzLAorICAgIGtDdXJyZW50QXJn
c0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrTGFzdEFyZ3NGaWVsZE51bWJlciA9IDUsCisgICAga1Rp
bWVzdGFtcHNJblVzRmllbGROdW1iZXIgPSA2LAorICB9OworICB1c2luZyBUaW1lc3RhbXBzSW5V
cyA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpCZWdpbkltcGxGcmFtZUFyZ3NfVGltZXN0
YW1wc0luVXM7CisgIHVzaW5nIFN0YXRlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkJl
Z2luSW1wbEZyYW1lQXJnc19TdGF0ZTsKKyAgc3RhdGljIGNvbnN0IFN0YXRlIEJFR0lOX0ZSQU1F
X0ZJTklTSEVEID0gQmVnaW5JbXBsRnJhbWVBcmdzX1N0YXRlX0JFR0lOX0ZSQU1FX0ZJTklTSEVE
OworICBzdGF0aWMgY29uc3QgU3RhdGUgQkVHSU5fRlJBTUVfVVNJTkcgPSBCZWdpbkltcGxGcmFt
ZUFyZ3NfU3RhdGVfQkVHSU5fRlJBTUVfVVNJTkc7CisgIHZvaWQgc2V0X3VwZGF0ZWRfYXRfdXMo
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfZmluaXNoZWRfYXRfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgy
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RhdGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OkJlZ2luSW1wbEZyYW1lQXJnc19TdGF0ZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJ
bnQoMywgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmVnaW5GcmFtZUFy
Z3M+IFQqIHNldF9jdXJyZW50X2FyZ3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPig0KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmVnaW5GcmFtZUFyZ3M+
IFQqIHNldF9sYXN0X2FyZ3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmVnaW5JbXBsRnJhbWVBcmdzX1Rp
bWVzdGFtcHNJblVzPiBUKiBzZXRfdGltZXN0YW1wc19pbl91cygpIHsKKyAgICByZXR1cm4gQmVn
aW5OZXN0ZWRNZXNzYWdlPFQ+KDYpOworICB9CisKK307CisKK2NsYXNzIEJlZ2luSW1wbEZyYW1l
QXJnc19UaW1lc3RhbXBzSW5Vc19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzcsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQmVnaW5JbXBsRnJhbWVBcmdzX1RpbWVzdGFt
cHNJblVzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFBy
b3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEJlZ2luSW1wbEZyYW1lQXJnc19U
aW1lc3RhbXBzSW5Vc19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBzSW5V
c19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19pbnRlcnZhbF9kZWx0
YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGludGVydmFs
X2RlbHRhKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFz
X25vd190b19kZWFkbGluZV9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsg
fQorICBpbnQ2NF90IG5vd190b19kZWFkbGluZV9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19mcmFtZV90aW1lX3RvX25vd19kZWx0YSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGZyYW1lX3RpbWVfdG9f
bm93X2RlbHRhKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2ZyYW1lX3RpbWVfdG9fZGVhZGxpbmVfZGVsdGEoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LnZhbGlkKCk7IH0KKyAgaW50NjRfdCBmcmFtZV90aW1lX3RvX2RlYWRsaW5lX2RlbHRhKCkgY29u
c3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25vdygpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IG5vdygpIGNvbnN0IHsgcmV0
dXJuIGF0PDU+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19mcmFtZV90aW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgZnJhbWVfdGltZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDY+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19kZWFkbGluZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGRlYWRsaW5lKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBCZWdpbkltcGxG
cmFtZUFyZ3NfVGltZXN0YW1wc0luVXMgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2Ugewor
IHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEJlZ2luSW1wbEZyYW1lQXJnc19UaW1lc3RhbXBz
SW5Vc19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0ludGVydmFsRGVsdGFGaWVs
ZE51bWJlciA9IDEsCisgICAga05vd1RvRGVhZGxpbmVEZWx0YUZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrRnJhbWVUaW1lVG9Ob3dEZWx0YUZpZWxkTnVtYmVyID0gMywKKyAgICBrRnJhbWVUaW1lVG9E
ZWFkbGluZURlbHRhRmllbGROdW1iZXIgPSA0LAorICAgIGtOb3dGaWVsZE51bWJlciA9IDUsCisg
ICAga0ZyYW1lVGltZUZpZWxkTnVtYmVyID0gNiwKKyAgICBrRGVhZGxpbmVGaWVsZE51bWJlciA9
IDcsCisgIH07CisgIHZvaWQgc2V0X2ludGVydmFsX2RlbHRhKGludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25vd190b19kZWFkbGlu
ZV9kZWx0YShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9mcmFtZV90aW1lX3RvX25vd19kZWx0YShpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mcmFtZV90aW1lX3Rv
X2RlYWRsaW5lX2RlbHRhKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X25vdyhpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mcmFtZV90aW1lKGludDY0X3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RlYWRsaW5l
KGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNywgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBCZWdpbkZyYW1lQXJnc19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBl
ZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEwLCAvKkhBU19OT05QQUNLRURfUkVQRUFU
RURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJlZ2luRnJhbWVBcmdzX0RlY29kZXIo
Y29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRh
LCBsZW4pIHt9CisgIGV4cGxpY2l0IEJlZ2luRnJhbWVBcmdzX0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQmVnaW5GcmFt
ZUFyZ3NfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfdHlwZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHR5cGUoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfc291cmNlX2lkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNvdXJjZV9pZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc2VxdWVuY2Vf
bnVtYmVyKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHNl
cXVlbmNlX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfZnJhbWVfdGltZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsg
fQorICBpbnQ2NF90IGZyYW1lX3RpbWVfdXMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2lu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfZGVhZGxpbmVfdXMoKSBjb25zdCB7IHJldHVybiBhdDw1Pigp
LnZhbGlkKCk7IH0KKyAgaW50NjRfdCBkZWFkbGluZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+
KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19pbnRlcnZhbF9kZWx0YV91cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGludGVydmFsX2RlbHRhX3VzKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX29uX2NyaXRp
Y2FsX3BhdGgoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBvbl9j
cml0aWNhbF9wYXRoKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19ib29sKCk7IH0KKyAgYm9v
bCBoYXNfYW5pbWF0ZV9vbmx5KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9Cisg
IGJvb2wgYW5pbWF0ZV9vbmx5KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc19ib29sKCk7IH0K
KyAgYm9vbCBoYXNfc291cmNlX2xvY2F0aW9uX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBzb3VyY2VfbG9jYXRpb25faWlkKCkgY29uc3QgeyByZXR1
cm4gYXQ8OT4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19zb3VyY2VfbG9jYXRpb24oKSBj
b25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzIHNvdXJjZV9sb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDEwPigpLmFzX2J5dGVzKCk7
IH0KK307CisKK2NsYXNzIEJlZ2luRnJhbWVBcmdzIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNz
YWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBCZWdpbkZyYW1lQXJnc19EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga1R5cGVGaWVsZE51bWJlciA9IDEsCisgICAga1Nv
dXJjZUlkRmllbGROdW1iZXIgPSAyLAorICAgIGtTZXF1ZW5jZU51bWJlckZpZWxkTnVtYmVyID0g
MywKKyAgICBrRnJhbWVUaW1lVXNGaWVsZE51bWJlciA9IDQsCisgICAga0RlYWRsaW5lVXNGaWVs
ZE51bWJlciA9IDUsCisgICAga0ludGVydmFsRGVsdGFVc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBr
T25Dcml0aWNhbFBhdGhGaWVsZE51bWJlciA9IDcsCisgICAga0FuaW1hdGVPbmx5RmllbGROdW1i
ZXIgPSA4LAorICAgIGtTb3VyY2VMb2NhdGlvbklpZEZpZWxkTnVtYmVyID0gOSwKKyAgICBrU291
cmNlTG9jYXRpb25GaWVsZE51bWJlciA9IDEwLAorICB9OworICB1c2luZyBCZWdpbkZyYW1lQXJn
c1R5cGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6QmVnaW5GcmFtZUFyZ3NfQmVnaW5G
cmFtZUFyZ3NUeXBlOworICBzdGF0aWMgY29uc3QgQmVnaW5GcmFtZUFyZ3NUeXBlIEJFR0lOX0ZS
QU1FX0FSR1NfVFlQRV9VTlNQRUNJRklFRCA9IEJlZ2luRnJhbWVBcmdzX0JlZ2luRnJhbWVBcmdz
VHlwZV9CRUdJTl9GUkFNRV9BUkdTX1RZUEVfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBC
ZWdpbkZyYW1lQXJnc1R5cGUgQkVHSU5fRlJBTUVfQVJHU19UWVBFX0lOVkFMSUQgPSBCZWdpbkZy
YW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5cGVfQkVHSU5fRlJBTUVfQVJHU19UWVBFX0lOVkFMSUQ7
CisgIHN0YXRpYyBjb25zdCBCZWdpbkZyYW1lQXJnc1R5cGUgQkVHSU5fRlJBTUVfQVJHU19UWVBF
X05PUk1BTCA9IEJlZ2luRnJhbWVBcmdzX0JlZ2luRnJhbWVBcmdzVHlwZV9CRUdJTl9GUkFNRV9B
UkdTX1RZUEVfTk9STUFMOworICBzdGF0aWMgY29uc3QgQmVnaW5GcmFtZUFyZ3NUeXBlIEJFR0lO
X0ZSQU1FX0FSR1NfVFlQRV9NSVNTRUQgPSBCZWdpbkZyYW1lQXJnc19CZWdpbkZyYW1lQXJnc1R5
cGVfQkVHSU5fRlJBTUVfQVJHU19UWVBFX01JU1NFRDsKKyAgdm9pZCBzZXRfdHlwZSg6OnBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6QmVnaW5GcmFtZUFyZ3NfQmVnaW5GcmFtZUFyZ3NUeXBlIHZh
bHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
c291cmNlX2lkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9zZXF1ZW5jZV9udW1iZXIodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZyYW1lX3RpbWVfdXMoaW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfZGVhZGxpbmVfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg1LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW50ZXJ2YWxfZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfb25fY3JpdGljYWxf
cGF0aChib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg3LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfYW5pbWF0ZV9vbmx5KGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFy
SW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zb3VyY2VfbG9jYXRpb25faWlkKHVpbnQ2
NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDksIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IFNvdXJjZUxvY2F0aW9uPiBUKiBzZXRfc291cmNlX2xvY2F0aW9uKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTApOworICB9CisKK307CisKK2Ns
YXNzIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfRGVjb2RlciA6IHB1YmxpYyA6OnByb3Rv
emVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNL
RURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIENocm9tZUNvbXBvc2l0
b3JTdGF0ZU1hY2hpbmVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6
IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSks
IHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbWFqb3Jfc3RhdGUoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgbWFqb3Jfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2J5dGVzKCk7IH0KKyAg
Ym9vbCBoYXNfbWlub3Jfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbWlub3Jfc3RhdGUoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLmFzX2J5dGVzKCk7IH0KK307CisKK2NsYXNzIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1h
Y2hpbmUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtNYWpvclN0YXRlRmllbGROdW1iZXIgPSAxLAorICAgIGtNaW5vclN0
YXRlRmllbGROdW1iZXIgPSAyLAorICB9OworICB1c2luZyBNYWpvclN0YXRlID0gOjpwZXJmZXR0
bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0
ZTsKKyAgdXNpbmcgTWlub3JTdGF0ZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJv
bWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGU7CisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlPiBUKiBzZXRfbWFq
b3Jfc3RhdGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9N
aW5vclN0YXRlPiBUKiBzZXRfbWlub3Jfc3RhdGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigyKTsKKyAgfQorCit9OworCitjbGFzcyBDaHJvbWVDb21wb3NpdG9yU3RhdGVN
YWNoaW5lX01pbm9yU3RhdGVfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80NiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJ
RUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5l
X01pbm9yU3RhdGVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2hyb21lQ29tcG9zaXRv
clN0YXRlTWFjaGluZV9NaW5vclN0YXRlX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykg
OiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcu
ZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2hyb21lQ29tcG9zaXRvclN0YXRl
TWFjaGluZV9NaW5vclN0YXRlX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMm
IHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wg
aGFzX2NvbW1pdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBp
bnQzMl90IGNvbW1pdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsg
fQorICBib29sIGhhc19jdXJyZW50X2ZyYW1lX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGN1cnJlbnRfZnJhbWVfbnVtYmVyKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2xhc3RfZnJhbWVfbnVtYmVy
X3N1Ym1pdF9wZXJmb3JtZWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAg
aW50MzJfdCBsYXN0X2ZyYW1lX251bWJlcl9zdWJtaXRfcGVyZm9ybWVkKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2xhc3RfZnJhbWVfbnVtYmVyX2Ry
YXdfcGVyZm9ybWVkKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDMy
X3QgbGFzdF9mcmFtZV9udW1iZXJfZHJhd19wZXJmb3JtZWQoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGFzdF9mcmFtZV9udW1iZXJfYmVnaW5fbWFp
bl9mcmFtZV9zZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMy
X3QgbGFzdF9mcmFtZV9udW1iZXJfYmVnaW5fbWFpbl9mcmFtZV9zZW50KCkgY29uc3QgeyByZXR1
cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2RpZF9kcmF3KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIGJvb2wgZGlkX2RyYXcoKSBjb25zdCB7IHJldHVy
biBhdDw2PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19kaWRfc2VuZF9iZWdpbl9tYWluX2Zy
YW1lX2Zvcl9jdXJyZW50X2ZyYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9
CisgIGJvb2wgZGlkX3NlbmRfYmVnaW5fbWFpbl9mcmFtZV9mb3JfY3VycmVudF9mcmFtZSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2RpZF9ub3RpZnlf
YmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWRfdW50aWwoKSBjb25zdCB7IHJldHVybiBhdDw4
PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBkaWRfbm90aWZ5X2JlZ2luX21haW5fZnJhbWVfbm90X2V4
cGVjdGVkX3VudGlsKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc19ib29sKCk7IH0KKyAgYm9v
bCBoYXNfZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3RlZF9zb29uKCkgY29u
c3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIGJvb2wgZGlkX25vdGlmeV9iZWdpbl9t
YWluX2ZyYW1lX25vdF9leHBlY3RlZF9zb29uKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc19i
b29sKCk7IH0KKyAgYm9vbCBoYXNfd2FudHNfYmVnaW5fbWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWQo
KSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIGJvb2wgd2FudHNfYmVnaW5f
bWFpbl9mcmFtZV9ub3RfZXhwZWN0ZWQoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS5hc19ib29s
KCk7IH0KKyAgYm9vbCBoYXNfZGlkX2NvbW1pdF9kdXJpbmdfZnJhbWUoKSBjb25zdCB7IHJldHVy
biBhdDwxMT4oKS52YWxpZCgpOyB9CisgIGJvb2wgZGlkX2NvbW1pdF9kdXJpbmdfZnJhbWUoKSBj
b25zdCB7IHJldHVybiBhdDwxMT4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfZGlkX2ludmFs
aWRhdGVfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rKCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkudmFs
aWQoKTsgfQorICBib29sIGRpZF9pbnZhbGlkYXRlX2xheWVyX3RyZWVfZnJhbWVfc2luaygpIGNv
bnN0IHsgcmV0dXJuIGF0PDEyPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19kaWRfcGVyZm9y
bV9pbXBsX3NpZGVfaW52YWxpZGFpb24oKSBjb25zdCB7IHJldHVybiBhdDwxMz4oKS52YWxpZCgp
OyB9CisgIGJvb2wgZGlkX3BlcmZvcm1faW1wbF9zaWRlX2ludmFsaWRhaW9uKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MTM+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2RpZF9wcmVwYXJlX3RpbGVz
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCkudmFsaWQoKTsgfQorICBib29sIGRpZF9wcmVwYXJl
X3RpbGVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTQ+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFz
X2NvbnNlY3V0aXZlX2NoZWNrZXJib2FyZF9hbmltYXRpb25zKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTU+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGNvbnNlY3V0aXZlX2NoZWNrZXJib2FyZF9hbmlt
YXRpb25zKCkgY29uc3QgeyByZXR1cm4gYXQ8MTU+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhh
c19wZW5kaW5nX3N1Ym1pdF9mcmFtZXMoKSBjb25zdCB7IHJldHVybiBhdDwxNj4oKS52YWxpZCgp
OyB9CisgIGludDMyX3QgcGVuZGluZ19zdWJtaXRfZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTY+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19zdWJtaXRfZnJhbWVzX3dpdGhfY3VycmVu
dF9sYXllcl90cmVlX2ZyYW1lX3NpbmsoKSBjb25zdCB7IHJldHVybiBhdDwxNz4oKS52YWxpZCgp
OyB9CisgIGludDMyX3Qgc3VibWl0X2ZyYW1lc193aXRoX2N1cnJlbnRfbGF5ZXJfdHJlZV9mcmFt
ZV9zaW5rKCkgY29uc3QgeyByZXR1cm4gYXQ8MTc+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhh
c19uZWVkc19yZWRyYXcoKSBjb25zdCB7IHJldHVybiBhdDwxOD4oKS52YWxpZCgpOyB9CisgIGJv
b2wgbmVlZHNfcmVkcmF3KCkgY29uc3QgeyByZXR1cm4gYXQ8MTg+KCkuYXNfYm9vbCgpOyB9Cisg
IGJvb2wgaGFzX25lZWRzX3ByZXBhcmVfdGlsZXMoKSBjb25zdCB7IHJldHVybiBhdDwxOT4oKS52
YWxpZCgpOyB9CisgIGJvb2wgbmVlZHNfcHJlcGFyZV90aWxlcygpIGNvbnN0IHsgcmV0dXJuIGF0
PDE5PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19uZWVkc19iZWdpbl9tYWluX2ZyYW1lKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MjA+KCkudmFsaWQoKTsgfQorICBib29sIG5lZWRzX2JlZ2luX21h
aW5fZnJhbWUoKSBjb25zdCB7IHJldHVybiBhdDwyMD4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBo
YXNfbmVlZHNfb25lX2JlZ2luX2ltcGxfZnJhbWUoKSBjb25zdCB7IHJldHVybiBhdDwyMT4oKS52
YWxpZCgpOyB9CisgIGJvb2wgbmVlZHNfb25lX2JlZ2luX2ltcGxfZnJhbWUoKSBjb25zdCB7IHJl
dHVybiBhdDwyMT4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfdmlzaWJsZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDIyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCB2aXNpYmxlKCkgY29uc3QgeyByZXR1
cm4gYXQ8MjI+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2JlZ2luX2ZyYW1lX3NvdXJjZV9w
YXVzZWQoKSBjb25zdCB7IHJldHVybiBhdDwyMz4oKS52YWxpZCgpOyB9CisgIGJvb2wgYmVnaW5f
ZnJhbWVfc291cmNlX3BhdXNlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDIzPigpLmFzX2Jvb2woKTsg
fQorICBib29sIGhhc19jYW5fZHJhdygpIGNvbnN0IHsgcmV0dXJuIGF0PDI0PigpLnZhbGlkKCk7
IH0KKyAgYm9vbCBjYW5fZHJhdygpIGNvbnN0IHsgcmV0dXJuIGF0PDI0PigpLmFzX2Jvb2woKTsg
fQorICBib29sIGhhc19yZXNvdXJjZWxlc3NfZHJhdygpIGNvbnN0IHsgcmV0dXJuIGF0PDI1Pigp
LnZhbGlkKCk7IH0KKyAgYm9vbCByZXNvdXJjZWxlc3NfZHJhdygpIGNvbnN0IHsgcmV0dXJuIGF0
PDI1PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19oYXNfcGVuZGluZ190cmVlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MjY+KCkudmFsaWQoKTsgfQorICBib29sIGhhc19wZW5kaW5nX3RyZWUoKSBj
b25zdCB7IHJldHVybiBhdDwyNj4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfcGVuZGluZ190
cmVlX2lzX3JlYWR5X2Zvcl9hY3RpdmF0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjc+KCkudmFs
aWQoKTsgfQorICBib29sIHBlbmRpbmdfdHJlZV9pc19yZWFkeV9mb3JfYWN0aXZhdGlvbigpIGNv
bnN0IHsgcmV0dXJuIGF0PDI3PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19hY3RpdmVfdHJl
ZV9uZWVkc19maXJzdF9kcmF3KCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg+KCkudmFsaWQoKTsgfQor
ICBib29sIGFjdGl2ZV90cmVlX25lZWRzX2ZpcnN0X2RyYXcoKSBjb25zdCB7IHJldHVybiBhdDwy
OD4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfYWN0aXZlX3RyZWVfaXNfcmVhZHlfdG9fZHJh
dygpIGNvbnN0IHsgcmV0dXJuIGF0PDI5PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBhY3RpdmVfdHJl
ZV9pc19yZWFkeV90b19kcmF3KCkgY29uc3QgeyByZXR1cm4gYXQ8Mjk+KCkuYXNfYm9vbCgpOyB9
CisgIGJvb2wgaGFzX2RpZF9jcmVhdGVfYW5kX2luaXRpYWxpemVfZmlyc3RfbGF5ZXJfdHJlZV9m
cmFtZV9zaW5rKCkgY29uc3QgeyByZXR1cm4gYXQ8MzA+KCkudmFsaWQoKTsgfQorICBib29sIGRp
ZF9jcmVhdGVfYW5kX2luaXRpYWxpemVfZmlyc3RfbGF5ZXJfdHJlZV9mcmFtZV9zaW5rKCkgY29u
c3QgeyByZXR1cm4gYXQ8MzA+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3RyZWVfcHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiBhdDwzMT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdHJlZV9w
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBo
YXNfc2Nyb2xsX2hhbmRsZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwzMj4oKS52YWxpZCgp
OyB9CisgIGludDMyX3Qgc2Nyb2xsX2hhbmRsZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwz
Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2NyaXRpY2FsX2JlZ2luX21haW5fZnJhbWVf
dG9fYWN0aXZhdGVfaXNfZmFzdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDMzPigpLnZhbGlkKCk7IH0K
KyAgYm9vbCBjcml0aWNhbF9iZWdpbl9tYWluX2ZyYW1lX3RvX2FjdGl2YXRlX2lzX2Zhc3QoKSBj
b25zdCB7IHJldHVybiBhdDwzMz4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfbWFpbl90aHJl
YWRfbWlzc2VkX2xhc3RfZGVhZGxpbmUoKSBjb25zdCB7IHJldHVybiBhdDwzND4oKS52YWxpZCgp
OyB9CisgIGJvb2wgbWFpbl90aHJlYWRfbWlzc2VkX2xhc3RfZGVhZGxpbmUoKSBjb25zdCB7IHJl
dHVybiBhdDwzND4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfc2tpcF9uZXh0X2JlZ2luX21h
aW5fZnJhbWVfdG9fcmVkdWNlX2xhdGVuY3koKSBjb25zdCB7IHJldHVybiBhdDwzNT4oKS52YWxp
ZCgpOyB9CisgIGJvb2wgc2tpcF9uZXh0X2JlZ2luX21haW5fZnJhbWVfdG9fcmVkdWNlX2xhdGVu
Y3koKSBjb25zdCB7IHJldHVybiBhdDwzNT4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfdmlk
ZW9fbmVlZHNfYmVnaW5fZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MzY+KCkudmFsaWQoKTsg
fQorICBib29sIHZpZGVvX25lZWRzX2JlZ2luX2ZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM2
PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19kZWZlcl9iZWdpbl9tYWluX2ZyYW1lKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mzc+KCkudmFsaWQoKTsgfQorICBib29sIGRlZmVyX2JlZ2luX21haW5f
ZnJhbWUoKSBjb25zdCB7IHJldHVybiBhdDwzNz4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNf
bGFzdF9jb21taXRfaGFkX25vX3VwZGF0ZXMoKSBjb25zdCB7IHJldHVybiBhdDwzOD4oKS52YWxp
ZCgpOyB9CisgIGJvb2wgbGFzdF9jb21taXRfaGFkX25vX3VwZGF0ZXMoKSBjb25zdCB7IHJldHVy
biBhdDwzOD4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfZGlkX2RyYXdfaW5fbGFzdF9mcmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM5PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBkaWRfZHJhd19p
bl9sYXN0X2ZyYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mzk+KCkuYXNfYm9vbCgpOyB9CisgIGJv
b2wgaGFzX2RpZF9zdWJtaXRfaW5fbGFzdF9mcmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQwPigp
LnZhbGlkKCk7IH0KKyAgYm9vbCBkaWRfc3VibWl0X2luX2xhc3RfZnJhbWUoKSBjb25zdCB7IHJl
dHVybiBhdDw0MD4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfbmVlZHNfaW1wbF9zaWRlX2lu
dmFsaWRhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDQxPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBu
ZWVkc19pbXBsX3NpZGVfaW52YWxpZGF0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8NDE+KCkuYXNf
Ym9vbCgpOyB9CisgIGJvb2wgaGFzX2N1cnJlbnRfcGVuZGluZ190cmVlX2lzX2ltcGxfc2lkZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDQyPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBjdXJyZW50X3BlbmRp
bmdfdHJlZV9pc19pbXBsX3NpZGUoKSBjb25zdCB7IHJldHVybiBhdDw0Mj4oKS5hc19ib29sKCk7
IH0KKyAgYm9vbCBoYXNfcHJldmlvdXNfcGVuZGluZ190cmVlX3dhc19pbXBsX3NpZGUoKSBjb25z
dCB7IHJldHVybiBhdDw0Mz4oKS52YWxpZCgpOyB9CisgIGJvb2wgcHJldmlvdXNfcGVuZGluZ190
cmVlX3dhc19pbXBsX3NpZGUoKSBjb25zdCB7IHJldHVybiBhdDw0Mz4oKS5hc19ib29sKCk7IH0K
KyAgYm9vbCBoYXNfcHJvY2Vzc2luZ19hbmltYXRpb25fd29ya2xldHNfZm9yX2FjdGl2ZV90cmVl
KCkgY29uc3QgeyByZXR1cm4gYXQ8NDQ+KCkudmFsaWQoKTsgfQorICBib29sIHByb2Nlc3Npbmdf
YW5pbWF0aW9uX3dvcmtsZXRzX2Zvcl9hY3RpdmVfdHJlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ0
PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19wcm9jZXNzaW5nX2FuaW1hdGlvbl93b3JrbGV0
c19mb3JfcGVuZGluZ190cmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NDU+KCkudmFsaWQoKTsgfQor
ICBib29sIHByb2Nlc3NpbmdfYW5pbWF0aW9uX3dvcmtsZXRzX2Zvcl9wZW5kaW5nX3RyZWUoKSBj
b25zdCB7IHJldHVybiBhdDw0NT4oKS5hc19ib29sKCk7IH0KKyAgYm9vbCBoYXNfcHJvY2Vzc2lu
Z19wYWludF93b3JrbGV0c19mb3JfcGVuZGluZ190cmVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NDY+
KCkudmFsaWQoKTsgfQorICBib29sIHByb2Nlc3NpbmdfcGFpbnRfd29ya2xldHNfZm9yX3BlbmRp
bmdfdHJlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ2PigpLmFzX2Jvb2woKTsgfQorfTsKKworY2xh
c3MgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlIDogcHVibGljIDo6cHJv
dG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDaHJvbWVDb21w
b3NpdG9yU3RhdGVNYWNoaW5lX01pbm9yU3RhdGVfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qg
eworICAgIGtDb21taXRDb3VudEZpZWxkTnVtYmVyID0gMSwKKyAgICBrQ3VycmVudEZyYW1lTnVt
YmVyRmllbGROdW1iZXIgPSAyLAorICAgIGtMYXN0RnJhbWVOdW1iZXJTdWJtaXRQZXJmb3JtZWRG
aWVsZE51bWJlciA9IDMsCisgICAga0xhc3RGcmFtZU51bWJlckRyYXdQZXJmb3JtZWRGaWVsZE51
bWJlciA9IDQsCisgICAga0xhc3RGcmFtZU51bWJlckJlZ2luTWFpbkZyYW1lU2VudEZpZWxkTnVt
YmVyID0gNSwKKyAgICBrRGlkRHJhd0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrRGlkU2VuZEJlZ2lu
TWFpbkZyYW1lRm9yQ3VycmVudEZyYW1lRmllbGROdW1iZXIgPSA3LAorICAgIGtEaWROb3RpZnlC
ZWdpbk1haW5GcmFtZU5vdEV4cGVjdGVkVW50aWxGaWVsZE51bWJlciA9IDgsCisgICAga0RpZE5v
dGlmeUJlZ2luTWFpbkZyYW1lTm90RXhwZWN0ZWRTb29uRmllbGROdW1iZXIgPSA5LAorICAgIGtX
YW50c0JlZ2luTWFpbkZyYW1lTm90RXhwZWN0ZWRGaWVsZE51bWJlciA9IDEwLAorICAgIGtEaWRD
b21taXREdXJpbmdGcmFtZUZpZWxkTnVtYmVyID0gMTEsCisgICAga0RpZEludmFsaWRhdGVMYXll
clRyZWVGcmFtZVNpbmtGaWVsZE51bWJlciA9IDEyLAorICAgIGtEaWRQZXJmb3JtSW1wbFNpZGVJ
bnZhbGlkYWlvbkZpZWxkTnVtYmVyID0gMTMsCisgICAga0RpZFByZXBhcmVUaWxlc0ZpZWxkTnVt
YmVyID0gMTQsCisgICAga0NvbnNlY3V0aXZlQ2hlY2tlcmJvYXJkQW5pbWF0aW9uc0ZpZWxkTnVt
YmVyID0gMTUsCisgICAga1BlbmRpbmdTdWJtaXRGcmFtZXNGaWVsZE51bWJlciA9IDE2LAorICAg
IGtTdWJtaXRGcmFtZXNXaXRoQ3VycmVudExheWVyVHJlZUZyYW1lU2lua0ZpZWxkTnVtYmVyID0g
MTcsCisgICAga05lZWRzUmVkcmF3RmllbGROdW1iZXIgPSAxOCwKKyAgICBrTmVlZHNQcmVwYXJl
VGlsZXNGaWVsZE51bWJlciA9IDE5LAorICAgIGtOZWVkc0JlZ2luTWFpbkZyYW1lRmllbGROdW1i
ZXIgPSAyMCwKKyAgICBrTmVlZHNPbmVCZWdpbkltcGxGcmFtZUZpZWxkTnVtYmVyID0gMjEsCisg
ICAga1Zpc2libGVGaWVsZE51bWJlciA9IDIyLAorICAgIGtCZWdpbkZyYW1lU291cmNlUGF1c2Vk
RmllbGROdW1iZXIgPSAyMywKKyAgICBrQ2FuRHJhd0ZpZWxkTnVtYmVyID0gMjQsCisgICAga1Jl
c291cmNlbGVzc0RyYXdGaWVsZE51bWJlciA9IDI1LAorICAgIGtIYXNQZW5kaW5nVHJlZUZpZWxk
TnVtYmVyID0gMjYsCisgICAga1BlbmRpbmdUcmVlSXNSZWFkeUZvckFjdGl2YXRpb25GaWVsZE51
bWJlciA9IDI3LAorICAgIGtBY3RpdmVUcmVlTmVlZHNGaXJzdERyYXdGaWVsZE51bWJlciA9IDI4
LAorICAgIGtBY3RpdmVUcmVlSXNSZWFkeVRvRHJhd0ZpZWxkTnVtYmVyID0gMjksCisgICAga0Rp
ZENyZWF0ZUFuZEluaXRpYWxpemVGaXJzdExheWVyVHJlZUZyYW1lU2lua0ZpZWxkTnVtYmVyID0g
MzAsCisgICAga1RyZWVQcmlvcml0eUZpZWxkTnVtYmVyID0gMzEsCisgICAga1Njcm9sbEhhbmRs
ZXJTdGF0ZUZpZWxkTnVtYmVyID0gMzIsCisgICAga0NyaXRpY2FsQmVnaW5NYWluRnJhbWVUb0Fj
dGl2YXRlSXNGYXN0RmllbGROdW1iZXIgPSAzMywKKyAgICBrTWFpblRocmVhZE1pc3NlZExhc3RE
ZWFkbGluZUZpZWxkTnVtYmVyID0gMzQsCisgICAga1NraXBOZXh0QmVnaW5NYWluRnJhbWVUb1Jl
ZHVjZUxhdGVuY3lGaWVsZE51bWJlciA9IDM1LAorICAgIGtWaWRlb05lZWRzQmVnaW5GcmFtZXNG
aWVsZE51bWJlciA9IDM2LAorICAgIGtEZWZlckJlZ2luTWFpbkZyYW1lRmllbGROdW1iZXIgPSAz
NywKKyAgICBrTGFzdENvbW1pdEhhZE5vVXBkYXRlc0ZpZWxkTnVtYmVyID0gMzgsCisgICAga0Rp
ZERyYXdJbkxhc3RGcmFtZUZpZWxkTnVtYmVyID0gMzksCisgICAga0RpZFN1Ym1pdEluTGFzdEZy
YW1lRmllbGROdW1iZXIgPSA0MCwKKyAgICBrTmVlZHNJbXBsU2lkZUludmFsaWRhdGlvbkZpZWxk
TnVtYmVyID0gNDEsCisgICAga0N1cnJlbnRQZW5kaW5nVHJlZUlzSW1wbFNpZGVGaWVsZE51bWJl
ciA9IDQyLAorICAgIGtQcmV2aW91c1BlbmRpbmdUcmVlV2FzSW1wbFNpZGVGaWVsZE51bWJlciA9
IDQzLAorICAgIGtQcm9jZXNzaW5nQW5pbWF0aW9uV29ya2xldHNGb3JBY3RpdmVUcmVlRmllbGRO
dW1iZXIgPSA0NCwKKyAgICBrUHJvY2Vzc2luZ0FuaW1hdGlvbldvcmtsZXRzRm9yUGVuZGluZ1Ry
ZWVGaWVsZE51bWJlciA9IDQ1LAorICAgIGtQcm9jZXNzaW5nUGFpbnRXb3JrbGV0c0ZvclBlbmRp
bmdUcmVlRmllbGROdW1iZXIgPSA0NiwKKyAgfTsKKyAgdXNpbmcgVHJlZVByaW9yaXR5ID0gOjpw
ZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlu
b3JTdGF0ZV9UcmVlUHJpb3JpdHk7CisgIHVzaW5nIFNjcm9sbEhhbmRsZXJTdGF0ZSA9IDo6cGVy
ZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9y
U3RhdGVfU2Nyb2xsSGFuZGxlclN0YXRlOworICBzdGF0aWMgY29uc3QgVHJlZVByaW9yaXR5IFRS
RUVfUFJJT1JJVFlfVU5TUEVDSUZJRUQgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01p
bm9yU3RhdGVfVHJlZVByaW9yaXR5X1RSRUVfUFJJT1JJVFlfVU5TUEVDSUZJRUQ7CisgIHN0YXRp
YyBjb25zdCBUcmVlUHJpb3JpdHkgVFJFRV9QUklPUklUWV9TQU1FX1BSSU9SSVRZX0ZPUl9CT1RI
X1RSRUVTID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlv
cml0eV9UUkVFX1BSSU9SSVRZX1NBTUVfUFJJT1JJVFlfRk9SX0JPVEhfVFJFRVM7CisgIHN0YXRp
YyBjb25zdCBUcmVlUHJpb3JpdHkgVFJFRV9QUklPUklUWV9TTU9PVEhORVNTX1RBS0VTX1BSSU9S
SVRZID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NaW5vclN0YXRlX1RyZWVQcmlvcml0
eV9UUkVFX1BSSU9SSVRZX1NNT09USE5FU1NfVEFLRVNfUFJJT1JJVFk7CisgIHN0YXRpYyBjb25z
dCBUcmVlUHJpb3JpdHkgVFJFRV9QUklPUklUWV9ORVdfQ09OVEVOVF9UQUtFU19QUklPUklUWSA9
IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHlfVFJF
RV9QUklPUklUWV9ORVdfQ09OVEVOVF9UQUtFU19QUklPUklUWTsKKyAgc3RhdGljIGNvbnN0IFNj
cm9sbEhhbmRsZXJTdGF0ZSBTQ1JPTExfSEFORExFUl9VTlNQRUNJRklFRCA9IENocm9tZUNvbXBv
c2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9TY3JvbGxIYW5kbGVyU3RhdGVfU0NST0xMX0hB
TkRMRVJfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBTY3JvbGxIYW5kbGVyU3RhdGUgU0NS
T0xMX0FGRkVDVFNfU0NST0xMX0hBTkRMRVIgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5l
X01pbm9yU3RhdGVfU2Nyb2xsSGFuZGxlclN0YXRlX1NDUk9MTF9BRkZFQ1RTX1NDUk9MTF9IQU5E
TEVSOworICBzdGF0aWMgY29uc3QgU2Nyb2xsSGFuZGxlclN0YXRlIFNDUk9MTF9ET0VTX05PVF9B
RkZFQ1RfU0NST0xMX0hBTkRMRVIgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01pbm9y
U3RhdGVfU2Nyb2xsSGFuZGxlclN0YXRlX1NDUk9MTF9ET0VTX05PVF9BRkZFQ1RfU0NST0xMX0hB
TkRMRVI7CisgIHZvaWQgc2V0X2NvbW1pdF9jb3VudChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jdXJyZW50X2ZyYW1lX251bWJl
cihpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9sYXN0X2ZyYW1lX251bWJlcl9zdWJtaXRfcGVyZm9ybWVkKGludDMyX3QgdmFsdWUp
IHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xhc3RfZnJh
bWVfbnVtYmVyX2RyYXdfcGVyZm9ybWVkKGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xhc3RfZnJhbWVfbnVtYmVyX2JlZ2luX21h
aW5fZnJhbWVfc2VudChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9kaWRfZHJhdyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlu
eVZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGlkX3NlbmRfYmVnaW5fbWFpbl9m
cmFtZV9mb3JfY3VycmVudF9mcmFtZShib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhcklu
dCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1l
X25vdF9leHBlY3RlZF91bnRpbChib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg4
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGlkX25vdGlmeV9iZWdpbl9tYWluX2ZyYW1lX25v
dF9leHBlY3RlZF9zb29uKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDksIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF93YW50c19iZWdpbl9tYWluX2ZyYW1lX25vdF9leHBlY3Rl
ZChib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxMCwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X2RpZF9jb21taXRfZHVyaW5nX2ZyYW1lKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBl
bmRUaW55VmFySW50KDExLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGlkX2ludmFsaWRhdGVf
bGF5ZXJfdHJlZV9mcmFtZV9zaW5rKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50
KDEyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZGlkX3BlcmZvcm1faW1wbF9zaWRlX2ludmFs
aWRhaW9uKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEzLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfZGlkX3ByZXBhcmVfdGlsZXMoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVu
ZFRpbnlWYXJJbnQoMTQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9jb25zZWN1dGl2ZV9jaGVj
a2VyYm9hcmRfYW5pbWF0aW9ucyhpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE1
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcGVuZGluZ19zdWJtaXRfZnJhbWVzKGludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9z
dWJtaXRfZnJhbWVzX3dpdGhfY3VycmVudF9sYXllcl90cmVlX2ZyYW1lX3NpbmsoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25l
ZWRzX3JlZHJhdyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxOCwgdmFsdWUp
OworICB9CisgIHZvaWQgc2V0X25lZWRzX3ByZXBhcmVfdGlsZXMoYm9vbCB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoMTksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uZWVkc19iZWdp
bl9tYWluX2ZyYW1lKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDIwLCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmVlZHNfb25lX2JlZ2luX2ltcGxfZnJhbWUoYm9vbCB2YWx1
ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMjEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF92
aXNpYmxlKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDIyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfYmVnaW5fZnJhbWVfc291cmNlX3BhdXNlZChib29sIHZhbHVlKSB7Cisg
ICAgQXBwZW5kVGlueVZhckludCgyMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2Nhbl9kcmF3
KGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDI0LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcmVzb3VyY2VsZXNzX2RyYXcoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlW
YXJJbnQoMjUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9oYXNfcGVuZGluZ190cmVlKGJvb2wg
dmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDI2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfcGVuZGluZ190cmVlX2lzX3JlYWR5X2Zvcl9hY3RpdmF0aW9uKGJvb2wgdmFsdWUpIHsKKyAg
ICBBcHBlbmRUaW55VmFySW50KDI3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWN0aXZlX3Ry
ZWVfbmVlZHNfZmlyc3RfZHJhdyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgy
OCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2FjdGl2ZV90cmVlX2lzX3JlYWR5X3RvX2RyYXco
Ym9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMjksIHZhbHVlKTsKKyAgfQorICB2
b2lkIHNldF9kaWRfY3JlYXRlX2FuZF9pbml0aWFsaXplX2ZpcnN0X2xheWVyX3RyZWVfZnJhbWVf
c2luayhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgzMCwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3RyZWVfcHJpb3JpdHkoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNo
cm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9UcmVlUHJpb3JpdHkgdmFsdWUp
IHsKKyAgICBBcHBlbmRUaW55VmFySW50KDMxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc2Ny
b2xsX2hhbmRsZXJfc3RhdGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUNvbXBv
c2l0b3JTdGF0ZU1hY2hpbmVfTWlub3JTdGF0ZV9TY3JvbGxIYW5kbGVyU3RhdGUgdmFsdWUpIHsK
KyAgICBBcHBlbmRUaW55VmFySW50KDMyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY3JpdGlj
YWxfYmVnaW5fbWFpbl9mcmFtZV90b19hY3RpdmF0ZV9pc19mYXN0KGJvb2wgdmFsdWUpIHsKKyAg
ICBBcHBlbmRUaW55VmFySW50KDMzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbWFpbl90aHJl
YWRfbWlzc2VkX2xhc3RfZGVhZGxpbmUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJ
bnQoMzQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9za2lwX25leHRfYmVnaW5fbWFpbl9mcmFt
ZV90b19yZWR1Y2VfbGF0ZW5jeShib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgz
NSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3ZpZGVvX25lZWRzX2JlZ2luX2ZyYW1lcyhib29s
IHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgzNiwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2RlZmVyX2JlZ2luX21haW5fZnJhbWUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlW
YXJJbnQoMzcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sYXN0X2NvbW1pdF9oYWRfbm9fdXBk
YXRlcyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgzOCwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2RpZF9kcmF3X2luX2xhc3RfZnJhbWUoYm9vbCB2YWx1ZSkgeworICAgIEFw
cGVuZFRpbnlWYXJJbnQoMzksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kaWRfc3VibWl0X2lu
X2xhc3RfZnJhbWUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNDAsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9uZWVkc19pbXBsX3NpZGVfaW52YWxpZGF0aW9uKGJvb2wgdmFs
dWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDQxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
Y3VycmVudF9wZW5kaW5nX3RyZWVfaXNfaW1wbF9zaWRlKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBl
bmRUaW55VmFySW50KDQyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJldmlvdXNfcGVuZGlu
Z190cmVlX3dhc19pbXBsX3NpZGUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQo
NDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wcm9jZXNzaW5nX2FuaW1hdGlvbl93b3JrbGV0
c19mb3JfYWN0aXZlX3RyZWUoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNDQs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9wcm9jZXNzaW5nX2FuaW1hdGlvbl93b3JrbGV0c19m
b3JfcGVuZGluZ190cmVlKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDQ1LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJvY2Vzc2luZ19wYWludF93b3JrbGV0c19mb3JfcGVu
ZGluZ190cmVlKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDQ2LCB2YWx1ZSk7
CisgIH0KK307CisKK2NsYXNzIENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0
ZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4gewor
IHB1YmxpYzoKKyAgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0RlY29k
ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2Rlcihk
YXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFq
b3JTdGF0ZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0
ZV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uZXh0X2FjdGlvbigp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IG5leHRfYWN0aW9u
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2JlZ2lu
X2ltcGxfZnJhbWVfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAg
aW50MzJfdCBiZWdpbl9pbXBsX2ZyYW1lX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2JlZ2luX21haW5fZnJhbWVfc3RhdGUoKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBiZWdpbl9tYWluX2ZyYW1lX3N0
YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2xh
eWVyX3RyZWVfZnJhbWVfc2lua19zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQo
KTsgfQorICBpbnQzMl90IGxheWVyX3RyZWVfZnJhbWVfc2lua19zdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19mb3JjZWRfcmVkcmF3X3N0YXRl
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZm9yY2VkX3Jl
ZHJhd19zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50MzIoKTsgfQorfTsKKwor
Y2xhc3MgQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlIDogcHVibGljIDo6
cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDaHJvbWVD
b21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRGVjb2RlcjsKKyAgZW51bSA6IGludDMy
X3QgeworICAgIGtOZXh0QWN0aW9uRmllbGROdW1iZXIgPSAxLAorICAgIGtCZWdpbkltcGxGcmFt
ZVN0YXRlRmllbGROdW1iZXIgPSAyLAorICAgIGtCZWdpbk1haW5GcmFtZVN0YXRlRmllbGROdW1i
ZXIgPSAzLAorICAgIGtMYXllclRyZWVGcmFtZVNpbmtTdGF0ZUZpZWxkTnVtYmVyID0gNCwKKyAg
ICBrRm9yY2VkUmVkcmF3U3RhdGVGaWVsZE51bWJlciA9IDUsCisgIH07CisgIHVzaW5nIEJlZ2lu
SW1wbEZyYW1lU3RhdGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6Q2hyb21lQ29tcG9z
aXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGU7CisgIHVzaW5n
IEJlZ2luTWFpbkZyYW1lU3RhdGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6Q2hyb21l
Q29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGU7Cisg
IHVzaW5nIExheWVyVHJlZUZyYW1lU2lua1N0YXRlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OkNocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFt
ZVNpbmtTdGF0ZTsKKyAgdXNpbmcgRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGUgPSA6OnBlcmZl
dHRvOjpwcm90b3M6OnBiemVybzo6Q2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0
YXRlX0ZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlOworICBzdGF0aWMgY29uc3QgQmVnaW5JbXBs
RnJhbWVTdGF0ZSBCRUdJTl9JTVBMX0ZSQU1FX1VOU1BFQ0lGSUVEID0gQ2hyb21lQ29tcG9zaXRv
clN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGVfQkVHSU5fSU1QTF9G
UkFNRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IEJlZ2luSW1wbEZyYW1lU3RhdGUgQkVH
SU5fSU1QTF9GUkFNRV9JRExFID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0
YXRlX0JlZ2luSW1wbEZyYW1lU3RhdGVfQkVHSU5fSU1QTF9GUkFNRV9JRExFOworICBzdGF0aWMg
Y29uc3QgQmVnaW5JbXBsRnJhbWVTdGF0ZSBCRUdJTl9JTVBMX0ZSQU1FX0lOU0lERV9CRUdJTl9G
UkFNRSA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxG
cmFtZVN0YXRlX0JFR0lOX0lNUExfRlJBTUVfSU5TSURFX0JFR0lOX0ZSQU1FOworICBzdGF0aWMg
Y29uc3QgQmVnaW5JbXBsRnJhbWVTdGF0ZSBCRUdJTl9JTVBMX0ZSQU1FX0lOU0lERV9ERUFETElO
RSA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbkltcGxGcmFt
ZVN0YXRlX0JFR0lOX0lNUExfRlJBTUVfSU5TSURFX0RFQURMSU5FOworICBzdGF0aWMgY29uc3Qg
QmVnaW5NYWluRnJhbWVTdGF0ZSBCRUdJTl9NQUlOX0ZSQU1FX1VOU1BFQ0lGSUVEID0gQ2hyb21l
Q29tcG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGVfQkVH
SU5fTUFJTl9GUkFNRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IEJlZ2luTWFpbkZyYW1l
U3RhdGUgQkVHSU5fTUFJTl9GUkFNRV9JRExFID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGlu
ZV9NYWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGVfQkVHSU5fTUFJTl9GUkFNRV9JRExFOwor
ICBzdGF0aWMgY29uc3QgQmVnaW5NYWluRnJhbWVTdGF0ZSBCRUdJTl9NQUlOX0ZSQU1FX1NFTlQg
PSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5NYWluRnJhbWVT
dGF0ZV9CRUdJTl9NQUlOX0ZSQU1FX1NFTlQ7CisgIHN0YXRpYyBjb25zdCBCZWdpbk1haW5GcmFt
ZVN0YXRlIEJFR0lOX01BSU5fRlJBTUVfUkVBRFlfVE9fQ09NTUlUID0gQ2hyb21lQ29tcG9zaXRv
clN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0JlZ2luTWFpbkZyYW1lU3RhdGVfQkVHSU5fTUFJTl9G
UkFNRV9SRUFEWV9UT19DT01NSVQ7CisgIHN0YXRpYyBjb25zdCBMYXllclRyZWVGcmFtZVNpbmtT
dGF0ZSBMQVlFUl9UUkVFX0ZSQU1FX1VOU1BFQ0lGSUVEID0gQ2hyb21lQ29tcG9zaXRvclN0YXRl
TWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xBWUVSX1RSRUVfRlJB
TUVfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBMYXllclRyZWVGcmFtZVNpbmtTdGF0ZSBM
QVlFUl9UUkVFX0ZSQU1FX05PTkUgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9y
U3RhdGVfTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGVfTEFZRVJfVFJFRV9GUkFNRV9OT05FOworICBz
dGF0aWMgY29uc3QgTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGUgTEFZRVJfVFJFRV9GUkFNRV9BQ1RJ
VkUgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVlRnJh
bWVTaW5rU3RhdGVfTEFZRVJfVFJFRV9GUkFNRV9BQ1RJVkU7CisgIHN0YXRpYyBjb25zdCBMYXll
clRyZWVGcmFtZVNpbmtTdGF0ZSBMQVlFUl9UUkVFX0ZSQU1FX0NSRUFUSU5HID0gQ2hyb21lQ29t
cG9zaXRvclN0YXRlTWFjaGluZV9NYWpvclN0YXRlX0xheWVyVHJlZUZyYW1lU2lua1N0YXRlX0xB
WUVSX1RSRUVfRlJBTUVfQ1JFQVRJTkc7CisgIHN0YXRpYyBjb25zdCBMYXllclRyZWVGcmFtZVNp
bmtTdGF0ZSBMQVlFUl9UUkVFX0ZSQU1FX1dBSVRJTkdfRk9SX0ZJUlNUX0NPTU1JVCA9IENocm9t
ZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9MYXllclRyZWVGcmFtZVNpbmtTdGF0
ZV9MQVlFUl9UUkVFX0ZSQU1FX1dBSVRJTkdfRk9SX0ZJUlNUX0NPTU1JVDsKKyAgc3RhdGljIGNv
bnN0IExheWVyVHJlZUZyYW1lU2lua1N0YXRlIExBWUVSX1RSRUVfRlJBTUVfV0FJVElOR19GT1Jf
RklSU1RfQUNUSVZBVElPTiA9IENocm9tZUNvbXBvc2l0b3JTdGF0ZU1hY2hpbmVfTWFqb3JTdGF0
ZV9MYXllclRyZWVGcmFtZVNpbmtTdGF0ZV9MQVlFUl9UUkVFX0ZSQU1FX1dBSVRJTkdfRk9SX0ZJ
UlNUX0FDVElWQVRJT047CisgIHN0YXRpYyBjb25zdCBGb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0
ZSBGT1JDRURfUkVEUkFXX1VOU1BFQ0lGSUVEID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFjaGlu
ZV9NYWpvclN0YXRlX0ZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlX0ZPUkNFRF9SRURSQVdfVU5T
UEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBGb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZSBGT1JD
RURfUkVEUkFXX0lETEUgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVf
Rm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19JRExFOworICBzdGF0aWMg
Y29uc3QgRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGUgRk9SQ0VEX1JFRFJBV19XQUlUSU5HX0ZP
Ul9DT01NSVQgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2Vk
UmVkcmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19XQUlUSU5HX0ZPUl9DT01NSVQ7Cisg
IHN0YXRpYyBjb25zdCBGb3JjZWRSZWRyYXdPblRpbWVvdXRTdGF0ZSBGT1JDRURfUkVEUkFXX1dB
SVRJTkdfRk9SX0FDVElWQVRJT04gPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lX01ham9y
U3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGVfRk9SQ0VEX1JFRFJBV19XQUlUSU5HX0ZP
Ul9BQ1RJVkFUSU9OOworICBzdGF0aWMgY29uc3QgRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGUg
Rk9SQ0VEX1JFRFJBV19XQUlUSU5HX0ZPUl9EUkFXID0gQ2hyb21lQ29tcG9zaXRvclN0YXRlTWFj
aGluZV9NYWpvclN0YXRlX0ZvcmNlZFJlZHJhd09uVGltZW91dFN0YXRlX0ZPUkNFRF9SRURSQVdf
V0FJVElOR19GT1JfRFJBVzsKKyAgdm9pZCBzZXRfbmV4dF9hY3Rpb24oOjpwZXJmZXR0bzo6cHJv
dG9zOjpwYnplcm86OkNocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJBY3Rpb24gdmFsdWUpIHsKKyAg
ICBBcHBlbmRUaW55VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9iZWdpbl9pbXBs
X2ZyYW1lX3N0YXRlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVDb21wb3NpdG9y
U3RhdGVNYWNoaW5lX01ham9yU3RhdGVfQmVnaW5JbXBsRnJhbWVTdGF0ZSB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2JlZ2luX21haW5f
ZnJhbWVfc3RhdGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUNvbXBvc2l0b3JT
dGF0ZU1hY2hpbmVfTWFqb3JTdGF0ZV9CZWdpbk1haW5GcmFtZVN0YXRlIHZhbHVlKSB7CisgICAg
QXBwZW5kVGlueVZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbGF5ZXJfdHJlZV9m
cmFtZV9zaW5rX3N0YXRlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVDb21wb3Np
dG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfTGF5ZXJUcmVlRnJhbWVTaW5rU3RhdGUgdmFsdWUp
IHsKKyAgICBBcHBlbmRUaW55VmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9mb3Jj
ZWRfcmVkcmF3X3N0YXRlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVDb21wb3Np
dG9yU3RhdGVNYWNoaW5lX01ham9yU3RhdGVfRm9yY2VkUmVkcmF3T25UaW1lb3V0U3RhdGUgdmFs
dWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDUsIHZhbHVlKTsKKyAgfQorfTsKKworY2xhc3Mg
Q2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMTcsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQ2hyb21lQ29tcG9zaXRv
clNjaGVkdWxlclN0YXRlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENocm9tZUNvbXBv
c2l0b3JTY2hlZHVsZXJTdGF0ZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEo
KSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJT
dGF0ZV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19zdGF0ZV9tYWNo
aW5lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIHN0YXRlX21hY2hpbmUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2J5dGVz
KCk7IH0KKyAgYm9vbCBoYXNfb2JzZXJ2aW5nX2JlZ2luX2ZyYW1lX3NvdXJjZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBib29sIG9ic2VydmluZ19iZWdpbl9mcmFtZV9z
b3VyY2UoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19i
ZWdpbl9pbXBsX2ZyYW1lX2RlYWRsaW5lX3Rhc2soKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgYm9vbCBiZWdpbl9pbXBsX2ZyYW1lX2RlYWRsaW5lX3Rhc2soKSBjb25zdCB7
IHJldHVybiBhdDwzPigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19wZW5kaW5nX2JlZ2luX2Zy
YW1lX3Rhc2soKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBwZW5k
aW5nX2JlZ2luX2ZyYW1lX3Rhc2soKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX2Jvb2woKTsg
fQorICBib29sIGhhc19za2lwcGVkX2xhc3RfZnJhbWVfbWlzc2VkX2V4Y2VlZGVkX2RlYWRsaW5l
KCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIGJvb2wgc2tpcHBlZF9sYXN0
X2ZyYW1lX21pc3NlZF9leGNlZWRlZF9kZWFkbGluZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCku
YXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3NraXBwZWRfbGFzdF9mcmFtZV90b19yZWR1Y2VfbGF0
ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBib29sIHNraXBwZWRf
bGFzdF9mcmFtZV90b19yZWR1Y2VfbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNf
Ym9vbCgpOyB9CisgIGJvb2wgaGFzX2luc2lkZV9hY3Rpb24oKSBjb25zdCB7IHJldHVybiBhdDw3
PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBpbnNpZGVfYWN0aW9uKCkgY29uc3QgeyByZXR1cm4g
YXQ8Nz4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2RlYWRsaW5lX21vZGUoKSBjb25zdCB7
IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBkZWFkbGluZV9tb2RlKCkgY29u
c3QgeyByZXR1cm4gYXQ8OD4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2RlYWRsaW5lX3Vz
KCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgZGVhZGxpbmVf
dXMoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfZGVh
ZGxpbmVfc2NoZWR1bGVkX2F0X3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkudmFsaWQoKTsg
fQorICBpbnQ2NF90IGRlYWRsaW5lX3NjaGVkdWxlZF9hdF91cygpIGNvbnN0IHsgcmV0dXJuIGF0
PDEwPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfbm93X3VzKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTE+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IG5vd191cygpIGNvbnN0IHsgcmV0dXJuIGF0
PDExPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfbm93X3RvX2RlYWRsaW5lX2RlbHRhX3Vz
KCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IG5vd190b19k
ZWFkbGluZV9kZWx0YV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDEyPigpLmFzX2ludDY0KCk7IH0K
KyAgYm9vbCBoYXNfbm93X3RvX2RlYWRsaW5lX3NjaGVkdWxlZF9hdF9kZWx0YV91cygpIGNvbnN0
IHsgcmV0dXJuIGF0PDEzPigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBub3dfdG9fZGVhZGxpbmVf
c2NoZWR1bGVkX2F0X2RlbHRhX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkuYXNfaW50NjQo
KTsgfQorICBib29sIGhhc19iZWdpbl9pbXBsX2ZyYW1lX2FyZ3MoKSBjb25zdCB7IHJldHVybiBh
dDwxND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJlZ2luX2ltcGxf
ZnJhbWVfYXJncygpIGNvbnN0IHsgcmV0dXJuIGF0PDE0PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfYmVnaW5fZnJhbWVfb2JzZXJ2ZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwxNT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJlZ2luX2ZyYW1lX29ic2Vy
dmVyX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MTU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19iZWdpbl9mcmFtZV9zb3VyY2Vfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDwxNj4oKS52
YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGJlZ2luX2ZyYW1lX3NvdXJjZV9z
dGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
Y29tcG9zaXRvcl90aW1pbmdfaGlzdG9yeSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE3PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY29tcG9zaXRvcl90aW1pbmdfaGlzdG9y
eSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE3PigpLmFzX2J5dGVzKCk7IH0KK307CisKK2NsYXNzIENo
cm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2Fn
ZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxl
clN0YXRlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrU3RhdGVNYWNoaW5lRmll
bGROdW1iZXIgPSAxLAorICAgIGtPYnNlcnZpbmdCZWdpbkZyYW1lU291cmNlRmllbGROdW1iZXIg
PSAyLAorICAgIGtCZWdpbkltcGxGcmFtZURlYWRsaW5lVGFza0ZpZWxkTnVtYmVyID0gMywKKyAg
ICBrUGVuZGluZ0JlZ2luRnJhbWVUYXNrRmllbGROdW1iZXIgPSA0LAorICAgIGtTa2lwcGVkTGFz
dEZyYW1lTWlzc2VkRXhjZWVkZWREZWFkbGluZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrU2tpcHBl
ZExhc3RGcmFtZVRvUmVkdWNlTGF0ZW5jeUZpZWxkTnVtYmVyID0gNiwKKyAgICBrSW5zaWRlQWN0
aW9uRmllbGROdW1iZXIgPSA3LAorICAgIGtEZWFkbGluZU1vZGVGaWVsZE51bWJlciA9IDgsCisg
ICAga0RlYWRsaW5lVXNGaWVsZE51bWJlciA9IDksCisgICAga0RlYWRsaW5lU2NoZWR1bGVkQXRV
c0ZpZWxkTnVtYmVyID0gMTAsCisgICAga05vd1VzRmllbGROdW1iZXIgPSAxMSwKKyAgICBrTm93
VG9EZWFkbGluZURlbHRhVXNGaWVsZE51bWJlciA9IDEyLAorICAgIGtOb3dUb0RlYWRsaW5lU2No
ZWR1bGVkQXREZWx0YVVzRmllbGROdW1iZXIgPSAxMywKKyAgICBrQmVnaW5JbXBsRnJhbWVBcmdz
RmllbGROdW1iZXIgPSAxNCwKKyAgICBrQmVnaW5GcmFtZU9ic2VydmVyU3RhdGVGaWVsZE51bWJl
ciA9IDE1LAorICAgIGtCZWdpbkZyYW1lU291cmNlU3RhdGVGaWVsZE51bWJlciA9IDE2LAorICAg
IGtDb21wb3NpdG9yVGltaW5nSGlzdG9yeUZpZWxkTnVtYmVyID0gMTcsCisgIH07CisgIHVzaW5n
IEJlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86
OkNocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9k
ZTsKKyAgc3RhdGljIGNvbnN0IEJlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlIERFQURMSU5FX01P
REVfVU5TUEVDSUZJRUQgPSBDaHJvbWVDb21wb3NpdG9yU2NoZWR1bGVyU3RhdGVfQmVnaW5JbXBs
RnJhbWVEZWFkbGluZU1vZGVfREVBRExJTkVfTU9ERV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNv
bnN0IEJlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlIERFQURMSU5FX01PREVfTk9ORSA9IENocm9t
ZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFE
TElORV9NT0RFX05PTkU7CisgIHN0YXRpYyBjb25zdCBCZWdpbkltcGxGcmFtZURlYWRsaW5lTW9k
ZSBERUFETElORV9NT0RFX0lNTUVESUFURSA9IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0
ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZV9ERUFETElORV9NT0RFX0lNTUVESUFURTsKKyAg
c3RhdGljIGNvbnN0IEJlZ2luSW1wbEZyYW1lRGVhZGxpbmVNb2RlIERFQURMSU5FX01PREVfUkVH
VUxBUiA9IENocm9tZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRs
aW5lTW9kZV9ERUFETElORV9NT0RFX1JFR1VMQVI7CisgIHN0YXRpYyBjb25zdCBCZWdpbkltcGxG
cmFtZURlYWRsaW5lTW9kZSBERUFETElORV9NT0RFX0xBVEUgPSBDaHJvbWVDb21wb3NpdG9yU2No
ZWR1bGVyU3RhdGVfQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGVfREVBRExJTkVfTU9ERV9MQVRF
OworICBzdGF0aWMgY29uc3QgQmVnaW5JbXBsRnJhbWVEZWFkbGluZU1vZGUgREVBRExJTkVfTU9E
RV9CTE9DS0VEID0gQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlX0JlZ2luSW1wbEZyYW1l
RGVhZGxpbmVNb2RlX0RFQURMSU5FX01PREVfQkxPQ0tFRDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBDaHJvbWVDb21wb3NpdG9yU3RhdGVNYWNoaW5lPiBUKiBzZXRfc3RhdGVfbWFjaGluZSgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOworICB9CisKKyAgdm9pZCBz
ZXRfb2JzZXJ2aW5nX2JlZ2luX2ZyYW1lX3NvdXJjZShib29sIHZhbHVlKSB7CisgICAgQXBwZW5k
VGlueVZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfYmVnaW5faW1wbF9mcmFtZV9k
ZWFkbGluZV90YXNrKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDMsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9wZW5kaW5nX2JlZ2luX2ZyYW1lX3Rhc2soYm9vbCB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NraXBw
ZWRfbGFzdF9mcmFtZV9taXNzZWRfZXhjZWVkZWRfZGVhZGxpbmUoYm9vbCB2YWx1ZSkgeworICAg
IEFwcGVuZFRpbnlWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NraXBwZWRfbGFz
dF9mcmFtZV90b19yZWR1Y2VfbGF0ZW5jeShib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZh
ckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5zaWRlX2FjdGlvbig6OnBlcmZldHRv
Ojpwcm90b3M6OnBiemVybzo6Q2hyb21lQ29tcG9zaXRvclNjaGVkdWxlckFjdGlvbiB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RlYWRs
aW5lX21vZGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUNvbXBvc2l0b3JTY2hl
ZHVsZXJTdGF0ZV9CZWdpbkltcGxGcmFtZURlYWRsaW5lTW9kZSB2YWx1ZSkgeworICAgIEFwcGVu
ZFRpbnlWYXJJbnQoOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2RlYWRsaW5lX3VzKGludDY0
X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0
X2RlYWRsaW5lX3NjaGVkdWxlZF9hdF91cyhpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDEwLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbm93X3VzKGludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ub3dfdG9fZGVh
ZGxpbmVfZGVsdGFfdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMiwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X25vd190b19kZWFkbGluZV9zY2hlZHVsZWRfYXRfZGVsdGFf
dXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxMywgdmFsdWUpOworICB9Cisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQmVnaW5JbXBsRnJhbWVBcmdzPiBUKiBzZXRfYmVnaW5f
aW1wbF9mcmFtZV9hcmdzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTQp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBCZWdpbkZyYW1lT2JzZXJ2ZXJTdGF0
ZT4gVCogc2V0X2JlZ2luX2ZyYW1lX29ic2VydmVyX3N0YXRlKCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMTUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBC
ZWdpbkZyYW1lU291cmNlU3RhdGU+IFQqIHNldF9iZWdpbl9mcmFtZV9zb3VyY2Vfc3RhdGUoKSB7
CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxNik7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IENvbXBvc2l0b3JUaW1pbmdIaXN0b3J5PiBUKiBzZXRfY29tcG9zaXRv
cl90aW1pbmdfaGlzdG9yeSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDE3
KTsKKyAgfQorCit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBO
YW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQg
YmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9t
ZV9mcmFtZV9yZXBvcnRlci5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9a
ZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfRlJBTUVfUkVQT1JU
RVJfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFD
RV9UUkFDS19FVkVOVF9DSFJPTUVfRlJBTUVfUkVQT1JURVJfUFJPVE9fSF8KKworI2luY2x1ZGUg
PHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9y
ZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKwor
bmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVy
byB7CisKK2VudW0gQ2hyb21lRnJhbWVSZXBvcnRlcl9GcmFtZURyb3BSZWFzb24gOiBpbnQzMl90
OworZW51bSBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0YXRlIDogaW50MzJfdDsKKworZW51bSBDaHJv
bWVGcmFtZVJlcG9ydGVyX1N0YXRlIDogaW50MzJfdCB7CisgIENocm9tZUZyYW1lUmVwb3J0ZXJf
U3RhdGVfU1RBVEVfTk9fVVBEQVRFX0RFU0lSRUQgPSAwLAorICBDaHJvbWVGcmFtZVJlcG9ydGVy
X1N0YXRlX1NUQVRFX1BSRVNFTlRFRF9BTEwgPSAxLAorICBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0
YXRlX1NUQVRFX1BSRVNFTlRFRF9QQVJUSUFMID0gMiwKKyAgQ2hyb21lRnJhbWVSZXBvcnRlcl9T
dGF0ZV9TVEFURV9EUk9QUEVEID0gMywKK307CisKK2NvbnN0IENocm9tZUZyYW1lUmVwb3J0ZXJf
U3RhdGUgQ2hyb21lRnJhbWVSZXBvcnRlcl9TdGF0ZV9NSU4gPSBDaHJvbWVGcmFtZVJlcG9ydGVy
X1N0YXRlX1NUQVRFX05PX1VQREFURV9ERVNJUkVEOworY29uc3QgQ2hyb21lRnJhbWVSZXBvcnRl
cl9TdGF0ZSBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0YXRlX01BWCA9IENocm9tZUZyYW1lUmVwb3J0
ZXJfU3RhdGVfU1RBVEVfRFJPUFBFRDsKKworZW51bSBDaHJvbWVGcmFtZVJlcG9ydGVyX0ZyYW1l
RHJvcFJlYXNvbiA6IGludDMyX3QgeworICBDaHJvbWVGcmFtZVJlcG9ydGVyX0ZyYW1lRHJvcFJl
YXNvbl9SRUFTT05fVU5TUEVDSUZJRUQgPSAwLAorICBDaHJvbWVGcmFtZVJlcG9ydGVyX0ZyYW1l
RHJvcFJlYXNvbl9SRUFTT05fRElTUExBWV9DT01QT1NJVE9SID0gMSwKKyAgQ2hyb21lRnJhbWVS
ZXBvcnRlcl9GcmFtZURyb3BSZWFzb25fUkVBU09OX01BSU5fVEhSRUFEID0gMiwKKyAgQ2hyb21l
RnJhbWVSZXBvcnRlcl9GcmFtZURyb3BSZWFzb25fUkVBU09OX0NMSUVOVF9DT01QT1NJVE9SID0g
MywKK307CisKK2NvbnN0IENocm9tZUZyYW1lUmVwb3J0ZXJfRnJhbWVEcm9wUmVhc29uIENocm9t
ZUZyYW1lUmVwb3J0ZXJfRnJhbWVEcm9wUmVhc29uX01JTiA9IENocm9tZUZyYW1lUmVwb3J0ZXJf
RnJhbWVEcm9wUmVhc29uX1JFQVNPTl9VTlNQRUNJRklFRDsKK2NvbnN0IENocm9tZUZyYW1lUmVw
b3J0ZXJfRnJhbWVEcm9wUmVhc29uIENocm9tZUZyYW1lUmVwb3J0ZXJfRnJhbWVEcm9wUmVhc29u
X01BWCA9IENocm9tZUZyYW1lUmVwb3J0ZXJfRnJhbWVEcm9wUmVhc29uX1JFQVNPTl9DTElFTlRf
Q09NUE9TSVRPUjsKKworY2xhc3MgQ2hyb21lRnJhbWVSZXBvcnRlcl9EZWNvZGVyIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzQsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQ2hyb21l
RnJhbWVSZXBvcnRlcl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDaHJvbWVGcmFtZVJl
cG9ydGVyX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rl
cihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUo
KSkge30KKyAgZXhwbGljaXQgQ2hyb21lRnJhbWVSZXBvcnRlcl9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IHN0YXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQz
MigpOyB9CisgIGJvb2wgaGFzX3JlYXNvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICBpbnQzMl90IHJlYXNvbigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIo
KTsgfQorICBib29sIGhhc19mcmFtZV9zb3VyY2UoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgZnJhbWVfc291cmNlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4o
KS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19mcmFtZV9zZXF1ZW5jZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBmcmFtZV9zZXF1ZW5jZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIENocm9tZUZyYW1l
UmVwb3J0ZXIgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IENocm9tZUZyYW1lUmVwb3J0ZXJfRGVjb2RlcjsKKyAgZW51bSA6IGludDMy
X3QgeworICAgIGtTdGF0ZUZpZWxkTnVtYmVyID0gMSwKKyAgICBrUmVhc29uRmllbGROdW1iZXIg
PSAyLAorICAgIGtGcmFtZVNvdXJjZUZpZWxkTnVtYmVyID0gMywKKyAgICBrRnJhbWVTZXF1ZW5j
ZUZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdXNpbmcgU3RhdGUgPSA6OnBlcmZldHRvOjpwcm90
b3M6OnBiemVybzo6Q2hyb21lRnJhbWVSZXBvcnRlcl9TdGF0ZTsKKyAgdXNpbmcgRnJhbWVEcm9w
UmVhc29uID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUZyYW1lUmVwb3J0ZXJf
RnJhbWVEcm9wUmVhc29uOworICBzdGF0aWMgY29uc3QgU3RhdGUgU1RBVEVfTk9fVVBEQVRFX0RF
U0lSRUQgPSBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0YXRlX1NUQVRFX05PX1VQREFURV9ERVNJUkVE
OworICBzdGF0aWMgY29uc3QgU3RhdGUgU1RBVEVfUFJFU0VOVEVEX0FMTCA9IENocm9tZUZyYW1l
UmVwb3J0ZXJfU3RhdGVfU1RBVEVfUFJFU0VOVEVEX0FMTDsKKyAgc3RhdGljIGNvbnN0IFN0YXRl
IFNUQVRFX1BSRVNFTlRFRF9QQVJUSUFMID0gQ2hyb21lRnJhbWVSZXBvcnRlcl9TdGF0ZV9TVEFU
RV9QUkVTRU5URURfUEFSVElBTDsKKyAgc3RhdGljIGNvbnN0IFN0YXRlIFNUQVRFX0RST1BQRUQg
PSBDaHJvbWVGcmFtZVJlcG9ydGVyX1N0YXRlX1NUQVRFX0RST1BQRUQ7CisgIHN0YXRpYyBjb25z
dCBGcmFtZURyb3BSZWFzb24gUkVBU09OX1VOU1BFQ0lGSUVEID0gQ2hyb21lRnJhbWVSZXBvcnRl
cl9GcmFtZURyb3BSZWFzb25fUkVBU09OX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgRnJh
bWVEcm9wUmVhc29uIFJFQVNPTl9ESVNQTEFZX0NPTVBPU0lUT1IgPSBDaHJvbWVGcmFtZVJlcG9y
dGVyX0ZyYW1lRHJvcFJlYXNvbl9SRUFTT05fRElTUExBWV9DT01QT1NJVE9SOworICBzdGF0aWMg
Y29uc3QgRnJhbWVEcm9wUmVhc29uIFJFQVNPTl9NQUlOX1RIUkVBRCA9IENocm9tZUZyYW1lUmVw
b3J0ZXJfRnJhbWVEcm9wUmVhc29uX1JFQVNPTl9NQUlOX1RIUkVBRDsKKyAgc3RhdGljIGNvbnN0
IEZyYW1lRHJvcFJlYXNvbiBSRUFTT05fQ0xJRU5UX0NPTVBPU0lUT1IgPSBDaHJvbWVGcmFtZVJl
cG9ydGVyX0ZyYW1lRHJvcFJlYXNvbl9SRUFTT05fQ0xJRU5UX0NPTVBPU0lUT1I7CisgIHZvaWQg
c2V0X3N0YXRlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVGcmFtZVJlcG9ydGVy
X1N0YXRlIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfcmVhc29uKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVGcmFtZVJl
cG9ydGVyX0ZyYW1lRHJvcFJlYXNvbiB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwg
dmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZyYW1lX3NvdXJjZSh1aW50NjRfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZnJhbWVfc2VxdWVu
Y2UodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9
OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisj
ZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVy
OiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV9oaXN0b2dyYW1f
c2FtcGxlLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGls
ZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9T
X1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0NIUk9NRV9ISVNUT0dSQU1fU0FNUExFX1BST1RP
X0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tf
RVZFTlRfQ0hST01FX0hJU1RPR1JBTV9TQU1QTEVfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRl
Zi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRl
ZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisK
KworY2xhc3MgQ2hyb21lSGlzdG9ncmFtU2FtcGxlX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMywgLypIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBDaHJvbWVIaXN0b2dyYW1T
YW1wbGVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJv
dG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgQ2hyb21lSGlzdG9ncmFtU2FtcGxl
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgQ2hyb21lSGlzdG9ncmFtU2FtcGxlX0RlY29kZXIoY29uc3QgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNp
emUpIHt9CisgIGJvb2wgaGFzX25hbWVfaGFzaCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICB1aW50NjRfdCBuYW1lX2hhc2goKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFz
X3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDI+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc2FtcGxlKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qgc2FtcGxlKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mz4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBDaHJvbWVIaXN0b2dyYW1TYW1wbGUg
OiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2Rl
ciA9IENocm9tZUhpc3RvZ3JhbVNhbXBsZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7Cisg
ICAga05hbWVIYXNoRmllbGROdW1iZXIgPSAxLAorICAgIGtOYW1lRmllbGROdW1iZXIgPSAyLAor
ICAgIGtTYW1wbGVGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0X25hbWVfaGFzaCh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygy
LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25z
dCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNp
emUpOworICB9CisgIHZvaWQgc2V0X3NhbXBsZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDMsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFj
a19ldmVudC9jaHJvbWVfa2V5ZWRfc2VydmljZS5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBi
eSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYg
UEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVf
S0VZRURfU0VSVklDRV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BF
UkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0NIUk9NRV9LRVlFRF9TRVJWSUNFX1BST1RPX0hfCisK
KyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0
aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVz
cGFjZSBwYnplcm8geworCisKK2NsYXNzIENocm9tZUtleWVkU2VydmljZV9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgQ2hy
b21lS2V5ZWRTZXJ2aWNlX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENocm9tZUtleWVk
U2VydmljZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IENocm9tZUtleWVkU2VydmljZV9EZWNvZGVyKGNvbnN0IDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJh
dy5zaXplKSB7fQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3N0cmluZygpOyB9Cit9OworCitjbGFzcyBDaHJvbWVLZXllZFNlcnZpY2UgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IENocm9tZUtleWVkU2VydmljZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05h
bWVGaWVsZE51bWJlciA9IDEsCisgIH07CisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXpl
KCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUp
IHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworfSAvLyBOYW1l
c3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNs
dWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9w
ZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfbGF0ZW5jeV9pbmZvLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RS
QUNLX0VWRU5UX0NIUk9NRV9MQVRFTkNZX0lORk9fUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9f
UFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DSFJPTUVfTEFURU5DWV9J
TkZPX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4K
KworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rl
ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2Ug
cHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBDaHJvbWVMYXRlbmN5SW5mb19D
b21wb25lbnRJbmZvOworZW51bSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlw
ZSA6IGludDMyX3Q7CitlbnVtIENocm9tZUxhdGVuY3lJbmZvX1N0ZXAgOiBpbnQzMl90OworCitl
bnVtIENocm9tZUxhdGVuY3lJbmZvX1N0ZXAgOiBpbnQzMl90IHsKKyAgQ2hyb21lTGF0ZW5jeUlu
Zm9fU3RlcF9TVEVQX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9T
VEVQX1NFTkRfSU5QVVRfRVZFTlRfVUkgPSAzLAorICBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NU
RVBfSEFORExFX0lOUFVUX0VWRU5UX0lNUEwgPSA1LAorICBDaHJvbWVMYXRlbmN5SW5mb19TdGVw
X1NURVBfRElEX0hBTkRMRV9JTlBVVF9BTkRfT1ZFUlNDUk9MTCA9IDgsCisgIENocm9tZUxhdGVu
Y3lJbmZvX1N0ZXBfU1RFUF9IQU5ETEVfSU5QVVRfRVZFTlRfTUFJTiA9IDQsCisgIENocm9tZUxh
dGVuY3lJbmZvX1N0ZXBfU1RFUF9NQUlOX1RIUkVBRF9TQ1JPTExfVVBEQVRFID0gMiwKKyAgQ2hy
b21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX0hBTkRMRV9JTlBVVF9FVkVOVF9NQUlOX0NPTU1JVCA9
IDEsCisgIENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9IQU5ETEVEX0lOUFVUX0VWRU5UX01B
SU5fT1JfSU1QTCA9IDksCisgIENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9IQU5ETEVEX0lO
UFVUX0VWRU5UX0lNUEwgPSAxMCwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX1NXQVBf
QlVGRkVSUyA9IDYsCisgIENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9EUkFXX0FORF9TV0FQ
ID0gNywKK307CisKK2NvbnN0IENocm9tZUxhdGVuY3lJbmZvX1N0ZXAgQ2hyb21lTGF0ZW5jeUlu
Zm9fU3RlcF9NSU4gPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfVU5TUEVDSUZJRUQ7Citj
b25zdCBDaHJvbWVMYXRlbmN5SW5mb19TdGVwIENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfTUFYID0g
Q2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX0hBTkRMRURfSU5QVVRfRVZFTlRfSU1QTDsKKwor
ZW51bSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZSA6IGludDMyX3Qgewor
ICBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfVU5TUEVD
SUZJRUQgPSAwLAorICBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01Q
T05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9CRUdJTl9SV0ggPSAxLAorICBDaHJvbWVMYXRlbmN5
SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9T
Q1JPTExfVVBEQVRFX09SSUdJTkFMID0gMiwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNv
bXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfRklSU1RfU0NST0xMX1VQ
REFURV9PUklHSU5BTCA9IDMsCisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRU
eXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX09SSUdJTkFMID0gNCwKKyAgQ2hyb21l
TGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xB
VEVOQ1lfVUkgPSA1LAorICBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9D
T01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9SRU5ERVJFUl9NQUlOID0gNiwKKyAgQ2hyb21l
TGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xB
VEVOQ1lfUkVOREVSSU5HX1NDSEVEVUxFRF9NQUlOID0gNywKKyAgQ2hyb21lTGF0ZW5jeUluZm9f
TGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVS
SU5HX1NDSEVEVUxFRF9JTVBMID0gOCwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBv
bmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfU0NST0xMX1VQREFURV9MQVNU
X0VWRU5UID0gOSwKKyAgQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09N
UE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfQUNLX1JXSCA9IDEwLAorICBDaHJvbWVMYXRlbmN5
SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9S
RU5ERVJFUl9TV0FQID0gMTEsCisgIENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRU
eXBlX0NPTVBPTkVOVF9ESVNQTEFZX0NPTVBPU0lUT1JfUkVDRUlWRURfRlJBTUUgPSAxMiwKKyAg
Q2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VW
RU5UX0dQVV9TV0FQX0JVRkZFUiA9IDEzLAorICBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29t
cG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9GUkFNRV9TV0FQID0gMTQs
Cit9OworCitjb25zdCBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZSBDaHJv
bWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9NSU4gPSBDaHJvbWVMYXRlbmN5SW5m
b19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfVU5TUEVDSUZJRUQ7Citjb25zdCBDaHJv
bWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZSBDaHJvbWVMYXRlbmN5SW5mb19MYXRl
bmN5Q29tcG9uZW50VHlwZV9NQVggPSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50
VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9GUkFNRV9TV0FQOworCitjbGFzcyBD
aHJvbWVMYXRlbmN5SW5mb19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3Rv
RGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzYsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVM
RFM9Ki90cnVlPiB7CisgcHVibGljOgorICBDaHJvbWVMYXRlbmN5SW5mb19EZWNvZGVyKGNvbnN0
IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVu
KSB7fQorICBleHBsaWNpdCBDaHJvbWVMYXRlbmN5SW5mb19EZWNvZGVyKGNvbnN0IHN0ZDo6c3Ry
aW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENocm9tZUxhdGVu
Y3lJbmZvX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3RyYWNlX2lk
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdHJhY2VfaWQo
KSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfc3RlcCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHN0ZXAoKSBjb25z
dCB7IHJldHVybiBhdDwyPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfZnJhbWVfdHJlZV9u
b2RlX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgZnJh
bWVfdHJlZV9ub2RlX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX2NvbXBvbmVudF9pbmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+IGNvbXBvbmVudF9pbmZvKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpw
cm90b3plcm86OkNvbnN0Qnl0ZXM+KDQpOyB9CisgIGJvb2wgaGFzX2lzX2NvYWxlc2NlZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBib29sIGlzX2NvYWxlc2NlZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2dlc3R1cmVfc2Ny
b2xsX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgZ2Vz
dHVyZV9zY3JvbGxfaWQoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2ludDY0KCk7IH0KK307
CisKK2NsYXNzIENocm9tZUxhdGVuY3lJbmZvIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdl
IHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBDaHJvbWVMYXRlbmN5SW5mb19EZWNvZGVy
OworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RyYWNlSWRGaWVsZE51bWJlciA9IDEsCisgICAg
a1N0ZXBGaWVsZE51bWJlciA9IDIsCisgICAga0ZyYW1lVHJlZU5vZGVJZEZpZWxkTnVtYmVyID0g
MywKKyAgICBrQ29tcG9uZW50SW5mb0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrSXNDb2FsZXNjZWRG
aWVsZE51bWJlciA9IDUsCisgICAga0dlc3R1cmVTY3JvbGxJZEZpZWxkTnVtYmVyID0gNiwKKyAg
fTsKKyAgdXNpbmcgQ29tcG9uZW50SW5mbyA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpD
aHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvOworICB1c2luZyBTdGVwID0gOjpwZXJmZXR0
bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUxhdGVuY3lJbmZvX1N0ZXA7CisgIHVzaW5nIExhdGVu
Y3lDb21wb25lbnRUeXBlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUxhdGVu
Y3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlOworICBzdGF0aWMgY29uc3QgU3RlcCBTVEVQX1VO
U1BFQ0lGSUVEID0gQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQX1VOU1BFQ0lGSUVEOworICBz
dGF0aWMgY29uc3QgU3RlcCBTVEVQX1NFTkRfSU5QVVRfRVZFTlRfVUkgPSBDaHJvbWVMYXRlbmN5
SW5mb19TdGVwX1NURVBfU0VORF9JTlBVVF9FVkVOVF9VSTsKKyAgc3RhdGljIGNvbnN0IFN0ZXAg
U1RFUF9IQU5ETEVfSU5QVVRfRVZFTlRfSU1QTCA9IENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RF
UF9IQU5ETEVfSU5QVVRfRVZFTlRfSU1QTDsKKyAgc3RhdGljIGNvbnN0IFN0ZXAgU1RFUF9ESURf
SEFORExFX0lOUFVUX0FORF9PVkVSU0NST0xMID0gQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQ
X0RJRF9IQU5ETEVfSU5QVVRfQU5EX09WRVJTQ1JPTEw7CisgIHN0YXRpYyBjb25zdCBTdGVwIFNU
RVBfSEFORExFX0lOUFVUX0VWRU5UX01BSU4gPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBf
SEFORExFX0lOUFVUX0VWRU5UX01BSU47CisgIHN0YXRpYyBjb25zdCBTdGVwIFNURVBfTUFJTl9U
SFJFQURfU0NST0xMX1VQREFURSA9IENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9NQUlOX1RI
UkVBRF9TQ1JPTExfVVBEQVRFOworICBzdGF0aWMgY29uc3QgU3RlcCBTVEVQX0hBTkRMRV9JTlBV
VF9FVkVOVF9NQUlOX0NPTU1JVCA9IENocm9tZUxhdGVuY3lJbmZvX1N0ZXBfU1RFUF9IQU5ETEVf
SU5QVVRfRVZFTlRfTUFJTl9DT01NSVQ7CisgIHN0YXRpYyBjb25zdCBTdGVwIFNURVBfSEFORExF
RF9JTlBVVF9FVkVOVF9NQUlOX09SX0lNUEwgPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBf
SEFORExFRF9JTlBVVF9FVkVOVF9NQUlOX09SX0lNUEw7CisgIHN0YXRpYyBjb25zdCBTdGVwIFNU
RVBfSEFORExFRF9JTlBVVF9FVkVOVF9JTVBMID0gQ2hyb21lTGF0ZW5jeUluZm9fU3RlcF9TVEVQ
X0hBTkRMRURfSU5QVVRfRVZFTlRfSU1QTDsKKyAgc3RhdGljIGNvbnN0IFN0ZXAgU1RFUF9TV0FQ
X0JVRkZFUlMgPSBDaHJvbWVMYXRlbmN5SW5mb19TdGVwX1NURVBfU1dBUF9CVUZGRVJTOworICBz
dGF0aWMgY29uc3QgU3RlcCBTVEVQX0RSQVdfQU5EX1NXQVAgPSBDaHJvbWVMYXRlbmN5SW5mb19T
dGVwX1NURVBfRFJBV19BTkRfU1dBUDsKKyAgc3RhdGljIGNvbnN0IExhdGVuY3lDb21wb25lbnRU
eXBlIENPTVBPTkVOVF9VTlNQRUNJRklFRCA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21w
b25lbnRUeXBlX0NPTVBPTkVOVF9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IExhdGVuY3lD
b21wb25lbnRUeXBlIENPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX0JFR0lOX1JXSCA9IENo
cm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVO
VF9MQVRFTkNZX0JFR0lOX1JXSDsKKyAgc3RhdGljIGNvbnN0IExhdGVuY3lDb21wb25lbnRUeXBl
IENPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX1NDUk9MTF9VUERBVEVfT1JJR0lOQUwgPSBD
aHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZF
TlRfTEFURU5DWV9TQ1JPTExfVVBEQVRFX09SSUdJTkFMOworICBzdGF0aWMgY29uc3QgTGF0ZW5j
eUNvbXBvbmVudFR5cGUgQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfRklSU1RfU0NST0xM
X1VQREFURV9PUklHSU5BTCA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBl
X0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX0ZJUlNUX1NDUk9MTF9VUERBVEVfT1JJR0lO
QUw7CisgIHN0YXRpYyBjb25zdCBMYXRlbmN5Q29tcG9uZW50VHlwZSBDT01QT05FTlRfSU5QVVRf
RVZFTlRfTEFURU5DWV9PUklHSU5BTCA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25l
bnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX09SSUdJTkFMOworICBzdGF0aWMg
Y29uc3QgTGF0ZW5jeUNvbXBvbmVudFR5cGUgQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lf
VUkgPSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5Q
VVRfRVZFTlRfTEFURU5DWV9VSTsKKyAgc3RhdGljIGNvbnN0IExhdGVuY3lDb21wb25lbnRUeXBl
IENPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX1JFTkRFUkVSX01BSU4gPSBDaHJvbWVMYXRl
bmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlwZV9DT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5D
WV9SRU5ERVJFUl9NQUlOOworICBzdGF0aWMgY29uc3QgTGF0ZW5jeUNvbXBvbmVudFR5cGUgQ09N
UE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVSSU5HX1NDSEVEVUxFRF9NQUlOID0gQ2hy
b21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5U
X0xBVEVOQ1lfUkVOREVSSU5HX1NDSEVEVUxFRF9NQUlOOworICBzdGF0aWMgY29uc3QgTGF0ZW5j
eUNvbXBvbmVudFR5cGUgQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVSSU5HX1ND
SEVEVUxFRF9JTVBMID0gQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09N
UE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVSSU5HX1NDSEVEVUxFRF9JTVBMOworICBz
dGF0aWMgY29uc3QgTGF0ZW5jeUNvbXBvbmVudFR5cGUgQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xB
VEVOQ1lfU0NST0xMX1VQREFURV9MQVNUX0VWRU5UID0gQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5j
eUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfU0NST0xMX1VQREFU
RV9MQVNUX0VWRU5UOworICBzdGF0aWMgY29uc3QgTGF0ZW5jeUNvbXBvbmVudFR5cGUgQ09NUE9O
RU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfQUNLX1JXSCA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVu
Y3lDb21wb25lbnRUeXBlX0NPTVBPTkVOVF9JTlBVVF9FVkVOVF9MQVRFTkNZX0FDS19SV0g7Cisg
IHN0YXRpYyBjb25zdCBMYXRlbmN5Q29tcG9uZW50VHlwZSBDT01QT05FTlRfSU5QVVRfRVZFTlRf
TEFURU5DWV9SRU5ERVJFUl9TV0FQID0gQ2hyb21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVu
dFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVSRVJfU1dBUDsKKyAgc3Rh
dGljIGNvbnN0IExhdGVuY3lDb21wb25lbnRUeXBlIENPTVBPTkVOVF9ESVNQTEFZX0NPTVBPU0lU
T1JfUkVDRUlWRURfRlJBTUUgPSBDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9uZW50VHlw
ZV9DT01QT05FTlRfRElTUExBWV9DT01QT1NJVE9SX1JFQ0VJVkVEX0ZSQU1FOworICBzdGF0aWMg
Y29uc3QgTGF0ZW5jeUNvbXBvbmVudFR5cGUgQ09NUE9ORU5UX0lOUFVUX0VWRU5UX0dQVV9TV0FQ
X0JVRkZFUiA9IENocm9tZUxhdGVuY3lJbmZvX0xhdGVuY3lDb21wb25lbnRUeXBlX0NPTVBPTkVO
VF9JTlBVVF9FVkVOVF9HUFVfU1dBUF9CVUZGRVI7CisgIHN0YXRpYyBjb25zdCBMYXRlbmN5Q29t
cG9uZW50VHlwZSBDT01QT05FTlRfSU5QVVRfRVZFTlRfTEFURU5DWV9GUkFNRV9TV0FQID0gQ2hy
b21lTGF0ZW5jeUluZm9fTGF0ZW5jeUNvbXBvbmVudFR5cGVfQ09NUE9ORU5UX0lOUFVUX0VWRU5U
X0xBVEVOQ1lfRlJBTUVfU1dBUDsKKyAgdm9pZCBzZXRfdHJhY2VfaWQoaW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RlcCg6OnBl
cmZldHRvOjpwcm90b3M6OnBiemVybzo6Q2hyb21lTGF0ZW5jeUluZm9fU3RlcCB2YWx1ZSkgewor
ICAgIEFwcGVuZFRpbnlWYXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2ZyYW1lX3Ry
ZWVfbm9kZV9pZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVu
dEluZm8+IFQqIGFkZF9jb21wb25lbnRfaW5mbygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRN
ZXNzYWdlPFQ+KDQpOworICB9CisKKyAgdm9pZCBzZXRfaXNfY29hbGVzY2VkKGJvb2wgdmFsdWUp
IHsKKyAgICBBcHBlbmRUaW55VmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9nZXN0
dXJlX3Njcm9sbF9pZChpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDYsIHZhbHVl
KTsKKyAgfQorfTsKKworY2xhc3MgQ2hyb21lTGF0ZW5jeUluZm9fQ29tcG9uZW50SW5mb19EZWNv
ZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9J
RD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1Ymxp
YzoKKyAgQ2hyb21lTGF0ZW5jeUluZm9fQ29tcG9uZW50SW5mb19EZWNvZGVyKGNvbnN0IHVpbnQ4
X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQor
ICBleHBsaWNpdCBDaHJvbWVMYXRlbmN5SW5mb19Db21wb25lbnRJbmZvX0RlY29kZXIoY29uc3Qg
c3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2hy
b21lTGF0ZW5jeUluZm9fQ29tcG9uZW50SW5mb19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19jb21wb25lbnRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFs
aWQoKTsgfQorICBpbnQzMl90IGNvbXBvbmVudF90eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RpbWVfdXMoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdGltZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVu
dEluZm8gOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IENocm9tZUxhdGVuY3lJbmZvX0NvbXBvbmVudEluZm9fRGVjb2RlcjsKKyAgZW51
bSA6IGludDMyX3QgeworICAgIGtDb21wb25lbnRUeXBlRmllbGROdW1iZXIgPSAxLAorICAgIGtU
aW1lVXNGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2NvbXBvbmVudF90eXBlKDo6
cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVMYXRlbmN5SW5mb19MYXRlbmN5Q29tcG9u
ZW50VHlwZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFsdWUpOworICB9Cisg
IHZvaWQgc2V0X3RpbWVfdXModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2No
cm9tZV9sZWdhY3lfaXBjLnBiemVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1pl
cm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9U
T1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0NIUk9NRV9MRUdBQ1lfSVBDX1BS
T1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJB
Q0tfRVZFTlRfQ0hST01FX0xFR0FDWV9JUENfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5o
PgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9m
aWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNl
IHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2Vu
dW0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzcyA6IGludDMyX3Q7CisKK2VudW0gQ2hyb21l
TGVnYWN5SXBjX01lc3NhZ2VDbGFzcyA6IGludDMyX3QgeworICBDaHJvbWVMZWdhY3lJcGNfTWVz
c2FnZUNsYXNzX0NMQVNTX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzc19DTEFTU19BVVRPTUFUSU9OID0gMSwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VD
bGFzc19DTEFTU19GUkFNRSA9IDIsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xB
U1NfUEFHRSA9IDMsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfVklFVyA9
IDQsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfV0lER0VUID0gNSwKKyAg
Q2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19JTlBVVCA9IDYsCisgIENocm9tZUxl
Z2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfVEVTVCA9IDcsCisgIENocm9tZUxlZ2FjeUlwY19N
ZXNzYWdlQ2xhc3NfQ0xBU1NfV09SS0VSID0gOCwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VD
bGFzc19DTEFTU19OQUNMID0gOSwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFT
U19HUFVfQ0hBTk5FTCA9IDEwLAorICBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNT
X01FRElBID0gMTEsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfUFBBUEkg
PSAxMiwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19DSFJPTUUgPSAxMywK
KyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19EUkFHID0gMTQsCisgIENocm9t
ZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfUFJJTlQgPSAxNSwKKyAgQ2hyb21lTGVnYWN5
SXBjX01lc3NhZ2VDbGFzc19DTEFTU19FWFRFTlNJT04gPSAxNiwKKyAgQ2hyb21lTGVnYWN5SXBj
X01lc3NhZ2VDbGFzc19DTEFTU19URVhUX0lOUFVUX0NMSUVOVCA9IDE3LAorICBDaHJvbWVMZWdh
Y3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0JMSU5LX1RFU1QgPSAxOCwKKyAgQ2hyb21lTGVnYWN5
SXBjX01lc3NhZ2VDbGFzc19DTEFTU19BQ0NFU1NJQklMSVRZID0gMTksCisgIENocm9tZUxlZ2Fj
eUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfUFJFUkVOREVSID0gMjAsCisgIENocm9tZUxlZ2FjeUlw
Y19NZXNzYWdlQ2xhc3NfQ0xBU1NfQ0hST01PVElORyA9IDIxLAorICBDaHJvbWVMZWdhY3lJcGNf
TWVzc2FnZUNsYXNzX0NMQVNTX0JST1dTRVJfUExVR0lOID0gMjIsCisgIENocm9tZUxlZ2FjeUlw
Y19NZXNzYWdlQ2xhc3NfQ0xBU1NfQU5EUk9JRF9XRUJfVklFVyA9IDIzLAorICBDaHJvbWVMZWdh
Y3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX05BQ0xfSE9TVCA9IDI0LAorICBDaHJvbWVMZWdhY3lJ
cGNfTWVzc2FnZUNsYXNzX0NMQVNTX0VOQ1JZUFRFRF9NRURJQSA9IDI1LAorICBDaHJvbWVMZWdh
Y3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0NBU1QgPSAyNiwKKyAgQ2hyb21lTGVnYWN5SXBjX01l
c3NhZ2VDbGFzc19DTEFTU19HSU5fSkFWQV9CUklER0UgPSAyNywKKyAgQ2hyb21lTGVnYWN5SXBj
X01lc3NhZ2VDbGFzc19DTEFTU19DSFJPTUVfVVRJTElUWV9QUklOVElORyA9IDI4LAorICBDaHJv
bWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX09aT05FX0dQVSA9IDI5LAorICBDaHJvbWVM
ZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1dFQl9URVNUID0gMzAsCisgIENocm9tZUxlZ2Fj
eUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfTkVUV09SS19ISU5UUyA9IDMxLAorICBDaHJvbWVMZWdh
Y3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0VYVEVOU0lPTlNfR1VFU1RfVklFVyA9IDMyLAorICBD
aHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0dVRVNUX1ZJRVcgPSAzMywKKyAgQ2hy
b21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19NRURJQV9QTEFZRVJfREVMRUdBVEUgPSAz
NCwKKyAgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19FWFRFTlNJT05fV09SS0VS
ID0gMzUsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfU1VCUkVTT1VSQ0Vf
RklMVEVSID0gMzYsCisgIENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfVU5GUkVF
WkFCTEVfRlJBTUUgPSAzNywKK307CisKK2NvbnN0IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xh
c3MgQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19NSU4gPSBDaHJvbWVMZWdhY3lJcGNfTWVz
c2FnZUNsYXNzX0NMQVNTX1VOU1BFQ0lGSUVEOworY29uc3QgQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzcyBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX01BWCA9IENocm9tZUxlZ2FjeUlw
Y19NZXNzYWdlQ2xhc3NfQ0xBU1NfVU5GUkVFWkFCTEVfRlJBTUU7CisKK2NsYXNzIENocm9tZUxl
Z2FjeUlwY19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rlcjwv
Kk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxz
ZT4geworIHB1YmxpYzoKKyAgQ2hyb21lTGVnYWN5SXBjX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IENocm9tZUxlZ2FjeUlwY19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDog
VHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRh
dGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IENocm9tZUxlZ2FjeUlwY19EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19tZXNzYWdlX2NsYXNzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbWVzc2FnZV9jbGFzcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19tZXNzYWdlX2xp
bmUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgbWVzc2Fn
ZV9saW5lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50MzIoKTsgfQorfTsKKworY2xh
c3MgQ2hyb21lTGVnYWN5SXBjIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJs
aWM6CisgIHVzaW5nIERlY29kZXIgPSBDaHJvbWVMZWdhY3lJcGNfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtNZXNzYWdlQ2xhc3NGaWVsZE51bWJlciA9IDEsCisgICAga01lc3Nh
Z2VMaW5lRmllbGROdW1iZXIgPSAyLAorICB9OworICB1c2luZyBNZXNzYWdlQ2xhc3MgPSA6OnBl
cmZldHRvOjpwcm90b3M6OnBiemVybzo6Q2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzczsKKyAg
c3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19VTlNQRUNJRklFRCA9IENocm9tZUxlZ2Fj
eUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBNZXNz
YWdlQ2xhc3MgQ0xBU1NfQVVUT01BVElPTiA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3Nf
Q0xBU1NfQVVUT01BVElPTjsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19GUkFN
RSA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfRlJBTUU7CisgIHN0YXRpYyBj
b25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfUEFHRSA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xh
c3NfQ0xBU1NfUEFHRTsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19WSUVXID0g
Q2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19WSUVXOworICBzdGF0aWMgY29uc3Qg
TWVzc2FnZUNsYXNzIENMQVNTX1dJREdFVCA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3Nf
Q0xBU1NfV0lER0VUOworICBzdGF0aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX0lOUFVUID0g
Q2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19JTlBVVDsKKyAgc3RhdGljIGNvbnN0
IE1lc3NhZ2VDbGFzcyBDTEFTU19URVNUID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19D
TEFTU19URVNUOworICBzdGF0aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX1dPUktFUiA9IENo
cm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfV09SS0VSOworICBzdGF0aWMgY29uc3Qg
TWVzc2FnZUNsYXNzIENMQVNTX05BQ0wgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NM
QVNTX05BQ0w7CisgIHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfR1BVX0NIQU5ORUwg
PSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0dQVV9DSEFOTkVMOworICBzdGF0
aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX01FRElBID0gQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzc19DTEFTU19NRURJQTsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19Q
UEFQSSA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfUFBBUEk7CisgIHN0YXRp
YyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfQ0hST01FID0gQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzc19DTEFTU19DSFJPTUU7CisgIHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1Nf
RFJBRyA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfRFJBRzsKKyAgc3RhdGlj
IGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19QUklOVCA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdl
Q2xhc3NfQ0xBU1NfUFJJTlQ7CisgIHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfRVhU
RU5TSU9OID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19FWFRFTlNJT047Cisg
IHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfVEVYVF9JTlBVVF9DTElFTlQgPSBDaHJv
bWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1RFWFRfSU5QVVRfQ0xJRU5UOworICBzdGF0
aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX0JMSU5LX1RFU1QgPSBDaHJvbWVMZWdhY3lJcGNf
TWVzc2FnZUNsYXNzX0NMQVNTX0JMSU5LX1RFU1Q7CisgIHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xh
c3MgQ0xBU1NfQUNDRVNTSUJJTElUWSA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xB
U1NfQUNDRVNTSUJJTElUWTsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19QUkVS
RU5ERVIgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1BSRVJFTkRFUjsKKyAg
c3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19DSFJPTU9USU5HID0gQ2hyb21lTGVnYWN5
SXBjX01lc3NhZ2VDbGFzc19DTEFTU19DSFJPTU9USU5HOworICBzdGF0aWMgY29uc3QgTWVzc2Fn
ZUNsYXNzIENMQVNTX0JST1dTRVJfUExVR0lOID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFz
c19DTEFTU19CUk9XU0VSX1BMVUdJTjsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFT
U19BTkRST0lEX1dFQl9WSUVXID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19B
TkRST0lEX1dFQl9WSUVXOworICBzdGF0aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX05BQ0xf
SE9TVCA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfTkFDTF9IT1NUOworICBz
dGF0aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX0VOQ1JZUFRFRF9NRURJQSA9IENocm9tZUxl
Z2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfRU5DUllQVEVEX01FRElBOworICBzdGF0aWMgY29u
c3QgTWVzc2FnZUNsYXNzIENMQVNTX0NBU1QgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNz
X0NMQVNTX0NBU1Q7CisgIHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfR0lOX0pBVkFf
QlJJREdFID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19HSU5fSkFWQV9CUklE
R0U7CisgIHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfQ0hST01FX1VUSUxJVFlfUFJJ
TlRJTkcgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0NIUk9NRV9VVElMSVRZ
X1BSSU5USU5HOworICBzdGF0aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX09aT05FX0dQVSA9
IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfT1pPTkVfR1BVOworICBzdGF0aWMg
Y29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX1dFQl9URVNUID0gQ2hyb21lTGVnYWN5SXBjX01lc3Nh
Z2VDbGFzc19DTEFTU19XRUJfVEVTVDsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFT
U19ORVRXT1JLX0hJTlRTID0gQ2hyb21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19ORVRX
T1JLX0hJTlRTOworICBzdGF0aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX0VYVEVOU0lPTlNf
R1VFU1RfVklFVyA9IENocm9tZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfRVhURU5TSU9O
U19HVUVTVF9WSUVXOworICBzdGF0aWMgY29uc3QgTWVzc2FnZUNsYXNzIENMQVNTX0dVRVNUX1ZJ
RVcgPSBDaHJvbWVMZWdhY3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX0dVRVNUX1ZJRVc7CisgIHN0
YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfTUVESUFfUExBWUVSX0RFTEVHQVRFID0gQ2hy
b21lTGVnYWN5SXBjX01lc3NhZ2VDbGFzc19DTEFTU19NRURJQV9QTEFZRVJfREVMRUdBVEU7Cisg
IHN0YXRpYyBjb25zdCBNZXNzYWdlQ2xhc3MgQ0xBU1NfRVhURU5TSU9OX1dPUktFUiA9IENocm9t
ZUxlZ2FjeUlwY19NZXNzYWdlQ2xhc3NfQ0xBU1NfRVhURU5TSU9OX1dPUktFUjsKKyAgc3RhdGlj
IGNvbnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19TVUJSRVNPVVJDRV9GSUxURVIgPSBDaHJvbWVMZWdh
Y3lJcGNfTWVzc2FnZUNsYXNzX0NMQVNTX1NVQlJFU09VUkNFX0ZJTFRFUjsKKyAgc3RhdGljIGNv
bnN0IE1lc3NhZ2VDbGFzcyBDTEFTU19VTkZSRUVaQUJMRV9GUkFNRSA9IENocm9tZUxlZ2FjeUlw
Y19NZXNzYWdlQ2xhc3NfQ0xBU1NfVU5GUkVFWkFCTEVfRlJBTUU7CisgIHZvaWQgc2V0X21lc3Nh
Z2VfY2xhc3MoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZUxlZ2FjeUlwY19NZXNz
YWdlQ2xhc3MgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDEsIHZhbHVlKTsKKyAgfQor
ICB2b2lkIHNldF9tZXNzYWdlX2xpbmUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJ
bnQoMiwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1h
bGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2
ZW50L2Nocm9tZV9wcm9jZXNzX2Rlc2NyaXB0b3IucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQg
YnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVm
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01F
X1BST0NFU1NfREVTQ1JJUFRPUl9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJP
VE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0NIUk9NRV9QUk9DRVNTX0RFU0NSSVBUT1Jf
UFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
bWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgi
CisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3pl
cm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90
b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2VudW0gQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3Jf
UHJvY2Vzc1R5cGUgOiBpbnQzMl90OworCitlbnVtIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1By
b2Nlc3NUeXBlIDogaW50MzJfdCB7CisgIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NU
eXBlX1BST0NFU1NfVU5TUEVDSUZJRUQgPSAwLAorICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Q
cm9jZXNzVHlwZV9QUk9DRVNTX0JST1dTRVIgPSAxLAorICBDaHJvbWVQcm9jZXNzRGVzY3JpcHRv
cl9Qcm9jZXNzVHlwZV9QUk9DRVNTX1JFTkRFUkVSID0gMiwKKyAgQ2hyb21lUHJvY2Vzc0Rlc2Ny
aXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19VVElMSVRZID0gMywKKyAgQ2hyb21lUHJvY2Vzc0Rl
c2NyaXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19aWUdPVEUgPSA0LAorICBDaHJvbWVQcm9jZXNz
RGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNTX1NBTkRCT1hfSEVMUEVSID0gNSwKKyAgQ2hy
b21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19HUFUgPSA2LAorICBDaHJv
bWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNTX1BQQVBJX1BMVUdJTiA9IDcs
CisgIENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfQlJP
S0VSID0gOCwKK307CisKK2NvbnN0IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBl
IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX01JTiA9IENocm9tZVByb2Nlc3NE
ZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NFU1NfVU5TUEVDSUZJRUQ7Citjb25zdCBDaHJvbWVQ
cm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9j
ZXNzVHlwZV9NQVggPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNT
X1BQQVBJX0JST0tFUjsKKworY2xhc3MgQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3JfRGVjb2RlciA6
IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8z
LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6Cisg
IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENo
cm9tZVByb2Nlc3NEZXNjcmlwdG9yX0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0
YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3Jf
RGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcHJvY2Vzc190eXBlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcHJvY2Vzc190eXBl
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3Byb2Nl
c3NfcHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCBwcm9jZXNzX3ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19pbnQzMigpOyB9
CisgIGJvb2wgaGFzX2xlZ2FjeV9zb3J0X2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52
YWxpZCgpOyB9CisgIGludDMyX3QgbGVnYWN5X3NvcnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIENocm9tZVByb2Nlc3NEZXNjcmlwdG9y
IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29k
ZXIgPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga1Byb2Nlc3NUeXBlRmllbGROdW1iZXIgPSAxLAorICAgIGtQcm9jZXNzUHJpb3JpdHlG
aWVsZE51bWJlciA9IDIsCisgICAga0xlZ2FjeVNvcnRJbmRleEZpZWxkTnVtYmVyID0gMywKKyAg
fTsKKyAgdXNpbmcgUHJvY2Vzc1R5cGUgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6Q2hy
b21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vzc1R5cGU7CisgIHN0YXRpYyBjb25zdCBQcm9jZXNz
VHlwZSBQUk9DRVNTX1VOU1BFQ0lGSUVEID0gQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vz
c1R5cGVfUFJPQ0VTU19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IFByb2Nlc3NUeXBlIFBS
T0NFU1NfQlJPV1NFUiA9IENocm9tZVByb2Nlc3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NF
U1NfQlJPV1NFUjsKKyAgc3RhdGljIGNvbnN0IFByb2Nlc3NUeXBlIFBST0NFU1NfUkVOREVSRVIg
PSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNTX1JFTkRFUkVSOwor
ICBzdGF0aWMgY29uc3QgUHJvY2Vzc1R5cGUgUFJPQ0VTU19VVElMSVRZID0gQ2hyb21lUHJvY2Vz
c0Rlc2NyaXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19VVElMSVRZOworICBzdGF0aWMgY29uc3Qg
UHJvY2Vzc1R5cGUgUFJPQ0VTU19aWUdPVEUgPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9j
ZXNzVHlwZV9QUk9DRVNTX1pZR09URTsKKyAgc3RhdGljIGNvbnN0IFByb2Nlc3NUeXBlIFBST0NF
U1NfU0FOREJPWF9IRUxQRVIgPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9Q
Uk9DRVNTX1NBTkRCT1hfSEVMUEVSOworICBzdGF0aWMgY29uc3QgUHJvY2Vzc1R5cGUgUFJPQ0VT
U19HUFUgPSBDaHJvbWVQcm9jZXNzRGVzY3JpcHRvcl9Qcm9jZXNzVHlwZV9QUk9DRVNTX0dQVTsK
KyAgc3RhdGljIGNvbnN0IFByb2Nlc3NUeXBlIFBST0NFU1NfUFBBUElfUExVR0lOID0gQ2hyb21l
UHJvY2Vzc0Rlc2NyaXB0b3JfUHJvY2Vzc1R5cGVfUFJPQ0VTU19QUEFQSV9QTFVHSU47CisgIHN0
YXRpYyBjb25zdCBQcm9jZXNzVHlwZSBQUk9DRVNTX1BQQVBJX0JST0tFUiA9IENocm9tZVByb2Nl
c3NEZXNjcmlwdG9yX1Byb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfQlJPS0VSOworICB2b2lkIHNl
dF9wcm9jZXNzX3R5cGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNocm9tZVByb2Nlc3NE
ZXNjcmlwdG9yX1Byb2Nlc3NUeXBlIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJvY2Vzc19wcmlvcml0eShpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9sZWdhY3lfc29y
dF9pbmRleChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAg
fQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNl
LgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9jaHJvbWVfdGhyZWFk
X2Rlc2NyaXB0b3IucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBj
b21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX1RIUkVBRF9ERVNDUklQVE9S
X1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0Vf
VFJBQ0tfRVZFTlRfQ0hST01FX1RIUkVBRF9ERVNDUklQVE9SX1BST1RPX0hfCisKKyNpbmNsdWRl
IDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRf
cmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisK
K25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnpl
cm8geworCitlbnVtIENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZSA6IGludDMyX3Q7
CisKK2VudW0gQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlIDogaW50MzJfdCB7Cisg
IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURfVU5TUEVDSUZJRUQgPSAw
LAorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX01BSU4gPSAxLAor
ICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX0lPID0gMiwKKyAgQ2hy
b21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9QT09MX0JHX1dPUktFUiA9IDMs
CisgIENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURfUE9PTF9GR19XT1JL
RVIgPSA0LAorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xf
QkdfQkxPQ0tJTkcgPSA2LAorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhS
RUFEX1BPT0xfRkdfQkxPQ0tJTkcgPSA1LAorICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVh
ZFR5cGVfVEhSRUFEX1BPT0xfU0VSVklDRSA9IDcsCisgIENocm9tZVRocmVhZERlc2NyaXB0b3Jf
VGhyZWFkVHlwZV9USFJFQURfQ09NUE9TSVRPUiA9IDgsCisgIENocm9tZVRocmVhZERlc2NyaXB0
b3JfVGhyZWFkVHlwZV9USFJFQURfVklaX0NPTVBPU0lUT1IgPSA5LAorICBDaHJvbWVUaHJlYWRE
ZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX0NPTVBPU0lUT1JfV09SS0VSID0gMTAsCisgIENo
cm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURfU0VSVklDRV9XT1JLRVIgPSAx
MSwKKyAgQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9NRU1PUllfSU5G
UkEgPSA1MCwKKyAgQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9TQU1Q
TElOR19QUk9GSUxFUiA9IDUxLAorfTsKKworY29uc3QgQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9U
aHJlYWRUeXBlIENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9NSU4gPSBDaHJvbWVU
aHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1VOU1BFQ0lGSUVEOworY29uc3QgQ2hy
b21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlIENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhy
ZWFkVHlwZV9NQVggPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1NB
TVBMSU5HX1BST0ZJTEVSOworCitjbGFzcyBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IENo
cm9tZVRocmVhZERlc2NyaXB0b3JfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRh
KCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX0Rl
Y29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVj
b2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3RocmVhZF90eXBlKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdGhyZWFkX3R5cGUoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfbGVnYWN5X3Nv
cnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBs
ZWdhY3lfc29ydF9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQor
fTsKKworY2xhc3MgQ2hyb21lVGhyZWFkRGVzY3JpcHRvciA6IHB1YmxpYyA6OnByb3RvemVybzo6
TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ2hyb21lVGhyZWFkRGVzY3Jp
cHRvcl9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1RocmVhZFR5cGVGaWVsZE51
bWJlciA9IDEsCisgICAga0xlZ2FjeVNvcnRJbmRleEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAg
dXNpbmcgVGhyZWFkVHlwZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDaHJvbWVUaHJl
YWREZXNjcmlwdG9yX1RocmVhZFR5cGU7CisgIHN0YXRpYyBjb25zdCBUaHJlYWRUeXBlIFRIUkVB
RF9VTlNQRUNJRklFRCA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURf
VU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBUaHJlYWRUeXBlIFRIUkVBRF9NQUlOID0gQ2hy
b21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9NQUlOOworICBzdGF0aWMgY29u
c3QgVGhyZWFkVHlwZSBUSFJFQURfSU8gPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5
cGVfVEhSRUFEX0lPOworICBzdGF0aWMgY29uc3QgVGhyZWFkVHlwZSBUSFJFQURfUE9PTF9CR19X
T1JLRVIgPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfQkdf
V09SS0VSOworICBzdGF0aWMgY29uc3QgVGhyZWFkVHlwZSBUSFJFQURfUE9PTF9GR19XT1JLRVIg
PSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfRkdfV09SS0VS
OworICBzdGF0aWMgY29uc3QgVGhyZWFkVHlwZSBUSFJFQURfUE9PTF9CR19CTE9DS0lORyA9IENo
cm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJFQURfUE9PTF9CR19CTE9DS0lORzsK
KyAgc3RhdGljIGNvbnN0IFRocmVhZFR5cGUgVEhSRUFEX1BPT0xfRkdfQkxPQ0tJTkcgPSBDaHJv
bWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfRkdfQkxPQ0tJTkc7Cisg
IHN0YXRpYyBjb25zdCBUaHJlYWRUeXBlIFRIUkVBRF9QT09MX1NFUlZJQ0UgPSBDaHJvbWVUaHJl
YWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX1BPT0xfU0VSVklDRTsKKyAgc3RhdGljIGNv
bnN0IFRocmVhZFR5cGUgVEhSRUFEX0NPTVBPU0lUT1IgPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9y
X1RocmVhZFR5cGVfVEhSRUFEX0NPTVBPU0lUT1I7CisgIHN0YXRpYyBjb25zdCBUaHJlYWRUeXBl
IFRIUkVBRF9WSVpfQ09NUE9TSVRPUiA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlw
ZV9USFJFQURfVklaX0NPTVBPU0lUT1I7CisgIHN0YXRpYyBjb25zdCBUaHJlYWRUeXBlIFRIUkVB
RF9DT01QT1NJVE9SX1dPUktFUiA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9U
SFJFQURfQ09NUE9TSVRPUl9XT1JLRVI7CisgIHN0YXRpYyBjb25zdCBUaHJlYWRUeXBlIFRIUkVB
RF9TRVJWSUNFX1dPUktFUiA9IENocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZV9USFJF
QURfU0VSVklDRV9XT1JLRVI7CisgIHN0YXRpYyBjb25zdCBUaHJlYWRUeXBlIFRIUkVBRF9NRU1P
UllfSU5GUkEgPSBDaHJvbWVUaHJlYWREZXNjcmlwdG9yX1RocmVhZFR5cGVfVEhSRUFEX01FTU9S
WV9JTkZSQTsKKyAgc3RhdGljIGNvbnN0IFRocmVhZFR5cGUgVEhSRUFEX1NBTVBMSU5HX1BST0ZJ
TEVSID0gQ2hyb21lVGhyZWFkRGVzY3JpcHRvcl9UaHJlYWRUeXBlX1RIUkVBRF9TQU1QTElOR19Q
Uk9GSUxFUjsKKyAgdm9pZCBzZXRfdGhyZWFkX3R5cGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnpl
cm86OkNocm9tZVRocmVhZERlc2NyaXB0b3JfVGhyZWFkVHlwZSB2YWx1ZSkgeworICAgIEFwcGVu
ZFRpbnlWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlZ2FjeV9zb3J0X2luZGV4
KGludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9Owor
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5k
aWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBn
ZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Nocm9tZV91c2VyX2V2ZW50LnBi
emVyby5oCisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2lu
LiBETyBOT1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X1RSQUNFX1RSQUNLX0VWRU5UX0NIUk9NRV9VU0VSX0VWRU5UX1BST1RPX0hfCisjZGVmaW5lIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfQ0hST01FX1VT
RVJfRVZFTlRfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlu
dC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19k
ZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0
by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVz
cGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgQ2hyb21lVXNlckV2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7
CisgcHVibGljOgorICBDaHJvbWVVc2VyRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRh
LCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGlj
aXQgQ2hyb21lVXNlckV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgQ2hyb21lVXNlckV2ZW50X0RlY29kZXIoY29u
c3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcu
ZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2FjdGlvbigpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBhY3Rpb24oKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2FjdGlvbl9oYXNo
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGFjdGlvbl9o
YXNoKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3Mg
Q2hyb21lVXNlckV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6
CisgIHVzaW5nIERlY29kZXIgPSBDaHJvbWVVc2VyRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtBY3Rpb25GaWVsZE51bWJlciA9IDEsCisgICAga0FjdGlvbkhhc2hGaWVs
ZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2FjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYg
dmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7
CisgIH0KKyAgdm9pZCBzZXRfYWN0aW9uKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoMSwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfYWN0aW9u
X2hhc2godWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9
Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2Uu
CisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVh
ZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2NvdW50ZXJfZGVzY3Jp
cHRvci5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVy
IHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9DT1VOVEVSX0RFU0NSSVBUT1JfUFJPVE9fSF8KKyNk
ZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9D
T1VOVEVSX0RFU0NSSVBUT1JfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1
ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2VudW0gQ291bnRl
ckRlc2NyaXB0b3JfQnVpbHRpbkNvdW50ZXJUeXBlIDogaW50MzJfdDsKK2VudW0gQ291bnRlckRl
c2NyaXB0b3JfVW5pdCA6IGludDMyX3Q7CisKK2VudW0gQ291bnRlckRlc2NyaXB0b3JfQnVpbHRp
bkNvdW50ZXJUeXBlIDogaW50MzJfdCB7CisgIENvdW50ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3Vu
dGVyVHlwZV9DT1VOVEVSX1VOU1BFQ0lGSUVEID0gMCwKKyAgQ291bnRlckRlc2NyaXB0b3JfQnVp
bHRpbkNvdW50ZXJUeXBlX0NPVU5URVJfVEhSRUFEX1RJTUVfTlMgPSAxLAorICBDb3VudGVyRGVz
Y3JpcHRvcl9CdWlsdGluQ291bnRlclR5cGVfQ09VTlRFUl9USFJFQURfSU5TVFJVQ1RJT05fQ09V
TlQgPSAyLAorfTsKKworY29uc3QgQ291bnRlckRlc2NyaXB0b3JfQnVpbHRpbkNvdW50ZXJUeXBl
IENvdW50ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3VudGVyVHlwZV9NSU4gPSBDb3VudGVyRGVzY3Jp
cHRvcl9CdWlsdGluQ291bnRlclR5cGVfQ09VTlRFUl9VTlNQRUNJRklFRDsKK2NvbnN0IENvdW50
ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3VudGVyVHlwZSBDb3VudGVyRGVzY3JpcHRvcl9CdWlsdGlu
Q291bnRlclR5cGVfTUFYID0gQ291bnRlckRlc2NyaXB0b3JfQnVpbHRpbkNvdW50ZXJUeXBlX0NP
VU5URVJfVEhSRUFEX0lOU1RSVUNUSU9OX0NPVU5UOworCitlbnVtIENvdW50ZXJEZXNjcmlwdG9y
X1VuaXQgOiBpbnQzMl90IHsKKyAgQ291bnRlckRlc2NyaXB0b3JfVW5pdF9VTklUX1VOU1BFQ0lG
SUVEID0gMCwKKyAgQ291bnRlckRlc2NyaXB0b3JfVW5pdF9VTklUX1RJTUVfTlMgPSAxLAorICBD
b3VudGVyRGVzY3JpcHRvcl9Vbml0X1VOSVRfQ09VTlQgPSAyLAorICBDb3VudGVyRGVzY3JpcHRv
cl9Vbml0X1VOSVRfU0laRV9CWVRFUyA9IDMsCit9OworCitjb25zdCBDb3VudGVyRGVzY3JpcHRv
cl9Vbml0IENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfTUlOID0gQ291bnRlckRlc2NyaXB0b3JfVW5p
dF9VTklUX1VOU1BFQ0lGSUVEOworY29uc3QgQ291bnRlckRlc2NyaXB0b3JfVW5pdCBDb3VudGVy
RGVzY3JpcHRvcl9Vbml0X01BWCA9IENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9TSVpFX0JZ
VEVTOworCitjbGFzcyBDb3VudGVyRGVzY3JpcHRvcl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96
ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzUsIC8qSEFTX05PTlBBQ0tF
RF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBDb3VudGVyRGVzY3JpcHRv
cl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDb3VudGVyRGVzY3JpcHRvcl9EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IENvdW50ZXJEZXNjcmlwdG9yX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJf
dCB0eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4gY2F0
ZWdvcmllcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdENo
YXJzPigyKTsgfQorICBib29sIGhhc191bml0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxp
ZCgpOyB9CisgIGludDMyX3QgdW5pdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfaW50MzIo
KTsgfQorICBib29sIGhhc191bml0X211bHRpcGxpZXIoKSBjb25zdCB7IHJldHVybiBhdDw0Pigp
LnZhbGlkKCk7IH0KKyAgaW50NjRfdCB1bml0X211bHRpcGxpZXIoKSBjb25zdCB7IHJldHVybiBh
dDw0PigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfaXNfaW5jcmVtZW50YWwoKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgYm9vbCBpc19pbmNyZW1lbnRhbCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDU+KCkuYXNfYm9vbCgpOyB9Cit9OworCitjbGFzcyBDb3VudGVyRGVzY3Jp
cHRvciA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gQ291bnRlckRlc2NyaXB0b3JfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qgewor
ICAgIGtUeXBlRmllbGROdW1iZXIgPSAxLAorICAgIGtDYXRlZ29yaWVzRmllbGROdW1iZXIgPSAy
LAorICAgIGtVbml0RmllbGROdW1iZXIgPSAzLAorICAgIGtVbml0TXVsdGlwbGllckZpZWxkTnVt
YmVyID0gNCwKKyAgICBrSXNJbmNyZW1lbnRhbEZpZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdXNp
bmcgQnVpbHRpbkNvdW50ZXJUeXBlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OkNvdW50
ZXJEZXNjcmlwdG9yX0J1aWx0aW5Db3VudGVyVHlwZTsKKyAgdXNpbmcgVW5pdCA9IDo6cGVyZmV0
dG86OnByb3Rvczo6cGJ6ZXJvOjpDb3VudGVyRGVzY3JpcHRvcl9Vbml0OworICBzdGF0aWMgY29u
c3QgQnVpbHRpbkNvdW50ZXJUeXBlIENPVU5URVJfVU5TUEVDSUZJRUQgPSBDb3VudGVyRGVzY3Jp
cHRvcl9CdWlsdGluQ291bnRlclR5cGVfQ09VTlRFUl9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNv
bnN0IEJ1aWx0aW5Db3VudGVyVHlwZSBDT1VOVEVSX1RIUkVBRF9USU1FX05TID0gQ291bnRlckRl
c2NyaXB0b3JfQnVpbHRpbkNvdW50ZXJUeXBlX0NPVU5URVJfVEhSRUFEX1RJTUVfTlM7CisgIHN0
YXRpYyBjb25zdCBCdWlsdGluQ291bnRlclR5cGUgQ09VTlRFUl9USFJFQURfSU5TVFJVQ1RJT05f
Q09VTlQgPSBDb3VudGVyRGVzY3JpcHRvcl9CdWlsdGluQ291bnRlclR5cGVfQ09VTlRFUl9USFJF
QURfSU5TVFJVQ1RJT05fQ09VTlQ7CisgIHN0YXRpYyBjb25zdCBVbml0IFVOSVRfVU5TUEVDSUZJ
RUQgPSBDb3VudGVyRGVzY3JpcHRvcl9Vbml0X1VOSVRfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBj
b25zdCBVbml0IFVOSVRfVElNRV9OUyA9IENvdW50ZXJEZXNjcmlwdG9yX1VuaXRfVU5JVF9USU1F
X05TOworICBzdGF0aWMgY29uc3QgVW5pdCBVTklUX0NPVU5UID0gQ291bnRlckRlc2NyaXB0b3Jf
VW5pdF9VTklUX0NPVU5UOworICBzdGF0aWMgY29uc3QgVW5pdCBVTklUX1NJWkVfQllURVMgPSBD
b3VudGVyRGVzY3JpcHRvcl9Vbml0X1VOSVRfU0laRV9CWVRFUzsKKyAgdm9pZCBzZXRfdHlwZSg6
OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6Q291bnRlckRlc2NyaXB0b3JfQnVpbHRpbkNvdW50
ZXJUeXBlIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBhZGRfY2F0ZWdvcmllcyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBl
bmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBhZGRf
Y2F0ZWdvcmllcyhjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3VuaXQoOjpwZXJmZXR0bzo6cHJv
dG9zOjpwYnplcm86OkNvdW50ZXJEZXNjcmlwdG9yX1VuaXQgdmFsdWUpIHsKKyAgICBBcHBlbmRU
aW55VmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91bml0X211bHRpcGxpZXIoaW50
NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBz
ZXRfaXNfaW5jcmVtZW50YWwoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNSwg
dmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L2Rl
YnVnX2Fubm90YXRpb24ucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVy
byBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RP
U19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfREVCVUdfQU5OT1RBVElPTl9QUk9U
T19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNL
X0VWRU5UX0RFQlVHX0FOTk9UQVRJT05fUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgor
I2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVs
ZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3By
b3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBl
cmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNz
IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZTsKK2VudW0gRGVidWdBbm5vdGF0aW9uX05lc3Rl
ZFZhbHVlX05lc3RlZFR5cGUgOiBpbnQzMl90OworCitlbnVtIERlYnVnQW5ub3RhdGlvbl9OZXN0
ZWRWYWx1ZV9OZXN0ZWRUeXBlIDogaW50MzJfdCB7CisgIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRW
YWx1ZV9OZXN0ZWRUeXBlX1VOU1BFQ0lGSUVEID0gMCwKKyAgRGVidWdBbm5vdGF0aW9uX05lc3Rl
ZFZhbHVlX05lc3RlZFR5cGVfRElDVCA9IDEsCisgIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1
ZV9OZXN0ZWRUeXBlX0FSUkFZID0gMiwKK307CisKK2NvbnN0IERlYnVnQW5ub3RhdGlvbl9OZXN0
ZWRWYWx1ZV9OZXN0ZWRUeXBlIERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBl
X01JTiA9IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlX1VOU1BFQ0lGSUVE
OworY29uc3QgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGUgRGVidWdBbm5v
dGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVfTUFYID0gRGVidWdBbm5vdGF0aW9uX05lc3Rl
ZFZhbHVlX05lc3RlZFR5cGVfQVJSQVk7CisKK2NsYXNzIERlYnVnQW5ub3RhdGlvbk5hbWVfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIERlYnVnQW5ub3RhdGlvbk5hbWVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBz
aXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQg
RGVidWdBbm5vdGF0aW9uTmFtZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEo
KSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IERlYnVnQW5ub3RhdGlvbk5hbWVfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfaWlkKCkgY29uc3QgeyByZXR1cm4g
YXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgRGVidWdBbm5vdGF0aW9u
TmFtZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBE
ZWNvZGVyID0gRGVidWdBbm5vdGF0aW9uTmFtZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7
CisgICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0gMiwKKyAg
fTsKKyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQor
ICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBw
ZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KK307CisKK2NsYXNzIERlYnVnQW5ub3RhdGlv
bl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzEwLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsK
KyBwdWJsaWM6CisgIERlYnVnQW5ub3RhdGlvbl9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBEZWJ1Z0Fubm90YXRpb25fRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBEZWJ1Z0Fubm90YXRpb25fRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmFtZV9paWQoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbmFtZV9paWQoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBh
dDwxMD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25z
dCB7IHJldHVybiBhdDwxMD4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19ib29sX3ZhbHVl
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGJvb2wgYm9vbF92YWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3VpbnRfdmFs
dWUoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdWludF92
YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
aW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qg
aW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2RvdWJsZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICBk
b3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19kb3VibGUoKTsg
fQorICBib29sIGhhc19zdHJpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgc3RyaW5nX3ZhbHVlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nj4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19wb2ludGVyX3ZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHBvaW50ZXJfdmFs
dWUoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX25l
c3RlZF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyBuZXN0ZWRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfbGVnYWN5X2pzb25fdmFsdWUoKSBjb25zdCB7IHJldHVy
biBhdDw5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbGVnYWN5X2pz
b25fdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX3N0cmluZygpOyB9Cit9OworCitj
bGFzcyBEZWJ1Z0Fubm90YXRpb24gOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IERlYnVnQW5ub3RhdGlvbl9EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga05hbWVJaWRGaWVsZE51bWJlciA9IDEsCisgICAga05hbWVGaWVs
ZE51bWJlciA9IDEwLAorICAgIGtCb29sVmFsdWVGaWVsZE51bWJlciA9IDIsCisgICAga1VpbnRW
YWx1ZUZpZWxkTnVtYmVyID0gMywKKyAgICBrSW50VmFsdWVGaWVsZE51bWJlciA9IDQsCisgICAg
a0RvdWJsZVZhbHVlRmllbGROdW1iZXIgPSA1LAorICAgIGtTdHJpbmdWYWx1ZUZpZWxkTnVtYmVy
ID0gNiwKKyAgICBrUG9pbnRlclZhbHVlRmllbGROdW1iZXIgPSA3LAorICAgIGtOZXN0ZWRWYWx1
ZUZpZWxkTnVtYmVyID0gOCwKKyAgICBrTGVnYWN5SnNvblZhbHVlRmllbGROdW1iZXIgPSA5LAor
ICB9OworICB1c2luZyBOZXN0ZWRWYWx1ZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpE
ZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWU7CisgIHZvaWQgc2V0X25hbWVfaWlkKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9u
YW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEwLCB2YWx1
ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEwLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9ib29sX3ZhbHVlKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55
VmFySW50KDIsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91aW50X3ZhbHVlKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbnRf
dmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSkgeworICAgIEFwcGVuZEZpeGVk
KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoNiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXpl
KCkpOworICB9CisgIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDYsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQg
c2V0X3BvaW50ZXJfdmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNywg
dmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGVidWdBbm5vdGF0aW9uX05l
c3RlZFZhbHVlPiBUKiBzZXRfbmVzdGVkX3ZhbHVlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oOCk7CisgIH0KKworICB2b2lkIHNldF9sZWdhY3lfanNvbl92YWx1ZShjb25z
dCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg5LCB2YWx1ZS5kYXRhKCks
IHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbGVnYWN5X2pzb25fdmFsdWUoY29uc3Qg
Y2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg5LCBkYXRhLCBzaXpl
KTsKKyAgfQorfTsKKworY2xhc3MgRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
OCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6Cisg
IERlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEs
IHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNp
dCBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBEZWJ1Z0Fubm90YXRpb25f
TmVzdGVkVmFsdWVfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfbmVz
dGVkX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBu
ZXN0ZWRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29s
IGhhc19kaWN0X2tleXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RDaGFycz4g
ZGljdF9rZXlzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0
Q2hhcnM+KDIpOyB9CisgIGJvb2wgaGFzX2RpY3RfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpw
cm90b3plcm86OkNvbnN0Qnl0ZXM+IGRpY3RfdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVw
ZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDMpOyB9CisgIGJvb2wgaGFzX2FycmF5X3Zh
bHVlcygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBhcnJheV92YWx1
ZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4o
NCk7IH0KKyAgYm9vbCBoYXNfaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxp
ZCgpOyB9CisgIGludDY0X3QgaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19p
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX2RvdWJsZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+
KCkudmFsaWQoKTsgfQorICBkb3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gYXQ8
Nj4oKS5hc19kb3VibGUoKTsgfQorICBib29sIGhhc19ib29sX3ZhbHVlKCkgY29uc3QgeyByZXR1
cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIGJvb2wgYm9vbF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDc+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBzdHJp
bmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX3N0cmluZygpOyB9Cit9OworCitj
bGFzcyBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFsdWUgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IERlYnVnQW5ub3RhdGlvbl9OZXN0
ZWRWYWx1ZV9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga05lc3RlZFR5cGVGaWVs
ZE51bWJlciA9IDEsCisgICAga0RpY3RLZXlzRmllbGROdW1iZXIgPSAyLAorICAgIGtEaWN0VmFs
dWVzRmllbGROdW1iZXIgPSAzLAorICAgIGtBcnJheVZhbHVlc0ZpZWxkTnVtYmVyID0gNCwKKyAg
ICBrSW50VmFsdWVGaWVsZE51bWJlciA9IDUsCisgICAga0RvdWJsZVZhbHVlRmllbGROdW1iZXIg
PSA2LAorICAgIGtCb29sVmFsdWVGaWVsZE51bWJlciA9IDcsCisgICAga1N0cmluZ1ZhbHVlRmll
bGROdW1iZXIgPSA4LAorICB9OworICB1c2luZyBOZXN0ZWRUeXBlID0gOjpwZXJmZXR0bzo6cHJv
dG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlOworICBz
dGF0aWMgY29uc3QgTmVzdGVkVHlwZSBVTlNQRUNJRklFRCA9IERlYnVnQW5ub3RhdGlvbl9OZXN0
ZWRWYWx1ZV9OZXN0ZWRUeXBlX1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgTmVzdGVkVHlw
ZSBESUNUID0gRGVidWdBbm5vdGF0aW9uX05lc3RlZFZhbHVlX05lc3RlZFR5cGVfRElDVDsKKyAg
c3RhdGljIGNvbnN0IE5lc3RlZFR5cGUgQVJSQVkgPSBEZWJ1Z0Fubm90YXRpb25fTmVzdGVkVmFs
dWVfTmVzdGVkVHlwZV9BUlJBWTsKKyAgdm9pZCBzZXRfbmVzdGVkX3R5cGUoOjpwZXJmZXR0bzo6
cHJvdG9zOjpwYnplcm86OkRlYnVnQW5ub3RhdGlvbl9OZXN0ZWRWYWx1ZV9OZXN0ZWRUeXBlIHZh
bHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRf
ZGljdF9rZXlzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIs
IHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIGFkZF9kaWN0X2tleXMo
Y29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRh
LCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERlYnVnQW5ub3RhdGlvbl9O
ZXN0ZWRWYWx1ZT4gVCogYWRkX2RpY3RfdmFsdWVzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERlYnVnQW5u
b3RhdGlvbl9OZXN0ZWRWYWx1ZT4gVCogYWRkX2FycmF5X3ZhbHVlcygpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQpOworICB9CisKKyAgdm9pZCBzZXRfaW50X3ZhbHVlKGlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X2RvdWJsZV92YWx1ZShkb3VibGUgdmFsdWUpIHsKKyAgICBBcHBlbmRGaXhlZCg2LCB2YWx1
ZSk7CisgIH0KKyAgdm9pZCBzZXRfYm9vbF92YWx1ZShib29sIHZhbHVlKSB7CisgICAgQXBwZW5k
VGlueVZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0
IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDgsIHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3QgY2hhciog
ZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg4LCBkYXRhLCBzaXplKTsKKyAg
fQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNl
LgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC9sb2dfbWVzc2FnZS5w
Ynplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdp
bi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRU
T19UUkFDRV9UUkFDS19FVkVOVF9MT0dfTUVTU0FHRV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRU
T19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX0xPR19NRVNTQUdFX1BS
T1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21l
c3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJv
L3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9z
IHsKK25hbWVzcGFjZSBwYnplcm8geworCisKK2NsYXNzIExvZ01lc3NhZ2VCb2R5X0RlY29kZXIg
OiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSov
MiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgor
ICBMb2dNZXNzYWdlQm9keV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4p
IDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBMb2dNZXNzYWdl
Qm9keV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IExvZ01lc3NhZ2VCb2R5X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICB1aW50NjRfdCBpaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX2JvZHkoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Q2hhcnMgYm9keSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfc3Ry
aW5nKCk7IH0KK307CisKK2NsYXNzIExvZ01lc3NhZ2VCb2R5IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBMb2dNZXNzYWdlQm9keV9E
ZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAg
ICBrQm9keUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9ib2R5
KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRh
dGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9ib2R5KGNvbnN0IGNoYXIqIGRh
dGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0K
K307CisKK2NsYXNzIExvZ01lc3NhZ2VfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlw
ZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFU
RURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIExvZ01lc3NhZ2VfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgTG9nTWVzc2FnZV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IExvZ01lc3NhZ2VfRGVjb2Rl
cihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfc291cmNlX2xvY2F0aW9uX2lpZCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBzb3VyY2VfbG9j
YXRpb25faWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50NjQoKTsgfQorICBib29s
IGhhc19ib2R5X2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBib2R5X2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KK307
CisKK2NsYXNzIExvZ01lc3NhZ2UgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1
YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IExvZ01lc3NhZ2VfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtTb3VyY2VMb2NhdGlvbklpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrQm9k
eUlpZEZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBzZXRfc291cmNlX2xvY2F0aW9uX2lp
ZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfYm9keV9paWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwg
dmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAv
LyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0
ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3By
b2Nlc3NfZGVzY3JpcHRvci5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9a
ZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9QUk9DRVNTX0RFU0NSSVBUT1Jf
UFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9U
UkFDS19FVkVOVF9QUk9DRVNTX0RFU0NSSVBUT1JfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRl
Zi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6
ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRl
ZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5k
ZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNw
YWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisK
K2VudW0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGUgOiBpbnQzMl90OworCitl
bnVtIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlIDogaW50MzJfdCB7CisgIFBy
b2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfVU5TUEVDSUZJRUQgPSAw
LAorICBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX0JST1dTRVIg
PSAxLAorICBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1JFTkRF
UkVSID0gMiwKKyAgUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19V
VElMSVRZID0gMywKKyAgUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VT
U19aWUdPVEUgPSA0LAorICBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9D
RVNTX1NBTkRCT1hfSEVMUEVSID0gNSwKKyAgUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vz
c1R5cGVfUFJPQ0VTU19HUFUgPSA2LAorICBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNz
VHlwZV9QUk9DRVNTX1BQQVBJX1BMVUdJTiA9IDcsCisgIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9t
ZVByb2Nlc3NUeXBlX1BST0NFU1NfUFBBUElfQlJPS0VSID0gOCwKK307CisKK2NvbnN0IFByb2Nl
c3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlIFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVBy
b2Nlc3NUeXBlX01JTiA9IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NF
U1NfVU5TUEVDSUZJRUQ7Citjb25zdCBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlw
ZSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9NQVggPSBQcm9jZXNzRGVzY3Jp
cHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1BQQVBJX0JST0tFUjsKKworY2xhc3MgUHJv
Y2Vzc0Rlc2NyaXB0b3JfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0Rl
Y29kZXI8LypNQVhfRklFTERfSUQ9Ki82LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERT
PSovdHJ1ZT4geworIHB1YmxpYzoKKyAgUHJvY2Vzc0Rlc2NyaXB0b3JfRGVjb2Rlcihjb25zdCB1
aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikg
e30KKyAgZXhwbGljaXQgUHJvY2Vzc0Rlc2NyaXB0b3JfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmlu
ZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhf
dCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBQcm9jZXNzRGVzY3Jp
cHRvcl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQ
cm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19waWQoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwaWQoKSBjb25zdCB7IHJl
dHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfY21kbGluZSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0
ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPiBjbWRsaW5lKCkgY29uc3QgeyByZXR1cm4g
R2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Q2hhcnM+KDIpOyB9CisgIGJvb2wgaGFzX3By
b2Nlc3NfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6Q29uc3RDaGFycyBwcm9jZXNzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFz
X3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3Byb2Nlc3NfcHJpb3JpdHkoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcm9jZXNzX3ByaW9yaXR5KCkgY29uc3Qg
eyByZXR1cm4gYXQ8NT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9wcm9jZXNz
X3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBjaHJv
bWVfcHJvY2Vzc190eXBlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQzMigpOyB9Cisg
IGJvb2wgaGFzX2xlZ2FjeV9zb3J0X2luZGV4KCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxp
ZCgpOyB9CisgIGludDMyX3QgbGVnYWN5X3NvcnRfaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDwz
PigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIFByb2Nlc3NEZXNjcmlwdG9yIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQcm9j
ZXNzRGVzY3JpcHRvcl9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1BpZEZpZWxk
TnVtYmVyID0gMSwKKyAgICBrQ21kbGluZUZpZWxkTnVtYmVyID0gMiwKKyAgICBrUHJvY2Vzc05h
bWVGaWVsZE51bWJlciA9IDYsCisgICAga1Byb2Nlc3NQcmlvcml0eUZpZWxkTnVtYmVyID0gNSwK
KyAgICBrQ2hyb21lUHJvY2Vzc1R5cGVGaWVsZE51bWJlciA9IDQsCisgICAga0xlZ2FjeVNvcnRJ
bmRleEZpZWxkTnVtYmVyID0gMywKKyAgfTsKKyAgdXNpbmcgQ2hyb21lUHJvY2Vzc1R5cGUgPSA6
OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6UHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vz
c1R5cGU7CisgIHN0YXRpYyBjb25zdCBDaHJvbWVQcm9jZXNzVHlwZSBQUk9DRVNTX1VOU1BFQ0lG
SUVEID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19VTlNQRUNJ
RklFRDsKKyAgc3RhdGljIGNvbnN0IENocm9tZVByb2Nlc3NUeXBlIFBST0NFU1NfQlJPV1NFUiA9
IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NFU1NfQlJPV1NFUjsKKyAg
c3RhdGljIGNvbnN0IENocm9tZVByb2Nlc3NUeXBlIFBST0NFU1NfUkVOREVSRVIgPSBQcm9jZXNz
RGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZV9QUk9DRVNTX1JFTkRFUkVSOworICBzdGF0aWMg
Y29uc3QgQ2hyb21lUHJvY2Vzc1R5cGUgUFJPQ0VTU19VVElMSVRZID0gUHJvY2Vzc0Rlc2NyaXB0
b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VTU19VVElMSVRZOworICBzdGF0aWMgY29uc3QgQ2hy
b21lUHJvY2Vzc1R5cGUgUFJPQ0VTU19aWUdPVEUgPSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQ
cm9jZXNzVHlwZV9QUk9DRVNTX1pZR09URTsKKyAgc3RhdGljIGNvbnN0IENocm9tZVByb2Nlc3NU
eXBlIFBST0NFU1NfU0FOREJPWF9IRUxQRVIgPSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9j
ZXNzVHlwZV9QUk9DRVNTX1NBTkRCT1hfSEVMUEVSOworICBzdGF0aWMgY29uc3QgQ2hyb21lUHJv
Y2Vzc1R5cGUgUFJPQ0VTU19HUFUgPSBQcm9jZXNzRGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlw
ZV9QUk9DRVNTX0dQVTsKKyAgc3RhdGljIGNvbnN0IENocm9tZVByb2Nlc3NUeXBlIFBST0NFU1Nf
UFBBUElfUExVR0lOID0gUHJvY2Vzc0Rlc2NyaXB0b3JfQ2hyb21lUHJvY2Vzc1R5cGVfUFJPQ0VT
U19QUEFQSV9QTFVHSU47CisgIHN0YXRpYyBjb25zdCBDaHJvbWVQcm9jZXNzVHlwZSBQUk9DRVNT
X1BQQVBJX0JST0tFUiA9IFByb2Nlc3NEZXNjcmlwdG9yX0Nocm9tZVByb2Nlc3NUeXBlX1BST0NF
U1NfUFBBUElfQlJPS0VSOworICB2b2lkIHNldF9waWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFw
cGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfY21kbGluZShjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgIH0KKyAgdm9pZCBhZGRfY21kbGluZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQg
c2V0X3Byb2Nlc3NfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRC
eXRlcyg2LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfcHJv
Y2Vzc19uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0
ZXMoNiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfcHJvY2Vzc19wcmlvcml0eShpbnQz
Ml90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNl
dF9jaHJvbWVfcHJvY2Vzc190eXBlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpQcm9jZXNz
RGVzY3JpcHRvcl9DaHJvbWVQcm9jZXNzVHlwZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJ
bnQoNCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2xlZ2FjeV9zb3J0X2luZGV4KGludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIElu
Y2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9z
L3BlcmZldHRvL3RyYWNlL3RyYWNrX2V2ZW50L3NvdXJjZV9sb2NhdGlvbi5wYnplcm8uaAorLy8g
QXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVE
SVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFD
S19FVkVOVF9TT1VSQ0VfTE9DQVRJT05fUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9T
X1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9TT1VSQ0VfTE9DQVRJT05fUFJPVE9f
SF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2Fn
ZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBn
ZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJv
dG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3Mgewor
bmFtZXNwYWNlIHBiemVybyB7CisKKworY2xhc3MgU291cmNlTG9jYXRpb25fRGVjb2RlciA6IHB1
YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAv
KkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFNv
dXJjZUxvY2F0aW9uX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFNvdXJjZUxvY2F0aW9u
X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30K
KyAgZXhwbGljaXQgU291cmNlTG9jYXRpb25fRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30K
KyAgYm9vbCBoYXNfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IGlpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfZmlsZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdENoYXJzIGZpbGVfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCku
YXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfZnVuY3Rpb25fbmFtZSgpIGNvbnN0IHsgcmV0dXJu
IGF0PDM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBmdW5jdGlvbl9u
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhhc19s
aW5lX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICB1aW50MzJf
dCBsaW5lX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfdWludDMyKCk7IH0KK307
CisKK2NsYXNzIFNvdXJjZUxvY2F0aW9uIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsK
KyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTb3VyY2VMb2NhdGlvbl9EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0lpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrRmlsZU5hbWVG
aWVsZE51bWJlciA9IDIsCisgICAga0Z1bmN0aW9uTmFtZUZpZWxkTnVtYmVyID0gMywKKyAgICBr
TGluZU51bWJlckZpZWxkTnVtYmVyID0gNCwKKyAgfTsKKyAgdm9pZCBzZXRfaWlkKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9m
aWxlX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwg
dmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2ZpbGVfbmFtZShj
b25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEs
IHNpemUpOworICB9CisgIHZvaWQgc2V0X2Z1bmN0aW9uX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcm
IHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMywgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkp
OworICB9CisgIHZvaWQgc2V0X2Z1bmN0aW9uX25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90
IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNl
dF9saW5lX251bWJlcih1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1
ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdGFza19l
eGVjdXRpb24ucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21w
aWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9U
T1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZFTlRfVEFTS19FWEVDVVRJT05fUFJPVE9fSF8KKyNk
ZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9U
QVNLX0VYRUNVVElPTl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8
c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZl
dHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3By
b3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8gewor
bmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworCitjbGFzcyBUYXNrRXhl
Y3V0aW9uX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovMSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBUYXNrRXhlY3V0aW9uX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IFRhc2tFeGVjdXRpb25fRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUYXNrRXhlY3V0aW9uX0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3Bvc3RlZF9mcm9tX2lpZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBwb3N0ZWRfZnJvbV9paWQoKSBjb25z
dCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitjbGFzcyBUYXNrRXhlY3V0
aW9uIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERl
Y29kZXIgPSBUYXNrRXhlY3V0aW9uX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBr
UG9zdGVkRnJvbUlpZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgdm9pZCBzZXRfcG9zdGVkX2Zy
b21faWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNl
LgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhl
YWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFja19ldmVudC90aHJlYWRfZGVzY3Jp
cHRvci5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVy
IHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9USFJFQURfREVTQ1JJUFRPUl9QUk9UT19IXworI2Rl
ZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RSQUNLX0VWRU5UX1RI
UkVBRF9ERVNDUklQVE9SX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRl
IDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
cHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAi
cGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7
CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitlbnVtIFRocmVhZERl
c2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZSA6IGludDMyX3Q7CisKK2VudW0gVGhyZWFkRGVzY3Jp
cHRvcl9DaHJvbWVUaHJlYWRUeXBlIDogaW50MzJfdCB7CisgIFRocmVhZERlc2NyaXB0b3JfQ2hy
b21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1VOU1BFQ0lGSUVEID0gMCwKKyAgVGhyZWFkRGVz
Y3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfTUFJTiA9IDEsCisgIFRocmVh
ZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX0lPID0gMiwKKyAgVGhy
ZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfUE9PTF9CR19XT1JL
RVIgPSAzLAorICBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVB
RF9QT09MX0ZHX1dPUktFUiA9IDQsCisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlw
ZV9DSFJPTUVfVEhSRUFEX1BPT0xfRkJfQkxPQ0tJTkcgPSA1LAorICBUaHJlYWREZXNjcmlwdG9y
X0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9QT09MX0JHX0JMT0NLSU5HID0gNiwKKyAg
VGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfUE9PTF9TRVJW
SUNFID0gNywKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJF
QURfQ09NUE9TSVRPUiA9IDgsCisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9D
SFJPTUVfVEhSRUFEX1ZJWl9DT01QT1NJVE9SID0gOSwKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJv
bWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfQ09NUE9TSVRPUl9XT1JLRVIgPSAxMCwKKyAgVGhy
ZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfU0VSVklDRV9XT1JL
RVIgPSAxMSwKKyAgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJF
QURfTUVNT1JZX0lORlJBID0gNTAsCisgIFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlw
ZV9DSFJPTUVfVEhSRUFEX1NBTVBMSU5HX1BST0ZJTEVSID0gNTEsCit9OworCitjb25zdCBUaHJl
YWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGUgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJl
YWRUeXBlX01JTiA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhS
RUFEX1VOU1BFQ0lGSUVEOworY29uc3QgVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBl
IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9NQVggPSBUaHJlYWREZXNjcmlwdG9y
X0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9TQU1QTElOR19QUk9GSUxFUjsKKworY2xh
c3MgVGhyZWFkRGVzY3JpcHRvcl9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzgsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVGhyZWFkRGVzY3JpcHRvcl9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBUaHJlYWREZXNjcmlwdG9yX0RlY29kZXIoY29uc3Qgc3RkOjpz
dHJpbmcmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVp
bnQ4X3QqPihyYXcuZGF0YSgpKSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVGhyZWFkRGVz
Y3JpcHRvcl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19waWQoKSBj
b25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwaWQoKSBjb25zdCB7
IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGlkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdGlkKCkgY29uc3QgeyByZXR1cm4g
YXQ8Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RocmVhZF9uYW1lKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHRocmVh
ZF9uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc19zdHJpbmcoKTsgfQorICBib29sIGhh
c19jaHJvbWVfdGhyZWFkX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0K
KyAgaW50MzJfdCBjaHJvbWVfdGhyZWFkX3R5cGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFz
X2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfcmVmZXJlbmNlX3RpbWVzdGFtcF91cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHJlZmVyZW5jZV90aW1lc3RhbXBf
dXMoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX2ludDY0KCk7IH0KKyAgYm9vbCBoYXNfcmVm
ZXJlbmNlX3RocmVhZF90aW1lX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9
CisgIGludDY0X3QgcmVmZXJlbmNlX3RocmVhZF90aW1lX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8
Nz4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3JlZmVyZW5jZV90aHJlYWRfaW5zdHJ1Y3Rp
b25fY291bnQoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBy
ZWZlcmVuY2VfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4o
KS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2xlZ2FjeV9zb3J0X2luZGV4KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgbGVnYWN5X3NvcnRfaW5kZXgoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KK307CisKK2NsYXNzIFRocmVhZERl
c2NyaXB0b3IgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNp
bmcgRGVjb2RlciA9IFRocmVhZERlc2NyaXB0b3JfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3Qg
eworICAgIGtQaWRGaWVsZE51bWJlciA9IDEsCisgICAga1RpZEZpZWxkTnVtYmVyID0gMiwKKyAg
ICBrVGhyZWFkTmFtZUZpZWxkTnVtYmVyID0gNSwKKyAgICBrQ2hyb21lVGhyZWFkVHlwZUZpZWxk
TnVtYmVyID0gNCwKKyAgICBrUmVmZXJlbmNlVGltZXN0YW1wVXNGaWVsZE51bWJlciA9IDYsCisg
ICAga1JlZmVyZW5jZVRocmVhZFRpbWVVc0ZpZWxkTnVtYmVyID0gNywKKyAgICBrUmVmZXJlbmNl
VGhyZWFkSW5zdHJ1Y3Rpb25Db3VudEZpZWxkTnVtYmVyID0gOCwKKyAgICBrTGVnYWN5U29ydElu
ZGV4RmllbGROdW1iZXIgPSAzLAorICB9OworICB1c2luZyBDaHJvbWVUaHJlYWRUeXBlID0gOjpw
ZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlw
ZTsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01FX1RIUkVBRF9VTlNQRUNJ
RklFRCA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1VO
U1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgQ2hyb21lVGhyZWFkVHlwZSBDSFJPTUVfVEhSRUFE
X01BSU4gPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9N
QUlOOworICBzdGF0aWMgY29uc3QgQ2hyb21lVGhyZWFkVHlwZSBDSFJPTUVfVEhSRUFEX0lPID0g
VGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfSU87CisgIHN0
YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9NRV9USFJFQURfUE9PTF9CR19XT1JLRVIg
PSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9QT09MX0JH
X1dPUktFUjsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01FX1RIUkVBRF9Q
T09MX0ZHX1dPUktFUiA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVf
VEhSRUFEX1BPT0xfRkdfV09SS0VSOworICBzdGF0aWMgY29uc3QgQ2hyb21lVGhyZWFkVHlwZSBD
SFJPTUVfVEhSRUFEX1BPT0xfRkJfQkxPQ0tJTkcgPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRo
cmVhZFR5cGVfQ0hST01FX1RIUkVBRF9QT09MX0ZCX0JMT0NLSU5HOworICBzdGF0aWMgY29uc3Qg
Q2hyb21lVGhyZWFkVHlwZSBDSFJPTUVfVEhSRUFEX1BPT0xfQkdfQkxPQ0tJTkcgPSBUaHJlYWRE
ZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9QT09MX0JHX0JMT0NLSU5H
OworICBzdGF0aWMgY29uc3QgQ2hyb21lVGhyZWFkVHlwZSBDSFJPTUVfVEhSRUFEX1BPT0xfU0VS
VklDRSA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlwZV9DSFJPTUVfVEhSRUFEX1BP
T0xfU0VSVklDRTsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01FX1RIUkVB
RF9DT01QT1NJVE9SID0gVGhyZWFkRGVzY3JpcHRvcl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9U
SFJFQURfQ09NUE9TSVRPUjsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01F
X1RIUkVBRF9WSVpfQ09NUE9TSVRPUiA9IFRocmVhZERlc2NyaXB0b3JfQ2hyb21lVGhyZWFkVHlw
ZV9DSFJPTUVfVEhSRUFEX1ZJWl9DT01QT1NJVE9SOworICBzdGF0aWMgY29uc3QgQ2hyb21lVGhy
ZWFkVHlwZSBDSFJPTUVfVEhSRUFEX0NPTVBPU0lUT1JfV09SS0VSID0gVGhyZWFkRGVzY3JpcHRv
cl9DaHJvbWVUaHJlYWRUeXBlX0NIUk9NRV9USFJFQURfQ09NUE9TSVRPUl9XT1JLRVI7CisgIHN0
YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9NRV9USFJFQURfU0VSVklDRV9XT1JLRVIg
PSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RIUkVBRF9TRVJWSUNF
X1dPUktFUjsKKyAgc3RhdGljIGNvbnN0IENocm9tZVRocmVhZFR5cGUgQ0hST01FX1RIUkVBRF9N
RU1PUllfSU5GUkEgPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVhZFR5cGVfQ0hST01FX1RI
UkVBRF9NRU1PUllfSU5GUkE7CisgIHN0YXRpYyBjb25zdCBDaHJvbWVUaHJlYWRUeXBlIENIUk9N
RV9USFJFQURfU0FNUExJTkdfUFJPRklMRVIgPSBUaHJlYWREZXNjcmlwdG9yX0Nocm9tZVRocmVh
ZFR5cGVfQ0hST01FX1RIUkVBRF9TQU1QTElOR19QUk9GSUxFUjsKKyAgdm9pZCBzZXRfcGlkKGlu
dDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3RpZChpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF90aHJlYWRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAg
ICBBcHBlbmRCeXRlcyg1LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9p
ZCBzZXRfdGhyZWFkX25hbWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBB
cHBlbmRCeXRlcyg1LCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lkIHNldF9jaHJvbWVfdGhyZWFk
X3R5cGUoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlRocmVhZERlc2NyaXB0b3JfQ2hyb21l
VGhyZWFkVHlwZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNCwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X3JlZmVyZW5jZV90aW1lc3RhbXBfdXMoaW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcmVmZXJlbmNlX3RocmVh
ZF90aW1lX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNywgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3JlZmVyZW5jZV90aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnQoaW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
bGVnYWN5X3NvcnRfaW5kZXgoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2
YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8v
IE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdHJh
Y2tfZGVzY3JpcHRvci5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJv
IGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9T
X1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9UUkFDS19ERVNDUklQVE9SX1BST1RP
X0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tf
RVZFTlRfVFJBQ0tfREVTQ1JJUFRPUl9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+Cisj
aW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxk
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3Mg
Q2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3I7CitjbGFzcyBDaHJvbWVUaHJlYWREZXNjcmlwdG9yOwor
Y2xhc3MgQ291bnRlckRlc2NyaXB0b3I7CitjbGFzcyBQcm9jZXNzRGVzY3JpcHRvcjsKK2NsYXNz
IFRocmVhZERlc2NyaXB0b3I7CisKK2NsYXNzIFRyYWNrRGVzY3JpcHRvcl9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzgsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVHJh
Y2tEZXNjcmlwdG9yX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBU
eXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRyYWNrRGVzY3JpcHRv
cl9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9
CisgIGV4cGxpY2l0IFRyYWNrRGVzY3JpcHRvcl9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc191dWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9Cisg
IHVpbnQ2NF90IHV1aWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX3BhcmVudF91dWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9
CisgIHVpbnQ2NF90IHBhcmVudF91dWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8NT4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIG5hbWUoKSBjb25zdCB7IHJldHVybiBhdDwy
PigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3Byb2Nlc3MoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcHJvY2VzcygpIGNv
bnN0IHsgcmV0dXJuIGF0PDM+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jaHJvbWVfcHJv
Y2VzcygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBjaHJvbWVfcHJvY2VzcygpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfYnl0
ZXMoKTsgfQorICBib29sIGhhc190aHJlYWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV90aHJlYWQoKSBjb25zdCB7
IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2hy
b21lX3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfYnl0ZXMoKTsgfQorICBib29s
IGhhc19jb3VudGVyKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIGNvdW50ZXIoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLmFzX2J5
dGVzKCk7IH0KK307CisKK2NsYXNzIFRyYWNrRGVzY3JpcHRvciA6IHB1YmxpYyA6OnByb3RvemVy
bzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2tEZXNjcmlwdG9y
X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVXVpZEZpZWxkTnVtYmVyID0gMSwK
KyAgICBrUGFyZW50VXVpZEZpZWxkTnVtYmVyID0gNSwKKyAgICBrTmFtZUZpZWxkTnVtYmVyID0g
MiwKKyAgICBrUHJvY2Vzc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrQ2hyb21lUHJvY2Vzc0ZpZWxk
TnVtYmVyID0gNiwKKyAgICBrVGhyZWFkRmllbGROdW1iZXIgPSA0LAorICAgIGtDaHJvbWVUaHJl
YWRGaWVsZE51bWJlciA9IDcsCisgICAga0NvdW50ZXJGaWVsZE51bWJlciA9IDgsCisgIH07Cisg
IHZvaWQgc2V0X3V1aWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3BhcmVudF91dWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6
c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIHZhbHVlLmRhdGEoKSwgdmFsdWUu
c2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBz
aXplKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgZGF0YSwgc2l6ZSk7CisgIH0KKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQgPSBQcm9jZXNzRGVzY3JpcHRvcj4gVCogc2V0X3Byb2Nlc3MoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gQ2hyb21lUHJvY2Vzc0Rlc2NyaXB0b3I+IFQqIHNldF9jaHJvbWVfcHJvY2Vzcygp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDYpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBUaHJlYWREZXNjcmlwdG9yPiBUKiBzZXRfdGhyZWFkKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVCA9IENocm9tZVRocmVhZERlc2NyaXB0b3I+IFQqIHNldF9jaHJvbWVfdGhyZWFkKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNyk7CisgIH0KKworICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgVCA9IENvdW50ZXJEZXNjcmlwdG9yPiBUKiBzZXRfY291bnRlcigpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDgpOworICB9CisKK307CisKK30gLy8gTmFt
ZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5j
bHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3Mv
cGVyZmV0dG8vdHJhY2UvdHJhY2tfZXZlbnQvdHJhY2tfZXZlbnQucGJ6ZXJvLmgKKy8vIEF1dG9n
ZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgor
CisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0tfRVZF
TlRfVFJBQ0tfRVZFTlRfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19Q
RVJGRVRUT19UUkFDRV9UUkFDS19FVkVOVF9UUkFDS19FVkVOVF9QUk9UT19IXworCisjaW5jbHVk
ZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5f
YW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2Vk
X3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVk
ZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRl
ZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgor
CituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6
ZXJvIHsKKworY2xhc3MgQ2hyb21lQ29tcG9zaXRvclNjaGVkdWxlclN0YXRlOworY2xhc3MgQ2hy
b21lRnJhbWVSZXBvcnRlcjsKK2NsYXNzIENocm9tZUhpc3RvZ3JhbVNhbXBsZTsKK2NsYXNzIENo
cm9tZUtleWVkU2VydmljZTsKK2NsYXNzIENocm9tZUxhdGVuY3lJbmZvOworY2xhc3MgQ2hyb21l
TGVnYWN5SXBjOworY2xhc3MgQ2hyb21lVXNlckV2ZW50OworY2xhc3MgRGVidWdBbm5vdGF0aW9u
OworY2xhc3MgTG9nTWVzc2FnZTsKK2NsYXNzIFRhc2tFeGVjdXRpb247CitjbGFzcyBUcmFja0V2
ZW50X0xlZ2FjeUV2ZW50OworZW51bSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rp
b24gOiBpbnQzMl90OworZW51bSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNj
b3BlIDogaW50MzJfdDsKK2VudW0gVHJhY2tFdmVudF9UeXBlIDogaW50MzJfdDsKKworZW51bSBU
cmFja0V2ZW50X1R5cGUgOiBpbnQzMl90IHsKKyAgVHJhY2tFdmVudF9UeXBlX1RZUEVfVU5TUEVD
SUZJRUQgPSAwLAorICBUcmFja0V2ZW50X1R5cGVfVFlQRV9TTElDRV9CRUdJTiA9IDEsCisgIFRy
YWNrRXZlbnRfVHlwZV9UWVBFX1NMSUNFX0VORCA9IDIsCisgIFRyYWNrRXZlbnRfVHlwZV9UWVBF
X0lOU1RBTlQgPSAzLAorICBUcmFja0V2ZW50X1R5cGVfVFlQRV9DT1VOVEVSID0gNCwKK307CisK
K2NvbnN0IFRyYWNrRXZlbnRfVHlwZSBUcmFja0V2ZW50X1R5cGVfTUlOID0gVHJhY2tFdmVudF9U
eXBlX1RZUEVfVU5TUEVDSUZJRUQ7Citjb25zdCBUcmFja0V2ZW50X1R5cGUgVHJhY2tFdmVudF9U
eXBlX01BWCA9IFRyYWNrRXZlbnRfVHlwZV9UWVBFX0NPVU5URVI7CisKK2VudW0gVHJhY2tFdmVu
dF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uIDogaW50MzJfdCB7CisgIFRyYWNrRXZlbnRfTGVn
YWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9XX1VOU1BFQ0lGSUVEID0gMCwKKyAgVHJhY2tFdmVu
dF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9uX0ZMT1dfSU4gPSAxLAorICBUcmFja0V2ZW50X0xl
Z2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb25fRkxPV19PVVQgPSAyLAorICBUcmFja0V2ZW50X0xlZ2Fj
eUV2ZW50X0Zsb3dEaXJlY3Rpb25fRkxPV19JTk9VVCA9IDMsCit9OworCitjb25zdCBUcmFja0V2
ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb24gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93
RGlyZWN0aW9uX01JTiA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9X
X1VOU1BFQ0lGSUVEOworY29uc3QgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9GbG93RGlyZWN0aW9u
IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9NQVggPSBUcmFja0V2ZW50X0xl
Z2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb25fRkxPV19JTk9VVDsKKworZW51bSBUcmFja0V2ZW50X0xl
Z2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlIDogaW50MzJfdCB7CisgIFRyYWNrRXZlbnRfTGVn
YWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVU5TUEVDSUZJRUQgPSAwLAorICBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX0dMT0JBTCA9IDEsCisg
IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfUFJPQ0VTUyA9
IDIsCisgIFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVEhS
RUFEID0gMywKK307CisKK2NvbnN0IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50
U2NvcGUgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9NSU4gPSBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX1NDT1BFX1VOU1BFQ0lGSUVEOwor
Y29uc3QgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZSBUcmFja0V2ZW50
X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX01BWCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZl
bnRfSW5zdGFudEV2ZW50U2NvcGVfU0NPUEVfVEhSRUFEOworCitjbGFzcyBFdmVudE5hbWVfRGVj
b2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERf
SUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJs
aWM6CisgIEV2ZW50TmFtZV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4p
IDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBFdmVudE5hbWVf
RGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQor
ICBleHBsaWNpdCBFdmVudE5hbWVfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9v
bCBoYXNfaWlkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGlpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc19zdHJpbmcoKTsgfQor
fTsKKworY2xhc3MgRXZlbnROYW1lIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBw
dWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBFdmVudE5hbWVfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtJaWRGaWVsZE51bWJlciA9IDEsCisgICAga05hbWVGaWVsZE51bWJlciA9
IDIsCisgIH07CisgIHZvaWQgc2V0X2lpZCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYg
dmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7
CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewor
ICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9Cit9OworCitjbGFzcyBFdmVudENh
dGVnb3J5X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNl
PiB7CisgcHVibGljOgorICBFdmVudENhdGVnb3J5X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0
YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxp
Y2l0IEV2ZW50Q2F0ZWdvcnlfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBFdmVudENhdGVnb3J5X0RlY29kZXIoY29uc3Qg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0
YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2lpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBpaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3Vp
bnQ2NCgpOyB9CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlk
KCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Q2hhcnMgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfc3RyaW5nKCk7IH0KK307CisKK2NsYXNzIEV2ZW50Q2F0ZWdvcnkgOiBwdWJsaWMg
Ojpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IEV2ZW50
Q2F0ZWdvcnlfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtJaWRGaWVsZE51bWJl
ciA9IDEsCisgICAga05hbWVGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2lpZCh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygy
LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25z
dCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNp
emUpOworICB9Cit9OworCitjbGFzcyBUcmFja0V2ZW50RGVmYXVsdHNfRGVjb2RlciA6IHB1Ymxp
YyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8zMSwgLypI
QVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+IHsKKyBwdWJsaWM6CisgIFRyYWNr
RXZlbnREZWZhdWx0c19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDog
VHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50RGVm
YXVsdHNfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVy
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgp
KSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50RGVmYXVsdHNfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfdHJhY2tfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigp
LnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdHJhY2tfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEx
PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2V4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMo
KSBjb25zdCB7IHJldHVybiBhdDwzMT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBl
YXRlZEZpZWxkSXRlcmF0b3I8dWludDY0X3Q+IGV4dHJhX2NvdW50ZXJfdHJhY2tfdXVpZHMoKSBj
b25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDx1aW50NjRfdD4oMzEpOyB9Cit9OworCitjbGFzcyBU
cmFja0V2ZW50RGVmYXVsdHMgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNrRXZlbnREZWZhdWx0c19EZWNvZGVyOworICBlbnVt
IDogaW50MzJfdCB7CisgICAga1RyYWNrVXVpZEZpZWxkTnVtYmVyID0gMTEsCisgICAga0V4dHJh
Q291bnRlclRyYWNrVXVpZHNGaWVsZE51bWJlciA9IDMxLAorICB9OworICB2b2lkIHNldF90cmFj
a191dWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDExLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBhZGRfZXh0cmFfY291bnRlcl90cmFja191dWlkcyh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzMSwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBUcmFja0V2
ZW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFY
X0ZJRUxEX0lEPSovMzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7
CisgcHVibGljOgorICBUcmFja0V2ZW50X0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRy
YWNrRXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBUcmFja0V2ZW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2NhdGVnb3J5X2lpZHMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjx1aW50NjRfdD4g
Y2F0ZWdvcnlfaWlkcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPHVpbnQ2NF90PigzKTsg
fQorICBib29sIGhhc19jYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MjI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpD
b25zdENoYXJzPiBjYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90
b3plcm86OkNvbnN0Q2hhcnM+KDIyKTsgfQorICBib29sIGhhc19uYW1lX2lpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDEwPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbmFtZV9paWQoKSBjb25zdCB7
IHJldHVybiBhdDwxMD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MjM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBu
YW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8MjM+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNf
dHlwZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHR5cGUo
KSBjb25zdCB7IHJldHVybiBhdDw5PigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdHJhY2tf
dXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdHJh
Y2tfdXVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDExPigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wg
aGFzX2NvdW50ZXJfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwzMD4oKS52YWxpZCgpOyB9Cisg
IGludDY0X3QgY291bnRlcl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDMwPigpLmFzX2ludDY0
KCk7IH0KKyAgYm9vbCBoYXNfZXh0cmFfY291bnRlcl90cmFja191dWlkcygpIGNvbnN0IHsgcmV0
dXJuIGF0PDMxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVy
YXRvcjx1aW50NjRfdD4gZXh0cmFfY291bnRlcl90cmFja191dWlkcygpIGNvbnN0IHsgcmV0dXJu
IEdldFJlcGVhdGVkPHVpbnQ2NF90PigzMSk7IH0KKyAgYm9vbCBoYXNfZXh0cmFfY291bnRlcl92
YWx1ZXMoKSBjb25zdCB7IHJldHVybiBhdDwxMj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJv
OjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8aW50NjRfdD4gZXh0cmFfY291bnRlcl92YWx1ZXMoKSBj
b25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDxpbnQ2NF90PigxMik7IH0KKyAgYm9vbCBoYXNfZGVi
dWdfYW5ub3RhdGlvbnMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4g
ZGVidWdfYW5ub3RhdGlvbnMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVy
bzo6Q29uc3RCeXRlcz4oNCk7IH0KKyAgYm9vbCBoYXNfdGFza19leGVjdXRpb24oKSBjb25zdCB7
IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdGFz
a19leGVjdXRpb24oKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfbG9nX21lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBhdDwyMT4oKS52YWxpZCgpOyB9Cisg
IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGxvZ19tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gYXQ8
MjE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jY19zY2hlZHVsZXJfc3RhdGUoKSBjb25z
dCB7IHJldHVybiBhdDwyND4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
IGNjX3NjaGVkdWxlcl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI0PigpLmFzX2J5dGVzKCk7
IH0KKyAgYm9vbCBoYXNfY2hyb21lX3VzZXJfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDwyNT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9tZV91c2VyX2V2ZW50
KCkgY29uc3QgeyByZXR1cm4gYXQ8MjU+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jaHJv
bWVfa2V5ZWRfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI2PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2hyb21lX2tleWVkX3NlcnZpY2UoKSBjb25zdCB7IHJl
dHVybiBhdDwyNj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9sZWdhY3lfaXBj
KCkgY29uc3QgeyByZXR1cm4gYXQ8Mjc+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29u
c3RCeXRlcyBjaHJvbWVfbGVnYWN5X2lwYygpIGNvbnN0IHsgcmV0dXJuIGF0PDI3PigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfY2hyb21lX2hpc3RvZ3JhbV9zYW1wbGUoKSBjb25zdCB7IHJl
dHVybiBhdDwyOD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9t
ZV9oaXN0b2dyYW1fc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjg+KCkuYXNfYnl0ZXMoKTsg
fQorICBib29sIGhhc19jaHJvbWVfbGF0ZW5jeV9pbmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjk+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBjaHJvbWVfbGF0ZW5jeV9p
bmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8Mjk+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19j
aHJvbWVfZnJhbWVfcmVwb3J0ZXIoKSBjb25zdCB7IHJldHVybiBhdDwzMj4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNocm9tZV9mcmFtZV9yZXBvcnRlcigpIGNvbnN0
IHsgcmV0dXJuIGF0PDMyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1wX2Rl
bHRhX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGlt
ZXN0YW1wX2RlbHRhX3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQ2NCgpOyB9Cisg
IGJvb2wgaGFzX3RpbWVzdGFtcF9hYnNvbHV0ZV91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDE2Pigp
LnZhbGlkKCk7IH0KKyAgaW50NjRfdCB0aW1lc3RhbXBfYWJzb2x1dGVfdXMoKSBjb25zdCB7IHJl
dHVybiBhdDwxNj4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RocmVhZF90aW1lX2RlbHRh
X3VzKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGhyZWFk
X3RpbWVfZGVsdGFfdXMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX2ludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfdGhyZWFkX3RpbWVfYWJzb2x1dGVfdXMoKSBjb25zdCB7IHJldHVybiBhdDwxNz4o
KS52YWxpZCgpOyB9CisgIGludDY0X3QgdGhyZWFkX3RpbWVfYWJzb2x1dGVfdXMoKSBjb25zdCB7
IHJldHVybiBhdDwxNz4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RocmVhZF9pbnN0cnVj
dGlvbl9jb3VudF9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICBp
bnQ2NF90IHRocmVhZF9pbnN0cnVjdGlvbl9jb3VudF9kZWx0YSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDg+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc190aHJlYWRfaW5zdHJ1Y3Rpb25fY291bnRf
YWJzb2x1dGUoKSBjb25zdCB7IHJldHVybiBhdDwyMD4oKS52YWxpZCgpOyB9CisgIGludDY0X3Qg
dGhyZWFkX2luc3RydWN0aW9uX2NvdW50X2Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8MjA+
KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19sZWdhY3lfZXZlbnQoKSBjb25zdCB7IHJldHVy
biBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgbGVnYWN5X2V2
ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS5hc19ieXRlcygpOyB9Cit9OworCitjbGFzcyBU
cmFja0V2ZW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBUcmFja0V2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAg
ICBrQ2F0ZWdvcnlJaWRzRmllbGROdW1iZXIgPSAzLAorICAgIGtDYXRlZ29yaWVzRmllbGROdW1i
ZXIgPSAyMiwKKyAgICBrTmFtZUlpZEZpZWxkTnVtYmVyID0gMTAsCisgICAga05hbWVGaWVsZE51
bWJlciA9IDIzLAorICAgIGtUeXBlRmllbGROdW1iZXIgPSA5LAorICAgIGtUcmFja1V1aWRGaWVs
ZE51bWJlciA9IDExLAorICAgIGtDb3VudGVyVmFsdWVGaWVsZE51bWJlciA9IDMwLAorICAgIGtF
eHRyYUNvdW50ZXJUcmFja1V1aWRzRmllbGROdW1iZXIgPSAzMSwKKyAgICBrRXh0cmFDb3VudGVy
VmFsdWVzRmllbGROdW1iZXIgPSAxMiwKKyAgICBrRGVidWdBbm5vdGF0aW9uc0ZpZWxkTnVtYmVy
ID0gNCwKKyAgICBrVGFza0V4ZWN1dGlvbkZpZWxkTnVtYmVyID0gNSwKKyAgICBrTG9nTWVzc2Fn
ZUZpZWxkTnVtYmVyID0gMjEsCisgICAga0NjU2NoZWR1bGVyU3RhdGVGaWVsZE51bWJlciA9IDI0
LAorICAgIGtDaHJvbWVVc2VyRXZlbnRGaWVsZE51bWJlciA9IDI1LAorICAgIGtDaHJvbWVLZXll
ZFNlcnZpY2VGaWVsZE51bWJlciA9IDI2LAorICAgIGtDaHJvbWVMZWdhY3lJcGNGaWVsZE51bWJl
ciA9IDI3LAorICAgIGtDaHJvbWVIaXN0b2dyYW1TYW1wbGVGaWVsZE51bWJlciA9IDI4LAorICAg
IGtDaHJvbWVMYXRlbmN5SW5mb0ZpZWxkTnVtYmVyID0gMjksCisgICAga0Nocm9tZUZyYW1lUmVw
b3J0ZXJGaWVsZE51bWJlciA9IDMyLAorICAgIGtUaW1lc3RhbXBEZWx0YVVzRmllbGROdW1iZXIg
PSAxLAorICAgIGtUaW1lc3RhbXBBYnNvbHV0ZVVzRmllbGROdW1iZXIgPSAxNiwKKyAgICBrVGhy
ZWFkVGltZURlbHRhVXNGaWVsZE51bWJlciA9IDIsCisgICAga1RocmVhZFRpbWVBYnNvbHV0ZVVz
RmllbGROdW1iZXIgPSAxNywKKyAgICBrVGhyZWFkSW5zdHJ1Y3Rpb25Db3VudERlbHRhRmllbGRO
dW1iZXIgPSA4LAorICAgIGtUaHJlYWRJbnN0cnVjdGlvbkNvdW50QWJzb2x1dGVGaWVsZE51bWJl
ciA9IDIwLAorICAgIGtMZWdhY3lFdmVudEZpZWxkTnVtYmVyID0gNiwKKyAgfTsKKyAgdXNpbmcg
TGVnYWN5RXZlbnQgPSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudF9MZWdh
Y3lFdmVudDsKKyAgdXNpbmcgVHlwZSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFj
a0V2ZW50X1R5cGU7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfVU5TUEVDSUZJRUQgPSBUcmFj
a0V2ZW50X1R5cGVfVFlQRV9VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9T
TElDRV9CRUdJTiA9IFRyYWNrRXZlbnRfVHlwZV9UWVBFX1NMSUNFX0JFR0lOOworICBzdGF0aWMg
Y29uc3QgVHlwZSBUWVBFX1NMSUNFX0VORCA9IFRyYWNrRXZlbnRfVHlwZV9UWVBFX1NMSUNFX0VO
RDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9JTlNUQU5UID0gVHJhY2tFdmVudF9UeXBlX1RZ
UEVfSU5TVEFOVDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9DT1VOVEVSID0gVHJhY2tFdmVu
dF9UeXBlX1RZUEVfQ09VTlRFUjsKKyAgdm9pZCBhZGRfY2F0ZWdvcnlfaWlkcyh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfY2F0
ZWdvcmllcyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygyMiwg
dmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgYWRkX2NhdGVnb3JpZXMo
Y29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyMiwgZGF0
YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZV9paWQodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMTAsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0
ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIzLCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIzLCBkYXRhLCBzaXplKTsKKyAgfQorICB2b2lk
IHNldF90eXBlKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50X1R5cGUgdmFs
dWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50KDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90
cmFja191dWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDExLCB2YWx1ZSk7
CisgIH0KKyAgdm9pZCBzZXRfY291bnRlcl92YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBw
ZW5kVmFySW50KDMwLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfZXh0cmFfY291bnRlcl90cmFj
a191dWlkcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgYWRkX2V4dHJhX2NvdW50ZXJfdmFsdWVzKGludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMTIsIHZhbHVlKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IERlYnVnQW5ub3RhdGlvbj4gVCogYWRkX2RlYnVnX2Fubm90YXRpb25zKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IFRhc2tFeGVjdXRpb24+IFQqIHNldF90YXNrX2V4ZWN1dGlvbigpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQg
PSBMb2dNZXNzYWdlPiBUKiBzZXRfbG9nX21lc3NhZ2UoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPigyMSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9t
ZUNvbXBvc2l0b3JTY2hlZHVsZXJTdGF0ZT4gVCogc2V0X2NjX3NjaGVkdWxlcl9zdGF0ZSgpIHsK
KyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI0KTsKKyAgfQorCisgIHRlbXBsYXRl
IDx0eXBlbmFtZSBUID0gQ2hyb21lVXNlckV2ZW50PiBUKiBzZXRfY2hyb21lX3VzZXJfZXZlbnQo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyNSk7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUtleWVkU2VydmljZT4gVCogc2V0X2Nocm9tZV9rZXll
ZF9zZXJ2aWNlKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjYpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDaHJvbWVMZWdhY3lJcGM+IFQqIHNldF9jaHJv
bWVfbGVnYWN5X2lwYygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDI3KTsK
KyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lSGlzdG9ncmFtU2FtcGxlPiBU
KiBzZXRfY2hyb21lX2hpc3RvZ3JhbV9zYW1wbGUoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigyOCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUxh
dGVuY3lJbmZvPiBUKiBzZXRfY2hyb21lX2xhdGVuY3lfaW5mbygpIHsKKyAgICByZXR1cm4gQmVn
aW5OZXN0ZWRNZXNzYWdlPFQ+KDI5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
Q2hyb21lRnJhbWVSZXBvcnRlcj4gVCogc2V0X2Nocm9tZV9mcmFtZV9yZXBvcnRlcigpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMyKTsKKyAgfQorCisgIHZvaWQgc2V0X3Rp
bWVzdGFtcF9kZWx0YV91cyhpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF90aW1lc3RhbXBfYWJzb2x1dGVfdXMoaW50NjRfdCB2YWx1
ZSkgeworICAgIEFwcGVuZFZhckludCgxNiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RocmVh
ZF90aW1lX2RlbHRhX3VzKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X3RocmVhZF90aW1lX2Fic29sdXRlX3VzKGludDY0X3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTcsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90aHJl
YWRfaW5zdHJ1Y3Rpb25fY291bnRfZGVsdGEoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZh
ckludCg4LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdGhyZWFkX2luc3RydWN0aW9uX2NvdW50
X2Fic29sdXRlKGludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMjAsIHZhbHVlKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnQ+IFQq
IHNldF9sZWdhY3lfZXZlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2
KTsKKyAgfQorCit9OworCitjbGFzcyBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0RlY29kZXIgOiBw
dWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMTks
IC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAg
VHJhY2tFdmVudF9MZWdhY3lFdmVudF9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBUcmFj
a0V2ZW50X0xlZ2FjeUV2ZW50X0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdykgOiBUeXBl
ZFByb3RvRGVjb2RlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYXcuZGF0YSgp
KSwgcmF3LnNpemUoKSkge30KKyAgZXhwbGljaXQgVHJhY2tFdmVudF9MZWdhY3lFdmVudF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19uYW1lX2lpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBuYW1lX2lpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcGhhc2UoKSBjb25zdCB7
IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwaGFzZSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDI+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19kdXJhdGlvbl91cygpIGNvbnN0
IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGR1cmF0aW9uX3VzKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19pbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3RocmVhZF9kdXJh
dGlvbl91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IHRo
cmVhZF9kdXJhdGlvbl91cygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCkuYXNfaW50NjQoKTsgfQor
ICBib29sIGhhc190aHJlYWRfaW5zdHJ1Y3Rpb25fZGVsdGEoKSBjb25zdCB7IHJldHVybiBhdDwx
NT4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgdGhyZWFkX2luc3RydWN0aW9uX2RlbHRhKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTU+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc191bnNjb3BlZF9p
ZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCB1bnNjb3Bl
ZF9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNf
bG9jYWxfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90
IGxvY2FsX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTA+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9v
bCBoYXNfZ2xvYmFsX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCBnbG9iYWxfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc19pZF9zY29wZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBpZF9zY29wZSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDc+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfdXNlX2FzeW5jX3R0cygpIGNvbnN0IHsg
cmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICBib29sIHVzZV9hc3luY190dHMoKSBjb25zdCB7
IHJldHVybiBhdDw5PigpLmFzX2Jvb2woKTsgfQorICBib29sIGhhc19iaW5kX2lkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGJpbmRfaWQoKSBjb25zdCB7
IHJldHVybiBhdDw4PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2JpbmRfdG9fZW5jbG9z
aW5nKCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkudmFsaWQoKTsgfQorICBib29sIGJpbmRfdG9f
ZW5jbG9zaW5nKCkgY29uc3QgeyByZXR1cm4gYXQ8MTI+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wg
aGFzX2Zsb3dfZGlyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkudmFsaWQoKTsgfQor
ICBpbnQzMl90IGZsb3dfZGlyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkuYXNfaW50
MzIoKTsgfQorICBib29sIGhhc19pbnN0YW50X2V2ZW50X3Njb3BlKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTQ+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IGluc3RhbnRfZXZlbnRfc2NvcGUoKSBjb25z
dCB7IHJldHVybiBhdDwxND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BpZF9vdmVycmlk
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE4PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwaWRfb3Zl
cnJpZGUoKSBjb25zdCB7IHJldHVybiBhdDwxOD4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFz
X3RpZF9vdmVycmlkZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE5PigpLnZhbGlkKCk7IH0KKyAgaW50
MzJfdCB0aWRfb3ZlcnJpZGUoKSBjb25zdCB7IHJldHVybiBhdDwxOT4oKS5hc19pbnQzMigpOyB9
Cit9OworCitjbGFzcyBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50IDogcHVibGljIDo6cHJvdG96ZXJv
OjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBUcmFja0V2ZW50X0xlZ2Fj
eUV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrTmFtZUlpZEZpZWxkTnVt
YmVyID0gMSwKKyAgICBrUGhhc2VGaWVsZE51bWJlciA9IDIsCisgICAga0R1cmF0aW9uVXNGaWVs
ZE51bWJlciA9IDMsCisgICAga1RocmVhZER1cmF0aW9uVXNGaWVsZE51bWJlciA9IDQsCisgICAg
a1RocmVhZEluc3RydWN0aW9uRGVsdGFGaWVsZE51bWJlciA9IDE1LAorICAgIGtVbnNjb3BlZElk
RmllbGROdW1iZXIgPSA2LAorICAgIGtMb2NhbElkRmllbGROdW1iZXIgPSAxMCwKKyAgICBrR2xv
YmFsSWRGaWVsZE51bWJlciA9IDExLAorICAgIGtJZFNjb3BlRmllbGROdW1iZXIgPSA3LAorICAg
IGtVc2VBc3luY1R0c0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrQmluZElkRmllbGROdW1iZXIgPSA4
LAorICAgIGtCaW5kVG9FbmNsb3NpbmdGaWVsZE51bWJlciA9IDEyLAorICAgIGtGbG93RGlyZWN0
aW9uRmllbGROdW1iZXIgPSAxMywKKyAgICBrSW5zdGFudEV2ZW50U2NvcGVGaWVsZE51bWJlciA9
IDE0LAorICAgIGtQaWRPdmVycmlkZUZpZWxkTnVtYmVyID0gMTgsCisgICAga1RpZE92ZXJyaWRl
RmllbGROdW1iZXIgPSAxOSwKKyAgfTsKKyAgdXNpbmcgRmxvd0RpcmVjdGlvbiA9IDo6cGVyZmV0
dG86OnByb3Rvczo6cGJ6ZXJvOjpUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb247
CisgIHVzaW5nIEluc3RhbnRFdmVudFNjb3BlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86
OlRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfSW5zdGFudEV2ZW50U2NvcGU7CisgIHN0YXRpYyBjb25z
dCBGbG93RGlyZWN0aW9uIEZMT1dfVU5TUEVDSUZJRUQgPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50
X0Zsb3dEaXJlY3Rpb25fRkxPV19VTlNQRUNJRklFRDsKKyAgc3RhdGljIGNvbnN0IEZsb3dEaXJl
Y3Rpb24gRkxPV19JTiA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9X
X0lOOworICBzdGF0aWMgY29uc3QgRmxvd0RpcmVjdGlvbiBGTE9XX09VVCA9IFRyYWNrRXZlbnRf
TGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlvbl9GTE9XX09VVDsKKyAgc3RhdGljIGNvbnN0IEZsb3dE
aXJlY3Rpb24gRkxPV19JTk9VVCA9IFRyYWNrRXZlbnRfTGVnYWN5RXZlbnRfRmxvd0RpcmVjdGlv
bl9GTE9XX0lOT1VUOworICBzdGF0aWMgY29uc3QgSW5zdGFudEV2ZW50U2NvcGUgU0NPUEVfVU5T
UEVDSUZJRUQgPSBUcmFja0V2ZW50X0xlZ2FjeUV2ZW50X0luc3RhbnRFdmVudFNjb3BlX1NDT1BF
X1VOU1BFQ0lGSUVEOworICBzdGF0aWMgY29uc3QgSW5zdGFudEV2ZW50U2NvcGUgU0NPUEVfR0xP
QkFMID0gVHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9TQ09QRV9HTE9C
QUw7CisgIHN0YXRpYyBjb25zdCBJbnN0YW50RXZlbnRTY29wZSBTQ09QRV9QUk9DRVNTID0gVHJh
Y2tFdmVudF9MZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9TQ09QRV9QUk9DRVNTOworICBz
dGF0aWMgY29uc3QgSW5zdGFudEV2ZW50U2NvcGUgU0NPUEVfVEhSRUFEID0gVHJhY2tFdmVudF9M
ZWdhY3lFdmVudF9JbnN0YW50RXZlbnRTY29wZV9TQ09QRV9USFJFQUQ7CisgIHZvaWQgc2V0X25h
bWVfaWlkKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9waGFzZShpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIs
IHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9kdXJhdGlvbl91cyhpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90aHJlYWRfZHVyYXRp
b25fdXMoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0K
KyAgdm9pZCBzZXRfdGhyZWFkX2luc3RydWN0aW9uX2RlbHRhKGludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMTUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF91bnNjb3BlZF9pZCh1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfbG9jYWxfaWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTAsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9nbG9iYWxfaWQodWludDY0X3QgdmFsdWUpIHsKKyAgICBB
cHBlbmRWYXJJbnQoMTEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pZF9zY29wZShjb25zdCBz
dGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg3LCB2YWx1ZS5kYXRhKCksIHZh
bHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfaWRfc2NvcGUoY29uc3QgY2hhciogZGF0YSwg
c2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcyg3LCBkYXRhLCBzaXplKTsKKyAgfQorICB2
b2lkIHNldF91c2VfYXN5bmNfdHRzKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50
KDksIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9iaW5kX2lkKHVpbnQ2NF90IHZhbHVlKSB7Cisg
ICAgQXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9iaW5kX3RvX2VuY2xv
c2luZyhib29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCgxMiwgdmFsdWUpOworICB9
CisgIHZvaWQgc2V0X2Zsb3dfZGlyZWN0aW9uKDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpU
cmFja0V2ZW50X0xlZ2FjeUV2ZW50X0Zsb3dEaXJlY3Rpb24gdmFsdWUpIHsKKyAgICBBcHBlbmRU
aW55VmFySW50KDEzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfaW5zdGFudF9ldmVudF9zY29w
ZSg6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2tFdmVudF9MZWdhY3lFdmVudF9JbnN0
YW50RXZlbnRTY29wZSB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMTQsIHZhbHVlKTsK
KyAgfQorICB2b2lkIHNldF9waWRfb3ZlcnJpZGUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCgxOCwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3RpZF9vdmVycmlkZShpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDE5LCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8g
TmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8g
SW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90
b3MvcGVyZmV0dG8vdHJhY2UvaW50ZXJuZWRfZGF0YS9pbnRlcm5lZF9kYXRhLnBiemVyby5oCisv
LyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1Qg
RURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0lO
VEVSTkVEX0RBVEFfSU5URVJORURfREFUQV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9U
T1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX0lOVEVSTkVEX0RBVEFfSU5URVJORURfREFUQV9QUk9U
T19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNz
YWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4
cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8v
IGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9w
cm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7
CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgQ2FsbHN0YWNrOworY2xhc3MgRGVidWdBbm5v
dGF0aW9uTmFtZTsKK2NsYXNzIEV2ZW50Q2F0ZWdvcnk7CitjbGFzcyBFdmVudE5hbWU7CitjbGFz
cyBGcmFtZTsKK2NsYXNzIEludGVybmVkR3B1UmVuZGVyU3RhZ2VTcGVjaWZpY2F0aW9uOworY2xh
c3MgSW50ZXJuZWRHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBJbnRlcm5lZFN0cmluZzsKK2NsYXNz
IExvZ01lc3NhZ2VCb2R5OworY2xhc3MgTWFwcGluZzsKK2NsYXNzIFByb2ZpbGVkRnJhbWVTeW1i
b2xzOworY2xhc3MgU291cmNlTG9jYXRpb247CisKK2NsYXNzIEludGVybmVkRGF0YV9EZWNvZGVy
IDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0q
LzI0LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoK
KyAgSW50ZXJuZWREYXRhX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikg
OiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IEludGVybmVkRGF0
YV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9
CisgIGV4cGxpY2l0IEludGVybmVkRGF0YV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQor
ICBib29sIGhhc19ldmVudF9jYXRlZ29yaWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86
OkNvbnN0Qnl0ZXM+IGV2ZW50X2NhdGVnb3JpZXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRl
ZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfZXZlbnRfbmFtZXMo
KSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVh
dGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZXZlbnRfbmFtZXMoKSBj
b25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMik7IH0K
KyAgYm9vbCBoYXNfZGVidWdfYW5ub3RhdGlvbl9uYW1lcygpIGNvbnN0IHsgcmV0dXJuIGF0PDM+
KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzPiBkZWJ1Z19hbm5vdGF0aW9uX25hbWVzKCkgY29uc3QgeyByZXR1
cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDMpOyB9CisgIGJvb2wgaGFz
X3NvdXJjZV9sb2NhdGlvbnMoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4gc291cmNlX2xvY2F0aW9ucygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPig0KTsgfQorICBib29sIGhhc19sb2dfbWVzc2FnZV9ib2R5KCkgY29u
c3QgeyByZXR1cm4gYXQ8MjA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRG
aWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBsb2dfbWVzc2FnZV9ib2R5KCkg
Y29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDIwKTsg
fQorICBib29sIGhhc19idWlsZF9pZHMoKSBjb25zdCB7IHJldHVybiBhdDwxNj4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+IGJ1aWxkX2lkcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPigxNik7IH0KKyAgYm9vbCBoYXNfbWFwcGluZ19wYXRocygpIGNvbnN0
IHsgcmV0dXJuIGF0PDE3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmll
bGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gbWFwcGluZ19wYXRocygpIGNvbnN0
IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxNyk7IH0KKyAg
Ym9vbCBoYXNfc291cmNlX3BhdGhzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTg+KCkudmFsaWQoKTsg
fQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25z
dEJ5dGVzPiBzb3VyY2VfcGF0aHMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3Rv
emVybzo6Q29uc3RCeXRlcz4oMTgpOyB9CisgIGJvb2wgaGFzX2Z1bmN0aW9uX25hbWVzKCkgY29u
c3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZp
ZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGZ1bmN0aW9uX25hbWVzKCkgY29u
c3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDUpOyB9Cisg
IGJvb2wgaGFzX3Byb2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSBjb25zdCB7IHJldHVybiBhdDwyMT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90
b3plcm86OkNvbnN0Qnl0ZXM+IHByb2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSBjb25zdCB7IHJldHVy
biBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMjEpOyB9CisgIGJvb2wgaGFz
X21hcHBpbmdzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTk+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBtYXBw
aW5ncygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
PigxOSk7IH0KKyAgYm9vbCBoYXNfZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nj4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86
OkNvbnN0Qnl0ZXM+IGZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPig2KTsgfQorICBib29sIGhhc19jYWxsc3RhY2tzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRl
cmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IGNhbGxzdGFja3MoKSBjb25zdCB7IHJldHVy
biBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oNyk7IH0KKyAgYm9vbCBoYXNf
dnVsa2FuX21lbW9yeV9rZXlzKCkgY29uc3QgeyByZXR1cm4gYXQ8MjI+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzPiB2dWxrYW5fbWVtb3J5X2tleXMoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnBy
b3RvemVybzo6Q29uc3RCeXRlcz4oMjIpOyB9CisgIGJvb2wgaGFzX2dyYXBoaWNzX2NvbnRleHRz
KCkgY29uc3QgeyByZXR1cm4gYXQ8MjM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVw
ZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBncmFwaGljc19jb250
ZXh0cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
PigyMyk7IH0KKyAgYm9vbCBoYXNfZ3B1X3NwZWNpZmljYXRpb25zKCkgY29uc3QgeyByZXR1cm4g
YXQ8MjQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9y
PDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiBncHVfc3BlY2lmaWNhdGlvbnMoKSBjb25zdCB7IHJl
dHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMjQpOyB9Cit9OworCitj
bGFzcyBJbnRlcm5lZERhdGEgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IEludGVybmVkRGF0YV9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga0V2ZW50Q2F0ZWdvcmllc0ZpZWxkTnVtYmVyID0gMSwKKyAgICBrRXZlbnRO
YW1lc0ZpZWxkTnVtYmVyID0gMiwKKyAgICBrRGVidWdBbm5vdGF0aW9uTmFtZXNGaWVsZE51bWJl
ciA9IDMsCisgICAga1NvdXJjZUxvY2F0aW9uc0ZpZWxkTnVtYmVyID0gNCwKKyAgICBrTG9nTWVz
c2FnZUJvZHlGaWVsZE51bWJlciA9IDIwLAorICAgIGtCdWlsZElkc0ZpZWxkTnVtYmVyID0gMTYs
CisgICAga01hcHBpbmdQYXRoc0ZpZWxkTnVtYmVyID0gMTcsCisgICAga1NvdXJjZVBhdGhzRmll
bGROdW1iZXIgPSAxOCwKKyAgICBrRnVuY3Rpb25OYW1lc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBr
UHJvZmlsZWRGcmFtZVN5bWJvbHNGaWVsZE51bWJlciA9IDIxLAorICAgIGtNYXBwaW5nc0ZpZWxk
TnVtYmVyID0gMTksCisgICAga0ZyYW1lc0ZpZWxkTnVtYmVyID0gNiwKKyAgICBrQ2FsbHN0YWNr
c0ZpZWxkTnVtYmVyID0gNywKKyAgICBrVnVsa2FuTWVtb3J5S2V5c0ZpZWxkTnVtYmVyID0gMjIs
CisgICAga0dyYXBoaWNzQ29udGV4dHNGaWVsZE51bWJlciA9IDIzLAorICAgIGtHcHVTcGVjaWZp
Y2F0aW9uc0ZpZWxkTnVtYmVyID0gMjQsCisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
RXZlbnRDYXRlZ29yeT4gVCogYWRkX2V2ZW50X2NhdGVnb3JpZXMoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
RXZlbnROYW1lPiBUKiBhZGRfZXZlbnRfbmFtZXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVk
TWVzc2FnZTxUPigyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gRGVidWdBbm5v
dGF0aW9uTmFtZT4gVCogYWRkX2RlYnVnX2Fubm90YXRpb25fbmFtZXMoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gU291cmNlTG9jYXRpb24+IFQqIGFkZF9zb3VyY2VfbG9jYXRpb25zKCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VCA9IExvZ01lc3NhZ2VCb2R5PiBUKiBhZGRfbG9nX21lc3NhZ2VfYm9keSgpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gSW50ZXJuZWRTdHJpbmc+IFQqIGFkZF9idWlsZF9pZHMoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigxNik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IEludGVybmVkU3RyaW5nPiBUKiBhZGRfbWFwcGluZ19wYXRocygpIHsKKyAgICByZXR1cm4gQmVn
aW5OZXN0ZWRNZXNzYWdlPFQ+KDE3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
SW50ZXJuZWRTdHJpbmc+IFQqIGFkZF9zb3VyY2VfcGF0aHMoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigxOCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElu
dGVybmVkU3RyaW5nPiBUKiBhZGRfZnVuY3Rpb25fbmFtZXMoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPig1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUHJv
ZmlsZWRGcmFtZVN5bWJvbHM+IFQqIGFkZF9wcm9maWxlZF9mcmFtZV9zeW1ib2xzKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjEpOworICB9CisKKyAgdGVtcGxhdGUgPHR5
cGVuYW1lIFQgPSBNYXBwaW5nPiBUKiBhZGRfbWFwcGluZ3MoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigxOSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEZy
YW1lPiBUKiBhZGRfZnJhbWVzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
Nik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENhbGxzdGFjaz4gVCogYWRkX2Nh
bGxzdGFja3MoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig3KTsKKyAgfQor
CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSW50ZXJuZWRTdHJpbmc+IFQqIGFkZF92dWxrYW5f
bWVtb3J5X2tleXMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigyMik7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEludGVybmVkR3JhcGhpY3NDb250ZXh0PiBU
KiBhZGRfZ3JhcGhpY3NfY29udGV4dHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPigyMyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEludGVybmVkR3B1UmVu
ZGVyU3RhZ2VTcGVjaWZpY2F0aW9uPiBUKiBhZGRfZ3B1X3NwZWNpZmljYXRpb25zKCkgeworICAg
IHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMjQpOworICB9CisKK307CisKK30gLy8gTmFt
ZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5j
bHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3Mv
cGVyZmV0dG8vdHJhY2UvcGVyZmV0dG8vcGVyZmV0dG9fbWV0YXRyYWNlLnBiemVyby5oCisvLyBB
dXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJ
VC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1BFUkZF
VFRPX1BFUkZFVFRPX01FVEFUUkFDRV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1Nf
UFJPVE9TX1BFUkZFVFRPX1RSQUNFX1BFUkZFVFRPX1BFUkZFVFRPX01FVEFUUkFDRV9QUk9UT19I
XworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9h
bWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdl
LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90
b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFu
ZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90
b191dGlscy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7Citu
YW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3MgUGVyZmV0dG9NZXRhdHJhY2VfQXJnOworCitjbGFz
cyBQZXJmZXR0b01ldGF0cmFjZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFBy
b3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzksIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBQZXJmZXR0b01ldGF0cmFjZV9EZWNvZGVyKGNv
bnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwg
bGVuKSB7fQorICBleHBsaWNpdCBQZXJmZXR0b01ldGF0cmFjZV9EZWNvZGVyKGNvbnN0IHN0ZDo6
c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFBlcmZldHRv
TWV0YXRyYWNlX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX2V2ZW50
X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IGV2ZW50
X2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc191aW50MzIoKTsgfQorICBib29sIGhhc19j
b3VudGVyX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90
IGNvdW50ZXJfaWQoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQzMigpOyB9CisgIGJv
b2wgaGFzX2V2ZW50X25hbWUoKSBjb25zdCB7IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OkNvbnN0Q2hhcnMgZXZlbnRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDg+
KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfY291bnRlcl9uYW1lKCkgY29uc3QgeyByZXR1
cm4gYXQ8OT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIGNvdW50ZXJf
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNf
ZXZlbnRfZHVyYXRpb25fbnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAg
dWludDMyX3QgZXZlbnRfZHVyYXRpb25fbnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3Vp
bnQzMigpOyB9CisgIGJvb2wgaGFzX2NvdW50ZXJfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDw0
PigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBjb3VudGVyX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3RocmVhZF9pZCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDU+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCB0aHJlYWRfaWQoKSBjb25zdCB7IHJl
dHVybiBhdDw1PigpLmFzX3VpbnQzMigpOyB9CisgIGJvb2wgaGFzX2hhc19vdmVycnVucygpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICBib29sIGhhc19vdmVycnVucygpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFzX2FyZ3MoKSBjb25z
dCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmll
bGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gYXJncygpIGNvbnN0IHsgcmV0dXJu
IEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig3KTsgfQorfTsKKworY2xhc3Mg
UGVyZmV0dG9NZXRhdHJhY2UgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IFBlcmZldHRvTWV0YXRyYWNlX0RlY29kZXI7CisgIGVudW0g
OiBpbnQzMl90IHsKKyAgICBrRXZlbnRJZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrQ291bnRlcklk
RmllbGROdW1iZXIgPSAyLAorICAgIGtFdmVudE5hbWVGaWVsZE51bWJlciA9IDgsCisgICAga0Nv
dW50ZXJOYW1lRmllbGROdW1iZXIgPSA5LAorICAgIGtFdmVudER1cmF0aW9uTnNGaWVsZE51bWJl
ciA9IDMsCisgICAga0NvdW50ZXJWYWx1ZUZpZWxkTnVtYmVyID0gNCwKKyAgICBrVGhyZWFkSWRG
aWVsZE51bWJlciA9IDUsCisgICAga0hhc092ZXJydW5zRmllbGROdW1iZXIgPSA2LAorICAgIGtB
cmdzRmllbGROdW1iZXIgPSA3LAorICB9OworICB1c2luZyBBcmcgPSA6OnBlcmZldHRvOjpwcm90
b3M6OnBiemVybzo6UGVyZmV0dG9NZXRhdHJhY2VfQXJnOworICB2b2lkIHNldF9ldmVudF9pZCh1
aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfY291bnRlcl9pZCh1aW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfZXZlbnRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFs
dWUpIHsKKyAgICBBcHBlbmRCeXRlcyg4LCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cisg
IH0KKyAgdm9pZCBzZXRfZXZlbnRfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkg
eworICAgIEFwcGVuZEJ5dGVzKDgsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2NvdW50
ZXJfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcyg5LCB2
YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBzZXRfY291bnRlcl9uYW1l
KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQXBwZW5kQnl0ZXMoOSwgZGF0
YSwgc2l6ZSk7CisgIH0KKyAgdm9pZCBzZXRfZXZlbnRfZHVyYXRpb25fbnModWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2NvdW50
ZXJfdmFsdWUoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfdGhyZWFkX2lkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDUsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9oYXNfb3ZlcnJ1bnMoYm9vbCB2YWx1ZSkg
eworICAgIEFwcGVuZFRpbnlWYXJJbnQoNiwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBl
bmFtZSBUID0gUGVyZmV0dG9NZXRhdHJhY2VfQXJnPiBUKiBhZGRfYXJncygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDcpOworICB9CisKK307CisKK2NsYXNzIFBlcmZldHRv
TWV0YXRyYWNlX0FyZ19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVj
b2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9
Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUGVyZmV0dG9NZXRhdHJhY2VfQXJnX0RlY29kZXIoY29u
c3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBs
ZW4pIHt9CisgIGV4cGxpY2l0IFBlcmZldHRvTWV0YXRyYWNlX0FyZ19EZWNvZGVyKGNvbnN0IHN0
ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFBlcmZl
dHRvTWV0YXRyYWNlX0FyZ19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhh
c19rZXkoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OkNvbnN0Q2hhcnMga2V5KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19zdHJpbmcoKTsgfQor
ICBib29sIGhhc192YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RDaGFycyB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNf
c3RyaW5nKCk7IH0KK307CisKK2NsYXNzIFBlcmZldHRvTWV0YXRyYWNlX0FyZyA6IHB1YmxpYyA6
OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUGVyZmV0
dG9NZXRhdHJhY2VfQXJnX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrS2V5Rmll
bGROdW1iZXIgPSAxLAorICAgIGtWYWx1ZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBz
ZXRfa2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9rZXkoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBB
cHBlbmRCeXRlcygyLCB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBz
ZXRfdmFsdWUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRl
cygyLCBkYXRhLCBzaXplKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVz
cGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2Vu
X2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9wZXJm
ZXR0by90cmFjaW5nX3NlcnZpY2VfZXZlbnQucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkg
dGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBF
UkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfUEVSRkVUVE9fVFJBQ0lOR19TRVJW
SUNFX0VWRU5UX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfUEVSRkVUVE9fVFJBQ0lOR19TRVJWSUNFX0VWRU5UX1BST1RPX0hfCisKKyNpbmNs
dWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBw
Ynplcm8geworCisKK2NsYXNzIFRyYWNpbmdTZXJ2aWNlRXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRyYWNpbmdT
ZXJ2aWNlRXZlbnRfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5
cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVHJhY2luZ1NlcnZpY2VF
dmVudF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkp
IHt9CisgIGV4cGxpY2l0IFRyYWNpbmdTZXJ2aWNlRXZlbnRfRGVjb2Rlcihjb25zdCA6OnByb3Rv
emVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcu
c2l6ZSkge30KKyAgYm9vbCBoYXNfYWxsX2RhdGFfc291cmNlc19zdGFydGVkKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGJvb2wgYWxsX2RhdGFfc291cmNlc19zdGFydGVk
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19ib29sKCk7IH0KK307CisKK2NsYXNzIFRyYWNp
bmdTZXJ2aWNlRXZlbnQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IFRyYWNpbmdTZXJ2aWNlRXZlbnRfRGVjb2RlcjsKKyAgZW51bSA6
IGludDMyX3QgeworICAgIGtBbGxEYXRhU291cmNlc1N0YXJ0ZWRGaWVsZE51bWJlciA9IDEsCisg
IH07CisgIHZvaWQgc2V0X2FsbF9kYXRhX3NvdXJjZXNfc3RhcnRlZChib29sIHZhbHVlKSB7Cisg
ICAgQXBwZW5kVGlueVZhckludCgxLCB2YWx1ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNl
LgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBn
dWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0
dG8vdHJhY2UvcG93ZXIvYmF0dGVyeV9jb3VudGVycy5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRl
ZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5k
ZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9QT1dFUl9CQVRURVJZX0NP
VU5URVJTX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9f
VFJBQ0VfUE9XRVJfQkFUVEVSWV9DT1VOVEVSU19QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVm
Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVk
X2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0
dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3Bh
Y2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKwor
CitjbGFzcyBCYXR0ZXJ5Q291bnRlcnNfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlw
ZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFU
RURfRklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIEJhdHRlcnlDb3VudGVyc19EZWNvZGVy
KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0
YSwgbGVuKSB7fQorICBleHBsaWNpdCBCYXR0ZXJ5Q291bnRlcnNfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBCYXR0ZXJ5
Q291bnRlcnNfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5
cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfY2hhcmdl
X2NvdW50ZXJfdWFoKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDY0
X3QgY2hhcmdlX2NvdW50ZXJfdWFoKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQ2NCgp
OyB9CisgIGJvb2wgaGFzX2NhcGFjaXR5X3BlcmNlbnQoKSBjb25zdCB7IHJldHVybiBhdDwyPigp
LnZhbGlkKCk7IH0KKyAgZmxvYXQgY2FwYWNpdHlfcGVyY2VudCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDI+KCkuYXNfZmxvYXQoKTsgfQorICBib29sIGhhc19jdXJyZW50X3VhKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDY0X3QgY3VycmVudF91YSgpIGNvbnN0IHsgcmV0
dXJuIGF0PDM+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc19jdXJyZW50X2F2Z191YSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBpbnQ2NF90IGN1cnJlbnRfYXZnX3Vh
KCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS5hc19pbnQ2NCgpOyB9Cit9OworCitjbGFzcyBCYXR0
ZXJ5Q291bnRlcnMgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAg
dXNpbmcgRGVjb2RlciA9IEJhdHRlcnlDb3VudGVyc19EZWNvZGVyOworICBlbnVtIDogaW50MzJf
dCB7CisgICAga0NoYXJnZUNvdW50ZXJVYWhGaWVsZE51bWJlciA9IDEsCisgICAga0NhcGFjaXR5
UGVyY2VudEZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ3VycmVudFVhRmllbGROdW1iZXIgPSAzLAor
ICAgIGtDdXJyZW50QXZnVWFGaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X2NoYXJn
ZV9jb3VudGVyX3VhaChpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVl
KTsKKyAgfQorICB2b2lkIHNldF9jYXBhY2l0eV9wZXJjZW50KGZsb2F0IHZhbHVlKSB7CisgICAg
QXBwZW5kRml4ZWQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2N1cnJlbnRfdWEoaW50NjRf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
Y3VycmVudF9hdmdfdWEoaW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0LCB2YWx1
ZSk7CisgIH0KK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5h
bWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBi
ZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvcG93ZXIvcG93ZXJfcmFpbHMu
cGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVn
aW4uIERPIE5PVCBFRElULgorCisjaWZuZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVU
VE9fVFJBQ0VfUE9XRVJfUE9XRVJfUkFJTFNfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJP
VE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9QT1dFUl9QT1dFUl9SQUlMU19QUk9UT19IXworCisj
aW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
cGFja2VkX3JlcGVhdGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFs
Z2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGls
cy5oIgorCituYW1lc3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3Bh
Y2UgcGJ6ZXJvIHsKKworY2xhc3MgUG93ZXJSYWlsc19FbmVyZ3lEYXRhOworY2xhc3MgUG93ZXJS
YWlsc19SYWlsRGVzY3JpcHRvcjsKKworY2xhc3MgUG93ZXJSYWlsc19EZWNvZGVyIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFT
X05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7CisgcHVibGljOgorICBQb3dlclJh
aWxzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3Rv
RGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFBvd2VyUmFpbHNfRGVjb2Rlcihjb25z
dCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBQ
b3dlclJhaWxzX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBU
eXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3JhaWxf
ZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICA6OnByb3Rv
emVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiByYWls
X2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29u
c3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBoYXNfZW5lcmd5X2RhdGEoKSBjb25zdCB7IHJldHVybiBh
dDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6
OnByb3RvemVybzo6Q29uc3RCeXRlcz4gZW5lcmd5X2RhdGEoKSBjb25zdCB7IHJldHVybiBHZXRS
ZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMik7IH0KK307CisKK2NsYXNzIFBvd2Vy
UmFpbHMgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcg
RGVjb2RlciA9IFBvd2VyUmFpbHNfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtS
YWlsRGVzY3JpcHRvckZpZWxkTnVtYmVyID0gMSwKKyAgICBrRW5lcmd5RGF0YUZpZWxkTnVtYmVy
ID0gMiwKKyAgfTsKKyAgdXNpbmcgUmFpbERlc2NyaXB0b3IgPSA6OnBlcmZldHRvOjpwcm90b3M6
OnBiemVybzo6UG93ZXJSYWlsc19SYWlsRGVzY3JpcHRvcjsKKyAgdXNpbmcgRW5lcmd5RGF0YSA9
IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpQb3dlclJhaWxzX0VuZXJneURhdGE7CisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gUG93ZXJSYWlsc19SYWlsRGVzY3JpcHRvcj4gVCogYWRkX3Jh
aWxfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOwor
ICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQb3dlclJhaWxzX0VuZXJneURhdGE+IFQq
IGFkZF9lbmVyZ3lfZGF0YSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDIp
OworICB9CisKK307CisKK2NsYXNzIFBvd2VyUmFpbHNfRW5lcmd5RGF0YV9EZWNvZGVyIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzMsIC8q
SEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgUG93
ZXJSYWlsc19FbmVyZ3lEYXRhX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxl
bikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFBvd2VyUmFp
bHNfRW5lcmd5RGF0YV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJh
dy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFBvd2VyUmFpbHNfRW5lcmd5RGF0YV9EZWNvZGVyKGNv
bnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3
LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19pbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0
PDE+KCkudmFsaWQoKTsgfQorICB1aW50MzJfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+
KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGltZXN0YW1wX21zKCkgY29uc3QgeyByZXR1
cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHRpbWVzdGFtcF9tcygpIGNvbnN0IHsg
cmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfZW5lcmd5KCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGVuZXJneSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDM+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIFBvd2VyUmFpbHNfRW5l
cmd5RGF0YSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2lu
ZyBEZWNvZGVyID0gUG93ZXJSYWlsc19FbmVyZ3lEYXRhX0RlY29kZXI7CisgIGVudW0gOiBpbnQz
Ml90IHsKKyAgICBrSW5kZXhGaWVsZE51bWJlciA9IDEsCisgICAga1RpbWVzdGFtcE1zRmllbGRO
dW1iZXIgPSAyLAorICAgIGtFbmVyZ3lGaWVsZE51bWJlciA9IDMsCisgIH07CisgIHZvaWQgc2V0
X2luZGV4KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF90aW1lc3RhbXBfbXModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMiwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X2VuZXJneSh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFBvd2VyUmFp
bHNfUmFpbERlc2NyaXB0b3JfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90
b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki80LCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklF
TERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFBvd2VyUmFpbHNfUmFpbERlc2NyaXB0b3JfRGVj
b2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVy
KGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgUG93ZXJSYWlsc19SYWlsRGVzY3JpcHRvcl9EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4
cGxpY2l0IFBvd2VyUmFpbHNfUmFpbERlc2NyaXB0b3JfRGVjb2Rlcihjb25zdCA6OnByb3RvemVy
bzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6
ZSkge30KKyAgYm9vbCBoYXNfaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigp
OyB9CisgIGJvb2wgaGFzX3JhaWxfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyByYWlsX25hbWUoKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX3N1YnN5c19uYW1lKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHN1
YnN5c19uYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc19zdHJpbmcoKTsgfQorICBib29s
IGhhc19zYW1wbGluZ19yYXRlKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IHNhbXBsaW5nX3JhdGUoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLmFzX3VpbnQz
MigpOyB9Cit9OworCitjbGFzcyBQb3dlclJhaWxzX1JhaWxEZXNjcmlwdG9yIDogcHVibGljIDo6
cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQb3dlclJh
aWxzX1JhaWxEZXNjcmlwdG9yX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrSW5k
ZXhGaWVsZE51bWJlciA9IDEsCisgICAga1JhaWxOYW1lRmllbGROdW1iZXIgPSAyLAorICAgIGtT
dWJzeXNOYW1lRmllbGROdW1iZXIgPSAzLAorICAgIGtTYW1wbGluZ1JhdGVGaWVsZE51bWJlciA9
IDQsCisgIH07CisgIHZvaWQgc2V0X2luZGV4KHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9yYWlsX25hbWUoY29uc3Qgc3RkOjpz
dHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5z
aXplKCkpOworICB9CisgIHZvaWQgc2V0X3JhaWxfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXpl
X3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDIsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQg
c2V0X3N1YnN5c19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5
dGVzKDMsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9zdWJz
eXNfbmFtZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVz
KDMsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X3NhbXBsaW5nX3JhdGUodWludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNCwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5h
bWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIElu
Y2x1ZGUgZ3VhcmQuCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9z
L3BlcmZldHRvL3RyYWNlL3BzL3Byb2Nlc3Nfc3RhdHMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0
ZWQgYnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZu
ZGVmIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfUFNfUFJPQ0VTU19TVEFU
U19QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNF
X1BTX1BST0NFU1NfU1RBVFNfUFJPVE9fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1
ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJw
ZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3BhY2tlZF9yZXBlYXRlZF9maWVsZHMuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVy
by9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRl
ICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHBlcmZldHRv
IHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNlIHBiemVybyB7CisKK2NsYXNzIFByb2Nl
c3NTdGF0c19Qcm9jZXNzOworY2xhc3MgUHJvY2Vzc1N0YXRzX1RocmVhZDsKKworY2xhc3MgUHJv
Y2Vzc1N0YXRzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVy
PC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3Ry
dWU+IHsKKyBwdWJsaWM6CisgIFByb2Nlc3NTdGF0c19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRh
dGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBs
aWNpdCBQcm9jZXNzU3RhdHNfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBQcm9jZXNzU3RhdHNfRGVjb2Rlcihjb25zdCA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRh
LCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcHJvY2Vzc2VzKCkgY29uc3QgeyByZXR1cm4gYXQ8
MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpw
cm90b3plcm86OkNvbnN0Qnl0ZXM+IHByb2Nlc3NlcygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVh
dGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigxKTsgfQorICBib29sIGhhc19jb2xsZWN0aW9u
X2VuZF90aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgY29sbGVjdGlvbl9lbmRfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5h
c191aW50NjQoKTsgfQorfTsKKworY2xhc3MgUHJvY2Vzc1N0YXRzIDogcHVibGljIDo6cHJvdG96
ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQcm9jZXNzU3RhdHNf
RGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQcm9jZXNzZXNGaWVsZE51bWJlciA9
IDEsCisgICAga0NvbGxlY3Rpb25FbmRUaW1lc3RhbXBGaWVsZE51bWJlciA9IDIsCisgIH07Cisg
IHVzaW5nIFRocmVhZCA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpQcm9jZXNzU3RhdHNf
VGhyZWFkOworICB1c2luZyBQcm9jZXNzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlBy
b2Nlc3NTdGF0c19Qcm9jZXNzOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFByb2Nlc3NTdGF0
c19Qcm9jZXNzPiBUKiBhZGRfcHJvY2Vzc2VzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1l
c3NhZ2U8VD4oMSk7CisgIH0KKworICB2b2lkIHNldF9jb2xsZWN0aW9uX2VuZF90aW1lc3RhbXAo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBQcm9jZXNzU3RhdHNfUHJvY2Vzc19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzExLCAvKkhBU19OT05QQUNLRURf
UkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgUHJvY2Vzc1N0YXRzX1Byb2Nl
c3NfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgUHJvY2Vzc1N0YXRzX1Byb2Nlc3NfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBQcm9jZXNzU3RhdHNfUHJvY2Vzc19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19waWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
aW50MzJfdCBwaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9v
bCBoYXNfdm1fc2l6ZV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1
aW50NjRfdCB2bV9zaXplX2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsg
fQorICBib29sIGhhc192bV9yc3Nfa2IoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7
IH0KKyAgdWludDY0X3Qgdm1fcnNzX2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8Mz4oKS5hc191aW50
NjQoKTsgfQorICBib29sIGhhc19yc3NfYW5vbl9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCByc3NfYW5vbl9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ+
KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfcnNzX2ZpbGVfa2IoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgcnNzX2ZpbGVfa2IoKSBjb25zdCB7IHJl
dHVybiBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3Jzc19zaG1lbV9rYigpIGNv
bnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCByc3Nfc2htZW1fa2Io
KSBjb25zdCB7IHJldHVybiBhdDw2PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX3ZtX3N3
YXBfa2IoKSBjb25zdCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3Qgdm1f
c3dhcF9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBo
YXNfdm1fbG9ja2VkX2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS52YWxpZCgpOyB9CisgIHVp
bnQ2NF90IHZtX2xvY2tlZF9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkuYXNfdWludDY0KCk7
IH0KKyAgYm9vbCBoYXNfdm1faHdtX2tiKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxpZCgp
OyB9CisgIHVpbnQ2NF90IHZtX2h3bV9rYigpIGNvbnN0IHsgcmV0dXJuIGF0PDk+KCkuYXNfdWlu
dDY0KCk7IH0KKyAgYm9vbCBoYXNfb29tX3Njb3JlX2FkaigpIGNvbnN0IHsgcmV0dXJuIGF0PDEw
PigpLnZhbGlkKCk7IH0KKyAgaW50NjRfdCBvb21fc2NvcmVfYWRqKCkgY29uc3QgeyByZXR1cm4g
YXQ8MTA+KCkuYXNfaW50NjQoKTsgfQorICBib29sIGhhc190aHJlYWRzKCkgY29uc3QgeyByZXR1
cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJh
dG9yPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPiB0aHJlYWRzKCkgY29uc3QgeyByZXR1cm4gR2V0
UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDExKTsgfQorfTsKKworY2xhc3MgUHJv
Y2Vzc1N0YXRzX1Byb2Nlc3MgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1Ymxp
YzoKKyAgdXNpbmcgRGVjb2RlciA9IFByb2Nlc3NTdGF0c19Qcm9jZXNzX0RlY29kZXI7CisgIGVu
dW0gOiBpbnQzMl90IHsKKyAgICBrUGlkRmllbGROdW1iZXIgPSAxLAorICAgIGtWbVNpemVLYkZp
ZWxkTnVtYmVyID0gMiwKKyAgICBrVm1Sc3NLYkZpZWxkTnVtYmVyID0gMywKKyAgICBrUnNzQW5v
bktiRmllbGROdW1iZXIgPSA0LAorICAgIGtSc3NGaWxlS2JGaWVsZE51bWJlciA9IDUsCisgICAg
a1Jzc1NobWVtS2JGaWVsZE51bWJlciA9IDYsCisgICAga1ZtU3dhcEtiRmllbGROdW1iZXIgPSA3
LAorICAgIGtWbUxvY2tlZEtiRmllbGROdW1iZXIgPSA4LAorICAgIGtWbUh3bUtiRmllbGROdW1i
ZXIgPSA5LAorICAgIGtPb21TY29yZUFkakZpZWxkTnVtYmVyID0gMTAsCisgICAga1RocmVhZHNG
aWVsZE51bWJlciA9IDExLAorICB9OworICB2b2lkIHNldF9waWQoaW50MzJfdCB2YWx1ZSkgewor
ICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdm1fc2l6ZV9rYih1
aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9p
ZCBzZXRfdm1fcnNzX2tiKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDMsIHZh
bHVlKTsKKyAgfQorICB2b2lkIHNldF9yc3NfYW5vbl9rYih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg0LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfcnNzX2ZpbGVfa2IodWlu
dDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNSwgdmFsdWUpOworICB9CisgIHZvaWQg
c2V0X3Jzc19zaG1lbV9rYih1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg2LCB2
YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdm1fc3dhcF9rYih1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCg3LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdm1fbG9ja2VkX2tiKHVp
bnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDgsIHZhbHVlKTsKKyAgfQorICB2b2lk
IHNldF92bV9od21fa2IodWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOSwgdmFs
dWUpOworICB9CisgIHZvaWQgc2V0X29vbV9zY29yZV9hZGooaW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgxMCwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
UHJvY2Vzc1N0YXRzX1RocmVhZD4gVCogYWRkX3RocmVhZHMoKSB7CisgICAgcmV0dXJuIEJlZ2lu
TmVzdGVkTWVzc2FnZTxUPigxMSk7CisgIH0KKworfTsKKworY2xhc3MgUHJvY2Vzc1N0YXRzX1Ro
cmVhZF9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1B
WF9GSUVMRF9JRD0qLzQsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7
CisgcHVibGljOgorICBQcm9jZXNzU3RhdHNfVGhyZWFkX0RlY29kZXIoY29uc3QgdWludDhfdCog
ZGF0YSwgc2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4
cGxpY2l0IFByb2Nlc3NTdGF0c19UaHJlYWRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3
KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJh
dy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBQcm9jZXNzU3RhdHNfVGhyZWFk
X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3Rv
RGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3RpZCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICBpbnQzMl90IHRpZCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBib29sIGhhc19jcHVfZnJlcV9pbmRpY2VzKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZp
ZWxkSXRlcmF0b3I8dWludDMyX3Q+IGNwdV9mcmVxX2luZGljZXMoKSBjb25zdCB7IHJldHVybiBH
ZXRSZXBlYXRlZDx1aW50MzJfdD4oMik7IH0KKyAgYm9vbCBoYXNfY3B1X2ZyZXFfdGlja3MoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjx1aW50NjRfdD4gY3B1X2ZyZXFfdGlja3MoKSBjb25zdCB7IHJldHVybiBH
ZXRSZXBlYXRlZDx1aW50NjRfdD4oMyk7IH0KKyAgYm9vbCBoYXNfY3B1X2ZyZXFfZnVsbCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDQ+KCkudmFsaWQoKTsgfQorICBib29sIGNwdV9mcmVxX2Z1bGwoKSBj
b25zdCB7IHJldHVybiBhdDw0PigpLmFzX2Jvb2woKTsgfQorfTsKKworY2xhc3MgUHJvY2Vzc1N0
YXRzX1RocmVhZCA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1
c2luZyBEZWNvZGVyID0gUHJvY2Vzc1N0YXRzX1RocmVhZF9EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga1RpZEZpZWxkTnVtYmVyID0gMSwKKyAgICBrQ3B1RnJlcUluZGljZXNGaWVs
ZE51bWJlciA9IDIsCisgICAga0NwdUZyZXFUaWNrc0ZpZWxkTnVtYmVyID0gMywKKyAgICBrQ3B1
RnJlcUZ1bGxGaWVsZE51bWJlciA9IDQsCisgIH07CisgIHZvaWQgc2V0X3RpZChpbnQzMl90IHZh
bHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIGFkZF9jcHVf
ZnJlcV9pbmRpY2VzKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVl
KTsKKyAgfQorICB2b2lkIGFkZF9jcHVfZnJlcV90aWNrcyh1aW50NjRfdCB2YWx1ZSkgeworICAg
IEFwcGVuZFZhckludCgzLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfY3B1X2ZyZXFfZnVsbChi
b29sIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhckludCg0LCB2YWx1ZSk7CisgIH0KK307CisK
K30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KKyNlbmRp
ZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdl
bi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvcHMvcHJvY2Vzc190cmVlLnBiemVyby5oCisvLyBBdXRv
Z2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBOT1QgRURJVC4K
KworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1BTX1BST0NF
U1NfVFJFRV9QUk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRP
X1RSQUNFX1BTX1BST0NFU1NfVFJFRV9QUk9UT19IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+Cisj
aW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1
ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhw
YW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVhdGVkX2ZpZWxk
cy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1lc3BhY2UgcGVy
ZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsKKworY2xhc3Mg
UHJvY2Vzc1RyZWVfUHJvY2VzczsKK2NsYXNzIFByb2Nlc3NUcmVlX1RocmVhZDsKKworY2xhc3Mg
UHJvY2Vzc1RyZWVfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29k
ZXI8LypNQVhfRklFTERfSUQ9Ki8zLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSov
dHJ1ZT4geworIHB1YmxpYzoKKyAgUHJvY2Vzc1RyZWVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBk
YXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhw
bGljaXQgUHJvY2Vzc1RyZWVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBQcm9jZXNzVHJlZV9EZWNvZGVyKGNvbnN0IDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEs
IHJhdy5zaXplKSB7fQorICBib29sIGhhc19wcm9jZXNzZXMoKSBjb25zdCB7IHJldHVybiBhdDwx
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnBy
b3RvemVybzo6Q29uc3RCeXRlcz4gcHJvY2Vzc2VzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0
ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+KDEpOyB9CisgIGJvb2wgaGFzX3RocmVhZHMoKSBj
b25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVk
RmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gdGhyZWFkcygpIGNvbnN0IHsg
cmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigyKTsgfQorICBib29s
IGhhc19jb2xsZWN0aW9uX2VuZF90aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZh
bGlkKCk7IH0KKyAgdWludDY0X3QgY29sbGVjdGlvbl9lbmRfdGltZXN0YW1wKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8Mz4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgUHJvY2Vzc1RyZWUgOiBw
dWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9
IFByb2Nlc3NUcmVlX0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrUHJvY2Vzc2Vz
RmllbGROdW1iZXIgPSAxLAorICAgIGtUaHJlYWRzRmllbGROdW1iZXIgPSAyLAorICAgIGtDb2xs
ZWN0aW9uRW5kVGltZXN0YW1wRmllbGROdW1iZXIgPSAzLAorICB9OworICB1c2luZyBUaHJlYWQg
PSA6OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6UHJvY2Vzc1RyZWVfVGhyZWFkOworICB1c2lu
ZyBQcm9jZXNzID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlByb2Nlc3NUcmVlX1Byb2Nl
c3M7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUHJvY2Vzc1RyZWVfUHJvY2Vzcz4gVCogYWRk
X3Byb2Nlc3NlcygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDEpOworICB9
CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9jZXNzVHJlZV9UaHJlYWQ+IFQqIGFkZF90
aHJlYWRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0KKwor
ICB2b2lkIHNldF9jb2xsZWN0aW9uX2VuZF90aW1lc3RhbXAodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBQcm9jZXNzVHJlZV9Q
cm9jZXNzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVkUHJvdG9EZWNvZGVyPC8q
TUFYX0ZJRUxEX0lEPSovNSwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL3RydWU+
IHsKKyBwdWJsaWM6CisgIFByb2Nlc3NUcmVlX1Byb2Nlc3NfRGVjb2Rlcihjb25zdCB1aW50OF90
KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAg
ZXhwbGljaXQgUHJvY2Vzc1RyZWVfUHJvY2Vzc19EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBy
YXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
cmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFByb2Nlc3NUcmVlX1Byb2Nl
c3NfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJv
dG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfcGlkKCkgY29uc3Qg
eyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgcGlkKCkgY29uc3QgeyByZXR1
cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3BwaWQoKSBjb25zdCB7IHJldHVy
biBhdDwyPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCBwcGlkKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX2NtZGxpbmUoKSBjb25zdCB7IHJldHVybiBh
dDwzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6
OnByb3RvemVybzo6Q29uc3RDaGFycz4gY21kbGluZSgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVh
dGVkPDo6cHJvdG96ZXJvOjpDb25zdENoYXJzPigzKTsgfQorICBib29sIGhhc190aHJlYWRzX2Rl
cHJlY2F0ZWQoKSBjb25zdCB7IHJldHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gdGhyZWFk
c19kZXByZWNhdGVkKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNv
bnN0Qnl0ZXM+KDQpOyB9CisgIGJvb2wgaGFzX3VpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCku
dmFsaWQoKTsgfQorICBpbnQzMl90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfaW50
MzIoKTsgfQorfTsKKworY2xhc3MgUHJvY2Vzc1RyZWVfUHJvY2VzcyA6IHB1YmxpYyA6OnByb3Rv
emVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gUHJvY2Vzc1RyZWVf
UHJvY2Vzc19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga1BpZEZpZWxkTnVtYmVy
ID0gMSwKKyAgICBrUHBpZEZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ21kbGluZUZpZWxkTnVtYmVy
ID0gMywKKyAgICBrVGhyZWFkc0RlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDQsCisgICAga1VpZEZp
ZWxkTnVtYmVyID0gNSwKKyAgfTsKKyAgdm9pZCBzZXRfcGlkKGludDMyX3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMSwgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3BwaWQoaW50MzJfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBhZGRfY21k
bGluZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRlcygzLCB2YWx1
ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgIH0KKyAgdm9pZCBhZGRfY21kbGluZShjb25zdCBj
aGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDMsIGRhdGEsIHNpemUp
OworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUHJvY2Vzc1RyZWVfVGhyZWFkPiBUKiBh
ZGRfdGhyZWFkc19kZXByZWNhdGVkKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8
VD4oNCk7CisgIH0KKworICB2b2lkIHNldF91aWQoaW50MzJfdCB2YWx1ZSkgeworICAgIEFwcGVu
ZFZhckludCg1LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFByb2Nlc3NUcmVlX1RocmVhZF9E
ZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVM
RF9JRD0qLzMsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1
YmxpYzoKKyAgUHJvY2Vzc1RyZWVfVGhyZWFkX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IFByb2Nlc3NUcmVlX1RocmVhZF9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlw
ZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEo
KSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxpY2l0IFByb2Nlc3NUcmVlX1RocmVhZF9EZWNvZGVy
KGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIo
cmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc190aWQoKSBjb25zdCB7IHJldHVybiBh
dDwxPigpLnZhbGlkKCk7IH0KKyAgaW50MzJfdCB0aWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigp
LmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdGdpZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCku
dmFsaWQoKTsgfQorICBpbnQzMl90IHRnaWQoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX2lu
dDMyKCk7IH0KKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBuYW1lKCkgY29uc3QgeyByZXR1cm4gYXQ8
Mj4oKS5hc19zdHJpbmcoKTsgfQorfTsKKworY2xhc3MgUHJvY2Vzc1RyZWVfVGhyZWFkIDogcHVi
bGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBQ
cm9jZXNzVHJlZV9UaHJlYWRfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtUaWRG
aWVsZE51bWJlciA9IDEsCisgICAga1RnaWRGaWVsZE51bWJlciA9IDMsCisgICAga05hbWVGaWVs
ZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X3RpZChpbnQzMl90IHZhbHVlKSB7CisgICAg
QXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF90Z2lkKGludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X25hbWUo
Y29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMoMiwgdmFsdWUuZGF0
YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogZGF0
YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygyLCBkYXRhLCBzaXplKTsKKyAgfQor
fTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgor
I2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRl
cjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9zeXNfc3RhdHMvc3lzX3N0YXRzLnBiemVyby5o
CisvLyBBdXRvZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8gY29tcGlsZXIgcGx1Z2luLiBETyBO
T1QgRURJVC4KKworI2lmbmRlZiBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNF
X1NZU19TVEFUU19TWVNfU1RBVFNfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9fUFJPVE9TX1BS
T1RPU19QRVJGRVRUT19UUkFDRV9TWVNfU1RBVFNfU1lTX1NUQVRTX1BST1RPX0hfCisKKyNpbmNs
dWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdl
bl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNr
ZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1h
dGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgi
CisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBw
Ynplcm8geworCitjbGFzcyBTeXNTdGF0c19DcHVUaW1lczsKK2NsYXNzIFN5c1N0YXRzX0ludGVy
cnVwdENvdW50OworY2xhc3MgU3lzU3RhdHNfTWVtaW5mb1ZhbHVlOworY2xhc3MgU3lzU3RhdHNf
Vm1zdGF0VmFsdWU7CitlbnVtIE1lbWluZm9Db3VudGVycyA6IGludDMyX3Q7CitlbnVtIFZtc3Rh
dENvdW50ZXJzIDogaW50MzJfdDsKKworY2xhc3MgU3lzU3RhdHNfRGVjb2RlciA6IHB1YmxpYyA6
OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki85LCAvKkhBU19O
T05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1ZT4geworIHB1YmxpYzoKKyAgU3lzU3RhdHNf
RGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU3lzU3RhdHNfRGVjb2Rlcihjb25zdCBzdGQ6
OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTeXNTdGF0
c19EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90
b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc19tZW1pbmZvKCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZp
ZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IG1lbWluZm8oKSBjb25zdCB7IHJl
dHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oMSk7IH0KKyAgYm9vbCBo
YXNfdm1zdGF0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96
ZXJvOjpSZXBlYXRlZEZpZWxkSXRlcmF0b3I8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+IHZtc3Rh
dCgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPigy
KTsgfQorICBib29sIGhhc19jcHVfc3RhdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6UmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzPiBjcHVfc3RhdCgpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96
ZXJvOjpDb25zdEJ5dGVzPigzKTsgfQorICBib29sIGhhc19udW1fZm9ya3MoKSBjb25zdCB7IHJl
dHVybiBhdDw0PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgbnVtX2ZvcmtzKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19udW1faXJxX3RvdGFsKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IG51bV9pcnFfdG90
YWwoKSBjb25zdCB7IHJldHVybiBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX251
bV9pcnEoKSBjb25zdCB7IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86
OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gbnVtX2lycSgp
IGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzPig2KTsg
fQorICBib29sIGhhc19udW1fc29mdGlycV90b3RhbCgpIGNvbnN0IHsgcmV0dXJuIGF0PDc+KCku
dmFsaWQoKTsgfQorICB1aW50NjRfdCBudW1fc29mdGlycV90b3RhbCgpIGNvbnN0IHsgcmV0dXJu
IGF0PDc+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfbnVtX3NvZnRpcnEoKSBjb25zdCB7
IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJ
dGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gbnVtX3NvZnRpcnEoKSBjb25zdCB7IHJl
dHVybiBHZXRSZXBlYXRlZDw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4oOCk7IH0KKyAgYm9vbCBo
YXNfY29sbGVjdGlvbl9lbmRfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS52YWxp
ZCgpOyB9CisgIHVpbnQ2NF90IGNvbGxlY3Rpb25fZW5kX3RpbWVzdGFtcCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDk+KCkuYXNfdWludDY0KCk7IH0KK307CisKK2NsYXNzIFN5c1N0YXRzIDogcHVibGlj
IDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTeXNT
dGF0c19EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga01lbWluZm9GaWVsZE51bWJl
ciA9IDEsCisgICAga1Ztc3RhdEZpZWxkTnVtYmVyID0gMiwKKyAgICBrQ3B1U3RhdEZpZWxkTnVt
YmVyID0gMywKKyAgICBrTnVtRm9ya3NGaWVsZE51bWJlciA9IDQsCisgICAga051bUlycVRvdGFs
RmllbGROdW1iZXIgPSA1LAorICAgIGtOdW1JcnFGaWVsZE51bWJlciA9IDYsCisgICAga051bVNv
ZnRpcnFUb3RhbEZpZWxkTnVtYmVyID0gNywKKyAgICBrTnVtU29mdGlycUZpZWxkTnVtYmVyID0g
OCwKKyAgICBrQ29sbGVjdGlvbkVuZFRpbWVzdGFtcEZpZWxkTnVtYmVyID0gOSwKKyAgfTsKKyAg
dXNpbmcgTWVtaW5mb1ZhbHVlID0gOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86OlN5c1N0YXRz
X01lbWluZm9WYWx1ZTsKKyAgdXNpbmcgVm1zdGF0VmFsdWUgPSA6OnBlcmZldHRvOjpwcm90b3M6
OnBiemVybzo6U3lzU3RhdHNfVm1zdGF0VmFsdWU7CisgIHVzaW5nIENwdVRpbWVzID0gOjpwZXJm
ZXR0bzo6cHJvdG9zOjpwYnplcm86OlN5c1N0YXRzX0NwdVRpbWVzOworICB1c2luZyBJbnRlcnJ1
cHRDb3VudCA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpTeXNTdGF0c19JbnRlcnJ1cHRD
b3VudDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBTeXNTdGF0c19NZW1pbmZvVmFsdWU+IFQq
IGFkZF9tZW1pbmZvKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMSk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFN5c1N0YXRzX1Ztc3RhdFZhbHVlPiBUKiBh
ZGRfdm1zdGF0KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMik7CisgIH0K
KworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFN5c1N0YXRzX0NwdVRpbWVzPiBUKiBhZGRfY3B1
X3N0YXQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzKTsKKyAgfQorCisg
IHZvaWQgc2V0X251bV9mb3Jrcyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg0
LCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfbnVtX2lycV90b3RhbCh1aW50NjRfdCB2YWx1ZSkg
eworICAgIEFwcGVuZFZhckludCg1LCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBTeXNTdGF0c19JbnRlcnJ1cHRDb3VudD4gVCogYWRkX251bV9pcnEoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2KTsKKyAgfQorCisgIHZvaWQgc2V0X251bV9zb2Z0
aXJxX3RvdGFsKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDcsIHZhbHVlKTsK
KyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFN5c1N0YXRzX0ludGVycnVwdENvdW50PiBU
KiBhZGRfbnVtX3NvZnRpcnEoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig4
KTsKKyAgfQorCisgIHZvaWQgc2V0X2NvbGxlY3Rpb25fZW5kX3RpbWVzdGFtcCh1aW50NjRfdCB2
YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg5LCB2YWx1ZSk7CisgIH0KK307CisKK2NsYXNzIFN5
c1N0YXRzX0ludGVycnVwdENvdW50X0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3plcm86OlR5cGVk
UHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovMiwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVE
X0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTeXNTdGF0c19JbnRlcnJ1cHRDb3VudF9E
ZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29k
ZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBTeXNTdGF0c19JbnRlcnJ1cHRDb3VudF9EZWNv
ZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4
cGxpY2l0IFN5c1N0YXRzX0ludGVycnVwdENvdW50X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX2lycSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQor
ICBpbnQzMl90IGlycSgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkuYXNfaW50MzIoKTsgfQorICBi
b29sIGhhc19jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQoKTsgfQorICB1aW50
NjRfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KK307CisK
K2NsYXNzIFN5c1N0YXRzX0ludGVycnVwdENvdW50IDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNz
YWdlIHsKKyBwdWJsaWM6CisgIHVzaW5nIERlY29kZXIgPSBTeXNTdGF0c19JbnRlcnJ1cHRDb3Vu
dF9EZWNvZGVyOworICBlbnVtIDogaW50MzJfdCB7CisgICAga0lycUZpZWxkTnVtYmVyID0gMSwK
KyAgICBrQ291bnRGaWVsZE51bWJlciA9IDIsCisgIH07CisgIHZvaWQgc2V0X2lycShpbnQzMl90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDEsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9j
b3VudCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7CisgIH0K
K307CisKK2NsYXNzIFN5c1N0YXRzX0NwdVRpbWVzX0RlY29kZXIgOiBwdWJsaWMgOjpwcm90b3pl
cm86OlR5cGVkUHJvdG9EZWNvZGVyPC8qTUFYX0ZJRUxEX0lEPSovOCwgLypIQVNfTk9OUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGljOgorICBTeXNTdGF0c19DcHVUaW1l
c19EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0Rl
Y29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBTeXNTdGF0c19DcHVUaW1lc19EZWNvZGVy
KGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXplKCkpIHt9CisgIGV4cGxp
Y2l0IFN5c1N0YXRzX0NwdVRpbWVzX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJv
b2wgaGFzX2NwdV9pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQoKTsgfQorICB1aW50
MzJfdCBjcHVfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX3VpbnQzMigpOyB9CisgIGJv
b2wgaGFzX3VzZXJfbnMoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWlu
dDY0X3QgdXNlcl9ucygpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDY0KCk7IH0KKyAg
Ym9vbCBoYXNfdXNlcl9pY2VfbnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLnZhbGlkKCk7IH0K
KyAgdWludDY0X3QgdXNlcl9pY2VfbnMoKSBjb25zdCB7IHJldHVybiBhdDwzPigpLmFzX3VpbnQ2
NCgpOyB9CisgIGJvb2wgaGFzX3N5c3RlbV9tb2RlX25zKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4o
KS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHN5c3RlbV9tb2RlX25zKCkgY29uc3QgeyByZXR1cm4g
YXQ8ND4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc19pZGxlX25zKCkgY29uc3QgeyByZXR1
cm4gYXQ8NT4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlkbGVfbnMoKSBjb25zdCB7IHJldHVy
biBhdDw1PigpLmFzX3VpbnQ2NCgpOyB9CisgIGJvb2wgaGFzX2lvX3dhaXRfbnMoKSBjb25zdCB7
IHJldHVybiBhdDw2PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgaW9fd2FpdF9ucygpIGNvbnN0
IHsgcmV0dXJuIGF0PDY+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfaXJxX25zKCkgY29u
c3QgeyByZXR1cm4gYXQ8Nz4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IGlycV9ucygpIGNvbnN0
IHsgcmV0dXJuIGF0PDc+KCkuYXNfdWludDY0KCk7IH0KKyAgYm9vbCBoYXNfc29mdGlycV9ucygp
IGNvbnN0IHsgcmV0dXJuIGF0PDg+KCkudmFsaWQoKTsgfQorICB1aW50NjRfdCBzb2Z0aXJxX25z
KCkgY29uc3QgeyByZXR1cm4gYXQ8OD4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgU3lz
U3RhdHNfQ3B1VGltZXMgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1lc3NhZ2UgeworIHB1YmxpYzoK
KyAgdXNpbmcgRGVjb2RlciA9IFN5c1N0YXRzX0NwdVRpbWVzX0RlY29kZXI7CisgIGVudW0gOiBp
bnQzMl90IHsKKyAgICBrQ3B1SWRGaWVsZE51bWJlciA9IDEsCisgICAga1VzZXJOc0ZpZWxkTnVt
YmVyID0gMiwKKyAgICBrVXNlckljZU5zRmllbGROdW1iZXIgPSAzLAorICAgIGtTeXN0ZW1Nb2Rl
TnNGaWVsZE51bWJlciA9IDQsCisgICAga0lkbGVOc0ZpZWxkTnVtYmVyID0gNSwKKyAgICBrSW9X
YWl0TnNGaWVsZE51bWJlciA9IDYsCisgICAga0lycU5zRmllbGROdW1iZXIgPSA3LAorICAgIGtT
b2Z0aXJxTnNGaWVsZE51bWJlciA9IDgsCisgIH07CisgIHZvaWQgc2V0X2NwdV9pZCh1aW50MzJf
dCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRf
dXNlcl9ucyh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCgyLCB2YWx1ZSk7Cisg
IH0KKyAgdm9pZCBzZXRfdXNlcl9pY2VfbnModWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3N5c3RlbV9tb2RlX25zKHVpbnQ2NF90
IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDQsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9p
ZGxlX25zKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50KDUsIHZhbHVlKTsKKyAg
fQorICB2b2lkIHNldF9pb193YWl0X25zKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDYsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pcnFfbnModWludDY0X3QgdmFsdWUpIHsK
KyAgICBBcHBlbmRWYXJJbnQoNywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3NvZnRpcnFfbnMo
dWludDY0X3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoOCwgdmFsdWUpOworICB9Cit9Owor
CitjbGFzcyBTeXNTdGF0c19WbXN0YXRWYWx1ZV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJv
OjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9GSUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9S
RVBFQVRFRF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgU3lzU3RhdHNfVm1zdGF0VmFs
dWVfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9E
ZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgU3lzU3RhdHNfVm1zdGF0VmFsdWVfRGVj
b2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBl
eHBsaWNpdCBTeXNTdGF0c19WbXN0YXRWYWx1ZV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7
fQorICBib29sIGhhc19rZXkoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
aW50MzJfdCBrZXkoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLmFzX2ludDMyKCk7IH0KKyAgYm9v
bCBoYXNfdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLnZhbGlkKCk7IH0KKyAgdWludDY0
X3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiBhdDwyPigpLmFzX3VpbnQ2NCgpOyB9Cit9OworCitj
bGFzcyBTeXNTdGF0c19WbXN0YXRWYWx1ZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gU3lzU3RhdHNfVm1zdGF0VmFsdWVfRGVjb2Rl
cjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtLZXlGaWVsZE51bWJlciA9IDEsCisgICAga1Zh
bHVlRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNldF9rZXkoOjpwZXJmZXR0bzo6cHJv
dG9zOjpwYnplcm86OlZtc3RhdENvdW50ZXJzIHZhbHVlKSB7CisgICAgQXBwZW5kVGlueVZhcklu
dCgxLCB2YWx1ZSk7CisgIH0KKyAgdm9pZCBzZXRfdmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAg
ICBBcHBlbmRWYXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCitjbGFzcyBTeXNTdGF0c19NZW1p
bmZvVmFsdWVfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8
LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovZmFs
c2U+IHsKKyBwdWJsaWM6CisgIFN5c1N0YXRzX01lbWluZm9WYWx1ZV9EZWNvZGVyKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7
fQorICBleHBsaWNpdCBTeXNTdGF0c19NZW1pbmZvVmFsdWVfRGVjb2Rlcihjb25zdCBzdGQ6OnN0
cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWlu
dDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTeXNTdGF0c19N
ZW1pbmZvVmFsdWVfRGVjb2Rlcihjb25zdCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5kYXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfa2V5
KCkgY29uc3QgeyByZXR1cm4gYXQ8MT4oKS52YWxpZCgpOyB9CisgIGludDMyX3Qga2V5KCkgY29u
c3QgeyByZXR1cm4gYXQ8MT4oKS5hc19pbnQzMigpOyB9CisgIGJvb2wgaGFzX3ZhbHVlKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQ2NF90IHZhbHVlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS5hc191aW50NjQoKTsgfQorfTsKKworY2xhc3MgU3lzU3RhdHNfTWVt
aW5mb1ZhbHVlIDogcHVibGljIDo6cHJvdG96ZXJvOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIHVz
aW5nIERlY29kZXIgPSBTeXNTdGF0c19NZW1pbmZvVmFsdWVfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtLZXlGaWVsZE51bWJlciA9IDEsCisgICAga1ZhbHVlRmllbGROdW1iZXIg
PSAyLAorICB9OworICB2b2lkIHNldF9rZXkoOjpwZXJmZXR0bzo6cHJvdG9zOjpwYnplcm86Ok1l
bWluZm9Db3VudGVycyB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoMSwgdmFsdWUpOwor
ICB9CisgIHZvaWQgc2V0X3ZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFySW50
KDIsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4K
K30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS9zeXN0ZW1faW5m
by9jcHVfaW5mby5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNv
bXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BS
T1RPU19QRVJGRVRUT19UUkFDRV9TWVNURU1fSU5GT19DUFVfSU5GT19QUk9UT19IXworI2RlZmlu
ZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1NZU1RFTV9JTkZPX0NQVV9J
TkZPX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4K
KworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rl
ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2Ug
cHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBDcHVJbmZvX0NwdTsKKworY2xh
c3MgQ3B1SW5mb19EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2Rl
cjwvKk1BWF9GSUVMRF9JRD0qLzEsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90
cnVlPiB7CisgcHVibGljOgorICBDcHVJbmZvX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwg
c2l6ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0
IENwdUluZm9fRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNv
ZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6
ZSgpKSB7fQorICBleHBsaWNpdCBDcHVJbmZvX0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86OkNv
bnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUpIHt9
CisgIGJvb2wgaGFzX2NwdXMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAg
Ojpwcm90b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRl
cz4gY3B1cygpIGNvbnN0IHsgcmV0dXJuIEdldFJlcGVhdGVkPDo6cHJvdG96ZXJvOjpDb25zdEJ5
dGVzPigxKTsgfQorfTsKKworY2xhc3MgQ3B1SW5mbyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVz
c2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ3B1SW5mb19EZWNvZGVyOworICBl
bnVtIDogaW50MzJfdCB7CisgICAga0NwdXNGaWVsZE51bWJlciA9IDEsCisgIH07CisgIHVzaW5n
IENwdSA9IDo6cGVyZmV0dG86OnByb3Rvczo6cGJ6ZXJvOjpDcHVJbmZvX0NwdTsKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBDcHVJbmZvX0NwdT4gVCogYWRkX2NwdXMoKSB7CisgICAgcmV0dXJu
IEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCit9OworCitjbGFzcyBDcHVJbmZvX0Nw
dV9EZWNvZGVyIDogcHVibGljIDo6cHJvdG96ZXJvOjpUeXBlZFByb3RvRGVjb2RlcjwvKk1BWF9G
SUVMRF9JRD0qLzIsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9GSUVMRFM9Ki90cnVlPiB7Cisg
cHVibGljOgorICBDcHVJbmZvX0NwdV9EZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVf
dCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7fQorICBleHBsaWNpdCBDcHVJ
bmZvX0NwdV9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmF3LmRhdGEoKSksIHJhdy5zaXpl
KCkpIHt9CisgIGV4cGxpY2l0IENwdUluZm9fQ3B1X0RlY29kZXIoY29uc3QgOjpwcm90b3plcm86
OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2RlcihyYXcuZGF0YSwgcmF3LnNpemUp
IHt9CisgIGJvb2wgaGFzX3Byb2Nlc3NvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDE+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RDaGFycyBwcm9jZXNzb3IoKSBjb25zdCB7IHJldHVy
biBhdDwxPigpLmFzX3N0cmluZygpOyB9CisgIGJvb2wgaGFzX2ZyZXF1ZW5jaWVzKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpSZXBlYXRlZEZpZWxk
SXRlcmF0b3I8dWludDMyX3Q+IGZyZXF1ZW5jaWVzKCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0
ZWQ8dWludDMyX3Q+KDIpOyB9Cit9OworCitjbGFzcyBDcHVJbmZvX0NwdSA6IHB1YmxpYyA6OnBy
b3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gQ3B1SW5mb19D
cHVfRGVjb2RlcjsKKyAgZW51bSA6IGludDMyX3QgeworICAgIGtQcm9jZXNzb3JGaWVsZE51bWJl
ciA9IDEsCisgICAga0ZyZXF1ZW5jaWVzRmllbGROdW1iZXIgPSAyLAorICB9OworICB2b2lkIHNl
dF9wcm9jZXNzb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5kQnl0ZXMo
MSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X3Byb2Nlc3Nv
cihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIGRh
dGEsIHNpemUpOworICB9CisgIHZvaWQgYWRkX2ZyZXF1ZW5jaWVzKHVpbnQzMl90IHZhbHVlKSB7
CisgICAgQXBwZW5kVmFySW50KDIsIHZhbHVlKTsKKyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2Uu
Cit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNwYWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1
YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0
by90cmFjZS90cmFjZV9wYWNrZXRfZGVmYXVsdHMucGJ6ZXJvLmgKKy8vIEF1dG9nZW5lcmF0ZWQg
YnkgdGhlIFByb3RvWmVybyBjb21waWxlciBwbHVnaW4uIERPIE5PVCBFRElULgorCisjaWZuZGVm
IFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJBQ0VfVFJBQ0VfUEFDS0VUX0RFRkFV
TFRTX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19QUk9UT1NfUEVSRkVUVE9fVFJB
Q0VfVFJBQ0VfUEFDS0VUX0RFRkFVTFRTX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4K
KyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5j
bHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBl
eHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmll
bGRzLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9w
cm90b3plcm8vcHJvdG9fZGVjb2Rlci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBw
ZXJmZXR0byB7CituYW1lc3BhY2UgcHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFz
cyBUcmFja0V2ZW50RGVmYXVsdHM7CisKK2NsYXNzIFRyYWNlUGFja2V0RGVmYXVsdHNfRGVjb2Rl
ciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9
Ki81OCwgLypIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz0qL2ZhbHNlPiB7CisgcHVibGlj
OgorICBUcmFjZVBhY2tldERlZmF1bHRzX0RlY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6
ZV90IGxlbikgOiBUeXBlZFByb3RvRGVjb2RlcihkYXRhLCBsZW4pIHt9CisgIGV4cGxpY2l0IFRy
YWNlUGFja2V0RGVmYXVsdHNfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVk
UHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkp
LCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUcmFjZVBhY2tldERlZmF1bHRzX0RlY29kZXIo
Y29uc3QgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMmIHJhdykgOiBUeXBlZFByb3RvRGVjb2Rlcihy
YXcuZGF0YSwgcmF3LnNpemUpIHt9CisgIGJvb2wgaGFzX3RpbWVzdGFtcF9jbG9ja19pZCgpIGNv
bnN0IHsgcmV0dXJuIGF0PDU4PigpLnZhbGlkKCk7IH0KKyAgdWludDMyX3QgdGltZXN0YW1wX2Ns
b2NrX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8NTg+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBo
YXNfdHJhY2tfZXZlbnRfZGVmYXVsdHMoKSBjb25zdCB7IHJldHVybiBhdDwxMT4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRyYWNrX2V2ZW50X2RlZmF1bHRzKCkgY29u
c3QgeyByZXR1cm4gYXQ8MTE+KCkuYXNfYnl0ZXMoKTsgfQorfTsKKworY2xhc3MgVHJhY2VQYWNr
ZXREZWZhdWx0cyA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1
c2luZyBEZWNvZGVyID0gVHJhY2VQYWNrZXREZWZhdWx0c19EZWNvZGVyOworICBlbnVtIDogaW50
MzJfdCB7CisgICAga1RpbWVzdGFtcENsb2NrSWRGaWVsZE51bWJlciA9IDU4LAorICAgIGtUcmFj
a0V2ZW50RGVmYXVsdHNGaWVsZE51bWJlciA9IDExLAorICB9OworICB2b2lkIHNldF90aW1lc3Rh
bXBfY2xvY2tfaWQodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoNTgsIHZhbHVl
KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFRyYWNrRXZlbnREZWZhdWx0cz4gVCog
c2V0X3RyYWNrX2V2ZW50X2RlZmF1bHRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMTEpOworICB9CisKK307CisKK30gLy8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2Uu
Cit9IC8vIE5hbWVzcGFjZS4KKyNlbmRpZiAgLy8gSW5jbHVkZSBndWFyZC4KKy8vIGdlbl9hbWFs
Z2FtYXRlZCBiZWdpbiBoZWFkZXI6IGdlbi9wcm90b3MvcGVyZmV0dG8vdHJhY2UvdGVzdF9ldmVu
dC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBs
dWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJG
RVRUT19UUkFDRV9URVNUX0VWRU5UX1BST1RPX0hfCisjZGVmaW5lIFBFUkZFVFRPX1BST1RPU19Q
Uk9UT1NfUEVSRkVUVE9fVFJBQ0VfVEVTVF9FVkVOVF9QUk9UT19IXworCisjaW5jbHVkZSA8c3Rk
ZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9tZXNzYWdlLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcGFja2VkX3JlcGVh
dGVkX2ZpZWxkcy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVy
ZmV0dG8vcHJvdG96ZXJvL3Byb3RvX2RlY29kZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBh
bmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorCituYW1l
c3BhY2UgcGVyZmV0dG8geworbmFtZXNwYWNlIHByb3RvcyB7CituYW1lc3BhY2UgcGJ6ZXJvIHsK
KworCitjbGFzcyBUZXN0RXZlbnRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki8yLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURf
RklFTERTPSovZmFsc2U+IHsKKyBwdWJsaWM6CisgIFRlc3RFdmVudF9EZWNvZGVyKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pIDogVHlwZWRQcm90b0RlY29kZXIoZGF0YSwgbGVuKSB7
fQorICBleHBsaWNpdCBUZXN0RXZlbnRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6
IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5k
YXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUZXN0RXZlbnRfRGVjb2Rlcihjb25z
dCA6OnByb3RvemVybzo6Q29uc3RCeXRlcyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJhdy5k
YXRhLCByYXcuc2l6ZSkge30KKyAgYm9vbCBoYXNfc3RyKCkgY29uc3QgeyByZXR1cm4gYXQ8MT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdENoYXJzIHN0cigpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfc3RyaW5nKCk7IH0KKyAgYm9vbCBoYXNfc2VxX3ZhbHVlKCkgY29uc3Qg
eyByZXR1cm4gYXQ8Mj4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHNlcV92YWx1ZSgpIGNvbnN0
IHsgcmV0dXJuIGF0PDI+KCkuYXNfdWludDMyKCk7IH0KK307CisKK2NsYXNzIFRlc3RFdmVudCA6
IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7CisgcHVibGljOgorICB1c2luZyBEZWNvZGVy
ID0gVGVzdEV2ZW50X0RlY29kZXI7CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrU3RyRmllbGRO
dW1iZXIgPSAxLAorICAgIGtTZXFWYWx1ZUZpZWxkTnVtYmVyID0gMiwKKyAgfTsKKyAgdm9pZCBz
ZXRfc3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIEFwcGVuZEJ5dGVzKDEsIHZh
bHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9zdHIoY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBcHBlbmRCeXRlcygxLCBkYXRhLCBzaXplKTsK
KyAgfQorICB2b2lkIHNldF9zZXFfdmFsdWUodWludDMyX3QgdmFsdWUpIHsKKyAgICBBcHBlbmRW
YXJJbnQoMiwgdmFsdWUpOworICB9Cit9OworCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNw
YWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQuCisvLyBnZW5f
YW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBnZW4vcHJvdG9zL3BlcmZldHRvL3RyYWNlL3RyYWNl
X3BhY2tldC5wYnplcm8uaAorLy8gQXV0b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBp
bGVyIHBsdWdpbi4gRE8gTk9UIEVESVQuCisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RP
U19QRVJGRVRUT19UUkFDRV9UUkFDRV9QQUNLRVRfUFJPVE9fSF8KKyNkZWZpbmUgUEVSRkVUVE9f
UFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDRV9QQUNLRVRfUFJPVE9fSF8KKworI2lu
Y2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorLy8g
Z2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Bh
Y2tlZF9yZXBlYXRlZF9maWVsZHMuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2lu
Y2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b19kZWNvZGVyLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMu
aCIKKworbmFtZXNwYWNlIHBlcmZldHRvIHsKK25hbWVzcGFjZSBwcm90b3MgeworbmFtZXNwYWNl
IHBiemVybyB7CisKK2NsYXNzIEFuZHJvaWRMb2dQYWNrZXQ7CitjbGFzcyBCYXR0ZXJ5Q291bnRl
cnM7CitjbGFzcyBDaHJvbWVCZW5jaG1hcmtNZXRhZGF0YTsKK2NsYXNzIENocm9tZUV2ZW50QnVu
ZGxlOworY2xhc3MgQ2hyb21lTWV0YWRhdGFQYWNrZXQ7CitjbGFzcyBDbG9ja1NuYXBzaG90Owor
Y2xhc3MgQ3B1SW5mbzsKK2NsYXNzIERlb2JmdXNjYXRpb25NYXBwaW5nOworY2xhc3MgRnRyYWNl
RXZlbnRCdW5kbGU7CitjbGFzcyBGdHJhY2VTdGF0czsKK2NsYXNzIEdwdUNvdW50ZXJFdmVudDsK
K2NsYXNzIEdwdUxvZzsKK2NsYXNzIEdwdU1lbVRvdGFsRXZlbnQ7CitjbGFzcyBHcHVSZW5kZXJT
dGFnZUV2ZW50OworY2xhc3MgR3JhcGhpY3NGcmFtZUV2ZW50OworY2xhc3MgSGVhcEdyYXBoOwor
Y2xhc3MgSW5pdGlhbERpc3BsYXlTdGF0ZTsKK2NsYXNzIElub2RlRmlsZU1hcDsKK2NsYXNzIElu
dGVybmVkRGF0YTsKK2NsYXNzIE1vZHVsZVN5bWJvbHM7CitjbGFzcyBQYWNrYWdlc0xpc3Q7Citj
bGFzcyBQZXJmU2FtcGxlOworY2xhc3MgUGVyZmV0dG9NZXRhdHJhY2U7CitjbGFzcyBQb3dlclJh
aWxzOworY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0b3I7CitjbGFzcyBQcm9jZXNzU3RhdHM7CitjbGFz
cyBQcm9jZXNzVHJlZTsKK2NsYXNzIFByb2ZpbGVQYWNrZXQ7CitjbGFzcyBQcm9maWxlZEZyYW1l
U3ltYm9sczsKK2NsYXNzIFNtYXBzUGFja2V0OworY2xhc3MgU3RyZWFtaW5nUHJvZmlsZVBhY2tl
dDsKK2NsYXNzIFN5c1N0YXRzOworY2xhc3MgU3lzdGVtSW5mbzsKK2NsYXNzIFRlc3RFdmVudDsK
K2NsYXNzIFRocmVhZERlc2NyaXB0b3I7CitjbGFzcyBUcmFjZUNvbmZpZzsKK2NsYXNzIFRyYWNl
UGFja2V0RGVmYXVsdHM7CitjbGFzcyBUcmFjZVN0YXRzOworY2xhc3MgVHJhY2luZ1NlcnZpY2VF
dmVudDsKK2NsYXNzIFRyYWNrRGVzY3JpcHRvcjsKK2NsYXNzIFRyYWNrRXZlbnQ7CitjbGFzcyBU
cmlnZ2VyOworY2xhc3MgVnVsa2FuQXBpRXZlbnQ7CitjbGFzcyBWdWxrYW5NZW1vcnlFdmVudDsK
KworZW51bSBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdzIDogaW50MzJfdCB7CisgIFRyYWNlUGFj
a2V0X1NlcXVlbmNlRmxhZ3NfU0VRX1VOU1BFQ0lGSUVEID0gMCwKKyAgVHJhY2VQYWNrZXRfU2Vx
dWVuY2VGbGFnc19TRVFfSU5DUkVNRU5UQUxfU1RBVEVfQ0xFQVJFRCA9IDEsCisgIFRyYWNlUGFj
a2V0X1NlcXVlbmNlRmxhZ3NfU0VRX05FRURTX0lOQ1JFTUVOVEFMX1NUQVRFID0gMiwKK307CisK
K2NvbnN0IFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3MgVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFn
c19NSU4gPSBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdzX1NFUV9VTlNQRUNJRklFRDsKK2NvbnN0
IFRyYWNlUGFja2V0X1NlcXVlbmNlRmxhZ3MgVHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnc19NQVgg
PSBUcmFjZVBhY2tldF9TZXF1ZW5jZUZsYWdzX1NFUV9ORUVEU19JTkNSRU1FTlRBTF9TVEFURTsK
KworY2xhc3MgVHJhY2VQYWNrZXRfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQ
cm90b0RlY29kZXI8LypNQVhfRklFTERfSUQ9Ki85MDAsIC8qSEFTX05PTlBBQ0tFRF9SRVBFQVRF
RF9GSUVMRFM9Ki9mYWxzZT4geworIHB1YmxpYzoKKyAgVHJhY2VQYWNrZXRfRGVjb2Rlcihjb25z
dCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxl
bikge30KKyAgZXhwbGljaXQgVHJhY2VQYWNrZXRfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYg
cmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBUcmFjZVBhY2tldF9EZWNv
ZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzJiByYXcpIDogVHlwZWRQcm90b0RlY29k
ZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29sIGhhc190aW1lc3RhbXAoKSBjb25zdCB7
IHJldHVybiBhdDw4PigpLnZhbGlkKCk7IH0KKyAgdWludDY0X3QgdGltZXN0YW1wKCkgY29uc3Qg
eyByZXR1cm4gYXQ8OD4oKS5hc191aW50NjQoKTsgfQorICBib29sIGhhc190aW1lc3RhbXBfY2xv
Y2tfaWQoKSBjb25zdCB7IHJldHVybiBhdDw1OD4oKS52YWxpZCgpOyB9CisgIHVpbnQzMl90IHRp
bWVzdGFtcF9jbG9ja19pZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU4PigpLmFzX3VpbnQzMigpOyB9
CisgIGJvb2wgaGFzX3Byb2Nlc3NfdHJlZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDI+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwcm9jZXNzX3RyZWUoKSBjb25zdCB7IHJl
dHVybiBhdDwyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfcHJvY2Vzc19zdGF0cygpIGNv
bnN0IHsgcmV0dXJuIGF0PDk+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBwcm9jZXNzX3N0YXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8OT4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX2lub2RlX2ZpbGVfbWFwKCkgY29uc3QgeyByZXR1cm4gYXQ8ND4oKS52YWxpZCgp
OyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGlub2RlX2ZpbGVfbWFwKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8ND4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9ldmVudHMoKSBj
b25zdCB7IHJldHVybiBhdDw1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0
ZXMgY2hyb21lX2V2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGF0PDU+KCkuYXNfYnl0ZXMoKTsgfQor
ICBib29sIGhhc19jbG9ja19zbmFwc2hvdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBjbG9ja19zbmFwc2hvdCgpIGNvbnN0IHsg
cmV0dXJuIGF0PDY+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19zeXNfc3RhdHMoKSBjb25z
dCB7IHJldHVybiBhdDw3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMg
c3lzX3N0YXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8Nz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wg
aGFzX3RyYWNrX2V2ZW50KCkgY29uc3QgeyByZXR1cm4gYXQ8MTE+KCkudmFsaWQoKTsgfQorICA6
OnByb3RvemVybzo6Q29uc3RCeXRlcyB0cmFja19ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDEx
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfdHJhY2VfY29uZmlnKCkgY29uc3QgeyByZXR1
cm4gYXQ8MzM+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyB0cmFjZV9j
b25maWcoKSBjb25zdCB7IHJldHVybiBhdDwzMz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFz
X2Z0cmFjZV9zdGF0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDM0PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgZnRyYWNlX3N0YXRzKCkgY29uc3QgeyByZXR1cm4gYXQ8MzQ+
KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190cmFjZV9zdGF0cygpIGNvbnN0IHsgcmV0dXJu
IGF0PDM1PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdHJhY2Vfc3Rh
dHMoKSBjb25zdCB7IHJldHVybiBhdDwzNT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3By
b2ZpbGVfcGFja2V0KCkgY29uc3QgeyByZXR1cm4gYXQ8Mzc+KCkudmFsaWQoKTsgfQorICA6OnBy
b3RvemVybzo6Q29uc3RCeXRlcyBwcm9maWxlX3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDM3
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfYmF0dGVyeSgpIGNvbnN0IHsgcmV0dXJuIGF0
PDM4PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYmF0dGVyeSgpIGNv
bnN0IHsgcmV0dXJuIGF0PDM4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfcG93ZXJfcmFp
bHMoKSBjb25zdCB7IHJldHVybiBhdDw0MD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpD
b25zdEJ5dGVzIHBvd2VyX3JhaWxzKCkgY29uc3QgeyByZXR1cm4gYXQ8NDA+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19hbmRyb2lkX2xvZygpIGNvbnN0IHsgcmV0dXJuIGF0PDM5PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgYW5kcm9pZF9sb2coKSBjb25zdCB7
IHJldHVybiBhdDwzOT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3N5c3RlbV9pbmZvKCkg
Y29uc3QgeyByZXR1cm4gYXQ8NDU+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RC
eXRlcyBzeXN0ZW1faW5mbygpIGNvbnN0IHsgcmV0dXJuIGF0PDQ1PigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfdHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ2PigpLnZhbGlkKCk7IH0K
KyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQ2
PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfcGFja2FnZXNfbGlzdCgpIGNvbnN0IHsgcmV0
dXJuIGF0PDQ3PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgcGFja2Fn
ZXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ3PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfY2hyb21lX2JlbmNobWFya19tZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ4PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgY2hyb21lX2JlbmNobWFya19tZXRh
ZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDQ4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNf
cGVyZmV0dG9fbWV0YXRyYWNlKCkgY29uc3QgeyByZXR1cm4gYXQ8NDk+KCkudmFsaWQoKTsgfQor
ICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwZXJmZXR0b19tZXRhdHJhY2UoKSBjb25zdCB7IHJl
dHVybiBhdDw0OT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2Nocm9tZV9tZXRhZGF0YSgp
IGNvbnN0IHsgcmV0dXJuIGF0PDUxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0
Qnl0ZXMgY2hyb21lX21ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gYXQ8NTE+KCkuYXNfYnl0ZXMo
KTsgfQorICBib29sIGhhc19ncHVfY291bnRlcl9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDUy
PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZ3B1X2NvdW50ZXJfZXZl
bnQoKSBjb25zdCB7IHJldHVybiBhdDw1Mj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2dw
dV9yZW5kZXJfc3RhZ2VfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw1Mz4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGdwdV9yZW5kZXJfc3RhZ2VfZXZlbnQoKSBjb25z
dCB7IHJldHVybiBhdDw1Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3N0cmVhbWluZ19w
cm9maWxlX3BhY2tldCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU0PigpLnZhbGlkKCk7IH0KKyAgOjpw
cm90b3plcm86OkNvbnN0Qnl0ZXMgc3RyZWFtaW5nX3Byb2ZpbGVfcGFja2V0KCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NTQ+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19oZWFwX2dyYXBoKCkgY29u
c3QgeyByZXR1cm4gYXQ8NTY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRl
cyBoZWFwX2dyYXBoKCkgY29uc3QgeyByZXR1cm4gYXQ8NTY+KCkuYXNfYnl0ZXMoKTsgfQorICBi
b29sIGhhc19ncmFwaGljc19mcmFtZV9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDU3PigpLnZh
bGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZ3JhcGhpY3NfZnJhbWVfZXZlbnQo
KSBjb25zdCB7IHJldHVybiBhdDw1Nz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Z1bGth
bl9tZW1vcnlfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw2Mj4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHZ1bGthbl9tZW1vcnlfZXZlbnQoKSBjb25zdCB7IHJldHVy
biBhdDw2Mj4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX2dwdV9sb2coKSBjb25zdCB7IHJl
dHVybiBhdDw2Mz4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGdwdV9s
b2coKSBjb25zdCB7IHJldHVybiBhdDw2Mz4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Z1
bGthbl9hcGlfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw2NT4oKS52YWxpZCgpOyB9CisgIDo6
cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHZ1bGthbl9hcGlfZXZlbnQoKSBjb25zdCB7IHJldHVybiBh
dDw2NT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3BlcmZfc2FtcGxlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NjY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBwZXJm
X3NhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIGF0PDY2PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBo
YXNfY3B1X2luZm8oKSBjb25zdCB7IHJldHVybiBhdDw2Nz4oKS52YWxpZCgpOyB9CisgIDo6cHJv
dG96ZXJvOjpDb25zdEJ5dGVzIGNwdV9pbmZvKCkgY29uc3QgeyByZXR1cm4gYXQ8Njc+KCkuYXNf
Ynl0ZXMoKTsgfQorICBib29sIGhhc19zbWFwc19wYWNrZXQoKSBjb25zdCB7IHJldHVybiBhdDw2
OD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHNtYXBzX3BhY2tldCgp
IGNvbnN0IHsgcmV0dXJuIGF0PDY4PigpLmFzX2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfc2Vydmlj
ZV9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY5PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgc2VydmljZV9ldmVudCgpIGNvbnN0IHsgcmV0dXJuIGF0PDY5PigpLmFz
X2J5dGVzKCk7IH0KKyAgYm9vbCBoYXNfaW5pdGlhbF9kaXNwbGF5X3N0YXRlKCkgY29uc3QgeyBy
ZXR1cm4gYXQ8NzA+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBpbml0
aWFsX2Rpc3BsYXlfc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdDw3MD4oKS5hc19ieXRlcygpOyB9
CisgIGJvb2wgaGFzX2dwdV9tZW1fdG90YWxfZXZlbnQoKSBjb25zdCB7IHJldHVybiBhdDw3MT4o
KS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGdwdV9tZW1fdG90YWxfZXZl
bnQoKSBjb25zdCB7IHJldHVybiBhdDw3MT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3By
b2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSBjb25zdCB7IHJldHVybiBhdDw1NT4oKS52YWxpZCgpOyB9
CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHByb2ZpbGVkX2ZyYW1lX3N5bWJvbHMoKSBjb25z
dCB7IHJldHVybiBhdDw1NT4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX21vZHVsZV9zeW1i
b2xzKCkgY29uc3QgeyByZXR1cm4gYXQ8NjE+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBtb2R1bGVfc3ltYm9scygpIGNvbnN0IHsgcmV0dXJuIGF0PDYxPigpLmFzX2J5
dGVzKCk7IH0KKyAgYm9vbCBoYXNfZGVvYmZ1c2NhdGlvbl9tYXBwaW5nKCkgY29uc3QgeyByZXR1
cm4gYXQ8NjQ+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBkZW9iZnVz
Y2F0aW9uX21hcHBpbmcoKSBjb25zdCB7IHJldHVybiBhdDw2ND4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX3RyYWNrX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBhdDw2MD4oKS52YWxp
ZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIHRyYWNrX2Rlc2NyaXB0b3IoKSBjb25z
dCB7IHJldHVybiBhdDw2MD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3Byb2Nlc3NfZGVz
Y3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIGF0PDQzPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3pl
cm86OkNvbnN0Qnl0ZXMgcHJvY2Vzc19kZXNjcmlwdG9yKCkgY29uc3QgeyByZXR1cm4gYXQ8NDM+
KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc190aHJlYWRfZGVzY3JpcHRvcigpIGNvbnN0IHsg
cmV0dXJuIGF0PDQ0PigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdGhy
ZWFkX2Rlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBhdDw0ND4oKS5hc19ieXRlcygpOyB9Cisg
IGJvb2wgaGFzX2Z0cmFjZV9ldmVudHMoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgZnRyYWNlX2V2ZW50cygpIGNvbnN0IHsgcmV0
dXJuIGF0PDE+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19zeW5jaHJvbml6YXRpb25fbWFy
a2VyKCkgY29uc3QgeyByZXR1cm4gYXQ8MzY+KCkudmFsaWQoKTsgfQorICA6OnByb3RvemVybzo6
Q29uc3RCeXRlcyBzeW5jaHJvbml6YXRpb25fbWFya2VyKCkgY29uc3QgeyByZXR1cm4gYXQ8MzY+
KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19jb21wcmVzc2VkX3BhY2tldHMoKSBjb25zdCB7
IHJldHVybiBhdDw1MD4oKS52YWxpZCgpOyB9CisgIDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVzIGNv
bXByZXNzZWRfcGFja2V0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDUwPigpLmFzX2J5dGVzKCk7IH0K
KyAgYm9vbCBoYXNfZm9yX3Rlc3RpbmcoKSBjb25zdCB7IHJldHVybiBhdDw5MDA+KCkudmFsaWQo
KTsgfQorICA6OnByb3RvemVybzo6Q29uc3RCeXRlcyBmb3JfdGVzdGluZygpIGNvbnN0IHsgcmV0
dXJuIGF0PDkwMD4oKS5hc19ieXRlcygpOyB9CisgIGJvb2wgaGFzX3RydXN0ZWRfdWlkKCkgY29u
c3QgeyByZXR1cm4gYXQ8Mz4oKS52YWxpZCgpOyB9CisgIGludDMyX3QgdHJ1c3RlZF91aWQoKSBj
b25zdCB7IHJldHVybiBhdDwzPigpLmFzX2ludDMyKCk7IH0KKyAgYm9vbCBoYXNfdHJ1c3RlZF9w
YWNrZXRfc2VxdWVuY2VfaWQoKSBjb25zdCB7IHJldHVybiBhdDwxMD4oKS52YWxpZCgpOyB9Cisg
IHVpbnQzMl90IHRydXN0ZWRfcGFja2V0X3NlcXVlbmNlX2lkKCkgY29uc3QgeyByZXR1cm4gYXQ8
MTA+KCkuYXNfdWludDMyKCk7IH0KKyAgYm9vbCBoYXNfaW50ZXJuZWRfZGF0YSgpIGNvbnN0IHsg
cmV0dXJuIGF0PDEyPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgaW50
ZXJuZWRfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGF0PDEyPigpLmFzX2J5dGVzKCk7IH0KKyAgYm9v
bCBoYXNfc2VxdWVuY2VfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBhdDwxMz4oKS52YWxpZCgpOyB9
CisgIHVpbnQzMl90IHNlcXVlbmNlX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4gYXQ8MTM+KCkuYXNf
dWludDMyKCk7IH0KKyAgYm9vbCBoYXNfaW5jcmVtZW50YWxfc3RhdGVfY2xlYXJlZCgpIGNvbnN0
IHsgcmV0dXJuIGF0PDQxPigpLnZhbGlkKCk7IH0KKyAgYm9vbCBpbmNyZW1lbnRhbF9zdGF0ZV9j
bGVhcmVkKCkgY29uc3QgeyByZXR1cm4gYXQ8NDE+KCkuYXNfYm9vbCgpOyB9CisgIGJvb2wgaGFz
X3RyYWNlX3BhY2tldF9kZWZhdWx0cygpIGNvbnN0IHsgcmV0dXJuIGF0PDU5PigpLnZhbGlkKCk7
IH0KKyAgOjpwcm90b3plcm86OkNvbnN0Qnl0ZXMgdHJhY2VfcGFja2V0X2RlZmF1bHRzKCkgY29u
c3QgeyByZXR1cm4gYXQ8NTk+KCkuYXNfYnl0ZXMoKTsgfQorICBib29sIGhhc19wcmV2aW91c19w
YWNrZXRfZHJvcHBlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQyPigpLnZhbGlkKCk7IH0KKyAgYm9v
bCBwcmV2aW91c19wYWNrZXRfZHJvcHBlZCgpIGNvbnN0IHsgcmV0dXJuIGF0PDQyPigpLmFzX2Jv
b2woKTsgfQorfTsKKworY2xhc3MgVHJhY2VQYWNrZXQgOiBwdWJsaWMgOjpwcm90b3plcm86Ok1l
c3NhZ2UgeworIHB1YmxpYzoKKyAgdXNpbmcgRGVjb2RlciA9IFRyYWNlUGFja2V0X0RlY29kZXI7
CisgIGVudW0gOiBpbnQzMl90IHsKKyAgICBrVGltZXN0YW1wRmllbGROdW1iZXIgPSA4LAorICAg
IGtUaW1lc3RhbXBDbG9ja0lkRmllbGROdW1iZXIgPSA1OCwKKyAgICBrUHJvY2Vzc1RyZWVGaWVs
ZE51bWJlciA9IDIsCisgICAga1Byb2Nlc3NTdGF0c0ZpZWxkTnVtYmVyID0gOSwKKyAgICBrSW5v
ZGVGaWxlTWFwRmllbGROdW1iZXIgPSA0LAorICAgIGtDaHJvbWVFdmVudHNGaWVsZE51bWJlciA9
IDUsCisgICAga0Nsb2NrU25hcHNob3RGaWVsZE51bWJlciA9IDYsCisgICAga1N5c1N0YXRzRmll
bGROdW1iZXIgPSA3LAorICAgIGtUcmFja0V2ZW50RmllbGROdW1iZXIgPSAxMSwKKyAgICBrVHJh
Y2VDb25maWdGaWVsZE51bWJlciA9IDMzLAorICAgIGtGdHJhY2VTdGF0c0ZpZWxkTnVtYmVyID0g
MzQsCisgICAga1RyYWNlU3RhdHNGaWVsZE51bWJlciA9IDM1LAorICAgIGtQcm9maWxlUGFja2V0
RmllbGROdW1iZXIgPSAzNywKKyAgICBrQmF0dGVyeUZpZWxkTnVtYmVyID0gMzgsCisgICAga1Bv
d2VyUmFpbHNGaWVsZE51bWJlciA9IDQwLAorICAgIGtBbmRyb2lkTG9nRmllbGROdW1iZXIgPSAz
OSwKKyAgICBrU3lzdGVtSW5mb0ZpZWxkTnVtYmVyID0gNDUsCisgICAga1RyaWdnZXJGaWVsZE51
bWJlciA9IDQ2LAorICAgIGtQYWNrYWdlc0xpc3RGaWVsZE51bWJlciA9IDQ3LAorICAgIGtDaHJv
bWVCZW5jaG1hcmtNZXRhZGF0YUZpZWxkTnVtYmVyID0gNDgsCisgICAga1BlcmZldHRvTWV0YXRy
YWNlRmllbGROdW1iZXIgPSA0OSwKKyAgICBrQ2hyb21lTWV0YWRhdGFGaWVsZE51bWJlciA9IDUx
LAorICAgIGtHcHVDb3VudGVyRXZlbnRGaWVsZE51bWJlciA9IDUyLAorICAgIGtHcHVSZW5kZXJT
dGFnZUV2ZW50RmllbGROdW1iZXIgPSA1MywKKyAgICBrU3RyZWFtaW5nUHJvZmlsZVBhY2tldEZp
ZWxkTnVtYmVyID0gNTQsCisgICAga0hlYXBHcmFwaEZpZWxkTnVtYmVyID0gNTYsCisgICAga0dy
YXBoaWNzRnJhbWVFdmVudEZpZWxkTnVtYmVyID0gNTcsCisgICAga1Z1bGthbk1lbW9yeUV2ZW50
RmllbGROdW1iZXIgPSA2MiwKKyAgICBrR3B1TG9nRmllbGROdW1iZXIgPSA2MywKKyAgICBrVnVs
a2FuQXBpRXZlbnRGaWVsZE51bWJlciA9IDY1LAorICAgIGtQZXJmU2FtcGxlRmllbGROdW1iZXIg
PSA2NiwKKyAgICBrQ3B1SW5mb0ZpZWxkTnVtYmVyID0gNjcsCisgICAga1NtYXBzUGFja2V0Rmll
bGROdW1iZXIgPSA2OCwKKyAgICBrU2VydmljZUV2ZW50RmllbGROdW1iZXIgPSA2OSwKKyAgICBr
SW5pdGlhbERpc3BsYXlTdGF0ZUZpZWxkTnVtYmVyID0gNzAsCisgICAga0dwdU1lbVRvdGFsRXZl
bnRGaWVsZE51bWJlciA9IDcxLAorICAgIGtQcm9maWxlZEZyYW1lU3ltYm9sc0ZpZWxkTnVtYmVy
ID0gNTUsCisgICAga01vZHVsZVN5bWJvbHNGaWVsZE51bWJlciA9IDYxLAorICAgIGtEZW9iZnVz
Y2F0aW9uTWFwcGluZ0ZpZWxkTnVtYmVyID0gNjQsCisgICAga1RyYWNrRGVzY3JpcHRvckZpZWxk
TnVtYmVyID0gNjAsCisgICAga1Byb2Nlc3NEZXNjcmlwdG9yRmllbGROdW1iZXIgPSA0MywKKyAg
ICBrVGhyZWFkRGVzY3JpcHRvckZpZWxkTnVtYmVyID0gNDQsCisgICAga0Z0cmFjZUV2ZW50c0Zp
ZWxkTnVtYmVyID0gMSwKKyAgICBrU3luY2hyb25pemF0aW9uTWFya2VyRmllbGROdW1iZXIgPSAz
NiwKKyAgICBrQ29tcHJlc3NlZFBhY2tldHNGaWVsZE51bWJlciA9IDUwLAorICAgIGtGb3JUZXN0
aW5nRmllbGROdW1iZXIgPSA5MDAsCisgICAga1RydXN0ZWRVaWRGaWVsZE51bWJlciA9IDMsCisg
ICAga1RydXN0ZWRQYWNrZXRTZXF1ZW5jZUlkRmllbGROdW1iZXIgPSAxMCwKKyAgICBrSW50ZXJu
ZWREYXRhRmllbGROdW1iZXIgPSAxMiwKKyAgICBrU2VxdWVuY2VGbGFnc0ZpZWxkTnVtYmVyID0g
MTMsCisgICAga0luY3JlbWVudGFsU3RhdGVDbGVhcmVkRmllbGROdW1iZXIgPSA0MSwKKyAgICBr
VHJhY2VQYWNrZXREZWZhdWx0c0ZpZWxkTnVtYmVyID0gNTksCisgICAga1ByZXZpb3VzUGFja2V0
RHJvcHBlZEZpZWxkTnVtYmVyID0gNDIsCisgIH07CisgIHVzaW5nIFNlcXVlbmNlRmxhZ3MgPSA6
OnBlcmZldHRvOjpwcm90b3M6OnBiemVybzo6VHJhY2VQYWNrZXRfU2VxdWVuY2VGbGFnczsKKyAg
c3RhdGljIGNvbnN0IFNlcXVlbmNlRmxhZ3MgU0VRX1VOU1BFQ0lGSUVEID0gVHJhY2VQYWNrZXRf
U2VxdWVuY2VGbGFnc19TRVFfVU5TUEVDSUZJRUQ7CisgIHN0YXRpYyBjb25zdCBTZXF1ZW5jZUZs
YWdzIFNFUV9JTkNSRU1FTlRBTF9TVEFURV9DTEVBUkVEID0gVHJhY2VQYWNrZXRfU2VxdWVuY2VG
bGFnc19TRVFfSU5DUkVNRU5UQUxfU1RBVEVfQ0xFQVJFRDsKKyAgc3RhdGljIGNvbnN0IFNlcXVl
bmNlRmxhZ3MgU0VRX05FRURTX0lOQ1JFTUVOVEFMX1NUQVRFID0gVHJhY2VQYWNrZXRfU2VxdWVu
Y2VGbGFnc19TRVFfTkVFRFNfSU5DUkVNRU5UQUxfU1RBVEU7CisgIHZvaWQgc2V0X3RpbWVzdGFt
cCh1aW50NjRfdCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludCg4LCB2YWx1ZSk7CisgIH0KKyAg
dm9pZCBzZXRfdGltZXN0YW1wX2Nsb2NrX2lkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5k
VmFySW50KDU4LCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9jZXNz
VHJlZT4gVCogc2V0X3Byb2Nlc3NfdHJlZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9jZXNzU3RhdHM+
IFQqIHNldF9wcm9jZXNzX3N0YXRzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8
VD4oOSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IElub2RlRmlsZU1hcD4gVCog
c2V0X2lub2RlX2ZpbGVfbWFwKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
NCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IENocm9tZUV2ZW50QnVuZGxlPiBU
KiBzZXRfY2hyb21lX2V2ZW50cygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBDbG9ja1NuYXBzaG90PiBUKiBz
ZXRfY2xvY2tfc25hcHNob3QoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2
KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU3lzU3RhdHM+IFQqIHNldF9zeXNf
c3RhdHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig3KTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVHJhY2tFdmVudD4gVCogc2V0X3RyYWNrX2V2ZW50KCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oMTEpOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBUcmFjZUNvbmZpZz4gVCogc2V0X3RyYWNlX2NvbmZpZygpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDMzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gRnRyYWNlU3RhdHM+IFQqIHNldF9mdHJhY2Vfc3RhdHMoKSB7CisgICAgcmV0
dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigzNCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVCA9IFRyYWNlU3RhdHM+IFQqIHNldF90cmFjZV9zdGF0cygpIHsKKyAgICByZXR1cm4gQmVn
aW5OZXN0ZWRNZXNzYWdlPFQ+KDM1KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0g
UHJvZmlsZVBhY2tldD4gVCogc2V0X3Byb2ZpbGVfcGFja2V0KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oMzcpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBC
YXR0ZXJ5Q291bnRlcnM+IFQqIHNldF9iYXR0ZXJ5KCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oMzgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQb3dlclJh
aWxzPiBUKiBzZXRfcG93ZXJfcmFpbHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2Fn
ZTxUPig0MCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEFuZHJvaWRMb2dQYWNr
ZXQ+IFQqIHNldF9hbmRyb2lkX2xvZygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdl
PFQ+KDM5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gU3lzdGVtSW5mbz4gVCog
c2V0X3N5c3RlbV9pbmZvKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNDUp
OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmlnZ2VyPiBUKiBzZXRfdHJpZ2dl
cigpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ2KTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gUGFja2FnZXNMaXN0PiBUKiBzZXRfcGFja2FnZXNfbGlzdCgp
IHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQ3KTsKKyAgfQorCisgIHRlbXBs
YXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lQmVuY2htYXJrTWV0YWRhdGE+IFQqIHNldF9jaHJvbWVf
YmVuY2htYXJrX21ldGFkYXRhKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
NDgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQZXJmZXR0b01ldGF0cmFjZT4g
VCogc2V0X3BlcmZldHRvX21ldGF0cmFjZSgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNz
YWdlPFQ+KDQ5KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ2hyb21lTWV0YWRh
dGFQYWNrZXQ+IFQqIHNldF9jaHJvbWVfbWV0YWRhdGEoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVz
dGVkTWVzc2FnZTxUPig1MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IEdwdUNv
dW50ZXJFdmVudD4gVCogc2V0X2dwdV9jb3VudGVyX2V2ZW50KCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oNTIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBH
cHVSZW5kZXJTdGFnZUV2ZW50PiBUKiBzZXRfZ3B1X3JlbmRlcl9zdGFnZV9ldmVudCgpIHsKKyAg
ICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDUzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gU3RyZWFtaW5nUHJvZmlsZVBhY2tldD4gVCogc2V0X3N0cmVhbWluZ19wcm9m
aWxlX3BhY2tldCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDU0KTsKKyAg
fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gSGVhcEdyYXBoPiBUKiBzZXRfaGVhcF9ncmFw
aCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDU2KTsKKyAgfQorCisgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUID0gR3JhcGhpY3NGcmFtZUV2ZW50PiBUKiBzZXRfZ3JhcGhpY3Nf
ZnJhbWVfZXZlbnQoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig1Nyk7Cisg
IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IFZ1bGthbk1lbW9yeUV2ZW50PiBUKiBzZXRf
dnVsa2FuX21lbW9yeV9ldmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+
KDYyKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gR3B1TG9nPiBUKiBzZXRfZ3B1
X2xvZygpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDYzKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gVnVsa2FuQXBpRXZlbnQ+IFQqIHNldF92dWxrYW5fYXBp
X2V2ZW50KCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjUpOworICB9CisK
KyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQZXJmU2FtcGxlPiBUKiBzZXRfcGVyZl9zYW1wbGUo
KSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2Nik7CisgIH0KKworICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgVCA9IENwdUluZm8+IFQqIHNldF9jcHVfaW5mbygpIHsKKyAgICByZXR1
cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDY3KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFt
ZSBUID0gU21hcHNQYWNrZXQ+IFQqIHNldF9zbWFwc19wYWNrZXQoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPig2OCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IFRyYWNpbmdTZXJ2aWNlRXZlbnQ+IFQqIHNldF9zZXJ2aWNlX2V2ZW50KCkgeworICAgIHJldHVy
biBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNjkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQgPSBJbml0aWFsRGlzcGxheVN0YXRlPiBUKiBzZXRfaW5pdGlhbF9kaXNwbGF5X3N0YXRlKCkg
eworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNzApOworICB9CisKKyAgdGVtcGxh
dGUgPHR5cGVuYW1lIFQgPSBHcHVNZW1Ub3RhbEV2ZW50PiBUKiBzZXRfZ3B1X21lbV90b3RhbF9l
dmVudCgpIHsKKyAgICByZXR1cm4gQmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDcxKTsKKyAgfQorCisg
IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gUHJvZmlsZWRGcmFtZVN5bWJvbHM+IFQqIHNldF9wcm9m
aWxlZF9mcmFtZV9zeW1ib2xzKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4o
NTUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBNb2R1bGVTeW1ib2xzPiBUKiBz
ZXRfbW9kdWxlX3N5bWJvbHMoKSB7CisgICAgcmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPig2
MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IERlb2JmdXNjYXRpb25NYXBwaW5n
PiBUKiBzZXRfZGVvYmZ1c2NhdGlvbl9tYXBwaW5nKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oNjQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFja0Rl
c2NyaXB0b3I+IFQqIHNldF90cmFja19kZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBCZWdpbk5l
c3RlZE1lc3NhZ2U8VD4oNjApOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBQcm9j
ZXNzRGVzY3JpcHRvcj4gVCogc2V0X3Byb2Nlc3NfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4g
QmVnaW5OZXN0ZWRNZXNzYWdlPFQ+KDQzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBU
ID0gVGhyZWFkRGVzY3JpcHRvcj4gVCogc2V0X3RocmVhZF9kZXNjcmlwdG9yKCkgeworICAgIHJl
dHVybiBCZWdpbk5lc3RlZE1lc3NhZ2U8VD4oNDQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQgPSBGdHJhY2VFdmVudEJ1bmRsZT4gVCogc2V0X2Z0cmFjZV9ldmVudHMoKSB7CisgICAg
cmV0dXJuIEJlZ2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCisgIHZvaWQgc2V0X3N5bmNo
cm9uaXphdGlvbl9tYXJrZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgQXBwZW5k
Qnl0ZXMoMzYsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKKyAgfQorICB2b2lkIHNldF9z
eW5jaHJvbml6YXRpb25fbWFya2VyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7
CisgICAgQXBwZW5kQnl0ZXMoMzYsIGRhdGEsIHNpemUpOworICB9CisgIHZvaWQgc2V0X2NvbXBy
ZXNzZWRfcGFja2V0cyhjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBBcHBlbmRCeXRl
cyg1MCwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOworICB9CisgIHZvaWQgc2V0X2NvbXBy
ZXNzZWRfcGFja2V0cyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFw
cGVuZEJ5dGVzKDUwLCBkYXRhLCBzaXplKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9
IFRlc3RFdmVudD4gVCogc2V0X2Zvcl90ZXN0aW5nKCkgeworICAgIHJldHVybiBCZWdpbk5lc3Rl
ZE1lc3NhZ2U8VD4oOTAwKTsKKyAgfQorCisgIHZvaWQgc2V0X3RydXN0ZWRfdWlkKGludDMyX3Qg
dmFsdWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMywgdmFsdWUpOworICB9CisgIHZvaWQgc2V0X3Ry
dXN0ZWRfcGFja2V0X3NlcXVlbmNlX2lkKHVpbnQzMl90IHZhbHVlKSB7CisgICAgQXBwZW5kVmFy
SW50KDEwLCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBJbnRlcm5lZERh
dGE+IFQqIHNldF9pbnRlcm5lZF9kYXRhKCkgeworICAgIHJldHVybiBCZWdpbk5lc3RlZE1lc3Nh
Z2U8VD4oMTIpOworICB9CisKKyAgdm9pZCBzZXRfc2VxdWVuY2VfZmxhZ3ModWludDMyX3QgdmFs
dWUpIHsKKyAgICBBcHBlbmRWYXJJbnQoMTMsIHZhbHVlKTsKKyAgfQorICB2b2lkIHNldF9pbmNy
ZW1lbnRhbF9zdGF0ZV9jbGVhcmVkKGJvb2wgdmFsdWUpIHsKKyAgICBBcHBlbmRUaW55VmFySW50
KDQxLCB2YWx1ZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBUcmFjZVBhY2tldERl
ZmF1bHRzPiBUKiBzZXRfdHJhY2VfcGFja2V0X2RlZmF1bHRzKCkgeworICAgIHJldHVybiBCZWdp
bk5lc3RlZE1lc3NhZ2U8VD4oNTkpOworICB9CisKKyAgdm9pZCBzZXRfcHJldmlvdXNfcGFja2V0
X2Ryb3BwZWQoYm9vbCB2YWx1ZSkgeworICAgIEFwcGVuZFRpbnlWYXJJbnQoNDIsIHZhbHVlKTsK
KyAgfQorfTsKKworfSAvLyBOYW1lc3BhY2UuCit9IC8vIE5hbWVzcGFjZS4KK30gLy8gTmFtZXNw
YWNlLgorI2VuZGlmICAvLyBJbmNsdWRlIGd1YXJkLgorLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2lu
IGhlYWRlcjogZ2VuL3Byb3Rvcy9wZXJmZXR0by90cmFjZS90cmFjZS5wYnplcm8uaAorLy8gQXV0
b2dlbmVyYXRlZCBieSB0aGUgUHJvdG9aZXJvIGNvbXBpbGVyIHBsdWdpbi4gRE8gTk9UIEVESVQu
CisKKyNpZm5kZWYgUEVSRkVUVE9fUFJPVE9TX1BST1RPU19QRVJGRVRUT19UUkFDRV9UUkFDRV9Q
Uk9UT19IXworI2RlZmluZSBQRVJGRVRUT19QUk9UT1NfUFJPVE9TX1BFUkZFVFRPX1RSQUNFX1RS
QUNFX1BST1RPX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4K
KworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL21lc3NhZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgiCisvLyBnZW5fYW1hbGdh
bWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rl
ci5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJv
dG96ZXJvL3Byb3RvX3V0aWxzLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2Ug
cHJvdG9zIHsKK25hbWVzcGFjZSBwYnplcm8geworCitjbGFzcyBUcmFjZVBhY2tldDsKKworY2xh
c3MgVHJhY2VfRGVjb2RlciA6IHB1YmxpYyA6OnByb3RvemVybzo6VHlwZWRQcm90b0RlY29kZXI8
LypNQVhfRklFTERfSUQ9Ki8xLCAvKkhBU19OT05QQUNLRURfUkVQRUFURURfRklFTERTPSovdHJ1
ZT4geworIHB1YmxpYzoKKyAgVHJhY2VfRGVjb2Rlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXpl
X3QgbGVuKSA6IFR5cGVkUHJvdG9EZWNvZGVyKGRhdGEsIGxlbikge30KKyAgZXhwbGljaXQgVHJh
Y2VfRGVjb2Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcmF3KSA6IFR5cGVkUHJvdG9EZWNvZGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhdy5kYXRhKCkpLCByYXcuc2l6ZSgpKSB7
fQorICBleHBsaWNpdCBUcmFjZV9EZWNvZGVyKGNvbnN0IDo6cHJvdG96ZXJvOjpDb25zdEJ5dGVz
JiByYXcpIDogVHlwZWRQcm90b0RlY29kZXIocmF3LmRhdGEsIHJhdy5zaXplKSB7fQorICBib29s
IGhhc19wYWNrZXQoKSBjb25zdCB7IHJldHVybiBhdDwxPigpLnZhbGlkKCk7IH0KKyAgOjpwcm90
b3plcm86OlJlcGVhdGVkRmllbGRJdGVyYXRvcjw6OnByb3RvemVybzo6Q29uc3RCeXRlcz4gcGFj
a2V0KCkgY29uc3QgeyByZXR1cm4gR2V0UmVwZWF0ZWQ8Ojpwcm90b3plcm86OkNvbnN0Qnl0ZXM+
KDEpOyB9Cit9OworCitjbGFzcyBUcmFjZSA6IHB1YmxpYyA6OnByb3RvemVybzo6TWVzc2FnZSB7
CisgcHVibGljOgorICB1c2luZyBEZWNvZGVyID0gVHJhY2VfRGVjb2RlcjsKKyAgZW51bSA6IGlu
dDMyX3QgeworICAgIGtQYWNrZXRGaWVsZE51bWJlciA9IDEsCisgIH07CisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUID0gVHJhY2VQYWNrZXQ+IFQqIGFkZF9wYWNrZXQoKSB7CisgICAgcmV0dXJuIEJl
Z2luTmVzdGVkTWVzc2FnZTxUPigxKTsKKyAgfQorCit9OworCit9IC8vIE5hbWVzcGFjZS4KK30g
Ly8gTmFtZXNwYWNlLgorfSAvLyBOYW1lc3BhY2UuCisjZW5kaWYgIC8vIEluY2x1ZGUgZ3VhcmQu
CisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRvL3Byb3Rv
emVyby9jb250aWd1b3VzX21lbW9yeV9yYW5nZS5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0
aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBt
YXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5z
ZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAg
ICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5s
ZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBz
b2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQg
b24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05T
IE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNl
bnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAor
ICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURF
X1BFUkZFVFRPX1BST1RPWkVST19DT05USUdVT1VTX01FTU9SWV9SQU5HRV9IXworI2RlZmluZSBJ
TkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19DT05USUdVT1VTX01FTU9SWV9SQU5HRV9IXworCisj
aW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50
Lmg+CisKK25hbWVzcGFjZSBwcm90b3plcm8geworCisvLyBLZWVwIHRoaXMgc3RydWN0IHRyaXZp
YWxseSBjb25zdHJ1Y3RpYmxlIChubyBjdG9ycywgbm8gZGVmYXVsdCBpbml0aWFsaXplcnMpLgor
c3RydWN0IENvbnRpZ3VvdXNNZW1vcnlSYW5nZSB7CisgIHVpbnQ4X3QqIGJlZ2luOworICB1aW50
OF90KiBlbmQ7ICAvLyBTVEwgc3R5bGU6IG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVm
ZmVyLgorCisgIGlubGluZSBib29sIGlzX3ZhbGlkKCkgY29uc3QgeyByZXR1cm4gYmVnaW4gIT0g
bnVsbHB0cjsgfQorICBpbmxpbmUgdm9pZCByZXNldCgpIHsgYmVnaW4gPSBudWxscHRyOyB9Cisg
IGlubGluZSBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4o
ZW5kIC0gYmVnaW4pOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKKyNlbmRp
ZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fQ09OVElHVU9VU19NRU1PUllfUkFOR0Vf
SF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vcHJv
dG96ZXJvL2NvcHlhYmxlX3B0ci5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRy
b2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hl
IExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVz
ZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlv
dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDov
L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVp
cmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQor
ICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFT
IElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0
aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRh
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRP
X1BST1RPWkVST19DT1BZQUJMRV9QVFJfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19QUk9U
T1pFUk9fQ09QWUFCTEVfUFRSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBw
cm90b3plcm8geworCisvLyBUaGlzIGNsYXNzIGlzIGVzc2VudGlhbGx5IGEgc3RkOjp2ZWN0b3I8
VD4gb2YgZml4ZWQgc2l6ZSA9IDEuCisvLyBJdCdzIGEgcG9pbnRlciB3cmFwcGVyIHdpdGggZGVl
cCBjb3B5aW5nIGFuZCBkZWVwIGVxdWFsaXR5IGNvbXBhcmlzb24uCisvLyBBdCBhbGwgZWZmZWN0
cyB0aGlzIHdyYXBwZXIgYmVoYXZlcyBsaWtlIHRoZSB1bmRlcmx5aW5nIFQsIHdpdGggdGhlIGV4
Y2VwdGlvbgorLy8gb2YgdGhlIGhlYXAgaW5kaXJlY3Rpb24uCisvLyBDb252ZXJzZWx5IHRvIGEg
c3RkOjp1bmlxdWVfcHRyLCB0aGUgcG9pbnRlciB3aWxsIGJlIGFsd2F5cyB2YWxpZCwgbmV2ZXIK
Ky8vIG51bGwuIFRoZSBwcm9ibGVtIGl0IHNvbHZlcyBpcyB0aGUgZm9sbG93aW5nOiB3aGVuIGdl
bmVyYXRpbmcgQysrIGNsYXNzZXMKKy8vIGZyb20gcHJvdG8gZmlsZXMsIHdlIHdhbnQgdG8ga2Vl
cCBlYWNoIGhlYWRlciBoZXJtZXRpYyAoaS5lLiBub3QgI2luY2x1ZGUKKy8vIGhlYWRlcnMgb2Yg
ZGVwZW5kZW50IHR5cGVzKS4gQXMgc3VjaCB3ZSBjYW4ndCBkaXJlY3RseSBpbnN0YW50aWF0ZSBU
CisvLyBmaWVsZCBtZW1iZXJzIGJ1dCB3ZSBjYW4gaW5zdGVhZCByZWx5IG9uIHBvaW50ZXJzLCBz
byBvbmx5IHRoZSAuY2MgZmlsZSBuZWVkcworLy8gdG8gc2VlIHRoZSBhY3R1YWwgZGVmaW5pdGlv
biBvZiBULiBJZiB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgd2VyZSBtb3ZlLW9ubHkgd2UKKy8vIGNv
dWxkIGp1c3QgdXNlIGEgdW5pcXVlX3B0ciB0aGVyZS4gQnV0IHRoZXkgYXJlbid0LCBoZW5jZSB0
aGlzIHdyYXBwZXIuCisvLyBDb252ZXJlc2VseSB0byB1bmlxdWVfcHRyLCB0aGlzIHdyYXBwZXI6
CisvLyAtIERlZmF1bHQgY29uc3RydWN0cyB0aGUgVCBpbnN0YW5jZSBpbiBpdHMgY29uc3RydWN0
b3IuCisvLyAtIEltcGxlbWVudHMgZGVlcCBjb21wYXJpc29uIGluIG9wZXJhdG9yPT0gaW5zdGVh
ZCBvZiBwb2ludGVyIGNvbXBhcmlzb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIENv
cHlhYmxlUHRyIHsKKyBwdWJsaWM6CisgIENvcHlhYmxlUHRyKCkgOiBwdHJfKG5ldyBUKCkpIHt9
CisgIH5Db3B5YWJsZVB0cigpID0gZGVmYXVsdDsKKworICAvLyBDb3B5IG9wZXJhdG9ycy4KKyAg
Q29weWFibGVQdHIoY29uc3QgQ29weWFibGVQdHImIG90aGVyKSA6IHB0cl8obmV3IFQoKm90aGVy
LnB0cl8pKSB7fQorICBDb3B5YWJsZVB0ciYgb3BlcmF0b3I9KGNvbnN0IENvcHlhYmxlUHRyJiBv
dGhlcikgeworICAgICpwdHJfID0gKm90aGVyLnB0cl87CisgICAgcmV0dXJuICp0aGlzOworICB9
CisKKyAgLy8gTW92ZSBvcGVyYXRvcnMuCisgIENvcHlhYmxlUHRyKENvcHlhYmxlUHRyJiYgb3Ro
ZXIpIG5vZXhjZXB0IDogcHRyXyhzdGQ6Om1vdmUob3RoZXIucHRyXykpIHsKKyAgICBvdGhlci5w
dHJfLnJlc2V0KG5ldyBUKCkpOworICB9CisKKyAgQ29weWFibGVQdHImIG9wZXJhdG9yPShDb3B5
YWJsZVB0ciYmIG90aGVyKSB7CisgICAgcHRyXyA9IHN0ZDo6bW92ZShvdGhlci5wdHJfKTsKKyAg
ICBvdGhlci5wdHJfLnJlc2V0KG5ldyBUKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisg
IFQqIGdldCgpIHsgcmV0dXJuIHB0cl8uZ2V0KCk7IH0KKyAgY29uc3QgVCogZ2V0KCkgY29uc3Qg
eyByZXR1cm4gcHRyXy5nZXQoKTsgfQorCisgIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBwdHJf
LmdldCgpOyB9CisgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBwdHJfLmdl
dCgpOyB9CisKKyAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnB0cl87IH0KKyAgY29uc3QgVCYg
b3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnB0cl87IH0KKworICBmcmllbmQgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IENvcHlhYmxlUHRyJiBsaHMsIGNvbnN0IENvcHlhYmxlUHRyJiByaHMpIHsK
KyAgICByZXR1cm4gKmxocyA9PSAqcmhzOworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBDb3B5YWJsZVB0ciYgbGhzLCBjb25zdCBDb3B5YWJsZVB0ciYgcmhzKSB7CisgICAg
Ly8gSW4gdGhlb3J5IHRoZSB1bmRlcmx5aW5nIHR5cGUgbWlnaHQgaGF2ZSBhIHNwZWNpYWwgb3Bl
cmF0b3IhPQorICAgIC8vIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIG5vdCBqdXN0ICEoeCA9PSB5
KS4gUmVzcGVjdCB0aGF0LgorICAgIHJldHVybiAqbGhzICE9ICpyaHM7CisgIH0KKworIHByaXZh
dGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwdHJfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHBy
b3RvemVybworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX0NPUFlBQkxF
X1BUUl9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0
by9wcm90b3plcm8vY3BwX21lc3NhZ2Vfb2JqLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkg
VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRo
ZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1h
eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl
LgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAg
ICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxl
c3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNv
ZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBv
biBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMg
T0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vu
c2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisg
KiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOQ0xVREVf
UEVSRkVUVE9fUFJPVE9aRVJPX0NQUF9NRVNTQUdFX09CSl9IXworI2RlZmluZSBJTkNMVURFX1BF
UkZFVFRPX1BST1RPWkVST19DUFBfTUVTU0FHRV9PQkpfSF8KKworI2luY2x1ZGUgPHN0ZGludC5o
PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIKKworbmFt
ZXNwYWNlIHByb3RvemVybyB7CisKKy8vIEJhc2UgY2xhc3MgZm9yIGdlbmVyYXRlZCAuZ2VuLmgg
Y2xhc3Nlcywgd2hpY2ggYXJlIGZ1bGwgQysrIG9iamVjdHMgdGhhdAorLy8gc3VwcG9ydCBib3Ro
IHNlciBhbmQgZGVzZXJpYWxpemF0aW9uIChidXQgYXJlIG5vdCB6ZXJvLWNvcHkpLgorLy8gVGhp
cyBpcyBvbmx5IHVzZWQgYnkgdGhlICJjcHAiIHRhcmdldHMgbm90IHRoZSAicGJ6ZXJvIiBvbmVz
LgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIENwcE1lc3NhZ2VPYmogeworIHB1YmxpYzoKKyAgdmly
dHVhbCB+Q3BwTWVzc2FnZU9iaigpOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZUFz
U3RyaW5nKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFNlcmlh
bGl6ZUFzQXJyYXkoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBQYXJzZUZyb21BcnJheShj
b25zdCB2b2lkKiwgc2l6ZV90KSA9IDA7CisKKyAgYm9vbCBQYXJzZUZyb21TdHJpbmcoY29uc3Qg
c3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBQYXJzZUZyb21BcnJheShzdHIuZGF0YSgp
LCBzdHIuc2l6ZSgpKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvemVybworCisj
ZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX0NQUF9NRVNTQUdFX09CSl9IXwor
Ly8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90b3pl
cm8vZmllbGQuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNv
dXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBW
ZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxl
IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFp
biBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hl
Lm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBs
aWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMs
CisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVy
IGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmlj
IGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVy
IHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9f
RklFTERfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fRklFTERfSF8KKwor
I2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rv
cj4KKworLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFz
ZS9sb2dnaW5nLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJm
ZXR0by9wcm90b3plcm8vY29udGlndW91c19tZW1vcnlfcmFuZ2UuaCIKKy8vIGdlbl9hbWFsZ2Ft
YXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5o
IgorCituYW1lc3BhY2UgcHJvdG96ZXJvIHsKKworc3RydWN0IENvbnN0Qnl0ZXMgeworICBzdGQ6
OnN0cmluZyBUb1N0ZFN0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcocmVp
bnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpOworICB9CisKKyAgY29uc3Qg
dWludDhfdCogZGF0YTsKKyAgc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgQ29uc3RDaGFycyB7
CisgIC8vIEFsbG93IGltcGxpY2l0IGNvbnZlcnNpb24gdG8gcGVyZmV0dG8ncyBiYXNlOjpTdHJp
bmdWaWV3IHdpdGhvdXQgZGVwZW5kaW5nCisgIC8vIG9uIHBlcmZldHRvL2Jhc2Ugb3IgdmljZXZl
cnNhLgorICBzdGF0aWMgY29uc3RleHByIGJvb2wga0NvbnZlcnRpYmxlVG9TdHJpbmdWaWV3ID0g
dHJ1ZTsKKyAgc3RkOjpzdHJpbmcgVG9TdGRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdGQ6OnN0
cmluZyhkYXRhLCBzaXplKTsgfQorCisgIGNvbnN0IGNoYXIqIGRhdGE7CisgIHNpemVfdCBzaXpl
OworfTsKKworLy8gQSBwcm90b2J1ZiBmaWVsZCBkZWNvZGVkIGJ5IHRoZSBwcm90b3plcm8gcHJv
dG8gZGVjb2RlcnMuIEl0IGV4cG9zZXMKKy8vIGNvbnZlbmllbmNlIGFjY2Vzc29ycyB3aXRoIG1p
bmltYWwgZGVidWcgY2hlY2tzLgorLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGJvdGggYnkgdGhlIGl0
ZXJhdG9yLWJhc2VkIFByb3RvRGVjb2RlciBhbmQgYnkgdGhlCisvLyBvbmUtc2hvdCBUeXBlZFBy
b3RvRGVjb2Rlci4KKy8vIElmIHRoZSBmaWVsZCBpcyBub3QgdmFsaWQgdGhlIGFjY2Vzc29ycyBj
b25zaXN0ZW50bHkgcmV0dXJuIHplcm8taW50ZWdlcnMgb3IKKy8vIG51bGwgc3RyaW5ncy4KK2Ns
YXNzIEZpZWxkIHsKKyBwdWJsaWM6CisgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiBpZF8g
IT0gMDsgfQorICB1aW50MTZfdCBpZCgpIGNvbnN0IHsgcmV0dXJuIGlkXzsgfQorICBleHBsaWNp
dCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gdmFsaWQoKTsgfQorCisgIHByb3RvX3V0
aWxzOjpQcm90b1dpcmVUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgYXV0byByZXMgPSBzdGF0aWNf
Y2FzdDxwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZT4odHlwZV8pOworICAgIFBFUkZFVFRPX0RD
SEVDSyhyZXMgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQgfHwKKyAgICAg
ICAgICAgICAgICAgICAgcmVzID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprTGVuZ3Ro
RGVsaW1pdGVkIHx8CisgICAgICAgICAgICAgICAgICAgIHJlcyA9PSBwcm90b191dGlsczo6UHJv
dG9XaXJlVHlwZTo6a0ZpeGVkMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgcmVzID09IHByb3Rv
X3V0aWxzOjpQcm90b1dpcmVUeXBlOjprRml4ZWQ2NCk7CisgICAgcmV0dXJuIHJlczsKKyAgfQor
CisgIGJvb2wgYXNfYm9vbCgpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkg
fHwgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50KTsKKyAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oaW50X3ZhbHVlXyk7CisgIH0KKworICB1aW50MzJfdCBh
c191aW50MzIoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgpIHx8IHR5cGUo
KSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCB8fAorICAgICAgICAgICAg
ICAgICAgICB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtGaXhlZDMyKTsK
KyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGludF92YWx1ZV8pOworICB9CisKKyAg
aW50MzJfdCBhc19pbnQzMigpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkg
fHwgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprVmFySW50IHx8CisgICAg
ICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0Zp
eGVkMzIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihpbnRfdmFsdWVfKTsKKyAg
fQorCisgIGludDMyX3QgYXNfc2ludDMyKCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RDSEVDSygh
dmFsaWQoKSB8fCB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtWYXJJbnQp
OworICAgIHJldHVybiBwcm90b191dGlsczo6WmlnWmFnRGVjb2RlKHN0YXRpY19jYXN0PHVpbnQz
Ml90PihpbnRfdmFsdWVfKSk7CisgIH0KKworICB1aW50NjRfdCBhc191aW50NjQoKSBjb25zdCB7
CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgpIHx8IHR5cGUoKSA9PSBwcm90b191dGlsczo6
UHJvdG9XaXJlVHlwZTo6a1ZhckludCB8fAorICAgICAgICAgICAgICAgICAgICB0eXBlKCkgPT0g
cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtGaXhlZDMyIHx8CisgICAgICAgICAgICAgICAg
ICAgIHR5cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0ZpeGVkNjQpOworICAg
IHJldHVybiBpbnRfdmFsdWVfOworICB9CisKKyAgaW50NjRfdCBhc19pbnQ2NCgpIGNvbnN0IHsK
KyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQ
cm90b1dpcmVUeXBlOjprVmFySW50IHx8CisgICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBw
cm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIgfHwKKyAgICAgICAgICAgICAgICAg
ICAgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprRml4ZWQ2NCk7CisgICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGludF92YWx1ZV8pOworICB9CisKKyAgaW50NjRf
dCBhc19zaW50NjQoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENIRUNLKCF2YWxpZCgpIHx8IHR5
cGUoKSA9PSBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZTo6a1ZhckludCk7CisgICAgcmV0dXJu
IHByb3RvX3V0aWxzOjpaaWdaYWdEZWNvZGUoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGludF92YWx1
ZV8pKTsKKyAgfQorCisgIGZsb2F0IGFzX2Zsb2F0KCkgY29uc3QgeworICAgIFBFUkZFVFRPX0RD
SEVDSyghdmFsaWQoKSB8fCB0eXBlKCkgPT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtG
aXhlZDMyKTsKKyAgICBmbG9hdCByZXM7CisgICAgdWludDMyX3QgdmFsdWUzMiA9IHN0YXRpY19j
YXN0PHVpbnQzMl90PihpbnRfdmFsdWVfKTsKKyAgICBtZW1jcHkoJnJlcywgJnZhbHVlMzIsIHNp
emVvZihyZXMpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgZG91YmxlIGFzX2RvdWJsZSgp
IGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwgdHlwZSgpID09IHByb3Rv
X3V0aWxzOjpQcm90b1dpcmVUeXBlOjprRml4ZWQ2NCk7CisgICAgZG91YmxlIHJlczsKKyAgICBt
ZW1jcHkoJnJlcywgJmludF92YWx1ZV8sIHNpemVvZihyZXMpKTsKKyAgICByZXR1cm4gcmVzOwor
ICB9CisKKyAgQ29uc3RDaGFycyBhc19zdHJpbmcoKSBjb25zdCB7CisgICAgUEVSRkVUVE9fRENI
RUNLKCF2YWxpZCgpIHx8CisgICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBwcm90b191dGls
czo6UHJvdG9XaXJlVHlwZTo6a0xlbmd0aERlbGltaXRlZCk7CisgICAgcmV0dXJuIENvbnN0Q2hh
cnN7cmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSgpKSwgc2l6ZV99OworICB9CisK
KyAgc3RkOjpzdHJpbmcgYXNfc3RkX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGFzX3N0cmluZygp
LlRvU3RkU3RyaW5nKCk7IH0KKworICBDb25zdEJ5dGVzIGFzX2J5dGVzKCkgY29uc3QgeworICAg
IFBFUkZFVFRPX0RDSEVDSyghdmFsaWQoKSB8fAorICAgICAgICAgICAgICAgICAgICB0eXBlKCkg
PT0gcHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU6OmtMZW5ndGhEZWxpbWl0ZWQpOworICAgIHJl
dHVybiBDb25zdEJ5dGVze2RhdGEoKSwgc2l6ZV99OworICB9CisKKyAgY29uc3QgdWludDhfdCog
ZGF0YSgpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0soIXZhbGlkKCkgfHwKKyAgICAgICAg
ICAgICAgICAgICAgdHlwZSgpID09IHByb3RvX3V0aWxzOjpQcm90b1dpcmVUeXBlOjprTGVuZ3Ro
RGVsaW1pdGVkKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4o
aW50X3ZhbHVlXyk7CisgIH0KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICBQRVJGRVRU
T19EQ0hFQ0soIXZhbGlkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09IHByb3Rv
X3V0aWxzOjpQcm90b1dpcmVUeXBlOjprTGVuZ3RoRGVsaW1pdGVkKTsKKyAgICByZXR1cm4gc2l6
ZV87CisgIH0KKworICB1aW50NjRfdCByYXdfaW50X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gaW50
X3ZhbHVlXzsgfQorCisgIHZvaWQgaW5pdGlhbGl6ZSh1aW50MTZfdCBpZCwKKyAgICAgICAgICAg
ICAgICAgIHVpbnQ4X3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGludF92YWx1
ZSwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpIHsKKyAgICBpZF8gPSBpZDsKKyAg
ICB0eXBlXyA9IHR5cGU7CisgICAgaW50X3ZhbHVlXyA9IGludF92YWx1ZTsKKyAgICBzaXplXyA9
IHNpemU7CisgIH0KKworICAvLyBGb3IgdXNlIHdpdGggdGVtcGxhdGVzLiBUaGlzIGlzIHVzZWQg
YnkgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yOjpvcGVyYXRvciooKS4KKyAgdm9pZCBnZXQoYm9vbCog
dmFsKSBjb25zdCB7ICp2YWwgPSBhc19ib29sKCk7IH0KKyAgdm9pZCBnZXQodWludDMyX3QqIHZh
bCkgY29uc3QgeyAqdmFsID0gYXNfdWludDMyKCk7IH0KKyAgdm9pZCBnZXQoaW50MzJfdCogdmFs
KSBjb25zdCB7ICp2YWwgPSBhc19pbnQzMigpOyB9CisgIHZvaWQgZ2V0KHVpbnQ2NF90KiB2YWwp
IGNvbnN0IHsgKnZhbCA9IGFzX3VpbnQ2NCgpOyB9CisgIHZvaWQgZ2V0KGludDY0X3QqIHZhbCkg
Y29uc3QgeyAqdmFsID0gYXNfaW50NjQoKTsgfQorICB2b2lkIGdldChmbG9hdCogdmFsKSBjb25z
dCB7ICp2YWwgPSBhc19mbG9hdCgpOyB9CisgIHZvaWQgZ2V0KGRvdWJsZSogdmFsKSBjb25zdCB7
ICp2YWwgPSBhc19kb3VibGUoKTsgfQorICB2b2lkIGdldChzdGQ6OnN0cmluZyogdmFsKSBjb25z
dCB7ICp2YWwgPSBhc19zdGRfc3RyaW5nKCk7IH0KKyAgdm9pZCBnZXQoQ29uc3RDaGFycyogdmFs
KSBjb25zdCB7ICp2YWwgPSBhc19zdHJpbmcoKTsgfQorICB2b2lkIGdldChDb25zdEJ5dGVzKiB2
YWwpIGNvbnN0IHsgKnZhbCA9IGFzX2J5dGVzKCk7IH0KKyAgdm9pZCBnZXRfc2lnbmVkKGludDMy
X3QqIHZhbCkgY29uc3QgeyAqdmFsID0gYXNfc2ludDMyKCk7IH0KKyAgdm9pZCBnZXRfc2lnbmVk
KGludDY0X3QqIHZhbCkgY29uc3QgeyAqdmFsID0gYXNfc2ludDY0KCk7IH0KKworICAvLyBGb3Ig
ZW51bSB0eXBlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsCisgICAgICAgICAgICB0eXBlbmFt
ZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUsIFQ+Ojp0
eXBlPgorICB2b2lkIGdldChUKiB2YWwpIGNvbnN0IHsKKyAgICAqdmFsID0gc3RhdGljX2Nhc3Q8
VD4oYXNfaW50MzIoKSk7CisgIH0KKworICAvLyBTZXJpYWxpemVzIHRoZSBmaWVsZCBiYWNrIGlu
dG8gYSBwcm90by1lbmNvZGVkIGJ5dGUgc3RyZWFtIGFuZCBhcHBlbmRzIGl0CisgIC8vIHRvIHxk
c3R8LiB8ZHN0fCBpcyByZXNpemVkIGFjY29yZGluZ2x5LgorICB2b2lkIFNlcmlhbGl6ZUFuZEFw
cGVuZFRvKHN0ZDo6c3RyaW5nKiBkc3QpIGNvbnN0OworCisgIC8vIFNlcmlhbGl6ZXMgdGhlIGZp
ZWxkIGJhY2sgaW50byBhIHByb3RvLWVuY29kZWQgYnl0ZSBzdHJlYW0gYW5kIGFwcGVuZHMgaXQK
KyAgLy8gdG8gfGRzdHwuIHxkc3R8IGlzIHJlc2l6ZWQgYWNjb3JkaW5nbHkuCisgIHZvaWQgU2Vy
aWFsaXplQW5kQXBwZW5kVG8oc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRzdCkgY29uc3Q7CisKKyBw
cml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIFNlcmlhbGl6
ZUFuZEFwcGVuZFRvSW50ZXJuYWwoQ29udGFpbmVyKiBkc3QpIGNvbnN0OworCisgIC8vIEZpZWxk
cyBhcmUgZGVsaWJlcmF0ZWx5IG5vdCBpbml0aWFsaXplZCB0byBrZWVwIHRoZSBjbGFzcyB0cml2
aWFsbHkKKyAgLy8gY29uc3RydWN0aWJsZS4gSXQgbWFrZXMgYSBsYXJnZSBwZXJmIGRpZmZlcmVu
Y2UgZm9yIFByb3RvRGVjb2Rlci4KKworICB1aW50NjRfdCBpbnRfdmFsdWVfOyAgLy8gSW4ga0xl
bmd0aERlbGltaXRlZCB0aGlzIGNvbnRhaW5zIHRoZSBkYXRhKCkgYWRkci4KKyAgdWludDMyX3Qg
c2l6ZV87ICAgICAgIC8vIE9ubHkgdmFsaWQgd2hlbiB3aGVuIHR5cGUgPT0ga0xlbmd0aERlbGlt
aXRlZC4KKyAgdWludDE2X3QgaWRfOyAgICAgICAgIC8vIFByb3RvIGZpZWxkIG9yZGluYWwuCisg
IHVpbnQ4X3QgdHlwZV87ICAgICAgICAvLyBwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZS4KK307
CisKKy8vIFRoZSBGaWVsZCBzdHJ1Y3QgaXMgdXNlZCBpbiBhIGxvdCBvZiBwZXJmLXNlbnNpdGl2
ZSBjb250ZXh0cy4KK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEZpZWxkKSA9PSAxNiwgIkZpZWxkIHN0
cnVjdCB0b28gYmlnIik7CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlmICAv
LyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19GSUVMRF9IXworLy8gZ2VuX2FtYWxnYW1hdGVk
IGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oCisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAq
CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg
IkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs
aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg
TGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJ
Q0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFn
cmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp
Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FS
UkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBs
aWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu
aW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisg
Ki8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19NRVNTQUdFX0hfCisjZGVm
aW5lIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX01FU1NBR0VfSF8KKworI2luY2x1ZGUgPGFz
c2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5j
bHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvLyBnZW5fYW1hbGdhbWF0
ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorLy8gZ2VuX2Ft
YWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisv
LyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8v
Y29udGlndW91c19tZW1vcnlfcmFuZ2UuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDog
I2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9wcm90b191dGlscy5oIgorLy8gZ2VuX2FtYWxn
YW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9z
dHJlYW1fd3JpdGVyLmgiCisKK25hbWVzcGFjZSBwZXJmZXR0byB7CituYW1lc3BhY2Ugc2htX2Z1
enogeworY2xhc3MgRmFrZVByb2R1Y2VyOworfSAgLy8gbmFtZXNwYWNlIHNobV9mdXp6Cit9ICAv
LyBuYW1lc3BhY2UgcGVyZmV0dG8KKworbmFtZXNwYWNlIHByb3RvemVybyB7CisKK2NsYXNzIE1l
c3NhZ2VIYW5kbGVCYXNlOworCisvLyBCYXNlIGNsYXNzIGV4dGVuZGVkIGJ5IHRoZSBwcm90byBD
Kysgc3R1YnMgZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b1plcm8KKy8vIGNvbXBpbGVyLiBUaGlzIGNs
YXNzIHByb3ZpZGVzIHRoZSBtaW5pbWFsIHJ1bnRpbWUgcmVxdWlyZWQgdG8gc3VwcG9ydAorLy8g
YXBwZW5kLW9ubHkgb3BlcmF0aW9ucyBhbmQgaXMgZGVzaWduZWQgZm9yIHBlcmZvcm1hbmNlLiBO
b25lIG9mIHRoZSBtZXRob2RzCisvLyByZXF1aXJlIGFueSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0
aW9uLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIE1lc3NhZ2UgeworIHB1YmxpYzoKKyAgZnJpZW5k
IGNsYXNzIE1lc3NhZ2VIYW5kbGVCYXNlOworCisgIC8vIEFkanVzdCB0aGUgfG5lc3RlZF9tZXNz
YWdlc19hcmVuYV98IHNpemUgd2hlbiBjaGFuZ2luZyB0aGlzLCBvciB0aGUKKyAgLy8gc3RhdGlj
X2Fzc2VydCBpbiB0aGUgLmNjIGZpbGUgd2lsbCBiYXJrLgorICBzdGF0aWMgY29uc3RleHByIHVp
bnQzMl90IGtNYXhOZXN0aW5nRGVwdGggPSAxMDsKKworICAvLyBDdG9yIGFuZCBEdG9yIG9mIE1l
c3NhZ2UgYXJlIG5ldmVyIGNhbGxlZCwgd2l0aCB0aGUgZXhlY2VwdGlvbgorICAvLyBvZiByb290
IChub24tbmVzdGVkKSBtZXNzYWdlcy4gTmVzdGVkIG1lc3NhZ2VzIGFyZSBhbGxvY2F0ZWQgdmlh
IHBsYWNlbWVudAorICAvLyBuZXcgaW4gdGhlIHxuZXN0ZWRfbWVzc2FnZXNfYXJlbmFffCBhbmQg
aW1wbGljdGx5IGRlc3Ryb3llZCB3aGVuIHRoZSBhcmVuYQorICAvLyBvZiB0aGUgcm9vdCBtZXNz
YWdlIGdvZXMgYXdheS4gVGhpcyBpcyBmaW5lIGFzIGxvbmcgYXMgYWxsIHRoZSBmaWVsZHMgYXJl
CisgIC8vIFBPRHMsIHdoaWNoIGlzIGNoZWNrZWQgYnkgdGhlIHN0YXRpY19hc3NlcnQgaW4gdGhl
IGN0b3IgKHNlZSB0aGUgUmVzZXQoKQorICAvLyBtZXRob2QgaW4gdGhlIC5jYyBmaWxlKS4KKyAg
TWVzc2FnZSgpID0gZGVmYXVsdDsKKworICAvLyBDbGVhcnMgdXAgdGhlIHN0YXRlLCBhbGxvd2lu
ZyB0aGUgbWVzc2FnZSB0byBiZSByZXVzZWQgYXMgYSBmcmVzaCBvbmUuCisgIHZvaWQgUmVzZXQo
U2NhdHRlcmVkU3RyZWFtV3JpdGVyKik7CisKKyAgLy8gQ29tbWl0cyBhbGwgdGhlIGNoYW5nZXMg
dG8gdGhlIGJ1ZmZlciAoYmFja2ZpbGxzIHRoZSBzaXplIGZpZWxkIG9mIHRoaXMgYW5kCisgIC8v
IGFsbCBuZXN0ZWQgbWVzc2FnZXMpIGFuZCBzZWFscyB0aGUgbWVzc2FnZS4gUmV0dXJucyB0aGUg
c2l6ZSBvZiB0aGUgbWVzc2FnZQorICAvLyAoYW5kIGFsbCBuZXN0ZWQgc3ViLW1lc3NhZ2VzKSwg
d2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IGFueSBjaHVua2luZy4KKyAgLy8gRmluYWxpemUg
aXMgaWRlbXBvdGVudCBhbmQgY2FuIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHcvbyBzaWRlIGVm
ZmVjdHMuCisgIHVpbnQzMl90IEZpbmFsaXplKCk7CisKKyAgLy8gT3B0aW9uYWwuIElmIGlzX3Zh
bGlkKCkgPT0gdHJ1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IHJlZ2lvbiAoaXRzCisgIC8v
IGxlbmd0aCA9PSBwcm90b191dGlsczo6a01lc3NhZ2VMZW5ndGhGaWVsZFNpemUpIGlzIGJhY2tm
aWxsZWQgd2l0aCB0aGUgc2l6ZQorICAvLyBvZiB0aGlzIG1lc3NhZ2UgKG1pbnVzIHxzaXplX2Fs
cmVhZHlfd3JpdHRlbnwgYmVsb3cpLiBUaGlzIGlzIHRoZSBtZWNoYW5pc20KKyAgLy8gdXNlZCBi
eSBtZXNzYWdlcyB0byBiYWNrZmlsbCB0aGVpciBjb3JyZXNwb25kaW5nIHNpemUgZmllbGQgaW4g
dGhlIHBhcmVudAorICAvLyBtZXNzYWdlLgorICB1aW50OF90KiBzaXplX2ZpZWxkKCkgY29uc3Qg
eyByZXR1cm4gc2l6ZV9maWVsZF87IH0KKyAgdm9pZCBzZXRfc2l6ZV9maWVsZCh1aW50OF90KiBz
aXplX2ZpZWxkKSB7IHNpemVfZmllbGRfID0gc2l6ZV9maWVsZDsgfQorCisgIC8vIFRoaXMgaXMg
dG8gZGVhbCB3aXRoIGNhc2Ugb2YgYmFja2ZpbGxpbmcgdGhlIHNpemUgb2YgYSByb290IChub24t
bmVzdGVkKQorICAvLyBtZXNzYWdlIHdoaWNoIGlzIHNwbGl0IGludG8gbXVsdGlwbGUgY2h1bmtz
LiBVcG9uIGZpbmFsaXphdGlvbiBvbmx5IHRoZQorICAvLyBwYXJ0aWFsIHNpemUgdGhhdCBsaWVz
IGluIHRoZSBsYXN0IGNodW5rIGhhcyB0byBiZSBiYWNrZmlsbGVkLgorICB2b2lkIGluY19zaXpl
X2FscmVhZHlfd3JpdHRlbih1aW50MzJfdCBzeikgeyBzaXplX2FscmVhZHlfd3JpdHRlbl8gKz0g
c3o7IH0KKworICBNZXNzYWdlKiBuZXN0ZWRfbWVzc2FnZSgpIHsgcmV0dXJuIG5lc3RlZF9tZXNz
YWdlXzsgfQorCisgIGJvb2wgaXNfZmluYWxpemVkKCkgY29uc3QgeyByZXR1cm4gZmluYWxpemVk
XzsgfQorCisjaWYgUEVSRkVUVE9fRENIRUNLX0lTX09OKCkKKyAgdm9pZCBzZXRfaGFuZGxlKE1l
c3NhZ2VIYW5kbGVCYXNlKiBoYW5kbGUpIHsgaGFuZGxlXyA9IGhhbmRsZTsgfQorI2VuZGlmCisK
KyAgLy8gUHJvdG8gdHlwZXM6IHVpbnQ2NCwgdWludDMyLCBpbnQ2NCwgaW50MzIsIGJvb2wsIGVu
dW0uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIEFwcGVuZFZhckludCh1aW50MzJf
dCBmaWVsZF9pZCwgVCB2YWx1ZSkgeworICAgIGlmIChuZXN0ZWRfbWVzc2FnZV8pCisgICAgICBF
bmROZXN0ZWRNZXNzYWdlKCk7CisKKyAgICB1aW50OF90IGJ1ZmZlcltwcm90b191dGlsczo6a01h
eFNpbXBsZUZpZWxkRW5jb2RlZFNpemVdOworICAgIHVpbnQ4X3QqIHBvcyA9IGJ1ZmZlcjsKKwor
ICAgIHBvcyA9IHByb3RvX3V0aWxzOjpXcml0ZVZhckludChwcm90b191dGlsczo6TWFrZVRhZ1Zh
ckludChmaWVsZF9pZCksIHBvcyk7CisgICAgLy8gV3JpdGVWYXJJbnQgZW5jb2RlcyBzaWduZWQg
dmFsdWVzIGluIHR3bydzIGNvbXBsZW1lbnQgZm9ybS4KKyAgICBwb3MgPSBwcm90b191dGlsczo6
V3JpdGVWYXJJbnQodmFsdWUsIHBvcyk7CisgICAgV3JpdGVUb1N0cmVhbShidWZmZXIsIHBvcyk7
CisgIH0KKworICAvLyBQcm90byB0eXBlczogc2ludDY0LCBzaW50MzIuCisgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUPgorICB2b2lkIEFwcGVuZFNpZ25lZFZhckludCh1aW50MzJfdCBmaWVsZF9pZCwg
VCB2YWx1ZSkgeworICAgIEFwcGVuZFZhckludChmaWVsZF9pZCwgcHJvdG9fdXRpbHM6OlppZ1ph
Z0VuY29kZSh2YWx1ZSkpOworICB9CisKKyAgLy8gUHJvdG8gdHlwZXM6IGJvb2wsIGVudW0gKHNt
YWxsKS4KKyAgLy8gRmFzdGVyIHZlcnNpb24gb2YgQXBwZW5kVmFySW50IGZvciB0aW55IG51bWJl
cnMuCisgIHZvaWQgQXBwZW5kVGlueVZhckludCh1aW50MzJfdCBmaWVsZF9pZCwgaW50MzJfdCB2
YWx1ZSkgeworICAgIFBFUkZFVFRPX0RDSEVDSygwIDw9IHZhbHVlICYmIHZhbHVlIDwgMHg4MCk7
CisgICAgaWYgKG5lc3RlZF9tZXNzYWdlXykKKyAgICAgIEVuZE5lc3RlZE1lc3NhZ2UoKTsKKwor
ICAgIHVpbnQ4X3QgYnVmZmVyW3Byb3RvX3V0aWxzOjprTWF4U2ltcGxlRmllbGRFbmNvZGVkU2l6
ZV07CisgICAgdWludDhfdCogcG9zID0gYnVmZmVyOworICAgIC8vIE1ha2VUYWdWYXJJbnQgZ2V0
cyBzdXBlciBvcHRpbWl6ZWQgaGVyZSBmb3IgY29uc3RleHByLgorICAgIHBvcyA9IHByb3RvX3V0
aWxzOjpXcml0ZVZhckludChwcm90b191dGlsczo6TWFrZVRhZ1ZhckludChmaWVsZF9pZCksIHBv
cyk7CisgICAgKnBvcysrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUpOworICAgIFdyaXRl
VG9TdHJlYW0oYnVmZmVyLCBwb3MpOworICB9CisKKyAgLy8gUHJvdG8gdHlwZXM6IGZpeGVkNjQs
IHNmaXhlZDY0LCBmaXhlZDMyLCBzZml4ZWQzMiwgZG91YmxlLCBmbG9hdC4KKyAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQ+CisgIHZvaWQgQXBwZW5kRml4ZWQodWludDMyX3QgZmllbGRfaWQsIFQgdmFs
dWUpIHsKKyAgICBpZiAobmVzdGVkX21lc3NhZ2VfKQorICAgICAgRW5kTmVzdGVkTWVzc2FnZSgp
OworCisgICAgdWludDhfdCBidWZmZXJbcHJvdG9fdXRpbHM6OmtNYXhTaW1wbGVGaWVsZEVuY29k
ZWRTaXplXTsKKyAgICB1aW50OF90KiBwb3MgPSBidWZmZXI7CisKKyAgICBwb3MgPSBwcm90b191
dGlsczo6V3JpdGVWYXJJbnQocHJvdG9fdXRpbHM6Ok1ha2VUYWdGaXhlZDxUPihmaWVsZF9pZCks
IHBvcyk7CisgICAgbWVtY3B5KHBvcywgJnZhbHVlLCBzaXplb2YoVCkpOworICAgIHBvcyArPSBz
aXplb2YoVCk7CisgICAgLy8gVE9ETzogT3B0aW1pemUgbWVtY3B5IHBlcmZvcm1hbmNlLCBzZWUg
aHR0cDovL2NyYnVnLmNvbS82MjQzMTEgLgorICAgIFdyaXRlVG9TdHJlYW0oYnVmZmVyLCBwb3Mp
OworICB9CisKKyAgdm9pZCBBcHBlbmRTdHJpbmcodWludDMyX3QgZmllbGRfaWQsIGNvbnN0IGNo
YXIqIHN0cik7CisKKyAgdm9pZCBBcHBlbmRTdHJpbmcodWludDMyX3QgZmllbGRfaWQsIGNvbnN0
IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBBcHBlbmRCeXRlcyhmaWVsZF9pZCwgc3RyLmRhdGEo
KSwgc3RyLnNpemUoKSk7CisgIH0KKworICB2b2lkIEFwcGVuZEJ5dGVzKHVpbnQzMl90IGZpZWxk
X2lkLCBjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworCisgIC8vIEFwcGVuZCByYXcg
Ynl0ZXMgZm9yIGEgZmllbGQsIHVzaW5nIHRoZSBzdXBwbGllZCB8cmFuZ2VzfCB0bworICAvLyBj
b3B5IGZyb20gfG51bV9yYW5nZXN8IGluZGl2aWR1YWwgYnVmZmVycy4KKyAgc2l6ZV90IEFwcGVu
ZFNjYXR0ZXJlZEJ5dGVzKHVpbnQzMl90IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgQ29udGlndW91c01lbW9yeVJhbmdlKiByYW5nZXMsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzaXplX3QgbnVtX3Jhbmdlcyk7CisKKyAgLy8gQmVnaW5zIGEgbmVzdGVk
IG1lc3NhZ2UsIHVzaW5nIHRoZSBzdGF0aWMgc3RvcmFnZSBwcm92aWRlZCBieSB0aGUgcGFyZW50
CisgIC8vIGNsYXNzIChzZWUgY29tbWVudCBpbiB8bmVzdGVkX21lc3NhZ2VzX2FyZW5hX3wpLiBU
aGUgbmVzdGVkIG1lc3NhZ2UgZW5kcworICAvLyBlaXRoZXIgd2hlbiBGaW5hbGl6ZSgpIGlzIGNh
bGxlZCBvciB3aGVuIGFueSBvdGhlciBBcHBlbmQqIG1ldGhvZCBpcyBjYWxsZWQKKyAgLy8gaW4g
dGhlIHBhcmVudCBjbGFzcy4KKyAgLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IFQgaXMgc3VwcG9z
ZWQgdG8gYmUgYSBzdHViIGNsYXNzIGF1dG8gZ2VuZXJhdGVkIGZyb20KKyAgLy8gYSAucHJvdG8s
IGhlbmNlIGEgc3ViY2xhc3Mgb2YgTWVzc2FnZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIFQq
IEJlZ2luTmVzdGVkTWVzc2FnZSh1aW50MzJfdCBmaWVsZF9pZCkgeworICAgIC8vIFRoaXMgaXMg
dG8gcHJldmVudCBzdWJjbGFzc2VzICh3aGljaCBzaG91bGQgYmUgYXV0b2dlbmVyYXRlZCwgdGhv
dWdoKSwgdG8KKyAgICAvLyBpbnRyb2R1Y2UgZXh0cmEgc3RhdGUgZmllbGRzICh3aGljaCB3b3Vs
ZG4ndCBiZSBpbml0aWFsaXplZCBieSBSZXNldCgpKS4KKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6
aXNfYmFzZV9vZjxNZXNzYWdlLCBUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiVCBtdXN0
IGJlIGEgc3ViY2xhc3Mgb2YgTWVzc2FnZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQp
ID09IHNpemVvZihNZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHN1YmNsYXNz
ZXMgY2Fubm90IGludHJvZHVjZSBleHRyYSBzdGF0ZS4iKTsKKyAgICBUKiBtZXNzYWdlID0gcmVp
bnRlcnByZXRfY2FzdDxUKj4obmVzdGVkX21lc3NhZ2VzX2FyZW5hXyk7CisgICAgQmVnaW5OZXN0
ZWRNZXNzYWdlSW50ZXJuYWwoZmllbGRfaWQsIG1lc3NhZ2UpOworICAgIHJldHVybiBtZXNzYWdl
OworICB9CisKKyAgU2NhdHRlcmVkU3RyZWFtV3JpdGVyKiBzdHJlYW1fd3JpdGVyX2Zvcl90ZXN0
aW5nKCkgeyByZXR1cm4gc3RyZWFtX3dyaXRlcl87IH0KKworICAvLyBBcHBlbmRzIHNvbWUgcmF3
IGJ5dGVzIHRvIHRoZSBtZXNzYWdlLiBUaGUgdXNlLWNhc2UgZm9yIHRoaXMgaXMgcHJlc2Vydmlu
ZworICAvLyB1bmtub3duIGZpZWxkcyBpbiB0aGUgZGVjb2RlIC0+IHJlLWVuY29kZSBwYXRoIG9m
IHh4eC5nZW4uY2MgY2xhc3NlcworICAvLyBnZW5lcmF0ZWQgYnkgdGhlIGNwcGdlbl9wbHVnaW4u
Y2MuCisgIC8vIFRoZSBjYWxsZXIgbmVlZHMgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGFwcGVuZGVk
IGRhdGEgaXMgcHJvcGVybHkKKyAgLy8gcHJvdG8tZW5jb2RlZCBhbmQgZWFjaCBmaWVsZCBoYXMg
YSBwcm90byBwcmVhbWJsZS4KKyAgdm9pZCBBcHBlbmRSYXdQcm90b0J5dGVzKGNvbnN0IHZvaWQq
IGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgY29uc3QgdWludDhfdCogc3JjID0gcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CisgICAgV3JpdGVUb1N0cmVhbShzcmMsIHNy
YyArIHNpemUpOworICB9CisKKyBwcml2YXRlOgorICBNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmKSA9
IGRlbGV0ZTsKKyAgTWVzc2FnZSYgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmKSA9IGRlbGV0ZTsK
KworICB2b2lkIEJlZ2luTmVzdGVkTWVzc2FnZUludGVybmFsKHVpbnQzMl90IGZpZWxkX2lkLCBN
ZXNzYWdlKik7CisKKyAgLy8gQ2FsbGVkIGJ5IEZpbmFsaXplIGFuZCBBcHBlbmQqIG1ldGhvZHMu
CisgIHZvaWQgRW5kTmVzdGVkTWVzc2FnZSgpOworCisgIHZvaWQgV3JpdGVUb1N0cmVhbShjb25z
dCB1aW50OF90KiBzcmNfYmVnaW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19lbmQpIHsKKyAgICBQRVJG
RVRUT19EQ0hFQ0soIWZpbmFsaXplZF8pOworICAgIFBFUkZFVFRPX0RDSEVDSyhzcmNfYmVnaW4g
PD0gc3JjX2VuZCk7CisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQz
Ml90PihzcmNfZW5kIC0gc3JjX2JlZ2luKTsKKyAgICBzdHJlYW1fd3JpdGVyXy0+V3JpdGVCeXRl
cyhzcmNfYmVnaW4sIHNpemUpOworICAgIHNpemVfICs9IHNpemU7CisgIH0KKworICAvLyBPbmx5
IFBPRCBmaWVsZHMgYXJlIGFsbG93ZWQuIFRoaXMgY2xhc3MncyBkdG9yIGlzIG5ldmVyIGNhbGxl
ZC4KKyAgLy8gU2VlIHRoZSBjb21tZW50IG9uIHRoZSBzdGF0aWNfYXNzZXJ0IGluIHRoZSBjb3Jy
ZXNwb25kaW5nIC5jYyBmaWxlLgorCisgIC8vIFRoZSBzdHJlYW0gd3JpdGVyIGludGVyZmFjZSB1
c2VkIGZvciB0aGUgc2VyaWFsaXphdGlvbi4KKyAgU2NhdHRlcmVkU3RyZWFtV3JpdGVyKiBzdHJl
YW1fd3JpdGVyXzsKKworICB1aW50OF90KiBzaXplX2ZpZWxkXzsKKworICAvLyBLZWVwcyB0cmFj
ayBvZiB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBtZXNzYWdlLgorICB1aW50MzJfdCBzaXplXzsK
KworICAvLyBTZWUgY29tbWVudCBmb3IgaW5jX3NpemVfYWxyZWFkeV93cml0dGVuKCkuCisgIHVp
bnQzMl90IHNpemVfYWxyZWFkeV93cml0dGVuXzsKKworICAvLyBXaGVuIHRydWUsIG5vIG1vcmUg
Y2hhbmdlcyB0byB0aGUgbWVzc2FnZSBhcmUgYWxsb3dlZC4gVGhpcyBpcyB0byBEQ0hFQ0sKKyAg
Ly8gYXR0ZW1wdHMgb2Ygd3JpdGluZyB0byBhIG1lc3NhZ2Ugd2hpY2ggaGFzIGJlZW4gRmluYWxp
emUoKS1kLgorICBib29sIGZpbmFsaXplZF87CisKKyAgLy8gVXNlZCB0byBkZXRlY3QgYXR0ZW1w
cyB0byBjcmVhdGUgbWVzc2FnZXMgd2l0aCBhIG5lc3RpbmcgbGV2ZWwgPgorICAvLyBrTWF4TmVz
dGluZ0RlcHRoLiB8bmVzdGluZ19kZXB0aF98ID09IDAgZm9yIHJvb3QgKG5vbi1uZXN0ZWQpIG1l
c3NhZ2VzLgorICB1aW50OF90IG5lc3RpbmdfZGVwdGhfOworCisjaWYgUEVSRkVUVE9fRENIRUNL
X0lTX09OKCkKKyAgLy8gQ3VycmVudCBnZW5lcmF0aW9uIG9mIG1lc3NhZ2UuIEluY3JlbWVudGVk
IG9uIFJlc2V0LgorICAvLyBVc2VkIHRvIGRldGVjdCBzdGFsZSBoYW5kbGVzLgorICB1aW50MzJf
dCBnZW5lcmF0aW9uXzsKKworICBNZXNzYWdlSGFuZGxlQmFzZSogaGFuZGxlXzsKKyNlbmRpZgor
CisgIC8vIFBvaW50ZXIgdG8gdGhlIGxhc3QgY2hpbGQgbWVzc2FnZSBjcmVhdGVkIHRocm91Z2gg
QmVnaW5OZXN0ZWRNZXNzYWdlKCksIGlmCisgIC8vIGFueSwgbnVsbHB0ciBvdGhlcndpc2UuIFRo
ZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBtb3JlIHRoYW4gb25lCisgIC8vIG1lc3Nh
Z2UgcGVyIG5lc3RpbmcgbGV2ZWwgYXMgdGhlIHByb3RvLXplcm8gQVBJIGNvbnRyYWN0IG1hbmRh
dGVzIHRoYXQKKyAgLy8gbmVzdGVkIGZpZWxkcyBjYW4gYmUgZmlsbGVkIG9ubHkgaW4gYSBzdGFj
a2VkIGZhc2hpb24uIEluIG90aGVyIHdvcmRzLAorICAvLyBuZXN0ZWQgbWVzc2FnZXMgYXJlIGZp
bmFsaXplZCBhbmQgc2VhbGVkIHdoZW4gYW55IG90aGVyIGZpZWxkIGlzIHNldCBpbiB0aGUKKyAg
Ly8gcGFyZW50IG1lc3NhZ2UgKG9yIHRoZSBwYXJlbnQgbWVzc2FnZSBpdHNlbGYgaXMgZmluYWxp
emVkKSBhbmQgY2Fubm90IGJlCisgIC8vIGFjY2Vzc2VkIGFueW1vcmUgYWZ0ZXJ3YXJkcy4KKyAg
Ly8gVE9ETyhwcmltaWFubyk6IG9wdGltaXphdGlvbjogSSB0aGluayB0aGF0IG5lc3RlZF9tZXNz
YWdlXywgd2hlbiBub24tbnVsbC4KKyAgLy8gd2lsbCBhbHdheXMgYmUgQCAodGhpcykgKyBvZmZz
ZXRvZihuZXN0ZWRfbWVzc2FnZXNfYXJlbmFfKS4KKyAgTWVzc2FnZSogbmVzdGVkX21lc3NhZ2Vf
OworCisgIC8vIFRoZSByb290IG1lc3NhZ2Ugb3ducyB0aGUgc3RvcmFnZSBmb3IgYWxsIGl0cyBu
ZXN0ZWQgbWVzc2FnZXMsIHVwIHRvIGEgbWF4CisgIC8vIG9mIGtNYXhOZXN0aW5nRGVwdGggbGV2
ZWxzIChzZWUgdGhlIC5jYyBmaWxlKS4gTm90ZSB0aGF0IHRoZSBib3VuZGFyaWVzIG9mCisgIC8v
IHRoZSBhcmVuYSBhcmUgbWVhbmluZ2Z1bCBvbmx5IGZvciB0aGUgcm9vdCBtZXNzYWdlLgorICAv
LyBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCBwdXQgdGhlIHNpemVvZigpIG1hdGggaGVyZSBiZWNh
dXNlIHdlIGNhbm5vdCBzaXplb2YKKyAgLy8gdGhlIGN1cnJlbnQgY2xhc3MgaW4gYSBoZWFkZXIu
IEhvd2V2ZXIgdGhlIC5jYyBmaWxlIGhhcyBhIHN0YXRpY19hc3NlcnQKKyAgLy8gdGhhdCBndWFy
YW50ZWVzIHRoYXQgKHNlZSB0aGUgUmVzZXQoKSBtZXRob2QgaW4gdGhlIC5jYyBmaWxlKS4KKyAg
YWxpZ25hcyhzaXplb2Yodm9pZCopKSB1aW50OF90IG5lc3RlZF9tZXNzYWdlc19hcmVuYV9bNTEy
XTsKKworICAvLyBETyBOT1QgYWRkIGFueSBmaWVsZHMgYmVsb3cgfG5lc3RlZF9tZXNzYWdlc19h
cmVuYV98LiBUaGUgbWVtb3J5IGxheW91dCBvZgorICAvLyBuZXN0ZWQgbWVzc2FnZXMgd291bGQg
b3ZlcmZsb3cgdGhlIHN0b3JhZ2UgYWxsb2NhdGVkIGJ5IHRoZSByb290IG1lc3NhZ2UuCit9Owor
Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRU
T19QUk9UT1pFUk9fTUVTU0FHRV9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjog
aW5jbHVkZS9wZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZV9oYW5kbGUuaAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGlj
ZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNl
Iik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdp
dGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2Ug
YXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIu
MAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8g
aW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlz
IGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMg
T1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAq
IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt
aXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNp
Zm5kZWYgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fTUVTU0FHRV9IQU5ETEVfSF8KKyNkZWZp
bmUgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fTUVTU0FHRV9IQU5ETEVfSF8KKworI2luY2x1
ZGUgPGZ1bmN0aW9uYWw+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNp
bmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vbWVzc2FnZS5oIgorCituYW1lc3BhY2UgcHJvdG96
ZXJvIHsKKworY2xhc3MgTWVzc2FnZTsKKworLy8gTWVzc2FnZUhhbmRsZSBhbGxvd3MgdG8gZGVj
b3VwbGUgdGhlIGxpZmV0aW1lIG9mIGEgcHJvdG8gbWVzc2FnZQorLy8gZnJvbSB0aGUgdW5kZXJs
eWluZyBzdG9yYWdlLiBJdCBnaXZlcyB0aGUgZm9sbG93aW5nIGd1YXJhbnRlZXM6CisvLyAtIFRo
ZSB1bmRlcmx5aW5nIG1lc3NhZ2UgaXMgZmluYWxpemVkIChpZiBzdGlsbCBhbGl2ZSkgaWYgdGhl
IGhhbmRsZSBnb2VzCisvLyAgIG91dCBvZiBzY29wZS4KKy8vIC0gSW4gRGVidWcgLyBEQ0hFQ0tf
QUxXQVlTX09OIGJ1aWxkcywgdGhlIGhhbmRsZSBiZWNvbWVzIG51bGwgb25jZSB0aGUKKy8vICAg
bWVzc2FnZSBpcyBmaW5hbGl6ZWQuIFRoaXMgaXMgdG8gZW5mb3JjZSB0aGUgYXBwZW5kLW9ubHkg
QVBJLiBGb3IgaW5zdGFuY2UKKy8vICAgd2hlbiBhZGRpbmcgdHdvIHJlcGVhdGVkIG1lc3NhZ2Vz
LCB0aGUgYWRkaXRpb24gb2YgdGhlIDJuZCBvbmUgZm9yY2VzCisvLyAgIHRoZSBmaW5hbGl6YXRp
b24gb2YgdGhlIGZpcnN0LgorLy8gVGhpbmsgYWJvdXQgdGhpcyBhcyBhIFdlYWtQdHI8TWVzc2Fn
ZT4gd2hpY2ggY2FsbHMKKy8vIE1lc3NhZ2U6OkZpbmFsaXplKCkgd2hlbiBnb2luZyBvdXQgb2Yg
c2NvcGUuCisKK2NsYXNzIFBFUkZFVFRPX0VYUE9SVCBNZXNzYWdlSGFuZGxlQmFzZSB7CisgcHVi
bGljOgorICB+TWVzc2FnZUhhbmRsZUJhc2UoKTsKKworICAvLyBNb3ZlLW9ubHkgdHlwZS4KKyAg
TWVzc2FnZUhhbmRsZUJhc2UoTWVzc2FnZUhhbmRsZUJhc2UmJikgbm9leGNlcHQ7CisgIE1lc3Nh
Z2VIYW5kbGVCYXNlJiBvcGVyYXRvcj0oTWVzc2FnZUhhbmRsZUJhc2UmJik7CisgIGV4cGxpY2l0
IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisjaWYgUEVSRkVUVE9fRENIRUNLX0lTX09OKCkKKyAg
ICBQRVJGRVRUT19EQ0hFQ0soIW1lc3NhZ2VfIHx8IGdlbmVyYXRpb25fID09IG1lc3NhZ2VfLT5n
ZW5lcmF0aW9uXyk7CisjZW5kaWYKKyAgICByZXR1cm4gISFtZXNzYWdlXzsKKyAgfQorCisgcHJv
dGVjdGVkOgorICBleHBsaWNpdCBNZXNzYWdlSGFuZGxlQmFzZShNZXNzYWdlKiA9IG51bGxwdHIp
OworICBNZXNzYWdlKiBvcGVyYXRvci0+KCkgY29uc3QgeworI2lmIFBFUkZFVFRPX0RDSEVDS19J
U19PTigpCisgICAgUEVSRkVUVE9fRENIRUNLKCFtZXNzYWdlXyB8fCBnZW5lcmF0aW9uXyA9PSBt
ZXNzYWdlXy0+Z2VuZXJhdGlvbl8pOworI2VuZGlmCisgICAgcmV0dXJuIG1lc3NhZ2VfOworICB9
CisgIE1lc3NhZ2UmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICoob3BlcmF0b3ItPigpKTsg
fQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE1lc3NhZ2U7CisgIE1lc3NhZ2VIYW5kbGVC
YXNlKGNvbnN0IE1lc3NhZ2VIYW5kbGVCYXNlJikgPSBkZWxldGU7CisgIE1lc3NhZ2VIYW5kbGVC
YXNlJiBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZUhhbmRsZUJhc2UmKSA9IGRlbGV0ZTsKKworICB2
b2lkIHJlc2V0X21lc3NhZ2UoKSB7CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgTWVzc2FnZTo6
RmluYWxpemUoKS4KKyAgICBQRVJGRVRUT19EQ0hFQ0sobWVzc2FnZV8tPmlzX2ZpbmFsaXplZCgp
KTsKKyAgICBtZXNzYWdlXyA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIE1vdmUoTWVzc2FnZUhh
bmRsZUJhc2UmJik7CisKKyAgdm9pZCBGaW5hbGl6ZU1lc3NhZ2UoKSB7IG1lc3NhZ2VfLT5GaW5h
bGl6ZSgpOyB9CisKKyAgTWVzc2FnZSogbWVzc2FnZV87CisjaWYgUEVSRkVUVE9fRENIRUNLX0lT
X09OKCkKKyAgdWludDMyX3QgZ2VuZXJhdGlvbl87CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDx0
eXBlbmFtZSBUPgorY2xhc3MgTWVzc2FnZUhhbmRsZSA6IHB1YmxpYyBNZXNzYWdlSGFuZGxlQmFz
ZSB7CisgcHVibGljOgorICBNZXNzYWdlSGFuZGxlKCkgOiBNZXNzYWdlSGFuZGxlKG51bGxwdHIp
IHt9CisgIGV4cGxpY2l0IE1lc3NhZ2VIYW5kbGUoVCogbWVzc2FnZSkgOiBNZXNzYWdlSGFuZGxl
QmFzZShtZXNzYWdlKSB7fQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJl
dHVybiBNZXNzYWdlSGFuZGxlQmFzZTo6b3BlcmF0b3IgYm9vbCgpOyB9CisKKyAgVCYgb3BlcmF0
b3IqKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUJj4oTWVzc2FnZUhhbmRsZUJh
c2U6Om9wZXJhdG9yKigpKTsKKyAgfQorCisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAg
cmV0dXJuIHN0YXRpY19jYXN0PFQqPihNZXNzYWdlSGFuZGxlQmFzZTo6b3BlcmF0b3ItPigpKTsK
KyAgfQorCisgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihNZXNzYWdl
SGFuZGxlQmFzZTo6b3BlcmF0b3ItPigpKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3Rv
emVybworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX01FU1NBR0VfSEFO
RExFX0hfCisvLyBnZW5fYW1hbGdhbWF0ZWQgYmVnaW4gaGVhZGVyOiBpbmNsdWRlL3BlcmZldHRv
L3Byb3RvemVyby9wYWNrZWRfcmVwZWF0ZWRfZmllbGRzLmgKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVu
ZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICog
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
aWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgor
ICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisg
KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp
bmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli
dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ
VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhl
IExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMg
YW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElO
Q0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1BBQ0tFRF9SRVBFQVRFRF9GSUVMRFNfSF8KKyNkZWZp
bmUgSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUEFDS0VEX1JFUEVBVEVEX0ZJRUxEU19IXwor
CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxtZW1v
cnk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3Byb3RvX3V0aWxzLmgiCisK
K25hbWVzcGFjZSBwcm90b3plcm8geworCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3NlcyB1
c2VkIHdoZW4gZW5jb2RpbmcgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KKy8vIFRvIGVuY29kZSBz
dWNoIGEgZmllbGQsIHRoZSBjYWxsZXIgaXMgZmlyc3QgZXhwZWN0ZWQgdG8gYWNjdW11bGF0ZSBh
bGwgb2YgdGhlCisvLyB2YWx1ZXMgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgKGRlcGVu
ZGluZyBvbiB0aGUgd2lyZSB0eXBlIG9mIHRoZQorLy8gaW5kaXZpZHVhbCBlbGVtZW50cyksIGRl
ZmluZWQgYmVsb3c6CisvLyAqIHByb3RvemVybzo6UGFja2VkVmFySW50CisvLyAqIHByb3RvemVy
bzo6UGFja2VkRml4ZWRTaXplSW50PC8qZWxlbWVudF90eXBlPSovIHVpbnQzMl90PgorLy8gVGhl
biB0aGF0IGJ1ZmZlciBpcyBwYXNzZWQgdG8gdGhlIHByb3RvemVyby1nZW5lcmF0ZWQgc2V0dGVy
cyBhcyBhbiBhcmd1bWVudC4KKy8vIEFmdGVyIGNhbGxpbmcgdGhlIHNldHRlciwgdGhlIGJ1ZmZl
ciBjYW4gYmUgZGVzdHJveWVkLgorLy8KKy8vIEFuIGV4YW1wbGUgb2YgZW5jb2RpbmcgYSBwYWNr
ZWQgZmllbGQ6CisvLyAgIHByb3RvemVybzo6SGVhcEJ1ZmZlcmVkPHByb3RvemVybzo6TWVzc2Fn
ZT4gbXNnOworLy8gICBwcm90b3plcm86OlBhY2tlZFZhckludCBidWY7CisvLyAgIGJ1Zi5BcHBl
bmQoNDIpOworLy8gICBidWYuQXBwZW5kKC0xKTsKKy8vICAgbXNnLT5zZXRfZmllbGRuYW1lKGJ1
Zik7CisvLyAgIG1zZy5TZXJpYWxpemVBc1N0cmluZygpOworCitjbGFzcyBQYWNrZWRCdWZmZXJC
YXNlIHsKKyBwdWJsaWM6CisgIFBhY2tlZEJ1ZmZlckJhc2UoKSB7IFJlc2V0KCk7IH0KKworICAv
LyBDb3B5IG9yIG1vdmUgaXMgZGlzYWJsZWQgZHVlIHRvIHBvaW50ZXJzIHRvIHN0YWNrIGFkZHJl
c3Nlcy4KKyAgUGFja2VkQnVmZmVyQmFzZShjb25zdCBQYWNrZWRCdWZmZXJCYXNlJikgPSBkZWxl
dGU7CisgIFBhY2tlZEJ1ZmZlckJhc2UoUGFja2VkQnVmZmVyQmFzZSYmKSA9IGRlbGV0ZTsKKyAg
UGFja2VkQnVmZmVyQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFBhY2tlZEJ1ZmZlckJhc2UmKSA9IGRl
bGV0ZTsKKyAgUGFja2VkQnVmZmVyQmFzZSYgb3BlcmF0b3I9KFBhY2tlZEJ1ZmZlckJhc2UmJikg
PSBkZWxldGU7CisKKyAgdm9pZCBSZXNldCgpOworCisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBj
b25zdCB7IHJldHVybiBzdG9yYWdlX2JlZ2luXzsgfQorCisgIHNpemVfdCBzaXplKCkgY29uc3Qg
eworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHdyaXRlX3B0cl8gLSBzdG9yYWdlX2Jl
Z2luXyk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBHcm93SWZOZWVkZWQoKSB7CisgICAg
UEVSRkVUVE9fRENIRUNLKHdyaXRlX3B0cl8gPj0gc3RvcmFnZV9iZWdpbl8gJiYgd3JpdGVfcHRy
XyA8PSBzdG9yYWdlX2VuZF8pOworICAgIGlmIChQRVJGRVRUT19VTkxJS0VMWSh3cml0ZV9wdHJf
ICsga01heEVsZW1lbnRTaXplID4gc3RvcmFnZV9lbmRfKSkgeworICAgICAgR3Jvd1Nsb3dwYXRo
KCk7CisgICAgfQorICB9CisKKyAgdm9pZCBHcm93U2xvd3BhdGgoKTsKKworICAvLyBtYXgodWlu
dDY0X3QgdmFyaW50IGVuY29kaW5nLCBiaWdnZXN0IGZpeGVkIHR5cGUgKHVpbnQ2NCkpLgorICBz
dGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4RWxlbWVudFNpemUgPSAxMDsKKworICAvLyBTbyBz
aXplb2YodGhpcykgPT0gOGsuCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtPblN0YWNrU3Rv
cmFnZVNpemUgPSA4MTkyIC0gMzI7CisKKyAgdWludDhfdCogc3RvcmFnZV9iZWdpbl87CisgIHVp
bnQ4X3QqIHN0b3JhZ2VfZW5kXzsKKyAgdWludDhfdCogd3JpdGVfcHRyXzsKKyAgc3RkOjp1bmlx
dWVfcHRyPHVpbnQ4X3RbXT4gaGVhcF9idWZfOworICBhbGlnbmFzKHVpbnQ2NF90KSB1aW50OF90
IHN0YWNrX2J1Zl9ba09uU3RhY2tTdG9yYWdlU2l6ZV07Cit9OworCitjbGFzcyBQYWNrZWRWYXJJ
bnQgOiBwdWJsaWMgUGFja2VkQnVmZmVyQmFzZSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVD4KKyAgdm9pZCBBcHBlbmQoVCB2YWx1ZSkgeworICAgIEdyb3dJZk5lZWRlZCgpOwor
ICAgIHdyaXRlX3B0cl8gPSBwcm90b191dGlsczo6V3JpdGVWYXJJbnQodmFsdWUsIHdyaXRlX3B0
cl8pOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCAvKiBlLmcuIHVpbnQzMl90IGZv
ciBGaXhlZDMyICovPgorY2xhc3MgUGFja2VkRml4ZWRTaXplSW50IDogcHVibGljIFBhY2tlZEJ1
ZmZlckJhc2UgeworIHB1YmxpYzoKKyAgdm9pZCBBcHBlbmQoVCB2YWx1ZSkgeworICAgIHN0YXRp
Y19hc3NlcnQoc2l6ZW9mKFQpID09IDQgfHwgc2l6ZW9mKFQpID09IDgsCisgICAgICAgICAgICAg
ICAgICAiUGFja2VkRml4ZWRTaXplSW50IHNob3VsZCBiZSB1c2VkIG9ubHkgd2l0aCAzMi82NC1i
aXQgaW50cyIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpIDw9IGtNYXhFbGVtZW50U2l6
ZSwKKyAgICAgICAgICAgICAgICAgICJrTWF4RWxlbWVudFNpemUgbmVlZHMgdG8gYmUgdXBkYXRl
ZCIpOworICAgIEdyb3dJZk5lZWRlZCgpOworICAgIFBFUkZFVFRPX0RDSEVDSyhyZWludGVycHJl
dF9jYXN0PHNpemVfdD4od3JpdGVfcHRyXykgJSBhbGlnbm9mKFQpID09IDApOworICAgIG1lbWNw
eShyZWludGVycHJldF9jYXN0PFQqPih3cml0ZV9wdHJfKSwgJnZhbHVlLCBzaXplb2YoVCkpOwor
ICAgIHdyaXRlX3B0cl8gKz0gc2l6ZW9mKFQpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ug
cHJvdG96ZXJvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUEFDS0VE
X1JFUEVBVEVEX0ZJRUxEU19IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5j
bHVkZS9wZXJmZXR0by9wcm90b3plcm8vcHJvdG9fZGVjb2Rlci5oCisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNl
ZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsK
KyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0
aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAor
ICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisg
KgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3
cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz
dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD
T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2Vl
IHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Np
b25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRl
ZiBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19QUk9UT19ERUNPREVSX0hfCisjZGVmaW5lIElO
Q0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1BST1RPX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgPHN0
ZGludC5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2
ZWN0b3I+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L2Jhc2UvY29tcGlsZXIuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUg
InBlcmZldHRvL2Jhc2UvbG9nZ2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAj
aW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL2ZpZWxkLmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQg
ZXhwYW5kZWQ6ICNpbmNsdWRlICJwZXJmZXR0by9wcm90b3plcm8vcHJvdG9fdXRpbHMuaCIKKwor
bmFtZXNwYWNlIHByb3RvemVybyB7CisKKy8vIEEgZ2VuZXJpYyBwcm90b2J1ZiBkZWNvZGVyLiBE
b2Vzbid0IHJlcXVpcmUgYW55IGtub3dsZWRnZSBhYm91dCB0aGUgcHJvdG8KKy8vIHNjaGVtYS4g
SXQgdG9rZW5pemVzIGZpZWxkcywgcmV0cmlldmVzIHRoZWlyIElEIGFuZCB0eXBlIGFuZCBleHBv
c2VzCisvLyBhY2Nlc3NvcnMgdG8gcmV0cmlldmUgaXRzIHZhbHVlcy4KKy8vIEl0IGRvZXMgTk9U
IHJlY3Vyc2UgaW4gbmVzdGVkIHN1Ym1lc3NhZ2VzLCBpbnN0ZWFkIGl0IGp1c3QgY29tcHV0ZXMg
dGhlaXIKKy8vIGJvdW5kYXJpZXMsIHJlY3Vyc2lvbiBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuCisv
LyBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gcGVyZi1zZW5zaXRpdmUgY29u
dGV4dHMuIEl0IGRvZXMgbm90CisvLyBhbGxvY2F0ZSBhbmQgZG9lcyBub3QgcGVyZm9ybSBhbnkg
cHJvdG8gc2VtYW50aWMgY2hlY2tzIChlLmcuIHJlcGVhdGVkIC8KKy8vIHJlcXVpcmVkIC8gb3B0
aW9uYWwpLiBJdCdzIHN1cHBvc2VkbHkgc2FmZSB3cnQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNj
ZXNzZXMKKy8vIChzZWUgcHJvdG9fZGVjb2Rlcl9mdXp6ZXIuY2MpLgorLy8gVGhpcyBjbGFzcyBz
ZXJ2ZXMgYWxzbyBhcyBhIGJ1aWxkaW5nIGJsb2NrIGZvciBUeXBlZFByb3RvRGVjb2RlciwgdXNl
ZCB3aGVuCisvLyB0aGUgc2NoZW1hIGlzIGtub3duIGF0IGNvbXBpbGUgdGltZS4KK2NsYXNzIFBF
UkZFVFRPX0VYUE9SVCBQcm90b0RlY29kZXIgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIFBy
b3RvRGVjb2RlciB1c2luZyB0aGUgZ2l2ZW4gfGJ1ZmZlcnwgd2l0aCBzaXplIHxsZW5ndGh8IGJ5
dGVzLgorICBQcm90b0RlY29kZXIoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQor
ICAgICAgOiBiZWdpbl8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSks
CisgICAgICAgIGVuZF8oYmVnaW5fICsgbGVuZ3RoKSwKKyAgICAgICAgcmVhZF9wdHJfKGJlZ2lu
Xykge30KKyAgUHJvdG9EZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIDogUHJvdG9EZWNv
ZGVyKHN0ci5kYXRhKCksIHN0ci5zaXplKCkpIHt9CisgIFByb3RvRGVjb2Rlcihjb25zdCBDb25z
dEJ5dGVzJiBjYikgOiBQcm90b0RlY29kZXIoY2IuZGF0YSwgY2Iuc2l6ZSkge30KKworICAvLyBS
ZWFkcyB0aGUgbmV4dCBmaWVsZCBmcm9tIHRoZSBidWZmZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFk
IGN1cnNvci4gSWYgYQorICAvLyBmdWxsIGZpZWxkIGNhbm5vdCBiZSByZWFkLCB0aGUgcmV0dXJu
ZWQgRmllbGQgd2lsbCBiZSBpbnZhbGlkIChpLmUuCisgIC8vIGZpZWxkLnZhbGlkKCkgPT0gZmFs
c2UpLgorICBGaWVsZCBSZWFkRmllbGQoKTsKKworICAvLyBGaW5kcyB0aGUgZmlyc3QgZmllbGQg
d2l0aCB0aGUgZ2l2ZW4gaWQuIERvZXNuJ3QgYWZmZWN0IHRoZSByZWFkIGN1cnNvci4KKyAgRmll
bGQgRmluZEZpZWxkKHVpbnQzMl90IGZpZWxkX2lkKTsKKworICAvLyBSZXNldHMgdGhlIHJlYWQg
Y3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICB2b2lkIFJlc2V0KCkgeyByZWFk
X3B0cl8gPSBiZWdpbl87IH0KKworICAvLyBSZXNldHMgdGhlIHJlYWQgY3Vyc29yIHRvIHRoZSBn
aXZlbiBwb3NpdGlvbiAobXVzdCBiZSB3aXRoaW4gdGhlIGJ1ZmZlcikuCisgIHZvaWQgUmVzZXQo
Y29uc3QgdWludDhfdCogcG9zKSB7CisgICAgUEVSRkVUVE9fRENIRUNLKHBvcyA+PSBiZWdpbl8g
JiYgcG9zIDwgZW5kXyk7CisgICAgcmVhZF9wdHJfID0gcG9zOworICB9CisKKyAgLy8gUmV0dXJu
cyB0aGUgcG9zaXRpb24gb2YgcmVhZCBjdXJzb3IsIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0
aGUgYnVmZmVyLgorICBzaXplX3QgcmVhZF9vZmZzZXQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNf
Y2FzdDxzaXplX3Q+KHJlYWRfcHRyXyAtIGJlZ2luXyk7IH0KKworICBzaXplX3QgYnl0ZXNfbGVm
dCgpIGNvbnN0IHsKKyAgICBQRVJGRVRUT19EQ0hFQ0socmVhZF9wdHJfIDw9IGVuZF8pOworICAg
IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZF8gLSByZWFkX3B0cl8pOworICB9CisKKyAg
Y29uc3QgdWludDhfdCogYmVnaW4oKSBjb25zdCB7IHJldHVybiBiZWdpbl87IH0KKyAgY29uc3Qg
dWludDhfdCogZW5kKCkgY29uc3QgeyByZXR1cm4gZW5kXzsgfQorCisgcHJvdGVjdGVkOgorICBj
b25zdCB1aW50OF90KiBjb25zdCBiZWdpbl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZF87
CisgIGNvbnN0IHVpbnQ4X3QqIHJlYWRfcHRyXyA9IG51bGxwdHI7Cit9OworCisvLyBBbiBpdGVy
YXRvci1saWtlIGNsYXNzIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHJlcGVhdGVkIGZpZWxkcy4g
VXNlZCBieQorLy8gVHlwZWRQcm90b0RlY29kZXIuIFRoZSBpdGVyYXRpb24gc2VxdWVuY2UgaXMg
YSBiaXQgY291bnRlci1pbnR1aXRpdmUgZHVlIHRvCisvLyB0aGUgZmFjdCB0aGF0IGZpZWxkc19b
ZmllbGRfaWRdIGhvbGRzIHRoZSAqbGFzdCogdmFsdWUgb2YgdGhlIGZpZWxkLCBub3QgdGhlCisv
LyBmaXJzdCwgYnV0IHRoZSByZW1haW5pbmcgc3RvcmFnZSBob2xkcyByZXBlYXRlZCBmaWVsZHMg
aW4gRklGTyBvcmRlci4KKy8vIEFzc3VtZSB0aGF0IHdlIHB1c2ggdGhlIDEwLDExLDEyIGludG8g
YSByZXBlYXRlZCBmaWVsZCB3aXRoIElEPTEuCisvLworLy8gRGVjb2RlciBtZW1vcnkgbGF5b3V0
OiAgWyAgZmllbGRzIHN0b3JhZ2UgIF0gWyByZXBlYXRlZCBmaWVsZHMgc3RvcmFnZSBdCisvLyAx
c3QgaXRlcmF0aW9uOiAgICAgICAgICAgMTAKKy8vIDJuZCBpdGVyYXRpb246ICAgICAgICAgICAx
MSAgICAgICAgICAgICAgICAgICAxMAorLy8gM3JkIGl0ZXJhdGlvbjogICAgICAgICAgIDEyICAg
ICAgICAgICAgICAgICAgIDEwIDExCisvLworLy8gV2Ugc3RhcnQgdGhlIGl0ZXJhdGlvbiBAIGZp
ZWxkc19bbnVtX2ZpZWxkc10sIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKKy8vIHJlcGVhdGVk
IGZpZWxkcyBzdG9yYWdlLCBwcm9jZWVkIHVudGlsIHRoZSBlbmQgYW5kIGxhc3RseSBqdW1wIEAg
ZmllbGRzX1tpZF0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkRmllbGRJ
dGVyYXRvciB7CisgcHVibGljOgorICBSZXBlYXRlZEZpZWxkSXRlcmF0b3IodWludDMyX3QgZmll
bGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZCogYmVnaW4sCisgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZCogZW5kLAorICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmllbGQqIGxhc3QpCisgICAgICA6IGZpZWxkX2lkXyhmaWVsZF9pZCksIGl0
ZXJfKGJlZ2luKSwgZW5kXyhlbmQpLCBsYXN0XyhsYXN0KSB7CisgICAgRmluZE5leHRNYXRjaGlu
Z0lkKCk7CisgIH0KKworICAvLyBDb25zdHJ1Y3RzIGFuIGludmFsaWQgaXRlcmF0b3IuCisgIFJl
cGVhdGVkRmllbGRJdGVyYXRvcigpCisgICAgICA6IGZpZWxkX2lkXygwdSksIGl0ZXJfKG51bGxw
dHIpLCBlbmRfKG51bGxwdHIpLCBsYXN0XyhudWxscHRyKSB7fQorCisgIGV4cGxpY2l0IG9wZXJh
dG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBpdGVyXyAhPSBlbmRfOyB9CisgIGNvbnN0IEZpZWxk
JiBmaWVsZCgpIGNvbnN0IHsgcmV0dXJuICppdGVyXzsgfQorCisgIFQgb3BlcmF0b3IqKCkgY29u
c3QgeworICAgIFQgdmFse307CisgICAgaXRlcl8tPmdldCgmdmFsKTsKKyAgICByZXR1cm4gdmFs
OworICB9CisgIGNvbnN0IEZpZWxkKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gaXRlcl87
IH0KKworICBSZXBlYXRlZEZpZWxkSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgUEVSRkVU
VE9fRENIRUNLKGl0ZXJfICE9IGVuZF8pOworICAgIGlmIChpdGVyXyA9PSBsYXN0XykgeworICAg
ICAgaXRlcl8gPSBlbmRfOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICArK2l0ZXJf
OworICAgIEZpbmROZXh0TWF0Y2hpbmdJZCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisg
IFJlcGVhdGVkRmllbGRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIFBFUkZFVFRPX0RD
SEVDSyhpdGVyXyAhPSBlbmRfKTsKKyAgICBSZXBlYXRlZEZpZWxkSXRlcmF0b3IgaXQoKnRoaXMp
OworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gaXQ7CisgIH0KKworIHByaXZhdGU6CisgIHZv
aWQgRmluZE5leHRNYXRjaGluZ0lkKCkgeworICAgIFBFUkZFVFRPX0RDSEVDSyhpdGVyXyAhPSBs
YXN0Xyk7CisgICAgZm9yICg7IGl0ZXJfICE9IGVuZF87ICsraXRlcl8pIHsKKyAgICAgIGlmIChp
dGVyXy0+aWQoKSA9PSBmaWVsZF9pZF8pCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXRl
cl8gPSBsYXN0Xy0+dmFsaWQoKSA/IGxhc3RfIDogZW5kXzsKKyAgfQorCisgIHVpbnQzMl90IGZp
ZWxkX2lkXzsKKworICAvLyBJbml0aWFsbHkgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhl
IHJlcGVhdGVkIGZpZWxkIHN0b3JhZ2UsIHRoZW4gaXMKKyAgLy8gaW5jcmVtZW50ZWQgYXMgd2Ug
Y2FsbCBvcGVyYXRvcisrKCkuCisgIGNvbnN0IEZpZWxkKiBpdGVyXzsKKworICAvLyBBbHdheXMg
cG9pbnRzIHRvIGZpZWxkc19bc2l6ZV9dLCBpLmUuIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RvcmFn
ZS4KKyAgY29uc3QgRmllbGQqIGVuZF87CisKKyAgLy8gQWx3YXlzIHBvaW50cyB0byBmaWVsZHNf
W2ZpZWxkX2lkXS4KKyAgY29uc3QgRmllbGQqIGxhc3RfOworfTsKKworLy8gQXMgUmVwZWF0ZWRG
aWVsZEl0ZXJhdG9yLCBidXQgYWxsb3dzIGl0ZXJhdGluZyBvdmVyIGEgcGFja2VkIHJlcGVhdGVk
IGZpZWxkCisvLyAod2hpY2ggd2lsbCBiZSBpbml0aWFsbHkgc3RvcmVkIGFzIGEgc2luZ2xlIGxl
bmd0aC1kZWxpbWl0ZWQgZmllbGQpLgorLy8gU2VlIHxHZXRQYWNrZWRSZXBlYXRlZEZpZWxkfCBm
b3IgZGV0YWlscy4KKy8vCisvLyBBc3N1bWVzIGxpdHRsZSBlbmRpYW5uZXNzLCBhbmQgdGhhdCB0
aGUgaW5wdXQgYnVmZmVycyBhcmUgd2VsbCBmb3JtZWQgLQorLy8gY29udGFpbmluZyBhbiBleGFj
dCBtdWx0aXBsZSBvZiBlbmNvZGVkIGVsZW1lbnRzLgordGVtcGxhdGUgPHByb3RvX3V0aWxzOjpQ
cm90b1dpcmVUeXBlIHdpcmVfdHlwZSwgdHlwZW5hbWUgQ3BwVHlwZT4KK2NsYXNzIFBhY2tlZFJl
cGVhdGVkRmllbGRJdGVyYXRvciB7CisgcHVibGljOgorICBQYWNrZWRSZXBlYXRlZEZpZWxkSXRl
cmF0b3IoY29uc3QgdWludDhfdCogZGF0YV9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCog
cGFyc2VfZXJyb3JfcHRyKQorICAgICAgOiBkYXRhX2VuZF8oZGF0YV9iZWdpbiA/IGRhdGFfYmVn
aW4gKyBzaXplIDogbnVsbHB0ciksCisgICAgICAgIHJlYWRfcHRyXyhkYXRhX2JlZ2luKSwKKyAg
ICAgICAgcGFyc2VfZXJyb3JfKHBhcnNlX2Vycm9yX3B0cikgeworICAgIHVzaW5nIHByb3RvX3V0
aWxzOjpQcm90b1dpcmVUeXBlOworICAgIHN0YXRpY19hc3NlcnQod2lyZV90eXBlID09IFByb3Rv
V2lyZVR5cGU6OmtWYXJJbnQgfHwKKyAgICAgICAgICAgICAgICAgICAgICB3aXJlX3R5cGUgPT0g
UHJvdG9XaXJlVHlwZTo6a0ZpeGVkMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICB3aXJlX3R5
cGUgPT0gUHJvdG9XaXJlVHlwZTo6a0ZpeGVkNjQsCisgICAgICAgICAgICAgICAgICAiaW52YWxp
ZCB0eXBlIik7CisKKyAgICBQRVJGRVRUT19EQ0hFQ0socGFyc2VfZXJyb3JfcHRyKTsKKworICAg
IC8vIEVpdGhlciB0aGUgZmllbGQgaXMgdW5zZXQgKGFuZCB0aGVyZSBhcmUgbm8gZGF0YSBwb2lu
dGVyKSwgb3IgdGhlIGZpZWxkCisgICAgLy8gaXMgc2V0IHdpdGggYSB6ZXJvIGxlbmd0aCBwYXls
b2FkLiBNYXJrIHRoZSBpdGVyYXRvciBhcyBpbnZhbGlkIGluIGJvdGgKKyAgICAvLyBjYXNlcy4K
KyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICBjdXJyX3ZhbHVlX3ZhbGlkXyA9IGZhbHNlOwor
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgod2lyZV90eXBlID09IFByb3RvV2lyZVR5
cGU6OmtGaXhlZDMyICYmIChzaXplICUgNCkgIT0gMCkgfHwKKyAgICAgICAgKHdpcmVfdHlwZSA9
PSBQcm90b1dpcmVUeXBlOjprRml4ZWQ2NCAmJiAoc2l6ZSAlIDgpICE9IDApKSB7CisgICAgICAq
cGFyc2VfZXJyb3JfID0gdHJ1ZTsKKyAgICAgIGN1cnJfdmFsdWVfdmFsaWRfID0gZmFsc2U7Cisg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgKysoKnRoaXMpOworICB9CisKKyAgY29uc3QgQ3Bw
VHlwZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBjdXJyX3ZhbHVlXzsgfQorICBleHBsaWNp
dCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gY3Vycl92YWx1ZV92YWxpZF87IH0KKwor
ICBQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgdXNpbmcg
cHJvdG9fdXRpbHM6OlByb3RvV2lyZVR5cGU7CisKKyAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFko
IWN1cnJfdmFsdWVfdmFsaWRfKSkKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIGlmIChQRVJG
RVRUT19VTkxJS0VMWShyZWFkX3B0cl8gPT0gZGF0YV9lbmRfKSkgeworICAgICAgY3Vycl92YWx1
ZV92YWxpZF8gPSBmYWxzZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpZiAo
d2lyZV90eXBlID09IFByb3RvV2lyZVR5cGU6OmtWYXJJbnQpIHsKKyAgICAgIHVpbnQ2NF90IG5l
d192YWx1ZSA9IDA7CisgICAgICBjb25zdCB1aW50OF90KiBuZXdfcG9zID0KKyAgICAgICAgICBw
cm90b191dGlsczo6UGFyc2VWYXJJbnQocmVhZF9wdHJfLCBkYXRhX2VuZF8sICZuZXdfdmFsdWUp
OworCisgICAgICBpZiAoUEVSRkVUVE9fVU5MSUtFTFkobmV3X3BvcyA9PSByZWFkX3B0cl8pKSB7
CisgICAgICAgIC8vIEZhaWxlZCB0byBkZWNvZGUgdGhlIHZhcmludCAocHJvYmFibHkgaW5jb21w
bGV0ZSBidWZmZXIpLgorICAgICAgICAqcGFyc2VfZXJyb3JfID0gdHJ1ZTsKKyAgICAgICAgY3Vy
cl92YWx1ZV92YWxpZF8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRfcHRy
XyA9IG5ld19wb3M7CisgICAgICAgIGN1cnJfdmFsdWVfID0gc3RhdGljX2Nhc3Q8Q3BwVHlwZT4o
bmV3X3ZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8ga0ZpeGVkMzIgb3Iga0ZpeGVk
NjQKKyAgICAgIGNvbnN0ZXhwciBzaXplX3Qga1N0ZXAgPSB3aXJlX3R5cGUgPT0gUHJvdG9XaXJl
VHlwZTo6a0ZpeGVkMzIgPyA0IDogODsKKworICAgICAgLy8gTkI6IHRoZSByYXcgYnVmZmVyIGlz
IG5vdCBndWFyYW50ZWVkIHRvIGJlIGFsaWduZWQsIHNvIG5laXRoZXIgYXJlCisgICAgICAvLyB0
aGVzZSBjb3BpZXMuCisgICAgICBtZW1jcHkoJmN1cnJfdmFsdWVfLCByZWFkX3B0cl8sIHNpemVv
ZihDcHBUeXBlKSk7CisgICAgICByZWFkX3B0cl8gKz0ga1N0ZXA7CisgICAgfQorCisgICAgcmV0
dXJuICp0aGlzOworICB9CisKKyAgUGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yIG9wZXJhdG9y
KysoaW50KSB7CisgICAgUGFja2VkUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yIGl0KCp0aGlzKTsKKyAg
ICArKygqdGhpcyk7CisgICAgcmV0dXJuIGl0OworICB9CisKKyBwcml2YXRlOgorICAvLyBNaWdo
dCBiZSBudWxsIGlmIHRoZSBiYWNraW5nIHByb3RvIGZpZWxkIGlzbid0IHNldC4KKyAgY29uc3Qg
dWludDhfdCogY29uc3QgZGF0YV9lbmRfOworCisgIC8vIFRoZSBpdGVyYXRvciBsb29rcyBhaGVh
ZCBieSBhbiBlbGVtZW50LCBzbyB8Y3Vycl92YWx1ZXwgaG9sZHMgdGhlIHZhbHVlCisgIC8vIHRv
IGJlIHJldHVybmVkIHdoZW4gdGhlIGNhbGxlciBkZXJlZmVyZW5jZXMgdGhlIGl0ZXJhdG9yLCBh
bmQgfHJlYWRfcHRyX3wKKyAgLy8gcG9pbnRzIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBlbGVt
ZW50IHRvIGJlIGRlY29kZWQuCisgIC8vIHxyZWFkX3B0cl98IG1pZ2h0IGJlIG51bGwgaWYgdGhl
IGJhY2tpbmcgcHJvdG8gZmllbGQgaXNuJ3Qgc2V0LgorICBjb25zdCB1aW50OF90KiByZWFkX3B0
cl87CisgIENwcFR5cGUgY3Vycl92YWx1ZV8gPSAwOworCisgIC8vIFNldCB0byBmYWxzZSBvbmNl
IHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaXRlcmF0b3IsIG9yIGVuY291bnRlcmVkIGFuIGVycm9yLgor
ICBib29sIGN1cnJfdmFsdWVfdmFsaWRfID0gdHJ1ZTsKKworICAvLyBXaGVyZSB0byBzZXQgcGFy
c2luZyBlcnJvcnMsIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuCisgIGJvb2wqIGNvbnN0IHBhcnNl
X2Vycm9yXzsKK307CisKKy8vIFRoaXMgZGVjb2RlciBsb2FkcyBhbGwgZmllbGRzIHVwZnJvbnQs
IHdpdGhvdXQgcmVjdXJzaW5nIGluIG5lc3RlZCBtZXNzYWdlcy4KKy8vIEl0IGlzIHVzZWQgYXMg
YSBiYXNlIGNsYXNzIGZvciB0eXBlZCBkZWNvZGVycyBnZW5lcmF0ZWQgYnkgdGhlIHBiemVybyBw
bHVnaW4uCisvLyBUaGUgc3BsaXQgYmV0d2VlbiBUeXBlZFByb3RvRGVjb2RlckJhc2UgYW5kIFR5
cGVkUHJvdG9EZWNvZGVyPD4gaXMgdG8gaGF2ZQorLy8gdW5pcXVlIGRlZmluaXRpb24gb2YgZnVu
Y3Rpb25zIGxpa2UgUGFyc2VBbGxGaWVsZHMoKSBhbmQgRXhwYW5kSGVhcFN0b3JhZ2UoKS4KKy8v
IFRoZSBzdG9yYWdlIChlaXRoZXIgb24tc3RhY2sgb3Igb24taGVhcCkgZm9yIHRoaXMgY2xhc3Mg
aXMgb3JnYW5pemVkIGFzCisvLyBmb2xsb3dzOgorLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIGZpZWxkc18gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vIFsgZmllbGQgMCAoaW52YWxp
ZCkgXSBbIGZpZWxkcyAxIC4uIE4gXSBbIHJlcGVhdGVkIGZpZWxkcyBdCisvLyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgXgorLy8gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2ZpZWxkc18gICAgICAgIHNp
emVfCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgVHlwZWRQcm90b0RlY29kZXJCYXNlIDogcHVibGlj
IFByb3RvRGVjb2RlciB7CisgcHVibGljOgorICAvLyBJZiB0aGUgZmllbGQgfGlkfCBpcyBrbm93
biBhdCBjb21waWxlIHRpbWUsIHByZWZlciB0aGUgdGVtcGxhdGVkCisgIC8vIHNwZWNpYWxpemF0
aW9uIGF0PGtGaWVsZE51bWJlcj4oKS4KKyAgY29uc3QgRmllbGQmIEdldCh1aW50MzJfdCBpZCkg
Y29uc3QgeworICAgIHJldHVybiBQRVJGRVRUT19MSUtFTFkoaWQgPCBudW1fZmllbGRzXykgPyBm
aWVsZHNfW2lkXSA6IGZpZWxkc19bMF07CisgIH0KKworICAvLyBSZXR1cm5zIGFuIG9iamVjdCB0
aGF0IGFsbG93cyB0byBpdGVyYXRlIG92ZXIgYWxsIGluc3RhbmNlcyBvZiBhIHJlcGVhdGVkCisg
IC8vIGZpZWxkIGdpdmVuIGl0cyBpZC4gRXhhbXBsZSB1c2FnZToKKyAgLy8gICBmb3IgKGF1dG8g
aXQgPSBkZWNvZGVyLkdldFJlcGVhdGVkPGludDMyX3Q+KE4pOyBpdDsgKytpdCkgeyAuLi4gfQor
ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yPFQ+IEdldFJl
cGVhdGVkKHVpbnQzMl90IGZpZWxkX2lkKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcGVhdGVkRmll
bGRJdGVyYXRvcjxUPihmaWVsZF9pZCwgJmZpZWxkc19bbnVtX2ZpZWxkc19dLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkc19bc2l6ZV9dLCAmZmllbGRzX1tmaWVs
ZF9pZF0pOworICB9CisKKyAgLy8gUmV0dXJucyBhbiBvYmplY3RzIHRoYXQgYWxsb3dzIHRvIGl0
ZXJhdGUgb3ZlciBhbGwgZW50cmllcyBvZiBhIHBhY2tlZAorICAvLyByZXBlYXRlZCBmaWVsZCBn
aXZlbiBpdHMgaWQgYW5kIHR5cGUuIFRoZSB8d2lyZV90eXBlfCBpcyBuZWNlc3NhcnkgZm9yCisg
IC8vIGRlY29kaW5nIHRoZSBwYWNrZWQgZmllbGQsIHRoZSB8Y3BwX3R5cGV8IGlzIGZvciBjb252
ZW5pZW5jZSAmIHN0cm9uZ2VyCisgIC8vIHR5cGluZy4KKyAgLy8KKyAgLy8gVGhlIGNhbGxlciBt
dXN0IGFsc28gc3VwcGx5IGEgcG9pbnRlciB0byBhIGJvb2wgdGhhdCBpcyBzZXQgdG8gdHJ1ZSBp
ZiB0aGUKKyAgLy8gcGFja2VkIGJ1ZmZlciBpcyBmb3VuZCB0byBiZSBtYWxmb3JtZWQgd2hpbGUg
aXRlcmF0aW5nIChzbyB5b3UgbmVlZCB0bworICAvLyBleGhhdXN0IHRoZSBpdGVyYXRvciBpZiB5
b3Ugd2FudCB0byBjaGVjayB0aGUgZnVsbCBleHRlbnQgb2YgdGhlIGJ1ZmZlcikuCisgIC8vCisg
IC8vIE5vdGUgdGhhdCB1bmxpa2Ugc3RhbmRhcmQgcHJvdG9idWYgcGFyc2VycywgcHJvdG96ZXJv
IGRvZXMgbm90IGFsbG93CisgIC8vIHRyZWF0aW5nIG9mIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMg
YXMgbm9uLXBhY2tlZCBhbmQgdmljZS12ZXJzYSAodGhlcmVmb3JlCisgIC8vIG5vdCBtYWtpbmcg
dGhlIHBhY2tlZCBvcHRpb24gZm9yd2FyZHMgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlKS4gU28K
KyAgLy8gdGhlIGNhbGxlciBuZWVkcyB0byB1c2UgdGhlIHJpZ2h0IGFjY2Vzc29yIGZvciBjb3Jy
ZWN0IHJlc3VsdHMuCisgIHRlbXBsYXRlIDxwcm90b191dGlsczo6UHJvdG9XaXJlVHlwZSB3aXJl
X3R5cGUsIHR5cGVuYW1lIGNwcF90eXBlPgorICBQYWNrZWRSZXBlYXRlZEZpZWxkSXRlcmF0b3I8
d2lyZV90eXBlLCBjcHBfdHlwZT4gR2V0UGFja2VkUmVwZWF0ZWQoCisgICAgICB1aW50MzJfdCBm
aWVsZF9pZCwKKyAgICAgIGJvb2wqIHBhcnNlX2Vycm9yX2xvY2F0aW9uKSBjb25zdCB7CisgICAg
Y29uc3QgRmllbGQmIGZpZWxkID0gR2V0KGZpZWxkX2lkKTsKKyAgICBpZiAoZmllbGQudmFsaWQo
KSkgeworICAgICAgcmV0dXJuIFBhY2tlZFJlcGVhdGVkRmllbGRJdGVyYXRvcjx3aXJlX3R5cGUs
IGNwcF90eXBlPigKKyAgICAgICAgICBmaWVsZC5kYXRhKCksIGZpZWxkLnNpemUoKSwgcGFyc2Vf
ZXJyb3JfbG9jYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUGFja2VkUmVwZWF0
ZWRGaWVsZEl0ZXJhdG9yPHdpcmVfdHlwZSwgY3BwX3R5cGU+KAorICAgICAgICAgIG51bGxwdHIs
IDAsIHBhcnNlX2Vycm9yX2xvY2F0aW9uKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAg
VHlwZWRQcm90b0RlY29kZXJCYXNlKEZpZWxkKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAg
ICAgICAgdWludDMyX3QgbnVtX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQz
Ml90IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVm
ZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKKyAgICAgIDogUHJv
dG9EZWNvZGVyKGJ1ZmZlciwgbGVuZ3RoKSwKKyAgICAgICAgZmllbGRzXyhzdG9yYWdlKSwKKyAg
ICAgICAgbnVtX2ZpZWxkc18obnVtX2ZpZWxkcyksCisgICAgICAgIHNpemVfKG51bV9maWVsZHMp
LAorICAgICAgICBjYXBhY2l0eV8oY2FwYWNpdHkpIHsKKyAgICAvLyBUaGUgcmVhc29uIHdoeSBG
aWVsZCBuZWVkcyB0byBiZSB0cml2aWFsbHkgZGUvY29uc3RydWN0aWJsZSBpcyB0byBhdm9pZAor
ICAgIC8vIGltcGxpY2l0IGluaXRpYWxpemVycyBvbiBhbGwgdGhlIH4xMDAwIGVudHJpZXMuIFdl
IG5lZWQgaXQgdG8gaW5pdGlhbGl6ZQorICAgIC8vIG9ubHkgb24gdGhlIGZpcnN0IHxtYXhfZmll
bGRfaWR8IGZpZWxkcywgdGhlIHJlbWFpbmluZyBjYXBhY2l0eSBkb2Vzbid0CisgICAgLy8gcmVx
dWlyZSBpbml0aWFsaXphdGlvbi4KKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5
X2NvbnN0cnVjdGlibGU8RmllbGQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgIHN0
ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxGaWVsZD46OnZhbHVlICYmCisgICAgICAgICAg
ICAgICAgICAgICAgc3RkOjppc190cml2aWFsPEZpZWxkPjo6dmFsdWUsCisgICAgICAgICAgICAg
ICAgICAiRmllbGQgbXVzdCBiZSBhIHRyaXZpYWwgYWdncmVnYXRlIHR5cGUiKTsKKyAgICBtZW1z
ZXQoZmllbGRzXywgMCwgc2l6ZW9mKEZpZWxkKSAqIG51bV9maWVsZHNfKTsKKyAgfQorCisgIHZv
aWQgUGFyc2VBbGxGaWVsZHMoKTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGUgZGVmYXVsdCBvbi1z
dGFjayBzdG9yYWdlIGlzIGV4aGF1c3RlZCBhbmQgbmV3IHJlcGVhdGVkCisgIC8vIGZpZWxkcyBu
ZWVkIHRvIGJlIHB1c2hlZC4KKyAgdm9pZCBFeHBhbmRIZWFwU3RvcmFnZSgpOworCisgIC8vIFVz
ZWQgb25seSBpbiBwcmVzZW5jZSBvZiBhIGxhcmdlIG51bWJlciBvZiByZXBlYXRlZCBmaWVsZHMs
IHdoZW4gdGhlCisgIC8vIGRlZmF1bHQgb24tc3RhY2sgc3RvcmFnZSBpcyBleGhhdXN0ZWQuCisg
IHN0ZDo6dW5pcXVlX3B0cjxGaWVsZFtdPiBoZWFwX3N0b3JhZ2VfOworCisgIC8vIFBvaW50cyB0
byB0aGUgc3RvcmFnZSwgZWl0aGVyIG9uLXN0YWNrIChkZWZhdWx0LCBwcm92aWRlZCBieSB0aGUg
dGVtcGxhdGUKKyAgLy8gc3BlY2lhbGl6YXRpb24pIG9yIHxoZWFwX3N0b3JhZ2VffCBhZnRlciBF
eHBhbmRIZWFwU3RvcmFnZSgpIGlzIGNhbGxlZCwgaW4KKyAgLy8gY2FzZSBvZiBhIGxhcmdlIG51
bWJlciBvZiByZXBlYXRlZCBmaWVsZHMuCisgIEZpZWxkKiBmaWVsZHNfOworCisgIC8vIE51bWJl
ciBvZiBmaWVsZHMgd2l0aG91dCBhY2NvdW50aW5nIHJlcGVhdGVkIHN0b3JhZ2UuIFRoaXMgaXMg
ZXF1YWwgdG8KKyAgLy8gTUFYX0ZJRUxEX0lEICsgMSAodG8gYWNjb3VudCBmb3IgdGhlIGludmFs
aWQgMHRoIGZpZWxkKS4KKyAgLy8gVGhpcyB2YWx1ZSBpcyBhbHdheXMgPD0gc2l6ZV8gKGFuZCBo
ZW5jZSA8PSBjYXBhY2l0eSk7CisgIHVpbnQzMl90IG51bV9maWVsZHNfOworCisgIC8vIE51bWJl
ciBvZiBhY3RpdmUgfGZpZWxkc198IGVudHJpZXMuIFRoaXMgaXMgaW5pdGlhbGx5IGVxdWFsIHRv
IHRoZSBoaWdoZXN0CisgIC8vIG51bWJlciBvZiBmaWVsZHMgZm9yIHRoZSBtZXNzYWdlIChudW1f
ZmllbGRzXyA9PSBNQVhfRklFTERfSUQgKyAxKSBhbmQgY2FuCisgIC8vIGdyb3cgdXAgdG8gfGNh
cGFjaXR5X3wgaW4gdGhlIGNhc2Ugb2YgcmVwZWF0ZWQgZmllbGRzLgorICB1aW50MzJfdCBzaXpl
XzsKKworICAvLyBJbml0aWFsbHkgZXF1YWwgdG8ga0ZpZWxkc0NhcGFjaXR5IG9mIHRoZSBUeXBl
ZFByb3RvRGVjb2RlcgorICAvLyBzcGVjaWFsaXphdGlvbi4gQ2FuIGdyb3cgd2hlbiBmYWxsaW5n
IGJhY2sgb24gaGVhcC1iYXNlZCBzdG9yYWdlLCBpbiB3aGljaAorICAvLyBjYXNlIGl0IHJlcHJl
c2VudHMgdGhlIHNpemUgKCNmaWVsZHMgd2l0aCBlYWNoIGVudHJ5IG9mIGEgcmVwZWF0ZWQgZmll
bGQKKyAgLy8gY291bnRlZCBpbmRpdmlkdWFsbHkpIG9mIHRoZSB8aGVhcF9zdG9yYWdlX3wgYXJy
YXkuCisgIHVpbnQzMl90IGNhcGFjaXR5XzsKK307CisKKy8vIFRlbXBsYXRlIGNsYXNzIGluc3Rh
bnRpYXRlZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgZGVjb2RlciBjbGFzc2VzIGRlY2xhcmVkIGlu
CisvLyB4eHgucGJ6ZXJvLmggZmlsZXMuCit0ZW1wbGF0ZSA8aW50IE1BWF9GSUVMRF9JRCwgYm9v
bCBIQVNfTk9OUEFDS0VEX1JFUEVBVEVEX0ZJRUxEUz4KK2NsYXNzIFR5cGVkUHJvdG9EZWNvZGVy
IDogcHVibGljIFR5cGVkUHJvdG9EZWNvZGVyQmFzZSB7CisgcHVibGljOgorICBUeXBlZFByb3Rv
RGVjb2Rlcihjb25zdCB1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCisgICAgICA6IFR5
cGVkUHJvdG9EZWNvZGVyQmFzZShvbl9zdGFja19zdG9yYWdlXywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8qbnVtX2ZpZWxkcz0qL01BWF9GSUVMRF9JRCArIDEsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpIHsKKyAg
ICBzdGF0aWNfYXNzZXJ0KE1BWF9GSUVMRF9JRCA8PSBrTWF4RGVjb2RlckZpZWxkSWQsICJGaWVs
ZCBvcmRpbmFsIHRvbyBoaWdoIik7CisgICAgVHlwZWRQcm90b0RlY29kZXJCYXNlOjpQYXJzZUFs
bEZpZWxkcygpOworICB9CisKKyAgdGVtcGxhdGUgPHVpbnQzMl90IEZJRUxEX0lEPgorICBjb25z
dCBGaWVsZCYgYXQoKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydChGSUVMRF9JRCA8PSBNQVhf
RklFTERfSUQsICJGSUVMRF9JRCA+IE1BWF9GSUVMRF9JRCIpOworICAgIHJldHVybiBmaWVsZHNf
W0ZJRUxEX0lEXTsKKyAgfQorCisgIFR5cGVkUHJvdG9EZWNvZGVyKFR5cGVkUHJvdG9EZWNvZGVy
JiYgb3RoZXIpIG5vZXhjZXB0CisgICAgICA6IFR5cGVkUHJvdG9EZWNvZGVyQmFzZShzdGQ6Om1v
dmUob3RoZXIpKSB7CisgICAgLy8gSWYgdGhlIG1vdmVkLWZyb20gZGVjb2RlciB3YXMgdXNpbmcg
b24tc3RhY2sgc3RvcmFnZSwgd2UgbmVlZCB0byB1cGRhdGUKKyAgICAvLyBvdXIgcG9pbnRlciB0
byBwb2ludCB0byB0aGlzIGRlY29kZXIncyBvbi1zdGFjayBzdG9yYWdlLgorICAgIGlmIChmaWVs
ZHNfID09IG90aGVyLm9uX3N0YWNrX3N0b3JhZ2VfKSB7CisgICAgICBmaWVsZHNfID0gb25fc3Rh
Y2tfc3RvcmFnZV87CisgICAgICBtZW1jcHkob25fc3RhY2tfc3RvcmFnZV8sIG90aGVyLm9uX3N0
YWNrX3N0b3JhZ2VfLAorICAgICAgICAgICAgIHNpemVvZihvbl9zdGFja19zdG9yYWdlXykpOwor
ICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSW4gdGhlIGNhc2Ugb2Ygbm9uLXJlcGVhdGVk
IGZpZWxkcywgdGhpcyBjb25zdGFudCBkZWZpbmVzIHRoZSBoaWdoZXN0IGZpZWxkCisgIC8vIGlk
IHdlIGFyZSBhYmxlIHRvIGRlY29kZS4gVGhpcyBpcyB0byBsaW1pdCB0aGUgb24tc3RhY2sgc3Rv
cmFnZS4KKyAgLy8gSW4gdGhlIGNhc2Ugb2YgcmVwZWF0ZWQgZmllbGRzLCB0aGlzIGNvbnN0YW50
IGRlZmluZXMgdGhlIG1heCBudW1iZXIgb2YKKyAgLy8gcmVwZWF0ZWQgZmllbGRzIHRoYXQgd2Un
bGwgYmUgYWJsZSB0byBzdG9yZSBiZWZvcmUgZmFsbGluZyBiYWNrIG9uIHRoZQorICAvLyBoZWFw
LiBLZWVwIHRoaXMgdmFsdWUgaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gcHJvdG96ZXJvX2dlbmVy
YXRvci5jYy4KKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heERlY29kZXJGaWVsZElkID0g
OTk5OworCisgIC8vIElmIHdlIHRoZSBtZXNzYWdlIGhhcyBubyByZXBlYXRlZCBmaWVsZHMgd2Ug
bmVlZCBhdCBtb3N0IE4gRmllbGQgZW50cmllcworICAvLyBpbiB0aGUgb24tc3RhY2sgc3RvcmFn
ZSwgd2hlcmUgTiBpcyB0aGUgaGlnaGVzdCBmaWVsZCBpZC4KKyAgLy8gT3RoZXJ3aXNlIHdlIG5l
ZWQgc29tZSByb29tIHRvIHN0b3JlIHJlcGVhdGVkIGZpZWxkcy4KKyAgc3RhdGljIGNvbnN0ZXhw
ciBzaXplX3Qga0NhcGFjaXR5ID0KKyAgICAgIDEgKyAoSEFTX05PTlBBQ0tFRF9SRVBFQVRFRF9G
SUVMRFMgPyBrTWF4RGVjb2RlckZpZWxkSWQgOiBNQVhfRklFTERfSUQpOworCisgIEZpZWxkIG9u
X3N0YWNrX3N0b3JhZ2VfW2tDYXBhY2l0eV07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96
ZXJvCisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUFJPVE9fREVDT0RF
Ul9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9w
cm90b3plcm8vcHJvdG9fdXRpbHMuaAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5k
cm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNo
ZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1
c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZ
b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6
Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1
aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUK
KyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkg
S0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0
YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5DTFVERV9QRVJGRVRU
T19QUk9UT1pFUk9fUFJPVE9fVVRJTFNfSF8KKyNkZWZpbmUgSU5DTFVERV9QRVJGRVRUT19QUk9U
T1pFUk9fUFJPVE9fVVRJTFNfSF8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8
c3RkZGVmLmg+CisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLy8gZ2VuX2FtYWxnYW1hdGVk
IGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9sb2dnaW5nLmgiCisKK25hbWVzcGFj
ZSBwcm90b3plcm8geworbmFtZXNwYWNlIHByb3RvX3V0aWxzIHsKKworLy8gU2VlIGh0dHBzOi8v
ZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZyB3aXJl
IHR5cGVzLgorLy8gVGhpcyBpcyBhIHR5cGUgZW5jb2RlZCBpbnRvIHRoZSBwcm90byB0aGF0IHBy
b3ZpZGVzIGp1c3QgZW5vdWdoIGluZm8gdG8KKy8vIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgZm9s
bG93aW5nIHZhbHVlLgorZW51bSBjbGFzcyBQcm90b1dpcmVUeXBlIDogdWludDMyX3QgeworICBr
VmFySW50ID0gMCwKKyAga0ZpeGVkNjQgPSAxLAorICBrTGVuZ3RoRGVsaW1pdGVkID0gMiwKKyAg
a0ZpeGVkMzIgPSA1LAorfTsKKworLy8gVGhpcyBpcyB0aGUgdHlwZSBkZWZpbmVkIGluIHRoZSBw
cm90byBmb3IgZWFjaCBmaWVsZC4gVGhpcyBpbmZvcm1hdGlvbgorLy8gaXMgdXNlZCB0byBkZWNp
ZGUgdGhlIHRyYW5zbGF0aW9uIHN0cmF0ZWd5IHdoZW4gd3JpdGluZyB0aGUgdHJhY2UuCitlbnVt
IGNsYXNzIFByb3RvU2NoZW1hVHlwZSB7CisgIGtVbmtub3duID0gMCwKKyAga0RvdWJsZSwKKyAg
a0Zsb2F0LAorICBrSW50NjQsCisgIGtVaW50NjQsCisgIGtJbnQzMiwKKyAga0ZpeGVkNjQsCisg
IGtGaXhlZDMyLAorICBrQm9vbCwKKyAga1N0cmluZywKKyAga0dyb3VwLCAgLy8gRGVwcmVjYXRl
ZCAocHJvdG8yIG9ubHkpCisgIGtNZXNzYWdlLAorICBrQnl0ZXMsCisgIGtVaW50MzIsCisgIGtF
bnVtLAorICBrU2ZpeGVkMzIsCisgIGtTZml4ZWQ2NCwKKyAga1NpbnQzMiwKKyAga1NpbnQ2NCwK
K307CisKK2lubGluZSBjb25zdCBjaGFyKiBQcm90b1NjaGVtYVRvU3RyaW5nKFByb3RvU2NoZW1h
VHlwZSB2KSB7CisgIHN3aXRjaCAodikgeworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprVW5r
bm93bjoKKyAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6
OmtEb3VibGU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5
cGU6OmtGbG9hdDoKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgUHJvdG9TY2hlbWFU
eXBlOjprSW50NjQ6CisgICAgICByZXR1cm4gImludDY0IjsKKyAgICBjYXNlIFByb3RvU2NoZW1h
VHlwZTo6a1VpbnQ2NDoKKyAgICAgIHJldHVybiAidWludDY0IjsKKyAgICBjYXNlIFByb3RvU2No
ZW1hVHlwZTo6a0ludDMyOgorICAgICAgcmV0dXJuICJpbnQzMiI7CisgICAgY2FzZSBQcm90b1Nj
aGVtYVR5cGU6OmtGaXhlZDY0OgorICAgICAgcmV0dXJuICJmaXhlZDY0IjsKKyAgICBjYXNlIFBy
b3RvU2NoZW1hVHlwZTo6a0ZpeGVkMzI6CisgICAgICByZXR1cm4gImZpeGVkMzIiOworICAgIGNh
c2UgUHJvdG9TY2hlbWFUeXBlOjprQm9vbDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2Fz
ZSBQcm90b1NjaGVtYVR5cGU6OmtTdHJpbmc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAg
Y2FzZSBQcm90b1NjaGVtYVR5cGU6OmtHcm91cDoKKyAgICAgIHJldHVybiAiZ3JvdXAiOworICAg
IGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprTWVzc2FnZToKKyAgICAgIHJldHVybiAibWVzc2FnZSI7
CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtCeXRlczoKKyAgICAgIHJldHVybiAiYnl0ZXMi
OworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprVWludDMyOgorICAgICAgcmV0dXJuICJ1aW50
MzIiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprRW51bToKKyAgICAgIHJldHVybiAiZW51
bSI7CisgICAgY2FzZSBQcm90b1NjaGVtYVR5cGU6OmtTZml4ZWQzMjoKKyAgICAgIHJldHVybiAi
c2ZpeGVkMzIiOworICAgIGNhc2UgUHJvdG9TY2hlbWFUeXBlOjprU2ZpeGVkNjQ6CisgICAgICBy
ZXR1cm4gInNmaXhlZDY0IjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlwZTo6a1NpbnQzMjoKKyAg
ICAgIHJldHVybiAic2ludDMyIjsKKyAgICBjYXNlIFByb3RvU2NoZW1hVHlwZTo6a1NpbnQ2NDoK
KyAgICAgIHJldHVybiAic2ludDY0IjsKKyAgfQorICAvLyBGb3IgZ2NjOgorICBQRVJGRVRUT19E
Q0hFQ0soZmFsc2UpOworICByZXR1cm4gIiI7Cit9CisKKy8vIE1heGltdW0gbWVzc2FnZSBzaXpl
IHN1cHBvcnRlZDogMjU2IE1pQiAoNCB4IDctYml0IGR1ZSB0byB2YXJpbnQgZW5jb2RpbmcpLgor
Y29uc3RleHByIHNpemVfdCBrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZSA9IDQ7Citjb25zdGV4cHIg
c2l6ZV90IGtNYXhNZXNzYWdlTGVuZ3RoID0gKDF1IDw8IChrTWVzc2FnZUxlbmd0aEZpZWxkU2l6
ZSAqIDcpKSAtIDE7CisKKy8vIEZpZWxkIHRhZyBpcyBlbmNvZGVkIGFzIDMyLWJpdCB2YXJpbnQg
KDUgYnl0ZXMgYXQgbW9zdCkuCisvLyBMYXJnZXN0IHZhbHVlIG9mIHNpbXBsZSAobm90IGxlbmd0
aC1kZWxpbWl0ZWQpIGZpZWxkIGlzIDY0LWJpdCB2YXJpbnQKKy8vICgxMCBieXRlcyBhdCBtb3N0
KS4gMTUgYnl0ZXMgYnVmZmVyIGlzIGVub3VnaCB0byBzdG9yZSBhIHNpbXBsZSBmaWVsZC4KK2Nv
bnN0ZXhwciBzaXplX3Qga01heFRhZ0VuY29kZWRTaXplID0gNTsKK2NvbnN0ZXhwciBzaXplX3Qg
a01heFNpbXBsZUZpZWxkRW5jb2RlZFNpemUgPSBrTWF4VGFnRW5jb2RlZFNpemUgKyAxMDsKKwor
Ly8gUHJvdG8gdHlwZXM6IChpbnR8dWludHxzaW50KSgzMnw2NCksIGJvb2wsIGVudW0uCitjb25z
dGV4cHIgdWludDMyX3QgTWFrZVRhZ1ZhckludCh1aW50MzJfdCBmaWVsZF9pZCkgeworICByZXR1
cm4gKGZpZWxkX2lkIDw8IDMpIHwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFByb3RvV2lyZVR5cGU6
OmtWYXJJbnQpOworfQorCisvLyBQcm90byB0eXBlczogZml4ZWQ2NCwgc2ZpeGVkNjQsIGZpeGVk
MzIsIHNmaXhlZDMyLCBkb3VibGUsIGZsb2F0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25z
dGV4cHIgdWludDMyX3QgTWFrZVRhZ0ZpeGVkKHVpbnQzMl90IGZpZWxkX2lkKSB7CisgIHN0YXRp
Y19hc3NlcnQoc2l6ZW9mKFQpID09IDggfHwgc2l6ZW9mKFQpID09IDQsICJWYWx1ZSBtdXN0IGJl
IDQgb3IgOCBieXRlcyIpOworICByZXR1cm4gKGZpZWxkX2lkIDw8IDMpIHwKKyAgICAgICAgIHN0
YXRpY19jYXN0PHVpbnQzMl90Pigoc2l6ZW9mKFQpID09IDggPyBQcm90b1dpcmVUeXBlOjprRml4
ZWQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBy
b3RvV2lyZVR5cGU6OmtGaXhlZDMyKSk7Cit9CisKKy8vIFByb3RvIHR5cGVzOiBzdHJpbmcsIGJ5
dGVzLCBlbWJlZGRlZCBtZXNzYWdlcy4KK2NvbnN0ZXhwciB1aW50MzJfdCBNYWtlVGFnTGVuZ3Ro
RGVsaW1pdGVkKHVpbnQzMl90IGZpZWxkX2lkKSB7CisgIHJldHVybiAoZmllbGRfaWQgPDwgMykg
fAorICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFByb3RvV2lyZVR5cGU6OmtMZW5ndGhE
ZWxpbWl0ZWQpOworfQorCisvLyBQcm90byB0eXBlczogc2ludDY0LCBzaW50MzIuCit0ZW1wbGF0
ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8VD46OnR5
cGUgWmlnWmFnRW5jb2RlKFQgdmFsdWUpIHsKKyAgdXNpbmcgVW5zaWduZWRUeXBlID0gdHlwZW5h
bWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlOworCisgIC8vIFJpZ2h0LXNoaWZ0IG9mIG5l
Z2F0aXZlIHZhbHVlcyBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKyAgLy8gQXNzZXJ0IHRo
ZSBpbXBsZW1lbnRhdGlvbiBkb2VzIHdoYXQgd2UgZXhwZWN0LCB3aGljaCBpcyB0aGF0IHNoaWZ0
aW5nIGFueQorICAvLyBwb3NpdGl2ZSB2YWx1ZSBieSBzaXplb2YoVCkgKiA4IC0gMSBnaXZlcyBh
biBhbGwgMCBiaXRtYXAsIGFuZCBhIG5lZ2F0aXZlCisgIC8vIHZhbHVlIGdpdmVzIGFuZCBhbGwg
MSBiaXRtYXAuCisgIGNvbnN0ZXhwciB1aW50NjRfdCBrVW5zaWduZWRaZXJvID0gMHU7CisgIGNv
bnN0ZXhwciBpbnQ2NF90IGtOZWdhdGl2ZU9uZSA9IC0xOworICBjb25zdGV4cHIgaW50NjRfdCBr
UG9zaXRpdmVPbmUgPSAxOworICBzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PHVpbnQ2NF90Pihr
TmVnYXRpdmVPbmUgPj4gNjMpID09IH5rVW5zaWduZWRaZXJvLAorICAgICAgICAgICAgICAgICJp
bXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFzc3VtZWQgcmlnaHRzaGlmdCIpOworICBz
dGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PHVpbnQ2NF90PihrUG9zaXRpdmVPbmUgPj4gNjMpID09
IGtVbnNpZ25lZFplcm8sCisgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uIGRvZXMgbm90
IHN1cHBvcnQgYXNzdW1lZCByaWdodHNoaWZ0Iik7CisKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDxV
bnNpZ25lZFR5cGU+KHZhbHVlKSA8PCAxKSBeCisgICAgICAgICBzdGF0aWNfY2FzdDxVbnNpZ25l
ZFR5cGU+KHZhbHVlID4+IChzaXplb2YoVCkgKiA4IC0gMSkpOworfQorCisvLyBQcm90byB0eXBl
czogc2ludDY0LCBzaW50MzIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB0eXBlbmFt
ZSBzdGQ6Om1ha2Vfc2lnbmVkPFQ+Ojp0eXBlIFppZ1phZ0RlY29kZShUIHZhbHVlKSB7CisgIHVz
aW5nIFVuc2lnbmVkVHlwZSA9IHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZTsK
KyAgYXV0byB1X3ZhbHVlID0gc3RhdGljX2Nhc3Q8VW5zaWduZWRUeXBlPih2YWx1ZSk7CisgIHJl
dHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6Om1ha2Vfc2lnbmVkPFQ+Ojp0eXBlPigKKyAg
ICAgICgodV92YWx1ZSA+PiAxKSBeIC0odV92YWx1ZSAmIDEpKSk7Cit9CisKK3RlbXBsYXRlIDx0
eXBlbmFtZSBUPgoraW5saW5lIHVpbnQ4X3QqIFdyaXRlVmFySW50KFQgdmFsdWUsIHVpbnQ4X3Qq
IHRhcmdldCkgeworICAvLyBJZiB2YWx1ZSBpcyA8PSAwIHdlIG11c3QgZmlyc3Qgc2lnbiBleHRl
bmQgdG8gaW50NjRfdCAoc2VlIFsxXSkuCisgIC8vIEZpbmFsbHkgd2UgYWx3YXlzIGNhc3QgdG8g
YW4gdW5zaWduZWQgdmFsdWUgdG8gdG8gYXZvaWQgYXJpdGhtZXRpYworICAvLyAoc2lnbiBleHBh
bmRpbmcpIHNoaWZ0cyBpbiB0aGUgd2hpbGUgbG9vcC4KKyAgLy8gWzFdOiAiSWYgeW91IHVzZSBp
bnQzMiBvciBpbnQ2NCBhcyB0aGUgdHlwZSBmb3IgYSBuZWdhdGl2ZSBudW1iZXIsIHRoZQorICAv
LyByZXN1bHRpbmcgdmFyaW50IGlzIGFsd2F5cyB0ZW4gYnl0ZXMgbG9uZyIuCisgIC8vIC0gZGV2
ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZworICAvLyBT
byBmb3IgZWFjaCBpbnB1dCB0eXBlIHdlIGRvIHRoZSBmb2xsb3dpbmcgY2FzdHM6CisgIC8vIHVp
bnRYX3QgLT4gdWludFhfdCAtPiB1aW50WF90CisgIC8vIGludDhfdCAgLT4gaW50NjRfdCAtPiB1
aW50NjRfdAorICAvLyBpbnQxNl90IC0+IGludDY0X3QgLT4gdWludDY0X3QKKyAgLy8gaW50MzJf
dCAtPiBpbnQ2NF90IC0+IHVpbnQ2NF90CisgIC8vIGludDY0X3QgLT4gaW50NjRfdCAtPiB1aW50
NjRfdAorICB1c2luZyBNYXliZUV4dGVuZGVkVHlwZSA9CisgICAgICB0eXBlbmFtZSBzdGQ6OmNv
bmRpdGlvbmFsPHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLCBULCBpbnQ2NF90Pjo6dHlwZTsK
KyAgdXNpbmcgVW5zaWduZWRUeXBlID0gdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPE1heWJl
RXh0ZW5kZWRUeXBlPjo6dHlwZTsKKworICBNYXliZUV4dGVuZGVkVHlwZSBleHRlbmRlZF92YWx1
ZSA9IHN0YXRpY19jYXN0PE1heWJlRXh0ZW5kZWRUeXBlPih2YWx1ZSk7CisgIFVuc2lnbmVkVHlw
ZSB1bnNpZ25lZF92YWx1ZSA9IHN0YXRpY19jYXN0PFVuc2lnbmVkVHlwZT4oZXh0ZW5kZWRfdmFs
dWUpOworCisgIHdoaWxlICh1bnNpZ25lZF92YWx1ZSA+PSAweDgwKSB7CisgICAgKnRhcmdldCsr
ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odW5zaWduZWRfdmFsdWUpIHwgMHg4MDsKKyAgICB1bnNp
Z25lZF92YWx1ZSA+Pj0gNzsKKyAgfQorICAqdGFyZ2V0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4o
dW5zaWduZWRfdmFsdWUpOworICByZXR1cm4gdGFyZ2V0ICsgMTsKK30KKworLy8gV3JpdGVzIGEg
Zml4ZWQtc2l6ZSByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHx2YWx1ZXwuIFRoaXMg
aXMKKy8vIHVzZWQgdG8gYmFja2ZpbGwgZml4ZWQtc2l6ZSByZXNlcnZhdGlvbnMgZm9yIHRoZSBs
ZW5ndGggZmllbGQgdXNpbmcgYQorLy8gbm9uLWNhbm9uaWNhbCB2YXJpbnQgZW5jb2RpbmcgKGUu
Zy4gXHg4MVx4ODBceDgwXHgwMCBpbnN0ZWFkIG9mIFx4MDEpLgorLy8gU2VlIGh0dHBzOi8vZ2l0
aHViLmNvbS9nb29nbGUvcHJvdG9idWYvaXNzdWVzLzE1MzAuCisvLyBJbiBwYXJ0aWN1bGFyLCB0
aGlzIGlzIHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlcy4gVGhlIHNpemUgb2YgYSBuZXN0ZWQgbWVz
c2FnZQorLy8gaXMgbm90IGtub3duIHVudGlsIGFsbCBpdHMgZmllbGQgaGF2ZSBiZWVuIHdyaXR0
ZW4uIHxrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZXwKKy8vIGJ5dGVzIGFyZSByZXNlcnZlZCB0byBl
bmNvZGUgdGhlIHNpemUgZmllbGQgYW5kIGJhY2tmaWxsZWQgYXQgdGhlIGVuZC4KK2lubGluZSB2
b2lkIFdyaXRlUmVkdW5kYW50VmFySW50KHVpbnQzMl90IHZhbHVlLCB1aW50OF90KiBidWYpIHsK
KyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWVzc2FnZUxlbmd0aEZpZWxkU2l6ZTsgKytpKSB7
CisgICAgY29uc3QgdWludDhfdCBtc2IgPSAoaSA8IGtNZXNzYWdlTGVuZ3RoRmllbGRTaXplIC0g
MSkgPyAweDgwIDogMDsKKyAgICBidWZbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YWx1ZSkg
fCBtc2I7CisgICAgdmFsdWUgPj49IDc7CisgIH0KK30KKwordGVtcGxhdGUgPHVpbnQzMl90IGZp
ZWxkX2lkPgordm9pZCBTdGF0aWNBc3NlcnRTaW5nbGVCeXRlUHJlYW1ibGUoKSB7CisgIHN0YXRp
Y19hc3NlcnQoZmllbGRfaWQgPCAxNiwKKyAgICAgICAgICAgICAgICAiUHJvdG8gZmllbGQgaWQg
dG9vIGJpZyB0byBmaXQgaW4gYSBzaW5nbGUgYnl0ZSBwcmVhbWJsZSIpOworfQorCisvLyBQYXJz
ZXMgYSBWYXJJbnQgZnJvbSB0aGUgZW5jb2RlZCBidWZmZXIgW3N0YXJ0LCBlbmQpLiB8ZW5kfCBp
cyBTVEwtc3R5bGUgYW5kCisvLyBwb2ludHMgb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIGJ1ZmZl
ci4KKy8vIFRoZSBwYXJzZWQgaW50IHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgb3V0cHV0IGFyZyB8
dmFsdWV8LiBSZXR1cm5zIGEgcG9pbnRlcgorLy8gdG8gdGhlIG5leHQgdW5jb25zdW1lZCBieXRl
IChzbyBzdGFydCA8IHJldHZhbCA8PSBlbmQpIG9yIHxzdGFydHwgaWYgdGhlCisvLyBWYXJJbnQg
Y291bGQgbm90IGJlIGZ1bGx5IHBhcnNlZCBiZWNhdXNlIHRoZXJlIHdhcyBub3QgZW5vdWdoIHNw
YWNlIGluIHRoZQorLy8gYnVmZmVyLgoraW5saW5lIGNvbnN0IHVpbnQ4X3QqIFBhcnNlVmFySW50
KGNvbnN0IHVpbnQ4X3QqIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IHVpbnQ4X3QqIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1
aW50NjRfdCogb3V0X3ZhbHVlKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHBvcyA9IHN0YXJ0OworICB1
aW50NjRfdCB2YWx1ZSA9IDA7CisgIGZvciAodWludDMyX3Qgc2hpZnQgPSAwOyBwb3MgPCBlbmQg
JiYgc2hpZnQgPCA2NHU7IHNoaWZ0ICs9IDcpIHsKKyAgICAvLyBDYWNoZSAqcG9zIGludG8gfGN1
cl9ieXRlfCB0byBwcmV2ZW50IHRoYXQgdGhlIGNvbXBpbGVyIGRlcmVmZXJlbmNlcyB0aGUKKyAg
ICAvLyBwb2ludGVyIHR3aWNlIChoZXJlIGFuZCBpbiB0aGUgaWYoKSBiZWxvdykgZHVlIHRvIGNo
YXIqIGFsaWFzaW5nIHJ1bGVzLgorICAgIHVpbnQ4X3QgY3VyX2J5dGUgPSAqcG9zKys7CisgICAg
dmFsdWUgfD0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGN1cl9ieXRlICYgMHg3ZikgPDwgc2hpZnQ7
CisgICAgaWYgKChjdXJfYnl0ZSAmIDB4ODApID09IDApIHsKKyAgICAgIC8vIEluIHZhbGlkIGNh
c2VzIHdlIGdldCBoZXJlLgorICAgICAgKm91dF92YWx1ZSA9IHZhbHVlOworICAgICAgcmV0dXJu
IHBvczsKKyAgICB9CisgIH0KKyAgKm91dF92YWx1ZSA9IDA7CisgIHJldHVybiBzdGFydDsKK30K
KworfSAgLy8gbmFtZXNwYWNlIHByb3RvX3V0aWxzCit9ICAvLyBuYW1lc3BhY2UgcHJvdG96ZXJv
CisKKyNlbmRpZiAgLy8gSU5DTFVERV9QRVJGRVRUT19QUk9UT1pFUk9fUFJPVE9fVVRJTFNfSF8K
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6IGluY2x1ZGUvcGVyZmV0dG8vcHJvdG96
ZXJvL3NjYXR0ZXJlZF9oZWFwX2J1ZmZlci5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRo
ZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUg
QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkg
bm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4K
KyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAg
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNz
IHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0
d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24g
YW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9G
IEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNl
IGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICog
bGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BF
UkZFVFRPX1BST1RPWkVST19TQ0FUVEVSRURfSEVBUF9CVUZGRVJfSF8KKyNkZWZpbmUgSU5DTFVE
RV9QRVJGRVRUT19QUk9UT1pFUk9fU0NBVFRFUkVEX0hFQVBfQlVGRkVSX0hfCisKKyNpbmNsdWRl
IDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9leHBvcnQuaCIK
Ky8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRvL2Jhc2UvbG9n
Z2luZy5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8v
cHJvdG96ZXJvL3NjYXR0ZXJlZF9zdHJlYW1fd3JpdGVyLmgiCisKK25hbWVzcGFjZSBwcm90b3pl
cm8geworCitjbGFzcyBNZXNzYWdlOworCitjbGFzcyBQRVJGRVRUT19FWFBPUlQgU2NhdHRlcmVk
SGVhcEJ1ZmZlcgorICAgIDogcHVibGljIHByb3RvemVybzo6U2NhdHRlcmVkU3RyZWFtV3JpdGVy
OjpEZWxlZ2F0ZSB7CisgcHVibGljOgorICBjbGFzcyBQRVJGRVRUT19FWFBPUlQgU2xpY2Ugewor
ICAgcHVibGljOgorICAgIFNsaWNlKCk7CisgICAgZXhwbGljaXQgU2xpY2Uoc2l6ZV90IHNpemUp
OworICAgIFNsaWNlKFNsaWNlJiYgc2xpY2UpIG5vZXhjZXB0OworICAgIH5TbGljZSgpOworICAg
IFNsaWNlJiBvcGVyYXRvcj0oU2xpY2UmJik7CisKKyAgICBpbmxpbmUgcHJvdG96ZXJvOjpDb250
aWd1b3VzTWVtb3J5UmFuZ2UgR2V0VG90YWxSYW5nZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB7
YnVmZmVyXy5nZXQoKSwgYnVmZmVyXy5nZXQoKSArIHNpemVffTsKKyAgICB9CisKKyAgICBpbmxp
bmUgcHJvdG96ZXJvOjpDb250aWd1b3VzTWVtb3J5UmFuZ2UgR2V0VXNlZFJhbmdlKCkgY29uc3Qg
eworICAgICAgcmV0dXJuIHtidWZmZXJfLmdldCgpLCBidWZmZXJfLmdldCgpICsgc2l6ZV8gLSB1
bnVzZWRfYnl0ZXNffTsKKyAgICB9CisKKyAgICB1aW50OF90KiBzdGFydCgpIGNvbnN0IHsgcmV0
dXJuIGJ1ZmZlcl8uZ2V0KCk7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNp
emVfOyB9CisgICAgc2l6ZV90IHVudXNlZF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIHVudXNlZF9i
eXRlc187IH0KKyAgICB2b2lkIHNldF91bnVzZWRfYnl0ZXMoc2l6ZV90IHVudXNlZF9ieXRlcykg
eworICAgICAgUEVSRkVUVE9fRENIRUNLKHVudXNlZF9ieXRlc18gPD0gc2l6ZV8pOworICAgICAg
dW51c2VkX2J5dGVzXyA9IHVudXNlZF9ieXRlczsKKyAgICB9CisKKyAgICB2b2lkIENsZWFyKCk7
CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYnVmZmVyXzsK
KyAgICBzaXplX3Qgc2l6ZV87CisgICAgc2l6ZV90IHVudXNlZF9ieXRlc187CisgIH07CisKKyAg
U2NhdHRlcmVkSGVhcEJ1ZmZlcihzaXplX3QgaW5pdGlhbF9zbGljZV9zaXplX2J5dGVzID0gMTI4
LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhpbXVtX3NsaWNlX3NpemVfYnl0ZXMg
PSAxMjggKiAxMDI0KTsKKyAgflNjYXR0ZXJlZEhlYXBCdWZmZXIoKSBvdmVycmlkZTsKKworICAv
LyBwcm90b3plcm86OlNjYXR0ZXJlZFN0cmVhbVdyaXRlcjo6RGVsZWdhdGUgaW1wbGVtZW50YXRp
b24uCisgIHByb3RvemVybzo6Q29udGlndW91c01lbW9yeVJhbmdlIEdldE5ld0J1ZmZlcigpIG92
ZXJyaWRlOworCisgIC8vIFN0aXRjaCBhbGwgdGhlIHNsaWNlcyBpbnRvIGEgc2luZ2xlIGNvbnRp
Z3VvdXMgYnVmZmVyLgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTdGl0Y2hTbGljZXMoKTsKKwor
ICAvLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHJhbmdlcyBwb2ludCBiYWNrIHRvIHRoaXMgYnVm
ZmVyIGFuZCB0aHVzIGNhbm5vdAorICAvLyBvdXRsaXZlIGl0LgorICBzdGQ6OnZlY3Rvcjxwcm90
b3plcm86OkNvbnRpZ3VvdXNNZW1vcnlSYW5nZT4gR2V0UmFuZ2VzKCk7CisKKyAgY29uc3Qgc3Rk
Ojp2ZWN0b3I8U2xpY2U+JiBzbGljZXMoKSBjb25zdCB7IHJldHVybiBzbGljZXNfOyB9CisKKyAg
dm9pZCBzZXRfd3JpdGVyKHByb3RvemVybzo6U2NhdHRlcmVkU3RyZWFtV3JpdGVyKiB3cml0ZXIp
IHsKKyAgICB3cml0ZXJfID0gd3JpdGVyOworICB9CisKKyAgLy8gVXBkYXRlIHVudXNlZF9ieXRl
cygpIG9mIHRoZSBjdXJyZW50IHxTbGljZXwgYmFzZWQgb24gdGhlIHdyaXRlcidzIHN0YXRlLgor
ICB2b2lkIEFkanVzdFVzZWRTaXplT2ZDdXJyZW50U2xpY2UoKTsKKworICAvLyBSZXR1cm5zIHRo
ZSB0b3RhbCBzaXplIHRoZSBzbGljZXMgb2NjdXB5IGluIGhlYXAgbWVtb3J5IChpbmNsdWRpbmcg
dW51c2VkKS4KKyAgc2l6ZV90IEdldFRvdGFsU2l6ZSgpOworCisgIC8vIFJlc2V0IHRoZSBjb250
ZW50cyBvZiB0aGlzIGJ1ZmZlciBidXQgcmV0YWluIG9uZSBzbGljZSBhbGxvY2F0aW9uIChpZiBp
dAorICAvLyBleGlzdHMpIHRvIGJlIHJldXNlZCBmb3IgZnV0dXJlIHdyaXRlcy4KKyAgdm9pZCBS
ZXNldCgpOworCisgcHJpdmF0ZToKKyAgc2l6ZV90IG5leHRfc2xpY2Vfc2l6ZV87CisgIGNvbnN0
IHNpemVfdCBtYXhpbXVtX3NsaWNlX3NpemVfOworICBwcm90b3plcm86OlNjYXR0ZXJlZFN0cmVh
bVdyaXRlciogd3JpdGVyXyA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPFNsaWNlPiBzbGljZXNf
OworCisgIC8vIFVzZWQgdG8ga2VlcCBhbiBhbGxvY2F0ZWQgc2xpY2UgYXJvdW5kIGFmdGVyIHRo
aXMgYnVmZmVyIGlzIHJlc2V0LgorICBTbGljZSBjYWNoZWRfc2xpY2VfOworfTsKKworLy8gSGVs
cGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBoZWFwLWJhc2VkIHByb3RvemVybyBtZXNzYWdlcyBpbiBv
bmUgbGluZS4KKy8vIFVzZWZ1bCB3aGVuIG1hbnVhbGx5IHNlcmlhbGl6aW5nIGEgcHJvdG96ZXJv
IG1lc3NhZ2UgKHByaW1hcmlseSBpbgorLy8gdGVzdHMvdXRpbGl0aWVzKS4gU28gaW5zdGVhZCBv
ZiB0aGUgZm9sbG93aW5nOgorLy8gICBwcm90b3plcm86Ok15TWVzc2FnZSBtc2c7CisvLyAgIHBy
b3RvemVybzo6U2NhdHRlcmVkSGVhcEJ1ZmZlciBzaGI7CisvLyAgIHByb3RvemVybzo6U2NhdHRl
cmVkU3RyZWFtV3JpdGVyIHdyaXRlcigmc2hiKTsKKy8vICAgc2hiLnNldF93cml0ZXIoJndyaXRl
cik7CisvLyAgIG1zZy5SZXNldCgmd3JpdGVyKTsKKy8vICAgLi4uCisvLyBZb3UgY2FuIHdyaXRl
OgorLy8gICBwcm90b3plcm86OkhlYXBCdWZmZXJlZDxwcm90b3plcm86Ok15TWVzc2FnZT4gbXNn
OworLy8gICBtc2ctPnNldF9zdHVmZiguLi4pOworLy8gICBtc2cuU2VyaWFsaXplQXNTdHJpbmco
KTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUID0gOjpwcm90b3plcm86Ok1lc3NhZ2U+CitjbGFzcyBI
ZWFwQnVmZmVyZWQgeworIHB1YmxpYzoKKyAgSGVhcEJ1ZmZlcmVkKCkgOiBIZWFwQnVmZmVyZWQo
NDA5NiwgNDA5Nikge30KKyAgSGVhcEJ1ZmZlcmVkKHNpemVfdCBpbml0aWFsX3NsaWNlX3NpemVf
Ynl0ZXMsIHNpemVfdCBtYXhpbXVtX3NsaWNlX3NpemVfYnl0ZXMpCisgICAgICA6IHNoYl8oaW5p
dGlhbF9zbGljZV9zaXplX2J5dGVzLCBtYXhpbXVtX3NsaWNlX3NpemVfYnl0ZXMpLAorICAgICAg
ICB3cml0ZXJfKCZzaGJfKSB7CisgICAgc2hiXy5zZXRfd3JpdGVyKCZ3cml0ZXJfKTsKKyAgICBt
c2dfLlJlc2V0KCZ3cml0ZXJfKTsKKyAgfQorCisgIC8vIFRoaXMgY2FuJ3QgYmUgbmVpdGhlciBj
b3BpZWQgbm9yIG1vdmVkIGJlY2F1c2UgTWVzc2FnZSBoYW5kcyBvdXQgcG9pbnRlcnMKKyAgLy8g
dG8gaXRzZWxmIHdoZW4gY3JlYXRpbmcgc3VibWVzc2FnZXMuCisgIEhlYXBCdWZmZXJlZChjb25z
dCBIZWFwQnVmZmVyZWQmKSA9IGRlbGV0ZTsKKyAgSGVhcEJ1ZmZlcmVkJiBvcGVyYXRvcj0oY29u
c3QgSGVhcEJ1ZmZlcmVkJikgPSBkZWxldGU7CisgIEhlYXBCdWZmZXJlZChIZWFwQnVmZmVyZWQm
JikgPSBkZWxldGU7CisgIEhlYXBCdWZmZXJlZCYgb3BlcmF0b3I9KEhlYXBCdWZmZXJlZCYmKSA9
IGRlbGV0ZTsKKworICBUKiBnZXQoKSB7IHJldHVybiAmbXNnXzsgfQorICBUKiBvcGVyYXRvci0+
KCkgeyByZXR1cm4gJm1zZ187IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2hi
Xy5zbGljZXMoKS5lbXB0eSgpOyB9CisKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU2VyaWFsaXpl
QXNBcnJheSgpIHsKKyAgICBtc2dfLkZpbmFsaXplKCk7CisgICAgcmV0dXJuIHNoYl8uU3RpdGNo
U2xpY2VzKCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIHsKKyAg
ICBhdXRvIHZlYyA9IFNlcmlhbGl6ZUFzQXJyYXkoKTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmco
cmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmVjLmRhdGEoKSksIHZlYy5zaXplKCkpOwor
ICB9CisKKyAgc3RkOjp2ZWN0b3I8cHJvdG96ZXJvOjpDb250aWd1b3VzTWVtb3J5UmFuZ2U+IEdl
dFJhbmdlcygpIHsKKyAgICBtc2dfLkZpbmFsaXplKCk7CisgICAgcmV0dXJuIHNoYl8uR2V0UmFu
Z2VzKCk7CisgIH0KKworICB2b2lkIFJlc2V0KCkgeworICAgIHNoYl8uUmVzZXQoKTsKKyAgICB3
cml0ZXJfLlJlc2V0KHByb3RvemVybzo6Q29udGlndW91c01lbW9yeVJhbmdle30pOworICAgIG1z
Z18uUmVzZXQoJndyaXRlcl8pOworICAgIFBFUkZFVFRPX0RDSEVDSyhlbXB0eSgpKTsKKyAgfQor
CisgcHJpdmF0ZToKKyAgU2NhdHRlcmVkSGVhcEJ1ZmZlciBzaGJfOworICBTY2F0dGVyZWRTdHJl
YW1Xcml0ZXIgd3JpdGVyXzsKKyAgVCBtc2dfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3Rv
emVybworCisjZW5kaWYgIC8vIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9I
RUFQX0JVRkZFUl9IXworLy8gZ2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9w
ZXJmZXR0by9wcm90b3plcm8vc2NhdHRlcmVkX3N0cmVhbV9udWxsX2RlbGVnYXRlLmgKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElD
RU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdy
ZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGlj
ZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJS
QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp
ZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5p
bmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAq
LworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9TVFJFQU1f
TlVMTF9ERUxFR0FURV9IXworI2RlZmluZSBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FU
VEVSRURfU1RSRUFNX05VTExfREVMRUdBVEVfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNs
dWRlIDx2ZWN0b3I+CisKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBl
cmZldHRvL2Jhc2UvZXhwb3J0LmgiCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9iYXNlL2xvZ2dpbmcuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRl
ZDogI2luY2x1ZGUgInBlcmZldHRvL3Byb3RvemVyby9jb250aWd1b3VzX21lbW9yeV9yYW5nZS5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96
ZXJvL3NjYXR0ZXJlZF9zdHJlYW1fd3JpdGVyLmgiCisKK25hbWVzcGFjZSBwcm90b3plcm8gewor
CitjbGFzcyBQRVJGRVRUT19FWFBPUlQgU2NhdHRlcmVkU3RyZWFtV3JpdGVyTnVsbERlbGVnYXRl
CisgICAgOiBwdWJsaWMgU2NhdHRlcmVkU3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSB7CisgcHVibGlj
OgorICBleHBsaWNpdCBTY2F0dGVyZWRTdHJlYW1Xcml0ZXJOdWxsRGVsZWdhdGUoc2l6ZV90IGNo
dW5rX3NpemUpOworICB+U2NhdHRlcmVkU3RyZWFtV3JpdGVyTnVsbERlbGVnYXRlKCkgb3ZlcnJp
ZGU7CisKKyAgLy8gcHJvdG96ZXJvOjpTY2F0dGVyZWRTdHJlYW1Xcml0ZXI6OkRlbGVnYXRlIGlt
cGxlbWVudGF0aW9uLgorICBDb250aWd1b3VzTWVtb3J5UmFuZ2UgR2V0TmV3QnVmZmVyKCkgb3Zl
cnJpZGU7CisKKyBwcml2YXRlOgorICBjb25zdCBzaXplX3QgY2h1bmtfc2l6ZV87CisgIHN0ZDo6
dW5pcXVlX3B0cjx1aW50OF90W10+IGNodW5rXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90
b3plcm8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FUVEVSRURf
U1RSRUFNX05VTExfREVMRUdBVEVfSF8KKy8vIGdlbl9hbWFsZ2FtYXRlZCBiZWdpbiBoZWFkZXI6
IGluY2x1ZGUvcGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9zdHJlYW1fd3JpdGVyLmgKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAor
ICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRo
ZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29t
cGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRo
ZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMv
TElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3Ig
YWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUg
TGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBX
QVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGlt
cGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zl
cm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K
KyAqLworCisjaWZuZGVmIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1NDQVRURVJFRF9TVFJF
QU1fV1JJVEVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJPX1NDQVRURVJF
RF9TVFJFQU1fV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRk
ZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gZ2Vu
X2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9jb21waWxlci5o
IgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVkOiAjaW5jbHVkZSAicGVyZmV0dG8vYmFzZS9l
eHBvcnQuaCIKKy8vIGdlbl9hbWFsZ2FtYXRlZCBleHBhbmRlZDogI2luY2x1ZGUgInBlcmZldHRv
L3Byb3RvemVyby9jb250aWd1b3VzX21lbW9yeV9yYW5nZS5oIgorCituYW1lc3BhY2UgcHJvdG96
ZXJvIHsKKworLy8gVGhpcyBjbGFzcyBkZWFscyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvYmxlbTog
YXBwZW5kLW9ubHkgcHJvdG8gbWVzc2FnZXMgd2FudAorLy8gdG8gd3JpdGUgYSBzdHJlYW0gb2Yg
Ynl0ZXMsIHdpdGhvdXQgY2FyaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKy8v
IHVuZGVybHlpbmcgYnVmZmVyICh3aGljaCBjb25jcmV0ZWx5IHdpbGwgYmUgZWl0aGVyIHRoZSB0
cmFjZSByaW5nIGJ1ZmZlcgorLy8gb3IgYSBoZWFwLWFsbG9jYXRlZCBidWZmZXIpLiBUaGUgbWFp
biBkZWFsIGlzOiBwcm90byBtZXNzYWdlcyBkb24ndCBrbm93IGluCisvLyBhZHZhbmNlIHdoYXQg
dGhlaXIgc2l6ZSB3aWxsIGJlLgorLy8gRHVlIHRvIHRoZSB0cmFjaW5nIGJ1ZmZlciBiZWluZyBz
cGxpdCBpbnRvIGZpeGVkLXNpemUgY2h1bmtzLCBvbiBzb21lCisvLyBvY2Nhc2lvbnMsIHRoZXNl
IHdyaXRlcyBuZWVkIHRvIGJlIHNwcmVhZCBvdmVyIHR3byAob3IgbW9yZSkgbm9uLWNvbnRpZ3Vv
dXMKKy8vIGNodW5rcyBvZiBtZW1vcnkuIFNpbWlsYXJseSwgd2hlbiB0aGUgYnVmZmVyIGlzIGJh
Y2tlZCBieSB0aGUgaGVhcCwgd2Ugd2FudAorLy8gdG8gYXZvaWQgcmVhbGxvYygpIGNhbGxzLCBh
cyB0aGV5IG1pZ2h0IGNhdXNlIGEgZnVsbCBjb3B5IG9mIHRoZSBjb250ZW50cworLy8gb2YgdGhl
IGJ1ZmZlci4KKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gYWJzdHJhY3QgYXdh
eSB0aGUgbm9uLWNvbnRpZ3VvdXMgd3JpdGUgbG9naWMuCisvLyBUaGlzIGNsYXNzIGtub3dzIGhv
dyB0byBkZWFsIHdpdGggd3JpdGVzIGFzIGxvbmcgYXMgdGhleSBmYWxsIGluIHRoZSBzYW1lCisv
LyBDb250aWd1b3VzTWVtb3J5UmFuZ2UgYW5kIGRlZmVycyB0aGUgY2h1bmstY2hhaW5pbmcgbG9n
aWMgdG8gdGhlIERlbGVnYXRlLgorY2xhc3MgUEVSRkVUVE9fRVhQT1JUIFNjYXR0ZXJlZFN0cmVh
bVdyaXRlciB7CisgcHVibGljOgorICBjbGFzcyBQRVJGRVRUT19FWFBPUlQgRGVsZWdhdGUgewor
ICAgcHVibGljOgorICAgIHZpcnR1YWwgfkRlbGVnYXRlKCk7CisgICAgdmlydHVhbCBDb250aWd1
b3VzTWVtb3J5UmFuZ2UgR2V0TmV3QnVmZmVyKCkgPSAwOworICB9OworCisgIGV4cGxpY2l0IFNj
YXR0ZXJlZFN0cmVhbVdyaXRlcihEZWxlZ2F0ZSogZGVsZWdhdGUpOworICB+U2NhdHRlcmVkU3Ry
ZWFtV3JpdGVyKCk7CisKKyAgaW5saW5lIHZvaWQgV3JpdGVCeXRlKHVpbnQ4X3QgdmFsdWUpIHsK
KyAgICBpZiAod3JpdGVfcHRyXyA+PSBjdXJfcmFuZ2VfLmVuZCkKKyAgICAgIEV4dGVuZCgpOwor
ICAgICp3cml0ZV9wdHJfKysgPSB2YWx1ZTsKKyAgfQorCisgIC8vIEFzc3VtZXMgdGhhdCB0aGUg
Y2FsbGVyIGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBlbm91Z2ggaGVhZHJvb20uCisgIC8vIFRPRE8o
cHJpbWlhbm8pOiBwZXJmIG9wdGltaXphdGlvbiwgdGhpcyBpcyBhIHRyYWNpbmcgaG90IHBhdGgu
IFRoZQorICAvLyBjb21waWxlciBjYW4gbWFrZSBzdHJvbmcgb3B0aW1pemF0aW9uIG9uIG1lbWNw
eSBpZiB0aGUgc2l6ZSBhcmcgaXMgYQorICAvLyBjb25zdGV4cHIuIE1ha2UgYSB0ZW1wbGF0ZWQg
dmFyaWFudCBvZiB0aGlzIGZvciBmaXhlZC1zaXplIHdyaXRlcy4KKyAgLy8gVE9ETyhwcmltaWFu
byk6IHJlc3RyaWN0IC8gbm9hbGlhcyBtaWdodCBhbHNvIGhlbHAuCisgIGlubGluZSB2b2lkIFdy
aXRlQnl0ZXNVbnNhZmUoY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc2l6ZSkgeworICAgIHVp
bnQ4X3QqIGNvbnN0IGVuZCA9IHdyaXRlX3B0cl8gKyBzaXplOworICAgIGFzc2VydChlbmQgPD0g
Y3VyX3JhbmdlXy5lbmQpOworICAgIG1lbWNweSh3cml0ZV9wdHJfLCBzcmMsIHNpemUpOworICAg
IHdyaXRlX3B0cl8gPSBlbmQ7CisgIH0KKworICBpbmxpbmUgdm9pZCBXcml0ZUJ5dGVzKGNvbnN0
IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNpemUpIHsKKyAgICB1aW50OF90KiBjb25zdCBlbmQgPSB3
cml0ZV9wdHJfICsgc2l6ZTsKKyAgICBpZiAoUEVSRkVUVE9fTElLRUxZKGVuZCA8PSBjdXJfcmFu
Z2VfLmVuZCkpCisgICAgICByZXR1cm4gV3JpdGVCeXRlc1Vuc2FmZShzcmMsIHNpemUpOworICAg
IFdyaXRlQnl0ZXNTbG93UGF0aChzcmMsIHNpemUpOworICB9CisKKyAgdm9pZCBXcml0ZUJ5dGVz
U2xvd1BhdGgoY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc2l6ZSk7CisKKyAgLy8gUmVzZXJ2
ZXMgYSBmaXhlZCBhbW91bnQgb2YgYnl0ZXMgdG8gYmUgYmFja2ZpbGxlZCBsYXRlci4gVGhlIHJl
c2VydmVkIHJhbmdlCisgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgY29udGlndW91cyBhbmQgbm90
IHNwYW4gYWNyb3NzIGNodW5rcy4gfHNpemV8IGhhcyB0byBiZQorICAvLyA8PSB0aGFuIHRoZSBz
aXplIG9mIGEgbmV3IGJ1ZmZlciByZXR1cm5lZCBieSB0aGUgRGVsZWdhdGU6OkdldE5ld0J1ZmZl
cigpLgorICB1aW50OF90KiBSZXNlcnZlQnl0ZXMoc2l6ZV90IHNpemUpOworCisgIC8vIEZhc3Qg
KGJ1dCB1bnNhZmUpIHZlcnNpb24gb2YgdGhlIGFib3ZlLiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBw
cmV2aW91c2x5CisgIC8vIGNoZWNrZWQgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgfHNpemV8IGNv
bnRpZ3VvdXMgYnl0ZXMgYXZhaWxhYmxlLgorICAvLyBSZXR1cm5zIG9ubHkgdGhlIHN0YXJ0IHBv
aW50ZXIgb2YgdGhlIHJlc2VydmF0aW9uLgorICB1aW50OF90KiBSZXNlcnZlQnl0ZXNVbnNhZmUo
c2l6ZV90IHNpemUpIHsKKyAgICB1aW50OF90KiBiZWdpbiA9IHdyaXRlX3B0cl87CisgICAgd3Jp
dGVfcHRyXyArPSBzaXplOworICAgIGFzc2VydCh3cml0ZV9wdHJfIDw9IGN1cl9yYW5nZV8uZW5k
KTsKKyAgICByZXR1cm4gYmVnaW47CisgIH0KKworICAvLyBSZXNldHMgdGhlIGJ1ZmZlciBib3Vu
ZGFyaWVzIGFuZCB0aGUgd3JpdGUgcG9pbnRlciB0byB0aGUgZ2l2ZW4gfHJhbmdlfC4KKyAgLy8g
U3Vic2VxdWVudCBXcml0ZUJ5dGUocykgd2lsbCB3cml0ZSBpbnRvIHxyYW5nZXwuCisgIHZvaWQg
UmVzZXQoQ29udGlndW91c01lbW9yeVJhbmdlIHJhbmdlKTsKKworICAvLyBOdW1iZXIgb2YgY29u
dGlndW91cyBmcmVlIGJ5dGVzIGluIHxjdXJfcmFuZ2VffCB0aGF0IGNhbiBiZSB3cml0dGVuIHdp
dGhvdXQKKyAgLy8gcmVxdWVzdGluZyBhIG5ldyBidWZmZXIuCisgIHNpemVfdCBieXRlc19hdmFp
bGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oY3VyX3Jhbmdl
Xy5lbmQgLSB3cml0ZV9wdHJfKTsKKyAgfQorCisgIHVpbnQ4X3QqIHdyaXRlX3B0cigpIGNvbnN0
IHsgcmV0dXJuIHdyaXRlX3B0cl87IH0KKworICB1aW50NjRfdCB3cml0dGVuKCkgY29uc3Qgewor
ICAgIHJldHVybiB3cml0dGVuX3ByZXZpb3VzbHlfICsKKyAgICAgICAgICAgc3RhdGljX2Nhc3Q8
dWludDY0X3Q+KHdyaXRlX3B0cl8gLSBjdXJfcmFuZ2VfLmJlZ2luKTsKKyAgfQorCisgcHJpdmF0
ZToKKyAgU2NhdHRlcmVkU3RyZWFtV3JpdGVyKGNvbnN0IFNjYXR0ZXJlZFN0cmVhbVdyaXRlciYp
ID0gZGVsZXRlOworICBTY2F0dGVyZWRTdHJlYW1Xcml0ZXImIG9wZXJhdG9yPShjb25zdCBTY2F0
dGVyZWRTdHJlYW1Xcml0ZXImKSA9IGRlbGV0ZTsKKworICB2b2lkIEV4dGVuZCgpOworCisgIERl
bGVnYXRlKiBjb25zdCBkZWxlZ2F0ZV87CisgIENvbnRpZ3VvdXNNZW1vcnlSYW5nZSBjdXJfcmFu
Z2VfOworICB1aW50OF90KiB3cml0ZV9wdHJfOworICB1aW50NjRfdCB3cml0dGVuX3ByZXZpb3Vz
bHlfID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlmICAvLyBJ
TkNMVURFX1BFUkZFVFRPX1BST1RPWkVST19TQ0FUVEVSRURfU1RSRUFNX1dSSVRFUl9IXworLy8g
Z2VuX2FtYWxnYW1hdGVkIGJlZ2luIGhlYWRlcjogaW5jbHVkZS9wZXJmZXR0by9wcm90b3plcm8v
c3RhdGljX2J1ZmZlci5oCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9w
ZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vu
c2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlz
IGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkg
b2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5h
cGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5
IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlz
dHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBC
QVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBl
aXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3Bl
Y2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMg
dW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTkNMVURFX1BFUkZFVFRPX1BST1RP
WkVST19TVEFUSUNfQlVGRkVSX0hfCisjZGVmaW5lIElOQ0xVREVfUEVSRkVUVE9fUFJPVE9aRVJP
X1NUQVRJQ19CVUZGRVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+
CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBnZW5fYW1hbGdhbWF0ZWQgZXhwYW5kZWQ6ICNpbmNs
dWRlICJwZXJmZXR0by9iYXNlL2V4cG9ydC5oIgorLy8gZ2VuX2FtYWxnYW1hdGVkIGV4cGFuZGVk
OiAjaW5jbHVkZSAicGVyZmV0dG8vcHJvdG96ZXJvL3NjYXR0ZXJlZF9zdHJlYW1fd3JpdGVyLmgi
CisKK25hbWVzcGFjZSBwcm90b3plcm8geworCitjbGFzcyBNZXNzYWdlOworCisvLyBBIHNpbXBs
ZSBpbXBsZW1lbnRhdGlvbiBvZiBTY2F0dGVyZWRTdHJlYW1Xcml0ZXI6OkRlbGVnYXRlIGJhY2tl
ZCBieSBhCisvLyBmaXhlZC1zaXplIGJ1ZmZlci4gSXQgZG9lc24ndCBzdXBwb3J0IGV4cGFuc2lv
bi4gVGhlIGNhbGxlciBuZWVkcyB0byBlbnN1cmUKKy8vIHRvIG5ldmVyIHdyaXRlIG1vcmUgdGhh
biB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLiBXaWxsIENIRUNLKCkgb3RoZXJ3aXNlLgorY2xhc3Mg
UEVSRkVUVE9fRVhQT1JUIFN0YXRpY0J1ZmZlckRlbGVnYXRlCisgICAgOiBwdWJsaWMgU2NhdHRl
cmVkU3RyZWFtV3JpdGVyOjpEZWxlZ2F0ZSB7CisgcHVibGljOgorICBTdGF0aWNCdWZmZXJEZWxl
Z2F0ZSh1aW50OF90KiBidWYsIHNpemVfdCBsZW4pIDogcmFuZ2Vfe2J1ZiwgYnVmICsgbGVufSB7
fQorICB+U3RhdGljQnVmZmVyRGVsZWdhdGUoKSBvdmVycmlkZTsKKworICAvLyBTY2F0dGVyZWRT
dHJlYW1Xcml0ZXI6OkRlbGVnYXRlIGltcGxlbWVudGF0aW9uLgorICBDb250aWd1b3VzTWVtb3J5
UmFuZ2UgR2V0TmV3QnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgQ29udGlndW91c01lbW9yeVJhbmdl
IGNvbnN0IHJhbmdlXzsKKyAgYm9vbCBnZXRfbmV3X2J1ZmZlcl9jYWxsZWRfb25jZV8gPSBmYWxz
ZTsKK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcHJvdG96ZXJvIG1lc3NhZ2Vz
IGJhY2tlZCBieSBhIGZpeGVkLXNpemUgYnVmZmVyCisvLyBpbiBvbmUgbGluZS4gWW91IGNhbiB3
cml0ZToKKy8vICAgcHJvdG96ZXJvOjpTdGF0aWM8cHJvdG96ZXJvOjpNeU1lc3NhZ2U+IG1zZyhi
dWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKKy8vICAgbXNnLT5zZXRfc3R1ZmYoLi4uKTsKKy8vICAg
c2l6ZV90IGJ5dGVzX2VuY29kZWQgPSBtc2cuRmluYWxpemUoKTsKK3RlbXBsYXRlIDx0eXBlbmFt
ZSBUIC8qIHByb3RvemVybzo6TWVzc2FnZSAqLz4KK2NsYXNzIFN0YXRpY0J1ZmZlcmVkIHsKKyBw
dWJsaWM6CisgIFN0YXRpY0J1ZmZlcmVkKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikKKyAgICAgIDog
ZGVsZWdhdGVfKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZiksIGxlbiksIHdyaXRlcl8o
JmRlbGVnYXRlXykgeworICAgIG1zZ18uUmVzZXQoJndyaXRlcl8pOworICB9CisKKyAgLy8gVGhp
cyBjYW4ndCBiZSBuZWl0aGVyIGNvcGllZCBub3IgbW92ZWQgYmVjYXVzZSBNZXNzYWdlIGhhbmRz
IG91dCBwb2ludGVycworICAvLyB0byBpdHNlbGYgd2hlbiBjcmVhdGluZyBzdWJtZXNzYWdlcy4K
KyAgU3RhdGljQnVmZmVyZWQoY29uc3QgU3RhdGljQnVmZmVyZWQmKSA9IGRlbGV0ZTsKKyAgU3Rh
dGljQnVmZmVyZWQmIG9wZXJhdG9yPShjb25zdCBTdGF0aWNCdWZmZXJlZCYpID0gZGVsZXRlOwor
ICBTdGF0aWNCdWZmZXJlZChTdGF0aWNCdWZmZXJlZCYmKSA9IGRlbGV0ZTsKKyAgU3RhdGljQnVm
ZmVyZWQmIG9wZXJhdG9yPShTdGF0aWNCdWZmZXJlZCYmKSA9IGRlbGV0ZTsKKworICBUKiBnZXQo
KSB7IHJldHVybiAmbXNnXzsgfQorICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gJm1zZ187IH0K
KworICAvLyBUaGUgbGFjayBvZiBhIHNpemUoKSBtZXRob2QgaXMgZGVsaWJlcmF0ZS4gSXQncyB0
byBwcmV2ZW50IHRoYXQgb25lCisgIC8vIGFjY2lkZW50YWxseSBjYWxscyBzaXplKCkgYmVmb3Jl
IEZpbmFsaXplKCkuCisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYnl0ZXMg
KDw9IHRoZSBzaXplIHBhc3NlZCBpbiB0aGUgY3RvcikuCisgIHNpemVfdCBGaW5hbGl6ZSgpIHsK
KyAgICBtc2dfLkZpbmFsaXplKCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4od3Jp
dGVyXy53cml0ZV9wdHIoKSAtIGRlbGVnYXRlXy5yYW5nZV8uYmVnaW4pOworICB9CisKKyBwcml2
YXRlOgorICBTdGF0aWNCdWZmZXJEZWxlZ2F0ZSBkZWxlZ2F0ZV87CisgIFNjYXR0ZXJlZFN0cmVh
bVdyaXRlciB3cml0ZXJfOworICBUIG1zZ187Cit9OworCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8g
Y3JlYXRlIHN0YWNrLWJhc2VkIHByb3RvemVybyBtZXNzYWdlcyBpbiBvbmUgbGluZS4KKy8vIFlv
dSBjYW4gd3JpdGU6CisvLyAgIHByb3RvemVybzo6U3RhY2tCdWZmZXJlZDxwcm90b3plcm86Ok15
TWVzc2FnZSwgMTY+IG1zZzsKKy8vICAgbXNnLT5zZXRfc3R1ZmYoLi4uKTsKKy8vICAgc2l6ZV90
IGJ5dGVzX2VuY29kZWQgPSBtc2cuRmluYWxpemUoKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUIC8q
IHByb3RvemVybzo6TWVzc2FnZSAqLywgc2l6ZV90IE4+CitjbGFzcyBTdGFja0J1ZmZlcmVkIDog
cHVibGljIFN0YXRpY0J1ZmZlcmVkPFQ+IHsKKyBwdWJsaWM6CisgIFN0YWNrQnVmZmVyZWQoKSA6
IFN0YXRpY0J1ZmZlcmVkPFQ+KCZidWZfWzBdLCBOKSB7fQorCisgcHJpdmF0ZToKKyAgdWludDhf
dCBidWZfW05dOyAgLy8gRGVsaWJlcmF0ZWx5IG5vdCBpbml0aWFsaXplZC4KK307CisKK30gIC8v
IG5hbWVzcGFjZSBwcm90b3plcm8KKworI2VuZGlmICAvLyBJTkNMVURFX1BFUkZFVFRPX1BST1RP
WkVST19TVEFUSUNfQlVGRkVSX0hfCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwv
cGFyc2VyL0hUTUxEb2N1bWVudFBhcnNlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNl
ci9IVE1MRG9jdW1lbnRQYXJzZXIuY3BwCmluZGV4IGE5ZWJmN2FkMmQ4ZTJiYTdiNzk0YzIzODhl
ZjQzMzk5ODQ3ZGY2OTMuLjY3OTg5OWUzMzM5Zjg4MDA4ODMwZTQ3MjljYWQ3YmIwNGU5M2E3MjUg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0hUTUxEb2N1bWVudFBhcnNl
ci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvSFRNTERvY3VtZW50UGFyc2Vy
LmNwcApAQCAtMzE0LDggKzMxNCw4IEBAIHZvaWQgSFRNTERvY3VtZW50UGFyc2VyOjpwdW1wVG9r
ZW5pemVyKFN5bmNocm9ub3VzTW9kZSBtb2RlKQogICAgICAgICBpZiAoIW1fc2hvdWxkRW1pdFRy
YWNlUG9pbnRzKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIGF1dG8gcG9zaXRpb24g
PSB0ZXh0UG9zaXRpb24oKTsKLSAgICAgICAgdHJhY2VQb2ludChjb2RlLCBwb3NpdGlvbi5tX2xp
bmUub25lQmFzZWRJbnQoKSwgcG9zaXRpb24ubV9jb2x1bW4ub25lQmFzZWRJbnQoKSk7CisgICAg
ICAgIC8vYXV0byBwb3NpdGlvbiA9IHRleHRQb3NpdGlvbigpOworICAgICAgICAvL3RyYWNlUG9p
bnQoY29kZSwgcG9zaXRpb24ubV9saW5lLm9uZUJhc2VkSW50KCksIHBvc2l0aW9uLm1fY29sdW1u
Lm9uZUJhc2VkSW50KCkpOwogICAgIH07CiAKICAgICBlbWl0VHJhY2VQb2ludChQYXJzZUhUTUxT
dGFydCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL3Njcm9sbGluZy9UaHJlYWRl
ZFNjcm9sbGluZ1RyZWUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGFnZS9zY3JvbGxpbmcvVGhyZWFk
ZWRTY3JvbGxpbmdUcmVlLmNwcAppbmRleCBmOTRiMmU0NDlkODg1NjhiYTU0OTg2NGIxZjAzYzM4
ZWFmZDlmNmIwLi5hOGY2MzgwNjk1YzU5MzQ0YzRmOTU2M2RhY2UzYWVhYjc2OTc3M2ZmIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL3Njcm9sbGluZy9UaHJlYWRlZFNjcm9sbGluZ1Ry
ZWUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BhZ2Uvc2Nyb2xsaW5nL1RocmVhZGVkU2Nyb2xs
aW5nVHJlZS5jcHAKQEAgLTcxLDYgKzcxLDkgQEAgYm9vbCBUaHJlYWRlZFNjcm9sbGluZ1RyZWU6
OmhhbmRsZVdoZWVsRXZlbnRBZnRlck1haW5UaHJlYWQoY29uc3QgUGxhdGZvcm1XaGVlbEUKICAg
ICBMb2NrSG9sZGVyIGxvY2tlcihtX3RyZWVNdXRleCk7CiAKICAgICBTZXRGb3JTY29wZTxib29s
PiBkaXNhbGxvd0xhdGNoaW5nU2NvcGUobV9hbGxvd0xhdGNoaW5nLCBmYWxzZSk7CisKKyAgICB0
cmFjZVBvaW50KFNjcm9sbGluZ1RocmVhZGhhbmRsZVdoZWVsRXZlbnRBZnRlck1haW5UaHJlYWQp
OworCiAgICAgUmVmUHRyPFNjcm9sbGluZ1RyZWVOb2RlPiB0YXJnZXROb2RlID0gbm9kZUZvcklE
KHRhcmdldE5vZGVJRCk7CiAgICAgYXV0byByZXN1bHQgPSBoYW5kbGVXaGVlbEV2ZW50V2l0aE5v
ZGUod2hlZWxFdmVudCwgeyB9LCB0YXJnZXROb2RlLmdldCgpLCBFdmVudFRhcmdldGluZzo6Tm9k
ZU9ubHkpOwogICAgIHJldHVybiByZXN1bHQud2FzSGFuZGxlZDsKQEAgLTM0MiwxMyArMzQ1LDE1
IEBAIHZvaWQgVGhyZWFkZWRTY3JvbGxpbmdUcmVlOjpkaXNwbGF5RGlkUmVmcmVzaE9uU2Nyb2xs
aW5nVGhyZWFkKCkKIAogdm9pZCBUaHJlYWRlZFNjcm9sbGluZ1RyZWU6OmRpc3BsYXlEaWRSZWZy
ZXNoKFBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCkKIHsKLSAgICAvLyBXZSdyZSBvbiB0aGUg
RXZlbnREaXNwYXRjaGVyIHRocmVhZCBoZXJlLgorICAgIC8vIFdlJ3JlIG9uIHRoZSBFdmVudERp
c3BhdGNoZXIgdGhyZWFkIG9yIGluIHRoZSBUaHJlYWRlZENvbXBvc2l0b3IgdGhyZWFkIGhlcmUu
CiAKICAgICBpZiAoZGlzcGxheUlEICE9IHRoaXMtPmRpc3BsYXlJRCgpKQogICAgICAgICByZXR1
cm47Ci0gICAgCisKKyNpZiAhUExBVEZPUk0oV1BFKSAmJiAhUExBVEZPUk0oR1RLKQogICAgIGlm
ICghaGFzUHJvY2Vzc2VkV2hlZWxFdmVudHNSZWNlbnRseSgpKQogICAgICAgICByZXR1cm47Cisj
ZW5kaWYKIAogICAgIFNjcm9sbGluZ1RocmVhZDo6ZGlzcGF0Y2goW3Byb3RlY3RlZFRoaXMgPSBt
YWtlUmVmKCp0aGlzKV0oKSB7CiAgICAgICAgIHByb3RlY3RlZFRoaXMtPmRpc3BsYXlEaWRSZWZy
ZXNoT25TY3JvbGxpbmdUaHJlYWQoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL1Njcm9sbFZpZXcuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vU2Nyb2xsVmlldy5j
cHAKaW5kZXggZGFjYWFkNTAwZmQ3MjcxNzNiZDk0MDQzZWUzMjQzOTRjNzljZjE3MC4uNTc2MjVj
ZmFmMjc0NmMyNGUxN2QzZjlmOWVmYmU1MmU0ZWY5NmM5MiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vU2Nyb2xsVmlldy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vU2Nyb2xsVmlldy5jcHAKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDx3dGYvU3RkTGli
RXh0cmFzLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgogCisjaW5jbHVkZSA8
d3RmL1N5c3RlbVRyYWNpbmcuaD4KKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBTY3JvbGxWaWV3
OjpTY3JvbGxWaWV3KCkgPSBkZWZhdWx0OwpAQCAtNDM5LDYgKzQ0MSw4IEBAIHZvaWQgU2Nyb2xs
Vmlldzo6c2V0U2Nyb2xsT2Zmc2V0KGNvbnN0IFNjcm9sbE9mZnNldCYgb2Zmc2V0KQogewogICAg
IExPR19XSVRIX1NUUkVBTShTY3JvbGxpbmcsIHN0cmVhbSA8PCAiXG5TY3JvbGxWaWV3OjpzZXRT
Y3JvbGxPZmZzZXQgIiA8PCBvZmZzZXQgPDwgIiBjb25zdHJhaW5zICIgPDwgY29uc3RyYWluc1Nj
cm9sbGluZ1RvQ29udGVudEVkZ2UoKSk7CiAKKyAgICB0cmFjZVBvaW50KFNjcm9sbFZpZXdzZXRT
Y3JvbGxPZmZzZXQpOworCiAgICAgSW50UG9pbnQgY29uc3RyYWluZWRPZmZzZXQgPSBvZmZzZXQ7
CiAgICAgaWYgKGNvbnN0cmFpbnNTY3JvbGxpbmdUb0NvbnRlbnRFZGdlKCkpCiAgICAgICAgIGNv
bnN0cmFpbmVkT2Zmc2V0ID0gY29uc3RyYWluZWRPZmZzZXQuY29uc3RyYWluZWRCZXR3ZWVuKElu
dFBvaW50KCksIG1heGltdW1TY3JvbGxPZmZzZXQoKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9BbmltYXRpb25GcmFtZVJhdGUuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0FuaW1hdGlvbkZyYW1lUmF0ZS5oCmluZGV4IDEyODkyZWRl
YzdmNmNhNjFkMzUwNDBlYTc0MDJiNjlmNDQ3OGQ1NmEuLmRlODY4NzFhMmFhNmU1NjYzY2JhOTg0
OGE3M2QwMTY0OGRjZWJkNmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0FuaW1hdGlvbkZyYW1lUmF0ZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0FuaW1hdGlvbkZyYW1lUmF0ZS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNs
dWRlIDx3dGYvT3B0aW9uU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1NlY29uZHMuaD4KKyNpbmNsdWRl
IDx3dGYvU3lzdGVtVHJhY2luZy5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNTIsNiArNTMsOCBAQCBjb25zdGV4cHIgY29uc3Qg
RnJhbWVzUGVyU2Vjb25kIFplcm9GcmFtZXNQZXJTZWNvbmQgPSAwOwogCiBpbmxpbmUgU2Vjb25k
cyBwcmVmZXJyZWRGcmFtZUludGVydmFsKGNvbnN0IE9wdGlvblNldDxUaHJvdHRsaW5nUmVhc29u
PiYgcmVhc29ucykKIHsKKyAgICB0cmFjZVBvaW50KFByZWZlcnJlZEZyYW1lSW50ZXJ2YWwpOwor
CiAgICAgLy8gRklYTUU6IGhhbmRsZSBUaHJvdHRsaW5nUmVhc29uOjpWaXN1YWxseUlkbGUKICAg
ICBpZiAocmVhc29ucy5jb250YWlucyhUaHJvdHRsaW5nUmVhc29uOjpPdXRzaWRlVmlld3BvcnQp
KQogICAgICAgICByZXR1cm4gQWdncmVzc2l2ZVRocm90dGxpbmdBbmltYXRpb25JbnRlcnZhbDsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhy
ZWFkZWRjb21wb3NpdG9yL1RocmVhZGVkQ29tcG9zaXRvci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1No
YXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBv
c2l0b3IuY3BwCmluZGV4IGU4ZjQ5YWIxODZmYzA5MWViZDk5Njk3NmUyYjMxMzMzNTUwMDljODIu
LjBiYjAwYmU0ZTZlNThiZWU1MTdhZDk4MWNmYWNkNjBkMGFiZDg5NWYgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJLaXQvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9y
L1RocmVhZGVkQ29tcG9zaXRvci5jcHAKKysrIGIvU291cmNlL1dlYktpdC9TaGFyZWQvQ29vcmRp
bmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmNwcApA
QCAtMjksNyArMjksOSBAQAogI2lmIFVTRShDT09SRElOQVRFRF9HUkFQSElDUykKIAogI2luY2x1
ZGUgIkNvbXBvc2l0aW5nUnVuTG9vcC5oIgorI2luY2x1ZGUgIkV2ZW50RGlzcGF0Y2hlci5oIgog
I2luY2x1ZGUgIlRocmVhZGVkRGlzcGxheVJlZnJlc2hNb25pdG9yLmgiCisjaW5jbHVkZSAiV2Vi
UHJvY2Vzcy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1EaXNwbGF5Lmg+CiAjaW5jbHVk
ZSA8V2ViQ29yZS9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oPgogI2luY2x1ZGUgPHd0Zi9TZXRGb3JT
Y29wZS5oPgpAQCAtMjUzLDYgKzI1NSw5IEBAIHZvaWQgVGhyZWFkZWRDb21wb3NpdG9yOjpzY2Vu
ZVVwZGF0ZUZpbmlzaGVkKCkKICAgICBpZiAoc2hvdWxkRGlzcGF0Y2hEaXNwbGF5UmVmcmVzaENh
bGxiYWNrKQogICAgICAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvci0+ZGlzcGF0Y2hEaXNwbGF5
UmVmcmVzaENhbGxiYWNrKCk7CiAKKyAgICAvLyBBbHdheXMgbm90aWZ5IHRoZSBTY3JvbGxpbmdU
cmVlcyB0byBtYWtlIHN1cmUgc2Nyb2xsaW5nIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbWFpbiB0
aHJlYWQuCisgICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkuZXZlbnREaXNwYXRjaGVyKCkubm90
aWZ5U2Nyb2xsaW5nVHJlZXNEaXNwbGF5V2FzUmVmcmVzaGVkKG1fZGlzcGxheVJlZnJlc2hNb25p
dG9yLT5kaXNwbGF5SUQoKSk7CisKICAgICAvLyBNYXJrIHRoZSBzY2VuZSB1cGRhdGUgYXMgY29t
cGxldGVkLgogICAgIG1fY29tcG9zaXRpbmdSdW5Mb29wLT51cGRhdGVDb21wbGV0ZWQoc3RhdGVM
b2NrZXIpOwogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvZ2xpYi9XZWJQ
cm9jZXNzUHJveHlHTGliLmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2dsaWIvV2ViUHJv
Y2Vzc1Byb3h5R0xpYi5jcHAKaW5kZXggMjdmMjNlYTA2NWRjNzVjZTRhODI3MGM1NzZlYTJhYTU1
YWIwZGM4Zi4uZjgwODlkYzUwNzM4Y2Q5OTBjNDJiMDRmNGZkNzVjZWJkOTA5OWQ3YyAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvZ2xpYi9XZWJQcm9jZXNzUHJveHlHTGliLmNw
cAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9nbGliL1dlYlByb2Nlc3NQcm94eUdMaWIu
Y3BwCkBAIC0zMiw2ICszMiwxMCBAQAogI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1EaXNwbGF5
Lmg+CiAjaW5jbHVkZSA8d3RmL0ZpbGVTeXN0ZW0uaD4KIAorI2lmIEVOQUJMRShQRVJGRVRUT19U
UkFDSU5HKQorI2luY2x1ZGUgPHd0Zi9TeXN0ZW1UcmFjaW5nLmg+CisjZW5kaWYKKwogbmFtZXNw
YWNlIFdlYktpdCB7CiB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKIApAQCAtNTUsNiArNTksMTEg
QEAgdm9pZCBXZWJQcm9jZXNzUHJveHk6OnBsYXRmb3JtR2V0TGF1bmNoT3B0aW9ucyhQcm9jZXNz
TGF1bmNoZXI6OkxhdW5jaE9wdGlvbnMmIGwKIAogICAgICAgICBsYXVuY2hPcHRpb25zLmV4dHJh
V2ViUHJvY2Vzc1NhbmRib3hQYXRocyA9IG1fcHJvY2Vzc1Bvb2wtPnNhbmRib3hQYXRocygpOwog
ICAgIH0KKworI2lmIEVOQUJMRShQRVJGRVRUT19UUkFDSU5HKQorICAgIC8vIGZwcmludGYoc3Rk
ZXJyLCAiIElOSVQgUEVSRiBGUk9NIFVJUFJPQ0VTUyFcbiIpOworICAgIFdURjo6aW5pdGlhbGl6
ZVBlcmZldHRvRm9yQ3VycmVudFByb2Nlc3MoKTsKKyNlbmRpZgogfQogCiB2b2lkIFdlYlByb2Nl
c3NQcm94eTo6c2VuZE1lc3NhZ2VUb1dlYkNvbnRleHRXaXRoUmVwbHkoVXNlck1lc3NhZ2UmJiBt
ZXNzYWdlLCBDb21wbGV0aW9uSGFuZGxlcjx2b2lkKFVzZXJNZXNzYWdlJiYpPiYmIGNvbXBsZXRp
b25IYW5kbGVyKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
Q29vcmRpbmF0ZWRHcmFwaGljcy9MYXllclRyZWVIb3N0LmNwcCBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL0Nvb3JkaW5hdGVkR3JhcGhpY3MvTGF5ZXJUcmVlSG9zdC5jcHAKaW5k
ZXggODY4NWUyM2QwZDQ2ODYwMWM0NTk5NTQ3NzVmZTZmNTY1YjBjZTdhYy4uZWIwZTE1MGE3NWFl
OTEwZjcwNWY1YjNjNmZkYzlkYTNkNDg4OThhYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvQ29vcmRpbmF0ZWRHcmFwaGljcy9MYXllclRyZWVIb3N0LmNwcAor
KysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db29yZGluYXRlZEdyYXBoaWNz
L0xheWVyVHJlZUhvc3QuY3BwCkBAIC00Myw2ICs0Myw4IEBACiAjaW5jbHVkZSA8d3RmL2dsaWIv
UnVuTG9vcFNvdXJjZVByaW9yaXR5Lmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPHd0Zi9TeXN0ZW1U
cmFjaW5nLmg+CisKIG5hbWVzcGFjZSBXZWJLaXQgewogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
CiAKQEAgLTEzOSw2ICsxNDEsOCBAQCB2b2lkIExheWVyVHJlZUhvc3Q6OmxheWVyRmx1c2hUaW1l
ckZpcmVkKCkKICAgICBpZiAoIW1fY29vcmRpbmF0b3Iucm9vdENvbXBvc2l0aW5nTGF5ZXIoKSkK
ICAgICAgICAgcmV0dXJuOwogCisgICAgdHJhY2VQb2ludChMYXllckZsdXNoVGltZXJGaXJlZCk7
CisKICAgICAvLyBJZiBhIGZvcmNlLXJlcGFpbnQgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQsIHdl
IHNob3VsZCBmb3JjZSBhICdmcmFtZSBzeW5jJyB0aGF0CiAgICAgLy8gd2lsbCBndWFyYW50ZWUg
dXMgYSBjYWxsIHRvIHJlbmRlck5leHRGcmFtZSgpIG9uY2UgdGhlIHVwZGF0ZSBpcyBjb21wbGV0
ZS4KICAgICBpZiAobV9mb3JjZVJlcGFpbnRBc3luYy5jYWxsYmFja0lEKQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmNwcCBiL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0V2ZW50RGlzcGF0Y2hlci5jcHAKaW5kZXgg
NzU5OGVjZmI0YjcyNDhlM2Q2OGY5MmUzNDljYTMwMjZlZTkwMTRmNC4uOGI0NzlmMTA0YWI2Yjdj
YTlhYmNlODIyYzEwNDgwOTEyMmFhYTQ2ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9FdmVudERpc3BhdGNoZXIuY3BwCkBAIC00Myw5ICs0Myw3IEBACiAj
aW5jbHVkZSA8V2ViQ29yZS9Bc3luY1Njcm9sbGluZ0Nvb3JkaW5hdG9yLmg+CiAjZW5kaWYKIAot
I2lmIEVOQUJMRShXRUJQUk9DRVNTX1dJTkRPV1NFUlZFUl9CTE9DS0lORykKICNpbmNsdWRlIDxX
ZWJDb3JlL0Rpc3BsYXlSZWZyZXNoTW9uaXRvck1hbmFnZXIuaD4KLSNlbmRpZgogCiAjaWYgRU5B
QkxFKFNDUk9MTElOR19USFJFQUQpCiAjaW5jbHVkZSA8V2ViQ29yZS9TY3JvbGxpbmdUaHJlYWQu
aD4KQEAgLTk4LDYgKzk2LDggQEAgdm9pZCBFdmVudERpc3BhdGNoZXI6OmluaXRpYWxpemVDb25u
ZWN0aW9uKElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlvbikKIAogdm9pZCBFdmVudERpc3BhdGNo
ZXI6OndoZWVsRXZlbnQoUGFnZUlkZW50aWZpZXIgcGFnZUlELCBjb25zdCBXZWJXaGVlbEV2ZW50
JiB3aGVlbEV2ZW50LCBib29sIGNhblJ1YmJlckJhbmRBdExlZnQsIGJvb2wgY2FuUnViYmVyQmFu
ZEF0UmlnaHQsIGJvb2wgY2FuUnViYmVyQmFuZEF0VG9wLCBib29sIGNhblJ1YmJlckJhbmRBdEJv
dHRvbSkKIHsKKyAgICB0cmFjZVBvaW50KEV2ZW50RGlzcGF0Y2hlcndoZWVsRXZlbnQpOworCiAj
aWYgUExBVEZPUk0oQ09DT0EpIHx8IEVOQUJMRShTQ1JPTExJTkdfVEhSRUFEKQogICAgIFBsYXRm
b3JtV2hlZWxFdmVudCBwbGF0Zm9ybVdoZWVsRXZlbnQgPSBwbGF0Zm9ybSh3aGVlbEV2ZW50KTsK
ICNlbmRpZgpAQCAtMjczLDggKzI3Myw2IEBAIHZvaWQgRXZlbnREaXNwYXRjaGVyOjpzZW5kRGlk
UmVjZWl2ZUV2ZW50KFBhZ2VJZGVudGlmaWVyIHBhZ2VJRCwgV2ViRXZlbnQ6OlR5cGUKIH0KICNl
bmRpZgogCi0jaWYgRU5BQkxFKFdFQlBST0NFU1NfV0lORE9XU0VSVkVSX0JMT0NLSU5HKQotCiB2
b2lkIEV2ZW50RGlzcGF0Y2hlcjo6bm90aWZ5U2Nyb2xsaW5nVHJlZXNEaXNwbGF5V2FzUmVmcmVz
aGVkKFBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCkKIHsKICNpZiBFTkFCTEUoU0NST0xMSU5H
X1RIUkVBRCkKQEAgLTI4NCw2ICsyODIsNyBAQCB2b2lkIEV2ZW50RGlzcGF0Y2hlcjo6bm90aWZ5
U2Nyb2xsaW5nVHJlZXNEaXNwbGF5V2FzUmVmcmVzaGVkKFBsYXRmb3JtRGlzcGxheUlECiAjZW5k
aWYKIH0KIAorI2lmIEVOQUJMRShXRUJQUk9DRVNTX1dJTkRPV1NFUlZFUl9CTE9DS0lORykKIHZv
aWQgRXZlbnREaXNwYXRjaGVyOjpkaXNwbGF5V2FzUmVmcmVzaGVkKFBsYXRmb3JtRGlzcGxheUlE
IGRpc3BsYXlJRCkKIHsKICAgICBBU1NFUlQoIVJ1bkxvb3A6OmlzTWFpbigpKTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0V2ZW50RGlzcGF0Y2hlci5oIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmgKaW5kZXgg
Mzc1ZDEzZGJhNDcxNmJhY2IyMTE1Y2RkZmIwZDE3Yzg5YTZiMWNmYS4uODJmODhlYmM2MmU2NWQ0
Y2RmZmM5ZGQ4YjVmNjJjNzg1YzE0NmE3OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmgKKysrIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmgKQEAgLTczLDkgKzczLDcgQEAgcHVibGlj
OgogCiAgICAgdm9pZCBpbml0aWFsaXplQ29ubmVjdGlvbihJUEM6OkNvbm5lY3Rpb24qKTsKIAot
I2lmIEVOQUJMRShXRUJQUk9DRVNTX1dJTkRPV1NFUlZFUl9CTE9DS0lORykKICAgICB2b2lkIG5v
dGlmeVNjcm9sbGluZ1RyZWVzRGlzcGxheVdhc1JlZnJlc2hlZChXZWJDb3JlOjpQbGF0Zm9ybURp
c3BsYXlJRCk7Ci0jZW5kaWYKIAogcHJpdmF0ZToKICAgICBFdmVudERpc3BhdGNoZXIoKTsKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9ndGsvV2ViUHJvY2Vzc01haW5HdGsu
Y3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL2d0ay9XZWJQcm9jZXNzTWFpbkd0ay5jcHAK
aW5kZXggNjQ0NGFkNGI5ZDY0ZmM4NzUyMTE5YmU0NjIzYTYzZjI4OWMwYjI3Yy4uOTJiYzczNTUx
MzU1YTkxNmRmM2VkMzc2OTE4ZGYwZWFjOGMwZjVhNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL2d0ay9XZWJQcm9jZXNzTWFpbkd0ay5jcHAKKysrIGIvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL2d0ay9XZWJQcm9jZXNzTWFpbkd0ay5jcHAKQEAgLTMyLDYgKzMyLDEwIEBA
CiAjaW5jbHVkZSA8V2ViQ29yZS9HdGtWZXJzaW9uaW5nLmg+CiAjaW5jbHVkZSA8bGliaW50bC5o
PgogCisjaWYgRU5BQkxFKFBFUkZFVFRPX1RSQUNJTkcpCisjaW5jbHVkZSA8d3RmL1N5c3RlbVRy
YWNpbmcuaD4KKyNlbmRpZgorCiAjaWYgUExBVEZPUk0oWDExKQogI2luY2x1ZGUgPFgxMS9YbGli
Lmg+CiAjZW5kaWYKQEAgLTU3LDYgKzYxLDEwIEBAIHB1YmxpYzoKICAgICAgICAgYmluZHRleHRk
b21haW4oR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOwogICAgICAgICBiaW5kX3RleHRkb21h
aW5fY29kZXNldChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOwogCisjaWYgRU5BQkxFKFBFUkZF
VFRPX1RSQUNJTkcpCisgICAgICAgIFdURjo6aW5pdGlhbGl6ZVBlcmZldHRvRm9yQ3VycmVudFBy
b2Nlc3MoKTsKKyNlbmRpZgorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH07CmRpZmYg
LS1naXQgYS9Tb3VyY2UvY21ha2UvV2ViS2l0RmVhdHVyZXMuY21ha2UgYi9Tb3VyY2UvY21ha2Uv
V2ViS2l0RmVhdHVyZXMuY21ha2UKaW5kZXggNjhiMjliNDczNTQ0YjI1OWI3NzE2ZGZlZjZmNTY0
OGM5NWUwYzRmMC4uYWE1ZmU0Nzk1NTZjMDY3NThiNWQ1ZjBkZjViODY1NmVlZjVlNDFhZSAxMDA2
NDQKLS0tIGEvU291cmNlL2NtYWtlL1dlYktpdEZlYXR1cmVzLmNtYWtlCisrKyBiL1NvdXJjZS9j
bWFrZS9XZWJLaXRGZWF0dXJlcy5jbWFrZQpAQCAtMjExLDYgKzIxMSw3IEBAIG1hY3JvKFdFQktJ
VF9PUFRJT05fQkVHSU4pCiAgICAgV0VCS0lUX09QVElPTl9ERUZJTkUoRU5BQkxFX09SSUVOVEFU
SU9OX0VWRU5UUyAiVG9nZ2xlIE9yaWVudGF0aW9uIEV2ZW50cyBzdXBwb3J0IiBQUklWQVRFIE9G
RikKICAgICBXRUJLSVRfT1BUSU9OX0RFRklORShFTkFCTEVfT1ZFUkZMT1dfU0NST0xMSU5HX1RP
VUNIICJUb2dnbGUgYWNjZWxlcmF0ZWQgc2Nyb2xsaW5nIHN1cHBvcnQiIFBSSVZBVEUgT0ZGKQog
ICAgIFdFQktJVF9PUFRJT05fREVGSU5FKEVOQUJMRV9QQVlNRU5UX1JFUVVFU1QgIlRvZ2dsZSBQ
YXltZW50IFJlcXVlc3Qgc3VwcG9ydCIgUFJJVkFURSBPRkYpCisgICAgV0VCS0lUX09QVElPTl9E
RUZJTkUoRU5BQkxFX1BFUkZFVFRPX1RSQUNJTkcgIlRvZ2dsZSBQZXJmZXR0byBzdGF0aWMgdHJh
Y2luZyBzdXBwb3J0IiBQUklWQVRFIE9GRikKICAgICBXRUJLSVRfT1BUSU9OX0RFRklORShFTkFC
TEVfUERGS0lUX1BMVUdJTiAiVG9nZ2xlIFBERktpdCBwbHVnaW4gc3VwcG9ydCIgUFJJVkFURSBP
RkYpCiAgICAgV0VCS0lUX09QVElPTl9ERUZJTkUoRU5BQkxFX1BFUklPRElDX01FTU9SWV9NT05J
VE9SICJUb2dnbGUgcGVyaW9kaWNhbCBtZW1vcnkgbW9uaXRvciBzdXBwb3J0IiBQUklWQVRFIE9G
RikKICAgICBXRUJLSVRfT1BUSU9OX0RFRklORShFTkFCTEVfUElDVFVSRV9JTl9QSUNUVVJFX0FQ
SSAiVG9nZ2xlIFBpY3R1cmUtaW4tUGljdHVyZSBBUEkgc3VwcG9ydCIgUFJJVkFURSBPRkYpCmRp
ZmYgLS1naXQgYS9Ub29scy9mbGF0cGFrL2ZsYXRwYWt1dGlscy5weSBiL1Rvb2xzL2ZsYXRwYWsv
ZmxhdHBha3V0aWxzLnB5CmluZGV4IDFiN2I3OWY5YTk5ZWNmMWY5ZmI0ZTE3ZWYxM2M2MGRkZjg5
OTU5MjQuLmY1YWFmYjk5OGVjOGI2MTczMjU4MDkxZGQ4OGEwZWFhNzMwNmIyNWQgMTAwNjQ0Ci0t
LSBhL1Rvb2xzL2ZsYXRwYWsvZmxhdHBha3V0aWxzLnB5CisrKyBiL1Rvb2xzL2ZsYXRwYWsvZmxh
dHBha3V0aWxzLnB5CkBAIC02OTcsNiArNjk3LDcgQEAgY2xhc3MgV2Via2l0RmxhdHBhazoKIAog
ICAgICAgICBmbGF0cGFrX2NvbW1hbmQgPSBbImZsYXRwYWsiLCAicnVuIiwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICItLXVzZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1k
IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWRpZS13aXRoLXBhcmVudCIsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAiLS1maWxlc3lzdGVtPWhvc3QiLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIi0tYWxsb3c9ZGV2ZWwiLApkaWZmIC0tZ2l0IGEvVG9vbHMvZmxhdHBh
ay93ZWJraXQtYndyYXAgYi9Ub29scy9mbGF0cGFrL3dlYmtpdC1id3JhcAppbmRleCAyYjM2OTAw
Y2UyODIzZTU3ODFhMWFjZTQ1NjllMGY4NGE3ZmQxM2I2Li4xYjMxODAyNTBiNmVjOWQzODE4Mjcz
ZWYwMzEyZDgwYzI3ODAzYTgxIDEwMDc1NQotLS0gYS9Ub29scy9mbGF0cGFrL3dlYmtpdC1id3Jh
cAorKysgYi9Ub29scy9mbGF0cGFrL3dlYmtpdC1id3JhcApAQCAtNDAsNyArNDAsOCBAQCBkZWYg
bWFpbihhcmdzOiBsaXN0KSAtPiBpbnQ6CiAgICAgICAgIGJpbmRfbW91bnRzWyIvdmFyL3RtcCJd
ID0gb3MucGF0aC5qb2luKGZsYXRwYWtfdXNlcl9kaXIsICJ2YXIiLCAidG1wIikKIAogICAgIHRy
eV9iaW5kX21vdW50cyA9IHsKLSAgICAgICAgIi9ydW4vaWNlY2MiOiAiL3Zhci9ydW4vaWNlY2Mi
CisgICAgICAgICIvcnVuL2ljZWNjIjogIi92YXIvcnVuL2ljZWNjIiwKKyAgICAgICAgIi90bXAi
OiAiL3RtcCIKICAgICB9CiAKICAgICBidWlsZF9wYXRoID0gb3MuZW52aXJvbi5nZXQoIldFQktJ
VF9CVUlMRF9ESVJfQklORF9NT1VOVCIpCg==
</data>
<flag name="commit-queue"
          id="432215"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>415113</attachid>
            <date>2020-12-01 01:53:42 -0800</date>
            <delta_ts>2020-12-01 02:26:47 -0800</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-219308-20201201105340.patch</filename>
            <type>text/plain</type>
            <size>6809</size>
            <attacher name="Alejandro G. Castro">alex</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjcwMjg3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGY2NjgzMDI0N2JhNGRm
MTEzNTg0YjQwZjFjMDg3NDI4NDlmMGNlMy4uMDc2ZDkyMWU5OTMxZjZhMTQ1NmJhOTY0ZTJiMjBh
ZmYwODkyNmM3OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI1IEBACisyMDIwLTEyLTAxICBBbGVq
YW5kcm8gRy4gQ2FzdHJvICA8YWxleEBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdW1dQRV0g
QXN5bmMgc2Nyb2xsaW5nIHVkcGF0ZXMgYXJlIGJsb2NrZWQgaW4gdGhlIG1haW4gdGhyZWFkCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTkzMDgKKwor
ICAgICAgICBSZXZpZXdlZCBieSBTaW1vbiBGcmFzZXIuCisKKyAgICAgICAgV2UgbmVlZCB0byBh
dm9pZCB0aGlzIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9mIGF2b2lkaW5nIHRoZQorICAgICAg
ICByZWZyZXNoIGZvciB0aGUgc2Nyb2xsaW5nIHRocmVhZCB3aGVuIG5vIHdoZWVsIGV2ZW50cyB3
ZXJlCisgICAgICAgIHJlY2VudGx5IHNlbnQgYmVjYXVzZSBHVEsgYW5kIFdQRSBraW5ldGljIHNj
cm9sbGluZyBkb2VzIG5vdCB1c2UKKyAgICAgICAgd2hlZWwgZXZlbnRzIHRvIGNvbnRyb2wgdGhl
IGFuaW1hdGlvbi4gV2UgYXJlIGRpc2N1c3NpbmcgdG8gY2hhbmdlCisgICAgICAgIHRoaXMgZm9y
IHRoZSBmdXR1cmUgYW5kIG1ha2UgdGhlIGNvZGUgbW9yZSBzaW1pbGFyIGZvciBldmVyeSBwb3J0
LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm90IHN1cmUgaWYgd2UgY2FuIGFkZCB0ZXN0cyBm
b3IgdGhpcyBzaXR1YXRpb24uIFdlCisgICAgICAgIGRldGVjdGVkIGl0IG1hbnVhbGx5LgorCisg
ICAgICAgICogcGFnZS9zY3JvbGxpbmcvVGhyZWFkZWRTY3JvbGxpbmdUcmVlLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlRocmVhZGVkU2Nyb2xsaW5nVHJlZTo6ZGlzcGxheURpZFJlZnJlc2gpOiBU
aGlzIGZ1bmN0aW9uCisgICAgICAgIGlzIGFsc28gY2FsbGVkIGJ5IHRoZSB0aHJlYWRlZCBjb21w
b3NpdG9yIHRocmVhZCBpbiBjYXNlIG9mIEdUSworICAgICAgICBhbmQgV1BFLiBXZSBjYW4gbm90
IHVzZSB0aGF0IGNvbmRpdGlvbiBmb3IgR1RLIGFuZCBXUEUsIGtpbmV0aWMKKyAgICAgICAgYW5p
bWF0aW9uIGRvZXMgbm90IHVzZSB0aGUgd2hlZWwgZXZlbnRzLgorCiAyMDIwLTExLTMwICBBbmRy
ZXMgR29uemFsZXogIDxhbmRyZXNnXzIyQGFwcGxlLmNvbT4KIAogICAgICAgICBbV2ViQWNjZXNz
aWJpbGl0eU9iamVjdFdyYXBwZXIgZG9BWEF0dHJpYnV0ZWRTdHJpbmdGb3JSYW5nZV0gbmVlZHMg
dG8gcnVuIG9uIHRoZSBtYWluIHRocmVhZC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKaW5kZXggOWEyNDNkOGQ0NjM2ZmI5NjBh
NzhkOWVmMjg2ZmY3ZWMzNTBmODhmNy4uZjcyOWMzMTczN2ZlYmVhNDM3ZDk2NGUyZWQ3N2M4Nzhi
YWM5ZmFlZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysrIGIvU291cmNl
L1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNCBAQAorMjAyMC0xMi0wMSAgQWxlamFuZHJv
IEcuIENhc3RybyAgPGFsZXhAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXVtXUEVdIEFzeW5j
IHNjcm9sbGluZyB1ZHBhdGVzIGFyZSBibG9ja2VkIGluIHRoZSBtYWluIHRocmVhZAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE5MzA4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgU2ltb24gRnJhc2VyLgorCisgICAgICAgIFdlIG5lZWQgdG8gdXNlIHRo
ZSBFdmVudERpc3BhdGNoZXIgZnJvbSB0aGUgZnJhbWVEb25lIGNhbGxiYWNrIGluCisgICAgICAg
IHRoZSBUaHJlYWRlZENvbXBvc2l0b3IsIGZvciBHVEsgYW5kIFdQRSB3ZSByZWNlaXZlIHRoZSBm
cmFtZQorICAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGF0IHRocmVhZC4gV2UgaGF2ZSB0byBub3Rp
ZnkgdGhlIHNjcm9sbGluZyB0cmVlcworICAgICAgICBpbiB0aGUgc2Nyb2xsaW5nIHRocmVhZCBl
dmVuIGlmIHRoZSBtYWluIHRocmVhZCBpcyBidXN5IG9yIHdlIHdpbGwKKyAgICAgICAgZnJlZXpl
IHdoZW4gdGhlIG1haW4gdGhyZWFkIGlzIGJ1c3kuIEZvciB0aGF0IHdlIHVzZSB0aGUgQVBJIGlu
CisgICAgICAgIHRoZSBFdmVudERpc3BhdGNoZXIuCisKKyAgICAgICAgKiBTaGFyZWQvQ29vcmRp
bmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmNwcDoK
KyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpzY2VuZVVwZGF0ZUZpbmlzaGVk
KTogQ2FsbCB0aGUKKyAgICAgICAgRXZlbnREaXNwYXRjaGVyIHRvIG5vdGlmeSB0aGUgc2Nyb2xs
aW5nIHRyZWVzIGEgZnJhbWUgd2FzIHJlbmRlcmVkLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2Vi
UGFnZS9FdmVudERpc3BhdGNoZXIuY3BwOiBFbmFibGUgdGhlIGNvbXBpbGF0aW9uCisgICAgICAg
IG9mIHRoZSBub3RpZnkgZnVuY3Rpb24gZm9yIGFsbCB0aGUgcG9ydHMuCisgICAgICAgICogV2Vi
UHJvY2Vzcy9XZWJQYWdlL0V2ZW50RGlzcGF0Y2hlci5oOiBEaXR0by4KKwogMjAyMC0xMi0wMSAg
VGltIEhvcnRvbiAgPHRpbW90aHlfaG9ydG9uQGFwcGxlLmNvbT4KIAogICAgICAgICBHUFUgUHJv
Y2VzczogSW52YWxpZCBzdGF0aWNfY2FzdCBmcm9tIENvbmNyZXRlSW1hZ2VCdWZmZXIgdG8gUmVt
b3RlSW1hZ2VCdWZmZXJQcm94eQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGFnZS9zY3Jv
bGxpbmcvVGhyZWFkZWRTY3JvbGxpbmdUcmVlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BhZ2Uvc2Ny
b2xsaW5nL1RocmVhZGVkU2Nyb2xsaW5nVHJlZS5jcHAKaW5kZXggZjk0YjJlNDQ5ZDg4NTY4YmE1
NDk4NjRiMWYwM2MzOGVhZmQ5ZjZiMC4uZDg1NDAxYzU2ZTliNzA2MTczZTdkN2I4MzQ2NDg5YjMy
ZjMyNTJlYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGFnZS9zY3JvbGxpbmcvVGhyZWFk
ZWRTY3JvbGxpbmdUcmVlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wYWdlL3Njcm9sbGluZy9U
aHJlYWRlZFNjcm9sbGluZ1RyZWUuY3BwCkBAIC0zNDIsMTMgKzM0MiwxNSBAQCB2b2lkIFRocmVh
ZGVkU2Nyb2xsaW5nVHJlZTo6ZGlzcGxheURpZFJlZnJlc2hPblNjcm9sbGluZ1RocmVhZCgpCiAK
IHZvaWQgVGhyZWFkZWRTY3JvbGxpbmdUcmVlOjpkaXNwbGF5RGlkUmVmcmVzaChQbGF0Zm9ybURp
c3BsYXlJRCBkaXNwbGF5SUQpCiB7Ci0gICAgLy8gV2UncmUgb24gdGhlIEV2ZW50RGlzcGF0Y2hl
ciB0aHJlYWQgaGVyZS4KKyAgICAvLyBXZSdyZSBvbiB0aGUgRXZlbnREaXNwYXRjaGVyIHRocmVh
ZCBvciBpbiB0aGUgVGhyZWFkZWRDb21wb3NpdG9yIHRocmVhZCBoZXJlLgogCiAgICAgaWYgKGRp
c3BsYXlJRCAhPSB0aGlzLT5kaXNwbGF5SUQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIAorCisj
aWYgIVBMQVRGT1JNKFdQRSkgJiYgIVBMQVRGT1JNKEdUSykKICAgICBpZiAoIWhhc1Byb2Nlc3Nl
ZFdoZWVsRXZlbnRzUmVjZW50bHkoKSkKICAgICAgICAgcmV0dXJuOworI2VuZGlmCiAKICAgICBT
Y3JvbGxpbmdUaHJlYWQ6OmRpc3BhdGNoKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyld
KCkgewogICAgICAgICBwcm90ZWN0ZWRUaGlzLT5kaXNwbGF5RGlkUmVmcmVzaE9uU2Nyb2xsaW5n
VGhyZWFkKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1NoYXJlZC9Db29yZGluYXRlZEdy
YXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBvc2l0b3IuY3BwIGIvU291cmNl
L1dlYktpdC9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhy
ZWFkZWRDb21wb3NpdG9yLmNwcAppbmRleCBlOGY0OWFiMTg2ZmMwOTFlYmQ5OTY5NzZlMmIzMTMz
MzU1MDA5YzgyLi4wYmIwMGJlNGU2ZTU4YmVlNTE3YWQ5ODFjZmFjZDYwZDBhYmQ4OTVmIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVk
Y29tcG9zaXRvci9UaHJlYWRlZENvbXBvc2l0b3IuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvU2hh
cmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZGVkQ29tcG9z
aXRvci5jcHAKQEAgLTI5LDcgKzI5LDkgQEAKICNpZiBVU0UoQ09PUkRJTkFURURfR1JBUEhJQ1Mp
CiAKICNpbmNsdWRlICJDb21wb3NpdGluZ1J1bkxvb3AuaCIKKyNpbmNsdWRlICJFdmVudERpc3Bh
dGNoZXIuaCIKICNpbmNsdWRlICJUaHJlYWRlZERpc3BsYXlSZWZyZXNoTW9uaXRvci5oIgorI2lu
Y2x1ZGUgIldlYlByb2Nlc3MuaCIKICNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtRGlzcGxheS5o
PgogI2luY2x1ZGUgPFdlYkNvcmUvVHJhbnNmb3JtYXRpb25NYXRyaXguaD4KICNpbmNsdWRlIDx3
dGYvU2V0Rm9yU2NvcGUuaD4KQEAgLTI1Myw2ICsyNTUsOSBAQCB2b2lkIFRocmVhZGVkQ29tcG9z
aXRvcjo6c2NlbmVVcGRhdGVGaW5pc2hlZCgpCiAgICAgaWYgKHNob3VsZERpc3BhdGNoRGlzcGxh
eVJlZnJlc2hDYWxsYmFjaykKICAgICAgICAgbV9kaXNwbGF5UmVmcmVzaE1vbml0b3ItPmRpc3Bh
dGNoRGlzcGxheVJlZnJlc2hDYWxsYmFjaygpOwogCisgICAgLy8gQWx3YXlzIG5vdGlmeSB0aGUg
U2Nyb2xsaW5nVHJlZXMgdG8gbWFrZSBzdXJlIHNjcm9sbGluZyBkb2VzIG5vdCBkZXBlbmQgb24g
dGhlIG1haW4gdGhyZWFkLgorICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLmV2ZW50RGlzcGF0
Y2hlcigpLm5vdGlmeVNjcm9sbGluZ1RyZWVzRGlzcGxheVdhc1JlZnJlc2hlZChtX2Rpc3BsYXlS
ZWZyZXNoTW9uaXRvci0+ZGlzcGxheUlEKCkpOworCiAgICAgLy8gTWFyayB0aGUgc2NlbmUgdXBk
YXRlIGFzIGNvbXBsZXRlZC4KICAgICBtX2NvbXBvc2l0aW5nUnVuTG9vcC0+dXBkYXRlQ29tcGxl
dGVkKHN0YXRlTG9ja2VyKTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL0V2ZW50RGlzcGF0Y2hlci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViUGFnZS9FdmVudERpc3BhdGNoZXIuY3BwCmluZGV4IDc1OThlY2ZiNGI3MjQ4ZTNkNjhmOTJl
MzQ5Y2EzMDI2ZWU5MDE0ZjQuLjhjM2QyMGI5Y2NmODMwYzVjYzUwNzcyMzFhYmFjM2I5Mzg5N2Ex
MjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0V2ZW50RGlz
cGF0Y2hlci5jcHAKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvRXZlbnRE
aXNwYXRjaGVyLmNwcApAQCAtNDMsOSArNDMsNyBAQAogI2luY2x1ZGUgPFdlYkNvcmUvQXN5bmNT
Y3JvbGxpbmdDb29yZGluYXRvci5oPgogI2VuZGlmCiAKLSNpZiBFTkFCTEUoV0VCUFJPQ0VTU19X
SU5ET1dTRVJWRVJfQkxPQ0tJTkcpCiAjaW5jbHVkZSA8V2ViQ29yZS9EaXNwbGF5UmVmcmVzaE1v
bml0b3JNYW5hZ2VyLmg+Ci0jZW5kaWYKIAogI2lmIEVOQUJMRShTQ1JPTExJTkdfVEhSRUFEKQog
I2luY2x1ZGUgPFdlYkNvcmUvU2Nyb2xsaW5nVGhyZWFkLmg+CkBAIC0yNzMsOCArMjcxLDYgQEAg
dm9pZCBFdmVudERpc3BhdGNoZXI6OnNlbmREaWRSZWNlaXZlRXZlbnQoUGFnZUlkZW50aWZpZXIg
cGFnZUlELCBXZWJFdmVudDo6VHlwZQogfQogI2VuZGlmCiAKLSNpZiBFTkFCTEUoV0VCUFJPQ0VT
U19XSU5ET1dTRVJWRVJfQkxPQ0tJTkcpCi0KIHZvaWQgRXZlbnREaXNwYXRjaGVyOjpub3RpZnlT
Y3JvbGxpbmdUcmVlc0Rpc3BsYXlXYXNSZWZyZXNoZWQoUGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxh
eUlEKQogewogI2lmIEVOQUJMRShTQ1JPTExJTkdfVEhSRUFEKQpAQCAtMjg0LDYgKzI4MCw3IEBA
IHZvaWQgRXZlbnREaXNwYXRjaGVyOjpub3RpZnlTY3JvbGxpbmdUcmVlc0Rpc3BsYXlXYXNSZWZy
ZXNoZWQoUGxhdGZvcm1EaXNwbGF5SUQKICNlbmRpZgogfQogCisjaWYgRU5BQkxFKFdFQlBST0NF
U1NfV0lORE9XU0VSVkVSX0JMT0NLSU5HKQogdm9pZCBFdmVudERpc3BhdGNoZXI6OmRpc3BsYXlX
YXNSZWZyZXNoZWQoUGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlEKQogewogICAgIEFTU0VSVCgh
UnVuTG9vcDo6aXNNYWluKCkpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlBhZ2UvRXZlbnREaXNwYXRjaGVyLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2Vi
UGFnZS9FdmVudERpc3BhdGNoZXIuaAppbmRleCAzNzVkMTNkYmE0NzE2YmFjYjIxMTVjZGRmYjBk
MTdjODlhNmIxY2ZhLi44MmY4OGViYzYyZTY1ZDRjZGZmYzlkZDhiNWY2MmM3ODVjMTQ2YTc4IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9FdmVudERpc3BhdGNo
ZXIuaAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9FdmVudERpc3BhdGNo
ZXIuaApAQCAtNzMsOSArNzMsNyBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGluaXRpYWxpemVDb25u
ZWN0aW9uKElQQzo6Q29ubmVjdGlvbiopOwogCi0jaWYgRU5BQkxFKFdFQlBST0NFU1NfV0lORE9X
U0VSVkVSX0JMT0NLSU5HKQogICAgIHZvaWQgbm90aWZ5U2Nyb2xsaW5nVHJlZXNEaXNwbGF5V2Fz
UmVmcmVzaGVkKFdlYkNvcmU6OlBsYXRmb3JtRGlzcGxheUlEKTsKLSNlbmRpZgogCiBwcml2YXRl
OgogICAgIEV2ZW50RGlzcGF0Y2hlcigpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>