<?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>27933</bug_id>
          
          <creation_ts>2009-08-02 03:37:12 -0700</creation_ts>
          <short_desc>SVG Filter premultiplied color support for getImageDate/putImageData</short_desc>
          <delta_ts>2014-05-12 05:54:35 -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>SVG</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>68469</blocked>
    
    <blocked>26389</blocked>
    
    <blocked>28133</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Schulze">krit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ariya.hidayat</cc>
    
    <cc>brettw</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>jeffschiller</cc>
    
    <cc>pkasting</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>136549</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-02 03:37:12 -0700</bug_when>
    <thetext>Some Filters need premultiplied colors for the calculation. Thats why  premultiplied color support for getImageDate/putImageData is needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136906</commentid>
    <comment_count>1</comment_count>
      <attachid>34037</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-03 23:30:49 -0700</bug_when>
    <thetext>Created attachment 34037
premultiplied color support for getImageData/putImageData

premultiplied color support for getImageData/putImageData. Still not sure if a simple boolean in getImageData/putImageData for premultiplied or not is enough.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137709</commentid>
    <comment_count>2</comment_count>
      <attachid>34037</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-06 18:11:09 -0700</bug_when>
    <thetext>Comment on attachment 34037
premultiplied color support for getImageData/putImageData

+== Rolled over to ChangeLog-2009-06-16 ==SVG Filter premultiplied color support for getImageDate/putImageData

??

is &quot;NotPreMultiplied&quot; the normal terminolgy?  &quot;unmultiplied&quot;?  Google seems to suggest that &quot;straight&quot; is the opposite of PreMultiplied  I&apos;m not sure that would be more clear here though.  Unmultiplied might be clearer than NotPreMultiplied.  I&apos;m not a graphics expert though.

No argument names:
         PassRefPtr&lt;ImageData&gt; getNotPreMultipliedImageData(const IntRect&amp; rect) const;
 73         PassRefPtr&lt;ImageData&gt; getPreMultipliedImageData(const IntRect&amp; rect) const;
 
they don&apos;t add anything.

Likewise here: ImageData* source

Seems we should add a &quot;colorFrom...&quot; for whatever type of pixel this is:
                 destRows[basex]     = (*pixel &amp; 0x00FF0000) &gt;&gt; 16;
 171                 destRows[basex + 1] = (*pixel &amp; 0x0000FF00) &gt;&gt; 8;
 172                 destRows[basex + 2] = (*pixel &amp; 0x0000FF00);
 173                 destRows[basex + 3] = (*pixel &amp; 0xFF000000) &gt;&gt; 24;

Then we just create the Color in an if and the pixel assignment is shared.

Same here:
*pixel = srcRows[basex + 3] &lt;&lt; 24 | srcRows[basex] &lt;&lt; 16 | srcRows[basex + 1] &lt;&lt; 8 | srcRows[basex + 2];

Better to use inlines to share more code.  They also are are more self-documenting.

Seems the toImage() result could be in a local:
     if (multiplied == NotPreMultiplied)
 134         image = data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
 135     else
 136         image = data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied)

How do we test this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138290</commentid>
    <comment_count>3</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-07 23:11:45 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; is &quot;NotPreMultiplied&quot; the normal terminolgy?  &quot;unmultiplied&quot;?  Google seems to
&gt; suggest that &quot;straight&quot; is the opposite of PreMultiplied  I&apos;m not sure that
&gt; would be more clear here though.  Unmultiplied might be clearer than
&gt; NotPreMultiplied.  I&apos;m not a graphics expert though.

The SVG specification call it not premultiplied, but I also found straight and unmultiplied. There is no consistent term. I&apos;ll use &quot;Unmultiplied&quot; and &quot;Premultiplied&quot; for the next patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138325</commentid>
    <comment_count>4</comment_count>
      <attachid>34365</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-08 06:08:54 -0700</bug_when>
    <thetext>Created attachment 34365
premultiplied color support for getImageData/putImageData

Corrected patch.

Testing is a bit difficult since only SVG Filters make use of premultiplied colors, as far as I know (at least for geImageData/putImageData). SVG Filters are neither activated nor does a  effect exist, that makes already use of premultiplied colors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139289</commentid>
    <comment_count>5</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-12 03:33:57 -0700</bug_when>
    <thetext>landed in r47099.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139290</commentid>
    <comment_count>6</comment_count>
      <attachid>34651</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-12 03:52:49 -0700</bug_when>
    <thetext>Created attachment 34651
premultiplied color support for Skia

This is a untested suggestion for Skia.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139291</commentid>
    <comment_count>7</comment_count>
      <attachid>34365</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-12 03:53:27 -0700</bug_when>
    <thetext>Comment on attachment 34365
premultiplied color support for getImageData/putImageData

clearing review flag.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139432</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-12 11:09:59 -0700</bug_when>
    <thetext>I think this would need a chromium person to try this locally.  How would they test if this worked?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139439</commentid>
    <comment_count>9</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-12 11:21:13 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; I think this would need a chromium person to try this locally.  How would they
&gt; test if this worked?
Hm... a posibility is to apply the last patch of https://bugs.webkit.org/show_bug.cgi?id=28133 replace getImageData with getPremultipliedImageData() and putImageData with putPremultipliedImageData(), build with --filter enabled and look at http://www.w3.org/Graphics/SVG/Test/20061213/htmlObjectHarness/full-filters-blend-01-b.html (ignore the first line, it&apos;s a bug in the filter implementation).

Sorry, I know that this is a bit complex just for testing, but it was a preperation for SVG filters.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139441</commentid>
    <comment_count>10</comment_count>
      <attachid>34651</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-12 11:22:42 -0700</bug_when>
    <thetext>Comment on attachment 34651
premultiplied color support for Skia

Seems this should be re-posted when it&apos;s easier to test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139442</commentid>
    <comment_count>11</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-12 11:24:00 -0700</bug_when>
    <thetext>Landed a build fix for Skia in r47126 (r47099 did not compile).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139488</commentid>
    <comment_count>12</comment_count>
      <attachid>34651</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-08-12 12:59:18 -0700</bug_when>
    <thetext>Comment on attachment 34651
premultiplied color support for Skia

&gt; Index: WebCore/platform/graphics/skia/SkiaUtils.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/skia/SkiaUtils.cpp	(revision 47098)
&gt; +++ WebCore/platform/graphics/skia/SkiaUtils.cpp	(working copy)
&gt; @@ -80,7 +80,7 @@ static U8CPU InvScaleByte(U8CPU componen
&gt;      return (component * scale + 0x8000) &gt;&gt; 16;
&gt;  }
&gt;  
&gt; -SkColor SkPMColorToColor(SkPMColor pm)
&gt; +SkColor SkUMColorToColor(SkPMColor pm)
&gt;  {
&gt;      if (0 == pm)
&gt;          return 0;
&gt; @@ -94,6 +94,17 @@ SkColor SkPMColorToColor(SkPMColor pm)
&gt;                            InvScaleByte(SkGetPackedB32(pm), scale));
&gt;  }
&gt;  
&gt; +SkColor SkPMColorToColor(SkPMColor pm)
&gt; +{
&gt; +    if (0 == pm)
&gt; +        return 0;
&gt; +    
&gt; +    return SkColorSetARGB(SkGetPackedA32(pm),
&gt; +                          SkGetPackedR32(pm),
&gt; +                          SkGetPackedG32(pm),
&gt; +                          SkGetPackedB32(pm));
&gt; +}


It seems like you have the name of this function backwards. UMColor-&gt;Color should just be re-ordering the bytes, PMColor-&gt;Color needs scaling.

Also, having SKUMColorToColor take a PMColor argument is a bit confusing. I actually think writing it out like this is easier to follow, even though it looks longer:

unsigned char* destPixel = &amp;destRow[x * 4];
if (multiplied == Unmultiplied) {
    SkColor color = SkPMColorToColor(srcRow[x]);
    destPixel[0] = SkColorGetR(color);
    destPixel[1] = SkColorGetG(color);
    destPixel[2] = SkColorGetB(color);
    destPixel[3] = SkColorGetA(color);
} else {
    // Input and output are both pre-multiplied, we just need to re-arrange the bytes from the bitmap format to RGBA.
    destPixel[0] = SkGetPackedR32(srcRow[x]);
    destPixel[1] = SkGetPackedG32(srcRow[x]);
    destPixel[2] = SkGetPackedB32(srcRow[x]);
    destPixel[3] = SkGetPackedA32(srcRow[x]);
}

When we want pre-multiplied case, we just need to re-arrange the output. Having the extra function in there (especially one that takes the &quot;wrong&quot; type) makes this harder to see.

Brett</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141449</commentid>
    <comment_count>13</comment_count>
      <attachid>35113</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-08-19 02:32:06 -0700</bug_when>
    <thetext>Created attachment 35113
premultiplied color support for Skia

changed the patch according to brett&apos;s comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144181</commentid>
    <comment_count>14</comment_count>
      <attachid>35113</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-09-02 03:25:08 -0700</bug_when>
    <thetext>Comment on attachment 35113
premultiplied color support for Skia

Given no further commentary from Brett, this looks sane to me.  Dirk is a committer, so cq-.  He can change it to cq+ if he&apos;d prefer the bot to commit this for him.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144226</commentid>
    <comment_count>15</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-09-02 09:11:27 -0700</bug_when>
    <thetext>Looks good to me, sorry if you were waiting for me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144276</commentid>
    <comment_count>16</comment_count>
      <attachid>35113</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-09-02 13:05:52 -0700</bug_when>
    <thetext>Comment on attachment 35113
premultiplied color support for Skia

Rejecting patch 35113 from commit-queue.  This patch will require manual commit.

WebKitTools/Scripts/build-webkit failed with exit code 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144282</commentid>
    <comment_count>17</comment_count>
      <attachid>35113</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-09-02 13:21:19 -0700</bug_when>
    <thetext>Comment on attachment 35113
premultiplied color support for Skia

build-webkit was broken for a moment.  Not sure why the bots weren&apos;t showing it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144288</commentid>
    <comment_count>18</comment_count>
      <attachid>35113</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-09-02 13:38:58 -0700</bug_when>
    <thetext>Comment on attachment 35113
premultiplied color support for Skia

Clearing flags on attachment: 35113

Committed r47991: &lt;http://trac.webkit.org/changeset/47991&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144289</commentid>
    <comment_count>19</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-09-02 13:39:03 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144308</commentid>
    <comment_count>20</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-09-02 14:26:38 -0700</bug_when>
    <thetext>Broke chromium build. Needs SkColorPriv.h include. Fix coming up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144312</commentid>
    <comment_count>21</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-09-02 14:32:05 -0700</bug_when>
    <thetext>Build fix committed as http://trac.webkit.org/changeset/47995.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144318</commentid>
    <comment_count>22</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-09-02 15:04:49 -0700</bug_when>
    <thetext>Argh. There&apos;s no such value -- &quot;Unpremultiplied&quot;. Should we just roll out? Ping.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144320</commentid>
    <comment_count>23</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-09-02 15:23:07 -0700</bug_when>
    <thetext>Another fix committed http://trac.webkit.org/changeset/47996.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34037</attachid>
            <date>2009-08-03 23:30:49 -0700</date>
            <delta_ts>2009-08-08 06:08:54 -0700</delta_ts>
            <desc>premultiplied color support for getImageData/putImageData</desc>
            <filename>premulty4.patch</filename>
            <type>text/plain</type>
            <size>29974</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Njc0NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTQgQEAKKzIwMDktMDgtMDMgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTVkcg
