<?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>60910</bug_id>
          
          <creation_ts>2011-05-16 11:20:04 -0700</creation_ts>
          <short_desc>might need to bundle the functions related to visual word break as a class (VisualWordBreaker)</short_desc>
          <delta_ts>2011-11-04 11:16:40 -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>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>25298</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Xiaomei Ji">xji</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>leviw</cc>
    
    <cc>rniwa</cc>
    
    <cc>vanlam</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>404620</commentid>
    <comment_count>0</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-05-16 11:20:04 -0700</bug_when>
    <thetext>Since some functions (related to visual word break) share the same/similar parameters, we might want to bundle them together as a class (such as VisualWordBreak).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439585</commentid>
    <comment_count>1</comment_count>
      <attachid>101416</attachid>
    <who name="Van Lam">vanlam</who>
    <bug_when>2011-07-19 18:21:18 -0700</bug_when>
    <thetext>Created attachment 101416
Proposed fix</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439590</commentid>
    <comment_count>2</comment_count>
      <attachid>101416</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-19 18:31:06 -0700</bug_when>
    <thetext>Comment on attachment 101416
Proposed fix

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

&gt; Source/WebCore/editing/visible_units.h:99
&gt; +class VisualWordBreakBase {

I don&apos;t think we want to expose this in the header file.

&gt; Source/WebCore/editing/visible_units.h:175
&gt; +class VisualWordBreakWindows : public VisualWordBreakBase {
&gt; +    public:
&gt; +        ~VisualWordBreakWindows() { }
&gt; +        VisiblePosition leftWordPosition(const VisiblePosition&amp; visiblePosition);
&gt; +        VisiblePosition rightWordPosition(const VisiblePosition&amp; visiblePosition);
&gt; +
&gt; +    private:
&gt; +        void collectWordBreaksInBoxInsideBlockWithSameDirectionality();
&gt; +        void collectWordBreaksInBoxInsideBlockWithDifferntDirectionality();
&gt; +        void collectWordBreaksInBox();
&gt; +};

I&apos;m not sure a class hierarchy is the right way to approach this.  I wouldn&apos;t speculatively prepare for other platforms unless we already have some local patch that works on Mac and Unix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439861</commentid>
    <comment_count>3</comment_count>
    <who name="Van Lam">vanlam</who>
    <bug_when>2011-07-20 10:04:39 -0700</bug_when>
    <thetext>Hi Ryosuke. I&apos;ve implemented a Mac/Linux version but thought it would be better to split the refactoring of the Windows version and adding the Mac/Linux version into two patches. And can you clarify why we don&apos;t want to expose the base class definition in the header file? Thanks

(In reply to comment #2)
&gt; (From update of attachment 101416 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=101416&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/visible_units.h:99
&gt; &gt; +class VisualWordBreakBase {
&gt; 
&gt; I don&apos;t think we want to expose this in the header file.
&gt; 
&gt; &gt; Source/WebCore/editing/visible_units.h:175
&gt; &gt; +class VisualWordBreakWindows : public VisualWordBreakBase {
&gt; &gt; +    public:
&gt; &gt; +        ~VisualWordBreakWindows() { }
&gt; &gt; +        VisiblePosition leftWordPosition(const VisiblePosition&amp; visiblePosition);
&gt; &gt; +        VisiblePosition rightWordPosition(const VisiblePosition&amp; visiblePosition);
&gt; &gt; +
&gt; &gt; +    private:
&gt; &gt; +        void collectWordBreaksInBoxInsideBlockWithSameDirectionality();
&gt; &gt; +        void collectWordBreaksInBoxInsideBlockWithDifferntDirectionality();
&gt; &gt; +        void collectWordBreaksInBox();
&gt; &gt; +};
&gt; 
&gt; I&apos;m not sure a class hierarchy is the right way to approach this.  I wouldn&apos;t speculatively prepare for other platforms unless we already have some local patch that works on Mac and Unix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439869</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-20 10:20:39 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Hi Ryosuke. I&apos;ve implemented a Mac/Linux version but thought it would be better to split the refactoring of the Windows version and adding the Mac/Linux version into two patches.

Please upload your work in progress patch somewhere so I can see where you&apos;re headed.

&gt; And can you clarify why we don&apos;t want to expose the base class definition in the header file? Thanks

We should strive to minimize dependency between cpp files as much as possible.  If you put the class declaration in the header file, then compiler have to parse and create AST for every cpp file that includes visbible_units.h.  Also, no other functions in visible_units are class members so this seems like an anti-pattern.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439875</commentid>
    <comment_count>5</comment_count>
      <attachid>101484</attachid>
    <who name="Van Lam">vanlam</who>
    <bug_when>2011-07-20 10:46:09 -0700</bug_when>
    <thetext>Created attachment 101484
Just to show where Mac/Linux version is going</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>439908</commentid>
    <comment_count>6</comment_count>
      <attachid>101416</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-20 12:00:32 -0700</bug_when>
    <thetext>Comment on attachment 101416
Proposed fix

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

&gt; Source/WebCore/editing/visible_units.h:-45
&gt; -VisiblePosition rightWordPosition(const VisiblePosition&amp;);
&gt; -VisiblePosition leftWordPosition(const VisiblePosition&amp;);

How come call sites of these functions are not changed?  I think this is a bad change anyways.  We should expose the internals (i.e. the fact it&apos;s implemented as a class) of rightWordPosition and leftWordPosition to the outside world.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440057</commentid>
    <comment_count>7</comment_count>
      <attachid>101518</attachid>
    <who name="Van Lam">vanlam</who>
    <bug_when>2011-07-20 15:16:47 -0700</bug_when>
    <thetext>Created attachment 101518
Revised fix (now without introducing the class hierarchy)

The patch is still big, but almost every diff in visible_units.cpp can be classified as either:
1) an access to a data member (which was previously passed into the function as an argument)
2) setting a data member for the callee to access
3) a function call in which fewer arguments are passed (because now commonly-passed arguments are saved as data members)
4) labeling previously static functions as member functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440071</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-20 15:51:05 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Created an attachment (id=101518) [details]
&gt; Revised fix (now without introducing the class hierarchy)

It seems like your patch doesn&apos;t apply on ToT WebKit.  Please resolve conflict and upload it again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440080</commentid>
    <comment_count>9</comment_count>
      <attachid>101518</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-20 15:56:38 -0700</bug_when>
    <thetext>Comment on attachment 101518
Revised fix (now without introducing the class hierarchy)

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

&gt; Source/WebCore/editing/FrameSelection.cpp:559
&gt; -        pos = rightWordPosition(VisiblePosition(m_selection.extent(), m_selection.affinity()));
&gt; +        pos = VisualWordBreakWindows().rightWordPosition(VisiblePosition(m_selection.extent(), m_selection.affinity()));

Again, I don&apos;t like the idea is that these two functions hang off of a class unlike all other functions in visible_units.cpp.  r- because of this.

&gt; Source/WebCore/editing/visible_units.h:33
&gt; +#include &quot;VisiblePosition.h&quot;
&gt; +

If we made the class declaration internal to visible_units.cpp then we wouldn&apos;t have to include this new dependency. Header dependencies is a major cause of slow compilation time and we should strive to reduce it as much as possible.  As such, this new dependency further justifies my r-.

&gt; Source/WebCore/editing/visible_units.h:100
&gt; +        ~VisualWordBreakWindows() { }

I&apos;d like to see a constructor that initializes member variables.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440084</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-20 15:58:23 -0700</bug_when>
    <thetext>You can probably add wrapper functions for leftWordPosition and rightWordPosition that instantiate new class and then call appropriate member functions.

But new patch is much better in that there&apos;s no big code moves.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440085</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-20 15:59:15 -0700</bug_when>
    <thetext>Eric and Darin might have some opinions on how to best-refactor these functions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440176</commentid>
    <comment_count>12</comment_count>
      <attachid>101541</attachid>
    <who name="Van Lam">vanlam</who>
    <bug_when>2011-07-20 18:33:13 -0700</bug_when>
    <thetext>Created attachment 101541
Revised fix

Made requested changes; now:

1) leftWordPosition and rightWordPosition are called through non-member wrapper functions of the same names
2) the class definition is in visible_units.cpp; the header file&apos;s dependency on VisiblePosition is removed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440177</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-07-20 18:35:16 -0700</bug_when>
    <thetext>Attachment 101541 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/editing/visible_units.cpp:1193:  The parameter name &quot;visiblePosition&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/editing/visible_units.cpp:1194:  The parameter name &quot;visiblePosition&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440178</commentid>
    <comment_count>14</comment_count>
      <attachid>101542</attachid>
    <who name="Van Lam">vanlam</who>
    <bug_when>2011-07-20 18:40:52 -0700</bug_when>
    <thetext>Created attachment 101542
Revised fix

Fixed the style problem in previous submission.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440461</commentid>
    <comment_count>15</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-07-21 09:58:03 -0700</bug_when>
    <thetext>Maybe put the class in unnamed namespace?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>442459</commentid>
    <comment_count>16</comment_count>
      <attachid>101542</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-26 12:37:05 -0700</bug_when>
    <thetext>Comment on attachment 101542
Revised fix

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

I&apos;m not sure if this patch is an improvement or not.  It appears that all we need is RenderedPosition proposed in https://docs.google.com/document/d/1vzzi_wQHO0GtLnu-1IYutUKbcpAYlHqZwQlwbfLuowM/edit?hl=en_US&amp;authkey=CLOa9cgN

&gt; Source/WebCore/ChangeLog:3
&gt; +        might need to bundle the functions related to visual word break as a class (VisualWordBreaker)

We should get rid of &quot;might need to&quot; from the bug title now that we&apos;re doing it.

&gt; Source/WebCore/editing/visible_units.cpp:1188
&gt; +        static const int s_invalidOffset = -1;

Again, I don&apos;t think we should prefix this constant with &quot;s_&quot; as it&apos;s not a static &quot;variable&quot;.

&gt; Source/WebCore/editing/visible_units.cpp:1190
&gt; +        struct WordBoundaryEntry;

You can just move the definition of WordBoundaryEntry here since it shouldn&apos;t be visible outside of this class.

&gt; Source/WebCore/editing/visible_units.cpp:1521
&gt; +int VisualWordBreakWindows::greatestValueUnder()

Now this function name is very weird.  The greatest value under what?  We need to rename this function so that the semantics will be clear.

&gt; Source/WebCore/editing/visible_units.cpp:1546
&gt; -static int smallestOffsetAbove(int offset, bool boxAndBlockAreInSameDirection, const WordBoundaryVector&amp; orderedWordBoundaries)
&gt; +int VisualWordBreakWindows::smallestOffsetAbove()

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>448176</commentid>
    <comment_count>17</comment_count>
      <attachid>101542</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-08-08 12:27:53 -0700</bug_when>
    <thetext>Comment on attachment 101542
Revised fix

After the discussion with Van in person, I don&apos;t think we need this patch anymore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>496334</commentid>
    <comment_count>18</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-11-04 11:16:40 -0700</bug_when>
    <thetext>we wont go this direction, instead, we will probably use RenderedPosition.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101416</attachid>
            <date>2011-07-19 18:21:18 -0700</date>
            <delta_ts>2011-07-20 15:16:47 -0700</delta_ts>
            <desc>Proposed fix</desc>
            <filename>vanlam-bug60910</filename>
            <type>text/plain</type>
            <size>31710</size>
            <attacher name="Van Lam">vanlam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkxMzIxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTMgQEAKKzIwMTEtMDctMTkgIFZhbiBMYW0g
IDx2YW5sYW1AZ29vZ2xlLmNvbT4KKworICAgICAgICBtaWdodCBuZWVkIHRvIGJ1bmRsZSB0aGUg
ZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdmlzdWFsIHdvcmQgYnJlYWsgYXMgYSBjbGFzcyAoVmlzdWFs
V29yZEJyZWFrZXIpCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD02MDkxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFJlZmFjdG9yZWQgYnkgYnVuZGxpbmcgZnVuY3Rpb25zIGludG8gYSBjbGFzcywgc3Rvcmlu
ZyBmcmVxdWVudGx5CisgICAgICAgIHBhc3NlZCBhcmd1bWVudHMgYXMgZGF0YSBtZW1iZXJzIHRv
IGF2b2lkIGxvbmcgcGFyYW1ldGVyIGxpc3RzLCBhbmQKKyAgICAgICAgaW50cm9kdWNpbmcgYW4g
aW5oZXJpdGFuY2UgaGllcmFyY2h5IGluIGFudGljaXBhdGlvbiBvZiBhIE1hYy9MaW51eAorICAg
ICAgICB2ZXJzaW9uIG9mIHZpc3VhbCB3b3JkIGJyZWFrIChjdXJyZW50IHZlcnNpb24gaXMgZm9y
IFdpbmRvd3MpLgorCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6bW9kaWZ5TW92aW5nUmlnaHQpOgorICAgICAg
ICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmluZ0xlZnQpOgorICAgICAgICAq
IGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3Jk
QnJlYWtCYXNlOjpwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVj
dGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OmxlZnRt
b3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFs
V29yZEJyZWFrQmFzZTo6cmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2spOgorICAg
ICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6bGFzdFdvcmRCcmVha0luQm94KToK
KyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnBvc2l0aW9uSXNWaXN1YWxs
eU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkpOgorICAgICAg
ICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6bmV4dFdvcmRCcmVha0luQm94SW5zaWRl
QmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6Vmlz
dWFsV29yZEJyZWFrQmFzZTo6cHJldmlvdXNXb3JkQm91bmRhcnlJbkJveCk6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpuZXh0V29yZEJvdW5kYXJ5SW5Cb3gpOgorICAg
ICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6dmlzdWFsbHlMYXN0V29yZEJvdW5k
YXJ5SW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6Z3JlYXRl
c3RWYWx1ZVVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnNt
YWxsZXN0T2Zmc2V0QWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFz
ZTo6bGVmdFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtC
YXNlOjpyaWdodFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJl
YWtCYXNlOjpwb3NpdGlvbklzSW5zaWRlQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1l
RGlyZWN0aW9uYWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93
czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9u
YWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93czo6Y29sbGVj
dFdvcmRCcmVha3NJbkJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5k
b3dzOjpsZWZ0V29yZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVh
a1dpbmRvd3M6OnJpZ2h0V29yZFBvc2l0aW9uKToKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVf
dW5pdHMuaDoKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6On5WaXN1YWxX
b3JkQnJlYWtCYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnNl
dFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnNldEJv
eCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpzZXRPZmZzZXQpOgor
ICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6c2V0QmxvY2tEaXJlY3Rpb24p
OgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6cG9zaXRpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6Ym94KToKKyAgICAgICAgKFdlYkNv
cmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6Om9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1
YWxXb3JkQnJlYWtCYXNlOjpibG9ja0RpcmVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpWaXN1
YWxXb3JkQnJlYWtCYXNlOjpXb3JkQm91bmRhcnlFbnRyeTo6V29yZEJvdW5kYXJ5RW50cnkpOgor
ICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6c2V0V29yZEJyZWFrcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjp3b3JkQnJlYWtzKToKKyAgICAg
ICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6On5WaXN1YWxXb3JkQnJlYWtXaW5k
b3dzKToKKwogMjAxMS0wNy0xOSAgSmVzc2llIEJlcmxpbiAgPGpiZXJsaW5AYXBwbGUuY29tPgog
CiAgICAgICAgIEdUSyArIFFUIGJ1aWxkIGZpeC4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvRnJhbWVTZWxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvRnJhbWVTZWxlY3Rpb24uY3BwCShyZXZpc2lvbiA5MDc5NSkKKysrIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NTYsNyArNTU2
LDcgQEAgVmlzaWJsZVBvc2l0aW9uIEZyYW1lU2VsZWN0aW9uOjptb2RpZnlNbwogICAgICAgICBw
b3MgPSByaWdodEJvdW5kYXJ5T2ZMaW5lKHN0YXJ0Rm9yUGxhdGZvcm0oKSwgZGlyZWN0aW9uT2ZF
bmNsb3NpbmdCbG9jaygpKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXZWJLaXRWaXN1YWxX
b3JkR3JhbnVsYXJpdHk6Ci0gICAgICAgIHBvcyA9IHJpZ2h0V29yZFBvc2l0aW9uKFZpc2libGVQ
b3NpdGlvbihtX3NlbGVjdGlvbi5leHRlbnQoKSwgbV9zZWxlY3Rpb24uYWZmaW5pdHkoKSkpOwor
ICAgICAgICBwb3MgPSBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzKCkucmlnaHRXb3JkUG9zaXRpb24o
VmlzaWJsZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3NlbGVjdGlvbi5hZmZpbml0
eSgpKSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gcG9zOwpAQCAtNzI3LDcg
KzcyNyw3IEBAIFZpc2libGVQb3NpdGlvbiBGcmFtZVNlbGVjdGlvbjo6bW9kaWZ5TW8KICAgICAg
ICAgcG9zID0gbGVmdEJvdW5kYXJ5T2ZMaW5lKHN0YXJ0Rm9yUGxhdGZvcm0oKSwgZGlyZWN0aW9u
T2ZFbmNsb3NpbmdCbG9jaygpKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXZWJLaXRWaXN1
YWxXb3JkR3JhbnVsYXJpdHk6Ci0gICAgICAgIHBvcyA9IGxlZnRXb3JkUG9zaXRpb24oVmlzaWJs
ZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3NlbGVjdGlvbi5hZmZpbml0eSgpKSk7
CisgICAgICAgIHBvcyA9IFZpc3VhbFdvcmRCcmVha1dpbmRvd3MoKS5sZWZ0V29yZFBvc2l0aW9u
KFZpc2libGVQb3NpdGlvbihtX3NlbGVjdGlvbi5leHRlbnQoKSwgbV9zZWxlY3Rpb24uYWZmaW5p
dHkoKSkpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIHBvczsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAkocmV2aXNpb24gOTA3OTUpCisr
KyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xMTcxLDEwICsxMTcxLDEwIEBAIFZpc2libGVQb3NpdGlvbiByaWdodEJvdW5kYXJ5T2ZM
aW5lKGNvbnMKICAgICByZXR1cm4gZGlyZWN0aW9uID09IExUUiA/IGxvZ2ljYWxFbmRPZkxpbmUo
YykgOiBsb2dpY2FsU3RhcnRPZkxpbmUoYyk7CiB9CiAKLXN0YXRpYyBjb25zdCBpbnQgaW52YWxp
ZE9mZnNldCA9IC0xOwotCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFr
SW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoY29uc3QgSW5saW5lQm94KiBi
b3gsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0
T2ZXb3JkQnJlYWspCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrQmFzZTo6cHJldmlv
dXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShjb25zdCBW
aXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFr
KQogeworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisKICAgICAvLyBJbiBhIExU
UiBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5IG9m
IGEgd29yZC4KICAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJl
IG9uIHRoZSByaWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCiAgICAgLy8gQmVjYXVzZSBuZXh0V29y
ZFBvc2l0aW9uKCkgcmV0dXJucyB0aGUgd29yZCBicmVhayBvbiB0aGUgcmlnaHQgYm91bmRhcnkg
b2YgdGhlIHdvcmQgZm9yIExUUiB0ZXh0LApAQCAtMTIyMyw4ICsxMjIzLDEwIEBAIHN0YXRpYyBW
aXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJlYWsKICAgICByZXR1cm4gd29yZEJyZWFrOwog
fQogCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRS
QmxvY2soY29uc3QgSW5saW5lQm94KiBib3gpCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJy
ZWFrQmFzZTo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jaygpCiB7CisgICAgSW5s
aW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwogICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVk
IHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KICAgICBOb2RlKiBub2RlID0gYm94LT5y
ZW5kZXJlcigpLT5ub2RlKCk7CiAgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnBy
ZXZMZWFmQ2hpbGQoKTsKQEAgLTEyNDgsOCArMTI1MCwxMCBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0
aW9uIGxlZnRtb3N0UG9zaXRpb25JCiAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2Fy
ZXRNaW5PZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CiB9CiAK
LXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxv
Y2soY29uc3QgSW5saW5lQm94KiBib3gpCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFr
QmFzZTo6cmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soKQogeworICAgIElubGlu
ZUJveCogYm94ID0gaW5saW5lQm94KCk7CisKICAgICAvLyBGSVhNRTogUHJvYmFibHkgbmVlZCB0
byB0YWtlIGNhcmUgb2YgYmlkaSBsZXZlbCB0b28uCiAgICAgTm9kZSogbm9kZSA9IGJveC0+cmVu
ZGVyZXIoKS0+bm9kZSgpOwogICAgIElubGluZUJveCogcHJldmlvdXNMZWFmID0gYm94LT5wcmV2
TGVhZkNoaWxkKCk7CkBAIC0xMjczLDE2ICsxMjc3LDE4IEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRp
b24gcmlnaHRtb3N0UG9zaXRpb24KICAgICByZXR1cm4gUG9zaXRpb24obm9kZSwgYm94LT5jYXJl
dE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKIH0KICAg
ICAKLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGFzdFdvcmRCcmVha0luQm94KGNvbnN0IElubGlu
ZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQorVmlzaWJsZVBvc2l0aW9uIFZpc3Vh
bFdvcmRCcmVha0Jhc2U6Omxhc3RXb3JkQnJlYWtJbkJveChpbnQmIG9mZnNldE9mV29yZEJyZWFr
KQogeworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisKICAgICAvLyBBZGQgdGhl
IGxlZnRtb3N0IHdvcmQgYnJlYWsgZm9yIFJUTCBib3ggb3IgcmlnaHRtb3N0IHdvcmQgYnJlYWsg
Zm9yIExUUiBib3guCiAgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFm
Q2hpbGQoKTsKICAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7
CiAgICAgVmlzaWJsZVBvc2l0aW9uIGJvdW5kYXJ5UG9zaXRpb247CiAgICAgaWYgKGJveC0+ZGly
ZWN0aW9uKCkgPT0gUlRMICYmICghcHJldmlvdXNMZWFmIHx8IHByZXZpb3VzTGVhZi0+aXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpKSkKLSAgICAgICAgYm91bmRhcnlQb3NpdGlvbiA9IGxlZnRtb3N0
UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2soYm94KTsKKyAgICAgICAgYm91bmRhcnlQb3NpdGlv
biA9IGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2soKTsKICAgICBlbHNlIGlmIChi
b3gtPmRpcmVjdGlvbigpID09IExUUiAmJiAoIW5leHRMZWFmIHx8ICFuZXh0TGVhZi0+aXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpKSkKLSAgICAgICAgYm91bmRhcnlQb3NpdGlvbiA9IHJpZ2h0bW9z
dFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKGJveCk7CisgICAgICAgIGJvdW5kYXJ5UG9zaXRp
b24gPSByaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9jaygpOwogCiAgICAgaWYgKGJv
dW5kYXJ5UG9zaXRpb24uaXNOdWxsKCkpCiAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24o
KTsgICAgICAgICAgICAKQEAgLTEyOTgsMTkgKzEzMDQsMjEgQEAgc3RhdGljIFZpc2libGVQb3Np
dGlvbiBsYXN0V29yZEJyZWFrSW5CbwogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsgICAg
CiB9CiAKLXN0YXRpYyBib29sIHBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tX
aXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJl
YWssIGNvbnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQorYm9vbCBW
aXN1YWxXb3JkQnJlYWtCYXNlOjpwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJsb2Nr
V2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29yZEJy
ZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQogewogICAgIGludCBwcmV2aW91c09mZnNldCA9
IG9mZnNldE9mV29yZEJyZWFrOwogICAgIElubGluZUJveCogYm94T2ZXb3JkQnJlYWs7CiAgICAg
d29yZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVhaywgb2Zmc2V0T2ZX
b3JkQnJlYWspOwotICAgIGlmIChib3hPZldvcmRCcmVhayA9PSBib3ggJiYgKHByZXZpb3VzT2Zm
c2V0ID09IGludmFsaWRPZmZzZXQgfHwgcHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVh
aykpCisgICAgaWYgKGJveE9mV29yZEJyZWFrID09IGlubGluZUJveCgpICYmIChwcmV2aW91c09m
ZnNldCA9PSBzX2ludmFsaWRPZmZzZXQgfHwgcHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRC
cmVhaykpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIHJldHVybiBmYWxzZTsKIH0KLSAgICAK
LXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRo
RGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoCi0gICAgY29uc3QgSW5saW5lQm94KiBib3gsIGNvbnN0
IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJl
YWssIGJvb2wmIGlzTGFzdFdvcmRCcmVha0luQm94KQorCitWaXNpYmxlUG9zaXRpb24gVmlzdWFs
V29yZEJyZWFrQmFzZTo6bmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50
RGlyZWN0aW9uYWxpdHkoCisgICAgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRC
cmVhaywgaW50JiBvZmZzZXRPZldvcmRCcmVhaywgYm9vbCYgaXNMYXN0V29yZEJyZWFrSW5Cb3gp
CiB7CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwogICAgIC8vIEZJWE1FOiBQ
cm9iYWJseSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KICAgICAKICAgICAv
LyBJbiBhIExUUiBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJv
dW5kYXJ5IG9mIGEgd29yZC4KQEAgLTEzMjksMjEwICsxMzM3LDIzMCBAQCBzdGF0aWMgVmlzaWJs
ZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJvCiAgICAgLy8gU3RhcnQgYXQgb2Zmc2V0IDAsIHRo
ZSBmaXJzdCB3b3JkIGJyZWFrIGlzIGF0IG9mZnNldCAzLCB0aGUgMm5kIHdvcmQgYnJlYWsgaXMg
YXQgb2Zmc2V0IDcsIGFuZCB0aGUgM3JkIHdvcmQgYnJlYWsgc2hvdWxkIGJlIGF0IG9mZnNldCAw
LgogICAgIC8vIEJ1dCBuZXh0V29yZFBvc2l0aW9uKCkgb2Ygb2Zmc2V0IDcgaXMgb2Zmc2V0IDEx
LCB3aGljaCBzaG91bGQgYmUgaWdub3JlZCwgCiAgICAgLy8gYW5kIHRoZSBwb3NpdGlvbiBhdCBv
ZmZzZXQgMCBzaG91bGQgYmUgbWFudWFsbHkgYWRkZWQgYXMgdGhlIGxhc3Qgd29yZCBicmVhayB3
aXRoaW4gdGhlIGJveC4KLSAgICBpZiAod29yZEJyZWFrICE9IHByZXZpb3VzV29yZEJyZWFrICYm
IHBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0
aW9uYWxpdHkod29yZEJyZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKSkgeworICAgIGlmICh3
b3JkQnJlYWsgIT0gcHJldmlvdXNXb3JkQnJlYWsgJiYgcG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJl
ZEluQm94SW5CbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSh3b3JkQnJlYWssIG9mZnNl
dE9mV29yZEJyZWFrKSkgewogICAgICAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IGZhbHNlOwog
ICAgICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIH0KICAgICAKICAgICBpc0xhc3RXb3JkQnJl
YWtJbkJveCA9IHRydWU7Ci0gICAgcmV0dXJuIGxhc3RXb3JkQnJlYWtJbkJveChib3gsIG9mZnNl
dE9mV29yZEJyZWFrKTsKKyAgICByZXR1cm4gbGFzdFdvcmRCcmVha0luQm94KG9mZnNldE9mV29y
ZEJyZWFrKTsKIH0KIAotc3RydWN0IFdvcmRCb3VuZGFyeUVudHJ5IHsKLSAgICBXb3JkQm91bmRh
cnlFbnRyeSgpCi0gICAgICAgIDogb2Zmc2V0SW5JbmxpbmVCb3goaW52YWxpZE9mZnNldCkgCi0g
ICAgeyAKLSAgICB9Ci0KLSAgICBXb3JkQm91bmRhcnlFbnRyeShjb25zdCBWaXNpYmxlUG9zaXRp
b24mIHBvc2l0aW9uLCBpbnQgb2Zmc2V0KQotICAgICAgICA6IHZpc2libGVQb3NpdGlvbihwb3Np
dGlvbikKLSAgICAgICAgLCBvZmZzZXRJbklubGluZUJveChvZmZzZXQpIAotICAgIHsgCi0gICAg
fQotCi0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbjsKLSAgICBpbnQgb2Zmc2V0
SW5JbmxpbmVCb3g7Ci19OwotICAgIAotdHlwZWRlZiBWZWN0b3I8V29yZEJvdW5kYXJ5RW50cnks
IDUwPiBXb3JkQm91bmRhcnlWZWN0b3I7Ci0gICAgCi1zdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJy
ZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGNvbnN0IElubGluZUJv
eCogYm94LCBXb3JkQm91bmRhcnlWZWN0b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcykKK1Zpc2li
bGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtCYXNlOjpwcmV2aW91c1dvcmRCb3VuZGFyeUluQm94
KCkKIHsKLSAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMuY2xlYXIoKTsKLSAgICAKLSAgICBWaXNp
YmxlUG9zaXRpb24gd29yZEJyZWFrOwotICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IGludmFs
aWRPZmZzZXQ7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNX
b3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIHdvcmRC
cmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwotICAgICAgICBpZiAod29yZEJyZWFrLmlzTnVsbCgp
KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5IHdvcmRCb3Vu
ZGFyeUVudHJ5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwotICAgICAgICBvcmRlcmVk
V29yZEJvdW5kYXJpZXMuYXBwZW5kKHdvcmRCb3VuZGFyeUVudHJ5KTsKLSAgICB9Ci19CisgICAg
aW50IGN1cnJlbnRPZmZzZXQgPSBvZmZzZXQoKTsKIAotc3RhdGljIHZvaWQgY29sbGVjdFdvcmRC
cmVha3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoY29uc3QgSW5s
aW5lQm94KiBib3gsIFdvcmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKQot
ewotICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy5jbGVhcigpOwotICAgIAotICAgIFZpc2libGVQ
b3NpdGlvbiB3b3JkQnJlYWs7Ci0gICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gaW52YWxpZE9m
ZnNldDsKLSAgICBib29sIGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFsc2U7Ci0gICAgd2hpbGUg
KDEpIHsKLSAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tX
aXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoYm94LCB3b3JkQnJlYWssIG9mZnNldE9mV29yZEJy
ZWFrLCBpc0xhc3RXb3JkQnJlYWtJbkJveCk7Ci0gICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3RO
dWxsKCkpIHsKLSAgICAgICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5
KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwotICAgICAgICAgICAgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzLmFwcGVuZCh3b3JkQm91bmRhcnlFbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKGlzTGFzdFdvcmRCcmVha0luQm94KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQot
Ci1zdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94KGNvbnN0IElubGluZUJveCogYm94
LCBXb3JkQm91bmRhcnlWZWN0b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcywgVGV4dERpcmVjdGlv
biBibG9ja0RpcmVjdGlvbikKLXsKLSAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9ja0Rp
cmVjdGlvbikKLSAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNh
bWVEaXJlY3Rpb25hbGl0eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7Ci0gICAgZWxzZQot
ICAgICAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVybnREaXJl
Y3Rpb25hbGl0eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7ICAgICAgICAKLX0KLSAgICAK
LXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveChjb25zdCBJ
bmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCkKLXsKICAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsg
PSAwOwogICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7CiAgICAgd2hpbGUgKHRydWUpIHsK
LSAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0
aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwor
ICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRo
U2FtZURpcmVjdGlvbmFsaXR5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwogICAgICAg
ICBpZiAod29yZEJyZWFrLmlzTnVsbCgpKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlm
IChvZmZzZXQgPT0gaW52YWxpZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBvZmZzZXQp
CisgICAgICAgIGlmIChjdXJyZW50T2Zmc2V0ID09IHNfaW52YWxpZE9mZnNldCB8fCBvZmZzZXRP
ZldvcmRCcmVhayAhPSBjdXJyZW50T2Zmc2V0KQogICAgICAgICAgICAgcmV0dXJuIHdvcmRCcmVh
azsKICAgICB9ICAgICAgICAKICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAKLXN0
YXRpYyBWaXNpYmxlUG9zaXRpb24gbmV4dFdvcmRCb3VuZGFyeUluQm94KGNvbnN0IElubGluZUJv
eCogYm94LCBpbnQgb2Zmc2V0KQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha0Jhc2U6
Om5leHRXb3JkQm91bmRhcnlJbkJveCgpCiB7CisgICAgaW50IGN1cnJlbnRPZmZzZXQgPSBvZmZz
ZXQoKTsKKwogICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IDA7CiAgICAgVmlzaWJsZVBvc2l0
aW9uIHdvcmRCcmVhazsKICAgICBib29sIGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFsc2U7CiAg
ICAgZG8gewotICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9j
a1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3Jk
QnJlYWssIGlzTGFzdFdvcmRCcmVha0luQm94KTsKLSAgICAgICAgaWYgKHdvcmRCcmVhay5pc05v
dE51bGwoKSAmJiAob2Zmc2V0ID09IGludmFsaWRPZmZzZXQgfHwgb2Zmc2V0T2ZXb3JkQnJlYWsg
IT0gb2Zmc2V0KSkKKyAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRCcmVha0luQm94SW5zaWRl
QmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBvZmZzZXRPZldvcmRC
cmVhaywgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOworICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90
TnVsbCgpICYmIChjdXJyZW50T2Zmc2V0ID09IHNfaW52YWxpZE9mZnNldCB8fCBvZmZzZXRPZldv
cmRCcmVhayAhPSBjdXJyZW50T2Zmc2V0KSkKICAgICAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7
CiAgICAgfSB3aGlsZSAoIWlzTGFzdFdvcmRCcmVha0luQm94KTsgICAgICAgCiAgICAgcmV0dXJu
IFZpc2libGVQb3NpdGlvbigpOwogfQogICAgIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiB2aXN1
YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNl
dCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxX
b3JkQnJlYWtCYXNlOjp2aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveCgpCiB7CiAgICAgV29y
ZEJvdW5kYXJ5VmVjdG9yIG9yZGVyZWRXb3JkQm91bmRhcmllczsKLSAgICBjb2xsZWN0V29yZEJy
ZWFrc0luQm94KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLCBibG9ja0RpcmVjdGlvbik7Cisg
ICAgc2V0V29yZEJyZWFrcygmb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBjb2xsZWN0V29y
ZEJyZWFrc0luQm94KCk7CisgICAgCiAgICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6
ZSgpKSAKICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwotICAgIGlmIChvZmZzZXQg
PT0gaW52YWxpZE9mZnNldCB8fCBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzLnNpemUoKSAtIDFdLm9mZnNldEluSW5saW5lQm94ICE9IG9mZnNldCkKKyAgICBpZiAo
b2Zmc2V0KCkgPT0gc19pbnZhbGlkT2Zmc2V0IHx8IG9yZGVyZWRXb3JkQm91bmRhcmllc1tvcmRl
cmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMV0ub2Zmc2V0SW5JbmxpbmVCb3ggIT0gb2Zmc2V0
KCkpCiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzLnNpemUoKSAtIDFdLnZpc2libGVQb3NpdGlvbjsKICAgICBpZiAob3JkZXJlZFdvcmRC
b3VuZGFyaWVzLnNpemUoKSA+IDEpCiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJp
ZXNbb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSAtIDJdLnZpc2libGVQb3NpdGlvbjsKICAg
ICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAgICAgICAgIAotc3RhdGljIGludCBncmVh
dGVzdFZhbHVlVW5kZXIoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURpcmVj
dGlvbiwgY29uc3QgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCitp
bnQgVmlzdWFsV29yZEJyZWFrQmFzZTo6Z3JlYXRlc3RWYWx1ZVVuZGVyKCkKIHsKLSAgICBpZiAo
IW9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiBpbnZhbGlkT2Zm
c2V0OworICAgIFdvcmRCb3VuZGFyeVZlY3Rvciogb3JkZXJlZFdvcmRCb3VuZGFyaWVzID0gd29y
ZEJyZWFrcygpOworICAgIGludCBjdXJyZW50T2Zmc2V0ID0gb2Zmc2V0KCk7CisKKyAgICBpZiAo
IW9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpKQorICAgICAgICByZXR1cm4gc19pbnZhbGlk
T2Zmc2V0OwogICAgIC8vIEZJWE1FOiBiaW5hcnkgc2VhcmNoLgotICAgIGlmIChib3hBbmRCbG9j
a0FyZUluU2FtZURpcmVjdGlvbikgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAob3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzW2ldLm9mZnNldEluSW5saW5lQm94IDwgb2Zmc2V0KQorICAgIGlm
IChpbmxpbmVCb3goKS0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tEaXJlY3Rpb24oKSkgeworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCk7
ICsraSkgeworICAgICAgICAgICAgaWYgKCgqb3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5vZmZz
ZXRJbklubGluZUJveCA8IGN1cnJlbnRPZmZzZXQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7
CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgICAgIHJldHVy
biBzX2ludmFsaWRPZmZzZXQ7CiAgICAgfQotICAgIGZvciAoaW50IGkgPSBvcmRlcmVkV29yZEJv
dW5kYXJpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgaWYgKG9yZGVyZWRX
b3JkQm91bmRhcmllc1tpXS5vZmZzZXRJbklubGluZUJveCA8IG9mZnNldCkKKyAgICBmb3IgKGlu
dCBpID0gb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewor
ICAgICAgICBpZiAoKCpvcmRlcmVkV29yZEJvdW5kYXJpZXMpW2ldLm9mZnNldEluSW5saW5lQm94
IDwgY3VycmVudE9mZnNldCkKICAgICAgICAgICAgIHJldHVybiBpOwogICAgIH0KLSAgICByZXR1
cm4gaW52YWxpZE9mZnNldDsKKyAgICByZXR1cm4gc19pbnZhbGlkT2Zmc2V0OwogfQogCi1zdGF0
aWMgaW50IHNtYWxsZXN0T2Zmc2V0QWJvdmUoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0Fy
ZUluU2FtZURpcmVjdGlvbiwgY29uc3QgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJv
dW5kYXJpZXMpCitpbnQgVmlzdWFsV29yZEJyZWFrQmFzZTo6c21hbGxlc3RPZmZzZXRBYm92ZSgp
CiB7Ci0gICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpKQotICAgICAgICByZXR1
cm4gaW52YWxpZE9mZnNldDsKKyAgICBXb3JkQm91bmRhcnlWZWN0b3IqIG9yZGVyZWRXb3JkQm91
bmRhcmllcyA9IHdvcmRCcmVha3MoKTsKKyAgICBpbnQgY3VycmVudE9mZnNldCA9IG9mZnNldCgp
OworCisgICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJpZXMtPnNpemUoKSkKKyAgICAgICAgcmV0
dXJuIHNfaW52YWxpZE9mZnNldDsKICAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KLSAgICBp
ZiAoYm94QW5kQmxvY2tBcmVJblNhbWVEaXJlY3Rpb24pIHsKLSAgICAgICAgZm9yIChpbnQgaSA9
IG9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAg
ICAgICAgaWYgKG9yZGVyZWRXb3JkQm91bmRhcmllc1tpXS5vZmZzZXRJbklubGluZUJveCA+IG9m
ZnNldCkKKyAgICBpZiAoaW5saW5lQm94KCktPmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9u
KCkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgp
IC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIGlmICgoKm9yZGVyZWRXb3JkQm91bmRh
cmllcylbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPiBjdXJyZW50T2Zmc2V0KQogICAgICAgICAgICAg
ICAgIHJldHVybiBpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0Owor
ICAgICAgICByZXR1cm4gc19pbnZhbGlkT2Zmc2V0OwogICAgIH0KLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
IGlmIChvcmRlcmVkV29yZEJvdW5kYXJpZXNbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPiBvZmZzZXQp
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCgqb3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5vZmZz
ZXRJbklubGluZUJveCA+IGN1cnJlbnRPZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gaTsKICAg
ICB9Ci0gICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgcmV0dXJuIHNfaW52YWxpZE9mZnNl
dDsKIH0KIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZEJvdW5kYXJ5KGNvbnN0IElu
bGluZUJveCogYm94LCBpbnQgb2Zmc2V0LCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQor
VmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha0Jhc2U6OmxlZnRXb3JkQm91bmRhcnkoKQog
eworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisgICAgaW50IGN1cnJlbnRPZmZz
ZXQgPSBvZmZzZXQoKTsKKyAgICBUZXh0RGlyZWN0aW9uIGN1cnJlbnRCbG9ja0RpcmVjdGlvbiA9
IGJsb2NrRGlyZWN0aW9uKCk7CisgICAgCiAgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhazsK
LSAgICBmb3IgIChjb25zdCBJbmxpbmVCb3gqIGFkamFjZW50Qm94ID0gYm94OyBhZGphY2VudEJv
eDsgYWRqYWNlbnRCb3ggPSBhZGphY2VudEJveC0+cHJldkxlYWZDaGlsZCgpKSB7Ci0gICAgICAg
IGlmIChibG9ja0RpcmVjdGlvbiA9PSBMVFIpIHsKKyAgICBmb3IgKElubGluZUJveCogYWRqYWNl
bnRCb3ggPSBib3g7IGFkamFjZW50Qm94OyBhZGphY2VudEJveCA9IGFkamFjZW50Qm94LT5wcmV2
TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgc2V0SW5saW5lQm94KGFkamFjZW50Qm94KTsKKyAgICAg
ICAgc2V0T2Zmc2V0KGFkamFjZW50Qm94ID09IGJveCA/IGN1cnJlbnRPZmZzZXQgOiBzX2ludmFs
aWRPZmZzZXQpOworICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoY3VycmVudEJsb2NrRGly
ZWN0aW9uID09IExUUikgewogICAgICAgICAgICAgaWYgKGFkamFjZW50Qm94LT5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCkpIAotICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29y
ZEJvdW5kYXJ5SW5Cb3goYWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6
IGludmFsaWRPZmZzZXQpOworICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29y
ZEJvdW5kYXJ5SW5Cb3goKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3b3Jk
QnJlYWsgPSBuZXh0V29yZEJvdW5kYXJ5SW5Cb3goYWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09
IGJveCA/IG9mZnNldCA6IGludmFsaWRPZmZzZXQpOwotICAgICAgICB9IGVsc2UgCi0gICAgICAg
ICAgICB3b3JkQnJlYWsgPSB2aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveChhZGphY2VudEJv
eCwgYWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0IDogaW52YWxpZE9mZnNldCwgYmxvY2tEaXJl
Y3Rpb24pOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3Jk
Qm91bmRhcnlJbkJveCgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9
IHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFyeUluQm94KCk7ICAgICAgICAgICAgCiAgICAgICAgIGlm
ICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkpCiAgICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOwog
ICAgIH0KICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAgCi1zdGF0aWMgVmlzaWJs
ZVBvc2l0aW9uIHJpZ2h0V29yZEJvdW5kYXJ5KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zm
c2V0LCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQorVmlzaWJsZVBvc2l0aW9uIFZpc3Vh
bFdvcmRCcmVha0Jhc2U6OnJpZ2h0V29yZEJvdW5kYXJ5KCkKIHsKKyAgICBJbmxpbmVCb3gqIGJv
eCA9IGlubGluZUJveCgpOworICAgIGludCBjdXJyZW50T2Zmc2V0ID0gb2Zmc2V0KCk7CisgICAg
VGV4dERpcmVjdGlvbiBjdXJyZW50QmxvY2tEaXJlY3Rpb24gPSBibG9ja0RpcmVjdGlvbigpOwog
ICAgIAogICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7Ci0gICAgZm9yIChjb25zdCBJbmxp
bmVCb3gqIGFkamFjZW50Qm94ID0gYm94OyBhZGphY2VudEJveDsgYWRqYWNlbnRCb3ggPSBhZGph
Y2VudEJveC0+bmV4dExlYWZDaGlsZCgpKSB7Ci0gICAgICAgIGlmIChibG9ja0RpcmVjdGlvbiA9
PSBSVEwpIHsKKyAgICBmb3IgKElubGluZUJveCogYWRqYWNlbnRCb3ggPSBib3g7IGFkamFjZW50
Qm94OyBhZGphY2VudEJveCA9IGFkamFjZW50Qm94LT5uZXh0TGVhZkNoaWxkKCkpIHsKKyAgICAg
ICAgc2V0SW5saW5lQm94KGFkamFjZW50Qm94KTsKKyAgICAgICAgc2V0T2Zmc2V0KGFkamFjZW50
Qm94ID09IGJveCA/IGN1cnJlbnRPZmZzZXQgOiBzX2ludmFsaWRPZmZzZXQpOworICAgICAgICAK
KyAgICAgICAgaWYgKGN1cnJlbnRCbG9ja0RpcmVjdGlvbiA9PSBSVEwpIHsKICAgICAgICAgICAg
IGlmIChhZGphY2VudEJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQotICAgICAgICAgICAg
ICAgIHdvcmRCcmVhayA9IG5leHRXb3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNl
bnRCb3ggPT0gYm94ID8gb2Zmc2V0IDogaW52YWxpZE9mZnNldCk7CisgICAgICAgICAgICAgICAg
d29yZEJyZWFrID0gbmV4dFdvcmRCb3VuZGFyeUluQm94KCk7CiAgICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveChhZGph
Y2VudEJveCwgYWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0IDogaW52YWxpZE9mZnNldCk7Cisg
ICAgICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveCgpOwog
ICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICB3b3JkQnJlYWsgPSB2aXN1YWxseUxhc3RXb3Jk
Qm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0IDog
aW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOyAgICAgICAgICAgIAorICAgICAgICAgICAg
d29yZEJyZWFrID0gdmlzdWFsbHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goKTsgICAgICAgICAgICAK
ICAgICAgICAgaWYgKCF3b3JkQnJlYWsuaXNOdWxsKCkpCiAgICAgICAgICAgICByZXR1cm4gd29y
ZEJyZWFrOwogICAgIH0KICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAgICAgCi1z
dGF0aWMgYm9vbCBwb3NpdGlvbklzSW5zaWRlQm94KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29y
ZEJyZWFrLCBjb25zdCBJbmxpbmVCb3gqIGJveCkKK2Jvb2wgVmlzdWFsV29yZEJyZWFrQmFzZTo6
cG9zaXRpb25Jc0luc2lkZUJveChjb25zdCBWaXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaykKIHsK
KyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworCiAgICAgSW5saW5lQm94KiBib3hP
ZldvcmRCcmVhazsKICAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWs7CiAgICAgd29yZEJyZWFrLmdl
dElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwog
ICAgIHJldHVybiBib3ggPT0gYm94T2ZXb3JkQnJlYWsgJiYgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0g
Ym94LT5jYXJldE1heE9mZnNldCgpICYmIG9mZnNldE9mV29yZEJyZWFrICE9IGJveC0+Y2FyZXRN
aW5PZmZzZXQoKTsKIH0KIAotVmlzaWJsZVBvc2l0aW9uIGxlZnRXb3JkUG9zaXRpb24oY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24pCisvLyBXaW5kb3dzIHZlcnNpb24gc3Rh
cnRzIGhlcmUKKwordm9pZCBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpjb2xsZWN0V29yZEJyZWFr
c0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KCkKK3sKKyAgICBXb3JkQm91
bmRhcnlWZWN0b3IqIG9yZGVyZWRXb3JkQm91bmRhcmllcyA9IHdvcmRCcmVha3MoKTsKKyAgICBv
cmRlcmVkV29yZEJvdW5kYXJpZXMtPmNsZWFyKCk7CisgICAgCisgICAgVmlzaWJsZVBvc2l0aW9u
IHdvcmRCcmVhazsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSBzX2ludmFsaWRPZmZzZXQ7
CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJ
bkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eSh3b3JkQnJlYWssIG9mZnNldE9m
V29yZEJyZWFrKTsKKyAgICAgICAgaWYgKHdvcmRCcmVhay5pc051bGwoKSkKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBXb3JkQm91bmRhcnlFbnRyeSB3b3JkQm91bmRhcnlFbnRyeSh3b3Jk
QnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVz
LT5hcHBlbmQod29yZEJvdW5kYXJ5RW50cnkpOworICAgIH0KK30KKwordm9pZCBWaXN1YWxXb3Jk
QnJlYWtXaW5kb3dzOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVy
bnREaXJlY3Rpb25hbGl0eSgpCit7CisgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMgPSB3b3JkQnJlYWtzKCk7CisgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5j
bGVhcigpOworICAgIAorICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7CisgICAgaW50IG9m
ZnNldE9mV29yZEJyZWFrID0gc19pbnZhbGlkT2Zmc2V0OworICAgIGJvb2wgaXNMYXN0V29yZEJy
ZWFrSW5Cb3ggPSBmYWxzZTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB3b3JkQnJlYWsgPSBu
ZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSh3
b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBpc0xhc3RXb3JkQnJlYWtJbkJveCk7CisgICAg
ICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkpIHsKKyAgICAgICAgICAgIFdvcmRCb3VuZGFy
eUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwor
ICAgICAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5hcHBlbmQod29yZEJvdW5kYXJ5RW50
cnkpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0xhc3RXb3JkQnJlYWtJbkJveCkKKyAgICAg
ICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpj
b2xsZWN0V29yZEJyZWFrc0luQm94KCkKK3sKKyAgICBpZiAoaW5saW5lQm94KCktPmRpcmVjdGlv
bigpID09IGJsb2NrRGlyZWN0aW9uKCkpCisgICAgICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJ
bnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoKTsKKyAgICBlbHNlCisgICAgICAgIGNv
bGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJudERpcmVjdGlvbmFsaXR5
KCk7ICAgICAgICAKK30KKworVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6
OmxlZnRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24p
CiB7CiAgICAgSW5saW5lQm94KiBib3g7CiAgICAgaW50IG9mZnNldDsKICAgICB2aXNpYmxlUG9z
aXRpb24uZ2V0SW5saW5lQm94QW5kT2Zmc2V0KGJveCwgb2Zmc2V0KTsKICAgICBUZXh0RGlyZWN0
aW9uIGJsb2NrRGlyZWN0aW9uID0gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayh2aXNpYmxlUG9z
aXRpb24uZGVlcEVxdWl2YWxlbnQoKSk7CiAgICAgCisgICAgc2V0SW5saW5lQm94KGJveCk7Cisg
ICAgc2V0T2Zmc2V0KG9mZnNldCk7CisgICAgc2V0QmxvY2tEaXJlY3Rpb24oYmxvY2tEaXJlY3Rp
b24pOworICAgIAogICAgIC8vIEZJWE1FOiBJZiB0aGUgYm94J3MgZGlyZWN0aW9uYWxpdHkgaXMg
dGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgZW5jbG9zaW5nIGJsb2NrLCB3aGVuIHRoZSBvZmZzZXQg
aXMgYXQgdGhlIGJveCBib3VuZGFyeQogICAgIC8vIGFuZCB0aGUgZGlyZWN0aW9uIGlzIHRvd2Fy
ZHMgaW5zaWRlIHRoZSBib3gsIGRvIEkgc3RpbGwgbmVlZCB0byBtYWtlIGl0IGEgc3BlY2lhbCBj
YXNlPyBGb3IgZXhhbXBsZSwgYSBMVFIgYm94IGluc2lkZSBhIExUUiBibG9jaywKICAgICAvLyB3
aGVuIG9mZnNldCBpcyBhdCBib3gncyBjYXJldE1pbk9mZnNldCBhbmQgdGhlIGRpcmVjdGlvbiBp
cyBEaXJlY3Rpb25SaWdodCwgc2hvdWxkIGl0IGJlIHRha2VuIGNhcmUgYXMgYSBnZW5lcmFsIGNh
c2U/Ci0gICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkKLSAgICAg
ICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LT5wcmV2TGVhZkNoaWxkKCksIGludmFsaWRP
ZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKLSAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdo
dG1vc3RPZmZzZXQoKSkKLSAgICAgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LCBvZmZz
ZXQsIGJsb2NrRGlyZWN0aW9uKTsKKyAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9z
dE9mZnNldCgpKSB7CisgICAgICAgIHNldElubGluZUJveChib3gtPnByZXZMZWFmQ2hpbGQoKSk7
CisgICAgICAgIHNldE9mZnNldChzX2ludmFsaWRPZmZzZXQpOworICAgICAgICByZXR1cm4gbGVm
dFdvcmRCb3VuZGFyeSgpOworICAgIH0KICAgICAKKyAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2Fy
ZXRSaWdodG1vc3RPZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoKTsK
ICAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwogICAgIGlmIChibG9ja0RpcmVj
dGlvbiA9PSBMVFIpIHsKQEAgLTE1NDEsMzEgKzE1NjksNDEgQEAgVmlzaWJsZVBvc2l0aW9uIGxl
ZnRXb3JkUG9zaXRpb24oY29uc3QgVgogICAgICAgICBlbHNlCiAgICAgICAgICAgICB3b3JkQnJl
YWsgPSBuZXh0V29yZFBvc2l0aW9uKHZpc2libGVQb3NpdGlvbik7CiAgICAgfQotICAgIGlmICh3
b3JkQnJlYWsuaXNOb3ROdWxsKCkgJiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWssIGJv
eCkpCisgICAgaWYgKHdvcmRCcmVhay5pc05vdE51bGwoKSAmJiBwb3NpdGlvbklzSW5zaWRlQm94
KHdvcmRCcmVhaykpCiAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgCiAgICAgV29yZEJv
dW5kYXJ5VmVjdG9yIG9yZGVyZWRXb3JkQm91bmRhcmllczsKLSAgICBjb2xsZWN0V29yZEJyZWFr
c0luQm94KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLCBibG9ja0RpcmVjdGlvbik7CisgICAg
c2V0V29yZEJyZWFrcygmb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBjb2xsZWN0V29yZEJy
ZWFrc0luQm94KCk7CiAKLSAgICBpbnQgaW5kZXggPSBib3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKSA/IGdyZWF0ZXN0VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IExUUiwg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzKSA6Ci0gICAgICAgIHNtYWxsZXN0T2Zmc2V0QWJvdmUob2Zm
c2V0LCBibG9ja0RpcmVjdGlvbiA9PSBSVEwsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7Ci0gICAg
aWYgKGluZGV4ICE9IGludmFsaWRPZmZzZXQpCisgICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkgPyBncmVhdGVzdFZhbHVlVW5kZXIoKSA6IHNtYWxsZXN0T2Zmc2V0
QWJvdmUoKTsKKyAgICBpZiAoaW5kZXggIT0gc19pbnZhbGlkT2Zmc2V0KQogICAgICAgICByZXR1
cm4gb3JkZXJlZFdvcmRCb3VuZGFyaWVzW2luZGV4XS52aXNpYmxlUG9zaXRpb247CiAgICAgCi0g
ICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LT5wcmV2TGVhZkNoaWxkKCksIGludmFsaWRP
ZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKKyAgICBzZXRJbmxpbmVCb3goYm94LT5wcmV2TGVhZkNo
aWxkKCkpOworICAgIHNldE9mZnNldChzX2ludmFsaWRPZmZzZXQpOworICAgIHJldHVybiBsZWZ0
V29yZEJvdW5kYXJ5KCk7CiB9CiAKLVZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbihj
b25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK1Zpc2libGVQb3NpdGlvbiBW
aXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpyaWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9z
aXRpb24mIHZpc2libGVQb3NpdGlvbikKIHsKICAgICBJbmxpbmVCb3gqIGJveDsKICAgICBpbnQg
b2Zmc2V0OwogICAgIHZpc2libGVQb3NpdGlvbi5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94LCBv
ZmZzZXQpOwogICAgIFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24gPSBkaXJlY3Rpb25PZkVu
Y2xvc2luZ0Jsb2NrKHZpc2libGVQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKTsKICAgICAKKyAg
ICBzZXRJbmxpbmVCb3goYm94KTsKKyAgICBzZXRPZmZzZXQob2Zmc2V0KTsKKyAgICBzZXRCbG9j
a0RpcmVjdGlvbihibG9ja0RpcmVjdGlvbik7CisgICAgCiAgICAgaWYgKG9mZnNldCA9PSBib3gt
PmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkKLSAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5
KGJveCwgb2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7Ci0gICAgaWYgKG9mZnNldCA9PSBib3gtPmNh
cmV0UmlnaHRtb3N0T2Zmc2V0KCkpCi0gICAgICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeShi
b3gtPm5leHRMZWFmQ2hpbGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOworICAg
ICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoKTsKKyAgICAgICAgCisgICAgaWYgKG9mZnNl
dCA9PSBib3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkpIHsKKyAgICAgICAgc2V0SW5saW5lQm94
KGJveC0+bmV4dExlYWZDaGlsZCgpKTsKKyAgICAgICAgc2V0T2Zmc2V0KHNfaW52YWxpZE9mZnNl
dCk7CisgICAgICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeSgpOworICAgIH0KICAKICAgICBW
aXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwogICAgIGlmIChibG9ja0RpcmVjdGlvbiA9PSBSVEwp
IHsKQEAgLTE1NzQsMTggKzE2MTIsMjAgQEAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0
aW9uKGNvbnN0IAogICAgICAgICBlbHNlCiAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29y
ZFBvc2l0aW9uKHZpc2libGVQb3NpdGlvbik7CiAgICAgfQotICAgIGlmICh3b3JkQnJlYWsuaXNO
b3ROdWxsKCkgJiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWssIGJveCkpCisgICAgaWYg
KHdvcmRCcmVhay5pc05vdE51bGwoKSAmJiBwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaykp
CiAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgCiAgICAgV29yZEJvdW5kYXJ5VmVjdG9y
IG9yZGVyZWRXb3JkQm91bmRhcmllczsKLSAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KGJveCwg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLCBibG9ja0RpcmVjdGlvbik7CisgICAgc2V0V29yZEJyZWFr
cygmb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7
CiAgICAgCi0gICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBz
bWFsbGVzdE9mZnNldEFib3ZlKG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCBvcmRlcmVk
V29yZEJvdW5kYXJpZXMpIDoKLSAgICAgICAgZ3JlYXRlc3RWYWx1ZVVuZGVyKG9mZnNldCwgYmxv
Y2tEaXJlY3Rpb24gPT0gUlRMLCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpOwotICAgIGlmIChpbmRl
eCAhPSBpbnZhbGlkT2Zmc2V0KQorICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERp
cmVjdGlvbigpID8gc21hbGxlc3RPZmZzZXRBYm92ZSgpIDogZ3JlYXRlc3RWYWx1ZVVuZGVyKCk7
CisgICAgaWYgKGluZGV4ICE9IHNfaW52YWxpZE9mZnNldCkKICAgICAgICAgcmV0dXJuIG9yZGVy
ZWRXb3JkQm91bmRhcmllc1tpbmRleF0udmlzaWJsZVBvc2l0aW9uOwogICAgIAotICAgIHJldHVy
biByaWdodFdvcmRCb3VuZGFyeShib3gtPm5leHRMZWFmQ2hpbGQoKSwgaW52YWxpZE9mZnNldCwg
YmxvY2tEaXJlY3Rpb24pOworICAgIHNldElubGluZUJveChib3gtPm5leHRMZWFmQ2hpbGQoKSk7
CisgICAgc2V0T2Zmc2V0KHNfaW52YWxpZE9mZnNldCk7CisgICAgcmV0dXJuIHJpZ2h0V29yZEJv
dW5kYXJ5KCk7CiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91
bml0cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0
cy5oCShyZXZpc2lvbiA5MDc5NSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91
bml0cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOSwxMCArMjksMTMgQEAKICNpbmNsdWRlICJFZGl0
aW5nQm91bmRhcnkuaCIKICNpbmNsdWRlICJUZXh0RGlyZWN0aW9uLmgiCiAKKyNpbmNsdWRlICJW
aXNpYmxlUG9zaXRpb24uaCIKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBOb2RlOwog
Y2xhc3MgVmlzaWJsZVBvc2l0aW9uOworY2xhc3MgSW5saW5lQm94OwogCiBlbnVtIEVXb3JkU2lk
ZSB7IFJpZ2h0V29yZElmT25Cb3VuZGFyeSA9IGZhbHNlLCBMZWZ0V29yZElmT25Cb3VuZGFyeSA9
IHRydWUgfTsKIApAQCAtNDEsOCArNDQsNiBAQCBWaXNpYmxlUG9zaXRpb24gc3RhcnRPZldvcmQo
Y29uc3QgVmlzaWJsCiBWaXNpYmxlUG9zaXRpb24gZW5kT2ZXb3JkKGNvbnN0IFZpc2libGVQb3Np
dGlvbiAmLCBFV29yZFNpZGUgPSBSaWdodFdvcmRJZk9uQm91bmRhcnkpOwogVmlzaWJsZVBvc2l0
aW9uIHByZXZpb3VzV29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmKTsKIFZpc2li
bGVQb3NpdGlvbiBuZXh0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmKTsKLVZp
c2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsK
LVZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYp
OwogYm9vbCBpc1N0YXJ0T2ZXb3JkKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogCiAvLyBzZW50
ZW5jZXMKQEAgLTk1LDYgKzk2LDg0IEBAIGJvb2wgaXNFbmRPZkRvY3VtZW50KGNvbnN0IFZpc2li
bGVQb3NpdGkKIFZpc2libGVQb3NpdGlvbiBzdGFydE9mRWRpdGFibGVDb250ZW50KGNvbnN0IFZp
c2libGVQb3NpdGlvbiYpOwogVmlzaWJsZVBvc2l0aW9uIGVuZE9mRWRpdGFibGVDb250ZW50KGNv
bnN0IFZpc2libGVQb3NpdGlvbiYpOwogCitjbGFzcyBWaXN1YWxXb3JkQnJlYWtCYXNlIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflZpc3VhbFdvcmRCcmVha0Jhc2UoKSB7IH0KKyAg
ICAgICAgCisgICAgICAgIHZpcnR1YWwgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9u
KGNvbnN0IFZpc2libGVQb3NpdGlvbiYpID0gMDsKKyAgICAgICAgdmlydHVhbCBWaXNpYmxlUG9z
aXRpb24gbGVmdFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mKSA9IDA7CisgICAg
ICAgICAgICAgICAgCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGF0aWMgY29uc3QgaW50IHNf
aW52YWxpZE9mZnNldCA9IC0xOworICAgICAgICAKKyAgICAgICAgc3RydWN0IFdvcmRCb3VuZGFy
eUVudHJ5IHsKKyAgICAgICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5KCkKKyAgICAgICAgICAgICAg
ICA6IG9mZnNldEluSW5saW5lQm94KHNfaW52YWxpZE9mZnNldCkKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgV29yZEJvdW5kYXJ5RW50cnko
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwb3NpdGlvbiwgaW50IG9mZnNldCkKKyAgICAgICAgICAg
ICAgICA6IHZpc2libGVQb3NpdGlvbihwb3NpdGlvbikKKyAgICAgICAgICAgICAgICAsIG9mZnNl
dEluSW5saW5lQm94KG9mZnNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbjsKKyAg
ICAgICAgICAgIGludCBvZmZzZXRJbklubGluZUJveDsKKyAgICAgICAgfTsKKworICAgICAgICB0
eXBlZGVmIFZlY3RvcjxXb3JkQm91bmRhcnlFbnRyeSwgNTA+IFdvcmRCb3VuZGFyeVZlY3RvcjsK
KworICAgICAgICB2aXJ0dWFsIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveCgpID0gMDsgICAg
CisKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRS
QmxvY2soKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJC
b3hJblJUTEJsb2NrKCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBsYXN0V29yZEJyZWFrSW5C
b3goaW50JiBvZmZzZXRPZldvcmRCcmVhayk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBwcmV2
aW91c1dvcmRCb3VuZGFyeUluQm94KCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBuZXh0V29y
ZEJvdW5kYXJ5SW5Cb3goKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc3VhbGx5TGFzdFdv
cmRCb3VuZGFyeUluQm94KCk7ICAgICAgICAKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRX
b3JkQm91bmRhcnkoKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZEJvdW5kYXJ5
KCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRl
QmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlv
dXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBWaXNpYmxlUG9z
aXRpb24gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9u
YWxpdHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZz
ZXRPZldvcmRCcmVhaywgYm9vbCYgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOyAgICAgICAgCisgICAg
ICAgIAorICAgICAgICBib29sIHBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tX
aXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJl
YWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBib29sIG5lZWRUb1VzZUxvZ2lj
YWxFbmRPZkxpbmUoKTsKKyAgICAgICAgYm9vbCBpc0JveFZpc3VhbGx5TGFzdEluQmxvY2soKTsK
KyAgICAgICAgYm9vbCBwb3NpdGlvbklzSW5zaWRlQm94KGNvbnN0IFZpc2libGVQb3NpdGlvbiYg
d29yZEJyZWFrKTsKKyAgICAgICAgCisgICAgICAgIGludCBncmVhdGVzdFZhbHVlVW5kZXIoKTsK
KyAgICAgICAgaW50IHNtYWxsZXN0T2Zmc2V0QWJvdmUoKTsKKyAgICAgICAgCisgICAgICAgIHZv
aWQgc2V0SW5saW5lQm94KElubGluZUJveCogaW5saW5lQm94KSB7IG1faW5saW5lQm94ID0gaW5s
aW5lQm94OyB9CisgICAgICAgIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsgbV9vZmZzZXQg
PSBvZmZzZXQ7IH0KKyAgICAgICAgdm9pZCBzZXRCbG9ja0RpcmVjdGlvbihUZXh0RGlyZWN0aW9u
IGJsb2NrRGlyZWN0aW9uKSB7IG1fYmxvY2tEaXJlY3Rpb24gPSBibG9ja0RpcmVjdGlvbjsgfQor
ICAgICAgICB2b2lkIHNldFdvcmRCcmVha3MoV29yZEJvdW5kYXJ5VmVjdG9yKiB3b3JkQnJlYWtz
KSB7IG1fd29yZEJyZWFrcyA9IHdvcmRCcmVha3M7IH0KKyAgICAgICAgCisgICAgICAgIElubGlu
ZUJveCogaW5saW5lQm94KCkgeyByZXR1cm4gbV9pbmxpbmVCb3g7IH0KKyAgICAgICAgaW50IG9m
ZnNldCgpIHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisgICAgICAgIFRleHREaXJlY3Rpb24gYmxvY2tE
aXJlY3Rpb24oKSB7IHJldHVybiBtX2Jsb2NrRGlyZWN0aW9uOyB9CisgICAgICAgIFdvcmRCb3Vu
ZGFyeVZlY3Rvciogd29yZEJyZWFrcygpIHsgcmV0dXJuIG1fd29yZEJyZWFrczsgfQorCisgICAg
cHJpdmF0ZToKKyAgICAgICAgSW5saW5lQm94KiBtX2lubGluZUJveDsKKyAgICAgICAgaW50IG1f
b2Zmc2V0OworICAgICAgICBUZXh0RGlyZWN0aW9uIG1fYmxvY2tEaXJlY3Rpb247CisgICAgICAg
IFdvcmRCb3VuZGFyeVZlY3RvciogbV93b3JkQnJlYWtzOworfTsKKworY2xhc3MgVmlzdWFsV29y
ZEJyZWFrV2luZG93cyA6IHB1YmxpYyBWaXN1YWxXb3JkQnJlYWtCYXNlIHsKKyAgICBwdWJsaWM6
CisgICAgICAgIH5WaXN1YWxXb3JkQnJlYWtXaW5kb3dzKCkgeyB9CisgICAgICAgIFZpc2libGVQ
b3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBv
c2l0aW9uKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uKGNvbnN0
IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKTsKKworICAgIHByaXZhdGU6CisgICAg
ICAgIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rp
b25hbGl0eSgpOworICAgICAgICB2b2lkIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9j
a1dpdGhEaWZmZXJudERpcmVjdGlvbmFsaXR5KCk7CisgICAgICAgIHZvaWQgY29sbGVjdFdvcmRC
cmVha3NJbkJveCgpOworfTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8g
VmlzaWJsZVBvc2l0aW9uX2gK
</data>
<flag name="review"
          id="96319"
          type_id="1"
          status="-"
          setter="rniwa"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101484</attachid>
            <date>2011-07-20 10:46:09 -0700</date>
            <delta_ts>2011-07-20 10:46:09 -0700</delta_ts>
            <desc>Just to show where Mac/Linux version is going</desc>
            <filename>vanlam-workingmaclinuxversion</filename>
            <type>text/plain</type>
            <size>54645</size>
            <attacher name="Van Lam">vanlam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkxMzc3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTE4IEBACisyMDExLTA3LTIwICBWYW4gTGFt
ICA8dmFubGFtQGdvb2dsZS5jb20+CisKKyAgICAgICAgbWlnaHQgbmVlZCB0byBidW5kbGUgdGhl
IGZ1bmN0aW9ucyByZWxhdGVkIHRvIHZpc3VhbCB3b3JkIGJyZWFrIGFzIGEgY2xhc3MgKFZpc3Vh
bFdvcmRCcmVha2VyKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NjA5MTAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBBdHRhY2hlZCB3b3JraW5nIE1hYy9MaW51eCB2ZXJzaW9uIGp1c3QgdG8gc2hvdyB3aGVy
ZSBJJ20gaGVhZGVkLgorCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6bW9kaWZ5TW92aW5nUmlnaHQpOgorICAg
ICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmluZ0ZvcndhcmQpOgorICAg
ICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmluZ0xlZnQpOgorICAgICAg
ICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmluZ0JhY2t3YXJkKToKKyAgICAg
ICAgKiBlZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFs
V29yZEJyZWFrQmFzZTo6cHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVE
aXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjps
ZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlZp
c3VhbFdvcmRCcmVha0Jhc2U6OnJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKToK
KyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6Omxhc3RXb3JkQnJlYWtJbkJv
eCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpwb3NpdGlvbklzVmlz
dWFsbHlPcmRlcmVkSW5Cb3hJbkJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KToKKyAg
ICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6Om5leHRXb3JkQnJlYWtJbkJveElu
c2lkZUJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6
OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnByZXZpb3VzV29yZEJvdW5kYXJ5SW5Cb3gpOgorICAgICAg
ICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6bmV4dFdvcmRCb3VuZGFyeUluQm94KToK
KyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnZpc3VhbGx5TGFzdFdvcmRC
b3VuZGFyeUluQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6Omdy
ZWF0ZXN0VmFsdWVVbmRlcik6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNl
OjpzbWFsbGVzdE9mZnNldEFib3ZlKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVh
a0Jhc2U6OmxlZnRXb3JkQm91bmRhcnkpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJy
ZWFrQmFzZTo6cmlnaHRXb3JkQm91bmRhcnkpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29y
ZEJyZWFrQmFzZTo6cG9zaXRpb25Jc0luc2lkZUJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1
YWxXb3JkQnJlYWtCYXNlOjpsZWZ0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OmxlZnRtb3N0UG9zaXRpb25JblJU
TEJveEluUlRMQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6
cmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluTFRSQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6
VmlzdWFsV29yZEJyZWFrQmFzZTo6cmlnaHRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2sp
OgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6ZW5kT2ZCb3hQb3NpdGlv
bik6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjplbmRPZkJsb2NrUG9z
aXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6bmVlZFRvVXNl
TG9naWNhbEVuZE9mTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNl
Ojppc0JveFZpc3VhbGx5TGFzdEluQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29y
ZEJyZWFrV2luZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVE
aXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dz
Ojpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVybnREaXJlY3Rpb25h
bGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpjb2xsZWN0
V29yZEJyZWFrc0luQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRv
d3M6OmxlZnRXb3JkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFr
V2luZG93czo6cmlnaHRXb3JkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29y
ZEJyZWFrVW5peDo6Y29sbGVjdFdvcmRCcmVha3NVc2luZ1ByZXZpb3VzKToKKyAgICAgICAgKFdl
YkNvcmU6OlZpc3VhbFdvcmRCcmVha1VuaXg6OmNvbGxlY3RXb3JkQnJlYWtzVXNpbmdOZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1VuaXg6OmNvbGxlY3RXb3JkQnJlYWtz
SW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrVW5peDo6bGVmdFdvcmRQ
b3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtVbml4OjpyaWdodFdv
cmRQb3NpdGlvbik6CisgICAgICAgICogZWRpdGluZy92aXNpYmxlX3VuaXRzLmg6CisgICAgICAg
IChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjp+VmlzdWFsV29yZEJyZWFrQmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpzZXRQb3NpdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpzZXRCb3gpOgorICAgICAgICAoV2Vi
Q29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6c2V0T2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6
OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnNldEJsb2NrRGlyZWN0aW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZp
c3VhbFdvcmRCcmVha0Jhc2U6OmJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJl
YWtCYXNlOjpvZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6
YmxvY2tEaXJlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6
V29yZEJvdW5kYXJ5RW50cnk6OldvcmRCb3VuZGFyeUVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6
OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnNldFdvcmRCcmVha3MpOgorICAgICAgICAoV2ViQ29yZTo6
VmlzdWFsV29yZEJyZWFrQmFzZTo6d29yZEJyZWFrcyk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1
YWxXb3JkQnJlYWtXaW5kb3dzOjp+VmlzdWFsV29yZEJyZWFrV2luZG93cyk6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtVbml4Ojp+VmlzdWFsV29yZEJyZWFrVW5peCk6CisgICAg
ICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtVbml4OjpzZXRNb3ZpbmdMZWZ0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1VuaXg6Om1vdmluZ0xlZnQpOgorCisyMDExLTA3
LTE5ICBWYW4gTGFtICA8dmFubGFtQGdvb2dsZS5jb20+CisKKyAgICAgICAgbWlnaHQgbmVlZCB0
byBidW5kbGUgdGhlIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHZpc3VhbCB3b3JkIGJyZWFrIGFzIGEg
Y2xhc3MgKFZpc3VhbFdvcmRCcmVha2VyKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NjA5MTAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBSZWZhY3RvcmVkIGJ5IGJ1bmRsaW5nIGZ1bmN0aW9ucyBpbnRvIGEg
Y2xhc3MsIHN0b3JpbmcgZnJlcXVlbnRseQorICAgICAgICBwYXNzZWQgYXJndW1lbnRzIGFzIGRh
dGEgbWVtYmVycyB0byBhdm9pZCBsb25nIHBhcmFtZXRlciBsaXN0cywgYW5kCisgICAgICAgIGlu
dHJvZHVjaW5nIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBpbiBhbnRpY2lwYXRpb24gb2YgYSBN
YWMvTGludXgKKyAgICAgICAgdmVyc2lvbiBvZiB2aXN1YWwgd29yZCBicmVhayAoY3VycmVudCB2
ZXJzaW9uIGlzIGZvciBXaW5kb3dzKS4KKworICAgICAgICAqIGVkaXRpbmcvRnJhbWVTZWxlY3Rp
b24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmluZ1Jp
Z2h0KToKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjptb2RpZnlNb3ZpbmdMZWZ0
KToKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6cHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2Nr
V2l0aFNhbWVEaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJl
YWtCYXNlOjpsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKToKKyAgICAgICAgKFdl
YkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJU
TEJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6Omxhc3RXb3Jk
QnJlYWtJbkJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpwb3Np
dGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFs
aXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6Om5leHRXb3JkQnJl
YWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAg
KFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnByZXZpb3VzV29yZEJvdW5kYXJ5SW5Cb3gp
OgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6bmV4dFdvcmRCb3VuZGFy
eUluQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnZpc3VhbGx5
TGFzdFdvcmRCb3VuZGFyeUluQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVh
a0Jhc2U6OmdyZWF0ZXN0VmFsdWVVbmRlcik6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3Jk
QnJlYWtCYXNlOjpzbWFsbGVzdE9mZnNldEFib3ZlKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha0Jhc2U6OmxlZnRXb3JkQm91bmRhcnkpOgorICAgICAgICAoV2ViQ29yZTo6Vmlz
dWFsV29yZEJyZWFrQmFzZTo6cmlnaHRXb3JkQm91bmRhcnkpOgorICAgICAgICAoV2ViQ29yZTo6
VmlzdWFsV29yZEJyZWFrQmFzZTo6cG9zaXRpb25Jc0luc2lkZUJveCk6CisgICAgICAgIChXZWJD
b3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRl
QmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZm
ZXJudERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dp
bmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFs
V29yZEJyZWFrV2luZG93czo6bGVmdFdvcmRQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpW
aXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpyaWdodFdvcmRQb3NpdGlvbik6CisgICAgICAgICogZWRp
dGluZy92aXNpYmxlX3VuaXRzLmg6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtC
YXNlOjp+VmlzdWFsV29yZEJyZWFrQmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3Jk
QnJlYWtCYXNlOjpzZXRQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJl
YWtCYXNlOjpzZXRCb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6
c2V0T2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnNldEJs
b2NrRGlyZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnBv
c2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OmJveCk6Cisg
ICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpvZmZzZXQpOgorICAgICAgICAo
V2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6YmxvY2tEaXJlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6V29yZEJvdW5kYXJ5RW50cnk6OldvcmRCb3Vu
ZGFyeUVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6OnNldFdv
cmRCcmVha3MpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6d29yZEJy
ZWFrcyk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjp+VmlzdWFs
V29yZEJyZWFrV2luZG93cyk6CisKIDIwMTEtMDctMjAgIEd1c3Rhdm8gTm9yb25oYSBTaWx2YSAg
PGd1c3Rhdm8ubm9yb25oYUBjb2xsYWJvcmEuY28udWs+CiAKICAgICAgICAgW0dUS10gUkVHUkVT
U0lPTihyODY0MzYpOiBkb2VzIG5vdCBhZGQgbmV3bGluZXMgd2hlbiByZXR1cm4gaXMgcHJlc3Nl
ZCB3aXRoIHNvbWUgbW9kaWZpZXJzIGhlbGQKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
RnJhbWVTZWxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
RnJhbWVTZWxlY3Rpb24uY3BwCShyZXZpc2lvbiA5MDc5NSkKKysrIFNvdXJjZS9XZWJDb3JlL2Vk
aXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NTYsNyArNTU2LDcg
QEAgVmlzaWJsZVBvc2l0aW9uIEZyYW1lU2VsZWN0aW9uOjptb2RpZnlNbwogICAgICAgICBwb3Mg
PSByaWdodEJvdW5kYXJ5T2ZMaW5lKHN0YXJ0Rm9yUGxhdGZvcm0oKSwgZGlyZWN0aW9uT2ZFbmNs
b3NpbmdCbG9jaygpKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXZWJLaXRWaXN1YWxXb3Jk
R3JhbnVsYXJpdHk6Ci0gICAgICAgIHBvcyA9IHJpZ2h0V29yZFBvc2l0aW9uKFZpc2libGVQb3Np
dGlvbihtX3NlbGVjdGlvbi5leHRlbnQoKSwgbV9zZWxlY3Rpb24uYWZmaW5pdHkoKSkpOworICAg
ICAgICBwb3MgPSBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzKCkucmlnaHRXb3JkUG9zaXRpb24oVmlz
aWJsZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3NlbGVjdGlvbi5hZmZpbml0eSgp
KSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gcG9zOwpAQCAtNTc0LDcgKzU3
NCw4IEBAIFZpc2libGVQb3NpdGlvbiBGcmFtZVNlbGVjdGlvbjo6bW9kaWZ5TW8KICAgICAgICAg
ICAgIHBvcyA9IFZpc2libGVQb3NpdGlvbihtX3NlbGVjdGlvbi5leHRlbnQoKSwgbV9zZWxlY3Rp
b24uYWZmaW5pdHkoKSkubmV4dChDYW5ub3RDcm9zc0VkaXRpbmdCb3VuZGFyeSk7CiAgICAgICAg
IGJyZWFrOwogICAgIGNhc2UgV29yZEdyYW51bGFyaXR5OgotICAgICAgICBwb3MgPSBuZXh0V29y
ZFBvc2l0aW9uKFZpc2libGVQb3NpdGlvbihtX3NlbGVjdGlvbi5leHRlbnQoKSwgbV9zZWxlY3Rp
b24uYWZmaW5pdHkoKSkpOworICAgICAgICBwb3MgPSBWaXN1YWxXb3JkQnJlYWtVbml4KCkucmln
aHRXb3JkUG9zaXRpb24oVmlzaWJsZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3Nl
bGVjdGlvbi5hZmZpbml0eSgpKSk7CisgICAgICAgIC8vcG9zID0gbmV4dFdvcmRQb3NpdGlvbihW
aXNpYmxlUG9zaXRpb24obV9zZWxlY3Rpb24uZXh0ZW50KCksIG1fc2VsZWN0aW9uLmFmZmluaXR5
KCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTZW50ZW5jZUdyYW51bGFyaXR5OgogICAg
ICAgICBwb3MgPSBuZXh0U2VudGVuY2VQb3NpdGlvbihWaXNpYmxlUG9zaXRpb24obV9zZWxlY3Rp
b24uZXh0ZW50KCksIG1fc2VsZWN0aW9uLmFmZmluaXR5KCkpKTsKQEAgLTcyNyw3ICs3MjgsNyBA
QCBWaXNpYmxlUG9zaXRpb24gRnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vCiAgICAgICAgIHBvcyA9
IGxlZnRCb3VuZGFyeU9mTGluZShzdGFydEZvclBsYXRmb3JtKCksIGRpcmVjdGlvbk9mRW5jbG9z
aW5nQmxvY2soKSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgV2ViS2l0VmlzdWFsV29yZEdy
YW51bGFyaXR5OgotICAgICAgICBwb3MgPSBsZWZ0V29yZFBvc2l0aW9uKFZpc2libGVQb3NpdGlv
bihtX3NlbGVjdGlvbi5leHRlbnQoKSwgbV9zZWxlY3Rpb24uYWZmaW5pdHkoKSkpOworICAgICAg
ICBwb3MgPSBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzKCkubGVmdFdvcmRQb3NpdGlvbihWaXNpYmxl
UG9zaXRpb24obV9zZWxlY3Rpb24uZXh0ZW50KCksIG1fc2VsZWN0aW9uLmFmZmluaXR5KCkpKTsK
ICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBwb3M7CkBAIC03NDQsNyArNzQ1LDgg
QEAgVmlzaWJsZVBvc2l0aW9uIEZyYW1lU2VsZWN0aW9uOjptb2RpZnlNbwogICAgICAgICAgICAg
cG9zID0gVmlzaWJsZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3NlbGVjdGlvbi5h
ZmZpbml0eSgpKS5wcmV2aW91cyhDYW5ub3RDcm9zc0VkaXRpbmdCb3VuZGFyeSk7CiAgICAgICAg
IGJyZWFrOwogICAgIGNhc2UgV29yZEdyYW51bGFyaXR5OgotICAgICAgICBwb3MgPSBwcmV2aW91
c1dvcmRQb3NpdGlvbihWaXNpYmxlUG9zaXRpb24obV9zZWxlY3Rpb24uZXh0ZW50KCksIG1fc2Vs
ZWN0aW9uLmFmZmluaXR5KCkpKTsKKyAgICAgICAgcG9zID0gVmlzdWFsV29yZEJyZWFrV2luZG93
cygpLmxlZnRXb3JkUG9zaXRpb24oVmlzaWJsZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgp
LCBtX3NlbGVjdGlvbi5hZmZpbml0eSgpKSk7CisgICAgICAgIC8vcG9zID0gcHJldmlvdXNXb3Jk
UG9zaXRpb24oVmlzaWJsZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3NlbGVjdGlv
bi5hZmZpbml0eSgpKSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU2VudGVuY2VHcmFudWxh
cml0eToKICAgICAgICAgcG9zID0gcHJldmlvdXNTZW50ZW5jZVBvc2l0aW9uKFZpc2libGVQb3Np
dGlvbihtX3NlbGVjdGlvbi5leHRlbnQoKSwgbV9zZWxlY3Rpb24uYWZmaW5pdHkoKSkpOwpJbmRl
eDogU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCShyZXZpc2lvbiA5MDc5
NSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTExNzEsMTAgKzExNzEsMTAgQEAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0Qm91bmRh
cnlPZkxpbmUoY29ucwogICAgIHJldHVybiBkaXJlY3Rpb24gPT0gTFRSID8gbG9naWNhbEVuZE9m
TGluZShjKSA6IGxvZ2ljYWxTdGFydE9mTGluZShjKTsKIH0KIAotc3RhdGljIGNvbnN0IGludCBp
bnZhbGlkT2Zmc2V0ID0gLTE7Ci0KLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3Jk
QnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShjb25zdCBJbmxpbmVC
b3gqIGJveCwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBv
ZmZzZXRPZldvcmRCcmVhaykKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtCYXNlOjpw
cmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGNv
bnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3Jk
QnJlYWspCiB7CisgICAgSW5saW5lQm94KiBjdXJyZW50Qm94ID0gYm94KCk7CisKICAgICAvLyBJ
biBhIExUUiBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5k
YXJ5IG9mIGEgd29yZC4KICAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hv
dWxkIGJlIG9uIHRoZSByaWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCiAgICAgLy8gQmVjYXVzZSBu
ZXh0V29yZFBvc2l0aW9uKCkgcmV0dXJucyB0aGUgd29yZCBicmVhayBvbiB0aGUgcmlnaHQgYm91
bmRhcnkgb2YgdGhlIHdvcmQgZm9yIExUUiB0ZXh0LApAQCAtMTE4OCw3ICsxMTg4LDcgQEAgc3Rh
dGljIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRCcmVhawogICAgIGlmIChoYXNTZWVuV29y
ZEJyZWFrSW5UaGlzQm94KQogICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVhazsK
ICAgICBlbHNlIHsKLSAgICAgICAgd29yZEJyZWFrID0gUG9zaXRpb24oYm94LT5yZW5kZXJlcigp
LT5ub2RlKCksIGJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZz
ZXRJbkFuY2hvcik7CisgICAgICAgIHdvcmRCcmVhayA9IFBvc2l0aW9uKGN1cnJlbnRCb3gtPnJl
bmRlcmVyKCktPm5vZGUoKSwgY3VycmVudEJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRpb246
OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CiAgICAgICAgIC8vIFJldHVybiB0aGUgcmlnaHRt
b3N0IHdvcmQgYm91bmRhcnkgb2YgTFRSIGJveCBvciBsZWZ0bW9zdCB3b3JkIGJvdW5kYXJ5IG9m
IFJUTCBib3ggaWYKICAgICAgICAgLy8gaXQgaXMgbm90IGluIHRoZSBwcmV2aW91c2x5IHZpc2l0
ZWQgYm94ZXMuIEZvciBleGFtcGxlLCBnaXZlbiBhIGxvZ2ljYWwgdGV4dCAKICAgICAgICAgLy8g
ImFiYyBkZWYgICAgIGhpaiBvcHEiLCB0aGVyZSBhcmUgMiBib3hlczogdGhlICJhYmMgZGVmICIg
KHN0YXJ0cyBhdCAwIGFuZCBsZW5ndGggaXMgOCkgCkBAIC0xMTk4LDggKzExOTgsOCBAQCBzdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgICAgIC8vIHRoYXQgY29u
dGFpbnMgImhpaiBvcHEiIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHNwYWNlcy4gU28gd2UgZGV0
ZWN0IGl0IHdoZW4gd2UncmUKICAgICAgICAgLy8gdHJhdmVyc2luZyB0aGUgYm94IHRoYXQgY29u
dGFpbnMgImFiYyBkZWYgIiBpbnN0ZWFkLgogCi0gICAgICAgIGlmICgoYm94LT5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCkgJiYgYm94LT5uZXh0TGVhZkNoaWxkKCkpCi0gICAgICAgICAgICB8fCAo
IWJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpICYmIGJveC0+cHJldkxlYWZDaGlsZCgpKSkg
eworICAgICAgICBpZiAoKGN1cnJlbnRCb3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSAmJiBj
dXJyZW50Qm94LT5uZXh0TGVhZkNoaWxkKCkpCisgICAgICAgICAgICB8fCAoIWN1cnJlbnRCb3gt
PmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSAmJiBjdXJyZW50Qm94LT5wcmV2TGVhZkNoaWxkKCkp
KSB7CiAgICAgCiAgICAgICAgICAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25BZnRlcldvcmQg
PSBuZXh0V29yZFBvc2l0aW9uKHdvcmRCcmVhayk7CiAgICAgICAgICAgICBWaXNpYmxlUG9zaXRp
b24gcG9zaXRpb25CZWZvcmVXb3JkID0gcHJldmlvdXNXb3JkUG9zaXRpb24ocG9zaXRpb25BZnRl
cldvcmQpOwpAQCAtMTIwNyw3ICsxMjA3LDcgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwcmV2
aW91c1dvcmRCcmVhawogICAgICAgICAgICAgSW5saW5lQm94KiBib3hDb250YWluaW5nUHJldmlv
dXNXb3JkQnJlYWs7CiAgICAgICAgICAgICBwb3NpdGlvbkJlZm9yZVdvcmQuZ2V0SW5saW5lQm94
QW5kT2Zmc2V0KGJveENvbnRhaW5pbmdQcmV2aW91c1dvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJl
YWspOwogICAgICAgICAKLSAgICAgICAgICAgIGlmIChib3hDb250YWluaW5nUHJldmlvdXNXb3Jk
QnJlYWsgPT0gYm94KQorICAgICAgICAgICAgaWYgKGJveENvbnRhaW5pbmdQcmV2aW91c1dvcmRC
cmVhayA9PSBjdXJyZW50Qm94KQogICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbkJlZm9y
ZVdvcmQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjE4LDIwICsxMjE4LDIyIEBAIHN0YXRpYyBW
aXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJlYWsKIAogICAgIElubGluZUJveCogYm94Q29u
dGFpbmluZ1ByZXZpb3VzV29yZEJyZWFrOwogICAgIHdvcmRCcmVhay5nZXRJbmxpbmVCb3hBbmRP
ZmZzZXQoYm94Q29udGFpbmluZ1ByZXZpb3VzV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7
Ci0gICAgaWYgKGJveENvbnRhaW5pbmdQcmV2aW91c1dvcmRCcmVhayAhPSBib3gpCisgICAgaWYg
KGJveENvbnRhaW5pbmdQcmV2aW91c1dvcmRCcmVhayAhPSBjdXJyZW50Qm94KQogICAgICAgICBy
ZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiAgICAgcmV0dXJuIHdvcmRCcmVhazsKIH0KIAotc3Rh
dGljIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKGNv
bnN0IElubGluZUJveCogYm94KQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha0Jhc2U6
OmxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2soKQogeworICAgIElubGluZUJveCog
Y3VycmVudEJveCA9IGJveCgpOworCiAgICAgLy8gRklYTUU6IFByb2JhYmx5IG5lZWQgdG8gdGFr
ZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgotICAgIE5vZGUqIG5vZGUgPSBib3gtPnJlbmRlcmVy
KCktPm5vZGUoKTsKLSAgICBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiA9IGJveC0+cHJldkxlYWZD
aGlsZCgpOwotICAgIElubGluZUJveCogbmV4dExlYWYgPSBib3gtPm5leHRMZWFmQ2hpbGQoKTsg
ICAKKyAgICBOb2RlKiBub2RlID0gY3VycmVudEJveC0+cmVuZGVyZXIoKS0+bm9kZSgpOworICAg
IElubGluZUJveCogcHJldmlvdXNMZWFmID0gY3VycmVudEJveC0+cHJldkxlYWZDaGlsZCgpOwor
ICAgIElubGluZUJveCogbmV4dExlYWYgPSBjdXJyZW50Qm94LT5uZXh0TGVhZkNoaWxkKCk7ICAg
CiAgICAgCiAgICAgaWYgKHByZXZpb3VzTGVhZiAmJiAhcHJldmlvdXNMZWFmLT5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBib3gtPmNhcmV0
TWF4T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgICAg
ICByZXR1cm4gUG9zaXRpb24obm9kZSwgY3VycmVudEJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9z
aXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CiAKICAgICBpZiAobmV4dExlYWYgJiYg
IW5leHRMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKICAgICAgICAgaWYgKHByZXZp
b3VzTGVhZikKQEAgLTEyNDUsMTggKzEyNDcsMjAgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBs
ZWZ0bW9zdFBvc2l0aW9uSQogICAgICAgICByZXR1cm4gUG9zaXRpb24obGFzdFJUTExlYWYtPnJl
bmRlcmVyKCktPm5vZGUoKSwgbGFzdFJUTExlYWYtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9u
OjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwogICAgIH0KIAotICAgIHJldHVybiBQb3NpdGlv
bihub2RlLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0
SW5BbmNob3IpOworICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBjdXJyZW50Qm94LT5jYXJldE1p
bk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKIH0KIAotc3Rh
dGljIFZpc2libGVQb3NpdGlvbiByaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9jayhj
b25zdCBJbmxpbmVCb3gqIGJveCkKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtCYXNl
OjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9jaygpCiB7CisgICAgSW5saW5lQm94
KiBjdXJyZW50Qm94ID0gYm94KCk7CisKICAgICAvLyBGSVhNRTogUHJvYmFibHkgbmVlZCB0byB0
YWtlIGNhcmUgb2YgYmlkaSBsZXZlbCB0b28uCi0gICAgTm9kZSogbm9kZSA9IGJveC0+cmVuZGVy
ZXIoKS0+bm9kZSgpOwotICAgIElubGluZUJveCogcHJldmlvdXNMZWFmID0gYm94LT5wcmV2TGVh
ZkNoaWxkKCk7Ci0gICAgSW5saW5lQm94KiBuZXh0TGVhZiA9IGJveC0+bmV4dExlYWZDaGlsZCgp
OyAgIAorICAgIE5vZGUqIG5vZGUgPSBjdXJyZW50Qm94LT5yZW5kZXJlcigpLT5ub2RlKCk7Cisg
ICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBjdXJyZW50Qm94LT5wcmV2TGVhZkNoaWxkKCk7
CisgICAgSW5saW5lQm94KiBuZXh0TGVhZiA9IGN1cnJlbnRCb3gtPm5leHRMZWFmQ2hpbGQoKTsg
ICAKICAgICAKICAgICBpZiAobmV4dExlYWYgJiYgbmV4dExlYWYtPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSkgICAgCi0gICAgICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBib3gtPmNhcmV0TWF4
T2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgICAgICBy
ZXR1cm4gUG9zaXRpb24obm9kZSwgY3VycmVudEJveC0+Y2FyZXRNYXhPZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CiAKICAgICBpZiAocHJldmlvdXNMZWFmICYm
IHByZXZpb3VzTGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CiAgICAgICAgIGlmIChu
ZXh0TGVhZikKQEAgLTEyNzAsMTkgKzEyNzQsMjEgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBy
aWdodG1vc3RQb3NpdGlvbgogICAgICAgICByZXR1cm4gUG9zaXRpb24oZmlyc3RMVFJMZWFmLT5y
ZW5kZXJlcigpLT5ub2RlKCksIGZpcnN0TFRSTGVhZi0+Y2FyZXRNaW5PZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CiAgICAgfQogCi0gICAgcmV0dXJuIFBvc2l0
aW9uKG5vZGUsIGJveC0+Y2FyZXRNaW5PZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZz
ZXRJbkFuY2hvcik7CisgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGN1cnJlbnRCb3gtPmNhcmV0
TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwogfQogICAg
IAotc3RhdGljIFZpc2libGVQb3NpdGlvbiBsYXN0V29yZEJyZWFrSW5Cb3goY29uc3QgSW5saW5l
Qm94KiBib3gsIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspCitWaXNpYmxlUG9zaXRpb24gVmlzdWFs
V29yZEJyZWFrQmFzZTo6bGFzdFdvcmRCcmVha0luQm94KGludCYgb2Zmc2V0T2ZXb3JkQnJlYWsp
CiB7CisgICAgSW5saW5lQm94KiBjdXJyZW50Qm94ID0gYm94KCk7CisKICAgICAvLyBBZGQgdGhl
IGxlZnRtb3N0IHdvcmQgYnJlYWsgZm9yIFJUTCBib3ggb3IgcmlnaHRtb3N0IHdvcmQgYnJlYWsg
Zm9yIExUUiBib3guCi0gICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBib3gtPnByZXZMZWFm
Q2hpbGQoKTsKLSAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7
CisgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYgPSBjdXJyZW50Qm94LT5wcmV2TGVhZkNoaWxk
KCk7CisgICAgSW5saW5lQm94KiBuZXh0TGVhZiA9IGN1cnJlbnRCb3gtPm5leHRMZWFmQ2hpbGQo
KTsKICAgICBWaXNpYmxlUG9zaXRpb24gYm91bmRhcnlQb3NpdGlvbjsKLSAgICBpZiAoYm94LT5k
aXJlY3Rpb24oKSA9PSBSVEwgJiYgKCFwcmV2aW91c0xlYWYgfHwgcHJldmlvdXNMZWFmLT5pc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQotICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gbGVmdG1v
c3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jayhib3gpOwotICAgIGVsc2UgaWYgKGJveC0+ZGly
ZWN0aW9uKCkgPT0gTFRSICYmICghbmV4dExlYWYgfHwgIW5leHRMZWFmLT5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCkpKQotICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gcmlnaHRtb3N0UG9zaXRp
b25JbkxUUkJveEluUlRMQmxvY2soYm94KTsKKyAgICBpZiAoY3VycmVudEJveC0+ZGlyZWN0aW9u
KCkgPT0gUlRMICYmICghcHJldmlvdXNMZWFmIHx8IHByZXZpb3VzTGVhZi0+aXNMZWZ0VG9SaWdo
dERpcmVjdGlvbigpKSkKKyAgICAgICAgYm91bmRhcnlQb3NpdGlvbiA9IGxlZnRtb3N0UG9zaXRp
b25JblJUTEJveEluTFRSQmxvY2soKTsKKyAgICBlbHNlIGlmIChjdXJyZW50Qm94LT5kaXJlY3Rp
b24oKSA9PSBMVFIgJiYgKCFuZXh0TGVhZiB8fCAhbmV4dExlYWYtPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSkpCisgICAgICAgIGJvdW5kYXJ5UG9zaXRpb24gPSByaWdodG1vc3RQb3NpdGlvbklu
TFRSQm94SW5SVExCbG9jaygpOwogCiAgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24uaXNOdWxsKCkp
CiAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsgICAgICAgICAgICAKQEAgLTEyOTMs
MjQgKzEyOTksMjYgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBsYXN0V29yZEJyZWFrSW5Cbwog
CiAgICAgSW5saW5lQm94KiBib3hPZldvcmRCcmVhazsKICAgICB3b3JkQnJlYWsuZ2V0SW5saW5l
Qm94QW5kT2Zmc2V0KGJveE9mV29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhayk7Ci0gICAgaWYg
KGJveE9mV29yZEJyZWFrID09IGJveCkKKyAgICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gY3VycmVu
dEJveCkKICAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKICAgICByZXR1cm4gVmlzaWJsZVBvc2l0
aW9uKCk7ICAgIAogfQogCi1zdGF0aWMgYm9vbCBwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5C
b3hJbkJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlv
biYgd29yZEJyZWFrLCBjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50JiBvZmZzZXRPZldvcmRCcmVh
aykKK2Jvb2wgVmlzdWFsV29yZEJyZWFrQmFzZTo6cG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZElu
Qm94SW5CbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShjb25zdCBWaXNpYmxlUG9zaXRp
b24mIHdvcmRCcmVhaywgaW50JiBvZmZzZXRPZldvcmRCcmVhaykKIHsKICAgICBpbnQgcHJldmlv
dXNPZmZzZXQgPSBvZmZzZXRPZldvcmRCcmVhazsKICAgICBJbmxpbmVCb3gqIGJveE9mV29yZEJy
ZWFrOwogICAgIHdvcmRCcmVhay5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWss
IG9mZnNldE9mV29yZEJyZWFrKTsKLSAgICBpZiAoYm94T2ZXb3JkQnJlYWsgPT0gYm94ICYmIChw
cmV2aW91c09mZnNldCA9PSBpbnZhbGlkT2Zmc2V0IHx8IHByZXZpb3VzT2Zmc2V0IDwgb2Zmc2V0
T2ZXb3JkQnJlYWspKQorICAgIGlmIChib3hPZldvcmRCcmVhayA9PSBib3goKSAmJiAocHJldmlv
dXNPZmZzZXQgPT0gc19pbnZhbGlkT2Zmc2V0IHx8IHByZXZpb3VzT2Zmc2V0IDwgb2Zmc2V0T2ZX
b3JkQnJlYWspKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICByZXR1cm4gZmFsc2U7CiB9Ci0g
ICAgCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2Nr
V2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KAotICAgIGNvbnN0IElubGluZUJveCogYm94LCBj
b25zdCBWaXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29y
ZEJyZWFrLCBib29sJiBpc0xhc3RXb3JkQnJlYWtJbkJveCkKKworVmlzaWJsZVBvc2l0aW9uIFZp
c3VhbFdvcmRCcmVha0Jhc2U6Om5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZl
cmVudERpcmVjdGlvbmFsaXR5KAorICAgIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNX
b3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWssIGJvb2wmIGlzTGFzdFdvcmRCcmVha0lu
Qm94KQogeworICAgIElubGluZUJveCogY3VycmVudEJveCA9IGJveCgpOworCiAgICAgLy8gRklY
TUU6IFByb2JhYmx5IG5lZWQgdG8gdGFrZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgogICAgIAog
ICAgIC8vIEluIGEgTFRSIGJsb2NrLCB0aGUgd29yZCBicmVhayBzaG91bGQgYmUgb24gdGhlIGxl
ZnQgYm91bmRhcnkgb2YgYSB3b3JkLgpAQCAtMTMyMCw3ICsxMzI4LDcgQEAgc3RhdGljIFZpc2li
bGVQb3NpdGlvbiBuZXh0V29yZEJyZWFrSW5CbwogICAgIC8vIFRoZSBzYW1lIGFwcGxpZXMgdG8g
TFRSIHRleHQsIGluIHdoaWNoIHdvcmRzIGFyZSB0cmF2ZXJzZWQgd2l0aGluIHRoZSBpbmxpbmUg
Ym94ZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0LgogICAgIAogICAgIGJvb2wgaGFzU2VlbldvcmRCcmVh
a0luVGhpc0JveCA9IHByZXZpb3VzV29yZEJyZWFrLmlzTm90TnVsbCgpOwotICAgIFZpc2libGVQ
b3NpdGlvbiB3b3JkQnJlYWsgPSBoYXNTZWVuV29yZEJyZWFrSW5UaGlzQm94ID8gcHJldmlvdXNX
b3JkQnJlYWsgOiBQb3NpdGlvbihib3gtPnJlbmRlcmVyKCktPm5vZGUoKSwgYm94LT5jYXJldE1p
bk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBWaXNp
YmxlUG9zaXRpb24gd29yZEJyZWFrID0gaGFzU2VlbldvcmRCcmVha0luVGhpc0JveCA/IHByZXZp
b3VzV29yZEJyZWFrIDogUG9zaXRpb24oY3VycmVudEJveC0+cmVuZGVyZXIoKS0+bm9kZSgpLCBj
dXJyZW50Qm94LT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldElu
QW5jaG9yKTsKICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZFBvc2l0aW9uKHdvcmRCcmVhayk7CiAg
IAogICAgIC8vIEdpdmVuIFJUTCBib3ggIkFCQyBERUYiIGVpdGhlciBmb2xsb3dzIGEgTFRSIGJv
eCBvciBpcyB0aGUgZmlyc3QgdmlzdWFsIGJveCBpbiBhbiBMVFIgYmxvY2sgYXMgYW4gZXhhbXBs
ZSwKQEAgLTEzMjksMjEwICsxMzM3LDM0MiBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIG5leHRX
b3JkQnJlYWtJbkJvCiAgICAgLy8gU3RhcnQgYXQgb2Zmc2V0IDAsIHRoZSBmaXJzdCB3b3JkIGJy
ZWFrIGlzIGF0IG9mZnNldCAzLCB0aGUgMm5kIHdvcmQgYnJlYWsgaXMgYXQgb2Zmc2V0IDcsIGFu
ZCB0aGUgM3JkIHdvcmQgYnJlYWsgc2hvdWxkIGJlIGF0IG9mZnNldCAwLgogICAgIC8vIEJ1dCBu
ZXh0V29yZFBvc2l0aW9uKCkgb2Ygb2Zmc2V0IDcgaXMgb2Zmc2V0IDExLCB3aGljaCBzaG91bGQg
YmUgaWdub3JlZCwgCiAgICAgLy8gYW5kIHRoZSBwb3NpdGlvbiBhdCBvZmZzZXQgMCBzaG91bGQg
YmUgbWFudWFsbHkgYWRkZWQgYXMgdGhlIGxhc3Qgd29yZCBicmVhayB3aXRoaW4gdGhlIGJveC4K
LSAgICBpZiAod29yZEJyZWFrICE9IHByZXZpb3VzV29yZEJyZWFrICYmIHBvc2l0aW9uSXNWaXN1
YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkod29yZEJy
ZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKSkgeworICAgIGlmICh3b3JkQnJlYWsgIT0gcHJl
dmlvdXNXb3JkQnJlYWsgJiYgcG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZEluQm94SW5CbG9ja1dp
dGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKSkg
ewogICAgICAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IGZhbHNlOwogICAgICAgICByZXR1cm4g
d29yZEJyZWFrOwogICAgIH0KICAgICAKICAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IHRydWU7
Ci0gICAgcmV0dXJuIGxhc3RXb3JkQnJlYWtJbkJveChib3gsIG9mZnNldE9mV29yZEJyZWFrKTsK
KyAgICByZXR1cm4gbGFzdFdvcmRCcmVha0luQm94KG9mZnNldE9mV29yZEJyZWFrKTsKIH0KIAot
c3RydWN0IFdvcmRCb3VuZGFyeUVudHJ5IHsKLSAgICBXb3JkQm91bmRhcnlFbnRyeSgpCi0gICAg
ICAgIDogb2Zmc2V0SW5JbmxpbmVCb3goaW52YWxpZE9mZnNldCkgCi0gICAgeyAKLSAgICB9Ci0K
LSAgICBXb3JkQm91bmRhcnlFbnRyeShjb25zdCBWaXNpYmxlUG9zaXRpb24mIHBvc2l0aW9uLCBp
bnQgb2Zmc2V0KQotICAgICAgICA6IHZpc2libGVQb3NpdGlvbihwb3NpdGlvbikKLSAgICAgICAg
LCBvZmZzZXRJbklubGluZUJveChvZmZzZXQpIAotICAgIHsgCi0gICAgfQotCi0gICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbjsKLSAgICBpbnQgb2Zmc2V0SW5JbmxpbmVCb3g7Ci19
OwotICAgIAotdHlwZWRlZiBWZWN0b3I8V29yZEJvdW5kYXJ5RW50cnksIDUwPiBXb3JkQm91bmRh
cnlWZWN0b3I7Ci0gICAgCi1zdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRl
QmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGNvbnN0IElubGluZUJveCogYm94LCBXb3JkQm91
bmRhcnlWZWN0b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcykKK1Zpc2libGVQb3NpdGlvbiBWaXN1
YWxXb3JkQnJlYWtCYXNlOjpwcmV2aW91c1dvcmRCb3VuZGFyeUluQm94KCkKIHsKLSAgICBvcmRl
cmVkV29yZEJvdW5kYXJpZXMuY2xlYXIoKTsKLSAgICAKLSAgICBWaXNpYmxlUG9zaXRpb24gd29y
ZEJyZWFrOwotICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IGludmFsaWRPZmZzZXQ7Ci0gICAg
d2hpbGUgKDEpIHsKLSAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveElu
c2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZX
b3JkQnJlYWspOwotICAgICAgICBpZiAod29yZEJyZWFrLmlzTnVsbCgpKQotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRC
cmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwotICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMu
YXBwZW5kKHdvcmRCb3VuZGFyeUVudHJ5KTsKLSAgICB9Ci19CisgICAgaW50IGN1cnJlbnRPZmZz
ZXQgPSBvZmZzZXQoKTsKIAotc3RhdGljIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lk
ZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoY29uc3QgSW5saW5lQm94KiBib3gsIFdv
cmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKQotewotICAgIG9yZGVyZWRX
b3JkQm91bmRhcmllcy5jbGVhcigpOwotICAgIAotICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJl
YWs7Ci0gICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gaW52YWxpZE9mZnNldDsKLSAgICBib29s
IGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFsc2U7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAg
d29yZEJyZWFrID0gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGly
ZWN0aW9uYWxpdHkoYm94LCB3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBpc0xhc3RXb3Jk
QnJlYWtJbkJveCk7Ci0gICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkpIHsKLSAgICAg
ICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRCcmVhaywgb2Zm
c2V0T2ZXb3JkQnJlYWspOwotICAgICAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmFwcGVu
ZCh3b3JkQm91bmRhcnlFbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzTGFzdFdvcmRC
cmVha0luQm94KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBj
b2xsZWN0V29yZEJyZWFrc0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBXb3JkQm91bmRhcnlW
ZWN0b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcywgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlv
bikKLXsKLSAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9ja0RpcmVjdGlvbikKLSAgICAg
ICAgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0
eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7Ci0gICAgZWxzZQotICAgICAgICBjb2xsZWN0
V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eShib3gs
IG9yZGVyZWRXb3JkQm91bmRhcmllcyk7ICAgICAgICAKLX0KLSAgICAKLXN0YXRpYyBWaXNpYmxl
UG9zaXRpb24gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwg
aW50IG9mZnNldCkKLXsKICAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSAwOwogICAgIFZpc2li
bGVQb3NpdGlvbiB3b3JkQnJlYWs7CiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgd29yZEJy
ZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25h
bGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICB3b3JkQnJl
YWsgPSBwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFs
aXR5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwogICAgICAgICBpZiAod29yZEJyZWFr
LmlzTnVsbCgpKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gaW52
YWxpZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBvZmZzZXQpCisgICAgICAgIGlmIChj
dXJyZW50T2Zmc2V0ID09IHNfaW52YWxpZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBj
dXJyZW50T2Zmc2V0KQogICAgICAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKICAgICB9ICAgICAg
ICAKICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAKLXN0YXRpYyBWaXNpYmxlUG9z
aXRpb24gbmV4dFdvcmRCb3VuZGFyeUluQm94KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zm
c2V0KQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha0Jhc2U6Om5leHRXb3JkQm91bmRh
cnlJbkJveCgpCiB7CisgICAgaW50IGN1cnJlbnRPZmZzZXQgPSBvZmZzZXQoKTsKKwogICAgIGlu
dCBvZmZzZXRPZldvcmRCcmVhayA9IDA7CiAgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhazsK
ICAgICBib29sIGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFsc2U7CiAgICAgZG8gewotICAgICAg
ICB3b3JkQnJlYWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnRE
aXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWssIGlzTGFzdFdv
cmRCcmVha0luQm94KTsKLSAgICAgICAgaWYgKHdvcmRCcmVhay5pc05vdE51bGwoKSAmJiAob2Zm
c2V0ID09IGludmFsaWRPZmZzZXQgfHwgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gb2Zmc2V0KSkKKyAg
ICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVy
ZW50RGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaywgaXNMYXN0V29y
ZEJyZWFrSW5Cb3gpOworICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIChjdXJy
ZW50T2Zmc2V0ID09IHNfaW52YWxpZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBjdXJy
ZW50T2Zmc2V0KSkKICAgICAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgfSB3aGlsZSAo
IWlzTGFzdFdvcmRCcmVha0luQm94KTsgICAgICAgCiAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlv
bigpOwogfQogICAgIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiB2aXN1YWxseUxhc3RXb3JkQm91
bmRhcnlJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlv
biBibG9ja0RpcmVjdGlvbikKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtCYXNlOjp2
aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveCgpCiB7CiAgICAgV29yZEJvdW5kYXJ5VmVjdG9y
IG9yZGVyZWRXb3JkQm91bmRhcmllczsKLSAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KGJveCwg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLCBibG9ja0RpcmVjdGlvbik7CisgICAgc2V0V29yZEJyZWFr
cygmb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7
CisgICAgCiAgICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpKSAKICAgICAgICAg
cmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwotICAgIGlmIChvZmZzZXQgPT0gaW52YWxpZE9mZnNl
dCB8fCBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSAt
IDFdLm9mZnNldEluSW5saW5lQm94ICE9IG9mZnNldCkKKyAgICBpZiAob2Zmc2V0KCkgPT0gc19p
bnZhbGlkT2Zmc2V0IHx8IG9yZGVyZWRXb3JkQm91bmRhcmllc1tvcmRlcmVkV29yZEJvdW5kYXJp
ZXMuc2l6ZSgpIC0gMV0ub2Zmc2V0SW5JbmxpbmVCb3ggIT0gb2Zmc2V0KCkpCiAgICAgICAgIHJl
dHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSAt
IDFdLnZpc2libGVQb3NpdGlvbjsKICAgICBpZiAob3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUo
KSA+IDEpCiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdvcmRC
b3VuZGFyaWVzLnNpemUoKSAtIDJdLnZpc2libGVQb3NpdGlvbjsKICAgICByZXR1cm4gVmlzaWJs
ZVBvc2l0aW9uKCk7CiB9CiAgICAgICAgIAotc3RhdGljIGludCBncmVhdGVzdFZhbHVlVW5kZXIo
aW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbiwgY29uc3QgV29y
ZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCitpbnQgVmlzdWFsV29yZEJy
ZWFrQmFzZTo6Z3JlYXRlc3RWYWx1ZVVuZGVyKCkKIHsKLSAgICBpZiAoIW9yZGVyZWRXb3JkQm91
bmRhcmllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgIFdvcmRC
b3VuZGFyeVZlY3Rvciogb3JkZXJlZFdvcmRCb3VuZGFyaWVzID0gd29yZEJyZWFrcygpOworICAg
IGludCBjdXJyZW50T2Zmc2V0ID0gb2Zmc2V0KCk7CisKKyAgICBpZiAoIW9yZGVyZWRXb3JkQm91
bmRhcmllcy0+c2l6ZSgpKQorICAgICAgICByZXR1cm4gc19pbnZhbGlkT2Zmc2V0OwogICAgIC8v
IEZJWE1FOiBiaW5hcnkgc2VhcmNoLgotICAgIGlmIChib3hBbmRCbG9ja0FyZUluU2FtZURpcmVj
dGlvbikgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAob3JkZXJlZFdvcmRCb3VuZGFy
aWVzW2ldLm9mZnNldEluSW5saW5lQm94IDwgb2Zmc2V0KQorICAgIGlmIChib3goKS0+ZGlyZWN0
aW9uKCkgPT0gYmxvY2tEaXJlY3Rpb24oKSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAg
aWYgKCgqb3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5vZmZzZXRJbklubGluZUJveCA8IGN1cnJl
bnRPZmZzZXQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgICAgIHJldHVybiBzX2ludmFsaWRPZmZzZXQ7CiAg
ICAgfQotICAgIGZvciAoaW50IGkgPSBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMTsg
aSA+PSAwOyAtLWkpIHsKLSAgICAgICAgaWYgKG9yZGVyZWRXb3JkQm91bmRhcmllc1tpXS5vZmZz
ZXRJbklubGluZUJveCA8IG9mZnNldCkKKyAgICBmb3IgKGludCBpID0gb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzLT5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBpZiAoKCpvcmRlcmVk
V29yZEJvdW5kYXJpZXMpW2ldLm9mZnNldEluSW5saW5lQm94IDwgY3VycmVudE9mZnNldCkKICAg
ICAgICAgICAgIHJldHVybiBpOwogICAgIH0KLSAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKKyAg
ICByZXR1cm4gc19pbnZhbGlkT2Zmc2V0OwogfQogCi1zdGF0aWMgaW50IHNtYWxsZXN0T2Zmc2V0
QWJvdmUoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbiwgY29u
c3QgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCitpbnQgVmlzdWFs
V29yZEJyZWFrQmFzZTo6c21hbGxlc3RPZmZzZXRBYm92ZSgpCiB7Ci0gICAgaWYgKCFvcmRlcmVk
V29yZEJvdW5kYXJpZXMuc2l6ZSgpKQotICAgICAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKKyAg
ICBXb3JkQm91bmRhcnlWZWN0b3IqIG9yZGVyZWRXb3JkQm91bmRhcmllcyA9IHdvcmRCcmVha3Mo
KTsKKyAgICBpbnQgY3VycmVudE9mZnNldCA9IG9mZnNldCgpOworCisgICAgaWYgKCFvcmRlcmVk
V29yZEJvdW5kYXJpZXMtPnNpemUoKSkKKyAgICAgICAgcmV0dXJuIHNfaW52YWxpZE9mZnNldDsK
ICAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaC4KLSAgICBpZiAoYm94QW5kQmxvY2tBcmVJblNh
bWVEaXJlY3Rpb24pIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IG9yZGVyZWRXb3JkQm91bmRhcmll
cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgaWYgKG9yZGVyZWRXb3Jk
Qm91bmRhcmllc1tpXS5vZmZzZXRJbklubGluZUJveCA+IG9mZnNldCkKKyAgICBpZiAoYm94KCkt
PmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9uKCkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9
IG9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAg
ICAgICAgIGlmICgoKm9yZGVyZWRXb3JkQm91bmRhcmllcylbaV0ub2Zmc2V0SW5JbmxpbmVCb3gg
PiBjdXJyZW50T2Zmc2V0KQogICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9Ci0g
ICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgICAgICByZXR1cm4gc19pbnZhbGlkT2Zm
c2V0OwogICAgIH0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChvcmRlcmVkV29yZEJvdW5kYXJpZXNb
aV0ub2Zmc2V0SW5JbmxpbmVCb3ggPiBvZmZzZXQpCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCgq
b3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5vZmZzZXRJbklubGluZUJveCA+IGN1cnJlbnRPZmZz
ZXQpCiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICB9Ci0gICAgcmV0dXJuIGludmFsaWRPZmZz
ZXQ7CisgICAgcmV0dXJuIHNfaW52YWxpZE9mZnNldDsKIH0KIAotc3RhdGljIFZpc2libGVQb3Np
dGlvbiBsZWZ0V29yZEJvdW5kYXJ5KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0LCBU
ZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRC
cmVha0Jhc2U6OmxlZnRXb3JkQm91bmRhcnkoKQogeworICAgIElubGluZUJveCogY3VycmVudEJv
eCA9IGJveCgpOworICAgIGludCBjdXJyZW50T2Zmc2V0ID0gb2Zmc2V0KCk7CisgICAgVGV4dERp
cmVjdGlvbiBjdXJyZW50QmxvY2tEaXJlY3Rpb24gPSBibG9ja0RpcmVjdGlvbigpOworICAgIAog
ICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7Ci0gICAgZm9yICAoY29uc3QgSW5saW5lQm94
KiBhZGphY2VudEJveCA9IGJveDsgYWRqYWNlbnRCb3g7IGFkamFjZW50Qm94ID0gYWRqYWNlbnRC
b3gtPnByZXZMZWFmQ2hpbGQoKSkgewotICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gTFRS
KSB7CisgICAgZm9yIChJbmxpbmVCb3gqIGFkamFjZW50Qm94ID0gY3VycmVudEJveDsgYWRqYWNl
bnRCb3g7IGFkamFjZW50Qm94ID0gYWRqYWNlbnRCb3gtPnByZXZMZWFmQ2hpbGQoKSkgeworICAg
ICAgICBzZXRCb3goYWRqYWNlbnRCb3gpOworICAgICAgICBzZXRPZmZzZXQoYWRqYWNlbnRCb3gg
PT0gY3VycmVudEJveCA/IGN1cnJlbnRPZmZzZXQgOiBzX2ludmFsaWRPZmZzZXQpOworICAgICAg
ICAgICAgICAgIAorICAgICAgICBpZiAoY3VycmVudEJsb2NrRGlyZWN0aW9uID09IExUUikgewog
ICAgICAgICAgICAgaWYgKGFkamFjZW50Qm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIAot
ICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJvdW5kYXJ5SW5Cb3goYWRq
YWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IGludmFsaWRPZmZzZXQpOwor
ICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJvdW5kYXJ5SW5Cb3goKTsK
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZEJv
dW5kYXJ5SW5Cb3goYWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IGlu
dmFsaWRPZmZzZXQpOwotICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICB3b3JkQnJlYWsgPSB2
aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0g
Ym94ID8gb2Zmc2V0IDogaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOyAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3JkQm91bmRhcnlJbkJveCgpOwor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHZpc3VhbGx5TGFzdFdvcmRC
b3VuZGFyeUluQm94KCk7ICAgICAgICAgICAgCiAgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3RO
dWxsKCkpCiAgICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIH0KICAgICByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAgCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29y
ZEJvdW5kYXJ5KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0LCBUZXh0RGlyZWN0aW9u
IGJsb2NrRGlyZWN0aW9uKQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha0Jhc2U6OnJp
Z2h0V29yZEJvdW5kYXJ5KCkKIHsKKyAgICBJbmxpbmVCb3gqIGN1cnJlbnRCb3ggPSBib3goKTsK
KyAgICBpbnQgY3VycmVudE9mZnNldCA9IG9mZnNldCgpOworICAgIFRleHREaXJlY3Rpb24gY3Vy
cmVudEJsb2NrRGlyZWN0aW9uID0gYmxvY2tEaXJlY3Rpb24oKTsKICAgICAKICAgICBWaXNpYmxl
UG9zaXRpb24gd29yZEJyZWFrOwotICAgIGZvciAoY29uc3QgSW5saW5lQm94KiBhZGphY2VudEJv
eCA9IGJveDsgYWRqYWNlbnRCb3g7IGFkamFjZW50Qm94ID0gYWRqYWNlbnRCb3gtPm5leHRMZWFm
Q2hpbGQoKSkgewotICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gUlRMKSB7CisgICAgZm9y
IChJbmxpbmVCb3gqIGFkamFjZW50Qm94ID0gY3VycmVudEJveDsgYWRqYWNlbnRCb3g7IGFkamFj
ZW50Qm94ID0gYWRqYWNlbnRCb3gtPm5leHRMZWFmQ2hpbGQoKSkgeworICAgICAgICBzZXRCb3go
YWRqYWNlbnRCb3gpOworICAgICAgICBzZXRPZmZzZXQoYWRqYWNlbnRCb3ggPT0gY3VycmVudEJv
eCA/IGN1cnJlbnRPZmZzZXQgOiBzX2ludmFsaWRPZmZzZXQpOworICAgICAgICAKKyAgICAgICAg
aWYgKGN1cnJlbnRCbG9ja0RpcmVjdGlvbiA9PSBSVEwpIHsKICAgICAgICAgICAgIGlmIChhZGph
Y2VudEJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQotICAgICAgICAgICAgICAgIHdvcmRC
cmVhayA9IG5leHRXb3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0g
Ym94ID8gb2Zmc2V0IDogaW52YWxpZE9mZnNldCk7CisgICAgICAgICAgICAgICAgd29yZEJyZWFr
ID0gbmV4dFdvcmRCb3VuZGFyeUluQm94KCk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwg
YWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0IDogaW52YWxpZE9mZnNldCk7CisgICAgICAgICAg
ICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveCgpOwogICAgICAgICB9
IGVsc2UgCi0gICAgICAgICAgICB3b3JkQnJlYWsgPSB2aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJ
bkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0IDogaW52YWxpZE9m
ZnNldCwgYmxvY2tEaXJlY3Rpb24pOyAgICAgICAgICAgIAorICAgICAgICAgICAgd29yZEJyZWFr
ID0gdmlzdWFsbHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goKTsgICAgICAgICAgICAKICAgICAgICAg
aWYgKCF3b3JkQnJlYWsuaXNOdWxsKCkpCiAgICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOwog
ICAgIH0KICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAgICAgCi1zdGF0aWMgYm9v
bCBwb3NpdGlvbklzSW5zaWRlQm94KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29yZEJyZWFrLCBj
b25zdCBJbmxpbmVCb3gqIGJveCkKK2Jvb2wgVmlzdWFsV29yZEJyZWFrQmFzZTo6cG9zaXRpb25J
c0luc2lkZUJveChjb25zdCBWaXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaykKIHsKKyAgICBJbmxp
bmVCb3gqIGN1cnJlbnRCb3ggPSBib3goKTsKKwogICAgIElubGluZUJveCogYm94T2ZXb3JkQnJl
YWs7CiAgICAgaW50IG9mZnNldE9mV29yZEJyZWFrOwogICAgIHdvcmRCcmVhay5nZXRJbmxpbmVC
b3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKLSAgICByZXR1
cm4gYm94ID09IGJveE9mV29yZEJyZWFrICYmIG9mZnNldE9mV29yZEJyZWFrICE9IGJveC0+Y2Fy
ZXRNYXhPZmZzZXQoKSAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBib3gtPmNhcmV0TWluT2Zmc2V0
KCk7CisgICAgcmV0dXJuIGN1cnJlbnRCb3ggPT0gYm94T2ZXb3JkQnJlYWsgJiYgb2Zmc2V0T2ZX
b3JkQnJlYWsgIT0gY3VycmVudEJveC0+Y2FyZXRNYXhPZmZzZXQoKSAmJiBvZmZzZXRPZldvcmRC
cmVhayAhPSBjdXJyZW50Qm94LT5jYXJldE1pbk9mZnNldCgpOworfQorCitWaXNpYmxlUG9zaXRp
b24gVmlzdWFsV29yZEJyZWFrQmFzZTo6bGVmdG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9j
aygpCit7ICAgIAorICAgIElubGluZUJveCogbmV4dEJveDsKKyAgICBmb3IgKGNvbnN0IElubGlu
ZUJveCogY3VycmVudEJveCA9IGJveCgpOyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gbmV4dEJv
eCkgeworICAgICAgICBuZXh0Qm94ID0gY3VycmVudEJveC0+bmV4dExlYWZDaGlsZCgpOworICAg
ICAgICBpZiAoIW5leHRCb3ggfHwgIW5leHRCb3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkK
KyAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oY3VycmVudEJv
eC0+cmVuZGVyZXIoKS0+bm9kZSgpKSwgY3VycmVudEJveC0+Y2FyZXRNYXhPZmZzZXQoKSk7Cisg
ICAgfQorICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKK30KKworVmlzaWJsZVBvc2l0aW9u
IFZpc3VhbFdvcmRCcmVha0Jhc2U6OmxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluUlRMQmxvY2so
KQoreworICAgIElubGluZUJveCogY3VycmVudEJveCA9IGJveCgpOworICAgIHJldHVybiBQb3Np
dGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oY3VycmVudEJveC0+cmVuZGVyZXIoKS0+bm9kZSgpKSwg
Y3VycmVudEJveC0+Y2FyZXRNYXhPZmZzZXQoKSk7Cit9CisKK1Zpc2libGVQb3NpdGlvbiBWaXN1
YWxXb3JkQnJlYWtCYXNlOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5MVFJCbG9jaygpCit7
CisgICAgSW5saW5lQm94KiBjdXJyZW50Qm94ID0gYm94KCk7CisgICAgcmV0dXJuIFBvc2l0aW9u
KHN0YXRpY19jYXN0PFRleHQqPihjdXJyZW50Qm94LT5yZW5kZXJlcigpLT5ub2RlKCkpLCBjdXJy
ZW50Qm94LT5jYXJldE1heE9mZnNldCgpKTsKK30KKworVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdv
cmRCcmVha0Jhc2U6OnJpZ2h0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKCkKK3sKKyAg
ICBJbmxpbmVCb3gqIHByZXZCb3g7CisgICAgZm9yIChjb25zdCBJbmxpbmVCb3gqIGN1cnJlbnRC
b3ggPSBib3goKTsgY3VycmVudEJveDsgY3VycmVudEJveCA9IHByZXZCb3gpIHsKKyAgICAgICAg
cHJldkJveCA9IGN1cnJlbnRCb3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFwcmV2
Qm94IHx8IHByZXZCb3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKKyAgICAgICAgICAgIHJl
dHVybiBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oY3VycmVudEJveC0+cmVuZGVyZXIoKS0+
bm9kZSgpKSwgY3VycmVudEJveC0+Y2FyZXRNYXhPZmZzZXQoKSk7CisgICAgfQorICAgIHJldHVy
biBWaXNpYmxlUG9zaXRpb24oKTsKK30KKworVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVh
a0Jhc2U6OmVuZE9mQm94UG9zaXRpb24oKQoreworICAgIElubGluZUJveCogY3VycmVudEJveCA9
IGJveCgpOworCisgICAgaWYgKGJsb2NrRGlyZWN0aW9uKCkgPT0gTFRSKQorICAgICAgICByZXR1
cm4gY3VycmVudEJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gcmlnaHRtb3N0UG9zaXRp
b25JbkxUUkJveEluTFRSQmxvY2soKSA6IHJpZ2h0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJs
b2NrKCk7CisgICAgcmV0dXJuIGN1cnJlbnRCb3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/
IGxlZnRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soKSA6IGxlZnRtb3N0UG9zaXRpb25J
blJUTEJveEluUlRMQmxvY2soKTsKK30KKworVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVh
a0Jhc2U6OmVuZE9mQmxvY2tQb3NpdGlvbigpCit7CisgICAgaWYgKG5lZWRUb1VzZUxvZ2ljYWxF
bmRPZkxpbmUoKSkKKyAgICAgICAgcmV0dXJuIGxvZ2ljYWxFbmRPZkxpbmUoKnBvc2l0aW9uKCkp
OworICAgICAgICAKKyAgICByZXR1cm4gZW5kT2ZCb3hQb3NpdGlvbigpOworfQorCisvLyBUaGlz
IGhlbHBlciBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGJsb2NrIGNvbnRhaW5pbmcgYm94IGlzIHNp
bXBsZSBlbm91Z2ggc28KKy8vIHRoYXQgdGhlIGxvZ2ljYWxseSBsYXN0IGJveCBpbiB0aGUgYmxv
Y2sgY2FuIGJlIHF1aWNrbHkgKHdvcnN0IGNhc2UgbGluZWFyCisvLyB0aW1lKSBjb21wdXRlZCBm
cm9tIGxvb2tpbmcgYXQgdGhlIGJpZGkgbGV2ZWxzIG9mIHRoZSBib3hlcyB3aXRoaW4gdGhlIGJs
b2NrLgorYm9vbCBWaXN1YWxXb3JkQnJlYWtCYXNlOjpuZWVkVG9Vc2VMb2dpY2FsRW5kT2ZMaW5l
KCkKK3sKKyAgICBpZiAoYmxvY2tEaXJlY3Rpb24oKSA9PSBMVFIpIHsKKyAgICAgICAgaWYgKCFi
b3goKS0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlm
IChib3goKS0+YmlkaUxldmVsKCkgPT0gMSkgeworICAgICAgICAgICAgSW5saW5lQm94KiBwcmV2
Qm94ID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgSW5saW5lQm94KiBjdXJyZW50Qm94ID0g
Ym94KCk7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBwcmV2Qm94KSB7CisgICAgICAgICAgICAg
ICAgcHJldkJveCA9IGN1cnJlbnRCb3gtPnByZXZPbkxpbmUoKTsKKyAgICAgICAgICAgICAgICBp
ZiAoIXByZXZCb3ggfHwgIXByZXZCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCEocHJldkJveC0+YmlkaUxldmVs
KCkgJSAyKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYm94KCktPmJpZGlMZXZlbCgp
ID09IDEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChib3goKS0+Ymlk
aUxldmVsKCkgPT0gMikgeworICAgICAgICAgICAgSW5saW5lQm94KiBuZXh0Qm94ID0gMDsKKyAg
ICAgICAgICAgIGZvciAoY29uc3QgSW5saW5lQm94KiBjdXJyZW50Qm94ID0gYm94KCk7IGN1cnJl
bnRCb3g7IGN1cnJlbnRCb3ggPSBuZXh0Qm94KSB7CisgICAgICAgICAgICAgICAgbmV4dEJveCA9
IGN1cnJlbnRCb3gtPm5leHRPbkxpbmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW5leHRCb3gg
fHwgbmV4dEJveC0+YmlkaUxldmVsKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghKG5leHRCb3gtPmJpZGlMZXZlbCgpICUgMikp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWaXN1YWxXb3JkQnJl
YWtCYXNlOjppc0JveFZpc3VhbGx5TGFzdEluQmxvY2soKQoreworICAgIElubGluZUJveCogY3Vy
cmVudEJveCA9IGJveCgpOworCisgICAgcmV0dXJuIGJsb2NrRGlyZWN0aW9uKCkgPT0gTFRSID8g
IWN1cnJlbnRCb3gtPm5leHRMZWFmQ2hpbGQoKSA6ICFjdXJyZW50Qm94LT5wcmV2TGVhZkNoaWxk
KCk7Cit9CisKKy8vIFdpbmRvd3MgdmVyc2lvbiBzdGFydHMgaGVyZQorCit2b2lkIFZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1l
RGlyZWN0aW9uYWxpdHkoKQoreworICAgIFdvcmRCb3VuZGFyeVZlY3Rvciogb3JkZXJlZFdvcmRC
b3VuZGFyaWVzID0gd29yZEJyZWFrcygpOworICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy0+Y2xl
YXIoKTsKKworICAgIGlmIChpc0JveFZpc3VhbGx5TGFzdEluQmxvY2soKSkgeworICAgICAgICBJ
bmxpbmVCb3gqIGJveE9mRW5kT2ZCbG9jazsKKyAgICAgICAgaW50IG9mZnNldE9mRW5kT2ZCbG9j
azsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mQmxvY2sgPSBlbmRPZkJsb2NrUG9zaXRp
b24oKTsKKyAgICAgICAgCisgICAgICAgIGVuZE9mQmxvY2suZ2V0SW5saW5lQm94QW5kT2Zmc2V0
KGJveE9mRW5kT2ZCbG9jaywgb2Zmc2V0T2ZFbmRPZkJsb2NrKTsKKyAgICAgICAgb3JkZXJlZFdv
cmRCb3VuZGFyaWVzLT5hcHBlbmQoV29yZEJvdW5kYXJ5RW50cnkoZW5kT2ZCbG9jaywgb2Zmc2V0
T2ZFbmRPZkJsb2NrKSk7CisgICAgfQorICAgIAorICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJl
YWs7CisgICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gc19pbnZhbGlkT2Zmc2V0OworICAgIHdo
aWxlICgxKSB7CisgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJyZWFrSW5Cb3hJbnNp
ZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVh
ayk7CisgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOdWxsKCkpCisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgV29yZEJvdW5kYXJ5RW50cnkgd29yZEJvdW5kYXJ5RW50cnkod29yZEJyZWFrLCBv
ZmZzZXRPZldvcmRCcmVhayk7CisgICAgICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy0+YXBwZW5k
KHdvcmRCb3VuZGFyeUVudHJ5KTsKKyAgICB9Cit9CisKK3ZvaWQgVmlzdWFsV29yZEJyZWFrV2lu
ZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0
aW9uYWxpdHkoKQoreworICAgIFdvcmRCb3VuZGFyeVZlY3Rvciogb3JkZXJlZFdvcmRCb3VuZGFy
aWVzID0gd29yZEJyZWFrcygpOworICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy0+Y2xlYXIoKTsK
KyAgICAKKyAgICBpZiAoaXNCb3hWaXN1YWxseUxhc3RJbkJsb2NrKCkpIHsKKyAgICAgICAgSW5s
aW5lQm94KiBib3hPZkVuZE9mQmxvY2s7CisgICAgICAgIGludCBvZmZzZXRPZkVuZE9mQmxvY2s7
CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZkJsb2NrID0gZW5kT2ZCbG9ja1Bvc2l0aW9u
KCk7CisKKyAgICAgICAgZW5kT2ZCbG9jay5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZFbmRP
ZkJsb2NrLCBvZmZzZXRPZkVuZE9mQmxvY2spOworICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJp
ZXMtPmFwcGVuZChXb3JkQm91bmRhcnlFbnRyeShlbmRPZkJsb2NrLCBvZmZzZXRPZkVuZE9mQmxv
Y2spKTsKKyAgICB9CisgICAgCisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKKyAgICBp
bnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSBzX2ludmFsaWRPZmZzZXQ7CisgICAgYm9vbCBpc0xhc3RX
b3JkQnJlYWtJbkJveCA9IGZhbHNlOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdvcmRCcmVh
ayA9IG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFs
aXR5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWssIGlzTGFzdFdvcmRCcmVha0luQm94KTsK
KyAgICAgICAgaWYgKHdvcmRCcmVhay5pc05vdE51bGwoKSkgeworICAgICAgICAgICAgV29yZEJv
dW5kYXJ5RW50cnkgd29yZEJvdW5kYXJ5RW50cnkod29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVh
ayk7CisgICAgICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPmFwcGVuZCh3b3JkQm91bmRh
cnlFbnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTGFzdFdvcmRCcmVha0luQm94KQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCi1WaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRQ
b3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK3ZvaWQgVmlz
dWFsV29yZEJyZWFrV2luZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveCgpCit7CisgICAgaWYg
KGJveCgpLT5kaXJlY3Rpb24oKSA9PSBibG9ja0RpcmVjdGlvbigpKQorICAgICAgICBjb2xsZWN0
V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KCk7CisgICAg
ZWxzZQorICAgICAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVy
bnREaXJlY3Rpb25hbGl0eSgpOyAgICAgICAgCit9CisKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxX
b3JkQnJlYWtXaW5kb3dzOjpsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYg
dmlzaWJsZVBvc2l0aW9uKQogewogICAgIElubGluZUJveCogYm94OwogICAgIGludCBvZmZzZXQ7
CiAgICAgdmlzaWJsZVBvc2l0aW9uLmdldElubGluZUJveEFuZE9mZnNldChib3gsIG9mZnNldCk7
CiAgICAgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbiA9IGRpcmVjdGlvbk9mRW5jbG9zaW5n
QmxvY2sodmlzaWJsZVBvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkpOwogICAgIAorICAgIHNldFBv
c2l0aW9uKHZpc2libGVQb3NpdGlvbik7CisgICAgc2V0Qm94KGJveCk7CisgICAgc2V0T2Zmc2V0
KG9mZnNldCk7CisgICAgc2V0QmxvY2tEaXJlY3Rpb24oYmxvY2tEaXJlY3Rpb24pOworICAgIAog
ICAgIC8vIEZJWE1FOiBJZiB0aGUgYm94J3MgZGlyZWN0aW9uYWxpdHkgaXMgdGhlIHNhbWUgYXMg
dGhhdCBvZiB0aGUgZW5jbG9zaW5nIGJsb2NrLCB3aGVuIHRoZSBvZmZzZXQgaXMgYXQgdGhlIGJv
eCBib3VuZGFyeQogICAgIC8vIGFuZCB0aGUgZGlyZWN0aW9uIGlzIHRvd2FyZHMgaW5zaWRlIHRo
ZSBib3gsIGRvIEkgc3RpbGwgbmVlZCB0byBtYWtlIGl0IGEgc3BlY2lhbCBjYXNlPyBGb3IgZXhh
bXBsZSwgYSBMVFIgYm94IGluc2lkZSBhIExUUiBibG9jaywKICAgICAvLyB3aGVuIG9mZnNldCBp
cyBhdCBib3gncyBjYXJldE1pbk9mZnNldCBhbmQgdGhlIGRpcmVjdGlvbiBpcyBEaXJlY3Rpb25S
aWdodCwgc2hvdWxkIGl0IGJlIHRha2VuIGNhcmUgYXMgYSBnZW5lcmFsIGNhc2U/Ci0gICAgaWYg
KG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkKLSAgICAgICAgcmV0dXJuIGxl
ZnRXb3JkQm91bmRhcnkoYm94LT5wcmV2TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2Nr
RGlyZWN0aW9uKTsKLSAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQo
KSkKLSAgICAgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LCBvZmZzZXQsIGJsb2NrRGly
ZWN0aW9uKTsKKyAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKSB7
CisgICAgICAgIHNldEJveChib3gtPnByZXZMZWFmQ2hpbGQoKSk7CisgICAgICAgIHNldE9mZnNl
dChzX2ludmFsaWRPZmZzZXQpOworICAgICAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeSgpOwor
ICAgIH0KICAgICAKKyAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQo
KSkKKyAgICAgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoKTsKICAgICAKICAgICBWaXNpYmxl
UG9zaXRpb24gd29yZEJyZWFrOwogICAgIGlmIChibG9ja0RpcmVjdGlvbiA9PSBMVFIpIHsKQEAg
LTE1NDEsMzEgKzE2ODEsNDIgQEAgVmlzaWJsZVBvc2l0aW9uIGxlZnRXb3JkUG9zaXRpb24oY29u
c3QgVgogICAgICAgICBlbHNlCiAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZFBvc2l0
aW9uKHZpc2libGVQb3NpdGlvbik7CiAgICAgfQotICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxs
KCkgJiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWssIGJveCkpCisgICAgaWYgKHdvcmRC
cmVhay5pc05vdE51bGwoKSAmJiBwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaykpCiAgICAg
ICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgCiAgICAgV29yZEJvdW5kYXJ5VmVjdG9yIG9yZGVy
ZWRXb3JkQm91bmRhcmllczsKLSAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KGJveCwgb3JkZXJl
ZFdvcmRCb3VuZGFyaWVzLCBibG9ja0RpcmVjdGlvbik7CisgICAgc2V0V29yZEJyZWFrcygmb3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7CiAKLSAg
ICBpbnQgaW5kZXggPSBib3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IGdyZWF0ZXN0VmFs
dWVVbmRlcihvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IExUUiwgb3JkZXJlZFdvcmRCb3VuZGFy
aWVzKSA6Ci0gICAgICAgIHNtYWxsZXN0T2Zmc2V0QWJvdmUob2Zmc2V0LCBibG9ja0RpcmVjdGlv
biA9PSBSVEwsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7Ci0gICAgaWYgKGluZGV4ICE9IGludmFs
aWRPZmZzZXQpCisgICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkg
PyBncmVhdGVzdFZhbHVlVW5kZXIoKSA6IHNtYWxsZXN0T2Zmc2V0QWJvdmUoKTsKKyAgICBpZiAo
aW5kZXggIT0gc19pbnZhbGlkT2Zmc2V0KQogICAgICAgICByZXR1cm4gb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzW2luZGV4XS52aXNpYmxlUG9zaXRpb247CiAgICAgCi0gICAgcmV0dXJuIGxlZnRXb3Jk
Qm91bmRhcnkoYm94LT5wcmV2TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0
aW9uKTsKKyAgICBzZXRCb3goYm94LT5wcmV2TGVhZkNoaWxkKCkpOworICAgIHNldE9mZnNldChz
X2ludmFsaWRPZmZzZXQpOworICAgIHJldHVybiBsZWZ0V29yZEJvdW5kYXJ5KCk7CiB9CiAKLVZp
c2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZp
c2libGVQb3NpdGlvbikKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpy
aWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikK
IHsKICAgICBJbmxpbmVCb3gqIGJveDsKICAgICBpbnQgb2Zmc2V0OwogICAgIHZpc2libGVQb3Np
dGlvbi5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94LCBvZmZzZXQpOwogICAgIFRleHREaXJlY3Rp
b24gYmxvY2tEaXJlY3Rpb24gPSBkaXJlY3Rpb25PZkVuY2xvc2luZ0Jsb2NrKHZpc2libGVQb3Np
dGlvbi5kZWVwRXF1aXZhbGVudCgpKTsKICAgICAKKyAgICBzZXRQb3NpdGlvbih2aXNpYmxlUG9z
aXRpb24pOworICAgIHNldEJveChib3gpOworICAgIHNldE9mZnNldChvZmZzZXQpOworICAgIHNl
dEJsb2NrRGlyZWN0aW9uKGJsb2NrRGlyZWN0aW9uKTsKKyAgICAKICAgICBpZiAob2Zmc2V0ID09
IGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKQotICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91
bmRhcnkoYm94LCBvZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKLSAgICBpZiAob2Zmc2V0ID09IGJv
eC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKLSAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5k
YXJ5KGJveC0+bmV4dExlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7
CisgICAgICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeSgpOworICAgICAgICAKKyAgICBpZiAo
b2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkgeworICAgICAgICBzZXRCb3go
Ym94LT5uZXh0TGVhZkNoaWxkKCkpOworICAgICAgICBzZXRPZmZzZXQoc19pbnZhbGlkT2Zmc2V0
KTsKKyAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KCk7CisgICAgfQogIAogICAgIFZp
c2libGVQb3NpdGlvbiB3b3JkQnJlYWs7CiAgICAgaWYgKGJsb2NrRGlyZWN0aW9uID09IFJUTCkg
ewpAQCAtMTU3NCwxOCArMTcyNSwyMDEgQEAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0
aW9uKGNvbnN0IAogICAgICAgICBlbHNlCiAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29y
ZFBvc2l0aW9uKHZpc2libGVQb3NpdGlvbik7CiAgICAgfQotICAgIGlmICh3b3JkQnJlYWsuaXNO
b3ROdWxsKCkgJiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWssIGJveCkpCisgICAgaWYg
KHdvcmRCcmVhay5pc05vdE51bGwoKSAmJiBwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaykp
CiAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgCiAgICAgV29yZEJvdW5kYXJ5VmVjdG9y
IG9yZGVyZWRXb3JkQm91bmRhcmllczsKLSAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KGJveCwg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLCBibG9ja0RpcmVjdGlvbik7CisgICAgc2V0V29yZEJyZWFr
cygmb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7
CisgICAgCisgICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBz
bWFsbGVzdE9mZnNldEFib3ZlKCkgOiBncmVhdGVzdFZhbHVlVW5kZXIoKTsKKyAgICBpZiAoaW5k
ZXggIT0gc19pbnZhbGlkT2Zmc2V0KQorICAgICAgICByZXR1cm4gb3JkZXJlZFdvcmRCb3VuZGFy
aWVzW2luZGV4XS52aXNpYmxlUG9zaXRpb247CisgICAgCisgICAgc2V0Qm94KGJveC0+bmV4dExl
YWZDaGlsZCgpKTsKKyAgICBzZXRPZmZzZXQoc19pbnZhbGlkT2Zmc2V0KTsKKyAgICByZXR1cm4g
cmlnaHRXb3JkQm91bmRhcnkoKTsKK30KKworLy8gVW5peCB2ZXJzaW9uIHN0YXJ0cyBoZXJlCisK
K3ZvaWQgVmlzdWFsV29yZEJyZWFrVW5peDo6Y29sbGVjdFdvcmRCcmVha3NVc2luZ1ByZXZpb3Vz
KCkKK3sKKyAgICBJbmxpbmVCb3gqIGN1cnJlbnRCb3ggPSBib3goKTsKKyAgICBUZXh0RGlyZWN0
aW9uIGN1cnJlbnRCbG9ja0RpcmVjdGlvbiA9IGJsb2NrRGlyZWN0aW9uKCk7CisKKyAgICBXb3Jk
Qm91bmRhcnlWZWN0b3IqIG9yZGVyZWRXb3JkQm91bmRhcmllcyA9IHdvcmRCcmVha3MoKTsKKyAg
ICBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPmNsZWFyKCk7CisKKyAgICBWaXNpYmxlUG9zaXRpb24g
d29yZEJyZWFrOworICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IHNfaW52YWxpZE9mZnNldDsK
KyAgICB3aGlsZSAoMSkgeworICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVha0lu
Qm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KHdvcmRCcmVhaywgb2Zmc2V0T2ZX
b3JkQnJlYWspOworICAgICAgICBpZiAod29yZEJyZWFrLmlzTnVsbCgpKQorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRC
cmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICAKKyAgICAgICAgaWYgKCEob3JkZXJl
ZFdvcmRCb3VuZGFyaWVzLT5zaXplKCkgJiYgb2Zmc2V0T2ZXb3JkQnJlYWsgPiAoKm9yZGVyZWRX
b3JkQm91bmRhcmllcylbMF0ub2Zmc2V0SW5JbmxpbmVCb3gpICYmIG9mZnNldE9mV29yZEJyZWFr
ICE9IGN1cnJlbnRCb3gtPmNhcmV0TWF4T2Zmc2V0KCkpCisgICAgICAgICAgICBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMtPnByZXBlbmQod29yZEJvdW5kYXJ5RW50cnkpOworICAgIH0KKyAgICAKKyAg
ICBWaXNpYmxlUG9zaXRpb24gZW5kT2ZCb3ggPSBlbmRPZkJveFBvc2l0aW9uKCk7CisgICAgSW5s
aW5lQm94KiBib3hPZkVuZE9mQm94OworICAgIGludCBvZmZzZXRPZkVuZE9mQm94OworICAgIGVu
ZE9mQm94LmdldElubGluZUJveEFuZE9mZnNldChib3hPZkVuZE9mQm94LCBvZmZzZXRPZkVuZE9m
Qm94KTsKKyAgICAKKyAgICBpZiAoY3VycmVudEJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
ICYmIGN1cnJlbnRCbG9ja0RpcmVjdGlvbiA9PSBSVEwpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRC
b3gtPnByZXZMZWFmQ2hpbGQoKSAmJiBjdXJyZW50Qm94LT5wcmV2TGVhZkNoaWxkKCktPmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSkKKyAgICAgICAgICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy0+
cHJlcGVuZChXb3JkQm91bmRhcnlFbnRyeShQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oY3Vy
cmVudEJveC0+cmVuZGVyZXIoKS0+bm9kZSgpKSwgY3VycmVudEJveC0+Y2FyZXRNaW5PZmZzZXQo
KSksIGN1cnJlbnRCb3gtPmNhcmV0TWluT2Zmc2V0KCkpKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5wcmVwZW5kKFdvcmRCb3VuZGFyeUVudHJ5KGVu
ZE9mQm94LCBjdXJyZW50Qm94LT5jYXJldE1pbk9mZnNldCgpKSk7CisKKyAgICB9IGVsc2UgaWYg
KCFjdXJyZW50Qm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgJiYgY3VycmVudEJsb2NrRGly
ZWN0aW9uID09IExUUikgeworICAgICAgICBpZiAoY3VycmVudEJveC0+bmV4dExlYWZDaGlsZCgp
ICYmICFjdXJyZW50Qm94LT5uZXh0TGVhZkNoaWxkKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSkKKyAgICAgICAgICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy0+cHJlcGVuZChXb3JkQm91bmRh
cnlFbnRyeShQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oY3VycmVudEJveC0+cmVuZGVyZXIo
KS0+bm9kZSgpKSwgY3VycmVudEJveC0+Y2FyZXRNaW5PZmZzZXQoKSksIGN1cnJlbnRCb3gtPmNh
cmV0TWluT2Zmc2V0KCkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzLT5wcmVwZW5kKFdvcmRCb3VuZGFyeUVudHJ5KGVuZE9mQm94LCBjdXJyZW50Qm94
LT5jYXJldE1pbk9mZnNldCgpKSk7CisgICAgfQorfQorCit2b2lkIFZpc3VhbFdvcmRCcmVha1Vu
aXg6OmNvbGxlY3RXb3JkQnJlYWtzVXNpbmdOZXh0KCkKK3sKKyAgICBXb3JkQm91bmRhcnlWZWN0
b3IqIG9yZGVyZWRXb3JkQm91bmRhcmllcyA9IHdvcmRCcmVha3MoKTsKKyAgICBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMtPmNsZWFyKCk7CisgICAgCisgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVh
azsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSBzX2ludmFsaWRPZmZzZXQ7CisgICAgYm9v
bCBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IGZhbHNlOworICAgIHdoaWxlICgxKSB7CisgICAgICAg
IHdvcmRCcmVhayA9IG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERp
cmVjdGlvbmFsaXR5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWssIGlzTGFzdFdvcmRCcmVh
a0luQm94KTsKKyAgICAgICAgaWYgKHdvcmRCcmVhay5pc05vdE51bGwoKSkgeworICAgICAgICAg
ICAgV29yZEJvdW5kYXJ5RW50cnkgd29yZEJvdW5kYXJ5RW50cnkod29yZEJyZWFrLCBvZmZzZXRP
ZldvcmRCcmVhayk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghb3JkZXJlZFdvcmRC
b3VuZGFyaWVzLT5zaXplKCkgJiYgaXNMYXN0V29yZEJyZWFrSW5Cb3gpCisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIShvcmRlcmVkV29yZEJv
dW5kYXJpZXMtPnNpemUoKSAmJiBvZmZzZXRPZldvcmRCcmVhayA8ICgqb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzKVswXS5vZmZzZXRJbklubGluZUJveCkpCisgICAgICAgICAgICAgICAgb3JkZXJlZFdv
cmRCb3VuZGFyaWVzLT5wcmVwZW5kKHdvcmRCb3VuZGFyeUVudHJ5KTsKKyAgICAgICAgfQorICAg
ICAgICBpZiAoaXNMYXN0V29yZEJyZWFrSW5Cb3gpCisgICAgICAgICAgICBicmVhazsKKyAgICB9
Cit9CisKK3ZvaWQgVmlzdWFsV29yZEJyZWFrVW5peDo6Y29sbGVjdFdvcmRCcmVha3NJbkJveCgp
Cit7CisgICAgSW5saW5lQm94KiBjdXJyZW50Qm94ID0gYm94KCk7CisgICAgYm9vbCBjdXJzb3JJ
c01vdmluZ0xlZnQgPSBtb3ZpbmdMZWZ0KCk7CisgICAgCisgICAgaWYgKChjdXJyZW50Qm94LT5p
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgJiYgIWN1cnNvcklzTW92aW5nTGVmdCkKKyAgICAgICAg
fHwgKCFjdXJyZW50Qm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgJiYgY3Vyc29ySXNNb3Zp
bmdMZWZ0KSkKKyAgICAgICAgY29sbGVjdFdvcmRCcmVha3NVc2luZ05leHQoKTsKKyAgICBlbHNl
CisgICAgICAgIGNvbGxlY3RXb3JkQnJlYWtzVXNpbmdQcmV2aW91cygpOworfQorCitWaXNpYmxl
UG9zaXRpb24gVmlzdWFsV29yZEJyZWFrVW5peDo6bGVmdFdvcmRQb3NpdGlvbihjb25zdCBWaXNp
YmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK3sKKyAgICBJbmxpbmVCb3gqIGJveDsKKyAg
ICBpbnQgb2Zmc2V0OworICAgIHZpc2libGVQb3NpdGlvbi5nZXRJbmxpbmVCb3hBbmRPZmZzZXQo
Ym94LCBvZmZzZXQpOworICAgIFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24gPSBkaXJlY3Rp
b25PZkVuY2xvc2luZ0Jsb2NrKHZpc2libGVQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKTsKKyAg
ICAKKyAgICBzZXRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworICAgIHNldEJveChib3gpOwor
ICAgIHNldE9mZnNldChvZmZzZXQpOworICAgIHNldEJsb2NrRGlyZWN0aW9uKGJsb2NrRGlyZWN0
aW9uKTsKKyAgICBzZXRNb3ZpbmdMZWZ0KHRydWUpOworICAgIAorICAgIGlmIChvZmZzZXQgPT0g
Ym94LT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpIHsKKyAgICAgICAgc2V0Qm94KGJveC0+cHJldkxl
YWZDaGlsZCgpKTsKKyAgICAgICAgc2V0T2Zmc2V0KHNfaW52YWxpZE9mZnNldCk7CisgICAgICAg
IHJldHVybiBsZWZ0V29yZEJvdW5kYXJ5KCk7CisgICAgfQorICAgIAorICAgIGlmIChvZmZzZXQg
PT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKQorICAgICAgICByZXR1cm4gbGVmdFdvcmRC
b3VuZGFyeSgpOworICAgIAorICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7CisgICAgaWYg
KGJsb2NrRGlyZWN0aW9uID09IExUUikgeworICAgICAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9
PSBibG9ja0RpcmVjdGlvbikKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZFBv
c2l0aW9uKHZpc2libGVQb3NpdGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdvcmRC
cmVhayA9IG5leHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICAgICAgaWYgKHdv
cmRCcmVhay5pc05vdE51bGwoKSAmJiBwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaykpCisg
ICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChi
b3gtPmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9uKQorICAgICAgICAgICAgd29yZEJyZWFr
ID0gbmV4dFdvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24p
OworICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIHBvc2l0aW9uSXNJbnNpZGVC
b3god29yZEJyZWFrKSkKKyAgICAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CisgICAgfQogICAg
IAotICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gc21hbGxl
c3RPZmZzZXRBYm92ZShvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IExUUiwgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzKSA6Ci0gICAgICAgIGdyZWF0ZXN0VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGly
ZWN0aW9uID09IFJUTCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKLSAgICBpZiAoaW5kZXggIT0g
aW52YWxpZE9mZnNldCkKKyAgICBXb3JkQm91bmRhcnlWZWN0b3Igb3JkZXJlZFdvcmRCb3VuZGFy
aWVzOworICAgIHNldFdvcmRCcmVha3MoJm9yZGVyZWRXb3JkQm91bmRhcmllcyk7CisgICAgY29s
bGVjdFdvcmRCcmVha3NJbkJveCgpOworCisgICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCkgPyBncmVhdGVzdFZhbHVlVW5kZXIoKSA6IHNtYWxsZXN0T2Zmc2V0QWJv
dmUoKTsKKyAgICBpZiAoaW5kZXggIT0gc19pbnZhbGlkT2Zmc2V0KQogICAgICAgICByZXR1cm4g
b3JkZXJlZFdvcmRCb3VuZGFyaWVzW2luZGV4XS52aXNpYmxlUG9zaXRpb247CiAgICAgCi0gICAg
cmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgpLCBpbnZhbGlkT2Zm
c2V0LCBibG9ja0RpcmVjdGlvbik7CisgICAgc2V0Qm94KGJveC0+cHJldkxlYWZDaGlsZCgpKTsK
KyAgICBzZXRPZmZzZXQoc19pbnZhbGlkT2Zmc2V0KTsKKyAgICByZXR1cm4gbGVmdFdvcmRCb3Vu
ZGFyeSgpOworfQorCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrVW5peDo6cmlnaHRX
b3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24pCit7Cisg
ICAgSW5saW5lQm94KiBib3g7CisgICAgaW50IG9mZnNldDsKKyAgICB2aXNpYmxlUG9zaXRpb24u
Z2V0SW5saW5lQm94QW5kT2Zmc2V0KGJveCwgb2Zmc2V0KTsKKyAgICBUZXh0RGlyZWN0aW9uIGJs
b2NrRGlyZWN0aW9uID0gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayh2aXNpYmxlUG9zaXRpb24u
ZGVlcEVxdWl2YWxlbnQoKSk7CisgICAgCisgICAgc2V0UG9zaXRpb24odmlzaWJsZVBvc2l0aW9u
KTsKKyAgICBzZXRCb3goYm94KTsKKyAgICBzZXRPZmZzZXQob2Zmc2V0KTsKKyAgICBzZXRCbG9j
a0RpcmVjdGlvbihibG9ja0RpcmVjdGlvbik7CisgICAgc2V0TW92aW5nTGVmdChmYWxzZSk7Cisg
ICAgCisgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkKKyAgICAg
ICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KCk7CisgICAgICAgIAorICAgIGlmIChvZmZzZXQg
PT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKSB7CisgICAgICAgIHNldEJveChib3gtPm5l
eHRMZWFmQ2hpbGQoKSk7CisgICAgICAgIHNldE9mZnNldChzX2ludmFsaWRPZmZzZXQpOworICAg
ICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoKTsKKyAgICB9CisgCisgICAgVmlzaWJsZVBv
c2l0aW9uIHdvcmRCcmVhazsKKyAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gUlRMKSB7CisgICAg
ICAgIGlmIChib3gtPmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9uKQorICAgICAgICAgICAg
d29yZEJyZWFrID0gcHJldmlvdXNXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRQb3NpdGlvbih2aXNpYmxl
UG9zaXRpb24pOworICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIHBvc2l0aW9u
SXNJbnNpZGVCb3god29yZEJyZWFrKSkKKyAgICAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tEaXJlY3Rp
b24pCisgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZFBvc2l0aW9uKHZpc2libGVQb3Np
dGlvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29y
ZFBvc2l0aW9uKHZpc2libGVQb3NpdGlvbik7CisgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3RO
dWxsKCkgJiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWspKQorICAgICAgICAgICAgcmV0
dXJuIHdvcmRCcmVhazsKKyAgICB9CisgICAgCisgICAgV29yZEJvdW5kYXJ5VmVjdG9yIG9yZGVy
ZWRXb3JkQm91bmRhcmllczsKKyAgICBzZXRXb3JkQnJlYWtzKCZvcmRlcmVkV29yZEJvdW5kYXJp
ZXMpOworICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goKTsKKyAgICAKKyAgICBpbnQgaW5kZXgg
PSBib3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IHNtYWxsZXN0T2Zmc2V0QWJvdmUoKSA6
IGdyZWF0ZXN0VmFsdWVVbmRlcigpOworICAgIGlmIChpbmRleCAhPSBzX2ludmFsaWRPZmZzZXQp
CisgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbaW5kZXhdLnZpc2libGVQb3Np
dGlvbjsKKyAgICAgICAgCisgICAgc2V0Qm94KGJveC0+bmV4dExlYWZDaGlsZCgpKTsKKyAgICBz
ZXRPZmZzZXQoc19pbnZhbGlkT2Zmc2V0KTsKKyAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnko
KTsKIH0KIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmgJKHJl
dmlzaW9uIDkwNzk1KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI5LDEwICsyOSwxNCBAQAogI2luY2x1ZGUgIkVkaXRpbmdCb3Vu
ZGFyeS5oIgogI2luY2x1ZGUgIlRleHREaXJlY3Rpb24uaCIKIAorLy8jaW5jbHVkZSAiSW5saW5l
Qm94LmgiCisjaW5jbHVkZSAiVmlzaWJsZVBvc2l0aW9uLmgiCisKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAogY2xhc3MgTm9kZTsKIGNsYXNzIFZpc2libGVQb3NpdGlvbjsKK2NsYXNzIElubGluZUJv
eDsKIAogZW51bSBFV29yZFNpZGUgeyBSaWdodFdvcmRJZk9uQm91bmRhcnkgPSBmYWxzZSwgTGVm
dFdvcmRJZk9uQm91bmRhcnkgPSB0cnVlIH07CiAKQEAgLTQxLDggKzQ1LDYgQEAgVmlzaWJsZVBv
c2l0aW9uIHN0YXJ0T2ZXb3JkKGNvbnN0IFZpc2libAogVmlzaWJsZVBvc2l0aW9uIGVuZE9mV29y
ZChjb25zdCBWaXNpYmxlUG9zaXRpb24gJiwgRVdvcmRTaWRlID0gUmlnaHRXb3JkSWZPbkJvdW5k
YXJ5KTsKIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxl
UG9zaXRpb24gJik7CiBWaXNpYmxlUG9zaXRpb24gbmV4dFdvcmRQb3NpdGlvbihjb25zdCBWaXNp
YmxlUG9zaXRpb24gJik7Ci1WaXNpYmxlUG9zaXRpb24gcmlnaHRXb3JkUG9zaXRpb24oY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJik7Ci1WaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRQb3NpdGlvbihjb25z
dCBWaXNpYmxlUG9zaXRpb24mKTsKIGJvb2wgaXNTdGFydE9mV29yZChjb25zdCBWaXNpYmxlUG9z
aXRpb24mKTsKIAogLy8gc2VudGVuY2VzCkBAIC05NSw2ICs5NywxMTUgQEAgYm9vbCBpc0VuZE9m
RG9jdW1lbnQoY29uc3QgVmlzaWJsZVBvc2l0aQogVmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZFZGl0
YWJsZUNvbnRlbnQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiBWaXNpYmxlUG9zaXRpb24gZW5k
T2ZFZGl0YWJsZUNvbnRlbnQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiAKK2NsYXNzIFZpc3Vh
bFdvcmRCcmVha0Jhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VmlzdWFsV29y
ZEJyZWFrQmFzZSgpIHsgfQorICAgICAgICAKKyAgICAgICAgdmlydHVhbCBWaXNpYmxlUG9zaXRp
b24gcmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJikgPSAwOworICAgICAg
ICB2aXJ0dWFsIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQ
b3NpdGlvbiYpID0gMDsKKyAgICAgICAgCisgICAgICAgIHZvaWQgc2V0UG9zaXRpb24oVmlzaWJs
ZVBvc2l0aW9uIHBvc2l0aW9uKSB7IG1fcG9zaXRpb24gPSAmcG9zaXRpb247IH0KKyAgICAgICAg
dm9pZCBzZXRCb3goSW5saW5lQm94KiBib3gpIHsgbV9ib3ggPSBib3g7IH0KKyAgICAgICAgdm9p
ZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgeyBtX29mZnNldCA9IG9mZnNldDsgfQorICAgICAgICB2
b2lkIHNldEJsb2NrRGlyZWN0aW9uKFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24pIHsgbV9i
bG9ja0RpcmVjdGlvbiA9IGJsb2NrRGlyZWN0aW9uOyB9CisgICAgICAgIAorICAgICAgICBWaXNp
YmxlUG9zaXRpb24qIHBvc2l0aW9uKCkgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQorICAgICAgICBJ
bmxpbmVCb3gqIGJveCgpIHsgcmV0dXJuIG1fYm94OyB9CisgICAgICAgIGludCBvZmZzZXQoKSB7
IHJldHVybiBtX29mZnNldDsgfQorICAgICAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9u
KCkgeyByZXR1cm4gbV9ibG9ja0RpcmVjdGlvbjsgfQorICAgICAgICAgICAgICAgIAorICAgIHBy
b3RlY3RlZDoKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBzX2ludmFsaWRPZmZzZXQgPSAtMTsK
KyAgICAgICAgCisgICAgICAgIHN0cnVjdCBXb3JkQm91bmRhcnlFbnRyeSB7CisgICAgICAgICAg
ICBXb3JkQm91bmRhcnlFbnRyeSgpCisgICAgICAgICAgICAgICAgOiBvZmZzZXRJbklubGluZUJv
eChzX2ludmFsaWRPZmZzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5KGNvbnN0IFZpc2libGVQb3NpdGlv
biYgcG9zaXRpb24sIGludCBvZmZzZXQpCisgICAgICAgICAgICAgICAgOiB2aXNpYmxlUG9zaXRp
b24ocG9zaXRpb24pCisgICAgICAgICAgICAgICAgLCBvZmZzZXRJbklubGluZUJveChvZmZzZXQp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb247CisgICAgICAgICAgICBpbnQgb2Zmc2V0
SW5JbmxpbmVCb3g7CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBWZWN0b3I8V29yZEJv
dW5kYXJ5RW50cnksIDUwPiBXb3JkQm91bmRhcnlWZWN0b3I7CisgICAgCisgICAgcHVibGljOgor
ICAgICAgICB2b2lkIHNldFdvcmRCcmVha3MoV29yZEJvdW5kYXJ5VmVjdG9yKiB3b3JkQnJlYWtz
KSB7IG1fd29yZEJyZWFrcyA9IHdvcmRCcmVha3M7IH0KKyAgICAgICAgV29yZEJvdW5kYXJ5VmVj
dG9yKiB3b3JkQnJlYWtzKCkgeyByZXR1cm4gbV93b3JkQnJlYWtzOyB9CisKKyAgICBwcm90ZWN0
ZWQ6CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94KCkgPSAwOyAg
ICAKKworICAgICAgICBWaXNpYmxlUG9zaXRpb24gbGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5M
VFJCbG9jaygpOworICAgICAgICBWaXNpYmxlUG9zaXRpb24gcmlnaHRtb3N0UG9zaXRpb25JbkxU
UkJveEluUlRMQmxvY2soKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxhc3RXb3JkQnJlYWtJ
bkJveChpbnQmIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxl
ZnRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0
aW9uIGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluUlRMQmxvY2soKTsKKyAgICAgICAgVmlzaWJs
ZVBvc2l0aW9uIHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJbkxUUkJsb2NrKCk7CisgICAgICAg
IFZpc2libGVQb3NpdGlvbiByaWdodG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jaygpOwor
ICAgICAgICBWaXNpYmxlUG9zaXRpb24gZW5kT2ZCb3hQb3NpdGlvbigpOworICAgICAgICBWaXNp
YmxlUG9zaXRpb24gZW5kT2ZCbG9ja1Bvc2l0aW9uKCk7CisgICAgICAgIFZpc2libGVQb3NpdGlv
biBwcmV2aW91c1dvcmRCb3VuZGFyeUluQm94KCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBu
ZXh0V29yZEJvdW5kYXJ5SW5Cb3goKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc3VhbGx5
TGFzdFdvcmRCb3VuZGFyeUluQm94KCk7ICAgICAgICAKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9u
IGxlZnRXb3JkQm91bmRhcnkoKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZEJv
dW5kYXJ5KCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRCcmVha0luQm94
SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYg
cHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBWaXNp
YmxlUG9zaXRpb24gbmV4dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGly
ZWN0aW9uYWxpdHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50
JiBvZmZzZXRPZldvcmRCcmVhaywgYm9vbCYgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOyAgICAgICAg
CisgICAgICAgIAorICAgICAgICBib29sIHBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveElu
QmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3
b3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBib29sIG5lZWRUb1Vz
ZUxvZ2ljYWxFbmRPZkxpbmUoKTsKKyAgICAgICAgYm9vbCBpc0JveFZpc3VhbGx5TGFzdEluQmxv
Y2soKTsKKyAgICAgICAgYm9vbCBwb3NpdGlvbklzSW5zaWRlQm94KGNvbnN0IFZpc2libGVQb3Np
dGlvbiYgd29yZEJyZWFrKTsKKyAgICAgICAgCisgICAgICAgIGludCBncmVhdGVzdFZhbHVlVW5k
ZXIoKTsKKyAgICAgICAgaW50IHNtYWxsZXN0T2Zmc2V0QWJvdmUoKTsKKyAgICAgICAgCisgICAg
cHJpdmF0ZToKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uKiBtX3Bvc2l0aW9uOworICAgICAgICBJ
bmxpbmVCb3gqIG1fYm94OworICAgICAgICBpbnQgbV9vZmZzZXQ7CisgICAgICAgIFRleHREaXJl
Y3Rpb24gbV9ibG9ja0RpcmVjdGlvbjsKKyAgICAgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBtX3dv
cmRCcmVha3M7Cit9OworCitjbGFzcyBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzIDogcHVibGljIFZp
c3VhbFdvcmRCcmVha0Jhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgflZpc3VhbFdvcmRCcmVh
a1dpbmRvd3MoKSB7IH0KKyAgICAgICAgCisgICAgICAgIFZpc2libGVQb3NpdGlvbiBsZWZ0V29y
ZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKTsKKyAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlv
biYgdmlzaWJsZVBvc2l0aW9uKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgY29sbGVj
dFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eSgpOworICAg
ICAgICB2b2lkIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJudERp
cmVjdGlvbmFsaXR5KCk7CisgICAgICAgIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveCgpOwor
fTsKKworY2xhc3MgVmlzdWFsV29yZEJyZWFrVW5peCA6IHB1YmxpYyBWaXN1YWxXb3JkQnJlYWtC
YXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5WaXN1YWxXb3JkQnJlYWtVbml4KCkgeyB9Cisg
ICAgICAgIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3Np
dGlvbiYgdmlzaWJsZVBvc2l0aW9uKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29y
ZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKTsKKyAgICAg
ICAgCisgICAgICAgIHZvaWQgc2V0TW92aW5nTGVmdChib29sIG1vdmluZ0xlZnQpIHsgbV9tb3Zp
bmdMZWZ0ID0gbW92aW5nTGVmdDsgfQorICAgICAgICBib29sIG1vdmluZ0xlZnQoKSB7IHJldHVy
biBtX21vdmluZ0xlZnQ7IH0KKyAgICAKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1fbW92
aW5nTGVmdDsKKyAgICAKKyAgICAgICAgdm9pZCBjb2xsZWN0V29yZEJyZWFrc1VzaW5nUHJldmlv
dXMoKTsKKyAgICAgICAgdm9pZCBjb2xsZWN0V29yZEJyZWFrc1VzaW5nTmV4dCgpOworICAgICAg
ICB2b2lkIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goKTsKK307CisKKwogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQogCiAjZW5kaWYgLy8gVmlzaWJsZVBvc2l0aW9uX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101518</attachid>
            <date>2011-07-20 15:16:47 -0700</date>
            <delta_ts>2011-07-20 18:33:13 -0700</delta_ts>
            <desc>Revised fix (now without introducing the class hierarchy)</desc>
            <filename>vanlam-bug60910</filename>
            <type>text/plain</type>
            <size>30517</size>
            <attacher name="Van Lam">vanlam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkxMzc3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTEgQEAKKzIwMTEtMDctMTkgIFZhbiBMYW0g
IDx2YW5sYW1AZ29vZ2xlLmNvbT4KKworICAgICAgICBtaWdodCBuZWVkIHRvIGJ1bmRsZSB0aGUg
ZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdmlzdWFsIHdvcmQgYnJlYWsgYXMgYSBjbGFzcyAoVmlzdWFs
V29yZEJyZWFrZXIpCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD02MDkxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFJlZmFjdG9yZWQgYnkgYnVuZGxpbmcgZnVuY3Rpb25zIGludG8gYSBjbGFzcywgc3Rvcmlu
ZyBmcmVxdWVudGx5CisgICAgICAgIHBhc3NlZCBhcmd1bWVudHMgYXMgZGF0YSBtZW1iZXJzIHRv
IGF2b2lkIGxvbmcgcGFyYW1ldGVyIGxpc3RzLgorCisgICAgICAgICogZWRpdGluZy9GcmFtZVNl
bGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6bW9kaWZ5TW92
aW5nUmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmlu
Z0xlZnQpOgorICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRl
QmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha0Jhc2U6OmxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2spOgorICAgICAg
ICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6cmlnaHRtb3N0UG9zaXRpb25JbkxUUkJv
eEluUlRMQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6bGFz
dFdvcmRCcmVha0luQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6
OnBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0
aW9uYWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6bmV4dFdv
cmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkpOgorICAg
ICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6cHJldmlvdXNXb3JkQm91bmRhcnlJ
bkJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpuZXh0V29yZEJv
dW5kYXJ5SW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6dmlz
dWFsbHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29y
ZEJyZWFrQmFzZTo6Z3JlYXRlc3RWYWx1ZVVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha0Jhc2U6OnNtYWxsZXN0T2Zmc2V0QWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6
VmlzdWFsV29yZEJyZWFrQmFzZTo6bGVmdFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3Jl
OjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpyaWdodFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJD
b3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpwb3NpdGlvbklzSW5zaWRlQm94KToKKyAgICAgICAg
KFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJ
bnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6Vmlz
dWFsV29yZEJyZWFrV2luZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0
aERpZmZlcm50RGlyZWN0aW9uYWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJy
ZWFrV2luZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveCk6CisgICAgICAgIChXZWJDb3JlOjpW
aXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpsZWZ0V29yZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnJpZ2h0V29yZFBvc2l0aW9uKToKKyAgICAgICAg
KiBlZGl0aW5nL3Zpc2libGVfdW5pdHMuaDoKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRC
cmVha0Jhc2U6On5WaXN1YWxXb3JkQnJlYWtCYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha0Jhc2U6OnNldFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha0Jhc2U6OnNldEJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtC
YXNlOjpzZXRPZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6
c2V0QmxvY2tEaXJlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFz
ZTo6cG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6Ym94
KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha0Jhc2U6Om9mZnNldCk6CisgICAg
ICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpibG9ja0RpcmVjdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjpXb3JkQm91bmRhcnlFbnRyeTo6V29y
ZEJvdW5kYXJ5RW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrQmFzZTo6
c2V0V29yZEJyZWFrcyk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtCYXNlOjp3
b3JkQnJlYWtzKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6On5W
aXN1YWxXb3JkQnJlYWtXaW5kb3dzKToKKwogMjAxMS0wNy0yMCAgR3VzdGF2byBOb3JvbmhhIFNp
bHZhICA8Z3VzdGF2by5ub3JvbmhhQGNvbGxhYm9yYS5jby51az4KIAogICAgICAgICBbR1RLXSBS
RUdSRVNTSU9OKHI4NjQzNik6IGRvZXMgbm90IGFkZCBuZXdsaW5lcyB3aGVuIHJldHVybiBpcyBw
cmVzc2VkIHdpdGggc29tZSBtb2RpZmllcnMgaGVsZApJbmRleDogU291cmNlL1dlYkNvcmUvZWRp
dGluZy9GcmFtZVNlbGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRp
dGluZy9GcmFtZVNlbGVjdGlvbi5jcHAJKHJldmlzaW9uIDkwNzk1KQorKysgU291cmNlL1dlYkNv
cmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1Niw3ICs1
NTYsNyBAQCBWaXNpYmxlUG9zaXRpb24gRnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vCiAgICAgICAg
IHBvcyA9IHJpZ2h0Qm91bmRhcnlPZkxpbmUoc3RhcnRGb3JQbGF0Zm9ybSgpLCBkaXJlY3Rpb25P
ZkVuY2xvc2luZ0Jsb2NrKCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFdlYktpdFZpc3Vh
bFdvcmRHcmFudWxhcml0eToKLSAgICAgICAgcG9zID0gcmlnaHRXb3JkUG9zaXRpb24oVmlzaWJs
ZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3NlbGVjdGlvbi5hZmZpbml0eSgpKSk7
CisgICAgICAgIHBvcyA9IFZpc3VhbFdvcmRCcmVha1dpbmRvd3MoKS5yaWdodFdvcmRQb3NpdGlv
bihWaXNpYmxlUG9zaXRpb24obV9zZWxlY3Rpb24uZXh0ZW50KCksIG1fc2VsZWN0aW9uLmFmZmlu
aXR5KCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBwb3M7CkBAIC03Mjcs
NyArNzI3LDcgQEAgVmlzaWJsZVBvc2l0aW9uIEZyYW1lU2VsZWN0aW9uOjptb2RpZnlNbwogICAg
ICAgICBwb3MgPSBsZWZ0Qm91bmRhcnlPZkxpbmUoc3RhcnRGb3JQbGF0Zm9ybSgpLCBkaXJlY3Rp
b25PZkVuY2xvc2luZ0Jsb2NrKCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFdlYktpdFZp
c3VhbFdvcmRHcmFudWxhcml0eToKLSAgICAgICAgcG9zID0gbGVmdFdvcmRQb3NpdGlvbihWaXNp
YmxlUG9zaXRpb24obV9zZWxlY3Rpb24uZXh0ZW50KCksIG1fc2VsZWN0aW9uLmFmZmluaXR5KCkp
KTsKKyAgICAgICAgcG9zID0gVmlzdWFsV29yZEJyZWFrV2luZG93cygpLmxlZnRXb3JkUG9zaXRp
b24oVmlzaWJsZVBvc2l0aW9uKG1fc2VsZWN0aW9uLmV4dGVudCgpLCBtX3NlbGVjdGlvbi5hZmZp
bml0eSgpKSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gcG9zOwpJbmRleDog
U291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCShyZXZpc2lvbiA5MDc5NSkK
KysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTExNzEsMTAgKzExNzEsMTAgQEAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0Qm91bmRhcnlP
ZkxpbmUoY29ucwogICAgIHJldHVybiBkaXJlY3Rpb24gPT0gTFRSID8gbG9naWNhbEVuZE9mTGlu
ZShjKSA6IGxvZ2ljYWxTdGFydE9mTGluZShjKTsKIH0KIAotc3RhdGljIGNvbnN0IGludCBpbnZh
bGlkT2Zmc2V0ID0gLTE7Ci0KLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQnJl
YWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShjb25zdCBJbmxpbmVCb3gq
IGJveCwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZz
ZXRPZldvcmRCcmVhaykKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpw
cmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGNv
bnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3Jk
QnJlYWspCiB7CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwogICAgIC8vIElu
IGEgTFRSIGJsb2NrLCB0aGUgd29yZCBicmVhayBzaG91bGQgYmUgb24gdGhlIGxlZnQgYm91bmRh
cnkgb2YgYSB3b3JkLgogICAgIC8vIEluIGEgUlRMIGJsb2NrLCB0aGUgd29yZCBicmVhayBzaG91
bGQgYmUgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5IG9mIGEgd29yZC4KICAgICAvLyBCZWNhdXNlIG5l
eHRXb3JkUG9zaXRpb24oKSByZXR1cm5zIHRoZSB3b3JkIGJyZWFrIG9uIHRoZSByaWdodCBib3Vu
ZGFyeSBvZiB0aGUgd29yZCBmb3IgTFRSIHRleHQsCkBAIC0xMjIzLDggKzEyMjMsMTAgQEAgc3Rh
dGljIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRCcmVhawogICAgIHJldHVybiB3b3JkQnJl
YWs7CiB9CiAKLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGVmdG1vc3RQb3NpdGlvbkluUlRMQm94
SW5MVFJCbG9jayhjb25zdCBJbmxpbmVCb3gqIGJveCkKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxX
b3JkQnJlYWtXaW5kb3dzOjpsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKCkKIHsK
KyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworCiAgICAgLy8gRklYTUU6IFByb2Jh
Ymx5IG5lZWQgdG8gdGFrZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgogICAgIE5vZGUqIG5vZGUg
PSBib3gtPnJlbmRlcmVyKCktPm5vZGUoKTsKICAgICBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiA9
IGJveC0+cHJldkxlYWZDaGlsZCgpOwpAQCAtMTI0OCw4ICsxMjUwLDEwIEBAIHN0YXRpYyBWaXNp
YmxlUG9zaXRpb24gbGVmdG1vc3RQb3NpdGlvbkkKICAgICByZXR1cm4gUG9zaXRpb24obm9kZSwg
Ym94LT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9y
KTsKIH0KIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodG1vc3RQb3NpdGlvbkluTFRSQm94
SW5SVExCbG9jayhjb25zdCBJbmxpbmVCb3gqIGJveCkKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxX
b3JkQnJlYWtXaW5kb3dzOjpyaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9jaygpCiB7
CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwogICAgIC8vIEZJWE1FOiBQcm9i
YWJseSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KICAgICBOb2RlKiBub2Rl
ID0gYm94LT5yZW5kZXJlcigpLT5ub2RlKCk7CiAgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYg
PSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKQEAgLTEyNzMsMTYgKzEyNzcsMTggQEAgc3RhdGljIFZp
c2libGVQb3NpdGlvbiByaWdodG1vc3RQb3NpdGlvbgogICAgIHJldHVybiBQb3NpdGlvbihub2Rl
LCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNo
b3IpOwogfQogICAgIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiBsYXN0V29yZEJyZWFrSW5Cb3go
Y29uc3QgSW5saW5lQm94KiBib3gsIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspCitWaXNpYmxlUG9z
aXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6bGFzdFdvcmRCcmVha0luQm94KGludCYgb2Zm
c2V0T2ZXb3JkQnJlYWspCiB7CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwog
ICAgIC8vIEFkZCB0aGUgbGVmdG1vc3Qgd29yZCBicmVhayBmb3IgUlRMIGJveCBvciByaWdodG1v
c3Qgd29yZCBicmVhayBmb3IgTFRSIGJveC4KICAgICBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiA9
IGJveC0+cHJldkxlYWZDaGlsZCgpOwogICAgIElubGluZUJveCogbmV4dExlYWYgPSBib3gtPm5l
eHRMZWFmQ2hpbGQoKTsKICAgICBWaXNpYmxlUG9zaXRpb24gYm91bmRhcnlQb3NpdGlvbjsKICAg
ICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBSVEwgJiYgKCFwcmV2aW91c0xlYWYgfHwgcHJldmlv
dXNMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQotICAgICAgICBib3VuZGFyeVBvc2l0
aW9uID0gbGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jayhib3gpOworICAgICAgICBi
b3VuZGFyeVBvc2l0aW9uID0gbGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jaygpOwog
ICAgIGVsc2UgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gTFRSICYmICghbmV4dExlYWYgfHwgIW5l
eHRMZWFmLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpKQotICAgICAgICBib3VuZGFyeVBvc2l0
aW9uID0gcmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soYm94KTsKKyAgICAgICAg
Ym91bmRhcnlQb3NpdGlvbiA9IHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKCk7
CiAKICAgICBpZiAoYm91bmRhcnlQb3NpdGlvbi5pc051bGwoKSkKICAgICAgICAgcmV0dXJuIFZp
c2libGVQb3NpdGlvbigpOyAgICAgICAgICAgIApAQCAtMTI5OCwxOSArMTMwNCwyMyBAQCBzdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIGxhc3RXb3JkQnJlYWtJbkJvCiAgICAgcmV0dXJuIFZpc2libGVQ
b3NpdGlvbigpOyAgICAKIH0KIAotc3RhdGljIGJvb2wgcG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJl
ZEluQm94SW5CbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShjb25zdCBWaXNpYmxlUG9z
aXRpb24mIHdvcmRCcmVhaywgY29uc3QgSW5saW5lQm94KiBib3gsIGludCYgb2Zmc2V0T2ZXb3Jk
QnJlYWspCitib29sIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnBvc2l0aW9uSXNWaXN1YWxseU9y
ZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoY29uc3QgVmlzaWJs
ZVBvc2l0aW9uJiB3b3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspCiB7CisgICAgSW5s
aW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwogICAgIGludCBwcmV2aW91c09mZnNldCA9IG9m
ZnNldE9mV29yZEJyZWFrOwogICAgIElubGluZUJveCogYm94T2ZXb3JkQnJlYWs7CiAgICAgd29y
ZEJyZWFrLmdldElubGluZUJveEFuZE9mZnNldChib3hPZldvcmRCcmVhaywgb2Zmc2V0T2ZXb3Jk
QnJlYWspOwotICAgIGlmIChib3hPZldvcmRCcmVhayA9PSBib3ggJiYgKHByZXZpb3VzT2Zmc2V0
ID09IGludmFsaWRPZmZzZXQgfHwgcHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVhaykp
CisgICAgaWYgKGJveE9mV29yZEJyZWFrID09IGJveCAmJiAocHJldmlvdXNPZmZzZXQgPT0gc19p
bnZhbGlkT2Zmc2V0IHx8IHByZXZpb3VzT2Zmc2V0IDwgb2Zmc2V0T2ZXb3JkQnJlYWspKQogICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAgICAgCi1zdGF0aWMgVmlz
aWJsZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERp
cmVjdGlvbmFsaXR5KAotICAgIGNvbnN0IElubGluZUJveCogYm94LCBjb25zdCBWaXNpYmxlUG9z
aXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrLCBib29sJiBp
c0xhc3RXb3JkQnJlYWtJbkJveCkKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5k
b3dzOjpuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25h
bGl0eSgKKyAgICBjb25zdCBWaXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQm
IG9mZnNldE9mV29yZEJyZWFrLCBib29sJiBpc0xhc3RXb3JkQnJlYWtJbkJveCkKIHsKKyAgICBJ
bmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworCiAgICAgLy8gRklYTUU6IFByb2JhYmx5IG5l
ZWQgdG8gdGFrZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgogICAgIAogICAgIC8vIEluIGEgTFRS
IGJsb2NrLCB0aGUgd29yZCBicmVhayBzaG91bGQgYmUgb24gdGhlIGxlZnQgYm91bmRhcnkgb2Yg
YSB3b3JkLgpAQCAtMTMyOSwxOCArMTMzOSwxOCBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIG5l
eHRXb3JkQnJlYWtJbkJvCiAgICAgLy8gU3RhcnQgYXQgb2Zmc2V0IDAsIHRoZSBmaXJzdCB3b3Jk
IGJyZWFrIGlzIGF0IG9mZnNldCAzLCB0aGUgMm5kIHdvcmQgYnJlYWsgaXMgYXQgb2Zmc2V0IDcs
IGFuZCB0aGUgM3JkIHdvcmQgYnJlYWsgc2hvdWxkIGJlIGF0IG9mZnNldCAwLgogICAgIC8vIEJ1
dCBuZXh0V29yZFBvc2l0aW9uKCkgb2Ygb2Zmc2V0IDcgaXMgb2Zmc2V0IDExLCB3aGljaCBzaG91
bGQgYmUgaWdub3JlZCwgCiAgICAgLy8gYW5kIHRoZSBwb3NpdGlvbiBhdCBvZmZzZXQgMCBzaG91
bGQgYmUgbWFudWFsbHkgYWRkZWQgYXMgdGhlIGxhc3Qgd29yZCBicmVhayB3aXRoaW4gdGhlIGJv
eC4KLSAgICBpZiAod29yZEJyZWFrICE9IHByZXZpb3VzV29yZEJyZWFrICYmIHBvc2l0aW9uSXNW
aXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkod29y
ZEJyZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKSkgeworICAgIGlmICh3b3JkQnJlYWsgIT0g
cHJldmlvdXNXb3JkQnJlYWsgJiYgcG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZEluQm94SW5CbG9j
a1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFr
KSkgewogICAgICAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IGZhbHNlOwogICAgICAgICByZXR1
cm4gd29yZEJyZWFrOwogICAgIH0KICAgICAKICAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IHRy
dWU7Ci0gICAgcmV0dXJuIGxhc3RXb3JkQnJlYWtJbkJveChib3gsIG9mZnNldE9mV29yZEJyZWFr
KTsKKyAgICByZXR1cm4gbGFzdFdvcmRCcmVha0luQm94KG9mZnNldE9mV29yZEJyZWFrKTsKIH0K
IAotc3RydWN0IFdvcmRCb3VuZGFyeUVudHJ5IHsKK3N0cnVjdCBWaXN1YWxXb3JkQnJlYWtXaW5k
b3dzOjpXb3JkQm91bmRhcnlFbnRyeSB7CiAgICAgV29yZEJvdW5kYXJ5RW50cnkoKQotICAgICAg
ICA6IG9mZnNldEluSW5saW5lQm94KGludmFsaWRPZmZzZXQpIAorICAgICAgICA6IG9mZnNldElu
SW5saW5lQm94KHNfaW52YWxpZE9mZnNldCkgCiAgICAgeyAKICAgICB9CiAKQEAgLTEzNTMsMTg2
ICsxMzYzLDIyOSBAQCBzdHJ1Y3QgV29yZEJvdW5kYXJ5RW50cnkgewogICAgIFZpc2libGVQb3Np
dGlvbiB2aXNpYmxlUG9zaXRpb247CiAgICAgaW50IG9mZnNldEluSW5saW5lQm94OwogfTsKLSAg
ICAKLXR5cGVkZWYgVmVjdG9yPFdvcmRCb3VuZGFyeUVudHJ5LCA1MD4gV29yZEJvdW5kYXJ5VmVj
dG9yOwotICAgIAotc3RhdGljIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2Nr
V2l0aFNhbWVEaXJlY3Rpb25hbGl0eShjb25zdCBJbmxpbmVCb3gqIGJveCwgV29yZEJvdW5kYXJ5
VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCisKK3ZvaWQgVmlzdWFsV29yZEJyZWFrV2lu
ZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25h
bGl0eSgpCiB7Ci0gICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmNsZWFyKCk7CisgICAgV29yZEJv
dW5kYXJ5VmVjdG9yKiBvcmRlcmVkV29yZEJvdW5kYXJpZXMgPSB3b3JkQnJlYWtzKCk7CisgICAg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5jbGVhcigpOwogICAgIAogICAgIFZpc2libGVQb3NpdGlv
biB3b3JkQnJlYWs7Ci0gICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gaW52YWxpZE9mZnNldDsK
KyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSBzX2ludmFsaWRPZmZzZXQ7CiAgICAgd2hpbGUg
KDEpIHsKLSAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJs
b2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJl
YWspOworICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxv
Y2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwog
ICAgICAgICBpZiAod29yZEJyZWFrLmlzTnVsbCgpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgIFdvcmRCb3VuZGFyeUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRCcmVhaywgb2Zmc2V0
T2ZXb3JkQnJlYWspOwotICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMuYXBwZW5kKHdvcmRC
b3VuZGFyeUVudHJ5KTsKKyAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5hcHBlbmQod29y
ZEJvdW5kYXJ5RW50cnkpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29sbGVjdFdvcmRCcmVh
a3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoY29uc3QgSW5saW5l
Qm94KiBib3gsIFdvcmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKQordm9p
ZCBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxv
Y2tXaXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eSgpCiB7Ci0gICAgb3JkZXJlZFdvcmRCb3VuZGFy
aWVzLmNsZWFyKCk7CisgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBvcmRlcmVkV29yZEJvdW5kYXJp
ZXMgPSB3b3JkQnJlYWtzKCk7CisgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5jbGVhcigpOwog
ICAgIAogICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7Ci0gICAgaW50IG9mZnNldE9mV29y
ZEJyZWFrID0gaW52YWxpZE9mZnNldDsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSBzX2lu
dmFsaWRPZmZzZXQ7CiAgICAgYm9vbCBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IGZhbHNlOwogICAg
IHdoaWxlICgxKSB7Ci0gICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3JkQnJlYWtJbkJveEluc2lk
ZUJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KGJveCwgd29yZEJyZWFrLCBvZmZzZXRP
ZldvcmRCcmVhaywgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOworICAgICAgICB3b3JkQnJlYWsgPSBu
ZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSh3
b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBpc0xhc3RXb3JkQnJlYWtJbkJveCk7CiAgICAg
ICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkpIHsKICAgICAgICAgICAgIFdvcmRCb3VuZGFy
eUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspOwot
ICAgICAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmFwcGVuZCh3b3JkQm91bmRhcnlFbnRy
eSk7CisgICAgICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPmFwcGVuZCh3b3JkQm91bmRh
cnlFbnRyeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzTGFzdFdvcmRCcmVha0luQm94KQog
ICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb2xsZWN0V29yZEJy
ZWFrc0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBXb3JkQm91bmRhcnlWZWN0b3ImIG9yZGVy
ZWRXb3JkQm91bmRhcmllcywgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikKK3ZvaWQgVmlz
dWFsV29yZEJyZWFrV2luZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveCgpCiB7CisgICAgSW5s
aW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKyAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0
aW9uID0gZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24oKTsKKwogICAgIGlmIChib3gtPmRpcmVjdGlv
bigpID09IGJsb2NrRGlyZWN0aW9uKQotICAgICAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5z
aWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVz
KTsKKyAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJl
Y3Rpb25hbGl0eSgpOwogICAgIGVsc2UKLSAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveElu
c2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoYm94LCBvcmRlcmVkV29yZEJvdW5k
YXJpZXMpOyAgICAgICAgCisgICAgICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9j
a1dpdGhEaWZmZXJudERpcmVjdGlvbmFsaXR5KCk7ICAgICAgICAKIH0KICAgICAKLXN0YXRpYyBW
aXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveChjb25zdCBJbmxpbmVCb3gq
IGJveCwgaW50IG9mZnNldCkKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dz
OjpwcmV2aW91c1dvcmRCb3VuZGFyeUluQm94KCkKIHsKKyAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0
SW5CbG9jaygpOworCiAgICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gMDsKICAgICBWaXNpYmxl
UG9zaXRpb24gd29yZEJyZWFrOwogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHdvcmRCcmVh
ayA9IHByZXZpb3VzV29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxp
dHkoYm94LCB3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgd29yZEJyZWFr
ID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0
eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKICAgICAgICAgaWYgKHdvcmRCcmVhay5p
c051bGwoKSkKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAob2Zmc2V0ID09IGludmFs
aWRPZmZzZXQgfHwgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gb2Zmc2V0KQorICAgICAgICBpZiAob2Zm
c2V0ID09IHNfaW52YWxpZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBvZmZzZXQpCiAg
ICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIH0gICAgICAgIAogICAgIHJldHVybiBW
aXNpYmxlUG9zaXRpb24oKTsKIH0KIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiBuZXh0V29yZEJv
dW5kYXJ5SW5Cb3goY29uc3QgSW5saW5lQm94KiBib3gsIGludCBvZmZzZXQpCitWaXNpYmxlUG9z
aXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6bmV4dFdvcmRCb3VuZGFyeUluQm94KCkKIHsK
KyAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0SW5CbG9jaygpOworCiAgICAgaW50IG9mZnNldE9mV29y
ZEJyZWFrID0gMDsKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwogICAgIGJvb2wgaXNM
YXN0V29yZEJyZWFrSW5Cb3ggPSBmYWxzZTsKICAgICBkbyB7Ci0gICAgICAgIHdvcmRCcmVhayA9
IG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5
KGJveCwgd29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaywgaXNMYXN0V29yZEJyZWFrSW5Cb3gp
OwotICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIChvZmZzZXQgPT0gaW52YWxp
ZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBvZmZzZXQpKQorICAgICAgICB3b3JkQnJl
YWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25h
bGl0eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBpc0xhc3RXb3JkQnJlYWtJbkJveCk7
CisgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkgJiYgKG9mZnNldCA9PSBzX2ludmFs
aWRPZmZzZXQgfHwgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gb2Zmc2V0KSkKICAgICAgICAgICAgIHJl
dHVybiB3b3JkQnJlYWs7CiAgICAgfSB3aGlsZSAoIWlzTGFzdFdvcmRCcmVha0luQm94KTsgICAg
ICAgCiAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogfQogICAgIAotc3RhdGljIFZpc2li
bGVQb3NpdGlvbiB2aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveChjb25zdCBJbmxpbmVCb3gq
IGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikKK1Zpc2libGVQ
b3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjp2aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJ
bkJveCgpCiB7CisgICAgaW50IG9mZnNldCA9IG9mZnNldEluQmxvY2soKTsKKwogICAgIFdvcmRC
b3VuZGFyeVZlY3RvciBvcmRlcmVkV29yZEJvdW5kYXJpZXM7Ci0gICAgY29sbGVjdFdvcmRCcmVh
a3NJbkJveChib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcywgYmxvY2tEaXJlY3Rpb24pOworICAg
IHNldFdvcmRCcmVha3MoJm9yZGVyZWRXb3JkQm91bmRhcmllcyk7CisgICAgY29sbGVjdFdvcmRC
cmVha3NJbkJveCgpOwogICAgIGlmICghb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSkgCiAg
ICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKLSAgICBpZiAob2Zmc2V0ID09IGludmFs
aWRPZmZzZXQgfHwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzW29yZGVyZWRXb3JkQm91bmRhcmllcy5z
aXplKCkgLSAxXS5vZmZzZXRJbklubGluZUJveCAhPSBvZmZzZXQpCisgICAgaWYgKG9mZnNldCA9
PSBzX2ludmFsaWRPZmZzZXQgfHwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzW29yZGVyZWRXb3JkQm91
bmRhcmllcy5zaXplKCkgLSAxXS5vZmZzZXRJbklubGluZUJveCAhPSBvZmZzZXQpCiAgICAgICAg
IHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUo
KSAtIDFdLnZpc2libGVQb3NpdGlvbjsKICAgICBpZiAob3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNp
emUoKSA+IDEpCiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdv
cmRCb3VuZGFyaWVzLnNpemUoKSAtIDJdLnZpc2libGVQb3NpdGlvbjsKICAgICByZXR1cm4gVmlz
aWJsZVBvc2l0aW9uKCk7CiB9CiAgICAgICAgIAotc3RhdGljIGludCBncmVhdGVzdFZhbHVlVW5k
ZXIoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbiwgY29uc3Qg
V29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCitpbnQgVmlzdWFsV29y
ZEJyZWFrV2luZG93czo6Z3JlYXRlc3RWYWx1ZVVuZGVyKCkKIHsKLSAgICBpZiAoIW9yZGVyZWRX
b3JkQm91bmRhcmllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAg
IElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisgICAgaW50IG9mZnNldCA9IG9mZnNldElu
QmxvY2soKTsKKyAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZW5jbG9zaW5nQmxv
Y2tEaXJlY3Rpb24oKTsKKyAgICBXb3JkQm91bmRhcnlWZWN0b3IqIG9yZGVyZWRXb3JkQm91bmRh
cmllcyA9IHdvcmRCcmVha3MoKTsKKyAgICBib29sIGJveEFuZEJsb2NrQXJlSW5TYW1lRGlyZWN0
aW9uID0gYm94LT5kaXJlY3Rpb24oKSA9PSBibG9ja0RpcmVjdGlvbjsKKworICAgIGlmICghb3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCkpCisgICAgICAgIHJldHVybiBzX2ludmFsaWRPZmZz
ZXQ7CiAgICAgLy8gRklYTUU6IGJpbmFyeSBzZWFyY2guCiAgICAgaWYgKGJveEFuZEJsb2NrQXJl
SW5TYW1lRGlyZWN0aW9uKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvcmRl
cmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChvcmRlcmVk
V29yZEJvdW5kYXJpZXNbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPCBvZmZzZXQpCisgICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPnNpemUoKTsgKytp
KSB7CisgICAgICAgICAgICBpZiAoKCpvcmRlcmVkV29yZEJvdW5kYXJpZXMpW2ldLm9mZnNldElu
SW5saW5lQm94IDwgb2Zmc2V0KQogICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9
Ci0gICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgICAgICByZXR1cm4gc19pbnZhbGlk
T2Zmc2V0OwogICAgIH0KLSAgICBmb3IgKGludCBpID0gb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNp
emUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIGlmIChvcmRlcmVkV29yZEJvdW5kYXJp
ZXNbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPCBvZmZzZXQpCisgICAgZm9yIChpbnQgaSA9IG9yZGVy
ZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgaWYg
KCgqb3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5vZmZzZXRJbklubGluZUJveCA8IG9mZnNldCkK
ICAgICAgICAgICAgIHJldHVybiBpOwogICAgIH0KLSAgICByZXR1cm4gaW52YWxpZE9mZnNldDsK
KyAgICByZXR1cm4gc19pbnZhbGlkT2Zmc2V0OwogfQogCi1zdGF0aWMgaW50IHNtYWxsZXN0T2Zm
c2V0QWJvdmUoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbiwg
Y29uc3QgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCitpbnQgVmlz
dWFsV29yZEJyZWFrV2luZG93czo6c21hbGxlc3RPZmZzZXRBYm92ZSgpCiB7Ci0gICAgaWYgKCFv
cmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpKQotICAgICAgICByZXR1cm4gaW52YWxpZE9mZnNl
dDsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworICAgIGludCBvZmZzZXQgPSBv
ZmZzZXRJbkJsb2NrKCk7CisgICAgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbiA9IGVuY2xv
c2luZ0Jsb2NrRGlyZWN0aW9uKCk7CisgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMgPSB3b3JkQnJlYWtzKCk7CisgICAgYm9vbCBib3hBbmRCbG9ja0FyZUluU2Ft
ZURpcmVjdGlvbiA9IGJveC0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tEaXJlY3Rpb247CisKKyAgICBp
ZiAoIW9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpKQorICAgICAgICByZXR1cm4gc19pbnZh
bGlkT2Zmc2V0OwogICAgIC8vIEZJWE1FOiBiaW5hcnkgc2VhcmNoLgogICAgIGlmIChib3hBbmRC
bG9ja0FyZUluU2FtZURpcmVjdGlvbikgewotICAgICAgICBmb3IgKGludCBpID0gb3JkZXJlZFdv
cmRCb3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBpZiAo
b3JkZXJlZFdvcmRCb3VuZGFyaWVzW2ldLm9mZnNldEluSW5saW5lQm94ID4gb2Zmc2V0KQorICAg
ICAgICBmb3IgKGludCBpID0gb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCkgLSAxOyBpID49
IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKCgqb3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5v
ZmZzZXRJbklubGluZUJveCA+IG9mZnNldCkKICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAg
ICAgICAgfQotICAgICAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKKyAgICAgICAgcmV0dXJuIHNf
aW52YWxpZE9mZnNldDsKICAgICB9Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9yZGVy
ZWRXb3JkQm91bmRhcmllcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAob3JkZXJlZFdvcmRC
b3VuZGFyaWVzW2ldLm9mZnNldEluSW5saW5lQm94ID4gb2Zmc2V0KQorICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPnNpemUoKTsgKytpKSB7CisgICAg
ICAgIGlmICgoKm9yZGVyZWRXb3JkQm91bmRhcmllcylbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPiBv
ZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICB9Ci0gICAgcmV0dXJuIGludmFsaWRP
ZmZzZXQ7CisgICAgcmV0dXJuIHNfaW52YWxpZE9mZnNldDsKIH0KIAotc3RhdGljIFZpc2libGVQ
b3NpdGlvbiBsZWZ0V29yZEJvdW5kYXJ5KGNvbnN0IElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0
LCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6OmxlZnRXb3JkQm91bmRhcnkoKQogeworICAgIElubGluZUJveCogYm94
ID0gaW5saW5lQm94KCk7CisgICAgaW50IG9mZnNldCA9IG9mZnNldEluQmxvY2soKTsKKyAgICBU
ZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24oKTsK
KyAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwotICAgIGZvciAgKGNvbnN0IElu
bGluZUJveCogYWRqYWNlbnRCb3ggPSBib3g7IGFkamFjZW50Qm94OyBhZGphY2VudEJveCA9IGFk
amFjZW50Qm94LT5wcmV2TGVhZkNoaWxkKCkpIHsKKyAgICBmb3IgKElubGluZUJveCogYWRqYWNl
bnRCb3ggPSBib3g7IGFkamFjZW50Qm94OyBhZGphY2VudEJveCA9IGFkamFjZW50Qm94LT5wcmV2
TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgc2V0SW5saW5lQm94KGFkamFjZW50Qm94KTsKKyAgICAg
ICAgc2V0T2Zmc2V0SW5CbG9jayhhZGphY2VudEJveCA9PSBib3ggPyBvZmZzZXQgOiBzX2ludmFs
aWRPZmZzZXQpOworICAgICAgICAgICAgICAgIAogICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24g
PT0gTFRSKSB7CiAgICAgICAgICAgICBpZiAoYWRqYWNlbnRCb3gtPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSkgCi0gICAgICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQm91bmRh
cnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0IDogaW52YWxp
ZE9mZnNldCk7CisgICAgICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQm91bmRh
cnlJbkJveCgpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9
IG5leHRXb3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0gYm94ID8g
b2Zmc2V0IDogaW52YWxpZE9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgIHdv
cmRCcmVhayA9IHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFyeUluQm94KGFkamFjZW50Qm94LCBhZGph
Y2VudEJveCA9PSBib3ggPyBvZmZzZXQgOiBpbnZhbGlkT2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRCb3VuZGFy
eUluQm94KCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgd29yZEJyZWFrID0gdmlzdWFs
bHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goKTsgICAgICAgICAgICAKICAgICAgICAgaWYgKHdvcmRC
cmVhay5pc05vdE51bGwoKSkKICAgICAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgfQog
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKIH0KICAKLXN0YXRpYyBWaXNpYmxlUG9zaXRp
b24gcmlnaHRXb3JkQm91bmRhcnkoY29uc3QgSW5saW5lQm94KiBib3gsIGludCBvZmZzZXQsIFRl
eHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24pCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJy
ZWFrV2luZG93czo6cmlnaHRXb3JkQm91bmRhcnkoKQogeworICAgIElubGluZUJveCogYm94ID0g
aW5saW5lQm94KCk7CisgICAgaW50IG9mZnNldCA9IG9mZnNldEluQmxvY2soKTsKKyAgICBUZXh0
RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24oKTsKICAg
ICAKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwotICAgIGZvciAoY29uc3QgSW5saW5l
Qm94KiBhZGphY2VudEJveCA9IGJveDsgYWRqYWNlbnRCb3g7IGFkamFjZW50Qm94ID0gYWRqYWNl
bnRCb3gtPm5leHRMZWFmQ2hpbGQoKSkgeworICAgIGZvciAoSW5saW5lQm94KiBhZGphY2VudEJv
eCA9IGJveDsgYWRqYWNlbnRCb3g7IGFkamFjZW50Qm94ID0gYWRqYWNlbnRCb3gtPm5leHRMZWFm
Q2hpbGQoKSkgeworICAgICAgICBzZXRJbmxpbmVCb3goYWRqYWNlbnRCb3gpOworICAgICAgICBz
ZXRPZmZzZXRJbkJsb2NrKGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IHNfaW52YWxpZE9m
ZnNldCk7CisgICAgICAgIAogICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gUlRMKSB7CiAg
ICAgICAgICAgICBpZiAoYWRqYWNlbnRCb3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKLSAg
ICAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZEJvdW5kYXJ5SW5Cb3goYWRqYWNlbnRC
b3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IGludmFsaWRPZmZzZXQpOworICAgICAg
ICAgICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3JkQm91bmRhcnlJbkJveCgpOwogICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJvdW5kYXJ5
SW5Cb3goYWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IGludmFsaWRP
ZmZzZXQpOworICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJvdW5kYXJ5
SW5Cb3goKTsKICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgd29yZEJyZWFrID0gdmlzdWFs
bHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goYWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/
IG9mZnNldCA6IGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsgICAgICAgICAgICAKKyAg
ICAgICAgICAgIHdvcmRCcmVhayA9IHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFyeUluQm94KCk7ICAg
ICAgICAgICAgCiAgICAgICAgIGlmICghd29yZEJyZWFrLmlzTnVsbCgpKQogICAgICAgICAgICAg
cmV0dXJuIHdvcmRCcmVhazsKICAgICB9CiAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwog
fQogICAgIAotc3RhdGljIGJvb2wgcG9zaXRpb25Jc0luc2lkZUJveChjb25zdCBWaXNpYmxlUG9z
aXRpb24mIHdvcmRCcmVhaywgY29uc3QgSW5saW5lQm94KiBib3gpCitib29sIFZpc3VhbFdvcmRC
cmVha1dpbmRvd3M6OnBvc2l0aW9uSXNJbnNpZGVCb3goY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3
b3JkQnJlYWspCiB7CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwogICAgIElu
bGluZUJveCogYm94T2ZXb3JkQnJlYWs7CiAgICAgaW50IG9mZnNldE9mV29yZEJyZWFrOwogICAg
IHdvcmRCcmVhay5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYm94T2ZXb3JkQnJlYWssIG9mZnNldE9m
V29yZEJyZWFrKTsKICAgICByZXR1cm4gYm94ID09IGJveE9mV29yZEJyZWFrICYmIG9mZnNldE9m
V29yZEJyZWFrICE9IGJveC0+Y2FyZXRNYXhPZmZzZXQoKSAmJiBvZmZzZXRPZldvcmRCcmVhayAh
PSBib3gtPmNhcmV0TWluT2Zmc2V0KCk7CiB9CiAKLVZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBv
c2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKQorVmlzaWJsZVBv
c2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmxlZnRXb3JkUG9zaXRpb24oY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24pCiB7CiAgICAgSW5saW5lQm94KiBib3g7CiAg
ICAgaW50IG9mZnNldDsKICAgICB2aXNpYmxlUG9zaXRpb24uZ2V0SW5saW5lQm94QW5kT2Zmc2V0
KGJveCwgb2Zmc2V0KTsKICAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZGlyZWN0
aW9uT2ZFbmNsb3NpbmdCbG9jayh2aXNpYmxlUG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKSk7CiAg
ICAgCisgICAgc2V0SW5saW5lQm94KGJveCk7CisgICAgc2V0T2Zmc2V0SW5CbG9jayhvZmZzZXQp
OworICAgIHNldEVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKGJsb2NrRGlyZWN0aW9uKTsKKyAgICAK
ICAgICAvLyBGSVhNRTogSWYgdGhlIGJveCdzIGRpcmVjdGlvbmFsaXR5IGlzIHRoZSBzYW1lIGFz
IHRoYXQgb2YgdGhlIGVuY2xvc2luZyBibG9jaywgd2hlbiB0aGUgb2Zmc2V0IGlzIGF0IHRoZSBi
b3ggYm91bmRhcnkKICAgICAvLyBhbmQgdGhlIGRpcmVjdGlvbiBpcyB0b3dhcmRzIGluc2lkZSB0
aGUgYm94LCBkbyBJIHN0aWxsIG5lZWQgdG8gbWFrZSBpdCBhIHNwZWNpYWwgY2FzZT8gRm9yIGV4
YW1wbGUsIGEgTFRSIGJveCBpbnNpZGUgYSBMVFIgYmxvY2ssCiAgICAgLy8gd2hlbiBvZmZzZXQg
aXMgYXQgYm94J3MgY2FyZXRNaW5PZmZzZXQgYW5kIHRoZSBkaXJlY3Rpb24gaXMgRGlyZWN0aW9u
UmlnaHQsIHNob3VsZCBpdCBiZSB0YWtlbiBjYXJlIGFzIGEgZ2VuZXJhbCBjYXNlPwotICAgIGlm
IChvZmZzZXQgPT0gYm94LT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpCi0gICAgICAgIHJldHVybiBs
ZWZ0V29yZEJvdW5kYXJ5KGJveC0+cHJldkxlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBibG9j
a0RpcmVjdGlvbik7CisgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQo
KSkgeworICAgICAgICBzZXRJbmxpbmVCb3goYm94LT5wcmV2TGVhZkNoaWxkKCkpOworICAgICAg
ICBzZXRPZmZzZXRJbkJsb2NrKHNfaW52YWxpZE9mZnNldCk7CisgICAgICAgIHJldHVybiBsZWZ0
V29yZEJvdW5kYXJ5KCk7CisgICAgfQogICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJpZ2h0
bW9zdE9mZnNldCgpKQotICAgICAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gsIG9mZnNl
dCwgYmxvY2tEaXJlY3Rpb24pOwotICAgIAorICAgICAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFy
eSgpOwogICAgIAogICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7CiAgICAgaWYgKGJsb2Nr
RGlyZWN0aW9uID09IExUUikgewpAQCAtMTU0MSwzMSArMTU5NCw0MSBAQCBWaXNpYmxlUG9zaXRp
b24gbGVmdFdvcmRQb3NpdGlvbihjb25zdCBWCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHdv
cmRCcmVhayA9IG5leHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsKICAgICB9Ci0gICAg
aWYgKHdvcmRCcmVhay5pc05vdE51bGwoKSAmJiBwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVh
aywgYm94KSkKKyAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIHBvc2l0aW9uSXNJbnNp
ZGVCb3god29yZEJyZWFrKSkKICAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKICAgICAKICAgICBX
b3JkQm91bmRhcnlWZWN0b3Igb3JkZXJlZFdvcmRCb3VuZGFyaWVzOwotICAgIGNvbGxlY3RXb3Jk
QnJlYWtzSW5Cb3goYm94LCBvcmRlcmVkV29yZEJvdW5kYXJpZXMsIGJsb2NrRGlyZWN0aW9uKTsK
KyAgICBzZXRXb3JkQnJlYWtzKCZvcmRlcmVkV29yZEJvdW5kYXJpZXMpOworICAgIGNvbGxlY3RX
b3JkQnJlYWtzSW5Cb3goKTsKIAotICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERp
cmVjdGlvbigpID8gZ3JlYXRlc3RWYWx1ZVVuZGVyKG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0g
TFRSLCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpIDoKLSAgICAgICAgc21hbGxlc3RPZmZzZXRBYm92
ZShvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IFJUTCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsK
LSAgICBpZiAoaW5kZXggIT0gaW52YWxpZE9mZnNldCkKKyAgICBpbnQgaW5kZXggPSBib3gtPmlz
TGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IGdyZWF0ZXN0VmFsdWVVbmRlcigpIDoKKyAgICAgICAg
c21hbGxlc3RPZmZzZXRBYm92ZSgpOworICAgIGlmIChpbmRleCAhPSBzX2ludmFsaWRPZmZzZXQp
CiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbaW5kZXhdLnZpc2libGVQb3Np
dGlvbjsKICAgICAKLSAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gtPnByZXZMZWFmQ2hp
bGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOworICAgIHNldElubGluZUJveChi
b3gtPnByZXZMZWFmQ2hpbGQoKSk7CisgICAgc2V0T2Zmc2V0SW5CbG9jayhzX2ludmFsaWRPZmZz
ZXQpOworICAgIHJldHVybiBsZWZ0V29yZEJvdW5kYXJ5KCk7CiB9CiAKLVZpc2libGVQb3NpdGlv
biByaWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlv
bikKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpyaWdodFdvcmRQb3Np
dGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKIHsKICAgICBJbmxp
bmVCb3gqIGJveDsKICAgICBpbnQgb2Zmc2V0OwogICAgIHZpc2libGVQb3NpdGlvbi5nZXRJbmxp
bmVCb3hBbmRPZmZzZXQoYm94LCBvZmZzZXQpOwogICAgIFRleHREaXJlY3Rpb24gYmxvY2tEaXJl
Y3Rpb24gPSBkaXJlY3Rpb25PZkVuY2xvc2luZ0Jsb2NrKHZpc2libGVQb3NpdGlvbi5kZWVwRXF1
aXZhbGVudCgpKTsKICAgICAKKyAgICBzZXRJbmxpbmVCb3goYm94KTsKKyAgICBzZXRPZmZzZXRJ
bkJsb2NrKG9mZnNldCk7CisgICAgc2V0RW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24oYmxvY2tEaXJl
Y3Rpb24pOworICAgIAogICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldExlZnRtb3N0T2Zmc2V0
KCkpCi0gICAgICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeShib3gsIG9mZnNldCwgYmxvY2tE
aXJlY3Rpb24pOwotICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgp
KQotICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LT5uZXh0TGVhZkNoaWxkKCks
IGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIHJpZ2h0V29y
ZEJvdW5kYXJ5KCk7CisgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0
KCkpIHsKKyAgICAgICAgc2V0SW5saW5lQm94KGJveC0+bmV4dExlYWZDaGlsZCgpKTsKKyAgICAg
ICAgc2V0T2Zmc2V0SW5CbG9jayhzX2ludmFsaWRPZmZzZXQpOworICAgICAgICByZXR1cm4gcmln
aHRXb3JkQm91bmRhcnkoKTsKKyAgICB9CiAgCiAgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVh
azsKICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0gUlRMKSB7CkBAIC0xNTc0LDE4ICsxNjM3LDIx
IEBAIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbihjb25zdCAKICAgICAgICAgZWxz
ZQogICAgICAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRp
b24pOwogICAgIH0KLSAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIHBvc2l0aW9uSXNJ
bnNpZGVCb3god29yZEJyZWFrLCBib3gpKQorICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkg
JiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWspKQogICAgICAgICByZXR1cm4gd29yZEJy
ZWFrOwogICAgIAogICAgIFdvcmRCb3VuZGFyeVZlY3RvciBvcmRlcmVkV29yZEJvdW5kYXJpZXM7
Ci0gICAgY29sbGVjdFdvcmRCcmVha3NJbkJveChib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcywg
YmxvY2tEaXJlY3Rpb24pOworICAgIHNldFdvcmRCcmVha3MoJm9yZGVyZWRXb3JkQm91bmRhcmll
cyk7CisgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveCgpOwogICAgIAotICAgIGludCBpbmRleCA9
IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gc21hbGxlc3RPZmZzZXRBYm92ZShvZmZz
ZXQsIGJsb2NrRGlyZWN0aW9uID09IExUUiwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKSA6Ci0gICAg
ICAgIGdyZWF0ZXN0VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IFJUTCwgb3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzKTsKLSAgICBpZiAoaW5kZXggIT0gaW52YWxpZE9mZnNldCkKKyAg
ICBpbnQgaW5kZXggPSBib3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IHNtYWxsZXN0T2Zm
c2V0QWJvdmUoKSA6CisgICAgICAgIGdyZWF0ZXN0VmFsdWVVbmRlcigpOworICAgIGlmIChpbmRl
eCAhPSBzX2ludmFsaWRPZmZzZXQpCiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJp
ZXNbaW5kZXhdLnZpc2libGVQb3NpdGlvbjsKICAgICAKLSAgICByZXR1cm4gcmlnaHRXb3JkQm91
bmRhcnkoYm94LT5uZXh0TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9u
KTsKKyAgICBzZXRJbmxpbmVCb3goYm94LT5uZXh0TGVhZkNoaWxkKCkpOworICAgIHNldE9mZnNl
dEluQmxvY2soc19pbnZhbGlkT2Zmc2V0KTsKKyAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnko
KTsKIH0KIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmgJKHJl
dmlzaW9uIDkwNzk1KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlICJFZGl0aW5nQm91bmRh
cnkuaCIKICNpbmNsdWRlICJUZXh0RGlyZWN0aW9uLmgiCiAKKyNpbmNsdWRlICJWaXNpYmxlUG9z
aXRpb24uaCIKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBOb2RlOwpAQCAtNDEsOCAr
NDMsNiBAQCBWaXNpYmxlUG9zaXRpb24gc3RhcnRPZldvcmQoY29uc3QgVmlzaWJsCiBWaXNpYmxl
UG9zaXRpb24gZW5kT2ZXb3JkKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmLCBFV29yZFNpZGUgPSBS
aWdodFdvcmRJZk9uQm91bmRhcnkpOwogVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZFBvc2l0
aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmKTsKIFZpc2libGVQb3NpdGlvbiBuZXh0V29yZFBv
c2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiAmKTsKLVZpc2libGVQb3NpdGlvbiByaWdodFdv
cmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsKLVZpc2libGVQb3NpdGlvbiBsZWZ0
V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogYm9vbCBpc1N0YXJ0T2ZXb3Jk
KGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogCiAvLyBzZW50ZW5jZXMKQEAgLTk1LDYgKzk1LDU3
IEBAIGJvb2wgaXNFbmRPZkRvY3VtZW50KGNvbnN0IFZpc2libGVQb3NpdGkKIFZpc2libGVQb3Np
dGlvbiBzdGFydE9mRWRpdGFibGVDb250ZW50KGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogVmlz
aWJsZVBvc2l0aW9uIGVuZE9mRWRpdGFibGVDb250ZW50KGNvbnN0IFZpc2libGVQb3NpdGlvbiYp
OwogCitjbGFzcyBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IH5WaXN1YWxXb3JkQnJlYWtXaW5kb3dzKCkgeyB9CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBy
aWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsKKyAgICAgICAgVmlzaWJs
ZVBvc2l0aW9uIGxlZnRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CisgICAg
ICAgICAgICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBzX2lu
dmFsaWRPZmZzZXQgPSAtMTsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCBXb3JkQm91bmRhcnlF
bnRyeTsKKyAgICAgICAgdHlwZWRlZiBWZWN0b3I8V29yZEJvdW5kYXJ5RW50cnksIDUwPiBXb3Jk
Qm91bmRhcnlWZWN0b3I7ICAgICAgICAKKworICAgICAgICBWaXNpYmxlUG9zaXRpb24gbGVmdG1v
c3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jaygpOworICAgICAgICBWaXNpYmxlUG9zaXRpb24g
cmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soKTsKKyAgICAgICAgVmlzaWJsZVBv
c2l0aW9uIGxhc3RXb3JkQnJlYWtJbkJveChpbnQmIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJvdW5kYXJ5SW5Cb3goKTsKKyAgICAgICAg
VmlzaWJsZVBvc2l0aW9uIG5leHRXb3JkQm91bmRhcnlJbkJveCgpOworICAgICAgICBWaXNpYmxl
UG9zaXRpb24gdmlzdWFsbHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goKTsgICAgICAgIAorICAgICAg
ICBWaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRCb3VuZGFyeSgpOworICAgICAgICBWaXNpYmxlUG9z
aXRpb24gcmlnaHRXb3JkQm91bmRhcnkoKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHByZXZp
b3VzV29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZzZXRPZldvcmRCcmVh
ayk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9j
a1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShjb25zdCBWaXNpYmxlUG9zaXRpb24mIHByZXZp
b3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrLCBib29sJiBpc0xhc3RXb3JkQnJl
YWtJbkJveCk7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGJvb2wgcG9zaXRpb25Jc1Zpc3Vh
bGx5T3JkZXJlZEluQm94SW5CbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShjb25zdCBW
aXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaywgaW50JiBvZmZzZXRPZldvcmRCcmVhayk7CisgICAg
ICAgIGJvb2wgbmVlZFRvVXNlTG9naWNhbEVuZE9mTGluZSgpOworICAgICAgICBib29sIGlzQm94
VmlzdWFsbHlMYXN0SW5CbG9jaygpOworICAgICAgICBib29sIHBvc2l0aW9uSXNJbnNpZGVCb3go
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJlYWspOworICAgICAgICAKKyAgICAgICAgaW50
IGdyZWF0ZXN0VmFsdWVVbmRlcigpOworICAgICAgICBpbnQgc21hbGxlc3RPZmZzZXRBYm92ZSgp
OworICAgICAgICAKKyAgICAgICAgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxv
Y2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KCk7CisgICAgICAgIHZvaWQgY29sbGVjdFdvcmRCcmVh
a3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoKTsKKyAgICAgICAg
dm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7ICAgIAorICAgICAgICAKKyAgICAgICAgdm9p
ZCBzZXRJbmxpbmVCb3goSW5saW5lQm94KiBpbmxpbmVCb3gpIHsgbV9pbmxpbmVCb3ggPSBpbmxp
bmVCb3g7IH0KKyAgICAgICAgdm9pZCBzZXRPZmZzZXRJbkJsb2NrKGludCBvZmZzZXRJbkJsb2Nr
KSB7IG1fb2Zmc2V0SW5CbG9jayA9IG9mZnNldEluQmxvY2s7IH0KKyAgICAgICAgdm9pZCBzZXRF
bmNsb3NpbmdCbG9ja0RpcmVjdGlvbihUZXh0RGlyZWN0aW9uIGVuY2xvc2luZ0Jsb2NrRGlyZWN0
aW9uKSB7IG1fZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24gPSBlbmNsb3NpbmdCbG9ja0RpcmVjdGlv
bjsgfQorICAgICAgICB2b2lkIHNldFdvcmRCcmVha3MoV29yZEJvdW5kYXJ5VmVjdG9yKiB3b3Jk
QnJlYWtzKSB7IG1fd29yZEJyZWFrcyA9IHdvcmRCcmVha3M7IH0KKyAgICAgICAgCisgICAgICAg
IElubGluZUJveCogaW5saW5lQm94KCkgeyByZXR1cm4gbV9pbmxpbmVCb3g7IH0KKyAgICAgICAg
aW50IG9mZnNldEluQmxvY2soKSB7IHJldHVybiBtX29mZnNldEluQmxvY2s7IH0KKyAgICAgICAg
VGV4dERpcmVjdGlvbiBlbmNsb3NpbmdCbG9ja0RpcmVjdGlvbigpIHsgcmV0dXJuIG1fZW5jbG9z
aW5nQmxvY2tEaXJlY3Rpb247IH0KKyAgICAgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiB3b3JkQnJl
YWtzKCkgeyByZXR1cm4gbV93b3JkQnJlYWtzOyB9CisKKyAgICAgICAgSW5saW5lQm94KiBtX2lu
bGluZUJveDsKKyAgICAgICAgaW50IG1fb2Zmc2V0SW5CbG9jazsKKyAgICAgICAgVGV4dERpcmVj
dGlvbiBtX2VuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uOworICAgICAgICBXb3JkQm91bmRhcnlWZWN0
b3IqIG1fd29yZEJyZWFrczsKK307CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlm
IC8vIFZpc2libGVQb3NpdGlvbl9oCg==
</data>
<flag name="review"
          id="96460"
          type_id="1"
          status="-"
          setter="rniwa"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101541</attachid>
            <date>2011-07-20 18:33:13 -0700</date>
            <delta_ts>2011-07-20 18:40:52 -0700</delta_ts>
            <desc>Revised fix</desc>
            <filename>vanlam-bug60910</filename>
            <type>text/plain</type>
            <size>31561</size>
            <attacher name="Van Lam">vanlam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkxNDMxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTQgQEAKKzIwMTEtMDctMjAgIFZhbiBMYW0g
IDx2YW5sYW1AZ29vZ2xlLmNvbT4KKworICAgICAgICBtaWdodCBuZWVkIHRvIGJ1bmRsZSB0aGUg
ZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdmlzdWFsIHdvcmQgYnJlYWsgYXMgYSBjbGFzcyAoVmlzdWFs
V29yZEJyZWFrZXIpCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD02MDkxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFJlZmFjdG9yZWQgYnkgYnVuZGxpbmcgZnVuY3Rpb25zIGludG8gYSBjbGFzcywgc3Rvcmlu
ZyBmcmVxdWVudGx5CisgICAgICAgIHBhc3NlZCBhcmd1bWVudHMgYXMgZGF0YSBtZW1iZXJzIHRv
IGF2b2lkIGxvbmcgcGFyYW1ldGVyIGxpc3RzLgorCisgICAgICAgICogZWRpdGluZy9GcmFtZVNl
bGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6bW9kaWZ5TW92
aW5nUmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmlu
Z0xlZnQpOgorICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzKToK
KyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6On5WaXN1YWxXb3JkQnJl
YWtXaW5kb3dzKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnNl
dElubGluZUJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpz
ZXRPZmZzZXRJbkJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRv
d3M6OnNldEVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha1dpbmRvd3M6OnNldFdvcmRCcmVha3MpOgorICAgICAgICAoV2ViQ29yZTo6Vmlz
dWFsV29yZEJyZWFrV2luZG93czo6aW5saW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha1dpbmRvd3M6Om9mZnNldEluQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6Vmlz
dWFsV29yZEJyZWFrV2luZG93czo6ZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93czo6d29yZEJyZWFrcyk6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzSW5Cb3gpOgorICAgICAg
ICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93czo6cHJldmlvdXNXb3JkQnJlYWtJbkJv
eEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpW
aXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2Nr
KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnJpZ2h0bW9zdFBv
c2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRC
cmVha1dpbmRvd3M6Omxhc3RXb3JkQnJlYWtJbkJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1
YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJsb2Nr
V2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6Om5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVu
dERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRv
d3M6OldvcmRCb3VuZGFyeUVudHJ5OjpXb3JkQm91bmRhcnlFbnRyeSk6CisgICAgICAgIChXZWJD
b3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRl
QmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZm
ZXJudERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dp
bmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFs
V29yZEJyZWFrV2luZG93czo6cHJldmlvdXNXb3JkQm91bmRhcnlJbkJveCk6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpuZXh0V29yZEJvdW5kYXJ5SW5Cb3gpOgor
ICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93czo6dmlzdWFsbHlMYXN0V29y
ZEJvdW5kYXJ5SW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93
czo6Z3JlYXRlc3RWYWx1ZVVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVh
a1dpbmRvd3M6OnNtYWxsZXN0T2Zmc2V0QWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFs
V29yZEJyZWFrV2luZG93czo6bGVmdFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpW
aXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpyaWdodFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJD
b3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzSW5zaWRlQm94KToKKyAgICAg
ICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmxlZnRXb3JkUG9zaXRpb25BY3Jv
c3NCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpy
aWdodFdvcmRQb3NpdGlvbkFjcm9zc0JvdW5kYXJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha1dpbmRvd3M6OmxlZnRXb3JkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
VmlzdWFsV29yZEJyZWFrV2luZG93czo6cmlnaHRXb3JkUG9zaXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6bGVmdFdvcmRQb3NpdGlvbldyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6cmlnaHRX
b3JkUG9zaXRpb25XcmFwcGVyKToKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5pdHMuaDoK
KwogMjAxMS0wNy0yMCAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFJlbW92ZSBzdHJheSByZWZlcmVuY2UgdG8gU3R5bGVGbGV4aWJsZUJveERhdGEuaCB0aGF0IHdh
cyBhY2NpZGVudGFsbHkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0
cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRz
LmNwcAkocmV2aXNpb24gOTE0MzIpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVf
dW5pdHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTcxLDEwICsxMTcxLDcxIEBAIFZpc2libGVQ
b3NpdGlvbiByaWdodEJvdW5kYXJ5T2ZMaW5lKGNvbnMKICAgICByZXR1cm4gZGlyZWN0aW9uID09
IExUUiA/IGxvZ2ljYWxFbmRPZkxpbmUoYykgOiBsb2dpY2FsU3RhcnRPZkxpbmUoYyk7CiB9CiAK
LXN0YXRpYyBjb25zdCBpbnQgaW52YWxpZE9mZnNldCA9IC0xOworY2xhc3MgVmlzdWFsV29yZEJy
ZWFrV2luZG93cyB7CisgICAgcHVibGljOgorICAgICAgICBWaXN1YWxXb3JkQnJlYWtXaW5kb3dz
KCkKKyAgICAgICAgOiBtX2lubGluZUJveCgwKQorICAgICAgICAsIG1fb2Zmc2V0SW5CbG9jayhz
X2ludmFsaWRPZmZzZXQpCisgICAgICAgICwgbV9lbmNsb3NpbmdCbG9ja0RpcmVjdGlvbihMVFIp
CisgICAgICAgICwgbV93b3JkQnJlYWtzKDApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAg
ICB+VmlzdWFsV29yZEJyZWFrV2luZG93cygpIHsgfQorICAgICAgICBWaXNpYmxlUG9zaXRpb24g
cmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CisgICAgICAgIFZpc2li
bGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOworICAg
ICAgICAgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgc19p
bnZhbGlkT2Zmc2V0ID0gLTE7CisgICAgICAgIAorICAgICAgICBzdHJ1Y3QgV29yZEJvdW5kYXJ5
RW50cnk7CisgICAgICAgIHR5cGVkZWYgVmVjdG9yPFdvcmRCb3VuZGFyeUVudHJ5LCA1MD4gV29y
ZEJvdW5kYXJ5VmVjdG9yOyAgICAgICAgCisKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRX
b3JkUG9zaXRpb25BY3Jvc3NCb3VuZGFyeShjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQ
b3NpdGlvbik7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbkFjcm9z
c0JvdW5kYXJ5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKTsKKyAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2soKTsK
KyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJs
b2NrKCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBsYXN0V29yZEJyZWFrSW5Cb3goaW50JiBv
ZmZzZXRPZldvcmRCcmVhayk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRC
b3VuZGFyeUluQm94KCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBuZXh0V29yZEJvdW5kYXJ5
SW5Cb3goKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFy
eUluQm94KCk7ICAgICAgICAKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRXb3JkQm91bmRh
cnkoKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZEJvdW5kYXJ5KCk7CisgICAg
ICAgIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRo
U2FtZURpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJl
YWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBWaXNpYmxlUG9zaXRpb24gbmV4
dFdvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoY29u
c3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZzZXRPZldvcmRC
cmVhaywgYm9vbCYgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOyAgICAgICAgCisgICAgICAgIAorICAg
ICAgICBib29sIHBvc2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVy
ZW50RGlyZWN0aW9uYWxpdHkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJlYWssIGludCYg
b2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBib29sIG5lZWRUb1VzZUxvZ2ljYWxFbmRPZkxp
bmUoKTsKKyAgICAgICAgYm9vbCBpc0JveFZpc3VhbGx5TGFzdEluQmxvY2soKTsKKyAgICAgICAg
Ym9vbCBwb3NpdGlvbklzSW5zaWRlQm94KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29yZEJyZWFr
KTsKKyAgICAgICAgYm9vbCBwb3NpdGlvbklzSW5Cb3goY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3
b3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICAKKyAgICAgICAgaW50
IGdyZWF0ZXN0VmFsdWVVbmRlcigpOworICAgICAgICBpbnQgc21hbGxlc3RPZmZzZXRBYm92ZSgp
OworICAgICAgICAKKyAgICAgICAgdm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxv
Y2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KCk7CisgICAgICAgIHZvaWQgY29sbGVjdFdvcmRCcmVh
a3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoKTsKKyAgICAgICAg
dm9pZCBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7ICAgIAorICAgICAgICAKKyAgICAgICAgdm9p
ZCBzZXRJbmxpbmVCb3goSW5saW5lQm94KiBpbmxpbmVCb3gpIHsgbV9pbmxpbmVCb3ggPSBpbmxp
bmVCb3g7IH0KKyAgICAgICAgdm9pZCBzZXRPZmZzZXRJbkJsb2NrKGludCBvZmZzZXRJbkJsb2Nr
KSB7IG1fb2Zmc2V0SW5CbG9jayA9IG9mZnNldEluQmxvY2s7IH0KKyAgICAgICAgdm9pZCBzZXRF
bmNsb3NpbmdCbG9ja0RpcmVjdGlvbihUZXh0RGlyZWN0aW9uIGVuY2xvc2luZ0Jsb2NrRGlyZWN0
aW9uKSB7IG1fZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24gPSBlbmNsb3NpbmdCbG9ja0RpcmVjdGlv
bjsgfQorICAgICAgICB2b2lkIHNldFdvcmRCcmVha3MoV29yZEJvdW5kYXJ5VmVjdG9yKiB3b3Jk
QnJlYWtzKSB7IG1fd29yZEJyZWFrcyA9IHdvcmRCcmVha3M7IH0KKyAgICAgICAgCisgICAgICAg
IElubGluZUJveCogaW5saW5lQm94KCkgeyByZXR1cm4gbV9pbmxpbmVCb3g7IH0KKyAgICAgICAg
aW50IG9mZnNldEluQmxvY2soKSB7IHJldHVybiBtX29mZnNldEluQmxvY2s7IH0KKyAgICAgICAg
VGV4dERpcmVjdGlvbiBlbmNsb3NpbmdCbG9ja0RpcmVjdGlvbigpIHsgcmV0dXJuIG1fZW5jbG9z
aW5nQmxvY2tEaXJlY3Rpb247IH0KKyAgICAgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiB3b3JkQnJl
YWtzKCkgeyByZXR1cm4gbV93b3JkQnJlYWtzOyB9CisKKyAgICAgICAgSW5saW5lQm94KiBtX2lu
bGluZUJveDsKKyAgICAgICAgaW50IG1fb2Zmc2V0SW5CbG9jazsKKyAgICAgICAgVGV4dERpcmVj
dGlvbiBtX2VuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uOworICAgICAgICBXb3JkQm91bmRhcnlWZWN0
b3IqIG1fd29yZEJyZWFrczsKK307CiAKLXN0YXRpYyBib29sIHBvc2l0aW9uSXNJbkJveChjb25z
dCBWaXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaywgY29uc3QgSW5saW5lQm94KiBib3gsIGludCYg
b2Zmc2V0T2ZXb3JkQnJlYWspCitib29sIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnBvc2l0aW9u
SXNJbkJveChjb25zdCBWaXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaywgaW50JiBvZmZzZXRPZldv
cmRCcmVhaykKIHsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworCiAgICAgaWYg
KHdvcmRCcmVhay5pc051bGwoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0xMTgzLDgg
KzEyNDQsMTAgQEAgc3RhdGljIGJvb2wgcG9zaXRpb25Jc0luQm94KGNvbnN0IFZpc2libAogICAg
IHJldHVybiBib3ggPT0gYm94T2ZXb3JkQnJlYWs7CiB9CiAKLXN0YXRpYyBWaXNpYmxlUG9zaXRp
b24gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0
eShjb25zdCBJbmxpbmVCb3gqIGJveCwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dv
cmRCcmVhaywgaW50JiBvZmZzZXRPZldvcmRCcmVhaykKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxX
b3JkQnJlYWtXaW5kb3dzOjpwcmV2aW91c1dvcmRCcmVha0luQm94SW5zaWRlQmxvY2tXaXRoU2Ft
ZURpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWss
IGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspCiB7CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVC
b3goKTsKKwogICAgIC8vIEluIGEgTFRSIGJsb2NrLCB0aGUgd29yZCBicmVhayBzaG91bGQgYmUg
b24gdGhlIGxlZnQgYm91bmRhcnkgb2YgYSB3b3JkLgogICAgIC8vIEluIGEgUlRMIGJsb2NrLCB0
aGUgd29yZCBicmVhayBzaG91bGQgYmUgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5IG9mIGEgd29yZC4K
ICAgICAvLyBCZWNhdXNlIG5leHRXb3JkUG9zaXRpb24oKSByZXR1cm5zIHRoZSB3b3JkIGJyZWFr
IG9uIHRoZSByaWdodCBib3VuZGFyeSBvZiB0aGUgd29yZCBmb3IgTFRSIHRleHQsCkBAIC0xMjE1
LDcgKzEyNzgsNyBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAg
ICAgICAgICAgICBpZiAocG9zaXRpb25BZnRlcldvcmQuaXNOb3ROdWxsKCkpIHsKICAgICAgICAg
ICAgICAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25CZWZvcmVXb3JkID0gcHJldmlvdXNCb3Vu
ZGFyeShwb3NpdGlvbkFmdGVyV29yZCwgcHJldmlvdXNXb3JkUG9zaXRpb25Cb3VuZGFyeSk7CiAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25Jc0luQm94KHBvc2l0aW9u
QmVmb3JlV29yZCwgYm94LCBvZmZzZXRPZldvcmRCcmVhaykpCisgICAgICAgICAgICAgICAgaWYg
KHBvc2l0aW9uSXNJbkJveChwb3NpdGlvbkJlZm9yZVdvcmQsIG9mZnNldE9mV29yZEJyZWFrKSkK
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uQmVmb3JlV29yZDsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQpAQCAtMTIyNSwxMSArMTI4OCwxMyBAQCBzdGF0aWMgVmlzaWJsZVBv
c2l0aW9uIHByZXZpb3VzV29yZEJyZWFrCiAgICAgaWYgKHByZXZpb3VzV29yZEJyZWFrID09IHdv
cmRCcmVhaykKICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogCi0gICAgcmV0dXJu
IHBvc2l0aW9uSXNJbkJveCh3b3JkQnJlYWssIGJveCwgb2Zmc2V0T2ZXb3JkQnJlYWspID8gd29y
ZEJyZWFrIDogVmlzaWJsZVBvc2l0aW9uKCk7CisgICAgcmV0dXJuIHBvc2l0aW9uSXNJbkJveCh3
b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKSA/IHdvcmRCcmVhayA6IFZpc2libGVQb3NpdGlv
bigpOwogfQogCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxlZnRtb3N0UG9zaXRpb25JblJUTEJv
eEluTFRSQmxvY2soY29uc3QgSW5saW5lQm94KiBib3gpCitWaXNpYmxlUG9zaXRpb24gVmlzdWFs
V29yZEJyZWFrV2luZG93czo6bGVmdG1vc3RQb3NpdGlvbkluUlRMQm94SW5MVFJCbG9jaygpCiB7
CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKwogICAgIC8vIEZJWE1FOiBQcm9i
YWJseSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRpIGxldmVsIHRvby4KICAgICBOb2RlKiBub2Rl
ID0gYm94LT5yZW5kZXJlcigpLT5ub2RlKCk7CiAgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYg
PSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKQEAgLTEyNTMsOCArMTMxOCwxMCBAQCBzdGF0aWMgVmlz
aWJsZVBvc2l0aW9uIGxlZnRtb3N0UG9zaXRpb25JCiAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUs
IGJveC0+Y2FyZXRNaW5PZmZzZXQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hv
cik7CiB9CiAKLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcmlnaHRtb3N0UG9zaXRpb25JbkxUUkJv
eEluUlRMQmxvY2soY29uc3QgSW5saW5lQm94KiBib3gpCitWaXNpYmxlUG9zaXRpb24gVmlzdWFs
V29yZEJyZWFrV2luZG93czo6cmlnaHRtb3N0UG9zaXRpb25JbkxUUkJveEluUlRMQmxvY2soKQog
eworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisKICAgICAvLyBGSVhNRTogUHJv
YmFibHkgbmVlZCB0byB0YWtlIGNhcmUgb2YgYmlkaSBsZXZlbCB0b28uCiAgICAgTm9kZSogbm9k
ZSA9IGJveC0+cmVuZGVyZXIoKS0+bm9kZSgpOwogICAgIElubGluZUJveCogcHJldmlvdXNMZWFm
ID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CkBAIC0xMjc4LDE2ICsxMzQ1LDE4IEBAIHN0YXRpYyBW
aXNpYmxlUG9zaXRpb24gcmlnaHRtb3N0UG9zaXRpb24KICAgICByZXR1cm4gUG9zaXRpb24obm9k
ZSwgYm94LT5jYXJldE1pbk9mZnNldCgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5j
aG9yKTsKIH0KICAgICAKLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGFzdFdvcmRCcmVha0luQm94
KGNvbnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQorVmlzaWJsZVBv
c2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6Omxhc3RXb3JkQnJlYWtJbkJveChpbnQmIG9m
ZnNldE9mV29yZEJyZWFrKQogeworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisK
ICAgICAvLyBBZGQgdGhlIGxlZnRtb3N0IHdvcmQgYnJlYWsgZm9yIFJUTCBib3ggb3IgcmlnaHRt
b3N0IHdvcmQgYnJlYWsgZm9yIExUUiBib3guCiAgICAgSW5saW5lQm94KiBwcmV2aW91c0xlYWYg
PSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKICAgICBJbmxpbmVCb3gqIG5leHRMZWFmID0gYm94LT5u
ZXh0TGVhZkNoaWxkKCk7CiAgICAgVmlzaWJsZVBvc2l0aW9uIGJvdW5kYXJ5UG9zaXRpb247CiAg
ICAgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gUlRMICYmICghcHJldmlvdXNMZWFmIHx8IHByZXZp
b3VzTGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSkKLSAgICAgICAgYm91bmRhcnlQb3Np
dGlvbiA9IGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2soYm94KTsKKyAgICAgICAg
Ym91bmRhcnlQb3NpdGlvbiA9IGxlZnRtb3N0UG9zaXRpb25JblJUTEJveEluTFRSQmxvY2soKTsK
ICAgICBlbHNlIGlmIChib3gtPmRpcmVjdGlvbigpID09IExUUiAmJiAoIW5leHRMZWFmIHx8ICFu
ZXh0TGVhZi0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSkKLSAgICAgICAgYm91bmRhcnlQb3Np
dGlvbiA9IHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKGJveCk7CisgICAgICAg
IGJvdW5kYXJ5UG9zaXRpb24gPSByaWdodG1vc3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9jaygp
OwogCiAgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24uaXNOdWxsKCkpCiAgICAgICAgIHJldHVybiBW
aXNpYmxlUG9zaXRpb24oKTsgICAgICAgICAgICAKQEAgLTEyOTgsMTkgKzEzNjcsMjEgQEAgc3Rh
dGljIFZpc2libGVQb3NpdGlvbiBsYXN0V29yZEJyZWFrSW5CbwogICAgIGVsc2UgaWYgKHdvcmRC
cmVhayAhPSBib3VuZGFyeVBvc2l0aW9uKQogICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c0Jv
dW5kYXJ5KHdvcmRCcmVhaywgcHJldmlvdXNXb3JkUG9zaXRpb25Cb3VuZGFyeSk7CiAKLSAgICBy
ZXR1cm4gcG9zaXRpb25Jc0luQm94KHdvcmRCcmVhaywgYm94LCBvZmZzZXRPZldvcmRCcmVhaykg
PyB3b3JkQnJlYWsgOiBWaXNpYmxlUG9zaXRpb24oKTsgICAgCisgICAgcmV0dXJuIHBvc2l0aW9u
SXNJbkJveCh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKSA/IHdvcmRCcmVhayA6IFZpc2li
bGVQb3NpdGlvbigpOyAgCiB9CiAKLXN0YXRpYyBib29sIHBvc2l0aW9uSXNWaXN1YWxseU9yZGVy
ZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoY29uc3QgVmlzaWJsZVBv
c2l0aW9uJiB3b3JkQnJlYWssIGNvbnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29y
ZEJyZWFrKQorYm9vbCBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzVmlzdWFsbHlP
cmRlcmVkSW5Cb3hJbkJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYgd29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQogewogICAgIGlu
dCBwcmV2aW91c09mZnNldCA9IG9mZnNldE9mV29yZEJyZWFrOwotICAgIHJldHVybiBwb3NpdGlv
bklzSW5Cb3god29yZEJyZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKQotICAgICAgICAmJiAo
cHJldmlvdXNPZmZzZXQgPT0gaW52YWxpZE9mZnNldCB8fCBwcmV2aW91c09mZnNldCA8IG9mZnNl
dE9mV29yZEJyZWFrKTsKKyAgICByZXR1cm4gcG9zaXRpb25Jc0luQm94KHdvcmRCcmVhaywgb2Zm
c2V0T2ZXb3JkQnJlYWspCisgICAgICAgICYmIChwcmV2aW91c09mZnNldCA9PSBzX2ludmFsaWRP
ZmZzZXQgfHwgcHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVhayk7CiB9CiAgICAgCi1z
dGF0aWMgVmlzaWJsZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERp
ZmZlcmVudERpcmVjdGlvbmFsaXR5KAotICAgIGNvbnN0IElubGluZUJveCogYm94LCBjb25zdCBW
aXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFr
LCBib29sJiBpc0xhc3RXb3JkQnJlYWtJbkJveCkKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3Jk
QnJlYWtXaW5kb3dzOjpuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnRE
aXJlY3Rpb25hbGl0eSgKKyAgICBjb25zdCBWaXNpYmxlUG9zaXRpb24mIHByZXZpb3VzV29yZEJy
ZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrLCBib29sJiBpc0xhc3RXb3JkQnJlYWtJbkJveCkK
IHsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworCiAgICAgLy8gRklYTUU6IFBy
b2JhYmx5IG5lZWQgdG8gdGFrZSBjYXJlIG9mIGJpZGkgbGV2ZWwgdG9vLgogICAgIAogICAgIC8v
IEluIGEgTFRSIGJsb2NrLCB0aGUgd29yZCBicmVhayBzaG91bGQgYmUgb24gdGhlIGxlZnQgYm91
bmRhcnkgb2YgYSB3b3JkLgpAQCAtMTMyOSwxOCArMTQwMCwxOCBAQCBzdGF0aWMgVmlzaWJsZVBv
c2l0aW9uIG5leHRXb3JkQnJlYWtJbkJvCiAgICAgLy8gU3RhcnQgYXQgb2Zmc2V0IDAsIHRoZSBm
aXJzdCB3b3JkIGJyZWFrIGlzIGF0IG9mZnNldCAzLCB0aGUgMm5kIHdvcmQgYnJlYWsgaXMgYXQg
b2Zmc2V0IDcsIGFuZCB0aGUgM3JkIHdvcmQgYnJlYWsgc2hvdWxkIGJlIGF0IG9mZnNldCAwLgog
ICAgIC8vIEJ1dCBuZXh0V29yZFBvc2l0aW9uKCkgb2Ygb2Zmc2V0IDcgaXMgb2Zmc2V0IDExLCB3
aGljaCBzaG91bGQgYmUgaWdub3JlZCwgCiAgICAgLy8gYW5kIHRoZSBwb3NpdGlvbiBhdCBvZmZz
ZXQgMCBzaG91bGQgYmUgbWFudWFsbHkgYWRkZWQgYXMgdGhlIGxhc3Qgd29yZCBicmVhayB3aXRo
aW4gdGhlIGJveC4KLSAgICBpZiAod29yZEJyZWFrICE9IHByZXZpb3VzV29yZEJyZWFrICYmIHBv
c2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9u
YWxpdHkod29yZEJyZWFrLCBib3gsIG9mZnNldE9mV29yZEJyZWFrKSkgeworICAgIGlmICh3b3Jk
QnJlYWsgIT0gcHJldmlvdXNXb3JkQnJlYWsgJiYgcG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZElu
Qm94SW5CbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSh3b3JkQnJlYWssIG9mZnNldE9m
V29yZEJyZWFrKSkgewogICAgICAgICBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IGZhbHNlOwogICAg
ICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIH0KICAgICAKICAgICBpc0xhc3RXb3JkQnJlYWtJ
bkJveCA9IHRydWU7Ci0gICAgcmV0dXJuIGxhc3RXb3JkQnJlYWtJbkJveChib3gsIG9mZnNldE9m
V29yZEJyZWFrKTsKKyAgICByZXR1cm4gbGFzdFdvcmRCcmVha0luQm94KG9mZnNldE9mV29yZEJy
ZWFrKTsKIH0KIAotc3RydWN0IFdvcmRCb3VuZGFyeUVudHJ5IHsKK3N0cnVjdCBWaXN1YWxXb3Jk
QnJlYWtXaW5kb3dzOjpXb3JkQm91bmRhcnlFbnRyeSB7CiAgICAgV29yZEJvdW5kYXJ5RW50cnko
KQotICAgICAgICA6IG9mZnNldEluSW5saW5lQm94KGludmFsaWRPZmZzZXQpIAorICAgICAgICA6
IG9mZnNldEluSW5saW5lQm94KHNfaW52YWxpZE9mZnNldCkgCiAgICAgeyAKICAgICB9CiAKQEAg
LTEzNTMsMTcxICsxNDI0LDIwOCBAQCBzdHJ1Y3QgV29yZEJvdW5kYXJ5RW50cnkgewogICAgIFZp
c2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb247CiAgICAgaW50IG9mZnNldEluSW5saW5lQm94
OwogfTsKLSAgICAKLXR5cGVkZWYgVmVjdG9yPFdvcmRCb3VuZGFyeUVudHJ5LCA1MD4gV29yZEJv
dW5kYXJ5VmVjdG9yOwotICAgIAotc3RhdGljIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveElu
c2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShjb25zdCBJbmxpbmVCb3gqIGJveCwgV29y
ZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCisKK3ZvaWQgVmlzdWFsV29y
ZEJyZWFrV2luZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVE
aXJlY3Rpb25hbGl0eSgpCiB7Ci0gICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmNsZWFyKCk7Cisg
ICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBvcmRlcmVkV29yZEJvdW5kYXJpZXMgPSB3b3JkQnJlYWtz
KCk7CisgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5jbGVhcigpOwogICAgIAogICAgIFZpc2li
bGVQb3NpdGlvbiB3b3JkQnJlYWs7Ci0gICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gaW52YWxp
ZE9mZnNldDsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWsgPSBzX2ludmFsaWRPZmZzZXQ7CiAg
ICAgd2hpbGUgKDEpIHsKLSAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJv
eEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0
T2ZXb3JkQnJlYWspOworICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVha0luQm94
SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3Jk
QnJlYWspOwogICAgICAgICBpZiAod29yZEJyZWFrLmlzTnVsbCgpKQogICAgICAgICAgICAgYnJl
YWs7CiAgICAgICAgIFdvcmRCb3VuZGFyeUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRCcmVh
aywgb2Zmc2V0T2ZXb3JkQnJlYWspOwotICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMuYXBw
ZW5kKHdvcmRCb3VuZGFyeUVudHJ5KTsKKyAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5h
cHBlbmQod29yZEJvdW5kYXJ5RW50cnkpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29sbGVj
dFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoY29u
c3QgSW5saW5lQm94KiBib3gsIFdvcmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3VuZGFy
aWVzKQordm9pZCBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpjb2xsZWN0V29yZEJyZWFrc0luQm94
SW5zaWRlQmxvY2tXaXRoRGlmZmVybnREaXJlY3Rpb25hbGl0eSgpCiB7Ci0gICAgb3JkZXJlZFdv
cmRCb3VuZGFyaWVzLmNsZWFyKCk7CisgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMgPSB3b3JkQnJlYWtzKCk7CisgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5j
bGVhcigpOwogICAgIAogICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7Ci0gICAgaW50IG9m
ZnNldE9mV29yZEJyZWFrID0gaW52YWxpZE9mZnNldDsKKyAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJl
YWsgPSBzX2ludmFsaWRPZmZzZXQ7CiAgICAgYm9vbCBpc0xhc3RXb3JkQnJlYWtJbkJveCA9IGZh
bHNlOwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3JkQnJlYWtJ
bkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KGJveCwgd29yZEJyZWFr
LCBvZmZzZXRPZldvcmRCcmVhaywgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOworICAgICAgICB3b3Jk
QnJlYWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rp
b25hbGl0eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBpc0xhc3RXb3JkQnJlYWtJbkJv
eCk7CiAgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkpIHsKICAgICAgICAgICAgIFdv
cmRCb3VuZGFyeUVudHJ5IHdvcmRCb3VuZGFyeUVudHJ5KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3Jk
QnJlYWspOwotICAgICAgICAgICAgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLmFwcGVuZCh3b3JkQm91
bmRhcnlFbnRyeSk7CisgICAgICAgICAgICBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPmFwcGVuZCh3
b3JkQm91bmRhcnlFbnRyeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzTGFzdFdvcmRCcmVh
a0luQm94KQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb2xs
ZWN0V29yZEJyZWFrc0luQm94KGNvbnN0IElubGluZUJveCogYm94LCBXb3JkQm91bmRhcnlWZWN0
b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcywgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikK
K3ZvaWQgVmlzdWFsV29yZEJyZWFrV2luZG93czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveCgpCiB7
CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsKKyAgICBUZXh0RGlyZWN0aW9uIGJs
b2NrRGlyZWN0aW9uID0gZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24oKTsKKwogICAgIGlmIChib3gt
PmRpcmVjdGlvbigpID09IGJsb2NrRGlyZWN0aW9uKQotICAgICAgICBjb2xsZWN0V29yZEJyZWFr
c0luQm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGJveCwgb3JkZXJlZFdvcmRC
b3VuZGFyaWVzKTsKKyAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0
aFNhbWVEaXJlY3Rpb25hbGl0eSgpOwogICAgIGVsc2UKLSAgICAgICAgY29sbGVjdFdvcmRCcmVh
a3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9uYWxpdHkoYm94LCBvcmRlcmVk
V29yZEJvdW5kYXJpZXMpOyAgICAgICAgCisgICAgICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJ
bnNpZGVCbG9ja1dpdGhEaWZmZXJudERpcmVjdGlvbmFsaXR5KCk7ICAgICAgICAKIH0KICAgICAK
LXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveChjb25zdCBJ
bmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCkKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJl
YWtXaW5kb3dzOjpwcmV2aW91c1dvcmRCb3VuZGFyeUluQm94KCkKIHsKKyAgICBpbnQgb2Zmc2V0
ID0gb2Zmc2V0SW5CbG9jaygpOworCiAgICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gMDsKICAg
ICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAg
IHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGly
ZWN0aW9uYWxpdHkoYm94LCB3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAg
d29yZEJyZWFrID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJl
Y3Rpb25hbGl0eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKICAgICAgICAgaWYgKHdv
cmRCcmVhay5pc051bGwoKSkKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAob2Zmc2V0
ID09IGludmFsaWRPZmZzZXQgfHwgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gb2Zmc2V0KQorICAgICAg
ICBpZiAob2Zmc2V0ID09IHNfaW52YWxpZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBv
ZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIH0gICAgICAgIAogICAg
IHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKIH0KIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiBu
ZXh0V29yZEJvdW5kYXJ5SW5Cb3goY29uc3QgSW5saW5lQm94KiBib3gsIGludCBvZmZzZXQpCitW
aXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6bmV4dFdvcmRCb3VuZGFyeUlu
Qm94KCkKIHsKKyAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0SW5CbG9jaygpOworCiAgICAgaW50IG9m
ZnNldE9mV29yZEJyZWFrID0gMDsKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwogICAg
IGJvb2wgaXNMYXN0V29yZEJyZWFrSW5Cb3ggPSBmYWxzZTsKICAgICBkbyB7Ci0gICAgICAgIHdv
cmRCcmVhayA9IG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVudERpcmVj
dGlvbmFsaXR5KGJveCwgd29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaywgaXNMYXN0V29yZEJy
ZWFrSW5Cb3gpOwotICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIChvZmZzZXQg
PT0gaW52YWxpZE9mZnNldCB8fCBvZmZzZXRPZldvcmRCcmVhayAhPSBvZmZzZXQpKQorICAgICAg
ICB3b3JkQnJlYWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnRE
aXJlY3Rpb25hbGl0eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrLCBpc0xhc3RXb3JkQnJl
YWtJbkJveCk7CisgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkgJiYgKG9mZnNldCA9
PSBzX2ludmFsaWRPZmZzZXQgfHwgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gb2Zmc2V0KSkKICAgICAg
ICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgfSB3aGlsZSAoIWlzTGFzdFdvcmRCcmVha0lu
Qm94KTsgICAgICAgCiAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogfQogICAgIAotc3Rh
dGljIFZpc2libGVQb3NpdGlvbiB2aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveChjb25zdCBJ
bmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbikK
K1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjp2aXN1YWxseUxhc3RXb3Jk
Qm91bmRhcnlJbkJveCgpCiB7CisgICAgaW50IG9mZnNldCA9IG9mZnNldEluQmxvY2soKTsKKwog
ICAgIFdvcmRCb3VuZGFyeVZlY3RvciBvcmRlcmVkV29yZEJvdW5kYXJpZXM7Ci0gICAgY29sbGVj
dFdvcmRCcmVha3NJbkJveChib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcywgYmxvY2tEaXJlY3Rp
b24pOworICAgIHNldFdvcmRCcmVha3MoJm9yZGVyZWRXb3JkQm91bmRhcmllcyk7CisgICAgY29s
bGVjdFdvcmRCcmVha3NJbkJveCgpOwogICAgIGlmICghb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNp
emUoKSkgCiAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKLSAgICBpZiAob2Zmc2V0
ID09IGludmFsaWRPZmZzZXQgfHwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzW29yZGVyZWRXb3JkQm91
bmRhcmllcy5zaXplKCkgLSAxXS5vZmZzZXRJbklubGluZUJveCAhPSBvZmZzZXQpCisgICAgaWYg
KG9mZnNldCA9PSBzX2ludmFsaWRPZmZzZXQgfHwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzW29yZGVy
ZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAxXS5vZmZzZXRJbklubGluZUJveCAhPSBvZmZzZXQp
CiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbb3JkZXJlZFdvcmRCb3VuZGFy
aWVzLnNpemUoKSAtIDFdLnZpc2libGVQb3NpdGlvbjsKICAgICBpZiAob3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzLnNpemUoKSA+IDEpCiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNb
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSAtIDJdLnZpc2libGVQb3NpdGlvbjsKICAgICBy
ZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAgICAgICAgIAotc3RhdGljIGludCBncmVhdGVz
dFZhbHVlVW5kZXIoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlv
biwgY29uc3QgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMpCitpbnQg
VmlzdWFsV29yZEJyZWFrV2luZG93czo6Z3JlYXRlc3RWYWx1ZVVuZGVyKCkKIHsKLSAgICBpZiAo
IW9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiBpbnZhbGlkT2Zm
c2V0OworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisgICAgaW50IG9mZnNldCA9
IG9mZnNldEluQmxvY2soKTsKKyAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZW5j
bG9zaW5nQmxvY2tEaXJlY3Rpb24oKTsKKyAgICBXb3JkQm91bmRhcnlWZWN0b3IqIG9yZGVyZWRX
b3JkQm91bmRhcmllcyA9IHdvcmRCcmVha3MoKTsKKyAgICBib29sIGJveEFuZEJsb2NrQXJlSW5T
YW1lRGlyZWN0aW9uID0gYm94LT5kaXJlY3Rpb24oKSA9PSBibG9ja0RpcmVjdGlvbjsKKworICAg
IGlmICghb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCkpCisgICAgICAgIHJldHVybiBzX2lu
dmFsaWRPZmZzZXQ7CiAgICAgLy8gRklYTUU6IGJpbmFyeSBzZWFyY2guCiAgICAgaWYgKGJveEFu
ZEJsb2NrQXJlSW5TYW1lRGlyZWN0aW9uKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlm
IChvcmRlcmVkV29yZEJvdW5kYXJpZXNbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPCBvZmZzZXQpCisg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPnNp
emUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoKCpvcmRlcmVkV29yZEJvdW5kYXJpZXMpW2ld
Lm9mZnNldEluSW5saW5lQm94IDwgb2Zmc2V0KQogICAgICAgICAgICAgICAgIHJldHVybiBpOwog
ICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgICAgICByZXR1cm4g
c19pbnZhbGlkT2Zmc2V0OwogICAgIH0KLSAgICBmb3IgKGludCBpID0gb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIGlmIChvcmRlcmVkV29y
ZEJvdW5kYXJpZXNbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPCBvZmZzZXQpCisgICAgZm9yIChpbnQg
aSA9IG9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAg
ICAgICAgaWYgKCgqb3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5vZmZzZXRJbklubGluZUJveCA8
IG9mZnNldCkKICAgICAgICAgICAgIHJldHVybiBpOwogICAgIH0KLSAgICByZXR1cm4gaW52YWxp
ZE9mZnNldDsKKyAgICByZXR1cm4gc19pbnZhbGlkT2Zmc2V0OwogfQogCi1zdGF0aWMgaW50IHNt
YWxsZXN0T2Zmc2V0QWJvdmUoaW50IG9mZnNldCwgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURp
cmVjdGlvbiwgY29uc3QgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMp
CitpbnQgVmlzdWFsV29yZEJyZWFrV2luZG93czo6c21hbGxlc3RPZmZzZXRBYm92ZSgpCiB7Ci0g
ICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpKQotICAgICAgICByZXR1cm4gaW52
YWxpZE9mZnNldDsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworICAgIGludCBv
ZmZzZXQgPSBvZmZzZXRJbkJsb2NrKCk7CisgICAgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlv
biA9IGVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKCk7CisgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBv
cmRlcmVkV29yZEJvdW5kYXJpZXMgPSB3b3JkQnJlYWtzKCk7CisgICAgYm9vbCBib3hBbmRCbG9j
a0FyZUluU2FtZURpcmVjdGlvbiA9IGJveC0+ZGlyZWN0aW9uKCkgPT0gYmxvY2tEaXJlY3Rpb247
CisKKyAgICBpZiAoIW9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpKQorICAgICAgICByZXR1
cm4gc19pbnZhbGlkT2Zmc2V0OwogICAgIC8vIEZJWE1FOiBiaW5hcnkgc2VhcmNoLgogICAgIGlm
IChib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbikgewotICAgICAgICBmb3IgKGludCBpID0g
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAg
ICAgICBpZiAob3JkZXJlZFdvcmRCb3VuZGFyaWVzW2ldLm9mZnNldEluSW5saW5lQm94ID4gb2Zm
c2V0KQorICAgICAgICBmb3IgKGludCBpID0gb3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCkg
LSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKCgqb3JkZXJlZFdvcmRCb3VuZGFy
aWVzKVtpXS5vZmZzZXRJbklubGluZUJveCA+IG9mZnNldCkKICAgICAgICAgICAgICAgICByZXR1
cm4gaTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKKyAgICAgICAg
cmV0dXJuIHNfaW52YWxpZE9mZnNldDsKICAgICB9Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAob3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzW2ldLm9mZnNldEluSW5saW5lQm94ID4gb2Zmc2V0KQorICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPnNpemUoKTsgKytp
KSB7CisgICAgICAgIGlmICgoKm9yZGVyZWRXb3JkQm91bmRhcmllcylbaV0ub2Zmc2V0SW5Jbmxp
bmVCb3ggPiBvZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICB9Ci0gICAgcmV0dXJu
IGludmFsaWRPZmZzZXQ7CisgICAgcmV0dXJuIHNfaW52YWxpZE9mZnNldDsKIH0KIAotc3RhdGlj
IFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZEJvdW5kYXJ5KGNvbnN0IElubGluZUJveCogYm94LCBp
bnQgb2Zmc2V0LCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uKQorVmlzaWJsZVBvc2l0aW9u
IFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmxlZnRXb3JkQm91bmRhcnkoKQogeworICAgIElubGlu
ZUJveCogYm94ID0gaW5saW5lQm94KCk7CisgICAgaW50IG9mZnNldCA9IG9mZnNldEluQmxvY2so
KTsKKyAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZW5jbG9zaW5nQmxvY2tEaXJl
Y3Rpb24oKTsKKyAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwotICAgIGZvciAg
KGNvbnN0IElubGluZUJveCogYWRqYWNlbnRCb3ggPSBib3g7IGFkamFjZW50Qm94OyBhZGphY2Vu
dEJveCA9IGFkamFjZW50Qm94LT5wcmV2TGVhZkNoaWxkKCkpIHsKKyAgICBmb3IgKElubGluZUJv
eCogYWRqYWNlbnRCb3ggPSBib3g7IGFkamFjZW50Qm94OyBhZGphY2VudEJveCA9IGFkamFjZW50
Qm94LT5wcmV2TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgc2V0SW5saW5lQm94KGFkamFjZW50Qm94
KTsKKyAgICAgICAgc2V0T2Zmc2V0SW5CbG9jayhhZGphY2VudEJveCA9PSBib3ggPyBvZmZzZXQg
OiBzX2ludmFsaWRPZmZzZXQpOworICAgICAgICAgICAgICAgIAogICAgICAgICBpZiAoYmxvY2tE
aXJlY3Rpb24gPT0gTFRSKSB7CiAgICAgICAgICAgICBpZiAoYWRqYWNlbnRCb3gtPmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSkgCi0gICAgICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNX
b3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0
IDogaW52YWxpZE9mZnNldCk7CisgICAgICAgICAgICAgICAgd29yZEJyZWFrID0gcHJldmlvdXNX
b3JkQm91bmRhcnlJbkJveCgpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdv
cmRCcmVhayA9IG5leHRXb3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3gg
PT0gYm94ID8gb2Zmc2V0IDogaW52YWxpZE9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSAKLSAgICAg
ICAgICAgIHdvcmRCcmVhayA9IHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFyeUluQm94KGFkamFjZW50
Qm94LCBhZGphY2VudEJveCA9PSBib3ggPyBvZmZzZXQgOiBpbnZhbGlkT2Zmc2V0LCBibG9ja0Rp
cmVjdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgd29yZEJyZWFrID0gbmV4dFdv
cmRCb3VuZGFyeUluQm94KCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgd29yZEJyZWFr
ID0gdmlzdWFsbHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goKTsgICAgICAgICAgICAKICAgICAgICAg
aWYgKHdvcmRCcmVhay5pc05vdE51bGwoKSkKICAgICAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7
CiAgICAgfQogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKIH0KICAKLXN0YXRpYyBWaXNp
YmxlUG9zaXRpb24gcmlnaHRXb3JkQm91bmRhcnkoY29uc3QgSW5saW5lQm94KiBib3gsIGludCBv
ZmZzZXQsIFRleHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24pCitWaXNpYmxlUG9zaXRpb24gVmlz
dWFsV29yZEJyZWFrV2luZG93czo6cmlnaHRXb3JkQm91bmRhcnkoKQogeworICAgIElubGluZUJv
eCogYm94ID0gaW5saW5lQm94KCk7CisgICAgaW50IG9mZnNldCA9IG9mZnNldEluQmxvY2soKTsK
KyAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZW5jbG9zaW5nQmxvY2tEaXJlY3Rp
b24oKTsKICAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwotICAgIGZvciAoY29u
c3QgSW5saW5lQm94KiBhZGphY2VudEJveCA9IGJveDsgYWRqYWNlbnRCb3g7IGFkamFjZW50Qm94
ID0gYWRqYWNlbnRCb3gtPm5leHRMZWFmQ2hpbGQoKSkgeworICAgIGZvciAoSW5saW5lQm94KiBh
ZGphY2VudEJveCA9IGJveDsgYWRqYWNlbnRCb3g7IGFkamFjZW50Qm94ID0gYWRqYWNlbnRCb3gt
Pm5leHRMZWFmQ2hpbGQoKSkgeworICAgICAgICBzZXRJbmxpbmVCb3goYWRqYWNlbnRCb3gpOwor
ICAgICAgICBzZXRPZmZzZXRJbkJsb2NrKGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IHNf
aW52YWxpZE9mZnNldCk7CisgICAgICAgIAogICAgICAgICBpZiAoYmxvY2tEaXJlY3Rpb24gPT0g
UlRMKSB7CiAgICAgICAgICAgICBpZiAoYWRqYWNlbnRCb3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKSkKLSAgICAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZEJvdW5kYXJ5SW5Cb3go
YWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IGludmFsaWRPZmZzZXQp
OworICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3JkQm91bmRhcnlJbkJveCgpOwog
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29y
ZEJvdW5kYXJ5SW5Cb3goYWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6
IGludmFsaWRPZmZzZXQpOworICAgICAgICAgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29y
ZEJvdW5kYXJ5SW5Cb3goKTsKICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgd29yZEJyZWFr
ID0gdmlzdWFsbHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goYWRqYWNlbnRCb3gsIGFkamFjZW50Qm94
ID09IGJveCA/IG9mZnNldCA6IGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsgICAgICAg
ICAgICAKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFyeUlu
Qm94KCk7ICAgICAgICAgICAgCiAgICAgICAgIGlmICghd29yZEJyZWFrLmlzTnVsbCgpKQogICAg
ICAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKICAgICB9CiAgICAgcmV0dXJuIFZpc2libGVQb3Np
dGlvbigpOwogfQogICAgIAotc3RhdGljIGJvb2wgcG9zaXRpb25Jc0luc2lkZUJveChjb25zdCBW
aXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaywgY29uc3QgSW5saW5lQm94KiBib3gpCitib29sIFZp
c3VhbFdvcmRCcmVha1dpbmRvd3M6OnBvc2l0aW9uSXNJbnNpZGVCb3goY29uc3QgVmlzaWJsZVBv
c2l0aW9uJiB3b3JkQnJlYWspCiB7CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVCb3goKTsK
KwogICAgIGludCBvZmZzZXRPZldvcmRCcmVhazsKLSAgICByZXR1cm4gcG9zaXRpb25Jc0luQm94
KHdvcmRCcmVhaywgYm94LCBvZmZzZXRPZldvcmRCcmVhaykKKyAgICByZXR1cm4gcG9zaXRpb25J
c0luQm94KHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWspCiAgICAgICAgICYmIG9mZnNldE9m
V29yZEJyZWFrICE9IGJveC0+Y2FyZXRNYXhPZmZzZXQoKSAmJiBvZmZzZXRPZldvcmRCcmVhayAh
PSBib3gtPmNhcmV0TWluT2Zmc2V0KCk7CiB9CiAKLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGVm
dFdvcmRQb3NpdGlvbkFjcm9zc0JvdW5kYXJ5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJs
ZVBvc2l0aW9uKQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmxlZnRX
b3JkUG9zaXRpb25BY3Jvc3NCb3VuZGFyeShjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQ
b3NpdGlvbikKIHsKICAgICBJbmxpbmVCb3gqIGJveDsKICAgICBpbnQgb2Zmc2V0OwpAQCAtMTUy
OCwxNCArMTYzNiwyMCBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxlZnRXb3JkUG9zaXRpb25B
CiAKICAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0aW9uID0gZGlyZWN0aW9uT2ZFbmNsb3Np
bmdCbG9jayh2aXNpYmxlUG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKSk7CiAgICAgCisgICAgc2V0
SW5saW5lQm94KGJveCk7CisgICAgc2V0T2Zmc2V0SW5CbG9jayhvZmZzZXQpOworICAgIHNldEVu
Y2xvc2luZ0Jsb2NrRGlyZWN0aW9uKGJsb2NrRGlyZWN0aW9uKTsKKyAgICAKICAgICAvLyBGSVhN
RTogSWYgdGhlIGJveCdzIGRpcmVjdGlvbmFsaXR5IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhl
IGVuY2xvc2luZyBibG9jaywgd2hlbiB0aGUgb2Zmc2V0IGlzIGF0IHRoZSBib3ggYm91bmRhcnkK
ICAgICAvLyBhbmQgdGhlIGRpcmVjdGlvbiBpcyB0b3dhcmRzIGluc2lkZSB0aGUgYm94LCBkbyBJ
IHN0aWxsIG5lZWQgdG8gbWFrZSBpdCBhIHNwZWNpYWwgY2FzZT8gRm9yIGV4YW1wbGUsIGEgTFRS
IGJveCBpbnNpZGUgYSBMVFIgYmxvY2ssCiAgICAgLy8gd2hlbiBvZmZzZXQgaXMgYXQgYm94J3Mg
Y2FyZXRNaW5PZmZzZXQgYW5kIHRoZSBkaXJlY3Rpb24gaXMgRGlyZWN0aW9uUmlnaHQsIHNob3Vs
ZCBpdCBiZSB0YWtlbiBjYXJlIGFzIGEgZ2VuZXJhbCBjYXNlPwotICAgIGlmIChvZmZzZXQgPT0g
Ym94LT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpCi0gICAgICAgIHJldHVybiBsZWZ0V29yZEJvdW5k
YXJ5KGJveC0+cHJldkxlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7
CisgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgeworICAgICAg
ICBzZXRJbmxpbmVCb3goYm94LT5wcmV2TGVhZkNoaWxkKCkpOworICAgICAgICBzZXRPZmZzZXRJ
bkJsb2NrKHNfaW52YWxpZE9mZnNldCk7CisgICAgICAgIHJldHVybiBsZWZ0V29yZEJvdW5kYXJ5
KCk7CisgICAgfQogICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgp
KQotICAgICAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gsIG9mZnNldCwgYmxvY2tEaXJl
Y3Rpb24pOwotICAgIAorICAgICAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeSgpOwogICAgIAog
ICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7CiAgICAgaWYgKGJsb2NrRGlyZWN0aW9uID09
IExUUikgewpAQCAtMTU0NCwyMSArMTY1OCwyNCBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxl
ZnRXb3JkUG9zaXRpb25BCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHdvcmRCcmVhayA9IG5l
eHRCb3VuZGFyeSh2aXNpYmxlUG9zaXRpb24sIG5leHRXb3JkUG9zaXRpb25Cb3VuZGFyeSk7CiAg
ICAgfQotICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkgJiYgcG9zaXRpb25Jc0luc2lkZUJv
eCh3b3JkQnJlYWssIGJveCkpCisgICAgaWYgKHdvcmRCcmVhay5pc05vdE51bGwoKSAmJiBwb3Np
dGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaykpCiAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAg
ICAgCiAgICAgV29yZEJvdW5kYXJ5VmVjdG9yIG9yZGVyZWRXb3JkQm91bmRhcmllczsKLSAgICBj
b2xsZWN0V29yZEJyZWFrc0luQm94KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLCBibG9ja0Rp
cmVjdGlvbik7CisgICAgc2V0V29yZEJyZWFrcygmb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAg
ICBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7CiAKLSAgICBpbnQgaW5kZXggPSBib3gtPmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSA/IGdyZWF0ZXN0VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGly
ZWN0aW9uID09IExUUiwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKSA6Ci0gICAgICAgIHNtYWxsZXN0
T2Zmc2V0QWJvdmUob2Zmc2V0LCBibG9ja0RpcmVjdGlvbiA9PSBSVEwsIG9yZGVyZWRXb3JkQm91
bmRhcmllcyk7Ci0gICAgaWYgKGluZGV4ICE9IGludmFsaWRPZmZzZXQpCisgICAgaW50IGluZGV4
ID0gYm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBncmVhdGVzdFZhbHVlVW5kZXIoKSA6
CisgICAgICAgIHNtYWxsZXN0T2Zmc2V0QWJvdmUoKTsKKyAgICBpZiAoaW5kZXggIT0gc19pbnZh
bGlkT2Zmc2V0KQogICAgICAgICByZXR1cm4gb3JkZXJlZFdvcmRCb3VuZGFyaWVzW2luZGV4XS52
aXNpYmxlUG9zaXRpb247CiAgICAgCi0gICAgcmV0dXJuIGxlZnRXb3JkQm91bmRhcnkoYm94LT5w
cmV2TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKKyAgICBzZXRJ
bmxpbmVCb3goYm94LT5wcmV2TGVhZkNoaWxkKCkpOworICAgIHNldE9mZnNldEluQmxvY2soc19p
bnZhbGlkT2Zmc2V0KTsKKyAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeSgpOwogfQogCi1zdGF0
aWMgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uQWNyb3NzQm91bmRhcnkoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24pCitWaXNpYmxlUG9zaXRpb24gVmlzdWFs
V29yZEJyZWFrV2luZG93czo6cmlnaHRXb3JkUG9zaXRpb25BY3Jvc3NCb3VuZGFyeShjb25zdCBW
aXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKIHsKICAgICBJbmxpbmVCb3gqIGJveDsK
ICAgICBpbnQgb2Zmc2V0OwpAQCAtMTU2OSwxMCArMTY4NiwxNyBAQCBzdGF0aWMgVmlzaWJsZVBv
c2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uCiAKICAgICBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0
aW9uID0gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayh2aXNpYmxlUG9zaXRpb24uZGVlcEVxdWl2
YWxlbnQoKSk7CiAgICAgCisgICAgc2V0SW5saW5lQm94KGJveCk7CisgICAgc2V0T2Zmc2V0SW5C
bG9jayhvZmZzZXQpOworICAgIHNldEVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKGJsb2NrRGlyZWN0
aW9uKTsKKyAgICAKICAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgp
KQotICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LCBvZmZzZXQsIGJsb2NrRGly
ZWN0aW9uKTsKLSAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkK
LSAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5kYXJ5KGJveC0+bmV4dExlYWZDaGlsZCgpLCBp
bnZhbGlkT2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7CisgICAgICAgIHJldHVybiByaWdodFdvcmRC
b3VuZGFyeSgpOworICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgp
KSB7CisgICAgICAgIHNldElubGluZUJveChib3gtPm5leHRMZWFmQ2hpbGQoKSk7CisgICAgICAg
IHNldE9mZnNldEluQmxvY2soc19pbnZhbGlkT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIHJpZ2h0
V29yZEJvdW5kYXJ5KCk7CisgICAgfQogIAogICAgIFZpc2libGVQb3NpdGlvbiB3b3JkQnJlYWs7
CiAgICAgaWYgKGJsb2NrRGlyZWN0aW9uID09IFJUTCkgewpAQCAtMTU4MSwyMSArMTcwNSwyNCBA
QCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uCiAgICAgICAgIGVsc2UK
ICAgICAgICAgICAgIHdvcmRCcmVhayA9IG5leHRCb3VuZGFyeSh2aXNpYmxlUG9zaXRpb24sIG5l
eHRXb3JkUG9zaXRpb25Cb3VuZGFyeSk7CiAgICAgfQotICAgIGlmICh3b3JkQnJlYWsuaXNOb3RO
dWxsKCkgJiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWssIGJveCkpCisgICAgaWYgKHdv
cmRCcmVhay5pc05vdE51bGwoKSAmJiBwb3NpdGlvbklzSW5zaWRlQm94KHdvcmRCcmVhaykpCiAg
ICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAgCiAgICAgV29yZEJvdW5kYXJ5VmVjdG9yIG9y
ZGVyZWRXb3JkQm91bmRhcmllczsKLSAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KGJveCwgb3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzLCBibG9ja0RpcmVjdGlvbik7CisgICAgc2V0V29yZEJyZWFrcygm
b3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsKKyAgICBjb2xsZWN0V29yZEJyZWFrc0luQm94KCk7CiAg
ICAgCi0gICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBzbWFs
bGVzdE9mZnNldEFib3ZlKG9mZnNldCwgYmxvY2tEaXJlY3Rpb24gPT0gTFRSLCBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMpIDoKLSAgICAgICAgZ3JlYXRlc3RWYWx1ZVVuZGVyKG9mZnNldCwgYmxvY2tE
aXJlY3Rpb24gPT0gUlRMLCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpOwotICAgIGlmIChpbmRleCAh
PSBpbnZhbGlkT2Zmc2V0KQorICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpID8gc21hbGxlc3RPZmZzZXRBYm92ZSgpIDoKKyAgICAgICAgZ3JlYXRlc3RWYWx1ZVVu
ZGVyKCk7CisgICAgaWYgKGluZGV4ICE9IHNfaW52YWxpZE9mZnNldCkKICAgICAgICAgcmV0dXJu
IG9yZGVyZWRXb3JkQm91bmRhcmllc1tpbmRleF0udmlzaWJsZVBvc2l0aW9uOwogICAgIAotICAg
IHJldHVybiByaWdodFdvcmRCb3VuZGFyeShib3gtPm5leHRMZWFmQ2hpbGQoKSwgaW52YWxpZE9m
ZnNldCwgYmxvY2tEaXJlY3Rpb24pOworICAgIHNldElubGluZUJveChib3gtPm5leHRMZWFmQ2hp
bGQoKSk7CisgICAgc2V0T2Zmc2V0SW5CbG9jayhzX2ludmFsaWRPZmZzZXQpOworICAgIHJldHVy
biByaWdodFdvcmRCb3VuZGFyeSgpOwogfQogCi1WaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRQb3Np
dGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK1Zpc2libGVQb3Np
dGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKQogewogICAgIGlmICh2aXNpYmxlUG9zaXRpb24u
aXNOdWxsKCkpCiAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKQEAgLTE2MDQsNyAr
MTczMSw3IEBAIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFYKICAgICBy
ZXR1cm4gdmlzaWJsZVBvc2l0aW9uLmhvbm9yRWRpdGFibGVCb3VuZGFyeUF0T3JCZWZvcmUobGVm
dFdvcmRCcmVhayk7CiB9CiAKLVZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbihjb25z
dCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK1Zpc2libGVQb3NpdGlvbiBWaXN1
YWxXb3JkQnJlYWtXaW5kb3dzOjpyaWdodFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRp
b24mIHZpc2libGVQb3NpdGlvbikKIHsKICAgICBpZiAodmlzaWJsZVBvc2l0aW9uLmlzTnVsbCgp
KQogICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CkBAIC0xNjEzLDQgKzE3NDAsMTQg
QEAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uKGNvbnN0IAogICAgIHJldHVybiB2
aXNpYmxlUG9zaXRpb24uaG9ub3JFZGl0YWJsZUJvdW5kYXJ5QXRPckJlZm9yZShyaWdodFdvcmRC
cmVhayk7CiB9CiAKK1Zpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKQoreworICAgIHJldHVybiBWaXN1YWxXb3JkQnJl
YWtXaW5kb3dzKCkubGVmdFdvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworfQorCitWaXNp
YmxlUG9zaXRpb24gcmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNp
YmxlUG9zaXRpb24pCit7CisgICAgcmV0dXJuIFZpc3VhbFdvcmRCcmVha1dpbmRvd3MoKS5yaWdo
dFdvcmRQb3NpdGlvbih2aXNpYmxlUG9zaXRpb24pOworfQorCiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101542</attachid>
            <date>2011-07-20 18:40:52 -0700</date>
            <delta_ts>2011-08-08 12:27:53 -0700</delta_ts>
            <desc>Revised fix</desc>
            <filename>vanlam-bug60910</filename>
            <type>text/plain</type>
            <size>31529</size>
            <attacher name="Van Lam">vanlam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkxNDMxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTQgQEAKKzIwMTEtMDctMjAgIFZhbiBMYW0g
IDx2YW5sYW1AZ29vZ2xlLmNvbT4KKworICAgICAgICBtaWdodCBuZWVkIHRvIGJ1bmRsZSB0aGUg
ZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdmlzdWFsIHdvcmQgYnJlYWsgYXMgYSBjbGFzcyAoVmlzdWFs
V29yZEJyZWFrZXIpCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD02MDkxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFJlZmFjdG9yZWQgYnkgYnVuZGxpbmcgZnVuY3Rpb25zIGludG8gYSBjbGFzcywgc3Rvcmlu
ZyBmcmVxdWVudGx5CisgICAgICAgIHBhc3NlZCBhcmd1bWVudHMgYXMgZGF0YSBtZW1iZXJzIHRv
IGF2b2lkIGxvbmcgcGFyYW1ldGVyIGxpc3RzLgorCisgICAgICAgICogZWRpdGluZy9GcmFtZVNl
bGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6bW9kaWZ5TW92
aW5nUmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVTZWxlY3Rpb246Om1vZGlmeU1vdmlu
Z0xlZnQpOgorICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzKToK
KyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6On5WaXN1YWxXb3JkQnJl
YWtXaW5kb3dzKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnNl
dElubGluZUJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpz
ZXRPZmZzZXRJbkJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRv
d3M6OnNldEVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha1dpbmRvd3M6OnNldFdvcmRCcmVha3MpOgorICAgICAgICAoV2ViQ29yZTo6Vmlz
dWFsV29yZEJyZWFrV2luZG93czo6aW5saW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha1dpbmRvd3M6Om9mZnNldEluQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6Vmlz
dWFsV29yZEJyZWFrV2luZG93czo6ZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93czo6d29yZEJyZWFrcyk6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzSW5Cb3gpOgorICAgICAg
ICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93czo6cHJldmlvdXNXb3JkQnJlYWtJbkJv
eEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpW
aXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2Nr
KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnJpZ2h0bW9zdFBv
c2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRC
cmVha1dpbmRvd3M6Omxhc3RXb3JkQnJlYWtJbkJveCk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1
YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJsb2Nr
V2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6Om5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcmVu
dERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRv
d3M6OldvcmRCb3VuZGFyeUVudHJ5OjpXb3JkQm91bmRhcnlFbnRyeSk6CisgICAgICAgIChXZWJD
b3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRl
QmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdv
cmRCcmVha1dpbmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZm
ZXJudERpcmVjdGlvbmFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dp
bmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtzSW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFs
V29yZEJyZWFrV2luZG93czo6cHJldmlvdXNXb3JkQm91bmRhcnlJbkJveCk6CisgICAgICAgIChX
ZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpuZXh0V29yZEJvdW5kYXJ5SW5Cb3gpOgor
ICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93czo6dmlzdWFsbHlMYXN0V29y
ZEJvdW5kYXJ5SW5Cb3gpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFsV29yZEJyZWFrV2luZG93
czo6Z3JlYXRlc3RWYWx1ZVVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVh
a1dpbmRvd3M6OnNtYWxsZXN0T2Zmc2V0QWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6VmlzdWFs
V29yZEJyZWFrV2luZG93czo6bGVmdFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpW
aXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpyaWdodFdvcmRCb3VuZGFyeSk6CisgICAgICAgIChXZWJD
b3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzSW5zaWRlQm94KToKKyAgICAg
ICAgKFdlYkNvcmU6OlZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmxlZnRXb3JkUG9zaXRpb25BY3Jv
c3NCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpy
aWdodFdvcmRQb3NpdGlvbkFjcm9zc0JvdW5kYXJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlZpc3Vh
bFdvcmRCcmVha1dpbmRvd3M6OmxlZnRXb3JkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
VmlzdWFsV29yZEJyZWFrV2luZG93czo6cmlnaHRXb3JkUG9zaXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6bGVmdFdvcmRQb3NpdGlvbldyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6cmlnaHRX
b3JkUG9zaXRpb25XcmFwcGVyKToKKyAgICAgICAgKiBlZGl0aW5nL3Zpc2libGVfdW5pdHMuaDoK
KwogMjAxMS0wNy0yMCAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFJlbW92ZSBzdHJheSByZWZlcmVuY2UgdG8gU3R5bGVGbGV4aWJsZUJveERhdGEuaCB0aGF0IHdh
cyBhY2NpZGVudGFsbHkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0
cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRz
LmNwcAkocmV2aXNpb24gOTE0MzIpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVf
dW5pdHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTcxLDEwICsxMTcxLDcxIEBAIFZpc2libGVQ
b3NpdGlvbiByaWdodEJvdW5kYXJ5T2ZMaW5lKGNvbnMKICAgICByZXR1cm4gZGlyZWN0aW9uID09
IExUUiA/IGxvZ2ljYWxFbmRPZkxpbmUoYykgOiBsb2dpY2FsU3RhcnRPZkxpbmUoYyk7CiB9CiAK
LXN0YXRpYyBjb25zdCBpbnQgaW52YWxpZE9mZnNldCA9IC0xOworY2xhc3MgVmlzdWFsV29yZEJy
ZWFrV2luZG93cyB7CisgICAgcHVibGljOgorICAgICAgICBWaXN1YWxXb3JkQnJlYWtXaW5kb3dz
KCkKKyAgICAgICAgOiBtX2lubGluZUJveCgwKQorICAgICAgICAsIG1fb2Zmc2V0SW5CbG9jayhz
X2ludmFsaWRPZmZzZXQpCisgICAgICAgICwgbV9lbmNsb3NpbmdCbG9ja0RpcmVjdGlvbihMVFIp
CisgICAgICAgICwgbV93b3JkQnJlYWtzKDApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAg
ICB+VmlzdWFsV29yZEJyZWFrV2luZG93cygpIHsgfQorICAgICAgICBWaXNpYmxlUG9zaXRpb24g
cmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CisgICAgICAgIFZpc2li
bGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOworICAg
ICAgICAgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgc19p
bnZhbGlkT2Zmc2V0ID0gLTE7CisgICAgICAgIAorICAgICAgICBzdHJ1Y3QgV29yZEJvdW5kYXJ5
RW50cnk7CisgICAgICAgIHR5cGVkZWYgVmVjdG9yPFdvcmRCb3VuZGFyeUVudHJ5LCA1MD4gV29y
ZEJvdW5kYXJ5VmVjdG9yOyAgICAgICAgCisKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxlZnRX
b3JkUG9zaXRpb25BY3Jvc3NCb3VuZGFyeShjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsKKyAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uQWNyb3NzQm91bmRhcnkoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJik7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0
aW9uSW5SVExCb3hJbkxUUkJsb2NrKCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiByaWdodG1v
c3RQb3NpdGlvbkluTFRSQm94SW5SVExCbG9jaygpOworICAgICAgICBWaXNpYmxlUG9zaXRpb24g
bGFzdFdvcmRCcmVha0luQm94KGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspOworICAgICAgICBWaXNp
YmxlUG9zaXRpb24gcHJldmlvdXNXb3JkQm91bmRhcnlJbkJveCgpOworICAgICAgICBWaXNpYmxl
UG9zaXRpb24gbmV4dFdvcmRCb3VuZGFyeUluQm94KCk7CisgICAgICAgIFZpc2libGVQb3NpdGlv
biB2aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveCgpOyAgICAgICAgCisgICAgICAgIFZpc2li
bGVQb3NpdGlvbiBsZWZ0V29yZEJvdW5kYXJ5KCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBy
aWdodFdvcmRCb3VuZGFyeSgpOworICAgICAgICBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXNXb3Jk
QnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShjb25zdCBWaXNpYmxl
UG9zaXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKTsKKyAg
ICAgICAgVmlzaWJsZVBvc2l0aW9uIG5leHRXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aERp
ZmZlcmVudERpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3Jk
QnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWssIGJvb2wmIGlzTGFzdFdvcmRCcmVha0luQm94
KTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgYm9vbCBwb3NpdGlvbklzVmlzdWFsbHlPcmRl
cmVkSW5Cb3hJbkJsb2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KGNvbnN0IFZpc2libGVQ
b3NpdGlvbiYgd29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgYm9v
bCBuZWVkVG9Vc2VMb2dpY2FsRW5kT2ZMaW5lKCk7CisgICAgICAgIGJvb2wgaXNCb3hWaXN1YWxs
eUxhc3RJbkJsb2NrKCk7CisgICAgICAgIGJvb2wgcG9zaXRpb25Jc0luc2lkZUJveChjb25zdCBW
aXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhayk7CisgICAgICAgIGJvb2wgcG9zaXRpb25Jc0luQm94
KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFr
KTsKKyAgICAgICAgCisgICAgICAgIGludCBncmVhdGVzdFZhbHVlVW5kZXIoKTsKKyAgICAgICAg
aW50IHNtYWxsZXN0T2Zmc2V0QWJvdmUoKTsKKyAgICAgICAgCisgICAgICAgIHZvaWQgY29sbGVj
dFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eSgpOworICAg
ICAgICB2b2lkIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJudERp
cmVjdGlvbmFsaXR5KCk7CisgICAgICAgIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveCgpOyAg
ICAKKyAgICAgICAgCisgICAgICAgIHZvaWQgc2V0SW5saW5lQm94KElubGluZUJveCogaW5saW5l
Qm94KSB7IG1faW5saW5lQm94ID0gaW5saW5lQm94OyB9CisgICAgICAgIHZvaWQgc2V0T2Zmc2V0
SW5CbG9jayhpbnQgb2Zmc2V0SW5CbG9jaykgeyBtX29mZnNldEluQmxvY2sgPSBvZmZzZXRJbkJs
b2NrOyB9CisgICAgICAgIHZvaWQgc2V0RW5jbG9zaW5nQmxvY2tEaXJlY3Rpb24oVGV4dERpcmVj
dGlvbiBlbmNsb3NpbmdCbG9ja0RpcmVjdGlvbikgeyBtX2VuY2xvc2luZ0Jsb2NrRGlyZWN0aW9u
ID0gZW5jbG9zaW5nQmxvY2tEaXJlY3Rpb247IH0KKyAgICAgICAgdm9pZCBzZXRXb3JkQnJlYWtz
KFdvcmRCb3VuZGFyeVZlY3Rvciogd29yZEJyZWFrcykgeyBtX3dvcmRCcmVha3MgPSB3b3JkQnJl
YWtzOyB9CisgICAgICAgIAorICAgICAgICBJbmxpbmVCb3gqIGlubGluZUJveCgpIHsgcmV0dXJu
IG1faW5saW5lQm94OyB9CisgICAgICAgIGludCBvZmZzZXRJbkJsb2NrKCkgeyByZXR1cm4gbV9v
ZmZzZXRJbkJsb2NrOyB9CisgICAgICAgIFRleHREaXJlY3Rpb24gZW5jbG9zaW5nQmxvY2tEaXJl
Y3Rpb24oKSB7IHJldHVybiBtX2VuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uOyB9CisgICAgICAgIFdv
cmRCb3VuZGFyeVZlY3Rvciogd29yZEJyZWFrcygpIHsgcmV0dXJuIG1fd29yZEJyZWFrczsgfQor
CisgICAgICAgIElubGluZUJveCogbV9pbmxpbmVCb3g7CisgICAgICAgIGludCBtX29mZnNldElu
QmxvY2s7CisgICAgICAgIFRleHREaXJlY3Rpb24gbV9lbmNsb3NpbmdCbG9ja0RpcmVjdGlvbjsK
KyAgICAgICAgV29yZEJvdW5kYXJ5VmVjdG9yKiBtX3dvcmRCcmVha3M7Cit9OwogCi1zdGF0aWMg
Ym9vbCBwb3NpdGlvbklzSW5Cb3goY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJlYWssIGNv
bnN0IElubGluZUJveCogYm94LCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQorYm9vbCBWaXN1YWxX
b3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklzSW5Cb3goY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3
b3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWspCiB7CisgICAgSW5saW5lQm94KiBib3gg
PSBpbmxpbmVCb3goKTsKKwogICAgIGlmICh3b3JkQnJlYWsuaXNOdWxsKCkpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKIApAQCAtMTE4Myw4ICsxMjQ0LDEwIEBAIHN0YXRpYyBib29sIHBvc2l0aW9u
SXNJbkJveChjb25zdCBWaXNpYmwKICAgICByZXR1cm4gYm94ID09IGJveE9mV29yZEJyZWFrOwog
fQogCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3VzV29yZEJyZWFrSW5Cb3hJbnNpZGVC
bG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoY29uc3QgSW5saW5lQm94KiBib3gsIGNvbnN0IFZp
c2libGVQb3NpdGlvbiYgcHJldmlvdXNXb3JkQnJlYWssIGludCYgb2Zmc2V0T2ZXb3JkQnJlYWsp
CitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6cHJldmlvdXNXb3JkQnJl
YWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0eShjb25zdCBWaXNpYmxlUG9z
aXRpb24mIHByZXZpb3VzV29yZEJyZWFrLCBpbnQmIG9mZnNldE9mV29yZEJyZWFrKQogeworICAg
IElubGluZUJveCogYm94ID0gaW5saW5lQm94KCk7CisKICAgICAvLyBJbiBhIExUUiBibG9jaywg
dGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5IG9mIGEgd29yZC4K
ICAgICAvLyBJbiBhIFJUTCBibG9jaywgdGhlIHdvcmQgYnJlYWsgc2hvdWxkIGJlIG9uIHRoZSBy
aWdodCBib3VuZGFyeSBvZiBhIHdvcmQuCiAgICAgLy8gQmVjYXVzZSBuZXh0V29yZFBvc2l0aW9u
KCkgcmV0dXJucyB0aGUgd29yZCBicmVhayBvbiB0aGUgcmlnaHQgYm91bmRhcnkgb2YgdGhlIHdv
cmQgZm9yIExUUiB0ZXh0LApAQCAtMTIxNSw3ICsxMjc4LDcgQEAgc3RhdGljIFZpc2libGVQb3Np
dGlvbiBwcmV2aW91c1dvcmRCcmVhawogICAgICAgICAgICAgaWYgKHBvc2l0aW9uQWZ0ZXJXb3Jk
LmlzTm90TnVsbCgpKSB7CiAgICAgICAgICAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9u
QmVmb3JlV29yZCA9IHByZXZpb3VzQm91bmRhcnkocG9zaXRpb25BZnRlcldvcmQsIHByZXZpb3Vz
V29yZFBvc2l0aW9uQm91bmRhcnkpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYg
KHBvc2l0aW9uSXNJbkJveChwb3NpdGlvbkJlZm9yZVdvcmQsIGJveCwgb2Zmc2V0T2ZXb3JkQnJl
YWspKQorICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbklzSW5Cb3gocG9zaXRpb25CZWZvcmVX
b3JkLCBvZmZzZXRPZldvcmRCcmVhaykpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3Np
dGlvbkJlZm9yZVdvcmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEyMjUsMTEgKzEy
ODgsMTMgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwcmV2aW91c1dvcmRCcmVhawogICAgIGlm
IChwcmV2aW91c1dvcmRCcmVhayA9PSB3b3JkQnJlYWspCiAgICAgICAgIHJldHVybiBWaXNpYmxl
UG9zaXRpb24oKTsKIAotICAgIHJldHVybiBwb3NpdGlvbklzSW5Cb3god29yZEJyZWFrLCBib3gs
IG9mZnNldE9mV29yZEJyZWFrKSA/IHdvcmRCcmVhayA6IFZpc2libGVQb3NpdGlvbigpOworICAg
IHJldHVybiBwb3NpdGlvbklzSW5Cb3god29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaykgPyB3
b3JkQnJlYWsgOiBWaXNpYmxlUG9zaXRpb24oKTsKIH0KIAotc3RhdGljIFZpc2libGVQb3NpdGlv
biBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJbkxUUkJsb2NrKGNvbnN0IElubGluZUJveCogYm94
KQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmxlZnRtb3N0UG9zaXRp
b25JblJUTEJveEluTFRSQmxvY2soKQogeworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94
KCk7CisKICAgICAvLyBGSVhNRTogUHJvYmFibHkgbmVlZCB0byB0YWtlIGNhcmUgb2YgYmlkaSBs
ZXZlbCB0b28uCiAgICAgTm9kZSogbm9kZSA9IGJveC0+cmVuZGVyZXIoKS0+bm9kZSgpOwogICAg
IElubGluZUJveCogcHJldmlvdXNMZWFmID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CkBAIC0xMjUz
LDggKzEzMTgsMTAgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBsZWZ0bW9zdFBvc2l0aW9uSQog
ICAgIHJldHVybiBQb3NpdGlvbihub2RlLCBib3gtPmNhcmV0TWluT2Zmc2V0KCksIFBvc2l0aW9u
OjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwogfQogCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9u
IHJpZ2h0bW9zdFBvc2l0aW9uSW5MVFJCb3hJblJUTEJsb2NrKGNvbnN0IElubGluZUJveCogYm94
KQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnJpZ2h0bW9zdFBvc2l0
aW9uSW5MVFJCb3hJblJUTEJsb2NrKCkKIHsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJv
eCgpOworCiAgICAgLy8gRklYTUU6IFByb2JhYmx5IG5lZWQgdG8gdGFrZSBjYXJlIG9mIGJpZGkg
bGV2ZWwgdG9vLgogICAgIE5vZGUqIG5vZGUgPSBib3gtPnJlbmRlcmVyKCktPm5vZGUoKTsKICAg
ICBJbmxpbmVCb3gqIHByZXZpb3VzTGVhZiA9IGJveC0+cHJldkxlYWZDaGlsZCgpOwpAQCAtMTI3
OCwxNiArMTM0NSwxOCBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0bW9zdFBvc2l0aW9u
CiAgICAgcmV0dXJuIFBvc2l0aW9uKG5vZGUsIGJveC0+Y2FyZXRNaW5PZmZzZXQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CiB9CiAgICAgCi1zdGF0aWMgVmlzaWJsZVBv
c2l0aW9uIGxhc3RXb3JkQnJlYWtJbkJveChjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50JiBvZmZz
ZXRPZldvcmRCcmVhaykKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjps
YXN0V29yZEJyZWFrSW5Cb3goaW50JiBvZmZzZXRPZldvcmRCcmVhaykKIHsKKyAgICBJbmxpbmVC
b3gqIGJveCA9IGlubGluZUJveCgpOworCiAgICAgLy8gQWRkIHRoZSBsZWZ0bW9zdCB3b3JkIGJy
ZWFrIGZvciBSVEwgYm94IG9yIHJpZ2h0bW9zdCB3b3JkIGJyZWFrIGZvciBMVFIgYm94LgogICAg
IElubGluZUJveCogcHJldmlvdXNMZWFmID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CiAgICAgSW5s
aW5lQm94KiBuZXh0TGVhZiA9IGJveC0+bmV4dExlYWZDaGlsZCgpOwogICAgIFZpc2libGVQb3Np
dGlvbiBib3VuZGFyeVBvc2l0aW9uOwogICAgIGlmIChib3gtPmRpcmVjdGlvbigpID09IFJUTCAm
JiAoIXByZXZpb3VzTGVhZiB8fCBwcmV2aW91c0xlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSkpCi0gICAgICAgIGJvdW5kYXJ5UG9zaXRpb24gPSBsZWZ0bW9zdFBvc2l0aW9uSW5SVExCb3hJ
bkxUUkJsb2NrKGJveCk7CisgICAgICAgIGJvdW5kYXJ5UG9zaXRpb24gPSBsZWZ0bW9zdFBvc2l0
aW9uSW5SVExCb3hJbkxUUkJsb2NrKCk7CiAgICAgZWxzZSBpZiAoYm94LT5kaXJlY3Rpb24oKSA9
PSBMVFIgJiYgKCFuZXh0TGVhZiB8fCAhbmV4dExlYWYtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSkpCi0gICAgICAgIGJvdW5kYXJ5UG9zaXRpb24gPSByaWdodG1vc3RQb3NpdGlvbkluTFRSQm94
SW5SVExCbG9jayhib3gpOworICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gcmlnaHRtb3N0UG9z
aXRpb25JbkxUUkJveEluUlRMQmxvY2soKTsKIAogICAgIGlmIChib3VuZGFyeVBvc2l0aW9uLmlz
TnVsbCgpKQogICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7ICAgICAgICAgICAgCkBA
IC0xMjk4LDE5ICsxMzY3LDIxIEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGFzdFdvcmRCcmVh
a0luQm8KICAgICBlbHNlIGlmICh3b3JkQnJlYWsgIT0gYm91bmRhcnlQb3NpdGlvbikKICAgICAg
ICAgd29yZEJyZWFrID0gcHJldmlvdXNCb3VuZGFyeSh3b3JkQnJlYWssIHByZXZpb3VzV29yZFBv
c2l0aW9uQm91bmRhcnkpOwogCi0gICAgcmV0dXJuIHBvc2l0aW9uSXNJbkJveCh3b3JkQnJlYWss
IGJveCwgb2Zmc2V0T2ZXb3JkQnJlYWspID8gd29yZEJyZWFrIDogVmlzaWJsZVBvc2l0aW9uKCk7
ICAgIAorICAgIHJldHVybiBwb3NpdGlvbklzSW5Cb3god29yZEJyZWFrLCBvZmZzZXRPZldvcmRC
cmVhaykgPyB3b3JkQnJlYWsgOiBWaXNpYmxlUG9zaXRpb24oKTsgIAogfQogCi1zdGF0aWMgYm9v
bCBwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJsb2NrV2l0aERpZmZlcmVudERpcmVj
dGlvbmFsaXR5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29yZEJyZWFrLCBjb25zdCBJbmxpbmVC
b3gqIGJveCwgaW50JiBvZmZzZXRPZldvcmRCcmVhaykKK2Jvb2wgVmlzdWFsV29yZEJyZWFrV2lu
ZG93czo6cG9zaXRpb25Jc1Zpc3VhbGx5T3JkZXJlZEluQm94SW5CbG9ja1dpdGhEaWZmZXJlbnRE
aXJlY3Rpb25hbGl0eShjb25zdCBWaXNpYmxlUG9zaXRpb24mIHdvcmRCcmVhaywgaW50JiBvZmZz
ZXRPZldvcmRCcmVhaykKIHsKICAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBvZmZzZXRPZldvcmRC
cmVhazsKLSAgICByZXR1cm4gcG9zaXRpb25Jc0luQm94KHdvcmRCcmVhaywgYm94LCBvZmZzZXRP
ZldvcmRCcmVhaykKLSAgICAgICAgJiYgKHByZXZpb3VzT2Zmc2V0ID09IGludmFsaWRPZmZzZXQg
fHwgcHJldmlvdXNPZmZzZXQgPCBvZmZzZXRPZldvcmRCcmVhayk7CisgICAgcmV0dXJuIHBvc2l0
aW9uSXNJbkJveCh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKQorICAgICAgICAmJiAocHJl
dmlvdXNPZmZzZXQgPT0gc19pbnZhbGlkT2Zmc2V0IHx8IHByZXZpb3VzT2Zmc2V0IDwgb2Zmc2V0
T2ZXb3JkQnJlYWspOwogfQogICAgIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiBuZXh0V29yZEJy
ZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eSgKLSAgICBjb25z
dCBJbmxpbmVCb3gqIGJveCwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVh
aywgaW50JiBvZmZzZXRPZldvcmRCcmVhaywgYm9vbCYgaXNMYXN0V29yZEJyZWFrSW5Cb3gpCitW
aXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6bmV4dFdvcmRCcmVha0luQm94
SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkoCisgICAgY29uc3QgVmlzaWJs
ZVBvc2l0aW9uJiBwcmV2aW91c1dvcmRCcmVhaywgaW50JiBvZmZzZXRPZldvcmRCcmVhaywgYm9v
bCYgaXNMYXN0V29yZEJyZWFrSW5Cb3gpCiB7CisgICAgSW5saW5lQm94KiBib3ggPSBpbmxpbmVC
b3goKTsKKwogICAgIC8vIEZJWE1FOiBQcm9iYWJseSBuZWVkIHRvIHRha2UgY2FyZSBvZiBiaWRp
IGxldmVsIHRvby4KICAgICAKICAgICAvLyBJbiBhIExUUiBibG9jaywgdGhlIHdvcmQgYnJlYWsg
c2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5IG9mIGEgd29yZC4KQEAgLTEzMjksMTggKzE0
MDAsMTggQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBuZXh0V29yZEJyZWFrSW5CbwogICAgIC8v
IFN0YXJ0IGF0IG9mZnNldCAwLCB0aGUgZmlyc3Qgd29yZCBicmVhayBpcyBhdCBvZmZzZXQgMywg
dGhlIDJuZCB3b3JkIGJyZWFrIGlzIGF0IG9mZnNldCA3LCBhbmQgdGhlIDNyZCB3b3JkIGJyZWFr
IHNob3VsZCBiZSBhdCBvZmZzZXQgMC4KICAgICAvLyBCdXQgbmV4dFdvcmRQb3NpdGlvbigpIG9m
IG9mZnNldCA3IGlzIG9mZnNldCAxMSwgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQsIAogICAgIC8v
IGFuZCB0aGUgcG9zaXRpb24gYXQgb2Zmc2V0IDAgc2hvdWxkIGJlIG1hbnVhbGx5IGFkZGVkIGFz
IHRoZSBsYXN0IHdvcmQgYnJlYWsgd2l0aGluIHRoZSBib3guCi0gICAgaWYgKHdvcmRCcmVhayAh
PSBwcmV2aW91c1dvcmRCcmVhayAmJiBwb3NpdGlvbklzVmlzdWFsbHlPcmRlcmVkSW5Cb3hJbkJs
b2NrV2l0aERpZmZlcmVudERpcmVjdGlvbmFsaXR5KHdvcmRCcmVhaywgYm94LCBvZmZzZXRPZldv
cmRCcmVhaykpIHsKKyAgICBpZiAod29yZEJyZWFrICE9IHByZXZpb3VzV29yZEJyZWFrICYmIHBv
c2l0aW9uSXNWaXN1YWxseU9yZGVyZWRJbkJveEluQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9u
YWxpdHkod29yZEJyZWFrLCBvZmZzZXRPZldvcmRCcmVhaykpIHsKICAgICAgICAgaXNMYXN0V29y
ZEJyZWFrSW5Cb3ggPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIHdvcmRCcmVhazsKICAgICB9CiAg
ICAgCiAgICAgaXNMYXN0V29yZEJyZWFrSW5Cb3ggPSB0cnVlOwotICAgIHJldHVybiBsYXN0V29y
ZEJyZWFrSW5Cb3goYm94LCBvZmZzZXRPZldvcmRCcmVhayk7CisgICAgcmV0dXJuIGxhc3RXb3Jk
QnJlYWtJbkJveChvZmZzZXRPZldvcmRCcmVhayk7CiB9CiAKLXN0cnVjdCBXb3JkQm91bmRhcnlF
bnRyeSB7CitzdHJ1Y3QgVmlzdWFsV29yZEJyZWFrV2luZG93czo6V29yZEJvdW5kYXJ5RW50cnkg
ewogICAgIFdvcmRCb3VuZGFyeUVudHJ5KCkKLSAgICAgICAgOiBvZmZzZXRJbklubGluZUJveChp
bnZhbGlkT2Zmc2V0KSAKKyAgICAgICAgOiBvZmZzZXRJbklubGluZUJveChzX2ludmFsaWRPZmZz
ZXQpIAogICAgIHsgCiAgICAgfQogCkBAIC0xMzUzLDE3MSArMTQyNCwyMDggQEAgc3RydWN0IFdv
cmRCb3VuZGFyeUVudHJ5IHsKICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uOwog
ICAgIGludCBvZmZzZXRJbklubGluZUJveDsKIH07Ci0gICAgCi10eXBlZGVmIFZlY3RvcjxXb3Jk
Qm91bmRhcnlFbnRyeSwgNTA+IFdvcmRCb3VuZGFyeVZlY3RvcjsKLSAgICAKLXN0YXRpYyB2b2lk
IGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHko
Y29uc3QgSW5saW5lQm94KiBib3gsIFdvcmRCb3VuZGFyeVZlY3RvciYgb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzKQorCit2b2lkIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmNvbGxlY3RXb3JkQnJlYWtz
SW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoKQogewotICAgIG9yZGVyZWRX
b3JkQm91bmRhcmllcy5jbGVhcigpOworICAgIFdvcmRCb3VuZGFyeVZlY3Rvciogb3JkZXJlZFdv
cmRCb3VuZGFyaWVzID0gd29yZEJyZWFrcygpOworICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy0+
Y2xlYXIoKTsKICAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwotICAgIGludCBv
ZmZzZXRPZldvcmRCcmVhayA9IGludmFsaWRPZmZzZXQ7CisgICAgaW50IG9mZnNldE9mV29yZEJy
ZWFrID0gc19pbnZhbGlkT2Zmc2V0OwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHdvcmRCcmVh
ayA9IHByZXZpb3VzV29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxp
dHkoYm94LCB3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKKyAgICAgICAgd29yZEJyZWFr
ID0gcHJldmlvdXNXb3JkQnJlYWtJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rpb25hbGl0
eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKICAgICAgICAgaWYgKHdvcmRCcmVhay5p
c051bGwoKSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBXb3JkQm91bmRhcnlFbnRyeSB3
b3JkQm91bmRhcnlFbnRyeSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKLSAgICAgICAg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLmFwcGVuZCh3b3JkQm91bmRhcnlFbnRyeSk7CisgICAgICAg
IG9yZGVyZWRXb3JkQm91bmRhcmllcy0+YXBwZW5kKHdvcmRCb3VuZGFyeUVudHJ5KTsKICAgICB9
CiB9CiAKLXN0YXRpYyB2b2lkIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhE
aWZmZXJudERpcmVjdGlvbmFsaXR5KGNvbnN0IElubGluZUJveCogYm94LCBXb3JkQm91bmRhcnlW
ZWN0b3ImIG9yZGVyZWRXb3JkQm91bmRhcmllcykKK3ZvaWQgVmlzdWFsV29yZEJyZWFrV2luZG93
czo6Y29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aERpZmZlcm50RGlyZWN0aW9u
YWxpdHkoKQogewotICAgIG9yZGVyZWRXb3JkQm91bmRhcmllcy5jbGVhcigpOworICAgIFdvcmRC
b3VuZGFyeVZlY3Rvciogb3JkZXJlZFdvcmRCb3VuZGFyaWVzID0gd29yZEJyZWFrcygpOworICAg
IG9yZGVyZWRXb3JkQm91bmRhcmllcy0+Y2xlYXIoKTsKICAgICAKICAgICBWaXNpYmxlUG9zaXRp
b24gd29yZEJyZWFrOwotICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IGludmFsaWRPZmZzZXQ7
CisgICAgaW50IG9mZnNldE9mV29yZEJyZWFrID0gc19pbnZhbGlkT2Zmc2V0OwogICAgIGJvb2wg
aXNMYXN0V29yZEJyZWFrSW5Cb3ggPSBmYWxzZTsKICAgICB3aGlsZSAoMSkgewotICAgICAgICB3
b3JkQnJlYWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJl
Y3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0T2ZXb3JkQnJlYWssIGlzTGFzdFdvcmRC
cmVha0luQm94KTsKKyAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRCcmVha0luQm94SW5zaWRl
QmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBvZmZzZXRPZldvcmRC
cmVhaywgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOwogICAgICAgICBpZiAod29yZEJyZWFrLmlzTm90
TnVsbCgpKSB7CiAgICAgICAgICAgICBXb3JkQm91bmRhcnlFbnRyeSB3b3JkQm91bmRhcnlFbnRy
eSh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJyZWFrKTsKLSAgICAgICAgICAgIG9yZGVyZWRXb3Jk
Qm91bmRhcmllcy5hcHBlbmQod29yZEJvdW5kYXJ5RW50cnkpOworICAgICAgICAgICAgb3JkZXJl
ZFdvcmRCb3VuZGFyaWVzLT5hcHBlbmQod29yZEJvdW5kYXJ5RW50cnkpOwogICAgICAgICB9CiAg
ICAgICAgIGlmIChpc0xhc3RXb3JkQnJlYWtJbkJveCkKICAgICAgICAgICAgIGJyZWFrOwogICAg
IH0KIH0KIAotc3RhdGljIHZvaWQgY29sbGVjdFdvcmRCcmVha3NJbkJveChjb25zdCBJbmxpbmVC
b3gqIGJveCwgV29yZEJvdW5kYXJ5VmVjdG9yJiBvcmRlcmVkV29yZEJvdW5kYXJpZXMsIFRleHRE
aXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24pCit2b2lkIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmNv
bGxlY3RXb3JkQnJlYWtzSW5Cb3goKQogeworICAgIElubGluZUJveCogYm94ID0gaW5saW5lQm94
KCk7CisgICAgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbiA9IGVuY2xvc2luZ0Jsb2NrRGly
ZWN0aW9uKCk7CisKICAgICBpZiAoYm94LT5kaXJlY3Rpb24oKSA9PSBibG9ja0RpcmVjdGlvbikK
LSAgICAgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveEluc2lkZUJsb2NrV2l0aFNhbWVEaXJlY3Rp
b25hbGl0eShib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcyk7CisgICAgICAgIGNvbGxlY3RXb3Jk
QnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkoKTsKICAgICBlbHNl
Ci0gICAgICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3hJbnNpZGVCbG9ja1dpdGhEaWZmZXJudERp
cmVjdGlvbmFsaXR5KGJveCwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKTsgICAgICAgIAorICAgICAg
ICBjb2xsZWN0V29yZEJyZWFrc0luQm94SW5zaWRlQmxvY2tXaXRoRGlmZmVybnREaXJlY3Rpb25h
bGl0eSgpOyAgICAgICAgCiB9CiAgICAgCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHByZXZpb3Vz
V29yZEJvdW5kYXJ5SW5Cb3goY29uc3QgSW5saW5lQm94KiBib3gsIGludCBvZmZzZXQpCitWaXNp
YmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6cHJldmlvdXNXb3JkQm91bmRhcnlJ
bkJveCgpCiB7CisgICAgaW50IG9mZnNldCA9IG9mZnNldEluQmxvY2soKTsKKwogICAgIGludCBv
ZmZzZXRPZldvcmRCcmVhayA9IDA7CiAgICAgVmlzaWJsZVBvc2l0aW9uIHdvcmRCcmVhazsKICAg
ICB3aGlsZSAodHJ1ZSkgewotICAgICAgICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCcmVha0lu
Qm94SW5zaWRlQmxvY2tXaXRoU2FtZURpcmVjdGlvbmFsaXR5KGJveCwgd29yZEJyZWFrLCBvZmZz
ZXRPZldvcmRCcmVhayk7CisgICAgICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJyZWFrSW5C
b3hJbnNpZGVCbG9ja1dpdGhTYW1lRGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBvZmZzZXRPZldv
cmRCcmVhayk7CiAgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOdWxsKCkpCiAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgaWYgKG9mZnNldCA9PSBpbnZhbGlkT2Zmc2V0IHx8IG9mZnNldE9mV29y
ZEJyZWFrICE9IG9mZnNldCkKKyAgICAgICAgaWYgKG9mZnNldCA9PSBzX2ludmFsaWRPZmZzZXQg
fHwgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gb2Zmc2V0KQogICAgICAgICAgICAgcmV0dXJuIHdvcmRC
cmVhazsKICAgICB9ICAgICAgICAKICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CiB9CiAK
LXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbmV4dFdvcmRCb3VuZGFyeUluQm94KGNvbnN0IElubGlu
ZUJveCogYm94LCBpbnQgb2Zmc2V0KQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha1dp
bmRvd3M6Om5leHRXb3JkQm91bmRhcnlJbkJveCgpCiB7CisgICAgaW50IG9mZnNldCA9IG9mZnNl
dEluQmxvY2soKTsKKwogICAgIGludCBvZmZzZXRPZldvcmRCcmVhayA9IDA7CiAgICAgVmlzaWJs
ZVBvc2l0aW9uIHdvcmRCcmVhazsKICAgICBib29sIGlzTGFzdFdvcmRCcmVha0luQm94ID0gZmFs
c2U7CiAgICAgZG8gewotICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZEJyZWFrSW5Cb3hJbnNp
ZGVCbG9ja1dpdGhEaWZmZXJlbnREaXJlY3Rpb25hbGl0eShib3gsIHdvcmRCcmVhaywgb2Zmc2V0
T2ZXb3JkQnJlYWssIGlzTGFzdFdvcmRCcmVha0luQm94KTsKLSAgICAgICAgaWYgKHdvcmRCcmVh
ay5pc05vdE51bGwoKSAmJiAob2Zmc2V0ID09IGludmFsaWRPZmZzZXQgfHwgb2Zmc2V0T2ZXb3Jk
QnJlYWsgIT0gb2Zmc2V0KSkKKyAgICAgICAgd29yZEJyZWFrID0gbmV4dFdvcmRCcmVha0luQm94
SW5zaWRlQmxvY2tXaXRoRGlmZmVyZW50RGlyZWN0aW9uYWxpdHkod29yZEJyZWFrLCBvZmZzZXRP
ZldvcmRCcmVhaywgaXNMYXN0V29yZEJyZWFrSW5Cb3gpOworICAgICAgICBpZiAod29yZEJyZWFr
LmlzTm90TnVsbCgpICYmIChvZmZzZXQgPT0gc19pbnZhbGlkT2Zmc2V0IHx8IG9mZnNldE9mV29y
ZEJyZWFrICE9IG9mZnNldCkpCiAgICAgICAgICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIH0g
d2hpbGUgKCFpc0xhc3RXb3JkQnJlYWtJbkJveCk7ICAgICAgIAogICAgIHJldHVybiBWaXNpYmxl
UG9zaXRpb24oKTsKIH0KICAgICAKLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gdmlzdWFsbHlMYXN0
V29yZEJvdW5kYXJ5SW5Cb3goY29uc3QgSW5saW5lQm94KiBib3gsIGludCBvZmZzZXQsIFRleHRE
aXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24pCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFr
V2luZG93czo6dmlzdWFsbHlMYXN0V29yZEJvdW5kYXJ5SW5Cb3goKQogeworICAgIGludCBvZmZz
ZXQgPSBvZmZzZXRJbkJsb2NrKCk7CisKICAgICBXb3JkQm91bmRhcnlWZWN0b3Igb3JkZXJlZFdv
cmRCb3VuZGFyaWVzOwotICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goYm94LCBvcmRlcmVkV29y
ZEJvdW5kYXJpZXMsIGJsb2NrRGlyZWN0aW9uKTsKKyAgICBzZXRXb3JkQnJlYWtzKCZvcmRlcmVk
V29yZEJvdW5kYXJpZXMpOworICAgIGNvbGxlY3RXb3JkQnJlYWtzSW5Cb3goKTsKICAgICBpZiAo
IW9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkpIAogICAgICAgICByZXR1cm4gVmlzaWJsZVBv
c2l0aW9uKCk7Ci0gICAgaWYgKG9mZnNldCA9PSBpbnZhbGlkT2Zmc2V0IHx8IG9yZGVyZWRXb3Jk
Qm91bmRhcmllc1tvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMV0ub2Zmc2V0SW5Jbmxp
bmVCb3ggIT0gb2Zmc2V0KQorICAgIGlmIChvZmZzZXQgPT0gc19pbnZhbGlkT2Zmc2V0IHx8IG9y
ZGVyZWRXb3JkQm91bmRhcmllc1tvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpIC0gMV0ub2Zm
c2V0SW5JbmxpbmVCb3ggIT0gb2Zmc2V0KQogICAgICAgICByZXR1cm4gb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzW29yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAxXS52aXNpYmxlUG9zaXRpb247
CiAgICAgaWYgKG9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgPiAxKQogICAgICAgICByZXR1
cm4gb3JkZXJlZFdvcmRCb3VuZGFyaWVzW29yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAy
XS52aXNpYmxlUG9zaXRpb247CiAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOwogfQogICAg
ICAgICAKLXN0YXRpYyBpbnQgZ3JlYXRlc3RWYWx1ZVVuZGVyKGludCBvZmZzZXQsIGJvb2wgYm94
QW5kQmxvY2tBcmVJblNhbWVEaXJlY3Rpb24sIGNvbnN0IFdvcmRCb3VuZGFyeVZlY3RvciYgb3Jk
ZXJlZFdvcmRCb3VuZGFyaWVzKQoraW50IFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OmdyZWF0ZXN0
VmFsdWVVbmRlcigpCiB7Ci0gICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgpKQot
ICAgICAgICByZXR1cm4gaW52YWxpZE9mZnNldDsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGlu
ZUJveCgpOworICAgIGludCBvZmZzZXQgPSBvZmZzZXRJbkJsb2NrKCk7CisgICAgVGV4dERpcmVj
dGlvbiBibG9ja0RpcmVjdGlvbiA9IGVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKCk7CisgICAgV29y
ZEJvdW5kYXJ5VmVjdG9yKiBvcmRlcmVkV29yZEJvdW5kYXJpZXMgPSB3b3JkQnJlYWtzKCk7Cisg
ICAgYm9vbCBib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbiA9IGJveC0+ZGlyZWN0aW9uKCkg
PT0gYmxvY2tEaXJlY3Rpb247CisKKyAgICBpZiAoIW9yZGVyZWRXb3JkQm91bmRhcmllcy0+c2l6
ZSgpKQorICAgICAgICByZXR1cm4gc19pbnZhbGlkT2Zmc2V0OwogICAgIC8vIEZJWE1FOiBiaW5h
cnkgc2VhcmNoLgogICAgIGlmIChib3hBbmRCbG9ja0FyZUluU2FtZURpcmVjdGlvbikgewotICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNpemUo
KTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAob3JkZXJlZFdvcmRCb3VuZGFyaWVzW2ldLm9mZnNl
dEluSW5saW5lQm94IDwgb2Zmc2V0KQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
b3JkZXJlZFdvcmRCb3VuZGFyaWVzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCgq
b3JkZXJlZFdvcmRCb3VuZGFyaWVzKVtpXS5vZmZzZXRJbklubGluZUJveCA8IG9mZnNldCkKICAg
ICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52YWxp
ZE9mZnNldDsKKyAgICAgICAgcmV0dXJuIHNfaW52YWxpZE9mZnNldDsKICAgICB9Ci0gICAgZm9y
IChpbnQgaSA9IG9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkg
ewotICAgICAgICBpZiAob3JkZXJlZFdvcmRCb3VuZGFyaWVzW2ldLm9mZnNldEluSW5saW5lQm94
IDwgb2Zmc2V0KQorICAgIGZvciAoaW50IGkgPSBvcmRlcmVkV29yZEJvdW5kYXJpZXMtPnNpemUo
KSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGlmICgoKm9yZGVyZWRXb3JkQm91bmRhcmll
cylbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPCBvZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gaTsK
ICAgICB9Ci0gICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgcmV0dXJuIHNfaW52YWxpZE9m
ZnNldDsKIH0KIAotc3RhdGljIGludCBzbWFsbGVzdE9mZnNldEFib3ZlKGludCBvZmZzZXQsIGJv
b2wgYm94QW5kQmxvY2tBcmVJblNhbWVEaXJlY3Rpb24sIGNvbnN0IFdvcmRCb3VuZGFyeVZlY3Rv
ciYgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKQoraW50IFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnNt
YWxsZXN0T2Zmc2V0QWJvdmUoKQogewotICAgIGlmICghb3JkZXJlZFdvcmRCb3VuZGFyaWVzLnNp
emUoKSkKLSAgICAgICAgcmV0dXJuIGludmFsaWRPZmZzZXQ7CisgICAgSW5saW5lQm94KiBib3gg
PSBpbmxpbmVCb3goKTsKKyAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0SW5CbG9jaygpOworICAgIFRl
eHREaXJlY3Rpb24gYmxvY2tEaXJlY3Rpb24gPSBlbmNsb3NpbmdCbG9ja0RpcmVjdGlvbigpOwor
ICAgIFdvcmRCb3VuZGFyeVZlY3Rvciogb3JkZXJlZFdvcmRCb3VuZGFyaWVzID0gd29yZEJyZWFr
cygpOworICAgIGJvb2wgYm94QW5kQmxvY2tBcmVJblNhbWVEaXJlY3Rpb24gPSBib3gtPmRpcmVj
dGlvbigpID09IGJsb2NrRGlyZWN0aW9uOworCisgICAgaWYgKCFvcmRlcmVkV29yZEJvdW5kYXJp
ZXMtPnNpemUoKSkKKyAgICAgICAgcmV0dXJuIHNfaW52YWxpZE9mZnNldDsKICAgICAvLyBGSVhN
RTogYmluYXJ5IHNlYXJjaC4KICAgICBpZiAoYm94QW5kQmxvY2tBcmVJblNhbWVEaXJlY3Rpb24p
IHsKLSAgICAgICAgZm9yIChpbnQgaSA9IG9yZGVyZWRXb3JkQm91bmRhcmllcy5zaXplKCkgLSAx
OyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgaWYgKG9yZGVyZWRXb3JkQm91bmRhcmllc1tp
XS5vZmZzZXRJbklubGluZUJveCA+IG9mZnNldCkKKyAgICAgICAgZm9yIChpbnQgaSA9IG9yZGVy
ZWRXb3JkQm91bmRhcmllcy0+c2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAg
IGlmICgoKm9yZGVyZWRXb3JkQm91bmRhcmllcylbaV0ub2Zmc2V0SW5JbmxpbmVCb3ggPiBvZmZz
ZXQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJu
IGludmFsaWRPZmZzZXQ7CisgICAgICAgIHJldHVybiBzX2ludmFsaWRPZmZzZXQ7CiAgICAgfQot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvcmRlcmVkV29yZEJvdW5kYXJpZXMuc2l6ZSgp
OyArK2kpIHsKLSAgICAgICAgaWYgKG9yZGVyZWRXb3JkQm91bmRhcmllc1tpXS5vZmZzZXRJbklu
bGluZUJveCA+IG9mZnNldCkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb3JkZXJlZFdv
cmRCb3VuZGFyaWVzLT5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoKCpvcmRlcmVkV29yZEJv
dW5kYXJpZXMpW2ldLm9mZnNldEluSW5saW5lQm94ID4gb2Zmc2V0KQogICAgICAgICAgICAgcmV0
dXJuIGk7CiAgICAgfQotICAgIHJldHVybiBpbnZhbGlkT2Zmc2V0OworICAgIHJldHVybiBzX2lu
dmFsaWRPZmZzZXQ7CiB9CiAKLXN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbGVmdFdvcmRCb3VuZGFy
eShjb25zdCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCwgVGV4dERpcmVjdGlvbiBibG9ja0Rp
cmVjdGlvbikKK1Zpc2libGVQb3NpdGlvbiBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpsZWZ0V29y
ZEJvdW5kYXJ5KCkKIHsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworICAgIGlu
dCBvZmZzZXQgPSBvZmZzZXRJbkJsb2NrKCk7CisgICAgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVj
dGlvbiA9IGVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKCk7CisgICAgCiAgICAgVmlzaWJsZVBvc2l0
aW9uIHdvcmRCcmVhazsKLSAgICBmb3IgIChjb25zdCBJbmxpbmVCb3gqIGFkamFjZW50Qm94ID0g
Ym94OyBhZGphY2VudEJveDsgYWRqYWNlbnRCb3ggPSBhZGphY2VudEJveC0+cHJldkxlYWZDaGls
ZCgpKSB7CisgICAgZm9yIChJbmxpbmVCb3gqIGFkamFjZW50Qm94ID0gYm94OyBhZGphY2VudEJv
eDsgYWRqYWNlbnRCb3ggPSBhZGphY2VudEJveC0+cHJldkxlYWZDaGlsZCgpKSB7CisgICAgICAg
IHNldElubGluZUJveChhZGphY2VudEJveCk7CisgICAgICAgIHNldE9mZnNldEluQmxvY2soYWRq
YWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0IDogc19pbnZhbGlkT2Zmc2V0KTsKKyAgICAgICAgICAg
ICAgICAKICAgICAgICAgaWYgKGJsb2NrRGlyZWN0aW9uID09IExUUikgewogICAgICAgICAgICAg
aWYgKGFkamFjZW50Qm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIAotICAgICAgICAgICAg
ICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJvdW5kYXJ5SW5Cb3goYWRqYWNlbnRCb3gsIGFk
amFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IGludmFsaWRPZmZzZXQpOworICAgICAgICAgICAg
ICAgIHdvcmRCcmVhayA9IHByZXZpb3VzV29yZEJvdW5kYXJ5SW5Cb3goKTsKICAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0V29yZEJvdW5kYXJ5SW5Cb3go
YWRqYWNlbnRCb3gsIGFkamFjZW50Qm94ID09IGJveCA/IG9mZnNldCA6IGludmFsaWRPZmZzZXQp
OwotICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICB3b3JkQnJlYWsgPSB2aXN1YWxseUxhc3RX
b3JkQm91bmRhcnlJbkJveChhZGphY2VudEJveCwgYWRqYWNlbnRCb3ggPT0gYm94ID8gb2Zmc2V0
IDogaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOyAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIHdvcmRCcmVhayA9IG5leHRXb3JkQm91bmRhcnlJbkJveCgpOworICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgIHdvcmRCcmVhayA9IHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFyeUluQm94
KCk7ICAgICAgICAgICAgCiAgICAgICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkpCiAgICAg
ICAgICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIH0KICAgICByZXR1cm4gVmlzaWJsZVBvc2l0
aW9uKCk7CiB9CiAgCi1zdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZEJvdW5kYXJ5KGNv
bnN0IElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0LCBUZXh0RGlyZWN0aW9uIGJsb2NrRGlyZWN0
aW9uKQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnJpZ2h0V29yZEJv
dW5kYXJ5KCkKIHsKKyAgICBJbmxpbmVCb3gqIGJveCA9IGlubGluZUJveCgpOworICAgIGludCBv
ZmZzZXQgPSBvZmZzZXRJbkJsb2NrKCk7CisgICAgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlv
biA9IGVuY2xvc2luZ0Jsb2NrRGlyZWN0aW9uKCk7CiAgICAgCiAgICAgVmlzaWJsZVBvc2l0aW9u
IHdvcmRCcmVhazsKLSAgICBmb3IgKGNvbnN0IElubGluZUJveCogYWRqYWNlbnRCb3ggPSBib3g7
IGFkamFjZW50Qm94OyBhZGphY2VudEJveCA9IGFkamFjZW50Qm94LT5uZXh0TGVhZkNoaWxkKCkp
IHsKKyAgICBmb3IgKElubGluZUJveCogYWRqYWNlbnRCb3ggPSBib3g7IGFkamFjZW50Qm94OyBh
ZGphY2VudEJveCA9IGFkamFjZW50Qm94LT5uZXh0TGVhZkNoaWxkKCkpIHsKKyAgICAgICAgc2V0
SW5saW5lQm94KGFkamFjZW50Qm94KTsKKyAgICAgICAgc2V0T2Zmc2V0SW5CbG9jayhhZGphY2Vu
dEJveCA9PSBib3ggPyBvZmZzZXQgOiBzX2ludmFsaWRPZmZzZXQpOworICAgICAgICAKICAgICAg
ICAgaWYgKGJsb2NrRGlyZWN0aW9uID09IFJUTCkgewogICAgICAgICAgICAgaWYgKGFkamFjZW50
Qm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgd29yZEJyZWFr
ID0gbmV4dFdvcmRCb3VuZGFyeUluQm94KGFkamFjZW50Qm94LCBhZGphY2VudEJveCA9PSBib3gg
PyBvZmZzZXQgOiBpbnZhbGlkT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB3b3JkQnJlYWsgPSBu
ZXh0V29yZEJvdW5kYXJ5SW5Cb3goKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCb3VuZGFyeUluQm94KGFkamFjZW50Qm94LCBhZGph
Y2VudEJveCA9PSBib3ggPyBvZmZzZXQgOiBpbnZhbGlkT2Zmc2V0KTsKKyAgICAgICAgICAgICAg
ICB3b3JkQnJlYWsgPSBwcmV2aW91c1dvcmRCb3VuZGFyeUluQm94KCk7CiAgICAgICAgIH0gZWxz
ZSAKLSAgICAgICAgICAgIHdvcmRCcmVhayA9IHZpc3VhbGx5TGFzdFdvcmRCb3VuZGFyeUluQm94
KGFkamFjZW50Qm94LCBhZGphY2VudEJveCA9PSBib3ggPyBvZmZzZXQgOiBpbnZhbGlkT2Zmc2V0
LCBibG9ja0RpcmVjdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgICB3b3JkQnJlYWsgPSB2
aXN1YWxseUxhc3RXb3JkQm91bmRhcnlJbkJveCgpOyAgICAgICAgICAgIAogICAgICAgICBpZiAo
IXdvcmRCcmVhay5pc051bGwoKSkKICAgICAgICAgICAgIHJldHVybiB3b3JkQnJlYWs7CiAgICAg
fQogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKIH0KICAgICAKLXN0YXRpYyBib29sIHBv
c2l0aW9uSXNJbnNpZGVCb3goY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB3b3JkQnJlYWssIGNvbnN0
IElubGluZUJveCogYm94KQorYm9vbCBWaXN1YWxXb3JkQnJlYWtXaW5kb3dzOjpwb3NpdGlvbklz
SW5zaWRlQm94KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgd29yZEJyZWFrKQogeworICAgIElubGlu
ZUJveCogYm94ID0gaW5saW5lQm94KCk7CisKICAgICBpbnQgb2Zmc2V0T2ZXb3JkQnJlYWs7Ci0g
ICAgcmV0dXJuIHBvc2l0aW9uSXNJbkJveCh3b3JkQnJlYWssIGJveCwgb2Zmc2V0T2ZXb3JkQnJl
YWspCisgICAgcmV0dXJuIHBvc2l0aW9uSXNJbkJveCh3b3JkQnJlYWssIG9mZnNldE9mV29yZEJy
ZWFrKQogICAgICAgICAmJiBvZmZzZXRPZldvcmRCcmVhayAhPSBib3gtPmNhcmV0TWF4T2Zmc2V0
KCkgJiYgb2Zmc2V0T2ZXb3JkQnJlYWsgIT0gYm94LT5jYXJldE1pbk9mZnNldCgpOwogfQogCi1z
dGF0aWMgVmlzaWJsZVBvc2l0aW9uIGxlZnRXb3JkUG9zaXRpb25BY3Jvc3NCb3VuZGFyeShjb25z
dCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK1Zpc2libGVQb3NpdGlvbiBWaXN1
YWxXb3JkQnJlYWtXaW5kb3dzOjpsZWZ0V29yZFBvc2l0aW9uQWNyb3NzQm91bmRhcnkoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24pCiB7CiAgICAgSW5saW5lQm94KiBib3g7
CiAgICAgaW50IG9mZnNldDsKQEAgLTE1MjgsMTQgKzE2MzYsMjAgQEAgc3RhdGljIFZpc2libGVQ
b3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uQQogCiAgICAgVGV4dERpcmVjdGlvbiBibG9ja0RpcmVj
dGlvbiA9IGRpcmVjdGlvbk9mRW5jbG9zaW5nQmxvY2sodmlzaWJsZVBvc2l0aW9uLmRlZXBFcXVp
dmFsZW50KCkpOwogICAgIAorICAgIHNldElubGluZUJveChib3gpOworICAgIHNldE9mZnNldElu
QmxvY2sob2Zmc2V0KTsKKyAgICBzZXRFbmNsb3NpbmdCbG9ja0RpcmVjdGlvbihibG9ja0RpcmVj
dGlvbik7CisgICAgCiAgICAgLy8gRklYTUU6IElmIHRoZSBib3gncyBkaXJlY3Rpb25hbGl0eSBp
cyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBlbmNsb3NpbmcgYmxvY2ssIHdoZW4gdGhlIG9mZnNl
dCBpcyBhdCB0aGUgYm94IGJvdW5kYXJ5CiAgICAgLy8gYW5kIHRoZSBkaXJlY3Rpb24gaXMgdG93
YXJkcyBpbnNpZGUgdGhlIGJveCwgZG8gSSBzdGlsbCBuZWVkIHRvIG1ha2UgaXQgYSBzcGVjaWFs
IGNhc2U/IEZvciBleGFtcGxlLCBhIExUUiBib3ggaW5zaWRlIGEgTFRSIGJsb2NrLAogICAgIC8v
IHdoZW4gb2Zmc2V0IGlzIGF0IGJveCdzIGNhcmV0TWluT2Zmc2V0IGFuZCB0aGUgZGlyZWN0aW9u
IGlzIERpcmVjdGlvblJpZ2h0LCBzaG91bGQgaXQgYmUgdGFrZW4gY2FyZSBhcyBhIGdlbmVyYWwg
Y2FzZT8KLSAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKQotICAg
ICAgICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeShib3gtPnByZXZMZWFmQ2hpbGQoKSwgaW52YWxp
ZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOworICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldExl
ZnRtb3N0T2Zmc2V0KCkpIHsKKyAgICAgICAgc2V0SW5saW5lQm94KGJveC0+cHJldkxlYWZDaGls
ZCgpKTsKKyAgICAgICAgc2V0T2Zmc2V0SW5CbG9jayhzX2ludmFsaWRPZmZzZXQpOworICAgICAg
ICByZXR1cm4gbGVmdFdvcmRCb3VuZGFyeSgpOworICAgIH0KICAgICBpZiAob2Zmc2V0ID09IGJv
eC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKLSAgICAgICAgcmV0dXJuIGxlZnRXb3JkQm91bmRh
cnkoYm94LCBvZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKLSAgICAKKyAgICAgICAgcmV0dXJuIGxl
ZnRXb3JkQm91bmRhcnkoKTsKICAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwog
ICAgIGlmIChibG9ja0RpcmVjdGlvbiA9PSBMVFIpIHsKQEAgLTE1NDQsMjEgKzE2NTgsMjQgQEAg
c3RhdGljIFZpc2libGVQb3NpdGlvbiBsZWZ0V29yZFBvc2l0aW9uQQogICAgICAgICBlbHNlCiAg
ICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0Qm91bmRhcnkodmlzaWJsZVBvc2l0aW9uLCBuZXh0
V29yZFBvc2l0aW9uQm91bmRhcnkpOwogICAgIH0KLSAgICBpZiAod29yZEJyZWFrLmlzTm90TnVs
bCgpICYmIHBvc2l0aW9uSXNJbnNpZGVCb3god29yZEJyZWFrLCBib3gpKQorICAgIGlmICh3b3Jk
QnJlYWsuaXNOb3ROdWxsKCkgJiYgcG9zaXRpb25Jc0luc2lkZUJveCh3b3JkQnJlYWspKQogICAg
ICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIAogICAgIFdvcmRCb3VuZGFyeVZlY3RvciBvcmRl
cmVkV29yZEJvdW5kYXJpZXM7Ci0gICAgY29sbGVjdFdvcmRCcmVha3NJbkJveChib3gsIG9yZGVy
ZWRXb3JkQm91bmRhcmllcywgYmxvY2tEaXJlY3Rpb24pOworICAgIHNldFdvcmRCcmVha3MoJm9y
ZGVyZWRXb3JkQm91bmRhcmllcyk7CisgICAgY29sbGVjdFdvcmRCcmVha3NJbkJveCgpOwogCi0g
ICAgaW50IGluZGV4ID0gYm94LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBncmVhdGVzdFZh
bHVlVW5kZXIob2Zmc2V0LCBibG9ja0RpcmVjdGlvbiA9PSBMVFIsIG9yZGVyZWRXb3JkQm91bmRh
cmllcykgOgotICAgICAgICBzbWFsbGVzdE9mZnNldEFib3ZlKG9mZnNldCwgYmxvY2tEaXJlY3Rp
b24gPT0gUlRMLCBvcmRlcmVkV29yZEJvdW5kYXJpZXMpOwotICAgIGlmIChpbmRleCAhPSBpbnZh
bGlkT2Zmc2V0KQorICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
ID8gZ3JlYXRlc3RWYWx1ZVVuZGVyKCkgOgorICAgICAgICBzbWFsbGVzdE9mZnNldEFib3ZlKCk7
CisgICAgaWYgKGluZGV4ICE9IHNfaW52YWxpZE9mZnNldCkKICAgICAgICAgcmV0dXJuIG9yZGVy
ZWRXb3JkQm91bmRhcmllc1tpbmRleF0udmlzaWJsZVBvc2l0aW9uOwogICAgIAotICAgIHJldHVy
biBsZWZ0V29yZEJvdW5kYXJ5KGJveC0+cHJldkxlYWZDaGlsZCgpLCBpbnZhbGlkT2Zmc2V0LCBi
bG9ja0RpcmVjdGlvbik7CisgICAgc2V0SW5saW5lQm94KGJveC0+cHJldkxlYWZDaGlsZCgpKTsK
KyAgICBzZXRPZmZzZXRJbkJsb2NrKHNfaW52YWxpZE9mZnNldCk7CisgICAgcmV0dXJuIGxlZnRX
b3JkQm91bmRhcnkoKTsKIH0KIAotc3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3Np
dGlvbkFjcm9zc0JvdW5kYXJ5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9u
KQorVmlzaWJsZVBvc2l0aW9uIFZpc3VhbFdvcmRCcmVha1dpbmRvd3M6OnJpZ2h0V29yZFBvc2l0
aW9uQWNyb3NzQm91bmRhcnkoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24p
CiB7CiAgICAgSW5saW5lQm94KiBib3g7CiAgICAgaW50IG9mZnNldDsKQEAgLTE1NjksMTAgKzE2
ODYsMTcgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3NpdGlvbgogCiAgICAg
VGV4dERpcmVjdGlvbiBibG9ja0RpcmVjdGlvbiA9IGRpcmVjdGlvbk9mRW5jbG9zaW5nQmxvY2so
dmlzaWJsZVBvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkpOwogICAgIAorICAgIHNldElubGluZUJv
eChib3gpOworICAgIHNldE9mZnNldEluQmxvY2sob2Zmc2V0KTsKKyAgICBzZXRFbmNsb3NpbmdC
bG9ja0RpcmVjdGlvbihibG9ja0RpcmVjdGlvbik7CisgICAgCiAgICAgaWYgKG9mZnNldCA9PSBi
b3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkKLSAgICAgICAgcmV0dXJuIHJpZ2h0V29yZEJvdW5k
YXJ5KGJveCwgb2Zmc2V0LCBibG9ja0RpcmVjdGlvbik7Ci0gICAgaWYgKG9mZnNldCA9PSBib3gt
PmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkpCi0gICAgICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFy
eShib3gtPm5leHRMZWFmQ2hpbGQoKSwgaW52YWxpZE9mZnNldCwgYmxvY2tEaXJlY3Rpb24pOwor
ICAgICAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoKTsKKyAgICBpZiAob2Zmc2V0ID09IGJv
eC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkgeworICAgICAgICBzZXRJbmxpbmVCb3goYm94LT5u
ZXh0TGVhZkNoaWxkKCkpOworICAgICAgICBzZXRPZmZzZXRJbkJsb2NrKHNfaW52YWxpZE9mZnNl
dCk7CisgICAgICAgIHJldHVybiByaWdodFdvcmRCb3VuZGFyeSgpOworICAgIH0KICAKICAgICBW
aXNpYmxlUG9zaXRpb24gd29yZEJyZWFrOwogICAgIGlmIChibG9ja0RpcmVjdGlvbiA9PSBSVEwp
IHsKQEAgLTE1ODEsMjEgKzE3MDUsMjQgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiByaWdodFdv
cmRQb3NpdGlvbgogICAgICAgICBlbHNlCiAgICAgICAgICAgICB3b3JkQnJlYWsgPSBuZXh0Qm91
bmRhcnkodmlzaWJsZVBvc2l0aW9uLCBuZXh0V29yZFBvc2l0aW9uQm91bmRhcnkpOwogICAgIH0K
LSAgICBpZiAod29yZEJyZWFrLmlzTm90TnVsbCgpICYmIHBvc2l0aW9uSXNJbnNpZGVCb3god29y
ZEJyZWFrLCBib3gpKQorICAgIGlmICh3b3JkQnJlYWsuaXNOb3ROdWxsKCkgJiYgcG9zaXRpb25J
c0luc2lkZUJveCh3b3JkQnJlYWspKQogICAgICAgICByZXR1cm4gd29yZEJyZWFrOwogICAgIAog
ICAgIFdvcmRCb3VuZGFyeVZlY3RvciBvcmRlcmVkV29yZEJvdW5kYXJpZXM7Ci0gICAgY29sbGVj
dFdvcmRCcmVha3NJbkJveChib3gsIG9yZGVyZWRXb3JkQm91bmRhcmllcywgYmxvY2tEaXJlY3Rp
b24pOworICAgIHNldFdvcmRCcmVha3MoJm9yZGVyZWRXb3JkQm91bmRhcmllcyk7CisgICAgY29s
bGVjdFdvcmRCcmVha3NJbkJveCgpOwogICAgIAotICAgIGludCBpbmRleCA9IGJveC0+aXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpID8gc21hbGxlc3RPZmZzZXRBYm92ZShvZmZzZXQsIGJsb2NrRGly
ZWN0aW9uID09IExUUiwgb3JkZXJlZFdvcmRCb3VuZGFyaWVzKSA6Ci0gICAgICAgIGdyZWF0ZXN0
VmFsdWVVbmRlcihvZmZzZXQsIGJsb2NrRGlyZWN0aW9uID09IFJUTCwgb3JkZXJlZFdvcmRCb3Vu
ZGFyaWVzKTsKLSAgICBpZiAoaW5kZXggIT0gaW52YWxpZE9mZnNldCkKKyAgICBpbnQgaW5kZXgg
PSBib3gtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IHNtYWxsZXN0T2Zmc2V0QWJvdmUoKSA6
CisgICAgICAgIGdyZWF0ZXN0VmFsdWVVbmRlcigpOworICAgIGlmIChpbmRleCAhPSBzX2ludmFs
aWRPZmZzZXQpCiAgICAgICAgIHJldHVybiBvcmRlcmVkV29yZEJvdW5kYXJpZXNbaW5kZXhdLnZp
c2libGVQb3NpdGlvbjsKICAgICAKLSAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoYm94LT5u
ZXh0TGVhZkNoaWxkKCksIGludmFsaWRPZmZzZXQsIGJsb2NrRGlyZWN0aW9uKTsKKyAgICBzZXRJ
bmxpbmVCb3goYm94LT5uZXh0TGVhZkNoaWxkKCkpOworICAgIHNldE9mZnNldEluQmxvY2soc19p
bnZhbGlkT2Zmc2V0KTsKKyAgICByZXR1cm4gcmlnaHRXb3JkQm91bmRhcnkoKTsKIH0KIAotVmlz
aWJsZVBvc2l0aW9uIGxlZnRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNp
YmxlUG9zaXRpb24pCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6bGVm
dFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKIHsK
ICAgICBpZiAodmlzaWJsZVBvc2l0aW9uLmlzTnVsbCgpKQogICAgICAgICByZXR1cm4gVmlzaWJs
ZVBvc2l0aW9uKCk7CkBAIC0xNjA0LDcgKzE3MzEsNyBAQCBWaXNpYmxlUG9zaXRpb24gbGVmdFdv
cmRQb3NpdGlvbihjb25zdCBWCiAgICAgcmV0dXJuIHZpc2libGVQb3NpdGlvbi5ob25vckVkaXRh
YmxlQm91bmRhcnlBdE9yQmVmb3JlKGxlZnRXb3JkQnJlYWspOwogfQogCi1WaXNpYmxlUG9zaXRp
b24gcmlnaHRXb3JkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRp
b24pCitWaXNpYmxlUG9zaXRpb24gVmlzdWFsV29yZEJyZWFrV2luZG93czo6cmlnaHRXb3JkUG9z
aXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRpb24pCiB7CiAgICAgaWYg
KHZpc2libGVQb3NpdGlvbi5pc051bGwoKSkKICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlv
bigpOwpAQCAtMTYxMyw0ICsxNzQwLDE0IEBAIFZpc2libGVQb3NpdGlvbiByaWdodFdvcmRQb3Np
dGlvbihjb25zdCAKICAgICByZXR1cm4gdmlzaWJsZVBvc2l0aW9uLmhvbm9yRWRpdGFibGVCb3Vu
ZGFyeUF0T3JCZWZvcmUocmlnaHRXb3JkQnJlYWspOwogfQogCitWaXNpYmxlUG9zaXRpb24gbGVm
dFdvcmRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvbikKK3sK
KyAgICByZXR1cm4gVmlzdWFsV29yZEJyZWFrV2luZG93cygpLmxlZnRXb3JkUG9zaXRpb24odmlz
aWJsZVBvc2l0aW9uKTsKK30KKworVmlzaWJsZVBvc2l0aW9uIHJpZ2h0V29yZFBvc2l0aW9uKGNv
bnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0aW9uKQoreworICAgIHJldHVybiBWaXN1
YWxXb3JkQnJlYWtXaW5kb3dzKCkucmlnaHRXb3JkUG9zaXRpb24odmlzaWJsZVBvc2l0aW9uKTsK
K30KKwogfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>