<?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>155696</bug_id>
          
          <creation_ts>2016-03-20 07:31:30 -0700</creation_ts>
          <short_desc>AX: Consolidate radio button group member code with that in HTMLElement derivatives</short_desc>
          <delta_ts>2016-04-04 00:54:20 -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>Accessibility</component>
          <version>Safari 9</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</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="chris fleizach">cfleizach</reporter>
          <assigned_to name="chris fleizach">cfleizach</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1176576</commentid>
    <comment_count>0</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-03-20 07:31:30 -0700</bug_when>
    <thetext>From

https://bugs.webkit.org/show_bug.cgi?id=155604

&gt; The old code is not the right way to find radio buttons. Code to iterate all
&gt; the radio buttons in a group should not have been replicated in the
&gt; accessibility code, but instead should be an interface provide by the
&gt; HTMLInputElement class. We could have a function:
&gt; 
&gt;      Vector&lt;HTMLInputElement*&gt; radioButtonGroup() const;
&gt; 
&gt; It would get the misnamed CheckedRadioButtons object, then would take the
&gt; element&apos;s name and find the RadioButtonGroup. That has a HashSet of all the
&gt; radio buttons in that group and that can be converted into a Vector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1176578</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2016-03-20 07:33:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/25260379&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1176899</commentid>
    <comment_count>2</comment_count>
      <attachid>274633</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-03-21 18:12:08 -0700</bug_when>
    <thetext>Created attachment 274633
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1176900</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-03-21 18:13:48 -0700</bug_when>
    <thetext>Attachment 274633 did not pass style-queue:


ERROR: Source/WebCore/dom/CheckedRadioButtons.cpp:204:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 1 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1176901</commentid>
    <comment_count>4</comment_count>
      <attachid>274634</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-03-21 18:14:43 -0700</bug_when>
    <thetext>Created attachment 274634
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1176984</commentid>
    <comment_count>5</comment_count>
      <attachid>274634</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-03-22 08:56:31 -0700</bug_when>
    <thetext>Comment on attachment 274634
patch

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

Thanks so much for tackling this!

There’s a serious problem here with the missing empty name check in CheckedRadioButtons::groupMembers.

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:970
&gt; +        for (auto radioSibling : input.radioButtonGroup()) {

It’s a little inaccurate to call this a “sibling” since that term is normally reserved for elements that have the same parent. The radio buttons in a radio button group are all members of the group but not necessarily siblings in the DOM tree sense.

&gt; Source/WebCore/dom/CheckedRadioButtons.cpp:69
&gt; +Vector&lt;HTMLInputElement*&gt; RadioButtonGroup::members() const
&gt; +{
&gt; +    Vector&lt;HTMLInputElement*&gt; members;
&gt; +    copyToVector(m_members, members);
&gt; +    return members;
&gt; +}

Newfangled idea, not critical: Since none of the radio buttons in the vector can be null, we might want to be super-modern and make the type of the elements be std::reference_wrapper&lt;HTMLInputElement&gt; instead of HTMLInputElement* to express the fact that they can never be null. It’s easy to make one using std::ref. This is not something we‘ve done in existing code in WebKit in the past, but I probably a good way to go for future code. Unfortunately that would mean we couldn’t use copyToVector in its current form. On the other hand, if we did write it out we could actually optimize it better because we could use reserveInitialCapacity and uncheckedAppend, which is more efficient than what copyToVector currently does with resize and assignment. Long term we should also make a better replacement for copyToVector that creates a new vector rather than overwriting an existing vector.

&gt; Source/WebCore/dom/CheckedRadioButtons.cpp:207
&gt; +    if (!element || !element-&gt;isRadioButton())
&gt; +        return Vector&lt;HTMLInputElement*&gt;();
&gt; +
&gt; +    if (RadioButtonGroup* group = m_nameToGroupMap-&gt;get(element-&gt;name().impl()))
&gt; +        return group-&gt;members();
&gt; +    return Vector&lt;HTMLInputElement*&gt;();

This function is missing the “name empty” check that other functions in this class have. We need some kind of check because the hash map does not support null keys: if the name is null, I believe the “get” function will crash.

We typically prefer early return and use the { } syntax for empty results rather than naming the type:

    if (!element.isRadioButton())
        return { };
    auto* name = element.name().impl();
    if (!name)
        return name;
    auto* group = m_nameToGroupMap-&gt;get(name);
    if (!group)
        return { };
    return group-&gt;members();

All the other functions in this class assert that the passed in element is a radio button. Not sure why we chose a different approach for this function.

&gt; Source/WebCore/dom/CheckedRadioButtons.h:46
&gt; +    Vector&lt;HTMLInputElement*&gt; groupMembers(HTMLInputElement*) const;

Argument should be HTMLInputElement&amp;, not HTMLInputElement*. This differs from the older functions, but eventually those should be fixed too.

&gt; Source/WebCore/html/HTMLInputElement.cpp:1782
&gt; +static inline bool domNodeSort(HTMLInputElement* lhs, HTMLInputElement* rhs)
&gt; +{
&gt; +    return Range::compareBoundaryPoints(lhs, 0, rhs, 0, IGNORE_EXCEPTION) &lt; 0;
&gt; +}

I don’t think a comparison function in the “less than” comparator predicate style should be called “sort”. I would write this:

    static inline bool documentOrderLessThan(const Node* a, const Node* b)
    {
        return Range::compareBoundaryPoints(lhs, 0, rhs, 0, ASSERT_NO_EXCEPTION) &lt; 0;
    }

Or we could call it documentOrderComparator or something like that. I could also imagine putting this into a header to make it reusable. I’m surprised that this is the first place we’ve had to sort nodes by document order!

Given that the only exception is “not in the same document”, which I believe cannot happen, I think ASSERT_NOT_EXCEPTION is what we want, rather than IGNORE_EXCEPTION.

&gt; Source/WebCore/html/HTMLInputElement.cpp:1792
&gt; +    ASSERT(isRadioButton());
&gt; +    if (CheckedRadioButtons* buttons = checkedRadioButtons()) {
&gt; +        Vector&lt;HTMLInputElement*&gt; group = buttons-&gt;groupMembers(this);
&gt; +        std::stable_sort(group.begin(), group.end(), domNodeSort);
&gt; +        return group;
&gt; +    }
&gt; +    return Vector&lt;HTMLInputElement*&gt;();

I would prefer we return an empty vector rather than doing the assertion if the input element is not a radio button. So we should just remove that assertion. That’s the same way other functions in this class handle it.

Would be more normal WebKit style to use early exit instead of nesting the normal case code in an if statement.

As far as I can tell, there is no need for stability in the sort; no two input elements should compare as equal. Thus I would suggest using std::sort instead of std::stable_sort, unless there’s some problem with that.

I think it’s a bit peculiar to make the lower levels convert from a set to a vector but then do sorting here at the highest level in HTMLInputElement::radioButtonGroup. There’s nothing about the lower levels that makes the sorting less appropriate there and more appropriate here. I could imagine these two other options that both seem slightly better to me:

1) Putting the sorting into RadioButtonGroup::members; would be logical to do the sorting as soon as we turn the set into a vector.

2) Having all these functions return a const HashSet&lt;HTMLInputElement*&gt;&amp; and then do the sorting in the accessibility code. We can have one or more global empty sets that we use for all the cases where we need to return the empty set.

One of the advantages of (1) is that some day we might decide to keep the radio button groups sorted by document order. If we do that, we’d be doing it in RadioButtonGroup and it would be nice not to have to change any of the higher level functions.

&gt; Source/WebCore/html/HTMLInputElement.h:274
&gt; +    Vector&lt;HTMLInputElement*&gt; radioButtonGroup();

Should be const, like checkedRadioButtonForGroup below. Not sure why isInRequiredRadioButtonGroup is not marked const.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1177235</commentid>
    <comment_count>6</comment_count>
      <attachid>274634</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-03-22 17:46:08 -0700</bug_when>
    <thetext>Comment on attachment 274634
patch

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

&gt;&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:970
&gt;&gt; +        for (auto radioSibling : input.radioButtonGroup()) {
&gt; 
&gt; It’s a little inaccurate to call this a “sibling” since that term is normally reserved for elements that have the same parent. The radio buttons in a radio button group are all members of the group but not necessarily siblings in the DOM tree sense.

I&apos;ll go with radioButtonGroupMember

&gt;&gt; Source/WebCore/dom/CheckedRadioButtons.cpp:69
&gt;&gt; +}
&gt; 
&gt; Newfangled idea, not critical: Since none of the radio buttons in the vector can be null, we might want to be super-modern and make the type of the elements be std::reference_wrapper&lt;HTMLInputElement&gt; instead of HTMLInputElement* to express the fact that they can never be null. It’s easy to make one using std::ref. This is not something we‘ve done in existing code in WebKit in the past, but I probably a good way to go for future code. Unfortunately that would mean we couldn’t use copyToVector in its current form. On the other hand, if we did write it out we could actually optimize it better because we could use reserveInitialCapacity and uncheckedAppend, which is more efficient than what copyToVector currently does with resize and assignment. Long term we should also make a better replacement for copyToVector that creates a new vector rather than overwriting an existing vector.

will give it a shot and see what you think

