<?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>164146</bug_id>
          
          <creation_ts>2016-10-28 13:42:26 -0700</creation_ts>
          <short_desc>Parse color() function</short_desc>
          <delta_ts>2016-10-29 21:11:49 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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="Dean Jackson">dino</reporter>
          <assigned_to name="Dean Jackson">dino</assigned_to>
          <cc>darin</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1245742</commentid>
    <comment_count>0</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2016-10-28 13:42:26 -0700</bug_when>
    <thetext>Parse color() function</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245755</commentid>
    <comment_count>1</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2016-10-28 13:48:38 -0700</bug_when>
    <thetext>&lt;rdar://problem/29007218&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245757</commentid>
    <comment_count>2</comment_count>
      <attachid>293205</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2016-10-28 13:53:27 -0700</bug_when>
    <thetext>Created attachment 293205
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245933</commentid>
    <comment_count>3</comment_count>
      <attachid>293205</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-10-28 19:32:06 -0700</bug_when>
    <thetext>Comment on attachment 293205
Patch

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

&gt; Source/WebCore/css/parser/CSSParser.cpp:7637
&gt; +inline double CSSParser::colorDoubleFromValue(ValueWithCalculation&amp; valueWithCalculation)

This should have the name parse in it for consistency with the other function. Maybe parsedColorDouble. Or maybe parseColorDouble and we should rename the others to match.

&gt; Source/WebCore/css/parser/CSSParser.cpp:7651
&gt; +    bool isPercent;
&gt; +
&gt; +    if (valueWithCalculation.calculation())
&gt; +        isPercent = valueWithCalculation.calculation()-&gt;category() == CalcPercent;
&gt; +    else
&gt; +        isPercent = valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_PERCENTAGE;
&gt; +
&gt; +    const double doubleValue = parsedDouble(valueWithCalculation);
&gt; +
&gt; +    if (isPercent)
&gt; +        return doubleValue / 100.0;
&gt; +
&gt; +    return doubleValue;

I wouldn’t have left so many blank lines. No need to make doubleValue be const. Could make an isPercent helper function to make this easier to read.

&gt; Source/WebCore/css/parser/CSSParser.cpp:7692
&gt; +bool CSSParser::parseColorFunctionParameters(CSSParserValue&amp; value, ColorSpace&amp; colorSpace, double* colorValues)

Argument type should be more like:

    double colorValues[4]

Rather than double* colorValues.

Or even better could use a return value of type Optional&lt;std:array&lt;double, 4&gt;&gt;.

&gt; Source/WebCore/css/parser/CSSParser.cpp:7715
&gt; +            colorValues[i] = std::max&lt;double&gt;(0, std::min&lt;double&gt;(1, parsedDouble(argumentWithCalculation)));

Could write this using 0.0 and 1.0 and then would not need either of the &lt;double&gt;. Could do that many other places in this file and I think it’s nicer than what we have.

Why does this use parsedDouble instead of colorDoubleFromValue? Maybe colorDoubleFromValue has the wrong name if it’s only for the alpha channel.

&gt; Source/WebCore/css/parser/CSSParser.cpp:7721
&gt; +        return true;

We should set colorValues[3] to 1 here, instead of having the caller do it.

&gt; Source/WebCore/css/parser/CSSParser.cpp:7831
&gt; +        &amp;&amp; value.function-&gt;args-&gt;size()

Seems slightly peculiar to check this here rather than inside parseColorFunctionParameters. In the other cases above we are checking for an exact size, but here we are doing part of the size checking; better to do none.

&gt; Source/WebCore/css/parser/CSSParser.cpp:7835
&gt; +        ColorSpace colorSpace = ColorSpaceSRGB;

No need to use a local variable for this.

&gt; Source/WebCore/css/parser/CSSParser.cpp:7838
&gt; +        return Color(colorValues[0], colorValues[1], colorValues[2], colorValues[3], colorSpace);

I would prefer the Color { } syntax to the Color() syntax. Same arguments would work.

&gt; Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:469
&gt; +    ColorSpace colorSpace;

I suggest declaring this right before the switch instead of up here.

&gt; Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:470
&gt; +    Color result;

Unused.

&gt; Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:495
&gt; +        RefPtr&lt;CSSPrimitiveValue&gt; alphaParameter = consumePercent(args, ValueRangeAll);

Use auto here?

&gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:130
&gt; +        switch (extendedColor.colorSpace()) {
&gt; +        case ColorSpaceDisplayP3:
&gt; +            return CGColorCreate(displayP3ColorSpaceRef(), components);
&gt; +        default:
&gt; +            return CGColorCreate(sRGBColorSpaceRef(), components);
&gt; +        }

It would be better to cover all values for ColorSpace, and no default case, so this fails to compile if we add a new color space.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246097</commentid>
    <comment_count>4</comment_count>
      <attachid>293205</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2016-10-29 15:20:45 -0700</bug_when>
    <thetext>Comment on attachment 293205
Patch

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

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7637
&gt;&gt; +inline double CSSParser::colorDoubleFromValue(ValueWithCalculation&amp; valueWithCalculation)
&gt; 
&gt; This should have the name parse in it for consistency with the other function. Maybe parsedColorDouble. Or maybe parseColorDouble and we should rename the others to match.

Done. Now called parseColorDouble, and I renamed parseColorInt too. I couldn&apos;t rename parsedDouble, which was annoying, because it already exists.

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7651
&gt;&gt; +    return doubleValue;
&gt; 
&gt; I wouldn’t have left so many blank lines. No need to make doubleValue be const. Could make an isPercent helper function to make this easier to read.

Done

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7692
&gt;&gt; +bool CSSParser::parseColorFunctionParameters(CSSParserValue&amp; value, ColorSpace&amp; colorSpace, double* colorValues)
&gt; 
&gt; Argument type should be more like:
&gt; 
&gt;     double colorValues[4]
&gt; 
&gt; Rather than double* colorValues.
&gt; 
&gt; Or even better could use a return value of type Optional&lt;std:array&lt;double, 4&gt;&gt;.

I changed it to Optional&lt;std::pair&lt;std::array&lt;double, 4&gt;, ColorSpace&gt;&gt;
That way it&apos;s clear that all the return values hold the info.

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7715
&gt;&gt; +            colorValues[i] = std::max&lt;double&gt;(0, std::min&lt;double&gt;(1, parsedDouble(argumentWithCalculation)));
&gt; 
&gt; Could write this using 0.0 and 1.0 and then would not need either of the &lt;double&gt;. Could do that many other places in this file and I think it’s nicer than what we have.
&gt; 
&gt; Why does this use parsedDouble instead of colorDoubleFromValue? Maybe colorDoubleFromValue has the wrong name if it’s only for the alpha channel.

Done. And fixed the other places in the file.

colorDoubleFromValue accepts percentages, but they are not allowed in the color() function except for the alpha value. (I have no idea why - this is just the typical CSS WG approach of trying to accept as much as possible).

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7721
&gt;&gt; +        return true;
&gt; 
&gt; We should set colorValues[3] to 1 here, instead of having the caller do it.

I now do that by returning the colorValues. I initialize the alpha to 1.

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7831
&gt;&gt; +        &amp;&amp; value.function-&gt;args-&gt;size()
&gt; 
&gt; Seems slightly peculiar to check this here rather than inside parseColorFunctionParameters. In the other cases above we are checking for an exact size, but here we are doing part of the size checking; better to do none.

Fixed.

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7835
&gt;&gt; +        ColorSpace colorSpace = ColorSpaceSRGB;
&gt; 
&gt; No need to use a local variable for this.

This is gone now that we return an Optional std::pair.

&gt;&gt; Source/WebCore/css/parser/CSSParser.cpp:7838
&gt;&gt; +        return Color(colorValues[0], colorValues[1], colorValues[2], colorValues[3], colorSpace);
&gt; 
&gt; I would prefer the Color { } syntax to the Color() syntax. Same arguments would work.

It seems that { } is not willing to convert from double to float, where the () syntax is.

I wonder if ExtendedColor should use double anyway.

&gt;&gt; Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:469
&gt;&gt; +    ColorSpace colorSpace;
&gt; 
&gt; I suggest declaring this right before the switch instead of up here.

Done.

&gt;&gt; Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:470
&gt;&gt; +    Color result;
&gt; 
&gt; Unused.

Removed.

&gt; Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:491
&gt; +        else
&gt; +            colorChannels[i] = 0;

I also now initialize colorChannels so I don&apos;t need to do this. (I do break the loop though).

&gt;&gt; Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:495
&gt;&gt; +        RefPtr&lt;CSSPrimitiveValue&gt; alphaParameter = consumePercent(args, ValueRangeAll);
&gt; 
&gt; Use auto here?

Changed.

&gt;&gt; Source/WebCore/platform/graphics/cg/ColorCG.cpp:130
&gt;&gt; +        }
&gt; 
&gt; It would be better to cover all values for ColorSpace, and no default case, so this fails to compile if we add a new color space.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246099</commentid>
    <comment_count>5</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2016-10-29 15:38:35 -0700</bug_when>
    <thetext>Committed r208116: &lt;http://trac.webkit.org/changeset/208116&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246139</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-10-29 21:11:49 -0700</bug_when>
    <thetext>The API tests seem to be failing on the dashboard.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293205</attachid>
            <date>2016-10-28 13:53:27 -0700</date>
            <delta_ts>2016-10-28 19:32:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-164146-20161029074931.patch</filename>
            <type>text/plain</type>
            <size>42016</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjA4MDYwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYmMyMjQwOTRmMGU0NzYz
ZjRkN2I0OGM4MTNlNWE2ZDM0ODA5MzMzYi4uODFjNzRlOTBjMTRhOWYyOTRlZGQyOTI5NjMyMzc2
MjRlZmI4NjhkYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDUyIEBACiAyMDE2LTEwLTI4ICBEZWFu
IEphY2tzb24gIDxkaW5vQGFwcGxlLmNvbT4KIAorICAgICAgICBQYXJzZSBjb2xvcigpIGZ1bmN0
aW9uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjQx
NDYKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtcy8yOTAwNzIxOD4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTdXBwb3J0IHRoZSBuZXcgQ1NTIGNvbG9y
KCkgZnVuY3Rpb246CisgICAgICAgIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtY29sb3Iv
I2NvbG9yLWZ1bmN0aW9uCisKKyAgICAgICAgVGhlcmUgYXJlIHNlcGFyYXRlIGNvZGUgcGF0aHMg
Zm9yIHRoZSBvbGQgYW5kIG5ldyBDU1MgcGFyc2VyLgorCisgICAgICAgIFRlc3RzOiBjc3MzL2Nv
bG9yL2NvbG9yLWZ1bmN0aW9uLWNvbXB1dGVkLXN0eWxlLmh0bWwKKyAgICAgICAgICAgICAgIGNz
czMvY29sb3IvY29sb3ItZnVuY3Rpb24tcGFyc2luZy5odG1sCisKKyAgICAgICAgKiBjc3MvQ1NT
Q29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNwcDogVXNlIENvbG9yIGRpcmVjdGx5LCBub3Qgdmlh
IHJnYigpLgorICAgICAgICAoV2ViQ29yZTo6Q29tcHV0ZWRTdHlsZUV4dHJhY3Rvcjo6Y3VycmVu
dENvbG9yT3JWYWxpZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXB1dGVkU3R5bGVFeHRy
YWN0b3I6OnZhbHVlRm9yU2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXB1dGVkU3R5bGVF
eHRyYWN0b3I6OnByb3BlcnR5VmFsdWUpOgorCisgICAgICAgICogY3NzL0NTU1ZhbHVlS2V5d29y
ZHMuaW46IE5vdGUgdGhhdCB0aGVyZSBpcyBhIGNvbG9yIGZ1bmN0aW9uLCBidXQgdGhlCisgICAg
ICAgIGtleXdvcmQgaXMgYWxyZWFkeSBkZWZpbmVkLiBBbHNvIGFkZCBrZXl3b3JkcyBmb3IgdGhl
IGNvbG9yIHNwYWNlcy4KKyAgICAgICAgKiBjc3MvU1ZHQ1NTVmFsdWVLZXl3b3Jkcy5pbjogc1JH
QiBpcyB1c2VkIG91dHNpZGUgb2YgU1ZHIG5vdy4KKworICAgICAgICAqIGNzcy9wYXJzZXIvQ1NT
UGFyc2VyLmNwcDogT2xkIENTUyBwYXJzZXIgY29kZSB0byBoYW5kbGUgY29sb3IoKS4KKyAgICAg
ICAgKFdlYkNvcmU6OkNTU1BhcnNlcjo6Y29sb3JEb3VibGVGcm9tVmFsdWUpOiBIZWxwZXIgdG8g
aGFuZGxlIGZsb2F0cyBhbmQgcGVyY2VudGFnZXMuCisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJz
ZXI6OnBhcnNlQ29sb3JGdW5jdGlvblBhcmFtZXRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6Q1NT
UGFyc2VyOjpwYXJzZUNvbG9yRnJvbVZhbHVlKTogQWRkIHBhdGggZm9yIGNvbG9yKCkuCisgICAg
ICAgICogY3NzL3BhcnNlci9DU1NQYXJzZXIuaDoKKworICAgICAgICAqIGNzcy9wYXJzZXIvQ1NT
UHJvcGVydHlQYXJzZXJIZWxwZXJzLmNwcDogTmV3IENTUyBwYXJzZXIgY29kZSB0byBoYW5kbGUg
Y29sb3IoKS4KKyAgICAgICAgKFdlYkNvcmU6OkNTU1Byb3BlcnR5UGFyc2VySGVscGVyczo6cGFy
c2VDb2xvckZ1bmN0aW9uUGFyYW1ldGVycyk6CisgICAgICAgIChXZWJDb3JlOjpDU1NQcm9wZXJ0
eVBhcnNlckhlbHBlcnM6OnBhcnNlQ29sb3JGdW5jdGlvbik6CisKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9Db2xvci5oOgorICAgICAgICAoV2ViQ29yZTo6Q29sb3I6OmlzVmFsaWQpOiBB
biBleHRlbmRlZCBjb2xvciBpcyB2YWxpZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbG9yOjpyZ2Ip
OiBNb3ZlIHRoZSBjb2RlIHRvIGEgc3RhbmRhbG9uZSBpbmxpbmUKKyAgICAgICAgc28gdGhhdCBJ
IGNvdWxkIGFkZCBhIGxvbmdlciBjb21tZW50LgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvRXh0ZW5kZWRDb2xvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFeHRlbmRlZENvbG9yOjpj
c3NUZXh0KTogQWxwaGEgb3V0cHV0IGlzIG9ubHkgbmVlZGVkIGlmICE9IDEuCisKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9Db2xvckNHLmNwcDogSGFuZGxlIEV4dGVuZGVkQ29sb3Ig
LT4gQ0dDb2xvci4KKyAgICAgICAgKFdlYkNvcmU6OmxlYWtDR0NvbG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OmNhY2hlZENHQ29sb3IpOgorCisyMDE2LTEwLTI4ICBEZWFuIEphY2tzb24gIDxkaW5v
QGFwcGxlLmNvbT4KKwogICAgICAgICBOZXcgQ1NTIFBhcnNlciBzaG91bGQgdXNlIENvbG9ycyBu
b3QgUkdCQTMycwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTY0MTI0CiAgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8yOTAwMDM3Mz4KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uY3BwIGIvU291
cmNlL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAKaW5kZXggNmQ5
OWNlNmQ5Njc2NzM3ODBmZmVkMDk2YzNjOGEyYTIyOTZiNzkxZS4uN2JkYmQ5MWFmY2E0MjM2NTcz
Nzc4NjEyYjEwYWM2OTQzZjNjZjMzMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvY3NzL0NT
U0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL0NT
U0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAKQEAgLTczMiw4ICs3MzIsOCBAQCBSZWZQdHI8
Q1NTUHJpbWl0aXZlVmFsdWU+IENvbXB1dGVkU3R5bGVFeHRyYWN0b3I6OmN1cnJlbnRDb2xvck9y
VmFsaWRDb2xvcihjb25zdAogewogICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgbG9vayBh
dCB2aXNpdGVkIGluZm9ybWF0aW9uLCBzbyB0aGF0IGNvbXB1dGVkIHN0eWxlIGRvZXNuJ3QgZXhw
b3NlIHRoYXQuCiAgICAgaWYgKCFjb2xvci5pc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiBDU1NW
YWx1ZVBvb2w6OnNpbmdsZXRvbigpLmNyZWF0ZUNvbG9yVmFsdWUoc3R5bGUtPmNvbG9yKCkucmdi
KCkpOwotICAgIHJldHVybiBDU1NWYWx1ZVBvb2w6OnNpbmdsZXRvbigpLmNyZWF0ZUNvbG9yVmFs
dWUoY29sb3IucmdiKCkpOworICAgICAgICByZXR1cm4gQ1NTVmFsdWVQb29sOjpzaW5nbGV0b24o
KS5jcmVhdGVDb2xvclZhbHVlKHN0eWxlLT5jb2xvcigpKTsKKyAgICByZXR1cm4gQ1NTVmFsdWVQ
b29sOjpzaW5nbGV0b24oKS5jcmVhdGVDb2xvclZhbHVlKGNvbG9yKTsKIH0KIAogc3RhdGljIFJl
ZjxDU1NQcmltaXRpdmVWYWx1ZT4gcGVyY2VudGFnZU9yWm9vbUFkanVzdGVkVmFsdWUoTGVuZ3Ro
IGxlbmd0aCwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKQpAQCAtOTAxLDcgKzkwMSw3IEBAIFJl
ZjxDU1NWYWx1ZT4gQ29tcHV0ZWRTdHlsZUV4dHJhY3Rvcjo6dmFsdWVGb3JTaGFkb3coY29uc3Qg
U2hhZG93RGF0YSogc2hhZG93LCBDCiAgICAgICAgIGF1dG8gYmx1ciA9IGFkanVzdExlbmd0aEZv
clpvb20oY3VyclNoYWRvd0RhdGEtPnJhZGl1cygpLCBzdHlsZSwgYWRqdXN0KTsKICAgICAgICAg
YXV0byBzcHJlYWQgPSBwcm9wZXJ0eUlEID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdyA/IFJlZlB0
cjxDU1NQcmltaXRpdmVWYWx1ZT4oKSA6IGFkanVzdExlbmd0aEZvclpvb20oY3VyclNoYWRvd0Rh
dGEtPnNwcmVhZCgpLCBzdHlsZSwgYWRqdXN0KTsKICAgICAgICAgYXV0byBzdHlsZSA9IHByb3Bl
cnR5SUQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93IHx8IGN1cnJTaGFkb3dEYXRhLT5zdHlsZSgp
ID09IE5vcm1hbCA/IFJlZlB0cjxDU1NQcmltaXRpdmVWYWx1ZT4oKSA6IGNzc1ZhbHVlUG9vbC5j
cmVhdGVJZGVudGlmaWVyVmFsdWUoQ1NTVmFsdWVJbnNldCk7Ci0gICAgICAgIGF1dG8gY29sb3Ig
PSBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JWYWx1ZShjdXJyU2hhZG93RGF0YS0+Y29sb3IoKS5y
Z2IoKSk7CisgICAgICAgIGF1dG8gY29sb3IgPSBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JWYWx1
ZShjdXJyU2hhZG93RGF0YS0+Y29sb3IoKSk7CiAgICAgICAgIGxpc3QtPnByZXBlbmQoQ1NTU2hh
ZG93VmFsdWU6OmNyZWF0ZShXVEZNb3ZlKHgpLCBXVEZNb3ZlKHkpLCBXVEZNb3ZlKGJsdXIpLCBX
VEZNb3ZlKHNwcmVhZCksIFdURk1vdmUoc3R5bGUpLCBXVEZNb3ZlKGNvbG9yKSkpOwogICAgIH0K
ICAgICByZXR1cm4gV1RGTW92ZShsaXN0KTsKQEAgLTI1NjcsNyArMjU2Nyw3IEBAIFJlZlB0cjxD
U1NWYWx1ZT4gQ29tcHV0ZWRTdHlsZUV4dHJhY3Rvcjo6cHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0
eUlEIHByb3BlcnR5SUQsCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgICAgICAgICAgcmV0dXJuIGNzc1ZhbHVlUG9vbC5j
cmVhdGVDb2xvclZhbHVlKG1fYWxsb3dWaXNpdGVkU3R5bGU/IHN0eWxlLT52aXNpdGVkRGVwZW5k
ZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpLnJnYigpIDogc3R5bGUtPmJhY2tn
cm91bmRDb2xvcigpLnJnYigpKTsKKyAgICAgICAgICAgIHJldHVybiBjc3NWYWx1ZVBvb2wuY3Jl
YXRlQ29sb3JWYWx1ZShtX2FsbG93VmlzaXRlZFN0eWxlPyBzdHlsZS0+dmlzaXRlZERlcGVuZGVu
dENvbG9yKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKSA6IHN0eWxlLT5iYWNrZ3JvdW5kQ29s
b3IoKSk7CiAgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6CiAgICAgICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrSW1hZ2U6IHsKICAgICAgICAgICAgIGNvbnN0IEZp
bGxMYXllciogbGF5ZXJzID0gcHJvcGVydHlJRCA9PSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFn
ZSA/IHN0eWxlLT5tYXNrTGF5ZXJzKCkgOiBzdHlsZS0+YmFja2dyb3VuZExheWVycygpOwpAQCAt
MjcyOCwxMyArMjcyOCwxMyBAQCBSZWZQdHI8Q1NTVmFsdWU+IENvbXB1dGVkU3R5bGVFeHRyYWN0
b3I6OnByb3BlcnR5VmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eUlELAogICAgICAgICAgICAg
ICAgIHJldHVybiBzdHlsZS0+Ym9yZGVySW1hZ2VTb3VyY2UoKS0+Y3NzVmFsdWUoKTsKICAgICAg
ICAgICAgIHJldHVybiBjc3NWYWx1ZVBvb2wuY3JlYXRlSWRlbnRpZmllclZhbHVlKENTU1ZhbHVl
Tm9uZSk7CiAgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKLSAgICAgICAg
ICAgIHJldHVybiBtX2FsbG93VmlzaXRlZFN0eWxlID8gY3NzVmFsdWVQb29sLmNyZWF0ZUNvbG9y
VmFsdWUoc3R5bGUtPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJvcmRlclRvcENv
bG9yKS5yZ2IoKSkgOiBjdXJyZW50Q29sb3JPclZhbGlkQ29sb3Ioc3R5bGUsIHN0eWxlLT5ib3Jk
ZXJUb3BDb2xvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBtX2FsbG93VmlzaXRlZFN0eWxlID8g
Y3NzVmFsdWVQb29sLmNyZWF0ZUNvbG9yVmFsdWUoc3R5bGUtPnZpc2l0ZWREZXBlbmRlbnRDb2xv
cihDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yKSkgOiBjdXJyZW50Q29sb3JPclZhbGlkQ29sb3Io
c3R5bGUsIHN0eWxlLT5ib3JkZXJUb3BDb2xvcigpKTsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlclJpZ2h0Q29sb3I6Ci0gICAgICAgICAgICByZXR1cm4gbV9hbGxvd1Zpc2l0ZWRTdHls
ZSA/IGNzc1ZhbHVlUG9vbC5jcmVhdGVDb2xvclZhbHVlKHN0eWxlLT52aXNpdGVkRGVwZW5kZW50
Q29sb3IoQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yKS5yZ2IoKSkgOiBjdXJyZW50Q29sb3JP
clZhbGlkQ29sb3Ioc3R5bGUsIHN0eWxlLT5ib3JkZXJSaWdodENvbG9yKCkpOworICAgICAgICAg
ICAgcmV0dXJuIG1fYWxsb3dWaXNpdGVkU3R5bGUgPyBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JW
YWx1ZShzdHlsZS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRD
b2xvcikpIDogY3VycmVudENvbG9yT3JWYWxpZENvbG9yKHN0eWxlLCBzdHlsZS0+Ym9yZGVyUmln
aHRDb2xvcigpKTsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgot
ICAgICAgICAgICAgcmV0dXJuIG1fYWxsb3dWaXNpdGVkU3R5bGUgPyBjc3NWYWx1ZVBvb2wuY3Jl
YXRlQ29sb3JWYWx1ZShzdHlsZS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Qm9y
ZGVyQm90dG9tQ29sb3IpLnJnYigpKSA6IGN1cnJlbnRDb2xvck9yVmFsaWRDb2xvcihzdHlsZSwg
c3R5bGUtPmJvcmRlckJvdHRvbUNvbG9yKCkpOworICAgICAgICAgICAgcmV0dXJuIG1fYWxsb3dW
aXNpdGVkU3R5bGUgPyBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JWYWx1ZShzdHlsZS0+dmlzaXRl
ZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3IpKSA6IGN1cnJlbnRD
b2xvck9yVmFsaWRDb2xvcihzdHlsZSwgc3R5bGUtPmJvcmRlckJvdHRvbUNvbG9yKCkpOwogICAg
ICAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgotICAgICAgICAgICAgcmV0dXJu
IG1fYWxsb3dWaXNpdGVkU3R5bGUgPyBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JWYWx1ZShzdHls
ZS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yKS5yZ2Io
KSkgOiBjdXJyZW50Q29sb3JPclZhbGlkQ29sb3Ioc3R5bGUsIHN0eWxlLT5ib3JkZXJMZWZ0Q29s
b3IoKSk7CisgICAgICAgICAgICByZXR1cm4gbV9hbGxvd1Zpc2l0ZWRTdHlsZSA/IGNzc1ZhbHVl
UG9vbC5jcmVhdGVDb2xvclZhbHVlKHN0eWxlLT52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJv
cGVydHlCb3JkZXJMZWZ0Q29sb3IpKSA6IGN1cnJlbnRDb2xvck9yVmFsaWRDb2xvcihzdHlsZSwg
c3R5bGUtPmJvcmRlckxlZnRDb2xvcigpKTsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
clRvcFN0eWxlOgogICAgICAgICAgICAgcmV0dXJuIGNzc1ZhbHVlUG9vbC5jcmVhdGVWYWx1ZShz
dHlsZS0+Ym9yZGVyVG9wU3R5bGUoKSk7CiAgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJS
aWdodFN0eWxlOgpAQCAtMjc4NSw3ICsyNzg1LDcgQEAgUmVmUHRyPENTU1ZhbHVlPiBDb21wdXRl
ZFN0eWxlRXh0cmFjdG9yOjpwcm9wZXJ0eVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHlJRCwK
ICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUNsZWFyOgogICAgICAgICAgICAgcmV0dXJuIGNzc1Zh
bHVlUG9vbC5jcmVhdGVWYWx1ZShzdHlsZS0+Y2xlYXIoKSk7CiAgICAgICAgIGNhc2UgQ1NTUHJv
cGVydHlDb2xvcjoKLSAgICAgICAgICAgIHJldHVybiBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JW
YWx1ZShtX2FsbG93VmlzaXRlZFN0eWxlID8gc3R5bGUtPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihD
U1NQcm9wZXJ0eUNvbG9yKS5yZ2IoKSA6IHN0eWxlLT5jb2xvcigpLnJnYigpKTsKKyAgICAgICAg
ICAgIHJldHVybiBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JWYWx1ZShtX2FsbG93VmlzaXRlZFN0
eWxlID8gc3R5bGUtPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUNvbG9yKSA6IHN0
eWxlLT5jb2xvcigpKTsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFByaW50Q29sb3JB
ZGp1c3Q6CiAgICAgICAgICAgICByZXR1cm4gY3NzVmFsdWVQb29sLmNyZWF0ZVZhbHVlKHN0eWxl
LT5wcmludENvbG9yQWRqdXN0KCkpOwogICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uQXhpczoKQEAgLTI4MDMsNyArMjgwMyw3IEBAIFJlZlB0cjxDU1NWYWx1ZT4gQ29tcHV0ZWRT
dHlsZUV4dHJhY3Rvcjo6cHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5SUQsCiAg
ICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Qcm9ncmVzc2lvbjoKICAgICAgICAg
ICAgIHJldHVybiBjc3NWYWx1ZVBvb2wuY3JlYXRlVmFsdWUoc3R5bGUtPmNvbHVtblByb2dyZXNz
aW9uKCkpOwogICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29sdW1uUnVsZUNvbG9yOgotICAgICAg
ICAgICAgcmV0dXJuIG1fYWxsb3dWaXNpdGVkU3R5bGUgPyBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29s
b3JWYWx1ZShzdHlsZS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5T3V0bGluZUNv
bG9yKS5yZ2IoKSkgOiBjdXJyZW50Q29sb3JPclZhbGlkQ29sb3Ioc3R5bGUsIHN0eWxlLT5jb2x1
bW5SdWxlQ29sb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gbV9hbGxvd1Zpc2l0ZWRTdHlsZSA/
IGNzc1ZhbHVlUG9vbC5jcmVhdGVDb2xvclZhbHVlKHN0eWxlLT52aXNpdGVkRGVwZW5kZW50Q29s
b3IoQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3IpKSA6IGN1cnJlbnRDb2xvck9yVmFsaWRDb2xvcihz
dHlsZSwgc3R5bGUtPmNvbHVtblJ1bGVDb2xvcigpKTsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0
eUNvbHVtblJ1bGVTdHlsZToKICAgICAgICAgICAgIHJldHVybiBjc3NWYWx1ZVBvb2wuY3JlYXRl
VmFsdWUoc3R5bGUtPmNvbHVtblJ1bGVTdHlsZSgpKTsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0
eUNvbHVtblJ1bGVXaWR0aDoKQEAgLTMxNDUsNyArMzE0NSw3IEBAIFJlZlB0cjxDU1NWYWx1ZT4g
Q29tcHV0ZWRTdHlsZUV4dHJhY3Rvcjo6cHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3Bl
cnR5SUQsCiAgICAgICAgICAgICAgICAgcmV0dXJuIGNzc1ZhbHVlUG9vbC5jcmVhdGVJZGVudGlm
aWVyVmFsdWUoQ1NTVmFsdWVBdXRvKTsKICAgICAgICAgICAgIHJldHVybiBjc3NWYWx1ZVBvb2wu
Y3JlYXRlVmFsdWUoc3R5bGUtPm9ycGhhbnMoKSwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1C
RVIpOwogICAgICAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAgICAgICAgICAg
cmV0dXJuIG1fYWxsb3dWaXNpdGVkU3R5bGUgPyBjc3NWYWx1ZVBvb2wuY3JlYXRlQ29sb3JWYWx1
ZShzdHlsZS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5T3V0bGluZUNvbG9yKS5y
Z2IoKSkgOiBjdXJyZW50Q29sb3JPclZhbGlkQ29sb3Ioc3R5bGUsIHN0eWxlLT5vdXRsaW5lQ29s
b3IoKSk7CisgICAgICAgICAgICByZXR1cm4gbV9hbGxvd1Zpc2l0ZWRTdHlsZSA/IGNzc1ZhbHVl
UG9vbC5jcmVhdGVDb2xvclZhbHVlKHN0eWxlLT52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJv
cGVydHlPdXRsaW5lQ29sb3IpKSA6IGN1cnJlbnRDb2xvck9yVmFsaWRDb2xvcihzdHlsZSwgc3R5
bGUtPm91dGxpbmVDb2xvcigpKTsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZz
ZXQ6CiAgICAgICAgICAgICByZXR1cm4gem9vbUFkanVzdGVkUGl4ZWxWYWx1ZShzdHlsZS0+b3V0
bGluZU9mZnNldCgpLCAqc3R5bGUpOwogICAgICAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0
eWxlOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL0NTU1ZhbHVlS2V5d29yZHMuaW4g
Yi9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTVmFsdWVLZXl3b3Jkcy5pbgppbmRleCA1YjNkYTFhYTE1
YzA1ZDMxY2Y0YjUxN2RmMTJjNjg0YjZkYmEzZmZiLi5mNzc5OTA0MjY1MzUwOWY3MWNkMzQ1ZjA3
NTc2OGFmYzQ0M2RiNGEwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTVmFsdWVL
ZXl3b3Jkcy5pbgorKysgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTVmFsdWVLZXl3b3Jkcy5pbgpA
QCAtMTIwMyw2ICsxMjAzLDcgQEAgcmdiCiByZ2JhCiBoc2wKIGhzbGEKKy8vY29sb3IKIAogLy8g
dHJhbnNmb3JtCiBtYXRyaXgKQEAgLTEzMDksNiArMTMxMCwxMCBAQCBsYXN0CiBwMwogcmVjMjAy
MAogCisvLyBjb2xvcigpIGZ1bmN0aW9uCitzUkdCCitkaXNwbGF5LXAzCisKIC8vIHByZWZlcnMt
cmVkdWNlZC1tb3Rpb24KIHJlZHVjZQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3Mv
U1ZHQ1NTVmFsdWVLZXl3b3Jkcy5pbiBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9TVkdDU1NWYWx1ZUtl
eXdvcmRzLmluCmluZGV4IDU2NGFlNmRjM2UzNjU0YmNmNTlkMjUzNzYzMjM2NDExYzBmMjQ3ZGMu
LmUxYjAzZDA2NDUxNTk5YTJhZWU5YTUyMGMwODNkZGE3YTE0NDVmZjEgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2Nzcy9TVkdDU1NWYWx1ZUtleXdvcmRzLmluCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2Nzcy9TVkdDU1NWYWx1ZUtleXdvcmRzLmluCkBAIC0xNzYsNyArMTc2LDcgQEAgbmV3CiAv
LyBDU1NfUFJPUF9TVE9QX09QQUNJVFkKIC8vIENTU19QUk9QX0NPTE9SX0lOVEVSUE9MQVRJT04K
IC8vYXV0bwotc1JHQgorLy9zUkdCCiBsaW5lYXJSR0IKIAogLy8gQ1NTX1BST1BfQ09MT1JfSU5U
RVJQT0xBVElPTl9GSUxURVJTCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3MvcGFyc2Vy
L0NTU1BhcnNlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvcGFyc2VyL0NTU1BhcnNlci5jcHAK
aW5kZXggYTk1MzIyNGE2OTJlMWJiODU3NmE2NjA3Y2U2MWM3YTE5N2I1MjJkMi4uOTg0YmJlMWUy
ZTkwN2U4NmRiYjExNzZmOTExNTJlYjU4M2YzNDAwNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvY3NzL3BhcnNlci9DU1NQYXJzZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9wYXJz
ZXIvQ1NTUGFyc2VyLmNwcApAQCAtNzYzNCw2ICs3NjM0LDIzIEBAIGlubGluZSBpbnQgQ1NTUGFy
c2VyOjpjb2xvckludEZyb21WYWx1ZShWYWx1ZVdpdGhDYWxjdWxhdGlvbiYgdmFsdWVXaXRoQ2Fs
Y3VsYXRpCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZG91YmxlVmFsdWUpOwogfQogCitp
bmxpbmUgZG91YmxlIENTU1BhcnNlcjo6Y29sb3JEb3VibGVGcm9tVmFsdWUoVmFsdWVXaXRoQ2Fs
Y3VsYXRpb24mIHZhbHVlV2l0aENhbGN1bGF0aW9uKQoreworICAgIGJvb2wgaXNQZXJjZW50Owor
CisgICAgaWYgKHZhbHVlV2l0aENhbGN1bGF0aW9uLmNhbGN1bGF0aW9uKCkpCisgICAgICAgIGlz
UGVyY2VudCA9IHZhbHVlV2l0aENhbGN1bGF0aW9uLmNhbGN1bGF0aW9uKCktPmNhdGVnb3J5KCkg
PT0gQ2FsY1BlcmNlbnQ7CisgICAgZWxzZQorICAgICAgICBpc1BlcmNlbnQgPSB2YWx1ZVdpdGhD
YWxjdWxhdGlvbi52YWx1ZSgpLnVuaXQgPT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19QRVJDRU5U
QUdFOworCisgICAgY29uc3QgZG91YmxlIGRvdWJsZVZhbHVlID0gcGFyc2VkRG91YmxlKHZhbHVl
V2l0aENhbGN1bGF0aW9uKTsKKworICAgIGlmIChpc1BlcmNlbnQpCisgICAgICAgIHJldHVybiBk
b3VibGVWYWx1ZSAvIDEwMC4wOworCisgICAgcmV0dXJuIGRvdWJsZVZhbHVlOworfQorCiBib29s
IENTU1BhcnNlcjo6cGFyc2VSR0JQYXJhbWV0ZXJzKENTU1BhcnNlclZhbHVlJiB2YWx1ZSwgaW50
KiBjb2xvckFycmF5LCBib29sIHBhcnNlQWxwaGEpCiB7CiAgICAgQ1NTUGFyc2VyVmFsdWVMaXN0
KiBhcmdzID0gdmFsdWUuZnVuY3Rpb24tPmFyZ3MuZ2V0KCk7CkBAIC03NjcyLDYgKzc2ODksNTcg
QEAgYm9vbCBDU1NQYXJzZXI6OnBhcnNlUkdCUGFyYW1ldGVycyhDU1NQYXJzZXJWYWx1ZSYgdmFs
dWUsIGludCogY29sb3JBcnJheSwgYm9vbAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIENT
U1BhcnNlcjo6cGFyc2VDb2xvckZ1bmN0aW9uUGFyYW1ldGVycyhDU1NQYXJzZXJWYWx1ZSYgdmFs
dWUsIENvbG9yU3BhY2UmIGNvbG9yU3BhY2UsIGRvdWJsZSogY29sb3JWYWx1ZXMpCit7CisgICAg
Q1NTUGFyc2VyVmFsdWVMaXN0KiBhcmdzID0gdmFsdWUuZnVuY3Rpb24tPmFyZ3MuZ2V0KCk7CisK
KyAgICBzd2l0Y2ggKGFyZ3MtPmN1cnJlbnQoKS0+aWQpIHsKKyAgICBjYXNlIENTU1ZhbHVlU3Jn
YjoKKyAgICAgICAgY29sb3JTcGFjZSA9IENvbG9yU3BhY2VTUkdCOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIENTU1ZhbHVlRGlzcGxheVAzOgorICAgICAgICBjb2xvclNwYWNlID0gQ29sb3JT
cGFjZURpc3BsYXlQMzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Cisg
ICAgICAgIGF1dG8gdmFsdWVPck51bGwgPSBhcmdzLT5uZXh0KCk7CisgICAgICAgIGlmICghdmFs
dWVPck51bGwpCisgICAgICAgICAgICBjb2xvclZhbHVlc1tpXSA9IDA7CisgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgVmFsdWVXaXRoQ2FsY3VsYXRpb24gYXJndW1lbnRXaXRoQ2FsY3VsYXRp
b24oKnZhbHVlT3JOdWxsKTsKKyAgICAgICAgICAgIGlmICghdmFsaWRhdGVVbml0KGFyZ3VtZW50
V2l0aENhbGN1bGF0aW9uLCBGTnVtYmVyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICBjb2xvclZhbHVlc1tpXSA9IHN0ZDo6bWF4PGRvdWJsZT4oMCwgc3RkOjpt
aW48ZG91YmxlPigxLCBwYXJzZWREb3VibGUoYXJndW1lbnRXaXRoQ2FsY3VsYXRpb24pKSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHNsYXNoT3JOdWxsID0gYXJncy0+bmV4dCgpOwor
ICAgIGlmICghc2xhc2hPck51bGwpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFp
c0ZvcndhcmRTbGFzaE9wZXJhdG9yKCpzbGFzaE9yTnVsbCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIC8vIEhhbmRsZSBhbHBoYS4KKworICAgIFZhbHVlV2l0aENhbGN1bGF0aW9uIGFy
Z3VtZW50V2l0aENhbGN1bGF0aW9uKCphcmdzLT5uZXh0KCkpOworICAgIGlmICghdmFsaWRhdGVV
bml0KGFyZ3VtZW50V2l0aENhbGN1bGF0aW9uLCBGTnVtYmVyIHwgRlBlcmNlbnQpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgY29sb3JWYWx1ZXNbM10gPSBzdGQ6Om1heDxkb3VibGU+KDAs
IHN0ZDo6bWluPGRvdWJsZT4oMSwgY29sb3JEb3VibGVGcm9tVmFsdWUoYXJndW1lbnRXaXRoQ2Fs
Y3VsYXRpb24pKSk7CisKKyAgICAvLyBGSVhNRTogU3VwcG9ydCB0aGUgY29tbWEtc2VwYXJhdGVk
IGxpc3Qgb2YgZmFsbGJhY2sgY29sb3IgdmFsdWVzLgorICAgIC8vIElmIHRoZXJlIGlzIGFub3Ro
ZXIgYXJndW1lbnQsIGl0IHNob3VsZCBiZSBhIGNvbW1hLgorCisgICAgYXV0byBjb21tYU9yTnVs
bCA9IGFyZ3MtPm5leHQoKTsKKyAgICBpZiAoY29tbWFPck51bGwgJiYgIWlzQ29tbWEoY29tbWFP
ck51bGwpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwog
Ly8gVGhlIENTUzMgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgYSBIU0wgY29s
b3IgYXMKIC8vIGhzbCg8bnVtYmVyPiwgPHBlcmNlbnQ+LCA8cGVyY2VudD4pCiAvLyBhbmQgd2l0
aCBhbHBoYSwgdGhlIGZvcm1hdCBpcwpAQCAtNzc1OCw2ICs3ODI2LDE2IEBAIENvbG9yIENTU1Bh
cnNlcjo6cGFyc2VDb2xvckZyb21WYWx1ZShDU1NQYXJzZXJWYWx1ZSYgdmFsdWUpCiAgICAgICAg
IGlmICghcGFyc2VIU0xQYXJhbWV0ZXJzKHZhbHVlLCBjb2xvclZhbHVlcywgdHJ1ZSkpCiAgICAg
ICAgICAgICByZXR1cm4gQ29sb3IoKTsKICAgICAgICAgcmV0dXJuIENvbG9yKG1ha2VSR0JBRnJv
bUhTTEEoY29sb3JWYWx1ZXNbMF0sIGNvbG9yVmFsdWVzWzFdLCBjb2xvclZhbHVlc1syXSwgY29s
b3JWYWx1ZXNbM10pKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlLnVuaXQgPT0gQ1NTUGFyc2VyVmFs
dWU6OkZ1bmN0aW9uCisgICAgICAgICYmIHZhbHVlLmZ1bmN0aW9uLT5hcmdzCisgICAgICAgICYm
IHZhbHVlLmZ1bmN0aW9uLT5hcmdzLT5zaXplKCkKKyAgICAgICAgJiYgZXF1YWxMZXR0ZXJzSWdu
b3JpbmdBU0NJSUNhc2UodmFsdWUuZnVuY3Rpb24tPm5hbWUsICJjb2xvcigiKSkgeworICAgICAg
ICBkb3VibGUgY29sb3JWYWx1ZXNbNF07CisgICAgICAgIGNvbG9yVmFsdWVzWzNdID0gMS4wOwor
ICAgICAgICBDb2xvclNwYWNlIGNvbG9yU3BhY2UgPSBDb2xvclNwYWNlU1JHQjsKKyAgICAgICAg
aWYgKCFwYXJzZUNvbG9yRnVuY3Rpb25QYXJhbWV0ZXJzKHZhbHVlLCBjb2xvclNwYWNlLCBjb2xv
clZhbHVlcykpCisgICAgICAgICAgICByZXR1cm4gQ29sb3IoKTsKKyAgICAgICAgcmV0dXJuIENv
bG9yKGNvbG9yVmFsdWVzWzBdLCBjb2xvclZhbHVlc1sxXSwgY29sb3JWYWx1ZXNbMl0sIGNvbG9y
VmFsdWVzWzNdLCBjb2xvclNwYWNlKTsKICAgICB9CiAKICAgICByZXR1cm4gQ29sb3IoKTsKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTUGFyc2VyLmggYi9Tb3VyY2Uv
V2ViQ29yZS9jc3MvcGFyc2VyL0NTU1BhcnNlci5oCmluZGV4IGVlNjYyMTM1Y2I4MWQ1MzJiNDRk
MzQ5YTYyZTVlMTMxNTAwMWJmZGUuLjZjNmI4NmNkZmRkYTY0N2U5YjVlNWJmNDZhYTAzMTE2ZWMx
ZTk5NTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTUGFyc2VyLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvY3NzL3BhcnNlci9DU1NQYXJzZXIuaApAQCAtMzEsNiArMzEs
NyBAQAogI2luY2x1ZGUgIkNTU1Byb3BlcnR5U291cmNlRGF0YS5oIgogI2luY2x1ZGUgIkNTU1Zh
bHVlS2V5d29yZHMuaCIKICNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkNvbG9yU3BhY2Uu
aCIKICNpbmNsdWRlICJNZWRpYVF1ZXJ5LmgiCiAjaW5jbHVkZSAiU3R5bGVSdWxlSW1wb3J0Lmgi
CiAjaW5jbHVkZSAiV2ViS2l0Q1NTRmlsdGVyVmFsdWUuaCIKQEAgLTI3NSw2ICsyNzYsNyBAQCBw
dWJsaWM6CiAKICAgICBib29sIHBhcnNlUkdCUGFyYW1ldGVycyhDU1NQYXJzZXJWYWx1ZSYsIGlu
dCogY29sb3JWYWx1ZXMsIGJvb2wgcGFyc2VBbHBoYSk7CiAgICAgYm9vbCBwYXJzZUhTTFBhcmFt
ZXRlcnMoQ1NTUGFyc2VyVmFsdWUmLCBkb3VibGUqIGNvbG9yVmFsdWVzLCBib29sIHBhcnNlQWxw
aGEpOworICAgIGJvb2wgcGFyc2VDb2xvckZ1bmN0aW9uUGFyYW1ldGVycyhDU1NQYXJzZXJWYWx1
ZSYsIENvbG9yU3BhY2UmLCBkb3VibGUqIGNvbG9yVmFsdWVzKTsKICAgICBSZWZQdHI8Q1NTUHJp
bWl0aXZlVmFsdWU+IHBhcnNlQ29sb3IoQ1NTUGFyc2VyVmFsdWUqID0gbnVsbHB0cik7CiAgICAg
Q29sb3IgcGFyc2VDb2xvckZyb21WYWx1ZShDU1NQYXJzZXJWYWx1ZSYpOwogICAgIHZvaWQgcGFy
c2VTZWxlY3Rvcihjb25zdCBTdHJpbmcmLCBDU1NTZWxlY3Rvckxpc3QmKTsKQEAgLTcwOSw2ICs3
MTEsNyBAQCBwcml2YXRlOgogCiAgICAgYm9vbCBwYXJzZUJvcmRlckltYWdlUXVhZChVbml0cywg
UmVmUHRyPENTU1ByaW1pdGl2ZVZhbHVlPiYpOwogICAgIGludCBjb2xvckludEZyb21WYWx1ZShW
YWx1ZVdpdGhDYWxjdWxhdGlvbiYpOworICAgIGRvdWJsZSBjb2xvckRvdWJsZUZyb21WYWx1ZShW
YWx1ZVdpdGhDYWxjdWxhdGlvbiYpOwogICAgIGRvdWJsZSBwYXJzZWREb3VibGUoVmFsdWVXaXRo
Q2FsY3VsYXRpb24mKTsKICAgICAKICAgICBmcmllbmQgY2xhc3MgVHJhbnNmb3JtT3BlcmF0aW9u
SW5mbzsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTUHJvcGVydHlQ
YXJzZXJIZWxwZXJzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTUHJvcGVydHlQ
YXJzZXJIZWxwZXJzLmNwcAppbmRleCAwNTNkNGE0ODEzZjk2YjBkNGQwMTRjMzQ5NjU3MzU3ODhh
OTFmN2E1Li5mYjQyODUxNTRkZGIwMWUzOGMzNDRkYjVjZmZkMzIxOTU2ZWZkMjU5IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9jc3MvcGFyc2VyL0NTU1Byb3BlcnR5UGFyc2VySGVscGVycy5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL3BhcnNlci9DU1NQcm9wZXJ0eVBhcnNlckhlbHBl
cnMuY3BwCkBAIC00NjMsNiArNDYzLDUzIEBAIHN0YXRpYyBDb2xvciBwYXJzZUhTTFBhcmFtZXRl
cnMoQ1NTUGFyc2VyVG9rZW5SYW5nZSYgcmFuZ2UsIGJvb2wgcGFyc2VBbHBoYSkKICAgICByZXR1
cm4gQ29sb3IobWFrZVJHQkFGcm9tSFNMQShjb2xvckFycmF5WzBdLCBjb2xvckFycmF5WzFdLCBj
b2xvckFycmF5WzJdLCBhbHBoYSkpOwogfQogCitzdGF0aWMgQ29sb3IgcGFyc2VDb2xvckZ1bmN0
aW9uUGFyYW1ldGVycyhDU1NQYXJzZXJUb2tlblJhbmdlJiByYW5nZSkKK3sKKyAgICBBU1NFUlQo
cmFuZ2UucGVlaygpLmZ1bmN0aW9uSWQoKSA9PSBDU1NWYWx1ZUNvbG9yKTsKKyAgICBDb2xvclNw
YWNlIGNvbG9yU3BhY2U7CisgICAgQ29sb3IgcmVzdWx0OworICAgIENTU1BhcnNlclRva2VuUmFu
Z2UgYXJncyA9IGNvbnN1bWVGdW5jdGlvbihyYW5nZSk7CisKKyAgICBzd2l0Y2ggKGFyZ3MucGVl
aygpLmlkKCkpIHsKKyAgICBjYXNlIENTU1ZhbHVlU3JnYjoKKyAgICAgICAgY29sb3JTcGFjZSA9
IENvbG9yU3BhY2VTUkdCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1ZhbHVlRGlzcGxh
eVAzOgorICAgICAgICBjb2xvclNwYWNlID0gQ29sb3JTcGFjZURpc3BsYXlQMzsKKyAgICAgICAg
YnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIENvbG9yKCk7CisgICAgfQorICAg
IGNvbnN1bWVJZGVudChhcmdzKTsKKworICAgIGRvdWJsZSBjb2xvckNoYW5uZWxzWzRdOworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAg
ICAgICAgaWYgKGNvbnN1bWVOdW1iZXJSYXcoYXJncywgdmFsdWUpKQorICAgICAgICAgICAgY29s
b3JDaGFubmVsc1tpXSA9IHN0ZDo6bWF4PGRvdWJsZT4oMCwgc3RkOjptaW48ZG91YmxlPigxLCB2
YWx1ZSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2xvckNoYW5uZWxzW2ldID0gMDsK
KyAgICB9CisKKyAgICBpZiAoY29uc3VtZVNsYXNoSW5jbHVkaW5nV2hpdGVzcGFjZShhcmdzKSkg
eworICAgICAgICBSZWZQdHI8Q1NTUHJpbWl0aXZlVmFsdWU+IGFscGhhUGFyYW1ldGVyID0gY29u
c3VtZVBlcmNlbnQoYXJncywgVmFsdWVSYW5nZUFsbCk7CisgICAgICAgIGlmICghYWxwaGFQYXJh
bWV0ZXIpCisgICAgICAgICAgICBhbHBoYVBhcmFtZXRlciA9IGNvbnN1bWVOdW1iZXIoYXJncywg
VmFsdWVSYW5nZUFsbCk7CisgICAgICAgIGlmICghYWxwaGFQYXJhbWV0ZXIpCisgICAgICAgICAg
ICByZXR1cm4gQ29sb3IoKTsKKworICAgICAgICBjb2xvckNoYW5uZWxzWzNdID0gc3RkOjptYXg8
ZG91YmxlPigwLCBzdGQ6Om1pbjxkb3VibGU+KDEsIGFscGhhUGFyYW1ldGVyLT5pc1BlcmNlbnRh
Z2UoKSA/IChhbHBoYVBhcmFtZXRlci0+ZG91YmxlVmFsdWUoKSAvIDEwMCkgOiBhbHBoYVBhcmFt
ZXRlci0+ZG91YmxlVmFsdWUoKSkpOworICAgIH0gZWxzZQorICAgICAgICBjb2xvckNoYW5uZWxz
WzNdID0gMS4wOworCisgICAgLy8gRklYTUU6IFN1cHBvcnQgdGhlIGNvbW1hLXNlcGFyYXRlZCBs
aXN0IG9mIGZhbGxiYWNrIGNvbG9yIHZhbHVlcy4KKworICAgIGlmICghYXJncy5hdEVuZCgpKQor
ICAgICAgICByZXR1cm4gQ29sb3IoKTsKKyAgICAKKyAgICByZXR1cm4gQ29sb3IoY29sb3JDaGFu
bmVsc1swXSwgY29sb3JDaGFubmVsc1sxXSwgY29sb3JDaGFubmVsc1syXSwgY29sb3JDaGFubmVs
c1szXSwgY29sb3JTcGFjZSk7Cit9CisKIHN0YXRpYyBDb2xvciBwYXJzZUhleENvbG9yKENTU1Bh
cnNlclRva2VuUmFuZ2UmIHJhbmdlLCBib29sIGFjY2VwdFF1aXJreUNvbG9ycykKIHsKICAgICBS
R0JBMzIgcmVzdWx0OwpAQCAtNTEyLDggKzU1OSw4IEBAIHN0YXRpYyBDb2xvciBwYXJzZUNvbG9y
RnVuY3Rpb24oQ1NTUGFyc2VyVG9rZW5SYW5nZSYgcmFuZ2UpCiAgICAgICAgIGNvbG9yID0gcGFy
c2VIU0xQYXJhbWV0ZXJzKGNvbG9yUmFuZ2UsIGZ1bmN0aW9uSWQgPT0gQ1NTVmFsdWVIc2xhKTsK
ICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBDU1NWYWx1ZUNvbG9yOgotICAgICAgICAvLyBGSVhN
RS1ORVdQQVJTRVI6IEFkZCBzdXBwb3J0IGZvciBjb2xvcigpLgotICAgICAgICByZXR1cm4gQ29s
b3IoKTsKKyAgICAgICAgY29sb3IgPSBwYXJzZUNvbG9yRnVuY3Rpb25QYXJhbWV0ZXJzKGNvbG9y
UmFuZ2UpOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gQ29s
b3IoKTsKICAgICB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9Db2xvci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaAppbmRl
eCA3OTNjOGQ1ZTFkMThhNzE0NDM1ZjUzZmQxYjliOWQ2NzAzYTc0ZGQ1Li42MzczOTVjNjYzYjMx
MTY0YTNkNGZjYTNlYjA1ZGYwZGMxZDNjODJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Db2xvci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0NvbG9yLmgKQEAgLTE5Niw3ICsxOTYsNyBAQCBwdWJsaWM6CiAgICAgLy8gVGhlIGxh
dHRlciBmb3JtYXQgaXMgbm90IGEgdmFsaWQgQ1NTIGNvbG9yLCBhbmQgc2hvdWxkIG9ubHkgYmUg
c2VlbiBpbiBEUlQgZHVtcHMuCiAgICAgU3RyaW5nIG5hbWVGb3JSZW5kZXJUcmVlQXNUZXh0KCkg
Y29uc3Q7CiAKLSAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2NvbG9yRGF0YS5y
Z2JhQW5kRmxhZ3MgJiB2YWxpZFJHQkFDb2xvckJpdDsgfQorICAgIGJvb2wgaXNWYWxpZCgpIGNv
bnN0IHsgcmV0dXJuIGlzRXh0ZW5kZWQoKSB8fCAobV9jb2xvckRhdGEucmdiYUFuZEZsYWdzICYg
dmFsaWRSR0JBQ29sb3JCaXQpOyB9CiAKICAgICBib29sIGhhc0FscGhhKCkgY29uc3QgeyByZXR1
cm4gYWxwaGEoKSA8IDI1NTsgfQogCkBAIC0yMDUsNyArMjA1LDcgQEAgcHVibGljOgogICAgIGlu
dCBibHVlKCkgY29uc3QgeyByZXR1cm4gYmx1ZUNoYW5uZWwocmdiKCkpOyB9CiAgICAgaW50IGFs
cGhhKCkgY29uc3QgeyByZXR1cm4gYWxwaGFDaGFubmVsKHJnYigpKTsgfQogICAgIAotICAgIFJH
QkEzMiByZ2IoKSBjb25zdCB7IEFTU0VSVCghaXNFeHRlbmRlZCgpKTsgcmV0dXJuIHN0YXRpY19j
YXN0PFJHQkEzMj4obV9jb2xvckRhdGEucmdiYUFuZEZsYWdzID4+IDMyKTsgfQorICAgIFJHQkEz
MiByZ2IoKSBjb25zdDsKIAogICAgIC8vIEZJWE1FOiBMaWtlIG9wZXJhdG9yPT0sIHRoaXMgd2ls
bCBnaXZlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIEV4dGVuZGVkQ29sb3JzIHRoYXQKICAgICAvLyBz
aG91bGQgYmUgaWRlbnRpY2FsLCBzaW5jZSB0aGUgcmVzcGVjdGl2ZSBwb2ludGVyIHdpbGwgYmUg
ZGlmZmVyZW50LgpAQCAtMzk3LDYgKzM5NywxNCBAQCBpbmxpbmUgUkdCQTMyIGNvbG9yV2l0aE92
ZXJyaWRlQWxwaGEoUkdCQTMyIGNvbG9yLCBPcHRpb25hbDxmbG9hdD4gb3ZlcnJpZGVBbHBoYQog
ICAgIHJldHVybiBvdmVycmlkZUFscGhhID8gY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShjb2xvciwg
b3ZlcnJpZGVBbHBoYS52YWx1ZSgpKSA6IGNvbG9yOwogfQogCitpbmxpbmUgUkdCQTMyIENvbG9y
OjpyZ2IoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgQVNTRVJUKCFpc0V4dGVu
ZGVkKCkpIGhlcmUsIG9yIHByb2R1Y2UKKyAgICAvLyBhbiBSR0JBMzIgZXF1aXZhbGVudCBmb3Ig
YW4gRXh0ZW5kZWRDb2xvci4gSWRlYWxseSB0aGUgZm9ybWVyLAorICAgIC8vIHNvIHdlIGNhbiBh
dWRpdCBhbGwgdGhlIHJnYigpIGNhbGwgc2l0ZXMgdG8gaGFuZGxlIGV4dGVuZGVkLgorICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxSR0JBMzI+KG1fY29sb3JEYXRhLnJnYmFBbmRGbGFncyA+PiAzMik7
Cit9CisKIGlubGluZSB2b2lkIENvbG9yOjpzZXRSR0IoUkdCQTMyIHJnYikKIHsKICAgICBtX2Nv
bG9yRGF0YS5yZ2JhQW5kRmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmdiKSA8PCAzMjsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0V4dGVuZGVkQ29s
b3IuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRXh0ZW5kZWRDb2xvci5j
cHAKaW5kZXggYmYxM2EyM2I5ZTU3ZDE3OGViZGU3NTVhODQ3MDI4MGM5OGU2MWI2Ni4uNTBlM2M1
YzhhNDI1ZjQ5OWRkZjRiMmEwODFmYmQyODhmMjFjYTA4YiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRXh0ZW5kZWRDb2xvci5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRXh0ZW5kZWRDb2xvci5jcHAKQEAgLTY2LDkgKzY2LDEw
IEBAIFN0cmluZyBFeHRlbmRlZENvbG9yOjpjc3NUZXh0KCkgY29uc3QKICAgICBidWlsZGVyLmFw
cGVuZCgnICcpOwogCiAgICAgYnVpbGRlci5hcHBlbmQobnVtYmVyVG9GaXhlZFByZWNpc2lvblN0
cmluZyhibHVlKCksIDYsIGJ1ZmZlciwgc2hvdWxkVHJ1bmNhdGVUcmFpbGluZ1plcm9zKSk7Ci0g
ICAgYnVpbGRlci5hcHBlbmRMaXRlcmFsKCIgLyAiKTsKLQotICAgIGJ1aWxkZXIuYXBwZW5kKG51
bWJlclRvRml4ZWRQcmVjaXNpb25TdHJpbmcoYWxwaGEoKSwgNiwgYnVmZmVyLCBzaG91bGRUcnVu
Y2F0ZVRyYWlsaW5nWmVyb3MpKTsKKyAgICBpZiAoIVdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChh
bHBoYSgpLCAxLjBmKSkgeworICAgICAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIiAvICIpOwor
ICAgICAgICBidWlsZGVyLmFwcGVuZChudW1iZXJUb0ZpeGVkUHJlY2lzaW9uU3RyaW5nKGFscGhh
KCksIDYsIGJ1ZmZlciwgc2hvdWxkVHJ1bmNhdGVUcmFpbGluZ1plcm9zKSk7CisgICAgfQogICAg
IGJ1aWxkZXIuYXBwZW5kKCcpJyk7CiAKICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvQ29sb3JDRy5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9Db2xvckNHLmNwcAppbmRl
eCA4YjJjY2EyNDY2ZjFlZWQzMDliYmRmMjJmODM0ODY3NDA3ZWE1NzVjLi5jMjk5NjZlYjIxZmJm
NzM3OTFhNTZlMDgyYTcxOWNjMTQzZDQxODQyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jZy9Db2xvckNHLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jZy9Db2xvckNHLmNwcApAQCAtMTE2LDI4ICsxMTYsNDQgQEAgQ29sb3I6
OkNvbG9yKENHQ29sb3JSZWYgY29sb3IpCiBzdGF0aWMgQ0dDb2xvclJlZiBsZWFrQ0dDb2xvcihj
b25zdCBDb2xvciYgY29sb3IpCiB7CiAgICAgQ0dGbG9hdCBjb21wb25lbnRzWzRdOworICAgIGlm
IChjb2xvci5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgRXh0ZW5kZWRDb2xvciYgZXh0ZW5kZWRD
b2xvciA9IGNvbG9yLmFzRXh0ZW5kZWQoKTsKKyAgICAgICAgY29tcG9uZW50c1swXSA9IGV4dGVu
ZGVkQ29sb3IucmVkKCk7CisgICAgICAgIGNvbXBvbmVudHNbMV0gPSBleHRlbmRlZENvbG9yLmdy
ZWVuKCk7CisgICAgICAgIGNvbXBvbmVudHNbMl0gPSBleHRlbmRlZENvbG9yLmJsdWUoKTsKKyAg
ICAgICAgY29tcG9uZW50c1szXSA9IGV4dGVuZGVkQ29sb3IuYWxwaGEoKTsKKyAgICAgICAgc3dp
dGNoIChleHRlbmRlZENvbG9yLmNvbG9yU3BhY2UoKSkgeworICAgICAgICBjYXNlIENvbG9yU3Bh
Y2VEaXNwbGF5UDM6CisgICAgICAgICAgICByZXR1cm4gQ0dDb2xvckNyZWF0ZShkaXNwbGF5UDND
b2xvclNwYWNlUmVmKCksIGNvbXBvbmVudHMpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgcmV0dXJuIENHQ29sb3JDcmVhdGUoc1JHQkNvbG9yU3BhY2VSZWYoKSwgY29tcG9uZW50cyk7
CisgICAgICAgIH0KKyAgICB9CisKICAgICBjb2xvci5nZXRSR0JBKGNvbXBvbmVudHNbMF0sIGNv
bXBvbmVudHNbMV0sIGNvbXBvbmVudHNbMl0sIGNvbXBvbmVudHNbM10pOwogICAgIHJldHVybiBD
R0NvbG9yQ3JlYXRlKHNSR0JDb2xvclNwYWNlUmVmKCksIGNvbXBvbmVudHMpOwogfQogCiBDR0Nv
bG9yUmVmIGNhY2hlZENHQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQogewotICAgIHN3aXRjaCAo
Y29sb3IucmdiKCkpIHsKLSAgICBjYXNlIENvbG9yOjp0cmFuc3BhcmVudDogewotICAgICAgICBz
dGF0aWMgQ0dDb2xvclJlZiB0cmFuc3BhcmVudENHQ29sb3IgPSBsZWFrQ0dDb2xvcihjb2xvcik7
Ci0gICAgICAgIHJldHVybiB0cmFuc3BhcmVudENHQ29sb3I7Ci0gICAgfQotICAgIGNhc2UgQ29s
b3I6OmJsYWNrOiB7Ci0gICAgICAgIHN0YXRpYyBDR0NvbG9yUmVmIGJsYWNrQ0dDb2xvciA9IGxl
YWtDR0NvbG9yKGNvbG9yKTsKLSAgICAgICAgcmV0dXJuIGJsYWNrQ0dDb2xvcjsKLSAgICB9Ci0g
ICAgY2FzZSBDb2xvcjo6d2hpdGU6IHsKLSAgICAgICAgc3RhdGljIENHQ29sb3JSZWYgd2hpdGVD
R0NvbG9yID0gbGVha0NHQ29sb3IoY29sb3IpOwotICAgICAgICByZXR1cm4gd2hpdGVDR0NvbG9y
OwotICAgIH0KKyAgICBpZiAoIWNvbG9yLmlzRXh0ZW5kZWQoKSkgeworICAgICAgICBzd2l0Y2gg
KGNvbG9yLnJnYigpKSB7CisgICAgICAgIGNhc2UgQ29sb3I6OnRyYW5zcGFyZW50OiB7CisgICAg
ICAgICAgICBzdGF0aWMgQ0dDb2xvclJlZiB0cmFuc3BhcmVudENHQ29sb3IgPSBsZWFrQ0dDb2xv
cihjb2xvcik7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwYXJlbnRDR0NvbG9yOworICAgICAg
ICB9CisgICAgICAgIGNhc2UgQ29sb3I6OmJsYWNrOiB7CisgICAgICAgICAgICBzdGF0aWMgQ0dD
b2xvclJlZiBibGFja0NHQ29sb3IgPSBsZWFrQ0dDb2xvcihjb2xvcik7CisgICAgICAgICAgICBy
ZXR1cm4gYmxhY2tDR0NvbG9yOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ29sb3I6OndoaXRl
OiB7CisgICAgICAgICAgICBzdGF0aWMgQ0dDb2xvclJlZiB3aGl0ZUNHQ29sb3IgPSBsZWFrQ0dD
b2xvcihjb2xvcik7CisgICAgICAgICAgICByZXR1cm4gd2hpdGVDR0NvbG9yOworICAgICAgICB9
CisgICAgICAgIH0KICAgICB9CiAKLSAgICBBU1NFUlQoY29sb3IucmdiKCkpOworICAgIEFTU0VS
VChjb2xvci5pc0V4dGVuZGVkKCkgfHwgY29sb3IucmdiKCkpOwogCiAgICAgc3RhdGljIE5ldmVy
RGVzdHJveWVkPFRpbnlMUlVDYWNoZTxDb2xvciwgUmV0YWluUHRyPENHQ29sb3JSZWY+LCAzMj4+
IGNhY2hlOwogICAgIHJldHVybiBjYWNoZS5nZXQoKS5nZXQoY29sb3IpLmdldCgpOwpkaWZmIC0t
Z2l0IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmluZGV4
IGQyMDJhNGU1Yjk0NTZmNzFlOTkwOWU1ODJjZTczMGY1MmY3MDQxZjIuLmU0ZGJiM2ZmYWM3ZTQ1
NGY0MDNmOGY3ZWUxZjg1OGU3OTZiZjRhMmIgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZworKysgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAorMjAxNi0x
MC0yOCAgRGVhbiBKYWNrc29uICA8ZGlub0BhcHBsZS5jb20+CisKKyAgICAgICAgUGFyc2UgY29s
b3IoKSBmdW5jdGlvbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTY0MTQ2CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbXMvMjkwMDcyMTg+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdCB0aGF0IGV4ZXJj
aXNlcyB0aGUgbmV3IGNvbG9yKCkgZnVuY3Rpb24gaW4gQ1NTLiBJdCBjaGVja3MKKyAgICAgICAg
YWxsIHZhbGlkIGFuZCBpbnZhbGlkIGlucHV0LCB3aXRoIHRoZSBleGNlcHRpb24gb2YgZmFsbGJh
Y2sgY29udGVudC4KKworICAgICAgICAqIGNzczMvY29sb3IvY29sb3ItZnVuY3Rpb24tY29tcHV0
ZWQtc3R5bGUtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBjc3MzL2NvbG9yL2NvbG9y
LWZ1bmN0aW9uLWNvbXB1dGVkLXN0eWxlLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGNzczMvY29s
b3IvY29sb3ItZnVuY3Rpb24tcGFyc2luZy1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAq
IGNzczMvY29sb3IvY29sb3ItZnVuY3Rpb24tcGFyc2luZy5odG1sOiBBZGRlZC4KKwogMjAxNi0x
MC0yOCAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAgICBX
cm9uZyBibHVyIHJhZGl1cyBmb3IgZmlsdGVyOiBkcm9wLXNoYWRvdygpCmRpZmYgLS1naXQgYS9M
YXlvdXRUZXN0cy9jc3MzL2NvbG9yL2NvbG9yLWZ1bmN0aW9uLWNvbXB1dGVkLXN0eWxlLWV4cGVj
dGVkLnR4dCBiL0xheW91dFRlc3RzL2NzczMvY29sb3IvY29sb3ItZnVuY3Rpb24tY29tcHV0ZWQt
c3R5bGUtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjE1OTRhNzdkZjI5ODkyMWYyOGM2OTM1ZjNh
OTgyMjNkODcyYTc2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9jc3MzL2NvbG9y
L2NvbG9yLWZ1bmN0aW9uLWNvbXB1dGVkLXN0eWxlLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDEx
MiBAQAorVGVzdCB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhlIGNvbG9yKCkgZnVuY3Rpb24uCisK
K09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZv
bGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCisKK1RFU1Q6IEJhc2ljIHNSR0Igd2hpdGUg
LS0+IGNvbG9yKHNyZ2IgMSAxIDEpCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUo
J2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2IgMSAxIDEpJworCitURVNUOiBXaGl0ZSB3aXRoIGxvdHMg
b2Ygc3BhY2UgLS0+IGNvbG9yKCAgICBzcmdiICAgICAgICAgMSAgICAgIDEgMSAgICAgICApCitQ
QVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2Ig
MSAxIDEpJworCitURVNUOiBzUkdCIGNvbG9yIC0tPiBjb2xvcihzcmdiIDAuMjUgMC41IDAuNzUp
CitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNy
Z2IgMC4yNSAwLjUgMC43NSknCisKK1RFU1Q6IERpZmZlcmVudCBjYXNlIGZvciBzUkdCIC0tPiBj
b2xvcihTckdiIDAuMjUgMC41IDAuNzUpCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFs
dWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2IgMC4yNSAwLjUgMC43NSknCisKK1RFU1Q6IHNSR0Ig
Y29sb3Igd2l0aCB1bm5lY2Vzc2FyeSBkZWNpbWFscyAtLT4gY29sb3Ioc3JnYiAxLjAwMDAwIDAu
NTAwMDAwIDAuMjApCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykg
aXMgJ2NvbG9yKHNyZ2IgMSAwLjUgMC4yKScKKworVEVTVDogc1JHQiB3aGl0ZSB3aXRoIDAuNSBh
bHBoYSAtLT4gY29sb3Ioc3JnYiAxIDEgMSAvIDAuNSkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJv
cGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3JnYiAxIDEgMSAvIDAuNSknCisKK1RFU1Q6
IHNSR0Igd2hpdGUgd2l0aCAwIGFscGhhIC0tPiBjb2xvcihzcmdiIDEgMSAxIC8gMCkKK1BBU1Mg
ZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3JnYiAxIDEg
MSAvIDApJworCitURVNUOiBzUkdCIHdoaXRlIHdpdGggNTAlIGFscGhhIC0tPiBjb2xvcihzcmdi
IDEgMSAxIC8gNTAlKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicp
IGlzICdjb2xvcihzcmdiIDEgMSAxIC8gMC41KScKKworVEVTVDogc1JHQiB3aGl0ZSB3aXRoIDAl
IGFscGhhIC0tPiBjb2xvcihzcmdiIDEgMSAxIC8gMCUpCitQQVNTIGRlY2xhcmF0aW9uLmdldFBy
b3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2IgMSAxIDEgLyAwKScKKworVEVTVDog
T25lIG1pc3NpbmcgY29tcG9uZW50IGlzIDAgLS0+IGNvbG9yKHNyZ2IgMSAxKQorUEFTUyBkZWNs
YXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdjb2xvcihzcmdiIDEgMSAwKScK
KworVEVTVDogVHdvIG1pc3NpbmcgY29tcG9uZW50cyBhcmUgMCAtLT4gY29sb3Ioc3JnYiAxKQor
UEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdjb2xvcihzcmdi
IDEgMCAwKScKKworVEVTVDogQWxsIGNvbXBvbmVudHMgbWlzc2luZyAtLT4gY29sb3Ioc3JnYikK
K1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3Jn
YiAwIDAgMCknCisKK1RFU1Q6IERpc3BsYXkgUDMgY29sb3IgLS0+IGNvbG9yKGRpc3BsYXktcDMg
MC42IDAuNyAwLjgpCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykg
aXMgJ2NvbG9yKGRpc3BsYXktcDMgMC42IDAuNyAwLjgpJworCitURVNUOiBEaWZmZXJlbnQgY2Fz
ZSBmb3IgRGlzcGxheSBQMyAtLT4gY29sb3IoZElzcExhWS1QMyAwLjYgMC43IDAuOCkKK1BBU1Mg
ZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3IoZGlzcGxheS1w
MyAwLjYgMC43IDAuOCknCisKKworRmFsbGJhY2sgdGVzdHMuCisKKworVEVTVDogVW5rbm93biBj
b2xvciBzcGFjZSBzaG91bGQgZmFsbGJhY2sgLS0+IGNvbG9yKHVua25vd24gMSAyIDMsIHJlZCkK
K0ZBSUwgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBzaG91bGQgYmUgY29s
b3IodW5rbm93biAxIDIgMywgcmVkKS4gV2FzIHJnYigwLCAwLCAwKS4KKworCitDbGFtcGluZyB0
ZXN0cy4KKworCitURVNUOiBzUkdCIGNvbG9yIHdpdGggbmVnYXRpdmUgY29tcG9uZW50IHNob3Vs
ZCBjbGFtcCB0byAwIC0tPiBjb2xvcihzcmdiIC0wLjI1IDAuNSAwLjc1KQorUEFTUyBkZWNsYXJh
dGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdjb2xvcihzcmdiIDAgMC41IDAuNzUp
JworCitURVNUOiBzUkdCIGNvbG9yIHdpdGggY29tcG9uZW50ID4gMSBzaG91bGQgY2xhbXAgLS0+
IGNvbG9yKHNyZ2IgMC4yNSAxLjUgMC43NSkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlW
YWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3JnYiAwLjI1IDEgMC43NSknCisKK1RFU1Q6IERpc3Bs
YXkgUDMgY29sb3Igd2l0aCBuZWdhdGl2ZSBjb21wb25lbnQgc2hvdWxkIGNsYW1wIHRvIDAgLS0+
IGNvbG9yKGRpc3BsYXktcDMgMC41IC0xOTkgMC43NSkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJv
cGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3IoZGlzcGxheS1wMyAwLjUgMCAwLjc1KScKKwor
VEVTVDogRGlzcGxheSBQMyBjb2xvciB3aXRoIGNvbXBvbmVudCA+IDEgc2hvdWxkIGNsYW1wIC0t
PiBjb2xvcihkaXNwbGF5LXAzIDE4NCAxLjAwMDAxIDIzNDczMjk3NDY1ODcpCitQQVNTIGRlY2xh
cmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKGRpc3BsYXktcDMgMSAx
IDEpJworCitURVNUOiBBbHBoYSA+IDEgc2hvdWxkIGNsYW1wIC0tPiBjb2xvcihzcmdiIDAuMSAw
LjIgMC4zIC8gMS45KQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicp
IGlzICdjb2xvcihzcmdiIDAuMSAwLjIgMC4zKScKKworVEVTVDogTmVnYXRpdmUgYWxwaGEgc2hv
dWxkIGNsYW1wIC0tPiBjb2xvcihzcmdiIDEgMSAxIC8gLTAuMikKK1BBU1MgZGVjbGFyYXRpb24u
Z2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3JnYiAxIDEgMSAvIDApJworCisK
K0ludmFsaWQgcHJvcGVydHkgdmFsdWUgdGVzdHMuCisKKworVEVTVDogRW1wdHkgLS0+IGNvbG9y
KCkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAncmdiKDAs
IDAsIDApJworCitURVNUOiBCYWQgY29sb3Igc3BhY2UgLS0+IGNvbG9yKGJhbmFuYSAxIDEgMSkK
K1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAncmdiKDAsIDAs
IDApJworCitURVNUOiBCYWQgRGlzcGxheSBQMyBjb2xvciBzcGFjZSAtLT4gY29sb3IoZGlzcGxh
eXAzIDEgMSAxKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlz
ICdyZ2IoMCwgMCwgMCknCisKK1RFU1Q6IE5vIGNvbG9yIHNwYWNlIC0tPiBjb2xvcigxIDEgMSkK
K1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAncmdiKDAsIDAs
IDApJworCitURVNUOiBUb28gbWFueSBwYXJhbWV0ZXJzIC0tPiBjb2xvcihzcmdiIDEgMSAxIDEp
CitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ3JnYigwLCAw
LCAwKScKKworVEVTVDogV2F5IHRvbyBtYW55IHBhcmFtZXRlcnMgLS0+IGNvbG9yKHNyZ2IgMSAx
IDEgMSAxKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdy
Z2IoMCwgMCwgMCknCisKK1RFU1Q6IEJhZCBwYXJhbWV0ZXJzIC0tPiBjb2xvcihzcmdiIDEgZWdn
cyAxKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdyZ2Io
MCwgMCwgMCknCisKK1RFU1Q6IEJhZCBhbHBoYSAtLT4gY29sb3Ioc3JnYiAxIDEgMSAvIGJhY29u
KQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdyZ2IoMCwg
MCwgMCknCisKK1RFU1Q6IEp1bmsgYWZ0ZXIgYWxwaGEgLS0+IGNvbG9yKHNyZ2IgMSAxIDEgLyAx
IGN1Y3VtYmVyKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlz
ICdyZ2IoMCwgMCwgMCknCisKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVT
VCBDT01QTEVURQorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9jc3MzL2NvbG9yL2NvbG9yLWZ1
bmN0aW9uLWNvbXB1dGVkLXN0eWxlLmh0bWwgYi9MYXlvdXRUZXN0cy9jc3MzL2NvbG9yL2NvbG9y
LWZ1bmN0aW9uLWNvbXB1dGVkLXN0eWxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjJmYmU5ZmY2NDRkZWM5
MmJmMDNkNTk2ZGM5NGQ5YjUyYTAzYmIwOQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3Rz
L2NzczMvY29sb3IvY29sb3ItZnVuY3Rpb24tY29tcHV0ZWQtc3R5bGUuaHRtbApAQCAtMCwwICsx
LDg1IEBACis8c3R5bGU+PC9zdHlsZT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMt
dGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPHAgaWQ9ImRlc2NyaXB0aW9uIj48L3A+Cis8ZGl2IGlk
PSJjb25zb2xlIj48L2Rpdj4KKzxwIGlkPSJ0YXJnZXQiPjwvcD4KKzxzY3JpcHQ+CitkZXNjcmlw
dGlvbigiVGVzdCB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhlIGNvbG9yKCkgZnVuY3Rpb24uIik7
CisKK2xldCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpOwor
bGV0IHN0eWxlc2hlZXQgPSBzdHlsZUVsZW1lbnQuc2hlZXQ7CitsZXQgY3NzUnVsZSwgZGVjbGFy
YXRpb247CisKK2Z1bmN0aW9uIHRlc3RDb2xvckZ1bmN0aW9uKGRlc2NyaXB0aW9uLCBydWxlLCBl
eHBlY3RlZFZhbHVlKQoreworICAgIGRlYnVnKCIiKTsKKyAgICBkZWJ1ZyhgVEVTVDogJHtkZXNj
cmlwdGlvbn0gLS0+ICR7cnVsZX1gKTsKKworICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShgI3Rh
cmdldCB7IGNvbG9yOiAke3J1bGV9OyB9YCwgMCk7CisgICAgY3NzUnVsZSA9IHN0eWxlc2hlZXQu
Y3NzUnVsZXMuaXRlbSgwKTsKKworICAgIGRlY2xhcmF0aW9uID0gd2luZG93LmdldENvbXB1dGVk
U3R5bGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRhcmdldCIpKTsKKyAgICBzaG91bGRCZSgi
ZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSIsIGAnJHtleHBlY3RlZFZhbHVl
fSdgKTsKKyAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoMCk7Cit9CisKK3Rlc3RDb2xvckZ1bmN0
aW9uKCJCYXNpYyBzUkdCIHdoaXRlIiwgImNvbG9yKHNyZ2IgMSAxIDEpIiwgImNvbG9yKHNyZ2Ig
MSAxIDEpIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigiV2hpdGUgd2l0aCBsb3RzIG9mIHNwYWNlIiwg
ImNvbG9yKCAgICBzcmdiICAgICAgICAgMSAgICAgIDEgMSAgICAgICApIiwgImNvbG9yKHNyZ2Ig
MSAxIDEpIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigic1JHQiBjb2xvciIsICJjb2xvcihzcmdiIDAu
MjUgMC41IDAuNzUpIiwgImNvbG9yKHNyZ2IgMC4yNSAwLjUgMC43NSkiKTsKK3Rlc3RDb2xvckZ1
bmN0aW9uKCJEaWZmZXJlbnQgY2FzZSBmb3Igc1JHQiIsICJjb2xvcihTckdiIDAuMjUgMC41IDAu
NzUpIiwgImNvbG9yKHNyZ2IgMC4yNSAwLjUgMC43NSkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJz
UkdCIGNvbG9yIHdpdGggdW5uZWNlc3NhcnkgZGVjaW1hbHMiLCAiY29sb3Ioc3JnYiAxLjAwMDAw
IDAuNTAwMDAwIDAuMjApIiwgImNvbG9yKHNyZ2IgMSAwLjUgMC4yKSIpOworCit0ZXN0Q29sb3JG
dW5jdGlvbigic1JHQiB3aGl0ZSB3aXRoIDAuNSBhbHBoYSIsICJjb2xvcihzcmdiIDEgMSAxIC8g
MC41KSIsICJjb2xvcihzcmdiIDEgMSAxIC8gMC41KSIpOwordGVzdENvbG9yRnVuY3Rpb24oInNS
R0Igd2hpdGUgd2l0aCAwIGFscGhhIiwgImNvbG9yKHNyZ2IgMSAxIDEgLyAwKSIsICJjb2xvcihz
cmdiIDEgMSAxIC8gMCkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJzUkdCIHdoaXRlIHdpdGggNTAl
IGFscGhhIiwgImNvbG9yKHNyZ2IgMSAxIDEgLyA1MCUpIiwgImNvbG9yKHNyZ2IgMSAxIDEgLyAw
LjUpIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigic1JHQiB3aGl0ZSB3aXRoIDAlIGFscGhhIiwgImNv
bG9yKHNyZ2IgMSAxIDEgLyAwJSkiLCAiY29sb3Ioc3JnYiAxIDEgMSAvIDApIik7CisKK3Rlc3RD
b2xvckZ1bmN0aW9uKCJPbmUgbWlzc2luZyBjb21wb25lbnQgaXMgMCIsICJjb2xvcihzcmdiIDEg
MSkiLCAiY29sb3Ioc3JnYiAxIDEgMCkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJUd28gbWlzc2lu
ZyBjb21wb25lbnRzIGFyZSAwIiwgImNvbG9yKHNyZ2IgMSkiLCAiY29sb3Ioc3JnYiAxIDAgMCki
KTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJBbGwgY29tcG9uZW50cyBtaXNzaW5nIiwgImNvbG9yKHNy
Z2IpIiwgImNvbG9yKHNyZ2IgMCAwIDApIik7CisKK3Rlc3RDb2xvckZ1bmN0aW9uKCJEaXNwbGF5
IFAzIGNvbG9yIiwgImNvbG9yKGRpc3BsYXktcDMgMC42IDAuNyAwLjgpIiwgImNvbG9yKGRpc3Bs
YXktcDMgMC42IDAuNyAwLjgpIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigiRGlmZmVyZW50IGNhc2Ug
Zm9yIERpc3BsYXkgUDMiLCAiY29sb3IoZElzcExhWS1QMyAwLjYgMC43IDAuOCkiLCAiY29sb3Io
ZGlzcGxheS1wMyAwLjYgMC43IDAuOCkiKTsKKworZGVidWcoIiIpOworZGVidWcoIiIpOworZGVi
dWcoIkZhbGxiYWNrIHRlc3RzLiIpCitkZWJ1ZygiIik7CisKK3Rlc3RDb2xvckZ1bmN0aW9uKCJV
bmtub3duIGNvbG9yIHNwYWNlIHNob3VsZCBmYWxsYmFjayIsICJjb2xvcih1bmtub3duIDEgMiAz
LCByZWQpIiwgImNvbG9yKHVua25vd24gMSAyIDMsIHJlZCkiKTsKKworZGVidWcoIiIpOworZGVi
dWcoIiIpOworZGVidWcoIkNsYW1waW5nIHRlc3RzLiIpCitkZWJ1ZygiIik7CisKKy8vIE5PVEU6
IElmIHdlIHN0YXJ0IHN1cHBvcnRpbmcgZXh0ZW5kZWQtcmFuZ2Ugc1JHQiB3aXRob3V0IGNoYW5n
aW5nIHRoZSBrZXl3b3JkLCB0aGVzZQorLy8gdGVzdHMgbWF5IGZhaWwuCit0ZXN0Q29sb3JGdW5j
dGlvbigic1JHQiBjb2xvciB3aXRoIG5lZ2F0aXZlIGNvbXBvbmVudCBzaG91bGQgY2xhbXAgdG8g
MCIsICJjb2xvcihzcmdiIC0wLjI1IDAuNSAwLjc1KSIsICJjb2xvcihzcmdiIDAgMC41IDAuNzUp
Iik7Cit0ZXN0Q29sb3JGdW5jdGlvbigic1JHQiBjb2xvciB3aXRoIGNvbXBvbmVudCA+IDEgc2hv
dWxkIGNsYW1wIiwgImNvbG9yKHNyZ2IgMC4yNSAxLjUgMC43NSkiLCAiY29sb3Ioc3JnYiAwLjI1
IDEgMC43NSkiKTsKKwordGVzdENvbG9yRnVuY3Rpb24oIkRpc3BsYXkgUDMgY29sb3Igd2l0aCBu
ZWdhdGl2ZSBjb21wb25lbnQgc2hvdWxkIGNsYW1wIHRvIDAiLCAiY29sb3IoZGlzcGxheS1wMyAw
LjUgLTE5OSAwLjc1KSIsICJjb2xvcihkaXNwbGF5LXAzIDAuNSAwIDAuNzUpIik7Cit0ZXN0Q29s
b3JGdW5jdGlvbigiRGlzcGxheSBQMyBjb2xvciB3aXRoIGNvbXBvbmVudCA+IDEgc2hvdWxkIGNs
YW1wIiwgImNvbG9yKGRpc3BsYXktcDMgMTg0IDEuMDAwMDEgMjM0NzMyOTc0NjU4NykiLCAiY29s
b3IoZGlzcGxheS1wMyAxIDEgMSkiKTsKKwordGVzdENvbG9yRnVuY3Rpb24oIkFscGhhID4gMSBz
aG91bGQgY2xhbXAiLCAiY29sb3Ioc3JnYiAwLjEgMC4yIDAuMyAvIDEuOSkiLCAiY29sb3Ioc3Jn
YiAwLjEgMC4yIDAuMykiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJOZWdhdGl2ZSBhbHBoYSBzaG91
bGQgY2xhbXAiLCAiY29sb3Ioc3JnYiAxIDEgMSAvIC0wLjIpIiwgImNvbG9yKHNyZ2IgMSAxIDEg
LyAwKSIpOworCitkZWJ1ZygiIik7CitkZWJ1ZygiIik7CitkZWJ1ZygiSW52YWxpZCBwcm9wZXJ0
eSB2YWx1ZSB0ZXN0cy4iKQorZGVidWcoIiIpOworCit0ZXN0Q29sb3JGdW5jdGlvbigiRW1wdHki
LCAiY29sb3IoKSIsICJyZ2IoMCwgMCwgMCkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJCYWQgY29s
b3Igc3BhY2UiLCAiY29sb3IoYmFuYW5hIDEgMSAxKSIsICJyZ2IoMCwgMCwgMCkiKTsKK3Rlc3RD
b2xvckZ1bmN0aW9uKCJCYWQgRGlzcGxheSBQMyBjb2xvciBzcGFjZSIsICJjb2xvcihkaXNwbGF5
cDMgMSAxIDEpIiwgInJnYigwLCAwLCAwKSIpOwordGVzdENvbG9yRnVuY3Rpb24oIk5vIGNvbG9y
IHNwYWNlIiwgImNvbG9yKDEgMSAxKSIsICJyZ2IoMCwgMCwgMCkiKTsKK3Rlc3RDb2xvckZ1bmN0
aW9uKCJUb28gbWFueSBwYXJhbWV0ZXJzIiwgImNvbG9yKHNyZ2IgMSAxIDEgMSkiLCAicmdiKDAs
IDAsIDApIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigiV2F5IHRvbyBtYW55IHBhcmFtZXRlcnMiLCAi
Y29sb3Ioc3JnYiAxIDEgMSAxIDEpIiwgInJnYigwLCAwLCAwKSIpOwordGVzdENvbG9yRnVuY3Rp
b24oIkJhZCBwYXJhbWV0ZXJzIiwgImNvbG9yKHNyZ2IgMSBlZ2dzIDEpIiwgInJnYigwLCAwLCAw
KSIpOwordGVzdENvbG9yRnVuY3Rpb24oIkJhZCBhbHBoYSIsICJjb2xvcihzcmdiIDEgMSAxIC8g
YmFjb24pIiwgInJnYigwLCAwLCAwKSIpOwordGVzdENvbG9yRnVuY3Rpb24oIkp1bmsgYWZ0ZXIg
YWxwaGEiLCAiY29sb3Ioc3JnYiAxIDEgMSAvIDEgY3VjdW1iZXIpIiwgInJnYigwLCAwLCAwKSIp
OworCitkZWJ1ZygiIik7CisKKzwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNl
cy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvY3Nz
My9jb2xvci9jb2xvci1mdW5jdGlvbi1wYXJzaW5nLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3Rz
L2NzczMvY29sb3IvY29sb3ItZnVuY3Rpb24tcGFyc2luZy1leHBlY3RlZC50eHQKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uMWIzMzU1ZDczZTk2M2QyOTUzZmRhM2NkMTQ1NWE1YjE0MTg4OTlhNQotLS0gL2Rldi9udWxs
CisrKyBiL0xheW91dFRlc3RzL2NzczMvY29sb3IvY29sb3ItZnVuY3Rpb24tcGFyc2luZy1leHBl
Y3RlZC50eHQKQEAgLTAsMCArMSwxMTIgQEAKK1Rlc3QgdGhlIHBhcnNpbmcgb2YgdGhlIGNvbG9y
KCkgZnVuY3Rpb24uCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFT
UyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCisKK1RFU1Q6IEJh
c2ljIHNSR0Igd2hpdGUgLS0+IGNvbG9yKHNyZ2IgMSAxIDEpCitQQVNTIGRlY2xhcmF0aW9uLmdl
dFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2IgMSAxIDEpJworCitURVNUOiBX
aGl0ZSB3aXRoIGxvdHMgb2Ygc3BhY2UgLS0+IGNvbG9yKCAgICBzcmdiICAgICAgICAgMSAgICAg
IDEgMSAgICAgICApCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykg
aXMgJ2NvbG9yKHNyZ2IgMSAxIDEpJworCitURVNUOiBzUkdCIGNvbG9yIC0tPiBjb2xvcihzcmdi
IDAuMjUgMC41IDAuNzUpCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9y
JykgaXMgJ2NvbG9yKHNyZ2IgMC4yNSAwLjUgMC43NSknCisKK1RFU1Q6IERpZmZlcmVudCBjYXNl
IGZvciBzUkdCIC0tPiBjb2xvcihTckdiIDAuMjUgMC41IDAuNzUpCitQQVNTIGRlY2xhcmF0aW9u
LmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2IgMC4yNSAwLjUgMC43NSkn
CisKK1RFU1Q6IHNSR0IgY29sb3Igd2l0aCB1bm5lY2Vzc2FyeSBkZWNpbWFscyAtLT4gY29sb3Io
c3JnYiAxLjAwMDAwIDAuNTAwMDAwIDAuMjApCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5
VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2IgMSAwLjUgMC4yKScKKworVEVTVDogc1JHQiB3
aGl0ZSB3aXRoIDAuNSBhbHBoYSAtLT4gY29sb3Ioc3JnYiAxIDEgMSAvIDAuNSkKK1BBU1MgZGVj
bGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3JnYiAxIDEgMSAv
IDAuNSknCisKK1RFU1Q6IHNSR0Igd2hpdGUgd2l0aCAwIGFscGhhIC0tPiBjb2xvcihzcmdiIDEg
MSAxIC8gMCkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAn
Y29sb3Ioc3JnYiAxIDEgMSAvIDApJworCitURVNUOiBzUkdCIHdoaXRlIHdpdGggNTAlIGFscGhh
IC0tPiBjb2xvcihzcmdiIDEgMSAxIC8gNTAlKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0
eVZhbHVlKCdjb2xvcicpIGlzICdjb2xvcihzcmdiIDEgMSAxIC8gMC41KScKKworVEVTVDogc1JH
QiB3aGl0ZSB3aXRoIDAlIGFscGhhIC0tPiBjb2xvcihzcmdiIDEgMSAxIC8gMCUpCitQQVNTIGRl
Y2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKHNyZ2IgMSAxIDEg
LyAwKScKKworVEVTVDogT25lIG1pc3NpbmcgY29tcG9uZW50IGlzIDAgLS0+IGNvbG9yKHNyZ2Ig
MSAxKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdjb2xv
cihzcmdiIDEgMSAwKScKKworVEVTVDogVHdvIG1pc3NpbmcgY29tcG9uZW50cyBhcmUgMCAtLT4g
Y29sb3Ioc3JnYiAxKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicp
IGlzICdjb2xvcihzcmdiIDEgMCAwKScKKworVEVTVDogQWxsIGNvbXBvbmVudHMgbWlzc2luZyAt
LT4gY29sb3Ioc3JnYikKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3In
KSBpcyAnY29sb3Ioc3JnYiAwIDAgMCknCisKK1RFU1Q6IERpc3BsYXkgUDMgY29sb3IgLS0+IGNv
bG9yKGRpc3BsYXktcDMgMC42IDAuNyAwLjgpCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5
VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKGRpc3BsYXktcDMgMC42IDAuNyAwLjgpJworCitURVNU
OiBEaWZmZXJlbnQgY2FzZSBmb3IgRGlzcGxheSBQMyAtLT4gY29sb3IoZElzcExhWS1QMyAwLjYg
MC43IDAuOCkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAn
Y29sb3IoZGlzcGxheS1wMyAwLjYgMC43IDAuOCknCisKKworRmFsbGJhY2sgdGVzdHMuCisKKwor
VEVTVDogVW5rbm93biBjb2xvciBzcGFjZSBzaG91bGQgZmFsbGJhY2sgLS0+IGNvbG9yKHVua25v
d24gMSAyIDMsIHJlZCkKK0ZBSUwgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3In
KSBzaG91bGQgYmUgY29sb3IodW5rbm93biAxIDIgMywgcmVkKS4gV2FzIC4KKworCitDbGFtcGlu
ZyB0ZXN0cy4KKworCitURVNUOiBzUkdCIGNvbG9yIHdpdGggbmVnYXRpdmUgY29tcG9uZW50IHNo
b3VsZCBjbGFtcCB0byAwIC0tPiBjb2xvcihzcmdiIC0wLjI1IDAuNSAwLjc1KQorUEFTUyBkZWNs
YXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICdjb2xvcihzcmdiIDAgMC41IDAu
NzUpJworCitURVNUOiBzUkdCIGNvbG9yIHdpdGggY29tcG9uZW50ID4gMSBzaG91bGQgY2xhbXAg
LS0+IGNvbG9yKHNyZ2IgMC4yNSAxLjUgMC43NSkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVy
dHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3JnYiAwLjI1IDEgMC43NSknCisKK1RFU1Q6IERp
c3BsYXkgUDMgY29sb3Igd2l0aCBuZWdhdGl2ZSBjb21wb25lbnQgc2hvdWxkIGNsYW1wIHRvIDAg
LS0+IGNvbG9yKGRpc3BsYXktcDMgMC41IC0xOTkgMC43NSkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0
UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3IoZGlzcGxheS1wMyAwLjUgMCAwLjc1KScK
KworVEVTVDogRGlzcGxheSBQMyBjb2xvciB3aXRoIGNvbXBvbmVudCA+IDEgc2hvdWxkIGNsYW1w
IC0tPiBjb2xvcihkaXNwbGF5LXAzIDE4NCAxLjAwMDAxIDIzNDczMjk3NDY1ODcpCitQQVNTIGRl
Y2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykgaXMgJ2NvbG9yKGRpc3BsYXktcDMg
MSAxIDEpJworCitURVNUOiBBbHBoYSA+IDEgc2hvdWxkIGNsYW1wIC0tPiBjb2xvcihzcmdiIDAu
MSAwLjIgMC4zIC8gMS45KQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xv
cicpIGlzICdjb2xvcihzcmdiIDAuMSAwLjIgMC4zKScKKworVEVTVDogTmVnYXRpdmUgYWxwaGEg
c2hvdWxkIGNsYW1wIC0tPiBjb2xvcihzcmdiIDEgMSAxIC8gLTAuMikKK1BBU1MgZGVjbGFyYXRp
b24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnY29sb3Ioc3JnYiAxIDEgMSAvIDApJwor
CisKK0ludmFsaWQgcHJvcGVydHkgdmFsdWUgdGVzdHMuCisKKworVEVTVDogRW1wdHkgLS0+IGNv
bG9yKCkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnJwor
CitURVNUOiBCYWQgY29sb3Igc3BhY2UgLS0+IGNvbG9yKGJhbmFuYSAxIDEgMSkKK1BBU1MgZGVj
bGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgnY29sb3InKSBpcyAnJworCitURVNUOiBCYWQgRGlz
cGxheSBQMyBjb2xvciBzcGFjZSAtLT4gY29sb3IoZGlzcGxheXAzIDEgMSAxKQorUEFTUyBkZWNs
YXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICcnCisKK1RFU1Q6IE5vIGNvbG9y
IHNwYWNlIC0tPiBjb2xvcigxIDEgMSkKK1BBU1MgZGVjbGFyYXRpb24uZ2V0UHJvcGVydHlWYWx1
ZSgnY29sb3InKSBpcyAnJworCitURVNUOiBUb28gbWFueSBwYXJhbWV0ZXJzIC0tPiBjb2xvcihz
cmdiIDEgMSAxIDEpCitQQVNTIGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJykg
aXMgJycKKworVEVTVDogV2F5IHRvbyBtYW55IHBhcmFtZXRlcnMgLS0+IGNvbG9yKHNyZ2IgMSAx
IDEgMSAxKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICcn
CisKK1RFU1Q6IEJhZCBwYXJhbWV0ZXJzIC0tPiBjb2xvcihzcmdiIDEgZWdncyAxKQorUEFTUyBk
ZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICcnCisKK1RFU1Q6IEJhZCBh
bHBoYSAtLT4gY29sb3Ioc3JnYiAxIDEgMSAvIGJhY29uKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQ
cm9wZXJ0eVZhbHVlKCdjb2xvcicpIGlzICcnCisKK1RFU1Q6IEp1bmsgYWZ0ZXIgYWxwaGEgLS0+
IGNvbG9yKHNyZ2IgMSAxIDEgLyAxIGN1Y3VtYmVyKQorUEFTUyBkZWNsYXJhdGlvbi5nZXRQcm9w
ZXJ0eVZhbHVlKCdjb2xvcicpIGlzICcnCisKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRy
dWUKKworVEVTVCBDT01QTEVURQorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9jc3MzL2NvbG9y
L2NvbG9yLWZ1bmN0aW9uLXBhcnNpbmcuaHRtbCBiL0xheW91dFRlc3RzL2NzczMvY29sb3IvY29s
b3ItZnVuY3Rpb24tcGFyc2luZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmY1NTE2NTAwNjkzZmU4ODExNTMy
NDdkNTMyYWY0ZjhiZjA2YjY2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9jc3Mz
L2NvbG9yL2NvbG9yLWZ1bmN0aW9uLXBhcnNpbmcuaHRtbApAQCAtMCwwICsxLDg0IEBACis8c3R5
bGU+PC9zdHlsZT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMi
Pjwvc2NyaXB0PgorPHAgaWQ9ImRlc2NyaXB0aW9uIj48L3A+Cis8ZGl2IGlkPSJjb25zb2xlIj48
L2Rpdj4KKzxzY3JpcHQ+CitkZXNjcmlwdGlvbigiVGVzdCB0aGUgcGFyc2luZyBvZiB0aGUgY29s
b3IoKSBmdW5jdGlvbi4iKTsKKworbGV0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2Vs
ZWN0b3IoInN0eWxlIik7CitsZXQgc3R5bGVzaGVldCA9IHN0eWxlRWxlbWVudC5zaGVldDsKK2xl
dCBjc3NSdWxlLCBkZWNsYXJhdGlvbjsKKworZnVuY3Rpb24gdGVzdENvbG9yRnVuY3Rpb24oZGVz
Y3JpcHRpb24sIHJ1bGUsIGV4cGVjdGVkVmFsdWUpCit7CisgICAgZGVidWcoIiIpOworICAgIGRl
YnVnKGBURVNUOiAke2Rlc2NyaXB0aW9ufSAtLT4gJHtydWxlfWApOworCisgICAgc3R5bGVzaGVl
dC5pbnNlcnRSdWxlKGAjdGFyZ2V0IHsgY29sb3I6ICR7cnVsZX07IH1gLCAwKTsKKyAgICBjc3NS
dWxlID0gc3R5bGVzaGVldC5jc3NSdWxlcy5pdGVtKDApOworCisgICAgZGVjbGFyYXRpb24gPSBj
c3NSdWxlLnN0eWxlOworICAgIHNob3VsZEJlKCJkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVl
KCdjb2xvcicpIiwgYCcke2V4cGVjdGVkVmFsdWV9J2ApOworICAgIHN0eWxlc2hlZXQuZGVsZXRl
UnVsZSgwKTsKK30KKwordGVzdENvbG9yRnVuY3Rpb24oIkJhc2ljIHNSR0Igd2hpdGUiLCAiY29s
b3Ioc3JnYiAxIDEgMSkiLCAiY29sb3Ioc3JnYiAxIDEgMSkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9u
KCJXaGl0ZSB3aXRoIGxvdHMgb2Ygc3BhY2UiLCAiY29sb3IoICAgIHNyZ2IgICAgICAgICAxICAg
ICAgMSAxICAgICAgICkiLCAiY29sb3Ioc3JnYiAxIDEgMSkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9u
KCJzUkdCIGNvbG9yIiwgImNvbG9yKHNyZ2IgMC4yNSAwLjUgMC43NSkiLCAiY29sb3Ioc3JnYiAw
LjI1IDAuNSAwLjc1KSIpOwordGVzdENvbG9yRnVuY3Rpb24oIkRpZmZlcmVudCBjYXNlIGZvciBz
UkdCIiwgImNvbG9yKFNyR2IgMC4yNSAwLjUgMC43NSkiLCAiY29sb3Ioc3JnYiAwLjI1IDAuNSAw
Ljc1KSIpOwordGVzdENvbG9yRnVuY3Rpb24oInNSR0IgY29sb3Igd2l0aCB1bm5lY2Vzc2FyeSBk
ZWNpbWFscyIsICJjb2xvcihzcmdiIDEuMDAwMDAgMC41MDAwMDAgMC4yMCkiLCAiY29sb3Ioc3Jn
YiAxIDAuNSAwLjIpIik7CisKK3Rlc3RDb2xvckZ1bmN0aW9uKCJzUkdCIHdoaXRlIHdpdGggMC41
IGFscGhhIiwgImNvbG9yKHNyZ2IgMSAxIDEgLyAwLjUpIiwgImNvbG9yKHNyZ2IgMSAxIDEgLyAw
LjUpIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigic1JHQiB3aGl0ZSB3aXRoIDAgYWxwaGEiLCAiY29s
b3Ioc3JnYiAxIDEgMSAvIDApIiwgImNvbG9yKHNyZ2IgMSAxIDEgLyAwKSIpOwordGVzdENvbG9y
RnVuY3Rpb24oInNSR0Igd2hpdGUgd2l0aCA1MCUgYWxwaGEiLCAiY29sb3Ioc3JnYiAxIDEgMSAv
IDUwJSkiLCAiY29sb3Ioc3JnYiAxIDEgMSAvIDAuNSkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJz
UkdCIHdoaXRlIHdpdGggMCUgYWxwaGEiLCAiY29sb3Ioc3JnYiAxIDEgMSAvIDAlKSIsICJjb2xv
cihzcmdiIDEgMSAxIC8gMCkiKTsKKwordGVzdENvbG9yRnVuY3Rpb24oIk9uZSBtaXNzaW5nIGNv
bXBvbmVudCBpcyAwIiwgImNvbG9yKHNyZ2IgMSAxKSIsICJjb2xvcihzcmdiIDEgMSAwKSIpOwor
dGVzdENvbG9yRnVuY3Rpb24oIlR3byBtaXNzaW5nIGNvbXBvbmVudHMgYXJlIDAiLCAiY29sb3Io
c3JnYiAxKSIsICJjb2xvcihzcmdiIDEgMCAwKSIpOwordGVzdENvbG9yRnVuY3Rpb24oIkFsbCBj
b21wb25lbnRzIG1pc3NpbmciLCAiY29sb3Ioc3JnYikiLCAiY29sb3Ioc3JnYiAwIDAgMCkiKTsK
KwordGVzdENvbG9yRnVuY3Rpb24oIkRpc3BsYXkgUDMgY29sb3IiLCAiY29sb3IoZGlzcGxheS1w
MyAwLjYgMC43IDAuOCkiLCAiY29sb3IoZGlzcGxheS1wMyAwLjYgMC43IDAuOCkiKTsKK3Rlc3RD
b2xvckZ1bmN0aW9uKCJEaWZmZXJlbnQgY2FzZSBmb3IgRGlzcGxheSBQMyIsICJjb2xvcihkSXNw
TGFZLVAzIDAuNiAwLjcgMC44KSIsICJjb2xvcihkaXNwbGF5LXAzIDAuNiAwLjcgMC44KSIpOwor
CitkZWJ1ZygiIik7CitkZWJ1ZygiIik7CitkZWJ1ZygiRmFsbGJhY2sgdGVzdHMuIikKK2RlYnVn
KCIiKTsKKwordGVzdENvbG9yRnVuY3Rpb24oIlVua25vd24gY29sb3Igc3BhY2Ugc2hvdWxkIGZh
bGxiYWNrIiwgImNvbG9yKHVua25vd24gMSAyIDMsIHJlZCkiLCAiY29sb3IodW5rbm93biAxIDIg
MywgcmVkKSIpOworCitkZWJ1ZygiIik7CitkZWJ1ZygiIik7CitkZWJ1ZygiQ2xhbXBpbmcgdGVz
dHMuIikKK2RlYnVnKCIiKTsKKworLy8gTk9URTogSWYgd2Ugc3RhcnQgc3VwcG9ydGluZyBleHRl
bmRlZC1yYW5nZSBzUkdCIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGtleXdvcmQsIHRoZXNlCisvLyB0
ZXN0cyBtYXkgZmFpbC4KK3Rlc3RDb2xvckZ1bmN0aW9uKCJzUkdCIGNvbG9yIHdpdGggbmVnYXRp
dmUgY29tcG9uZW50IHNob3VsZCBjbGFtcCB0byAwIiwgImNvbG9yKHNyZ2IgLTAuMjUgMC41IDAu
NzUpIiwgImNvbG9yKHNyZ2IgMCAwLjUgMC43NSkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJzUkdC
IGNvbG9yIHdpdGggY29tcG9uZW50ID4gMSBzaG91bGQgY2xhbXAiLCAiY29sb3Ioc3JnYiAwLjI1
IDEuNSAwLjc1KSIsICJjb2xvcihzcmdiIDAuMjUgMSAwLjc1KSIpOworCit0ZXN0Q29sb3JGdW5j
dGlvbigiRGlzcGxheSBQMyBjb2xvciB3aXRoIG5lZ2F0aXZlIGNvbXBvbmVudCBzaG91bGQgY2xh
bXAgdG8gMCIsICJjb2xvcihkaXNwbGF5LXAzIDAuNSAtMTk5IDAuNzUpIiwgImNvbG9yKGRpc3Bs
YXktcDMgMC41IDAgMC43NSkiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJEaXNwbGF5IFAzIGNvbG9y
IHdpdGggY29tcG9uZW50ID4gMSBzaG91bGQgY2xhbXAiLCAiY29sb3IoZGlzcGxheS1wMyAxODQg
MS4wMDAwMSAyMzQ3MzI5NzQ2NTg3KSIsICJjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSIpOworCit0
ZXN0Q29sb3JGdW5jdGlvbigiQWxwaGEgPiAxIHNob3VsZCBjbGFtcCIsICJjb2xvcihzcmdiIDAu
MSAwLjIgMC4zIC8gMS45KSIsICJjb2xvcihzcmdiIDAuMSAwLjIgMC4zKSIpOwordGVzdENvbG9y
RnVuY3Rpb24oIk5lZ2F0aXZlIGFscGhhIHNob3VsZCBjbGFtcCIsICJjb2xvcihzcmdiIDEgMSAx
IC8gLTAuMikiLCAiY29sb3Ioc3JnYiAxIDEgMSAvIDApIik7CisKK2RlYnVnKCIiKTsKK2RlYnVn
KCIiKTsKK2RlYnVnKCJJbnZhbGlkIHByb3BlcnR5IHZhbHVlIHRlc3RzLiIpCitkZWJ1ZygiIik7
CisKK3Rlc3RDb2xvckZ1bmN0aW9uKCJFbXB0eSIsICJjb2xvcigpIiwgIiIpOwordGVzdENvbG9y
RnVuY3Rpb24oIkJhZCBjb2xvciBzcGFjZSIsICJjb2xvcihiYW5hbmEgMSAxIDEpIiwgIiIpOwor
dGVzdENvbG9yRnVuY3Rpb24oIkJhZCBEaXNwbGF5IFAzIGNvbG9yIHNwYWNlIiwgImNvbG9yKGRp
c3BsYXlwMyAxIDEgMSkiLCAiIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigiTm8gY29sb3Igc3BhY2Ui
LCAiY29sb3IoMSAxIDEpIiwgIiIpOwordGVzdENvbG9yRnVuY3Rpb24oIlRvbyBtYW55IHBhcmFt
ZXRlcnMiLCAiY29sb3Ioc3JnYiAxIDEgMSAxKSIsICIiKTsKK3Rlc3RDb2xvckZ1bmN0aW9uKCJX
YXkgdG9vIG1hbnkgcGFyYW1ldGVycyIsICJjb2xvcihzcmdiIDEgMSAxIDEgMSkiLCAiIik7Cit0
ZXN0Q29sb3JGdW5jdGlvbigiQmFkIHBhcmFtZXRlcnMiLCAiY29sb3Ioc3JnYiAxIGVnZ3MgMSki
LCAiIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigiQmFkIGFscGhhIiwgImNvbG9yKHNyZ2IgMSAxIDEg
LyBiYWNvbikiLCAiIik7Cit0ZXN0Q29sb3JGdW5jdGlvbigiSnVuayBhZnRlciBhbHBoYSIsICJj
b2xvcihzcmdiIDEgMSAxIC8gMSBjdWN1bWJlcikiLCAiIik7CisKK2RlYnVnKCIiKTsKKworPC9z
Y3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9z
Y3JpcHQ+Cg==
</data>
<flag name="review"
          id="316124"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>