<?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>156462</bug_id>
          
          <creation_ts>2016-04-11 04:10:09 -0700</creation_ts>
          <short_desc>[GTK] Rework scrollbars theming code for GTK+ 3.20</short_desc>
          <delta_ts>2016-04-12 05:43:05 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>WebKit Local Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=156333</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Carlos Garcia Campos">cgarcia</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bugs-noreply</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1182662</commentid>
    <comment_count>0</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2016-04-11 04:10:09 -0700</bug_when>
    <thetext>For the same reasons of bug #156333, now that we have RenderThemeGadget we can use that to render the scrollbars too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1182668</commentid>
    <comment_count>1</comment_count>
      <attachid>276138</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2016-04-11 04:51:53 -0700</bug_when>
    <thetext>Created attachment 276138
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1182945</commentid>
    <comment_count>2</comment_count>
      <attachid>276138</attachid>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2016-04-11 20:31:28 -0700</bug_when>
    <thetext>Comment on attachment 276138
Patch

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

&gt; Source/WebCore/ChangeLog:9
&gt; +        needed for scrollbars, this patch uses the RenderthemGadget classes introduced in r199292 to render the native

Renderthem!

&gt; Source/WebCore/platform/gtk/RenderThemeGadget.cpp:70
&gt; +    // Scrollbars need to use its GType to be able to get non-CSS style properties.

Wow, I thought the type was ignored....

&gt; Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp:86
&gt; +static GRefPtr&lt;GtkStyleContext&gt; createChildStyleContext(GtkStyleContext* parent, const char* name)

I&apos;d use className instead of name to make it more clear what that parameter is for.

&gt; Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp:157
&gt; +        FALLTHROUGH;

Didn&apos;t know we had this. Cool.

&gt; Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp:309
&gt; +    // painting the thumb can be skipped. We don&apos;t have to be exact here.

I would name the method something like ScrollbarThemeGtk::probablyHasThumb.

&gt; Source/WebCore/platform/gtk/ScrollbarThemeGtk.h:65
&gt; +    bool m_hasForwardButtonStartPart : 1;

I don&apos;t pretend to know if using a bitfield here would improve performance because due to better cache locality, or hurt performance due to the nature of bitfields (seems more likely to me?), but it only saves three bytes, and it&apos;s not like this structure is going to be allocated frequently (should be just once, right?) so I would personally use normal bools here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183036</commentid>
    <comment_count>3</comment_count>
      <attachid>276138</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2016-04-12 05:13:51 -0700</bug_when>
    <thetext>Comment on attachment 276138
Patch

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

&gt;&gt; Source/WebCore/platform/gtk/RenderThemeGadget.cpp:70
&gt;&gt; +    // Scrollbars need to use its GType to be able to get non-CSS style properties.
&gt; 
&gt; Wow, I thought the type was ignored....

Me too, but otherwise gtk_style_context_get_style() fails when trying to get has-*-steppers properties.

&gt;&gt; Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp:309
&gt;&gt; +    // painting the thumb can be skipped. We don&apos;t have to be exact here.
&gt; 
&gt; I would name the method something like ScrollbarThemeGtk::probablyHasThumb.

This is inherited, it&apos;s pure virtual of ScrollbarThemeComposite

&gt;&gt; Source/WebCore/platform/gtk/ScrollbarThemeGtk.h:65
&gt;&gt; +    bool m_hasForwardButtonStartPart : 1;
&gt; 
&gt; I don&apos;t pretend to know if using a bitfield here would improve performance because due to better cache locality, or hurt performance due to the nature of bitfields (seems more likely to me?), but it only saves three bytes, and it&apos;s not like this structure is going to be allocated frequently (should be just once, right?) so I would personally use normal bools here.

This is a singleton. We didn&apos;t use bool nor bitfield before because we used the member addresses directly in gtk_style_context_get_style(), but now that with newer GTK+ we have a different approach and we have to set the values individually, I thought it wouldn&apos;t hurt to use bool : 1 for these values, but I agree this doesn&apos;t make a huge difference.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183038</commentid>
    <comment_count>4</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2016-04-12 05:43:05 -0700</bug_when>
    <thetext>Committed r199344: &lt;http://trac.webkit.org/changeset/199344&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>276138</attachid>
            <date>2016-04-11 04:51:53 -0700</date>
            <delta_ts>2016-04-11 20:31:28 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>wcore-scrollbars-gtk320.diff</filename>
            <type>text/plain</type>
            <size>72954</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAyMjQ1M2JmLi41ZDMzMmZiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDkg
QEAKKzIwMTYtMDQtMTEgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29t
PgorCisgICAgICAgIFtHVEtdIFJld29yayBzY3JvbGxiYXJzIHRoZW1pbmcgY29kZSBmb3IgR1RL
KyAzLjIwCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
NTY0NjIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJ
biByMTk5MjkyLCB3ZSByZXdvcmtlZCB0aGUgdGhlbWluZyBjb2RlIHRvIGVuc3VyZSBpdCB3b3Jr
cyB3aXRoIHRoZSBuZXcgR1RLKyBDU1MgdGhlbWluZyBzeXN0ZW0uIFRoZSBzYW1lIGlzCisgICAg
ICAgIG5lZWRlZCBmb3Igc2Nyb2xsYmFycywgdGhpcyBwYXRjaCB1c2VzIHRoZSBSZW5kZXJ0aGVt
R2FkZ2V0IGNsYXNzZXMgaW50cm9kdWNlZCBpbiByMTk5MjkyIHRvIHJlbmRlciB0aGUgbmF0aXZl
CisgICAgICAgIHNjcm9sbGJhcnMuIFRoZSBjb2RlIGlzIG5vdyBzcGxpdCBpbiAzIHBhcnRzOiBz
dHViIG1ldGhvZHMgZm9yIEdUSysyIChzaW5jZSB0aGlzIGZpbGUgaXMgY29tcGlsZWQgZm9yCisg
ICAgICAgIFdlYkNvcmVHVEssIGJ1dCBub3QgdXNlZCksIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Ig
R1RLKyA8IDMuMjAgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgR1RLKyA+PSAzLjIwLiBUaGlz
CisgICAgICAgIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBpZmRlZmVkIGNvZGUsIGFuZCBlbnN1cmVz
IHRoYXQgY2hhbmdlcyBpbiBuZXcgY29kZSBkb24ndCBicmVhayB0aGUgcmVuZGVyaW5nIHdpdGgg
b2xkZXIKKyAgICAgICAgdmVyc2lvbnMgb2YgR1RLKy4gSSBub3RpY2VkIHRoYXQgd2Ugd2VyZSBv
dmVycmlkaW5nIGJvdGgsIHRoZSBzcGVjaWZpYyBwYWludCBtZXRob2RzIHRvIHJlbmRlciBzY3Jv
bGxiYXJzCisgICAgICAgIHBhcnRzIGFuZCB0aGUgZ2xvYmFsIHBhaW50IG1ldGhvZCB0aGF0IHJl
bmRlcnMgYWxsIHRoZSBzY3JvbGxiYXIgcGFydHMuIFdlIGRvbid0IHJlYWxseSBuZWVkIHRoZSBz
cGVjaWZpYyBwYWludAorICAgICAgICBtZXRob2RzLCBzbyBJJ3ZlIHJlbW92ZWQgdGhlIGltcGxl
bWVudGlvbiBsZWF2aW5nIG9ubHkgdGhlIHBhaW50IG1ldGhvZC4gVGhpcyBhbHNvIGFsbG93cyB1
cyB0byBnZXQgcmlkIG9mIHRoZQorICAgICAgICBHdGtTdHlsZUNvbnRleHQgY2FjaGUuCisKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHYWRnZXQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVHYWRnZXQ6OmNyZWF0ZSk6IEhhbmRsZSBzY3JvbGxiYXJzIGdhZGdl
dHMuCisgICAgICAgIChXZWJDb3JlOjphcHBlbmRFbGVtZW50VG9QYXRoKTogSW4gY2FzZSBvZiBz
Y3JvbGxiYXIgZ2FkZ2V0LCB1c2UgdGhlIHNjcm9sbGJhciBHVHlwZSB3aGVuIGNyZWF0aW5nIHRo
ZSBwYXRoIHRvCisgICAgICAgIGJlIGFibGUgdG8gZ2V0IG5vbi1DU1Mgc3R5bGUgcHJvcGVydGll
cy4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR2FkZ2V0OjpvcGFjaXR5KTogQWRkIG1l
dGhvZCB0byBnZXQgdGhlIG9wYWNpdHkgQ1NTIHN0eWxlIHByb3BlcnR5LgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVTY3JvbGxiYXJHYWRnZXQ6OlJlbmRlclRoZW1lU2Nyb2xsYmFyR2Fk
Z2V0KTogSW5pdGlhbGl6ZSBtX3N0ZXBwZXJzIG9wdGlvbiBzZXQgd2l0aCB0aGUKKyAgICAgICAg
c3RlcHBlcnMgdXNlZCBieSB0aGUgdGhlbWUuCisgICAgICAgICogcGxhdGZvcm0vZ3RrL1JlbmRl
clRoZW1lR2FkZ2V0Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3Rr
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnRoZW1lQ2hhbmdlZENhbGxiYWNrKToKKyAgICAgICAg
KFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjpTY3JvbGxiYXJUaGVtZUd0ayk6CisgICAgICAg
IChXZWJDb3JlOjpjcmVhdGVTdHlsZUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRl
Q2hpbGRTdHlsZUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6
OnRoZW1lQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpTY3JvbGxiYXJUaGVtZUd0azo6dXBk
YXRlVGhlbWVQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OnNjcm9sbGJhclBhcnRTdGF0
ZUZsYWdzKToKKyAgICAgICAgKFdlYkNvcmU6OnNjcm9sbGJhckdhZGdldEZvckxheW91dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpjb250ZW50c0dhZGdldEZvckxheW91dCk6CisgICAgICAgIChXZWJD
b3JlOjpTY3JvbGxiYXJUaGVtZUd0azo6dHJhY2tSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlNj
cm9sbGJhclRoZW1lR3RrOjpoYXNUaHVtYik6CisgICAgICAgIChXZWJDb3JlOjpTY3JvbGxiYXJU
aGVtZUd0azo6YmFja0J1dHRvblJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhl
bWVHdGs6OmZvcndhcmRCdXR0b25SZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRo
ZW1lR3RrOjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpwYWludFN0ZXBwZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6YWRqdXN0UmVjdEFjY29yZGluZ1RvTWFyZ2luKToKKyAgICAgICAgKFdlYkNv
cmU6OlNjcm9sbGJhclRoZW1lR3RrOjpzY3JvbGxiYXJUaGlja25lc3MpOgorICAgICAgICAoV2Vi
Q29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6Om1pbmltdW1UaHVtYkxlbmd0aCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrLmg6CisKIDIwMTYtMDMtMjkgIENhcmxvcyBH
YXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgogCiAgICAgICAgIEFkZCBhIHNldHRp
bmcgdG8gZGVjaWRlIHdoZXRoZXIgdG8gYWxsb3cgc3RhbGUgZGF0YSBhZnRlciBzZXNzaW9uIHJl
c3RvcmUgb3Igbm90CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVu
ZGVyVGhlbWVHYWRnZXQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRo
ZW1lR2FkZ2V0LmNwcAppbmRleCA4ZDVlMzk4Li42MTY2ZTFlIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHYWRnZXQuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUdhZGdldC5jcHAKQEAgLTQ3LDYgKzQ3LDgg
QEAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlclRoZW1lR2FkZ2V0PiBSZW5kZXJUaGVtZUdhZGdldDo6
Y3JlYXRlKGNvbnN0IFJlbmRlclRoZW1lR2EKICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlx
dWU8UmVuZGVyVGhlbWVBcnJvd0dhZGdldD4oaW5mbywgcGFyZW50LCBzaWJsaW5ncywgcG9zaXRp
b24pOwogICAgIGNhc2UgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6Okljb246CiAgICAgICAgIHJl
dHVybiBzdGQ6Om1ha2VfdW5pcXVlPFJlbmRlclRoZW1lSWNvbkdhZGdldD4oaW5mbywgcGFyZW50
LCBzaWJsaW5ncywgcG9zaXRpb24pOworICAgIGNhc2UgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6
OlNjcm9sbGJhcjoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8UmVuZGVyVGhlbWVT
Y3JvbGxiYXJHYWRnZXQ+KGluZm8sIHBhcmVudCwgc2libGluZ3MsIHBvc2l0aW9uKTsKICAgICB9
CiAKICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKQEAgLTY1LDcgKzY3LDggQEAgc3RhdGljIEdS
ZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBjcmVhdGVTdHlsZUNvbnRleHQoR3RrV2lkZ2V0UGF0aCog
cGF0aCwgR3RrU3R5bGUKIAogc3RhdGljIHZvaWQgYXBwZW5kRWxlbWVudFRvUGF0aChHdGtXaWRn
ZXRQYXRoKiBwYXRoLCBjb25zdCBSZW5kZXJUaGVtZUdhZGdldDo6SW5mbyYgaW5mbykKIHsKLSAg
ICBndGtfd2lkZ2V0X3BhdGhfYXBwZW5kX3R5cGUocGF0aCwgR19UWVBFX05PTkUpOworICAgIC8v
IFNjcm9sbGJhcnMgbmVlZCB0byB1c2UgaXRzIEdUeXBlIHRvIGJlIGFibGUgdG8gZ2V0IG5vbi1D
U1Mgc3R5bGUgcHJvcGVydGllcy4KKyAgICBndGtfd2lkZ2V0X3BhdGhfYXBwZW5kX3R5cGUocGF0
aCwgaW5mby50eXBlID09IFJlbmRlclRoZW1lR2FkZ2V0OjpUeXBlOjpTY3JvbGxiYXIgPyBHVEtf
VFlQRV9TQ1JPTExCQVIgOiBHX1RZUEVfTk9ORSk7CiAgICAgZ3RrX3dpZGdldF9wYXRoX2l0ZXJf
c2V0X29iamVjdF9uYW1lKHBhdGgsIC0xLCBpbmZvLm5hbWUpOwogICAgIGZvciAoY29uc3QgYXV0
byogY2xhc3NOYW1lIDogaW5mby5jbGFzc0xpc3QpCiAgICAgICAgIGd0a193aWRnZXRfcGF0aF9p
dGVyX2FkZF9jbGFzcyhwYXRoLCAtMSwgY2xhc3NOYW1lKTsKQEAgLTEzNiw2ICsxMzksMTMgQEAg
Q29sb3IgUmVuZGVyVGhlbWVHYWRnZXQ6OmJhY2tncm91bmRDb2xvcigpIGNvbnN0CiAgICAgcmV0
dXJuIHJldHVyblZhbHVlOwogfQogCitkb3VibGUgUmVuZGVyVGhlbWVHYWRnZXQ6Om9wYWNpdHko
KSBjb25zdAoreworICAgIGRvdWJsZSByZXR1cm5WYWx1ZTsKKyAgICBndGtfc3R5bGVfY29udGV4
dF9nZXQobV9jb250ZXh0LmdldCgpLCBndGtfc3R5bGVfY29udGV4dF9nZXRfc3RhdGUobV9jb250
ZXh0LmdldCgpKSwgIm9wYWNpdHkiLCAmcmV0dXJuVmFsdWUsIG51bGxwdHIpOworICAgIHJldHVy
biByZXR1cm5WYWx1ZTsKK30KKwogSW50U2l6ZSBSZW5kZXJUaGVtZUdhZGdldDo6bWluaW11bVNp
emUoKSBjb25zdAogewogICAgIGludCB3aWR0aCwgaGVpZ2h0OwpAQCAtMzIyLDYgKzMzMiwyMiBA
QCBJbnRTaXplIFJlbmRlclRoZW1lSWNvbkdhZGdldDo6bWluaW11bVNpemUoKSBjb25zdAogICAg
IHJldHVybiBJbnRTaXplKG1faWNvblNpemUsIG1faWNvblNpemUpOwogfQogCitSZW5kZXJUaGVt
ZVNjcm9sbGJhckdhZGdldDo6UmVuZGVyVGhlbWVTY3JvbGxiYXJHYWRnZXQoY29uc3QgUmVuZGVy
VGhlbWVHYWRnZXQ6OkluZm8mIGluZm8sIFJlbmRlclRoZW1lR2FkZ2V0KiBwYXJlbnQsIGNvbnN0
IFZlY3RvcjxSZW5kZXJUaGVtZUdhZGdldDo6SW5mbz4gc2libGluZ3MsIHVuc2lnbmVkIHBvc2l0
aW9uKQorICAgIDogUmVuZGVyVGhlbWVHYWRnZXQoaW5mbywgcGFyZW50LCBzaWJsaW5ncywgcG9z
aXRpb24pCit7CisgICAgZ2Jvb2xlYW4gaGFzQmFja3dhcmQsIGhhc0ZvcndhcmQsIGhhc1NlY29u
ZGFyeUJhY2t3YXJkLCBoYXNTZWNvbmRhcnlGb3J3YXJkOworICAgIGd0a19zdHlsZV9jb250ZXh0
X2dldF9zdHlsZShtX2NvbnRleHQuZ2V0KCksICJoYXMtYmFja3dhcmQtc3RlcHBlciIsICZoYXNC
YWNrd2FyZCwgImhhcy1mb3J3YXJkLXN0ZXBwZXIiLCAmaGFzRm9yd2FyZCwKKyAgICAgICAgImhh
cy1zZWNvbmRhcnktYmFja3dhcmQtc3RlcHBlciIsICZoYXNTZWNvbmRhcnlCYWNrd2FyZCwgImhh
cy1zZWNvbmRhcnktZm9yd2FyZC1zdGVwcGVyIiwgJmhhc1NlY29uZGFyeUZvcndhcmQsIG51bGxw
dHIpOworICAgIGlmIChoYXNCYWNrd2FyZCkKKyAgICAgICAgbV9zdGVwcGVycyB8PSBTdGVwcGVy
czo6QmFja3dhcmQ7CisgICAgaWYgKGhhc0ZvcndhcmQpCisgICAgICAgIG1fc3RlcHBlcnMgfD0g
U3RlcHBlcnM6OkZvcndhcmQ7CisgICAgaWYgKGhhc1NlY29uZGFyeUJhY2t3YXJkKQorICAgICAg
ICBtX3N0ZXBwZXJzIHw9IFN0ZXBwZXJzOjpTZWNvbmRhcnlCYWNrd2FyZDsKKyAgICBpZiAoaGFz
U2Vjb25kYXJ5Rm9yd2FyZCkKKyAgICAgICAgbV9zdGVwcGVycyB8PSBTdGVwcGVyczo6U2Vjb25k
YXJ5Rm9yd2FyZDsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gR1RL
X0NIRUNLX1ZFUlNJT04oMywgMjAsIDApCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ndGsvUmVuZGVyVGhlbWVHYWRnZXQuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0
ay9SZW5kZXJUaGVtZUdhZGdldC5oCmluZGV4IDE5ZDJkZGMuLmU1MWRiYmIgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUdhZGdldC5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUdhZGdldC5oCkBAIC0zMSw2ICsz
MSw3IEBACiAKICNpbmNsdWRlICJDb2xvci5oIgogI2luY2x1ZGUgIkludFNpemUuaCIKKyNpbmNs
dWRlIDx3dGYvT3B0aW9uU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogI2luY2x1ZGUg
PHd0Zi9nbGliL0dSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CkBAIC00
OCw3ICs0OSw4IEBAIHB1YmxpYzoKICAgICAgICAgQ2hlY2ssCiAgICAgICAgIFJhZGlvLAogICAg
ICAgICBBcnJvdywKLSAgICAgICAgSWNvbgorICAgICAgICBJY29uLAorICAgICAgICBTY3JvbGxi
YXIKICAgICB9OwogCiAgICAgc3RydWN0IEluZm8gewpAQCAtNzEsNiArNzMsNyBAQCBwdWJsaWM6
CiAgICAgR3RrQm9yZGVyIGNvbnRlbnRzQm94KCkgY29uc3Q7CiAgICAgQ29sb3IgY29sb3IoKSBj
b25zdDsKICAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICBkb3VibGUgb3Bh
Y2l0eSgpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0
KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZXh0LmdldCgpOyB9CkBAIC0xNDQsNiArMTQ3LDIyIEBA
IHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV9pY29uU2l6ZSB7IDAgfTsKIH07CiAKK2NsYXNzIFJl
bmRlclRoZW1lU2Nyb2xsYmFyR2FkZ2V0IGZpbmFsIDogcHVibGljIFJlbmRlclRoZW1lR2FkZ2V0
IHsKK3B1YmxpYzoKKyAgICBSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldChjb25zdCBJbmZvJiwg
UmVuZGVyVGhlbWVHYWRnZXQqIHBhcmVudCwgY29uc3QgVmVjdG9yPFJlbmRlclRoZW1lR2FkZ2V0
OjpJbmZvPiBzaWJsaW5ncywgdW5zaWduZWQgcG9zaXRpb24pOworCisgICAgZW51bSBjbGFzcyBT
dGVwcGVycyB7CisgICAgICAgIEJhY2t3YXJkID0gMSA8PCAwLAorICAgICAgICBGb3J3YXJkID0g
MSA8PCAxLAorICAgICAgICBTZWNvbmRhcnlCYWNrd2FyZCA9IDEgPDwgMiwKKyAgICAgICAgU2Vj
b25kYXJ5Rm9yd2FyZCA9IDEgPDwgMworICAgIH07CisgICAgT3B0aW9uU2V0PFN0ZXBwZXJzPiBz
dGVwcGVycygpIGNvbnN0IHsgcmV0dXJuIG1fc3RlcHBlcnM7IH07CisKK3ByaXZhdGU6CisgICAg
T3B0aW9uU2V0PFN0ZXBwZXJzPiBtX3N0ZXBwZXJzOworfTsKKwogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQogCiAjZW5kaWYgLy8gR1RLX0NIRUNLX1ZFUlNJT04oMywgMjAsIDApCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrLmNwcAppbmRleCAwOWI0
MGI3Li5lYWViNzBhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Ny
b2xsYmFyVGhlbWVHdGsuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3Jv
bGxiYXJUaGVtZUd0ay5jcHAKQEAgLTEsNCArMSw1IEBACiAvKgorICogQ29weXJpZ2h0IChDKSAy
MDE2IElnYWxpYSBTLkwuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmln
aHRzIFJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjksMTEgKzMwLDExIEBACiAjaW5j
bHVkZSAiR1JlZlB0ckd0ay5oIgogI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dENhaXJvLmgiCiAj
aW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWVHYWRn
ZXQuaCIKICNpbmNsdWRlICJTY3JvbGxWaWV3LmgiCiAjaW5jbHVkZSAiU2Nyb2xsYmFyLmgiCiAj
aW5jbHVkZSA8Z3RrL2d0ay5oPgogI2luY2x1ZGUgPHd0Zi9OZXZlckRlc3Ryb3llZC5oPgotI2lu
Y2x1ZGUgPHd0Zi9UZW1wb3JhcnlDaGFuZ2UuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBA
IC00NywzMzIgKzQ4LDU0NiBAQCBTY3JvbGxiYXJUaGVtZUd0azo6flNjcm9sbGJhclRoZW1lR3Rr
KCkKIHsKIH0KIAotYm9vbCBTY3JvbGxiYXJUaGVtZUd0azo6aGFzVGh1bWIoU2Nyb2xsYmFyJiBz
Y3JvbGxiYXIpCi17CiAjaWZuZGVmIEdUS19BUElfVkVSU0lPTl8yCi0gICAgLy8gVGhpcyBtZXRo
b2QgaXMganVzdCBjYWxsZWQgYXMgYSBwYWludC10aW1lIG9wdGltaXphdGlvbiB0byBzZWUgaWYK
LSAgICAvLyBwYWludGluZyB0aGUgdGh1bWIgY2FuIGJlIHNraXBwZWQuICBXZSBkb24ndCBoYXZl
IHRvIGJlIGV4YWN0IGhlcmUuCi0gICAgcmV0dXJuIHRodW1iTGVuZ3RoKHNjcm9sbGJhcikgPiAw
Oworc3RhdGljIHZvaWQgdGhlbWVDaGFuZ2VkQ2FsbGJhY2soKQoreworICAgIFNjcm9sbGJhclRo
ZW1lOjp0aGVtZSgpLnRoZW1lQ2hhbmdlZCgpOworfQorCitTY3JvbGxiYXJUaGVtZUd0azo6U2Ny
b2xsYmFyVGhlbWVHdGsoKQoreworI2lmIEdUS19DSEVDS19WRVJTSU9OKDMsIDIwLCAwKQorI2lm
IFVTRShDT09SRElOQVRFRF9HUkFQSElDU19USFJFQURFRCkKKyAgICBtX3VzZXNPdmVybGF5U2Ny
b2xsYmFycyA9IHRydWU7CiAjZWxzZQotICAgIFVOVVNFRF9QQVJBTShzY3JvbGxiYXIpOwotICAg
IHJldHVybiBmYWxzZTsKKyAgICBtX3VzZXNPdmVybGF5U2Nyb2xsYmFycyA9IGdfc3RyY21wMChn
X2dldGVudigiR1RLX09WRVJMQVlfU0NST0xMSU5HIiksICIwIik7CisjZW5kaWYKICNlbmRpZgor
ICAgIHN0YXRpYyBib29sIHRoZW1lTW9uaXRvckluaXRpYWxpemVkID0gZmFsc2U7CisgICAgaWYg
KCF0aGVtZU1vbml0b3JJbml0aWFsaXplZCkgeworICAgICAgICBnX3NpZ25hbF9jb25uZWN0KGd0
a19zZXR0aW5nc19nZXRfZGVmYXVsdCgpLCAibm90aWZ5OjpndGstdGhlbWUtbmFtZSIsIEdfQ0FM
TEJBQ0sodGhlbWVDaGFuZ2VkQ2FsbGJhY2spLCBudWxscHRyKTsKKyAgICAgICAgdGhlbWVNb25p
dG9ySW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICB1cGRhdGVUaGVtZVByb3BlcnRpZXMoKTsK
KyAgICB9CiB9CiAKLUludFJlY3QgU2Nyb2xsYmFyVGhlbWVHdGs6OmJhY2tCdXR0b25SZWN0KFNj
cm9sbGJhciYgc2Nyb2xsYmFyLCBTY3JvbGxiYXJQYXJ0IHBhcnQsIGJvb2wgcGFpbnRpbmcpCisj
aWYgIUdUS19DSEVDS19WRVJTSU9OKDMsIDIwLCAwKQorc3RhdGljIEdSZWZQdHI8R3RrU3R5bGVD
b250ZXh0PiBjcmVhdGVTdHlsZUNvbnRleHQoU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSBudWxscHRy
KQogewotI2lmbmRlZiBHVEtfQVBJX1ZFUlNJT05fMgotICAgIGlmIChwYXJ0ID09IEJhY2tCdXR0
b25FbmRQYXJ0ICYmICFtX2hhc0JhY2tCdXR0b25FbmRQYXJ0KQotICAgICAgICByZXR1cm4gSW50
UmVjdCgpOwotICAgIGlmIChwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQgJiYgIW1faGFzQmFj
a0J1dHRvblN0YXJ0UGFydCkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKKyAgICBHUmVmUHRy
PEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0gYWRvcHRHUmVmKGd0a19zdHlsZV9jb250
ZXh0X25ldygpKTsKKyAgICBHUmVmUHRyPEd0a1dpZGdldFBhdGg+IHBhdGggPSBhZG9wdEdSZWYo
Z3RrX3dpZGdldF9wYXRoX25ldygpKTsKKyAgICBndGtfd2lkZ2V0X3BhdGhfYXBwZW5kX3R5cGUo
cGF0aC5nZXQoKSwgR1RLX1RZUEVfU0NST0xMQkFSKTsKKyAgICBndGtfd2lkZ2V0X3BhdGhfaXRl
cl9hZGRfY2xhc3MocGF0aC5nZXQoKSwgLTEsIEdUS19TVFlMRV9DTEFTU19TQ1JPTExCQVIpOwor
ICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLmdldCgpLCAtMSwgc2Nyb2xs
YmFyICYmIHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8g
Imhvcml6b250YWwiIDogInZlcnRpY2FsIik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3Bh
dGgoc3R5bGVDb250ZXh0LmdldCgpLCBwYXRoLmdldCgpKTsKKyAgICByZXR1cm4gc3R5bGVDb250
ZXh0OworfQogCi0gICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IHN0eWxlQ29udGV4dCA9IGdl
dE9yQ3JlYXRlU3R5bGVDb250ZXh0KCZzY3JvbGxiYXIsIHBhaW50aW5nID8gU3R5bGVDb250ZXh0
TW9kZTo6UGFpbnQgOiBTdHlsZUNvbnRleHRNb2RlOjpMYXlvdXQpOwotICAgIEd0a0JvcmRlciB0
cm91Z2hCb3JkZXI7Ci0gICAgZ2V0VHJvdWdoQm9yZGVyKHNjcm9sbGJhciwgJnRyb3VnaEJvcmRl
cik7Ci0gICAgaW50IHggPSBzY3JvbGxiYXIueCgpICsgdHJvdWdoQm9yZGVyLmxlZnQ7Ci0gICAg
aW50IHkgPSBzY3JvbGxiYXIueSgpICsgdHJvdWdoQm9yZGVyLnRvcDsKLSAgICBJbnRTaXplIHNp
emUgPSBidXR0b25TaXplKHNjcm9sbGJhciwgcGFydCk7Ci0gICAgaWYgKHBhcnQgPT0gQmFja0J1
dHRvblN0YXJ0UGFydCkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoeCwgeSwgc2l6ZS53aWR0aCgp
LCBzaXplLmhlaWdodCgpKTsKK3N0YXRpYyBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gY3JlYXRl
Q2hpbGRTdHlsZUNvbnRleHQoR3RrU3R5bGVDb250ZXh0KiBwYXJlbnQsIGNvbnN0IGNoYXIqIG5h
bWUpCit7CisgICAgQVNTRVJUKHBhcmVudCk7CisgICAgR1JlZlB0cjxHdGtXaWRnZXRQYXRoPiBw
YXRoID0gYWRvcHRHUmVmKGd0a193aWRnZXRfcGF0aF9jb3B5KGd0a19zdHlsZV9jb250ZXh0X2dl
dF9wYXRoKHBhcmVudCkpKTsKKyAgICBndGtfd2lkZ2V0X3BhdGhfYXBwZW5kX3R5cGUocGF0aC5n
ZXQoKSwgR1RLX1RZUEVfU0NST0xMQkFSKTsKKyAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRf
Y2xhc3MocGF0aC5nZXQoKSwgLTEsIEdUS19TVFlMRV9DTEFTU19TQ1JPTExCQVIpOworICAgIGd0
a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLmdldCgpLCAtMSwgbmFtZSk7CiAKLSAg
ICAvLyBCYWNrQnV0dG9uRW5kUGFydCAoYWx0ZXJuYXRlIGJ1dHRvbikKLSAgICBpZiAoc2Nyb2xs
YmFyLm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKLSAgICAgICAgcmV0dXJu
IEludFJlY3Qoc2Nyb2xsYmFyLngoKSArIHNjcm9sbGJhci53aWR0aCgpIC0gdHJvdWdoQm9yZGVy
LmxlZnQgLSAoMiAqIHNpemUud2lkdGgoKSksIHksIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQo
KSk7CisgICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IHN0eWxlQ29udGV4dCA9IGFkb3B0R1Jl
ZihndGtfc3R5bGVfY29udGV4dF9uZXcoKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3Bh
dGgoc3R5bGVDb250ZXh0LmdldCgpLCBwYXRoLmdldCgpKTsKKyAgICBndGtfc3R5bGVfY29udGV4
dF9zZXRfcGFyZW50KHN0eWxlQ29udGV4dC5nZXQoKSwgcGFyZW50KTsKKyAgICByZXR1cm4gc3R5
bGVDb250ZXh0OworfQorI2VuZGlmIC8vIEdUS19DSEVDS19WRVJTSU9OKDMsIDIwLCAwKQogCi0g
ICAgLy8gVmVydGljYWxTY3JvbGxiYXIgYWx0ZXJuYXRlIGJ1dHRvbgotICAgIHJldHVybiBJbnRS
ZWN0KHgsIHNjcm9sbGJhci55KCkgKyBzY3JvbGxiYXIuaGVpZ2h0KCkgLSB0cm91Z2hCb3JkZXIu
dG9wIC0gKDIgKiBzaXplLmhlaWdodCgpKSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsK
LSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHNjcm9sbGJhcik7Ci0gICAgVU5VU0VEX1BBUkFNKHBh
cnQpOwotICAgIFVOVVNFRF9QQVJBTShwYWludGluZyk7Ci0gICAgcmV0dXJuIEludFJlY3QoKTsK
LSNlbmRpZgordm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6dGhlbWVDaGFuZ2VkKCkKK3sKKyAgICB1
cGRhdGVUaGVtZVByb3BlcnRpZXMoKTsKIH0KIAotSW50UmVjdCBTY3JvbGxiYXJUaGVtZUd0azo6
Zm9yd2FyZEJ1dHRvblJlY3QoU2Nyb2xsYmFyJiBzY3JvbGxiYXIsIFNjcm9sbGJhclBhcnQgcGFy
dCwgYm9vbCBwYWludGluZykKKyNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAyMCwgMCkKK3ZvaWQg
U2Nyb2xsYmFyVGhlbWVHdGs6OnVwZGF0ZVRoZW1lUHJvcGVydGllcygpCiB7Ci0jaWZuZGVmIEdU
S19BUElfVkVSU0lPTl8yCi0gICAgaWYgKHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCAm
JiAhbV9oYXNGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0KQotICAgICAgICByZXR1cm4gSW50UmVjdCgp
OwotICAgIGlmIChwYXJ0ID09IEZvcndhcmRCdXR0b25FbmRQYXJ0ICYmICFtX2hhc0ZvcndhcmRC
dXR0b25FbmRQYXJ0KQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOworICAgIGF1dG8gc3RlcHBl
cnMgPSBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldCo+KFJlbmRlclRoZW1l
R2FkZ2V0OjpjcmVhdGUoeyBSZW5kZXJUaGVtZUdhZGdldDo6VHlwZTo6U2Nyb2xsYmFyLCAic2Ny
b2xsYmFyIiwgR1RLX1NUQVRFX0ZMQUdfTk9STUFMLCB7IH0gfSkuZ2V0KCkpLT5zdGVwcGVycygp
OworICAgIG1faGFzQmFja0J1dHRvblN0YXJ0UGFydCA9IHN0ZXBwZXJzLmNvbnRhaW5zKFJlbmRl
clRoZW1lU2Nyb2xsYmFyR2FkZ2V0OjpTdGVwcGVyczo6QmFja3dhcmQpOworICAgIG1faGFzRm9y
d2FyZEJ1dHRvbkVuZFBhcnQgPSBzdGVwcGVycy5jb250YWlucyhSZW5kZXJUaGVtZVNjcm9sbGJh
ckdhZGdldDo6U3RlcHBlcnM6OkZvcndhcmQpOworICAgIG1faGFzQmFja0J1dHRvbkVuZFBhcnQg
PSBzdGVwcGVycy5jb250YWlucyhSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldDo6U3RlcHBlcnM6
OlNlY29uZGFyeUJhY2t3YXJkKTsKKyAgICBtX2hhc0ZvcndhcmRCdXR0b25TdGFydFBhcnQgPSBz
dGVwcGVycy5jb250YWlucyhSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldDo6U3RlcHBlcnM6OlNl
Y29uZGFyeUZvcndhcmQpOworfQorI2Vsc2UKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnVwZGF0
ZVRoZW1lUHJvcGVydGllcygpCit7CisgICAgZ2Jvb2xlYW4gaGFzQmFja0J1dHRvblN0YXJ0UGFy
dCwgaGFzRm9yd2FyZEJ1dHRvbkVuZFBhcnQsIGhhc0JhY2tCdXR0b25FbmRQYXJ0LCBoYXNGb3J3
YXJkQnV0dG9uU3RhcnRQYXJ0OworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjcmVh
dGVTdHlsZUNvbnRleHQoKS5nZXQoKSwKKyAgICAgICAgImhhcy1iYWNrd2FyZC1zdGVwcGVyIiwg
Jmhhc0JhY2tCdXR0b25TdGFydFBhcnQsCisgICAgICAgICJoYXMtZm9yd2FyZC1zdGVwcGVyIiwg
Jmhhc0ZvcndhcmRCdXR0b25FbmRQYXJ0LAorICAgICAgICAiaGFzLXNlY29uZGFyeS1iYWNrd2Fy
ZC1zdGVwcGVyIiwgJmhhc0JhY2tCdXR0b25FbmRQYXJ0LAorICAgICAgICAiaGFzLXNlY29uZGFy
eS1mb3J3YXJkLXN0ZXBwZXIiLCAmaGFzRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCwKKyAgICAgICAg
bnVsbHB0cik7CisgICAgbV9oYXNCYWNrQnV0dG9uU3RhcnRQYXJ0ID0gaGFzQmFja0J1dHRvblN0
YXJ0UGFydDsKKyAgICBtX2hhc0ZvcndhcmRCdXR0b25FbmRQYXJ0ID0gaGFzRm9yd2FyZEJ1dHRv
bkVuZFBhcnQ7CisgICAgbV9oYXNCYWNrQnV0dG9uRW5kUGFydCA9IGhhc0JhY2tCdXR0b25FbmRQ
YXJ0OworICAgIG1faGFzRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCA9IGhhc0ZvcndhcmRCdXR0b25T
dGFydFBhcnQ7Cit9CisjZW5kaWYgLy8gR1RLX0NIRUNLX1ZFUlNJT04oMywgMjAsIDApCiAKLSAg
ICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0gZ2V0T3JDcmVhdGVTdHls
ZUNvbnRleHQoJnNjcm9sbGJhciwgcGFpbnRpbmcgPyBTdHlsZUNvbnRleHRNb2RlOjpQYWludCA6
IFN0eWxlQ29udGV4dE1vZGU6OkxheW91dCk7Ci0gICAgR3RrQm9yZGVyIHRyb3VnaEJvcmRlcjsK
LSAgICBnZXRUcm91Z2hCb3JkZXIoc2Nyb2xsYmFyLCAmdHJvdWdoQm9yZGVyKTsKLSAgICBJbnRT
aXplIHNpemUgPSBidXR0b25TaXplKHNjcm9sbGJhciwgcGFydCk7Ci0gICAgaWYgKHNjcm9sbGJh
ci5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKLSAgICAgICAgaW50IHkg
PSBzY3JvbGxiYXIueSgpICsgdHJvdWdoQm9yZGVyLnRvcDsKLSAgICAgICAgaWYgKHBhcnQgPT0g
Rm9yd2FyZEJ1dHRvbkVuZFBhcnQpCi0gICAgICAgICAgICByZXR1cm4gSW50UmVjdChzY3JvbGxi
YXIueCgpICsgc2Nyb2xsYmFyLndpZHRoKCkgLSBzaXplLndpZHRoKCkgLSB0cm91Z2hCb3JkZXIu
bGVmdCwgeSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKKyNpZiBHVEtfQ0hFQ0tfVkVS
U0lPTigzLCAyMCwgMCkKK3N0YXRpYyBHdGtTdGF0ZUZsYWdzIHNjcm9sbGJhclBhcnRTdGF0ZUZs
YWdzKFNjcm9sbGJhciYgc2Nyb2xsYmFyLCBTY3JvbGxiYXJQYXJ0IHBhcnQsIGJvb2wgcGFpbnRp
bmcgPSBmYWxzZSkKK3sKKyAgICB1bnNpZ25lZCBzdGF0ZUZsYWdzID0gMDsKKyAgICBzd2l0Y2gg
KHBhcnQpIHsKKyAgICBjYXNlIEFsbFBhcnRzOgorICAgICAgICBpZiAoIXBhaW50aW5nIHx8IHNj
cm9sbGJhci5ob3ZlcmVkUGFydCgpICE9IE5vUGFydCkKKyAgICAgICAgICAgIHN0YXRlRmxhZ3Mg
fD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQmFj
a1RyYWNrUGFydDoKKyAgICBjYXNlIEZvcndhcmRUcmFja1BhcnQ6CisgICAgICAgIGlmIChzY3Jv
bGxiYXIuaG92ZXJlZFBhcnQoKSA9PSBCYWNrVHJhY2tQYXJ0IHx8IHNjcm9sbGJhci5ob3ZlcmVk
UGFydCgpID09IEZvcndhcmRUcmFja1BhcnQpCisgICAgICAgICAgICBzdGF0ZUZsYWdzIHw9IEdU
S19TVEFURV9GTEFHX1BSRUxJR0hUOworICAgICAgICBpZiAoc2Nyb2xsYmFyLnByZXNzZWRQYXJ0
KCkgPT0gQmFja1RyYWNrUGFydCB8fCBzY3JvbGxiYXIucHJlc3NlZFBhcnQoKSA9PSBGb3J3YXJk
VHJhY2tQYXJ0KQorICAgICAgICAgICAgc3RhdGVGbGFncyB8PSBHVEtfU1RBVEVfRkxBR19BQ1RJ
VkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQmFja0J1dHRvblN0YXJ0UGFydDoKKyAgICBj
YXNlIEZvcndhcmRCdXR0b25TdGFydFBhcnQ6CisgICAgY2FzZSBCYWNrQnV0dG9uRW5kUGFydDoK
KyAgICBjYXNlIEZvcndhcmRCdXR0b25FbmRQYXJ0OgorICAgICAgICBpZiAoKChwYXJ0ID09IEJh
Y2tCdXR0b25TdGFydFBhcnQgfHwgcGFydCA9PSBCYWNrQnV0dG9uRW5kUGFydCkgJiYgIXNjcm9s
bGJhci5jdXJyZW50UG9zKCkpCisgICAgICAgICAgICB8fCAoKHBhcnQgPT0gRm9yd2FyZEJ1dHRv
bkVuZFBhcnQgfHwgcGFydCA9PSBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0KSAmJiBzY3JvbGxiYXIu
Y3VycmVudFBvcygpID09IHNjcm9sbGJhci5tYXhpbXVtKCkpKSB7CisgICAgICAgICAgICBzdGF0
ZUZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VOU0lUSVZFOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgRkFMTFRIUk9VR0g7CisgICAgZGVmYXVsdDoKKyAgICAgICAg
aWYgKHNjcm9sbGJhci5ob3ZlcmVkUGFydCgpID09IHBhcnQpCisgICAgICAgICAgICBzdGF0ZUZs
YWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOwogCi0gICAgICAgIC8vIEZvcndhcmRCdXR0
b25TdGFydFBhcnQgKGFsdGVybmF0ZSBidXR0b24pCi0gICAgICAgIHJldHVybiBJbnRSZWN0KHNj
cm9sbGJhci54KCkgKyB0cm91Z2hCb3JkZXIubGVmdCArIHNpemUud2lkdGgoKSwgeSwgc2l6ZS53
aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKKyAgICAgICAgaWYgKHNjcm9sbGJhci5wcmVzc2VkUGFy
dCgpID09IHBhcnQpCisgICAgICAgICAgICBzdGF0ZUZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0FD
VElWRTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgLy8gVmVydGljYWxTY3JvbGxiYXIK
LSAgICBpbnQgeCA9IHNjcm9sbGJhci54KCkgKyB0cm91Z2hCb3JkZXIubGVmdDsKLSAgICBpZiAo
cGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoeCwg
c2Nyb2xsYmFyLnkoKSArIHNjcm9sbGJhci5oZWlnaHQoKSAtIHNpemUuaGVpZ2h0KCkgLSB0cm91
Z2hCb3JkZXIudG9wLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworICAgIHJldHVybiBz
dGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihzdGF0ZUZsYWdzKTsKK30KIAotICAgIC8vIEZvcndh
cmRCdXR0b25TdGFydFBhcnQgKGFsdGVybmF0ZSBidXR0b24pCi0gICAgcmV0dXJuIEludFJlY3Qo
eCwgc2Nyb2xsYmFyLnkoKSArIHRyb3VnaEJvcmRlci50b3AgKyBzaXplLmhlaWdodCgpLCBzaXpl
LndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oc2Nyb2xs
YmFyKTsKLSAgICBVTlVTRURfUEFSQU0ocGFydCk7Ci0gICAgVU5VU0VEX1BBUkFNKHBhaW50aW5n
KTsKLSAgICByZXR1cm4gSW50UmVjdCgpOwotI2VuZGlmCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRy
PFJlbmRlclRoZW1lR2FkZ2V0PiBzY3JvbGxiYXJHYWRnZXRGb3JMYXlvdXQoU2Nyb2xsYmFyJiBz
Y3JvbGxiYXIpCit7CisgICAgUmVuZGVyVGhlbWVHYWRnZXQ6OkluZm8gaW5mbyA9IHsgUmVuZGVy
VGhlbWVHYWRnZXQ6OlR5cGU6OlNjcm9sbGJhciwgInNjcm9sbGJhciIsIHNjcm9sbGJhclBhcnRT
dGF0ZUZsYWdzKHNjcm9sbGJhciwgQWxsUGFydHMpLCB7IH0gfTsKKyAgICBpZiAoc2Nyb2xsYmFy
Lm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaW5mby5jbGFz
c0xpc3QuYXBwZW5kKCJ2ZXJ0aWNhbCIpOworICAgICAgICBpbmZvLmNsYXNzTGlzdC5hcHBlbmQo
InJpZ2h0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby5jbGFzc0xpc3QuYXBwZW5kKCJo
b3Jpem9udGFsIik7CisgICAgICAgIGluZm8uY2xhc3NMaXN0LmFwcGVuZCgiYm90dG9tIik7Cisg
ICAgfQorICAgIGlmIChzY3JvbGxiYXIuaXNPdmVybGF5U2Nyb2xsYmFyKCkpCisgICAgICAgIGlu
Zm8uY2xhc3NMaXN0LmFwcGVuZCgib3ZlcmxheS1pbmRpY2F0b3IiKTsKKyAgICBpZiAoaW5mby5z
dGF0ZSAmIEdUS19TVEFURV9GTEFHX1BSRUxJR0hUKQorICAgICAgICBpbmZvLmNsYXNzTGlzdC5h
cHBlbmQoImhvdmVyaW5nIik7CisKKyAgICByZXR1cm4gUmVuZGVyVGhlbWVHYWRnZXQ6OmNyZWF0
ZShpbmZvKTsKIH0KIAotSW50UmVjdCBTY3JvbGxiYXJUaGVtZUd0azo6dHJhY2tSZWN0KFNjcm9s
bGJhciYgc2Nyb2xsYmFyLCBib29sIHBhaW50aW5nKQorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxS
ZW5kZXJUaGVtZUJveEdhZGdldD4gY29udGVudHNHYWRnZXRGb3JMYXlvdXQoU2Nyb2xsYmFyJiBz
Y3JvbGxiYXIsIFJlbmRlclRoZW1lR2FkZ2V0KiBwYXJlbnQsIEludFJlY3QmIGNvbnRlbnRzUmVj
dCwgVmVjdG9yPGludCwgND4gc3RlcHBlcnNQb3NpdGlvbikKIHsKLSNpZm5kZWYgR1RLX0FQSV9W
RVJTSU9OXzIKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0gZ2V0
T3JDcmVhdGVTdHlsZUNvbnRleHQoJnNjcm9sbGJhciwgcGFpbnRpbmcgPyBTdHlsZUNvbnRleHRN
b2RlOjpQYWludCA6IFN0eWxlQ29udGV4dE1vZGU6OkxheW91dCk7CisgICAgVmVjdG9yPFJlbmRl
clRoZW1lR2FkZ2V0OjpJbmZvPiBjaGlsZHJlbjsKKyAgICBhdXRvIHN0ZXBwZXJzID0gc3RhdGlj
X2Nhc3Q8UmVuZGVyVGhlbWVTY3JvbGxiYXJHYWRnZXQqPihwYXJlbnQpLT5zdGVwcGVycygpOwor
ICAgIGlmIChzdGVwcGVycy5jb250YWlucyhSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldDo6U3Rl
cHBlcnM6OkJhY2t3YXJkKSkgeworICAgICAgICBzdGVwcGVyc1Bvc2l0aW9uWzBdID0gMDsKKyAg
ICAgICAgY2hpbGRyZW4uYXBwZW5kKHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVyaWMs
ICJidXR0b24iLCBzY3JvbGxiYXJQYXJ0U3RhdGVGbGFncyhzY3JvbGxiYXIsIEJhY2tCdXR0b25T
dGFydFBhcnQpLCB7ICJ1cCIgfSB9KTsKKyAgICB9CisgICAgaWYgKHN0ZXBwZXJzLmNvbnRhaW5z
KFJlbmRlclRoZW1lU2Nyb2xsYmFyR2FkZ2V0OjpTdGVwcGVyczo6U2Vjb25kYXJ5Rm9yd2FyZCkp
IHsKKyAgICAgICAgc3RlcHBlcnNQb3NpdGlvblsxXSA9IGNoaWxkcmVuLnNpemUoKTsKKyAgICAg
ICAgY2hpbGRyZW4uYXBwZW5kKHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVyaWMsICJi
dXR0b24iLCBzY3JvbGxiYXJQYXJ0U3RhdGVGbGFncyhzY3JvbGxiYXIsIEZvcndhcmRCdXR0b25T
dGFydFBhcnQpLCB7ICJkb3duIiB9IH0pOworICAgIH0KKyAgICBjaGlsZHJlbi5hcHBlbmQoeyBS
ZW5kZXJUaGVtZUdhZGdldDo6VHlwZTo6R2VuZXJpYywgInRyb3VnaCIsIHNjcm9sbGJhclBhcnRT
dGF0ZUZsYWdzKHNjcm9sbGJhciwgQmFja1RyYWNrUGFydCksIHsgfSB9KTsKKyAgICBpZiAoc3Rl
cHBlcnMuY29udGFpbnMoUmVuZGVyVGhlbWVTY3JvbGxiYXJHYWRnZXQ6OlN0ZXBwZXJzOjpTZWNv
bmRhcnlCYWNrd2FyZCkpIHsKKyAgICAgICAgc3RlcHBlcnNQb3NpdGlvblsyXSA9IGNoaWxkcmVu
LnNpemUoKTsKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5
cGU6OkdlbmVyaWMsICJidXR0b24iLCBzY3JvbGxiYXJQYXJ0U3RhdGVGbGFncyhzY3JvbGxiYXIs
IEJhY2tCdXR0b25FbmRQYXJ0KSwgeyAidXAiIH0gfSk7CisgICAgfQorICAgIGlmIChzdGVwcGVy
cy5jb250YWlucyhSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldDo6U3RlcHBlcnM6OkZvcndhcmQp
KSB7CisgICAgICAgIHN0ZXBwZXJzUG9zaXRpb25bM10gPSBjaGlsZHJlbi5zaXplKCk7CisgICAg
ICAgIGNoaWxkcmVuLmFwcGVuZCh7IFJlbmRlclRoZW1lR2FkZ2V0OjpUeXBlOjpHZW5lcmljLCAi
YnV0dG9uIiwgc2Nyb2xsYmFyUGFydFN0YXRlRmxhZ3Moc2Nyb2xsYmFyLCBGb3J3YXJkQnV0dG9u
RW5kUGFydCksIHsgImRvd24iIH0gfSk7CisgICAgfQorICAgIFJlbmRlclRoZW1lR2FkZ2V0OjpJ
bmZvIGluZm8gPSB7IFJlbmRlclRoZW1lR2FkZ2V0OjpUeXBlOjpHZW5lcmljLCAiY29udGVudHMi
LCBHVEtfU1RBVEVfRkxBR19OT1JNQUwsIHsgfSB9OworICAgIGF1dG8gY29udGVudHNHYWRnZXQg
PSBzdGQ6Om1ha2VfdW5pcXVlPFJlbmRlclRoZW1lQm94R2FkZ2V0PihpbmZvLCBjaGlsZHJlbiwg
cGFyZW50KTsKKworICAgIEd0a0JvcmRlciBzY3JvbGxiYXJDb250ZW50c0JveCA9IHBhcmVudC0+
Y29udGVudHNCb3goKTsKKyAgICBHdGtCb3JkZXIgY29udGVudHNDb250ZW50c0JveCA9IGNvbnRl
bnRzR2FkZ2V0LT5jb250ZW50c0JveCgpOworICAgIEd0a0JvcmRlciBwYWRkaW5nOworICAgIHBh
ZGRpbmcubGVmdCA9IHNjcm9sbGJhckNvbnRlbnRzQm94LmxlZnQgKyBjb250ZW50c0NvbnRlbnRz
Qm94LmxlZnQ7CisgICAgcGFkZGluZy5yaWdodCA9IHNjcm9sbGJhckNvbnRlbnRzQm94LnJpZ2h0
ICsgY29udGVudHNDb250ZW50c0JveC5yaWdodDsKKyAgICBwYWRkaW5nLnRvcCA9IHNjcm9sbGJh
ckNvbnRlbnRzQm94LnRvcCArIGNvbnRlbnRzQ29udGVudHNCb3gudG9wOworICAgIHBhZGRpbmcu
Ym90dG9tID0gc2Nyb2xsYmFyQ29udGVudHNCb3guYm90dG9tICsgY29udGVudHNDb250ZW50c0Jv
eC5ib3R0b207CisgICAgY29udGVudHNSZWN0ID0gc2Nyb2xsYmFyLmZyYW1lUmVjdCgpOworICAg
IGNvbnRlbnRzUmVjdC5tb3ZlKHBhZGRpbmcubGVmdCwgcGFkZGluZy50b3ApOworICAgIGNvbnRl
bnRzUmVjdC5jb250cmFjdChwYWRkaW5nLmxlZnQgKyBwYWRkaW5nLnJpZ2h0LCBwYWRkaW5nLnRv
cCArIHBhZGRpbmcuYm90dG9tKTsKKyAgICByZXR1cm4gY29udGVudHNHYWRnZXQ7Cit9CisKK0lu
dFJlY3QgU2Nyb2xsYmFyVGhlbWVHdGs6OnRyYWNrUmVjdChTY3JvbGxiYXImIHNjcm9sbGJhciwg
Ym9vbCAvKnBhaW50aW5nKi8pCit7CisgICAgYXV0byBzY3JvbGxiYXJHYWRnZXQgPSBzY3JvbGxi
YXJHYWRnZXRGb3JMYXlvdXQoc2Nyb2xsYmFyKTsKKyAgICBJbnRSZWN0IHJlY3Q7CisgICAgVmVj
dG9yPGludCwgND4gc3RlcHBlcnNQb3NpdGlvbig0LCAtMSk7CisgICAgYXV0byBjb250ZW50c0dh
ZGdldCA9IGNvbnRlbnRzR2FkZ2V0Rm9yTGF5b3V0KHNjcm9sbGJhciwgc2Nyb2xsYmFyR2FkZ2V0
LmdldCgpLCByZWN0LCBzdGVwcGVyc1Bvc2l0aW9uKTsKKworICAgIGlmIChzdGVwcGVyc1Bvc2l0
aW9uWzBdICE9IC0xKSB7CisgICAgICAgIGlmIChzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9PSBW
ZXJ0aWNhbFNjcm9sbGJhcikKKyAgICAgICAgICAgIHJlY3QubW92ZSgwLCBjb250ZW50c0dhZGdl
dC0+Y2hpbGQoc3RlcHBlcnNQb3NpdGlvblswXSktPnByZWZlcnJlZFNpemUoKS5oZWlnaHQoKSk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlY3QubW92ZShjb250ZW50c0dhZGdldC0+Y2hp
bGQoc3RlcHBlcnNQb3NpdGlvblswXSktPnByZWZlcnJlZFNpemUoKS53aWR0aCgpLCAwKTsKKyAg
ICB9CisgICAgaWYgKHN0ZXBwZXJzUG9zaXRpb25bMV0gIT0gLTEpIHsKKyAgICAgICAgaWYgKHNj
cm9sbGJhci5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICAgICAg
cmVjdC5tb3ZlKDAsIGNvbnRlbnRzR2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzFdKS0+
cHJlZmVycmVkU2l6ZSgpLmhlaWdodCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVj
dC5tb3ZlKGNvbnRlbnRzR2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzFdKS0+cHJlZmVy
cmVkU2l6ZSgpLndpZHRoKCksIDApOworICAgIH0KKyAgICBpZiAoc3RlcHBlcnNQb3NpdGlvblsy
XSAhPSAtMSkgeworICAgICAgICBpZiAoc2Nyb2xsYmFyLm9yaWVudGF0aW9uKCkgPT0gVmVydGlj
YWxTY3JvbGxiYXIpCisgICAgICAgICAgICByZWN0LmNvbnRyYWN0KDAsIGNvbnRlbnRzR2FkZ2V0
LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzJdKS0+cHJlZmVycmVkU2l6ZSgpLmhlaWdodCgpKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVjdC5jb250cmFjdChjb250ZW50c0dhZGdldC0+
Y2hpbGQoc3RlcHBlcnNQb3NpdGlvblsyXSktPnByZWZlcnJlZFNpemUoKS53aWR0aCgpLCAwKTsK
KyAgICB9CisgICAgaWYgKHN0ZXBwZXJzUG9zaXRpb25bM10gIT0gLTEpIHsKKyAgICAgICAgaWYg
KHNjcm9sbGJhci5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICAg
ICAgcmVjdC5jb250cmFjdCgwLCBjb250ZW50c0dhZGdldC0+Y2hpbGQoc3RlcHBlcnNQb3NpdGlv
blszXSktPnByZWZlcnJlZFNpemUoKS5oZWlnaHQoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIHJlY3QuY29udHJhY3QoY29udGVudHNHYWRnZXQtPmNoaWxkKHN0ZXBwZXJzUG9zaXRpb25b
M10pLT5wcmVmZXJyZWRTaXplKCkud2lkdGgoKSwgMCk7CisgICAgfQorCisgICAgaWYgKHNjcm9s
bGJhci5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4g
c2Nyb2xsYmFyLmhlaWdodCgpIDwgcmVjdC5oZWlnaHQoKSA/IEludFJlY3QoKSA6IHJlY3Q7CisK
KyAgICByZXR1cm4gc2Nyb2xsYmFyLndpZHRoKCkgPCByZWN0LndpZHRoKCkgPyBJbnRSZWN0KCkg
OiByZWN0OworfQorI2Vsc2UKK0ludFJlY3QgU2Nyb2xsYmFyVGhlbWVHdGs6OnRyYWNrUmVjdChT
Y3JvbGxiYXImIHNjcm9sbGJhciwgYm9vbCAvKnBhaW50aW5nKi8pCit7CisgICAgR1JlZlB0cjxH
dGtTdHlsZUNvbnRleHQ+IHN0eWxlQ29udGV4dCA9IGNyZWF0ZVN0eWxlQ29udGV4dCgmc2Nyb2xs
YmFyKTsKICAgICAvLyBUaGUgcGFkZGluZyBhbG9uZyB0aGUgdGh1bWIgbW92ZW1lbnQgYXhpcyBp
bmNsdWRlcyB0aGUgdHJvdWdoIGJvcmRlcgogICAgIC8vIHBsdXMgdGhlIHNpemUgb2Ygc3RlcHBl
ciBzcGFjaW5nICh0aGUgc3BhY2UgYmV0d2VlbiB0aGUgc3RlcHBlciBhbmQKICAgICAvLyB0aGUg
cGxhY2Ugd2hlcmUgdGhlIHRodW1iIHN0b3BzKS4gVGhlcmUgaXMgb2Z0ZW4gbm8gc3RlcHBlciBz
cGFjaW5nLgotICAgIEd0a0JvcmRlciB0cm91Z2hCb3JkZXI7Ci0gICAgZ2V0VHJvdWdoQm9yZGVy
KHNjcm9sbGJhciwgJnRyb3VnaEJvcmRlcik7Ci0gICAgR3RrQm9yZGVyIHN0ZXBwZXJTcGFjaW5n
ID0geyAwLCAwLCAwLCAwIH07CisgICAgaW50IHN0ZXBwZXJTcGFjaW5nLCBzdGVwcGVyU2l6ZSwg
dHJvdWdoQm9yZGVyV2lkdGgsIHRodW1iRmF0OworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9z
dHlsZShzdHlsZUNvbnRleHQuZ2V0KCksICJzdGVwcGVyLXNwYWNpbmciLCAmc3RlcHBlclNwYWNp
bmcsICJzdGVwcGVyLXNpemUiLCAmc3RlcHBlclNpemUsICJ0cm91Z2gtYm9yZGVyIiwKKyAgICAg
ICAgJnRyb3VnaEJvcmRlcldpZHRoLCAic2xpZGVyLXdpZHRoIiwgJnRodW1iRmF0LCBudWxscHRy
KTsKIAogICAgIC8vIFRoZSBmYXRuZXNzIG9mIHRoZSBzY3JvbGxiYXIgb24gdGhlIG5vbi1tb3Zl
bWVudCBheGlzLgotICAgIGludCB0aGlja25lc3MgPSBzY3JvbGxiYXJUaGlja25lc3Moc3R5bGVD
b250ZXh0LmdldCgpLCBzY3JvbGxiYXIub3JpZW50YXRpb24oKSk7CisgICAgaW50IHRoaWNrbmVz
cyA9IHRodW1iRmF0ICsgMiAqIHRyb3VnaEJvcmRlcldpZHRoOwogCiAgICAgaW50IHN0YXJ0QnV0
dG9uc09mZnNldCA9IDA7CiAgICAgaW50IGJ1dHRvbnNXaWR0aCA9IDA7CiAgICAgaWYgKG1faGFz
Rm9yd2FyZEJ1dHRvblN0YXJ0UGFydCkgewotICAgICAgICBpbnQgYnV0dG9uU2l6ZSA9IHN0ZXBw
ZXJTaXplKHNjcm9sbGJhciwgRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCk7Ci0gICAgICAgIHN0YXJ0
QnV0dG9uc09mZnNldCArPSBidXR0b25TaXplOwotICAgICAgICBidXR0b25zV2lkdGggKz0gYnV0
dG9uU2l6ZTsKKyAgICAgICAgc3RhcnRCdXR0b25zT2Zmc2V0ICs9IHN0ZXBwZXJTaXplOworICAg
ICAgICBidXR0b25zV2lkdGggKz0gc3RlcHBlclNpemU7CiAgICAgfQogICAgIGlmIChtX2hhc0Jh
Y2tCdXR0b25TdGFydFBhcnQpIHsKLSAgICAgICAgaW50IGJ1dHRvblNpemUgPSBzdGVwcGVyU2l6
ZShzY3JvbGxiYXIsIEJhY2tCdXR0b25TdGFydFBhcnQpOwotICAgICAgICBzdGFydEJ1dHRvbnNP
ZmZzZXQgKz0gYnV0dG9uU2l6ZTsKLSAgICAgICAgYnV0dG9uc1dpZHRoICs9IGJ1dHRvblNpemU7
Ci0gICAgICAgIEd0a0JvcmRlciBtYXJnaW47Ci0gICAgICAgIGdldFN0ZXBwZXJTcGFjaW5nKHNj
cm9sbGJhciwgQmFja0J1dHRvblN0YXJ0UGFydCwgJm1hcmdpbik7Ci0gICAgICAgIHN0ZXBwZXJT
cGFjaW5nLmxlZnQgKz0gbWFyZ2luLmxlZnQ7Ci0gICAgICAgIHN0ZXBwZXJTcGFjaW5nLnJpZ2h0
ICs9IG1hcmdpbi5yaWdodDsKLSAgICAgICAgc3RlcHBlclNwYWNpbmcudG9wICs9IG1hcmdpbi50
b3A7Ci0gICAgICAgIHN0ZXBwZXJTcGFjaW5nLmJvdHRvbSArPSBtYXJnaW4uYm90dG9tOworICAg
ICAgICBzdGFydEJ1dHRvbnNPZmZzZXQgKz0gc3RlcHBlclNpemU7CisgICAgICAgIGJ1dHRvbnNX
aWR0aCArPSBzdGVwcGVyU2l6ZTsKICAgICB9CiAgICAgaWYgKG1faGFzQmFja0J1dHRvbkVuZFBh
cnQpCi0gICAgICAgIGJ1dHRvbnNXaWR0aCArPSBzdGVwcGVyU2l6ZShzY3JvbGxiYXIsIEJhY2tC
dXR0b25FbmRQYXJ0KTsKLSAgICBpZiAobV9oYXNGb3J3YXJkQnV0dG9uRW5kUGFydCkgewotICAg
ICAgICBidXR0b25zV2lkdGggKz0gc3RlcHBlclNpemUoc2Nyb2xsYmFyLCBGb3J3YXJkQnV0dG9u
RW5kUGFydCk7Ci0gICAgICAgIEd0a0JvcmRlciBtYXJnaW47Ci0gICAgICAgIGdldFN0ZXBwZXJT
cGFjaW5nKHNjcm9sbGJhciwgQmFja0J1dHRvblN0YXJ0UGFydCwgJm1hcmdpbik7Ci0gICAgICAg
IHN0ZXBwZXJTcGFjaW5nLmxlZnQgKz0gbWFyZ2luLmxlZnQ7Ci0gICAgICAgIHN0ZXBwZXJTcGFj
aW5nLnJpZ2h0ICs9IG1hcmdpbi5yaWdodDsKLSAgICAgICAgc3RlcHBlclNwYWNpbmcudG9wICs9
IG1hcmdpbi50b3A7Ci0gICAgICAgIHN0ZXBwZXJTcGFjaW5nLmJvdHRvbSArPSBtYXJnaW4uYm90
dG9tOwotICAgIH0KKyAgICAgICAgYnV0dG9uc1dpZHRoICs9IHN0ZXBwZXJTaXplOworICAgIGlm
IChtX2hhc0ZvcndhcmRCdXR0b25FbmRQYXJ0KQorICAgICAgICBidXR0b25zV2lkdGggKz0gc3Rl
cHBlclNpemU7CiAKICAgICBpZiAoc2Nyb2xsYmFyLm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRh
bFNjcm9sbGJhcikgewogICAgICAgICAvLyBPbmNlIHRoZSBzY3JvbGxiYXIgYmVjb21lcyBzbWFs
bGVyIHRoYW4gdGhlIG5hdHVyYWwgc2l6ZSBvZiB0aGUgdHdvIGJ1dHRvbnMgYW5kIHRoZSB0aHVt
YiwgdGhlIHRyYWNrIGRpc2FwcGVhcnMuCiAgICAgICAgIGlmIChzY3JvbGxiYXIud2lkdGgoKSA8
IGJ1dHRvbnNXaWR0aCArIG1pbmltdW1UaHVtYkxlbmd0aChzY3JvbGxiYXIpKQogICAgICAgICAg
ICAgcmV0dXJuIEludFJlY3QoKTsKLSAgICAgICAgcmV0dXJuIEludFJlY3Qoc2Nyb2xsYmFyLngo
KSArIHRyb3VnaEJvcmRlci5sZWZ0ICsgc3RlcHBlclNwYWNpbmcubGVmdCArIHN0YXJ0QnV0dG9u
c09mZnNldCwgc2Nyb2xsYmFyLnkoKSwKLSAgICAgICAgICAgIHNjcm9sbGJhci53aWR0aCgpIC0g
KHRyb3VnaEJvcmRlci5sZWZ0ICsgdHJvdWdoQm9yZGVyLnJpZ2h0KSAtIChzdGVwcGVyU3BhY2lu
Zy5sZWZ0ICsgc3RlcHBlclNwYWNpbmcucmlnaHQpIC0gYnV0dG9uc1dpZHRoLCB0aGlja25lc3Mp
OworICAgICAgICByZXR1cm4gSW50UmVjdChzY3JvbGxiYXIueCgpICsgdHJvdWdoQm9yZGVyV2lk
dGggKyBzdGVwcGVyU3BhY2luZyArIHN0YXJ0QnV0dG9uc09mZnNldCwgc2Nyb2xsYmFyLnkoKSwK
KyAgICAgICAgICAgIHNjcm9sbGJhci53aWR0aCgpIC0gKDIgKiB0cm91Z2hCb3JkZXJXaWR0aCkg
LSAoMiAqIHN0ZXBwZXJTcGFjaW5nKSAtIGJ1dHRvbnNXaWR0aCwgdGhpY2tuZXNzKTsKICAgICB9
CiAKICAgICBpZiAoc2Nyb2xsYmFyLmhlaWdodCgpIDwgYnV0dG9uc1dpZHRoICsgbWluaW11bVRo
dW1iTGVuZ3RoKHNjcm9sbGJhcikpCiAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7Ci0gICAgcmV0
dXJuIEludFJlY3Qoc2Nyb2xsYmFyLngoKSwgc2Nyb2xsYmFyLnkoKSArIHRyb3VnaEJvcmRlci50
b3AgKyBzdGVwcGVyU3BhY2luZy50b3AgKyBzdGFydEJ1dHRvbnNPZmZzZXQsCi0gICAgICAgIHRo
aWNrbmVzcywgc2Nyb2xsYmFyLmhlaWdodCgpIC0gKHRyb3VnaEJvcmRlci50b3AgKyB0cm91Z2hC
b3JkZXIuYm90dG9tKSAtIChzdGVwcGVyU3BhY2luZy50b3AgKyBzdGVwcGVyU3BhY2luZy5ib3R0
b20pIC0gYnV0dG9uc1dpZHRoKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHNjcm9sbGJhcik7
Ci0gICAgVU5VU0VEX1BBUkFNKHBhaW50aW5nKTsKLSAgICByZXR1cm4gSW50UmVjdCgpOworICAg
IHJldHVybiBJbnRSZWN0KHNjcm9sbGJhci54KCksIHNjcm9sbGJhci55KCkgKyB0cm91Z2hCb3Jk
ZXJXaWR0aCArIHN0ZXBwZXJTcGFjaW5nICsgc3RhcnRCdXR0b25zT2Zmc2V0LAorICAgICAgICB0
aGlja25lc3MsIHNjcm9sbGJhci5oZWlnaHQoKSAtICgyICogdHJvdWdoQm9yZGVyV2lkdGgpIC0g
KDIgKiBzdGVwcGVyU3BhY2luZykgLSBidXR0b25zV2lkdGgpOworfQogI2VuZGlmCisKK2Jvb2wg
U2Nyb2xsYmFyVGhlbWVHdGs6Omhhc1RodW1iKFNjcm9sbGJhciYgc2Nyb2xsYmFyKQoreworICAg
IC8vIFRoaXMgbWV0aG9kIGlzIGp1c3QgY2FsbGVkIGFzIGEgcGFpbnQtdGltZSBvcHRpbWl6YXRp
b24gdG8gc2VlIGlmCisgICAgLy8gcGFpbnRpbmcgdGhlIHRodW1iIGNhbiBiZSBza2lwcGVkLiBX
ZSBkb24ndCBoYXZlIHRvIGJlIGV4YWN0IGhlcmUuCisgICAgcmV0dXJuIHRodW1iTGVuZ3RoKHNj
cm9sbGJhcikgPiAwOwogfQogCi0jaWZuZGVmIEdUS19BUElfVkVSU0lPTl8yCi0vLyBUaGUgR3Rr
U3R5bGVDb250ZXh0IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgY2FjaGVkIGJ5IFNjcm9s
bGJhclRoZW1lR3RrOjpwYWludCBmb3IgdGhlCi0vLyBkdXJhdGlvbiBvZiBpdHMgc2NvcGUsIHNv
IGEgZGlmZmVyZW50IEd0a1N0eWxlQ29udGV4dCB3aXRoIHVwZGF0ZWQgdGhlbWUgcHJvcGVydGll
cyB3aWxsIGJlCi0vLyB1c2VkIGZvciBlYWNoIGNhbGwgdG8gcGFpbnQuCi1HUmVmUHRyPEd0a1N0
eWxlQ29udGV4dD4gU2Nyb2xsYmFyVGhlbWVHdGs6OmdldE9yQ3JlYXRlU3R5bGVDb250ZXh0KFNj
cm9sbGJhciogc2Nyb2xsYmFyLCBTdHlsZUNvbnRleHRNb2RlIG1vZGUpCisjaWYgR1RLX0NIRUNL
X1ZFUlNJT04oMywgMjAsIDApCitJbnRSZWN0IFNjcm9sbGJhclRoZW1lR3RrOjpiYWNrQnV0dG9u
UmVjdChTY3JvbGxiYXImIHNjcm9sbGJhciwgU2Nyb2xsYmFyUGFydCBwYXJ0LCBib29sIC8qcGFp
bnRpbmcqLykKIHsKLSAgICBBU1NFUlQoc2Nyb2xsYmFyIHx8IG1vZGUgPT0gU3R5bGVDb250ZXh0
TW9kZTo6TGF5b3V0KTsKLSAgICBpZiAobV9jYWNoZWRTdHlsZUNvbnRleHQpCi0gICAgICAgIHJl
dHVybiBtX2NhY2hlZFN0eWxlQ29udGV4dDsKKyAgICBBU1NFUlQocGFydCA9PSBCYWNrQnV0dG9u
U3RhcnRQYXJ0IHx8IHBhcnQgPT0gQmFja0J1dHRvbkVuZFBhcnQpOworICAgIGlmICgocGFydCA9
PSBCYWNrQnV0dG9uRW5kUGFydCAmJiAhbV9oYXNCYWNrQnV0dG9uRW5kUGFydCkgfHwgKHBhcnQg
PT0gQmFja0J1dHRvblN0YXJ0UGFydCAmJiAhbV9oYXNCYWNrQnV0dG9uU3RhcnRQYXJ0KSkKKyAg
ICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBz
dHlsZUNvbnRleHQgPSBhZG9wdEdSZWYoZ3RrX3N0eWxlX2NvbnRleHRfbmV3KCkpOwotICAgIEdS
ZWZQdHI8R3RrV2lkZ2V0UGF0aD4gcGF0aCA9IGFkb3B0R1JlZihndGtfd2lkZ2V0X3BhdGhfbmV3
KCkpOwotICAgIGd0a193aWRnZXRfcGF0aF9hcHBlbmRfdHlwZShwYXRoLmdldCgpLCBHVEtfVFlQ
RV9TQ1JPTExCQVIpOwotI2lmIEdUS19DSEVDS19WRVJTSU9OKDMsIDE5LCAyKQotICAgIGd0a193
aWRnZXRfcGF0aF9pdGVyX3NldF9vYmplY3RfbmFtZShwYXRoLmdldCgpLCAtMSwgInNjcm9sbGJh
ciIpOwotICAgIGlmIChtX3VzZXNPdmVybGF5U2Nyb2xsYmFycykgewotICAgICAgICBndGtfd2lk
Z2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0aC5nZXQoKSwgLTEsICJvdmVybGF5LWluZGljYXRv
ciIpOwotICAgICAgICBpZiAobW9kZSA9PSBTdHlsZUNvbnRleHRNb2RlOjpMYXlvdXQgfHwgc2Ny
b2xsYmFyLT5ob3ZlcmVkUGFydCgpICE9IE5vUGFydCkKLSAgICAgICAgICAgIGd0a193aWRnZXRf
cGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLmdldCgpLCAtMSwgImhvdmVyaW5nIik7CisgICAgYXV0
byBzY3JvbGxiYXJHYWRnZXQgPSBzY3JvbGxiYXJHYWRnZXRGb3JMYXlvdXQoc2Nyb2xsYmFyKTsK
KyAgICBJbnRSZWN0IHJlY3Q7CisgICAgVmVjdG9yPGludCwgND4gc3RlcHBlcnNQb3NpdGlvbig0
LCAtMSk7CisgICAgYXV0byBjb250ZW50c0dhZGdldCA9IGNvbnRlbnRzR2FkZ2V0Rm9yTGF5b3V0
KHNjcm9sbGJhciwgc2Nyb2xsYmFyR2FkZ2V0LmdldCgpLCByZWN0LCBzdGVwcGVyc1Bvc2l0aW9u
KTsKKworICAgIGlmIChwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQpCisgICAgICAgIHJldHVy
biBJbnRSZWN0KHJlY3QubG9jYXRpb24oKSwgY29udGVudHNHYWRnZXQtPmNoaWxkKDApLT5wcmVm
ZXJyZWRTaXplKCkpOworCisgICAgLy8gU2Vjb25kYXJ5IGJhY2suCisgICAgaWYgKHN0ZXBwZXJz
UG9zaXRpb25bMV0gIT0gLTEpIHsKKyAgICAgICAgaWYgKHNjcm9sbGJhci5vcmllbnRhdGlvbigp
ID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICAgICAgcmVjdC5tb3ZlKDAsIGNvbnRlbnRz
R2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzFdKS0+cHJlZmVycmVkU2l6ZSgpLmhlaWdo
dCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVjdC5tb3ZlKGNvbnRlbnRzR2FkZ2V0
LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzFdKS0+cHJlZmVycmVkU2l6ZSgpLndpZHRoKCksIDAp
OwogICAgIH0KLSNlbHNlCi0gICAgZ3RrX3dpZGdldF9wYXRoX2l0ZXJfYWRkX2NsYXNzKHBhdGgu
Z2V0KCksIC0xLCAic2Nyb2xsYmFyIik7Ci0jZW5kaWYKLSAgICBTY3JvbGxiYXJPcmllbnRhdGlv
biBvcmllbnRhdGlvbiA9IHNjcm9sbGJhciA/IHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA6IFZl
cnRpY2FsU2Nyb2xsYmFyOwotICAgIGd0a193aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRo
LmdldCgpLCAtMSwgb3JpZW50YXRpb24gPT0gVmVydGljYWxTY3JvbGxiYXIgPyAidmVydGljYWwi
IDogImhvcml6b250YWwiKTsKLSAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xhc3MocGF0
aC5nZXQoKSwgLTEsIG9yaWVudGF0aW9uID09IFZlcnRpY2FsU2Nyb2xsYmFyID8gInJpZ2h0IiA6
ICJib3R0b20iKTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfcGF0aChzdHlsZUNvbnRleHQu
Z2V0KCksIHBhdGguZ2V0KCkpOwogCi0gICAgcmV0dXJuIHN0eWxlQ29udGV4dDsKLX0KKyAgICBJ
bnRTaXplIHByZWZlcnJlZFNpemUgPSBjb250ZW50c0dhZGdldC0+Y2hpbGQoc3RlcHBlcnNQb3Np
dGlvblsyXSktPnByZWZlcnJlZFNpemUoKTsKKyAgICBpZiAoc2Nyb2xsYmFyLm9yaWVudGF0aW9u
KCkgPT0gVmVydGljYWxTY3JvbGxiYXIpCisgICAgICAgIHJlY3QuY29udHJhY3QoMCwgcHJlZmVy
cmVkU2l6ZS5oZWlnaHQoKSk7CisgICAgZWxzZQorICAgICAgICByZWN0LmNvbnRyYWN0KHByZWZl
cnJlZFNpemUud2lkdGgoKSwgMCk7CiAKLXN0YXRpYyBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4g
Y3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQoR3RrU3R5bGVDb250ZXh0KiBwYXJlbnQsIGNvbnN0IGNo
YXIqIG5hbWUpCi17Ci0gICAgQVNTRVJUKHBhcmVudCk7Ci0gICAgR1JlZlB0cjxHdGtXaWRnZXRQ
YXRoPiBwYXRoID0gYWRvcHRHUmVmKGd0a193aWRnZXRfcGF0aF9jb3B5KGd0a19zdHlsZV9jb250
ZXh0X2dldF9wYXRoKHBhcmVudCkpKTsKLSAgICBndGtfd2lkZ2V0X3BhdGhfYXBwZW5kX3R5cGUo
cGF0aC5nZXQoKSwgR1RLX1RZUEVfU0NST0xMQkFSKTsKLSNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigz
LCAxOSwgMikKLSAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9zZXRfb2JqZWN0X25hbWUocGF0aC5n
ZXQoKSwgLTEsIG5hbWUpOwotI2Vsc2UKLSAgICBndGtfd2lkZ2V0X3BhdGhfaXRlcl9hZGRfY2xh
c3MocGF0aC5nZXQoKSwgLTEsIEdUS19TVFlMRV9DTEFTU19TQ1JPTExCQVIpOwotICAgIGd0a193
aWRnZXRfcGF0aF9pdGVyX2FkZF9jbGFzcyhwYXRoLmdldCgpLCAtMSwgbmFtZSk7Ci0jZW5kaWYK
KyAgICBpZiAoc3RlcHBlcnNQb3NpdGlvblszXSAhPSAtMSkgeworICAgICAgICBpZiAoc2Nyb2xs
YmFyLm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIpCisgICAgICAgICAgICByZWN0
LmNvbnRyYWN0KDAsIGNvbnRlbnRzR2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzNdKS0+
cHJlZmVycmVkU2l6ZSgpLmhlaWdodCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVj
dC5jb250cmFjdChjb250ZW50c0dhZGdldC0+Y2hpbGQoc3RlcHBlcnNQb3NpdGlvblszXSktPnBy
ZWZlcnJlZFNpemUoKS53aWR0aCgpLCAwKTsKKyAgICB9CiAKLSAgICBHUmVmUHRyPEd0a1N0eWxl
Q29udGV4dD4gc3R5bGVDb250ZXh0ID0gYWRvcHRHUmVmKGd0a19zdHlsZV9jb250ZXh0X25ldygp
KTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfcGF0aChzdHlsZUNvbnRleHQuZ2V0KCksIHBh
dGguZ2V0KCkpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9wYXJlbnQoc3R5bGVDb250ZXh0
LmdldCgpLCBwYXJlbnQpOwotICAgIHJldHVybiBzdHlsZUNvbnRleHQ7Ci19CisgICAgaWYgKHNj
cm9sbGJhci5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICByZWN0
Lm1vdmUoMCwgcmVjdC5oZWlnaHQoKSk7CisgICAgZWxzZQorICAgICAgICByZWN0Lm1vdmUocmVj
dC53aWR0aCgpLCAwKTsKIAotc3RhdGljIHZvaWQgdGhlbWVDaGFuZ2VkQ2FsbGJhY2soKQotewot
ICAgIFNjcm9sbGJhclRoZW1lOjp0aGVtZSgpLnRoZW1lQ2hhbmdlZCgpOworICAgIHJldHVybiBJ
bnRSZWN0KHJlY3QubG9jYXRpb24oKSwgcHJlZmVycmVkU2l6ZSk7CiB9CiAKLVNjcm9sbGJhclRo
ZW1lR3RrOjpTY3JvbGxiYXJUaGVtZUd0aygpCitJbnRSZWN0IFNjcm9sbGJhclRoZW1lR3RrOjpm
b3J3YXJkQnV0dG9uUmVjdChTY3JvbGxiYXImIHNjcm9sbGJhciwgU2Nyb2xsYmFyUGFydCBwYXJ0
LCBib29sIC8qcGFpbnRpbmcqLykKIHsKLSNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAxOSwgMikK
LSNpZiBVU0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhSRUFERUQpCi0gICAgbV91c2VzT3Zlcmxh
eVNjcm9sbGJhcnMgPSB0cnVlOwotI2Vsc2UKLSAgICBtX3VzZXNPdmVybGF5U2Nyb2xsYmFycyA9
IGdfc3RyY21wMChnX2dldGVudigiR1RLX09WRVJMQVlfU0NST0xMSU5HIiksICIwIik7Ci0jZW5k
aWYKLSNlbmRpZgotICAgIHN0YXRpYyBib29sIHRoZW1lTW9uaXRvckluaXRpYWxpemVkID0gZmFs
c2U7Ci0gICAgaWYgKCF0aGVtZU1vbml0b3JJbml0aWFsaXplZCkgewotICAgICAgICBnX3NpZ25h
bF9jb25uZWN0X3N3YXBwZWQoZ3RrX3NldHRpbmdzX2dldF9kZWZhdWx0KCksICJub3RpZnk6Omd0
ay10aGVtZS1uYW1lIiwgR19DQUxMQkFDSyh0aGVtZUNoYW5nZWRDYWxsYmFjayksIG51bGxwdHIp
OwotICAgICAgICB0aGVtZU1vbml0b3JJbml0aWFsaXplZCA9IHRydWU7CisgICAgQVNTRVJUKHBh
cnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCB8fCBwYXJ0ID09IEZvcndhcmRCdXR0b25FbmRQ
YXJ0KTsKKyAgICBpZiAoKHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCAmJiAhbV9oYXNG
b3J3YXJkQnV0dG9uU3RhcnRQYXJ0KSB8fCAocGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCAm
JiAhbV9oYXNGb3J3YXJkQnV0dG9uRW5kUGFydCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7
CisKKyAgICBhdXRvIHNjcm9sbGJhckdhZGdldCA9IHNjcm9sbGJhckdhZGdldEZvckxheW91dChz
Y3JvbGxiYXIpOworICAgIEludFJlY3QgcmVjdDsKKyAgICBWZWN0b3I8aW50LCA0PiBzdGVwcGVy
c1Bvc2l0aW9uKDQsIC0xKTsKKyAgICBhdXRvIGNvbnRlbnRzR2FkZ2V0ID0gY29udGVudHNHYWRn
ZXRGb3JMYXlvdXQoc2Nyb2xsYmFyLCBzY3JvbGxiYXJHYWRnZXQuZ2V0KCksIHJlY3QsIHN0ZXBw
ZXJzUG9zaXRpb24pOworCisgICAgaWYgKHN0ZXBwZXJzUG9zaXRpb25bMF0gIT0gLTEpIHsKKyAg
ICAgICAgaWYgKHNjcm9sbGJhci5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQor
ICAgICAgICAgICAgcmVjdC5tb3ZlKDAsIGNvbnRlbnRzR2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bv
c2l0aW9uWzBdKS0+cHJlZmVycmVkU2l6ZSgpLmhlaWdodCgpKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgcmVjdC5tb3ZlKGNvbnRlbnRzR2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9u
WzBdKS0+cHJlZmVycmVkU2l6ZSgpLndpZHRoKCksIDApOwogICAgIH0KIAotICAgIHVwZGF0ZVRo
ZW1lUHJvcGVydGllcygpOwotfQorICAgIGlmIChwYXJ0ID09IEZvcndhcmRCdXR0b25TdGFydFBh
cnQpCisgICAgICAgIHJldHVybiBJbnRSZWN0KHJlY3QubG9jYXRpb24oKSwgY29udGVudHNHYWRn
ZXQtPmNoaWxkKDEpLT5wcmVmZXJyZWRTaXplKCkpOwogCi12b2lkIFNjcm9sbGJhclRoZW1lR3Rr
Ojp0aGVtZUNoYW5nZWQoKQotewotICAgIHVwZGF0ZVRoZW1lUHJvcGVydGllcygpOwotfQorICAg
IC8vIEZvcndhcmQgYnV0dG9uLgorICAgIEludFNpemUgcHJlZmVycmVkU2l6ZSA9IGNvbnRlbnRz
R2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzNdKS0+cHJlZmVycmVkU2l6ZSgpOworICAg
IGlmIChzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9sbGJhcikKKyAgICAg
ICAgcmVjdC5tb3ZlKDAsIHJlY3QuaGVpZ2h0KCkgLSBwcmVmZXJyZWRTaXplLmhlaWdodCgpKTsK
KyAgICBlbHNlCisgICAgICAgIHJlY3QubW92ZShyZWN0LndpZHRoKCkgLSBwcmVmZXJyZWRTaXpl
LndpZHRoKCksIDApOwogCi12b2lkIFNjcm9sbGJhclRoZW1lR3RrOjp1cGRhdGVUaGVtZVByb3Bl
cnRpZXMoKQotewotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBzdHlsZUNvbnRleHQgPSBn
ZXRPckNyZWF0ZVN0eWxlQ29udGV4dCgpOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHls
ZSgKLSAgICAgICAgc3R5bGVDb250ZXh0LmdldCgpLAotICAgICAgICAiaGFzLWJhY2t3YXJkLXN0
ZXBwZXIiLCAmbV9oYXNCYWNrQnV0dG9uU3RhcnRQYXJ0LAotICAgICAgICAiaGFzLWZvcndhcmQt
c3RlcHBlciIsICZtX2hhc0ZvcndhcmRCdXR0b25FbmRQYXJ0LAotICAgICAgICAiaGFzLXNlY29u
ZGFyeS1iYWNrd2FyZC1zdGVwcGVyIiwgJm1faGFzQmFja0J1dHRvbkVuZFBhcnQsCi0gICAgICAg
ICJoYXMtc2Vjb25kYXJ5LWZvcndhcmQtc3RlcHBlciIsICZtX2hhc0ZvcndhcmRCdXR0b25TdGFy
dFBhcnQsCi0gICAgICAgIG51bGxwdHIpOworICAgIHJldHVybiBJbnRSZWN0KHJlY3QubG9jYXRp
b24oKSwgcHJlZmVycmVkU2l6ZSk7CiB9Ci0KLUludFJlY3QgU2Nyb2xsYmFyVGhlbWVHdGs6OnRo
dW1iUmVjdChTY3JvbGxiYXImIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgdW5jb25zdHJhaW5l
ZFRyYWNrUmVjdCkKKyNlbHNlCitJbnRSZWN0IFNjcm9sbGJhclRoZW1lR3RrOjpiYWNrQnV0dG9u
UmVjdChTY3JvbGxiYXImIHNjcm9sbGJhciwgU2Nyb2xsYmFyUGFydCBwYXJ0LCBib29sIC8qcGFp
bnRpbmcqLykKIHsKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0g
Z2V0T3JDcmVhdGVTdHlsZUNvbnRleHQoJnNjcm9sbGJhcik7Ci0gICAgSW50UmVjdCB0cmFja1Jl
Y3QgPSBjb25zdHJhaW5UcmFja1JlY3RUb1RyYWNrUGllY2VzKHNjcm9sbGJhciwgdW5jb25zdHJh
aW5lZFRyYWNrUmVjdCk7Ci0gICAgaW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbihzY3JvbGxi
YXIpOwotICAgIGludCB0aHVtYkZhdCA9IHRodW1iRmF0bmVzcyhzY3JvbGxiYXIpOwotICAgIEd0
a0JvcmRlciB0cm91Z2hCb3JkZXIgPSB7IDAsIDAsIDAsIDAgfTsKLSNpZiBHVEtfQ0hFQ0tfVkVS
U0lPTigzLCAxOSwgMTEpCi0gICAgZ2V0VHJvdWdoQm9yZGVyKHNjcm9sbGJhciwgJnRyb3VnaEJv
cmRlcik7Ci0jZW5kaWYKKyAgICBpZiAoKHBhcnQgPT0gQmFja0J1dHRvbkVuZFBhcnQgJiYgIW1f
aGFzQmFja0J1dHRvbkVuZFBhcnQpIHx8IChwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQgJiYg
IW1faGFzQmFja0J1dHRvblN0YXJ0UGFydCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiAK
KyAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0gY3JlYXRlU3R5bGVD
b250ZXh0KCZzY3JvbGxiYXIpOworICAgIGludCB0cm91Z2hCb3JkZXJXaWR0aCwgc3RlcHBlclNp
emUsIHRodW1iRmF0OworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShzdHlsZUNvbnRl
eHQuZ2V0KCksICJ0cm91Z2gtYm9yZGVyIiwgJnRyb3VnaEJvcmRlcldpZHRoLCAic3RlcHBlci1z
aXplIiwgJnN0ZXBwZXJTaXplLCAic2xpZGVyLXdpZHRoIiwgJnRodW1iRmF0LCBudWxscHRyKTsK
KyAgICBpbnQgeCA9IHNjcm9sbGJhci54KCkgKyB0cm91Z2hCb3JkZXJXaWR0aDsKKyAgICBpbnQg
eSA9IHNjcm9sbGJhci55KCkgKyB0cm91Z2hCb3JkZXJXaWR0aDsKKyAgICBpZiAocGFydCA9PSBC
YWNrQnV0dG9uU3RhcnRQYXJ0KSB7CisgICAgICAgIGlmIChzY3JvbGxiYXIub3JpZW50YXRpb24o
KSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgcmV0dXJuIEludFJlY3QoeCwg
eSwgc3RlcHBlclNpemUsIHRodW1iRmF0KTsKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCwgeSwg
dGh1bWJGYXQsIHN0ZXBwZXJTaXplKTsKKyAgICB9CisKKyAgICAvLyBCYWNrQnV0dG9uRW5kUGFy
dCAoYWx0ZXJuYXRlIGJ1dHRvbikKICAgICBpZiAoc2Nyb2xsYmFyLm9yaWVudGF0aW9uKCkgPT0g
SG9yaXpvbnRhbFNjcm9sbGJhcikKLSAgICAgICAgcmV0dXJuIEludFJlY3QodHJhY2tSZWN0Lngo
KSArIHRodW1iUG9zLCB0cmFja1JlY3QueSgpICsgdHJvdWdoQm9yZGVyLnRvcCArICh0cmFja1Jl
Y3QuaGVpZ2h0KCkgLSB0aHVtYkZhdCkgLyAyLCB0aHVtYkxlbmd0aChzY3JvbGxiYXIpLCB0aHVt
YkZhdCk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHNjcm9sbGJhci54KCkgKyBzY3JvbGxiYXIu
d2lkdGgoKSAtIHRyb3VnaEJvcmRlcldpZHRoIC0gKDIgKiBzdGVwcGVyU2l6ZSksIHksIHN0ZXBw
ZXJTaXplLCB0aHVtYkZhdCk7CiAKLSAgICAvLyBWZXJ0aWNhbFNjcm9sbGJhcgotICAgIHJldHVy
biBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyB0cm91Z2hCb3JkZXIubGVmdCArICh0cmFja1JlY3Qu
d2lkdGgoKSAtIHRodW1iRmF0KSAvIDIsIHRyYWNrUmVjdC55KCkgKyB0aHVtYlBvcywgdGh1bWJG
YXQsIHRodW1iTGVuZ3RoKHNjcm9sbGJhcikpOworICAgIC8vIFZlcnRpY2FsU2Nyb2xsYmFyIGFs
dGVybmF0ZSBidXR0b24KKyAgICByZXR1cm4gSW50UmVjdCh4LCBzY3JvbGxiYXIueSgpICsgc2Ny
b2xsYmFyLmhlaWdodCgpIC0gdHJvdWdoQm9yZGVyV2lkdGggLSAoMiAqIHN0ZXBwZXJTaXplKSwg
dGh1bWJGYXQsIHN0ZXBwZXJTaXplKTsKIH0KIAotc3RhdGljIHZvaWQgYWRqdXN0UmVjdEFjY29y
ZGluZ1RvTWFyZ2luKEd0a1N0eWxlQ29udGV4dCogY29udGV4dCwgSW50UmVjdCYgcmVjdCkKK0lu
dFJlY3QgU2Nyb2xsYmFyVGhlbWVHdGs6OmZvcndhcmRCdXR0b25SZWN0KFNjcm9sbGJhciYgc2Ny
b2xsYmFyLCBTY3JvbGxiYXJQYXJ0IHBhcnQsIGJvb2wgLypwYWludGluZyovKQogewotICAgIEd0
a0JvcmRlciBtYXJnaW47Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X21hcmdpbihjb250ZXh0
LCBndGtfc3R5bGVfY29udGV4dF9nZXRfc3RhdGUoY29udGV4dCksICZtYXJnaW4pOwotICAgIHJl
Y3QubW92ZShtYXJnaW4ubGVmdCwgbWFyZ2luLnRvcCk7Ci0gICAgcmVjdC5jb250cmFjdChtYXJn
aW4ubGVmdCArIG1hcmdpbi5yaWdodCwgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pOwotfQor
ICAgIGlmICgocGFydCA9PSBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0ICYmICFtX2hhc0ZvcndhcmRC
dXR0b25TdGFydFBhcnQpIHx8IChwYXJ0ID09IEZvcndhcmRCdXR0b25FbmRQYXJ0ICYmICFtX2hh
c0ZvcndhcmRCdXR0b25FbmRQYXJ0KSkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAotdm9p
ZCBTY3JvbGxiYXJUaGVtZUd0azo6cGFpbnRUcmFja0JhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0
JiBjb250ZXh0LCBTY3JvbGxiYXImIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsK
LSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gcGFyZW50U3R5bGVDb250ZXh0ID0gZ2V0T3JD
cmVhdGVTdHlsZUNvbnRleHQoJnNjcm9sbGJhciwgU3R5bGVDb250ZXh0TW9kZTo6UGFpbnQpOwot
ICAgIC8vIFBhaW50IHRoZSB0cmFjayBiYWNrZ3JvdW5kLiBJZiB0aGUgdHJvdWdoLXVuZGVyLXN0
ZXBwZXJzIHByb3BlcnR5IGlzIHRydWUsIHRoaXMKLSAgICAvLyBzaG91bGQgYmUgdGhlIGZ1bGwg
c2l6ZSBvZiB0aGUgc2Nyb2xsYmFyLCBidXQgaWYgaXMgZmFsc2UsIGl0IHNob3VsZCBvbmx5IGJl
IHRoZQotICAgIC8vIHRyYWNrIHJlY3QuCi0gICAgSW50UmVjdCBmdWxsU2Nyb2xsYmFyUmVjdChy
ZWN0KTsKLSAgICBpZiAodHJvdWdoVW5kZXJTdGVwcGVycyhzY3JvbGxiYXIpKQotICAgICAgICBm
dWxsU2Nyb2xsYmFyUmVjdCA9IEludFJlY3Qoc2Nyb2xsYmFyLngoKSwgc2Nyb2xsYmFyLnkoKSwg
c2Nyb2xsYmFyLndpZHRoKCksIHNjcm9sbGJhci5oZWlnaHQoKSk7CisgICAgR1JlZlB0cjxHdGtT
dHlsZUNvbnRleHQ+IHN0eWxlQ29udGV4dCA9IGNyZWF0ZVN0eWxlQ29udGV4dCgmc2Nyb2xsYmFy
KTsKKyAgICBpbnQgdHJvdWdoQm9yZGVyV2lkdGgsIHN0ZXBwZXJTaXplLCB0aHVtYkZhdDsKKyAg
ICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoc3R5bGVDb250ZXh0LmdldCgpLCAidHJvdWdo
LWJvcmRlciIsICZ0cm91Z2hCb3JkZXJXaWR0aCwgInN0ZXBwZXItc2l6ZSIsICZzdGVwcGVyU2l6
ZSwgInNsaWRlci13aWR0aCIsICZ0aHVtYkZhdCwgbnVsbHB0cik7CisgICAgaWYgKHNjcm9sbGJh
ci5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaW50IHkg
PSBzY3JvbGxiYXIueSgpICsgdHJvdWdoQm9yZGVyV2lkdGg7CisgICAgICAgIGlmIChwYXJ0ID09
IEZvcndhcmRCdXR0b25FbmRQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIEludFJlY3Qoc2Nyb2xs
YmFyLngoKSArIHNjcm9sbGJhci53aWR0aCgpIC0gc3RlcHBlclNpemUgLSB0cm91Z2hCb3JkZXJX
aWR0aCwgeSwgc3RlcHBlclNpemUsIHRodW1iRmF0KTsKIAotICAgIEludFJlY3QgYWRqdXN0ZWRS
ZWN0ID0gZnVsbFNjcm9sbGJhclJlY3Q7Ci0gICAgYWRqdXN0UmVjdEFjY29yZGluZ1RvTWFyZ2lu
KHBhcmVudFN0eWxlQ29udGV4dC5nZXQoKSwgYWRqdXN0ZWRSZWN0KTsKLSAgICBndGtfcmVuZGVy
X2JhY2tncm91bmQocGFyZW50U3R5bGVDb250ZXh0LmdldCgpLCBjb250ZXh0LnBsYXRmb3JtQ29u
dGV4dCgpLT5jcigpLCBhZGp1c3RlZFJlY3QueCgpLCBhZGp1c3RlZFJlY3QueSgpLCBhZGp1c3Rl
ZFJlY3Qud2lkdGgoKSwgYWRqdXN0ZWRSZWN0LmhlaWdodCgpKTsKLSAgICBndGtfcmVuZGVyX2Zy
YW1lKHBhcmVudFN0eWxlQ29udGV4dC5nZXQoKSwgY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKS0+
Y3IoKSwgYWRqdXN0ZWRSZWN0LngoKSwgYWRqdXN0ZWRSZWN0LnkoKSwgYWRqdXN0ZWRSZWN0Lndp
ZHRoKCksIGFkanVzdGVkUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIC8vIEZvcndhcmRCdXR0b25T
dGFydFBhcnQgKGFsdGVybmF0ZSBidXR0b24pCisgICAgICAgIHJldHVybiBJbnRSZWN0KHNjcm9s
bGJhci54KCkgKyB0cm91Z2hCb3JkZXJXaWR0aCArIHN0ZXBwZXJTaXplLCB5LCBzdGVwcGVyU2l6
ZSwgdGh1bWJGYXQpOworICAgIH0KIAotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBjb250
ZW50c1N0eWxlQ29udGV4dCA9IGNyZWF0ZUNoaWxkU3R5bGVDb250ZXh0KHBhcmVudFN0eWxlQ29u
dGV4dC5nZXQoKSwgImNvbnRlbnRzIik7Ci0gICAgYWRqdXN0ZWRSZWN0ID0gZnVsbFNjcm9sbGJh
clJlY3Q7Ci0gICAgYWRqdXN0UmVjdEFjY29yZGluZ1RvTWFyZ2luKGNvbnRlbnRzU3R5bGVDb250
ZXh0LmdldCgpLCBhZGp1c3RlZFJlY3QpOwotICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZChjb250
ZW50c1N0eWxlQ29udGV4dC5nZXQoKSwgY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwg
YWRqdXN0ZWRSZWN0LngoKSwgYWRqdXN0ZWRSZWN0LnkoKSwgYWRqdXN0ZWRSZWN0LndpZHRoKCks
IGFkanVzdGVkUmVjdC5oZWlnaHQoKSk7Ci0gICAgZ3RrX3JlbmRlcl9mcmFtZShjb250ZW50c1N0
eWxlQ29udGV4dC5nZXQoKSwgY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgYWRqdXN0
ZWRSZWN0LngoKSwgYWRqdXN0ZWRSZWN0LnkoKSwgYWRqdXN0ZWRSZWN0LndpZHRoKCksIGFkanVz
dGVkUmVjdC5oZWlnaHQoKSk7CisgICAgLy8gVmVydGljYWxTY3JvbGxiYXIKKyAgICBpbnQgeCA9
IHNjcm9sbGJhci54KCkgKyB0cm91Z2hCb3JkZXJXaWR0aDsKKyAgICBpZiAocGFydCA9PSBGb3J3
YXJkQnV0dG9uRW5kUGFydCkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCwgc2Nyb2xsYmFyLnko
KSArIHNjcm9sbGJhci5oZWlnaHQoKSAtIHN0ZXBwZXJTaXplIC0gdHJvdWdoQm9yZGVyV2lkdGgs
IHRodW1iRmF0LCBzdGVwcGVyU2l6ZSk7CiAKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4g
dHJvdWdoU3R5bGVDb250ZXh0ID0gY3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQoY29udGVudHNTdHls
ZUNvbnRleHQuZ2V0KCksICJ0cm91Z2giKTsKLSAgICBhZGp1c3RlZFJlY3QgPSBmdWxsU2Nyb2xs
YmFyUmVjdDsKLSAgICBhZGp1c3RSZWN0QWNjb3JkaW5nVG9NYXJnaW4odHJvdWdoU3R5bGVDb250
ZXh0LmdldCgpLCBhZGp1c3RlZFJlY3QpOwotICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZCh0cm91
Z2hTdHlsZUNvbnRleHQuZ2V0KCksIGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGFk
anVzdGVkUmVjdC54KCksIGFkanVzdGVkUmVjdC55KCksIGFkanVzdGVkUmVjdC53aWR0aCgpLCBh
ZGp1c3RlZFJlY3QuaGVpZ2h0KCkpOwotICAgIGd0a19yZW5kZXJfZnJhbWUodHJvdWdoU3R5bGVD
b250ZXh0LmdldCgpLCBjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBhZGp1c3RlZFJl
Y3QueCgpLCBhZGp1c3RlZFJlY3QueSgpLCBhZGp1c3RlZFJlY3Qud2lkdGgoKSwgYWRqdXN0ZWRS
ZWN0LmhlaWdodCgpKTsKKyAgICAvLyBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0IChhbHRlcm5hdGUg
YnV0dG9uKQorICAgIHJldHVybiBJbnRSZWN0KHgsIHNjcm9sbGJhci55KCkgKyB0cm91Z2hCb3Jk
ZXJXaWR0aCArIHN0ZXBwZXJTaXplLCB0aHVtYkZhdCwgc3RlcHBlclNpemUpOwogfQorI2VuZGlm
IC8vIEdUS19DSEVDS19WRVJTSU9OKDMsIDIwLCAwKQogCi12b2lkIFNjcm9sbGJhclRoZW1lR3Rr
OjpwYWludFNjcm9sbGJhckJhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBTY3Jv
bGxiYXImIHNjcm9sbGJhcikKKyNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAyMCwgMCkKK2Jvb2wg
U2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50KFNjcm9sbGJhciYgc2Nyb2xsYmFyLCBHcmFwaGljc0Nv
bnRleHQmIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkKIHsKLSAg
ICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0gZ2V0T3JDcmVhdGVTdHls
ZUNvbnRleHQoJnNjcm9sbGJhciwgU3R5bGVDb250ZXh0TW9kZTo6UGFpbnQpOwotICAgIGd0a19y
ZW5kZXJfZnJhbWUoc3R5bGVDb250ZXh0LmdldCgpLCBjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgp
LT5jcigpLCBzY3JvbGxiYXIueCgpLCBzY3JvbGxiYXIueSgpLCBzY3JvbGxiYXIud2lkdGgoKSwg
c2Nyb2xsYmFyLmhlaWdodCgpKTsKLX0KKyAgICBpZiAoZ3JhcGhpY3NDb250ZXh0LnBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi12b2lkIFNjcm9sbGJhclRoZW1l
R3RrOjpwYWludFRodW1iKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgU2Nyb2xsYmFyJiBzY3Jv
bGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgU2Nyb2xsYmFyT3JpZW50YXRpb24g
b3JpZW50YXRpb24gPSBzY3JvbGxiYXIub3JpZW50YXRpb24oKTsKLSAgICBHUmVmUHRyPEd0a1N0
eWxlQ29udGV4dD4gcGFyZW50U3R5bGVDb250ZXh0ID0gZ2V0T3JDcmVhdGVTdHlsZUNvbnRleHQo
JnNjcm9sbGJhciwgU3R5bGVDb250ZXh0TW9kZTo6UGFpbnQpOwotICAgIEdSZWZQdHI8R3RrU3R5
bGVDb250ZXh0PiBjb250ZW50c1N0eWxlQ29udGV4dCA9IGNyZWF0ZUNoaWxkU3R5bGVDb250ZXh0
KHBhcmVudFN0eWxlQ29udGV4dC5nZXQoKSwgImNvbnRlbnRzIik7Ci0gICAgR1JlZlB0cjxHdGtT
dHlsZUNvbnRleHQ+IHRyb3VnaFN0eWxlQ29udGV4dCA9IGNyZWF0ZUNoaWxkU3R5bGVDb250ZXh0
KGNvbnRlbnRzU3R5bGVDb250ZXh0LmdldCgpLCAidHJvdWdoIik7Ci0gICAgR1JlZlB0cjxHdGtT
dHlsZUNvbnRleHQ+IHN0eWxlQ29udGV4dCA9IGNyZWF0ZUNoaWxkU3R5bGVDb250ZXh0KHRyb3Vn
aFN0eWxlQ29udGV4dC5nZXQoKSwgInNsaWRlciIpOworICAgIGRvdWJsZSBvcGFjaXR5ID0gc2Ny
b2xsYmFyLmhvdmVyZWRQYXJ0KCkgPT0gTm9QYXJ0ID8gc2Nyb2xsYmFyLm9wYWNpdHkoKSA6IDE7
CisgICAgaWYgKCFvcGFjaXR5KQorICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIHVuc2lnbmVk
IGZsYWdzID0gMDsKLSAgICBpZiAoc2Nyb2xsYmFyLnByZXNzZWRQYXJ0KCkgPT0gVGh1bWJQYXJ0
KQotICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19BQ1RJVkU7Ci0gICAgaWYgKHNjcm9s
bGJhci5ob3ZlcmVkUGFydCgpID09IFRodW1iUGFydCkKLSAgICAgICAgZmxhZ3MgfD0gR1RLX1NU
QVRFX0ZMQUdfUFJFTElHSFQ7Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKHN0eWxl
Q29udGV4dC5nZXQoKSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKKyAgICBJ
bnRSZWN0IHJlY3QgPSBzY3JvbGxiYXIuZnJhbWVSZWN0KCk7CisgICAgaWYgKCFyZWN0LmludGVy
c2VjdHMoZGFtYWdlUmVjdCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgUmVuZGVyVGhl
bWVHYWRnZXQ6OkluZm8gaW5mbyA9IHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OlNjcm9sbGJh
ciwgInNjcm9sbGJhciIsIHNjcm9sbGJhclBhcnRTdGF0ZUZsYWdzKHNjcm9sbGJhciwgQWxsUGFy
dHMsIHRydWUpLCB7IH0gfTsKKyAgICBpZiAoc2Nyb2xsYmFyLm9yaWVudGF0aW9uKCkgPT0gVmVy
dGljYWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaW5mby5jbGFzc0xpc3QuYXBwZW5kKCJ2ZXJ0aWNh
bCIpOworICAgICAgICBpbmZvLmNsYXNzTGlzdC5hcHBlbmQoInJpZ2h0Iik7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgaW5mby5jbGFzc0xpc3QuYXBwZW5kKCJob3Jpem9udGFsIik7CisgICAgICAg
IGluZm8uY2xhc3NMaXN0LmFwcGVuZCgiYm90dG9tIik7CisgICAgfQorICAgIGlmIChtX3VzZXNP
dmVybGF5U2Nyb2xsYmFycykKKyAgICAgICAgaW5mby5jbGFzc0xpc3QuYXBwZW5kKCJvdmVybGF5
LWluZGljYXRvciIpOworICAgIGlmIChpbmZvLnN0YXRlICYgR1RLX1NUQVRFX0ZMQUdfUFJFTElH
SFQpCisgICAgICAgIGluZm8uY2xhc3NMaXN0LmFwcGVuZCgiaG92ZXJpbmciKTsKKyAgICBpZiAo
c2Nyb2xsYmFyLnByZXNzZWRQYXJ0KCkgIT0gTm9QYXJ0KQorICAgICAgICBpbmZvLmNsYXNzTGlz
dC5hcHBlbmQoImRyYWdnaW5nIik7CisgICAgYXV0byBzY3JvbGxiYXJHYWRnZXQgPSBSZW5kZXJU
aGVtZUdhZGdldDo6Y3JlYXRlKGluZm8pOworICAgIGlmIChtX3VzZXNPdmVybGF5U2Nyb2xsYmFy
cykKKyAgICAgICAgb3BhY2l0eSAqPSBzY3JvbGxiYXJHYWRnZXQtPm9wYWNpdHkoKTsKKyAgICBp
ZiAoIW9wYWNpdHkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaW5mby50eXBlID0gUmVu
ZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVyaWM7CisgICAgaW5mby5uYW1lID0gImNvbnRlbnRz
IjsKKyAgICBpbmZvLnN0YXRlID0gR1RLX1NUQVRFX0ZMQUdfTk9STUFMOworICAgIGluZm8uY2xh
c3NMaXN0LmNsZWFyKCk7CisgICAgVmVjdG9yPFJlbmRlclRoZW1lR2FkZ2V0OjpJbmZvPiBjaGls
ZHJlbjsKKyAgICBhdXRvIHN0ZXBwZXJzID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGhlbWVTY3JvbGxi
YXJHYWRnZXQqPihzY3JvbGxiYXJHYWRnZXQuZ2V0KCkpLT5zdGVwcGVycygpOworICAgIHVuc2ln
bmVkIHN0ZXBwZXJzUG9zaXRpb25bNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBpZiAoc3RlcHBl
cnMuY29udGFpbnMoUmVuZGVyVGhlbWVTY3JvbGxiYXJHYWRnZXQ6OlN0ZXBwZXJzOjpCYWNrd2Fy
ZCkpIHsKKyAgICAgICAgc3RlcHBlcnNQb3NpdGlvblswXSA9IGNoaWxkcmVuLnNpemUoKTsKKyAg
ICAgICAgY2hpbGRyZW4uYXBwZW5kKHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVyaWMs
ICJidXR0b24iLCBzY3JvbGxiYXJQYXJ0U3RhdGVGbGFncyhzY3JvbGxiYXIsIEJhY2tCdXR0b25T
dGFydFBhcnQpLCB7ICJ1cCIgfSB9KTsKKyAgICB9CisgICAgaWYgKHN0ZXBwZXJzLmNvbnRhaW5z
KFJlbmRlclRoZW1lU2Nyb2xsYmFyR2FkZ2V0OjpTdGVwcGVyczo6U2Vjb25kYXJ5Rm9yd2FyZCkp
IHsKKyAgICAgICAgc3RlcHBlcnNQb3NpdGlvblsxXSA9IGNoaWxkcmVuLnNpemUoKTsKKyAgICAg
ICAgY2hpbGRyZW4uYXBwZW5kKHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVyaWMsICJi
dXR0b24iLCBzY3JvbGxiYXJQYXJ0U3RhdGVGbGFncyhzY3JvbGxiYXIsIEZvcndhcmRCdXR0b25T
dGFydFBhcnQpLCB7ICJkb3duIiB9IH0pOworICAgIH0KKyAgICB1bnNpZ25lZCB0cm91Z2hQb3Np
dGlvbiA9IGNoaWxkcmVuLnNpemUoKTsKKyAgICBjaGlsZHJlbi5hcHBlbmQoeyBSZW5kZXJUaGVt
ZUdhZGdldDo6VHlwZTo6R2VuZXJpYywgInRyb3VnaCIsIHNjcm9sbGJhclBhcnRTdGF0ZUZsYWdz
KHNjcm9sbGJhciwgQmFja1RyYWNrUGFydCksIHsgfSB9KTsKKyAgICBpZiAoc3RlcHBlcnMuY29u
dGFpbnMoUmVuZGVyVGhlbWVTY3JvbGxiYXJHYWRnZXQ6OlN0ZXBwZXJzOjpTZWNvbmRhcnlCYWNr
d2FyZCkpIHsKKyAgICAgICAgc3RlcHBlcnNQb3NpdGlvblsyXSA9IGNoaWxkcmVuLnNpemUoKTsK
KyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVy
aWMsICJidXR0b24iLCBzY3JvbGxiYXJQYXJ0U3RhdGVGbGFncyhzY3JvbGxiYXIsIEJhY2tCdXR0
b25FbmRQYXJ0KSwgeyAidXAiIH0gfSk7CisgICAgfQorICAgIGlmIChzdGVwcGVycy5jb250YWlu
cyhSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldDo6U3RlcHBlcnM6OkZvcndhcmQpKSB7CisgICAg
ICAgIHN0ZXBwZXJzUG9zaXRpb25bM10gPSBjaGlsZHJlbi5zaXplKCk7CisgICAgICAgIGNoaWxk
cmVuLmFwcGVuZCh7IFJlbmRlclRoZW1lR2FkZ2V0OjpUeXBlOjpHZW5lcmljLCAiYnV0dG9uIiwg
c2Nyb2xsYmFyUGFydFN0YXRlRmxhZ3Moc2Nyb2xsYmFyLCBGb3J3YXJkQnV0dG9uRW5kUGFydCks
IHsgImRvd24iIH0gfSk7CisgICAgfQorICAgIGF1dG8gY29udGVudHNHYWRnZXQgPSBzdGQ6Om1h
a2VfdW5pcXVlPFJlbmRlclRoZW1lQm94R2FkZ2V0PihpbmZvLCBjaGlsZHJlbiwgc2Nyb2xsYmFy
R2FkZ2V0LmdldCgpKTsKKyAgICBSZW5kZXJUaGVtZUdhZGdldCogdHJvdWdoR2FkZ2V0ID0gY29u
dGVudHNHYWRnZXQtPmNoaWxkKHRyb3VnaFBvc2l0aW9uKTsKKworICAgIGlmIChvcGFjaXR5ICE9
IDEpIHsKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnNhdmUoKTsKKyAgICAgICAgZ3JhcGhpY3ND
b250ZXh0LmNsaXAoZGFtYWdlUmVjdCk7CisgICAgICAgIGdyYXBoaWNzQ29udGV4dC5iZWdpblRy
YW5zcGFyZW5jeUxheWVyKG9wYWNpdHkpOworICAgIH0KKworICAgIEZsb2F0UmVjdCBjb250ZW50
c1JlY3Q7CisgICAgc2Nyb2xsYmFyR2FkZ2V0LT5yZW5kZXIoZ3JhcGhpY3NDb250ZXh0LnBsYXRm
b3JtQ29udGV4dCgpLT5jcigpLCByZWN0LCAmY29udGVudHNSZWN0KTsKKyAgICBjb250ZW50c0dh
ZGdldC0+cmVuZGVyKGdyYXBoaWNzQ29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgY29u
dGVudHNSZWN0LCAmY29udGVudHNSZWN0KTsKKyAgICB0cm91Z2hHYWRnZXQtPnJlbmRlcihncmFw
aGljc0NvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGNvbnRlbnRzUmVjdCwgJmNvbnRl
bnRzUmVjdCk7CisgICAgRmxvYXRSZWN0IGJ1dHRvblJlY3QgPSBjb250ZW50c1JlY3Q7CisgICAg
aWYgKHN0ZXBwZXJzLmNvbnRhaW5zKFJlbmRlclRoZW1lU2Nyb2xsYmFyR2FkZ2V0OjpTdGVwcGVy
czo6QmFja3dhcmQpKSB7CisgICAgICAgIFJlbmRlclRoZW1lR2FkZ2V0KiBidXR0b25HYWRnZXQg
PSBjb250ZW50c0dhZGdldC0+Y2hpbGQoc3RlcHBlcnNQb3NpdGlvblswXSk7CisgICAgICAgIGlm
IChzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9sbGJhcikKKyAgICAgICAg
ICAgIGJ1dHRvblJlY3Quc2V0SGVpZ2h0KGJ1dHRvbkdhZGdldC0+cHJlZmVycmVkU2l6ZSgpLmhl
aWdodCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnV0dG9uUmVjdC5zZXRXaWR0aChi
dXR0b25HYWRnZXQtPnByZWZlcnJlZFNpemUoKS53aWR0aCgpKTsKKyAgICAgICAgYnV0dG9uR2Fk
Z2V0LT5yZW5kZXIoZ3JhcGhpY3NDb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBidXR0
b25SZWN0KTsKKyAgICAgICAgaWYgKHNjcm9sbGJhci5vcmllbnRhdGlvbigpID09IFZlcnRpY2Fs
U2Nyb2xsYmFyKQorICAgICAgICAgICAgYnV0dG9uUmVjdC5tb3ZlKDAsIGJ1dHRvblJlY3QuaGVp
Z2h0KCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidXR0b25SZWN0Lm1vdmUoYnV0dG9u
UmVjdC53aWR0aCgpLCAwKTsKKyAgICB9CisgICAgaWYgKHN0ZXBwZXJzLmNvbnRhaW5zKFJlbmRl
clRoZW1lU2Nyb2xsYmFyR2FkZ2V0OjpTdGVwcGVyczo6U2Vjb25kYXJ5Rm9yd2FyZCkpIHsKKyAg
ICAgICAgUmVuZGVyVGhlbWVHYWRnZXQqIGJ1dHRvbkdhZGdldCA9IGNvbnRlbnRzR2FkZ2V0LT5j
aGlsZChzdGVwcGVyc1Bvc2l0aW9uWzFdKTsKKyAgICAgICAgaWYgKHNjcm9sbGJhci5vcmllbnRh
dGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICAgICAgYnV0dG9uUmVjdC5zZXRI
ZWlnaHQoYnV0dG9uR2FkZ2V0LT5wcmVmZXJyZWRTaXplKCkuaGVpZ2h0KCkpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBidXR0b25SZWN0LnNldFdpZHRoKGJ1dHRvbkdhZGdldC0+cHJlZmVy
cmVkU2l6ZSgpLndpZHRoKCkpOworICAgICAgICBidXR0b25HYWRnZXQtPnJlbmRlcihncmFwaGlj
c0NvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGJ1dHRvblJlY3QpOworICAgICAgICBp
ZiAoc2Nyb2xsYmFyLm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIpCisgICAgICAg
ICAgICBidXR0b25SZWN0Lm1vdmUoMCwgY29udGVudHNSZWN0LmhlaWdodCgpKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgYnV0dG9uUmVjdC5tb3ZlKGNvbnRlbnRzUmVjdC53aWR0aCgpLCAw
KTsKKyAgICB9CisgICAgaWYgKHN0ZXBwZXJzLmNvbnRhaW5zKFJlbmRlclRoZW1lU2Nyb2xsYmFy
R2FkZ2V0OjpTdGVwcGVyczo6U2Vjb25kYXJ5QmFja3dhcmQpKSB7CisgICAgICAgIFJlbmRlclRo
ZW1lR2FkZ2V0KiBidXR0b25HYWRnZXQgPSBjb250ZW50c0dhZGdldC0+Y2hpbGQoc3RlcHBlcnNQ
b3NpdGlvblsyXSk7CisgICAgICAgIGlmIChzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9PSBWZXJ0
aWNhbFNjcm9sbGJhcikKKyAgICAgICAgICAgIGJ1dHRvblJlY3Quc2V0SGVpZ2h0KGJ1dHRvbkdh
ZGdldC0+cHJlZmVycmVkU2l6ZSgpLmhlaWdodCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgYnV0dG9uUmVjdC5zZXRXaWR0aChidXR0b25HYWRnZXQtPnByZWZlcnJlZFNpemUoKS53aWR0
aCgpKTsKKyAgICAgICAgYnV0dG9uR2FkZ2V0LT5yZW5kZXIoZ3JhcGhpY3NDb250ZXh0LnBsYXRm
b3JtQ29udGV4dCgpLT5jcigpLCBidXR0b25SZWN0KTsKKyAgICAgICAgaWYgKHNjcm9sbGJhci5v
cmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICAgICAgYnV0dG9uUmVj
dC5tb3ZlKDAsIGJ1dHRvblJlY3QuaGVpZ2h0KCkpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBidXR0b25SZWN0Lm1vdmUoYnV0dG9uUmVjdC53aWR0aCgpLCAwKTsKKyAgICB9CisgICAgaWYg
KHN0ZXBwZXJzLmNvbnRhaW5zKFJlbmRlclRoZW1lU2Nyb2xsYmFyR2FkZ2V0OjpTdGVwcGVyczo6
Rm9yd2FyZCkpIHsKKyAgICAgICAgUmVuZGVyVGhlbWVHYWRnZXQqIGJ1dHRvbkdhZGdldCA9IGNv
bnRlbnRzR2FkZ2V0LT5jaGlsZChzdGVwcGVyc1Bvc2l0aW9uWzNdKTsKKyAgICAgICAgaWYgKHNj
cm9sbGJhci5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICAgICAg
YnV0dG9uUmVjdC5zZXRIZWlnaHQoYnV0dG9uR2FkZ2V0LT5wcmVmZXJyZWRTaXplKCkuaGVpZ2h0
KCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidXR0b25SZWN0LnNldFdpZHRoKGJ1dHRv
bkdhZGdldC0+cHJlZmVycmVkU2l6ZSgpLndpZHRoKCkpOworICAgICAgICBidXR0b25HYWRnZXQt
PnJlbmRlcihncmFwaGljc0NvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGJ1dHRvblJl
Y3QpOworICAgIH0KKyAgICBpZiAoaW50IHRodW1iU2l6ZSA9IHRodW1iTGVuZ3RoKHNjcm9sbGJh
cikpIHsKKyAgICAgICAgaW5mby5uYW1lID0gInNsaWRlciI7CisgICAgICAgIGluZm8uc3RhdGUg
PSBzY3JvbGxiYXJQYXJ0U3RhdGVGbGFncyhzY3JvbGxiYXIsIFRodW1iUGFydCk7CisgICAgICAg
IGF1dG8gc2xpZGVyR2FkZ2V0ID0gUmVuZGVyVGhlbWVHYWRnZXQ6OmNyZWF0ZShpbmZvLCB0cm91
Z2hHYWRnZXQpOwogCi0gICAgSW50UmVjdCB0aHVtYlJlY3QocmVjdCk7Ci0gICAgaWYgKG1fdXNl
c092ZXJsYXlTY3JvbGxiYXJzICYmIHNjcm9sbGJhci5ob3ZlcmVkUGFydCgpID09IE5vUGFydCkg
ewogICAgICAgICAvLyBXaGVuIHVzaW5nIG92ZXJsYXkgc2Nyb2xsYmFycyB3ZSBhbHdheXMgY2xh
aW0gdGhlIHNpemUgb2YgdGhlIHNjcm9sbGJhciB3aGVuIGhvdmVyZWQsIHNvIHdoZW4KICAgICAg
ICAgLy8gZHJhd2luZyB0aGUgaW5kaWNhdG9yIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByZWN0YW5n
bGUgdG8gaXRzIGFjdHVhbCBzaXplIGluIGluZGljYXRvciBtb2RlLgotICAgICAgICBpZiAob3Jp
ZW50YXRpb24gPT0gVmVydGljYWxTY3JvbGxiYXIpCi0gICAgICAgICAgICB0aHVtYlJlY3QubW92
ZShzY3JvbGxiYXIud2lkdGgoKSAtIHNjcm9sbGJhclRoaWNrbmVzcyhwYXJlbnRTdHlsZUNvbnRl
eHQuZ2V0KCksIG9yaWVudGF0aW9uKSwgMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRo
dW1iUmVjdC5tb3ZlKDAsIHNjcm9sbGJhci5oZWlnaHQoKSAtIHNjcm9sbGJhclRoaWNrbmVzcyhw
YXJlbnRTdHlsZUNvbnRleHQuZ2V0KCksIG9yaWVudGF0aW9uKSk7CisgICAgICAgIGJvb2wgaXNJ
bmRpY2F0b3IgPSBtX3VzZXNPdmVybGF5U2Nyb2xsYmFycyAmJiBzY3JvbGxiYXIuaG92ZXJlZFBh
cnQoKSA9PSBOb1BhcnQ7CisgICAgICAgIGlmIChzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9PSBW
ZXJ0aWNhbFNjcm9sbGJhcikgeworICAgICAgICAgICAgaW50IHNsaWRlcldpZHRoID0gc2xpZGVy
R2FkZ2V0LT5wcmVmZXJyZWRTaXplKCkud2lkdGgoKTsKKyAgICAgICAgICAgIGNvbnRlbnRzUmVj
dC5tb3ZlKGlzSW5kaWNhdG9yID8gY29udGVudHNSZWN0LndpZHRoKCkgLSBzbGlkZXJXaWR0aCA6
IDAsIHRodW1iUG9zaXRpb24oc2Nyb2xsYmFyKSk7CisgICAgICAgICAgICBjb250ZW50c1JlY3Qu
c2V0V2lkdGgoc2xpZGVyV2lkdGgpOworICAgICAgICAgICAgY29udGVudHNSZWN0LnNldEhlaWdo
dCh0aHVtYlNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHNsaWRlckhl
aWdodCA9IHNsaWRlckdhZGdldC0+cHJlZmVycmVkU2l6ZSgpLmhlaWdodCgpOworICAgICAgICAg
ICAgY29udGVudHNSZWN0Lm1vdmUodGh1bWJQb3NpdGlvbihzY3JvbGxiYXIpLCBpc0luZGljYXRv
ciA/IGNvbnRlbnRzUmVjdC5oZWlnaHQoKSAtIHNsaWRlckhlaWdodCA6IDApOworICAgICAgICAg
ICAgY29udGVudHNSZWN0LnNldFdpZHRoKHRodW1iU2l6ZSk7CisgICAgICAgICAgICBjb250ZW50
c1JlY3Quc2V0SGVpZ2h0KHNsaWRlckhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNv
bnRlbnRzUmVjdC5pbnRlcnNlY3RzKGRhbWFnZVJlY3QpKQorICAgICAgICAgICAgc2xpZGVyR2Fk
Z2V0LT5yZW5kZXIoZ3JhcGhpY3NDb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBjb250
ZW50c1JlY3QpOwogICAgIH0KLSAgICBhZGp1c3RSZWN0QWNjb3JkaW5nVG9NYXJnaW4oc3R5bGVD
b250ZXh0LmdldCgpLCB0aHVtYlJlY3QpOwotICAgIGd0a19yZW5kZXJfc2xpZGVyKHN0eWxlQ29u
dGV4dC5nZXQoKSwgY29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKS0+Y3IoKSwgdGh1bWJSZWN0Lngo
KSwgdGh1bWJSZWN0LnkoKSwgdGh1bWJSZWN0LndpZHRoKCksIHRodW1iUmVjdC5oZWlnaHQoKSwK
LSAgICAgICAgb3JpZW50YXRpb24gPT0gVmVydGljYWxTY3JvbGxiYXIgPyBHVEtfT1JJRU5UQVRJ
T05fVkVSVElDQUwgOiBHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCk7Ci19CiAKLXZvaWQgU2Ny
b2xsYmFyVGhlbWVHdGs6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgU2Ny
b2xsYmFyJiBzY3JvbGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QsIFNjcm9sbGJhclBhcnQgcGFy
dCkKKyAgICBpZiAob3BhY2l0eSAhPSAxKSB7CisgICAgICAgIGdyYXBoaWNzQ29udGV4dC5lbmRU
cmFuc3BhcmVuY3lMYXllcigpOworICAgICAgICBncmFwaGljc0NvbnRleHQucmVzdG9yZSgpOwor
ICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHBhaW50U3Rl
cHBlcihHdGtTdHlsZUNvbnRleHQqIHBhcmVudENvbnRleHQsIEdyYXBoaWNzQ29udGV4dCYgY29u
dGV4dCwgU2Nyb2xsYmFyJiBzY3JvbGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QsIFNjcm9sbGJh
clBhcnQgcGFydCkKIHsKICAgICBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiA9IHNj
cm9sbGJhci5vcmllbnRhdGlvbigpOwotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBwYXJl
bnRTdHlsZUNvbnRleHQgPSBnZXRPckNyZWF0ZVN0eWxlQ29udGV4dCgmc2Nyb2xsYmFyLCBTdHls
ZUNvbnRleHRNb2RlOjpQYWludCk7Ci0gICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IGNvbnRl
bnRzU3R5bGVDb250ZXh0ID0gY3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQocGFyZW50U3R5bGVDb250
ZXh0LmdldCgpLCAiY29udGVudHMiKTsKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5
bGVDb250ZXh0ID0gY3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQoY29udGVudHNTdHlsZUNvbnRleHQu
Z2V0KCksICJidXR0b24iKTsKKyAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250
ZXh0ID0gY3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQocGFyZW50Q29udGV4dCwgImJ1dHRvbiIpOwog
CiAgICAgdW5zaWduZWQgZmxhZ3MgPSAwOwogICAgIGlmICgoQmFja0J1dHRvblN0YXJ0UGFydCA9
PSBwYXJ0ICYmIHNjcm9sbGJhci5jdXJyZW50UG9zKCkpCkBAIC0zOTQsOSArNjA5LDcgQEAgdm9p
ZCBTY3JvbGxiYXJUaGVtZUd0azo6cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0
LCBTY3JvbGxiYXImIHNjcm9sbGIKICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoc3R5
bGVDb250ZXh0LmdldCgpLCAiYXJyb3ctc2NhbGluZyIsICZhcnJvd1NjYWxpbmcsIG51bGxwdHIp
OwogCiAgICAgZG91YmxlIGFycm93U2l6ZSA9IHN0ZDo6bWluKHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSkgKiBhcnJvd1NjYWxpbmc7Ci0gICAgRmxvYXRQb2ludCBhcnJvd1BvaW50KAotICAg
ICAgICByZWN0LngoKSArIChyZWN0LndpZHRoKCkgLSBhcnJvd1NpemUpIC8gMiwKLSAgICAgICAg
cmVjdC55KCkgKyAocmVjdC5oZWlnaHQoKSAtIGFycm93U2l6ZSkgLyAyKTsKKyAgICBGbG9hdFBv
aW50IGFycm93UG9pbnQocmVjdC54KCkgKyAocmVjdC53aWR0aCgpIC0gYXJyb3dTaXplKSAvIDIs
IHJlY3QueSgpICsgKHJlY3QuaGVpZ2h0KCkgLSBhcnJvd1NpemUpIC8gMik7CiAKICAgICBpZiAo
ZmxhZ3MgJiBHVEtfU1RBVEVfRkxBR19BQ1RJVkUpIHsKICAgICAgICAgZ2ludCBhcnJvd0Rpc3Bs
YWNlbWVudFgsIGFycm93RGlzcGxhY2VtZW50WTsKQEAgLTQxMywxNyArNjI2LDIwIEBAIHZvaWQg
U2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwg
U2Nyb2xsYmFyJiBzY3JvbGxiCiAgICAgZ3RrX3JlbmRlcl9hcnJvdyhzdHlsZUNvbnRleHQuZ2V0
KCksIGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGFuZ2xlLCBhcnJvd1BvaW50Lngo
KSwgYXJyb3dQb2ludC55KCksIGFycm93U2l6ZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGFkanVzdFJl
Y3RBY2NvcmRpbmdUb01hcmdpbihHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQsIEludFJlY3QmIHJl
Y3QpCit7CisgICAgR3RrQm9yZGVyIG1hcmdpbjsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRf
bWFyZ2luKGNvbnRleHQsIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdGF0ZShjb250ZXh0KSwgJm1h
cmdpbik7CisgICAgcmVjdC5tb3ZlKG1hcmdpbi5sZWZ0LCBtYXJnaW4udG9wKTsKKyAgICByZWN0
LmNvbnRyYWN0KG1hcmdpbi5sZWZ0ICsgbWFyZ2luLnJpZ2h0LCBtYXJnaW4udG9wICsgbWFyZ2lu
LmJvdHRvbSk7Cit9CisKIGJvb2wgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50KFNjcm9sbGJhciYg
c2Nyb2xsYmFyLCBHcmFwaGljc0NvbnRleHQmIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50UmVj
dCYgZGFtYWdlUmVjdCkKIHsKICAgICBpZiAoZ3JhcGhpY3NDb250ZXh0LnBhaW50aW5nRGlzYWJs
ZWQoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgZG91YmxlIG9wYWNpdHkgPSBzY3Jv
bGxiYXIuaG92ZXJlZFBhcnQoKSA9PSBOb1BhcnQgPyBzY3JvbGxiYXIub3BhY2l0eSgpIDogMTsK
LSAgICBpZiAoIW9wYWNpdHkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gQ2FjaGUg
YSBuZXcgR3RrU3R5bGVDb250ZXh0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBzY29wZS4KLSAg
ICBUZW1wb3JhcnlDaGFuZ2U8R1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+PiB0ZW1wU3R5bGVDb250
ZXh0KG1fY2FjaGVkU3R5bGVDb250ZXh0LCBnZXRPckNyZWF0ZVN0eWxlQ29udGV4dCgmc2Nyb2xs
YmFyLCBTdHlsZUNvbnRleHRNb2RlOjpQYWludCkpOworICAgIEdSZWZQdHI8R3RrU3R5bGVDb250
ZXh0PiBzdHlsZUNvbnRleHQgPSBjcmVhdGVTdHlsZUNvbnRleHQoJnNjcm9sbGJhcik7CiAKICAg
ICAvLyBDcmVhdGUgdGhlIFNjcm9sbGJhckNvbnRyb2xQYXJ0TWFzayBiYXNlZCBvbiB0aGUgZGFt
YWdlUmVjdAogICAgIFNjcm9sbGJhckNvbnRyb2xQYXJ0TWFzayBzY3JvbGxNYXNrID0gTm9QYXJ0
OwpAQCAtNDUxLDcgKzY2Nyw5IEBAIGJvb2wgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50KFNjcm9s
bGJhciYgc2Nyb2xsYmFyLCBHcmFwaGljc0NvbnRleHQmIGdyYXBoaWNzQ29uCiAgICAgaWYgKGRh
bWFnZVJlY3QuaW50ZXJzZWN0cyh0cmFja1BhaW50UmVjdCkpCiAgICAgICAgIHNjcm9sbE1hc2sg
fD0gVHJhY2tCR1BhcnQ7CiAKLSAgICBpZiAodHJvdWdoVW5kZXJTdGVwcGVycyhzY3JvbGxiYXIp
ICYmIChzY3JvbGxNYXNrICYgQmFja0J1dHRvblN0YXJ0UGFydAorICAgIGdib29sZWFuIHRyb3Vn
aFVuZGVyU3RlcHBlcnM7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKHN0eWxlQ29u
dGV4dC5nZXQoKSwgInRyb3VnaC11bmRlci1zdGVwcGVycyIsICZ0cm91Z2hVbmRlclN0ZXBwZXJz
LCBudWxscHRyKTsKKyAgICBpZiAodHJvdWdoVW5kZXJTdGVwcGVycyAmJiAoc2Nyb2xsTWFzayAm
IEJhY2tCdXR0b25TdGFydFBhcnQKICAgICAgICAgICAgIHx8IHNjcm9sbE1hc2sgJiBCYWNrQnV0
dG9uRW5kUGFydAogICAgICAgICAgICAgfHwgc2Nyb2xsTWFzayAmIEZvcndhcmRCdXR0b25TdGFy
dFBhcnQKICAgICAgICAgICAgIHx8IHNjcm9sbE1hc2sgJiBGb3J3YXJkQnV0dG9uRW5kUGFydCkp
CkBAIC00NjAsNjMgKzY3OCw3MSBAQCBib29sIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludChTY3Jv
bGxiYXImIHNjcm9sbGJhciwgR3JhcGhpY3NDb250ZXh0JiBncmFwaGljc0NvbgogICAgIEludFJl
Y3QgY3VycmVudFRodW1iUmVjdDsKICAgICBpZiAoaGFzVGh1bWIoc2Nyb2xsYmFyKSkgewogICAg
ICAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KHNjcm9sbGJhciwgZmFsc2UpOwotICAgICAg
ICBjdXJyZW50VGh1bWJSZWN0ID0gdGh1bWJSZWN0KHNjcm9sbGJhciwgdHJhY2spOworICAgICAg
ICBJbnRSZWN0IHRyYWNrUmVjdCA9IGNvbnN0cmFpblRyYWNrUmVjdFRvVHJhY2tQaWVjZXMoc2Ny
b2xsYmFyLCB0cmFjayk7CisgICAgICAgIGludCB0aHVtYkZhdDsKKyAgICAgICAgZ3RrX3N0eWxl
X2NvbnRleHRfZ2V0X3N0eWxlKHN0eWxlQ29udGV4dC5nZXQoKSwgInNsaWRlci13aWR0aCIsICZ0
aHVtYkZhdCwgbnVsbHB0cik7CisgICAgICAgIGlmIChzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgY3VycmVudFRodW1iUmVjdCA9IElu
dFJlY3QodHJhY2tSZWN0LngoKSArIHRodW1iUG9zaXRpb24oc2Nyb2xsYmFyKSwgdHJhY2tSZWN0
LnkoKSArICh0cmFja1JlY3QuaGVpZ2h0KCkgLSB0aHVtYkZhdCkgLyAyLCB0aHVtYkxlbmd0aChz
Y3JvbGxiYXIpLCB0aHVtYkZhdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN1cnJlbnRU
aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyAodHJhY2tSZWN0LndpZHRoKCkgLSB0
aHVtYkZhdCkgLyAyLCB0cmFja1JlY3QueSgpICsgdGh1bWJQb3NpdGlvbihzY3JvbGxiYXIpLCB0
aHVtYkZhdCwgdGh1bWJMZW5ndGgoc2Nyb2xsYmFyKSk7CiAgICAgICAgIGlmIChkYW1hZ2VSZWN0
LmludGVyc2VjdHMoY3VycmVudFRodW1iUmVjdCkpCiAgICAgICAgICAgICBzY3JvbGxNYXNrIHw9
IFRodW1iUGFydDsKICAgICB9CiAKLSAgICBpZiAobV91c2VzT3ZlcmxheVNjcm9sbGJhcnMpIHsK
LSAgICAgICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGNoZWNrIG9uY2UgMy4yMCBpcyByZWxlYXNl
ZC4KLSNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAxOSwgOCkKLSAgICAgICAgdW5zaWduZWQgZmxh
Z3MgPSAwOwotICAgICAgICBpZiAoc2Nyb2xsYmFyLmhvdmVyZWRQYXJ0KCkgIT0gTm9QYXJ0KQot
ICAgICAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7Ci0gICAgICAgIGlm
IChzY3JvbGxiYXIucHJlc3NlZFBhcnQoKSAhPSBOb1BhcnQpCi0gICAgICAgICAgICBmbGFncyB8
PSBHVEtfU1RBVEVfRkxBR19BQ1RJVkU7Ci0gICAgICAgIGRvdWJsZSBzdHlsZU9wYWNpdHk7Ci0g
ICAgICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShtX2NhY2hlZFN0eWxlQ29udGV4dC5n
ZXQoKSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKLSAgICAgICAgZ3RrX3N0
eWxlX2NvbnRleHRfZ2V0KG1fY2FjaGVkU3R5bGVDb250ZXh0LmdldCgpLCBndGtfc3R5bGVfY29u
dGV4dF9nZXRfc3RhdGUobV9jYWNoZWRTdHlsZUNvbnRleHQuZ2V0KCkpLCAib3BhY2l0eSIsICZz
dHlsZU9wYWNpdHksIG51bGxwdHIpOwotICAgICAgICBvcGFjaXR5ICo9IHN0eWxlT3BhY2l0eTsK
LSNlbHNlCi0gICAgICAgIG9wYWNpdHkgKj0gc2Nyb2xsYmFyLmhvdmVyZWRQYXJ0KCkgPT0gTm9Q
YXJ0ID8gMC40IDogMC43OwotI2VuZGlmCi0gICAgfQotICAgIGlmICghb3BhY2l0eSB8fCBzY3Jv
bGxNYXNrID09IE5vUGFydCkKKyAgICBpZiAoc2Nyb2xsTWFzayA9PSBOb1BhcnQpCiAgICAgICAg
IHJldHVybiB0cnVlOwogCi0gICAgaWYgKG9wYWNpdHkgIT0gMSkgewotICAgICAgICBncmFwaGlj
c0NvbnRleHQuc2F2ZSgpOwotICAgICAgICBncmFwaGljc0NvbnRleHQuY2xpcChkYW1hZ2VSZWN0
KTsKLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0LmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIob3BhY2l0
eSk7Ci0gICAgfQotCiAgICAgU2Nyb2xsYmFyQ29udHJvbFBhcnRNYXNrIGFsbEJ1dHRvbnMgPSBC
YWNrQnV0dG9uU3RhcnRQYXJ0IHwgQmFja0J1dHRvbkVuZFBhcnQgfCBGb3J3YXJkQnV0dG9uU3Rh
cnRQYXJ0IHwgRm9yd2FyZEJ1dHRvbkVuZFBhcnQ7CisKKyAgICAvLyBQYWludCB0aGUgdHJhY2sg
YmFja2dyb3VuZC4gSWYgdGhlIHRyb3VnaC11bmRlci1zdGVwcGVycyBwcm9wZXJ0eSBpcyB0cnVl
LCB0aGlzCisgICAgLy8gc2hvdWxkIGJlIHRoZSBmdWxsIHNpemUgb2YgdGhlIHNjcm9sbGJhciwg
YnV0IGlmIGlzIGZhbHNlLCBpdCBzaG91bGQgb25seSBiZSB0aGUKKyAgICAvLyB0cmFjayByZWN0
LgorICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiB0cm91Z2hTdHlsZUNvbnRleHQgPSBjcmVh
dGVDaGlsZFN0eWxlQ29udGV4dChzdHlsZUNvbnRleHQuZ2V0KCksICJ0cm91Z2giKTsKICAgICBp
ZiAoc2Nyb2xsTWFzayAmIFRyYWNrQkdQYXJ0IHx8IHNjcm9sbE1hc2sgJiBUaHVtYlBhcnQgfHwg
c2Nyb2xsTWFzayAmIGFsbEJ1dHRvbnMpIHsKLSAgICAgICAgcGFpbnRTY3JvbGxiYXJCYWNrZ3Jv
dW5kKGdyYXBoaWNzQ29udGV4dCwgc2Nyb2xsYmFyKTsKLSAgICAgICAgcGFpbnRUcmFja0JhY2tn
cm91bmQoZ3JhcGhpY3NDb250ZXh0LCBzY3JvbGxiYXIsIHRyYWNrUGFpbnRSZWN0KTsKKyAgICAg
ICAgSW50UmVjdCBmdWxsU2Nyb2xsYmFyUmVjdCA9IHRyYWNrUGFpbnRSZWN0OworICAgICAgICBp
ZiAodHJvdWdoVW5kZXJTdGVwcGVycykKKyAgICAgICAgICAgIGZ1bGxTY3JvbGxiYXJSZWN0ID0g
c2Nyb2xsYmFyLmZyYW1lUmVjdCgpOworCisgICAgICAgIEludFJlY3QgYWRqdXN0ZWRSZWN0ID0g
ZnVsbFNjcm9sbGJhclJlY3Q7CisgICAgICAgIGFkanVzdFJlY3RBY2NvcmRpbmdUb01hcmdpbihz
dHlsZUNvbnRleHQuZ2V0KCksIGFkanVzdGVkUmVjdCk7CisgICAgICAgIGd0a19yZW5kZXJfYmFj
a2dyb3VuZChzdHlsZUNvbnRleHQuZ2V0KCksIGdyYXBoaWNzQ29udGV4dC5wbGF0Zm9ybUNvbnRl
eHQoKS0+Y3IoKSwgYWRqdXN0ZWRSZWN0LngoKSwgYWRqdXN0ZWRSZWN0LnkoKSwgYWRqdXN0ZWRS
ZWN0LndpZHRoKCksIGFkanVzdGVkUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIGd0a19yZW5kZXJf
ZnJhbWUoc3R5bGVDb250ZXh0LmdldCgpLCBncmFwaGljc0NvbnRleHQucGxhdGZvcm1Db250ZXh0
KCktPmNyKCksIGFkanVzdGVkUmVjdC54KCksIGFkanVzdGVkUmVjdC55KCksIGFkanVzdGVkUmVj
dC53aWR0aCgpLCBhZGp1c3RlZFJlY3QuaGVpZ2h0KCkpOworCisgICAgICAgIGFkanVzdGVkUmVj
dCA9IGZ1bGxTY3JvbGxiYXJSZWN0OworICAgICAgICBhZGp1c3RSZWN0QWNjb3JkaW5nVG9NYXJn
aW4odHJvdWdoU3R5bGVDb250ZXh0LmdldCgpLCBhZGp1c3RlZFJlY3QpOworICAgICAgICBndGtf
cmVuZGVyX2JhY2tncm91bmQodHJvdWdoU3R5bGVDb250ZXh0LmdldCgpLCBncmFwaGljc0NvbnRl
eHQucGxhdGZvcm1Db250ZXh0KCktPmNyKCksIGFkanVzdGVkUmVjdC54KCksIGFkanVzdGVkUmVj
dC55KCksIGFkanVzdGVkUmVjdC53aWR0aCgpLCBhZGp1c3RlZFJlY3QuaGVpZ2h0KCkpOworICAg
ICAgICBndGtfcmVuZGVyX2ZyYW1lKHRyb3VnaFN0eWxlQ29udGV4dC5nZXQoKSwgZ3JhcGhpY3ND
b250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLT5jcigpLCBhZGp1c3RlZFJlY3QueCgpLCBhZGp1c3Rl
ZFJlY3QueSgpLCBhZGp1c3RlZFJlY3Qud2lkdGgoKSwgYWRqdXN0ZWRSZWN0LmhlaWdodCgpKTsK
ICAgICB9CiAKICAgICAvLyBQYWludCB0aGUgYmFjayBhbmQgZm9yd2FyZCBidXR0b25zLgogICAg
IGlmIChzY3JvbGxNYXNrICYgQmFja0J1dHRvblN0YXJ0UGFydCkKLSAgICAgICAgcGFpbnRCdXR0
b24oZ3JhcGhpY3NDb250ZXh0LCBzY3JvbGxiYXIsIGJhY2tCdXR0b25TdGFydFBhaW50UmVjdCwg
QmFja0J1dHRvblN0YXJ0UGFydCk7CisgICAgICAgIHBhaW50U3RlcHBlcihzdHlsZUNvbnRleHQu
Z2V0KCksIGdyYXBoaWNzQ29udGV4dCwgc2Nyb2xsYmFyLCBiYWNrQnV0dG9uU3RhcnRQYWludFJl
Y3QsIEJhY2tCdXR0b25TdGFydFBhcnQpOwogICAgIGlmIChzY3JvbGxNYXNrICYgQmFja0J1dHRv
bkVuZFBhcnQpCi0gICAgICAgIHBhaW50QnV0dG9uKGdyYXBoaWNzQ29udGV4dCwgc2Nyb2xsYmFy
LCBiYWNrQnV0dG9uRW5kUGFpbnRSZWN0LCBCYWNrQnV0dG9uRW5kUGFydCk7CisgICAgICAgIHBh
aW50U3RlcHBlcihzdHlsZUNvbnRleHQuZ2V0KCksIGdyYXBoaWNzQ29udGV4dCwgc2Nyb2xsYmFy
LCBiYWNrQnV0dG9uRW5kUGFpbnRSZWN0LCBCYWNrQnV0dG9uRW5kUGFydCk7CiAgICAgaWYgKHNj
cm9sbE1hc2sgJiBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0KQotICAgICAgICBwYWludEJ1dHRvbihn
cmFwaGljc0NvbnRleHQsIHNjcm9sbGJhciwgZm9yd2FyZEJ1dHRvblN0YXJ0UGFpbnRSZWN0LCBG
b3J3YXJkQnV0dG9uU3RhcnRQYXJ0KTsKKyAgICAgICAgcGFpbnRTdGVwcGVyKHN0eWxlQ29udGV4
dC5nZXQoKSwgZ3JhcGhpY3NDb250ZXh0LCBzY3JvbGxiYXIsIGZvcndhcmRCdXR0b25TdGFydFBh
aW50UmVjdCwgRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCk7CiAgICAgaWYgKHNjcm9sbE1hc2sgJiBG
b3J3YXJkQnV0dG9uRW5kUGFydCkKLSAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0
LCBzY3JvbGxiYXIsIGZvcndhcmRCdXR0b25FbmRQYWludFJlY3QsIEZvcndhcmRCdXR0b25FbmRQ
YXJ0KTsKKyAgICAgICAgcGFpbnRTdGVwcGVyKHN0eWxlQ29udGV4dC5nZXQoKSwgZ3JhcGhpY3ND
b250ZXh0LCBzY3JvbGxiYXIsIGZvcndhcmRCdXR0b25FbmRQYWludFJlY3QsIEZvcndhcmRCdXR0
b25FbmRQYXJ0KTsKIAogICAgIC8vIFBhaW50IHRoZSB0aHVtYi4KLSAgICBpZiAoc2Nyb2xsTWFz
ayAmIFRodW1iUGFydCkKLSAgICAgICAgcGFpbnRUaHVtYihncmFwaGljc0NvbnRleHQsIHNjcm9s
bGJhciwgY3VycmVudFRodW1iUmVjdCk7CisgICAgaWYgKHNjcm9sbE1hc2sgJiBUaHVtYlBhcnQp
IHsKKyAgICAgICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IHRodW1iU3R5bGVDb250ZXh0ID0g
Y3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQodHJvdWdoU3R5bGVDb250ZXh0LmdldCgpLCAic2xpZGVy
Iik7CisgICAgICAgIHVuc2lnbmVkIGZsYWdzID0gMDsKKyAgICAgICAgaWYgKHNjcm9sbGJhci5w
cmVzc2VkUGFydCgpID09IFRodW1iUGFydCkKKyAgICAgICAgICAgIGZsYWdzIHw9IEdUS19TVEFU
RV9GTEFHX0FDVElWRTsKKyAgICAgICAgaWYgKHNjcm9sbGJhci5ob3ZlcmVkUGFydCgpID09IFRo
dW1iUGFydCkKKyAgICAgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOwor
ICAgICAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUodGh1bWJTdHlsZUNvbnRleHQuZ2V0
KCksIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CiAKLSAgICBpZiAob3BhY2l0
eSAhPSAxKSB7Ci0gICAgICAgIGdyYXBoaWNzQ29udGV4dC5lbmRUcmFuc3BhcmVuY3lMYXllcigp
OwotICAgICAgICBncmFwaGljc0NvbnRleHQucmVzdG9yZSgpOworICAgICAgICBJbnRSZWN0IHRo
dW1iUmVjdChjdXJyZW50VGh1bWJSZWN0KTsKKyAgICAgICAgYWRqdXN0UmVjdEFjY29yZGluZ1Rv
TWFyZ2luKHRodW1iU3R5bGVDb250ZXh0LmdldCgpLCB0aHVtYlJlY3QpOworICAgICAgICBndGtf
cmVuZGVyX3NsaWRlcih0aHVtYlN0eWxlQ29udGV4dC5nZXQoKSwgZ3JhcGhpY3NDb250ZXh0LnBs
YXRmb3JtQ29udGV4dCgpLT5jcigpLCB0aHVtYlJlY3QueCgpLCB0aHVtYlJlY3QueSgpLCB0aHVt
YlJlY3Qud2lkdGgoKSwgdGh1bWJSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgc2Nyb2xsYmFy
Lm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIgPyBHVEtfT1JJRU5UQVRJT05fVkVS
VElDQUwgOiBHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCk7CiAgICAgfQogCiAgICAgcmV0dXJu
IHRydWU7CiB9CisjZW5kaWYgLy8gR1RLX0NIRUNLX1ZFUlNJT04oMywgMjAsIDApCiAKIFNjcm9s
bGJhckJ1dHRvblByZXNzQWN0aW9uIFNjcm9sbGJhclRoZW1lR3RrOjpoYW5kbGVNb3VzZVByZXNz
RXZlbnQoU2Nyb2xsYmFyJiwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCwgU2Nyb2xs
YmFyUGFydCBwcmVzc2VkUGFydCkKIHsKQEAgLTUzOSwxOTcgKzc2NSw5MyBAQCBTY3JvbGxiYXJC
dXR0b25QcmVzc0FjdGlvbiBTY3JvbGxiYXJUaGVtZUd0azo6aGFuZGxlTW91c2VQcmVzc0V2ZW50
KFNjcm9sbGJhciYsCiAgICAgcmV0dXJuIFNjcm9sbGJhckJ1dHRvblByZXNzQWN0aW9uOjpOb25l
OwogfQogCi1pbnQgU2Nyb2xsYmFyVGhlbWVHdGs6OnNjcm9sbGJhclRoaWNrbmVzcyhHdGtTdHls
ZUNvbnRleHQqIHN0eWxlQ29udGV4dCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24p
Ci17Ci0gICAgR3RrQm9yZGVyIHRyb3VnaEJvcmRlcjsKLSNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigz
LCAxOSwgMTEpCi0gICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IGNvbnRlbnRzU3R5bGVDb250
ZXh0ID0gY3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQoc3R5bGVDb250ZXh0LCAiY29udGVudHMiKTsK
LSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gdHJvdWdoU3R5bGVDb250ZXh0ID0gY3JlYXRl
Q2hpbGRTdHlsZUNvbnRleHQoY29udGVudHNTdHlsZUNvbnRleHQuZ2V0KCksICJ0cm91Z2giKTsK
LSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc2xpZGVyU3R5bGVDb250ZXh0ID0gY3JlYXRl
Q2hpbGRTdHlsZUNvbnRleHQodHJvdWdoU3R5bGVDb250ZXh0LmdldCgpLCAic2xpZGVyIik7Ci0g
ICAgaW50IHRodW1iRmF0ID0gdGh1bWJGYXRuZXNzKHNsaWRlclN0eWxlQ29udGV4dC5nZXQoKSwg
b3JpZW50YXRpb24pOwotICAgIGdldFRyb3VnaEJvcmRlcih0cm91Z2hTdHlsZUNvbnRleHQuZ2V0
KCksICZ0cm91Z2hCb3JkZXIpOwotICAgIC8vIFNpbmNlIEdUSysgMy4xOSB0aGUgc2Nyb2xsYmFy
IGNhbiBoYXZlIGl0cyBvd24gYm9yZGVyIHRvby4KLSAgICBHdGtCb3JkZXIgYm9yZGVyOwotICAg
IGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoc3R5bGVDb250ZXh0LCBndGtfc3R5bGVfY29u
dGV4dF9nZXRfc3RhdGUoc3R5bGVDb250ZXh0KSwgJmJvcmRlcik7Ci0gICAgdHJvdWdoQm9yZGVy
LmxlZnQgKz0gYm9yZGVyLmxlZnQ7Ci0gICAgdHJvdWdoQm9yZGVyLnJpZ2h0ICs9IGJvcmRlci5y
aWdodDsKLSAgICB0cm91Z2hCb3JkZXIudG9wICs9IGJvcmRlci50b3A7Ci0gICAgdHJvdWdoQm9y
ZGVyLmJvdHRvbSArPSBib3JkZXIuYm90dG9tOwotI2Vsc2UKLSAgICBpbnQgdGh1bWJGYXQgPSB0
aHVtYkZhdG5lc3Moc3R5bGVDb250ZXh0LCBvcmllbnRhdGlvbik7Ci0gICAgZ2V0VHJvdWdoQm9y
ZGVyKHN0eWxlQ29udGV4dCwgJnRyb3VnaEJvcmRlcik7Ci0jZW5kaWYKLSAgICBpZiAob3JpZW50
YXRpb24gPT0gVmVydGljYWxTY3JvbGxiYXIpCi0gICAgICAgIHJldHVybiB0aHVtYkZhdCArIHRy
b3VnaEJvcmRlci5sZWZ0ICsgdHJvdWdoQm9yZGVyLnJpZ2h0OwotICAgIHJldHVybiB0aHVtYkZh
dCArIHRyb3VnaEJvcmRlci50b3AgKyB0cm91Z2hCb3JkZXIuYm90dG9tOwotfQotCisjaWYgR1RL
X0NIRUNLX1ZFUlNJT04oMywgMjAsIDApCiBpbnQgU2Nyb2xsYmFyVGhlbWVHdGs6OnNjcm9sbGJh
clRoaWNrbmVzcyhTY3JvbGxiYXJDb250cm9sU2l6ZSkKIHsKLSAgICBHUmVmUHRyPEd0a1N0eWxl
Q29udGV4dD4gc3R5bGVDb250ZXh0ID0gZ2V0T3JDcmVhdGVTdHlsZUNvbnRleHQoKTsKLSAgICBy
ZXR1cm4gc2Nyb2xsYmFyVGhpY2tuZXNzKHN0eWxlQ29udGV4dC5nZXQoKSk7CisgICAgUmVuZGVy
VGhlbWVHYWRnZXQ6OkluZm8gaW5mbyA9IHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OlNjcm9s
bGJhciwgInNjcm9sbGJhciIsIEdUS19TVEFURV9GTEFHX1BSRUxJR0hULCB7ICJ2ZXJ0aWNhbCIs
ICJyaWdodCIsICJob3ZlcmluZyIgfSB9OworICAgIGlmIChtX3VzZXNPdmVybGF5U2Nyb2xsYmFy
cykKKyAgICAgICAgaW5mby5jbGFzc0xpc3QuYXBwZW5kKCJvdmVybGF5LWluZGljYXRvciIpOwor
ICAgIGF1dG8gc2Nyb2xsYmFyR2FkZ2V0ID0gUmVuZGVyVGhlbWVHYWRnZXQ6OmNyZWF0ZShpbmZv
KTsKKyAgICBpbmZvLnR5cGUgPSBSZW5kZXJUaGVtZUdhZGdldDo6VHlwZTo6R2VuZXJpYzsKKyAg
ICBpbmZvLm5hbWUgPSAiY29udGVudHMiOworICAgIGluZm8uc3RhdGUgPSBHVEtfU1RBVEVfRkxB
R19OT1JNQUw7CisgICAgaW5mby5jbGFzc0xpc3QuY2xlYXIoKTsKKyAgICBWZWN0b3I8UmVuZGVy
VGhlbWVHYWRnZXQ6OkluZm8+IGNoaWxkcmVuOworICAgIGF1dG8gc3RlcHBlcnMgPSBzdGF0aWNf
Y2FzdDxSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldCo+KHNjcm9sbGJhckdhZGdldC5nZXQoKSkt
PnN0ZXBwZXJzKCk7CisgICAgaWYgKHN0ZXBwZXJzLmNvbnRhaW5zKFJlbmRlclRoZW1lU2Nyb2xs
YmFyR2FkZ2V0OjpTdGVwcGVyczo6QmFja3dhcmQpKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQo
eyBSZW5kZXJUaGVtZUdhZGdldDo6VHlwZTo6R2VuZXJpYywgImJ1dHRvbiIsIEdUS19TVEFURV9G
TEFHX05PUk1BTCwgeyAidXAiIH0gfSk7CisgICAgaWYgKHN0ZXBwZXJzLmNvbnRhaW5zKFJlbmRl
clRoZW1lU2Nyb2xsYmFyR2FkZ2V0OjpTdGVwcGVyczo6U2Vjb25kYXJ5Rm9yd2FyZCkpCisgICAg
ICAgIGNoaWxkcmVuLmFwcGVuZCh7IFJlbmRlclRoZW1lR2FkZ2V0OjpUeXBlOjpHZW5lcmljLCAi
YnV0dG9uIiwgR1RLX1NUQVRFX0ZMQUdfTk9STUFMLCB7ICJkb3duIiB9IH0pOworICAgIHVuc2ln
bmVkIHRyb3VnaFBvc2l0b24gPSBjaGlsZHJlbi5zaXplKCk7CisgICAgY2hpbGRyZW4uYXBwZW5k
KHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVyaWMsICJ0cm91Z2giLCBHVEtfU1RBVEVf
RkxBR19QUkVMSUdIVCwgeyB9IH0pOworICAgIGlmIChzdGVwcGVycy5jb250YWlucyhSZW5kZXJU
aGVtZVNjcm9sbGJhckdhZGdldDo6U3RlcHBlcnM6OlNlY29uZGFyeUJhY2t3YXJkKSkKKyAgICAg
ICAgY2hpbGRyZW4uYXBwZW5kKHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OkdlbmVyaWMsICJi
dXR0b24iLCBHVEtfU1RBVEVfRkxBR19OT1JNQUwsIHsgInVwIiB9IH0pOworICAgIGlmIChzdGVw
cGVycy5jb250YWlucyhSZW5kZXJUaGVtZVNjcm9sbGJhckdhZGdldDo6U3RlcHBlcnM6OkZvcndh
cmQpKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoeyBSZW5kZXJUaGVtZUdhZGdldDo6VHlwZTo6
R2VuZXJpYywgImJ1dHRvbiIsIEdUS19TVEFURV9GTEFHX05PUk1BTCwgeyAiZG93biIgfSB9KTsK
KyAgICBhdXRvIGNvbnRlbnRzR2FkZ2V0ID0gc3RkOjptYWtlX3VuaXF1ZTxSZW5kZXJUaGVtZUJv
eEdhZGdldD4oaW5mbywgY2hpbGRyZW4sIHNjcm9sbGJhckdhZGdldC5nZXQoKSk7CisgICAgaW5m
by5uYW1lID0gInNsaWRlciI7CisgICAgYXV0byBzbGlkZXJHYWRnZXQgPSBSZW5kZXJUaGVtZUdh
ZGdldDo6Y3JlYXRlKGluZm8sIGNvbnRlbnRzR2FkZ2V0LT5jaGlsZCh0cm91Z2hQb3NpdG9uKSk7
CisgICAgSW50U2l6ZSBwcmVmZXJyZWRTaXplID0gc2Nyb2xsYmFyR2FkZ2V0LT5wcmVmZXJyZWRT
aXplKCk7CisgICAgcHJlZmVycmVkU2l6ZSArPSBjb250ZW50c0dhZGdldC0+cHJlZmVycmVkU2l6
ZSgpOworICAgIHByZWZlcnJlZFNpemUgKz0gc2xpZGVyR2FkZ2V0LT5wcmVmZXJyZWRTaXplKCk7
CisKKyAgICByZXR1cm4gcHJlZmVycmVkU2l6ZS53aWR0aCgpOwogfQotCi1JbnRTaXplIFNjcm9s
bGJhclRoZW1lR3RrOjpidXR0b25TaXplKFNjcm9sbGJhciYgc2Nyb2xsYmFyLCBTY3JvbGxiYXJQ
YXJ0IGJ1dHRvblBhcnQpCi17Ci0gICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IHN0eWxlQ29u
dGV4dCA9IGdldE9yQ3JlYXRlU3R5bGVDb250ZXh0KCZzY3JvbGxiYXIpOwotI2lmIEdUS19DSEVD
S19WRVJTSU9OKDMsIDE5LCAxMSkKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gY29udGVu
dHNTdHlsZUNvbnRleHQgPSBjcmVhdGVDaGlsZFN0eWxlQ29udGV4dChzdHlsZUNvbnRleHQuZ2V0
KCksICJjb250ZW50cyIpOwotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBidXR0b25TdHls
ZUNvbnRleHQgPSBjcmVhdGVDaGlsZFN0eWxlQ29udGV4dChjb250ZW50c1N0eWxlQ29udGV4dC5n
ZXQoKSwgImJ1dHRvbiIpOwotICAgIHN3aXRjaCAoYnV0dG9uUGFydCkgewotICAgIGNhc2UgQmFj
a0J1dHRvblN0YXJ0UGFydDoKLSAgICBjYXNlIEZvcndhcmRCdXR0b25TdGFydFBhcnQ6Ci0gICAg
ICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhidXR0b25TdHlsZUNvbnRleHQuZ2V0KCks
ICJ1cCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJhY2tCdXR0b25FbmRQYXJ0OgotICAg
IGNhc2UgRm9yd2FyZEJ1dHRvbkVuZFBhcnQ6Ci0gICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2Fk
ZF9jbGFzcyhidXR0b25TdHlsZUNvbnRleHQuZ2V0KCksICJkb3duIik7Ci0gICAgICAgIGJyZWFr
OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLSAg
ICBpbnQgbWluV2lkdGggPSAwLCBtaW5IZWlnaHQgPSAwOwotICAgIGd0a19zdHlsZV9jb250ZXh0
X2dldChidXR0b25TdHlsZUNvbnRleHQuZ2V0KCksIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdGF0
ZShidXR0b25TdHlsZUNvbnRleHQuZ2V0KCkpLAotICAgICAgICAibWluLXdpZHRoIiwgJm1pbldp
ZHRoLCAibWluLWhlaWdodCIsICZtaW5IZWlnaHQsIG51bGxwdHIpOwotICAgIHJldHVybiBJbnRT
aXplKG1pbldpZHRoLCBtaW5IZWlnaHQpOwogI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oYnV0dG9u
UGFydCk7Ci0gICAgaW50IHN0ZXBwZXJTaXplOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9z
dHlsZShzdHlsZUNvbnRleHQuZ2V0KCksICJzdGVwcGVyLXNpemUiLCAmc3RlcHBlclNpemUsIG51
bGxwdHIpOwotICAgIGlmIChzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9s
bGJhcikKLSAgICAgICAgcmV0dXJuIEludFNpemUodGh1bWJGYXRuZXNzKHNjcm9sbGJhciksIHN0
ZXBwZXJTaXplKTsKLQotICAgIC8vIEhvcml6b250YWxTY3JvbGxiYXIKLSAgICByZXR1cm4gSW50
U2l6ZShzdGVwcGVyU2l6ZSwgdGh1bWJGYXRuZXNzKHNjcm9sbGJhcikpOwotI2VuZGlmCi19Ci0K
LWludCBTY3JvbGxiYXJUaGVtZUd0azo6c3RlcHBlclNpemUoU2Nyb2xsYmFyJiBzY3JvbGxiYXIs
IFNjcm9sbGJhclBhcnQgYnV0dG9uUGFydCkKK2ludCBTY3JvbGxiYXJUaGVtZUd0azo6c2Nyb2xs
YmFyVGhpY2tuZXNzKFNjcm9sbGJhckNvbnRyb2xTaXplKQogewotICAgIEludFNpemUgc2l6ZSA9
IGJ1dHRvblNpemUoc2Nyb2xsYmFyLCBidXR0b25QYXJ0KTsKLSAgICByZXR1cm4gc2Nyb2xsYmFy
Lm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIgPyBzaXplLmhlaWdodCgpIDogc2l6
ZS53aWR0aCgpOworICAgIGludCB0aHVtYkZhdCwgdHJvdWdoQm9yZGVyV2lkdGg7CisgICAgZ3Rr
X3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNyZWF0ZVN0eWxlQ29udGV4dCgpLmdldCgpLCAic2xp
ZGVyLXdpZHRoIiwgJnRodW1iRmF0LCAidHJvdWdoLWJvcmRlciIsICZ0cm91Z2hCb3JkZXJXaWR0
aCwgbnVsbHB0cik7CisgICAgcmV0dXJuIHRodW1iRmF0ICsgMiAqIHRyb3VnaEJvcmRlcldpZHRo
OwogfQorI2VuZGlmIC8vIEdUS19DSEVDS19WRVJTSU9OKDMsIDIwLCAwKQogCi12b2lkIFNjcm9s
bGJhclRoZW1lR3RrOjpnZXRTdGVwcGVyU3BhY2luZyhTY3JvbGxiYXImIHNjcm9sbGJhciwgU2Ny
b2xsYmFyUGFydCBidXR0b25QYXJ0LCBHdGtCb3JkZXIqIG1hcmdpbikKKyNpZiBHVEtfQ0hFQ0tf
VkVSU0lPTigzLCAyMCwgMCkKK2ludCBTY3JvbGxiYXJUaGVtZUd0azo6bWluaW11bVRodW1iTGVu
Z3RoKFNjcm9sbGJhciYgc2Nyb2xsYmFyKQogewotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0
PiBzdHlsZUNvbnRleHQgPSBnZXRPckNyZWF0ZVN0eWxlQ29udGV4dCgmc2Nyb2xsYmFyKTsKLSNp
ZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAxOSwgMTEpCi0gICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRl
eHQ+IGNvbnRlbnRzU3R5bGVDb250ZXh0ID0gY3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQoc3R5bGVD
b250ZXh0LmdldCgpLCAiY29udGVudHMiKTsKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4g
YnV0dG9uU3R5bGVDb250ZXh0ID0gY3JlYXRlQ2hpbGRTdHlsZUNvbnRleHQoY29udGVudHNTdHls
ZUNvbnRleHQuZ2V0KCksICJidXR0b24iKTsKLSAgICBzd2l0Y2ggKGJ1dHRvblBhcnQpIHsKLSAg
ICBjYXNlIEJhY2tCdXR0b25TdGFydFBhcnQ6Ci0gICAgY2FzZSBGb3J3YXJkQnV0dG9uU3RhcnRQ
YXJ0OgotICAgICAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoYnV0dG9uU3R5bGVDb250
ZXh0LmdldCgpLCAidXAiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCYWNrQnV0dG9uRW5k
UGFydDoKLSAgICBjYXNlIEZvcndhcmRCdXR0b25FbmRQYXJ0OgotICAgICAgICBndGtfc3R5bGVf
Y29udGV4dF9hZGRfY2xhc3MoYnV0dG9uU3R5bGVDb250ZXh0LmdldCgpLCAiZG93biIpOwotICAg
ICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICB9Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X21hcmdpbihidXR0b25TdHlsZUNvbnRl
eHQuZ2V0KCksIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdGF0ZShidXR0b25TdHlsZUNvbnRleHQu
Z2V0KCkpLCBtYXJnaW4pOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oYnV0dG9uUGFydCk7Ci0g
ICAgaW50IHN0ZXBwZXJTcGFjaW5nID0gMDsKLSAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5
bGUoc3R5bGVDb250ZXh0LmdldCgpLCAic3RlcHBlci1zcGFjaW5nIiwgJnN0ZXBwZXJTcGFjaW5n
LCBudWxscHRyKTsKLSAgICBtYXJnaW4tPmxlZnQgPSBtYXJnaW4tPnJpZ2h0ID0gbWFyZ2luLT50
b3AgPSBtYXJnaW4tPmJvdHRvbSA9IHN0ZXBwZXJTcGFjaW5nOwotI2VuZGlmCisgICAgUmVuZGVy
VGhlbWVHYWRnZXQ6OkluZm8gaW5mbyA9IHsgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6OlNjcm9s
bGJhciwgInNjcm9sbGJhciIsIEdUS19TVEFURV9GTEFHX1BSRUxJR0hULCB7ICJ2ZXJ0aWNhbCIs
ICJyaWdodCIsICJob3ZlcmluZyIgfSB9OworICAgIGlmIChtX3VzZXNPdmVybGF5U2Nyb2xsYmFy
cykKKyAgICAgICAgaW5mby5jbGFzc0xpc3QuYXBwZW5kKCJvdmVybGF5LWluZGljYXRvciIpOwor
ICAgIGF1dG8gc2Nyb2xsYmFyR2FkZ2V0ID0gUmVuZGVyVGhlbWVHYWRnZXQ6OmNyZWF0ZShpbmZv
KTsKKyAgICBpbmZvLnR5cGUgPSBSZW5kZXJUaGVtZUdhZGdldDo6VHlwZTo6R2VuZXJpYzsKKyAg
ICBpbmZvLm5hbWUgPSAiY29udGVudHMiOworICAgIGluZm8uc3RhdGUgPSBHVEtfU1RBVEVfRkxB
R19OT1JNQUw7CisgICAgaW5mby5jbGFzc0xpc3QuY2xlYXIoKTsKKyAgICBWZWN0b3I8UmVuZGVy
VGhlbWVHYWRnZXQ6OkluZm8+IGNoaWxkcmVuID0ge3sgUmVuZGVyVGhlbWVHYWRnZXQ6OlR5cGU6
OkdlbmVyaWMsICJ0cm91Z2giLCBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVCwgeyB9IH0gfTsKKyAg
ICBhdXRvIGNvbnRlbnRzR2FkZ2V0ID0gc3RkOjptYWtlX3VuaXF1ZTxSZW5kZXJUaGVtZUJveEdh
ZGdldD4oaW5mbywgY2hpbGRyZW4sIHNjcm9sbGJhckdhZGdldC5nZXQoKSk7CisgICAgaW5mby5u
YW1lID0gInNsaWRlciI7CisgICAgSW50U2l6ZSBtaW5TaXplID0gUmVuZGVyVGhlbWVHYWRnZXQ6
OmNyZWF0ZShpbmZvLCBjb250ZW50c0dhZGdldC0+Y2hpbGQoMCkpLT5taW5pbXVtU2l6ZSgpOwor
ICAgIHJldHVybiBzY3JvbGxiYXIub3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9sbGJhciA/
IG1pblNpemUuaGVpZ2h0KCkgOiBtaW5TaXplLndpZHRoKCk7CiB9Ci0KLWJvb2wgU2Nyb2xsYmFy
VGhlbWVHdGs6OnRyb3VnaFVuZGVyU3RlcHBlcnMoU2Nyb2xsYmFyJiBzY3JvbGxiYXIpCi17Ci0j
aWYgIUdUS19DSEVDS19WRVJTSU9OKDMsIDE5LCAxMSkKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29u
dGV4dD4gc3R5bGVDb250ZXh0ID0gZ2V0T3JDcmVhdGVTdHlsZUNvbnRleHQoJnNjcm9sbGJhcik7
Ci0gICAgZ2Jvb2xlYW4gdW5kZXJTdGVwcGVyczsKLSAgICBndGtfc3R5bGVfY29udGV4dF9nZXRf
c3R5bGUoc3R5bGVDb250ZXh0LmdldCgpLCAidHJvdWdoLXVuZGVyLXN0ZXBwZXJzIiwgJnVuZGVy
U3RlcHBlcnMsIG51bGxwdHIpOwotICAgIHJldHVybiB1bmRlclN0ZXBwZXJzOwogI2Vsc2UKLSAg
ICBVTlVTRURfUEFSQU0oc2Nyb2xsYmFyKTsKLSAgICAvLyBUaGlzIGlzIG5vdyBpZ25vcmVkIGJ5
IEdUSysgYW5kIGNvbnNpZGVyZWQgYWx3YXlzIHRydWUuCi0gICAgcmV0dXJuIHRydWU7Ci0jZW5k
aWYKLX0KIGludCBTY3JvbGxiYXJUaGVtZUd0azo6bWluaW11bVRodW1iTGVuZ3RoKFNjcm9sbGJh
ciYgc2Nyb2xsYmFyKQogewotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBzdHlsZUNvbnRl
eHQgPSBnZXRPckNyZWF0ZVN0eWxlQ29udGV4dCgmc2Nyb2xsYmFyKTsKICAgICBpbnQgbWluVGh1
bWJMZW5ndGggPSAwOwotI2lmIEdUS19DSEVDS19WRVJTSU9OKDMsIDE5LCAxMSkKLSAgICBHUmVm
UHRyPEd0a1N0eWxlQ29udGV4dD4gY29udGVudHNTdHlsZUNvbnRleHQgPSBjcmVhdGVDaGlsZFN0
eWxlQ29udGV4dChzdHlsZUNvbnRleHQuZ2V0KCksICJjb250ZW50cyIpOwotICAgIEdSZWZQdHI8
R3RrU3R5bGVDb250ZXh0PiB0cm91Z2hTdHlsZUNvbnRleHQgPSBjcmVhdGVDaGlsZFN0eWxlQ29u
dGV4dChjb250ZW50c1N0eWxlQ29udGV4dC5nZXQoKSwgInRyb3VnaCIpOwotICAgIEdSZWZQdHI8
R3RrU3R5bGVDb250ZXh0PiBzbGlkZXJTdHlsZUNvbnRleHQgPSBjcmVhdGVDaGlsZFN0eWxlQ29u
dGV4dCh0cm91Z2hTdHlsZUNvbnRleHQuZ2V0KCksICJzbGlkZXIiKTsKLSAgICBndGtfc3R5bGVf
Y29udGV4dF9nZXQoc2xpZGVyU3R5bGVDb250ZXh0LmdldCgpLCBndGtfc3R5bGVfY29udGV4dF9n
ZXRfc3RhdGUoc2xpZGVyU3R5bGVDb250ZXh0LmdldCgpKSwKLSAgICAgICAgc2Nyb2xsYmFyLm9y
aWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIgPyAibWluLWhlaWdodCIgOiAibWluLXdp
ZHRoIiwgJm1pblRodW1iTGVuZ3RoLCBudWxscHRyKTsKLSNlbHNlCi0gICAgZ3RrX3N0eWxlX2Nv
bnRleHRfZ2V0X3N0eWxlKHN0eWxlQ29udGV4dC5nZXQoKSwgIm1pbi1zbGlkZXItbGVuZ3RoIiwg
Jm1pblRodW1iTGVuZ3RoLCBudWxscHRyKTsKLSNlbmRpZgorICAgIGd0a19zdHlsZV9jb250ZXh0
X2dldF9zdHlsZShjcmVhdGVTdHlsZUNvbnRleHQoJnNjcm9sbGJhcikuZ2V0KCksICJtaW4tc2xp
ZGVyLWxlbmd0aCIsICZtaW5UaHVtYkxlbmd0aCwgbnVsbHB0cik7CiAgICAgcmV0dXJuIG1pblRo
dW1iTGVuZ3RoOwogfQorI2VuZGlmCiAKLWludCBTY3JvbGxiYXJUaGVtZUd0azo6dGh1bWJGYXRu
ZXNzKEd0a1N0eWxlQ29udGV4dCogc3R5bGVDb250ZXh0LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBv
cmllbnRhdGlvbikKKyNlbHNlIC8vIEdUS19BUElfVkVSU0lPTl8yCitib29sIFNjcm9sbGJhclRo
ZW1lR3RrOjpoYXNUaHVtYihTY3JvbGxiYXImKQogewotICAgIGludCB0aHVtYkZhdCA9IDA7Ci0j
aWYgR1RLX0NIRUNLX1ZFUlNJT04oMywgMTksIDExKQotICAgIGd0a19zdHlsZV9jb250ZXh0X2dl
dChzdHlsZUNvbnRleHQsIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdGF0ZShzdHlsZUNvbnRleHQp
LAotICAgICAgICBvcmllbnRhdGlvbiA9PSBWZXJ0aWNhbFNjcm9sbGJhciA/ICJtaW4td2lkdGgi
IDogIm1pbi1oZWlnaHQiLCAmdGh1bWJGYXQsIG51bGxwdHIpOwotICAgIEd0a0JvcmRlciBtYXJn
aW47Ci0gICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X21hcmdpbihzdHlsZUNvbnRleHQsIGd0a19z
dHlsZV9jb250ZXh0X2dldF9zdGF0ZShzdHlsZUNvbnRleHQpLCAmbWFyZ2luKTsKLSAgICBHdGtC
b3JkZXIgYm9yZGVyOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoc3R5bGVDb250
ZXh0LCBndGtfc3R5bGVfY29udGV4dF9nZXRfc3RhdGUoc3R5bGVDb250ZXh0KSwgJmJvcmRlcik7
Ci0gICAgaWYgKG9yaWVudGF0aW9uID09IFZlcnRpY2FsU2Nyb2xsYmFyKQotICAgICAgICB0aHVt
YkZhdCArPSBtYXJnaW4ubGVmdCArIG1hcmdpbi5yaWdodCArIGJvcmRlci5sZWZ0ICsgYm9yZGVy
LnJpZ2h0OwotICAgIGVsc2UKLSAgICAgICAgdGh1bWJGYXQgKz0gbWFyZ2luLnRvcCArIG1hcmdp
bi5ib3R0b20gKyBib3JkZXIudG9wICsgYm9yZGVyLmJvdHRvbTsKLSNlbHNlCi0gICAgVU5VU0VE
X1BBUkFNKG9yaWVudGF0aW9uKTsKLSAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoc3R5
bGVDb250ZXh0LCAic2xpZGVyLXdpZHRoIiwgJnRodW1iRmF0LCBudWxscHRyKTsKLSNlbmRpZgot
ICAgIHJldHVybiB0aHVtYkZhdDsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWludCBTY3JvbGxi
YXJUaGVtZUd0azo6dGh1bWJGYXRuZXNzKFNjcm9sbGJhciYgc2Nyb2xsYmFyKQorSW50UmVjdCBT
Y3JvbGxiYXJUaGVtZUd0azo6YmFja0J1dHRvblJlY3QoU2Nyb2xsYmFyJiwgU2Nyb2xsYmFyUGFy
dCwgYm9vbCkKIHsKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0g
Z2V0T3JDcmVhdGVTdHlsZUNvbnRleHQoJnNjcm9sbGJhcik7Ci0jaWYgR1RLX0NIRUNLX1ZFUlNJ
T04oMywgMTksIDExKQotICAgIEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBjb250ZW50c1N0eWxl
Q29udGV4dCA9IGNyZWF0ZUNoaWxkU3R5bGVDb250ZXh0KHN0eWxlQ29udGV4dC5nZXQoKSwgImNv
bnRlbnRzIik7Ci0gICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IHRyb3VnaFN0eWxlQ29udGV4
dCA9IGNyZWF0ZUNoaWxkU3R5bGVDb250ZXh0KGNvbnRlbnRzU3R5bGVDb250ZXh0LmdldCgpLCAi
dHJvdWdoIik7Ci0gICAgR1JlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IHNsaWRlclN0eWxlQ29udGV4
dCA9IGNyZWF0ZUNoaWxkU3R5bGVDb250ZXh0KHRyb3VnaFN0eWxlQ29udGV4dC5nZXQoKSwgInNs
aWRlciIpOwotICAgIHJldHVybiB0aHVtYkZhdG5lc3Moc2xpZGVyU3R5bGVDb250ZXh0LmdldCgp
LCBzY3JvbGxiYXIub3JpZW50YXRpb24oKSk7Ci0jZWxzZQotICAgIHJldHVybiB0aHVtYkZhdG5l
c3Moc3R5bGVDb250ZXh0LmdldCgpLCBzY3JvbGxiYXIub3JpZW50YXRpb24oKSk7Ci0jZW5kaWYK
KyAgICByZXR1cm4gSW50UmVjdCgpOwogfQogCi12b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpnZXRU
cm91Z2hCb3JkZXIoR3RrU3R5bGVDb250ZXh0KiBzdHlsZUNvbnRleHQsIEd0a0JvcmRlciogYm9y
ZGVyKQorSW50UmVjdCBTY3JvbGxiYXJUaGVtZUd0azo6Zm9yd2FyZEJ1dHRvblJlY3QoU2Nyb2xs
YmFyJiwgU2Nyb2xsYmFyUGFydCwgYm9vbCkKIHsKLSNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAx
OSwgMTEpCi0gICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JvcmRlcihzdHlsZUNvbnRleHQsIGd0
a19zdHlsZV9jb250ZXh0X2dldF9zdGF0ZShzdHlsZUNvbnRleHQpLCBib3JkZXIpOwotI2Vsc2UK
LSAgICBpbnQgdHJvdWdoQm9yZGVyV2lkdGggPSAwOwotICAgIGd0a19zdHlsZV9jb250ZXh0X2dl
dF9zdHlsZShzdHlsZUNvbnRleHQsICJ0cm91Z2gtYm9yZGVyIiwgJnRyb3VnaEJvcmRlcldpZHRo
LCBudWxscHRyKTsKLSAgICBib3JkZXItPnRvcCA9IGJvcmRlci0+Ym90dG9tID0gYm9yZGVyLT5s
ZWZ0ID0gYm9yZGVyLT5yaWdodCA9IHRyb3VnaEJvcmRlcldpZHRoOwotI2VuZGlmCisgICAgcmV0
dXJuIEludFJlY3QoKTsKIH0KIAotdm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6Z2V0VHJvdWdoQm9y
ZGVyKFNjcm9sbGJhciYgc2Nyb2xsYmFyLCBHdGtCb3JkZXIqIGJvcmRlcikKLXsKLSAgICBHUmVm
UHRyPEd0a1N0eWxlQ29udGV4dD4gc3R5bGVDb250ZXh0ID0gZ2V0T3JDcmVhdGVTdHlsZUNvbnRl
eHQoJnNjcm9sbGJhcik7Ci0jaWYgR1RLX0NIRUNLX1ZFUlNJT04oMywgMTksIDExKQotICAgIEdS
ZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBjb250ZW50c1N0eWxlQ29udGV4dCA9IGNyZWF0ZUNoaWxk
U3R5bGVDb250ZXh0KHN0eWxlQ29udGV4dC5nZXQoKSwgImNvbnRlbnRzIik7Ci0gICAgR1JlZlB0
cjxHdGtTdHlsZUNvbnRleHQ+IHRyb3VnaFN0eWxlQ29udGV4dCA9IGNyZWF0ZUNoaWxkU3R5bGVD
b250ZXh0KGNvbnRlbnRzU3R5bGVDb250ZXh0LmdldCgpLCAidHJvdWdoIik7Ci0gICAgZ2V0VHJv
dWdoQm9yZGVyKHRyb3VnaFN0eWxlQ29udGV4dC5nZXQoKSwgYm9yZGVyKTsKLSAgICAvLyBTaW5j
ZSBHVEsrIDMuMTkgdGhlIHNjcm9sbGJhciBjYW4gaGF2ZSBpdHMgb3duIGJvcmRlciB0b28uCi0g
ICAgR3RrQm9yZGVyIHNjcm9sbGJhckJvcmRlcjsKLSAgICBndGtfc3R5bGVfY29udGV4dF9nZXRf
Ym9yZGVyKHN0eWxlQ29udGV4dC5nZXQoKSwgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0YXRlKHN0
eWxlQ29udGV4dC5nZXQoKSksICZzY3JvbGxiYXJCb3JkZXIpOwotICAgIGJvcmRlci0+bGVmdCAr
PSBzY3JvbGxiYXJCb3JkZXIubGVmdDsKLSAgICBib3JkZXItPnJpZ2h0ICs9IHNjcm9sbGJhckJv
cmRlci5yaWdodDsKLSAgICBib3JkZXItPnRvcCArPSBzY3JvbGxiYXJCb3JkZXIudG9wOwotICAg
IGJvcmRlci0+Ym90dG9tICs9IHNjcm9sbGJhckJvcmRlci5ib3R0b207Ci0jZWxzZQotICAgIGdl
dFRyb3VnaEJvcmRlcihzdHlsZUNvbnRleHQuZ2V0KCksIGJvcmRlcik7Ci0jZW5kaWYKK0ludFJl
Y3QgU2Nyb2xsYmFyVGhlbWVHdGs6OnRyYWNrUmVjdChTY3JvbGxiYXImLCBib29sKQoreworICAg
IHJldHVybiBJbnRSZWN0KCk7CiB9Ci0KICNlbmRpZiAvLyBHVEtfQVBJX1ZFUlNJT05fMgogCiB9
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVH
dGsuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5oCmlu
ZGV4IGIxNmYyOGIuLjRjZGE1NTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0
ay9TY3JvbGxiYXJUaGVtZUd0ay5oCkBAIC00NiwxMyArNDYsNyBAQCBwdWJsaWM6CiAjaWZuZGVm
IEdUS19BUElfVkVSU0lPTl8yCiAgICAgU2Nyb2xsYmFyVGhlbWVHdGsoKTsKIAotICAgIHVzaW5n
IFNjcm9sbGJhclRoZW1lQ29tcG9zaXRlOjp0aHVtYlJlY3Q7Ci0gICAgSW50UmVjdCB0aHVtYlJl
Y3QoU2Nyb2xsYmFyJiwgY29uc3QgSW50UmVjdCYgdW5jb25zdHJhaW5lZFRyYWNrUmVjdCk7CiAg
ICAgYm9vbCBwYWludChTY3JvbGxiYXImLCBHcmFwaGljc0NvbnRleHQmLCBjb25zdCBJbnRSZWN0
JiBkYW1hZ2VSZWN0KSBvdmVycmlkZTsKLSAgICB2b2lkIHBhaW50U2Nyb2xsYmFyQmFja2dyb3Vu
ZChHcmFwaGljc0NvbnRleHQmLCBTY3JvbGxiYXImKSBvdmVycmlkZTsKLSAgICB2b2lkIHBhaW50
VHJhY2tCYWNrZ3JvdW5kKEdyYXBoaWNzQ29udGV4dCYsIFNjcm9sbGJhciYsIGNvbnN0IEludFJl
Y3QmKSBvdmVycmlkZTsKLSAgICB2b2lkIHBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0JiwgU2Ny
b2xsYmFyJiwgY29uc3QgSW50UmVjdCYpIG92ZXJyaWRlOwotICAgIHZvaWQgcGFpbnRCdXR0b24o
R3JhcGhpY3NDb250ZXh0JiwgU2Nyb2xsYmFyJiwgY29uc3QgSW50UmVjdCYsIFNjcm9sbGJhclBh
cnQpIG92ZXJyaWRlOwogICAgIFNjcm9sbGJhckJ1dHRvblByZXNzQWN0aW9uIGhhbmRsZU1vdXNl
UHJlc3NFdmVudChTY3JvbGxiYXImLCBjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmLCBTY3JvbGxi
YXJQYXJ0KSBvdmVycmlkZTsKICAgICBpbnQgc2Nyb2xsYmFyVGhpY2tuZXNzKFNjcm9sbGJhckNv
bnRyb2xTaXplKSBvdmVycmlkZTsKICAgICBpbnQgbWluaW11bVRodW1iTGVuZ3RoKFNjcm9sbGJh
ciYpIG92ZXJyaWRlOwpAQCAtNjcsMjQgKzYxLDExIEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAg
ICB2b2lkIHVwZGF0ZVRoZW1lUHJvcGVydGllcygpOwotICAgIGVudW0gY2xhc3MgU3R5bGVDb250
ZXh0TW9kZSB7IExheW91dCwgUGFpbnQgfTsKLSAgICBHUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4g
Z2V0T3JDcmVhdGVTdHlsZUNvbnRleHQoU2Nyb2xsYmFyKiA9IG51bGxwdHIsIFN0eWxlQ29udGV4
dE1vZGUgPSBTdHlsZUNvbnRleHRNb2RlOjpMYXlvdXQpOwogCi0gICAgSW50U2l6ZSBidXR0b25T
aXplKFNjcm9sbGJhciYsIFNjcm9sbGJhclBhcnQpOwotICAgIGludCBzdGVwcGVyU2l6ZShTY3Jv
bGxiYXImLCBTY3JvbGxiYXJQYXJ0KTsKLSAgICBpbnQgdGh1bWJGYXRuZXNzKFNjcm9sbGJhciYp
OwotICAgIGludCB0aHVtYkZhdG5lc3MoR3RrU3R5bGVDb250ZXh0KiwgU2Nyb2xsYmFyT3JpZW50
YXRpb24gPSBWZXJ0aWNhbFNjcm9sbGJhcik7Ci0gICAgdm9pZCBnZXRUcm91Z2hCb3JkZXIoU2Ny
b2xsYmFyJiwgR3RrQm9yZGVyKik7Ci0gICAgdm9pZCBnZXRUcm91Z2hCb3JkZXIoR3RrU3R5bGVD
b250ZXh0KiwgR3RrQm9yZGVyKik7Ci0gICAgaW50IHNjcm9sbGJhclRoaWNrbmVzcyhHdGtTdHls
ZUNvbnRleHQqLCBTY3JvbGxiYXJPcmllbnRhdGlvbiA9IFZlcnRpY2FsU2Nyb2xsYmFyKTsKLSAg
ICB2b2lkIGdldFN0ZXBwZXJTcGFjaW5nKFNjcm9sbGJhciYsIFNjcm9sbGJhclBhcnQsIEd0a0Jv
cmRlciopOwotICAgIGJvb2wgdHJvdWdoVW5kZXJTdGVwcGVycyhTY3JvbGxiYXImKTsKLQotICAg
IEdSZWZQdHI8R3RrU3R5bGVDb250ZXh0PiBtX2NhY2hlZFN0eWxlQ29udGV4dDsKLSAgICBnYm9v
bGVhbiBtX2hhc0ZvcndhcmRCdXR0b25TdGFydFBhcnQ7Ci0gICAgZ2Jvb2xlYW4gbV9oYXNGb3J3
YXJkQnV0dG9uRW5kUGFydDsKLSAgICBnYm9vbGVhbiBtX2hhc0JhY2tCdXR0b25TdGFydFBhcnQ7
Ci0gICAgZ2Jvb2xlYW4gbV9oYXNCYWNrQnV0dG9uRW5kUGFydDsKKyAgICBib29sIG1faGFzRm9y
d2FyZEJ1dHRvblN0YXJ0UGFydCA6IDE7CisgICAgYm9vbCBtX2hhc0ZvcndhcmRCdXR0b25FbmRQ
YXJ0IDogMTsKKyAgICBib29sIG1faGFzQmFja0J1dHRvblN0YXJ0UGFydCA6IDE7CisgICAgYm9v
bCBtX2hhc0JhY2tCdXR0b25FbmRQYXJ0IDogMTsKICAgICBib29sIG1fdXNlc092ZXJsYXlTY3Jv
bGxiYXJzIHsgZmFsc2UgfTsKICNlbmRpZiAvLyBHVEtfQVBJX1ZFUlNJT05fMgogfTsK
</data>
<flag name="review"
          id="300437"
          type_id="1"
          status="+"
          setter="mcatanzaro"
    />
          </attachment>
      

    </bug>

</bugzilla>