&gt;&gt; Source/WebCore/dom/CheckedRadioButtons.cpp:207
&gt;&gt; +    return Vector&lt;HTMLInputElement*&gt;();
&gt; 
&gt; This function is missing the “name empty” check that other functions in this class have. We need some kind of check because the hash map does not support null keys: if the name is null, I believe the “get” function will crash.
&gt; 
&gt; We typically prefer early return and use the { } syntax for empty results rather than naming the type:
&gt; 
&gt;     if (!element.isRadioButton())
&gt;         return { };
&gt;     auto* name = element.name().impl();
&gt;     if (!name)
&gt;         return name;
&gt;     auto* group = m_nameToGroupMap-&gt;get(name);
&gt;     if (!group)
&gt;         return { };
&gt;     return group-&gt;members();
&gt; 
&gt; All the other functions in this class assert that the passed in element is a radio button. Not sure why we chose a different approach for this function.

will fix up

&gt;&gt; Source/WebCore/html/HTMLInputElement.cpp:1782
&gt;&gt; +}
&gt; 
&gt; I don’t think a comparison function in the “less than” comparator predicate style should be called “sort”. I would write this:
&gt; 
&gt;     static inline bool documentOrderLessThan(const Node* a, const Node* b)
&gt;     {
&gt;         return Range::compareBoundaryPoints(lhs, 0, rhs, 0, ASSERT_NO_EXCEPTION) &lt; 0;
&gt;     }
&gt; 
&gt; Or we could call it documentOrderComparator or something like that. I could also imagine putting this into a header to make it reusable. I’m surprised that this is the first place we’ve had to sort nodes by document order!
&gt; 
&gt; Given that the only exception is “not in the same document”, which I believe cannot happen, I think ASSERT_NOT_EXCEPTION is what we want, rather than IGNORE_EXCEPTION.

I was also surprised I couldn&apos;t find any other examples of DOM sorting.

I could put this in Range.h, since it leverages compareBoundaryPoints

&gt;&gt; Source/WebCore/html/HTMLInputElement.cpp:1792
&gt;&gt; +    return Vector&lt;HTMLInputElement*&gt;();
&gt; 
&gt; I would prefer we return an empty vector rather than doing the assertion if the input element is not a radio button. So we should just remove that assertion. That’s the same way other functions in this class handle it.
&gt; 
&gt; Would be more normal WebKit style to use early exit instead of nesting the normal case code in an if statement.
&gt; 
&gt; As far as I can tell, there is no need for stability in the sort; no two input elements should compare as equal. Thus I would suggest using std::sort instead of std::stable_sort, unless there’s some problem with that.
&gt; 
&gt; I think it’s a bit peculiar to make the lower levels convert from a set to a vector but then do sorting here at the highest level in HTMLInputElement::radioButtonGroup. There’s nothing about the lower levels that makes the sorting less appropriate there and more appropriate here. I could imagine these two other options that both seem slightly better to me:
&gt; 
&gt; 1) Putting the sorting into RadioButtonGroup::members; would be logical to do the sorting as soon as we turn the set into a vector.
&gt; 
&gt; 2) Having all these functions return a const HashSet&lt;HTMLInputElement*&gt;&amp; and then do the sorting in the accessibility code. We can have one or more global empty sets that we use for all the cases where we need to return the empty set.
&gt; 
&gt; One of the advantages of (1) is that some day we might decide to keep the radio button groups sorted by document order. If we do that, we’d be doing it in RadioButtonGroup and it would be nice not to have to change any of the higher level functions.

Option 1 also sounds good to me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1178748</commentid>
    <comment_count>7</comment_count>
      <attachid>275116</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-03-29 12:12:28 -0700</bug_when>
    <thetext>Created attachment 275116
patch

Address Darin&apos;s feedback

I tried playing with the std::reference_wrapper for awhile, but couldn&apos;t get it to work out and compile with the existing HashSet&lt;HTMLInputElement*&gt; list that I was converting between. My C++ foo was probably not strong enough</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1178749</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-03-29 12:14:36 -0700</bug_when>
    <thetext>Attachment 275116 did not pass style-queue:


ERROR: Source/WebCore/dom/Range.h:185:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WebCore/dom/CheckedRadioButtons.h:29:  Bad include order. Mixing system and custom headers.  [build/include_order] [4]
Total errors found: 2 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1178750</commentid>
    <comment_count>9</comment_count>
      <attachid>275117</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-03-29 12:17:50 -0700</bug_when>
    <thetext>Created attachment 275117
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1180203</commentid>
    <comment_count>10</comment_count>
      <attachid>275117</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-04-03 12:40:36 -0700</bug_when>
    <thetext>Comment on attachment 275117
patch

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

&gt; Source/WebCore/dom/CheckedRadioButtons.h:46
&gt; +    Vector&lt;HTMLInputElement*&gt; groupMembers(HTMLInputElement*) const;

Since the only caller of this function passes &quot;this&quot;, the function should take HTMLInputElement&amp;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1180287</commentid>
    <comment_count>11</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-04-04 00:54:20 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/198997</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>274633</attachid>
            <date>2016-03-21 18:12:08 -0700</date>
            <delta_ts>2016-03-21 18:14:43 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>6942</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5ODUxMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMzIEBACisyMDE2LTAzLTIxICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IENvbnNvbGlkYXRl
