<?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>44875</bug_id>
          
          <creation_ts>2010-08-30 09:30:37 -0700</creation_ts>
          <short_desc>Web Inspector: it&apos;d be better to introduce inspector API related tests.</short_desc>
          <delta_ts>2010-08-31 11:56:45 -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>Web Inspector (Deprecated)</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>
          
          <blocked>44947</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ilya Tikhonovsky">loislo</reporter>
          <assigned_to name="Ilya Tikhonovsky">loislo</assigned_to>
          <cc>bweinstein</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>271465</commentid>
    <comment_count>0</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-30 09:30:37 -0700</bug_when>
    <thetext>%subj%</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271506</commentid>
    <comment_count>1</comment_count>
      <attachid>65930</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-30 10:44:22 -0700</bug_when>
    <thetext>Created attachment 65930
[patch] initial version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271514</commentid>
    <comment_count>2</comment_count>
      <attachid>65930</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2010-08-30 11:06:51 -0700</bug_when>
    <thetext>Comment on attachment 65930
[patch] initial version.

&gt; diff --git LayoutTests/ChangeLog
&gt; +2010-08-30  Ilya Tikhonovsky  &lt;loislo@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        WebInspector: As far as we have some kind of API for Inspector
&gt; +        it&apos;d be better to have API related tests. This is the test
&gt; +        for API wrappers. These wrappers are tracking the types of arguments
&gt; +        of API functions.

Missing  bug title + link. (Maybe this was expected if this was
webkit-patch upload?) Applies to all ChangeLogs in this patch.


