<?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>14524</bug_id>
          
          <creation_ts>2007-07-04 12:01:28 -0700</creation_ts>
          <short_desc>Web Inspector should be usable as a reduction engine</short_desc>
          <delta_ts>2015-08-04 09:41:47 -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>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>REOPENED</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P3</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>18690</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Gavin Sherlock">gsherloc</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>aestes</cc>
    
    <cc>aroben</cc>
    
    <cc>bburg</cc>
    
    <cc>ddkilzer</cc>
    
    <cc>jthoma12</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>5597</commentid>
    <comment_count>0</comment_count>
    <who name="Gavin Sherlock">gsherloc</who>
    <bug_when>2007-07-04 12:01:28 -0700</bug_when>
    <thetext>When I report a bug, I don&apos;t have the skill or the time to make a reduction.  However, if the web inspector allowed me to do this easily, I would be much more likely to make an attempt.  E.g. right clicking on part of a page could have a menu item of &quot;Inspect Element for Reduction&quot;, indicating that the thing you were clicking on had some kind of layout bug.  Then, in docked mode, the Inspector could successively strip away parts of the page, asking you if the layout problem was still visible, with the goal of reducing the page to a bare minimum containing only those parts sufficient and necessary to still show the incorrect behavior (possibly with the original text replaced with lorem ipsum content, for privacy reasons).  It could then let you save the reduced version, for submission to bugzilla.  I&apos;m sure this is non-trivial to engineer, but it sure would be a useful tool.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61380</commentid>
    <comment_count>1</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2007-11-15 22:15:46 -0800</bug_when>
    <thetext>Landed in r27839. http://trac.webkit.org/projects/webkit/changeset/27839</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61381</commentid>
    <comment_count>2</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2007-11-15 22:16:06 -0800</bug_when>
    <thetext>Wrong bug.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61401</commentid>
    <comment_count>3</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2007-11-16 05:51:15 -0800</bug_when>
    <thetext>Instead of manually verifying the bug (e.g., asking the user if the bug still reproduces on each iteration), a JavaScript test method could be used that returns true if the bug still reproduces after a change or false otherwise.

An algorithm similar to the &quot;delta debug&quot; algorithm &lt;http://www.st.cs.uni-sb.de/dd/&gt; could be used with DOM operations such as:

- Removing DOM nodes
- Removing stylesheet rules
- Removing DOM node attributes
- Removing individual properties from style rules (in stylesheets and on DOM nodes)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68679</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-29 11:16:31 -0800</bug_when>
    <thetext>&lt;rdar://problem/5712941&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>80567</commentid>
    <comment_count>5</comment_count>
      <attachid>21184</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2008-05-15 15:22:13 -0700</bug_when>
    <thetext>Created attachment 21184
Stand-alone tool for reducing bugs

Here&apos;s a WIP copy of a tool (a web page) that works on a certain class of test case reductions, e.g., ones that you can easily write a test for using JavaScript.  Repaint issues would not work (because you can&apos;t tell if the repaint failed via JavaScript), but &quot;an element is misplaced on the page&quot; or &quot;an element is too big/too small&quot; issues work well.

Here&apos;s how to use it.

* SETUP
1. Save as &quot;Page Source&quot; the page you want to reduce into the same directory as index.html.
2. Edit pageSource.html to add a &lt;base href=&quot;&quot;&gt; tag with the original URL of the page.
3. Edit &lt;iframe&gt; at bottom of index.html to point to pageSource.html.
4. Edit pageSource.html to add id attributes to &quot;interesting&quot; elements.
5. Open index.html (through a web server or through the file system) in Safari.
6. Write JavaScript code to test for the interesting condition you&apos;re seeing.  (I&apos;ve used offsetTop and offsetLeft with a lot of success to verify the relative position of two elements that I suspect are involved.)  Notes:
- The &quot;document&quot; variable is the document for the iframe, not the document for index.html.
- If you don&apos;t want a node (element or text) to disappear, add a check for it in the test function to make sure false is returned if it&apos;s not found in the DOM.
7. Use the &quot;Verify Test&quot; button to make sure your JavaScript test returns true for the existing web page.

* RUNNING
At this point, you have 3 tools that may be used multiple times in any order to reduce a web page:  &quot;Run Child Node Delta&quot;, &quot;Run Tree Node Delta&quot; and &quot;Run StyleSheet Delta&quot;.  The &quot;View HTML&quot; button pops a JavaScript alert with the current contents of the iframe which you may cut/paste after selecting all (even if it runs off the screen).

&quot;Run Child Node Delta&quot;
This button walks the DOM attempting to remove all child nodes at levels N to M below the document root (&lt;html&gt;) where &quot;N&quot; is the starting level and &quot;M&quot; is the maximum tree depth of the DOM.  It starts at the value in the &quot;Level&quot; input box, so if you&apos;ve run it once, you&apos;ll need to reset it to 1 (or whatever) to run it again.  (Obviously, it only removes the node if the test() method returns true.)

This was the original tool I wrote and works fairly well.  You tend to be left with large single-branch trees due to the nature of the reductions, but those are easily reduced by hand.

Also note that sometimes removing style/link elements will not trigger proper redraws, so it&apos;s useful to start at Level &quot;3&quot; or &quot;4&quot; if the resulting reduction doesn&apos;t reproduce when you reload it.

&quot;Run Tree Node Delta&quot;
This button attempts to reduce the tree depth by removing nodes who have only a single child.  It doesn&apos;t work very well; perhaps it needs to walk child nodes from the bottom of the tree up, or be more intelligent about removing some types of nodes (like tables).

&quot;Run StyleSheet Delta&quot;
This button &quot;flattens&quot; stylesheets used in an HTML document, and replaces all &lt;link&gt; and &lt;style&gt; nodes with local copies of the rules.  Then it iterates through all rules in all stylesheets attempting to remove them as long as the test() method still returns true.

* SAVE THE HTML
When you think the tool has done as much as it can, use the &quot;View HTML&quot; button and copy/paste the HTML into a local file for further reduction.  (Yes, you can actually copy/paste HTMl from the JavaScript dialog in Safari.  Opening a new window with the source would be a bit nicer.)

* NOTES
I&apos;ve used it to reduce test cases for these bugs already:

http://bugs.webkit.org/show_bug.cgi?id=15770
http://bugs.webkit.org/show_bug.cgi?id=15782
http://bugs.webkit.org/show_bug.cgi?id=15831
http://bugs.webkit.org/show_bug.cgi?id=15956

My git repo hash: c00c22539450c2f2b4691b9aaefd779d503516ca</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206252</commentid>
    <comment_count>6</comment_count>
      <attachid>52097</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2010-03-30 16:29:44 -0700</bug_when>
    <thetext>Created attachment 52097
Stand-alone tool for reducing bugs v2

Minor update to work with more secure WebKit that doesn&apos;t leak Element prototypes from the main document into an iframe document.

My git repo hash:  fa965920ffc7b1c7d2f1a35cc23349e2c4b908ff</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265847</commentid>
    <comment_count>7</comment_count>
    <who name="Joe Thomas">jthoma12</who>
    <bug_when>2010-08-17 16:54:30 -0700</bug_when>
    <thetext>This is a very interesting line of work. Perhaps a bookmarklet is in order?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>966998</commentid>
    <comment_count>8</comment_count>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2014-01-12 11:19:57 -0800</bug_when>
    <thetext>This would be way cooler and work better if it could use web replay! :) I don&apos;t know if it would be an inspector feature, standalone, or browser feature though. For now, putting into Tools component.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>21184</attachid>
            <date>2008-05-15 15:22:13 -0700</date>
            <delta_ts>2010-03-30 16:29:44 -0700</delta_ts>
            <desc>Stand-alone tool for reducing bugs</desc>
            <filename>index.html</filename>
            <type>application/x-download</type>
            <size>15837</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgo8dGl0bGU+RGVsdGEgRGVidWdnaW5nIGZvciBXZWIgUGFnZXM8L3RpdGxl