IHJhZGlvIGJ1dHRvbiBncm91cCBtZW1iZXIgY29kZSB3aXRoIHRoYXQgaW4gSFRNTEVsZW1lbnQg
ZGVyaXZhdGl2ZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE1NTY5NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMjUyNjAzNzk+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRXhwb3NlIGEgY29tbW9uIG1l
dGhvZCBmb3IgZ2V0dGluZyBhc3NvY2lhdGVkIHJhZGlvIGJ1dHRvbiBncm91cCBtZW1iZXJzIHNv
IHRoYXQKKyAgICAgICAgYWNjZXNzaWJpbGl0eSBjYW4gbGV2ZXJhZ2UgaXQuIFRoZSBvbmx5IHRy
aWNreSBwYXJ0IGlzIHRoYXQgd2Ugd2FudCB0aGUgcmVzdWx0IHNvcnRlZC4KKworICAgICAgICBF
eGlzdGluZyB0ZXN0cyBjb3ZlciB0aGlzIGNoYW5nZS4KKworICAgICAgICAqIGFjY2Vzc2liaWxp
dHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0OjphZGRSYWRpb0J1dHRvbkdyb3VwTWVtYmVycyk6CisgICAg
ICAgICogZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmFk
aW9CdXR0b25Hcm91cDo6aXNWYWxpZCk6CisgICAgICAgIChXZWJDb3JlOjpSYWRpb0J1dHRvbkdy
b3VwOjptZW1iZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlJhZGlvQnV0dG9uR3JvdXA6OnNldENo
ZWNrZWRCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6Q2hlY2tlZFJhZGlvQnV0dG9uczo6YWRk
QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNoZWNrZWRSYWRpb0J1dHRvbnM6Omdyb3VwTWVt
YmVycyk6CisgICAgICAgIChXZWJDb3JlOjpDaGVja2VkUmFkaW9CdXR0b25zOjp1cGRhdGVDaGVj
a2VkU3RhdGUpOgorICAgICAgICAqIGRvbS9DaGVja2VkUmFkaW9CdXR0b25zLmg6CisgICAgICAg
ICogaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1
dEVsZW1lbnQ6OmlzSW5SZXF1aXJlZFJhZGlvQnV0dG9uR3JvdXApOgorICAgICAgICAoV2ViQ29y
ZTo6ZG9tTm9kZVNvcnQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6cmFk
aW9CdXR0b25Hcm91cCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpjaGVj
a2VkUmFkaW9CdXR0b25Gb3JHcm91cCk6CisgICAgICAgICogaHRtbC9IVE1MSW5wdXRFbGVtZW50
Lmg6CisKIDIwMTYtMDMtMjEgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBhcHBsZS5jb20+CiAK
ICAgICAgICAgSW1wcm92ZSBTaGFyZWRCdWZmZXIgdGVzdGluZwpJbmRleDogU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3QuY3BwCShyZXZpc2lvbiAxOTg0OTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NjcsMTkg
Kzk2Nyw5IEBACiAgICAgTm9kZSogbm9kZSA9IHRoaXMtPm5vZGUoKTsKICAgICBpZiAoaXM8SFRN
TElucHV0RWxlbWVudD4obm9kZSkpIHsKICAgICAgICAgSFRNTElucHV0RWxlbWVudCYgaW5wdXQg
PSBkb3duY2FzdDxIVE1MSW5wdXRFbGVtZW50Pigqbm9kZSk7Ci0gICAgICAgIC8vIGlmIHRoZXJl
J3MgYSBmb3JtLCB0aGVuIHRoaXMgaXMgZWFzeQotICAgICAgICBpZiAoaW5wdXQuZm9ybSgpKSB7
Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGFzc29jaWF0ZUVsZW1lbnQgOiBpbnB1dC5mb3JtKCkt
Pm5hbWVkRWxlbWVudHMoaW5wdXQubmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGlmIChBY2Nl
c3NpYmlsaXR5T2JqZWN0KiBvYmplY3QgPSBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRlKCZh
c3NvY2lhdGVFbGVtZW50LmdldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgbGlua2VkVUlFbGVt
ZW50cy5hcHBlbmQob2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGZvciAoYXV0byYgYXNzb2NpYXRlRWxlbWVudCA6IGRlc2NlbmRhbnRzT2ZUeXBl
PEhUTUxJbnB1dEVsZW1lbnQ+KG5vZGUtPmRvY3VtZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGFzc29jaWF0ZUVsZW1lbnQuaXNSYWRpb0J1dHRvbigpICYmIGFzc29jaWF0ZUVsZW1lbnQu
bmFtZSgpID09IGlucHV0Lm5hbWUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNz
aWJpbGl0eU9iamVjdCogb2JqZWN0ID0gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZSgmYXNz
b2NpYXRlRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rZWRVSUVsZW1lbnRz
LmFwcGVuZChvYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAg
ICAgZm9yIChhdXRvIHJhZGlvU2libGluZyA6IGlucHV0LnJhZGlvQnV0dG9uR3JvdXAoKSkgewor
ICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iamVjdCA9IGF4T2JqZWN0Q2Fj
aGUoKS0+Z2V0T3JDcmVhdGUocmFkaW9TaWJsaW5nKSkKKyAgICAgICAgICAgICAgICBsaW5rZWRV
SUVsZW1lbnRzLmFwcGVuZChvYmplY3QpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAg
ICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55IHJhZGlvIGJ1dHRvbiBzaWJsaW5ncyB3aXRoIHRo
ZSB0cmFkaXRpb25hbCBuYW1pbmcsIGxldHMgc2VhcmNoIGZvciBhIHJhZGlvIGdyb3VwIHJvbGUg
YW5kIGZpbmQgaXRzIGNoaWxkcmVuLgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NoZWNrZWRS
YWRpb0J1dHRvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGVja2Vk
UmFkaW9CdXR0b25zLmNwcAkocmV2aXNpb24gMTk4MzMyKQorKysgU291cmNlL1dlYkNvcmUvZG9t
L0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw3ICszOCw4IEBA
CiAgICAgdm9pZCByZXF1aXJlZEF0dHJpYnV0ZUNoYW5nZWQoSFRNTElucHV0RWxlbWVudCopOwog
ICAgIHZvaWQgcmVtb3ZlKEhUTUxJbnB1dEVsZW1lbnQqKTsKICAgICBib29sIGNvbnRhaW5zKEhU
TUxJbnB1dEVsZW1lbnQqKSBjb25zdDsKLQorICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4g
bWVtYmVycygpIGNvbnN0OworICAgIAogcHJpdmF0ZToKICAgICB2b2lkIHVwZGF0ZVZhbGlkaXR5
Rm9yQWxsQnV0dG9ucygpOwogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwpAQCAtNjAsNiArNjEs
MTMgQEAKICAgICByZXR1cm4gIWlzUmVxdWlyZWQoKSB8fCBtX2NoZWNrZWRCdXR0b247CiB9CiAK
K1ZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gUmFkaW9CdXR0b25Hcm91cDo6bWVtYmVycygpIGNv
bnN0Cit7CisgICAgVmVjdG9yPEhUTUxJbnB1dEVsZW1lbnQqPiBtZW1iZXJzOworICAgIGNvcHlU
b1ZlY3RvcihtX21lbWJlcnMsIG1lbWJlcnMpOworICAgIHJldHVybiBtZW1iZXJzOworfQorICAg
IAogdm9pZCBSYWRpb0J1dHRvbkdyb3VwOjpzZXRDaGVja2VkQnV0dG9uKEhUTUxJbnB1dEVsZW1l
bnQqIGJ1dHRvbikKIHsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBvbGRDaGVja2VkQnV0dG9uID0g
bV9jaGVja2VkQnV0dG9uOwpAQCAtMTg5LDYgKzE5NywxNiBAQAogICAgIGdyb3VwLT5hZGQoZWxl
bWVudCk7CiB9CiAKK1ZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gQ2hlY2tlZFJhZGlvQnV0dG9u
czo6Z3JvdXBNZW1iZXJzKEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAg
aWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LT5pc1JhZGlvQnV0dG9uKCkpCisgICAgICAgIHJldHVy
biBWZWN0b3I8SFRNTElucHV0RWxlbWVudCo+KCk7CisgICAKKyAgICBpZiAoUmFkaW9CdXR0b25H
cm91cCogZ3JvdXAgPSBtX25hbWVUb0dyb3VwTWFwLT5nZXQoZWxlbWVudC0+bmFtZSgpLmltcGwo
KSkpCisgICAgICAgIHJldHVybiBncm91cC0+bWVtYmVycygpOworICAgIHJldHVybiBWZWN0b3I8
SFRNTElucHV0RWxlbWVudCo+KCk7Cit9CisgICAgCiB2b2lkIENoZWNrZWRSYWRpb0J1dHRvbnM6
OnVwZGF0ZUNoZWNrZWRTdGF0ZShIVE1MSW5wdXRFbGVtZW50KiBlbGVtZW50KQogewogICAgIEFT
U0VSVChlbGVtZW50LT5pc1JhZGlvQnV0dG9uKCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9t
L0NoZWNrZWRSYWRpb0J1dHRvbnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20v
Q2hlY2tlZFJhZGlvQnV0dG9ucy5oCShyZXZpc2lvbiAxOTgzMzIpCisrKyBTb3VyY2UvV2ViQ29y
ZS9kb20vQ2hlY2tlZFJhZGlvQnV0dG9ucy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3
IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAjaW5jbHVk
ZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIApAQCAtNDIsNyArNDMsOCBAQAogICAgIHZvaWQgcmVtb3ZlQnV0dG9uKEhUTUxJ
bnB1dEVsZW1lbnQqKTsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBjaGVja2VkQnV0dG9uRm9yR3Jv
dXAoY29uc3QgQXRvbWljU3RyaW5nJiBncm91cE5hbWUpIGNvbnN0OwogICAgIGJvb2wgaXNJblJl
cXVpcmVkR3JvdXAoSFRNTElucHV0RWxlbWVudCopIGNvbnN0OwotCisgICAgVmVjdG9yPEhUTUxJ
bnB1dEVsZW1lbnQqPiBncm91cE1lbWJlcnMoSFRNTElucHV0RWxlbWVudCopIGNvbnN0OworICAg
IAogcHJpdmF0ZToKICAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIHN0ZDo6
dW5pcXVlX3B0cjxSYWRpb0J1dHRvbkdyb3VwPj4gTmFtZVRvR3JvdXBNYXA7CiAgICAgc3RkOjp1
bmlxdWVfcHRyPE5hbWVUb0dyb3VwTWFwPiBtX25hbWVUb0dyb3VwTWFwOwpJbmRleDogU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCShyZXZpc2lvbiAxOTgzMzIpCisrKyBT
b3VyY2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNzc1LDcgKzE3NzUsMjMgQEAKICAgICAgICAgcmV0dXJuIGJ1dHRvbnMtPmlzSW5SZXF1aXJl
ZEdyb3VwKHRoaXMpOwogICAgIHJldHVybiBmYWxzZTsKIH0KKyAgICAKK3N0YXRpYyBpbmxpbmUg
Ym9vbCBkb21Ob2RlU29ydChIVE1MSW5wdXRFbGVtZW50KiBsaHMsIEhUTUxJbnB1dEVsZW1lbnQq
IHJocykKK3sKKyAgICByZXR1cm4gUmFuZ2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyhsaHMsIDAs
IHJocywgMCwgSUdOT1JFX0VYQ0VQVElPTikgPCAwOworfQogCitWZWN0b3I8SFRNTElucHV0RWxl
bWVudCo+IEhUTUxJbnB1dEVsZW1lbnQ6OnJhZGlvQnV0dG9uR3JvdXAoKQoreworICAgIEFTU0VS
VChpc1JhZGlvQnV0dG9uKCkpOworICAgIGlmIChDaGVja2VkUmFkaW9CdXR0b25zKiBidXR0b25z
ID0gY2hlY2tlZFJhZGlvQnV0dG9ucygpKSB7CisgICAgICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVt
ZW50Kj4gZ3JvdXAgPSBidXR0b25zLT5ncm91cE1lbWJlcnModGhpcyk7CisgICAgICAgIHN0ZDo6
c3RhYmxlX3NvcnQoZ3JvdXAuYmVnaW4oKSwgZ3JvdXAuZW5kKCksIGRvbU5vZGVTb3J0KTsKKyAg
ICAgICAgcmV0dXJuIGdyb3VwOworICAgIH0KKyAgICByZXR1cm4gVmVjdG9yPEhUTUxJbnB1dEVs
ZW1lbnQqPigpOworfQorICAgIAogSFRNTElucHV0RWxlbWVudCogSFRNTElucHV0RWxlbWVudDo6
Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoKSBjb25zdAogewogICAgIGlmIChDaGVja2VkUmFk
aW9CdXR0b25zKiBidXR0b25zID0gY2hlY2tlZFJhZGlvQnV0dG9ucygpKQpJbmRleDogU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgJKHJldmlzaW9uIDE5ODMzMikKKysrIFNvdXJj
ZS9XZWJDb3JlL2h0bWwvSFRNTElucHV0RWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNzEs
NiArMjcxLDcgQEAKICAgICB2b2lkIGxpc3RBdHRyaWJ1dGVUYXJnZXRDaGFuZ2VkKCk7CiAjZW5k
aWYKIAorICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gcmFkaW9CdXR0b25Hcm91cCgpOwog
ICAgIEhUTUxJbnB1dEVsZW1lbnQqIGNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKCkgY29uc3Q7
CiAgICAgYm9vbCBpc0luUmVxdWlyZWRSYWRpb0J1dHRvbkdyb3VwKCk7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>274634</attachid>
            <date>2016-03-21 18:14:43 -0700</date>
            <delta_ts>2016-03-29 12:12:28 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>6939</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5ODUxMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMzIEBACisyMDE2LTAzLTIxICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IENvbnNvbGlkYXRl
