<?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>148511</bug_id>
          
          <creation_ts>2015-08-26 21:35:10 -0700</creation_ts>
          <short_desc>[EFL] Move RenderThemeEfl.cpp|h from WebCore/platform/efl to WebCore/rendering</short_desc>
          <delta_ts>2015-08-27 02:59:59 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit EFL</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="Gyuyoung Kim">gyuyoung.kim</reporter>
          <assigned_to name="Gyuyoung Kim">gyuyoung.kim</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>lucas.de.marchi</cc>
    
    <cc>ossy</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1121191</commentid>
    <comment_count>0</comment_count>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2015-08-26 21:35:10 -0700</bug_when>
    <thetext>RenderThemeFoo.cpp|h are placed in WebCore/rendering. To be aligned with other ports, let&apos;s move RenderThemeEfl.cpp|h to WebCore/rendering.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1121196</commentid>
    <comment_count>1</comment_count>
      <attachid>260030</attachid>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2015-08-26 21:49:08 -0700</bug_when>
    <thetext>Created attachment 260030
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1121197</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-26 21:50:15 -0700</bug_when>
    <thetext>Attachment 260030 did not pass style-queue:


ERROR: Source/WebCore/rendering/RenderThemeEfl.cpp:83:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/RenderThemeEfl.cpp:92:  Multi line control clauses should use braces.  [whitespace/braces] [4]
Total errors found: 2 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1121256</commentid>
    <comment_count>3</comment_count>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2015-08-27 01:50:57 -0700</bug_when>
    <thetext>Ossy, could you take a look ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1121258</commentid>
    <comment_count>4</comment_count>
      <attachid>260030</attachid>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2015-08-27 02:03:30 -0700</bug_when>
    <thetext>Comment on attachment 260030
Patch

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1121268</commentid>
    <comment_count>5</comment_count>
      <attachid>260030</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-27 02:59:55 -0700</bug_when>
    <thetext>Comment on attachment 260030
Patch

Clearing flags on attachment: 260030

Committed r189020: &lt;http://trac.webkit.org/changeset/189020&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1121269</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-27 02:59:59 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>260030</attachid>
            <date>2015-08-26 21:49:08 -0700</date>
            <delta_ts>2015-08-27 02:59:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-148511-20150827134855.patch</filename>
            <type>text/plain</type>
            <size>105304</size>
            <attacher name="Gyuyoung Kim">gyuyoung.kim</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTg5MDA4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzUzOTJiY2E5N2E5MzQ5
