<?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>51755</bug_id>
          
          <creation_ts>2010-12-30 10:11:24 -0800</creation_ts>
          <short_desc>[GTK] Fork pieces of RenderThemeGtk that will differ for GTK+ 3</short_desc>
          <delta_ts>2010-12-30 17:06:10 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk</keywords>
          <priority>P3</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>50820</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Martin Robinson">mrobinson</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>327953</commentid>
    <comment_count>0</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-12-30 10:11:24 -0800</bug_when>
    <thetext>The first step to landing the new GTK+ style context port of RenderThemeGtk is to split out the pieces of RenderThemeGtk that will differ between versions into RenderThemeGtk2 and RenderThemeGtk3.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>327955</commentid>
    <comment_count>1</comment_count>
      <attachid>77687</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-12-30 10:22:47 -0800</bug_when>
    <thetext>Created attachment 77687
Split out methods that will differ</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>327957</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-30 10:26:21 -0800</bug_when>
    <thetext>Attachment 77687 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;WebCore/ChangeLog&apos;, u&apos;WebCore/GNUmakefile.am&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk.cpp&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk.h&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk2.cpp&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk3.cpp&apos;]&quot; exit_code: 1
WebCore/platform/gtk/RenderThemeGtk2.cpp:164:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/gtk/RenderThemeGtk2.cpp:340:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/gtk/RenderThemeGtk3.cpp:164:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/gtk/RenderThemeGtk3.cpp:340:  Use 0 instead of NULL.  [readability/null] [5]
Total errors found: 4 in 6 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>327982</commentid>
    <comment_count>3</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-12-30 11:42:12 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Attachment 77687 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;WebCore/ChangeLog&apos;, u&apos;WebCore/GNUmakefile.am&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk.cpp&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk.h&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk2.cpp&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk3.cpp&apos;]&quot; exit_code: 1
&gt; WebCore/platform/gtk/RenderThemeGtk2.cpp:164:  Use 0 instead of NULL.  [readability/null] [5]
&gt; WebCore/platform/gtk/RenderThemeGtk2.cpp:340:  Use 0 instead of NULL.  [readability/null] [5]
&gt; WebCore/platform/gtk/RenderThemeGtk3.cpp:164:  Use 0 instead of NULL.  [readability/null] [5]
&gt; WebCore/platform/gtk/RenderThemeGtk3.cpp:340:  Use 0 instead of NULL.  [readability/null] [5]
&gt; Total errors found: 4 in 6 files
&gt; 
&gt; 
&gt; If any of these errors are false positives, please file a bug against check-webkit-style.

This is a bug in check-webkit-style: https://bugs.webkit.org/show_bug.cgi?id=51758</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328050</commentid>
    <comment_count>4</comment_count>
      <attachid>77687</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2010-12-30 15:38:06 -0800</bug_when>
    <thetext>Comment on attachment 77687
Split out methods that will differ

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

&gt; WebCore/ChangeLog:105
&gt; +

Either remove all that stuff or fill in the details?

&gt; WebCore/platform/gtk/RenderThemeGtk.cpp:456
&gt; +                   gtkTextDirection(renderObject-&gt;style()-&gt;direction()),

This is somewhat random :D (I believe in general adding extra newlines goes against the style guidelines?)

&gt; WebCore/platform/gtk/RenderThemeGtk3.cpp:156
&gt; +#endif

This is always going to be FALSE for GTK+ 3.x right?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328060</commentid>
    <comment_count>5</comment_count>
      <attachid>77687</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-12-30 15:53:28 -0800</bug_when>
    <thetext>Comment on attachment 77687
Split out methods that will differ

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

Thanks for the review!

&gt;&gt; WebCore/ChangeLog:105
&gt;&gt; +
&gt; 
&gt; Either remove all that stuff or fill in the details?

Okay. Will remove this.

&gt;&gt; WebCore/platform/gtk/RenderThemeGtk.cpp:456
&gt;&gt; +                   gtkTextDirection(renderObject-&gt;style()-&gt;direction()),
&gt; 
&gt; This is somewhat random :D (I believe in general adding extra newlines goes against the style guidelines?)

Oh right. This is unrelated. If a line is longer than 100 or 120 characters it&apos;s generally okay to break it though. I will remove this change though.

&gt;&gt; WebCore/platform/gtk/RenderThemeGtk3.cpp:156
&gt;&gt; +#endif
&gt; 
&gt; This is always going to be FALSE for GTK+ 3.x right?

Yep. I&apos;ll remove this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328062</commentid>
    <comment_count>6</comment_count>
      <attachid>77699</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-12-30 16:10:30 -0800</bug_when>
    <thetext>Created attachment 77699
Patch with Xan&apos;s suggestions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328063</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-30 16:13:32 -0800</bug_when>
    <thetext>Attachment 77699 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;WebCore/ChangeLog&apos;, u&apos;WebCore/GNUmakefile.am&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk.cpp&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk.h&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk2.cpp&apos;, u&apos;WebCore/platform/gtk/RenderThemeGtk3.cpp&apos;]&quot; exit_code: 1
WebCore/platform/gtk/RenderThemeGtk2.cpp:164:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/gtk/RenderThemeGtk2.cpp:340:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/gtk/RenderThemeGtk3.cpp:160:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/gtk/RenderThemeGtk3.cpp:333:  Use 0 instead of NULL.  [readability/null] [5]
Total errors found: 4 in 6 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>328073</commentid>
    <comment_count>8</comment_count>
      <attachid>77699</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2010-12-30 16:45:44 -0800</bug_when>
    <thetext>Comment on attachment 77699
Patch with Xan&apos;s suggestions

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328075</commentid>
    <comment_count>9</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-12-30 17:04:29 -0800</bug_when>
    <thetext>Committed r74817: &lt;http://trac.webkit.org/changeset/74817&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>77687</attachid>
            <date>2010-12-30 10:22:47 -0800</date>
            <delta_ts>2010-12-30 16:10:27 -0800</delta_ts>
            <desc>Split out methods that will differ</desc>
            <filename>bug-51755-20101230102246.patch</filename>
            <type>text/plain</type>
            <size>68117</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NTM0ZjQ5MjRjMWIzYTczNDI0NTA3MzNhYTI0Zjg3NTMzYzU3OGZjZC4uNmM3YTVlOTY2NDBkZDY1