IHJhZGlvIGJ1dHRvbiBncm91cCBtZW1iZXIgY29kZSB3aXRoIHRoYXQgaW4gSFRNTEVsZW1lbnQg
ZGVyaXZhdGl2ZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE1NTY5NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMjUyNjAzNzk+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRXhwb3NlIGEgY29tbW9uIG1l
dGhvZCBmb3IgZ2V0dGluZyBhc3NvY2lhdGVkIHJhZGlvIGJ1dHRvbiBncm91cCBtZW1iZXJzIHNv
IHRoYXQKKyAgICAgICAgYWNjZXNzaWJpbGl0eSBjYW4gbGV2ZXJhZ2UgaXQuIFRoZSBvbmx5IHRy
aWNreSBwYXJ0IGlzIHRoYXQgd2Ugd2FudCB0aGUgcmVzdWx0IHNvcnRlZC4KKworICAgICAgICBF
eGlzdGluZyB0ZXN0cyBjb3ZlciB0aGlzIGNoYW5nZS4KKworICAgICAgICAqIGFjY2Vzc2liaWxp
dHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0OjphZGRSYWRpb0J1dHRvbkdyb3VwTWVtYmVycyk6CisgICAg
ICAgICogZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmFk
aW9CdXR0b25Hcm91cDo6aXNWYWxpZCk6CisgICAgICAgIChXZWJDb3JlOjpSYWRpb0J1dHRvbkdy
b3VwOjptZW1iZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlJhZGlvQnV0dG9uR3JvdXA6OnNldENo
ZWNrZWRCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6Q2hlY2tlZFJhZGlvQnV0dG9uczo6YWRk
QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNoZWNrZWRSYWRpb0J1dHRvbnM6Omdyb3VwTWVt
YmVycyk6CisgICAgICAgIChXZWJDb3JlOjpDaGVja2VkUmFkaW9CdXR0b25zOjp1cGRhdGVDaGVj
a2VkU3RhdGUpOgorICAgICAgICAqIGRvbS9DaGVja2VkUmFkaW9CdXR0b25zLmg6CisgICAgICAg
ICogaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1
dEVsZW1lbnQ6OmlzSW5SZXF1aXJlZFJhZGlvQnV0dG9uR3JvdXApOgorICAgICAgICAoV2ViQ29y
ZTo6ZG9tTm9kZVNvcnQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6cmFk
aW9CdXR0b25Hcm91cCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpjaGVj
a2VkUmFkaW9CdXR0b25Gb3JHcm91cCk6CisgICAgICAgICogaHRtbC9IVE1MSW5wdXRFbGVtZW50
Lmg6CisKIDIwMTYtMDMtMjEgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBhcHBsZS5jb20+CiAK
ICAgICAgICAgSW1wcm92ZSBTaGFyZWRCdWZmZXIgdGVzdGluZwpJbmRleDogU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3QuY3BwCShyZXZpc2lvbiAxOTg0OTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NjcsMTkg
Kzk2Nyw5IEBACiAgICAgTm9kZSogbm9kZSA9IHRoaXMtPm5vZGUoKTsKICAgICBpZiAoaXM8SFRN
TElucHV0RWxlbWVudD4obm9kZSkpIHsKICAgICAgICAgSFRNTElucHV0RWxlbWVudCYgaW5wdXQg
PSBkb3duY2FzdDxIVE1MSW5wdXRFbGVtZW50Pigqbm9kZSk7Ci0gICAgICAgIC8vIGlmIHRoZXJl
J3MgYSBmb3JtLCB0aGVuIHRoaXMgaXMgZWFzeQotICAgICAgICBpZiAoaW5wdXQuZm9ybSgpKSB7
Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGFzc29jaWF0ZUVsZW1lbnQgOiBpbnB1dC5mb3JtKCkt
Pm5hbWVkRWxlbWVudHMoaW5wdXQubmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGlmIChBY2Nl
c3NpYmlsaXR5T2JqZWN0KiBvYmplY3QgPSBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRlKCZh
c3NvY2lhdGVFbGVtZW50LmdldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgbGlua2VkVUlFbGVt
ZW50cy5hcHBlbmQob2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGZvciAoYXV0byYgYXNzb2NpYXRlRWxlbWVudCA6IGRlc2NlbmRhbnRzT2ZUeXBl
PEhUTUxJbnB1dEVsZW1lbnQ+KG5vZGUtPmRvY3VtZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGFzc29jaWF0ZUVsZW1lbnQuaXNSYWRpb0J1dHRvbigpICYmIGFzc29jaWF0ZUVsZW1lbnQu
bmFtZSgpID09IGlucHV0Lm5hbWUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNz
aWJpbGl0eU9iamVjdCogb2JqZWN0ID0gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZSgmYXNz
b2NpYXRlRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rZWRVSUVsZW1lbnRz
LmFwcGVuZChvYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAg
ICAgZm9yIChhdXRvIHJhZGlvU2libGluZyA6IGlucHV0LnJhZGlvQnV0dG9uR3JvdXAoKSkgewor
ICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iamVjdCA9IGF4T2JqZWN0Q2Fj
aGUoKS0+Z2V0T3JDcmVhdGUocmFkaW9TaWJsaW5nKSkKKyAgICAgICAgICAgICAgICBsaW5rZWRV
SUVsZW1lbnRzLmFwcGVuZChvYmplY3QpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAg
ICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55IHJhZGlvIGJ1dHRvbiBzaWJsaW5ncyB3aXRoIHRo
ZSB0cmFkaXRpb25hbCBuYW1pbmcsIGxldHMgc2VhcmNoIGZvciBhIHJhZGlvIGdyb3VwIHJvbGUg
YW5kIGZpbmQgaXRzIGNoaWxkcmVuLgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NoZWNrZWRS
YWRpb0J1dHRvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGVja2Vk
UmFkaW9CdXR0b25zLmNwcAkocmV2aXNpb24gMTk4MzMyKQorKysgU291cmNlL1dlYkNvcmUvZG9t
L0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw3ICszOCw4IEBA
CiAgICAgdm9pZCByZXF1aXJlZEF0dHJpYnV0ZUNoYW5nZWQoSFRNTElucHV0RWxlbWVudCopOwog
ICAgIHZvaWQgcmVtb3ZlKEhUTUxJbnB1dEVsZW1lbnQqKTsKICAgICBib29sIGNvbnRhaW5zKEhU
TUxJbnB1dEVsZW1lbnQqKSBjb25zdDsKLQorICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4g
bWVtYmVycygpIGNvbnN0OworICAgIAogcHJpdmF0ZToKICAgICB2b2lkIHVwZGF0ZVZhbGlkaXR5
Rm9yQWxsQnV0dG9ucygpOwogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwpAQCAtNjAsNiArNjEs
MTMgQEAKICAgICByZXR1cm4gIWlzUmVxdWlyZWQoKSB8fCBtX2NoZWNrZWRCdXR0b247CiB9CiAK
K1ZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gUmFkaW9CdXR0b25Hcm91cDo6bWVtYmVycygpIGNv
bnN0Cit7CisgICAgVmVjdG9yPEhUTUxJbnB1dEVsZW1lbnQqPiBtZW1iZXJzOworICAgIGNvcHlU
b1ZlY3RvcihtX21lbWJlcnMsIG1lbWJlcnMpOworICAgIHJldHVybiBtZW1iZXJzOworfQorICAg
IAogdm9pZCBSYWRpb0J1dHRvbkdyb3VwOjpzZXRDaGVja2VkQnV0dG9uKEhUTUxJbnB1dEVsZW1l
bnQqIGJ1dHRvbikKIHsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBvbGRDaGVja2VkQnV0dG9uID0g
bV9jaGVja2VkQnV0dG9uOwpAQCAtMTg5LDYgKzE5NywxNiBAQAogICAgIGdyb3VwLT5hZGQoZWxl
bWVudCk7CiB9CiAKK1ZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gQ2hlY2tlZFJhZGlvQnV0dG9u
czo6Z3JvdXBNZW1iZXJzKEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAg
aWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LT5pc1JhZGlvQnV0dG9uKCkpCisgICAgICAgIHJldHVy
biBWZWN0b3I8SFRNTElucHV0RWxlbWVudCo+KCk7CisKKyAgICBpZiAoUmFkaW9CdXR0b25Hcm91
cCogZ3JvdXAgPSBtX25hbWVUb0dyb3VwTWFwLT5nZXQoZWxlbWVudC0+bmFtZSgpLmltcGwoKSkp
CisgICAgICAgIHJldHVybiBncm91cC0+bWVtYmVycygpOworICAgIHJldHVybiBWZWN0b3I8SFRN
TElucHV0RWxlbWVudCo+KCk7Cit9CisgICAgCiB2b2lkIENoZWNrZWRSYWRpb0J1dHRvbnM6OnVw
ZGF0ZUNoZWNrZWRTdGF0ZShIVE1MSW5wdXRFbGVtZW50KiBlbGVtZW50KQogewogICAgIEFTU0VS
VChlbGVtZW50LT5pc1JhZGlvQnV0dG9uKCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0No
ZWNrZWRSYWRpb0J1dHRvbnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vQ2hl
Y2tlZFJhZGlvQnV0dG9ucy5oCShyZXZpc2lvbiAxOTgzMzIpCisrKyBTb3VyY2UvV2ViQ29yZS9k
b20vQ2hlY2tlZFJhZGlvQnV0dG9ucy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBA
CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAjaW5jbHVkZSA8
d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIApAQCAtNDIsNyArNDMsOCBAQAogICAgIHZvaWQgcmVtb3ZlQnV0dG9uKEhUTUxJbnB1
dEVsZW1lbnQqKTsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBjaGVja2VkQnV0dG9uRm9yR3JvdXAo
Y29uc3QgQXRvbWljU3RyaW5nJiBncm91cE5hbWUpIGNvbnN0OwogICAgIGJvb2wgaXNJblJlcXVp
cmVkR3JvdXAoSFRNTElucHV0RWxlbWVudCopIGNvbnN0OwotCisgICAgVmVjdG9yPEhUTUxJbnB1
dEVsZW1lbnQqPiBncm91cE1lbWJlcnMoSFRNTElucHV0RWxlbWVudCopIGNvbnN0OworICAgIAog
cHJpdmF0ZToKICAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIHN0ZDo6dW5p
cXVlX3B0cjxSYWRpb0J1dHRvbkdyb3VwPj4gTmFtZVRvR3JvdXBNYXA7CiAgICAgc3RkOjp1bmlx
dWVfcHRyPE5hbWVUb0dyb3VwTWFwPiBtX25hbWVUb0dyb3VwTWFwOwpJbmRleDogU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCShyZXZpc2lvbiAxOTgzMzIpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
Nzc1LDcgKzE3NzUsMjMgQEAKICAgICAgICAgcmV0dXJuIGJ1dHRvbnMtPmlzSW5SZXF1aXJlZEdy
b3VwKHRoaXMpOwogICAgIHJldHVybiBmYWxzZTsKIH0KKyAgICAKK3N0YXRpYyBpbmxpbmUgYm9v
bCBkb21Ob2RlU29ydChIVE1MSW5wdXRFbGVtZW50KiBsaHMsIEhUTUxJbnB1dEVsZW1lbnQqIHJo
cykKK3sKKyAgICByZXR1cm4gUmFuZ2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyhsaHMsIDAsIHJo
cywgMCwgSUdOT1JFX0VYQ0VQVElPTikgPCAwOworfQogCitWZWN0b3I8SFRNTElucHV0RWxlbWVu
dCo+IEhUTUxJbnB1dEVsZW1lbnQ6OnJhZGlvQnV0dG9uR3JvdXAoKQoreworICAgIEFTU0VSVChp
c1JhZGlvQnV0dG9uKCkpOworICAgIGlmIChDaGVja2VkUmFkaW9CdXR0b25zKiBidXR0b25zID0g
Y2hlY2tlZFJhZGlvQnV0dG9ucygpKSB7CisgICAgICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50
Kj4gZ3JvdXAgPSBidXR0b25zLT5ncm91cE1lbWJlcnModGhpcyk7CisgICAgICAgIHN0ZDo6c3Rh
YmxlX3NvcnQoZ3JvdXAuYmVnaW4oKSwgZ3JvdXAuZW5kKCksIGRvbU5vZGVTb3J0KTsKKyAgICAg
ICAgcmV0dXJuIGdyb3VwOworICAgIH0KKyAgICByZXR1cm4gVmVjdG9yPEhUTUxJbnB1dEVsZW1l
bnQqPigpOworfQorICAgIAogSFRNTElucHV0RWxlbWVudCogSFRNTElucHV0RWxlbWVudDo6Y2hl
Y2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoKSBjb25zdAogewogICAgIGlmIChDaGVja2VkUmFkaW9C
dXR0b25zKiBidXR0b25zID0gY2hlY2tlZFJhZGlvQnV0dG9ucygpKQpJbmRleDogU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgJKHJldmlzaW9uIDE5ODMzMikKKysrIFNvdXJjZS9X
ZWJDb3JlL2h0bWwvSFRNTElucHV0RWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNzEsNiAr
MjcxLDcgQEAKICAgICB2b2lkIGxpc3RBdHRyaWJ1dGVUYXJnZXRDaGFuZ2VkKCk7CiAjZW5kaWYK
IAorICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gcmFkaW9CdXR0b25Hcm91cCgpOwogICAg
IEhUTUxJbnB1dEVsZW1lbnQqIGNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKCkgY29uc3Q7CiAg
ICAgYm9vbCBpc0luUmVxdWlyZWRSYWRpb0J1dHRvbkdyb3VwKCk7CiAK
</data>
<flag name="review"
          id="299049"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>275116</attachid>
            <date>2016-03-29 12:12:28 -0700</date>
            <delta_ts>2016-03-29 12:17:50 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>7584</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5ODc4NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBACisyMDE2LTAzLTI5ICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IENvbnNvbGlkYXRl