&gt; diff --git LayoutTests/inspector/report-API-errors.html
&gt; +var test = function()
&gt; +{
&gt; +    var callback = function(message)
&gt; +    {

This both use the &quot;var x = function()&quot; syntax. I find that unusual.
I think most of the other tests use the &quot;function x()&quot; syntax, and
I think that is easier to read. Tests typically have all kinds of
styles, so this isn&apos;t something to worry about, but the uncommon
syntax caught my eye.


&gt; +    InspectorTest._addSniffer(WebInspector, &quot;reportProtocolError&quot;, callback, true);
&gt; +
&gt; +    InspectorBackend.enableResourceTracking(1, callback);
&gt; +    InspectorBackend.enableResourceTracking();
&gt; +    InspectorBackend.enableResourceTracking(true, &quot;not a function&quot;);


This covers &quot;nice&quot; messages with unusual arguments. This is very good.
Is there a plan for testing &quot;bad&quot; messages? Such as:

  InspectorFrontendHost.sendMessageToBackend(&quot;bad message&quot;)

I guess this shouldn&apos;t happen in practice, but if this really is
an over the wire protocol than those messages could be modified.
Testing that interface would be awesome too.


&gt; diff --git WebCore/inspector/front-end/inspector.js
&gt; -            console.error(&quot;Attempted to dispatch unimplemented WebInspector method: %s&quot;, messageObject.event);
&gt; +            this.reportProtocolError(&quot;Attempted to dispatch unimplemented WebInspector method: %s&quot;, messageObject.event);

This changed an &quot;sprintf&quot; style console.error to a reportProtocolError function
call which does not respect sprintf style, and thus the 2nd argument is ignored.
I seem to recall an easy way to convert a function to the sprintf style, just
wrapping and replacing a function. Either way, could testing this error message
be added to your test?


&gt; diff --git WebCore/inspector/front-end/inspector.js
&gt; -WebInspector.reportProtocolError = function(messageObject)
&gt; +WebInspector.reportProtocolError = function(message)
&gt;  {
&gt; -    console.error(&quot;Error: InspectorBackend request with seq = &quot; + messageObject.seq + &quot; failed.&quot;);
&gt; +    if (typeof message === &quot;string&quot;) {
&gt; +        console.error(&quot;Protocol Error: &quot; + message);
&gt; +        return;
&gt; +    }
&gt; +
&gt; +    console.error(&quot;Protocol Error: InspectorBackend request with seq = &quot; + messageObject.seq + &quot; failed.&quot;);
&gt;      for (var error in messageObject.errors)
&gt;          console.error(&quot;    &quot; + error);
&gt;      WebInspector.removeResponseCallbackEntry(messageObject.seq);

These last few lines are using &quot;messageObject&quot;. However, there is no more
any &quot;messageObject&quot; in scope? are they needed any more? r- for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271595</commentid>
    <comment_count>3</comment_count>
      <attachid>65947</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-30 13:03:57 -0700</bug_when>
    <thetext>Created attachment 65947
[patch] second iteration

(In reply to comment #2)
&gt; (From update of attachment 65930 [details])
&gt; &gt; diff --git LayoutTests/ChangeLog
&gt; &gt; +2010-08-30  Ilya Tikhonovsky  &lt;loislo@chromium.org&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        WebInspector: As far as we have some kind of API for Inspector
&gt; &gt; +        it&apos;d be better to have API related tests. This is the test
&gt; &gt; +        for API wrappers. These wrappers are tracking the types of arguments
&gt; &gt; +        of API functions.
&gt; 
&gt; Missing  bug title + link. (Maybe this was expected if this was
&gt; webkit-patch upload?) Applies to all ChangeLogs in this patch.

done.

&gt; &gt; diff --git LayoutTests/inspector/report-API-errors.html
&gt; &gt; +var test = function()
&gt; &gt; +{
&gt; &gt; +    var callback = function(message)
&gt; &gt; +    {
&gt; 
&gt; This both use the &quot;var x = function()&quot; syntax. I find that unusual.
&gt; I think most of the other tests use the &quot;function x()&quot; syntax, and
&gt; I think that is easier to read. Tests typically have all kinds of
&gt; styles, so this isn&apos;t something to worry about, but the uncommon
&gt; syntax caught my eye.

done


&gt; &gt; +    InspectorTest._addSniffer(WebInspector, &quot;reportProtocolError&quot;, callback, true);
&gt; &gt; +
&gt; &gt; +    InspectorBackend.enableResourceTracking(1, callback);
&gt; &gt; +    InspectorBackend.enableResourceTracking();
&gt; &gt; +    InspectorBackend.enableResourceTracking(true, &quot;not a function&quot;);
&gt; 
&gt; 
&gt; This covers &quot;nice&quot; messages with unusual arguments. This is very good.
&gt; Is there a plan for testing &quot;bad&quot; messages? Such as:
&gt; 
&gt;   InspectorFrontendHost.sendMessageToBackend(&quot;bad message&quot;)
&gt; 
&gt; I guess this shouldn&apos;t happen in practice, but if this really is
&gt; an over the wire protocol than those messages could be modified.
&gt; Testing that interface would be awesome too.

That will be the target of another test. In this test I&apos;m trying to cover the functionality of
the internal Inspector JS API implemented in InspectorBackendStub.js

&gt; &gt; diff --git WebCore/inspector/front-end/inspector.js
&gt; &gt; -            console.error(&quot;Attempted to dispatch unimplemented WebInspector method: %s&quot;, messageObject.event);
&gt; &gt; +            this.reportProtocolError(&quot;Attempted to dispatch unimplemented WebInspector method: %s&quot;, messageObject.event);
&gt; 
&gt; This changed an &quot;sprintf&quot; style console.error to a reportProtocolError function
&gt; call which does not respect sprintf style, and thus the 2nd argument is ignored.
&gt; I seem to recall an easy way to convert a function to the sprintf style, just
&gt; wrapping and replacing a function. Either way, could testing this error message
&gt; be added to your test?

Just realized that I can sniff console.error instead of reportProtocolError.
New step for this use case was added and an error in the code was fixed. :)


&gt; &gt; diff --git WebCore/inspector/front-end/inspector.js
&gt; &gt; -WebInspector.reportProtocolError = function(messageObject)
&gt; &gt; +WebInspector.reportProtocolError = function(message)
&gt; &gt;  {
&gt; &gt; -    console.error(&quot;Error: InspectorBackend request with seq = &quot; + messageObject.seq + &quot; failed.&quot;);
&gt; &gt; +    if (typeof message === &quot;string&quot;) {
&gt; &gt; +        console.error(&quot;Protocol Error: &quot; + message);
&gt; &gt; +        return;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    console.error(&quot;Protocol Error: InspectorBackend request with seq = &quot; + messageObject.seq + &quot; failed.&quot;);
&gt; &gt;      for (var error in messageObject.errors)
&gt; &gt;          console.error(&quot;    &quot; + error);
&gt; &gt;      WebInspector.removeResponseCallbackEntry(messageObject.seq);
&gt; 
&gt; These last few lines are using &quot;messageObject&quot;. However, there is no more
&gt; any &quot;messageObject&quot; in scope? are they needed any more? r- for this.

This part of patch just removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271606</commentid>
    <comment_count>4</comment_count>
      <attachid>65950</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-30 13:17:56 -0700</bug_when>
    <thetext>Created attachment 65950
[patch] third iteration.

unnecessary try catch was removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271972</commentid>
    <comment_count>5</comment_count>
      <attachid>65950</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2010-08-31 01:00:48 -0700</bug_when>
    <thetext>Comment on attachment 65950
[patch] third iteration.

&gt; diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog

I know I have talked about ChangeLog formatting before. It may
Be that I am too picky on this, but I find it much easier to read,
and ultimately make the entry more useful when well formatted.
the bug title and link to lead back to bugzilla for discussion
and important comments or reproducible steps. A separate paragraph
For details concerning the changes in the patch. prepare-ChangeLog
Provides this template.


&gt; diff --git a/LayoutTests/inspector/report-API-errors-expected.txt
&gt; +Protocol Error: Invalid type of argument &apos;always&apos; for &apos;InspectorBackend.enableResourceTracking&apos; call. It should be &apos;boolean&apos; but it is &apos;number&apos;.
&gt; +Protocol Error: Invalid number of arguments for &apos;InspectorBackend.enableResourceTracking&apos; call. It should have the next arguments &apos;{&quot;always&quot;:&quot;boolean&quot;}&apos;.
&gt; +Protocol Error: Optional callback argument for &apos;InspectorBackend.enableResourceTracking&apos; call should be a function but its type is &apos;string&apos;.
&gt; +Protocol Error: Attempted to dispatch an unimplemented WebInspector method &apos;something-strange&apos;

Bottom message doesn&apos;t have a period, but the others do.
I think it would be nice to be consistent here. For precedence
you could look at JavaScript syntax errors and if they print out
with a period. (I current cannot test this... iPad review!)


&gt; +                console.error(&quot;Protocol Error: Invalid type of argument &apos;%s&apos; for &apos;InspectorBackend.%s&apos; call. It should be &apos;%s&apos; but it is &apos;%s&apos;.&quot;, key, request.command, request.arguments[key], typeof(value));

&gt; +                console.error(&quot;Protocol Error: Optional callback argument for &apos;InspectorBackend.%s&apos; call should be a function but its type is &apos;%s&apos;.&quot;, request.command, typeof(args[0]));

We normally don&apos;t use typeof with ()s.


Patch looks much better. I will take a closer look tomorrow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272149</commentid>
    <comment_count>6</comment_count>
      <attachid>65950</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2010-08-31 09:50:00 -0700</bug_when>
    <thetext>Comment on attachment 65950
[patch] third iteration.

&gt; ... you could look at JavaScript syntax errors and if they print out with a period.

JavaScript errors don&apos;t. So maybe these shouldn&apos;t. Thoughts?


&gt; Patch looks much better. I will take a closer look tomorrow.

r=me addressing the comments I had above. Please file a follow-up, if there
isn&apos;t one already, for testing sendMessageToBackend message parsing and
dispatching.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272150</commentid>
    <comment_count>7</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2010-08-31 09:51:29 -0700</bug_when>
    <thetext>&gt; Please file a follow-up, if there isn&apos;t one already...

Next email in my inbox! Thanks!
&lt;http://webkit.org/b/44947&gt; Web Inspector: The parser of Inspector protocol messages should be covered by a test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272180</commentid>
    <comment_count>8</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-31 10:24:08 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 65950 [details])
&gt; &gt; ... you could look at JavaScript syntax errors and if they print out with a period.
&gt; 
&gt; JavaScript errors don&apos;t. So maybe these shouldn&apos;t. Thoughts?

As far as two error messages have period inside it&apos;d be better to keep period at the end.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272254</commentid>
    <comment_count>9</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-08-31 11:56:45 -0700</bug_when>
    <thetext>r66515 = 501ce788f0c2beecbced5c5dde894f3f175e257c (refs/remotes/trunk)
	M	WebCore/ChangeLog
	M	WebCore/inspector/CodeGeneratorInspector.pm
	M	WebCore/inspector/front-end/inspector.js
	A	LayoutTests/inspector/report-API-errors-expected.txt
	A	LayoutTests/inspector/report-API-errors.html
	M	LayoutTests/ChangeLog
r66516 = 71b37b12202941ac9d982b7b421d90bf02ec88c6 (refs/remotes/trunk)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65930</attachid>
            <date>2010-08-30 10:44:22 -0700</date>
            <delta_ts>2010-08-30 13:03:57 -0700</delta_ts>
            <desc>[patch] initial version.</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>10628</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBkZjk4NWM0Li4zOWU0OWM0IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTAtMDgt
MzAgIElseWEgVGlraG9ub3Zza3kgIDxsb2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdlYkluc3BlY3RvcjogQXMgZmFy
IGFzIHdlIGhhdmUgc29tZSBraW5kIG9mIEFQSSBmb3IgSW5zcGVjdG9yCisgICAgICAgIGl0J2Qg
YmUgYmV0dGVyIHRvIGhhdmUgQVBJIHJlbGF0ZWQgdGVzdHMuIFRoaXMgaXMgdGhlIHRlc3QKKyAg
ICAgICAgZm9yIEFQSSB3cmFwcGVycy4gVGhlc2Ugd3JhcHBlcnMgYXJlIHRyYWNraW5nIHRoZSB0
eXBlcyBvZiBhcmd1bWVudHMKKyAgICAgICAgb2YgQVBJIGZ1bmN0aW9ucy4KKworICAgICAgICAq
IGluc3BlY3Rvci9wcm90b2NvbC1lcnJvci1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAq
IGluc3BlY3Rvci9wcm90b2NvbC1lcnJvci5odG1sOiBBZGRlZC4KKwogMjAxMC0wOC0zMCAgRHVt
aXRydSBEYW5pbGl1YyAgPGR1bWlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQs
IHVwZGF0aW5nIENocm9taXVtIGV4cGVjdGF0aW9ucy4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3Rz
L2luc3BlY3Rvci9yZXBvcnQtQVBJLWVycm9ycy1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9p
bnNwZWN0b3IvcmVwb3J0LUFQSS1lcnJvcnMtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmY2MGFmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0
cy9pbnNwZWN0b3IvcmVwb3J0LUFQSS1lcnJvcnMtZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsNiBA
QAorVGVzdHMgdGhhdCBJbnNwZWN0b3JCYWNrZW5kU3R1YiBpcyBjYXRjaGluZyBpbmNvcnJlY3Qg
YXJndW1lbnRzLgorCitXZWJJbnNwZWN0b3IucmVwb3J0UHJvdG9jb2xFcnJvcjogSW52YWxpZCB0
eXBlIG9mIGFyZ3VtZW50ICdhbHdheXMnIGZvciAnSW5zcGVjdG9yQmFja2VuZC5lbmFibGVSZXNv
dXJjZVRyYWNraW5nJyBjYWxsLiBJdCBzaG91bGQgYmUgJ2Jvb2xlYW4nIGJ1dCBpdCBpcyAnbnVt
YmVyJy4KK1dlYkluc3BlY3Rvci5yZXBvcnRQcm90b2NvbEVycm9yOiBJbnZhbGlkIG51bWJlciBv
ZiBhcmd1bWVudHMgZm9yICdJbnNwZWN0b3JCYWNrZW5kLmVuYWJsZVJlc291cmNlVHJhY2tpbmcn
IGNhbGwuIEl0IHNob3VsZCBoYXZlIHRoZSBuZXh0IGFyZ3VtZW50cyAneyJhbHdheXMiOiJib29s
ZWFuIn0nLgorV2ViSW5zcGVjdG9yLnJlcG9ydFByb3RvY29sRXJyb3I6IE9wdGlvbmFsIGNhbGxi
YWNrIGFyZ3VtZW50IGZvciAnSW5zcGVjdG9yQmFja2VuZC5lbmFibGVSZXNvdXJjZVRyYWNraW5n
JyBjYWxsIHNob3VsZCBiZSBhIGZ1bmN0aW9uIGJ1dCBpdHMgdHlwZSBpcyAnc3RyaW5nJy4KKwpk
aWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3JlcG9ydC1BUEktZXJyb3JzLmh0bWwg
Yi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVwb3J0LUFQSS1lcnJvcnMuaHRtbApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM4MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5
b3V0VGVzdHMvaW5zcGVjdG9yL3JlcG9ydC1BUEktZXJyb3JzLmh0bWwKQEAgLTAsMCArMSw0MCBA
QAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9odHRwL3Rlc3RzL2luc3BlY3Rvci9p
bnNwZWN0b3ItdGVzdDIuanMiPjwvc2NyaXB0PgorPHNjcmlwdD4KKwordmFyIHRlc3QgPSBmdW5j
dGlvbigpCit7CisgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSkKKyAgICB7Cisg
ICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gInN0cmluZyIpIHsKKyAgICAgICAgICAgIElu
c3BlY3RvclRlc3QuYWRkUmVzdWx0KCJXZWJJbnNwZWN0b3IucmVwb3J0UHJvdG9jb2xFcnJvcjog
IiArIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAg
aWYgKHR5cGVvZiBtZXNzYWdlID09PSAib2JqZWN0IikgeworICAgICAgICAgICAgdmFyIG1lc3Nh
Z2VPYmplY3QgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKKyAgICAgICAgICAgIG1lc3NhZ2VP
YmplY3Quc2VxID0gIiogb2JmdXNjYXRlZCAqIjsKKyAgICAgICAgICAgIEluc3BlY3RvclRlc3Qu
YWRkUmVzdWx0KCJXZWJJbnNwZWN0b3IucmVwb3J0UHJvdG9jb2xFcnJvcjogIiArIEpTT04uc3Ry
aW5naWZ5KG1lc3NhZ2UpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEluc3BlY3RvclRlc3Qu
X2FkZFNuaWZmZXIoV2ViSW5zcGVjdG9yLCAicmVwb3J0UHJvdG9jb2xFcnJvciIsIGNhbGxiYWNr
LCB0cnVlKTsKKworICAgIEluc3BlY3RvckJhY2tlbmQuZW5hYmxlUmVzb3VyY2VUcmFja2luZygx
LCBjYWxsYmFjayk7CisgICAgSW5zcGVjdG9yQmFja2VuZC5lbmFibGVSZXNvdXJjZVRyYWNraW5n
KCk7CisgICAgSW5zcGVjdG9yQmFja2VuZC5lbmFibGVSZXNvdXJjZVRyYWNraW5nKHRydWUsICJu
b3QgYSBmdW5jdGlvbiIpOworICAgIAorICAgIEluc3BlY3RvclRlc3QuY29tcGxldGVUZXN0KCk7
Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+Cis8
cD4KK1Rlc3RzIHRoYXQgSW5zcGVjdG9yQmFja2VuZFN0dWIgaXMgY2F0Y2hpbmcgaW5jb3JyZWN0
IGFyZ3VtZW50cy4KKzwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA3MDUzMTc4Li4xYjc0YTQ5IDEw
MDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAt
MSwzICsxLDE5IEBACisyMDEwLTA4LTMwICBJbHlhIFRpa2hvbm92c2t5ICA8bG9pc2xvQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBXZWJJbnNwZWN0b3I6IEFzIGZhciBhcyB3ZSBoYXZlIHNvbWUga2luZCBvZiBBUEkgZm9yIElu
c3BlY3RvcgorICAgICAgICBpdCdkIGJlIGJldHRlciB0byBoYXZlIEFQSSByZWxhdGVkIHRlc3Rz
LiBUaGlzIGlzIHRoZSB0ZXN0CisgICAgICAgIGZvciBBUEkgd3JhcHBlcnMuIFRoZXNlIHdyYXBw
ZXJzIGFyZSB0cmFja2luZyB0aGUgdHlwZXMgb2YgYXJndW1lbnRzCisgICAgICAgIG9mIEFQSSBm
dW5jdGlvbnMuCisKKyAgICAgICAgVGVzdDogaW5zcGVjdG9yL3Byb3RvY29sLWVycm9yLmh0bWwK
KworICAgICAgICAqIGluc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnBtOgorICAgICAg
ICAqIGluc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzOgorICAgICAgICAoV2ViSW5zcGVj
dG9yX3N5bmNEaXNwYXRjaCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IucmVwb3J0UHJvdG9jb2xF
cnJvcik6CisKIDIwMTAtMDgtMzAgIFJ5dWFuIENob2kgIDxyeXVhbi5jaG9pQHNhbXN1bmcuY29t
PgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGQgZml4IHdpdGggQmxvYiBTdXBwb3J0CmRpZmYg
LS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnBtIGIvV2Vi
Q29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5wbQppbmRleCBiYzY1MGJhLi5k
NTg2ZDFhIDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVj
dG9yLnBtCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucG0K
QEAgLTMxNiw3ICszMTYsNiBAQCBzdWIgZ2VuZXJhdGVCYWNrZW5kRnVuY3Rpb24KICAgICAgICAg
cHVzaChAZnVuY3Rpb24sICIiKTsKICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyOyIpOwogICAgICAgICBwdXNoKEBm
dW5jdGlvbiwgIiAgICBpZiAoIShhcmd1bWVudHNDb250YWluZXIgPSByZXF1ZXN0TWVzc2FnZU9i
amVjdC0+Z2V0T2JqZWN0KFwiYXJndW1lbnRzXCIpKSkgeyIpOwotICAgICAgICBwdXNoKEBmdW5j
dGlvbiwgIiAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Iik7CiAgICAgICAgIHB1c2goQGZ1
bmN0aW9uLCAiICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1h
dChcIkVycm9yOiBhcmd1bWVudHMgb2JqZWN0IHdhcyBub3QgZm91bmQuXCIpKTsiKTsKICAgICAg
ICAgcHVzaChAZnVuY3Rpb24sICIgICAgfSBlbHNlIHsiKTsKICAgICAgICAgcHVzaChAZnVuY3Rp
b24sICIgICAgICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgYXJndW1lbnRzRW5k
SXRlcmF0b3IgPSBhcmd1bWVudHNDb250YWluZXItPmVuZCgpOyIpOwpAQCAtMzMwLDExICszMjks
OSBAQCBzdWIgZ2VuZXJhdGVCYWNrZW5kRnVuY3Rpb24KICAgICAgICAgICAgIHB1c2goQGZ1bmN0
aW9uLCAiIik7CiAgICAgICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAgSW5zcGVjdG9y
T2JqZWN0Ojpjb25zdF9pdGVyYXRvciAke25hbWV9VmFsdWVJdGVyYXRvciA9IGFyZ3VtZW50c0Nv
bnRhaW5lci0+ZmluZChcIiRuYW1lXCIpOyIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24s
ICIgICAgICAgIGlmICgke25hbWV9VmFsdWVJdGVyYXRvciA9PSBhcmd1bWVudHNFbmRJdGVyYXRv
cikgeyIpOwotICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsiKTsKICAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICAg
ICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoXCJFcnJvcjogQXJn
dW1lbnQgJyVzJyB3aXRoIHR5cGUgJyVzJyB3YXMgbm90IGZvdW5kLlwiLCBcIiRuYW1lXCIsIFwi
JEpTT05UeXBlXCIpKTsiKTsKICAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICB9
IGVsc2UgeyIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAgICAgICBpZiAo
ISR7bmFtZX1WYWx1ZUl0ZXJhdG9yLT5zZWNvbmQtPmFzJEpTT05UeXBlKCYkbmFtZSkpIHsiKTsK
LSAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOyIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAgICAgICAg
ICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoXCJFcnJvcjogQXJn
dW1lbnQgJyVzJyBoYXMgd3JvbmcgdHlwZS4gSXQgc2hvdWxkIGJlICclcycuXCIsIFwiJG5hbWVc
IiwgXCIkSlNPTlR5cGVcIikpOyIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAg
ICAgICAgICB9Iik7CiAgICAgICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAgfSIpOwpA
QCAtNDE3LDQ4ICs0MTQsNDEgQEAgJG1hcEVudHJpZXMKIAogICAgIFJlZlB0cjxJbnNwZWN0b3JW
YWx1ZT4gcGFyc2VkTWVzc2FnZSA9IEluc3BlY3RvclZhbHVlOjpwYXJzZUpTT04obWVzc2FnZSk7
CiAgICAgaWYgKCFwYXJzZWRNZXNzYWdlKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwgImRpc3BhdGNoIiwgIkVycm9y
OiBJbnZhbGlkIG1lc3NhZ2UgZm9ybWF0LiBNZXNzYWdlIHNob3VsZCBiZSBpbiBKU09OIGZvcm1h
dC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1lc3NhZ2VPYmplY3QgPSBwYXJzZWRNZXNzYWdlLT5hc09iamVjdCgpOwogICAgIGlmICgh
bWVzc2FnZU9iamVjdCkgewotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICAgICAg
cmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsICJkaXNwYXRjaCIsICJFcnJvcjogSW52YWxpZCBt
ZXNzYWdlIGZvcm1hdC4gVGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGEgSlNPTmlmaWVkIG9iamVjdC4i
KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4g
Y29tbWFuZFZhbHVlID0gbWVzc2FnZU9iamVjdC0+Z2V0KCJjb21tYW5kIik7CiAgICAgaWYgKCFj
b21tYW5kVmFsdWUpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgICAgIHJl
cG9ydFByb3RvY29sRXJyb3IoY2FsbElkLCAiZGlzcGF0Y2giLCAiRXJyb3I6IEludmFsaWQgbWVz
c2FnZSBmb3JtYXQuICdjb21tYW5kJyBwcm9wZXJ0eSB3YXNuJ3QgZm91bmQuIik7CiAgICAgICAg
IHJldHVybjsKICAgICB9CiAKICAgICBTdHJpbmcgY29tbWFuZDsKICAgICBpZiAoIWNvbW1hbmRW
YWx1ZS0+YXNTdHJpbmcoJmNvbW1hbmQpKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwgImRpc3BhdGNoIiwgIkVycm9y
OiBJbnZhbGlkIG1lc3NhZ2UgZm9ybWF0LiBUaGUgdHlwZSBvZiAnY29tbWFuZCcgcHJvcGVydHkg
c2hvdWxkIGJlIHN0cmluZy4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIFJlZlB0
cjxJbnNwZWN0b3JWYWx1ZT4gY2FsbElkVmFsdWUgPSBtZXNzYWdlT2JqZWN0LT5nZXQoInNlcSIp
OwogICAgIGlmICghY2FsbElkVmFsdWUpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CiAgICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoY2FsbElkLCBjb21tYW5kLnV0ZjgoKS5kYXRh
KCksICJFcnJvcjogSW52YWxpZCBtZXNzYWdlIGZvcm1hdC4gJ3NlcScgcHJvcGVydHkgd2FzIG5v
dCBmb3VuZCBpbiB0aGUgcmVxdWVzdC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAg
IGlmICghY2FsbElkVmFsdWUtPmFzTnVtYmVyKCZjYWxsSWQpKSB7Ci0gICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwgY29tbWFu
ZC51dGY4KCkuZGF0YSgpLCAiRXJyb3I6IEludmFsaWQgbWVzc2FnZSBmb3JtYXQuIHRoZSB0eXBl
IG9mICdzZXEnIHByb3BlcnR5IHNob3VsZCBiZSBudW1iZXIuIik7CiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAKICAgICBIYXNoTWFwPFN0cmluZywgQ2FsbEhhbmRsZXI+OjppdGVyYXRvciBpdCA9
IGRpc3BhdGNoTWFwLmZpbmQoY29tbWFuZCk7CiAgICAgaWYgKGl0ID09IGRpc3BhdGNoTWFwLmVu
ZCgpKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgICAgICByZXBvcnRQcm90
b2NvbEVycm9yKGNhbGxJZCwgImRpc3BhdGNoIiwgU3RyaW5nOjpmb3JtYXQoIkVycm9yOiBJbnZh
bGlkIGNvbW1hbmQgd2FzIHJlY2VpdmVkLiAnJXMnIHdhc24ndCBmb3VuZC4iLCBjb21tYW5kLnV0
ZjgoKS5kYXRhKCkpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUzMywxNCArNTIzLDI1
IEBAIFdlYkluc3BlY3Rvci5JbnNwZWN0b3JCYWNrZW5kU3R1Yi5wcm90b3R5cGUgPSB7CiAgICAg
ICAgIHZhciByZXF1ZXN0ID0gSlNPTi5wYXJzZShhcmdzLnNoaWZ0KCkpOwogCiAgICAgICAgIGZv
ciAodmFyIGtleSBpbiByZXF1ZXN0LmFyZ3VtZW50cykgeworICAgICAgICAgICAgaWYgKGFyZ3Mu
bGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgV2ViSW5zcGVjdG9yLnJlcG9ydFByb3Rv
Y29sRXJyb3IoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgJ0luc3BlY3RvckJhY2tl
bmQuIiArIHJlcXVlc3QuY29tbWFuZCArICInIGNhbGwuIEl0IHNob3VsZCBoYXZlIHRoZSBuZXh0
IGFyZ3VtZW50cyAnIiArIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYXJndW1lbnRzKSArICInLiIg
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB2
YXIgdmFsdWUgPSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9
PSByZXF1ZXN0LmFyZ3VtZW50c1trZXldKQotICAgICAgICAgICAgICAgIHRocm93KCJJbnZhbGlk
IHR5cGUgb2YgcHJvcGVydHkgIiArIGtleSArICIuIEl0IHNob3VsZCBiZSAnIiArIHJlcXVlc3Qu
YXJndW1lbnRzW2tleV0gKyAiJyBidXQgaXQgaXMgJyIgKyB0eXBlb2YgdmFsdWUgKyAiJy4iICk7
CisgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSByZXF1ZXN0LmFyZ3VtZW50c1trZXld
KSB7CisgICAgICAgICAgICAgICAgV2ViSW5zcGVjdG9yLnJlcG9ydFByb3RvY29sRXJyb3IoIklu
dmFsaWQgdHlwZSBvZiBhcmd1bWVudCAnIiArIGtleSArICInIGZvciAnSW5zcGVjdG9yQmFja2Vu
ZC4iICsgcmVxdWVzdC5jb21tYW5kICsgIicgY2FsbC4gSXQgc2hvdWxkIGJlICciICsgcmVxdWVz
dC5hcmd1bWVudHNba2V5XSArICInIGJ1dCBpdCBpcyAnIiArIHR5cGVvZiB2YWx1ZSArICInLiIg
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBy
ZXF1ZXN0LmFyZ3VtZW50c1trZXldID0gdmFsdWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAo
YXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICJmdW5jdGlvbiIpCisgICAg
ICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmdz
WzBdICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICAgICAgICAgICAgV2ViSW5zcGVjdG9yLnJlcG9y
dFByb3RvY29sRXJyb3IoIk9wdGlvbmFsIGNhbGxiYWNrIGFyZ3VtZW50IGZvciAnSW5zcGVjdG9y
QmFja2VuZC4iICsgcmVxdWVzdC5jb21tYW5kICsgIicgY2FsbCBzaG91bGQgYmUgYSBmdW5jdGlv
biBidXQgaXRzIHR5cGUgaXMgJyIgKyAodHlwZW9mIGFyZ3NbMF0pICsgIicuIiApOworICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcXVlc3Quc2Vx
ID0gV2ViSW5zcGVjdG9yLkNhbGxiYWNrLndyYXAoYXJnc1swXSk7CisgICAgICAgIH0KIAogICAg
ICAgICB2YXIgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpOwogICAgICAgICBJbnNw
ZWN0b3JGcm9udGVuZEhvc3Quc2VuZE1lc3NhZ2VUb0JhY2tlbmQobWVzc2FnZSk7CmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzIGIvV2ViQ29yZS9p
bnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qcwppbmRleCBjOGY1M2Q3Li4yNjRlMmVjIDEw
MDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzCisrKyBi
L1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMKQEAgLTY1Miw3ICs2NTIs
NyBAQCBXZWJJbnNwZWN0b3Jfc3luY0Rpc3BhdGNoID0gZnVuY3Rpb24obWVzc2FnZSkKIAogICAg
IGlmIChtZXNzYWdlT2JqZWN0LnR5cGUgPT09ICJldmVudCIpIHsKICAgICAgICAgaWYgKCFtZXNz
YWdlT2JqZWN0LmV2ZW50IGluIFdlYkluc3BlY3RvcikgewotICAgICAgICAgICAgY29uc29sZS5l
cnJvcigiQXR0ZW1wdGVkIHRvIGRpc3BhdGNoIHVuaW1wbGVtZW50ZWQgV2ViSW5zcGVjdG9yIG1l
dGhvZDogJXMiLCBtZXNzYWdlT2JqZWN0LmV2ZW50KTsKKyAgICAgICAgICAgIHRoaXMucmVwb3J0
UHJvdG9jb2xFcnJvcigiQXR0ZW1wdGVkIHRvIGRpc3BhdGNoIHVuaW1wbGVtZW50ZWQgV2ViSW5z
cGVjdG9yIG1ldGhvZDogJXMiLCBtZXNzYWdlT2JqZWN0LmV2ZW50KTsKICAgICAgICAgICAgIHJl
dHVybjsKICAgICAgICAgfQogICAgICAgICBXZWJJbnNwZWN0b3JbbWVzc2FnZU9iamVjdC5ldmVu
dF0uYXBwbHkoV2ViSW5zcGVjdG9yLCBhcmd1bWVudHMpOwpAQCAtNjY0LDkgKzY2NCwxNCBAQCBX
ZWJJbnNwZWN0b3IuZGlzcGF0Y2hNZXNzYWdlRnJvbUJhY2tlbmQgPSBmdW5jdGlvbihtZXNzYWdl
T2JqZWN0KQogICAgIFdlYkluc3BlY3Rvci5kaXNwYXRjaChtZXNzYWdlT2JqZWN0KTsKIH0KIAot
V2ViSW5zcGVjdG9yLnJlcG9ydFByb3RvY29sRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlT2JqZWN0
KQorV2ViSW5zcGVjdG9yLnJlcG9ydFByb3RvY29sRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQog
ewotICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yOiBJbnNwZWN0b3JCYWNrZW5kIHJlcXVlc3Qgd2l0
aCBzZXEgPSAiICsgbWVzc2FnZU9iamVjdC5zZXEgKyAiIGZhaWxlZC4iKTsKKyAgICBpZiAodHlw
ZW9mIG1lc3NhZ2UgPT09ICJzdHJpbmciKSB7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoIlByb3Rv
Y29sIEVycm9yOiAiICsgbWVzc2FnZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBj
b25zb2xlLmVycm9yKCJQcm90b2NvbCBFcnJvcjogSW5zcGVjdG9yQmFja2VuZCByZXF1ZXN0IHdp
dGggc2VxID0gIiArIG1lc3NhZ2VPYmplY3Quc2VxICsgIiBmYWlsZWQuIik7CiAgICAgZm9yICh2
YXIgZXJyb3IgaW4gbWVzc2FnZU9iamVjdC5lcnJvcnMpCiAgICAgICAgIGNvbnNvbGUuZXJyb3Io
IiAgICAiICsgZXJyb3IpOwogICAgIFdlYkluc3BlY3Rvci5yZW1vdmVSZXNwb25zZUNhbGxiYWNr
RW50cnkobWVzc2FnZU9iamVjdC5zZXEpOwo=
</data>
<flag name="review"
          id="54800"
          type_id="1"
          status="-"
          setter="joepeck"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65947</attachid>
            <date>2010-08-30 13:03:57 -0700</date>
            <delta_ts>2010-08-30 13:17:56 -0700</delta_ts>
            <desc>[patch] second iteration</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>10506</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBkZjk4NWM0Li43MDBiMzhmIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTAtMDgt
MzAgIElseWEgVGlraG9ub3Zza3kgIDxsb2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdlYkluc3BlY3RvcjogaXQnZCBi
ZSBiZXR0ZXIgdG8gaW50cm9kdWNlIGluc3BlY3RvciBBUEkgcmVsYXRlZCB0ZXN0cy4gCisgICAg
ICAgIEFzIGZhciBhcyB3ZSBoYXZlIHNvbWUga2luZCBvZiBBUEkgZm9yIEluc3BlY3RvcgorICAg
ICAgICBpdCdkIGJlIGJldHRlciB0byBoYXZlIEFQSSByZWxhdGVkIHRlc3RzLiBUaGlzIGlzIHRo
ZSB0ZXN0CisgICAgICAgIGZvciBBUEkgd3JhcHBlcnMuIFRoZXNlIHdyYXBwZXJzIGFyZSB0cmFj
a2luZyB0aGUgdHlwZXMgb2YgYXJndW1lbnRzCisgICAgICAgIG9mIEFQSSBmdW5jdGlvbnMuCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDg3NQorCisg
ICAgICAgICogaW5zcGVjdG9yL3Byb3RvY29sLWVycm9yLWV4cGVjdGVkLnR4dDogQWRkZWQuCisg
ICAgICAgICogaW5zcGVjdG9yL3Byb3RvY29sLWVycm9yLmh0bWw6IEFkZGVkLgorCiAyMDEwLTA4
LTMwICBEdW1pdHJ1IERhbmlsaXVjICA8ZHVtaUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgVW5y
ZXZpZXdlZCwgdXBkYXRpbmcgQ2hyb21pdW0gZXhwZWN0YXRpb25zLgpkaWZmIC0tZ2l0IGEvTGF5
b3V0VGVzdHMvaW5zcGVjdG9yL3JlcG9ydC1BUEktZXJyb3JzLWV4cGVjdGVkLnR4dCBiL0xheW91
dFRlc3RzL2luc3BlY3Rvci9yZXBvcnQtQVBJLWVycm9ycy1leHBlY3RlZC50eHQKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwYjI0MgotLS0gL2Rldi9udWxsCisrKyBiL0xh
eW91dFRlc3RzL2luc3BlY3Rvci9yZXBvcnQtQVBJLWVycm9ycy1leHBlY3RlZC50eHQKQEAgLTAs
MCArMSw3IEBACitUZXN0cyB0aGF0IEluc3BlY3RvckJhY2tlbmRTdHViIGlzIGNhdGNoaW5nIGlu
Y29ycmVjdCBhcmd1bWVudHMuCisKK1Byb3RvY29sIEVycm9yOiBJbnZhbGlkIHR5cGUgb2YgYXJn
dW1lbnQgJ2Fsd2F5cycgZm9yICdJbnNwZWN0b3JCYWNrZW5kLmVuYWJsZVJlc291cmNlVHJhY2tp
bmcnIGNhbGwuIEl0IHNob3VsZCBiZSAnYm9vbGVhbicgYnV0IGl0IGlzICdudW1iZXInLgorUHJv
dG9jb2wgRXJyb3I6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgJ0luc3BlY3RvckJh
Y2tlbmQuZW5hYmxlUmVzb3VyY2VUcmFja2luZycgY2FsbC4gSXQgc2hvdWxkIGhhdmUgdGhlIG5l
eHQgYXJndW1lbnRzICd7ImFsd2F5cyI6ImJvb2xlYW4ifScuCitQcm90b2NvbCBFcnJvcjogT3B0
aW9uYWwgY2FsbGJhY2sgYXJndW1lbnQgZm9yICdJbnNwZWN0b3JCYWNrZW5kLmVuYWJsZVJlc291
cmNlVHJhY2tpbmcnIGNhbGwgc2hvdWxkIGJlIGEgZnVuY3Rpb24gYnV0IGl0cyB0eXBlIGlzICdz
dHJpbmcnLgorUHJvdG9jb2wgRXJyb3I6IEF0dGVtcHRlZCB0byBkaXNwYXRjaCBhbiB1bmltcGxl
bWVudGVkIFdlYkluc3BlY3RvciBtZXRob2Q6ICdzb21ldGhpbmctc3RyYW5nZScKKwpkaWZmIC0t
Z2l0IGEvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3JlcG9ydC1BUEktZXJyb3JzLmh0bWwgYi9MYXlv
dXRUZXN0cy9pbnNwZWN0b3IvcmVwb3J0LUFQSS1lcnJvcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi4yNGY5OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVz
dHMvaW5zcGVjdG9yL3JlcG9ydC1BUEktZXJyb3JzLmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPGh0
bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9odHRwL3Rlc3RzL2luc3BlY3Rvci9pbnNwZWN0
b3ItdGVzdDIuanMiPjwvc2NyaXB0PgorPHNjcmlwdD4KKworZnVuY3Rpb24gdGVzdCgpCit7Cisg
ICAgZnVuY3Rpb24gY2FsbGJhY2soKQorICAgIHsKKyAgICAgICAgSW5zcGVjdG9yVGVzdC5hZGRS
ZXN1bHQoU3RyaW5nLnNwcmludGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CisgICAgfQorCisg
ICAgSW5zcGVjdG9yVGVzdC5fYWRkU25pZmZlcihjb25zb2xlLCAiZXJyb3IiLCBjYWxsYmFjaywg
dHJ1ZSk7CisKKyAgICBJbnNwZWN0b3JCYWNrZW5kLmVuYWJsZVJlc291cmNlVHJhY2tpbmcoMSwg
Y2FsbGJhY2spOworICAgIEluc3BlY3RvckJhY2tlbmQuZW5hYmxlUmVzb3VyY2VUcmFja2luZygp
OworICAgIEluc3BlY3RvckJhY2tlbmQuZW5hYmxlUmVzb3VyY2VUcmFja2luZyh0cnVlLCAibm90
IGEgZnVuY3Rpb24iKTsKKyAgICB0cnkgeworICAgIHdpbmRvdy5XZWJJbnNwZWN0b3Jfc3luY0Rp
c3BhdGNoKCd7InR5cGUiOiAiZXZlbnQiLCAiZG9tYWluIjogImRvbSIsICJldmVudCI6ICJzb21l
dGhpbmctc3RyYW5nZSIsICJkYXRhIjoge319Jyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAg
ICBjYWxsYmFjayhlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEluc3BlY3RvclRlc3QuY29t
cGxldGVUZXN0KCk7Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1
blRlc3QoKSI+Cis8cD4KK1Rlc3RzIHRoYXQgSW5zcGVjdG9yQmFja2VuZFN0dWIgaXMgY2F0Y2hp
bmcgaW5jb3JyZWN0IGFyZ3VtZW50cy4KKzwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA3MDUzMTc4
Li5kMDQ0MzU2IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0No
YW5nZUxvZwpAQCAtMSwzICsxLDIxIEBACisyMDEwLTA4LTMwICBJbHlhIFRpa2hvbm92c2t5ICA8
bG9pc2xvQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBXZWJJbnNwZWN0b3I6IGl0J2QgYmUgYmV0dGVyIHRvIGludHJvZHVjZSBp
bnNwZWN0b3IgQVBJIHJlbGF0ZWQgdGVzdHMuCisgICAgICAgIEFzIGZhciBhcyB3ZSBoYXZlIHNv
bWUga2luZCBvZiBBUEkgZm9yIEluc3BlY3RvcgorICAgICAgICBpdCdkIGJlIGJldHRlciB0byBo
YXZlIEFQSSByZWxhdGVkIHRlc3RzLiBUaGlzIGlzIHRoZSB0ZXN0CisgICAgICAgIGZvciBBUEkg
d3JhcHBlcnMuIFRoZXNlIHdyYXBwZXJzIGFyZSB0cmFja2luZyB0aGUgdHlwZXMgb2YgYXJndW1l
bnRzCisgICAgICAgIG9mIEFQSSBmdW5jdGlvbnMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDg3NQorCisgICAgICAgIFRlc3Q6IGluc3BlY3Rvci9w
cm90b2NvbC1lcnJvci5odG1sCisKKyAgICAgICAgKiBpbnNwZWN0b3IvQ29kZUdlbmVyYXRvcklu
c3BlY3Rvci5wbToKKyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qczoK
KyAgICAgICAgKFdlYkluc3BlY3Rvcl9zeW5jRGlzcGF0Y2gpOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLnJlcG9ydFByb3RvY29sRXJyb3IpOgorCiAyMDEwLTA4LTMwICBSeXVhbiBDaG9pICA8cnl1
YW4uY2hvaUBzYW1zdW5nLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkIGJ1aWxkIGZpeCB3aXRo
IEJsb2IgU3VwcG9ydApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRv
ckluc3BlY3Rvci5wbSBiL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3Iu
cG0KaW5kZXggYmM2NTBiYS4uZjU5MjhjNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3Iv
Q29kZUdlbmVyYXRvckluc3BlY3Rvci5wbQorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2Vu
ZXJhdG9ySW5zcGVjdG9yLnBtCkBAIC0zMTYsNyArMzE2LDYgQEAgc3ViIGdlbmVyYXRlQmFja2Vu
ZEZ1bmN0aW9uCiAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiIik7CiAgICAgICAgIHB1c2goQGZ1
bmN0aW9uLCAiICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lcjsi
KTsKICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgaWYgKCEoYXJndW1lbnRzQ29udGFpbmVy
ID0gcmVxdWVzdE1lc3NhZ2VPYmplY3QtPmdldE9iamVjdChcImFyZ3VtZW50c1wiKSkpIHsiKTsK
LSAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyIp
OwogICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hT
dHJpbmcoU3RyaW5nOjpmb3JtYXQoXCJFcnJvcjogYXJndW1lbnRzIG9iamVjdCB3YXMgbm90IGZv
dW5kLlwiKSk7Iik7CiAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgIH0gZWxzZSB7Iik7CiAg
ICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0
ZXJhdG9yIGFyZ3VtZW50c0VuZEl0ZXJhdG9yID0gYXJndW1lbnRzQ29udGFpbmVyLT5lbmQoKTsi
KTsKQEAgLTMzMCwxMSArMzI5LDkgQEAgc3ViIGdlbmVyYXRlQmFja2VuZEZ1bmN0aW9uCiAgICAg
ICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24s
ICIgICAgICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgJHtuYW1lfVZhbHVlSXRl
cmF0b3IgPSBhcmd1bWVudHNDb250YWluZXItPmZpbmQoXCIkbmFtZVwiKTsiKTsKICAgICAgICAg
ICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICBpZiAoJHtuYW1lfVZhbHVlSXRlcmF0b3IgPT0g
YXJndW1lbnRzRW5kSXRlcmF0b3IpIHsiKTsKLSAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAi
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Iik7CiAgICAgICAgICAgICBwdXNoKEBm
dW5jdGlvbiwgIiAgICAgICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6
Zm9ybWF0KFwiRXJyb3I6IEFyZ3VtZW50ICclcycgd2l0aCB0eXBlICclcycgd2FzIG5vdCBmb3Vu
ZC5cIiwgXCIkbmFtZVwiLCBcIiRKU09OVHlwZVwiKSk7Iik7CiAgICAgICAgICAgICBwdXNoKEBm
dW5jdGlvbiwgIiAgICAgICAgfSBlbHNlIHsiKTsKICAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9u
LCAiICAgICAgICAgICAgaWYgKCEke25hbWV9VmFsdWVJdGVyYXRvci0+c2Vjb25kLT5hcyRKU09O
VHlwZSgmJG5hbWUpKSB7Iik7Ci0gICAgICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsiKTsKICAgICAgICAgICAgIHB1c2goQGZ1bmN0
aW9uLCAiICAgICAgICAgICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6
Zm9ybWF0KFwiRXJyb3I6IEFyZ3VtZW50ICclcycgaGFzIHdyb25nIHR5cGUuIEl0IHNob3VsZCBi
ZSAnJXMnLlwiLCBcIiRuYW1lXCIsIFwiJEpTT05UeXBlXCIpKTsiKTsKICAgICAgICAgICAgIHB1
c2goQGZ1bmN0aW9uLCAiICAgICAgICAgICAgfSIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rp
b24sICIgICAgICAgIH0iKTsKQEAgLTQxNyw0OCArNDE0LDQxIEBAICRtYXBFbnRyaWVzCiAKICAg
ICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHBhcnNlZE1lc3NhZ2UgPSBJbnNwZWN0b3JWYWx1ZTo6
cGFyc2VKU09OKG1lc3NhZ2UpOwogICAgIGlmICghcGFyc2VkTWVzc2FnZSkgewotICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQs
ICJkaXNwYXRjaCIsICJFcnJvcjogSW52YWxpZCBtZXNzYWdlIGZvcm1hdC4gTWVzc2FnZSBzaG91
bGQgYmUgaW4gSlNPTiBmb3JtYXQuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlT2JqZWN0ID0gcGFyc2VkTWVzc2FnZS0+YXNP
YmplY3QoKTsKICAgICBpZiAoIW1lc3NhZ2VPYmplY3QpIHsKLSAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CiAgICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoY2FsbElkLCAiZGlzcGF0Y2gi
LCAiRXJyb3I6IEludmFsaWQgbWVzc2FnZSBmb3JtYXQuIFRoZSBtZXNzYWdlIHNob3VsZCBiZSBh
IEpTT05pZmllZCBvYmplY3QuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBSZWZQ
dHI8SW5zcGVjdG9yVmFsdWU+IGNvbW1hbmRWYWx1ZSA9IG1lc3NhZ2VPYmplY3QtPmdldCgiY29t
bWFuZCIpOwogICAgIGlmICghY29tbWFuZFZhbHVlKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwgImRpc3BhdGNoIiwg
IkVycm9yOiBJbnZhbGlkIG1lc3NhZ2UgZm9ybWF0LiAnY29tbWFuZCcgcHJvcGVydHkgd2Fzbid0
IGZvdW5kLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgU3RyaW5nIGNvbW1hbmQ7
CiAgICAgaWYgKCFjb21tYW5kVmFsdWUtPmFzU3RyaW5nKCZjb21tYW5kKSkgewotICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQs
ICJkaXNwYXRjaCIsICJFcnJvcjogSW52YWxpZCBtZXNzYWdlIGZvcm1hdC4gVGhlIHR5cGUgb2Yg
J2NvbW1hbmQnIHByb3BlcnR5IHNob3VsZCBiZSBzdHJpbmcuIik7CiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAKICAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IGNhbGxJZFZhbHVlID0gbWVzc2Fn
ZU9iamVjdC0+Z2V0KCJzZXEiKTsKICAgICBpZiAoIWNhbGxJZFZhbHVlKSB7Ci0gICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwg
Y29tbWFuZC51dGY4KCkuZGF0YSgpLCAiRXJyb3I6IEludmFsaWQgbWVzc2FnZSBmb3JtYXQuICdz
ZXEnIHByb3BlcnR5IHdhcyBub3QgZm91bmQgaW4gdGhlIHJlcXVlc3QuIik7CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAKICAgICBpZiAoIWNhbGxJZFZhbHVlLT5hc051bWJlcigmY2FsbElkKSkg
ewotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICAgICAgcmVwb3J0UHJvdG9jb2xF
cnJvcihjYWxsSWQsIGNvbW1hbmQudXRmOCgpLmRhdGEoKSwgIkVycm9yOiBJbnZhbGlkIG1lc3Nh
Z2UgZm9ybWF0LiB0aGUgdHlwZSBvZiAnc2VxJyBwcm9wZXJ0eSBzaG91bGQgYmUgbnVtYmVyLiIp
OwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgSGFzaE1hcDxTdHJpbmcsIENhbGxIYW5k
bGVyPjo6aXRlcmF0b3IgaXQgPSBkaXNwYXRjaE1hcC5maW5kKGNvbW1hbmQpOwogICAgIGlmIChp
dCA9PSBkaXNwYXRjaE1hcC5lbmQoKSkgewotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
ICAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsICJkaXNwYXRjaCIsIFN0cmluZzo6
Zm9ybWF0KCJFcnJvcjogSW52YWxpZCBjb21tYW5kIHdhcyByZWNlaXZlZC4gJyVzJyB3YXNuJ3Qg
Zm91bmQuIiwgY29tbWFuZC51dGY4KCkuZGF0YSgpKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9
CkBAIC01MzMsMTQgKzUyMywyNSBAQCBXZWJJbnNwZWN0b3IuSW5zcGVjdG9yQmFja2VuZFN0dWIu
cHJvdG90eXBlID0gewogICAgICAgICB2YXIgcmVxdWVzdCA9IEpTT04ucGFyc2UoYXJncy5zaGlm
dCgpKTsKIAogICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmVxdWVzdC5hcmd1bWVudHMpIHsKKyAg
ICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnNv
bGUuZXJyb3IoIlByb3RvY29sIEVycm9yOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9y
ICdJbnNwZWN0b3JCYWNrZW5kLiVzJyBjYWxsLiBJdCBzaG91bGQgaGF2ZSB0aGUgbmV4dCBhcmd1
bWVudHMgJyVzJy4iLCByZXF1ZXN0LmNvbW1hbmQsIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYXJn
dW1lbnRzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAg
ICAgICAgdmFyIHZhbHVlID0gYXJncy5zaGlmdCgpOwotICAgICAgICAgICAgaWYgKHR5cGVvZiB2
YWx1ZSAhPT0gcmVxdWVzdC5hcmd1bWVudHNba2V5XSkKLSAgICAgICAgICAgICAgICB0aHJvdygi
SW52YWxpZCB0eXBlIG9mIHByb3BlcnR5ICIgKyBrZXkgKyAiLiBJdCBzaG91bGQgYmUgJyIgKyBy
ZXF1ZXN0LmFyZ3VtZW50c1trZXldICsgIicgYnV0IGl0IGlzICciICsgdHlwZW9mIHZhbHVlICsg
IicuIiApOworICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gcmVxdWVzdC5hcmd1bWVu
dHNba2V5XSkgeworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlByb3RvY29sIEVycm9y
OiBJbnZhbGlkIHR5cGUgb2YgYXJndW1lbnQgJyVzJyBmb3IgJ0luc3BlY3RvckJhY2tlbmQuJXMn
IGNhbGwuIEl0IHNob3VsZCBiZSAnJXMnIGJ1dCBpdCBpcyAnJXMnLiIsIGtleSwgcmVxdWVzdC5j
b21tYW5kLCByZXF1ZXN0LmFyZ3VtZW50c1trZXldLCB0eXBlb2YodmFsdWUpKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXF1ZXN0LmFyZ3Vt
ZW50c1trZXldID0gdmFsdWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoYXJncy5sZW5ndGgg
PT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICJmdW5jdGlvbiIpCisgICAgICAgIGlmIChhcmdz
Lmxlbmd0aCA9PT0gMSkgeworICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdICE9PSAiZnVu
Y3Rpb24iKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUHJvdG9jb2wgRXJyb3I6
IE9wdGlvbmFsIGNhbGxiYWNrIGFyZ3VtZW50IGZvciAnSW5zcGVjdG9yQmFja2VuZC4lcycgY2Fs
bCBzaG91bGQgYmUgYSBmdW5jdGlvbiBidXQgaXRzIHR5cGUgaXMgJyVzJy4iLCByZXF1ZXN0LmNv
bW1hbmQsIHR5cGVvZihhcmdzWzBdKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAgICAgfQogICAgICAgICAgICAgcmVxdWVzdC5zZXEgPSBXZWJJbnNwZWN0b3IuQ2FsbGJhY2su
d3JhcChhcmdzWzBdKTsKKyAgICAgICAgfQogCiAgICAgICAgIHZhciBtZXNzYWdlID0gSlNPTi5z
dHJpbmdpZnkocmVxdWVzdCk7CiAgICAgICAgIEluc3BlY3RvckZyb250ZW5kSG9zdC5zZW5kTWVz
c2FnZVRvQmFja2VuZChtZXNzYWdlKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zy
b250LWVuZC9pbnNwZWN0b3IuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVj
dG9yLmpzCmluZGV4IGM4ZjUzZDcuLjBiZmYzMzUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVj
dG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQt
ZW5kL2luc3BlY3Rvci5qcwpAQCAtNjUxLDggKzY1MSw4IEBAIFdlYkluc3BlY3Rvcl9zeW5jRGlz
cGF0Y2ggPSBmdW5jdGlvbihtZXNzYWdlKQogICAgIH0KIAogICAgIGlmIChtZXNzYWdlT2JqZWN0
LnR5cGUgPT09ICJldmVudCIpIHsKLSAgICAgICAgaWYgKCFtZXNzYWdlT2JqZWN0LmV2ZW50IGlu
IFdlYkluc3BlY3RvcikgewotICAgICAgICAgICAgY29uc29sZS5lcnJvcigiQXR0ZW1wdGVkIHRv
IGRpc3BhdGNoIHVuaW1wbGVtZW50ZWQgV2ViSW5zcGVjdG9yIG1ldGhvZDogJXMiLCBtZXNzYWdl
T2JqZWN0LmV2ZW50KTsKKyAgICAgICAgaWYgKCEobWVzc2FnZU9iamVjdC5ldmVudCBpbiBXZWJJ
bnNwZWN0b3IpKSB7CisgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJQcm90b2NvbCBFcnJvcjog
QXR0ZW1wdGVkIHRvIGRpc3BhdGNoIGFuIHVuaW1wbGVtZW50ZWQgV2ViSW5zcGVjdG9yIG1ldGhv
ZCAnJXMnIiwgbWVzc2FnZU9iamVjdC5ldmVudCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgIH0KICAgICAgICAgV2ViSW5zcGVjdG9yW21lc3NhZ2VPYmplY3QuZXZlbnRdLmFwcGx5KFdl
Ykluc3BlY3RvciwgYXJndW1lbnRzKTsKQEAgLTY2Niw3ICs2NjYsNyBAQCBXZWJJbnNwZWN0b3Iu
ZGlzcGF0Y2hNZXNzYWdlRnJvbUJhY2tlbmQgPSBmdW5jdGlvbihtZXNzYWdlT2JqZWN0KQogCiBX
ZWJJbnNwZWN0b3IucmVwb3J0UHJvdG9jb2xFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2VPYmplY3Qp
CiB7Ci0gICAgY29uc29sZS5lcnJvcigiRXJyb3I6IEluc3BlY3RvckJhY2tlbmQgcmVxdWVzdCB3
aXRoIHNlcSA9ICIgKyBtZXNzYWdlT2JqZWN0LnNlcSArICIgZmFpbGVkLiIpOworICAgIGNvbnNv
bGUuZXJyb3IoIlByb3RvY29sIEVycm9yOiBJbnNwZWN0b3JCYWNrZW5kIHJlcXVlc3Qgd2l0aCBz
ZXEgPSAlZCBmYWlsZWQuIiwgbWVzc2FnZU9iamVjdC5zZXEpOwogICAgIGZvciAodmFyIGVycm9y
IGluIG1lc3NhZ2VPYmplY3QuZXJyb3JzKQogICAgICAgICBjb25zb2xlLmVycm9yKCIgICAgIiAr
IGVycm9yKTsKICAgICBXZWJJbnNwZWN0b3IucmVtb3ZlUmVzcG9uc2VDYWxsYmFja0VudHJ5KG1l
c3NhZ2VPYmplY3Quc2VxKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65950</attachid>
            <date>2010-08-30 13:17:56 -0700</date>
            <delta_ts>2010-08-31 09:50:00 -0700</delta_ts>
            <desc>[patch] third iteration.</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>10379</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCA1YzFiNDA0Li5lZTYzZDNmIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTAtMDgt
MzAgIElseWEgVGlraG9ub3Zza3kgIDxsb2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdlYkluc3BlY3RvcjogaXQnZCBi
ZSBiZXR0ZXIgdG8gaW50cm9kdWNlIGluc3BlY3RvciBBUEkgcmVsYXRlZCB0ZXN0cy4KKyAgICAg
ICAgQXMgZmFyIGFzIHdlIGhhdmUgc29tZSBraW5kIG9mIEFQSSBmb3IgSW5zcGVjdG9yCisgICAg
ICAgIGl0J2QgYmUgYmV0dGVyIHRvIGhhdmUgQVBJIHJlbGF0ZWQgdGVzdHMuIFRoaXMgaXMgdGhl
IHRlc3QKKyAgICAgICAgZm9yIEFQSSB3cmFwcGVycy4gVGhlc2Ugd3JhcHBlcnMgYXJlIHRyYWNr
aW5nIHRoZSB0eXBlcyBvZiBhcmd1bWVudHMKKyAgICAgICAgb2YgQVBJIGZ1bmN0aW9ucy4KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0ODc1CisKKyAg
ICAgICAgKiBpbnNwZWN0b3IvcHJvdG9jb2wtZXJyb3ItZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAg
ICAgICAgKiBpbnNwZWN0b3IvcHJvdG9jb2wtZXJyb3IuaHRtbDogQWRkZWQuCisKIDIwMTAtMDgt
MzAgIEJldGggRGFraW4gIDxiZGFraW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IFNhbSBXZWluaWcuCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvcmVwb3J0LUFQ
SS1lcnJvcnMtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3JlcG9ydC1BUEkt
ZXJyb3JzLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5k
M2U1MDcyCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3JlcG9ydC1B
UEktZXJyb3JzLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDcgQEAKK1Rlc3RzIHRoYXQgSW5zcGVj
dG9yQmFja2VuZFN0dWIgaXMgY2F0Y2hpbmcgaW5jb3JyZWN0IGFyZ3VtZW50cy4KKworUHJvdG9j
b2wgRXJyb3I6IEludmFsaWQgdHlwZSBvZiBhcmd1bWVudCAnYWx3YXlzJyBmb3IgJ0luc3BlY3Rv
ckJhY2tlbmQuZW5hYmxlUmVzb3VyY2VUcmFja2luZycgY2FsbC4gSXQgc2hvdWxkIGJlICdib29s
ZWFuJyBidXQgaXQgaXMgJ251bWJlcicuCitQcm90b2NvbCBFcnJvcjogSW52YWxpZCBudW1iZXIg
b2YgYXJndW1lbnRzIGZvciAnSW5zcGVjdG9yQmFja2VuZC5lbmFibGVSZXNvdXJjZVRyYWNraW5n
JyBjYWxsLiBJdCBzaG91bGQgaGF2ZSB0aGUgbmV4dCBhcmd1bWVudHMgJ3siYWx3YXlzIjoiYm9v
bGVhbiJ9Jy4KK1Byb3RvY29sIEVycm9yOiBPcHRpb25hbCBjYWxsYmFjayBhcmd1bWVudCBmb3Ig
J0luc3BlY3RvckJhY2tlbmQuZW5hYmxlUmVzb3VyY2VUcmFja2luZycgY2FsbCBzaG91bGQgYmUg
YSBmdW5jdGlvbiBidXQgaXRzIHR5cGUgaXMgJ3N0cmluZycuCitQcm90b2NvbCBFcnJvcjogQXR0
ZW1wdGVkIHRvIGRpc3BhdGNoIGFuIHVuaW1wbGVtZW50ZWQgV2ViSW5zcGVjdG9yIG1ldGhvZCAn
c29tZXRoaW5nLXN0cmFuZ2UnCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2luc3BlY3Rvci9y
ZXBvcnQtQVBJLWVycm9ycy5odG1sIGIvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3JlcG9ydC1BUEkt
ZXJyb3JzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMGI2Ngot
LS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2luc3BlY3Rvci9yZXBvcnQtQVBJLWVycm9y
cy5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4v
aHR0cC90ZXN0cy9pbnNwZWN0b3IvaW5zcGVjdG9yLXRlc3QyLmpzIj48L3NjcmlwdD4KKzxzY3Jp
cHQ+CisKK2Z1bmN0aW9uIHRlc3QoKQoreworICAgIGZ1bmN0aW9uIGNhbGxiYWNrKCkKKyAgICB7
CisgICAgICAgIEluc3BlY3RvclRlc3QuYWRkUmVzdWx0KFN0cmluZy5zcHJpbnRmLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cykpOworICAgIH0KKworICAgIEluc3BlY3RvclRlc3QuX2FkZFNuaWZmZXIo
Y29uc29sZSwgImVycm9yIiwgY2FsbGJhY2ssIHRydWUpOworCisgICAgSW5zcGVjdG9yQmFja2Vu
ZC5lbmFibGVSZXNvdXJjZVRyYWNraW5nKDEsIGNhbGxiYWNrKTsKKyAgICBJbnNwZWN0b3JCYWNr
ZW5kLmVuYWJsZVJlc291cmNlVHJhY2tpbmcoKTsKKyAgICBJbnNwZWN0b3JCYWNrZW5kLmVuYWJs
ZVJlc291cmNlVHJhY2tpbmcodHJ1ZSwgIm5vdCBhIGZ1bmN0aW9uIik7CisgICAgV2ViSW5zcGVj
dG9yX3N5bmNEaXNwYXRjaCgneyJ0eXBlIjogImV2ZW50IiwgImRvbWFpbiI6ICJkb20iLCAiZXZl
bnQiOiAic29tZXRoaW5nLXN0cmFuZ2UiLCAiZGF0YSI6IHt9fScpOworCisgICAgSW5zcGVjdG9y
VGVzdC5jb21wbGV0ZVRlc3QoKTsKK30KKworPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5IG9u
bG9hZD0icnVuVGVzdCgpIj4KKzxwPgorVGVzdHMgdGhhdCBJbnNwZWN0b3JCYWNrZW5kU3R1YiBp
cyBjYXRjaGluZyBpbmNvcnJlY3QgYXJndW1lbnRzLgorPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+
CmRpZmYgLS1naXQgYS9XZWJDb3JlL0NoYW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4
IDhmNTVkNzAuLmYxNmQ5NWMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dl
YkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDgtMzAgIElseWEgVGlraG9u
b3Zza3kgIDxsb2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFdlYkluc3BlY3RvcjogaXQnZCBiZSBiZXR0ZXIgdG8gaW50
cm9kdWNlIGluc3BlY3RvciBBUEkgcmVsYXRlZCB0ZXN0cy4KKyAgICAgICAgQXMgZmFyIGFzIHdl
IGhhdmUgc29tZSBraW5kIG9mIEFQSSBmb3IgSW5zcGVjdG9yCisgICAgICAgIGl0J2QgYmUgYmV0
dGVyIHRvIGhhdmUgQVBJIHJlbGF0ZWQgdGVzdHMuIFRoaXMgaXMgdGhlIHRlc3QKKyAgICAgICAg
Zm9yIEFQSSB3cmFwcGVycy4gVGhlc2Ugd3JhcHBlcnMgYXJlIHRyYWNraW5nIHRoZSB0eXBlcyBv
ZiBhcmd1bWVudHMKKyAgICAgICAgb2YgQVBJIGZ1bmN0aW9ucy4KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0ODc1CisKKyAgICAgICAgVGVzdDogaW5z
cGVjdG9yL3Byb3RvY29sLWVycm9yLmh0bWwKKworICAgICAgICAqIGluc3BlY3Rvci9Db2RlR2Vu
ZXJhdG9ySW5zcGVjdG9yLnBtOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVj
dG9yLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yX3N5bmNEaXNwYXRjaCk6CisgICAgICAgIChX
ZWJJbnNwZWN0b3IucmVwb3J0UHJvdG9jb2xFcnJvcik6CisKIDIwMTAtMDgtMzAgIEJldGggRGFr
aW4gIDxiZGFraW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcu
CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnBt
IGIvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5wbQppbmRleCBiYzY1
MGJhLi5mNTkyOGM2IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9y
SW5zcGVjdG9yLnBtCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0
b3IucG0KQEAgLTMxNiw3ICszMTYsNiBAQCBzdWIgZ2VuZXJhdGVCYWNrZW5kRnVuY3Rpb24KICAg
ICAgICAgcHVzaChAZnVuY3Rpb24sICIiKTsKICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyOyIpOwogICAgICAgICBw
dXNoKEBmdW5jdGlvbiwgIiAgICBpZiAoIShhcmd1bWVudHNDb250YWluZXIgPSByZXF1ZXN0TWVz
c2FnZU9iamVjdC0+Z2V0T2JqZWN0KFwiYXJndW1lbnRzXCIpKSkgeyIpOwotICAgICAgICBwdXNo
KEBmdW5jdGlvbiwgIiAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Iik7CiAgICAgICAgIHB1
c2goQGZ1bmN0aW9uLCAiICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6
OmZvcm1hdChcIkVycm9yOiBhcmd1bWVudHMgb2JqZWN0IHdhcyBub3QgZm91bmQuXCIpKTsiKTsK
ICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgfSBlbHNlIHsiKTsKICAgICAgICAgcHVzaChA
ZnVuY3Rpb24sICIgICAgICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgYXJndW1l
bnRzRW5kSXRlcmF0b3IgPSBhcmd1bWVudHNDb250YWluZXItPmVuZCgpOyIpOwpAQCAtMzMwLDEx
ICszMjksOSBAQCBzdWIgZ2VuZXJhdGVCYWNrZW5kRnVuY3Rpb24KICAgICAgICAgICAgIHB1c2go
QGZ1bmN0aW9uLCAiIik7CiAgICAgICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAgSW5z
cGVjdG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciAke25hbWV9VmFsdWVJdGVyYXRvciA9IGFyZ3Vt
ZW50c0NvbnRhaW5lci0+ZmluZChcIiRuYW1lXCIpOyIpOwogICAgICAgICAgICAgcHVzaChAZnVu
Y3Rpb24sICIgICAgICAgIGlmICgke25hbWV9VmFsdWVJdGVyYXRvciA9PSBhcmd1bWVudHNFbmRJ
dGVyYXRvcikgeyIpOwotICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsiKTsKICAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAg
ICAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoXCJFcnJv
cjogQXJndW1lbnQgJyVzJyB3aXRoIHR5cGUgJyVzJyB3YXMgbm90IGZvdW5kLlwiLCBcIiRuYW1l
XCIsIFwiJEpTT05UeXBlXCIpKTsiKTsKICAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAg
ICAgICB9IGVsc2UgeyIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAgICAg
ICBpZiAoISR7bmFtZX1WYWx1ZUl0ZXJhdG9yLT5zZWNvbmQtPmFzJEpTT05UeXBlKCYkbmFtZSkp
IHsiKTsKLSAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICAgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOyIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAg
ICAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoXCJFcnJv
cjogQXJndW1lbnQgJyVzJyBoYXMgd3JvbmcgdHlwZS4gSXQgc2hvdWxkIGJlICclcycuXCIsIFwi
JG5hbWVcIiwgXCIkSlNPTlR5cGVcIikpOyIpOwogICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24s
ICIgICAgICAgICAgICB9Iik7CiAgICAgICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAg
fSIpOwpAQCAtNDE3LDQ4ICs0MTQsNDEgQEAgJG1hcEVudHJpZXMKIAogICAgIFJlZlB0cjxJbnNw
ZWN0b3JWYWx1ZT4gcGFyc2VkTWVzc2FnZSA9IEluc3BlY3RvclZhbHVlOjpwYXJzZUpTT04obWVz
c2FnZSk7CiAgICAgaWYgKCFwYXJzZWRNZXNzYWdlKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwgImRpc3BhdGNoIiwg
IkVycm9yOiBJbnZhbGlkIG1lc3NhZ2UgZm9ybWF0LiBNZXNzYWdlIHNob3VsZCBiZSBpbiBKU09O
IGZvcm1hdC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG1lc3NhZ2VPYmplY3QgPSBwYXJzZWRNZXNzYWdlLT5hc09iamVjdCgpOwogICAg
IGlmICghbWVzc2FnZU9iamVjdCkgewotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAg
ICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsICJkaXNwYXRjaCIsICJFcnJvcjogSW52
YWxpZCBtZXNzYWdlIGZvcm1hdC4gVGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGEgSlNPTmlmaWVkIG9i
amVjdC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIFJlZlB0cjxJbnNwZWN0b3JW
YWx1ZT4gY29tbWFuZFZhbHVlID0gbWVzc2FnZU9iamVjdC0+Z2V0KCJjb21tYW5kIik7CiAgICAg
aWYgKCFjb21tYW5kVmFsdWUpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAg
ICAgIHJlcG9ydFByb3RvY29sRXJyb3IoY2FsbElkLCAiZGlzcGF0Y2giLCAiRXJyb3I6IEludmFs
aWQgbWVzc2FnZSBmb3JtYXQuICdjb21tYW5kJyBwcm9wZXJ0eSB3YXNuJ3QgZm91bmQuIik7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBTdHJpbmcgY29tbWFuZDsKICAgICBpZiAoIWNv
bW1hbmRWYWx1ZS0+YXNTdHJpbmcoJmNvbW1hbmQpKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwgImRpc3BhdGNoIiwg
IkVycm9yOiBJbnZhbGlkIG1lc3NhZ2UgZm9ybWF0LiBUaGUgdHlwZSBvZiAnY29tbWFuZCcgcHJv
cGVydHkgc2hvdWxkIGJlIHN0cmluZy4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAg
IFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gY2FsbElkVmFsdWUgPSBtZXNzYWdlT2JqZWN0LT5nZXQo
InNlcSIpOwogICAgIGlmICghY2FsbElkVmFsdWUpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CiAgICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoY2FsbElkLCBjb21tYW5kLnV0Zjgo
KS5kYXRhKCksICJFcnJvcjogSW52YWxpZCBtZXNzYWdlIGZvcm1hdC4gJ3NlcScgcHJvcGVydHkg
d2FzIG5vdCBmb3VuZCBpbiB0aGUgcmVxdWVzdC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAogICAgIGlmICghY2FsbElkVmFsdWUtPmFzTnVtYmVyKCZjYWxsSWQpKSB7Ci0gICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwg
Y29tbWFuZC51dGY4KCkuZGF0YSgpLCAiRXJyb3I6IEludmFsaWQgbWVzc2FnZSBmb3JtYXQuIHRo
ZSB0eXBlIG9mICdzZXEnIHByb3BlcnR5IHNob3VsZCBiZSBudW1iZXIuIik7CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAKICAgICBIYXNoTWFwPFN0cmluZywgQ2FsbEhhbmRsZXI+OjppdGVyYXRv
ciBpdCA9IGRpc3BhdGNoTWFwLmZpbmQoY29tbWFuZCk7CiAgICAgaWYgKGl0ID09IGRpc3BhdGNo
TWFwLmVuZCgpKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgICAgICByZXBv
cnRQcm90b2NvbEVycm9yKGNhbGxJZCwgImRpc3BhdGNoIiwgU3RyaW5nOjpmb3JtYXQoIkVycm9y
OiBJbnZhbGlkIGNvbW1hbmQgd2FzIHJlY2VpdmVkLiAnJXMnIHdhc24ndCBmb3VuZC4iLCBjb21t
YW5kLnV0ZjgoKS5kYXRhKCkpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUzMywxNCAr
NTIzLDI1IEBAIFdlYkluc3BlY3Rvci5JbnNwZWN0b3JCYWNrZW5kU3R1Yi5wcm90b3R5cGUgPSB7
CiAgICAgICAgIHZhciByZXF1ZXN0ID0gSlNPTi5wYXJzZShhcmdzLnNoaWZ0KCkpOwogCiAgICAg
ICAgIGZvciAodmFyIGtleSBpbiByZXF1ZXN0LmFyZ3VtZW50cykgeworICAgICAgICAgICAgaWYg
KGFyZ3MubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUHJv
dG9jb2wgRXJyb3I6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgJ0luc3BlY3RvckJh
Y2tlbmQuJXMnIGNhbGwuIEl0IHNob3VsZCBoYXZlIHRoZSBuZXh0IGFyZ3VtZW50cyAnJXMnLiIs
IHJlcXVlc3QuY29tbWFuZCwgSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5hcmd1bWVudHMpKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB2YXIgdmFs
dWUgPSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSByZXF1
ZXN0LmFyZ3VtZW50c1trZXldKQotICAgICAgICAgICAgICAgIHRocm93KCJJbnZhbGlkIHR5cGUg
b2YgcHJvcGVydHkgIiArIGtleSArICIuIEl0IHNob3VsZCBiZSAnIiArIHJlcXVlc3QuYXJndW1l
bnRzW2tleV0gKyAiJyBidXQgaXQgaXMgJyIgKyB0eXBlb2YgdmFsdWUgKyAiJy4iICk7CisgICAg
ICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSByZXF1ZXN0LmFyZ3VtZW50c1trZXldKSB7Cisg
ICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUHJvdG9jb2wgRXJyb3I6IEludmFsaWQgdHlw
ZSBvZiBhcmd1bWVudCAnJXMnIGZvciAnSW5zcGVjdG9yQmFja2VuZC4lcycgY2FsbC4gSXQgc2hv
dWxkIGJlICclcycgYnV0IGl0IGlzICclcycuIiwga2V5LCByZXF1ZXN0LmNvbW1hbmQsIHJlcXVl
c3QuYXJndW1lbnRzW2tleV0sIHR5cGVvZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcXVlc3QuYXJndW1lbnRzW2tleV0gPSB2
YWx1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBl
b2YgYXJnc1swXSA9PT0gImZ1bmN0aW9uIikKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAx
KSB7CisgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICJmdW5jdGlvbiIpIHsKKyAg
ICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJQcm90b2NvbCBFcnJvcjogT3B0aW9uYWwgY2Fs
bGJhY2sgYXJndW1lbnQgZm9yICdJbnNwZWN0b3JCYWNrZW5kLiVzJyBjYWxsIHNob3VsZCBiZSBh
IGZ1bmN0aW9uIGJ1dCBpdHMgdHlwZSBpcyAnJXMnLiIsIHJlcXVlc3QuY29tbWFuZCwgdHlwZW9m
KGFyZ3NbMF0pKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAg
ICAgICAgICByZXF1ZXN0LnNlcSA9IFdlYkluc3BlY3Rvci5DYWxsYmFjay53cmFwKGFyZ3NbMF0p
OworICAgICAgICB9CiAKICAgICAgICAgdmFyIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShyZXF1
ZXN0KTsKICAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNlbmRNZXNzYWdlVG9CYWNrZW5k
KG1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3Bl
Y3Rvci5qcyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMKaW5kZXgg
YzhmNTNkNy4uMGJmZjMzNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5k
L2luc3BlY3Rvci5qcworKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9y
LmpzCkBAIC02NTEsOCArNjUxLDggQEAgV2ViSW5zcGVjdG9yX3N5bmNEaXNwYXRjaCA9IGZ1bmN0
aW9uKG1lc3NhZ2UpCiAgICAgfQogCiAgICAgaWYgKG1lc3NhZ2VPYmplY3QudHlwZSA9PT0gImV2
ZW50IikgewotICAgICAgICBpZiAoIW1lc3NhZ2VPYmplY3QuZXZlbnQgaW4gV2ViSW5zcGVjdG9y
KSB7Ci0gICAgICAgICAgICBjb25zb2xlLmVycm9yKCJBdHRlbXB0ZWQgdG8gZGlzcGF0Y2ggdW5p
bXBsZW1lbnRlZCBXZWJJbnNwZWN0b3IgbWV0aG9kOiAlcyIsIG1lc3NhZ2VPYmplY3QuZXZlbnQp
OworICAgICAgICBpZiAoIShtZXNzYWdlT2JqZWN0LmV2ZW50IGluIFdlYkluc3BlY3RvcikpIHsK
KyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlByb3RvY29sIEVycm9yOiBBdHRlbXB0ZWQgdG8g
ZGlzcGF0Y2ggYW4gdW5pbXBsZW1lbnRlZCBXZWJJbnNwZWN0b3IgbWV0aG9kICclcyciLCBtZXNz
YWdlT2JqZWN0LmV2ZW50KTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAg
ICBXZWJJbnNwZWN0b3JbbWVzc2FnZU9iamVjdC5ldmVudF0uYXBwbHkoV2ViSW5zcGVjdG9yLCBh
cmd1bWVudHMpOwpAQCAtNjY2LDcgKzY2Niw3IEBAIFdlYkluc3BlY3Rvci5kaXNwYXRjaE1lc3Nh
Z2VGcm9tQmFja2VuZCA9IGZ1bmN0aW9uKG1lc3NhZ2VPYmplY3QpCiAKIFdlYkluc3BlY3Rvci5y
ZXBvcnRQcm90b2NvbEVycm9yID0gZnVuY3Rpb24obWVzc2FnZU9iamVjdCkKIHsKLSAgICBjb25z
b2xlLmVycm9yKCJFcnJvcjogSW5zcGVjdG9yQmFja2VuZCByZXF1ZXN0IHdpdGggc2VxID0gIiAr
IG1lc3NhZ2VPYmplY3Quc2VxICsgIiBmYWlsZWQuIik7CisgICAgY29uc29sZS5lcnJvcigiUHJv
dG9jb2wgRXJyb3I6IEluc3BlY3RvckJhY2tlbmQgcmVxdWVzdCB3aXRoIHNlcSA9ICVkIGZhaWxl
ZC4iLCBtZXNzYWdlT2JqZWN0LnNlcSk7CiAgICAgZm9yICh2YXIgZXJyb3IgaW4gbWVzc2FnZU9i
amVjdC5lcnJvcnMpCiAgICAgICAgIGNvbnNvbGUuZXJyb3IoIiAgICAiICsgZXJyb3IpOwogICAg
IFdlYkluc3BlY3Rvci5yZW1vdmVSZXNwb25zZUNhbGxiYWNrRW50cnkobWVzc2FnZU9iamVjdC5z
ZXEpOwo=
</data>
<flag name="review"
          id="54827"
          type_id="1"
          status="+"
          setter="joepeck"
    />
    <flag name="commit-queue"
          id="54828"
          type_id="3"
          status="-"
          setter="joepeck"
    />
          </attachment>
      

    </bug>

</bugzilla>