RmlsdGVyIHByZW11bHRpcGxpZWQgY29sb3Igc3VwcG9ydCBmb3IgZ2V0SW1hZ2VEYXRlL3B1dElt
YWdlRGF0YQorICAgICAgICBbaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI3OTMzXQorCisgICAgICAgIFNvbWUgU1ZHIEZpbHRlcnMgbmVlZCBwcmVtdWx0aXBsaWVkIElt
YWdlRGF0YSBmb3IgdGhlIGNhbGN1bGF0aW9uLiBUaGVyZWZvcmUgZ2V0SW1hZ2VEYXRhCisgICAg
ICAgIGFuZCBwdXRJbWFnZURhdGEgb2YgSW1hZ2VCdWZmZXIgbmVlZCBzdXBwb3J0IGZvciBwcmVt
dWx0aXBsaWVkIGNvbG9ycy4KKworICAgICAgICAqIGh0bWwvQ2FudmFzUmVuZGVyaW5nQ29udGV4
dDJELmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6Z2V0
SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6
cHV0SW1hZ2VEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5o
OgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9JbWFnZUJ1ZmZlckNhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmdldEltYWdlRGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0Tm90UHJlTXVsdGlwbGllZEltYWdl
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0UHJlTXVsdGlwbGllZElt
YWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpwdXRJbWFnZURhdGEpOgorICAgICAgICAoV2Vi
Q29yZTo6SW1hZ2VCdWZmZXI6OnB1dE5vdFByZU11bHRpcGxpZWRJbWFnZURhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OnB1dFByZU11bHRpcGxpZWRJbWFnZURhdGEpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Z2V0SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpn
ZXROb3RQcmVNdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVm
ZmVyOjpnZXRQcmVNdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OnB1dElt
YWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6cHV0Tm90UHJlTXVsdGlw
bGllZEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6cHV0UHJlTXVs
dGlwbGllZEltYWdlRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VC
dWZmZXJRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZXRJbWFnZURhdGEpOgorICAgICAgICAo
V2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmdldE5vdFByZU11bHRpcGxpZWRJbWFnZURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmdldFByZU11bHRpcGxpZWRJbWFnZURhdGEpOgor
ICAgICAgICAoV2ViQ29yZTo6cHV0SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdl
QnVmZmVyOjpwdXROb3RQcmVNdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6
OkltYWdlQnVmZmVyOjpwdXRQcmVNdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlQnVmZmVyU2tpYS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpnZXRJbWFnZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmdldE5vdFBy
ZU11bHRpcGxpZWRJbWFnZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6Omdl
dFByZU11bHRpcGxpZWRJbWFnZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6cHV0SW1hZ2VEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwdXROb3RQcmVNdWx0aXBsaWVkSW1h
Z2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwdXRQcmVNdWx0aXBsaWVk
SW1hZ2VEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFnZUJ1ZmZlcld4
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpnZXROb3RQcmVNdWx0aXBsaWVk
SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpnZXRQcmVNdWx0aXBs
aWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwdXROb3RQcmVN
dWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwdXRQ
cmVNdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKiBzdmcvZ3JhcGhpY3MvU1ZHUmVzb3Vy
Y2VNYXNrZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUmVzb3VyY2VNYXNrZXI6OmFwcGx5
TWFzayk6CisKIDIwMDktMDgtMDMgIENocmlzdGlhbiBQbGVzbmVyIEhhbnNlbiAgPGNocmlzdGlh
bi5wbGVzbmVyLmhhbnNlbkBnbWFpbC5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQg
TGV2aW4uCkBAIC0yMTUyNSw0ICsyMTU3Niw0IEBACiAgICAgICAgIChHZXRBdGtJbnRlcmZhY2VU
eXBlRnJvbVdBSVR5cGUpOgogICAgICAgICAoZ2V0SW50ZXJmYWNlTWFza0Zyb21PYmplY3QpOgog
Ci09PSBSb2xsZWQgb3ZlciB0byBDaGFuZ2VMb2ctMjAwOS0wNi0xNiA9PQorPT0gUm9sbGVkIG92
ZXIgdG8gQ2hhbmdlTG9nLTIwMDktMDYtMTYgPT1TVkcgRmlsdGVyIHByZW11bHRpcGxpZWQgY29s
b3Igc3VwcG9ydCBmb3IgZ2V0SW1hZ2VEYXRlL3B1dEltYWdlRGF0YQpJbmRleDogV2ViQ29yZS9o
dG1sL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9o
dG1sL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAJKHJldmlzaW9uIDQ2NDE2KQorKysgV2Vi
Q29yZS9odG1sL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTEzMDYsNyArMTMwNiw3IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBDYW52YXNSZW5kZXJpbmdD
b24KICAgICBJbWFnZUJ1ZmZlciogYnVmZmVyID0gbV9jYW52YXMgPyBtX2NhbnZhcy0+YnVmZmVy
KCkgOiAwOwogICAgIGlmICghYnVmZmVyKQogICAgICAgICByZXR1cm4gY3JlYXRlRW1wdHlJbWFn
ZURhdGEoc2NhbGVkUmVjdC5zaXplKCkpOwotICAgIHJldHVybiBidWZmZXItPmdldEltYWdlRGF0
YShzY2FsZWRSZWN0KTsKKyAgICByZXR1cm4gYnVmZmVyLT5nZXROb3RQcmVNdWx0aXBsaWVkSW1h
Z2VEYXRhKHNjYWxlZFJlY3QpOwogfQogCiB2b2lkIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6
cHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogZGF0YSwgZmxvYXQgZHgsIGZsb2F0IGR5LCBFeGNlcHRp
b25Db2RlJiBlYykKQEAgLTEzNTcsNyArMTM1Nyw3IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEOjpwdXRJbWFnZUQKICAgICBzb3VyY2VSZWN0Lm1vdmUoLWRlc3RPZmZzZXQpOwogICAg
IEludFBvaW50IGRlc3RQb2ludChkZXN0T2Zmc2V0LndpZHRoKCksIGRlc3RPZmZzZXQuaGVpZ2h0
KCkpOwogICAgIAotICAgIGJ1ZmZlci0+cHV0SW1hZ2VEYXRhKGRhdGEsIHNvdXJjZVJlY3QsIGRl
c3RQb2ludCk7CisgICAgYnVmZmVyLT5wdXROb3RQcmVNdWx0aXBsaWVkSW1hZ2VEYXRhKGRhdGEs
IHNvdXJjZVJlY3QsIGRlc3RQb2ludCk7CiB9CiAKIFN0cmluZyBDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQ6OmZvbnQoKSBjb25zdApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFn
ZUJ1ZmZlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VC
dWZmZXIuaAkocmV2aXNpb24gNDY0MTYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0lt
YWdlQnVmZmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQzLDYgKzQzLDExIEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKICAgICBjbGFzcyBJbnRSZWN0OwogICAgIGNsYXNzIFN0cmluZzsKIAorICAgIGVu
dW0gTXVsdGlwbHkgeworICAgICAgICBQcmVNdWx0aXBsaWVkLAorICAgICAgICBOb3RQcmVNdWx0
aXBsaWVkCisgICAgfTsKKwogICAgIGNsYXNzIEltYWdlQnVmZmVyIDogcHVibGljIE5vbmNvcHlh
YmxlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIC8vIFdpbGwgcmV0dXJuIGEgbnVsbCBwb2ludGVy
IG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KQEAgLTY0LDggKzY5LDExIEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAogICAgICAgICB2b2lkIGNsZWFySW1hZ2UoKSB7IG1faW1hZ2UuY2xlYXIoKTsgfQog
Ci0gICAgICAgIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBnZXRJbWFnZURhdGEoY29uc3QgSW50UmVj
dCYgcmVjdCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291
cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50
KTsKKyAgICAgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IGdldE5vdFByZU11bHRpcGxpZWRJbWFn
ZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3Q7CisgICAgICAgIFBhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBnZXRQcmVNdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNv
bnN0OworCisgICAgICAgIHZvaWQgcHV0Tm90UHJlTXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURh
dGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRl
c3RQb2ludCk7CisgICAgICAgIHZvaWQgcHV0UHJlTXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURh
dGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRl
c3RQb2ludCk7CiAKICAgICAgICAgU3RyaW5nIHRvRGF0YVVSTChjb25zdCBTdHJpbmcmIG1pbWVU
eXBlKSBjb25zdDsKICNpZiAhUExBVEZPUk0oQ0cpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fpcm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VCdWZmZXJDYWlyby5jcHAJKHJldmlzaW9uIDQ2
NDE2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZUJ1ZmZlckNhaXJv
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDE1ICsxMTcsMTYgQEAgSW1hZ2UqIEltYWdlQnVm
ZmVyOjppbWFnZSgpIGNvbnN0CiAgICAgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7CiB9CiAKLVBhc3NS
ZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3Qm
IHJlY3QpIGNvbnN0Cit0ZW1wbGF0ZSA8TXVsdGlwbHkgbXVsdGlwbGllZD4KK1Bhc3NSZWZQdHI8
SW1hZ2VEYXRhPiBnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW1hZ2VC
dWZmZXJEYXRhJiBkYXRhLCBjb25zdCBJbnRTaXplJiBzaXplKQogewotICAgIEFTU0VSVChjYWly
b19zdXJmYWNlX2dldF90eXBlKG1fZGF0YS5tX3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQ
RV9JTUFHRSk7CisgICAgQVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGUoZGF0YS5tX3N1cmZh
Y2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9JTUFHRSk7CiAKICAgICBQYXNzUmVmUHRyPEltYWdl
RGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpjcmVhdGUocmVjdC53aWR0aCgpLCByZWN0LmhlaWdo
dCgpKTsKLSAgICB1bnNpZ25lZCBjaGFyKiBkYXRhU3JjID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9n
ZXRfZGF0YShtX2RhdGEubV9zdXJmYWNlKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBkYXRhU3JjID0g
Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0YShkYXRhLm1fc3VyZmFjZSk7CiAgICAgdW5zaWdu
ZWQgY2hhciogZGF0YURzdCA9IHJlc3VsdC0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKIAotICAg
IGlmIChyZWN0LngoKSA8IDAgfHwgcmVjdC55KCkgPCAwIHx8IChyZWN0LngoKSArIHJlY3Qud2lk
dGgoKSkgPiBtX3NpemUud2lkdGgoKSB8fCAocmVjdC55KCkgKyByZWN0LmhlaWdodCgpKSA+IG1f
c2l6ZS5oZWlnaHQoKSkKKyAgICBpZiAocmVjdC54KCkgPCAwIHx8IHJlY3QueSgpIDwgMCB8fCAo
cmVjdC54KCkgKyByZWN0LndpZHRoKCkpID4gc2l6ZS53aWR0aCgpIHx8IChyZWN0LnkoKSArIHJl
Y3QuaGVpZ2h0KCkpID4gc2l6ZS5oZWlnaHQoKSkKICAgICAgICAgbWVtc2V0KGRhdGFTcmMsIDAs
IHJlc3VsdC0+ZGF0YSgpLT5sZW5ndGgoKSk7CiAKICAgICBpbnQgb3JpZ2lueCA9IHJlY3QueCgp
OwpAQCAtMTM1LDggKzEzNiw4IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6
Z2V0SW0KICAgICAgICAgb3JpZ2lueCA9IDA7CiAgICAgfQogICAgIGludCBlbmR4ID0gcmVjdC54
KCkgKyByZWN0LndpZHRoKCk7Ci0gICAgaWYgKGVuZHggPiBtX3NpemUud2lkdGgoKSkKLSAgICAg
ICAgZW5keCA9IG1fc2l6ZS53aWR0aCgpOworICAgIGlmIChlbmR4ID4gc2l6ZS53aWR0aCgpKQor
ICAgICAgICBlbmR4ID0gc2l6ZS53aWR0aCgpOwogICAgIGludCBudW1Db2x1bW5zID0gZW5keCAt
IG9yaWdpbng7CiAKICAgICBpbnQgb3JpZ2lueSA9IHJlY3QueSgpOwpAQCAtMTQ2LDExICsxNDcs
MTEgQEAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgICAgICBv
cmlnaW55ID0gMDsKICAgICB9CiAgICAgaW50IGVuZHkgPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0
KCk7Ci0gICAgaWYgKGVuZHkgPiBtX3NpemUuaGVpZ2h0KCkpCi0gICAgICAgIGVuZHkgPSBtX3Np
emUuaGVpZ2h0KCk7CisgICAgaWYgKGVuZHkgPiBzaXplLmhlaWdodCgpKQorICAgICAgICBlbmR5
ID0gc2l6ZS5oZWlnaHQoKTsKICAgICBpbnQgbnVtUm93cyA9IGVuZHkgLSBvcmlnaW55OwogCi0g
ICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3N0cmlkZShtX2RhdGEubV9z
dXJmYWNlKTsKKyAgICBpbnQgc3RyaWRlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRl
KGRhdGEubV9zdXJmYWNlKTsKICAgICB1bnNpZ25lZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogcmVj
dC53aWR0aCgpOwogCiAgICAgdW5zaWduZWQgY2hhciogZGVzdFJvd3MgPSBkYXRhRHN0ICsgZGVz
dHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0eCAqIDQ7CkBAIC0xNTksMTEgKzE2MCwxOCBAQCBQ
YXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltCiAgICAgICAgIGZvciAoaW50
IHggPSAwOyB4IDwgbnVtQ29sdW1uczsgeCsrKSB7CiAgICAgICAgICAgICBpbnQgYmFzZXggPSB4
ICogNDsKICAgICAgICAgICAgIHVuc2lnbmVkKiBwaXhlbCA9IHJvdyArIHggKyBvcmlnaW54Owot
ICAgICAgICAgICAgQ29sb3IgcGl4ZWxDb2xvciA9IGNvbG9yRnJvbVByZW11bHRpcGxpZWRBUkdC
KCpwaXhlbCk7Ci0gICAgICAgICAgICBkZXN0Um93c1tiYXNleF0gICAgID0gcGl4ZWxDb2xvci5y
ZWQoKTsKLSAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4ICsgMV0gPSBwaXhlbENvbG9yLmdyZWVu
KCk7Ci0gICAgICAgICAgICBkZXN0Um93c1tiYXNleCArIDJdID0gcGl4ZWxDb2xvci5ibHVlKCk7
Ci0gICAgICAgICAgICBkZXN0Um93c1tiYXNleCArIDNdID0gcGl4ZWxDb2xvci5hbHBoYSgpOwor
ICAgICAgICAgICAgaWYgKG11bHRpcGxpZWQgPT0gTm90UHJlTXVsdGlwbGllZCkgeworICAgICAg
ICAgICAgICAgIENvbG9yIHBpeGVsQ29sb3IgPSBjb2xvckZyb21QcmVtdWx0aXBsaWVkQVJHQigq
cGl4ZWwpOworICAgICAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4XSAgICAgPSBwaXhlbENvbG9y
LnJlZCgpOworICAgICAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4ICsgMV0gPSBwaXhlbENvbG9y
LmdyZWVuKCk7CisgICAgICAgICAgICAgICAgZGVzdFJvd3NbYmFzZXggKyAyXSA9IHBpeGVsQ29s
b3IuYmx1ZSgpOworICAgICAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4ICsgM10gPSBwaXhlbENv
bG9yLmFscGhhKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3RS
b3dzW2Jhc2V4XSAgICAgPSAoKnBpeGVsICYgMHgwMEZGMDAwMCkgPj4gMTY7CisgICAgICAgICAg
ICAgICAgZGVzdFJvd3NbYmFzZXggKyAxXSA9ICgqcGl4ZWwgJiAweDAwMDBGRjAwKSA+PiA4Owor
ICAgICAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4ICsgMl0gPSAoKnBpeGVsICYgMHgwMDAwRkYw
MCk7CisgICAgICAgICAgICAgICAgZGVzdFJvd3NbYmFzZXggKyAzXSA9ICgqcGl4ZWwgJiAweEZG
MDAwMDAwKSA+PiAyNDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBkZXN0Um93
cyArPSBkZXN0Qnl0ZXNQZXJSb3c7CiAgICAgfQpAQCAtMTcxLDExICsxNzksMjIgQEAgUGFzc1Jl
ZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgIHJldHVybiByZXN1bHQ7CiB9
CiAKLXZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29u
c3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK1Bhc3NS
ZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0Tm90UHJlTXVsdGlwbGllZEltYWdlRGF0
YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAogewotICAgIEFTU0VSVChjYWlyb19zdXJmYWNl
X2dldF90eXBlKG1fZGF0YS5tX3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9JTUFHRSk7
CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTxOb3RQcmVNdWx0aXBsaWVkPihyZWN0LCBtX2RhdGEs
IG1fc2l6ZSk7Cit9CisKK1Bhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0UHJl
TXVsdGlwbGllZEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJl
dHVybiBnZXRJbWFnZURhdGE8UHJlTXVsdGlwbGllZD4ocmVjdCwgbV9kYXRhLCBtX3NpemUpOwor
fQorCit0ZW1wbGF0ZSA8TXVsdGlwbHkgbXVsdGlwbGllZD4KK3ZvaWQgcHV0SW1hZ2VEYXRhKElt
YWdlRGF0YSomIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9p
bnQmIGRlc3RQb2ludCwgSW1hZ2VCdWZmZXJEYXRhJiBkYXRhLCBjb25zdCBJbnRTaXplJiBzaXpl
KQoreworICAgIEFTU0VSVChjYWlyb19zdXJmYWNlX2dldF90eXBlKGRhdGEubV9zdXJmYWNlKSA9
PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOwogCi0gICAgdW5zaWduZWQgY2hhciogZGF0YURz
dCA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGEobV9kYXRhLm1fc3VyZmFjZSk7CisgICAg
dW5zaWduZWQgY2hhciogZGF0YURzdCA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGEoZGF0
YS5tX3N1cmZhY2UpOwogCiAgICAgQVNTRVJUKHNvdXJjZVJlY3Qud2lkdGgoKSA+IDApOwogICAg
IEFTU0VSVChzb3VyY2VSZWN0LmhlaWdodCgpID4gMCk7CkBAIC0xODMsMjggKzIwMiwyOCBAQCB2
b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhCiAgICAgaW50IG9yaWdpbngg
PSBzb3VyY2VSZWN0LngoKTsKICAgICBpbnQgZGVzdHggPSBkZXN0UG9pbnQueCgpICsgc291cmNl
UmVjdC54KCk7CiAgICAgQVNTRVJUKGRlc3R4ID49IDApOwotICAgIEFTU0VSVChkZXN0eCA8IG1f
c2l6ZS53aWR0aCgpKTsKKyAgICBBU1NFUlQoZGVzdHggPCBzaXplLndpZHRoKCkpOwogICAgIEFT
U0VSVChvcmlnaW54ID49IDApOwogICAgIEFTU0VSVChvcmlnaW54IDw9IHNvdXJjZVJlY3Qucmln
aHQoKSk7CiAKICAgICBpbnQgZW5keCA9IGRlc3RQb2ludC54KCkgKyBzb3VyY2VSZWN0LnJpZ2h0
KCk7Ci0gICAgQVNTRVJUKGVuZHggPD0gbV9zaXplLndpZHRoKCkpOworICAgIEFTU0VSVChlbmR4
IDw9IHNpemUud2lkdGgoKSk7CiAKICAgICBpbnQgbnVtQ29sdW1ucyA9IGVuZHggLSBkZXN0eDsK
IAogICAgIGludCBvcmlnaW55ID0gc291cmNlUmVjdC55KCk7CiAgICAgaW50IGRlc3R5ID0gZGVz
dFBvaW50LnkoKSArIHNvdXJjZVJlY3QueSgpOwogICAgIEFTU0VSVChkZXN0eSA+PSAwKTsKLSAg
ICBBU1NFUlQoZGVzdHkgPCBtX3NpemUuaGVpZ2h0KCkpOworICAgIEFTU0VSVChkZXN0eSA8IHNp
emUuaGVpZ2h0KCkpOwogICAgIEFTU0VSVChvcmlnaW55ID49IDApOwogICAgIEFTU0VSVChvcmln
aW55IDw9IHNvdXJjZVJlY3QuYm90dG9tKCkpOwogCiAgICAgaW50IGVuZHkgPSBkZXN0UG9pbnQu
eSgpICsgc291cmNlUmVjdC5ib3R0b20oKTsKLSAgICBBU1NFUlQoZW5keSA8PSBtX3NpemUuaGVp
Z2h0KCkpOworICAgIEFTU0VSVChlbmR5IDw9IHNpemUuaGVpZ2h0KCkpOwogICAgIGludCBudW1S
b3dzID0gZW5keSAtIGRlc3R5OwogCiAgICAgdW5zaWduZWQgc3JjQnl0ZXNQZXJSb3cgPSA0ICog
c291cmNlLT53aWR0aCgpOwotICAgIGludCBzdHJpZGUgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2dl
dF9zdHJpZGUobV9kYXRhLm1fc3VyZmFjZSk7CisgICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdl
X3N1cmZhY2VfZ2V0X3N0cmlkZShkYXRhLm1fc3VyZmFjZSk7CiAKICAgICB1bnNpZ25lZCBjaGFy
KiBzcmNSb3dzID0gc291cmNlLT5kYXRhKCktPmRhdGEoKS0+ZGF0YSgpICsgb3JpZ2lueSAqIHNy
Y0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CiAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1S
b3dzOyArK3kpIHsKQEAgLTIxMiwxNiArMjMxLDI5IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dElt
YWdlRGF0YShJbWFnZURhdGEKICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1Db2x1bW5z
OyB4KyspIHsKICAgICAgICAgICAgIGludCBiYXNleCA9IHggKiA0OwogICAgICAgICAgICAgdW5z
aWduZWQqIHBpeGVsID0gcm93ICsgeCArIGRlc3R4OwotICAgICAgICAgICAgQ29sb3IgcGl4ZWxD
b2xvcihzcmNSb3dzW2Jhc2V4XSwKLSAgICAgICAgICAgICAgICAgICAgc3JjUm93c1tiYXNleCAr
IDFdLAotICAgICAgICAgICAgICAgICAgICBzcmNSb3dzW2Jhc2V4ICsgMl0sCi0gICAgICAgICAg
ICAgICAgICAgIHNyY1Jvd3NbYmFzZXggKyAzXSk7Ci0gICAgICAgICAgICAqcGl4ZWwgPSBwcmVt
dWx0aXBsaWVkQVJHQkZyb21Db2xvcihwaXhlbENvbG9yKTsKKyAgICAgICAgICAgIGlmIChtdWx0
aXBsaWVkID09IE5vdFByZU11bHRpcGxpZWQpIHsKKyAgICAgICAgICAgICAgICBDb2xvciBwaXhl
bENvbG9yKHNyY1Jvd3NbYmFzZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjUm93c1ti
YXNleCArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjUm93c1tiYXNleCArIDJdLAor
ICAgICAgICAgICAgICAgICAgICAgICAgc3JjUm93c1tiYXNleCArIDNdKTsKKyAgICAgICAgICAg
ICAgICAqcGl4ZWwgPSBwcmVtdWx0aXBsaWVkQVJHQkZyb21Db2xvcihwaXhlbENvbG9yKTsKKyAg
ICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICpwaXhlbCA9IHNyY1Jvd3NbYmFzZXgg
KyAzXSA8PCAyNCB8IHNyY1Jvd3NbYmFzZXhdIDw8IDE2IHwgc3JjUm93c1tiYXNleCArIDFdIDw8
IDggfCBzcmNSb3dzW2Jhc2V4ICsgMl07CiAgICAgICAgIH0KICAgICAgICAgc3JjUm93cyArPSBz
cmNCeXRlc1BlclJvdzsKICAgICB9CiB9CiAKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dE5vdFByZU11
bHRpcGxpZWRJbWFnZURhdGEoSW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJj
ZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQpCit7CisgICAgcHV0SW1hZ2VEYXRhPE5v
dFByZU11bHRpcGxpZWQ+KHNvdXJjZSwgc291cmNlUmVjdCwgZGVzdFBvaW50LCBtX2RhdGEsIG1f
c2l6ZSk7Cit9CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dFByZU11bHRpcGxpZWRJbWFnZURhdGEo
SW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBv
aW50JiBkZXN0UG9pbnQpCit7CisgICAgcHV0SW1hZ2VEYXRhPFByZU11bHRpcGxpZWQ+KHNvdXJj
ZSwgc291cmNlUmVjdCwgZGVzdFBvaW50LCBtX2RhdGEsIG1fc2l6ZSk7Cit9CisKIHN0YXRpYyBj
YWlyb19zdGF0dXNfdCB3cml0ZUZ1bmN0aW9uKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHVuc2lnbmVk
IGNoYXIqIGRhdGEsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAgICAgVmVjdG9yPGNoYXI+KiBp
biA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmVjdG9yPGNoYXI+Kj4oY2xvc3VyZSk7CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDRy5jcHAJKHJldmlzaW9u
IDQ2NDE2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckNHLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTA0LDEyICsxMDQsMTMgQEAgSW1hZ2UqIEltYWdlQnVmZmVy
OjppbWFnZSgpIGNvbnN0CiAgICAgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7CiB9CiAKLVBhc3NSZWZQ
dHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJl
Y3QpIGNvbnN0Cit0ZW1wbGF0ZSA8TXVsdGlwbHkgbXVsdGlwbGllZD4KK1Bhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW1hZ2VCdWZm
ZXJEYXRhJiBkYXRhLCBjb25zdCBJbnRTaXplJiBzaXplKQogewogICAgIFBhc3NSZWZQdHI8SW1h
Z2VEYXRhPiByZXN1bHQgPSBJbWFnZURhdGE6OmNyZWF0ZShyZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCkpOwogICAgIHVuc2lnbmVkIGNoYXIqIGRhdGEgPSByZXN1bHQtPmRhdGEoKS0+ZGF0YSgp
LT5kYXRhKCk7CiAKLSAgICBpZiAocmVjdC54KCkgPCAwIHx8IHJlY3QueSgpIDwgMCB8fCAocmVj
dC54KCkgKyByZWN0LndpZHRoKCkpID4gbV9zaXplLndpZHRoKCkgfHwgKHJlY3QueSgpICsgcmVj
dC5oZWlnaHQoKSkgPiBtX3NpemUuaGVpZ2h0KCkpCisgICAgaWYgKHJlY3QueCgpIDwgMCB8fCBy
ZWN0LnkoKSA8IDAgfHwgKHJlY3QueCgpICsgcmVjdC53aWR0aCgpKSA+IHNpemUud2lkdGgoKSB8
fCAocmVjdC55KCkgKyByZWN0LmhlaWdodCgpKSA+IHNpemUuaGVpZ2h0KCkpCiAgICAgICAgIG1l
bXNldChkYXRhLCAwLCByZXN1bHQtPmRhdGEoKS0+bGVuZ3RoKCkpOwogCiAgICAgaW50IG9yaWdp
bnggPSByZWN0LngoKTsKQEAgLTExOSw4ICsxMjAsOCBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4g
SW1hZ2VCdWZmZXI6OmdldEltCiAgICAgICAgIG9yaWdpbnggPSAwOwogICAgIH0KICAgICBpbnQg
ZW5keCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOwotICAgIGlmIChlbmR4ID4gbV9zaXplLndp
ZHRoKCkpCi0gICAgICAgIGVuZHggPSBtX3NpemUud2lkdGgoKTsKKyAgICBpZiAoZW5keCA+IHNp
emUud2lkdGgoKSkKKyAgICAgICAgZW5keCA9IHNpemUud2lkdGgoKTsKICAgICBpbnQgbnVtQ29s
dW1ucyA9IGVuZHggLSBvcmlnaW54OwogCiAgICAgaW50IG9yaWdpbnkgPSByZWN0LnkoKTsKQEAg
LTEzMCwyMCArMTMxLDIwIEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0
SW0KICAgICAgICAgb3JpZ2lueSA9IDA7CiAgICAgfQogICAgIGludCBlbmR5ID0gcmVjdC55KCkg
KyByZWN0LmhlaWdodCgpOwotICAgIGlmIChlbmR5ID4gbV9zaXplLmhlaWdodCgpKQotICAgICAg
ICBlbmR5ID0gbV9zaXplLmhlaWdodCgpOworICAgIGlmIChlbmR5ID4gc2l6ZS5oZWlnaHQoKSkK
KyAgICAgICAgZW5keSA9IHNpemUuaGVpZ2h0KCk7CiAgICAgaW50IG51bVJvd3MgPSBlbmR5IC0g
b3JpZ2lueTsKIAotICAgIHVuc2lnbmVkIHNyY0J5dGVzUGVyUm93ID0gNCAqIG1fc2l6ZS53aWR0
aCgpOworICAgIHVuc2lnbmVkIHNyY0J5dGVzUGVyUm93ID0gNCAqIHNpemUud2lkdGgoKTsKICAg
ICB1bnNpZ25lZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogcmVjdC53aWR0aCgpOwogCiAgICAgLy8g
OjpjcmVhdGUgZW5zdXJlcyB0aGF0IGFsbCBJbWFnZUJ1ZmZlcnMgaGF2ZSB2YWxpZCBkYXRhLCBz
byB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGhlcmUuCi0gICAgdW5zaWduZWQgY2hhciogc3Jj
Um93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KG1fZGF0YS5tX2RhdGEpICsg
b3JpZ2lueSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CisgICAgdW5zaWduZWQgY2hh
ciogc3JjUm93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGEubV9kYXRh
KSArIG9yaWdpbnkgKiBzcmNCeXRlc1BlclJvdyArIG9yaWdpbnggKiA0OwogICAgIHVuc2lnbmVk
IGNoYXIqIGRlc3RSb3dzID0gZGF0YSArIGRlc3R5ICogZGVzdEJ5dGVzUGVyUm93ICsgZGVzdHgg
KiA0OwogICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CiAgICAgICAgIGZv
ciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1uczsgeCsrKSB7CiAgICAgICAgICAgICBpbnQgYmFz
ZXggPSB4ICogNDsKLSAgICAgICAgICAgIGlmICh1bnNpZ25lZCBjaGFyIGFscGhhID0gc3JjUm93
c1tiYXNleCArIDNdKSB7CisgICAgICAgICAgICBpZiAobXVsdGlwbGllZCA9PSBOb3RQcmVNdWx0
aXBsaWVkICYmIHVuc2lnbmVkIGNoYXIgYWxwaGEgPSBzcmNSb3dzW2Jhc2V4ICsgM10pIHsKICAg
ICAgICAgICAgICAgICBkZXN0Um93c1tiYXNleF0gPSAoc3JjUm93c1tiYXNleF0gKiAyNTUpIC8g
YWxwaGE7CiAgICAgICAgICAgICAgICAgZGVzdFJvd3NbYmFzZXggKyAxXSA9IChzcmNSb3dzW2Jh
c2V4ICsgMV0gKiAyNTUpIC8gYWxwaGE7CiAgICAgICAgICAgICAgICAgZGVzdFJvd3NbYmFzZXgg
KyAyXSA9IChzcmNSb3dzW2Jhc2V4ICsgMl0gKiAyNTUpIC8gYWxwaGE7CkBAIC0xNTcsNyArMTU4
LDE4IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW0KICAgICByZXR1
cm4gcmVzdWx0OwogfQogCi12b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRh
KiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0
UG9pbnQpCitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldE5vdFByZU11bHRp
cGxpZWRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4g
Z2V0SW1hZ2VEYXRhPE5vdFByZU11bHRpcGxpZWQ+KHJlY3QsIG1fZGF0YSwgbV9zaXplKTsKK30K
KworUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRQcmVNdWx0aXBsaWVkSW1h
Z2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdl
RGF0YTxQcmVNdWx0aXBsaWVkPihyZWN0LCBtX2RhdGEsIG1fc2l6ZSk7Cit9CisKK3RlbXBsYXRl
IDxNdWx0aXBseSBtdWx0aXBsaWVkPgordm9pZCBwdXRJbWFnZURhdGEoSW1hZ2VEYXRhKiYgc291
cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50
LCBJbWFnZUJ1ZmZlckRhdGEmIGRhdGEsIGNvbnN0IEludFNpemUmIHNpemUpCiB7CiAgICAgQVNT
RVJUKHNvdXJjZVJlY3Qud2lkdGgoKSA+IDApOwogICAgIEFTU0VSVChzb3VyY2VSZWN0LmhlaWdo
dCgpID4gMCk7CkBAIC0xNjUsMzYgKzE3NywzNiBAQCB2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFn
ZURhdGEoSW1hZ2VEYXRhCiAgICAgaW50IG9yaWdpbnggPSBzb3VyY2VSZWN0LngoKTsKICAgICBp
bnQgZGVzdHggPSBkZXN0UG9pbnQueCgpICsgc291cmNlUmVjdC54KCk7CiAgICAgQVNTRVJUKGRl
c3R4ID49IDApOwotICAgIEFTU0VSVChkZXN0eCA8IG1fc2l6ZS53aWR0aCgpKTsKKyAgICBBU1NF
UlQoZGVzdHggPCBzaXplLndpZHRoKCkpOwogICAgIEFTU0VSVChvcmlnaW54ID49IDApOwogICAg
IEFTU0VSVChvcmlnaW54IDw9IHNvdXJjZVJlY3QucmlnaHQoKSk7CiAKICAgICBpbnQgZW5keCA9
IGRlc3RQb2ludC54KCkgKyBzb3VyY2VSZWN0LnJpZ2h0KCk7Ci0gICAgQVNTRVJUKGVuZHggPD0g
bV9zaXplLndpZHRoKCkpOworICAgIEFTU0VSVChlbmR4IDw9IHNpemUud2lkdGgoKSk7CiAKICAg
ICBpbnQgbnVtQ29sdW1ucyA9IGVuZHggLSBkZXN0eDsKIAogICAgIGludCBvcmlnaW55ID0gc291
cmNlUmVjdC55KCk7CiAgICAgaW50IGRlc3R5ID0gZGVzdFBvaW50LnkoKSArIHNvdXJjZVJlY3Qu
eSgpOwogICAgIEFTU0VSVChkZXN0eSA+PSAwKTsKLSAgICBBU1NFUlQoZGVzdHkgPCBtX3NpemUu
aGVpZ2h0KCkpOworICAgIEFTU0VSVChkZXN0eSA8IHNpemUuaGVpZ2h0KCkpOwogICAgIEFTU0VS
VChvcmlnaW55ID49IDApOwogICAgIEFTU0VSVChvcmlnaW55IDw9IHNvdXJjZVJlY3QuYm90dG9t
KCkpOwogCiAgICAgaW50IGVuZHkgPSBkZXN0UG9pbnQueSgpICsgc291cmNlUmVjdC5ib3R0b20o
KTsKLSAgICBBU1NFUlQoZW5keSA8PSBtX3NpemUuaGVpZ2h0KCkpOworICAgIEFTU0VSVChlbmR5
IDw9IHNpemUuaGVpZ2h0KCkpOwogICAgIGludCBudW1Sb3dzID0gZW5keSAtIGRlc3R5OwogCiAg
ICAgdW5zaWduZWQgc3JjQnl0ZXNQZXJSb3cgPSA0ICogc291cmNlLT53aWR0aCgpOwotICAgIHVu
c2lnbmVkIGRlc3RCeXRlc1BlclJvdyA9IDQgKiBtX3NpemUud2lkdGgoKTsKKyAgICB1bnNpZ25l
ZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogc2l6ZS53aWR0aCgpOwogCiAgICAgdW5zaWduZWQgY2hh
ciogc3JjUm93cyA9IHNvdXJjZS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKSArIG9yaWdpbnkgKiBz
cmNCeXRlc1BlclJvdyArIG9yaWdpbnggKiA0OwotICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RSb3dz
ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4obV9kYXRhLm1fZGF0YSkgKyBkZXN0
eSAqIGRlc3RCeXRlc1BlclJvdyArIGRlc3R4ICogNDsKKyAgICB1bnNpZ25lZCBjaGFyKiBkZXN0
Um93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGEubV9kYXRhKSArIGRl
c3R5ICogZGVzdEJ5dGVzUGVyUm93ICsgZGVzdHggKiA0OwogICAgIGZvciAoaW50IHkgPSAwOyB5
IDwgbnVtUm93czsgKyt5KSB7CiAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1u
czsgeCsrKSB7CiAgICAgICAgICAgICBpbnQgYmFzZXggPSB4ICogNDsKICAgICAgICAgICAgIHVu
c2lnbmVkIGNoYXIgYWxwaGEgPSBzcmNSb3dzW2Jhc2V4ICsgM107Ci0gICAgICAgICAgICBpZiAo
YWxwaGEgIT0gMjU1KSB7CisgICAgICAgICAgICBpZiAobXVsdGlwbGllZCA9PSBOb3RQcmVNdWx0
aXBsaWVkICYmIGFscGhhICE9IDI1NSkgewogICAgICAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4
XSA9IChzcmNSb3dzW2Jhc2V4XSAqIGFscGhhICsgMjU0KSAvIDI1NTsKICAgICAgICAgICAgICAg
ICBkZXN0Um93c1tiYXNleCArIDFdID0gKHNyY1Jvd3NbYmFzZXggKyAxXSAqIGFscGhhICsgMjU0
KSAvIDI1NTsKICAgICAgICAgICAgICAgICBkZXN0Um93c1tiYXNleCArIDJdID0gKHNyY1Jvd3Nb
YmFzZXggKyAyXSAqIGFscGhhICsgMjU0KSAvIDI1NTsKQEAgLTIwNyw2ICsyMTksMTYgQEAgdm9p
ZCBJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKEltYWdlRGF0YQogICAgIH0KIH0KIAordm9pZCBJ
bWFnZUJ1ZmZlcjo6cHV0Tm90UHJlTXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJj
ZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkK
K3sKKyAgICBwdXRJbWFnZURhdGE8Tm90UHJlTXVsdGlwbGllZD4oc291cmNlLCBzb3VyY2VSZWN0
LCBkZXN0UG9pbnQsIG1fZGF0YSwgbV9zaXplKTsKK30KKwordm9pZCBJbWFnZUJ1ZmZlcjo6cHV0
UHJlTXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYg
c291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK3sKKyAgICBwdXRJbWFnZURh
dGE8UHJlTXVsdGlwbGllZD4oc291cmNlLCBzb3VyY2VSZWN0LCBkZXN0UG9pbnQsIG1fZGF0YSwg
bV9zaXplKTsKK30KKwogc3RhdGljIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gdXRpRnJvbU1JTUVU
eXBlKGNvbnN0IFN0cmluZyYgbWltZVR5cGUpCiB7CiAjaWYgUExBVEZPUk0oTUFDKQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1ZmZlclF0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlQnVmZmVyUXQuY3BwCShyZXZp
c2lvbiA0NjQxNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJR
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk4LDEyICs5OCwxMyBAQCBJbWFnZSogSW1hZ2VCdWZm
ZXI6OmltYWdlKCkgY29uc3QKICAgICByZXR1cm4gbV9pbWFnZS5nZXQoKTsKIH0KIAotUGFzc1Jl
ZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYg
cmVjdCkgY29uc3QKK3RlbXBsYXRlIDxNdWx0aXBseSBtdWx0aXBsaWVkPgorUGFzc1JlZlB0cjxJ
bWFnZURhdGE+IGdldEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbWFnZUJ1
ZmZlckRhdGEmIGRhdGEsIGNvbnN0IEludFNpemUmIHNpemUpCiB7CiAgICAgUGFzc1JlZlB0cjxJ
bWFnZURhdGE+IHJlc3VsdCA9IEltYWdlRGF0YTo6Y3JlYXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7CiAgICAgdW5zaWduZWQgY2hhciogZGF0YSA9IHJlc3VsdC0+ZGF0YSgpLT5kYXRh
KCktPmRhdGEoKTsKIAotICAgIGlmIChyZWN0LngoKSA8IDAgfHwgcmVjdC55KCkgPCAwIHx8IChy
ZWN0LngoKSArIHJlY3Qud2lkdGgoKSkgPiBtX3NpemUud2lkdGgoKSB8fCAocmVjdC55KCkgKyBy
ZWN0LmhlaWdodCgpKSA+IG1fc2l6ZS5oZWlnaHQoKSkKKyAgICBpZiAocmVjdC54KCkgPCAwIHx8
IHJlY3QueSgpIDwgMCB8fCAocmVjdC54KCkgKyByZWN0LndpZHRoKCkpID4gc2l6ZS53aWR0aCgp
IHx8IChyZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkpID4gc2l6ZS5oZWlnaHQoKSkKICAgICAgICAg
bWVtc2V0KGRhdGEsIDAsIHJlc3VsdC0+ZGF0YSgpLT5sZW5ndGgoKSk7CiAKICAgICBpbnQgb3Jp
Z2lueCA9IHJlY3QueCgpOwpAQCAtMTEzLDggKzExNCw4IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRh
PiBJbWFnZUJ1ZmZlcjo6Z2V0SW0KICAgICAgICAgb3JpZ2lueCA9IDA7CiAgICAgfQogICAgIGlu
dCBlbmR4ID0gcmVjdC54KCkgKyByZWN0LndpZHRoKCk7Ci0gICAgaWYgKGVuZHggPiBtX3NpemUu
d2lkdGgoKSkKLSAgICAgICAgZW5keCA9IG1fc2l6ZS53aWR0aCgpOworICAgIGlmIChlbmR4ID4g
c2l6ZS53aWR0aCgpKQorICAgICAgICBlbmR4ID0gc2l6ZS53aWR0aCgpOwogICAgIGludCBudW1D
b2x1bW5zID0gZW5keCAtIG9yaWdpbng7CiAKICAgICBpbnQgb3JpZ2lueSA9IHJlY3QueSgpOwpA
QCAtMTI0LDExICsxMjUsMTYgQEAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpn
ZXRJbQogICAgICAgICBvcmlnaW55ID0gMDsKICAgICB9CiAgICAgaW50IGVuZHkgPSByZWN0Lnko
KSArIHJlY3QuaGVpZ2h0KCk7Ci0gICAgaWYgKGVuZHkgPiBtX3NpemUuaGVpZ2h0KCkpCi0gICAg
ICAgIGVuZHkgPSBtX3NpemUuaGVpZ2h0KCk7CisgICAgaWYgKGVuZHkgPiBzaXplLmhlaWdodCgp
KQorICAgICAgICBlbmR5ID0gc2l6ZS5oZWlnaHQoKTsKICAgICBpbnQgbnVtUm93cyA9IGVuZHkg
LSBvcmlnaW55OwogCi0gICAgUUltYWdlIGltYWdlID0gbV9kYXRhLm1fcGl4bWFwLnRvSW1hZ2Uo
KS5jb252ZXJ0VG9Gb3JtYXQoUUltYWdlOjpGb3JtYXRfQVJHQjMyKTsKKyAgICBRSW1hZ2UgaW1h
Z2U7CisgICAgaWYgKG11bHRpcGxpZWQgPT0gTm90UHJlTXVsdGlwbGllZCkKKyAgICAgICAgaW1h
Z2UgPSBkYXRhLm1fcGl4bWFwLnRvSW1hZ2UoKS5jb252ZXJ0VG9Gb3JtYXQoUUltYWdlOjpGb3Jt
YXRfQVJHQjMyKTsKKyAgICBlbHNlCisgICAgICAgIGltYWdlID0gZGF0YS5tX3BpeG1hcC50b0lt
YWdlKCkuY29udmVydFRvRm9ybWF0KFFJbWFnZTo6Rm9ybWF0X0FSR0IzMl9QcmVtdWx0aXBsaWVk
KTsKKwogICAgIEFTU0VSVCghaW1hZ2UuaXNOdWxsKCkpOwogCiAgICAgdW5zaWduZWQgZGVzdEJ5
dGVzUGVyUm93ID0gNCAqIHJlY3Qud2lkdGgoKTsKQEAgLTE0OSw3ICsxNTUsMTggQEAgUGFzc1Jl
ZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgIHJldHVybiByZXN1bHQ7CiB9
CiAKLXZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29u
c3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK1Bhc3NS
ZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0Tm90UHJlTXVsdGlwbGllZEltYWdlRGF0
YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBnZXRJbWFnZURhdGE8
Tm90UHJlTXVsdGlwbGllZD4ocmVjdCwgbV9kYXRhLCBtX3NpemUpOworfQorCitQYXNzUmVmUHRy
PEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldFByZU11bHRpcGxpZWRJbWFnZURhdGEoY29uc3Qg
SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0SW1hZ2VEYXRhPFByZU11bHRp
cGxpZWQ+KHJlY3QsIG1fZGF0YSwgbV9zaXplKTsKK30KKwordGVtcGxhdGUgPE11bHRpcGx5IG11
bHRpcGxpZWQ+Cit2b2lkIHB1dEltYWdlRGF0YShJbWFnZURhdGEqJiBzb3VyY2UsIGNvbnN0IElu
dFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQsIEltYWdlQnVmZmVy
RGF0YSYgZGF0YSwgY29uc3QgSW50U2l6ZSYgc2l6ZSkKIHsKICAgICBBU1NFUlQoc291cmNlUmVj
dC53aWR0aCgpID4gMCk7CiAgICAgQVNTRVJUKHNvdXJjZVJlY3QuaGVpZ2h0KCkgPiAwKTsKQEAg
LTE1NywzMyArMTc0LDM3IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURh
dGEKICAgICBpbnQgb3JpZ2lueCA9IHNvdXJjZVJlY3QueCgpOwogICAgIGludCBkZXN0eCA9IGRl
c3RQb2ludC54KCkgKyBzb3VyY2VSZWN0LngoKTsKICAgICBBU1NFUlQoZGVzdHggPj0gMCk7Ci0g
ICAgQVNTRVJUKGRlc3R4IDwgbV9zaXplLndpZHRoKCkpOworICAgIEFTU0VSVChkZXN0eCA8IHNp
emUud2lkdGgoKSk7CiAgICAgQVNTRVJUKG9yaWdpbnggPj0gMCk7CiAgICAgQVNTRVJUKG9yaWdp
bnggPD0gc291cmNlUmVjdC5yaWdodCgpKTsKIAogICAgIGludCBlbmR4ID0gZGVzdFBvaW50Lngo
KSArIHNvdXJjZVJlY3QucmlnaHQoKTsKLSAgICBBU1NFUlQoZW5keCA8PSBtX3NpemUud2lkdGgo
KSk7CisgICAgQVNTRVJUKGVuZHggPD0gc2l6ZS53aWR0aCgpKTsKIAogICAgIGludCBudW1Db2x1
bW5zID0gZW5keCAtIGRlc3R4OwogCiAgICAgaW50IG9yaWdpbnkgPSBzb3VyY2VSZWN0LnkoKTsK
ICAgICBpbnQgZGVzdHkgPSBkZXN0UG9pbnQueSgpICsgc291cmNlUmVjdC55KCk7CiAgICAgQVNT
RVJUKGRlc3R5ID49IDApOwotICAgIEFTU0VSVChkZXN0eSA8IG1fc2l6ZS5oZWlnaHQoKSk7Cisg
ICAgQVNTRVJUKGRlc3R5IDwgc2l6ZS5oZWlnaHQoKSk7CiAgICAgQVNTRVJUKG9yaWdpbnkgPj0g
MCk7CiAgICAgQVNTRVJUKG9yaWdpbnkgPD0gc291cmNlUmVjdC5ib3R0b20oKSk7CiAKICAgICBp
bnQgZW5keSA9IGRlc3RQb2ludC55KCkgKyBzb3VyY2VSZWN0LmJvdHRvbSgpOwotICAgIEFTU0VS
VChlbmR5IDw9IG1fc2l6ZS5oZWlnaHQoKSk7CisgICAgQVNTRVJUKGVuZHkgPD0gc2l6ZS5oZWln
aHQoKSk7CiAgICAgaW50IG51bVJvd3MgPSBlbmR5IC0gZGVzdHk7CiAKICAgICB1bnNpZ25lZCBz
cmNCeXRlc1BlclJvdyA9IDQgKiBzb3VyY2UtPndpZHRoKCk7CiAKLSAgICBib29sIGlzUGFpbnRp
bmcgPSBtX2RhdGEubV9wYWludGVyLT5pc0FjdGl2ZSgpOworICAgIGJvb2wgaXNQYWludGluZyA9
IGRhdGEubV9wYWludGVyLT5pc0FjdGl2ZSgpOwogICAgIGlmIChpc1BhaW50aW5nKQotICAgICAg
ICBtX2RhdGEubV9wYWludGVyLT5lbmQoKTsKKyAgICAgICAgZGF0YS5tX3BhaW50ZXItPmVuZCgp
OwogCi0gICAgUUltYWdlIGltYWdlID0gbV9kYXRhLm1fcGl4bWFwLnRvSW1hZ2UoKS5jb252ZXJ0
VG9Gb3JtYXQoUUltYWdlOjpGb3JtYXRfQVJHQjMyKTsKKyAgICBRSW1hZ2UgaW1hZ2U7CisgICAg
aWYgKG11bHRpcGxpZWQgPT0gTm90UHJlTXVsdGlwbGllZCkKKyAgICAgICAgaW1hZ2UgPSBkYXRh
Lm1fcGl4bWFwLnRvSW1hZ2UoKS5jb252ZXJ0VG9Gb3JtYXQoUUltYWdlOjpGb3JtYXRfQVJHQjMy
KTsKKyAgICBlbHNlCisgICAgICAgIGltYWdlID0gZGF0YS5tX3BpeG1hcC50b0ltYWdlKCkuY29u
dmVydFRvRm9ybWF0KFFJbWFnZTo6Rm9ybWF0X0FSR0IzMl9QcmVtdWx0aXBsaWVkKTsKIAogICAg
IHVuc2lnbmVkIGNoYXIqIHNyY1Jvd3MgPSBzb3VyY2UtPmRhdGEoKS0+ZGF0YSgpLT5kYXRhKCkg
KyBvcmlnaW55ICogc3JjQnl0ZXNQZXJSb3cgKyBvcmlnaW54ICogNDsKICAgICBmb3IgKGludCB5
ID0gMDsgeSA8IG51bVJvd3M7ICsreSkgewpAQCAtMTk2LDEwICsyMTcsMjAgQEAgdm9pZCBJbWFn
ZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKEltYWdlRGF0YQogICAgICAgICBzcmNSb3dzICs9IHNyY0J5
dGVzUGVyUm93OwogICAgIH0KIAotICAgIG1fZGF0YS5tX3BpeG1hcCA9IFFQaXhtYXA6OmZyb21J
bWFnZShpbWFnZSk7CisgICAgZGF0YS5tX3BpeG1hcCA9IFFQaXhtYXA6OmZyb21JbWFnZShpbWFn
ZSk7CiAKICAgICBpZiAoaXNQYWludGluZykKLSAgICAgICAgbV9kYXRhLm1fcGFpbnRlci0+YmVn
aW4oJm1fZGF0YS5tX3BpeG1hcCk7CisgICAgICAgIGRhdGEubV9wYWludGVyLT5iZWdpbigmZGF0
YS5tX3BpeG1hcCk7Cit9CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dE5vdFByZU11bHRpcGxpZWRJ
bWFnZURhdGEoSW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNv
bnN0IEludFBvaW50JiBkZXN0UG9pbnQpCit7CisgICAgcHV0SW1hZ2VEYXRhPE5vdFByZU11bHRp
cGxpZWQ+KHNvdXJjZSwgc291cmNlUmVjdCwgZGVzdFBvaW50LCBtX2RhdGEsIG1fc2l6ZSk7Cit9
CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dFByZU11bHRpcGxpZWRJbWFnZURhdGEoSW1hZ2VEYXRh
KiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0
UG9pbnQpCit7CisgICAgcHV0SW1hZ2VEYXRhPFByZU11bHRpcGxpZWQ+KHNvdXJjZSwgc291cmNl
UmVjdCwgZGVzdFBvaW50LCBtX2RhdGEsIG1fc2l6ZSk7CiB9CiAKIC8vIFdlIGdldCBhIG1pbWVU
eXBlIGhlcmUgYnV0IFFJbWFnZVdyaXRlciBkb2VzIG5vdCBzdXBwb3J0IG1pbWV0eXBlcyBidXQK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZl
clNraWEuY3BwCShyZXZpc2lvbiA0NjQxNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDAsNyArMTAwLDkg
QEAgSW1hZ2UqIEltYWdlQnVmZmVyOjppbWFnZSgpIGNvbnN0CiAgICAgcmV0dXJuIG1faW1hZ2Uu
Z2V0KCk7CiB9CiAKLVBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VE
YXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit0ZW1wbGF0ZSA8TXVsdGlwbHkgbXVsdGlw
bGllZD4KK1Bhc3NSZWZQdHI8SW1hZ2VEYXRhPiBnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYg
cmVjdCwgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEludFNpemUmIHNpemUpCiB7CiAgICAgQVNTRVJUKGNvbnRleHQoKSk7
CiAKQEAgLTEzNCw3ICsxMzYsNiBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6
OmdldEltCiAgICAgICAgIGVuZFkgPSBtX3NpemUuaGVpZ2h0KCk7CiAgICAgaW50IG51bVJvd3Mg
PSBlbmRZIC0gb3JpZ2luWTsKIAotICAgIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAgPSAqY29udGV4
dCgpLT5wbGF0Zm9ybUNvbnRleHQoKS0+Yml0bWFwKCk7CiAgICAgQVNTRVJUKGJpdG1hcC5jb25m
aWcoKSA9PSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcpOwogICAgIFNrQXV0b0xvY2tQaXhl
bHMgYml0bWFwTG9jayhiaXRtYXApOwogCkBAIC0xNDQsNiArMTQ1LDcgQEAgUGFzc1JlZlB0cjxJ
bWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVt
Um93czsgKyt5KSB7CiAgICAgICAgIHVpbnQzMl90KiBzcmNSb3cgPSBiaXRtYXAuZ2V0QWRkcjMy
KG9yaWdpblgsIG9yaWdpblkgKyB5KTsKICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1D
b2x1bW5zOyArK3gpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFN1cHBvcnQgZm9yIHByZW11bHRp
cGxpZWQgY29sb3JzCiAgICAgICAgICAgICBTa0NvbG9yIGNvbG9yID0gU2tQTUNvbG9yVG9Db2xv
cihzcmNSb3dbeF0pOwogICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdFBpeGVsID0gJmRl
c3RSb3dbeCAqIDRdOwogICAgICAgICAgICAgZGVzdFBpeGVsWzBdID0gU2tDb2xvckdldFIoY29s
b3IpOwpAQCAtMTU3LDggKzE1OSwxOSBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZm
ZXI6OmdldEltCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBJbWFnZUJ1ZmZlcjo6cHV0
SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQp
CitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldE5vdFByZU11bHRpcGxpZWRJ
bWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0SW1h
Z2VEYXRhPE5vdFByZU11bHRpcGxpZWQ+KHJlY3QsICpjb250ZXh0KCktPnBsYXRmb3JtQ29udGV4
dCgpLT5iaXRtYXAoKSwgbV9zaXplKTsKK30KKworUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdl
QnVmZmVyOjpnZXRQcmVNdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTxQcmVNdWx0aXBsaWVkPihyZWN0LCAqY29u
dGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKS0+Yml0bWFwKCksIG1fc2l6ZSk7Cit9CisKK3RlbXBs
YXRlIDxNdWx0aXBseSBtdWx0aXBsaWVkPgordm9pZCBwdXRJbWFnZURhdGEoSW1hZ2VEYXRhKiYg
c291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBv
aW50LCAKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAsIGNvbnN0IElu
dFNpemUmIHNpemUpCiB7CiAgICAgQVNTRVJUKHNvdXJjZVJlY3Qud2lkdGgoKSA+IDApOwogICAg
IEFTU0VSVChzb3VyY2VSZWN0LmhlaWdodCgpID4gMCk7CkBAIC0xODYsNyArMTk5LDYgQEAgdm9p
ZCBJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKEltYWdlRGF0YQogICAgIEFTU0VSVChlbmRZIDw9
IG1fc2l6ZS5oZWlnaHQoKSk7CiAgICAgaW50IG51bVJvd3MgPSBlbmRZIC0gZGVzdFk7CiAKLSAg
ICBjb25zdCBTa0JpdG1hcCYgYml0bWFwID0gKmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCkt
PmJpdG1hcCgpOwogICAgIEFTU0VSVChiaXRtYXAuY29uZmlnKCkgPT0gU2tCaXRtYXA6OmtBUkdC
Xzg4ODhfQ29uZmlnKTsKICAgICBTa0F1dG9Mb2NrUGl4ZWxzIGJpdG1hcExvY2soYml0bWFwKTsK
IApAQCAtMTk3LDYgKzIwOSw3IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFn
ZURhdGEKICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG51bVJvd3M7ICsreSkgewogICAgICAgICB1
aW50MzJfdCogZGVzdFJvdyA9IGJpdG1hcC5nZXRBZGRyMzIoZGVzdFgsIGRlc3RZICsgeSk7CiAg
ICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1uczsgKyt4KSB7CisgICAgICAgICAg
ICAvLyBUT0RPOiBTdXBwb3J0IGZvciBwcmVtdWx0aXBsaWVkIGNvbG9ycwogICAgICAgICAgICAg
Y29uc3QgdW5zaWduZWQgY2hhciogc3JjUGl4ZWwgPSAmc3JjUm93W3ggKiA0XTsKICAgICAgICAg
ICAgIGRlc3RSb3dbeF0gPSBTa1ByZU11bHRpcGx5QVJHQihzcmNQaXhlbFszXSwgc3JjUGl4ZWxb
MF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGl4ZWxb
MV0sIHNyY1BpeGVsWzJdKTsKQEAgLTIwNSw2ICsyMTgsMTYgQEAgdm9pZCBJbWFnZUJ1ZmZlcjo6
cHV0SW1hZ2VEYXRhKEltYWdlRGF0YQogICAgIH0KIH0KIAordm9pZCBJbWFnZUJ1ZmZlcjo6cHV0
Tm90UHJlTXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVj
dCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK3sKKyAgICBwdXRJbWFn
ZURhdGE8Tm90UHJlTXVsdGlwbGllZD4oc291cmNlLCBzb3VyY2VSZWN0LCBkZXN0UG9pbnQsICpj
b250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLT5iaXRtYXAoKSwgbV9zaXplKTsKK30KKwordm9p
ZCBJbWFnZUJ1ZmZlcjo6cHV0UHJlTXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJj
ZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkK
K3sKKyAgICBwdXRJbWFnZURhdGE8UHJlTXVsdGlwbGllZD4oc291cmNlLCBzb3VyY2VSZWN0LCBk
ZXN0UG9pbnQsICpjb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLT5iaXRtYXAoKSwgbV9zaXpl
KTsKK30KKwogU3RyaW5nIEltYWdlQnVmZmVyOjp0b0RhdGFVUkwoY29uc3QgU3RyaW5nJikgY29u
c3QKIHsKICAgICAvLyBFbmNvZGUgdGhlIGltYWdlIGludG8gYSB2ZWN0b3IuCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlQnVmZmVyV3guY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvSW1hZ2VCdWZmZXJXeC5jcHAJKHJldmlzaW9u
IDQ2NDE2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFnZUJ1ZmZlcld4LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTMsMTMgKzUzLDI0IEBAIEdyYXBoaWNzQ29udGV4dCogSW1h
Z2VCdWZmZXI6OmNvbnRleHQoKSAKICAgICByZXR1cm4gMDsKIH0KIAotUGFzc1JlZlB0cjxJbWFn
ZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYpIGNvbnN0CitQ
YXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldE5vdFByZU11bHRpcGxpZWRJbWFn
ZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKIHsKICAgICBub3RJbXBsZW1lbnRlZCgp
OwogICAgIHJldHVybiAwOwogfQogCi12b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1h
Z2VEYXRhKiwgY29uc3QgSW50UmVjdCYsIGNvbnN0IEludFBvaW50JikKK1Bhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0UHJlTXVsdGlwbGllZEltYWdlRGF0YShjb25zdCBJbnRS
ZWN0JiByZWN0KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7
Cit9CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dE5vdFByZU11bHRpcGxpZWRJbWFnZURhdGEoSW1h
Z2VEYXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50
JiBkZXN0UG9pbnQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBJbWFnZUJ1
ZmZlcjo6cHV0UHJlTXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3Qg
SW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKIHsKICAgICBu
b3RJbXBsZW1lbnRlZCgpOwogfQpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvU1ZHUmVzb3Vy
Y2VNYXNrZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL1NWR1Jlc291
cmNlTWFza2VyLmNwcAkocmV2aXNpb24gNDY0MTYpCisrKyBXZWJDb3JlL3N2Zy9ncmFwaGljcy9T
VkdSZXNvdXJjZU1hc2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc2LDggKzc2LDggQEAgdm9p
ZCBTVkdSZXNvdXJjZU1hc2tlcjo6YXBwbHlNYXNrKEdyYXBoaQogICAgIGlmICghbHVtaW5hbmNl
ZEltYWdlKQogICAgICAgICByZXR1cm47CiAKLSAgICBQYXNzUmVmUHRyPENhbnZhc1BpeGVsQXJy
YXk+IHNyY1BpeGVsQXJyYXkobV9tYXNrLT5nZXRJbWFnZURhdGEoaW50SW1hZ2VSZWN0KS0+ZGF0
YSgpKTsKLSAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gZGVzdEltYWdlRGF0YShsdW1pbmFuY2Vk
SW1hZ2UtPmdldEltYWdlRGF0YShpbnRJbWFnZVJlY3QpKTsKKyAgICBQYXNzUmVmUHRyPENhbnZh
c1BpeGVsQXJyYXk+IHNyY1BpeGVsQXJyYXkobV9tYXNrLT5nZXROb3RQcmVNdWx0aXBsaWVkSW1h
Z2VEYXRhKGludEltYWdlUmVjdCktPmRhdGEoKSk7CisgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+
IGRlc3RJbWFnZURhdGEobHVtaW5hbmNlZEltYWdlLT5nZXROb3RQcmVNdWx0aXBsaWVkSW1hZ2VE
YXRhKGludEltYWdlUmVjdCkpOwogCiAgICAgZm9yICh1bnNpZ25lZCBwaXhlbE9mZnNldCA9IDA7
IHBpeGVsT2Zmc2V0IDwgc3JjUGl4ZWxBcnJheS0+bGVuZ3RoKCk7IHBpeGVsT2Zmc2V0KyspIHsK
ICAgICAgICAgdW5zaWduZWQgcGl4ZWxCeXRlT2Zmc2V0ID0gcGl4ZWxPZmZzZXQgKiA0OwpAQCAt
OTMsNyArOTMsNyBAQCB2b2lkIFNWR1Jlc291cmNlTWFza2VyOjphcHBseU1hc2soR3JhcGhpCiAg
ICAgICAgIGRlc3RJbWFnZURhdGEtPmRhdGEoKS0+c2V0KHBpeGVsQnl0ZU9mZnNldCArIDMsIGx1
bWEpOwogICAgIH0KIAotICAgIGx1bWluYW5jZWRJbWFnZS0+cHV0SW1hZ2VEYXRhKGRlc3RJbWFn
ZURhdGEuZ2V0KCksIGludEltYWdlUmVjdCwgSW50UG9pbnQoMCwgMCkpOworICAgIGx1bWluYW5j
ZWRJbWFnZS0+cHV0Tm90UHJlTXVsdGlwbGllZEltYWdlRGF0YShkZXN0SW1hZ2VEYXRhLmdldCgp
LCBpbnRJbWFnZVJlY3QsIEludFBvaW50KDAsIDApKTsKIAogICAgIGNvbnRleHQtPmNsaXBUb0lt
YWdlQnVmZmVyKG1fbWFza1JlY3QsIGx1bWluYW5jZWRJbWFnZS5nZXQoKSk7CiB9Cg==
</data>
<flag name="review"
          id="18202"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34365</attachid>
            <date>2009-08-08 06:08:54 -0700</date>
            <delta_ts>2009-08-12 03:53:27 -0700</delta_ts>
            <desc>premultiplied color support for getImageData/putImageData</desc>
            <filename>premulty5.patch</filename>
            <type>text/plain</type>
            <size>28474</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Njk1MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTQgQEAKKzIwMDktMDgtMDggIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTVkcg
