<?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>57247</bug_id>
          
          <creation_ts>2011-03-28 10:18:26 -0700</creation_ts>
          <short_desc>Move more events to EventDispatcher.</short_desc>
          <delta_ts>2011-03-28 14:50:02 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>55515</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dimitri Glazkov (Google)">dglazkov</reporter>
          <assigned_to name="Dimitri Glazkov (Google)">dglazkov</assigned_to>
          <cc>darin</cc>
    
    <cc>eric</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>374583</commentid>
    <comment_count>0</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-03-28 10:18:26 -0700</bug_when>
    <thetext>Move more events to EventDispatcher.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>374586</commentid>
    <comment_count>1</comment_count>
      <attachid>87161</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-03-28 10:22:12 -0700</bug_when>
    <thetext>Created attachment 87161
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>374664</commentid>
    <comment_count>2</comment_count>
      <attachid>87161</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-03-28 12:11:24 -0700</bug_when>
    <thetext>Comment on attachment 87161
Patch

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

I reviewed the code you moved, rather than just reviewing the move.

&gt; Source/WebCore/dom/EventDispatcher.cpp:86
&gt; +inline static EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNode)
&gt; +{
&gt; +    ASSERT(referenceNode);
&gt; +
&gt; +#if ENABLE(SVG)
&gt; +    if (!referenceNode-&gt;isSVGElement())
&gt; +        return referenceNode;
&gt; +
&gt; +    // Spec: The event handling for the non-exposed tree works as if the referenced element had been textually included
&gt; +    // as a deeply cloned child of the &apos;use&apos; element, except that events are dispatched to the SVGElementInstance objects
&gt; +    for (Node* n = referenceNode; n; n = n-&gt;parentNode()) {
&gt; +        if (!n-&gt;isShadowRoot() || !n-&gt;isSVGElement())
&gt; +            continue;
&gt; +
&gt; +        Element* shadowTreeParentElement = n-&gt;shadowHost();
&gt; +        ASSERT(shadowTreeParentElement-&gt;hasTagName(SVGNames::useTag));
&gt; +
&gt; +        if (SVGElementInstance* instance = static_cast&lt;SVGUseElement*&gt;(shadowTreeParentElement)-&gt;instanceForShadowTreeElement(referenceNode))
&gt; +            return instance;
&gt; +    }
&gt; +#endif
&gt; +
&gt; +    return referenceNode;
&gt; +}

This function might be too long to inline in two places. Instead perhaps we could inline the non-SVG part and make the SVG part be a non-inline function.

&gt; Source/WebCore/dom/EventDispatcher.cpp:96
&gt; +bool EventDispatcher::dispatchKeyEvent(Node* node, const PlatformKeyboardEvent&amp; key)

An event is not a key, so this argument should be named “event”, not “key”.

The function name should probably be dispatchKeyboardEvent.

&gt; Source/WebCore/dom/EventDispatcher.cpp:109
&gt; +    bool r = dispatcher.dispatchEvent(keyboardEvent);
&gt; +
&gt; +    // We want to return false if default is prevented (already taken care of)
&gt; +    // or if the element is default-handled by the DOM. Otherwise we let it just
&gt; +    // let it get handled by AppKit.
&gt; +    if (keyboardEvent-&gt;defaultHandled())
&gt; +        r = false;
&gt; +
&gt; +    return r;

I think that “r” is not a good name for the boolean return value.

The mention of AppKit in this comment is comical and outdated.

I would write this code like this:

    return dispatch.dispatchEvent(keyboardEvent) &amp;&amp; !keyboardEvent-&gt;defaultHandled();

A comment explaining why this function looks at defaultHandled and the standard dispatchEvent return value does not would also be welcome. Since the existing comment says nothing so I couldn’t reword it; we’d have to research why this difference between the dispatchEvent return value and the dispatchKeyEvent return value is a good idea.

&gt; Source/WebCore/dom/EventDispatcher.cpp:157
&gt; +void EventDispatcher::dispatchWheelEvent(Node* node, PlatformWheelEvent&amp; e)

This should be “event”, not “e”.

&gt; Source/WebCore/dom/EventDispatcher.cpp:168
&gt; +    IntPoint pos = dispatcher.m_view-&gt;windowToContents(e.pos());

This should be “position”, not “p”.

&gt; Source/WebCore/dom/EventDispatcher.cpp:175
&gt; +            // Adjust our pageX and pageY to account for the page zoom.

This comment adds nothing.

&gt; Source/WebCore/dom/EventDispatcher.cpp:190
&gt; +    WheelEvent::Granularity granularity;
&gt; +    switch (e.granularity()) {
&gt; +    case ScrollByPageWheelEvent:
&gt; +        granularity = WheelEvent::Page;
&gt; +        break;
&gt; +    case ScrollByPixelWheelEvent:
&gt; +    default:
&gt; +        granularity = WheelEvent::Pixel;
&gt; +        break;
&gt; +    }

This conversion should have its own function. Having it written out like this is ugly.

