<?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>71625</bug_id>
          
          <creation_ts>2011-11-06 04:09:05 -0800</creation_ts>
          <short_desc>Web Inspector: Preserve an indentation level when inserting a new line</short_desc>
          <delta_ts>2011-11-30 07:18:58 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikita Vasilyev">me</reporter>
          <assigned_to name="Nikita Vasilyev">me</assigned_to>
          <cc>aandrey</cc>
    
    <cc>aandrey</cc>
    
    <cc>apavlov</cc>
    
    <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>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>496799</commentid>
    <comment_count>0</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-06 04:09:05 -0800</bug_when>
    <thetext>http://www.screenr.com/PZZs

Next logical step would be inserting close bracket when the open one is typed. I.e.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>496800</commentid>
    <comment_count>1</comment_count>
      <attachid>113782</attachid>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-06 04:32:25 -0800</bug_when>
    <thetext>Created attachment 113782
First try

Discussion has been started in https://bugs.webkit.org/show_bug.cgi?id=69986#c6

As you can see on 50th second of http://www.screenr.com/PZZs it doesn&apos;t yet work for:

if (obj.y)
    return 42

I think it requires some static analyses that could be done some day.


Source/WebCore/inspector/front-end/TextViewer.js:
-        if (handler &amp;&amp; handler.call(this)) {
+        if (handler &amp;&amp; handler()) {

All handlers are bound, no need for &quot;call&quot; here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>496824</commentid>
    <comment_count>2</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2011-11-06 10:55:59 -0800</bug_when>
    <thetext>I have no problems with the code, except for it introduces complexity. Adding Andrey who has been hacking the editing code, maybe he suggests something simpler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>496847</commentid>
    <comment_count>3</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-06 12:39:41 -0800</bug_when>
    <thetext>There is some copy/paste between handleTabKeyPress and _insertNewLine:

        if (this._readOnly || this._dirtyLines)
            return false;

        var selection = this._getSelection();
        if (!selection)
            return false;

        this.beginUpdates();
        this._enterTextChangeMode();

        var range = selection;
        if (range.startLine &gt; range.endLine || (range.startLine === range.endLine &amp;&amp; range.startColumn &gt; range.endColumn))
            range = new WebInspector.TextRange(range.endLine, range.endColumn, range.startLine, range.startColumn);

        ...

        this._exitTextChangeMode(range, newRange);
        this.endUpdates();
        this._restoreSelection(newRange, true);

We might want to refactor it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>497010</commentid>
    <comment_count>4</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2011-11-07 00:39:23 -0800</bug_when>
    <thetext>&gt; We might want to refactor it.

Would you suggest a patch doing that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>497608</commentid>
    <comment_count>5</comment_count>
      <attachid>113961</attachid>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-07 17:03:21 -0800</bug_when>
    <thetext>Created attachment 113961
Refactoring

We used to revert selection range twice. From now on a selection start point is always ≤ the end point:

handleTabKeyPress:
-        if (range.startLine &gt; range.endLine || (range.startLine === range.endLine &amp;&amp; range.startColumn &gt; range.endColumn))
-            range = new WebInspector.TextRange(range.endLine, range.endColumn, range.startLine, range.startColumn);

_getSelection:
-        if (selection.anchorNode === selectionRange.startContainer &amp;&amp; selection.anchorOffset === selectionRange.startOffset)
-            return new WebInspector.TextRange(start.line, start.column, end.line, end.column);
-        else
-            return new WebInspector.TextRange(end.line, end.column, start.line, start.column);
+        return new WebInspector.TextRange(start.line, start.column, end.line, end.column);

None of the shortcuts work in readOnly mode, so I&apos;ve moved readOnly check into _handleKeyDown.

I haven&apos;t simplified the rest. I don&apos;t think I can.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>498751</commentid>
    <comment_count>6</comment_count>
      <attachid>113961</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2011-11-09 02:35:04 -0800</bug_when>
    <thetext>Comment on attachment 113961
Refactoring

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

&gt; Source/WebCore/inspector/front-end/TextViewer.js:278
&gt; +        this._enterTextChangeMode();

this is a method of the TextEditorMainPanel class. did you mean to put the _insertNewLine() in that class instead of TextViewer? And IMO, it should be, nearby with the handleTab, handleUndo, and etc.

&gt; Source/WebCore/inspector/front-end/TextViewer.js:280
&gt; +        var lineBreak = this._textModel._lineBreak;

accessing a private property &quot;_lineBreak&quot; of an object. introduce a getter for this?

&gt; Source/WebCore/inspector/front-end/TextViewer.js:311
&gt; +        var insertNewLine = this._insertNewLine.bind(this._mainPanel);

ditto. move the new method to this._mainPanel, to be consistent with the code around?

&gt; Source/WebCore/inspector/front-end/TextViewer.js:327
&gt; +        if (this._mainPanel._readOnly)

if (this.readOnly)

&gt; Source/WebCore/inspector/front-end/TextViewer.js:-1057
&gt; -        var range = selection;

plz revert, see below

&gt; Source/WebCore/inspector/front-end/TextViewer.js:-1422
&gt; -        if (selection.anchorNode === selectionRange.startContainer &amp;&amp; selection.anchorOffset === selectionRange.startOffset)

plz revert. we have to handle the selection&apos;s anchorNode being after the selection&apos;s focusNode (i.e. when scrolling from bottom to top). This change will break the text selection by scrolling from bottom to top - I don&apos;t think we have a test for that :(

repro steps:
- select a long enough script, so that vertical scroll bar appears (or decrease the height of DevTools window)
- go to the bottom of the document
- left mouse click on any place at the bottom and start scrolling the document to the top (and selecting the text) by moving the mouse up
- observe the text selection&apos;s end line&amp;column changes while scrolling to the top

would you mind putting a brief comment about this here? just to prevent folks from doing the same thing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>498786</commentid>
    <comment_count>7</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-09 03:46:48 -0800</bug_when>
    <thetext>Thanks for the review!

(In reply to comment #6)
&gt; plz revert. we have to handle the selection&apos;s anchorNode being after the selection&apos;s focusNode (i.e. when scrolling from bottom to top).

I see it&apos;s broken, but I don&apos;t understand why. Would you mind pointing me to the code that changes selection on scrolling?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>498816</commentid>
    <comment_count>8</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2011-11-09 04:24:09 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Thanks for the review!
&gt; 
&gt; (In reply to comment #6)
&gt; &gt; plz revert. we have to handle the selection&apos;s anchorNode being after the selection&apos;s focusNode (i.e. when scrolling from bottom to top).
&gt; 
&gt; I see it&apos;s broken, but I don&apos;t understand why. Would you mind pointing me to the code that changes selection on scrolling?

Yeah, the this._restoreSelection() gets broken. Namely, the method window.getSelection().setBaseAndExtent() - it accepts an anchor node as a first argument, and a focus node as a second. In the test case I mentioned, we would call it with the anchor and focus nodes swapped, thus the restored selection would start from the topmost node instead of the one at the bottom that we started from.

We can introduce a new class WebInspector.TextSelection and provide getters for anchorLine and focusLine along with startLine, endLine and etc. and force start &lt;= end. This will remove the code duplication you were trying to deal with.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>498908</commentid>
    <comment_count>9</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-09 06:53:06 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; We can introduce a new class WebInspector.TextSelection and provide getters for anchorLine and focusLine along with startLine, endLine and etc. and force start &lt;= end. This will remove the code duplication you were trying to deal with.

Looks like it could replace WebInspector.TextRange entirely, isn&apos;t it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>498922</commentid>
    <comment_count>10</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2011-11-09 07:09:05 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #8)
&gt; &gt; We can introduce a new class WebInspector.TextSelection and provide getters for anchorLine and focusLine along with startLine, endLine and etc. and force start &lt;= end. This will remove the code duplication you were trying to deal with.
&gt; 
&gt; Looks like it could replace WebInspector.TextRange entirely, isn&apos;t it?

We also had this idea before, but it was dropped due to the fact that TextRange is not a selection, and it does not have to know about &quot;focus&quot; and &quot;anchor&quot; terms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499193</commentid>
    <comment_count>11</comment_count>
      <attachid>114328</attachid>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-09 11:33:56 -0800</bug_when>
    <thetext>Created attachment 114328
Trying out WebInspector.TextSelection. Work in progress!

I&apos;ve created WebInspector.TextSelection. It allows us to save selection anchor/focus when editing (e.g., indenting http://www.screenr.com/Rcks). Unfortunately, it adds even more complexity. I&apos;m not sure I&apos;m on a right track.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499198</commentid>
    <comment_count>12</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-09 11:35:53 -0800</bug_when>
    <thetext>(In reply to comment #6)

&gt; plz revert. we have to handle the selection&apos;s anchorNode being after the selection&apos;s focusNode (i.e. when scrolling from bottom to top). This change will break the text selection by scrolling from bottom to top - I don&apos;t think we have a test for that :(
&gt; 
&gt; repro steps:
&gt; - select a long enough script, so that vertical scroll bar appears (or decrease the height of DevTools window)
&gt; - go to the bottom of the document
&gt; - left mouse click on any place at the bottom and start scrolling the document to the top (and selecting the text) by moving the mouse up
&gt; - observe the text selection&apos;s end line&amp;column changes while scrolling to the top

Fixed in the last patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499716</commentid>
    <comment_count>13</comment_count>
      <attachid>114328</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2011-11-10 00:59:31 -0800</bug_when>
    <thetext>Comment on attachment 114328
Trying out WebInspector.TextSelection. Work in progress!

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

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:82
&gt; +        return this.anchorLine &lt; this.focusLine ? this.anchorLine : this.focusLine;

return Math.min(this.anchorLine, this.focusLine);

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:85
&gt; +    set startLine(lineNumber)

Can you get rid of these setters? It is quite confusing having them. For example, if you call this setter, the subsequent call to the getter may not return the same value.

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:92
&gt; +        return this.anchorLine &gt; this.focusLine ? this.anchorLine : this.focusLine;

return Math.max(this.anchorLine, this.focusLine);

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:95
&gt; +    set endLine(lineNumber)

ditto (remove?)

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:106
&gt; +    set startColumn(lineNumber)

ditto (remove?)

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:119
&gt; +    set endColumn(lineNumber)

ditto (remove?)

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:126
&gt; +    get linesCount()

seems like a dead code. if so, plz remove

&gt; Source/WebCore/inspector/front-end/TextViewer.js:285
&gt; +        if (this._mainPanel._readOnly)

this.readOnly

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1123
&gt; +            if (lineNumber === selection.startLine)

to get rid of the setters (see above):

if (lineNumber === selection.anchorLine)
    newSelection.anchorColumn = Math.max(0, newSelection.anchorColumn - lineIndentLength);
if (lineNumber === selection.focusLine)
    newSelection.focusColumn = Math.max(0, newSelection.focusColumn - lineIndentLength);

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1128
&gt; +            newSelection.endColumn = Math.max(0, newSelection.endColumn - lineIndentLength);

remove this, if you apply my comment above

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1130
&gt; +        this._lastEditedRange = newSelection;

_lastEditedRange -&gt; _lastEditedSelection

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1154
&gt; +

should we also add:
  if (this._lastEditedRange)
        this._textModel.markUndoableState();
and update the lastEditedRange at the end of this method?

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1162
&gt; +            newSelection.anchorLine = --newSelection.focusLine;

plz do one operation per one line:

--newSelection.focusLine;
newSelection.focusColumn += textEditorIndent.length;
newSelection.anchorLine = newSelection.focusLine;
newSelection.anchorColumn = newSelection.focusColumn;

this is easier to understand

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1475
&gt; +        var start = this._positionToSelection(range.anchorLine, range.anchorColumn);

range -&gt; selection</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500424</commentid>
    <comment_count>14</comment_count>
      <attachid>114606</attachid>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-10 17:06:38 -0800</bug_when>
    <thetext>Created attachment 114606
Remove TextSelection, add methods to TextRange.

I don&apos;t like the previous patch. Setters were ugly. _lastEditedRange could be either TextSelection and TextRange.

I do like the new one! I&apos;ve got rid of TextSelection. Two times less classes, two times less complexity :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500426</commentid>
    <comment_count>15</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-10 17:09:24 -0800</bug_when>
    <thetext>By the way, should I use JSDoc comments? Most of the methods don&apos;t have them, but some do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500573</commentid>
    <comment_count>16</comment_count>
      <attachid>114606</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2011-11-11 00:50:46 -0800</bug_when>
    <thetext>Comment on attachment 114606
Remove TextSelection, add methods to TextRange.

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

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:39
&gt; +WebInspector.TextRange = function(startLine, startColumn, endLine, endColumn, reversed)

I had implemented this in the same way long ago. The (design) problem is that TextRange should not know about &quot;anchor&quot; and &quot;focus&quot; terms, because those are the terms of a selection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500603</commentid>
    <comment_count>17</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-11 02:14:20 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 114606 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=114606&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/inspector/front-end/TextEditorModel.js:39
&gt; &gt; +WebInspector.TextRange = function(startLine, startColumn, endLine, endColumn, reversed)
&gt; 
&gt; I had implemented this in the same way long ago. The (design) problem is that TextRange should not know about &quot;anchor&quot; and &quot;focus&quot; terms, because those are the terms of a selection.

Let&apos;s call it TextSelection then?

I see the following problems with having both TextSelection and TextRange:

1. Convert a selection to a range before every _setText call.

2. WebInspector.TextEditorMainPanel._restoreSelection has to use &quot;anchor&quot; and &quot;focus&quot;. I don&apos;t want to do something like:

if (range instanceof WebInspector.TextSelection)
    var selection = range;
else
    selection = range.toTextSelection();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>500609</commentid>
    <comment_count>18</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2011-11-11 02:36:04 -0800</bug_when>
    <thetext>AFAIU, TextRange has nothing to do neither with text selection nor with text selection range (i.e. window.getSelection() and window.getSelection().getRangeAt()). It just stands for a range of a text in the text model. Thus I suggest that we should not make it aware of anything related to the text selection. In other words, IMO this CL should not affect TextEditorModel.js at all.

Maybe it could be done simply by introducing a static method like &quot;normalizeTextRange&quot; to ensure start &lt;= end for a range?

Maybe Pavel will chime in?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502955</commentid>
    <comment_count>19</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-15 09:12:34 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; AFAIU, TextRange has nothing to do neither with text selection nor with text selection range (i.e. window.getSelection() and window.getSelection().getRangeAt()). It just stands for a range of a text in the text model. Thus I suggest that we should not make it aware of anything related to the text selection. In other words, IMO this CL should not affect TextEditorModel.js at all.
&gt; 
&gt; Maybe it could be done simply by introducing a static method like &quot;normalizeTextRange&quot; to ensure start &lt;= end for a range?

It would make http://www.screenr.com/Rcks impossible. Even though it&apos;s a minor issue, I would rather keep it working.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>505704</commentid>
    <comment_count>20</comment_count>
      <attachid>115789</attachid>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-18 05:36:54 -0800</bug_when>
    <thetext>Created attachment 115789
Add normalize method

Andrey, I did as you said, except:

&gt; Maybe it could be done simply by introducing a static method like &quot;normalizeTextRange&quot; to ensure start &lt;= end for a range?

Why static? I&apos;ve made it instance method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507657</commentid>
    <comment_count>21</comment_count>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-22 09:57:16 -0800</bug_when>
    <thetext>Can I have a review, please? It is unpleasant to edit JS without this feature.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510955</commentid>
    <comment_count>22</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2011-11-29 11:38:51 -0800</bug_when>
    <thetext>Andrey is on vacations, I&apos;ll pick it up. Did you fix everything he mentioned?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510969</commentid>
    <comment_count>23</comment_count>
      <attachid>115789</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2011-11-29 11:56:00 -0800</bug_when>
    <thetext>Comment on attachment 115789
Add normalize method

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

Looks good with a request for clarification on {} and a nit. Also, it would be nice to unindent upon closing bracket in case we produced the auto-indent (could be done in a separate change).

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:53
&gt; +    collapseToEnd: function()

I would keep the text range immutable and return the new object from these methods.

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:116
&gt; +    get lineBreak() {

{ should be on the next line.

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1060
&gt; +        range.normalize();

I.e. that would be var range = selection.normalize(); here.

&gt; Source/WebCore/inspector/front-end/TextViewer.js:-1059
&gt; -            range = new WebInspector.TextRange(range.endLine, range.endColumn, range.startLine, range.startColumn);

As it actually was.

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1168
&gt; +            newRange = this._setText(range, lineBreak + indent + lineBreak + currentIndent);

What&apos;s happening here? Could you comment on this case?

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1471
&gt; +        return new WebInspector.TextRange(start.line, start.column, end.line, end.column);

So the selection is no longer normalized. It seems like restoreSelection still handles it ok.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511039</commentid>
    <comment_count>24</comment_count>
      <attachid>117028</attachid>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-29 13:09:56 -0800</bug_when>
    <thetext>Created attachment 117028
Immutable TextRange

(In reply to comment #23)
&gt; &gt; Source/WebCore/inspector/front-end/TextViewer.js:1168
&gt; &gt; +            newRange = this._setText(range, lineBreak + indent + lineBreak + currentIndent);
&gt; 
&gt; What&apos;s happening here? Could you comment on this case?

I&apos;ve added a comment. Also, see http://www.screenr.com/PZZs at 0:04</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511481</commentid>
    <comment_count>25</comment_count>
      <attachid>117028</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2011-11-30 00:57:22 -0800</bug_when>
    <thetext>Comment on attachment 117028
Immutable TextRange

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

&gt; Source/WebCore/inspector/front-end/TextEditorModel.js:63
&gt; +            return new WebInspector.TextRange(this.startLine, this.startColumn, this.endLine, this.endColumn);

&quot;return this;&quot; would work given that we consider range immutable.

&gt; Source/WebCore/inspector/front-end/TextViewer.js:1168
&gt; +            // {|}

I would expect
function foo() {|}

to become

function foo() {
    |
}

will it work?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511551</commentid>
    <comment_count>26</comment_count>
      <attachid>117149</attachid>
    <who name="Nikita Vasilyev">me</who>
    <bug_when>2011-11-30 02:19:42 -0800</bug_when>
    <thetext>Created attachment 117149
Simplify normalize

(In reply to comment #25)
&gt; (From update of attachment 117028 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=117028&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/inspector/front-end/TextEditorModel.js:63
&gt; &gt; +            return new WebInspector.TextRange(this.startLine, this.startColumn, this.endLine, this.endColumn);
&gt; 
&gt; &quot;return this;&quot; would work given that we consider range immutable.

Done.

&gt; &gt; Source/WebCore/inspector/front-end/TextViewer.js:1168
&gt; &gt; +            // {|}
&gt; 
&gt; I would expect
&gt; function foo() {|}
&gt; 
&gt; to become
&gt; 
&gt; function foo() {
&gt;     |
&gt; }
&gt; 
&gt; will it work?

Sure it will.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511552</commentid>
    <comment_count>27</comment_count>
      <attachid>117149</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2011-11-30 02:21:55 -0800</bug_when>
    <thetext>Comment on attachment 117149
Simplify normalize

Thanks for doing this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511728</commentid>
    <comment_count>28</comment_count>
      <attachid>117149</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-30 07:18:53 -0800</bug_when>
    <thetext>Comment on attachment 117149
Simplify normalize

Clearing flags on attachment: 117149

Committed r101511: &lt;http://trac.webkit.org/changeset/101511&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511729</commentid>
    <comment_count>29</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-30 07:18:58 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>113782</attachid>
            <date>2011-11-06 04:32:25 -0800</date>
            <delta_ts>2011-11-07 17:03:21 -0800</delta_ts>
            <desc>First try</desc>
            <filename>preserve_indent.patch</filename>
            <type>text/plain</type>
            <size>4975</size>
            <attacher name="Nikita Vasilyev">me</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxNzMzYzY1Li41NzIxNTc4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTgg
QEAKKzIwMTEtMTEtMDYgIE5pa2l0YSBWYXNpbHlldiAgPG1lQGVsdjFzLnJ1PgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IFByZXNlcnZlIGFuIGluZGVudGF0aW9uIGxldmVsIHdoZW4gaW5zZXJ0
aW5nIGEgbmV3IGxpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNjI1CisKKyAgICAgICAgSW5kZW50IG9uZSBsZXZlbCBtb3JlIHdoZW4gbGluZSBl
bmRzIHdpdGggZWl0aGVyICJ7IiwgIlsiIG9yICIoIi4KKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRv
ck1vZGVsLmpzOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qczoK
KyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZS5faW5zZXJ0TmV3TGlu
ZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFZpZXdlci5wcm90b3R5cGUuX3JlZ2lzdGVy
U2hvcnRjdXRzKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZS5f
aGFuZGxlS2V5RG93bik6CisKIDIwMTEtMTEtMDMgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxl
LmNvbT4KIAogICAgICAgICBKU0Mgc2hvdWxkIGJlIGFibGUgdG8gc2FtcGxlIGl0c2VsZiBpbiBh
IG1vcmUgZmxleGlibGUgd2F5IHRoYW4ganVzdCBzYW1wbGluZyBmbGFncwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9yTW9kZWwuanMgYi9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcwppbmRl
eCBiOTgwYmRiLi4wNGMwZmQzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcworKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcwpAQCAtNzUsNiArNzUsOCBAQCBXZWJJbnNw
ZWN0b3IuVGV4dEVkaXRvck1vZGVsLkluZGVudCA9IHsKICAgICBUYWJDaGFyYWN0ZXI6ICJcdCIK
IH0KIAorV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5lbmRzV2l0aEJyYWNrZXRSZWdleCA9
IC9beyhcW11ccyokLzsKKwogV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5wcm90b3R5cGUg
PSB7CiAgICAgc2V0IGNoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKQogICAgIHsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qcyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qcwppbmRleCAw
Mzk4ZmVmLi40NGRkYTRhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJv
bnQtZW5kL1RleHRWaWV3ZXIuanMKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250
LWVuZC9UZXh0Vmlld2VyLmpzCkBAIC0yNTQsNiArMjU0LDU1IEBAIFdlYkluc3BlY3Rvci5UZXh0
Vmlld2VyLnByb3RvdHlwZSA9IHsKICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLmNvbGxh
cHNlVG9TdGFydCgpOwogICAgIH0sCiAKKyAgICBfaW5zZXJ0TmV3TGluZTogZnVuY3Rpb24oKQor
ICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3JlYWRPbmx5IHx8IHRoaXMuX2RpcnR5TGluZXMpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMu
X2dldFNlbGVjdGlvbigpOworICAgICAgICBpZiAoIXNlbGVjdGlvbikKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb247CisgICAgICAgIGlm
IChyYW5nZS5zdGFydExpbmUgPiByYW5nZS5lbmRMaW5lIHx8IChyYW5nZS5zdGFydExpbmUgPT09
IHJhbmdlLmVuZExpbmUgJiYgcmFuZ2Uuc3RhcnRDb2x1bW4gPiByYW5nZS5lbmRDb2x1bW4pKQor
ICAgICAgICAgICAgcmFuZ2UgPSBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShyYW5nZS5lbmRM
aW5lLCByYW5nZS5lbmRDb2x1bW4sIHJhbmdlLnN0YXJ0TGluZSwgcmFuZ2Uuc3RhcnRDb2x1bW4p
OworCisgICAgICAgIGlmIChyYW5nZS5lbmRDb2x1bW4gPT09IDApCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgdmFyIGxpbmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZShyYW5n
ZS5zdGFydExpbmUpOworICAgICAgICB2YXIgbGluZVByZWZpeCA9IGxpbmUuc3Vic3RyaW5nKDAs
IHJhbmdlLnN0YXJ0Q29sdW1uKTsKKyAgICAgICAgdmFyIGluZGVudE1hdGNoID0gbGluZVByZWZp
eC5tYXRjaCgvXlxzKy8pOworICAgICAgICB2YXIgY3VycmVudEluZGVudCA9IGluZGVudE1hdGNo
ID8gaW5kZW50TWF0Y2hbMF0gOiAiIjsKKworICAgICAgICB2YXIgdGV4dEVkaXRvckluZGVudCA9
IFdlYkluc3BlY3Rvci5zZXR0aW5ncy50ZXh0RWRpdG9ySW5kZW50LmdldCgpOworICAgICAgICB2
YXIgaW5kZW50ID0gV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5lbmRzV2l0aEJyYWNrZXRS
ZWdleC50ZXN0KGxpbmVQcmVmaXgpID8gY3VycmVudEluZGVudCArIHRleHRFZGl0b3JJbmRlbnQg
OiBjdXJyZW50SW5kZW50OworCisgICAgICAgIGlmICghaW5kZW50KQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIHRoaXMuYmVnaW5VcGRhdGVzKCk7CisgICAgICAgIHRoaXMu
X2VudGVyVGV4dENoYW5nZU1vZGUoKTsKKworICAgICAgICB2YXIgbGluZUJyZWFrID0gdGhpcy5f
dGV4dE1vZGVsLl9saW5lQnJlYWs7CisgICAgICAgIHZhciBuZXdSYW5nZTsKKyAgICAgICAgaWYg
KHJhbmdlLnN0YXJ0TGluZSA9PT0gcmFuZ2UuZW5kTGluZSAmJiByYW5nZS5zdGFydENvbHVtbiA9
PT0gcmFuZ2UuZW5kQ29sdW1uICYmIGxpbmUuc3Vic3RyKHJhbmdlLmVuZENvbHVtbiAtIDEsIDIp
ID09PSAne30nKSB7CisgICAgICAgICAgICBuZXdSYW5nZSA9IHRoaXMuX3NldFRleHQocmFuZ2Us
IGxpbmVCcmVhayArIGluZGVudCArIGxpbmVCcmVhayArIGN1cnJlbnRJbmRlbnQpOworICAgICAg
ICAgICAgbmV3UmFuZ2Uuc3RhcnRMaW5lID0gLS1uZXdSYW5nZS5lbmRMaW5lOworICAgICAgICAg
ICAgbmV3UmFuZ2Uuc3RhcnRDb2x1bW4gPSBuZXdSYW5nZS5lbmRDb2x1bW4gKz0gdGV4dEVkaXRv
ckluZGVudC5sZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdSYW5nZSA9
IHRoaXMuX3NldFRleHQocmFuZ2UsIGxpbmVCcmVhayArIGluZGVudCk7CisgICAgICAgICAgICBu
ZXdSYW5nZS5zdGFydENvbHVtbiA9IG5ld1JhbmdlLmVuZENvbHVtbjsKKyAgICAgICAgICAgIG5l
d1JhbmdlLnN0YXJ0TGluZSA9IG5ld1JhbmdlLmVuZExpbmU7CisgICAgICAgIH0KKworICAgICAg
ICB0aGlzLl9leGl0VGV4dENoYW5nZU1vZGUocmFuZ2UsIG5ld1JhbmdlKTsKKyAgICAgICAgdGhp
cy5lbmRVcGRhdGVzKCk7CisgICAgICAgIHRoaXMuX3Jlc3RvcmVTZWxlY3Rpb24obmV3UmFuZ2Us
IHRydWUpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0sCisKICAgICBfcmVnaXN0ZXJT
aG9ydGN1dHM6IGZ1bmN0aW9uKCkKICAgICB7CiAgICAgICAgIHZhciBrZXlzID0gV2ViSW5zcGVj
dG9yLktleWJvYXJkU2hvcnRjdXQuS2V5czsKQEAgLTI2Niw2ICszMTUsOSBAQCBXZWJJbnNwZWN0
b3IuVGV4dFZpZXdlci5wcm90b3R5cGUgPSB7CiAgICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJ
bnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KGtleXMuRW50ZXIuY29kZSwgbW9kaWZp
ZXJzLkN0cmxPck1ldGEpXSA9IGNvbW1pdEVkaXRpbmc7CiAgICAgICAgIHRoaXMuX3Nob3J0Y3V0
c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KGtleXMuRXNjLmNvZGUpXSA9
IGNhbmNlbEVkaXRpbmc7CiAKKyAgICAgICAgdmFyIGluc2VydE5ld0xpbmUgPSB0aGlzLl9pbnNl
cnROZXdMaW5lLmJpbmQodGhpcy5fbWFpblBhbmVsKTsKKyAgICAgICAgdGhpcy5fc2hvcnRjdXRz
W1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoa2V5cy5FbnRlci5jb2RlLCBX
ZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuTm9uZSldID0gaW5zZXJ0TmV3
TGluZTsKKwogICAgICAgICB2YXIgaGFuZGxlVW5kbyA9IHRoaXMuX21haW5QYW5lbC5oYW5kbGVV
bmRvUmVkby5iaW5kKHRoaXMuX21haW5QYW5lbCwgZmFsc2UpOwogICAgICAgICB2YXIgaGFuZGxl
UmVkbyA9IHRoaXMuX21haW5QYW5lbC5oYW5kbGVVbmRvUmVkby5iaW5kKHRoaXMuX21haW5QYW5l
bCwgdHJ1ZSk7CiAgICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRT
aG9ydGN1dC5tYWtlS2V5KCJ6IiwgbW9kaWZpZXJzLkN0cmxPck1ldGEpXSA9IGhhbmRsZVVuZG87
CkBAIC0yODEsNyArMzMzLDcgQEAgV2ViSW5zcGVjdG9yLlRleHRWaWV3ZXIucHJvdG90eXBlID0g
ewogICAgIHsKICAgICAgICAgdmFyIHNob3J0Y3V0S2V5ID0gV2ViSW5zcGVjdG9yLktleWJvYXJk
U2hvcnRjdXQubWFrZUtleUZyb21FdmVudChlKTsKICAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlz
Ll9zaG9ydGN1dHNbc2hvcnRjdXRLZXldOwotICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVy
LmNhbGwodGhpcykpIHsKKyAgICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlcigpKSB7CiAgICAg
ICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlv
bigpOwogICAgICAgICB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>113961</attachid>
            <date>2011-11-07 17:03:21 -0800</date>
            <delta_ts>2011-11-09 11:33:56 -0800</delta_ts>
            <desc>Refactoring</desc>
            <filename>preserve_indent.patch</filename>
            <type>text/plain</type>
            <size>6677</size>
            <attacher name="Nikita Vasilyev">me</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxNzMzYzY1Li41ODhmMTNjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkg
QEAKKzIwMTEtMTEtMDcgIE5pa2l0YSBWYXNpbHlldiAgPG1lQGVsdjFzLnJ1PgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IFByZXNlcnZlIGFuIGluZGVudGF0aW9uIGxldmVsIHdoZW4gaW5zZXJ0
aW5nIGEgbmV3IGxpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNjI1CisKKyAgICAgICAgSW5kZW50IG9uZSBsZXZlbCBtb3JlIHdoZW4gbGluZSBl
bmRzIHdpdGggZWl0aGVyICJ7IiwgIlsiIG9yICIoIi4KKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRv
ck1vZGVsLmpzOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qczoK
KyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZS5faW5zZXJ0TmV3TGlu
ZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFZpZXdlci5wcm90b3R5cGUuX3JlZ2lzdGVy
U2hvcnRjdXRzKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZS5f
aGFuZGxlS2V5RG93bik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5l
bC5wcm90b3R5cGUuX2dldFNlbGVjdGlvbik6CisKIDIwMTEtMTEtMDMgIEZpbGlwIFBpemxvICA8
ZnBpemxvQGFwcGxlLmNvbT4KIAogICAgICAgICBKU0Mgc2hvdWxkIGJlIGFibGUgdG8gc2FtcGxl
IGl0c2VsZiBpbiBhIG1vcmUgZmxleGlibGUgd2F5IHRoYW4ganVzdCBzYW1wbGluZyBmbGFncwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRpdG9y
TW9kZWwuanMgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JN
b2RlbC5qcwppbmRleCBiOTgwYmRiLi4wNGMwZmQzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcworKysgYi9Tb3VyY2UvV2Vi
Q29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcwpAQCAtNzUsNiArNzUs
OCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLkluZGVudCA9IHsKICAgICBUYWJDaGFy
YWN0ZXI6ICJcdCIKIH0KIAorV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5lbmRzV2l0aEJy
YWNrZXRSZWdleCA9IC9beyhcW11ccyokLzsKKwogV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2Rl
bC5wcm90b3R5cGUgPSB7CiAgICAgc2V0IGNoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKQog
ICAgIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4
dFZpZXdlci5qcyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdl
ci5qcwppbmRleCAwMzk4ZmVmLi5hNjkxZTEwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvZnJvbnQtZW5kL1RleHRWaWV3ZXIuanMKKysrIGIvU291cmNlL1dlYkNvcmUvaW5z
cGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpzCkBAIC0yNTQsNiArMjU0LDQ4IEBAIFdlYklu
c3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZSA9IHsKICAgICAgICAgd2luZG93LmdldFNlbGVj
dGlvbigpLmNvbGxhcHNlVG9TdGFydCgpOwogICAgIH0sCiAKKyAgICBfaW5zZXJ0TmV3TGluZTog
ZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2RpcnR5TGluZXMpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5fZ2V0U2VsZWN0
aW9uKCk7CisgICAgICAgIGlmICghcmFuZ2UgfHwgcmFuZ2UuZW5kQ29sdW1uID09PSAwKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHZhciBsaW5lID0gdGhpcy5fdGV4dE1v
ZGVsLmxpbmUocmFuZ2Uuc3RhcnRMaW5lKTsKKyAgICAgICAgdmFyIGxpbmVQcmVmaXggPSBsaW5l
LnN1YnN0cmluZygwLCByYW5nZS5zdGFydENvbHVtbik7CisgICAgICAgIHZhciBpbmRlbnRNYXRj
aCA9IGxpbmVQcmVmaXgubWF0Y2goL15ccysvKTsKKyAgICAgICAgdmFyIGN1cnJlbnRJbmRlbnQg
PSBpbmRlbnRNYXRjaCA/IGluZGVudE1hdGNoWzBdIDogIiI7CisKKyAgICAgICAgdmFyIHRleHRF
ZGl0b3JJbmRlbnQgPSBXZWJJbnNwZWN0b3Iuc2V0dGluZ3MudGV4dEVkaXRvckluZGVudC5nZXQo
KTsKKyAgICAgICAgdmFyIGluZGVudCA9IFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwuZW5k
c1dpdGhCcmFja2V0UmVnZXgudGVzdChsaW5lUHJlZml4KSA/IGN1cnJlbnRJbmRlbnQgKyB0ZXh0
RWRpdG9ySW5kZW50IDogY3VycmVudEluZGVudDsKKworICAgICAgICBpZiAoIWluZGVudCkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0aGlzLmJlZ2luVXBkYXRlcygpOwor
ICAgICAgICB0aGlzLl9lbnRlclRleHRDaGFuZ2VNb2RlKCk7CisKKyAgICAgICAgdmFyIGxpbmVC
cmVhayA9IHRoaXMuX3RleHRNb2RlbC5fbGluZUJyZWFrOworICAgICAgICB2YXIgbmV3UmFuZ2U7
CisgICAgICAgIGlmIChyYW5nZS5zdGFydExpbmUgPT09IHJhbmdlLmVuZExpbmUgJiYgcmFuZ2Uu
c3RhcnRDb2x1bW4gPT09IHJhbmdlLmVuZENvbHVtbiAmJiBsaW5lLnN1YnN0cihyYW5nZS5lbmRD
b2x1bW4gLSAxLCAyKSA9PT0gJ3t9JykgeworICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlzLl9z
ZXRUZXh0KHJhbmdlLCBsaW5lQnJlYWsgKyBpbmRlbnQgKyBsaW5lQnJlYWsgKyBjdXJyZW50SW5k
ZW50KTsKKyAgICAgICAgICAgIG5ld1JhbmdlLnN0YXJ0TGluZSA9IC0tbmV3UmFuZ2UuZW5kTGlu
ZTsKKyAgICAgICAgICAgIG5ld1JhbmdlLnN0YXJ0Q29sdW1uID0gbmV3UmFuZ2UuZW5kQ29sdW1u
ICs9IHRleHRFZGl0b3JJbmRlbnQubGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgbmV3UmFuZ2UgPSB0aGlzLl9zZXRUZXh0KHJhbmdlLCBsaW5lQnJlYWsgKyBpbmRlbnQpOwor
ICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnRDb2x1bW4gPSBuZXdSYW5nZS5lbmRDb2x1bW47Cisg
ICAgICAgICAgICBuZXdSYW5nZS5zdGFydExpbmUgPSBuZXdSYW5nZS5lbmRMaW5lOworICAgICAg
ICB9CisKKyAgICAgICAgdGhpcy5fZXhpdFRleHRDaGFuZ2VNb2RlKHJhbmdlLCBuZXdSYW5nZSk7
CisgICAgICAgIHRoaXMuZW5kVXBkYXRlcygpOworICAgICAgICB0aGlzLl9yZXN0b3JlU2VsZWN0
aW9uKG5ld1JhbmdlLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCiAg
ICAgX3JlZ2lzdGVyU2hvcnRjdXRzOiBmdW5jdGlvbigpCiAgICAgewogICAgICAgICB2YXIga2V5
cyA9IFdlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0LktleXM7CkBAIC0yNjYsNiArMzA4LDkg
QEAgV2ViSW5zcGVjdG9yLlRleHRWaWV3ZXIucHJvdG90eXBlID0gewogICAgICAgICB0aGlzLl9z
aG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlzLkVudGVy
LmNvZGUsIG1vZGlmaWVycy5DdHJsT3JNZXRhKV0gPSBjb21taXRFZGl0aW5nOwogICAgICAgICB0
aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlz
LkVzYy5jb2RlKV0gPSBjYW5jZWxFZGl0aW5nOwogCisgICAgICAgIHZhciBpbnNlcnROZXdMaW5l
ID0gdGhpcy5faW5zZXJ0TmV3TGluZS5iaW5kKHRoaXMuX21haW5QYW5lbCk7CisgICAgICAgIHRo
aXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KGtleXMu
RW50ZXIuY29kZSwgV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLk5vbmUp
XSA9IGluc2VydE5ld0xpbmU7CisKICAgICAgICAgdmFyIGhhbmRsZVVuZG8gPSB0aGlzLl9tYWlu
UGFuZWwuaGFuZGxlVW5kb1JlZG8uYmluZCh0aGlzLl9tYWluUGFuZWwsIGZhbHNlKTsKICAgICAg
ICAgdmFyIGhhbmRsZVJlZG8gPSB0aGlzLl9tYWluUGFuZWwuaGFuZGxlVW5kb1JlZG8uYmluZCh0
aGlzLl9tYWluUGFuZWwsIHRydWUpOwogICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVj
dG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleSgieiIsIG1vZGlmaWVycy5DdHJsT3JNZXRhKV0g
PSBoYW5kbGVVbmRvOwpAQCAtMjc5LDkgKzMyNCwxMiBAQCBXZWJJbnNwZWN0b3IuVGV4dFZpZXdl
ci5wcm90b3R5cGUgPSB7CiAKICAgICBfaGFuZGxlS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICB7
CisgICAgICAgIGlmICh0aGlzLl9tYWluUGFuZWwuX3JlYWRPbmx5KQorICAgICAgICAgICAgcmV0
dXJuOworCiAgICAgICAgIHZhciBzaG9ydGN1dEtleSA9IFdlYkluc3BlY3Rvci5LZXlib2FyZFNo
b3J0Y3V0Lm1ha2VLZXlGcm9tRXZlbnQoZSk7CiAgICAgICAgIHZhciBoYW5kbGVyID0gdGhpcy5f
c2hvcnRjdXRzW3Nob3J0Y3V0S2V5XTsKLSAgICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlci5j
YWxsKHRoaXMpKSB7CisgICAgICAgIGlmIChoYW5kbGVyICYmIGhhbmRsZXIoKSkgewogICAgICAg
ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24o
KTsKICAgICAgICAgfQpAQCAtMTAyMSw3ICsxMDY5LDcgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0
b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogCiAgICAgaGFuZGxlVW5kb1JlZG86IGZ1bmN0aW9u
KHJlZG8pCiAgICAgewotICAgICAgICBpZiAodGhpcy5fcmVhZE9ubHkgfHwgdGhpcy5fZGlydHlM
aW5lcykKKyAgICAgICAgaWYgKHRoaXMuX2RpcnR5TGluZXMpCiAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CiAKICAgICAgICAgdGhpcy5iZWdpblVwZGF0ZXMoKTsKQEAgLTEwNDQsMjAgKzEwOTIs
MTYgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogCiAg
ICAgaGFuZGxlVGFiS2V5UHJlc3M6IGZ1bmN0aW9uKHNoaWZ0S2V5KQogICAgIHsKLSAgICAgICAg
aWYgKHRoaXMuX3JlYWRPbmx5IHx8IHRoaXMuX2RpcnR5TGluZXMpCisgICAgICAgIGlmICh0aGlz
Ll9kaXJ0eUxpbmVzKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIHZhciBz
ZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKCFzZWxlY3Rpb24p
CisgICAgICAgIHZhciByYW5nZSA9IHRoaXMuX2dldFNlbGVjdGlvbigpOworICAgICAgICBpZiAo
IXJhbmdlKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHRoaXMuYmVnaW5V
cGRhdGVzKCk7CiAgICAgICAgIHRoaXMuX2VudGVyVGV4dENoYW5nZU1vZGUoKTsKIAotICAgICAg
ICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb247Ci0gICAgICAgIGlmIChyYW5nZS5zdGFydExpbmUgPiBy
YW5nZS5lbmRMaW5lIHx8IChyYW5nZS5zdGFydExpbmUgPT09IHJhbmdlLmVuZExpbmUgJiYgcmFu
Z2Uuc3RhcnRDb2x1bW4gPiByYW5nZS5lbmRDb2x1bW4pKQotICAgICAgICAgICAgcmFuZ2UgPSBu
ZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShyYW5nZS5lbmRMaW5lLCByYW5nZS5lbmRDb2x1bW4s
IHJhbmdlLnN0YXJ0TGluZSwgcmFuZ2Uuc3RhcnRDb2x1bW4pOwotCiAgICAgICAgIHZhciBuZXdS
YW5nZTsKICAgICAgICAgaWYgKHNoaWZ0S2V5KQogICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlz
Ll91bmluZGVudExpbmVzKHJhbmdlKTsKQEAgLTE0MTksMTAgKzE0NjMsNyBAQCBXZWJJbnNwZWN0
b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICByZXR1cm4g
bnVsbDsKICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5fc2VsZWN0aW9uVG9Qb3NpdGlvbihzZWxl
Y3Rpb25SYW5nZS5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQpOwog
ICAgICAgICB2YXIgZW5kID0gc2VsZWN0aW9uUmFuZ2UuY29sbGFwc2VkID8gc3RhcnQgOiB0aGlz
Ll9zZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvblJhbmdlLmVuZENvbnRhaW5lciwgc2VsZWN0
aW9uUmFuZ2UuZW5kT2Zmc2V0KTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5hbmNob3JOb2RlID09
PSBzZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lciAmJiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0
ID09PSBzZWxlY3Rpb25SYW5nZS5zdGFydE9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBuZXcg
V2ViSW5zcGVjdG9yLlRleHRSYW5nZShzdGFydC5saW5lLCBzdGFydC5jb2x1bW4sIGVuZC5saW5l
LCBlbmQuY29sdW1uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlKGVuZC5saW5lLCBlbmQuY29sdW1uLCBzdGFydC5saW5lLCBzdGFy
dC5jb2x1bW4pOworICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uoc3Rh
cnQubGluZSwgc3RhcnQuY29sdW1uLCBlbmQubGluZSwgZW5kLmNvbHVtbik7CiAgICAgfSwKIAog
ICAgIC8qKgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114328</attachid>
            <date>2011-11-09 11:33:56 -0800</date>
            <delta_ts>2011-11-10 17:06:38 -0800</delta_ts>
            <desc>Trying out WebInspector.TextSelection. Work in progress!</desc>
            <filename>preserve_indent.patch</filename>
            <type>text/plain</type>
            <size>16084</size>
            <attacher name="Nikita Vasilyev">me</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxNzMzYzY1Li4xNGVlZjk5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzUg
QEAKKzIwMTEtMTEtMDkgIE5pa2l0YSBWYXNpbHlldiAgPG1lQGVsdjFzLnJ1PgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IFByZXNlcnZlIGFuIGluZGVudGF0aW9uIGxldmVsIHdoZW4gaW5zZXJ0
aW5nIGEgbmV3IGxpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNjI1CisKKyAgICAgICAgSW5kZW50IG9uZSBsZXZlbCBtb3JlIHdoZW4gbGluZSBl
bmRzIHdpdGggZWl0aGVyICJ7IiwgIlsiIG9yICIoIi4KKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRv
ck1vZGVsLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRSYW5nZS5wcm90b3R5cGUuY2xv
bmUpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRSYW5nZS5wcm90b3R5cGUudG9UZXh0U2Vs
ZWN0aW9uKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uLnByb3RvdHlwZS5pc0VtcHR5KToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uLnByb3RvdHlwZS5nZXQgc3RhcnRMaW5lKToKKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uLnByb3RvdHlwZS5zZXQgc3RhcnRMaW5l
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0U2VsZWN0aW9uLnByb3RvdHlwZS5nZXQgZW5k
TGluZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFNlbGVjdGlvbi5wcm90b3R5cGUuc2V0
IGVuZExpbmUpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRTZWxlY3Rpb24ucHJvdG90eXBl
LmdldCBzdGFydENvbHVtbik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFNlbGVjdGlvbi5w
cm90b3R5cGUuc2V0IHN0YXJ0Q29sdW1uKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0U2Vs
ZWN0aW9uLnByb3RvdHlwZS5nZXQgZW5kQ29sdW1uKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5U
ZXh0U2VsZWN0aW9uLnByb3RvdHlwZS5zZXQgZW5kQ29sdW1uKToKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5UZXh0U2VsZWN0aW9uLnByb3RvdHlwZS5nZXQgbGluZXNDb3VudCk6CisgICAgICAgIChX
ZWJJbnNwZWN0b3IuVGV4dFNlbGVjdGlvbi5wcm90b3R5cGUuY2xvbmUpOgorICAgICAgICAqIGlu
c3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qczoKKyAgICAgICAgKFdlYkluc3BlY3Rvci5U
ZXh0Vmlld2VyLnByb3RvdHlwZS5fcmVnaXN0ZXJTaG9ydGN1dHMpOgorICAgICAgICAoV2ViSW5z
cGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlLl91bmluZGVudExpbmVzKToKKyAg
ICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVsLnByb3RvdHlwZS5faW5zZXJ0
TmV3TGluZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90
b3R5cGUuX2dldFNlbGVjdGlvbik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1h
aW5QYW5lbC5wcm90b3R5cGUuX3Jlc3RvcmVTZWxlY3Rpb24pOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlLl9zZXRDYXJldExvY2F0aW9uKToKKwog
MjAxMS0xMS0wMyAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEpT
QyBzaG91bGQgYmUgYWJsZSB0byBzYW1wbGUgaXRzZWxmIGluIGEgbW9yZSBmbGV4aWJsZSB3YXkg
dGhhbiBqdXN0IHNhbXBsaW5nIGZsYWdzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCmluZGV4IGI5ODBiZGIuLjBkYTIxM2Ig
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRv
ck1vZGVsLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVk
aXRvck1vZGVsLmpzCkBAIC01Myw2ICs1Myw4NCBAQCBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLnBy
b3RvdHlwZSA9IHsKICAgICBjbG9uZTogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJu
IG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLCB0aGlzLnN0YXJ0Q29s
dW1uLCB0aGlzLmVuZExpbmUsIHRoaXMuZW5kQ29sdW1uKTsKKyAgICB9LAorCisgICAgdG9UZXh0
U2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3Iu
VGV4dFNlbGVjdGlvbih0aGlzLnN0YXJ0TGluZSwgdGhpcy5zdGFydENvbHVtbiwgdGhpcy5lbmRM
aW5lLCB0aGlzLmVuZENvbHVtbik7CisgICAgfQorfQorCisvKioKKyAqIEBjb25zdHJ1Y3Rvcgor
ICovCitXZWJJbnNwZWN0b3IuVGV4dFNlbGVjdGlvbiA9IGZ1bmN0aW9uKGFuY2hvckxpbmUsIGFu
Y2hvckNvbHVtbiwgZm9jdXNMaW5lLCBmb2N1c0NvbHVtbikKK3sKKyAgICB0aGlzLmFuY2hvckxp
bmUgPSBhbmNob3JMaW5lOworICAgIHRoaXMuYW5jaG9yQ29sdW1uID0gYW5jaG9yQ29sdW1uOwor
ICAgIHRoaXMuZm9jdXNMaW5lID0gZm9jdXNMaW5lOworICAgIHRoaXMuZm9jdXNDb2x1bW4gPSBm
b2N1c0NvbHVtbjsKK30KKworV2ViSW5zcGVjdG9yLlRleHRTZWxlY3Rpb24ucHJvdG90eXBlID0g
eworICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFu
Y2hvckxpbmUgPT09IHRoaXMuZm9jdXNMaW5lICYmIHRoaXMuYW5jaG9yQ29sdW1uID09PSB0aGlz
LmZvY3VzQ29sdW1uOworICAgIH0sCisKKyAgICBnZXQgc3RhcnRMaW5lKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmFuY2hvckxpbmUgPCB0aGlzLmZvY3VzTGluZSA/IHRoaXMuYW5jaG9y
TGluZSA6IHRoaXMuZm9jdXNMaW5lOworICAgIH0sCisKKyAgICBzZXQgc3RhcnRMaW5lKGxpbmVO
dW1iZXIpCisgICAgeworICAgICAgICB0aGlzW3RoaXMuYW5jaG9yTGluZSA8PSB0aGlzLmZvY3Vz
TGluZSA/ICdhbmNob3JMaW5lJyA6ICdmb2N1c0xpbmUnXSA9IGxpbmVOdW1iZXI7CisgICAgfSwK
KworICAgIGdldCBlbmRMaW5lKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFuY2hvckxp
bmUgPiB0aGlzLmZvY3VzTGluZSA/IHRoaXMuYW5jaG9yTGluZSA6IHRoaXMuZm9jdXNMaW5lOwor
ICAgIH0sCisKKyAgICBzZXQgZW5kTGluZShsaW5lTnVtYmVyKQorICAgIHsKKyAgICAgICAgdGhp
c1t0aGlzLmZvY3VzTGluZSA+PSB0aGlzLmFuY2hvckxpbmUgPyAnZm9jdXNMaW5lJyA6ICdhbmNo
b3JMaW5lJ10gPSBsaW5lTnVtYmVyOworICAgIH0sCisKKyAgICBnZXQgc3RhcnRDb2x1bW4oKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yTGluZSA9PT0gdGhpcy5mb2N1c0xpbmUg
PyBNYXRoLm1pbih0aGlzLmFuY2hvckNvbHVtbiwgdGhpcy5mb2N1c0NvbHVtbikgOgorICAgICAg
ICAgICAgdGhpcy5hbmNob3JMaW5lIDwgdGhpcy5mb2N1c0xpbmUgPyB0aGlzLmFuY2hvckNvbHVt
biA6IHRoaXMuZm9jdXNDb2x1bW47CisgICAgfSwKKworICAgIHNldCBzdGFydENvbHVtbihsaW5l
TnVtYmVyKQorICAgIHsKKyAgICAgICAgdGhpc1t0aGlzLmFuY2hvckxpbmUgPT09IHRoaXMuZm9j
dXNMaW5lID8KKyAgICAgICAgICAgIHRoaXMuYW5jaG9yQ29sdW1uIDw9IHRoaXMuZm9jdXNDb2x1
bW4gPyAnYW5jaG9yQ29sdW1uJyA6ICdmb2N1c0NvbHVtbicgOgorICAgICAgICAgICAgdGhpcy5h
bmNob3JMaW5lIDwgdGhpcy5mb2N1c0xpbmUgPyAnYW5jaG9yQ29sdW1uJyA6ICdmb2N1c0NvbHVt
biddID0gbGluZU51bWJlcjsKKyAgICB9LAorCisgICAgZ2V0IGVuZENvbHVtbigpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5hbmNob3JMaW5lID09PSB0aGlzLmZvY3VzTGluZSA/IE1hdGgu
bWF4KHRoaXMuYW5jaG9yQ29sdW1uLCB0aGlzLmZvY3VzQ29sdW1uKSA6CisgICAgICAgICAgICB0
aGlzLmFuY2hvckxpbmUgPiB0aGlzLmZvY3VzTGluZSA/IHRoaXMuYW5jaG9yQ29sdW1uIDogdGhp
cy5mb2N1c0NvbHVtbjsKKyAgICB9LAorCisgICAgc2V0IGVuZENvbHVtbihsaW5lTnVtYmVyKQor
ICAgIHsKKyAgICAgICAgdGhpc1t0aGlzLmFuY2hvckxpbmUgPT09IHRoaXMuZm9jdXNMaW5lID8K
KyAgICAgICAgICAgIHRoaXMuZm9jdXNDb2x1bW4gPj0gdGhpcy5hbmNob3JDb2x1bW4gPyAnZm9j
dXNDb2x1bW4nIDogJ2FuY2hvckNvbHVtbicgOgorICAgICAgICAgICAgdGhpcy5mb2N1c0xpbmUg
PiB0aGlzLmFuY2hvckxpbmUgPyAnZm9jdXNDb2x1bW4nIDogJ2FuY2hvckNvbHVtbiddID0gbGlu
ZU51bWJlcjsKKyAgICB9LAorCisgICAgZ2V0IGxpbmVzQ291bnQoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMuZW5kTGluZSAtIHRoaXMuc3RhcnRMaW5lOworICAgIH0sCisKKyAgICBjbG9u
ZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4
dFNlbGVjdGlvbih0aGlzLmFuY2hvckxpbmUsIHRoaXMuYW5jaG9yQ29sdW1uLCB0aGlzLmZvY3Vz
TGluZSwgdGhpcy5mb2N1c0NvbHVtbik7CiAgICAgfQogfQogCkBAIC03NSw2ICsxNTMsOCBAQCBX
ZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLkluZGVudCA9IHsKICAgICBUYWJDaGFyYWN0ZXI6
ICJcdCIKIH0KIAorV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5lbmRzV2l0aEJyYWNrZXRS
ZWdleCA9IC9beyhcW11ccyokLzsKKwogV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5wcm90
b3R5cGUgPSB7CiAgICAgc2V0IGNoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKQogICAgIHsK
QEAgLTkxLDYgKzE3MSwxMCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLnByb3RvdHlw
ZSA9IHsKICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzLmpvaW4odGhpcy5fbGluZUJyZWFrKTsK
ICAgICB9LAogCisgICAgZ2V0IGxpbmVCcmVhaygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2xp
bmVCcmVhazsKKyAgICB9LAorCiAgICAgbGluZTogZnVuY3Rpb24obGluZU51bWJlcikKICAgICB7
CiAgICAgICAgIGlmIChsaW5lTnVtYmVyID49IHRoaXMuX2xpbmVzLmxlbmd0aCkKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qcyBiL1Nv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qcwppbmRleCAwMzk4
ZmVmLi5iZGI5ZWE2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQt
ZW5kL1RleHRWaWV3ZXIuanMKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC9UZXh0Vmlld2VyLmpzCkBAIC0yNjYsNiArMjY2LDkgQEAgV2ViSW5zcGVjdG9yLlRleHRWaWV3
ZXIucHJvdG90eXBlID0gewogICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktl
eWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlzLkVudGVyLmNvZGUsIG1vZGlmaWVycy5DdHJsT3JN
ZXRhKV0gPSBjb21taXRFZGl0aW5nOwogICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVj
dG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlzLkVzYy5jb2RlKV0gPSBjYW5jZWxFZGl0
aW5nOwogCisgICAgICAgIHZhciBpbnNlcnROZXdMaW5lID0gdGhpcy5fbWFpblBhbmVsLl9pbnNl
cnROZXdMaW5lLmJpbmQodGhpcy5fbWFpblBhbmVsKTsKKyAgICAgICAgdGhpcy5fc2hvcnRjdXRz
W1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoa2V5cy5FbnRlci5jb2RlLCBX
ZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuTm9uZSldID0gaW5zZXJ0TmV3
TGluZTsKKwogICAgICAgICB2YXIgaGFuZGxlVW5kbyA9IHRoaXMuX21haW5QYW5lbC5oYW5kbGVV
bmRvUmVkby5iaW5kKHRoaXMuX21haW5QYW5lbCwgZmFsc2UpOwogICAgICAgICB2YXIgaGFuZGxl
UmVkbyA9IHRoaXMuX21haW5QYW5lbC5oYW5kbGVVbmRvUmVkby5iaW5kKHRoaXMuX21haW5QYW5l
bCwgdHJ1ZSk7CiAgICAgICAgIHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRT
aG9ydGN1dC5tYWtlS2V5KCJ6IiwgbW9kaWZpZXJzLkN0cmxPck1ldGEpXSA9IGhhbmRsZVVuZG87
CkBAIC0yNzksOSArMjgyLDEyIEBAIFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZSA9
IHsKIAogICAgIF9oYW5kbGVLZXlEb3duOiBmdW5jdGlvbihlKQogICAgIHsKKyAgICAgICAgaWYg
KHRoaXMuX21haW5QYW5lbC5fcmVhZE9ubHkpCisgICAgICAgICAgICByZXR1cm47CisKICAgICAg
ICAgdmFyIHNob3J0Y3V0S2V5ID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtl
eUZyb21FdmVudChlKTsKICAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLl9zaG9ydGN1dHNbc2hv
cnRjdXRLZXldOwotICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyLmNhbGwodGhpcykpIHsK
KyAgICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlcigpKSB7CiAgICAgICAgICAgICBlLnByZXZl
bnREZWZhdWx0KCk7CiAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICB9
CkBAIC0xMDIxLDcgKzEwMjcsNyBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5w
cm90b3R5cGUgPSB7CiAKICAgICBoYW5kbGVVbmRvUmVkbzogZnVuY3Rpb24ocmVkbykKICAgICB7
Ci0gICAgICAgIGlmICh0aGlzLl9yZWFkT25seSB8fCB0aGlzLl9kaXJ0eUxpbmVzKQorICAgICAg
ICBpZiAodGhpcy5fZGlydHlMaW5lcykKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAg
ICAgICB0aGlzLmJlZ2luVXBkYXRlcygpOwpAQCAtMTA0NCw3ICsxMDUwLDcgQEAgV2ViSW5zcGVj
dG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogCiAgICAgaGFuZGxlVGFiS2V5
UHJlc3M6IGZ1bmN0aW9uKHNoaWZ0S2V5KQogICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX3JlYWRP
bmx5IHx8IHRoaXMuX2RpcnR5TGluZXMpCisgICAgICAgIGlmICh0aGlzLl9kaXJ0eUxpbmVzKQog
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlz
Ll9nZXRTZWxlY3Rpb24oKTsKQEAgLTEwNTQsNDcgKzEwNjAsNDMgQEAgV2ViSW5zcGVjdG9yLlRl
eHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogICAgICAgICB0aGlzLmJlZ2luVXBkYXRl
cygpOwogICAgICAgICB0aGlzLl9lbnRlclRleHRDaGFuZ2VNb2RlKCk7CiAKLSAgICAgICAgdmFy
IHJhbmdlID0gc2VsZWN0aW9uOwotICAgICAgICBpZiAocmFuZ2Uuc3RhcnRMaW5lID4gcmFuZ2Uu
ZW5kTGluZSB8fCAocmFuZ2Uuc3RhcnRMaW5lID09PSByYW5nZS5lbmRMaW5lICYmIHJhbmdlLnN0
YXJ0Q29sdW1uID4gcmFuZ2UuZW5kQ29sdW1uKSkKLSAgICAgICAgICAgIHJhbmdlID0gbmV3IFdl
Ykluc3BlY3Rvci5UZXh0UmFuZ2UocmFuZ2UuZW5kTGluZSwgcmFuZ2UuZW5kQ29sdW1uLCByYW5n
ZS5zdGFydExpbmUsIHJhbmdlLnN0YXJ0Q29sdW1uKTsKLQotICAgICAgICB2YXIgbmV3UmFuZ2U7
CisgICAgICAgIHZhciBuZXdTZWxlY3Rpb247CiAgICAgICAgIGlmIChzaGlmdEtleSkKLSAgICAg
ICAgICAgIG5ld1JhbmdlID0gdGhpcy5fdW5pbmRlbnRMaW5lcyhyYW5nZSk7CisgICAgICAgICAg
ICBuZXdTZWxlY3Rpb24gPSB0aGlzLl91bmluZGVudExpbmVzKHNlbGVjdGlvbik7CiAgICAgICAg
IGVsc2UgewotICAgICAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAg
ICAgIG5ld1JhbmdlID0gdGhpcy5fc2V0VGV4dChyYW5nZSwgV2ViSW5zcGVjdG9yLnNldHRpbmdz
LnRleHRFZGl0b3JJbmRlbnQuZ2V0KCkpOwotICAgICAgICAgICAgICAgIG5ld1JhbmdlLnN0YXJ0
Q29sdW1uID0gbmV3UmFuZ2UuZW5kQ29sdW1uOworICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5p
c0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSB0aGlzLl9zZXRUZXh0
KHNlbGVjdGlvbiwgV2ViSW5zcGVjdG9yLnNldHRpbmdzLnRleHRFZGl0b3JJbmRlbnQuZ2V0KCkp
LnRvVGV4dFNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvbi5hbmNob3JD
b2x1bW4gPSBuZXdTZWxlY3Rpb24uZm9jdXNDb2x1bW47CiAgICAgICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgICAgICBuZXdSYW5nZSA9IHRoaXMuX2luZGVudExpbmVzKHJhbmdlKTsKKyAgICAg
ICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSB0aGlzLl9pbmRlbnRMaW5lcyhzZWxlY3Rpb24pOwog
CiAgICAgICAgIH0KIAotICAgICAgICB0aGlzLl9leGl0VGV4dENoYW5nZU1vZGUocmFuZ2UsIG5l
d1JhbmdlKTsKKyAgICAgICAgdGhpcy5fZXhpdFRleHRDaGFuZ2VNb2RlKHNlbGVjdGlvbiwgbmV3
U2VsZWN0aW9uKTsKICAgICAgICAgdGhpcy5lbmRVcGRhdGVzKCk7Ci0gICAgICAgIHRoaXMuX3Jl
c3RvcmVTZWxlY3Rpb24obmV3UmFuZ2UsIHRydWUpOworICAgICAgICB0aGlzLl9yZXN0b3JlU2Vs
ZWN0aW9uKG5ld1NlbGVjdGlvbiwgdHJ1ZSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0s
CiAKLSAgICBfaW5kZW50TGluZXM6IGZ1bmN0aW9uKHJhbmdlKQorICAgIF9pbmRlbnRMaW5lczog
ZnVuY3Rpb24oc2VsZWN0aW9uKQogICAgIHsKICAgICAgICAgdmFyIGluZGVudCA9IFdlYkluc3Bl
Y3Rvci5zZXR0aW5ncy50ZXh0RWRpdG9ySW5kZW50LmdldCgpOwogCiAgICAgICAgIGlmICh0aGlz
Ll9sYXN0RWRpdGVkUmFuZ2UpCiAgICAgICAgICAgICB0aGlzLl90ZXh0TW9kZWwubWFya1VuZG9h
YmxlU3RhdGUoKTsKIAotICAgICAgICBmb3IgKHZhciBsaW5lTnVtYmVyID0gcmFuZ2Uuc3RhcnRM
aW5lOyBsaW5lTnVtYmVyIDw9IHJhbmdlLmVuZExpbmU7IGxpbmVOdW1iZXIrKykKKyAgICAgICAg
Zm9yICh2YXIgbGluZU51bWJlciA9IHNlbGVjdGlvbi5zdGFydExpbmUsIGVuZExpbmUgPSBzZWxl
Y3Rpb24uZW5kTGluZTsgbGluZU51bWJlciA8PSBlbmRMaW5lOyBsaW5lTnVtYmVyKyspCiAgICAg
ICAgICAgICB0aGlzLl90ZXh0TW9kZWwuc2V0VGV4dChuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5n
ZShsaW5lTnVtYmVyLCAwLCBsaW5lTnVtYmVyLCAwKSwgaW5kZW50KTsKIAotICAgICAgICB2YXIg
bmV3UmFuZ2UgPSByYW5nZS5jbG9uZSgpOwotICAgICAgICBuZXdSYW5nZS5zdGFydENvbHVtbiAr
PSBpbmRlbnQubGVuZ3RoOwotICAgICAgICBuZXdSYW5nZS5lbmRDb2x1bW4gKz0gaW5kZW50Lmxl
bmd0aDsKLSAgICAgICAgdGhpcy5fbGFzdEVkaXRlZFJhbmdlID0gbmV3UmFuZ2U7CisgICAgICAg
IHZhciBuZXdTZWxlY3Rpb24gPSBzZWxlY3Rpb24uY2xvbmUoKTsKKyAgICAgICAgbmV3U2VsZWN0
aW9uLmFuY2hvckNvbHVtbiArPSBpbmRlbnQubGVuZ3RoOworICAgICAgICBuZXdTZWxlY3Rpb24u
Zm9jdXNDb2x1bW4gKz0gaW5kZW50Lmxlbmd0aDsKKyAgICAgICAgdGhpcy5fbGFzdEVkaXRlZFJh
bmdlID0gbmV3U2VsZWN0aW9uOwogCi0gICAgICAgIHJldHVybiBuZXdSYW5nZTsKKyAgICAgICAg
cmV0dXJuIG5ld1NlbGVjdGlvbjsKICAgICB9LAogCi0gICAgX3VuaW5kZW50TGluZXM6IGZ1bmN0
aW9uKHJhbmdlKQorICAgIF91bmluZGVudExpbmVzOiBmdW5jdGlvbihzZWxlY3Rpb24pCiAgICAg
ewogICAgICAgICBpZiAodGhpcy5fbGFzdEVkaXRlZFJhbmdlKQogICAgICAgICAgICAgdGhpcy5f
dGV4dE1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7CkBAIC0xMTAyLDkgKzExMDQsOSBAQCBXZWJJ
bnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5cGUgPSB7CiAgICAgICAgIHZhciBp
bmRlbnQgPSBXZWJJbnNwZWN0b3Iuc2V0dGluZ3MudGV4dEVkaXRvckluZGVudC5nZXQoKTsKICAg
ICAgICAgdmFyIGluZGVudExlbmd0aCA9IGluZGVudCA9PT0gV2ViSW5zcGVjdG9yLlRleHRFZGl0
b3JNb2RlbC5JbmRlbnQuVGFiQ2hhcmFjdGVyID8gNCA6IGluZGVudC5sZW5ndGg7CiAgICAgICAg
IHZhciBsaW5lSW5kZW50UmVnZXggPSBuZXcgUmVnRXhwKCJeIHsxLCIgKyBpbmRlbnRMZW5ndGgg
KyAifSIpOwotICAgICAgICB2YXIgbmV3UmFuZ2UgPSByYW5nZS5jbG9uZSgpOworICAgICAgICB2
YXIgbmV3U2VsZWN0aW9uID0gc2VsZWN0aW9uLmNsb25lKCk7CiAKLSAgICAgICAgZm9yICh2YXIg
bGluZU51bWJlciA9IHJhbmdlLnN0YXJ0TGluZTsgbGluZU51bWJlciA8PSByYW5nZS5lbmRMaW5l
OyBsaW5lTnVtYmVyKyspIHsKKyAgICAgICAgZm9yICh2YXIgbGluZU51bWJlciA9IHNlbGVjdGlv
bi5zdGFydExpbmUsIGVuZExpbmUgPSBzZWxlY3Rpb24uZW5kTGluZTsgbGluZU51bWJlciA8PSBl
bmRMaW5lOyBsaW5lTnVtYmVyKyspIHsKICAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5fdGV4
dE1vZGVsLmxpbmUobGluZU51bWJlcik7CiAgICAgICAgICAgICB2YXIgZmlyc3RDaGFyYWN0ZXIg
PSBsaW5lLmNoYXJBdCgwKTsKICAgICAgICAgICAgIHZhciBsaW5lSW5kZW50TGVuZ3RoOwpAQCAt
MTExOCwxNiArMTEyMCw1OCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90
b3R5cGUgPSB7CiAKICAgICAgICAgICAgIHRoaXMuX3RleHRNb2RlbC5zZXRUZXh0KG5ldyBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlKGxpbmVOdW1iZXIsIDAsIGxpbmVOdW1iZXIsIGxpbmVJbmRlbnRM
ZW5ndGgpLCAiIik7CiAKLSAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyID09PSByYW5nZS5zdGFy
dExpbmUpCi0gICAgICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnRDb2x1bW4gPSBNYXRoLm1heCgw
LCBuZXdSYW5nZS5zdGFydENvbHVtbiAtIGxpbmVJbmRlbnRMZW5ndGgpOworICAgICAgICAgICAg
aWYgKGxpbmVOdW1iZXIgPT09IHNlbGVjdGlvbi5zdGFydExpbmUpCisgICAgICAgICAgICAgICAg
bmV3U2VsZWN0aW9uLnN0YXJ0Q29sdW1uID0gTWF0aC5tYXgoMCwgbmV3U2VsZWN0aW9uLnN0YXJ0
Q29sdW1uIC0gbGluZUluZGVudExlbmd0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobGlu
ZUluZGVudExlbmd0aCkKLSAgICAgICAgICAgIG5ld1JhbmdlLmVuZENvbHVtbiA9IE1hdGgubWF4
KDAsIG5ld1JhbmdlLmVuZENvbHVtbiAtIGxpbmVJbmRlbnRMZW5ndGgpOworICAgICAgICAgICAg
bmV3U2VsZWN0aW9uLmVuZENvbHVtbiA9IE1hdGgubWF4KDAsIG5ld1NlbGVjdGlvbi5lbmRDb2x1
bW4gLSBsaW5lSW5kZW50TGVuZ3RoKTsKIAotICAgICAgICB0aGlzLl9sYXN0RWRpdGVkUmFuZ2Ug
PSBuZXdSYW5nZTsKKyAgICAgICAgdGhpcy5fbGFzdEVkaXRlZFJhbmdlID0gbmV3U2VsZWN0aW9u
OwogCi0gICAgICAgIHJldHVybiBuZXdSYW5nZTsKKyAgICAgICAgcmV0dXJuIG5ld1NlbGVjdGlv
bjsKKyAgICB9LAorCisgICAgX2luc2VydE5ld0xpbmU6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAg
ICAgIGlmICh0aGlzLl9kaXJ0eUxpbmVzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgaWYg
KCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLmVuZENvbHVtbiA9PT0gMCkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKHNl
bGVjdGlvbi5zdGFydExpbmUpOworICAgICAgICB2YXIgbGluZVByZWZpeCA9IGxpbmUuc3Vic3Ry
aW5nKDAsIHNlbGVjdGlvbi5zdGFydENvbHVtbik7CisgICAgICAgIHZhciBpbmRlbnRNYXRjaCA9
IGxpbmVQcmVmaXgubWF0Y2goL15ccysvKTsKKyAgICAgICAgdmFyIGN1cnJlbnRJbmRlbnQgPSBp
bmRlbnRNYXRjaCA/IGluZGVudE1hdGNoWzBdIDogIiI7CisKKyAgICAgICAgdmFyIHRleHRFZGl0
b3JJbmRlbnQgPSBXZWJJbnNwZWN0b3Iuc2V0dGluZ3MudGV4dEVkaXRvckluZGVudC5nZXQoKTsK
KyAgICAgICAgdmFyIGluZGVudCA9IFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwuZW5kc1dp
dGhCcmFja2V0UmVnZXgudGVzdChsaW5lUHJlZml4KSA/IGN1cnJlbnRJbmRlbnQgKyB0ZXh0RWRp
dG9ySW5kZW50IDogY3VycmVudEluZGVudDsKKworICAgICAgICBpZiAoIWluZGVudCkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0aGlzLmJlZ2luVXBkYXRlcygpOworICAg
ICAgICB0aGlzLl9lbnRlclRleHRDaGFuZ2VNb2RlKCk7CisKKyAgICAgICAgdmFyIGxpbmVCcmVh
ayA9IHRoaXMuX3RleHRNb2RlbC5saW5lQnJlYWs7CisgICAgICAgIHZhciBuZXdTZWxlY3Rpb247
CisgICAgICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yTGluZSA9PT0gc2VsZWN0aW9uLmZvY3VzTGlu
ZSAmJiBzZWxlY3Rpb24uYW5jaG9yQ29sdW1uID09PSBzZWxlY3Rpb24uZm9jdXNDb2x1bW4gJiYg
bGluZS5zdWJzdHIoc2VsZWN0aW9uLmVuZENvbHVtbiAtIDEsIDIpID09PSAne30nKSB7CisgICAg
ICAgICAgICBuZXdTZWxlY3Rpb24gPSB0aGlzLl9zZXRUZXh0KHNlbGVjdGlvbiwgbGluZUJyZWFr
ICsgaW5kZW50ICsgbGluZUJyZWFrICsgY3VycmVudEluZGVudCkudG9UZXh0U2VsZWN0aW9uKCk7
CisgICAgICAgICAgICBuZXdTZWxlY3Rpb24uYW5jaG9yTGluZSA9IC0tbmV3U2VsZWN0aW9uLmZv
Y3VzTGluZTsKKyAgICAgICAgICAgIG5ld1NlbGVjdGlvbi5hbmNob3JDb2x1bW4gPSBuZXdTZWxl
Y3Rpb24uZm9jdXNDb2x1bW4gKz0gdGV4dEVkaXRvckluZGVudC5sZW5ndGg7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSB0aGlzLl9zZXRUZXh0KHNlbGVjdGlv
biwgbGluZUJyZWFrICsgaW5kZW50KS50b1RleHRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIG5l
d1NlbGVjdGlvbi5hbmNob3JDb2x1bW4gPSBuZXdTZWxlY3Rpb24uZm9jdXNDb2x1bW47CisgICAg
ICAgICAgICBuZXdTZWxlY3Rpb24uYW5jaG9yTGluZSA9IG5ld1NlbGVjdGlvbi5mb2N1c0xpbmU7
CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9leGl0VGV4dENoYW5nZU1vZGUoc2VsZWN0aW9u
LCBuZXdTZWxlY3Rpb24pOworICAgICAgICB0aGlzLmVuZFVwZGF0ZXMoKTsKKyAgICAgICAgdGhp
cy5fcmVzdG9yZVNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIHRydWUpOworCisgICAgICAgIHJldHVy
biB0cnVlOwogICAgIH0sCiAKICAgICBfc3BsaXRDaHVua09uQUxpbmU6IGZ1bmN0aW9uKGxpbmVO
dW1iZXIsIGNodW5rTnVtYmVyLCBjcmVhdGVTdWZmaXhDaHVuaykKQEAgLTE0MTMsMTYgKzE0NTcs
MTIgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogICAg
ICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgICBpZiAo
IXNlbGVjdGlvbi5yYW5nZUNvdW50KQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAg
IHZhciBzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgICAv
LyBTZWxlY3Rpb24gbWF5IGJlIG91dHNpZGUgb2YgdGhlIHZpZXdlci4KLSAgICAgICAgaWYgKCF0
aGlzLl9jb250YWluZXIuaXNBbmNlc3RvcihzZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lcikg
fHwgIXRoaXMuX2NvbnRhaW5lci5pc0FuY2VzdG9yKHNlbGVjdGlvblJhbmdlLmVuZENvbnRhaW5l
cikpCisgICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyLmlzQW5jZXN0b3Ioc2VsZWN0aW9uLmFu
Y2hvck5vZGUpIHx8ICF0aGlzLl9jb250YWluZXIuaXNBbmNlc3RvcihzZWxlY3Rpb24uZm9jdXNO
b2RlKSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB2YXIgc3RhcnQgPSB0aGlz
Ll9zZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyLCBzZWxl
Y3Rpb25SYW5nZS5zdGFydE9mZnNldCk7Ci0gICAgICAgIHZhciBlbmQgPSBzZWxlY3Rpb25SYW5n
ZS5jb2xsYXBzZWQgPyBzdGFydCA6IHRoaXMuX3NlbGVjdGlvblRvUG9zaXRpb24oc2VsZWN0aW9u
UmFuZ2UuZW5kQ29udGFpbmVyLCBzZWxlY3Rpb25SYW5nZS5lbmRPZmZzZXQpOwotICAgICAgICBp
ZiAoc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVy
ICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHNlbGVjdGlvblJhbmdlLnN0YXJ0T2Zmc2V0
KQotICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHN0YXJ0Lmxp
bmUsIHN0YXJ0LmNvbHVtbiwgZW5kLmxpbmUsIGVuZC5jb2x1bW4pOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UoZW5kLmxpbmUsIGVu
ZC5jb2x1bW4sIHN0YXJ0LmxpbmUsIHN0YXJ0LmNvbHVtbik7CisgICAgICAgIHZhciBzdGFydCA9
IHRoaXMuX3NlbGVjdGlvblRvUG9zaXRpb24oc2VsZWN0aW9uLmFuY2hvck5vZGUsIHNlbGVjdGlv
bi5hbmNob3JPZmZzZXQpOworICAgICAgICB2YXIgZW5kID0gc2VsZWN0aW9uLmlzQ29sbGFwc2Vk
ID8gc3RhcnQgOiB0aGlzLl9zZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvbi5mb2N1c05vZGUs
IHNlbGVjdGlvbi5mb2N1c09mZnNldCk7CisgICAgICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9y
LlRleHRTZWxlY3Rpb24oc3RhcnQubGluZSwgc3RhcnQuY29sdW1uLCBlbmQubGluZSwgZW5kLmNv
bHVtbik7CiAgICAgfSwKIAogICAgIC8qKgpAQCAtMTQzMiw4ICsxNDcyLDggQEAgV2ViSW5zcGVj
dG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogICAgIHsKICAgICAgICAgaWYg
KCFyYW5nZSkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5f
cG9zaXRpb25Ub1NlbGVjdGlvbihyYW5nZS5zdGFydExpbmUsIHJhbmdlLnN0YXJ0Q29sdW1uKTsK
LSAgICAgICAgdmFyIGVuZCA9IHJhbmdlLmlzRW1wdHkoKSA/IHN0YXJ0IDogdGhpcy5fcG9zaXRp
b25Ub1NlbGVjdGlvbihyYW5nZS5lbmRMaW5lLCByYW5nZS5lbmRDb2x1bW4pOworICAgICAgICB2
YXIgc3RhcnQgPSB0aGlzLl9wb3NpdGlvblRvU2VsZWN0aW9uKHJhbmdlLmFuY2hvckxpbmUsIHJh
bmdlLmFuY2hvckNvbHVtbik7CisgICAgICAgIHZhciBlbmQgPSByYW5nZS5pc0VtcHR5KCkgPyBz
dGFydCA6IHRoaXMuX3Bvc2l0aW9uVG9TZWxlY3Rpb24ocmFuZ2UuZm9jdXNMaW5lLCByYW5nZS5m
b2N1c0NvbHVtbik7CiAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0
ZW50KHN0YXJ0LmNvbnRhaW5lciwgc3RhcnQub2Zmc2V0LCBlbmQuY29udGFpbmVyLCBlbmQub2Zm
c2V0KTsKIAogICAgICAgICBpZiAoc2Nyb2xsSW50b1ZpZXcpIHsKQEAgLTE0NDgsOCArMTQ4OCw4
IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVsLnByb3RvdHlwZSA9IHsKIAogICAg
IF9zZXRDYXJldExvY2F0aW9uOiBmdW5jdGlvbihsaW5lLCBjb2x1bW4sIHNjcm9sbEludG9WaWV3
KQogICAgIHsKLSAgICAgICAgdmFyIHJhbmdlID0gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uo
bGluZSwgY29sdW1uLCBsaW5lLCBjb2x1bW4pOwotICAgICAgICB0aGlzLl9yZXN0b3JlU2VsZWN0
aW9uKHJhbmdlLCBzY3JvbGxJbnRvVmlldyk7CisgICAgICAgIHZhciBzZWxlY3Rpb24gPSBuZXcg
V2ViSW5zcGVjdG9yLlRleHRTZWxlY3Rpb24obGluZSwgY29sdW1uLCBsaW5lLCBjb2x1bW4pOwor
ICAgICAgICB0aGlzLl9yZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbiwgc2Nyb2xsSW50b1ZpZXcp
OwogICAgIH0sCiAKICAgICBfc2VsZWN0aW9uVG9Qb3NpdGlvbjogZnVuY3Rpb24oY29udGFpbmVy
LCBvZmZzZXQpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114606</attachid>
            <date>2011-11-10 17:06:38 -0800</date>
            <delta_ts>2011-11-18 05:36:54 -0800</delta_ts>
            <desc>Remove TextSelection, add methods to TextRange.</desc>
            <filename>preserve_indent.patch</filename>
            <type>text/plain</type>
            <size>10695</size>
            <attacher name="Nikita Vasilyev">me</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxNzMzYzY1Li5lODAxNThlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjcg
QEAKKzIwMTEtMTEtMTAgIE5pa2l0YSBWYXNpbHlldiAgPG1lQGVsdjFzLnJ1PgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IFByZXNlcnZlIGFuIGluZGVudGF0aW9uIGxldmVsIHdoZW4gaW5zZXJ0
aW5nIGEgbmV3IGxpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNjI1CisKKyAgICAgICAgSW5kZW50IG9uZSBsZXZlbCBtb3JlIHdoZW4gYSBsaW5l
IGVuZHMgd2l0aCBlaXRoZXIgInsiLCAiWyIgb3IgIigiLgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRp
dG9yTW9kZWwuanM6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBlLmdldCBhbmNob3JMaW5lKToKKyAgICAg
ICAgKFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBlLmdldCBmb2N1c0xpbmUpOgorICAg
ICAgICAoV2ViSW5zcGVjdG9yLlRleHRSYW5nZS5wcm90b3R5cGUuZ2V0IGFuY2hvckNvbHVtbik6
CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZS5nZXQgZm9jdXNDb2x1
bW4pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRSYW5nZS5wcm90b3R5cGUuY29sbGFwc2VU
b0VuZCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmNyZWF0ZVNlbGVjdGlvbik6
CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpzOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLlRleHRWaWV3ZXIucHJvdG90eXBlLl9yZWdpc3RlclNob3J0Y3V0cyk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFZpZXdlci5wcm90b3R5cGUuX2hhbmRsZUtleURvd24p
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlLmhh
bmRsZUVudGVyS2V5KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVs
LnByb3RvdHlwZS5fZ2V0U2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRp
dG9yTWFpblBhbmVsLnByb3RvdHlwZS5fcmVzdG9yZVNlbGVjdGlvbik6CisKIDIwMTEtMTEtMDMg
IEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KIAogICAgICAgICBKU0Mgc2hvdWxkIGJl
IGFibGUgdG8gc2FtcGxlIGl0c2VsZiBpbiBhIG1vcmUgZmxleGlibGUgd2F5IHRoYW4ganVzdCBz
YW1wbGluZyBmbGFncwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250
LWVuZC9UZXh0RWRpdG9yTW9kZWwuanMgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQt
ZW5kL1RleHRFZGl0b3JNb2RlbC5qcwppbmRleCBiOTgwYmRiLi4xMWY4ZmMzIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcwor
KysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5q
cwpAQCAtMzAsMTMgKzMwLDE5IEBACiAKIC8qKgogICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0g
e251bWJlcn0gc3RhcnRMaW5lCisgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRDb2x1bW4KKyAqIEBw
YXJhbSB7bnVtYmVyfSBlbmRMaW5lCisgKiBAcGFyYW0ge251bWJlcn0gZW5kQ29sdW1uCisgKiBA
cGFyYW0ge2Jvb2xlYW49fSByZXZlcnNlZAogICovCi1XZWJJbnNwZWN0b3IuVGV4dFJhbmdlID0g
ZnVuY3Rpb24oc3RhcnRMaW5lLCBzdGFydENvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKQorV2Vi
SW5zcGVjdG9yLlRleHRSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4sIGVu
ZExpbmUsIGVuZENvbHVtbiwgcmV2ZXJzZWQpCiB7CiAgICAgdGhpcy5zdGFydExpbmUgPSBzdGFy
dExpbmU7CiAgICAgdGhpcy5zdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOwogICAgIHRoaXMuZW5k
TGluZSA9IGVuZExpbmU7CiAgICAgdGhpcy5lbmRDb2x1bW4gPSBlbmRDb2x1bW47CisgICAgdGhp
cy5yZXZlcnNlZCA9IHJldmVyc2VkIHx8IGZhbHNlOwogfQogCiBXZWJJbnNwZWN0b3IuVGV4dFJh
bmdlLnByb3RvdHlwZSA9IHsKQEAgLTUwLDYgKzU2LDMyIEBAIFdlYkluc3BlY3Rvci5UZXh0UmFu
Z2UucHJvdG90eXBlID0gewogICAgICAgICByZXR1cm4gdGhpcy5lbmRMaW5lIC0gdGhpcy5zdGFy
dExpbmU7CiAgICAgfSwKIAorICAgIGdldCBhbmNob3JMaW5lKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnJldmVyc2VkID8gdGhpcy5lbmRMaW5lIDogdGhpcy5zdGFydExpbmU7CisgICAg
fSwKKworICAgIGdldCBmb2N1c0xpbmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmV2
ZXJzZWQgPyB0aGlzLnN0YXJ0TGluZSA6IHRoaXMuZW5kTGluZTsKKyAgICB9LAorCisgICAgZ2V0
IGFuY2hvckNvbHVtbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlZCA/IHRo
aXMuZW5kQ29sdW1uIDogdGhpcy5zdGFydENvbHVtbjsKKyAgICB9LAorCisgICAgZ2V0IGZvY3Vz
Q29sdW1uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnJldmVyc2VkID8gdGhpcy5zdGFy
dENvbHVtbiA6IHRoaXMuZW5kQ29sdW1uOworICAgIH0sCisKKyAgICBjb2xsYXBzZVRvRW5kOiBm
dW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLnN0YXJ0TGluZSA9IHRoaXMuZW5kTGluZTsK
KyAgICAgICAgdGhpcy5zdGFydENvbHVtbiA9IHRoaXMuZW5kQ29sdW1uOworICAgIH0sCisKICAg
ICBjbG9uZTogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0
b3IuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLCB0aGlzLnN0YXJ0Q29sdW1uLCB0aGlzLmVuZExp
bmUsIHRoaXMuZW5kQ29sdW1uKTsKQEAgLTU3LDYgKzg5LDIxIEBAIFdlYkluc3BlY3Rvci5UZXh0
UmFuZ2UucHJvdG90eXBlID0gewogfQogCiAvKioKKyAqIEBwYXJhbSB7bnVtYmVyfSBhbmNob3JM
aW5lCisgKiBAcGFyYW0ge251bWJlcn0gYW5jaG9yQ29sdW1uCisgKiBAcGFyYW0ge251bWJlcn0g
Zm9jdXNMaW5lCisgKiBAcGFyYW0ge251bWJlcn0gZm9jdXNDb2x1bW4KKyAqLworV2ViSW5zcGVj
dG9yLlRleHRSYW5nZS5jcmVhdGVTZWxlY3Rpb24gPSBmdW5jdGlvbihhbmNob3JMaW5lLCBhbmNo
b3JDb2x1bW4sIGZvY3VzTGluZSwgZm9jdXNDb2x1bW4pCit7CisgICAgdmFyIHJldmVyc2VkID0g
YW5jaG9yTGluZSA+IGZvY3VzTGluZSB8fCBhbmNob3JMaW5lID09PSBmb2N1c0xpbmUgJiYgYW5j
aG9yQ29sdW1uID4gZm9jdXNDb2x1bW47CisgICAgaWYgKHJldmVyc2VkKQorICAgICAgICByZXR1
cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UoZm9jdXNMaW5lLCBmb2N1c0NvbHVtbiwgYW5j
aG9yTGluZSwgYW5jaG9yQ29sdW1uLCByZXZlcnNlZCk7CisgICAgZWxzZQorICAgICAgICByZXR1
cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UoYW5jaG9yTGluZSwgYW5jaG9yQ29sdW1uLCBm
b2N1c0xpbmUsIGZvY3VzQ29sdW1uLCByZXZlcnNlZCk7Cit9CisKKy8qKgogICogQGNvbnN0cnVj
dG9yCiAgKi8KIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwgPSBmdW5jdGlvbigpCkBAIC03
NSw2ICsxMjIsOCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLkluZGVudCA9IHsKICAg
ICBUYWJDaGFyYWN0ZXI6ICJcdCIKIH0KIAorV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5l
bmRzV2l0aEJyYWNrZXRSZWdleCA9IC9beyhcW11ccyokLzsKKwogV2ViSW5zcGVjdG9yLlRleHRF
ZGl0b3JNb2RlbC5wcm90b3R5cGUgPSB7CiAgICAgc2V0IGNoYW5nZUxpc3RlbmVyKGNoYW5nZUxp
c3RlbmVyKQogICAgIHsKQEAgLTkxLDYgKzE0MCwxMCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRv
ck1vZGVsLnByb3RvdHlwZSA9IHsKICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzLmpvaW4odGhp
cy5fbGluZUJyZWFrKTsKICAgICB9LAogCisgICAgZ2V0IGxpbmVCcmVhaygpIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMuX2xpbmVCcmVhazsKKyAgICB9LAorCiAgICAgbGluZTogZnVuY3Rpb24obGlu
ZU51bWJlcikKICAgICB7CiAgICAgICAgIGlmIChsaW5lTnVtYmVyID49IHRoaXMuX2xpbmVzLmxl
bmd0aCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4
dFZpZXdlci5qcyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdl
ci5qcwppbmRleCAwMzk4ZmVmLi42MWQ2MjIyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvZnJvbnQtZW5kL1RleHRWaWV3ZXIuanMKKysrIGIvU291cmNlL1dlYkNvcmUvaW5z
cGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpzCkBAIC0yNjYsNiArMjY2LDkgQEAgV2ViSW5z
cGVjdG9yLlRleHRWaWV3ZXIucHJvdG90eXBlID0gewogICAgICAgICB0aGlzLl9zaG9ydGN1dHNb
V2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlzLkVudGVyLmNvZGUsIG1v
ZGlmaWVycy5DdHJsT3JNZXRhKV0gPSBjb21taXRFZGl0aW5nOwogICAgICAgICB0aGlzLl9zaG9y
dGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlzLkVzYy5jb2Rl
KV0gPSBjYW5jZWxFZGl0aW5nOwogCisgICAgICAgIHZhciBoYW5kbGVFbnRlcktleSA9IHRoaXMu
X21haW5QYW5lbC5oYW5kbGVFbnRlcktleS5iaW5kKHRoaXMuX21haW5QYW5lbCk7CisgICAgICAg
IHRoaXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KGtl
eXMuRW50ZXIuY29kZSwgV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLk5v
bmUpXSA9IGhhbmRsZUVudGVyS2V5OworCiAgICAgICAgIHZhciBoYW5kbGVVbmRvID0gdGhpcy5f
bWFpblBhbmVsLmhhbmRsZVVuZG9SZWRvLmJpbmQodGhpcy5fbWFpblBhbmVsLCBmYWxzZSk7CiAg
ICAgICAgIHZhciBoYW5kbGVSZWRvID0gdGhpcy5fbWFpblBhbmVsLmhhbmRsZVVuZG9SZWRvLmJp
bmQodGhpcy5fbWFpblBhbmVsLCB0cnVlKTsKICAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYklu
c3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoInoiLCBtb2RpZmllcnMuQ3RybE9yTWV0
YSldID0gaGFuZGxlVW5kbzsKQEAgLTI3OSw5ICsyODIsMTIgQEAgV2ViSW5zcGVjdG9yLlRleHRW
aWV3ZXIucHJvdG90eXBlID0gewogCiAgICAgX2hhbmRsZUtleURvd246IGZ1bmN0aW9uKGUpCiAg
ICAgeworICAgICAgICBpZiAodGhpcy5yZWFkT25seSkKKyAgICAgICAgICAgIHJldHVybjsKKwog
ICAgICAgICB2YXIgc2hvcnRjdXRLZXkgPSBXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5t
YWtlS2V5RnJvbUV2ZW50KGUpOwogICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMuX3Nob3J0Y3V0
c1tzaG9ydGN1dEtleV07Ci0gICAgICAgIGlmIChoYW5kbGVyICYmIGhhbmRsZXIuY2FsbCh0aGlz
KSkgeworICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyKCkpIHsKICAgICAgICAgICAgIGUu
cHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAg
ICAgIH0KQEAgLTEwMjEsNyArMTAyNyw3IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBh
bmVsLnByb3RvdHlwZSA9IHsKIAogICAgIGhhbmRsZVVuZG9SZWRvOiBmdW5jdGlvbihyZWRvKQog
ICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX3JlYWRPbmx5IHx8IHRoaXMuX2RpcnR5TGluZXMpCisg
ICAgICAgIGlmICh0aGlzLl9kaXJ0eUxpbmVzKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwog
CiAgICAgICAgIHRoaXMuYmVnaW5VcGRhdGVzKCk7CkBAIC0xMDQ0LDIwICsxMDUwLDE2IEBAIFdl
Ykluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVsLnByb3RvdHlwZSA9IHsKIAogICAgIGhhbmRs
ZVRhYktleVByZXNzOiBmdW5jdGlvbihzaGlmdEtleSkKICAgICB7Ci0gICAgICAgIGlmICh0aGlz
Ll9yZWFkT25seSB8fCB0aGlzLl9kaXJ0eUxpbmVzKQorICAgICAgICBpZiAodGhpcy5fZGlydHlM
aW5lcykKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICB2YXIgc2VsZWN0aW9u
ID0gdGhpcy5fZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmICghc2VsZWN0aW9uKQorICAgICAg
ICB2YXIgcmFuZ2UgPSB0aGlzLl9nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgaWYgKCFyYW5nZSkK
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB0aGlzLmJlZ2luVXBkYXRlcygp
OwogICAgICAgICB0aGlzLl9lbnRlclRleHRDaGFuZ2VNb2RlKCk7CiAKLSAgICAgICAgdmFyIHJh
bmdlID0gc2VsZWN0aW9uOwotICAgICAgICBpZiAocmFuZ2Uuc3RhcnRMaW5lID4gcmFuZ2UuZW5k
TGluZSB8fCAocmFuZ2Uuc3RhcnRMaW5lID09PSByYW5nZS5lbmRMaW5lICYmIHJhbmdlLnN0YXJ0
Q29sdW1uID4gcmFuZ2UuZW5kQ29sdW1uKSkKLSAgICAgICAgICAgIHJhbmdlID0gbmV3IFdlYklu
c3BlY3Rvci5UZXh0UmFuZ2UocmFuZ2UuZW5kTGluZSwgcmFuZ2UuZW5kQ29sdW1uLCByYW5nZS5z
dGFydExpbmUsIHJhbmdlLnN0YXJ0Q29sdW1uKTsKLQogICAgICAgICB2YXIgbmV3UmFuZ2U7CiAg
ICAgICAgIGlmIChzaGlmdEtleSkKICAgICAgICAgICAgIG5ld1JhbmdlID0gdGhpcy5fdW5pbmRl
bnRMaW5lcyhyYW5nZSk7CkBAIC0xMTMwLDYgKzExMzIsNDcgQEAgV2ViSW5zcGVjdG9yLlRleHRF
ZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogICAgICAgICByZXR1cm4gbmV3UmFuZ2U7CiAg
ICAgfSwKIAorICAgIGhhbmRsZUVudGVyS2V5OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBp
ZiAodGhpcy5fZGlydHlMaW5lcykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAg
ICB2YXIgcmFuZ2UgPSB0aGlzLl9nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgaWYgKCFyYW5nZSB8
fCByYW5nZS5lbmRDb2x1bW4gPT09IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgdmFyIGxpbmUgPSB0aGlzLl90ZXh0TW9kZWwubGluZShyYW5nZS5zdGFydExpbmUpOwor
ICAgICAgICB2YXIgbGluZVByZWZpeCA9IGxpbmUuc3Vic3RyaW5nKDAsIHJhbmdlLnN0YXJ0Q29s
dW1uKTsKKyAgICAgICAgdmFyIGluZGVudE1hdGNoID0gbGluZVByZWZpeC5tYXRjaCgvXlxzKy8p
OworICAgICAgICB2YXIgY3VycmVudEluZGVudCA9IGluZGVudE1hdGNoID8gaW5kZW50TWF0Y2hb
MF0gOiAiIjsKKworICAgICAgICB2YXIgdGV4dEVkaXRvckluZGVudCA9IFdlYkluc3BlY3Rvci5z
ZXR0aW5ncy50ZXh0RWRpdG9ySW5kZW50LmdldCgpOworICAgICAgICB2YXIgaW5kZW50ID0gV2Vi
SW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5lbmRzV2l0aEJyYWNrZXRSZWdleC50ZXN0KGxpbmVQ
cmVmaXgpID8gY3VycmVudEluZGVudCArIHRleHRFZGl0b3JJbmRlbnQgOiBjdXJyZW50SW5kZW50
OworCisgICAgICAgIGlmICghaW5kZW50KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIHRoaXMuYmVnaW5VcGRhdGVzKCk7CisgICAgICAgIHRoaXMuX2VudGVyVGV4dENoYW5n
ZU1vZGUoKTsKKworICAgICAgICB2YXIgbGluZUJyZWFrID0gdGhpcy5fdGV4dE1vZGVsLmxpbmVC
cmVhazsKKyAgICAgICAgdmFyIG5ld1JhbmdlOworICAgICAgICBpZiAocmFuZ2UuaXNFbXB0eSgp
ICYmIGxpbmUuc3Vic3RyKHJhbmdlLmVuZENvbHVtbiAtIDEsIDIpID09PSAne30nKSB7CisgICAg
ICAgICAgICBuZXdSYW5nZSA9IHRoaXMuX3NldFRleHQocmFuZ2UsIGxpbmVCcmVhayArIGluZGVu
dCArIGxpbmVCcmVhayArIGN1cnJlbnRJbmRlbnQpOworICAgICAgICAgICAgbmV3UmFuZ2UuZW5k
TGluZS0tOworICAgICAgICAgICAgbmV3UmFuZ2UuZW5kQ29sdW1uICs9IHRleHRFZGl0b3JJbmRl
bnQubGVuZ3RoOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5ld1JhbmdlID0gdGhpcy5f
c2V0VGV4dChyYW5nZSwgbGluZUJyZWFrICsgaW5kZW50KTsKKworICAgICAgICBuZXdSYW5nZS5j
b2xsYXBzZVRvRW5kKCk7CisKKyAgICAgICAgdGhpcy5fZXhpdFRleHRDaGFuZ2VNb2RlKHJhbmdl
LCBuZXdSYW5nZSk7CisgICAgICAgIHRoaXMuZW5kVXBkYXRlcygpOworICAgICAgICB0aGlzLl9y
ZXN0b3JlU2VsZWN0aW9uKG5ld1JhbmdlLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9LAorCiAgICAgX3NwbGl0Q2h1bmtPbkFMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyLCBj
aHVua051bWJlciwgY3JlYXRlU3VmZml4Q2h1bmspCiAgICAgewogICAgICAgICB2YXIgc2VsZWN0
aW9uID0gdGhpcy5fZ2V0U2VsZWN0aW9uKCk7CkBAIC0xNDEzLDE2ICsxNDU2LDEyIEBAIFdlYklu
c3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVsLnByb3RvdHlwZSA9IHsKICAgICAgICAgdmFyIHNl
bGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgaWYgKCFzZWxlY3Rpb24u
cmFuZ2VDb3VudCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB2YXIgc2VsZWN0
aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgLy8gU2VsZWN0aW9u
IG1heSBiZSBvdXRzaWRlIG9mIHRoZSB2aWV3ZXIuCi0gICAgICAgIGlmICghdGhpcy5fY29udGFp
bmVyLmlzQW5jZXN0b3Ioc2VsZWN0aW9uUmFuZ2Uuc3RhcnRDb250YWluZXIpIHx8ICF0aGlzLl9j
b250YWluZXIuaXNBbmNlc3RvcihzZWxlY3Rpb25SYW5nZS5lbmRDb250YWluZXIpKQorICAgICAg
ICBpZiAoIXRoaXMuX2NvbnRhaW5lci5pc0FuY2VzdG9yKHNlbGVjdGlvbi5hbmNob3JOb2RlKSB8
fCAhdGhpcy5fY29udGFpbmVyLmlzQW5jZXN0b3Ioc2VsZWN0aW9uLmZvY3VzTm9kZSkpCiAgICAg
ICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5fc2VsZWN0aW9u
VG9Qb3NpdGlvbihzZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uUmFuZ2Uu
c3RhcnRPZmZzZXQpOwotICAgICAgICB2YXIgZW5kID0gc2VsZWN0aW9uUmFuZ2UuY29sbGFwc2Vk
ID8gc3RhcnQgOiB0aGlzLl9zZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvblJhbmdlLmVuZENv
bnRhaW5lciwgc2VsZWN0aW9uUmFuZ2UuZW5kT2Zmc2V0KTsKLSAgICAgICAgaWYgKHNlbGVjdGlv
bi5hbmNob3JOb2RlID09PSBzZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lciAmJiBzZWxlY3Rp
b24uYW5jaG9yT2Zmc2V0ID09PSBzZWxlY3Rpb25SYW5nZS5zdGFydE9mZnNldCkKLSAgICAgICAg
ICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShzdGFydC5saW5lLCBzdGFydC5j
b2x1bW4sIGVuZC5saW5lLCBlbmQuY29sdW1uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKGVuZC5saW5lLCBlbmQuY29sdW1uLCBz
dGFydC5saW5lLCBzdGFydC5jb2x1bW4pOworICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLl9zZWxl
Y3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvbi5hbmNob3JOb2RlLCBzZWxlY3Rpb24uYW5jaG9yT2Zm
c2V0KTsKKyAgICAgICAgdmFyIGVuZCA9IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCA/IHN0YXJ0IDog
dGhpcy5fc2VsZWN0aW9uVG9Qb3NpdGlvbihzZWxlY3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24u
Zm9jdXNPZmZzZXQpOworICAgICAgICByZXR1cm4gV2ViSW5zcGVjdG9yLlRleHRSYW5nZS5jcmVh
dGVTZWxlY3Rpb24oc3RhcnQubGluZSwgc3RhcnQuY29sdW1uLCBlbmQubGluZSwgZW5kLmNvbHVt
bik7CiAgICAgfSwKIAogICAgIC8qKgpAQCAtMTQzMiw4ICsxNDcxLDggQEAgV2ViSW5zcGVjdG9y
LlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogICAgIHsKICAgICAgICAgaWYgKCFy
YW5nZSkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5fcG9z
aXRpb25Ub1NlbGVjdGlvbihyYW5nZS5zdGFydExpbmUsIHJhbmdlLnN0YXJ0Q29sdW1uKTsKLSAg
ICAgICAgdmFyIGVuZCA9IHJhbmdlLmlzRW1wdHkoKSA/IHN0YXJ0IDogdGhpcy5fcG9zaXRpb25U
b1NlbGVjdGlvbihyYW5nZS5lbmRMaW5lLCByYW5nZS5lbmRDb2x1bW4pOworICAgICAgICB2YXIg
c3RhcnQgPSB0aGlzLl9wb3NpdGlvblRvU2VsZWN0aW9uKHJhbmdlLmFuY2hvckxpbmUsIHJhbmdl
LmFuY2hvckNvbHVtbik7CisgICAgICAgIHZhciBlbmQgPSByYW5nZS5pc0VtcHR5KCkgPyBzdGFy
dCA6IHRoaXMuX3Bvc2l0aW9uVG9TZWxlY3Rpb24ocmFuZ2UuZm9jdXNMaW5lLCByYW5nZS5mb2N1
c0NvbHVtbik7CiAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50
KHN0YXJ0LmNvbnRhaW5lciwgc3RhcnQub2Zmc2V0LCBlbmQuY29udGFpbmVyLCBlbmQub2Zmc2V0
KTsKIAogICAgICAgICBpZiAoc2Nyb2xsSW50b1ZpZXcpIHsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>115789</attachid>
            <date>2011-11-18 05:36:54 -0800</date>
            <delta_ts>2011-11-29 13:09:56 -0800</delta_ts>
            <desc>Add normalize method</desc>
            <filename>preserve_indent.patch</filename>
            <type>text/plain</type>
            <size>8554</size>
            <attacher name="Nikita Vasilyev">me</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAwNTNkMTdmLi4zNGMwMWEyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEg
QEAKKzIwMTEtMTEtMTggIE5pa2l0YSBWYXNpbHlldiAgPG1lQGVsdjFzLnJ1PgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IFByZXNlcnZlIGFuIGluZGVudGF0aW9uIGxldmVsIHdoZW4gaW5zZXJ0
aW5nIGEgbmV3IGxpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNjI1CisKKyAgICAgICAgSW5kZW50IG9uZSBsZXZlbCBtb3JlIHdoZW4gYSBsaW5l
IGVuZHMgd2l0aCBlaXRoZXIgInsiLCAiWyIgb3IgIigiLgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRp
dG9yTW9kZWwuanM6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZS5j
b2xsYXBzZVRvRW5kKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBl
Lm5vcm1hbGl6ZSk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpz
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRWaWV3ZXIucHJvdG90eXBlLl9yZWdpc3RlclNo
b3J0Y3V0cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFZpZXdlci5wcm90b3R5cGUuX2hh
bmRsZUtleURvd24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwu
cHJvdG90eXBlLmhhbmRsZUVudGVyS2V5KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRp
dG9yTWFpblBhbmVsLnByb3RvdHlwZS5fZ2V0U2VsZWN0aW9uKToKKwogMjAxMS0xMS0xOCAgQWRh
bSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJlbW92ZSB1bm5lZWRlZCBp
bmNsdWRlIChhbmQgaWZkZWYpIGZyb20gVjhET01XaW5kb3dDdXN0b20uY3BwCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCmlu
ZGV4IGI5ODBiZGIuLmE0OWI5MTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCkBAIC01MCw2ICs1MCwyNiBAQCBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZSA9IHsKICAgICAgICAgcmV0dXJuIHRoaXMuZW5k
TGluZSAtIHRoaXMuc3RhcnRMaW5lOwogICAgIH0sCiAKKyAgICBjb2xsYXBzZVRvRW5kOiBmdW5j
dGlvbigpCisgICAgeworICAgICAgICB0aGlzLnN0YXJ0TGluZSA9IHRoaXMuZW5kTGluZTsKKyAg
ICAgICAgdGhpcy5zdGFydENvbHVtbiA9IHRoaXMuZW5kQ29sdW1uOworICAgIH0sCisKKyAgICBu
b3JtYWxpemU6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLnN0YXJ0TGluZSA+
IHRoaXMuZW5kTGluZSkgeworICAgICAgICAgICAgdmFyIHN0YXJ0TGluZSA9IHRoaXMuc3RhcnRM
aW5lOworICAgICAgICAgICAgdGhpcy5zdGFydExpbmUgPSB0aGlzLmVuZExpbmU7CisgICAgICAg
ICAgICB0aGlzLmVuZExpbmUgPSBzdGFydExpbmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRo
aXMuc3RhcnRMaW5lID4gdGhpcy5lbmRMaW5lIHx8IHRoaXMuc3RhcnRMaW5lID09PSB0aGlzLmVu
ZExpbmUgJiYgdGhpcy5zdGFydENvbHVtbiA+IHRoaXMuZW5kQ29sdW1uKSB7CisgICAgICAgICAg
ICB2YXIgc3RhcnRDb2x1bW4gPSB0aGlzLnN0YXJ0Q29sdW1uOworICAgICAgICAgICAgdGhpcy5z
dGFydENvbHVtbiA9IHRoaXMuZW5kQ29sdW1uOworICAgICAgICAgICAgdGhpcy5lbmRDb2x1bW4g
PSBzdGFydENvbHVtbjsKKyAgICAgICAgfQorICAgIH0sCisKICAgICBjbG9uZTogZnVuY3Rpb24o
KQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHRoaXMu
c3RhcnRMaW5lLCB0aGlzLnN0YXJ0Q29sdW1uLCB0aGlzLmVuZExpbmUsIHRoaXMuZW5kQ29sdW1u
KTsKQEAgLTc1LDYgKzk1LDggQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5JbmRlbnQg
PSB7CiAgICAgVGFiQ2hhcmFjdGVyOiAiXHQiCiB9CiAKK1dlYkluc3BlY3Rvci5UZXh0RWRpdG9y
TW9kZWwuZW5kc1dpdGhCcmFja2V0UmVnZXggPSAvW3soXFtdXHMqJC87CisKIFdlYkluc3BlY3Rv
ci5UZXh0RWRpdG9yTW9kZWwucHJvdG90eXBlID0gewogICAgIHNldCBjaGFuZ2VMaXN0ZW5lcihj
aGFuZ2VMaXN0ZW5lcikKICAgICB7CkBAIC05MSw2ICsxMTMsMTAgQEAgV2ViSW5zcGVjdG9yLlRl
eHRFZGl0b3JNb2RlbC5wcm90b3R5cGUgPSB7CiAgICAgICAgIHJldHVybiB0aGlzLl9saW5lcy5q
b2luKHRoaXMuX2xpbmVCcmVhayk7CiAgICAgfSwKIAorICAgIGdldCBsaW5lQnJlYWsoKSB7Cisg
ICAgICAgIHJldHVybiB0aGlzLl9saW5lQnJlYWs7CisgICAgfSwKKwogICAgIGxpbmU6IGZ1bmN0
aW9uKGxpbmVOdW1iZXIpCiAgICAgewogICAgICAgICBpZiAobGluZU51bWJlciA+PSB0aGlzLl9s
aW5lcy5sZW5ndGgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQt
ZW5kL1RleHRWaWV3ZXIuanMgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1Rl
eHRWaWV3ZXIuanMKaW5kZXggMDM5OGZlZi4uMzA0ZTFkOSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpzCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qcwpAQCAtMjY2LDYgKzI2Niw5IEBA
IFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZSA9IHsKICAgICAgICAgdGhpcy5fc2hv
cnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoa2V5cy5FbnRlci5j
b2RlLCBtb2RpZmllcnMuQ3RybE9yTWV0YSldID0gY29tbWl0RWRpdGluZzsKICAgICAgICAgdGhp
cy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoa2V5cy5F
c2MuY29kZSldID0gY2FuY2VsRWRpdGluZzsKIAorICAgICAgICB2YXIgaGFuZGxlRW50ZXJLZXkg
PSB0aGlzLl9tYWluUGFuZWwuaGFuZGxlRW50ZXJLZXkuYmluZCh0aGlzLl9tYWluUGFuZWwpOwor
ICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFr
ZUtleShrZXlzLkVudGVyLmNvZGUsIFdlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lk1vZGlm
aWVycy5Ob25lKV0gPSBoYW5kbGVFbnRlcktleTsKKwogICAgICAgICB2YXIgaGFuZGxlVW5kbyA9
IHRoaXMuX21haW5QYW5lbC5oYW5kbGVVbmRvUmVkby5iaW5kKHRoaXMuX21haW5QYW5lbCwgZmFs
c2UpOwogICAgICAgICB2YXIgaGFuZGxlUmVkbyA9IHRoaXMuX21haW5QYW5lbC5oYW5kbGVVbmRv
UmVkby5iaW5kKHRoaXMuX21haW5QYW5lbCwgdHJ1ZSk7CiAgICAgICAgIHRoaXMuX3Nob3J0Y3V0
c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KCJ6IiwgbW9kaWZpZXJzLkN0
cmxPck1ldGEpXSA9IGhhbmRsZVVuZG87CkBAIC0yNzksOSArMjgyLDEyIEBAIFdlYkluc3BlY3Rv
ci5UZXh0Vmlld2VyLnByb3RvdHlwZSA9IHsKIAogICAgIF9oYW5kbGVLZXlEb3duOiBmdW5jdGlv
bihlKQogICAgIHsKKyAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpCisgICAgICAgICAgICByZXR1
cm47CisKICAgICAgICAgdmFyIHNob3J0Y3V0S2V5ID0gV2ViSW5zcGVjdG9yLktleWJvYXJkU2hv
cnRjdXQubWFrZUtleUZyb21FdmVudChlKTsKICAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLl9z
aG9ydGN1dHNbc2hvcnRjdXRLZXldOwotICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyLmNh
bGwodGhpcykpIHsKKyAgICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlcigpKSB7CiAgICAgICAg
ICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigp
OwogICAgICAgICB9CkBAIC0xMDIxLDcgKzEwMjcsNyBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRv
ck1haW5QYW5lbC5wcm90b3R5cGUgPSB7CiAKICAgICBoYW5kbGVVbmRvUmVkbzogZnVuY3Rpb24o
cmVkbykKICAgICB7Ci0gICAgICAgIGlmICh0aGlzLl9yZWFkT25seSB8fCB0aGlzLl9kaXJ0eUxp
bmVzKQorICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcykKICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKIAogICAgICAgICB0aGlzLmJlZ2luVXBkYXRlcygpOwpAQCAtMTA0NCwyMCArMTA1MCwx
OCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5cGUgPSB7CiAKICAg
ICBoYW5kbGVUYWJLZXlQcmVzczogZnVuY3Rpb24oc2hpZnRLZXkpCiAgICAgewotICAgICAgICBp
ZiAodGhpcy5fcmVhZE9ubHkgfHwgdGhpcy5fZGlydHlMaW5lcykKKyAgICAgICAgaWYgKHRoaXMu
X2RpcnR5TGluZXMpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgdmFyIHNl
bGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoIXNlbGVjdGlvbikK
KyAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5fZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmICgh
cmFuZ2UpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKKyAgICAgICAgcmFuZ2Uubm9ybWFs
aXplKCk7CisKICAgICAgICAgdGhpcy5iZWdpblVwZGF0ZXMoKTsKICAgICAgICAgdGhpcy5fZW50
ZXJUZXh0Q2hhbmdlTW9kZSgpOwogCi0gICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbjsKLSAg
ICAgICAgaWYgKHJhbmdlLnN0YXJ0TGluZSA+IHJhbmdlLmVuZExpbmUgfHwgKHJhbmdlLnN0YXJ0
TGluZSA9PT0gcmFuZ2UuZW5kTGluZSAmJiByYW5nZS5zdGFydENvbHVtbiA+IHJhbmdlLmVuZENv
bHVtbikpCi0gICAgICAgICAgICByYW5nZSA9IG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHJh
bmdlLmVuZExpbmUsIHJhbmdlLmVuZENvbHVtbiwgcmFuZ2Uuc3RhcnRMaW5lLCByYW5nZS5zdGFy
dENvbHVtbik7Ci0KICAgICAgICAgdmFyIG5ld1JhbmdlOwogICAgICAgICBpZiAoc2hpZnRLZXkp
CiAgICAgICAgICAgICBuZXdSYW5nZSA9IHRoaXMuX3VuaW5kZW50TGluZXMocmFuZ2UpOwpAQCAt
MTEzMCw2ICsxMTM0LDUyIEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVsLnByb3Rv
dHlwZSA9IHsKICAgICAgICAgcmV0dXJuIG5ld1JhbmdlOwogICAgIH0sCiAKKyAgICBoYW5kbGVF
bnRlcktleTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2RpcnR5TGluZXMp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5f
Z2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmICghcmFuZ2UpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgcmFuZ2Uubm9ybWFsaXplKCk7CisKKyAgICAgICAgaWYgKHJhbmdl
LmVuZENvbHVtbiA9PT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB2
YXIgbGluZSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKHJhbmdlLnN0YXJ0TGluZSk7CisgICAgICAg
IHZhciBsaW5lUHJlZml4ID0gbGluZS5zdWJzdHJpbmcoMCwgcmFuZ2Uuc3RhcnRDb2x1bW4pOwor
ICAgICAgICB2YXIgaW5kZW50TWF0Y2ggPSBsaW5lUHJlZml4Lm1hdGNoKC9eXHMrLyk7CisgICAg
ICAgIHZhciBjdXJyZW50SW5kZW50ID0gaW5kZW50TWF0Y2ggPyBpbmRlbnRNYXRjaFswXSA6ICIi
OworCisgICAgICAgIHZhciB0ZXh0RWRpdG9ySW5kZW50ID0gV2ViSW5zcGVjdG9yLnNldHRpbmdz
LnRleHRFZGl0b3JJbmRlbnQuZ2V0KCk7CisgICAgICAgIHZhciBpbmRlbnQgPSBXZWJJbnNwZWN0
b3IuVGV4dEVkaXRvck1vZGVsLmVuZHNXaXRoQnJhY2tldFJlZ2V4LnRlc3QobGluZVByZWZpeCkg
PyBjdXJyZW50SW5kZW50ICsgdGV4dEVkaXRvckluZGVudCA6IGN1cnJlbnRJbmRlbnQ7CisKKyAg
ICAgICAgaWYgKCFpbmRlbnQpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
dGhpcy5iZWdpblVwZGF0ZXMoKTsKKyAgICAgICAgdGhpcy5fZW50ZXJUZXh0Q2hhbmdlTW9kZSgp
OworCisgICAgICAgIHZhciBsaW5lQnJlYWsgPSB0aGlzLl90ZXh0TW9kZWwubGluZUJyZWFrOwor
ICAgICAgICB2YXIgbmV3UmFuZ2U7CisgICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkgJiYgbGlu
ZS5zdWJzdHIocmFuZ2UuZW5kQ29sdW1uIC0gMSwgMikgPT09ICd7fScpIHsKKyAgICAgICAgICAg
IG5ld1JhbmdlID0gdGhpcy5fc2V0VGV4dChyYW5nZSwgbGluZUJyZWFrICsgaW5kZW50ICsgbGlu
ZUJyZWFrICsgY3VycmVudEluZGVudCk7CisgICAgICAgICAgICBuZXdSYW5nZS5lbmRMaW5lLS07
CisgICAgICAgICAgICBuZXdSYW5nZS5lbmRDb2x1bW4gKz0gdGV4dEVkaXRvckluZGVudC5sZW5n
dGg7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlzLl9zZXRUZXh0
KHJhbmdlLCBsaW5lQnJlYWsgKyBpbmRlbnQpOworCisgICAgICAgIG5ld1JhbmdlLmNvbGxhcHNl
VG9FbmQoKTsKKworICAgICAgICB0aGlzLl9leGl0VGV4dENoYW5nZU1vZGUocmFuZ2UsIG5ld1Jh
bmdlKTsKKyAgICAgICAgdGhpcy5lbmRVcGRhdGVzKCk7CisgICAgICAgIHRoaXMuX3Jlc3RvcmVT
ZWxlY3Rpb24obmV3UmFuZ2UsIHRydWUpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0s
CisKICAgICBfc3BsaXRDaHVua09uQUxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIGNodW5rTnVt
YmVyLCBjcmVhdGVTdWZmaXhDaHVuaykKICAgICB7CiAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0
aGlzLl9nZXRTZWxlY3Rpb24oKTsKQEAgLTE0MTMsMTYgKzE0NjMsMTIgQEAgV2ViSW5zcGVjdG9y
LlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0gewogICAgICAgICB2YXIgc2VsZWN0aW9u
ID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNv
dW50KQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHZhciBzZWxlY3Rpb25SYW5n
ZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgICAvLyBTZWxlY3Rpb24gbWF5IGJl
IG91dHNpZGUgb2YgdGhlIHZpZXdlci4KLSAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIuaXNB
bmNlc3RvcihzZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lcikgfHwgIXRoaXMuX2NvbnRhaW5l
ci5pc0FuY2VzdG9yKHNlbGVjdGlvblJhbmdlLmVuZENvbnRhaW5lcikpCisgICAgICAgIGlmICgh
dGhpcy5fY29udGFpbmVyLmlzQW5jZXN0b3Ioc2VsZWN0aW9uLmFuY2hvck5vZGUpIHx8ICF0aGlz
Ll9jb250YWluZXIuaXNBbmNlc3RvcihzZWxlY3Rpb24uZm9jdXNOb2RlKSkKICAgICAgICAgICAg
IHJldHVybiBudWxsOwotICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLl9zZWxlY3Rpb25Ub1Bvc2l0
aW9uKHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25SYW5nZS5zdGFydE9m
ZnNldCk7Ci0gICAgICAgIHZhciBlbmQgPSBzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZWQgPyBzdGFy
dCA6IHRoaXMuX3NlbGVjdGlvblRvUG9zaXRpb24oc2VsZWN0aW9uUmFuZ2UuZW5kQ29udGFpbmVy
LCBzZWxlY3Rpb25SYW5nZS5lbmRPZmZzZXQpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmFuY2hv
ck5vZGUgPT09IHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyICYmIHNlbGVjdGlvbi5hbmNo
b3JPZmZzZXQgPT09IHNlbGVjdGlvblJhbmdlLnN0YXJ0T2Zmc2V0KQotICAgICAgICAgICAgcmV0
dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHN0YXJ0LmxpbmUsIHN0YXJ0LmNvbHVtbiwg
ZW5kLmxpbmUsIGVuZC5jb2x1bW4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4g
bmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UoZW5kLmxpbmUsIGVuZC5jb2x1bW4sIHN0YXJ0Lmxp
bmUsIHN0YXJ0LmNvbHVtbik7CisgICAgICAgIHZhciBzdGFydCA9IHRoaXMuX3NlbGVjdGlvblRv
UG9zaXRpb24oc2VsZWN0aW9uLmFuY2hvck5vZGUsIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQpOwor
ICAgICAgICB2YXIgZW5kID0gc2VsZWN0aW9uLmlzQ29sbGFwc2VkID8gc3RhcnQgOiB0aGlzLl9z
ZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvbi5mb2N1c05vZGUsIHNlbGVjdGlvbi5mb2N1c09m
ZnNldCk7CisgICAgICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShzdGFydC5s
aW5lLCBzdGFydC5jb2x1bW4sIGVuZC5saW5lLCBlbmQuY29sdW1uKTsKICAgICB9LAogCiAgICAg
LyoqCg==
</data>
<flag name="review"
          id="114794"
          type_id="1"
          status="-"
          setter="pfeldman"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117028</attachid>
            <date>2011-11-29 13:09:56 -0800</date>
            <delta_ts>2011-11-30 02:19:42 -0800</delta_ts>
            <desc>Immutable TextRange</desc>
            <filename>preserve_indent.patch</filename>
            <type>text/plain</type>
            <size>8546</size>
            <attacher name="Nikita Vasilyev">me</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAwNTNkMTdmLi4zNGMwMWEyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEg
QEAKKzIwMTEtMTEtMTggIE5pa2l0YSBWYXNpbHlldiAgPG1lQGVsdjFzLnJ1PgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IFByZXNlcnZlIGFuIGluZGVudGF0aW9uIGxldmVsIHdoZW4gaW5zZXJ0
aW5nIGEgbmV3IGxpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNjI1CisKKyAgICAgICAgSW5kZW50IG9uZSBsZXZlbCBtb3JlIHdoZW4gYSBsaW5l
IGVuZHMgd2l0aCBlaXRoZXIgInsiLCAiWyIgb3IgIigiLgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRp
dG9yTW9kZWwuanM6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZS5j
b2xsYXBzZVRvRW5kKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBl
Lm5vcm1hbGl6ZSk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpz
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRWaWV3ZXIucHJvdG90eXBlLl9yZWdpc3RlclNo
b3J0Y3V0cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFZpZXdlci5wcm90b3R5cGUuX2hh
bmRsZUtleURvd24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwu
cHJvdG90eXBlLmhhbmRsZUVudGVyS2V5KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRp
dG9yTWFpblBhbmVsLnByb3RvdHlwZS5fZ2V0U2VsZWN0aW9uKToKKwogMjAxMS0xMS0xOCAgQWRh
bSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJlbW92ZSB1bm5lZWRlZCBp
bmNsdWRlIChhbmQgaWZkZWYpIGZyb20gVjhET01XaW5kb3dDdXN0b20uY3BwCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCmlu
ZGV4IGI5ODBiZGIuLmY0N2ZmMzggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCkBAIC01MCw2ICs1MCwxOSBAQCBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZSA9IHsKICAgICAgICAgcmV0dXJuIHRoaXMuZW5k
TGluZSAtIHRoaXMuc3RhcnRMaW5lOwogICAgIH0sCiAKKyAgICBjb2xsYXBzZVRvRW5kOiBmdW5j
dGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uo
dGhpcy5lbmRMaW5lLCB0aGlzLmVuZENvbHVtbiwgdGhpcy5lbmRMaW5lLCB0aGlzLmVuZENvbHVt
bik7CisgICAgfSwKKworICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAg
aWYgKHRoaXMuc3RhcnRMaW5lID4gdGhpcy5lbmRMaW5lIHx8ICh0aGlzLnN0YXJ0TGluZSA9PT0g
dGhpcy5lbmRMaW5lICYmIHRoaXMuc3RhcnRDb2x1bW4gPiB0aGlzLmVuZENvbHVtbikpCisgICAg
ICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UodGhpcy5lbmRMaW5lLCB0
aGlzLmVuZENvbHVtbiwgdGhpcy5zdGFydExpbmUsIHRoaXMuc3RhcnRDb2x1bW4pOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UodGhp
cy5zdGFydExpbmUsIHRoaXMuc3RhcnRDb2x1bW4sIHRoaXMuZW5kTGluZSwgdGhpcy5lbmRDb2x1
bW4pOworICAgIH0sCisKICAgICBjbG9uZTogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgcmV0
dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLCB0aGlzLnN0YXJ0
Q29sdW1uLCB0aGlzLmVuZExpbmUsIHRoaXMuZW5kQ29sdW1uKTsKQEAgLTc1LDYgKzg4LDggQEAg
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5JbmRlbnQgPSB7CiAgICAgVGFiQ2hhcmFjdGVy
OiAiXHQiCiB9CiAKK1dlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwuZW5kc1dpdGhCcmFja2V0
UmVnZXggPSAvW3soXFtdXHMqJC87CisKIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwucHJv
dG90eXBlID0gewogICAgIHNldCBjaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikKICAgICB7
CkBAIC05MSw2ICsxMDYsMTEgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNb2RlbC5wcm90b3R5
cGUgPSB7CiAgICAgICAgIHJldHVybiB0aGlzLl9saW5lcy5qb2luKHRoaXMuX2xpbmVCcmVhayk7
CiAgICAgfSwKIAorICAgIGdldCBsaW5lQnJlYWsoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMuX2xpbmVCcmVhazsKKyAgICB9LAorCiAgICAgbGluZTogZnVuY3Rpb24obGluZU51bWJlcikK
ICAgICB7CiAgICAgICAgIGlmIChsaW5lTnVtYmVyID49IHRoaXMuX2xpbmVzLmxlbmd0aCkKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5q
cyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qcwppbmRl
eCAwMzk4ZmVmLi4wNjZiZjhlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL1RleHRWaWV3ZXIuanMKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zy
b250LWVuZC9UZXh0Vmlld2VyLmpzCkBAIC0yNjYsNiArMjY2LDkgQEAgV2ViSW5zcGVjdG9yLlRl
eHRWaWV3ZXIucHJvdG90eXBlID0gewogICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVj
dG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlzLkVudGVyLmNvZGUsIG1vZGlmaWVycy5D
dHJsT3JNZXRhKV0gPSBjb21taXRFZGl0aW5nOwogICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2Vi
SW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQubWFrZUtleShrZXlzLkVzYy5jb2RlKV0gPSBjYW5j
ZWxFZGl0aW5nOwogCisgICAgICAgIHZhciBoYW5kbGVFbnRlcktleSA9IHRoaXMuX21haW5QYW5l
bC5oYW5kbGVFbnRlcktleS5iaW5kKHRoaXMuX21haW5QYW5lbCk7CisgICAgICAgIHRoaXMuX3No
b3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KGtleXMuRW50ZXIu
Y29kZSwgV2ViSW5zcGVjdG9yLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLk5vbmUpXSA9IGhh
bmRsZUVudGVyS2V5OworCiAgICAgICAgIHZhciBoYW5kbGVVbmRvID0gdGhpcy5fbWFpblBhbmVs
LmhhbmRsZVVuZG9SZWRvLmJpbmQodGhpcy5fbWFpblBhbmVsLCBmYWxzZSk7CiAgICAgICAgIHZh
ciBoYW5kbGVSZWRvID0gdGhpcy5fbWFpblBhbmVsLmhhbmRsZVVuZG9SZWRvLmJpbmQodGhpcy5f
bWFpblBhbmVsLCB0cnVlKTsKICAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5L
ZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoInoiLCBtb2RpZmllcnMuQ3RybE9yTWV0YSldID0gaGFu
ZGxlVW5kbzsKQEAgLTI3OSw5ICsyODIsMTIgQEAgV2ViSW5zcGVjdG9yLlRleHRWaWV3ZXIucHJv
dG90eXBlID0gewogCiAgICAgX2hhbmRsZUtleURvd246IGZ1bmN0aW9uKGUpCiAgICAgeworICAg
ICAgICBpZiAodGhpcy5yZWFkT25seSkKKyAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICB2
YXIgc2hvcnRjdXRLZXkgPSBXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5RnJv
bUV2ZW50KGUpOwogICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMuX3Nob3J0Y3V0c1tzaG9ydGN1
dEtleV07Ci0gICAgICAgIGlmIChoYW5kbGVyICYmIGhhbmRsZXIuY2FsbCh0aGlzKSkgeworICAg
ICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyKCkpIHsKICAgICAgICAgICAgIGUucHJldmVudERl
ZmF1bHQoKTsKICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgIH0KQEAg
LTEwMjEsNyArMTAyNyw3IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTWFpblBhbmVsLnByb3Rv
dHlwZSA9IHsKIAogICAgIGhhbmRsZVVuZG9SZWRvOiBmdW5jdGlvbihyZWRvKQogICAgIHsKLSAg
ICAgICAgaWYgKHRoaXMuX3JlYWRPbmx5IHx8IHRoaXMuX2RpcnR5TGluZXMpCisgICAgICAgIGlm
ICh0aGlzLl9kaXJ0eUxpbmVzKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAg
IHRoaXMuYmVnaW5VcGRhdGVzKCk7CkBAIC0xMDQ0LDIwICsxMDUwLDE4IEBAIFdlYkluc3BlY3Rv
ci5UZXh0RWRpdG9yTWFpblBhbmVsLnByb3RvdHlwZSA9IHsKIAogICAgIGhhbmRsZVRhYktleVBy
ZXNzOiBmdW5jdGlvbihzaGlmdEtleSkKICAgICB7Ci0gICAgICAgIGlmICh0aGlzLl9yZWFkT25s
eSB8fCB0aGlzLl9kaXJ0eUxpbmVzKQorICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcykKICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5f
Z2V0U2VsZWN0aW9uKCk7CiAgICAgICAgIGlmICghc2VsZWN0aW9uKQogICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCisgICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5ub3JtYWxpemUoKTsK
KwogICAgICAgICB0aGlzLmJlZ2luVXBkYXRlcygpOwogICAgICAgICB0aGlzLl9lbnRlclRleHRD
aGFuZ2VNb2RlKCk7CiAKLSAgICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uOwotICAgICAgICBp
ZiAocmFuZ2Uuc3RhcnRMaW5lID4gcmFuZ2UuZW5kTGluZSB8fCAocmFuZ2Uuc3RhcnRMaW5lID09
PSByYW5nZS5lbmRMaW5lICYmIHJhbmdlLnN0YXJ0Q29sdW1uID4gcmFuZ2UuZW5kQ29sdW1uKSkK
LSAgICAgICAgICAgIHJhbmdlID0gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UocmFuZ2UuZW5k
TGluZSwgcmFuZ2UuZW5kQ29sdW1uLCByYW5nZS5zdGFydExpbmUsIHJhbmdlLnN0YXJ0Q29sdW1u
KTsKLQogICAgICAgICB2YXIgbmV3UmFuZ2U7CiAgICAgICAgIGlmIChzaGlmdEtleSkKICAgICAg
ICAgICAgIG5ld1JhbmdlID0gdGhpcy5fdW5pbmRlbnRMaW5lcyhyYW5nZSk7CkBAIC0xMTMwLDYg
KzExMzQsNTcgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwucHJvdG90eXBlID0g
ewogICAgICAgICByZXR1cm4gbmV3UmFuZ2U7CiAgICAgfSwKIAorICAgIGhhbmRsZUVudGVyS2V5
OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcykKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLl9nZXRTZWxl
Y3Rpb24oKTsKKyAgICAgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICByYW5nZS5ub3JtYWxpemUoKTsKKworICAgICAgICBpZiAocmFuZ2UuZW5kQ29s
dW1uID09PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHZhciBsaW5l
ID0gdGhpcy5fdGV4dE1vZGVsLmxpbmUocmFuZ2Uuc3RhcnRMaW5lKTsKKyAgICAgICAgdmFyIGxp
bmVQcmVmaXggPSBsaW5lLnN1YnN0cmluZygwLCByYW5nZS5zdGFydENvbHVtbik7CisgICAgICAg
IHZhciBpbmRlbnRNYXRjaCA9IGxpbmVQcmVmaXgubWF0Y2goL15ccysvKTsKKyAgICAgICAgdmFy
IGN1cnJlbnRJbmRlbnQgPSBpbmRlbnRNYXRjaCA/IGluZGVudE1hdGNoWzBdIDogIiI7CisKKyAg
ICAgICAgdmFyIHRleHRFZGl0b3JJbmRlbnQgPSBXZWJJbnNwZWN0b3Iuc2V0dGluZ3MudGV4dEVk
aXRvckluZGVudC5nZXQoKTsKKyAgICAgICAgdmFyIGluZGVudCA9IFdlYkluc3BlY3Rvci5UZXh0
RWRpdG9yTW9kZWwuZW5kc1dpdGhCcmFja2V0UmVnZXgudGVzdChsaW5lUHJlZml4KSA/IGN1cnJl
bnRJbmRlbnQgKyB0ZXh0RWRpdG9ySW5kZW50IDogY3VycmVudEluZGVudDsKKworICAgICAgICBp
ZiAoIWluZGVudCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0aGlzLmJl
Z2luVXBkYXRlcygpOworICAgICAgICB0aGlzLl9lbnRlclRleHRDaGFuZ2VNb2RlKCk7CisKKyAg
ICAgICAgdmFyIGxpbmVCcmVhayA9IHRoaXMuX3RleHRNb2RlbC5saW5lQnJlYWs7CisgICAgICAg
IHZhciBuZXdSYW5nZTsKKyAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSAmJiBsaW5lLnN1YnN0
cihyYW5nZS5lbmRDb2x1bW4gLSAxLCAyKSA9PT0gJ3t9JykgeworICAgICAgICAgICAgLy8ge3x9
CisgICAgICAgICAgICAvLyBiZWNvbWVzCisgICAgICAgICAgICAvLyB7CisgICAgICAgICAgICAv
LyAgICAgfAorICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlzLl9z
ZXRUZXh0KHJhbmdlLCBsaW5lQnJlYWsgKyBpbmRlbnQgKyBsaW5lQnJlYWsgKyBjdXJyZW50SW5k
ZW50KTsKKyAgICAgICAgICAgIG5ld1JhbmdlLmVuZExpbmUtLTsKKyAgICAgICAgICAgIG5ld1Jh
bmdlLmVuZENvbHVtbiArPSB0ZXh0RWRpdG9ySW5kZW50Lmxlbmd0aDsKKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICBuZXdSYW5nZSA9IHRoaXMuX3NldFRleHQocmFuZ2UsIGxpbmVCcmVhayAr
IGluZGVudCk7CisKKyAgICAgICAgbmV3UmFuZ2UgPSBuZXdSYW5nZS5jb2xsYXBzZVRvRW5kKCk7
CisKKyAgICAgICAgdGhpcy5fZXhpdFRleHRDaGFuZ2VNb2RlKHJhbmdlLCBuZXdSYW5nZSk7Cisg
ICAgICAgIHRoaXMuZW5kVXBkYXRlcygpOworICAgICAgICB0aGlzLl9yZXN0b3JlU2VsZWN0aW9u
KG5ld1JhbmdlLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCiAgICAg
X3NwbGl0Q2h1bmtPbkFMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyLCBjaHVua051bWJlciwgY3Jl
YXRlU3VmZml4Q2h1bmspCiAgICAgewogICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5fZ2V0
U2VsZWN0aW9uKCk7CkBAIC0xNDEzLDE2ICsxNDY4LDEyIEBAIFdlYkluc3BlY3Rvci5UZXh0RWRp
dG9yTWFpblBhbmVsLnByb3RvdHlwZSA9IHsKICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRv
dy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkKICAg
ICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB2YXIgc2VsZWN0aW9uUmFuZ2UgPSBzZWxl
Y3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgLy8gU2VsZWN0aW9uIG1heSBiZSBvdXRzaWRl
IG9mIHRoZSB2aWV3ZXIuCi0gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyLmlzQW5jZXN0b3Io
c2VsZWN0aW9uUmFuZ2Uuc3RhcnRDb250YWluZXIpIHx8ICF0aGlzLl9jb250YWluZXIuaXNBbmNl
c3RvcihzZWxlY3Rpb25SYW5nZS5lbmRDb250YWluZXIpKQorICAgICAgICBpZiAoIXRoaXMuX2Nv
bnRhaW5lci5pc0FuY2VzdG9yKHNlbGVjdGlvbi5hbmNob3JOb2RlKSB8fCAhdGhpcy5fY29udGFp
bmVyLmlzQW5jZXN0b3Ioc2VsZWN0aW9uLmZvY3VzTm9kZSkpCiAgICAgICAgICAgICByZXR1cm4g
bnVsbDsKLSAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5fc2VsZWN0aW9uVG9Qb3NpdGlvbihzZWxl
Y3Rpb25SYW5nZS5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQpOwot
ICAgICAgICB2YXIgZW5kID0gc2VsZWN0aW9uUmFuZ2UuY29sbGFwc2VkID8gc3RhcnQgOiB0aGlz
Ll9zZWxlY3Rpb25Ub1Bvc2l0aW9uKHNlbGVjdGlvblJhbmdlLmVuZENvbnRhaW5lciwgc2VsZWN0
aW9uUmFuZ2UuZW5kT2Zmc2V0KTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbi5hbmNob3JOb2RlID09
PSBzZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lciAmJiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0
ID09PSBzZWxlY3Rpb25SYW5nZS5zdGFydE9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBuZXcg
V2ViSW5zcGVjdG9yLlRleHRSYW5nZShzdGFydC5saW5lLCBzdGFydC5jb2x1bW4sIGVuZC5saW5l
LCBlbmQuY29sdW1uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlKGVuZC5saW5lLCBlbmQuY29sdW1uLCBzdGFydC5saW5lLCBzdGFy
dC5jb2x1bW4pOworICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLl9zZWxlY3Rpb25Ub1Bvc2l0aW9u
KHNlbGVjdGlvbi5hbmNob3JOb2RlLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0KTsKKyAgICAgICAg
dmFyIGVuZCA9IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCA/IHN0YXJ0IDogdGhpcy5fc2VsZWN0aW9u
VG9Qb3NpdGlvbihzZWxlY3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24uZm9jdXNPZmZzZXQpOwor
ICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uoc3RhcnQubGluZSwgc3Rh
cnQuY29sdW1uLCBlbmQubGluZSwgZW5kLmNvbHVtbik7CiAgICAgfSwKIAogICAgIC8qKgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117149</attachid>
            <date>2011-11-30 02:19:42 -0800</date>
            <delta_ts>2011-11-30 07:18:53 -0800</delta_ts>
            <desc>Simplify normalize</desc>
            <filename>preserve_indent.patch</filename>
            <type>text/plain</type>
            <size>8460</size>
            <attacher name="Nikita Vasilyev">me</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAwNTNkMTdmLi4zNGMwMWEyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEg
QEAKKzIwMTEtMTEtMTggIE5pa2l0YSBWYXNpbHlldiAgPG1lQGVsdjFzLnJ1PgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IFByZXNlcnZlIGFuIGluZGVudGF0aW9uIGxldmVsIHdoZW4gaW5zZXJ0
aW5nIGEgbmV3IGxpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNjI1CisKKyAgICAgICAgSW5kZW50IG9uZSBsZXZlbCBtb3JlIHdoZW4gYSBsaW5l
IGVuZHMgd2l0aCBlaXRoZXIgInsiLCAiWyIgb3IgIigiLgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0RWRp
dG9yTW9kZWwuanM6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZS5j
b2xsYXBzZVRvRW5kKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UucHJvdG90eXBl
Lm5vcm1hbGl6ZSk6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpz
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRWaWV3ZXIucHJvdG90eXBlLl9yZWdpc3RlclNo
b3J0Y3V0cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dFZpZXdlci5wcm90b3R5cGUuX2hh
bmRsZUtleURvd24pOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3JNYWluUGFuZWwu
cHJvdG90eXBlLmhhbmRsZUVudGVyS2V5KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRp
dG9yTWFpblBhbmVsLnByb3RvdHlwZS5fZ2V0U2VsZWN0aW9uKToKKwogMjAxMS0xMS0xOCAgQWRh
bSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJlbW92ZSB1bm5lZWRlZCBp
bmNsdWRlIChhbmQgaWZkZWYpIGZyb20gVjhET01XaW5kb3dDdXN0b20uY3BwCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1RleHRFZGl0b3JNb2RlbC5qcyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCmlu
ZGV4IGI5ODBiZGIuLmY0N2ZmMzggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvVGV4dEVkaXRvck1vZGVsLmpzCkBAIC01MCw2ICs1MCwxOSBAQCBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZSA9IHsKICAgICAgICAgcmV0dXJuIHRoaXMuZW5k
TGluZSAtIHRoaXMuc3RhcnRMaW5lOwogICAgIH0sCiAKKyAgICBjb2xsYXBzZVRvRW5kOiBmdW5j
dGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uo
dGhpcy5lbmRMaW5lLCB0aGlzLmVuZENvbHVtbiwgdGhpcy5lbmRMaW5lLCB0aGlzLmVuZENvbHVt
bik7CisgICAgfSwKKworICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAg
aWYgKHRoaXMuc3RhcnRMaW5lID4gdGhpcy5lbmRMaW5lIHx8ICh0aGlzLnN0YXJ0TGluZSA9PT0g
dGhpcy5lbmRMaW5lICYmIHRoaXMuc3RhcnRDb2x1bW4gPiB0aGlzLmVuZENvbHVtbikpCisgICAg
ICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UodGhpcy5lbmRMaW5lLCB0
aGlzLmVuZENvbHVtbiwgdGhpcy5zdGFydExpbmUsIHRoaXMuc3RhcnRDb2x1bW4pOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCiAgICAgY2xvbmU6IGZ1
bmN0aW9uKCkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5n
ZSh0aGlzLnN0YXJ0TGluZSwgdGhpcy5zdGFydENvbHVtbiwgdGhpcy5lbmRMaW5lLCB0aGlzLmVu
ZENvbHVtbik7CkBAIC03NSw2ICs4OCw4IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yTW9kZWwu
SW5kZW50ID0gewogICAgIFRhYkNoYXJhY3RlcjogIlx0IgogfQogCitXZWJJbnNwZWN0b3IuVGV4
dEVkaXRvck1vZGVsLmVuZHNXaXRoQnJhY2tldFJlZ2V4ID0gL1t7KFxbXVxzKiQvOworCiBXZWJJ
bnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLnByb3RvdHlwZSA9IHsKICAgICBzZXQgY2hhbmdlTGlz
dGVuZXIoY2hhbmdlTGlzdGVuZXIpCiAgICAgewpAQCAtOTEsNiArMTA2LDExIEBAIFdlYkluc3Bl
Y3Rvci5UZXh0RWRpdG9yTW9kZWwucHJvdG90eXBlID0gewogICAgICAgICByZXR1cm4gdGhpcy5f
bGluZXMuam9pbih0aGlzLl9saW5lQnJlYWspOwogICAgIH0sCiAKKyAgICBnZXQgbGluZUJyZWFr
KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9saW5lQnJlYWs7CisgICAgfSwKKwogICAg
IGxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCiAgICAgewogICAgICAgICBpZiAobGluZU51bWJl
ciA+PSB0aGlzLl9saW5lcy5sZW5ndGgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL1RleHRWaWV3ZXIuanMgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL1RleHRWaWV3ZXIuanMKaW5kZXggMDM5OGZlZi4uMDY2YmY4ZSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9UZXh0Vmlld2VyLmpzCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvVGV4dFZpZXdlci5qcwpAQCAtMjY2
LDYgKzI2Niw5IEBAIFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZSA9IHsKICAgICAg
ICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXko
a2V5cy5FbnRlci5jb2RlLCBtb2RpZmllcnMuQ3RybE9yTWV0YSldID0gY29tbWl0RWRpdGluZzsK
ICAgICAgICAgdGhpcy5fc2hvcnRjdXRzW1dlYkluc3BlY3Rvci5LZXlib2FyZFNob3J0Y3V0Lm1h
a2VLZXkoa2V5cy5Fc2MuY29kZSldID0gY2FuY2VsRWRpdGluZzsKIAorICAgICAgICB2YXIgaGFu
ZGxlRW50ZXJLZXkgPSB0aGlzLl9tYWluUGFuZWwuaGFuZGxlRW50ZXJLZXkuYmluZCh0aGlzLl9t
YWluUGFuZWwpOworICAgICAgICB0aGlzLl9zaG9ydGN1dHNbV2ViSW5zcGVjdG9yLktleWJvYXJk
U2hvcnRjdXQubWFrZUtleShrZXlzLkVudGVyLmNvZGUsIFdlYkluc3BlY3Rvci5LZXlib2FyZFNo
b3J0Y3V0Lk1vZGlmaWVycy5Ob25lKV0gPSBoYW5kbGVFbnRlcktleTsKKwogICAgICAgICB2YXIg
aGFuZGxlVW5kbyA9IHRoaXMuX21haW5QYW5lbC5oYW5kbGVVbmRvUmVkby5iaW5kKHRoaXMuX21h
aW5QYW5lbCwgZmFsc2UpOwogICAgICAgICB2YXIgaGFuZGxlUmVkbyA9IHRoaXMuX21haW5QYW5l
bC5oYW5kbGVVbmRvUmVkby5iaW5kKHRoaXMuX21haW5QYW5lbCwgdHJ1ZSk7CiAgICAgICAgIHRo
aXMuX3Nob3J0Y3V0c1tXZWJJbnNwZWN0b3IuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KCJ6Iiwg
bW9kaWZpZXJzLkN0cmxPck1ldGEpXSA9IGhhbmRsZVVuZG87CkBAIC0yNzksOSArMjgyLDEyIEBA
IFdlYkluc3BlY3Rvci5UZXh0Vmlld2VyLnByb3RvdHlwZSA9IHsKIAogICAgIF9oYW5kbGVLZXlE
b3duOiBmdW5jdGlvbihlKQogICAgIHsKKyAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpCisgICAg
ICAgICAgICByZXR1cm47CisKICAgICAgICAgdmFyIHNob3J0Y3V0S2V5ID0gV2ViSW5zcGVjdG9y
LktleWJvYXJkU2hvcnRjdXQubWFrZUtleUZyb21FdmVudChlKTsKICAgICAgICAgdmFyIGhhbmRs
ZXIgPSB0aGlzLl9zaG9ydGN1dHNbc2hvcnRjdXRLZXldOwotICAgICAgICBpZiAoaGFuZGxlciAm
JiBoYW5kbGVyLmNhbGwodGhpcykpIHsKKyAgICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlcigp
KSB7CiAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICBlLnN0b3BQ
cm9wYWdhdGlvbigpOwogICAgICAgICB9CkBAIC0xMDIxLDcgKzEwMjcsNyBAQCBXZWJJbnNwZWN0
b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5cGUgPSB7CiAKICAgICBoYW5kbGVVbmRvUmVk
bzogZnVuY3Rpb24ocmVkbykKICAgICB7Ci0gICAgICAgIGlmICh0aGlzLl9yZWFkT25seSB8fCB0
aGlzLl9kaXJ0eUxpbmVzKQorICAgICAgICBpZiAodGhpcy5fZGlydHlMaW5lcykKICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB0aGlzLmJlZ2luVXBkYXRlcygpOwpAQCAtMTA0
NCwyMCArMTA1MCwxOCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5
cGUgPSB7CiAKICAgICBoYW5kbGVUYWJLZXlQcmVzczogZnVuY3Rpb24oc2hpZnRLZXkpCiAgICAg
ewotICAgICAgICBpZiAodGhpcy5fcmVhZE9ubHkgfHwgdGhpcy5fZGlydHlMaW5lcykKKyAgICAg
ICAgaWYgKHRoaXMuX2RpcnR5TGluZXMpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAg
ICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbigpOwogICAgICAgICBpZiAo
IXNlbGVjdGlvbikKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAorICAgICAgICB2YXIgcmFu
Z2UgPSBzZWxlY3Rpb24ubm9ybWFsaXplKCk7CisKICAgICAgICAgdGhpcy5iZWdpblVwZGF0ZXMo
KTsKICAgICAgICAgdGhpcy5fZW50ZXJUZXh0Q2hhbmdlTW9kZSgpOwogCi0gICAgICAgIHZhciBy
YW5nZSA9IHNlbGVjdGlvbjsKLSAgICAgICAgaWYgKHJhbmdlLnN0YXJ0TGluZSA+IHJhbmdlLmVu
ZExpbmUgfHwgKHJhbmdlLnN0YXJ0TGluZSA9PT0gcmFuZ2UuZW5kTGluZSAmJiByYW5nZS5zdGFy
dENvbHVtbiA+IHJhbmdlLmVuZENvbHVtbikpCi0gICAgICAgICAgICByYW5nZSA9IG5ldyBXZWJJ
bnNwZWN0b3IuVGV4dFJhbmdlKHJhbmdlLmVuZExpbmUsIHJhbmdlLmVuZENvbHVtbiwgcmFuZ2Uu
c3RhcnRMaW5lLCByYW5nZS5zdGFydENvbHVtbik7Ci0KICAgICAgICAgdmFyIG5ld1JhbmdlOwog
ICAgICAgICBpZiAoc2hpZnRLZXkpCiAgICAgICAgICAgICBuZXdSYW5nZSA9IHRoaXMuX3VuaW5k
ZW50TGluZXMocmFuZ2UpOwpAQCAtMTEzMCw2ICsxMTM0LDU3IEBAIFdlYkluc3BlY3Rvci5UZXh0
RWRpdG9yTWFpblBhbmVsLnByb3RvdHlwZSA9IHsKICAgICAgICAgcmV0dXJuIG5ld1JhbmdlOwog
ICAgIH0sCiAKKyAgICBoYW5kbGVFbnRlcktleTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAg
aWYgKHRoaXMuX2RpcnR5TGluZXMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAg
ICAgdmFyIHJhbmdlID0gdGhpcy5fZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmICghcmFuZ2Up
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmFuZ2Uubm9ybWFsaXplKCk7
CisKKyAgICAgICAgaWYgKHJhbmdlLmVuZENvbHVtbiA9PT0gMCkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3RleHRNb2RlbC5saW5lKHJhbmdl
LnN0YXJ0TGluZSk7CisgICAgICAgIHZhciBsaW5lUHJlZml4ID0gbGluZS5zdWJzdHJpbmcoMCwg
cmFuZ2Uuc3RhcnRDb2x1bW4pOworICAgICAgICB2YXIgaW5kZW50TWF0Y2ggPSBsaW5lUHJlZml4
Lm1hdGNoKC9eXHMrLyk7CisgICAgICAgIHZhciBjdXJyZW50SW5kZW50ID0gaW5kZW50TWF0Y2gg
PyBpbmRlbnRNYXRjaFswXSA6ICIiOworCisgICAgICAgIHZhciB0ZXh0RWRpdG9ySW5kZW50ID0g
V2ViSW5zcGVjdG9yLnNldHRpbmdzLnRleHRFZGl0b3JJbmRlbnQuZ2V0KCk7CisgICAgICAgIHZh
ciBpbmRlbnQgPSBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1vZGVsLmVuZHNXaXRoQnJhY2tldFJl
Z2V4LnRlc3QobGluZVByZWZpeCkgPyBjdXJyZW50SW5kZW50ICsgdGV4dEVkaXRvckluZGVudCA6
IGN1cnJlbnRJbmRlbnQ7CisKKyAgICAgICAgaWYgKCFpbmRlbnQpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgdGhpcy5iZWdpblVwZGF0ZXMoKTsKKyAgICAgICAgdGhpcy5f
ZW50ZXJUZXh0Q2hhbmdlTW9kZSgpOworCisgICAgICAgIHZhciBsaW5lQnJlYWsgPSB0aGlzLl90
ZXh0TW9kZWwubGluZUJyZWFrOworICAgICAgICB2YXIgbmV3UmFuZ2U7CisgICAgICAgIGlmIChy
YW5nZS5pc0VtcHR5KCkgJiYgbGluZS5zdWJzdHIocmFuZ2UuZW5kQ29sdW1uIC0gMSwgMikgPT09
ICd7fScpIHsKKyAgICAgICAgICAgIC8vIHt8fQorICAgICAgICAgICAgLy8gYmVjb21lcworICAg
ICAgICAgICAgLy8geworICAgICAgICAgICAgLy8gICAgIHwKKyAgICAgICAgICAgIC8vIH0KKyAg
ICAgICAgICAgIG5ld1JhbmdlID0gdGhpcy5fc2V0VGV4dChyYW5nZSwgbGluZUJyZWFrICsgaW5k
ZW50ICsgbGluZUJyZWFrICsgY3VycmVudEluZGVudCk7CisgICAgICAgICAgICBuZXdSYW5nZS5l
bmRMaW5lLS07CisgICAgICAgICAgICBuZXdSYW5nZS5lbmRDb2x1bW4gKz0gdGV4dEVkaXRvcklu
ZGVudC5sZW5ndGg7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlz
Ll9zZXRUZXh0KHJhbmdlLCBsaW5lQnJlYWsgKyBpbmRlbnQpOworCisgICAgICAgIG5ld1Jhbmdl
ID0gbmV3UmFuZ2UuY29sbGFwc2VUb0VuZCgpOworCisgICAgICAgIHRoaXMuX2V4aXRUZXh0Q2hh
bmdlTW9kZShyYW5nZSwgbmV3UmFuZ2UpOworICAgICAgICB0aGlzLmVuZFVwZGF0ZXMoKTsKKyAg
ICAgICAgdGhpcy5fcmVzdG9yZVNlbGVjdGlvbihuZXdSYW5nZSwgdHJ1ZSk7CisKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfSwKKwogICAgIF9zcGxpdENodW5rT25BTGluZTogZnVuY3Rpb24o
bGluZU51bWJlciwgY2h1bmtOdW1iZXIsIGNyZWF0ZVN1ZmZpeENodW5rKQogICAgIHsKICAgICAg
ICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbigpOwpAQCAtMTQxMywxNiArMTQ2
OCwxMiBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvck1haW5QYW5lbC5wcm90b3R5cGUgPSB7CiAg
ICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgIGlm
ICghc2VsZWN0aW9uLnJhbmdlQ291bnQpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAg
ICAgdmFyIHNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICAgICAg
IC8vIFNlbGVjdGlvbiBtYXkgYmUgb3V0c2lkZSBvZiB0aGUgdmlld2VyLgotICAgICAgICBpZiAo
IXRoaXMuX2NvbnRhaW5lci5pc0FuY2VzdG9yKHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVy
KSB8fCAhdGhpcy5fY29udGFpbmVyLmlzQW5jZXN0b3Ioc2VsZWN0aW9uUmFuZ2UuZW5kQ29udGFp
bmVyKSkKKyAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIuaXNBbmNlc3RvcihzZWxlY3Rpb24u
YW5jaG9yTm9kZSkgfHwgIXRoaXMuX2NvbnRhaW5lci5pc0FuY2VzdG9yKHNlbGVjdGlvbi5mb2N1
c05vZGUpKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHZhciBzdGFydCA9IHRo
aXMuX3NlbGVjdGlvblRvUG9zaXRpb24oc2VsZWN0aW9uUmFuZ2Uuc3RhcnRDb250YWluZXIsIHNl
bGVjdGlvblJhbmdlLnN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgdmFyIGVuZCA9IHNlbGVjdGlvblJh
bmdlLmNvbGxhcHNlZCA/IHN0YXJ0IDogdGhpcy5fc2VsZWN0aW9uVG9Qb3NpdGlvbihzZWxlY3Rp
b25SYW5nZS5lbmRDb250YWluZXIsIHNlbGVjdGlvblJhbmdlLmVuZE9mZnNldCk7Ci0gICAgICAg
IGlmIChzZWxlY3Rpb24uYW5jaG9yTm9kZSA9PT0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRDb250YWlu
ZXIgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZz
ZXQpCi0gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uoc3RhcnQu
bGluZSwgc3RhcnQuY29sdW1uLCBlbmQubGluZSwgZW5kLmNvbHVtbik7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIHJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShlbmQubGluZSwg
ZW5kLmNvbHVtbiwgc3RhcnQubGluZSwgc3RhcnQuY29sdW1uKTsKKyAgICAgICAgdmFyIHN0YXJ0
ID0gdGhpcy5fc2VsZWN0aW9uVG9Qb3NpdGlvbihzZWxlY3Rpb24uYW5jaG9yTm9kZSwgc2VsZWN0
aW9uLmFuY2hvck9mZnNldCk7CisgICAgICAgIHZhciBlbmQgPSBzZWxlY3Rpb24uaXNDb2xsYXBz
ZWQgPyBzdGFydCA6IHRoaXMuX3NlbGVjdGlvblRvUG9zaXRpb24oc2VsZWN0aW9uLmZvY3VzTm9k
ZSwgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0
b3IuVGV4dFJhbmdlKHN0YXJ0LmxpbmUsIHN0YXJ0LmNvbHVtbiwgZW5kLmxpbmUsIGVuZC5jb2x1
bW4pOwogICAgIH0sCiAKICAgICAvKioK
</data>

          </attachment>
      

    </bug>

</bugzilla>