<?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>76521</bug_id>
          
          <creation_ts>2012-01-18 00:44:41 -0800</creation_ts>
          <short_desc>WebSocket: MessageEvent fired during send() on workers</short_desc>
          <delta_ts>2012-02-15 00:44:12 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yuta Kitamura">yutak</reporter>
          <assigned_to name="Yuta Kitamura">yutak</assigned_to>
          <cc>levin</cc>
    
    <cc>levin+threading</cc>
    
    <cc>tkent</cc>
    
    <cc>toyoshim</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>537681</commentid>
    <comment_count>0</comment_count>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-01-18 00:44:41 -0800</bug_when>
    <thetext>Chromium bug: http://code.google.com/p/chromium/issues/detail?id=108626

There is a bug in WorkerThreadableWebSocketChannel that it may fire a MessageEvent while it is waiting for the result of a synchronous operation (WebSocket.send() or WebSocket.bufferedAmount). The event should not be fired until the user script exits the current cycle of the event loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537692</commentid>
    <comment_count>1</comment_count>
      <attachid>122886</attachid>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-01-18 01:03:06 -0800</bug_when>
    <thetext>Created attachment 122886
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537700</commentid>
    <comment_count>2</comment_count>
      <attachid>122886</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2012-01-18 01:11:58 -0800</bug_when>
    <thetext>Comment on attachment 122886
Patch

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