&gt; Source/WebCore/dom/EventDispatcher.cpp:192
&gt; +    RefPtr&lt;WheelEvent&gt; we = WheelEvent::create(e.wheelTicksX(), e.wheelTicksY(), e.deltaX(), e.deltaY(), granularity,

This should be named “wheelEvent”, not “we”.

&gt; Source/WebCore/dom/EventDispatcher.cpp:196
&gt; +    we-&gt;setAbsoluteLocation(IntPoint(pos.x(), pos.y()));

IntPoint(pos.x(), pos.y()) is the same as just “pos”!

&gt; Source/WebCore/dom/EventDispatcher.cpp:201
&gt; +    we.release();

This line of code should be removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>374784</commentid>
    <comment_count>3</comment_count>
      <attachid>87161</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-03-28 14:32:12 -0700</bug_when>
    <thetext>Comment on attachment 87161
Patch

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

Made changes you suggested. Landing soon.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:86
&gt;&gt; +}
&gt; 
&gt; This function might be too long to inline in two places. Instead perhaps we could inline the non-SVG part and make the SVG part be a non-inline function.

Good idea. Done.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:96
&gt;&gt; +bool EventDispatcher::dispatchKeyEvent(Node* node, const PlatformKeyboardEvent&amp; key)
&gt; 
&gt; An event is not a key, so this argument should be named “event”, not “key”.
&gt; 
&gt; The function name should probably be dispatchKeyboardEvent.

Yup.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:109
&gt;&gt; +    return r;
&gt; 
&gt; I think that “r” is not a good name for the boolean return value.
&gt; 
&gt; The mention of AppKit in this comment is comical and outdated.
&gt; 
&gt; I would write this code like this:
&gt; 
&gt;     return dispatch.dispatchEvent(keyboardEvent) &amp;&amp; !keyboardEvent-&gt;defaultHandled();
&gt; 
&gt; A comment explaining why this function looks at defaultHandled and the standard dispatchEvent return value does not would also be welcome. Since the existing comment says nothing so I couldn’t reword it; we’d have to research why this difference between the dispatchEvent return value and the dispatchKeyEvent return value is a good idea.

Returning true/false has to do with WebKit layer attempting to handle the event. Wrote a better comment, changed the code as suggested.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:157
&gt;&gt; +void EventDispatcher::dispatchWheelEvent(Node* node, PlatformWheelEvent&amp; e)
&gt; 
&gt; This should be “event”, not “e”.

Done.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:168
&gt;&gt; +    IntPoint pos = dispatcher.m_view-&gt;windowToContents(e.pos());
&gt; 
&gt; This should be “position”, not “p”.

Done.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:175
&gt;&gt; +            // Adjust our pageX and pageY to account for the page zoom.
&gt; 
&gt; This comment adds nothing.

Gone.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:190
&gt;&gt; +    }
&gt; 
&gt; This conversion should have its own function. Having it written out like this is ugly.

Done.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:192
&gt;&gt; +    RefPtr&lt;WheelEvent&gt; we = WheelEvent::create(e.wheelTicksX(), e.wheelTicksY(), e.deltaX(), e.deltaY(), granularity,
&gt; 
&gt; This should be named “wheelEvent”, not “we”.

Yup.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:196

&gt; 
&gt; IntPoint(pos.x(), pos.y()) is the same as just “pos”!

:) That&apos;s funny. Changed.

&gt;&gt; Source/WebCore/dom/EventDispatcher.cpp:201
&gt;&gt; +    we.release();
&gt; 
&gt; This line of code should be removed.

Yeah.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>374800</commentid>
    <comment_count>4</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-03-28 14:50:02 -0700</bug_when>
    <thetext>Committed r82160: &lt;http://trac.webkit.org/changeset/82160&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87161</attachid>
            <date>2011-03-28 10:22:12 -0700</date>
            <delta_ts>2011-03-28 14:32:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57247-20110328102211.patch</filename>
            <type>text/plain</type>
            <size>12100</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODIxMjkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAwZWM5ODVkN2NjZTc1MTll