NDBlYmRmNDU2NjA1NDI2MTY4MDkzM2Y5MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMDggQEAKKzIwMTAtMTItMzAgIE1h
cnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHVEtdIEZvcmsgcGllY2VzIG9mIFJlbmRl
clRoZW1lR3RrIHRoYXQgd2lsbCBkaWZmZXIgZm9yIEdUSysgMworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTE3NTUKKworICAgICAgICBTcGxpdCBvdXQg
cGllY2VzIG9mIFJlbmRlclRoZW1lR3RrIGludG8gUmVuZGVyVGhlbWVHdGsyIGFuZCBSZW5kZXJU
aGVtZUd0azMKKyAgICAgICAgaWYgdGhleSBhcmUgZ29pbmcgdG8gZGlmZmVyIGJldHdlZW4gR1RL
KyAyLnggYW5kIEdUSysgMy54LiBUaGlzIGlzIHRoZSBwcmVsaW1pbmFyeQorICAgICAgICBzdGVw
IHRvIGxhbmRpbmcgc3VwcG9ydCBmb3IgdGhlIG5ldyBHVEsrIDMueCB0aGVtaW5nIEFQSS4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMuIFRoaXMgc2hvdWxkIG5vdCBjaGFuZ2UgZnVuY3Rpb25hbGl0
eS4KKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOiBBZGQgUmVuZGVyVGhlbWVHdGsyIGFuZCBS
ZW5kZXJUaGVtZUd0azMgdG8gdGhlIHNvdXJjZXMgbGlzdC4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
dGsvUmVuZGVyVGhlbWVHdGsuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Z3RrVGV4dERpcmVjdGlv
bik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6YWRqdXN0VGV4dEZpZWxkU3R5
bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmFkanVzdFRleHRBcmVhU3R5
bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50TWVkaWFCdXR0b24p
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmFkanVzdFByb2dyZXNzQmFyU3R5
bGUpOgorICAgICAgICAqIHBsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5oOiBNYWtlIHNldFRl
eHRJbnB1dEJvcmRlcnMgYSBtZXRob2QsIHNvIHRoYXQKKyAgICAgICAgaXQgY2FuIGJlIGV4aXN0
IGluIFJlbmRlclRoZW1lR3RrezIsM30gYW5kIGJlIGNhbGxlZCBmcm9tIFJlbmRlclRoZW1lR3Rr
LgorICAgICAgICAqIHBsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azIuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjppbml0TWVkaWFDb2xvcnMpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmdldEd0a1N0YXRlVHlwZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRSZW5kZXJPYmplY3QpOgorICAgICAgICAoV2Vi
Q29yZTo6c2V0VG9nZ2xlU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6
c2V0Q2hlY2tib3hTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWlu
dENoZWNrYm94KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpzZXRSYWRpb1Np
emUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50UmFkaW8pOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdl
YkNvcmU6OmdldENvbWJvQm94UGFkZGluZyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcCk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0b20pOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3RCdXR0b24pOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRlcnMpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50VGV4dEZpZWxkKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRyYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lR3RrOjphZGp1c3RTbGlkZXJUaHVtYlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVHdGs6OnBhaW50UHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFj
a2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwbGF0Zm9y
bUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkJh
Y2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6aW5hY3Rp
dmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25G
b3JlZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnN5c3Rl
bUNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6Omd0a1N0eWxlU2V0Q2FsbGJhY2spOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcik6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z3RrQnV0dG9uKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lR3RrOjpndGtFbnRyeSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUd0azo6Z3RrVHJlZVZpZXcpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6
Omd0a1ZTY2FsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z3RrSFNjYWxl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpndGtTY3JvbGxiYXIpOgorICAg
ICAgICAqIHBsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azMuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjppbml0TWVkaWFDb2xvcnMpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVHdGs6OmdldEd0a1N0YXRlVHlwZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZUd0azo6cGFpbnRSZW5kZXJPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6
c2V0VG9nZ2xlU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6c2V0Q2hl
Y2tib3hTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludENoZWNr
Ym94KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpzZXRSYWRpb1NpemUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50UmFkaW8pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6
OmdldENvbWJvQm94UGFkZGluZyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6
cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
R3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0b20pOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3RCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OnBhaW50VGV4dEZpZWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lR3RrOjpwYWludFNsaWRlclRyYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjpwYWludFNsaWRlclRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
R3RrOjphZGp1c3RTbGlkZXJUaHVtYlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVHdGs6OnBhaW50UHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVH
dGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3Vu
ZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2
ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91
bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0
Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3Jv
dW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnN5c3RlbUNvbG9y
KToKKyAgICAgICAgKFdlYkNvcmU6Omd0a1N0eWxlU2V0Q2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVHdGs6OnNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcik6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z3RrQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lR3RrOjpndGtFbnRyeSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0
azo6Z3RrVHJlZVZpZXcpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6Omd0a1ZT
Y2FsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z3RrSFNjYWxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpndGtTY3JvbGxiYXIpOgorCiAyMDEwLTEy
LTI3ICBBbXJ1dGggUmFqICA8YW1ydXRocmFqQG1vdG9yb2xhLmNvbT4gYW5kIFJhdmkgS2FzaWJo
YXRsYSAgPHJhdmkua2FzaWJoYXRsYUBtb3Rvcm9sYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgTWFydGluIFJvYmluc29uLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSBi
L1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KaW5kZXggMzgwOGNhMTQwODhhZWRkMGVkZjQ4NWQwMjc1
YTQ2NDc5Y2I1NmMzNC4uMjRiNDIwODFiY2RhOWU2YjA0MTMwZGIxYTQ2ZDU2YzBmM2M3MWI5NSAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQorKysgYi9XZWJDb3JlL0dOVW1ha2Vm
aWxlLmFtCkBAIC0zNzEwLDYgKzM3MTAsOCBAQCB3ZWJjb3JlZ3RrX3NvdXJjZXMgKz0gXAogCVdl
YkNvcmUvcGxhdGZvcm0vZ3RrL1BvcHVwTWVudUd0ay5oIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0
ay9SZW5kZXJUaGVtZUd0ay5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1l
R3RrLmggXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMi5jcHAgXAorCVdl
YkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5jcHAgXAogCVdlYkNvcmUvcGxhdGZv
cm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Ny
b2xsYmFyVGhlbWVHdGsuaCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsVmlld0d0ay5j
cHAgXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuY3BwCmluZGV4IGQ5MmM1MDVj
NjMzNjIyOTE2ZTZmZGMzMjU5YTk3YjQ0Njg5MzczNzMuLjgxZTAyYWRmOWU3YjE4ZTBiZjBmN2Rj
NWE3ZTU4ODZkYjZlYzIxMDAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRl
clRoZW1lR3RrLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5j
cHAKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJSZW5k
ZXJUaGVtZUd0ay5oIgogCi0jaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSAi
Q1NTVmFsdWVLZXl3b3Jkcy5oIgogI2luY2x1ZGUgIkdPd25QdHIuaCIKICNpbmNsdWRlICJHcmFk
aWVudC5oIgpAQCAtMzQsMjIgKzMzLDEyIEBACiAjaW5jbHVkZSAiSFRNTE1lZGlhRWxlbWVudC5o
IgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRz
LmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQbGF0Zm9ybU1vdXNl
RXZlbnQuaCIKICNpbmNsdWRlICJSZW5kZXJCb3guaCIKICNpbmNsdWRlICJSZW5kZXJPYmplY3Qu
aCIKLSNpbmNsdWRlICJTY3JvbGxiYXIuaCIKICNpbmNsdWRlICJUaW1lUmFuZ2VzLmgiCiAjaW5j
bHVkZSAiVXNlckFnZW50U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJXaWRnZXRSZW5kZXJpbmdD
b250ZXh0LmgiCi0jaW5jbHVkZSAiZ3RrZHJhd2luZy5oIgogI2luY2x1ZGUgPGdkay9nZGsuaD4K
ICNpbmNsdWRlIDxndGsvZ3RrLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgotCi0j
aWYgRU5BQkxFKFBST0dSRVNTX1RBRykKLSNpbmNsdWRlICJSZW5kZXJQcm9ncmVzcy5oIgotI2Vu
ZGlmCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtODcsMTQgKzc2LDYgQEAgc3RhdGljIEd0
a0ljb25TaXplIGdldE1lZGlhQnV0dG9uSWNvblNpemUoaW50IG1lZGlhSWNvblNpemUpCiAgICAg
cmV0dXJuIGljb25TaXplOwogfQogCi12b2lkIFJlbmRlclRoZW1lR3RrOjppbml0TWVkaWFDb2xv
cnMoKQotewotICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKEdUS19X
SURHRVQoZ3RrQ29udGFpbmVyKCkpKTsKLSAgICBtX3BhbmVsQ29sb3IgPSBzdHlsZS0+YmdbR1RL
X1NUQVRFX05PUk1BTF07Ci0gICAgbV9zbGlkZXJDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVf
QUNUSVZFXTsKLSAgICBtX3NsaWRlclRodW1iQ29sb3IgPSBzdHlsZS0+YmdbR1RLX1NUQVRFX1NF
TEVDVEVEXTsKLX0KLQogdm9pZCBSZW5kZXJUaGVtZUd0azo6aW5pdE1lZGlhQnV0dG9ucygpCiB7
CiAgICAgc3RhdGljIGJvb2wgaWNvbnNJbml0aWFsaXplZCA9IGZhbHNlOwpAQCAtMjE5LDE3ICsy
MDAsNiBAQCBzdGF0aWMgYm9vbCBzdXBwb3J0c0ZvY3VzKENvbnRyb2xQYXJ0IGFwcGVhcmFuY2Up
CiAgICAgfQogfQogCi1HdGtTdGF0ZVR5cGUgUmVuZGVyVGhlbWVHdGs6OmdldEd0a1N0YXRlVHlw
ZShSZW5kZXJPYmplY3QqIG9iamVjdCkKLXsKLSAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpIHx8
IGlzUmVhZE9ubHlDb250cm9sKG9iamVjdCkpCi0gICAgICAgIHJldHVybiBHVEtfU1RBVEVfSU5T
RU5TSVRJVkU7Ci0gICAgaWYgKGlzUHJlc3NlZChvYmplY3QpKQotICAgICAgICByZXR1cm4gR1RL
X1NUQVRFX0FDVElWRTsKLSAgICBpZiAoaXNIb3ZlcmVkKG9iamVjdCkpCi0gICAgICAgIHJldHVy
biBHVEtfU1RBVEVfUFJFTElHSFQ7Ci0gICAgcmV0dXJuIEdUS19TVEFURV9OT1JNQUw7Ci19Ci0K
IGJvb2wgUmVuZGVyVGhlbWVHdGs6OnN1cHBvcnRzRm9jdXNSaW5nKGNvbnN0IFJlbmRlclN0eWxl
KiBzdHlsZSkgY29uc3QKIHsKICAgICByZXR1cm4gc3VwcG9ydHNGb2N1cyhzdHlsZS0+YXBwZWFy
YW5jZSgpKTsKQEAgLTI1NSw3ICsyMjUsMTAgQEAgaW50IFJlbmRlclRoZW1lR3RrOjpiYXNlbGlu
ZVBvc2l0aW9uKGNvbnN0IFJlbmRlck9iamVjdCogbykgY29uc3QKICAgICByZXR1cm4gUmVuZGVy
VGhlbWU6OmJhc2VsaW5lUG9zaXRpb24obyk7CiB9CiAKLXN0YXRpYyBHdGtUZXh0RGlyZWN0aW9u
IGd0a1RleHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCisvLyBUaGlzIGlzIHVz
ZWQgaW4gUmVuZGVyVGhlbWVHdGsyIGFuZCBSZW5kZXJUaGVtZUd0azMuIE5vcm1hbGx5LCBpdCB3
b3VsZCBiZSBpbgorLy8gdGhlIFJlbmRlclRoZW1lR3RrIGhlYWRlciAocGVyaGFwcyBhcyBhIHN0
YXRpYyBtZXRob2QpLCBidXQgd2Ugd2FudCB0byBhdm9pZAorLy8gaGF2aW5nIHRvIGluY2x1ZGUg
R1RLKyBoZWFkZXJzIG9ubHkgZm9yIHRoZSBHdGtUZXh0RGlyZWN0aW9uIGVudW0uCitHdGtUZXh0
RGlyZWN0aW9uIGd0a1RleHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAg
ICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKICAgICBjYXNlIFJUTDoKQEAgLTI3OSw3MyArMjUyLDYg
QEAgR3RrU3RhdGVUeXBlIFJlbmRlclRoZW1lR3RrOjpndGtJY29uU3RhdGUoUmVuZGVyT2JqZWN0
KiByZW5kZXJPYmplY3QpCiAgICAgcmV0dXJuIEdUS19TVEFURV9OT1JNQUw7CiB9CiAKLWJvb2wg
UmVuZGVyVGhlbWVHdGs6OnBhaW50UmVuZGVyT2JqZWN0KEd0a1RoZW1lV2lkZ2V0VHlwZSB0eXBl
LCBSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBj
b25zdCBJbnRSZWN0JiByZWN0LCBpbnQgZmxhZ3MpCi17Ci0gICAgLy8gUGFpbnRpbmcgaXMgZGlz
YWJsZWQgc28ganVzdCBjbGFpbSB0byBoYXZlIHN1Y2NlZWRlZAotICAgIGlmIChjb250ZXh0LT5w
YWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEd0a1dpZGdl
dFN0YXRlIHdpZGdldFN0YXRlOwotICAgIHdpZGdldFN0YXRlLmFjdGl2ZSA9IGlzUHJlc3NlZChy
ZW5kZXJPYmplY3QpOwotICAgIHdpZGdldFN0YXRlLmZvY3VzZWQgPSBpc0ZvY3VzZWQocmVuZGVy
T2JqZWN0KTsKLQotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xODM2NAotICAgIC8vIFRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29kZSwgb25seSBwYWlu
dHMgYSBidXR0b24gYXMgcHJlc3NlZCB3aGVuIGl0J3MgcHJlc3NlZCAKLSAgICAvLyB3aGlsZSBo
b3ZlcmVkLiBVbnRpbCB3ZSBtb3ZlIGF3YXkgZnJvbSB0aGUgTW96aWxhIGNvZGUsIHdvcmstYXJv
dW5kIHRoZSBpc3N1ZSBieQotICAgIC8vIGZvcmNpbmcgYSBwcmVzc2VkIGJ1dHRvbiBpbnRvIHRo
ZSBob3ZlcmVkIHN0YXRlLiBUaGlzIGVuc3VyZXMgdGhhdCBidXR0b25zIGFjdGl2YXRlZAotICAg
IC8vIHZpYSB0aGUga2V5Ym9hcmQgaGF2ZSB0aGUgcHJvcGVyIHJlbmRlcmluZy4KLSAgICB3aWRn
ZXRTdGF0ZS5pbkhvdmVyID0gaXNIb3ZlcmVkKHJlbmRlck9iamVjdCkgfHwgKHR5cGUgPT0gTU9a
X0dUS19CVVRUT04gJiYgaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpOwotCi0gICAgLy8gRklYTUU6
IERpc2FibGVkIGRvZXMgbm90IGFsd2F5cyBnaXZlIHRoZSBjb3JyZWN0IGFwcGVhcmFuY2UgZm9y
IFJlYWRPbmx5Ci0gICAgd2lkZ2V0U3RhdGUuZGlzYWJsZWQgPSAhaXNFbmFibGVkKHJlbmRlck9i
amVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KTsKLSAgICB3aWRnZXRTdGF0
ZS5pc0RlZmF1bHQgPSBmYWxzZTsKLSAgICB3aWRnZXRTdGF0ZS5jYW5EZWZhdWx0ID0gZmFsc2U7
Ci0gICAgd2lkZ2V0U3RhdGUuZGVwcmVzc2VkID0gZmFsc2U7Ci0KLSAgICBXaWRnZXRSZW5kZXJp
bmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgcmVjdCk7Ci0gICAgcmV0dXJuICF3aWRn
ZXRDb250ZXh0LnBhaW50TW96aWxsYVdpZGdldCh0eXBlLCAmd2lkZ2V0U3RhdGUsIGZsYWdzLCBn
dGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLX0K
LQotc3RhdGljIHZvaWQgc2V0VG9nZ2xlU2l6ZShjb25zdCBSZW5kZXJUaGVtZUd0ayogdGhlbWUs
IFJlbmRlclN0eWxlKiBzdHlsZSwgQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkKLXsKLSAgICAvLyBU
aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHNvIHdlIHNob3VsZG4ndCBj
aGFuZ2UgdGhlbS4KLSAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkg
JiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8g
RklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IGNvcnJlY3QgdXNlIG9mIGluZGljYXRvclNpemUg
YW5kIGluZGljYXRvclNwYWNpbmcuCi0gICAgZ2ludCBpbmRpY2F0b3JTaXplLCBpbmRpY2F0b3JT
cGFjaW5nOwotICAgIHRoZW1lLT5nZXRJbmRpY2F0b3JNZXRyaWNzKGFwcGVhcmFuY2UsIGluZGlj
YXRvclNpemUsIGluZGljYXRvclNwYWNpbmcpOwotCi0gICAgLy8gT3RoZXIgcG9ydHMgaGFyZC1j
b2RlIHRoaXMgdG8gMTMsIGJ1dCBHVEsrIHVzZXJzIHRlbmQgdG8gZGVtYW5kIHRoZSBuYXRpdmUg
bG9vay4KLSAgICAvLyBJdCBjb3VsZCBiZSBtYWRlIGEgY29uZmlndXJhdGlvbiBvcHRpb24gdmFs
dWVzIG90aGVyIHRoYW4gMTMgYWN0dWFsbHkgYnJlYWsgc2l0ZSBjb21wYXRpYmlsaXR5LgotICAg
IGludCBsZW5ndGggPSBpbmRpY2F0b3JTaXplICsgaW5kaWNhdG9yU3BhY2luZzsKLSAgICBpZiAo
c3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKLSAgICAgICAgc3R5bGUtPnNldFdp
ZHRoKExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Ci0KLSAgICBpZiAoc3R5bGUtPmhlaWdodCgpLmlz
QXV0bygpKQotICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChsZW5ndGgsIEZpeGVkKSk7
Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSog
c3R5bGUpIGNvbnN0Ci17Ci0gICAgc2V0VG9nZ2xlU2l6ZSh0aGlzLCBzdHlsZSwgUmFkaW9QYXJ0
KTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRDaGVja2JveChSZW5kZXJPYmplY3Qq
IG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1
cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19DSEVDS0JVVFRPTiwgbywgaS5jb250ZXh0LCBy
ZWN0LCBpc0NoZWNrZWQobykpOwotfQotCi12b2lkIFJlbmRlclRoZW1lR3RrOjpzZXRSYWRpb1Np
emUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIHNldFRvZ2dsZVNpemUodGhpcywg
c3R5bGUsIFJhZGlvUGFydCk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UmFkaW8o
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3Qp
Ci17Ci0gICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUkFESU9CVVRUT04sIG8s
IGkuY29udGV4dCwgcmVjdCwgaXNDaGVja2VkKG8pKTsKLX0KLQogdm9pZCBSZW5kZXJUaGVtZUd0
azo6YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0
eWxlKiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVudCogZSkgY29uc3QKIHsKICAgICAvLyBTb21lIGxh
eW91dCB0ZXN0cyBjaGVjayBleHBsaWNpdGx5IHRoYXQgYnV0dG9ucyBpZ25vcmUgbGluZS1oZWln
aHQuCkBAIC0zNTMsOTYgKzI1OSw2IEBAIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdEJ1dHRv
blN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSoKICAgICAgICAg
c3R5bGUtPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOwog
fQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVj
dCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlm
IChpbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtCdXR0b24oKTsKLSAgICBJbnRSZWN0IGJ1
dHRvblJlY3QoSW50UG9pbnQoKSwgcmVjdC5zaXplKCkpOwotICAgIEludFJlY3QgZm9jdXNSZWN0
KGJ1dHRvblJlY3QpOwotCi0gICAgR3RrU3RhdGVUeXBlIHN0YXRlID0gZ2V0R3RrU3RhdGVUeXBl
KG9iamVjdCk7Ci0gICAgZ3RrX3dpZGdldF9zZXRfc3RhdGUod2lkZ2V0LCBzdGF0ZSk7Ci0gICAg
Z3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uKHdpZGdldCwgZ3RrVGV4dERpcmVjdGlvbihvYmplY3Qt
PnN0eWxlKCktPmRpcmVjdGlvbigpKSk7Ci0KLSAgICBpZiAoaXNGb2N1c2VkKG9iamVjdCkpIHsK
LSAgICAgICAgaWYgKGlzRW5hYmxlZChvYmplY3QpKSB7Ci0jaWYgIUdUS19DSEVDS19WRVJTSU9O
KDIsIDIyLCAwKQotICAgICAgICAgICAgR1RLX1dJREdFVF9TRVRfRkxBR1Mod2lkZ2V0LCBHVEtf
SEFTX0ZPQ1VTKTsKLSNlbmRpZgotICAgICAgICAgICAgZ19vYmplY3Rfc2V0KHdpZGdldCwgImhh
cy1mb2N1cyIsIFRSVUUsIE5VTEwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2Jvb2xlYW4gaW50
ZXJpb3JGb2N1cyA9IDAsIGZvY3VzV2lkdGggPSAwLCBmb2N1c1BhZGRpbmcgPSAwOwotICAgICAg
ICBndGtfd2lkZ2V0X3N0eWxlX2dldCh3aWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJpbnRlcmlvci1mb2N1cyIsICZpbnRlcmlvckZvY3VzLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1c1dpZHRoLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiZm9jdXMtcGFkZGluZyIsICZmb2N1c1BhZGRpbmcsIE5VTEwpOwot
ICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgZXh0ZXJpb3IgZm9jdXMsIHdlIHNocmluayB0aGUg
YnV0dG9uIHJlY3QgZG93biBiZWZvcmUKLSAgICAgICAgLy8gZHJhd2luZy4gSWYgd2UgYXJlIHVz
aW5nIGludGVyaW9yIGZvY3VzIHdlIHNocmluayB0aGUgZm9jdXMgcmVjdC4gVGhpcwotICAgICAg
ICAvLyBhcHByb2FjaCBvcmlnaW5hdGVzIGZyb20gdGhlIE1vemlsbGEgdGhlbWUgZHJhd2luZyBj
b2RlIChndGsyZHJhd2luZy5jKS4KLSAgICAgICAgaWYgKGludGVyaW9yRm9jdXMpIHsKLSAgICAg
ICAgICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCk7Ci0g
ICAgICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZVgoLXN0eWxlLT54dGhpY2tuZXNzIC0gZm9jdXNQ
YWRkaW5nKTsKLSAgICAgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlWSgtc3R5bGUtPnl0aGlja25l
c3MgLSBmb2N1c1BhZGRpbmcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnV0dG9u
UmVjdC5pbmZsYXRlWCgtZm9jdXNXaWR0aCAtIGZvY3VzUGFkZGluZyk7Ci0gICAgICAgICAgICBi
dXR0b25SZWN0LmluZmxhdGVZKC1mb2N1c1BhZGRpbmcgLSBmb2N1c1BhZGRpbmcpOwotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGlu
Zm8uY29udGV4dCwgcmVjdCk7Ci0gICAgR3RrU2hhZG93VHlwZSBzaGFkb3dUeXBlID0gc3RhdGUg
PT0gR1RLX1NUQVRFX0FDVElWRSA/IEdUS19TSEFET1dfSU4gOiBHVEtfU0hBRE9XX09VVDsKLSAg
ICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50Qm94KGJ1dHRvblJlY3QsIHdpZGdldCwgc3RhdGUsIHNo
YWRvd1R5cGUsICJidXR0b24iKTsKLSAgICBpZiAoaXNGb2N1c2VkKG9iamVjdCkpCi0gICAgICAg
IHdpZGdldENvbnRleHQuZ3RrUGFpbnRGb2N1cyhmb2N1c1JlY3QsIHdpZGdldCwgc3RhdGUsICJi
dXR0b24iKTsKLQotI2lmICFHVEtfQ0hFQ0tfVkVSU0lPTigyLCAyMiwgMCkKLSAgICBHVEtfV0lE
R0VUX1VOU0VUX0ZMQUdTKHdpZGdldCwgR1RLX0hBU19GT0NVUyk7Ci0jZW5kaWYKLSAgICBnX29i
amVjdF9zZXQod2lkZ2V0LCAiaGFzLWZvY3VzIiwgRkFMU0UsIE5VTEwpOwotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotc3RhdGljIHZvaWQgZ2V0Q29tYm9Cb3hQYWRkaW5nKFJlbmRlclN0eWxlKiBz
dHlsZSwgaW50JiBsZWZ0LCBpbnQmIHRvcCwgaW50JiByaWdodCwgaW50JiBib3R0b20pCi17Ci0g
ICAgLy8gSWYgdGhpcyBtZW51IGxpc3QgYnV0dG9uIGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRp
dmUgdGhlbWUsIHdlCi0gICAgLy8gZG9uJ3QgYWRkIGFueSBleHRyYSBwYWRkaW5nIGJleW9uZCB3
aGF0IFdlYkNvcmUgYWxyZWFkeSB1c2VzLgotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09
IE5vQ29udHJvbFBhcnQpCi0gICAgICAgIHJldHVybjsKLSAgICBtb3pfZ3RrX2dldF93aWRnZXRf
Ym9yZGVyKE1PWl9HVEtfRFJPUERPV04sICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20sCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHN0eWxlLT5kaXJl
Y3Rpb24oKSksIFRSVUUpOwotfQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQ
YWRkaW5nTGVmdChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50IGxlZnQgPSAw
LCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Ci0gICAgZ2V0Q29tYm9Cb3hQYWRkaW5n
KHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIHJldHVybiBsZWZ0OwotfQot
Ci1pbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5
bGUqIHN0eWxlKSBjb25zdAotewotICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAw
LCBib3R0b20gPSAwOwotICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCBy
aWdodCwgYm90dG9tKTsKLSAgICByZXR1cm4gcmlnaHQ7Ci19Ci0KLWludCBSZW5kZXJUaGVtZUd0
azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdUb3AoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewot
ICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOwotICAgIGdl
dENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICBy
ZXR1cm4gdG9wOwotfQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5n
Qm90dG9tKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBpbnQgbGVmdCA9IDAsIHRv
cCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKLSAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5
bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgcmV0dXJuIGJvdHRvbTsKLX0KLQog
dm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9y
KiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewogICAg
IC8vIFRoZSB0ZXN0cyBjaGVjayBleHBsaWNpdGx5IHRoYXQgc2VsZWN0IG1lbnUgYnV0dG9ucyBp
Z25vcmUgbGluZSBoZWlnaHQuCkBAIC00NTcsNDcgKzI3MywxNCBAQCB2b2lkIFJlbmRlclRoZW1l
R3RrOjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9y
LCBSZW5kZQogICAgIGFkanVzdE1lbnVMaXN0U3R5bGUoc2VsZWN0b3IsIHN0eWxlLCBlKTsKIH0K
IAotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZW51TGlzdChSZW5kZXJPYmplY3QqIG8sIGNv
bnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFp
bnRSZW5kZXJPYmplY3QoTU9aX0dUS19EUk9QRE9XTiwgbywgaS5jb250ZXh0LCByZWN0KTsKLX0K
LQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3Qq
IG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewot
ICAgIHJldHVybiBwYWludE1lbnVMaXN0KG9iamVjdCwgaW5mbywgcmVjdCk7Ci19Ci0KLXN0YXRp
YyB2b2lkIHNldFRleHRJbnB1dEJvcmRlcnMoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIC8v
IElmIHRoaXMgY29udHJvbCBpc24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZSBk
b24ndCB0b3VjaCB0aGUgYm9yZGVycy4KLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBO
b0NvbnRyb2xQYXJ0KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBjYW5ub3QgZ2l2ZSBh
IHByb3BlciByZW5kZXJpbmcgd2hlbiBib3JkZXIgcmFkaXVzIGlzIGFjdGl2ZSwgdW5mb3J0dW5h
dGVseS4KLSAgICBzdHlsZS0+cmVzZXRCb3JkZXJSYWRpdXMoKTsKLQotICAgIGludCBsZWZ0ID0g
MCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOwotICAgIG1vel9ndGtfZ2V0X3dpZGdl
dF9ib3JkZXIoTU9aX0dUS19FTlRSWSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVj
dGlvbigpKSwgVFJVRSk7Ci0gICAgc3R5bGUtPnNldEJvcmRlckxlZnRXaWR0aChsZWZ0KTsKLSAg
ICBzdHlsZS0+c2V0Qm9yZGVyVG9wV2lkdGgodG9wKTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVyUmln
aHRXaWR0aChyaWdodCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlckJvdHRvbVdpZHRoKGJvdHRvbSk7
Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxl
U2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0
CiB7Ci0gICAgc2V0VGV4dElucHV0Qm9yZGVycyhzdHlsZSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhl
bWVHdGs6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBp
LCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChN
T1pfR1RLX0VOVFJZLCBvLCBpLmNvbnRleHQsIHJlY3QpOworICAgIFJlbmRlclRoZW1lR3RrOjpz
ZXRUZXh0SW5wdXRCb3JkZXJzKHN0eWxlKTsKIH0KIAogdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRq
dXN0VGV4dEFyZWFTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewotICAgIHNldFRleHRJbnB1dEJvcmRlcnMoc3R5
bGUpOworICAgIFJlbmRlclRoZW1lR3RrOjpzZXRUZXh0SW5wdXRCb3JkZXJzKHN0eWxlKTsKIH0K
IAogYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqIG8sIGNv
bnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKQEAgLTU4MiwxNTQgKzM2NSwxNiBA
QCBib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCogbywg
Y29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdAogICAgIHJldHVybiBwYWludFRleHRGaWVsZChvLCBp
LCByZWN0KTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUcmFjayhSZW5k
ZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQotewotICAgIGlmIChpbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUo
KS0+YXBwZWFyYW5jZSgpOwotICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlckhvcml6b250YWxQYXJ0
IHx8IHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KTsKLQotICAgIC8vIFdlIHNocmluayB0aGUg
dHJvdWdoIHJlY3Qgc2xpZ2h0bHkgdG8gbWFrZSByb29tIGZvciB0aGUgZm9jdXMgaW5kaWNhdG9y
LgotICAgIEludFJlY3QgdHJvdWdoUmVjdChJbnRQb2ludCgpLCByZWN0LnNpemUoKSk7IC8vIFRo
aXMgaXMgcmVsYXRpdmUgdG8gcmVjdC4KLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IDA7Ci0gICAg
aWYgKHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KSB7Ci0gICAgICAgIHdpZGdldCA9IGd0a1ZT
Y2FsZSgpOwotICAgICAgICB0cm91Z2hSZWN0LmluZmxhdGVZKC1ndGtfd2lkZ2V0X2dldF9zdHls
ZSh3aWRnZXQpLT55dGhpY2tuZXNzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB3aWRnZXQgPSBn
dGtIU2NhbGUoKTsKLSAgICAgICAgdHJvdWdoUmVjdC5pbmZsYXRlWCgtZ3RrX3dpZGdldF9nZXRf
c3R5bGUod2lkZ2V0KS0+eHRoaWNrbmVzcyk7Ci0gICAgfQotICAgIGd0a193aWRnZXRfc2V0X2Rp
cmVjdGlvbih3aWRnZXQsIGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rp
b24oKSkpOwotCi0gICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGluZm8u
Y29udGV4dCwgcmVjdCk7Ci0gICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEJveCh0cm91Z2hSZWN0
LCB3aWRnZXQsIEdUS19TVEFURV9BQ1RJVkUsIEdUS19TSEFET1dfT1VULCAidHJvdWdoIik7Ci0g
ICAgaWYgKGlzRm9jdXNlZChvYmplY3QpKQotICAgICAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50
Rm9jdXMoSW50UmVjdChJbnRQb2ludCgpLCByZWN0LnNpemUoKSksIHdpZGdldCwgZ2V0R3RrU3Rh
dGVUeXBlKG9iamVjdCksICJ0cm91Z2giKTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogdm9p
ZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xpZGVyVHJhY2tTdHlsZShDU1NTdHlsZVNlbGVjdG9y
KiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKIHsKICAgICBzdHlsZS0+c2V0
Qm94U2hhZG93KDApOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRodW1i
KFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJl
Y3QmIHJlY3QpCi17Ci0gICAgaWYgKGluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDb250cm9sUGFydCBwYXJ0ID0gb2JqZWN0LT5z
dHlsZSgpLT5hcHBlYXJhbmNlKCk7Ci0gICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jp
em9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KTsKLQotICAgIEd0
a1dpZGdldCogd2lkZ2V0ID0gMDsKLSAgICBjb25zdCBjaGFyKiBkZXRhaWwgPSAwOwotICAgIEd0
a09yaWVudGF0aW9uIG9yaWVudGF0aW9uOwotICAgIGlmIChwYXJ0ID09IFNsaWRlclRodW1iVmVy
dGljYWxQYXJ0KSB7Ci0gICAgICAgIHdpZGdldCA9IGd0a1ZTY2FsZSgpOwotICAgICAgICBkZXRh
aWwgPSAidnNjYWxlIjsKLSAgICAgICAgb3JpZW50YXRpb24gPSBHVEtfT1JJRU5UQVRJT05fVkVS
VElDQUw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2lkZ2V0ID0gZ3RrSFNjYWxlKCk7Ci0gICAg
ICAgIGRldGFpbCA9ICJoc2NhbGUiOwotICAgICAgICBvcmllbnRhdGlvbiA9IEdUS19PUklFTlRB
VElPTl9IT1JJWk9OVEFMOwotICAgIH0KLSAgICBndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb24od2lk
Z2V0LCBndGtUZXh0RGlyZWN0aW9uKG9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLQot
ICAgIC8vIE9ubHkgc29tZSB0aGVtZXMgaGF2ZSBzbGlkZXIgdGh1bWJzIHJlc3BvbmQgdG8gY2xp
Y2tzIGFuZCBzb21lIGRvbid0LiBUaGlzIGluZm9ybWF0aW9uIGlzCi0gICAgLy8gZ2F0aGVyZWQg
dmlhIHRoZSAnYWN0aXZhdGUtc2xpZGVyJyBwcm9wZXJ0eSwgYnV0IGl0J3MgZGVwcmVjYXRlZCBp
biBHVEsrIDIuMjIgYW5kIHJlbW92ZWQgaW4KLSAgICAvLyBHVEsrIDMueC4gVGhlIGRyYXdiYWNr
IG9mIG5vdCBob25vcmluZyBpdCBpcyB0aGF0IHNsaWRlciB0aHVtYnMgY2hhbmdlIGNvbG9yIHdo
ZW4geW91IGNsaWNrCi0gICAgLy8gb24gdGhlbS4gCi0gICAgSW50UmVjdCB0aHVtYlJlY3QoSW50
UG9pbnQoKSwgcmVjdC5zaXplKCkpOwotICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0
Q29udGV4dChpbmZvLmNvbnRleHQsIHJlY3QpOwotICAgIHdpZGdldENvbnRleHQuZ3RrUGFpbnRT
bGlkZXIodGh1bWJSZWN0LCB3aWRnZXQsIGdldEd0a1N0YXRlVHlwZShvYmplY3QpLCBHVEtfU0hB
RE9XX09VVCwgZGV0YWlsLCBvcmllbnRhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2
b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJUaHVtYlN0eWxlKENTU1N0eWxlU2VsZWN0
b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAogewogICAgIHN0eWxlLT5z
ZXRCb3hTaGFkb3coMCk7CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFNsaWRlclRo
dW1iU2l6ZShSZW5kZXJPYmplY3QqIG8pIGNvbnN0Ci17Ci0gICAgQ29udHJvbFBhcnQgcGFydCA9
IG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKLSNpZiBFTkFCTEUoVklERU8pCi0gICAgaWYgKHBh
cnQgPT0gTWVkaWFTbGlkZXJUaHVtYlBhcnQpIHsKLSAgICAgICAgby0+c3R5bGUoKS0+c2V0V2lk
dGgoTGVuZ3RoKG1fbWVkaWFTbGlkZXJUaHVtYldpZHRoLCBGaXhlZCkpOwotICAgICAgICBvLT5z
dHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKG1fbWVkaWFTbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQp
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGFydCA9PSBNZWRpYVZvbHVtZVNs
aWRlclRodW1iUGFydCkKLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0KLSAgICBHdGtXaWRnZXQq
IHdpZGdldCA9IHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCA/IGd0a0hTY2FsZSgp
IDogZ3RrVlNjYWxlKCk7Ci0gICAgaW50IGxlbmd0aCA9IDAsIHdpZHRoID0gMDsKLSAgICBndGtf
d2lkZ2V0X3N0eWxlX2dldCh3aWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRl
cl9sZW5ndGgiLCAmbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzbGlkZXJfd2lk
dGgiLCAmd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICBpZiAo
cGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0KSB7Ci0gICAgICAgIG8tPnN0eWxlKCkt
PnNldFdpZHRoKExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Ci0gICAgICAgIG8tPnN0eWxlKCktPnNl
dEhlaWdodChMZW5ndGgod2lkdGgsIEZpeGVkKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpOwotICAgIG8tPnN0eWxl
KCktPnNldFdpZHRoKExlbmd0aCh3aWR0aCwgRml4ZWQpKTsKLSAgICBvLT5zdHlsZSgpLT5zZXRI
ZWlnaHQoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6
OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBH
dGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0
X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX1NFTEVDVEVEXTsKLX0KLQotQ29sb3IgUmVu
ZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKLSAgICByZXR1cm4g
Z3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfQUNUSVZFXTsKLX0K
LQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3Vu
ZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7Ci0g
ICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX1NF
TEVDVEVEXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxl
Y3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0g
Z3RrRW50cnkoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4
dFtHVEtfU1RBVEVfQUNUSVZFXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmFjdGl2ZUxp
c3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCog
d2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUo
d2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdOwotfQotCi1Db2xvciBSZW5kZXJUaGVt
ZUd0azo6aW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsK
LSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7Ci0gICAgcmV0dXJuIGd0a193
aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX0FDVElWRV07Ci19Ci0KLUNv
bG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9y
KCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7Ci0gICAg
cmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX1NFTEVD
VEVEXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlv
bkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtU
cmVlVmlldygpOwotICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0
W0dUS19TVEFURV9BQ1RJVkVdOwotfQotCiBkb3VibGUgUmVuZGVyVGhlbWVHdGs6OmNhcmV0Qmxp
bmtJbnRlcnZhbCgpIGNvbnN0CiB7CiAgICAgR3RrU2V0dGluZ3MqIHNldHRpbmdzID0gZ3RrX3Nl
dHRpbmdzX2dldF9kZWZhdWx0KCk7CkBAIC03ODcsMTAxICs0MzIsNiBAQCB2b2lkIFJlbmRlclRo
ZW1lR3RrOjpzeXN0ZW1Gb250KGludCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24p
IGNvbnN0CiAgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcmVlKHBhbmdvRGVzY3JpcHRpb24p
OwogfQogCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQp
IGNvbnN0Ci17Ci0gICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7Ci0gICAgY2FzZSBDU1NWYWx1ZUJ1
dHRvbnRleHQ6Ci0gICAgICAgIHJldHVybiBDb2xvcihndGtfd2lkZ2V0X2dldF9zdHlsZShndGtC
dXR0b24oKSktPmZnW0dUS19TVEFURV9OT1JNQUxdKTsKLSAgICBjYXNlIENTU1ZhbHVlQ2FwdGlv
bnRleHQ6Ci0gICAgICAgIHJldHVybiBDb2xvcihndGtfd2lkZ2V0X2dldF9zdHlsZShndGtFbnRy
eSgpKS0+ZmdbR1RLX1NUQVRFX05PUk1BTF0pOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVy
biBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7Ci0gICAgfQotfQotCi1zdGF0
aWMgdm9pZCBndGtTdHlsZVNldENhbGxiYWNrKEd0a1dpZGdldCogd2lkZ2V0LCBHdGtTdHlsZSog
cHJldmlvdXMsIFJlbmRlclRoZW1lKiByZW5kZXJUaGVtZSkKLXsKLSAgICAvLyBGSVhNRTogTWFr
ZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBnZXQgY2FsbGVkIG1hbnkgdGltZXMgZm9yIGEg
c2luZ2xlIEdUSysgc3R5bGUgY2hhbmdlIHNpZ25hbC4KLSAgICByZW5kZXJUaGVtZS0+cGxhdGZv
cm1Db2xvcnNEaWRDaGFuZ2UoKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0dXBXaWRn
ZXRBbmRBZGRUb0NvbnRhaW5lcihHdGtXaWRnZXQqIHdpZGdldCwgR3RrV2lkZ2V0KiB3aW5kb3cp
IGNvbnN0Ci17Ci0gICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih3aW5kb3cpLCB3
aWRnZXQpOwotICAgIGd0a193aWRnZXRfcmVhbGl6ZSh3aWRnZXQpOwotICAgIGdfb2JqZWN0X3Nl
dF9kYXRhKEdfT0JKRUNUKHdpZGdldCksICJ0cmFuc3BhcmVudC1iZy1oaW50IiwgR0lOVF9UT19Q
T0lOVEVSKFRSVUUpKTsKLQotICAgIC8vIEZJWE1FOiBQZXJoYXBzIHRoaXMgc2hvdWxkIG9ubHkg
YmUgY2FsbGVkIGZvciB0aGUgY29udGFpbmluZyB3aW5kb3cgb3IgcGFyZW50IGNvbnRhaW5lci4K
LSAgICBnX3NpZ25hbF9jb25uZWN0KHdpZGdldCwgInN0eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3Rr
U3R5bGVTZXRDYWxsYmFjayksIGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPih0aGlzKSk7Ci19
Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcigpIGNvbnN0Ci17Ci0g
ICAgaWYgKG1fZ3RrQ29udGFpbmVyKQotICAgICAgICByZXR1cm4gbV9ndGtDb250YWluZXI7Ci0K
LSAgICBtX2d0a1dpbmRvdyA9IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfUE9QVVApOwotI2lm
ZGVmIEdUS19BUElfVkVSU0lPTl8yCi0gICAgZ3RrX3dpZGdldF9zZXRfY29sb3JtYXAobV9ndGtX
aW5kb3csIG1fdGhlbWVQYXJ0cy5jb2xvcm1hcCk7Ci0jZW5kaWYKLSAgICBndGtfd2lkZ2V0X3Jl
YWxpemUobV9ndGtXaW5kb3cpOwotICAgIGd0a193aWRnZXRfc2V0X25hbWUobV9ndGtXaW5kb3cs
ICJNb3ppbGxhR3RrV2lkZ2V0Iik7Ci0KLSAgICBtX2d0a0NvbnRhaW5lciA9IGd0a19maXhlZF9u
ZXcoKTsKLSAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrQ29udGFpbmVyLCBt
X2d0a1dpbmRvdyk7Ci0gICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOwotfQotCi1HdGtXaWRnZXQq
IFJlbmRlclRoZW1lR3RrOjpndGtCdXR0b24oKSBjb25zdAotewotICAgIGlmIChtX2d0a0J1dHRv
bikKLSAgICAgICAgcmV0dXJuIG1fZ3RrQnV0dG9uOwotICAgIG1fZ3RrQnV0dG9uID0gZ3RrX2J1
dHRvbl9uZXcoKTsKLSAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrQnV0dG9u
LCBndGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG1fZ3RrQnV0dG9uOwotfQotCi1HdGtXaWRn
ZXQqIFJlbmRlclRoZW1lR3RrOjpndGtFbnRyeSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZ3RrRW50
cnkpCi0gICAgICAgIHJldHVybiBtX2d0a0VudHJ5OwotICAgIG1fZ3RrRW50cnkgPSBndGtfZW50
cnlfbmV3KCk7Ci0gICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0a0VudHJ5LCBn
dGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG1fZ3RrRW50cnk7Ci19Ci0KLUd0a1dpZGdldCog
UmVuZGVyVGhlbWVHdGs6Omd0a1RyZWVWaWV3KCkgY29uc3QKLXsKLSAgICBpZiAobV9ndGtUcmVl
VmlldykKLSAgICAgICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7Ci0gICAgbV9ndGtUcmVlVmlldyA9
IGd0a190cmVlX3ZpZXdfbmV3KCk7Ci0gICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lciht
X2d0a1RyZWVWaWV3LCBndGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7
Ci19Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a1ZTY2FsZSgpIGNvbnN0Ci17Ci0g
ICAgaWYgKG1fZ3RrVlNjYWxlKQotICAgICAgICByZXR1cm4gbV9ndGtWU2NhbGU7Ci0gICAgbV9n
dGtWU2NhbGUgPSBndGtfdnNjYWxlX25ldygwKTsKLSAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29u
dGFpbmVyKG1fZ3RrVlNjYWxlLCBndGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG1fZ3RrVlNj
YWxlOwotfQotCi1HdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtIU2NhbGUoKSBjb25zdAot
ewotICAgIGlmIChtX2d0a0hTY2FsZSkKLSAgICAgICAgcmV0dXJuIG1fZ3RrSFNjYWxlOwotICAg
IG1fZ3RrSFNjYWxlID0gZ3RrX2hzY2FsZV9uZXcoMCk7Ci0gICAgc2V0dXBXaWRnZXRBbmRBZGRU
b0NvbnRhaW5lcihtX2d0a0hTY2FsZSwgZ3RrQ29udGFpbmVyKCkpOwotICAgIHJldHVybiBtX2d0
a0hTY2FsZTsKLX0KLQotR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrU2Nyb2xsYmFyKCkK
LXsKLSAgICByZXR1cm4gbW96X2d0a19nZXRfc2Nyb2xsYmFyX3dpZGdldCgpOwotfQotCiB2b2lk
IFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpCiB7CiAjaWYgRU5BQkxF
KFZJREVPKQpAQCAtOTAyLDcgKzQ1Miw4IEBAIGJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVk
aWFCdXR0b24oUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIEdyYXBoaWNzQ29udGV4CiAgICAg
SW50UG9pbnQgaWNvblBvaW50KHJlY3QueCgpICsgKHJlY3Qud2lkdGgoKSAtIG1fbWVkaWFJY29u
U2l6ZSkgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICByZWN0LnkoKSArIChyZWN0LmhlaWdo
dCgpIC0gbV9tZWRpYUljb25TaXplKSAvIDIpOwogICAgIGNvbnRleHQtPmZpbGxSZWN0KEZsb2F0
UmVjdChyZWN0KSwgbV9wYW5lbENvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKLSAgICBwYWlu
dFN0b2NrSWNvbihjb250ZXh0LCBpY29uUG9pbnQsIHN0eWxlLCBpY29uTmFtZSwgZ3RrVGV4dERp
cmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSwKKyAgICBwYWludFN0
b2NrSWNvbihjb250ZXh0LCBpY29uUG9pbnQsIHN0eWxlLCBpY29uTmFtZSwgCisgICAgICAgICAg
ICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlv
bigpKSwKICAgICAgICAgICAgICAgICAgICBndGtJY29uU3RhdGUocmVuZGVyT2JqZWN0KSwgZ2V0
TWVkaWFCdXR0b25JY29uU2l6ZShtX21lZGlhSWNvblNpemUpKTsKIAogICAgIHJldHVybiBmYWxz
ZTsKQEAgLTEwNDIsMzMgKzU5Myw2IEBAIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFByb2dy
ZXNzQmFyU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsCiB7CiAgICAg
c3R5bGUtPnNldEJveFNoYWRvdygwKTsKIH0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRQ
cm9ncmVzc0JhcihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKCFyZW5kZXJPYmplY3Qt
PmlzUHJvZ3Jlc3MoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBHdGtXaWRnZXQqIHBy
b2dyZXNzQmFyV2lkZ2V0ID0gbW96X2d0a19nZXRfcHJvZ3Jlc3Nfd2lkZ2V0KCk7Ci0gICAgaWYg
KCFwcm9ncmVzc0JhcldpZGdldCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAocGFp
bnRSZW5kZXJPYmplY3QoTU9aX0dUS19QUk9HUkVTU0JBUiwgcmVuZGVyT2JqZWN0LCBwYWludElu
Zm8uY29udGV4dCwgcmVjdCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgSW50UmVjdCBj
aHVua1JlY3QocmVjdCk7Ci0gICAgUmVuZGVyUHJvZ3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9S
ZW5kZXJQcm9ncmVzcyhyZW5kZXJPYmplY3QpOwotCi0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3Rr
X3dpZGdldF9nZXRfc3R5bGUocHJvZ3Jlc3NCYXJXaWRnZXQpOwotICAgIGNodW5rUmVjdC5zZXRI
ZWlnaHQoY2h1bmtSZWN0LmhlaWdodCgpIC0gKDIgKiBzdHlsZS0+eXRoaWNrbmVzcykpOwotICAg
IGNodW5rUmVjdC5zZXRZKGNodW5rUmVjdC55KCkgKyBzdHlsZS0+eXRoaWNrbmVzcyk7Ci0gICAg
Y2h1bmtSZWN0LnNldFdpZHRoKChjaHVua1JlY3Qud2lkdGgoKSAtICgyICogc3R5bGUtPnh0aGlj
a25lc3MpKSAqIHJlbmRlclByb2dyZXNzLT5wb3NpdGlvbigpKTsKLSAgICBpZiAocmVuZGVyT2Jq
ZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwpCi0gICAgICAgIGNodW5rUmVjdC5zZXRY
KHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gY2h1bmtSZWN0LndpZHRoKCkgLSBzdHlsZS0+eHRo
aWNrbmVzcyk7Ci0gICAgZWxzZQotICAgICAgICBjaHVua1JlY3Quc2V0WChjaHVua1JlY3QueCgp
ICsgc3R5bGUtPnh0aGlja25lc3MpOwotCi0gICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1P
Wl9HVEtfUFJPR1JFU1NfQ0hVTkssIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIGNo
dW5rUmVjdCk7Ci19CiAjZW5kaWYKIAogfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvUmVuZGVyVGhlbWVHdGsuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3Rr
LmgKaW5kZXggMmVjMTg4MWEyYTk5YTMwNWU2MjJkZmMzY2FjNjQxN2JmMTk4MWFhMC4uNWM5Mjk4
NGViMTFjNzQ2NWY4ODQ3YmUxZmY3MDNhMGY3ZjQ2M2VhYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9w
bGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuaAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9S
ZW5kZXJUaGVtZUd0ay5oCkBAIC0xNzMsNiArMTczLDcgQEAgcHJpdmF0ZToKICAgICBib29sIHBh
aW50TWVkaWFCdXR0b24oUmVuZGVyT2JqZWN0KiwgR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50
UmVjdCYsIGNvbnN0IGNoYXIqIGljb25OYW1lKTsKICNlbmRpZgogICAgIEd0a1N0YXRlVHlwZSBn
dGtJY29uU3RhdGUoUmVuZGVyT2JqZWN0Kik7CisgICAgdm9pZCBzZXRUZXh0SW5wdXRCb3JkZXJz
KFJlbmRlclN0eWxlKikgY29uc3Q7CiAKICAgICBtdXRhYmxlIEd0a1dpZGdldCogbV9ndGtXaW5k
b3c7CiAgICAgbXV0YWJsZSBHdGtXaWRnZXQqIG1fZ3RrQ29udGFpbmVyOwpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsyLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3RrL1JlbmRlclRoZW1lR3RrMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjRhMGY0NzNmNzJjMjgxOWVk
MjNjMzlkZjQ3YzExY2IxNDljMGE1YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3RrL1JlbmRlclRoZW1lR3RrMi5jcHAKQEAgLTAsMCArMSw1MjQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tl
ciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4K
KyAqIENvcHlyaWdodCAoQykgMjAwOSBLZW5uZXRoIFJvaGRlIENocmlzdGlhbnNlbgorICogQ29w
eXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rvbiwg
TUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiUmVuZGVyVGhlbWVHdGsuaCIKKworI2lmZGVmIEdUS19BUElfVkVSU0lPTl8yCisKKyNp
bmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiR3RrVmVyc2lvbmluZy5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2lu
Y2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW5jbHVkZSAiUmVuZGVyT2JqZWN0Lmgi
CisjaW5jbHVkZSAiVGV4dERpcmVjdGlvbi5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hl
ZXRzLmgiCisjaW5jbHVkZSAiV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgImd0
a2RyYXdpbmcuaCIKKyNpbmNsdWRlIDxnZGsvZ2RrLmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgor
CisjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKKyNpbmNsdWRlICJSZW5kZXJQcm9ncmVzcy5oIgor
I2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhpcyBpcyBub3QgYSBzdGF0aWMg
bWV0aG9kLCBiZWNhdXNlIHdlIHdhbnQgdG8gYXZvaWQgaGF2aW5nIEdUSysgaGVhZGVycyBpbiBS
ZW5kZXJUaGVtZUd0ay5oLgorZXh0ZXJuIEd0a1RleHREaXJlY3Rpb24gZ3RrVGV4dERpcmVjdGlv
bihUZXh0RGlyZWN0aW9uKTsKKwordm9pZCBSZW5kZXJUaGVtZUd0azo6aW5pdE1lZGlhQ29sb3Jz
KCkKK3sKKyAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShHVEtfV0lE
R0VUKGd0a0NvbnRhaW5lcigpKSk7CisgICAgbV9wYW5lbENvbG9yID0gc3R5bGUtPmJnW0dUS19T
VEFURV9OT1JNQUxdOworICAgIG1fc2xpZGVyQ29sb3IgPSBzdHlsZS0+YmdbR1RLX1NUQVRFX0FD
VElWRV07CisgICAgbV9zbGlkZXJUaHVtYkNvbG9yID0gc3R5bGUtPmJnW0dUS19TVEFURV9TRUxF
Q1RFRF07Cit9CisKK0d0a1N0YXRlVHlwZSBSZW5kZXJUaGVtZUd0azo6Z2V0R3RrU3RhdGVUeXBl
KFJlbmRlck9iamVjdCogb2JqZWN0KQoreworICAgIGlmICghaXNFbmFibGVkKG9iamVjdCkgfHwg
aXNSZWFkT25seUNvbnRyb2wob2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIEdUS19TVEFURV9JTlNF
TlNJVElWRTsKKyAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkpCisgICAgICAgIHJldHVybiBHVEtf
U1RBVEVfQUNUSVZFOworICAgIGlmIChpc0hvdmVyZWQob2JqZWN0KSkKKyAgICAgICAgcmV0dXJu
IEdUS19TVEFURV9QUkVMSUdIVDsKKyAgICByZXR1cm4gR1RLX1NUQVRFX05PUk1BTDsKK30KKwor
Ym9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRSZW5kZXJPYmplY3QoR3RrVGhlbWVXaWRnZXRUeXBl
IHR5cGUsIFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBmbGFncykKK3sKKyAgICAvLyBQYWludGluZyBp
cyBkaXNhYmxlZCBzbyBqdXN0IGNsYWltIHRvIGhhdmUgc3VjY2VlZGVkCisgICAgaWYgKGNvbnRl
eHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3Rr
V2lkZ2V0U3RhdGUgd2lkZ2V0U3RhdGU7CisgICAgd2lkZ2V0U3RhdGUuYWN0aXZlID0gaXNQcmVz
c2VkKHJlbmRlck9iamVjdCk7CisgICAgd2lkZ2V0U3RhdGUuZm9jdXNlZCA9IGlzRm9jdXNlZChy
ZW5kZXJPYmplY3QpOworCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE4MzY0CisgICAgLy8gVGhlIE1vemlsbGEgdGhlbWUgZHJhd2luZyBjb2RlLCBvbmx5
IHBhaW50cyBhIGJ1dHRvbiBhcyBwcmVzc2VkIHdoZW4gaXQncyBwcmVzc2VkIAorICAgIC8vIHdo
aWxlIGhvdmVyZWQuIFVudGlsIHdlIG1vdmUgYXdheSBmcm9tIHRoZSBNb3ppbGEgY29kZSwgd29y
ay1hcm91bmQgdGhlIGlzc3VlIGJ5CisgICAgLy8gZm9yY2luZyBhIHByZXNzZWQgYnV0dG9uIGlu
dG8gdGhlIGhvdmVyZWQgc3RhdGUuIFRoaXMgZW5zdXJlcyB0aGF0IGJ1dHRvbnMgYWN0aXZhdGVk
CisgICAgLy8gdmlhIHRoZSBrZXlib2FyZCBoYXZlIHRoZSBwcm9wZXIgcmVuZGVyaW5nLgorICAg
IHdpZGdldFN0YXRlLmluSG92ZXIgPSBpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSB8fCAodHlwZSA9
PSBNT1pfR1RLX0JVVFRPTiAmJiBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSk7CisKKyAgICAvLyBG
SVhNRTogRGlzYWJsZWQgZG9lcyBub3QgYWx3YXlzIGdpdmUgdGhlIGNvcnJlY3QgYXBwZWFyYW5j
ZSBmb3IgUmVhZE9ubHkKKyAgICB3aWRnZXRTdGF0ZS5kaXNhYmxlZCA9ICFpc0VuYWJsZWQocmVu
ZGVyT2JqZWN0KSB8fCBpc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3QpOworICAgIHdpZGdl
dFN0YXRlLmlzRGVmYXVsdCA9IGZhbHNlOworICAgIHdpZGdldFN0YXRlLmNhbkRlZmF1bHQgPSBm
YWxzZTsKKyAgICB3aWRnZXRTdGF0ZS5kZXByZXNzZWQgPSBmYWxzZTsKKworICAgIFdpZGdldFJl
bmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChjb250ZXh0LCByZWN0KTsKKyAgICByZXR1cm4g
IXdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KHR5cGUsICZ3aWRnZXRTdGF0ZSwgZmxh
Z3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtUZXh0
RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKK30KKworc3Rh
dGljIHZvaWQgc2V0VG9nZ2xlU2l6ZShjb25zdCBSZW5kZXJUaGVtZUd0ayogdGhlbWUsIFJlbmRl
clN0eWxlKiBzdHlsZSwgQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkKK3sKKyAgICAvLyBUaGUgd2lk
dGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHNvIHdlIHNob3VsZG4ndCBjaGFuZ2Ug
dGhlbS4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0
eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUU6
IFRoaXMgaXMgcHJvYmFibHkgbm90IGNvcnJlY3QgdXNlIG9mIGluZGljYXRvclNpemUgYW5kIGlu
ZGljYXRvclNwYWNpbmcuCisgICAgZ2ludCBpbmRpY2F0b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5n
OworICAgIHRoZW1lLT5nZXRJbmRpY2F0b3JNZXRyaWNzKGFwcGVhcmFuY2UsIGluZGljYXRvclNp
emUsIGluZGljYXRvclNwYWNpbmcpOworCisgICAgLy8gT3RoZXIgcG9ydHMgaGFyZC1jb2RlIHRo
aXMgdG8gMTMsIGJ1dCBHVEsrIHVzZXJzIHRlbmQgdG8gZGVtYW5kIHRoZSBuYXRpdmUgbG9vay4K
KyAgICAvLyBJdCBjb3VsZCBiZSBtYWRlIGEgY29uZmlndXJhdGlvbiBvcHRpb24gdmFsdWVzIG90
aGVyIHRoYW4gMTMgYWN0dWFsbHkgYnJlYWsgc2l0ZSBjb21wYXRpYmlsaXR5LgorICAgIGludCBs
ZW5ndGggPSBpbmRpY2F0b3JTaXplICsgaW5kaWNhdG9yU3BhY2luZzsKKyAgICBpZiAoc3R5bGUt
PndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldFdpZHRoKExl
bmd0aChsZW5ndGgsIEZpeGVkKSk7CisKKyAgICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygp
KQorICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0Cit7CisgICAgc2V0VG9nZ2xlU2l6ZSh0aGlzLCBzdHlsZSwgUmFkaW9QYXJ0KTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG9iamVj
dCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJl
dHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0NIRUNLQlVUVE9OLCBvYmplY3QsIGluZm8u
Y29udGV4dCwgcmVjdCwgaXNDaGVja2VkKG9iamVjdCkpOworfQorCit2b2lkIFJlbmRlclRoZW1l
R3RrOjpzZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIHNldFRv
Z2dsZVNpemUodGhpcywgc3R5bGUsIFJhZGlvUGFydCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3Qo
TU9aX0dUS19SQURJT0JVVFRPTiwgb2JqZWN0LCBpbmZvLmNvbnRleHQsIHJlY3QsIGlzQ2hlY2tl
ZChvYmplY3QpKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRCdXR0b24oUmVuZGVy
T2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVj
dCkKK3sKKyAgICBpZiAoaW5mby5jb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrQnV0dG9uKCk7Cisg
ICAgSW50UmVjdCBidXR0b25SZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKTsKKyAgICBJbnRS
ZWN0IGZvY3VzUmVjdChidXR0b25SZWN0KTsKKworICAgIEd0a1N0YXRlVHlwZSBzdGF0ZSA9IGdl
dEd0a1N0YXRlVHlwZShvYmplY3QpOworICAgIGd0a193aWRnZXRfc2V0X3N0YXRlKHdpZGdldCwg
c3RhdGUpOworICAgIGd0a193aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIGd0a1RleHREaXJl
Y3Rpb24ob2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworCisgICAgaWYgKGlzRm9jdXNl
ZChvYmplY3QpKSB7CisgICAgICAgIGlmIChpc0VuYWJsZWQob2JqZWN0KSkgeworI2lmICFHVEtf
Q0hFQ0tfVkVSU0lPTigyLCAyMiwgMCkKKyAgICAgICAgICAgIEdUS19XSURHRVRfU0VUX0ZMQUdT
KHdpZGdldCwgR1RLX0hBU19GT0NVUyk7CisjZW5kaWYKKyAgICAgICAgICAgIGdfb2JqZWN0X3Nl
dCh3aWRnZXQsICJoYXMtZm9jdXMiLCBUUlVFLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAg
IGdib29sZWFuIGludGVyaW9yRm9jdXMgPSAwLCBmb2N1c1dpZHRoID0gMCwgZm9jdXNQYWRkaW5n
ID0gMDsKKyAgICAgICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQod2lkZ2V0LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1cywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzLXBhZGRpbmciLCAmZm9jdXNQYWRk
aW5nLCBOVUxMKTsKKyAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGV4dGVyaW9yIGZvY3VzLCB3
ZSBzaHJpbmsgdGhlIGJ1dHRvbiByZWN0IGRvd24gYmVmb3JlCisgICAgICAgIC8vIGRyYXdpbmcu
IElmIHdlIGFyZSB1c2luZyBpbnRlcmlvciBmb2N1cyB3ZSBzaHJpbmsgdGhlIGZvY3VzIHJlY3Qu
IFRoaXMKKyAgICAgICAgLy8gYXBwcm9hY2ggb3JpZ2luYXRlcyBmcm9tIHRoZSBNb3ppbGxhIHRo
ZW1lIGRyYXdpbmcgY29kZSAoZ3RrMmRyYXdpbmcuYykuCisgICAgICAgIGlmIChpbnRlcmlvckZv
Y3VzKSB7CisgICAgICAgICAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHls
ZSh3aWRnZXQpOworICAgICAgICAgICAgZm9jdXNSZWN0LmluZmxhdGVYKC1zdHlsZS0+eHRoaWNr
bmVzcyAtIGZvY3VzUGFkZGluZyk7CisgICAgICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZVkoLXN0
eWxlLT55dGhpY2tuZXNzIC0gZm9jdXNQYWRkaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIGJ1dHRvblJlY3QuaW5mbGF0ZVgoLWZvY3VzV2lkdGggLSBmb2N1c1BhZGRpbmcpOwor
ICAgICAgICAgICAgYnV0dG9uUmVjdC5pbmZsYXRlWSgtZm9jdXNQYWRkaW5nIC0gZm9jdXNQYWRk
aW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lk
Z2V0Q29udGV4dChpbmZvLmNvbnRleHQsIHJlY3QpOworICAgIEd0a1NoYWRvd1R5cGUgc2hhZG93
VHlwZSA9IHN0YXRlID09IEdUS19TVEFURV9BQ1RJVkUgPyBHVEtfU0hBRE9XX0lOIDogR1RLX1NI
QURPV19PVVQ7CisgICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEJveChidXR0b25SZWN0LCB3aWRn
ZXQsIHN0YXRlLCBzaGFkb3dUeXBlLCAiYnV0dG9uIik7CisgICAgaWYgKGlzRm9jdXNlZChvYmpl
Y3QpKQorICAgICAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50Rm9jdXMoZm9jdXNSZWN0LCB3aWRn
ZXQsIHN0YXRlLCAiYnV0dG9uIik7CisKKyNpZiAhR1RLX0NIRUNLX1ZFUlNJT04oMiwgMjIsIDAp
CisgICAgR1RLX1dJREdFVF9VTlNFVF9GTEFHUyh3aWRnZXQsIEdUS19IQVNfRk9DVVMpOworI2Vu
ZGlmCisgICAgZ19vYmplY3Rfc2V0KHdpZGdldCwgImhhcy1mb2N1cyIsIEZBTFNFLCBOVUxMKTsK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdldENvbWJvQm94UGFkZGluZyhS
ZW5kZXJTdHlsZSogc3R5bGUsIGludCYgbGVmdCwgaW50JiB0b3AsIGludCYgcmlnaHQsIGludCYg
Ym90dG9tKQoreworICAgIC8vIElmIHRoaXMgbWVudSBsaXN0IGJ1dHRvbiBpc24ndCBkcmF3biB1
c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZQorICAgIC8vIGRvbid0IGFkZCBhbnkgZXh0cmEgcGFk
ZGluZyBiZXlvbmQgd2hhdCBXZWJDb3JlIGFscmVhZHkgdXNlcy4KKyAgICBpZiAoc3R5bGUtPmFw
cGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICByZXR1cm47CisgICAgbW96X2d0
a19nZXRfd2lkZ2V0X2JvcmRlcihNT1pfR1RLX0RST1BET1dOLCAmbGVmdCwgJnRvcCwgJnJpZ2h0
LCAmYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlv
bihzdHlsZS0+ZGlyZWN0aW9uKCkpLCBUUlVFKTsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpw
b3B1cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAg
IGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIGdldENv
bWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICByZXR1
cm4gbGVmdDsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1Jp
Z2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRvcCA9
IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKKyAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUs
IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJuIHJpZ2h0OworfQorCitpbnQg
UmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlKiBzdHls
ZSkgY29uc3QKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9t
ID0gMDsKKyAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJv
dHRvbSk7CisgICAgcmV0dXJuIHRvcDsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cElu
dGVybmFsUGFkZGluZ0JvdHRvbShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaW50
IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7CisgICAgZ2V0Q29tYm9C
b3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIHJldHVybiBi
b3R0b207Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QoUmVuZGVyT2Jq
ZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19EUk9QRE9XTiwgb2JqZWN0
LCBpbmZvLmNvbnRleHQsIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1l
bnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50TWVudUxpc3Qob2JqZWN0
LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0VGV4dElucHV0Qm9y
ZGVycyhSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8gSWYgdGhpcyBjb250cm9s
IGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRpdmUgdGhlbWUsIHdlIGRvbid0IHRvdWNoIHRoZSBi
b3JkZXJzLgorICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE5vQ29udHJvbFBhcnQpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGNhbm5vdCBnaXZlIGEgcHJvcGVyIHJlbmRlcmlu
ZyB3aGVuIGJvcmRlciByYWRpdXMgaXMgYWN0aXZlLCB1bmZvcnR1bmF0ZWx5LgorICAgIHN0eWxl
LT5yZXNldEJvcmRlclJhZGl1cygpOworCisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdo
dCA9IDAsIGJvdHRvbSA9IDA7CisgICAgbW96X2d0a19nZXRfd2lkZ2V0X2JvcmRlcihNT1pfR1RL
X0VOVFJZLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihzdHlsZS0+ZGlyZWN0aW9uKCkpLCBUUlVFKTsK
KyAgICBzdHlsZS0+c2V0Qm9yZGVyTGVmdFdpZHRoKGxlZnQpOworICAgIHN0eWxlLT5zZXRCb3Jk
ZXJUb3BXaWR0aCh0b3ApOworICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFdpZHRoKHJpZ2h0KTsK
KyAgICBzdHlsZS0+c2V0Qm9yZGVyQm90dG9tV2lkdGgoYm90dG9tKTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUd0azo6cGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBh
aW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRS
ZW5kZXJPYmplY3QoTU9aX0dUS19FTlRSWSwgb2JqZWN0LCBpbmZvLmNvbnRleHQsIHJlY3QpOwor
fQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRyYWNrKFJlbmRlck9iamVjdCog
b2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7Cisg
ICAgaWYgKGluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gb2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJh
bmNlKCk7CisgICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQgfHwgcGFydCA9
PSBTbGlkZXJWZXJ0aWNhbFBhcnQpOworCisgICAgLy8gV2Ugc2hyaW5rIHRoZSB0cm91Z2ggcmVj
dCBzbGlnaHRseSB0byBtYWtlIHJvb20gZm9yIHRoZSBmb2N1cyBpbmRpY2F0b3IuCisgICAgSW50
UmVjdCB0cm91Z2hSZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKTsgLy8gVGhpcyBpcyByZWxh
dGl2ZSB0byByZWN0LgorICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gMDsKKyAgICBpZiAocGFydCA9
PSBTbGlkZXJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgd2lkZ2V0ID0gZ3RrVlNjYWxlKCk7Cisg
ICAgICAgIHRyb3VnaFJlY3QuaW5mbGF0ZVkoLWd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCkt
Pnl0aGlja25lc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdpZGdldCA9IGd0a0hTY2FsZSgp
OworICAgICAgICB0cm91Z2hSZWN0LmluZmxhdGVYKC1ndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRn
ZXQpLT54dGhpY2tuZXNzKTsKKyAgICB9CisgICAgZ3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uKHdp
ZGdldCwgZ3RrVGV4dERpcmVjdGlvbihvYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSk7CisK
KyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoaW5mby5jb250ZXh0LCBy
ZWN0KTsKKyAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50Qm94KHRyb3VnaFJlY3QsIHdpZGdldCwg
R1RLX1NUQVRFX0FDVElWRSwgR1RLX1NIQURPV19PVVQsICJ0cm91Z2giKTsKKyAgICBpZiAoaXNG
b2N1c2VkKG9iamVjdCkpCisgICAgICAgIHdpZGdldENvbnRleHQuZ3RrUGFpbnRGb2N1cyhJbnRS
ZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKSwgd2lkZ2V0LCBnZXRHdGtTdGF0ZVR5cGUob2Jq
ZWN0KSwgInRyb3VnaCIpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRo
ZW1lR3RrOjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKGluZm8uY29udGV4
dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDb250
cm9sUGFydCBwYXJ0ID0gb2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7CisgICAgQVNTRVJU
KHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1i
VmVydGljYWxQYXJ0KTsKKworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gMDsKKyAgICBjb25zdCBj
aGFyKiBkZXRhaWwgPSAwOworICAgIEd0a09yaWVudGF0aW9uIG9yaWVudGF0aW9uOworICAgIGlm
IChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KSB7CisgICAgICAgIHdpZGdldCA9IGd0
a1ZTY2FsZSgpOworICAgICAgICBkZXRhaWwgPSAidnNjYWxlIjsKKyAgICAgICAgb3JpZW50YXRp
b24gPSBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2lk
Z2V0ID0gZ3RrSFNjYWxlKCk7CisgICAgICAgIGRldGFpbCA9ICJoc2NhbGUiOworICAgICAgICBv
cmllbnRhdGlvbiA9IEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMOworICAgIH0KKyAgICBndGtf
d2lkZ2V0X3NldF9kaXJlY3Rpb24od2lkZ2V0LCBndGtUZXh0RGlyZWN0aW9uKG9iamVjdC0+c3R5
bGUoKS0+ZGlyZWN0aW9uKCkpKTsKKworICAgIC8vIE9ubHkgc29tZSB0aGVtZXMgaGF2ZSBzbGlk
ZXIgdGh1bWJzIHJlc3BvbmQgdG8gY2xpY2tzIGFuZCBzb21lIGRvbid0LiBUaGlzIGluZm9ybWF0
aW9uIGlzCisgICAgLy8gZ2F0aGVyZWQgdmlhIHRoZSAnYWN0aXZhdGUtc2xpZGVyJyBwcm9wZXJ0
eSwgYnV0IGl0J3MgZGVwcmVjYXRlZCBpbiBHVEsrIDIuMjIgYW5kIHJlbW92ZWQgaW4KKyAgICAv
LyBHVEsrIDMueC4gVGhlIGRyYXdiYWNrIG9mIG5vdCBob25vcmluZyBpdCBpcyB0aGF0IHNsaWRl
ciB0aHVtYnMgY2hhbmdlIGNvbG9yIHdoZW4geW91IGNsaWNrCisgICAgLy8gb24gdGhlbS4gCisg
ICAgSW50UmVjdCB0aHVtYlJlY3QoSW50UG9pbnQoKSwgcmVjdC5zaXplKCkpOworICAgIFdpZGdl
dFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChpbmZvLmNvbnRleHQsIHJlY3QpOworICAg
IHdpZGdldENvbnRleHQuZ3RrUGFpbnRTbGlkZXIodGh1bWJSZWN0LCB3aWRnZXQsIGdldEd0a1N0
YXRlVHlwZShvYmplY3QpLCBHVEtfU0hBRE9XX09VVCwgZGV0YWlsLCBvcmllbnRhdGlvbik7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJU
aHVtYlNpemUoUmVuZGVyT2JqZWN0KiBvKSBjb25zdAoreworICAgIENvbnRyb2xQYXJ0IHBhcnQg
PSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChw
YXJ0ID09IE1lZGlhU2xpZGVyVGh1bWJQYXJ0KSB7CisgICAgICAgIG8tPnN0eWxlKCktPnNldFdp
ZHRoKExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAgby0+
c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVk
KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBhcnQgPT0gTWVkaWFWb2x1bWVT
bGlkZXJUaHVtYlBhcnQpCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisgICAgR3RrV2lkZ2V0
KiB3aWRnZXQgPSBwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQgPyBndGtIU2NhbGUo
KSA6IGd0a1ZTY2FsZSgpOworICAgIGludCBsZW5ndGggPSAwLCB3aWR0aCA9IDA7CisgICAgZ3Rr
X3dpZGdldF9zdHlsZV9nZXQod2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJzbGlk
ZXJfbGVuZ3RoIiwgJmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2xpZGVyX3dp
ZHRoIiwgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgaWYg
KHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCkgeworICAgICAgICBvLT5zdHlsZSgp
LT5zZXRXaWR0aChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworICAgICAgICBvLT5zdHlsZSgpLT5z
ZXRIZWlnaHQoTGVuZ3RoKHdpZHRoLCBGaXhlZCkpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KTsKKyAgICBvLT5zdHls
ZSgpLT5zZXRXaWR0aChMZW5ndGgod2lkdGgsIEZpeGVkKSk7CisgICAgby0+c3R5bGUoKS0+c2V0
SGVpZ2h0KExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Cit9CisKKyNpZiBFTkFCTEUoUFJPR1JFU1Nf
VEFHKQorYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRQcm9ncmVzc0JhcihSZW5kZXJPYmplY3Qq
IHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKCFyZW5kZXJPYmplY3QtPmlzUHJvZ3Jlc3MoKSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBHdGtXaWRnZXQqIHByb2dyZXNzQmFyV2lkZ2V0ID0gbW96X2d0
a19nZXRfcHJvZ3Jlc3Nfd2lkZ2V0KCk7CisgICAgaWYgKCFwcm9ncmVzc0JhcldpZGdldCkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAocGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19Q
Uk9HUkVTU0JBUiwgcmVuZGVyT2JqZWN0LCBwYWludEluZm8uY29udGV4dCwgcmVjdCkpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgSW50UmVjdCBjaHVua1JlY3QocmVjdCk7CisgICAgUmVu
ZGVyUHJvZ3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQcm9ncmVzcyhyZW5kZXJPYmpl
Y3QpOworCisgICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUocHJvZ3Jl
c3NCYXJXaWRnZXQpOworICAgIGNodW5rUmVjdC5zZXRIZWlnaHQoY2h1bmtSZWN0LmhlaWdodCgp
IC0gKDIgKiBzdHlsZS0+eXRoaWNrbmVzcykpOworICAgIGNodW5rUmVjdC5zZXRZKGNodW5rUmVj
dC55KCkgKyBzdHlsZS0+eXRoaWNrbmVzcyk7CisgICAgY2h1bmtSZWN0LnNldFdpZHRoKChjaHVu
a1JlY3Qud2lkdGgoKSAtICgyICogc3R5bGUtPnh0aGlja25lc3MpKSAqIHJlbmRlclByb2dyZXNz
LT5wb3NpdGlvbigpKTsKKyAgICBpZiAocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24o
KSA9PSBSVEwpCisgICAgICAgIGNodW5rUmVjdC5zZXRYKHJlY3QueCgpICsgcmVjdC53aWR0aCgp
IC0gY2h1bmtSZWN0LndpZHRoKCkgLSBzdHlsZS0+eHRoaWNrbmVzcyk7CisgICAgZWxzZQorICAg
ICAgICBjaHVua1JlY3Quc2V0WChjaHVua1JlY3QueCgpICsgc3R5bGUtPnh0aGlja25lc3MpOwor
CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUFJPR1JFU1NfQ0hVTkssIHJl
bmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIGNodW5rUmVjdCk7Cit9CisjZW5kaWYKKwor
Q29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENv
bG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7CisgICAg
cmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX1NFTEVD
VEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3Rr
RW50cnkoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtH
VEtfU1RBVEVfQUNUSVZFXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0
aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdp
ZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdl
dCktPnRleHRbR1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6
OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAg
IEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9n
ZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNUSVZFXTsKK30KKworQ29sb3IgUmVu
ZGVyVGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25z
dAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAgICByZXR1cm4g
Z3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdOwor
fQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3
KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NU
QVRFX0FDVElWRV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2Vs
ZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9
IGd0a1RyZWVWaWV3KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCkt
PnRleHRbR1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6Omlu
YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3Rr
V2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dl
dF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdOworfQorCitDb2xvciBSZW5k
ZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0Cit7CisgICAgc3dp
dGNoIChjc3NWYWx1ZUlkKSB7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnRleHQ6CisgICAgICAg
IHJldHVybiBDb2xvcihndGtfd2lkZ2V0X2dldF9zdHlsZShndGtCdXR0b24oKSktPmZnW0dUS19T
VEFURV9OT1JNQUxdKTsKKyAgICBjYXNlIENTU1ZhbHVlQ2FwdGlvbnRleHQ6CisgICAgICAgIHJl
dHVybiBDb2xvcihndGtfd2lkZ2V0X2dldF9zdHlsZShndGtFbnRyeSgpKS0+ZmdbR1RLX1NUQVRF
X05PUk1BTF0pOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lz
dGVtQ29sb3IoY3NzVmFsdWVJZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBndGtTdHlsZVNl
dENhbGxiYWNrKEd0a1dpZGdldCogd2lkZ2V0LCBHdGtTdHlsZSogcHJldmlvdXMsIFJlbmRlclRo
ZW1lKiByZW5kZXJUaGVtZSkKK3sKKyAgICAvLyBGSVhNRTogTWFrZSBzdXJlIHRoaXMgZnVuY3Rp
b24gZG9lc24ndCBnZXQgY2FsbGVkIG1hbnkgdGltZXMgZm9yIGEgc2luZ2xlIEdUSysgc3R5bGUg
Y2hhbmdlIHNpZ25hbC4KKyAgICByZW5kZXJUaGVtZS0+cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2Uo
KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5l
cihHdGtXaWRnZXQqIHdpZGdldCwgR3RrV2lkZ2V0KiB3aW5kb3cpIGNvbnN0Cit7CisgICAgZ3Rr
X2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih3aW5kb3cpLCB3aWRnZXQpOworICAgIGd0a193
aWRnZXRfcmVhbGl6ZSh3aWRnZXQpOworICAgIGdfb2JqZWN0X3NldF9kYXRhKEdfT0JKRUNUKHdp
ZGdldCksICJ0cmFuc3BhcmVudC1iZy1oaW50IiwgR0lOVF9UT19QT0lOVEVSKFRSVUUpKTsKKwor
ICAgIC8vIEZJWE1FOiBQZXJoYXBzIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciB0aGUg
Y29udGFpbmluZyB3aW5kb3cgb3IgcGFyZW50IGNvbnRhaW5lci4KKyAgICBnX3NpZ25hbF9jb25u
ZWN0KHdpZGdldCwgInN0eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVTZXRDYWxsYmFjayks
IGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPih0aGlzKSk7Cit9CisKK0d0a1dpZGdldCogUmVu
ZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcigpIGNvbnN0Cit7CisgICAgaWYgKG1fZ3RrQ29udGFp
bmVyKQorICAgICAgICByZXR1cm4gbV9ndGtDb250YWluZXI7CisKKyAgICBtX2d0a1dpbmRvdyA9
IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfUE9QVVApOworICAgIGd0a193aWRnZXRfc2V0X2Nv
bG9ybWFwKG1fZ3RrV2luZG93LCBtX3RoZW1lUGFydHMuY29sb3JtYXApOworICAgIGd0a193aWRn
ZXRfcmVhbGl6ZShtX2d0a1dpbmRvdyk7CisgICAgZ3RrX3dpZGdldF9zZXRfbmFtZShtX2d0a1dp
bmRvdywgIk1vemlsbGFHdGtXaWRnZXQiKTsKKworICAgIG1fZ3RrQ29udGFpbmVyID0gZ3RrX2Zp
eGVkX25ldygpOworICAgIHNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIobV9ndGtDb250YWlu
ZXIsIG1fZ3RrV2luZG93KTsKKyAgICByZXR1cm4gbV9ndGtDb250YWluZXI7Cit9CisKK0d0a1dp
ZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0J1dHRvbigpIGNvbnN0Cit7CisgICAgaWYgKG1fZ3Rr
QnV0dG9uKQorICAgICAgICByZXR1cm4gbV9ndGtCdXR0b247CisgICAgbV9ndGtCdXR0b24gPSBn
dGtfYnV0dG9uX25ldygpOworICAgIHNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIobV9ndGtC
dXR0b24sIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9ndGtCdXR0b247Cit9CisKK0d0
a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0VudHJ5KCkgY29uc3QKK3sKKyAgICBpZiAobV9n
dGtFbnRyeSkKKyAgICAgICAgcmV0dXJuIG1fZ3RrRW50cnk7CisgICAgbV9ndGtFbnRyeSA9IGd0
a19lbnRyeV9uZXcoKTsKKyAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrRW50
cnksIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9ndGtFbnRyeTsKK30KKworR3RrV2lk
Z2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrVHJlZVZpZXcoKSBjb25zdAoreworICAgIGlmIChtX2d0
a1RyZWVWaWV3KQorICAgICAgICByZXR1cm4gbV9ndGtUcmVlVmlldzsKKyAgICBtX2d0a1RyZWVW
aWV3ID0gZ3RrX3RyZWVfdmlld19uZXcoKTsKKyAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFp
bmVyKG1fZ3RrVHJlZVZpZXcsIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9ndGtUcmVl
VmlldzsKK30KKworR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrVlNjYWxlKCkgY29uc3QK
K3sKKyAgICBpZiAobV9ndGtWU2NhbGUpCisgICAgICAgIHJldHVybiBtX2d0a1ZTY2FsZTsKKyAg
ICBtX2d0a1ZTY2FsZSA9IGd0a192c2NhbGVfbmV3KDApOworICAgIHNldHVwV2lkZ2V0QW5kQWRk
VG9Db250YWluZXIobV9ndGtWU2NhbGUsIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9n
dGtWU2NhbGU7Cit9CisKK0d0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0hTY2FsZSgpIGNv
bnN0Cit7CisgICAgaWYgKG1fZ3RrSFNjYWxlKQorICAgICAgICByZXR1cm4gbV9ndGtIU2NhbGU7
CisgICAgbV9ndGtIU2NhbGUgPSBndGtfaHNjYWxlX25ldygwKTsKKyAgICBzZXR1cFdpZGdldEFu
ZEFkZFRvQ29udGFpbmVyKG1fZ3RrSFNjYWxlLCBndGtDb250YWluZXIoKSk7CisgICAgcmV0dXJu
IG1fZ3RrSFNjYWxlOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtTY3JvbGxi
YXIoKQoreworICAgIHJldHVybiBtb3pfZ3RrX2dldF9zY3JvbGxiYXJfd2lkZ2V0KCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEdUS19BUElfVkVSU0lPTl8yCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azMuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGszLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZDEyNzc1
OWVjNzUzZDI2ZmNiZWU2NjgwMWI4YWFhZDRiNjkzMGRiCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGszLmNwcApAQCAtMCwwICsxLDUyMyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb2xs
YWJvcmEgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtlbm5ldGggUm9oZGUgQ2hyaXN0aWFu
c2VuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZUd0ay5oIgorCisjaWZuZGVmIEdUS19BUElfVkVS
U0lPTl8yCisKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3RrVmVyc2lvbmluZy5oIgorI2luY2x1ZGUgIkhUTUxO
YW1lcy5oIgorI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW5jbHVkZSAiUmVu
ZGVyT2JqZWN0LmgiCisjaW5jbHVkZSAiVGV4dERpcmVjdGlvbi5oIgorI2luY2x1ZGUgIlVzZXJB
Z2VudFN0eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5oIgor
I2luY2x1ZGUgImd0a2RyYXdpbmcuaCIKKyNpbmNsdWRlIDxnZGsvZ2RrLmg+CisjaW5jbHVkZSA8
Z3RrL2d0ay5oPgorCisjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKKyNpbmNsdWRlICJSZW5kZXJQ
cm9ncmVzcy5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhpcyBpcyBu
b3QgYSBzdGF0aWMgbWV0aG9kLCBiZWNhdXNlIHdlIHdhbnQgdG8gYXZvaWQgaGF2aW5nIEdUSysg
aGVhZGVycyBpbiBSZW5kZXJUaGVtZUd0ay5oLgorZXh0ZXJuIEd0a1RleHREaXJlY3Rpb24gZ3Rr
VGV4dERpcmVjdGlvbihUZXh0RGlyZWN0aW9uKTsKKwordm9pZCBSZW5kZXJUaGVtZUd0azo6aW5p
dE1lZGlhQ29sb3JzKCkKK3sKKyAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9z
dHlsZShHVEtfV0lER0VUKGd0a0NvbnRhaW5lcigpKSk7CisgICAgbV9wYW5lbENvbG9yID0gc3R5
bGUtPmJnW0dUS19TVEFURV9OT1JNQUxdOworICAgIG1fc2xpZGVyQ29sb3IgPSBzdHlsZS0+Ymdb
R1RLX1NUQVRFX0FDVElWRV07CisgICAgbV9zbGlkZXJUaHVtYkNvbG9yID0gc3R5bGUtPmJnW0dU
S19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0d0a1N0YXRlVHlwZSBSZW5kZXJUaGVtZUd0azo6Z2V0
R3RrU3RhdGVUeXBlKFJlbmRlck9iamVjdCogb2JqZWN0KQoreworICAgIGlmICghaXNFbmFibGVk
KG9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wob2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIEdU
S19TVEFURV9JTlNFTlNJVElWRTsKKyAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkpCisgICAgICAg
IHJldHVybiBHVEtfU1RBVEVfQUNUSVZFOworICAgIGlmIChpc0hvdmVyZWQob2JqZWN0KSkKKyAg
ICAgICAgcmV0dXJuIEdUS19TVEFURV9QUkVMSUdIVDsKKyAgICByZXR1cm4gR1RLX1NUQVRFX05P
Uk1BTDsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRSZW5kZXJPYmplY3QoR3RrVGhl
bWVXaWRnZXRUeXBlIHR5cGUsIFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBmbGFncykKK3sKKyAgICAv
LyBQYWludGluZyBpcyBkaXNhYmxlZCBzbyBqdXN0IGNsYWltIHRvIGhhdmUgc3VjY2VlZGVkCisg
ICAgaWYgKGNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgR3RrV2lkZ2V0U3RhdGUgd2lkZ2V0U3RhdGU7CisgICAgd2lkZ2V0U3RhdGUuYWN0
aXZlID0gaXNQcmVzc2VkKHJlbmRlck9iamVjdCk7CisgICAgd2lkZ2V0U3RhdGUuZm9jdXNlZCA9
IGlzRm9jdXNlZChyZW5kZXJPYmplY3QpOworCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTE4MzY0CisgICAgLy8gVGhlIE1vemlsbGEgdGhlbWUgZHJhd2lu
ZyBjb2RlLCBvbmx5IHBhaW50cyBhIGJ1dHRvbiBhcyBwcmVzc2VkIHdoZW4gaXQncyBwcmVzc2Vk
IAorICAgIC8vIHdoaWxlIGhvdmVyZWQuIFVudGlsIHdlIG1vdmUgYXdheSBmcm9tIHRoZSBNb3pp
bGEgY29kZSwgd29yay1hcm91bmQgdGhlIGlzc3VlIGJ5CisgICAgLy8gZm9yY2luZyBhIHByZXNz
ZWQgYnV0dG9uIGludG8gdGhlIGhvdmVyZWQgc3RhdGUuIFRoaXMgZW5zdXJlcyB0aGF0IGJ1dHRv
bnMgYWN0aXZhdGVkCisgICAgLy8gdmlhIHRoZSBrZXlib2FyZCBoYXZlIHRoZSBwcm9wZXIgcmVu
ZGVyaW5nLgorICAgIHdpZGdldFN0YXRlLmluSG92ZXIgPSBpc0hvdmVyZWQocmVuZGVyT2JqZWN0
KSB8fCAodHlwZSA9PSBNT1pfR1RLX0JVVFRPTiAmJiBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSk7
CisKKyAgICAvLyBGSVhNRTogRGlzYWJsZWQgZG9lcyBub3QgYWx3YXlzIGdpdmUgdGhlIGNvcnJl
Y3QgYXBwZWFyYW5jZSBmb3IgUmVhZE9ubHkKKyAgICB3aWRnZXRTdGF0ZS5kaXNhYmxlZCA9ICFp
c0VuYWJsZWQocmVuZGVyT2JqZWN0KSB8fCBpc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3Qp
OworICAgIHdpZGdldFN0YXRlLmlzRGVmYXVsdCA9IGZhbHNlOworICAgIHdpZGdldFN0YXRlLmNh
bkRlZmF1bHQgPSBmYWxzZTsKKyAgICB3aWRnZXRTdGF0ZS5kZXByZXNzZWQgPSBmYWxzZTsKKwor
ICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChjb250ZXh0LCByZWN0KTsK
KyAgICByZXR1cm4gIXdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KHR5cGUsICZ3aWRn
ZXRTdGF0ZSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkp
KTsKK30KKworc3RhdGljIHZvaWQgc2V0VG9nZ2xlU2l6ZShjb25zdCBSZW5kZXJUaGVtZUd0ayog
dGhlbWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkKK3sKKyAg
ICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHNvIHdlIHNob3Vs
ZG4ndCBjaGFuZ2UgdGhlbS4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JB
dXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IGNvcnJlY3QgdXNlIG9mIGluZGljYXRv
clNpemUgYW5kIGluZGljYXRvclNwYWNpbmcuCisgICAgZ2ludCBpbmRpY2F0b3JTaXplLCBpbmRp
Y2F0b3JTcGFjaW5nOworICAgIHRoZW1lLT5nZXRJbmRpY2F0b3JNZXRyaWNzKGFwcGVhcmFuY2Us
IGluZGljYXRvclNpemUsIGluZGljYXRvclNwYWNpbmcpOworCisgICAgLy8gT3RoZXIgcG9ydHMg
aGFyZC1jb2RlIHRoaXMgdG8gMTMsIGJ1dCBHVEsrIHVzZXJzIHRlbmQgdG8gZGVtYW5kIHRoZSBu
YXRpdmUgbG9vay4KKyAgICAvLyBJdCBjb3VsZCBiZSBtYWRlIGEgY29uZmlndXJhdGlvbiBvcHRp
b24gdmFsdWVzIG90aGVyIHRoYW4gMTMgYWN0dWFsbHkgYnJlYWsgc2l0ZSBjb21wYXRpYmlsaXR5
LgorICAgIGludCBsZW5ndGggPSBpbmRpY2F0b3JTaXplICsgaW5kaWNhdG9yU3BhY2luZzsKKyAg
ICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAgICAgc3R5bGUt
PnNldFdpZHRoKExlbmd0aChsZW5ndGgsIEZpeGVkKSk7CisKKyAgICBpZiAoc3R5bGUtPmhlaWdo
dCgpLmlzQXV0bygpKQorICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChsZW5ndGgsIEZp
eGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldENoZWNrYm94U2l6ZShSZW5kZXJT
dHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgc2V0VG9nZ2xlU2l6ZSh0aGlzLCBzdHlsZSwgUmFk
aW9QYXJ0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRDaGVja2JveChSZW5kZXJP
YmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0
KQoreworICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0NIRUNLQlVUVE9OLCBv
YmplY3QsIGluZm8uY29udGV4dCwgcmVjdCwgaXNDaGVja2VkKG9iamVjdCkpOworfQorCit2b2lk
IFJlbmRlclRoZW1lR3RrOjpzZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAor
eworICAgIHNldFRvZ2dsZVNpemUodGhpcywgc3R5bGUsIFJhZGlvUGFydCk7Cit9CisKK2Jvb2wg
UmVuZGVyVGhlbWVHdGs6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBh
aW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRS
ZW5kZXJPYmplY3QoTU9aX0dUS19SQURJT0JVVFRPTiwgb2JqZWN0LCBpbmZvLmNvbnRleHQsIHJl
Y3QsIGlzQ2hlY2tlZChvYmplY3QpKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRC
dXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3Qg
SW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoaW5mby5jb250ZXh0LT5wYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3Rr
QnV0dG9uKCk7CisgICAgSW50UmVjdCBidXR0b25SZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgp
KTsKKyAgICBJbnRSZWN0IGZvY3VzUmVjdChidXR0b25SZWN0KTsKKworICAgIEd0a1N0YXRlVHlw
ZSBzdGF0ZSA9IGdldEd0a1N0YXRlVHlwZShvYmplY3QpOworICAgIGd0a193aWRnZXRfc2V0X3N0
YXRlKHdpZGdldCwgc3RhdGUpOworICAgIGd0a193aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQs
IGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworCisgICAg
aWYgKGlzRm9jdXNlZChvYmplY3QpKSB7CisgICAgICAgIGlmIChpc0VuYWJsZWQob2JqZWN0KSkg
eworI2lmICFHVEtfQ0hFQ0tfVkVSU0lPTigyLCAyMiwgMCkKKyAgICAgICAgICAgIEdUS19XSURH
RVRfU0VUX0ZMQUdTKHdpZGdldCwgR1RLX0hBU19GT0NVUyk7CisjZW5kaWYKKyAgICAgICAgICAg
IGdfb2JqZWN0X3NldCh3aWRnZXQsICJoYXMtZm9jdXMiLCBUUlVFLCBOVUxMKTsKKyAgICAgICAg
fQorCisgICAgICAgIGdib29sZWFuIGludGVyaW9yRm9jdXMgPSAwLCBmb2N1c1dpZHRoID0gMCwg
Zm9jdXNQYWRkaW5nID0gMDsKKyAgICAgICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQod2lkZ2V0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JG
b2N1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzLWxpbmUtd2lkdGgiLCAm
Zm9jdXNXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzLXBhZGRpbmci
LCAmZm9jdXNQYWRkaW5nLCBOVUxMKTsKKyAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGV4dGVy
aW9yIGZvY3VzLCB3ZSBzaHJpbmsgdGhlIGJ1dHRvbiByZWN0IGRvd24gYmVmb3JlCisgICAgICAg
IC8vIGRyYXdpbmcuIElmIHdlIGFyZSB1c2luZyBpbnRlcmlvciBmb2N1cyB3ZSBzaHJpbmsgdGhl
IGZvY3VzIHJlY3QuIFRoaXMKKyAgICAgICAgLy8gYXBwcm9hY2ggb3JpZ2luYXRlcyBmcm9tIHRo
ZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29kZSAoZ3RrMmRyYXdpbmcuYykuCisgICAgICAgIGlm
IChpbnRlcmlvckZvY3VzKSB7CisgICAgICAgICAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lk
Z2V0X2dldF9zdHlsZSh3aWRnZXQpOworICAgICAgICAgICAgZm9jdXNSZWN0LmluZmxhdGVYKC1z
dHlsZS0+eHRoaWNrbmVzcyAtIGZvY3VzUGFkZGluZyk7CisgICAgICAgICAgICBmb2N1c1JlY3Qu
aW5mbGF0ZVkoLXN0eWxlLT55dGhpY2tuZXNzIC0gZm9jdXNQYWRkaW5nKTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIGJ1dHRvblJlY3QuaW5mbGF0ZVgoLWZvY3VzV2lkdGggLSBmb2N1
c1BhZGRpbmcpOworICAgICAgICAgICAgYnV0dG9uUmVjdC5pbmZsYXRlWSgtZm9jdXNQYWRkaW5n
IC0gZm9jdXNQYWRkaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFdpZGdldFJlbmRlcmlu
Z0NvbnRleHQgd2lkZ2V0Q29udGV4dChpbmZvLmNvbnRleHQsIHJlY3QpOworICAgIEd0a1NoYWRv
d1R5cGUgc2hhZG93VHlwZSA9IHN0YXRlID09IEdUS19TVEFURV9BQ1RJVkUgPyBHVEtfU0hBRE9X
X0lOIDogR1RLX1NIQURPV19PVVQ7CisgICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEJveChidXR0
b25SZWN0LCB3aWRnZXQsIHN0YXRlLCBzaGFkb3dUeXBlLCAiYnV0dG9uIik7CisgICAgaWYgKGlz
Rm9jdXNlZChvYmplY3QpKQorICAgICAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50Rm9jdXMoZm9j
dXNSZWN0LCB3aWRnZXQsIHN0YXRlLCAiYnV0dG9uIik7CisKKyNpZiAhR1RLX0NIRUNLX1ZFUlNJ
T04oMiwgMjIsIDApCisgICAgR1RLX1dJREdFVF9VTlNFVF9GTEFHUyh3aWRnZXQsIEdUS19IQVNf
Rk9DVVMpOworI2VuZGlmCisgICAgZ19vYmplY3Rfc2V0KHdpZGdldCwgImhhcy1mb2N1cyIsIEZB
TFNFLCBOVUxMKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdldENvbWJv
Qm94UGFkZGluZyhSZW5kZXJTdHlsZSogc3R5bGUsIGludCYgbGVmdCwgaW50JiB0b3AsIGludCYg
cmlnaHQsIGludCYgYm90dG9tKQoreworICAgIC8vIElmIHRoaXMgbWVudSBsaXN0IGJ1dHRvbiBp
c24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZQorICAgIC8vIGRvbid0IGFkZCBh
bnkgZXh0cmEgcGFkZGluZyBiZXlvbmQgd2hhdCBXZWJDb3JlIGFscmVhZHkgdXNlcy4KKyAgICBp
ZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICByZXR1cm47
CisgICAgbW96X2d0a19nZXRfd2lkZ2V0X2JvcmRlcihNT1pfR1RLX0RST1BET1dOLCAmbGVmdCwg
JnRvcCwgJnJpZ2h0LCAmYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Rr
VGV4dERpcmVjdGlvbihzdHlsZS0+ZGlyZWN0aW9uKCkpLCBUUlVFKTsKK30KKworaW50IFJlbmRl
clRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBj
b25zdAoreworICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAw
OworICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9t
KTsKKyAgICByZXR1cm4gbGVmdDsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVy
bmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgbGVm
dCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKKyAgICBnZXRDb21ib0JveFBh
ZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJuIHJpZ2h0
OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nVG9wKFJlbmRl
clN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0
ID0gMCwgYm90dG9tID0gMDsKKyAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRv
cCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJuIHRvcDsKK30KKworaW50IFJlbmRlclRoZW1l
R3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0JvdHRvbShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
Cit7CisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Cisg
ICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwor
ICAgIHJldHVybiBib3R0b207Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxp
c3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19EUk9Q
RE9XTiwgb2JqZWN0LCBpbmZvLmNvbnRleHQsIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1l
R3RrOjpwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50TWVu
dUxpc3Qob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0
VGV4dElucHV0Qm9yZGVycyhSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8gSWYg
dGhpcyBjb250cm9sIGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRpdmUgdGhlbWUsIHdlIGRvbid0
IHRvdWNoIHRoZSBib3JkZXJzLgorICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE5vQ29u
dHJvbFBhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGNhbm5vdCBnaXZlIGEgcHJv
cGVyIHJlbmRlcmluZyB3aGVuIGJvcmRlciByYWRpdXMgaXMgYWN0aXZlLCB1bmZvcnR1bmF0ZWx5
LgorICAgIHN0eWxlLT5yZXNldEJvcmRlclJhZGl1cygpOworCisgICAgaW50IGxlZnQgPSAwLCB0
b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7CisgICAgbW96X2d0a19nZXRfd2lkZ2V0X2Jv
cmRlcihNT1pfR1RLX0VOVFJZLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihzdHlsZS0+ZGlyZWN0aW9u
KCkpLCBUUlVFKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyTGVmdFdpZHRoKGxlZnQpOworICAgIHN0
eWxlLT5zZXRCb3JkZXJUb3BXaWR0aCh0b3ApOworICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFdp
ZHRoKHJpZ2h0KTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyQm90dG9tV2lkdGgoYm90dG9tKTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvYmpl
Y3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBy
ZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19FTlRSWSwgb2JqZWN0LCBpbmZvLmNvbnRl
eHQsIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRyYWNrKFJl
bmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKGluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gb2JqZWN0LT5zdHls
ZSgpLT5hcHBlYXJhbmNlKCk7CisgICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVySG9yaXpvbnRhbFBh
cnQgfHwgcGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpOworCisgICAgLy8gV2Ugc2hyaW5rIHRo
ZSB0cm91Z2ggcmVjdCBzbGlnaHRseSB0byBtYWtlIHJvb20gZm9yIHRoZSBmb2N1cyBpbmRpY2F0
b3IuCisgICAgSW50UmVjdCB0cm91Z2hSZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKTsgLy8g
VGhpcyBpcyByZWxhdGl2ZSB0byByZWN0LgorICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gMDsKKyAg
ICBpZiAocGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgd2lkZ2V0ID0gZ3Rr
VlNjYWxlKCk7CisgICAgICAgIHRyb3VnaFJlY3QuaW5mbGF0ZVkoLWd0a193aWRnZXRfZ2V0X3N0
eWxlKHdpZGdldCktPnl0aGlja25lc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdpZGdldCA9
IGd0a0hTY2FsZSgpOworICAgICAgICB0cm91Z2hSZWN0LmluZmxhdGVYKC1ndGtfd2lkZ2V0X2dl
dF9zdHlsZSh3aWRnZXQpLT54dGhpY2tuZXNzKTsKKyAgICB9CisgICAgZ3RrX3dpZGdldF9zZXRf
ZGlyZWN0aW9uKHdpZGdldCwgZ3RrVGV4dERpcmVjdGlvbihvYmplY3QtPnN0eWxlKCktPmRpcmVj
dGlvbigpKSk7CisKKyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoaW5m
by5jb250ZXh0LCByZWN0KTsKKyAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50Qm94KHRyb3VnaFJl
Y3QsIHdpZGdldCwgR1RLX1NUQVRFX0FDVElWRSwgR1RLX1NIQURPV19PVVQsICJ0cm91Z2giKTsK
KyAgICBpZiAoaXNGb2N1c2VkKG9iamVjdCkpCisgICAgICAgIHdpZGdldENvbnRleHQuZ3RrUGFp
bnRGb2N1cyhJbnRSZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKSwgd2lkZ2V0LCBnZXRHdGtT
dGF0ZVR5cGUob2JqZWN0KSwgInRyb3VnaCIpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCiti
b29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0
LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYg
KGluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gb2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7
CisgICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09
IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KTsKKworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gMDsK
KyAgICBjb25zdCBjaGFyKiBkZXRhaWwgPSAwOworICAgIEd0a09yaWVudGF0aW9uIG9yaWVudGF0
aW9uOworICAgIGlmIChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KSB7CisgICAgICAg
IHdpZGdldCA9IGd0a1ZTY2FsZSgpOworICAgICAgICBkZXRhaWwgPSAidnNjYWxlIjsKKyAgICAg
ICAgb3JpZW50YXRpb24gPSBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUw7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgd2lkZ2V0ID0gZ3RrSFNjYWxlKCk7CisgICAgICAgIGRldGFpbCA9ICJoc2NhbGUi
OworICAgICAgICBvcmllbnRhdGlvbiA9IEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMOworICAg
IH0KKyAgICBndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb24od2lkZ2V0LCBndGtUZXh0RGlyZWN0aW9u
KG9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKKworICAgIC8vIE9ubHkgc29tZSB0aGVt
ZXMgaGF2ZSBzbGlkZXIgdGh1bWJzIHJlc3BvbmQgdG8gY2xpY2tzIGFuZCBzb21lIGRvbid0LiBU
aGlzIGluZm9ybWF0aW9uIGlzCisgICAgLy8gZ2F0aGVyZWQgdmlhIHRoZSAnYWN0aXZhdGUtc2xp
ZGVyJyBwcm9wZXJ0eSwgYnV0IGl0J3MgZGVwcmVjYXRlZCBpbiBHVEsrIDIuMjIgYW5kIHJlbW92
ZWQgaW4KKyAgICAvLyBHVEsrIDMueC4gVGhlIGRyYXdiYWNrIG9mIG5vdCBob25vcmluZyBpdCBp
cyB0aGF0IHNsaWRlciB0aHVtYnMgY2hhbmdlIGNvbG9yIHdoZW4geW91IGNsaWNrCisgICAgLy8g
b24gdGhlbS4gCisgICAgSW50UmVjdCB0aHVtYlJlY3QoSW50UG9pbnQoKSwgcmVjdC5zaXplKCkp
OworICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChpbmZvLmNvbnRleHQs
IHJlY3QpOworICAgIHdpZGdldENvbnRleHQuZ3RrUGFpbnRTbGlkZXIodGh1bWJSZWN0LCB3aWRn
ZXQsIGdldEd0a1N0YXRlVHlwZShvYmplY3QpLCBHVEtfU0hBRE9XX09VVCwgZGV0YWlsLCBvcmll
bnRhdGlvbik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjph
ZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyT2JqZWN0KiBvKSBjb25zdAoreworICAgIENvbnRy
b2xQYXJ0IHBhcnQgPSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7CisjaWYgRU5BQkxFKFZJREVP
KQorICAgIGlmIChwYXJ0ID09IE1lZGlhU2xpZGVyVGh1bWJQYXJ0KSB7CisgICAgICAgIG8tPnN0
eWxlKCktPnNldFdpZHRoKExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsK
KyAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJI
ZWlnaHQsIEZpeGVkKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBhcnQgPT0g
TWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQpCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisg
ICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQg
PyBndGtIU2NhbGUoKSA6IGd0a1ZTY2FsZSgpOworICAgIGludCBsZW5ndGggPSAwLCB3aWR0aCA9
IDA7CisgICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQod2lkZ2V0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICJzbGlkZXJfbGVuZ3RoIiwgJmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAic2xpZGVyX3dpZHRoIiwgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwp
OworCisgICAgaWYgKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCkgeworICAgICAg
ICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworICAgICAgICBv
LT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKHdpZHRoLCBGaXhlZCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KTsK
KyAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5ndGgod2lkdGgsIEZpeGVkKSk7CisgICAgby0+
c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Cit9CisKKyNpZiBFTkFC
TEUoUFJPR1JFU1NfVEFHKQorYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRQcm9ncmVzc0JhcihS
ZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFyZW5kZXJPYmplY3QtPmlzUHJvZ3Jlc3Mo
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBHdGtXaWRnZXQqIHByb2dyZXNzQmFyV2lk
Z2V0ID0gbW96X2d0a19nZXRfcHJvZ3Jlc3Nfd2lkZ2V0KCk7CisgICAgaWYgKCFwcm9ncmVzc0Jh
cldpZGdldCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAocGFpbnRSZW5kZXJPYmpl
Y3QoTU9aX0dUS19QUk9HUkVTU0JBUiwgcmVuZGVyT2JqZWN0LCBwYWludEluZm8uY29udGV4dCwg
cmVjdCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgSW50UmVjdCBjaHVua1JlY3QocmVj
dCk7CisgICAgUmVuZGVyUHJvZ3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQcm9ncmVz
cyhyZW5kZXJPYmplY3QpOworCisgICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRf
c3R5bGUocHJvZ3Jlc3NCYXJXaWRnZXQpOworICAgIGNodW5rUmVjdC5zZXRIZWlnaHQoY2h1bmtS
ZWN0LmhlaWdodCgpIC0gKDIgKiBzdHlsZS0+eXRoaWNrbmVzcykpOworICAgIGNodW5rUmVjdC5z
ZXRZKGNodW5rUmVjdC55KCkgKyBzdHlsZS0+eXRoaWNrbmVzcyk7CisgICAgY2h1bmtSZWN0LnNl
dFdpZHRoKChjaHVua1JlY3Qud2lkdGgoKSAtICgyICogc3R5bGUtPnh0aGlja25lc3MpKSAqIHJl
bmRlclByb2dyZXNzLT5wb3NpdGlvbigpKTsKKyAgICBpZiAocmVuZGVyT2JqZWN0LT5zdHlsZSgp
LT5kaXJlY3Rpb24oKSA9PSBSVEwpCisgICAgICAgIGNodW5rUmVjdC5zZXRYKHJlY3QueCgpICsg
cmVjdC53aWR0aCgpIC0gY2h1bmtSZWN0LndpZHRoKCkgLSBzdHlsZS0+eHRoaWNrbmVzcyk7Cisg
ICAgZWxzZQorICAgICAgICBjaHVua1JlY3Quc2V0WChjaHVua1JlY3QueCgpICsgc3R5bGUtPnh0
aGlja25lc3MpOworCisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUFJPR1JF
U1NfQ0hVTkssIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIGNodW5rUmVjdCk7Cit9
CisjZW5kaWYKKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9u
QmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0Vu
dHJ5KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RL
X1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5h
Y3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCog
d2lkZ2V0ID0gZ3RrRW50cnkoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lk
Z2V0KS0+YmFzZVtHVEtfU1RBVEVfQUNUSVZFXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6
OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBH
dGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0
X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVu
ZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBj
b25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKKyAgICByZXR1cm4g
Z3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNUSVZFXTsKK30K
KworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5k
Q29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsK
KyAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVf
U0VMRUNURURdOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9
IGd0a1RyZWVWaWV3KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCkt
PmJhc2VbR1RLX1NUQVRFX0FDVElWRV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3Rp
dmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRn
ZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0
eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVy
VGhlbWVHdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0
Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBn
dGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdOworfQor
CitDb2xvciBSZW5kZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0
Cit7CisgICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnRl
eHQ6CisgICAgICAgIHJldHVybiBDb2xvcihndGtfd2lkZ2V0X2dldF9zdHlsZShndGtCdXR0b24o
KSktPmZnW0dUS19TVEFURV9OT1JNQUxdKTsKKyAgICBjYXNlIENTU1ZhbHVlQ2FwdGlvbnRleHQ6
CisgICAgICAgIHJldHVybiBDb2xvcihndGtfd2lkZ2V0X2dldF9zdHlsZShndGtFbnRyeSgpKS0+
ZmdbR1RLX1NUQVRFX05PUk1BTF0pOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBSZW5k
ZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9p
ZCBndGtTdHlsZVNldENhbGxiYWNrKEd0a1dpZGdldCogd2lkZ2V0LCBHdGtTdHlsZSogcHJldmlv
dXMsIFJlbmRlclRoZW1lKiByZW5kZXJUaGVtZSkKK3sKKyAgICAvLyBGSVhNRTogTWFrZSBzdXJl
IHRoaXMgZnVuY3Rpb24gZG9lc24ndCBnZXQgY2FsbGVkIG1hbnkgdGltZXMgZm9yIGEgc2luZ2xl
IEdUSysgc3R5bGUgY2hhbmdlIHNpZ25hbC4KKyAgICByZW5kZXJUaGVtZS0+cGxhdGZvcm1Db2xv
cnNEaWRDaGFuZ2UoKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0dXBXaWRnZXRBbmRB
ZGRUb0NvbnRhaW5lcihHdGtXaWRnZXQqIHdpZGdldCwgR3RrV2lkZ2V0KiB3aW5kb3cpIGNvbnN0
Cit7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih3aW5kb3cpLCB3aWRnZXQp
OworICAgIGd0a193aWRnZXRfcmVhbGl6ZSh3aWRnZXQpOworICAgIGdfb2JqZWN0X3NldF9kYXRh
KEdfT0JKRUNUKHdpZGdldCksICJ0cmFuc3BhcmVudC1iZy1oaW50IiwgR0lOVF9UT19QT0lOVEVS
KFRSVUUpKTsKKworICAgIC8vIEZJWE1FOiBQZXJoYXBzIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2Fs
bGVkIGZvciB0aGUgY29udGFpbmluZyB3aW5kb3cgb3IgcGFyZW50IGNvbnRhaW5lci4KKyAgICBn
X3NpZ25hbF9jb25uZWN0KHdpZGdldCwgInN0eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVT
ZXRDYWxsYmFjayksIGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPih0aGlzKSk7Cit9CisKK0d0
a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcigpIGNvbnN0Cit7CisgICAgaWYg
KG1fZ3RrQ29udGFpbmVyKQorICAgICAgICByZXR1cm4gbV9ndGtDb250YWluZXI7CisKKyAgICBt
X2d0a1dpbmRvdyA9IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfUE9QVVApOworICAgIGd0a193
aWRnZXRfcmVhbGl6ZShtX2d0a1dpbmRvdyk7CisgICAgZ3RrX3dpZGdldF9zZXRfbmFtZShtX2d0
a1dpbmRvdywgIk1vemlsbGFHdGtXaWRnZXQiKTsKKworICAgIG1fZ3RrQ29udGFpbmVyID0gZ3Rr
X2ZpeGVkX25ldygpOworICAgIHNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIobV9ndGtDb250
YWluZXIsIG1fZ3RrV2luZG93KTsKKyAgICByZXR1cm4gbV9ndGtDb250YWluZXI7Cit9CisKK0d0
a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0J1dHRvbigpIGNvbnN0Cit7CisgICAgaWYgKG1f
Z3RrQnV0dG9uKQorICAgICAgICByZXR1cm4gbV9ndGtCdXR0b247CisgICAgbV9ndGtCdXR0b24g
PSBndGtfYnV0dG9uX25ldygpOworICAgIHNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIobV9n
dGtCdXR0b24sIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9ndGtCdXR0b247Cit9CisK
K0d0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0VudHJ5KCkgY29uc3QKK3sKKyAgICBpZiAo
bV9ndGtFbnRyeSkKKyAgICAgICAgcmV0dXJuIG1fZ3RrRW50cnk7CisgICAgbV9ndGtFbnRyeSA9
IGd0a19lbnRyeV9uZXcoKTsKKyAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3Rr
RW50cnksIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9ndGtFbnRyeTsKK30KKworR3Rr
V2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrVHJlZVZpZXcoKSBjb25zdAoreworICAgIGlmICht
X2d0a1RyZWVWaWV3KQorICAgICAgICByZXR1cm4gbV9ndGtUcmVlVmlldzsKKyAgICBtX2d0a1Ry
ZWVWaWV3ID0gZ3RrX3RyZWVfdmlld19uZXcoKTsKKyAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29u
dGFpbmVyKG1fZ3RrVHJlZVZpZXcsIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9ndGtU
cmVlVmlldzsKK30KKworR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrVlNjYWxlKCkgY29u
c3QKK3sKKyAgICBpZiAobV9ndGtWU2NhbGUpCisgICAgICAgIHJldHVybiBtX2d0a1ZTY2FsZTsK
KyAgICBtX2d0a1ZTY2FsZSA9IGd0a192c2NhbGVfbmV3KDApOworICAgIHNldHVwV2lkZ2V0QW5k
QWRkVG9Db250YWluZXIobV9ndGtWU2NhbGUsIGd0a0NvbnRhaW5lcigpKTsKKyAgICByZXR1cm4g
bV9ndGtWU2NhbGU7Cit9CisKK0d0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0hTY2FsZSgp
IGNvbnN0Cit7CisgICAgaWYgKG1fZ3RrSFNjYWxlKQorICAgICAgICByZXR1cm4gbV9ndGtIU2Nh
bGU7CisgICAgbV9ndGtIU2NhbGUgPSBndGtfaHNjYWxlX25ldygwKTsKKyAgICBzZXR1cFdpZGdl
dEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrSFNjYWxlLCBndGtDb250YWluZXIoKSk7CisgICAgcmV0
dXJuIG1fZ3RrSFNjYWxlOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtTY3Jv
bGxiYXIoKQoreworICAgIHJldHVybiBtb3pfZ3RrX2dldF9zY3JvbGxiYXJfd2lkZ2V0KCk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vICFHVEtfQVBJX1ZFUlNJT05f
Mgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>77699</attachid>
            <date>2010-12-30 16:10:30 -0800</date>
            <delta_ts>2010-12-30 17:06:10 -0800</delta_ts>
            <desc>Patch with Xan&apos;s suggestions</desc>
            <filename>bug-51755-20101230161030.patch</filename>
            <type>text/plain</type>
            <size>63537</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NTM0ZjQ5MjRjMWIzYTczNDI0NTA3MzNhYTI0Zjg3NTMzYzU3OGZjZC4uYmIxYTAyZWY5YmVhMDI5
