<?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>24021</bug_id>
          
          <creation_ts>2009-02-18 23:58:47 -0800</creation_ts>
          <short_desc>pseudo-element styles not accessible / retrievable via DOM methods</short_desc>
          <delta_ts>2010-04-19 18:01:21 -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>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://aetherworld.org/getComputedStyleTestcase.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>HasReduction</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Faruk Ates">farukates</reporter>
          <assigned_to name="Jessie Berlin">jberlin</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>jamesr</cc>
    
    <cc>jberlin</cc>
    
    <cc>mitz</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>110176</commentid>
    <comment_count>0</comment_count>
    <who name="Faruk Ates">farukates</who>
    <bug_when>2009-02-18 23:58:47 -0800</bug_when>
    <thetext>Applying styles to :before and :after pseudo-elements works, but retrieving said styles via DOM methods does not. There&apos;s no way to access them.

window.getComputedStyle(elem, pseudoElt); should allow you to specify the pseudo-element as the second param, but it has no effect in Webkit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110177</commentid>
    <comment_count>1</comment_count>
      <attachid>27779</attachid>
    <who name="Faruk Ates">farukates</who>
    <bug_when>2009-02-19 00:00:06 -0800</bug_when>
    <thetext>Created attachment 27779
Test case with 2 alerts showing style of element and pseudo-element

Testcase provided by Alexander Graf / http://twitter.com/aetherworld</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176405</commentid>
    <comment_count>2</comment_count>
      <attachid>45754</attachid>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-01-02 18:35:40 -0800</bug_when>
    <thetext>Created attachment 45754
A tentative idea for a fix that will expose the standard pseudo-elements through getComputedStyle

I would highly appreciate feedback on the general approach.

 As I write in the ChangeLog, there are several parts of this patch that I am mildly uncomfortable with:

        1) The need to duplicate the pseudo style string to pseudo style constant
           mapping that is done in CSSSelector::extractPseudoType(). I was unable
           to find a mapping between PseudoType and PseudoId and decided it made
           mores sense to map from the string itself to the PseudoId
        2) This patch won&apos;t give the desired results for the -webkit-scrollbar
           pseudo-elements.
        3) I am not sure that going directly to the renderer is correct. Looking
           in Element::computedStyle(), there seems to be an option for elements
           like HTMLOptionElement to not have renderers. I am not exactly sure
           why this is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176406</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-02 18:37:24 -0800</bug_when>
    <thetext>Attachment 45754 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/ChangeLog:43:  Line contains tab character.  [whitespace/tab] [5]
Total errors found: 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176407</commentid>
    <comment_count>4</comment_count>
      <attachid>45754</attachid>
    <who name="">mitz</who>
    <bug_when>2010-01-02 19:05:04 -0800</bug_when>
    <thetext>Comment on attachment 45754
A tentative idea for a fix that will expose the standard pseudo-elements through getComputedStyle

&gt;      if (renderer &amp;&amp; hasCompositedLayer(renderer) &amp;&amp; AnimationController::supportsAcceleratedAnimationOfProperty(static_cast&lt;CSSPropertyID&gt;(propertyID)))
&gt;          style = renderer-&gt;animation()-&gt;getAnimatedStyleForRenderer(renderer);
&gt; -    else
&gt; -       style = node-&gt;computedStyle();
&gt; +    else {
&gt; +        style = node-&gt;computedStyle();
&gt; +        if (m_pseudoStyle != NOPSEUDO)
&gt; +            style = node-&gt;renderer()-&gt;getCachedPseudoStyle(m_pseudoStyle);

Note that this code accessing node-&gt;renderer() is in the else clause of “if (renderer &amp;&amp; …”. One common way that the renderer can be null is if the node has (or descends from an element that has) &apos;display: none;&apos;. It looks like in the pseudo-element case, you are calling Node::computedStyle() only to throw away the result. Is there a side effect to calling computedStyle() that you are trying to achieve?

For several properties, the code that follows in this method gets the computed value from the renderer, if there is one (e.g. CSSPropertyHeight). In order for this code to return the correct result, you should set &apos;renderer&apos; to the renderer of the pseudo-element in question. For example, consider

&lt;style&gt;
    div { height: 100px; }
    div:before { display: block; height: 20px; content: &quot;Before&quot;; }
&lt;/style&gt;
&lt;div id=&quot;target&quot;&gt;&lt;/div&gt;

You want getComputedStyle(document.getElementById(&quot;target&quot;), &quot;:before&quot;).height to be &quot;20px&quot;, not &quot;100px&quot;.

&gt; +    DEFINE_STATIC_LOCAL(AtomicString, after, (&quot;:after&quot;));
…
&gt; +    DEFINE_STATIC_LOCAL(AtomicString, sliderThumb, (&quot;:-webkit-slider-thumb&quot;));
&gt; +
&gt; +    if (value == after)
&gt; +        return AFTER;
…
&gt; +    if (value == sliderThumb)
&gt; +        return SLIDER_THUMB;

Maybe there is a way to leverage existing code to do this, but if there isn’t, perhaps a HashMap&lt;AtomicStringImpl*, PseudoId&gt; would be better?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178428</commentid>
    <comment_count>5</comment_count>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-01-07 16:05:27 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 45754 [details])
&gt; &gt;      if (renderer &amp;&amp; hasCompositedLayer(renderer) &amp;&amp; AnimationController::supportsAcceleratedAnimationOfProperty(static_cast&lt;CSSPropertyID&gt;(propertyID)))
&gt; &gt;          style = renderer-&gt;animation()-&gt;getAnimatedStyleForRenderer(renderer);
&gt; &gt; -    else
&gt; &gt; -       style = node-&gt;computedStyle();
&gt; &gt; +    else {
&gt; &gt; +        style = node-&gt;computedStyle();
&gt; &gt; +        if (m_pseudoStyle != NOPSEUDO)
&gt; &gt; +            style = node-&gt;renderer()-&gt;getCachedPseudoStyle(m_pseudoStyle);
&gt; 
&gt; Note that this code accessing node-&gt;renderer() is in the else clause of “if
&gt; (renderer &amp;&amp; …”. One common way that the renderer can be null is if the node
&gt; has (or descends from an element that has) &apos;display: none;&apos;.

I wrongly assumed that getComputedStyle would not need to work when display was none. Rethinking that.

&gt; It looks like in
&gt; the pseudo-element case, you are calling Node::computedStyle() only to throw
&gt; away the result. Is there a side effect to calling computedStyle() that you are
&gt; trying to achieve?

No, calling it only to throw away the result was a mistake. It should have been guarded with an if statement.

&gt; 
&gt; For several properties, the code that follows in this method gets the computed
&gt; value from the renderer, if there is one (e.g. CSSPropertyHeight). In order for
&gt; this code to return the correct result, you should set &apos;renderer&apos; to the
&gt; renderer of the pseudo-element in question. 

Is there a way to access the &apos;renderer&apos; of the pseudo-element? Since there aren&apos;t actual renderers for the pseudo-elements (correct me if I am wrong) why would the RenderStyle that is returned by the getCachedPseudoStyle or getUncachedPseudosStyle for the RenderObject of the element not be the correct style?

&gt; For example, consider
&gt; 
&gt; &lt;style&gt;
&gt;     div { height: 100px; }
&gt;     div:before { display: block; height: 20px; content: &quot;Before&quot;; }
&gt; &lt;/style&gt;
&gt; &lt;div id=&quot;target&quot;&gt;&lt;/div&gt;
&gt; 
&gt; You want getComputedStyle(document.getElementById(&quot;target&quot;), &quot;:before&quot;).height
&gt; to be &quot;20px&quot;, not &quot;100px&quot;.
&gt; 

Question about this. The method I was using doesn&apos;t work for height, but it does work for color (set color to blue in div { ... } and red in div:before { ... } and the getComputedStyle(document.getElementById(&quot;target&quot;), &quot;:before&quot;).color will report blue. Why would there be RenderStyle that has the color of the psuedo-element but the height of the element?

&gt; &gt; +    DEFINE_STATIC_LOCAL(AtomicString, after, (&quot;:after&quot;));
&gt; …
&gt; &gt; +    DEFINE_STATIC_LOCAL(AtomicString, sliderThumb, (&quot;:-webkit-slider-thumb&quot;));
&gt; &gt; +
&gt; &gt; +    if (value == after)
&gt; &gt; +        return AFTER;
&gt; …
&gt; &gt; +    if (value == sliderThumb)
&gt; &gt; +        return SLIDER_THUMB;
&gt; 
&gt; Maybe there is a way to leverage existing code to do this, but if there isn’t,
&gt; perhaps a HashMap&lt;AtomicStringImpl*, PseudoId&gt; would be better?

Ok.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178431</commentid>
    <comment_count>6</comment_count>
      <attachid>45754</attachid>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-01-07 16:07:27 -0800</bug_when>
    <thetext>Comment on attachment 45754
A tentative idea for a fix that will expose the standard pseudo-elements through getComputedStyle

(rethinking approach)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179117</commentid>
    <comment_count>7</comment_count>
    <who name="">mitz</who>
    <bug_when>2010-01-09 20:41:47 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; (From update of attachment 45754 [details] [details])
&gt; &gt; &gt;      if (renderer &amp;&amp; hasCompositedLayer(renderer) &amp;&amp; AnimationController::supportsAcceleratedAnimationOfProperty(static_cast&lt;CSSPropertyID&gt;(propertyID)))
&gt; &gt; &gt;          style = renderer-&gt;animation()-&gt;getAnimatedStyleForRenderer(renderer);
&gt; &gt; &gt; -    else
&gt; &gt; &gt; -       style = node-&gt;computedStyle();
&gt; &gt; &gt; +    else {
&gt; &gt; &gt; +        style = node-&gt;computedStyle();
&gt; &gt; &gt; +        if (m_pseudoStyle != NOPSEUDO)
&gt; &gt; &gt; +            style = node-&gt;renderer()-&gt;getCachedPseudoStyle(m_pseudoStyle);
&gt; &gt; 
&gt; &gt; Note that this code accessing node-&gt;renderer() is in the else clause of “if
&gt; &gt; (renderer &amp;&amp; …”. One common way that the renderer can be null is if the node
&gt; &gt; has (or descends from an element that has) &apos;display: none;&apos;.
&gt; 
&gt; I wrongly assumed that getComputedStyle would not need to work when display was
&gt; none. Rethinking that.

For actual elements, it works (there is no renderer, but style resolution is still possible; this was required for compatibility with Firefox). For pseudo-elements, you can start by implementing it only for displayed elements. Maybe see what other browsers do in this case.

&gt; &gt; For several properties, the code that follows in this method gets the computed
&gt; &gt; value from the renderer, if there is one (e.g. CSSPropertyHeight). In order for
&gt; &gt; this code to return the correct result, you should set &apos;renderer&apos; to the
&gt; &gt; renderer of the pseudo-element in question. 
&gt; 
&gt; Is there a way to access the &apos;renderer&apos; of the pseudo-element?

There is no general mechanism for doing that. For each pseudo-element, the relevant (actual element) renderer obviously knows how to get to the pseudo-element renderer, if there is one. For :before and :after content, for example, or for :-webkit-file-upload-button, there is one. For :first-line, there isn’t.

&gt; Since there
&gt; aren&apos;t actual renderers for the pseudo-elements (correct me if I am wrong) why
&gt; would the RenderStyle that is returned by the getCachedPseudoStyle or
&gt; getUncachedPseudosStyle for the RenderObject of the element not be the correct
&gt; style?

The difference between returning values from the RenderStyle and returning values from the renderer is only for length properties that can be &apos;auto&apos;, percentages or relative; in that case, only the renderer, having been laid out, knows the actual computed pixel value. In my example from comment #5, if the rule for div:before specified &quot;height: 20%;&quot;, you would still want the computed style to be &quot;20px&quot;, not &quot;20%&quot;.

&gt; &gt; For example, consider
&gt; &gt; 
&gt; &gt; &lt;style&gt;
&gt; &gt;     div { height: 100px; }
&gt; &gt;     div:before { display: block; height: 20px; content: &quot;Before&quot;; }
&gt; &gt; &lt;/style&gt;
&gt; &gt; &lt;div id=&quot;target&quot;&gt;&lt;/div&gt;
&gt; &gt; 
&gt; &gt; You want getComputedStyle(document.getElementById(&quot;target&quot;), &quot;:before&quot;).height
&gt; &gt; to be &quot;20px&quot;, not &quot;100px&quot;.
&gt; &gt; 
&gt; 
&gt; Question about this. The method I was using doesn&apos;t work for height, but it
&gt; does work for color (set color to blue in div { ... } and red in div:before {
&gt; ... } and the getComputedStyle(document.getElementById(&quot;target&quot;),
&gt; &quot;:before&quot;).color will report blue. Why would there be RenderStyle that has the
&gt; color of the psuedo-element but the height of the element?

The RenderStyle would have the height of the pseudo-element, as a (possibly auto, relative or percent) length, but in your patch, we would return a pixel value taken from the &apos;renderer&apos; variable, which was the renderer for the (actual) element, and hence it would be &quot;100px&quot;.

Just setting renderer to 0 (and thus returning all values from the RenderStyle) in the pseudo-element case would be a good start. You could figure out how to get the renderer for the various pseudo-elements later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183639</commentid>
    <comment_count>8</comment_count>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-01-22 07:25:11 -0800</bug_when>
    <thetext>Sorry for the late reply on this.

(In reply to comment #7)
&gt; (In reply to comment #5)
&gt; &gt; (In reply to comment #4)
&gt; &gt; &gt; (From update of attachment 45754 [details] [details] [details])
&gt; &gt; &gt; &gt;      if (renderer &amp;&amp; hasCompositedLayer(renderer) &amp;&amp; AnimationController::supportsAcceleratedAnimationOfProperty(static_cast&lt;CSSPropertyID&gt;(propertyID)))
&gt; &gt; &gt; &gt;          style = renderer-&gt;animation()-&gt;getAnimatedStyleForRenderer(renderer);
&gt; &gt; &gt; &gt; -    else
&gt; &gt; &gt; &gt; -       style = node-&gt;computedStyle();
&gt; &gt; &gt; &gt; +    else {
&gt; &gt; &gt; &gt; +        style = node-&gt;computedStyle();
&gt; &gt; &gt; &gt; +        if (m_pseudoStyle != NOPSEUDO)
&gt; &gt; &gt; &gt; +            style = node-&gt;renderer()-&gt;getCachedPseudoStyle(m_pseudoStyle);
&gt; &gt; &gt; 
&gt; &gt; &gt; Note that this code accessing node-&gt;renderer() is in the else clause of “if
&gt; &gt; &gt; (renderer &amp;&amp; …”. One common way that the renderer can be null is if the node
&gt; &gt; &gt; has (or descends from an element that has) &apos;display: none;&apos;.
&gt; &gt; 
&gt; &gt; I wrongly assumed that getComputedStyle would not need to work when display was
&gt; &gt; none. Rethinking that.
&gt; 
&gt; For actual elements, it works (there is no renderer, but style resolution is
&gt; still possible; this was required for compatibility with Firefox). For
&gt; pseudo-elements, you can start by implementing it only for displayed elements.
&gt; Maybe see what other browsers do in this case.

I will take your advice here and start by trying to implement it only for displayed elements.

&gt; 
&gt; &gt; &gt; For several properties, the code that follows in this method gets the computed
&gt; &gt; &gt; value from the renderer, if there is one (e.g. CSSPropertyHeight). In order for
&gt; &gt; &gt; this code to return the correct result, you should set &apos;renderer&apos; to the
&gt; &gt; &gt; renderer of the pseudo-element in question. 
&gt; &gt; 
&gt; &gt; Is there a way to access the &apos;renderer&apos; of the pseudo-element?
&gt; 
&gt; There is no general mechanism for doing that. For each pseudo-element, the
&gt; relevant (actual element) renderer obviously knows how to get to the
&gt; pseudo-element renderer, if there is one. For :before and :after content, for
&gt; example, or for :-webkit-file-upload-button, there is one. For :first-line,
&gt; there isn’t.

I can see throughout the code that there are these special cases for FIRST_LINE and FIRST_LINE_INHERITED. Why is this?

&gt; 
&gt; &gt; Since there
&gt; &gt; aren&apos;t actual renderers for the pseudo-elements (correct me if I am wrong) why
&gt; &gt; would the RenderStyle that is returned by the getCachedPseudoStyle or
&gt; &gt; getUncachedPseudosStyle for the RenderObject of the element not be the correct
&gt; &gt; style?
&gt; 
&gt; The difference between returning values from the RenderStyle and returning
&gt; values from the renderer is only for length properties that can be &apos;auto&apos;,
&gt; percentages or relative; in that case, only the renderer, having been laid out,
&gt; knows the actual computed pixel value. In my example from comment #5, if the
&gt; rule for div:before specified &quot;height: 20%;&quot;, you would still want the computed
&gt; style to be &quot;20px&quot;, not &quot;20%&quot;.

Interestingly, Firefox gets this incorrect as well (returns 100px in the case below).

&gt; 
&gt; &gt; &gt; For example, consider
&gt; &gt; &gt; 
&gt; &gt; &gt; &lt;style&gt;
&gt; &gt; &gt;     div { height: 100px; }
&gt; &gt; &gt;     div:before { display: block; height: 20px; content: &quot;Before&quot;; }
&gt; &gt; &gt; &lt;/style&gt;
&gt; &gt; &gt; &lt;div id=&quot;target&quot;&gt;&lt;/div&gt;
&gt; &gt; &gt; 
&gt; &gt; &gt; You want getComputedStyle(document.getElementById(&quot;target&quot;), &quot;:before&quot;).height
&gt; &gt; &gt; to be &quot;20px&quot;, not &quot;100px&quot;.
&gt; &gt; &gt; 
&gt; &gt; 
&gt; &gt; Question about this. The method I was using doesn&apos;t work for height, but it
&gt; &gt; does work for color (set color to blue in div { ... } and red in div:before {
&gt; &gt; ... } and the getComputedStyle(document.getElementById(&quot;target&quot;),
&gt; &gt; &quot;:before&quot;).color will report blue. Why would there be RenderStyle that has the
&gt; &gt; color of the psuedo-element but the height of the element?
&gt; 
&gt; The RenderStyle would have the height of the pseudo-element, as a (possibly
&gt; auto, relative or percent) length, but in your patch, we would return a pixel
&gt; value taken from the &apos;renderer&apos; variable, which was the renderer for the
&gt; (actual) element, and hence it would be &quot;100px&quot;.
&gt; 
&gt; Just setting renderer to 0 (and thus returning all values from the RenderStyle)
&gt; in the pseudo-element case would be a good start. You could figure out how to
&gt; get the renderer for the various pseudo-elements later.

When you mean setting the renderer to 0, are you referring to simply getting the RenderStyle from the Element and asking that RenderStyle for the cached pseudo style? That still gets the height wrong.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196947</commentid>
    <comment_count>9</comment_count>
      <attachid>50157</attachid>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-03-06 16:28:49 -0800</bug_when>
    <thetext>Created attachment 50157
First steps towards exposing the standard pseudo-elements through getComputedStyle

Following Dan&apos;s suggestion in comment #7 to start by just using the cached Pseudo Style returned from the RenderStyle of the element on which the pseudo-element is defined.

I am currently investigating how to get the renderer for the pseudo-element so as to get the &apos;length&apos; properties correct. Is there any point at which a render style is created for a pseudo-element with the correct &apos;length&apos; properties? Even explicitly using the renderer()-&gt;firstLineStyle() does not return a RenderStyle with the correct &apos;length&apos; properties (testing with height), so I am wondering if the correct RenderStyle is ever created ...

Preliminary (but not thorough) testing indicates that this patch returns the same &apos;length&apos; properties as Firefox does.

For the &apos;:selection&apos; pseudo-element, getting the cached Pseudo Style directly from the renderer of the element on which the pseudo-element is defined seems to work for properties like color, but still does not work for &apos;length&apos; properties.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199412</commentid>
    <comment_count>10</comment_count>
      <attachid>50157</attachid>
    <who name="">mitz</who>
    <bug_when>2010-03-13 14:23:48 -0800</bug_when>
    <thetext>Comment on attachment 50157
First steps towards exposing the standard pseudo-elements through getComputedStyle

I think it would be better to factor out existing code that maps from the pseudo-element strings to PseudoTypes (you’ll just need to strip the one or two leading colons), and similarly share the code that maps PseudoType to PseudoId in checkOneSelector.

Seems like CSSComputedStyleDeclaration::getPseudoId() should not be exposed outside CSSComputedStyleDeclaration.cpp. The one call site can just pass the string, and the CSSComputedStyleDeclaration constructor could do the mapping (using the aforementioned refactored code) internally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199769</commentid>
    <comment_count>11</comment_count>
      <attachid>50157</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-15 13:01:01 -0700</bug_when>
    <thetext>Comment on attachment 50157
First steps towards exposing the standard pseudo-elements through getComputedStyle

Mitz&apos;s comment sounds like an r-.  Please feel free to reset the flags if I&apos;ve misinterpreted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199837</commentid>
    <comment_count>12</comment_count>
      <attachid>50741</attachid>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-03-15 14:36:47 -0700</bug_when>
    <thetext>Created attachment 50741
First steps towards exposing the standard pseudo-elements through getComputedStyle (refactor maps among Strings, PseudoTypes, and PseudoIds)

Refactored the map between PseudoTypes and PseudoIds as Dan suggested so that CSSSelector and CSSComputedStyleDeclaration both use the same mechanism for mapping between strings and PseudoTypes (pseudoTypeFromString) and CSSStyleSelector and CSSComputedStyleDeclaration both use the same mechanism for mapping between PseudoTypes and PseudoIds (pseudoIdFromPseudoType).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200247</commentid>
    <comment_count>13</comment_count>
      <attachid>50741</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-16 09:21:23 -0700</bug_when>
    <thetext>Comment on attachment 50741
First steps towards exposing the standard pseudo-elements through getComputedStyle (refactor maps among Strings, PseudoTypes, and PseudoIds)

Looks really good!

&gt; -CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr&lt;Node&gt; n)
&gt; +CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr&lt;Node&gt; n, const String&amp; pseudoElt)

The two things I don&apos;t like about the name &quot;pseudoElt&quot;.

    1) It has an abbreviation, &quot;elt&quot;, in the name.
    2) The string is not a pseudo element. It&apos;s the name of a pseudo element or a specifier for a pseudo element. So it&apos;s not ideal to name it &quot;pseudo element&quot;. Same comment about m_pseudoElt.

&gt; +    unsigned startPseudoEltName = 0;
&gt; +    if (pseudoElt.startsWith(&quot;::&quot;))
&gt; +        startPseudoEltName = 2;
&gt; +    else if (pseudoElt.startsWith(&quot;:&quot;))
&gt; +        startPseudoEltName = 1;

There is a slightly more efficient way to do this. Since String indexing already does range checking, you can just check characters:

    unsigned nameStart = pseudoElementSpecifier[0] == &apos;:&apos; ? (pseudoElementSpecifier[1] == &apos;:&apos; ? 2 : 1) : 0;

You could also do the same thing with if statements. I think it&apos;s slightly better to use array indexing and characters than startsWith and C-style strings.

&gt; +    m_pseudoElt = CSSSelector::pseudoIdFromPseudoType(CSSSelector::pseudoTypeFromString(
&gt; +        AtomicString(pseudoElt.substring(startPseudoEltName))));
&gt; +
&gt;  }

Extra blank line here.

&gt;      if (renderer &amp;&amp; hasCompositedLayer(renderer) &amp;&amp; AnimationController::supportsAcceleratedAnimationOfProperty(static_cast&lt;CSSPropertyID&gt;(propertyID)))
&gt;          style = renderer-&gt;animation()-&gt;getAnimatedStyleForRenderer(renderer);
&gt;      else
&gt; -       style = node-&gt;computedStyle();
&gt; +        style = node-&gt;computedStyle(m_pseudoElt);

Is it really OK to ignore m_psuedoElt on the AnimationController side of this if statement? If not, could we construct a test case to demonstrate why that&apos;s not OK?

&gt; +    static PseudoId getPseudoId(const AtomicString&amp; value);

In WebKit code, we reserve &quot;get&quot; for functions with out arguments. We don&apos;t use it for getters that return a value. Those we name with nouns or adjectives instead. The name &quot;value&quot; doesn&apos;t add much here. I think we need to get clearer on our terminology. What are the strings that specify different pseudo elements called?

Then I noticed this declaration is for a function that you actually didn&apos;t end up defining. Oops! Please remove it.

&gt; +PseudoId CSSSelector::pseudoIdFromPseudoType(PseudoType pseudoType)

I think the local variable can just have the name &quot;type&quot;. Once you&apos;ve said pseudo in pseudoId, I don&apos;t think you have to repeat it.

&gt; +    case PseudoUnknown:
&gt; +    case PseudoNotParsed:
&gt; +    default:
&gt; +        return NOPSEUDO;
&gt; +    }

It would be better to omit the default case and have an ASSERT_NOT_REACHED outside the switch statement for two reasons:

    1) If we do that, gcc will warn if we add a new pseudo type and forget to add a case to the switch statement.

    2) If the passed-in type is an illegal value, then we&apos;ll see an assert at runtime, which could help us track down a bug.

We can still return NOPSEUDO and so have the same behavior in a release build.

&gt; +    static HashMap&lt;AtomicStringImpl*, PseudoType&gt;* valueToPseudoType = 0;
&gt; +    if (!valueToPseudoType) {
&gt; +        valueToPseudoType = new HashMap&lt;AtomicStringImpl*, PseudoType&gt;;
&gt; +        valueToPseudoType-&gt;set(active.impl(), PseudoActive);
&gt; +        valueToPseudoType-&gt;set(after.impl(), PseudoAfter);
&gt; +        valueToPseudoType-&gt;set(anyLink.impl(), PseudoAnyLink);
&gt; +        valueToPseudoType-&gt;set(autofill.impl(), PseudoAutofill);
&gt; +        valueToPseudoType-&gt;set(before.impl(), PseudoBefore);
&gt; +        valueToPseudoType-&gt;set(checked.impl(), PseudoChecked);
&gt; +        valueToPseudoType-&gt;set(fileUploadButton.impl(), PseudoFileUploadButton);
&gt; +        valueToPseudoType-&gt;set(defaultString.impl(), PseudoDefault);
&gt; +        valueToPseudoType-&gt;set(disabled.impl(), PseudoDisabled);
&gt; +        valueToPseudoType-&gt;set(readOnly.impl(), PseudoReadOnly);
&gt; +        valueToPseudoType-&gt;set(readWrite.impl(), PseudoReadWrite);
&gt; +        valueToPseudoType-&gt;set(valid.impl(), PseudoValid);
&gt; +        valueToPseudoType-&gt;set(invalid.impl(), PseudoInvalid);
&gt; +        valueToPseudoType-&gt;set(drag.impl(), PseudoDrag);
&gt; +        valueToPseudoType-&gt;set(dragAlias.impl(), PseudoDrag);
&gt; +        valueToPseudoType-&gt;set(enabled.impl(), PseudoEnabled);
&gt; +        valueToPseudoType-&gt;set(empty.impl(), PseudoEmpty);
&gt; +        valueToPseudoType-&gt;set(firstChild.impl(), PseudoFirstChild);
&gt; +        valueToPseudoType-&gt;set(fullPageMedia.impl(), PseudoFullPageMedia);
&gt; +#if ENABLE(DATALIST)
&gt; +        valueToPseudoType-&gt;set(inputListButton.impl(), PseudoInputListButton);
&gt; +#endif
&gt; +        valueToPseudoType-&gt;set(inputPlaceholder.impl(), PseudoInputPlaceholder);
&gt; +        valueToPseudoType-&gt;set(lastChild.impl(), PseudoLastChild);
&gt; +        valueToPseudoType-&gt;set(lastOfType.impl(), PseudoLastOfType);
&gt; +        valueToPseudoType-&gt;set(onlyChild.impl(), PseudoOnlyChild);
&gt; +        valueToPseudoType-&gt;set(onlyOfType.impl(), PseudoOnlyOfType);
&gt; +        valueToPseudoType-&gt;set(firstLetter.impl(), PseudoFirstLetter);
&gt; +        valueToPseudoType-&gt;set(firstLine.impl(), PseudoFirstLine);
&gt; +        valueToPseudoType-&gt;set(firstOfType.impl(), PseudoFirstOfType);
&gt; +        valueToPseudoType-&gt;set(focus.impl(), PseudoFocus);
&gt; +        valueToPseudoType-&gt;set(hover.impl(), PseudoHover);
&gt; +        valueToPseudoType-&gt;set(indeterminate.impl(), PseudoIndeterminate);
&gt; +        valueToPseudoType-&gt;set(innerSpinButton.impl(), PseudoInnerSpinButton);
&gt; +        valueToPseudoType-&gt;set(link.impl(), PseudoLink);
&gt; +        valueToPseudoType-&gt;set(lang.impl(), PseudoLang);
&gt; +        valueToPseudoType-&gt;set(mediaControlsPanel.impl(), PseudoMediaControlsPanel);
&gt; +        valueToPseudoType-&gt;set(mediaControlsMuteButton.impl(), PseudoMediaControlsMuteButton);
&gt; +        valueToPseudoType-&gt;set(mediaControlsPlayButton.impl(), PseudoMediaControlsPlayButton);
&gt; +        valueToPseudoType-&gt;set(mediaControlsCurrentTimeDisplay.impl(), PseudoMediaControlsCurrentTimeDisplay);
&gt; +        valueToPseudoType-&gt;set(mediaControlsTimeRemainingDisplay.impl(), PseudoMediaControlsTimeRemainingDisplay);
&gt; +        valueToPseudoType-&gt;set(mediaControlsTimeline.impl(), PseudoMediaControlsTimeline);
&gt; +        valueToPseudoType-&gt;set(mediaControlsVolumeSlider.impl(), PseudoMediaControlsVolumeSlider);
&gt; +        valueToPseudoType-&gt;set(mediaControlsSeekBackButton.impl(), PseudoMediaControlsSeekBackButton);
&gt; +        valueToPseudoType-&gt;set(mediaControlsSeekForwardButton.impl(), PseudoMediaControlsSeekForwardButton);
&gt; +        valueToPseudoType-&gt;set(mediaControlsRewindButton.impl(), PseudoMediaControlsRewindButton);
&gt; +        valueToPseudoType-&gt;set(mediaControlsReturnToRealtimeButton.impl(), PseudoMediaControlsReturnToRealtimeButton);
&gt; +        valueToPseudoType-&gt;set(mediaControlsToggleClosedCaptionsButton.impl(), PseudoMediaControlsToggleClosedCaptions);
&gt; +        valueToPseudoType-&gt;set(mediaControlsStatusDisplay.impl(), PseudoMediaControlsStatusDisplay);
&gt; +        valueToPseudoType-&gt;set(mediaControlsFullscreenButton.impl(), PseudoMediaControlsFullscreenButton);
&gt; +        valueToPseudoType-&gt;set(mediaControlsTimelineContainer.impl(), PseudoMediaControlsTimelineContainer);
&gt; +        valueToPseudoType-&gt;set(mediaControlsVolumeSliderContainer.impl(), PseudoMediaControlsVolumeSliderContainer);
&gt; +        valueToPseudoType-&gt;set(notStr.impl(), PseudoNot);
&gt; +        valueToPseudoType-&gt;set(nthChild.impl(), PseudoNthChild);
&gt; +        valueToPseudoType-&gt;set(nthOfType.impl(), PseudoNthOfType);
&gt; +        valueToPseudoType-&gt;set(nthLastChild.impl(), PseudoNthLastChild);
&gt; +        valueToPseudoType-&gt;set(nthLastOfType.impl(), PseudoNthLastOfType);
&gt; +        valueToPseudoType-&gt;set(outerSpinButton.impl(), PseudoOuterSpinButton);
&gt; +        valueToPseudoType-&gt;set(root.impl(), PseudoRoot);
&gt; +        valueToPseudoType-&gt;set(windowInactive.impl(), PseudoWindowInactive);
&gt; +        valueToPseudoType-&gt;set(decrement.impl(), PseudoDecrement);
&gt; +        valueToPseudoType-&gt;set(increment.impl(), PseudoIncrement);
&gt; +        valueToPseudoType-&gt;set(start.impl(), PseudoStart);
&gt; +        valueToPseudoType-&gt;set(end.impl(), PseudoEnd);
&gt; +        valueToPseudoType-&gt;set(horizontal.impl(), PseudoHorizontal);
&gt; +        valueToPseudoType-&gt;set(vertical.impl(), PseudoVertical);
&gt; +        valueToPseudoType-&gt;set(doubleButton.impl(), PseudoDoubleButton);
&gt; +        valueToPseudoType-&gt;set(singleButton.impl(), PseudoSingleButton);
&gt; +        valueToPseudoType-&gt;set(noButton.impl(), PseudoNoButton);
&gt; +        valueToPseudoType-&gt;set(optional.impl(), PseudoOptional);
&gt; +        valueToPseudoType-&gt;set(required.impl(), PseudoRequired);
&gt; +        valueToPseudoType-&gt;set(resizer.impl(), PseudoResizer);
&gt; +        valueToPseudoType-&gt;set(scrollbar.impl(), PseudoScrollbar);
&gt; +        valueToPseudoType-&gt;set(scrollbarButton.impl(), PseudoScrollbarButton);
&gt; +        valueToPseudoType-&gt;set(scrollbarCorner.impl(), PseudoScrollbarCorner);
&gt; +        valueToPseudoType-&gt;set(scrollbarThumb.impl(), PseudoScrollbarThumb);
&gt; +        valueToPseudoType-&gt;set(scrollbarTrack.impl(), PseudoScrollbarTrack);
&gt; +        valueToPseudoType-&gt;set(scrollbarTrackPiece.impl(), PseudoScrollbarTrackPiece);
&gt; +        valueToPseudoType-&gt;set(cornerPresent.impl(), PseudoCornerPresent);
&gt; +        valueToPseudoType-&gt;set(searchCancelButton.impl(), PseudoSearchCancelButton);
&gt; +        valueToPseudoType-&gt;set(searchDecoration.impl(), PseudoSearchDecoration);
&gt; +        valueToPseudoType-&gt;set(searchResultsDecoration.impl(), PseudoSearchResultsDecoration);
&gt; +        valueToPseudoType-&gt;set(searchResultsButton.impl(), PseudoSearchResultsButton);
&gt; +        valueToPseudoType-&gt;set(selection.impl(), PseudoSelection);
&gt; +        valueToPseudoType-&gt;set(sliderThumb.impl(), PseudoSliderThumb);
&gt; +        valueToPseudoType-&gt;set(target.impl(), PseudoTarget);
&gt; +        valueToPseudoType-&gt;set(visited.impl(), PseudoVisited);
&gt; +    }

I sugget putting the code that populates the map into a separate function. It’s inelegant to have it here in the middle of the function that does the work after the map is built.

&gt; +    if (valueToPseudoType-&gt;contains(value.impl()))
&gt; +        return valueToPseudoType-&gt;get(value.impl());
&gt; +    return PseudoUnknown;

This does two hash map lookups but should only do one. Since PseudoUnknown is not a 0 value, you have to write it with iterators:

    HashMap&lt;AtomicStringImpl*, PseudoType&gt;::iterator slot = valueToPseudoType-&gt;get(value.impl());
    return slot == valueToPseudoType-&gt;end() ? PseudoUnknown : slot-&gt;second;

Not as easy to read, but twice as fast.

&gt; +    default:
&gt; +        break;
&gt; +    }

Again, I think it&apos;s better to not have a default here, and instead list the other pseudo types with explicit cases so we get warnings if we forget to add a new type here.

&gt; +        static PseudoType pseudoTypeFromString(const AtomicString&amp;);
&gt; +        static PseudoId pseudoIdFromPseudoType(PseudoType);

Given that this is C++ and we support overloading, I&apos;m not sure these function names need the &quot;from type&quot; suffixes. I don&apos;t have better names to suggest right away. For example pseudoTypeFromString might be better named something like parsePseudoTypeName. And it might be OK to name pseudoIdFromPseudoType just pseudoId.

&gt; +        PseudoId pseudoId = CSSSelector::pseudoIdFromPseudoType(sel-&gt;pseudoType());
&gt; +        if (pseudoId == FIRST_LETTER)
&gt; +            if (Document* doc = e-&gt;document())
&gt; +                doc-&gt;setUsesFirstLetterRules(true);

Please use &quot;document&quot; instead of &quot;doc&quot;.

Please use braces around multiple line if bodies. The outer one here is multiple lines long and so needs braces.

&gt; -    virtual RenderStyle* computedStyle();
&gt; +    virtual RenderStyle* computedStyle(PseudoId pseudoElt = NOPSEUDO);

I suggest omitting the argument name here.

&gt; -    virtual RenderStyle* computedStyle();
&gt; +    virtual RenderStyle* computedStyle(PseudoId pseudoElt = NOPSEUDO);

And here.

If it&apos;s at all common to call computedStyle on Element, we could speed things up by making it so that it&apos;s a non-virtual function call. The technique used for functions like prefix can be used for computedStyle to make a virtual one in the Node class and a non-virtual one in the Element class that have the same name and look the same at the call site, yet more efficient in the class Element.

&gt; -PassRefPtr&lt;CSSStyleDeclaration&gt; DOMWindow::getComputedStyle(Element* elt, const String&amp;) const
&gt; +PassRefPtr&lt;CSSStyleDeclaration&gt; DOMWindow::getComputedStyle(Element* elt, const String&amp; pseudoElt) const
&gt;  {
&gt;      if (!elt)
&gt;          return 0;
&gt;  
&gt; -    // FIXME: This needs take pseudo elements into account.
&gt; -    return computedStyle(elt);
&gt; +    return computedStyle(elt, pseudoElt);
&gt;  }

As long as you&apos;re touching this it would be good to get rid of the &quot;elt&quot; abbreviation. See also my comments above about the pseudoElt name.

Most of my comments are minor, but a few are important enough that I think I&apos;ll say review-</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202297</commentid>
    <comment_count>14</comment_count>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-03-21 10:59:34 -0700</bug_when>
    <thetext>Sorry it took me so long to get back on this. My comments below reflect the changes I made in the patch that I will be posting momentarily.

(In reply to comment #13)
&gt; (From update of attachment 50741 [details])
&gt; Looks really good!

Thanks for looking at this :)

&gt; 
&gt; &gt; -CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr&lt;Node&gt; n)
&gt; &gt; +CSSComputedStyleDeclaration::CSSComputedStyleDeclaration(PassRefPtr&lt;Node&gt; n, const String&amp; pseudoElt)
&gt; 
&gt; The two things I don&apos;t like about the name &quot;pseudoElt&quot;.
&gt; 
&gt;     1) It has an abbreviation, &quot;elt&quot;, in the name.
&gt;     2) The string is not a pseudo element. It&apos;s the name of a pseudo element or
&gt; a specifier for a pseudo element. So it&apos;s not ideal to name it &quot;pseudo
&gt; element&quot;. Same comment about m_pseudoElt.

I was trying to come up with a naming convention to span all uses, and here is what I ended up with:

1. Strings like &quot;first-letter&quot;, &quot;:first-letter&quot; or &quot;::first-letter&quot; are names, the first because it really is the name, and the latter two because in the spec, the pseudo-elements are referred to like &apos;the &quot;:first-letter&quot; pseudo-element&apos;.
2. A member variable that refers to PseudoId for the pseudo-element is a specifier because it specifies which of the possible pseudo-elements is being applied to the element.

so the above m_pseudoElt becomes m_pseudoElementSpecifier.

Does that work?

&gt; 
&gt; &gt; +    unsigned startPseudoEltName = 0;
&gt; &gt; +    if (pseudoElt.startsWith(&quot;::&quot;))
&gt; &gt; +        startPseudoEltName = 2;
&gt; &gt; +    else if (pseudoElt.startsWith(&quot;:&quot;))
&gt; &gt; +        startPseudoEltName = 1;
&gt; 
&gt; There is a slightly more efficient way to do this. Since String indexing
&gt; already does range checking, you can just check characters:
&gt; 
&gt;     unsigned nameStart = pseudoElementSpecifier[0] == &apos;:&apos; ?
&gt; (pseudoElementSpecifier[1] == &apos;:&apos; ? 2 : 1) : 0;
&gt; 

Done.

&gt; You could also do the same thing with if statements. I think it&apos;s slightly
&gt; better to use array indexing and characters than startsWith and C-style
&gt; strings.
&gt; 
&gt; &gt; +    m_pseudoElt = CSSSelector::pseudoIdFromPseudoType(CSSSelector::pseudoTypeFromString(
&gt; &gt; +        AtomicString(pseudoElt.substring(startPseudoEltName))));
&gt; &gt; +
&gt; &gt;  }
&gt; 
&gt; Extra blank line here.

