<?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>12047</bug_id>
          
          <creation_ts>2006-12-31 13:20:29 -0800</creation_ts>
          <short_desc>SVGPathSegList needs better getTotalLength, getSegmentAtLength path traversal code</short_desc>
          <delta_ts>2011-05-20 13:12:45 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>SVG</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</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>
          <dependson>10827</dependson>
    
    <dependson>44009</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Dirk Schulze">krit</assigned_to>
          <cc>jeffschiller</cc>
    
    <cc>krit</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>38664</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-12-31 13:20:29 -0800</bug_when>
    <thetext>SVGPathSegList needs getTotalLength, getSegmentAtLength path traversal code

Now that bug 12033 is complete SVGPathElement::getTotalLength works.  However right now it uses toPathData() (without any caching).  In some cases it would be more efficient to use a getTotalLength function on a SVGPathSegList (assuming one is already created for DOM use).  Certainly getSegmentAtLengh should traverse the SVGPathSegList instead of the Path object.

This bug covers implementing SVGPathSegList path traversal functions.

The major question to answer with regards to SVGPathSegList is whether to support non-normalized path traversal or not.  (For example, we&apos;d have to automatically process arcs into curves, or write code to measure arc length in addition to the existing code for measuring bezier curve lengths)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>37301</commentid>
    <comment_count>1</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-01-03 08:27:20 -0800</bug_when>
    <thetext>I added these when working on animateMotion.  However they don&apos;t yet work for general case SVGPathSegLists.  Currently they only work on normalized/processed SVGPathSegLists which only contain lines, movetos, closepaths, and curvetos.  Eventually support should be added for all the various types, including arcs (at least in the case of getSegmentAtLength).

Also, right now SVGPathSegList has a couple copies of the same switch statement for doing these traversals.  Better might be to add a length() method onto the individual segment classes, or to at least share the switch statement with a single common method (similar to how PathTraversalState is used to support sharing a single switch inside Path.cpp).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7811</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-06-12 10:32:44 -0700</bug_when>
    <thetext>We need a few JS test cases to demonstrate this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264802</commentid>
    <comment_count>3</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-08-14 23:31:09 -0700</bug_when>
    <thetext>Normalized behavior of TraversalState shouldn&apos;t be a problem, once the patch on bug 44009 landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407183</commentid>
    <comment_count>4</comment_count>
      <attachid>94238</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-05-20 10:52:49 -0700</bug_when>
    <thetext>Created attachment 94238
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407196</commentid>
    <comment_count>5</comment_count>
      <attachid>94238</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-05-20 11:05:09 -0700</bug_when>
    <thetext>Comment on attachment 94238
Patch

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

&gt; Source/WebCore/svg/SVGPathElement.cpp:67
&gt; +    SVGPathParserFactory* factory = SVGPathParserFactory::self();

I don’t think this local variable helps clarity or performance.

&gt; Source/WebCore/svg/SVGPathElement.cpp:75
&gt; +    SVGPathParserFactory* factory = SVGPathParserFactory::self();

I don’t think this local variable helps clarity or performance.

&gt; Source/WebCore/svg/SVGPathParserFactory.cpp:282
&gt; +    totalLength = builder-&gt;totalLength();

Should this be done only if ok is true?

&gt; Source/WebCore/svg/SVGPathParserFactory.cpp:299
&gt; +    point = builder-&gt;currentPoint();

Should this be done only if ok is true?

