<?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>14757</bug_id>
          
          <creation_ts>2007-07-24 14:01:44 -0700</creation_ts>
          <short_desc>REGRESSION: HTMLTokenizer::processingData implementation is incorrect</short_desc>
          <delta_ts>2007-07-31 13:34:42 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Page Loading</component>
          <version>523.x (Safari 3)</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>InRadar, Regression</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Matt Perry">mpComplete</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ddkilzer</cc>
    
    <cc>mitz</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>3783</commentid>
    <comment_count>0</comment_count>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-24 14:01:44 -0700</bug_when>
    <thetext>Here is the implementation:
bool HTMLTokenizer::processingData() const
{
    return m_timer.isActive();
}

The problem is that this function can be called from within m_timer&apos;s fired callback.  A non-repeating timer that is being fired is not active (maybe *this* is the real bug?).  However, the tokenizer actually is processing data while inside its Timer::fired callback.  This function returns an incorrect result in that case.

I saw this problem surface when loading a page with frames on a slow machine.  Here&apos;s the sequence of events:
- The parsing of the HTML was deferred and put on a timer (HTMLTokenizer::m_timer).
- When that timer fired, one of the subframes was created.
- Initializing that subframe caused the FrameLoaders to do a recursiveCheckLoadComplete.
- Since HTMLTokenizer::processingData returned false incorrectly, the toplevel frame was assumed to have been done loading, and marked as such incorrectly.
- Frame load events were then dispatched out of order (dispatchDidFinishLoad was called for the toplevel frame before subframes).

And here&apos;s the corresponding sample callstack from a run of Safari on Mac:

#0  WebCore::TimerBase::isActive (this=0x28bded8) at /Users/mpcomplete/src/WebKit/WebCore/platform/Timer.cpp:188
#1  0x0101e13a in WebCore::HTMLTokenizer::processingData (this=0x28bde00) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLTokenizer.cpp:1497
#2  0x0138dcd6 in WebCore::DocumentLoader::isLoadingInAPISense (this=0x2926200) at /Users/mpcomplete/src/WebKit/WebCore/loader/DocumentLoader.cpp:468
#3  0x01383ac2 in WebCore::FrameLoader::checkLoadCompleteForThisFrame (this=0x281fa00) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:2777
#4  0x01383d38 in WebCore::FrameLoader::recursiveCheckLoadComplete (this=0x281fa00) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:2899
#5  0x01383dd6 in WebCore::FrameLoader::checkLoadComplete (this=0x2927c00) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:2910
#6  0x01388e72 in WebCore::FrameLoader::checkCompleted (this=0x2927c00) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:1185
#7  0x0138b93f in WebCore::FrameLoader::endIfNotLoadingMainResource (this=0x2927c00) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:1006
#8  0x0138b9b5 in WebCore::FrameLoader::end (this=0x2927c00) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:978
#9  0x0138f85c in WebCore::DocumentLoader::finishedLoading (this=0x28c4800) at /Users/mpcomplete/src/WebKit/WebCore/loader/DocumentLoader.cpp:319
#10 0x0138bbb2 in WebCore::FrameLoader::init (this=0x2927c00) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:265
#11 0x010b6d58 in WebCore::Frame::init (this=0x15e74360) at /Users/mpcomplete/src/WebKit/WebCore/page/Frame.cpp:219
#12 0x0032b4b4 in -[WebFrameBridge finishInitializingWithPage:frameName:frameView:ownerElement:] (self=0x15e35410, _cmd=0x3ac664, page=0x2148060, name=0x15e6d0f0, frameView=0x15e6dc10, ownerElement=0x15e758e0) at /Users/mpcomplete/src/WebKit/WebKit/WebCoreSupport/WebFrameBridge.mm:147
#13 0x00327f1c in -[WebFrameBridge initSubframeWithOwnerElement:frameName:frameView:] (self=0x15e35410, _cmd=0x3ac6d0, ownerElement=0x15e758e0, name=0x15e6d0f0, frameView=0x15e6dc10) at /Users/mpcomplete/src/WebKit/WebKit/WebCoreSupport/WebFrameBridge.mm:162
#14 0x0032b21f in -[WebFrameBridge createChildFrameNamed:withURL:referrer:ownerElement:allowsScrolling:marginWidth:marginHeight:] (self=0x2147160, _cmd=0x3ac834, frameName=0x15e6d0f0, URL=0x15e75970, referrer=@0xbfffe49c, ownerElement=0x15e758e0, allowsScrolling=1 &apos;\001&apos;, width=-1, height=-1) at /Users/mpcomplete/src/WebKit/WebKit/WebCoreSupport/WebFrameBridge.mm:349
#15 0x003900a3 in WebFrameLoaderClient::createFrame (this=0x21464d0, url=@0xbfffe56c, name=@0x15e75954, ownerElement=0x15e758e0, referrer=@0xbfffe49c, allowsScrolling=1, marginWidth=-1, marginHeight=-1) at /Users/mpcomplete/src/WebKit/WebKit/WebCoreSupport/WebFrameLoaderClient.mm:1163
#16 0x0138c045 in WebCore::FrameLoader::loadSubframe (this=0x281fa00, ownerElement=0x15e758e0, url=@0xbfffe56c, name=@0x15e75954, referrer=@0x281fb24) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:452
#17 0x0138d32b in WebCore::FrameLoader::requestFrame (this=0x281fa00, ownerElement=0x15e758e0, urlString=@0x15e75950, frameName=@0x15e75954) at /Users/mpcomplete/src/WebKit/WebCore/loader/FrameLoader.cpp:422
#18 0x0136c092 in WebCore::HTMLFrameElementBase::openURL (this=0x15e758e0) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLFrameElementBase.cpp:107
#19 0x0136c5af in WebCore::HTMLFrameElementBase::openURLCallback (n=0x15e758e0) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLFrameElementBase.cpp:158
#20 0x010d72f5 in WebCore::ContainerNode::attach (this=0x15e758e0) at /Users/mpcomplete/src/WebKit/WebCore/dom/ContainerNode.cpp:605
#21 0x0122f338 in WebCore::Element::attach (this=0x15e758e0) at /Users/mpcomplete/src/WebKit/WebCore/dom/Element.cpp:664
#22 0x0136b7e7 in WebCore::HTMLFrameElementBase::attach (this=0x15e758e0) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLFrameElementBase.cpp:192
#23 0x0126ee31 in WebCore::HTMLFrameElement::attach (this=0x15e758e0) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLFrameElement.cpp:66
#24 0x0101d18d in WebCore::HTMLParser::insertNode (this=0x15e3e8a0, n=0x15e758e0, flat=false) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLParser.cpp:328
#25 0x0101da35 in WebCore::HTMLParser::parseToken (this=0x15e3e8a0, t=0x28bde14) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLParser.cpp:250
#26 0x0101f818 in WebCore::HTMLTokenizer::processToken (this=0x28bde00) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLTokenizer.cpp:1641
#27 0x010229ed in WebCore::HTMLTokenizer::parseTag (this=0x28bde00, src=@0x28be304, state={static EntityShift = 4, m_bits = 0}) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLTokenizer.cpp:1206
#28 0x010233c4 in WebCore::HTMLTokenizer::write (this=0x28bde00, str=@0xbfffebdc, appendData=true) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLTokenizer.cpp:1437
#29 0x0101f20b in WebCore::HTMLTokenizer::timerFired (this=0x28bde00) at /Users/mpcomplete/src/WebKit/WebCore/html/HTMLTokenizer.cpp:1517
#30 0x014a7b57 in WebCore::Timer&lt;WebCore::HTMLTokenizer&gt;::fired (this=0x28bded8) at Timer.h:96
#31 0x011f1026 in WebCore::TimerBase::fireTimers (fireTime=1185310107.954752, firingTimers=@0xbfffecbc) at /Users/mpcomplete/src/WebKit/WebCore/platform/Timer.cpp:336
#32 0x011f10c3 in WebCore::TimerBase::sharedTimerFired () at /Users/mpcomplete/src/WebKit/WebCore/platform/Timer.cpp:353
#33 0x011f0763 in timerFired () at /Users/mpcomplete/src/WebKit/WebCore/platform/mac/SharedTimerMac.cpp:48</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3776</commentid>
    <comment_count>1</comment_count>
      <attachid>15674</attachid>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-24 15:54:53 -0700</bug_when>
    <thetext>Created attachment 15674
patch to HTMLTokenizer

I&apos;m going the simple route and changing HTMLTokenizer::processingToken().  It should also return true when inside the ::write() call (which it will be when the timer fires).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3731</commentid>
    <comment_count>2</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-07-25 09:58:47 -0700</bug_when>
    <thetext>Can you make a test case to demonstrate the issue here? What would we need added to the testing infrastructure to demonstrate the problem this causes?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3714</commentid>
    <comment_count>3</comment_count>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-25 15:32:33 -0700</bug_when>
    <thetext>To be clear, the symptom of this problem that I saw was that WebFrameLoaderClient::dispatchDidFinishLoad was called for the toplevel frame before it was called for its subframes (and thus, obviously before it was actually finished loading).

To add a test case, we would need some way to force HTMLTokenizer to defer its processing using m_timer, so that it processed the &lt;frame&gt; element (thus creating the Frame object) from the timer callback.  Then we would need a way to check that dispatchDidFinishLoad for the toplevel frame was called after dispatchDidFinishLoad for a subframe.

However, it seems to me that a new test is unnecessary, since processingData() should obviously return true if HTMLTokenizer is still inside the write() function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3712</commentid>
    <comment_count>4</comment_count>
      <attachid>15674</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2007-07-25 16:17:10 -0700</bug_when>
    <thetext>Comment on attachment 15674
patch to HTMLTokenizer

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3713</commentid>
    <comment_count>5</comment_count>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-25 16:23:06 -0700</bug_when>
    <thetext>Damn, hang on.  http/tests/misc/window-dot-stop.html hangs with this patch.  Investigating.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3711</commentid>
    <comment_count>6</comment_count>
      <attachid>15674</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2007-07-25 16:29:35 -0700</bug_when>
    <thetext>Comment on attachment 15674
patch to HTMLTokenizer

Clearing flag.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3710</commentid>
    <comment_count>7</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2007-07-25 16:30:06 -0700</bug_when>
    <thetext>Minusing while mpComplete investigates.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3708</commentid>
    <comment_count>8</comment_count>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-25 18:23:56 -0700</bug_when>
    <thetext>Ok, this test hangs for the same reason that I was seeing the bug to begin with.  There is a JS call to window.stop() in the body of this test, which gets executed synchronously while parsing the document.  That means that we cancel the load of the page from within HTMLTokenizer::write.  As soon as we cancel, we check if the load is complete - since we&apos;re still parsing, this check fails.