IHJhZGlvIGJ1dHRvbiBncm91cCBtZW1iZXIgY29kZSB3aXRoIHRoYXQgaW4gSFRNTEVsZW1lbnQg
ZGVyaXZhdGl2ZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE1NTY5NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMjUyNjAzNzk+CisKKyAgICAgICAg
RXhwb3NlIGEgY29tbW9uIG1ldGhvZCBmb3IgZ2V0dGluZyBhc3NvY2lhdGVkIHJhZGlvIGJ1dHRv
biBncm91cCBtZW1iZXJzIHNvIHRoYXQKKyAgICAgICAgYWNjZXNzaWJpbGl0eSBjYW4gbGV2ZXJh
Z2UgaXQuIFRoZSBvbmx5IHRyaWNreSBwYXJ0IGlzIHRoYXQgd2Ugd2FudCB0aGUgcmVzdWx0IHNv
cnRlZC4KKyAKKyAgICAgICAgRXhpc3RpbmcgdGVzdHMgY292ZXIgdGhpcyBjaGFuZ2UuCisgCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYWNjZXNzaWJp
bGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFkZFJhZGlvQnV0dG9uR3JvdXBNZW1iZXJzKToKKyAg
ICAgICAgKiBkb20vQ2hlY2tlZFJhZGlvQnV0dG9ucy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpS
YWRpb0J1dHRvbkdyb3VwOjppc1ZhbGlkKToKKyAgICAgICAgKFdlYkNvcmU6OlJhZGlvQnV0dG9u
R3JvdXA6Om1lbWJlcnMpOgorICAgICAgICAoV2ViQ29yZTo6UmFkaW9CdXR0b25Hcm91cDo6c2V0
Q2hlY2tlZEJ1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpDaGVja2VkUmFkaW9CdXR0b25zOjph
ZGRCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6Q2hlY2tlZFJhZGlvQnV0dG9uczo6Z3JvdXBN
ZW1iZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkNoZWNrZWRSYWRpb0J1dHRvbnM6OnVwZGF0ZUNo
ZWNrZWRTdGF0ZSk6CisgICAgICAgICogZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuaDoKKyAgICAg
ICAgKiBkb20vUmFuZ2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OmRvY3VtZW50T3JkZXJDb21wYXJh
dG9yKToKKyAgICAgICAgKiBodG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTElucHV0RWxlbWVudDo6aXNJblJlcXVpcmVkUmFkaW9CdXR0b25Hcm91cCk6Cisg
ICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpyYWRpb0J1dHRvbkdyb3VwKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmNoZWNrZWRSYWRpb0J1dHRvbkZvckdy
b3VwKToKKyAgICAgICAgKiBodG1sL0hUTUxJbnB1dEVsZW1lbnQuaDoKKwogMjAxNi0wMy0yOSAg
TXlsZXMgQy4gTWF4ZmllbGQgIDxtbWF4ZmllbGRAYXBwbGUuY29tPgogCiAgICAgICAgIFtDb2Nv
YV0gUmVuYW1lIFNjcm9sbGJhclBhaW50ZXIgdmFyaWFibGVzIHRvIFNjcm9sbGVySW1wCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Qu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDE5ODc2OCkKKysrIFNvdXJjZS9XZWJDb3Jl
L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTk2NywxOSArOTY3LDkgQEAKICAgICBOb2RlKiBub2RlID0gdGhpcy0+bm9kZSgpOwog
ICAgIGlmIChpczxIVE1MSW5wdXRFbGVtZW50Pihub2RlKSkgewogICAgICAgICBIVE1MSW5wdXRF
bGVtZW50JiBpbnB1dCA9IGRvd25jYXN0PEhUTUxJbnB1dEVsZW1lbnQ+KCpub2RlKTsKLSAgICAg
ICAgLy8gaWYgdGhlcmUncyBhIGZvcm0sIHRoZW4gdGhpcyBpcyBlYXN5Ci0gICAgICAgIGlmIChp
bnB1dC5mb3JtKCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgYXNzb2NpYXRlRWxlbWVudCA6
IGlucHV0LmZvcm0oKS0+bmFtZWRFbGVtZW50cyhpbnB1dC5uYW1lKCkpKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iamVjdCA9IGF4T2JqZWN0Q2FjaGUoKS0+
Z2V0T3JDcmVhdGUoJmFzc29jaWF0ZUVsZW1lbnQuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAg
ICBsaW5rZWRVSUVsZW1lbnRzLmFwcGVuZChvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChhdXRvJiBhc3NvY2lhdGVFbGVtZW50IDogZGVz
Y2VuZGFudHNPZlR5cGU8SFRNTElucHV0RWxlbWVudD4obm9kZS0+ZG9jdW1lbnQoKSkpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoYXNzb2NpYXRlRWxlbWVudC5pc1JhZGlvQnV0dG9uKCkgJiYgYXNz
b2NpYXRlRWxlbWVudC5uYW1lKCkgPT0gaW5wdXQubmFtZSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmplY3QgPSBheE9iamVjdENhY2hlKCktPmdl
dE9yQ3JlYXRlKCZhc3NvY2lhdGVFbGVtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxp
bmtlZFVJRWxlbWVudHMuYXBwZW5kKG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIHJhZGlvU2libGluZyA6IGlucHV0LnJhZGlvQnV0
dG9uR3JvdXAoKSkgeworICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iamVj
dCA9IGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUocmFkaW9TaWJsaW5nKSkKKyAgICAgICAg
ICAgICAgICBsaW5rZWRVSUVsZW1lbnRzLmFwcGVuZChvYmplY3QpOwogICAgICAgICB9CiAgICAg
fSBlbHNlIHsKICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55IHJhZGlvIGJ1dHRvbiBz
aWJsaW5ncyB3aXRoIHRoZSB0cmFkaXRpb25hbCBuYW1pbmcsIGxldHMgc2VhcmNoIGZvciBhIHJh
ZGlvIGdyb3VwIHJvbGUgYW5kIGZpbmQgaXRzIGNoaWxkcmVuLgpJbmRleDogU291cmNlL1dlYkNv
cmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2RvbS9DaGVja2VkUmFkaW9CdXR0b25zLmNwcAkocmV2aXNpb24gMTk4MzMyKQorKysgU291
cmNlL1dlYkNvcmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJDaGVja2Vk
UmFkaW9CdXR0b25zLmgiCisjaW5jbHVkZSAiUmFuZ2UuaCIKIAogI2luY2x1ZGUgIkhUTUxJbnB1
dEVsZW1lbnQuaCIKICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgpAQCAtMzgsNyArMzksOCBAQAog
ICAgIHZvaWQgcmVxdWlyZWRBdHRyaWJ1dGVDaGFuZ2VkKEhUTUxJbnB1dEVsZW1lbnQqKTsKICAg
ICB2b2lkIHJlbW92ZShIVE1MSW5wdXRFbGVtZW50Kik7CiAgICAgYm9vbCBjb250YWlucyhIVE1M
SW5wdXRFbGVtZW50KikgY29uc3Q7Ci0KKyAgICBWZWN0b3I8SFRNTElucHV0RWxlbWVudCo+IG1l
bWJlcnMoKSBjb25zdDsKKyAgICAKIHByaXZhdGU6CiAgICAgdm9pZCB1cGRhdGVWYWxpZGl0eUZv
ckFsbEJ1dHRvbnMoKTsKICAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKQEAgLTYwLDYgKzYyLDE0
IEBACiAgICAgcmV0dXJuICFpc1JlcXVpcmVkKCkgfHwgbV9jaGVja2VkQnV0dG9uOwogfQogCitW
ZWN0b3I8SFRNTElucHV0RWxlbWVudCo+IFJhZGlvQnV0dG9uR3JvdXA6Om1lbWJlcnMoKSBjb25z
dAoreworICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gbWVtYmVyczsKKyAgICBjb3B5VG9W
ZWN0b3IobV9tZW1iZXJzLCBtZW1iZXJzKTsKKyAgICBzdGQ6OnNvcnQobWVtYmVycy5iZWdpbigp
LCBtZW1iZXJzLmVuZCgpLCBkb2N1bWVudE9yZGVyQ29tcGFyYXRvcik7CisgICAgcmV0dXJuIG1l
bWJlcnM7Cit9CisgICAgCiB2b2lkIFJhZGlvQnV0dG9uR3JvdXA6OnNldENoZWNrZWRCdXR0b24o
SFRNTElucHV0RWxlbWVudCogYnV0dG9uKQogewogICAgIEhUTUxJbnB1dEVsZW1lbnQqIG9sZENo
ZWNrZWRCdXR0b24gPSBtX2NoZWNrZWRCdXR0b247CkBAIC0xODksNiArMTk5LDIyIEBACiAgICAg
Z3JvdXAtPmFkZChlbGVtZW50KTsKIH0KIAorVmVjdG9yPEhUTUxJbnB1dEVsZW1lbnQqPiBDaGVj
a2VkUmFkaW9CdXR0b25zOjpncm91cE1lbWJlcnMoSFRNTElucHV0RWxlbWVudCogZWxlbWVudCkg
Y29uc3QKK3sKKyAgICBBU1NFUlQoZWxlbWVudC0+aXNSYWRpb0J1dHRvbigpKTsKKyAgICBpZiAo
IWVsZW1lbnQgfHwgIWVsZW1lbnQtPmlzUmFkaW9CdXR0b24oKSkKKyAgICAgICAgcmV0dXJuIHsg
fTsKKyAgICAKKyAgICBhdXRvKiBuYW1lID0gZWxlbWVudC0+bmFtZSgpLmltcGwoKTsKKyAgICBp
ZiAoIW5hbWUpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICBhdXRvKiBncm91cCA9IG1fbmFt
ZVRvR3JvdXBNYXAtPmdldChuYW1lKTsKKyAgICBpZiAoIWdyb3VwKQorICAgICAgICByZXR1cm4g
eyB9OworICAgIHJldHVybiBncm91cC0+bWVtYmVycygpOworfQorICAgIAogdm9pZCBDaGVja2Vk
UmFkaW9CdXR0b25zOjp1cGRhdGVDaGVja2VkU3RhdGUoSFRNTElucHV0RWxlbWVudCogZWxlbWVu
dCkKIHsKICAgICBBU1NFUlQoZWxlbWVudC0+aXNSYWRpb0J1dHRvbigpKTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2RvbS9DaGVja2VkUmFkaW9CdXR0b25zLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuaAkocmV2aXNpb24gMTk4MzMyKQorKysg
U291cmNlL1dlYkNvcmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuaAkod29ya2luZyBjb3B5KQpA
QCAtMjQsNyArMjQsMTAgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8d3RmL0Zvcndh
cmQuaD4KICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
IAorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKwogbmFtZXNwYWNlIFdlYkNvcmUgewog
CiBjbGFzcyBIVE1MSW5wdXRFbGVtZW50OwpAQCAtNDIsNyArNDUsOCBAQAogICAgIHZvaWQgcmVt
b3ZlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQqKTsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBjaGVj
a2VkQnV0dG9uRm9yR3JvdXAoY29uc3QgQXRvbWljU3RyaW5nJiBncm91cE5hbWUpIGNvbnN0Owog
ICAgIGJvb2wgaXNJblJlcXVpcmVkR3JvdXAoSFRNTElucHV0RWxlbWVudCopIGNvbnN0OwotCisg
ICAgVmVjdG9yPEhUTUxJbnB1dEVsZW1lbnQqPiBncm91cE1lbWJlcnMoSFRNTElucHV0RWxlbWVu
dCopIGNvbnN0OworICAgIAogcHJpdmF0ZToKICAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3Ry
aW5nSW1wbCosIHN0ZDo6dW5pcXVlX3B0cjxSYWRpb0J1dHRvbkdyb3VwPj4gTmFtZVRvR3JvdXBN
YXA7CiAgICAgc3RkOjp1bmlxdWVfcHRyPE5hbWVUb0dyb3VwTWFwPiBtX25hbWVUb0dyb3VwTWFw
OwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL1JhbmdlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvZG9tL1JhbmdlLmgJKHJldmlzaW9uIDE5ODMzMikKKysrIFNvdXJjZS9XZWJDb3Jl
L2RvbS9SYW5nZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xODIsNiArMTgyLDEwIEBACiBXRUJDT1JF
X0VYUE9SVCBib29sIGFyZVJhbmdlc0VxdWFsKGNvbnN0IFJhbmdlKiwgY29uc3QgUmFuZ2UqKTsK
IGJvb2wgcmFuZ2VzT3ZlcmxhcChjb25zdCBSYW5nZSosIGNvbnN0IFJhbmdlKik7CiAKK2lubGlu
ZSBib29sIGRvY3VtZW50T3JkZXJDb21wYXJhdG9yKGNvbnN0IE5vZGUqIGEsIGNvbnN0IE5vZGUq
IGIpIHsKKyAgICByZXR1cm4gUmFuZ2U6OmNvbXBhcmVCb3VuZGFyeVBvaW50cyhjb25zdF9jYXN0
PE5vZGUqPihhKSwgMCwgY29uc3RfY2FzdDxOb2RlKj4oYiksIDAsIEFTU0VSVF9OT19FWENFUFRJ
T04pIDwgMDsKK30KKwogfSAvLyBuYW1lc3BhY2UKIAogI2lmIEVOQUJMRShUUkVFX0RFQlVHR0lO
RykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTElucHV0RWxlbWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcAkocmV2aXNp
b24gMTk4MzMyKQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTc3Niw2ICsxNzc2LDE0IEBACiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCitWZWN0b3I8SFRNTElucHV0RWxlbWVudCo+IEhUTUxJbnB1dEVsZW1lbnQ6OnJhZGlvQnV0
dG9uR3JvdXAoKSBjb25zdAoreworICAgIENoZWNrZWRSYWRpb0J1dHRvbnMqIGJ1dHRvbnMgPSBj
aGVja2VkUmFkaW9CdXR0b25zKCk7CisgICAgaWYgKCFidXR0b25zKQorICAgICAgICByZXR1cm4g
eyB9OworICAgIHJldHVybiBidXR0b25zLT5ncm91cE1lbWJlcnMoY29uc3RfY2FzdDxIVE1MSW5w
dXRFbGVtZW50Kj4odGhpcykpOworfQorICAgIAogSFRNTElucHV0RWxlbWVudCogSFRNTElucHV0
RWxlbWVudDo6Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoKSBjb25zdAogewogICAgIGlmIChD
aGVja2VkUmFkaW9CdXR0b25zKiBidXR0b25zID0gY2hlY2tlZFJhZGlvQnV0dG9ucygpKQpJbmRl
eDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgJKHJldmlzaW9uIDE5ODMzMikK
KysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTElucHV0RWxlbWVudC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yNzEsNiArMjcxLDcgQEAKICAgICB2b2lkIGxpc3RBdHRyaWJ1dGVUYXJnZXRDaGFuZ2Vk
KCk7CiAjZW5kaWYKIAorICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gcmFkaW9CdXR0b25H
cm91cCgpIGNvbnN0OwogICAgIEhUTUxJbnB1dEVsZW1lbnQqIGNoZWNrZWRSYWRpb0J1dHRvbkZv
ckdyb3VwKCkgY29uc3Q7CiAgICAgYm9vbCBpc0luUmVxdWlyZWRSYWRpb0J1dHRvbkdyb3VwKCk7
CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>275117</attachid>
            <date>2016-03-29 12:17:50 -0700</date>
            <delta_ts>2016-04-03 12:40:36 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>7526</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5ODc4NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBACisyMDE2LTAzLTI5ICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IENvbnNvbGlkYXRl