&gt; Source/WebCore/svg/SVGPathTraversalStateBuilder.cpp:88
&gt;  bool SVGPathTraversalStateBuilder::continueConsuming()
&gt;  {
&gt; -    ASSERT(m_traversalState);
&gt; -    ASSERT(m_traversalState-&gt;m_action == PathTraversalState::TraversalSegmentAtLength);
&gt; -    return m_traversalState-&gt;m_totalLength &lt; m_traversalState-&gt;m_desiredLength;
&gt; +    ASSERT(m_traversalState);    
&gt; +    if (m_traversalState-&gt;m_action == PathTraversalState::TraversalSegmentAtLength
&gt; +        &amp;&amp; m_traversalState-&gt;m_totalLength &gt;= m_traversalState-&gt;m_desiredLength)
&gt; +        m_traversalState-&gt;m_success = true;
&gt; +    
&gt; +    if ((m_traversalState-&gt;m_action == PathTraversalState::TraversalPointAtLength
&gt; +         || m_traversalState-&gt;m_action == PathTraversalState::TraversalNormalAngleAtLength)
&gt; +        &amp;&amp; m_traversalState-&gt;m_totalLength &gt;= m_traversalState-&gt;m_desiredLength) {
&gt; +        FloatSize change = m_traversalState-&gt;m_current - m_traversalState-&gt;m_previous;
&gt; +        float slope = atan2f(change.height(), change.width());
&gt; +        if (m_traversalState-&gt;m_action == PathTraversalState::TraversalPointAtLength) {
&gt; +            float offset = m_traversalState-&gt;m_desiredLength - m_traversalState-&gt;m_totalLength;
&gt; +            m_traversalState-&gt;m_current.move(offset * cosf(slope), offset * sinf(slope));
&gt; +        } else
&gt; +            m_traversalState-&gt;m_normalAngle = rad2deg(slope);
&gt; +        m_traversalState-&gt;m_success = true;
&gt; +    }
&gt; +    m_traversalState-&gt;m_previous = m_traversalState-&gt;m_current;
&gt; +
&gt; +    return !m_traversalState-&gt;m_success;
&gt;  }

Seeing m_traversalState-&gt; so many times over and over again leads to the question of whether m_traversalState could have some function members to make this code simpler. A function like this is a bit of an anti-pattern.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407238</commentid>
    <comment_count>6</comment_count>
      <attachid>94238</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-05-20 11:41:06 -0700</bug_when>
    <thetext>Comment on attachment 94238
Patch

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

&gt;&gt; Source/WebCore/svg/SVGPathElement.cpp:67
&gt;&gt; +    SVGPathParserFactory* factory = SVGPathParserFactory::self();
&gt; 
&gt; I don’t think this local variable helps clarity or performance.

Fixed.

&gt;&gt; Source/WebCore/svg/SVGPathElement.cpp:75
&gt;&gt; +    SVGPathParserFactory* factory = SVGPathParserFactory::self();
&gt; 
&gt; I don’t think this local variable helps clarity or performance.

Fixed.

&gt;&gt; Source/WebCore/svg/SVGPathParserFactory.cpp:282
&gt;&gt; +    totalLength = builder-&gt;totalLength();
&gt; 
&gt; Should this be done only if ok is true?

It doesn&apos;t matter. The idea is, that you check the status before using totalLength(). And totalLength() should not cause an invalid behavior (also checked by an assert). But it is just possible to grab totalLength after the parsePathDataFromSource call.

&gt;&gt; Source/WebCore/svg/SVGPathParserFactory.cpp:299
&gt;&gt; +    point = builder-&gt;currentPoint();
&gt; 
&gt; Should this be done only if ok is true?

Ditto.

&gt;&gt; Source/WebCore/svg/SVGPathTraversalStateBuilder.cpp:88
&gt;&gt;  }
&gt; 
&gt; Seeing m_traversalState-&gt; so many times over and over again leads to the question of whether m_traversalState could have some function members to make this code simpler. A function like this is a bit of an anti-pattern.

I&apos;ll check this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407257</commentid>
    <comment_count>7</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-05-20 12:05:14 -0700</bug_when>
    <thetext>Committed r86973: &lt;http://trac.webkit.org/changeset/86973&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407287</commentid>
    <comment_count>8</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-05-20 13:12:45 -0700</bug_when>
    <thetext>Committed r86979: &lt;http://trac.webkit.org/changeset/86979&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>94238</attachid>
            <date>2011-05-20 10:52:49 -0700</date>
            <delta_ts>2011-05-20 11:41:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-12047-20110520195247.patch</filename>
            <type>text/plain</type>
            <size>8430</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg2OTY1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzIgQEAKKzIwMTEtMDUtMjAgIERpcmsgU2No
dWx6ZSAgPGtyaXRAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBTVkdQYXRoU2VnTGlzdCBuZWVkcyBiZXR0ZXIgZ2V0VG90YWxMZW5n
dGgsIGdldFNlZ21lbnRBdExlbmd0aCBwYXRoIHRyYXZlcnNhbCBjb2RlCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjA0NworCisgICAgICAgIFJpZ2h0
IG5vdyBTVkdQYXRoRWxlbWVudDo6Z2V0VG90YWxMZW5ndGggYW5kIFNWR1BhdGhFbGVtZW50Ojpn
ZXRQb2ludEF0TGVuZ3RoIHVzZSB0b1BhdGhEYXRhKCkKKyAgICAgICAgdG8gdHJhbnNmb3JtIGEg
U1ZHUGF0aEJ5dGVTdHJlYW0gdG8gYSBQYXRoLiBUaGlzIFBhdGggZ2V0cyB0cmF2ZXJzZWQgdG8g
ZmluZCB0aGUgc2VhcmNoZWQgdmFsdWUuCisgICAgICAgIFdpdGggdGhpcyBwYXRjaCBib3RoIGZ1
bmN0aW9ucyB1c2UgdGhlIFNWR1BhdGhCeXRlU3RyZWFtIGRpcmVjdGx5IHRvZ2V0aGVyIHdpdGgg
dGhlIGV4aXN0aW5nCisgICAgICAgIHRyYXZlcnNpbmcgY29kZSBpbiBTVkcuIFRoaXMgYXZvaWRz
IHRoZSBpbnRlcm1lZGlhdGUgdHJhbnNmb3JtaW5nIHRvIGEgcGxhdGZvcm0gcGF0aCBhbmQgZ2l2
ZXMKKyAgICAgICAgcGxhdGZvcm0gaW5kZXBlbmRlbnQgcmVzdWx0cy4KKyAgICAgICAgVGhlIHRy
YXZlcnNhbCBjb2RlIGluIFNWRyBuZWVkZWQgdG8gYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCBhbGwg
UGF0aFRyYXZlcnNhbEFjdGlvbnMuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGFkZGVkLiBUaGUg
ZXhpc3RpbmcgdGVzdHMgY292ZXIgdGhlIGNoYW5nZXMuCisKKyAgICAgICAgKiBzdmcvU1ZHUGF0
aEVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUGF0aEVsZW1lbnQ6OmdldFRvdGFs
TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdGhFbGVtZW50OjpnZXRQb2ludEF0TGVu
Z3RoKToKKyAgICAgICAgKiBzdmcvU1ZHUGF0aFBhcnNlckZhY3RvcnkuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6U1ZHUGF0aFBhcnNlckZhY3Rvcnk6OmdldFRvdGFsTGVuZ3RoT2ZTVkdQYXRoQnl0
ZVN0cmVhbSk6CisgICAgICAgIChXZWJDb3JlOjpTVkdQYXRoUGFyc2VyRmFjdG9yeTo6Z2V0UG9p
bnRBdExlbmd0aE9mU1ZHUGF0aEJ5dGVTdHJlYW0pOgorICAgICAgICAqIHN2Zy9TVkdQYXRoUGFy
c2VyRmFjdG9yeS5oOgorICAgICAgICAqIHN2Zy9TVkdQYXRoVHJhdmVyc2FsU3RhdGVCdWlsZGVy
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdGhUcmF2ZXJzYWxTdGF0ZUJ1aWxkZXI6OmNv
bnRpbnVlQ29uc3VtaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdGhUcmF2ZXJzYWxTdGF0
ZUJ1aWxkZXI6OnRvdGFsTGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdGhUcmF2ZXJz
YWxTdGF0ZUJ1aWxkZXI6OmN1cnJlbnRQb2ludCk6CisgICAgICAgICogc3ZnL1NWR1BhdGhUcmF2
ZXJzYWxTdGF0ZUJ1aWxkZXIuaDoKKwogMjAxMS0wNS0xOSAgRXZhbiBNYXJ0aW4gIDxldmFuQGNo
cm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBUb255IENoYW5nLgpJbmRleDogU291
cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9zdmcvU1ZHUGF0aEVsZW1lbnQuY3BwCShyZXZpc2lvbiA4NjkzNCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3N2Zy9TVkdQYXRoRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY0LDE5
ICs2NCwxOCBAQCBQYXNzUmVmUHRyPFNWR1BhdGhFbGVtZW50PiBTVkdQYXRoRWxlbWVuCiAKIGZs
b2F0IFNWR1BhdGhFbGVtZW50OjpnZXRUb3RhbExlbmd0aCgpCiB7Ci0gICAgLy8gRklYTUU6IHRo
aXMgbWF5IHdpc2ggdG8gdXNlIHRoZSBwYXRoU2VnTGlzdCBpbnN0ZWFkIG9mIHRoZSBwYXRoZGF0
YSBpZiB0aGF0J3MgY2hlYXBlciB0byBidWlsZCAob3IgY2FjaGVkKQotICAgIFBhdGggcGF0aDsK
LSAgICB0b1BhdGhEYXRhKHBhdGgpOwotICAgIHJldHVybiBwYXRoLmxlbmd0aCgpOworICAgIFNW
R1BhdGhQYXJzZXJGYWN0b3J5KiBmYWN0b3J5ID0gU1ZHUGF0aFBhcnNlckZhY3Rvcnk6OnNlbGYo
KTsKKyAgICBmbG9hdCB0b3RhbExlbmd0aCA9IDA7CisgICAgZmFjdG9yeS0+Z2V0VG90YWxMZW5n
dGhPZlNWR1BhdGhCeXRlU3RyZWFtKG1fcGF0aEJ5dGVTdHJlYW0uZ2V0KCksIHRvdGFsTGVuZ3Ro
KTsKKyAgICByZXR1cm4gdG90YWxMZW5ndGg7CiB9CiAKIEZsb2F0UG9pbnQgU1ZHUGF0aEVsZW1l
bnQ6OmdldFBvaW50QXRMZW5ndGgoZmxvYXQgbGVuZ3RoKQogewotICAgIC8vIEZJWE1FOiB0aGlz
IG1heSB3aXNoIHRvIHVzZSB0aGUgcGF0aFNlZ0xpc3QgaW5zdGVhZCBvZiB0aGUgcGF0aGRhdGEg
aWYgdGhhdCdzIGNoZWFwZXIgdG8gYnVpbGQgKG9yIGNhY2hlZCkKLSAgICBib29sIG9rID0gZmFs
c2U7Ci0gICAgUGF0aCBwYXRoOwotICAgIHRvUGF0aERhdGEocGF0aCk7Ci0gICAgcmV0dXJuIHBh
dGgucG9pbnRBdExlbmd0aChsZW5ndGgsIG9rKTsKKyAgICBTVkdQYXRoUGFyc2VyRmFjdG9yeSog
ZmFjdG9yeSA9IFNWR1BhdGhQYXJzZXJGYWN0b3J5OjpzZWxmKCk7CisgICAgRmxvYXRQb2ludCBw
b2ludDsKKyAgICBmYWN0b3J5LT5nZXRQb2ludEF0TGVuZ3RoT2ZTVkdQYXRoQnl0ZVN0cmVhbSht
X3BhdGhCeXRlU3RyZWFtLmdldCgpLCBsZW5ndGgsIHBvaW50KTsKKyAgICByZXR1cm4gcG9pbnQ7
CiB9CiAKIHVuc2lnbmVkIGxvbmcgU1ZHUGF0aEVsZW1lbnQ6OmdldFBhdGhTZWdBdExlbmd0aChm
bG9hdCBsZW5ndGgpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlckZhY3Rv
cnkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoUGFyc2VyRmFj
dG9yeS5jcHAJKHJldmlzaW9uIDg2OTM0KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhQ
YXJzZXJGYWN0b3J5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjY3LDYgKzI2Nyw0MCBAQCBib29s
IFNWR1BhdGhQYXJzZXJGYWN0b3J5OjpnZXRTVkdQYXRoU2VnCiAgICAgcmV0dXJuIG9rOwogfQog
Citib29sIFNWR1BhdGhQYXJzZXJGYWN0b3J5OjpnZXRUb3RhbExlbmd0aE9mU1ZHUGF0aEJ5dGVT
dHJlYW0oU1ZHUGF0aEJ5dGVTdHJlYW0qIHN0cmVhbSwgZmxvYXQmIHRvdGFsTGVuZ3RoKQorewor
ICAgIEFTU0VSVChzdHJlYW0pOworICAgIGlmIChzdHJlYW0tPmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIAorICAgIFBhdGhUcmF2ZXJzYWxTdGF0ZSB0cmF2ZXJzYWxTdGF0
ZShQYXRoVHJhdmVyc2FsU3RhdGU6OlRyYXZlcnNhbFRvdGFsTGVuZ3RoKTsKKyAgICBTVkdQYXRo
VHJhdmVyc2FsU3RhdGVCdWlsZGVyKiBidWlsZGVyID0gZ2xvYmFsU1ZHUGF0aFRyYXZlcnNhbFN0
YXRlQnVpbGRlcih0cmF2ZXJzYWxTdGF0ZSwgMCk7CisgICAgCisgICAgT3duUHRyPFNWR1BhdGhC
eXRlU3RyZWFtU291cmNlPiBzb3VyY2UgPSBTVkdQYXRoQnl0ZVN0cmVhbVNvdXJjZTo6Y3JlYXRl
KHN0cmVhbSk7CisgICAgU1ZHUGF0aFBhcnNlciogcGFyc2VyID0gZ2xvYmFsU1ZHUGF0aFBhcnNl
cihzb3VyY2UuZ2V0KCksIGJ1aWxkZXIpOworICAgIGJvb2wgb2sgPSBwYXJzZXItPnBhcnNlUGF0
aERhdGFGcm9tU291cmNlKE5vcm1hbGl6ZWRQYXJzaW5nKTsKKyAgICB0b3RhbExlbmd0aCA9IGJ1
aWxkZXItPnRvdGFsTGVuZ3RoKCk7CisgICAgcGFyc2VyLT5jbGVhbnVwKCk7CisgICAgcmV0dXJu
IG9rOworfQorCitib29sIFNWR1BhdGhQYXJzZXJGYWN0b3J5OjpnZXRQb2ludEF0TGVuZ3RoT2ZT
VkdQYXRoQnl0ZVN0cmVhbShTVkdQYXRoQnl0ZVN0cmVhbSogc3RyZWFtLCBmbG9hdCBsZW5ndGgs
IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIEFTU0VSVChzdHJlYW0pOworICAgIGlmIChzdHJl
YW0tPmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIFBhdGhUcmF2
ZXJzYWxTdGF0ZSB0cmF2ZXJzYWxTdGF0ZShQYXRoVHJhdmVyc2FsU3RhdGU6OlRyYXZlcnNhbFBv
aW50QXRMZW5ndGgpOworICAgIFNWR1BhdGhUcmF2ZXJzYWxTdGF0ZUJ1aWxkZXIqIGJ1aWxkZXIg
PSBnbG9iYWxTVkdQYXRoVHJhdmVyc2FsU3RhdGVCdWlsZGVyKHRyYXZlcnNhbFN0YXRlLCBsZW5n
dGgpOworICAgIAorICAgIE93blB0cjxTVkdQYXRoQnl0ZVN0cmVhbVNvdXJjZT4gc291cmNlID0g
U1ZHUGF0aEJ5dGVTdHJlYW1Tb3VyY2U6OmNyZWF0ZShzdHJlYW0pOworICAgIFNWR1BhdGhQYXJz
ZXIqIHBhcnNlciA9IGdsb2JhbFNWR1BhdGhQYXJzZXIoc291cmNlLmdldCgpLCBidWlsZGVyKTsK
KyAgICBib29sIG9rID0gcGFyc2VyLT5wYXJzZVBhdGhEYXRhRnJvbVNvdXJjZShOb3JtYWxpemVk
UGFyc2luZyk7CisgICAgcG9pbnQgPSBidWlsZGVyLT5jdXJyZW50UG9pbnQoKTsKKyAgICBwYXJz
ZXItPmNsZWFudXAoKTsKKyAgICByZXR1cm4gb2s7Cit9CisKIH0KIAogI2VuZGlmCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlckZhY3RvcnkuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlckZhY3RvcnkuaAkocmV2aXNpb24gODY5MzQp
CisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFBhcnNlckZhY3RvcnkuaAkod29ya2luZyBj
b3B5KQpAQCAtNTQsNiArNTQsOCBAQCBwdWJsaWM6CiAKICAgICBib29sIGJ1aWxkQW5pbWF0ZWRT
VkdQYXRoQnl0ZVN0cmVhbShTVkdQYXRoQnl0ZVN0cmVhbSosIFNWR1BhdGhCeXRlU3RyZWFtKiwg
T3duUHRyPFNWR1BhdGhCeXRlU3RyZWFtPiYsIGZsb2F0KTsKICAgICBib29sIGdldFNWR1BhdGhT
ZWdBdExlbmd0aEZyb21TVkdQYXRoQnl0ZVN0cmVhbShTVkdQYXRoQnl0ZVN0cmVhbSosIGZsb2F0
IGxlbmd0aCwgdW5zaWduZWQgbG9uZyYgcGF0aFNlZyk7CisgICAgYm9vbCBnZXRUb3RhbExlbmd0
aE9mU1ZHUGF0aEJ5dGVTdHJlYW0oU1ZHUGF0aEJ5dGVTdHJlYW0qLCBmbG9hdCYgdG90YWxMZW5n
dGgpOworICAgIGJvb2wgZ2V0UG9pbnRBdExlbmd0aE9mU1ZHUGF0aEJ5dGVTdHJlYW0oU1ZHUGF0
aEJ5dGVTdHJlYW0qLCBmbG9hdCBsZW5ndGgsIEZsb2F0UG9pbnQmKTsKIAogcHJpdmF0ZToKICAg
ICBTVkdQYXRoUGFyc2VyRmFjdG9yeSgpOwpJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL1NWR1Bh
dGhUcmF2ZXJzYWxTdGF0ZUJ1aWxkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3N2Zy9TVkdQYXRoVHJhdmVyc2FsU3RhdGVCdWlsZGVyLmNwcAkocmV2aXNpb24gODY5MzQpCisr
KyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFRyYXZlcnNhbFN0YXRlQnVpbGRlci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTY1LDkgKzY1LDI2IEBAIHZvaWQgU1ZHUGF0aFRyYXZlcnNhbFN0YXRl
QnVpbGRlcjo6c2V0RGUKIAogYm9vbCBTVkdQYXRoVHJhdmVyc2FsU3RhdGVCdWlsZGVyOjpjb250
aW51ZUNvbnN1bWluZygpCiB7Ci0gICAgQVNTRVJUKG1fdHJhdmVyc2FsU3RhdGUpOwotICAgIEFT
U0VSVChtX3RyYXZlcnNhbFN0YXRlLT5tX2FjdGlvbiA9PSBQYXRoVHJhdmVyc2FsU3RhdGU6OlRy
YXZlcnNhbFNlZ21lbnRBdExlbmd0aCk7Ci0gICAgcmV0dXJuIG1fdHJhdmVyc2FsU3RhdGUtPm1f
dG90YWxMZW5ndGggPCBtX3RyYXZlcnNhbFN0YXRlLT5tX2Rlc2lyZWRMZW5ndGg7CisgICAgQVNT
RVJUKG1fdHJhdmVyc2FsU3RhdGUpOyAgICAKKyAgICBpZiAobV90cmF2ZXJzYWxTdGF0ZS0+bV9h
Y3Rpb24gPT0gUGF0aFRyYXZlcnNhbFN0YXRlOjpUcmF2ZXJzYWxTZWdtZW50QXRMZW5ndGgKKyAg
ICAgICAgJiYgbV90cmF2ZXJzYWxTdGF0ZS0+bV90b3RhbExlbmd0aCA+PSBtX3RyYXZlcnNhbFN0
YXRlLT5tX2Rlc2lyZWRMZW5ndGgpCisgICAgICAgIG1fdHJhdmVyc2FsU3RhdGUtPm1fc3VjY2Vz
cyA9IHRydWU7CisgICAgCisgICAgaWYgKChtX3RyYXZlcnNhbFN0YXRlLT5tX2FjdGlvbiA9PSBQ
YXRoVHJhdmVyc2FsU3RhdGU6OlRyYXZlcnNhbFBvaW50QXRMZW5ndGgKKyAgICAgICAgIHx8IG1f
dHJhdmVyc2FsU3RhdGUtPm1fYWN0aW9uID09IFBhdGhUcmF2ZXJzYWxTdGF0ZTo6VHJhdmVyc2Fs
Tm9ybWFsQW5nbGVBdExlbmd0aCkKKyAgICAgICAgJiYgbV90cmF2ZXJzYWxTdGF0ZS0+bV90b3Rh
bExlbmd0aCA+PSBtX3RyYXZlcnNhbFN0YXRlLT5tX2Rlc2lyZWRMZW5ndGgpIHsKKyAgICAgICAg
RmxvYXRTaXplIGNoYW5nZSA9IG1fdHJhdmVyc2FsU3RhdGUtPm1fY3VycmVudCAtIG1fdHJhdmVy
c2FsU3RhdGUtPm1fcHJldmlvdXM7CisgICAgICAgIGZsb2F0IHNsb3BlID0gYXRhbjJmKGNoYW5n
ZS5oZWlnaHQoKSwgY2hhbmdlLndpZHRoKCkpOworICAgICAgICBpZiAobV90cmF2ZXJzYWxTdGF0
ZS0+bV9hY3Rpb24gPT0gUGF0aFRyYXZlcnNhbFN0YXRlOjpUcmF2ZXJzYWxQb2ludEF0TGVuZ3Ro
KSB7CisgICAgICAgICAgICBmbG9hdCBvZmZzZXQgPSBtX3RyYXZlcnNhbFN0YXRlLT5tX2Rlc2ly
ZWRMZW5ndGggLSBtX3RyYXZlcnNhbFN0YXRlLT5tX3RvdGFsTGVuZ3RoOworICAgICAgICAgICAg
bV90cmF2ZXJzYWxTdGF0ZS0+bV9jdXJyZW50Lm1vdmUob2Zmc2V0ICogY29zZihzbG9wZSksIG9m
ZnNldCAqIHNpbmYoc2xvcGUpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX3RyYXZl
cnNhbFN0YXRlLT5tX25vcm1hbEFuZ2xlID0gcmFkMmRlZyhzbG9wZSk7CisgICAgICAgIG1fdHJh
dmVyc2FsU3RhdGUtPm1fc3VjY2VzcyA9IHRydWU7CisgICAgfQorICAgIG1fdHJhdmVyc2FsU3Rh
dGUtPm1fcHJldmlvdXMgPSBtX3RyYXZlcnNhbFN0YXRlLT5tX2N1cnJlbnQ7CisKKyAgICByZXR1
cm4gIW1fdHJhdmVyc2FsU3RhdGUtPm1fc3VjY2VzczsKIH0KIAogdm9pZCBTVkdQYXRoVHJhdmVy
c2FsU3RhdGVCdWlsZGVyOjppbmNyZW1lbnRQYXRoU2VnbWVudENvdW50KCkKQEAgLTgyLDYgKzk5
LDE4IEBAIHVuc2lnbmVkIGxvbmcgU1ZHUGF0aFRyYXZlcnNhbFN0YXRlQnVpbGQKICAgICByZXR1
cm4gbV90cmF2ZXJzYWxTdGF0ZS0+bV9zZWdtZW50SW5kZXg7CiB9CiAKK2Zsb2F0IFNWR1BhdGhU
cmF2ZXJzYWxTdGF0ZUJ1aWxkZXI6OnRvdGFsTGVuZ3RoKCkKK3sKKyAgICBBU1NFUlQobV90cmF2
ZXJzYWxTdGF0ZSk7CisgICAgcmV0dXJuIG1fdHJhdmVyc2FsU3RhdGUtPm1fdG90YWxMZW5ndGg7
Cit9CisKK0Zsb2F0UG9pbnQgU1ZHUGF0aFRyYXZlcnNhbFN0YXRlQnVpbGRlcjo6Y3VycmVudFBv
aW50KCkKK3sKKyAgICBBU1NFUlQobV90cmF2ZXJzYWxTdGF0ZSk7CisgICAgcmV0dXJuIG1fdHJh
dmVyc2FsU3RhdGUtPm1fY3VycmVudDsKK30KKwogfQogCiAjZW5kaWYgLy8gRU5BQkxFKFNWRykK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdQYXRoVHJhdmVyc2FsU3RhdGVCdWlsZGVyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL1NWR1BhdGhUcmF2ZXJzYWxTdGF0ZUJ1
aWxkZXIuaAkocmV2aXNpb24gODY5MzQpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHUGF0aFRy
YXZlcnNhbFN0YXRlQnVpbGRlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw5IEBAIHB1
YmxpYzoKICAgICBTVkdQYXRoVHJhdmVyc2FsU3RhdGVCdWlsZGVyKCk7CiAKICAgICB1bnNpZ25l
ZCBsb25nIHBhdGhTZWdtZW50SW5kZXgoKTsKKyAgICBmbG9hdCB0b3RhbExlbmd0aCgpOworICAg
IEZsb2F0UG9pbnQgY3VycmVudFBvaW50KCk7CisKICAgICB2b2lkIHNldEN1cnJlbnRUcmF2ZXJz
YWxTdGF0ZShQYXRoVHJhdmVyc2FsU3RhdGUqIHRyYXZlcnNhbFN0YXRlKSB7IG1fdHJhdmVyc2Fs
U3RhdGUgPSB0cmF2ZXJzYWxTdGF0ZTsgfQogICAgIHZvaWQgc2V0RGVzaXJlZExlbmd0aChmbG9h
dCk7CiAgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudFBhdGhTZWdtZW50Q291bnQoKTsK
</data>
<flag name="review"
          id="87522"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>