RmlsdGVyIHByZW11bHRpcGxpZWQgY29sb3Igc3VwcG9ydCBmb3IgZ2V0SW1hZ2VEYXRlL3B1dElt
YWdlRGF0YQorICAgICAgICBbaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI3OTMzXQorCisgICAgICAgIFNvbWUgU1ZHIEZpbHRlcnMgbmVlZCBwcmVtdWx0aXBsaWVkIElt
YWdlRGF0YSBmb3IgdGhlIGNhbGN1bGF0aW9uLiBUaGVyZWZvcmUgZ2V0SW1hZ2VEYXRhCisgICAg
ICAgIGFuZCBwdXRJbWFnZURhdGEgb2YgSW1hZ2VCdWZmZXIgbmVlZCBzdXBwb3J0IGZvciBwcmVt
dWx0aXBsaWVkIGNvbG9ycy4KKworICAgICAgICAqIGh0bWwvQ2FudmFzUmVuZGVyaW5nQ29udGV4
dDJELmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6Z2V0
SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6
cHV0SW1hZ2VEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5o
OgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9JbWFnZUJ1ZmZlckNhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmdldEltYWdlRGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1hZ2VE
YXRhKToKKyAgICAgICAgKFdlYkNvcmU6OnB1dEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZUJ1ZmZlcjo6cHV0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNv
cmU6OkltYWdlQnVmZmVyOjpwdXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckNHLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OmdldEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0VW5tdWx0
aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpnZXRQcmVt
dWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OnB1dEltYWdlRGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6cHV0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwdXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRh
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1ZmZlclF0LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OmdldEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1
ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdl
QnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OnB1
dEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6cHV0VW5tdWx0aXBs
aWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwdXRQcmVtdWx0
aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdl
QnVmZmVyU2tpYS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZXRJbWFnZURhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmdldFVubXVsdGlwbGllZEltYWdlRGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0UHJlbXVsdGlwbGllZEltYWdlRGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpwdXRJbWFnZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VC
dWZmZXI6OnB1dFVubXVsdGlwbGllZEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFn
ZUJ1ZmZlcjo6cHV0UHJlbXVsdGlwbGllZEltYWdlRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd3gvSW1hZ2VCdWZmZXJXeC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1
ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdl
QnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6Oklt
YWdlQnVmZmVyOjpwdXRVbm11bHRpcGxpZWRJbWFnZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6
SW1hZ2VCdWZmZXI6OnB1dFByZW11bHRpcGxpZWRJbWFnZURhdGEpOgorICAgICAgICAqIHN2Zy9n
cmFwaGljcy9TVkdSZXNvdXJjZU1hc2tlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTVkdSZXNv
dXJjZU1hc2tlcjo6YXBwbHlNYXNrKToKKwogMjAwOS0wOC0wOCAgSmFuIE1pY2hhZWwgQWxvbnpv
ICA8am1hbG9uem9Ad2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBYYW4gTG9wZXou
CkluZGV4OiBXZWJDb3JlL2h0bWwvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2h0bWwvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcAkocmV2aXNp
b24gNDY3NjkpCisrKyBXZWJDb3JlL2h0bWwvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTMwNiw3ICsxMzA2LDcgQEAgUGFzc1JlZlB0cjxJbWFnZURhdGE+
IENhbnZhc1JlbmRlcmluZ0NvbgogICAgIEltYWdlQnVmZmVyKiBidWZmZXIgPSBtX2NhbnZhcyA/
IG1fY2FudmFzLT5idWZmZXIoKSA6IDA7CiAgICAgaWYgKCFidWZmZXIpCiAgICAgICAgIHJldHVy
biBjcmVhdGVFbXB0eUltYWdlRGF0YShzY2FsZWRSZWN0LnNpemUoKSk7Ci0gICAgcmV0dXJuIGJ1
ZmZlci0+Z2V0SW1hZ2VEYXRhKHNjYWxlZFJlY3QpOworICAgIHJldHVybiBidWZmZXItPmdldFVu
bXVsdGlwbGllZEltYWdlRGF0YShzY2FsZWRSZWN0KTsKIH0KIAogdm9pZCBDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQ6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIGRhdGEsIGZsb2F0IGR4LCBmbG9h
dCBkeSwgRXhjZXB0aW9uQ29kZSYgZWMpCkBAIC0xMzU3LDcgKzEzNTcsNyBAQCB2b2lkIENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRDo6cHV0SW1hZ2VECiAgICAgc291cmNlUmVjdC5tb3ZlKC1kZXN0
T2Zmc2V0KTsKICAgICBJbnRQb2ludCBkZXN0UG9pbnQoZGVzdE9mZnNldC53aWR0aCgpLCBkZXN0
T2Zmc2V0LmhlaWdodCgpKTsKICAgICAKLSAgICBidWZmZXItPnB1dEltYWdlRGF0YShkYXRhLCBz
b3VyY2VSZWN0LCBkZXN0UG9pbnQpOworICAgIGJ1ZmZlci0+cHV0VW5tdWx0aXBsaWVkSW1hZ2VE
YXRhKGRhdGEsIHNvdXJjZVJlY3QsIGRlc3RQb2ludCk7CiB9CiAKIFN0cmluZyBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQ6OmZvbnQoKSBjb25zdApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9JbWFnZUJ1ZmZlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvSW1hZ2VCdWZmZXIuaAkocmV2aXNpb24gNDY3NjkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0ltYWdlQnVmZmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQzLDYgKzQzLDExIEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBJbnRSZWN0OwogICAgIGNsYXNzIFN0cmluZzsK
IAorICAgIGVudW0gTXVsdGlwbHkgeworICAgICAgICBQcmVtdWx0aXBsaWVkLAorICAgICAgICBV
bm11bHRpcGxpZWQKKyAgICB9OworCiAgICAgY2xhc3MgSW1hZ2VCdWZmZXIgOiBwdWJsaWMgTm9u
Y29weWFibGUgewogICAgIHB1YmxpYzoKICAgICAgICAgLy8gV2lsbCByZXR1cm4gYSBudWxsIHBv
aW50ZXIgb24gYWxsb2NhdGlvbiBmYWlsdXJlLgpAQCAtNjQsOCArNjksMTEgQEAgbmFtZXNwYWNl
IFdlYkNvcmUgewogCiAgICAgICAgIHZvaWQgY2xlYXJJbWFnZSgpIHsgbV9pbWFnZS5jbGVhcigp
OyB9CiAKLSAgICAgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IGdldEltYWdlRGF0YShjb25zdCBJ
bnRSZWN0JiByZWN0KSBjb25zdDsKLSAgICAgICAgdm9pZCBwdXRJbWFnZURhdGEoSW1hZ2VEYXRh
KiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0
UG9pbnQpOworICAgICAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gZ2V0VW5tdWx0aXBsaWVkSW1h
Z2VEYXRhKGNvbnN0IEludFJlY3QmKSBjb25zdDsKKyAgICAgICAgUGFzc1JlZlB0cjxJbWFnZURh
dGE+IGdldFByZW11bHRpcGxpZWRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYpIGNvbnN0OworCisg
ICAgICAgIHZvaWQgcHV0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0YSosIGNvbnN0IElu
dFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQpOworICAgICAgICB2
b2lkIHB1dFByZW11bHRpcGxpZWRJbWFnZURhdGEoSW1hZ2VEYXRhKiwgY29uc3QgSW50UmVjdCYg
c291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCk7CiAKICAgICAgICAgU3RyaW5n
IHRvRGF0YVVSTChjb25zdCBTdHJpbmcmIG1pbWVUeXBlKSBjb25zdDsKICNpZiAhUExBVEZPUk0o
Q0cpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fp
cm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1h
Z2VCdWZmZXJDYWlyby5jcHAJKHJldmlzaW9uIDQ2NzY5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jYWlyby9JbWFnZUJ1ZmZlckNhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE3
LDE1ICsxMTcsMTYgQEAgSW1hZ2UqIEltYWdlQnVmZmVyOjppbWFnZSgpIGNvbnN0CiAgICAgcmV0
dXJuIG1faW1hZ2UuZ2V0KCk7CiB9CiAKLVBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZl
cjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit0ZW1wbGF0ZSA8TXVs
dGlwbHkgbXVsdGlwbGllZD4KK1Bhc3NSZWZQdHI8SW1hZ2VEYXRhPiBnZXRJbWFnZURhdGEoY29u
c3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW1hZ2VCdWZmZXJEYXRhJiBkYXRhLCBjb25zdCBJbnRT
aXplJiBzaXplKQogewotICAgIEFTU0VSVChjYWlyb19zdXJmYWNlX2dldF90eXBlKG1fZGF0YS5t
X3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9JTUFHRSk7CisgICAgQVNTRVJUKGNhaXJv
X3N1cmZhY2VfZ2V0X3R5cGUoZGF0YS5tX3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9J
TUFHRSk7CiAKICAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpj
cmVhdGUocmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICB1bnNpZ25lZCBjaGFyKiBk
YXRhU3JjID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0YShtX2RhdGEubV9zdXJmYWNlKTsK
KyAgICB1bnNpZ25lZCBjaGFyKiBkYXRhU3JjID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0
YShkYXRhLm1fc3VyZmFjZSk7CiAgICAgdW5zaWduZWQgY2hhciogZGF0YURzdCA9IHJlc3VsdC0+
ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKIAotICAgIGlmIChyZWN0LngoKSA8IDAgfHwgcmVjdC55
KCkgPCAwIHx8IChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSkgPiBtX3NpemUud2lkdGgoKSB8fCAo
cmVjdC55KCkgKyByZWN0LmhlaWdodCgpKSA+IG1fc2l6ZS5oZWlnaHQoKSkKKyAgICBpZiAocmVj
dC54KCkgPCAwIHx8IHJlY3QueSgpIDwgMCB8fCAocmVjdC54KCkgKyByZWN0LndpZHRoKCkpID4g
c2l6ZS53aWR0aCgpIHx8IChyZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkpID4gc2l6ZS5oZWlnaHQo
KSkKICAgICAgICAgbWVtc2V0KGRhdGFTcmMsIDAsIHJlc3VsdC0+ZGF0YSgpLT5sZW5ndGgoKSk7
CiAKICAgICBpbnQgb3JpZ2lueCA9IHJlY3QueCgpOwpAQCAtMTM1LDggKzEzNiw4IEBAIFBhc3NS
ZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW0KICAgICAgICAgb3JpZ2lueCA9IDA7
CiAgICAgfQogICAgIGludCBlbmR4ID0gcmVjdC54KCkgKyByZWN0LndpZHRoKCk7Ci0gICAgaWYg
KGVuZHggPiBtX3NpemUud2lkdGgoKSkKLSAgICAgICAgZW5keCA9IG1fc2l6ZS53aWR0aCgpOwor
ICAgIGlmIChlbmR4ID4gc2l6ZS53aWR0aCgpKQorICAgICAgICBlbmR4ID0gc2l6ZS53aWR0aCgp
OwogICAgIGludCBudW1Db2x1bW5zID0gZW5keCAtIG9yaWdpbng7CiAKICAgICBpbnQgb3JpZ2lu
eSA9IHJlY3QueSgpOwpAQCAtMTQ2LDExICsxNDcsMTEgQEAgUGFzc1JlZlB0cjxJbWFnZURhdGE+
IEltYWdlQnVmZmVyOjpnZXRJbQogICAgICAgICBvcmlnaW55ID0gMDsKICAgICB9CiAgICAgaW50
IGVuZHkgPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCk7Ci0gICAgaWYgKGVuZHkgPiBtX3NpemUu
aGVpZ2h0KCkpCi0gICAgICAgIGVuZHkgPSBtX3NpemUuaGVpZ2h0KCk7CisgICAgaWYgKGVuZHkg
PiBzaXplLmhlaWdodCgpKQorICAgICAgICBlbmR5ID0gc2l6ZS5oZWlnaHQoKTsKICAgICBpbnQg
bnVtUm93cyA9IGVuZHkgLSBvcmlnaW55OwogCi0gICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdl
X3N1cmZhY2VfZ2V0X3N0cmlkZShtX2RhdGEubV9zdXJmYWNlKTsKKyAgICBpbnQgc3RyaWRlID0g
Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlKGRhdGEubV9zdXJmYWNlKTsKICAgICB1bnNp
Z25lZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogcmVjdC53aWR0aCgpOwogCiAgICAgdW5zaWduZWQg
Y2hhciogZGVzdFJvd3MgPSBkYXRhRHN0ICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0
eCAqIDQ7CkBAIC0xNTksNyArMTYwLDExIEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1
ZmZlcjo6Z2V0SW0KICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1Db2x1bW5zOyB4Kysp
IHsKICAgICAgICAgICAgIGludCBiYXNleCA9IHggKiA0OwogICAgICAgICAgICAgdW5zaWduZWQq
IHBpeGVsID0gcm93ICsgeCArIG9yaWdpbng7Ci0gICAgICAgICAgICBDb2xvciBwaXhlbENvbG9y
ID0gY29sb3JGcm9tUHJlbXVsdGlwbGllZEFSR0IoKnBpeGVsKTsKKyAgICAgICAgICAgIENvbG9y
IHBpeGVsQ29sb3I7CisgICAgICAgICAgICBpZiAobXVsdGlwbGllZCA9PSBVbm11bHRpcGxpZWQp
CisgICAgICAgICAgICAgICAgcGl4ZWxDb2xvciA9IGNvbG9yRnJvbVByZW11bHRpcGxpZWRBUkdC
KCpwaXhlbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGl4ZWxDb2xvciA9
IENvbG9yKCpwaXhlbCk7CiAgICAgICAgICAgICBkZXN0Um93c1tiYXNleF0gICAgID0gcGl4ZWxD
b2xvci5yZWQoKTsKICAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4ICsgMV0gPSBwaXhlbENvbG9y
LmdyZWVuKCk7CiAgICAgICAgICAgICBkZXN0Um93c1tiYXNleCArIDJdID0gcGl4ZWxDb2xvci5i
bHVlKCk7CkBAIC0xNzEsMTEgKzE3NiwyMiBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VC
dWZmZXI6OmdldEltCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBJbWFnZUJ1ZmZlcjo6
cHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0
LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50KQorUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdl
QnVmZmVyOjpnZXRVbm11bHRpcGxpZWRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29u
c3QKIHsKLSAgICBBU1NFUlQoY2Fpcm9fc3VyZmFjZV9nZXRfdHlwZShtX2RhdGEubV9zdXJmYWNl
KSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOworICAgIHJldHVybiBnZXRJbWFnZURhdGE8
VW5tdWx0aXBsaWVkPihyZWN0LCBtX2RhdGEsIG1fc2l6ZSk7Cit9CisKK1Bhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0UHJlbXVsdGlwbGllZEltYWdlRGF0YShjb25zdCBJbnRS
ZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBnZXRJbWFnZURhdGE8UHJlbXVsdGlwbGll
ZD4ocmVjdCwgbV9kYXRhLCBtX3NpemUpOworfQorCit0ZW1wbGF0ZSA8TXVsdGlwbHkgbXVsdGlw
bGllZD4KK3ZvaWQgcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSomIHNvdXJjZSwgY29uc3QgSW50UmVj
dCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCwgSW1hZ2VCdWZmZXJEYXRh
JiBkYXRhLCBjb25zdCBJbnRTaXplJiBzaXplKQoreworICAgIEFTU0VSVChjYWlyb19zdXJmYWNl
X2dldF90eXBlKGRhdGEubV9zdXJmYWNlKSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOwog
Ci0gICAgdW5zaWduZWQgY2hhciogZGF0YURzdCA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2Rh
dGEobV9kYXRhLm1fc3VyZmFjZSk7CisgICAgdW5zaWduZWQgY2hhciogZGF0YURzdCA9IGNhaXJv
X2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGEoZGF0YS5tX3N1cmZhY2UpOwogCiAgICAgQVNTRVJUKHNv
dXJjZVJlY3Qud2lkdGgoKSA+IDApOwogICAgIEFTU0VSVChzb3VyY2VSZWN0LmhlaWdodCgpID4g
MCk7CkBAIC0xODMsMjggKzE5OSwyOCBAQCB2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEo
SW1hZ2VEYXRhCiAgICAgaW50IG9yaWdpbnggPSBzb3VyY2VSZWN0LngoKTsKICAgICBpbnQgZGVz
dHggPSBkZXN0UG9pbnQueCgpICsgc291cmNlUmVjdC54KCk7CiAgICAgQVNTRVJUKGRlc3R4ID49
IDApOwotICAgIEFTU0VSVChkZXN0eCA8IG1fc2l6ZS53aWR0aCgpKTsKKyAgICBBU1NFUlQoZGVz
dHggPCBzaXplLndpZHRoKCkpOwogICAgIEFTU0VSVChvcmlnaW54ID49IDApOwogICAgIEFTU0VS
VChvcmlnaW54IDw9IHNvdXJjZVJlY3QucmlnaHQoKSk7CiAKICAgICBpbnQgZW5keCA9IGRlc3RQ
b2ludC54KCkgKyBzb3VyY2VSZWN0LnJpZ2h0KCk7Ci0gICAgQVNTRVJUKGVuZHggPD0gbV9zaXpl
LndpZHRoKCkpOworICAgIEFTU0VSVChlbmR4IDw9IHNpemUud2lkdGgoKSk7CiAKICAgICBpbnQg
bnVtQ29sdW1ucyA9IGVuZHggLSBkZXN0eDsKIAogICAgIGludCBvcmlnaW55ID0gc291cmNlUmVj
dC55KCk7CiAgICAgaW50IGRlc3R5ID0gZGVzdFBvaW50LnkoKSArIHNvdXJjZVJlY3QueSgpOwog
ICAgIEFTU0VSVChkZXN0eSA+PSAwKTsKLSAgICBBU1NFUlQoZGVzdHkgPCBtX3NpemUuaGVpZ2h0
KCkpOworICAgIEFTU0VSVChkZXN0eSA8IHNpemUuaGVpZ2h0KCkpOwogICAgIEFTU0VSVChvcmln
aW55ID49IDApOwogICAgIEFTU0VSVChvcmlnaW55IDw9IHNvdXJjZVJlY3QuYm90dG9tKCkpOwog
CiAgICAgaW50IGVuZHkgPSBkZXN0UG9pbnQueSgpICsgc291cmNlUmVjdC5ib3R0b20oKTsKLSAg
ICBBU1NFUlQoZW5keSA8PSBtX3NpemUuaGVpZ2h0KCkpOworICAgIEFTU0VSVChlbmR5IDw9IHNp
emUuaGVpZ2h0KCkpOwogICAgIGludCBudW1Sb3dzID0gZW5keSAtIGRlc3R5OwogCiAgICAgdW5z
aWduZWQgc3JjQnl0ZXNQZXJSb3cgPSA0ICogc291cmNlLT53aWR0aCgpOwotICAgIGludCBzdHJp
ZGUgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9zdHJpZGUobV9kYXRhLm1fc3VyZmFjZSk7Cisg
ICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3N0cmlkZShkYXRhLm1fc3Vy
ZmFjZSk7CiAKICAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gc291cmNlLT5kYXRhKCktPmRh
dGEoKS0+ZGF0YSgpICsgb3JpZ2lueSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CiAg
ICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsKQEAgLTIxNiwxMiArMjMyLDI1
IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEKICAgICAgICAgICAg
ICAgICAgICAgc3JjUm93c1tiYXNleCArIDFdLAogICAgICAgICAgICAgICAgICAgICBzcmNSb3dz
W2Jhc2V4ICsgMl0sCiAgICAgICAgICAgICAgICAgICAgIHNyY1Jvd3NbYmFzZXggKyAzXSk7Ci0g
ICAgICAgICAgICAqcGl4ZWwgPSBwcmVtdWx0aXBsaWVkQVJHQkZyb21Db2xvcihwaXhlbENvbG9y
KTsKKyAgICAgICAgICAgIGlmIChtdWx0aXBsaWVkID09IFVubXVsdGlwbGllZCkKKyAgICAgICAg
ICAgICAgICAqcGl4ZWwgPSBwcmVtdWx0aXBsaWVkQVJHQkZyb21Db2xvcihwaXhlbENvbG9yKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqcGl4ZWwgPSBwaXhlbENvbG9yLnJn
YigpOwogICAgICAgICB9CiAgICAgICAgIHNyY1Jvd3MgKz0gc3JjQnl0ZXNQZXJSb3c7CiAgICAg
fQogfQogCit2b2lkIEltYWdlQnVmZmVyOjpwdXRVbm11bHRpcGxpZWRJbWFnZURhdGEoSW1hZ2VE
YXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBk
ZXN0UG9pbnQpCit7CisgICAgcHV0SW1hZ2VEYXRhPFVubXVsdGlwbGllZD4oc291cmNlLCBzb3Vy
Y2VSZWN0LCBkZXN0UG9pbnQsIG1fZGF0YSwgbV9zaXplKTsKK30KKwordm9pZCBJbWFnZUJ1ZmZl
cjo6cHV0UHJlbXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50
UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK3sKKyAgICBwdXRJ
bWFnZURhdGE8UHJlbXVsdGlwbGllZD4oc291cmNlLCBzb3VyY2VSZWN0LCBkZXN0UG9pbnQsIG1f
ZGF0YSwgbV9zaXplKTsKK30KKwogc3RhdGljIGNhaXJvX3N0YXR1c190IHdyaXRlRnVuY3Rpb24o
dm9pZCogY2xvc3VyZSwgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgdW5zaWduZWQgaW50IGxl
bmd0aCkKIHsKICAgICBWZWN0b3I8Y2hhcj4qIGluID0gcmVpbnRlcnByZXRfY2FzdDxWZWN0b3I8
Y2hhcj4qPihjbG9zdXJlKTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1h
Z2VCdWZmZXJDRy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
Zy9JbWFnZUJ1ZmZlckNHLmNwcAkocmV2aXNpb24gNDY3NjkpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQsMTIg
KzEwNCwxMyBAQCBJbWFnZSogSW1hZ2VCdWZmZXI6OmltYWdlKCkgY29uc3QKICAgICByZXR1cm4g
bV9pbWFnZS5nZXQoKTsKIH0KIAotUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpn
ZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3RlbXBsYXRlIDxNdWx0aXBs
eSBtdWx0aXBsaWVkPgorUGFzc1JlZlB0cjxJbWFnZURhdGE+IGdldEltYWdlRGF0YShjb25zdCBJ
bnRSZWN0JiByZWN0LCBjb25zdCBJbWFnZUJ1ZmZlckRhdGEmIGRhdGEsIGNvbnN0IEludFNpemUm
IHNpemUpCiB7CiAgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IHJlc3VsdCA9IEltYWdlRGF0YTo6
Y3JlYXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CiAgICAgdW5zaWduZWQgY2hhciog
ZGF0YSA9IHJlc3VsdC0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKIAotICAgIGlmIChyZWN0Lngo
KSA8IDAgfHwgcmVjdC55KCkgPCAwIHx8IChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSkgPiBtX3Np
emUud2lkdGgoKSB8fCAocmVjdC55KCkgKyByZWN0LmhlaWdodCgpKSA+IG1fc2l6ZS5oZWlnaHQo
KSkKKyAgICBpZiAocmVjdC54KCkgPCAwIHx8IHJlY3QueSgpIDwgMCB8fCAocmVjdC54KCkgKyBy
ZWN0LndpZHRoKCkpID4gc2l6ZS53aWR0aCgpIHx8IChyZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkp
ID4gc2l6ZS5oZWlnaHQoKSkKICAgICAgICAgbWVtc2V0KGRhdGEsIDAsIHJlc3VsdC0+ZGF0YSgp
LT5sZW5ndGgoKSk7CiAKICAgICBpbnQgb3JpZ2lueCA9IHJlY3QueCgpOwpAQCAtMTE5LDggKzEy
MCw4IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW0KICAgICAgICAg
b3JpZ2lueCA9IDA7CiAgICAgfQogICAgIGludCBlbmR4ID0gcmVjdC54KCkgKyByZWN0LndpZHRo
KCk7Ci0gICAgaWYgKGVuZHggPiBtX3NpemUud2lkdGgoKSkKLSAgICAgICAgZW5keCA9IG1fc2l6
ZS53aWR0aCgpOworICAgIGlmIChlbmR4ID4gc2l6ZS53aWR0aCgpKQorICAgICAgICBlbmR4ID0g
c2l6ZS53aWR0aCgpOwogICAgIGludCBudW1Db2x1bW5zID0gZW5keCAtIG9yaWdpbng7CiAKICAg
ICBpbnQgb3JpZ2lueSA9IHJlY3QueSgpOwpAQCAtMTMwLDIwICsxMzEsMjAgQEAgUGFzc1JlZlB0
cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgICAgICBvcmlnaW55ID0gMDsKICAg
ICB9CiAgICAgaW50IGVuZHkgPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCk7Ci0gICAgaWYgKGVu
ZHkgPiBtX3NpemUuaGVpZ2h0KCkpCi0gICAgICAgIGVuZHkgPSBtX3NpemUuaGVpZ2h0KCk7Cisg
ICAgaWYgKGVuZHkgPiBzaXplLmhlaWdodCgpKQorICAgICAgICBlbmR5ID0gc2l6ZS5oZWlnaHQo
KTsKICAgICBpbnQgbnVtUm93cyA9IGVuZHkgLSBvcmlnaW55OwogCi0gICAgdW5zaWduZWQgc3Jj
Qnl0ZXNQZXJSb3cgPSA0ICogbV9zaXplLndpZHRoKCk7CisgICAgdW5zaWduZWQgc3JjQnl0ZXNQ
ZXJSb3cgPSA0ICogc2l6ZS53aWR0aCgpOwogICAgIHVuc2lnbmVkIGRlc3RCeXRlc1BlclJvdyA9
IDQgKiByZWN0LndpZHRoKCk7CiAKICAgICAvLyA6OmNyZWF0ZSBlbnN1cmVzIHRoYXQgYWxsIElt
YWdlQnVmZmVycyBoYXZlIHZhbGlkIGRhdGEsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQg
aGVyZS4KLSAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNp
Z25lZCBjaGFyKj4obV9kYXRhLm1fZGF0YSkgKyBvcmlnaW55ICogc3JjQnl0ZXNQZXJSb3cgKyBv
cmlnaW54ICogNDsKKyAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gcmVpbnRlcnByZXRfY2Fz
dDx1bnNpZ25lZCBjaGFyKj4oZGF0YS5tX2RhdGEpICsgb3JpZ2lueSAqIHNyY0J5dGVzUGVyUm93
ICsgb3JpZ2lueCAqIDQ7CiAgICAgdW5zaWduZWQgY2hhciogZGVzdFJvd3MgPSBkYXRhICsgZGVz
dHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0eCAqIDQ7CiAgICAgZm9yIChpbnQgeSA9IDA7IHkg
PCBudW1Sb3dzOyArK3kpIHsKICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1Db2x1bW5z
OyB4KyspIHsKICAgICAgICAgICAgIGludCBiYXNleCA9IHggKiA0OwotICAgICAgICAgICAgaWYg
KHVuc2lnbmVkIGNoYXIgYWxwaGEgPSBzcmNSb3dzW2Jhc2V4ICsgM10pIHsKKyAgICAgICAgICAg
IGlmIChtdWx0aXBsaWVkID09IFVubXVsdGlwbGllZCAmJiB1bnNpZ25lZCBjaGFyIGFscGhhID0g
c3JjUm93c1tiYXNleCArIDNdKSB7CiAgICAgICAgICAgICAgICAgZGVzdFJvd3NbYmFzZXhdID0g
KHNyY1Jvd3NbYmFzZXhdICogMjU1KSAvIGFscGhhOwogICAgICAgICAgICAgICAgIGRlc3RSb3dz
W2Jhc2V4ICsgMV0gPSAoc3JjUm93c1tiYXNleCArIDFdICogMjU1KSAvIGFscGhhOwogICAgICAg
ICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4ICsgMl0gPSAoc3JjUm93c1tiYXNleCArIDJdICogMjU1
KSAvIGFscGhhOwpAQCAtMTU3LDcgKzE1OCwxOCBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1h
Z2VCdWZmZXI6OmdldEltCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBJbWFnZUJ1ZmZl
cjo6cHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VS
ZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50KQorUGFzc1JlZlB0cjxJbWFnZURhdGE+IElt
YWdlQnVmZmVyOjpnZXRVbm11bHRpcGxpZWRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZ2V0SW1hZ2VEYXRhPFVubXVsdGlwbGllZD4ocmVjdCwgbV9k
YXRhLCBtX3NpemUpOworfQorCitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6Omdl
dFByZW11bHRpcGxpZWRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZ2V0SW1hZ2VEYXRhPFByZW11bHRpcGxpZWQ+KHJlY3QsIG1fZGF0YSwgbV9zaXpl
KTsKK30KKwordGVtcGxhdGUgPE11bHRpcGx5IG11bHRpcGxpZWQ+Cit2b2lkIHB1dEltYWdlRGF0
YShJbWFnZURhdGEqJiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IElu
dFBvaW50JiBkZXN0UG9pbnQsIEltYWdlQnVmZmVyRGF0YSYgZGF0YSwgY29uc3QgSW50U2l6ZSYg
c2l6ZSkKIHsKICAgICBBU1NFUlQoc291cmNlUmVjdC53aWR0aCgpID4gMCk7CiAgICAgQVNTRVJU
KHNvdXJjZVJlY3QuaGVpZ2h0KCkgPiAwKTsKQEAgLTE2NSwzNiArMTc3LDM2IEBAIHZvaWQgSW1h
Z2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEKICAgICBpbnQgb3JpZ2lueCA9IHNvdXJj
ZVJlY3QueCgpOwogICAgIGludCBkZXN0eCA9IGRlc3RQb2ludC54KCkgKyBzb3VyY2VSZWN0Lngo
KTsKICAgICBBU1NFUlQoZGVzdHggPj0gMCk7Ci0gICAgQVNTRVJUKGRlc3R4IDwgbV9zaXplLndp
ZHRoKCkpOworICAgIEFTU0VSVChkZXN0eCA8IHNpemUud2lkdGgoKSk7CiAgICAgQVNTRVJUKG9y
aWdpbnggPj0gMCk7CiAgICAgQVNTRVJUKG9yaWdpbnggPD0gc291cmNlUmVjdC5yaWdodCgpKTsK
IAogICAgIGludCBlbmR4ID0gZGVzdFBvaW50LngoKSArIHNvdXJjZVJlY3QucmlnaHQoKTsKLSAg
ICBBU1NFUlQoZW5keCA8PSBtX3NpemUud2lkdGgoKSk7CisgICAgQVNTRVJUKGVuZHggPD0gc2l6
ZS53aWR0aCgpKTsKIAogICAgIGludCBudW1Db2x1bW5zID0gZW5keCAtIGRlc3R4OwogCiAgICAg
aW50IG9yaWdpbnkgPSBzb3VyY2VSZWN0LnkoKTsKICAgICBpbnQgZGVzdHkgPSBkZXN0UG9pbnQu
eSgpICsgc291cmNlUmVjdC55KCk7CiAgICAgQVNTRVJUKGRlc3R5ID49IDApOwotICAgIEFTU0VS
VChkZXN0eSA8IG1fc2l6ZS5oZWlnaHQoKSk7CisgICAgQVNTRVJUKGRlc3R5IDwgc2l6ZS5oZWln
aHQoKSk7CiAgICAgQVNTRVJUKG9yaWdpbnkgPj0gMCk7CiAgICAgQVNTRVJUKG9yaWdpbnkgPD0g
c291cmNlUmVjdC5ib3R0b20oKSk7CiAKICAgICBpbnQgZW5keSA9IGRlc3RQb2ludC55KCkgKyBz
b3VyY2VSZWN0LmJvdHRvbSgpOwotICAgIEFTU0VSVChlbmR5IDw9IG1fc2l6ZS5oZWlnaHQoKSk7
CisgICAgQVNTRVJUKGVuZHkgPD0gc2l6ZS5oZWlnaHQoKSk7CiAgICAgaW50IG51bVJvd3MgPSBl
bmR5IC0gZGVzdHk7CiAKICAgICB1bnNpZ25lZCBzcmNCeXRlc1BlclJvdyA9IDQgKiBzb3VyY2Ut
PndpZHRoKCk7Ci0gICAgdW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93ID0gNCAqIG1fc2l6ZS53aWR0
aCgpOworICAgIHVuc2lnbmVkIGRlc3RCeXRlc1BlclJvdyA9IDQgKiBzaXplLndpZHRoKCk7CiAK
ICAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gc291cmNlLT5kYXRhKCktPmRhdGEoKS0+ZGF0
YSgpICsgb3JpZ2lueSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7Ci0gICAgdW5zaWdu
ZWQgY2hhciogZGVzdFJvd3MgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2Rh
dGEubV9kYXRhKSArIGRlc3R5ICogZGVzdEJ5dGVzUGVyUm93ICsgZGVzdHggKiA0OworICAgIHVu
c2lnbmVkIGNoYXIqIGRlc3RSb3dzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4o
ZGF0YS5tX2RhdGEpICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0eCAqIDQ7CiAgICAg
Zm9yIChpbnQgeSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsKICAgICAgICAgZm9yIChpbnQgeCA9
IDA7IHggPCBudW1Db2x1bW5zOyB4KyspIHsKICAgICAgICAgICAgIGludCBiYXNleCA9IHggKiA0
OwogICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhbHBoYSA9IHNyY1Jvd3NbYmFzZXggKyAzXTsK
LSAgICAgICAgICAgIGlmIChhbHBoYSAhPSAyNTUpIHsKKyAgICAgICAgICAgIGlmIChtdWx0aXBs
aWVkID09IFVubXVsdGlwbGllZCAmJiBhbHBoYSAhPSAyNTUpIHsKICAgICAgICAgICAgICAgICBk
ZXN0Um93c1tiYXNleF0gPSAoc3JjUm93c1tiYXNleF0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CiAg
ICAgICAgICAgICAgICAgZGVzdFJvd3NbYmFzZXggKyAxXSA9IChzcmNSb3dzW2Jhc2V4ICsgMV0g
KiBhbHBoYSArIDI1NCkgLyAyNTU7CiAgICAgICAgICAgICAgICAgZGVzdFJvd3NbYmFzZXggKyAy
XSA9IChzcmNSb3dzW2Jhc2V4ICsgMl0gKiBhbHBoYSArIDI1NCkgLyAyNTU7CkBAIC0yMDcsNiAr
MjE5LDE2IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEKICAgICB9
CiB9CiAKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dFVubXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURh
dGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRl
c3RQb2ludCkKK3sKKyAgICBwdXRJbWFnZURhdGE8VW5tdWx0aXBsaWVkPihzb3VyY2UsIHNvdXJj
ZVJlY3QsIGRlc3RQb2ludCwgbV9kYXRhLCBtX3NpemUpOworfQorCit2b2lkIEltYWdlQnVmZmVy
OjpwdXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRS
ZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50KQoreworICAgIHB1dElt
YWdlRGF0YTxQcmVtdWx0aXBsaWVkPihzb3VyY2UsIHNvdXJjZVJlY3QsIGRlc3RQb2ludCwgbV9k
YXRhLCBtX3NpemUpOworfQorCiBzdGF0aWMgUmV0YWluUHRyPENGU3RyaW5nUmVmPiB1dGlGcm9t
TUlNRVR5cGUoY29uc3QgU3RyaW5nJiBtaW1lVHlwZSkKIHsKICNpZiBQTEFURk9STShNQUMpCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlQnVmZmVyUXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAJ
KHJldmlzaW9uIDQ2NzY5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1
ZmZlclF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTgsMTIgKzk4LDEzIEBAIEltYWdlKiBJbWFn
ZUJ1ZmZlcjo6aW1hZ2UoKSBjb25zdAogICAgIHJldHVybiBtX2ltYWdlLmdldCgpOwogfQogCi1Q
YXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YShjb25zdCBJbnRS
ZWN0JiByZWN0KSBjb25zdAordGVtcGxhdGUgPE11bHRpcGx5IG11bHRpcGxpZWQ+CitQYXNzUmVm
UHRyPEltYWdlRGF0YT4gZ2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IElt
YWdlQnVmZmVyRGF0YSYgZGF0YSwgY29uc3QgSW50U2l6ZSYgc2l6ZSkKIHsKICAgICBQYXNzUmVm
UHRyPEltYWdlRGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpjcmVhdGUocmVjdC53aWR0aCgpLCBy
ZWN0LmhlaWdodCgpKTsKICAgICB1bnNpZ25lZCBjaGFyKiBkYXRhID0gcmVzdWx0LT5kYXRhKCkt
PmRhdGEoKS0+ZGF0YSgpOwogCi0gICAgaWYgKHJlY3QueCgpIDwgMCB8fCByZWN0LnkoKSA8IDAg
fHwgKHJlY3QueCgpICsgcmVjdC53aWR0aCgpKSA+IG1fc2l6ZS53aWR0aCgpIHx8IChyZWN0Lnko
KSArIHJlY3QuaGVpZ2h0KCkpID4gbV9zaXplLmhlaWdodCgpKQorICAgIGlmIChyZWN0LngoKSA8
IDAgfHwgcmVjdC55KCkgPCAwIHx8IChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSkgPiBzaXplLndp
ZHRoKCkgfHwgKHJlY3QueSgpICsgcmVjdC5oZWlnaHQoKSkgPiBzaXplLmhlaWdodCgpKQogICAg
ICAgICBtZW1zZXQoZGF0YSwgMCwgcmVzdWx0LT5kYXRhKCktPmxlbmd0aCgpKTsKIAogICAgIGlu
dCBvcmlnaW54ID0gcmVjdC54KCk7CkBAIC0xMTMsOCArMTE0LDggQEAgUGFzc1JlZlB0cjxJbWFn
ZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgICAgICBvcmlnaW54ID0gMDsKICAgICB9CiAg
ICAgaW50IGVuZHggPSByZWN0LngoKSArIHJlY3Qud2lkdGgoKTsKLSAgICBpZiAoZW5keCA+IG1f
c2l6ZS53aWR0aCgpKQotICAgICAgICBlbmR4ID0gbV9zaXplLndpZHRoKCk7CisgICAgaWYgKGVu
ZHggPiBzaXplLndpZHRoKCkpCisgICAgICAgIGVuZHggPSBzaXplLndpZHRoKCk7CiAgICAgaW50
IG51bUNvbHVtbnMgPSBlbmR4IC0gb3JpZ2lueDsKIAogICAgIGludCBvcmlnaW55ID0gcmVjdC55
KCk7CkBAIC0xMjQsMTEgKzEyNSwxNiBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZm
ZXI6OmdldEltCiAgICAgICAgIG9yaWdpbnkgPSAwOwogICAgIH0KICAgICBpbnQgZW5keSA9IHJl
Y3QueSgpICsgcmVjdC5oZWlnaHQoKTsKLSAgICBpZiAoZW5keSA+IG1fc2l6ZS5oZWlnaHQoKSkK
LSAgICAgICAgZW5keSA9IG1fc2l6ZS5oZWlnaHQoKTsKKyAgICBpZiAoZW5keSA+IHNpemUuaGVp
Z2h0KCkpCisgICAgICAgIGVuZHkgPSBzaXplLmhlaWdodCgpOwogICAgIGludCBudW1Sb3dzID0g
ZW5keSAtIG9yaWdpbnk7CiAKLSAgICBRSW1hZ2UgaW1hZ2UgPSBtX2RhdGEubV9waXhtYXAudG9J
bWFnZSgpLmNvbnZlcnRUb0Zvcm1hdChRSW1hZ2U6OkZvcm1hdF9BUkdCMzIpOworICAgIFFJbWFn
ZSBpbWFnZSA9IGRhdGEubV9waXhtYXAudG9JbWFnZSgpOworICAgIGlmIChtdWx0aXBsaWVkID09
IFVubXVsdGlwbGllZCkKKyAgICAgICAgaW1hZ2UgPSBpbWFnZS5jb252ZXJ0VG9Gb3JtYXQoUUlt
YWdlOjpGb3JtYXRfQVJHQjMyKTsKKyAgICBlbHNlCisgICAgICAgIGltYWdlID0gaW1hZ2UuY29u
dmVydFRvRm9ybWF0KFFJbWFnZTo6Rm9ybWF0X0FSR0IzMl9QcmVtdWx0aXBsaWVkKTsKKwogICAg
IEFTU0VSVCghaW1hZ2UuaXNOdWxsKCkpOwogCiAgICAgdW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93
ID0gNCAqIHJlY3Qud2lkdGgoKTsKQEAgLTE0OSw3ICsxNTUsMTggQEAgUGFzc1JlZlB0cjxJbWFn
ZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXZvaWQg
SW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVj
dCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK1Bhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJl
Y3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTxVbm11bHRpcGxpZWQ+
KHJlY3QsIG1fZGF0YSwgbV9zaXplKTsKK30KKworUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdl
QnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTxQcmVtdWx0aXBsaWVkPihyZWN0LCBtX2Rh
dGEsIG1fc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxNdWx0aXBseSBtdWx0aXBsaWVkPgordm9pZCBw
dXRJbWFnZURhdGEoSW1hZ2VEYXRhKiYgc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0
LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50LCBJbWFnZUJ1ZmZlckRhdGEmIGRhdGEsIGNvbnN0
IEludFNpemUmIHNpemUpCiB7CiAgICAgQVNTRVJUKHNvdXJjZVJlY3Qud2lkdGgoKSA+IDApOwog
ICAgIEFTU0VSVChzb3VyY2VSZWN0LmhlaWdodCgpID4gMCk7CkBAIC0xNTcsMzMgKzE3NCwzNyBA
QCB2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhCiAgICAgaW50IG9yaWdp
bnggPSBzb3VyY2VSZWN0LngoKTsKICAgICBpbnQgZGVzdHggPSBkZXN0UG9pbnQueCgpICsgc291
cmNlUmVjdC54KCk7CiAgICAgQVNTRVJUKGRlc3R4ID49IDApOwotICAgIEFTU0VSVChkZXN0eCA8
IG1fc2l6ZS53aWR0aCgpKTsKKyAgICBBU1NFUlQoZGVzdHggPCBzaXplLndpZHRoKCkpOwogICAg
IEFTU0VSVChvcmlnaW54ID49IDApOwogICAgIEFTU0VSVChvcmlnaW54IDw9IHNvdXJjZVJlY3Qu
cmlnaHQoKSk7CiAKICAgICBpbnQgZW5keCA9IGRlc3RQb2ludC54KCkgKyBzb3VyY2VSZWN0LnJp
Z2h0KCk7Ci0gICAgQVNTRVJUKGVuZHggPD0gbV9zaXplLndpZHRoKCkpOworICAgIEFTU0VSVChl
bmR4IDw9IHNpemUud2lkdGgoKSk7CiAKICAgICBpbnQgbnVtQ29sdW1ucyA9IGVuZHggLSBkZXN0
eDsKIAogICAgIGludCBvcmlnaW55ID0gc291cmNlUmVjdC55KCk7CiAgICAgaW50IGRlc3R5ID0g
ZGVzdFBvaW50LnkoKSArIHNvdXJjZVJlY3QueSgpOwogICAgIEFTU0VSVChkZXN0eSA+PSAwKTsK
LSAgICBBU1NFUlQoZGVzdHkgPCBtX3NpemUuaGVpZ2h0KCkpOworICAgIEFTU0VSVChkZXN0eSA8
IHNpemUuaGVpZ2h0KCkpOwogICAgIEFTU0VSVChvcmlnaW55ID49IDApOwogICAgIEFTU0VSVChv
cmlnaW55IDw9IHNvdXJjZVJlY3QuYm90dG9tKCkpOwogCiAgICAgaW50IGVuZHkgPSBkZXN0UG9p
bnQueSgpICsgc291cmNlUmVjdC5ib3R0b20oKTsKLSAgICBBU1NFUlQoZW5keSA8PSBtX3NpemUu
aGVpZ2h0KCkpOworICAgIEFTU0VSVChlbmR5IDw9IHNpemUuaGVpZ2h0KCkpOwogICAgIGludCBu
dW1Sb3dzID0gZW5keSAtIGRlc3R5OwogCiAgICAgdW5zaWduZWQgc3JjQnl0ZXNQZXJSb3cgPSA0
ICogc291cmNlLT53aWR0aCgpOwogCi0gICAgYm9vbCBpc1BhaW50aW5nID0gbV9kYXRhLm1fcGFp
bnRlci0+aXNBY3RpdmUoKTsKKyAgICBib29sIGlzUGFpbnRpbmcgPSBkYXRhLm1fcGFpbnRlci0+
aXNBY3RpdmUoKTsKICAgICBpZiAoaXNQYWludGluZykKLSAgICAgICAgbV9kYXRhLm1fcGFpbnRl
ci0+ZW5kKCk7CisgICAgICAgIGRhdGEubV9wYWludGVyLT5lbmQoKTsKIAotICAgIFFJbWFnZSBp
bWFnZSA9IG1fZGF0YS5tX3BpeG1hcC50b0ltYWdlKCkuY29udmVydFRvRm9ybWF0KFFJbWFnZTo6
Rm9ybWF0X0FSR0IzMik7CisgICAgUUltYWdlIGltYWdlID0gZGF0YS5tX3BpeG1hcC50b0ltYWdl
KCk7CisgICAgaWYgKG11bHRpcGxpZWQgPT0gVW5tdWx0aXBsaWVkKQorICAgICAgICBpbWFnZSA9
IGltYWdlLmNvbnZlcnRUb0Zvcm1hdChRSW1hZ2U6OkZvcm1hdF9BUkdCMzIpOworICAgIGVsc2UK
KyAgICAgICAgaW1hZ2UgPSBpbWFnZS5jb252ZXJ0VG9Gb3JtYXQoUUltYWdlOjpGb3JtYXRfQVJH
QjMyX1ByZW11bHRpcGxpZWQpOwogCiAgICAgdW5zaWduZWQgY2hhciogc3JjUm93cyA9IHNvdXJj
ZS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKSArIG9yaWdpbnkgKiBzcmNCeXRlc1BlclJvdyArIG9y
aWdpbnggKiA0OwogICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CkBAIC0x
OTYsMTAgKzIxNywyMCBAQCB2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRh
CiAgICAgICAgIHNyY1Jvd3MgKz0gc3JjQnl0ZXNQZXJSb3c7CiAgICAgfQogCi0gICAgbV9kYXRh
Lm1fcGl4bWFwID0gUVBpeG1hcDo6ZnJvbUltYWdlKGltYWdlKTsKKyAgICBkYXRhLm1fcGl4bWFw
ID0gUVBpeG1hcDo6ZnJvbUltYWdlKGltYWdlKTsKIAogICAgIGlmIChpc1BhaW50aW5nKQotICAg
ICAgICBtX2RhdGEubV9wYWludGVyLT5iZWdpbigmbV9kYXRhLm1fcGl4bWFwKTsKKyAgICAgICAg
ZGF0YS5tX3BhaW50ZXItPmJlZ2luKCZkYXRhLm1fcGl4bWFwKTsKK30KKwordm9pZCBJbWFnZUJ1
ZmZlcjo6cHV0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJ
bnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50KQoreworICAgIHB1
dEltYWdlRGF0YTxVbm11bHRpcGxpZWQ+KHNvdXJjZSwgc291cmNlUmVjdCwgZGVzdFBvaW50LCBt
X2RhdGEsIG1fc2l6ZSk7Cit9CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dFByZW11bHRpcGxpZWRJ
bWFnZURhdGEoSW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNv
bnN0IEludFBvaW50JiBkZXN0UG9pbnQpCit7CisgICAgcHV0SW1hZ2VEYXRhPFByZW11bHRpcGxp
ZWQ+KHNvdXJjZSwgc291cmNlUmVjdCwgZGVzdFBvaW50LCBtX2RhdGEsIG1fc2l6ZSk7CiB9CiAK
IC8vIFdlIGdldCBhIG1pbWVUeXBlIGhlcmUgYnV0IFFJbWFnZVdyaXRlciBkb2VzIG5vdCBzdXBw
b3J0IG1pbWV0eXBlcyBidXQKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9J
bWFnZUJ1ZmZlclNraWEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwCShyZXZpc2lvbiA0Njc2OSkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xMDAsNyArMTAwLDkgQEAgSW1hZ2UqIEltYWdlQnVmZmVyOjppbWFnZSgpIGNvbnN0CiAg
ICAgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7CiB9CiAKLVBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFn
ZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit0ZW1wbGF0
ZSA8TXVsdGlwbHkgbXVsdGlwbGllZD4KK1Bhc3NSZWZQdHI8SW1hZ2VEYXRhPiBnZXRJbWFnZURh
dGEoY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCwgCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFNpemUmIHNpemUpCiB7CiAgICAg
QVNTRVJUKGNvbnRleHQoKSk7CiAKQEAgLTEzNCw3ICsxMzYsNiBAQCBQYXNzUmVmUHRyPEltYWdl
RGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltCiAgICAgICAgIGVuZFkgPSBtX3NpemUuaGVpZ2h0KCk7
CiAgICAgaW50IG51bVJvd3MgPSBlbmRZIC0gb3JpZ2luWTsKIAotICAgIGNvbnN0IFNrQml0bWFw
JiBiaXRtYXAgPSAqY29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKS0+Yml0bWFwKCk7CiAgICAg
QVNTRVJUKGJpdG1hcC5jb25maWcoKSA9PSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcpOwog
ICAgIFNrQXV0b0xvY2tQaXhlbHMgYml0bWFwTG9jayhiaXRtYXApOwogCkBAIC0xNDQsNiArMTQ1
LDcgQEAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbQogICAgIGZvciAo
aW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CiAgICAgICAgIHVpbnQzMl90KiBzcmNSb3cg
PSBiaXRtYXAuZ2V0QWRkcjMyKG9yaWdpblgsIG9yaWdpblkgKyB5KTsKICAgICAgICAgZm9yIChp
bnQgeCA9IDA7IHggPCBudW1Db2x1bW5zOyArK3gpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFN1
cHBvcnQgZm9yIHByZW11bHRpcGxpZWQgY29sb3JzCiAgICAgICAgICAgICBTa0NvbG9yIGNvbG9y
ID0gU2tQTUNvbG9yVG9Db2xvcihzcmNSb3dbeF0pOwogICAgICAgICAgICAgdW5zaWduZWQgY2hh
ciogZGVzdFBpeGVsID0gJmRlc3RSb3dbeCAqIDRdOwogICAgICAgICAgICAgZGVzdFBpeGVsWzBd
ID0gU2tDb2xvckdldFIoY29sb3IpOwpAQCAtMTU3LDggKzE1OSwxOSBAQCBQYXNzUmVmUHRyPElt
YWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9p
ZCBJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRS
ZWN0JiBzb3VyY2VSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElu
dFBvaW50JiBkZXN0UG9pbnQpCitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6Omdl
dFVubXVsdGlwbGllZEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAg
IHJldHVybiBnZXRJbWFnZURhdGE8VW5tdWx0aXBsaWVkPihyZWN0LCAqY29udGV4dCgpLT5wbGF0
Zm9ybUNvbnRleHQoKS0+Yml0bWFwKCksIG1fc2l6ZSk7Cit9CisKK1Bhc3NSZWZQdHI8SW1hZ2VE
YXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0UHJlbXVsdGlwbGllZEltYWdlRGF0YShjb25zdCBJbnRSZWN0
JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBnZXRJbWFnZURhdGE8UHJlbXVsdGlwbGllZD4o
cmVjdCwgKmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCktPmJpdG1hcCgpLCBtX3NpemUpOwor
fQorCit0ZW1wbGF0ZSA8TXVsdGlwbHkgbXVsdGlwbGllZD4KK3ZvaWQgcHV0SW1hZ2VEYXRhKElt
YWdlRGF0YSomIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9p
bnQmIGRlc3RQb2ludCwgCisgICAgICAgICAgICAgICAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFw
LCBjb25zdCBJbnRTaXplJiBzaXplKQogewogICAgIEFTU0VSVChzb3VyY2VSZWN0LndpZHRoKCkg
PiAwKTsKICAgICBBU1NFUlQoc291cmNlUmVjdC5oZWlnaHQoKSA+IDApOwpAQCAtMTg2LDcgKzE5
OSw2IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEKICAgICBBU1NF
UlQoZW5kWSA8PSBtX3NpemUuaGVpZ2h0KCkpOwogICAgIGludCBudW1Sb3dzID0gZW5kWSAtIGRl
c3RZOwogCi0gICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCA9ICpjb250ZXh0KCktPnBsYXRmb3Jt
Q29udGV4dCgpLT5iaXRtYXAoKTsKICAgICBBU1NFUlQoYml0bWFwLmNvbmZpZygpID09IFNrQml0
bWFwOjprQVJHQl84ODg4X0NvbmZpZyk7CiAgICAgU2tBdXRvTG9ja1BpeGVscyBiaXRtYXBMb2Nr
KGJpdG1hcCk7CiAKQEAgLTE5Nyw2ICsyMDksNyBAQCB2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFn
ZURhdGEoSW1hZ2VEYXRhCiAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsK
ICAgICAgICAgdWludDMyX3QqIGRlc3RSb3cgPSBiaXRtYXAuZ2V0QWRkcjMyKGRlc3RYLCBkZXN0
WSArIHkpOwogICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG51bUNvbHVtbnM7ICsreCkgewor
ICAgICAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBmb3IgcHJlbXVsdGlwbGllZCBjb2xvcnMKICAg
ICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY1BpeGVsID0gJnNyY1Jvd1t4ICogNF07
CiAgICAgICAgICAgICBkZXN0Um93W3hdID0gU2tQcmVNdWx0aXBseUFSR0Ioc3JjUGl4ZWxbM10s
IHNyY1BpeGVsWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNyY1BpeGVsWzFdLCBzcmNQaXhlbFsyXSk7CkBAIC0yMDUsNiArMjE4LDE2IEBAIHZvaWQgSW1h
Z2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEKICAgICB9CiB9CiAKK3ZvaWQgSW1hZ2VC
dWZmZXI6OnB1dFVubXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3Qg
SW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK3sKKyAgICBw
dXRJbWFnZURhdGE8VW5tdWx0aXBsaWVkPihzb3VyY2UsIHNvdXJjZVJlY3QsIGRlc3RQb2ludCwg
KmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCktPmJpdG1hcCgpLCBtX3NpemUpOworfQorCit2
b2lkIEltYWdlQnVmZmVyOjpwdXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0YSogc291
cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50
KQoreworICAgIHB1dEltYWdlRGF0YTxQcmVtdWx0aXBsaWVkPihzb3VyY2UsIHNvdXJjZVJlY3Qs
IGRlc3RQb2ludCwgKmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCktPmJpdG1hcCgpLCBtX3Np
emUpOworfQorCiBTdHJpbmcgSW1hZ2VCdWZmZXI6OnRvRGF0YVVSTChjb25zdCBTdHJpbmcmKSBj
b25zdAogewogICAgIC8vIEVuY29kZSB0aGUgaW1hZ2UgaW50byBhIHZlY3Rvci4KSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvSW1hZ2VCdWZmZXJXeC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFnZUJ1ZmZlcld4LmNwcAkocmV2aXNp
b24gNDY3NjkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlQnVmZmVyV3gu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MywxMyArNTMsMjQgQEAgR3JhcGhpY3NDb250ZXh0KiBJ
bWFnZUJ1ZmZlcjo6Y29udGV4dCgpIAogICAgIHJldHVybiAwOwogfQogCi1QYXNzUmVmUHRyPElt
YWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YShjb25zdCBJbnRSZWN0JikgY29uc3QK
K1Bhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VE
YXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0CiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsK
ICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKEltYWdl
RGF0YSosIGNvbnN0IEludFJlY3QmLCBjb25zdCBJbnRQb2ludCYpCitQYXNzUmVmUHRyPEltYWdl
RGF0YT4gSW1hZ2VCdWZmZXI6OmdldFByZW11bHRpcGxpZWRJbWFnZURhdGEoY29uc3QgSW50UmVj
dCYgcmVjdCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOwor
fQorCit2b2lkIEltYWdlQnVmZmVyOjpwdXRVbm11bHRpcGxpZWRJbWFnZURhdGEoSW1hZ2VEYXRh
KiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0
UG9pbnQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBJbWFnZUJ1ZmZlcjo6
cHV0UHJlbXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVj
dCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKIHsKICAgICBub3RJbXBs
ZW1lbnRlZCgpOwogfQpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvU1ZHUmVzb3VyY2VNYXNr
ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL1NWR1Jlc291cmNlTWFz
a2VyLmNwcAkocmV2aXNpb24gNDY3NjkpCisrKyBXZWJDb3JlL3N2Zy9ncmFwaGljcy9TVkdSZXNv
dXJjZU1hc2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc2LDggKzc2LDggQEAgdm9pZCBTVkdS
ZXNvdXJjZU1hc2tlcjo6YXBwbHlNYXNrKEdyYXBoaQogICAgIGlmICghbHVtaW5hbmNlZEltYWdl
KQogICAgICAgICByZXR1cm47CiAKLSAgICBQYXNzUmVmUHRyPENhbnZhc1BpeGVsQXJyYXk+IHNy
Y1BpeGVsQXJyYXkobV9tYXNrLT5nZXRJbWFnZURhdGEoaW50SW1hZ2VSZWN0KS0+ZGF0YSgpKTsK
LSAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gZGVzdEltYWdlRGF0YShsdW1pbmFuY2VkSW1hZ2Ut
PmdldEltYWdlRGF0YShpbnRJbWFnZVJlY3QpKTsKKyAgICBQYXNzUmVmUHRyPENhbnZhc1BpeGVs
QXJyYXk+IHNyY1BpeGVsQXJyYXkobV9tYXNrLT5nZXRVbm11bHRpcGxpZWRJbWFnZURhdGEoaW50
SW1hZ2VSZWN0KS0+ZGF0YSgpKTsKKyAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gZGVzdEltYWdl
RGF0YShsdW1pbmFuY2VkSW1hZ2UtPmdldFVubXVsdGlwbGllZEltYWdlRGF0YShpbnRJbWFnZVJl
Y3QpKTsKIAogICAgIGZvciAodW5zaWduZWQgcGl4ZWxPZmZzZXQgPSAwOyBwaXhlbE9mZnNldCA8
IHNyY1BpeGVsQXJyYXktPmxlbmd0aCgpOyBwaXhlbE9mZnNldCsrKSB7CiAgICAgICAgIHVuc2ln
bmVkIHBpeGVsQnl0ZU9mZnNldCA9IHBpeGVsT2Zmc2V0ICogNDsKQEAgLTkzLDcgKzkzLDcgQEAg
dm9pZCBTVkdSZXNvdXJjZU1hc2tlcjo6YXBwbHlNYXNrKEdyYXBoaQogICAgICAgICBkZXN0SW1h
Z2VEYXRhLT5kYXRhKCktPnNldChwaXhlbEJ5dGVPZmZzZXQgKyAzLCBsdW1hKTsKICAgICB9CiAK
LSAgICBsdW1pbmFuY2VkSW1hZ2UtPnB1dEltYWdlRGF0YShkZXN0SW1hZ2VEYXRhLmdldCgpLCBp
bnRJbWFnZVJlY3QsIEludFBvaW50KDAsIDApKTsKKyAgICBsdW1pbmFuY2VkSW1hZ2UtPnB1dFVu
bXVsdGlwbGllZEltYWdlRGF0YShkZXN0SW1hZ2VEYXRhLmdldCgpLCBpbnRJbWFnZVJlY3QsIElu
dFBvaW50KDAsIDApKTsKIAogICAgIGNvbnRleHQtPmNsaXBUb0ltYWdlQnVmZmVyKG1fbWFza1Jl
Y3QsIGx1bWluYW5jZWRJbWFnZS5nZXQoKSk7CiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34651</attachid>
            <date>2009-08-12 03:52:49 -0700</date>
            <delta_ts>2009-08-19 02:32:06 -0700</delta_ts>
            <desc>premultiplied color support for Skia</desc>
            <filename>preSkia.patch</filename>
            <type>text/plain</type>
            <size>4161</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NzEwMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjAgQEAKKzIwMDktMDgtMTIgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTVkcg
RmlsdGVyIHByZW11bHRpcGxpZWQgY29sb3Igc3VwcG9ydCBmb3IgZ2V0SW1hZ2VEYXRlL3B1dElt
YWdlRGF0YQorICAgICAgICBbaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI3OTMzXQorCisgICAgICAgIE5lZWRlZCBjb2RlIHRvIGdldCBwcmVtdWx0aXBsaWVkIGNvbG9y
IHN1cHBvcnQgZm9yIFNraWEuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0lt
YWdlQnVmZmVyU2tpYS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZXRJbWFnZURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6cHV0SW1hZ2VEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9za2lhL1NraWFVdGlscy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTa1VNQ29sb3JUb0NvbG9y
KToKKyAgICAgICAgKFdlYkNvcmU6OlNrUE1Db2xvclRvQ29sb3IpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxzLmg6CisKIDIwMDktMDgtMTIgIFhhbiBMb3BleiAg
PHhsb3BlekBpZ2FsaWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEphbiBBbG9uem8uCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJT
a2lhLmNwcAkocmV2aXNpb24gNDcwOTkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvSW1hZ2VCdWZmZXJTa2lhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTYzLDggKzE2MywxMSBA
QCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gZ2V0SW1hZ2VEYXRhKGNvbnN0CiAgICAgZm9yIChpbnQg
eSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsKICAgICAgICAgdWludDMyX3QqIHNyY1JvdyA9IGJp
dG1hcC5nZXRBZGRyMzIob3JpZ2luWCwgb3JpZ2luWSArIHkpOwogICAgICAgICBmb3IgKGludCB4
ID0gMDsgeCA8IG51bUNvbHVtbnM7ICsreCkgewotICAgICAgICAgICAgLy8gVE9ETzogU3VwcG9y
dCBmb3IgcHJlbXVsdGlwbGllZCBjb2xvcnMKLSAgICAgICAgICAgIFNrQ29sb3IgY29sb3IgPSBT
a1BNQ29sb3JUb0NvbG9yKHNyY1Jvd1t4XSk7CisgICAgICAgICAgICBTa0NvbG9yIGNvbG9yOwor
ICAgICAgICAgICAgaWYgKG11bHRpcGxpZWQgPT0gVW5tdWx0aXBsaWVkKQorICAgICAgICAgICAg
ICAgIGNvbG9yID0gU2tQTUNvbG9yVG9Db2xvcihzcmNSb3dbeF0pOworICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgIGNvbG9yID0gU2tVTUNvbG9yVG9Db2xvcihzcmNSb3dbeF0pOwog
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdFBpeGVsID0gJmRlc3RSb3dbeCAqIDRdOwog
ICAgICAgICAgICAgZGVzdFBpeGVsWzBdID0gU2tDb2xvckdldFIoY29sb3IpOwogICAgICAgICAg
ICAgZGVzdFBpeGVsWzFdID0gU2tDb2xvckdldEcoY29sb3IpOwpAQCAtMjI3LDEwICsyMzAsMTMg
QEAgdm9pZCBwdXRJbWFnZURhdGEoSW1hZ2VEYXRhKiYgc291cmNlLCBjbwogICAgIGZvciAoaW50
IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CiAgICAgICAgIHVpbnQzMl90KiBkZXN0Um93ID0g
Yml0bWFwLmdldEFkZHIzMihkZXN0WCwgZGVzdFkgKyB5KTsKICAgICAgICAgZm9yIChpbnQgeCA9
IDA7IHggPCBudW1Db2x1bW5zOyArK3gpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFN1cHBvcnQg
Zm9yIHByZW11bHRpcGxpZWQgY29sb3JzCiAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFy
KiBzcmNQaXhlbCA9ICZzcmNSb3dbeCAqIDRdOwotICAgICAgICAgICAgZGVzdFJvd1t4XSA9IFNr
UHJlTXVsdGlwbHlBUkdCKHNyY1BpeGVsWzNdLCBzcmNQaXhlbFswXSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaXhlbFsxXSwgc3JjUGl4ZWxbMl0pOwor
ICAgICAgICAgICAgaWYgKG11bHRpcGxpZWQgPT0gVW5wcmVtdWx0aXBsaWVkKQorICAgICAgICAg
ICAgICAgIGRlc3RSb3dbeF0gPSBTa1ByZU11bHRpcGx5QVJHQihzcmNQaXhlbFszXSwgc3JjUGl4
ZWxbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNy
Y1BpeGVsWzFdLCBzcmNQaXhlbFsyXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgZGVzdFJvd1t4XSA9IFNrUGFja0FSR0IzMihzcmNQaXhlbFszXSwgc3JjUGl4ZWxbMF0sCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaXhlbFsxXSwgc3Jj
UGl4ZWxbMl0pOwogICAgICAgICB9CiAgICAgICAgIHNyY1JvdyArPSBzcmNCeXRlc1BlclJvdzsK
ICAgICB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxzLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxz
LmNwcAkocmV2aXNpb24gNDcwOTgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEv
U2tpYVV0aWxzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtODAsNyArODAsNyBAQCBzdGF0aWMgVThD
UFUgSW52U2NhbGVCeXRlKFU4Q1BVIGNvbXBvbmVuCiAgICAgcmV0dXJuIChjb21wb25lbnQgKiBz
Y2FsZSArIDB4ODAwMCkgPj4gMTY7CiB9CiAKLVNrQ29sb3IgU2tQTUNvbG9yVG9Db2xvcihTa1BN
Q29sb3IgcG0pCitTa0NvbG9yIFNrVU1Db2xvclRvQ29sb3IoU2tQTUNvbG9yIHBtKQogewogICAg
IGlmICgwID09IHBtKQogICAgICAgICByZXR1cm4gMDsKQEAgLTk0LDYgKzk0LDE3IEBAIFNrQ29s
b3IgU2tQTUNvbG9yVG9Db2xvcihTa1BNQ29sb3IgcG0pCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEludlNjYWxlQnl0ZShTa0dldFBhY2tlZEIzMihwbSksIHNjYWxlKSk7CiB9CiAKK1NrQ29s
b3IgU2tQTUNvbG9yVG9Db2xvcihTa1BNQ29sb3IgcG0pCit7CisgICAgaWYgKDAgPT0gcG0pCisg
ICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiBTa0NvbG9yU2V0QVJHQihTa0dldFBh
Y2tlZEEzMihwbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNrR2V0UGFja2VkUjMyKHBt
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2tHZXRQYWNrZWRHMzIocG0pLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICBTa0dldFBhY2tlZEIzMihwbSkpOworfQorCiBDb2xvciBTa1BN
Q29sb3JUb1dlYkNvcmVDb2xvcihTa1BNQ29sb3IgcG0pCiB7CiAgICAgcmV0dXJuIFNrUE1Db2xv
clRvQ29sb3IocG0pOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFV
dGlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lh
VXRpbHMuaAkocmV2aXNpb24gNDcwOTgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvU2tpYVV0aWxzLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDYgKzQ3LDcgQEAgU2tYZmVybW9k
ZTo6TW9kZSBXZWJDb3JlQ29tcG9zaXRlVG9Ta2lhQwogCiAvLyBtb3ZlIHRoaXMgZ3V5IGludG8g
U2tDb2xvci5oCiBTa0NvbG9yIFNrUE1Db2xvclRvQ29sb3IoU2tQTUNvbG9yKTsKK1NrQ29sb3Ig
U2tVTUNvbG9yVG9Db2xvcihTa1BNQ29sb3IpOwogCiAvLyBUaGlzIHNob3VsZCBiZSBhbiBvcGVy
YXRvciBvbiBDb2xvcgogQ29sb3IgU2tQTUNvbG9yVG9XZWJDb3JlQ29sb3IoU2tQTUNvbG9yKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>35113</attachid>
            <date>2009-08-19 02:32:06 -0700</date>
            <delta_ts>2009-09-02 13:38:58 -0700</delta_ts>
            <desc>premultiplied color support for Skia</desc>
            <filename>iBskia.patch</filename>
            <type>text/plain</type>
            <size>3236</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NzQ5OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYgQEAKKzIwMDktMDgtMTkgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTVkcg
