<?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>21816</bug_id>
          
          <creation_ts>2008-10-22 16:32:10 -0700</creation_ts>
          <short_desc>Clean up ImageBuffer.h so there do not have to be separate ifdefs for each platform</short_desc>
          <delta_ts>2008-10-28 17:42:24 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Brett Wilson (Google)">brettw</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>96259</commentid>
    <comment_count>0</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-22 16:32:10 -0700</bug_when>
    <thetext>ImageBuffer.h should be refactored so that the big list of ifdefs at the bottom of the file are unnecessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96260</commentid>
    <comment_count>1</comment_count>
      <attachid>24580</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-22 16:33:16 -0700</bug_when>
    <thetext>Created attachment 24580
Patch

Move platform-specific stuff out of ImageBuffer and into a separate per-platform file. This should make everything a little cleaner and nicer for everybody, and allows ports to make changes without having to change these shared files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96272</commentid>
    <comment_count>2</comment_count>
      <attachid>24580</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2008-10-22 18:04:35 -0700</bug_when>
    <thetext>Comment on attachment 24580
Patch

-        IntSize size() const { return m_size; }
+        const IntSize&amp; size() const { return m_size; }
What is the reason for this change, the ChangeLog doesn&apos;t say?  On many systems it is possible to pass an IntSize in a register. 

+        mutable std::auto_ptr&lt;PlatformImageBuffer&gt; m_platform;
This shouldn&apos;t be an auto_ptr and should instead just be a member.  It could also use a better name.  Perhaps  PlatformImageBuffer m_platformImageBuffer;

+        ImageBuffer(std::auto_ptr&lt;PlatformImageBuffer&gt;, const IntSize&amp;, std::auto_ptr&lt;GraphicsContext&gt;);
This should not take auto_ptrs.  I don&apos;t even think it needs to take a PlatformImageBuffer as a parameter.  It should just instantiate one itself.

The rest of the patch is based on the model above and thus should be changed as well.  As such, I will only list the style issues from here on.