Removed.

&gt; 
&gt; &gt;      if (renderer &amp;&amp; hasCompositedLayer(renderer) &amp;&amp; AnimationController::supportsAcceleratedAnimationOfProperty(static_cast&lt;CSSPropertyID&gt;(propertyID)))
&gt; &gt;          style = renderer-&gt;animation()-&gt;getAnimatedStyleForRenderer(renderer);
&gt; &gt;      else
&gt; &gt; -       style = node-&gt;computedStyle();
&gt; &gt; +        style = node-&gt;computedStyle(m_pseudoElt);
&gt; 
&gt; Is it really OK to ignore m_psuedoElt on the AnimationController side of this
&gt; if statement? If not, could we construct a test case to demonstrate why that&apos;s
&gt; not OK?
&gt; 

I have changed it so that we don&apos;t ignore the m_pseudoElementSpecifier on the AnimationController side (and added a corresponding test to getComputedStyle-with-pseudo-element.html). However, the implementation requires that the animation be run at least once so that there is a cachedPseudoStyle.

I believe this is similar to the situation I described in the FIXME in Element.cpp for the &apos;:selection&apos; pseudo-element. In the coming iterations on getComputedStyle, I will be trying to get properties from the renderer that actually corresponds to the pseudo-element. The difficult part so far for me is figuring out how to get that renderer.

Should I create a separate bug for this?

&gt; &gt; +    static PseudoId getPseudoId(const AtomicString&amp; value);
&gt; 
&gt; In WebKit code, we reserve &quot;get&quot; for functions with out arguments. We don&apos;t use
&gt; it for getters that return a value. Those we name with nouns or adjectives
&gt; instead. The name &quot;value&quot; doesn&apos;t add much here. I think we need to get clearer
&gt; on our terminology. What are the strings that specify different pseudo elements
&gt; called?
&gt; 
&gt; Then I noticed this declaration is for a function that you actually didn&apos;t end
&gt; up defining. Oops! Please remove it.

Done.

&gt; 
&gt; &gt; +PseudoId CSSSelector::pseudoIdFromPseudoType(PseudoType pseudoType)
&gt; 
&gt; I think the local variable can just have the name &quot;type&quot;. Once you&apos;ve said
&gt; pseudo in pseudoId, I don&apos;t think you have to repeat it.
&gt; 

Done.

&gt; &gt; +    case PseudoUnknown:
&gt; &gt; +    case PseudoNotParsed:
&gt; &gt; +    default:
&gt; &gt; +        return NOPSEUDO;
&gt; &gt; +    }
&gt; 
&gt; It would be better to omit the default case and have an ASSERT_NOT_REACHED
&gt; outside the switch statement for two reasons:
&gt; 
&gt;     1) If we do that, gcc will warn if we add a new pseudo type and forget to
&gt; add a case to the switch statement.
&gt; 
&gt;     2) If the passed-in type is an illegal value, then we&apos;ll see an assert at
&gt; runtime, which could help us track down a bug.
&gt; 
&gt; We can still return NOPSEUDO and so have the same behavior in a release build.

Done.

&gt; 
&gt; &gt; +    static HashMap&lt;AtomicStringImpl*, PseudoType&gt;* valueToPseudoType = 0;
&gt; &gt; +    if (!valueToPseudoType) {
&gt; &gt; +        valueToPseudoType = new HashMap&lt;AtomicStringImpl*, PseudoType&gt;;
&gt; &gt; +        valueToPseudoType-&gt;set(active.impl(), PseudoActive);
&gt; &gt; +        valueToPseudoType-&gt;set(after.impl(), PseudoAfter);
&gt; &gt; +        valueToPseudoType-&gt;set(anyLink.impl(), PseudoAnyLink);
&gt; &gt; +        valueToPseudoType-&gt;set(autofill.impl(), PseudoAutofill);
&gt; &gt; +        valueToPseudoType-&gt;set(before.impl(), PseudoBefore);
&gt; &gt; +        valueToPseudoType-&gt;set(checked.impl(), PseudoChecked);
&gt; &gt; +        valueToPseudoType-&gt;set(fileUploadButton.impl(), PseudoFileUploadButton);
&gt; &gt; +        valueToPseudoType-&gt;set(defaultString.impl(), PseudoDefault);
&gt; &gt; +        valueToPseudoType-&gt;set(disabled.impl(), PseudoDisabled);
&gt; &gt; +        valueToPseudoType-&gt;set(readOnly.impl(), PseudoReadOnly);
&gt; &gt; +        valueToPseudoType-&gt;set(readWrite.impl(), PseudoReadWrite);
&gt; &gt; +        valueToPseudoType-&gt;set(valid.impl(), PseudoValid);
&gt; &gt; +        valueToPseudoType-&gt;set(invalid.impl(), PseudoInvalid);
&gt; &gt; +        valueToPseudoType-&gt;set(drag.impl(), PseudoDrag);
&gt; &gt; +        valueToPseudoType-&gt;set(dragAlias.impl(), PseudoDrag);
&gt; &gt; +        valueToPseudoType-&gt;set(enabled.impl(), PseudoEnabled);
&gt; &gt; +        valueToPseudoType-&gt;set(empty.impl(), PseudoEmpty);
&gt; &gt; +        valueToPseudoType-&gt;set(firstChild.impl(), PseudoFirstChild);
&gt; &gt; +        valueToPseudoType-&gt;set(fullPageMedia.impl(), PseudoFullPageMedia);
&gt; &gt; +#if ENABLE(DATALIST)
&gt; &gt; +        valueToPseudoType-&gt;set(inputListButton.impl(), PseudoInputListButton);
&gt; &gt; +#endif
&gt; &gt; +        valueToPseudoType-&gt;set(inputPlaceholder.impl(), PseudoInputPlaceholder);
&gt; &gt; +        valueToPseudoType-&gt;set(lastChild.impl(), PseudoLastChild);
&gt; &gt; +        valueToPseudoType-&gt;set(lastOfType.impl(), PseudoLastOfType);
&gt; &gt; +        valueToPseudoType-&gt;set(onlyChild.impl(), PseudoOnlyChild);
&gt; &gt; +        valueToPseudoType-&gt;set(onlyOfType.impl(), PseudoOnlyOfType);
&gt; &gt; +        valueToPseudoType-&gt;set(firstLetter.impl(), PseudoFirstLetter);
&gt; &gt; +        valueToPseudoType-&gt;set(firstLine.impl(), PseudoFirstLine);
&gt; &gt; +        valueToPseudoType-&gt;set(firstOfType.impl(), PseudoFirstOfType);
&gt; &gt; +        valueToPseudoType-&gt;set(focus.impl(), PseudoFocus);
&gt; &gt; +        valueToPseudoType-&gt;set(hover.impl(), PseudoHover);
&gt; &gt; +        valueToPseudoType-&gt;set(indeterminate.impl(), PseudoIndeterminate);
&gt; &gt; +        valueToPseudoType-&gt;set(innerSpinButton.impl(), PseudoInnerSpinButton);
&gt; &gt; +        valueToPseudoType-&gt;set(link.impl(), PseudoLink);
&gt; &gt; +        valueToPseudoType-&gt;set(lang.impl(), PseudoLang);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsPanel.impl(), PseudoMediaControlsPanel);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsMuteButton.impl(), PseudoMediaControlsMuteButton);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsPlayButton.impl(), PseudoMediaControlsPlayButton);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsCurrentTimeDisplay.impl(), PseudoMediaControlsCurrentTimeDisplay);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsTimeRemainingDisplay.impl(), PseudoMediaControlsTimeRemainingDisplay);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsTimeline.impl(), PseudoMediaControlsTimeline);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsVolumeSlider.impl(), PseudoMediaControlsVolumeSlider);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsSeekBackButton.impl(), PseudoMediaControlsSeekBackButton);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsSeekForwardButton.impl(), PseudoMediaControlsSeekForwardButton);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsRewindButton.impl(), PseudoMediaControlsRewindButton);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsReturnToRealtimeButton.impl(), PseudoMediaControlsReturnToRealtimeButton);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsToggleClosedCaptionsButton.impl(), PseudoMediaControlsToggleClosedCaptions);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsStatusDisplay.impl(), PseudoMediaControlsStatusDisplay);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsFullscreenButton.impl(), PseudoMediaControlsFullscreenButton);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsTimelineContainer.impl(), PseudoMediaControlsTimelineContainer);
&gt; &gt; +        valueToPseudoType-&gt;set(mediaControlsVolumeSliderContainer.impl(), PseudoMediaControlsVolumeSliderContainer);
&gt; &gt; +        valueToPseudoType-&gt;set(notStr.impl(), PseudoNot);
&gt; &gt; +        valueToPseudoType-&gt;set(nthChild.impl(), PseudoNthChild);
&gt; &gt; +        valueToPseudoType-&gt;set(nthOfType.impl(), PseudoNthOfType);
&gt; &gt; +        valueToPseudoType-&gt;set(nthLastChild.impl(), PseudoNthLastChild);
&gt; &gt; +        valueToPseudoType-&gt;set(nthLastOfType.impl(), PseudoNthLastOfType);
&gt; &gt; +        valueToPseudoType-&gt;set(outerSpinButton.impl(), PseudoOuterSpinButton);
&gt; &gt; +        valueToPseudoType-&gt;set(root.impl(), PseudoRoot);
&gt; &gt; +        valueToPseudoType-&gt;set(windowInactive.impl(), PseudoWindowInactive);
&gt; &gt; +        valueToPseudoType-&gt;set(decrement.impl(), PseudoDecrement);
&gt; &gt; +        valueToPseudoType-&gt;set(increment.impl(), PseudoIncrement);
&gt; &gt; +        valueToPseudoType-&gt;set(start.impl(), PseudoStart);
&gt; &gt; +        valueToPseudoType-&gt;set(end.impl(), PseudoEnd);
&gt; &gt; +        valueToPseudoType-&gt;set(horizontal.impl(), PseudoHorizontal);
&gt; &gt; +        valueToPseudoType-&gt;set(vertical.impl(), PseudoVertical);
&gt; &gt; +        valueToPseudoType-&gt;set(doubleButton.impl(), PseudoDoubleButton);
&gt; &gt; +        valueToPseudoType-&gt;set(singleButton.impl(), PseudoSingleButton);
&gt; &gt; +        valueToPseudoType-&gt;set(noButton.impl(), PseudoNoButton);
&gt; &gt; +        valueToPseudoType-&gt;set(optional.impl(), PseudoOptional);
&gt; &gt; +        valueToPseudoType-&gt;set(required.impl(), PseudoRequired);
&gt; &gt; +        valueToPseudoType-&gt;set(resizer.impl(), PseudoResizer);
&gt; &gt; +        valueToPseudoType-&gt;set(scrollbar.impl(), PseudoScrollbar);
&gt; &gt; +        valueToPseudoType-&gt;set(scrollbarButton.impl(), PseudoScrollbarButton);
&gt; &gt; +        valueToPseudoType-&gt;set(scrollbarCorner.impl(), PseudoScrollbarCorner);
&gt; &gt; +        valueToPseudoType-&gt;set(scrollbarThumb.impl(), PseudoScrollbarThumb);
&gt; &gt; +        valueToPseudoType-&gt;set(scrollbarTrack.impl(), PseudoScrollbarTrack);
&gt; &gt; +        valueToPseudoType-&gt;set(scrollbarTrackPiece.impl(), PseudoScrollbarTrackPiece);
&gt; &gt; +        valueToPseudoType-&gt;set(cornerPresent.impl(), PseudoCornerPresent);
&gt; &gt; +        valueToPseudoType-&gt;set(searchCancelButton.impl(), PseudoSearchCancelButton);
&gt; &gt; +        valueToPseudoType-&gt;set(searchDecoration.impl(), PseudoSearchDecoration);
&gt; &gt; +        valueToPseudoType-&gt;set(searchResultsDecoration.impl(), PseudoSearchResultsDecoration);
&gt; &gt; +        valueToPseudoType-&gt;set(searchResultsButton.impl(), PseudoSearchResultsButton);
&gt; &gt; +        valueToPseudoType-&gt;set(selection.impl(), PseudoSelection);
&gt; &gt; +        valueToPseudoType-&gt;set(sliderThumb.impl(), PseudoSliderThumb);
&gt; &gt; +        valueToPseudoType-&gt;set(target.impl(), PseudoTarget);
&gt; &gt; +        valueToPseudoType-&gt;set(visited.impl(), PseudoVisited);
&gt; &gt; +    }
&gt; 
&gt; I sugget putting the code that populates the map into a separate function. It’s
&gt; inelegant to have it here in the middle of the function that does the work
&gt; after the map is built.

Done (refactored into nameToPseudoTypeMap()).

&gt; 
&gt; &gt; +    if (valueToPseudoType-&gt;contains(value.impl()))
&gt; &gt; +        return valueToPseudoType-&gt;get(value.impl());
&gt; &gt; +    return PseudoUnknown;
&gt; 
&gt; This does two hash map lookups but should only do one. Since PseudoUnknown is
&gt; not a 0 value, you have to write it with iterators:
&gt; 
&gt;     HashMap&lt;AtomicStringImpl*, PseudoType&gt;::iterator slot =
&gt; valueToPseudoType-&gt;get(value.impl());
&gt;     return slot == valueToPseudoType-&gt;end() ? PseudoUnknown : slot-&gt;second;
&gt; 
&gt; Not as easy to read, but twice as fast.

Done.

&gt; 
&gt; &gt; +    default:
&gt; &gt; +        break;
&gt; &gt; +    }
&gt; 
&gt; Again, I think it&apos;s better to not have a default here, and instead list the
&gt; other pseudo types with explicit cases so we get warnings if we forget to add a
&gt; new type here.

Done.

&gt; 
&gt; &gt; +        static PseudoType pseudoTypeFromString(const AtomicString&amp;);
&gt; &gt; +        static PseudoId pseudoIdFromPseudoType(PseudoType);
&gt; 
&gt; Given that this is C++ and we support overloading, I&apos;m not sure these function
&gt; names need the &quot;from type&quot; suffixes. I don&apos;t have better names to suggest right
&gt; away. For example pseudoTypeFromString might be better named something like
&gt; parsePseudoTypeName. And it might be OK to name pseudoIdFromPseudoType just
&gt; pseudoId.

Done (changed pseudoTypeFromString to parsePseudoType and pseudoIdFromPseudoType to pseudoId).

&gt; 
&gt; &gt; +        PseudoId pseudoId = CSSSelector::pseudoIdFromPseudoType(sel-&gt;pseudoType());
&gt; &gt; +        if (pseudoId == FIRST_LETTER)
&gt; &gt; +            if (Document* doc = e-&gt;document())
&gt; &gt; +                doc-&gt;setUsesFirstLetterRules(true);
&gt; 
&gt; Please use &quot;document&quot; instead of &quot;doc&quot;.

Done.

&gt; 
&gt; Please use braces around multiple line if bodies. The outer one here is
&gt; multiple lines long and so needs braces.

Done.

&gt; 
&gt; &gt; -    virtual RenderStyle* computedStyle();
&gt; &gt; +    virtual RenderStyle* computedStyle(PseudoId pseudoElt = NOPSEUDO);
&gt; 
&gt; I suggest omitting the argument name here.
&gt; 
&gt; &gt; -    virtual RenderStyle* computedStyle();
&gt; &gt; +    virtual RenderStyle* computedStyle(PseudoId pseudoElt = NOPSEUDO);
&gt; 
&gt; And here.

Done.

&gt; 
&gt; If it&apos;s at all common to call computedStyle on Element, we could speed things
&gt; up by making it so that it&apos;s a non-virtual function call. The technique used
&gt; for functions like prefix can be used for computedStyle to make a virtual one
&gt; in the Node class and a non-virtual one in the Element class that have the same
&gt; name and look the same at the call site, yet more efficient in the class
&gt; Element.

I am not really sure what the qualifications are for a call to be considered common in WebKit, but just setting a hit count breakpoint and navigating to a few of the sites I visit daily results in it getting called on Element about 1000 times per page load and more than that to load the inspector (whereas it is only called on Node a few times), so I went ahead and did this.

How do you normally determine whether a call is considered common in WebKit?

&gt; 
&gt; &gt; -PassRefPtr&lt;CSSStyleDeclaration&gt; DOMWindow::getComputedStyle(Element* elt, const String&amp;) const
&gt; &gt; +PassRefPtr&lt;CSSStyleDeclaration&gt; DOMWindow::getComputedStyle(Element* elt, const String&amp; pseudoElt) const
&gt; &gt;  {
&gt; &gt;      if (!elt)
&gt; &gt;          return 0;
&gt; &gt;  
&gt; &gt; -    // FIXME: This needs take pseudo elements into account.
&gt; &gt; -    return computedStyle(elt);
&gt; &gt; +    return computedStyle(elt, pseudoElt);
&gt; &gt;  }
&gt; 
&gt; As long as you&apos;re touching this it would be good to get rid of the &quot;elt&quot;
&gt; abbreviation. See also my comments above about the pseudoElt name.