MzRlYjAyZjQyZTJlZTQ0MmQ1YWEwMDM4Ni4uYzY4Njc1MDcyZDQzMWE4Nzg0MDJlMjE5Y2Y2NjI0
NDJmY2JkMGUzMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk0IEBACisyMDE1LTA4LTI2ICBHeXV5
b3VuZyBLaW0gIDxneXV5b3VuZy5raW1Ad2Via2l0Lm9yZz4KKworICAgICAgICBbRUZMXSBNb3Zl
IFJlbmRlclRoZW1lRWZsLmNwcHxoIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9lZmwgdG8gV2ViQ29y
ZS9yZW5kZXJpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE0ODUxMQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFRvIGJlIGFsaWduZWQgd2l0aCBvdGhlciBwb3J0cywgbW92ZSBSZW5kZXJUaGVtZUVmbC5j
cHB8aCB0byBXZWJDb3JlL3JlbmRlcmluZy4KKworICAgICAgICBBZGRpdGlvbmFsbHkgdGhpcyBw
YXRjaCBmaXhlcyBzdHlsZSBlcnJvcnMgaW4gUmVuZGVyVGhlbWVFZmwuY3BwCisKKyAgICAgICAg
KiBQbGF0Zm9ybUVmbC5jbWFrZToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVFZmwu
Y3BwOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL1JlbmRlclRoZW1l
RWZsLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OnRvRWRqZUdyb3VwKToKKyAgICAgICAgKFdlYkNv
cmU6OnNldFNvdXJjZUdyb3VwRm9yRWRqZU9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUVmbDo6YWRqdXN0U2l6ZUNvbnN0cmFpbnRzKToKKyAgICAgICAgKFdlYkNvcmU6Omlz
Rm9ybUVsZW1lbnRUb29MYXJnZVRvRGlzcGxheSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUVmbDo6VGhlbWVQYXJ0Q2FjaGVFbnRyeTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lRWZsOjpUaGVtZVBhcnRDYWNoZUVudHJ5OjpyZXVzZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6Z2V0VGhlbWVQYXJ0RnJvbUNhY2hlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpjbGVhclRoZW1lUGFydENhY2hlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjphcHBseUVkamVTdGF0ZUZyb21Gb3JtKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjphcHBseUVkamVSVExTdGF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6aXNDb250cm9sU3R5bGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lRWZsOjpwYWludFRoZW1lUGFydCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZUVmbDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
Ojp0aGVtZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6YXBwbHlDb2xvckNhbGxiYWNrKToK
KyAgICAgICAgKFdlYkNvcmU6OmZpbGxDb2xvcnNGcm9tRWRqZUNsYXNzKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lRWZsOjpzZXRDb2xvckZyb21UaGVtZUNsYXNzKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpzZXRUaGVtZVBhdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVFZmw6OnRoZW1lUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUVmbDo6bG9hZFRoZW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjph
cHBseVBhcnREZXNjcmlwdGlvbkZhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lRWZsOjphcHBseVBhcnREZXNjcmlwdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUVmbDo6YXBwbHlQYXJ0RGVzY3JpcHRpb25zRnJvbSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZUVmbDo6UmVuZGVyVGhlbWVFZmwpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVFZmw6On5SZW5kZXJUaGVtZUVmbCk6CisgICAgICAgIChXZWJDb3JlOjpzdXBwb3J0c0Zv
Y3VzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpzdXBwb3J0c0ZvY3VzUmlu
Zyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6Y29udHJvbFN1cHBvcnRzVGlu
dHMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVFZmw6OmJhc2VsaW5lUG9zaXRpb24p
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVFZmw6OnBsYXRmb3JtQWN0aXZlU2VsZWN0
aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpw
bGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lRWZsOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xv
cik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6cGxhdGZvcm1JbmFjdGl2ZVNl
bGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVm
bDo6cGxhdGZvcm1Gb2N1c1JpbmdDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUVmbDo6c3VwcG9ydHNTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3JzKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lRWZsOjpwYWludFNsaWRlclRyYWNrKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lRWZsOjphZGp1c3RTbGlkZXJUcmFja1N0eWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lRWZsOjphZGp1c3RTbGlkZXJUaHVtYlN0eWxlKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lRWZsOjphZGp1c3RTbGlkZXJUaHVtYlNpemUpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVFZmw6OnNsaWRlclRpY2tTaXplKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lRWZsOjpzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpzbGlkZXJUaWNrU25hcHBpbmdUaHJlc2hv
bGQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVFZmw6OnN1cHBvcnRzRGF0YUxpc3RV
SSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6cGFpbnRTbGlkZXJUaHVtYik6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6YWRqdXN0Q2hlY2tib3hTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6cGFpbnRDaGVja2JveCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6YWRqdXN0UmFkaW9TdHlsZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6cGFpbnRSYWRpbyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZUVmbDo6YWRqdXN0QnV0dG9uU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVFZmw6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lRWZsOjphZGp1c3RNZW51TGlzdFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lRWZsOjpwYWludE1lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZs
OjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lRWZsOjpwYWludE1lbnVMaXN0QnV0dG9uRGVjb3JhdGlvbnMpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVFZmw6OmFkanVzdFRleHRGaWVsZFN0eWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lRWZsOjpwYWludFRleHRGaWVsZCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZUVmbDo6YWRqdXN0VGV4dEFyZWFTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZUVmbDo6cGFpbnRUZXh0QXJlYSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUVmbDo6YWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVFZmw6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjphZGp1c3RTZWFyY2hGaWVsZFJlc3Vs
dHNEZWNvcmF0aW9uUGFydFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZs
OjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb25QYXJ0KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lRWZsOjphZGp1c3RTZWFyY2hGaWVsZENhbmNlbEJ1dHRvblN0eWxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpwYWludFNlYXJjaEZpZWxkQ2FuY2Vs
QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjphZGp1c3RTZWFyY2hG
aWVsZFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpwYWludFNlYXJj
aEZpZWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjphZGp1c3RJbm5lclNw
aW5CdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6cGFpbnRJ
bm5lclNwaW5CdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVFZmw6OnNldERl
ZmF1bHRGb250U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6dXBkYXRl
Q2FjaGVkU3lzdGVtRm9udERlc2NyaXB0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lRWZsOjphZGp1c3RQcm9ncmVzc0JhclN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lRWZsOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjphbmltYXRpb25EdXJhdGlvbkZvclByb2dyZXNz
QmFyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjpwYWludFByb2dyZXNzQmFy
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lRWZsOjptZWRpYUNvbnRyb2xzU3R5bGVT
aGVldCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUVmbDo6bWVkaWFDb250cm9sc1Nj
cmlwdCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lRWZsLmg6IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvUmVuZGVyVGhlbWVFZmwuaC4KKwogMjAxNS0w
OC0yNiAgTXlsZXMgQy4gTWF4ZmllbGQgIDxtbWF4ZmllbGRAYXBwbGUuY29tPgogCiAgICAgICAg
IFtDb2NvYV0gUGVyZm9ybWFuY2VUZXN0IExheW91dC9SZWdpb25zU2hhcGVzLmh0bWwgaXMgZmFp
bGluZwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvUGxhdGZvcm1FZmwuY21ha2UgYi9Tb3Vy
Y2UvV2ViQ29yZS9QbGF0Zm9ybUVmbC5jbWFrZQppbmRleCA5MzkzMTQ5NTA2MzI5NTA4MGE2MzYx
YzU5YmYwNzYzMDRiZWM2OGJhLi5mNDY5OTYwMzg1MTQ5MTRmZTUyNDNhOWNhMmVlZWMzOTI2Mzg4
MTE3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUVmbC5jbWFrZQorKysgYi9T
b3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUVmbC5jbWFrZQpAQCAtMTE5LDcgKzExOSw2IEBAIGxpc3Qo
QVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgIHBsYXRmb3JtL2VmbC9QbGF0Zm9ybU1vdXNlRXZl
bnRFZmwuY3BwCiAgICAgcGxhdGZvcm0vZWZsL1BsYXRmb3JtU2NyZWVuRWZsLmNwcAogICAgIHBs
YXRmb3JtL2VmbC9QbGF0Zm9ybVdoZWVsRXZlbnRFZmwuY3BwCi0gICAgcGxhdGZvcm0vZWZsL1Jl
bmRlclRoZW1lRWZsLmNwcAogICAgIHBsYXRmb3JtL2VmbC9TY3JvbGxiYXJUaGVtZUVmbC5jcHAK
ICAgICBwbGF0Zm9ybS9lZmwvU2hhcmVkVGltZXJFZmwuY3BwCiAgICAgcGxhdGZvcm0vZWZsL1Nv
dW5kRWZsLmNwcApAQCAtMjg0LDYgKzI4Myw4IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNF
UwogICAgIHBsYXRmb3JtL3RleHQvZW5jaGFudC9UZXh0Q2hlY2tlckVuY2hhbnQuY3BwCiAKICAg
ICBwbGF0Zm9ybS90ZXh0L2h5cGhlbi9IeXBoZW5hdGlvbkxpYkh5cGhlbi5jcHAKKworICAgIHJl
bmRlcmluZy9SZW5kZXJUaGVtZUVmbC5jcHAKICkKIAogaWYgKFVTRV9HRU9DTFVFMikKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9SZW5kZXJUaGVtZUVmbC5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvUmVuZGVyVGhlbWVFZmwuY3BwCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAyMmZhNzYxM2ZmY2RmZTBhZTMxOTM4YWQzYTFlMzdkOWNjZjRk
MzE2Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9SZW5kZXJUaGVtZUVmbC5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSwxMDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLgot
ICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+Ci0gKiBDb3B5
cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBJTmRU
IC0gSW5zdGl0dXRvIE5va2lhIGRlIFRlY25vbG9naWEKLSAqIENvcHlyaWdodCAoQykgMjAwOS0y
MDEwIFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAx
MSBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgSW50ZWwgQ29ycG9y
YXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgot
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3Rvbiwg
TUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAiUmVuZGVyVGhlbWVFZmwuaCIKLQotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIK
LSNpbmNsdWRlICJDYWlyb1V0aWxpdGllc0VmbC5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGVQ
bGFjZWhvbGRlci5oIgotI2luY2x1ZGUgIkZsb2F0Um91bmRlZFJlY3QuaCIKLSNpbmNsdWRlICJG
b250RGVzY3JpcHRpb24uaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRl
ICJIVE1MSW5wdXRFbGVtZW50LmgiCi0jaW5jbHVkZSAiSW5wdXRUeXBlTmFtZXMuaCIKLSNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQYWlu
dEluZm8uaCIKLSNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRDYWlyby5oIgotI2luY2x1ZGUgIlJl
bmRlckJveC5oIgotI2luY2x1ZGUgIlJlbmRlck9iamVjdC5oIgotI2luY2x1ZGUgIlJlbmRlclBy
b2dyZXNzLmgiCi0jaW5jbHVkZSAiUmVuZGVyU2xpZGVyLmgiCi0jaW5jbHVkZSAiU2Nyb2xsYmFy
VGhlbWVFZmwuaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1ZGUgIlVzZXJBZ2VudFNj
cmlwdHMuaCIKLSNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgPEVj
b3JlX0V2YXMuaD4KLSNpbmNsdWRlIDxFZGplLmg+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUg
PHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+
Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LQotLy8gVE9ETzogY2hhbmdlIGZyb20gb2JqZWN0IGNvdW50IHRvIGVjb3JlX2V2YXMgc2l6ZSAo
Ynl0ZXMpCi0vLyBUT0RPOiBhcyBvYmplY3RzIGFyZSB3ZWJwYWdlL3VzZXIgZGVmaW5lZCBhbmQg
dGhleSBjYW4gYmUgdmVyeSBsYXJnZS4KLSNkZWZpbmUgUkVOREVSX1RIRU1FX0VGTF9QQVJUX0NB
Q0hFX01BWCAzMgotCi0vLyBJbml0aWFsaXplIGRlZmF1bHQgZm9udCBzaXplLgotZmxvYXQgUmVu
ZGVyVGhlbWVFZmw6OmRlZmF1bHRGb250U2l6ZSA9IDE2LjBmOwotCi1zdGF0aWMgY29uc3QgZmxv
YXQgbWluQ2FuY2VsQnV0dG9uU2l6ZSA9IDU7Ci1zdGF0aWMgY29uc3QgZmxvYXQgbWF4Q2FuY2Vs
QnV0dG9uU2l6ZSA9IDIxOwotCi1zdGF0aWMgY29uc3QgZmxvYXQgbWluU2VhcmNoRGVjb3JhdGlv
bkJ1dHRvblNpemUgPSAxOwotc3RhdGljIGNvbnN0IGZsb2F0IG1heFNlYXJjaERlY29yYXRpb25C
dXR0b25TaXplID0gMTU7Ci1zdGF0aWMgY29uc3QgZmxvYXQgc2VhcmNoRmllbGREZWNvcmF0aW9u
QnV0dG9uT2Zmc2V0ID0gMzsKLQotLy8gQ29uc3RhbnRzIGZvciBwcm9ncmVzcyB0YWcgYW5pbWF0
aW9uLgotLy8gVGhlc2UgdmFsdWVzIGhhdmUgYmVlbiBjb3BpZWQgZnJvbSBSZW5kZXJUaGVtZUd0
ay5jcHAKLXN0YXRpYyBjb25zdCBpbnQgcHJvZ3Jlc3NBbmltYXRpb25GcmFtZXMgPSAxMDsKLXN0
YXRpYyBjb25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZhbCA9IDAuMTI1OwotCi1z
dGF0aWMgY29uc3QgaW50IHNsaWRlclRodW1iV2lkdGggPSAyOTsKLXN0YXRpYyBjb25zdCBpbnQg
c2xpZGVyVGh1bWJIZWlnaHQgPSAxMTsKLQotI2RlZmluZSBfQVNTRVJUX09OX1JFTEVBU0VfUkVU
VVJOKG8sIGZtdCwgLi4uKSBcCi0gICAgZG8geyBpZiAoIW8pIHsgRUlOQV9MT0dfQ1JJVChmbXQs
ICMjIF9fVkFfQVJHU19fKTsgQVNTRVJUKG8pOyByZXR1cm47IH0gfSB3aGlsZSAoMCkKLSNkZWZp
bmUgX0FTU0VSVF9PTl9SRUxFQVNFX1JFVFVSTl9WQUwobywgdmFsLCBmbXQsIC4uLikgXAotICAg
IGRvIHsgaWYgKCFvKSB7IEVJTkFfTE9HX0NSSVQoZm10LCAjIyBfX1ZBX0FSR1NfXyk7IEFTU0VS
VChvKTsgcmV0dXJuIHZhbDsgfSB9IHdoaWxlICgwKQotCi0KLXN0YXRpYyBjb25zdCBjaGFyKiB0
b0VkamVHcm91cChGb3JtVHlwZSB0eXBlKQotewotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBncm91
cHNbXSA9IHsKLSAgICAgICAgIndlYmtpdC93aWRnZXQvYnV0dG9uIiwKLSAgICAgICAgIndlYmtp
dC93aWRnZXQvcmFkaW8iLAotICAgICAgICAid2Via2l0L3dpZGdldC9lbnRyeSIsCi0gICAgICAg
ICJ3ZWJraXQvd2lkZ2V0L2NoZWNrYm94IiwKLSAgICAgICAgIndlYmtpdC93aWRnZXQvY29tYm8i
LAotICAgICAgICAid2Via2l0L3dpZGdldC9wcm9ncmVzc2JhciIsCi0gICAgICAgICJ3ZWJraXQv
d2lkZ2V0L3Njcm9sbGJhci9ob3Jpem9udGFsX3RodW1iIiwKLSAgICAgICAgIndlYmtpdC93aWRn
ZXQvc2Nyb2xsYmFyL2hvcml6b250YWxfYmFja2dyb3VuZCIsCi0gICAgICAgICJ3ZWJraXQvd2lk
Z2V0L3Njcm9sbGJhci92ZXJ0aWNhbF90aHVtYiIsCi0gICAgICAgICJ3ZWJraXQvd2lkZ2V0L3Nj
cm9sbGJhci92ZXJ0aWNhbF9iYWNrZ3JvdW5kIiwKLSAgICAgICAgIndlYmtpdC93aWRnZXQvc2Vh
cmNoL2ZpZWxkIiwKLSAgICAgICAgIndlYmtpdC93aWRnZXQvc2VhcmNoL3Jlc3VsdHNfYnV0dG9u
IiwKLSAgICAgICAgIndlYmtpdC93aWRnZXQvc2VhcmNoL3Jlc3VsdHNfZGVjb3JhdGlvbiIsCi0g
ICAgICAgICJ3ZWJraXQvd2lkZ2V0L3NlYXJjaC9jYW5jZWxfYnV0dG9uIiwKLSAgICAgICAgIndl
YmtpdC93aWRnZXQvc2xpZGVyL3ZlcnRpY2FsIiwKLSAgICAgICAgIndlYmtpdC93aWRnZXQvc2xp
ZGVyL2hvcml6b250YWwiLAotICAgICAgICAid2Via2l0L3dpZGdldC9zbGlkZXIvdGh1bWJfdmVy
dGljYWwiLAotICAgICAgICAid2Via2l0L3dpZGdldC9zbGlkZXIvdGh1bWJfaG9yaXpvbnRhbCIs
Ci0gICAgICAgICJ3ZWJraXQvd2lkZ2V0L3NwaW5uZXIiLAotICAgICAgICAwCi0gICAgfTsKLSAg
ICBBU1NFUlQodHlwZSA+PSAwKTsKLSAgICBBU1NFUlQoKHNpemVfdCl0eXBlIDwgc2l6ZW9mKGdy
b3VwcykgLyBzaXplb2YoZ3JvdXBzWzBdKSk7IC8vIE91dCBvZiBzeW5jPwotICAgIHJldHVybiBn
cm91cHNbdHlwZV07Ci19Ci0KLXN0YXRpYyBib29sIHNldFNvdXJjZUdyb3VwRm9yRWRqZU9iamVj
dChFdmFzX09iamVjdCogbywgY29uc3QgU3RyaW5nJiB0aGVtZVBhdGgsIGNvbnN0IGNoYXIqIGdy
b3VwKQotewotICAgIEFTU0VSVChvKTsKLSAgICBBU1NFUlQoIXRoZW1lUGF0aC5pc0VtcHR5KCkp
OwotCi0gICAgaWYgKCFlZGplX29iamVjdF9maWxlX3NldChvLCB0aGVtZVBhdGgudXRmOCgpLmRh
dGEoKSwgZ3JvdXApKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UgPSBlZGplX2xvYWRf
ZXJyb3Jfc3RyKGVkamVfb2JqZWN0X2xvYWRfZXJyb3JfZ2V0KG8pKTsKLSAgICAgICAgRUlOQV9M
T0dfRVJSKCJDb3VsZCBub3Qgc2V0IHRoZW1lIGdyb3VwICclcycgb2YgZmlsZSAnJXMnOiAlcyIs
IGdyb3VwLCB0aGVtZVBhdGgudXRmOCgpLmRhdGEoKSwgbWVzc2FnZSk7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVt
ZUVmbDo6YWRqdXN0U2l6ZUNvbnN0cmFpbnRzKFJlbmRlclN0eWxlJiBzdHlsZSwgRm9ybVR5cGUg
dHlwZSkgY29uc3QKLXsKLSAgICBsb2FkVGhlbWVJZk5lZWRlZCgpOwotCi0gICAgLy8gVGhlc2Ug
YXJlIGFsd2F5cyB2YWxpZCwgZXZlbiBpZiBubyB0aGVtZSBjb3VsZCBiZSBsb2FkZWQuCi0gICAg
Y29uc3QgVGhlbWVQYXJ0RGVzYyogZGVzYyA9IG1fcGFydERlc2NzICsgKHNpemVfdCl0eXBlOwot
Ci0gICAgaWYgKHN0eWxlLm1pbldpZHRoKCkuaXNJbnRyaW5zaWMoKSkKLSAgICAgICAgc3R5bGUu
c2V0TWluV2lkdGgoZGVzYy0+bWluLndpZHRoKCkpOwotICAgIGlmIChzdHlsZS5taW5IZWlnaHQo
KS5pc0ludHJpbnNpYygpKQotICAgICAgICBzdHlsZS5zZXRNaW5IZWlnaHQoZGVzYy0+bWluLmhl
aWdodCgpKTsKLQotICAgIGlmIChkZXNjLT5tYXgud2lkdGgoKS52YWx1ZSgpID4gMCAmJiBzdHls
ZS5tYXhXaWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCi0gICAgICAgIHN0eWxlLnNldE1heFdp
ZHRoKGRlc2MtPm1heC53aWR0aCgpKTsKLSAgICBpZiAoZGVzYy0+bWF4LmhlaWdodCgpLnZhbHVl
KCkgPiAwICYmIHN0eWxlLm1heEhlaWdodCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCi0gICAgICAg
IHN0eWxlLnNldE1heEhlaWdodChkZXNjLT5tYXguaGVpZ2h0KCkpOwotCi0gICAgc3R5bGUuc2V0
UGFkZGluZ1RvcChkZXNjLT5wYWRkaW5nLnRvcCgpKTsKLSAgICBzdHlsZS5zZXRQYWRkaW5nQm90
dG9tKGRlc2MtPnBhZGRpbmcuYm90dG9tKCkpOwotICAgIHN0eWxlLnNldFBhZGRpbmdMZWZ0KGRl
c2MtPnBhZGRpbmcubGVmdCgpKTsKLSAgICBzdHlsZS5zZXRQYWRkaW5nUmlnaHQoZGVzYy0+cGFk
ZGluZy5yaWdodCgpKTsKLX0KLQotc3RhdGljIGJvb2wgaXNGb3JtRWxlbWVudFRvb0xhcmdlVG9E
aXNwbGF5KGNvbnN0IEludFNpemUmIGVsZW1lbnRTaXplKQotewotICAgIC8vIFRoaXMgbGltaXQg
b2YgMjAwMDAgcGl4ZWxzIGlzIGhhcmRjb2RlZCBpbnNpZGUgZWRqZSAtLSBhbnl0aGluZyBhYm92
ZSB0aGlzIHNpemUKLSAgICAvLyB3aWxsIGJlIGNsaXBwZWQuIFRoaXMgdmFsdWUgc2VlbXMgdG8g
YmUgcmVhc29uYWJsZSBlbm91Z2ggc28gdGhhdCBoYXJkY29kaW5nIGl0Ci0gICAgLy8gaGVyZSB3
b24ndCBiZSBhIHByb2JsZW0uCi0gICAgc3RhdGljIGNvbnN0IGludCBtYXhFZGplRGltZW5zaW9u
ID0gMjAwMDA7Ci0KLSAgICByZXR1cm4gZWxlbWVudFNpemUud2lkdGgoKSA+IG1heEVkamVEaW1l
bnNpb24gfHwgZWxlbWVudFNpemUuaGVpZ2h0KCkgPiBtYXhFZGplRGltZW5zaW9uOwotfQotCi1z
dGQ6OnVuaXF1ZV9wdHI8UmVuZGVyVGhlbWVFZmw6OlRoZW1lUGFydENhY2hlRW50cnk+IFJlbmRl
clRoZW1lRWZsOjpUaGVtZVBhcnRDYWNoZUVudHJ5OjpjcmVhdGUoY29uc3QgU3RyaW5nJiB0aGVt
ZVBhdGgsIEZvcm1UeXBlIHR5cGUsIGNvbnN0IEludFNpemUmIHNpemUpCi17Ci0gICAgQVNTRVJU
KCF0aGVtZVBhdGguaXNFbXB0eSgpKTsKLQotICAgIGlmIChpc0Zvcm1FbGVtZW50VG9vTGFyZ2VU
b0Rpc3BsYXkoc2l6ZSkgfHwgc2l6ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgRUlOQV9MT0dfRVJS
KCJDYW5ub3QgcmVuZGVyIGFuIGVsZW1lbnQgb2Ygc2l6ZSAlZHglZC4iLCBzaXplLndpZHRoKCks
IHNpemUuaGVpZ2h0KCkpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBh
dXRvIGVudHJ5ID0gc3RkOjptYWtlX3VuaXF1ZTxUaGVtZVBhcnRDYWNoZUVudHJ5PigpOwotCi0g
ICAgZW50cnktPm1fY2FudmFzID0gRWZsVW5pcXVlUHRyPEVjb3JlX0V2YXM+KGVjb3JlX2V2YXNf
YnVmZmVyX25ldyhzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpKTsKLSAgICBpZiAoIWVudHJ5
LT5jYW52YXMoKSkgewotICAgICAgICBFSU5BX0xPR19FUlIoImVjb3JlX2V2YXNfYnVmZmVyX25l
dyglZCwgJWQpIGZhaWxlZC4iLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOwotICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBCeSBkZWZhdWx0IEVGTCBjcmVhdGVz
IGJ1ZmZlcnMgd2l0aG91dCBhbHBoYS4KLSAgICBlY29yZV9ldmFzX2FscGhhX3NldChlbnRyeS0+
Y2FudmFzKCksIEVJTkFfVFJVRSk7Ci0KLSAgICBlbnRyeS0+bV9lZGplID0gRWZsVW5pcXVlUHRy
PEV2YXNfT2JqZWN0PihlZGplX29iamVjdF9hZGQoZWNvcmVfZXZhc19nZXQoZW50cnktPmNhbnZh
cygpKSkpOwotICAgIEFTU0VSVChlbnRyeS0+ZWRqZSgpKTsKLQotICAgIGlmICghc2V0U291cmNl
R3JvdXBGb3JFZGplT2JqZWN0KGVudHJ5LT5lZGplKCksIHRoZW1lUGF0aCwgdG9FZGplR3JvdXAo
dHlwZSkpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGVudHJ5LT5tX3N1cmZhY2Ug
PSBjcmVhdGVTdXJmYWNlRm9yQmFja2luZ1N0b3JlKGVudHJ5LT5jYW52YXMoKSk7Ci0gICAgaWYg
KCFlbnRyeS0+c3VyZmFjZSgpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGV2YXNf
b2JqZWN0X3Jlc2l6ZShlbnRyeS0+ZWRqZSgpLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkp
OwotICAgIGV2YXNfb2JqZWN0X3Nob3coZW50cnktPmVkamUoKSk7Ci0KLSAgICBlbnRyeS0+dHlw
ZSA9IHR5cGU7Ci0gICAgZW50cnktPnNpemUgPSBzaXplOwotCi0gICAgcmV0dXJuIGVudHJ5Owot
fQotCi12b2lkIFJlbmRlclRoZW1lRWZsOjpUaGVtZVBhcnRDYWNoZUVudHJ5OjpyZXVzZShjb25z
dCBTdHJpbmcmIHRoZW1lUGF0aCwgRm9ybVR5cGUgbmV3VHlwZSwgY29uc3QgSW50U2l6ZSYgbmV3
U2l6ZSkKLXsKLSAgICBBU1NFUlQoIXRoZW1lUGF0aC5pc0VtcHR5KCkpOwotCi0gICAgaWYgKHR5
cGUgIT0gbmV3VHlwZSkgewotICAgICAgICB0eXBlID0gbmV3VHlwZTsKLSAgICAgICAgaWYgKCFz
ZXRTb3VyY2VHcm91cEZvckVkamVPYmplY3QoZWRqZSgpLCB0aGVtZVBhdGgsIHRvRWRqZUdyb3Vw
KG5ld1R5cGUpKSkgewotICAgICAgICAgICAgdHlwZSA9IEZvcm1UeXBlTGFzdDsgLy8gSW52YWxp
ZGF0ZS4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChz
aXplICE9IG5ld1NpemUpIHsKLSAgICAgICAgc2l6ZSA9IG5ld1NpemU7Ci0gICAgICAgIGVjb3Jl
X2V2YXNfcmVzaXplKGNhbnZhcygpLCBuZXdTaXplLndpZHRoKCksIG5ld1NpemUuaGVpZ2h0KCkp
OwotICAgICAgICBldmFzX29iamVjdF9yZXNpemUoZWRqZSgpLCBuZXdTaXplLndpZHRoKCksIG5l
d1NpemUuaGVpZ2h0KCkpOwotCi0gICAgICAgIG1fc3VyZmFjZSA9IGNyZWF0ZVN1cmZhY2VGb3JC
YWNraW5nU3RvcmUoY2FudmFzKCkpOwotICAgICAgICBpZiAoIXN1cmZhY2UoKSkgewotICAgICAg
ICAgICAgdHlwZSA9IEZvcm1UeXBlTGFzdDsgLy8gSW52YWxpZGF0ZTsKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotUmVuZGVyVGhlbWVFZmw6OlRoZW1lUGFydENh
Y2hlRW50cnkqIFJlbmRlclRoZW1lRWZsOjpnZXRUaGVtZVBhcnRGcm9tQ2FjaGUoRm9ybVR5cGUg
dHlwZSwgY29uc3QgSW50U2l6ZSYgc2l6ZSkKLXsKLSAgICBzaXplX3QgcmV1c2FibGVOb2RlSW5k
ZXggPSAwOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BhcnRDYWNoZS5zaXplKCk7
ICsraSkgewotICAgICAgICBUaGVtZVBhcnRDYWNoZUVudHJ5KiBjYW5kaWRhdGVkRW50cnkgPSBt
X3BhcnRDYWNoZVtpXS5nZXQoKTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZWRFbnRyeS0+c2l6ZSA9
PSBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlZEVudHJ5LT50eXBlID09IHR5cGUp
IHsKLSAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgcmlnaHQgaXRlbSwgbW92ZSBpdCB0byB0
aGUgaGVhZCBvZiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm4gaXQuCi0g
ICAgICAgICAgICAgICAgYXV0byB0ZW1wID0gV1RGOjptb3ZlKG1fcGFydENhY2hlW2ldKTsKLSAg
ICAgICAgICAgICAgICBtX3BhcnRDYWNoZS5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgbV9w
YXJ0Q2FjaGUuaW5zZXJ0KDAsIFdURjo6bW92ZSh0ZW1wKSk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIG1fcGFydENhY2hlLmZpcnN0KCkuZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICByZXVzYWJsZU5vZGVJbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobV9w
YXJ0Q2FjaGUuc2l6ZSgpIDwgUkVOREVSX1RIRU1FX0VGTF9QQVJUX0NBQ0hFX01BWCkgewotICAg
ICAgICBhdXRvIGVudHJ5ID0gVGhlbWVQYXJ0Q2FjaGVFbnRyeTo6Y3JlYXRlKHRoZW1lUGF0aCgp
LCB0eXBlLCBzaXplKTsKLSAgICAgICAgaWYgKGVudHJ5KQotICAgICAgICAgICAgbV9wYXJ0Q2Fj
aGUuaW5zZXJ0KDAsIFdURjo6bW92ZShlbnRyeSkpOwotCi0gICAgICAgIHJldHVybiBtX3BhcnRD
YWNoZS5maXJzdCgpLmdldCgpOwotICAgIH0KLQotICAgIC8vIFRoZSBjYWNoZSBpcyBmdWxsLCBy
ZXVzZSB0aGUgbGFzdCBpdGVtIHdlIGZvdW5kIHRoYXQgaGFkIHRoZQotICAgIC8vIHJlcXVlc3Rl
ZCBzaXplIHRvIGF2b2lkIHJlc2l6aW5nLiBJZiB0aGVyZSB3YXMgbm9uZSwgcmV1c2UKLSAgICAv
LyB0aGUgbGFzdCBpdGVtIG9mIHRoZSBsaXN0LgotICAgIGlmICghcmV1c2FibGVOb2RlSW5kZXgp
Ci0gICAgICAgIHJldXNhYmxlTm9kZUluZGV4ID0gbV9wYXJ0Q2FjaGUuc2l6ZSgpIC0gMTsKLQot
ICAgIFRoZW1lUGFydENhY2hlRW50cnkqIHJldXNlZEVudHJ5ID0gbV9wYXJ0Q2FjaGVbcmV1c2Fi
bGVOb2RlSW5kZXhdLmdldCgpOwotICAgIEFTU0VSVChyZXVzZWRFbnRyeSk7Ci0gICAgcmV1c2Vk
RW50cnktPnJldXNlKHRoZW1lUGF0aCgpLCB0eXBlLCBzaXplKTsKLSAgICBhdXRvIHRlbXAgPSBX
VEY6Om1vdmUobV9wYXJ0Q2FjaGVbcmV1c2FibGVOb2RlSW5kZXhdKTsKLSAgICBtX3BhcnRDYWNo
ZS5yZW1vdmUocmV1c2FibGVOb2RlSW5kZXgpOwotICAgIG1fcGFydENhY2hlLmluc2VydCgwLCBX
VEY6Om1vdmUodGVtcCkpOwotCi0gICAgcmV0dXJuIG1fcGFydENhY2hlLmZpcnN0KCkuZ2V0KCk7
Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVFZmw6OmNsZWFyVGhlbWVQYXJ0Q2FjaGUoKQotewotICAg
IGZvciAoYXV0byYgcGFydCA6IG1fcGFydENhY2hlKQotICAgICAgICBwYXJ0ID0gbnVsbHB0cjsK
LX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YXBwbHlFZGplU3RhdGVGcm9tRm9ybShFdmFzX09i
amVjdCogb2JqZWN0LCBjb25zdCBDb250cm9sU3RhdGVzKiBzdGF0ZXMsIGJvb2wgaGF2ZUJhY2tn
cm91bmQpCi17Ci0gICAgY29uc3QgY2hhciAqc2lnbmFsc1tdID0geyAvLyBrZWVwIGluIHN5bmMg
d2l0aCBXZWJDb3JlL3BsYXRmb3JtL1RoZW1lVHlwZXMuaAotICAgICAgICAiaG92ZXJlZCIsCi0g
ICAgICAgICJwcmVzc2VkIiwKLSAgICAgICAgImZvY3VzZWQiLAotICAgICAgICAiZW5hYmxlZCIs
Ci0gICAgICAgICJjaGVja2VkIiwKLSAgICAgICAgInJlYWQtb25seSIsCi0gICAgICAgICJkZWZh
dWx0IiwKLSAgICAgICAgIndpbmRvdy1pbmFjdGl2ZSIsCi0gICAgICAgICJpbmRldGVybWluYXRl
IiwKLSAgICAgICAgInNwaW51cCIKLSAgICB9OwotCi0gICAgZWRqZV9vYmplY3Rfc2lnbmFsX2Vt
aXQob2JqZWN0LCAicmVzZXQiLCAiIik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFdU
Rl9BUlJBWV9MRU5HVEgoc2lnbmFscyk7ICsraSkgewotICAgICAgICBpZiAoc3RhdGVzLT5zdGF0
ZXMoKSAmICgxIDw8IGkpKQotICAgICAgICAgICAgZWRqZV9vYmplY3Rfc2lnbmFsX2VtaXQob2Jq
ZWN0LCBzaWduYWxzW2ldLCAiIik7Ci0gICAgfQotCi0gICAgaWYgKGhhdmVCYWNrZ3JvdW5kKQot
ICAgICAgICBlZGplX29iamVjdF9zaWduYWxfZW1pdChvYmplY3QsICJzdHlsZWQiLCAiIik7Ci19
Ci0KLXZvaWQgUmVuZGVyVGhlbWVFZmw6OmFwcGx5RWRqZVJUTFN0YXRlKEV2YXNfT2JqZWN0KiBl
ZGplLCBjb25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgRm9ybVR5cGUgdHlwZSwgY29uc3QgSW50
UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAodHlwZSA9PSBTbGlkZXJWZXJ0aWNhbCB8fCB0eXBlID09
IFNsaWRlckhvcml6b250YWwpIHsKLSAgICAgICAgaWYgKCFpczxSZW5kZXJTbGlkZXI+KG9iamVj
dCkpCi0gICAgICAgICAgICByZXR1cm47IC8vIHByb2JhYmx5IGhhdmUgLXdlYmtpdC1hcHBlYXJh
bmNlOiBzbGlkZXIuLgotCi0gICAgICAgIEhUTUxJbnB1dEVsZW1lbnQmIGlucHV0ID0gZG93bmNh
c3Q8UmVuZGVyU2xpZGVyPihvYmplY3QpLmVsZW1lbnQoKTsKLSAgICAgICAgZG91YmxlIHZhbHVl
UmFuZ2UgPSBpbnB1dC5tYXhpbXVtKCkgLSBpbnB1dC5taW5pbXVtKCk7Ci0KLSAgICAgICAgYXV0
byBtc2cgPSBzdGQ6Om1ha2VfdW5pcXVlPEVkamVfTWVzc2FnZV9GbG9hdF9TZXQ+KCk7Ci0gICAg
ICAgIG1zZy0+Y291bnQgPSAyOwotCi0gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgb2Yg
dGhlIG1lc3NhZ2UgZGVjaWRlcyBpZiB0aGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgIC8vIGdyb3dz
IGZyb20gdGhlIGVuZCBvZiB0aGUgc2xpZGVyIG9yIGZyb20gdGhlIGJlZ2lubmluZy4gT24gdmVy
dGljYWwKLSAgICAgICAgLy8gc2xpZGVycywgaXQgc2hvdWxkIGFsd2F5cyBiZSB0aGUgc2FtZSBh
bmQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkKLSAgICAgICAgLy8gdGV4dCBkaXJlY3Rpb24gc2V0
dGluZ3MuCi0gICAgICAgIGlmIChvYmplY3Quc3R5bGUoKS5kaXJlY3Rpb24oKSA9PSBSVEwgfHwg
dHlwZSA9PSBTbGlkZXJWZXJ0aWNhbCkKLSAgICAgICAgICAgIG1zZy0+dmFsWzBdID0gMTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgbXNnLT52YWxbMF0gPSAwOwotCi0gICAgICAgIG1zZy0+
dmFsWzFdID0gKGlucHV0LnZhbHVlQXNOdW1iZXIoKSAtIGlucHV0Lm1pbmltdW0oKSkgLyB2YWx1
ZVJhbmdlOwotICAgICAgICBlZGplX29iamVjdF9tZXNzYWdlX3NlbmQoZWRqZSwgRURKRV9NRVNT
QUdFX0ZMT0FUX1NFVCwgMCwgbXNnLmdldCgpKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUHJv
Z3Jlc3NCYXIpIHsKLSAgICAgICAgY29uc3QgYXV0byYgcmVuZGVyUHJvZ3Jlc3MgPSBkb3duY2Fz
dDxSZW5kZXJQcm9ncmVzcz4ob2JqZWN0KTsKLQotICAgICAgICBpbnQgbWF4ID0gcmVjdC53aWR0
aCgpOwotICAgICAgICBkb3VibGUgdmFsdWUgPSByZW5kZXJQcm9ncmVzcy5wb3NpdGlvbigpOwot
Ci0gICAgICAgIGF1dG8gbXNnID0gc3RkOjptYWtlX3VuaXF1ZTxFZGplX01lc3NhZ2VfRmxvYXRf
U2V0PigpOwotICAgICAgICBtc2ctPmNvdW50ID0gMjsKLQotICAgICAgICBpZiAob2JqZWN0LnN0
eWxlKCkuZGlyZWN0aW9uKCkgPT0gUlRMKQotICAgICAgICAgICAgbXNnLT52YWxbMF0gPSAoMS4w
IC0gdmFsdWUpICogbWF4OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtc2ctPnZhbFswXSA9
IDA7Ci0gICAgICAgIG1zZy0+dmFsWzFdID0gdmFsdWU7Ci0gICAgICAgIGVkamVfb2JqZWN0X21l
c3NhZ2Vfc2VuZChlZGplLCBFREpFX01FU1NBR0VfRkxPQVRfU0VULCAwLCBtc2cuZ2V0KCkpOwot
ICAgIH0KLX0KLQotYm9vbCBSZW5kZXJUaGVtZUVmbDo6aXNDb250cm9sU3R5bGVkKGNvbnN0IFJl
bmRlclN0eWxlJiBzdHlsZSwgY29uc3QgQm9yZGVyRGF0YSYgYm9yZGVyLCBjb25zdCBGaWxsTGF5
ZXImIGJhY2tncm91bmQsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3IpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIFJlbmRlclRoZW1lOjppc0NvbnRyb2xTdHlsZWQoc3R5bGUsIGJvcmRlciwgYmFj
a2dyb3VuZCwgYmFja2dyb3VuZENvbG9yKSB8fCBzdHlsZS5hcHBlYXJhbmNlKCkgPT0gTWVudWxp
c3RCdXR0b25QYXJ0OwotfQotCi1ib29sIFJlbmRlclRoZW1lRWZsOjpwYWludFRoZW1lUGFydChj
b25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgRm9ybVR5cGUgdHlwZSwgY29uc3QgUGFpbnRJbmZv
JiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGxvYWRUaGVtZUlmTmVlZGVkKCk7
Ci0gICAgX0FTU0VSVF9PTl9SRUxFQVNFX1JFVFVSTl9WQUwoZWRqZSgpLCBmYWxzZSwgIkNvdWxk
IG5vdCBwYWludCBuYXRpdmUgSFRNTCBwYXJ0IGR1ZSB0byBtaXNzaW5nIHRoZW1lLiIpOwotCi0g
ICAgVGhlbWVQYXJ0Q2FjaGVFbnRyeSogZW50cnkgPSBnZXRUaGVtZVBhcnRGcm9tQ2FjaGUodHlw
ZSwgcmVjdC5zaXplKCkpOwotICAgIGlmICghZW50cnkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGJvb2wgaGF2ZUJhY2tncm91bmRDb2xvciA9IGlzQ29udHJvbFN0eWxlZChvYmplY3Qu
c3R5bGUoKSwgb2JqZWN0LnN0eWxlKCkuYm9yZGVyKCksICpvYmplY3Quc3R5bGUoKS5iYWNrZ3Jv
dW5kTGF5ZXJzKCksIENvbG9yOjp3aGl0ZSk7Ci0gICAgQ29udHJvbFN0YXRlcyBzdGF0ZXMoZXh0
cmFjdENvbnRyb2xTdGF0ZXNGb3JSZW5kZXJlcihvYmplY3QpKTsKLSAgICBhcHBseUVkamVTdGF0
ZUZyb21Gb3JtKGVudHJ5LT5lZGplKCksICZzdGF0ZXMsIGhhdmVCYWNrZ3JvdW5kQ29sb3IpOwot
Ci0gICAgYXBwbHlFZGplUlRMU3RhdGUoZW50cnktPmVkamUoKSwgb2JqZWN0LCB0eXBlLCByZWN0
KTsKLQotICAgIGVkamVfb2JqZWN0X2NhbGNfZm9yY2UoZW50cnktPmVkamUoKSk7Ci0gICAgZWRq
ZV9vYmplY3RfbWVzc2FnZV9zaWduYWxfcHJvY2VzcyhlbnRyeS0+ZWRqZSgpKTsKLSAgICBldmFz
X3JlbmRlcihlY29yZV9ldmFzX2dldChlbnRyeS0+Y2FudmFzKCkpKTsKLQotICAgIGNhaXJvX3Qq
IGNhaXJvID0gaW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKTsKLSAgICBBU1NF
UlQoY2Fpcm8pOwotCi0gICAgY2Fpcm9fc2F2ZShjYWlybyk7Ci0gICAgY2Fpcm9fc2V0X3NvdXJj
ZV9zdXJmYWNlKGNhaXJvLCBlbnRyeS0+c3VyZmFjZSgpLCByZWN0LngoKSwgcmVjdC55KCkpOwot
ICAgIGNhaXJvX3BhaW50X3dpdGhfYWxwaGEoY2Fpcm8sIDEuMCk7Ci0gICAgY2Fpcm9fcmVzdG9y
ZShjYWlybyk7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVFZmw6
OnBhaW50VGhlbWVQYXJ0KGNvbnN0IEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgRm9ybVR5cGUg
dHlwZSwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBsb2FkVGhlbWVJZk5lZWRlZCgpOwot
ICAgIF9BU1NFUlRfT05fUkVMRUFTRV9SRVRVUk5fVkFMKGVkamUoKSwgZmFsc2UsICJDb3VsZCBu
b3QgcGFpbnQgbmF0aXZlIEhUTUwgcGFydCBkdWUgdG8gbWlzc2luZyB0aGVtZS4iKTsKLQotICAg
IFRoZW1lUGFydENhY2hlRW50cnkqIGVudHJ5ID0gZ2V0VGhlbWVQYXJ0RnJvbUNhY2hlKHR5cGUs
IHJlY3Quc2l6ZSgpKTsKLSAgICBBU1NFUlQoZW50cnkpOwotCi0gICAgZWRqZV9vYmplY3RfY2Fs
Y19mb3JjZShlbnRyeS0+ZWRqZSgpKTsKLSAgICBlZGplX29iamVjdF9tZXNzYWdlX3NpZ25hbF9w
cm9jZXNzKGVudHJ5LT5lZGplKCkpOwotICAgIGV2YXNfcmVuZGVyKGVjb3JlX2V2YXNfZ2V0KGVu
dHJ5LT5jYW52YXMoKSkpOwotCi0gICAgY2Fpcm9fdCogY2Fpcm8gPSBjb250ZXh0LnBsYXRmb3Jt
Q29udGV4dCgpLT5jcigpOwotICAgIEFTU0VSVChjYWlybyk7Ci0KLSAgICBjYWlyb19zYXZlKGNh
aXJvKTsKLSAgICBjYWlyb19zZXRfc291cmNlX3N1cmZhY2UoY2Fpcm8sIGVudHJ5LT5zdXJmYWNl
KCksIHJlY3QueCgpLCByZWN0LnkoKSk7Ci0gICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjYWly
bywgMS4wKTsKLSAgICBjYWlyb19yZXN0b3JlKGNhaXJvKTsKLQotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWVFZmw6OmNyZWF0ZShQYWdl
KiBwYWdlKQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVuZGVyVGhlbWVFZmwocGFnZSkp
OwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdl
KFBhZ2UqIHBhZ2UpCi17Ci0gICAgaWYgKHBhZ2UpCi0gICAgICAgIHJldHVybiBSZW5kZXJUaGVt
ZUVmbDo6Y3JlYXRlKHBhZ2UpOwotCi0gICAgc3RhdGljIFJlbmRlclRoZW1lKiBmYWxsYmFjayA9
IFJlbmRlclRoZW1lRWZsOjpjcmVhdGUoMCkubGVha1JlZigpOwotICAgIHJldHVybiBmYWxsYmFj
azsKLX0KLQotc3RhdGljIHZvaWQgYXBwbHlDb2xvckNhbGxiYWNrKHZvaWQqIGRhdGEsIEV2YXNf
T2JqZWN0KiwgY29uc3QgY2hhciogLyogc2lnbmFsICovLCBjb25zdCBjaGFyKiBjb2xvckNsYXNz
KQotewotICAgIFJlbmRlclRoZW1lRWZsKiB0aGF0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGhlbWVF
ZmwqPihkYXRhKTsKLSAgICB0aGF0LT5zZXRDb2xvckZyb21UaGVtZUNsYXNzKGNvbG9yQ2xhc3Mp
OwotICAgIHRoYXQtPnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7IC8vIFRyaWdnZXJzIHJlbGF5
b3V0LgotfQotCi1zdGF0aWMgYm9vbCBmaWxsQ29sb3JzRnJvbUVkamVDbGFzcyhFdmFzX09iamVj
dCogbywgY29uc3QgY2hhciogY29sb3JDbGFzcywgQ29sb3IqIGNvbG9yMSwgQ29sb3IqIGNvbG9y
MiA9IDAsIENvbG9yKiBjb2xvcjMgPSAwKQotewotICAgIGludCByMSwgZzEsIGIxLCBhMTsKLSAg
ICBpbnQgcjIsIGcyLCBiMiwgYTI7Ci0gICAgaW50IHIzLCBnMywgYjMsIGEzOwotCi0gICAgaWYg
KCFlZGplX29iamVjdF9jb2xvcl9jbGFzc19nZXQobywgY29sb3JDbGFzcywgJnIxLCAmZzEsICZi
MSwgJmExLCAmcjIsICZnMiwgJmIyLCAmYTIsICZyMywgJmczLCAmYjMsICZhMykpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmIChjb2xvcjEpCi0gICAgICAgIGNvbG9yMS0+c2V0UkdC
KG1ha2VSR0JBKHIxLCBnMSwgYjEsIGExKSk7Ci0gICAgaWYgKGNvbG9yMikKLSAgICAgICAgY29s
b3IyLT5zZXRSR0IobWFrZVJHQkEocjIsIGcyLCBiMiwgYTIpKTsKLSAgICBpZiAoY29sb3IzKQot
ICAgICAgICBjb2xvcjMtPnNldFJHQihtYWtlUkdCQShyMywgZzMsIGIzLCBhMykpOwotCi0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVFZmw6OnNldENvbG9yRnJvbVRoZW1l
Q2xhc3MoY29uc3QgY2hhciogY29sb3JDbGFzcykKLXsKLSAgICBBU1NFUlQoZWRqZSgpKTsKLQot
ICAgIGlmICghc3RyY21wKCJ3ZWJraXQvc2VsZWN0aW9uL2ZvcmVncm91bmQiLCBjb2xvckNsYXNz
KSkKLSAgICAgICAgbV9zdXBwb3J0c1NlbGVjdGlvbkZvcmVncm91bmRDb2xvciA9IGZpbGxDb2xv
cnNGcm9tRWRqZUNsYXNzKGVkamUoKSwgY29sb3JDbGFzcywgJm1fYWN0aXZlU2VsZWN0aW9uRm9y
ZWdyb3VuZENvbG9yLCAmbV9pbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik7Ci0gICAg
ZWxzZSBpZiAoIXN0cmNtcCgid2Via2l0L3NlbGVjdGlvbi9iYWNrZ3JvdW5kIiwgY29sb3JDbGFz
cykpCi0gICAgICAgIGZpbGxDb2xvcnNGcm9tRWRqZUNsYXNzKGVkamUoKSwgY29sb3JDbGFzcywg
Jm1fYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yLCAmbV9pbmFjdGl2ZVNlbGVjdGlvbkJh
Y2tncm91bmRDb2xvcik7Ci0gICAgZWxzZSBpZiAoIXN0cmNtcCgid2Via2l0L2ZvY3VzX3Jpbmci
LCBjb2xvckNsYXNzKSkgewotICAgICAgICBpZiAoIWZpbGxDb2xvcnNGcm9tRWRqZUNsYXNzKGVk
amUoKSwgY29sb3JDbGFzcywgJm1fZm9jdXNSaW5nQ29sb3IpKQotICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgIC8vIHBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBpcyBvbmx5IHVzZWQgZm9y
IHRoZSBkZWZhdWx0IHRoZW1lICh3aXRob3V0IHBhZ2UpCi0gICAgICAgIC8vIFRoZSBmb2xsb3dp
bmcgaXMgdWdseSwgYnV0IG5vIG90aGVyIHdheSB0byBkbyBpdCB1bmxlc3Mgd2UgY2hhbmdlIGl0
IHRvIHVzZSBwYWdlIHRoZW1lcyBhcyBtdWNoIGFzIHBvc3NpYmxlLgotICAgICAgICBSZW5kZXJU
aGVtZTo6c2V0Q3VzdG9tRm9jdXNSaW5nQ29sb3IobV9mb2N1c1JpbmdDb2xvcik7Ci0gICAgfQot
fQotCi12b2lkIFJlbmRlclRoZW1lRWZsOjpzZXRUaGVtZVBhdGgoY29uc3QgU3RyaW5nJiBuZXdU
aGVtZVBhdGgpCi17Ci0gICAgaWYgKG5ld1RoZW1lUGF0aCA9PSBtX3RoZW1lUGF0aCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgaWYgKG5ld1RoZW1lUGF0aC5pc0VtcHR5KCkpIHsKLSAgICAgICAg
RUlOQV9MT0dfQ1JJVCgiTm8gdmFsaWQgdGhlbWUgZGVmaW5lZCwgdGhpbmdzIHdpbGwgbm90IHdv
cmsgcHJvcGVybHkuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdHJpbmcgb2xk
VGhlbWVQYXRoID0gbV90aGVtZVBhdGg7Ci0gICAgbV90aGVtZVBhdGggPSBuZXdUaGVtZVBhdGg7
Ci0KLSAgICAvLyBLZWVwIHRoZSBjb25zaXN0ZW5jZSBieSByZXN0b3JpbmcgdGhlIHByZXZpb3Vz
IHRoZW1lIHBhdGgKLSAgICAvLyBpZiB3ZSBjYW5ub3QgbG9hZCB0aGUgbmV3IG9uZS4KLSAgICBp
ZiAoIWxvYWRUaGVtZSgpKQotICAgICAgICBtX3RoZW1lUGF0aCA9IG9sZFRoZW1lUGF0aDsKLX0K
LQotU3RyaW5nIFJlbmRlclRoZW1lRWZsOjp0aGVtZVBhdGgoKSBjb25zdAotewotI2lmbmRlZiBO
REVCVUcKLSAgICBpZiAoZWRqZSgpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHBhdGg7Ci0gICAg
ICAgIGVkamVfb2JqZWN0X2ZpbGVfZ2V0KGVkamUoKSwgJnBhdGgsIDApOwotICAgICAgICBBU1NF
UlQobV90aGVtZVBhdGggPT0gcGF0aCk7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIG1fdGhl
bWVQYXRoOwotfQotCi1ib29sIFJlbmRlclRoZW1lRWZsOjpsb2FkVGhlbWUoKQotewotICAgIEFT
U0VSVCghbV90aGVtZVBhdGguaXNFbXB0eSgpKTsKLQotICAgIGlmICghY2FudmFzKCkpIHsKLSAg
ICAgICAgbV9jYW52YXMgPSBFZmxVbmlxdWVQdHI8RWNvcmVfRXZhcz4oZWNvcmVfZXZhc19idWZm
ZXJfbmV3KDEsIDEpKTsKLSAgICAgICAgX0FTU0VSVF9PTl9SRUxFQVNFX1JFVFVSTl9WQUwoY2Fu
dmFzKCksIGZhbHNlLAotICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGNhbnZhcyBy
ZXF1aXJlZCBieSB0aGVtZSwgdGhpbmdzIHdpbGwgbm90IHdvcmsgcHJvcGVybHkuIik7Ci0gICAg
fQotCi0gICAgRWZsVW5pcXVlUHRyPEV2YXNfT2JqZWN0PiBvID0gRWZsVW5pcXVlUHRyPEV2YXNf
T2JqZWN0PihlZGplX29iamVjdF9hZGQoZWNvcmVfZXZhc19nZXQoY2FudmFzKCkpKSk7Ci0gICAg
X0FTU0VSVF9PTl9SRUxFQVNFX1JFVFVSTl9WQUwobywgZmFsc2UsICJDb3VsZCBub3QgY3JlYXRl
IG5ldyBiYXNlIEVkamUgb2JqZWN0LiIpOwotCi0gICAgaWYgKCFzZXRTb3VyY2VHcm91cEZvckVk
amVPYmplY3Qoby5nZXQoKSwgbV90aGVtZVBhdGgsICJ3ZWJraXQvYmFzZSIpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7IC8vIEtlZXAgY3VycmVudCB0aGVtZS4KLQotICAgIC8vIEludmFsaWRhdGUg
ZXhpc3RpbmcgdGhlbWUgcGFydCBjYWNoZS4KLSAgICBpZiAoZWRqZSgpKQotICAgICAgICBjbGVh
clRoZW1lUGFydENhY2hlKCk7Ci0KLSAgICAvLyBTZXQgbmV3IGxvYWRlZCB0aGVtZSwgYW5kIGFw
cGx5IGl0LgotICAgIG1fZWRqZSA9IFdURjo6bW92ZShvKTsKLQotICAgIGNvbnN0IGNoYXIqIHRo
aWNrbmVzcyA9IGVkamVfb2JqZWN0X2RhdGFfZ2V0KG1fZWRqZS5nZXQoKSwgInNjcm9sbGJhci50
aGlja25lc3MiKTsKLSAgICBpZiAodGhpY2tuZXNzICYmICFTZXR0aW5nczo6bW9ja1Njcm9sbGJh
cnNFbmFibGVkKCkpCi0gICAgICAgIHN0YXRpY19jYXN0PFNjcm9sbGJhclRoZW1lRWZsKj4oU2Ny
b2xsYmFyVGhlbWU6OnRoZW1lKCkpLT5zZXRTY3JvbGxiYXJUaGlja25lc3MoYXRvaSh0aGlja25l
c3MpKTsKLQotICAgIGVkamVfb2JqZWN0X3NpZ25hbF9jYWxsYmFja19hZGQoZWRqZSgpLCAiY29s
b3JfY2xhc3Msc2V0IiwgIndlYmtpdC9zZWxlY3Rpb24vZm9yZWdyb3VuZCIsIGFwcGx5Q29sb3JD
YWxsYmFjaywgdGhpcyk7Ci0gICAgZWRqZV9vYmplY3Rfc2lnbmFsX2NhbGxiYWNrX2FkZChlZGpl
KCksICJjb2xvcl9jbGFzcyxzZXQiLCAid2Via2l0L3NlbGVjdGlvbi9iYWNrZ3JvdW5kIiwgYXBw
bHlDb2xvckNhbGxiYWNrLCB0aGlzKTsKLSAgICBlZGplX29iamVjdF9zaWduYWxfY2FsbGJhY2tf
YWRkKGVkamUoKSwgImNvbG9yX2NsYXNzLHNldCIsICJ3ZWJraXQvZm9jdXNfcmluZyIsIGFwcGx5
Q29sb3JDYWxsYmFjaywgdGhpcyk7Ci0KLSAgICBhcHBseVBhcnREZXNjcmlwdGlvbnNGcm9tKG1f
dGhlbWVQYXRoKTsKLQotICAgIHNldENvbG9yRnJvbVRoZW1lQ2xhc3MoIndlYmtpdC9zZWxlY3Rp
b24vZm9yZWdyb3VuZCIpOwotICAgIHNldENvbG9yRnJvbVRoZW1lQ2xhc3MoIndlYmtpdC9zZWxl
Y3Rpb24vYmFja2dyb3VuZCIpOwotICAgIHNldENvbG9yRnJvbVRoZW1lQ2xhc3MoIndlYmtpdC9m
b2N1c19yaW5nIik7Ci0KLSAgICBwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOyAvLyBTY2hlZHVs
ZXMgYSByZWxheW91dCwgZG8gbGFzdC4KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJl
bmRlclRoZW1lRWZsOjphcHBseVBhcnREZXNjcmlwdGlvbkZhbGxiYWNrKFRoZW1lUGFydERlc2Mq
IGRlc2MpCi17Ci0gICAgZGVzYy0+bWluLnNldFdpZHRoKExlbmd0aCgwLCBGaXhlZCkpOwotICAg
IGRlc2MtPm1pbi5zZXRIZWlnaHQoTGVuZ3RoKDAsIEZpeGVkKSk7Ci0KLSAgICBkZXNjLT5tYXgu
c2V0V2lkdGgoTGVuZ3RoKDAsIEZpeGVkKSk7Ci0gICAgZGVzYy0+bWF4LnNldEhlaWdodChMZW5n
dGgoMCwgRml4ZWQpKTsKLQotICAgIGRlc2MtPnBhZGRpbmcgPSBMZW5ndGhCb3goMCwgMCwgMCwg
MCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVFZmw6OmFwcGx5UGFydERlc2NyaXB0aW9uKEV2YXNf
T2JqZWN0KiBvYmplY3QsIFRoZW1lUGFydERlc2MqIGRlc2MpCi17Ci0gICAgRXZhc19Db29yZCBt
aW53LCBtaW5oLCBtYXh3LCBtYXhoOwotCi0gICAgZWRqZV9vYmplY3Rfc2l6ZV9taW5fZ2V0KG9i
amVjdCwgJm1pbncsICZtaW5oKTsKLSAgICBpZiAoIW1pbncgJiYgIW1pbmgpCi0gICAgICAgIGVk
amVfb2JqZWN0X3NpemVfbWluX2NhbGMob2JqZWN0LCAmbWludywgJm1pbmgpOwotCi0gICAgZGVz
Yy0+bWluLnNldFdpZHRoKExlbmd0aChtaW53LCBGaXhlZCkpOwotICAgIGRlc2MtPm1pbi5zZXRI
ZWlnaHQoTGVuZ3RoKG1pbmgsIEZpeGVkKSk7Ci0KLSAgICBlZGplX29iamVjdF9zaXplX21heF9n
ZXQob2JqZWN0LCAmbWF4dywgJm1heGgpOwotICAgIGRlc2MtPm1heC5zZXRXaWR0aChMZW5ndGgo
bWF4dywgRml4ZWQpKTsKLSAgICBkZXNjLT5tYXguc2V0SGVpZ2h0KExlbmd0aChtYXhoLCBGaXhl
ZCkpOwotCi0gICAgaWYgKCFlZGplX29iamVjdF9wYXJ0X2V4aXN0cyhvYmplY3QsICJ0ZXh0X2Nv
bmZpbmVtZW50IikpCi0gICAgICAgIGRlc2MtPnBhZGRpbmcgPSBMZW5ndGhCb3goMCwgMCwgMCwg
MCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIEV2YXNfQ29vcmQgcHgsIHB5LCBwdywgcGg7Ci0gICAg
ICAgIEV2YXNfQ29vcmQgb3ggPSAwLCBveSA9IDAsIG93ID0gMCwgb2ggPSAwOwotICAgICAgICBp
bnQgdCwgciwgYiwgbDsKLQotICAgICAgICBpZiAobWludyA+IDApCi0gICAgICAgICAgICBvdyA9
IG1pbnc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG93ID0gMTAwOwotICAgICAgICBpZiAo
bWluaCA+IDApCi0gICAgICAgICAgICBvaCA9IG1pbmg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIG9oID0gMTAwOwotICAgICAgICBpZiAobWF4dyA+IDAgJiYgb3cgPiBtYXh3KQotICAgICAg
ICAgICAgb3cgPSBtYXh3OwotICAgICAgICBpZiAobWF4aCA+IDAgJiYgb2ggPiBtYXhoKQotICAg
ICAgICAgICAgb2ggPSBtYXhoOwotCi0gICAgICAgIGV2YXNfb2JqZWN0X21vdmUob2JqZWN0LCBv
eCwgb3kpOwotICAgICAgICBldmFzX29iamVjdF9yZXNpemUob2JqZWN0LCBvdywgb2gpOwotICAg
ICAgICBlZGplX29iamVjdF9jYWxjX2ZvcmNlKG9iamVjdCk7Ci0gICAgICAgIGVkamVfb2JqZWN0
X21lc3NhZ2Vfc2lnbmFsX3Byb2Nlc3Mob2JqZWN0KTsKLSAgICAgICAgZWRqZV9vYmplY3RfcGFy
dF9nZW9tZXRyeV9nZXQob2JqZWN0LCAidGV4dF9jb25maW5lbWVudCIsICZweCwgJnB5LCAmcHcs
ICZwaCk7Ci0KLSAgICAgICAgdCA9IHB5IC0gb3k7Ci0gICAgICAgIGIgPSAob2ggKyBveSkgLSAo
cGggKyBweSk7Ci0KLSAgICAgICAgbCA9IHB4IC0gb3g7Ci0gICAgICAgIHIgPSAob3cgKyBveCkg
LSAocHcgKyBweCk7Ci0KLSAgICAgICAgZGVzYy0+cGFkZGluZyA9IExlbmd0aEJveCh0LCByLCBi
LCBsKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVFZmw6OmFwcGx5UGFydERlc2NyaXB0
aW9uc0Zyb20oY29uc3QgU3RyaW5nJiB0aGVtZVBhdGgpCi17Ci0gICAgRWZsVW5pcXVlUHRyPEV2
YXNfT2JqZWN0PiB0ZW1wID0gRWZsVW5pcXVlUHRyPEV2YXNfT2JqZWN0PihlZGplX29iamVjdF9h
ZGQoZWNvcmVfZXZhc19nZXQoY2FudmFzKCkpKSk7Ci0gICAgX0FTU0VSVF9PTl9SRUxFQVNFX1JF
VFVSTih0ZW1wLCAiQ291bGQgbm90IGNyZWF0ZSBFZGplIG9iamVjdC4iKTsKLQotICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgRm9ybVR5cGVMYXN0OyBpKyspIHsKLSAgICAgICAgRm9ybVR5cGUg
dHlwZSA9IHN0YXRpY19jYXN0PEZvcm1UeXBlPihpKTsKLSAgICAgICAgbV9wYXJ0RGVzY3NbaV0u
dHlwZSA9IHR5cGU7Ci0gICAgICAgIGlmICghc2V0U291cmNlR3JvdXBGb3JFZGplT2JqZWN0KHRl
bXAuZ2V0KCksIHRoZW1lUGF0aCwgdG9FZGplR3JvdXAodHlwZSkpKQotICAgICAgICAgICAgYXBw
bHlQYXJ0RGVzY3JpcHRpb25GYWxsYmFjayhtX3BhcnREZXNjcyArIGkpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBhcHBseVBhcnREZXNjcmlwdGlvbih0ZW1wLmdldCgpLCBtX3BhcnREZXNj
cyArIGkpOwotICAgIH0KLX0KLQotUmVuZGVyVGhlbWVFZmw6OlJlbmRlclRoZW1lRWZsKFBhZ2Uq
IHBhZ2UpCi0gICAgOiBSZW5kZXJUaGVtZSgpCi0gICAgLCBtX3BhZ2UocGFnZSkKLSAgICAsIG1f
YWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKDAsIDAsIDI1NSkKLSAgICAsIG1fYWN0aXZl
U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKENvbG9yOjp3aGl0ZSkKLSAgICAsIG1faW5hY3RpdmVT
ZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoMCwgMCwgMTI4KQotICAgICwgbV9pbmFjdGl2ZVNlbGVj
dGlvbkZvcmVncm91bmRDb2xvcigyMDAsIDIwMCwgMjAwKQotICAgICwgbV9mb2N1c1JpbmdDb2xv
cigzMiwgMzIsIDIyNCwgMjI0KQotICAgICwgbV9zbGlkZXJUaHVtYkNvbG9yKENvbG9yOjpkYXJr
R3JheSkKLSAgICAsIG1fc3VwcG9ydHNTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoZmFsc2UpCi17
Ci19Ci0KLVJlbmRlclRoZW1lRWZsOjp+UmVuZGVyVGhlbWVFZmwoKQotewotICAgIGNsZWFyVGhl
bWVQYXJ0Q2FjaGUoKTsKLX0KLQotc3RhdGljIGJvb2wgc3VwcG9ydHNGb2N1cyhDb250cm9sUGFy
dCBhcHBlYXJhbmNlKQotewotICAgIHN3aXRjaCAoYXBwZWFyYW5jZSkgewotICAgIGNhc2UgUHVz
aEJ1dHRvblBhcnQ6Ci0gICAgY2FzZSBCdXR0b25QYXJ0OgotICAgIGNhc2UgVGV4dEZpZWxkUGFy
dDoKLSAgICBjYXNlIFRleHRBcmVhUGFydDoKLSAgICBjYXNlIFNlYXJjaEZpZWxkUGFydDoKLSAg
ICBjYXNlIE1lbnVsaXN0UGFydDoKLSAgICBjYXNlIFJhZGlvUGFydDoKLSAgICBjYXNlIENoZWNr
Ym94UGFydDoKLSAgICBjYXNlIFNsaWRlclZlcnRpY2FsUGFydDoKLSAgICBjYXNlIFNsaWRlckhv
cml6b250YWxQYXJ0OgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1ib29sIFJlbmRlclRoZW1lRWZsOjpzdXBwb3J0
c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IHN1cHBvcnRzRm9jdXMoc3R5bGUuYXBwZWFyYW5jZSgpKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVt
ZUVmbDo6Y29udHJvbFN1cHBvcnRzVGludHMoY29uc3QgUmVuZGVyT2JqZWN0JiBvYmplY3QpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGlzRW5hYmxlZChvYmplY3QpOwotfQotCi1pbnQgUmVuZGVyVGhl
bWVFZmw6OmJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyQm94JiBib3gpIGNvbnN0Ci17Ci0g
ICAgaWYgKGJveC5zdHlsZSgpLmFwcGVhcmFuY2UoKSA9PSBDaGVja2JveFBhcnQgfHwgYm94LnN0
eWxlKCkuYXBwZWFyYW5jZSgpID09IFJhZGlvUGFydCkKLSAgICAgICAgcmV0dXJuIGJveC5tYXJn
aW5Ub3AoKSArIGJveC5oZWlnaHQoKSAtIDM7Ci0gICAgcmV0dXJuIFJlbmRlclRoZW1lOjpiYXNl
bGluZVBvc2l0aW9uKGJveCk7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lRWZsOjpwbGF0Zm9ybUFj
dGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgbG9hZFRoZW1lSWZO
ZWVkZWQoKTsKLSAgICByZXR1cm4gbV9hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci19
Ci0KLUNvbG9yIFJlbmRlclRoZW1lRWZsOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBsb2FkVGhlbWVJZk5lZWRlZCgpOwotICAgIHJldHVy
biBtX2luYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yOwotfQotCi1Db2xvciBSZW5kZXJU
aGVtZUVmbDo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAot
ewotICAgIGxvYWRUaGVtZUlmTmVlZGVkKCk7Ci0gICAgcmV0dXJuIG1fYWN0aXZlU2VsZWN0aW9u
Rm9yZWdyb3VuZENvbG9yOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUVmbDo6cGxhdGZvcm1JbmFj
dGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgbG9hZFRoZW1lSWZO
ZWVkZWQoKTsKLSAgICByZXR1cm4gbV9pbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcjsK
LX0KLQotQ29sb3IgUmVuZGVyVGhlbWVFZmw6OnBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBjb25z
dAotewotICAgIGxvYWRUaGVtZUlmTmVlZGVkKCk7Ci0gICAgcmV0dXJuIG1fZm9jdXNSaW5nQ29s
b3I7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVFZmw6OnN1cHBvcnRzU2VsZWN0aW9uRm9yZWdyb3Vu
ZENvbG9ycygpIGNvbnN0Ci17Ci0gICAgbG9hZFRoZW1lSWZOZWVkZWQoKTsKLSAgICByZXR1cm4g
bV9zdXBwb3J0c1NlbGVjdGlvbkZvcmVncm91bmRDb2xvcjsKLX0KLQotYm9vbCBSZW5kZXJUaGVt
ZUVmbDo6cGFpbnRTbGlkZXJUcmFjayhjb25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgY29uc3Qg
UGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmIChvYmplY3Qu
c3R5bGUoKS5hcHBlYXJhbmNlKCkgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQpCi0gICAgICAgIHBh
aW50VGhlbWVQYXJ0KG9iamVjdCwgU2xpZGVySG9yaXpvbnRhbCwgaW5mbywgcmVjdCk7Ci0gICAg
ZWxzZQotICAgICAgICBwYWludFRoZW1lUGFydChvYmplY3QsIFNsaWRlclZlcnRpY2FsLCBpbmZv
LCByZWN0KTsKLQotI2lmIEVOQUJMRShEQVRBTElTVF9FTEVNRU5UKQotICAgIHBhaW50U2xpZGVy
VGlja3Mob2JqZWN0LCBpbmZvLCByZWN0KTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi12b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RTbGlkZXJUcmFja1N0eWxlKFN0eWxlUmVz
b2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAgIHN0eWxl
LnNldEJveFNoYWRvdyhudWxscHRyKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0
U2xpZGVyVGh1bWJTdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHls
ZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgUmVuZGVyVGhlbWU6OmFk
anVzdFNsaWRlclRodW1iU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVsZW1lbnQpOwotICAg
IHN0eWxlLnNldEJveFNoYWRvdyhudWxscHRyKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6
YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlJiBzdHlsZSwgRWxlbWVudCopIGNvbnN0
Ci17Ci0gICAgQ29udHJvbFBhcnQgcGFydCA9IHN0eWxlLmFwcGVhcmFuY2UoKTsKLSAgICBpZiAo
cGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgewotICAgICAgICBzdHlsZS5zZXRXaWR0
aChMZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7Ci0gICAgICAgIHN0eWxlLnNldEhl
aWdodChMZW5ndGgoc2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKLSAgICB9IGVsc2UgaWYgKHBh
cnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCkgewotICAgICAgICBzdHlsZS5zZXRXaWR0
aChMZW5ndGgoc2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKLSAgICAgICAgc3R5bGUuc2V0SGVp
Z2h0KExlbmd0aChzbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQpKTsKLSAgICB9Ci19Ci0KLSNpZiBF
TkFCTEUoREFUQUxJU1RfRUxFTUVOVCkKLUludFNpemUgUmVuZGVyVGhlbWVFZmw6OnNsaWRlclRp
Y2tTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50U2l6ZSgxLCA2KTsKLX0KLQotaW50IFJl
bmRlclRoZW1lRWZsOjpzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29uc3QKLXsK
LSAgICBzdGF0aWMgY29uc3QgaW50IHNsaWRlclRpY2tPZmZzZXQgPSAtMTI7Ci0KLSAgICByZXR1
cm4gc2xpZGVyVGlja09mZnNldDsKLX0KLQotTGF5b3V0VW5pdCBSZW5kZXJUaGVtZUVmbDo6c2xp
ZGVyVGlja1NuYXBwaW5nVGhyZXNob2xkKCkgY29uc3QKLXsKLSAgICAvLyBUaGUgc2FtZSB0aHJl
c2hvbGQgdmFsdWUgYXMgdGhlIENocm9taXVtIHBvcnQuCi0gICAgcmV0dXJuIDU7Ci19Ci0jZW5k
aWYKLQotYm9vbCBSZW5kZXJUaGVtZUVmbDo6c3VwcG9ydHNEYXRhTGlzdFVJKGNvbnN0IEF0b21p
Y1N0cmluZyYgdHlwZSkgY29uc3QKLXsKLSNpZiBFTkFCTEUoREFUQUxJU1RfRUxFTUVOVCkKLSAg
ICAvLyBGSVhNRTogV2UgbmVlZCB0byBzdXBwb3J0IG90aGVyIHR5cGVzLgotICAgIHJldHVybiB0
eXBlID09IElucHV0VHlwZU5hbWVzOjplbWFpbCgpCi0gICAgICAgIHx8IHR5cGUgPT0gSW5wdXRU
eXBlTmFtZXM6OnJhbmdlKCkKLSAgICAgICAgfHwgdHlwZSA9PSBJbnB1dFR5cGVOYW1lczo6c2Vh
cmNoKCkKLSAgICAgICAgfHwgdHlwZSA9PSBJbnB1dFR5cGVOYW1lczo6dXJsKCk7Ci0jZWxzZQot
ICAgIFVOVVNFRF9QQVJBTSh0eXBlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQot
Ym9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRTbGlkZXJUaHVtYihjb25zdCBSZW5kZXJPYmplY3Qm
IG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewot
ICAgIGlmIChvYmplY3Quc3R5bGUoKS5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJIb3Jpem9u
dGFsUGFydCkKLSAgICAgICAgcGFpbnRUaGVtZVBhcnQob2JqZWN0LCBTbGlkZXJUaHVtYkhvcml6
b250YWwsIGluZm8sIHJlY3QpOwotICAgIGVsc2UKLSAgICAgICAgcGFpbnRUaGVtZVBhcnQob2Jq
ZWN0LCBTbGlkZXJUaHVtYlZlcnRpY2FsLCBpbmZvLCByZWN0KTsKLQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0Q2hlY2tib3hTdHlsZShTdHlsZVJl
c29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1l
bnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1
bWVudCgpLnBhZ2UoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVs
ZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1c3RDaGVja2JveFN0eWxlKHN0
eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGFkanVzdFNpemVDb25zdHJhaW50cyhzdHlsZSwgQ2hlY2tCb3gpOwotCi0gICAgc3R5bGUu
cmVzZXRCb3JkZXIoKTsKLQotICAgIGNvbnN0IFRoZW1lUGFydERlc2MqIGRlc2MgPSBtX3BhcnRE
ZXNjcyArIChzaXplX3QpQ2hlY2tCb3g7Ci0gICAgaWYgKHN0eWxlLndpZHRoKCkudmFsdWUoKSA8
IGRlc2MtPm1pbi53aWR0aCgpLnZhbHVlKCkpCi0gICAgICAgIHN0eWxlLnNldFdpZHRoKGRlc2Mt
Pm1pbi53aWR0aCgpKTsKLSAgICBpZiAoc3R5bGUuaGVpZ2h0KCkudmFsdWUoKSA8IGRlc2MtPm1p
bi5oZWlnaHQoKS52YWx1ZSgpKQotICAgICAgICBzdHlsZS5zZXRIZWlnaHQoZGVzYy0+bWluLmhl
aWdodCgpKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRDaGVja2JveChjb25zdCBS
ZW5kZXJPYmplY3QmIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQotewotICAgIHJldHVybiBwYWludFRoZW1lUGFydChvYmplY3QsIENoZWNrQm94LCBp
bmZvLCByZWN0KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0UmFkaW9TdHlsZShT
dHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQq
IGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVtZW50
LT5kb2N1bWVudCgpLnBhZ2UoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVm
bCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1c3RSYWRpb1N0eWxl
KHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIGFkanVzdFNpemVDb25zdHJhaW50cyhzdHlsZSwgUmFkaW9CdXR0b24pOwotCi0gICAg
c3R5bGUucmVzZXRCb3JkZXIoKTsKLQotICAgIGNvbnN0IFRoZW1lUGFydERlc2MqIGRlc2MgPSBt
X3BhcnREZXNjcyArIChzaXplX3QpUmFkaW9CdXR0b247Ci0gICAgaWYgKHN0eWxlLndpZHRoKCku
dmFsdWUoKSA8IGRlc2MtPm1pbi53aWR0aCgpLnZhbHVlKCkpCi0gICAgICAgIHN0eWxlLnNldFdp
ZHRoKGRlc2MtPm1pbi53aWR0aCgpKTsKLSAgICBpZiAoc3R5bGUuaGVpZ2h0KCkudmFsdWUoKSA8
IGRlc2MtPm1pbi5oZWlnaHQoKS52YWx1ZSgpKQotICAgICAgICBzdHlsZS5zZXRIZWlnaHQoZGVz
Yy0+bWluLmhlaWdodCgpKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRSYWRpbyhj
b25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJ
bnRSZWN0JiByZWN0KQotewotICAgIHJldHVybiBwYWludFRoZW1lUGFydChvYmplY3QsIFJhZGlv
QnV0dG9uLCBpbmZvLCByZWN0KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0QnV0
dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUmIHN0eWxl
LCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAotewotICAgIGlmICghbV9wYWdlICYmIGVsZW1lbnQg
JiYgZWxlbWVudC0+ZG9jdW1lbnQoKS5wYWdlKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVu
ZGVyVGhlbWVFZmwmPihlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKS0+dGhlbWUoKSkuYWRqdXN0
QnV0dG9uU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVsZW1lbnQpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgLy8gYWRqdXN0U2l6ZUNvbnN0cmFpbnMgY2FuIG1ha2UgU3F1YXJl
QnV0dG9uUGFydCdzIHNpemUgd3JvbmcgKGJ5IGFkanVzdGluZyBwYWRkaW5ncyksIHNvIGNhbGwg
aXQgb25seSBmb3IgUHVzaEJ1dHRvblBhcnQgYW5kIEJ1dHRvblBhcnQKLSAgICBpZiAoc3R5bGUu
YXBwZWFyYW5jZSgpID09IFB1c2hCdXR0b25QYXJ0IHx8IHN0eWxlLmFwcGVhcmFuY2UoKSA9PSBC
dXR0b25QYXJ0KQotICAgICAgICBhZGp1c3RTaXplQ29uc3RyYWludHMoc3R5bGUsIEJ1dHRvbik7
Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVFZmw6OnBhaW50QnV0dG9uKGNvbnN0IFJlbmRlck9iamVj
dCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCi17
Ci0gICAgcmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwgQnV0dG9uLCBpbmZvLCByZWN0KTsK
LX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0TWVudUxpc3RTdHlsZShTdHlsZVJlc29s
dmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQp
IGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1bWVu
dCgpLnBhZ2UoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1l
bnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1c3RNZW51TGlzdFN0eWxlKHN0eWxl
UmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBh
ZGp1c3RTaXplQ29uc3RyYWludHMoc3R5bGUsIENvbWJvQm94KTsKLSAgICBzdHlsZS5yZXNldEJv
cmRlcigpOwotICAgIHN0eWxlLnNldFdoaXRlU3BhY2UoUFJFKTsKLQotICAgIHN0eWxlLnNldExp
bmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOwotfQotCi1ib29sIFJl
bmRlclRoZW1lRWZsOjpwYWludE1lbnVMaXN0KGNvbnN0IFJlbmRlck9iamVjdCYgb2JqZWN0LCBj
b25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1
cm4gcGFpbnRUaGVtZVBhcnQob2JqZWN0LCBDb21ib0JveCwgaW5mbywgSW50UmVjdChyZWN0KSk7
Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVFZmw6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoU3R5
bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50KiBl
bGVtZW50KSBjb25zdAotewotICAgIC8vIEhlaWdodCBpcyBsb2NrZWQgdG8gYXV0byBpZiBoZWln
aHQgaXMgbm90IHNwZWNpZmllZC4KLSAgICBzdHlsZS5zZXRIZWlnaHQoTGVuZ3RoKEF1dG8pKTsK
LQotICAgIC8vIFRoZSA8c2VsZWN0PiBib3ggbXVzdCBiZSBhdCBsZWFzdCAxMnB4IGhpZ2ggZm9y
IHRoZSBidXR0b24gdG8gcmVuZGVyIHRoZSB0ZXh0IGluc2lkZSB0aGUgYm94IHdpdGhvdXQgY2xp
cHBpbmcuCi0gICAgY29uc3QgaW50IGRyb3BEb3duQm94TWluSGVpZ2h0ID0gMTI7Ci0KLSAgICAv
LyBDYWxjdWxhdGUgbWluLWhlaWdodCBvZiB0aGUgPHNlbGVjdD4gZWxlbWVudC4KLSAgICBpbnQg
bWluSGVpZ2h0ID0gc3R5bGUuZm9udE1ldHJpY3MoKS5oZWlnaHQoKTsKLSAgICBtaW5IZWlnaHQg
PSBzdGQ6Om1heChtaW5IZWlnaHQsIGRyb3BEb3duQm94TWluSGVpZ2h0KTsKLSAgICBzdHlsZS5z
ZXRNaW5IZWlnaHQoTGVuZ3RoKG1pbkhlaWdodCwgRml4ZWQpKTsKLQotICAgIGFkanVzdE1lbnVM
aXN0U3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVsZW1lbnQpOwotfQotCi1ib29sIFJlbmRl
clRoZW1lRWZsOjpwYWludE1lbnVMaXN0QnV0dG9uRGVjb3JhdGlvbnMoY29uc3QgUmVuZGVyQm94
JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgRmxvYXRSZWN0JiByZWN0KQot
ewotICAgIHJldHVybiBwYWludE1lbnVMaXN0KG9iamVjdCwgaW5mbywgcmVjdCk7Ci19Ci0KLXZv
aWQgUmVuZGVyVGhlbWVFZmw6OmFkanVzdFRleHRGaWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXImIHN0
eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlJiBzdHlsZSwgRWxlbWVudCogZWxlbWVudCkgY29uc3QK
LXsKLSAgICBpZiAoIW1fcGFnZSAmJiBlbGVtZW50ICYmIGVsZW1lbnQtPmRvY3VtZW50KCkucGFn
ZSgpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRoZW1lRWZsJj4oZWxlbWVudC0+ZG9j
dW1lbnQoKS5wYWdlKCktPnRoZW1lKCkpLmFkanVzdFRleHRGaWVsZFN0eWxlKHN0eWxlUmVzb2x2
ZXIsIHN0eWxlLCBlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhZGp1c3RT
aXplQ29uc3RyYWludHMoc3R5bGUsIFRleHRGaWVsZCk7Ci0gICAgc3R5bGUucmVzZXRCb3JkZXIo
KTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRUZXh0RmllbGQoY29uc3QgUmVuZGVy
T2JqZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KQotewotICAgIHJldHVybiBwYWludFRoZW1lUGFydChvYmplY3QsIFRleHRGaWVsZCwgaW5m
bywgSW50UmVjdChyZWN0KSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVFZmw6OmFkanVzdFRleHRB
cmVhU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiwgRWxlbWVudCopIGNvbnN0Ci17
Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVFZmw6OnBhaW50VGV4dEFyZWEoY29uc3QgUmVuZGVyT2Jq
ZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgRmxvYXRSZWN0JiByZWN0
KQotewotICAgIHJldHVybiBwYWludFRleHRGaWVsZChvYmplY3QsIGluZm8sIHJlY3QpOwotfQot
Ci12b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25TdHls
ZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1l
bnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVt
ZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVt
ZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1c3RTZWFyY2hG
aWVsZFJlc3VsdHNCdXR0b25TdHlsZShzdHlsZVJlc29sdmVyLCBzdHlsZSwgZWxlbWVudCk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYWRqdXN0U2l6ZUNvbnN0cmFpbnRzKHN0eWxlLCBT
ZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24pOwotICAgIHN0eWxlLnJlc2V0Qm9yZGVyKCk7Ci0gICAg
c3R5bGUuc2V0V2hpdGVTcGFjZShQUkUpOwotCi0gICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUu
Zm9udFNpemUoKSAvIGRlZmF1bHRGb250U2l6ZTsKLSAgICBpbnQgZGVjb3JhdGlvblNpemUgPSBs
cm91bmRmKHN0ZDo6bWluKHN0ZDo6bWF4KG1pblNlYXJjaERlY29yYXRpb25CdXR0b25TaXplLCBk
ZWZhdWx0Rm9udFNpemUgKiBmb250U2NhbGUpLCBtYXhTZWFyY2hEZWNvcmF0aW9uQnV0dG9uU2l6
ZSkpOwotCi0gICAgc3R5bGUuc2V0V2lkdGgoTGVuZ3RoKGRlY29yYXRpb25TaXplICsgc2VhcmNo
RmllbGREZWNvcmF0aW9uQnV0dG9uT2Zmc2V0LCBGaXhlZCkpOwotICAgIHN0eWxlLnNldEhlaWdo
dChMZW5ndGgoZGVjb3JhdGlvblNpemUsIEZpeGVkKSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVF
Zmw6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKGNvbnN0IFJlbmRlck9iamVjdCYgb2Jq
ZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAg
cmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwgU2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uLCBp
bmZvLCByZWN0KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0U2VhcmNoRmllbGRS
ZXN1bHRzRGVjb3JhdGlvblBhcnRTdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBS
ZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFt
X3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgewotICAgICAg
ICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgp
LT50aGVtZSgpKS5hZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uUGFydFN0eWxlKHN0
eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICBhZGp1c3RTaXplQ29uc3RyYWludHMoc3R5bGUsIFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRp
b24pOwotICAgIHN0eWxlLnJlc2V0Qm9yZGVyKCk7Ci0gICAgc3R5bGUuc2V0V2hpdGVTcGFjZShQ
UkUpOwotCi0gICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUuZm9udFNpemUoKSAvIGRlZmF1bHRG
b250U2l6ZTsKLSAgICBpbnQgZGVjb3JhdGlvblNpemUgPSBscm91bmRmKHN0ZDo6bWluKHN0ZDo6
bWF4KG1pblNlYXJjaERlY29yYXRpb25CdXR0b25TaXplLCBkZWZhdWx0Rm9udFNpemUgKiBmb250
U2NhbGUpLCBtYXhTZWFyY2hEZWNvcmF0aW9uQnV0dG9uU2l6ZSkpOwotCi0gICAgc3R5bGUuc2V0
V2lkdGgoTGVuZ3RoKGRlY29yYXRpb25TaXplICsgc2VhcmNoRmllbGREZWNvcmF0aW9uQnV0dG9u
T2Zmc2V0LCBGaXhlZCkpOwotICAgIHN0eWxlLnNldEhlaWdodChMZW5ndGgoZGVjb3JhdGlvblNp
emUsIEZpeGVkKSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVFZmw6OnBhaW50U2VhcmNoRmllbGRS
ZXN1bHRzRGVjb3JhdGlvblBhcnQoY29uc3QgUmVuZGVyT2JqZWN0JiBvYmplY3QsIGNvbnN0IFBh
aW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRU
aGVtZVBhcnQob2JqZWN0LCBTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uLCBpbmZvLCByZWN0
KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0
b25TdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUs
IEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVudCAm
JiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1c3RT
ZWFyY2hGaWVsZENhbmNlbEJ1dHRvblN0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhZGp1c3RTaXplQ29uc3RyYWludHMoc3R5
bGUsIFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKTsKLSAgICBzdHlsZS5yZXNldEJvcmRlcigpOwot
ICAgIHN0eWxlLnNldFdoaXRlU3BhY2UoUFJFKTsKLQotICAgIC8vIExvZ2ljIHRha2VuIGZyb20g
UmVuZGVyVGhlbWVDaHJvbWl1bS5jcHAuCi0gICAgLy8gU2NhbGUgdGhlIGJ1dHRvbiBzaXplIGJh
c2VkIG9uIHRoZSBmb250IHNpemUuCi0gICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUuZm9udFNp
emUoKSAvIGRlZmF1bHRGb250U2l6ZTsKLSAgICBpbnQgY2FuY2VsQnV0dG9uU2l6ZSA9IGxyb3Vu
ZGYoc3RkOjptaW4oc3RkOjptYXgobWluQ2FuY2VsQnV0dG9uU2l6ZSwgZGVmYXVsdEZvbnRTaXpl
ICogZm9udFNjYWxlKSwgbWF4Q2FuY2VsQnV0dG9uU2l6ZSkpOwotCi0gICAgc3R5bGUuc2V0V2lk
dGgoTGVuZ3RoKGNhbmNlbEJ1dHRvblNpemUsIEZpeGVkKSk7Ci0gICAgc3R5bGUuc2V0SGVpZ2h0
KExlbmd0aChjYW5jZWxCdXR0b25TaXplLCBGaXhlZCkpOwotfQotCi1ib29sIFJlbmRlclRoZW1l
RWZsOjpwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKGNvbnN0IFJlbmRlck9iamVjdCYgb2Jq
ZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAg
cmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwgU2VhcmNoRmllbGRDYW5jZWxCdXR0b24sIGlu
Zm8sIHJlY3QpOwotfQotCi12b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RTZWFyY2hGaWVsZFN0
eWxlKFN0eWxlUmVzb2x2ZXImIHN0eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlJiBzdHlsZSwgRWxl
bWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcGFnZSAmJiBlbGVtZW50ICYmIGVs
ZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRo
ZW1lRWZsJj4oZWxlbWVudC0+ZG9jdW1lbnQoKS5wYWdlKCktPnRoZW1lKCkpLmFkanVzdFNlYXJj
aEZpZWxkU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVsZW1lbnQpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIGFkanVzdFNpemVDb25zdHJhaW50cyhzdHlsZSwgU2VhcmNoRmllbGQp
OwotICAgIHN0eWxlLnJlc2V0Qm9yZGVyKCk7Ci0gICAgc3R5bGUuc2V0V2hpdGVTcGFjZShQUkUp
OwotfQotCi1ib29sIFJlbmRlclRoZW1lRWZsOjpwYWludFNlYXJjaEZpZWxkKGNvbnN0IFJlbmRl
ck9iamVjdCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QpCi17Ci0gICAgcmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwgU2VhcmNoRmllbGQsIGlu
Zm8sIHJlY3QpOwotfQotCi12b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RJbm5lclNwaW5CdXR0
b25TdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUs
IEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVudCAm
JiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1c3RJ
bm5lclNwaW5CdXR0b25TdHlsZShzdHlsZVJlc29sdmVyLCBzdHlsZSwgZWxlbWVudCk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgYWRqdXN0U2l6ZUNvbnN0cmFpbnRzKHN0eWxlLCBTcGlu
bmVyKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRJbm5lclNwaW5CdXR0b24oY29u
c3QgUmVuZGVyT2JqZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50
UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRUaGVtZVBhcnQob2JqZWN0LCBTcGlubmVy
LCBpbmZvLCByZWN0KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUVmbDo6c2V0RGVmYXVsdEZvbnRT
aXplKGludCBzaXplKQotewotICAgIGRlZmF1bHRGb250U2l6ZSA9IHNpemU7Ci19Ci0KLXZvaWQg
UmVuZGVyVGhlbWVFZmw6OnVwZGF0ZUNhY2hlZFN5c3RlbUZvbnREZXNjcmlwdGlvbihDU1NWYWx1
ZUlELCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICAvLyBJ
dCB3YXMgY2FsbGVkIGJ5IFJlbmRlckVtYmVkZGVkT2JqZWN0OjpwYWludFJlcGxhY2VkIHRvIHJl
bmRlciBhbHRlcm5hdGl2ZSBzdHJpbmcuCi0gICAgLy8gVG8gYXZvaWQgY2Fpcm9fZXJyb3Igd2hp
bGUgcmVuZGVyaW5nLCBmb250RGVzY3JpcHRpb24gc2hvdWxkIGJlIHBhc3NlZC4KLSAgICBmb250
RGVzY3JpcHRpb24uc2V0T25lRmFtaWx5KCJTYW5zIik7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNl
dFNwZWNpZmllZFNpemUoZGVmYXVsdEZvbnRTaXplKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0
SXNBYnNvbHV0ZVNpemUodHJ1ZSk7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldFdlaWdodChGb250
V2VpZ2h0Tm9ybWFsKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0SXRhbGljKEZvbnRJdGFsaWNP
ZmYpOwotfQotCi12b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RQcm9ncmVzc0JhclN0eWxlKFN0
eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAg
IHN0eWxlLnNldEJveFNoYWRvdyhudWxscHRyKTsKLX0KLQotZG91YmxlIFJlbmRlclRoZW1lRWZs
OjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzJikg
Y29uc3QKLXsKLSAgICByZXR1cm4gcHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZhbDsKLX0KLQotZG91
YmxlIFJlbmRlclRoZW1lRWZsOjphbmltYXRpb25EdXJhdGlvbkZvclByb2dyZXNzQmFyKFJlbmRl
clByb2dyZXNzJikgY29uc3QKLXsKLSAgICByZXR1cm4gcHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZh
bCAqIHByb2dyZXNzQW5pbWF0aW9uRnJhbWVzICogMjsgLy8gIjIiIGZvciBiYWNrIGFuZCBmb3J0
aDsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRQcm9ncmVzc0Jhcihjb25zdCBSZW5k
ZXJPYmplY3QmIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQotewotICAgIGlmICghb2JqZWN0LmlzUHJvZ3Jlc3MoKSkKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0KLSAgICByZXR1cm4gcGFpbnRUaGVtZVBhcnQob2JqZWN0LCBQcm9ncmVzc0JhciwgaW5m
bywgcmVjdCk7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU8pCi1TdHJpbmcgUmVuZGVyVGhlbWVFZmw6
Om1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCkKLXsKLSAgICByZXR1cm4gQVNDSUlMaXRlcmFsKG1l
ZGlhQ29udHJvbHNCYXNlVXNlckFnZW50U3R5bGVTaGVldCk7Ci19Ci0KLVN0cmluZyBSZW5kZXJU
aGVtZUVmbDo6bWVkaWFDb250cm9sc1NjcmlwdCgpCi17Ci0gICAgU3RyaW5nQnVpbGRlciBzY3Jp
cHRCdWlsZGVyOwotICAgIHNjcmlwdEJ1aWxkZXIuYXBwZW5kKG1lZGlhQ29udHJvbHNMb2NhbGl6
ZWRTdHJpbmdzSmF2YVNjcmlwdCwgc2l6ZW9mKG1lZGlhQ29udHJvbHNMb2NhbGl6ZWRTdHJpbmdz
SmF2YVNjcmlwdCkpOwotICAgIHNjcmlwdEJ1aWxkZXIuYXBwZW5kKG1lZGlhQ29udHJvbHNCYXNl
SmF2YVNjcmlwdCwgc2l6ZW9mKG1lZGlhQ29udHJvbHNCYXNlSmF2YVNjcmlwdCkpOwotICAgIHJl
dHVybiBzY3JpcHRCdWlsZGVyLnRvU3RyaW5nKCk7Ci19Ci0jZW5kaWYKLQotI3VuZGVmIF9BU1NF
UlRfT05fUkVMRUFTRV9SRVRVUk4KLSN1bmRlZiBfQVNTRVJUX09OX1JFTEVBU0VfUkVUVVJOX1ZB
TAotCi19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9lZmwvUmVuZGVyVGhl
bWVFZmwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9SZW5kZXJUaGVtZUVmbC5oCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM3ZTc3NTIzNWJmNDZkMTViNGE0OGNiMmFj
NjE2MjNlMjc1NTljLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2VmbC9SZW5kZXJUaGVtZUVmbC5oCisrKyAvZGV2
L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUg
V2ViS2l0IHByb2plY3QuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIEluYy4KLSAq
IENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEVtbWVsIG1pa2UuZW1tZWxAZ21haWwuY29tCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMDcgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKLSAqIENvcHly
aWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgotICogQ29weXJpZ2h0IChD
KSAyMDA4IElOZFQgLSBJbnN0aXR1dG8gTm9raWEgZGUgVGVjbm9sb2dpYQotICogQ29weXJpZ2h0
IChDKSAyMDA5LTIwMTAgUHJvRlVTSU9OIGVtYmVkZGVkIHN5c3RlbXMKLSAqIENvcHlyaWdodCAo
QykgMjAwOS0yMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAot
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAq
LwotCi0jaWZuZGVmIFJlbmRlclRoZW1lRWZsX2gKLSNkZWZpbmUgUmVuZGVyVGhlbWVFZmxfaAot
Ci0jaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKLQotI2luY2x1ZGUgPEVpbmEuaD4KLSNpbmNsdWRl
IDxjYWlyby5oPgotI2luY2x1ZGUgPHd0Zi9lZmwvVW5pcXVlUHRyRWZsLmg+Ci0KLW5hbWVzcGFj
ZSBXZWJDb3JlIHsKLQotZW51bSBGb3JtVHlwZSB7IC8vIEtFRVAgSU4gU1lOQyBXSVRIIGVkamVH
cm91cEZyb21Gb3JtVHlwZSgpCi0gICAgQnV0dG9uLAotICAgIFJhZGlvQnV0dG9uLAotICAgIFRl
eHRGaWVsZCwKLSAgICBDaGVja0JveCwKLSAgICBDb21ib0JveCwKLSAgICBQcm9ncmVzc0JhciwK
LSAgICBTY3JvbGxiYXJIb3Jpem9udGFsVGh1bWIsCi0gICAgU2Nyb2xsYmFySG9yaXpvbnRhbFRy
YWNrQmFja2dyb3VuZCwKLSAgICBTY3JvbGxiYXJWZXJ0aWNhbFRodW1iLAotICAgIFNjcm9sbGJh
clZlcnRpY2FsVHJhY2tCYWNrZ3JvdW5kLAotICAgIFNlYXJjaEZpZWxkLAotICAgIFNlYXJjaEZp
ZWxkUmVzdWx0c0J1dHRvbiwKLSAgICBTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uLAotICAg
IFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uLAotICAgIFNsaWRlclZlcnRpY2FsLAotICAgIFNsaWRl
ckhvcml6b250YWwsCi0gICAgU2xpZGVyVGh1bWJWZXJ0aWNhbCwKLSAgICBTbGlkZXJUaHVtYkhv
cml6b250YWwsCi0gICAgU3Bpbm5lciwKLSAgICBGb3JtVHlwZUxhc3QKLX07Ci0KLWNsYXNzIFJl
bmRlclRoZW1lRWZsIGZpbmFsIDogcHVibGljIFJlbmRlclRoZW1lIHsKLXByaXZhdGU6Ci0gICAg
ZXhwbGljaXQgUmVuZGVyVGhlbWVFZmwoUGFnZSopOwotICAgIHZpcnR1YWwgflJlbmRlclRoZW1l
RWZsKCk7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gY3Jl
YXRlKFBhZ2UqKTsKLQotICAgIC8vIEEgbWV0aG9kIGFza2luZyBpZiB0aGUgdGhlbWUncyBjb250
cm9scyBhY3R1YWxseSBjYXJlIGFib3V0IHJlZHJhd2luZyB3aGVuIGhvdmVyZWQuCi0gICAgdmly
dHVhbCBib29sIHN1cHBvcnRzSG92ZXIoY29uc3QgUmVuZGVyU3R5bGUmKSBjb25zdCBvdmVycmlk
ZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBBIG1ldGhvZCBSZXR1cm5pbmcgd2hldGhlciB0
aGUgY29udHJvbCBpcyBzdHlsZWQgYnkgY3NzIG9yIG5vdCBlLmcgc3BlY2lmeWluZyBiYWNrZ3Jv
dW5kLWNvbG9yLgotICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVuZGVy
U3R5bGUmLCBjb25zdCBCb3JkZXJEYXRhJiwgY29uc3QgRmlsbExheWVyJiwgY29uc3QgQ29sb3Im
IGJhY2tncm91bmRDb2xvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAvLyBBIG1ldGhvZCBhc2tp
bmcgaWYgdGhlIHRoZW1lIGlzIGFibGUgdG8gZHJhdyB0aGUgZm9jdXMgcmluZy4KLSAgICB2aXJ0
dWFsIGJvb2wgc3VwcG9ydHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUmKSBjb25zdCBvdmVy
cmlkZTsKLQotICAgIC8vIEEgbWV0aG9kIGFza2luZyBpZiB0aGUgY29udHJvbCBjaGFuZ2VzIGl0
cyB0aW50IHdoZW4gdGhlIHdpbmRvdyBoYXMgZm9jdXMgb3Igbm90LgotICAgIHZpcnR1YWwgYm9v
bCBjb250cm9sU3VwcG9ydHNUaW50cyhjb25zdCBSZW5kZXJPYmplY3QmKSBjb25zdCBvdmVycmlk
ZTsKLQotICAgIC8vIEEgZ2VuZXJhbCBtZXRob2QgYXNraW5nIGlmIGFueSBjb250cm9sIHRpbnRp
bmcgaXMgc3VwcG9ydGVkIGF0IGFsbC4KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNDb250cm9s
VGludHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBBIGdlbmVy
YWwgbWV0aG9kIGFza2luZyBpZiBmb3JlZ3JvdW5kIGNvbG9ycyBvZiBzZWxlY3Rpb24gYXJlIHN1
cHBvcnRlZC4KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29s
b3JzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAvLyBBIG1ldGhvZCB0byBvYnRhaW4gdGhlIGJh
c2VsaW5lIHBvc2l0aW9uIGZvciBhICJsZWFmIiBjb250cm9sLiBUaGlzIHdpbGwgb25seSBiZSB1
c2VkIGlmIGEgYmFzZWxpbmUKLSAgICAvLyBwb3NpdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBi
eSBleGFtaW5pbmcgY2hpbGQgY29udGVudC4gQ2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBh
cmUgZXhhbXBsZXMgb2YKLSAgICAvLyBjb250cm9scyB0aGF0IG5lZWQgdG8gZG8gdGhpcy4KLSAg
ICB2aXJ0dWFsIGludCBiYXNlbGluZVBvc2l0aW9uKGNvbnN0IFJlbmRlckJveCYpIGNvbnN0IG92
ZXJyaWRlOwotCi0gICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tn
cm91bmRDb2xvcigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1J
bmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZp
cnR1YWwgQ29sb3IgcGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25z
dCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25G
b3JlZ3JvdW5kQ29sb3IoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIENvbG9yIHBsYXRm
b3JtRm9jdXNSaW5nQ29sb3IoKSBjb25zdCBvdmVycmlkZTsKLQotICAgIC8vIFNldCBwbGF0Zm9y
bSBjb2xvcnM7IHJlbWVtYmVyIHRvIGNhbGwgcGxhdGZvcm1Db2xvckRpZENoYW5nZSBhZnRlci4K
LSAgICB2b2lkIHNldENvbG9yRnJvbVRoZW1lQ2xhc3MoY29uc3QgY2hhciogY29sb3JDbGFzcyk7
Ci0KLSAgICB2b2lkIHNldEJ1dHRvblRleHRDb2xvcihpbnQgZm9yZVIsIGludCBmb3JlRywgaW50
IGZvcmVCLCBpbnQgZm9yZUEsIGludCBiYWNrUiwgaW50IGJhY2tHLCBpbnQgYmFja0IsIGludCBi
YWNrQSk7Ci0gICAgdm9pZCBzZXRDb21ib1RleHRDb2xvcihpbnQgZm9yZVIsIGludCBmb3JlRywg
aW50IGZvcmVCLCBpbnQgZm9yZUEsIGludCBiYWNrUiwgaW50IGJhY2tHLCBpbnQgYmFja0IsIGlu
dCBiYWNrQSk7Ci0gICAgdm9pZCBzZXRFbnRyeVRleHRDb2xvcihpbnQgZm9yZVIsIGludCBmb3Jl
RywgaW50IGZvcmVCLCBpbnQgZm9yZUEsIGludCBiYWNrUiwgaW50IGJhY2tHLCBpbnQgYmFja0Is
IGludCBiYWNrQSk7Ci0gICAgdm9pZCBzZXRTZWFyY2hUZXh0Q29sb3IoaW50IGZvcmVSLCBpbnQg
Zm9yZUcsIGludCBmb3JlQiwgaW50IGZvcmVBLCBpbnQgYmFja1IsIGludCBiYWNrRywgaW50IGJh
Y2tCLCBpbnQgYmFja0EpOwotCi0gICAgdm9pZCBhZGp1c3RTaXplQ29uc3RyYWludHMoUmVuZGVy
U3R5bGUmLCBGb3JtVHlwZSkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Q2hlY2ti
b3hTdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3Zl
cnJpZGU7Ci0gICAgdmlydHVhbCBib29sIHBhaW50Q2hlY2tib3goY29uc3QgUmVuZGVyT2JqZWN0
JiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpIG92ZXJyaWRlOwotCi0gICAgdmly
dHVhbCB2b2lkIGFkanVzdFJhZGlvU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiwg
RWxlbWVudCopIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBwYWludFJhZGlvKGNv
bnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSBvdmVy
cmlkZTsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25TdHlsZShTdHlsZVJlc29sdmVy
JiwgUmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBi
b29sIHBhaW50QnV0dG9uKGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0Rmll
bGRTdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3Zl
cnJpZGU7Ci0gICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxkKGNvbnN0IFJlbmRlck9iamVj
dCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRlOwotCi0gICAg
dmlydHVhbCB2b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0
eWxlJiwgRWxlbWVudCopIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBwYWludFRl
eHRBcmVhKGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEZsb2F0
UmVjdCYpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGUo
U3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiwgRWxlbWVudCopIGNvbnN0IG92ZXJyaWRlOwot
ICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEZsb2F0UmVjdCYpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCB2
b2lkIGFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxl
JiwgRWxlbWVudCopIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVM
aXN0QnV0dG9uRGVjb3JhdGlvbnMoY29uc3QgUmVuZGVyQm94JiwgY29uc3QgUGFpbnRJbmZvJiwg
Y29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2Vh
cmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblBhcnRTdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVy
U3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBib29sIHBhaW50
U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblBhcnQoY29uc3QgUmVuZGVyT2JqZWN0JiwgY29u
c3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCB2
b2lkIGFkanVzdFNlYXJjaEZpZWxkU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiwg
RWxlbWVudCopIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZp
ZWxkKGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3Qm
KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNC
dXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qg
b3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9u
KGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSBv
dmVycmlkZTsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZENhbmNlbEJ1dHRv
blN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBjb25zdCBvdmVy
cmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihjb25z
dCBSZW5kZXJPYmplY3QmLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jikgb3ZlcnJp
ZGU7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2xpZGVyVHJhY2tTdHlsZShTdHlsZVJlc29s
dmVyJiwgUmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdmlydHVh
bCBib29sIHBhaW50U2xpZGVyVHJhY2soY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJ
bmZvJiwgY29uc3QgSW50UmVjdCYpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCB2b2lkIGFkanVz
dFNsaWRlclRodW1iU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiwgRWxlbWVudCop
IGNvbnN0IG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRlclRodW1iU2l6
ZShSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBjb25zdCBvdmVycmlkZTsKLQotI2lmIEVOQUJMRShE
QVRBTElTVF9FTEVNRU5UKQotICAgIHZpcnR1YWwgSW50U2l6ZSBzbGlkZXJUaWNrU2l6ZSgpIGNv
bnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgaW50IHNsaWRlclRpY2tPZmZzZXRGcm9tVHJhY2tD
ZW50ZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIExheW91dFVuaXQgc2xpZGVyVGlj
a1NuYXBwaW5nVGhyZXNob2xkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0jZW5kaWYKLQotICAgIHZpcnR1
YWwgYm9vbCBzdXBwb3J0c0RhdGFMaXN0VUkoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Qgb3Zl
cnJpZGU7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUaHVtYihjb25zdCBSZW5kZXJP
YmplY3QmLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jikgb3ZlcnJpZGU7Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgYWRqdXN0SW5uZXJTcGluQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYs
IFJlbmRlclN0eWxlJiwgRWxlbWVudCopIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9v
bCBwYWludElubmVyU3BpbkJ1dHRvbihjb25zdCBSZW5kZXJPYmplY3QmLCBjb25zdCBQYWludElu
Zm8mLCBjb25zdCBJbnRSZWN0Jikgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXREZWZh
dWx0Rm9udFNpemUoaW50IGZvbnRzaXplKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RQcm9n
cmVzc0JhclN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBjb25z
dCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRQcm9ncmVzc0Jhcihjb25zdCBSZW5k
ZXJPYmplY3QmLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jikgb3ZlcnJpZGU7Ci0g
ICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihS
ZW5kZXJQcm9ncmVzcyYpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgZG91YmxlIGFuaW1h
dGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MmKSBjb25zdCBvdmVycmlk
ZTsKLQotI2lmIEVOQUJMRShWSURFTykKLSAgICB2aXJ0dWFsIFN0cmluZyBtZWRpYUNvbnRyb2xz
U3R5bGVTaGVldCgpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgU3RyaW5nIG1lZGlhQ29udHJvbHNT
Y3JpcHQoKSBvdmVycmlkZTsKLSNlbmRpZgotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICB2
aXJ0dWFsIGJvb2wgc3VwcG9ydHNDbG9zZWRDYXB0aW9uaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyBy
ZXR1cm4gdHJ1ZTsgfQotI2VuZGlmCi0KLSAgICB2b2lkIHNldFRoZW1lUGF0aChjb25zdCBTdHJp
bmcmKTsKLSAgICBTdHJpbmcgdGhlbWVQYXRoKCkgY29uc3Q7Ci0KLSAgICBib29sIHBhaW50VGhl
bWVQYXJ0KGNvbnN0IEdyYXBoaWNzQ29udGV4dCYsIEZvcm1UeXBlLCBjb25zdCBJbnRSZWN0Jik7
Ci0KLXByb3RlY3RlZDoKLSAgICBzdGF0aWMgZmxvYXQgZGVmYXVsdEZvbnRTaXplOwotCi1wcml2
YXRlOgotICAgIGJvb2wgbG9hZFRoZW1lKCk7Ci0gICAgQUxXQVlTX0lOTElORSBib29sIGxvYWRU
aGVtZUlmTmVlZGVkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2VkamUgfHwgKCFt
X3RoZW1lUGF0aC5pc0VtcHR5KCkgJiYgY29uc3RfY2FzdDxSZW5kZXJUaGVtZUVmbCo+KHRoaXMp
LT5sb2FkVGhlbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gU3lzdGVtIGZvbnRzLgotICAgIHZpcnR1
YWwgdm9pZCB1cGRhdGVDYWNoZWRTeXN0ZW1Gb250RGVzY3JpcHRpb24oQ1NTVmFsdWVJRCwgRm9u
dERlc2NyaXB0aW9uJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICBBTFdBWVNfSU5MSU5FIEVjb3Jl
X0V2YXMqIGNhbnZhcygpIGNvbnN0IHsgcmV0dXJuIG1fY2FudmFzLmdldCgpOyB9Ci0gICAgQUxX
QVlTX0lOTElORSBFdmFzX09iamVjdCogZWRqZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWRqZS5nZXQo
KTsgfQotCi0gICAgdm9pZCBhcHBseVBhcnREZXNjcmlwdGlvbnNGcm9tKGNvbnN0IFN0cmluZyYg
dGhlbWVQYXRoKTsKLQotICAgIHZvaWQgYXBwbHlFZGplU3RhdGVGcm9tRm9ybShFdmFzX09iamVj
dCosIGNvbnN0IENvbnRyb2xTdGF0ZXMqLCBib29sKTsKLSAgICB2b2lkIGFwcGx5RWRqZVJUTFN0
YXRlKEV2YXNfT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0JiwgRm9ybVR5cGUsIGNvbnN0IElu
dFJlY3QmKTsKLSAgICBib29sIHBhaW50VGhlbWVQYXJ0KGNvbnN0IFJlbmRlck9iamVjdCYsIEZv
cm1UeXBlLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0KLSAgICBQYWdlKiBt
X3BhZ2U7Ci0gICAgQ29sb3IgbV9hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0gICAg
Q29sb3IgbV9hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I7Ci0gICAgQ29sb3IgbV9pbmFj
dGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcjsKLSAgICBDb2xvciBtX2luYWN0aXZlU2VsZWN0
aW9uRm9yZWdyb3VuZENvbG9yOwotICAgIENvbG9yIG1fZm9jdXNSaW5nQ29sb3I7Ci0gICAgQ29s
b3IgbV9zbGlkZXJUaHVtYkNvbG9yOwotCi0gICAgU3RyaW5nIG1fdGhlbWVQYXRoOwotICAgIC8v
IE9yZGVyIHNvIHRoYXQgdGhlIGNhbnZhcyBnZXRzIGRlc3Ryb3llZCBhdCBsYXN0LgotICAgIEVm
bFVuaXF1ZVB0cjxFY29yZV9FdmFzPiBtX2NhbnZhczsKLSAgICBFZmxVbmlxdWVQdHI8RXZhc19P
YmplY3Q+IG1fZWRqZTsKLQotICAgIGJvb2wgbV9zdXBwb3J0c1NlbGVjdGlvbkZvcmVncm91bmRD
b2xvcjsKLQotICAgIHN0cnVjdCBUaGVtZVBhcnREZXNjIHsKLSAgICAgICAgRm9ybVR5cGUgdHlw
ZTsKLSAgICAgICAgTGVuZ3RoU2l6ZSBtaW47Ci0gICAgICAgIExlbmd0aFNpemUgbWF4OwotICAg
ICAgICBMZW5ndGhCb3ggcGFkZGluZzsKLSAgICB9OwotICAgIHZvaWQgYXBwbHlQYXJ0RGVzY3Jp
cHRpb25GYWxsYmFjayhzdHJ1Y3QgVGhlbWVQYXJ0RGVzYyopOwotICAgIHZvaWQgYXBwbHlQYXJ0
RGVzY3JpcHRpb24oRXZhc19PYmplY3QqLCBzdHJ1Y3QgVGhlbWVQYXJ0RGVzYyopOwotCi0gICAg
c3RydWN0IFRoZW1lUGFydENhY2hlRW50cnkgewotICAgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVf
cHRyPFJlbmRlclRoZW1lRWZsOjpUaGVtZVBhcnRDYWNoZUVudHJ5PiBjcmVhdGUoY29uc3QgU3Ry
aW5nJiB0aGVtZVBhdGgsIEZvcm1UeXBlLCBjb25zdCBJbnRTaXplJik7Ci0gICAgICAgIHZvaWQg
cmV1c2UoY29uc3QgU3RyaW5nJiB0aGVtZVBhdGgsIEZvcm1UeXBlLCBjb25zdCBJbnRTaXplJik7
Ci0KLSAgICAgICAgQUxXQVlTX0lOTElORSBFY29yZV9FdmFzKiBjYW52YXMoKSB7IHJldHVybiBt
X2NhbnZhcy5nZXQoKTsgfQotICAgICAgICBBTFdBWVNfSU5MSU5FIEV2YXNfT2JqZWN0KiBlZGpl
KCkgeyByZXR1cm4gbV9lZGplLmdldCgpOyB9Ci0gICAgICAgIEFMV0FZU19JTkxJTkUgY2Fpcm9f
c3VyZmFjZV90KiBzdXJmYWNlKCkgeyByZXR1cm4gbV9zdXJmYWNlLmdldCgpOyB9Ci0KLSAgICAg
ICAgRm9ybVR5cGUgdHlwZTsKLSAgICAgICAgSW50U2l6ZSBzaXplOwotCi0gICAgcHJpdmF0ZToK
LSAgICAgICAgLy8gT3JkZXIgc28gdGhhdCB0aGUgY2FudmFzIGdldHMgZGVzdHJveWVkIGF0IGxh
c3QuCi0gICAgICAgIEVmbFVuaXF1ZVB0cjxFY29yZV9FdmFzPiBtX2NhbnZhczsKLSAgICAgICAg
RWZsVW5pcXVlUHRyPEV2YXNfT2JqZWN0PiBtX2VkamU7Ci0gICAgICAgIFJlZlB0cjxjYWlyb19z
dXJmYWNlX3Q+IG1fc3VyZmFjZTsKLSAgICB9OwotCi0gICAgc3RydWN0IFRoZW1lUGFydERlc2Mg
bV9wYXJ0RGVzY3NbRm9ybVR5cGVMYXN0XTsKLQotICAgIC8vIExpc3Qgb2YgVGhlbWVQYXJ0Q2Fj
aGVFbnRyeSogc29ydGVkIHNvIHRoYXQgdGhlIG1vc3QgcmVjZW50bHkKLSAgICAvLyB1c2VkIGVu
dHJpZXMgY29tZSBmaXJzdC4gV2UgdXNlIGEgbGlzdCBmb3IgZWZmaWNpZW50IG1vdmluZwotICAg
IC8vIG9mIGl0ZW1zIHdpdGhpbiB0aGUgY29udGFpbmVyLgotICAgIFZlY3RvcjxzdGQ6OnVuaXF1
ZV9wdHI8VGhlbWVQYXJ0Q2FjaGVFbnRyeT4+IG1fcGFydENhY2hlOwotCi0gICAgVGhlbWVQYXJ0
Q2FjaGVFbnRyeSogZ2V0VGhlbWVQYXJ0RnJvbUNhY2hlKEZvcm1UeXBlLCBjb25zdCBJbnRTaXpl
Jik7Ci0gICAgdm9pZCBjbGVhclRoZW1lUGFydENhY2hlKCk7Ci19OwotfQotCi0jZW5kaWYgLy8g
UmVuZGVyVGhlbWVFZmxfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclRoZW1lRWZsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUVm
bC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uZDBmY2FkNjk2MjM0YjNkZGVlNzI0NWNkOTg0ZGIwZTQ2OGFjNzlh
YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVt
ZUVmbC5jcHAKQEAgLTAsMCArMSwxMDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFw
cGxlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29t
PgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDggSU5kVCAtIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDktMjAxMCBQcm9GVVNJT04gZW1iZWRkZWQgc3lzdGVtcworICogQ29weXJpZ2h0IChD
KSAyMDA5LTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQ29weXJpZ2h0IChjKSAyMDEyIElu
dGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlJlbmRlclRoZW1lRWZsLmgiCisKKyNpbmNsdWRlICJDU1NWYWx1ZUtl
eXdvcmRzLmgiCisjaW5jbHVkZSAiQ2Fpcm9VdGlsaXRpZXNFZmwuaCIKKyNpbmNsdWRlICJFeGNl
cHRpb25Db2RlUGxhY2Vob2xkZXIuaCIKKyNpbmNsdWRlICJGbG9hdFJvdW5kZWRSZWN0LmgiCisj
aW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIklucHV0VHlwZU5hbWVz
LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5j
bHVkZSAiUGFpbnRJbmZvLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0Q2Fpcm8uaCIKKyNp
bmNsdWRlICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRl
ICJSZW5kZXJQcm9ncmVzcy5oIgorI2luY2x1ZGUgIlJlbmRlclNsaWRlci5oIgorI2luY2x1ZGUg
IlNjcm9sbGJhclRoZW1lRWZsLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJV
c2VyQWdlbnRTY3JpcHRzLmgiCisjaW5jbHVkZSAiVXNlckFnZW50U3R5bGVTaGVldHMuaCIKKyNp
bmNsdWRlIDxFY29yZV9FdmFzLmg+CisjaW5jbHVkZSA8RWRqZS5oPgorI2luY2x1ZGUgPG5ldz4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5n
QnVpbGRlci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKKy8vIFRPRE86IGNoYW5nZSBmcm9tIG9iamVjdCBjb3VudCB0byBlY29yZV9l
dmFzIHNpemUgKGJ5dGVzKQorLy8gVE9ETzogYXMgb2JqZWN0cyBhcmUgd2VicGFnZS91c2VyIGRl
ZmluZWQgYW5kIHRoZXkgY2FuIGJlIHZlcnkgbGFyZ2UuCisjZGVmaW5lIFJFTkRFUl9USEVNRV9F
RkxfUEFSVF9DQUNIRV9NQVggMzIKKworLy8gSW5pdGlhbGl6ZSBkZWZhdWx0IGZvbnQgc2l6ZS4K
K2Zsb2F0IFJlbmRlclRoZW1lRWZsOjpkZWZhdWx0Rm9udFNpemUgPSAxNi4wZjsKKworc3RhdGlj
IGNvbnN0IGZsb2F0IG1pbkNhbmNlbEJ1dHRvblNpemUgPSA1Oworc3RhdGljIGNvbnN0IGZsb2F0
IG1heENhbmNlbEJ1dHRvblNpemUgPSAyMTsKKworc3RhdGljIGNvbnN0IGZsb2F0IG1pblNlYXJj
aERlY29yYXRpb25CdXR0b25TaXplID0gMTsKK3N0YXRpYyBjb25zdCBmbG9hdCBtYXhTZWFyY2hE
ZWNvcmF0aW9uQnV0dG9uU2l6ZSA9IDE1Oworc3RhdGljIGNvbnN0IGZsb2F0IHNlYXJjaEZpZWxk
RGVjb3JhdGlvbkJ1dHRvbk9mZnNldCA9IDM7CisKKy8vIENvbnN0YW50cyBmb3IgcHJvZ3Jlc3Mg
dGFnIGFuaW1hdGlvbi4KKy8vIFRoZXNlIHZhbHVlcyBoYXZlIGJlZW4gY29waWVkIGZyb20gUmVu
ZGVyVGhlbWVHdGsuY3BwCitzdGF0aWMgY29uc3QgaW50IHByb2dyZXNzQW5pbWF0aW9uRnJhbWVz
ID0gMTA7CitzdGF0aWMgY29uc3QgZG91YmxlIHByb2dyZXNzQW5pbWF0aW9uSW50ZXJ2YWwgPSAw
LjEyNTsKKworc3RhdGljIGNvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gMjk7CitzdGF0aWMg
Y29uc3QgaW50IHNsaWRlclRodW1iSGVpZ2h0ID0gMTE7CisKKyNkZWZpbmUgX0FTU0VSVF9PTl9S
RUxFQVNFX1JFVFVSTihvLCBmbXQsIC4uLikgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoIW8p
IHsgXAorICAgICAgICAgICAgRUlOQV9MT0dfQ1JJVChmbXQsICMjIF9fVkFfQVJHU19fKTsgXAor
ICAgICAgICAgICAgQVNTRVJUKG8pOyBcCisgICAgICAgICAgICByZXR1cm47IFwKKyAgICAgICAg
fSBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfQVNTRVJUX09OX1JFTEVBU0VfUkVUVVJO
X1ZBTChvLCB2YWwsIGZtdCwgLi4uKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmICghbykgeyBc
CisgICAgICAgICAgICBFSU5BX0xPR19DUklUKGZtdCwgIyMgX19WQV9BUkdTX18pOyBcCisgICAg
ICAgICAgICBBU1NFUlQobyk7IFwKKyAgICAgICAgICAgIHJldHVybiB2YWw7IFwKKyAgICAgICAg
fSBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIGNvbnN0IGNoYXIqIHRvRWRqZUdyb3VwKEZv
cm1UeXBlIHR5cGUpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdyb3Vwc1tdID0geworICAg
ICAgICAid2Via2l0L3dpZGdldC9idXR0b24iLAorICAgICAgICAid2Via2l0L3dpZGdldC9yYWRp
byIsCisgICAgICAgICJ3ZWJraXQvd2lkZ2V0L2VudHJ5IiwKKyAgICAgICAgIndlYmtpdC93aWRn
ZXQvY2hlY2tib3giLAorICAgICAgICAid2Via2l0L3dpZGdldC9jb21ibyIsCisgICAgICAgICJ3
ZWJraXQvd2lkZ2V0L3Byb2dyZXNzYmFyIiwKKyAgICAgICAgIndlYmtpdC93aWRnZXQvc2Nyb2xs
YmFyL2hvcml6b250YWxfdGh1bWIiLAorICAgICAgICAid2Via2l0L3dpZGdldC9zY3JvbGxiYXIv
aG9yaXpvbnRhbF9iYWNrZ3JvdW5kIiwKKyAgICAgICAgIndlYmtpdC93aWRnZXQvc2Nyb2xsYmFy
L3ZlcnRpY2FsX3RodW1iIiwKKyAgICAgICAgIndlYmtpdC93aWRnZXQvc2Nyb2xsYmFyL3ZlcnRp
Y2FsX2JhY2tncm91bmQiLAorICAgICAgICAid2Via2l0L3dpZGdldC9zZWFyY2gvZmllbGQiLAor
ICAgICAgICAid2Via2l0L3dpZGdldC9zZWFyY2gvcmVzdWx0c19idXR0b24iLAorICAgICAgICAi
d2Via2l0L3dpZGdldC9zZWFyY2gvcmVzdWx0c19kZWNvcmF0aW9uIiwKKyAgICAgICAgIndlYmtp
dC93aWRnZXQvc2VhcmNoL2NhbmNlbF9idXR0b24iLAorICAgICAgICAid2Via2l0L3dpZGdldC9z
bGlkZXIvdmVydGljYWwiLAorICAgICAgICAid2Via2l0L3dpZGdldC9zbGlkZXIvaG9yaXpvbnRh
bCIsCisgICAgICAgICJ3ZWJraXQvd2lkZ2V0L3NsaWRlci90aHVtYl92ZXJ0aWNhbCIsCisgICAg
ICAgICJ3ZWJraXQvd2lkZ2V0L3NsaWRlci90aHVtYl9ob3Jpem9udGFsIiwKKyAgICAgICAgIndl
YmtpdC93aWRnZXQvc3Bpbm5lciIsCisgICAgICAgIDAKKyAgICB9OworICAgIEFTU0VSVCh0eXBl
ID49IDApOworICAgIEFTU0VSVCgoc2l6ZV90KXR5cGUgPCBzaXplb2YoZ3JvdXBzKSAvIHNpemVv
Zihncm91cHNbMF0pKTsgLy8gT3V0IG9mIHN5bmM/CisgICAgcmV0dXJuIGdyb3Vwc1t0eXBlXTsK
K30KKworc3RhdGljIGJvb2wgc2V0U291cmNlR3JvdXBGb3JFZGplT2JqZWN0KEV2YXNfT2JqZWN0
KiBvLCBjb25zdCBTdHJpbmcmIHRoZW1lUGF0aCwgY29uc3QgY2hhciogZ3JvdXApCit7CisgICAg
QVNTRVJUKG8pOworICAgIEFTU0VSVCghdGhlbWVQYXRoLmlzRW1wdHkoKSk7CisKKyAgICBpZiAo
IWVkamVfb2JqZWN0X2ZpbGVfc2V0KG8sIHRoZW1lUGF0aC51dGY4KCkuZGF0YSgpLCBncm91cCkp
IHsKKyAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSA9IGVkamVfbG9hZF9lcnJvcl9zdHIoZWRq
ZV9vYmplY3RfbG9hZF9lcnJvcl9nZXQobykpOworICAgICAgICBFSU5BX0xPR19FUlIoIkNvdWxk
IG5vdCBzZXQgdGhlbWUgZ3JvdXAgJyVzJyBvZiBmaWxlICclcyc6ICVzIiwgZ3JvdXAsIHRoZW1l
UGF0aC51dGY4KCkuZGF0YSgpLCBtZXNzYWdlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RT
aXplQ29uc3RyYWludHMoUmVuZGVyU3R5bGUmIHN0eWxlLCBGb3JtVHlwZSB0eXBlKSBjb25zdAor
eworICAgIGxvYWRUaGVtZUlmTmVlZGVkKCk7CisKKyAgICAvLyBUaGVzZSBhcmUgYWx3YXlzIHZh
bGlkLCBldmVuIGlmIG5vIHRoZW1lIGNvdWxkIGJlIGxvYWRlZC4KKyAgICBjb25zdCBUaGVtZVBh
cnREZXNjKiBkZXNjID0gbV9wYXJ0RGVzY3MgKyAoc2l6ZV90KXR5cGU7CisKKyAgICBpZiAoc3R5
bGUubWluV2lkdGgoKS5pc0ludHJpbnNpYygpKQorICAgICAgICBzdHlsZS5zZXRNaW5XaWR0aChk
ZXNjLT5taW4ud2lkdGgoKSk7CisgICAgaWYgKHN0eWxlLm1pbkhlaWdodCgpLmlzSW50cmluc2lj
KCkpCisgICAgICAgIHN0eWxlLnNldE1pbkhlaWdodChkZXNjLT5taW4uaGVpZ2h0KCkpOworCisg
ICAgaWYgKGRlc2MtPm1heC53aWR0aCgpLnZhbHVlKCkgPiAwICYmIHN0eWxlLm1heFdpZHRoKCku
aXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAgICAgc3R5bGUuc2V0TWF4V2lkdGgoZGVzYy0+bWF4
LndpZHRoKCkpOworICAgIGlmIChkZXNjLT5tYXguaGVpZ2h0KCkudmFsdWUoKSA+IDAgJiYgc3R5
bGUubWF4SGVpZ2h0KCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAgICAgc3R5bGUuc2V0TWF4
SGVpZ2h0KGRlc2MtPm1heC5oZWlnaHQoKSk7CisKKyAgICBzdHlsZS5zZXRQYWRkaW5nVG9wKGRl
c2MtPnBhZGRpbmcudG9wKCkpOworICAgIHN0eWxlLnNldFBhZGRpbmdCb3R0b20oZGVzYy0+cGFk
ZGluZy5ib3R0b20oKSk7CisgICAgc3R5bGUuc2V0UGFkZGluZ0xlZnQoZGVzYy0+cGFkZGluZy5s
ZWZ0KCkpOworICAgIHN0eWxlLnNldFBhZGRpbmdSaWdodChkZXNjLT5wYWRkaW5nLnJpZ2h0KCkp
OworfQorCitzdGF0aWMgYm9vbCBpc0Zvcm1FbGVtZW50VG9vTGFyZ2VUb0Rpc3BsYXkoY29uc3Qg
SW50U2l6ZSYgZWxlbWVudFNpemUpCit7CisgICAgLy8gVGhpcyBsaW1pdCBvZiAyMDAwMCBwaXhl
bHMgaXMgaGFyZGNvZGVkIGluc2lkZSBlZGplIC0tIGFueXRoaW5nIGFib3ZlIHRoaXMgc2l6ZQor
ICAgIC8vIHdpbGwgYmUgY2xpcHBlZC4gVGhpcyB2YWx1ZSBzZWVtcyB0byBiZSByZWFzb25hYmxl
IGVub3VnaCBzbyB0aGF0IGhhcmRjb2RpbmcgaXQKKyAgICAvLyBoZXJlIHdvbid0IGJlIGEgcHJv
YmxlbS4KKyAgICBzdGF0aWMgY29uc3QgaW50IG1heEVkamVEaW1lbnNpb24gPSAyMDAwMDsKKwor
ICAgIHJldHVybiBlbGVtZW50U2l6ZS53aWR0aCgpID4gbWF4RWRqZURpbWVuc2lvbiB8fCBlbGVt
ZW50U2l6ZS5oZWlnaHQoKSA+IG1heEVkamVEaW1lbnNpb247Cit9CisKK3N0ZDo6dW5pcXVlX3B0
cjxSZW5kZXJUaGVtZUVmbDo6VGhlbWVQYXJ0Q2FjaGVFbnRyeT4gUmVuZGVyVGhlbWVFZmw6OlRo
ZW1lUGFydENhY2hlRW50cnk6OmNyZWF0ZShjb25zdCBTdHJpbmcmIHRoZW1lUGF0aCwgRm9ybVR5
cGUgdHlwZSwgY29uc3QgSW50U2l6ZSYgc2l6ZSkKK3sKKyAgICBBU1NFUlQoIXRoZW1lUGF0aC5p
c0VtcHR5KCkpOworCisgICAgaWYgKGlzRm9ybUVsZW1lbnRUb29MYXJnZVRvRGlzcGxheShzaXpl
KSB8fCBzaXplLmlzRW1wdHkoKSkgeworICAgICAgICBFSU5BX0xPR19FUlIoIkNhbm5vdCByZW5k
ZXIgYW4gZWxlbWVudCBvZiBzaXplICVkeCVkLiIsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQo
KSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGF1dG8gZW50cnkgPSBz
dGQ6Om1ha2VfdW5pcXVlPFRoZW1lUGFydENhY2hlRW50cnk+KCk7CisKKyAgICBlbnRyeS0+bV9j
YW52YXMgPSBFZmxVbmlxdWVQdHI8RWNvcmVfRXZhcz4oZWNvcmVfZXZhc19idWZmZXJfbmV3KHNp
emUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSkpOworICAgIGlmICghZW50cnktPmNhbnZhcygpKSB7
CisgICAgICAgIEVJTkFfTE9HX0VSUigiZWNvcmVfZXZhc19idWZmZXJfbmV3KCVkLCAlZCkgZmFp
bGVkLiIsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIHJldHVybiBudWxs
cHRyOworICAgIH0KKworICAgIC8vIEJ5IGRlZmF1bHQgRUZMIGNyZWF0ZXMgYnVmZmVycyB3aXRo
b3V0IGFscGhhLgorICAgIGVjb3JlX2V2YXNfYWxwaGFfc2V0KGVudHJ5LT5jYW52YXMoKSwgRUlO
QV9UUlVFKTsKKworICAgIGVudHJ5LT5tX2VkamUgPSBFZmxVbmlxdWVQdHI8RXZhc19PYmplY3Q+
KGVkamVfb2JqZWN0X2FkZChlY29yZV9ldmFzX2dldChlbnRyeS0+Y2FudmFzKCkpKSk7CisgICAg
QVNTRVJUKGVudHJ5LT5lZGplKCkpOworCisgICAgaWYgKCFzZXRTb3VyY2VHcm91cEZvckVkamVP
YmplY3QoZW50cnktPmVkamUoKSwgdGhlbWVQYXRoLCB0b0VkamVHcm91cCh0eXBlKSkpCisgICAg
ICAgIHJldHVybiBudWxscHRyOworCisgICAgZW50cnktPm1fc3VyZmFjZSA9IGNyZWF0ZVN1cmZh
Y2VGb3JCYWNraW5nU3RvcmUoZW50cnktPmNhbnZhcygpKTsKKyAgICBpZiAoIWVudHJ5LT5zdXJm
YWNlKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgZXZhc19vYmplY3RfcmVzaXpl
KGVudHJ5LT5lZGplKCksIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7CisgICAgZXZhc19v
YmplY3Rfc2hvdyhlbnRyeS0+ZWRqZSgpKTsKKworICAgIGVudHJ5LT50eXBlID0gdHlwZTsKKyAg
ICBlbnRyeS0+c2l6ZSA9IHNpemU7CisKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3ZvaWQgUmVu
ZGVyVGhlbWVFZmw6OlRoZW1lUGFydENhY2hlRW50cnk6OnJldXNlKGNvbnN0IFN0cmluZyYgdGhl
bWVQYXRoLCBGb3JtVHlwZSBuZXdUeXBlLCBjb25zdCBJbnRTaXplJiBuZXdTaXplKQoreworICAg
IEFTU0VSVCghdGhlbWVQYXRoLmlzRW1wdHkoKSk7CisKKyAgICBpZiAodHlwZSAhPSBuZXdUeXBl
KSB7CisgICAgICAgIHR5cGUgPSBuZXdUeXBlOworICAgICAgICBpZiAoIXNldFNvdXJjZUdyb3Vw
Rm9yRWRqZU9iamVjdChlZGplKCksIHRoZW1lUGF0aCwgdG9FZGplR3JvdXAobmV3VHlwZSkpKSB7
CisgICAgICAgICAgICB0eXBlID0gRm9ybVR5cGVMYXN0OyAvLyBJbnZhbGlkYXRlLgorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemUgIT0gbmV3U2l6
ZSkgeworICAgICAgICBzaXplID0gbmV3U2l6ZTsKKyAgICAgICAgZWNvcmVfZXZhc19yZXNpemUo
Y2FudmFzKCksIG5ld1NpemUud2lkdGgoKSwgbmV3U2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIGV2
YXNfb2JqZWN0X3Jlc2l6ZShlZGplKCksIG5ld1NpemUud2lkdGgoKSwgbmV3U2l6ZS5oZWlnaHQo
KSk7CisKKyAgICAgICAgbV9zdXJmYWNlID0gY3JlYXRlU3VyZmFjZUZvckJhY2tpbmdTdG9yZShj
YW52YXMoKSk7CisgICAgICAgIGlmICghc3VyZmFjZSgpKSB7CisgICAgICAgICAgICB0eXBlID0g
Rm9ybVR5cGVMYXN0OyAvLyBJbnZhbGlkYXRlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgfQorfQorCitSZW5kZXJUaGVtZUVmbDo6VGhlbWVQYXJ0Q2FjaGVFbnRyeSogUmVu
ZGVyVGhlbWVFZmw6OmdldFRoZW1lUGFydEZyb21DYWNoZShGb3JtVHlwZSB0eXBlLCBjb25zdCBJ
bnRTaXplJiBzaXplKQoreworICAgIHNpemVfdCByZXVzYWJsZU5vZGVJbmRleCA9IDA7CisKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcGFydENhY2hlLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIFRoZW1lUGFydENhY2hlRW50cnkqIGNhbmRpZGF0ZWRFbnRyeSA9IG1fcGFydENhY2hlW2ld
LmdldCgpOworICAgICAgICBpZiAoY2FuZGlkYXRlZEVudHJ5LT5zaXplID09IHNpemUpIHsKKyAg
ICAgICAgICAgIGlmIChjYW5kaWRhdGVkRW50cnktPnR5cGUgPT0gdHlwZSkgeworICAgICAgICAg
ICAgICAgIC8vIEZvdW5kIHRoZSByaWdodCBpdGVtLCBtb3ZlIGl0IHRvIHRoZSBoZWFkIG9mIHRo
ZSBsaXN0CisgICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybiBpdC4KKyAgICAgICAgICAgICAg
ICBhdXRvIHRlbXAgPSBXVEY6Om1vdmUobV9wYXJ0Q2FjaGVbaV0pOworICAgICAgICAgICAgICAg
IG1fcGFydENhY2hlLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBtX3BhcnRDYWNoZS5pbnNl
cnQoMCwgV1RGOjptb3ZlKHRlbXApKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9wYXJ0Q2Fj
aGUuZmlyc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldXNhYmxlTm9k
ZUluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3BhcnRDYWNoZS5zaXpl
KCkgPCBSRU5ERVJfVEhFTUVfRUZMX1BBUlRfQ0FDSEVfTUFYKSB7CisgICAgICAgIGF1dG8gZW50
cnkgPSBUaGVtZVBhcnRDYWNoZUVudHJ5OjpjcmVhdGUodGhlbWVQYXRoKCksIHR5cGUsIHNpemUp
OworICAgICAgICBpZiAoZW50cnkpCisgICAgICAgICAgICBtX3BhcnRDYWNoZS5pbnNlcnQoMCwg
V1RGOjptb3ZlKGVudHJ5KSk7CisKKyAgICAgICAgcmV0dXJuIG1fcGFydENhY2hlLmZpcnN0KCku
Z2V0KCk7CisgICAgfQorCisgICAgLy8gVGhlIGNhY2hlIGlzIGZ1bGwsIHJldXNlIHRoZSBsYXN0
IGl0ZW0gd2UgZm91bmQgdGhhdCBoYWQgdGhlCisgICAgLy8gcmVxdWVzdGVkIHNpemUgdG8gYXZv
aWQgcmVzaXppbmcuIElmIHRoZXJlIHdhcyBub25lLCByZXVzZQorICAgIC8vIHRoZSBsYXN0IGl0
ZW0gb2YgdGhlIGxpc3QuCisgICAgaWYgKCFyZXVzYWJsZU5vZGVJbmRleCkKKyAgICAgICAgcmV1
c2FibGVOb2RlSW5kZXggPSBtX3BhcnRDYWNoZS5zaXplKCkgLSAxOworCisgICAgVGhlbWVQYXJ0
Q2FjaGVFbnRyeSogcmV1c2VkRW50cnkgPSBtX3BhcnRDYWNoZVtyZXVzYWJsZU5vZGVJbmRleF0u
Z2V0KCk7CisgICAgQVNTRVJUKHJldXNlZEVudHJ5KTsKKyAgICByZXVzZWRFbnRyeS0+cmV1c2Uo
dGhlbWVQYXRoKCksIHR5cGUsIHNpemUpOworICAgIGF1dG8gdGVtcCA9IFdURjo6bW92ZShtX3Bh
cnRDYWNoZVtyZXVzYWJsZU5vZGVJbmRleF0pOworICAgIG1fcGFydENhY2hlLnJlbW92ZShyZXVz
YWJsZU5vZGVJbmRleCk7CisgICAgbV9wYXJ0Q2FjaGUuaW5zZXJ0KDAsIFdURjo6bW92ZSh0ZW1w
KSk7CisKKyAgICByZXR1cm4gbV9wYXJ0Q2FjaGUuZmlyc3QoKS5nZXQoKTsKK30KKwordm9pZCBS
ZW5kZXJUaGVtZUVmbDo6Y2xlYXJUaGVtZVBhcnRDYWNoZSgpCit7CisgICAgZm9yIChhdXRvJiBw
YXJ0IDogbV9wYXJ0Q2FjaGUpCisgICAgICAgIHBhcnQgPSBudWxscHRyOworfQorCit2b2lkIFJl
bmRlclRoZW1lRWZsOjphcHBseUVkamVTdGF0ZUZyb21Gb3JtKEV2YXNfT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IENvbnRyb2xTdGF0ZXMqIHN0YXRlcywgYm9vbCBoYXZlQmFja2dyb3VuZCkKK3sKKyAg
ICBjb25zdCBjaGFyKiBzaWduYWxzW10gPSB7IC8vIGtlZXAgaW4gc3luYyB3aXRoIFdlYkNvcmUv
cGxhdGZvcm0vVGhlbWVUeXBlcy5oCisgICAgICAgICJob3ZlcmVkIiwKKyAgICAgICAgInByZXNz
ZWQiLAorICAgICAgICAiZm9jdXNlZCIsCisgICAgICAgICJlbmFibGVkIiwKKyAgICAgICAgImNo
ZWNrZWQiLAorICAgICAgICAicmVhZC1vbmx5IiwKKyAgICAgICAgImRlZmF1bHQiLAorICAgICAg
ICAid2luZG93LWluYWN0aXZlIiwKKyAgICAgICAgImluZGV0ZXJtaW5hdGUiLAorICAgICAgICAi
c3BpbnVwIgorICAgIH07CisKKyAgICBlZGplX29iamVjdF9zaWduYWxfZW1pdChvYmplY3QsICJy
ZXNldCIsICIiKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdU
SChzaWduYWxzKTsgKytpKSB7CisgICAgICAgIGlmIChzdGF0ZXMtPnN0YXRlcygpICYgKDEgPDwg
aSkpCisgICAgICAgICAgICBlZGplX29iamVjdF9zaWduYWxfZW1pdChvYmplY3QsIHNpZ25hbHNb
aV0sICIiKTsKKyAgICB9CisKKyAgICBpZiAoaGF2ZUJhY2tncm91bmQpCisgICAgICAgIGVkamVf
b2JqZWN0X3NpZ25hbF9lbWl0KG9iamVjdCwgInN0eWxlZCIsICIiKTsKK30KKwordm9pZCBSZW5k
ZXJUaGVtZUVmbDo6YXBwbHlFZGplUlRMU3RhdGUoRXZhc19PYmplY3QqIGVkamUsIGNvbnN0IFJl
bmRlck9iamVjdCYgb2JqZWN0LCBGb3JtVHlwZSB0eXBlLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIGlmICh0eXBlID09IFNsaWRlclZlcnRpY2FsIHx8IHR5cGUgPT0gU2xpZGVySG9yaXpv
bnRhbCkgeworICAgICAgICBpZiAoIWlzPFJlbmRlclNsaWRlcj4ob2JqZWN0KSkKKyAgICAgICAg
ICAgIHJldHVybjsgLy8gcHJvYmFibHkgaGF2ZSAtd2Via2l0LWFwcGVhcmFuY2U6IHNsaWRlci4u
CisKKyAgICAgICAgSFRNTElucHV0RWxlbWVudCYgaW5wdXQgPSBkb3duY2FzdDxSZW5kZXJTbGlk
ZXI+KG9iamVjdCkuZWxlbWVudCgpOworICAgICAgICBkb3VibGUgdmFsdWVSYW5nZSA9IGlucHV0
Lm1heGltdW0oKSAtIGlucHV0Lm1pbmltdW0oKTsKKworICAgICAgICBhdXRvIG1zZyA9IHN0ZDo6
bWFrZV91bmlxdWU8RWRqZV9NZXNzYWdlX0Zsb2F0X1NldD4oKTsKKyAgICAgICAgbXNnLT5jb3Vu
dCA9IDI7CisKKyAgICAgICAgLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBvZiB0aGUgbWVzc2FnZSBk
ZWNpZGVzIGlmIHRoZSBwcm9ncmVzcyBiYXIKKyAgICAgICAgLy8gZ3Jvd3MgZnJvbSB0aGUgZW5k
IG9mIHRoZSBzbGlkZXIgb3IgZnJvbSB0aGUgYmVnaW5uaW5nLiBPbiB2ZXJ0aWNhbAorICAgICAg
ICAvLyBzbGlkZXJzLCBpdCBzaG91bGQgYWx3YXlzIGJlIHRoZSBzYW1lIGFuZCB3aWxsIG5vdCBi
ZSBhZmZlY3RlZCBieQorICAgICAgICAvLyB0ZXh0IGRpcmVjdGlvbiBzZXR0aW5ncy4KKyAgICAg
ICAgaWYgKG9iamVjdC5zdHlsZSgpLmRpcmVjdGlvbigpID09IFJUTCB8fCB0eXBlID09IFNsaWRl
clZlcnRpY2FsKQorICAgICAgICAgICAgbXNnLT52YWxbMF0gPSAxOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBtc2ctPnZhbFswXSA9IDA7CisKKyAgICAgICAgbXNnLT52YWxbMV0gPSAoaW5w
dXQudmFsdWVBc051bWJlcigpIC0gaW5wdXQubWluaW11bSgpKSAvIHZhbHVlUmFuZ2U7CisgICAg
ICAgIGVkamVfb2JqZWN0X21lc3NhZ2Vfc2VuZChlZGplLCBFREpFX01FU1NBR0VfRkxPQVRfU0VU
LCAwLCBtc2cuZ2V0KCkpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQcm9ncmVzc0Jhcikgewor
ICAgICAgICBjb25zdCBhdXRvJiByZW5kZXJQcm9ncmVzcyA9IGRvd25jYXN0PFJlbmRlclByb2dy
ZXNzPihvYmplY3QpOworCisgICAgICAgIGludCBtYXggPSByZWN0LndpZHRoKCk7CisgICAgICAg
IGRvdWJsZSB2YWx1ZSA9IHJlbmRlclByb2dyZXNzLnBvc2l0aW9uKCk7CisKKyAgICAgICAgYXV0
byBtc2cgPSBzdGQ6Om1ha2VfdW5pcXVlPEVkamVfTWVzc2FnZV9GbG9hdF9TZXQ+KCk7CisgICAg
ICAgIG1zZy0+Y291bnQgPSAyOworCisgICAgICAgIGlmIChvYmplY3Quc3R5bGUoKS5kaXJlY3Rp
b24oKSA9PSBSVEwpCisgICAgICAgICAgICBtc2ctPnZhbFswXSA9ICgxLjAgLSB2YWx1ZSkgKiBt
YXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1zZy0+dmFsWzBdID0gMDsKKyAgICAgICAg
bXNnLT52YWxbMV0gPSB2YWx1ZTsKKyAgICAgICAgZWRqZV9vYmplY3RfbWVzc2FnZV9zZW5kKGVk
amUsIEVESkVfTUVTU0FHRV9GTE9BVF9TRVQsIDAsIG1zZy5nZXQoKSk7CisgICAgfQorfQorCiti
b29sIFJlbmRlclRoZW1lRWZsOjppc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVuZGVyU3R5bGUmIHN0
eWxlLCBjb25zdCBCb3JkZXJEYXRhJiBib3JkZXIsIGNvbnN0IEZpbGxMYXllciYgYmFja2dyb3Vu
ZCwgY29uc3QgQ29sb3ImIGJhY2tncm91bmRDb2xvcikgY29uc3QKK3sKKyAgICByZXR1cm4gUmVu
ZGVyVGhlbWU6OmlzQ29udHJvbFN0eWxlZChzdHlsZSwgYm9yZGVyLCBiYWNrZ3JvdW5kLCBiYWNr
Z3JvdW5kQ29sb3IpIHx8IHN0eWxlLmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRvblBhcnQ7
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVFZmw6OnBhaW50VGhlbWVQYXJ0KGNvbnN0IFJlbmRlck9i
amVjdCYgb2JqZWN0LCBGb3JtVHlwZSB0eXBlLCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgbG9hZFRoZW1lSWZOZWVkZWQoKTsKKyAgICBfQVNTRVJU
X09OX1JFTEVBU0VfUkVUVVJOX1ZBTChlZGplKCksIGZhbHNlLCAiQ291bGQgbm90IHBhaW50IG5h
dGl2ZSBIVE1MIHBhcnQgZHVlIHRvIG1pc3NpbmcgdGhlbWUuIik7CisKKyAgICBUaGVtZVBhcnRD
YWNoZUVudHJ5KiBlbnRyeSA9IGdldFRoZW1lUGFydEZyb21DYWNoZSh0eXBlLCByZWN0LnNpemUo
KSk7CisgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBo
YXZlQmFja2dyb3VuZENvbG9yID0gaXNDb250cm9sU3R5bGVkKG9iamVjdC5zdHlsZSgpLCBvYmpl
Y3Quc3R5bGUoKS5ib3JkZXIoKSwgKm9iamVjdC5zdHlsZSgpLmJhY2tncm91bmRMYXllcnMoKSwg
Q29sb3I6OndoaXRlKTsKKyAgICBDb250cm9sU3RhdGVzIHN0YXRlcyhleHRyYWN0Q29udHJvbFN0
YXRlc0ZvclJlbmRlcmVyKG9iamVjdCkpOworICAgIGFwcGx5RWRqZVN0YXRlRnJvbUZvcm0oZW50
cnktPmVkamUoKSwgJnN0YXRlcywgaGF2ZUJhY2tncm91bmRDb2xvcik7CisKKyAgICBhcHBseUVk
amVSVExTdGF0ZShlbnRyeS0+ZWRqZSgpLCBvYmplY3QsIHR5cGUsIHJlY3QpOworCisgICAgZWRq
ZV9vYmplY3RfY2FsY19mb3JjZShlbnRyeS0+ZWRqZSgpKTsKKyAgICBlZGplX29iamVjdF9tZXNz
YWdlX3NpZ25hbF9wcm9jZXNzKGVudHJ5LT5lZGplKCkpOworICAgIGV2YXNfcmVuZGVyKGVjb3Jl
X2V2YXNfZ2V0KGVudHJ5LT5jYW52YXMoKSkpOworCisgICAgY2Fpcm9fdCogY2Fpcm8gPSBpbmZv
LmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jcigpOworICAgIEFTU0VSVChjYWlybyk7CisK
KyAgICBjYWlyb19zYXZlKGNhaXJvKTsKKyAgICBjYWlyb19zZXRfc291cmNlX3N1cmZhY2UoY2Fp
cm8sIGVudHJ5LT5zdXJmYWNlKCksIHJlY3QueCgpLCByZWN0LnkoKSk7CisgICAgY2Fpcm9fcGFp
bnRfd2l0aF9hbHBoYShjYWlybywgMS4wKTsKKyAgICBjYWlyb19yZXN0b3JlKGNhaXJvKTsKKwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRUaGVtZVBh
cnQoY29uc3QgR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBGb3JtVHlwZSB0eXBlLCBjb25zdCBJ
bnRSZWN0JiByZWN0KQoreworICAgIGxvYWRUaGVtZUlmTmVlZGVkKCk7CisgICAgX0FTU0VSVF9P
Tl9SRUxFQVNFX1JFVFVSTl9WQUwoZWRqZSgpLCBmYWxzZSwgIkNvdWxkIG5vdCBwYWludCBuYXRp
dmUgSFRNTCBwYXJ0IGR1ZSB0byBtaXNzaW5nIHRoZW1lLiIpOworCisgICAgVGhlbWVQYXJ0Q2Fj
aGVFbnRyeSogZW50cnkgPSBnZXRUaGVtZVBhcnRGcm9tQ2FjaGUodHlwZSwgcmVjdC5zaXplKCkp
OworICAgIEFTU0VSVChlbnRyeSk7CisKKyAgICBlZGplX29iamVjdF9jYWxjX2ZvcmNlKGVudHJ5
LT5lZGplKCkpOworICAgIGVkamVfb2JqZWN0X21lc3NhZ2Vfc2lnbmFsX3Byb2Nlc3MoZW50cnkt
PmVkamUoKSk7CisgICAgZXZhc19yZW5kZXIoZWNvcmVfZXZhc19nZXQoZW50cnktPmNhbnZhcygp
KSk7CisKKyAgICBjYWlyb190KiBjYWlybyA9IGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPmNy
KCk7CisgICAgQVNTRVJUKGNhaXJvKTsKKworICAgIGNhaXJvX3NhdmUoY2Fpcm8pOworICAgIGNh
aXJvX3NldF9zb3VyY2Vfc3VyZmFjZShjYWlybywgZW50cnktPnN1cmZhY2UoKSwgcmVjdC54KCks
IHJlY3QueSgpKTsKKyAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNhaXJvLCAxLjApOworICAg
IGNhaXJvX3Jlc3RvcmUoY2Fpcm8pOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitQYXNzUmVm
UHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZUVmbDo6Y3JlYXRlKFBhZ2UqIHBhZ2UpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBSZW5kZXJUaGVtZUVmbChwYWdlKSk7Cit9CisKK1Bhc3NS
ZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lOjp0aGVtZUZvclBhZ2UoUGFnZSogcGFnZSkK
K3sKKyAgICBpZiAocGFnZSkKKyAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lRWZsOjpjcmVhdGUo
cGFnZSk7CisKKyAgICBzdGF0aWMgUmVuZGVyVGhlbWUqIGZhbGxiYWNrID0gUmVuZGVyVGhlbWVF
Zmw6OmNyZWF0ZSgwKS5sZWFrUmVmKCk7CisgICAgcmV0dXJuIGZhbGxiYWNrOworfQorCitzdGF0
aWMgdm9pZCBhcHBseUNvbG9yQ2FsbGJhY2sodm9pZCogZGF0YSwgRXZhc19PYmplY3QqLCBjb25z
dCBjaGFyKiAvKiBzaWduYWwgKi8sIGNvbnN0IGNoYXIqIGNvbG9yQ2xhc3MpCit7CisgICAgUmVu
ZGVyVGhlbWVFZmwqIHRoYXQgPSBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCo+KGRhdGEpOwor
ICAgIHRoYXQtPnNldENvbG9yRnJvbVRoZW1lQ2xhc3MoY29sb3JDbGFzcyk7CisgICAgdGhhdC0+
cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsgLy8gVHJpZ2dlcnMgcmVsYXlvdXQuCit9CisKK3N0
YXRpYyBib29sIGZpbGxDb2xvcnNGcm9tRWRqZUNsYXNzKEV2YXNfT2JqZWN0KiBvLCBjb25zdCBj
aGFyKiBjb2xvckNsYXNzLCBDb2xvciogY29sb3IxLCBDb2xvciogY29sb3IyID0gMCwgQ29sb3Iq
IGNvbG9yMyA9IDApCit7CisgICAgaW50IHIxLCBnMSwgYjEsIGExOworICAgIGludCByMiwgZzIs
IGIyLCBhMjsKKyAgICBpbnQgcjMsIGczLCBiMywgYTM7CisKKyAgICBpZiAoIWVkamVfb2JqZWN0
X2NvbG9yX2NsYXNzX2dldChvLCBjb2xvckNsYXNzLCAmcjEsICZnMSwgJmIxLCAmYTEsICZyMiwg
JmcyLCAmYjIsICZhMiwgJnIzLCAmZzMsICZiMywgJmEzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKGNvbG9yMSkKKyAgICAgICAgY29sb3IxLT5zZXRSR0IobWFrZVJHQkEocjEs
IGcxLCBiMSwgYTEpKTsKKyAgICBpZiAoY29sb3IyKQorICAgICAgICBjb2xvcjItPnNldFJHQiht
YWtlUkdCQShyMiwgZzIsIGIyLCBhMikpOworICAgIGlmIChjb2xvcjMpCisgICAgICAgIGNvbG9y
My0+c2V0UkdCKG1ha2VSR0JBKHIzLCBnMywgYjMsIGEzKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBSZW5kZXJUaGVtZUVmbDo6c2V0Q29sb3JGcm9tVGhlbWVDbGFzcyhjb25zdCBj
aGFyKiBjb2xvckNsYXNzKQoreworICAgIEFTU0VSVChlZGplKCkpOworCisgICAgaWYgKCFzdHJj
bXAoIndlYmtpdC9zZWxlY3Rpb24vZm9yZWdyb3VuZCIsIGNvbG9yQ2xhc3MpKQorICAgICAgICBt
X3N1cHBvcnRzU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yID0gZmlsbENvbG9yc0Zyb21FZGplQ2xh
c3MoZWRqZSgpLCBjb2xvckNsYXNzLCAmbV9hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3Is
ICZtX2luYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKTsKKyAgICBlbHNlIGlmICghc3Ry
Y21wKCJ3ZWJraXQvc2VsZWN0aW9uL2JhY2tncm91bmQiLCBjb2xvckNsYXNzKSkKKyAgICAgICAg
ZmlsbENvbG9yc0Zyb21FZGplQ2xhc3MoZWRqZSgpLCBjb2xvckNsYXNzLCAmbV9hY3RpdmVTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IsICZtX2luYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9y
KTsKKyAgICBlbHNlIGlmICghc3RyY21wKCJ3ZWJraXQvZm9jdXNfcmluZyIsIGNvbG9yQ2xhc3Mp
KSB7CisgICAgICAgIGlmICghZmlsbENvbG9yc0Zyb21FZGplQ2xhc3MoZWRqZSgpLCBjb2xvckNs
YXNzLCAmbV9mb2N1c1JpbmdDb2xvcikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAg
Ly8gcGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigpIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGRlZmF1bHQg
dGhlbWUgKHdpdGhvdXQgcGFnZSkKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyB1Z2x5LCBi
dXQgbm8gb3RoZXIgd2F5IHRvIGRvIGl0IHVubGVzcyB3ZSBjaGFuZ2UgaXQgdG8gdXNlIHBhZ2Ug
dGhlbWVzIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICAgICAgIFJlbmRlclRoZW1lOjpzZXRDdXN0
b21Gb2N1c1JpbmdDb2xvcihtX2ZvY3VzUmluZ0NvbG9yKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVu
ZGVyVGhlbWVFZmw6OnNldFRoZW1lUGF0aChjb25zdCBTdHJpbmcmIG5ld1RoZW1lUGF0aCkKK3sK
KyAgICBpZiAobmV3VGhlbWVQYXRoID09IG1fdGhlbWVQYXRoKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAobmV3VGhlbWVQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBFSU5BX0xPR19DUklU
KCJObyB2YWxpZCB0aGVtZSBkZWZpbmVkLCB0aGluZ3Mgd2lsbCBub3Qgd29yayBwcm9wZXJseS4i
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZyBvbGRUaGVtZVBhdGggPSBt
X3RoZW1lUGF0aDsKKyAgICBtX3RoZW1lUGF0aCA9IG5ld1RoZW1lUGF0aDsKKworICAgIC8vIEtl
ZXAgdGhlIGNvbnNpc3RlbmNlIGJ5IHJlc3RvcmluZyB0aGUgcHJldmlvdXMgdGhlbWUgcGF0aAor
ICAgIC8vIGlmIHdlIGNhbm5vdCBsb2FkIHRoZSBuZXcgb25lLgorICAgIGlmICghbG9hZFRoZW1l
KCkpCisgICAgICAgIG1fdGhlbWVQYXRoID0gb2xkVGhlbWVQYXRoOworfQorCitTdHJpbmcgUmVu
ZGVyVGhlbWVFZmw6OnRoZW1lUGF0aCgpIGNvbnN0Cit7CisjaWZuZGVmIE5ERUJVRworICAgIGlm
IChlZGplKCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aDsKKyAgICAgICAgZWRqZV9vYmpl
Y3RfZmlsZV9nZXQoZWRqZSgpLCAmcGF0aCwgMCk7CisgICAgICAgIEFTU0VSVChtX3RoZW1lUGF0
aCA9PSBwYXRoKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gbV90aGVtZVBhdGg7Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVFZmw6OmxvYWRUaGVtZSgpCit7CisgICAgQVNTRVJUKCFtX3RoZW1l
UGF0aC5pc0VtcHR5KCkpOworCisgICAgaWYgKCFjYW52YXMoKSkgeworICAgICAgICBtX2NhbnZh
cyA9IEVmbFVuaXF1ZVB0cjxFY29yZV9FdmFzPihlY29yZV9ldmFzX2J1ZmZlcl9uZXcoMSwgMSkp
OworICAgICAgICBfQVNTRVJUX09OX1JFTEVBU0VfUkVUVVJOX1ZBTChjYW52YXMoKSwgZmFsc2Us
CisgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGNhbnZhcyByZXF1aXJlZCBieSB0aGVtZSwgdGhp
bmdzIHdpbGwgbm90IHdvcmsgcHJvcGVybHkuIik7CisgICAgfQorCisgICAgRWZsVW5pcXVlUHRy
PEV2YXNfT2JqZWN0PiBvID0gRWZsVW5pcXVlUHRyPEV2YXNfT2JqZWN0PihlZGplX29iamVjdF9h
ZGQoZWNvcmVfZXZhc19nZXQoY2FudmFzKCkpKSk7CisgICAgX0FTU0VSVF9PTl9SRUxFQVNFX1JF
VFVSTl9WQUwobywgZmFsc2UsICJDb3VsZCBub3QgY3JlYXRlIG5ldyBiYXNlIEVkamUgb2JqZWN0
LiIpOworCisgICAgaWYgKCFzZXRTb3VyY2VHcm91cEZvckVkamVPYmplY3Qoby5nZXQoKSwgbV90
aGVtZVBhdGgsICJ3ZWJraXQvYmFzZSIpKQorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEtlZXAg
Y3VycmVudCB0aGVtZS4KKworICAgIC8vIEludmFsaWRhdGUgZXhpc3RpbmcgdGhlbWUgcGFydCBj
YWNoZS4KKyAgICBpZiAoZWRqZSgpKQorICAgICAgICBjbGVhclRoZW1lUGFydENhY2hlKCk7CisK
KyAgICAvLyBTZXQgbmV3IGxvYWRlZCB0aGVtZSwgYW5kIGFwcGx5IGl0LgorICAgIG1fZWRqZSA9
IFdURjo6bW92ZShvKTsKKworICAgIGNvbnN0IGNoYXIqIHRoaWNrbmVzcyA9IGVkamVfb2JqZWN0
X2RhdGFfZ2V0KG1fZWRqZS5nZXQoKSwgInNjcm9sbGJhci50aGlja25lc3MiKTsKKyAgICBpZiAo
dGhpY2tuZXNzICYmICFTZXR0aW5nczo6bW9ja1Njcm9sbGJhcnNFbmFibGVkKCkpCisgICAgICAg
IHN0YXRpY19jYXN0PFNjcm9sbGJhclRoZW1lRWZsKj4oU2Nyb2xsYmFyVGhlbWU6OnRoZW1lKCkp
LT5zZXRTY3JvbGxiYXJUaGlja25lc3MoYXRvaSh0aGlja25lc3MpKTsKKworICAgIGVkamVfb2Jq
ZWN0X3NpZ25hbF9jYWxsYmFja19hZGQoZWRqZSgpLCAiY29sb3JfY2xhc3Msc2V0IiwgIndlYmtp
dC9zZWxlY3Rpb24vZm9yZWdyb3VuZCIsIGFwcGx5Q29sb3JDYWxsYmFjaywgdGhpcyk7CisgICAg
ZWRqZV9vYmplY3Rfc2lnbmFsX2NhbGxiYWNrX2FkZChlZGplKCksICJjb2xvcl9jbGFzcyxzZXQi
LCAid2Via2l0L3NlbGVjdGlvbi9iYWNrZ3JvdW5kIiwgYXBwbHlDb2xvckNhbGxiYWNrLCB0aGlz
KTsKKyAgICBlZGplX29iamVjdF9zaWduYWxfY2FsbGJhY2tfYWRkKGVkamUoKSwgImNvbG9yX2Ns
YXNzLHNldCIsICJ3ZWJraXQvZm9jdXNfcmluZyIsIGFwcGx5Q29sb3JDYWxsYmFjaywgdGhpcyk7
CisKKyAgICBhcHBseVBhcnREZXNjcmlwdGlvbnNGcm9tKG1fdGhlbWVQYXRoKTsKKworICAgIHNl
dENvbG9yRnJvbVRoZW1lQ2xhc3MoIndlYmtpdC9zZWxlY3Rpb24vZm9yZWdyb3VuZCIpOworICAg
IHNldENvbG9yRnJvbVRoZW1lQ2xhc3MoIndlYmtpdC9zZWxlY3Rpb24vYmFja2dyb3VuZCIpOwor
ICAgIHNldENvbG9yRnJvbVRoZW1lQ2xhc3MoIndlYmtpdC9mb2N1c19yaW5nIik7CisKKyAgICBw
bGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOyAvLyBTY2hlZHVsZXMgYSByZWxheW91dCwgZG8gbGFz
dC4KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclRoZW1lRWZsOjphcHBseVBh
cnREZXNjcmlwdGlvbkZhbGxiYWNrKFRoZW1lUGFydERlc2MqIGRlc2MpCit7CisgICAgZGVzYy0+
bWluLnNldFdpZHRoKExlbmd0aCgwLCBGaXhlZCkpOworICAgIGRlc2MtPm1pbi5zZXRIZWlnaHQo
TGVuZ3RoKDAsIEZpeGVkKSk7CisKKyAgICBkZXNjLT5tYXguc2V0V2lkdGgoTGVuZ3RoKDAsIEZp
eGVkKSk7CisgICAgZGVzYy0+bWF4LnNldEhlaWdodChMZW5ndGgoMCwgRml4ZWQpKTsKKworICAg
IGRlc2MtPnBhZGRpbmcgPSBMZW5ndGhCb3goMCwgMCwgMCwgMCk7Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVFZmw6OmFwcGx5UGFydERlc2NyaXB0aW9uKEV2YXNfT2JqZWN0KiBvYmplY3QsIFRoZW1l
UGFydERlc2MqIGRlc2MpCit7CisgICAgRXZhc19Db29yZCBtaW53LCBtaW5oLCBtYXh3LCBtYXho
OworCisgICAgZWRqZV9vYmplY3Rfc2l6ZV9taW5fZ2V0KG9iamVjdCwgJm1pbncsICZtaW5oKTsK
KyAgICBpZiAoIW1pbncgJiYgIW1pbmgpCisgICAgICAgIGVkamVfb2JqZWN0X3NpemVfbWluX2Nh
bGMob2JqZWN0LCAmbWludywgJm1pbmgpOworCisgICAgZGVzYy0+bWluLnNldFdpZHRoKExlbmd0
aChtaW53LCBGaXhlZCkpOworICAgIGRlc2MtPm1pbi5zZXRIZWlnaHQoTGVuZ3RoKG1pbmgsIEZp
eGVkKSk7CisKKyAgICBlZGplX29iamVjdF9zaXplX21heF9nZXQob2JqZWN0LCAmbWF4dywgJm1h
eGgpOworICAgIGRlc2MtPm1heC5zZXRXaWR0aChMZW5ndGgobWF4dywgRml4ZWQpKTsKKyAgICBk
ZXNjLT5tYXguc2V0SGVpZ2h0KExlbmd0aChtYXhoLCBGaXhlZCkpOworCisgICAgaWYgKCFlZGpl
X29iamVjdF9wYXJ0X2V4aXN0cyhvYmplY3QsICJ0ZXh0X2NvbmZpbmVtZW50IikpCisgICAgICAg
IGRlc2MtPnBhZGRpbmcgPSBMZW5ndGhCb3goMCwgMCwgMCwgMCk7CisgICAgZWxzZSB7CisgICAg
ICAgIEV2YXNfQ29vcmQgcHgsIHB5LCBwdywgcGg7CisgICAgICAgIEV2YXNfQ29vcmQgb3ggPSAw
LCBveSA9IDAsIG93ID0gMCwgb2ggPSAwOworICAgICAgICBpbnQgdG9wLCByaWdodCwgYm90dG9t
LCBsZWZ0OworCisgICAgICAgIGlmIChtaW53ID4gMCkKKyAgICAgICAgICAgIG93ID0gbWludzsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3cgPSAxMDA7CisgICAgICAgIGlmIChtaW5oID4g
MCkKKyAgICAgICAgICAgIG9oID0gbWluaDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2gg
PSAxMDA7CisgICAgICAgIGlmIChtYXh3ID4gMCAmJiBvdyA+IG1heHcpCisgICAgICAgICAgICBv
dyA9IG1heHc7CisgICAgICAgIGlmIChtYXhoID4gMCAmJiBvaCA+IG1heGgpCisgICAgICAgICAg
ICBvaCA9IG1heGg7CisKKyAgICAgICAgZXZhc19vYmplY3RfbW92ZShvYmplY3QsIG94LCBveSk7
CisgICAgICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShvYmplY3QsIG93LCBvaCk7CisgICAgICAgIGVk
amVfb2JqZWN0X2NhbGNfZm9yY2Uob2JqZWN0KTsKKyAgICAgICAgZWRqZV9vYmplY3RfbWVzc2Fn
ZV9zaWduYWxfcHJvY2VzcyhvYmplY3QpOworICAgICAgICBlZGplX29iamVjdF9wYXJ0X2dlb21l
dHJ5X2dldChvYmplY3QsICJ0ZXh0X2NvbmZpbmVtZW50IiwgJnB4LCAmcHksICZwdywgJnBoKTsK
KworICAgICAgICB0b3AgPSBweSAtIG95OworICAgICAgICBib3R0b20gPSAob2ggKyBveSkgLSAo
cGggKyBweSk7CisKKyAgICAgICAgbGVmdCA9IHB4IC0gb3g7CisgICAgICAgIHJpZ2h0ID0gKG93
ICsgb3gpIC0gKHB3ICsgcHgpOworCisgICAgICAgIGRlc2MtPnBhZGRpbmcgPSBMZW5ndGhCb3go
dG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVF
Zmw6OmFwcGx5UGFydERlc2NyaXB0aW9uc0Zyb20oY29uc3QgU3RyaW5nJiB0aGVtZVBhdGgpCit7
CisgICAgRWZsVW5pcXVlUHRyPEV2YXNfT2JqZWN0PiB0ZW1wID0gRWZsVW5pcXVlUHRyPEV2YXNf
T2JqZWN0PihlZGplX29iamVjdF9hZGQoZWNvcmVfZXZhc19nZXQoY2FudmFzKCkpKSk7CisgICAg
X0FTU0VSVF9PTl9SRUxFQVNFX1JFVFVSTih0ZW1wLCAiQ291bGQgbm90IGNyZWF0ZSBFZGplIG9i
amVjdC4iKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRm9ybVR5cGVMYXN0OyBpKysp
IHsKKyAgICAgICAgRm9ybVR5cGUgdHlwZSA9IHN0YXRpY19jYXN0PEZvcm1UeXBlPihpKTsKKyAg
ICAgICAgbV9wYXJ0RGVzY3NbaV0udHlwZSA9IHR5cGU7CisgICAgICAgIGlmICghc2V0U291cmNl
R3JvdXBGb3JFZGplT2JqZWN0KHRlbXAuZ2V0KCksIHRoZW1lUGF0aCwgdG9FZGplR3JvdXAodHlw
ZSkpKQorICAgICAgICAgICAgYXBwbHlQYXJ0RGVzY3JpcHRpb25GYWxsYmFjayhtX3BhcnREZXNj
cyArIGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcHBseVBhcnREZXNjcmlwdGlvbih0
ZW1wLmdldCgpLCBtX3BhcnREZXNjcyArIGkpOworICAgIH0KK30KKworUmVuZGVyVGhlbWVFZmw6
OlJlbmRlclRoZW1lRWZsKFBhZ2UqIHBhZ2UpCisgICAgOiBSZW5kZXJUaGVtZSgpCisgICAgLCBt
X3BhZ2UocGFnZSkKKyAgICAsIG1fYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKDAsIDAs
IDI1NSkKKyAgICAsIG1fYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKENvbG9yOjp3aGl0
ZSkKKyAgICAsIG1faW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoMCwgMCwgMTI4KQor
ICAgICwgbV9pbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigyMDAsIDIwMCwgMjAwKQor
ICAgICwgbV9mb2N1c1JpbmdDb2xvcigzMiwgMzIsIDIyNCwgMjI0KQorICAgICwgbV9zbGlkZXJU
aHVtYkNvbG9yKENvbG9yOjpkYXJrR3JheSkKKyAgICAsIG1fc3VwcG9ydHNTZWxlY3Rpb25Gb3Jl
Z3JvdW5kQ29sb3IoZmFsc2UpCit7Cit9CisKK1JlbmRlclRoZW1lRWZsOjp+UmVuZGVyVGhlbWVF
ZmwoKQoreworICAgIGNsZWFyVGhlbWVQYXJ0Q2FjaGUoKTsKK30KKworc3RhdGljIGJvb2wgc3Vw
cG9ydHNGb2N1cyhDb250cm9sUGFydCBhcHBlYXJhbmNlKQoreworICAgIHN3aXRjaCAoYXBwZWFy
YW5jZSkgeworICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6CisgICAgY2FzZSBCdXR0b25QYXJ0Ogor
ICAgIGNhc2UgVGV4dEZpZWxkUGFydDoKKyAgICBjYXNlIFRleHRBcmVhUGFydDoKKyAgICBjYXNl
IFNlYXJjaEZpZWxkUGFydDoKKyAgICBjYXNlIE1lbnVsaXN0UGFydDoKKyAgICBjYXNlIFJhZGlv
UGFydDoKKyAgICBjYXNlIENoZWNrYm94UGFydDoKKyAgICBjYXNlIFNsaWRlclZlcnRpY2FsUGFy
dDoKKyAgICBjYXNlIFNsaWRlckhvcml6b250YWxQYXJ0OgorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIFJl
bmRlclRoZW1lRWZsOjpzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUp
IGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRzRm9jdXMoc3R5bGUuYXBwZWFyYW5jZSgpKTsK
K30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6Y29udHJvbFN1cHBvcnRzVGludHMoY29uc3QgUmVu
ZGVyT2JqZWN0JiBvYmplY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlzRW5hYmxlZChvYmplY3Qp
OworfQorCitpbnQgUmVuZGVyVGhlbWVFZmw6OmJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVy
Qm94JiBib3gpIGNvbnN0Cit7CisgICAgaWYgKGJveC5zdHlsZSgpLmFwcGVhcmFuY2UoKSA9PSBD
aGVja2JveFBhcnQgfHwgYm94LnN0eWxlKCkuYXBwZWFyYW5jZSgpID09IFJhZGlvUGFydCkKKyAg
ICAgICAgcmV0dXJuIGJveC5tYXJnaW5Ub3AoKSArIGJveC5oZWlnaHQoKSAtIDM7CisgICAgcmV0
dXJuIFJlbmRlclRoZW1lOjpiYXNlbGluZVBvc2l0aW9uKGJveCk7Cit9CisKK0NvbG9yIFJlbmRl
clRoZW1lRWZsOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0
Cit7CisgICAgbG9hZFRoZW1lSWZOZWVkZWQoKTsKKyAgICByZXR1cm4gbV9hY3RpdmVTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3I7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lRWZsOjpwbGF0Zm9ybUlu
YWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBsb2FkVGhlbWVJ
Zk5lZWRlZCgpOworICAgIHJldHVybiBtX2luYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9y
OworfQorCitDb2xvciBSZW5kZXJUaGVtZUVmbDo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3Jl
Z3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIGxvYWRUaGVtZUlmTmVlZGVkKCk7CisgICAgcmV0
dXJuIG1fYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yOworfQorCitDb2xvciBSZW5kZXJU
aGVtZUVmbDo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0
Cit7CisgICAgbG9hZFRoZW1lSWZOZWVkZWQoKTsKKyAgICByZXR1cm4gbV9pbmFjdGl2ZVNlbGVj
dGlvbkZvcmVncm91bmRDb2xvcjsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVFZmw6OnBsYXRmb3Jt
Rm9jdXNSaW5nQ29sb3IoKSBjb25zdAoreworICAgIGxvYWRUaGVtZUlmTmVlZGVkKCk7CisgICAg
cmV0dXJuIG1fZm9jdXNSaW5nQ29sb3I7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVFZmw6OnN1cHBv
cnRzU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9ycygpIGNvbnN0Cit7CisgICAgbG9hZFRoZW1lSWZO
ZWVkZWQoKTsKKyAgICByZXR1cm4gbV9zdXBwb3J0c1NlbGVjdGlvbkZvcmVncm91bmRDb2xvcjsK
K30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRTbGlkZXJUcmFjayhjb25zdCBSZW5kZXJP
YmplY3QmIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0
KQoreworICAgIGlmIChvYmplY3Quc3R5bGUoKS5hcHBlYXJhbmNlKCkgPT0gU2xpZGVySG9yaXpv
bnRhbFBhcnQpCisgICAgICAgIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwgU2xpZGVySG9yaXpvbnRh
bCwgaW5mbywgcmVjdCk7CisgICAgZWxzZQorICAgICAgICBwYWludFRoZW1lUGFydChvYmplY3Qs
IFNsaWRlclZlcnRpY2FsLCBpbmZvLCByZWN0KTsKKworI2lmIEVOQUJMRShEQVRBTElTVF9FTEVN
RU5UKQorICAgIHBhaW50U2xpZGVyVGlja3Mob2JqZWN0LCBpbmZvLCByZWN0KTsKKyNlbmRpZgor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RTbGlk
ZXJUcmFja1N0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQq
KSBjb25zdAoreworICAgIHN0eWxlLnNldEJveFNoYWRvdyhudWxscHRyKTsKK30KKwordm9pZCBS
ZW5kZXJUaGVtZUVmbDo6YWRqdXN0U2xpZGVyVGh1bWJTdHlsZShTdHlsZVJlc29sdmVyJiBzdHls
ZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7
CisgICAgUmVuZGVyVGhlbWU6OmFkanVzdFNsaWRlclRodW1iU3R5bGUoc3R5bGVSZXNvbHZlciwg
c3R5bGUsIGVsZW1lbnQpOworICAgIHN0eWxlLnNldEJveFNoYWRvdyhudWxscHRyKTsKK30KKwor
dm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlJiBz
dHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgQ29udHJvbFBhcnQgcGFydCA9IHN0eWxlLmFw
cGVhcmFuY2UoKTsKKyAgICBpZiAocGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgewor
ICAgICAgICBzdHlsZS5zZXRXaWR0aChMZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7
CisgICAgICAgIHN0eWxlLnNldEhlaWdodChMZW5ndGgoc2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQp
KTsKKyAgICB9IGVsc2UgaWYgKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCkgewor
ICAgICAgICBzdHlsZS5zZXRXaWR0aChMZW5ndGgoc2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsK
KyAgICAgICAgc3R5bGUuc2V0SGVpZ2h0KExlbmd0aChzbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQp
KTsKKyAgICB9Cit9CisKKyNpZiBFTkFCTEUoREFUQUxJU1RfRUxFTUVOVCkKK0ludFNpemUgUmVu
ZGVyVGhlbWVFZmw6OnNsaWRlclRpY2tTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50U2l6
ZSgxLCA2KTsKK30KKworaW50IFJlbmRlclRoZW1lRWZsOjpzbGlkZXJUaWNrT2Zmc2V0RnJvbVRy
YWNrQ2VudGVyKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHNsaWRlclRpY2tPZmZz
ZXQgPSAtMTI7CisKKyAgICByZXR1cm4gc2xpZGVyVGlja09mZnNldDsKK30KKworTGF5b3V0VW5p
dCBSZW5kZXJUaGVtZUVmbDo6c2xpZGVyVGlja1NuYXBwaW5nVGhyZXNob2xkKCkgY29uc3QKK3sK
KyAgICAvLyBUaGUgc2FtZSB0aHJlc2hvbGQgdmFsdWUgYXMgdGhlIENocm9taXVtIHBvcnQuCisg
ICAgcmV0dXJuIDU7Cit9CisjZW5kaWYKKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6c3VwcG9ydHNE
YXRhTGlzdFVJKGNvbnN0IEF0b21pY1N0cmluZyYgdHlwZSkgY29uc3QKK3sKKyNpZiBFTkFCTEUo
REFUQUxJU1RfRUxFTUVOVCkKKyAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBzdXBwb3J0IG90aGVy
IHR5cGVzLgorICAgIHJldHVybiB0eXBlID09IElucHV0VHlwZU5hbWVzOjplbWFpbCgpCisgICAg
ICAgIHx8IHR5cGUgPT0gSW5wdXRUeXBlTmFtZXM6OnJhbmdlKCkKKyAgICAgICAgfHwgdHlwZSA9
PSBJbnB1dFR5cGVOYW1lczo6c2VhcmNoKCkKKyAgICAgICAgfHwgdHlwZSA9PSBJbnB1dFR5cGVO
YW1lczo6dXJsKCk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTSh0eXBlKTsKKyAgICByZXR1cm4g
ZmFsc2U7CisjZW5kaWYKK30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRTbGlkZXJUaHVt
Yihjb25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25z
dCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChvYmplY3Quc3R5bGUoKS5hcHBlYXJhbmNlKCkg
PT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCkKKyAgICAgICAgcGFpbnRUaGVtZVBhcnQob2Jq
ZWN0LCBTbGlkZXJUaHVtYkhvcml6b250YWwsIGluZm8sIHJlY3QpOworICAgIGVsc2UKKyAgICAg
ICAgcGFpbnRUaGVtZVBhcnQob2JqZWN0LCBTbGlkZXJUaHVtYlZlcnRpY2FsLCBpbmZvLCByZWN0
KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0
Q2hlY2tib3hTdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYg
c3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgaWYgKCFtX3BhZ2UgJiYgZWxl
bWVudCAmJiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgeworICAgICAgICBzdGF0aWNfY2Fz
dDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5h
ZGp1c3RDaGVja2JveFN0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGFkanVzdFNpemVDb25zdHJhaW50cyhzdHlsZSwgQ2hl
Y2tCb3gpOworCisgICAgc3R5bGUucmVzZXRCb3JkZXIoKTsKKworICAgIGNvbnN0IFRoZW1lUGFy
dERlc2MqIGRlc2MgPSBtX3BhcnREZXNjcyArIChzaXplX3QpQ2hlY2tCb3g7CisgICAgaWYgKHN0
eWxlLndpZHRoKCkudmFsdWUoKSA8IGRlc2MtPm1pbi53aWR0aCgpLnZhbHVlKCkpCisgICAgICAg
IHN0eWxlLnNldFdpZHRoKGRlc2MtPm1pbi53aWR0aCgpKTsKKyAgICBpZiAoc3R5bGUuaGVpZ2h0
KCkudmFsdWUoKSA8IGRlc2MtPm1pbi5oZWlnaHQoKS52YWx1ZSgpKQorICAgICAgICBzdHlsZS5z
ZXRIZWlnaHQoZGVzYy0+bWluLmhlaWdodCgpKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6
cGFpbnRDaGVja2JveChjb25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgY29uc3QgUGFpbnRJbmZv
JiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRoZW1lUGFy
dChvYmplY3QsIENoZWNrQm94LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUVm
bDo6YWRqdXN0UmFkaW9TdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJT
dHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgaWYgKCFtX3BhZ2Ug
JiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgeworICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVt
ZSgpKS5hZGp1c3RSYWRpb1N0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFkanVzdFNpemVDb25zdHJhaW50cyhzdHlsZSwg
UmFkaW9CdXR0b24pOworCisgICAgc3R5bGUucmVzZXRCb3JkZXIoKTsKKworICAgIGNvbnN0IFRo
ZW1lUGFydERlc2MqIGRlc2MgPSBtX3BhcnREZXNjcyArIChzaXplX3QpUmFkaW9CdXR0b247Cisg
ICAgaWYgKHN0eWxlLndpZHRoKCkudmFsdWUoKSA8IGRlc2MtPm1pbi53aWR0aCgpLnZhbHVlKCkp
CisgICAgICAgIHN0eWxlLnNldFdpZHRoKGRlc2MtPm1pbi53aWR0aCgpKTsKKyAgICBpZiAoc3R5
bGUuaGVpZ2h0KCkudmFsdWUoKSA8IGRlc2MtPm1pbi5oZWlnaHQoKS52YWx1ZSgpKQorICAgICAg
ICBzdHlsZS5zZXRIZWlnaHQoZGVzYy0+bWluLmhlaWdodCgpKTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZUVmbDo6cGFpbnRSYWRpbyhjb25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgY29uc3QgUGFp
bnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRo
ZW1lUGFydChvYmplY3QsIFJhZGlvQnV0dG9uLCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5k
ZXJUaGVtZUVmbDo6YWRqdXN0QnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZl
ciwgUmVuZGVyU3R5bGUmIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGlm
ICghbV9wYWdlICYmIGVsZW1lbnQgJiYgZWxlbWVudC0+ZG9jdW1lbnQoKS5wYWdlKCkpIHsKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGhlbWVFZmwmPihlbGVtZW50LT5kb2N1bWVudCgpLnBh
Z2UoKS0+dGhlbWUoKSkuYWRqdXN0QnV0dG9uU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVs
ZW1lbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gYWRqdXN0U2l6ZUNvbnN0
cmFpbnMgY2FuIG1ha2UgU3F1YXJlQnV0dG9uUGFydCdzIHNpemUgd3JvbmcgKGJ5IGFkanVzdGlu
ZyBwYWRkaW5ncyksIHNvIGNhbGwgaXQgb25seSBmb3IgUHVzaEJ1dHRvblBhcnQgYW5kIEJ1dHRv
blBhcnQKKyAgICBpZiAoc3R5bGUuYXBwZWFyYW5jZSgpID09IFB1c2hCdXR0b25QYXJ0IHx8IHN0
eWxlLmFwcGVhcmFuY2UoKSA9PSBCdXR0b25QYXJ0KQorICAgICAgICBhZGp1c3RTaXplQ29uc3Ry
YWludHMoc3R5bGUsIEJ1dHRvbik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVFZmw6OnBhaW50QnV0
dG9uKGNvbnN0IFJlbmRlck9iamVjdCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNv
bnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwg
QnV0dG9uLCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0TWVu
dUxpc3RTdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5
bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVu
dCAmJiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgeworICAgICAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1
c3RNZW51TGlzdFN0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBhZGp1c3RTaXplQ29uc3RyYWludHMoc3R5bGUsIENvbWJvQm94
KTsKKyAgICBzdHlsZS5yZXNldEJvcmRlcigpOworICAgIHN0eWxlLnNldFdoaXRlU3BhY2UoUFJF
KTsKKworICAgIHN0eWxlLnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVp
Z2h0KCkpOworfQorCitib29sIFJlbmRlclRoZW1lRWZsOjpwYWludE1lbnVMaXN0KGNvbnN0IFJl
bmRlck9iamVjdCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRUaGVtZVBhcnQob2JqZWN0LCBDb21ib0JveCwg
aW5mbywgSW50UmVjdChyZWN0KSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVFZmw6OmFkanVzdE1l
bnVMaXN0QnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYgc3R5bGVSZXNvbHZlciwgUmVuZGVyU3R5
bGUmIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIC8vIEhlaWdodCBpcyBs
b2NrZWQgdG8gYXV0byBpZiBoZWlnaHQgaXMgbm90IHNwZWNpZmllZC4KKyAgICBzdHlsZS5zZXRI
ZWlnaHQoTGVuZ3RoKEF1dG8pKTsKKworICAgIC8vIFRoZSA8c2VsZWN0PiBib3ggbXVzdCBiZSBh
dCBsZWFzdCAxMnB4IGhpZ2ggZm9yIHRoZSBidXR0b24gdG8gcmVuZGVyIHRoZSB0ZXh0IGluc2lk
ZSB0aGUgYm94IHdpdGhvdXQgY2xpcHBpbmcuCisgICAgY29uc3QgaW50IGRyb3BEb3duQm94TWlu
SGVpZ2h0ID0gMTI7CisKKyAgICAvLyBDYWxjdWxhdGUgbWluLWhlaWdodCBvZiB0aGUgPHNlbGVj
dD4gZWxlbWVudC4KKyAgICBpbnQgbWluSGVpZ2h0ID0gc3R5bGUuZm9udE1ldHJpY3MoKS5oZWln
aHQoKTsKKyAgICBtaW5IZWlnaHQgPSBzdGQ6Om1heChtaW5IZWlnaHQsIGRyb3BEb3duQm94TWlu
SGVpZ2h0KTsKKyAgICBzdHlsZS5zZXRNaW5IZWlnaHQoTGVuZ3RoKG1pbkhlaWdodCwgRml4ZWQp
KTsKKworICAgIGFkanVzdE1lbnVMaXN0U3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVsZW1l
bnQpOworfQorCitib29sIFJlbmRlclRoZW1lRWZsOjpwYWludE1lbnVMaXN0QnV0dG9uRGVjb3Jh
dGlvbnMoY29uc3QgUmVuZGVyQm94JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29u
c3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludE1lbnVMaXN0KG9iamVjdCwg
aW5mbywgcmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVFZmw6OmFkanVzdFRleHRGaWVsZFN0
eWxlKFN0eWxlUmVzb2x2ZXImIHN0eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlJiBzdHlsZSwgRWxl
bWVudCogZWxlbWVudCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcGFnZSAmJiBlbGVtZW50ICYmIGVs
ZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpKSB7CisgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRo
ZW1lRWZsJj4oZWxlbWVudC0+ZG9jdW1lbnQoKS5wYWdlKCktPnRoZW1lKCkpLmFkanVzdFRleHRG
aWVsZFN0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICBhZGp1c3RTaXplQ29uc3RyYWludHMoc3R5bGUsIFRleHRGaWVsZCk7Cisg
ICAgc3R5bGUucmVzZXRCb3JkZXIoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRU
ZXh0RmllbGQoY29uc3QgUmVuZGVyT2JqZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5m
bywgY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRoZW1lUGFydChv
YmplY3QsIFRleHRGaWVsZCwgaW5mbywgSW50UmVjdChyZWN0KSk7Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVFZmw6OmFkanVzdFRleHRBcmVhU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxl
JiwgRWxlbWVudCopIGNvbnN0Cit7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVFZmw6OnBhaW50VGV4
dEFyZWEoY29uc3QgUmVuZGVyT2JqZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywg
Y29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRleHRGaWVsZChvYmpl
Y3QsIGluZm8sIHJlY3QpOworfQorCit2b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1c3RTZWFyY2hG
aWVsZFJlc3VsdHNCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVyLCBSZW5k
ZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgaWYgKCFtX3Bh
Z2UgJiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgeworICAgICAgICBz
dGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpLT50
aGVtZSgpKS5hZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25TdHlsZShzdHlsZVJlc29sdmVy
LCBzdHlsZSwgZWxlbWVudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYWRqdXN0U2l6
ZUNvbnN0cmFpbnRzKHN0eWxlLCBTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24pOworICAgIHN0eWxl
LnJlc2V0Qm9yZGVyKCk7CisgICAgc3R5bGUuc2V0V2hpdGVTcGFjZShQUkUpOworCisgICAgZmxv
YXQgZm9udFNjYWxlID0gc3R5bGUuZm9udFNpemUoKSAvIGRlZmF1bHRGb250U2l6ZTsKKyAgICBp
bnQgZGVjb3JhdGlvblNpemUgPSBscm91bmRmKHN0ZDo6bWluKHN0ZDo6bWF4KG1pblNlYXJjaERl
Y29yYXRpb25CdXR0b25TaXplLCBkZWZhdWx0Rm9udFNpemUgKiBmb250U2NhbGUpLCBtYXhTZWFy
Y2hEZWNvcmF0aW9uQnV0dG9uU2l6ZSkpOworCisgICAgc3R5bGUuc2V0V2lkdGgoTGVuZ3RoKGRl
Y29yYXRpb25TaXplICsgc2VhcmNoRmllbGREZWNvcmF0aW9uQnV0dG9uT2Zmc2V0LCBGaXhlZCkp
OworICAgIHN0eWxlLnNldEhlaWdodChMZW5ndGgoZGVjb3JhdGlvblNpemUsIEZpeGVkKSk7Cit9
CisKK2Jvb2wgUmVuZGVyVGhlbWVFZmw6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKGNv
bnN0IFJlbmRlck9iamVjdCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwgU2VhcmNo
RmllbGRSZXN1bHRzQnV0dG9uLCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUVm
bDo6YWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblBhcnRTdHlsZShTdHlsZVJlc29s
dmVyJiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQp
IGNvbnN0Cit7CisgICAgaWYgKCFtX3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1bWVu
dCgpLnBhZ2UoKSkgeworICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1l
bnQtPmRvY3VtZW50KCkucGFnZSgpLT50aGVtZSgpKS5hZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNE
ZWNvcmF0aW9uUGFydFN0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBhZGp1c3RTaXplQ29uc3RyYWludHMoc3R5bGUsIFNlYXJj
aEZpZWxkUmVzdWx0c0RlY29yYXRpb24pOworICAgIHN0eWxlLnJlc2V0Qm9yZGVyKCk7CisgICAg
c3R5bGUuc2V0V2hpdGVTcGFjZShQUkUpOworCisgICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUu
Zm9udFNpemUoKSAvIGRlZmF1bHRGb250U2l6ZTsKKyAgICBpbnQgZGVjb3JhdGlvblNpemUgPSBs
cm91bmRmKHN0ZDo6bWluKHN0ZDo6bWF4KG1pblNlYXJjaERlY29yYXRpb25CdXR0b25TaXplLCBk
ZWZhdWx0Rm9udFNpemUgKiBmb250U2NhbGUpLCBtYXhTZWFyY2hEZWNvcmF0aW9uQnV0dG9uU2l6
ZSkpOworCisgICAgc3R5bGUuc2V0V2lkdGgoTGVuZ3RoKGRlY29yYXRpb25TaXplICsgc2VhcmNo
RmllbGREZWNvcmF0aW9uQnV0dG9uT2Zmc2V0LCBGaXhlZCkpOworICAgIHN0eWxlLnNldEhlaWdo
dChMZW5ndGgoZGVjb3JhdGlvblNpemUsIEZpeGVkKSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVF
Zmw6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblBhcnQoY29uc3QgUmVuZGVyT2Jq
ZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICByZXR1cm4gcGFpbnRUaGVtZVBhcnQob2JqZWN0LCBTZWFyY2hGaWVsZFJlc3VsdHNE
ZWNvcmF0aW9uLCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUVmbDo6YWRqdXN0
U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVy
LCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgaWYg
KCFtX3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgeworICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFn
ZSgpLT50aGVtZSgpKS5hZGp1c3RTZWFyY2hGaWVsZENhbmNlbEJ1dHRvblN0eWxlKHN0eWxlUmVz
b2x2ZXIsIHN0eWxlLCBlbGVtZW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhZGp1
c3RTaXplQ29uc3RyYWludHMoc3R5bGUsIFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKTsKKyAgICBz
dHlsZS5yZXNldEJvcmRlcigpOworICAgIHN0eWxlLnNldFdoaXRlU3BhY2UoUFJFKTsKKworICAg
IC8vIExvZ2ljIHRha2VuIGZyb20gUmVuZGVyVGhlbWVDaHJvbWl1bS5jcHAuCisgICAgLy8gU2Nh
bGUgdGhlIGJ1dHRvbiBzaXplIGJhc2VkIG9uIHRoZSBmb250IHNpemUuCisgICAgZmxvYXQgZm9u
dFNjYWxlID0gc3R5bGUuZm9udFNpemUoKSAvIGRlZmF1bHRGb250U2l6ZTsKKyAgICBpbnQgY2Fu
Y2VsQnV0dG9uU2l6ZSA9IGxyb3VuZGYoc3RkOjptaW4oc3RkOjptYXgobWluQ2FuY2VsQnV0dG9u
U2l6ZSwgZGVmYXVsdEZvbnRTaXplICogZm9udFNjYWxlKSwgbWF4Q2FuY2VsQnV0dG9uU2l6ZSkp
OworCisgICAgc3R5bGUuc2V0V2lkdGgoTGVuZ3RoKGNhbmNlbEJ1dHRvblNpemUsIEZpeGVkKSk7
CisgICAgc3R5bGUuc2V0SGVpZ2h0KExlbmd0aChjYW5jZWxCdXR0b25TaXplLCBGaXhlZCkpOwor
fQorCitib29sIFJlbmRlclRoZW1lRWZsOjpwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKGNv
bnN0IFJlbmRlck9iamVjdCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9iamVjdCwgU2VhcmNo
RmllbGRDYW5jZWxCdXR0b24sIGluZm8sIHJlY3QpOworfQorCit2b2lkIFJlbmRlclRoZW1lRWZs
OjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXImIHN0eWxlUmVzb2x2ZXIsIFJl
bmRlclN0eWxlJiBzdHlsZSwgRWxlbWVudCogZWxlbWVudCkgY29uc3QKK3sKKyAgICBpZiAoIW1f
cGFnZSAmJiBlbGVtZW50ICYmIGVsZW1lbnQtPmRvY3VtZW50KCkucGFnZSgpKSB7CisgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlclRoZW1lRWZsJj4oZWxlbWVudC0+ZG9jdW1lbnQoKS5wYWdlKCkt
PnRoZW1lKCkpLmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUsIGVs
ZW1lbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFkanVzdFNpemVDb25zdHJhaW50
cyhzdHlsZSwgU2VhcmNoRmllbGQpOworICAgIHN0eWxlLnJlc2V0Qm9yZGVyKCk7CisgICAgc3R5
bGUuc2V0V2hpdGVTcGFjZShQUkUpOworfQorCitib29sIFJlbmRlclRoZW1lRWZsOjpwYWludFNl
YXJjaEZpZWxkKGNvbnN0IFJlbmRlck9iamVjdCYgb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGlu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50VGhlbWVQYXJ0KG9i
amVjdCwgU2VhcmNoRmllbGQsIGluZm8sIHJlY3QpOworfQorCit2b2lkIFJlbmRlclRoZW1lRWZs
OjphZGp1c3RJbm5lclNwaW5CdXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiBzdHlsZVJlc29sdmVy
LCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgaWYg
KCFtX3BhZ2UgJiYgZWxlbWVudCAmJiBlbGVtZW50LT5kb2N1bWVudCgpLnBhZ2UoKSkgeworICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUVmbCY+KGVsZW1lbnQtPmRvY3VtZW50KCkucGFn
ZSgpLT50aGVtZSgpKS5hZGp1c3RJbm5lclNwaW5CdXR0b25TdHlsZShzdHlsZVJlc29sdmVyLCBz
dHlsZSwgZWxlbWVudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYWRqdXN0U2l6ZUNv
bnN0cmFpbnRzKHN0eWxlLCBTcGlubmVyKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFp
bnRJbm5lclNwaW5CdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiBvYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRUaGVt
ZVBhcnQob2JqZWN0LCBTcGlubmVyLCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVt
ZUVmbDo6c2V0RGVmYXVsdEZvbnRTaXplKGludCBzaXplKQoreworICAgIGRlZmF1bHRGb250U2l6
ZSA9IHNpemU7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVFZmw6OnVwZGF0ZUNhY2hlZFN5c3RlbUZv
bnREZXNjcmlwdGlvbihDU1NWYWx1ZUlELCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlv
bikgY29uc3QKK3sKKyAgICAvLyBJdCB3YXMgY2FsbGVkIGJ5IFJlbmRlckVtYmVkZGVkT2JqZWN0
OjpwYWludFJlcGxhY2VkIHRvIHJlbmRlciBhbHRlcm5hdGl2ZSBzdHJpbmcuCisgICAgLy8gVG8g
YXZvaWQgY2Fpcm9fZXJyb3Igd2hpbGUgcmVuZGVyaW5nLCBmb250RGVzY3JpcHRpb24gc2hvdWxk
IGJlIHBhc3NlZC4KKyAgICBmb250RGVzY3JpcHRpb24uc2V0T25lRmFtaWx5KCJTYW5zIik7Cisg
ICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoZGVmYXVsdEZvbnRTaXplKTsKKyAg
ICBmb250RGVzY3JpcHRpb24uc2V0SXNBYnNvbHV0ZVNpemUodHJ1ZSk7CisgICAgZm9udERlc2Ny
aXB0aW9uLnNldFdlaWdodChGb250V2VpZ2h0Tm9ybWFsKTsKKyAgICBmb250RGVzY3JpcHRpb24u
c2V0SXRhbGljKEZvbnRJdGFsaWNPZmYpOworfQorCit2b2lkIFJlbmRlclRoZW1lRWZsOjphZGp1
c3RQcm9ncmVzc0JhclN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYgc3R5bGUsIEVs
ZW1lbnQqKSBjb25zdAoreworICAgIHN0eWxlLnNldEJveFNoYWRvdyhudWxscHRyKTsKK30KKwor
ZG91YmxlIFJlbmRlclRoZW1lRWZsOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNz
QmFyKFJlbmRlclByb2dyZXNzJikgY29uc3QKK3sKKyAgICByZXR1cm4gcHJvZ3Jlc3NBbmltYXRp
b25JbnRlcnZhbDsKK30KKworZG91YmxlIFJlbmRlclRoZW1lRWZsOjphbmltYXRpb25EdXJhdGlv
bkZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzJikgY29uc3QKK3sKKyAgICByZXR1cm4gcHJv
Z3Jlc3NBbmltYXRpb25JbnRlcnZhbCAqIHByb2dyZXNzQW5pbWF0aW9uRnJhbWVzICogMjsgLy8g
IjIiIGZvciBiYWNrIGFuZCBmb3J0aDsKK30KKworYm9vbCBSZW5kZXJUaGVtZUVmbDo6cGFpbnRQ
cm9ncmVzc0Jhcihjb25zdCBSZW5kZXJPYmplY3QmIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBp
bmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghb2JqZWN0LmlzUHJvZ3Jlc3Mo
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gcGFpbnRUaGVtZVBhcnQob2Jq
ZWN0LCBQcm9ncmVzc0JhciwgaW5mbywgcmVjdCk7Cit9CisKKyNpZiBFTkFCTEUoVklERU8pCitT
dHJpbmcgUmVuZGVyVGhlbWVFZmw6Om1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCkKK3sKKyAgICBy
ZXR1cm4gQVNDSUlMaXRlcmFsKG1lZGlhQ29udHJvbHNCYXNlVXNlckFnZW50U3R5bGVTaGVldCk7
Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUVmbDo6bWVkaWFDb250cm9sc1NjcmlwdCgpCit7Cisg
ICAgU3RyaW5nQnVpbGRlciBzY3JpcHRCdWlsZGVyOworICAgIHNjcmlwdEJ1aWxkZXIuYXBwZW5k
KG1lZGlhQ29udHJvbHNMb2NhbGl6ZWRTdHJpbmdzSmF2YVNjcmlwdCwgc2l6ZW9mKG1lZGlhQ29u
dHJvbHNMb2NhbGl6ZWRTdHJpbmdzSmF2YVNjcmlwdCkpOworICAgIHNjcmlwdEJ1aWxkZXIuYXBw
ZW5kKG1lZGlhQ29udHJvbHNCYXNlSmF2YVNjcmlwdCwgc2l6ZW9mKG1lZGlhQ29udHJvbHNCYXNl
SmF2YVNjcmlwdCkpOworICAgIHJldHVybiBzY3JpcHRCdWlsZGVyLnRvU3RyaW5nKCk7Cit9Cisj
ZW5kaWYKKworI3VuZGVmIF9BU1NFUlRfT05fUkVMRUFTRV9SRVRVUk4KKyN1bmRlZiBfQVNTRVJU
X09OX1JFTEVBU0VfUkVUVVJOX1ZBTAorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyVGhlbWVFZmwuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJUaGVtZUVmbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmM5MzdlNzc1MjM1YmY0NmQxNWI0YTQ4Y2IyYWM2MTYy
M2UyNzU1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyVGhlbWVFZmwuaApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0
IG9mIHRoZSBXZWJLaXQgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUg
SW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgRW1tZWwgbWlrZS5lbW1lbEBnbWFp
bC5jb20KKyAqIENvcHlyaWdodCAoQykgMjAwNyBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgor
ICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMDggSU5kVCAtIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDktMjAxMCBQcm9GVVNJT04gZW1iZWRkZWQgc3lzdGVtcworICogQ29w
eXJpZ2h0IChDKSAyMDA5LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKgorICovCisKKyNpZm5kZWYgUmVuZGVyVGhlbWVFZmxfaAorI2RlZmluZSBSZW5kZXJUaGVt
ZUVmbF9oCisKKyNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgorCisjaW5jbHVkZSA8RWluYS5oPgor
I2luY2x1ZGUgPGNhaXJvLmg+CisjaW5jbHVkZSA8d3RmL2VmbC9VbmlxdWVQdHJFZmwuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIEZvcm1UeXBlIHsgLy8gS0VFUCBJTiBTWU5DIFdJ
VEggZWRqZUdyb3VwRnJvbUZvcm1UeXBlKCkKKyAgICBCdXR0b24sCisgICAgUmFkaW9CdXR0b24s
CisgICAgVGV4dEZpZWxkLAorICAgIENoZWNrQm94LAorICAgIENvbWJvQm94LAorICAgIFByb2dy
ZXNzQmFyLAorICAgIFNjcm9sbGJhckhvcml6b250YWxUaHVtYiwKKyAgICBTY3JvbGxiYXJIb3Jp
em9udGFsVHJhY2tCYWNrZ3JvdW5kLAorICAgIFNjcm9sbGJhclZlcnRpY2FsVGh1bWIsCisgICAg
U2Nyb2xsYmFyVmVydGljYWxUcmFja0JhY2tncm91bmQsCisgICAgU2VhcmNoRmllbGQsCisgICAg
U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uLAorICAgIFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRp
b24sCisgICAgU2VhcmNoRmllbGRDYW5jZWxCdXR0b24sCisgICAgU2xpZGVyVmVydGljYWwsCisg
ICAgU2xpZGVySG9yaXpvbnRhbCwKKyAgICBTbGlkZXJUaHVtYlZlcnRpY2FsLAorICAgIFNsaWRl
clRodW1iSG9yaXpvbnRhbCwKKyAgICBTcGlubmVyLAorICAgIEZvcm1UeXBlTGFzdAorfTsKKwor
Y2xhc3MgUmVuZGVyVGhlbWVFZmwgZmluYWwgOiBwdWJsaWMgUmVuZGVyVGhlbWUgeworcHJpdmF0
ZToKKyAgICBleHBsaWNpdCBSZW5kZXJUaGVtZUVmbChQYWdlKik7CisgICAgdmlydHVhbCB+UmVu
ZGVyVGhlbWVFZmwoKTsKKworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRo
ZW1lPiBjcmVhdGUoUGFnZSopOworCisgICAgLy8gQSBtZXRob2QgYXNraW5nIGlmIHRoZSB0aGVt
ZSdzIGNvbnRyb2xzIGFjdHVhbGx5IGNhcmUgYWJvdXQgcmVkcmF3aW5nIHdoZW4gaG92ZXJlZC4K
KyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNIb3Zlcihjb25zdCBSZW5kZXJTdHlsZSYpIGNvbnN0
IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vIEEgbWV0aG9kIFJldHVybmluZyB3
aGV0aGVyIHRoZSBjb250cm9sIGlzIHN0eWxlZCBieSBjc3Mgb3Igbm90IGUuZyBzcGVjaWZ5aW5n
IGJhY2tncm91bmQtY29sb3IuCisgICAgdmlydHVhbCBib29sIGlzQ29udHJvbFN0eWxlZChjb25z
dCBSZW5kZXJTdHlsZSYsIGNvbnN0IEJvcmRlckRhdGEmLCBjb25zdCBGaWxsTGF5ZXImLCBjb25z
dCBDb2xvciYgYmFja2dyb3VuZENvbG9yKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIEEgbWV0
aG9kIGFza2luZyBpZiB0aGUgdGhlbWUgaXMgYWJsZSB0byBkcmF3IHRoZSBmb2N1cyByaW5nLgor
ICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSYpIGNv
bnN0IG92ZXJyaWRlOworCisgICAgLy8gQSBtZXRob2QgYXNraW5nIGlmIHRoZSBjb250cm9sIGNo
YW5nZXMgaXRzIHRpbnQgd2hlbiB0aGUgd2luZG93IGhhcyBmb2N1cyBvciBub3QuCisgICAgdmly
dHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c1RpbnRzKGNvbnN0IFJlbmRlck9iamVjdCYpIGNvbnN0
IG92ZXJyaWRlOworCisgICAgLy8gQSBnZW5lcmFsIG1ldGhvZCBhc2tpbmcgaWYgYW55IGNvbnRy
b2wgdGludGluZyBpcyBzdXBwb3J0ZWQgYXQgYWxsLgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0
c0NvbnRyb2xUaW50cygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8v
IEEgZ2VuZXJhbCBtZXRob2QgYXNraW5nIGlmIGZvcmVncm91bmQgY29sb3JzIG9mIHNlbGVjdGlv
biBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c1NlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcnMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIEEgbWV0aG9kIHRvIG9idGFp
biB0aGUgYmFzZWxpbmUgcG9zaXRpb24gZm9yIGEgImxlYWYiIGNvbnRyb2wuIFRoaXMgd2lsbCBv
bmx5IGJlIHVzZWQgaWYgYSBiYXNlbGluZQorICAgIC8vIHBvc2l0aW9uIGNhbm5vdCBiZSBkZXRl
cm1pbmVkIGJ5IGV4YW1pbmluZyBjaGlsZCBjb250ZW50LiBDaGVja2JveGVzIGFuZCByYWRpbyBi
dXR0b25zIGFyZSBleGFtcGxlcyBvZgorICAgIC8vIGNvbnRyb2xzIHRoYXQgbmVlZCB0byBkbyB0
aGlzLgorICAgIHZpcnR1YWwgaW50IGJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyQm94Jikg
Y29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0
aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBDb2xvciBw
bGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Qgb3ZlcnJpZGU7
CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xv
cigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZVNl
bGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgQ29s
b3IgcGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gU2V0
IHBsYXRmb3JtIGNvbG9yczsgcmVtZW1iZXIgdG8gY2FsbCBwbGF0Zm9ybUNvbG9yRGlkQ2hhbmdl
IGFmdGVyLgorICAgIHZvaWQgc2V0Q29sb3JGcm9tVGhlbWVDbGFzcyhjb25zdCBjaGFyKiBjb2xv
ckNsYXNzKTsKKworICAgIHZvaWQgc2V0QnV0dG9uVGV4dENvbG9yKGludCBmb3JlUiwgaW50IGZv
cmVHLCBpbnQgZm9yZUIsIGludCBmb3JlQSwgaW50IGJhY2tSLCBpbnQgYmFja0csIGludCBiYWNr
QiwgaW50IGJhY2tBKTsKKyAgICB2b2lkIHNldENvbWJvVGV4dENvbG9yKGludCBmb3JlUiwgaW50
IGZvcmVHLCBpbnQgZm9yZUIsIGludCBmb3JlQSwgaW50IGJhY2tSLCBpbnQgYmFja0csIGludCBi
YWNrQiwgaW50IGJhY2tBKTsKKyAgICB2b2lkIHNldEVudHJ5VGV4dENvbG9yKGludCBmb3JlUiwg
aW50IGZvcmVHLCBpbnQgZm9yZUIsIGludCBmb3JlQSwgaW50IGJhY2tSLCBpbnQgYmFja0csIGlu
dCBiYWNrQiwgaW50IGJhY2tBKTsKKyAgICB2b2lkIHNldFNlYXJjaFRleHRDb2xvcihpbnQgZm9y
ZVIsIGludCBmb3JlRywgaW50IGZvcmVCLCBpbnQgZm9yZUEsIGludCBiYWNrUiwgaW50IGJhY2tH
LCBpbnQgYmFja0IsIGludCBiYWNrQSk7CisKKyAgICB2b2lkIGFkanVzdFNpemVDb25zdHJhaW50
cyhSZW5kZXJTdHlsZSYsIEZvcm1UeXBlKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RDaGVja2JveFN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBj
b25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDaGVja2JveChjb25zdCBSZW5k
ZXJPYmplY3QmLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jikgb3ZlcnJpZGU7CisK
KyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0UmFkaW9TdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVy
U3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHBhaW50
UmFkaW8oY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdEJ1dHRvblN0eWxlKFN0eWxl
UmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBjb25zdCBvdmVycmlkZTsKKyAgICB2
aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJ
bmZvJiwgY29uc3QgSW50UmVjdCYpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIGFkanVz
dFRleHRGaWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBj
b25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoY29uc3QgUmVu
ZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7
CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0VGV4dEFyZWFTdHlsZShTdHlsZVJlc29sdmVyJiwg
UmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29s
IHBhaW50VGV4dEFyZWEoY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJbmZvJiwgY29u
c3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxp
c3RTdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3Zl
cnJpZGU7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3QoY29uc3QgUmVuZGVyT2JqZWN0
JiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgRmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyJiwgUmVu
ZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHBh
aW50TWVudUxpc3RCdXR0b25EZWNvcmF0aW9ucyhjb25zdCBSZW5kZXJCb3gmLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBGbG9hdFJlY3QmKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBh
ZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uUGFydFN0eWxlKFN0eWxlUmVzb2x2ZXIm
LCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uUGFydChjb25zdCBSZW5kZXJPYmpl
Y3QmLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRTdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVy
U3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHBhaW50
U2VhcmNoRmllbGQoY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxk
UmVzdWx0c0J1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQq
KSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZFJlc3Vs
dHNCdXR0b24oY29uc3QgUmVuZGVyT2JqZWN0JiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50
UmVjdCYpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkQ2Fu
Y2VsQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiwgRWxlbWVudCopIGNv
bnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0
dG9uKGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3Qm
KSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTbGlkZXJUcmFja1N0eWxlKFN0
eWxlUmVzb2x2ZXImLCBSZW5kZXJTdHlsZSYsIEVsZW1lbnQqKSBjb25zdCBvdmVycmlkZTsKKyAg
ICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUcmFjayhjb25zdCBSZW5kZXJPYmplY3QmLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZv
aWQgYWRqdXN0U2xpZGVyVGh1bWJTdHlsZShTdHlsZVJlc29sdmVyJiwgUmVuZGVyU3R5bGUmLCBF
bGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2xpZGVy
VGh1bWJTaXplKFJlbmRlclN0eWxlJiwgRWxlbWVudCopIGNvbnN0IG92ZXJyaWRlOworCisjaWYg
RU5BQkxFKERBVEFMSVNUX0VMRU1FTlQpCisgICAgdmlydHVhbCBJbnRTaXplIHNsaWRlclRpY2tT
aXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBpbnQgc2xpZGVyVGlja09mZnNldEZy
b21UcmFja0NlbnRlcigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgTGF5b3V0VW5pdCBz
bGlkZXJUaWNrU25hcHBpbmdUaHJlc2hvbGQoKSBjb25zdCBvdmVycmlkZTsKKyNlbmRpZgorCisg
ICAgdmlydHVhbCBib29sIHN1cHBvcnRzRGF0YUxpc3RVSShjb25zdCBBdG9taWNTdHJpbmcmKSBj
b25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRodW1iKGNvbnN0
IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSBvdmVycmlk
ZTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RJbm5lclNwaW5CdXR0b25TdHlsZShTdHlsZVJl
c29sdmVyJiwgUmVuZGVyU3R5bGUmLCBFbGVtZW50KikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmly
dHVhbCBib29sIHBhaW50SW5uZXJTcGluQnV0dG9uKGNvbnN0IFJlbmRlck9iamVjdCYsIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyB2b2lk
IHNldERlZmF1bHRGb250U2l6ZShpbnQgZm9udHNpemUpOworCisgICAgdmlydHVhbCB2b2lkIGFk
anVzdFByb2dyZXNzQmFyU3R5bGUoU3R5bGVSZXNvbHZlciYsIFJlbmRlclN0eWxlJiwgRWxlbWVu
dCopIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBwYWludFByb2dyZXNzQmFyKGNv
bnN0IFJlbmRlck9iamVjdCYsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSBvdmVy
cmlkZTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBhbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dy
ZXNzQmFyKFJlbmRlclByb2dyZXNzJikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBkb3Vi
bGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyYpIGNvbnN0
IG92ZXJyaWRlOworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIHZpcnR1YWwgU3RyaW5nIG1lZGlh
Q29udHJvbHNTdHlsZVNoZWV0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBTdHJpbmcgbWVkaWFD
b250cm9sc1NjcmlwdCgpIG92ZXJyaWRlOworI2VuZGlmCisjaWYgRU5BQkxFKFZJREVPX1RSQUNL
KQorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Nsb3NlZENhcHRpb25pbmcoKSBjb25zdCBvdmVy
cmlkZSB7IHJldHVybiB0cnVlOyB9CisjZW5kaWYKKworICAgIHZvaWQgc2V0VGhlbWVQYXRoKGNv
bnN0IFN0cmluZyYpOworICAgIFN0cmluZyB0aGVtZVBhdGgoKSBjb25zdDsKKworICAgIGJvb2wg
cGFpbnRUaGVtZVBhcnQoY29uc3QgR3JhcGhpY3NDb250ZXh0JiwgRm9ybVR5cGUsIGNvbnN0IElu
dFJlY3QmKTsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyBmbG9hdCBkZWZhdWx0Rm9udFNpemU7
CisKK3ByaXZhdGU6CisgICAgYm9vbCBsb2FkVGhlbWUoKTsKKyAgICBBTFdBWVNfSU5MSU5FIGJv
b2wgbG9hZFRoZW1lSWZOZWVkZWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZWRq
ZSB8fCAoIW1fdGhlbWVQYXRoLmlzRW1wdHkoKSAmJiBjb25zdF9jYXN0PFJlbmRlclRoZW1lRWZs
Kj4odGhpcyktPmxvYWRUaGVtZSgpKTsKKyAgICB9CisKKyAgICAvLyBTeXN0ZW0gZm9udHMuCisg
ICAgdmlydHVhbCB2b2lkIHVwZGF0ZUNhY2hlZFN5c3RlbUZvbnREZXNjcmlwdGlvbihDU1NWYWx1
ZUlELCBGb250RGVzY3JpcHRpb24mKSBjb25zdCBvdmVycmlkZTsKKworICAgIEFMV0FZU19JTkxJ
TkUgRWNvcmVfRXZhcyogY2FudmFzKCkgY29uc3QgeyByZXR1cm4gbV9jYW52YXMuZ2V0KCk7IH0K
KyAgICBBTFdBWVNfSU5MSU5FIEV2YXNfT2JqZWN0KiBlZGplKCkgY29uc3QgeyByZXR1cm4gbV9l
ZGplLmdldCgpOyB9CisKKyAgICB2b2lkIGFwcGx5UGFydERlc2NyaXB0aW9uc0Zyb20oY29uc3Qg
U3RyaW5nJiB0aGVtZVBhdGgpOworCisgICAgdm9pZCBhcHBseUVkamVTdGF0ZUZyb21Gb3JtKEV2
YXNfT2JqZWN0KiwgY29uc3QgQ29udHJvbFN0YXRlcyosIGJvb2wpOworICAgIHZvaWQgYXBwbHlF
ZGplUlRMU3RhdGUoRXZhc19PYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3QmLCBGb3JtVHlwZSwg
Y29uc3QgSW50UmVjdCYpOworICAgIGJvb2wgcGFpbnRUaGVtZVBhcnQoY29uc3QgUmVuZGVyT2Jq
ZWN0JiwgRm9ybVR5cGUsIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAg
IFBhZ2UqIG1fcGFnZTsKKyAgICBDb2xvciBtX2FjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xv
cjsKKyAgICBDb2xvciBtX2FjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcjsKKyAgICBDb2xv
ciBtX2luYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yOworICAgIENvbG9yIG1faW5hY3Rp
dmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I7CisgICAgQ29sb3IgbV9mb2N1c1JpbmdDb2xvcjsK
KyAgICBDb2xvciBtX3NsaWRlclRodW1iQ29sb3I7CisKKyAgICBTdHJpbmcgbV90aGVtZVBhdGg7
CisgICAgLy8gT3JkZXIgc28gdGhhdCB0aGUgY2FudmFzIGdldHMgZGVzdHJveWVkIGF0IGxhc3Qu
CisgICAgRWZsVW5pcXVlUHRyPEVjb3JlX0V2YXM+IG1fY2FudmFzOworICAgIEVmbFVuaXF1ZVB0
cjxFdmFzX09iamVjdD4gbV9lZGplOworCisgICAgYm9vbCBtX3N1cHBvcnRzU2VsZWN0aW9uRm9y
ZWdyb3VuZENvbG9yOworCisgICAgc3RydWN0IFRoZW1lUGFydERlc2MgeworICAgICAgICBGb3Jt
VHlwZSB0eXBlOworICAgICAgICBMZW5ndGhTaXplIG1pbjsKKyAgICAgICAgTGVuZ3RoU2l6ZSBt
YXg7CisgICAgICAgIExlbmd0aEJveCBwYWRkaW5nOworICAgIH07CisgICAgdm9pZCBhcHBseVBh
cnREZXNjcmlwdGlvbkZhbGxiYWNrKHN0cnVjdCBUaGVtZVBhcnREZXNjKik7CisgICAgdm9pZCBh
cHBseVBhcnREZXNjcmlwdGlvbihFdmFzX09iamVjdCosIHN0cnVjdCBUaGVtZVBhcnREZXNjKik7
CisKKyAgICBzdHJ1Y3QgVGhlbWVQYXJ0Q2FjaGVFbnRyeSB7CisgICAgICAgIHN0YXRpYyBzdGQ6
OnVuaXF1ZV9wdHI8UmVuZGVyVGhlbWVFZmw6OlRoZW1lUGFydENhY2hlRW50cnk+IGNyZWF0ZShj
b25zdCBTdHJpbmcmIHRoZW1lUGF0aCwgRm9ybVR5cGUsIGNvbnN0IEludFNpemUmKTsKKyAgICAg
ICAgdm9pZCByZXVzZShjb25zdCBTdHJpbmcmIHRoZW1lUGF0aCwgRm9ybVR5cGUsIGNvbnN0IElu
dFNpemUmKTsKKworICAgICAgICBBTFdBWVNfSU5MSU5FIEVjb3JlX0V2YXMqIGNhbnZhcygpIHsg
cmV0dXJuIG1fY2FudmFzLmdldCgpOyB9CisgICAgICAgIEFMV0FZU19JTkxJTkUgRXZhc19PYmpl
Y3QqIGVkamUoKSB7IHJldHVybiBtX2VkamUuZ2V0KCk7IH0KKyAgICAgICAgQUxXQVlTX0lOTElO
RSBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UoKSB7IHJldHVybiBtX3N1cmZhY2UuZ2V0KCk7IH0K
KworICAgICAgICBGb3JtVHlwZSB0eXBlOworICAgICAgICBJbnRTaXplIHNpemU7CisKKyAgICBw
cml2YXRlOgorICAgICAgICAvLyBPcmRlciBzbyB0aGF0IHRoZSBjYW52YXMgZ2V0cyBkZXN0cm95
ZWQgYXQgbGFzdC4KKyAgICAgICAgRWZsVW5pcXVlUHRyPEVjb3JlX0V2YXM+IG1fY2FudmFzOwor
ICAgICAgICBFZmxVbmlxdWVQdHI8RXZhc19PYmplY3Q+IG1fZWRqZTsKKyAgICAgICAgUmVmUHRy
PGNhaXJvX3N1cmZhY2VfdD4gbV9zdXJmYWNlOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGhlbWVQ
YXJ0RGVzYyBtX3BhcnREZXNjc1tGb3JtVHlwZUxhc3RdOworCisgICAgLy8gTGlzdCBvZiBUaGVt
ZVBhcnRDYWNoZUVudHJ5KiBzb3J0ZWQgc28gdGhhdCB0aGUgbW9zdCByZWNlbnRseQorICAgIC8v
IHVzZWQgZW50cmllcyBjb21lIGZpcnN0LiBXZSB1c2UgYSBsaXN0IGZvciBlZmZpY2llbnQgbW92
aW5nCisgICAgLy8gb2YgaXRlbXMgd2l0aGluIHRoZSBjb250YWluZXIuCisgICAgVmVjdG9yPHN0
ZDo6dW5pcXVlX3B0cjxUaGVtZVBhcnRDYWNoZUVudHJ5Pj4gbV9wYXJ0Q2FjaGU7CisKKyAgICBU
aGVtZVBhcnRDYWNoZUVudHJ5KiBnZXRUaGVtZVBhcnRGcm9tQ2FjaGUoRm9ybVR5cGUsIGNvbnN0
IEludFNpemUmKTsKKyAgICB2b2lkIGNsZWFyVGhlbWVQYXJ0Q2FjaGUoKTsKK307Cit9CisKKyNl
bmRpZiAvLyBSZW5kZXJUaGVtZUVmbF9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>