RmlsdGVyIHByZW11bHRpcGxpZWQgY29sb3Igc3VwcG9ydCBmb3IgZ2V0SW1hZ2VEYXRlL3B1dElt
YWdlRGF0YQorICAgICAgICBbaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI3OTMzXQorCisgICAgICAgIFBhdGNoIHRvIGdldCBwcmVtdWx0aXBsaWVkIGNvbG9yIHN1cHBv
cnQgZm9yIFNraWEgb24gZ2V0SW1hZ2VEYXRlL3B1dEltYWdlRGF0YS4KKworICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OmdldEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpwdXRJbWFnZURhdGEpOgorCiAy
MDA5LTA4LTE4ICBNYWNpZWogU3RhY2hvd2lhayAgPG1qc0BhcHBsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcAkocmV2aXNpb24gNDc0NTUpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTYxLDEzICsxNjEsMjEgQEAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IGdldElt
YWdlRGF0YShjb25zdAogICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CiAg
ICAgICAgIHVpbnQzMl90KiBzcmNSb3cgPSBiaXRtYXAuZ2V0QWRkcjMyKG9yaWdpblgsIG9yaWdp
blkgKyB5KTsKICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1Db2x1bW5zOyArK3gpIHsK
LSAgICAgICAgICAgIC8vIFRPRE86IFN1cHBvcnQgZm9yIHByZW11bHRpcGxpZWQgY29sb3JzCi0g
ICAgICAgICAgICBTa0NvbG9yIGNvbG9yID0gU2tQTUNvbG9yVG9Db2xvcihzcmNSb3dbeF0pOwog
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdFBpeGVsID0gJmRlc3RSb3dbeCAqIDRdOwot
ICAgICAgICAgICAgZGVzdFBpeGVsWzBdID0gU2tDb2xvckdldFIoY29sb3IpOwotICAgICAgICAg
ICAgZGVzdFBpeGVsWzFdID0gU2tDb2xvckdldEcoY29sb3IpOwotICAgICAgICAgICAgZGVzdFBp
eGVsWzJdID0gU2tDb2xvckdldEIoY29sb3IpOwotICAgICAgICAgICAgZGVzdFBpeGVsWzNdID0g
U2tDb2xvckdldEEoY29sb3IpOworICAgICAgICAgICAgaWYgKG11bHRpcGxpZWQgPT0gVW5tdWx0
aXBsaWVkKSB7CisgICAgICAgICAgICAgICAgU2tDb2xvciBjb2xvciA9IFNrUE1Db2xvclRvQ29s
b3Ioc3JjUm93W3hdKTsKKyAgICAgICAgICAgICAgICBkZXN0UGl4ZWxbMF0gPSBTa0NvbG9yR2V0
Uihjb2xvcik7CisgICAgICAgICAgICAgICAgZGVzdFBpeGVsWzFdID0gU2tDb2xvckdldEcoY29s
b3IpOworICAgICAgICAgICAgICAgIGRlc3RQaXhlbFsyXSA9IFNrQ29sb3JHZXRCKGNvbG9yKTsK
KyAgICAgICAgICAgICAgICBkZXN0UGl4ZWxbM10gPSBTa0NvbG9yR2V0QShjb2xvcik7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgYXJl
IGJvdGggcHJlLW11bHRpcGxpZWQsIHdlIGp1c3QgbmVlZCB0byByZS1hcnJhbmdlIHRoZQorICAg
ICAgICAgICAgICAgIC8vIGJ5dGVzIGZyb20gdGhlIGJpdG1hcCBmb3JtYXQgdG8gUkdCQS4KKyAg
ICAgICAgICAgICAgICBkZXN0UGl4ZWxbMF0gPSBTa0dldFBhY2tlZFIzMihzcmNSb3dbeF0pOwor
ICAgICAgICAgICAgICAgIGRlc3RQaXhlbFsxXSA9IFNrR2V0UGFja2VkRzMyKHNyY1Jvd1t4XSk7
CisgICAgICAgICAgICAgICAgZGVzdFBpeGVsWzJdID0gU2tHZXRQYWNrZWRCMzIoc3JjUm93W3hd
KTsKKyAgICAgICAgICAgICAgICBkZXN0UGl4ZWxbM10gPSBTa0dldFBhY2tlZEEzMihzcmNSb3db
eF0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRlc3RSb3cgKz0gZGVzdEJ5
dGVzUGVyUm93OwogICAgIH0KQEAgLTIyNSwxMCArMjMzLDEzIEBAIHZvaWQgcHV0SW1hZ2VEYXRh
KEltYWdlRGF0YSomIHNvdXJjZSwgY28KICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG51bVJvd3M7
ICsreSkgewogICAgICAgICB1aW50MzJfdCogZGVzdFJvdyA9IGJpdG1hcC5nZXRBZGRyMzIoZGVz
dFgsIGRlc3RZICsgeSk7CiAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1uczsg
Kyt4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IGZvciBwcmVtdWx0aXBsaWVkIGNv
bG9ycwogICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjUGl4ZWwgPSAmc3JjUm93
W3ggKiA0XTsKLSAgICAgICAgICAgIGRlc3RSb3dbeF0gPSBTa1ByZU11bHRpcGx5QVJHQihzcmNQ
aXhlbFszXSwgc3JjUGl4ZWxbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3JjUGl4ZWxbMV0sIHNyY1BpeGVsWzJdKTsKKyAgICAgICAgICAgIGlmIChtdWx0
aXBsaWVkID09IFVucHJlbXVsdGlwbGllZCkKKyAgICAgICAgICAgICAgICBkZXN0Um93W3hdID0g
U2tQcmVNdWx0aXBseUFSR0Ioc3JjUGl4ZWxbM10sIHNyY1BpeGVsWzBdLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaXhlbFsxXSwgc3JjUGl4ZWxb
Ml0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlc3RSb3dbeF0gPSBTa1Bh
Y2tBUkdCMzIoc3JjUGl4ZWxbM10sIHNyY1BpeGVsWzBdLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3JjUGl4ZWxbMV0sIHNyY1BpeGVsWzJdKTsKICAgICAgICAg
fQogICAgICAgICBzcmNSb3cgKz0gc3JjQnl0ZXNQZXJSb3c7CiAgICAgfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>