I understand why the pseudoElt name isn&apos;t very helpful, but I was a bit hesitant to replace it with something more descriptive because the name pseudoElt in this case comes directly from the DOM Level 2 Style Interface Specification (http://www.w3.org/TR/DOM-Level-2-Style/css.html) and is used in other places in DOMWindow to represent the name of the pseudo-element (like getMatchedCSSRules).

Do we usually keep their naming schemes in cases like these?

&gt; 
&gt; Most of my comments are minor, but a few are important enough that I think I&apos;ll
&gt; say review-</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202298</commentid>
    <comment_count>15</comment_count>
      <attachid>51251</attachid>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-03-21 11:02:18 -0700</bug_when>
    <thetext>Created attachment 51251
First steps towards exposing the standard pseudo-elements through getComputedStyle (addressed issues pointed out by Darin)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212934</commentid>
    <comment_count>16</comment_count>
      <attachid>51251</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-04-15 10:59:49 -0700</bug_when>
    <thetext>Comment on attachment 51251
First steps towards exposing the standard pseudo-elements through getComputedStyle (addressed issues pointed out by Darin) 

r=me

Looks great.  Nice to have this fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214003</commentid>
    <comment_count>17</comment_count>
      <attachid>51251</attachid>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-04-19 06:30:18 -0700</bug_when>
    <thetext>Comment on attachment 51251
First steps towards exposing the standard pseudo-elements through getComputedStyle (addressed issues pointed out by Darin) 

Thanks! Committed in r57809
http://trac.webkit.org/changeset/57809</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214006</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-19 06:48:21 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/57809 might have broken Chromium Mac Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214172</commentid>
    <comment_count>19</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-04-19 12:37:35 -0700</bug_when>
    <thetext>Leading whitespace in the string:
&lt;div id=&quot;testHardwareAcceleratedCompositing&quot;&gt; This should be at full opacity.&lt;/div&gt;
causes this to fail on the Chromium bots.  Is the space before the &quot; This&quot; intentional here?  I&apos;m surprised that this would be different in chromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214372</commentid>
    <comment_count>20</comment_count>
      <attachid>53748</attachid>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-04-19 17:34:35 -0700</bug_when>
    <thetext>Created attachment 53748
Remove the space that was causing the test to fail on the Chromium bots. Also remove the platform specific results that were landed in the meantime.

Sorry about that, the space was not intentional.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214377</commentid>
    <comment_count>21</comment_count>
      <attachid>53748</attachid>
    <who name="">mitz</who>
    <bug_when>2010-04-19 17:40:45 -0700</bug_when>
    <thetext>Comment on attachment 53748
Remove the space that was causing the test to fail on the Chromium bots. Also remove the platform specific results that were landed in the meantime.

r=me if a review request was intended</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214398</commentid>
    <comment_count>22</comment_count>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2010-04-19 18:01:21 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; (From update of attachment 53748 [details])
&gt; r=me if a review request was intended

Yes, thank you. Committed in r57861 http://trac.webkit.org/changeset/57861</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27779</attachid>
            <date>2009-02-19 00:00:06 -0800</date>
            <delta_ts>2010-03-06 16:28:49 -0800</delta_ts>
            <desc>Test case with 2 alerts showing style of element and pseudo-element</desc>
            <filename>webkit-getComputedStyleTestcase.html</filename>
            <type>text/html</type>
            <size>676</size>
            <attacher name="Faruk Ates">farukates</attacher>
            
              <data encoding="base64">PHN0eWxlIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIj4KLyogPCFbQ0RBVEFbICovCgkj
dGVzdCB7CgkJY29sb3I6IHJlZDsKCQlmbG9hdDogbGVmdDsKCX0KCSN0ZXN0OmFmdGVyIHsKCQlj
b250ZW50OiAnIC0gZ2V0Q29tcHV0ZWRTdHlsZSgpIFRlc3RjYXNlJzsKCQljb2xvcjogYmx1ZTsK
CX0KLyogXV0+ICovCjwvc3R5bGU+Cgo8c2NyaXB0PiAgCmZ1bmN0aW9uIGRvaXQoKSB7ICAKICAg
ICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0Jyk7ICAKICAg
ICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVs
ZW1lbnQsICIiKTsgIAogICAgICAgIHZhciBzdHlsZUFmdGVyID0gZG9jdW1lbnQuZGVmYXVsdFZp
ZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAiOmFmdGVyIik7ICAKCQlhbGVydCggIkNvbG9y
IG9mIGRpdiN0ZXN0OiAiICsgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiY29sb3IiKSk7ICAKCQlh
bGVydCggIkNvbG9yIG9mIGRpdiN0ZXN0OmFmdGVyICIgKyBzdHlsZUFmdGVyLmdldFByb3BlcnR5
VmFsdWUoImNvbG9yIikpOyAgCQp9ICAKPC9zY3JpcHQ+ICAKPGJvZHkgb25sb2FkPSJkb2l0KCki
PiAgCjxkaXYgaWQ9J3Rlc3QnPkhlbGxvIHdvcmxkPC9kaXY+ICAKPC9ib2R5PiAgCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45754</attachid>
            <date>2010-01-02 18:35:40 -0800</date>
            <delta_ts>2010-03-06 16:28:49 -0800</delta_ts>
            <desc>A tentative idea for a fix that will expose the standard pseudo-elements through getComputedStyle</desc>
            <filename>tentativeGetComputedStyleWithPseudoElement.patch</filename>
            <type>text/plain</type>
            <size>22493</size>
            <attacher name="Jessie Berlin">jberlin</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBjMGJkNDQ5Li4yODY1MmI3IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTAtMDEt
MDIgIEplc3NpZSBCZXJsaW4gIDxqYmVybGluQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVudGF0aXZlIGlkZWEgZm9yIGEgZml4
IGZvciBCdWcgMjQwMjEgLSBwc2V1ZG8tZWxlbWVudCBzdHlsZXMgbm90CisgICAgICAgIGFjY2Vz
c2libGUgLyByZXRyaWV2YWJsZSB2aWEgRE9NIG1ldGhvZHMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0MDIxCisKKyAgICAgICAgKiBmYXN0L2Nzcy9n
ZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC1leHBl
Y3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3QvY3NzL2dldENvbXB1dGVkU3R5bGUvZ2V0
Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50Lmh0bWw6IEFkZGVkLgorCiAyMDA5LTEy
LTI5ICBHdXN0YXZvIE5vcm9uaGEgU2lsdmEgIDxndXN0YXZvLm5vcm9uaGFAY29sbGFib3JhLmNv
LnVrPgogCiAgICAgICAgIFtHVEtdIEZhaWxpbmcgbWVkaWEvdmlkZW8tc2Vlay1wYXN0LWVuZC1w
bGF5aW5nLmh0bWwKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3QvY3NzL2dldENvbXB1dGVk
U3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50LWV4cGVjdGVkLnR4dCBi
L0xheW91dFRlc3RzL2Zhc3QvY3NzL2dldENvbXB1dGVkU3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13
aXRoLXBzZXVkby1lbGVtZW50LWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi4zN2FmNmEyCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9j
c3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQt
ZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMjAgQEAKK1Rlc3QgZm9yIFdlYktpdCBidWcgMjQwMjE6
IHBzZXVkby1lbGVtZW50IHN0eWxlcyBub3QgYWNjZXNzaWJsZSAvIHJldHJpZXZhYmxlIHZpYSBE
T00gbWV0aG9kcworCisKK29yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFk
aXBpc2ljaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9y
ZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBu
b3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVh
IGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJp
dCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBw
YXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwg
c3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFi
b3J1bS4KKworCitUaGlzIHRleHQgc2hvdWxkIGJlIGJsdWUgb24gYSBicm93biBiYWNrZ3JvdW5k
LCB3aGVuIHNlbGVjdGVkLgorCitUaGVyZSBhcmUgbm8gcHNldWRvIGVsZW1lbnRzIGRlZmluZWQg
b24gdGhpcyBkaXYuCisKK1BBU1MgRXhwZWN0ZWQgJ3JnYigxNjUsIDQyLCA0MiknIGZvciBjb2xv
ciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Rmlyc3RzIGFu
ZCBwc2V1ZG8tZWxlbWVudCA6Zmlyc3QtbGluZSBhbmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIpJwor
UEFTUyBFeHBlY3RlZCAncmdiKDAsIDAsIDI1NSknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQg
c3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Rmlyc3RzIGFuZCBwc2V1ZG8tZWxlbWVudCA6
Zmlyc3QtbGV0dGVyIGFuZCBnb3QgJ3JnYigwLCAwLCAyNTUpJworUEFTUyBFeHBlY3RlZCAncmdi
KDAsIDAsIDApJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdp
dGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1lbnQgbnVsbCBhbmQgZ290ICdyZ2IoMCwg
MCwgMCknCitQQVNTIEV4cGVjdGVkICdyZ2IoMTY1LCA0MiwgNDIpJyBmb3IgY29sb3IgaW4gdGhl
IGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEJlZm9yZUFmdGVyIGFuZCBw
c2V1ZG8tZWxlbWVudCA6YmVmb3JlIGFuZCBnb3QgJ3JnYigxNjUsIDQyLCA0MiknCitQQVNTIEV4
cGVjdGVkICdyZ2IoMCwgMCwgMjU1KScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHlsZSBm
b3IgZWxlbWVudCB3aXRoIGlkIHRlc3RCZWZvcmVBZnRlciBhbmQgcHNldWRvLWVsZW1lbnQgOmFm
dGVyIGFuZCBnb3QgJ3JnYigwLCAwLCAyNTUpJworUEFTUyBFeHBlY3RlZCAncmdiKDE2NSwgNDIs
IDQyKScgZm9yIGJhY2tncm91bmQtY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVt
ZW50IHdpdGggaWQgdGVzdFNlbGVjdGlvbiBhbmQgcHNldWRvLWVsZW1lbnQgOnNlbGVjdGlvbiBh
bmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIpJworUEFTUyBFeHBlY3RlZCAncmdiKDAsIDAsIDI1NSkn
IGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0
U2VsZWN0aW9uIGFuZCBwc2V1ZG8tZWxlbWVudCA6c2VsZWN0aW9uIGFuZCBnb3QgJ3JnYigwLCAw
LCAyNTUpJworUEFTUyBFeHBlY3RlZCAncmdiKDE2NSwgNDIsIDQyKScgZm9yIGNvbG9yIGluIHRo
ZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3ROb1BzZXVkb0VsZW1lbnQg
YW5kIHBzZXVkby1lbGVtZW50IG51bGwgYW5kIGdvdCAncmdiKDE2NSwgNDIsIDQyKScKK1BBU1Mg
RXhwZWN0ZWQgJycgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3
aXRoIGlkIHRlc3ROb1BzZXVkb0VsZW1lbnQgYW5kIHBzZXVkby1lbGVtZW50IDpmaXJzdC1saW5l
IGFuZCBnb3QgJycKK1BBU1MgRXhwZWN0ZWQgJ3JnYigxNjUsIDQyLCA0MiknIGZvciBjb2xvciBp
biB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Tm9Qc2V1ZG9FbGVt
ZW50IGFuZCBwc2V1ZG8tZWxlbWVudCA6Z2FyYmFnZSBhbmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIp
JwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRD
b21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQuaHRtbCBiL0xheW91dFRlc3RzL2Zhc3Qv
Y3NzL2dldENvbXB1dGVkU3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50
Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwNzRjNwotLS0gL2Rl
di9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zhc3QvY3NzL2dldENvbXB1dGVkU3R5bGUvZ2V0Q29t
cHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50Lmh0bWwKQEAgLTAsMCArMSw5OCBAQAorPCFE
T0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPlRlc3QgZm9yIFdlYktp
dCBidWcgMjQwMjE6IHBzZXVkby1lbGVtZW50IHN0eWxlcyBub3QgYWNjZXNzaWJsZSAvIHJldHJp
ZXZhYmxlIHZpYSBET00gbWV0aG9kczwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3Nz
Ij4KKyAgICAgICN0ZXN0Rmlyc3RzOmZpcnN0LWxpbmUgeworICAgICAgICAgIGNvbG9yOiBicm93
bjsKKyAgICAgIH0KKworICAgICAgI3Rlc3RGaXJzdHM6Zmlyc3QtbGV0dGVyIHsKKyAgICAgICAg
ICBjb2xvcjogYmx1ZTsKKyAgICAgIH0KKworICAgICAgI3Rlc3RCZWZvcmVBZnRlcjo6YmVmb3Jl
IHsKKyAgICAgICAgICBjb250ZW50OiAiVGhpcyBzaG91bGQgYmUgYnJvd24gIjsKKyAgICAgICAg
ICBjb2xvcjogYnJvd247CisgICAgICB9CisKKyAgICAgICN0ZXN0QmVmb3JlQWZ0ZXI6OmFmdGVy
IHsKKyAgICAgICAgICBjb250ZW50OiAiYW5kIHRoaXMgc2hvdWxkIGJlIGJsdWUiOworICAgICAg
ICAgIGNvbG9yOiBibHVlOworICAgICAgfQorCisgICAgICAjdGVzdFNlbGVjdGlvbjo6c2VsZWN0
aW9uIHsKKyAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBicm93bjsKKyAgICAgICAgICBjb2xv
cjogYmx1ZTsKKyAgICAgIH0KKworICAgICAgI3Rlc3ROb1BzZXVkb0VsZW1lbnQgeworICAgICAg
ICAgIGNvbG9yOiBicm93bjsKKyAgICAgIH0KKworICAgICAgLnNtYWxsQm94IHsKKyAgICAgICAg
ICB3aWR0aDogNzVweDsKKyAgICAgICAgICBoZWlnaHQ6IDc1cHg7CisgICAgICAgICAgYmFja2dy
b3VuZC1jb2xvcjogZ3JheTsKKyAgICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOworICAgICAgfQor
CisgICAgICAucGFzcyB7CisgICAgICAgICAgY29sb3I6IGdyZWVuOworICAgICAgfQorCisgICAg
ICAuZmFpbCB7CisgICAgICAgICAgY29sb3I6IHJlZDsKKyAgICAgIH0KKworICAgIDwvc3R5bGU+
CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgaWYgKHdpbmRvdy5s
YXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1w
QXNUZXh0KCk7CisKKyAgICAgIHZhciB0ZXN0cyA9IFsKKyAgICAgICAgeyAnZWxlbWVudElkJyA6
ICd0ZXN0Rmlyc3RzJywgJ3BzZXVkb0VsZW1lbnQnIDogJzpmaXJzdC1saW5lJywgJ3Byb3BlcnR5
JyA6ICdjb2xvcicsICdleHBlY3RlZFZhbHVlJyA6ICdyZ2IoMTY1LCA0MiwgNDIpJyB9LAorICAg
ICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3RGaXJzdHMnLCAncHNldWRvRWxlbWVudCcgOiAnOmZp
cnN0LWxldHRlcicsICdwcm9wZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAncmdi
KDAsIDAsIDI1NSknIH0sCisgICAgICAgIHsgJ2VsZW1lbnRJZCcgOiAndGVzdEZpcnN0cycsICdw
c2V1ZG9FbGVtZW50JyA6IG51bGwsICdwcm9wZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1
ZScgOiAncmdiKDAsIDAsIDApJyB9LAorICAgICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3RCZWZv
cmVBZnRlcicsICdwc2V1ZG9FbGVtZW50JyA6ICc6YmVmb3JlJywgJ3Byb3BlcnR5JyA6ICdjb2xv
cicsICdleHBlY3RlZFZhbHVlJyA6ICdyZ2IoMTY1LCA0MiwgNDIpJyB9LAorICAgICAgICB7ICdl
bGVtZW50SWQnIDogJ3Rlc3RCZWZvcmVBZnRlcicsICdwc2V1ZG9FbGVtZW50JyA6ICc6YWZ0ZXIn
LCAncHJvcGVydHknIDogJ2NvbG9yJywgJ2V4cGVjdGVkVmFsdWUnIDogJ3JnYigwLCAwLCAyNTUp
JyB9LAorICAgICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3RTZWxlY3Rpb24nLCAncHNldWRvRWxl
bWVudCcgOiAnOnNlbGVjdGlvbicsICdwcm9wZXJ0eScgOiAnYmFja2dyb3VuZC1jb2xvcicsICdl
eHBlY3RlZFZhbHVlJyA6ICdyZ2IoMTY1LCA0MiwgNDIpJyB9LAorICAgICAgICB7ICdlbGVtZW50
SWQnIDogJ3Rlc3RTZWxlY3Rpb24nLCAncHNldWRvRWxlbWVudCcgOiAnOnNlbGVjdGlvbicsICdw
cm9wZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDAsIDAsIDI1NSknIH0s
CisgICAgICAgIHsgJ2VsZW1lbnRJZCcgOiAndGVzdE5vUHNldWRvRWxlbWVudCcsICdwc2V1ZG9F
bGVtZW50JyA6IG51bGwsICdwcm9wZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAn
cmdiKDE2NSwgNDIsIDQyKScgfSwKKyAgICAgICAgeyAnZWxlbWVudElkJyA6ICd0ZXN0Tm9Qc2V1
ZG9FbGVtZW50JywgJ3BzZXVkb0VsZW1lbnQnIDogJzpmaXJzdC1saW5lJywgJ3Byb3BlcnR5JyA6
ICdjb2xvcicsICdleHBlY3RlZFZhbHVlJyA6ICcnIH0sCisgICAgICAgIHsgJ2VsZW1lbnRJZCcg
OiAndGVzdE5vUHNldWRvRWxlbWVudCcsICdwc2V1ZG9FbGVtZW50JyA6ICc6Z2FyYmFnZScsICdw
cm9wZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDE2NSwgNDIsIDQyKScg
fQorICAgICAgXTsKKworICAgICAgZnVuY3Rpb24gcnVuVGVzdHMoKQorICAgICAgeworICAgICAg
ICB2YXIgcmVzdWx0c0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0cycp
OworCisgICAgICAgIHRlc3RzLmZvckVhY2goZnVuY3Rpb24oY3VyVGVzdCkgeworICAgICAgICAg
IHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoY3VyVGVzdC5lbGVtZW50SWQpLCBjdXJUZXN0LnBzZXVkb0VsZW1lbnQpOwor
ICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbXB1dGVkU3R5bGVbY3VyVGVzdC5wcm9wZXJ0eV07Cisg
ICAgICAgICAgdmFyIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAg
ICAgIHZhciBtYWluTWVzc2FnZSA9ICIgRXhwZWN0ZWQgJyIgKyBjdXJUZXN0LmV4cGVjdGVkVmFs
dWUgKyAiJyBmb3IgIiArIGN1clRlc3QucHJvcGVydHkgKworICAgICAgICAgICAgICAiIGluIHRo
ZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkICIgKyBjdXJUZXN0LmVsZW1lbnRJ
ZCArICIgYW5kIHBzZXVkby1lbGVtZW50ICIgKyBjdXJUZXN0LnBzZXVkb0VsZW1lbnQ7CisgICAg
ICAgICAgaWYgKHZhbHVlID09IGN1clRlc3QuZXhwZWN0ZWRWYWx1ZSkKKyAgICAgICAgICAgICAg
bXNnLmlubmVySFRNTCA9ICI8c3BhbiBjbGFzcz0ncGFzcyc+UEFTUzwvc3Bhbj4iICsgbWFpbk1l
c3NhZ2UgKyAiIGFuZCBnb3QgJyIgKyB2YWx1ZSArICInIjsKKyAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgIG1zZy5pbm5lckhUTUwgPSAiPHNwYW4gY2xhc3M9J2ZhaWwnPkZBSUw8L3NwYW4+
IEV4cGVjdGVkICIgKyBtYWluTWVzc2FnZSArICIgYnV0IGluc3RlYWQgZ290ICciICsgdmFsdWUg
KyAiJyI7CisgICAgICAgICAgcmVzdWx0c0VsZW1lbnQuYXBwZW5kQ2hpbGQobXNnKTsKKyAgICAg
ICAgfSk7CisgICAgICB9CisgICAgPC9zY3JpcHQ+CisgIDwvaGVhZD4KKyAgPGJvZHkgb25sb2Fk
PSJydW5UZXN0cygpOyI+CisgICAgPGgzPlRlc3QgZm9yIDxhIGhyZWY9Imh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDAyMSI+V2ViS2l0IGJ1ZyAyNDAyMTwvYT46IHBz
ZXVkby1lbGVtZW50IHN0eWxlcyBub3QgYWNjZXNzaWJsZSAvIHJldHJpZXZhYmxlIHZpYSBET00g
bWV0aG9kczwvaDM+CisgICAgPGJyIC8+CisgICAgPGRpdiBpZD0idGVzdEZpcnN0cyI+TG9yZW0g
aXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQsIHNlZCBk
byBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxp
cXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1
bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBE
dWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQg
ZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNp
bnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2Zm
aWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS48L2Rpdj4KKyAgICA8YnIg
Lz4KKyAgICA8ZGl2IGlkPSJ0ZXN0QmVmb3JlQWZ0ZXIiPjwvZGl2PgorICAgIDxiciAvPgorICAg
IDxkaXYgaWQ9InRlc3RTZWxlY3Rpb24iPlRoaXMgdGV4dCBzaG91bGQgYmUgYmx1ZSBvbiBhIGJy
b3duIGJhY2tncm91bmQsIHdoZW4gc2VsZWN0ZWQuPC9kaXY+CisgICAgPGJyIC8+CisgICAgPGRp
diBpZD0idGVzdE5vUHNldWRvRWxlbWVudCI+VGhlcmUgYXJlIG5vIHBzZXVkbyBlbGVtZW50cyBk
ZWZpbmVkIG9uIHRoaXMgZGl2LjwvZGl2PgorICAgIDxiciAvPgorICAgIDxkaXYgaWQ9InJlc3Vs
dHMiPjwvZGl2PgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9XZWJDb3JlL0NoYW5n
ZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDQyNThiYjEuLjQ5NDllMTcgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEs
NDcgQEAKKzIwMTAtMDEtMDIgIEplc3NpZSBCZXJsaW4gIDxqYmVybGluQHdlYmtpdC5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVudGF0aXZl
IGlkZWEgZm9yIGEgZml4IGZvciBXZWJLaXQgQnVnIDI0MDIxIC0gcHNldWRvLWVsZW1lbnQgc3R5
bGVzIG5vdAorICAgICAgICBhY2Nlc3NpYmxlIC8gcmV0cmlldmFibGUgdmlhIERPTSBtZXRob2Rz
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDAyMQor
CisgICAgICAgIFRoZXJlIGFyZSBzZXZlcmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggdGhhdCBJIGFt
IG1pbGRseSB1bmNvbWZvcnRhYmxlCisgICAgICAgIHdpdGg6CisgICAgICAgIDEpIFRoZSBuZWVk
IHRvIGR1cGxpY2F0ZSB0aGUgcHNldWRvIHN0eWxlIHN0cmluZyB0byBwc2V1ZG8gc3R5bGUgY29u
c3RhbnQKKyAgICAgICAgICAgbWFwcGluZyB0aGF0IGlzIGRvbmUgaW4gQ1NTU2VsZWN0b3I6OmV4
dHJhY3RQc2V1ZG9UeXBlKCkuIEkgd2FzIHVuYWJsZQorICAgICAgICAgICB0byBmaW5kIGEgbWFw
cGluZyBiZXR3ZWVuIFBzZXVkb1R5cGUgYW5kIFBzZXVkb0lkIGFuZCBkZWNpZGVkIGl0IG1hZGUK
KyAgICAgICAgICAgbW9yZXMgc2Vuc2UgdG8gbWFwIGZyb20gdGhlIHN0cmluZyBpdHNlbGYgdG8g
dGhlIFBzZXVkb0lkCisgICAgICAgIDIpIFRoaXMgcGF0Y2ggd29uJ3QgZ2l2ZSB0aGUgZGVzaXJl
ZCByZXN1bHRzIGZvciB0aGUgLXdlYmtpdC1zY3JvbGxiYXIKKyAgICAgICAgICAgcHNldWRvLWVs
ZW1lbnRzLgorICAgICAgICAzKSBJIGFtIG5vdCBzdXJlIHRoYXQgZ29pbmcgZGlyZWN0bHkgdG8g
dGhlIHJlbmRlcmVyIGlzIGNvcnJlY3QuIExvb2tpbmcKKyAgICAgICAgICAgaW4gRWxlbWVudDo6
Y29tcHV0ZWRTdHlsZSgpLCB0aGVyZSBzZWVtcyB0byBiZSBhbiBvcHRpb24gZm9yIGVsZW1lbnRz
CisgICAgICAgICAgIGxpa2UgSFRNTE9wdGlvbkVsZW1lbnQgdG8gbm90IGhhdmUgcmVuZGVyZXJz
LiBJIGFtIG5vdCBleGFjdGx5IHN1cmUKKyAgICAgICAgICAgd2h5IHRoaXMgaXMuCisKKyAgICAg
ICAgVGVzdDogZmFzdC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgt
cHNldWRvLWVsZW1lbnQuaHRtbAorCisgICAgICAgICogY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNs
YXJhdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRp
b246OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbik6CisgICAgICAgIFN0b3JlIHRoZSBwc2V1
ZG8tZWxlbWVudC4KKyAgICAgICAgKFdlYkNvcmU6OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlv
bjo6Z2V0Rm9udFNpemVDU1NWYWx1ZVByZWZlcnJpbmdLZXl3b3JkKToKKyAgICAgICAgSWYgdGhl
IHBzZXVkby1lbGVtZW50IHdhcyBzcGVjaWZpZWQsIGdldCB0aGUgY2FjaGVkIHBzZXVkbyBzdHls
ZSBmcm9tCisgICAgICAgIHRoZSByZW5kZXJlci4KKyAgICAgICAgKFdlYkNvcmU6OkNTU0NvbXB1
dGVkU3R5bGVEZWNsYXJhdGlvbjo6Z2V0UHJvcGVydHlDU1NWYWx1ZSk6CisgICAgICAgIGRpdHRv
LgorICAgICAgICAoV2ViQ29yZTo6Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpsZW5ndGgp
OgorICAgICAgICBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkNTU0NvbXB1dGVkU3R5bGVEZWNs
YXJhdGlvbjo6Y3NzUHJvcGVydHlNYXRjaGVzKToKKyAgICAgICAgZGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OmdldFBzZXVkb0lkKToKKyAgICAg
ICAgUGFyc2UgdGhlIHN0cmluZyBmb3IgdGhlIHBzZXVkby1lbGVtZW50IGludG8gYSBQc2V1ZG9J
ZC4KKyAgICAgICAgKiBjc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmg6CisgICAgICAg
IChXZWJDb3JlOjpjb21wdXRlZFN0eWxlKToKKyAgICAgICAgVGFrZSBpbnRvIGNvbnNpZGVyYXRp
b24gdGhlIHBzZXVkby1lbGVtZW50LgorICAgICAgICAqIHBhZ2UvRE9NV2luZG93LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkRPTVdpbmRvdzo6Z2V0Q29tcHV0ZWRTdHlsZSk6CisJVGFrZSBpbnRv
IGNvbnNpZGVyYXRpb24gdGhlIHBzZXVkby1lbGVtZW50LgorCiAyMDA5LTEyLTI4ICBBbmRyZWkg
UG9wZXNjdSAgPGFuZHJlaXBAZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEbWl0
cnkgVGl0b3YuCmRpZmYgLS1naXQgYS9XZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVjbGFy
YXRpb24uY3BwIGIvV2ViQ29yZS9jc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNwcApp
bmRleCAzMDAyOTlhLi5hYTk3MmRmIDEwMDY0NAotLS0gYS9XZWJDb3JlL2Nzcy9DU1NDb21wdXRl
ZFN0eWxlRGVjbGFyYXRpb24uY3BwCisrKyBiL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVE
ZWNsYXJhdGlvbi5jcHAKQEAgLTQ5OSw4ICs0OTksOSBAQCBzdGF0aWMgUGFzc1JlZlB0cjxDU1NW
YWx1ZT4gZ2V0VGltaW5nRnVuY3Rpb25WYWx1ZShjb25zdCBBbmltYXRpb25MaXN0KiBhbmltTGlz
dAogICAgIHJldHVybiBsaXN0LnJlbGVhc2UoKTsKIH0KIAotQ1NTQ29tcHV0ZWRTdHlsZURlY2xh
cmF0aW9uOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24oUGFzc1JlZlB0cjxOb2RlPiBuKQor
Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24o
UGFzc1JlZlB0cjxOb2RlPiBuLCBQc2V1ZG9JZCBwKQogICAgIDogbV9ub2RlKG4pCisgICAgLCBt
X3BzZXVkb1N0eWxlKHApCiB7CiB9CiAKQEAgLTU0NSw2ICs1NDYsOCBAQCBQYXNzUmVmUHRyPENT
U1ZhbHVlPiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OmdldEZvbnRTaXplQ1NTVmFsdWVQ
cmVmZXJyaW5nSwogICAgIG5vZGUtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dElnbm9yZVBlbmRp
bmdTdHlsZXNoZWV0cygpOwogCiAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IG5vZGUt
PmNvbXB1dGVkU3R5bGUoKTsKKyAgICBpZiAobV9wc2V1ZG9TdHlsZSAhPSBOT1BTRVVETykKKyAg
ICAgICAgc3R5bGUgPSBub2RlLT5yZW5kZXJlcigpLT5nZXRDYWNoZWRQc2V1ZG9TdHlsZShtX3Bz
ZXVkb1N0eWxlKTsKICAgICBpZiAoIXN0eWxlKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtNjY0
LDggKzY2NywxMiBAQCBQYXNzUmVmUHRyPENTU1ZhbHVlPiBDU1NDb21wdXRlZFN0eWxlRGVjbGFy
YXRpb246OmdldFByb3BlcnR5Q1NTVmFsdWUoaW50IHByb3BlcgogICAgIFJlZlB0cjxSZW5kZXJT
dHlsZT4gc3R5bGU7CiAgICAgaWYgKHJlbmRlcmVyICYmIGhhc0NvbXBvc2l0ZWRMYXllcihyZW5k
ZXJlcikgJiYgQW5pbWF0aW9uQ29udHJvbGxlcjo6c3VwcG9ydHNBY2NlbGVyYXRlZEFuaW1hdGlv
bk9mUHJvcGVydHkoc3RhdGljX2Nhc3Q8Q1NTUHJvcGVydHlJRD4ocHJvcGVydHlJRCkpKQogICAg
ICAgICBzdHlsZSA9IHJlbmRlcmVyLT5hbmltYXRpb24oKS0+Z2V0QW5pbWF0ZWRTdHlsZUZvclJl
bmRlcmVyKHJlbmRlcmVyKTsKLSAgICBlbHNlCi0gICAgICAgc3R5bGUgPSBub2RlLT5jb21wdXRl
ZFN0eWxlKCk7CisgICAgZWxzZSB7CisgICAgICAgIHN0eWxlID0gbm9kZS0+Y29tcHV0ZWRTdHls
ZSgpOworICAgICAgICBpZiAobV9wc2V1ZG9TdHlsZSAhPSBOT1BTRVVETykKKyAgICAgICAgICAg
IHN0eWxlID0gbm9kZS0+cmVuZGVyZXIoKS0+Z2V0Q2FjaGVkUHNldWRvU3R5bGUobV9wc2V1ZG9T
dHlsZSk7CisgICAgfQorCiAgICAgaWYgKCFzdHlsZSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAg
LTE0NjcsNiArMTQ3NCw4IEBAIHVuc2lnbmVkIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6
bGVuZ3RoKCkgY29uc3QKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBSZW5kZXJTdHlsZSogc3R5
bGUgPSBub2RlLT5jb21wdXRlZFN0eWxlKCk7CisgICAgaWYgKG1fcHNldWRvU3R5bGUgIT0gTk9Q
U0VVRE8pCisgICAgICAgIHN0eWxlID0gbm9kZS0+cmVuZGVyZXIoKS0+Z2V0Q2FjaGVkUHNldWRv
U3R5bGUobV9wc2V1ZG9TdHlsZSk7CiAgICAgaWYgKCFzdHlsZSkKICAgICAgICAgcmV0dXJuIDA7
CiAKQEAgLTE0ODYsNiArMTQ5NSw4IEBAIGJvb2wgQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9u
Ojpjc3NQcm9wZXJ0eU1hdGNoZXMoY29uc3QgQ1NTUHJvcGVydHkqIHByb3BlcnR5CiAgICAgaWYg
KHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5Rm9udFNpemUgJiYgcHJvcGVydHktPnZhbHVl
KCktPmlzUHJpbWl0aXZlVmFsdWUoKSAmJiBtX25vZGUpIHsKICAgICAgICAgbV9ub2RlLT5kb2N1
bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKICAgICAgICAg
UmVuZGVyU3R5bGUqIHN0eWxlID0gbV9ub2RlLT5jb21wdXRlZFN0eWxlKCk7CisgICAgICAgIGlm
IChtX3BzZXVkb1N0eWxlICE9IE5PUFNFVURPKQorICAgICAgICAgICAgc3R5bGUgPSBtX25vZGUt
PnJlbmRlcmVyKCktPmdldENhY2hlZFBzZXVkb1N0eWxlKG1fcHNldWRvU3R5bGUpOwogICAgICAg
ICBpZiAoc3R5bGUgJiYgc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpLmtleXdvcmRTaXplKCkpIHsK
ICAgICAgICAgICAgIGludCBzaXplVmFsdWUgPSBjc3NJZGVudGlmaWVyRm9yRm9udFNpemVLZXl3
b3JkKHN0eWxlLT5mb250RGVzY3JpcHRpb24oKS5rZXl3b3JkU2l6ZSgpKTsKICAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4ocHJvcGVydHktPnZhbHVlKCkpOwpAQCAtMTUwNyw0ICsxNTE4LDEyNSBAQCBQ
YXNzUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBDU1NDb21wdXRlZFN0eWxlRGVj
bGFyYXRpb246Om1ha2VNdXRhYmxlKAogICAgIHJldHVybiBjb3B5KCk7CiB9CiAKK1BzZXVkb0lk
IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6Z2V0UHNldWRvSWQoY29uc3QgQXRvbWljU3Ry
aW5nJiB2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gTk9QU0VVRE87
CisKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgYWZ0ZXIsICgiOmFmdGVy
IikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBiZWZvcmUsICgiOmJl
Zm9yZSIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgZmlsZVVwbG9h
ZEJ1dHRvbiwgKCI6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24iKSk7CisgICAgREVGSU5FX1NU
QVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIGZpcnN0TGV0dGVyLCAoIjpmaXJzdC1sZXR0ZXIiKSk7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIGZpcnN0TGluZSwgKCI6Zmly
c3QtbGluZSIpKTsKKyNpZiBFTkFCTEUoREFUQUxJU1QpCisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChBdG9taWNTdHJpbmcsIGlucHV0TGlzdEJ1dHRvbiwgKCI6LXdlYmtpdC1pbnB1dC1saXN0LWJ1
dHRvbiIpKTsKKyNlbmRpZgorICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBp
bnB1dFBsYWNlaG9sZGVyLCAoIjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIikpOworICAgIERF
RklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtZWRpYUNvbnRyb2xzUGFuZWwsICgiOi13
ZWJraXQtbWVkaWEtY29udHJvbHMtcGFuZWwiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChB
dG9taWNTdHJpbmcsIG1lZGlhQ29udHJvbHNNdXRlQnV0dG9uLCAoIjotd2Via2l0LW1lZGlhLWNv
bnRyb2xzLW11dGUtYnV0dG9uIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3Ry
aW5nLCBtZWRpYUNvbnRyb2xzUGxheUJ1dHRvbiwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1w
bGF5LWJ1dHRvbiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVk
aWFDb250cm9sc1RpbWVsaW5lLCAoIjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXRpbWVsaW5lIikp
OworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtZWRpYUNvbnRyb2xzVm9s
dW1lU2xpZGVyLCAoIjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXZvbHVtZS1zbGlkZXIiKSk7Cisg
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIG1lZGlhQ29udHJvbHNTZWVrQmFj
a0J1dHRvbiwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1zZWVrLWJhY2stYnV0dG9uIikpOwor
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtZWRpYUNvbnRyb2xzU2Vla0Zv
cndhcmRCdXR0b24sICgiOi13ZWJraXQtbWVkaWEtY29udHJvbHMtc2Vlay1mb3J3YXJkLWJ1dHRv
biIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVkaWFDb250cm9s
c1Jld2luZEJ1dHRvbiwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1yZXdpbmQtYnV0dG9uIikp
OworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtZWRpYUNvbnRyb2xzUmV0
dXJuVG9SZWFsdGltZUJ1dHRvbiwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1yZXR1cm4tdG8t
cmVhbHRpbWUtYnV0dG9uIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5n
LCBtZWRpYUNvbnRyb2xzVG9nZ2xlQ2xvc2VkQ2FwdGlvbnNCdXR0b24sICgiOi13ZWJraXQtbWVk
aWEtY29udHJvbHMtdG9nZ2xlLWNsb3NlZC1jYXB0aW9ucy1idXR0b24iKSk7CisgICAgREVGSU5F
X1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIG1lZGlhQ29udHJvbHNTdGF0dXNEaXNwbGF5LCAo
Ijotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXN0YXR1cy1kaXNwbGF5IikpOworICAgIERFRklORV9T
VEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtZWRpYUNvbnRyb2xzRnVsbHNjcmVlbkJ1dHRvbiwg
KCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1mdWxsc2NyZWVuLWJ1dHRvbiIpKTsKKyAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVkaWFDb250cm9sc1RpbWVsaW5lQ29udGFp
bmVyLCAoIjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXRpbWVsaW5lLWNvbnRhaW5lciIpKTsKKyAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVkaWFDb250cm9sc1ZvbHVtZVNs
aWRlckNvbnRhaW5lciwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy12b2x1bWUtc2xpZGVyLWNv
bnRhaW5lciIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVkaWFD
b250cm9sc0N1cnJlbnRUaW1lRGlzcGxheSwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1jdXJy
ZW50LXRpbWUtZGlzcGxheSIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmlu
ZywgbWVkaWFDb250cm9sc1RpbWVSZW1haW5pbmdEaXNwbGF5LCAoIjotd2Via2l0LW1lZGlhLWNv
bnRyb2xzLXRpbWUtcmVtYWluaW5nLWRpc3BsYXkiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChBdG9taWNTdHJpbmcsIHJlc2l6ZXIsICgiOi13ZWJraXQtcmVzaXplciIpKTsKKyAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgc2Nyb2xsYmFyLCAoIjotd2Via2l0LXNjcm9s
bGJhciIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgc2Nyb2xsYmFy
QnV0dG9uLCAoIjotd2Via2l0LXNjcm9sbGJhci1idXR0b24iKSk7CisgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChBdG9taWNTdHJpbmcsIHNjcm9sbGJhckNvcm5lciwgKCI6LXdlYmtpdC1zY3JvbGxi
YXItY29ybmVyIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBzY3Jv
bGxiYXJUaHVtYiwgKCI6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIiKSk7CisgICAgREVGSU5FX1NU
QVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIHNjcm9sbGJhclRyYWNrLCAoIjotd2Via2l0LXNjcm9s
bGJhci10cmFjayIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgc2Ny
b2xsYmFyVHJhY2tQaWVjZSwgKCI6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2UiKSk7Cisg
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIHNlYXJjaENhbmNlbEJ1dHRvbiwg
KCI6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xP
Q0FMKEF0b21pY1N0cmluZywgc2VhcmNoRGVjb3JhdGlvbiwgKCI6LXdlYmtpdC1zZWFyY2gtZGVj
b3JhdGlvbiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgc2VhcmNo
UmVzdWx0c0RlY29yYXRpb24sICgiOi13ZWJraXQtc2VhcmNoLXJlc3VsdHMtZGVjb3JhdGlvbiIp
KTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgc2VhcmNoUmVzdWx0c0J1
dHRvbiwgKCI6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1idXR0b24iKSk7CisgICAgREVGSU5FX1NU
QVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIHNlbGVjdGlvbiwgKCI6c2VsZWN0aW9uIikpOworICAg
IERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBzbGlkZXJUaHVtYiwgKCI6LXdlYmtp
dC1zbGlkZXItdGh1bWIiKSk7CisKKyAgICBpZiAodmFsdWUgPT0gYWZ0ZXIpCisgICAgICAgIHJl
dHVybiBBRlRFUjsKKyAgICBpZiAodmFsdWUgPT0gYmVmb3JlKQorICAgICAgICByZXR1cm4gQkVG
T1JFOworICAgIGlmICh2YWx1ZSA9PSBmaWxlVXBsb2FkQnV0dG9uKQorICAgICAgICByZXR1cm4g
RklMRV9VUExPQURfQlVUVE9OOworI2lmIEVOQUJMRShEQVRBTElTVCkKKyAgICBpZiAodmFsdWUg
PT0gaW5wdXRMaXN0QnV0dG9uKQorICAgICAgICByZXR1cm4gSU5QVVRfTElTVF9CVVRUT047Cisj
ZW5kaWYKKyAgICBpZiAodmFsdWUgPT0gaW5wdXRQbGFjZWhvbGRlcikKKyAgICAgICAgcmV0dXJu
IElOUFVUX1BMQUNFSE9MREVSOworICAgIGlmICh2YWx1ZSA9PSBmaXJzdExldHRlcikKKyAgICAg
ICAgcmV0dXJuIEZJUlNUX0xFVFRFUjsKKyAgICBpZiAodmFsdWUgPT0gZmlyc3RMaW5lKQorICAg
ICAgICByZXR1cm4gRklSU1RfTElORTsKKyAgICBpZiAodmFsdWUgPT0gbWVkaWFDb250cm9sc1Bh
bmVsKQorICAgICAgICByZXR1cm4gTUVESUFfQ09OVFJPTFNfUEFORUw7CisgICAgaWYgKHZhbHVl
ID09IG1lZGlhQ29udHJvbHNNdXRlQnV0dG9uKQorICAgICAgICByZXR1cm4gTUVESUFfQ09OVFJP
TFNfTVVURV9CVVRUT047CisgICAgaWYgKHZhbHVlID09IG1lZGlhQ29udHJvbHNQbGF5QnV0dG9u
KQorICAgICAgICByZXR1cm4gTUVESUFfQ09OVFJPTFNfUExBWV9CVVRUT047CisgICAgaWYgKHZh
bHVlID09IG1lZGlhQ29udHJvbHNDdXJyZW50VGltZURpc3BsYXkpCisgICAgICAgIHJldHVybiBN
RURJQV9DT05UUk9MU19DVVJSRU5UX1RJTUVfRElTUExBWTsKKyAgICBpZiAodmFsdWUgPT0gbWVk
aWFDb250cm9sc1RpbWVSZW1haW5pbmdEaXNwbGF5KQorICAgICAgICByZXR1cm4gTUVESUFfQ09O
VFJPTFNfVElNRV9SRU1BSU5JTkdfRElTUExBWTsKKyAgICBpZiAodmFsdWUgPT0gbWVkaWFDb250
cm9sc1RpbWVsaW5lKQorICAgICAgICByZXR1cm4gTUVESUFfQ09OVFJPTFNfVElNRUxJTkU7Cisg
ICAgaWYgKHZhbHVlID09IG1lZGlhQ29udHJvbHNWb2x1bWVTbGlkZXIpCisgICAgICAgIHJldHVy
biBNRURJQV9DT05UUk9MU19WT0xVTUVfU0xJREVSOworICAgIGlmICh2YWx1ZSA9PSBtZWRpYUNv
bnRyb2xzU2Vla0JhY2tCdXR0b24pCisgICAgICAgIHJldHVybiBNRURJQV9DT05UUk9MU19TRUVL
X0JBQ0tfQlVUVE9OOworICAgIGlmICh2YWx1ZSA9PSBtZWRpYUNvbnRyb2xzU2Vla0ZvcndhcmRC
dXR0b24pCisgICAgICAgIHJldHVybiBNRURJQV9DT05UUk9MU19TRUVLX0ZPUldBUkRfQlVUVE9O
OworICAgIGlmICh2YWx1ZSA9PSBtZWRpYUNvbnRyb2xzUmV3aW5kQnV0dG9uKQorICAgICAgICBy
ZXR1cm4gTUVESUFfQ09OVFJPTFNfUkVXSU5EX0JVVFRPTjsKKyAgICBpZiAodmFsdWUgPT0gbWVk
aWFDb250cm9sc1JldHVyblRvUmVhbHRpbWVCdXR0b24pCisgICAgICAgIHJldHVybiBNRURJQV9D
T05UUk9MU19SRVRVUk5fVE9fUkVBTFRJTUVfQlVUVE9OOworICAgIGlmICh2YWx1ZSA9PSBtZWRp
YUNvbnRyb2xzVG9nZ2xlQ2xvc2VkQ2FwdGlvbnNCdXR0b24pCisgICAgICAgIHJldHVybiBNRURJ
QV9DT05UUk9MU19UT0dHTEVfQ0xPU0VEX0NBUFRJT05TX0JVVFRPTjsKKyAgICBpZiAodmFsdWUg
PT0gbWVkaWFDb250cm9sc1N0YXR1c0Rpc3BsYXkpCisgICAgICAgIHJldHVybiBNRURJQV9DT05U
Uk9MU19TVEFUVVNfRElTUExBWTsKKyAgICBpZiAodmFsdWUgPT0gbWVkaWFDb250cm9sc0Z1bGxz
Y3JlZW5CdXR0b24pCisgICAgICAgIHJldHVybiBNRURJQV9DT05UUk9MU19GVUxMU0NSRUVOX0JV
VFRPTjsKKyAgICBpZiAodmFsdWUgPT0gbWVkaWFDb250cm9sc1RpbWVsaW5lQ29udGFpbmVyKQor
ICAgICAgICByZXR1cm4gTUVESUFfQ09OVFJPTFNfVElNRUxJTkVfQ09OVEFJTkVSOworICAgIGlm
ICh2YWx1ZSA9PSBtZWRpYUNvbnRyb2xzVm9sdW1lU2xpZGVyQ29udGFpbmVyKQorICAgICAgICBy
ZXR1cm4gTUVESUFfQ09OVFJPTFNfVk9MVU1FX1NMSURFUl9DT05UQUlORVI7CisgICAgaWYgKHZh
bHVlID09IHNjcm9sbGJhckNvcm5lcikKKyAgICAgICAgcmV0dXJuIFNDUk9MTEJBUl9DT1JORVI7
CisgICAgaWYgKHZhbHVlID09IHJlc2l6ZXIpCisgICAgICAgIHJldHVybiBSRVNJWkVSOworICAg
IGlmICh2YWx1ZSA9PSBzY3JvbGxiYXIpCisgICAgICAgIHJldHVybiBTQ1JPTExCQVI7CisgICAg
aWYgKHZhbHVlID09IHNjcm9sbGJhckJ1dHRvbikKKyAgICAgICAgcmV0dXJuIFNDUk9MTEJBUl9C
VVRUT047CisgICAgaWYgKHZhbHVlID09IHNjcm9sbGJhclRodW1iKQorICAgICAgICByZXR1cm4g
U0NST0xMQkFSX1RIVU1COworICAgIGlmICh2YWx1ZSA9PSBzY3JvbGxiYXJUcmFjaykKKyAgICAg
ICAgcmV0dXJuIFNDUk9MTEJBUl9UUkFDSzsKKyAgICBpZiAodmFsdWUgPT0gc2Nyb2xsYmFyVHJh
Y2tQaWVjZSkKKyAgICAgICAgcmV0dXJuIFNDUk9MTEJBUl9UUkFDS19QSUVDRTsKKyAgICBpZiAo
dmFsdWUgPT0gc2VhcmNoQ2FuY2VsQnV0dG9uKQorICAgICAgICByZXR1cm4gU0VBUkNIX0NBTkNF
TF9CVVRUT047CisgICAgaWYgKHZhbHVlID09IHNlYXJjaERlY29yYXRpb24pCisgICAgICAgIHJl
dHVybiBTRUFSQ0hfREVDT1JBVElPTjsKKyAgICBpZiAodmFsdWUgPT0gc2VhcmNoUmVzdWx0c0Rl
Y29yYXRpb24pCisgICAgICAgIHJldHVybiBTRUFSQ0hfUkVTVUxUU19ERUNPUkFUSU9OOworICAg
IGlmICh2YWx1ZSA9PSBzZWFyY2hSZXN1bHRzQnV0dG9uKQorICAgICAgICByZXR1cm4gU0VBUkNI
X1JFU1VMVFNfQlVUVE9OOworICAgIGlmICh2YWx1ZSA9PSBzZWxlY3Rpb24pCisgICAgICAgIHJl
dHVybiBTRUxFQ1RJT047CisgICAgaWYgKHZhbHVlID09IHNsaWRlclRodW1iKQorICAgICAgICBy
ZXR1cm4gU0xJREVSX1RIVU1COworICAgIHJldHVybiBOT1BTRVVETzsKK30KKwogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9jc3MvQ1NTQ29tcHV0ZWRTdHlsZURl
Y2xhcmF0aW9uLmggYi9XZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uaApp
bmRleCA4NDJhOTk1Li5mMmRhZDQ5IDEwMDY0NAotLS0gYS9XZWJDb3JlL2Nzcy9DU1NDb21wdXRl
ZFN0eWxlRGVjbGFyYXRpb24uaAorKysgYi9XZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVj
bGFyYXRpb24uaApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSAiQ1NTU3R5bGVEZWNsYXJh
dGlvbi5oIgogI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZUNvbnN0YW50
cy5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTMzLDcgKzM0LDcgQEAgZW51bSBFVXBk
YXRlTGF5b3V0IHsgRG9Ob3RVcGRhdGVMYXlvdXQgPSBmYWxzZSwgVXBkYXRlTGF5b3V0ID0gdHJ1
ZSB9OwogCiBjbGFzcyBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24gOiBwdWJsaWMgQ1NTU3R5
bGVEZWNsYXJhdGlvbiB7CiBwdWJsaWM6Ci0gICAgZnJpZW5kIFBhc3NSZWZQdHI8Q1NTQ29tcHV0
ZWRTdHlsZURlY2xhcmF0aW9uPiBjb21wdXRlZFN0eWxlKFBhc3NSZWZQdHI8Tm9kZT4pOworICAg
IGZyaWVuZCBQYXNzUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4gY29tcHV0ZWRT
dHlsZShQYXNzUmVmUHRyPE5vZGU+LCBQc2V1ZG9JZCBwc2V1ZG9FbHQgPSBOT1BTRVVETyk7CiAg
ICAgdmlydHVhbCB+Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uKCk7CiAKICAgICB2aXJ0dWFs
IFN0cmluZyBjc3NUZXh0KCkgY29uc3Q7CkBAIC01NiwxMSArNTcsMTIgQEAgcHVibGljOgogICAg
IFBhc3NSZWZQdHI8Q1NTVmFsdWU+IGdldFNWR1Byb3BlcnR5Q1NTVmFsdWUoaW50IHByb3BlcnR5
SUQsIEVVcGRhdGVMYXlvdXQpIGNvbnN0OwogI2VuZGlmCiAKKyAgICBzdGF0aWMgUHNldWRvSWQg
Z2V0UHNldWRvSWQoY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSk7CiBwcm90ZWN0ZWQ6CiAgICAg
dmlydHVhbCBib29sIGNzc1Byb3BlcnR5TWF0Y2hlcyhjb25zdCBDU1NQcm9wZXJ0eSopIGNvbnN0
OwogCiBwcml2YXRlOgotICAgIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbihQYXNzUmVmUHRy
PE5vZGU+KTsKKyAgICBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24oUGFzc1JlZlB0cjxOb2Rl
PiwgUHNldWRvSWQgcCA9IE5PUFNFVURPKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRDc3NUZXh0
KGNvbnN0IFN0cmluZyYsIEV4Y2VwdGlvbkNvZGUmKTsKIApAQCAtNzAsMTEgKzcyLDEyIEBAIHBy
aXZhdGU6CiAgICAgUGFzc1JlZlB0cjxDU1NWYWx1ZT4gdmFsdWVGb3JTaGFkb3coY29uc3QgU2hh
ZG93RGF0YSosIGludCkgY29uc3Q7CiAKICAgICBSZWZQdHI8Tm9kZT4gbV9ub2RlOworICAgIFBz
ZXVkb0lkIG1fcHNldWRvU3R5bGU7CiB9OwogCi1pbmxpbmUgUGFzc1JlZlB0cjxDU1NDb21wdXRl
ZFN0eWxlRGVjbGFyYXRpb24+IGNvbXB1dGVkU3R5bGUoUGFzc1JlZlB0cjxOb2RlPiBub2RlKQor
aW5saW5lIFBhc3NSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uPiBjb21wdXRlZFN0
eWxlKFBhc3NSZWZQdHI8Tm9kZT4gbm9kZSwgUHNldWRvSWQgcHNldWRvRWx0KQogewotICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uKG5vZGUpKTsKKyAg
ICByZXR1cm4gYWRvcHRSZWYobmV3IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbihub2RlLCBw
c2V1ZG9FbHQpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wYWdlL0RPTVdpbmRvdy5jcHAgYi9XZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNwcAppbmRl
eCA3NTdlMzJmLi45MDk4YTYxIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNw
cAorKysgYi9XZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNwcApAQCAtMTA1NiwxMyArMTA1NiwxMiBA
QCBQYXNzUmVmUHRyPE1lZGlhPiBET01XaW5kb3c6Om1lZGlhKCkgY29uc3QKICAgICByZXR1cm4g
TWVkaWE6OmNyZWF0ZShjb25zdF9jYXN0PERPTVdpbmRvdyo+KHRoaXMpKTsKIH0KIAotUGFzc1Jl
ZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiBET01XaW5kb3c6OmdldENvbXB1dGVkU3R5bGUoRWxl
bWVudCogZWx0LCBjb25zdCBTdHJpbmcmKSBjb25zdAorUGFzc1JlZlB0cjxDU1NTdHlsZURlY2xh
cmF0aW9uPiBET01XaW5kb3c6OmdldENvbXB1dGVkU3R5bGUoRWxlbWVudCogZWx0LCBjb25zdCBT
dHJpbmcmIHBzZXVkb0VsdCkgY29uc3QKIHsKICAgICBpZiAoIWVsdCkKICAgICAgICAgcmV0dXJu
IDA7CiAKLSAgICAvLyBGSVhNRTogVGhpcyBuZWVkcyB0YWtlIHBzZXVkbyBlbGVtZW50cyBpbnRv
IGFjY291bnQuCi0gICAgcmV0dXJuIGNvbXB1dGVkU3R5bGUoZWx0KTsKKyAgICByZXR1cm4gY29t
cHV0ZWRTdHlsZShlbHQsIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6Z2V0UHNldWRvSWQo
QXRvbWljU3RyaW5nKHBzZXVkb0VsdCkpKTsKIH0KIAogUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
RE9NV2luZG93OjpnZXRNYXRjaGVkQ1NTUnVsZXMoRWxlbWVudCogZWx0LCBjb25zdCBTdHJpbmcm
IHBzZXVkb0VsdCwgYm9vbCBhdXRob3JPbmx5KSBjb25zdAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50157</attachid>
            <date>2010-03-06 16:28:49 -0800</date>
            <delta_ts>2010-03-15 14:36:47 -0700</delta_ts>
            <desc>First steps towards exposing the standard pseudo-elements through getComputedStyle</desc>
            <filename>firstStepsTowardsExposingPseudoElementStyles.patch</filename>
            <type>text/plain</type>
            <size>25179</size>
            <attacher name="Jessie Berlin">jberlin</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCAwNDk3MWZjLi42MDkzMTE0IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDMt
MDYgIEplc3NpZSBCZXJsaW4gIDxqYmVybGluQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRmlyc3Qgc3RlcHMgdG93YXJkcyBmaXhp
bmcgYnVnIDI0MDIxIC0gcHNldWRvLWVsZW1lbnQgc3R5bGVzIG5vdCBhY2Nlc3NpYmxlIC8gcmV0
cmlldmFibGUgdmlhIERPTSBtZXRob2RzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjQwMjEKKworICAgICAgICAqIGZhc3QvY3NzL2dldENvbXB1dGVk
U3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50LWV4cGVjdGVkLnR4dDog
QWRkZWQuCisgICAgICAgICogZmFzdC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0
eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQuaHRtbDogQWRkZWQuCisKIDIwMTAtMDMtMDUgIFNpbW9u
IEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
RGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9nZXRDb21wdXRl
ZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC1leHBlY3RlZC50eHQg
Yi9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9nZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUt
d2l0aC1wc2V1ZG8tZWxlbWVudC1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uMjIwMTg4YQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zhc3Qv
Y3NzL2dldENvbXB1dGVkU3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50
LWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDE3IEBACitUZXN0IGZvciBXZWJLaXQgYnVnIDI0MDIx
OiBwc2V1ZG8tZWxlbWVudCBzdHlsZXMgbm90IGFjY2Vzc2libGUgLyByZXRyaWV2YWJsZSB2aWEg
RE9NIG1ldGhvZHMKKworCitvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBh
ZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJv
cmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMg
bm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBl
YSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVy
aXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEg
cGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQs
IHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxh
Ym9ydW0uCisKK01pZGRsZSAKKworVGhlcmUgYXJlIG5vIHBzZXVkbyBlbGVtZW50cyBkZWZpbmVk
IG9uIHRoaXMgZGl2LgorCitQQVNTIEV4cGVjdGVkICdyZ2IoMTY1LCA0MiwgNDIpJyBmb3IgY29s
b3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEZpcnN0cyBh
bmQgcHNldWRvLWVsZW1lbnQgOmZpcnN0LWxpbmUgYW5kIGdvdCAncmdiKDE2NSwgNDIsIDQyKScK
K1BBU1MgRXhwZWN0ZWQgJ3JnYigwLCAwLCAyNTUpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVk
IHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1lbnQg
OmZpcnN0LWxldHRlciBhbmQgZ290ICdyZ2IoMCwgMCwgMjU1KScKK1BBU1MgRXhwZWN0ZWQgJ3Jn
YigwLCAwLCAwKScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3
aXRoIGlkIHRlc3RGaXJzdHMgYW5kIHBzZXVkby1lbGVtZW50IG51bGwgYW5kIGdvdCAncmdiKDAs
IDAsIDApJworUEFTUyBFeHBlY3RlZCAncmdiKDE2NSwgNDIsIDQyKScgZm9yIGNvbG9yIGluIHRo
ZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3RCZWZvcmVBZnRlciBhbmQg
cHNldWRvLWVsZW1lbnQgOmJlZm9yZSBhbmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIpJworUEFTUyBF
eHBlY3RlZCAncmdiKDAsIDAsIDI1NSknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUg
Zm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0QmVmb3JlQWZ0ZXIgYW5kIHBzZXVkby1lbGVtZW50IDph
ZnRlciBhbmQgZ290ICdyZ2IoMCwgMCwgMjU1KScKK1BBU1MgRXhwZWN0ZWQgJ3JnYigxNjUsIDQy
LCA0MiknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBp
ZCB0ZXN0Tm9Qc2V1ZG9FbGVtZW50IGFuZCBwc2V1ZG8tZWxlbWVudCBudWxsIGFuZCBnb3QgJ3Jn
YigxNjUsIDQyLCA0MiknCitQQVNTIEV4cGVjdGVkICcnIGZvciBjb2xvciBpbiB0aGUgY29tcHV0
ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Tm9Qc2V1ZG9FbGVtZW50IGFuZCBwc2V1
ZG8tZWxlbWVudCA6Zmlyc3QtbGluZSBhbmQgZ290ICcnCitQQVNTIEV4cGVjdGVkICdyZ2IoMTY1
LCA0MiwgNDIpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdp
dGggaWQgdGVzdE5vUHNldWRvRWxlbWVudCBhbmQgcHNldWRvLWVsZW1lbnQgOmdhcmJhZ2UgYW5k
IGdvdCAncmdiKDE2NSwgNDIsIDQyKScKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3QvY3Nz
L2dldENvbXB1dGVkU3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50Lmh0
bWwgYi9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9nZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5
bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmU2MTg5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9n
ZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC5odG1s
CkBAIC0wLDAgKzEsODkgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+CisgIDxoZWFkPgorICAg
IDx0aXRsZT5UZXN0IGZvciBXZWJLaXQgYnVnIDI0MDIxOiBwc2V1ZG8tZWxlbWVudCBzdHlsZXMg
bm90IGFjY2Vzc2libGUgLyByZXRyaWV2YWJsZSB2aWEgRE9NIG1ldGhvZHM8L3RpdGxlPgorICAg
IDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAjdGVzdEZpcnN0czpmaXJzdC1saW5lIHsK
KyAgICAgICAgICBjb2xvcjogYnJvd247CisgICAgICB9CisKKyAgICAgICN0ZXN0Rmlyc3RzOmZp
cnN0LWxldHRlciB7CisgICAgICAgICAgY29sb3I6IGJsdWU7CisgICAgICB9CisKKyAgICAgICN0
ZXN0QmVmb3JlQWZ0ZXI6OmJlZm9yZSB7CisgICAgICAgICAgY29udGVudDogIlRoaXMgc2hvdWxk
IGJlIGJyb3duICI7CisgICAgICAgICAgY29sb3I6IGJyb3duOworICAgICAgfQorCisgICAgICAj
dGVzdEJlZm9yZUFmdGVyOjphZnRlciB7CisgICAgICAgICAgY29udGVudDogImFuZCB0aGlzIHNo
b3VsZCBiZSBibHVlIjsKKyAgICAgICAgICBjb2xvcjogYmx1ZTsKKyAgICAgIH0KKworICAgICAg
I3Rlc3ROb1BzZXVkb0VsZW1lbnQgeworICAgICAgICAgIGNvbG9yOiBicm93bjsKKyAgICAgIH0K
KworICAgICAgLnNtYWxsQm94IHsKKyAgICAgICAgICB3aWR0aDogNzVweDsKKyAgICAgICAgICBo
ZWlnaHQ6IDc1cHg7CisgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTsKKyAgICAgICAg
ICBvdmVyZmxvdzogc2Nyb2xsOworICAgICAgfQorCisgICAgICAucGFzcyB7CisgICAgICAgICAg
Y29sb3I6IGdyZWVuOworICAgICAgfQorCisgICAgICAuZmFpbCB7CisgICAgICAgICAgY29sb3I6
IHJlZDsKKyAgICAgIH0KKworICAgIDwvc3R5bGU+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2ph
dmFzY3JpcHQiPgorICAgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAg
ICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisKKyAgICAgIHZhciB0ZXN0
cyA9IFsKKyAgICAgICAgeyAnZWxlbWVudElkJyA6ICd0ZXN0Rmlyc3RzJywgJ3BzZXVkb0VsZW1l
bnQnIDogJzpmaXJzdC1saW5lJywgJ3Byb3BlcnR5JyA6ICdjb2xvcicsICdleHBlY3RlZFZhbHVl
JyA6ICdyZ2IoMTY1LCA0MiwgNDIpJyB9LAorICAgICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3RG
aXJzdHMnLCAncHNldWRvRWxlbWVudCcgOiAnOmZpcnN0LWxldHRlcicsICdwcm9wZXJ0eScgOiAn
Y29sb3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDAsIDAsIDI1NSknIH0sCisgICAgICAgIHsg
J2VsZW1lbnRJZCcgOiAndGVzdEZpcnN0cycsICdwc2V1ZG9FbGVtZW50JyA6IG51bGwsICdwcm9w
ZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDAsIDAsIDApJyB9LAorICAg
ICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3RCZWZvcmVBZnRlcicsICdwc2V1ZG9FbGVtZW50JyA6
ICc6YmVmb3JlJywgJ3Byb3BlcnR5JyA6ICdjb2xvcicsICdleHBlY3RlZFZhbHVlJyA6ICdyZ2Io
MTY1LCA0MiwgNDIpJyB9LAorICAgICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3RCZWZvcmVBZnRl
cicsICdwc2V1ZG9FbGVtZW50JyA6ICc6YWZ0ZXInLCAncHJvcGVydHknIDogJ2NvbG9yJywgJ2V4
cGVjdGVkVmFsdWUnIDogJ3JnYigwLCAwLCAyNTUpJyB9LAorICAgICAgICB7ICdlbGVtZW50SWQn
IDogJ3Rlc3ROb1BzZXVkb0VsZW1lbnQnLCAncHNldWRvRWxlbWVudCcgOiBudWxsLCAncHJvcGVy
dHknIDogJ2NvbG9yJywgJ2V4cGVjdGVkVmFsdWUnIDogJ3JnYigxNjUsIDQyLCA0MiknIH0sCisg
ICAgICAgIHsgJ2VsZW1lbnRJZCcgOiAndGVzdE5vUHNldWRvRWxlbWVudCcsICdwc2V1ZG9FbGVt
ZW50JyA6ICc6Zmlyc3QtbGluZScsICdwcm9wZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1
ZScgOiAnJyB9LAorICAgICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3ROb1BzZXVkb0VsZW1lbnQn
LCAncHNldWRvRWxlbWVudCcgOiAnOmdhcmJhZ2UnLCAncHJvcGVydHknIDogJ2NvbG9yJywgJ2V4
cGVjdGVkVmFsdWUnIDogJ3JnYigxNjUsIDQyLCA0MiknIH0KKyAgICAgIF07CisKKyAgICAgIGZ1
bmN0aW9uIHJ1blRlc3RzKCkKKyAgICAgIHsKKyAgICAgICAgdmFyIHJlc3VsdHNFbGVtZW50ID0g
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHMnKTsKKworICAgICAgICB0ZXN0cy5mb3JF
YWNoKGZ1bmN0aW9uKGN1clRlc3QpIHsKKyAgICAgICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHdp
bmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGN1clRlc3QuZWxl
bWVudElkKSwgY3VyVGVzdC5wc2V1ZG9FbGVtZW50KTsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBj
b21wdXRlZFN0eWxlW2N1clRlc3QucHJvcGVydHldOworICAgICAgICAgIHZhciBtc2cgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgICB2YXIgbWFpbk1lc3NhZ2UgPSAi
IEV4cGVjdGVkICciICsgY3VyVGVzdC5leHBlY3RlZFZhbHVlICsgIicgZm9yICIgKyBjdXJUZXN0
LnByb3BlcnR5ICsKKyAgICAgICAgICAgICAgIiBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVs
ZW1lbnQgd2l0aCBpZCAiICsgY3VyVGVzdC5lbGVtZW50SWQgKyAiIGFuZCBwc2V1ZG8tZWxlbWVu
dCAiICsgY3VyVGVzdC5wc2V1ZG9FbGVtZW50OworICAgICAgICAgIGlmICh2YWx1ZSA9PSBjdXJU
ZXN0LmV4cGVjdGVkVmFsdWUpCisgICAgICAgICAgICAgIG1zZy5pbm5lckhUTUwgPSAiPHNwYW4g
Y2xhc3M9J3Bhc3MnPlBBU1M8L3NwYW4+IiArIG1haW5NZXNzYWdlICsgIiBhbmQgZ290ICciICsg
dmFsdWUgKyAiJyI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtc2cuaW5uZXJIVE1M
ID0gIjxzcGFuIGNsYXNzPSdmYWlsJz5GQUlMPC9zcGFuPiBFeHBlY3RlZCAiICsgbWFpbk1lc3Nh
Z2UgKyAiIGJ1dCBpbnN0ZWFkIGdvdCAnIiArIHZhbHVlICsgIiciOworICAgICAgICAgIHJlc3Vs
dHNFbGVtZW50LmFwcGVuZENoaWxkKG1zZyk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIDwv
c2NyaXB0PgorICA8L2hlYWQ+CisgIDxib2R5IG9ubG9hZD0icnVuVGVzdHMoKTsiPgorICAgIDxo
Mz5UZXN0IGZvciA8YSBocmVmPSJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjQwMjEiPldlYktpdCBidWcgMjQwMjE8L2E+OiBwc2V1ZG8tZWxlbWVudCBzdHlsZXMgbm90
IGFjY2Vzc2libGUgLyByZXRyaWV2YWJsZSB2aWEgRE9NIG1ldGhvZHM8L2gzPgorICAgIDxiciAv
PgorICAgIDxkaXYgaWQ9InRlc3RGaXJzdHMiPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBj
b25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRp
ZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2
ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQg
YWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGlu
IHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBm
dWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBu
b24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFu
aW0gaWQgZXN0IGxhYm9ydW0uPC9kaXY+CisgICAgPGJyIC8+CisgICAgPGRpdiBpZD0idGVzdEJl
Zm9yZUFmdGVyIj4gTWlkZGxlIDwvZGl2PgorICAgIDxiciAvPgorICAgIDxkaXYgaWQ9InRlc3RO
b1BzZXVkb0VsZW1lbnQiPlRoZXJlIGFyZSBubyBwc2V1ZG8gZWxlbWVudHMgZGVmaW5lZCBvbiB0
aGlzIGRpdi48L2Rpdj4KKyAgICA8YnIgLz4KKyAgICA8ZGl2IGlkPSJyZXN1bHRzIj48L2Rpdj4K
KyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJD
b3JlL0NoYW5nZUxvZwppbmRleCAxZjJkODc0Li44YzY5ZjQ1IDEwMDY0NAotLS0gYS9XZWJDb3Jl
L0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ0IEBACisyMDEw
LTAzLTA2ICBKZXNzaWUgQmVybGluICA8amJlcmxpbkB3ZWJraXQub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZpcnN0IHN0ZXBzIHRvd2FyZHMg
Zml4aW5nIGJ1ZyAyNDAyMSAtIHBzZXVkby1lbGVtZW50IHN0eWxlcyBub3QgYWNjZXNzaWJsZSAv
IHJldHJpZXZhYmxlIHZpYSBET00gbWV0aG9kcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTI0MDIxCisKKyAgICAgICAgQWxsb3dzIGFjY2VzcyB0byB0
aGUgY29tcHV0ZWQgc3R5bGVzIGZvciB0aGUgcHNldWRvLWVsZW1lbnRzIHRocm91Z2ggdGhlIHNl
Y29uZCBhcmd1bWVudCB0byBnZXRDb21wdXRlZFN0eWxlLgorICAgICAgICBUaGlzIGFwcHJvYWNo
IGRvZXMgbm90IHByb3ZpZGUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAnbGVuZ3RoJyBwcm9wZXJ0
aWVzIGFuZCBkb2VzIG5vdCB3b3JrIGZvciB0aGUgJzpzZWxlY3Rpb24nIHBzZXVkby1lbGVtZW50
IGFuZCB3aWxsIGluc3RlYWQgcmV0dXJuIHJlc3VsdHMgc2ltaWxpYXIgdG8gdGhvc2UgcmV0dXJu
ZWQgYnkgRmlyZWZveC4KKyAgICAgICAgVGhvc2UgdmFsdWVzIG5lZWQgdG8gYmUgcmV0cmlldmVk
IGZyb20gdGhlIHJlbmRlcmVyIGZvciB0aGUgcHNldWRvLWVsZW1lbnQgYXMgb3Bwb3NlZCB0byB0
aGUgUmVuZGVyU3R5bGUgZm9yIHRoZSBlbGVtZW50IG9uIHdoaWNoIHRoZSBwc2V1ZG8tZWxlbWVu
dCBpcyBkZWZpbmVkLCB3aGljaCBpcyBmdXJ0aGVyIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRo
YXQgbm90IGFsbCBlbGVtZW50cyBoYXZlIHJlbmRlcmVycy4KKworICAgICAgICBUZXN0OiBmYXN0
L2Nzcy9nZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVu
dC5odG1sCisKKyAgICAgICAgKiBjc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6Q1NTQ29tcHV0
ZWRTdHlsZURlY2xhcmF0aW9uKToKKyAgICAgICAgU3RvcmUgdGhlIHBzZXVkby1lbGVtZW50Lgor
ICAgICAgICAoV2ViQ29yZTo6Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpnZXRGb250U2l6
ZUNTU1ZhbHVlUHJlZmVycmluZ0tleXdvcmQpOgorICAgICAgICBUYWtlIGludG8gY29uc2lkZXJh
dGlvbiB0aGUgcHNldWRvLWVsZW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpDU1NDb21wdXRlZFN0
eWxlRGVjbGFyYXRpb246OmdldFByb3BlcnR5Q1NTVmFsdWUpOgorICAgICAgICBkaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6bGVuZ3RoKToKKyAg
ICAgICAgZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRp
b246OmNzc1Byb3BlcnR5TWF0Y2hlcyk6CisgICAgICAgIGRpdHRvLgorICAgICAgICAoV2ViQ29y
ZTo6Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpnZXRQc2V1ZG9JZCk6CisgICAgICAgIFBh
cnNlIHRoZSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIHVzZXIgZm9yIHRoZSBwc2V1ZG8tZWxlbWVu
dCBpbnRvIGEgUHNldWRvSWQuCisgICAgICAgICogY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJh
dGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZWRTdHlsZSkKKyAgICAgICAgVGFrZSBp
bnRvIGNvbnNpZGVyYXRpb24gdGhlIHBzZXVkby1lbGVtZW50LgorICAgICAgICAqIGRvbS9FbGVt
ZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OmNvbXB1dGVkU3R5bGUpOgorICAg
ICAgICBJZiB0aGUgcHNldWRvLWVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGVuIHJldHVybiB0aGUg
Y2FjaGVkIFJlbmRlclN0eWxlIGZvciB0aGF0IFBzZXVkb0lkLgorICAgICAgICAqIGRvbS9FbGVt
ZW50Lmg6CisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6
Y29tcHV0ZWRTdHlsZSk6CisgICAgICAgIFRha2UgaW50byBjb25zaWRlcmF0aW9uIHRoZSBwc2V1
ZG8tZWxlbWVudC4KKyAgICAgICAgKiBkb20vTm9kZS5oOgorICAgICAgICAqIHBhZ2UvRE9NV2lu
ZG93LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRPTVdpbmRvdzo6Z2V0Q29tcHV0ZWRTdHlsZSk6
CisgICAgICAgIGRpdHRvLgorCiAyMDEwLTAzLTA1ICBDc2FiYSBPc3p0cm9nb27DoWMgIDxvc3N5
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCBidWlsZGZpeCBhZnRlciByNTU1OTMu
IChUbyBmaXggUXQgLS1taW5pbWFsIGJ1aWxkLikKZGlmZiAtLWdpdCBhL1dlYkNvcmUvY3NzL0NT
U0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAgYi9XZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0
eWxlRGVjbGFyYXRpb24uY3BwCmluZGV4IGY3YzVkYzQuLjk2YjVlODUgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAKKysrIGIvV2ViQ29yZS9j
c3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNwcApAQCAtNTAwLDggKzUwMCw5IEBAIHN0
YXRpYyBQYXNzUmVmUHRyPENTU1ZhbHVlPiBnZXRUaW1pbmdGdW5jdGlvblZhbHVlKGNvbnN0IEFu
aW1hdGlvbkxpc3QqIGFuaW1MaXN0CiAgICAgcmV0dXJuIGxpc3QucmVsZWFzZSgpOwogfQogCi1D
U1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbihQ
YXNzUmVmUHRyPE5vZGU+IG4pCitDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OkNTU0NvbXB1
dGVkU3R5bGVEZWNsYXJhdGlvbihQYXNzUmVmUHRyPE5vZGU+IG4sIFBzZXVkb0lkIHApCiAgICAg
OiBtX25vZGUobikKKyAgICAsIG1fcHNldWRvRWx0KHApCiB7CiB9CiAKQEAgLTU0NSw3ICs1NDYs
NyBAQCBQYXNzUmVmUHRyPENTU1ZhbHVlPiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246Omdl
dEZvbnRTaXplQ1NTVmFsdWVQcmVmZXJyaW5nSwogCiAgICAgbm9kZS0+ZG9jdW1lbnQoKS0+dXBk
YXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7CiAKLSAgICBSZWZQdHI8UmVuZGVy
U3R5bGU+IHN0eWxlID0gbm9kZS0+Y29tcHV0ZWRTdHlsZSgpOworICAgIFJlZlB0cjxSZW5kZXJT
dHlsZT4gc3R5bGUgPSBub2RlLT5jb21wdXRlZFN0eWxlKG1fcHNldWRvRWx0KTsKICAgICBpZiAo
IXN0eWxlKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtNjY2LDcgKzY2Nyw4IEBAIFBhc3NSZWZQ
dHI8Q1NTVmFsdWU+IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6Z2V0UHJvcGVydHlDU1NW
YWx1ZShpbnQgcHJvcGVyCiAgICAgaWYgKHJlbmRlcmVyICYmIGhhc0NvbXBvc2l0ZWRMYXllcihy
ZW5kZXJlcikgJiYgQW5pbWF0aW9uQ29udHJvbGxlcjo6c3VwcG9ydHNBY2NlbGVyYXRlZEFuaW1h
dGlvbk9mUHJvcGVydHkoc3RhdGljX2Nhc3Q8Q1NTUHJvcGVydHlJRD4ocHJvcGVydHlJRCkpKQog
ICAgICAgICBzdHlsZSA9IHJlbmRlcmVyLT5hbmltYXRpb24oKS0+Z2V0QW5pbWF0ZWRTdHlsZUZv
clJlbmRlcmVyKHJlbmRlcmVyKTsKICAgICBlbHNlCi0gICAgICAgc3R5bGUgPSBub2RlLT5jb21w
dXRlZFN0eWxlKCk7CisgICAgICAgIHN0eWxlID0gbm9kZS0+Y29tcHV0ZWRTdHlsZShtX3BzZXVk
b0VsdCk7CisKICAgICBpZiAoIXN0eWxlKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtMTQ5MCw3
ICsxNDkyLDcgQEAgdW5zaWduZWQgQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpsZW5ndGgo
KSBjb25zdAogICAgIGlmICghbm9kZSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBSZW5kZXJT
dHlsZSogc3R5bGUgPSBub2RlLT5jb21wdXRlZFN0eWxlKCk7CisgICAgUmVuZGVyU3R5bGUqIHN0
eWxlID0gbm9kZS0+Y29tcHV0ZWRTdHlsZShtX3BzZXVkb0VsdCk7CiAgICAgaWYgKCFzdHlsZSkK
ICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTE1MDksNyArMTUxMSw3IEBAIGJvb2wgQ1NTQ29tcHV0
ZWRTdHlsZURlY2xhcmF0aW9uOjpjc3NQcm9wZXJ0eU1hdGNoZXMoY29uc3QgQ1NTUHJvcGVydHkq
IHByb3BlcnR5CiB7CiAgICAgaWYgKHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5Rm9udFNp
emUgJiYgcHJvcGVydHktPnZhbHVlKCktPmlzUHJpbWl0aXZlVmFsdWUoKSAmJiBtX25vZGUpIHsK
ICAgICAgICAgbV9ub2RlLT5kb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5
bGVzaGVldHMoKTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9ub2RlLT5jb21wdXRl
ZFN0eWxlKCk7CisgICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fbm9kZS0+Y29tcHV0ZWRT
dHlsZShtX3BzZXVkb0VsdCk7CiAgICAgICAgIGlmIChzdHlsZSAmJiBzdHlsZS0+Zm9udERlc2Ny
aXB0aW9uKCkua2V5d29yZFNpemUoKSkgewogICAgICAgICAgICAgaW50IHNpemVWYWx1ZSA9IGNz
c0lkZW50aWZpZXJGb3JGb250U2l6ZUtleXdvcmQoc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpLmtl
eXdvcmRTaXplKCkpOwogICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihwcm9wZXJ0eS0+dmFsdWUoKSk7
CkBAIC0xNTMxLDQgKzE1MzMsOTQgQEAgUGFzc1JlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJh
dGlvbj4gQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjptYWtlTXV0YWJsZSgKICAgICByZXR1
cm4gY29weSgpOwogfQogCitQc2V1ZG9JZCBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246Omdl
dFBzZXVkb0lkKGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUpCit7CisgICAgaWYgKCF2YWx1ZSkK
KyAgICAgICAgcmV0dXJuIE5PUFNFVURPOworCisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9t
aWNTdHJpbmcsIGFmdGVyLCAoIjphZnRlciIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0
b21pY1N0cmluZywgYmVmb3JlLCAoIjpiZWZvcmUiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChBdG9taWNTdHJpbmcsIGZpbGVVcGxvYWRCdXR0b24sICgiOi13ZWJraXQtZmlsZS11cGxvYWQt
YnV0dG9uIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBmaXJzdExl
dHRlciwgKCI6Zmlyc3QtbGV0dGVyIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWlj
U3RyaW5nLCBmaXJzdExpbmUsICgiOmZpcnN0LWxpbmUiKSk7CisjaWYgRU5BQkxFKERBVEFMSVNU
KQorICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBpbnB1dExpc3RCdXR0b24s
ICgiOi13ZWJraXQtaW5wdXQtbGlzdC1idXR0b24iKSk7CisjZW5kaWYKKyAgICBERUZJTkVfU1RB
VElDX0xPQ0FMKEF0b21pY1N0cmluZywgaW5wdXRQbGFjZWhvbGRlciwgKCI6LXdlYmtpdC1pbnB1
dC1wbGFjZWhvbGRlciIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywg
bWVkaWFDb250cm9sc1BhbmVsLCAoIjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXBhbmVsIikpOwor
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtZWRpYUNvbnRyb2xzTXV0ZUJ1
dHRvbiwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1tdXRlLWJ1dHRvbiIpKTsKKyAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVkaWFDb250cm9sc1BsYXlCdXR0b24sICgi
Oi13ZWJraXQtbWVkaWEtY29udHJvbHMtcGxheS1idXR0b24iKSk7CisgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChBdG9taWNTdHJpbmcsIG1lZGlhQ29udHJvbHNUaW1lbGluZSwgKCI6LXdlYmtpdC1t
ZWRpYS1jb250cm9scy10aW1lbGluZSIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21p
Y1N0cmluZywgbWVkaWFDb250cm9sc1ZvbHVtZVNsaWRlciwgKCI6LXdlYmtpdC1tZWRpYS1jb250
cm9scy12b2x1bWUtc2xpZGVyIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3Ry
aW5nLCBtZWRpYUNvbnRyb2xzU2Vla0JhY2tCdXR0b24sICgiOi13ZWJraXQtbWVkaWEtY29udHJv
bHMtc2Vlay1iYWNrLWJ1dHRvbiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0
cmluZywgbWVkaWFDb250cm9sc1NlZWtGb3J3YXJkQnV0dG9uLCAoIjotd2Via2l0LW1lZGlhLWNv
bnRyb2xzLXNlZWstZm9yd2FyZC1idXR0b24iKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChB
dG9taWNTdHJpbmcsIG1lZGlhQ29udHJvbHNSZXdpbmRCdXR0b24sICgiOi13ZWJraXQtbWVkaWEt
Y29udHJvbHMtcmV3aW5kLWJ1dHRvbiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21p
Y1N0cmluZywgbWVkaWFDb250cm9sc1JldHVyblRvUmVhbHRpbWVCdXR0b24sICgiOi13ZWJraXQt
bWVkaWEtY29udHJvbHMtcmV0dXJuLXRvLXJlYWx0aW1lLWJ1dHRvbiIpKTsKKyAgICBERUZJTkVf
U1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVkaWFDb250cm9sc1RvZ2dsZUNsb3NlZENhcHRp
b25zQnV0dG9uLCAoIjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXRvZ2dsZS1jbG9zZWQtY2FwdGlv
bnMtYnV0dG9uIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBtZWRp
YUNvbnRyb2xzU3RhdHVzRGlzcGxheSwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy1zdGF0dXMt
ZGlzcGxheSIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgbWVkaWFD
b250cm9sc0Z1bGxzY3JlZW5CdXR0b24sICgiOi13ZWJraXQtbWVkaWEtY29udHJvbHMtZnVsbHNj
cmVlbi1idXR0b24iKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIG1l
ZGlhQ29udHJvbHNUaW1lbGluZUNvbnRhaW5lciwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy10
aW1lbGluZS1jb250YWluZXIiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJp
bmcsIG1lZGlhQ29udHJvbHNWb2x1bWVTbGlkZXJDb250YWluZXIsICgiOi13ZWJraXQtbWVkaWEt
Y29udHJvbHMtdm9sdW1lLXNsaWRlci1jb250YWluZXIiKSk7CisgICAgREVGSU5FX1NUQVRJQ19M
T0NBTChBdG9taWNTdHJpbmcsIG1lZGlhQ29udHJvbHNDdXJyZW50VGltZURpc3BsYXksICgiOi13
ZWJraXQtbWVkaWEtY29udHJvbHMtY3VycmVudC10aW1lLWRpc3BsYXkiKSk7CisgICAgREVGSU5F
X1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIG1lZGlhQ29udHJvbHNUaW1lUmVtYWluaW5nRGlz
cGxheSwgKCI6LXdlYmtpdC1tZWRpYS1jb250cm9scy10aW1lLXJlbWFpbmluZy1kaXNwbGF5Iikp
OworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCByZXNpemVyLCAoIjotd2Vi
a2l0LXJlc2l6ZXIiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIHNj
cm9sbGJhciwgKCI6LXdlYmtpdC1zY3JvbGxiYXIiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChBdG9taWNTdHJpbmcsIHNjcm9sbGJhckJ1dHRvbiwgKCI6LXdlYmtpdC1zY3JvbGxiYXItYnV0
dG9uIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBzY3JvbGxiYXJD
b3JuZXIsICgiOi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lciIpKTsKKyAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKEF0b21pY1N0cmluZywgc2Nyb2xsYmFyVGh1bWIsICgiOi13ZWJraXQtc2Nyb2xsYmFy
LXRodW1iIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBzY3JvbGxi
YXJUcmFjaywgKCI6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2siKSk7CisgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChBdG9taWNTdHJpbmcsIHNjcm9sbGJhclRyYWNrUGllY2UsICgiOi13ZWJraXQtc2Ny
b2xsYmFyLXRyYWNrLXBpZWNlIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3Ry
aW5nLCBzZWFyY2hDYW5jZWxCdXR0b24sICgiOi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24i
KSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIHNlYXJjaERlY29yYXRp
b24sICgiOi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24iKSk7CisgICAgREVGSU5FX1NUQVRJQ19M
T0NBTChBdG9taWNTdHJpbmcsIHNlYXJjaFJlc3VsdHNEZWNvcmF0aW9uLCAoIjotd2Via2l0LXNl
YXJjaC1yZXN1bHRzLWRlY29yYXRpb24iKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9t
aWNTdHJpbmcsIHNlYXJjaFJlc3VsdHNCdXR0b24sICgiOi13ZWJraXQtc2VhcmNoLXJlc3VsdHMt
YnV0dG9uIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBzZWxlY3Rp
b24sICgiOnNlbGVjdGlvbiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmlu
Zywgc2xpZGVyVGh1bWIsICgiOi13ZWJraXQtc2xpZGVyLXRodW1iIikpOworCisgICAgc3RhdGlj
IEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFBzZXVkb0lkPiogcHNldWRvRWx0VG9Qc2V1ZG9J
ZE1hcCA9IDA7CisgICAgaWYgKCFwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwKSB7CisgICAgICAgIHBz
ZXVkb0VsdFRvUHNldWRvSWRNYXAgPSBuZXcgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgUHNl
dWRvSWQ+OworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQoYWZ0ZXIuaW1wbCgp
LCBBRlRFUik7CisgICAgICAgIHBzZXVkb0VsdFRvUHNldWRvSWRNYXAtPnNldChiZWZvcmUuaW1w
bCgpLCBCRUZPUkUpOworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQoZmlsZVVw
bG9hZEJ1dHRvbi5pbXBsKCksIEZJTEVfVVBMT0FEX0JVVFRPTik7CisgICAgICAgIHBzZXVkb0Vs
dFRvUHNldWRvSWRNYXAtPnNldChmaXJzdExldHRlci5pbXBsKCksIEZJUlNUX0xFVFRFUik7Cisg
ICAgICAgIHBzZXVkb0VsdFRvUHNldWRvSWRNYXAtPnNldChmaXJzdExpbmUuaW1wbCgpLCBGSVJT
VF9MSU5FKTsKKyNpZiBFTkFCTEUoREFUQUxJU1QpCisgICAgICAgIHBzZXVkb0VsdFRvUHNldWRv
SWRNYXAtPnNldChpbnB1dExpc3RCdXR0b24uaW1wbCgpLCBJTlBVVF9MSVNUX0JVVFRPTik7Cisj
ZW5kaWYKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KGlucHV0UGxhY2Vob2xk
ZXIuaW1wbCgpLCBJTlBVVF9QTEFDRUhPTERFUik7CisgICAgICAgIHBzZXVkb0VsdFRvUHNldWRv
SWRNYXAtPnNldChtZWRpYUNvbnRyb2xzQ3VycmVudFRpbWVEaXNwbGF5LmltcGwoKSwgTUVESUFf
Q09OVFJPTFNfQ1VSUkVOVF9USU1FX0RJU1BMQVkpOworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVk
b0lkTWFwLT5zZXQobWVkaWFDb250cm9sc0Z1bGxzY3JlZW5CdXR0b24uaW1wbCgpLCBNRURJQV9D
T05UUk9MU19GVUxMU0NSRUVOX0JVVFRPTik7CisgICAgICAgIHBzZXVkb0VsdFRvUHNldWRvSWRN
YXAtPnNldChtZWRpYUNvbnRyb2xzTXV0ZUJ1dHRvbi5pbXBsKCksIE1FRElBX0NPTlRST0xTX01V
VEVfQlVUVE9OKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1lZGlhQ29u
dHJvbHNQYW5lbC5pbXBsKCksIE1FRElBX0NPTlRST0xTX1BBTkVMKTsKKyAgICAgICAgcHNldWRv
RWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1lZGlhQ29udHJvbHNQbGF5QnV0dG9uLmltcGwoKSwgTUVE
SUFfQ09OVFJPTFNfUExBWV9CVVRUT04pOworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFw
LT5zZXQobWVkaWFDb250cm9sc1NlZWtCYWNrQnV0dG9uLmltcGwoKSwgTUVESUFfQ09OVFJPTFNf
U0VFS19CQUNLX0JVVFRPTik7CisgICAgICAgIHBzZXVkb0VsdFRvUHNldWRvSWRNYXAtPnNldCht
ZWRpYUNvbnRyb2xzU2Vla0ZvcndhcmRCdXR0b24uaW1wbCgpLCBNRURJQV9DT05UUk9MU19TRUVL
X0ZPUldBUkRfQlVUVE9OKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1l
ZGlhQ29udHJvbHNTdGF0dXNEaXNwbGF5LmltcGwoKSwgTUVESUFfQ09OVFJPTFNfU1RBVFVTX0RJ
U1BMQVkpOworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQobWVkaWFDb250cm9s
c1JldHVyblRvUmVhbHRpbWVCdXR0b24uaW1wbCgpLCBNRURJQV9DT05UUk9MU19SRVRVUk5fVE9f
UkVBTFRJTUVfQlVUVE9OKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1l
ZGlhQ29udHJvbHNSZXdpbmRCdXR0b24uaW1wbCgpLCBNRURJQV9DT05UUk9MU19SRVdJTkRfQlVU
VE9OKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1lZGlhQ29udHJvbHNU
aW1lUmVtYWluaW5nRGlzcGxheS5pbXBsKCksIE1FRElBX0NPTlRST0xTX1RJTUVfUkVNQUlOSU5H
X0RJU1BMQVkpOworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQobWVkaWFDb250
cm9sc1RpbWVsaW5lLmltcGwoKSwgTUVESUFfQ09OVFJPTFNfVElNRUxJTkUpOworICAgICAgICBw
c2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQobWVkaWFDb250cm9sc1RpbWVsaW5lQ29udGFpbmVy
LmltcGwoKSwgTUVESUFfQ09OVFJPTFNfVElNRUxJTkVfQ09OVEFJTkVSKTsKKyAgICAgICAgcHNl
dWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1lZGlhQ29udHJvbHNUb2dnbGVDbG9zZWRDYXB0aW9u
c0J1dHRvbi5pbXBsKCksIE1FRElBX0NPTlRST0xTX1RPR0dMRV9DTE9TRURfQ0FQVElPTlNfQlVU
VE9OKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1lZGlhQ29udHJvbHNW
b2x1bWVTbGlkZXIuaW1wbCgpLCBNRURJQV9DT05UUk9MU19WT0xVTUVfU0xJREVSKTsKKyAgICAg
ICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KG1lZGlhQ29udHJvbHNWb2x1bWVTbGlkZXJD
b250YWluZXIuaW1wbCgpLCBNRURJQV9DT05UUk9MU19WT0xVTUVfU0xJREVSX0NPTlRBSU5FUik7
CisgICAgICAgIHBzZXVkb0VsdFRvUHNldWRvSWRNYXAtPnNldChyZXNpemVyLmltcGwoKSwgUkVT
SVpFUik7CisgICAgICAgIHBzZXVkb0VsdFRvUHNldWRvSWRNYXAtPnNldChzY3JvbGxiYXIuaW1w
bCgpLCBTQ1JPTExCQVIpOworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQoc2Ny
b2xsYmFyQnV0dG9uLmltcGwoKSwgU0NST0xMQkFSX0JVVFRPTik7CisgICAgICAgIHBzZXVkb0Vs
dFRvUHNldWRvSWRNYXAtPnNldChzY3JvbGxiYXJDb3JuZXIuaW1wbCgpLCBTQ1JPTExCQVJfQ09S
TkVSKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KHNjcm9sbGJhclRodW1i
LmltcGwoKSwgU0NST0xMQkFSX1RIVU1CKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1h
cC0+c2V0KHNjcm9sbGJhclRyYWNrLmltcGwoKSwgU0NST0xMQkFSX1RSQUNLKTsKKyAgICAgICAg
cHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0KHNjcm9sbGJhclRyYWNrUGllY2UuaW1wbCgpLCBT
Q1JPTExCQVJfVFJBQ0tfUElFQ0UpOworICAgICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5z
ZXQoc2VhcmNoQ2FuY2VsQnV0dG9uLmltcGwoKSwgU0VBUkNIX0NBTkNFTF9CVVRUT04pOworICAg
ICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQoc2VhcmNoRGVjb3JhdGlvbi5pbXBsKCks
IFNFQVJDSF9ERUNPUkFUSU9OKTsKKyAgICAgICAgcHNldWRvRWx0VG9Qc2V1ZG9JZE1hcC0+c2V0
KHNlYXJjaFJlc3VsdHNCdXR0b24uaW1wbCgpLCBTRUFSQ0hfUkVTVUxUU19CVVRUT04pOworICAg
ICAgICBwc2V1ZG9FbHRUb1BzZXVkb0lkTWFwLT5zZXQoc2VhcmNoUmVzdWx0c0RlY29yYXRpb24u
aW1wbCgpLCBTRUFSQ0hfUkVTVUxUU19ERUNPUkFUSU9OKTsKKyAgICAgICAgcHNldWRvRWx0VG9Q
c2V1ZG9JZE1hcC0+c2V0KHNlbGVjdGlvbi5pbXBsKCksIFNFTEVDVElPTik7CisgICAgICAgIHBz
ZXVkb0VsdFRvUHNldWRvSWRNYXAtPnNldChzbGlkZXJUaHVtYi5pbXBsKCksIFNMSURFUl9USFVN
Qik7CisgICAgfQorCisgICAgcmV0dXJuIHBzZXVkb0VsdFRvUHNldWRvSWRNYXAtPmdldCh2YWx1
ZS5pbXBsKCkpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJD
b3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uaCBiL1dlYkNvcmUvY3NzL0NTU0Nv
bXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oCmluZGV4IDg0MmE5OTUuLjliNzBhOGIgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oCisrKyBiL1dlYkNv
cmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oCkBAIC0yMyw2ICsyMyw3IEBACiAK
ICNpbmNsdWRlICJDU1NTdHlsZURlY2xhcmF0aW9uLmgiCiAjaW5jbHVkZSAiTm9kZS5oIgorI2lu
Y2x1ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApA
QCAtMzMsNyArMzQsNyBAQCBlbnVtIEVVcGRhdGVMYXlvdXQgeyBEb05vdFVwZGF0ZUxheW91dCA9
IGZhbHNlLCBVcGRhdGVMYXlvdXQgPSB0cnVlIH07CiAKIGNsYXNzIENTU0NvbXB1dGVkU3R5bGVE
ZWNsYXJhdGlvbiA6IHB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIHsKIHB1YmxpYzoKLSAgICBm
cmllbmQgUGFzc1JlZlB0cjxDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24+IGNvbXB1dGVkU3R5
bGUoUGFzc1JlZlB0cjxOb2RlPik7CisgICAgZnJpZW5kIFBhc3NSZWZQdHI8Q1NTQ29tcHV0ZWRT
dHlsZURlY2xhcmF0aW9uPiBjb21wdXRlZFN0eWxlKFBhc3NSZWZQdHI8Tm9kZT4sIFBzZXVkb0lk
IHBzZXVkb0VsdCk7CiAgICAgdmlydHVhbCB+Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uKCk7
CiAKICAgICB2aXJ0dWFsIFN0cmluZyBjc3NUZXh0KCkgY29uc3Q7CkBAIC01NSwxMiArNTYsMTMg
QEAgcHVibGljOgogI2lmIEVOQUJMRShTVkcpCiAgICAgUGFzc1JlZlB0cjxDU1NWYWx1ZT4gZ2V0
U1ZHUHJvcGVydHlDU1NWYWx1ZShpbnQgcHJvcGVydHlJRCwgRVVwZGF0ZUxheW91dCkgY29uc3Q7
CiAjZW5kaWYKKyAgICBzdGF0aWMgUHNldWRvSWQgZ2V0UHNldWRvSWQoY29uc3QgQXRvbWljU3Ry
aW5nJiB2YWx1ZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGJvb2wgY3NzUHJvcGVydHlN
YXRjaGVzKGNvbnN0IENTU1Byb3BlcnR5KikgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgQ1NTQ29t
cHV0ZWRTdHlsZURlY2xhcmF0aW9uKFBhc3NSZWZQdHI8Tm9kZT4pOworICAgIENTU0NvbXB1dGVk
U3R5bGVEZWNsYXJhdGlvbihQYXNzUmVmUHRyPE5vZGU+LCBQc2V1ZG9JZCBwc2V1ZG9FbHQgPSBO
T1BTRVVETyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0Q3NzVGV4dChjb25zdCBTdHJpbmcmLCBF
eGNlcHRpb25Db2RlJik7CiAKQEAgLTcwLDExICs3MiwxMiBAQCBwcml2YXRlOgogICAgIFBhc3NS
ZWZQdHI8Q1NTVmFsdWU+IHZhbHVlRm9yU2hhZG93KGNvbnN0IFNoYWRvd0RhdGEqLCBpbnQpIGNv
bnN0OwogCiAgICAgUmVmUHRyPE5vZGU+IG1fbm9kZTsKKyAgICBQc2V1ZG9JZCBtX3BzZXVkb0Vs
dDsKIH07CiAKLWlubGluZSBQYXNzUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4g
Y29tcHV0ZWRTdHlsZShQYXNzUmVmUHRyPE5vZGU+IG5vZGUpCitpbmxpbmUgUGFzc1JlZlB0cjxD
U1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24+IGNvbXB1dGVkU3R5bGUoUGFzc1JlZlB0cjxOb2Rl
PiBub2RlLCBQc2V1ZG9JZCBwc2V1ZG9FbHQgPSBOT1BTRVVETykKIHsKLSAgICByZXR1cm4gYWRv
cHRSZWYobmV3IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbihub2RlKSk7CisgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24obm9kZSwgcHNldWRvRWx0
KSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9t
L0VsZW1lbnQuY3BwIGIvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKaW5kZXggODcxMTExMC4uZWQy
M2NlOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKKysrIGIvV2ViQ29yZS9k
b20vRWxlbWVudC5jcHAKQEAgLTEzOTUsMTAgKzEzOTUsMTMgQEAgdm9pZCBFbGVtZW50OjpzZXRN
aW5pbXVtU2l6ZUZvclJlc2l6aW5nKGNvbnN0IEludFNpemUmIHNpemUpCiAgICAgZW5zdXJlUmFy
ZURhdGEoKS0+bV9taW5pbXVtU2l6ZUZvclJlc2l6aW5nID0gc2l6ZTsKIH0KIAotUmVuZGVyU3R5
bGUqIEVsZW1lbnQ6OmNvbXB1dGVkU3R5bGUoKQorUmVuZGVyU3R5bGUqIEVsZW1lbnQ6OmNvbXB1
dGVkU3R5bGUoUHNldWRvSWQgcHNldWRvRWx0KQogeworICAgIC8vIEZJWE1FOiBGaW5kIGFuZCB1
c2UgdGhlIHJlbmRlcmVyIGZyb20gdGhlIHBzZXVkbyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIGFj
dHVhbCBlbGVtZW50IHNvIHRoYXQgdGhlICdsZW5ndGgnCisgICAgLy8gcHJvcGVydGllcywgd2hp
Y2ggYXJlIG9ubHkga25vd24gYnkgdGhlIHJlbmRlcmVyIGJlY2F1c2UgaXQgZGlkIHRoZSBsYXlv
dXQsIHdpbGwgYmUgY29ycmVjdCBhbmQgc28gdGhhdCB0aGUKKyAgICAvLyB2YWx1ZXMgcmV0dXJu
ZWQgZm9yIHRoZSAiOnNlbGVjdGlvbiIgcHNldWRvLWVsZW1lbnQgd2lsbCBiZSBjb3JyZWN0Lgog
ICAgIGlmIChSZW5kZXJTdHlsZSogdXNlZFN0eWxlID0gcmVuZGVyU3R5bGUoKSkKLSAgICAgICAg
cmV0dXJuIHVzZWRTdHlsZTsKKyAgICAgICAgcmV0dXJuIHBzZXVkb0VsdCA/IHVzZWRTdHlsZS0+
Z2V0Q2FjaGVkUHNldWRvU3R5bGUocHNldWRvRWx0KSA6IHVzZWRTdHlsZTsKIAogICAgIGlmICgh
YXR0YWNoZWQoKSkKICAgICAgICAgLy8gRklYTUU6IFRyeSB0byBkbyBiZXR0ZXIgdGhhbiB0aGlz
LiBFbnN1cmUgdGhhdCBzdHlsZUZvckVsZW1lbnQoKSB3b3JrcyBmb3IgZWxlbWVudHMgdGhhdCBh
cmUgbm90IGluIHRoZQpAQCAtMTQwOCw3ICsxNDExLDcgQEAgUmVuZGVyU3R5bGUqIEVsZW1lbnQ6
OmNvbXB1dGVkU3R5bGUoKQogICAgIEVsZW1lbnRSYXJlRGF0YSogZGF0YSA9IGVuc3VyZVJhcmVE
YXRhKCk7CiAgICAgaWYgKCFkYXRhLT5tX2NvbXB1dGVkU3R5bGUpCiAgICAgICAgIGRhdGEtPm1f
Y29tcHV0ZWRTdHlsZSA9IGRvY3VtZW50KCktPnN0eWxlRm9yRWxlbWVudElnbm9yaW5nUGVuZGlu
Z1N0eWxlc2hlZXRzKHRoaXMpOwotICAgIHJldHVybiBkYXRhLT5tX2NvbXB1dGVkU3R5bGUuZ2V0
KCk7CisgICAgcmV0dXJuIHBzZXVkb0VsdCA/IGRhdGEtPm1fY29tcHV0ZWRTdHlsZS0+Z2V0Q2Fj
aGVkUHNldWRvU3R5bGUocHNldWRvRWx0KSA6IGRhdGEtPm1fY29tcHV0ZWRTdHlsZS5nZXQoKTsK
IH0KIAogdm9pZCBFbGVtZW50OjpjYW5jZWxGb2N1c0FwcGVhcmFuY2VVcGRhdGUoKQpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9kb20vRWxlbWVudC5oIGIvV2ViQ29yZS9kb20vRWxlbWVudC5oCmluZGV4
IDM0OGVkMWMuLmYxYTJjNzMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAorKysg
Yi9XZWJDb3JlL2RvbS9FbGVtZW50LmgKQEAgLTIwMSw3ICsyMDEsNyBAQCBwdWJsaWM6CiAgICAg
dmlydHVhbCBSZW5kZXJPYmplY3QqIGNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwgUmVuZGVy
U3R5bGUqKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgPSBOb0No
YW5nZSk7CiAKLSAgICB2aXJ0dWFsIFJlbmRlclN0eWxlKiBjb21wdXRlZFN0eWxlKCk7CisgICAg
dmlydHVhbCBSZW5kZXJTdHlsZSogY29tcHV0ZWRTdHlsZShQc2V1ZG9JZCBwc2V1ZG9FbHQgPSBO
T1BTRVVETyk7CiAKICAgICB2b2lkIGRpc3BhdGNoQXR0clJlbW92YWxFdmVudChBdHRyaWJ1dGUq
KTsKICAgICB2b2lkIGRpc3BhdGNoQXR0ckFkZGl0aW9uRXZlbnQoQXR0cmlidXRlKik7CmRpZmYg
LS1naXQgYS9XZWJDb3JlL2RvbS9Ob2RlLmNwcCBiL1dlYkNvcmUvZG9tL05vZGUuY3BwCmluZGV4
IGRiMzRiYmUuLjhmZmFmNWEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZG9tL05vZGUuY3BwCisrKyBi
L1dlYkNvcmUvZG9tL05vZGUuY3BwCkBAIC0xNDMyLDkgKzE0MzIsOSBAQCB2b2lkIE5vZGU6OnNl
dFJlbmRlclN0eWxlKFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHMpCiAgICAgICAgIG1fcmVuZGVy
ZXItPnNldEFuaW1hdGFibGVTdHlsZShzKTsgCiB9CiAKLVJlbmRlclN0eWxlKiBOb2RlOjpjb21w
dXRlZFN0eWxlKCkKK1JlbmRlclN0eWxlKiBOb2RlOjpjb21wdXRlZFN0eWxlKFBzZXVkb0lkIHBz
ZXVkb0VsdCkKIHsKLSAgICByZXR1cm4gcGFyZW50KCkgPyBwYXJlbnQoKS0+Y29tcHV0ZWRTdHls
ZSgpIDogMDsKKyAgICByZXR1cm4gcGFyZW50KCkgPyBwYXJlbnQoKS0+Y29tcHV0ZWRTdHlsZShw
c2V1ZG9FbHQpIDogMDsKIH0KIAogaW50IE5vZGU6Om1heENoYXJhY3Rlck9mZnNldCgpIGNvbnN0
CmRpZmYgLS1naXQgYS9XZWJDb3JlL2RvbS9Ob2RlLmggYi9XZWJDb3JlL2RvbS9Ob2RlLmgKaW5k
ZXggMWVhYzMwNS4uYzYwNjliZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9kb20vTm9kZS5oCisrKyBi
L1dlYkNvcmUvZG9tL05vZGUuaApAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSAiRXZlbnRU
YXJnZXQuaCIKICNpbmNsdWRlICJLVVJMSGFzaC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlQ29u
c3RhbnRzLmgiCiAjaW5jbHVkZSAiU2NyaXB0V3JhcHBhYmxlLmgiCiAjaW5jbHVkZSAiVHJlZVNo
YXJlZC5oIgogI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgpAQCAtNDQ1LDcgKzQ0Niw3IEBA
IHB1YmxpYzoKICAgICBSZW5kZXJTdHlsZSogcmVuZGVyU3R5bGUoKSBjb25zdDsKICAgICB2aXJ0
dWFsIHZvaWQgc2V0UmVuZGVyU3R5bGUoUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4pOwogCi0gICAg
dmlydHVhbCBSZW5kZXJTdHlsZSogY29tcHV0ZWRTdHlsZSgpOworICAgIHZpcnR1YWwgUmVuZGVy
U3R5bGUqIGNvbXB1dGVkU3R5bGUoUHNldWRvSWQgcHNldWRvRWx0ID0gTk9QU0VVRE8pOwogCiAg
ICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBOb3RpZmljYXRpb24gb2YgZG9jdW1l
bnQgc3RydWN0dXJlIGNoYW5nZXMKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGFnZS9ET01XaW5kb3cu
Y3BwIGIvV2ViQ29yZS9wYWdlL0RPTVdpbmRvdy5jcHAKaW5kZXggOGUxNTc0Yy4uOWE4ZDU1OSAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL0RPTVdpbmRvdy5jcHAKKysrIGIvV2ViQ29yZS9wYWdl
L0RPTVdpbmRvdy5jcHAKQEAgLTEwNjgsMTMgKzEwNjgsMTIgQEAgUGFzc1JlZlB0cjxNZWRpYT4g
RE9NV2luZG93OjptZWRpYSgpIGNvbnN0CiAgICAgcmV0dXJuIG1fbWVkaWEuZ2V0KCk7CiB9CiAK
LVBhc3NSZWZQdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gRE9NV2luZG93OjpnZXRDb21wdXRlZFN0
eWxlKEVsZW1lbnQqIGVsdCwgY29uc3QgU3RyaW5nJikgY29uc3QKK1Bhc3NSZWZQdHI8Q1NTU3R5
bGVEZWNsYXJhdGlvbj4gRE9NV2luZG93OjpnZXRDb21wdXRlZFN0eWxlKEVsZW1lbnQqIGVsdCwg
Y29uc3QgU3RyaW5nJiBwc2V1ZG9FbHQpIGNvbnN0CiB7CiAgICAgaWYgKCFlbHQpCiAgICAgICAg
IHJldHVybiAwOwogCi0gICAgLy8gRklYTUU6IFRoaXMgbmVlZHMgdGFrZSBwc2V1ZG8gZWxlbWVu
dHMgaW50byBhY2NvdW50LgotICAgIHJldHVybiBjb21wdXRlZFN0eWxlKGVsdCk7CisgICAgcmV0
dXJuIGNvbXB1dGVkU3R5bGUoZWx0LCBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OmdldFBz
ZXVkb0lkKEF0b21pY1N0cmluZyhwc2V1ZG9FbHQpKSk7CiB9CiAKIFBhc3NSZWZQdHI8Q1NTUnVs
ZUxpc3Q+IERPTVdpbmRvdzo6Z2V0TWF0Y2hlZENTU1J1bGVzKEVsZW1lbnQqIGVsdCwgY29uc3Qg
U3RyaW5nJiBwc2V1ZG9FbHQsIGJvb2wgYXV0aG9yT25seSkgY29uc3QK
</data>
<flag name="review"
          id="33230"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50741</attachid>
            <date>2010-03-15 14:36:47 -0700</date>
            <delta_ts>2010-03-21 11:02:18 -0700</delta_ts>
            <desc>First steps towards exposing the standard pseudo-elements through getComputedStyle (refactor maps among Strings, PseudoTypes, and PseudoIds)</desc>
            <filename>firstStepsTowardsExposingPseudoElementStyles.patch</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Jessie Berlin">jberlin</attacher>
            
              <data encoding="base64"></data>
<flag name="review"
          id="33909"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51251</attachid>
            <date>2010-03-21 11:02:18 -0700</date>
            <delta_ts>2010-04-19 06:30:18 -0700</delta_ts>
            <desc>First steps towards exposing the standard pseudo-elements through getComputedStyle (addressed issues pointed out by Darin) </desc>
            <filename>firstStepsTowardsExposingPseudoElementStyles.patch</filename>
            <type>text/plain</type>
            <size>56900</size>
            <attacher name="Jessie Berlin">jberlin</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBlMzAyYTZlLi5iMWYxNWFjIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDMt
MjEgIEplc3NpZSBCZXJsaW4gIDxqYmVybGluQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRmlyc3Qgc3RlcHMgdG93YXJkcyBmaXhp
bmcgYnVnIDI0MDIxIC0gcHNldWRvLWVsZW1lbnQgc3R5bGVzIG5vdCBhY2Nlc3NpYmxlIC8gcmV0
cmlldmFibGUgdmlhIERPTSBtZXRob2RzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjQwMjEKKworICAgICAgICAqIGZhc3QvY3NzL2dldENvbXB1dGVk
U3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50LWV4cGVjdGVkLnR4dDog
QWRkZWQuCisgICAgICAgICogZmFzdC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0
eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQuaHRtbDogQWRkZWQuCisKIDIwMTAtMDMtMTkgIFNpbW9u
IEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
RGltaXRyaSBHbGF6a292LgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC9jc3MvZ2V0Q29t
cHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQtZXhwZWN0ZWQu
dHh0IGIvTGF5b3V0VGVzdHMvZmFzdC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0
eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmZiODllNjkKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9m
YXN0L2Nzcy9nZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxl
bWVudC1leHBlY3RlZC50eHQKQEAgLTAsMCArMSwyMiBAQAorVGVzdCBmb3IgV2ViS2l0IGJ1ZyAy
NDAyMTogcHNldWRvLWVsZW1lbnQgc3R5bGVzIG5vdCBhY2Nlc3NpYmxlIC8gcmV0cmlldmFibGUg
dmlhIERPTSBtZXRob2RzCisKKworb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0
dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQg
bGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBx
dWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAg
ZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhl
bmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51
bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lk
ZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVz
dCBsYWJvcnVtLgorCitNaWRkbGUKKworVGhlcmUgYXJlIG5vIHBzZXVkbyBlbGVtZW50cyBkZWZp
bmVkIG9uIHRoaXMgZGl2LgorCisgVGhpcyBzaG91bGQgYmUgYXQgZnVsbCBvcGFjaXR5LgorCitQ
QVNTIEV4cGVjdGVkICdyZ2IoMTY1LCA0MiwgNDIpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVk
IHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1lbnQg
OmZpcnN0LWxpbmUgYW5kIGdvdCAncmdiKDE2NSwgNDIsIDQyKScKK1BBU1MgRXhwZWN0ZWQgJ3Jn
YigwLCAwLCAyNTUpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50
IHdpdGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1lbnQgOmZpcnN0LWxldHRlciBhbmQg
Z290ICdyZ2IoMCwgMCwgMjU1KScKK1BBU1MgRXhwZWN0ZWQgJ3JnYigwLCAwLCAyNTUpJyBmb3Ig
Y29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEZpcnN0
cyBhbmQgcHNldWRvLWVsZW1lbnQgOjpmaXJzdC1sZXR0ZXIgYW5kIGdvdCAncmdiKDAsIDAsIDI1
NSknCitQQVNTIEV4cGVjdGVkICdyZ2IoMCwgMCwgMjU1KScgZm9yIGNvbG9yIGluIHRoZSBjb21w
dXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3RGaXJzdHMgYW5kIHBzZXVkby1lbGVt
ZW50IGZpcnN0LWxldHRlciBhbmQgZ290ICdyZ2IoMCwgMCwgMjU1KScKK1BBU1MgRXhwZWN0ZWQg
J3JnYigwLCAwLCAwKScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVu
dCB3aXRoIGlkIHRlc3RGaXJzdHMgYW5kIHBzZXVkby1lbGVtZW50IG51bGwgYW5kIGdvdCAncmdi
KDAsIDAsIDApJworUEFTUyBFeHBlY3RlZCAncmdiKDE2NSwgNDIsIDQyKScgZm9yIGNvbG9yIGlu
IHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3RCZWZvcmVBZnRlciBh
bmQgcHNldWRvLWVsZW1lbnQgOmJlZm9yZSBhbmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIpJworUEFT
UyBFeHBlY3RlZCAncmdiKDAsIDAsIDI1NSknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5
bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0QmVmb3JlQWZ0ZXIgYW5kIHBzZXVkby1lbGVtZW50
IDphZnRlciBhbmQgZ290ICdyZ2IoMCwgMCwgMjU1KScKK1BBU1MgRXhwZWN0ZWQgJ3JnYigxNjUs
IDQyLCA0MiknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0
aCBpZCB0ZXN0Tm9Qc2V1ZG9FbGVtZW50IGFuZCBwc2V1ZG8tZWxlbWVudCBudWxsIGFuZCBnb3Qg
J3JnYigxNjUsIDQyLCA0MiknCitQQVNTIEV4cGVjdGVkICcnIGZvciBjb2xvciBpbiB0aGUgY29t
cHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Tm9Qc2V1ZG9FbGVtZW50IGFuZCBw
c2V1ZG8tZWxlbWVudCA6Zmlyc3QtbGluZSBhbmQgZ290ICcnCitQQVNTIEV4cGVjdGVkICdyZ2Io
MTY1LCA0MiwgNDIpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50
IHdpdGggaWQgdGVzdE5vUHNldWRvRWxlbWVudCBhbmQgcHNldWRvLWVsZW1lbnQgOmdhcmJhZ2Ug
YW5kIGdvdCAncmdiKDE2NSwgNDIsIDQyKScKK1BBU1MgRXhwZWN0ZWQgJzAuNScgZm9yIG9wYWNp
dHkgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEhhcmR3YXJl
QWNjZWxlcmF0ZWRDb21wb3NpdGluZyBhbmQgcHNldWRvLWVsZW1lbnQgOmJlZm9yZSBhbmQgZ290
ICcwLjUnCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9nZXRDb21wdXRlZFN0eWxl
L2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC5odG1sIGIvTGF5b3V0VGVzdHMv
ZmFzdC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVs
ZW1lbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY3MDliCi0t
LSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9n
ZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQuaHRtbApAQCAtMCwwICsxLDExOSBA
QAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPlRlc3QgZm9y
IFdlYktpdCBidWcgMjQwMjE6IHBzZXVkby1lbGVtZW50IHN0eWxlcyBub3QgYWNjZXNzaWJsZSAv
IHJldHJpZXZhYmxlIHZpYSBET00gbWV0aG9kczwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRl
eHQvY3NzIj4KKyAgICAgICN0ZXN0Rmlyc3RzOmZpcnN0LWxpbmUgeworICAgICAgICAgIGNvbG9y
OiBicm93bjsKKyAgICAgIH0KKworICAgICAgI3Rlc3RGaXJzdHM6Zmlyc3QtbGV0dGVyIHsKKyAg
ICAgICAgICBjb2xvcjogYmx1ZTsKKyAgICAgIH0KKworICAgICAgI3Rlc3RCZWZvcmVBZnRlcjo6
YmVmb3JlIHsKKyAgICAgICAgICBjb250ZW50OiAiVGhpcyBzaG91bGQgYmUgYnJvd24gIjsKKyAg
ICAgICAgICBjb2xvcjogYnJvd247CisgICAgICB9CisKKyAgICAgICN0ZXN0QmVmb3JlQWZ0ZXI6
OmFmdGVyIHsKKyAgICAgICAgICBjb250ZW50OiAiIGFuZCB0aGlzIHNob3VsZCBiZSBibHVlIjsK
KyAgICAgICAgICBjb2xvcjogYmx1ZTsKKyAgICAgIH0KKworICAgICAgI3Rlc3ROb1BzZXVkb0Vs
ZW1lbnQgeworICAgICAgICAgIGNvbG9yOiBicm93bjsKKyAgICAgIH0KKworICAgICAgI3Rlc3RI
YXJkd2FyZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmcgeworICAgICAgICAgIHdpZHRoOiAxMDBweDsK
KyAgICAgICAgICBoZWlnaHQ6IDEwMHB4OworICAgICAgICAgIG9wYWNpdHk6IDEuMDsKKyAgICAg
ICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbjsKKyAgICAgICAgICAtd2Via2l0LWFuaW1hdGlv
bjogbW92ZSAzMDBtcyBsaW5lYXI7CisgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6
IHByZXNlcnZlLTNkOworICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFzbmxhdGUzZCgx
MHB4LCAwLCAwKTsKKyAgICAgIH0KKworICAgICAjdGVzdEhhcmR3YXJlQWNjZWxlcmF0ZWRDb21w
b3NpdGluZzpiZWZvcmUgeworICAgICAgICAgY29udGVudDogIlRoaXMgc2hvdWxkIGhhdmUgbG93
ZXIgb3BhY2l0eS4iOworICAgICAgICAgb3BhY2l0eTogMC41OworICAgICB9CisKKyAgICAgIEAt
d2Via2l0LWtleWZyYW1lcyBtb3ZlIHsKKyAgICAgICAgICBmcm9tIHsgLXdlYmtpdC10cmFuc2Zv
cm06IHRyYW5zbGF0ZTNkKDEwcHgsIDAsIDApOyB9CisgICAgICAgICAgdG8gICB7IC13ZWJraXQt
dHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgzMDBweCwgMCwgMCk7IH0KKyAgICAgIH0KKworICAgICAg
LnBhc3MgeworICAgICAgICAgIGNvbG9yOiBncmVlbjsKKyAgICAgIH0KKworICAgICAgLmZhaWwg
eworICAgICAgICAgIGNvbG9yOiByZWQ7CisgICAgICB9CisKKyAgICA8L3N0eWxlPgorICAgIDxz
Y3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgIGlmICh3aW5kb3cubGF5b3V0VGVz
dENvbnRyb2xsZXIpCisgICAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgp
OworCisgICAgICB2YXIgdGVzdHMgPSBbCisgICAgICAgIHsgJ2VsZW1lbnRJZCcgOiAndGVzdEZp
cnN0cycsICdwc2V1ZG9FbGVtZW50JyA6ICc6Zmlyc3QtbGluZScsICdwcm9wZXJ0eScgOiAnY29s
b3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDE2NSwgNDIsIDQyKScgfSwKKyAgICAgICAgeyAn
ZWxlbWVudElkJyA6ICd0ZXN0Rmlyc3RzJywgJ3BzZXVkb0VsZW1lbnQnIDogJzpmaXJzdC1sZXR0
ZXInLCAncHJvcGVydHknIDogJ2NvbG9yJywgJ2V4cGVjdGVkVmFsdWUnIDogJ3JnYigwLCAwLCAy
NTUpJyB9LAorICAgICAgICB7ICdlbGVtZW50SWQnIDogJ3Rlc3RGaXJzdHMnLCAncHNldWRvRWxl
bWVudCcgOiAnOjpmaXJzdC1sZXR0ZXInLCAncHJvcGVydHknIDogJ2NvbG9yJywgJ2V4cGVjdGVk
VmFsdWUnIDogJ3JnYigwLCAwLCAyNTUpJyB9LAorICAgICAgICB7ICdlbGVtZW50SWQnIDogJ3Rl
c3RGaXJzdHMnLCAncHNldWRvRWxlbWVudCcgOiAnZmlyc3QtbGV0dGVyJywgJ3Byb3BlcnR5JyA6
ICdjb2xvcicsICdleHBlY3RlZFZhbHVlJyA6ICdyZ2IoMCwgMCwgMjU1KScgfSwKKyAgICAgICAg
eyAnZWxlbWVudElkJyA6ICd0ZXN0Rmlyc3RzJywgJ3BzZXVkb0VsZW1lbnQnIDogbnVsbCwgJ3By
b3BlcnR5JyA6ICdjb2xvcicsICdleHBlY3RlZFZhbHVlJyA6ICdyZ2IoMCwgMCwgMCknIH0sCisg
ICAgICAgIHsgJ2VsZW1lbnRJZCcgOiAndGVzdEJlZm9yZUFmdGVyJywgJ3BzZXVkb0VsZW1lbnQn
IDogJzpiZWZvcmUnLCAncHJvcGVydHknIDogJ2NvbG9yJywgJ2V4cGVjdGVkVmFsdWUnIDogJ3Jn
YigxNjUsIDQyLCA0MiknIH0sCisgICAgICAgIHsgJ2VsZW1lbnRJZCcgOiAndGVzdEJlZm9yZUFm
dGVyJywgJ3BzZXVkb0VsZW1lbnQnIDogJzphZnRlcicsICdwcm9wZXJ0eScgOiAnY29sb3InLCAn
ZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDAsIDAsIDI1NSknIH0sCisgICAgICAgIHsgJ2VsZW1lbnRJ
ZCcgOiAndGVzdE5vUHNldWRvRWxlbWVudCcsICdwc2V1ZG9FbGVtZW50JyA6IG51bGwsICdwcm9w
ZXJ0eScgOiAnY29sb3InLCAnZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDE2NSwgNDIsIDQyKScgfSwK
KyAgICAgICAgeyAnZWxlbWVudElkJyA6ICd0ZXN0Tm9Qc2V1ZG9FbGVtZW50JywgJ3BzZXVkb0Vs
ZW1lbnQnIDogJzpmaXJzdC1saW5lJywgJ3Byb3BlcnR5JyA6ICdjb2xvcicsICdleHBlY3RlZFZh
bHVlJyA6ICcnIH0sCisgICAgICAgIHsgJ2VsZW1lbnRJZCcgOiAndGVzdE5vUHNldWRvRWxlbWVu
dCcsICdwc2V1ZG9FbGVtZW50JyA6ICc6Z2FyYmFnZScsICdwcm9wZXJ0eScgOiAnY29sb3InLCAn
ZXhwZWN0ZWRWYWx1ZScgOiAncmdiKDE2NSwgNDIsIDQyKScgfSwKKyAgICAgICAgeyAnZWxlbWVu
dElkJyA6ICd0ZXN0SGFyZHdhcmVBY2NlbGVyYXRlZENvbXBvc2l0aW5nJywgJ3BzZXVkb0VsZW1l
bnQnIDogJzpiZWZvcmUnLCAncHJvcGVydHknIDogJ29wYWNpdHknLCAnZXhwZWN0ZWRWYWx1ZScg
OiAnMC41JyB9CisgICAgICBdOworCisgICAgICBmdW5jdGlvbiBzZXR1cEFuZFJ1blRlc3RzKCkK
KyAgICAgIHsKKyAgICAgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAg
ICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKworICAgICAgICAv
LyBGSVhNRTogSXQgaXMgY3VycmVudGx5IG5lY2Vzc2FyeSB0byBydW4gdGhlIGFuaW1hdGlvbiBh
dCBsZWFzdCBvbmNlIGJlZm9yZSBxdWVyeWluZyBmb3IgdGhlIHN0eWxlIG9uIHRoZSBwc2V1ZG8t
ZWxlbWVudCB3aWxsIHdvcmsuCisgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0
SGFyZHdhcmVBY2NlbGVyYXRlZENvbXBvc2l0aW5nIikuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0
QW5pbWF0aW9uRW5kJywgcnVuVGVzdHMsIGZhbHNlKTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rp
b24gcnVuVGVzdHMoKQorICAgICAgeworICAgICAgICB2YXIgcmVzdWx0c0VsZW1lbnQgPSBkb2N1
bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0cycpOworCisgICAgICAgIHRlc3RzLmZvckVhY2go
ZnVuY3Rpb24oY3VyVGVzdCkgeworICAgICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93
LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VyVGVzdC5lbGVtZW50
SWQpLCBjdXJUZXN0LnBzZXVkb0VsZW1lbnQpOworICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbXB1
dGVkU3R5bGVbY3VyVGVzdC5wcm9wZXJ0eV07CisgICAgICAgICAgdmFyIG1zZyA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgICAgIHZhciBtYWluTWVzc2FnZSA9ICIgRXhw
ZWN0ZWQgJyIgKyBjdXJUZXN0LmV4cGVjdGVkVmFsdWUgKyAiJyBmb3IgIiArIGN1clRlc3QucHJv
cGVydHkgKworICAgICAgICAgICAgICAiIGluIHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVu
dCB3aXRoIGlkICIgKyBjdXJUZXN0LmVsZW1lbnRJZCArICIgYW5kIHBzZXVkby1lbGVtZW50ICIg
KyBjdXJUZXN0LnBzZXVkb0VsZW1lbnQ7CisgICAgICAgICAgaWYgKHZhbHVlID09IGN1clRlc3Qu
ZXhwZWN0ZWRWYWx1ZSkKKyAgICAgICAgICAgICAgbXNnLmlubmVySFRNTCA9ICI8c3BhbiBjbGFz
cz0ncGFzcyc+UEFTUzwvc3Bhbj4iICsgbWFpbk1lc3NhZ2UgKyAiIGFuZCBnb3QgJyIgKyB2YWx1
ZSArICInIjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG1zZy5pbm5lckhUTUwgPSAi
PHNwYW4gY2xhc3M9J2ZhaWwnPkZBSUw8L3NwYW4+IiArIG1haW5NZXNzYWdlICsgIiBidXQgaW5z
dGVhZCBnb3QgJyIgKyB2YWx1ZSArICInIjsKKyAgICAgICAgICByZXN1bHRzRWxlbWVudC5hcHBl
bmRDaGlsZChtc2cpOworICAgICAgICB9KTsKKworICAgICAgICBpZiAod2luZG93LmxheW91dFRl
c3RDb250cm9sbGVyKQorICAgICAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9u
ZSgpOworICAgICAgfQorICAgIDwvc2NyaXB0PgorICA8L2hlYWQ+CisgIDxib2R5IG9ubG9hZD0i
c2V0dXBBbmRSdW5UZXN0cygpOyI+CisgICAgPGgzPlRlc3QgZm9yIDxhIGhyZWY9Imh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDAyMSI+V2ViS2l0IGJ1ZyAyNDAyMTwv
YT46IHBzZXVkby1lbGVtZW50IHN0eWxlcyBub3QgYWNjZXNzaWJsZSAvIHJldHJpZXZhYmxlIHZp
YSBET00gbWV0aG9kczwvaDM+CisgICAgPGJyIC8+CisgICAgPGRpdiBpZD0idGVzdEZpcnN0cyI+
TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQs
IHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFn
bmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRh
dGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2Vx
dWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUg
dmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0
ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBx
dWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS48L2Rpdj4KKyAg
ICA8YnIgLz4KKyAgICA8ZGl2IGlkPSJ0ZXN0QmVmb3JlQWZ0ZXIiPk1pZGRsZTwvZGl2PgorICAg
IDxiciAvPgorICAgIDxkaXYgaWQ9InRlc3ROb1BzZXVkb0VsZW1lbnQiPlRoZXJlIGFyZSBubyBw
c2V1ZG8gZWxlbWVudHMgZGVmaW5lZCBvbiB0aGlzIGRpdi48L2Rpdj4KKyAgICA8YnIgLz4KKyAg
ICA8ZGl2IGlkPSJ0ZXN0SGFyZHdhcmVBY2NlbGVyYXRlZENvbXBvc2l0aW5nIj4gVGhpcyBzaG91
bGQgYmUgYXQgZnVsbCBvcGFjaXR5LjwvZGl2PgorICAgIDxiciAvPgorICAgIDxkaXYgaWQ9InJl
c3VsdHMiPjwvZGl2PgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9XZWJDb3JlL0No
YW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDBhNjE1ZjAuLjA3YWJlMDMgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsNjQgQEAKKzIwMTAtMDMtMjEgIEplc3NpZSBCZXJsaW4gIDxqYmVybGluQHdlYmtpdC5vcmc+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRmlyc3Qg
c3RlcHMgdG93YXJkcyBmaXhpbmcgYnVnIDI0MDIxIC0gcHNldWRvLWVsZW1lbnQgc3R5bGVzIG5v
dCBhY2Nlc3NpYmxlIC8gcmV0cmlldmFibGUgdmlhIERPTSBtZXRob2RzLgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQwMjEKKworICAgICAgICBBbGxv
d3MgYWNjZXNzIHRvIHRoZSBjb21wdXRlZCBzdHlsZXMgZm9yIHRoZSBwc2V1ZG8tZWxlbWVudHMg
dGhyb3VnaCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGdldENvbXB1dGVkU3R5bGUuCisgICAgICAg
IFRoaXMgYXBwcm9hY2ggZG9lcyBub3QgcHJvdmlkZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICds
ZW5ndGgnIHByb3BlcnRpZXMgYW5kIGRvZXMgbm90IHdvcmsgZm9yIHRoZSAnOnNlbGVjdGlvbicg
cHNldWRvLWVsZW1lbnQgYW5kIHdpbGwgaW5zdGVhZCByZXR1cm4gcmVzdWx0cyBzaW1pbGlhciB0
byB0aG9zZSByZXR1cm5lZCBieSBGaXJlZm94LiBUaGlzIGFwcHJvYWNoIGFsc28gcmVxdWlyZXMg
d2FpdGluZyB1bnRpbCBhdCBsZWFzdCBvbmUgaXRlcmF0aW9uIG9mIGEgaGFyZHdhcmUgYWNjZWxl
cmF0ZWQgY29tcG9zaXRlZCBhbmltYXRpb24gdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlcyBm
b3IgdGhlICJvcGFjaXR5IiBhbmQgInRyYW5zZm9ybSIgcHJvcGVydGllcyBvZiBhIHBzZXVkby1l
bGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCBiZWluZyBhbmltYXRlZC4KKyAgICAg
ICAgVGhvc2UgdmFsdWVzIG5lZWQgdG8gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlbmRlcmVyIGZv
ciB0aGUgcHNldWRvLWVsZW1lbnQgYXMgb3Bwb3NlZCB0byB0aGUgY2FjaGVkIFJlbmRlclN0eWxl
IGZvciB0aGUgZWxlbWVudCBvbiB3aGljaCB0aGUgcHNldWRvLWVsZW1lbnQgaXMgZGVmaW5lZCwg
d2hpY2ggaXMgZnVydGhlciBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IG5vdCBhbGwgZWxl
bWVudHMgaGF2ZSByZW5kZXJlcnMuCisKKyAgICAgICAgVGVzdDogZmFzdC9jc3MvZ2V0Q29tcHV0
ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQuaHRtbAorCisgICAg
ICAgICogY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJh
dGlvbik6CisgICAgICAgIFBhcnNlIHRoZSBhbmQgc3RvcmUgdGhlIHBzZXVkby1lbGVtZW50IHNw
ZWNpZmllciBmcm9tIHRoZSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCisgICAgICAgIChX
ZWJDb3JlOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OmdldEZvbnRTaXplQ1NTVmFsdWVQ
cmVmZXJyaW5nS2V5d29yZCk6CisgICAgICAgIEdldCB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIHRo
ZSBwc2V1ZG8tZWxlbWVudCBpZiBpdCBoYXMgYmVlbiBzcGVjaWZpZWQuCisgICAgICAgIChXZWJD
b3JlOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246OmdldFByb3BlcnR5Q1NTVmFsdWUpOgor
ICAgICAgICBHZXQgdGhlIGNvbXB1dGVkIHN0eWxlIGZvciB0aGUgcHNldWRvLWVsZW1lbnQgaWYg
aXQgaGFzIGJlZW4gc3BlY2lmaWVkLCB3aXRoIGEgRklYTUUgbm90aW5nIHRoYXQgdGhlIHZhbHVl
cyByZXR1cm5lZCBmb3IgdGhlICJvcGFjaXR5IiBhbmQgInRyYW5zZm9ybSIgcHJvcGVydGllcyBv
ZiBhIHBzZXVkby1lbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGJlaW5nIGFuaW1h
dGVkIGFuZCB1c2luZyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBjb21wb3NpdGluZyB3aWxsIG5vdCBi
ZSBjb3JyZWN0IHVudGlsIGFmdGVyIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGFuaW1hdGlv
bi4KKyAgICAgICAgKFdlYkNvcmU6OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6bGVuZ3Ro
KToKKyAgICAgICAgR2V0IHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgdGhlIHBzZXVkby1lbGVtZW50
IGlmIGl0IGhhcyBiZWVuIHNwZWNpZmllZC4KKyAgICAgICAgKFdlYkNvcmU6OkNTU0NvbXB1dGVk
U3R5bGVEZWNsYXJhdGlvbjo6Y3NzUHJvcGVydHlNYXRjaGVzKToKKyAgICAgICAgRGl0dG8uCisg
ICAgICAgICogY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oOgorICAgICAgICAoV2Vi
Q29yZTo6Y29tcHV0ZWRTdHlsZSk6CisgICAgICAgIFRha2UgaW50byBjb25zaWRlcmF0aW9uIHRo
ZSBwc2V1ZG8tZWxlbWVudC4KKworICAgICAgICAqIGNzcy9DU1NTZWxlY3Rvci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvcjo6cHNldWRvSWQpOgorICAgICAgICBSZXR1cm4gdGhl
IFBzZXVkb0lkIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIFBzZXVkb1R5cGUuIElmIHRo
ZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgUHNldWRvSWQsIHJldHVybnMgTk9QU0VVRE8uCisgICAg
ICAgIChXZWJDb3JlOjpuYW1lVG9Qc2V1ZG9UeXBlTWFwKToKKyAgICAgICAgQ3JlYXRlIGFuZCBy
ZXR1cm4gdGhlIG1hcHBpbmcgYmV0d2VlbiBzdHJpbmcgbmFtZXMgYW5kIFBzZXVkb1R5cGVzLgor
ICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3I6OnBhcnNlUHNldWRvVHlwZSk6CisgICAgICAg
IFBhcnNlIGFuZCB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gYSBQc2V1ZG9UeXBlLgorICAgICAgICAo
V2ViQ29yZTo6Q1NTU2VsZWN0b3I6OmV4dHJhY3RQc2V1ZG9UeXBlKToKKyAgICAgICAgUmVmYWN0
b3JlZCB0byB1c2UgcGFyc2VQc2V1ZG9UeXBlLgorICAgICAgICAqIGNzcy9DU1NTZWxlY3Rvci5o
OgorCisgICAgICAgICogY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6Q1NTU3R5bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyOjpjaGVja09uZVNlbGVjdG9yKToK
KyAgICAgICAgUmVmYWN0b3JlZCB0byB1c2UgcHNldWRvSWQuCisKKyAgICAgICAgKiBkb20vRWxl
bWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50Ojpjb21wdXRlZFN0eWxlKToKKyAg
ICAgICAgSWYgdGhlIHBzZXVkby1lbGVtZW50IGlzIHNwZWNpZmllZCwgdGhlbiByZXR1cm4gdGhl
IGNhY2hlZCBSZW5kZXJTdHlsZSBmb3IgdGhhdCBQc2V1ZG9JZC4gQWRkZWQgYSBGSVhNRSB0byBm
aW5kIHRoZSBhY3R1YWwgcmVuZGVycyBvZiB0aGUgcHNldWRvLWVsZW1lbnRzIGluc3RlYWQgb2Yg
anVzdCB0aGUgY2FjaGVkIFJlbmRlclN0eWxlIG9mIHRoZSBSZW5kZXJTdHlsZSBmb3IgdGhlIGFz
c29jaWF0ZWQgZWxlbWVudC4KKyAgICAgICAgKiBkb20vRWxlbWVudC5oOgorICAgICAgICAoV2Vi
Q29yZTo6RWxlbWVudDo6dmlydHVhbENvbXB1dGVkU3R5bGUpOgorICAgICAgICBCZWNhdXNlIEVs
ZW1lbnQ6OmNvbXB1dGVkU3R5bGUgaXMgdXNlZCBzbyBvZnRlbiwgZG9uJ3QgbWFrZSBpdCB2aXJ0
dWFsLiBJbnN0ZWFkLCBwcm92aWRlIGEgdmlydHVhbENvbXB1dGVkU3R5bGUgbWV0aG9kIGluIHRo
ZSBOb2RlLmggY2xhc3MgYW5kbWFrZSBjb21wdXRlZFN0eWxlIG5vbi12aXJ0dWFsLiBUaGF0IHdh
eSB0aGUgRWxlbWVudCB2ZXJzaW9uIGFuZCB0aGUgTm9kZSB2ZXJzaW9uIG9mIGNvbXB1dGVkU3R5
bGUgd2lsbCBoYXZlIHRoZSBzYW1lIG5hbWUgYW5kIGxvb2sgdGhlIHNhbWUgYXQgdGhlIGNhbGwg
c2l0ZSwgYnV0IHRoZSBFbGVtZW50IHZlcnNpb24gd2lsbCBiZSBtb3JlIGVmZmljaWVudC4KKwor
ICAgICAgICAqIGRvbS9Ob2RlLmg6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpjb21wdXRlZFN0
eWxlKToKKyAgICAgICAgRGl0dG8uCisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Tm9kZTo6dmlydHVhbENvbXB1dGVkU3R5bGUpOgorICAgICAgICBHZXQgdGhlIGNv
bXB1dGVkIHN0eWxlIGZvciB0aGUgcHNldWRvLWVsZW1lbnQgaWYgaXQgaGFzIGJlZW4gc3BlY2lm
aWVkLgorCisgICAgICAgICogcGFnZS9ET01XaW5kb3cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
RE9NV2luZG93OjpnZXRDb21wdXRlZFN0eWxlKToKKyAgICAgICAgRGl0dG8uCisKIDIwMTAtMDMt
MTkgIEx1aXogQWdvc3RpbmkgIDxsdWl6LmFnb3N0aW5pQG9wZW5ib3NzYS5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgQW50dGkgS29pdmlzdG8uCmRpZmYgLS1naXQgYS9XZWJDb3JlL2Nzcy9D
U1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uY3BwIGIvV2ViQ29yZS9jc3MvQ1NTQ29tcHV0ZWRT
dHlsZURlY2xhcmF0aW9uLmNwcAppbmRleCA5MGMwMTUwLi4xNDk0MTAwIDEwMDY0NAotLS0gYS9X
ZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24uY3BwCisrKyBiL1dlYkNvcmUv
Y3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNp
bmNsdWRlICJDU1NQcm9wZXJ0eS5oIgogI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKICNp
bmNsdWRlICJDU1NSZWZsZWN0VmFsdWUuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgogI2lu
Y2x1ZGUgIkNTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKICNpbmNsdWRlICJDU1NWYWx1ZUxpc3Qu
aCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgpAQCAtNTAwLDkgKzUwMSwxMiBAQCBzdGF0aWMgUGFz
c1JlZlB0cjxDU1NWYWx1ZT4gZ2V0VGltaW5nRnVuY3Rpb25WYWx1ZShjb25zdCBBbmltYXRpb25M
aXN0KiBhbmltTGlzdAogICAgIHJldHVybiBsaXN0LnJlbGVhc2UoKTsKIH0KIAotQ1NTQ29tcHV0
ZWRTdHlsZURlY2xhcmF0aW9uOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24oUGFzc1JlZlB0
cjxOb2RlPiBuKQorQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpDU1NDb21wdXRlZFN0eWxl
RGVjbGFyYXRpb24oUGFzc1JlZlB0cjxOb2RlPiBuLCBjb25zdCBTdHJpbmcmIHBzZXVkb0VsZW1l
bnROYW1lKQogICAgIDogbV9ub2RlKG4pCiB7CisgICAgdW5zaWduZWQgbmFtZVdpdGhvdXRDb2xv
bnNTdGFydCA9IHBzZXVkb0VsZW1lbnROYW1lWzBdID09ICc6JyA/IChwc2V1ZG9FbGVtZW50TmFt
ZVsxXSA9PSAnOicgPyAyIDogMSkgOiAwOworICAgIG1fcHNldWRvRWxlbWVudFNwZWNpZmllciA9
IENTU1NlbGVjdG9yOjpwc2V1ZG9JZChDU1NTZWxlY3Rvcjo6cGFyc2VQc2V1ZG9UeXBlKAorICAg
ICAgICBBdG9taWNTdHJpbmcocHNldWRvRWxlbWVudE5hbWUuc3Vic3RyaW5nKG5hbWVXaXRob3V0
Q29sb25zU3RhcnQpKSkpOwogfQogCiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb246On5DU1ND
b21wdXRlZFN0eWxlRGVjbGFyYXRpb24oKQpAQCAtNTQ1LDcgKzU0OSw3IEBAIFBhc3NSZWZQdHI8
Q1NTVmFsdWU+IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6Z2V0Rm9udFNpemVDU1NWYWx1
ZVByZWZlcnJpbmdLCiAKICAgICBub2RlLT5kb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQ
ZW5kaW5nU3R5bGVzaGVldHMoKTsKIAotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBu
b2RlLT5jb21wdXRlZFN0eWxlKCk7CisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IG5v
ZGUtPmNvbXB1dGVkU3R5bGUobV9wc2V1ZG9FbGVtZW50U3BlY2lmaWVyKTsKICAgICBpZiAoIXN0
eWxlKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtNjYzLDEwICs2NjcsMTUgQEAgUGFzc1JlZlB0
cjxDU1NWYWx1ZT4gQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpnZXRQcm9wZXJ0eUNTU1Zh
bHVlKGludCBwcm9wZXIKICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVy
ZXIoKTsKIAogICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGU7Ci0gICAgaWYgKHJlbmRlcmVy
ICYmIGhhc0NvbXBvc2l0ZWRMYXllcihyZW5kZXJlcikgJiYgQW5pbWF0aW9uQ29udHJvbGxlcjo6
c3VwcG9ydHNBY2NlbGVyYXRlZEFuaW1hdGlvbk9mUHJvcGVydHkoc3RhdGljX2Nhc3Q8Q1NTUHJv
cGVydHlJRD4ocHJvcGVydHlJRCkpKQorICAgIGlmIChyZW5kZXJlciAmJiBoYXNDb21wb3NpdGVk
TGF5ZXIocmVuZGVyZXIpICYmIEFuaW1hdGlvbkNvbnRyb2xsZXI6OnN1cHBvcnRzQWNjZWxlcmF0
ZWRBbmltYXRpb25PZlByb3BlcnR5KHN0YXRpY19jYXN0PENTU1Byb3BlcnR5SUQ+KHByb3BlcnR5
SUQpKSkgewogICAgICAgICBzdHlsZSA9IHJlbmRlcmVyLT5hbmltYXRpb24oKS0+Z2V0QW5pbWF0
ZWRTdHlsZUZvclJlbmRlcmVyKHJlbmRlcmVyKTsKLSAgICBlbHNlCi0gICAgICAgc3R5bGUgPSBu
b2RlLT5jb21wdXRlZFN0eWxlKCk7CisgICAgICAgIGlmIChtX3BzZXVkb0VsZW1lbnRTcGVjaWZp
ZXIpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNhY2hlZCBwc2V1ZG8gc3R5bGUgd2ls
bCBvbmx5IGV4aXN0IGlmIHRoZSBhbmltYXRpb24gaGFzIGJlZW4gcnVuIGF0IGxlYXN0IG9uY2Uu
CisgICAgICAgICAgICBzdHlsZSA9IHN0eWxlLT5nZXRDYWNoZWRQc2V1ZG9TdHlsZShtX3BzZXVk
b0VsZW1lbnRTcGVjaWZpZXIpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHN0eWxl
ID0gbm9kZS0+Y29tcHV0ZWRTdHlsZShtX3BzZXVkb0VsZW1lbnRTcGVjaWZpZXIpOworCiAgICAg
aWYgKCFzdHlsZSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTE0OTAsNyArMTQ5OSw3IEBAIHVu
c2lnbmVkIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6bGVuZ3RoKCkgY29uc3QKICAgICBp
ZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0g
bm9kZS0+Y29tcHV0ZWRTdHlsZSgpOworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG5vZGUtPmNv
bXB1dGVkU3R5bGUobV9wc2V1ZG9FbGVtZW50U3BlY2lmaWVyKTsKICAgICBpZiAoIXN0eWxlKQog
ICAgICAgICByZXR1cm4gMDsKIApAQCAtMTUwOSw3ICsxNTE4LDcgQEAgYm9vbCBDU1NDb21wdXRl
ZFN0eWxlRGVjbGFyYXRpb246OmNzc1Byb3BlcnR5TWF0Y2hlcyhjb25zdCBDU1NQcm9wZXJ0eSog
cHJvcGVydHkKIHsKICAgICBpZiAocHJvcGVydHktPmlkKCkgPT0gQ1NTUHJvcGVydHlGb250U2l6
ZSAmJiBwcm9wZXJ0eS0+dmFsdWUoKS0+aXNQcmltaXRpdmVWYWx1ZSgpICYmIG1fbm9kZSkgewog
ICAgICAgICBtX25vZGUtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHls
ZXNoZWV0cygpOwotICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX25vZGUtPmNvbXB1dGVk
U3R5bGUoKTsKKyAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9ub2RlLT5jb21wdXRlZFN0
eWxlKG1fcHNldWRvRWxlbWVudFNwZWNpZmllcik7CiAgICAgICAgIGlmIChzdHlsZSAmJiBzdHls
ZS0+Zm9udERlc2NyaXB0aW9uKCkua2V5d29yZFNpemUoKSkgewogICAgICAgICAgICAgaW50IHNp
emVWYWx1ZSA9IGNzc0lkZW50aWZpZXJGb3JGb250U2l6ZUtleXdvcmQoc3R5bGUtPmZvbnREZXNj
cmlwdGlvbigpLmtleXdvcmRTaXplKCkpOwogICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihwcm9wZXJ0
eS0+dmFsdWUoKSk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2Nzcy9DU1NDb21wdXRlZFN0eWxlRGVj
bGFyYXRpb24uaCBiL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oCmlu
ZGV4IDg0MmE5OTUuLmI2OTYwOTIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVk
U3R5bGVEZWNsYXJhdGlvbi5oCisrKyBiL1dlYkNvcmUvY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNs
YXJhdGlvbi5oCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlICJDU1NTdHlsZURlY2xhcmF0
aW9uLmgiCiAjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRz
LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtMzMsNyArMzQsNyBAQCBlbnVtIEVVcGRh
dGVMYXlvdXQgeyBEb05vdFVwZGF0ZUxheW91dCA9IGZhbHNlLCBVcGRhdGVMYXlvdXQgPSB0cnVl
IH07CiAKIGNsYXNzIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbiA6IHB1YmxpYyBDU1NTdHls
ZURlY2xhcmF0aW9uIHsKIHB1YmxpYzoKLSAgICBmcmllbmQgUGFzc1JlZlB0cjxDU1NDb21wdXRl
ZFN0eWxlRGVjbGFyYXRpb24+IGNvbXB1dGVkU3R5bGUoUGFzc1JlZlB0cjxOb2RlPik7CisgICAg
ZnJpZW5kIFBhc3NSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uPiBjb21wdXRlZFN0
eWxlKFBhc3NSZWZQdHI8Tm9kZT4sIGNvbnN0IFN0cmluZyYgcHNldWRvRWxlbWVudE5hbWUpOwog
ICAgIHZpcnR1YWwgfkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbigpOwogCiAgICAgdmlydHVh
bCBTdHJpbmcgY3NzVGV4dCgpIGNvbnN0OwpAQCAtNjAsNyArNjEsNyBAQCBwcm90ZWN0ZWQ6CiAg
ICAgdmlydHVhbCBib29sIGNzc1Byb3BlcnR5TWF0Y2hlcyhjb25zdCBDU1NQcm9wZXJ0eSopIGNv
bnN0OwogCiBwcml2YXRlOgotICAgIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbihQYXNzUmVm
UHRyPE5vZGU+KTsKKyAgICBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24oUGFzc1JlZlB0cjxO
b2RlPiwgY29uc3QgU3RyaW5nJik7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0Q3NzVGV4dChjb25z
dCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7CiAKQEAgLTcwLDExICs3MSwxMiBAQCBwcml2YXRl
OgogICAgIFBhc3NSZWZQdHI8Q1NTVmFsdWU+IHZhbHVlRm9yU2hhZG93KGNvbnN0IFNoYWRvd0Rh
dGEqLCBpbnQpIGNvbnN0OwogCiAgICAgUmVmUHRyPE5vZGU+IG1fbm9kZTsKKyAgICBQc2V1ZG9J
ZCBtX3BzZXVkb0VsZW1lbnRTcGVjaWZpZXI7CiB9OwogCi1pbmxpbmUgUGFzc1JlZlB0cjxDU1ND
b21wdXRlZFN0eWxlRGVjbGFyYXRpb24+IGNvbXB1dGVkU3R5bGUoUGFzc1JlZlB0cjxOb2RlPiBu
b2RlKQoraW5saW5lIFBhc3NSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uPiBjb21w
dXRlZFN0eWxlKFBhc3NSZWZQdHI8Tm9kZT4gbm9kZSwgY29uc3QgU3RyaW5nJiBwc2V1ZG9FbGVt
ZW50TmFtZSA9IFN0cmluZygpKQogewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ1NTQ29tcHV0
ZWRTdHlsZURlY2xhcmF0aW9uKG5vZGUpKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IENTU0Nv
bXB1dGVkU3R5bGVEZWNsYXJhdGlvbihub2RlLCBwc2V1ZG9FbGVtZW50TmFtZSkpOwogfQogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2Nzcy9DU1NTZWxlY3Rv
ci5jcHAgYi9XZWJDb3JlL2Nzcy9DU1NTZWxlY3Rvci5jcHAKaW5kZXggNDUzNjQyYS4uODhhZTBj
YiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3IuY3BwCisrKyBiL1dlYkNvcmUv
Y3NzL0NTU1NlbGVjdG9yLmNwcApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgInd0Zi9Bc3Nl
cnRpb25zLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAKKyNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewpAQCAtNjUsMTEgKzY2LDE0OCBAQCB1bnNpZ25lZCBpbnQgQ1NTU2VsZWN0b3I6OnNwZWNpZmlj
aXR5KCkKICAgICByZXR1cm4gcyAmIDB4ZmZmZmZmOwogfQogCi12b2lkIENTU1NlbGVjdG9yOjpl
eHRyYWN0UHNldWRvVHlwZSgpIGNvbnN0CitQc2V1ZG9JZCBDU1NTZWxlY3Rvcjo6cHNldWRvSWQo
UHNldWRvVHlwZSB0eXBlKQogewotICAgIGlmIChtX21hdGNoICE9IFBzZXVkb0NsYXNzICYmIG1f
bWF0Y2ggIT0gUHNldWRvRWxlbWVudCkKLSAgICAgICAgcmV0dXJuOworICAgIHN3aXRjaCAodHlw
ZSkgeworICAgIGNhc2UgUHNldWRvRmlyc3RMaW5lOgorICAgICAgICByZXR1cm4gRklSU1RfTElO
RTsKKyAgICBjYXNlIFBzZXVkb0ZpcnN0TGV0dGVyOgorICAgICAgICByZXR1cm4gRklSU1RfTEVU
VEVSOworICAgIGNhc2UgUHNldWRvU2VsZWN0aW9uOgorICAgICAgICByZXR1cm4gU0VMRUNUSU9O
OworICAgIGNhc2UgUHNldWRvQmVmb3JlOgorICAgICAgICByZXR1cm4gQkVGT1JFOworICAgIGNh
c2UgUHNldWRvQWZ0ZXI6CisgICAgICAgIHJldHVybiBBRlRFUjsKKyAgICBjYXNlIFBzZXVkb0Zp
bGVVcGxvYWRCdXR0b246CisgICAgICAgIHJldHVybiBGSUxFX1VQTE9BRF9CVVRUT047CisjaWYg
RU5BQkxFKERBVEFMSVNUKQorICAgIGNhc2UgUHNldWRvSW5wdXRMaXN0QnV0dG9uOgorICAgICAg
ICByZXR1cm4gSU5QVVRfTElTVF9CVVRUT047CisjZW5kaWYKKyAgICBjYXNlIFBzZXVkb0lucHV0
UGxhY2Vob2xkZXI6CisgICAgICAgIHJldHVybiBJTlBVVF9QTEFDRUhPTERFUjsKKyAgICBjYXNl
IFBzZXVkb1NsaWRlclRodW1iOgorICAgICAgICByZXR1cm4gU0xJREVSX1RIVU1COworICAgIGNh
c2UgUHNldWRvU2VhcmNoQ2FuY2VsQnV0dG9uOgorICAgICAgICByZXR1cm4gU0VBUkNIX0NBTkNF
TF9CVVRUT047CisgICAgY2FzZSBQc2V1ZG9TZWFyY2hEZWNvcmF0aW9uOgorICAgICAgICByZXR1
cm4gU0VBUkNIX0RFQ09SQVRJT047CisgICAgY2FzZSBQc2V1ZG9TZWFyY2hSZXN1bHRzRGVjb3Jh
dGlvbjoKKyAgICAgICAgcmV0dXJuIFNFQVJDSF9SRVNVTFRTX0RFQ09SQVRJT047CisgICAgY2Fz
ZSBQc2V1ZG9TZWFyY2hSZXN1bHRzQnV0dG9uOgorICAgICAgICByZXR1cm4gU0VBUkNIX1JFU1VM
VFNfQlVUVE9OOworICAgIGNhc2UgUHNldWRvTWVkaWFDb250cm9sc1BhbmVsOgorICAgICAgICBy
ZXR1cm4gTUVESUFfQ09OVFJPTFNfUEFORUw7CisgICAgY2FzZSBQc2V1ZG9NZWRpYUNvbnRyb2xz
TXV0ZUJ1dHRvbjoKKyAgICAgICAgcmV0dXJuIE1FRElBX0NPTlRST0xTX01VVEVfQlVUVE9OOwor
ICAgIGNhc2UgUHNldWRvTWVkaWFDb250cm9sc1BsYXlCdXR0b246CisgICAgICAgIHJldHVybiBN
RURJQV9DT05UUk9MU19QTEFZX0JVVFRPTjsKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNU
aW1lbGluZUNvbnRhaW5lcjoKKyAgICAgICAgcmV0dXJuIE1FRElBX0NPTlRST0xTX1RJTUVMSU5F
X0NPTlRBSU5FUjsKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNWb2x1bWVTbGlkZXJDb250
YWluZXI6CisgICAgICAgIHJldHVybiBNRURJQV9DT05UUk9MU19WT0xVTUVfU0xJREVSX0NPTlRB
SU5FUjsKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNDdXJyZW50VGltZURpc3BsYXk6Cisg
ICAgICAgIHJldHVybiBNRURJQV9DT05UUk9MU19DVVJSRU5UX1RJTUVfRElTUExBWTsKKyAgICBj
YXNlIFBzZXVkb01lZGlhQ29udHJvbHNUaW1lUmVtYWluaW5nRGlzcGxheToKKyAgICAgICAgcmV0
dXJuIE1FRElBX0NPTlRST0xTX1RJTUVfUkVNQUlOSU5HX0RJU1BMQVk7CisgICAgY2FzZSBQc2V1
ZG9NZWRpYUNvbnRyb2xzVGltZWxpbmU6CisgICAgICAgIHJldHVybiBNRURJQV9DT05UUk9MU19U
SU1FTElORTsKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNWb2x1bWVTbGlkZXI6CisgICAg
ICAgIHJldHVybiBNRURJQV9DT05UUk9MU19WT0xVTUVfU0xJREVSOworICAgIGNhc2UgUHNldWRv
TWVkaWFDb250cm9sc1NlZWtCYWNrQnV0dG9uOgorICAgICAgICByZXR1cm4gTUVESUFfQ09OVFJP
TFNfU0VFS19CQUNLX0JVVFRPTjsKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNTZWVrRm9y
d2FyZEJ1dHRvbjoKKyAgICAgICAgcmV0dXJuIE1FRElBX0NPTlRST0xTX1NFRUtfRk9SV0FSRF9C
VVRUT047CisgICAgY2FzZSBQc2V1ZG9NZWRpYUNvbnRyb2xzUmV3aW5kQnV0dG9uOgorICAgICAg
ICByZXR1cm4gTUVESUFfQ09OVFJPTFNfUkVXSU5EX0JVVFRPTjsKKyAgICBjYXNlIFBzZXVkb01l
ZGlhQ29udHJvbHNSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uOgorICAgICAgICByZXR1cm4gTUVESUFf
Q09OVFJPTFNfUkVUVVJOX1RPX1JFQUxUSU1FX0JVVFRPTjsKKyAgICBjYXNlIFBzZXVkb01lZGlh
Q29udHJvbHNUb2dnbGVDbG9zZWRDYXB0aW9uczoKKyAgICAgICAgcmV0dXJuIE1FRElBX0NPTlRS
T0xTX1RPR0dMRV9DTE9TRURfQ0FQVElPTlNfQlVUVE9OOworICAgIGNhc2UgUHNldWRvTWVkaWFD
b250cm9sc1N0YXR1c0Rpc3BsYXk6CisgICAgICAgIHJldHVybiBNRURJQV9DT05UUk9MU19TVEFU
VVNfRElTUExBWTsKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNGdWxsc2NyZWVuQnV0dG9u
OgorICAgICAgICByZXR1cm4gTUVESUFfQ09OVFJPTFNfRlVMTFNDUkVFTl9CVVRUT047CisgICAg
Y2FzZSBQc2V1ZG9TY3JvbGxiYXI6CisgICAgICAgIHJldHVybiBTQ1JPTExCQVI7CisgICAgY2Fz
ZSBQc2V1ZG9TY3JvbGxiYXJCdXR0b246CisgICAgICAgIHJldHVybiBTQ1JPTExCQVJfQlVUVE9O
OworICAgIGNhc2UgUHNldWRvU2Nyb2xsYmFyQ29ybmVyOgorICAgICAgICByZXR1cm4gU0NST0xM
QkFSX0NPUk5FUjsKKyAgICBjYXNlIFBzZXVkb1Njcm9sbGJhclRodW1iOgorICAgICAgICByZXR1
cm4gU0NST0xMQkFSX1RIVU1COworICAgIGNhc2UgUHNldWRvU2Nyb2xsYmFyVHJhY2s6CisgICAg
ICAgIHJldHVybiBTQ1JPTExCQVJfVFJBQ0s7CisgICAgY2FzZSBQc2V1ZG9TY3JvbGxiYXJUcmFj
a1BpZWNlOgorICAgICAgICByZXR1cm4gU0NST0xMQkFSX1RSQUNLX1BJRUNFOworICAgIGNhc2Ug
UHNldWRvUmVzaXplcjoKKyAgICAgICAgcmV0dXJuIFJFU0laRVI7CisgICAgY2FzZSBQc2V1ZG9J
bm5lclNwaW5CdXR0b246CisgICAgICAgIHJldHVybiBJTk5FUl9TUElOX0JVVFRPTjsKKyAgICBj
YXNlIFBzZXVkb091dGVyU3BpbkJ1dHRvbjoKKyAgICAgICAgcmV0dXJuIE9VVEVSX1NQSU5fQlVU
VE9OOworICAgIGNhc2UgUHNldWRvVW5rbm93bjoKKyAgICBjYXNlIFBzZXVkb0VtcHR5OgorICAg
IGNhc2UgUHNldWRvRmlyc3RDaGlsZDoKKyAgICBjYXNlIFBzZXVkb0ZpcnN0T2ZUeXBlOgorICAg
IGNhc2UgUHNldWRvTGFzdENoaWxkOgorICAgIGNhc2UgUHNldWRvTGFzdE9mVHlwZToKKyAgICBj
YXNlIFBzZXVkb09ubHlDaGlsZDoKKyAgICBjYXNlIFBzZXVkb09ubHlPZlR5cGU6CisgICAgY2Fz
ZSBQc2V1ZG9OdGhDaGlsZDoKKyAgICBjYXNlIFBzZXVkb050aE9mVHlwZToKKyAgICBjYXNlIFBz
ZXVkb050aExhc3RDaGlsZDoKKyAgICBjYXNlIFBzZXVkb050aExhc3RPZlR5cGU6CisgICAgY2Fz
ZSBQc2V1ZG9MaW5rOgorICAgIGNhc2UgUHNldWRvVmlzaXRlZDoKKyAgICBjYXNlIFBzZXVkb0Fu
eUxpbms6CisgICAgY2FzZSBQc2V1ZG9BdXRvZmlsbDoKKyAgICBjYXNlIFBzZXVkb0hvdmVyOgor
ICAgIGNhc2UgUHNldWRvRHJhZzoKKyAgICBjYXNlIFBzZXVkb0ZvY3VzOgorICAgIGNhc2UgUHNl
dWRvQWN0aXZlOgorICAgIGNhc2UgUHNldWRvQ2hlY2tlZDoKKyAgICBjYXNlIFBzZXVkb0VuYWJs
ZWQ6CisgICAgY2FzZSBQc2V1ZG9GdWxsUGFnZU1lZGlhOgorICAgIGNhc2UgUHNldWRvRGVmYXVs
dDoKKyAgICBjYXNlIFBzZXVkb0Rpc2FibGVkOgorICAgIGNhc2UgUHNldWRvT3B0aW9uYWw6Cisg
ICAgY2FzZSBQc2V1ZG9SZXF1aXJlZDoKKyAgICBjYXNlIFBzZXVkb1JlYWRPbmx5OgorICAgIGNh
c2UgUHNldWRvUmVhZFdyaXRlOgorICAgIGNhc2UgUHNldWRvVmFsaWQ6CisgICAgY2FzZSBQc2V1
ZG9JbnZhbGlkOgorICAgIGNhc2UgUHNldWRvSW5kZXRlcm1pbmF0ZToKKyAgICBjYXNlIFBzZXVk
b1RhcmdldDoKKyAgICBjYXNlIFBzZXVkb0xhbmc6CisgICAgY2FzZSBQc2V1ZG9Ob3Q6CisgICAg
Y2FzZSBQc2V1ZG9Sb290OgorICAgIGNhc2UgUHNldWRvU2Nyb2xsYmFyQmFjazoKKyAgICBjYXNl
IFBzZXVkb1Njcm9sbGJhckZvcndhcmQ6CisgICAgY2FzZSBQc2V1ZG9XaW5kb3dJbmFjdGl2ZToK
KyAgICBjYXNlIFBzZXVkb0Nvcm5lclByZXNlbnQ6CisgICAgY2FzZSBQc2V1ZG9EZWNyZW1lbnQ6
CisgICAgY2FzZSBQc2V1ZG9JbmNyZW1lbnQ6CisgICAgY2FzZSBQc2V1ZG9Ib3Jpem9udGFsOgor
ICAgIGNhc2UgUHNldWRvVmVydGljYWw6CisgICAgY2FzZSBQc2V1ZG9TdGFydDoKKyAgICBjYXNl
IFBzZXVkb0VuZDoKKyAgICBjYXNlIFBzZXVkb0RvdWJsZUJ1dHRvbjoKKyAgICBjYXNlIFBzZXVk
b1NpbmdsZUJ1dHRvbjoKKyAgICBjYXNlIFBzZXVkb05vQnV0dG9uOgorICAgICAgICByZXR1cm4g
Tk9QU0VVRE87CisgICAgY2FzZSBQc2V1ZG9Ob3RQYXJzZWQ6CisgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gTk9QU0VVRE87CisgICAgfQorCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIE5PUFNFVURPOworfQogCitzdGF0aWMgSGFzaE1h
cDxBdG9taWNTdHJpbmdJbXBsKiwgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGU+KiBuYW1lVG9Qc2V1
ZG9UeXBlTWFwKCkKK3sKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgYWN0
aXZlLCAoImFjdGl2ZSIpKTsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywg
YWZ0ZXIsICgiYWZ0ZXIiKSk7CiAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcs
IGFueUxpbmssICgiLXdlYmtpdC1hbnktbGluayIpKTsKQEAgLTE2MSwyMzIgKzI5OSwyMTggQEAg
dm9pZCBDU1NTZWxlY3Rvcjo6ZXh0cmFjdFBzZXVkb1R5cGUoKSBjb25zdAogICAgIERFRklORV9T
VEFUSUNfTE9DQUwoQXRvbWljU3RyaW5nLCBub0J1dHRvbiwgKCJuby1idXR0b24iKSk7CiAgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIGNvcm5lclByZXNlbnQsICgiY29ybmVy
LXByZXNlbnQiKSk7CiAKKyAgICBzdGF0aWMgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQ1NT
U2VsZWN0b3I6OlBzZXVkb1R5cGU+KiBuYW1lVG9Qc2V1ZG9UeXBlID0gMDsKKyAgICBpZiAoIW5h
bWVUb1BzZXVkb1R5cGUpIHsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZSA9IG5ldyBIYXNoTWFw
PEF0b21pY1N0cmluZ0ltcGwqLCBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZT47CisgICAgICAgIG5h
bWVUb1BzZXVkb1R5cGUtPnNldChhY3RpdmUuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvQWN0
aXZlKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGFmdGVyLmltcGwoKSwgQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0FmdGVyKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGFueUxp
bmsuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvQW55TGluayk7CisgICAgICAgIG5hbWVUb1Bz
ZXVkb1R5cGUtPnNldChhdXRvZmlsbC5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9BdXRvZmls
bCk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChiZWZvcmUuaW1wbCgpLCBDU1NTZWxl
Y3Rvcjo6UHNldWRvQmVmb3JlKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGNoZWNr
ZWQuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvQ2hlY2tlZCk7CisgICAgICAgIG5hbWVUb1Bz
ZXVkb1R5cGUtPnNldChmaWxlVXBsb2FkQnV0dG9uLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVk
b0ZpbGVVcGxvYWRCdXR0b24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoZGVmYXVs
dFN0cmluZy5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9EZWZhdWx0KTsKKyAgICAgICAgbmFt
ZVRvUHNldWRvVHlwZS0+c2V0KGRpc2FibGVkLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb0Rp
c2FibGVkKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KHJlYWRPbmx5LmltcGwoKSwg
Q1NTU2VsZWN0b3I6OlBzZXVkb1JlYWRPbmx5KTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+
c2V0KHJlYWRXcml0ZS5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9SZWFkV3JpdGUpOworICAg
ICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQodmFsaWQuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNl
dWRvVmFsaWQpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoaW52YWxpZC5pbXBsKCks
IENTU1NlbGVjdG9yOjpQc2V1ZG9JbnZhbGlkKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+
c2V0KGRyYWcuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvRHJhZyk7CisgICAgICAgIG5hbWVU
b1BzZXVkb1R5cGUtPnNldChkcmFnQWxpYXMuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvRHJh
Zyk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChlbmFibGVkLmltcGwoKSwgQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0VuYWJsZWQpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoZW1w
dHkuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvRW1wdHkpOworICAgICAgICBuYW1lVG9Qc2V1
ZG9UeXBlLT5zZXQoZmlyc3RDaGlsZC5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdENo
aWxkKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGZ1bGxQYWdlTWVkaWEuaW1wbCgp
LCBDU1NTZWxlY3Rvcjo6UHNldWRvRnVsbFBhZ2VNZWRpYSk7CisjaWYgRU5BQkxFKERBVEFMSVNU
KQorICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoaW5wdXRMaXN0QnV0dG9uLmltcGwoKSwg
Q1NTU2VsZWN0b3I6OlBzZXVkb0lucHV0TGlzdEJ1dHRvbik7CisjZW5kaWYKKyAgICAgICAgbmFt
ZVRvUHNldWRvVHlwZS0+c2V0KGlucHV0UGxhY2Vob2xkZXIuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6
UHNldWRvSW5wdXRQbGFjZWhvbGRlcik7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChs
YXN0Q2hpbGQuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTGFzdENoaWxkKTsKKyAgICAgICAg
bmFtZVRvUHNldWRvVHlwZS0+c2V0KGxhc3RPZlR5cGUuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNl
dWRvTGFzdE9mVHlwZSk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChvbmx5Q2hpbGQu
aW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvT25seUNoaWxkKTsKKyAgICAgICAgbmFtZVRvUHNl
dWRvVHlwZS0+c2V0KG9ubHlPZlR5cGUuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvT25seU9m
VHlwZSk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChmaXJzdExldHRlci5pbXBsKCks
IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdExldHRlcik7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5
cGUtPnNldChmaXJzdExpbmUuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RMaW5lKTsK
KyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGZpcnN0T2ZUeXBlLmltcGwoKSwgQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0ZpcnN0T2ZUeXBlKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0
KGZvY3VzLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb0ZvY3VzKTsKKyAgICAgICAgbmFtZVRv
UHNldWRvVHlwZS0+c2V0KGhvdmVyLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb0hvdmVyKTsK
KyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGluZGV0ZXJtaW5hdGUuaW1wbCgpLCBDU1NT
ZWxlY3Rvcjo6UHNldWRvSW5kZXRlcm1pbmF0ZSk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUt
PnNldChpbm5lclNwaW5CdXR0b24uaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvSW5uZXJTcGlu
QnV0dG9uKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGxpbmsuaW1wbCgpLCBDU1NT
ZWxlY3Rvcjo6UHNldWRvTGluayk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChsYW5n
LmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb0xhbmcpOworICAgICAgICBuYW1lVG9Qc2V1ZG9U
eXBlLT5zZXQobWVkaWFDb250cm9sc1BhbmVsLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb01l
ZGlhQ29udHJvbHNQYW5lbCk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChtZWRpYUNv
bnRyb2xzTXV0ZUJ1dHRvbi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9NZWRpYUNvbnRyb2xz
TXV0ZUJ1dHRvbik7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChtZWRpYUNvbnRyb2xz
UGxheUJ1dHRvbi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9NZWRpYUNvbnRyb2xzUGxheUJ1
dHRvbik7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChtZWRpYUNvbnRyb2xzQ3VycmVu
dFRpbWVEaXNwbGF5LmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb01lZGlhQ29udHJvbHNDdXJy
ZW50VGltZURpc3BsYXkpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQobWVkaWFDb250
cm9sc1RpbWVSZW1haW5pbmdEaXNwbGF5LmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb01lZGlh
Q29udHJvbHNUaW1lUmVtYWluaW5nRGlzcGxheSk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUt
PnNldChtZWRpYUNvbnRyb2xzVGltZWxpbmUuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTWVk
aWFDb250cm9sc1RpbWVsaW5lKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KG1lZGlh
Q29udHJvbHNWb2x1bWVTbGlkZXIuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTWVkaWFDb250
cm9sc1ZvbHVtZVNsaWRlcik7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChtZWRpYUNv
bnRyb2xzU2Vla0JhY2tCdXR0b24uaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTWVkaWFDb250
cm9sc1NlZWtCYWNrQnV0dG9uKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KG1lZGlh
Q29udHJvbHNTZWVrRm9yd2FyZEJ1dHRvbi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9NZWRp
YUNvbnRyb2xzU2Vla0ZvcndhcmRCdXR0b24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5z
ZXQobWVkaWFDb250cm9sc1Jld2luZEJ1dHRvbi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9N
ZWRpYUNvbnRyb2xzUmV3aW5kQnV0dG9uKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0
KG1lZGlhQ29udHJvbHNSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uLmltcGwoKSwgQ1NTU2VsZWN0b3I6
OlBzZXVkb01lZGlhQ29udHJvbHNSZXR1cm5Ub1JlYWx0aW1lQnV0dG9uKTsKKyAgICAgICAgbmFt
ZVRvUHNldWRvVHlwZS0+c2V0KG1lZGlhQ29udHJvbHNUb2dnbGVDbG9zZWRDYXB0aW9uc0J1dHRv
bi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9NZWRpYUNvbnRyb2xzVG9nZ2xlQ2xvc2VkQ2Fw
dGlvbnMpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQobWVkaWFDb250cm9sc1N0YXR1
c0Rpc3BsYXkuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTWVkaWFDb250cm9sc1N0YXR1c0Rp
c3BsYXkpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQobWVkaWFDb250cm9sc0Z1bGxz
Y3JlZW5CdXR0b24uaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTWVkaWFDb250cm9sc0Z1bGxz
Y3JlZW5CdXR0b24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQobWVkaWFDb250cm9s
c1RpbWVsaW5lQ29udGFpbmVyLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb01lZGlhQ29udHJv
bHNUaW1lbGluZUNvbnRhaW5lcik7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChtZWRp
YUNvbnRyb2xzVm9sdW1lU2xpZGVyQ29udGFpbmVyLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVk
b01lZGlhQ29udHJvbHNWb2x1bWVTbGlkZXJDb250YWluZXIpOworICAgICAgICBuYW1lVG9Qc2V1
ZG9UeXBlLT5zZXQobm90U3RyLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb05vdCk7CisgICAg
ICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChudGhDaGlsZC5pbXBsKCksIENTU1NlbGVjdG9yOjpQ
c2V1ZG9OdGhDaGlsZCk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChudGhPZlR5cGUu
aW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTnRoT2ZUeXBlKTsKKyAgICAgICAgbmFtZVRvUHNl
dWRvVHlwZS0+c2V0KG50aExhc3RDaGlsZC5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9OdGhM
YXN0Q2hpbGQpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQobnRoTGFzdE9mVHlwZS5p
bXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9OdGhMYXN0T2ZUeXBlKTsKKyAgICAgICAgbmFtZVRv
UHNldWRvVHlwZS0+c2V0KG91dGVyU3BpbkJ1dHRvbi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1
ZG9PdXRlclNwaW5CdXR0b24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQocm9vdC5p
bXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9Sb290KTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlw
ZS0+c2V0KHdpbmRvd0luYWN0aXZlLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb1dpbmRvd0lu
YWN0aXZlKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGRlY3JlbWVudC5pbXBsKCks
IENTU1NlbGVjdG9yOjpQc2V1ZG9EZWNyZW1lbnQpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBl
LT5zZXQoaW5jcmVtZW50LmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb0luY3JlbWVudCk7Cisg
ICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChzdGFydC5pbXBsKCksIENTU1NlbGVjdG9yOjpQ
c2V1ZG9TdGFydCk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChlbmQuaW1wbCgpLCBD
U1NTZWxlY3Rvcjo6UHNldWRvRW5kKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KGhv
cml6b250YWwuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvSG9yaXpvbnRhbCk7CisgICAgICAg
IG5hbWVUb1BzZXVkb1R5cGUtPnNldCh2ZXJ0aWNhbC5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1
ZG9WZXJ0aWNhbCk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChkb3VibGVCdXR0b24u
aW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvRG91YmxlQnV0dG9uKTsKKyAgICAgICAgbmFtZVRv
UHNldWRvVHlwZS0+c2V0KHNpbmdsZUJ1dHRvbi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9T
aW5nbGVCdXR0b24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQobm9CdXR0b24uaW1w
bCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvTm9CdXR0b24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9U
eXBlLT5zZXQob3B0aW9uYWwuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvT3B0aW9uYWwpOwor
ICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQocmVxdWlyZWQuaW1wbCgpLCBDU1NTZWxlY3Rv
cjo6UHNldWRvUmVxdWlyZWQpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQocmVzaXpl
ci5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9SZXNpemVyKTsKKyAgICAgICAgbmFtZVRvUHNl
dWRvVHlwZS0+c2V0KHNjcm9sbGJhci5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9TY3JvbGxi
YXIpOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoc2Nyb2xsYmFyQnV0dG9uLmltcGwo
KSwgQ1NTU2VsZWN0b3I6OlBzZXVkb1Njcm9sbGJhckJ1dHRvbik7CisgICAgICAgIG5hbWVUb1Bz
ZXVkb1R5cGUtPnNldChzY3JvbGxiYXJDb3JuZXIuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRv
U2Nyb2xsYmFyQ29ybmVyKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KHNjcm9sbGJh
clRodW1iLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb1Njcm9sbGJhclRodW1iKTsKKyAgICAg
ICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0KHNjcm9sbGJhclRyYWNrLmltcGwoKSwgQ1NTU2VsZWN0
b3I6OlBzZXVkb1Njcm9sbGJhclRyYWNrKTsKKyAgICAgICAgbmFtZVRvUHNldWRvVHlwZS0+c2V0
KHNjcm9sbGJhclRyYWNrUGllY2UuaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvU2Nyb2xsYmFy
VHJhY2tQaWVjZSk7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldChjb3JuZXJQcmVzZW50
LmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb0Nvcm5lclByZXNlbnQpOworICAgICAgICBuYW1l
VG9Qc2V1ZG9UeXBlLT5zZXQoc2VhcmNoQ2FuY2VsQnV0dG9uLmltcGwoKSwgQ1NTU2VsZWN0b3I6
OlBzZXVkb1NlYXJjaENhbmNlbEJ1dHRvbik7CisgICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNl
dChzZWFyY2hEZWNvcmF0aW9uLmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb1NlYXJjaERlY29y
YXRpb24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoc2VhcmNoUmVzdWx0c0RlY29y
YXRpb24uaW1wbCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvU2VhcmNoUmVzdWx0c0RlY29yYXRpb24p
OworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoc2VhcmNoUmVzdWx0c0J1dHRvbi5pbXBs
KCksIENTU1NlbGVjdG9yOjpQc2V1ZG9TZWFyY2hSZXN1bHRzQnV0dG9uKTsKKyAgICAgICAgbmFt
ZVRvUHNldWRvVHlwZS0+c2V0KHNlbGVjdGlvbi5pbXBsKCksIENTU1NlbGVjdG9yOjpQc2V1ZG9T
ZWxlY3Rpb24pOworICAgICAgICBuYW1lVG9Qc2V1ZG9UeXBlLT5zZXQoc2xpZGVyVGh1bWIuaW1w
bCgpLCBDU1NTZWxlY3Rvcjo6UHNldWRvU2xpZGVyVGh1bWIpOworICAgICAgICBuYW1lVG9Qc2V1
ZG9UeXBlLT5zZXQodGFyZ2V0LmltcGwoKSwgQ1NTU2VsZWN0b3I6OlBzZXVkb1RhcmdldCk7Cisg
ICAgICAgIG5hbWVUb1BzZXVkb1R5cGUtPnNldCh2aXNpdGVkLmltcGwoKSwgQ1NTU2VsZWN0b3I6
OlBzZXVkb1Zpc2l0ZWQpOworICAgIH0KKyAgICByZXR1cm4gbmFtZVRvUHNldWRvVHlwZTsKK30K
KworQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgQ1NTU2VsZWN0b3I6OnBhcnNlUHNldWRvVHlwZShj
b25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAgaWYgKG5hbWUuaXNOdWxsKCkpCisgICAg
ICAgIHJldHVybiBQc2V1ZG9Vbmtub3duOworICAgIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCos
IENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlPiogbmFtZVRvUHNldWRvVHlwZSA9IG5hbWVUb1BzZXVk
b1R5cGVNYXAoKTsKKyAgICBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBDU1NTZWxlY3Rvcjo6
UHNldWRvVHlwZT46Oml0ZXJhdG9yIHNsb3QgPSBuYW1lVG9Qc2V1ZG9UeXBlLT5maW5kKG5hbWUu
aW1wbCgpKTsKKyAgICByZXR1cm4gc2xvdCA9PSBuYW1lVG9Qc2V1ZG9UeXBlLT5lbmQoKSA/IFBz
ZXVkb1Vua25vd24gOiBzbG90LT5zZWNvbmQ7Cit9CisKK3ZvaWQgQ1NTU2VsZWN0b3I6OmV4dHJh
Y3RQc2V1ZG9UeXBlKCkgY29uc3QKK3sKKyAgICBpZiAobV9tYXRjaCAhPSBQc2V1ZG9DbGFzcyAm
JiBtX21hdGNoICE9IFBzZXVkb0VsZW1lbnQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHNl
dWRvVHlwZSA9IHBhcnNlUHNldWRvVHlwZShtX3ZhbHVlKTsKKwogICAgIGJvb2wgZWxlbWVudCA9
IGZhbHNlOyAvLyBwc2V1ZG8tZWxlbWVudAogICAgIGJvb2wgY29tcGF0ID0gZmFsc2U7IC8vIHNp
bmdsZSBjb2xvbiBjb21wYXRiaWxpdHkgbW9kZQogCi0gICAgbV9wc2V1ZG9UeXBlID0gUHNldWRv
VW5rbm93bjsKLSAgICBpZiAobV92YWx1ZSA9PSBhY3RpdmUpCi0gICAgICAgIG1fcHNldWRvVHlw
ZSA9IFBzZXVkb0FjdGl2ZTsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGFmdGVyKSB7Ci0gICAg
ICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb0FmdGVyOwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsK
LSAgICAgICAgY29tcGF0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFsdWUgPT0gYW55TGlu
aykKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvQW55TGluazsKLSAgICBlbHNlIGlmICht
X3ZhbHVlID09IGF1dG9maWxsKQotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9BdXRvZmls
bDsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGJlZm9yZSkgewotICAgICAgICBtX3BzZXVkb1R5
cGUgPSBQc2V1ZG9CZWZvcmU7Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwotICAgICAgICBjb21w
YXQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAobV92YWx1ZSA9PSBjaGVja2VkKQotICAgICAgICBt
X3BzZXVkb1R5cGUgPSBQc2V1ZG9DaGVja2VkOwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gZmls
ZVVwbG9hZEJ1dHRvbikgewotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9GaWxlVXBsb2Fk
QnV0dG9uOwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFsdWUg
PT0gZGVmYXVsdFN0cmluZykKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvRGVmYXVsdDsK
LSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGRpc2FibGVkKQotICAgICAgICBtX3BzZXVkb1R5cGUg
PSBQc2V1ZG9EaXNhYmxlZDsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IHJlYWRPbmx5KQotICAg
ICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9SZWFkT25seTsKLSAgICBlbHNlIGlmIChtX3ZhbHVl
ID09IHJlYWRXcml0ZSkKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvUmVhZFdyaXRlOwot
ICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gdmFsaWQpCi0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBz
ZXVkb1ZhbGlkOwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gaW52YWxpZCkKLSAgICAgICAgbV9w
c2V1ZG9UeXBlID0gUHNldWRvSW52YWxpZDsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGRyYWcg
fHwgbV92YWx1ZSA9PSBkcmFnQWxpYXMpCi0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb0Ry
YWc7Ci0gICAgZWxzZSBpZiAobV92YWx1ZSA9PSBlbmFibGVkKQotICAgICAgICBtX3BzZXVkb1R5
cGUgPSBQc2V1ZG9FbmFibGVkOwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gZW1wdHkpCi0gICAg
ICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb0VtcHR5OwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0g
Zmlyc3RDaGlsZCkKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvRmlyc3RDaGlsZDsKLSAg
ICBlbHNlIGlmIChtX3ZhbHVlID09IGZ1bGxQYWdlTWVkaWEpCi0gICAgICAgIG1fcHNldWRvVHlw
ZSA9IFBzZXVkb0Z1bGxQYWdlTWVkaWE7Ci0gICAgZWxzZQotI2lmIEVOQUJMRShEQVRBTElTVCkK
LSAgICBpZiAobV92YWx1ZSA9PSBpbnB1dExpc3RCdXR0b24pIHsKLSAgICAgICAgbV9wc2V1ZG9U
eXBlID0gUHNldWRvSW5wdXRMaXN0QnV0dG9uOwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAg
ICB9IGVsc2UKLSNlbmRpZgotICAgIGlmIChtX3ZhbHVlID09IGlucHV0UGxhY2Vob2xkZXIpIHsK
LSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvSW5wdXRQbGFjZWhvbGRlcjsKLSAgICAgICAg
ZWxlbWVudCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChtX3ZhbHVlID09IGxhc3RDaGlsZCkKLSAg
ICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvTGFzdENoaWxkOwotICAgIGVsc2UgaWYgKG1fdmFs
dWUgPT0gbGFzdE9mVHlwZSkKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvTGFzdE9mVHlw
ZTsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IG9ubHlDaGlsZCkKLSAgICAgICAgbV9wc2V1ZG9U
eXBlID0gUHNldWRvT25seUNoaWxkOwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gb25seU9mVHlw
ZSkKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvT25seU9mVHlwZTsKLSAgICBlbHNlIGlm
IChtX3ZhbHVlID09IGZpcnN0TGV0dGVyKSB7Ci0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVk
b0ZpcnN0TGV0dGVyOwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgY29tcGF0ID0g
dHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFsdWUgPT0gZmlyc3RMaW5lKSB7Ci0gICAgICAgIG1f
cHNldWRvVHlwZSA9IFBzZXVkb0ZpcnN0TGluZTsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Cisg
ICAgc3dpdGNoIChtX3BzZXVkb1R5cGUpIHsKKyAgICBjYXNlIFBzZXVkb0FmdGVyOgorICAgIGNh
c2UgUHNldWRvQmVmb3JlOgorICAgIGNhc2UgUHNldWRvRmlyc3RMZXR0ZXI6CisgICAgY2FzZSBQ
c2V1ZG9GaXJzdExpbmU6CiAgICAgICAgIGNvbXBhdCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICht
X3ZhbHVlID09IGZpcnN0T2ZUeXBlKQotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9GaXJz
dE9mVHlwZTsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGZvY3VzKQotICAgICAgICBtX3BzZXVk
b1R5cGUgPSBQc2V1ZG9Gb2N1czsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGhvdmVyKQotICAg
ICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9Ib3ZlcjsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09
IGluZGV0ZXJtaW5hdGUpCi0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb0luZGV0ZXJtaW5h
dGU7Ci0gICAgZWxzZSBpZiAobV92YWx1ZSA9PSBpbm5lclNwaW5CdXR0b24pIHsKLSAgICAgICAg
bV9wc2V1ZG9UeXBlID0gUHNldWRvSW5uZXJTcGluQnV0dG9uOwotICAgICAgICBlbGVtZW50ID0g
dHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFsdWUgPT0gbGluaykKLSAgICAgICAgbV9wc2V1ZG9U
eXBlID0gUHNldWRvTGluazsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGxhbmcpCi0gICAgICAg
IG1fcHNldWRvVHlwZSA9IFBzZXVkb0xhbmc7Ci0gICAgZWxzZSBpZiAobV92YWx1ZSA9PSBtZWRp
YUNvbnRyb2xzUGFuZWwpIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvTWVkaWFDb250
cm9sc1BhbmVsOwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFs
dWUgPT0gbWVkaWFDb250cm9sc011dGVCdXR0b24pIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0g
UHNldWRvTWVkaWFDb250cm9sc011dGVCdXR0b247Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwot
ICAgIH0gZWxzZSBpZiAobV92YWx1ZSA9PSBtZWRpYUNvbnRyb2xzUGxheUJ1dHRvbikgewotICAg
ICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9NZWRpYUNvbnRyb2xzUGxheUJ1dHRvbjsKLSAgICAg
ICAgZWxlbWVudCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChtX3ZhbHVlID09IG1lZGlhQ29udHJv
bHNDdXJyZW50VGltZURpc3BsYXkpIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvTWVk
aWFDb250cm9sc0N1cnJlbnRUaW1lRGlzcGxheTsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Ci0g
ICAgfSBlbHNlIGlmIChtX3ZhbHVlID09IG1lZGlhQ29udHJvbHNUaW1lUmVtYWluaW5nRGlzcGxh
eSkgewotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9NZWRpYUNvbnRyb2xzVGltZVJlbWFp
bmluZ0Rpc3BsYXk7Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAobV92
YWx1ZSA9PSBtZWRpYUNvbnRyb2xzVGltZWxpbmUpIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0g
UHNldWRvTWVkaWFDb250cm9sc1RpbWVsaW5lOwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAg
ICB9IGVsc2UgaWYgKG1fdmFsdWUgPT0gbWVkaWFDb250cm9sc1ZvbHVtZVNsaWRlcikgewotICAg
ICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9NZWRpYUNvbnRyb2xzVm9sdW1lU2xpZGVyOwotICAg
ICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFsdWUgPT0gbWVkaWFDb250
cm9sc1NlZWtCYWNrQnV0dG9uKSB7Ci0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb01lZGlh
Q29udHJvbHNTZWVrQmFja0J1dHRvbjsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Ci0gICAgfSBl
bHNlIGlmIChtX3ZhbHVlID09IG1lZGlhQ29udHJvbHNTZWVrRm9yd2FyZEJ1dHRvbikgewotICAg
ICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9NZWRpYUNvbnRyb2xzU2Vla0ZvcndhcmRCdXR0b247
Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAobV92YWx1ZSA9PSBtZWRp
YUNvbnRyb2xzUmV3aW5kQnV0dG9uKSB7Ci0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb01l
ZGlhQ29udHJvbHNSZXdpbmRCdXR0b247Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwotICAgIH0g
ZWxzZSBpZiAobV92YWx1ZSA9PSBtZWRpYUNvbnRyb2xzUmV0dXJuVG9SZWFsdGltZUJ1dHRvbikg
ewotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9NZWRpYUNvbnRyb2xzUmV0dXJuVG9SZWFs
dGltZUJ1dHRvbjsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChtX3Zh
bHVlID09IG1lZGlhQ29udHJvbHNUb2dnbGVDbG9zZWRDYXB0aW9uc0J1dHRvbikgewotICAgICAg
ICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9NZWRpYUNvbnRyb2xzVG9nZ2xlQ2xvc2VkQ2FwdGlvbnM7
Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAobV92YWx1ZSA9PSBtZWRp
YUNvbnRyb2xzU3RhdHVzRGlzcGxheSkgewotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9N
ZWRpYUNvbnRyb2xzU3RhdHVzRGlzcGxheTsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Ci0gICAg
fSBlbHNlIGlmIChtX3ZhbHVlID09IG1lZGlhQ29udHJvbHNGdWxsc2NyZWVuQnV0dG9uKSB7Ci0g
ICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb01lZGlhQ29udHJvbHNGdWxsc2NyZWVuQnV0dG9u
OwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFsdWUgPT0gbWVk
aWFDb250cm9sc1RpbWVsaW5lQ29udGFpbmVyKSB7Ci0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBz
ZXVkb01lZGlhQ29udHJvbHNUaW1lbGluZUNvbnRhaW5lcjsKLSAgICAgICAgZWxlbWVudCA9IHRy
dWU7Ci0gICAgfSBlbHNlIGlmIChtX3ZhbHVlID09IG1lZGlhQ29udHJvbHNWb2x1bWVTbGlkZXJD
b250YWluZXIpIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvTWVkaWFDb250cm9sc1Zv
bHVtZVNsaWRlckNvbnRhaW5lcjsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Ci0gICAgfSBlbHNl
IGlmIChtX3ZhbHVlID09IG5vdFN0cikKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvTm90
OwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gbnRoQ2hpbGQpCi0gICAgICAgIG1fcHNldWRvVHlw
ZSA9IFBzZXVkb050aENoaWxkOwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gbnRoT2ZUeXBlKQot
ICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9OdGhPZlR5cGU7Ci0gICAgZWxzZSBpZiAobV92
YWx1ZSA9PSBudGhMYXN0Q2hpbGQpCi0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb050aExh
c3RDaGlsZDsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IG50aExhc3RPZlR5cGUpCi0gICAgICAg
IG1fcHNldWRvVHlwZSA9IFBzZXVkb050aExhc3RPZlR5cGU7Ci0gICAgZWxzZSBpZiAobV92YWx1
ZSA9PSBvdXRlclNwaW5CdXR0b24pIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvT3V0
ZXJTcGluQnV0dG9uOwotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1f
dmFsdWUgPT0gcm9vdCkKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvUm9vdDsKLSAgICBl
bHNlIGlmIChtX3ZhbHVlID09IHdpbmRvd0luYWN0aXZlKQotICAgICAgICBtX3BzZXVkb1R5cGUg
PSBQc2V1ZG9XaW5kb3dJbmFjdGl2ZTsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGRlY3JlbWVu
dCkKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvRGVjcmVtZW50OwotICAgIGVsc2UgaWYg
KG1fdmFsdWUgPT0gaW5jcmVtZW50KQotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9JbmNy
ZW1lbnQ7Ci0gICAgZWxzZSBpZiAobV92YWx1ZSA9PSBzdGFydCkKLSAgICAgICAgbV9wc2V1ZG9U
eXBlID0gUHNldWRvU3RhcnQ7Ci0gICAgZWxzZSBpZiAobV92YWx1ZSA9PSBlbmQpCi0gICAgICAg
IG1fcHNldWRvVHlwZSA9IFBzZXVkb0VuZDsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09IGhvcml6
b250YWwpCi0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb0hvcml6b250YWw7Ci0gICAgZWxz
ZSBpZiAobV92YWx1ZSA9PSB2ZXJ0aWNhbCkKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRv
VmVydGljYWw7Ci0gICAgZWxzZSBpZiAobV92YWx1ZSA9PSBkb3VibGVCdXR0b24pCi0gICAgICAg
IG1fcHNldWRvVHlwZSA9IFBzZXVkb0RvdWJsZUJ1dHRvbjsKLSAgICBlbHNlIGlmIChtX3ZhbHVl
ID09IHNpbmdsZUJ1dHRvbikKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvU2luZ2xlQnV0
dG9uOwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gbm9CdXR0b24pCi0gICAgICAgIG1fcHNldWRv
VHlwZSA9IFBzZXVkb05vQnV0dG9uOwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gb3B0aW9uYWwp
Ci0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb09wdGlvbmFsOwotICAgIGVsc2UgaWYgKG1f
dmFsdWUgPT0gcmVxdWlyZWQpCi0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb1JlcXVpcmVk
OwotICAgIGVsc2UgaWYgKG1fdmFsdWUgPT0gc2Nyb2xsYmFyQ29ybmVyKSB7Ci0gICAgICAgIGVs
ZW1lbnQgPSB0cnVlOwotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9TY3JvbGxiYXJDb3Ju
ZXI7Ci0gICAgfSBlbHNlIGlmIChtX3ZhbHVlID09IHJlc2l6ZXIpIHsKLSAgICAgICAgZWxlbWVu
dCA9IHRydWU7Ci0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb1Jlc2l6ZXI7Ci0gICAgfSBl
bHNlIGlmIChtX3ZhbHVlID09IHNjcm9sbGJhcikgewotICAgICAgICBlbGVtZW50ID0gdHJ1ZTsK
LSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvU2Nyb2xsYmFyOwotICAgIH0gZWxzZSBpZiAo
bV92YWx1ZSA9PSBzY3JvbGxiYXJCdXR0b24pIHsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Ci0g
ICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb1Njcm9sbGJhckJ1dHRvbjsKLSAgICB9IGVsc2Ug
aWYgKG1fdmFsdWUgPT0gc2Nyb2xsYmFyQ29ybmVyKSB7Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVl
OwotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9TY3JvbGxiYXJDb3JuZXI7Ci0gICAgfSBl
bHNlIGlmIChtX3ZhbHVlID09IHNjcm9sbGJhclRodW1iKSB7Ci0gICAgICAgIGVsZW1lbnQgPSB0
cnVlOwotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9TY3JvbGxiYXJUaHVtYjsKLSAgICB9
IGVsc2UgaWYgKG1fdmFsdWUgPT0gc2Nyb2xsYmFyVHJhY2spIHsKLSAgICAgICAgZWxlbWVudCA9
IHRydWU7Ci0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb1Njcm9sbGJhclRyYWNrOwotICAg
IH0gZWxzZSBpZiAobV92YWx1ZSA9PSBzY3JvbGxiYXJUcmFja1BpZWNlKSB7Ci0gICAgICAgIGVs
ZW1lbnQgPSB0cnVlOwotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9TY3JvbGxiYXJUcmFj
a1BpZWNlOwotICAgIH0gZWxzZSBpZiAobV92YWx1ZSA9PSBjb3JuZXJQcmVzZW50KQotICAgICAg
ICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvQ29ybmVyUHJlc2VudDsKLSAgICBlbHNlIGlmIChtX3Zh
bHVlID09IHNlYXJjaENhbmNlbEJ1dHRvbikgewotICAgICAgICBtX3BzZXVkb1R5cGUgPSBQc2V1
ZG9TZWFyY2hDYW5jZWxCdXR0b247Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwotICAgIH0gZWxz
ZSBpZiAobV92YWx1ZSA9PSBzZWFyY2hEZWNvcmF0aW9uKSB7Ci0gICAgICAgIG1fcHNldWRvVHlw
ZSA9IFBzZXVkb1NlYXJjaERlY29yYXRpb247Ci0gICAgICAgIGVsZW1lbnQgPSB0cnVlOwotICAg
IH0gZWxzZSBpZiAobV92YWx1ZSA9PSBzZWFyY2hSZXN1bHRzRGVjb3JhdGlvbikgewotICAgICAg
ICBtX3BzZXVkb1R5cGUgPSBQc2V1ZG9TZWFyY2hSZXN1bHRzRGVjb3JhdGlvbjsKLSAgICAgICAg
ZWxlbWVudCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChtX3ZhbHVlID09IHNlYXJjaFJlc3VsdHNC
dXR0b24pIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvU2VhcmNoUmVzdWx0c0J1dHRv
bjsKLSAgICAgICAgZWxlbWVudCA9IHRydWU7Ci0gICAgfSAgZWxzZSBpZiAobV92YWx1ZSA9PSBz
ZWxlY3Rpb24pIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvU2VsZWN0aW9uOwotICAg
ICAgICBlbGVtZW50ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdmFsdWUgPT0gc2xpZGVyVGh1
bWIpIHsKLSAgICAgICAgbV9wc2V1ZG9UeXBlID0gUHNldWRvU2xpZGVyVGh1bWI7Ci0gICAgICAg
IGVsZW1lbnQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAobV92YWx1ZSA9PSB0YXJnZXQpCi0gICAg
ICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb1RhcmdldDsKLSAgICBlbHNlIGlmIChtX3ZhbHVlID09
IHZpc2l0ZWQpCi0gICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb1Zpc2l0ZWQ7CisgICAgY2Fz
ZSBQc2V1ZG9GaWxlVXBsb2FkQnV0dG9uOgorICAgIGNhc2UgUHNldWRvSW5wdXRMaXN0QnV0dG9u
OgorICAgIGNhc2UgUHNldWRvSW5wdXRQbGFjZWhvbGRlcjoKKyAgICBjYXNlIFBzZXVkb0lubmVy
U3BpbkJ1dHRvbjoKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNQYW5lbDoKKyAgICBjYXNl
IFBzZXVkb01lZGlhQ29udHJvbHNNdXRlQnV0dG9uOgorICAgIGNhc2UgUHNldWRvTWVkaWFDb250
cm9sc1BsYXlCdXR0b246CisgICAgY2FzZSBQc2V1ZG9NZWRpYUNvbnRyb2xzQ3VycmVudFRpbWVE
aXNwbGF5OgorICAgIGNhc2UgUHNldWRvTWVkaWFDb250cm9sc1RpbWVSZW1haW5pbmdEaXNwbGF5
OgorICAgIGNhc2UgUHNldWRvTWVkaWFDb250cm9sc1RpbWVsaW5lOgorICAgIGNhc2UgUHNldWRv
TWVkaWFDb250cm9sc1ZvbHVtZVNsaWRlcjoKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNT
ZWVrQmFja0J1dHRvbjoKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNTZWVrRm9yd2FyZEJ1
dHRvbjoKKyAgICBjYXNlIFBzZXVkb01lZGlhQ29udHJvbHNSZXdpbmRCdXR0b246CisgICAgY2Fz
ZSBQc2V1ZG9NZWRpYUNvbnRyb2xzUmV0dXJuVG9SZWFsdGltZUJ1dHRvbjoKKyAgICBjYXNlIFBz
ZXVkb01lZGlhQ29udHJvbHNUb2dnbGVDbG9zZWRDYXB0aW9uczoKKyAgICBjYXNlIFBzZXVkb01l
ZGlhQ29udHJvbHNTdGF0dXNEaXNwbGF5OgorICAgIGNhc2UgUHNldWRvTWVkaWFDb250cm9sc0Z1
bGxzY3JlZW5CdXR0b246CisgICAgY2FzZSBQc2V1ZG9NZWRpYUNvbnRyb2xzVGltZWxpbmVDb250
YWluZXI6CisgICAgY2FzZSBQc2V1ZG9NZWRpYUNvbnRyb2xzVm9sdW1lU2xpZGVyQ29udGFpbmVy
OgorICAgIGNhc2UgUHNldWRvT3V0ZXJTcGluQnV0dG9uOgorICAgIGNhc2UgUHNldWRvUmVzaXpl
cjoKKyAgICBjYXNlIFBzZXVkb1Njcm9sbGJhcjoKKyAgICBjYXNlIFBzZXVkb1Njcm9sbGJhckNv
cm5lcjoKKyAgICBjYXNlIFBzZXVkb1Njcm9sbGJhckJ1dHRvbjoKKyAgICBjYXNlIFBzZXVkb1Nj
cm9sbGJhclRodW1iOgorICAgIGNhc2UgUHNldWRvU2Nyb2xsYmFyVHJhY2s6CisgICAgY2FzZSBQ
c2V1ZG9TY3JvbGxiYXJUcmFja1BpZWNlOgorICAgIGNhc2UgUHNldWRvU2VhcmNoQ2FuY2VsQnV0
dG9uOgorICAgIGNhc2UgUHNldWRvU2VhcmNoRGVjb3JhdGlvbjoKKyAgICBjYXNlIFBzZXVkb1Nl
YXJjaFJlc3VsdHNEZWNvcmF0aW9uOgorICAgIGNhc2UgUHNldWRvU2VhcmNoUmVzdWx0c0J1dHRv
bjoKKyAgICBjYXNlIFBzZXVkb1NlbGVjdGlvbjoKKyAgICBjYXNlIFBzZXVkb1NsaWRlclRodW1i
OgorICAgICAgICBlbGVtZW50ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQc2V1
ZG9Vbmtub3duOgorICAgIGNhc2UgUHNldWRvRW1wdHk6CisgICAgY2FzZSBQc2V1ZG9GaXJzdENo
aWxkOgorICAgIGNhc2UgUHNldWRvRmlyc3RPZlR5cGU6CisgICAgY2FzZSBQc2V1ZG9MYXN0Q2hp
bGQ6CisgICAgY2FzZSBQc2V1ZG9MYXN0T2ZUeXBlOgorICAgIGNhc2UgUHNldWRvT25seUNoaWxk
OgorICAgIGNhc2UgUHNldWRvT25seU9mVHlwZToKKyAgICBjYXNlIFBzZXVkb050aENoaWxkOgor
ICAgIGNhc2UgUHNldWRvTnRoT2ZUeXBlOgorICAgIGNhc2UgUHNldWRvTnRoTGFzdENoaWxkOgor
ICAgIGNhc2UgUHNldWRvTnRoTGFzdE9mVHlwZToKKyAgICBjYXNlIFBzZXVkb0xpbms6CisgICAg
Y2FzZSBQc2V1ZG9WaXNpdGVkOgorICAgIGNhc2UgUHNldWRvQW55TGluazoKKyAgICBjYXNlIFBz
ZXVkb0F1dG9maWxsOgorICAgIGNhc2UgUHNldWRvSG92ZXI6CisgICAgY2FzZSBQc2V1ZG9EcmFn
OgorICAgIGNhc2UgUHNldWRvRm9jdXM6CisgICAgY2FzZSBQc2V1ZG9BY3RpdmU6CisgICAgY2Fz
ZSBQc2V1ZG9DaGVja2VkOgorICAgIGNhc2UgUHNldWRvRW5hYmxlZDoKKyAgICBjYXNlIFBzZXVk
b0Z1bGxQYWdlTWVkaWE6CisgICAgY2FzZSBQc2V1ZG9EZWZhdWx0OgorICAgIGNhc2UgUHNldWRv
RGlzYWJsZWQ6CisgICAgY2FzZSBQc2V1ZG9PcHRpb25hbDoKKyAgICBjYXNlIFBzZXVkb1JlcXVp
cmVkOgorICAgIGNhc2UgUHNldWRvUmVhZE9ubHk6CisgICAgY2FzZSBQc2V1ZG9SZWFkV3JpdGU6
CisgICAgY2FzZSBQc2V1ZG9WYWxpZDoKKyAgICBjYXNlIFBzZXVkb0ludmFsaWQ6CisgICAgY2Fz
ZSBQc2V1ZG9JbmRldGVybWluYXRlOgorICAgIGNhc2UgUHNldWRvVGFyZ2V0OgorICAgIGNhc2Ug
UHNldWRvTGFuZzoKKyAgICBjYXNlIFBzZXVkb05vdDoKKyAgICBjYXNlIFBzZXVkb1Jvb3Q6Cisg
ICAgY2FzZSBQc2V1ZG9TY3JvbGxiYXJCYWNrOgorICAgIGNhc2UgUHNldWRvU2Nyb2xsYmFyRm9y
d2FyZDoKKyAgICBjYXNlIFBzZXVkb1dpbmRvd0luYWN0aXZlOgorICAgIGNhc2UgUHNldWRvQ29y
bmVyUHJlc2VudDoKKyAgICBjYXNlIFBzZXVkb0RlY3JlbWVudDoKKyAgICBjYXNlIFBzZXVkb0lu
Y3JlbWVudDoKKyAgICBjYXNlIFBzZXVkb0hvcml6b250YWw6CisgICAgY2FzZSBQc2V1ZG9WZXJ0
aWNhbDoKKyAgICBjYXNlIFBzZXVkb1N0YXJ0OgorICAgIGNhc2UgUHNldWRvRW5kOgorICAgIGNh
c2UgUHNldWRvRG91YmxlQnV0dG9uOgorICAgIGNhc2UgUHNldWRvU2luZ2xlQnV0dG9uOgorICAg
IGNhc2UgUHNldWRvTm9CdXR0b246CisgICAgY2FzZSBQc2V1ZG9Ob3RQYXJzZWQ6CisgICAgICAg
IGJyZWFrOworICAgIH0KIAogICAgIGlmIChtX21hdGNoID09IFBzZXVkb0NsYXNzICYmIGVsZW1l
bnQpIHsKLSAgICAgICAgaWYgKCFjb21wYXQpIAorICAgICAgICBpZiAoIWNvbXBhdCkKICAgICAg
ICAgICAgIG1fcHNldWRvVHlwZSA9IFBzZXVkb1Vua25vd247Ci0gICAgICAgIGVsc2UgCisgICAg
ICAgIGVsc2UKICAgICAgICAgICAgbV9tYXRjaCA9IFBzZXVkb0VsZW1lbnQ7CiAgICAgfSBlbHNl
IGlmIChtX21hdGNoID09IFBzZXVkb0VsZW1lbnQgJiYgIWVsZW1lbnQpCiAgICAgICAgIG1fcHNl
dWRvVHlwZSA9IFBzZXVkb1Vua25vd247CmRpZmYgLS1naXQgYS9XZWJDb3JlL2Nzcy9DU1NTZWxl
Y3Rvci5oIGIvV2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3IuaAppbmRleCBlNTRiNWQ1Li44NGY2MGIw
IDEwMDY0NAotLS0gYS9XZWJDb3JlL2Nzcy9DU1NTZWxlY3Rvci5oCisrKyBiL1dlYkNvcmUvY3Nz
L0NTU1NlbGVjdG9yLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpZm5kZWYgQ1NTU2VsZWN0b3JfaAog
I2RlZmluZSBDU1NTZWxlY3Rvcl9oCiAKKyNpbmNsdWRlICJSZW5kZXJTdHlsZUNvbnN0YW50cy5o
IgogI2luY2x1ZGUgIlF1YWxpZmllZE5hbWUuaCIKICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUu
aD4KICNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CkBAIC0xOTQsNyArMTk1LDEwIEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKICAgICAgICAgICAgICAgICBleHRyYWN0UHNldWRvVHlwZSgpOwogICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFBzZXVkb1R5cGU+KG1fcHNldWRvVHlwZSk7CiAgICAg
ICAgIH0KLSAgICAgICAgCisKKyAgICAgICAgc3RhdGljIFBzZXVkb1R5cGUgcGFyc2VQc2V1ZG9U
eXBlKGNvbnN0IEF0b21pY1N0cmluZyYpOworICAgICAgICBzdGF0aWMgUHNldWRvSWQgcHNldWRv
SWQoUHNldWRvVHlwZSk7CisKICAgICAgICAgQ1NTU2VsZWN0b3IqIHRhZ0hpc3RvcnkoKSBjb25z
dCB7IHJldHVybiBtX2hhc1JhcmVEYXRhID8gbV9kYXRhLm1fcmFyZURhdGEtPm1fdGFnSGlzdG9y
eS5nZXQoKSA6IG1fZGF0YS5tX3RhZ0hpc3Rvcnk7IH0KICAgICAgICAgdm9pZCBzZXRUYWdIaXN0
b3J5KENTU1NlbGVjdG9yKiB0YWdIaXN0b3J5KTsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9jc3Mv
Q1NTU3R5bGVTZWxlY3Rvci5jcHAgYi9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcApp
bmRleCBmZTY0Y2M5Li4zYjdiMzIzIDEwMDY0NAotLS0gYS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNl
bGVjdG9yLmNwcAorKysgYi9XZWJDb3JlL2Nzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcApAQCAtMjUw
NSwxMzIgKzI1MDUsMTYgQEAgYm9vbCBDU1NTdHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXI6
OmNoZWNrT25lU2VsZWN0b3IoQ1NTU2VsZWN0b3IqIHNlbCwgRWxlbWUKICAgICAgICAgaWYgKCFl
bGVtZW50U3R5bGUpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgc3dpdGNo
IChzZWwtPnBzZXVkb1R5cGUoKSkgewotICAgICAgICAgICAgLy8gUHNldWRvLWVsZW1lbnRzOgot
ICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RMaW5lOgotICAgICAgICAg
ICAgICAgIGR5bmFtaWNQc2V1ZG8gPSBGSVJTVF9MSU5FOwotICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RMZXR0ZXI6
Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IEZJUlNUX0xFVFRFUjsKLSAgICAgICAg
ICAgICAgICBpZiAoRG9jdW1lbnQqIGRvYyA9IGUtPmRvY3VtZW50KCkpCi0gICAgICAgICAgICAg
ICAgICAgIGRvYy0+c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXModHJ1ZSk7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9TZWxl
Y3Rpb246Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IFNFTEVDVElPTjsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBz
ZXVkb0JlZm9yZToKLSAgICAgICAgICAgICAgICBkeW5hbWljUHNldWRvID0gQkVGT1JFOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6
UHNldWRvQWZ0ZXI6Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IEFGVEVSOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6
UHNldWRvRmlsZVVwbG9hZEJ1dHRvbjoKLSAgICAgICAgICAgICAgICBkeW5hbWljUHNldWRvID0g
RklMRV9VUExPQURfQlVUVE9OOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotI2lmIEVO
QUJMRShEQVRBTElTVCkKLSAgICAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb0lucHV0
TGlzdEJ1dHRvbjoKLSAgICAgICAgICAgICAgICBkeW5hbWljUHNldWRvID0gSU5QVVRfTElTVF9C
VVRUT047Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSAgICAgICAgICAg
IGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb0lucHV0UGxhY2Vob2xkZXI6Ci0gICAgICAgICAgICAg
ICAgZHluYW1pY1BzZXVkbyA9IElOUFVUX1BMQUNFSE9MREVSOwotICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRvU2xpZGVyVGh1
bWI6Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IFNMSURFUl9USFVNQjsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsgCi0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpQ
c2V1ZG9TZWFyY2hDYW5jZWxCdXR0b246Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9
IFNFQVJDSF9DQU5DRUxfQlVUVE9OOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAKLSAg
ICAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb1NlYXJjaERlY29yYXRpb246Ci0gICAg
ICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IFNFQVJDSF9ERUNPUkFUSU9OOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRv
U2VhcmNoUmVzdWx0c0RlY29yYXRpb246Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9
IFNFQVJDSF9SRVNVTFRTX0RFQ09SQVRJT047Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9TZWFyY2hSZXN1bHRzQnV0dG9u
OgotICAgICAgICAgICAgICAgIGR5bmFtaWNQc2V1ZG8gPSBTRUFSQ0hfUkVTVUxUU19CVVRUT047
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVj
dG9yOjpQc2V1ZG9NZWRpYUNvbnRyb2xzUGFuZWw6Ci0gICAgICAgICAgICAgICAgZHluYW1pY1Bz
ZXVkbyA9IE1FRElBX0NPTlRST0xTX1BBTkVMOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRvTWVkaWFDb250cm9sc011dGVC
dXR0b246Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX01V
VEVfQlVUVE9OOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2Fz
ZSBDU1NTZWxlY3Rvcjo6UHNldWRvTWVkaWFDb250cm9sc1BsYXlCdXR0b246Ci0gICAgICAgICAg
ICAgICAgZHluYW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX1BMQVlfQlVUVE9OOwotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNl
dWRvTWVkaWFDb250cm9sc1RpbWVsaW5lQ29udGFpbmVyOgotICAgICAgICAgICAgICAgIGR5bmFt
aWNQc2V1ZG8gPSBNRURJQV9DT05UUk9MU19USU1FTElORV9DT05UQUlORVI7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9N
ZWRpYUNvbnRyb2xzVm9sdW1lU2xpZGVyQ29udGFpbmVyOgotICAgICAgICAgICAgICAgIGR5bmFt
aWNQc2V1ZG8gPSBNRURJQV9DT05UUk9MU19WT0xVTUVfU0xJREVSX0NPTlRBSU5FUjsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBz
ZXVkb01lZGlhQ29udHJvbHNDdXJyZW50VGltZURpc3BsYXk6Ci0gICAgICAgICAgICAgICAgZHlu
YW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX0NVUlJFTlRfVElNRV9ESVNQTEFZOwotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNl
dWRvTWVkaWFDb250cm9sc1RpbWVSZW1haW5pbmdEaXNwbGF5OgotICAgICAgICAgICAgICAgIGR5
bmFtaWNQc2V1ZG8gPSBNRURJQV9DT05UUk9MU19USU1FX1JFTUFJTklOR19ESVNQTEFZOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6
UHNldWRvTWVkaWFDb250cm9sc1RpbWVsaW5lOgotICAgICAgICAgICAgICAgIGR5bmFtaWNQc2V1
ZG8gPSBNRURJQV9DT05UUk9MU19USU1FTElORTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb01lZGlhQ29udHJvbHNWb2x1
bWVTbGlkZXI6Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xT
X1ZPTFVNRV9TTElERVI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9NZWRpYUNvbnRyb2xzU2Vla0JhY2tCdXR0b246Ci0g
ICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX1NFRUtfQkFDS19C
VVRUT047Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENT
U1NlbGVjdG9yOjpQc2V1ZG9NZWRpYUNvbnRyb2xzU2Vla0ZvcndhcmRCdXR0b246Ci0gICAgICAg
ICAgICAgICAgZHluYW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX1NFRUtfRk9SV0FSRF9CVVRU
T047Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1Nl
bGVjdG9yOjpQc2V1ZG9NZWRpYUNvbnRyb2xzUmV3aW5kQnV0dG9uOgotICAgICAgICAgICAgICAg
IGR5bmFtaWNQc2V1ZG8gPSBNRURJQV9DT05UUk9MU19SRVdJTkRfQlVUVE9OOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRv
TWVkaWFDb250cm9sc1JldHVyblRvUmVhbHRpbWVCdXR0b246Ci0gICAgICAgICAgICAgICAgZHlu
YW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX1JFVFVSTl9UT19SRUFMVElNRV9CVVRUT047Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9y
OjpQc2V1ZG9NZWRpYUNvbnRyb2xzVG9nZ2xlQ2xvc2VkQ2FwdGlvbnM6Ci0gICAgICAgICAgICAg
ICAgZHluYW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX1RPR0dMRV9DTE9TRURfQ0FQVElPTlNf
QlVUVE9OOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBD
U1NTZWxlY3Rvcjo6UHNldWRvTWVkaWFDb250cm9sc1N0YXR1c0Rpc3BsYXk6Ci0gICAgICAgICAg
ICAgICAgZHluYW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX1NUQVRVU19ESVNQTEFZOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6
UHNldWRvTWVkaWFDb250cm9sc0Z1bGxzY3JlZW5CdXR0b246Ci0gICAgICAgICAgICAgICAgZHlu
YW1pY1BzZXVkbyA9IE1FRElBX0NPTlRST0xTX0ZVTExTQ1JFRU5fQlVUVE9OOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRv
U2Nyb2xsYmFyOgotICAgICAgICAgICAgICAgIGR5bmFtaWNQc2V1ZG8gPSBTQ1JPTExCQVI7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9y
OjpQc2V1ZG9TY3JvbGxiYXJCdXR0b246Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9
IFNDUk9MTEJBUl9CVVRUT047Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
ICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9TY3JvbGxiYXJDb3JuZXI6Ci0gICAgICAgICAg
ICAgICAgZHluYW1pY1BzZXVkbyA9IFNDUk9MTEJBUl9DT1JORVI7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9TY3JvbGxi
YXJUaHVtYjoKLSAgICAgICAgICAgICAgICBkeW5hbWljUHNldWRvID0gU0NST0xMQkFSX1RIVU1C
OwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBDU1NTZWxl
Y3Rvcjo6UHNldWRvU2Nyb2xsYmFyVHJhY2s6Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVk
byA9IFNDUk9MTEJBUl9UUkFDSzsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb1Njcm9sbGJhclRyYWNrUGllY2U6Ci0gICAg
ICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IFNDUk9MTEJBUl9UUkFDS19QSUVDRTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBz
ZXVkb1Jlc2l6ZXI6Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IFJFU0laRVI7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9y
OjpQc2V1ZG9Jbm5lclNwaW5CdXR0b246Ci0gICAgICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9
IElOTkVSX1NQSU5fQlVUVE9OOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
ICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRvT3V0ZXJTcGluQnV0dG9uOgotICAgICAgICAg
ICAgICAgIGR5bmFtaWNQc2V1ZG8gPSBPVVRFUl9TUElOX0JVVFRPTjsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb1Vua25v
d246Ci0gICAgICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9Ob3RQYXJzZWQ6Ci0gICAg
ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBQc2V1ZG9JZCBwc2V1ZG9JZCA9IENTU1Nl
bGVjdG9yOjpwc2V1ZG9JZChzZWwtPnBzZXVkb1R5cGUoKSk7CisgICAgICAgIGlmIChwc2V1ZG9J
ZCA9PSBGSVJTVF9MRVRURVIpIHsKKyAgICAgICAgICAgIGlmIChEb2N1bWVudCogZG9jdW1lbnQg
PSBlLT5kb2N1bWVudCgpKQorICAgICAgICAgICAgICAgIGRvY3VtZW50LT5zZXRVc2VzRmlyc3RM
ZXR0ZXJSdWxlcyh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHNldWRvSWQgIT0gTk9Q
U0VVRE8pIHsKKyAgICAgICAgICAgIGR5bmFtaWNQc2V1ZG8gPSBwc2V1ZG9JZDsKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIC8vICMjIyBhZGQgdGhlIHJlc3Qg
b2YgdGhlIGNoZWNrcy4uLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAgYi9X
ZWJDb3JlL2RvbS9FbGVtZW50LmNwcAppbmRleCA4NzExMTEwLi4yNzg0ZTc3IDEwMDY0NAotLS0g
YS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAorKysgYi9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcApA
QCAtMTM5NSwxMCArMTM5NSwxMyBAQCB2b2lkIEVsZW1lbnQ6OnNldE1pbmltdW1TaXplRm9yUmVz
aXppbmcoY29uc3QgSW50U2l6ZSYgc2l6ZSkKICAgICBlbnN1cmVSYXJlRGF0YSgpLT5tX21pbmlt
dW1TaXplRm9yUmVzaXppbmcgPSBzaXplOwogfQogCi1SZW5kZXJTdHlsZSogRWxlbWVudDo6Y29t
cHV0ZWRTdHlsZSgpCitSZW5kZXJTdHlsZSogRWxlbWVudDo6Y29tcHV0ZWRTdHlsZShQc2V1ZG9J
ZCBwc2V1ZG9FbGVtZW50U3BlY2lmaWVyKQogeworICAgIC8vIEZJWE1FOiBGaW5kIGFuZCB1c2Ug
dGhlIHJlbmRlcmVyIGZyb20gdGhlIHBzZXVkbyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIGFjdHVh
bCBlbGVtZW50IHNvIHRoYXQgdGhlICdsZW5ndGgnCisgICAgLy8gcHJvcGVydGllcywgd2hpY2gg
YXJlIG9ubHkga25vd24gYnkgdGhlIHJlbmRlcmVyIGJlY2F1c2UgaXQgZGlkIHRoZSBsYXlvdXQs
IHdpbGwgYmUgY29ycmVjdCBhbmQgc28gdGhhdCB0aGUKKyAgICAvLyB2YWx1ZXMgcmV0dXJuZWQg
Zm9yIHRoZSAiOnNlbGVjdGlvbiIgcHNldWRvLWVsZW1lbnQgd2lsbCBiZSBjb3JyZWN0LgogICAg
IGlmIChSZW5kZXJTdHlsZSogdXNlZFN0eWxlID0gcmVuZGVyU3R5bGUoKSkKLSAgICAgICAgcmV0
dXJuIHVzZWRTdHlsZTsKKyAgICAgICAgcmV0dXJuIHBzZXVkb0VsZW1lbnRTcGVjaWZpZXIgPyB1
c2VkU3R5bGUtPmdldENhY2hlZFBzZXVkb1N0eWxlKHBzZXVkb0VsZW1lbnRTcGVjaWZpZXIpIDog
dXNlZFN0eWxlOwogCiAgICAgaWYgKCFhdHRhY2hlZCgpKQogICAgICAgICAvLyBGSVhNRTogVHJ5
IHRvIGRvIGJldHRlciB0aGFuIHRoaXMuIEVuc3VyZSB0aGF0IHN0eWxlRm9yRWxlbWVudCgpIHdv
cmtzIGZvciBlbGVtZW50cyB0aGF0IGFyZSBub3QgaW4gdGhlCkBAIC0xNDA4LDcgKzE0MTEsNyBA
QCBSZW5kZXJTdHlsZSogRWxlbWVudDo6Y29tcHV0ZWRTdHlsZSgpCiAgICAgRWxlbWVudFJhcmVE
YXRhKiBkYXRhID0gZW5zdXJlUmFyZURhdGEoKTsKICAgICBpZiAoIWRhdGEtPm1fY29tcHV0ZWRT
dHlsZSkKICAgICAgICAgZGF0YS0+bV9jb21wdXRlZFN0eWxlID0gZG9jdW1lbnQoKS0+c3R5bGVG
b3JFbGVtZW50SWdub3JpbmdQZW5kaW5nU3R5bGVzaGVldHModGhpcyk7Ci0gICAgcmV0dXJuIGRh
dGEtPm1fY29tcHV0ZWRTdHlsZS5nZXQoKTsKKyAgICByZXR1cm4gcHNldWRvRWxlbWVudFNwZWNp
ZmllciA/IGRhdGEtPm1fY29tcHV0ZWRTdHlsZS0+Z2V0Q2FjaGVkUHNldWRvU3R5bGUocHNldWRv
RWxlbWVudFNwZWNpZmllcikgOiBkYXRhLT5tX2NvbXB1dGVkU3R5bGUuZ2V0KCk7CiB9CiAKIHZv
aWQgRWxlbWVudDo6Y2FuY2VsRm9jdXNBcHBlYXJhbmNlVXBkYXRlKCkKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvZG9tL0VsZW1lbnQuaCBiL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAppbmRleCAzNDhlZDFj
Li45NmI5NmE1IDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9FbGVtZW50LmgKKysrIGIvV2ViQ29y
ZS9kb20vRWxlbWVudC5oCkBAIC0yMDEsNyArMjAxLDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwg
UmVuZGVyT2JqZWN0KiBjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSosIFJlbmRlclN0eWxlKik7
CiAgICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlID0gTm9DaGFuZ2UpOwog
Ci0gICAgdmlydHVhbCBSZW5kZXJTdHlsZSogY29tcHV0ZWRTdHlsZSgpOworICAgIFJlbmRlclN0
eWxlKiBjb21wdXRlZFN0eWxlKFBzZXVkb0lkID0gTk9QU0VVRE8pOwogCiAgICAgdm9pZCBkaXNw
YXRjaEF0dHJSZW1vdmFsRXZlbnQoQXR0cmlidXRlKik7CiAgICAgdm9pZCBkaXNwYXRjaEF0dHJB
ZGRpdGlvbkV2ZW50KEF0dHJpYnV0ZSopOwpAQCAtMzExLDYgKzMxMSw3IEBAIHByaXZhdGU6CiAg
ICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIHZpcnR1YWxQcmVmaXgoKSBjb25zdCB7IHJl
dHVybiBwcmVmaXgoKTsgfQogICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiB2aXJ0dWFs
TG9jYWxOYW1lKCkgY29uc3QgeyByZXR1cm4gbG9jYWxOYW1lKCk7IH0KICAgICB2aXJ0dWFsIGNv
bnN0IEF0b21pY1N0cmluZyYgdmlydHVhbE5hbWVzcGFjZVVSSSgpIGNvbnN0IHsgcmV0dXJuIG5h
bWVzcGFjZVVSSSgpOyB9CisgICAgdmlydHVhbCBSZW5kZXJTdHlsZSogdmlydHVhbENvbXB1dGVk
U3R5bGUoUHNldWRvSWQgcHNldWRvRWxlbWVudFNwZWNpZmllciA9IE5PUFNFVURPKSB7IHJldHVy
biBjb21wdXRlZFN0eWxlKHBzZXVkb0VsZW1lbnRTcGVjaWZpZXIpOyB9CiAgICAgCiAgICAgLy8g
Y2xvbmVOb2RlIGlzIHByaXZhdGUgc28gdGhhdCBub24tdmlydHVhbCBjbG9uZUVsZW1lbnRXaXRo
Q2hpbGRyZW4gYW5kIGNsb25lRWxlbWVudFdpdGhvdXRDaGlsZHJlbgogICAgIC8vIGFyZSB1c2Vk
IGluc3RlYWQuCmRpZmYgLS1naXQgYS9XZWJDb3JlL2RvbS9Ob2RlLmNwcCBiL1dlYkNvcmUvZG9t
L05vZGUuY3BwCmluZGV4IGRiMzRiYmUuLjAwYTgxNGQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZG9t
L05vZGUuY3BwCisrKyBiL1dlYkNvcmUvZG9tL05vZGUuY3BwCkBAIC0xNDMyLDkgKzE0MzIsOSBA
QCB2b2lkIE5vZGU6OnNldFJlbmRlclN0eWxlKFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHMpCiAg
ICAgICAgIG1fcmVuZGVyZXItPnNldEFuaW1hdGFibGVTdHlsZShzKTsgCiB9CiAKLVJlbmRlclN0
eWxlKiBOb2RlOjpjb21wdXRlZFN0eWxlKCkKK1JlbmRlclN0eWxlKiBOb2RlOjp2aXJ0dWFsQ29t
cHV0ZWRTdHlsZShQc2V1ZG9JZCBwc2V1ZG9FbGVtZW50U3BlY2lmaWVyKQogewotICAgIHJldHVy
biBwYXJlbnQoKSA/IHBhcmVudCgpLT5jb21wdXRlZFN0eWxlKCkgOiAwOworICAgIHJldHVybiBw
YXJlbnQoKSA/IHBhcmVudCgpLT5jb21wdXRlZFN0eWxlKHBzZXVkb0VsZW1lbnRTcGVjaWZpZXIp
IDogMDsKIH0KIAogaW50IE5vZGU6Om1heENoYXJhY3Rlck9mZnNldCgpIGNvbnN0CmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2RvbS9Ob2RlLmggYi9XZWJDb3JlL2RvbS9Ob2RlLmgKaW5kZXggM2Q3MTZm
ZC4uN2M3ZjRkMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9kb20vTm9kZS5oCisrKyBiL1dlYkNvcmUv
ZG9tL05vZGUuaApAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSAiRXZlbnRUYXJnZXQuaCIK
ICNpbmNsdWRlICJLVVJMSGFzaC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgi
CiAjaW5jbHVkZSAiU2NyaXB0V3JhcHBhYmxlLmgiCiAjaW5jbHVkZSAiVHJlZVNoYXJlZC5oIgog
I2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgpAQCAtNDQ1LDcgKzQ0Niw3IEBAIHB1YmxpYzoK
ICAgICBSZW5kZXJTdHlsZSogcmVuZGVyU3R5bGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQg
c2V0UmVuZGVyU3R5bGUoUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4pOwogCi0gICAgdmlydHVhbCBS
ZW5kZXJTdHlsZSogY29tcHV0ZWRTdHlsZSgpOworICAgIFJlbmRlclN0eWxlKiBjb21wdXRlZFN0
eWxlKFBzZXVkb0lkIHBzZXVkb0VsZW1lbnRTcGVjaWZpZXIgPSBOT1BTRVVETykgeyByZXR1cm4g
dmlydHVhbENvbXB1dGVkU3R5bGUocHNldWRvRWxlbWVudFNwZWNpZmllcik7IH0KIAogICAgIC8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gTm90aWZpY2F0aW9uIG9mIGRvY3VtZW50IHN0
cnVjdHVyZSBjaGFuZ2VzCkBAIC01OTksNiArNjAwLDcgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFs
IGNvbnN0IEF0b21pY1N0cmluZyYgdmlydHVhbFByZWZpeCgpIGNvbnN0OwogICAgIHZpcnR1YWwg
Y29uc3QgQXRvbWljU3RyaW5nJiB2aXJ0dWFsTG9jYWxOYW1lKCkgY29uc3Q7CiAgICAgdmlydHVh
bCBjb25zdCBBdG9taWNTdHJpbmcmIHZpcnR1YWxOYW1lc3BhY2VVUkkoKSBjb25zdDsKKyAgICB2
aXJ0dWFsIFJlbmRlclN0eWxlKiB2aXJ0dWFsQ29tcHV0ZWRTdHlsZShQc2V1ZG9JZCA9IE5PUFNF
VURPKTsKIAogICAgIEVsZW1lbnQqIGFuY2VzdG9yRWxlbWVudCgpIGNvbnN0OwogCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BhZ2UvRE9NV2luZG93LmNwcCBiL1dlYkNvcmUvcGFnZS9ET01XaW5kb3cu
Y3BwCmluZGV4IGRkOTAyMDAuLjRjNjA1ZjYgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGFnZS9ET01X
aW5kb3cuY3BwCisrKyBiL1dlYkNvcmUvcGFnZS9ET01XaW5kb3cuY3BwCkBAIC0xMTE5LDEzICsx
MTE5LDEyIEBAIFBhc3NSZWZQdHI8TWVkaWE+IERPTVdpbmRvdzo6bWVkaWEoKSBjb25zdAogICAg
IHJldHVybiBtX21lZGlhLmdldCgpOwogfQogCi1QYXNzUmVmUHRyPENTU1N0eWxlRGVjbGFyYXRp
b24+IERPTVdpbmRvdzo6Z2V0Q29tcHV0ZWRTdHlsZShFbGVtZW50KiBlbHQsIGNvbnN0IFN0cmlu
ZyYpIGNvbnN0CitQYXNzUmVmUHRyPENTU1N0eWxlRGVjbGFyYXRpb24+IERPTVdpbmRvdzo6Z2V0
Q29tcHV0ZWRTdHlsZShFbGVtZW50KiBlbHQsIGNvbnN0IFN0cmluZyYgcHNldWRvRWx0KSBjb25z
dAogewogICAgIGlmICghZWx0KQogICAgICAgICByZXR1cm4gMDsKIAotICAgIC8vIEZJWE1FOiBU
aGlzIG5lZWRzIHRha2UgcHNldWRvIGVsZW1lbnRzIGludG8gYWNjb3VudC4KLSAgICByZXR1cm4g
Y29tcHV0ZWRTdHlsZShlbHQpOworICAgIHJldHVybiBjb21wdXRlZFN0eWxlKGVsdCwgcHNldWRv
RWx0KTsKIH0KIAogUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gRE9NV2luZG93OjpnZXRNYXRjaGVk
Q1NTUnVsZXMoRWxlbWVudCogZWx0LCBjb25zdCBTdHJpbmcmIHBzZXVkb0VsdCwgYm9vbCBhdXRo
b3JPbmx5KSBjb25zdAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53748</attachid>
            <date>2010-04-19 17:34:35 -0700</date>
            <delta_ts>2010-04-19 17:40:45 -0700</delta_ts>
            <desc>Remove the space that was causing the test to fail on the Chromium bots. Also remove the platform specific results that were landed in the meantime.</desc>
            <filename>fixTestOnChromiumBots.patch</filename>
            <type>text/plain</type>
            <size>8043</size>
            <attacher name="Jessie Berlin">jberlin</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBjNDhlMDU5Li5iNGNhYWU2IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTAtMDQt
MTkgIEplc3NpZSBCZXJsaW4gIDxqYmVybGluQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVtb3ZlIGFuIGV4dHJhIHNwYWNlIGlu
IHRoZSBnZXRDb21wdXRlZFN0eWxlLXdpdGgtcHN1ZWRvLWVsZW1lbnQgdGVzdCB0aGF0IHdhcyBj
YXVzaW5nIGl0IHRvIGZhaWwgb24gdGhlIENocm9taXVtIGJvdHMsIGFuZCByZW1vdmUgdGhlIHBs
YXRmb3JtLXNwZWNpZmljIHJlc3VsdHMgdGhhdCB3ZXJlIGxhbmRlZCBpbiB0aGUgbWVhbnRpbWUu
CisKKyAgICAgICAgKiBmYXN0L2Nzcy9nZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUt
d2l0aC1wc2V1ZG8tZWxlbWVudC1leHBlY3RlZC50eHQ6CisgICAgICAgICogZmFzdC9jc3MvZ2V0
Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQuaHRtbDoK
KyAgICAgICAgKiBwbGF0Zm9ybS9jaHJvbWl1bS1saW51eC9mYXN0L2Nzcy9nZXRDb21wdXRlZFN0
eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC1leHBlY3RlZC50eHQ6IFJl
bW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0td2luL2Zhc3QvY3NzL2dldENvbXB1
dGVkU3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50LWV4cGVjdGVkLnR4
dDogUmVtb3ZlZC4KKwogMjAxMC0wNC0xOSAgQ2hyaXMgRmxlaXphY2ggIDxjZmxlaXphY2hAYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEJldGggRGFraW4uCmRpZmYgLS1naXQgYS9M
YXlvdXRUZXN0cy9mYXN0L2Nzcy9nZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0
aC1wc2V1ZG8tZWxlbWVudC1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9nZXRD
b21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC1leHBlY3Rl
ZC50eHQKaW5kZXggZmI4OWU2OS4uNDk1NzZmMSAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvZmFz
dC9jc3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1l
bnQtZXhwZWN0ZWQudHh0CisrKyBiL0xheW91dFRlc3RzL2Zhc3QvY3NzL2dldENvbXB1dGVkU3R5
bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50LWV4cGVjdGVkLnR4dApAQCAt
Nyw3ICs3LDcgQEAgTWlkZGxlCiAKIFRoZXJlIGFyZSBubyBwc2V1ZG8gZWxlbWVudHMgZGVmaW5l
ZCBvbiB0aGlzIGRpdi4KIAotIFRoaXMgc2hvdWxkIGJlIGF0IGZ1bGwgb3BhY2l0eS4KK1RoaXMg
c2hvdWxkIGJlIGF0IGZ1bGwgb3BhY2l0eS4KIAogUEFTUyBFeHBlY3RlZCAncmdiKDE2NSwgNDIs
IDQyKScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlk
IHRlc3RGaXJzdHMgYW5kIHBzZXVkby1lbGVtZW50IDpmaXJzdC1saW5lIGFuZCBnb3QgJ3JnYigx
NjUsIDQyLCA0MiknCiBQQVNTIEV4cGVjdGVkICdyZ2IoMCwgMCwgMjU1KScgZm9yIGNvbG9yIGlu
IHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3RGaXJzdHMgYW5kIHBz
ZXVkby1lbGVtZW50IDpmaXJzdC1sZXR0ZXIgYW5kIGdvdCAncmdiKDAsIDAsIDI1NSknCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9nZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVk
U3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC5odG1sIGIvTGF5b3V0VGVzdHMvZmFzdC9jc3MvZ2V0
Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQuaHRtbApp
bmRleCAwMWY3MDliLi44YWJhOTgyIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9mYXN0L2Nzcy9n
ZXRDb21wdXRlZFN0eWxlL2dldENvbXB1dGVkU3R5bGUtd2l0aC1wc2V1ZG8tZWxlbWVudC5odG1s
CisrKyBiL0xheW91dFRlc3RzL2Zhc3QvY3NzL2dldENvbXB1dGVkU3R5bGUvZ2V0Q29tcHV0ZWRT
dHlsZS13aXRoLXBzZXVkby1lbGVtZW50Lmh0bWwKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgIDxi
ciAvPgogICAgIDxkaXYgaWQ9InRlc3ROb1BzZXVkb0VsZW1lbnQiPlRoZXJlIGFyZSBubyBwc2V1
ZG8gZWxlbWVudHMgZGVmaW5lZCBvbiB0aGlzIGRpdi48L2Rpdj4KICAgICA8YnIgLz4KLSAgICA8
ZGl2IGlkPSJ0ZXN0SGFyZHdhcmVBY2NlbGVyYXRlZENvbXBvc2l0aW5nIj4gVGhpcyBzaG91bGQg
YmUgYXQgZnVsbCBvcGFjaXR5LjwvZGl2PgorICAgIDxkaXYgaWQ9InRlc3RIYXJkd2FyZUFjY2Vs
ZXJhdGVkQ29tcG9zaXRpbmciPlRoaXMgc2hvdWxkIGJlIGF0IGZ1bGwgb3BhY2l0eS48L2Rpdj4K
ICAgICA8YnIgLz4KICAgICA8ZGl2IGlkPSJyZXN1bHRzIj48L2Rpdj4KICAgPC9ib2R5PgpkaWZm
IC0tZ2l0IGEvTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGludXgvZmFzdC9jc3MvZ2V0
Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQtZXhwZWN0
ZWQudHh0IGIvTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGludXgvZmFzdC9jc3MvZ2V0
Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQtZXhwZWN0
ZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU3NmYxLi4wMDAwMDAwCi0t
LSBhL0xheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2Zhc3QvY3NzL2dldENvbXB1
dGVkU3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50LWV4cGVjdGVkLnR4
dAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLVRlc3QgZm9yIFdlYktpdCBidWcgMjQw
MjE6IHBzZXVkby1lbGVtZW50IHN0eWxlcyBub3QgYWNjZXNzaWJsZSAvIHJldHJpZXZhYmxlIHZp
YSBET00gbWV0aG9kcwotCi0KLW9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVy
IGFkaXBpc2ljaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxh
Ym9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVp
cyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4
IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5k
ZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxs
YSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVu
dCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3Qg
bGFib3J1bS4KLQotTWlkZGxlCi0KLVRoZXJlIGFyZSBubyBwc2V1ZG8gZWxlbWVudHMgZGVmaW5l
ZCBvbiB0aGlzIGRpdi4KLQotVGhpcyBzaG91bGQgYmUgYXQgZnVsbCBvcGFjaXR5LgotCi1QQVNT
IEV4cGVjdGVkICdyZ2IoMTY1LCA0MiwgNDIpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0
eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1lbnQgOmZp
cnN0LWxpbmUgYW5kIGdvdCAncmdiKDE2NSwgNDIsIDQyKScKLVBBU1MgRXhwZWN0ZWQgJ3JnYigw
LCAwLCAyNTUpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdp
dGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1lbnQgOmZpcnN0LWxldHRlciBhbmQgZ290
ICdyZ2IoMCwgMCwgMjU1KScKLVBBU1MgRXhwZWN0ZWQgJ3JnYigwLCAwLCAyNTUpJyBmb3IgY29s
b3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEZpcnN0cyBh
bmQgcHNldWRvLWVsZW1lbnQgOjpmaXJzdC1sZXR0ZXIgYW5kIGdvdCAncmdiKDAsIDAsIDI1NSkn
Ci1QQVNTIEV4cGVjdGVkICdyZ2IoMCwgMCwgMjU1KScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRl
ZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3RGaXJzdHMgYW5kIHBzZXVkby1lbGVtZW50
IGZpcnN0LWxldHRlciBhbmQgZ290ICdyZ2IoMCwgMCwgMjU1KScKLVBBU1MgRXhwZWN0ZWQgJ3Jn
YigwLCAwLCAwKScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3
aXRoIGlkIHRlc3RGaXJzdHMgYW5kIHBzZXVkby1lbGVtZW50IG51bGwgYW5kIGdvdCAncmdiKDAs
IDAsIDApJwotUEFTUyBFeHBlY3RlZCAncmdiKDE2NSwgNDIsIDQyKScgZm9yIGNvbG9yIGluIHRo
ZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3RCZWZvcmVBZnRlciBhbmQg
cHNldWRvLWVsZW1lbnQgOmJlZm9yZSBhbmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIpJwotUEFTUyBF
eHBlY3RlZCAncmdiKDAsIDAsIDI1NSknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUg
Zm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0QmVmb3JlQWZ0ZXIgYW5kIHBzZXVkby1lbGVtZW50IDph
ZnRlciBhbmQgZ290ICdyZ2IoMCwgMCwgMjU1KScKLVBBU1MgRXhwZWN0ZWQgJ3JnYigxNjUsIDQy
LCA0MiknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBp
ZCB0ZXN0Tm9Qc2V1ZG9FbGVtZW50IGFuZCBwc2V1ZG8tZWxlbWVudCBudWxsIGFuZCBnb3QgJ3Jn
YigxNjUsIDQyLCA0MiknCi1QQVNTIEV4cGVjdGVkICcnIGZvciBjb2xvciBpbiB0aGUgY29tcHV0
ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Tm9Qc2V1ZG9FbGVtZW50IGFuZCBwc2V1
ZG8tZWxlbWVudCA6Zmlyc3QtbGluZSBhbmQgZ290ICcnCi1QQVNTIEV4cGVjdGVkICdyZ2IoMTY1
LCA0MiwgNDIpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdp
dGggaWQgdGVzdE5vUHNldWRvRWxlbWVudCBhbmQgcHNldWRvLWVsZW1lbnQgOmdhcmJhZ2UgYW5k
IGdvdCAncmdiKDE2NSwgNDIsIDQyKScKLVBBU1MgRXhwZWN0ZWQgJzAuNScgZm9yIG9wYWNpdHkg
aW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEhhcmR3YXJlQWNj
ZWxlcmF0ZWRDb21wb3NpdGluZyBhbmQgcHNldWRvLWVsZW1lbnQgOmJlZm9yZSBhbmQgZ290ICcw
LjUnCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4vZmFzdC9j
c3MvZ2V0Q29tcHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQt
ZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0td2luL2Zhc3QvY3Nz
L2dldENvbXB1dGVkU3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS13aXRoLXBzZXVkby1lbGVtZW50LWV4
cGVjdGVkLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NzZmMS4uMDAwMDAw
MAotLS0gYS9MYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4vZmFzdC9jc3MvZ2V0Q29t
cHV0ZWRTdHlsZS9nZXRDb21wdXRlZFN0eWxlLXdpdGgtcHNldWRvLWVsZW1lbnQtZXhwZWN0ZWQu
dHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotVGVzdCBmb3IgV2ViS2l0IGJ1ZyAy
NDAyMTogcHNldWRvLWVsZW1lbnQgc3R5bGVzIG5vdCBhY2Nlc3NpYmxlIC8gcmV0cmlldmFibGUg
dmlhIERPTSBtZXRob2RzCi0KLQotb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0
dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQg
bGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBx
dWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAg
ZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhl
bmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51
bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lk
ZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVz
dCBsYWJvcnVtLgotCi1NaWRkbGUKLQotVGhlcmUgYXJlIG5vIHBzZXVkbyBlbGVtZW50cyBkZWZp
bmVkIG9uIHRoaXMgZGl2LgotCi1UaGlzIHNob3VsZCBiZSBhdCBmdWxsIG9wYWNpdHkuCi0KLVBB
U1MgRXhwZWN0ZWQgJ3JnYigxNjUsIDQyLCA0MiknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQg
c3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Rmlyc3RzIGFuZCBwc2V1ZG8tZWxlbWVudCA6
Zmlyc3QtbGluZSBhbmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIpJwotUEFTUyBFeHBlY3RlZCAncmdi
KDAsIDAsIDI1NSknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQg
d2l0aCBpZCB0ZXN0Rmlyc3RzIGFuZCBwc2V1ZG8tZWxlbWVudCA6Zmlyc3QtbGV0dGVyIGFuZCBn
b3QgJ3JnYigwLCAwLCAyNTUpJwotUEFTUyBFeHBlY3RlZCAncmdiKDAsIDAsIDI1NSknIGZvciBj
b2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0Rmlyc3Rz
IGFuZCBwc2V1ZG8tZWxlbWVudCA6OmZpcnN0LWxldHRlciBhbmQgZ290ICdyZ2IoMCwgMCwgMjU1
KScKLVBBU1MgRXhwZWN0ZWQgJ3JnYigwLCAwLCAyNTUpJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1
dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1l
bnQgZmlyc3QtbGV0dGVyIGFuZCBnb3QgJ3JnYigwLCAwLCAyNTUpJwotUEFTUyBFeHBlY3RlZCAn
cmdiKDAsIDAsIDApJyBmb3IgY29sb3IgaW4gdGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50
IHdpdGggaWQgdGVzdEZpcnN0cyBhbmQgcHNldWRvLWVsZW1lbnQgbnVsbCBhbmQgZ290ICdyZ2Io
MCwgMCwgMCknCi1QQVNTIEV4cGVjdGVkICdyZ2IoMTY1LCA0MiwgNDIpJyBmb3IgY29sb3IgaW4g
dGhlIGNvbXB1dGVkIHN0eWxlIGZvciBlbGVtZW50IHdpdGggaWQgdGVzdEJlZm9yZUFmdGVyIGFu
ZCBwc2V1ZG8tZWxlbWVudCA6YmVmb3JlIGFuZCBnb3QgJ3JnYigxNjUsIDQyLCA0MiknCi1QQVNT
IEV4cGVjdGVkICdyZ2IoMCwgMCwgMjU1KScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHls
ZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3RCZWZvcmVBZnRlciBhbmQgcHNldWRvLWVsZW1lbnQg
OmFmdGVyIGFuZCBnb3QgJ3JnYigwLCAwLCAyNTUpJwotUEFTUyBFeHBlY3RlZCAncmdiKDE2NSwg
NDIsIDQyKScgZm9yIGNvbG9yIGluIHRoZSBjb21wdXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRo
IGlkIHRlc3ROb1BzZXVkb0VsZW1lbnQgYW5kIHBzZXVkby1lbGVtZW50IG51bGwgYW5kIGdvdCAn
cmdiKDE2NSwgNDIsIDQyKScKLVBBU1MgRXhwZWN0ZWQgJycgZm9yIGNvbG9yIGluIHRoZSBjb21w
dXRlZCBzdHlsZSBmb3IgZWxlbWVudCB3aXRoIGlkIHRlc3ROb1BzZXVkb0VsZW1lbnQgYW5kIHBz
ZXVkby1lbGVtZW50IDpmaXJzdC1saW5lIGFuZCBnb3QgJycKLVBBU1MgRXhwZWN0ZWQgJ3JnYigx
NjUsIDQyLCA0MiknIGZvciBjb2xvciBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQg
d2l0aCBpZCB0ZXN0Tm9Qc2V1ZG9FbGVtZW50IGFuZCBwc2V1ZG8tZWxlbWVudCA6Z2FyYmFnZSBh
bmQgZ290ICdyZ2IoMTY1LCA0MiwgNDIpJwotUEFTUyBFeHBlY3RlZCAnMC41JyBmb3Igb3BhY2l0
eSBpbiB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIGVsZW1lbnQgd2l0aCBpZCB0ZXN0SGFyZHdhcmVB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nIGFuZCBwc2V1ZG8tZWxlbWVudCA6YmVmb3JlIGFuZCBnb3Qg
JzAuNScK
</data>

          </attachment>
      

    </bug>

</bugzilla>