Pgo8c2NyaXB0PgoKdmFyIHRpbWVPdXQgPSAxMDA7IC8vIG1zCnZhciBzdG9wRGVsdGEgPSBmYWxz
ZTsKCi8vCi8vIEhlbHBlciBtZXRob2RzIGZvciB0ZXN0KCkgZnVuY3Rpb24KLy8KCmZ1bmN0aW9u
IG15Q29udGVudERvY3VtZW50KCkKewogICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCJteWlmcmFtZSIpLmNvbnRlbnREb2N1bWVudDsKfQoKRWxlbWVudC5wcm90b3R5cGUueHBvcyA9
IGZ1bmN0aW9uKCkKewogICAgdmFyIHJlc3VsdCA9IDA7CiAgICB2YXIgbm9kZSA9IHRoaXM7CiAg
ICB3aGlsZSAobm9kZS5vZmZzZXRQYXJlbnQpIHsKICAgICAgICByZXN1bHQgKz0gbm9kZS5vZmZz
ZXRMZWZ0ICsgKG5vZGUuY2xpZW50TGVmdCB8fCAwKTsKICAgICAgICBub2RlID0gbm9kZS5vZmZz
ZXRQYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9OwoKRWxlbWVudC5wcm90b3R5cGUu
eXBvcyA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHJlc3VsdCA9IDA7CiAgICB2YXIgbm9kZSA9IHRo
aXM7CiAgICB3aGlsZSAobm9kZS5vZmZzZXRQYXJlbnQpIHsKICAgICAgICByZXN1bHQgKz0gbm9k
ZS5vZmZzZXRUb3AgKyAobm9kZS5jbGllbnRUb3AgfHwgMCk7CiAgICAgICAgbm9kZSA9IG5vZGUu
b2Zmc2V0UGFyZW50OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfTsKCmZ1bmN0aW9uICQoaWQp
CnsKICAgIHJldHVybiBteUNvbnRlbnREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKTsKfQoK
ZnVuY3Rpb24gbG9nKG1zZykKewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUi
KS5pbm5lckhUTUwgPSBtc2c7Cn0KCi8vCi8vIFV0aWxpdHkgbWV0aG9kcwovLwoKZnVuY3Rpb24g
cmVsb2FkVGVzdFBhZ2UoKQp7CiAgICB2YXIgbXlpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgibXlpZnJhbWUiKTsKICAgIG15aWZyYW1lLnNyYyA9ICIiICsgbXlpZnJhbWUuc3JjOwp9
CgpmdW5jdGlvbiBmb3JjZVJlbGF5b3V0KCkKewogICAgdmFyIGlmcmFtZURvY3VtZW50ID0gbXlD
b250ZW50RG9jdW1lbnQoKTsKICAgIGlmIChpZnJhbWVEb2N1bWVudCAmJiBpZnJhbWVEb2N1bWVu
dC5ib2R5KSB7CiAgICAgICAgaWZyYW1lRG9jdW1lbnQuYm9keS5vZmZzZXRUb3A7CiAgICB9Cn0K
CmZ1bmN0aW9uIHRlc3RGdW5jdGlvbigpCnsKICAgIGZvcmNlUmVsYXlvdXQoKTsKICAgIHRyeSB7
CiAgICAgICAgZXZhbCgiZnVuY3Rpb24gdGVzdChkb2N1bWVudCkge1xuIiArIGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJ0ZXN0RnVuY3Rpb24iKS52YWx1ZSArICJcbn0iKTsKICAgICAgICByZXR1
cm4gdGVzdChteUNvbnRlbnREb2N1bWVudCgpKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICB9CiAg
ICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHZlcmlmeVRlc3QoKQp7CiAgICBpZiAodGVzdEZ1
bmN0aW9uKCkpIHsKICAgICAgICBhbGVydCgiU1VDQ0VTUzogUnVubmluZyB0ZXN0KGRvY3VtZW50
KSByZXR1cm5lZCB0cnVlLlxuXG4iICsKICAgICAgICAgICAgICAiU3RhcnQgdGhlIHRlc3QhIik7
CiAgICB9IGVsc2UgewogICAgICAgIGFsZXJ0KCJFUlJPUjogUnVubmluZyB0ZXN0KGRvY3VtZW50
KSByZXR1cm5lZCBmYWxzZS5cblxuIiArCiAgICAgICAgICAgICAgIlBsZWFzZSBhZGp1c3QgdGhl
IHRlc3QgZnVuY3Rpb24gdG8gcmV0dXJuIHRydWVcbiIgKwogICAgICAgICAgICAgICJ3aGVuIHRo
ZSBidWcgcmVwcm9kdWNlcy4iKTsKICAgIH0KfQoKZnVuY3Rpb24gdmlld1Rlc3RQYWdlSFRNTCgp
CnsKICAgIHdpbmRvdy5pZnJhbWVEb2N1bWVudCA9IG15Q29udGVudERvY3VtZW50KCk7CiAgICAv
L2FsZXJ0KHdpbmRvdy5pZnJhbWVEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MKTsK
ICAgIHdpbmRvdy5vcGVuKCJkYXRhOnRleHQvaHRtbCwiICsgd2luZG93LmlmcmFtZURvY3VtZW50
LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwsICJfYmxhbmsiKTsKfQoKLy8KLy8gU3RhY2sgY2xh
c3MKLy8KClN0YWNrID0gZnVuY3Rpb24oKSB7IH07ClN0YWNrLnByb3RvdHlwZS5fX3Byb3RvX18g
PSBBcnJheS5wcm90b3R5cGU7ClN0YWNrLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJ0b3Ai
LCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGggPiAwID8gdGhpcy5sZW5ndGgg
LSAxIDogMF07IH0gKTsKU3RhY2sucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oInRvcCIsIGZ1
bmN0aW9uKHgpIHsgdGhpc1t0aGlzLmxlbmd0aCA+IDAgPyB0aGlzLmxlbmd0aCAtIDEgOiAwXSA9
IHg7IH0gKTsKU3RhY2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImJvdHRvbSIsIGZ1bmN0
aW9uKCkgeyByZXR1cm4gdGhpc1swXTsgfSApOwpTdGFjay5wcm90b3R5cGUuX19kZWZpbmVTZXR0
ZXJfXygiYm90dG9tIiwgZnVuY3Rpb24oeCkgeyB0aGlzWzBdID0geDsgfSApOwoKLy8KLy8gU3R5
bGVTaGVldEZsYXR0ZW5lciBjbGFzcwovLwoKU3R5bGVTaGVldEZsYXR0ZW5lciA9IGZ1bmN0aW9u
KGRvY3VtZW50KQp7CiAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgdGhpcy5fZG9u
ZUZsYXR0ZW5pbmdDYWxsYmFjayA9IGZ1bmN0aW9uKCkgeyB9OwoKICAgIC8vIFN0YXRlIHZhcmli
bGVzIGZvciBfZmxhdHRlblN0eWxlU2hlZXQoKQogICAgdGhpcy5faXNQcm9jZXNzaW5nU3R5bGVT
aGVldCA9IGZhbHNlOwogICAgdGhpcy5fZG9jdW1lbnRTdHlsZVNoZWV0SW5kZXggPSAtMTsKICAg
IHRoaXMuX3J1bGVJbmRleFN0YWNrID0gbmV3IFN0YWNrOwogICAgdGhpcy5fc3R5bGVTaGVldFN0
YWNrID0gbmV3IFN0YWNrOwp9OwoKU3R5bGVTaGVldEZsYXR0ZW5lci5wcm90b3R5cGUgPSB7CiAg
ICBmbGF0dGVuOiBmdW5jdGlvbihjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodGhpcy5fZG9j
dW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICB0aGlzLl9kb25lRmxh
dHRlbmluZ0NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgIHRoaXMuX2lzUHJvY2Vzc2lu
Z1N0eWxlU2hlZXQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRTdHlsZVNoZWV0
SW5kZXggPSAwOwogICAgICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgICAgICAgICBzZXRU
aW1lb3V0KGZ1bmN0aW9uKCkgeyBfc2VsZi5fZmxhdHRlblN0eWxlU2hlZXQoKSB9LCAwKTsKICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMuX2RvbmVGbGF0dGVuaW5n
Q2FsbGJhY2ssIDApOwogICAgICAgIH0KICAgIH0sCgogICAgX2ZsYXR0ZW5TdHlsZVNoZWV0OiBm
dW5jdGlvbigpCiAgICB7CiAgICAgICAgaWYgKCF0aGlzLl9pc1Byb2Nlc3NpbmdTdHlsZVNoZWV0
KSB7CiAgICAgICAgICAgIHRoaXMuX2lzUHJvY2Vzc2luZ1N0eWxlU2hlZXQgPSB0cnVlOwogICAg
ICAgICAgICB0aGlzLl9ydWxlSW5kZXhTdGFjay5wdXNoKC0xKTsKICAgICAgICAgICAgdGhpcy5f
c3R5bGVTaGVldFN0YWNrLnB1c2godGhpcy5fZG9jdW1lbnQuc3R5bGVTaGVldHNbdGhpcy5fZG9j
dW1lbnRTdHlsZVNoZWV0SW5kZXhdKTsKICAgICAgICB9CgogICAgICAgIC8vIFN0YWNrLnRvcCBp
cyBhbHdheXMgdGhlIGN1cnJlbnQgc3R5bGVzaGVldCBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAg
Ly8gU3RhY2suYm90dG9tIGlzIGFsd2F5cyB0aGUgdG9wLWxldmVsIHN0eWxlc2hlZXQgYmVpbmcg
ZmxhdHRlbmVkIGluIHRoZSBkb2N1bWVudC4KICAgICAgICAvLyBUaGV5IG1heSBiZSBvbmUgaW4g
dGhlIHNhbWUuCiAgICAgICAgdmFyIGNvdW50ID0gMDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewog
ICAgICAgICAgICB0aGlzLl9ydWxlSW5kZXhTdGFjay50b3ArKzsKICAgICAgICAgICAgaWYgKHRo
aXMuX3J1bGVJbmRleFN0YWNrLnRvcCA8IHRoaXMuX3N0eWxlU2hlZXRTdGFjay50b3AucnVsZXMu
bGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB2YXIgcnVsZSA9IHRoaXMuX3N0eWxlU2hlZXRTdGFj
ay50b3AucnVsZXNbdGhpcy5fcnVsZUluZGV4U3RhY2sudG9wXTsKICAgICAgICAgICAgICAgIHZh
ciB0eXBlTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChydWxlKTsKICAgICAg
ICAgICAgICAgIGlmICh0eXBlTmFtZS5pbmRleE9mKCJDU1NJbXBvcnRSdWxlIikgPj0gMCAmJiBy
dWxlLnN0eWxlU2hlZXQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdG9wLWxldmVs
IHN0eWxlc2hlZXQgaXMgdGhlIGN1cnJlbnQgc3R5bGVzaGVldCwgZGVsZXRlIHRoZSBAaW1wb3J0
IHJ1bGUKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3R5bGVTaGVldFN0YWNrLmxlbmd0
aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlU2hlZXRTdGFjay5i
b3R0b20uZGVsZXRlUnVsZSh0aGlzLl9ydWxlSW5kZXhTdGFjay5ib3R0b20pOwogICAgICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBuZXcgc3R5bGVzaGVl
dCBhbmQgaW5kZXggb250byB0aGUgc3RhY2tzCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3R5
bGVTaGVldFN0YWNrLnB1c2gocnVsZS5zdHlsZVNoZWV0KTsKICAgICAgICAgICAgICAgICAgICB0
aGlzLl9ydWxlSW5kZXhTdGFjay5wdXNoKC0xKTsKICAgICAgICAgICAgICAgICAgICB2YXIgX3Nl
bGYgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IF9z
ZWxmLl9mbGF0dGVuU3R5bGVTaGVldCgpIH0sIDApOwogICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICAgICAgICAgIC8vIEVsc2UgaWYgdGhpcyBpcyBub3QgdGhlIHRvcC1sZXZlbCBz
dHlsZXNoZWV0LCBpbnNlcnQgdGhlIHJ1bGUgaW50byB0aGUgdG9wLWxldmVsIHN0eWxlc2hlZXQK
ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3R5bGVTaGVldFN0YWNrLmxlbmd0aCA+
IDEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogV29yayBhcm91bmQgQnVnIDE1OTg2
IDxodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTk4Nj4KICAgICAgICAg
ICAgICAgICAgICAvLyBEeW5hbWljYWxseSBpbnNlcnRpbmcgQ1NTIHJ1bGUgd2l0aCBAbWVkaWEg
cXVlcnkgZmFpbHMgd2l0aCBET00gRXhjZXB0aW9uIDEyCiAgICAgICAgICAgICAgICAgICAgaWYg
KHJ1bGUuY3NzVGV4dC5pbmRleE9mKCJAbWVkaWEiKSA8IDApIHsKICAgICAgICAgICAgICAgICAg
ICAgICAgdGhpcy5fc3R5bGVTaGVldFN0YWNrLmJvdHRvbS5pbnNlcnRSdWxlKHJ1bGUuY3NzVGV4
dCwgdGhpcy5fcnVsZUluZGV4U3RhY2suYm90dG9tKTsKICAgICAgICAgICAgICAgICAgICAgICAg
dGhpcy5fcnVsZUluZGV4U3RhY2suYm90dG9tKys7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoIlNraXBwaW5nIEBtZWRpYSBydWxlIChm
aXggQnVnIDE1OTg2ISk6XG4iICsgcnVsZS5jc3NUZXh0KTsKICAgICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLl9y
dWxlSW5kZXhTdGFjay50b3AgPj0gdGhpcy5fc3R5bGVTaGVldFN0YWNrLnRvcC5ydWxlcy5sZW5n
dGggLSAxKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZVNoZWV0U3RhY2sucG9wKCk7CiAg
ICAgICAgICAgICAgICB0aGlzLl9ydWxlSW5kZXhTdGFjay5wb3AoKTsKICAgICAgICAgICAgICAg
IGlmICh0aGlzLl9zdHlsZVNoZWV0U3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0
aGUgdG9wLWxldmVsIHJ1bGUgaW5kZXggYWx3YXlzIHBvaW50cyBhdCB0aGUgIm5leHQiIHJ1bGUs
CiAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IHN1YnRyYWN0IG9uZSBmcm9tIHRoZSBydWxlIGlu
ZGV4IGFmdGVyIGl0IGJlY29tZXMgdGhlIHRvcAogICAgICAgICAgICAgICAgLy8gc3R5bGVzaGVl
dCBvbiB0aGUgc3RhY2sgYmVmb3JlIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIHN0YXJ0cy4KICAg
ICAgICAgICAgICAgIGlmICh0aGlzLl9zdHlsZVNoZWV0U3RhY2subGVuZ3RoID09IDEpIHsKICAg
ICAgICAgICAgICAgICAgICB0aGlzLl9ydWxlSW5kZXhTdGFjay5ib3R0b20tLTsKICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY291bnQrKzsKCiAgICAgICAgICAg
IC8vIElmIHdlJ3JlIG5vdCBwcm9jZXNzaW5nIHRoZSB0b3AtbGV2ZWwgc3R5bGVzaGVldCwKICAg
ICAgICAgICAgLy8gbWFrZSBTYWZhcmkgbW9yZSByZXNwb25zaXZlIGJ5IHVzaW5nIHNldFRpbWVv
dXQoKS4KICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlU2hlZXRTdGFjay5sZW5ndGggPiAxICYm
IGNvdW50ID49IDEwKSB7CiAgICAgICAgICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgICAg
ICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgX3NlbGYuX2ZsYXR0ZW5TdHlsZVNoZWV0
KCkgfSwgMCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9
CgogICAgICAgIHRoaXMuX2lzUHJvY2Vzc2luZ1N0eWxlU2hlZXQgPSBmYWxzZTsKICAgICAgICB0
aGlzLl9kb2N1bWVudFN0eWxlU2hlZXRJbmRleCsrOwogICAgICAgIGlmICh0aGlzLl9kb2N1bWVu
dFN0eWxlU2hlZXRJbmRleCA8IHRoaXMuX2RvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCkgewog
ICAgICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0
aW9uKCkgeyBfc2VsZi5fZmxhdHRlblN0eWxlU2hlZXQoKSB9LCB0aW1lT3V0KTsKICAgICAgICB9
IGVsc2UgewogICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMuX2RvbmVGbGF0dGVuaW5nQ2FsbGJh
Y2ssIDApOwogICAgICAgIH0KICAgIH0sCn0KCmZ1bmN0aW9uIGZsYXR0ZW5TdHlsZVNoZWV0cyhv
bmx5RmxhdHRlbkFuZFJlcGxhY2UpCnsKICAgIHZhciBmbGF0dGVuZXIgPSBuZXcgU3R5bGVTaGVl
dEZsYXR0ZW5lcihteUNvbnRlbnREb2N1bWVudCgpKTsKICAgIGZsYXR0ZW5lci5mbGF0dGVuKCJy
ZXBsYWNlU3R5bGVTaGVldHMoIiArIG9ubHlGbGF0dGVuQW5kUmVwbGFjZSArICIpIik7Cn0KCmZ1
bmN0aW9uIHN0eWxlU2hlZXRUb1N0cmluZyhzaGVldCkKewogICAgdmFyIHJ1bGVUZXh0ID0gIiI7
CiAgICBpZiAoc2hlZXQgJiYgc2hlZXQucnVsZXMgJiYgc2hlZXQucnVsZXMubGVuZ3RoID4gMCkg
ewogICAgICAgIHZhciBydWxlcyA9IHNoZWV0LnJ1bGVzOwogICAgICAgIGZvciAodmFyIGogPSAw
OyBqIDwgcnVsZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgcnVsZVRleHQgKz0gcnVsZXNb
al0uY3NzVGV4dCArICJcbiI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJ1bGVUZXh0Owp9
CgpmdW5jdGlvbiByZXBsYWNlU3R5bGVTaGVldHMob25seUZsYXR0ZW5BbmRSZXBsYWNlKQp7CiAg
ICB3aW5kb3cuaWZyYW1lRG9jdW1lbnQgPSBteUNvbnRlbnREb2N1bWVudCgpOwogICAgdmFyIHNo
ZWV0cyA9IHdpbmRvdy5pZnJhbWVEb2N1bWVudC5zdHlsZVNoZWV0czsKICAgIGxvZygiUmVwbGFj
aW5nICIgKyBzaGVldHMubGVuZ3RoICsgIiBzdHlsZXNoZWV0cy4uLiIpOwogICAgdmFyIG5ld1No
ZWV0cyA9IG5ldyBBcnJheTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2hlZXRzLmxlbmd0aDsg
aSsrKSB7CiAgICAgICAgdmFyIHNoZWV0ID0gc2hlZXRzW2ldOwogICAgICAgIHZhciBvbGRTdHls
ZSA9IHNoZWV0Lm93bmVyTm9kZTsKICAgICAgICB2YXIgcGFyZW50ID0gb2xkU3R5bGUucGFyZW50
OwogICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgIHZhciBuZXdTdHlsZSA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgICAgIG5ld1N0eWxlLnR5cGUgPSAi
dGV4dC9jc3MiOwogICAgICAgICAgICBuZXdTdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlU2hlZXRU
b1N0cmluZyhzaGVldCk7CiAgICAgICAgICAgIG5ld1NoZWV0c1tuZXdTaGVldHMubGVuZ3RoXSA9
IG5ld1N0eWxlOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBSZW1vdmUgb2xkIDxzdHlsZT4gYW5k
IDxsaW5rPiB0YWdzCiAgICB2YXIgb2xkU3R5bGVzID0gd2luZG93LmlmcmFtZURvY3VtZW50Lmdl
dEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpOwogICAgZm9yICh2YXIgaSA9IG9sZFN0eWxlcy5s
ZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIHZhciBwYXJlbnQgPSBvbGRTdHlsZXNb
aV0ucGFyZW50Tm9kZTsKICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQob2xkU3R5bGVzW2ldKTsK
ICAgIH0KCiAgICB2YXIgb2xkTGlua3MgPSB3aW5kb3cuaWZyYW1lRG9jdW1lbnQuZ2V0RWxlbWVu
dHNCeVRhZ05hbWUoImxpbmsiKTsKICAgIGZvciAodmFyIGkgPSBvbGRMaW5rcy5sZW5ndGggLSAx
OyBpID49IDA7IGktLSkgewogICAgICAgIHZhciBvbGRMaW5rID0gb2xkTGlua3NbaV07CiAgICAg
ICAgaWYgKG9sZExpbmsucmVsLnRvTG93ZXJDYXNlKCkgPT0gInN0eWxlc2hlZXQiIHx8IG9sZExp
bmsudHlwZS50b0xvd2VyQ2FzZSgpID09ICJ0ZXh0L2NzcyIpIHsKICAgICAgICAgICAgdmFyIHBh
cmVudCA9IG9sZExpbmsucGFyZW50Tm9kZTsKICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxk
KG9sZExpbmspOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgbmV3IHN0eWxlc2hlZXRzIHRv
IERPTQogICAgdmFyIGhlYWQgPSB3aW5kb3cuaWZyYW1lRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRh
Z05hbWUoImhlYWQiKVswXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3U2hlZXRzLmxlbmd0
aDsgaSsrKSB7CiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChuZXdTaGVldHNbaV0pOwogICAgfQoK
ICAgIGlmIChvbmx5RmxhdHRlbkFuZFJlcGxhY2UpIHsKICAgICAgICBsb2coIkRvbmUgZmxhdHRl
bmluZyBzdHlsZXNoZWV0cy4iKTsKICAgICAgICB2aWV3VGVzdFBhZ2VIVE1MKCk7CiAgICAgICAg
cmV0dXJuOwogICAgfQoKICAgIC8vIEJlZ2luIGxvb3BpbmcgdGhyb3VnaCBzdHlsZXNoZWV0cyBh
bmQgdGhlaXIgcnVsZXMgdXNpbmcgcnVuU3R5bGVEZWx0YSgpCiAgICB3aW5kb3cuaSA9IHdpbmRv
dy5pZnJhbWVEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGggLSAxOwogICAgaWYgKHdpbmRvdy5p
IDwgMCkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy5qID0gd2luZG93LmlmcmFt
ZURvY3VtZW50LnN0eWxlU2hlZXRzW3dpbmRvdy5pXS5ydWxlcy5sZW5ndGg7CgogICAgbG9nKCJS
dW5uaW5nIHN0eWxlc2hlZXQgZGVsdGEuLi4iKTsKICAgIHNldFRpbWVvdXQoInJ1blN0eWxlRGVs
dGEoKSIsIHRpbWVPdXQpOwp9CgpmdW5jdGlvbiBydW5TdHlsZURlbHRhKCkKewogICAgaWYgKHdp
bmRvdy5zdG9wRGVsdGEpIHJldHVybjsKCiAgICB3aW5kb3cuaWZyYW1lRG9jdW1lbnQgPSBteUNv
bnRlbnREb2N1bWVudCgpOwogICAgd2luZG93LmotLTsKICAgIGlmICh3aW5kb3cuaiA+PSAwKSB7
CiAgICAgICAgd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdHlsZXNoZWV0IikudmFs
dWUgPSB3aW5kb3cuaTsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJ1
bGUiKS52YWx1ZSA9IHdpbmRvdy5qOwogICAgICAgIHZhciBzaGVldCA9IHdpbmRvdy5pZnJhbWVE
b2N1bWVudC5zdHlsZVNoZWV0c1t3aW5kb3cuaV07CgogICAgICAgIC8vIFJlbW92ZSBydWxlCiAg
ICAgICAgdmFyIHJ1bGUgPSBzaGVldC5ydWxlc1t3aW5kb3cual07CgogICAgICAgIC8vIEZJWE1F
OiBXb3JrIGFyb3VuZCBCdWcgMTU5ODYgPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE1OTg2PgogICAgICAgIC8vIER5bmFtaWNhbGx5IGluc2VydGluZyBDU1MgcnVsZSB3
aXRoIEBtZWRpYSBxdWVyeSBmYWlscyB3aXRoIERPTSBFeGNlcHRpb24gMTIKICAgICAgICBpZiAo
cnVsZS5jc3NUZXh0LmluZGV4T2YoIkBtZWRpYSIpIDwgMCkgewogICAgICAgICAgICAgICAgc2hl
ZXQuZGVsZXRlUnVsZSh3aW5kb3cuaik7CgogICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBydWxl
IGlmIHRlc3QgZmFpbGVkCiAgICAgICAgICAgICAgICBpZiAoIXRlc3RGdW5jdGlvbigpKSB7CiAg
ICAgICAgICAgICAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShydWxlLmNzc1RleHQsIHdpbmRvdy5q
KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhbGVydCgi
U2tpcHBpbmcgQG1lZGlhIHJ1bGUgKGZpeCBCdWcgMTU5ODYhKTpcbiIgKyBydWxlLmNzc1RleHQp
OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoaiA8PSAwKSB7CiAgICAgICAgLy8gUmVwbGFjZSB0
aGUgZXhpc3Rpbmcgc3R5bGVzaGVldCBzaW5jZSBpdHMgY29udGVudCBkb2Vzbid0IHVwZGF0ZSBk
eW5hbWljYWxseQogICAgICAgIGlmIChzaGVldCkgewogICAgICAgICAgICB2YXIgbmV3U3R5bGUg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgICAgICBuZXdTdHlsZS50
eXBlID0gInRleHQvY3NzIjsKICAgICAgICAgICAgbmV3U3R5bGUudGV4dENvbnRlbnQgPSBzdHls
ZVNoZWV0VG9TdHJpbmcoc2hlZXQpOwogICAgICAgICAgICB2YXIgb2xkU3R5bGUgPSBzaGVldC5v
d25lck5vZGU7CiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBvbGRTdHlsZS5wYXJlbnROb2RlOwog
ICAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKG5ld1N0eWxlLCBvbGRTdHlsZSk7CiAgICAg
ICAgfQoKICAgICAgICB3aW5kb3cuaS0tOwogICAgICAgIGlmIChpIDwgMCkgewogICAgICAgICAg
ICBsb2coIlJ1bm5pbmcgc3R5bGVzaGVldCBkZWx0YS4uLmRvbmUuIik7CiAgICAgICAgICAgIHZp
ZXdUZXN0UGFnZUhUTUwoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB3
aW5kb3cuaiA9IHdpbmRvdy5pZnJhbWVEb2N1bWVudC5zdHlsZVNoZWV0c1t3aW5kb3cuaV0ucnVs
ZXMubGVuZ3RoOwogICAgfQoKICAgIHNldFRpbWVvdXQoInJ1blN0eWxlRGVsdGEoKSIsIHRpbWVP
dXQpOwp9CgpmdW5jdGlvbiBydW5EZWx0YShkZWx0YUZ1bmN0aW9uKQp7CiAgICB2YXIgbGV2ZWwg
PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGV2ZWwiKS52YWx1ZTsKICAgIHdpbmRvdy5pZnJh
bWVEb2N1bWVudCA9IG15Q29udGVudERvY3VtZW50KCk7CgogICAgd2luZG93Lm5vZGVzID0gbmV3
IEFycmF5OwogICAgd2luZG93Lm5vZGVzWzBdID0gd2luZG93LmlmcmFtZURvY3VtZW50LmRvY3Vt
ZW50RWxlbWVudDsKICAgIGZvciAodmFyIGwgPSAxOyBsIDw9IGxldmVsOyBsKyspIHsKICAgICAg
ICB2YXIgbmV4dE5vZGVzID0gbmV3IEFycmF5OwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwg
d2luZG93Lm5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHdp
bmRvdy5ub2Rlc1tqXS5jaGlsZE5vZGVzOwogICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8
IGNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICBuZXh0Tm9kZXNbbmV4dE5v
ZGVzLmxlbmd0aF0gPSBjaGlsZHJlbltrXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAg
ICB3aW5kb3cubm9kZXMgPSBuZXh0Tm9kZXM7CiAgICB9CgogICAgLy8gQmVnaW4gbG9vcGluZyB0
aHJvdWdoIGNoaWxkIG5vZGVzIHVzaW5nIGRlbHRhQ2hpbGROb2RlcygpCiAgICB3aW5kb3cuaSA9
IHdpbmRvdy5ub2Rlcy5sZW5ndGg7CgogICAgaWYgKHdpbmRvdy5pID4gMCkgewogICAgICAgIHdp
bmRvdy5zdG9wRGVsdGEgPSBmYWxzZTsKICAgICAgICBzZXRUaW1lb3V0KGRlbHRhRnVuY3Rpb24s
IHRpbWVPdXQpOwogICAgfSBlbHNlIHsKICAgICAgICB2aWV3VGVzdFBhZ2VIVE1MKCk7CiAgICB9
Cn0KCmZ1bmN0aW9uIGRlbHRhQ2hpbGROb2RlcygpCnsKICAgIGlmICh3aW5kb3cuc3RvcERlbHRh
KSByZXR1cm47CgogICAgd2luZG93LmktLTsKICAgIGlmICh3aW5kb3cuaSA8IDApIHsKICAgICAg
ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGV2ZWwiKS52YWx1ZSA9IDEgKyBwYXJzZUludChk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGV2ZWwiKS52YWx1ZSk7CiAgICAgICAgc2V0VGltZW91
dCgicnVuRGVsdGEoJ2RlbHRhQ2hpbGROb2RlcygpJykiLCB0aW1lT3V0KTsKICAgICAgICByZXR1
cm47CiAgICB9CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hpbGQiKS52YWx1ZSA9IHdp
bmRvdy5pOwoKICAgIC8vIFJlbW92ZSBub2RlCiAgICB2YXIgbm9kZSA9IHdpbmRvdy5ub2Rlc1t3
aW5kb3cuaV07CiAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOwogICAgdmFyIG5leHQg
PSBub2RlLm5leHRTaWJsaW5nOwogICAgbm9kZSA9IHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsK
CiAgICAvLyBSZXN0b3JlIG5vZGUgaWYgdGVzdCBmYWlsZWQKICAgIGlmICghdGVzdEZ1bmN0aW9u
KCkpIHsKICAgICAgICBpZiAobmV4dCkgewogICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3Jl
KG5vZGUsIG5leHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRD
aGlsZChub2RlKTsKICAgICAgICB9CiAgICB9CgogICAgc2V0VGltZW91dCgiZGVsdGFDaGlsZE5v
ZGVzKCkiLCB0aW1lT3V0KTsKfQoKZnVuY3Rpb24gZGVsdGFUcmVlTm9kZXMoKQp7CiAgICBpZiAo
d2luZG93LnN0b3BEZWx0YSkgcmV0dXJuOwoKLy8gRklYTUU6IE5lZWRzIHRvIGJlIHNtYXJ0ZXIg
YWJvdXQgcmVtb3ZpbmcgdGFibGVzIGFuZCB0YWJsZSBzdHJ1Y3R1cmVzPwogICAgd2luZG93Lmkt
LTsKICAgIGlmICh3aW5kb3cuaSA8IDApIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJ
ZCgibGV2ZWwiKS52YWx1ZSA9IDEgKyBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi
bGV2ZWwiKS52YWx1ZSk7CiAgICAgICAgc2V0VGltZW91dCgicnVuRGVsdGEoJ2RlbHRhVHJlZU5v
ZGVzKCknKSIsIHRpbWVPdXQpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgbm9kZSA9
IHdpbmRvdy5ub2Rlc1t3aW5kb3cuaV07CiAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2Rl
OwogICAgaWYgKHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgdmFyIGNo
aWxkcmVuID0gbmV3IEFycmF5OwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm9kZS5jaGls
ZE5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGNoaWxkcmVuW2pdID0gbm9kZS5jaGls
ZE5vZGVzW2pdOwogICAgICAgIH0KICAgICAgICBub2RlID0gcGFyZW50LnJlbW92ZUNoaWxkKG5v
ZGUpOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsK
ICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGRyZW5b
al0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0ZXN0RnVuY3Rpb24oKSkgewogICAgICAgICAg
ICBmb3IgKHZhciBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAg
ICAgICB2YXIgY2hpbGROb2RlID0gcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkcmVuW2pdKTsKICAg
ICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTsKICAgICAgICAgICAgfQog
ICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgfQogICAgfQoKICAg
IHNldFRpbWVvdXQoImRlbHRhVHJlZU5vZGVzKCkiLCB0aW1lT3V0KTsKfQoKPC9zY3JpcHQ+Cjwv
aGVhZD4KPGJvZHk+Cgo8ZGl2Pgo8Y29kZT5mdW5jdGlvbiB0ZXN0KGRvY3VtZW50KTwvY29kZT48
YnI+Cjxjb2RlPns8L2NvZGU+PGJyPgo8Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L2Nv
ZGU+Cjx0ZXh0YXJlYSBpZD0idGVzdEZ1bmN0aW9uIiBjb2xzPSI4MCIgcm93cz0iMjAiIHN0eWxl
PSJmb250LWZhbWlseTogQ291cmllciwnQ291cmllciBOZXcnLGZpeGVkOyBmb250LXNpemU6IDEz
cHg7Ij4KLy8gUmV0dXJuIHRydWUgd2hlbiB0aGUgYnVnIHJlcHJvZHVjZXMsIGVsc2UgZmFsc2Uu
Ci8vIFRpcHM6Ci8vIC0gQXJndW1lbnQgJ2RvY3VtZW50JyBpcyB0aGUgZG9jdW1lbnQgZWxlbWVu
dCBmb3IgdGhlIHRlc3QgcGFnZS4KLy8gLSBVc2UgJCgnaWQnKSBpbnN0ZWFkIG9mIGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCdpZCcpLgovLyAtIFRvIGdldCB0aGUgeCBvciB5IHBvc2l0aW9uIG9m
IGFuIGVsZW1lbnQsIHVzZSBlbGVtLnhwb3MoKSBvciBlbGVtLnlwb3MoKS4KLy8gLSBXcml0ZSB0
byB0aGUgY29uc29sZSB1c2luZyBsb2coJycpLgp2YXIgaSA9ICQoJ2tydWdsZVF1ZXJ5Jyk7Cmlm
ICghaSkgeyByZXR1cm4gZmFsc2U7IH0KdmFyIGYgPSAkKCdrcnVnbGVGb3JtJyk7CmlmICghZikg
eyByZXR1cm4gZmFsc2U7IH0KCmxvZygiaTogIiArIGkueXBvcygpICsgIiA6OiBmOiIgKyBmLnlw
b3MoKSk7CgpyZXR1cm4gZi55cG9zKCkgPCBpLnlwb3MoKSAmJiAoaS55cG9zKCkgLSBmLnlwb3Mo
KSkgPj0gMzA7CjwvdGV4dGFyZWE+PGJyPgo8Y29kZT59PC9jb2RlPgo8L2Rpdj4KCjxkaXY+IFNl
dHVwOgo8YnV0dG9uIG9uY2xpY2s9InZlcmlmeVRlc3QoKSI+VmVyaWZ5IFRlc3Q8L2J1dHRvbj4K
PGJ1dHRvbiBvbmNsaWNrPSJyZWxvYWRUZXN0UGFnZSgpIj5SZWxvYWQgVGVzdCBQYWdlPC9idXR0
b24+CjxidXR0b24gb25jbGljaz0id2luZG93LnN0b3BEZWx0YSA9IHRydWU7Ij5TdG9wIERlbHRh
PC9idXR0b24+CjwvZGl2PgoKPGRpdj5Db25zb2xlOiA8ZGl2IGlkPSJjb25zb2xlIiBzdHlsZT0i
ZGlzcGxheTogaW5saW5lOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOyBwYWRkaW5nOiAwcHgg
NHB4IDBweCA0cHg7Ij48L2Rpdj48L2Rpdj4KCjxkaXY+CkxldmVsOiA8aW5wdXQgaWQ9ImxldmVs
IiB0eXBlPSJ0ZXh0IiBzaXplPSIzIiB2YWx1ZT0iMSI+CkNoaWxkOiA8aW5wdXQgaWQ9ImNoaWxk
IiB0eXBlPSJ0ZXh0IiBzaXplPSI1IiByZWFkb25seT0icmVhZG9ubHkiPgombmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsKU3R5bGVTaGVldDogPGlucHV0IGlkPSJzdHlsZXNoZWV0IiB0eXBl
PSJ0ZXh0IiBzaXplPSIzIiByZWFkb25seT0icmVhZG9ubHkiPgpSdWxlOiA8aW5wdXQgaWQ9InJ1
bGUiIHR5cGU9InRleHQiIHNpemU9IjUiIHJlYWRvbmx5PSJyZWFkb25seSI+CjwvZGl2PgoKPGRp
dj4KQWN0aW9uczoKPGJ1dHRvbiBvbmNsaWNrPSJydW5EZWx0YSgnZGVsdGFDaGlsZE5vZGVzKCkn
KSI+UnVuIENoaWxkIE5vZGUgRGVsdGE8L2J1dHRvbj4KPGJ1dHRvbiBvbmNsaWNrPSJydW5EZWx0
YSgnZGVsdGFUcmVlTm9kZXMoKScpIj5SdW4gVHJlZSBOb2RlIERlbHRhPC9idXR0b24+CjxidXR0
b24gb25jbGljaz0iZmxhdHRlblN0eWxlU2hlZXRzKGZhbHNlKSI+UnVuIFN0eWxlU2hlZXQgRGVs
dGE8L2J1dHRvbj4KPGJ1dHRvbiBvbmNsaWNrPSJmbGF0dGVuU3R5bGVTaGVldHModHJ1ZSkiPkZs
YXR0ZW4gU3R5bGVTaGVldHM8L2J1dHRvbj4KPGJ1dHRvbiBvbmNsaWNrPSJ2aWV3VGVzdFBhZ2VI
VE1MKCkiPlZpZXcgVGVzdCBQYWdlIEhUTUw8L2J1dHRvbj4KPC9kaXY+Cgo8ZGl2Pgo8aWZyYW1l
IGlkPSJteWlmcmFtZSIgc3JjPSJyZWR1Y2UuaHRtbCIgc3R5bGU9IndpZHRoOiAxMDAwcHg7IGhl
aWdodDogNDAwcHg7Ij48L2lmcmFtZT4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>52097</attachid>
            <date>2010-03-30 16:29:44 -0700</date>
            <delta_ts>2010-03-30 16:29:44 -0700</delta_ts>
            <desc>Stand-alone tool for reducing bugs v2</desc>
            <filename>index.html</filename>
            <type>application/x-download</type>
            <size>16142</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgo8dGl0bGU+RGVsdGEgRGVidWdnaW5nIGZvciBXZWIgUGFnZXM8L3RpdGxl
