<?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>73882</bug_id>
          
          <creation_ts>2011-12-05 18:00:45 -0800</creation_ts>
          <short_desc>Add 8 bit paths for StringTypeAdapter classes</short_desc>
          <delta_ts>2011-12-08 13:47:57 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73236</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>515560</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-12-05 18:00:45 -0800</bug_when>
    <thetext>The StringTypeAdapter class family processes strings using 16 bit characters, possibly requiring up conversion for 8 bit strings.

This impacts Kraken audio-oscillator and stanford-crypto-aes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517695</commentid>
    <comment_count>1</comment_count>
      <attachid>118450</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-12-08 12:35:48 -0800</bug_when>
    <thetext>Created attachment 118450
Patch

This patch has minimal performance improvement on the tests that us the paths due likely to the relative time spent in those paths.  It does seem to benefit date-format-xparb by 3-4%.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517709</commentid>
    <comment_count>2</comment_count>
      <attachid>118450</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-12-08 12:57:35 -0800</bug_when>
    <thetext>Comment on attachment 118450
Patch

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

&gt; Source/JavaScriptCore/runtime/UStringConcatenate.h:45
&gt; +    bool is8Bit() { return m_string.isNull() || m_string.is8Bit(); }

I wish we would be more consistent about these functions. For immutable objects like String I think that is8Bit and is16Bit should both return true for null and empty strings, characters8 and characters16 could both return a suitable pointer (if not null terminated it could even be the null pointer), and the guideline would be that callers check for the form they prefer first. But maybe there’s an argument for having is8Bit return false for null strings?

&gt; Source/JavaScriptCore/runtime/UStringConcatenate.h:50
&gt; +        ASSERT(is8Bit());
&gt; +        const LChar* characters = m_string.characters8();

Why is this assertion needed? Doesn’t characters8 already do the assertion?

&gt; Source/JavaScriptCore/runtime/UStringConcatenate.h:59
&gt; +        const UChar* characters = m_string.characters();
&gt;          for (unsigned i = 0; i &lt; m_length; ++i)
&gt; -            destination[i] = m_data[i];
&gt; +            destination[i] = characters[i];

I think it might be better to use character8 and characters16 for this. Why expand the original string just to write it one time?

&gt; Source/JavaScriptCore/runtime/UStringConcatenate.h:64
&gt; -    const UChar* m_data;
&gt; +    const JSC::UString&amp; m_string;
&gt;      unsigned m_length;

Seems wrong to have m_length if we also have m_string.

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:61
&gt; +    void writeTo(LChar* destination)
&gt; +    {
&gt; +        ASSERT(is8Bit());
&gt; +        *destination = m_buffer;
&gt; +    }

The assertion here seems pointless.

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:84
&gt; +        ASSERT(is8Bit());
&gt; +        *destination = m_buffer;

The assertion here seems pointless.

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:135
&gt; +    void writeTo(LChar* destination)
&gt; +    {
&gt; +        ASSERT(is8Bit());
&gt; +        for (unsigned i = 0; i &lt; m_length; ++i)
&gt; +            destination[i] = static_cast&lt;LChar&gt;(m_buffer[i]);
&gt; +    }

Assertion here seems pointless.

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:165
&gt; +        memcpy(destination, m_buffer, static_cast&lt;size_t&gt;(m_length) * sizeof(LChar));

Why do we need that static_cast?

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:204
&gt; +    void writeTo(LChar* destination)
&gt; +    {
&gt; +        ASSERT(is8Bit());
&gt; +        for (unsigned i = 0; i &lt; m_length; ++i)
&gt; +            destination[i] = m_buffer[i];
&gt; +    }

How can this ever work? Seems the assertion will always fire.

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:231
&gt; +        memcpy(destination, m_buffer, static_cast&lt;size_t&gt;(m_length) * sizeof(LChar));

Again, why the cast?

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:292
&gt; +            unsigned char c = m_buffer[i];
&gt; +            destination[i] = c;

Other places in this same patch we used static_cast for this. Why should we use assignment instead here? Why not the other places too?