+class PlatformImageBuffer
+{
The { should go on the same line as the class name.  This is repeated a bunch.

+    unsigned int m_bytesPerRow;
Should just be unsigned.

+    QPainter painter() { return m_painter; }
This should probably return a QPainter*.

+    QPainter* m_painter;
This should be an OwnPtr.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96333</commentid>
    <comment_count>3</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-23 08:15:32 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 24580 [edit])
&gt; -        IntSize size() const { return m_size; }
&gt; +        const IntSize&amp; size() const { return m_size; }
&gt; What is the reason for this change, the ChangeLog doesn&apos;t say?  On many systems
&gt; it is possible to pass an IntSize in a register.

I just thought it was an error. The constructor and create() both take the argument by reference, and this is certainly what I&apos;m used to from other places in the code like GraphicsContext.h. It seems like argument passing conventions should match the return type conventions for this kind of thing. I can change them all to by-value if you want.


&gt; +        mutable std::auto_ptr&lt;PlatformImageBuffer&gt; m_platform;
&gt; This shouldn&apos;t be an auto_ptr and should instead just be a member.  It could
&gt; also use a better name.  Perhaps  PlatformImageBuffer m_platformImageBuffer;
&gt; 
&gt; +        ImageBuffer(std::auto_ptr&lt;PlatformImageBuffer&gt;, const IntSize&amp;,
&gt; std::auto_ptr&lt;GraphicsContext&gt;);
&gt; This should not take auto_ptrs.  I don&apos;t even think it needs to take a
&gt; PlatformImageBuffer as a parameter.  It should just instantiate one itself.
&gt; 
&gt; The rest of the patch is based on the model above and thus should be changed as
&gt; well.  As such, I will only list the style issues from here on.

I did it this way because create() is supposed to return null if the bitmap couldn&apos;t be created. This means that the subset of platform-depenedent work that can fail must happen in create(). Given I wanted to have the same constructor for all platforms, the only option that I can think of is to create the platform-dependent data outside of the constructor and pass it in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96347</commentid>
    <comment_count>4</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-23 11:08:36 -0700</bug_when>
    <thetext>I suppose alternatively InageBuffer could somehow have an error state that ::create notices, deletes it, and returns NULL. I&apos;m not sure this is better than what i did here, however.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96352</commentid>
    <comment_count>5</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2008-10-23 11:17:15 -0700</bug_when>
    <thetext>My main concern is with the unnecessary allocations that this model requires.  I think you could probably just pass the PlatformImageBuffer by value to the ImageBuffer constructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96374</commentid>
    <comment_count>6</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-23 12:41:29 -0700</bug_when>
    <thetext>Passing by value will create a copy in ImageBuffer. This is possible for CG, but  not for some other platforms. Even for CG, this would require extra work to transfer ownership of the void* pointer in the PlatformImageBuffer to the copy in the object.

Worrying about one more malloc when you&apos;re allocating a potentially multi-megabyte bitmap doesn&apos;t seem worthwhile to me.

The other option is my suggestion in comment 4. Are you happy with that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96392</commentid>
    <comment_count>7</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2008-10-23 13:30:02 -0700</bug_when>
    <thetext>I don&apos;t think an extra new/delete is a good idea when not needed.  There is much smaller overhead to copying the address of a pointer (and potentially an integer) than there is to a malloc.  In all, this change seems to complicate the code and add more calls to the allocator than necessary, both of which we should try and avoid.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96405</commentid>
    <comment_count>8</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-23 13:41:45 -0700</bug_when>
    <thetext>You still have not answered whether you are happy with my proposal in comment 4 which avoids this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96410</commentid>
    <comment_count>9</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2008-10-23 13:57:00 -0700</bug_when>
    <thetext>It depends on how much complexity it adds.  It doesn&apos;t seem ideal and but requiring a delete in the error case, which should not be often would not be the end of world.  I would prefer a solution that did not require it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96436</commentid>
    <comment_count>10</comment_count>
      <attachid>24624</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-23 15:41:46 -0700</bug_when>
    <thetext>Created attachment 24624
Patch v2

This adds a flag to ImageBuffer that create can use to check if it should return true or not. This has the nice effect of making create() cross-platform, so I moved it into the header file. I think the platform-specific code is also more clear as a result, you just have to set the flag properly and you don&apos;t have to worry about writing create and returning an enpty auto_ptr.

I left IntSize passed by reference for consistency. I can still change all uses of IntPoint in this class to by-value instead, but that seems less consistent with the rest of the project to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96524</commentid>
    <comment_count>11</comment_count>
      <attachid>24624</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-10-24 11:01:21 -0700</bug_when>
    <thetext>Comment on attachment 24624
Patch v2

Thanks for taking this on. It&apos;s good to reduce the use of #if in the platform layer.

I&apos;m not sure it improves things to make the create function&apos;s body shared cross-platform. It&apos;s a simple small function, and in return for making it cross-platform we&apos;ve added an unconventional creation idiom where there&apos;s a boolean to express success. Is it really a good tradeoff?

On of the weakest things about the WebCore platform layer is all the different ways the word &quot;platform&quot; is used and the different ways PlatformXXX is used. I think it&apos;s strange to have a class ImageBuffer and another class PlatformImageBuffer with such different roles; the second one is just a structure to hold data members to make it possible to move them out of the ImageBuffer.h header. Maybe the PlatformImageBuffer class should be called ImageBufferData or something like that? I think a good way to name PlatformImageBuffer would be to say a sentence out loud about what the class is for and figure out what the key words are. Similarly, the name m_platform for a member that has all the data in it isn&apos;t so great. I know it&apos;s platform-specific data, but still, if the name is &quot;platform&quot; then it should be &quot;a platform&quot; and it seems clear this is not a platform.

&gt; +         happens in the cunstructor which sets a flag that create uses to know

Misspelling here.

&gt; +            if (buf-&gt;m_initialized)
&gt; +              return buf;

This return statement is indented two spaces but should be indented four.

&gt; +        // The ImageBuffer constructor should set this to true if construction
&gt; +        // succeeded, and check the value in create() to see if the object or
&gt; +        // a null pointer should be returned.
&gt; +        bool m_initialized;

If the constructor needs to return a value, we should use an &quot;out parameter&quot; from the constructor; pass in a reference to a bool. It doesn&apos;t seem smart to use a data member for the entire lifetime of the object just because we wanted a way to return a value from the constructor.

&gt; +    m_initialzed = true;

This typo means the Cairo version wouldn&apos;t compile.

I&apos;m going to say review- because I&apos;d like to see m_initialized be removed, but this patch seems basically fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96525</commentid>
    <comment_count>12</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-24 11:10:03 -0700</bug_when>
    <thetext>The reason I added the m_initialized flag is because weinig didn&apos;t like the way create created the PlatformImageBuffer and passed it into the constructor. These are the only two reasonable ways to do it.

Passing the PlatformImageBuffer by value is totally unacceptable because for some platforms there will be large amounts of data tied to it. I&apos;m not sure weinig understood this so I will try to make it more clear. In the Qt version, the PlatformImageBuffer has a QPixmap. Copying this structure would imply copying a large pixmap for no effect. It would also imply that we have some kind of pointer ownership transfer to avoid copying the QPainter which would make it much more complicated.

Our Skia port will look very much like the Qt version, where it would be unacceptable to copy PlatformImageBuffer as weinig suggested twice.

If you have an approach that (1) never copies PlatformImageBuffers, (2) never does an extra malloc in create and passes it into the constructor, (3) never uses an extra flag, and (4) has the same constructors for each platform, I&apos;m happy to write it. But I don&apos;t know how to do that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96527</commentid>
    <comment_count>13</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-24 11:12:09 -0700</bug_when>
    <thetext>Maybe I missed what you were suggesting. You&apos;re suggesting that we kill create() and have ImageBuffer have an out parameter that indicates success to the callers?

That seems really weird to me, it doesn&apos;t seem like C++ normally works that way, but I&apos;m okay writing it if that&apos;s what you want.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96783</commentid>
    <comment_count>14</comment_count>
      <attachid>24695</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-27 14:25:39 -0700</bug_when>
    <thetext>Created attachment 24695
Patch v3

The implements Darin&apos;s suggestion of deleting the ::create function and making the constructor use an out parameter. I had to change a lot of callers, some of which improved in clarity, some of which got slightly worse as a result of this change. The code in ImageBuffer*.cpp is much shorter.

This adds a one-line ifdef change to allow Skia ports to implement text drawing modes (the change in GraphicsContext.cc).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96784</commentid>
    <comment_count>15</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-10-27 14:29:18 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; Maybe I missed what you were suggesting. You&apos;re suggesting that we kill
&gt; create() and have ImageBuffer have an out parameter that indicates success to
&gt; the callers?

No, I wasn&apos;t suggesting that. Sorry, forgot to cc myself on the message.

I was suggesting that we keep create exactly as it was before, with platform-specific versions as necessary. The create function itself would return 0 if it failed.

My alternate suggestion, if you really feel that create needs to become cross-platform, would be to use an out parameter for the boolean success flag, making ImageBuffer constructors able to indicate failure uniformly at construction time without having to carry that state along for the rest of their lifetimes.

I&apos;m sorry I didn&apos;t see this *before* you made a new patch. My fault entirely for not cc&apos;ing myself on the bug!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96862</commentid>
    <comment_count>16</comment_count>
      <attachid>24713</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2008-10-28 08:39:09 -0700</bug_when>
    <thetext>Created attachment 24713
Patch v4

This is like the v2 patch but using an out parameter from the constructor to communicate with ::create that it hsould fail.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96869</commentid>
    <comment_count>17</comment_count>
      <attachid>24713</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-10-28 09:07:49 -0700</bug_when>
    <thetext>Comment on attachment 24713
Patch v4

&gt; +    success = false;  // Make early return mean failure.

If you wanted to match the semantics of your earlier patch you could have done this at the call site. I think it&apos;s fine the way it is, though.

&gt; +    ASSERT((reinterpret_cast&lt;size_t&gt;(m_data.m_data) &amp; 2) == 0);

You didn&apos;t write this code, but for the record and for else reading this patch, the correct type to use here is uintptr_t (or intptr_t) rather than size_t. And also, it&apos;s a very strange thing to test. Maybe the person writing it meant to and with 1 or with 3. I don&apos;t understand why it&apos;s testing only the 2 bit.

&gt; +#include &lt;QPainter&gt;
&gt; +#include &lt;QPixmap&gt;
&gt; +
&gt; +#include &quot;OwnPtr.h&quot;

We&apos;d normally put these includes into a single paragraph, not two paragraphs.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96942</commentid>
    <comment_count>18</comment_count>
    <who name="Adele Peterson">adele</who>
    <bug_when>2008-10-28 17:32:22 -0700</bug_when>
    <thetext>I ran into an error building with Visual Studio.

&quot;success&quot; needs to be intialized in ImageBuffer.h.  I made this change, but I think we should consider taking out the other places where we set it to false now that its initialized to false.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24580</attachid>
            <date>2008-10-22 16:33:16 -0700</date>
            <delta_ts>2008-10-28 08:39:09 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>imagebuffer.diff</filename>
            <type>text/plain</type>
            <size>21416</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDM3Nzk1
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDUgQEAKKzIwMDgtMTAt
MjIgIEJyZXR0IFdpbHNvbiAgPGJyZXR0d0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVtb3ZlIHBsYXRmb3JtIGlmZGVmcyBp
biBJbWFnZUJ1ZmZlci5oIGJ5IG1vdmluZyBwbGF0Zm9ybSBzcGVjaWZpYyBjb2RlCisgICAgICAg
IGludG8gYSBuZXcgUGxhdGZvcm1JbWFnZUJ1ZmZlciBjbGFzcy4KKworICAgICAgICAqIENoYW5n
ZUxvZzoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5oOgorICAgICAg
ICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OnNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fpcm8uY3BwOgorICAgICAgICAoV2ViQ29yZTo6UGxhdGZv
cm1JbWFnZUJ1ZmZlcjo6UGxhdGZvcm1JbWFnZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpQ
bGF0Zm9ybUltYWdlQnVmZmVyOjp+UGxhdGZvcm1JbWFnZUJ1ZmZlcik6CisgICAgICAgIChXZWJD
b3JlOjpJbWFnZUJ1ZmZlcjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVy
OjpJbWFnZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6fkltYWdlQnVm
ZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjppbWFnZSk6CisgICAgICAgIChX
ZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6Oklt
YWdlQnVmZmVyOjpwdXRJbWFnZURhdGEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nh
aXJvL1BsYXRmb3JtSW1hZ2VCdWZmZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpQbGF0
Zm9ybUltYWdlQnVmZmVyOjpzdXJmYWNlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9j
Zy9JbWFnZUJ1ZmZlckNHLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtSW1hZ2VCdWZm
ZXI6OlBsYXRmb3JtSW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6UGxhdGZvcm1JbWFn
ZUJ1ZmZlcjo6flBsYXRmb3JtSW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VC
dWZmZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZm
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcik6CisgICAg
ICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNv
cmU6OkltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL2NnL1BsYXRmb3JtSW1hZ2VCdWZmZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpQ
bGF0Zm9ybUltYWdlQnVmZmVyOjpkYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtSW1h
Z2VCdWZmZXI6OmJ5dGVzUGVyUm93KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9J
bWFnZUJ1ZmZlclF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtSW1hZ2VCdWZmZXI6
OlBsYXRmb3JtSW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6UGxhdGZvcm1JbWFnZUJ1
ZmZlcjo6flBsYXRmb3JtSW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZm
ZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIp
OgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcik6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvUGxhdGZvcm1JbWFnZUJ1ZmZlci5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtSW1hZ2VCdWZmZXI6OnBpeG1hcCk6CisgICAgICAgIChX
ZWJDb3JlOjpQbGF0Zm9ybUltYWdlQnVmZmVyOjpwYWludGVyKToKKwogMjAwOC0xMC0yMiAgQnJh
ZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRh
bSBSb2JlbgpJbmRleDogcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBwbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5oCShyZXZpc2lvbiAzNzc2MSkKKysr
IHBsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTI5LDE0
ICsyOSwxMSBAQAogCiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJJbnRTaXplLmgiCisj
aW5jbHVkZSAiUGxhdGZvcm1JbWFnZUJ1ZmZlci5oIgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4K
ICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2lmIFBM
QVRGT1JNKFNLSUEpCi1jbGFzcyBTa0JpdG1hcDsKLSNlbmRpZgotCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKICAgICBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CkBAIC00NywxMCArNDQsMTEgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiAgICAgY2xhc3MgSW1hZ2VCdWZmZXIgOiBOb25jb3B5YWJsZSB7
CiAgICAgcHVibGljOgorICAgICAgICAvLyBXaWxsIHJldHVybiBhIG51bGwgcG9pbnRlciBvbiBh
bGxvY2F0aW9uIGZhaWx1cmUuCiAgICAgICAgIHN0YXRpYyBzdGQ6OmF1dG9fcHRyPEltYWdlQnVm
ZmVyPiBjcmVhdGUoY29uc3QgSW50U2l6ZSYsIGJvb2wgZ3JheVNjYWxlKTsKICAgICAgICAgfklt
YWdlQnVmZmVyKCk7CiAKLSAgICAgICAgSW50U2l6ZSBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9z
aXplOyB9CisgICAgICAgIGNvbnN0IEludFNpemUmIHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Np
emU7IH0KICAgICAgICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0KCkgY29uc3Q7CiAKICAgICAg
ICAgSW1hZ2UqIGltYWdlKCkgY29uc3Q7CkBAIC02MywyNCArNjEsMTIgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogICAgICAgICBTdHJpbmcgdG9EYXRhVVJMKGNvbnN0IFN0cmluZyYgbWltZVR5cGUp
IGNvbnN0OwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgdm9pZCogbV9kYXRhOworICAgICAgICBt
dXRhYmxlIHN0ZDo6YXV0b19wdHI8UGxhdGZvcm1JbWFnZUJ1ZmZlcj4gbV9wbGF0Zm9ybTsKICAg
ICAgICAgSW50U2l6ZSBtX3NpemU7Ci0KICAgICAgICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dD4g
bV9jb250ZXh0OwogICAgICAgICBtdXRhYmxlIFJlZlB0cjxJbWFnZT4gbV9pbWFnZTsKLSAgICAK
LSNpZiBQTEFURk9STShDRykKLSAgICAgICAgSW1hZ2VCdWZmZXIodm9pZCogaW1hZ2VEYXRhLCBj
b25zdCBJbnRTaXplJiwgc3RkOjphdXRvX3B0cjxHcmFwaGljc0NvbnRleHQ+KTsKLSNlbGlmIFBM
QVRGT1JNKFFUKQotICAgICAgICBJbWFnZUJ1ZmZlcihjb25zdCBRUGl4bWFwJik7Ci0gICAgICAg
IG11dGFibGUgUVBpeG1hcCBtX3BpeG1hcDsKLSAgICAgICAgbXV0YWJsZSBRUGFpbnRlciogbV9w
YWludGVyOwotI2VsaWYgUExBVEZPUk0oQ0FJUk8pCi0gICAgICAgIEltYWdlQnVmZmVyKGNhaXJv
X3N1cmZhY2VfdCopOwotICAgICAgICBtdXRhYmxlIGNhaXJvX3N1cmZhY2VfdCogbV9zdXJmYWNl
OwotI2VsaWYgUExBVEZPUk0oU0tJQSkKLSAgICAgICAgSW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6
ZSYpOwotI2VuZGlmCisKKyAgICAgICAgSW1hZ2VCdWZmZXIoc3RkOjphdXRvX3B0cjxQbGF0Zm9y
bUltYWdlQnVmZmVyPiwgY29uc3QgSW50U2l6ZSYsIHN0ZDo6YXV0b19wdHI8R3JhcGhpY3NDb250
ZXh0Pik7CiAgICAgfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogcGxhdGZvcm0v
Z3JhcGhpY3MvY2Fpcm8vSW1hZ2VCdWZmZXJDYWlyby5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZv
cm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VCdWZmZXJDYWlyby5jcHAJKHJldmlzaW9uIDM3NzYxKQor
KysgcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VCdWZmZXJDYWlyby5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ0LDM0ICs0NCwzOCBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKLWF1dG9fcHRyPEltYWdlQnVmZmVyPiBJbWFnZUJ1ZmZlcjo6Y3JlYXRl
KGNvbnN0IEludFNpemUmIHNpemUsIGJvb2wpCitQbGF0Zm9ybUltYWdlQnVmZmVyOjpQbGF0Zm9y
bUltYWdlQnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUsIGJvb2wgZ3JheVNjYWxlKQogewotICAg
IGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlKENB
SVJPX0ZPUk1BVF9BUkdCMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKLSAgICBp
ZiAoY2Fpcm9fc3VyZmFjZV9zdGF0dXMoc3VyZmFjZSkgIT0gQ0FJUk9fU1RBVFVTX1NVQ0NFU1Mp
CisgICAgbV9zdXJmYWNlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGUoQ0FJUk9fRk9STUFU
X0FSR0IzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
LndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworfQorCitQbGF0Zm9ybUltYWdlQnVmZmVyOjp+UGxh
dGZvcm1JbWFnZUJ1ZmZlcigpCit7CisgICAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95KG1fc3VyZmFj
ZSk7Cit9CisKK2F1dG9fcHRyPEltYWdlQnVmZmVyPiBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKGNvbnN0
IEludFNpemUmIHNpemUsIGJvb2wgZ3JheVNjYWxlKQoreworICAgIGF1dG9fcHRyPFBsYXRmb3Jt
SW1hZ2VCdWZmZXI+IHBsYXRmb3JtKG5ldyBQbGF0Zm9ybUltYWdlQnVmZmVyKHNpemUsIGdyYXlT
Y2FsZSkpOworICAgIGlmIChjYWlyb19zdXJmYWNlX3N0YXR1cyhwbGF0Zm9ybS0+c3VyZmFjZSgp
KSAhPSBDQUlST19TVEFUVVNfU1VDQ0VTUykKICAgICAgICAgcmV0dXJuIGF1dG9fcHRyPEltYWdl
QnVmZmVyPigpOwogCi0gICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPihuZXcgSW1hZ2VC
dWZmZXIoc3VyZmFjZSkpOworICAgIGNhaXJvX3QqIGNyID0gY2Fpcm9fY3JlYXRlKHBsYXRmb3Jt
LT5zdXJmYWNlKCkpOworICAgIGF1dG9fcHRyPEdyYXBoaWNzQ29udGV4dD4gY29udGV4dChuZXcg
R3JhcGhpY3NDb250ZXh0KGNyKSk7CisgICAgY2Fpcm9fZGVzdHJveShjcik7ICAvLyBUaGUgY29u
dGV4dCBpcyBub3cgb3duZWQgYnkgdGhlIEdyYXBoaWNzQ29udGV4dC4KKyAgICByZXR1cm4gYXV0
b19wdHI8SW1hZ2VCdWZmZXI+KG5ldyBJbWFnZUJ1ZmZlcihwbGF0Zm9ybSwgc2l6ZSwgY29udGV4
dCkpOwogfQogCi1JbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY2Fpcm9fc3VyZmFjZV90KiBzdXJm
YWNlKQotICAgIDogbV9zdXJmYWNlKHN1cmZhY2UpCitJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIo
YXV0b19wdHI8UGxhdGZvcm1JbWFnZUJ1ZmZlcj4gcGxhdGZvcm1CdWZmZXIsIGNvbnN0IEludFNp
emUmIHNpemUsIGF1dG9fcHRyPEdyYXBoaWNzQ29udGV4dD4gY29udGV4dCkKKyAgICA6IG1fcGxh
dGZvcm0ocGxhZm9ybUJ1ZmZlci5yZWxlYXNlKCkpCisgICAgLCBtX3NpemUoc2l6ZSkKKyAgICAs
IG1fY29udGV4dChjb250ZXh0LnJlbGVhc2UoKSkKIHsKLSAgICBpbnQgd2lkdGggPSBjYWlyb19p
bWFnZV9zdXJmYWNlX2dldF93aWR0aChtX3N1cmZhY2UpOwotICAgIGludCBoZWlnaHQgPSBjYWly
b19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHQobV9zdXJmYWNlKTsKLSAgICBtX3NpemUgPSBJbnRT
aXplKHdpZHRoLCBoZWlnaHQpOwotICAgIGNhaXJvX3QqIGNyID0gY2Fpcm9fY3JlYXRlKG1fc3Vy
ZmFjZSk7Ci0gICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhpY3NDb250ZXh0KGNyKSk7Ci0KLSAg
ICAvKgotICAgICAqIFRoZSBjb250ZXh0IGlzIG5vdyBvd25lZCBieSB0aGUgR3JhcGhpY3NDb250
ZXh0Ci0gICAgICovCi0gICAgY2Fpcm9fZGVzdHJveShjcik7CiB9CiAKIEltYWdlQnVmZmVyOjp+
SW1hZ2VCdWZmZXIoKQogewotICAgIGNhaXJvX3N1cmZhY2VfZGVzdHJveShtX3N1cmZhY2UpOwog
fQogCiBHcmFwaGljc0NvbnRleHQqIEltYWdlQnVmZmVyOjpjb250ZXh0KCkgY29uc3QKQEAgLTg2
LDIwICs5MCwxNyBAQCBJbWFnZSogSW1hZ2VCdWZmZXI6OmltYWdlKCkgY29uc3QKICAgICAgICAg
Ly8gR3JhcGhpY3NDb250ZXh0IG11c3QgYmUgZG9uZS4KICAgICAgICAgQVNTRVJUKGNvbnRleHQo
KSk7CiAgICAgICAgIC8vIEJpdG1hcEltYWdlIHdpbGwgcmVsZWFzZSB0aGUgcGFzc2VkIGluIHN1
cmZhY2Ugb24gZGVzdHJ1Y3Rpb24KLSAgICAgICAgbV9pbWFnZSA9IEJpdG1hcEltYWdlOjpjcmVh
dGUoY2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2UobV9zdXJmYWNlKSk7CisgICAgICAgIG1faW1hZ2Ug
PSBCaXRtYXBJbWFnZTo6Y3JlYXRlKGNhaXJvX3N1cmZhY2VfcmVmZXJlbmNlKG1fcGxhdGZvcm0t
PnN1cmZhY2UoKSkpOwogICAgIH0KICAgICByZXR1cm4gbV9pbWFnZS5nZXQoKTsKIH0KIAogUGFz
c1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEoY29uc3QgSW50UmVj
dCYgcmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIW1fc3VyZmFjZSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICBBU1NFUlQoY2Fpcm9fc3VyZmFjZV9nZXRfdHlwZShtX3N1cmZhY2UpID09IENBSVJP
X1NVUkZBQ0VfVFlQRV9JTUFHRSk7CisgICAgQVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGUo
bV9wbGF0Zm9ybS0+c3VyZmFjZSgpKSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOwogCiAg
ICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IHJlc3VsdCA9IEltYWdlRGF0YTo6Y3JlYXRlKHJlY3Qu
d2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgdW5zaWduZWQgY2hhciogZGF0YVNyYyA9IGNh
aXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGEobV9zdXJmYWNlKTsKKyAgICB1bnNpZ25lZCBjaGFy
KiBkYXRhU3JjID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0YShtX3BsYXRmb3JtLT5zdXJm
YWNlKCkpOwogICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFEc3QgPSByZXN1bHQtPmRhdGEoKS0+ZGF0
YSgpLmRhdGEoKTsKIAogICAgIGlmIChyZWN0LngoKSA8IDAgfHwgcmVjdC55KCkgPCAwIHx8IChy
ZWN0LngoKSArIHJlY3Qud2lkdGgoKSkgPiBtX3NpemUud2lkdGgoKSB8fCAocmVjdC55KCkgKyBy
ZWN0LmhlaWdodCgpKSA+IG1fc2l6ZS5oZWlnaHQoKSkKQEAgLTEyNyw3ICsxMjgsNyBAQCBQYXNz
UmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltCiAgICAgICAgIGVuZHkgPSBtX3Np
emUuaGVpZ2h0KCk7CiAgICAgaW50IG51bVJvd3MgPSBlbmR5IC0gb3JpZ2lueTsKIAotICAgIGlu
dCBzdHJpZGUgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9zdHJpZGUobV9zdXJmYWNlKTsKKyAg
ICBpbnQgc3RyaWRlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlKG1fcGxhdGZvcm0t
PnN1cmZhY2UoKSk7CiAgICAgdW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93ID0gNCAqIHJlY3Qud2lk
dGgoKTsKIAogICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RSb3dzID0gZGF0YURzdCArIGRlc3R5ICog
ZGVzdEJ5dGVzUGVyUm93ICsgZGVzdHggKiA0OwpAQCAtMTUyLDEyICsxNTMsOSBAQCBQYXNzUmVm
UHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltCiAKIHZvaWQgSW1hZ2VCdWZmZXI6OnB1
dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwg
Y29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKIHsKLSAgICBpZiAoIW1fc3VyZmFjZSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGUobV9zdXJmYWNl
KSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOworICAgIEFTU0VSVChjYWlyb19zdXJmYWNl
X2dldF90eXBlKG1fcGxhdGZvcm0tPnN1cmZhY2UoKSkgPT0gQ0FJUk9fU1VSRkFDRV9UWVBFX0lN
QUdFKTsKIAotICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFEc3QgPSBjYWlyb19pbWFnZV9zdXJmYWNl
X2dldF9kYXRhKG1fc3VyZmFjZSk7CisgICAgdW5zaWduZWQgY2hhciogZGF0YURzdCA9IGNhaXJv
X2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGEobV9wbGF0Zm9ybS0+c3VyZmFjZSgpKTsKIAogICAgIEFT
U0VSVChzb3VyY2VSZWN0LndpZHRoKCkgPiAwKTsKICAgICBBU1NFUlQoc291cmNlUmVjdC5oZWln
aHQoKSA+IDApOwpAQCAtMTg2LDcgKzE4NCw3IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdl
RGF0YShJbWFnZURhdGEKICAgICBpbnQgbnVtUm93cyA9IGVuZHkgLSBkZXN0eTsKIAogICAgIHVu
c2lnbmVkIHNyY0J5dGVzUGVyUm93ID0gNCAqIHNvdXJjZS0+d2lkdGgoKTsKLSAgICBpbnQgc3Ry
aWRlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlKG1fc3VyZmFjZSk7CisgICAgaW50
IHN0cmlkZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3N0cmlkZShtX3BsYXRmb3JtLT5zdXJm
YWNlKCkpOwogCiAgICAgdW5zaWduZWQgY2hhciogc3JjUm93cyA9IHNvdXJjZS0+ZGF0YSgpLT5k
YXRhKCkuZGF0YSgpICsgb3JpZ2lueSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CiAg
ICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsKSW5kZXg6IHBsYXRmb3JtL2dy
YXBoaWNzL2NhaXJvL1BsYXRmb3JtSW1hZ2VCdWZmZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9y
bS9ncmFwaGljcy9jYWlyby9QbGF0Zm9ybUltYWdlQnVmZmVyLmgJKHJldmlzaW9uIDApCisrKyBw
bGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QbGF0Zm9ybUltYWdlQnVmZmVyLmgJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtSW1hZ2VCdWZmZXJf
aAorI2RlZmluZSBQbGF0Zm9ybUltYWdlQnVmZmVyX2gKKworI2luY2x1ZGUgImNhaXJvLmgiCisj
aW5jbHVkZSAiSW50U2l6ZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBsYXRm
b3JtSW1hZ2VCdWZmZXIKK3sKK3B1YmxpYzoKKyAgICBQbGF0Zm9ybUltYWdlQnVmZmVyKGNvbnN0
IEludFNpemUmLCBib29sIGdyYXlTY2FsZSk7CisKKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZh
Y2UoKSB7IHJldHVybiBtX3N1cmZhY2U7IH0KKworcHJpdmF0ZToKKyAgICAvLyBXZSBvd24gdGhp
cyBwb2ludGVyLgorICAgIGNhaXJvX3N1cmZhY2VfdCogbV9zdXJmYWNlOworfTsKKworfSAgLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmICAvLyBQbGF0Zm9ybUltYWdlQnVmZmVyX2gKSW5k
ZXg6IHBsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IHBsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwCShyZXZpc2lvbiAzNzc2MSkK
KysrIHBsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00Myw1MCArNDMsNTkgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCi1hdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gSW1hZ2VCdWZmZXI6OmNyZWF0ZShjb25z
dCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSkKK1BsYXRmb3JtSW1hZ2VCdWZmZXI6OlBs
YXRmb3JtSW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUpCisg
ICAgOiBtX2RhdGEoMCkKKyAgICAsIG1fYnl0ZXNQZXJSb3coMCkKIHsKICAgICBpZiAoc2l6ZS53
aWR0aCgpIDwgMCB8fCBzaXplLmhlaWdodCgpIDwgMCkKLSAgICAgICAgcmV0dXJuIGF1dG9fcHRy
PEltYWdlQnVmZmVyPigpOwotICAgIHVuc2lnbmVkIGludCBieXRlc1BlclJvdyA9IHNpemUud2lk
dGgoKTsKKyAgICAgICAgcmV0dXJuOyAgLy8gOjpjcmVhdGUgd2lsbCBub3RpY2UgdGhlIGVycm9y
IHdoZW4gZGF0YSBpcyBudWxsLgorICAgIG1fYnl0ZXNQZXJSb3cgPSBzaXplLndpZHRoKCk7CiAg
ICAgaWYgKCFncmF5U2NhbGUpIHsKICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IG92ZXJmbG93
Ci0gICAgICAgIGlmIChieXRlc1BlclJvdyA+IDB4M0ZGRkZGRkYpCi0gICAgICAgICAgICByZXR1
cm4gYXV0b19wdHI8SW1hZ2VCdWZmZXI+KCk7Ci0gICAgICAgIGJ5dGVzUGVyUm93ICo9IDQ7Cisg
ICAgICAgIGlmIChtX2J5dGVzUGVyUm93ID4gMHgzRkZGRkZGRikKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgbV9ieXRlc1BlclJvdyAqPSA0OwogICAgIH0KIAotICAgIHZvaWQqIGltYWdl
QnVmZmVyID0gdHJ5RmFzdENhbGxvYyhzaXplLmhlaWdodCgpLCBieXRlc1BlclJvdyk7Ci0gICAg
aWYgKCFpbWFnZUJ1ZmZlcikKKyAgICBtX2RhdGEgPSB0cnlGYXN0Q2FsbG9jKHNpemUuaGVpZ2h0
KCksIG1fYnl0ZXNQZXJSb3cpOworICAgIEFTU0VSVCgocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+
KG1fZGF0YSkgJiAyKSA9PSAwKTsKK30KKworUGxhdGZvcm1JbWFnZUJ1ZmZlcjo6flBsYXRmb3Jt
SW1hZ2VCdWZmZXIoKQoreworICAgIGZhc3RGcmVlKG1fZGF0YSk7Cit9CisKK2F1dG9fcHRyPElt
YWdlQnVmZmVyPiBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKGNvbnN0IEludFNpemUmIHNpemUsIGJvb2wg
Z3JheVNjYWxlKQoreworICAgIGF1dG9fcHRyPFBsYXRmb3JtSW1hZ2VCdWZmZXI+IHBsYXRmb3Jt
KG5ldyBQbGF0Zm9ybUltYWdlQnVmZmVyKHNpemUsIGdyYXlTY2FsZSkpOworICAgIGlmICghcGxh
dGZvcm0tPmRhdGEoKSkKICAgICAgICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPigpOwog
CiAgICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9yU3BhY2UgPSBncmF5U2NhbGUgPyBDR0NvbG9yU3Bh
Y2VDcmVhdGVEZXZpY2VHcmF5KCkgOiBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAg
ICBDR0NvbnRleHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGltYWdlQnVm
ZmVyLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIDgsIGJ5dGVzUGVyUm93LAorICAgIENH
Q29udGV4dFJlZiBjZ0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUocGxhdGZvcm0tPmRh
dGEoKSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCA4LCBwbGF0Zm9ybS0+Ynl0ZXNQZXJS
b3coKSwKICAgICAgICAgY29sb3JTcGFjZSwgZ3JheVNjYWxlID8ga0NHSW1hZ2VBbHBoYU5vbmUg
OiBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZExhc3QpOwogICAgIENHQ29sb3JTcGFjZVJlbGVh
c2UoY29sb3JTcGFjZSk7Ci0gICAgaWYgKCFjZ0NvbnRleHQpIHsKLSAgICAgICAgZmFzdEZyZWUo
aW1hZ2VCdWZmZXIpOworICAgIGlmICghY2dDb250ZXh0KQogICAgICAgICByZXR1cm4gYXV0b19w
dHI8SW1hZ2VCdWZmZXI+KCk7Ci0gICAgfQogCiAgICAgYXV0b19wdHI8R3JhcGhpY3NDb250ZXh0
PiBjb250ZXh0KG5ldyBHcmFwaGljc0NvbnRleHQoY2dDb250ZXh0KSk7CiAgICAgY29udGV4dC0+
c2NhbGUoRmxvYXRTaXplKDEsIC0xKSk7CiAgICAgY29udGV4dC0+dHJhbnNsYXRlKDAsIC1zaXpl
LmhlaWdodCgpKTsKICAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29udGV4dCk7Ci0gICAgcmV0dXJu
IGF1dG9fcHRyPEltYWdlQnVmZmVyPihuZXcgSW1hZ2VCdWZmZXIoaW1hZ2VCdWZmZXIsIHNpemUs
IGNvbnRleHQpKTsKKyAgICByZXR1cm4gYXV0b19wdHI8SW1hZ2VCdWZmZXI+KG5ldyBJbWFnZUJ1
ZmZlcihwbGF0Zm9ybSwgc2l6ZSwgY29udGV4dCkpOwogfQogCiAKLUltYWdlQnVmZmVyOjpJbWFn
ZUJ1ZmZlcih2b2lkKiBpbWFnZURhdGEsIGNvbnN0IEludFNpemUmIHNpemUsIGF1dG9fcHRyPEdy
YXBoaWNzQ29udGV4dD4gY29udGV4dCkKLSAgICA6IG1fZGF0YShpbWFnZURhdGEpCitJbWFnZUJ1
ZmZlcjo6SW1hZ2VCdWZmZXIoYXV0b19wdHI8UGxhdGZvcm1JbWFnZUJ1ZmZlcj4gcGxhdGZvcm1C
dWZmZXIsIGNvbnN0IEludFNpemUmIHNpemUsIGF1dG9fcHRyPEdyYXBoaWNzQ29udGV4dD4gY29u
dGV4dCkKKyAgICA6IG1fcGxhdGZvcm0ocGxhdGZvcm1CdWZmZXIucmVsZWFzZSgpKQogICAgICwg
bV9zaXplKHNpemUpCiAgICAgLCBtX2NvbnRleHQoY29udGV4dC5yZWxlYXNlKCkpCiB7Ci0gICAg
QVNTRVJUKChyZWludGVycHJldF9jYXN0PHNpemVfdD4oaW1hZ2VEYXRhKSAmIDIpID09IDApOwog
fQogCiBJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKCkKIHsKLSAgICBmYXN0RnJlZShtX2RhdGEp
OwogfQogCiBHcmFwaGljc0NvbnRleHQqIEltYWdlQnVmZmVyOjpjb250ZXh0KCkgY29uc3QKQEAg
LTEwOSw5ICsxMTgsNiBAQCBJbWFnZSogSW1hZ2VCdWZmZXI6OmltYWdlKCkgY29uc3QKIAogUGFz
c1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEoY29uc3QgSW50UmVj
dCYgcmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIW1fZGF0YSkKLSAgICAgICAgcmV0dXJuIDA7Ci0K
ICAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpjcmVhdGUocmVj
dC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKICAgICB1bnNpZ25lZCBjaGFyKiBkYXRhID0gcmVz
dWx0LT5kYXRhKCktPmRhdGEoKS5kYXRhKCk7CiAKQEAgLTE0Myw3ICsxNDksOCBAQCBQYXNzUmVm
UHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltCiAgICAgdW5zaWduZWQgc3JjQnl0ZXNQ
ZXJSb3cgPSA0ICogbV9zaXplLndpZHRoKCk7CiAgICAgdW5zaWduZWQgZGVzdEJ5dGVzUGVyUm93
ID0gNCAqIHJlY3Qud2lkdGgoKTsKIAotICAgIHVuc2lnbmVkIGNoYXIqIHNyY1Jvd3MgPSByZWlu
dGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2RhdGEpICsgb3JpZ2lueSAqIHNyY0J5dGVz
UGVyUm93ICsgb3JpZ2lueCAqIDQ7CisgICAgLy8gOjpjcmVhdGUgZW5zdXJlcyB0aGF0IGFsbCBJ
bWFnZUJ1ZmZlcnMgaGF2ZSB2YWxpZCBkYXRhLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0
IGhlcmUuCisgICAgdW5zaWduZWQgY2hhciogc3JjUm93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5z
aWduZWQgY2hhcio+KG1fcGxhdGZvcm0tPmRhdGEoKSkgKyBvcmlnaW55ICogc3JjQnl0ZXNQZXJS
b3cgKyBvcmlnaW54ICogNDsKICAgICB1bnNpZ25lZCBjaGFyKiBkZXN0Um93cyA9IGRhdGEgKyBk
ZXN0eSAqIGRlc3RCeXRlc1BlclJvdyArIGRlc3R4ICogNDsKICAgICBmb3IgKGludCB5ID0gMDsg
eSA8IG51bVJvd3M7ICsreSkgewogICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG51bUNvbHVt
bnM7IHgrKykgewpAQCAtMTk0LDcgKzIwMSw3IEBAIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdl
RGF0YShJbWFnZURhdGEKICAgICB1bnNpZ25lZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogbV9zaXpl
LndpZHRoKCk7CiAKICAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gc291cmNlLT5kYXRhKCkt
PmRhdGEoKS5kYXRhKCkgKyBvcmlnaW55ICogc3JjQnl0ZXNQZXJSb3cgKyBvcmlnaW54ICogNDsK
LSAgICB1bnNpZ25lZCBjaGFyKiBkZXN0Um93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQg
Y2hhcio+KG1fZGF0YSkgKyBkZXN0eSAqIGRlc3RCeXRlc1BlclJvdyArIGRlc3R4ICogNDsKKyAg
ICB1bnNpZ25lZCBjaGFyKiBkZXN0Um93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hh
cio+KG1fcGxhdGZvcm0tPmRhdGEoKSkgKyBkZXN0eSAqIGRlc3RCeXRlc1BlclJvdyArIGRlc3R4
ICogNDsKICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG51bVJvd3M7ICsreSkgewogICAgICAgICBm
b3IgKGludCB4ID0gMDsgeCA8IG51bUNvbHVtbnM7IHgrKykgewogICAgICAgICAgICAgaW50IGJh
c2V4ID0geCAqIDQ7CkluZGV4OiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9QbGF0Zm9ybUltYWdlQnVm
ZmVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGxhdGZvcm1JbWFnZUJ1
ZmZlci5oCShyZXZpc2lvbiAwKQorKysgcGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGxhdGZvcm1JbWFn
ZUJ1ZmZlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBQbGF0Zm9ybUltYWdlQnVmZmVyX2gKKyNkZWZpbmUgUGxhdGZvcm1JbWFnZUJ1ZmZlcl9oCisK
KyNpbmNsdWRlICJJbnRTaXplLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGxh
dGZvcm1JbWFnZUJ1ZmZlcgoreworcHVibGljOgorICAgIFBsYXRmb3JtSW1hZ2VCdWZmZXIoY29u
c3QgSW50U2l6ZSYsIGJvb2wgZ3JheVNjYWxlKTsKKyAgICB+UGxhdGZvcm1JbWFnZUJ1ZmZlcigp
OworCisgICAgLy8gQmFja2luZyBzdG9yZSBmb3IgdGhlIGJpdG1hcC4gVGhpcyBtYXkgYmUgbnVs
bCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQuCisgICAgdm9pZCogZGF0YSgpIHsgcmV0dXJuIG1f
ZGF0YTsgfQorCisgICAgdW5zaWduZWQgaW50IGJ5dGVzUGVyUm93KCkgY29uc3QgeyByZXR1cm4g
bV9ieXRlc1BlclJvdzsgfQorCitwcml2YXRlOgorICAgIC8vIE93bmVkIGJ5IHRoaXMgY2xhc3Mu
CisgICAgdm9pZCogbV9kYXRhOworCisgICAgdW5zaWduZWQgaW50IG1fYnl0ZXNQZXJSb3c7Cit9
OworCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIFBsYXRmb3JtSW1hZ2VC
dWZmZXJfaApJbmRleDogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAJKHJldmlz
aW9uIDM3NzYxKQorKysgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQxLDI0ICs0MSwzNCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LXN0ZDo6YXV0b19wdHI8SW1hZ2VCdWZmZXI+IEltYWdlQnVmZmVyOjpjcmVhdGUoY29uc3QgSW50
U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUpCitQbGF0Zm9ybUltYWdlQnVmZmVyOjpQbGF0Zm9y
bUltYWdlQnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUsIGJvb2wgZ3JheVNjYWxlKQorICAgIDog
bV9waXhtYXAoc2l6ZSkKIHsKLSAgICBRUGl4bWFwIHB4KHNpemUpOwogICAgIHB4LmZpbGwoUUNv
bG9yKFF0Ojp0cmFuc3BhcmVudCkpOwotICAgIHJldHVybiBzdGQ6OmF1dG9fcHRyPEltYWdlQnVm
ZmVyPihuZXcgSW1hZ2VCdWZmZXIocHgpKTsKKyAgICBtX3BhaW50ZXIgPSBuZXcgUVBhaW50ZXIo
Jm1fcGl4bWFwKTsKIH0KIAotSW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKGNvbnN0IFFQaXhtYXAm
IHB4KQotICAgIDogbV9waXhtYXAocHgpLAotICAgICAgbV9wYWludGVyKDApCitQbGF0Zm9ybUlt
YWdlQnVmZmVyOjp+UGxhdGZvcm1JbWFnZUJ1ZmZlcigpCit7CisgICAgZGVsZXRlIG1fcGFpbnRl
cjsKK30KKworc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gSW1hZ2VCdWZmZXI6OmNyZWF0ZShj
b25zdCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSkKK3sKKyAgICBhdXRvX3B0cjxQbGF0
Zm9ybUltYWdlQnVmZmVyPiBwbGF0Zm9ybShuZXcgUGxhdGZvcm1JbWFnZUJ1ZmZlcihzaXplLCBn
cmF5U2NhbGUpKTsKKyAgICBhdXRvX3B0cjxHcmFwaGljc0NvbnRleHQ+IGNvbnRleHQobmV3IEdy
YXBoaWNzQ29udGV4dChwbGF0Zm9ybS5wYWludGVyKCkpKTsKKyAgICByZXR1cm4gc3RkOjphdXRv
X3B0cjxJbWFnZUJ1ZmZlcj4obmV3IEltYWdlQnVmZmVyKHBsYXRmb3JtLCBzaXplLCBjb250ZXh0
KSk7Cit9CisKK0ltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihhdXRvX3B0cjxQbGF0Zm9ybUltYWdl
QnVmZmVyPiBwbGF0Zm9ybUJ1ZmZlciwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgYXV0b19wdHI8R3Jh
cGhpY3NDb250ZXh0PiBjb250ZXh0KQorICAgIDogbV9wbGF0Zm9ybShwbGFmb3JtQnVmZmVyLnJl
bGVhc2UoKSkKKyAgICAsIG1fc2l6ZShzaXplKQorICAgICwgbV9jb250ZXh0KGNvbnRleHQucmVs
ZWFzZSgpKQogewotICAgIG1fcGFpbnRlciA9IG5ldyBRUGFpbnRlcigmbV9waXhtYXApOwotICAg
IG1fY29udGV4dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dChtX3BhaW50ZXIpKTsKIH0KIAogSW1h
Z2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigpCiB7Ci0gICAgZGVsZXRlIG1fcGFpbnRlcjsKIH0KIAog
R3JhcGhpY3NDb250ZXh0KiBJbWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0CkluZGV4OiBwbGF0
Zm9ybS9ncmFwaGljcy9xdC9QbGF0Zm9ybUltYWdlQnVmZmVyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxh
dGZvcm0vZ3JhcGhpY3MvcXQvUGxhdGZvcm1JbWFnZUJ1ZmZlci5oCShyZXZpc2lvbiAwKQorKysg
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvUGxhdGZvcm1JbWFnZUJ1ZmZlci5oCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybUltYWdlQnVmZmVyX2gK
KyNkZWZpbmUgUGxhdGZvcm1JbWFnZUJ1ZmZlcl9oCisKKyNpbmNsdWRlIDxRUGFpbnRlcj4KKyNp
bmNsdWRlIDxRUGl4bWFwPgorCisjaW5jbHVkZSAiSW50U2l6ZS5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIFBsYXRmb3JtSW1hZ2VCdWZmZXIKK3sKK3B1YmxpYzoKKyAgICBQbGF0
Zm9ybUltYWdlQnVmZmVyKGNvbnN0IEludFNpemUmLCBib29sIGdyYXlTY2FsZSk7CisKKyAgICBR
UGl4bWFwJiBwaXhtYXAoKSB7IHJldHVybiBtX3BpeG1hcDsgfQorICAgIFFQYWludGVyIHBhaW50
ZXIoKSB7IHJldHVybiBtX3BhaW50ZXI7IH0KKworcHJpdmF0ZToKKyAgICBRUGl4bWFwIG1fcGl4
bWFwOworICAgIFFQYWludGVyKiBtX3BhaW50ZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgIC8vIFBsYXRmb3JtSW1hZ2VCdWZmZXJfaAo=
</data>
<flag name="review"
          id="11211"
          type_id="1"
          status="-"
          setter="sam"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24624</attachid>
            <date>2008-10-23 15:41:46 -0700</date>
            <delta_ts>2008-10-28 08:39:09 -0700</delta_ts>
            <desc>Patch v2</desc>
            <filename>imagebuffer.diff</filename>
            <type>text/plain</type>
            <size>20397</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDM3Nzk1
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDEgQEAKKzIwMDgtMTAt
MjIgIEJyZXR0IFdpbHNvbiAgPGJyZXR0d0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVtb3ZlIHBsYXRmb3JtIGlmZGVmcyBp
biBJbWFnZUJ1ZmZlci5oIGJ5IG1vdmluZyBwbGF0Zm9ybSBzcGVjaWZpYyBjb2RlCisgICAgICAg
IGludG8gYSBuZXcgUGxhdGZvcm1JbWFnZUJ1ZmZlciBjbGFzcy4gTW92ZSB0aGUgc3RhdGljIGNy
ZWF0ZSBmdW5jdGlvbgorICAgICAgICBpbnRvIHRoZSBoZWFkZXIgYmVjYXVzZSBpdCBjYW4gYmUg
Y3Jvc3MtcGxhdGZvcm0uIEluaXRpYWxpemF0aW9uIG5vdworICAgICAgICBoYXBwZW5zIGluIHRo
ZSBjdW5zdHJ1Y3RvciB3aGljaCBzZXRzIGEgZmxhZyB0aGF0IGNyZWF0ZSB1c2VzIHRvIGtub3cK
KyAgICAgICAgd2hldGhlciBpdCBzaG91bGQgcmV0dXJuIG51bGwgb3Igbm90LiBJIGFsc28gbWFk
ZSBwYXNzaW5nIG9mIEludFNpemUKKyAgICAgICAgbW9yZSBjb25zaXN0ZW50IChhbHdheXMgYnkg
cmVmZXJlbmNlKS4KKworICAgICAgICAqIENoYW5nZUxvZzoKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9JbWFnZUJ1ZmZlci5oOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OnNp
emUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fpcm8u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6UGxhdGZvcm1JbWFnZUJ1ZmZlcjo6UGxhdGZvcm1JbWFn
ZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Y3JlYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVm
ZmVyOjppbWFnZSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL1BsYXRmb3JtSW1hZ2VCdWZmZXIuaDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDRy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpQbGF0Zm9ybUltYWdlQnVmZmVyOjpQbGF0Zm9ybUltYWdlQnVmZmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6SW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVm
ZmVyOjp+SW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmdldElt
YWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9QbGF0Zm9ybUltYWdlQnVmZmVyLmg6IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlQnVmZmVyUXQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6UGxhdGZvcm1JbWFnZUJ1ZmZlcjo6UGxhdGZvcm1JbWFnZUJ1ZmZl
cik6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Y3JlYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpJbWFn
ZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Q
bGF0Zm9ybUltYWdlQnVmZmVyLmg6IEFkZGVkLgorCiAyMDA4LTEwLTIyICBCcmFkeSBFaWRzb24g
IDxiZWlkc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIFJvYmVuCklu
ZGV4OiBwbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRm
b3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyLmgJKHJldmlzaW9uIDM3NzYxKQorKysgcGxhdGZvcm0v
Z3JhcGhpY3MvSW1hZ2VCdWZmZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjksMTQgKzI5LDExIEBA
CiAKICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIkludFNpemUuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybUltYWdlQnVmZmVyLmgiCiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgogI2luY2x1ZGUg
PHd0Zi9QYXNzUmVmUHRyLmg+CiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaWYgUExBVEZPUk0oU0tJ
QSkKLWNsYXNzIFNrQml0bWFwOwotI2VuZGlmCi0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAg
IGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKQEAgLTQ3LDEwICs0NCwxOCBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKICAgICBjbGFzcyBJbWFnZUJ1ZmZlciA6IE5vbmNvcHlhYmxlIHsKICAgICBwdWJs
aWM6Ci0gICAgICAgIHN0YXRpYyBzdGQ6OmF1dG9fcHRyPEltYWdlQnVmZmVyPiBjcmVhdGUoY29u
c3QgSW50U2l6ZSYsIGJvb2wgZ3JheVNjYWxlKTsKKyAgICAgICAgLy8gV2lsbCByZXR1cm4gYSBu
dWxsIHBvaW50ZXIgb24gYWxsb2NhdGlvbiBmYWlsdXJlLgorICAgICAgICBzdGF0aWMgc3RkOjph
dXRvX3B0cjxJbWFnZUJ1ZmZlcj4gY3JlYXRlKGNvbnN0IEludFNpemUmIHNpemUsIGJvb2wgZ3Jh
eVNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmF1dG9fcHRyPEltYWdlQnVmZmVy
PiBidWYobmV3IEltYWdlQnVmZmVyKHNpemUsIGdyYXlTY2FsZSkpOworICAgICAgICAgICAgaWYg
KGJ1Zi0+bV9pbml0aWFsaXplZCkKKyAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAg
ICAgIHJldHVybiBzdGQ6OmF1dG9fcHRyPEltYWdlQnVmZmVyPigpOworICAgICAgICB9CisKICAg
ICAgICAgfkltYWdlQnVmZmVyKCk7CiAKLSAgICAgICAgSW50U2l6ZSBzaXplKCkgY29uc3QgeyBy
ZXR1cm4gbV9zaXplOyB9CisgICAgICAgIGNvbnN0IEludFNpemUmIHNpemUoKSBjb25zdCB7IHJl
dHVybiBtX3NpemU7IH0KICAgICAgICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0KCkgY29uc3Q7
CiAKICAgICAgICAgSW1hZ2UqIGltYWdlKCkgY29uc3Q7CkBAIC02MywyNCArNjgsMTggQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBTdHJpbmcgdG9EYXRhVVJMKGNvbnN0IFN0cmluZyYg
bWltZVR5cGUpIGNvbnN0OwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgdm9pZCogbV9kYXRhOwot
ICAgICAgICBJbnRTaXplIG1fc2l6ZTsKKyAgICAgICAgUGxhdGZvcm1JbWFnZUJ1ZmZlciBtX3Bs
YXRmb3JtOwogCisgICAgICAgIC8vIFRoZSBJbWFnZUJ1ZmZlciBjb25zdHJ1Y3RvciBzaG91bGQg
c2V0IHRoaXMgdG8gdHJ1ZSBpZiBjb25zdHJ1Y3Rpb24KKyAgICAgICAgLy8gc3VjY2VlZGVkLCBh
bmQgY2hlY2sgdGhlIHZhbHVlIGluIGNyZWF0ZSgpIHRvIHNlZSBpZiB0aGUgb2JqZWN0IG9yCisg
ICAgICAgIC8vIGEgbnVsbCBwb2ludGVyIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgICAgYm9v
bCBtX2luaXRpYWxpemVkOworCisgICAgICAgIEludFNpemUgbV9zaXplOwogICAgICAgICBPd25Q
dHI8R3JhcGhpY3NDb250ZXh0PiBtX2NvbnRleHQ7CiAgICAgICAgIG11dGFibGUgUmVmUHRyPElt
YWdlPiBtX2ltYWdlOwotICAgIAotI2lmIFBMQVRGT1JNKENHKQotICAgICAgICBJbWFnZUJ1ZmZl
cih2b2lkKiBpbWFnZURhdGEsIGNvbnN0IEludFNpemUmLCBzdGQ6OmF1dG9fcHRyPEdyYXBoaWNz
Q29udGV4dD4pOwotI2VsaWYgUExBVEZPUk0oUVQpCi0gICAgICAgIEltYWdlQnVmZmVyKGNvbnN0
IFFQaXhtYXAmKTsKLSAgICAgICAgbXV0YWJsZSBRUGl4bWFwIG1fcGl4bWFwOwotICAgICAgICBt
dXRhYmxlIFFQYWludGVyKiBtX3BhaW50ZXI7Ci0jZWxpZiBQTEFURk9STShDQUlSTykKLSAgICAg
ICAgSW1hZ2VCdWZmZXIoY2Fpcm9fc3VyZmFjZV90Kik7Ci0gICAgICAgIG11dGFibGUgY2Fpcm9f
c3VyZmFjZV90KiBtX3N1cmZhY2U7Ci0jZWxpZiBQTEFURk9STShTS0lBKQotICAgICAgICBJbWFn
ZUJ1ZmZlcihjb25zdCBJbnRTaXplJik7Ci0jZW5kaWYKKworICAgICAgICBJbWFnZUJ1ZmZlcihj
b25zdCBJbnRTaXplJiwgYm9vbCBncmF5U2NhbGUpOwogICAgIH07CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fpcm8u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fp
cm8uY3BwCShyZXZpc2lvbiAzNzc2MSkKKysrIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdl
QnVmZmVyQ2Fpcm8uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCwzNCArNDQsMzEgQEAgdXNpbmcg
bmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1hdXRvX3B0cjxJbWFnZUJ1
ZmZlcj4gSW1hZ2VCdWZmZXI6OmNyZWF0ZShjb25zdCBJbnRTaXplJiBzaXplLCBib29sKQorUGxh
dGZvcm1JbWFnZUJ1ZmZlcjo6UGxhdGZvcm1JbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJiBzaXpl
KQorICAgIDogbV9zdXJmYWNlKDApCiB7Ci0gICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0g
Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGUoQ0FJUk9fRk9STUFUX0FSR0IzMiwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLndp
ZHRoKCksIHNpemUuaGVpZ2h0KCkpOwotICAgIGlmIChjYWlyb19zdXJmYWNlX3N0YXR1cyhzdXJm
YWNlKSAhPSBDQUlST19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIGF1dG9fcHRyPElt
YWdlQnVmZmVyPigpOwotCi0gICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPihuZXcgSW1h
Z2VCdWZmZXIoc3VyZmFjZSkpOwogfQogCi1JbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY2Fpcm9f
c3VyZmFjZV90KiBzdXJmYWNlKQotICAgIDogbV9zdXJmYWNlKHN1cmZhY2UpCitJbWFnZUJ1ZmZl
cjo6SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUpCisgICAg
OiBtX3BsYXRmb3JtKHNpemUpCisgICAgLCBtX2luaXRpYWxpemVkKGZhbHNlKQorICAgICwgbV9z
aXplKHNpemUpCiB7Ci0gICAgaW50IHdpZHRoID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lk
dGgobV9zdXJmYWNlKTsKLSAgICBpbnQgaGVpZ2h0ID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRf
aGVpZ2h0KG1fc3VyZmFjZSk7Ci0gICAgbV9zaXplID0gSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTsK
LSAgICBjYWlyb190KiBjciA9IGNhaXJvX2NyZWF0ZShtX3N1cmZhY2UpOwotICAgIG1fY29udGV4
dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dChjcikpOworICAgIG1fcGxhdGZvcm0ubV9zdXJmYWNl
ID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGUoQ0FJUk9fRk9STUFUX0FSR0IzMiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUud2lk
dGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNpemUuaGVpZ2h0KCkpOworICAgIGlmIChjYWlyb19zdXJmYWNlX3N0YXR1cyhtX3BsYXRm
b3JtLm1fc3VyZmFjZSkgIT0gQ0FJUk9fU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsg
IC8vIGNyZWF0ZSB3aWxsIG5vdGljZSB3ZSBkaWRuJ3Qgc2V0IG1faW5pdGlhbGl6ZWQgYW5kIGZh
aWwuCiAKLSAgICAvKgotICAgICAqIFRoZSBjb250ZXh0IGlzIG5vdyBvd25lZCBieSB0aGUgR3Jh
cGhpY3NDb250ZXh0Ci0gICAgICovCi0gICAgY2Fpcm9fZGVzdHJveShjcik7CisgICAgY2Fpcm9f
dCogY3IgPSBjYWlyb19jcmVhdGUobV9wbGF0Zm9ybS5tX3N1cmZhY2UpOworICAgIG1fY29udGV4
dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dChjcikpOworICAgIGNhaXJvX2Rlc3Ryb3koY3IpOyAg
Ly8gVGhlIGNvbnRleHQgaXMgbm93IG93bmVkIGJ5IHRoZSBHcmFwaGljc0NvbnRleHQuCisgICAg
bV9pbml0aWFsemVkID0gdHJ1ZTsKIH0KIAogSW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigpCiB7
Ci0gICAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95KG1fc3VyZmFjZSk7CisgICAgY2Fpcm9fc3VyZmFj
ZV9kZXN0cm95KG1fcGxhdGZvcm0ubV9zdXJmYWNlKTsKIH0KIAogR3JhcGhpY3NDb250ZXh0KiBJ
bWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0CkBAIC04NiwyMCArODMsMTcgQEAgSW1hZ2UqIElt
YWdlQnVmZmVyOjppbWFnZSgpIGNvbnN0CiAgICAgICAgIC8vIEdyYXBoaWNzQ29udGV4dCBtdXN0
IGJlIGRvbmUuCiAgICAgICAgIEFTU0VSVChjb250ZXh0KCkpOwogICAgICAgICAvLyBCaXRtYXBJ
bWFnZSB3aWxsIHJlbGVhc2UgdGhlIHBhc3NlZCBpbiBzdXJmYWNlIG9uIGRlc3RydWN0aW9uCi0g
ICAgICAgIG1faW1hZ2UgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKGNhaXJvX3N1cmZhY2VfcmVmZXJl
bmNlKG1fc3VyZmFjZSkpOworICAgICAgICBtX2ltYWdlID0gQml0bWFwSW1hZ2U6OmNyZWF0ZShj
YWlyb19zdXJmYWNlX3JlZmVyZW5jZShtX3BsYXRmb3JtLm1fc3VyZmFjZSkpOwogICAgIH0KICAg
ICByZXR1cm4gbV9pbWFnZS5nZXQoKTsKIH0KIAogUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdl
QnVmZmVyOjpnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKIHsKLSAgICBp
ZiAoIW1fc3VyZmFjZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBBU1NFUlQoY2Fpcm9fc3Vy
ZmFjZV9nZXRfdHlwZShtX3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9JTUFHRSk7Cisg
ICAgQVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGUobV9wbGF0Zm9ybS5tX3N1cmZhY2UpID09
IENBSVJPX1NVUkZBQ0VfVFlQRV9JTUFHRSk7CiAKICAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4g
cmVzdWx0ID0gSW1hZ2VEYXRhOjpjcmVhdGUocmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsK
LSAgICB1bnNpZ25lZCBjaGFyKiBkYXRhU3JjID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0
YShtX3N1cmZhY2UpOworICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFTcmMgPSBjYWlyb19pbWFnZV9z
dXJmYWNlX2dldF9kYXRhKG1fcGxhdGZvcm0ubV9zdXJmYWNlKTsKICAgICB1bnNpZ25lZCBjaGFy
KiBkYXRhRHN0ID0gcmVzdWx0LT5kYXRhKCktPmRhdGEoKS5kYXRhKCk7CiAKICAgICBpZiAocmVj
dC54KCkgPCAwIHx8IHJlY3QueSgpIDwgMCB8fCAocmVjdC54KCkgKyByZWN0LndpZHRoKCkpID4g
bV9zaXplLndpZHRoKCkgfHwgKHJlY3QueSgpICsgcmVjdC5oZWlnaHQoKSkgPiBtX3NpemUuaGVp
Z2h0KCkpCkBAIC0xMjcsNyArMTIxLDcgQEAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVm
ZmVyOjpnZXRJbQogICAgICAgICBlbmR5ID0gbV9zaXplLmhlaWdodCgpOwogICAgIGludCBudW1S
b3dzID0gZW5keSAtIG9yaWdpbnk7CiAKLSAgICBpbnQgc3RyaWRlID0gY2Fpcm9faW1hZ2Vfc3Vy
ZmFjZV9nZXRfc3RyaWRlKG1fc3VyZmFjZSk7CisgICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdl
X3N1cmZhY2VfZ2V0X3N0cmlkZShtX3BsYXRmb3JtLm1fc3VyZmFjZSk7CiAgICAgdW5zaWduZWQg
ZGVzdEJ5dGVzUGVyUm93ID0gNCAqIHJlY3Qud2lkdGgoKTsKIAogICAgIHVuc2lnbmVkIGNoYXIq
IGRlc3RSb3dzID0gZGF0YURzdCArIGRlc3R5ICogZGVzdEJ5dGVzUGVyUm93ICsgZGVzdHggKiA0
OwpAQCAtMTUyLDEyICsxNDYsOSBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6
OmdldEltCiAKIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJj
ZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkK
IHsKLSAgICBpZiAoIW1fc3VyZmFjZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKGNh
aXJvX3N1cmZhY2VfZ2V0X3R5cGUobV9zdXJmYWNlKSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1B
R0UpOworICAgIEFTU0VSVChjYWlyb19zdXJmYWNlX2dldF90eXBlKG1fcGxhdGZvcm0ubV9zdXJm
YWNlKSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOwogCi0gICAgdW5zaWduZWQgY2hhciog
ZGF0YURzdCA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGEobV9zdXJmYWNlKTsKKyAgICB1
bnNpZ25lZCBjaGFyKiBkYXRhRHN0ID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0YShtX3Bs
YXRmb3JtLm1fc3VyZmFjZSk7CiAKICAgICBBU1NFUlQoc291cmNlUmVjdC53aWR0aCgpID4gMCk7
CiAgICAgQVNTRVJUKHNvdXJjZVJlY3QuaGVpZ2h0KCkgPiAwKTsKQEAgLTE4Niw3ICsxNzcsNyBA
QCB2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhCiAgICAgaW50IG51bVJv
d3MgPSBlbmR5IC0gZGVzdHk7CiAKICAgICB1bnNpZ25lZCBzcmNCeXRlc1BlclJvdyA9IDQgKiBz
b3VyY2UtPndpZHRoKCk7Ci0gICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0
X3N0cmlkZShtX3N1cmZhY2UpOworICAgIGludCBzdHJpZGUgPSBjYWlyb19pbWFnZV9zdXJmYWNl
X2dldF9zdHJpZGUobV9wbGF0Zm9ybS5tX3N1cmZhY2UpOwogCiAgICAgdW5zaWduZWQgY2hhciog
c3JjUm93cyA9IHNvdXJjZS0+ZGF0YSgpLT5kYXRhKCkuZGF0YSgpICsgb3JpZ2lueSAqIHNyY0J5
dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CiAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1Sb3dz
OyArK3kpIHsKSW5kZXg6IHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL1BsYXRmb3JtSW1hZ2VCdWZm
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QbGF0Zm9ybUltYWdl
QnVmZmVyLmgJKHJldmlzaW9uIDApCisrKyBwbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QbGF0Zm9y
bUltYWdlQnVmZmVyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIFBsYXRmb3JtSW1hZ2VCdWZmZXJfaAorI2RlZmluZSBQbGF0Zm9ybUltYWdlQnVmZmVy
X2gKKworI2luY2x1ZGUgImNhaXJvLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
SW50U2l6ZTsKKworY2xhc3MgUGxhdGZvcm1JbWFnZUJ1ZmZlciB7CitwdWJsaWM6CisgICAgUGxh
dGZvcm1JbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJik7CisKKyAgICBjYWlyb19zdXJmYWNlX3Qq
IG1fc3VyZmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8g
UGxhdGZvcm1JbWFnZUJ1ZmZlcl9oCkluZGV4OiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1
ZmZlckNHLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZl
ckNHLmNwcAkocmV2aXNpb24gMzc3NjEpCisrKyBwbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1
ZmZlckNHLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDMsNTAgKzQzLDQ3IEBAIHVzaW5nIG5hbWVz
cGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotYXV0b19wdHI8SW1hZ2VCdWZmZXI+
IEltYWdlQnVmZmVyOjpjcmVhdGUoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUp
CitQbGF0Zm9ybUltYWdlQnVmZmVyOjpQbGF0Zm9ybUltYWdlQnVmZmVyKGNvbnN0IEludFNpemUm
KQorICAgIDogbV9kYXRhKDApCiB7Cit9CisKK0ltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25z
dCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSkKKyAgICA6IG1fcGxhdGZvcm0oc2l6ZSkK
KyAgICAsIG1faW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgLCBtX3NpemUoc2l6ZSkKK3sKKyAgICB1
bnNpZ25lZCBieXRlc1BlclJvdzsKICAgICBpZiAoc2l6ZS53aWR0aCgpIDwgMCB8fCBzaXplLmhl
aWdodCgpIDwgMCkKLSAgICAgICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPigpOwotICAg
IHVuc2lnbmVkIGludCBieXRlc1BlclJvdyA9IHNpemUud2lkdGgoKTsKKyAgICAgICAgcmV0dXJu
OyAgLy8gUmV0dXJuaW5nIHdpdGhvdXQgc2V0dGluZyBtX2luaXRpYWxpemVkIHdpbGwgc2lnbmFs
IHRoZSBlcnJvci4KKyAgICBieXRlc1BlclJvdyA9IHNpemUud2lkdGgoKTsKICAgICBpZiAoIWdy
YXlTY2FsZSkgewogICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3Qgb3ZlcmZsb3cKICAgICAgICAg
aWYgKGJ5dGVzUGVyUm93ID4gMHgzRkZGRkZGRikKLSAgICAgICAgICAgIHJldHVybiBhdXRvX3B0
cjxJbWFnZUJ1ZmZlcj4oKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgYnl0ZXNQZXJS
b3cgKj0gNDsKICAgICB9CiAKLSAgICB2b2lkKiBpbWFnZUJ1ZmZlciA9IHRyeUZhc3RDYWxsb2Mo
c2l6ZS5oZWlnaHQoKSwgYnl0ZXNQZXJSb3cpOwotICAgIGlmICghaW1hZ2VCdWZmZXIpCi0gICAg
ICAgIHJldHVybiBhdXRvX3B0cjxJbWFnZUJ1ZmZlcj4oKTsKKyAgICBtX3BsYXRmb3JtLm1fZGF0
YSA9IHRyeUZhc3RDYWxsb2Moc2l6ZS5oZWlnaHQoKSwgYnl0ZXNQZXJSb3cpOworICAgIEFTU0VS
VCgocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KG1fcGxhdGZvcm0ubV9kYXRhKSAmIDIpID09IDAp
OwogCiAgICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9yU3BhY2UgPSBncmF5U2NhbGUgPyBDR0NvbG9y
U3BhY2VDcmVhdGVEZXZpY2VHcmF5KCkgOiBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsK
LSAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGltYWdl
QnVmZmVyLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIDgsIGJ5dGVzUGVyUm93LAorICAg
IENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUobV9wbGF0Zm9y
bS5tX2RhdGEsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgOCwgYnl0ZXNQZXJSb3csCiAg
ICAgICAgIGNvbG9yU3BhY2UsIGdyYXlTY2FsZSA/IGtDR0ltYWdlQWxwaGFOb25lIDoga0NHSW1h
Z2VBbHBoYVByZW11bHRpcGxpZWRMYXN0KTsKICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGNvbG9y
U3BhY2UpOwotICAgIGlmICghY2dDb250ZXh0KSB7Ci0gICAgICAgIGZhc3RGcmVlKGltYWdlQnVm
ZmVyKTsKLSAgICAgICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPigpOwotICAgIH0KKyAg
ICBpZiAoIWNnQ29udGV4dCkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgYXV0b19wdHI8R3JhcGhp
Y3NDb250ZXh0PiBjb250ZXh0KG5ldyBHcmFwaGljc0NvbnRleHQoY2dDb250ZXh0KSk7Ci0gICAg
Y29udGV4dC0+c2NhbGUoRmxvYXRTaXplKDEsIC0xKSk7Ci0gICAgY29udGV4dC0+dHJhbnNsYXRl
KDAsIC1zaXplLmhlaWdodCgpKTsKKyAgICBtX2NvbnRleHQuc2V0KG5ldyBHcmFwaGljc0NvbnRl
eHQoY2dDb250ZXh0KSk7CisgICAgbV9jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoMSwgLTEpKTsK
KyAgICBtX2NvbnRleHQtPnRyYW5zbGF0ZSgwLCAtc2l6ZS5oZWlnaHQoKSk7CiAgICAgQ0dDb250
ZXh0UmVsZWFzZShjZ0NvbnRleHQpOwotICAgIHJldHVybiBhdXRvX3B0cjxJbWFnZUJ1ZmZlcj4o
bmV3IEltYWdlQnVmZmVyKGltYWdlQnVmZmVyLCBzaXplLCBjb250ZXh0KSk7Ci19Ci0KLQotSW1h
Z2VCdWZmZXI6OkltYWdlQnVmZmVyKHZvaWQqIGltYWdlRGF0YSwgY29uc3QgSW50U2l6ZSYgc2l6
ZSwgYXV0b19wdHI8R3JhcGhpY3NDb250ZXh0PiBjb250ZXh0KQotICAgIDogbV9kYXRhKGltYWdl
RGF0YSkKLSAgICAsIG1fc2l6ZShzaXplKQotICAgICwgbV9jb250ZXh0KGNvbnRleHQucmVsZWFz
ZSgpKQotewotICAgIEFTU0VSVCgocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGltYWdlRGF0YSkg
JiAyKSA9PSAwKTsKKyAgICBtX2luaXRpYWxpemVkID0gdHJ1ZTsKIH0KIAogSW1hZ2VCdWZmZXI6
On5JbWFnZUJ1ZmZlcigpCiB7Ci0gICAgZmFzdEZyZWUobV9kYXRhKTsKKyAgICBmYXN0RnJlZSht
X3BsYXRmb3JtLm1fZGF0YSk7CiB9CiAKIEdyYXBoaWNzQ29udGV4dCogSW1hZ2VCdWZmZXI6OmNv
bnRleHQoKSBjb25zdApAQCAtMTA5LDkgKzEwNiw2IEBAIEltYWdlKiBJbWFnZUJ1ZmZlcjo6aW1h
Z2UoKSBjb25zdAogCiBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltYWdl
RGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAogewotICAgIGlmICghbV9kYXRhKQotICAg
ICAgICByZXR1cm4gMDsKLQogICAgIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiByZXN1bHQgPSBJbWFn
ZURhdGE6OmNyZWF0ZShyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwogICAgIHVuc2lnbmVk
IGNoYXIqIGRhdGEgPSByZXN1bHQtPmRhdGEoKS0+ZGF0YSgpLmRhdGEoKTsKIApAQCAtMTQzLDcg
KzEzNyw4IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW0KICAgICB1
bnNpZ25lZCBzcmNCeXRlc1BlclJvdyA9IDQgKiBtX3NpemUud2lkdGgoKTsKICAgICB1bnNpZ25l
ZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogcmVjdC53aWR0aCgpOwogCi0gICAgdW5zaWduZWQgY2hh
ciogc3JjUm93cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KG1fZGF0YSkgKyBv
cmlnaW55ICogc3JjQnl0ZXNQZXJSb3cgKyBvcmlnaW54ICogNDsKKyAgICAvLyA6OmNyZWF0ZSBl
bnN1cmVzIHRoYXQgYWxsIEltYWdlQnVmZmVycyBoYXZlIHZhbGlkIGRhdGEsIHNvIHdlIGRvbid0
IG5lZWQgdG8gY2hlY2sgaXQgaGVyZS4KKyAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gcmVp
bnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4obV9wbGF0Zm9ybS5tX2RhdGEpICsgb3JpZ2lu
eSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CiAgICAgdW5zaWduZWQgY2hhciogZGVz
dFJvd3MgPSBkYXRhICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0eCAqIDQ7CiAgICAg
Zm9yIChpbnQgeSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsKICAgICAgICAgZm9yIChpbnQgeCA9
IDA7IHggPCBudW1Db2x1bW5zOyB4KyspIHsKQEAgLTE5NCw3ICsxODksNyBAQCB2b2lkIEltYWdl
QnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhCiAgICAgdW5zaWduZWQgZGVzdEJ5dGVzUGVy
Um93ID0gNCAqIG1fc2l6ZS53aWR0aCgpOwogCiAgICAgdW5zaWduZWQgY2hhciogc3JjUm93cyA9
IHNvdXJjZS0+ZGF0YSgpLT5kYXRhKCkuZGF0YSgpICsgb3JpZ2lueSAqIHNyY0J5dGVzUGVyUm93
ICsgb3JpZ2lueCAqIDQ7Ci0gICAgdW5zaWduZWQgY2hhciogZGVzdFJvd3MgPSByZWludGVycHJl
dF9jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2RhdGEpICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cg
KyBkZXN0eCAqIDQ7CisgICAgdW5zaWduZWQgY2hhciogZGVzdFJvd3MgPSByZWludGVycHJldF9j
YXN0PHVuc2lnbmVkIGNoYXIqPihtX3BsYXRmb3JtLm1fZGF0YSkgKyBkZXN0eSAqIGRlc3RCeXRl
c1BlclJvdyArIGRlc3R4ICogNDsKICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG51bVJvd3M7ICsr
eSkgewogICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG51bUNvbHVtbnM7IHgrKykgewogICAg
ICAgICAgICAgaW50IGJhc2V4ID0geCAqIDQ7CkluZGV4OiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9Q
bGF0Zm9ybUltYWdlQnVmZmVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vZ3JhcGhpY3MvY2cv
UGxhdGZvcm1JbWFnZUJ1ZmZlci5oCShyZXZpc2lvbiAwKQorKysgcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2cvUGxhdGZvcm1JbWFnZUJ1ZmZlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQyIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybUltYWdlQnVmZmVyX2gKKyNkZWZpbmUgUGxhdGZvcm1J
bWFnZUJ1ZmZlcl9oCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSW50U2l6ZTsKKwor
Y2xhc3MgUGxhdGZvcm1JbWFnZUJ1ZmZlciB7CitwdWJsaWM6CisgICAgUGxhdGZvcm1JbWFnZUJ1
ZmZlcihjb25zdCBJbnRTaXplJik7CisKKyAgICB2b2lkKiBtX2RhdGE7Cit9OworCit9ICAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIFBsYXRmb3JtSW1hZ2VCdWZmZXJfaApJbmRl
eDogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAJKHJldmlzaW9uIDM3NzYxKQor
KysgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQxLDI0ICs0MSwyMyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0ZDo6YXV0b19w
dHI8SW1hZ2VCdWZmZXI+IEltYWdlQnVmZmVyOjpjcmVhdGUoY29uc3QgSW50U2l6ZSYgc2l6ZSwg
Ym9vbCBncmF5U2NhbGUpCitQbGF0Zm9ybUltYWdlQnVmZmVyOjpQbGF0Zm9ybUltYWdlQnVmZmVy
KGNvbnN0IEludFNpemUmIHNpemUpCisgICAgOiBtX3BpeG1hcChzaXplKQogewotICAgIFFQaXht
YXAgcHgoc2l6ZSk7CiAgICAgcHguZmlsbChRQ29sb3IoUXQ6OnRyYW5zcGFyZW50KSk7Ci0gICAg
cmV0dXJuIHN0ZDo6YXV0b19wdHI8SW1hZ2VCdWZmZXI+KG5ldyBJbWFnZUJ1ZmZlcihweCkpOwor
ICAgIG1fcGFpbnRlci5zZXQobmV3IFFQYWludGVyKCZtX3BpeG1hcCkpOwogfQogCi1JbWFnZUJ1
ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgUVBpeG1hcCYgcHgpCi0gICAgOiBtX3BpeG1hcChweCks
Ci0gICAgICBtX3BhaW50ZXIoMCkKK0ltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRT
aXplJiBzaXplLCBib29sIGdyYXlTY2FsZSkKKyAgICA6IG1fcGxhdGZvcm0oc2l6ZSkKKyAgICAs
IG1faW5pdGlhbGl6ZWQodHJ1ZSkgIC8vIFRoaXMgY29kZSBuZXZlciBmYWlscywgc28gYWx3YXlz
IHJlcG9ydCBzdWNjZXNzIHRvIGNyZWF0ZSgpLgorICAgICwgbV9zaXplKHNpemUpCiB7Ci0gICAg
bV9wYWludGVyID0gbmV3IFFQYWludGVyKCZtX3BpeG1hcCk7Ci0gICAgbV9jb250ZXh0LnNldChu
ZXcgR3JhcGhpY3NDb250ZXh0KG1fcGFpbnRlcikpOworICAgIG1fY29udGV4dC5zZXQobmV3IEdy
YXBoaWNzQ29udGV4dChwbGF0Zm9ybS5tX3BhaW50ZXIpKTsKIH0KIAogSW1hZ2VCdWZmZXI6On5J
bWFnZUJ1ZmZlcigpCiB7Ci0gICAgZGVsZXRlIG1fcGFpbnRlcjsKIH0KIAogR3JhcGhpY3NDb250
ZXh0KiBJbWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0CkluZGV4OiBwbGF0Zm9ybS9ncmFwaGlj
cy9xdC9QbGF0Zm9ybUltYWdlQnVmZmVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvUGxhdGZvcm1JbWFnZUJ1ZmZlci5oCShyZXZpc2lvbiAwKQorKysgcGxhdGZvcm0vZ3Jh
cGhpY3MvcXQvUGxhdGZvcm1JbWFnZUJ1ZmZlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ4
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybUltYWdlQnVmZmVyX2gKKyNkZWZpbmUgUGxh
dGZvcm1JbWFnZUJ1ZmZlcl9oCisKKyNpbmNsdWRlIDxRUGFpbnRlcj4KKyNpbmNsdWRlIDxRUGl4
bWFwPgorCisjaW5jbHVkZSAiT3duUHRyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xh
c3MgSW50U2l6ZTsKKworY2xhc3MgUGxhdGZvcm1JbWFnZUJ1ZmZlciB7CitwdWJsaWM6CisgICAg
UGxhdGZvcm1JbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJik7CisKKyAgICBRUGl4bWFwIG1fcGl4
bWFwOworICAgIE93blB0cjxRUGFpbnRlcj4gbV9wYWludGVyOworfTsKKworfSAgLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmICAvLyBQbGF0Zm9ybUltYWdlQnVmZmVyX2gK
</data>
<flag name="review"
          id="11242"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24695</attachid>
            <date>2008-10-27 14:25:39 -0700</date>
            <delta_ts>2008-10-28 08:39:09 -0700</delta_ts>
            <desc>Patch v3</desc>
            <filename>imagebuffer.diff</filename>
            <type>text/plain</type>
            <size>34748</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZDNmMDY2NS4uYTQxZDQ2MCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1MiBAQAorMjAwOC0xMC0yNyAgQnJldHQgV2lsc29u
ICA8YnJldHR3QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBSZW1vdmUgcGxhdGZvcm0gaWZkZWZzIGluIEltYWdlQnVmZmVyLmgg
YnkgbW92aW5nIHBsYXRmb3JtIHNwZWNpZmljCisgICAgICAgIGNvZGUgaW50byBhIG5ldyBJbWFn
ZUJ1ZmZlckRhdGEgY2xhc3MuIFJlbW92ZSB0aGUgc3RhdGljIGNyZWF0ZQorICAgICAgICBmdW5j
dGlvbiBpbnRvIHRoZSBoZWFkZXIgYW5kIG1ha2UgdGhlIGNvbnN0cnVjdG9yIHJldHVybiB0aGUg
c3VjY2VzcworICAgICAgICBmbGFnIGFzIGFuIG91dCBwYXJhbXRlciwgSSBhbHNvIG1hZGUgcGFz
c2luZyBvZiBJbnRTaXplIG1vcmUgY29uc2lzdGVudAorICAgICAgICAoYWx3YXlzIGJ5IHJlZmVy
ZW5jZSkuCisKKyAgICAgICAgVGhpcyBhbHNvIGNoYW5nZXMgdGhlIHRleHQgbW9kZSB0byBiZSBh
YmxlIHRvIGltcGxlbWVudGVkIGJ5IFNraWEgcG9ydHMuCisKKyAgICAgICAgKiBDaGFuZ2VMb2c6
CisgICAgICAgICogaHRtbC9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpkcmF3VGV4dEludGVybmFsKToKKyAg
ICAgICAgKiBodG1sL0hUTUxDYW52YXNFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxDYW52YXNFbGVtZW50OjpjcmVhdGVJbWFnZUJ1ZmZlcik6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvR2VuZXJhdGVkSW1hZ2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R2VuZXJhdGVk
SW1hZ2U6OmRyYXdQYXR0ZXJuKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1
ZmZlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fp
cm8uY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXJEYXRhOjpJbWFnZUJ1ZmZlckRh
dGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZUJ1ZmZlckRhdGEuaDogUmVuYW1lZCBm
cm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vUGxhdGZvcm1JbWFnZUJ1ZmZlci5o
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXJEYXRhOjpJbWFnZUJ1ZmZlckRhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckRhdGEuaDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jZy9QbGF0Zm9ybUltYWdlQnVmZmVyLmguCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJEYXRhLmg6IFJlbmFtZWQgZnJvbSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3F0L1BsYXRmb3JtSW1hZ2VCdWZmZXIuaC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1ZmZlclF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oklt
YWdlQnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdl
QnVmZmVyOjpJbWFnZUJ1ZmZlcik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvSW1h
Z2VCdWZmZXJEYXRhLmg6IFJlbmFtZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nn
L1BsYXRmb3JtSW1hZ2VCdWZmZXIuaC4KKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyRGF0
YTo6SW1hZ2VCdWZmZXJEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93eC9JbWFn
ZUJ1ZmZlcld4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZl
cik6CisgICAgICAgICogcGxhdGZvcm0vbWFjL1Njcm9sbGJhclRoZW1lTWFjLm1tOgorICAgICAg
ICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVNYWM6OnBhaW50KToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyQm94LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJveDo6cGFpbnRGaWxs
TGF5ZXJFeHRlbmRlZCk6CisgICAgICAgICogc3ZnL1NWR01hc2tFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlNWR01hc2tFbGVtZW50OjpkcmF3TWFza2VyQ29udGVudCk6CisgICAgICAg
ICogc3ZnL1NWR1BhdHRlcm5FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhdHRl
cm5FbGVtZW50OjpidWlsZFBhdHRlcm4pOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9jZy9TVkdQ
YWludFNlcnZlckdyYWRpZW50Q2cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUGFpbnRTZXJ2
ZXJHcmFkaWVudDo6c2V0dXApOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9jZy9TVkdSZXNvdXJj
ZU1hc2tlckNnLm1tOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUmVzb3VyY2VNYXNrZXI6OmFwcGx5
TWFzayk6CisKIDIwMDgtMTAtMjQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9odG1sL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAgYi9XZWJDb3JlL2h0bWwvQ2FudmFz
UmVuZGVyaW5nQ29udGV4dDJELmNwcAppbmRleCA0M2ZjN2UwLi40YTA2MDhiIDEwMDY0NAotLS0g
YS9XZWJDb3JlL2h0bWwvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcAorKysgYi9XZWJDb3Jl
L2h0bWwvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcApAQCAtMTMyMCw5ICsxMzIwLDEyIEBA
IHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpkcmF3VGV4dEludGVybmFsKGNvbnN0IFN0
cmluZyYgdGV4dCwgZmxvYXQgeCwgZmxvCiAgICAgaWYgKGRyYXdTdHlsZS0+Y2FudmFzR3JhZGll
bnQoKSB8fCBkcmF3U3R5bGUtPmNhbnZhc1BhdHRlcm4oKSkgewogICAgICAgICBJbnRSZWN0IG1h
c2tSZWN0ID0gZW5jbG9zaW5nSW50UmVjdCh0ZXh0UmVjdCk7CiAKLSAgICAgICAgYXV0b19wdHI8
SW1hZ2VCdWZmZXI+IG1hc2tJbWFnZSA9IEltYWdlQnVmZmVyOjpjcmVhdGUobWFza1JlY3Quc2l6
ZSgpLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBHcmFwaGljc0NvbnRleHQqIG1hc2tJbWFn
ZUNvbnRleHQgPSBtYXNrSW1hZ2UtPmNvbnRleHQoKTsKKyAgICAgICAgYm9vbCBpbWFnZUJ1ZmZl
clN1Y2Nlc3M7CisgICAgICAgIEltYWdlQnVmZmVyIG1hc2tJbWFnZShtYXNrUmVjdC5zaXplKCks
IGZhbHNlLCBpbWFnZUJ1ZmZlclN1Y2Nlc3MpOworICAgICAgICBpZiAoIWltYWdlQnVmZmVyU3Vj
Y2VzcykKKyAgICAgICAgICAgIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gZG8gd2l0aCBubyBpbWFn
ZSBidWZmZXIuCisKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0KiBtYXNrSW1hZ2VDb250ZXh0ID0g
bWFza0ltYWdlLmNvbnRleHQoKTsKIAogICAgICAgICBpZiAoZmlsbCkKICAgICAgICAgICAgIG1h
c2tJbWFnZUNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6YmxhY2spOwpAQCAtMTMzOCw3ICsx
MzQxLDcgQEAgdm9pZCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6OmRyYXdUZXh0SW50ZXJuYWwo
Y29uc3QgU3RyaW5nJiB0ZXh0LCBmbG9hdCB4LCBmbG8KICAgICAgICAgbWFza0ltYWdlQ29udGV4
dC0+ZHJhd0JpZGlUZXh0KHRleHRSdW4sIGxvY2F0aW9uKTsKICAgICAgICAgCiAgICAgICAgIGMt
PnNhdmUoKTsKLSAgICAgICAgYy0+Y2xpcFRvSW1hZ2VCdWZmZXIobWFza1JlY3QsIG1hc2tJbWFn
ZS5nZXQoKSk7CisgICAgICAgIGMtPmNsaXBUb0ltYWdlQnVmZmVyKG1hc2tSZWN0LCAmbWFza0lt
YWdlKTsKICAgICAgICAgZHJhd1N0eWxlLT5hcHBseUZpbGxDb2xvcihjKTsKICAgICAgICAgYy0+
ZmlsbFJlY3QobWFza1JlY3QpOwogICAgICAgICBjLT5yZXN0b3JlKCk7CmRpZmYgLS1naXQgYS9X
ZWJDb3JlL2h0bWwvSFRNTENhbnZhc0VsZW1lbnQuY3BwIGIvV2ViQ29yZS9odG1sL0hUTUxDYW52
YXNFbGVtZW50LmNwcAppbmRleCBmM2NhMWZkLi4wZTFjOTVmIDEwMDY0NAotLS0gYS9XZWJDb3Jl
L2h0bWwvSFRNTENhbnZhc0VsZW1lbnQuY3BwCisrKyBiL1dlYkNvcmUvaHRtbC9IVE1MQ2FudmFz
RWxlbWVudC5jcHAKQEAgLTI1Myw3ICsyNTMsMTEgQEAgdm9pZCBIVE1MQ2FudmFzRWxlbWVudDo6
Y3JlYXRlSW1hZ2VCdWZmZXIoKSBjb25zdAogICAgIEludFNpemUgc2l6ZSA9IGNvbnZlcnRMb2dp
Y2FsVG9EZXZpY2UodW5zY2FsZWRTaXplKTsKICAgICBpZiAoIXNpemUud2lkdGgoKSB8fCAhc2l6
ZS5oZWlnaHQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIG1faW1hZ2VCdWZmZXIuc2V0KEltYWdl
QnVmZmVyOjpjcmVhdGUoc2l6ZSwgZmFsc2UpLnJlbGVhc2UoKSk7CisKKyAgICBib29sIHN1Y2Nl
c3M7CisgICAgc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gaW1hZ2VCdWZmZXIobmV3IEltYWdl
QnVmZmVyKHNpemUsIGZhbHNlLCBzdWNjZXNzKSk7CisgICAgaWYgKHN1Y2Nlc3MpCisgICAgICAg
IG1faW1hZ2VCdWZmZXIuc2V0KGltYWdlQnVmZmVyLnJlbGVhc2UoKSk7CiB9CiAKIEdyYXBoaWNz
Q29udGV4dCogSFRNTENhbnZhc0VsZW1lbnQ6OmRyYXdpbmdDb250ZXh0KCkgY29uc3QKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2VuZXJhdGVkSW1hZ2UuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HZW5lcmF0ZWRJbWFnZS5jcHAKaW5kZXggNWU1MDk1OS4u
MWVhZGFhNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HZW5lcmF0ZWRJ
bWFnZS5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HZW5lcmF0ZWRJbWFnZS5j
cHAKQEAgLTUxLDE2ICs1MSwxOCBAQCB2b2lkIEdlbmVyYXRlZEltYWdlOjpkcmF3UGF0dGVybihH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0
ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQogewogICAg
IC8vIENyZWF0ZSBhIEJpdG1hcEltYWdlIGFuZCBjYWxsIGRyYXdQYXR0ZXJuIG9uIGl0LgotICAg
IGF1dG9fcHRyPEltYWdlQnVmZmVyPiBpbWFnZUJ1ZmZlciA9IEltYWdlQnVmZmVyOjpjcmVhdGUo
bV9zaXplLCBmYWxzZSk7Ci0gICAgQVNTRVJUKGltYWdlQnVmZmVyLmdldCgpKTsKLSAgICAKKyAg
ICBib29sIGltYWdlQnVmZmVyU3VjY2VzczsKKyAgICBJbWFnZUJ1ZmZlciBpbWFnZUJ1ZmZlciht
X3NpemUsIGZhbHNlLCBpbWFnZUJ1ZmZlclN1Y2Nlc3MpOworICAgIGlmICghaW1hZ2VCdWZmZXJT
dWNjZXNzKQorICAgICAgICByZXR1cm47CisKICAgICAvLyBGaWxsIHdpdGggdGhlIGdyYWRpZW50
LgotICAgIEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0ID0gaW1hZ2VCdWZmZXItPmNv
bnRleHQoKTsKKyAgICBHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCA9IGltYWdlQnVm
ZmVyLmNvbnRleHQoKTsKICAgICBncmFwaGljc0NvbnRleHQtPmZpbGxSZWN0KEZsb2F0UmVjdChG
bG9hdFBvaW50KCksIG1fc2l6ZSksICptX2dlbmVyYXRvci5nZXQoKSk7Ci0gICAgCisKICAgICAv
LyBHcmFiIHRoZSBmaW5hbCBpbWFnZSBmcm9tIHRoZSBpbWFnZSBidWZmZXIuCi0gICAgSW1hZ2Uq
IGJpdG1hcCA9IGltYWdlQnVmZmVyLT5pbWFnZSgpOwotICAgIAorICAgIEltYWdlKiBiaXRtYXAg
PSBpbWFnZUJ1ZmZlci5pbWFnZSgpOworCiAgICAgLy8gTm93IGp1c3QgY2FsbCBkcmF3VGlsZWQg
b24gdGhhdCBpbWFnZS4KICAgICBiaXRtYXAtPmRyYXdQYXR0ZXJuKGNvbnRleHQsIHNyY1JlY3Qs
IHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBjb21wb3NpdGVPcCwgZGVzdFJlY3QpOwogfQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCmluZGV4IDIwYjA5
OTcuLjJlMDBmMTcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhp
Y3NDb250ZXh0LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29u
dGV4dC5jcHAKQEAgLTQ5Miw3ICs0OTIsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxh
dGZvcm1UZXh0RHJhd2luZ01vZGUoaW50IG1vZGUpCiB9CiAjZW5kaWYKIAotI2lmICFQTEFURk9S
TShRVCkgJiYgIVBMQVRGT1JNKENBSVJPKQorI2lmICFQTEFURk9STShRVCkgJiYgIVBMQVRGT1JN
KENBSVJPKSAmJiAhUExBVEZPUk0oU0tJQSkKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0
Zm9ybVN0cm9rZVN0eWxlKGNvbnN0IFN0cm9rZVN0eWxlJikKIHsKIH0KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvSW1hZ2VCdWZmZXIuaAppbmRleCBjYWZhOTA5Li45ZjYyZTc1IDEwMDY0NAotLS0g
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVyLmgKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5oCkBAIC0yOSwxNCArMjksMTEgQEAKIAogI2lu
Y2x1ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiSW50U2l6ZS5oIgorI2luY2x1ZGUgIkltYWdlQnVm
ZmVyRGF0YS5oIgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvUGFzc1Jl
ZlB0ci5oPgogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2lmIFBMQVRGT1JNKFNLSUEpCi1jbGFzcyBT
a0JpdG1hcDsKLSNlbmRpZgotCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICBjbGFzcyBHcmFw
aGljc0NvbnRleHQ7CkBAIC00NywxMCArNDQsMTMgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAg
ICAgY2xhc3MgSW1hZ2VCdWZmZXIgOiBOb25jb3B5YWJsZSB7CiAgICAgcHVibGljOgotICAgICAg
ICBzdGF0aWMgc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gY3JlYXRlKGNvbnN0IEludFNpemUm
LCBib29sIGdyYXlTY2FsZSk7CisgICAgICAgIC8vIFRoaXMgY29uc3RydWN0b3Igd2lsbCBwbGFj
ZSBpdHMgc3VjY2VzcyBmbGFnIGludG8gdGhlIHxzdWNjZXNzfCBvdXQKKyAgICAgICAgLy8gcGFy
YW1ldGVyLiBUaGUgY2FsbGVyIG11c3QgY2hlY2sgdGhpcyB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55
IG90aGVyCisgICAgICAgIC8vIGZ1bmN0aW9ucyBvbiB0aGlzIGNsYXNzLgorICAgICAgICBJbWFn
ZUJ1ZmZlcihjb25zdCBJbnRTaXplJiwgYm9vbCBncmF5U2NhbGUsIGJvb2wmIHN1Y2Nlc3MpOwog
ICAgICAgICB+SW1hZ2VCdWZmZXIoKTsKIAotICAgICAgICBJbnRTaXplIHNpemUoKSBjb25zdCB7
IHJldHVybiBtX3NpemU7IH0KKyAgICAgICAgY29uc3QgSW50U2l6ZSYgc2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fc2l6ZTsgfQogICAgICAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQoKSBjb25z
dDsKIAogICAgICAgICBJbWFnZSogaW1hZ2UoKSBjb25zdDsKQEAgLTYzLDI0ICs2MywxMiBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIFN0cmluZyB0b0RhdGFVUkwoY29uc3QgU3RyaW5n
JiBtaW1lVHlwZSkgY29uc3Q7CiAKICAgICBwcml2YXRlOgotICAgICAgICB2b2lkKiBtX2RhdGE7
Ci0gICAgICAgIEludFNpemUgbV9zaXplOworICAgICAgICBJbWFnZUJ1ZmZlckRhdGEgbV9kYXRh
OyAgLy8gUGxhdGZvcm0tc3BlY2lmaWMgZGF0YS4KIAorICAgICAgICBJbnRTaXplIG1fc2l6ZTsK
ICAgICAgICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dD4gbV9jb250ZXh0OwogICAgICAgICBtdXRh
YmxlIFJlZlB0cjxJbWFnZT4gbV9pbWFnZTsKLSAgICAKLSNpZiBQTEFURk9STShDRykKLSAgICAg
ICAgSW1hZ2VCdWZmZXIodm9pZCogaW1hZ2VEYXRhLCBjb25zdCBJbnRTaXplJiwgc3RkOjphdXRv
X3B0cjxHcmFwaGljc0NvbnRleHQ+KTsKLSNlbGlmIFBMQVRGT1JNKFFUKQotICAgICAgICBJbWFn
ZUJ1ZmZlcihjb25zdCBRUGl4bWFwJik7Ci0gICAgICAgIG11dGFibGUgUVBpeG1hcCBtX3BpeG1h
cDsKLSAgICAgICAgbXV0YWJsZSBRUGFpbnRlciogbV9wYWludGVyOwotI2VsaWYgUExBVEZPUk0o
Q0FJUk8pCi0gICAgICAgIEltYWdlQnVmZmVyKGNhaXJvX3N1cmZhY2VfdCopOwotICAgICAgICBt
dXRhYmxlIGNhaXJvX3N1cmZhY2VfdCogbV9zdXJmYWNlOwotI2VsaWYgUExBVEZPUk0oU0tJQSkK
LSAgICAgICAgSW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYpOwotI2VuZGlmCisKICAgICB9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fpcm8uY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jYWlyby9JbWFnZUJ1ZmZlckNhaXJvLmNwcAppbmRleCA1MjYzNTgxLi5lYWRjZmM2IDEw
MDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyQ2Fp
cm8uY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VCdWZmZXJD
YWlyby5jcHAKQEAgLTQ0LDM0ICs0NCwzMiBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLWF1dG9fcHRyPEltYWdlQnVmZmVyPiBJbWFnZUJ1ZmZlcjo6Y3Jl
YXRlKGNvbnN0IEludFNpemUmIHNpemUsIGJvb2wpCitJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVm
ZmVyRGF0YShjb25zdCBJbnRTaXplJiBzaXplKQorICAgIDogbV9zdXJmYWNlKDApCiB7Ci0gICAg
Y2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGUoQ0FJ
Uk9fRk9STUFUX0FSR0IzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOwotICAgIGlm
IChjYWlyb19zdXJmYWNlX3N0YXR1cyhzdXJmYWNlKSAhPSBDQUlST19TVEFUVVNfU1VDQ0VTUykK
LSAgICAgICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPigpOwotCi0gICAgcmV0dXJuIGF1
dG9fcHRyPEltYWdlQnVmZmVyPihuZXcgSW1hZ2VCdWZmZXIoc3VyZmFjZSkpOwogfQogCi1JbWFn
ZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlKQotICAgIDogbV9z
dXJmYWNlKHN1cmZhY2UpCitJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYg
c2l6ZSwgYm9vbCBncmF5U2NhbGUsIGJvb2wmIHN1Y2Nlc3MpCisgICAgOiBtX2RhdGEoc2l6ZSkK
KyAgICAsIG1fc2l6ZShzaXplKQogewotICAgIGludCB3aWR0aCA9IGNhaXJvX2ltYWdlX3N1cmZh
Y2VfZ2V0X3dpZHRoKG1fc3VyZmFjZSk7Ci0gICAgaW50IGhlaWdodCA9IGNhaXJvX2ltYWdlX3N1
cmZhY2VfZ2V0X2hlaWdodChtX3N1cmZhY2UpOwotICAgIG1fc2l6ZSA9IEludFNpemUod2lkdGgs
IGhlaWdodCk7Ci0gICAgY2Fpcm9fdCogY3IgPSBjYWlyb19jcmVhdGUobV9zdXJmYWNlKTsKLSAg
ICBtX2NvbnRleHQuc2V0KG5ldyBHcmFwaGljc0NvbnRleHQoY3IpKTsKKyAgICBtX2RhdGEubV9z
dXJmYWNlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGUoQ0FJUk9fRk9STUFUX0FSR0IzMiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNp
emUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNpemUuaGVpZ2h0KCkpOworICAgIGlmIChjYWlyb19zdXJmYWNlX3N0YXR1cyht
X2RhdGEubV9zdXJmYWNlKSAhPSBDQUlST19TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBzdWNj
ZXNzID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICAvKgotICAgICAqIFRo
ZSBjb250ZXh0IGlzIG5vdyBvd25lZCBieSB0aGUgR3JhcGhpY3NDb250ZXh0Ci0gICAgICovCi0g
ICAgY2Fpcm9fZGVzdHJveShjcik7CisgICAgY2Fpcm9fdCogY3IgPSBjYWlyb19jcmVhdGUobV9k
YXRhLm1fc3VyZmFjZSk7CisgICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhpY3NDb250ZXh0KGNy
KSk7CisgICAgY2Fpcm9fZGVzdHJveShjcik7ICAvLyBUaGUgY29udGV4dCBpcyBub3cgb3duZWQg
YnkgdGhlIEdyYXBoaWNzQ29udGV4dC4KKyAgICBzdWNjZXNzID0gdHJ1ZTsKIH0KIAogSW1hZ2VC
dWZmZXI6On5JbWFnZUJ1ZmZlcigpCiB7Ci0gICAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95KG1fc3Vy
ZmFjZSk7CisgICAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95KG1fZGF0YS5tX3N1cmZhY2UpOwogfQog
CiBHcmFwaGljc0NvbnRleHQqIEltYWdlQnVmZmVyOjpjb250ZXh0KCkgY29uc3QKQEAgLTg2LDIw
ICs4NCwxNyBAQCBJbWFnZSogSW1hZ2VCdWZmZXI6OmltYWdlKCkgY29uc3QKICAgICAgICAgLy8g
R3JhcGhpY3NDb250ZXh0IG11c3QgYmUgZG9uZS4KICAgICAgICAgQVNTRVJUKGNvbnRleHQoKSk7
CiAgICAgICAgIC8vIEJpdG1hcEltYWdlIHdpbGwgcmVsZWFzZSB0aGUgcGFzc2VkIGluIHN1cmZh
Y2Ugb24gZGVzdHJ1Y3Rpb24KLSAgICAgICAgbV9pbWFnZSA9IEJpdG1hcEltYWdlOjpjcmVhdGUo
Y2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2UobV9zdXJmYWNlKSk7CisgICAgICAgIG1faW1hZ2UgPSBC
aXRtYXBJbWFnZTo6Y3JlYXRlKGNhaXJvX3N1cmZhY2VfcmVmZXJlbmNlKG1fZGF0YS5tX3N1cmZh
Y2UpKTsKICAgICB9CiAgICAgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7CiB9CiAKIFBhc3NSZWZQdHI8
SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3Qp
IGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N1cmZhY2UpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAg
QVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGUobV9zdXJmYWNlKSA9PSBDQUlST19TVVJGQUNF
X1RZUEVfSU1BR0UpOworICAgIEFTU0VSVChjYWlyb19zdXJmYWNlX2dldF90eXBlKG1fZGF0YS5t
X3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9JTUFHRSk7CiAKICAgICBQYXNzUmVmUHRy
PEltYWdlRGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpjcmVhdGUocmVjdC53aWR0aCgpLCByZWN0
LmhlaWdodCgpKTsKLSAgICB1bnNpZ25lZCBjaGFyKiBkYXRhU3JjID0gY2Fpcm9faW1hZ2Vfc3Vy
ZmFjZV9nZXRfZGF0YShtX3N1cmZhY2UpOworICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFTcmMgPSBj
YWlyb19pbWFnZV9zdXJmYWNlX2dldF9kYXRhKG1fZGF0YS5tX3N1cmZhY2UpOwogICAgIHVuc2ln
bmVkIGNoYXIqIGRhdGFEc3QgPSByZXN1bHQtPmRhdGEoKS0+ZGF0YSgpLmRhdGEoKTsKIAogICAg
IGlmIChyZWN0LngoKSA8IDAgfHwgcmVjdC55KCkgPCAwIHx8IChyZWN0LngoKSArIHJlY3Qud2lk
dGgoKSkgPiBtX3NpemUud2lkdGgoKSB8fCAocmVjdC55KCkgKyByZWN0LmhlaWdodCgpKSA+IG1f
c2l6ZS5oZWlnaHQoKSkKQEAgLTEyNyw3ICsxMjIsNyBAQCBQYXNzUmVmUHRyPEltYWdlRGF0YT4g
SW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAogICAg
ICAgICBlbmR5ID0gbV9zaXplLmhlaWdodCgpOwogICAgIGludCBudW1Sb3dzID0gZW5keSAtIG9y
aWdpbnk7CiAKLSAgICBpbnQgc3RyaWRlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRl
KG1fc3VyZmFjZSk7CisgICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3N0
cmlkZShtX2RhdGEubV9zdXJmYWNlKTsKICAgICB1bnNpZ25lZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0
ICogcmVjdC53aWR0aCgpOwogCiAgICAgdW5zaWduZWQgY2hhciogZGVzdFJvd3MgPSBkYXRhRHN0
ICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0eCAqIDQ7CkBAIC0xNTIsMTIgKzE0Nyw5
IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0
IEludFJlY3QmIHJlY3QpIGNvbnN0CiAKIHZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJ
bWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9p
bnQmIGRlc3RQb2ludCkKIHsKLSAgICBpZiAoIW1fc3VyZmFjZSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgQVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGUobV9zdXJmYWNlKSA9PSBDQUlST19T
VVJGQUNFX1RZUEVfSU1BR0UpOworICAgIEFTU0VSVChjYWlyb19zdXJmYWNlX2dldF90eXBlKG1f
ZGF0YS5tX3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9JTUFHRSk7CiAKLSAgICB1bnNp
Z25lZCBjaGFyKiBkYXRhRHN0ID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0YShtX3N1cmZh
Y2UpOworICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFEc3QgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2dl
dF9kYXRhKG1fZGF0YS5tX3N1cmZhY2UpOwogCiAgICAgQVNTRVJUKHNvdXJjZVJlY3Qud2lkdGgo
KSA+IDApOwogICAgIEFTU0VSVChzb3VyY2VSZWN0LmhlaWdodCgpID4gMCk7CkBAIC0xODYsNyAr
MTc4LDcgQEAgdm9pZCBJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNl
LCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb24KICAgICBpbnQgbnVtUm93cyA9IGVuZHkg
LSBkZXN0eTsKIAogICAgIHVuc2lnbmVkIHNyY0J5dGVzUGVyUm93ID0gNCAqIHNvdXJjZS0+d2lk
dGgoKTsKLSAgICBpbnQgc3RyaWRlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlKG1f
c3VyZmFjZSk7CisgICAgaW50IHN0cmlkZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3N0cmlk
ZShtX2RhdGEubV9zdXJmYWNlKTsKIAogICAgIHVuc2lnbmVkIGNoYXIqIHNyY1Jvd3MgPSBzb3Vy
Y2UtPmRhdGEoKS0+ZGF0YSgpLmRhdGEoKSArIG9yaWdpbnkgKiBzcmNCeXRlc1BlclJvdyArIG9y
aWdpbnggKiA0OwogICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQnVmZmVyRGF0YS5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZUJ1ZmZlckRhdGEuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWYxNWRmCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZUJ1ZmZlckRhdGEuaApAQCAt
MCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJbWFnZUJ1ZmZlckRhdGFfaAorI2RlZmlu
ZSBJbWFnZUJ1ZmZlckRhdGFfaAorCisjaW5jbHVkZSAiY2Fpcm8uaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBJbnRTaXplOworCitjbGFzcyBJbWFnZUJ1ZmZlckRhdGEgeworcHVi
bGljOgorICAgIEltYWdlQnVmZmVyRGF0YShjb25zdCBJbnRTaXplJik7CisKKyAgICBjYWlyb19z
dXJmYWNlX3QqIG1fc3VyZmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAgLy8gSW1hZ2VCdWZmZXJEYXRhX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDRy5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2NnL0ltYWdlQnVmZmVyQ0cuY3BwCmluZGV4IDQxZjY1MWQuLjJmNzgwM2MgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDRy5jcHAKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckNHLmNwcApAQCAtNDMsNTAgKzQz
LDQ4IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotYXV0
b19wdHI8SW1hZ2VCdWZmZXI+IEltYWdlQnVmZmVyOjpjcmVhdGUoY29uc3QgSW50U2l6ZSYgc2l6
ZSwgYm9vbCBncmF5U2NhbGUpCitJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVmZmVyRGF0YShjb25z
dCBJbnRTaXplJikKKyAgICA6IG1fZGF0YSgwKQogeworfQorCitJbWFnZUJ1ZmZlcjo6SW1hZ2VC
dWZmZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUsIGJvb2wmIHN1Y2Nlc3Mp
CisgICAgOiBtX2RhdGEoc2l6ZSkKKyAgICAsIG1fc2l6ZShzaXplKQoreworICAgIHN1Y2Nlc3Mg
PSBmYWxzZTsgIC8vIEVhcmx5IHJldHVybnMgaW5kaWNhdGUgZmFpbHVyZS4KKworICAgIHVuc2ln
bmVkIGJ5dGVzUGVyUm93OwogICAgIGlmIChzaXplLndpZHRoKCkgPCAwIHx8IHNpemUuaGVpZ2h0
KCkgPCAwKQotICAgICAgICByZXR1cm4gYXV0b19wdHI8SW1hZ2VCdWZmZXI+KCk7Ci0gICAgdW5z
aWduZWQgaW50IGJ5dGVzUGVyUm93ID0gc2l6ZS53aWR0aCgpOworICAgICAgICByZXR1cm47Cisg
ICAgYnl0ZXNQZXJSb3cgPSBzaXplLndpZHRoKCk7CiAgICAgaWYgKCFncmF5U2NhbGUpIHsKICAg
ICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IG92ZXJmbG93CiAgICAgICAgIGlmIChieXRlc1BlclJv
dyA+IDB4M0ZGRkZGRkYpCi0gICAgICAgICAgICByZXR1cm4gYXV0b19wdHI8SW1hZ2VCdWZmZXI+
KCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGJ5dGVzUGVyUm93ICo9IDQ7CiAgICAg
fQogCi0gICAgdm9pZCogaW1hZ2VCdWZmZXIgPSB0cnlGYXN0Q2FsbG9jKHNpemUuaGVpZ2h0KCks
IGJ5dGVzUGVyUm93KTsKLSAgICBpZiAoIWltYWdlQnVmZmVyKQotICAgICAgICByZXR1cm4gYXV0
b19wdHI8SW1hZ2VCdWZmZXI+KCk7CisgICAgbV9kYXRhLm1fZGF0YSA9IHRyeUZhc3RDYWxsb2Mo
c2l6ZS5oZWlnaHQoKSwgYnl0ZXNQZXJSb3cpOworICAgIEFTU0VSVCgocmVpbnRlcnByZXRfY2Fz
dDxzaXplX3Q+KG1fZGF0YS5tX2RhdGEpICYgMikgPT0gMCk7CiAKICAgICBDR0NvbG9yU3BhY2VS
ZWYgY29sb3JTcGFjZSA9IGdyYXlTY2FsZSA/IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZUdyYXko
KSA6IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjZ0Nv
bnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW1hZ2VCdWZmZXIsIHNpemUud2lkdGgoKSwg
c2l6ZS5oZWlnaHQoKSwgOCwgYnl0ZXNQZXJSb3csCisgICAgQ0dDb250ZXh0UmVmIGNnQ29udGV4
dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShtX2RhdGEubV9kYXRhLCBzaXplLndpZHRoKCksIHNp
emUuaGVpZ2h0KCksIDgsIGJ5dGVzUGVyUm93LAogICAgICAgICBjb2xvclNwYWNlLCBncmF5U2Nh
bGUgPyBrQ0dJbWFnZUFscGhhTm9uZSA6IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkTGFzdCk7
CiAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShjb2xvclNwYWNlKTsKLSAgICBpZiAoIWNnQ29udGV4
dCkgewotICAgICAgICBmYXN0RnJlZShpbWFnZUJ1ZmZlcik7Ci0gICAgICAgIHJldHVybiBhdXRv
X3B0cjxJbWFnZUJ1ZmZlcj4oKTsKLSAgICB9CisgICAgaWYgKCFjZ0NvbnRleHQpCisgICAgICAg
IHJldHVybjsKIAotICAgIGF1dG9fcHRyPEdyYXBoaWNzQ29udGV4dD4gY29udGV4dChuZXcgR3Jh
cGhpY3NDb250ZXh0KGNnQ29udGV4dCkpOwotICAgIGNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSgx
LCAtMSkpOwotICAgIGNvbnRleHQtPnRyYW5zbGF0ZSgwLCAtc2l6ZS5oZWlnaHQoKSk7CisgICAg
bV9jb250ZXh0LnNldChuZXcgR3JhcGhpY3NDb250ZXh0KGNnQ29udGV4dCkpOworICAgIG1fY29u
dGV4dC0+c2NhbGUoRmxvYXRTaXplKDEsIC0xKSk7CisgICAgbV9jb250ZXh0LT50cmFuc2xhdGUo
MCwgLXNpemUuaGVpZ2h0KCkpOwogICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKLSAg
ICByZXR1cm4gYXV0b19wdHI8SW1hZ2VCdWZmZXI+KG5ldyBJbWFnZUJ1ZmZlcihpbWFnZUJ1ZmZl
ciwgc2l6ZSwgY29udGV4dCkpOwotfQotCi0KLUltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcih2b2lk
KiBpbWFnZURhdGEsIGNvbnN0IEludFNpemUmIHNpemUsIGF1dG9fcHRyPEdyYXBoaWNzQ29udGV4
dD4gY29udGV4dCkKLSAgICA6IG1fZGF0YShpbWFnZURhdGEpCi0gICAgLCBtX3NpemUoc2l6ZSkK
LSAgICAsIG1fY29udGV4dChjb250ZXh0LnJlbGVhc2UoKSkKLXsKLSAgICBBU1NFUlQoKHJlaW50
ZXJwcmV0X2Nhc3Q8c2l6ZV90PihpbWFnZURhdGEpICYgMikgPT0gMCk7CisgICAgc3VjY2VzcyA9
IHRydWU7CiB9CiAKIEltYWdlQnVmZmVyOjp+SW1hZ2VCdWZmZXIoKQogewotICAgIGZhc3RGcmVl
KG1fZGF0YSk7CisgICAgZmFzdEZyZWUobV9kYXRhLm1fZGF0YSk7CiB9CiAKIEdyYXBoaWNzQ29u
dGV4dCogSW1hZ2VCdWZmZXI6OmNvbnRleHQoKSBjb25zdApAQCAtMTA5LDkgKzEwNyw2IEBAIElt
YWdlKiBJbWFnZUJ1ZmZlcjo6aW1hZ2UoKSBjb25zdAogCiBQYXNzUmVmUHRyPEltYWdlRGF0YT4g
SW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAogewot
ICAgIGlmICghbV9kYXRhKQotICAgICAgICByZXR1cm4gMDsKLQogICAgIFBhc3NSZWZQdHI8SW1h
Z2VEYXRhPiByZXN1bHQgPSBJbWFnZURhdGE6OmNyZWF0ZShyZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCkpOwogICAgIHVuc2lnbmVkIGNoYXIqIGRhdGEgPSByZXN1bHQtPmRhdGEoKS0+ZGF0YSgp
LmRhdGEoKTsKIApAQCAtMTQzLDcgKzEzOCw4IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFn
ZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0CiAgICAgdW5z
aWduZWQgc3JjQnl0ZXNQZXJSb3cgPSA0ICogbV9zaXplLndpZHRoKCk7CiAgICAgdW5zaWduZWQg
ZGVzdEJ5dGVzUGVyUm93ID0gNCAqIHJlY3Qud2lkdGgoKTsKIAotICAgIHVuc2lnbmVkIGNoYXIq
IHNyY1Jvd3MgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2RhdGEpICsgb3Jp
Z2lueSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CisgICAgLy8gOjpjcmVhdGUgZW5z
dXJlcyB0aGF0IGFsbCBJbWFnZUJ1ZmZlcnMgaGF2ZSB2YWxpZCBkYXRhLCBzbyB3ZSBkb24ndCBu
ZWVkIHRvIGNoZWNrIGl0IGhlcmUuCisgICAgdW5zaWduZWQgY2hhciogc3JjUm93cyA9IHJlaW50
ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KG1fZGF0YS5tX2RhdGEpICsgb3JpZ2lueSAqIHNy
Y0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CiAgICAgdW5zaWduZWQgY2hhciogZGVzdFJvd3Mg
PSBkYXRhICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0eCAqIDQ7CiAgICAgZm9yIChp
bnQgeSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsKICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHgg
PCBudW1Db2x1bW5zOyB4KyspIHsKQEAgLTE5NCw3ICsxOTAsNyBAQCB2b2lkIEltYWdlQnVmZmVy
OjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJl
Y3QsIGNvbgogICAgIHVuc2lnbmVkIGRlc3RCeXRlc1BlclJvdyA9IDQgKiBtX3NpemUud2lkdGgo
KTsKIAogICAgIHVuc2lnbmVkIGNoYXIqIHNyY1Jvd3MgPSBzb3VyY2UtPmRhdGEoKS0+ZGF0YSgp
LmRhdGEoKSArIG9yaWdpbnkgKiBzcmNCeXRlc1BlclJvdyArIG9yaWdpbnggKiA0OwotICAgIHVu
c2lnbmVkIGNoYXIqIGRlc3RSb3dzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4o
bV9kYXRhKSArIGRlc3R5ICogZGVzdEJ5dGVzUGVyUm93ICsgZGVzdHggKiA0OworICAgIHVuc2ln
bmVkIGNoYXIqIGRlc3RSb3dzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4obV9k
YXRhLm1fZGF0YSkgKyBkZXN0eSAqIGRlc3RCeXRlc1BlclJvdyArIGRlc3R4ICogNDsKICAgICBm
b3IgKGludCB5ID0gMDsgeSA8IG51bVJvd3M7ICsreSkgewogICAgICAgICBmb3IgKGludCB4ID0g
MDsgeCA8IG51bUNvbHVtbnM7IHgrKykgewogICAgICAgICAgICAgaW50IGJhc2V4ID0geCAqIDQ7
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyRGF0
YS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckRhdGEuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTZmYzRjCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZlckRhdGEuaApAQCAtMCww
ICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJbWFnZUJ1ZmZlckRhdGFfaAorI2RlZmluZSBJ
bWFnZUJ1ZmZlckRhdGFfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFNpemU7
CisKK2NsYXNzIEltYWdlQnVmZmVyRGF0YSB7CitwdWJsaWM6CisgICAgSW1hZ2VCdWZmZXJEYXRh
KGNvbnN0IEludFNpemUmKTsKKworICAgIHZvaWQqIG1fZGF0YTsKK307CisKK30gIC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8gSW1hZ2VCdWZmZXJEYXRhX2gKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJEYXRhLmggYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlQnVmZmVyRGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjIyMmRhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlQnVmZmVyRGF0YS5oCkBAIC0wLDAgKzEsNDggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIEltYWdlQnVmZmVyRGF0YV9oCisjZGVmaW5lIEltYWdlQnVmZmVyRGF0
YV9oCisKKyNpbmNsdWRlIDxRUGFpbnRlcj4KKyNpbmNsdWRlIDxRUGl4bWFwPgorCisjaW5jbHVk
ZSAiT3duUHRyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSW50U2l6ZTsKKwor
Y2xhc3MgSW1hZ2VCdWZmZXJEYXRhIHsKK3B1YmxpYzoKKyAgICBJbWFnZUJ1ZmZlckRhdGEoY29u
c3QgSW50U2l6ZSYpOworCisgICAgUVBpeG1hcCBtX3BpeG1hcDsKKyAgICBPd25QdHI8UVBhaW50
ZXI+IG1fcGFpbnRlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAg
Ly8gSW1hZ2VCdWZmZXJEYXRhX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0lt
YWdlQnVmZmVyUXQuY3BwCmluZGV4IDg5NWE0YzguLmRmZjczMWIgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5jcHAKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1ZmZlclF0LmNwcApAQCAtNDEsMjQgKzQxLDIzIEBA
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gSW1h
Z2VCdWZmZXI6OmNyZWF0ZShjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSkKK0lt
YWdlQnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmIHNpemUpCisgICAg
OiBtX3BpeG1hcChzaXplKQogewotICAgIFFQaXhtYXAgcHgoc2l6ZSk7CiAgICAgcHguZmlsbChR
Q29sb3IoUXQ6OnRyYW5zcGFyZW50KSk7Ci0gICAgcmV0dXJuIHN0ZDo6YXV0b19wdHI8SW1hZ2VC
dWZmZXI+KG5ldyBJbWFnZUJ1ZmZlcihweCkpOworICAgIG1fcGFpbnRlci5zZXQobmV3IFFQYWlu
dGVyKCZtX3BpeG1hcCkpOwogfQogCi1JbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgUVBp
eG1hcCYgcHgpCi0gICAgOiBtX3BpeG1hcChweCksCi0gICAgICBtX3BhaW50ZXIoMCkKK0ltYWdl
QnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSwg
Ym9vbCBzdWNjZXNzKQorICAgIDogbV9kYXRhKHNpemUpCisgICAgLCBtX3NpemUoc2l6ZSkKIHsK
LSAgICBtX3BhaW50ZXIgPSBuZXcgUVBhaW50ZXIoJm1fcGl4bWFwKTsKLSAgICBtX2NvbnRleHQu
c2V0KG5ldyBHcmFwaGljc0NvbnRleHQobV9wYWludGVyKSk7CisgICAgbV9jb250ZXh0LnNldChu
ZXcgR3JhcGhpY3NDb250ZXh0KHBsYXRmb3JtLm1fcGFpbnRlcikpOworICAgIHN1Y2Nlc3MgPSB0
cnVlOwogfQogCiBJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKCkKIHsKLSAgICBkZWxldGUgbV9w
YWludGVyOwogfQogCiBHcmFwaGljc0NvbnRleHQqIEltYWdlQnVmZmVyOjpjb250ZXh0KCkgY29u
c3QKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvSW1hZ2VCdWZmZXJE
YXRhLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlQnVmZmVyRGF0YS5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGVjNjQKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlQnVmZmVyRGF0YS5oCkBAIC0w
LDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEltYWdlQnVmZmVyRGF0YV9oCisjZGVmaW5l
IEltYWdlQnVmZmVyRGF0YV9oCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSW50U2l6
ZTsKKworY2xhc3MgSW1hZ2VCdWZmZXJEYXRhIHsKK3B1YmxpYzoKKyAgICBJbWFnZUJ1ZmZlckRh
dGEoY29uc3QgSW50U2l6ZSYpIHt9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgIC8vIEltYWdlQnVmZmVyRGF0YV9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3d4L0ltYWdlQnVmZmVyV3guY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93eC9JbWFnZUJ1ZmZlcld4LmNwcAppbmRleCAzMmI2NmIxLi5jZGVmMGI5IDEwMDY0NAotLS0g
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ltYWdlQnVmZmVyV3guY3BwCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvSW1hZ2VCdWZmZXJXeC5jcHAKQEAgLTMyLDkgKzMy
LDEwIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZl
cj4gSW1hZ2VCdWZmZXI6OmNyZWF0ZShjb25zdCBJbnRTaXplJiwgYm9vbCBncmF5U2NhbGUpCitJ
bWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2Nh
bGUsIGJvb2wmIHN1Y2Nlc3MpCiB7Ci0gICAgcmV0dXJuIHN0ZDo6YXV0b19wdHI8SW1hZ2VCdWZm
ZXI+KG5ldyBJbWFnZUJ1ZmZlcigpKTsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHN1Y2Nl
c3MgPSBmYWxzZTsKIH0KIAogSW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigpCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL21hYy9TY3JvbGxiYXJUaGVtZU1hYy5tbSBiL1dlYkNvcmUvcGxh
dGZvcm0vbWFjL1Njcm9sbGJhclRoZW1lTWFjLm1tCmluZGV4IGRkMmMyMzMuLjRmMjllMTIgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1Njcm9sbGJhclRoZW1lTWFjLm1tCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vbWFjL1Njcm9sbGJhclRoZW1lTWFjLm1tCkBAIC0zODcsMTMgKzM4
NywxNCBAQCBib29sIFNjcm9sbGJhclRoZW1lTWFjOjpwYWludChTY3JvbGxiYXIqIHNjcm9sbGJh
ciwgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjbwogICAgICAgICBJbnRSZWN0IGJ1ZmZlclJl
Y3Qoc2Nyb2xsYmFyLT5mcmFtZVJlY3QoKSk7CiAgICAgICAgIGJ1ZmZlclJlY3QuaW50ZXJzZWN0
KGRhbWFnZVJlY3QpOwogICAgICAgICBidWZmZXJSZWN0Lm1vdmUoLXNjcm9sbGJhci0+ZnJhbWVS
ZWN0KCkueCgpLCAtc2Nyb2xsYmFyLT5mcmFtZVJlY3QoKS55KCkpOwotICAgICAgICAKLSAgICAg
ICAgYXV0b19wdHI8SW1hZ2VCdWZmZXI+IGltYWdlQnVmZmVyID0gSW1hZ2VCdWZmZXI6OmNyZWF0
ZShidWZmZXJSZWN0LnNpemUoKSwgZmFsc2UpOwotICAgICAgICBpZiAoIWltYWdlQnVmZmVyLmdl
dCgpKQorCisgICAgICAgIGJvb2wgaW1hZ2VCdWZmZXJTdWNjZXNzOworICAgICAgICBJbWFnZUJ1
ZmZlciBpbWFnZUJ1ZmZlcihidWZmZXJSZWN0LnNpemUoKSwgZmFsc2UsIGltYWdlQnVmZmVyU3Vj
Y2Vzcyk7CisgICAgICAgIGlmICghaW1hZ2VCdWZmZXJTdWNjZXNzKQogICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBISVRoZW1lRHJhd1RyYWNrKCZ0cmFja0luZm8s
IDAsIGltYWdlQnVmZmVyLT5jb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLCBrSElUaGVtZU9y
aWVudGF0aW9uTm9ybWFsKTsKLSAgICAgICAgY29udGV4dC0+ZHJhd0ltYWdlKGltYWdlQnVmZmVy
LT5pbWFnZSgpLCBzY3JvbGxiYXItPmZyYW1lUmVjdCgpLmxvY2F0aW9uKCkpOworCisgICAgICAg
IEhJVGhlbWVEcmF3VHJhY2soJnRyYWNrSW5mbywgMCwgaW1hZ2VCdWZmZXIuY29udGV4dCgpLT5w
bGF0Zm9ybUNvbnRleHQoKSwga0hJVGhlbWVPcmllbnRhdGlvbk5vcm1hbCk7CisgICAgICAgIGNv
bnRleHQtPmRyYXdJbWFnZShpbWFnZUJ1ZmZlci5pbWFnZSgpLCBzY3JvbGxiYXItPmZyYW1lUmVj
dCgpLmxvY2F0aW9uKCkpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcCBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJveC5jcHAKaW5kZXggNGQxNTM0MS4uZWI2Y2JjMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQm94LmNwcAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3Bw
CkBAIC03NjcsMTEgKzc2NywxMiBAQCB2b2lkIFJlbmRlckJveDo6cGFpbnRGaWxsTGF5ZXJFeHRl
bmRlZChjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgQ29sb3ImCiAgICAgICAgIG1h
c2tSZWN0LmludGVyc2VjdChwYWludEluZm8ucmVjdCk7CiAgICAgICAgIAogICAgICAgICAvLyBO
b3cgY3JlYXRlIHRoZSBtYXNrLgotICAgICAgICBhdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gbWFza0lt
YWdlID0gSW1hZ2VCdWZmZXI6OmNyZWF0ZShtYXNrUmVjdC5zaXplKCksIGZhbHNlKTsKLSAgICAg
ICAgaWYgKCFtYXNrSW1hZ2UuZ2V0KCkpCisgICAgICAgIGJvb2wgaW1hZ2VCdWZmZXJTdWNjZXNz
OworICAgICAgICBJbWFnZUJ1ZmZlciBtYXNrSW1hZ2UobWFza1JlY3Quc2l6ZSgpLCBmYWxzZSwg
aW1hZ2VCdWZmZXJTdWNjZXNzKTsKKyAgICAgICAgaWYgKCFpbWFnZUJ1ZmZlclN1Y2Nlc3MpCiAg
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBHcmFwaGljc0NvbnRleHQqIG1h
c2tJbWFnZUNvbnRleHQgPSBtYXNrSW1hZ2UtPmNvbnRleHQoKTsKKworICAgICAgICBHcmFwaGlj
c0NvbnRleHQqIG1hc2tJbWFnZUNvbnRleHQgPSBtYXNrSW1hZ2UuY29udGV4dCgpOwogICAgICAg
ICBtYXNrSW1hZ2VDb250ZXh0LT50cmFuc2xhdGUoLW1hc2tSZWN0LngoKSwgLW1hc2tSZWN0Lnko
KSk7CiAgICAgICAgIAogICAgICAgICAvLyBOb3cgYWRkIHRoZSB0ZXh0IHRvIHRoZSBjbGlwLiAg
V2UgZG8gdGhpcyBieSBwYWludGluZyB1c2luZyBhIHNwZWNpYWwgcGFpbnQgcGhhc2UgdGhhdCBz
aWduYWxzIHRvCkBAIC03ODQsNyArNzg1LDcgQEAgdm9pZCBSZW5kZXJCb3g6OnBhaW50RmlsbExh
eWVyRXh0ZW5kZWQoY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IENvbG9yJgogICAg
ICAgICAgICAgCiAgICAgICAgIC8vIFRoZSBtYXNrIGhhcyBiZWVuIGNyZWF0ZWQuICBOb3cgd2Ug
anVzdCBuZWVkIHRvIGNsaXAgdG8gaXQuCiAgICAgICAgIGNvbnRleHQtPnNhdmUoKTsKLSAgICAg
ICAgY29udGV4dC0+Y2xpcFRvSW1hZ2VCdWZmZXIobWFza1JlY3QsIG1hc2tJbWFnZS5nZXQoKSk7
CisgICAgICAgIGNvbnRleHQtPmNsaXBUb0ltYWdlQnVmZmVyKG1hc2tSZWN0LCAmbWFza0ltYWdl
KTsKICAgICB9CiAgICAgCiAgICAgU3R5bGVJbWFnZSogYmcgPSBiZ0xheWVyLT5pbWFnZSgpOwpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9zdmcvU1ZHTWFza0VsZW1lbnQuY3BwIGIvV2ViQ29yZS9zdmcv
U1ZHTWFza0VsZW1lbnQuY3BwCmluZGV4IDlmOWFlMzQuLmI2NGI2YWQgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvc3ZnL1NWR01hc2tFbGVtZW50LmNwcAorKysgYi9XZWJDb3JlL3N2Zy9TVkdNYXNrRWxl
bWVudC5jcHAKQEAgLTE1Myw5ICsxNTMsMTAgQEAgYXV0b19wdHI8SW1hZ2VCdWZmZXI+IFNWR01h
c2tFbGVtZW50OjpkcmF3TWFza2VyQ29udGVudChjb25zdCBGbG9hdFJlY3QmIHRhcmdldFIKICAg
ICBpZiAoaW1hZ2VTaXplLmhlaWdodCgpIDwgc3RhdGljX2Nhc3Q8aW50PihoZWlnaHRWYWx1ZSkp
CiAgICAgICAgIGhlaWdodFZhbHVlID0gaW1hZ2VTaXplLmhlaWdodCgpOwogCi0gICAgYXV0b19w
dHI8SW1hZ2VCdWZmZXI+IG1hc2tJbWFnZSA9IEltYWdlQnVmZmVyOjpjcmVhdGUoaW1hZ2VTaXpl
LCBmYWxzZSk7Ci0gICAgaWYgKCFtYXNrSW1hZ2UuZ2V0KCkpCi0gICAgICAgIHJldHVybiBtYXNr
SW1hZ2U7CisgICAgYm9vbCBpbWFnZUJ1ZmZlclN1Y2Nlc3M7CisgICAgYXV0b19wdHI8SW1hZ2VC
dWZmZXI+IG1hc2tJbWFnZShuZXcgSW1hZ2VCdWZmZXIoaW1hZ2VTaXplLCBmYWxzZSwgaW1hZ2VC
dWZmZXJTdWNjZXNzKSk7CisgICAgaWYgKCFpbWFnZUJ1ZmZlclN1Y2Nlc3MpCisgICAgICAgIHJl
dHVybiBhdXRvX3B0cjxJbWFnZUJ1ZmZlcj4oKTsKIAogICAgIG1hc2tEZXN0UmVjdCA9IEZsb2F0
UmVjdCh4VmFsdWUsIHlWYWx1ZSwgd2lkdGhWYWx1ZSwgaGVpZ2h0VmFsdWUpOwogICAgIGlmICht
YXNrVW5pdHMoKSA9PSBTVkdVbml0VHlwZXM6OlNWR19VTklUX1RZUEVfT0JKRUNUQk9VTkRJTkdC
T1gpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3N2Zy9TVkdQYXR0ZXJuRWxlbWVudC5jcHAgYi9XZWJD
b3JlL3N2Zy9TVkdQYXR0ZXJuRWxlbWVudC5jcHAKaW5kZXggZThkZGI3Yy4uOTc3MGY2MSAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9zdmcvU1ZHUGF0dGVybkVsZW1lbnQuY3BwCisrKyBiL1dlYkNvcmUv
c3ZnL1NWR1BhdHRlcm5FbGVtZW50LmNwcApAQCAtMjE0LDkgKzIxNCw5IEBAIHZvaWQgU1ZHUGF0
dGVybkVsZW1lbnQ6OmJ1aWxkUGF0dGVybihjb25zdCBGbG9hdFJlY3QmIHRhcmdldFJlY3QpIGNv
bnN0CiAgICAgSW50U2l6ZSBpbWFnZVNpemUobHJvdW5kZihwYXR0ZXJuQm91bmRhcmllc0luY2x1
ZGluZ092ZXJmbG93LndpZHRoKCkpLCBscm91bmRmKHBhdHRlcm5Cb3VuZGFyaWVzSW5jbHVkaW5n
T3ZlcmZsb3cuaGVpZ2h0KCkpKTsKICAgICBjbGFtcEltYWdlQnVmZmVyU2l6ZVRvVmlld3BvcnQo
ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSwgaW1hZ2VTaXplKTsKIAotICAgIGF1dG9fcHRyPEltYWdl
QnVmZmVyPiBwYXR0ZXJuSW1hZ2UgPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKGltYWdlU2l6ZSwgZmFs
c2UpOwotCi0gICAgaWYgKCFwYXR0ZXJuSW1hZ2UuZ2V0KCkpCisgICAgYm9vbCBpbWFnZUJ1ZmZl
clN1Y2Nlc3M7CisgICAgYXV0b19wdHI8SW1hZ2VCdWZmZXI+IHBhdHRlcm5JbWFnZShuZXcgSW1h
Z2VCdWZmZXIoaW1hZ2VTaXplLCBmYWxzZSwgaW1hZ2VCdWZmZXJTdWNjZXNzKSk7CisgICAgaWYg
KCFpbWFnZUJ1ZmZlclN1Y2Nlc3MpCiAgICAgICAgIHJldHVybjsKIAogICAgIEdyYXBoaWNzQ29u
dGV4dCogY29udGV4dCA9IHBhdHRlcm5JbWFnZS0+Y29udGV4dCgpOwpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9zdmcvZ3JhcGhpY3MvU1ZHSW1hZ2UuY3BwIGIvV2ViQ29yZS9zdmcvZ3JhcGhpY3MvU1ZH
SW1hZ2UuY3BwCmluZGV4IDQ0MjcyNzcuLjZjMThiZmUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvc3Zn
L2dyYXBoaWNzL1NWR0ltYWdlLmNwcAorKysgYi9XZWJDb3JlL3N2Zy9ncmFwaGljcy9TVkdJbWFn
ZS5jcHAKQEAgLTE3MCw3ICsxNzAsMTEgQEAgTmF0aXZlSW1hZ2VQdHIgU1ZHSW1hZ2U6Om5hdGl2
ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkKICAgICAvLyBmcmFtZSBjYWNoZSwgb3IgYmV0dGVyIHll
dCwgbm90IHVzZSBhIGNhY2hlIGZvciB0aWxlZCBkcmF3aW5nIGF0IGFsbCwgaW5zdGVhZAogICAg
IC8vIGhhdmluZyBhIHRpbGVkIGRyYXdpbmcgY2FsbGJhY2sgKGhvcGVmdWxseSBub24tdmlydHVh
bCkuCiAgICAgaWYgKCFtX2ZyYW1lQ2FjaGUpIHsKLSAgICAgICAgbV9mcmFtZUNhY2hlLnNldChJ
bWFnZUJ1ZmZlcjo6Y3JlYXRlKHNpemUoKSwgZmFsc2UpLnJlbGVhc2UoKSk7CisgICAgICAgIGJv
b2wgaW1hZ2VCdWZmZXJTdWNjZXNzOworICAgICAgICBzdGQ6OmF1dG9fcHRyPEltYWdlQnVmZmVy
PiBpbWFnZUJ1ZmZlcihuZXcgSW1hZ2VCdWZmZXIoc2l6ZSgpLCBmYWxzZSwgaW1hZ2VCdWZmZXJT
dWNjZXNzKSk7CisgICAgICAgIGlmICghaW1hZ2VCdWZmZXJTdWNjZXNzKQorICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIG1fZnJhbWVDYWNoZS5zZXQoaW1hZ2VCdWZmZXIucmVsZWFzZSgp
KTsKICAgICAgICAgaWYgKCFtX2ZyYW1lQ2FjaGUpIC8vIGZhaWxlZCB0byBhbGxvY2F0ZSBpbWFn
ZQogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIHJlbmRlclN1YnRyZWVUb0ltYWdlKG1f
ZnJhbWVDYWNoZS5nZXQoKSwgbV9mcmFtZS0+Y29udGVudFJlbmRlcmVyKCkpOwpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2cvU1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudENnLmNwcCBi
L1dlYkNvcmUvc3ZnL2dyYXBoaWNzL2NnL1NWR1BhaW50U2VydmVyR3JhZGllbnRDZy5jcHAKaW5k
ZXggYmZhNTAxNy4uOWY5YWU1YSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2cv
U1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudENnLmNwcAorKysgYi9XZWJDb3JlL3N2Zy9ncmFwaGljcy9j
Zy9TVkdQYWludFNlcnZlckdyYWRpZW50Q2cuY3BwCkBAIC0yOTMsOSArMjkzLDkgQEAgYm9vbCBT
VkdQYWludFNlcnZlckdyYWRpZW50OjpzZXR1cChHcmFwaGljc0NvbnRleHQqJiBjb250ZXh0LCBj
b25zdCBSZW5kZXJPYmplY3QKICAgICAgICAgSW50U2l6ZSBtYXNrU2l6ZShtYXNrUmVjdC53aWR0
aCgpLCBtYXNrUmVjdC5oZWlnaHQoKSk7CiAgICAgICAgIGNsYW1wSW1hZ2VCdWZmZXJTaXplVG9W
aWV3cG9ydChvYmplY3QtPmRvY3VtZW50KCktPnJlbmRlcmVyKCksIG1hc2tTaXplKTsKIAotICAg
ICAgICBhdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gbWFza0ltYWdlID0gSW1hZ2VCdWZmZXI6OmNyZWF0
ZShtYXNrU2l6ZSwgZmFsc2UpOwotCi0gICAgICAgIGlmICghbWFza0ltYWdlLmdldCgpKSB7Cisg
ICAgICAgIGJvb2wgaW1hZ2VCdWZmZXJTdWNjZXNzOworICAgICAgICBhdXRvX3B0cjxJbWFnZUJ1
ZmZlcj4gbWFza0ltYWdlKG5ldyBJbWFnZUJ1ZmZlcihtYXNrU2l6ZSwgZmFsc2UsIGltYWdlQnVm
ZmVyU3VjY2VzcykpOworICAgICAgICBpZiAoIWltYWdlQnVmZmVyU3VjY2VzcykgewogICAgICAg
ICAgICAgY29udGV4dC0+cmVzdG9yZSgpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg
ICAgICB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3N2Zy9ncmFwaGljcy9jZy9TVkdSZXNvdXJjZU1h
c2tlckNnLm1tIGIvV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2cvU1ZHUmVzb3VyY2VNYXNrZXJDZy5t
bQppbmRleCBmODY3ZjljLi5lOTUwZmQ5IDEwMDY0NAotLS0gYS9XZWJDb3JlL3N2Zy9ncmFwaGlj
cy9jZy9TVkdSZXNvdXJjZU1hc2tlckNnLm1tCisrKyBiL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL2Nn
L1NWR1Jlc291cmNlTWFza2VyQ2cubW0KQEAgLTEwNCwxMiArMTA0LDEzIEBAIHZvaWQgU1ZHUmVz
b3VyY2VNYXNrZXI6OmFwcGx5TWFzayhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEZs
b2F0UmVjdCYgYm91CiAgICAgY2xhbXBJbWFnZUJ1ZmZlclNpemVUb1ZpZXdwb3J0KG1fb3duZXJF
bGVtZW50LT5kb2N1bWVudCgpLT5yZW5kZXJlcigpLCBtYXNrU2l6ZSk7CiAKICAgICAvLyBDcmVh
dGUgbmV3IGdyYXBoaWNzIGNvbnRleHQgaW4gZ3JheSBzY2FsZSBtb2RlIGZvciBpbWFnZSByZW5k
ZXJpbmcKLSAgICBhdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gZ3JheVNjYWxlSW1hZ2UoSW1hZ2VCdWZm
ZXI6OmNyZWF0ZShtYXNrU2l6ZSwgdHJ1ZSkpOwotICAgIGlmICghZ3JheVNjYWxlSW1hZ2UuZ2V0
KCkpCisgICAgYm9vbCBpbWFnZUJ1ZmZlclN1Y2Nlc3M7CisgICAgSW1hZ2VCdWZmZXIgZ3JheVNj
YWxlSW1hZ2UobWFza1NpemUsIHRydWUsIGltYWdlQnVmZmVyU3VjY2Vzcyk7CisgICAgaWYgKCFp
bWFnZUJ1ZmZlclN1Y2Nlc3MpCiAgICAgICAgIHJldHVybjsKIAogICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUwotICAgIENHQ29udGV4dFJlZiBncmF5U2NhbGVDb250ZXh0ID0gZ3JheVNj
YWxlSW1hZ2UtPmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0UmVm
IGdyYXlTY2FsZUNvbnRleHQgPSBncmF5U2NhbGVJbWFnZS5jb250ZXh0KCktPnBsYXRmb3JtQ29u
dGV4dCgpOwogICAgIENJQ29udGV4dCogY2lHcmF5c2NhbGVDb250ZXh0ID0gW0NJQ29udGV4dCBj
b250ZXh0V2l0aENHQ29udGV4dDpncmF5U2NhbGVDb250ZXh0IG9wdGlvbnM6bmlsXTsKIAogICAg
IC8vIFRyYW5zZm9ybSBjb2xvcml6ZWQgbWFzayB0byBncmF5IHNjYWxlCkBAIC0xMjAsNyArMTIx
LDcgQEAgdm9pZCBTVkdSZXNvdXJjZU1hc2tlcjo6YXBwbHlNYXNrKEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBib3UKICAgICBDSUltYWdlKiBncmF5U2NhbGVNYXNr
ID0gdHJhbnNmb3JtSW1hZ2VJbnRvR3JheXNjYWxlTWFzayhjb2xvck1hc2spOwogICAgIFtjaUdy
YXlzY2FsZUNvbnRleHQgZHJhd0ltYWdlOmdyYXlTY2FsZU1hc2sgYXRQb2ludDpDR1BvaW50WmVy
byBmcm9tUmVjdDpDR1JlY3RNYWtlKDAsIDAsIG1hc2tTaXplLndpZHRoKCksIG1hc2tTaXplLmhl
aWdodCgpKV07CiAKLSAgICBDR0NvbnRleHRDbGlwVG9NYXNrKGNvbnRleHQtPnBsYXRmb3JtQ29u
dGV4dCgpLCBtX21hc2tSZWN0LCBncmF5U2NhbGVJbWFnZS0+aW1hZ2UoKS0+Z2V0Q0dJbWFnZVJl
ZigpKTsKKyAgICBDR0NvbnRleHRDbGlwVG9NYXNrKGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
LCBtX21hc2tSZWN0LCBncmF5U2NhbGVJbWFnZS5pbWFnZSgpLT5nZXRDR0ltYWdlUmVmKCkpOwog
ICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24713</attachid>
            <date>2008-10-28 08:39:09 -0700</date>
            <delta_ts>2008-10-28 09:07:49 -0700</delta_ts>
            <desc>Patch v4</desc>
            <filename>imagebuffer.diff</filename>
            <type>text/plain</type>
            <size>20721</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGUwMjI4NS4uYmUxYmM0OSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MSBAQAorMjAwOC0xMC0yOCAgQnJldHQgV2lsc29u
ICA8YnJldHR3QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBSZW1vdmUgcGxhdGZvcm0gaWZkZWZzIGluIEltYWdlQnVmZmVyLmgg
YnkgbW92aW5nIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUKKyAgICAgICAgaW50byBhIG5ldyBQbGF0
Zm9ybUltYWdlQnVmZmVyIGNsYXNzLiBNb3ZlIHRoZSBzdGF0aWMgY3JlYXRlIGZ1bmN0aW9uCisg
ICAgICAgIGludG8gdGhlIGhlYWRlciBiZWNhdXNlIGl0IGNhbiBiZSBjcm9zcy1wbGF0Zm9ybS4g
SW5pdGlhbGl6YXRpb24gbm93CisgICAgICAgIGhhcHBlbnMgaW4gdGhlIGN1bnN0cnVjdG9yIHdo
aWNoIHNldHMgYSBmbGFnIHRoYXQgY3JlYXRlIHVzZXMgdG8ga25vdworICAgICAgICB3aGV0aGVy
IGl0IHNob3VsZCByZXR1cm4gbnVsbCBvciBub3QuIEkgYWxzbyBtYWRlIHBhc3Npbmcgb2YgSW50
U2l6ZQorICAgICAgICBtb3JlIGNvbnNpc3RlbnQgKGFsd2F5cyBieSByZWZlcmVuY2UpLgorCisg
ICAgICAgIFRoaXMgY2hhbmdlIGFsc28gY2hhbmdlcyB0aGUgaWZkZWZzIGluIEdyYXBoaWNzQ29u
dGV4dCB0byBhbGxvdyBTa2lhCisgICAgICAgIHBvcnRzIHRvIGltcGxlbWVudCB0ZXh0IGRyYXdp
bmcgbW9kZXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5oOgor
ICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZUJ1ZmZlcjo6c2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8v
SW1hZ2VCdWZmZXJDYWlyby5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlckRhdGE6
OkltYWdlQnVmZmVyRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6SW1hZ2VC
dWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6aW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6
SW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZl
cjo6cHV0SW1hZ2VEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFn
ZUJ1ZmZlckRhdGEuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1ZmZl
ckNHLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJE
YXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcik6CisgICAg
ICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKToKKyAgICAgICAgKFdlYkNv
cmU6OkltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VC
dWZmZXI6OnB1dEltYWdlRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1h
Z2VCdWZmZXJEYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZm
ZXJEYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVmZmVyRGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6SW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcik6CisKIDIwMDgtMTAtMjcgIEtldmlu
IFdhdHRlcnMgIDxrZXZpbndhdHRlcnNAZ21haWwuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEtldmluIE9sbGl2aWVyLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0NvbnRleHQuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0Nv
bnRleHQuY3BwCmluZGV4IDIwYjA5OTcuLjJlMDBmMTcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKQEAgLTQ5Miw3ICs0OTIsNyBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1UZXh0RHJhd2luZ01vZGUoaW50IG1vZGUpCiB9CiAj
ZW5kaWYKIAotI2lmICFQTEFURk9STShRVCkgJiYgIVBMQVRGT1JNKENBSVJPKQorI2lmICFQTEFU
Rk9STShRVCkgJiYgIVBMQVRGT1JNKENBSVJPKSAmJiAhUExBVEZPUk0oU0tJQSkKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVN0eWxlKGNvbnN0IFN0cm9rZVN0eWxlJikK
IHsKIH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXIu
aCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXIuaAppbmRleCBjYWZhOTA5
Li44YzM4MWNhIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVm
ZmVyLmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlci5oCkBAIC0y
OSwxNCArMjksMTEgQEAKIAogI2luY2x1ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiSW50U2l6ZS5o
IgorI2luY2x1ZGUgIkltYWdlQnVmZmVyRGF0YS5oIgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4K
ICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2lmIFBM
QVRGT1JNKFNLSUEpCi1jbGFzcyBTa0JpdG1hcDsKLSNlbmRpZgotCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKICAgICBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CkBAIC00NywxMCArNDQsMTkgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiAgICAgY2xhc3MgSW1hZ2VCdWZmZXIgOiBOb25jb3B5YWJsZSB7
CiAgICAgcHVibGljOgotICAgICAgICBzdGF0aWMgc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4g
Y3JlYXRlKGNvbnN0IEludFNpemUmLCBib29sIGdyYXlTY2FsZSk7CisgICAgICAgIC8vIFdpbGwg
cmV0dXJuIGEgbnVsbCBwb2ludGVyIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KKyAgICAgICAgc3Rh
dGljIHN0ZDo6YXV0b19wdHI8SW1hZ2VCdWZmZXI+IGNyZWF0ZShjb25zdCBJbnRTaXplJiBzaXpl
LCBib29sIGdyYXlTY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBzdWNjZXNzOwor
ICAgICAgICAgICAgc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gYnVmKG5ldyBJbWFnZUJ1ZmZl
cihzaXplLCBncmF5U2NhbGUsIHN1Y2Nlc3MpKTsKKyAgICAgICAgICAgIGlmIChzdWNjZXNzKQor
ICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdXRv
X3B0cjxJbWFnZUJ1ZmZlcj4oKTsKKyAgICAgICAgfQorCiAgICAgICAgIH5JbWFnZUJ1ZmZlcigp
OwogCi0gICAgICAgIEludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAg
ICAgICBjb25zdCBJbnRTaXplJiBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CiAgICAg
ICAgIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCgpIGNvbnN0OwogCiAgICAgICAgIEltYWdlKiBp
bWFnZSgpIGNvbnN0OwpAQCAtNjMsMjQgKzY5LDE1IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgU3RyaW5nIHRvRGF0YVVSTChjb25zdCBTdHJpbmcmIG1pbWVUeXBlKSBjb25zdDsKIAog
ICAgIHByaXZhdGU6Ci0gICAgICAgIHZvaWQqIG1fZGF0YTsKLSAgICAgICAgSW50U2l6ZSBtX3Np
emU7CisgICAgICAgIEltYWdlQnVmZmVyRGF0YSBtX2RhdGE7CiAKKyAgICAgICAgSW50U2l6ZSBt
X3NpemU7CiAgICAgICAgIE93blB0cjxHcmFwaGljc0NvbnRleHQ+IG1fY29udGV4dDsKICAgICAg
ICAgbXV0YWJsZSBSZWZQdHI8SW1hZ2U+IG1faW1hZ2U7Ci0gICAgCi0jaWYgUExBVEZPUk0oQ0cp
Ci0gICAgICAgIEltYWdlQnVmZmVyKHZvaWQqIGltYWdlRGF0YSwgY29uc3QgSW50U2l6ZSYsIHN0
ZDo6YXV0b19wdHI8R3JhcGhpY3NDb250ZXh0Pik7Ci0jZWxpZiBQTEFURk9STShRVCkKLSAgICAg
ICAgSW1hZ2VCdWZmZXIoY29uc3QgUVBpeG1hcCYpOwotICAgICAgICBtdXRhYmxlIFFQaXhtYXAg
bV9waXhtYXA7Ci0gICAgICAgIG11dGFibGUgUVBhaW50ZXIqIG1fcGFpbnRlcjsKLSNlbGlmIFBM
QVRGT1JNKENBSVJPKQotICAgICAgICBJbWFnZUJ1ZmZlcihjYWlyb19zdXJmYWNlX3QqKTsKLSAg
ICAgICAgbXV0YWJsZSBjYWlyb19zdXJmYWNlX3QqIG1fc3VyZmFjZTsKLSNlbGlmIFBMQVRGT1JN
KFNLSUEpCi0gICAgICAgIEltYWdlQnVmZmVyKGNvbnN0IEludFNpemUmKTsKLSNlbmRpZgorCisg
ICAgICAgIC8vIFRoaXMgY29uc3RydWN0b3Igd2lsbCBwbGFjZSBpdHMgc3VjY2VzIGludG8gdGhl
IGdpdmVuIG91dC12YXJpYWJsZQorICAgICAgICAvLyBzbyB0aGF0IGNyZWF0ZSgpIGtub3dzIHdo
ZW4gaXQgc2hvdWxkIHJldHVybiBmYWlsdXJlLgorICAgICAgICBJbWFnZUJ1ZmZlcihjb25zdCBJ
bnRTaXplJiwgYm9vbCBncmF5U2NhbGUsIGJvb2wmIHN1Y2Nlc3MpOwogICAgIH07CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2Fpcm8vSW1hZ2VCdWZmZXJDYWlyby5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nh
aXJvL0ltYWdlQnVmZmVyQ2Fpcm8uY3BwCmluZGV4IDUyNjM1ODEuLjVmNjVlZDIgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VCdWZmZXJDYWlyby5jcHAK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZUJ1ZmZlckNhaXJvLmNw
cApAQCAtNDQsMzQgKzQ0LDMxIEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotYXV0b19wdHI8SW1hZ2VCdWZmZXI+IEltYWdlQnVmZmVyOjpjcmVhdGUoY29u
c3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCkKK0ltYWdlQnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJEYXRh
KGNvbnN0IEludFNpemUmIHNpemUpCisgICAgOiBtX3N1cmZhY2UoMCkKIHsKLSAgICBjYWlyb19z
dXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZShDQUlST19GT1JN
QVRfQVJHQjMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Ci0gICAgaWYgKGNhaXJv
X3N1cmZhY2Vfc3RhdHVzKHN1cmZhY2UpICE9IENBSVJPX1NUQVRVU19TVUNDRVNTKQotICAgICAg
ICByZXR1cm4gYXV0b19wdHI8SW1hZ2VCdWZmZXI+KCk7Ci0KLSAgICByZXR1cm4gYXV0b19wdHI8
SW1hZ2VCdWZmZXI+KG5ldyBJbWFnZUJ1ZmZlcihzdXJmYWNlKSk7CiB9CiAKLUltYWdlQnVmZmVy
OjpJbWFnZUJ1ZmZlcihjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UpCi0gICAgOiBtX3N1cmZhY2Uo
c3VyZmFjZSkKK0ltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJiBzaXplLCBi
b29sIGdyYXlTY2FsZSwgYm9vbCYgc3VjY2VzcykKKyAgICA6IG1fZGF0YShzaXplKQorICAgICwg
bV9zaXplKHNpemUpCiB7Ci0gICAgaW50IHdpZHRoID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRf
d2lkdGgobV9zdXJmYWNlKTsKLSAgICBpbnQgaGVpZ2h0ID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9n
ZXRfaGVpZ2h0KG1fc3VyZmFjZSk7Ci0gICAgbV9zaXplID0gSW50U2l6ZSh3aWR0aCwgaGVpZ2h0
KTsKLSAgICBjYWlyb190KiBjciA9IGNhaXJvX2NyZWF0ZShtX3N1cmZhY2UpOworICAgIHN1Y2Nl
c3MgPSBmYWxzZTsgIC8vIE1ha2UgZWFybHkgcmV0dXJuIG1lYW4gZXJyb3IuCisgICAgbV9kYXRh
Lm1fc3VyZmFjZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlKENBSVJPX0ZPUk1BVF9BUkdC
MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNp
emUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2l6ZS5oZWlnaHQoKSk7CisgICAgaWYgKGNhaXJvX3N1cmZhY2Vfc3RhdHVzKG1fZGF0
YS5tX3N1cmZhY2UpICE9IENBSVJPX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47ICAv
LyBjcmVhdGUgd2lsbCBub3RpY2Ugd2UgZGlkbid0IHNldCBtX2luaXRpYWxpemVkIGFuZCBmYWls
LgorCisgICAgY2Fpcm9fdCogY3IgPSBjYWlyb19jcmVhdGUobV9kYXRhLm1fc3VyZmFjZSk7CiAg
ICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhpY3NDb250ZXh0KGNyKSk7Ci0KLSAgICAvKgotICAg
ICAqIFRoZSBjb250ZXh0IGlzIG5vdyBvd25lZCBieSB0aGUgR3JhcGhpY3NDb250ZXh0Ci0gICAg
ICovCi0gICAgY2Fpcm9fZGVzdHJveShjcik7CisgICAgY2Fpcm9fZGVzdHJveShjcik7ICAvLyBU
aGUgY29udGV4dCBpcyBub3cgb3duZWQgYnkgdGhlIEdyYXBoaWNzQ29udGV4dC4KKyAgICBzdWNj
ZXNzID0gdHJ1ZTsKIH0KIAogSW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigpCiB7Ci0gICAgY2Fp
cm9fc3VyZmFjZV9kZXN0cm95KG1fc3VyZmFjZSk7CisgICAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95
KG1fZGF0YS5tX3N1cmZhY2UpOwogfQogCiBHcmFwaGljc0NvbnRleHQqIEltYWdlQnVmZmVyOjpj
b250ZXh0KCkgY29uc3QKQEAgLTg2LDIwICs4MywxNyBAQCBJbWFnZSogSW1hZ2VCdWZmZXI6Omlt
YWdlKCkgY29uc3QKICAgICAgICAgLy8gR3JhcGhpY3NDb250ZXh0IG11c3QgYmUgZG9uZS4KICAg
ICAgICAgQVNTRVJUKGNvbnRleHQoKSk7CiAgICAgICAgIC8vIEJpdG1hcEltYWdlIHdpbGwgcmVs
ZWFzZSB0aGUgcGFzc2VkIGluIHN1cmZhY2Ugb24gZGVzdHJ1Y3Rpb24KLSAgICAgICAgbV9pbWFn
ZSA9IEJpdG1hcEltYWdlOjpjcmVhdGUoY2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2UobV9zdXJmYWNl
KSk7CisgICAgICAgIG1faW1hZ2UgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKGNhaXJvX3N1cmZhY2Vf
cmVmZXJlbmNlKG1fZGF0YS5tX3N1cmZhY2UpKTsKICAgICB9CiAgICAgcmV0dXJuIG1faW1hZ2Uu
Z2V0KCk7CiB9CiAKIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VE
YXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3N1cmZhY2UpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgQVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGUobV9z
dXJmYWNlKSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOworICAgIEFTU0VSVChjYWlyb19z
dXJmYWNlX2dldF90eXBlKG1fZGF0YS5tX3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0VfVFlQRV9J
TUFHRSk7CiAKICAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpj
cmVhdGUocmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICB1bnNpZ25lZCBjaGFyKiBk
YXRhU3JjID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZGF0YShtX3N1cmZhY2UpOworICAgIHVu
c2lnbmVkIGNoYXIqIGRhdGFTcmMgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9kYXRhKG1fZGF0
YS5tX3N1cmZhY2UpOwogICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFEc3QgPSByZXN1bHQtPmRhdGEo
KS0+ZGF0YSgpLmRhdGEoKTsKIAogICAgIGlmIChyZWN0LngoKSA8IDAgfHwgcmVjdC55KCkgPCAw
IHx8IChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSkgPiBtX3NpemUud2lkdGgoKSB8fCAocmVjdC55
KCkgKyByZWN0LmhlaWdodCgpKSA+IG1fc2l6ZS5oZWlnaHQoKSkKQEAgLTEyNyw3ICsxMjEsNyBA
QCBQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YShjb25zdCBJ
bnRSZWN0JiByZWN0KSBjb25zdAogICAgICAgICBlbmR5ID0gbV9zaXplLmhlaWdodCgpOwogICAg
IGludCBudW1Sb3dzID0gZW5keSAtIG9yaWdpbnk7CiAKLSAgICBpbnQgc3RyaWRlID0gY2Fpcm9f
aW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlKG1fc3VyZmFjZSk7CisgICAgaW50IHN0cmlkZSA9IGNh
aXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3N0cmlkZShtX2RhdGEubV9zdXJmYWNlKTsKICAgICB1bnNp
Z25lZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogcmVjdC53aWR0aCgpOwogCiAgICAgdW5zaWduZWQg
Y2hhciogZGVzdFJvd3MgPSBkYXRhRHN0ICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0
eCAqIDQ7CkBAIC0xNTIsMTIgKzE0Niw5IEBAIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1
ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0CiAKIHZvaWQgSW1h
Z2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYg
c291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKIHsKLSAgICBpZiAoIW1fc3Vy
ZmFjZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKGNhaXJvX3N1cmZhY2VfZ2V0X3R5
cGUobV9zdXJmYWNlKSA9PSBDQUlST19TVVJGQUNFX1RZUEVfSU1BR0UpOworICAgIEFTU0VSVChj
YWlyb19zdXJmYWNlX2dldF90eXBlKG1fZGF0YS5tX3N1cmZhY2UpID09IENBSVJPX1NVUkZBQ0Vf
VFlQRV9JTUFHRSk7CiAKLSAgICB1bnNpZ25lZCBjaGFyKiBkYXRhRHN0ID0gY2Fpcm9faW1hZ2Vf
c3VyZmFjZV9nZXRfZGF0YShtX3N1cmZhY2UpOworICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFEc3Qg
PSBjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9kYXRhKG1fZGF0YS5tX3N1cmZhY2UpOwogCiAgICAg
QVNTRVJUKHNvdXJjZVJlY3Qud2lkdGgoKSA+IDApOwogICAgIEFTU0VSVChzb3VyY2VSZWN0Lmhl
aWdodCgpID4gMCk7CkBAIC0xODYsNyArMTc3LDcgQEAgdm9pZCBJbWFnZUJ1ZmZlcjo6cHV0SW1h
Z2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb24K
ICAgICBpbnQgbnVtUm93cyA9IGVuZHkgLSBkZXN0eTsKIAogICAgIHVuc2lnbmVkIHNyY0J5dGVz
UGVyUm93ID0gNCAqIHNvdXJjZS0+d2lkdGgoKTsKLSAgICBpbnQgc3RyaWRlID0gY2Fpcm9faW1h
Z2Vfc3VyZmFjZV9nZXRfc3RyaWRlKG1fc3VyZmFjZSk7CisgICAgaW50IHN0cmlkZSA9IGNhaXJv
X2ltYWdlX3N1cmZhY2VfZ2V0X3N0cmlkZShtX2RhdGEubV9zdXJmYWNlKTsKIAogICAgIHVuc2ln
bmVkIGNoYXIqIHNyY1Jvd3MgPSBzb3VyY2UtPmRhdGEoKS0+ZGF0YSgpLmRhdGEoKSArIG9yaWdp
bnkgKiBzcmNCeXRlc1BlclJvdyArIG9yaWdpbnggKiA0OwogICAgIGZvciAoaW50IHkgPSAwOyB5
IDwgbnVtUm93czsgKyt5KSB7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2NhaXJvL0ltYWdlQnVmZmVyRGF0YS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9JbWFnZUJ1ZmZlckRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40
OWYxNWRmCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9JbWFnZUJ1ZmZlckRhdGEuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJ
bWFnZUJ1ZmZlckRhdGFfaAorI2RlZmluZSBJbWFnZUJ1ZmZlckRhdGFfaAorCisjaW5jbHVkZSAi
Y2Fpcm8uaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJbnRTaXplOworCitjbGFz
cyBJbWFnZUJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIEltYWdlQnVmZmVyRGF0YShjb25zdCBJ
bnRTaXplJik7CisKKyAgICBjYWlyb19zdXJmYWNlX3QqIG1fc3VyZmFjZTsKK307CisKK30gIC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8gSW1hZ2VCdWZmZXJEYXRhX2gKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VCdWZmZXJDRy5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0ltYWdlQnVmZmVyQ0cuY3BwCmluZGV4IDQxZjY1
MWQuLjUwMjMxM2IgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1h
Z2VCdWZmZXJDRy5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZUJ1
ZmZlckNHLmNwcApAQCAtNDMsNTAgKzQzLDQ3IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAotYXV0b19wdHI8SW1hZ2VCdWZmZXI+IEltYWdlQnVmZmVyOjpj
cmVhdGUoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUpCitJbWFnZUJ1ZmZlckRh
dGE6OkltYWdlQnVmZmVyRGF0YShjb25zdCBJbnRTaXplJikKKyAgICA6IG1fZGF0YSgwKQogewor
fQorCitJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBn
cmF5U2NhbGUsIGJvb2wmIHN1Y2Nlc3MpCisgICAgOiBtX2RhdGEoc2l6ZSkKKyAgICAsIG1fc2l6
ZShzaXplKQoreworICAgIHN1Y2Nlc3MgPSBmYWxzZTsgIC8vIE1ha2UgZWFybHkgcmV0dXJuIG1l
YW4gZmFpbHVyZS4KKyAgICB1bnNpZ25lZCBieXRlc1BlclJvdzsKICAgICBpZiAoc2l6ZS53aWR0
aCgpIDwgMCB8fCBzaXplLmhlaWdodCgpIDwgMCkKLSAgICAgICAgcmV0dXJuIGF1dG9fcHRyPElt
YWdlQnVmZmVyPigpOwotICAgIHVuc2lnbmVkIGludCBieXRlc1BlclJvdyA9IHNpemUud2lkdGgo
KTsKKyAgICAgICAgcmV0dXJuOworICAgIGJ5dGVzUGVyUm93ID0gc2l6ZS53aWR0aCgpOwogICAg
IGlmICghZ3JheVNjYWxlKSB7CiAgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBvdmVyZmxvdwog
ICAgICAgICBpZiAoYnl0ZXNQZXJSb3cgPiAweDNGRkZGRkZGKQotICAgICAgICAgICAgcmV0dXJu
IGF1dG9fcHRyPEltYWdlQnVmZmVyPigpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBi
eXRlc1BlclJvdyAqPSA0OwogICAgIH0KIAotICAgIHZvaWQqIGltYWdlQnVmZmVyID0gdHJ5RmFz
dENhbGxvYyhzaXplLmhlaWdodCgpLCBieXRlc1BlclJvdyk7Ci0gICAgaWYgKCFpbWFnZUJ1ZmZl
cikKLSAgICAgICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPigpOworICAgIG1fZGF0YS5t
X2RhdGEgPSB0cnlGYXN0Q2FsbG9jKHNpemUuaGVpZ2h0KCksIGJ5dGVzUGVyUm93KTsKKyAgICBB
U1NFUlQoKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihtX2RhdGEubV9kYXRhKSAmIDIpID09IDAp
OwogCiAgICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9yU3BhY2UgPSBncmF5U2NhbGUgPyBDR0NvbG9y
U3BhY2VDcmVhdGVEZXZpY2VHcmF5KCkgOiBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsK
LSAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGltYWdl
QnVmZmVyLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIDgsIGJ5dGVzUGVyUm93LAorICAg
IENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUobV9kYXRhLm1f
ZGF0YSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCA4LCBieXRlc1BlclJvdywKICAgICAg
ICAgY29sb3JTcGFjZSwgZ3JheVNjYWxlID8ga0NHSW1hZ2VBbHBoYU5vbmUgOiBrQ0dJbWFnZUFs
cGhhUHJlbXVsdGlwbGllZExhc3QpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoY29sb3JTcGFj
ZSk7Ci0gICAgaWYgKCFjZ0NvbnRleHQpIHsKLSAgICAgICAgZmFzdEZyZWUoaW1hZ2VCdWZmZXIp
OwotICAgICAgICByZXR1cm4gYXV0b19wdHI8SW1hZ2VCdWZmZXI+KCk7Ci0gICAgfQorICAgIGlm
ICghY2dDb250ZXh0KQorICAgICAgICByZXR1cm47CiAKLSAgICBhdXRvX3B0cjxHcmFwaGljc0Nv
bnRleHQ+IGNvbnRleHQobmV3IEdyYXBoaWNzQ29udGV4dChjZ0NvbnRleHQpKTsKLSAgICBjb250
ZXh0LT5zY2FsZShGbG9hdFNpemUoMSwgLTEpKTsKLSAgICBjb250ZXh0LT50cmFuc2xhdGUoMCwg
LXNpemUuaGVpZ2h0KCkpOworICAgIG1fY29udGV4dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dChj
Z0NvbnRleHQpKTsKKyAgICBtX2NvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSgxLCAtMSkpOworICAg
IG1fY29udGV4dC0+dHJhbnNsYXRlKDAsIC1zaXplLmhlaWdodCgpKTsKICAgICBDR0NvbnRleHRS
ZWxlYXNlKGNnQ29udGV4dCk7Ci0gICAgcmV0dXJuIGF1dG9fcHRyPEltYWdlQnVmZmVyPihuZXcg
SW1hZ2VCdWZmZXIoaW1hZ2VCdWZmZXIsIHNpemUsIGNvbnRleHQpKTsKLX0KLQotCi1JbWFnZUJ1
ZmZlcjo6SW1hZ2VCdWZmZXIodm9pZCogaW1hZ2VEYXRhLCBjb25zdCBJbnRTaXplJiBzaXplLCBh
dXRvX3B0cjxHcmFwaGljc0NvbnRleHQ+IGNvbnRleHQpCi0gICAgOiBtX2RhdGEoaW1hZ2VEYXRh
KQotICAgICwgbV9zaXplKHNpemUpCi0gICAgLCBtX2NvbnRleHQoY29udGV4dC5yZWxlYXNlKCkp
Ci17Ci0gICAgQVNTRVJUKChyZWludGVycHJldF9jYXN0PHNpemVfdD4oaW1hZ2VEYXRhKSAmIDIp
ID09IDApOworICAgIHN1Y2Nlc3MgPSB0cnVlOwogfQogCiBJbWFnZUJ1ZmZlcjo6fkltYWdlQnVm
ZmVyKCkKIHsKLSAgICBmYXN0RnJlZShtX2RhdGEpOworICAgIGZhc3RGcmVlKG1fZGF0YS5tX2Rh
dGEpOwogfQogCiBHcmFwaGljc0NvbnRleHQqIEltYWdlQnVmZmVyOjpjb250ZXh0KCkgY29uc3QK
QEAgLTEwOSw5ICsxMDYsNiBAQCBJbWFnZSogSW1hZ2VCdWZmZXI6OmltYWdlKCkgY29uc3QKIAog
UGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEoY29uc3QgSW50
UmVjdCYgcmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIW1fZGF0YSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KICAgICBQYXNzUmVmUHRyPEltYWdlRGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpjcmVhdGUo
cmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKICAgICB1bnNpZ25lZCBjaGFyKiBkYXRhID0g
cmVzdWx0LT5kYXRhKCktPmRhdGEoKS5kYXRhKCk7CiAKQEAgLTE0Myw3ICsxMzcsOCBAQCBQYXNz
UmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YShjb25zdCBJbnRSZWN0
JiByZWN0KSBjb25zdAogICAgIHVuc2lnbmVkIHNyY0J5dGVzUGVyUm93ID0gNCAqIG1fc2l6ZS53
aWR0aCgpOwogICAgIHVuc2lnbmVkIGRlc3RCeXRlc1BlclJvdyA9IDQgKiByZWN0LndpZHRoKCk7
CiAKLSAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25l
ZCBjaGFyKj4obV9kYXRhKSArIG9yaWdpbnkgKiBzcmNCeXRlc1BlclJvdyArIG9yaWdpbnggKiA0
OworICAgIC8vIDo6Y3JlYXRlIGVuc3VyZXMgdGhhdCBhbGwgSW1hZ2VCdWZmZXJzIGhhdmUgdmFs
aWQgZGF0YSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBoZXJlLgorICAgIHVuc2lnbmVk
IGNoYXIqIHNyY1Jvd3MgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2RhdGEu
bV9kYXRhKSArIG9yaWdpbnkgKiBzcmNCeXRlc1BlclJvdyArIG9yaWdpbnggKiA0OwogICAgIHVu
c2lnbmVkIGNoYXIqIGRlc3RSb3dzID0gZGF0YSArIGRlc3R5ICogZGVzdEJ5dGVzUGVyUm93ICsg
ZGVzdHggKiA0OwogICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CiAgICAg
ICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1uczsgeCsrKSB7CkBAIC0xOTQsNyArMTg5
LDcgQEAgdm9pZCBJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBj
b25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb24KICAgICB1bnNpZ25lZCBkZXN0Qnl0ZXNQZXJS
b3cgPSA0ICogbV9zaXplLndpZHRoKCk7CiAKICAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0g
c291cmNlLT5kYXRhKCktPmRhdGEoKS5kYXRhKCkgKyBvcmlnaW55ICogc3JjQnl0ZXNQZXJSb3cg
KyBvcmlnaW54ICogNDsKLSAgICB1bnNpZ25lZCBjaGFyKiBkZXN0Um93cyA9IHJlaW50ZXJwcmV0
X2Nhc3Q8dW5zaWduZWQgY2hhcio+KG1fZGF0YSkgKyBkZXN0eSAqIGRlc3RCeXRlc1BlclJvdyAr
IGRlc3R4ICogNDsKKyAgICB1bnNpZ25lZCBjaGFyKiBkZXN0Um93cyA9IHJlaW50ZXJwcmV0X2Nh
c3Q8dW5zaWduZWQgY2hhcio+KG1fZGF0YS5tX2RhdGEpICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJS
b3cgKyBkZXN0eCAqIDQ7CiAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1Sb3dzOyArK3kpIHsK
ICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1Db2x1bW5zOyB4KyspIHsKICAgICAgICAg
ICAgIGludCBiYXNleCA9IHggKiA0OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jZy9JbWFnZUJ1ZmZlckRhdGEuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cv
SW1hZ2VCdWZmZXJEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2
ZmM0YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1h
Z2VCdWZmZXJEYXRhLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSW1hZ2VC
dWZmZXJEYXRhX2gKKyNkZWZpbmUgSW1hZ2VCdWZmZXJEYXRhX2gKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBJbnRTaXplOworCitjbGFzcyBJbWFnZUJ1ZmZlckRhdGEgeworcHVibGlj
OgorICAgIEltYWdlQnVmZmVyRGF0YShjb25zdCBJbnRTaXplJik7CisKKyAgICB2b2lkKiBtX2Rh
dGE7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIEltYWdlQnVm
ZmVyRGF0YV9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdl
QnVmZmVyRGF0YS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1ZmZlckRh
dGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJkYWJlCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1ZmZlckRhdGEu
aApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBJbWFnZUJ1ZmZlckRhdGFfaAor
I2RlZmluZSBJbWFnZUJ1ZmZlckRhdGFfaAorCisjaW5jbHVkZSA8UVBhaW50ZXI+CisjaW5jbHVk
ZSA8UVBpeG1hcD4KKworI2luY2x1ZGUgIk93blB0ci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIEludFNpemU7CisKK2NsYXNzIEltYWdlQnVmZmVyRGF0YSB7CitwdWJsaWM6Cisg
ICAgSW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmKTsKKworICAgIFFQaXhtYXAgbV9waXht
YXA7CisgICAgT3duUHRyPFFQYWludGVyPiBtX3BhaW50ZXI7Cit9OworCit9ICAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIEltYWdlQnVmZmVyRGF0YV9oCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlQnVmZmVyUXQuY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9xdC9JbWFnZUJ1ZmZlclF0LmNwcAppbmRleCA4OTVhNGM4Li4xNjUw
MmIzIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ltYWdlQnVmZmVy
UXQuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VCdWZmZXJRdC5j
cHAKQEAgLTQxLDI0ICs0MSwyMyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0ZDo6YXV0
b19wdHI8SW1hZ2VCdWZmZXI+IEltYWdlQnVmZmVyOjpjcmVhdGUoY29uc3QgSW50U2l6ZSYgc2l6
ZSwgYm9vbCBncmF5U2NhbGUpCitJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVmZmVyRGF0YShjb25z
dCBJbnRTaXplJiBzaXplKQorICAgIDogbV9waXhtYXAoc2l6ZSkKIHsKLSAgICBRUGl4bWFwIHB4
KHNpemUpOwogICAgIHB4LmZpbGwoUUNvbG9yKFF0Ojp0cmFuc3BhcmVudCkpOwotICAgIHJldHVy
biBzdGQ6OmF1dG9fcHRyPEltYWdlQnVmZmVyPihuZXcgSW1hZ2VCdWZmZXIocHgpKTsKKyAgICBt
X3BhaW50ZXIuc2V0KG5ldyBRUGFpbnRlcigmbV9waXhtYXApKTsKIH0KIAotSW1hZ2VCdWZmZXI6
OkltYWdlQnVmZmVyKGNvbnN0IFFQaXhtYXAmIHB4KQotICAgIDogbV9waXhtYXAocHgpLAotICAg
ICAgbV9wYWludGVyKDApCitJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYg
c2l6ZSwgYm9vbCBncmF5U2NhbGUsIGJvb2wmIHN1Y2Nlc3MpCisgICAgOiBtX3BsYXRmb3JtKHNp
emUpCisgICAgLCBtX3NpemUoc2l6ZSkKIHsKLSAgICBtX3BhaW50ZXIgPSBuZXcgUVBhaW50ZXIo
Jm1fcGl4bWFwKTsKLSAgICBtX2NvbnRleHQuc2V0KG5ldyBHcmFwaGljc0NvbnRleHQobV9wYWlu
dGVyKSk7CisgICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhpY3NDb250ZXh0KHBsYXRmb3JtLm1f
cGFpbnRlcikpOworICAgIHN1Y2Nlc3MgPSB0cnVlOwogfQogCiBJbWFnZUJ1ZmZlcjo6fkltYWdl
QnVmZmVyKCkKIHsKLSAgICBkZWxldGUgbV9wYWludGVyOwogfQogCiBHcmFwaGljc0NvbnRleHQq
IEltYWdlQnVmZmVyOjpjb250ZXh0KCkgY29uc3QK
</data>
<flag name="review"
          id="11298"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>