NzQ3NzQzOTg5NTY3MjkwOWI2N2E0NDRhNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyOCBAQAorMjAxMC0xMi0zMCAgTWFy
dGluIFJvYmluc29uICA8bXJvYmluc29uQGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0dUS10gRm9yayBwaWVjZXMgb2YgUmVuZGVy
VGhlbWVHdGsgdGhhdCB3aWxsIGRpZmZlciBmb3IgR1RLKyAzCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MTc1NQorCisgICAgICAgIFNwbGl0IG91dCBw
aWVjZXMgb2YgUmVuZGVyVGhlbWVHdGsgaW50byBSZW5kZXJUaGVtZUd0azIgYW5kIFJlbmRlclRo
ZW1lR3RrMworICAgICAgICBpZiB0aGV5IGFyZSBnb2luZyB0byBkaWZmZXIgYmV0d2VlbiBHVEsr
IDIueCBhbmQgR1RLKyAzLnguIFRoaXMgaXMgdGhlIHByZWxpbWluYXJ5CisgICAgICAgIHN0ZXAg
dG8gbGFuZGluZyBzdXBwb3J0IGZvciB0aGUgbmV3IEdUSysgMy54IHRoZW1pbmcgQVBJLgorCisg
ICAgICAgIE5vIG5ldyB0ZXN0cy4gVGhpcyBzaG91bGQgbm90IGNoYW5nZSBmdW5jdGlvbmFsaXR5
LgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06IEFkZCBSZW5kZXJUaGVtZUd0azIgYW5kIFJl
bmRlclRoZW1lR3RrMyB0byB0aGUgc291cmNlcyBsaXN0LgorICAgICAgICAqIHBsYXRmb3JtL2d0
ay9SZW5kZXJUaGVtZUd0ay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6
YWRqdXN0VGV4dEZpZWxkU3R5bGUpOiBDYWxsIHRoZSBzZXRUZXh0SW5wdXRCb3JkZXJzIHN0YXRp
YyBtZXRob2QuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6YWRqdXN0VGV4dEFy
ZWFTdHlsZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50
TWVkaWFCdXR0b24pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjph
ZGp1c3RQcm9ncmVzc0JhclN0eWxlKTogZGl0dG8uCisgICAgICAgICogcGxhdGZvcm0vZ3RrL1Jl
bmRlclRoZW1lR3RrLmg6IE1ha2Ugc2V0VGV4dElucHV0Qm9yZGVycyBhIG1ldGhvZCwgc28gdGhh
dAorICAgICAgICBpdCBjYW4gYmUgZXhpc3QgaW4gUmVuZGVyVGhlbWVHdGt7MiwzfSBhbmQgYmUg
Y2FsbGVkIGZyb20gUmVuZGVyVGhlbWVHdGsuCisgICAgICAgICogcGxhdGZvcm0vZ3RrL1JlbmRl
clRoZW1lR3RrMi5jcHA6IEFkZGVkLiBBIGZvcmsgb2YgdGhlIGJpdHMgb2YgUmVuZGVyVGhlbWVH
dGsKKyAgICAgICAgdGhhdCB3aWxsIGV2ZW50dWFsbHkgYmUgcGxhdGZvcm0tZGVwZW5kZW50Lgor
ICAgICAgICAqIHBsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azMuY3BwOiBBZGRlZC4gRGl0dG8u
CisKIDIwMTAtMTItMjcgIEFtcnV0aCBSYWogIDxhbXJ1dGhyYWpAbW90b3JvbGEuY29tPiBhbmQg
UmF2aSBLYXNpYmhhdGxhICA8cmF2aS5rYXNpYmhhdGxhQG1vdG9yb2xhLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBNYXJ0aW4gUm9iaW5zb24uCmRpZmYgLS1naXQgYS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmFtIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQppbmRleCAzODA4Y2ExNDA4OGFlZGQw
ZWRmNDg1ZDAyNzVhNDY0NzljYjU2YzM0Li4yNGI0MjA4MWJjZGE5ZTZiMDQxMzBkYjFhNDZkNTZj
MGYzYzcxYjk1IDEwMDY0NAotLS0gYS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1dlYkNv
cmUvR05VbWFrZWZpbGUuYW0KQEAgLTM3MTAsNiArMzcxMCw4IEBAIHdlYmNvcmVndGtfc291cmNl
cyArPSBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUG9wdXBNZW51R3RrLmggXAogCVdlYkNvcmUv
cGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsv
UmVuZGVyVGhlbWVHdGsuaCBcCisJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsy
LmNwcCBcCisJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGszLmNwcCBcCiAJV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuY3BwIFwKIAlXZWJDb3JlL3BsYXRm
b3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5oIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3Jv
bGxWaWV3R3RrLmNwcCBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJU
aGVtZUd0ay5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5jcHAKaW5k
ZXggZDkyYzUwNWM2MzM2MjI5MTZlNmZkYzMyNTlhOTdiNDQ2ODkzNzM3My4uNjAxM2ViMjliZGNl
ZmNjMDRkZmQwMGIwMTYxMzczNDYxNmU3ZGNmNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9y
bS9ndGsvUmVuZGVyVGhlbWVHdGsuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRl
clRoZW1lR3RrLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2lu
Y2x1ZGUgIlJlbmRlclRoZW1lR3RrLmgiCiAKLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIK
ICNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCiAjaW5jbHVkZSAiR093blB0ci5oIgogI2lu
Y2x1ZGUgIkdyYWRpZW50LmgiCkBAIC0zNCwyMiArMzMsMTIgQEAKICNpbmNsdWRlICJIVE1MTWVk
aWFFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiTWVkaWFDb250
cm9sRWxlbWVudHMuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBs
YXRmb3JtTW91c2VFdmVudC5oIgogI2luY2x1ZGUgIlJlbmRlckJveC5oIgogI2luY2x1ZGUgIlJl
bmRlck9iamVjdC5oIgotI2luY2x1ZGUgIlNjcm9sbGJhci5oIgogI2luY2x1ZGUgIlRpbWVSYW5n
ZXMuaCIKICNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgIldpZGdl
dFJlbmRlcmluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJndGtkcmF3aW5nLmgiCiAjaW5jbHVkZSA8
Z2RrL2dkay5oPgogI2luY2x1ZGUgPGd0ay9ndGsuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+Ci0KLSNpZiBFTkFCTEUoUFJPR1JFU1NfVEFHKQotI2luY2x1ZGUgIlJlbmRlclByb2dy
ZXNzLmgiCi0jZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC04NywxNCArNzYsNiBA
QCBzdGF0aWMgR3RrSWNvblNpemUgZ2V0TWVkaWFCdXR0b25JY29uU2l6ZShpbnQgbWVkaWFJY29u
U2l6ZSkKICAgICByZXR1cm4gaWNvblNpemU7CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVHdGs6Omlu
aXRNZWRpYUNvbG9ycygpCi17Ci0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRf
c3R5bGUoR1RLX1dJREdFVChndGtDb250YWluZXIoKSkpOwotICAgIG1fcGFuZWxDb2xvciA9IHN0
eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXTsKLSAgICBtX3NsaWRlckNvbG9yID0gc3R5bGUtPmJn
W0dUS19TVEFURV9BQ1RJVkVdOwotICAgIG1fc2xpZGVyVGh1bWJDb2xvciA9IHN0eWxlLT5iZ1tH
VEtfU1RBVEVfU0VMRUNURURdOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjppbml0TWVkaWFC
dXR0b25zKCkKIHsKICAgICBzdGF0aWMgYm9vbCBpY29uc0luaXRpYWxpemVkID0gZmFsc2U7CkBA
IC0yMTksMTcgKzIwMCw2IEBAIHN0YXRpYyBib29sIHN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQg
YXBwZWFyYW5jZSkKICAgICB9CiB9CiAKLUd0a1N0YXRlVHlwZSBSZW5kZXJUaGVtZUd0azo6Z2V0
R3RrU3RhdGVUeXBlKFJlbmRlck9iamVjdCogb2JqZWN0KQotewotICAgIGlmICghaXNFbmFibGVk
KG9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wob2JqZWN0KSkKLSAgICAgICAgcmV0dXJuIEdU
S19TVEFURV9JTlNFTlNJVElWRTsKLSAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkpCi0gICAgICAg
IHJldHVybiBHVEtfU1RBVEVfQUNUSVZFOwotICAgIGlmIChpc0hvdmVyZWQob2JqZWN0KSkKLSAg
ICAgICAgcmV0dXJuIEdUS19TVEFURV9QUkVMSUdIVDsKLSAgICByZXR1cm4gR1RLX1NUQVRFX05P
Uk1BTDsKLX0KLQogYm9vbCBSZW5kZXJUaGVtZUd0azo6c3VwcG9ydHNGb2N1c1JpbmcoY29uc3Qg
UmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAogewogICAgIHJldHVybiBzdXBwb3J0c0ZvY3VzKHN0
eWxlLT5hcHBlYXJhbmNlKCkpOwpAQCAtMjU1LDcgKzIyNSwxMCBAQCBpbnQgUmVuZGVyVGhlbWVH
dGs6OmJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0KiBvKSBjb25zdAogICAgIHJl
dHVybiBSZW5kZXJUaGVtZTo6YmFzZWxpbmVQb3NpdGlvbihvKTsKIH0KIAotc3RhdGljIEd0a1Rl
eHREaXJlY3Rpb24gZ3RrVGV4dERpcmVjdGlvbihUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbikKKy8v
IFRoaXMgaXMgdXNlZCBpbiBSZW5kZXJUaGVtZUd0azIgYW5kIFJlbmRlclRoZW1lR3RrMy4gTm9y
bWFsbHksIGl0IHdvdWxkIGJlIGluCisvLyB0aGUgUmVuZGVyVGhlbWVHdGsgaGVhZGVyIChwZXJo
YXBzIGFzIGEgc3RhdGljIG1ldGhvZCksIGJ1dCB3ZSB3YW50IHRvIGF2b2lkCisvLyBoYXZpbmcg
dG8gaW5jbHVkZSBHVEsrIGhlYWRlcnMgb25seSBmb3IgdGhlIEd0a1RleHREaXJlY3Rpb24gZW51
bS4KK0d0a1RleHREaXJlY3Rpb24gZ3RrVGV4dERpcmVjdGlvbihUZXh0RGlyZWN0aW9uIGRpcmVj
dGlvbikKIHsKICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgIGNhc2UgUlRMOgpAQCAtMjc5
LDczICsyNTIsNiBAQCBHdGtTdGF0ZVR5cGUgUmVuZGVyVGhlbWVHdGs6Omd0a0ljb25TdGF0ZShS
ZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCkKICAgICByZXR1cm4gR1RLX1NUQVRFX05PUk1BTDsK
IH0KIAotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRSZW5kZXJPYmplY3QoR3RrVGhlbWVXaWRn
ZXRUeXBlIHR5cGUsIFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBmbGFncykKLXsKLSAgICAvLyBQYWlu
dGluZyBpcyBkaXNhYmxlZCBzbyBqdXN0IGNsYWltIHRvIGhhdmUgc3VjY2VlZGVkCi0gICAgaWYg
KGNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgR3RrV2lkZ2V0U3RhdGUgd2lkZ2V0U3RhdGU7Ci0gICAgd2lkZ2V0U3RhdGUuYWN0aXZlID0g
aXNQcmVzc2VkKHJlbmRlck9iamVjdCk7Ci0gICAgd2lkZ2V0U3RhdGUuZm9jdXNlZCA9IGlzRm9j
dXNlZChyZW5kZXJPYmplY3QpOwotCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTE4MzY0Ci0gICAgLy8gVGhlIE1vemlsbGEgdGhlbWUgZHJhd2luZyBjb2Rl
LCBvbmx5IHBhaW50cyBhIGJ1dHRvbiBhcyBwcmVzc2VkIHdoZW4gaXQncyBwcmVzc2VkIAotICAg
IC8vIHdoaWxlIGhvdmVyZWQuIFVudGlsIHdlIG1vdmUgYXdheSBmcm9tIHRoZSBNb3ppbGEgY29k
ZSwgd29yay1hcm91bmQgdGhlIGlzc3VlIGJ5Ci0gICAgLy8gZm9yY2luZyBhIHByZXNzZWQgYnV0
dG9uIGludG8gdGhlIGhvdmVyZWQgc3RhdGUuIFRoaXMgZW5zdXJlcyB0aGF0IGJ1dHRvbnMgYWN0
aXZhdGVkCi0gICAgLy8gdmlhIHRoZSBrZXlib2FyZCBoYXZlIHRoZSBwcm9wZXIgcmVuZGVyaW5n
LgotICAgIHdpZGdldFN0YXRlLmluSG92ZXIgPSBpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSB8fCAo
dHlwZSA9PSBNT1pfR1RLX0JVVFRPTiAmJiBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSk7Ci0KLSAg
ICAvLyBGSVhNRTogRGlzYWJsZWQgZG9lcyBub3QgYWx3YXlzIGdpdmUgdGhlIGNvcnJlY3QgYXBw
ZWFyYW5jZSBmb3IgUmVhZE9ubHkKLSAgICB3aWRnZXRTdGF0ZS5kaXNhYmxlZCA9ICFpc0VuYWJs
ZWQocmVuZGVyT2JqZWN0KSB8fCBpc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3QpOwotICAg
IHdpZGdldFN0YXRlLmlzRGVmYXVsdCA9IGZhbHNlOwotICAgIHdpZGdldFN0YXRlLmNhbkRlZmF1
bHQgPSBmYWxzZTsKLSAgICB3aWRnZXRTdGF0ZS5kZXByZXNzZWQgPSBmYWxzZTsKLQotICAgIFdp
ZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChjb250ZXh0LCByZWN0KTsKLSAgICBy
ZXR1cm4gIXdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KHR5cGUsICZ3aWRnZXRTdGF0
ZSwgZmxhZ3MsIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rp
b24oKSkpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRUb2dnbGVTaXplKGNvbnN0IFJlbmRlclRoZW1l
R3RrKiB0aGVtZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBDb250cm9sUGFydCBhcHBlYXJhbmNlKQot
ewotICAgIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgc28gd2Ug
c2hvdWxkbid0IGNoYW5nZSB0aGVtLgotICAgIGlmICghc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5z
aWNPckF1dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBub3QgY29ycmVjdCB1c2Ugb2YgaW5k
aWNhdG9yU2l6ZSBhbmQgaW5kaWNhdG9yU3BhY2luZy4KLSAgICBnaW50IGluZGljYXRvclNpemUs
IGluZGljYXRvclNwYWNpbmc7Ci0gICAgdGhlbWUtPmdldEluZGljYXRvck1ldHJpY3MoYXBwZWFy
YW5jZSwgaW5kaWNhdG9yU2l6ZSwgaW5kaWNhdG9yU3BhY2luZyk7Ci0KLSAgICAvLyBPdGhlciBw
b3J0cyBoYXJkLWNvZGUgdGhpcyB0byAxMywgYnV0IEdUSysgdXNlcnMgdGVuZCB0byBkZW1hbmQg
dGhlIG5hdGl2ZSBsb29rLgotICAgIC8vIEl0IGNvdWxkIGJlIG1hZGUgYSBjb25maWd1cmF0aW9u
IG9wdGlvbiB2YWx1ZXMgb3RoZXIgdGhhbiAxMyBhY3R1YWxseSBicmVhayBzaXRlIGNvbXBhdGli
aWxpdHkuCi0gICAgaW50IGxlbmd0aCA9IGluZGljYXRvclNpemUgKyBpbmRpY2F0b3JTcGFjaW5n
OwotICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQotICAgICAgICBz
dHlsZS0+c2V0V2lkdGgoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKLQotICAgIGlmIChzdHlsZS0+
aGVpZ2h0KCkuaXNBdXRvKCkpCi0gICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKGxlbmd0
aCwgRml4ZWQpKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0Q2hlY2tib3hTaXplKFJl
bmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBzZXRUb2dnbGVTaXplKHRoaXMsIHN0eWxl
LCBSYWRpb1BhcnQpOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludENoZWNrYm94KFJl
bmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQot
ewotICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0NIRUNLQlVUVE9OLCBvLCBp
LmNvbnRleHQsIHJlY3QsIGlzQ2hlY2tlZChvKSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6
OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgc2V0VG9nZ2xl
U2l6ZSh0aGlzLCBzdHlsZSwgUmFkaW9QYXJ0KTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6
cGFpbnRSYWRpbyhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50
UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19SQURJ
T0JVVFRPTiwgbywgaS5jb250ZXh0LCByZWN0LCBpc0NoZWNrZWQobykpOwotfQotCiB2b2lkIFJl
bmRlclRoZW1lR3RrOjphZGp1c3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3Rv
ciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBXZWJDb3JlOjpFbGVtZW50KiBlKSBjb25zdAogewogICAg
IC8vIFNvbWUgbGF5b3V0IHRlc3RzIGNoZWNrIGV4cGxpY2l0bHkgdGhhdCBidXR0b25zIGlnbm9y
ZSBsaW5lLWhlaWdodC4KQEAgLTM1Myw5NiArMjU5LDYgQEAgdm9pZCBSZW5kZXJUaGVtZUd0azo6
YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxl
KgogICAgICAgICBzdHlsZS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVI
ZWlnaHQoKSk7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50QnV0dG9uKFJlbmRlck9i
amVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Ci17Ci0gICAgaWYgKGluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0J1dHRvbigpOwotICAg
IEludFJlY3QgYnV0dG9uUmVjdChJbnRQb2ludCgpLCByZWN0LnNpemUoKSk7Ci0gICAgSW50UmVj
dCBmb2N1c1JlY3QoYnV0dG9uUmVjdCk7Ci0KLSAgICBHdGtTdGF0ZVR5cGUgc3RhdGUgPSBnZXRH
dGtTdGF0ZVR5cGUob2JqZWN0KTsKLSAgICBndGtfd2lkZ2V0X3NldF9zdGF0ZSh3aWRnZXQsIHN0
YXRlKTsKLSAgICBndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb24od2lkZ2V0LCBndGtUZXh0RGlyZWN0
aW9uKG9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKTsKLQotICAgIGlmIChpc0ZvY3VzZWQo
b2JqZWN0KSkgewotICAgICAgICBpZiAoaXNFbmFibGVkKG9iamVjdCkpIHsKLSNpZiAhR1RLX0NI
RUNLX1ZFUlNJT04oMiwgMjIsIDApCi0gICAgICAgICAgICBHVEtfV0lER0VUX1NFVF9GTEFHUyh3
aWRnZXQsIEdUS19IQVNfRk9DVVMpOwotI2VuZGlmCi0gICAgICAgICAgICBnX29iamVjdF9zZXQo
d2lkZ2V0LCAiaGFzLWZvY3VzIiwgVFJVRSwgTlVMTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBn
Ym9vbGVhbiBpbnRlcmlvckZvY3VzID0gMCwgZm9jdXNXaWR0aCA9IDAsIGZvY3VzUGFkZGluZyA9
IDA7Ci0gICAgICAgIGd0a193aWRnZXRfc3R5bGVfZ2V0KHdpZGdldCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImludGVyaW9yLWZvY3VzIiwgJmludGVyaW9yRm9jdXMsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJmb2N1cy1saW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkZGlu
ZywgTlVMTCk7Ci0gICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBleHRlcmlvciBmb2N1cywgd2Ug
c2hyaW5rIHRoZSBidXR0b24gcmVjdCBkb3duIGJlZm9yZQotICAgICAgICAvLyBkcmF3aW5nLiBJ
ZiB3ZSBhcmUgdXNpbmcgaW50ZXJpb3IgZm9jdXMgd2Ugc2hyaW5rIHRoZSBmb2N1cyByZWN0LiBU
aGlzCi0gICAgICAgIC8vIGFwcHJvYWNoIG9yaWdpbmF0ZXMgZnJvbSB0aGUgTW96aWxsYSB0aGVt
ZSBkcmF3aW5nIGNvZGUgKGd0azJkcmF3aW5nLmMpLgotICAgICAgICBpZiAoaW50ZXJpb3JGb2N1
cykgewotICAgICAgICAgICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUo
d2lkZ2V0KTsKLSAgICAgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlWCgtc3R5bGUtPnh0aGlja25l
c3MgLSBmb2N1c1BhZGRpbmcpOwotICAgICAgICAgICAgZm9jdXNSZWN0LmluZmxhdGVZKC1zdHls
ZS0+eXRoaWNrbmVzcyAtIGZvY3VzUGFkZGluZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBidXR0b25SZWN0LmluZmxhdGVYKC1mb2N1c1dpZHRoIC0gZm9jdXNQYWRkaW5nKTsKLSAg
ICAgICAgICAgIGJ1dHRvblJlY3QuaW5mbGF0ZVkoLWZvY3VzUGFkZGluZyAtIGZvY3VzUGFkZGlu
Zyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdl
dENvbnRleHQoaW5mby5jb250ZXh0LCByZWN0KTsKLSAgICBHdGtTaGFkb3dUeXBlIHNoYWRvd1R5
cGUgPSBzdGF0ZSA9PSBHVEtfU1RBVEVfQUNUSVZFID8gR1RLX1NIQURPV19JTiA6IEdUS19TSEFE
T1dfT1VUOwotICAgIHdpZGdldENvbnRleHQuZ3RrUGFpbnRCb3goYnV0dG9uUmVjdCwgd2lkZ2V0
LCBzdGF0ZSwgc2hhZG93VHlwZSwgImJ1dHRvbiIpOwotICAgIGlmIChpc0ZvY3VzZWQob2JqZWN0
KSkKLSAgICAgICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEZvY3VzKGZvY3VzUmVjdCwgd2lkZ2V0
LCBzdGF0ZSwgImJ1dHRvbiIpOwotCi0jaWYgIUdUS19DSEVDS19WRVJTSU9OKDIsIDIyLCAwKQot
ICAgIEdUS19XSURHRVRfVU5TRVRfRkxBR1Mod2lkZ2V0LCBHVEtfSEFTX0ZPQ1VTKTsKLSNlbmRp
ZgotICAgIGdfb2JqZWN0X3NldCh3aWRnZXQsICJoYXMtZm9jdXMiLCBGQUxTRSwgTlVMTCk7Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBnZXRDb21ib0JveFBhZGRpbmcoUmVu
ZGVyU3R5bGUqIHN0eWxlLCBpbnQmIGxlZnQsIGludCYgdG9wLCBpbnQmIHJpZ2h0LCBpbnQmIGJv
dHRvbSkKLXsKLSAgICAvLyBJZiB0aGlzIG1lbnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24gdXNp
bmcgdGhlIG5hdGl2ZSB0aGVtZSwgd2UKLSAgICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBhZGRp
bmcgYmV5b25kIHdoYXQgV2ViQ29yZSBhbHJlYWR5IHVzZXMuCi0gICAgaWYgKHN0eWxlLT5hcHBl
YXJhbmNlKCkgPT0gTm9Db250cm9sUGFydCkKLSAgICAgICAgcmV0dXJuOwotICAgIG1vel9ndGtf
Z2V0X3dpZGdldF9ib3JkZXIoTU9aX0dUS19EUk9QRE9XTiwgJmxlZnQsICZ0b3AsICZyaWdodCwg
JmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24o
c3R5bGUtPmRpcmVjdGlvbigpKSwgVFJVRSk7Ci19Ci0KLWludCBSZW5kZXJUaGVtZUd0azo6cG9w
dXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBp
bnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKLSAgICBnZXRDb21i
b0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgcmV0dXJu
IGxlZnQ7Ci19Ci0KLWludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdo
dChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50IGxlZnQgPSAwLCB0b3AgPSAw
LCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Ci0gICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBs
ZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIHJldHVybiByaWdodDsKLX0KLQotaW50IFJl
bmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0Ci17Ci0gICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9
IDA7Ci0gICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0
b20pOwotICAgIHJldHVybiB0b3A7Ci19Ci0KLWludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRl
cm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIGludCBs
ZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOwotICAgIGdldENvbWJvQm94
UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICByZXR1cm4gYm90
dG9tOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0
eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNv
bnN0CiB7CiAgICAgLy8gVGhlIHRlc3RzIGNoZWNrIGV4cGxpY2l0bHkgdGhhdCBzZWxlY3QgbWVu
dSBidXR0b25zIGlnbm9yZSBsaW5lIGhlaWdodC4KQEAgLTQ1Nyw0NyArMjczLDE0IEBAIHZvaWQg
UmVuZGVyVGhlbWVHdGs6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rv
ciogc2VsZWN0b3IsIFJlbmRlCiAgICAgYWRqdXN0TWVudUxpc3RTdHlsZShzZWxlY3Rvciwgc3R5
bGUsIGUpOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lbnVMaXN0KFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAg
IHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0RST1BET1dOLCBvLCBpLmNvbnRleHQs
IHJlY3QpOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lbnVMaXN0QnV0dG9uKFJl
bmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3Qm
IHJlY3QpCi17Ci0gICAgcmV0dXJuIHBhaW50TWVudUxpc3Qob2JqZWN0LCBpbmZvLCByZWN0KTsK
LX0KLQotc3RhdGljIHZvaWQgc2V0VGV4dElucHV0Qm9yZGVycyhSZW5kZXJTdHlsZSogc3R5bGUp
Ci17Ci0gICAgLy8gSWYgdGhpcyBjb250cm9sIGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRpdmUg
dGhlbWUsIHdlIGRvbid0IHRvdWNoIHRoZSBib3JkZXJzLgotICAgIGlmIChzdHlsZS0+YXBwZWFy
YW5jZSgpID09IE5vQ29udHJvbFBhcnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIGNh
bm5vdCBnaXZlIGEgcHJvcGVyIHJlbmRlcmluZyB3aGVuIGJvcmRlciByYWRpdXMgaXMgYWN0aXZl
LCB1bmZvcnR1bmF0ZWx5LgotICAgIHN0eWxlLT5yZXNldEJvcmRlclJhZGl1cygpOwotCi0gICAg
aW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Ci0gICAgbW96X2d0
a19nZXRfd2lkZ2V0X2JvcmRlcihNT1pfR1RLX0VOVFJZLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAm
Ym90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihz
dHlsZS0+ZGlyZWN0aW9uKCkpLCBUUlVFKTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVyTGVmdFdpZHRo
KGxlZnQpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJUb3BXaWR0aCh0b3ApOwotICAgIHN0eWxlLT5z
ZXRCb3JkZXJSaWdodFdpZHRoKHJpZ2h0KTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVyQm90dG9tV2lk
dGgoYm90dG9tKTsKLX0KLQogdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0VGV4dEZpZWxkU3R5
bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVu
dCogZSkgY29uc3QKIHsKLSAgICBzZXRUZXh0SW5wdXRCb3JkZXJzKHN0eWxlKTsKLX0KLQotYm9v
bCBSZW5kZXJUaGVtZUd0azo6cGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQ
YWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgcmV0dXJuIHBhaW50UmVu
ZGVyT2JqZWN0KE1PWl9HVEtfRU5UUlksIG8sIGkuY29udGV4dCwgcmVjdCk7CisgICAgUmVuZGVy
VGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRlcnMoc3R5bGUpOwogfQogCiB2b2lkIFJlbmRlclRo
ZW1lR3RrOjphZGp1c3RUZXh0QXJlYVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7Ci0gICAgc2V0VGV4dElucHV0
Qm9yZGVycyhzdHlsZSk7CisgICAgUmVuZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRlcnMo
c3R5bGUpOwogfQogCiBib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFRleHRBcmVhKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQpAQCAtNTgyLDE1
NCArMzY1LDE2IEBAIGJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2VhcmNoRmllbGQoUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0CiAgICAgcmV0dXJuIHBhaW50VGV4
dEZpZWxkKG8sIGksIHJlY3QpOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRl
clRyYWNrKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKGluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxl
ZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDb250cm9sUGFydCBwYXJ0ID0gb2Jq
ZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7Ci0gICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVySG9y
aXpvbnRhbFBhcnQgfHwgcGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpOwotCi0gICAgLy8gV2Ug
c2hyaW5rIHRoZSB0cm91Z2ggcmVjdCBzbGlnaHRseSB0byBtYWtlIHJvb20gZm9yIHRoZSBmb2N1
cyBpbmRpY2F0b3IuCi0gICAgSW50UmVjdCB0cm91Z2hSZWN0KEludFBvaW50KCksIHJlY3Quc2l6
ZSgpKTsgLy8gVGhpcyBpcyByZWxhdGl2ZSB0byByZWN0LgotICAgIEd0a1dpZGdldCogd2lkZ2V0
ID0gMDsKLSAgICBpZiAocGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpIHsKLSAgICAgICAgd2lk
Z2V0ID0gZ3RrVlNjYWxlKCk7Ci0gICAgICAgIHRyb3VnaFJlY3QuaW5mbGF0ZVkoLWd0a193aWRn
ZXRfZ2V0X3N0eWxlKHdpZGdldCktPnl0aGlja25lc3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IHdpZGdldCA9IGd0a0hTY2FsZSgpOwotICAgICAgICB0cm91Z2hSZWN0LmluZmxhdGVYKC1ndGtf
d2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT54dGhpY2tuZXNzKTsKLSAgICB9Ci0gICAgZ3RrX3dp
ZGdldF9zZXRfZGlyZWN0aW9uKHdpZGdldCwgZ3RrVGV4dERpcmVjdGlvbihvYmplY3QtPnN0eWxl
KCktPmRpcmVjdGlvbigpKSk7Ci0KLSAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENv
bnRleHQoaW5mby5jb250ZXh0LCByZWN0KTsKLSAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50Qm94
KHRyb3VnaFJlY3QsIHdpZGdldCwgR1RLX1NUQVRFX0FDVElWRSwgR1RLX1NIQURPV19PVVQsICJ0
cm91Z2giKTsKLSAgICBpZiAoaXNGb2N1c2VkKG9iamVjdCkpCi0gICAgICAgIHdpZGdldENvbnRl
eHQuZ3RrUGFpbnRGb2N1cyhJbnRSZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKSwgd2lkZ2V0
LCBnZXRHdGtTdGF0ZVR5cGUob2JqZWN0KSwgInRyb3VnaCIpOwotCi0gICAgcmV0dXJuIGZhbHNl
OwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJUcmFja1N0eWxlKENTU1N0
eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAogewogICAg
IHN0eWxlLT5zZXRCb3hTaGFkb3coMCk7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50
U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywg
Y29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAoaW5mby5jb250ZXh0LT5wYWludGluZ0Rp
c2FibGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENvbnRyb2xQYXJ0IHBhcnQg
PSBvYmplY3QtPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKLSAgICBBU1NFUlQocGFydCA9PSBTbGlk
ZXJUaHVtYkhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQp
OwotCi0gICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSAwOwotICAgIGNvbnN0IGNoYXIqIGRldGFpbCA9
IDA7Ci0gICAgR3RrT3JpZW50YXRpb24gb3JpZW50YXRpb247Ci0gICAgaWYgKHBhcnQgPT0gU2xp
ZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsKLSAgICAgICAgd2lkZ2V0ID0gZ3RrVlNjYWxlKCk7Ci0g
ICAgICAgIGRldGFpbCA9ICJ2c2NhbGUiOwotICAgICAgICBvcmllbnRhdGlvbiA9IEdUS19PUklF
TlRBVElPTl9WRVJUSUNBTDsKLSAgICB9IGVsc2UgewotICAgICAgICB3aWRnZXQgPSBndGtIU2Nh
bGUoKTsKLSAgICAgICAgZGV0YWlsID0gImhzY2FsZSI7Ci0gICAgICAgIG9yaWVudGF0aW9uID0g
R1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUw7Ci0gICAgfQotICAgIGd0a193aWRnZXRfc2V0X2Rp
cmVjdGlvbih3aWRnZXQsIGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rp
b24oKSkpOwotCi0gICAgLy8gT25seSBzb21lIHRoZW1lcyBoYXZlIHNsaWRlciB0aHVtYnMgcmVz
cG9uZCB0byBjbGlja3MgYW5kIHNvbWUgZG9uJ3QuIFRoaXMgaW5mb3JtYXRpb24gaXMKLSAgICAv
LyBnYXRoZXJlZCB2aWEgdGhlICdhY3RpdmF0ZS1zbGlkZXInIHByb3BlcnR5LCBidXQgaXQncyBk
ZXByZWNhdGVkIGluIEdUSysgMi4yMiBhbmQgcmVtb3ZlZCBpbgotICAgIC8vIEdUSysgMy54LiBU
aGUgZHJhd2JhY2sgb2Ygbm90IGhvbm9yaW5nIGl0IGlzIHRoYXQgc2xpZGVyIHRodW1icyBjaGFu
Z2UgY29sb3Igd2hlbiB5b3UgY2xpY2sKLSAgICAvLyBvbiB0aGVtLiAKLSAgICBJbnRSZWN0IHRo
dW1iUmVjdChJbnRQb2ludCgpLCByZWN0LnNpemUoKSk7Ci0gICAgV2lkZ2V0UmVuZGVyaW5nQ29u
dGV4dCB3aWRnZXRDb250ZXh0KGluZm8uY29udGV4dCwgcmVjdCk7Ci0gICAgd2lkZ2V0Q29udGV4
dC5ndGtQYWludFNsaWRlcih0aHVtYlJlY3QsIHdpZGdldCwgZ2V0R3RrU3RhdGVUeXBlKG9iamVj
dCksIEdUS19TSEFET1dfT1VULCBkZXRhaWwsIG9yaWVudGF0aW9uKTsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFNsaWRlclRodW1iU3R5bGUoQ1NT
U3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0CiB7CiAg
ICAgc3R5bGUtPnNldEJveFNoYWRvdygwKTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRq
dXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlck9iamVjdCogbykgY29uc3QKLXsKLSAgICBDb250cm9s
UGFydCBwYXJ0ID0gby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOwotI2lmIEVOQUJMRShWSURFTykK
LSAgICBpZiAocGFydCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgewotICAgICAgICBvLT5zdHls
ZSgpLT5zZXRXaWR0aChMZW5ndGgobV9tZWRpYVNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7Ci0g
ICAgICAgIG8tPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgobV9tZWRpYVNsaWRlclRodW1iSGVp
Z2h0LCBGaXhlZCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwYXJ0ID09IE1l
ZGlhVm9sdW1lU2xpZGVyVGh1bWJQYXJ0KQotICAgICAgICByZXR1cm47Ci0jZW5kaWYKLQotICAg
IEd0a1dpZGdldCogd2lkZ2V0ID0gcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8g
Z3RrSFNjYWxlKCkgOiBndGtWU2NhbGUoKTsKLSAgICBpbnQgbGVuZ3RoID0gMCwgd2lkdGggPSAw
OwotICAgIGd0a193aWRnZXRfc3R5bGVfZ2V0KHdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAic2xpZGVyX2xlbmd0aCIsICZsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
InNsaWRlcl93aWR0aCIsICZ3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsK
LQotICAgIGlmIChwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQpIHsKLSAgICAgICAg
by0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKLSAgICAgICAgby0+
c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aCh3aWR0aCwgRml4ZWQpKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSAgICBBU1NFUlQocGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCk7Ci0g
ICAgby0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKHdpZHRoLCBGaXhlZCkpOwotICAgIG8tPnN0
eWxlKCktPnNldEhlaWdodChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOwotfQotCi1Db2xvciBSZW5k
ZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25z
dAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKLSAgICByZXR1cm4gZ3Rr
X3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdOwotfQot
Ci1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91
bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgpOwot
ICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9B
Q1RJVkVdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rp
b25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3Rr
RW50cnkoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtH
VEtfU1RBVEVfU0VMRUNURURdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1J
bmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR3RrV2lkZ2V0
KiB3aWRnZXQgPSBndGtFbnRyeSgpOwotICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3
aWRnZXQpLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0
azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAg
R3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOwotICAgIHJldHVybiBndGtfd2lkZ2V0
X2dldF9zdHlsZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9TRUxFQ1RFRF07Ci19Ci0KLUNvbG9y
IFJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3Io
KSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKLSAgICBy
ZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfQUNUSVZF
XTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3Jl
Z3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZp
ZXcoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtf
U1RBVEVfU0VMRUNURURdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0
Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdp
ZGdldCA9IGd0a1RyZWVWaWV3KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdp
ZGdldCktPnRleHRbR1RLX1NUQVRFX0FDVElWRV07Ci19Ci0KIGRvdWJsZSBSZW5kZXJUaGVtZUd0
azo6Y2FyZXRCbGlua0ludGVydmFsKCkgY29uc3QKIHsKICAgICBHdGtTZXR0aW5ncyogc2V0dGlu
Z3MgPSBndGtfc2V0dGluZ3NfZ2V0X2RlZmF1bHQoKTsKQEAgLTc4NywxMDEgKzQzMiw2IEBAIHZv
aWQgUmVuZGVyVGhlbWVHdGs6OnN5c3RlbUZvbnQoaW50LCBGb250RGVzY3JpcHRpb24mIGZvbnRE
ZXNjcmlwdGlvbikgY29uc3QKICAgICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWUocGFuZ29E
ZXNjcmlwdGlvbik7CiB9CiAKLUNvbG9yIFJlbmRlclRoZW1lR3RrOjpzeXN0ZW1Db2xvcihpbnQg
Y3NzVmFsdWVJZCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsKLSAgICBjYXNl
IENTU1ZhbHVlQnV0dG9udGV4dDoKLSAgICAgICAgcmV0dXJuIENvbG9yKGd0a193aWRnZXRfZ2V0
X3N0eWxlKGd0a0J1dHRvbigpKS0+ZmdbR1RLX1NUQVRFX05PUk1BTF0pOwotICAgIGNhc2UgQ1NT
VmFsdWVDYXB0aW9udGV4dDoKLSAgICAgICAgcmV0dXJuIENvbG9yKGd0a193aWRnZXRfZ2V0X3N0
eWxlKGd0a0VudHJ5KCkpLT5mZ1tHVEtfU1RBVEVfTk9STUFMXSk7Ci0gICAgZGVmYXVsdDoKLSAg
ICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpzeXN0ZW1Db2xvcihjc3NWYWx1ZUlkKTsKLSAgICB9
Ci19Ci0KLXN0YXRpYyB2b2lkIGd0a1N0eWxlU2V0Q2FsbGJhY2soR3RrV2lkZ2V0KiB3aWRnZXQs
IEd0a1N0eWxlKiBwcmV2aW91cywgUmVuZGVyVGhlbWUqIHJlbmRlclRoZW1lKQotewotICAgIC8v
IEZJWE1FOiBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGdldCBjYWxsZWQgbWFueSB0
aW1lcyBmb3IgYSBzaW5nbGUgR1RLKyBzdHlsZSBjaGFuZ2Ugc2lnbmFsLgotICAgIHJlbmRlclRo
ZW1lLT5wbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOwotfQotCi12b2lkIFJlbmRlclRoZW1lR3Rr
OjpzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKEd0a1dpZGdldCogd2lkZ2V0LCBHdGtXaWRn
ZXQqIHdpbmRvdykgY29uc3QKLXsKLSAgICBndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVS
KHdpbmRvdyksIHdpZGdldCk7Ci0gICAgZ3RrX3dpZGdldF9yZWFsaXplKHdpZGdldCk7Ci0gICAg
Z19vYmplY3Rfc2V0X2RhdGEoR19PQkpFQ1Qod2lkZ2V0KSwgInRyYW5zcGFyZW50LWJnLWhpbnQi
LCBHSU5UX1RPX1BPSU5URVIoVFJVRSkpOwotCi0gICAgLy8gRklYTUU6IFBlcmhhcHMgdGhpcyBz
aG91bGQgb25seSBiZSBjYWxsZWQgZm9yIHRoZSBjb250YWluaW5nIHdpbmRvdyBvciBwYXJlbnQg
Y29udGFpbmVyLgotICAgIGdfc2lnbmFsX2Nvbm5lY3Qod2lkZ2V0LCAic3R5bGUtc2V0IiwgR19D
QUxMQkFDSyhndGtTdHlsZVNldENhbGxiYWNrKSwgY29uc3RfY2FzdDxSZW5kZXJUaGVtZUd0ayo+
KHRoaXMpKTsKLX0KLQotR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrQ29udGFpbmVyKCkg
Y29uc3QKLXsKLSAgICBpZiAobV9ndGtDb250YWluZXIpCi0gICAgICAgIHJldHVybiBtX2d0a0Nv
bnRhaW5lcjsKLQotICAgIG1fZ3RrV2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19Q
T1BVUCk7Ci0jaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKLSAgICBndGtfd2lkZ2V0X3NldF9jb2xv
cm1hcChtX2d0a1dpbmRvdywgbV90aGVtZVBhcnRzLmNvbG9ybWFwKTsKLSNlbmRpZgotICAgIGd0
a193aWRnZXRfcmVhbGl6ZShtX2d0a1dpbmRvdyk7Ci0gICAgZ3RrX3dpZGdldF9zZXRfbmFtZSht
X2d0a1dpbmRvdywgIk1vemlsbGFHdGtXaWRnZXQiKTsKLQotICAgIG1fZ3RrQ29udGFpbmVyID0g
Z3RrX2ZpeGVkX25ldygpOwotICAgIHNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIobV9ndGtD
b250YWluZXIsIG1fZ3RrV2luZG93KTsKLSAgICByZXR1cm4gbV9ndGtDb250YWluZXI7Ci19Ci0K
LUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0J1dHRvbigpIGNvbnN0Ci17Ci0gICAgaWYg
KG1fZ3RrQnV0dG9uKQotICAgICAgICByZXR1cm4gbV9ndGtCdXR0b247Ci0gICAgbV9ndGtCdXR0
b24gPSBndGtfYnV0dG9uX25ldygpOwotICAgIHNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIo
bV9ndGtCdXR0b24sIGd0a0NvbnRhaW5lcigpKTsKLSAgICByZXR1cm4gbV9ndGtCdXR0b247Ci19
Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0VudHJ5KCkgY29uc3QKLXsKLSAgICBp
ZiAobV9ndGtFbnRyeSkKLSAgICAgICAgcmV0dXJuIG1fZ3RrRW50cnk7Ci0gICAgbV9ndGtFbnRy
eSA9IGd0a19lbnRyeV9uZXcoKTsKLSAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1f
Z3RrRW50cnksIGd0a0NvbnRhaW5lcigpKTsKLSAgICByZXR1cm4gbV9ndGtFbnRyeTsKLX0KLQot
R3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrVHJlZVZpZXcoKSBjb25zdAotewotICAgIGlm
IChtX2d0a1RyZWVWaWV3KQotICAgICAgICByZXR1cm4gbV9ndGtUcmVlVmlldzsKLSAgICBtX2d0
a1RyZWVWaWV3ID0gZ3RrX3RyZWVfdmlld19uZXcoKTsKLSAgICBzZXR1cFdpZGdldEFuZEFkZFRv
Q29udGFpbmVyKG1fZ3RrVHJlZVZpZXcsIGd0a0NvbnRhaW5lcigpKTsKLSAgICByZXR1cm4gbV9n
dGtUcmVlVmlldzsKLX0KLQotR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrVlNjYWxlKCkg
Y29uc3QKLXsKLSAgICBpZiAobV9ndGtWU2NhbGUpCi0gICAgICAgIHJldHVybiBtX2d0a1ZTY2Fs
ZTsKLSAgICBtX2d0a1ZTY2FsZSA9IGd0a192c2NhbGVfbmV3KDApOwotICAgIHNldHVwV2lkZ2V0
QW5kQWRkVG9Db250YWluZXIobV9ndGtWU2NhbGUsIGd0a0NvbnRhaW5lcigpKTsKLSAgICByZXR1
cm4gbV9ndGtWU2NhbGU7Ci19Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0hTY2Fs
ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZ3RrSFNjYWxlKQotICAgICAgICByZXR1cm4gbV9ndGtI
U2NhbGU7Ci0gICAgbV9ndGtIU2NhbGUgPSBndGtfaHNjYWxlX25ldygwKTsKLSAgICBzZXR1cFdp
ZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrSFNjYWxlLCBndGtDb250YWluZXIoKSk7Ci0gICAg
cmV0dXJuIG1fZ3RrSFNjYWxlOwotfQotCi1HdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtT
Y3JvbGxiYXIoKQotewotICAgIHJldHVybiBtb3pfZ3RrX2dldF9zY3JvbGxiYXJfd2lkZ2V0KCk7
Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCkKIHsK
ICNpZiBFTkFCTEUoVklERU8pCkBAIC05MDIsOCArNDUyLDggQEAgYm9vbCBSZW5kZXJUaGVtZUd0
azo6cGFpbnRNZWRpYUJ1dHRvbihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgR3JhcGhpY3ND
b250ZXgKICAgICBJbnRQb2ludCBpY29uUG9pbnQocmVjdC54KCkgKyAocmVjdC53aWR0aCgpIC0g
bV9tZWRpYUljb25TaXplKSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSgpICsg
KHJlY3QuaGVpZ2h0KCkgLSBtX21lZGlhSWNvblNpemUpIC8gMik7CiAgICAgY29udGV4dC0+Zmls
bFJlY3QoRmxvYXRSZWN0KHJlY3QpLCBtX3BhbmVsQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0Ip
OwotICAgIHBhaW50U3RvY2tJY29uKGNvbnRleHQsIGljb25Qb2ludCwgc3R5bGUsIGljb25OYW1l
LCBndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpLAot
ICAgICAgICAgICAgICAgICAgIGd0a0ljb25TdGF0ZShyZW5kZXJPYmplY3QpLCBnZXRNZWRpYUJ1
dHRvbkljb25TaXplKG1fbWVkaWFJY29uU2l6ZSkpOworICAgIHBhaW50U3RvY2tJY29uKGNvbnRl
eHQsIGljb25Qb2ludCwgc3R5bGUsIGljb25OYW1lLCAKKyAgICAgICAgICAgICAgICAgICBndGtU
ZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpLCBndGtJY29u
U3RhdGUocmVuZGVyT2JqZWN0KSwgZ2V0TWVkaWFCdXR0b25JY29uU2l6ZShtX21lZGlhSWNvblNp
emUpKTsKIAogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTEwNDIsMzMgKzU5Miw2IEBAIHZvaWQg
UmVuZGVyVGhlbWVHdGs6OmFkanVzdFByb2dyZXNzQmFyU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvcios
IFJlbmRlclN0eWxlKiBzdHlsCiB7CiAgICAgc3R5bGUtPnNldEJveFNoYWRvdygwKTsKIH0KLQot
Ym9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRQcm9ncmVzc0JhcihSZW5kZXJPYmplY3QqIHJlbmRl
ck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Ci17Ci0gICAgaWYgKCFyZW5kZXJPYmplY3QtPmlzUHJvZ3Jlc3MoKSkKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0KLSAgICBHdGtXaWRnZXQqIHByb2dyZXNzQmFyV2lkZ2V0ID0gbW96X2d0a19nZXRf
cHJvZ3Jlc3Nfd2lkZ2V0KCk7Ci0gICAgaWYgKCFwcm9ncmVzc0JhcldpZGdldCkKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICBpZiAocGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19QUk9HUkVT
U0JBUiwgcmVuZGVyT2JqZWN0LCBwYWludEluZm8uY29udGV4dCwgcmVjdCkpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgSW50UmVjdCBjaHVua1JlY3QocmVjdCk7Ci0gICAgUmVuZGVyUHJv
Z3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQcm9ncmVzcyhyZW5kZXJPYmplY3QpOwot
Ci0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUocHJvZ3Jlc3NCYXJX
aWRnZXQpOwotICAgIGNodW5rUmVjdC5zZXRIZWlnaHQoY2h1bmtSZWN0LmhlaWdodCgpIC0gKDIg
KiBzdHlsZS0+eXRoaWNrbmVzcykpOwotICAgIGNodW5rUmVjdC5zZXRZKGNodW5rUmVjdC55KCkg
KyBzdHlsZS0+eXRoaWNrbmVzcyk7Ci0gICAgY2h1bmtSZWN0LnNldFdpZHRoKChjaHVua1JlY3Qu
d2lkdGgoKSAtICgyICogc3R5bGUtPnh0aGlja25lc3MpKSAqIHJlbmRlclByb2dyZXNzLT5wb3Np
dGlvbigpKTsKLSAgICBpZiAocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBS
VEwpCi0gICAgICAgIGNodW5rUmVjdC5zZXRYKHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gY2h1
bmtSZWN0LndpZHRoKCkgLSBzdHlsZS0+eHRoaWNrbmVzcyk7Ci0gICAgZWxzZQotICAgICAgICBj
aHVua1JlY3Quc2V0WChjaHVua1JlY3QueCgpICsgc3R5bGUtPnh0aGlja25lc3MpOwotCi0gICAg
cmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUFJPR1JFU1NfQ0hVTkssIHJlbmRlck9i
amVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIGNodW5rUmVjdCk7Ci19CiAjZW5kaWYKIAogfQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmgKaW5kZXggMmVjMTg4MWEyYTk5YTMwNWU2MjJk
ZmMzY2FjNjQxN2JmMTk4MWFhMC4uNjdhOWQzMDQyYmE4ZjRhOWY3ZGRmNDU1NzljMWMxNTQxYzQz
OGEyMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuaAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5oCkBAIC0xNzMsNiArMTcz
LDcgQEAgcHJpdmF0ZToKICAgICBib29sIHBhaW50TWVkaWFCdXR0b24oUmVuZGVyT2JqZWN0Kiwg
R3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYsIGNvbnN0IGNoYXIqIGljb25OYW1lKTsK
ICNlbmRpZgogICAgIEd0a1N0YXRlVHlwZSBndGtJY29uU3RhdGUoUmVuZGVyT2JqZWN0Kik7Cisg
ICAgc3RhdGljIHZvaWQgc2V0VGV4dElucHV0Qm9yZGVycyhSZW5kZXJTdHlsZSopOwogCiAgICAg
bXV0YWJsZSBHdGtXaWRnZXQqIG1fZ3RrV2luZG93OwogICAgIG11dGFibGUgR3RrV2lkZ2V0KiBt
X2d0a0NvbnRhaW5lcjsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRo
ZW1lR3RrMi5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azIuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmIzOTQzYWVkYjQxNGEzOGMzMDE2OTM1NGYxNWVlYmIyNTBhYzk4MzMKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azIuY3BwCkBA
IC0wLDAgKzEsNTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4KKyAq
IENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICogQ29weXJp
Z2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgS2VubmV0
aCBSb2hkZSBDaHJpc3RpYW5zZW4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJlbmRlclRoZW1lR3RrLmgiCisKKyNp
ZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgorCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkd0a1ZlcnNpb25pbmcuaCIK
KyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJNZWRpYUNvbnRyb2xFbGVtZW50cy5o
IgorI2luY2x1ZGUgIlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlRleHREaXJlY3Rpb24uaCIK
KyNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIldpZGdldFJlbmRl
cmluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJndGtkcmF3aW5nLmgiCisjaW5jbHVkZSA8Z2RrL2dk
ay5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKworI2lmIEVOQUJMRShQUk9HUkVTU19UQUcpCisj
aW5jbHVkZSAiUmVuZGVyUHJvZ3Jlc3MuaCIKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKKy8vIFRoaXMgaXMgbm90IGEgc3RhdGljIG1ldGhvZCwgYmVjYXVzZSB3ZSB3YW50IHRvIGF2
b2lkIGhhdmluZyBHVEsrIGhlYWRlcnMgaW4gUmVuZGVyVGhlbWVHdGsuaC4KK2V4dGVybiBHdGtU
ZXh0RGlyZWN0aW9uIGd0a1RleHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbik7CisKK3ZvaWQgUmVu
ZGVyVGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycygpCit7CisgICAgR3RrU3R5bGUqIHN0eWxlID0g
Z3RrX3dpZGdldF9nZXRfc3R5bGUoR1RLX1dJREdFVChndGtDb250YWluZXIoKSkpOworICAgIG1f
cGFuZWxDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXTsKKyAgICBtX3NsaWRlckNv
bG9yID0gc3R5bGUtPmJnW0dUS19TVEFURV9BQ1RJVkVdOworICAgIG1fc2xpZGVyVGh1bWJDb2xv
ciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfU0VMRUNURURdOworfQorCitHdGtTdGF0ZVR5cGUgUmVu
ZGVyVGhlbWVHdGs6OmdldEd0a1N0YXRlVHlwZShSZW5kZXJPYmplY3QqIG9iamVjdCkKK3sKKyAg
ICBpZiAoIWlzRW5hYmxlZChvYmplY3QpIHx8IGlzUmVhZE9ubHlDb250cm9sKG9iamVjdCkpCisg
ICAgICAgIHJldHVybiBHVEtfU1RBVEVfSU5TRU5TSVRJVkU7CisgICAgaWYgKGlzUHJlc3NlZChv
YmplY3QpKQorICAgICAgICByZXR1cm4gR1RLX1NUQVRFX0FDVElWRTsKKyAgICBpZiAoaXNIb3Zl
cmVkKG9iamVjdCkpCisgICAgICAgIHJldHVybiBHVEtfU1RBVEVfUFJFTElHSFQ7CisgICAgcmV0
dXJuIEdUS19TVEFURV9OT1JNQUw7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UmVu
ZGVyT2JqZWN0KEd0a1RoZW1lV2lkZ2V0VHlwZSB0eXBlLCBSZW5kZXJPYmplY3QqIHJlbmRlck9i
amVjdCwgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQg
ZmxhZ3MpCit7CisgICAgLy8gUGFpbnRpbmcgaXMgZGlzYWJsZWQgc28ganVzdCBjbGFpbSB0byBo
YXZlIHN1Y2NlZWRlZAorICAgIGlmIChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIEd0a1dpZGdldFN0YXRlIHdpZGdldFN0YXRlOworICAg
IHdpZGdldFN0YXRlLmFjdGl2ZSA9IGlzUHJlc3NlZChyZW5kZXJPYmplY3QpOworICAgIHdpZGdl
dFN0YXRlLmZvY3VzZWQgPSBpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KTsKKworICAgIC8vIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODM2NAorICAgIC8vIFRoZSBNb3pp
bGxhIHRoZW1lIGRyYXdpbmcgY29kZSwgb25seSBwYWludHMgYSBidXR0b24gYXMgcHJlc3NlZCB3
aGVuIGl0J3MgcHJlc3NlZCAKKyAgICAvLyB3aGlsZSBob3ZlcmVkLiBVbnRpbCB3ZSBtb3ZlIGF3
YXkgZnJvbSB0aGUgTW96aWxhIGNvZGUsIHdvcmstYXJvdW5kIHRoZSBpc3N1ZSBieQorICAgIC8v
IGZvcmNpbmcgYSBwcmVzc2VkIGJ1dHRvbiBpbnRvIHRoZSBob3ZlcmVkIHN0YXRlLiBUaGlzIGVu
c3VyZXMgdGhhdCBidXR0b25zIGFjdGl2YXRlZAorICAgIC8vIHZpYSB0aGUga2V5Ym9hcmQgaGF2
ZSB0aGUgcHJvcGVyIHJlbmRlcmluZy4KKyAgICB3aWRnZXRTdGF0ZS5pbkhvdmVyID0gaXNIb3Zl
cmVkKHJlbmRlck9iamVjdCkgfHwgKHR5cGUgPT0gTU9aX0dUS19CVVRUT04gJiYgaXNQcmVzc2Vk
KHJlbmRlck9iamVjdCkpOworCisgICAgLy8gRklYTUU6IERpc2FibGVkIGRvZXMgbm90IGFsd2F5
cyBnaXZlIHRoZSBjb3JyZWN0IGFwcGVhcmFuY2UgZm9yIFJlYWRPbmx5CisgICAgd2lkZ2V0U3Rh
dGUuZGlzYWJsZWQgPSAhaXNFbmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRy
b2wocmVuZGVyT2JqZWN0KTsKKyAgICB3aWRnZXRTdGF0ZS5pc0RlZmF1bHQgPSBmYWxzZTsKKyAg
ICB3aWRnZXRTdGF0ZS5jYW5EZWZhdWx0ID0gZmFsc2U7CisgICAgd2lkZ2V0U3RhdGUuZGVwcmVz
c2VkID0gZmFsc2U7CisKKyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQo
Y29udGV4dCwgcmVjdCk7CisgICAgcmV0dXJuICF3aWRnZXRDb250ZXh0LnBhaW50TW96aWxsYVdp
ZGdldCh0eXBlLCAmd2lkZ2V0U3RhdGUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxl
KCktPmRpcmVjdGlvbigpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFRvZ2dsZVNpemUoY29uc3Qg
UmVuZGVyVGhlbWVHdGsqIHRoZW1lLCBSZW5kZXJTdHlsZSogc3R5bGUsIENvbnRyb2xQYXJ0IGFw
cGVhcmFuY2UpCit7CisgICAgLy8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lm
aWVkLCBzbyB3ZSBzaG91bGRuJ3QgY2hhbmdlIHRoZW0uCisgICAgaWYgKCFzdHlsZS0+d2lkdGgo
KS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IG5vdCBjb3JyZWN0
IHVzZSBvZiBpbmRpY2F0b3JTaXplIGFuZCBpbmRpY2F0b3JTcGFjaW5nLgorICAgIGdpbnQgaW5k
aWNhdG9yU2l6ZSwgaW5kaWNhdG9yU3BhY2luZzsKKyAgICB0aGVtZS0+Z2V0SW5kaWNhdG9yTWV0
cmljcyhhcHBlYXJhbmNlLCBpbmRpY2F0b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5nKTsKKworICAg
IC8vIE90aGVyIHBvcnRzIGhhcmQtY29kZSB0aGlzIHRvIDEzLCBidXQgR1RLKyB1c2VycyB0ZW5k
IHRvIGRlbWFuZCB0aGUgbmF0aXZlIGxvb2suCisgICAgLy8gSXQgY291bGQgYmUgbWFkZSBhIGNv
bmZpZ3VyYXRpb24gb3B0aW9uIHZhbHVlcyBvdGhlciB0aGFuIDEzIGFjdHVhbGx5IGJyZWFrIHNp
dGUgY29tcGF0aWJpbGl0eS4KKyAgICBpbnQgbGVuZ3RoID0gaW5kaWNhdG9yU2l6ZSArIGluZGlj
YXRvclNwYWNpbmc7CisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkp
CisgICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworCisgICAg
aWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChM
ZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjpzZXRDaGVj
a2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIHNldFRvZ2dsZVNpemUo
dGhpcywgc3R5bGUsIFJhZGlvUGFydCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50
Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dU
S19DSEVDS0JVVFRPTiwgb2JqZWN0LCBpbmZvLmNvbnRleHQsIHJlY3QsIGlzQ2hlY2tlZChvYmpl
Y3QpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXplKFJlbmRlclN0eWxl
KiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXplKHRoaXMsIHN0eWxlLCBSYWRpb1Bh
cnQpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKFJlbmRlck9iamVjdCog
b2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7Cisg
ICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUkFESU9CVVRUT04sIG9iamVjdCwg
aW5mby5jb250ZXh0LCByZWN0LCBpc0NoZWNrZWQob2JqZWN0KSk7Cit9CisKK2Jvb2wgUmVuZGVy
VGhlbWVHdGs6OnBhaW50QnV0dG9uKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludElu
Zm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKGluZm8uY29udGV4dC0+
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHdGtXaWRn
ZXQqIHdpZGdldCA9IGd0a0J1dHRvbigpOworICAgIEludFJlY3QgYnV0dG9uUmVjdChJbnRQb2lu
dCgpLCByZWN0LnNpemUoKSk7CisgICAgSW50UmVjdCBmb2N1c1JlY3QoYnV0dG9uUmVjdCk7CisK
KyAgICBHdGtTdGF0ZVR5cGUgc3RhdGUgPSBnZXRHdGtTdGF0ZVR5cGUob2JqZWN0KTsKKyAgICBn
dGtfd2lkZ2V0X3NldF9zdGF0ZSh3aWRnZXQsIHN0YXRlKTsKKyAgICBndGtfd2lkZ2V0X3NldF9k
aXJlY3Rpb24od2lkZ2V0LCBndGtUZXh0RGlyZWN0aW9uKG9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0
aW9uKCkpKTsKKworICAgIGlmIChpc0ZvY3VzZWQob2JqZWN0KSkgeworICAgICAgICBpZiAoaXNF
bmFibGVkKG9iamVjdCkpIHsKKyNpZiAhR1RLX0NIRUNLX1ZFUlNJT04oMiwgMjIsIDApCisgICAg
ICAgICAgICBHVEtfV0lER0VUX1NFVF9GTEFHUyh3aWRnZXQsIEdUS19IQVNfRk9DVVMpOworI2Vu
ZGlmCisgICAgICAgICAgICBnX29iamVjdF9zZXQod2lkZ2V0LCAiaGFzLWZvY3VzIiwgVFJVRSwg
TlVMTCk7CisgICAgICAgIH0KKworICAgICAgICBnYm9vbGVhbiBpbnRlcmlvckZvY3VzID0gMCwg
Zm9jdXNXaWR0aCA9IDAsIGZvY3VzUGFkZGluZyA9IDA7CisgICAgICAgIGd0a193aWRnZXRfc3R5
bGVfZ2V0KHdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyaW9yLWZv
Y3VzIiwgJmludGVyaW9yRm9jdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2N1
cy1saW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkZGluZywgTlVMTCk7CisgICAgICAgIC8vIElmIHdl
IGFyZSB1c2luZyBleHRlcmlvciBmb2N1cywgd2Ugc2hyaW5rIHRoZSBidXR0b24gcmVjdCBkb3du
IGJlZm9yZQorICAgICAgICAvLyBkcmF3aW5nLiBJZiB3ZSBhcmUgdXNpbmcgaW50ZXJpb3IgZm9j
dXMgd2Ugc2hyaW5rIHRoZSBmb2N1cyByZWN0LiBUaGlzCisgICAgICAgIC8vIGFwcHJvYWNoIG9y
aWdpbmF0ZXMgZnJvbSB0aGUgTW96aWxsYSB0aGVtZSBkcmF3aW5nIGNvZGUgKGd0azJkcmF3aW5n
LmMpLgorICAgICAgICBpZiAoaW50ZXJpb3JGb2N1cykgeworICAgICAgICAgICAgR3RrU3R5bGUq
IHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KTsKKyAgICAgICAgICAgIGZvY3Vz
UmVjdC5pbmZsYXRlWCgtc3R5bGUtPnh0aGlja25lc3MgLSBmb2N1c1BhZGRpbmcpOworICAgICAg
ICAgICAgZm9jdXNSZWN0LmluZmxhdGVZKC1zdHlsZS0+eXRoaWNrbmVzcyAtIGZvY3VzUGFkZGlu
Zyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidXR0b25SZWN0LmluZmxhdGVYKC1m
b2N1c1dpZHRoIC0gZm9jdXNQYWRkaW5nKTsKKyAgICAgICAgICAgIGJ1dHRvblJlY3QuaW5mbGF0
ZVkoLWZvY3VzUGFkZGluZyAtIGZvY3VzUGFkZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoaW5mby5jb250ZXh0LCByZWN0
KTsKKyAgICBHdGtTaGFkb3dUeXBlIHNoYWRvd1R5cGUgPSBzdGF0ZSA9PSBHVEtfU1RBVEVfQUNU
SVZFID8gR1RLX1NIQURPV19JTiA6IEdUS19TSEFET1dfT1VUOworICAgIHdpZGdldENvbnRleHQu
Z3RrUGFpbnRCb3goYnV0dG9uUmVjdCwgd2lkZ2V0LCBzdGF0ZSwgc2hhZG93VHlwZSwgImJ1dHRv
biIpOworICAgIGlmIChpc0ZvY3VzZWQob2JqZWN0KSkKKyAgICAgICAgd2lkZ2V0Q29udGV4dC5n
dGtQYWludEZvY3VzKGZvY3VzUmVjdCwgd2lkZ2V0LCBzdGF0ZSwgImJ1dHRvbiIpOworCisjaWYg
IUdUS19DSEVDS19WRVJTSU9OKDIsIDIyLCAwKQorICAgIEdUS19XSURHRVRfVU5TRVRfRkxBR1Mo
d2lkZ2V0LCBHVEtfSEFTX0ZPQ1VTKTsKKyNlbmRpZgorICAgIGdfb2JqZWN0X3NldCh3aWRnZXQs
ICJoYXMtZm9jdXMiLCBGQUxTRSwgTlVMTCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0
aWMgdm9pZCBnZXRDb21ib0JveFBhZGRpbmcoUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQmIGxlZnQs
IGludCYgdG9wLCBpbnQmIHJpZ2h0LCBpbnQmIGJvdHRvbSkKK3sKKyAgICAvLyBJZiB0aGlzIG1l
bnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24gdXNpbmcgdGhlIG5hdGl2ZSB0aGVtZSwgd2UKKyAg
ICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBhZGRpbmcgYmV5b25kIHdoYXQgV2ViQ29yZSBhbHJl
YWR5IHVzZXMuCisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTm9Db250cm9sUGFydCkK
KyAgICAgICAgcmV0dXJuOworICAgIG1vel9ndGtfZ2V0X3dpZGdldF9ib3JkZXIoTU9aX0dUS19E
Uk9QRE9XTiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSwgVFJVRSk7
Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRl
clN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0
ID0gMCwgYm90dG9tID0gMDsKKyAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRv
cCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJuIGxlZnQ7Cit9CisKK2ludCBSZW5kZXJUaGVt
ZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
Cit7CisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Cisg
ICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwor
ICAgIHJldHVybiByaWdodDsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFs
UGFkZGluZ1RvcChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaW50IGxlZnQgPSAw
LCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7CisgICAgZ2V0Q29tYm9Cb3hQYWRkaW5n
KHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIHJldHVybiB0b3A7Cit9CisK
K2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5
bGUqIHN0eWxlKSBjb25zdAoreworICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAw
LCBib3R0b20gPSAwOworICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCBy
aWdodCwgYm90dG9tKTsKKyAgICByZXR1cm4gYm90dG9tOworfQorCitib29sIFJlbmRlclRoZW1l
R3RrOjpwYWludE1lbnVMaXN0KFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8m
IGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2Jq
ZWN0KE1PWl9HVEtfRFJPUERPV04sIG9iamVjdCwgaW5mby5jb250ZXh0LCByZWN0KTsKK30KKwor
Ym9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9i
amVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAg
IHJldHVybiBwYWludE1lbnVMaXN0KG9iamVjdCwgaW5mbywgcmVjdCk7Cit9CisKK3ZvaWQgUmVu
ZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRlcnMoUmVuZGVyU3R5bGUqIHN0eWxlKQorewor
ICAgIC8vIElmIHRoaXMgY29udHJvbCBpc24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1l
LCB3ZSBkb24ndCB0b3VjaCB0aGUgYm9yZGVycy4KKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2Uo
KSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBjYW5ub3Qg
Z2l2ZSBhIHByb3BlciByZW5kZXJpbmcgd2hlbiBib3JkZXIgcmFkaXVzIGlzIGFjdGl2ZSwgdW5m
b3J0dW5hdGVseS4KKyAgICBzdHlsZS0+cmVzZXRCb3JkZXJSYWRpdXMoKTsKKworICAgIGludCBs
ZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIG1vel9ndGtfZ2V0
X3dpZGdldF9ib3JkZXIoTU9aX0dUS19FTlRSWSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRv
bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24oc3R5bGUt
PmRpcmVjdGlvbigpKSwgVFJVRSk7CisgICAgc3R5bGUtPnNldEJvcmRlckxlZnRXaWR0aChsZWZ0
KTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyVG9wV2lkdGgodG9wKTsKKyAgICBzdHlsZS0+c2V0Qm9y
ZGVyUmlnaHRXaWR0aChyaWdodCk7CisgICAgc3R5bGUtPnNldEJvcmRlckJvdHRvbVdpZHRoKGJv
dHRvbSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9i
amVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfRU5UUlksIG9iamVjdCwg
aW5mby5jb250ZXh0LCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlk
ZXJUcmFjayhSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25z
dCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChpbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9i
amVjdC0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlckhv
cml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KTsKKworICAgIC8vIFdl
IHNocmluayB0aGUgdHJvdWdoIHJlY3Qgc2xpZ2h0bHkgdG8gbWFrZSByb29tIGZvciB0aGUgZm9j
dXMgaW5kaWNhdG9yLgorICAgIEludFJlY3QgdHJvdWdoUmVjdChJbnRQb2ludCgpLCByZWN0LnNp
emUoKSk7IC8vIFRoaXMgaXMgcmVsYXRpdmUgdG8gcmVjdC4KKyAgICBHdGtXaWRnZXQqIHdpZGdl
dCA9IDA7CisgICAgaWYgKHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KSB7CisgICAgICAgIHdp
ZGdldCA9IGd0a1ZTY2FsZSgpOworICAgICAgICB0cm91Z2hSZWN0LmluZmxhdGVZKC1ndGtfd2lk
Z2V0X2dldF9zdHlsZSh3aWRnZXQpLT55dGhpY2tuZXNzKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICB3aWRnZXQgPSBndGtIU2NhbGUoKTsKKyAgICAgICAgdHJvdWdoUmVjdC5pbmZsYXRlWCgtZ3Rr
X3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+eHRoaWNrbmVzcyk7CisgICAgfQorICAgIGd0a193
aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHls
ZSgpLT5kaXJlY3Rpb24oKSkpOworCisgICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRD
b250ZXh0KGluZm8uY29udGV4dCwgcmVjdCk7CisgICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEJv
eCh0cm91Z2hSZWN0LCB3aWRnZXQsIEdUS19TVEFURV9BQ1RJVkUsIEdUS19TSEFET1dfT1VULCAi
dHJvdWdoIik7CisgICAgaWYgKGlzRm9jdXNlZChvYmplY3QpKQorICAgICAgICB3aWRnZXRDb250
ZXh0Lmd0a1BhaW50Rm9jdXMoSW50UmVjdChJbnRQb2ludCgpLCByZWN0LnNpemUoKSksIHdpZGdl
dCwgZ2V0R3RrU3RhdGVUeXBlKG9iamVjdCksICJ0cm91Z2giKTsKKworICAgIHJldHVybiBmYWxz
ZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmpl
Y3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIGlmIChpbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBw
ZWFyYW5jZSgpOworICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQg
fHwgcGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCk7CisKKyAgICBHdGtXaWRnZXQqIHdp
ZGdldCA9IDA7CisgICAgY29uc3QgY2hhciogZGV0YWlsID0gMDsKKyAgICBHdGtPcmllbnRhdGlv
biBvcmllbnRhdGlvbjsKKyAgICBpZiAocGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkg
eworICAgICAgICB3aWRnZXQgPSBndGtWU2NhbGUoKTsKKyAgICAgICAgZGV0YWlsID0gInZzY2Fs
ZSI7CisgICAgICAgIG9yaWVudGF0aW9uID0gR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMOworICAg
IH0gZWxzZSB7CisgICAgICAgIHdpZGdldCA9IGd0a0hTY2FsZSgpOworICAgICAgICBkZXRhaWwg
PSAiaHNjYWxlIjsKKyAgICAgICAgb3JpZW50YXRpb24gPSBHVEtfT1JJRU5UQVRJT05fSE9SSVpP
TlRBTDsKKyAgICB9CisgICAgZ3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uKHdpZGdldCwgZ3RrVGV4
dERpcmVjdGlvbihvYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSk7CisKKyAgICAvLyBPbmx5
IHNvbWUgdGhlbWVzIGhhdmUgc2xpZGVyIHRodW1icyByZXNwb25kIHRvIGNsaWNrcyBhbmQgc29t
ZSBkb24ndC4gVGhpcyBpbmZvcm1hdGlvbiBpcworICAgIC8vIGdhdGhlcmVkIHZpYSB0aGUgJ2Fj
dGl2YXRlLXNsaWRlcicgcHJvcGVydHksIGJ1dCBpdCdzIGRlcHJlY2F0ZWQgaW4gR1RLKyAyLjIy
IGFuZCByZW1vdmVkIGluCisgICAgLy8gR1RLKyAzLnguIFRoZSBkcmF3YmFjayBvZiBub3QgaG9u
b3JpbmcgaXQgaXMgdGhhdCBzbGlkZXIgdGh1bWJzIGNoYW5nZSBjb2xvciB3aGVuIHlvdSBjbGlj
aworICAgIC8vIG9uIHRoZW0uIAorICAgIEludFJlY3QgdGh1bWJSZWN0KEludFBvaW50KCksIHJl
Y3Quc2l6ZSgpKTsKKyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoaW5m
by5jb250ZXh0LCByZWN0KTsKKyAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50U2xpZGVyKHRodW1i
UmVjdCwgd2lkZ2V0LCBnZXRHdGtTdGF0ZVR5cGUob2JqZWN0KSwgR1RLX1NIQURPV19PVVQsIGRl
dGFpbCwgb3JpZW50YXRpb24pOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlck9iamVjdCogbykgY29uc3QKK3sK
KyAgICBDb250cm9sUGFydCBwYXJ0ID0gby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworI2lmIEVO
QUJMRShWSURFTykKKyAgICBpZiAocGFydCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgeworICAg
ICAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5ndGgobV9tZWRpYVNsaWRlclRodW1iV2lkdGgs
IEZpeGVkKSk7CisgICAgICAgIG8tPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgobV9tZWRpYVNs
aWRlclRodW1iSGVpZ2h0LCBGaXhlZCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlm
IChwYXJ0ID09IE1lZGlhVm9sdW1lU2xpZGVyVGh1bWJQYXJ0KQorICAgICAgICByZXR1cm47Cisj
ZW5kaWYKKworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6
b250YWxQYXJ0ID8gZ3RrSFNjYWxlKCkgOiBndGtWU2NhbGUoKTsKKyAgICBpbnQgbGVuZ3RoID0g
MCwgd2lkdGggPSAwOworICAgIGd0a193aWRnZXRfc3R5bGVfZ2V0KHdpZGdldCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAic2xpZGVyX2xlbmd0aCIsICZsZW5ndGgsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgInNsaWRlcl93aWR0aCIsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICBOVUxMKTsKKworICAgIGlmIChwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQp
IHsKKyAgICAgICAgby0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsK
KyAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aCh3aWR0aCwgRml4ZWQpKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlQocGFydCA9PSBTbGlkZXJUaHVtYlZlcnRp
Y2FsUGFydCk7CisgICAgby0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKHdpZHRoLCBGaXhlZCkp
OworICAgIG8tPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworfQor
CisjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UHJv
Z3Jlc3NCYXIoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghcmVuZGVyT2JqZWN0LT5p
c1Byb2dyZXNzKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgR3RrV2lkZ2V0KiBwcm9n
cmVzc0JhcldpZGdldCA9IG1vel9ndGtfZ2V0X3Byb2dyZXNzX3dpZGdldCgpOworICAgIGlmICgh
cHJvZ3Jlc3NCYXJXaWRnZXQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKHBhaW50
UmVuZGVyT2JqZWN0KE1PWl9HVEtfUFJPR1JFU1NCQVIsIHJlbmRlck9iamVjdCwgcGFpbnRJbmZv
LmNvbnRleHQsIHJlY3QpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEludFJlY3QgY2h1
bmtSZWN0KHJlY3QpOworICAgIFJlbmRlclByb2dyZXNzKiByZW5kZXJQcm9ncmVzcyA9IHRvUmVu
ZGVyUHJvZ3Jlc3MocmVuZGVyT2JqZWN0KTsKKworICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193
aWRnZXRfZ2V0X3N0eWxlKHByb2dyZXNzQmFyV2lkZ2V0KTsKKyAgICBjaHVua1JlY3Quc2V0SGVp
Z2h0KGNodW5rUmVjdC5oZWlnaHQoKSAtICgyICogc3R5bGUtPnl0aGlja25lc3MpKTsKKyAgICBj
aHVua1JlY3Quc2V0WShjaHVua1JlY3QueSgpICsgc3R5bGUtPnl0aGlja25lc3MpOworICAgIGNo
dW5rUmVjdC5zZXRXaWR0aCgoY2h1bmtSZWN0LndpZHRoKCkgLSAoMiAqIHN0eWxlLT54dGhpY2tu
ZXNzKSkgKiByZW5kZXJQcm9ncmVzcy0+cG9zaXRpb24oKSk7CisgICAgaWYgKHJlbmRlck9iamVj
dC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKQorICAgICAgICBjaHVua1JlY3Quc2V0WChy
ZWN0LngoKSArIHJlY3Qud2lkdGgoKSAtIGNodW5rUmVjdC53aWR0aCgpIC0gc3R5bGUtPnh0aGlj
a25lc3MpOworICAgIGVsc2UKKyAgICAgICAgY2h1bmtSZWN0LnNldFgoY2h1bmtSZWN0LngoKSAr
IHN0eWxlLT54dGhpY2tuZXNzKTsKKworICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pf
R1RLX1BST0dSRVNTX0NIVU5LLCByZW5kZXJPYmplY3QsIHBhaW50SW5mby5jb250ZXh0LCBjaHVu
a1JlY3QpOworfQorI2VuZGlmCisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2
ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRn
ZXQgPSBndGtFbnRyeSgpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQp
LT5iYXNlW0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpw
bGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBH
dGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0
X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX0FDVElWRV07Cit9CisKK0NvbG9yIFJlbmRl
clRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0
Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgpOworICAgIHJldHVybiBndGtf
d2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisK
K0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3Vu
ZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7Cisg
ICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX0FD
VElWRV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9u
QmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1Ry
ZWVWaWV3KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2Vb
R1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmluYWN0aXZl
TGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0
KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHls
ZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9BQ1RJVkVdOworfQorCitDb2xvciBSZW5kZXJUaGVt
ZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7Cisg
ICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBndGtfd2lk
Z2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0Nv
bG9yIFJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29s
b3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAg
ICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNU
SVZFXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnN5c3RlbUNvbG9yKGludCBjc3NWYWx1
ZUlkKSBjb25zdAoreworICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkgeworICAgIGNhc2UgQ1NTVmFs
dWVCdXR0b250ZXh0OgorICAgICAgICByZXR1cm4gQ29sb3IoZ3RrX3dpZGdldF9nZXRfc3R5bGUo
Z3RrQnV0dG9uKCkpLT5mZ1tHVEtfU1RBVEVfTk9STUFMXSk7CisgICAgY2FzZSBDU1NWYWx1ZUNh
cHRpb250ZXh0OgorICAgICAgICByZXR1cm4gQ29sb3IoZ3RrX3dpZGdldF9nZXRfc3R5bGUoZ3Rr
RW50cnkoKSktPmZnW0dUS19TVEFURV9OT1JNQUxdKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBy
ZXR1cm4gUmVuZGVyVGhlbWU6OnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworICAgIH0KK30KKwor
c3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxsYmFjayhHdGtXaWRnZXQqIHdpZGdldCwgR3RrU3R5
bGUqIHByZXZpb3VzLCBSZW5kZXJUaGVtZSogcmVuZGVyVGhlbWUpCit7CisgICAgLy8gRklYTUU6
IE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZ2V0IGNhbGxlZCBtYW55IHRpbWVzIGZv
ciBhIHNpbmdsZSBHVEsrIHN0eWxlIGNoYW5nZSBzaWduYWwuCisgICAgcmVuZGVyVGhlbWUtPnBs
YXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldHVw
V2lkZ2V0QW5kQWRkVG9Db250YWluZXIoR3RrV2lkZ2V0KiB3aWRnZXQsIEd0a1dpZGdldCogd2lu
ZG93KSBjb25zdAoreworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIod2luZG93
KSwgd2lkZ2V0KTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUod2lkZ2V0KTsKKyAgICBnX29iamVj
dF9zZXRfZGF0YShHX09CSkVDVCh3aWRnZXQpLCAidHJhbnNwYXJlbnQtYmctaGludCIsIEdJTlRf
VE9fUE9JTlRFUihUUlVFKSk7CisKKyAgICAvLyBGSVhNRTogUGVyaGFwcyB0aGlzIHNob3VsZCBv
bmx5IGJlIGNhbGxlZCBmb3IgdGhlIGNvbnRhaW5pbmcgd2luZG93IG9yIHBhcmVudCBjb250YWlu
ZXIuCisgICAgZ19zaWduYWxfY29ubmVjdCh3aWRnZXQsICJzdHlsZS1zZXQiLCBHX0NBTExCQUNL
KGd0a1N0eWxlU2V0Q2FsbGJhY2spLCBjb25zdF9jYXN0PFJlbmRlclRoZW1lR3RrKj4odGhpcykp
OworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtDb250YWluZXIoKSBjb25zdAor
eworICAgIGlmIChtX2d0a0NvbnRhaW5lcikKKyAgICAgICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVy
OworCisgICAgbV9ndGtXaW5kb3cgPSBndGtfd2luZG93X25ldyhHVEtfV0lORE9XX1BPUFVQKTsK
KyAgICBndGtfd2lkZ2V0X3NldF9jb2xvcm1hcChtX2d0a1dpbmRvdywgbV90aGVtZVBhcnRzLmNv
bG9ybWFwKTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUobV9ndGtXaW5kb3cpOworICAgIGd0a193
aWRnZXRfc2V0X25hbWUobV9ndGtXaW5kb3csICJNb3ppbGxhR3RrV2lkZ2V0Iik7CisKKyAgICBt
X2d0a0NvbnRhaW5lciA9IGd0a19maXhlZF9uZXcoKTsKKyAgICBzZXR1cFdpZGdldEFuZEFkZFRv
Q29udGFpbmVyKG1fZ3RrQ29udGFpbmVyLCBtX2d0a1dpbmRvdyk7CisgICAgcmV0dXJuIG1fZ3Rr
Q29udGFpbmVyOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtCdXR0b24oKSBj
b25zdAoreworICAgIGlmIChtX2d0a0J1dHRvbikKKyAgICAgICAgcmV0dXJuIG1fZ3RrQnV0dG9u
OworICAgIG1fZ3RrQnV0dG9uID0gZ3RrX2J1dHRvbl9uZXcoKTsKKyAgICBzZXR1cFdpZGdldEFu
ZEFkZFRvQ29udGFpbmVyKG1fZ3RrQnV0dG9uLCBndGtDb250YWluZXIoKSk7CisgICAgcmV0dXJu
IG1fZ3RrQnV0dG9uOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtFbnRyeSgp
IGNvbnN0Cit7CisgICAgaWYgKG1fZ3RrRW50cnkpCisgICAgICAgIHJldHVybiBtX2d0a0VudHJ5
OworICAgIG1fZ3RrRW50cnkgPSBndGtfZW50cnlfbmV3KCk7CisgICAgc2V0dXBXaWRnZXRBbmRB
ZGRUb0NvbnRhaW5lcihtX2d0a0VudHJ5LCBndGtDb250YWluZXIoKSk7CisgICAgcmV0dXJuIG1f
Z3RrRW50cnk7Cit9CisKK0d0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a1RyZWVWaWV3KCkg
Y29uc3QKK3sKKyAgICBpZiAobV9ndGtUcmVlVmlldykKKyAgICAgICAgcmV0dXJuIG1fZ3RrVHJl
ZVZpZXc7CisgICAgbV9ndGtUcmVlVmlldyA9IGd0a190cmVlX3ZpZXdfbmV3KCk7CisgICAgc2V0
dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0a1RyZWVWaWV3LCBndGtDb250YWluZXIoKSk7
CisgICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7Cit9CisKK0d0a1dpZGdldCogUmVuZGVyVGhlbWVH
dGs6Omd0a1ZTY2FsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fZ3RrVlNjYWxlKQorICAgICAgICBy
ZXR1cm4gbV9ndGtWU2NhbGU7CisgICAgbV9ndGtWU2NhbGUgPSBndGtfdnNjYWxlX25ldygwKTsK
KyAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrVlNjYWxlLCBndGtDb250YWlu
ZXIoKSk7CisgICAgcmV0dXJuIG1fZ3RrVlNjYWxlOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRo
ZW1lR3RrOjpndGtIU2NhbGUoKSBjb25zdAoreworICAgIGlmIChtX2d0a0hTY2FsZSkKKyAgICAg
ICAgcmV0dXJuIG1fZ3RrSFNjYWxlOworICAgIG1fZ3RrSFNjYWxlID0gZ3RrX2hzY2FsZV9uZXco
MCk7CisgICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0a0hTY2FsZSwgZ3RrQ29u
dGFpbmVyKCkpOworICAgIHJldHVybiBtX2d0a0hTY2FsZTsKK30KKworR3RrV2lkZ2V0KiBSZW5k
ZXJUaGVtZUd0azo6Z3RrU2Nyb2xsYmFyKCkKK3sKKyAgICByZXR1cm4gbW96X2d0a19nZXRfc2Ny
b2xsYmFyX3dpZGdldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBHVEtfQVBJX1ZFUlNJT05fMgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVu
ZGVyVGhlbWVHdGszLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMjM2MWRhOTgwOWFmYWNmMDE3NWUyNDQ2ZTc2YzFhOWY3OWMzMTJkOAot
LS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5j
cHAKQEAgLTAsMCArMSw1MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5j
LgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBD
b3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBL
ZW5uZXRoIFJvaGRlIENocmlzdGlhbnNlbgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBT
LkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWVHdGsuaCIK
KworI2lmbmRlZiBHVEtfQVBJX1ZFUlNJT05fMgorCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jk
cy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkd0a1ZlcnNpb25p
bmcuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJNZWRpYUNvbnRyb2xFbGVt
ZW50cy5oIgorI2luY2x1ZGUgIlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlRleHREaXJlY3Rp
b24uaCIKKyNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIldpZGdl
dFJlbmRlcmluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJndGtkcmF3aW5nLmgiCisjaW5jbHVkZSA8
Z2RrL2dkay5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKworI2lmIEVOQUJMRShQUk9HUkVTU19U
QUcpCisjaW5jbHVkZSAiUmVuZGVyUHJvZ3Jlc3MuaCIKKyNlbmRpZgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKy8vIFRoaXMgaXMgbm90IGEgc3RhdGljIG1ldGhvZCwgYmVjYXVzZSB3ZSB3YW50
IHRvIGF2b2lkIGhhdmluZyBHVEsrIGhlYWRlcnMgaW4gUmVuZGVyVGhlbWVHdGsuaC4KK2V4dGVy
biBHdGtUZXh0RGlyZWN0aW9uIGd0a1RleHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbik7CisKK3Zv
aWQgUmVuZGVyVGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycygpCit7CisgICAgR3RrU3R5bGUqIHN0
eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoR1RLX1dJREdFVChndGtDb250YWluZXIoKSkpOwor
ICAgIG1fcGFuZWxDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXTsKKyAgICBtX3Ns
aWRlckNvbG9yID0gc3R5bGUtPmJnW0dUS19TVEFURV9BQ1RJVkVdOworICAgIG1fc2xpZGVyVGh1
bWJDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfU0VMRUNURURdOworfQorCitHdGtTdGF0ZVR5
cGUgUmVuZGVyVGhlbWVHdGs6OmdldEd0a1N0YXRlVHlwZShSZW5kZXJPYmplY3QqIG9iamVjdCkK
K3sKKyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpIHx8IGlzUmVhZE9ubHlDb250cm9sKG9iamVj
dCkpCisgICAgICAgIHJldHVybiBHVEtfU1RBVEVfSU5TRU5TSVRJVkU7CisgICAgaWYgKGlzUHJl
c3NlZChvYmplY3QpKQorICAgICAgICByZXR1cm4gR1RLX1NUQVRFX0FDVElWRTsKKyAgICBpZiAo
aXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgIHJldHVybiBHVEtfU1RBVEVfUFJFTElHSFQ7Cisg
ICAgcmV0dXJuIEdUS19TVEFURV9OT1JNQUw7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBh
aW50UmVuZGVyT2JqZWN0KEd0a1RoZW1lV2lkZ2V0VHlwZSB0eXBlLCBSZW5kZXJPYmplY3QqIHJl
bmRlck9iamVjdCwgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0
LCBpbnQgZmxhZ3MpCit7CisgICAgLy8gUGFpbnRpbmcgaXMgZGlzYWJsZWQgc28ganVzdCBjbGFp
bSB0byBoYXZlIHN1Y2NlZWRlZAorICAgIGlmIChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEd0a1dpZGdldFN0YXRlIHdpZGdldFN0YXRl
OworICAgIHdpZGdldFN0YXRlLmFjdGl2ZSA9IGlzUHJlc3NlZChyZW5kZXJPYmplY3QpOworICAg
IHdpZGdldFN0YXRlLmZvY3VzZWQgPSBpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KTsKKworICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODM2NAorICAgIC8vIFRo
ZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29kZSwgb25seSBwYWludHMgYSBidXR0b24gYXMgcHJl
c3NlZCB3aGVuIGl0J3MgcHJlc3NlZCAKKyAgICAvLyB3aGlsZSBob3ZlcmVkLiBVbnRpbCB3ZSBt
b3ZlIGF3YXkgZnJvbSB0aGUgTW96aWxhIGNvZGUsIHdvcmstYXJvdW5kIHRoZSBpc3N1ZSBieQor
ICAgIC8vIGZvcmNpbmcgYSBwcmVzc2VkIGJ1dHRvbiBpbnRvIHRoZSBob3ZlcmVkIHN0YXRlLiBU
aGlzIGVuc3VyZXMgdGhhdCBidXR0b25zIGFjdGl2YXRlZAorICAgIC8vIHZpYSB0aGUga2V5Ym9h
cmQgaGF2ZSB0aGUgcHJvcGVyIHJlbmRlcmluZy4KKyAgICB3aWRnZXRTdGF0ZS5pbkhvdmVyID0g
aXNIb3ZlcmVkKHJlbmRlck9iamVjdCkgfHwgKHR5cGUgPT0gTU9aX0dUS19CVVRUT04gJiYgaXNQ
cmVzc2VkKHJlbmRlck9iamVjdCkpOworCisgICAgLy8gRklYTUU6IERpc2FibGVkIGRvZXMgbm90
IGFsd2F5cyBnaXZlIHRoZSBjb3JyZWN0IGFwcGVhcmFuY2UgZm9yIFJlYWRPbmx5CisgICAgd2lk
Z2V0U3RhdGUuZGlzYWJsZWQgPSAhaXNFbmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25s
eUNvbnRyb2wocmVuZGVyT2JqZWN0KTsKKyAgICB3aWRnZXRTdGF0ZS5pc0RlZmF1bHQgPSBmYWxz
ZTsKKyAgICB3aWRnZXRTdGF0ZS5jYW5EZWZhdWx0ID0gZmFsc2U7CisgICAgd2lkZ2V0U3RhdGUu
ZGVwcmVzc2VkID0gZmFsc2U7CisKKyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENv
bnRleHQoY29udGV4dCwgcmVjdCk7CisgICAgcmV0dXJuICF3aWRnZXRDb250ZXh0LnBhaW50TW96
aWxsYVdpZGdldCh0eXBlLCAmd2lkZ2V0U3RhdGUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3Qt
PnN0eWxlKCktPmRpcmVjdGlvbigpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFRvZ2dsZVNpemUo
Y29uc3QgUmVuZGVyVGhlbWVHdGsqIHRoZW1lLCBSZW5kZXJTdHlsZSogc3R5bGUsIENvbnRyb2xQ
YXJ0IGFwcGVhcmFuY2UpCit7CisgICAgLy8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGgg
c3BlY2lmaWVkLCBzbyB3ZSBzaG91bGRuJ3QgY2hhbmdlIHRoZW0uCisgICAgaWYgKCFzdHlsZS0+
d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IG5vdCBj
b3JyZWN0IHVzZSBvZiBpbmRpY2F0b3JTaXplIGFuZCBpbmRpY2F0b3JTcGFjaW5nLgorICAgIGdp
bnQgaW5kaWNhdG9yU2l6ZSwgaW5kaWNhdG9yU3BhY2luZzsKKyAgICB0aGVtZS0+Z2V0SW5kaWNh
dG9yTWV0cmljcyhhcHBlYXJhbmNlLCBpbmRpY2F0b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5nKTsK
KworICAgIC8vIE90aGVyIHBvcnRzIGhhcmQtY29kZSB0aGlzIHRvIDEzLCBidXQgR1RLKyB1c2Vy
cyB0ZW5kIHRvIGRlbWFuZCB0aGUgbmF0aXZlIGxvb2suCisgICAgLy8gSXQgY291bGQgYmUgbWFk
ZSBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHZhbHVlcyBvdGhlciB0aGFuIDEzIGFjdHVhbGx5IGJy
ZWFrIHNpdGUgY29tcGF0aWJpbGl0eS4KKyAgICBpbnQgbGVuZ3RoID0gaW5kaWNhdG9yU2l6ZSAr
IGluZGljYXRvclNwYWNpbmc7CisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JB
dXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOwor
CisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldEhl
aWdodChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjpz
ZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIHNldFRvZ2ds
ZVNpemUodGhpcywgc3R5bGUsIFJhZGlvUGFydCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6
OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3Qo
TU9aX0dUS19DSEVDS0JVVFRPTiwgb2JqZWN0LCBpbmZvLmNvbnRleHQsIHJlY3QsIGlzQ2hlY2tl
ZChvYmplY3QpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXplKFJlbmRl
clN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXplKHRoaXMsIHN0eWxlLCBS
YWRpb1BhcnQpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKFJlbmRlck9i
amVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUkFESU9CVVRUT04sIG9i
amVjdCwgaW5mby5jb250ZXh0LCByZWN0LCBpc0NoZWNrZWQob2JqZWN0KSk7Cit9CisKK2Jvb2wg
UmVuZGVyVGhlbWVHdGs6OnBhaW50QnV0dG9uKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQ
YWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKGluZm8uY29u
dGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBH
dGtXaWRnZXQqIHdpZGdldCA9IGd0a0J1dHRvbigpOworICAgIEludFJlY3QgYnV0dG9uUmVjdChJ
bnRQb2ludCgpLCByZWN0LnNpemUoKSk7CisgICAgSW50UmVjdCBmb2N1c1JlY3QoYnV0dG9uUmVj
dCk7CisKKyAgICBHdGtTdGF0ZVR5cGUgc3RhdGUgPSBnZXRHdGtTdGF0ZVR5cGUob2JqZWN0KTsK
KyAgICBndGtfd2lkZ2V0X3NldF9zdGF0ZSh3aWRnZXQsIHN0YXRlKTsKKyAgICBndGtfd2lkZ2V0
X3NldF9kaXJlY3Rpb24od2lkZ2V0LCBndGtUZXh0RGlyZWN0aW9uKG9iamVjdC0+c3R5bGUoKS0+
ZGlyZWN0aW9uKCkpKTsKKworICAgIGlmIChpc0ZvY3VzZWQob2JqZWN0KSkgeworICAgICAgICBp
ZiAoaXNFbmFibGVkKG9iamVjdCkpCisgICAgICAgICAgICBnX29iamVjdF9zZXQod2lkZ2V0LCAi
aGFzLWZvY3VzIiwgVFJVRSwgTlVMTCk7CisKKyAgICAgICAgZ2Jvb2xlYW4gaW50ZXJpb3JGb2N1
cyA9IDAsIGZvY3VzV2lkdGggPSAwLCBmb2N1c1BhZGRpbmcgPSAwOworICAgICAgICBndGtfd2lk
Z2V0X3N0eWxlX2dldCh3aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRl
cmlvci1mb2N1cyIsICZpbnRlcmlvckZvY3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1c1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiZm9jdXMtcGFkZGluZyIsICZmb2N1c1BhZGRpbmcsIE5VTEwpOworICAgICAgICAv
LyBJZiB3ZSBhcmUgdXNpbmcgZXh0ZXJpb3IgZm9jdXMsIHdlIHNocmluayB0aGUgYnV0dG9uIHJl
Y3QgZG93biBiZWZvcmUKKyAgICAgICAgLy8gZHJhd2luZy4gSWYgd2UgYXJlIHVzaW5nIGludGVy
aW9yIGZvY3VzIHdlIHNocmluayB0aGUgZm9jdXMgcmVjdC4gVGhpcworICAgICAgICAvLyBhcHBy
b2FjaCBvcmlnaW5hdGVzIGZyb20gdGhlIE1vemlsbGEgdGhlbWUgZHJhd2luZyBjb2RlIChndGsy
ZHJhd2luZy5jKS4KKyAgICAgICAgaWYgKGludGVyaW9yRm9jdXMpIHsKKyAgICAgICAgICAgIEd0
a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCk7CisgICAgICAgICAg
ICBmb2N1c1JlY3QuaW5mbGF0ZVgoLXN0eWxlLT54dGhpY2tuZXNzIC0gZm9jdXNQYWRkaW5nKTsK
KyAgICAgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlWSgtc3R5bGUtPnl0aGlja25lc3MgLSBmb2N1
c1BhZGRpbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnV0dG9uUmVjdC5pbmZs
YXRlWCgtZm9jdXNXaWR0aCAtIGZvY3VzUGFkZGluZyk7CisgICAgICAgICAgICBidXR0b25SZWN0
LmluZmxhdGVZKC1mb2N1c1BhZGRpbmcgLSBmb2N1c1BhZGRpbmcpOworICAgICAgICB9CisgICAg
fQorCisgICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGluZm8uY29udGV4
dCwgcmVjdCk7CisgICAgR3RrU2hhZG93VHlwZSBzaGFkb3dUeXBlID0gc3RhdGUgPT0gR1RLX1NU
QVRFX0FDVElWRSA/IEdUS19TSEFET1dfSU4gOiBHVEtfU0hBRE9XX09VVDsKKyAgICB3aWRnZXRD
b250ZXh0Lmd0a1BhaW50Qm94KGJ1dHRvblJlY3QsIHdpZGdldCwgc3RhdGUsIHNoYWRvd1R5cGUs
ICJidXR0b24iKTsKKyAgICBpZiAoaXNGb2N1c2VkKG9iamVjdCkpCisgICAgICAgIHdpZGdldENv
bnRleHQuZ3RrUGFpbnRGb2N1cyhmb2N1c1JlY3QsIHdpZGdldCwgc3RhdGUsICJidXR0b24iKTsK
KworICAgIGdfb2JqZWN0X3NldCh3aWRnZXQsICJoYXMtZm9jdXMiLCBGQUxTRSwgTlVMTCk7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBnZXRDb21ib0JveFBhZGRpbmcoUmVu
ZGVyU3R5bGUqIHN0eWxlLCBpbnQmIGxlZnQsIGludCYgdG9wLCBpbnQmIHJpZ2h0LCBpbnQmIGJv
dHRvbSkKK3sKKyAgICAvLyBJZiB0aGlzIG1lbnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24gdXNp
bmcgdGhlIG5hdGl2ZSB0aGVtZSwgd2UKKyAgICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBhZGRp
bmcgYmV5b25kIHdoYXQgV2ViQ29yZSBhbHJlYWR5IHVzZXMuCisgICAgaWYgKHN0eWxlLT5hcHBl
YXJhbmNlKCkgPT0gTm9Db250cm9sUGFydCkKKyAgICAgICAgcmV0dXJuOworICAgIG1vel9ndGtf
Z2V0X3dpZGdldF9ib3JkZXIoTU9aX0dUS19EUk9QRE9XTiwgJmxlZnQsICZ0b3AsICZyaWdodCwg
JmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24o
c3R5bGUtPmRpcmVjdGlvbigpKSwgVFJVRSk7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9w
dXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBp
bnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKKyAgICBnZXRDb21i
b0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJu
IGxlZnQ7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdo
dChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAw
LCByaWdodCA9IDAsIGJvdHRvbSA9IDA7CisgICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBs
ZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIHJldHVybiByaWdodDsKK30KKworaW50IFJl
bmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0Cit7CisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9
IDA7CisgICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0
b20pOworICAgIHJldHVybiB0b3A7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRl
cm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGludCBs
ZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIGdldENvbWJvQm94
UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICByZXR1cm4gYm90
dG9tOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lbnVMaXN0KFJlbmRlck9iamVj
dCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfRFJPUERPV04sIG9iamVjdCwg
aW5mby5jb250ZXh0LCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZW51
TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludE1lbnVMaXN0KG9iamVjdCwg
aW5mbywgcmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRl
cnMoUmVuZGVyU3R5bGUqIHN0eWxlKQoreworICAgIC8vIElmIHRoaXMgY29udHJvbCBpc24ndCBk
cmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZSBkb24ndCB0b3VjaCB0aGUgYm9yZGVycy4K
KyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBXZSBjYW5ub3QgZ2l2ZSBhIHByb3BlciByZW5kZXJpbmcgd2hlbiBi
b3JkZXIgcmFkaXVzIGlzIGFjdGl2ZSwgdW5mb3J0dW5hdGVseS4KKyAgICBzdHlsZS0+cmVzZXRC
b3JkZXJSYWRpdXMoKTsKKworICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBi
b3R0b20gPSAwOworICAgIG1vel9ndGtfZ2V0X3dpZGdldF9ib3JkZXIoTU9aX0dUS19FTlRSWSwg
JmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSwgVFJVRSk7CisgICAgc3R5
bGUtPnNldEJvcmRlckxlZnRXaWR0aChsZWZ0KTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyVG9wV2lk
dGgodG9wKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyUmlnaHRXaWR0aChyaWdodCk7CisgICAgc3R5
bGUtPnNldEJvcmRlckJvdHRvbVdpZHRoKGJvdHRvbSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8m
IGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2Jq
ZWN0KE1PWl9HVEtfRU5UUlksIG9iamVjdCwgaW5mby5jb250ZXh0LCByZWN0KTsKK30KKworYm9v
bCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG9iamVjdCwg
Y29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChp
bmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOwor
ICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlckhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVy
VmVydGljYWxQYXJ0KTsKKworICAgIC8vIFdlIHNocmluayB0aGUgdHJvdWdoIHJlY3Qgc2xpZ2h0
bHkgdG8gbWFrZSByb29tIGZvciB0aGUgZm9jdXMgaW5kaWNhdG9yLgorICAgIEludFJlY3QgdHJv
dWdoUmVjdChJbnRQb2ludCgpLCByZWN0LnNpemUoKSk7IC8vIFRoaXMgaXMgcmVsYXRpdmUgdG8g
cmVjdC4KKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IDA7CisgICAgaWYgKHBhcnQgPT0gU2xpZGVy
VmVydGljYWxQYXJ0KSB7CisgICAgICAgIHdpZGdldCA9IGd0a1ZTY2FsZSgpOworICAgICAgICB0
cm91Z2hSZWN0LmluZmxhdGVZKC1ndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT55dGhpY2tu
ZXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aWRnZXQgPSBndGtIU2NhbGUoKTsKKyAgICAg
ICAgdHJvdWdoUmVjdC5pbmZsYXRlWCgtZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+eHRo
aWNrbmVzcyk7CisgICAgfQorICAgIGd0a193aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIGd0
a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworCisgICAgV2lk
Z2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGluZm8uY29udGV4dCwgcmVjdCk7Cisg
ICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEJveCh0cm91Z2hSZWN0LCB3aWRnZXQsIEdUS19TVEFU
RV9BQ1RJVkUsIEdUS19TSEFET1dfT1VULCAidHJvdWdoIik7CisgICAgaWYgKGlzRm9jdXNlZChv
YmplY3QpKQorICAgICAgICB3aWRnZXRDb250ZXh0Lmd0a1BhaW50Rm9jdXMoSW50UmVjdChJbnRQ
b2ludCgpLCByZWN0LnNpemUoKSksIHdpZGdldCwgZ2V0R3RrU3RhdGVUeXBlKG9iamVjdCksICJ0
cm91Z2giKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6
cGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBp
bmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChpbmZvLmNvbnRleHQtPnBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ29udHJvbFBhcnQg
cGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworICAgIEFTU0VSVChwYXJ0ID09
IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQgfHwgcGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2Fs
UGFydCk7CisKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IDA7CisgICAgY29uc3QgY2hhciogZGV0
YWlsID0gMDsKKyAgICBHdGtPcmllbnRhdGlvbiBvcmllbnRhdGlvbjsKKyAgICBpZiAocGFydCA9
PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgeworICAgICAgICB3aWRnZXQgPSBndGtWU2NhbGUo
KTsKKyAgICAgICAgZGV0YWlsID0gInZzY2FsZSI7CisgICAgICAgIG9yaWVudGF0aW9uID0gR1RL
X09SSUVOVEFUSU9OX1ZFUlRJQ0FMOworICAgIH0gZWxzZSB7CisgICAgICAgIHdpZGdldCA9IGd0
a0hTY2FsZSgpOworICAgICAgICBkZXRhaWwgPSAiaHNjYWxlIjsKKyAgICAgICAgb3JpZW50YXRp
b24gPSBHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTDsKKyAgICB9CisgICAgZ3RrX3dpZGdldF9z
ZXRfZGlyZWN0aW9uKHdpZGdldCwgZ3RrVGV4dERpcmVjdGlvbihvYmplY3QtPnN0eWxlKCktPmRp
cmVjdGlvbigpKSk7CisKKyAgICAvLyBPbmx5IHNvbWUgdGhlbWVzIGhhdmUgc2xpZGVyIHRodW1i
cyByZXNwb25kIHRvIGNsaWNrcyBhbmQgc29tZSBkb24ndC4gVGhpcyBpbmZvcm1hdGlvbiBpcwor
ICAgIC8vIGdhdGhlcmVkIHZpYSB0aGUgJ2FjdGl2YXRlLXNsaWRlcicgcHJvcGVydHksIGJ1dCBp
dCdzIGRlcHJlY2F0ZWQgaW4gR1RLKyAyLjIyIGFuZCByZW1vdmVkIGluCisgICAgLy8gR1RLKyAz
LnguIFRoZSBkcmF3YmFjayBvZiBub3QgaG9ub3JpbmcgaXQgaXMgdGhhdCBzbGlkZXIgdGh1bWJz
IGNoYW5nZSBjb2xvciB3aGVuIHlvdSBjbGljaworICAgIC8vIG9uIHRoZW0uIAorICAgIEludFJl
Y3QgdGh1bWJSZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKTsKKyAgICBXaWRnZXRSZW5kZXJp
bmdDb250ZXh0IHdpZGdldENvbnRleHQoaW5mby5jb250ZXh0LCByZWN0KTsKKyAgICB3aWRnZXRD
b250ZXh0Lmd0a1BhaW50U2xpZGVyKHRodW1iUmVjdCwgd2lkZ2V0LCBnZXRHdGtTdGF0ZVR5cGUo
b2JqZWN0KSwgR1RLX1NIQURPV19PVVQsIGRldGFpbCwgb3JpZW50YXRpb24pOworICAgIHJldHVy
biBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTaXpl
KFJlbmRlck9iamVjdCogbykgY29uc3QKK3sKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gby0+c3R5
bGUoKS0+YXBwZWFyYW5jZSgpOworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAocGFydCA9PSBN
ZWRpYVNsaWRlclRodW1iUGFydCkgeworICAgICAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5n
dGgobV9tZWRpYVNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7CisgICAgICAgIG8tPnN0eWxlKCkt
PnNldEhlaWdodChMZW5ndGgobV9tZWRpYVNsaWRlclRodW1iSGVpZ2h0LCBGaXhlZCkpOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwYXJ0ID09IE1lZGlhVm9sdW1lU2xpZGVyVGh1
bWJQYXJ0KQorICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAgIEd0a1dpZGdldCogd2lkZ2V0
ID0gcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8gZ3RrSFNjYWxlKCkgOiBndGtW
U2NhbGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gMCwgd2lkdGggPSAwOworICAgIGd0a193aWRnZXRf
c3R5bGVfZ2V0KHdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2xpZGVyX2xlbmd0
aCIsICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlcl93aWR0aCIsICZ3
aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIGlmIChwYXJ0ID09
IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgby0+c3R5bGUoKS0+c2V0V2lk
dGgoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKKyAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0
KExlbmd0aCh3aWR0aCwgRml4ZWQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NF
UlQocGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCk7CisgICAgby0+c3R5bGUoKS0+c2V0
V2lkdGgoTGVuZ3RoKHdpZHRoLCBGaXhlZCkpOworICAgIG8tPnN0eWxlKCktPnNldEhlaWdodChM
ZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworfQorCisjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKK2Jv
b2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UHJvZ3Jlc3NCYXIoUmVuZGVyT2JqZWN0KiByZW5kZXJP
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc1Byb2dyZXNzKCkpCisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgR3RrV2lkZ2V0KiBwcm9ncmVzc0JhcldpZGdldCA9IG1vel9ndGtfZ2V0X3By
b2dyZXNzX3dpZGdldCgpOworICAgIGlmICghcHJvZ3Jlc3NCYXJXaWRnZXQpCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUFJPR1JFU1NC
QVIsIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIHJlY3QpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIEludFJlY3QgY2h1bmtSZWN0KHJlY3QpOworICAgIFJlbmRlclByb2dy
ZXNzKiByZW5kZXJQcm9ncmVzcyA9IHRvUmVuZGVyUHJvZ3Jlc3MocmVuZGVyT2JqZWN0KTsKKwor
ICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHByb2dyZXNzQmFyV2lk
Z2V0KTsKKyAgICBjaHVua1JlY3Quc2V0SGVpZ2h0KGNodW5rUmVjdC5oZWlnaHQoKSAtICgyICog
c3R5bGUtPnl0aGlja25lc3MpKTsKKyAgICBjaHVua1JlY3Quc2V0WShjaHVua1JlY3QueSgpICsg
c3R5bGUtPnl0aGlja25lc3MpOworICAgIGNodW5rUmVjdC5zZXRXaWR0aCgoY2h1bmtSZWN0Lndp
ZHRoKCkgLSAoMiAqIHN0eWxlLT54dGhpY2tuZXNzKSkgKiByZW5kZXJQcm9ncmVzcy0+cG9zaXRp
b24oKSk7CisgICAgaWYgKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRM
KQorICAgICAgICBjaHVua1JlY3Quc2V0WChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSAtIGNodW5r
UmVjdC53aWR0aCgpIC0gc3R5bGUtPnh0aGlja25lc3MpOworICAgIGVsc2UKKyAgICAgICAgY2h1
bmtSZWN0LnNldFgoY2h1bmtSZWN0LngoKSArIHN0eWxlLT54dGhpY2tuZXNzKTsKKworICAgIHJl
dHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX1BST0dSRVNTX0NIVU5LLCByZW5kZXJPYmpl
Y3QsIHBhaW50SW5mby5jb250ZXh0LCBjaHVua1JlY3QpOworfQorI2VuZGlmCisKK0NvbG9yIFJl
bmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNv
bnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgpOworICAgIHJldHVybiBn
dGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9TRUxFQ1RFRF07Cit9
CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7
CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRF
X0FDVElWRV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVj
dGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBn
dGtFbnRyeSgpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0
W0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9y
bUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRn
ZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxl
KHdpZGdldCktPnRleHRbR1RLX1NUQVRFX0FDVElWRV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1l
R3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAg
ICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7CisgICAgcmV0dXJuIGd0a193aWRn
ZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29s
b3IgUmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xv
cigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAg
IHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9BQ1RJ
VkVdOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZv
cmVncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVl
VmlldygpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dU
S19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxp
c3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCog
d2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUo
d2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNUSVZFXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVH
dGs6OnN5c3RlbUNvbG9yKGludCBjc3NWYWx1ZUlkKSBjb25zdAoreworICAgIHN3aXRjaCAoY3Nz
VmFsdWVJZCkgeworICAgIGNhc2UgQ1NTVmFsdWVCdXR0b250ZXh0OgorICAgICAgICByZXR1cm4g
Q29sb3IoZ3RrX3dpZGdldF9nZXRfc3R5bGUoZ3RrQnV0dG9uKCkpLT5mZ1tHVEtfU1RBVEVfTk9S
TUFMXSk7CisgICAgY2FzZSBDU1NWYWx1ZUNhcHRpb250ZXh0OgorICAgICAgICByZXR1cm4gQ29s
b3IoZ3RrX3dpZGdldF9nZXRfc3R5bGUoZ3RrRW50cnkoKSktPmZnW0dUS19TVEFURV9OT1JNQUxd
KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUmVuZGVyVGhlbWU6OnN5c3RlbUNvbG9y
KGNzc1ZhbHVlSWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxsYmFj
ayhHdGtXaWRnZXQqIHdpZGdldCwgR3RrU3R5bGUqIHByZXZpb3VzLCBSZW5kZXJUaGVtZSogcmVu
ZGVyVGhlbWUpCit7CisgICAgLy8gRklYTUU6IE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGRvZXNu
J3QgZ2V0IGNhbGxlZCBtYW55IHRpbWVzIGZvciBhIHNpbmdsZSBHVEsrIHN0eWxlIGNoYW5nZSBz
aWduYWwuCisgICAgcmVuZGVyVGhlbWUtPnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIoR3RrV2lk
Z2V0KiB3aWRnZXQsIEd0a1dpZGdldCogd2luZG93KSBjb25zdAoreworICAgIGd0a19jb250YWlu
ZXJfYWRkKEdUS19DT05UQUlORVIod2luZG93KSwgd2lkZ2V0KTsKKyAgICBndGtfd2lkZ2V0X3Jl
YWxpemUod2lkZ2V0KTsKKyAgICBnX29iamVjdF9zZXRfZGF0YShHX09CSkVDVCh3aWRnZXQpLCAi
dHJhbnNwYXJlbnQtYmctaGludCIsIEdJTlRfVE9fUE9JTlRFUihUUlVFKSk7CisKKyAgICAvLyBG
SVhNRTogUGVyaGFwcyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgdGhlIGNvbnRhaW5p
bmcgd2luZG93IG9yIHBhcmVudCBjb250YWluZXIuCisgICAgZ19zaWduYWxfY29ubmVjdCh3aWRn
ZXQsICJzdHlsZS1zZXQiLCBHX0NBTExCQUNLKGd0a1N0eWxlU2V0Q2FsbGJhY2spLCBjb25zdF9j
YXN0PFJlbmRlclRoZW1lR3RrKj4odGhpcykpOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1l
R3RrOjpndGtDb250YWluZXIoKSBjb25zdAoreworICAgIGlmIChtX2d0a0NvbnRhaW5lcikKKyAg
ICAgICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOworCisgICAgbV9ndGtXaW5kb3cgPSBndGtfd2lu
ZG93X25ldyhHVEtfV0lORE9XX1BPUFVQKTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUobV9ndGtX
aW5kb3cpOworICAgIGd0a193aWRnZXRfc2V0X25hbWUobV9ndGtXaW5kb3csICJNb3ppbGxhR3Rr
V2lkZ2V0Iik7CisKKyAgICBtX2d0a0NvbnRhaW5lciA9IGd0a19maXhlZF9uZXcoKTsKKyAgICBz
ZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrQ29udGFpbmVyLCBtX2d0a1dpbmRvdyk7
CisgICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1l
R3RrOjpndGtCdXR0b24oKSBjb25zdAoreworICAgIGlmIChtX2d0a0J1dHRvbikKKyAgICAgICAg
cmV0dXJuIG1fZ3RrQnV0dG9uOworICAgIG1fZ3RrQnV0dG9uID0gZ3RrX2J1dHRvbl9uZXcoKTsK
KyAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrQnV0dG9uLCBndGtDb250YWlu
ZXIoKSk7CisgICAgcmV0dXJuIG1fZ3RrQnV0dG9uOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRo
ZW1lR3RrOjpndGtFbnRyeSgpIGNvbnN0Cit7CisgICAgaWYgKG1fZ3RrRW50cnkpCisgICAgICAg
IHJldHVybiBtX2d0a0VudHJ5OworICAgIG1fZ3RrRW50cnkgPSBndGtfZW50cnlfbmV3KCk7Cisg
ICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0a0VudHJ5LCBndGtDb250YWluZXIo
KSk7CisgICAgcmV0dXJuIG1fZ3RrRW50cnk7Cit9CisKK0d0a1dpZGdldCogUmVuZGVyVGhlbWVH
dGs6Omd0a1RyZWVWaWV3KCkgY29uc3QKK3sKKyAgICBpZiAobV9ndGtUcmVlVmlldykKKyAgICAg
ICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7CisgICAgbV9ndGtUcmVlVmlldyA9IGd0a190cmVlX3Zp
ZXdfbmV3KCk7CisgICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0a1RyZWVWaWV3
LCBndGtDb250YWluZXIoKSk7CisgICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7Cit9CisKK0d0a1dp
ZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a1ZTY2FsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fZ3Rr
VlNjYWxlKQorICAgICAgICByZXR1cm4gbV9ndGtWU2NhbGU7CisgICAgbV9ndGtWU2NhbGUgPSBn
dGtfdnNjYWxlX25ldygwKTsKKyAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3Rr
VlNjYWxlLCBndGtDb250YWluZXIoKSk7CisgICAgcmV0dXJuIG1fZ3RrVlNjYWxlOworfQorCitH
dGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtIU2NhbGUoKSBjb25zdAoreworICAgIGlmICht
X2d0a0hTY2FsZSkKKyAgICAgICAgcmV0dXJuIG1fZ3RrSFNjYWxlOworICAgIG1fZ3RrSFNjYWxl
ID0gZ3RrX2hzY2FsZV9uZXcoMCk7CisgICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lciht
X2d0a0hTY2FsZSwgZ3RrQ29udGFpbmVyKCkpOworICAgIHJldHVybiBtX2d0a0hTY2FsZTsKK30K
KworR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrU2Nyb2xsYmFyKCkKK3sKKyAgICByZXR1
cm4gbW96X2d0a19nZXRfc2Nyb2xsYmFyX3dpZGdldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyAhR1RLX0FQSV9WRVJTSU9OXzIK
</data>

          </attachment>
      

    </bug>

</bugzilla>