&gt; Source/JavaScriptCore/wtf/text/StringConcatenate.h:416
&gt; +    bool is8Bit = adapter1.is8Bit() &amp;&amp; adapter2.is8Bit();
&gt; +
&gt; +    if (is8Bit) {

I don’t think this local variable is helpful.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517751</commentid>
    <comment_count>3</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-12-08 13:47:05 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 118450 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=118450&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/UStringConcatenate.h:45
&gt; &gt; +    bool is8Bit() { return m_string.isNull() || m_string.is8Bit(); }
&gt; 
&gt; I wish we would be more consistent about these functions. For immutable objects like String I think that is8Bit and is16Bit should both return true for null and empty strings, characters8 and characters16 could both return a suitable pointer (if not null terminated it could even be the null pointer), and the guideline would be that callers check for the form they prefer first. But maybe there’s an argument for having is8Bit return false for null strings?

The reason for the isNull() check is for the case that we are creating empty strings in most cases and the String version of is8Bit() just calls m_impl-&gt;is8Bit(), even if m_impl is null.  Instead of putting a null check in String::is8Bit the check is placed here to reduce the overhead on most other calls.

There is no is16bit, that is implemented as !is8Bit() and we want null and empty strings to be considered 8 bit.  characters8, characters16 and characters all return 0 on null strings.

Adopted all other comments including changing the ASSERT that never works to a CRASH().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517753</commentid>
    <comment_count>4</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-12-08 13:47:57 -0800</bug_when>
    <thetext>Committed r102380: &lt;http://trac.webkit.org/changeset/102380&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118450</attachid>
            <date>2011-12-08 12:35:48 -0800</date>
            <delta_ts>2011-12-08 12:57:35 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>73882-5.patch</filename>
            <type>text/plain</type>
            <size>20051</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTAyMzYxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI5IEBA
CisyMDExLTEyLTA4ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIEFkZCA4IGJpdCBwYXRocyBmb3IgU3RyaW5nVHlwZUFkYXB0ZXIgY2xhc3NlcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4ODIKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRlZCBpczhCaXQoKSBt
ZXRob2QgYW5kIHdyaXRlVG8oTENoYXIqKSBtZXRob2RzCisgICAgICAgIHRvIFN0cmluZ1R5cGVB
ZGFwdGVyPD4gY2xhc3Nlcy4gIFRoZSB3cml0ZVRvKExDaGFyKikKKyAgICAgICAgbWV0aG9kIGNh
biBiZSB1c2VkIGlmIGlzOEJpdCgpIHJldHVybnMgdHJ1ZS4gIFRoZQorICAgICAgICBub24tbmF0
aXZlIDggYml0IGNsYXNzZXMgY29udGFpbiBBU1NFUlQoaXM4Qml0KCkpCisgICAgICAgIGluIHRo
ZWlyIHdyaXRlVG8oTENoYXIqKS4KKworICAgICAgICBVcGRhdGVkIGFsbCBvZiB0aGUgdmFyaW91
cyB2ZXJzaW9ucyBvZiB0cnlNYWtlU3RyaW5nKCkgdG8KKyAgICAgICAgdXNlIDggYml0IHByb2Nl
c3NpbmcgaW4gdGhlIHVwZGF0ZWQgU3RyaW5nVHlwZUFkYXB0ZXI8PgorICAgICAgICBjbGFzc2Vz
LgorCisgICAgICAgIFRoaXMgaGFzIHNsaWdodCBpZiBhbnkgcGVyZm9ybWFuY2UgaW1wcm92ZW1l
bnQgb24ga3Jha2VuLgorCisgICAgICAgICogcnVudGltZS9VU3RyaW5nQ29uY2F0ZW5hdGUuaDoK
KyAgICAgICAgKiB3dGYvdGV4dC9TdHJpbmdDb25jYXRlbmF0ZS5oOgorICAgICAgICAoV1RGOjp0
cnlNYWtlU3RyaW5nKToKKyAgICAgICAgKiB3dGYvdGV4dC9TdHJpbmdPcGVyYXRvcnMuaDoKKyAg
ICAgICAgKFdURjo6U3RyaW5nQXBwZW5kOjppczhCaXQpOgorICAgICAgICAoV1RGOjpTdHJpbmdB
cHBlbmQ6OndyaXRlVG8pOgorCiAyMDExLTEyLTA3ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBs
ZS5jb20+CiAKICAgICAgICAgREZHIENTRSBzaG91bGQga25vdyB0aGF0IENoZWNrRnVuY3Rpb24g
aXMgcHVyZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0cmluZ0NvbmNh
dGVuYXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVVN0
cmluZ0NvbmNhdGVuYXRlLmgJKHJldmlzaW9uIDEwMjI5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL1VTdHJpbmdDb25jYXRlbmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSwy
MSArMzUsMzIgQEAgdGVtcGxhdGU8PgogY2xhc3MgU3RyaW5nVHlwZUFkYXB0ZXI8SlNDOjpVU3Ry
aW5nPiB7CiBwdWJsaWM6CiAgICAgU3RyaW5nVHlwZUFkYXB0ZXI8SlNDOjpVU3RyaW5nPihKU0M6
OlVTdHJpbmcmIHN0cmluZykKLSAgICAgICAgOiBtX2RhdGEoc3RyaW5nLmNoYXJhY3RlcnMoKSkK
KyAgICAgICAgOiBtX3N0cmluZyhzdHJpbmcpCiAgICAgICAgICwgbV9sZW5ndGgoc3RyaW5nLmxl
bmd0aCgpKQogICAgIHsKICAgICB9CiAKICAgICB1bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiBt
X2xlbmd0aDsgfQogCisgICAgYm9vbCBpczhCaXQoKSB7IHJldHVybiBtX3N0cmluZy5pc051bGwo
KSB8fCBtX3N0cmluZy5pczhCaXQoKTsgfQorCisgICAgdm9pZCB3cml0ZVRvKExDaGFyKiBkZXN0
aW5hdGlvbikKKyAgICB7CisgICAgICAgIEFTU0VSVChpczhCaXQoKSk7CisgICAgICAgIGNvbnN0
IExDaGFyKiBjaGFyYWN0ZXJzID0gbV9zdHJpbmcuY2hhcmFjdGVyczgoKTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fbGVuZ3RoOyArK2kpCisgICAgICAgICAgICBkZXN0aW5h
dGlvbltpXSA9IGNoYXJhY3RlcnNbaV07CisgICAgfQorCiAgICAgdm9pZCB3cml0ZVRvKFVDaGFy
KiBkZXN0aW5hdGlvbikKICAgICB7CisgICAgICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0g
bV9zdHJpbmcuY2hhcmFjdGVycygpOwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bV9sZW5ndGg7ICsraSkKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2ldID0gbV9kYXRhW2ldOwor
ICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBjaGFyYWN0ZXJzW2ldOwogICAgIH0KIAogcHJp
dmF0ZToKLSAgICBjb25zdCBVQ2hhciogbV9kYXRhOworICAgIGNvbnN0IEpTQzo6VVN0cmluZyYg
bV9zdHJpbmc7CiAgICAgdW5zaWduZWQgbV9sZW5ndGg7CiB9OwogCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nQ29uY2F0ZW5hdGUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nQ29uY2F0ZW5hdGUuaAkocmV2aXNp
b24gMTAyMjk4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0NvbmNh
dGVuYXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTUxLDYgKzUxLDE1IEBAIHB1YmxpYzoKICAgICB9
CiAKICAgICB1bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiAxOyB9CisKKyAgICBib29sIGlzOEJp
dCgpIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZvaWQgd3JpdGVUbyhMQ2hhciogZGVzdGluYXRp
b24pCisgICAgeworICAgICAgICBBU1NFUlQoaXM4Qml0KCkpOworICAgICAgICAqZGVzdGluYXRp
b24gPSBtX2J1ZmZlcjsKKyAgICB9CisKICAgICB2b2lkIHdyaXRlVG8oVUNoYXIqIGRlc3RpbmF0
aW9uKSB7ICpkZXN0aW5hdGlvbiA9IG1fYnVmZmVyOyB9CiAKIHByaXZhdGU6CkBAIC02Niw2ICs3
NSwxNSBAQCBwdWJsaWM6CiAgICAgfQogCiAgICAgdW5zaWduZWQgbGVuZ3RoKCkgeyByZXR1cm4g
MTsgfQorCisgICAgYm9vbCBpczhCaXQoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2b2lkIHdy
aXRlVG8oTENoYXIqIGRlc3RpbmF0aW9uKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzOEJpdCgp
KTsKKyAgICAgICAgKmRlc3RpbmF0aW9uID0gbV9idWZmZXI7CisgICAgfQorCiAgICAgdm9pZCB3
cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikgeyAqZGVzdGluYXRpb24gPSBtX2J1ZmZlcjsgfQog
CiBwcml2YXRlOgpAQCAtODEsNiArOTksMTUgQEAgcHVibGljOgogICAgIH0KIAogICAgIHVuc2ln
bmVkIGxlbmd0aCgpIHsgcmV0dXJuIDE7IH0KKworICAgIGJvb2wgaXM4Qml0KCkgeyByZXR1cm4g
bV9idWZmZXIgPD0gMHhmZjsgfQorCisgICAgdm9pZCB3cml0ZVRvKExDaGFyKiBkZXN0aW5hdGlv
bikKKyAgICB7CisgICAgICAgIEFTU0VSVChpczhCaXQoKSk7CisgICAgICAgICpkZXN0aW5hdGlv
biA9IHN0YXRpY19jYXN0PExDaGFyPihtX2J1ZmZlcik7CisgICAgfQorCiAgICAgdm9pZCB3cml0
ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikgeyAqZGVzdGluYXRpb24gPSBtX2J1ZmZlcjsgfQogCiBw
cml2YXRlOgpAQCAtOTgsNiArMTI1LDE1IEBAIHB1YmxpYzoKIAogICAgIHVuc2lnbmVkIGxlbmd0
aCgpIHsgcmV0dXJuIG1fbGVuZ3RoOyB9CiAKKyAgICBib29sIGlzOEJpdCgpIHsgcmV0dXJuIHRy
dWU7IH0KKworICAgIHZvaWQgd3JpdGVUbyhMQ2hhciogZGVzdGluYXRpb24pCisgICAgeworICAg
ICAgICBBU1NFUlQoaXM4Qml0KCkpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bV9sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc3RhdGljX2Nhc3Q8
TENoYXI+KG1fYnVmZmVyW2ldKTsKKyAgICB9CisKICAgICB2b2lkIHdyaXRlVG8oVUNoYXIqIGRl
c3RpbmF0aW9uKQogICAgIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fbGVu
Z3RoOyArK2kpIHsKQEAgLTEyMiw2ICsxNTgsMTMgQEAgcHVibGljOgogCiAgICAgdW5zaWduZWQg
bGVuZ3RoKCkgeyByZXR1cm4gbV9sZW5ndGg7IH0KIAorICAgIGJvb2wgaXM4Qml0KCkgeyByZXR1
cm4gdHJ1ZTsgfQorCisgICAgdm9pZCB3cml0ZVRvKExDaGFyKiBkZXN0aW5hdGlvbikKKyAgICB7
CisgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiwgbV9idWZmZXIsIHN0YXRpY19jYXN0PHNpemVf
dD4obV9sZW5ndGgpICogc2l6ZW9mKExDaGFyKSk7CisgICAgfQorCiAgICAgdm9pZCB3cml0ZVRv
KFVDaGFyKiBkZXN0aW5hdGlvbikKICAgICB7CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBtX2xlbmd0aDsgKytpKQpAQCAtMTUxLDYgKzE5NCwxNSBAQCBwdWJsaWM6CiAKICAgICB1
bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiBtX2xlbmd0aDsgfQogCisgICAgYm9vbCBpczhCaXQo
KSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCB3cml0ZVRvKExDaGFyKiBkZXN0aW5hdGlv
bikKKyAgICB7CisgICAgICAgIEFTU0VSVChpczhCaXQoKSk7CisgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBtX2xlbmd0aDsgKytpKQorICAgICAgICAgICAgZGVzdGluYXRpb25baV0g
PSBtX2J1ZmZlcltpXTsKKyAgICB9CisKICAgICB2b2lkIHdyaXRlVG8oVUNoYXIqIGRlc3RpbmF0
aW9uKQogICAgIHsKICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCBtX2J1ZmZlciwgc3RhdGlj
X2Nhc3Q8c2l6ZV90PihtX2xlbmd0aCkgKiBzaXplb2YoVUNoYXIpKTsKQEAgLTE3Miw2ICsyMjQs
MTMgQEAgcHVibGljOgogCiAgICAgdW5zaWduZWQgbGVuZ3RoKCkgeyByZXR1cm4gbV9sZW5ndGg7
IH0KIAorICAgIGJvb2wgaXM4Qml0KCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdm9pZCB3cml0
ZVRvKExDaGFyKiBkZXN0aW5hdGlvbikKKyAgICB7CisgICAgICAgIG1lbWNweShkZXN0aW5hdGlv
biwgbV9idWZmZXIsIHN0YXRpY19jYXN0PHNpemVfdD4obV9sZW5ndGgpICogc2l6ZW9mKExDaGFy
KSk7CisgICAgfQorCiAgICAgdm9pZCB3cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikKICAgICB7
CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2xlbmd0aDsgKytpKSB7CkBAIC0x
OTMsMTUgKzI1MiwyMiBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9sZW5ndGgoc3RybGVuKHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcikpKQogICAgIHsKICAgICB9Ci0gICAgCisK
ICAgICB1bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiBtX2xlbmd0aDsgfQotICAgIAorCisgICAg
Ym9vbCBpczhCaXQoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2b2lkIHdyaXRlVG8oTENoYXIq
IGRlc3RpbmF0aW9uKQorICAgIHsKKyAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCBtX2J1ZmZl
ciwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtX2xlbmd0aCkgKiBzaXplb2YoTENoYXIpKTsKKyAgICB9
CisKICAgICB2b2lkIHdyaXRlVG8oVUNoYXIqIGRlc3RpbmF0aW9uKQogICAgIHsKICAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fbGVuZ3RoOyArK2kpCiAgICAgICAgICAgICBkZXN0
aW5hdGlvbltpXSA9IG1fYnVmZmVyW2ldOwogICAgIH0KLSAgICAKKwogcHJpdmF0ZToKICAgICBj
b25zdCBMQ2hhciogbV9idWZmZXI7CiAgICAgdW5zaWduZWQgbV9sZW5ndGg7CkBAIC0yMTcsNiAr
MjgzLDE2IEBAIHB1YmxpYzoKIAogICAgIHNpemVfdCBsZW5ndGgoKSB7IHJldHVybiBtX2J1ZmZl
ci5zaXplKCk7IH0KIAorICAgIGJvb2wgaXM4Qml0KCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAg
dm9pZCB3cml0ZVRvKExDaGFyKiBkZXN0aW5hdGlvbikKKyAgICB7CisgICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbV9idWZmZXIuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIGNoYXIgYyA9IG1fYnVmZmVyW2ldOworICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBj
OworICAgICAgICB9CisgICAgfQorCiAgICAgdm9pZCB3cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlv
bikKICAgICB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9idWZmZXIuc2l6ZSgp
OyArK2kpIHsKQEAgLTIzOSw2ICszMTUsMTQgQEAgcHVibGljOgogCiAgICAgc2l6ZV90IGxlbmd0
aCgpIHsgcmV0dXJuIG1fYnVmZmVyLnNpemUoKTsgfQogCisgICAgYm9vbCBpczhCaXQoKSB7IHJl
dHVybiB0cnVlOyB9CisKKyAgICB2b2lkIHdyaXRlVG8oTENoYXIqIGRlc3RpbmF0aW9uKQorICAg
IHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2J1ZmZlci5zaXplKCk7ICsraSkK
KyAgICAgICAgICAgIGRlc3RpbmF0aW9uW2ldID0gbV9idWZmZXJbaV07CisgICAgfQorCiAgICAg
dm9pZCB3cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikKICAgICB7CiAgICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbV9idWZmZXIuc2l6ZSgpOyArK2kpCkBAIC0yNTksMTMgKzM0MywyOCBA
QCBwdWJsaWM6CiAKICAgICB1bnNpZ25lZCBsZW5ndGgoKSB7IHJldHVybiBtX2J1ZmZlci5sZW5n
dGgoKTsgfQogCi0gICAgdm9pZCB3cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikKKyAgICBib29s
IGlzOEJpdCgpIHsgcmV0dXJuIG1fYnVmZmVyLmlzTnVsbCgpIHx8IG1fYnVmZmVyLmlzOEJpdCgp
OyB9CisKKyAgICB2b2lkIHdyaXRlVG8oTENoYXIqIGRlc3RpbmF0aW9uKQogICAgIHsKLSAgICAg
ICAgY29uc3QgVUNoYXIqIGRhdGEgPSBtX2J1ZmZlci5jaGFyYWN0ZXJzKCk7CiAgICAgICAgIHVu
c2lnbmVkIGxlbmd0aCA9IG1fYnVmZmVyLmxlbmd0aCgpOworCisgICAgICAgIEFTU0VSVChpczhC
aXQoKSk7CisgICAgICAgIGNvbnN0IExDaGFyKiBkYXRhID0gbV9idWZmZXIuY2hhcmFjdGVyczgo
KTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQogICAgICAg
ICAgICAgZGVzdGluYXRpb25baV0gPSBkYXRhW2ldOworICAgICAgICAKKyAgICAgICAgV1RGX1NU
UklOR1RZUEVBREFQVEVSX0NPUElFRF9XVEZfU1RSSU5HKCk7CisgICAgfQorCisgICAgdm9pZCB3
cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGxlbmd0
aCA9IG1fYnVmZmVyLmxlbmd0aCgpOwogCisgICAgICAgIGNvbnN0IFVDaGFyKiBkYXRhID0gbV9i
dWZmZXIuY2hhcmFjdGVycygpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVu
Z3RoOyArK2kpCisgICAgICAgICAgICBkZXN0aW5hdGlvbltpXSA9IGRhdGFbaV07CisgICAgICAg
IAogICAgICAgICBXVEZfU1RSSU5HVFlQRUFEQVBURVJfQ09QSUVEX1dURl9TVFJJTkcoKTsKICAg
ICB9CiAKQEAgLTI4Miw2ICszODEsMTAgQEAgcHVibGljOgogICAgIH0KIAogICAgIHVuc2lnbmVk
IGxlbmd0aCgpIHsgcmV0dXJuIG1fYWRhcHRlci5sZW5ndGgoKTsgfQorCisgICAgYm9vbCBpczhC
aXQoKSB7IHJldHVybiBtX2FkYXB0ZXIuaXM4Qml0KCk7IH0KKworICAgIHZvaWQgd3JpdGVUbyhM
Q2hhciogZGVzdGluYXRpb24pIHsgbV9hZGFwdGVyLndyaXRlVG8oZGVzdGluYXRpb24pOyB9CiAg
ICAgdm9pZCB3cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikgeyBtX2FkYXB0ZXIud3JpdGVUbyhk
ZXN0aW5hdGlvbik7IH0KIAogcHJpdmF0ZToKQEAgLTMwMiwxMiArNDA1LDI5IEBAIFBhc3NSZWZQ
dHI8U3RyaW5nSW1wbD4gdHJ5TWFrZVN0cmluZyhTdHIKICAgICBTdHJpbmdUeXBlQWRhcHRlcjxT
dHJpbmdUeXBlMT4gYWRhcHRlcjEoc3RyaW5nMSk7CiAgICAgU3RyaW5nVHlwZUFkYXB0ZXI8U3Ry
aW5nVHlwZTI+IGFkYXB0ZXIyKHN0cmluZzIpOwogCi0gICAgVUNoYXIqIGJ1ZmZlcjsKICAgICBi
b29sIG92ZXJmbG93ID0gZmFsc2U7CiAgICAgdW5zaWduZWQgbGVuZ3RoID0gYWRhcHRlcjEubGVu
Z3RoKCk7CiAgICAgc3VtV2l0aE92ZXJmbG93KGxlbmd0aCwgYWRhcHRlcjIubGVuZ3RoKCksIG92
ZXJmbG93KTsKICAgICBpZiAob3ZlcmZsb3cpCiAgICAgICAgIHJldHVybiAwOworCisgICAgYm9v
bCBpczhCaXQgPSBhZGFwdGVyMS5pczhCaXQoKSAmJiBhZGFwdGVyMi5pczhCaXQoKTsKKworICAg
IGlmIChpczhCaXQpIHsKKyAgICAgICAgTENoYXIqIGJ1ZmZlcjsKKyAgICAgICAgUmVmUHRyPFN0
cmluZ0ltcGw+IHJlc3VsdEltcGwgPSBTdHJpbmdJbXBsOjp0cnlDcmVhdGVVbmluaXRpYWxpemVk
KGxlbmd0aCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKCFyZXN1bHRJbXBsKQorICAgICAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAgICAgTENoYXIqIHJlc3VsdCA9IGJ1ZmZlcjsKKyAgICAgICAgYWRh
cHRlcjEud3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjEubGVuZ3Ro
KCk7CisgICAgICAgIGFkYXB0ZXIyLndyaXRlVG8ocmVzdWx0KTsKKworICAgICAgICByZXR1cm4g
cmVzdWx0SW1wbC5yZWxlYXNlKCk7CisgICAgfQorCisgICAgVUNoYXIqIGJ1ZmZlcjsKICAgICBS
ZWZQdHI8U3RyaW5nSW1wbD4gcmVzdWx0SW1wbCA9IFN0cmluZ0ltcGw6OnRyeUNyZWF0ZVVuaW5p
dGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOwogICAgIGlmICghcmVzdWx0SW1wbCkKICAgICAgICAg
cmV0dXJuIDA7CkBAIC0zMjcsMTMgKzQ0NywzMiBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHRy
eU1ha2VTdHJpbmcoU3RyCiAgICAgU3RyaW5nVHlwZUFkYXB0ZXI8U3RyaW5nVHlwZTI+IGFkYXB0
ZXIyKHN0cmluZzIpOwogICAgIFN0cmluZ1R5cGVBZGFwdGVyPFN0cmluZ1R5cGUzPiBhZGFwdGVy
MyhzdHJpbmczKTsKIAotICAgIFVDaGFyKiBidWZmZXIgPSAwOwogICAgIGJvb2wgb3ZlcmZsb3cg
PSBmYWxzZTsKICAgICB1bnNpZ25lZCBsZW5ndGggPSBhZGFwdGVyMS5sZW5ndGgoKTsKICAgICBz
dW1XaXRoT3ZlcmZsb3cobGVuZ3RoLCBhZGFwdGVyMi5sZW5ndGgoKSwgb3ZlcmZsb3cpOwogICAg
IHN1bVdpdGhPdmVyZmxvdyhsZW5ndGgsIGFkYXB0ZXIzLmxlbmd0aCgpLCBvdmVyZmxvdyk7CiAg
ICAgaWYgKG92ZXJmbG93KQogICAgICAgICByZXR1cm4gMDsKKworICAgIGJvb2wgaXM4Qml0ID0g
YWRhcHRlcjEuaXM4Qml0KCkgJiYgYWRhcHRlcjIuaXM4Qml0KCkgJiYgYWRhcHRlcjMuaXM4Qml0
KCk7CisKKyAgICBpZiAoaXM4Qml0KSB7CisgICAgICAgIExDaGFyKiBidWZmZXI7CisgICAgICAg
IFJlZlB0cjxTdHJpbmdJbXBsPiByZXN1bHRJbXBsID0gU3RyaW5nSW1wbDo6dHJ5Q3JlYXRlVW5p
bml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAgICAgIGlmICghcmVzdWx0SW1wbCkKKyAg
ICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIExDaGFyKiByZXN1bHQgPSBidWZmZXI7Cisg
ICAgICAgIGFkYXB0ZXIxLndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ICs9IGFkYXB0
ZXIxLmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyMi53cml0ZVRvKHJlc3VsdCk7CisgICAgICAg
IHJlc3VsdCArPSBhZGFwdGVyMi5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjMud3JpdGVUbyhy
ZXN1bHQpOworCisgICAgICAgIHJldHVybiByZXN1bHRJbXBsLnJlbGVhc2UoKTsKKyAgICB9CisK
KyAgICBVQ2hhciogYnVmZmVyID0gMDsKICAgICBSZWZQdHI8U3RyaW5nSW1wbD4gcmVzdWx0SW1w
bCA9IFN0cmluZ0ltcGw6OnRyeUNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOwog
ICAgIGlmICghcmVzdWx0SW1wbCkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0zNTYsNyArNDk1LDYg
QEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiB0cnlNYWtlU3RyaW5nKFN0cgogICAgIFN0cmluZ1R5
cGVBZGFwdGVyPFN0cmluZ1R5cGUzPiBhZGFwdGVyMyhzdHJpbmczKTsKICAgICBTdHJpbmdUeXBl
QWRhcHRlcjxTdHJpbmdUeXBlND4gYWRhcHRlcjQoc3RyaW5nNCk7CiAKLSAgICBVQ2hhciogYnVm
ZmVyOwogICAgIGJvb2wgb3ZlcmZsb3cgPSBmYWxzZTsKICAgICB1bnNpZ25lZCBsZW5ndGggPSBh
ZGFwdGVyMS5sZW5ndGgoKTsKICAgICBzdW1XaXRoT3ZlcmZsb3cobGVuZ3RoLCBhZGFwdGVyMi5s
ZW5ndGgoKSwgb3ZlcmZsb3cpOwpAQCAtMzY0LDYgKzUwMiwyOCBAQCBQYXNzUmVmUHRyPFN0cmlu
Z0ltcGw+IHRyeU1ha2VTdHJpbmcoU3RyCiAgICAgc3VtV2l0aE92ZXJmbG93KGxlbmd0aCwgYWRh
cHRlcjQubGVuZ3RoKCksIG92ZXJmbG93KTsKICAgICBpZiAob3ZlcmZsb3cpCiAgICAgICAgIHJl
dHVybiAwOworCisgICAgYm9vbCBpczhCaXQgPSBhZGFwdGVyMS5pczhCaXQoKSAmJiBhZGFwdGVy
Mi5pczhCaXQoKSAmJiBhZGFwdGVyMy5pczhCaXQoKSAmJiBhZGFwdGVyNC5pczhCaXQoKTsKKwor
ICAgIGlmIChpczhCaXQpIHsKKyAgICAgICAgTENoYXIqIGJ1ZmZlcjsKKyAgICAgICAgUmVmUHRy
PFN0cmluZ0ltcGw+IHJlc3VsdEltcGwgPSBTdHJpbmdJbXBsOjp0cnlDcmVhdGVVbmluaXRpYWxp
emVkKGxlbmd0aCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKCFyZXN1bHRJbXBsKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgTENoYXIqIHJlc3VsdCA9IGJ1ZmZlcjsKKyAgICAgICAg
YWRhcHRlcjEud3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjEubGVu
Z3RoKCk7CisgICAgICAgIGFkYXB0ZXIyLndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0
ICs9IGFkYXB0ZXIyLmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyMy53cml0ZVRvKHJlc3VsdCk7
CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyMy5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjQu
d3JpdGVUbyhyZXN1bHQpOworCisgICAgICAgIHJldHVybiByZXN1bHRJbXBsLnJlbGVhc2UoKTsK
KyAgICB9CisKKyAgICBVQ2hhciogYnVmZmVyOwogICAgIFJlZlB0cjxTdHJpbmdJbXBsPiByZXN1
bHRJbXBsID0gU3RyaW5nSW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZl
cik7CiAgICAgaWYgKCFyZXN1bHRJbXBsKQogICAgICAgICByZXR1cm4gMDsKQEAgLTM4OSw3ICs1
NDksNiBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHRyeU1ha2VTdHJpbmcoU3RyCiAgICAgU3Ry
aW5nVHlwZUFkYXB0ZXI8U3RyaW5nVHlwZTQ+IGFkYXB0ZXI0KHN0cmluZzQpOwogICAgIFN0cmlu
Z1R5cGVBZGFwdGVyPFN0cmluZ1R5cGU1PiBhZGFwdGVyNShzdHJpbmc1KTsKIAotICAgIFVDaGFy
KiBidWZmZXI7CiAgICAgYm9vbCBvdmVyZmxvdyA9IGZhbHNlOwogICAgIHVuc2lnbmVkIGxlbmd0
aCA9IGFkYXB0ZXIxLmxlbmd0aCgpOwogICAgIHN1bVdpdGhPdmVyZmxvdyhsZW5ndGgsIGFkYXB0
ZXIyLmxlbmd0aCgpLCBvdmVyZmxvdyk7CkBAIC0zOTgsNiArNTU3LDMwIEBAIFBhc3NSZWZQdHI8
U3RyaW5nSW1wbD4gdHJ5TWFrZVN0cmluZyhTdHIKICAgICBzdW1XaXRoT3ZlcmZsb3cobGVuZ3Ro
LCBhZGFwdGVyNS5sZW5ndGgoKSwgb3ZlcmZsb3cpOwogICAgIGlmIChvdmVyZmxvdykKICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBib29sIGlzOEJpdCA9IGFkYXB0ZXIxLmlzOEJpdCgpICYmIGFk
YXB0ZXIyLmlzOEJpdCgpICYmIGFkYXB0ZXIzLmlzOEJpdCgpICYmIGFkYXB0ZXI0LmlzOEJpdCgp
ICYmIGFkYXB0ZXI1LmlzOEJpdCgpOworCisgICAgaWYgKGlzOEJpdCkgeworICAgICAgICBMQ2hh
ciogYnVmZmVyOworICAgICAgICBSZWZQdHI8U3RyaW5nSW1wbD4gcmVzdWx0SW1wbCA9IFN0cmlu
Z0ltcGw6OnRyeUNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAgICAgICBp
ZiAoIXJlc3VsdEltcGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBMQ2hhciog
cmVzdWx0ID0gYnVmZmVyOworICAgICAgICBhZGFwdGVyMS53cml0ZVRvKHJlc3VsdCk7CisgICAg
ICAgIHJlc3VsdCArPSBhZGFwdGVyMS5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjIud3JpdGVU
byhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjIubGVuZ3RoKCk7CisgICAgICAg
IGFkYXB0ZXIzLndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ICs9IGFkYXB0ZXIzLmxl
bmd0aCgpOworICAgICAgICBhZGFwdGVyNC53cml0ZVRvKHJlc3VsdCk7CisgICAgICAgIHJlc3Vs
dCArPSBhZGFwdGVyNC5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjUud3JpdGVUbyhyZXN1bHQp
OworCisgICAgICAgIHJldHVybiByZXN1bHRJbXBsLnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBV
Q2hhciogYnVmZmVyOwogICAgIFJlZlB0cjxTdHJpbmdJbXBsPiByZXN1bHRJbXBsID0gU3RyaW5n
SW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CiAgICAgaWYgKCFy
ZXN1bHRJbXBsKQogICAgICAgICByZXR1cm4gMDsKQEAgLTQyNiw3ICs2MDksNiBAQCBQYXNzUmVm
UHRyPFN0cmluZ0ltcGw+IHRyeU1ha2VTdHJpbmcoU3RyCiAgICAgU3RyaW5nVHlwZUFkYXB0ZXI8
U3RyaW5nVHlwZTU+IGFkYXB0ZXI1KHN0cmluZzUpOwogICAgIFN0cmluZ1R5cGVBZGFwdGVyPFN0
cmluZ1R5cGU2PiBhZGFwdGVyNihzdHJpbmc2KTsKIAotICAgIFVDaGFyKiBidWZmZXI7CiAgICAg
Ym9vbCBvdmVyZmxvdyA9IGZhbHNlOwogICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFkYXB0ZXIxLmxl
bmd0aCgpOwogICAgIHN1bVdpdGhPdmVyZmxvdyhsZW5ndGgsIGFkYXB0ZXIyLmxlbmd0aCgpLCBv
dmVyZmxvdyk7CkBAIC00MzYsNiArNjE4LDMyIEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gdHJ5
TWFrZVN0cmluZyhTdHIKICAgICBzdW1XaXRoT3ZlcmZsb3cobGVuZ3RoLCBhZGFwdGVyNi5sZW5n
dGgoKSwgb3ZlcmZsb3cpOwogICAgIGlmIChvdmVyZmxvdykKICAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBib29sIGlzOEJpdCA9IGFkYXB0ZXIxLmlzOEJpdCgpICYmIGFkYXB0ZXIyLmlzOEJpdCgp
ICYmIGFkYXB0ZXIzLmlzOEJpdCgpICYmIGFkYXB0ZXI0LmlzOEJpdCgpICYmIGFkYXB0ZXI1Lmlz
OEJpdCgpICYmIGFkYXB0ZXI2LmlzOEJpdCgpOworCisgICAgaWYgKGlzOEJpdCkgeworICAgICAg
ICBMQ2hhciogYnVmZmVyOworICAgICAgICBSZWZQdHI8U3RyaW5nSW1wbD4gcmVzdWx0SW1wbCA9
IFN0cmluZ0ltcGw6OnRyeUNyZWF0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAg
ICAgICBpZiAoIXJlc3VsdEltcGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBM
Q2hhciogcmVzdWx0ID0gYnVmZmVyOworICAgICAgICBhZGFwdGVyMS53cml0ZVRvKHJlc3VsdCk7
CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyMS5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjIu
d3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjIubGVuZ3RoKCk7Cisg
ICAgICAgIGFkYXB0ZXIzLndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ICs9IGFkYXB0
ZXIzLmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyNC53cml0ZVRvKHJlc3VsdCk7CisgICAgICAg
IHJlc3VsdCArPSBhZGFwdGVyNC5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjUud3JpdGVUbyhy
ZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjUubGVuZ3RoKCk7CisgICAgICAgIGFk
YXB0ZXI2LndyaXRlVG8ocmVzdWx0KTsKKworICAgICAgICByZXR1cm4gcmVzdWx0SW1wbC5yZWxl
YXNlKCk7ICAgICAgICAKKyAgICB9CisKKyAgICBVQ2hhciogYnVmZmVyOwogICAgIFJlZlB0cjxT
dHJpbmdJbXBsPiByZXN1bHRJbXBsID0gU3RyaW5nSW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXpl
ZChsZW5ndGgsIGJ1ZmZlcik7CiAgICAgaWYgKCFyZXN1bHRJbXBsKQogICAgICAgICByZXR1cm4g
MDsKQEAgLTQ2Nyw3ICs2NzUsNiBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHRyeU1ha2VTdHJp
bmcoU3RyCiAgICAgU3RyaW5nVHlwZUFkYXB0ZXI8U3RyaW5nVHlwZTY+IGFkYXB0ZXI2KHN0cmlu
ZzYpOwogICAgIFN0cmluZ1R5cGVBZGFwdGVyPFN0cmluZ1R5cGU3PiBhZGFwdGVyNyhzdHJpbmc3
KTsKIAotICAgIFVDaGFyKiBidWZmZXI7CiAgICAgYm9vbCBvdmVyZmxvdyA9IGZhbHNlOwogICAg
IHVuc2lnbmVkIGxlbmd0aCA9IGFkYXB0ZXIxLmxlbmd0aCgpOwogICAgIHN1bVdpdGhPdmVyZmxv
dyhsZW5ndGgsIGFkYXB0ZXIyLmxlbmd0aCgpLCBvdmVyZmxvdyk7CkBAIC00NzgsNiArNjg1LDM0
IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gdHJ5TWFrZVN0cmluZyhTdHIKICAgICBzdW1XaXRo
T3ZlcmZsb3cobGVuZ3RoLCBhZGFwdGVyNy5sZW5ndGgoKSwgb3ZlcmZsb3cpOwogICAgIGlmIChv
dmVyZmxvdykKICAgICAgICAgcmV0dXJuIDA7CisKKyAgICBib29sIGlzOEJpdCA9IGFkYXB0ZXIx
LmlzOEJpdCgpICYmIGFkYXB0ZXIyLmlzOEJpdCgpICYmIGFkYXB0ZXIzLmlzOEJpdCgpICYmIGFk
YXB0ZXI0LmlzOEJpdCgpICYmIGFkYXB0ZXI1LmlzOEJpdCgpICYmIGFkYXB0ZXI2LmlzOEJpdCgp
OworCisgICAgaWYgKGlzOEJpdCkgeworICAgICAgICBMQ2hhciogYnVmZmVyOworICAgICAgICBS
ZWZQdHI8U3RyaW5nSW1wbD4gcmVzdWx0SW1wbCA9IFN0cmluZ0ltcGw6OnRyeUNyZWF0ZVVuaW5p
dGlhbGl6ZWQobGVuZ3RoLCBidWZmZXIpOworICAgICAgICBpZiAoIXJlc3VsdEltcGwpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBMQ2hhciogcmVzdWx0ID0gYnVmZmVyOworICAg
ICAgICBhZGFwdGVyMS53cml0ZVRvKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVy
MS5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjIud3JpdGVUbyhyZXN1bHQpOworICAgICAgICBy
ZXN1bHQgKz0gYWRhcHRlcjIubGVuZ3RoKCk7CisgICAgICAgIGFkYXB0ZXIzLndyaXRlVG8ocmVz
dWx0KTsKKyAgICAgICAgcmVzdWx0ICs9IGFkYXB0ZXIzLmxlbmd0aCgpOworICAgICAgICBhZGFw
dGVyNC53cml0ZVRvKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyNC5sZW5ndGgo
KTsKKyAgICAgICAgYWRhcHRlcjUud3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0g
YWRhcHRlcjUubGVuZ3RoKCk7CisgICAgICAgIGFkYXB0ZXI2LndyaXRlVG8ocmVzdWx0KTsKKyAg
ICAgICAgcmVzdWx0ICs9IGFkYXB0ZXI2Lmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyNy53cml0
ZVRvKHJlc3VsdCk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdEltcGwucmVsZWFzZSgpOworICAg
IH0KKworICAgIFVDaGFyKiBidWZmZXI7CiAgICAgUmVmUHRyPFN0cmluZ0ltcGw+IHJlc3VsdElt
cGwgPSBTdHJpbmdJbXBsOjp0cnlDcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsK
ICAgICBpZiAoIXJlc3VsdEltcGwpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNTEyLDcgKzc0Nyw2
IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gdHJ5TWFrZVN0cmluZyhTdHIKICAgICBTdHJpbmdU
eXBlQWRhcHRlcjxTdHJpbmdUeXBlNz4gYWRhcHRlcjcoc3RyaW5nNyk7CiAgICAgU3RyaW5nVHlw
ZUFkYXB0ZXI8U3RyaW5nVHlwZTg+IGFkYXB0ZXI4KHN0cmluZzgpOwogCi0gICAgVUNoYXIqIGJ1
ZmZlcjsKICAgICBib29sIG92ZXJmbG93ID0gZmFsc2U7CiAgICAgdW5zaWduZWQgbGVuZ3RoID0g
YWRhcHRlcjEubGVuZ3RoKCk7CiAgICAgc3VtV2l0aE92ZXJmbG93KGxlbmd0aCwgYWRhcHRlcjIu
bGVuZ3RoKCksIG92ZXJmbG93KTsKQEAgLTUyNCw2ICs3NTgsMzYgQEAgUGFzc1JlZlB0cjxTdHJp
bmdJbXBsPiB0cnlNYWtlU3RyaW5nKFN0cgogICAgIHN1bVdpdGhPdmVyZmxvdyhsZW5ndGgsIGFk
YXB0ZXI4Lmxlbmd0aCgpLCBvdmVyZmxvdyk7CiAgICAgaWYgKG92ZXJmbG93KQogICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGJvb2wgaXM4Qml0ID0gYWRhcHRlcjEuaXM4Qml0KCkgJiYgYWRhcHRl
cjIuaXM4Qml0KCkgJiYgYWRhcHRlcjMuaXM4Qml0KCkgJiYgYWRhcHRlcjQuaXM4Qml0KCkgJiYg
YWRhcHRlcjUuaXM4Qml0KCkgJiYgYWRhcHRlcjYuaXM4Qml0KCkgJiYgYWRhcHRlcjcuaXM4Qml0
KCkgJiYgYWRhcHRlcjguaXM4Qml0KCk7CisKKyAgICBpZiAoaXM4Qml0KSB7CisgICAgICAgIExD
aGFyKiBidWZmZXI7CisgICAgICAgIFJlZlB0cjxTdHJpbmdJbXBsPiByZXN1bHRJbXBsID0gU3Ry
aW5nSW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAgICAg
IGlmICghcmVzdWx0SW1wbCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIExDaGFy
KiByZXN1bHQgPSBidWZmZXI7CisgICAgICAgIGFkYXB0ZXIxLndyaXRlVG8ocmVzdWx0KTsKKyAg
ICAgICAgcmVzdWx0ICs9IGFkYXB0ZXIxLmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyMi53cml0
ZVRvKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyMi5sZW5ndGgoKTsKKyAgICAg
ICAgYWRhcHRlcjMud3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjMu
bGVuZ3RoKCk7CisgICAgICAgIGFkYXB0ZXI0LndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgcmVz
dWx0ICs9IGFkYXB0ZXI0Lmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyNS53cml0ZVRvKHJlc3Vs
dCk7CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyNS5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRl
cjYud3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjYubGVuZ3RoKCk7
CisgICAgICAgIGFkYXB0ZXI3LndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ICs9IGFk
YXB0ZXI3Lmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyOC53cml0ZVRvKHJlc3VsdCk7CisKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdEltcGwucmVsZWFzZSgpOworICAgIH0KKworICAgIFVDaGFyKiBi
dWZmZXI7CiAgICAgUmVmUHRyPFN0cmluZ0ltcGw+IHJlc3VsdEltcGwgPSBTdHJpbmdJbXBsOjp0
cnlDcmVhdGVVbmluaXRpYWxpemVkKGxlbmd0aCwgYnVmZmVyKTsKICAgICBpZiAoIXJlc3VsdElt
cGwpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNTYxLDcgKzgyNSw2IEBAIFBhc3NSZWZQdHI8U3Ry
aW5nSW1wbD4gdHJ5TWFrZVN0cmluZyhTdHIKICAgICBTdHJpbmdUeXBlQWRhcHRlcjxTdHJpbmdU
eXBlOD4gYWRhcHRlcjgoc3RyaW5nOCk7CiAgICAgU3RyaW5nVHlwZUFkYXB0ZXI8U3RyaW5nVHlw
ZTk+IGFkYXB0ZXI5KHN0cmluZzkpOwogCi0gICAgVUNoYXIqIGJ1ZmZlcjsKICAgICBib29sIG92
ZXJmbG93ID0gZmFsc2U7CiAgICAgdW5zaWduZWQgbGVuZ3RoID0gYWRhcHRlcjEubGVuZ3RoKCk7
CiAgICAgc3VtV2l0aE92ZXJmbG93KGxlbmd0aCwgYWRhcHRlcjIubGVuZ3RoKCksIG92ZXJmbG93
KTsKQEAgLTU3NCw2ICs4MzcsMzggQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiB0cnlNYWtlU3Ry
aW5nKFN0cgogICAgIHN1bVdpdGhPdmVyZmxvdyhsZW5ndGgsIGFkYXB0ZXI5Lmxlbmd0aCgpLCBv
dmVyZmxvdyk7CiAgICAgaWYgKG92ZXJmbG93KQogICAgICAgICByZXR1cm4gMDsKKworICAgIGJv
b2wgaXM4Qml0ID0gYWRhcHRlcjEuaXM4Qml0KCkgJiYgYWRhcHRlcjIuaXM4Qml0KCkgJiYgYWRh
cHRlcjMuaXM4Qml0KCkgJiYgYWRhcHRlcjQuaXM4Qml0KCkgJiYgYWRhcHRlcjUuaXM4Qml0KCkg
JiYgYWRhcHRlcjYuaXM4Qml0KCkgJiYgYWRhcHRlcjcuaXM4Qml0KCkgJiYgYWRhcHRlcjguaXM4
Qml0KCkgJiYgYWRhcHRlcjkuaXM4Qml0KCk7CisKKyAgICBpZiAoaXM4Qml0KSB7CisgICAgICAg
IExDaGFyKiBidWZmZXI7CisgICAgICAgIFJlZlB0cjxTdHJpbmdJbXBsPiByZXN1bHRJbXBsID0g
U3RyaW5nSW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7CisgICAg
ICAgIGlmICghcmVzdWx0SW1wbCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIExD
aGFyKiByZXN1bHQgPSBidWZmZXI7CisgICAgICAgIGFkYXB0ZXIxLndyaXRlVG8ocmVzdWx0KTsK
KyAgICAgICAgcmVzdWx0ICs9IGFkYXB0ZXIxLmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyMi53
cml0ZVRvKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyMi5sZW5ndGgoKTsKKyAg
ICAgICAgYWRhcHRlcjMud3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRl
cjMubGVuZ3RoKCk7CisgICAgICAgIGFkYXB0ZXI0LndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAg
cmVzdWx0ICs9IGFkYXB0ZXI0Lmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyNS53cml0ZVRvKHJl
c3VsdCk7CisgICAgICAgIHJlc3VsdCArPSBhZGFwdGVyNS5sZW5ndGgoKTsKKyAgICAgICAgYWRh
cHRlcjYud3JpdGVUbyhyZXN1bHQpOworICAgICAgICByZXN1bHQgKz0gYWRhcHRlcjYubGVuZ3Ro
KCk7CisgICAgICAgIGFkYXB0ZXI3LndyaXRlVG8ocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ICs9
IGFkYXB0ZXI3Lmxlbmd0aCgpOworICAgICAgICBhZGFwdGVyOC53cml0ZVRvKHJlc3VsdCk7Cisg
ICAgICAgIHJlc3VsdCArPSBhZGFwdGVyOC5sZW5ndGgoKTsKKyAgICAgICAgYWRhcHRlcjkud3Jp
dGVUbyhyZXN1bHQpOworCisgICAgICAgIHJldHVybiByZXN1bHRJbXBsLnJlbGVhc2UoKTsKKyAg
ICB9CisKKyAgICBVQ2hhciogYnVmZmVyOwogICAgIFJlZlB0cjxTdHJpbmdJbXBsPiByZXN1bHRJ
bXBsID0gU3RyaW5nSW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGJ1ZmZlcik7
CiAgICAgaWYgKCFyZXN1bHRJbXBsKQogICAgICAgICByZXR1cm4gMDsKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdPcGVyYXRvcnMuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nT3BlcmF0b3JzLmgJKHJldmlzaW9u
IDEwMjI5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdPcGVyYXRv
cnMuaAkod29ya2luZyBjb3B5KQpAQCAtNDYsNiArNDYsMjIgQEAgcHVibGljOgogICAgICAgICBy
ZXR1cm4gb3BlcmF0b3IgU3RyaW5nKCk7CiAgICAgfQogCisgICAgYm9vbCBpczhCaXQoKQorICAg
IHsKKyAgICAgICAgU3RyaW5nVHlwZUFkYXB0ZXI8U3RyaW5nVHlwZTE+IGFkYXB0ZXIxKG1fc3Ry
aW5nMSk7CisgICAgICAgIFN0cmluZ1R5cGVBZGFwdGVyPFN0cmluZ1R5cGUyPiBhZGFwdGVyMiht
X3N0cmluZzIpOworICAgICAgICByZXR1cm4gYWRhcHRlcjEuaXM4Qml0KCkgJiYgYWRhcHRlcjIu
aXM4Qml0KCk7CisgICAgfQorCisgICAgdm9pZCB3cml0ZVRvKExDaGFyKiBkZXN0aW5hdGlvbikK
KyAgICB7CisgICAgICAgIEFTU0VSVChpczhCaXQoKSk7CisgICAgICAgIFN0cmluZ1R5cGVBZGFw
dGVyPFN0cmluZ1R5cGUxPiBhZGFwdGVyMShtX3N0cmluZzEpOworICAgICAgICBTdHJpbmdUeXBl
QWRhcHRlcjxTdHJpbmdUeXBlMj4gYWRhcHRlcjIobV9zdHJpbmcyKTsKKyAgICAgICAgYWRhcHRl
cjEud3JpdGVUbyhkZXN0aW5hdGlvbik7CisgICAgICAgIGFkYXB0ZXIyLndyaXRlVG8oZGVzdGlu
YXRpb24gKyBhZGFwdGVyMS5sZW5ndGgoKSk7CisgICAgfQorCiAgICAgdm9pZCB3cml0ZVRvKFVD
aGFyKiBkZXN0aW5hdGlvbikKICAgICB7CiAgICAgICAgIFN0cmluZ1R5cGVBZGFwdGVyPFN0cmlu
Z1R5cGUxPiBhZGFwdGVyMShtX3N0cmluZzEpOwpAQCAtNzUsNiArOTEsMTAgQEAgcHVibGljOgog
ICAgIH0KIAogICAgIHVuc2lnbmVkIGxlbmd0aCgpIHsgcmV0dXJuIG1fYnVmZmVyLmxlbmd0aCgp
OyB9CisKKyAgICBib29sIGlzOEJpdCgpIHsgcmV0dXJuIG1fYnVmZmVyLmlzOEJpdCgpOyB9CisK
KyAgICB2b2lkIHdyaXRlVG8oTENoYXIqIGRlc3RpbmF0aW9uKSB7IG1fYnVmZmVyLndyaXRlVG8o
ZGVzdGluYXRpb24pOyB9CiAgICAgdm9pZCB3cml0ZVRvKFVDaGFyKiBkZXN0aW5hdGlvbikgeyBt
X2J1ZmZlci53cml0ZVRvKGRlc3RpbmF0aW9uKTsgfQogCiBwcml2YXRlOgo=
</data>
<flag name="review"
          id="118207"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>