I believe a reasonable fix would be to do the checkLoadComplete call asynchronously in this case.  (Of course, we&apos;d still have to cancel the load mid-parsing.)  If you guys agree, I&apos;ll have a patch ready shortly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3707</commentid>
    <comment_count>9</comment_count>
      <attachid>15688</attachid>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-25 18:54:18 -0700</bug_when>
    <thetext>Created attachment 15688
above patch with test hang fix

This patch does what I described in my previous comment - FrameLoader::stopForUserCancel (called from window.stop) does the loadComplete check asynchronously.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3706</commentid>
    <comment_count>10</comment_count>
      <attachid>15688</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-07-25 20:05:10 -0700</bug_when>
    <thetext>Comment on attachment 15688
above patch with test hang fix

(In reply to comment #3)
&gt; However, it seems to me that a new test is unnecessary, since processingData()
&gt; should obviously return true if HTMLTokenizer is still inside the write()
&gt; function.

Sorry, I think there&apos;s a misunderstanding here.

A new test is necessary. Proving that the fix is correct is only one reason to add a test. The more important reason for a test is to prevent the bug from being reintroduced later on.

We definitely need to add a test for this unless it&apos;s impractical. The patch should include that test.

+    //return m_timer.isActive();

We don&apos;t check in commented-out code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3702</commentid>
    <comment_count>11</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-07-25 22:11:17 -0700</bug_when>
    <thetext>I agree with Darin that this needs a regression test. It should be possible to make one. You can trigger use of the tokenizer timer deliberately with a long-running script and then more content after it. If you make it an http test, you can even control what individual chunks of content get fed back by making a CGI script that pauses as needed. You should be able to observe the symptom as &quot;load&quot; events getting delivered out of order. With an http/tests/loading test, you could even observe the order of delegate methods.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3669</commentid>
    <comment_count>12</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2007-07-26 13:24:13 -0700</bug_when>
    <thetext>This is a pretty bad regression.  Elevating to P1.  We need a corresponding Radar for this issue.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3667</commentid>
    <comment_count>13</comment_count>
      <attachid>15693</attachid>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-26 14:02:12 -0700</bug_when>
    <thetext>Created attachment 15693
fixed patch with test

Here&apos;s the above patch, with regression test.

Turns out the test was easier to make than I expected.  Thanks for the advice, Maciej!  I didn&apos;t know there was already a framework for dumping the frame load callbacks.

And sorry about the commented code.  I was in a rush and didn&apos;t look closely at the previous patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3662</commentid>
    <comment_count>14</comment_count>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-26 17:14:55 -0700</bug_when>
    <thetext>Wait, there&apos;s a problem with this patch.  I hit an assert in FrameLoader::checkLoadComplete sometimes when closing a window.  It seems stopForUserCancel can be called while destroying the WebView.  Since checkLoadComplete is now called asynchronously, the WebView is gone by that time, which it doesn&apos;t like.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3657</commentid>
    <comment_count>15</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2007-07-26 22:04:51 -0700</bug_when>
    <thetext>&lt;rdar://problem/5364692&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3580</commentid>
    <comment_count>16</comment_count>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-27 12:49:04 -0700</bug_when>
    <thetext>I&apos;ve been brainstorming a few solutions to the assertion problem I had, and I&apos;m not sure what the right approach is.  Maybe someone knows the answer.

Here are the options:
1. Just check if m_client-&gt;hasWebView() (what the assertion asserts) before calling checkLoadComplete.  Feels like a bandaid.  Also, this would mean we wouldn&apos;t fire the cancel load events when closing a webview while loading.
2. Add some more logic to HTMLTokenizer::processingData to detect that the load has been cancelled mid-parse (set a flag in stopParsing), and if so, return false.  I think this might mean the load events would still be fired out of order for a cancelled load, but I haven&apos;t tested.
3. Add some logic to FrameLoader::stopForUserCancel that decides whether to checkLoadComplete asynchronously or synchronously, based on whether the tokenizer is still parsing.  I think this would work for all cases, but it feels hacky.
4. Leave stopForUserCancel alone, and do the async checkLoadComplete only for the window.stop case.  This would fix the hang I described in comment #8, while also fixing the original problem.

Hmm.. now that I&apos;ve talked myself through this, I think I like option 4 the best.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3565</commentid>
    <comment_count>17</comment_count>
      <attachid>15709</attachid>
    <who name="Matt Perry">mpComplete</who>
    <bug_when>2007-07-27 14:09:59 -0700</bug_when>
    <thetext>Created attachment 15709
patch with assertion fix

This is like my previous patch, except:
- FrameLoader::stopForUserCancel does what it always did.
- DOMWindow::stop (window.stop) no longer calls stopForUserCancel.  It cancels the load and then schedules a load-complete check asynchronously.

This fixes the original bug while still passing all tests and not hitting the assertion I had in comment #8.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3234</commentid>
    <comment_count>18</comment_count>
      <attachid>15709</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2007-07-31 12:43:52 -0700</bug_when>
    <thetext>Comment on attachment 15709
patch with assertion fix

I think this fix is pretty darned good.  
r- for one issue.
You replace the stopForUserCancel() call with a stopAllLoaders() and scheduleCheckLoadComplete() call.
It is not obvious to me that those two lines replace the behavior of &quot;stopForUserCancell()&quot; but just do it asynchronously.
I think it&apos;d be better for future maintainability if stopForUserCancel() had an asynchronous flag added, and that method decides whether to do the load complete check now, or later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3235</commentid>
    <comment_count>19</comment_count>
      <attachid>15763</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2007-07-31 13:00:01 -0700</bug_when>
    <thetext>Created attachment 15763
Final patch with tweak I suggested to previous patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3240</commentid>
    <comment_count>20</comment_count>
      <attachid>15763</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-07-31 13:16:43 -0700</bug_when>
    <thetext>Comment on attachment 15763
Final patch with tweak I suggested to previous patch

+    if (m_frame-&gt;page())
+        checkLoadComplete();

The checkLoadComplete() function checks to see if the page is 0 -- why do we need an additional check in the caller? Is the problem with the assertion? If so, maybe we should move the assertion inside the if statement.

+    if (m_frame-&gt;page()) {
+        if (asynchronous)
+            scheduleCheckLoadComplete();
+        else
+            checkLoadComplete();
+    }

Also seems unnecessary to check for page of 0 here.

I don&apos;t understand the meaning of the &quot;asynchronous&quot; parameter in stopForUserCancel. The stop itself seems to be immediate no matter what, so the only that&apos;s deferred is the &quot;check load complete&quot;. Given that, I think the parameter name is quite unclear.

Otherwise looks, good, and these are really nitpicks, so r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3244</commentid>
    <comment_count>21</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2007-07-31 13:34:42 -0700</bug_when>
    <thetext>I changed the name of the async parameter, and made a small tweak to address one of the page() null check concerns.  I decided against making further changes since they were not necessary and might have unforeseen consequences that we&apos;d rather not deal with.

Committed revision 24798.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>15674</attachid>
            <date>2007-07-24 15:54:53 -0700</date>
            <delta_ts>2007-07-25 18:54:18 -0700</delta_ts>
            <desc>patch to HTMLTokenizer</desc>
            <filename>tokenizer.patch</filename>
            <type>text/plain</type>
            <size>1064</size>
            <attacher name="Matt Perry">mpComplete</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyNDYwNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTEgQEAKKzIwMDctMDctMjQgIE1hdHQgUGVycnkgIDxtcENvbXBsZXRlQGdtYWls
LmNvbT4KKworICAgICAgICBGaXggZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NzU3CisgICAgICAgIEhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhIGltcGxl
bWVudGF0aW9uIGlzIGluY29ycmVjdAorCisgICAgICAgICogaHRtbC9IVE1MVG9rZW5pemVyLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhKTogTWFk
ZSBpdCBhbHNvIHJldHVybiB0cnVlIGlmIHRoZSBIVE1MVG9rZW5pemVyIHdhcyBpbnNpZGUgdGhl
IHdyaXRlKCkgY2FsbC4KKwogMjAwNy0wNy0yNCAgQWRlbGUgUGV0ZXJzb24gIDxhZGVsZUBhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSHlhdHQgYW5kIEFkYW0uCkluZGV4OiBXZWJD
b3JlL2h0bWwvSFRNTFRva2VuaXplci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL0hU
TUxUb2tlbml6ZXIuY3BwCShyZXZpc2lvbiAyNDYwMykKKysrIFdlYkNvcmUvaHRtbC9IVE1MVG9r
ZW5pemVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTUwMSw3ICsxNTAxLDcgQEAgdm9pZCBIVE1M
VG9rZW5pemVyOjpzdG9wUGFyc2luZygpCiAKIGJvb2wgSFRNTFRva2VuaXplcjo6cHJvY2Vzc2lu
Z0RhdGEoKSBjb25zdAogewotICAgIHJldHVybiBtX3RpbWVyLmlzQWN0aXZlKCk7CisgICAgcmV0
dXJuIG1fdGltZXIuaXNBY3RpdmUoKSB8fCBpbldyaXRlOwogfQogCiB2b2lkIEhUTUxUb2tlbml6
ZXI6OnRpbWVyRmlyZWQoVGltZXI8SFRNTFRva2VuaXplcj4qKQo=
</data>
<flag name="review"
          id="6527"
          type_id="1"
          status="-"
          setter="hyatt"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>15688</attachid>
            <date>2007-07-25 18:54:18 -0700</date>
            <delta_ts>2007-07-26 14:02:12 -0700</delta_ts>
            <desc>above patch with test hang fix</desc>
            <filename>tokenizer-2.patch</filename>
            <type>text/plain</type>
            <size>4012</size>
            <attacher name="Matt Perry">mpComplete</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyNDYzNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDctMDctMjUgIE1hdHQgUGVycnkgIDxtcENvbXBsZXRlQGdtYWls
LmNvbT4KKworICAgICAgICBGaXggZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NzU3CisgICAgICAgIEhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhIGltcGxl
bWVudGF0aW9uIGlzIGluY29ycmVjdAorCisgICAgICAgICogaHRtbC9IVE1MVG9rZW5pemVyLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhKTogTWFk
ZSBpdCBhbHNvIHJldHVybiB0cnVlIGlmIHRoZSBIVE1MVG9rZW5pemVyIHdhcyBpbnNpZGUgdGhl
IHdyaXRlKCkgY2FsbC4KKyAgICAgICAgKiBsb2FkZXIvRnJhbWVMb2FkZXIuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6RnJhbWVMb2FkZXI6OkZyYW1lTG9hZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkZyYW1lTG9hZGVyOjpjaGVja0xvYWRDb21wbGV0ZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6RnJhbWVMb2FkZXI6OnNjaGVkdWxlQ2hlY2tMb2FkQ29tcGxldGUpOgorICAgICAgICAo
V2ViQ29yZTo6RnJhbWVMb2FkZXI6OnN0b3BGb3JVc2VyQ2FuY2VsKTogQ2hhbmdlZCBhIGNhbGwg
dG8gY2hlY2tMb2FkQ29tcGxldGUgdG8gYmUgYXN5bmNocm9ub3VzLCBzaW5jZQorICAgICAgICBz
dG9wRm9yVXNlckNhbmNlbCBjYW4gYmUgY2FsbGVkIHdoaWxlIHBhcnNpbmcuCisgICAgICAgICog
bG9hZGVyL0ZyYW1lTG9hZGVyLmg6CisKIDIwMDctMDctMjUgIEFuZGVycyBDYXJsc3NvbiAgPGFu
ZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbi4KSW5kZXg6IFdl
YkNvcmUvaHRtbC9IVE1MVG9rZW5pemVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwv
SFRNTFRva2VuaXplci5jcHAJKHJldmlzaW9uIDI0NjAzKQorKysgV2ViQ29yZS9odG1sL0hUTUxU
b2tlbml6ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAxLDcgKzE1MDEsOCBAQCB2b2lkIEhU
TUxUb2tlbml6ZXI6OnN0b3BQYXJzaW5nKCkKIAogYm9vbCBIVE1MVG9rZW5pemVyOjpwcm9jZXNz
aW5nRGF0YSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fdGltZXIuaXNBY3RpdmUoKTsKKyAgICBy
ZXR1cm4gbV90aW1lci5pc0FjdGl2ZSgpIHx8IGluV3JpdGU7CisgICAgLy9yZXR1cm4gbV90aW1l
ci5pc0FjdGl2ZSgpOwogfQogCiB2b2lkIEhUTUxUb2tlbml6ZXI6OnRpbWVyRmlyZWQoVGltZXI8
SFRNTFRva2VuaXplcj4qKQpJbmRleDogV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVyLmNwcAkocmV2aXNpb24gMjQ2
MDMpCisrKyBXZWJDb3JlL2xvYWRlci9GcmFtZUxvYWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTIzMiw2ICsyMzIsNyBAQCBGcmFtZUxvYWRlcjo6RnJhbWVMb2FkZXIoRnJhbWUqIGZyYW1lLCBG
CiAgICAgLCBtX2NvbnRhaW5zUGx1Z0lucyhmYWxzZSkKICAgICAsIG1fcmVkaXJlY3Rpb25UaW1l
cih0aGlzLCAmRnJhbWVMb2FkZXI6OnJlZGlyZWN0aW9uVGltZXJGaXJlZCkKICAgICAsIG1fY2hl
Y2tDb21wbGV0ZWRUaW1lcih0aGlzLCAmRnJhbWVMb2FkZXI6OmNoZWNrQ29tcGxldGVkVGltZXJG
aXJlZCkKKyAgICAsIG1fY2hlY2tMb2FkQ29tcGxldGVUaW1lcih0aGlzLCAmRnJhbWVMb2FkZXI6
OmNoZWNrTG9hZENvbXBsZXRlVGltZXJGaXJlZCkKICAgICAsIG1fb3BlbmVyKDApCiAgICAgLCBt
X29wZW5lZEJ5RE9NKGZhbHNlKQogICAgICwgbV9jcmVhdGluZ0luaXRpYWxFbXB0eURvY3VtZW50
KGZhbHNlKQpAQCAtMTIxMSw2ICsxMjEyLDE3IEBAIHZvaWQgRnJhbWVMb2FkZXI6OnNjaGVkdWxl
Q2hlY2tDb21wbGV0ZWQKICAgICAgICAgbV9jaGVja0NvbXBsZXRlZFRpbWVyLnN0YXJ0T25lU2hv
dCgwKTsKIH0KIAordm9pZCBGcmFtZUxvYWRlcjo6Y2hlY2tMb2FkQ29tcGxldGVUaW1lckZpcmVk
KFRpbWVyPEZyYW1lTG9hZGVyPiopCit7CisgICAgY2hlY2tMb2FkQ29tcGxldGUoKTsKK30KKwor
dm9pZCBGcmFtZUxvYWRlcjo6c2NoZWR1bGVDaGVja0xvYWRDb21wbGV0ZSgpCit7CisgICAgaWYg
KCFtX2NoZWNrTG9hZENvbXBsZXRlVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9jaGVja0xv
YWRDb21wbGV0ZVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKK30KKwogdm9pZCBGcmFtZUxvYWRlcjo6
Y2hlY2tDYWxsSW1wbGljaXRDbG9zZSgpCiB7CiAgICAgaWYgKG1fZGlkQ2FsbEltcGxpY2l0Q2xv
c2UgfHwgIW1fZnJhbWUtPmRvY3VtZW50KCkgfHwgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+cGFyc2lu
ZygpKQpAQCAtMjI1OCw4ICsyMjcwLDcgQEAgdm9pZCBGcmFtZUxvYWRlcjo6c3RvcEFsbExvYWRl
cnMoKQogdm9pZCBGcmFtZUxvYWRlcjo6c3RvcEZvclVzZXJDYW5jZWwoKQogewogICAgIHN0b3BB
bGxMb2FkZXJzKCk7Ci0gICAgaWYgKG1fZnJhbWUtPnBhZ2UoKSkKLSAgICAgICAgY2hlY2tMb2Fk
Q29tcGxldGUoKTsKKyAgICBzY2hlZHVsZUNoZWNrTG9hZENvbXBsZXRlKCk7CiB9CiAKIHZvaWQg
RnJhbWVMb2FkZXI6OmNhbmNlbFBlbmRpbmdBcmNoaXZlTG9hZChSZXNvdXJjZUxvYWRlciogbG9h
ZGVyKQpJbmRleDogV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2xvYWRlci9GcmFtZUxvYWRlci5oCShyZXZpc2lvbiAyNDYwMykKKysrIFdlYkNvcmUv
bG9hZGVyL0ZyYW1lTG9hZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTM3NCw2ICszNzQsNyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZvaWQgZmluaXNoZWRQYXJzaW5nKCk7CiAgICAg
ICAgIHZvaWQgY2hlY2tDb21wbGV0ZWQoKTsKICAgICAgICAgdm9pZCBzY2hlZHVsZUNoZWNrQ29t
cGxldGVkKCk7CisgICAgICAgIHZvaWQgc2NoZWR1bGVDaGVja0xvYWRDb21wbGV0ZSgpOwogCiAg
ICAgICAgIHZvaWQgY2xlYXJSZWNvcmRlZEZvcm1WYWx1ZXMoKTsKICAgICAgICAgdm9pZCByZWNv
cmRGb3JtVmFsdWUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBQYXNz
UmVmUHRyPEhUTUxGb3JtRWxlbWVudD4pOwpAQCAtNDU2LDYgKzQ1Nyw3IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKICAgICAKICAgICAgICAgdm9pZCByZWRpcmVjdGlvblRpbWVyRmlyZWQoVGltZXI8
RnJhbWVMb2FkZXI+Kik7CiAgICAgICAgIHZvaWQgY2hlY2tDb21wbGV0ZWRUaW1lckZpcmVkKFRp
bWVyPEZyYW1lTG9hZGVyPiopOworICAgICAgICB2b2lkIGNoZWNrTG9hZENvbXBsZXRlVGltZXJG
aXJlZChUaW1lcjxGcmFtZUxvYWRlcj4qKTsKIAogICAgICAgICB2b2lkIGNhbmNlbFJlZGlyZWN0
aW9uKGJvb2wgbmV3TG9hZEluUHJvZ3Jlc3MgPSBmYWxzZSk7CiAKQEAgLTYyMyw2ICs2MjUsNyBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgCiAgICAgICAgIFRpbWVyPEZyYW1lTG9hZGVyPiBt
X3JlZGlyZWN0aW9uVGltZXI7CiAgICAgICAgIFRpbWVyPEZyYW1lTG9hZGVyPiBtX2NoZWNrQ29t
cGxldGVkVGltZXI7CisgICAgICAgIFRpbWVyPEZyYW1lTG9hZGVyPiBtX2NoZWNrTG9hZENvbXBs
ZXRlVGltZXI7CiAKICAgICAgICAgRnJhbWUqIG1fb3BlbmVyOwogICAgICAgICBIYXNoU2V0PEZy
YW1lKj4gbV9vcGVuZWRGcmFtZXM7Cg==
</data>
<flag name="review"
          id="6536"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>15693</attachid>
            <date>2007-07-26 14:02:12 -0700</date>
            <delta_ts>2007-07-27 14:09:59 -0700</delta_ts>
            <desc>fixed patch with test</desc>
            <filename>tokenizer-4.patch</filename>
            <type>text/plain</type>
            <size>6681</size>
            <attacher name="Matt Perry">mpComplete</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyNDY0OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDctMDctMjYgIE1hdHQgUGVycnkgIDxtcENvbXBsZXRlQGdtYWls
LmNvbT4KKworICAgICAgICBGaXggZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NzU3CisgICAgICAgIEhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhIGltcGxl
bWVudGF0aW9uIGlzIGluY29ycmVjdAorCisgICAgICAgICogaHRtbC9IVE1MVG9rZW5pemVyLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhKTogTWFk
ZSBpdCBhbHNvIHJldHVybiB0cnVlIGlmIHRoZSBIVE1MVG9rZW5pemVyIHdhcyBpbnNpZGUgdGhl
IHdyaXRlKCkgY2FsbC4KKyAgICAgICAgKiBsb2FkZXIvRnJhbWVMb2FkZXIuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6RnJhbWVMb2FkZXI6OkZyYW1lTG9hZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkZyYW1lTG9hZGVyOjpjaGVja0xvYWRDb21wbGV0ZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6RnJhbWVMb2FkZXI6OnNjaGVkdWxlQ2hlY2tMb2FkQ29tcGxldGUpOgorICAgICAgICAo
V2ViQ29yZTo6RnJhbWVMb2FkZXI6OnN0b3BGb3JVc2VyQ2FuY2VsKTogQ2hhbmdlZCBhIGNhbGwg
dG8gY2hlY2tMb2FkQ29tcGxldGUgdG8gYmUgYXN5bmNocm9ub3VzLCBzaW5jZQorICAgICAgICBz
dG9wRm9yVXNlckNhbmNlbCBjYW4gYmUgY2FsbGVkIHdoaWxlIHBhcnNpbmcuCisgICAgICAgICog
bG9hZGVyL0ZyYW1lTG9hZGVyLmg6CisKIDIwMDctMDctMjYgIEFuZGVycyBDYXJsc3NvbiAgPGFu
ZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBPbGl2ZXIgSHVudC4KSW5k
ZXg6IFdlYkNvcmUvaHRtbC9IVE1MVG9rZW5pemVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2h0bWwvSFRNTFRva2VuaXplci5jcHAJKHJldmlzaW9uIDI0NjQ3KQorKysgV2ViQ29yZS9odG1s
L0hUTUxUb2tlbml6ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAyLDcgKzE1MDIsNyBAQCB2
b2lkIEhUTUxUb2tlbml6ZXI6OnN0b3BQYXJzaW5nKCkKIAogYm9vbCBIVE1MVG9rZW5pemVyOjpw
cm9jZXNzaW5nRGF0YSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fdGltZXIuaXNBY3RpdmUoKTsK
KyAgICByZXR1cm4gbV90aW1lci5pc0FjdGl2ZSgpIHx8IGluV3JpdGU7CiB9CiAKIHZvaWQgSFRN
TFRva2VuaXplcjo6dGltZXJGaXJlZChUaW1lcjxIVE1MVG9rZW5pemVyPiopCkluZGV4OiBXZWJD
b3JlL2xvYWRlci9GcmFtZUxvYWRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9sb2FkZXIv
RnJhbWVMb2FkZXIuY3BwCShyZXZpc2lvbiAyNDY0NykKKysrIFdlYkNvcmUvbG9hZGVyL0ZyYW1l
TG9hZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMyLDYgKzIzMiw3IEBAIEZyYW1lTG9hZGVy
OjpGcmFtZUxvYWRlcihGcmFtZSogZnJhbWUsIEYKICAgICAsIG1fY29udGFpbnNQbHVnSW5zKGZh
bHNlKQogICAgICwgbV9yZWRpcmVjdGlvblRpbWVyKHRoaXMsICZGcmFtZUxvYWRlcjo6cmVkaXJl
Y3Rpb25UaW1lckZpcmVkKQogICAgICwgbV9jaGVja0NvbXBsZXRlZFRpbWVyKHRoaXMsICZGcmFt
ZUxvYWRlcjo6Y2hlY2tDb21wbGV0ZWRUaW1lckZpcmVkKQorICAgICwgbV9jaGVja0xvYWRDb21w
bGV0ZVRpbWVyKHRoaXMsICZGcmFtZUxvYWRlcjo6Y2hlY2tMb2FkQ29tcGxldGVUaW1lckZpcmVk
KQogICAgICwgbV9vcGVuZXIoMCkKICAgICAsIG1fb3BlbmVkQnlET00oZmFsc2UpCiAgICAgLCBt
X2NyZWF0aW5nSW5pdGlhbEVtcHR5RG9jdW1lbnQoZmFsc2UpCkBAIC0xMjExLDYgKzEyMTIsMTcg
QEAgdm9pZCBGcmFtZUxvYWRlcjo6c2NoZWR1bGVDaGVja0NvbXBsZXRlZAogICAgICAgICBtX2No
ZWNrQ29tcGxldGVkVGltZXIuc3RhcnRPbmVTaG90KDApOwogfQogCit2b2lkIEZyYW1lTG9hZGVy
OjpjaGVja0xvYWRDb21wbGV0ZVRpbWVyRmlyZWQoVGltZXI8RnJhbWVMb2FkZXI+KikKK3sKKyAg
ICBjaGVja0xvYWRDb21wbGV0ZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyOjpzY2hlZHVsZUNo
ZWNrTG9hZENvbXBsZXRlKCkKK3sKKyAgICBpZiAoIW1fY2hlY2tMb2FkQ29tcGxldGVUaW1lci5p
c0FjdGl2ZSgpKQorICAgICAgICBtX2NoZWNrTG9hZENvbXBsZXRlVGltZXIuc3RhcnRPbmVTaG90
KDApOworfQorCiB2b2lkIEZyYW1lTG9hZGVyOjpjaGVja0NhbGxJbXBsaWNpdENsb3NlKCkKIHsK
ICAgICBpZiAobV9kaWRDYWxsSW1wbGljaXRDbG9zZSB8fCAhbV9mcmFtZS0+ZG9jdW1lbnQoKSB8
fCBtX2ZyYW1lLT5kb2N1bWVudCgpLT5wYXJzaW5nKCkpCkBAIC0yMjU5LDggKzIyNzEsNyBAQCB2
b2lkIEZyYW1lTG9hZGVyOjpzdG9wQWxsTG9hZGVycygpCiB2b2lkIEZyYW1lTG9hZGVyOjpzdG9w
Rm9yVXNlckNhbmNlbCgpCiB7CiAgICAgc3RvcEFsbExvYWRlcnMoKTsKLSAgICBpZiAobV9mcmFt
ZS0+cGFnZSgpKQotICAgICAgICBjaGVja0xvYWRDb21wbGV0ZSgpOworICAgIHNjaGVkdWxlQ2hl
Y2tMb2FkQ29tcGxldGUoKTsKIH0KIAogdm9pZCBGcmFtZUxvYWRlcjo6Y2FuY2VsUGVuZGluZ0Fy
Y2hpdmVMb2FkKFJlc291cmNlTG9hZGVyKiBsb2FkZXIpCkluZGV4OiBXZWJDb3JlL2xvYWRlci9G
cmFtZUxvYWRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVyLmgJ
KHJldmlzaW9uIDI0NjQ3KQorKysgV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzc0LDYgKzM3NCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAg
dm9pZCBmaW5pc2hlZFBhcnNpbmcoKTsKICAgICAgICAgdm9pZCBjaGVja0NvbXBsZXRlZCgpOwog
ICAgICAgICB2b2lkIHNjaGVkdWxlQ2hlY2tDb21wbGV0ZWQoKTsKKyAgICAgICAgdm9pZCBzY2hl
ZHVsZUNoZWNrTG9hZENvbXBsZXRlKCk7CiAKICAgICAgICAgdm9pZCBjbGVhclJlY29yZGVkRm9y
bVZhbHVlcygpOwogICAgICAgICB2b2lkIHJlY29yZEZvcm1WYWx1ZShjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIFBhc3NSZWZQdHI8SFRNTEZvcm1FbGVtZW50Pik7CkBA
IC00NTYsNiArNDU3LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIAogICAgICAgICB2b2lk
IHJlZGlyZWN0aW9uVGltZXJGaXJlZChUaW1lcjxGcmFtZUxvYWRlcj4qKTsKICAgICAgICAgdm9p
ZCBjaGVja0NvbXBsZXRlZFRpbWVyRmlyZWQoVGltZXI8RnJhbWVMb2FkZXI+Kik7CisgICAgICAg
IHZvaWQgY2hlY2tMb2FkQ29tcGxldGVUaW1lckZpcmVkKFRpbWVyPEZyYW1lTG9hZGVyPiopOwog
CiAgICAgICAgIHZvaWQgY2FuY2VsUmVkaXJlY3Rpb24oYm9vbCBuZXdMb2FkSW5Qcm9ncmVzcyA9
IGZhbHNlKTsKIApAQCAtNjIzLDYgKzYyNSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAK
ICAgICAgICAgVGltZXI8RnJhbWVMb2FkZXI+IG1fcmVkaXJlY3Rpb25UaW1lcjsKICAgICAgICAg
VGltZXI8RnJhbWVMb2FkZXI+IG1fY2hlY2tDb21wbGV0ZWRUaW1lcjsKKyAgICAgICAgVGltZXI8
RnJhbWVMb2FkZXI+IG1fY2hlY2tMb2FkQ29tcGxldGVUaW1lcjsKIAogICAgICAgICBGcmFtZSog
bV9vcGVuZXI7CiAgICAgICAgIEhhc2hTZXQ8RnJhbWUqPiBtX29wZW5lZEZyYW1lczsKSW5kZXg6
IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VM
b2cJKHJldmlzaW9uIDI0NjQ5KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDMgKzEsMTEgQEAKKzIwMDctMDctMjYgIE1hdHQgUGVycnkgIDxtcENvbXBsZXRl
QGdtYWlsLmNvbT4KKworICAgICAgICBUZXN0IGZvciBodHRwOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNDc1NworICAgICAgICBIVE1MVG9rZW5pemVyOjpwcm9jZXNzaW5nRGF0
YSBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvcnJlY3QKKworICAgICAgICAqIGh0dHAvdGVzdHMvbG9h
ZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAg
KiBodHRwL3Rlc3RzL2xvYWRpbmcvc2xvdy1wYXJzaW5nLXN1YmZyYW1lLmh0bWw6IEFkZGVkLgor
CiAyMDA3LTA3LTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgSm9obiBTdWxsaXZhbi4KSW5kZXg6IExheW91dFRlc3RzL2h0dHAv
dGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUtZXhwZWN0ZWQudHh0Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJh
bWUtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9s
b2FkaW5nL3Nsb3ctcGFyc2luZy1zdWJmcmFtZS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTggQEAKK21haW4gZnJhbWUgLSBkaWRTdGFydFByb3Zpc2lvbmFsTG9hZEZvckZy
YW1lCitmcmFtZSAiZjEiIC0gd2lsbENsb3NlRnJhbWUKK21haW4gZnJhbWUgLSB3aWxsQ2xvc2VG
cmFtZQorbWFpbiBmcmFtZSAtIGRpZENvbW1pdExvYWRGb3JGcmFtZQorbWFpbiBmcmFtZSAtIGRp
ZENsZWFyV2luZG93T2JqZWN0Rm9yRnJhbWUKK2ZyYW1lICJmMSIgLSBkaWRDbGVhcldpbmRvd09i
amVjdEZvckZyYW1lCitmcmFtZSAiZjEiIC0gZGlkU3RhcnRQcm92aXNpb25hbExvYWRGb3JGcmFt
ZQorbWFpbiBmcmFtZSAtIGRpZEZpbmlzaERvY3VtZW50TG9hZEZvckZyYW1lCitmcmFtZSAiZjEi
IC0gd2lsbENsb3NlRnJhbWUKK2ZyYW1lICJmMSIgLSBkaWRDb21taXRMb2FkRm9yRnJhbWUKK2Zy
YW1lICJmMSIgLSBkaWRDbGVhcldpbmRvd09iamVjdEZvckZyYW1lCitmcmFtZSAiZjEiIC0gZGlk
SGFuZGxlT25sb2FkRXZlbnRzRm9yRnJhbWUKK21haW4gZnJhbWUgLSBkaWRIYW5kbGVPbmxvYWRF
dmVudHNGb3JGcmFtZQorZnJhbWUgImYxIiAtIGRpZEZpbmlzaERvY3VtZW50TG9hZEZvckZyYW1l
CitmcmFtZSAiZjEiIC0gZGlkRmluaXNoTG9hZEZvckZyYW1lCittYWluIGZyYW1lIC0gZGlkRmlu
aXNoTG9hZEZvckZyYW1lCitUaGlzIHRlc3RzIHRoYXQgd2UgZ2V0IGZyYW1lIGxvYWQgY2FsbGJh
Y2tzIGluIHRoZSBwcm9wZXIgb3JkZXIgd2hlbiBhIHN1YmZyYW1lIGlzIHBhcnNlZCBhbmQgY3Jl
YXRlZCBmcm9tIHdpdGhpbiBhIHRpbWVyIGNhbGxiYWNrLiAgCisKSW5kZXg6IExheW91dFRlc3Rz
L2h0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvYWRpbmcvc2xvdy1wYXJzaW5nLXN1YmZyYW1l
Lmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvYWRpbmcvc2xv
dy1wYXJzaW5nLXN1YmZyYW1lLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjUgQEAKKzxo
dG1sPgorPHNjcmlwdD4KKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7Cisg
ICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorPC9zY3JpcHQ+Cis8Ym9keT4KK1Ro
aXMgdGVzdHMgdGhhdCB3ZSBnZXQgZnJhbWUgbG9hZCBjYWxsYmFja3MgaW4gdGhlIHByb3BlciBv
cmRlciB3aGVuIGEgc3ViZnJhbWUKK2lzIHBhcnNlZCBhbmQgY3JlYXRlZCBmcm9tIHdpdGhpbiBh
IHRpbWVyIGNhbGxiYWNrLgorPHNjcmlwdD4KKyAgLy8gRm9yY2UgYSBzbGVlcCBmb3IgMSBzZWNv
bmQsIHRvIG1ha2Ugc3VyZSB0aGUgcmVzdCBvZiB0aGUgcGFyc2luZyBpcyBkb25lCisgIC8vIHZp
YSBhIHRpbWVyLgorICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpCisgIHZhciBzdGFydE1TID0gc3Rh
cnQuZ2V0VGltZSgpCisgIHdoaWxlICh0cnVlKSB7CisgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkK
KyAgICBpZiAobm93LmdldFRpbWUoKSAtIHN0YXJ0TVMgPiAxMDAwKSB7CisgICAgICBicmVhazsK
KyAgICB9CisgIH0KKzwvc2NyaXB0PgorPGlmcmFtZSBuYW1lPSJmMSIgc3JjPSJodHRwOi8vMTI3
LjAuMC4xOjgwMDAvbWlzYy9yZXNvdXJjZXMvMjAwLmh0bWwiPjwvaWZyYW1lPjxicj4KKzwvYm9k
eT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>15709</attachid>
            <date>2007-07-27 14:09:59 -0700</date>
            <delta_ts>2007-08-19 23:09:59 -0700</delta_ts>
            <desc>patch with assertion fix</desc>
            <filename>tokenizer-6.patch</filename>
            <type>text/plain</type>
            <size>7263</size>
            <attacher name="Matt Perry">mpComplete</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyNDczOSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDctMDctMjYgIE1hdHQgUGVycnkgIDxtcENvbXBsZXRlQGdtYWls
LmNvbT4KKworICAgICAgICBGaXggZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NzU3CisgICAgICAgIEhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhIGltcGxl
bWVudGF0aW9uIGlzIGluY29ycmVjdAorCisgICAgICAgICogaHRtbC9IVE1MVG9rZW5pemVyLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhKTogTWFk
ZSBpdCBhbHNvIHJldHVybiB0cnVlIGlmIHRoZSBIVE1MVG9rZW5pemVyIHdhcyBpbnNpZGUgdGhl
IHdyaXRlKCkgY2FsbC4KKyAgICAgICAgKiBsb2FkZXIvRnJhbWVMb2FkZXIuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6RnJhbWVMb2FkZXI6OkZyYW1lTG9hZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkZyYW1lTG9hZGVyOjpjaGVja0xvYWRDb21wbGV0ZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6RnJhbWVMb2FkZXI6OnNjaGVkdWxlQ2hlY2tMb2FkQ29tcGxldGUpOgorICAgICAgICAo
V2ViQ29yZTo6RnJhbWVMb2FkZXI6OnN0b3BGb3JVc2VyQ2FuY2VsKTogQ2hhbmdlZCBhIGNhbGwg
dG8gY2hlY2tMb2FkQ29tcGxldGUgdG8gYmUgYXN5bmNocm9ub3VzLCBzaW5jZQorICAgICAgICBz
dG9wRm9yVXNlckNhbmNlbCBjYW4gYmUgY2FsbGVkIHdoaWxlIHBhcnNpbmcuCisgICAgICAgICog
bG9hZGVyL0ZyYW1lTG9hZGVyLmg6CisKIDIwMDctMDctMjcgIExhcnMgS25vbGwgPGxhcnNAdHJv
bGx0ZWNoLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBaYWNrCkluZGV4OiBXZWJDb3JlL2h0
bWwvSFRNTFRva2VuaXplci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxUb2tl
bml6ZXIuY3BwCShyZXZpc2lvbiAyNDczOSkKKysrIFdlYkNvcmUvaHRtbC9IVE1MVG9rZW5pemVy
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTUwMiw3ICsxNTAyLDcgQEAgdm9pZCBIVE1MVG9rZW5p
emVyOjpzdG9wUGFyc2luZygpCiAKIGJvb2wgSFRNTFRva2VuaXplcjo6cHJvY2Vzc2luZ0RhdGEo
KSBjb25zdAogewotICAgIHJldHVybiBtX3RpbWVyLmlzQWN0aXZlKCk7CisgICAgcmV0dXJuIG1f
dGltZXIuaXNBY3RpdmUoKSB8fCBpbldyaXRlOwogfQogCiB2b2lkIEhUTUxUb2tlbml6ZXI6OnRp
bWVyRmlyZWQoVGltZXI8SFRNTFRva2VuaXplcj4qKQpJbmRleDogV2ViQ29yZS9sb2FkZXIvRnJh
bWVMb2FkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVyLmNw
cAkocmV2aXNpb24gMjQ3MzkpCisrKyBXZWJDb3JlL2xvYWRlci9GcmFtZUxvYWRlci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTIzMiw2ICsyMzIsNyBAQCBGcmFtZUxvYWRlcjo6RnJhbWVMb2FkZXIo
RnJhbWUqIGZyYW1lLCBGCiAgICAgLCBtX2NvbnRhaW5zUGx1Z0lucyhmYWxzZSkKICAgICAsIG1f
cmVkaXJlY3Rpb25UaW1lcih0aGlzLCAmRnJhbWVMb2FkZXI6OnJlZGlyZWN0aW9uVGltZXJGaXJl
ZCkKICAgICAsIG1fY2hlY2tDb21wbGV0ZWRUaW1lcih0aGlzLCAmRnJhbWVMb2FkZXI6OmNoZWNr
Q29tcGxldGVkVGltZXJGaXJlZCkKKyAgICAsIG1fY2hlY2tMb2FkQ29tcGxldGVUaW1lcih0aGlz
LCAmRnJhbWVMb2FkZXI6OmNoZWNrTG9hZENvbXBsZXRlVGltZXJGaXJlZCkKICAgICAsIG1fb3Bl
bmVyKDApCiAgICAgLCBtX29wZW5lZEJ5RE9NKGZhbHNlKQogICAgICwgbV9jcmVhdGluZ0luaXRp
YWxFbXB0eURvY3VtZW50KGZhbHNlKQpAQCAtODA4LDYgKzgwOSw3IEBAIHZvaWQgRnJhbWVMb2Fk
ZXI6OmNsZWFyKGJvb2wgY2xlYXJXaW5kb3cKICAgICBtX3NjaGVkdWxlZFJlZGlyZWN0aW9uLmNs
ZWFyKCk7CiAKICAgICBtX2NoZWNrQ29tcGxldGVkVGltZXIuc3RvcCgpOworICAgIG1fY2hlY2tM
b2FkQ29tcGxldGVUaW1lci5zdG9wKCk7CiAKICAgICBtX3JlY2VpdmVkRGF0YSA9IGZhbHNlOwog
CkBAIC0xMjExLDYgKzEyMTMsMTggQEAgdm9pZCBGcmFtZUxvYWRlcjo6c2NoZWR1bGVDaGVja0Nv
bXBsZXRlZAogICAgICAgICBtX2NoZWNrQ29tcGxldGVkVGltZXIuc3RhcnRPbmVTaG90KDApOwog
fQogCit2b2lkIEZyYW1lTG9hZGVyOjpjaGVja0xvYWRDb21wbGV0ZVRpbWVyRmlyZWQoVGltZXI8
RnJhbWVMb2FkZXI+KikKK3sKKyAgICBpZiAobV9mcmFtZS0+cGFnZSgpKQorICAgICAgICBjaGVj
a0xvYWRDb21wbGV0ZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyOjpzY2hlZHVsZUNoZWNrTG9h
ZENvbXBsZXRlKCkKK3sKKyAgICBpZiAoIW1fY2hlY2tMb2FkQ29tcGxldGVUaW1lci5pc0FjdGl2
ZSgpKQorICAgICAgICBtX2NoZWNrTG9hZENvbXBsZXRlVGltZXIuc3RhcnRPbmVTaG90KDApOwor
fQorCiB2b2lkIEZyYW1lTG9hZGVyOjpjaGVja0NhbGxJbXBsaWNpdENsb3NlKCkKIHsKICAgICBp
ZiAobV9kaWRDYWxsSW1wbGljaXRDbG9zZSB8fCAhbV9mcmFtZS0+ZG9jdW1lbnQoKSB8fCBtX2Zy
YW1lLT5kb2N1bWVudCgpLT5wYXJzaW5nKCkpCkluZGV4OiBXZWJDb3JlL2xvYWRlci9GcmFtZUxv
YWRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVyLmgJKHJldmlz
aW9uIDI0NzM5KQorKysgV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuaAkod29ya2luZyBjb3B5
KQpAQCAtMzc0LDYgKzM3NCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdm9pZCBm
aW5pc2hlZFBhcnNpbmcoKTsKICAgICAgICAgdm9pZCBjaGVja0NvbXBsZXRlZCgpOwogICAgICAg
ICB2b2lkIHNjaGVkdWxlQ2hlY2tDb21wbGV0ZWQoKTsKKyAgICAgICAgdm9pZCBzY2hlZHVsZUNo
ZWNrTG9hZENvbXBsZXRlKCk7CiAKICAgICAgICAgdm9pZCBjbGVhclJlY29yZGVkRm9ybVZhbHVl
cygpOwogICAgICAgICB2b2lkIHJlY29yZEZvcm1WYWx1ZShjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgdmFsdWUsIFBhc3NSZWZQdHI8SFRNTEZvcm1FbGVtZW50Pik7CkBAIC00NTYs
NiArNDU3LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIAogICAgICAgICB2b2lkIHJlZGly
ZWN0aW9uVGltZXJGaXJlZChUaW1lcjxGcmFtZUxvYWRlcj4qKTsKICAgICAgICAgdm9pZCBjaGVj
a0NvbXBsZXRlZFRpbWVyRmlyZWQoVGltZXI8RnJhbWVMb2FkZXI+Kik7CisgICAgICAgIHZvaWQg
Y2hlY2tMb2FkQ29tcGxldGVUaW1lckZpcmVkKFRpbWVyPEZyYW1lTG9hZGVyPiopOwogCiAgICAg
ICAgIHZvaWQgY2FuY2VsUmVkaXJlY3Rpb24oYm9vbCBuZXdMb2FkSW5Qcm9ncmVzcyA9IGZhbHNl
KTsKIApAQCAtNjIzLDYgKzYyNSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAKICAgICAg
ICAgVGltZXI8RnJhbWVMb2FkZXI+IG1fcmVkaXJlY3Rpb25UaW1lcjsKICAgICAgICAgVGltZXI8
RnJhbWVMb2FkZXI+IG1fY2hlY2tDb21wbGV0ZWRUaW1lcjsKKyAgICAgICAgVGltZXI8RnJhbWVM
b2FkZXI+IG1fY2hlY2tMb2FkQ29tcGxldGVUaW1lcjsKIAogICAgICAgICBGcmFtZSogbV9vcGVu
ZXI7CiAgICAgICAgIEhhc2hTZXQ8RnJhbWUqPiBtX29wZW5lZEZyYW1lczsKSW5kZXg6IFdlYkNv
cmUvcGFnZS9ET01XaW5kb3cuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9ET01XaW5k
b3cuY3BwCShyZXZpc2lvbiAyNDczOSkKKysrIFdlYkNvcmUvcGFnZS9ET01XaW5kb3cuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yMTksNyArMjE5LDEwIEBAIHZvaWQgRE9NV2luZG93OjpzdG9wKCkK
ICAgICBpZiAoIW1fZnJhbWUpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fZnJhbWUtPmxvYWRl
cigpLT5zdG9wRm9yVXNlckNhbmNlbCgpOworICAgIC8vIFdlIG11c3QgY2hlY2sgd2hldGhlciB0
aGUgbG9hZCBpcyBjb21wbGV0ZSBhc3luY2hyb25vdXNseSwgYmVjYXVzZSB3ZSBtaWdodCBzdGls
bCBiZSBwYXJzaW5nCisgICAgLy8gdGhlIGRvY3VtZW50IHVudGlsIHRoZSBjYWxsc3RhY2sgdW53
aW5kcy4KKyAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+c3RvcEFsbExvYWRlcnMoKTsKKyAgICBtX2Zy
YW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVDaGVja0xvYWRDb21wbGV0ZSgpOwogfQogCiB2b2lkIERP
TVdpbmRvdzo6YWxlcnQoY29uc3QgU3RyaW5nJiBtZXNzYWdlKQpJbmRleDogTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24g
MjQ3MzkpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyAr
MSwxMSBAQAorMjAwNy0wNy0yNiAgTWF0dCBQZXJyeSAgPG1wQ29tcGxldGVAZ21haWwuY29tPgor
CisgICAgICAgIFRlc3QgZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTE0NzU3CisgICAgICAgIEhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhIGltcGxlbWVudGF0
aW9uIGlzIGluY29ycmVjdAorCisgICAgICAgICogaHR0cC90ZXN0cy9sb2FkaW5nL3Nsb3ctcGFy
c2luZy1zdWJmcmFtZS1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGh0dHAvdGVzdHMv
bG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUuaHRtbDogQWRkZWQuCisKIDIwMDctMDctMjYg
IERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAgICAgICAgICogaHR0cC90ZXN0cy9z
ZWN1cml0eS9jcm9zcy1mcmFtZS1hY2Nlc3MtcHV0LWV4cGVjdGVkLnR4dDoKSW5kZXg6IExheW91
dFRlc3RzL2h0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUtZXhwZWN0ZWQu
dHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBh
cnNpbmctc3ViZnJhbWUtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMv
aHR0cC90ZXN0cy9sb2FkaW5nL3Nsb3ctcGFyc2luZy1zdWJmcmFtZS1leHBlY3RlZC50eHQJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsMTggQEAKK21haW4gZnJhbWUgLSBkaWRTdGFydFByb3Zpc2lv
bmFsTG9hZEZvckZyYW1lCitmcmFtZSAiZjEiIC0gd2lsbENsb3NlRnJhbWUKK21haW4gZnJhbWUg
LSB3aWxsQ2xvc2VGcmFtZQorbWFpbiBmcmFtZSAtIGRpZENvbW1pdExvYWRGb3JGcmFtZQorbWFp
biBmcmFtZSAtIGRpZENsZWFyV2luZG93T2JqZWN0Rm9yRnJhbWUKK2ZyYW1lICJmMSIgLSBkaWRD
bGVhcldpbmRvd09iamVjdEZvckZyYW1lCitmcmFtZSAiZjEiIC0gZGlkU3RhcnRQcm92aXNpb25h
bExvYWRGb3JGcmFtZQorbWFpbiBmcmFtZSAtIGRpZEZpbmlzaERvY3VtZW50TG9hZEZvckZyYW1l
CitmcmFtZSAiZjEiIC0gd2lsbENsb3NlRnJhbWUKK2ZyYW1lICJmMSIgLSBkaWRDb21taXRMb2Fk
Rm9yRnJhbWUKK2ZyYW1lICJmMSIgLSBkaWRDbGVhcldpbmRvd09iamVjdEZvckZyYW1lCitmcmFt
ZSAiZjEiIC0gZGlkSGFuZGxlT25sb2FkRXZlbnRzRm9yRnJhbWUKK21haW4gZnJhbWUgLSBkaWRI
YW5kbGVPbmxvYWRFdmVudHNGb3JGcmFtZQorZnJhbWUgImYxIiAtIGRpZEZpbmlzaERvY3VtZW50
TG9hZEZvckZyYW1lCitmcmFtZSAiZjEiIC0gZGlkRmluaXNoTG9hZEZvckZyYW1lCittYWluIGZy
YW1lIC0gZGlkRmluaXNoTG9hZEZvckZyYW1lCitUaGlzIHRlc3RzIHRoYXQgd2UgZ2V0IGZyYW1l
IGxvYWQgY2FsbGJhY2tzIGluIHRoZSBwcm9wZXIgb3JkZXIgd2hlbiBhIHN1YmZyYW1lIGlzIHBh
cnNlZCBhbmQgY3JlYXRlZCBmcm9tIHdpdGhpbiBhIHRpbWVyIGNhbGxiYWNrLiAgCisKSW5kZXg6
IExheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUuaHRt
bAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvYWRpbmcvc2xvdy1wYXJz
aW5nLXN1YmZyYW1lLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9odHRwL3Rlc3Rz
L2xvYWRpbmcvc2xvdy1wYXJzaW5nLXN1YmZyYW1lLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMjUgQEAKKzxodG1sPgorPHNjcmlwdD4KKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250
cm9sbGVyKSB7CisgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAg
ICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorPC9zY3JpcHQ+
Cis8Ym9keT4KK1RoaXMgdGVzdHMgdGhhdCB3ZSBnZXQgZnJhbWUgbG9hZCBjYWxsYmFja3MgaW4g
dGhlIHByb3BlciBvcmRlciB3aGVuIGEgc3ViZnJhbWUKK2lzIHBhcnNlZCBhbmQgY3JlYXRlZCBm
cm9tIHdpdGhpbiBhIHRpbWVyIGNhbGxiYWNrLgorPHNjcmlwdD4KKyAgLy8gRm9yY2UgYSBzbGVl
cCBmb3IgMSBzZWNvbmQsIHRvIG1ha2Ugc3VyZSB0aGUgcmVzdCBvZiB0aGUgcGFyc2luZyBpcyBk
b25lCisgIC8vIHZpYSBhIHRpbWVyLgorICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpCisgIHZhciBz
dGFydE1TID0gc3RhcnQuZ2V0VGltZSgpCisgIHdoaWxlICh0cnVlKSB7CisgICAgdmFyIG5vdyA9
IG5ldyBEYXRlKCkKKyAgICBpZiAobm93LmdldFRpbWUoKSAtIHN0YXJ0TVMgPiAxMDAwKSB7Cisg
ICAgICBicmVhazsKKyAgICB9CisgIH0KKzwvc2NyaXB0PgorPGlmcmFtZSBuYW1lPSJmMSIgc3Jj
PSJodHRwOi8vMTI3LjAuMC4xOjgwMDAvbWlzYy9yZXNvdXJjZXMvMjAwLmh0bWwiPjwvaWZyYW1l
Pjxicj4KKzwvYm9keT4KKzwvaHRtbD4K
</data>
<flag name="review"
          id="6550"
          type_id="1"
          status="-"
          setter="beidson"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>15763</attachid>
            <date>2007-07-31 13:00:01 -0700</date>
            <delta_ts>2007-07-31 13:16:43 -0700</delta_ts>
            <desc>Final patch with tweak I suggested to previous patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>9083</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">SW5kZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJh
bWUtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9h
ZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9sb2FkaW5nL3Nsb3ctcGFyc2luZy1zdWJmcmFtZS1leHBl
Y3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTggQEAKK21haW4gZnJhbWUgLSBkaWRT
dGFydFByb3Zpc2lvbmFsTG9hZEZvckZyYW1lCitmcmFtZSAiZjEiIC0gd2lsbENsb3NlRnJhbWUK
K21haW4gZnJhbWUgLSB3aWxsQ2xvc2VGcmFtZQorbWFpbiBmcmFtZSAtIGRpZENvbW1pdExvYWRG
b3JGcmFtZQorbWFpbiBmcmFtZSAtIGRpZENsZWFyV2luZG93T2JqZWN0Rm9yRnJhbWUKK2ZyYW1l
ICJmMSIgLSBkaWRDbGVhcldpbmRvd09iamVjdEZvckZyYW1lCitmcmFtZSAiZjEiIC0gZGlkU3Rh
cnRQcm92aXNpb25hbExvYWRGb3JGcmFtZQorbWFpbiBmcmFtZSAtIGRpZEZpbmlzaERvY3VtZW50
TG9hZEZvckZyYW1lCitmcmFtZSAiZjEiIC0gd2lsbENsb3NlRnJhbWUKK2ZyYW1lICJmMSIgLSBk
aWRDb21taXRMb2FkRm9yRnJhbWUKK2ZyYW1lICJmMSIgLSBkaWRDbGVhcldpbmRvd09iamVjdEZv
ckZyYW1lCitmcmFtZSAiZjEiIC0gZGlkSGFuZGxlT25sb2FkRXZlbnRzRm9yRnJhbWUKK21haW4g
ZnJhbWUgLSBkaWRIYW5kbGVPbmxvYWRFdmVudHNGb3JGcmFtZQorZnJhbWUgImYxIiAtIGRpZEZp
bmlzaERvY3VtZW50TG9hZEZvckZyYW1lCitmcmFtZSAiZjEiIC0gZGlkRmluaXNoTG9hZEZvckZy
YW1lCittYWluIGZyYW1lIC0gZGlkRmluaXNoTG9hZEZvckZyYW1lCitUaGlzIHRlc3RzIHRoYXQg
d2UgZ2V0IGZyYW1lIGxvYWQgY2FsbGJhY2tzIGluIHRoZSBwcm9wZXIgb3JkZXIgd2hlbiBhIHN1
YmZyYW1lIGlzIHBhcnNlZCBhbmQgY3JlYXRlZCBmcm9tIHdpdGhpbiBhIHRpbWVyIGNhbGxiYWNr
LiAgCisKSW5kZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmct
c3ViZnJhbWUuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2xvYWRp
bmcvc2xvdy1wYXJzaW5nLXN1YmZyYW1lLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9odHRwL3Rlc3RzL2xvYWRpbmcvc2xvdy1wYXJzaW5nLXN1YmZyYW1lLmh0bWwJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMjUgQEAKKzxodG1sPgorPHNjcmlwdD4KKyAgICBpZiAod2luZG93Lmxh
eW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNU
ZXh0KCk7CisgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAg
fQorPC9zY3JpcHQ+Cis8Ym9keT4KK1RoaXMgdGVzdHMgdGhhdCB3ZSBnZXQgZnJhbWUgbG9hZCBj
YWxsYmFja3MgaW4gdGhlIHByb3BlciBvcmRlciB3aGVuIGEgc3ViZnJhbWUKK2lzIHBhcnNlZCBh
bmQgY3JlYXRlZCBmcm9tIHdpdGhpbiBhIHRpbWVyIGNhbGxiYWNrLgorPHNjcmlwdD4KKyAgLy8g
Rm9yY2UgYSBzbGVlcCBmb3IgMSBzZWNvbmQsIHRvIG1ha2Ugc3VyZSB0aGUgcmVzdCBvZiB0aGUg
cGFyc2luZyBpcyBkb25lCisgIC8vIHZpYSBhIHRpbWVyLgorICB2YXIgc3RhcnQgPSBuZXcgRGF0
ZSgpCisgIHZhciBzdGFydE1TID0gc3RhcnQuZ2V0VGltZSgpCisgIHdoaWxlICh0cnVlKSB7Cisg
ICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkKKyAgICBpZiAobm93LmdldFRpbWUoKSAtIHN0YXJ0TVMg
PiAxMDAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKzwvc2NyaXB0PgorPGlmcmFtZSBu
YW1lPSJmMSIgc3JjPSJodHRwOi8vMTI3LjAuMC4xOjgwMDAvbWlzYy9yZXNvdXJjZXMvMjAwLmh0
bWwiPjwvaWZyYW1lPjxicj4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0
NzkyKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEs
MTMgQEAKKzIwMDctMDctMzEgIE1hdHQgUGVycnkgIDxtcENvbXBsZXRlQGdtYWlsLmNvbT4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBCcmFkeQorCisgICAgICAgIFRlc3QgZm9yIGh0dHA6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NzU3CisgICAgICAgIEhUTUxUb2tlbml6ZXI6
OnByb2Nlc3NpbmdEYXRhIGltcGxlbWVudGF0aW9uIGlzIGluY29ycmVjdAorCisgICAgICAgICog
aHR0cC90ZXN0cy9sb2FkaW5nL3Nsb3ctcGFyc2luZy1zdWJmcmFtZS1leHBlY3RlZC50eHQ6IEFk
ZGVkLgorICAgICAgICAqIGh0dHAvdGVzdHMvbG9hZGluZy9zbG93LXBhcnNpbmctc3ViZnJhbWUu
aHRtbDogQWRkZWQuCisKIDIwMDctMDctMzAgIEp1c3RpbiBHYXJjaWEgIDxqdXN0aW4uZ2FyY2lh
QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbi4KSW5kZXg6IFdlYkNvcmUv
Q2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAyNDc5
MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMDctMDctMzEgIE1hdHQgUGVycnkgIDxtcENvbXBsZXRlQGdtYWlsLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBCcmFkeSBhbmQgPz8/CisKKyAgICAgICAgRml4IGZvciBodHRwOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDc1NyBhbmQgPHJkYXI6Ly9wcm9ibGVtLzUz
NjQ2OTI+CisgICAgICAgIEhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhIGltcGxlbWVudGF0
aW9uIGlzIGluY29ycmVjdAorCisgICAgICAgICogaHRtbC9IVE1MVG9rZW5pemVyLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxUb2tlbml6ZXI6OnByb2Nlc3NpbmdEYXRhKTogTWFkZSBpdCBh
bHNvIHJldHVybiB0cnVlIGlmIHRoZSBIVE1MVG9rZW5pemVyIHdhcyBpbnNpZGUgdGhlIHdyaXRl
KCkgY2FsbC4KKyAgICAgICAgKiBsb2FkZXIvRnJhbWVMb2FkZXIuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6RnJhbWVMb2FkZXI6OkZyYW1lTG9hZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1l
TG9hZGVyOjpjaGVja0xvYWRDb21wbGV0ZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6
RnJhbWVMb2FkZXI6OnNjaGVkdWxlQ2hlY2tMb2FkQ29tcGxldGUpOgorICAgICAgICAoV2ViQ29y
ZTo6RnJhbWVMb2FkZXI6OnN0b3BGb3JVc2VyQ2FuY2VsKTogQ2hhbmdlZCBhIGNhbGwgdG8gY2hl
Y2tMb2FkQ29tcGxldGUgdG8gYmUgYXN5bmNocm9ub3VzLCBzaW5jZQorICAgICAgICBzdG9wRm9y
VXNlckNhbmNlbCBjYW4gYmUgY2FsbGVkIHdoaWxlIHBhcnNpbmcuCisgICAgICAgICogbG9hZGVy
L0ZyYW1lTG9hZGVyLmg6CisKIDIwMDctMDctMzAgIEp1c3RpbiBHYXJjaWEgIDxqdXN0aW4uZ2Fy
Y2lhQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbi4KSW5kZXg6IFdlYkNv
cmUvbG9hZGVyL0ZyYW1lTG9hZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2xvYWRlci9G
cmFtZUxvYWRlci5jcHAJKHJldmlzaW9uIDI0NzkyKQorKysgV2ViQ29yZS9sb2FkZXIvRnJhbWVM
b2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMzIsNiArMjMyLDcgQEAKICAgICAsIG1fY29u
dGFpbnNQbHVnSW5zKGZhbHNlKQogICAgICwgbV9yZWRpcmVjdGlvblRpbWVyKHRoaXMsICZGcmFt
ZUxvYWRlcjo6cmVkaXJlY3Rpb25UaW1lckZpcmVkKQogICAgICwgbV9jaGVja0NvbXBsZXRlZFRp
bWVyKHRoaXMsICZGcmFtZUxvYWRlcjo6Y2hlY2tDb21wbGV0ZWRUaW1lckZpcmVkKQorICAgICwg
bV9jaGVja0xvYWRDb21wbGV0ZVRpbWVyKHRoaXMsICZGcmFtZUxvYWRlcjo6Y2hlY2tMb2FkQ29t
cGxldGVUaW1lckZpcmVkKQogICAgICwgbV9vcGVuZXIoMCkKICAgICAsIG1fb3BlbmVkQnlET00o
ZmFsc2UpCiAgICAgLCBtX2NyZWF0aW5nSW5pdGlhbEVtcHR5RG9jdW1lbnQoZmFsc2UpCkBAIC04
MDgsNiArODA5LDcgQEAKICAgICBtX3NjaGVkdWxlZFJlZGlyZWN0aW9uLmNsZWFyKCk7CiAKICAg
ICBtX2NoZWNrQ29tcGxldGVkVGltZXIuc3RvcCgpOworICAgIG1fY2hlY2tMb2FkQ29tcGxldGVU
aW1lci5zdG9wKCk7CiAKICAgICBtX3JlY2VpdmVkRGF0YSA9IGZhbHNlOwogCkBAIC0xMjExLDYg
KzEyMTMsMTggQEAKICAgICAgICAgbV9jaGVja0NvbXBsZXRlZFRpbWVyLnN0YXJ0T25lU2hvdCgw
KTsKIH0KIAordm9pZCBGcmFtZUxvYWRlcjo6Y2hlY2tMb2FkQ29tcGxldGVUaW1lckZpcmVkKFRp
bWVyPEZyYW1lTG9hZGVyPiopCit7CisgICAgaWYgKG1fZnJhbWUtPnBhZ2UoKSkKKyAgICAgICAg
Y2hlY2tMb2FkQ29tcGxldGUoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlcjo6c2NoZWR1bGVDaGVj
a0xvYWRDb21wbGV0ZSgpCit7CisgICAgaWYgKCFtX2NoZWNrTG9hZENvbXBsZXRlVGltZXIuaXNB
Y3RpdmUoKSkKKyAgICAgICAgbV9jaGVja0xvYWRDb21wbGV0ZVRpbWVyLnN0YXJ0T25lU2hvdCgw
KTsKK30KKwogdm9pZCBGcmFtZUxvYWRlcjo6Y2hlY2tDYWxsSW1wbGljaXRDbG9zZSgpCiB7CiAg
ICAgaWYgKG1fZGlkQ2FsbEltcGxpY2l0Q2xvc2UgfHwgIW1fZnJhbWUtPmRvY3VtZW50KCkgfHwg
bV9mcmFtZS0+ZG9jdW1lbnQoKS0+cGFyc2luZygpKQpAQCAtMjI2MSwxMSArMjI3NSwxNiBAQAog
ICAgIG1faW5TdG9wQWxsTG9hZGVycyA9IGZhbHNlOyAgICAKIH0KIAotdm9pZCBGcmFtZUxvYWRl
cjo6c3RvcEZvclVzZXJDYW5jZWwoKQordm9pZCBGcmFtZUxvYWRlcjo6c3RvcEZvclVzZXJDYW5j
ZWwoYm9vbCBhc3luY2hyb25vdXMpCiB7CiAgICAgc3RvcEFsbExvYWRlcnMoKTsKLSAgICBpZiAo
bV9mcmFtZS0+cGFnZSgpKQotICAgICAgICBjaGVja0xvYWRDb21wbGV0ZSgpOworICAgIAorICAg
IGlmIChtX2ZyYW1lLT5wYWdlKCkpIHsKKyAgICAgICAgaWYgKGFzeW5jaHJvbm91cykKKyAgICAg
ICAgICAgIHNjaGVkdWxlQ2hlY2tMb2FkQ29tcGxldGUoKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgY2hlY2tMb2FkQ29tcGxldGUoKTsKKyAgICB9CiB9CiAKIHZvaWQgRnJhbWVMb2FkZXI6
OmNhbmNlbFBlbmRpbmdBcmNoaXZlTG9hZChSZXNvdXJjZUxvYWRlciogbG9hZGVyKQpJbmRleDog
V2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2xvYWRl
ci9GcmFtZUxvYWRlci5oCShyZXZpc2lvbiAyNDc5MikKKysrIFdlYkNvcmUvbG9hZGVyL0ZyYW1l
TG9hZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiAgICAgICAgIC8v
IEFsc28gbm90IGNvb2wuCiAgICAgICAgIHZvaWQgc3RvcEFsbExvYWRlcnMoKTsKLSAgICAgICAg
dm9pZCBzdG9wRm9yVXNlckNhbmNlbCgpOworICAgICAgICB2b2lkIHN0b3BGb3JVc2VyQ2FuY2Vs
KGJvb2wgYXN5bmNocm9ub3VzID0gZmFsc2UpOwogICAgICAgICB2b2lkIGNhbmNlbFBlbmRpbmdB
cmNoaXZlTG9hZChSZXNvdXJjZUxvYWRlciopOwogCiAgICAgICAgIGJvb2wgaXNMb2FkaW5nTWFp
blJlc291cmNlKCkgY29uc3QgeyByZXR1cm4gbV9pc0xvYWRpbmdNYWluUmVzb3VyY2U7IH0KQEAg
LTM3NCw2ICszNzQsNyBAQAogICAgICAgICB2b2lkIGZpbmlzaGVkUGFyc2luZygpOwogICAgICAg
ICB2b2lkIGNoZWNrQ29tcGxldGVkKCk7CiAgICAgICAgIHZvaWQgc2NoZWR1bGVDaGVja0NvbXBs
ZXRlZCgpOworICAgICAgICB2b2lkIHNjaGVkdWxlQ2hlY2tMb2FkQ29tcGxldGUoKTsKIAogICAg
ICAgICB2b2lkIGNsZWFyUmVjb3JkZWRGb3JtVmFsdWVzKCk7CiAgICAgICAgIHZvaWQgcmVjb3Jk
Rm9ybVZhbHVlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgUGFzc1Jl
ZlB0cjxIVE1MRm9ybUVsZW1lbnQ+KTsKQEAgLTQ1Niw2ICs0NTcsNyBAQAogICAgIAogICAgICAg
ICB2b2lkIHJlZGlyZWN0aW9uVGltZXJGaXJlZChUaW1lcjxGcmFtZUxvYWRlcj4qKTsKICAgICAg
ICAgdm9pZCBjaGVja0NvbXBsZXRlZFRpbWVyRmlyZWQoVGltZXI8RnJhbWVMb2FkZXI+Kik7Cisg
ICAgICAgIHZvaWQgY2hlY2tMb2FkQ29tcGxldGVUaW1lckZpcmVkKFRpbWVyPEZyYW1lTG9hZGVy
PiopOwogCiAgICAgICAgIHZvaWQgY2FuY2VsUmVkaXJlY3Rpb24oYm9vbCBuZXdMb2FkSW5Qcm9n
cmVzcyA9IGZhbHNlKTsKIApAQCAtNjIzLDYgKzYyNSw3IEBACiAgICAgCiAgICAgICAgIFRpbWVy
PEZyYW1lTG9hZGVyPiBtX3JlZGlyZWN0aW9uVGltZXI7CiAgICAgICAgIFRpbWVyPEZyYW1lTG9h
ZGVyPiBtX2NoZWNrQ29tcGxldGVkVGltZXI7CisgICAgICAgIFRpbWVyPEZyYW1lTG9hZGVyPiBt
X2NoZWNrTG9hZENvbXBsZXRlVGltZXI7CiAKICAgICAgICAgRnJhbWUqIG1fb3BlbmVyOwogICAg
ICAgICBIYXNoU2V0PEZyYW1lKj4gbV9vcGVuZWRGcmFtZXM7CkluZGV4OiBXZWJDb3JlL3BhZ2Uv
RE9NV2luZG93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNwcAko
cmV2aXNpb24gMjQ3OTIpCisrKyBXZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjE5LDcgKzIxOSw5IEBACiAgICAgaWYgKCFtX2ZyYW1lKQogICAgICAgICByZXR1
cm47CiAKLSAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+c3RvcEZvclVzZXJDYW5jZWwoKTsKKyAgICAv
LyBXZSBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIGxvYWQgaXMgY29tcGxldGUgYXN5bmNocm9ub3Vz
bHksIGJlY2F1c2Ugd2UgbWlnaHQgc3RpbGwgYmUgcGFyc2luZworICAgIC8vIHRoZSBkb2N1bWVu
dCB1bnRpbCB0aGUgY2FsbHN0YWNrIHVud2luZHMuCisgICAgbV9mcmFtZS0+bG9hZGVyKCktPnN0
b3BGb3JVc2VyQ2FuY2VsKHRydWUpOwogfQogCiB2b2lkIERPTVdpbmRvdzo6YWxlcnQoY29uc3Qg
U3RyaW5nJiBtZXNzYWdlKQpJbmRleDogV2ViQ29yZS9odG1sL0hUTUxUb2tlbml6ZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9IVE1MVG9rZW5pemVyLmNwcAkocmV2aXNpb24gMjQ3
OTIpCisrKyBXZWJDb3JlL2h0bWwvSFRNTFRva2VuaXplci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTE1MDIsNyArMTUwMiw3IEBACiAKIGJvb2wgSFRNTFRva2VuaXplcjo6cHJvY2Vzc2luZ0RhdGEo
KSBjb25zdAogewotICAgIHJldHVybiBtX3RpbWVyLmlzQWN0aXZlKCk7CisgICAgcmV0dXJuIG1f
dGltZXIuaXNBY3RpdmUoKSB8fCBpbldyaXRlOwogfQogCiB2b2lkIEhUTUxUb2tlbml6ZXI6OnRp
bWVyRmlyZWQoVGltZXI8SFRNTFRva2VuaXplcj4qKQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmV4
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZXhwCShyZXZpc2lvbiAyNDc5MikKKysr
IFdlYkNvcmUvV2ViQ29yZS5leHAJKHdvcmtpbmcgY29weSkKQEAgLTE0Niw3ICsxNDYsNyBAQAog
X19aTjdXZWJDb3JlMTFGcmFtZUxvYWRlcjE0c2Nyb2xsVG9BbmNob3JFUktOU180S1VSTEUKIF9f
Wk43V2ViQ29yZTExRnJhbWVMb2FkZXIxNHN0b3BBbGxMb2FkZXJzRXYKIF9fWk43V2ViQ29yZTEx
RnJhbWVMb2FkZXIxNmRldGFjaEZyb21QYXJlbnRFdgotX19aTjdXZWJDb3JlMTFGcmFtZUxvYWRl
cjE3c3RvcEZvclVzZXJDYW5jZWxFdgorX19aTjdXZWJDb3JlMTFGcmFtZUxvYWRlcjE3c3RvcEZv
clVzZXJDYW5jZWxFYgogX19aTjdXZWJDb3JlMTFGcmFtZUxvYWRlcjE4Y3VycmVudEhpc3RvcnlJ
dGVtRXYKIF9fWk43V2ViQ29yZTExRnJhbWVMb2FkZXIxOHNob3VsZEhpZGVSZWZlcnJlckVSS05T
XzRLVVJMRVJLTlNfNlN0cmluZ0UKIF9fWk43V2ViQ29yZTExRnJhbWVMb2FkZXIyMGNvbnRpbnVl
TG9hZFdpdGhEYXRhRVBOU18xMlNoYXJlZEJ1ZmZlckVSS05TXzZTdHJpbmdFUzVfUktOU180S1VS
TEUKQEAgLTI4Miw4ICsyODIsOCBAQAogX19aTjdXZWJDb3JlMTVCYWNrRm9yd2FyZExpc3RDMUVQ
TlNfNFBhZ2VFCiBfX1pON1dlYkNvcmUxNUJhY2tGb3J3YXJkTGlzdEQxRXYKIF9fWk43V2ViQ29y
ZTE1Q29udGV4dE1lbnVJdGVtMjZyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbkV2CitfX1pON1dl
YkNvcmUxNUZvY3VzQ29udHJvbGxlcjE1c2V0Rm9jdXNlZEZyYW1lRU4zV1RGMTBQYXNzUmVmUHRy
SU5TXzVGcmFtZUVFRQogX19aTjdXZWJDb3JlMTVGb2N1c0NvbnRyb2xsZXIxNXNldEluaXRpYWxG
b2N1c0VQTlNfMTNLZXlib2FyZEV2ZW50RQotX19aTjdXZWJDb3JlMTVGb2N1c0NvbnRyb2xsZXIx
NXNldEZvY3VzZWRGcmFtZUVOM1dURjEwUGFzc1JlZlB0cklOU181RnJhbWVFRUUKIF9fWk43V2Vi
Q29yZTE1Rm9jdXNDb250cm9sbGVyMThmb2N1c2VkT3JNYWluRnJhbWVFdgogX19aTjdXZWJDb3Jl
MTVTdHJpbmdUcnVuY2F0b3IxM3JpZ2h0VHJ1bmNhdGVFUktOU182U3RyaW5nRWZSS05TXzRGb250
RWIKIF9fWk43V2ViQ29yZTE1U3RyaW5nVHJ1bmNhdG9yMTRjZW50ZXJUcnVuY2F0ZUVSS05TXzZT
dHJpbmdFZlJLTlNfNEZvbnRFYgo=
</data>
<flag name="review"
          id="6581"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>