Pgo8c2NyaXB0PgoKdmFyIHRpbWVPdXQgPSAxMDA7IC8vIG1zCnZhciBzdG9wRGVsdGEgPSBmYWxz
ZTsKCi8vCi8vIEhlbHBlciBtZXRob2RzIGZvciB0ZXN0KCkgZnVuY3Rpb24KLy8KCmZ1bmN0aW9u
IG15Q29udGVudERvY3VtZW50KCkKewogICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCJteWlmcmFtZSIpLmNvbnRlbnREb2N1bWVudDsKfQoKRWxlbWVudC5wcm90b3R5cGUueHBvcyA9
IGZ1bmN0aW9uKCkKewogICAgdmFyIHJlc3VsdCA9IDA7CiAgICB2YXIgbm9kZSA9IHRoaXM7CiAg
ICB3aGlsZSAobm9kZS5vZmZzZXRQYXJlbnQpIHsKICAgICAgICByZXN1bHQgKz0gbm9kZS5vZmZz
ZXRMZWZ0ICsgKG5vZGUuY2xpZW50TGVmdCB8fCAwKTsKICAgICAgICBub2RlID0gbm9kZS5vZmZz
ZXRQYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9OwoKRWxlbWVudC5wcm90b3R5cGUu
eXBvcyA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHJlc3VsdCA9IDA7CiAgICB2YXIgbm9kZSA9IHRo
aXM7CiAgICB3aGlsZSAobm9kZS5vZmZzZXRQYXJlbnQpIHsKICAgICAgICByZXN1bHQgKz0gbm9k
ZS5vZmZzZXRUb3AgKyAobm9kZS5jbGllbnRUb3AgfHwgMCk7CiAgICAgICAgbm9kZSA9IG5vZGUu
b2Zmc2V0UGFyZW50OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfTsKCmZ1bmN0aW9uICQoaWQp
CnsKICAgIHJldHVybiBteUNvbnRlbnREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKTsKfQoK
ZnVuY3Rpb24gbG9nKG1zZykKewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUi
KS5pbm5lckhUTUwgPSBtc2c7Cn0KCi8vCi8vIFV0aWxpdHkgbWV0aG9kcwovLwoKZnVuY3Rpb24g
cmVsb2FkVGVzdFBhZ2UoKQp7CiAgICB2YXIgbXlpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgibXlpZnJhbWUiKTsKICAgIG15aWZyYW1lLnNyYyA9ICIiICsgbXlpZnJhbWUuc3JjOwp9
CgpmdW5jdGlvbiBmb3JjZVJlbGF5b3V0KCkKewogICAgdmFyIGlmcmFtZURvY3VtZW50ID0gbXlD
b250ZW50RG9jdW1lbnQoKTsKICAgIGlmIChpZnJhbWVEb2N1bWVudCAmJiBpZnJhbWVEb2N1bWVu
dC5ib2R5KSB7CiAgICAgICAgaWZyYW1lRG9jdW1lbnQuYm9keS5vZmZzZXRUb3A7CiAgICB9Cn0K
CmZ1bmN0aW9uIGluamVjdEVsZW1lbnRQcm90b3R5cGVzKCkKewogICAgdmFyIGRvYyA9IG15Q29u
dGVudERvY3VtZW50KCk7CiAgICBpZiAoIWRvYykgewogICAgICAgIGFsZXJ0KCJFbGVtZW50IHBy
b3RvdHlwZSBpbmplY3Rpb24gZmFpbGVkLiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB2
YXIgc2NyaXB0RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgIHNjcmlw
dEVsZW1lbnQuaW5uZXJUZXh0ID0KICAgICAgICAiRWxlbWVudC5wcm90b3R5cGUueHBvcyA9ICIg
KyBFbGVtZW50LnByb3RvdHlwZS54cG9zICsgIjtcbiIgKwogICAgICAgICJFbGVtZW50LnByb3Rv
dHlwZS55cG9zID0gIiArIEVsZW1lbnQucHJvdG90eXBlLnlwb3MgKyAiOyI7IAogICAgZG9jLmJv
ZHkuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7CiAgICBkb2MuYm9keS5yZW1vdmVDaGlsZChz
Y3JpcHRFbGVtZW50KTsKfQoKZnVuY3Rpb24gdGVzdEZ1bmN0aW9uKCkKewogICAgZm9yY2VSZWxh
eW91dCgpOwogICAgdHJ5IHsKICAgICAgICBldmFsKCJmdW5jdGlvbiB0ZXN0KGRvY3VtZW50KSB7
XG4iICsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3RGdW5jdGlvbiIpLnZhbHVlICsgIlxu
fSIpOwogICAgICAgIHJldHVybiB0ZXN0KG15Q29udGVudERvY3VtZW50KCkpOwogICAgfSBjYXRj
aCAoZXgpIHsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdmVyaWZ5VGVzdCgp
CnsKICAgIGlmICh0ZXN0RnVuY3Rpb24oKSkgewogICAgICAgIGFsZXJ0KCJTVUNDRVNTOiBSdW5u
aW5nIHRlc3QoZG9jdW1lbnQpIHJldHVybmVkIHRydWUuXG5cbiIgKwogICAgICAgICAgICAgICJT
dGFydCB0aGUgdGVzdCEiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYWxlcnQoIkVSUk9SOiBSdW5u
aW5nIHRlc3QoZG9jdW1lbnQpIHJldHVybmVkIGZhbHNlLlxuXG4iICsKICAgICAgICAgICAgICAi
UGxlYXNlIGFkanVzdCB0aGUgdGVzdCBmdW5jdGlvbiB0byByZXR1cm4gdHJ1ZVxuIiArCiAgICAg
ICAgICAgICAgIndoZW4gdGhlIGJ1ZyByZXByb2R1Y2VzLiIpOwogICAgfQp9CgpmdW5jdGlvbiB2
aWV3VGVzdFBhZ2VIVE1MKCkKewogICAgd2luZG93LmlmcmFtZURvY3VtZW50ID0gbXlDb250ZW50
RG9jdW1lbnQoKTsKICAgIC8vYWxlcnQod2luZG93LmlmcmFtZURvY3VtZW50LmRvY3VtZW50RWxl
bWVudC5vdXRlckhUTUwpOwogICAgd2luZG93Lm9wZW4oImRhdGE6dGV4dC9odG1sLCIgKyB3aW5k
b3cuaWZyYW1lRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCwgIl9ibGFuayIpOwp9
CgovLwovLyBTdGFjayBjbGFzcwovLwoKU3RhY2sgPSBmdW5jdGlvbigpIHsgfTsKU3RhY2sucHJv
dG90eXBlLl9fcHJvdG9fXyA9IEFycmF5LnByb3RvdHlwZTsKU3RhY2sucHJvdG90eXBlLl9fZGVm
aW5lR2V0dGVyX18oInRvcCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCA+
IDAgPyB0aGlzLmxlbmd0aCAtIDEgOiAwXTsgfSApOwpTdGFjay5wcm90b3R5cGUuX19kZWZpbmVT
ZXR0ZXJfXygidG9wIiwgZnVuY3Rpb24oeCkgeyB0aGlzW3RoaXMubGVuZ3RoID4gMCA/IHRoaXMu
bGVuZ3RoIC0gMSA6IDBdID0geDsgfSApOwpTdGFjay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJf
XygiYm90dG9tIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzWzBdOyB9ICk7ClN0YWNrLnByb3Rv
dHlwZS5fX2RlZmluZVNldHRlcl9fKCJib3R0b20iLCBmdW5jdGlvbih4KSB7IHRoaXNbMF0gPSB4
OyB9ICk7CgovLwovLyBTdHlsZVNoZWV0RmxhdHRlbmVyIGNsYXNzCi8vCgpTdHlsZVNoZWV0Rmxh
dHRlbmVyID0gZnVuY3Rpb24oZG9jdW1lbnQpCnsKICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1l
bnQ7CiAgICB0aGlzLl9kb25lRmxhdHRlbmluZ0NhbGxiYWNrID0gZnVuY3Rpb24oKSB7IH07Cgog
ICAgLy8gU3RhdGUgdmFyaWJsZXMgZm9yIF9mbGF0dGVuU3R5bGVTaGVldCgpCiAgICB0aGlzLl9p
c1Byb2Nlc3NpbmdTdHlsZVNoZWV0ID0gZmFsc2U7CiAgICB0aGlzLl9kb2N1bWVudFN0eWxlU2hl
ZXRJbmRleCA9IC0xOwogICAgdGhpcy5fcnVsZUluZGV4U3RhY2sgPSBuZXcgU3RhY2s7CiAgICB0
aGlzLl9zdHlsZVNoZWV0U3RhY2sgPSBuZXcgU3RhY2s7Cn07CgpTdHlsZVNoZWV0RmxhdHRlbmVy
LnByb3RvdHlwZSA9IHsKICAgIGZsYXR0ZW46IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgewogICAg
ICAgIGlmICh0aGlzLl9kb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGggPiAwKSB7CiAgICAgICAg
ICAgIHRoaXMuX2RvbmVGbGF0dGVuaW5nQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICAgICAg
dGhpcy5faXNQcm9jZXNzaW5nU3R5bGVTaGVldCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9k
b2N1bWVudFN0eWxlU2hlZXRJbmRleCA9IDA7CiAgICAgICAgICAgIHZhciBfc2VsZiA9IHRoaXM7
CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IF9zZWxmLl9mbGF0dGVuU3R5bGVT
aGVldCgpIH0sIDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQodGhp
cy5fZG9uZUZsYXR0ZW5pbmdDYWxsYmFjaywgMCk7CiAgICAgICAgfQogICAgfSwKCiAgICBfZmxh
dHRlblN0eWxlU2hlZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICBpZiAoIXRoaXMuX2lzUHJv
Y2Vzc2luZ1N0eWxlU2hlZXQpIHsKICAgICAgICAgICAgdGhpcy5faXNQcm9jZXNzaW5nU3R5bGVT
aGVldCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX3J1bGVJbmRleFN0YWNrLnB1c2goLTEpOwog
ICAgICAgICAgICB0aGlzLl9zdHlsZVNoZWV0U3RhY2sucHVzaCh0aGlzLl9kb2N1bWVudC5zdHls
ZVNoZWV0c1t0aGlzLl9kb2N1bWVudFN0eWxlU2hlZXRJbmRleF0pOwogICAgICAgIH0KCiAgICAg
ICAgLy8gU3RhY2sudG9wIGlzIGFsd2F5cyB0aGUgY3VycmVudCBzdHlsZXNoZWV0IGJlaW5nIHBy
b2Nlc3NlZC4KICAgICAgICAvLyBTdGFjay5ib3R0b20gaXMgYWx3YXlzIHRoZSB0b3AtbGV2ZWwg
c3R5bGVzaGVldCBiZWluZyBmbGF0dGVuZWQgaW4gdGhlIGRvY3VtZW50LgogICAgICAgIC8vIFRo
ZXkgbWF5IGJlIG9uZSBpbiB0aGUgc2FtZS4KICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAg
IHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIHRoaXMuX3J1bGVJbmRleFN0YWNrLnRvcCsrOwog
ICAgICAgICAgICBpZiAodGhpcy5fcnVsZUluZGV4U3RhY2sudG9wIDwgdGhpcy5fc3R5bGVTaGVl
dFN0YWNrLnRvcC5ydWxlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHZhciBydWxlID0gdGhp
cy5fc3R5bGVTaGVldFN0YWNrLnRvcC5ydWxlc1t0aGlzLl9ydWxlSW5kZXhTdGFjay50b3BdOwog
ICAgICAgICAgICAgICAgdmFyIHR5cGVOYW1lID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5j
YWxsKHJ1bGUpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lLmluZGV4T2YoIkNTU0ltcG9y
dFJ1bGUiKSA+PSAwICYmIHJ1bGUuc3R5bGVTaGVldCkgewogICAgICAgICAgICAgICAgICAgIC8v
IElmIHRoZSB0b3AtbGV2ZWwgc3R5bGVzaGVldCBpcyB0aGUgY3VycmVudCBzdHlsZXNoZWV0LCBk
ZWxldGUgdGhlIEBpbXBvcnQgcnVsZQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdHls
ZVNoZWV0U3RhY2subGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5f
c3R5bGVTaGVldFN0YWNrLmJvdHRvbS5kZWxldGVSdWxlKHRoaXMuX3J1bGVJbmRleFN0YWNrLmJv
dHRvbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFB1c2gg
dGhlIG5ldyBzdHlsZXNoZWV0IGFuZCBpbmRleCBvbnRvIHRoZSBzdGFja3MKICAgICAgICAgICAg
ICAgICAgICB0aGlzLl9zdHlsZVNoZWV0U3RhY2sucHVzaChydWxlLnN0eWxlU2hlZXQpOwogICAg
ICAgICAgICAgICAgICAgIHRoaXMuX3J1bGVJbmRleFN0YWNrLnB1c2goLTEpOwogICAgICAgICAg
ICAgICAgICAgIHZhciBfc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91
dChmdW5jdGlvbigpIHsgX3NlbGYuX2ZsYXR0ZW5TdHlsZVNoZWV0KCkgfSwgMCk7CiAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgLy8gRWxzZSBpZiB0aGlzIGlzIG5v
dCB0aGUgdG9wLWxldmVsIHN0eWxlc2hlZXQsIGluc2VydCB0aGUgcnVsZSBpbnRvIHRoZSB0b3At
bGV2ZWwgc3R5bGVzaGVldAogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zdHlsZVNo
ZWV0U3RhY2subGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXb3Jr
IGFyb3VuZCBCdWcgMTU5ODYgPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTE1OTg2PgogICAgICAgICAgICAgICAgICAgIC8vIER5bmFtaWNhbGx5IGluc2VydGluZyBDU1Mg
cnVsZSB3aXRoIEBtZWRpYSBxdWVyeSBmYWlscyB3aXRoIERPTSBFeGNlcHRpb24gMTIKICAgICAg
ICAgICAgICAgICAgICBpZiAocnVsZS5jc3NUZXh0LmluZGV4T2YoIkBtZWRpYSIpIDwgMCkgewog
ICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZVNoZWV0U3RhY2suYm90dG9tLmluc2Vy
dFJ1bGUocnVsZS5jc3NUZXh0LCB0aGlzLl9ydWxlSW5kZXhTdGFjay5ib3R0b20pOwogICAgICAg
ICAgICAgICAgICAgICAgICB0aGlzLl9ydWxlSW5kZXhTdGFjay5ib3R0b20rKzsKICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgiU2tpcHBp
bmcgQG1lZGlhIHJ1bGUgKGZpeCBCdWcgMTU5ODYhKTpcbiIgKyBydWxlLmNzc1RleHQpOwogICAg
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgaWYgKHRoaXMuX3J1bGVJbmRleFN0YWNrLnRvcCA+PSB0aGlzLl9zdHlsZVNoZWV0U3Rh
Y2sudG9wLnJ1bGVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlU2hl
ZXRTdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3J1bGVJbmRleFN0YWNrLnBvcCgp
OwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlU2hlZXRTdGFjay5sZW5ndGggPCAxKSB7
CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICAgICAvLyBCZWNhdXNlIHRoZSB0b3AtbGV2ZWwgcnVsZSBpbmRleCBhbHdheXMgcG9pbnRzIGF0
IHRoZSAibmV4dCIgcnVsZSwKICAgICAgICAgICAgICAgIC8vIHdlIG11c3Qgc3VidHJhY3Qgb25l
IGZyb20gdGhlIHJ1bGUgaW5kZXggYWZ0ZXIgaXQgYmVjb21lcyB0aGUgdG9wCiAgICAgICAgICAg
ICAgICAvLyBzdHlsZXNoZWV0IG9uIHRoZSBzdGFjayBiZWZvcmUgdGhlIG5leHQgbG9vcCBpdGVy
YXRpb24gc3RhcnRzLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlU2hlZXRTdGFjay5s
ZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3J1bGVJbmRleFN0YWNrLmJv
dHRvbS0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb3Vu
dCsrOwoKICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IHByb2Nlc3NpbmcgdGhlIHRvcC1sZXZl
bCBzdHlsZXNoZWV0LAogICAgICAgICAgICAvLyBtYWtlIFNhZmFyaSBtb3JlIHJlc3BvbnNpdmUg
YnkgdXNpbmcgc2V0VGltZW91dCgpLgogICAgICAgICAgICBpZiAodGhpcy5fc3R5bGVTaGVldFN0
YWNrLmxlbmd0aCA+IDEgJiYgY291bnQgPj0gMTApIHsKICAgICAgICAgICAgICAgIHZhciBfc2Vs
ZiA9IHRoaXM7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBfc2VsZi5f
ZmxhdHRlblN0eWxlU2hlZXQoKSB9LCAwKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAg
ICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5faXNQcm9jZXNzaW5nU3R5bGVTaGVldCA9
IGZhbHNlOwogICAgICAgIHRoaXMuX2RvY3VtZW50U3R5bGVTaGVldEluZGV4Kys7CiAgICAgICAg
aWYgKHRoaXMuX2RvY3VtZW50U3R5bGVTaGVldEluZGV4IDwgdGhpcy5fZG9jdW1lbnQuc3R5bGVT
aGVldHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBfc2VsZiA9IHRoaXM7CiAgICAgICAgICAg
IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IF9zZWxmLl9mbGF0dGVuU3R5bGVTaGVldCgpIH0sIHRp
bWVPdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5fZG9u
ZUZsYXR0ZW5pbmdDYWxsYmFjaywgMCk7CiAgICAgICAgfQogICAgfSwKfQoKZnVuY3Rpb24gZmxh
dHRlblN0eWxlU2hlZXRzKG9ubHlGbGF0dGVuQW5kUmVwbGFjZSkKewogICAgdmFyIGZsYXR0ZW5l
ciA9IG5ldyBTdHlsZVNoZWV0RmxhdHRlbmVyKG15Q29udGVudERvY3VtZW50KCkpOwogICAgZmxh
dHRlbmVyLmZsYXR0ZW4oInJlcGxhY2VTdHlsZVNoZWV0cygiICsgb25seUZsYXR0ZW5BbmRSZXBs
YWNlICsgIikiKTsKfQoKZnVuY3Rpb24gc3R5bGVTaGVldFRvU3RyaW5nKHNoZWV0KQp7CiAgICB2
YXIgcnVsZVRleHQgPSAiIjsKICAgIGlmIChzaGVldCAmJiBzaGVldC5ydWxlcyAmJiBzaGVldC5y
dWxlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHJ1bGVzID0gc2hlZXQucnVsZXM7CiAgICAg
ICAgZm9yICh2YXIgaiA9IDA7IGogPCBydWxlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICBy
dWxlVGV4dCArPSBydWxlc1tqXS5jc3NUZXh0ICsgIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBy
ZXR1cm4gcnVsZVRleHQ7Cn0KCmZ1bmN0aW9uIHJlcGxhY2VTdHlsZVNoZWV0cyhvbmx5RmxhdHRl
bkFuZFJlcGxhY2UpCnsKICAgIHdpbmRvdy5pZnJhbWVEb2N1bWVudCA9IG15Q29udGVudERvY3Vt
ZW50KCk7CiAgICB2YXIgc2hlZXRzID0gd2luZG93LmlmcmFtZURvY3VtZW50LnN0eWxlU2hlZXRz
OwogICAgbG9nKCJSZXBsYWNpbmcgIiArIHNoZWV0cy5sZW5ndGggKyAiIHN0eWxlc2hlZXRzLi4u
Iik7CiAgICB2YXIgbmV3U2hlZXRzID0gbmV3IEFycmF5OwogICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBzaGVldHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgc2hlZXQgPSBzaGVldHNbaV07CiAg
ICAgICAgdmFyIG9sZFN0eWxlID0gc2hlZXQub3duZXJOb2RlOwogICAgICAgIHZhciBwYXJlbnQg
PSBvbGRTdHlsZS5wYXJlbnQ7CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgICAgdmFy
IG5ld1N0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICAgICAg
bmV3U3R5bGUudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgICAgICAgICAgIG5ld1N0eWxlLnRleHRDb250
ZW50ID0gc3R5bGVTaGVldFRvU3RyaW5nKHNoZWV0KTsKICAgICAgICAgICAgbmV3U2hlZXRzW25l
d1NoZWV0cy5sZW5ndGhdID0gbmV3U3R5bGU7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFJlbW92
ZSBvbGQgPHN0eWxlPiBhbmQgPGxpbms+IHRhZ3MKICAgIHZhciBvbGRTdHlsZXMgPSB3aW5kb3cu
aWZyYW1lRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0eWxlIik7CiAgICBmb3IgKHZh
ciBpID0gb2xkU3R5bGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgdmFyIHBh
cmVudCA9IG9sZFN0eWxlc1tpXS5wYXJlbnROb2RlOwogICAgICAgIHBhcmVudC5yZW1vdmVDaGls
ZChvbGRTdHlsZXNbaV0pOwogICAgfQoKICAgIHZhciBvbGRMaW5rcyA9IHdpbmRvdy5pZnJhbWVE
b2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOwogICAgZm9yICh2YXIgaSA9IG9s
ZExpbmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgdmFyIG9sZExpbmsgPSBv
bGRMaW5rc1tpXTsKICAgICAgICBpZiAob2xkTGluay5yZWwudG9Mb3dlckNhc2UoKSA9PSAic3R5
bGVzaGVldCIgfHwgb2xkTGluay50eXBlLnRvTG93ZXJDYXNlKCkgPT0gInRleHQvY3NzIikgewog
ICAgICAgICAgICB2YXIgcGFyZW50ID0gb2xkTGluay5wYXJlbnROb2RlOwogICAgICAgICAgICBw
YXJlbnQucmVtb3ZlQ2hpbGQob2xkTGluayk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIEFkZCBu
ZXcgc3R5bGVzaGVldHMgdG8gRE9NCiAgICB2YXIgaGVhZCA9IHdpbmRvdy5pZnJhbWVEb2N1bWVu
dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwogICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBuZXdTaGVldHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBoZWFkLmFwcGVuZENoaWxkKG5ld1No
ZWV0c1tpXSk7CiAgICB9CgogICAgaWYgKG9ubHlGbGF0dGVuQW5kUmVwbGFjZSkgewogICAgICAg
IGxvZygiRG9uZSBmbGF0dGVuaW5nIHN0eWxlc2hlZXRzLiIpOwogICAgICAgIHZpZXdUZXN0UGFn
ZUhUTUwoKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLy8gQmVnaW4gbG9vcGluZyB0aHJv
dWdoIHN0eWxlc2hlZXRzIGFuZCB0aGVpciBydWxlcyB1c2luZyBydW5TdHlsZURlbHRhKCkKICAg
IHdpbmRvdy5pID0gd2luZG93LmlmcmFtZURvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCAtIDE7
CiAgICBpZiAod2luZG93LmkgPCAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93
LmogPSB3aW5kb3cuaWZyYW1lRG9jdW1lbnQuc3R5bGVTaGVldHNbd2luZG93LmldLnJ1bGVzLmxl
bmd0aDsKCiAgICBsb2coIlJ1bm5pbmcgc3R5bGVzaGVldCBkZWx0YS4uLiIpOwogICAgc2V0VGlt
ZW91dCgicnVuU3R5bGVEZWx0YSgpIiwgdGltZU91dCk7Cn0KCmZ1bmN0aW9uIHJ1blN0eWxlRGVs
dGEoKQp7CiAgICBpZiAod2luZG93LnN0b3BEZWx0YSkgcmV0dXJuOwoKICAgIHdpbmRvdy5pZnJh
bWVEb2N1bWVudCA9IG15Q29udGVudERvY3VtZW50KCk7CiAgICB3aW5kb3cuai0tOwogICAgaWYg
KHdpbmRvdy5qID49IDApIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
InN0eWxlc2hlZXQiKS52YWx1ZSA9IHdpbmRvdy5pOwogICAgICAgIHdpbmRvdy5kb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCgicnVsZSIpLnZhbHVlID0gd2luZG93Lmo7CiAgICAgICAgdmFyIHNoZWV0
ID0gd2luZG93LmlmcmFtZURvY3VtZW50LnN0eWxlU2hlZXRzW3dpbmRvdy5pXTsKCiAgICAgICAg
Ly8gUmVtb3ZlIHJ1bGUKICAgICAgICB2YXIgcnVsZSA9IHNoZWV0LnJ1bGVzW3dpbmRvdy5qXTsK
CiAgICAgICAgLy8gRklYTUU6IFdvcmsgYXJvdW5kIEJ1ZyAxNTk4NiA8aHR0cDovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU5ODY+CiAgICAgICAgLy8gRHluYW1pY2FsbHkgaW5z
ZXJ0aW5nIENTUyBydWxlIHdpdGggQG1lZGlhIHF1ZXJ5IGZhaWxzIHdpdGggRE9NIEV4Y2VwdGlv
biAxMgogICAgICAgIGlmIChydWxlLmNzc1RleHQuaW5kZXhPZigiQG1lZGlhIikgPCAwKSB7CiAg
ICAgICAgICAgICAgICBzaGVldC5kZWxldGVSdWxlKHdpbmRvdy5qKTsKCiAgICAgICAgICAgICAg
ICAvLyBSZXN0b3JlIHJ1bGUgaWYgdGVzdCBmYWlsZWQKICAgICAgICAgICAgICAgIGlmICghdGVz
dEZ1bmN0aW9uKCkpIHsKICAgICAgICAgICAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKHJ1bGUu
Y3NzVGV4dCwgd2luZG93LmopOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgIGFsZXJ0KCJTa2lwcGluZyBAbWVkaWEgcnVsZSAoZml4IEJ1ZyAxNTk4NiEpOlxu
IiArIHJ1bGUuY3NzVGV4dCk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChqIDw9IDApIHsKICAg
ICAgICAvLyBSZXBsYWNlIHRoZSBleGlzdGluZyBzdHlsZXNoZWV0IHNpbmNlIGl0cyBjb250ZW50
IGRvZXNuJ3QgdXBkYXRlIGR5bmFtaWNhbGx5CiAgICAgICAgaWYgKHNoZWV0KSB7CiAgICAgICAg
ICAgIHZhciBuZXdTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAg
ICAgICAgIG5ld1N0eWxlLnR5cGUgPSAidGV4dC9jc3MiOwogICAgICAgICAgICBuZXdTdHlsZS50
ZXh0Q29udGVudCA9IHN0eWxlU2hlZXRUb1N0cmluZyhzaGVldCk7CiAgICAgICAgICAgIHZhciBv
bGRTdHlsZSA9IHNoZWV0Lm93bmVyTm9kZTsKICAgICAgICAgICAgdmFyIHBhcmVudCA9IG9sZFN0
eWxlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQobmV3U3R5bGUs
IG9sZFN0eWxlKTsKICAgICAgICB9CgogICAgICAgIHdpbmRvdy5pLS07CiAgICAgICAgaWYgKGkg
PCAwKSB7CiAgICAgICAgICAgIGxvZygiUnVubmluZyBzdHlsZXNoZWV0IGRlbHRhLi4uZG9uZS4i
KTsKICAgICAgICAgICAgdmlld1Rlc3RQYWdlSFRNTCgpOwogICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgfQogICAgICAgIHdpbmRvdy5qID0gd2luZG93LmlmcmFtZURvY3VtZW50LnN0eWxlU2hl
ZXRzW3dpbmRvdy5pXS5ydWxlcy5sZW5ndGg7CiAgICB9CgogICAgc2V0VGltZW91dCgicnVuU3R5
bGVEZWx0YSgpIiwgdGltZU91dCk7Cn0KCmZ1bmN0aW9uIHJ1bkRlbHRhKGRlbHRhRnVuY3Rpb24p
CnsKICAgIHZhciBsZXZlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZXZlbCIpLnZhbHVl
OwogICAgd2luZG93LmlmcmFtZURvY3VtZW50ID0gbXlDb250ZW50RG9jdW1lbnQoKTsKCiAgICB3
aW5kb3cubm9kZXMgPSBuZXcgQXJyYXk7CiAgICB3aW5kb3cubm9kZXNbMF0gPSB3aW5kb3cuaWZy
YW1lRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgZm9yICh2YXIgbCA9IDE7IGwgPD0gbGV2
ZWw7IGwrKykgewogICAgICAgIHZhciBuZXh0Tm9kZXMgPSBuZXcgQXJyYXk7CiAgICAgICAgZm9y
ICh2YXIgaiA9IDA7IGogPCB3aW5kb3cubm9kZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAg
dmFyIGNoaWxkcmVuID0gd2luZG93Lm5vZGVzW2pdLmNoaWxkTm9kZXM7CiAgICAgICAgICAgIGZv
ciAodmFyIGsgPSAwOyBrIDwgY2hpbGRyZW4ubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAg
IG5leHROb2Rlc1tuZXh0Tm9kZXMubGVuZ3RoXSA9IGNoaWxkcmVuW2tdOwogICAgICAgICAgICB9
CiAgICAgICAgfQogICAgICAgIHdpbmRvdy5ub2RlcyA9IG5leHROb2RlczsKICAgIH0KCiAgICAv
LyBCZWdpbiBsb29waW5nIHRocm91Z2ggY2hpbGQgbm9kZXMgdXNpbmcgZGVsdGFDaGlsZE5vZGVz
KCkKICAgIHdpbmRvdy5pID0gd2luZG93Lm5vZGVzLmxlbmd0aDsKCiAgICBpZiAod2luZG93Lmkg
PiAwKSB7CiAgICAgICAgd2luZG93LnN0b3BEZWx0YSA9IGZhbHNlOwogICAgICAgIHNldFRpbWVv
dXQoZGVsdGFGdW5jdGlvbiwgdGltZU91dCk7CiAgICB9IGVsc2UgewogICAgICAgIHZpZXdUZXN0
UGFnZUhUTUwoKTsKICAgIH0KfQoKZnVuY3Rpb24gZGVsdGFDaGlsZE5vZGVzKCkKewogICAgaWYg
KHdpbmRvdy5zdG9wRGVsdGEpIHJldHVybjsKCiAgICB3aW5kb3cuaS0tOwogICAgaWYgKHdpbmRv
dy5pIDwgMCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZXZlbCIpLnZhbHVl
ID0gMSArIHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZXZlbCIpLnZhbHVlKTsK
ICAgICAgICBzZXRUaW1lb3V0KCJydW5EZWx0YSgnZGVsdGFDaGlsZE5vZGVzKCknKSIsIHRpbWVP
dXQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJj
aGlsZCIpLnZhbHVlID0gd2luZG93Lmk7CgogICAgLy8gUmVtb3ZlIG5vZGUKICAgIHZhciBub2Rl
ID0gd2luZG93Lm5vZGVzW3dpbmRvdy5pXTsKICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5v
ZGU7CiAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICBub2RlID0gcGFyZW50LnJl
bW92ZUNoaWxkKG5vZGUpOwoKICAgIC8vIFJlc3RvcmUgbm9kZSBpZiB0ZXN0IGZhaWxlZAogICAg
aWYgKCF0ZXN0RnVuY3Rpb24oKSkgewogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgIHBh
cmVudC5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAg
ICAgcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgIH0KICAgIH0KCiAgICBzZXRUaW1l
b3V0KCJkZWx0YUNoaWxkTm9kZXMoKSIsIHRpbWVPdXQpOwp9CgpmdW5jdGlvbiBkZWx0YVRyZWVO
b2RlcygpCnsKICAgIGlmICh3aW5kb3cuc3RvcERlbHRhKSByZXR1cm47CgovLyBGSVhNRTogTmVl
ZHMgdG8gYmUgc21hcnRlciBhYm91dCByZW1vdmluZyB0YWJsZXMgYW5kIHRhYmxlIHN0cnVjdHVy
ZXM/CiAgICB3aW5kb3cuaS0tOwogICAgaWYgKHdpbmRvdy5pIDwgMCkgewogICAgICAgIGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJsZXZlbCIpLnZhbHVlID0gMSArIHBhcnNlSW50KGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCJsZXZlbCIpLnZhbHVlKTsKICAgICAgICBzZXRUaW1lb3V0KCJydW5E
ZWx0YSgnZGVsdGFUcmVlTm9kZXMoKScpIiwgdGltZU91dCk7CiAgICAgICAgcmV0dXJuOwogICAg
fQoKICAgIHZhciBub2RlID0gd2luZG93Lm5vZGVzW3dpbmRvdy5pXTsKICAgIHZhciBwYXJlbnQg
PSBub2RlLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09IDEp
IHsKICAgICAgICB2YXIgY2hpbGRyZW4gPSBuZXcgQXJyYXk7CiAgICAgICAgZm9yICh2YXIgaiA9
IDA7IGogPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgY2hpbGRy
ZW5bal0gPSBub2RlLmNoaWxkTm9kZXNbal07CiAgICAgICAgfQogICAgICAgIG5vZGUgPSBwYXJl
bnQucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjaGlsZHJl
bi5sZW5ndGg7IGorKykgewogICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZS5yZW1v
dmVDaGlsZChjaGlsZHJlbltqXSkpOwogICAgICAgIH0KICAgICAgICBpZiAoIXRlc3RGdW5jdGlv
bigpKSB7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBq
KyspIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZE5vZGUgPSBwYXJlbnQucmVtb3ZlQ2hpbGQo
Y2hpbGRyZW5bal0pOwogICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUp
OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTsKICAg
ICAgICB9CiAgICB9CgogICAgc2V0VGltZW91dCgiZGVsdGFUcmVlTm9kZXMoKSIsIHRpbWVPdXQp
Owp9Cgo8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4KCjxkaXY+Cjxjb2RlPmZ1bmN0aW9uIHRlc3Qo
ZG9jdW1lbnQpPC9jb2RlPjxicj4KPGNvZGU+ezwvY29kZT48YnI+Cjxjb2RlPiZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOzwvY29kZT4KPHRleHRhcmVhIGlkPSJ0ZXN0RnVuY3Rpb24iIGNvbHM9Ijgw
IiByb3dzPSIyMCIgc3R5bGU9ImZvbnQtZmFtaWx5OiBDb3VyaWVyLCdDb3VyaWVyIE5ldycsZml4
ZWQ7IGZvbnQtc2l6ZTogMTNweDsiPgovLyBSZXR1cm4gdHJ1ZSB3aGVuIHRoZSBidWcgcmVwcm9k
dWNlcywgZWxzZSBmYWxzZS4KLy8gVGlwczoKLy8gLSBMb2NhbCB2YXJpYWJsZSAnZG9jdW1lbnQn
IGlzIHRoZSBkb2N1bWVudCBlbGVtZW50IGZvciB0aGUgdGVzdCBwYWdlLgovLyAtIFVzZSAkKCdp
ZCcpIGluc3RlYWQgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lkJykuCi8vIC0gVG8gZ2V0
IHRoZSB4IG9yIHkgcG9zaXRpb24gb2YgYW4gZWxlbWVudCwgdXNlIGVsZW0ueHBvcygpIG9yIGVs
ZW0ueXBvcygpLgovLyAtIFdyaXRlIHRvIHRoZSBjb25zb2xlIHVzaW5nIGxvZygnJykuCjwvdGV4
dGFyZWE+PGJyPgo8Y29kZT59PC9jb2RlPgo8L2Rpdj4KCjxkaXY+IFNldHVwOgo8YnV0dG9uIG9u
Y2xpY2s9InZlcmlmeVRlc3QoKSI+VmVyaWZ5IFRlc3Q8L2J1dHRvbj4KPGJ1dHRvbiBvbmNsaWNr
PSJyZWxvYWRUZXN0UGFnZSgpIj5SZWxvYWQgVGVzdCBQYWdlPC9idXR0b24+CjxidXR0b24gb25j
bGljaz0id2luZG93LnN0b3BEZWx0YSA9IHRydWU7Ij5TdG9wIERlbHRhPC9idXR0b24+CjwvZGl2
PgoKPGRpdj5Db25zb2xlOiA8ZGl2IGlkPSJjb25zb2xlIiBzdHlsZT0iZGlzcGxheTogaW5saW5l
OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOyBwYWRkaW5nOiAwcHggNHB4IDBweCA0cHg7Ij48
L2Rpdj48L2Rpdj4KCjxkaXY+CkxldmVsOiA8aW5wdXQgaWQ9ImxldmVsIiB0eXBlPSJ0ZXh0IiBz
aXplPSIzIiB2YWx1ZT0iMSI+CkNoaWxkOiA8aW5wdXQgaWQ9ImNoaWxkIiB0eXBlPSJ0ZXh0IiBz
aXplPSI1IiByZWFkb25seT0icmVhZG9ubHkiPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsKU3R5bGVTaGVldDogPGlucHV0IGlkPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0IiBzaXplPSIz
IiByZWFkb25seT0icmVhZG9ubHkiPgpSdWxlOiA8aW5wdXQgaWQ9InJ1bGUiIHR5cGU9InRleHQi
IHNpemU9IjUiIHJlYWRvbmx5PSJyZWFkb25seSI+CjwvZGl2PgoKPGRpdj4KQWN0aW9uczoKPGJ1
dHRvbiBvbmNsaWNrPSJydW5EZWx0YSgnZGVsdGFDaGlsZE5vZGVzKCknKSI+UnVuIENoaWxkIE5v
ZGUgRGVsdGE8L2J1dHRvbj4KPGJ1dHRvbiBvbmNsaWNrPSJydW5EZWx0YSgnZGVsdGFUcmVlTm9k
ZXMoKScpIj5SdW4gVHJlZSBOb2RlIERlbHRhPC9idXR0b24+CjxidXR0b24gb25jbGljaz0iZmxh
dHRlblN0eWxlU2hlZXRzKGZhbHNlKSI+UnVuIFN0eWxlU2hlZXQgRGVsdGE8L2J1dHRvbj4KPGJ1
dHRvbiBvbmNsaWNrPSJmbGF0dGVuU3R5bGVTaGVldHModHJ1ZSkiPkZsYXR0ZW4gU3R5bGVTaGVl
dHM8L2J1dHRvbj4KPGJ1dHRvbiBvbmNsaWNrPSJ2aWV3VGVzdFBhZ2VIVE1MKCkiPlZpZXcgVGVz
dCBQYWdlIEhUTUw8L2J1dHRvbj4KPC9kaXY+Cgo8ZGl2Pgo8aWZyYW1lIGlkPSJteWlmcmFtZSIg
c3JjPSJyZWR1Y2UuaHRtbCIgb25sb2FkPSJpbmplY3RFbGVtZW50UHJvdG90eXBlcygpIiBzdHls
ZT0id2lkdGg6IDEwMDBweDsgaGVpZ2h0OiA0MDBweDsiPjwvaWZyYW1lPgo8L2Rpdj4KCjwvYm9k
eT4KPC9odG1sPgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>