&gt; Source/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.cpp:190
&gt; +    if (!m_syncMethodDone) {

Why go through all of this?

If you post a task without a mode, then it won&apos;t run until the nested loop is done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537720</commentid>
    <comment_count>3</comment_count>
      <attachid>122886</attachid>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-01-18 01:55:23 -0800</bug_when>
    <thetext>Comment on attachment 122886
Patch

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

&gt;&gt; Source/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.cpp:190
&gt;&gt; +    if (!m_syncMethodDone) {
&gt; 
&gt; Why go through all of this?
&gt; 
&gt; If you post a task without a mode, then it won&apos;t run until the nested loop is done.

Sorry, I digged the code a bit but I still don&apos;t get the idea of what the &quot;mode&quot; is.

WorkerThreadableWebSocketChannel posts tasks with m_taskMode specified as the mode (which is generated within ThreadableWebSocketChannel::create()). Is this wrong?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537865</commentid>
    <comment_count>4</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2012-01-18 07:34:37 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 122886 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=122886&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.cpp:190
&gt; &gt;&gt; +    if (!m_syncMethodDone) {
&gt; &gt; 
&gt; &gt; Why go through all of this?
&gt; &gt; 
&gt; &gt; If you post a task without a mode, then it won&apos;t run until the nested loop is done.
&gt; 
&gt; Sorry, I digged the code a bit but I still don&apos;t get the idea of what the &quot;mode&quot; is.
&gt; 
&gt; WorkerThreadableWebSocketChannel posts tasks with m_taskMode specified as the mode (which is generated within ThreadableWebSocketChannel::create()). Is this wrong?

When a nested loop runs in a worker, it runs in a &quot;mode&quot;. The mode is just a string but that string acts as a filter. It only allows tasks that are posted using that &quot;mode&quot; (the same string) to run during that nested loop. If a task is posted with no mode, then the task isn&apos;t run until the nested loop is done.

In general, the code should posts tasks using the m_taskMode (or else they won&apos;t run at all during this nested message loop.). However, in this case, for this one task, it sounds like you want to run a task but not until the nested loop is done, so if the code uses &quot;postTask&quot; instead of &quot;postTaskForMode&quot; (or uses &quot;&quot; as the mode if necessary), then you will get the desired result.

Hope that helps.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>538577</commentid>
    <comment_count>5</comment_count>
      <attachid>122886</attachid>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-01-19 02:56:39 -0800</bug_when>
    <thetext>Comment on attachment 122886
Patch

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

&gt;&gt;&gt;&gt; Source/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.cpp:190
&gt;&gt;&gt;&gt; +    if (!m_syncMethodDone) {
&gt;&gt;&gt; 
&gt;&gt;&gt; Why go through all of this?
&gt;&gt;&gt; 
&gt;&gt;&gt; If you post a task without a mode, then it won&apos;t run until the nested loop is done.
&gt;&gt; 
&gt;&gt; Sorry, I digged the code a bit but I still don&apos;t get the idea of what the &quot;mode&quot; is.
&gt;&gt; 
&gt;&gt; WorkerThreadableWebSocketChannel posts tasks with m_taskMode specified as the mode (which is generated within ThreadableWebSocketChannel::create()). Is this wrong?
&gt; 
&gt; When a nested loop runs in a worker, it runs in a &quot;mode&quot;. The mode is just a string but that string acts as a filter. It only allows tasks that are posted using that &quot;mode&quot; (the same string) to run during that nested loop. If a task is posted with no mode, then the task isn&apos;t run until the nested loop is done.
&gt; 
&gt; In general, the code should posts tasks using the m_taskMode (or else they won&apos;t run at all during this nested message loop.). However, in this case, for this one task, it sounds like you want to run a task but not until the nested loop is done, so if the code uses &quot;postTask&quot; instead of &quot;postTaskForMode&quot; (or uses &quot;&quot; as the mode if necessary), then you will get the desired result.
&gt; 
&gt; Hope that helps.

Okay, I think I got your point. I&apos;m going to update the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>543757</commentid>
    <comment_count>6</comment_count>
      <attachid>122886</attachid>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-01-26 19:51:29 -0800</bug_when>
    <thetext>Comment on attachment 122886
Patch

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.cpp:190
&gt;&gt;&gt;&gt;&gt; +    if (!m_syncMethodDone) {
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Why go through all of this?
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; If you post a task without a mode, then it won&apos;t run until the nested loop is done.
&gt;&gt;&gt; 
&gt;&gt;&gt; Sorry, I digged the code a bit but I still don&apos;t get the idea of what the &quot;mode&quot; is.
&gt;&gt;&gt; 
&gt;&gt;&gt; WorkerThreadableWebSocketChannel posts tasks with m_taskMode specified as the mode (which is generated within ThreadableWebSocketChannel::create()). Is this wrong?
&gt;&gt; 
&gt;&gt; When a nested loop runs in a worker, it runs in a &quot;mode&quot;. The mode is just a string but that string acts as a filter. It only allows tasks that are posted using that &quot;mode&quot; (the same string) to run during that nested loop. If a task is posted with no mode, then the task isn&apos;t run until the nested loop is done.
&gt;&gt; 
&gt;&gt; In general, the code should posts tasks using the m_taskMode (or else they won&apos;t run at all during this nested message loop.). However, in this case, for this one task, it sounds like you want to run a task but not until the nested loop is done, so if the code uses &quot;postTask&quot; instead of &quot;postTaskForMode&quot; (or uses &quot;&quot; as the mode if necessary), then you will get the desired result.
&gt;&gt; 
&gt;&gt; Hope that helps.
&gt; 
&gt; Okay, I think I got your point. I&apos;m going to update the patch.

After some investigation, I started to think postTask&apos;ing pending tasks (e.g. did*Callback()) is infeasible because we can&apos;t call these callbacks when the worker is suspended. We need to process these events in the chronological order, and if we postTask&apos;ed each event it would be difficult to handle suspension correctly. That&apos;s why there&apos;s m_pendingTasks, I guess.

(Maybe the responsibility of suspension handling should exist in WebSocket class, not here; but fixing it would require another work.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>543781</commentid>
    <comment_count>7</comment_count>
      <attachid>122886</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2012-01-26 20:38:18 -0800</bug_when>
    <thetext>Comment on attachment 122886
Patch

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

Thanks for the explanation. (I think I led you astray.)

&gt; Source/WebCore/websockets/ThreadableWebSocketChannelClientWrapper.cpp:188
&gt; +    if (m_suspended)

Since you are adding this check, perhaps in another patch (not this patch), you could change the many places that do this


if (!m_suspended)
    processPendingTasks();

to

     processPendingTasks();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556971</commentid>
    <comment_count>8</comment_count>
    <who name="Yuta Kitamura">yutak</who>
    <bug_when>2012-02-15 00:19:55 -0800</bug_when>
    <thetext>Thanks. I somehow missed you r+ed my patch (sorry!), so I&apos;m trying CQ now...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556992</commentid>
    <comment_count>9</comment_count>
      <attachid>122886</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-15 00:44:06 -0800</bug_when>
    <thetext>Comment on attachment 122886
Patch

Clearing flags on attachment: 122886

Committed r107788: &lt;http://trac.webkit.org/changeset/107788&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556993</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-15 00:44:12 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122886</attachid>
            <date>2012-01-18 01:03:06 -0800</date>
            <delta_ts>2012-02-15 00:44:06 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-76521-20120118180305.patch</filename>
            <type>text/plain</type>
            <size>16416</size>
            <attacher name="Yuta Kitamura">yutak</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA1MjI5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggM2FjYzFlNzRjN2QzMjRm
ZTBjNDM1MjVmZWViZTk4ZjZjZDliZWNmMy4uMDczM2E1YTYzYTAxMTllYjkwNzM2Y2FkYzc4NWRl
ZDA3OWQ3MmRlYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI4IEBACisyMDEyLTAxLTE4ICBZdXRh
IEtpdGFtdXJhICA8eXV0YWtAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYlNvY2tldDogTWVz
c2FnZUV2ZW50IGZpcmVkIGR1cmluZyBzZW5kKCkgb24gd29ya2VycworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1MjEKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZWJTb2NrZXQncyBtZXNzYWdlIGV2ZW50
IHNob3VsZCBub3QgYmUgaW52b2tlZCB3aGlsZSBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbgorICAg
ICAgICAoc2VuZCgpIGFuZCBidWZmZXJlZEFtb3VudCkgaXMgaW4gcHJvZ3Jlc3MuCisKKyAgICAg
ICAgVGVzdDogaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVzdHMvaHliaS93b3JrZXJzL25vLW9ubWVz
c2FnZS1pbi1zeW5jLW9wLmh0bWwKKworICAgICAgICAqIHdlYnNvY2tldHMvVGhyZWFkYWJsZVdl
YlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyLmNwcDoKKyAgICAgICAgQWRkZWQgI2lmIEVOQUJM
RShXT1JLRVJTKSBiZWNhdXNlIFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBl
ciBpcyBub3QgdXNlZAorICAgICAgICBpZiBXZWIgV29ya2VycyBpcyBub3QgYXZhaWxhYmxlLgor
ICAgICAgICBDaGFuZ2VkIGFjY2VzcyBsYWJlbCBiZWNhdXNlIHByaXZhdGUgbWVtYmVycyB3ZXJl
IGRlY2xhcmVkIGFzIHByb3RlY3RlZCB3aXRoIG5vIGdvb2QgcmVhc29uLgorICAgICAgICAoV2Vi
Q29yZTo6VGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyOjpUaHJlYWRhYmxl
V2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBwZXIpOgorICAgICAgICBSZWNlaXZlIFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQgc28gd2UgY2FuIHBvc3QgYSB0YXNrIHRoYXQgc2hvdWxkIGJlIGV4ZWN1
dGVkIGxhdGVyLgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxD
bGllbnRXcmFwcGVyOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkYWJsZVdlYlNv
Y2tldENoYW5uZWxDbGllbnRXcmFwcGVyOjpwcm9jZXNzUGVuZGluZ1Rhc2tzQ2FsbGJhY2spOgor
ICAgICAgICAoV2ViQ29yZTo6VGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVy
Ojpwcm9jZXNzUGVuZGluZ1Rhc2tzKToKKyAgICAgICAgKiB3ZWJzb2NrZXRzL1RocmVhZGFibGVX
ZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlci5oOgorICAgICAgICAqIHdlYnNvY2tldHMvV29y
a2VyVGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWwuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V29y
a2VyVGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWw6OldvcmtlclRocmVhZGFibGVXZWJTb2NrZXRD
aGFubmVsKToKKwogMjAxMi0wMS0xNyAgTmF0ZSBDaGFwaW4gIDxqYXBoZXRAY2hyb21pdW0ub3Jn
PgogCiAgICAgICAgIEVuc3VyZSB3ZSBkb24ndCBjYW5jZWwgcmV2YWxpZGF0aW9uIG9mIGEgQ2Fj
aGVkUmVzb3VyY2UKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3dlYnNvY2tldHMvVGhyZWFk
YWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3dl
YnNvY2tldHMvVGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyLmNwcAppbmRl
eCAzYmUwNGE5OGZjZDNlZDY0MGNmNzI4NGNjOWFjN2E5MWU2MDgxZTg5Li45OGYwZDlmZWQ1Njc1
NDE0MWJiNTQ5NmI5MGZiZjcwOTQ4YTU1ODJmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS93
ZWJzb2NrZXRzL1RocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlci5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvd2Vic29ja2V0cy9UaHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5lbENs
aWVudFdyYXBwZXIuY3BwCkBAIC0yOSwyMCArMjksMjIgQEAKICAqLwogCiAjaW5jbHVkZSAiY29u
ZmlnLmgiCi0jaWYgRU5BQkxFKFdFQl9TT0NLRVRTKQorI2lmIEVOQUJMRShXRUJfU09DS0VUUykg
JiYgRU5BQkxFKFdPUktFUlMpCiAjaW5jbHVkZSAiVGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxD
bGllbnRXcmFwcGVyLmgiCiAKICNpbmNsdWRlICJDcm9zc1RocmVhZENvcGllci5oIgogI2luY2x1
ZGUgIkNyb3NzVGhyZWFkVGFzay5oIgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQu
aCIKICNpbmNsdWRlICJXZWJTb2NrZXRDaGFubmVsQ2xpZW50LmgiCiAjaW5jbHVkZSA8d3RmL1Bh
c3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotVGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyOjpUaHJlYWRhYmxl
V2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBwZXIoV2ViU29ja2V0Q2hhbm5lbENsaWVudCogY2xp
ZW50KQotICAgIDogbV9jbGllbnQoY2xpZW50KQotICAgICwgbV9zeW5jTWV0aG9kRG9uZShmYWxz
ZSkKK1RocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcjo6VGhyZWFkYWJsZVdl
YlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRl
eHQsIFdlYlNvY2tldENoYW5uZWxDbGllbnQqIGNsaWVudCkKKyAgICA6IG1fY29udGV4dChjb250
ZXh0KQorICAgICwgbV9jbGllbnQoY2xpZW50KQorICAgICwgbV9zeW5jTWV0aG9kRG9uZSh0cnVl
KQogICAgICwgbV91c2VIaXhpZTc2UHJvdG9jb2wodHJ1ZSkKICAgICAsIG1fc2VuZFJlcXVlc3RS
ZXN1bHQoZmFsc2UpCiAgICAgLCBtX2J1ZmZlcmVkQW1vdW50KDApCkBAIC01MCw5ICs1Miw5IEBA
IFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcjo6VGhyZWFkYWJsZVdlYlNv
Y2tldENoYW5uZWxDbGllbnRXcmFwcGVyCiB7CiB9CiAKLVBhc3NSZWZQdHI8VGhyZWFkYWJsZVdl
YlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyPiBUaHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5lbENs
aWVudFdyYXBwZXI6OmNyZWF0ZShXZWJTb2NrZXRDaGFubmVsQ2xpZW50KiBjbGllbnQpCitQYXNz
UmVmUHRyPFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcj4gVGhyZWFkYWJs
ZVdlYlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyOjpjcmVhdGUoU2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCogY29udGV4dCwgV2ViU29ja2V0Q2hhbm5lbENsaWVudCogY2xpZW50KQogewotICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgVGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVy
KGNsaWVudCkpOworICAgIHJldHVybiBhZG9wdFJlZihuZXcgVGhyZWFkYWJsZVdlYlNvY2tldENo
YW5uZWxDbGllbnRXcmFwcGVyKGNvbnRleHQsIGNsaWVudCkpOwogfQogCiB2b2lkIFRocmVhZGFi
bGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcjo6Y2xlYXJTeW5jTWV0aG9kRG9uZSgpCkBA
IC0xNzUsOSArMTc3LDIyIEBAIHZvaWQgVGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRX
cmFwcGVyOjpyZXN1bWUoKQogICAgIHByb2Nlc3NQZW5kaW5nVGFza3MoKTsKIH0KIAordm9pZCBU
aHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBwZXI6OnByb2Nlc3NQZW5kaW5nVGFz
a3NDYWxsYmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0LCBQYXNzUmVmUHRyPFRo
cmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcj4gd3JhcHBlcikKK3sKKyAgICBB
U1NFUlRfVU5VU0VEKGNvbnRleHQsIGNvbnRleHQtPmlzV29ya2VyQ29udGV4dCgpKTsKKyAgICB3
cmFwcGVyLT5wcm9jZXNzUGVuZGluZ1Rhc2tzKCk7Cit9CisKIHZvaWQgVGhyZWFkYWJsZVdlYlNv
Y2tldENoYW5uZWxDbGllbnRXcmFwcGVyOjpwcm9jZXNzUGVuZGluZ1Rhc2tzKCkKIHsKLSAgICBB
U1NFUlQoIW1fc3VzcGVuZGVkKTsKKyAgICBpZiAobV9zdXNwZW5kZWQpCisgICAgICAgIHJldHVy
bjsKKyAgICBpZiAoIW1fc3luY01ldGhvZERvbmUpIHsKKyAgICAgICAgLy8gV2hlbiBhIHN5bmNo
cm9ub3VzIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcyAoaS5lLiB0aGUgZXhlY3V0aW9uIHN0YWNr
IGNvbnRhaW5zCisgICAgICAgIC8vIFdvcmtlclRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsOjp3
YWl0Rm9yTWV0aG9kQ29tcGxldGlvbigpKSwgd2UgY2Fubm90IGludm9rZSBjYWxsYmFja3MgaW4g
dGhpcyBydW4gbG9vcC4KKyAgICAgICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFj
a1Rhc2soJlRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcjo6cHJvY2Vzc1Bl
bmRpbmdUYXNrc0NhbGxiYWNrLCB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAg
VmVjdG9yPE93blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiA+IHRhc2tzOwogICAg
IHRhc2tzLnN3YXAobV9wZW5kaW5nVGFza3MpOwogICAgIGZvciAoVmVjdG9yPE93blB0cjxTY3Jp
cHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gdGFza3Mu
YmVnaW4oKTsgaXRlciAhPSB0YXNrcy5lbmQoKTsgKytpdGVyKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvd2Vic29ja2V0cy9UaHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBw
ZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3dlYnNvY2tldHMvVGhyZWFkYWJsZVdlYlNvY2tldENoYW5u
ZWxDbGllbnRXcmFwcGVyLmgKaW5kZXggZWM5Mzk3Y2RiNDI1YTdiMTVjNmVlZmE1ZjFhNmJiNjc4
NDIyYWE3Mi4uOWZlMzM1YjRhNjk3NmNhMTI2ODhjMDJiMzgyNmEwMDFhYjFjNzZhYSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvd2Vic29ja2V0cy9UaHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5l
bENsaWVudFdyYXBwZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS93ZWJzb2NrZXRzL1RocmVhZGFi
bGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlci5oCkBAIC0zMSw3ICszMSw3IEBACiAjaWZu
ZGVmIFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcl9oCiAjZGVmaW5lIFRo
cmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcl9oCiAKLSNpZiBFTkFCTEUoV0VC
X1NPQ0tFVFMpCisjaWYgRU5BQkxFKFdFQl9TT0NLRVRTKSAmJiBFTkFCTEUoV09SS0VSUykKIAog
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSAiU2NyaXB0RXhlY3V0aW9uQ29u
dGV4dC5oIgpAQCAtNDQsMTEgKzQ0LDEyIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xh
c3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKIGNsYXNzIFdlYlNvY2tldENoYW5uZWxDbGllbnQ7
CiAKIGNsYXNzIFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlciA6IHB1Ymxp
YyBUaHJlYWRTYWZlUmVmQ291bnRlZDxUaHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5lbENsaWVudFdy
YXBwZXI+IHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxUaHJlYWRhYmxlV2ViU29j
a2V0Q2hhbm5lbENsaWVudFdyYXBwZXI+IGNyZWF0ZShXZWJTb2NrZXRDaGFubmVsQ2xpZW50Kik7
CisgICAgc3RhdGljIFBhc3NSZWZQdHI8VGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxDbGllbnRX
cmFwcGVyPiBjcmVhdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFdlYlNvY2tldENoYW5uZWxD
bGllbnQqKTsKIAogICAgIHZvaWQgY2xlYXJTeW5jTWV0aG9kRG9uZSgpOwogICAgIHZvaWQgc2V0
U3luY01ldGhvZERvbmUoKTsKQEAgLTgxLDE3ICs4MiwyMCBAQCBwdWJsaWM6CiAgICAgdm9pZCBz
dXNwZW5kKCk7CiAgICAgdm9pZCByZXN1bWUoKTsKIAotcHJvdGVjdGVkOgotICAgIFRocmVhZGFi
bGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcihXZWJTb2NrZXRDaGFubmVsQ2xpZW50Kik7
Citwcml2YXRlOgorICAgIFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcihT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV2ViU29ja2V0Q2hhbm5lbENsaWVudCopOwogCiAgICAg
dm9pZCBwcm9jZXNzUGVuZGluZ1Rhc2tzKCk7CisKICAgICBzdGF0aWMgdm9pZCBkaWRDb25uZWN0
Q2FsbGJhY2soU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8VGhyZWFkYWJsZVdl
YlNvY2tldENoYW5uZWxDbGllbnRXcmFwcGVyPik7CiAgICAgc3RhdGljIHZvaWQgZGlkUmVjZWl2
ZU1lc3NhZ2VDYWxsYmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxUaHJl
YWRhYmxlV2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBwZXI+LCBjb25zdCBTdHJpbmcmIG1lc3Nh
Z2UpOwogICAgIHN0YXRpYyB2b2lkIGRpZFJlY2VpdmVCaW5hcnlEYXRhQ2FsbGJhY2soU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8VGhyZWFkYWJsZVdlYlNvY2tldENoYW5uZWxD
bGllbnRXcmFwcGVyPiwgUGFzc093blB0cjxWZWN0b3I8Y2hhcj4gPik7CiAgICAgc3RhdGljIHZv
aWQgZGlkVXBkYXRlQnVmZmVyZWRBbW91bnRDYWxsYmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiwgUGFzc1JlZlB0cjxUaHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBwZXI+LCB1
bnNpZ25lZCBsb25nIGJ1ZmZlcmVkQW1vdW50KTsKICAgICBzdGF0aWMgdm9pZCBkaWRTdGFydENs
b3NpbmdIYW5kc2hha2VDYWxsYmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0
cjxUaHJlYWRhYmxlV2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBwZXI+KTsKICAgICBzdGF0aWMg
dm9pZCBkaWRDbG9zZUNhbGxiYWNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRy
PFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBlcj4sIHVuc2lnbmVkIGxvbmcg
dW5oYW5kbGVkQnVmZmVyZWRBbW91bnQsIFdlYlNvY2tldENoYW5uZWxDbGllbnQ6OkNsb3NpbmdI
YW5kc2hha2VDb21wbGV0aW9uU3RhdHVzLCB1bnNpZ25lZCBzaG9ydCBjb2RlLCBjb25zdCBTdHJp
bmcmIHJlYXNvbik7CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc1BlbmRpbmdUYXNrc0NhbGxiYWNr
KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFRocmVhZGFibGVXZWJTb2NrZXRD
aGFubmVsQ2xpZW50V3JhcHBlcj4pOwogCisgICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogbV9j
b250ZXh0OwogICAgIFdlYlNvY2tldENoYW5uZWxDbGllbnQqIG1fY2xpZW50OwogICAgIGJvb2wg
bV9zeW5jTWV0aG9kRG9uZTsKICAgICBib29sIG1fdXNlSGl4aWU3NlByb3RvY29sOwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvd2Vic29ja2V0cy9Xb3JrZXJUaHJlYWRhYmxlV2ViU29ja2V0
Q2hhbm5lbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS93ZWJzb2NrZXRzL1dvcmtlclRocmVhZGFibGVX
ZWJTb2NrZXRDaGFubmVsLmNwcAppbmRleCBmMGU2M2UxMjUyNTQ5OTRiNWM1YjYyNjBiNTEwNWEz
ZjdlYTgyMjY1Li5mNzE3ZTllOGRhMmY5Y2VlY2YxOWRiMzQ3Mzc0N2NkY2ExNGM2ODVlIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS93ZWJzb2NrZXRzL1dvcmtlclRocmVhZGFibGVXZWJTb2Nr
ZXRDaGFubmVsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS93ZWJzb2NrZXRzL1dvcmtlclRocmVh
ZGFibGVXZWJTb2NrZXRDaGFubmVsLmNwcApAQCAtNTMsNyArNTMsNyBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKIFdvcmtlclRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsOjpXb3JrZXJUaHJlYWRh
YmxlV2ViU29ja2V0Q2hhbm5lbChXb3JrZXJDb250ZXh0KiBjb250ZXh0LCBXZWJTb2NrZXRDaGFu
bmVsQ2xpZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYgdGFza01vZGUpCiAgICAgOiBtX3dvcmtl
ckNvbnRleHQoY29udGV4dCkKLSAgICAsIG1fd29ya2VyQ2xpZW50V3JhcHBlcihUaHJlYWRhYmxl
V2ViU29ja2V0Q2hhbm5lbENsaWVudFdyYXBwZXI6OmNyZWF0ZShjbGllbnQpKQorICAgICwgbV93
b3JrZXJDbGllbnRXcmFwcGVyKFRocmVhZGFibGVXZWJTb2NrZXRDaGFubmVsQ2xpZW50V3JhcHBl
cjo6Y3JlYXRlKGNvbnRleHQsIGNsaWVudCkpCiAgICAgLCBtX2JyaWRnZShCcmlkZ2U6OmNyZWF0
ZShtX3dvcmtlckNsaWVudFdyYXBwZXIsIG1fd29ya2VyQ29udGV4dCwgdGFza01vZGUpKQogewog
fQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCmluZGV4IDYyOWUxNTFmMzNlMWFmY2Y0ODA5NGMwZDQ5NjVhYWNmNDUzZjJkM2YuLjhjMjQ4
YTkyMmYyYmJhMjBlNDhiODg1ODMwOGIxNmE2Y2ZjNjU0YjAgMTAwNjQ0Ci0tLSBhL0xheW91dFRl
c3RzL0NoYW5nZUxvZworKysgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBA
QAorMjAxMi0wMS0xOCAgWXV0YSBLaXRhbXVyYSAgPHl1dGFrQGNocm9taXVtLm9yZz4KKworICAg
ICAgICBXZWJTb2NrZXQ6IE1lc3NhZ2VFdmVudCBmaXJlZCBkdXJpbmcgc2VuZCgpIG9uIHdvcmtl
cnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTIx
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBodHRw
L3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL3dvcmtlcnMvbm8tb25tZXNzYWdlLWluLXN5bmMt
b3AtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBodHRwL3Rlc3RzL3dlYnNvY2tldC90
ZXN0cy9oeWJpL3dvcmtlcnMvbm8tb25tZXNzYWdlLWluLXN5bmMtb3AuaHRtbDogQWRkZWQuCisg
ICAgICAgICogaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVzdHMvaHliaS93b3JrZXJzL3Jlc291cmNl
cy9uby1vbm1lc3NhZ2UtaW4tc3luYy1vcC5qczoKKyAgICAgICAgQWRkZWQuIFRoZSBzZXJ2ZXIg
c2VuZHMgbWVzc2FnZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJs
aXNoZWQsIGJ1dAorICAgICAgICB0aGVzZSBtZXNzYWdlcyBzaG91bGQgbm90IGJlIGRlbGl2ZXJl
ZCB1bnRpbCB0aGUgc2NyaXB0IGV4aXRzIHRoZSBjdXJyZW50IGN5Y2xlIG9mCisgICAgICAgIHRo
ZSBldmVudCBsb29wLiBUaGUgc2NyaXB0IGNhbGxzIGEgZmV3IHN5bmNocm9ub3VzIG9wZXJhdGlv
bnMgdG8gbWFrZSBzdXJlIHdlIGRvbid0CisgICAgICAgIGZpcmUgTWVzc2FnZUV2ZW50cyB3aGls
ZSB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlc2Ugb3BlcmF0aW9ucyB0byBmaW5pc2guCisgICAgICAg
ICogaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVzdHMvaHliaS93b3JrZXJzL3Jlc291cmNlcy9uby1v
bm1lc3NhZ2UtaW4tc3luYy1vcF93c2gucHk6IEFkZGVkLgorCiAyMDEyLTAxLTE3ICBKYW1lcyBS
b2JpbnNvbiAgPGphbWVzckBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgW2Nocm9taXVtXSBNYXJr
IHNvbWUgY29tcG9zaXRpbmcgdGVzdHMgYXMgZmFpbGluZyB3aXRoIGFuIElNQUdFIGRpZmYgZHVl
IHRvIHZpZGVvIHBsYXliYWNrIHByb2JsZW0KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2h0dHAv
dGVzdHMvd2Vic29ja2V0L3Rlc3RzL2h5Ymkvd29ya2Vycy9uby1vbm1lc3NhZ2UtaW4tc3luYy1v
cC1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9o
eWJpL3dvcmtlcnMvbm8tb25tZXNzYWdlLWluLXN5bmMtb3AtZXhwZWN0ZWQudHh0Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmRkN2MzZmNjOWZmOTI0ODUwZmRhMDg2YzE0NTk0ZWQwOTBiNTQyNGUKLS0tIC9kZXYvbnVs
bAorKysgYi9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL3dvcmtl
cnMvbm8tb25tZXNzYWdlLWluLXN5bmMtb3AtZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMjEgQEAK
K1dlYlNvY2tldCdzIG1lc3NhZ2UgZXZlbnQgc2hvdWxkIG5vdCBiZSBpbnZva2VkIHdoaWxlIHdl
IGFyZSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0IG9mIGEgc3luY2hyb25vdXMgb3BlcmF0aW9uIChz
dWNoIGFzIFdlYlNvY2tldC5zZW5kKCkpIG9uIHdvcmtlcnMuCisKK09uIHN1Y2Nlc3MsIHlvdSB3
aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENP
TVBMRVRFIi4KKworSU5GTzogV2FpdGluZyBmb3IgdHdvIHNlY29uZHMgdG8gbWFrZSBzdXJlIHdl
IHJlY2VpdmUgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorUEFTUyBQQVNTOiBjbG9zZUV2ZW50
Lndhc0NsZWFuIGlzIHRydWUKK1BBU1MgUEFTUzogZXZlbnQubGVuZ3RoIGlzIDkKK1BBU1MgUEFT
UzogZXZlbnRzWzBdIGlzICJHb3QgYnVmZmVyZWRBbW91bnQ6IDAiCitQQVNTIFBBU1M6IGV2ZW50
c1sxXSBpcyAiR290IGJ1ZmZlcmVkQW1vdW50OiAwIgorUEFTUyBQQVNTOiBldmVudHNbMl0gaXMg
IkdvdCBidWZmZXJlZEFtb3VudDogMCIKK1BBU1MgUEFTUzogZXZlbnRzWzNdIGlzICJTZW50IG1l
c3NhZ2U6IDEiCitQQVNTIFBBU1M6IGV2ZW50c1s0XSBpcyAiU2VudCBtZXNzYWdlOiAyIgorUEFT
UyBQQVNTOiBldmVudHNbNV0gaXMgIlNlbnQgbWVzc2FnZTogMyIKK1BBU1MgUEFTUzogZXZlbnRz
WzZdIGlzICJSZWNlaXZlZCBtZXNzYWdlOiAxIgorUEFTUyBQQVNTOiBldmVudHNbN10gaXMgIlJl
Y2VpdmVkIG1lc3NhZ2U6IDIiCitQQVNTIFBBU1M6IGV2ZW50c1s4XSBpcyAiUmVjZWl2ZWQgbWVz
c2FnZTogMyIKK0RPTkUKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBD
T01QTEVURQorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL3dlYnNvY2tldC90
ZXN0cy9oeWJpL3dvcmtlcnMvbm8tb25tZXNzYWdlLWluLXN5bmMtb3AuaHRtbCBiL0xheW91dFRl
c3RzL2h0dHAvdGVzdHMvd2Vic29ja2V0L3Rlc3RzL2h5Ymkvd29ya2Vycy9uby1vbm1lc3NhZ2Ut
aW4tc3luYy1vcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjgwYzAxZWJjOTc4OWI5MGNmMjIyNTI4ODViNzU2
MjRkNzVhYTRhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL3dl
YnNvY2tldC90ZXN0cy9oeWJpL3dvcmtlcnMvbm8tb25tZXNzYWdlLWluLXN5bmMtb3AuaHRtbApA
QCAtMCwwICsxLDM4IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0
IHNyYz0iLi4vLi4vLi4vLi4vLi4vanMtdGVzdC1yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwv
c2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+PC9kaXY+Cis8
ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4K
K2Rlc2NyaXB0aW9uKCJXZWJTb2NrZXQncyBtZXNzYWdlIGV2ZW50IHNob3VsZCBub3QgYmUgaW52
b2tlZCB3aGlsZSB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIHJlc3VsdCBvZiBhIHN5bmNocm9ub3Vz
IG9wZXJhdGlvbiAoc3VjaCBhcyBXZWJTb2NrZXQuc2VuZCgpKSBvbiB3b3JrZXJzLiIpOworCit3
aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CitpZiAod2luZG93LmxheW91dFRlc3RDb250cm9s
bGVyKQorICAgIGxheW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZSgiV2ViS2l0
SGl4aWU3NldlYlNvY2tldFByb3RvY29sRW5hYmxlZCIsIDApOworCitmdW5jdGlvbiBzdGFydHNX
aXRoKHN0ciwgcHJlZml4KQoreworICAgIHJldHVybiBzdHIuaW5kZXhPZihwcmVmaXgpID09IDA7
Cit9CisKK3ZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCJyZXNvdXJjZXMvbm8tb25tZXNzYWdlLWlu
LXN5bmMtb3AuanMiKTsKK3dvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpCit7Cisg
ICAgdmFyIG1lc3NhZ2UgPSBldmVudC5kYXRhOworICAgIGlmIChzdGFydHNXaXRoKG1lc3NhZ2Us
ICJQQVNTIikpCisgICAgICAgIHRlc3RQYXNzZWQobWVzc2FnZSk7CisgICAgZWxzZSBpZiAoc3Rh
cnRzV2l0aChtZXNzYWdlLCAiRkFJTCIpKQorICAgICAgICB0ZXN0RmFpbGVkKG1lc3NhZ2UpCisg
ICAgZWxzZQorICAgICAgICBkZWJ1ZyhtZXNzYWdlKTsKKyAgICBpZiAobWVzc2FnZSA9PT0gIkRP
TkUiKQorICAgICAgICBmaW5pc2hKU1Rlc3QoKTsKK307CisKKzwvc2NyaXB0PgorPHNjcmlwdCBz
cmM9Ii4uLy4uLy4uLy4uLy4uL2pzLXRlc3QtcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9z
Y3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9odHRwL3Rl
c3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL3dvcmtlcnMvcmVzb3VyY2VzL25vLW9ubWVzc2FnZS1p
bi1zeW5jLW9wLmpzIGIvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVzdHMvaHli
aS93b3JrZXJzL3Jlc291cmNlcy9uby1vbm1lc3NhZ2UtaW4tc3luYy1vcC5qcwpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li42NWQ3OTg1OWEzNjU1OWZmYTdiOTY4OTkzMmUwZTIxY2YxNzQzMjg1Ci0tLSAvZGV2L251bGwK
KysrIGIvTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy93ZWJzb2NrZXQvdGVzdHMvaHliaS93b3JrZXJz
L3Jlc291cmNlcy9uby1vbm1lc3NhZ2UtaW4tc3luYy1vcC5qcwpAQCAtMCwwICsxLDYyIEBACit2
YXIgd3MgPSBuZXcgV2ViU29ja2V0KCJ3czovLzEyNy4wLjAuMTo4ODgwL3dlYnNvY2tldC90ZXN0
cy9oeWJpL3dvcmtlcnMvcmVzb3VyY2VzL25vLW9ubWVzc2FnZS1pbi1zeW5jLW9wIik7CisKK3Zh
ciBldmVudHMgPSBbXTsKKy8vIE1lc3NhZ2UgcmVjZWlwdCBzaG91bGQgYmUgcmVjb3JkZWQgYWZ0
ZXIgYnVmZmVyZWRBbW91bnQgYW5kIHNlbmQoKSBjYWxscy4KK3ZhciBleHBlY3RlZEV2ZW50cyA9
IFsiR290IGJ1ZmZlcmVkQW1vdW50OiAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAiR290IGJ1
ZmZlcmVkQW1vdW50OiAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAiR290IGJ1ZmZlcmVkQW1v
dW50OiAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU2VudCBtZXNzYWdlOiAxIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAiU2VudCBtZXNzYWdlOiAyIiwKKyAgICAgICAgICAgICAgICAgICAg
ICAiU2VudCBtZXNzYWdlOiAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgbWVz
c2FnZTogMSIsCisgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIG1lc3NhZ2U6IDIiLAor
ICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBtZXNzYWdlOiAzIl07CisKK3dzLm9ub3Bl
biA9IGZ1bmN0aW9uKCkKK3sKKyAgICAvLyBBZnRlciBoYW5kc2hha2UsIHRoZSBzZXJ2ZXIgd2ls
bCBzZW5kIHRocmVlIG1lc3NhZ2VzIGltbWVkaWF0ZWx5LCBidXQgdGhleSBzaG91bGQgbm90IGJl
IHJlY2VpdmVkCisgICAgLy8gdW50aWwgd2UgZXhpdCB0aGlzIGV2ZW50IGxvb3AuCisgICAgcG9z
dE1lc3NhZ2UoIklORk86IFdhaXRpbmcgZm9yIHR3byBzZWNvbmRzIHRvIG1ha2Ugc3VyZSB3ZSBy
ZWNlaXZlIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4iKTsKKyAgICB2YXIgc3RhcnQgPSAobmV3
IERhdGUoKSkuZ2V0VGltZSgpOworICAgIHdoaWxlICgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC0g
c3RhcnQgPCAyMDAwKSB7fQorCisgICAgdmFyIGJ1ZmZlcmVkQW1vdW50ID0gd3MuYnVmZmVyZWRB
bW91bnQ7CisgICAgZXZlbnRzLnB1c2goIkdvdCBidWZmZXJlZEFtb3VudDogIiArIGJ1ZmZlcmVk
QW1vdW50KTsKKyAgICBidWZmZXJlZEFtb3VudCA9IHdzLmJ1ZmZlcmVkQW1vdW50OworICAgIGV2
ZW50cy5wdXNoKCJHb3QgYnVmZmVyZWRBbW91bnQ6ICIgKyBidWZmZXJlZEFtb3VudCk7CisgICAg
YnVmZmVyZWRBbW91bnQgPSB3cy5idWZmZXJlZEFtb3VudDsKKyAgICBldmVudHMucHVzaCgiR290
IGJ1ZmZlcmVkQW1vdW50OiAiICsgYnVmZmVyZWRBbW91bnQpOworICAgIHdzLnNlbmQoIjEiKTsK
KyAgICBldmVudHMucHVzaCgiU2VudCBtZXNzYWdlOiAxIik7CisgICAgd3Muc2VuZCgiMiIpOwor
ICAgIGV2ZW50cy5wdXNoKCJTZW50IG1lc3NhZ2U6IDIiKTsKKyAgICB3cy5zZW5kKCIzIik7Cisg
ICAgZXZlbnRzLnB1c2goIlNlbnQgbWVzc2FnZTogMyIpOworfTsKKword3Mub25tZXNzYWdlID0g
ZnVuY3Rpb24obWVzc2FnZUV2ZW50KQoreworICAgIGV2ZW50cy5wdXNoKCJSZWNlaXZlZCBtZXNz
YWdlOiAiICsgbWVzc2FnZUV2ZW50LmRhdGEpOworfTsKKword3Mub25jbG9zZSA9IGZ1bmN0aW9u
KGNsb3NlRXZlbnQpCit7CisgICAgaWYgKGNsb3NlRXZlbnQud2FzQ2xlYW4gPT09IHRydWUpCisg
ICAgICAgIHBvc3RNZXNzYWdlKCJQQVNTOiBjbG9zZUV2ZW50Lndhc0NsZWFuIGlzIHRydWUiKTsK
KyAgICBlbHNlCisgICAgICAgIHBvc3RNZXNzYWdlKCJGQUlMOiBjbG9zZUV2ZW50Lndhc0NsZWFu
IHNob3VsZCBiZSB0cnVlIGJ1dCB3YXMgXCIiICsgY2xvc2VFdmVudC53YXNDbGVhbiArICJcIiIp
OworCisgICAgaWYgKGV2ZW50cy5sZW5ndGggPT09IGV4cGVjdGVkRXZlbnRzLmxlbmd0aCkKKyAg
ICAgICAgcG9zdE1lc3NhZ2UoIlBBU1M6IGV2ZW50Lmxlbmd0aCBpcyAiICsgZXhwZWN0ZWRFdmVu
dHMubGVuZ3RoKTsKKyAgICBlbHNlCisgICAgICAgIHBvc3RNZXNzYWdlKCJGQUlMOiBldmVudC5s
ZW5ndGggc2hvdWxkIGJlICIgKyBleHBlY3RlZEV2ZW50cy5sZW5ndGggKyAiIGJ1dCB3YXMgXCIi
ICsgZXZlbnRzLmxlbmd0aCArICJcIiIpOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBl
Y3RlZEV2ZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoZXZlbnRzW2ldID09PSBleHBl
Y3RlZEV2ZW50c1tpXSkKKyAgICAgICAgICAgIHBvc3RNZXNzYWdlKCJQQVNTOiBldmVudHNbIiAr
IGkgKyAiXSBpcyBcIiIgKyBleHBlY3RlZEV2ZW50c1tpXSArICJcIiIpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBwb3N0TWVzc2FnZSgiRkFJTDogZXZlbnRzWyIgKyBpICsgIl0gc2hvdWxk
IGJlIFwiIiArIGV4cGVjdGVkRXZlbnRzW2ldICsgIlwiIGJ1dCB3YXMgXCIiICsgZXZlbnRzW2ld
ICsgIlwiIik7CisgICAgfQorCisgICAgcG9zdE1lc3NhZ2UoIkRPTkUiKTsKK307CmRpZmYgLS1n
aXQgYS9MYXlvdXRUZXN0cy9odHRwL3Rlc3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL3dvcmtlcnMv
cmVzb3VyY2VzL25vLW9ubWVzc2FnZS1pbi1zeW5jLW9wX3dzaC5weSBiL0xheW91dFRlc3RzL2h0
dHAvdGVzdHMvd2Vic29ja2V0L3Rlc3RzL2h5Ymkvd29ya2Vycy9yZXNvdXJjZXMvbm8tb25tZXNz
YWdlLWluLXN5bmMtb3Bfd3NoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdhZWUwNjJlNjEyMjhlNjE5ZjNkZDg3
YTA5YzMzZTQ4N2U4OGQ2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9odHRwL3Rl
c3RzL3dlYnNvY2tldC90ZXN0cy9oeWJpL3dvcmtlcnMvcmVzb3VyY2VzL25vLW9ubWVzc2FnZS1p
bi1zeW5jLW9wX3dzaC5weQpAQCAtMCwwICsxLDE4IEBACitmcm9tIG1vZF9weXdlYnNvY2tldCBp
bXBvcnQgaGFuZHNoYWtlCitmcm9tIG1vZF9weXdlYnNvY2tldCBpbXBvcnQgbXNndXRpbAorCisK
K2RlZiB3ZWJfc29ja2V0X2RvX2V4dHJhX2hhbmRzaGFrZShyZXF1ZXN0KToKKyAgICBwYXNzCisK
KworZGVmIHdlYl9zb2NrZXRfdHJhbnNmZXJfZGF0YShyZXF1ZXN0KToKKyAgICAjIFNlbmQgdGhy
ZWUgbWVzc2FnZXMsIGFuZCB0aGVuIHdhaXQgZm9yIHRocmVlIG1lc3NhZ2VzLgorICAgIG1zZ3V0
aWwuc2VuZF9tZXNzYWdlKHJlcXVlc3QsICcxJykKKyAgICBtc2d1dGlsLnNlbmRfbWVzc2FnZShy
ZXF1ZXN0LCAnMicpCisgICAgbXNndXRpbC5zZW5kX21lc3NhZ2UocmVxdWVzdCwgJzMnKQorCisg
ICAgZm9yIGV4cGVjdGVkIGluICh1JzEnLCB1JzInLCB1JzMnKToKKyAgICAgICAgbWVzc2FnZSA9
IG1zZ3V0aWwucmVjZWl2ZV9tZXNzYWdlKHJlcXVlc3QpCisgICAgICAgIGlmIHR5cGUobWVzc2Fn
ZSkgIT0gdW5pY29kZSBvciBtZXNzYWdlICE9IGV4cGVjdGVkOgorICAgICAgICAgICAgcmFpc2Ug
aGFuZHNoYWtlLkFib3J0ZWRCeVVzZXJFeGNlcHRpb24oJ0Fib3J0IHRoZSBjb25uZWN0aW9uJykK
</data>

          </attachment>
      

    </bug>

</bugzilla>