IHJhZGlvIGJ1dHRvbiBncm91cCBtZW1iZXIgY29kZSB3aXRoIHRoYXQgaW4gSFRNTEVsZW1lbnQg
ZGVyaXZhdGl2ZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE1NTY5NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMjUyNjAzNzk+CisKKyAgICAgICAg
RXhwb3NlIGEgY29tbW9uIG1ldGhvZCBmb3IgZ2V0dGluZyBhc3NvY2lhdGVkIHJhZGlvIGJ1dHRv
biBncm91cCBtZW1iZXJzIHNvIHRoYXQKKyAgICAgICAgYWNjZXNzaWJpbGl0eSBjYW4gbGV2ZXJh
Z2UgaXQuIFRoZSBvbmx5IHRyaWNreSBwYXJ0IGlzIHRoYXQgd2Ugd2FudCB0aGUgcmVzdWx0IHNv
cnRlZC4KKyAKKyAgICAgICAgRXhpc3RpbmcgdGVzdHMgY292ZXIgdGhpcyBjaGFuZ2UuCisgCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYWNjZXNzaWJp
bGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFkZFJhZGlvQnV0dG9uR3JvdXBNZW1iZXJzKToKKyAg
ICAgICAgKiBkb20vQ2hlY2tlZFJhZGlvQnV0dG9ucy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpS
YWRpb0J1dHRvbkdyb3VwOjppc1ZhbGlkKToKKyAgICAgICAgKFdlYkNvcmU6OlJhZGlvQnV0dG9u
R3JvdXA6Om1lbWJlcnMpOgorICAgICAgICAoV2ViQ29yZTo6UmFkaW9CdXR0b25Hcm91cDo6c2V0
Q2hlY2tlZEJ1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpDaGVja2VkUmFkaW9CdXR0b25zOjph
ZGRCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6Q2hlY2tlZFJhZGlvQnV0dG9uczo6Z3JvdXBN
ZW1iZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkNoZWNrZWRSYWRpb0J1dHRvbnM6OnVwZGF0ZUNo
ZWNrZWRTdGF0ZSk6CisgICAgICAgICogZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuaDoKKyAgICAg
ICAgKiBkb20vUmFuZ2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OmRvY3VtZW50T3JkZXJDb21wYXJh
dG9yKToKKyAgICAgICAgKiBodG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTElucHV0RWxlbWVudDo6aXNJblJlcXVpcmVkUmFkaW9CdXR0b25Hcm91cCk6Cisg
ICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpyYWRpb0J1dHRvbkdyb3VwKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmNoZWNrZWRSYWRpb0J1dHRvbkZvckdy
b3VwKToKKyAgICAgICAgKiBodG1sL0hUTUxJbnB1dEVsZW1lbnQuaDoKKwogMjAxNi0wMy0yOSAg
TXlsZXMgQy4gTWF4ZmllbGQgIDxtbWF4ZmllbGRAYXBwbGUuY29tPgogCiAgICAgICAgIFtDb2Nv
YV0gUmVuYW1lIFNjcm9sbGJhclBhaW50ZXIgdmFyaWFibGVzIHRvIFNjcm9sbGVySW1wCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Qu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDE5ODc2OCkKKysrIFNvdXJjZS9XZWJDb3Jl
L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTk2NywxOSArOTY3LDkgQEAKICAgICBOb2RlKiBub2RlID0gdGhpcy0+bm9kZSgpOwog
ICAgIGlmIChpczxIVE1MSW5wdXRFbGVtZW50Pihub2RlKSkgewogICAgICAgICBIVE1MSW5wdXRF
bGVtZW50JiBpbnB1dCA9IGRvd25jYXN0PEhUTUxJbnB1dEVsZW1lbnQ+KCpub2RlKTsKLSAgICAg
ICAgLy8gaWYgdGhlcmUncyBhIGZvcm0sIHRoZW4gdGhpcyBpcyBlYXN5Ci0gICAgICAgIGlmIChp
bnB1dC5mb3JtKCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgYXNzb2NpYXRlRWxlbWVudCA6
IGlucHV0LmZvcm0oKS0+bmFtZWRFbGVtZW50cyhpbnB1dC5uYW1lKCkpKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iamVjdCA9IGF4T2JqZWN0Q2FjaGUoKS0+
Z2V0T3JDcmVhdGUoJmFzc29jaWF0ZUVsZW1lbnQuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAg
ICBsaW5rZWRVSUVsZW1lbnRzLmFwcGVuZChvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChhdXRvJiBhc3NvY2lhdGVFbGVtZW50IDogZGVz
Y2VuZGFudHNPZlR5cGU8SFRNTElucHV0RWxlbWVudD4obm9kZS0+ZG9jdW1lbnQoKSkpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoYXNzb2NpYXRlRWxlbWVudC5pc1JhZGlvQnV0dG9uKCkgJiYgYXNz
b2NpYXRlRWxlbWVudC5uYW1lKCkgPT0gaW5wdXQubmFtZSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmplY3QgPSBheE9iamVjdENhY2hlKCktPmdl
dE9yQ3JlYXRlKCZhc3NvY2lhdGVFbGVtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxp
bmtlZFVJRWxlbWVudHMuYXBwZW5kKG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIHJhZGlvU2libGluZyA6IGlucHV0LnJhZGlvQnV0
dG9uR3JvdXAoKSkgeworICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iamVj
dCA9IGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUocmFkaW9TaWJsaW5nKSkKKyAgICAgICAg
ICAgICAgICBsaW5rZWRVSUVsZW1lbnRzLmFwcGVuZChvYmplY3QpOwogICAgICAgICB9CiAgICAg
fSBlbHNlIHsKICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55IHJhZGlvIGJ1dHRvbiBz
aWJsaW5ncyB3aXRoIHRoZSB0cmFkaXRpb25hbCBuYW1pbmcsIGxldHMgc2VhcmNoIGZvciBhIHJh
ZGlvIGdyb3VwIHJvbGUgYW5kIGZpbmQgaXRzIGNoaWxkcmVuLgpJbmRleDogU291cmNlL1dlYkNv
cmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2RvbS9DaGVja2VkUmFkaW9CdXR0b25zLmNwcAkocmV2aXNpb24gMTk4MzMyKQorKysgU291
cmNlL1dlYkNvcmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJDaGVja2Vk
UmFkaW9CdXR0b25zLmgiCisjaW5jbHVkZSAiUmFuZ2UuaCIKIAogI2luY2x1ZGUgIkhUTUxJbnB1
dEVsZW1lbnQuaCIKICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgpAQCAtMzgsNyArMzksOCBAQAog
ICAgIHZvaWQgcmVxdWlyZWRBdHRyaWJ1dGVDaGFuZ2VkKEhUTUxJbnB1dEVsZW1lbnQqKTsKICAg
ICB2b2lkIHJlbW92ZShIVE1MSW5wdXRFbGVtZW50Kik7CiAgICAgYm9vbCBjb250YWlucyhIVE1M
SW5wdXRFbGVtZW50KikgY29uc3Q7Ci0KKyAgICBWZWN0b3I8SFRNTElucHV0RWxlbWVudCo+IG1l
bWJlcnMoKSBjb25zdDsKKyAgICAKIHByaXZhdGU6CiAgICAgdm9pZCB1cGRhdGVWYWxpZGl0eUZv
ckFsbEJ1dHRvbnMoKTsKICAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKQEAgLTYwLDYgKzYyLDE0
IEBACiAgICAgcmV0dXJuICFpc1JlcXVpcmVkKCkgfHwgbV9jaGVja2VkQnV0dG9uOwogfQogCitW
ZWN0b3I8SFRNTElucHV0RWxlbWVudCo+IFJhZGlvQnV0dG9uR3JvdXA6Om1lbWJlcnMoKSBjb25z
dAoreworICAgIFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gbWVtYmVyczsKKyAgICBjb3B5VG9W
ZWN0b3IobV9tZW1iZXJzLCBtZW1iZXJzKTsKKyAgICBzdGQ6OnNvcnQobWVtYmVycy5iZWdpbigp
LCBtZW1iZXJzLmVuZCgpLCBkb2N1bWVudE9yZGVyQ29tcGFyYXRvcik7CisgICAgcmV0dXJuIG1l
bWJlcnM7Cit9CisgICAgCiB2b2lkIFJhZGlvQnV0dG9uR3JvdXA6OnNldENoZWNrZWRCdXR0b24o
SFRNTElucHV0RWxlbWVudCogYnV0dG9uKQogewogICAgIEhUTUxJbnB1dEVsZW1lbnQqIG9sZENo
ZWNrZWRCdXR0b24gPSBtX2NoZWNrZWRCdXR0b247CkBAIC0xODksNiArMTk5LDIyIEBACiAgICAg
Z3JvdXAtPmFkZChlbGVtZW50KTsKIH0KIAorVmVjdG9yPEhUTUxJbnB1dEVsZW1lbnQqPiBDaGVj
a2VkUmFkaW9CdXR0b25zOjpncm91cE1lbWJlcnMoSFRNTElucHV0RWxlbWVudCogZWxlbWVudCkg
Y29uc3QKK3sKKyAgICBBU1NFUlQoZWxlbWVudC0+aXNSYWRpb0J1dHRvbigpKTsKKyAgICBpZiAo
IWVsZW1lbnQgfHwgIWVsZW1lbnQtPmlzUmFkaW9CdXR0b24oKSkKKyAgICAgICAgcmV0dXJuIHsg
fTsKKyAgICAKKyAgICBhdXRvKiBuYW1lID0gZWxlbWVudC0+bmFtZSgpLmltcGwoKTsKKyAgICBp
ZiAoIW5hbWUpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICBhdXRvKiBncm91cCA9IG1fbmFt
ZVRvR3JvdXBNYXAtPmdldChuYW1lKTsKKyAgICBpZiAoIWdyb3VwKQorICAgICAgICByZXR1cm4g
eyB9OworICAgIHJldHVybiBncm91cC0+bWVtYmVycygpOworfQorICAgIAogdm9pZCBDaGVja2Vk
UmFkaW9CdXR0b25zOjp1cGRhdGVDaGVja2VkU3RhdGUoSFRNTElucHV0RWxlbWVudCogZWxlbWVu
dCkKIHsKICAgICBBU1NFUlQoZWxlbWVudC0+aXNSYWRpb0J1dHRvbigpKTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2RvbS9DaGVja2VkUmFkaW9CdXR0b25zLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuaAkocmV2aXNpb24gMTk4MzMyKQorKysg
U291cmNlL1dlYkNvcmUvZG9tL0NoZWNrZWRSYWRpb0J1dHRvbnMuaAkod29ya2luZyBjb3B5KQpA
QCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx3dGYvRm9yd2Fy
ZC5oPgogI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTQyLDcgKzQzLDggQEAKICAgICB2b2lkIHJlbW92
ZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50Kik7CiAgICAgSFRNTElucHV0RWxlbWVudCogY2hlY2tl
ZEJ1dHRvbkZvckdyb3VwKGNvbnN0IEF0b21pY1N0cmluZyYgZ3JvdXBOYW1lKSBjb25zdDsKICAg
ICBib29sIGlzSW5SZXF1aXJlZEdyb3VwKEhUTUxJbnB1dEVsZW1lbnQqKSBjb25zdDsKLQorICAg
IFZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gZ3JvdXBNZW1iZXJzKEhUTUxJbnB1dEVsZW1lbnQq
KSBjb25zdDsKKyAgICAKIHByaXZhdGU6CiAgICAgdHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmlu
Z0ltcGwqLCBzdGQ6OnVuaXF1ZV9wdHI8UmFkaW9CdXR0b25Hcm91cD4+IE5hbWVUb0dyb3VwTWFw
OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxOYW1lVG9Hcm91cE1hcD4gbV9uYW1lVG9Hcm91cE1hcDsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9SYW5nZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2RvbS9SYW5nZS5oCShyZXZpc2lvbiAxOTgzMzIpCisrKyBTb3VyY2UvV2ViQ29yZS9k
b20vUmFuZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTgyLDYgKzE4MiwxMSBAQAogV0VCQ09SRV9F
WFBPUlQgYm9vbCBhcmVSYW5nZXNFcXVhbChjb25zdCBSYW5nZSosIGNvbnN0IFJhbmdlKik7CiBi
b29sIHJhbmdlc092ZXJsYXAoY29uc3QgUmFuZ2UqLCBjb25zdCBSYW5nZSopOwogCitpbmxpbmUg
Ym9vbCBkb2N1bWVudE9yZGVyQ29tcGFyYXRvcihjb25zdCBOb2RlKiBhLCBjb25zdCBOb2RlKiBi
KQoreworICAgIHJldHVybiBSYW5nZTo6Y29tcGFyZUJvdW5kYXJ5UG9pbnRzKGNvbnN0X2Nhc3Q8
Tm9kZSo+KGEpLCAwLCBjb25zdF9jYXN0PE5vZGUqPihiKSwgMCwgQVNTRVJUX05PX0VYQ0VQVElP
TikgPCAwOworfQorCiB9IC8vIG5hbWVzcGFjZQogCiAjaWYgRU5BQkxFKFRSRUVfREVCVUdHSU5H
KQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCShyZXZpc2lv
biAxOTgzMzIpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNzc2LDYgKzE3NzYsMTQgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9
CiAKK1ZlY3RvcjxIVE1MSW5wdXRFbGVtZW50Kj4gSFRNTElucHV0RWxlbWVudDo6cmFkaW9CdXR0
b25Hcm91cCgpIGNvbnN0Cit7CisgICAgQ2hlY2tlZFJhZGlvQnV0dG9ucyogYnV0dG9ucyA9IGNo
ZWNrZWRSYWRpb0J1dHRvbnMoKTsKKyAgICBpZiAoIWJ1dHRvbnMpCisgICAgICAgIHJldHVybiB7
IH07CisgICAgcmV0dXJuIGJ1dHRvbnMtPmdyb3VwTWVtYmVycyhjb25zdF9jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPih0aGlzKSk7Cit9CisgICAgCiBIVE1MSW5wdXRFbGVtZW50KiBIVE1MSW5wdXRF
bGVtZW50OjpjaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cCgpIGNvbnN0CiB7CiAgICAgaWYgKENo
ZWNrZWRSYWRpb0J1dHRvbnMqIGJ1dHRvbnMgPSBjaGVja2VkUmFkaW9CdXR0b25zKCkpCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuaAkocmV2aXNpb24gMTk4MzMyKQor
KysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgJKHdvcmtpbmcgY29weSkK
QEAgLTI3MSw2ICsyNzEsNyBAQAogICAgIHZvaWQgbGlzdEF0dHJpYnV0ZVRhcmdldENoYW5nZWQo
KTsKICNlbmRpZgogCisgICAgVmVjdG9yPEhUTUxJbnB1dEVsZW1lbnQqPiByYWRpb0J1dHRvbkdy
b3VwKCkgY29uc3Q7CiAgICAgSFRNTElucHV0RWxlbWVudCogY2hlY2tlZFJhZGlvQnV0dG9uRm9y
R3JvdXAoKSBjb25zdDsKICAgICBib29sIGlzSW5SZXF1aXJlZFJhZGlvQnV0dG9uR3JvdXAoKTsK
IAo=
</data>
<flag name="review"
          id="299488"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>