ZTllYTFkYjNmYjk5OWRkMGYyOGIwYTRhLi4zMDdiYjZiMWY4YjkzMDk2YTAyYTI1NzlmYTY0ZmRk
N2VmMDExOWRlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjYgQEAKKzIwMTEtMDMtMjggIERpbWl0
cmkgR2xhemtvdiAgPGRnbGF6a292QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3ZlIG1vcmUgZXZlbnRzIHRvIEV2ZW50RGlz
cGF0Y2hlci4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTU3MjQ3CisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiAoT09QUyEpCisKKyAgICAgICAgKiBkb20v
RXZlbnREaXNwYXRjaGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmV2ZW50VGFyZ2V0UmVzcGVj
dGluZ1NWR1RhcmdldFJ1bGVzKTogTWFkZSBhIHN0YXRpYyBmdW5jdGlvbiwKKyAgICAgICAgICAg
IHNpbmNlIGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgb3V0c2lkZSBvZiB0aGUgRXZlbnREaXNwYXRj
aGVyLgorICAgICAgICAoV2ViQ29yZTo6RXZlbnREaXNwYXRjaGVyOjpkaXNwYXRjaFNjb3BlZEV2
ZW50KTogTW92ZWQgZnJvbSBOb2RlLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OkV2ZW50RGlzcGF0
Y2hlcjo6ZGlzcGF0Y2hLZXlFdmVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6RXZlbnRE
aXNwYXRjaGVyOjpkaXNwYXRjaFdoZWVsRXZlbnQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6
OkV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hFdmVudCk6IENoYW5nZWQgdG8gdXNlIGV2ZW50VGFy
Z2V0UmVzcGVjdGluZ1NWR1RhcmdldFJ1bGVzCisgICAgICAgICAgICBhcyBhIHN0YXRpYyBmdW5j
dGlvbi4KKyAgICAgICAgKiBkb20vRXZlbnREaXNwYXRjaGVyLmg6IFVwZGF0ZWQgZGVjbHMuCisg
ICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6ZGlzcGF0Y2hT
Y29wZWRFdmVudCk6IFJlcGxhY2VkIHdpdGggY2FsbGluZyBFdmVudERpc3BhdGNoZXIuCisgICAg
ICAgIChXZWJDb3JlOjpOb2RlOjpkaXNwYXRjaEtleUV2ZW50KTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpOb2RlOjpkaXNwYXRjaFdoZWVsRXZlbnQpOiBEaXR0by4KKwogMjAxMS0wMy0yOCAg
RGF2aWQgS2lsemVyICA8ZGRraWx6ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIDxodHRwOi8vd2Vi
a2l0Lm9yZy9iLzU3MjM5PiBVc2UgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbiBpbnN0ZWFkIG9m
IGluY2x1ZGluZyBoZWFkZXIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9FdmVudERp
c3BhdGNoZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL0V2ZW50RGlzcGF0Y2hlci5jcHAKaW5k
ZXggNDQ2MTk0MmEyMTA0NGVjNWYyZDI2ZWQ3ODdhMmExMjAzMjQzZTg4NS4uZjllMTM1NzZhZjcz
NTY2ZjE4YTQxZWFjYWM0NTU2NWYwZWE0ZGQxMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
ZG9tL0V2ZW50RGlzcGF0Y2hlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL0V2ZW50RGlz
cGF0Y2hlci5jcHAKQEAgLTMxLDggKzMxLDExIEBACiAjaW5jbHVkZSAiRXZlbnRUYXJnZXQuaCIK
ICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNsdWRlICJJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b24uaCIKKyNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCiAjaW5jbHVkZSAiTW91c2VFdmVudC5o
IgogI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKKyNp
bmNsdWRlICJTY29wZWRFdmVudFF1ZXVlLmgiCiAKICNpZiBFTkFCTEUoU1ZHKQogI2luY2x1ZGUg
IlNWR0VsZW1lbnRJbnN0YW5jZS5oIgpAQCAtNDIsNiArNDUsNyBAQAogCiAjaW5jbHVkZSAiVUlF
dmVudC5oIgogI2luY2x1ZGUgIlVJRXZlbnRXaXRoS2V5U3RhdGUuaCIKKyNpbmNsdWRlICJXaGVl
bEV2ZW50LmgiCiAjaW5jbHVkZSAiV2luZG93RXZlbnRDb250ZXh0LmgiCiAKICNpbmNsdWRlIDx3
dGYvUmVmUHRyLmg+CkBAIC01Niw2ICs2MCw1NSBAQCBib29sIEV2ZW50RGlzcGF0Y2hlcjo6ZGlz
cGF0Y2hFdmVudChOb2RlKiBub2RlLCBQYXNzUmVmUHRyPEV2ZW50PiBldmVudCkKICAgICByZXR1
cm4gZGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKIH0KIAoraW5saW5lIHN0YXRpYyBF
dmVudFRhcmdldCogZXZlbnRUYXJnZXRSZXNwZWN0aW5nU1ZHVGFyZ2V0UnVsZXMoTm9kZSogcmVm
ZXJlbmNlTm9kZSkKK3sKKyAgICBBU1NFUlQocmVmZXJlbmNlTm9kZSk7CisKKyNpZiBFTkFCTEUo
U1ZHKQorICAgIGlmICghcmVmZXJlbmNlTm9kZS0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgIHJl
dHVybiByZWZlcmVuY2VOb2RlOworCisgICAgLy8gU3BlYzogVGhlIGV2ZW50IGhhbmRsaW5nIGZv
ciB0aGUgbm9uLWV4cG9zZWQgdHJlZSB3b3JrcyBhcyBpZiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50
IGhhZCBiZWVuIHRleHR1YWxseSBpbmNsdWRlZAorICAgIC8vIGFzIGEgZGVlcGx5IGNsb25lZCBj
aGlsZCBvZiB0aGUgJ3VzZScgZWxlbWVudCwgZXhjZXB0IHRoYXQgZXZlbnRzIGFyZSBkaXNwYXRj
aGVkIHRvIHRoZSBTVkdFbGVtZW50SW5zdGFuY2Ugb2JqZWN0cworICAgIGZvciAoTm9kZSogbiA9
IHJlZmVyZW5jZU5vZGU7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgaWYgKCFu
LT5pc1NoYWRvd1Jvb3QoKSB8fCAhbi0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKworICAgICAgICBFbGVtZW50KiBzaGFkb3dUcmVlUGFyZW50RWxlbWVudCA9IG4tPnNo
YWRvd0hvc3QoKTsKKyAgICAgICAgQVNTRVJUKHNoYWRvd1RyZWVQYXJlbnRFbGVtZW50LT5oYXNU
YWdOYW1lKFNWR05hbWVzOjp1c2VUYWcpKTsKKworICAgICAgICBpZiAoU1ZHRWxlbWVudEluc3Rh
bmNlKiBpbnN0YW5jZSA9IHN0YXRpY19jYXN0PFNWR1VzZUVsZW1lbnQqPihzaGFkb3dUcmVlUGFy
ZW50RWxlbWVudCktPmluc3RhbmNlRm9yU2hhZG93VHJlZUVsZW1lbnQocmVmZXJlbmNlTm9kZSkp
CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1
cm4gcmVmZXJlbmNlTm9kZTsKK30KKwordm9pZCBFdmVudERpc3BhdGNoZXI6OmRpc3BhdGNoU2Nv
cGVkRXZlbnQoTm9kZSogbm9kZSwgUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCit7CisgICAgLy8g
V2UgbmVlZCB0byBzZXQgdGhlIHRhcmdldCBoZXJlIGJlY2F1c2UgaXQgY2FuIGdvIGF3YXkgYnkg
dGhlIHRpbWUgd2UgYWN0dWFsbHkgZmlyZSB0aGUgZXZlbnQuCisgICAgZXZlbnQtPnNldFRhcmdl
dChldmVudFRhcmdldFJlc3BlY3RpbmdTVkdUYXJnZXRSdWxlcyhub2RlKSk7CisKKyAgICBTY29w
ZWRFdmVudFF1ZXVlOjppbnN0YW5jZSgpLT5lbnF1ZXVlRXZlbnQoZXZlbnQpOworfQorCitib29s
IEV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hLZXlFdmVudChOb2RlKiBub2RlLCBjb25zdCBQbGF0
Zm9ybUtleWJvYXJkRXZlbnQmIGtleSkKK3sKKyAgICBFdmVudERpc3BhdGNoZXIgZGlzcGF0Y2hl
cihub2RlKTsKKworICAgIFJlZlB0cjxLZXlib2FyZEV2ZW50PiBrZXlib2FyZEV2ZW50ID0gS2V5
Ym9hcmRFdmVudDo6Y3JlYXRlKGtleSwgbm9kZS0+ZG9jdW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSk7
CisgICAgYm9vbCByID0gZGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGtleWJvYXJkRXZlbnQpOwor
CisgICAgLy8gV2Ugd2FudCB0byByZXR1cm4gZmFsc2UgaWYgZGVmYXVsdCBpcyBwcmV2ZW50ZWQg
KGFscmVhZHkgdGFrZW4gY2FyZSBvZikKKyAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBpcyBkZWZh
dWx0LWhhbmRsZWQgYnkgdGhlIERPTS4gT3RoZXJ3aXNlIHdlIGxldCBpdCBqdXN0CisgICAgLy8g
bGV0IGl0IGdldCBoYW5kbGVkIGJ5IEFwcEtpdC4KKyAgICBpZiAoa2V5Ym9hcmRFdmVudC0+ZGVm
YXVsdEhhbmRsZWQoKSkKKyAgICAgICAgciA9IGZhbHNlOworCisgICAgcmV0dXJuIHI7Cit9CisK
IGJvb2wgRXZlbnREaXNwYXRjaGVyOjpkaXNwYXRjaE1vdXNlRXZlbnQoTm9kZSogbm9kZSwgY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCwgY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5
cGUsCiAgICAgaW50IGRldGFpbCwgTm9kZSogcmVsYXRlZFRhcmdldCkKIHsKQEAgLTEwMSw2ICsx
NTQsNTMgQEAgdm9pZCBFdmVudERpc3BhdGNoZXI6OmRpc3BhdGNoU2ltdWxhdGVkQ2xpY2soTm9k
ZSogbm9kZSwgUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQKICAgICBnTm9kZXNEaXNwYXRjaGluZ1Np
bXVsYXRlZENsaWNrcy0+cmVtb3ZlKG5vZGUpOwogfQogCit2b2lkIEV2ZW50RGlzcGF0Y2hlcjo6
ZGlzcGF0Y2hXaGVlbEV2ZW50KE5vZGUqIG5vZGUsIFBsYXRmb3JtV2hlZWxFdmVudCYgZSkKK3sK
KyAgICBBU1NFUlQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7CisgICAgaWYgKCEoZS5kZWx0
YVgoKSB8fCBlLmRlbHRhWSgpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRXZlbnREaXNwYXRj
aGVyIGRpc3BhdGNoZXIobm9kZSk7CisKKyAgICBpZiAoIWRpc3BhdGNoZXIubV92aWV3KQorICAg
ICAgICByZXR1cm47CisKKyAgICBJbnRQb2ludCBwb3MgPSBkaXNwYXRjaGVyLm1fdmlldy0+d2lu
ZG93VG9Db250ZW50cyhlLnBvcygpKTsKKworICAgIGludCBhZGp1c3RlZFBhZ2VYID0gcG9zLngo
KTsKKyAgICBpbnQgYWRqdXN0ZWRQYWdlWSA9IHBvcy55KCk7CisgICAgaWYgKEZyYW1lKiBmcmFt
ZSA9IG5vZGUtPmRvY3VtZW50KCktPmZyYW1lKCkpIHsKKyAgICAgICAgZmxvYXQgcGFnZVpvb20g
PSBmcmFtZS0+cGFnZVpvb21GYWN0b3IoKTsKKyAgICAgICAgaWYgKHBhZ2Vab29tICE9IDEuMGYp
IHsKKyAgICAgICAgICAgIC8vIEFkanVzdCBvdXIgcGFnZVggYW5kIHBhZ2VZIHRvIGFjY291bnQg
Zm9yIHRoZSBwYWdlIHpvb20uCisgICAgICAgICAgICBhZGp1c3RlZFBhZ2VYID0gbHJvdW5kZihw
b3MueCgpIC8gcGFnZVpvb20pOworICAgICAgICAgICAgYWRqdXN0ZWRQYWdlWSA9IGxyb3VuZGYo
cG9zLnkoKSAvIHBhZ2Vab29tKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFdoZWVsRXZlbnQ6
OkdyYW51bGFyaXR5IGdyYW51bGFyaXR5OworICAgIHN3aXRjaCAoZS5ncmFudWxhcml0eSgpKSB7
CisgICAgY2FzZSBTY3JvbGxCeVBhZ2VXaGVlbEV2ZW50OgorICAgICAgICBncmFudWxhcml0eSA9
IFdoZWVsRXZlbnQ6OlBhZ2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2Nyb2xsQnlQaXhl
bFdoZWVsRXZlbnQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgZ3JhbnVsYXJpdHkgPSBXaGVlbEV2
ZW50OjpQaXhlbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgUmVmUHRyPFdoZWVsRXZl
bnQ+IHdlID0gV2hlZWxFdmVudDo6Y3JlYXRlKGUud2hlZWxUaWNrc1goKSwgZS53aGVlbFRpY2tz
WSgpLCBlLmRlbHRhWCgpLCBlLmRlbHRhWSgpLCBncmFudWxhcml0eSwKKyAgICAgICAgbm9kZS0+
ZG9jdW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSwgZS5nbG9iYWxYKCksIGUuZ2xvYmFsWSgpLCBhZGp1
c3RlZFBhZ2VYLCBhZGp1c3RlZFBhZ2VZLAorICAgICAgICBlLmN0cmxLZXkoKSwgZS5hbHRLZXko
KSwgZS5zaGlmdEtleSgpLCBlLm1ldGFLZXkoKSk7CisKKyAgICB3ZS0+c2V0QWJzb2x1dGVMb2Nh
dGlvbihJbnRQb2ludChwb3MueCgpLCBwb3MueSgpKSk7CisKKyAgICBpZiAoIWRpc3BhdGNoZXIu
ZGlzcGF0Y2hFdmVudCh3ZSkgfHwgd2UtPmRlZmF1bHRIYW5kbGVkKCkpCisgICAgICAgIGUuYWNj
ZXB0KCk7CisKKyAgICB3ZS5yZWxlYXNlKCk7Cit9CisKIC8vIEZJWE1FOiBPbmNlIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01Mjk2MyBsYW5kcywgdGhpcyBzaG91bGQK
IC8vIGJlIGdyZWF0bHkgaW1wcm92ZWQuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NTQwMjUuCiBzdGF0aWMgTm9kZSogcHVsbE91dE9mU2hhZG93KE5vZGUqIG5v
ZGUpCkBAIC0xMTMsMzEgKzIxMyw2IEBAIHN0YXRpYyBOb2RlKiBwdWxsT3V0T2ZTaGFkb3coTm9k
ZSogbm9kZSkKICAgICByZXR1cm4gb3V0ZXJtb3N0U2hhZG93Qm91bmRhcnk7CiB9CiAKLUV2ZW50
VGFyZ2V0KiBFdmVudERpc3BhdGNoZXI6OmV2ZW50VGFyZ2V0UmVzcGVjdGluZ1NWR1RhcmdldFJ1
bGVzKE5vZGUqIHJlZmVyZW5jZU5vZGUpCi17Ci0gICAgQVNTRVJUKHJlZmVyZW5jZU5vZGUpOwot
Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoIXJlZmVyZW5jZU5vZGUtPmlzU1ZHRWxlbWVudCgp
KQotICAgICAgICByZXR1cm4gcmVmZXJlbmNlTm9kZTsKLQotICAgIC8vIFNwZWM6IFRoZSBldmVu
dCBoYW5kbGluZyBmb3IgdGhlIG5vbi1leHBvc2VkIHRyZWUgd29ya3MgYXMgaWYgdGhlIHJlZmVy
ZW5jZWQgZWxlbWVudCBoYWQgYmVlbiB0ZXh0dWFsbHkgaW5jbHVkZWQKLSAgICAvLyBhcyBhIGRl
ZXBseSBjbG9uZWQgY2hpbGQgb2YgdGhlICd1c2UnIGVsZW1lbnQsIGV4Y2VwdCB0aGF0IGV2ZW50
cyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgU1ZHRWxlbWVudEluc3RhbmNlIG9iamVjdHMKLSAgICBm
b3IgKE5vZGUqIG4gPSByZWZlcmVuY2VOb2RlOyBuOyBuID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0g
ICAgICAgIGlmICghbi0+aXNTaGFkb3dSb290KCkgfHwgIW4tPmlzU1ZHRWxlbWVudCgpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgRWxlbWVudCogc2hhZG93VHJlZVBhcmVudEVs
ZW1lbnQgPSBuLT5zaGFkb3dIb3N0KCk7Ci0gICAgICAgIEFTU0VSVChzaGFkb3dUcmVlUGFyZW50
RWxlbWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6dXNlVGFnKSk7Ci0KLSAgICAgICAgaWYgKFNW
R0VsZW1lbnRJbnN0YW5jZSogaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4o
c2hhZG93VHJlZVBhcmVudEVsZW1lbnQpLT5pbnN0YW5jZUZvclNoYWRvd1RyZWVFbGVtZW50KHJl
ZmVyZW5jZU5vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLSNlbmRp
ZgotCi0gICAgcmV0dXJuIHJlZmVyZW5jZU5vZGU7Ci19Ci0KIEV2ZW50RGlzcGF0Y2hlcjo6RXZl
bnREaXNwYXRjaGVyKE5vZGUqIG5vZGUpCiAgICAgOiBtX25vZGUobm9kZSkKIHsKQEAgLTIxNiw3
ICsyOTEsNyBAQCBib29sIEV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hFdmVudChQYXNzUmVmUHRy
PEV2ZW50PiBwcnBFdmVudCkKIAogICAgIGV2ZW50LT5zZXRFdmVudFBoYXNlKEV2ZW50OjpBVF9U
QVJHRVQpOwogICAgIGV2ZW50LT5zZXRUYXJnZXQob3JpZ2luYWxUYXJnZXQuZ2V0KCkpOwotICAg
IGV2ZW50LT5zZXRDdXJyZW50VGFyZ2V0KEV2ZW50RGlzcGF0Y2hlcjo6ZXZlbnRUYXJnZXRSZXNw
ZWN0aW5nU1ZHVGFyZ2V0UnVsZXMobV9ub2RlLmdldCgpKSk7CisgICAgZXZlbnQtPnNldEN1cnJl
bnRUYXJnZXQoZXZlbnRUYXJnZXRSZXNwZWN0aW5nU1ZHVGFyZ2V0UnVsZXMobV9ub2RlLmdldCgp
KSk7CiAgICAgbV9ub2RlLT5oYW5kbGVMb2NhbEV2ZW50cyhldmVudC5nZXQoKSk7CiAgICAgaWYg
KGV2ZW50LT5wcm9wYWdhdGlvblN0b3BwZWQoKSkKICAgICAgICAgZ290byBkb25lRGlzcGF0Y2hp
bmc7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vRXZlbnREaXNwYXRjaGVyLmggYi9T
b3VyY2UvV2ViQ29yZS9kb20vRXZlbnREaXNwYXRjaGVyLmgKaW5kZXggNDhlNGVhZDUxNmFlZmIw
MWRkMzk2ODI3NWJkNzI0YTg4NDVmYTBmYy4uMjRhNjQzYTg4NWU0MDcwNGM0NWE4MmQzNTBmNDQz
MjM2MTVkNDA2ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL0V2ZW50RGlzcGF0Y2hl
ci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FdmVudERpc3BhdGNoZXIuaApAQCAtMzYsNyAr
MzYsOSBAQCBjbGFzcyBFdmVudENvbnRleHQ7CiBjbGFzcyBFdmVudFRhcmdldDsKIGNsYXNzIEZy
YW1lVmlldzsKIGNsYXNzIE5vZGU7CitjbGFzcyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ7CiBjbGFz
cyBQbGF0Zm9ybU1vdXNlRXZlbnQ7CitjbGFzcyBQbGF0Zm9ybVdoZWVsRXZlbnQ7CiAKIGVudW0g
RXZlbnREaXNwYXRjaEJlaGF2aW9yIHsKICAgICBSZXRhcmdldEV2ZW50LApAQCAtNDcsMTAgKzQ5
LDEyIEBAIGVudW0gRXZlbnREaXNwYXRjaEJlaGF2aW9yIHsKIGNsYXNzIEV2ZW50RGlzcGF0Y2hl
ciB7CiBwdWJsaWM6CiAgICAgc3RhdGljIGJvb2wgZGlzcGF0Y2hFdmVudChOb2RlKiwgUGFzc1Jl
ZlB0cjxFdmVudD4pOworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoU2NvcGVkRXZlbnQoTm9kZSos
IFBhc3NSZWZQdHI8RXZlbnQ+KTsKKworICAgIHN0YXRpYyBib29sIGRpc3BhdGNoS2V5RXZlbnQo
Tm9kZSosIGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYpOwogICAgIHN0YXRpYyBib29sIGRp
c3BhdGNoTW91c2VFdmVudChOb2RlKiwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiwgY29uc3Qg
QXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGludCBjbGlja0NvdW50ID0gMCwgTm9kZSogcmVsYXRl
ZFRhcmdldCA9IDApOwogICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoU2ltdWxhdGVkQ2xpY2soTm9k
ZSosIFBhc3NSZWZQdHI8RXZlbnQ+IHVuZGVybHlpbmdFdmVudCwgYm9vbCBzZW5kTW91c2VFdmVu
dHMgPSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLQotICAgIHN0YXRpYyBF
dmVudFRhcmdldCogZXZlbnRUYXJnZXRSZXNwZWN0aW5nU1ZHVGFyZ2V0UnVsZXMoTm9kZSopOwor
ICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoV2hlZWxFdmVudChOb2RlKiwgUGxhdGZvcm1XaGVlbEV2
ZW50Jik7CiAKIHByaXZhdGU6CiAgICAgRXZlbnREaXNwYXRjaGVyKE5vZGUqKTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2Rl
LmNwcAppbmRleCAwNDM5OTRhMzdkZmFkZGNhYTE3YzUwNjhiNmQwZDI3NzYwMDY4M2M5Li42M2Nh
YzZhNWRkN2E4YzY3N2E0NDY3YjY2MGFlMGIxMGIyZWIzZWMwIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9kb20vTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCkBA
IC0yNjAyLDEwICsyNjAyLDcgQEAgdm9pZCBOb2RlOjpoYW5kbGVMb2NhbEV2ZW50cyhFdmVudCog
ZXZlbnQpCiAKIHZvaWQgTm9kZTo6ZGlzcGF0Y2hTY29wZWRFdmVudChQYXNzUmVmUHRyPEV2ZW50
PiBldmVudCkKIHsKLSAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgdGFyZ2V0IGhlcmUgYmVjYXVz
ZSBpdCBjYW4gZ28gYXdheSBieSB0aGUgdGltZSB3ZSBhY3R1YWxseSBmaXJlIHRoZSBldmVudC4K
LSAgICBldmVudC0+c2V0VGFyZ2V0KEV2ZW50RGlzcGF0Y2hlcjo6ZXZlbnRUYXJnZXRSZXNwZWN0
aW5nU1ZHVGFyZ2V0UnVsZXModGhpcykpOwotCi0gICAgU2NvcGVkRXZlbnRRdWV1ZTo6aW5zdGFu
Y2UoKS0+ZW5xdWV1ZUV2ZW50KGV2ZW50KTsKKyAgICBFdmVudERpc3BhdGNoZXI6OmRpc3BhdGNo
U2NvcGVkRXZlbnQodGhpcywgZXZlbnQpOwogfQogCiBib29sIE5vZGU6OmRpc3BhdGNoRXZlbnQo
UGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCkBAIC0yNjQyLDE2ICsyNjM5LDcgQEAgdm9pZCBOb2Rl
OjpkaXNwYXRjaFVJRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGludCBkZXRh
aWwsIFBhc3NSZWZQdHIKIAogYm9vbCBOb2RlOjpkaXNwYXRjaEtleUV2ZW50KGNvbnN0IFBsYXRm
b3JtS2V5Ym9hcmRFdmVudCYga2V5KQogewotICAgIFJlZlB0cjxLZXlib2FyZEV2ZW50PiBrZXli
b2FyZEV2ZW50ID0gS2V5Ym9hcmRFdmVudDo6Y3JlYXRlKGtleSwgZG9jdW1lbnQoKS0+ZGVmYXVs
dFZpZXcoKSk7Ci0gICAgYm9vbCByID0gZGlzcGF0Y2hFdmVudChrZXlib2FyZEV2ZW50KTsKLSAg
ICAKLSAgICAvLyB3ZSB3YW50IHRvIHJldHVybiBmYWxzZSBpZiBkZWZhdWx0IGlzIHByZXZlbnRl
ZCAoYWxyZWFkeSB0YWtlbiBjYXJlIG9mKQotICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGlzIGRl
ZmF1bHQtaGFuZGxlZCBieSB0aGUgRE9NLiBPdGhlcndpc2Ugd2UgbGV0IGl0IGp1c3QKLSAgICAv
LyBsZXQgaXQgZ2V0IGhhbmRsZWQgYnkgQXBwS2l0IAotICAgIGlmIChrZXlib2FyZEV2ZW50LT5k
ZWZhdWx0SGFuZGxlZCgpKQotICAgICAgICByID0gZmFsc2U7Ci0gICAgCi0gICAgcmV0dXJuIHI7
CisgICAgcmV0dXJuIEV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hLZXlFdmVudCh0aGlzLCBrZXkp
OwogfQogCiBib29sIE5vZGU6OmRpc3BhdGNoTW91c2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNl
RXZlbnQmIGV2ZW50LCBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwKQEAgLTI2NjcsNDgg
KzI2NTUsNyBAQCB2b2lkIE5vZGU6OmRpc3BhdGNoU2ltdWxhdGVkQ2xpY2soUGFzc1JlZlB0cjxF
dmVudD4gZXZlbnQsIGJvb2wgc2VuZE1vdXNlRXZlbnRzLAogCiB2b2lkIE5vZGU6OmRpc3BhdGNo
V2hlZWxFdmVudChQbGF0Zm9ybVdoZWVsRXZlbnQmIGUpCiB7Ci0gICAgQVNTRVJUKCFldmVudERp
c3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGlmIChlLmRlbHRhWCgpID09IDAgJiYgZS5kZWx0YVko
KSA9PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgRnJhbWVWaWV3KiB2aWV3ID0gZG9j
dW1lbnQoKS0+dmlldygpOwotICAgIGlmICghdmlldykKLSAgICAgICAgcmV0dXJuOwotICAgIAot
ICAgIEludFBvaW50IHBvcyA9IHZpZXctPndpbmRvd1RvQ29udGVudHMoZS5wb3MoKSk7Ci0KLSAg
ICBpbnQgYWRqdXN0ZWRQYWdlWCA9IHBvcy54KCk7Ci0gICAgaW50IGFkanVzdGVkUGFnZVkgPSBw
b3MueSgpOwotICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKSB7Ci0g
ICAgICAgIGZsb2F0IHBhZ2Vab29tID0gZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCk7Ci0gICAgICAg
IGlmIChwYWdlWm9vbSAhPSAxLjBmKSB7Ci0gICAgICAgICAgICAvLyBBZGp1c3Qgb3VyIHBhZ2VY
IGFuZCBwYWdlWSB0byBhY2NvdW50IGZvciB0aGUgcGFnZSB6b29tLgotICAgICAgICAgICAgYWRq
dXN0ZWRQYWdlWCA9IGxyb3VuZGYocG9zLngoKSAvIHBhZ2Vab29tKTsKLSAgICAgICAgICAgIGFk
anVzdGVkUGFnZVkgPSBscm91bmRmKHBvcy55KCkgLyBwYWdlWm9vbSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgCi0gICAgV2hlZWxFdmVudDo6R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHk7Ci0gICAg
c3dpdGNoIChlLmdyYW51bGFyaXR5KCkpIHsKLSAgICBjYXNlIFNjcm9sbEJ5UGFnZVdoZWVsRXZl
bnQ6Ci0gICAgICAgIGdyYW51bGFyaXR5ID0gV2hlZWxFdmVudDo6UGFnZTsKLSAgICAgICAgYnJl
YWs7Ci0gICAgY2FzZSBTY3JvbGxCeVBpeGVsV2hlZWxFdmVudDoKLSAgICBkZWZhdWx0OgotICAg
ICAgICBncmFudWxhcml0eSA9IFdoZWVsRXZlbnQ6OlBpeGVsOwotICAgICAgICBicmVhazsKLSAg
ICB9Ci0gICAgCi0gICAgUmVmUHRyPFdoZWVsRXZlbnQ+IHdlID0gV2hlZWxFdmVudDo6Y3JlYXRl
KGUud2hlZWxUaWNrc1goKSwgZS53aGVlbFRpY2tzWSgpLCBlLmRlbHRhWCgpLCBlLmRlbHRhWSgp
LCBncmFudWxhcml0eSwKLSAgICAgICAgZG9jdW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSwgZS5nbG9i
YWxYKCksIGUuZ2xvYmFsWSgpLCBhZGp1c3RlZFBhZ2VYLCBhZGp1c3RlZFBhZ2VZLAotICAgICAg
ICBlLmN0cmxLZXkoKSwgZS5hbHRLZXkoKSwgZS5zaGlmdEtleSgpLCBlLm1ldGFLZXkoKSk7Ci0K
LSAgICB3ZS0+c2V0QWJzb2x1dGVMb2NhdGlvbihJbnRQb2ludChwb3MueCgpLCBwb3MueSgpKSk7
Ci0KLSAgICBpZiAoIWRpc3BhdGNoRXZlbnQod2UpIHx8IHdlLT5kZWZhdWx0SGFuZGxlZCgpKQot
ICAgICAgICBlLmFjY2VwdCgpOwotCi0gICAgd2UucmVsZWFzZSgpOworICAgIEV2ZW50RGlzcGF0
Y2hlcjo6ZGlzcGF0Y2hXaGVlbEV2ZW50KHRoaXMsIGUpOwogfQogCiB2b2lkIE5vZGU6OmRpc3Bh
dGNoRm9jdXNFdmVudCgpCg==
</data>
<flag name="review"
          id="79566"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>