<?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>122512</bug_id>
          
          <creation_ts>2013-10-08 10:20:52 -0700</creation_ts>
          <short_desc>Move m_floatingObjects to RenderBlockFlow from RenderBlock</short_desc>
          <delta_ts>2013-10-08 16:19:16 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Bem Jones-Bey">bjonesbe</reporter>
          <assigned_to name="Bem Jones-Bey">bjonesbe</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>WebkitBugTracker</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>937576</commentid>
    <comment_count>0</comment_count>
    <who name="Bem Jones-Bey">bjonesbe</who>
    <bug_when>2013-10-08 10:20:52 -0700</bug_when>
    <thetext>Move m_floatingObjects to RenderBlockFlow from RenderBlock</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937580</commentid>
    <comment_count>1</comment_count>
      <attachid>213698</attachid>
    <who name="Bem Jones-Bey">bjonesbe</who>
    <bug_when>2013-10-08 10:24:30 -0700</bug_when>
    <thetext>Created attachment 213698
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937613</commentid>
    <comment_count>2</comment_count>
      <attachid>213698</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-10-08 12:01:46 -0700</bug_when>
    <thetext>Comment on attachment 213698
Patch

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

A number of methods have become virtual, but the virtualization is clearly temporary. In some cases the virtualization only exists because methods haven&apos;t moved yet. deleteLineBoxTree is a great example. I have it virtualized in my own patch as well, but I marked it as temporary with a FIXME, because all of the callers are ultimately going to be in RenderBlockFlow too. Some of your virtualizing is similar, e.g., the logical offset for line functions (which obviously will only be in RenderBlockFlow once lines are there too).

So basically, I&apos;m fine with virtualizing, but I think nearly all of your virtualizations are temporary and should be marked with FIXMEs so we know to how to clean up RenderBlock once lines also move.

&gt; Source/WebCore/rendering/RenderBlock.h:512
&gt; +    virtual void addOverflowFromFloats() { };

Seems like this is fully moved to RenderBlockFlow, so you could just yank it from RenderBlock and make RenderBlockFlow&apos;s non-virtual?

&gt; Source/WebCore/rendering/RenderBlock.h:551
&gt; -    void moveAllChildrenIncludingFloatsTo(RenderBlock* toBlock, bool fullRemoveInsert);
&gt; +    virtual void moveAllChildrenOnRemovalTo(RenderBlock* toBlock, bool fullRemoveInsert) { moveAllChildrenTo(toBlock, fullRemoveInsert); }

I don&apos;t see any reason to rename this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937655</commentid>
    <comment_count>3</comment_count>
    <who name="Bem Jones-Bey">bjonesbe</who>
    <bug_when>2013-10-08 13:35:17 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 213698 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=213698&amp;action=review
&gt; 
&gt; A number of methods have become virtual, but the virtualization is clearly temporary. In some cases the virtualization only exists because methods haven&apos;t moved yet. deleteLineBoxTree is a great example. I have it virtualized in my own patch as well, but I marked it as temporary with a FIXME, because all of the callers are ultimately going to be in RenderBlockFlow too. Some of your virtualizing is similar, e.g., the logical offset for line functions (which obviously will only be in RenderBlockFlow once lines are there too).
&gt; 
&gt; So basically, I&apos;m fine with virtualizing, but I think nearly all of your virtualizations are temporary and should be marked with FIXMEs so we know to how to clean up RenderBlock once lines also move.

The only ones I didn&apos;t add the FIXMEs to are computeOverflow and adjustForBorderFit. Does that jibe with what you expect?

&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlock.h:512
&gt; &gt; +    virtual void addOverflowFromFloats() { };
&gt; 
&gt; Seems like this is fully moved to RenderBlockFlow, so you could just yank it from RenderBlock and make RenderBlockFlow&apos;s non-virtual?

Yup. Must have forgotten to remove that.

&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlock.h:551
&gt; &gt; -    void moveAllChildrenIncludingFloatsTo(RenderBlock* toBlock, bool fullRemoveInsert);
&gt; &gt; +    virtual void moveAllChildrenOnRemovalTo(RenderBlock* toBlock, bool fullRemoveInsert) { moveAllChildrenTo(toBlock, fullRemoveInsert); }
&gt; 
&gt; I don&apos;t see any reason to rename this.

Ok, I&apos;ve put the name back.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937656</commentid>
    <comment_count>4</comment_count>
      <attachid>213713</attachid>
    <who name="Bem Jones-Bey">bjonesbe</who>
    <bug_when>2013-10-08 13:37:52 -0700</bug_when>
    <thetext>Created attachment 213713
Patch

Update for review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937690</commentid>
    <comment_count>5</comment_count>
      <attachid>213713</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-10-08 14:50:08 -0700</bug_when>
    <thetext>Comment on attachment 213713
Patch

r=me. Note the patch doesn&apos;t apply, so make sure you run layout tests, etc. on tip of tree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937703</commentid>
    <comment_count>6</comment_count>
      <attachid>213726</attachid>
    <who name="Bem Jones-Bey">bjonesbe</who>
    <bug_when>2013-10-08 15:21:35 -0700</bug_when>
    <thetext>Created attachment 213726
Patch

Rebase</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937722</commentid>
    <comment_count>7</comment_count>
      <attachid>213726</attachid>
    <who name="Bem Jones-Bey">bjonesbe</who>
    <bug_when>2013-10-08 15:54:11 -0700</bug_when>
    <thetext>Comment on attachment 213726
Patch

ran all tests, looks good on the EWS, passing off to CQ.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937744</commentid>
    <comment_count>8</comment_count>
      <attachid>213726</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-10-08 16:19:14 -0700</bug_when>
    <thetext>Comment on attachment 213726
Patch

Clearing flags on attachment: 213726

Committed r157144: &lt;http://trac.webkit.org/changeset/157144&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>937745</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-10-08 16:19:16 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>213698</attachid>
            <date>2013-10-08 10:24:30 -0700</date>
            <delta_ts>2013-10-08 13:37:50 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-122512-20131008102430.patch</filename>
            <type>text/plain</type>
            <size>157984</size>
            <attacher name="Bem Jones-Bey">bjonesbe</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU3MTA4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOWRkNWViY2FhYjdjZWI2
OWU3MTIyY2EyZjNiYjE0MDAzZDMyOTdkNS4uYjRkZTVkYzA3MGRhOTBiMzk5NzEwMGE1YTQ2MDg2
NjNjODhlYTY2NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEyNyBAQAorMjAxMy0xMC0wOCAgQmVt
IEpvbmVzLUJleSAgPGJqb25lc2JlQGFkb2JlLmNvbT4KKworICAgICAgICBNb3ZlIG1fZmxvYXRp
bmdPYmplY3RzIHRvIFJlbmRlckJsb2NrRmxvdyBmcm9tIFJlbmRlckJsb2NrCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjI1MTIKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBGbG9hdHMgYXJlIHBhcnQgb2Yg
YmxvY2sgZmxvdywgbm90IGV2ZXJ5IFJlbmRlckJsb2NrIGNhbiBjb250YWluCisgICAgICAgIGZs
b2Fycy4gVGhpcyBjaGFuZ2UgbWFrZXMgaXQgc28gdGhhdCBSZW5kZXJCbG9jayBubyBsb25nZXIg
Y2FuIGNvbnRhaW4KKyAgICAgICAgZmxvYXRzLCBvbmx5IFJlbmRlckJsb2NrRmxvdyBjYW4uCisK
KyAgICAgICAgVGhpcyBhbHNvIG1vdmVzIGEgYnVuY2ggb2YgbGluZSBsYXlvdXQgc3R1ZmYgb3Zl
ciB0byBSZW5kZXJCbG9ja0Zsb3csCisgICAgICAgIGJ1dCBtYWtlcyBubyBlZmZvcnQgdG8gbW92
ZSBhbGwgb2YgbGluZSBsYXlvdXQsIGFzIGFsbCBvZiB0aGF0IGlzCisgICAgICAgIGRlc3RpbmVk
IHRvIG1vdmUgb3V0IG9mIGJvdGggUmVuZGVyQmxvY2tGbG93IGFuZCBSZW5kZXJCbG9jayBpbnRv
IGl0cworICAgICAgICBvd24gY2xhc3MuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBubyBiZWhh
dmlvciBjaGFuZ2UuCisKKyAgICAgICAgKiByZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaDoKKyAg
ICAgICAgKFdlYkNvcmU6OklubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuKToKKyAgICAgICAg
KiByZW5kZXJpbmcvTGluZVdpZHRoLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVXaWR0aDo6
TGluZVdpZHRoKToKKyAgICAgICAgKiByZW5kZXJpbmcvTGluZVdpZHRoLmg6CisgICAgICAgICog
cmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
OjpzdHlsZVdpbGxDaGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnN0eWxl
RGlkQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzcGxpdEZsb3cpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmRlbGV0ZUxpbmVCb3hUcmVlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9jazo6Y29tcHV0ZU92ZXJmbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpzZWxlY3Rpb25HYXBzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjph
ZGp1c3RGb3JCb3JkZXJGaXQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmNvbnRhaW5zRmxvYXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzaG91bGRTa2lwQ3JlYXRpbmdSdW5zRm9yT2JqZWN0KToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21GbG9hdHMpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9y
TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6bG9naWNhbExlZnRGbG9hdE9m
ZnNldEZvckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6Om1vdmVBbGxDaGls
ZHJlbk9uUmVtb3ZhbFRvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpwYWludEZs
b2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6aGl0VGVzdEZsb2F0cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6Y2xpcE91dEZsb2F0aW5nT2JqZWN0cyk6Cisg
ICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6bGF5b3V0QmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpsYXlvdXRCbG9ja0NoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6Y29sbGFwc2VNYXJnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
Y2xlYXJGbG9hdHNJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OmFkanVzdEJsb2NrQ2hpbGRGb3JQYWdpbmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6Y29udGFpbnNGbG9hdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OnN0eWxlRGlkQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6c3R5bGVXaWxsQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
ZGVsZXRlTGluZUJveFRyZWUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpt
b3ZlQWxsQ2hpbGRyZW5PblJlbW92YWxUbyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmFkZE92ZXJmbG93RnJvbUZsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OmNvbXB1dGVPdmVyZmxvdyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OnJlcGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OnBhaW50RmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6Y2xpcE91dEZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OmNyZWF0ZUZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OnJlbW92ZUZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Omluc2VydEZsb2F0aW5nT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6cmVtb3ZlRmxvYXRpbmdPYmplY3QpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9h
dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bmV3TGluZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5l
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bG9naWNhbFJpZ2h0RmxvYXRP
ZmZzZXRGb3JMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bmV4dEZs
b2F0TG9naWNhbEJvdHRvbUJlbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6YWRkT3ZlcmhhbmdpbmdGbG9hdHMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpoYXNPdmVyaGFuZ2luZ0Zsb2F0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6YWRkSW50cnVkaW5nRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JM
YXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpnZXRDbGVhckRlbHRh
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6aGl0VGVzdEZsb2F0cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZvckJvcmRlckZpdCk6Cisg
ICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjpoYXNPdmVyaGFuZ2luZ0Zsb2F0cyk6CisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJl
YWtlcjo6TGluZUJyZWFrZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojph
cHBlbmRSdW5zRm9yT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
Y3JlYXRlTGluZUJveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29u
c3RydWN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnNldE1hcmdp
bnNGb3JSdWJ5UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3Np
dGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5l
RGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRp
b25zRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpzZXRTdGF0aWNQb3NpdGlvbnMpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9M
YXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpjb25zdHJ1Y3RCaWRpUnVuc0ZvckxpbmUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlk
aVJ1bnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5k
RmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6cmVzdGFydExheW91
dFJ1bnNBbmRGbG9hdHNJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OnB1c2hTaGFwZUNvbnRl
bnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJy
ZW50TGluZUluRmxvd1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OmFkanVzdExvZ2ljYWxMaW5lVG9wQW5kTG9naWNhbEhlaWdodElmTmVlZGVkKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpyZXBhaW50RGlydHlGbG9hdHMp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVja0Zsb2F0c0luQ2xlYW5M
aW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lU3RhcnRQ
b3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZUVu
ZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y2hlY2tQYWdp
bmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6bWF0Y2hlZEVuZExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkU2tpcFdoaXRl
c3BhY2VBZnRlclN0YXJ0T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRz
Rm9yU2hhcGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxs
aXBzaXNMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVj
a0xpbmVzRm9yVGV4dE92ZXJmbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJv
eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCb3g6Om91dGVybW9zdEJsb2NrQ29udGFp
bmluZ0Zsb2F0aW5nT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJveDo6cmVtb3Zl
RmxvYXRpbmdPclBvc2l0aW9uZWRDaGlsZEZyb21CbG9ja0xpc3RzKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyQm94Lmg6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2Jq
ZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJveE1vZGVsT2JqZWN0Ojptb3ZlQ2hp
bGRyZW5Ubyk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJJbmxpbmU6OnNwbGl0Rmxvdyk6CisKIDIwMTMtMTAtMDggIEh1cm5q
b28gTGVlICA8aHVybmpvby5sZWVAc2Ftc3VuZy5jb20+CiAKICAgICAgICAgQ29tcG9zaXRlZCBs
YXllciB0aGF0IHBhaW50ZWQgaW50byBjb21wb3NpdGVkIGFuY2VzdG9yIGlzIG5vdCByZXBhaW50
ZWQgYWZ0ZXIgbW92aW5nCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5s
aW5lSXRlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5o
CmluZGV4IDg0ZjE2ZDRlN2NhYTIyNTc0MWQwZDg1Y2E5NDg0ZDg5YjIxMjVmMWEuLjhlYmFlNTNi
MTRhOThiMzgwYjFjZDNkZGRkNmY2NzQ2NjkxY2JmZWQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9JbmxpbmVJdGVyYXRvci5oCkBAIC0yNCw3ICsyNCw3IEBACiAjZGVmaW5lIElubGluZUl0
ZXJhdG9yX2gKIAogI2luY2x1ZGUgIkJpZGlSdW4uaCIKLSNpbmNsdWRlICJSZW5kZXJCbG9jay5o
IgorI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgogI2luY2x1ZGUgIlJlbmRlcklubGluZS5o
IgogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+
CkBAIC01MjEsNyArNTIxLDcgQEAgaW5saW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjphcHBl
bmRSdW4oKQogICAgICAgICAgICAgaWYgKGlzb2xhdGVUcmFja2VyLmluSXNvbGF0ZSgpKQogICAg
ICAgICAgICAgICAgIGlzb2xhdGVUcmFja2VyLmFkZEZha2VSdW5JZk5lY2Vzc2FyeShvYmosIHN0
YXJ0LCAqdGhpcyk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUmVuZGVyQmxv
Y2s6OmFwcGVuZFJ1bnNGb3JPYmplY3QobV9ydW5zLCBzdGFydCwgb2JqLT5sZW5ndGgoKSwgb2Jq
LCAqdGhpcyk7CisgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9y
T2JqZWN0KG1fcnVucywgc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOwogICAgICAg
ICAgICAgLy8gRklYTUU6IHN0YXJ0L29iaiBzaG91bGQgYmUgYW4gSW5saW5lSXRlcmF0b3IgaW5z
dGVhZCBvZiB0d28gc2VwYXJhdGUgdmFyaWFibGVzLgogICAgICAgICAgICAgc3RhcnQgPSAwOwog
ICAgICAgICAgICAgb2JqID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX3Nvci5yb290
KCksIG9iaiwgJmlzb2xhdGVUcmFja2VyKTsKQEAgLTUzNyw3ICs1MzcsNyBAQCBpbmxpbmUgdm9p
ZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmFwcGVuZFJ1bigpCiAgICAgICAgICAgICBpZiAoaXNvbGF0
ZVRyYWNrZXIuaW5Jc29sYXRlKCkpCiAgICAgICAgICAgICAgICAgaXNvbGF0ZVRyYWNrZXIuYWRk
RmFrZVJ1bklmTmVjZXNzYXJ5KG9iaiwgc3RhcnQsICp0aGlzKTsKICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICBSZW5kZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChtX3J1bnMs
IHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOworICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrRmxv
dzo6YXBwZW5kUnVuc0Zvck9iamVjdChtX3J1bnMsIHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOwog
ICAgICAgICB9CiAKICAgICAgICAgbV9lb3IuaW5jcmVtZW50KCk7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZVdpZHRoLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9MaW5lV2lkdGguY3BwCmluZGV4IDgwYTdhYzY2YjE5YTU5ODZkNGIzZjMxYjAxNjU2ODI1
OTg5Zjk4MjMuLmZkY2VhN2JhYWQyOWFlYzgwMjhkYWRmOWJiMjg5ZTkyY2FhN2RjZTMgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguY3BwCkBAIC0zMCwxMiArMzAsMTIgQEAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJMaW5lV2lkdGguaCIKIAotI2luY2x1ZGUgIlJl
bmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyQmxvY2tGbG93LmgiCiAjaW5jbHVkZSAiUmVu
ZGVyUnVieVJ1bi5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUxpbmVXaWR0aDo6TGluZVdp
ZHRoKFJlbmRlckJsb2NrJiBibG9jaywgYm9vbCBpc0ZpcnN0TGluZSwgSW5kZW50VGV4dE9yTm90
IHNob3VsZEluZGVudFRleHQpCitMaW5lV2lkdGg6OkxpbmVXaWR0aChSZW5kZXJCbG9ja0Zsb3cm
IGJsb2NrLCBib29sIGlzRmlyc3RMaW5lLCBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4
dCkKICAgICA6IG1fYmxvY2soYmxvY2spCiAgICAgLCBtX3VuY29tbWl0dGVkV2lkdGgoMCkKICAg
ICAsIG1fY29tbWl0dGVkV2lkdGgoMCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9MaW5lV2lkdGguaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguaApp
bmRleCBmODhjMmFiYjEwYjdlYmYxOWI4OTJhMWNiZTNmNDI5MjRiODk0YmEwLi5lNzUyMmNmZmUw
ZjAwMDQxMTNmZTVhYTNmZTllYTc0ZDE2NzE1NzU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvTGluZVdpZHRoLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xp
bmVXaWR0aC5oCkBAIC0zNSw3ICszNSw3IEBACiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNz
IEZsb2F0aW5nT2JqZWN0OwotY2xhc3MgUmVuZGVyQmxvY2s7CitjbGFzcyBSZW5kZXJCbG9ja0Zs
b3c7CiBjbGFzcyBSZW5kZXJPYmplY3Q7CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOwogCkBAIC00NSw3
ICs0NSw3IEBAIGVudW0gSW5kZW50VGV4dE9yTm90IHsgRG9Ob3RJbmRlbnRUZXh0LCBJbmRlbnRU
ZXh0IH07CiAKIGNsYXNzIExpbmVXaWR0aCB7CiBwdWJsaWM6Ci0gICAgTGluZVdpZHRoKFJlbmRl
ckJsb2NrJiwgYm9vbCBpc0ZpcnN0TGluZSwgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRl
eHQpOworICAgIExpbmVXaWR0aChSZW5kZXJCbG9ja0Zsb3cmLCBib29sIGlzRmlyc3RMaW5lLCBJ
bmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCk7CiAKICAgICBib29sIGZpdHNPbkxpbmUo
Ym9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkgY29uc3Q7CiAgICAgYm9vbCBmaXRz
T25MaW5lSW5jbHVkaW5nRXh0cmFXaWR0aChmbG9hdCBleHRyYSkgY29uc3Q7CkBAIC03NSw3ICs3
NSw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBjb21wdXRlQXZhaWxhYmxlV2lkdGhGcm9tTGVmdEFu
ZFJpZ2h0KCk7CiAgICAgYm9vbCBmaXRzT25MaW5lRXhjbHVkaW5nVHJhaWxpbmdDb2xsYXBzZWRX
aGl0ZXNwYWNlKCkgY29uc3Q7CiAKLSAgICBSZW5kZXJCbG9jayYgbV9ibG9jazsKKyAgICBSZW5k
ZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CiAgICAgZmxvYXQgbV91bmNvbW1pdHRlZFdpZHRoOwogICAg
IGZsb2F0IG1fY29tbWl0dGVkV2lkdGg7CiAgICAgZmxvYXQgbV9vdmVyaGFuZ1dpZHRoOyAvLyBU
aGUgYW1vdW50IGJ5IHdoaWNoIHxtX2F2YWlsYWJsZVdpZHRofCBoYXMgYmVlbiBpbmZsYXRlZCB0
byBhY2NvdW50IGZvciBwb3NzaWJsZSBjb250cmFjdGlvbiBkdWUgdG8gcnVieSBvdmVyaGFuZy4K
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCmluZGV4IGY4NTRmODRhMmJi
NGJjOGI1MjFmNmI1ZjU4MTYwODI2YTgwOTk4YzMuLjU2OWE3ODM2N2QyNmE2OWU1YTA4OTUxNDQ3
YjZjZjZiZWRhMzRjZTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9jay5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNw
cApAQCAtODMsNyArODMsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiB1c2luZyBuYW1lc3BhY2Ug
SFRNTE5hbWVzOwogCiBzdHJ1Y3QgU2FtZVNpemVBc1JlbmRlckJsb2NrIDogcHVibGljIFJlbmRl
ckJveCB7Ci0gICAgdm9pZCogcG9pbnRlcnNbMl07CisgICAgdm9pZCogcG9pbnRlcnNbMV07CiAg
ICAgUmVuZGVyTGluZUJveExpc3QgbGluZUJveGVzOwogICAgIHVpbnQzMl90IGJpdGZpZWxkczsK
IH07CkBAIC0xMDcsOCArMTA3LDYgQEAgc3RhdGljIERlbGF5ZWRVcGRhdGVTY3JvbGxJbmZvU2V0
KiBnRGVsYXllZFVwZGF0ZVNjcm9sbEluZm9TZXQgPSAwOwogCiBzdGF0aWMgYm9vbCBnQ29sdW1u
Rmxvd1NwbGl0RW5hYmxlZCA9IHRydWU7CiAKLWJvb2wgUmVuZGVyQmxvY2s6OnNfY2FuUHJvcGFn
YXRlRmxvYXRJbnRvU2libGluZyA9IGZhbHNlOwotCiAvLyBUaGlzIGNsYXNzIGhlbHBzIGRpc3Bh
dGNoaW5nIHRoZSAnb3ZlcmZsb3cnIGV2ZW50IG9uIGxheW91dCBjaGFuZ2UuIG92ZXJmbG93IGNh
biBiZSBzZXQgb24gUmVuZGVyQm94ZXMsIHlldCB0aGUgZXhpc3RpbmcgY29kZQogLy8gb25seSB3
b3JrcyBvbiBSZW5kZXJCbG9ja3MuIElmIHRoaXMgY2hhbmdlLCB0aGlzIGNsYXNzIHNob3VsZCBi
ZSBzaGFyZWQgd2l0aCBvdGhlciBSZW5kZXJCb3hlcy4KIGNsYXNzIE92ZXJmbG93RXZlbnREaXNw
YXRjaGVyIHsKQEAgLTI1Niw3ICsyNTQsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjp3aWxsQmVEZXN0
cm95ZWQoKQogdm9pZCBSZW5kZXJCbG9jazo6c3R5bGVXaWxsQ2hhbmdlKFN0eWxlRGlmZmVyZW5j
ZSBkaWZmLCBjb25zdCBSZW5kZXJTdHlsZSogbmV3U3R5bGUpCiB7CiAgICAgUmVuZGVyU3R5bGUq
IG9sZFN0eWxlID0gc3R5bGUoKTsKLSAgICBzX2NhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxpbmcg
PSBvbGRTdHlsZSA/ICFpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2b2lk
c0Zsb2F0cygpIDogZmFsc2U7CiAKICAgICBzZXRSZXBsYWNlZChuZXdTdHlsZS0+aXNEaXNwbGF5
SW5saW5lVHlwZSgpKTsKICAgICAKQEAgLTI4MCw5ICsyNzcsNiBAQCB2b2lkIFJlbmRlckJsb2Nr
OjpzdHlsZVdpbGxDaGFuZ2UoU3R5bGVEaWZmZXJlbmNlIGRpZmYsIGNvbnN0IFJlbmRlclN0eWxl
KiBuZXdTdAogICAgICAgICAgICAgaWYgKGNiLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAg
ICAgICAgdG9SZW5kZXJCbG9jayhjYiktPnJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKHRoaXMsIE5l
d0NvbnRhaW5pbmdCbG9jayk7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGFpbnNGbG9h
dHMoKSAmJiAhaXNGbG9hdGluZygpICYmICFpc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiBuZXdT
dHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSkKLSAgICAgICAgICAgIG1hcmtBbGxEZXNjZW5k
YW50c1dpdGhGbG9hdHNGb3JMYXlvdXQoKTsKICAgICB9CiAKICAgICBSZW5kZXJCb3g6OnN0eWxl
V2lsbENoYW5nZShkaWZmLCBuZXdTdHlsZSk7CkBAIC0zMjQsMzYgKzMxOCw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSBkaWZmLCBjb25zdCBSZW5k
ZXJTdHlsZSogb2xkU3R5CiAKICAgICBwcm9wYWdhdGVTdHlsZVRvQW5vbnltb3VzQ2hpbGRyZW4o
UHJvcGFnYXRlVG9CbG9ja0NoaWxkcmVuT25seSk7CiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7Ci0K
LSAgICAvLyBBZnRlciBvdXIgc3R5bGUgY2hhbmdlZCwgaWYgd2UgbG9zZSBvdXIgYWJpbGl0eSB0
byBwcm9wYWdhdGUgZmxvYXRzIGludG8gbmV4dCBzaWJsaW5nCi0gICAgLy8gYmxvY2tzLCB0aGVu
IHdlIG5lZWQgdG8gZmluZCB0aGUgdG9wIG1vc3QgcGFyZW50IGNvbnRhaW5pbmcgdGhhdCBvdmVy
aGFuZ2luZyBmbG9hdCBhbmQKLSAgICAvLyB0aGVuIG1hcmsgaXRzIGRlc2NlbmRhbnRzIHdpdGgg
ZmxvYXRzIGZvciBsYXlvdXQgYW5kIGNsZWFyIGFsbCBmbG9hdHMgZnJvbSBpdHMgbmV4dAotICAg
IC8vIHNpYmxpbmcgYmxvY2tzIHRoYXQgZXhpc3QgaW4gb3VyIGZsb2F0aW5nIG9iamVjdHMgbGlz
dC4gU2VlIGJ1ZyA1NjI5OSBhbmQgNjI4NzUuCi0gICAgYm9vbCBjYW5Qcm9wYWdhdGVGbG9hdElu
dG9TaWJsaW5nID0gIWlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhYXZvaWRz
RmxvYXRzKCk7Ci0gICAgaWYgKGRpZmYgPT0gU3R5bGVEaWZmZXJlbmNlTGF5b3V0ICYmIHNfY2Fu
UHJvcGFnYXRlRmxvYXRJbnRvU2libGluZyAmJiAhY2FuUHJvcGFnYXRlRmxvYXRJbnRvU2libGlu
ZyAmJiBoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBwYXJl
bnRCbG9jayA9IHRoaXM7Ci0gICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGlu
Z09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICAgICAgYXV0byBlbmQg
PSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLQotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCog
Y3VyciA9IHBhcmVudCgpOyBjdXJyICYmICFjdXJyLT5pc1JlbmRlclZpZXcoKTsgY3VyciA9IGN1
cnItPnBhcmVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+aXNSZW5kZXJCbG9jaygpKSB7
Ci0gICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGN1cnJCbG9jayA9IHRvUmVuZGVyQmxvY2so
Y3Vycik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VyckJsb2NrLT5oYXNPdmVyaGFuZ2luZ0Zs
b2F0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2Jq
ZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgUmVuZGVyQm94JiByZW5kZXJlciA9ICgqaXQpLT5yZW5kZXJlcigpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGN1cnJCbG9jay0+aGFzT3ZlcmhhbmdpbmdGbG9hdCgmcmVuZGVyZXIp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2sgPSBjdXJyQmxvY2s7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgIHBhcmVudEJsb2NrLT5t
YXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgICAgIHBhcmVudEJs
b2NrLT5tYXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgfQogICAgIAogICAg
IC8vIEl0J3MgcG9zc2libGUgZm9yIG91ciBib3JkZXIvcGFkZGluZyB0byBjaGFuZ2UsIGJ1dCBm
b3IgdGhlIG92ZXJhbGwgbG9naWNhbCB3aWR0aCBvZiB0aGUgYmxvY2sgdG8KICAgICAvLyBlbmQg
dXAgYmVpbmcgdGhlIHNhbWUuIFdlIGtlZXAgdHJhY2sgb2YgdGhpcyBjaGFuZ2Ugc28gaW4gbGF5
b3V0QmxvY2ssIHdlIGNhbiBrbm93IHRvIHNldCByZWxheW91dENoaWxkcmVuPXRydWUuCkBAIC02
MjUsNyArNTg5LDkgQEAgdm9pZCBSZW5kZXJCbG9jazo6c3BsaXRGbG93KFJlbmRlck9iamVjdCog
YmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwKICAgICAgICAgLy8gV2UgY2Fu
IHJldXNlIHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBuZXh0IGNv
bnRpbnVhdGlvbi4KICAgICAgICAgcHJlID0gYmxvY2s7CiAgICAgICAgIHByZS0+cmVtb3ZlUG9z
aXRpb25lZE9iamVjdHMoMCk7Ci0gICAgICAgIHByZS0+cmVtb3ZlRmxvYXRpbmdPYmplY3RzKCk7
CisgICAgICAgIC8vIEZJWE1FLUJMT0NLRkxPVyByZW1vdmUgdGhpcyB3aGVuIHNwbGl0RmxvdyBp
cyBtb3ZlZCB0byBSZW5kZXJCbG9ja0Zsb3cuCisgICAgICAgIGlmIChwcmUtPmlzUmVuZGVyQmxv
Y2tGbG93KCkpCisgICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyhwcmUpLT5yZW1vdmVGbG9h
dGluZ09iamVjdHMoKTsKICAgICAgICAgYmxvY2sgPSB0b1JlbmRlckJsb2NrKGJsb2NrLT5wYXJl
bnQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2YWls
YWJsZSBmb3IgdXNlLiAgTWFrZSBvbmUuCkBAIC05MzgsOCArOTA0LDYgQEAgc3RhdGljIHZvaWQg
Z2V0SW5saW5lUnVuKFJlbmRlck9iamVjdCogc3RhcnQsIFJlbmRlck9iamVjdCogYm91bmRhcnks
CiAKIHZvaWQgUmVuZGVyQmxvY2s6OmRlbGV0ZUxpbmVCb3hUcmVlKCkKIHsKLSAgICBpZiAoY29u
dGFpbnNGbG9hdHMoKSkKLSAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmNsZWFyTGluZUJveFRy
ZWVQb2ludGVycygpOwogICAgIG1fbGluZUJveGVzLmRlbGV0ZUxpbmVCb3hUcmVlKHJlbmRlckFy
ZW5hKCkpOwogCiAgICAgaWYgKEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gZG9jdW1lbnQoKS5leGlz
dGluZ0FYT2JqZWN0Q2FjaGUoKSkKQEAgLTExMjMsNDYgKzEwODcsNiBAQCB2b2lkIFJlbmRlckJs
b2NrOjpjb2xsYXBzZUFub255bW91c0JveENoaWxkKFJlbmRlckJsb2NrKiBwYXJlbnQsIFJlbmRl
ckJsb2NrKiBjaAogICAgIGNoaWxkLT5kZXN0cm95KCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6
Om1vdmVBbGxDaGlsZHJlbkluY2x1ZGluZ0Zsb2F0c1RvKFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBi
b29sIGZ1bGxSZW1vdmVJbnNlcnQpCi17Ci0gICAgbW92ZUFsbENoaWxkcmVuVG8odG9CbG9jaywg
ZnVsbFJlbW92ZUluc2VydCk7Ci0KLSAgICAvLyBXaGVuIGEgcG9ydGlvbiBvZiB0aGUgcmVuZGVy
IHRyZWUgaXMgYmVpbmcgZGV0YWNoZWQsIGFub255bW91cyBibG9ja3MKLSAgICAvLyB3aWxsIGJl
IGNvbWJpbmVkIGFzIHRoZWlyIGNoaWxkcmVuIGFyZSBkZWxldGVkLiBJbiB0aGlzIHByb2Nlc3Ms
IHRoZQotICAgIC8vIGFub255bW91cyBibG9jayBsYXRlciBpbiB0aGUgdHJlZSBpcyBtZXJnZWQg
aW50byB0aGUgb25lIHByZWNlZWRpbmcgaXQuCi0gICAgLy8gSXQgY2FuIGhhcHBlbiB0aGF0IHRo
ZSBsYXRlciBibG9jayAodGhpcykgY29udGFpbnMgZmxvYXRzIHRoYXQgdGhlCi0gICAgLy8gcHJl
dmlvdXMgYmxvY2sgKHRvQmxvY2spIGRpZCBub3QgY29udGFpbiwgYW5kIHRodXMgYXJlIG5vdCBp
biB0aGUKLSAgICAvLyBmbG9hdGluZyBvYmplY3RzIGxpc3QgZm9yIHRvQmxvY2suIFRoaXMgY2Fu
IHJlc3VsdCBpbiB0b0Jsb2NrIGNvbnRhaW5pbmcKLSAgICAvLyBmbG9hdHMgdGhhdCBhcmUgbm90
IGluIGl0J3MgZmxvYXRpbmcgb2JqZWN0cyBsaXN0LCBidXQgYXJlIGluIHRoZQotICAgIC8vIGZs
b2F0aW5nIG9iamVjdHMgbGlzdHMgb2Ygc2libGluZ3MgYW5kIHBhcmVudHMuIFRoaXMgY2FuIGNh
dXNlIHByb2JsZW1zCi0gICAgLy8gd2hlbiB0aGUgZmxvYXQgaXRzZWxmIGlzIGRlbGV0ZWQsIHNp
bmNlIHRoZSBkZWxldGlvbiBjb2RlIGFzc3VtZXMgdGhhdAotICAgIC8vIGlmIGEgZmxvYXQgaXMg
bm90IGluIGl0J3MgY29udGFpbmluZyBibG9jaydzIGZsb2F0aW5nIG9iamVjdHMgbGlzdCwgaXQK
LSAgICAvLyBpc24ndCBpbiBhbnkgZmxvYXRpbmcgb2JqZWN0cyBsaXN0LiBJbiBvcmRlciB0byBw
cmVzZXJ2ZSB0aGlzIGNvbmRpdGlvbgotICAgIC8vIChyZW1vdmluZyBpdCBoYXMgc2VyaW91cyBw
ZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMpLCB3ZSBuZWVkIHRvIGNvcHkgdGhlCi0gICAgLy8gZmxv
YXRpbmcgb2JqZWN0cyBmcm9tIHRoZSBvbGQgYmxvY2sgKHRoaXMpIHRvIHRoZSBuZXcgYmxvY2sg
KHRvQmxvY2spLgotICAgIC8vIFRoZSBmbG9hdCdzIG1ldHJpY3Mgd2lsbCBsaWtlbHkgYWxsIGJl
IHdyb25nLCBidXQgc2luY2UgdG9CbG9jayBpcwotICAgIC8vIGFscmVhZHkgbWFya2VkIGZvciBs
YXlvdXQsIHRoaXMgd2lsbCBnZXQgZml4ZWQgYmVmb3JlIGFueXRoaW5nIGdldHMKLSAgICAvLyBk
aXNwbGF5ZWQuCi0gICAgLy8gU2VlIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MTE1NTY2Ci0gICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKSB7Ci0gICAgICAgIGlm
ICghdG9CbG9jay0+bV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgICAgICB0b0Jsb2NrLT5jcmVh
dGVGbG9hdGluZ09iamVjdHMoKTsKLQotICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYg
ZnJvbUZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgICAg
ICBhdXRvIGVuZCA9IGZyb21GbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLQotICAgICAgICBmb3Ig
KGF1dG8gaXQgPSBmcm9tRmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7Ci0gICAgICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0
KCk7Ci0KLSAgICAgICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgb2JqZWN0IGFnYWluIGlmIGl0
J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgaWYgKHRvQmxvY2stPmNvbnRhaW5z
RmxvYXQoJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpKSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLQotICAgICAgICAgICAgdG9CbG9jay0+bV9mbG9hdGluZ09iamVjdHMtPmFkZChmbG9h
dGluZ09iamVjdC0+dW5zYWZlQ2xvbmUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHZvaWQg
UmVuZGVyQmxvY2s6OnJlbW92ZUNoaWxkKFJlbmRlck9iamVjdCogb2xkQ2hpbGQpCiB7CiAgICAg
Ly8gTm8gbmVlZCB0byB3YXN0ZSB0aW1lIGluIG1lcmdpbmcgb3IgcmVtb3ZpbmcgZW1wdHkgYW5v
bnltb3VzIGJsb2Nrcy4KQEAgLTEyMTYsNyArMTE0MCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJl
bW92ZUNoaWxkKFJlbmRlck9iamVjdCogb2xkQ2hpbGQpCiAgICAgICAgIH0gZWxzZSB7CiAgICAg
ICAgICAgICAvLyBUYWtlIGFsbCB0aGUgY2hpbGRyZW4gb3V0IG9mIHRoZSB8bmV4dHwgYmxvY2sg
YW5kIHB1dCB0aGVtIGluCiAgICAgICAgICAgICAvLyB0aGUgfHByZXZ8IGJsb2NrLgotICAgICAg
ICAgICAgbmV4dEJsb2NrLT5tb3ZlQWxsQ2hpbGRyZW5JbmNsdWRpbmdGbG9hdHNUbyhwcmV2Qmxv
Y2ssIG5leHRCbG9jay0+aGFzTGF5ZXIoKSB8fCBwcmV2QmxvY2stPmhhc0xheWVyKCkpOworICAg
ICAgICAgICAgbmV4dEJsb2NrLT5tb3ZlQWxsQ2hpbGRyZW5PblJlbW92YWxUbyhwcmV2QmxvY2ss
IG5leHRCbG9jay0+aGFzTGF5ZXIoKSB8fCBwcmV2QmxvY2stPmhhc0xheWVyKCkpOwogICAgICAg
ICAgICAgCiAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIG5vdy1lbXB0eSBibG9jaydzIGxpbmVz
IGFuZCBudWtlIGl0LgogICAgICAgICAgICAgbmV4dEJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgp
OwpAQCAtMTYxMywxNiArMTUzNywxMyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zy
b21DaGlsZHJlbigpCiAgICAgfQogfQogCi12b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlT3ZlcmZs
b3coTGF5b3V0VW5pdCBvbGRDbGllbnRBZnRlckVkZ2UsIGJvb2wgcmVjb21wdXRlRmxvYXRzKQor
dm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZU92ZXJmbG93KExheW91dFVuaXQgb2xkQ2xpZW50QWZ0
ZXJFZGdlLCBib29sKQogewogICAgIGNsZWFyT3ZlcmZsb3coKTsKIAogICAgIC8vIEFkZCBvdmVy
ZmxvdyBmcm9tIGNoaWxkcmVuLgogICAgIGFkZE92ZXJmbG93RnJvbUNoaWxkcmVuKCk7CiAKLSAg
ICBpZiAoIWhhc0NvbHVtbnMoKSAmJiAocmVjb21wdXRlRmxvYXRzIHx8IGlzUm9vdCgpIHx8IGV4
cGFuZHNUb0VuY2xvc2VPdmVyaGFuZ2luZ0Zsb2F0cygpIHx8IGhhc1NlbGZQYWludGluZ0xheWVy
KCkpKQotICAgICAgICBhZGRPdmVyZmxvd0Zyb21GbG9hdHMoKTsKLQogICAgIC8vIEFkZCBpbiB0
aGUgb3ZlcmZsb3cgZnJvbSBwb3NpdGlvbmVkIG9iamVjdHMuCiAgICAgYWRkT3ZlcmZsb3dGcm9t
UG9zaXRpb25lZE9iamVjdHMoKTsKIApAQCAtMTY3MywyMCArMTU5NCw2IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmFkZE92ZXJmbG93RnJvbUJsb2NrQ2hpbGRyZW4oKQogICAgIH0KIH0KIAotdm9pZCBS
ZW5kZXJCbG9jazo6YWRkT3ZlcmZsb3dGcm9tRmxvYXRzKCkKLXsKLSAgICBpZiAoIW1fZmxvYXRp
bmdPYmplY3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNl
dCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgYXV0
byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBmbG9h
dGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgRmxvYXRp
bmdPYmplY3QqIHIgPSBpdC0+Z2V0KCk7Ci0gICAgICAgIGlmIChyLT5pc0Rlc2NlbmRhbnQoKSkK
LSAgICAgICAgICAgIGFkZE92ZXJmbG93RnJvbUNoaWxkKCZyLT5yZW5kZXJlcigpLCBJbnRTaXpl
KHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIpLCB5UG9zaXRpb25Gb3JGbG9hdElu
Y2x1ZGluZ01hcmdpbihyKSkpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6YWRkT3Zl
cmZsb3dGcm9tUG9zaXRpb25lZE9iamVjdHMoKQogewogICAgIFRyYWNrZWRSZW5kZXJlckxpc3RI
YXNoU2V0KiBwb3NpdGlvbmVkRGVzY2VuZGFudHMgPSBwb3NpdGlvbmVkT2JqZWN0cygpOwpAQCAt
MjE4MywzMiArMjA5MCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6Om1hcmtGb3JQYWdpbmF0aW9uUmVs
YXlvdXRJZk5lZWRlZCgpCiAgICAgICAgIHNldENoaWxkTmVlZHNMYXlvdXQoTWFya09ubHlUaGlz
KTsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6cmVwYWludE92ZXJoYW5naW5nRmxvYXRzKGJvb2wg
cGFpbnRBbGxEZXNjZW5kYW50cykKLXsKLSAgICAvLyBSZXBhaW50IGFueSBvdmVyaGFuZ2luZyBm
bG9hdHMgKGlmIHdlIGtub3cgd2UncmUgdGhlIG9uZSB0byBwYWludCB0aGVtKS4KLSAgICAvLyBP
dGhlcndpc2UsIGJhaWwgb3V0LgotICAgIGlmICghaGFzT3ZlcmhhbmdpbmdGbG9hdHMoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gRklYTUU6IEF2b2lkIGRpc2FibGluZyBMYXlvdXRTdGF0
ZS4gQXQgdGhlIHZlcnkgbGVhc3QsIGRvbid0IGRpc2FibGUgaXQgZm9yIGZsb2F0cyBvcmlnaW5h
dGluZwotICAgIC8vIGluIHRoaXMgYmxvY2suIEJldHRlciB5ZXQgd291bGQgYmUgdG8gcHVzaCBl
eHRyYSBzdGF0ZSBmb3IgdGhlIGNvbnRhaW5lcnMgb2Ygb3RoZXIgZmxvYXRzLgotICAgIExheW91
dFN0YXRlRGlzYWJsZXIgbGF5b3V0U3RhdGVEaXNhYmxlcigmdmlldygpKTsKLSAgICBjb25zdCBG
bG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+
c2V0KCk7Ci0gICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICBmb3Ig
KGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
LSAgICAgICAgRmxvYXRpbmdPYmplY3QqIHIgPSBpdC0+Z2V0KCk7Ci0gICAgICAgIC8vIE9ubHkg
cmVwYWludCB0aGUgb2JqZWN0IGlmIGl0IGlzIG92ZXJoYW5naW5nLCBpcyBub3QgaW4gaXRzIG93
biBsYXllciwgYW5kCi0gICAgICAgIC8vIGlzIG91ciByZXNwb25zaWJpbGl0eSB0byBwYWludCAo
bV9zaG91bGRQYWludCBpcyBzZXQpLiBXaGVuIHBhaW50QWxsRGVzY2VuZGFudHMgaXMgdHJ1ZSwg
dGhlIGxhdHRlcgotICAgICAgICAvLyBjb25kaXRpb24gaXMgcmVwbGFjZWQgd2l0aCBiZWluZyBh
IGRlc2NlbmRhbnQgb2YgdXMuCi0gICAgICAgIGlmIChyLT5sb2dpY2FsQm90dG9tKGlzSG9yaXpv
bnRhbFdyaXRpbmdNb2RlKCkpID4gbG9naWNhbEhlaWdodCgpCi0gICAgICAgICAgICAmJiAhci0+
cmVuZGVyZXIoKS5oYXNTZWxmUGFpbnRpbmdMYXllcigpCi0gICAgICAgICAgICAmJiAoci0+c2hv
dWxkUGFpbnQoKSB8fCAocGFpbnRBbGxEZXNjZW5kYW50cyAmJiByLT5yZW5kZXJlcigpLmlzRGVz
Y2VuZGFudE9mKHRoaXMpKSkpIHsKLSAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucmVwYWludCgp
OwotICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5yZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoZmFs
c2UpOwotICAgICAgICB9Ci0gICAgfQotfQotIAogdm9pZCBSZW5kZXJCbG9jazo6cGFpbnQoUGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCkKIHsKICAg
ICBMYXlvdXRQb2ludCBhZGp1c3RlZFBhaW50T2Zmc2V0ID0gcGFpbnRPZmZzZXQgKyBsb2NhdGlv
bigpOwpAQCAtMjYwMSwzNiArMjQ4Miw2IEBAIExheW91dFBvaW50IFJlbmRlckJsb2NrOjpmbGlw
RmxvYXRGb3JXcml0aW5nTW9kZUZvckNoaWxkKGNvbnN0IEZsb2F0aW5nT2JqZWN0KiBjCiAgICAg
cmV0dXJuIExheW91dFBvaW50KHBvaW50LngoKSArIHdpZHRoKCkgLSBjaGlsZC0+cmVuZGVyZXIo
KS53aWR0aCgpIC0gMiAqIHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKGNoaWxkKSwg
cG9pbnQueSgpKTsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRGbG9hdHMoUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgYm9vbCBwcmVzZXJ2
ZVBoYXNlKQotewotICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxv
YXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVu
ZCgpOwotICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkgewotICAgICAgICBGbG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKLSAg
ICAgICAgLy8gT25seSBwYWludCB0aGUgb2JqZWN0IGlmIG91ciBtX3Nob3VsZFBhaW50IGZsYWcg
aXMgc2V0LgotICAgICAgICBpZiAoci0+c2hvdWxkUGFpbnQoKSAmJiAhci0+cmVuZGVyZXIoKS5o
YXNTZWxmUGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICBQYWludEluZm8gY3VycmVudFBh
aW50SW5mbyhwYWludEluZm8pOwotICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9
IHByZXNlcnZlUGhhc2UgPyBwYWludEluZm8ucGhhc2UgOiBQYWludFBoYXNlQmxvY2tCYWNrZ3Jv
dW5kOwotICAgICAgICAgICAgLy8gRklYTUU6IExheW91dFBvaW50IHZlcnNpb24gb2YgeFBvc2l0
aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4gd291bGQgbWFrZSB0aGlzIG11Y2ggY2xlYW5lci4K
LSAgICAgICAgICAgIExheW91dFBvaW50IGNoaWxkUG9pbnQgPSBmbGlwRmxvYXRGb3JXcml0aW5n
TW9kZUZvckNoaWxkKHIsIExheW91dFBvaW50KHBhaW50T2Zmc2V0LngoKSArIHhQb3NpdGlvbkZv
ckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIpIC0gci0+cmVuZGVyZXIoKS54KCksIHBhaW50T2Zmc2V0
LnkoKSArIHlQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIpIC0gci0+cmVuZGVyZXIo
KS55KCkpKTsKLSAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5m
bywgY2hpbGRQb2ludCk7Ci0gICAgICAgICAgICBpZiAoIXByZXNlcnZlUGhhc2UpIHsKLSAgICAg
ICAgICAgICAgICBjdXJyZW50UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZUNoaWxkQmxvY2tC
YWNrZ3JvdW5kczsKLSAgICAgICAgICAgICAgICByLT5yZW5kZXJlcigpLnBhaW50KGN1cnJlbnRQ
YWludEluZm8sIGNoaWxkUG9pbnQpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRQYWludEluZm8u
cGhhc2UgPSBQYWludFBoYXNlRmxvYXQ7Ci0gICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5w
YWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKLSAgICAgICAgICAgICAgICBjdXJy
ZW50UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZUZvcmVncm91bmQ7Ci0gICAgICAgICAgICAg
ICAgci0+cmVuZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKLSAg
ICAgICAgICAgICAgICBjdXJyZW50UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZU91dGxpbmU7
Ci0gICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBj
aGlsZFBvaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQogUmVuZGVy
SW5saW5lKiBSZW5kZXJCbG9jazo6aW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpIGNvbnN0CiB7
IAogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb24gPSB0aGlzLT5jb250aW51
YXRpb24oKTsKQEAgLTI4MzQsMTkgKzI2ODUsNyBAQCBHYXBSZWN0cyBSZW5kZXJCbG9jazo6c2Vs
ZWN0aW9uR2FwcyhSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBjb25zdCBMYXlvdXRQb2ludCYgcgog
ICAgICAgICBpZiAoaXNCb2R5KCkgfHwgaXNSb290KCkpIC8vIFRoZSA8Ym9keT4gbXVzdCBtYWtl
IHN1cmUgdG8gZXhhbWluZSBpdHMgY29udGFpbmluZ0Jsb2NrJ3MgcG9zaXRpb25lZCBvYmplY3Rz
LgogICAgICAgICAgICAgZm9yIChSZW5kZXJCbG9jayogY2IgPSBjb250YWluaW5nQmxvY2soKTsg
Y2IgJiYgIWNiLT5pc1JlbmRlclZpZXcoKTsgY2IgPSBjYi0+Y29udGFpbmluZ0Jsb2NrKCkpCiAg
ICAgICAgICAgICAgICAgY2xpcE91dFBvc2l0aW9uZWRPYmplY3RzKHBhaW50SW5mbywgTGF5b3V0
UG9pbnQoY2ItPngoKSwgY2ItPnkoKSksIGNiLT5wb3NpdGlvbmVkT2JqZWN0cygpKTsgLy8gRklY
TUU6IE5vdCByaWdodCBmb3IgZmxpcHBlZCB3cml0aW5nIG1vZGVzLgotICAgICAgICBpZiAobV9m
bG9hdGluZ09iamVjdHMpIHsKLSAgICAgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBm
bG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICAgICAgICAg
IGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgICAgICAgICBmb3IgKGF1
dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAg
ICAgICAgICAgICAgICBGbG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKLSAgICAgICAgICAg
ICAgICBMYXlvdXRSZWN0IGZsb2F0Qm94KG9mZnNldEZyb21Sb290QmxvY2sud2lkdGgoKSArIHhQ
b3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb2Zmc2V0RnJvbVJvb3RCbG9jay5oZWlnaHQoKSArIHlQb3NpdGlvbkZv
ckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgci0+cmVuZGVyZXIoKS53aWR0aCgpLCByLT5yZW5kZXJlcigpLmhlaWdodCgpKTsKLSAg
ICAgICAgICAgICAgICByb290QmxvY2stPmZsaXBGb3JXcml0aW5nTW9kZShmbG9hdEJveCk7Ci0g
ICAgICAgICAgICAgICAgZmxvYXRCb3gubW92ZShyb290QmxvY2tQaHlzaWNhbFBvc2l0aW9uLngo
KSwgcm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbi55KCkpOwotICAgICAgICAgICAgICAgIHBhaW50
SW5mby0+Y29udGV4dC0+Y2xpcE91dChwaXhlbFNuYXBwZWRJbnRSZWN0KGZsb2F0Qm94KSk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgY2xpcE91dEZsb2F0aW5nT2JqZWN0cyhy
b290QmxvY2ssIHBhaW50SW5mbywgcm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbiwgb2Zmc2V0RnJv
bVJvb3RCbG9jayk7CiAgICAgfQogCiAgICAgLy8gRklYTUU6IG92ZXJmbG93OiBhdXRvL3Njcm9s
bCByZWdpb25zIG5lZWQgbW9yZSBtYXRoIGhlcmUsIHNpbmNlIHBhaW50aW5nIGluIHRoZSBib3Jk
ZXIgYm94IGlzIGRpZmZlcmVudCBmcm9tIHBhaW50aW5nIGluIHRoZSBwYWRkaW5nIGJveCAob25l
IGlzIHNjcm9sbGVkLCB0aGUgb3RoZXIgaXMKQEAgLTMyNTYsMzE4ICszMDk1LDYgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6cmVtb3ZlUG9zaXRpb25lZE9iamVjdHMoUmVuZGVyQmxvY2sqIG8sIENvbnRh
aW5pbmdCbG9ja1N0YXRlIGMKICAgICAgICAgcmVtb3ZlUG9zaXRpb25lZE9iamVjdChkZWFkT2Jq
ZWN0cy5hdChpKSk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUZsb2F0aW5nT2JqZWN0
cygpCi17Ci0gICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgbV9mbG9hdGluZ09iamVjdHMtPmNsZWFyKCk7Ci19Ci0KLUZsb2F0aW5nT2JqZWN0KiBSZW5k
ZXJCbG9jazo6aW5zZXJ0RmxvYXRpbmdPYmplY3QoUmVuZGVyQm94KiBvKQotewotICAgIEFTU0VS
VChvLT5pc0Zsb2F0aW5nKCkpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBsaXN0IG9mIHNwZWNpYWwg
b2JqZWN0cyBpZiB3ZSBkb24ndCBhbGVhZHkgaGF2ZSBvbmUKLSAgICBpZiAoIW1fZmxvYXRpbmdP
YmplY3RzKQotICAgICAgICBjcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKLSAgICBlbHNlIHsKLSAg
ICAgICAgLy8gRG9uJ3QgaW5zZXJ0IHRoZSBvYmplY3QgYWdhaW4gaWYgaXQncyBhbHJlYWR5IGlu
IHRoZSBsaXN0Ci0gICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVj
dFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICAgICAgYXV0byBpdCA9IGZsb2F0
aW5nT2JqZWN0U2V0LmZpbmQ8UmVuZGVyQm94JiwgRmxvYXRpbmdPYmplY3RIYXNoVHJhbnNsYXRv
cj4oKm8pOwotICAgICAgICBpZiAoaXQgIT0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCkpCi0gICAg
ICAgICAgICByZXR1cm4gaXQtPmdldCgpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0aGUgc3Bl
Y2lhbCBvYmplY3QgZW50cnkgJiBhcHBlbmQgaXQgdG8gdGhlIGxpc3QKLQotICAgIHN0ZDo6dW5p
cXVlX3B0cjxGbG9hdGluZ09iamVjdD4gb2JqZWN0ID0gRmxvYXRpbmdPYmplY3Q6OmNyZWF0ZSgq
byk7Ci0gICAgCi0gICAgLy8gT3VyIGxvY2F0aW9uIGlzIGlycmVsZXZhbnQgaWYgd2UncmUgdW5z
cGxpdHRhYmxlIG9yIG5vIHBhZ2luYXRpb24gaXMgaW4gZWZmZWN0LgotICAgIC8vIEp1c3QgZ28g
YWhlYWQgYW5kIGxheSBvdXQgdGhlIGZsb2F0LgotICAgIGJvb2wgaXNDaGlsZFJlbmRlckJsb2Nr
ID0gby0+aXNSZW5kZXJCbG9jaygpOwotICAgIGlmIChpc0NoaWxkUmVuZGVyQmxvY2sgJiYgIW8t
Pm5lZWRzTGF5b3V0KCkgJiYgdmlldygpLmxheW91dFN0YXRlKCktPnBhZ2VMb2dpY2FsSGVpZ2h0
Q2hhbmdlZCgpKQotICAgICAgICBvLT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7
Ci0gICAgICAgICAgICAKLSAgICBib29sIG5lZWRzQmxvY2tEaXJlY3Rpb25Mb2NhdGlvblNldEJl
Zm9yZUxheW91dCA9IGlzQ2hpbGRSZW5kZXJCbG9jayAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+
bmVlZHNCbG9ja0RpcmVjdGlvbkxvY2F0aW9uU2V0QmVmb3JlTGF5b3V0KCk7Ci0gICAgaWYgKCFu
ZWVkc0Jsb2NrRGlyZWN0aW9uTG9jYXRpb25TZXRCZWZvcmVMYXlvdXQgfHwgaXNXcml0aW5nTW9k
ZVJvb3QoKSkgLy8gV2UgYXJlIHVuc3BsaXR0YWJsZSBpZiB3ZSdyZSBhIGJsb2NrIGZsb3cgcm9v
dC4KLSAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKLSAgICBlbHNlIHsKLSAgICAgICAgby0+
dXBkYXRlTG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIG8tPmNvbXB1dGVBbmRTZXRCbG9ja0RpcmVj
dGlvbk1hcmdpbnModGhpcyk7Ci0gICAgfQotCi0gICAgb2JqZWN0LT5zZXRMb2dpY2FsV2lkdGgo
bG9naWNhbFdpZHRoRm9yQ2hpbGQobykgKyBtYXJnaW5TdGFydEZvckNoaWxkKG8pICsgbWFyZ2lu
RW5kRm9yQ2hpbGQobyksIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotCi0jaWYgRU5BQkxF
KENTU19TSEFQRVMpCi0gICAgaWYgKFNoYXBlT3V0c2lkZUluZm8qIHNoYXBlT3V0c2lkZSA9IG8t
PnNoYXBlT3V0c2lkZUluZm8oKSkKLSAgICAgICAgc2hhcGVPdXRzaWRlLT5zZXRTaGFwZVNpemUo
bG9naWNhbFdpZHRoRm9yQ2hpbGQobyksIGxvZ2ljYWxIZWlnaHRGb3JDaGlsZChvKSk7Ci0jZW5k
aWYKLQotICAgIHJldHVybiBtX2Zsb2F0aW5nT2JqZWN0cy0+YWRkKHN0ZDo6bW92ZShvYmplY3Qp
KTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlRmxvYXRpbmdPYmplY3QoUmVuZGVyQm94
KiBvKQotewotICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cykgewotICAgICAgICBjb25zdCBGbG9h
dGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0
KCk7Ci0gICAgICAgIGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5maW5kPFJlbmRlckJveCYs
IEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+KCpvKTsKLSAgICAgICAgaWYgKGl0ICE9IGZs
b2F0aW5nT2JqZWN0U2V0LmVuZCgpKSB7Ci0gICAgICAgICAgICBGbG9hdGluZ09iamVjdCogciA9
IGl0LT5nZXQoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbklubGluZSgpKSB7Ci0gICAgICAg
ICAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wID0gci0+bG9naWNhbFRvcChpc0hvcml6b250
YWxXcml0aW5nTW9kZSgpKTsKLSAgICAgICAgICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0
b20gPSByLT5sb2dpY2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotCi0gICAg
ICAgICAgICAgICAgLy8gRml4IGZvciBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NTQ5OTUuCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxCb3R0b20gPCAwIHx8IGxv
Z2ljYWxCb3R0b20gPCBsb2dpY2FsVG9wIHx8IGxvZ2ljYWxUb3AgPT0gTGF5b3V0VW5pdDo6bWF4
KCkpCi0gICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxCb3R0b20gPSBMYXlvdXRVbml0OjptYXgo
KTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lh
bC1jYXNlIHplcm8tIGFuZCBsZXNzLXRoYW4temVyby1oZWlnaHQgZmxvYXRzOiB0aG9zZSBkb24n
dCB0b3VjaAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGluZSB0aGF0IHRoZXkncmUgb24s
IGJ1dCBpdCBzdGlsbCBuZWVkcyB0byBiZSBkaXJ0aWVkLiBUaGlzIGlzCi0gICAgICAgICAgICAg
ICAgICAgIC8vIGFjY29tcGxpc2hlZCBieSBwcmV0ZW5kaW5nIHRoZXkgaGF2ZSBhIGhlaWdodCBv
ZiAxLgotICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQm90dG9tID0gbWF4KGxvZ2ljYWxCb3R0
b20sIGxvZ2ljYWxUb3AgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
aWYgKHItPm9yaWdpbmF0aW5nTGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2Vs
Zk5lZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCgmci0+b3Jp
Z2luYXRpbmdMaW5lKCktPnJlbmRlcmVyKCkgPT0gdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICByLT5vcmlnaW5hdGluZ0xpbmUoKS0+bWFya0RpcnR5KCk7Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSNpZiAhQVNTRVJUX0RJU0FCTEVECi0gICAgICAgICAgICAgICAgICAgIHItPnNldE9y
aWdpbmF0aW5nTGluZSgwKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICBtYXJrTGluZXNEaXJ0eUluQmxvY2tSYW5nZSgwLCBsb2dpY2FsQm90dG9tKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5yZW1vdmUocik7Ci0gICAg
ICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUZsb2F0aW5nT2JqZWN0
c0JlbG93KEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXQsIGludCBsb2dpY2FsT2Zmc2V0KQotewot
ICAgIGlmICghY29udGFpbnNGbG9hdHMoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGNv
bnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmpl
Y3RzLT5zZXQoKTsKLSAgICBGbG9hdGluZ09iamVjdCogY3VyciA9IGZsb2F0aW5nT2JqZWN0U2V0
Lmxhc3QoKS5nZXQoKTsKLSAgICB3aGlsZSAoY3VyciAhPSBsYXN0RmxvYXQgJiYgKCFjdXJyLT5p
c1BsYWNlZCgpIHx8IGN1cnItPmxvZ2ljYWxUb3AoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkg
Pj0gbG9naWNhbE9mZnNldCkpIHsKLSAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPnJlbW92ZShj
dXJyKTsKLSAgICAgICAgaWYgKGZsb2F0aW5nT2JqZWN0U2V0LmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjdXJyID0gZmxvYXRpbmdPYmplY3RTZXQubGFzdCgpLmdldCgp
OwotICAgIH0KLX0KLQotTGF5b3V0UG9pbnQgUmVuZGVyQmxvY2s6OmNvbXB1dGVMb2dpY2FsTG9j
YXRpb25Gb3JGbG9hdChjb25zdCBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QsIExheW91
dFVuaXQgbG9naWNhbFRvcE9mZnNldCkgY29uc3QKLXsKLSAgICBSZW5kZXJCb3gqIGNoaWxkQm94
ID0gJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpOwotICAgIExheW91dFVuaXQgbG9naWNhbExl
ZnRPZmZzZXQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7
IC8vIENvbnN0YW50IHBhcnQgb2YgbGVmdCBvZmZzZXQuCi0gICAgTGF5b3V0VW5pdCBsb2dpY2Fs
UmlnaHRPZmZzZXQ7IC8vIENvbnN0YW50IHBhcnQgb2YgcmlnaHQgb2Zmc2V0LgotI2lmIEVOQUJM
RShDU1NfU0hBUEVTKQotICAgIC8vIEZJWE1FIEJ1ZyAxMDI5NDg6IFRoaXMgb25seSB3b3JrcyBm
b3Igc2hhcGUgb3V0c2lkZSBkaXJlY3RseSBzZXQgb24gdGhpcyBibG9jay4KLSAgICBTaGFwZUlu
c2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbyA9IHRoaXMtPmxheW91dFNoYXBlSW5zaWRlSW5mbygp
OwotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgYmVoYXZpb3IgZm9yIHJpZ2h0IGZsb2F0cy4KLSAg
ICBpZiAoc2hhcGVJbnNpZGVJbmZvKSB7Ci0gICAgICAgIExheW91dFNpemUgZmxvYXRMb2dpY2Fs
U2l6ZSA9IExheW91dFNpemUoY2hpbGRCb3gtPmxvZ2ljYWxXaWR0aCgpLCBjaGlsZEJveC0+bG9n
aWNhbEhlaWdodCgpKTsKLSAgICAgICAgLy8gRklYTUU6IElmIHRoZSBmbG9hdCBkb2Vzbid0IGZp
dCBpbiB0aGUgc2hhcGUgd2Ugc2hvdWxkIHB1c2ggaXQgdW5kZXIgdGhlIGNvbnRlbnQgYm94Ci0g
ICAgICAgIGxvZ2ljYWxUb3BPZmZzZXQgPSBzaGFwZUluc2lkZUluZm8tPmNvbXB1dGVGaXJzdEZp
dFBvc2l0aW9uRm9yRmxvYXQoZmxvYXRMb2dpY2FsU2l6ZSk7Ci0gICAgICAgIGlmIChsb2dpY2Fs
SGVpZ2h0KCkgPiBsb2dpY2FsVG9wT2Zmc2V0KQotICAgICAgICAgICAgbG9naWNhbFRvcE9mZnNl
dCA9IGxvZ2ljYWxIZWlnaHQoKTsKLQotICAgICAgICBTZWdtZW50TGlzdCBzZWdtZW50cyA9IHNo
YXBlSW5zaWRlSW5mby0+Y29tcHV0ZVNlZ21lbnRzRm9yTGluZShsb2dpY2FsVG9wT2Zmc2V0LCBj
aGlsZEJveC0+bG9naWNhbEhlaWdodCgpKTsKLSAgICAgICAgLy8gRklYTUUgQnVnIDEwMjk0OTog
QWRkIHN1cHBvcnQgZm9yIHNoYXBlcyB3aXRoIG11bHRpcGxlIHNlZ21lbnRzLgotICAgICAgICBp
ZiAoc2VnbWVudHMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzZWdtZW50IG9m
ZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjb250ZW50IGJveC4KLSAgICAgICAgICAgIGxvZ2lj
YWxSaWdodE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0ICsgc2VnbWVudHNbMF0ubG9naWNhbFJp
Z2h0OwotICAgICAgICAgICAgbG9naWNhbExlZnRPZmZzZXQgKz0gc2VnbWVudHNbMF0ubG9naWNh
bExlZnQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICBsb2dpY2FsUmln
aHRPZmZzZXQgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BPZmZzZXQp
OwotCi0gICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxXaWR0aCA9IG1pbihmbG9hdGluZ09iamVj
dC0+bG9naWNhbFdpZHRoKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpLCBsb2dpY2FsUmlnaHRP
ZmZzZXQgLSBsb2dpY2FsTGVmdE9mZnNldCk7IC8vIFRoZSB3aWR0aCB3ZSBsb29rIGZvci4KLQot
ICAgIExheW91dFVuaXQgZmxvYXRMb2dpY2FsTGVmdDsKLQotICAgIGJvb2wgaW5zaWRlRmxvd1Ro
cmVhZCA9IGZsb3dUaHJlYWRDb250YWluaW5nQmxvY2soKTsKLQotICAgIGlmIChjaGlsZEJveC0+
c3R5bGUoKS0+ZmxvYXRpbmcoKSA9PSBMZWZ0RmxvYXQpIHsKLSAgICAgICAgTGF5b3V0VW5pdCBo
ZWlnaHRSZW1haW5pbmdMZWZ0ID0gMTsKLSAgICAgICAgTGF5b3V0VW5pdCBoZWlnaHRSZW1haW5p
bmdSaWdodCA9IDE7Ci0gICAgICAgIGZsb2F0TG9naWNhbExlZnQgPSBsb2dpY2FsTGVmdE9mZnNl
dEZvckxpbmVJZ25vcmluZ1NoYXBlT3V0c2lkZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVm
dE9mZnNldCwgZmFsc2UsICZoZWlnaHRSZW1haW5pbmdMZWZ0KTsKLSAgICAgICAgd2hpbGUgKGxv
Z2ljYWxSaWdodE9mZnNldEZvckxpbmVJZ25vcmluZ1NoYXBlT3V0c2lkZShsb2dpY2FsVG9wT2Zm
c2V0LCBsb2dpY2FsUmlnaHRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nUmlnaHQpIC0g
ZmxvYXRMb2dpY2FsTGVmdCA8IGZsb2F0TG9naWNhbFdpZHRoKSB7Ci0gICAgICAgICAgICBsb2dp
Y2FsVG9wT2Zmc2V0ICs9IG1pbihoZWlnaHRSZW1haW5pbmdMZWZ0LCBoZWlnaHRSZW1haW5pbmdS
aWdodCk7Ci0gICAgICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0ID0gbG9naWNhbExlZnRPZmZzZXRG
b3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9mZnNldCwgbG9naWNhbExlZnRP
ZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nTGVmdCk7Ci0gICAgICAgICAgICBpZiAoaW5z
aWRlRmxvd1RocmVhZCkgewotICAgICAgICAgICAgICAgIC8vIEhhdmUgdG8gcmUtZXZhbHVhdGUg
YWxsIG9mIG91ciBvZmZzZXRzLCBzaW5jZSB0aGV5IG1heSBoYXZlIGNoYW5nZWQuCi0gICAgICAg
ICAgICAgICAgbG9naWNhbFJpZ2h0T2Zmc2V0ID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yQ29udGVu
dChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFydCBvZiByaWdodCBvZmZzZXQuCi0g
ICAgICAgICAgICAgICAgbG9naWNhbExlZnRPZmZzZXQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckNv
bnRlbnQobG9naWNhbFRvcE9mZnNldCk7IC8vIENvbnN0YW50IHBhcnQgb2YgbGVmdCBvZmZzZXQu
Ci0gICAgICAgICAgICAgICAgZmxvYXRMb2dpY2FsV2lkdGggPSBtaW4oZmxvYXRpbmdPYmplY3Qt
PmxvZ2ljYWxXaWR0aChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSwgbG9naWNhbFJpZ2h0T2Zm
c2V0IC0gbG9naWNhbExlZnRPZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
ICAgIGZsb2F0TG9naWNhbExlZnQgPSBtYXgobG9naWNhbExlZnRPZmZzZXQgLSBib3JkZXJBbmRQ
YWRkaW5nTG9naWNhbExlZnQoKSwgZmxvYXRMb2dpY2FsTGVmdCk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgTGF5b3V0VW5pdCBoZWlnaHRSZW1haW5pbmdMZWZ0ID0gMTsKLSAgICAgICAgTGF5b3V0
VW5pdCBoZWlnaHRSZW1haW5pbmdSaWdodCA9IDE7Ci0gICAgICAgIGZsb2F0TG9naWNhbExlZnQg
PSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRv
cE9mZnNldCwgbG9naWNhbFJpZ2h0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFpbmluZ1JpZ2h0
KTsKLSAgICAgICAgd2hpbGUgKGZsb2F0TG9naWNhbExlZnQgLSBsb2dpY2FsTGVmdE9mZnNldEZv
ckxpbmVJZ25vcmluZ1NoYXBlT3V0c2lkZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9m
ZnNldCwgZmFsc2UsICZoZWlnaHRSZW1haW5pbmdMZWZ0KSA8IGZsb2F0TG9naWNhbFdpZHRoKSB7
Ci0gICAgICAgICAgICBsb2dpY2FsVG9wT2Zmc2V0ICs9IG1pbihoZWlnaHRSZW1haW5pbmdMZWZ0
LCBoZWlnaHRSZW1haW5pbmdSaWdodCk7Ci0gICAgICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0ID0g
bG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BP
ZmZzZXQsIGxvZ2ljYWxSaWdodE9mZnNldCwgZmFsc2UsICZoZWlnaHRSZW1haW5pbmdSaWdodCk7
Ci0gICAgICAgICAgICBpZiAoaW5zaWRlRmxvd1RocmVhZCkgewotICAgICAgICAgICAgICAgIC8v
IEhhdmUgdG8gcmUtZXZhbHVhdGUgYWxsIG9mIG91ciBvZmZzZXRzLCBzaW5jZSB0aGV5IG1heSBo
YXZlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgbG9naWNhbFJpZ2h0T2Zmc2V0ID0gbG9naWNh
bFJpZ2h0T2Zmc2V0Rm9yQ29udGVudChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFy
dCBvZiByaWdodCBvZmZzZXQuCi0gICAgICAgICAgICAgICAgbG9naWNhbExlZnRPZmZzZXQgPSBs
b2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7IC8vIENvbnN0YW50
IHBhcnQgb2YgbGVmdCBvZmZzZXQuCi0gICAgICAgICAgICAgICAgZmxvYXRMb2dpY2FsV2lkdGgg
PSBtaW4oZmxvYXRpbmdPYmplY3QtPmxvZ2ljYWxXaWR0aChpc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpKSwgbG9naWNhbFJpZ2h0T2Zmc2V0IC0gbG9naWNhbExlZnRPZmZzZXQpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgICAgIGZsb2F0TG9naWNhbExlZnQgLT0gZmxvYXRpbmdPYmpl
Y3QtPmxvZ2ljYWxXaWR0aChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsgLy8gVXNlIHRoZSBv
cmlnaW5hbCB3aWR0aCBvZiB0aGUgZmxvYXQgaGVyZSwgc2luY2UgdGhlIGxvY2FsIHZhcmlhYmxl
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyB8ZmxvYXRMb2dpY2FsV2lkdGh8IHdhcyBjYXBwZWQgdG8gdGhlIGF2YWls
YWJsZSBsaW5lIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGZhc3QvYmxvY2svZmxvYXQvY2xhbXBl
ZC1yaWdodC1mbG9hdC5odG1sLgotICAgIH0KLSAgICAKLSAgICByZXR1cm4gTGF5b3V0UG9pbnQo
ZmxvYXRMb2dpY2FsTGVmdCwgbG9naWNhbFRvcE9mZnNldCk7Ci19Ci0KLWJvb2wgUmVuZGVyQmxv
Y2s6OnBvc2l0aW9uTmV3RmxvYXRzKCkKLXsKLSAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxv
YXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgaWYgKGZsb2F0
aW5nT2JqZWN0U2V0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8g
SWYgYWxsIGZsb2F0cyBoYXZlIGFscmVhZHkgYmVlbiBwb3NpdGlvbmVkLCB0aGVuIHdlIGhhdmUg
bm8gd29yayB0byBkby4KLSAgICBpZiAoZmxvYXRpbmdPYmplY3RTZXQubGFzdCgpLT5pc1BsYWNl
ZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNb3ZlIGJhY2t3YXJkcyB0aHJv
dWdoIG91ciBmbG9hdGluZyBvYmplY3QgbGlzdCB1bnRpbCB3ZSBmaW5kIGEgZmxvYXQgdGhhdCBo
YXMKLSAgICAvLyBhbHJlYWR5IGJlZW4gcG9zaXRpb25lZC4gIFRoZW4gd2UnbGwgYmUgYWJsZSB0
byBtb3ZlIGZvcndhcmQsIHBvc2l0aW9uaW5nIGFsbCBvZgotICAgIC8vIHRoZSBuZXcgZmxvYXRz
IHRoYXQgbmVlZCBpdC4KLSAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0g
ICAgLS1pdDsgLy8gR28gdG8gbGFzdCBpdGVtLgotICAgIGF1dG8gYmVnaW4gPSBmbG9hdGluZ09i
amVjdFNldC5iZWdpbigpOwotICAgIEZsb2F0aW5nT2JqZWN0KiBsYXN0UGxhY2VkRmxvYXRpbmdP
YmplY3QgPSAwOwotICAgIHdoaWxlIChpdCAhPSBiZWdpbikgewotICAgICAgICAtLWl0OwotICAg
ICAgICBpZiAoKCppdCktPmlzUGxhY2VkKCkpIHsKLSAgICAgICAgICAgIGxhc3RQbGFjZWRGbG9h
dGluZ09iamVjdCA9IGl0LT5nZXQoKTsKLSAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IGxv
Z2ljYWxIZWlnaHQoKTsKLSAgICAKLSAgICAvLyBUaGUgZmxvYXQgY2Fubm90IHN0YXJ0IGFib3Zl
IHRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGxhc3QgcG9zaXRpb25lZCBmbG9hdC4KLSAgICBpZiAo
bGFzdFBsYWNlZEZsb2F0aW5nT2JqZWN0KQotICAgICAgICBsb2dpY2FsVG9wID0gbWF4KGxhc3RQ
bGFjZWRGbG9hdGluZ09iamVjdC0+bG9naWNhbFRvcChpc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KSwgbG9naWNhbFRvcCk7Ci0KLSAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgp
OwotICAgIC8vIE5vdyB3YWxrIHRocm91Z2ggdGhlIHNldCBvZiB1bnBvc2l0aW9uZWQgZmxvYXRz
IGFuZCBwbGFjZSB0aGVtLgotICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAg
RmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOwotICAgICAgICAvLyBU
aGUgY29udGFpbmluZyBibG9jayBpcyByZXNwb25zaWJsZSBmb3IgcG9zaXRpb25pbmcgZmxvYXRz
LCBzbyBpZiB3ZSBoYXZlIGZsb2F0cyBpbiBvdXIKLSAgICAgICAgLy8gbGlzdCB0aGF0IGNvbWUg
ZnJvbSBzb21ld2hlcmUgZWxzZSwgZG8gbm90IGF0dGVtcHQgdG8gcG9zaXRpb24gdGhlbS4KLSAg
ICAgICAgaWYgKGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmNvbnRhaW5pbmdCbG9jaygpICE9
IHRoaXMpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBSZW5kZXJCb3gqIGNoaWxk
Qm94ID0gJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpOwotCi0gICAgICAgIExheW91dFVuaXQg
Y2hpbGRMb2dpY2FsTGVmdE1hcmdpbiA9IHN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSA/IG1hcmdpblN0YXJ0Rm9yQ2hpbGQoY2hpbGRCb3gpIDogbWFyZ2luRW5kRm9yQ2hpbGQoY2hp
bGRCb3gpOwotCi0gICAgICAgIExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkQm94LT5mcmFtZVJl
Y3QoKTsKLQotICAgICAgICBpZiAoY2hpbGRCb3gtPnN0eWxlKCktPmNsZWFyKCkgJiBDTEVGVCkK
LSAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZs
b2F0aW5nT2JqZWN0OjpGbG9hdExlZnQpLCBsb2dpY2FsVG9wKTsKLSAgICAgICAgaWYgKGNoaWxk
Qm94LT5zdHlsZSgpLT5jbGVhcigpICYgQ1JJR0hUKQotICAgICAgICAgICAgbG9naWNhbFRvcCA9
IG1heChsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQp
LCBsb2dpY2FsVG9wKTsKLQotICAgICAgICBMYXlvdXRQb2ludCBmbG9hdExvZ2ljYWxMb2NhdGlv
biA9IGNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9hdChmbG9hdGluZ09iamVjdCwgbG9naWNh
bFRvcCk7Ci0KLSAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxMZWZ0KGZsb2F0TG9n
aWNhbExvY2F0aW9uLngoKSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7Ci0KLSAgICAgICAg
c2V0TG9naWNhbExlZnRGb3JDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueCgp
ICsgY2hpbGRMb2dpY2FsTGVmdE1hcmdpbik7Ci0gICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGls
ZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueSgpICsgbWFyZ2luQmVmb3JlRm9yQ2hp
bGQoY2hpbGRCb3gpKTsKLQotICAgICAgICBlc3RpbWF0ZVJlZ2lvblJhbmdlRm9yQm94Q2hpbGQo
Y2hpbGRCb3gpOwotCi0gICAgICAgIExheW91dFN0YXRlKiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5s
YXlvdXRTdGF0ZSgpOwotICAgICAgICBib29sIGlzUGFnaW5hdGVkID0gbGF5b3V0U3RhdGUtPmlz
UGFnaW5hdGVkKCk7Ci0gICAgICAgIGlmIChpc1BhZ2luYXRlZCAmJiAhY2hpbGRCb3gtPm5lZWRz
TGF5b3V0KCkpCi0gICAgICAgICAgICBjaGlsZEJveC0+bWFya0ZvclBhZ2luYXRpb25SZWxheW91
dElmTmVlZGVkKCk7Ci0gICAgICAgIAotICAgICAgICBjaGlsZEJveC0+bGF5b3V0SWZOZWVkZWQo
KTsKLQotICAgICAgICBpZiAoaXNQYWdpbmF0ZWQpIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGFy
ZSB1bnNwbGl0dGFibGUgYW5kIGRvbid0IGZpdCwgdGhlbiB3ZSBuZWVkIHRvIG1vdmUgZG93bi4K
LSAgICAgICAgICAgIC8vIFdlIGluY2x1ZGUgb3VyIG1hcmdpbnMgYXMgcGFydCBvZiB0aGUgdW5z
cGxpdHRhYmxlIGFyZWEuCi0gICAgICAgICAgICBMYXlvdXRVbml0IG5ld0xvZ2ljYWxUb3AgPSBh
ZGp1c3RGb3JVbnNwbGl0dGFibGVDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24u
eSgpLCB0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGhhdmUg
YSBwYWdpbmF0aW9uIHN0cnV0IHRoYXQgaXMgbWFraW5nIHVzIG1vdmUgZG93biBmdXJ0aGVyLgot
ICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGFuIHVuc3BsaXR0YWJsZSBjaGlsZCBjYW4ndCBhbHNv
IGhhdmUgYSBwYWdpbmF0aW9uIHN0cnV0LCBzbyB0aGlzIGlzCi0gICAgICAgICAgICAvLyBleGNs
dXNpdmUgd2l0aCB0aGUgY2FzZSBhYm92ZS4KLSAgICAgICAgICAgIFJlbmRlckJsb2NrKiBjaGls
ZEJsb2NrID0gY2hpbGRCb3gtPmlzUmVuZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGRC
b3gpIDogMDsKLSAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrICYmIGNoaWxkQmxvY2stPnBhZ2lu
YXRpb25TdHJ1dCgpKSB7Ci0gICAgICAgICAgICAgICAgbmV3TG9naWNhbFRvcCArPSBjaGlsZEJs
b2NrLT5wYWdpbmF0aW9uU3RydXQoKTsKLSAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5zZXRQ
YWdpbmF0aW9uU3RydXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIGlmIChuZXdMb2dpY2FsVG9wICE9IGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSkgewotICAg
ICAgICAgICAgICAgIGZsb2F0aW5nT2JqZWN0LT5zZXRQYWdpbmF0aW9uU3RydXQobmV3TG9naWNh
bFRvcCAtIGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSk7Ci0KLSAgICAgICAgICAgICAgICBmbG9h
dExvZ2ljYWxMb2NhdGlvbiA9IGNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9hdChmbG9hdGlu
Z09iamVjdCwgbmV3TG9naWNhbFRvcCk7Ci0gICAgICAgICAgICAgICAgZmxvYXRpbmdPYmplY3Qt
PnNldExvZ2ljYWxMZWZ0KGZsb2F0TG9naWNhbExvY2F0aW9uLngoKSwgaXNIb3Jpem9udGFsV3Jp
dGluZ01vZGUoKSk7Ci0KLSAgICAgICAgICAgICAgICBzZXRMb2dpY2FsTGVmdEZvckNoaWxkKGNo
aWxkQm94LCBmbG9hdExvZ2ljYWxMb2NhdGlvbi54KCkgKyBjaGlsZExvZ2ljYWxMZWZ0TWFyZ2lu
KTsKLSAgICAgICAgICAgICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0
TG9naWNhbExvY2F0aW9uLnkoKSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkQm94KSk7Ci0g
ICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrKQotICAgICAgICAgICAgICAg
ICAgICBjaGlsZEJsb2NrLT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7Ci0gICAg
ICAgICAgICAgICAgY2hpbGRCb3gtPmxheW91dElmTmVlZGVkKCk7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIGlmICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxkKGNoaWxkQm94KSkg
ewotICAgICAgICAgICAgICAgIGNoaWxkQm94LT5zZXROZWVkc0xheW91dChNYXJrT25seVRoaXMp
OwotICAgICAgICAgICAgICAgIGNoaWxkQm94LT5sYXlvdXRJZk5lZWRlZCgpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxUb3Ao
ZmxvYXRMb2dpY2FsTG9jYXRpb24ueSgpLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKLQot
ICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0Rm9y
Q2hpbGQoY2hpbGRCb3gpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGRCb3gpICsgbWFyZ2lu
QWZ0ZXJGb3JDaGlsZChjaGlsZEJveCksIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotCi0g
ICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5hZGRQbGFjZWRPYmplY3QoZmxvYXRpbmdPYmplY3Qp
OwotCi0gICAgICAgIC8vIElmIHRoZSBjaGlsZCBtb3ZlZCwgd2UgaGF2ZSB0byByZXBhaW50IGl0
LgotICAgICAgICBpZiAoY2hpbGRCb3gtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQot
ICAgICAgICAgICAgY2hpbGRCb3gtPnJlcGFpbnREdXJpbmdMYXlvdXRJZk1vdmVkKG9sZFJlY3Qp
OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6bmV3TGlu
ZShFQ2xlYXIgY2xlYXIpCi17Ci0gICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKLSAgICAvLyBzZXQg
eSBwb3NpdGlvbgotICAgIExheW91dFVuaXQgbmV3WSA9IDA7Ci0gICAgc3dpdGNoIChjbGVhcikK
LSAgICB7Ci0gICAgICAgIGNhc2UgQ0xFRlQ6Ci0gICAgICAgICAgICBuZXdZID0gbG93ZXN0Rmxv
YXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0OjpGbG9hdExlZnQpOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ1JJR0hUOgotICAgICAgICAgICAgbmV3WSA9IGxvd2VzdEZs
b2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRSaWdodCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBDQk9USDoKLSAgICAgICAgICAgIG5ld1kgPSBsb3dlc3RG
bG9hdExvZ2ljYWxCb3R0b20oKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICBpZiAoaGVpZ2h0KCkgPCBuZXdZKQotICAgICAgICBzZXRMb2dpY2FsSGVp
Z2h0KG5ld1kpOwotfQotCiB2b2lkIFJlbmRlckJsb2NrOjphZGRQZXJjZW50SGVpZ2h0RGVzY2Vu
ZGFudChSZW5kZXJCb3gqIGRlc2NlbmRhbnQpCiB7CiAgICAgaW5zZXJ0SW50b1RyYWNrZWRSZW5k
ZXJlck1hcHMoZGVzY2VuZGFudCwgZ1BlcmNlbnRIZWlnaHREZXNjZW5kYW50c01hcCwgZ1BlcmNl
bnRIZWlnaHRDb250YWluZXJNYXApOwpAQCAtMzY1MywxNCArMzE4MCw2IEBAIExheW91dFVuaXQg
UmVuZGVyQmxvY2s6OmxvZ2ljYWxSaWdodE9mZnNldEZvckNvbnRlbnQoUmVuZGVyUmVnaW9uKiBy
ZWdpb24pIGNvbnN0CiAgICAgcmV0dXJuIGxvZ2ljYWxSaWdodE9mZnNldCAtIChsb2dpY2FsV2lk
dGgoKSAtIChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpID8gYm94UmVjdC5tYXhYKCkgOiBib3hS
ZWN0Lm1heFkoKSkpOwogfQogCi1MYXlvdXRVbml0IFJlbmRlckJsb2NrOjpsb2dpY2FsTGVmdEZs
b2F0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRP
ZmZzZXQsIExheW91dFVuaXQqIGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVp
Z2h0LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKLXsKLSAg
ICBpZiAobV9mbG9hdGluZ09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPmhhc0xlZnRPYmpl
Y3RzKCkpCi0gICAgICAgIHJldHVybiBtX2Zsb2F0aW5nT2JqZWN0cy0+bG9naWNhbExlZnRPZmZz
ZXQoZml4ZWRPZmZzZXQsIGxvZ2ljYWxUb3AsIGxvZ2ljYWxIZWlnaHQsIG9mZnNldE1vZGUsIGhl
aWdodFJlbWFpbmluZyk7Ci0KLSAgICByZXR1cm4gZml4ZWRPZmZzZXQ7Ci19Ci0KIExheW91dFVu
aXQgUmVuZGVyQmxvY2s6OmFkanVzdExvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0
IG9mZnNldEZyb21GbG9hdHMsIGJvb2wgYXBwbHlUZXh0SW5kZW50KSBjb25zdAogewogICAgIExh
eW91dFVuaXQgbGVmdCA9IG9mZnNldEZyb21GbG9hdHM7CkBAIC0zNzAxLDE0ICszMjIwLDYgQEAg
TGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6YWRqdXN0TG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKExh
eW91dFVuaXQgb2Zmc2V0RnJvbUZsb2EKICAgICByZXR1cm4gbGVmdDsKIH0KIAotTGF5b3V0VW5p
dCBSZW5kZXJCbG9jazo6bG9naWNhbFJpZ2h0RmxvYXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQg
bG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0VW5pdCogaGVpZ2h0UmVt
YWluaW5nLCBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0
TW9kZSBvZmZzZXRNb2RlKSBjb25zdAotewotICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiBt
X2Zsb2F0aW5nT2JqZWN0cy0+aGFzUmlnaHRPYmplY3RzKCkpCi0gICAgICAgIHJldHVybiBtX2Zs
b2F0aW5nT2JqZWN0cy0+bG9naWNhbFJpZ2h0T2Zmc2V0KGZpeGVkT2Zmc2V0LCBsb2dpY2FsVG9w
LCBsb2dpY2FsSGVpZ2h0LCBvZmZzZXRNb2RlLCBoZWlnaHRSZW1haW5pbmcpOwotCi0gICAgcmV0
dXJuIGZpeGVkT2Zmc2V0OwotfQotCiBMYXlvdXRVbml0IFJlbmRlckJsb2NrOjphZGp1c3RMb2dp
Y2FsUmlnaHRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgb2Zmc2V0RnJvbUZsb2F0cywgYm9vbCBh
cHBseVRleHRJbmRlbnQpIGNvbnN0CiB7CiAgICAgTGF5b3V0VW5pdCByaWdodCA9IG9mZnNldEZy
b21GbG9hdHM7CkBAIC0zNzQ5LDQ2ICszMjYwLDYgQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6
YWRqdXN0TG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IG9mZnNldEZyb21GbG8K
ICAgICByZXR1cm4gcmlnaHQ7CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6Om5leHRGbG9h
dExvZ2ljYWxCb3R0b21CZWxvdyhMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0c2lk
ZUZsb2F0T2Zmc2V0TW9kZSBvZmZzZXRNb2RlKSBjb25zdAotewotICAgIGlmICghbV9mbG9hdGlu
Z09iamVjdHMpCi0gICAgICAgIHJldHVybiBsb2dpY2FsSGVpZ2h0OwotCi0gICAgTGF5b3V0VW5p
dCBib3R0b20gPSBMYXlvdXRVbml0OjptYXgoKTsKLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNl
dCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgYXV0
byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBmbG9h
dGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgRmxvYXRp
bmdPYmplY3QqIHIgPSBpdC0+Z2V0KCk7Ci0gICAgICAgIExheW91dFVuaXQgZmxvYXRCb3R0b207
Ci0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi0gICAgICAgIFNoYXBlT3V0c2lkZUluZm8qIHNoYXBl
T3V0c2lkZSA9IHItPnJlbmRlcmVyKCkuc2hhcGVPdXRzaWRlSW5mbygpOwotICAgICAgICBpZiAo
b2Zmc2V0TW9kZSA9PSBTaGFwZU91dHNpZGVGbG9hdFNoYXBlT2Zmc2V0ICYmIHNoYXBlT3V0c2lk
ZSkKLSAgICAgICAgICAgIGZsb2F0Qm90dG9tID0gci0+bG9naWNhbFRvcChpc0hvcml6b250YWxX
cml0aW5nTW9kZSgpKSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKCYoci0+cmVuZGVyZXIoKSkpICsg
c2hhcGVPdXRzaWRlLT5zaGFwZUxvZ2ljYWxCb3R0b20oKTsKLSAgICAgICAgZWxzZQotI2VuZGlm
Ci0gICAgICAgICAgICBmbG9hdEJvdHRvbSA9IHItPmxvZ2ljYWxCb3R0b20oaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSk7Ci0gICAgICAgIGlmIChmbG9hdEJvdHRvbSA+IGxvZ2ljYWxIZWlnaHQp
Ci0gICAgICAgICAgICBib3R0b20gPSBtaW4oZmxvYXRCb3R0b20sIGJvdHRvbSk7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGJvdHRvbSA9PSBMYXlvdXRVbml0OjptYXgoKSA/IExheW91dFVuaXQoKSA6
IGJvdHRvbTsKLX0KLQotTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6bG93ZXN0RmxvYXRMb2dpY2Fs
Qm90dG9tKEZsb2F0aW5nT2JqZWN0OjpUeXBlIGZsb2F0VHlwZSkgY29uc3QKLXsKLSAgICBpZiAo
IW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICByZXR1cm4gMDsKLSAgICBMYXlvdXRVbml0IGxv
d2VzdEZsb2F0Qm90dG9tID0gMDsKLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRp
bmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgYXV0byBlbmQgPSBm
bG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVj
dFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgRmxvYXRpbmdPYmplY3Qq
IHIgPSBpdC0+Z2V0KCk7Ci0gICAgICAgIGlmIChyLT5pc1BsYWNlZCgpICYmIHItPnR5cGUoKSAm
IGZsb2F0VHlwZSkKLSAgICAgICAgICAgIGxvd2VzdEZsb2F0Qm90dG9tID0gbWF4KGxvd2VzdEZs
b2F0Qm90dG9tLCByLT5sb2dpY2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpKTsK
LSAgICB9Ci0gICAgcmV0dXJuIGxvd2VzdEZsb2F0Qm90dG9tOwotfQotCiB2b2lkIFJlbmRlckJs
b2NrOjptYXJrTGluZXNEaXJ0eUluQmxvY2tSYW5nZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExh
eW91dFVuaXQgbG9naWNhbEJvdHRvbSwgUm9vdElubGluZUJveCogaGlnaGVzdCkKIHsKICAgICBp
ZiAobG9naWNhbFRvcCA+PSBsb2dpY2FsQm90dG9tKQpAQCAtMzgwNywyNDIgKzMyNzgsMTIgQEAg
dm9pZCBSZW5kZXJCbG9jazo6bWFya0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UoTGF5b3V0VW5pdCBs
b2dpY2FsVG9wLCBMYXlvdXRVbml0IGwKICAgICB9CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyQmxv
Y2s6OmFkZE92ZXJoYW5naW5nRmxvYXRzKFJlbmRlckJsb2NrKiBjaGlsZCwgYm9vbCBtYWtlQ2hp
bGRQYWludE90aGVyRmxvYXRzKQotewotICAgIC8vIFByZXZlbnQgZmxvYXRzIGZyb20gYmVpbmcg
YWRkZWQgdG8gdGhlIGNhbnZhcyBieSB0aGUgcm9vdCBlbGVtZW50LCBlLmcuLCA8aHRtbD4uCi0g
ICAgaWYgKGNoaWxkLT5oYXNPdmVyZmxvd0NsaXAoKSB8fCAhY2hpbGQtPmNvbnRhaW5zRmxvYXRz
KCkgfHwgY2hpbGQtPmlzUm9vdCgpIHx8IGNoaWxkLT5oYXNDb2x1bW5zKCkgfHwgY2hpbGQtPmlz
V3JpdGluZ01vZGVSb290KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgTGF5b3V0VW5pdCBj
aGlsZExvZ2ljYWxUb3AgPSBjaGlsZC0+bG9naWNhbFRvcCgpOwotICAgIExheW91dFVuaXQgY2hp
bGRMb2dpY2FsTGVmdCA9IGNoaWxkLT5sb2dpY2FsTGVmdCgpOwotICAgIExheW91dFVuaXQgbG93
ZXN0RmxvYXRMb2dpY2FsQm90dG9tID0gMDsKLQotICAgIC8vIEZsb2F0cyB0aGF0IHdpbGwgcmVt
YWluIHRoZSBjaGlsZCdzIHJlc3BvbnNpYmlsaXR5IHRvIHBhaW50IHNob3VsZCBmYWN0b3IgaW50
byBpdHMKLSAgICAvLyBvdmVyZmxvdy4KLSAgICBhdXRvIGNoaWxkRW5kID0gY2hpbGQtPm1fZmxv
YXRpbmdPYmplY3RzLT5zZXQoKS5lbmQoKTsKLSAgICBmb3IgKGF1dG8gY2hpbGRJdCA9IGNoaWxk
LT5tX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuYmVnaW4oKTsgY2hpbGRJdCAhPSBjaGlsZEVuZDsg
KytjaGlsZEl0KSB7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gY2hpbGRJdC0+Z2V0KCk7
Ci0gICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbUZvckZsb2F0ID0gbWluKHItPmxvZ2lj
YWxCb3R0b20oaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSksIExheW91dFVuaXQ6Om1heCgpIC0g
Y2hpbGRMb2dpY2FsVG9wKTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0gY2hp
bGRMb2dpY2FsVG9wICsgbG9naWNhbEJvdHRvbUZvckZsb2F0OwotICAgICAgICBsb3dlc3RGbG9h
dExvZ2ljYWxCb3R0b20gPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tLCBsb2dpY2FsQm90
dG9tKTsKLQotICAgICAgICBpZiAobG9naWNhbEJvdHRvbSA+IGxvZ2ljYWxIZWlnaHQoKSkgewot
ICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxpc3QsIHdlIGFkZCBp
dCBub3cuCi0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zRmxvYXQoJnItPnJlbmRlcmVyKCkpKSB7
Ci0gICAgICAgICAgICAgICAgTGF5b3V0U2l6ZSBvZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpID8gTGF5b3V0U2l6ZSgtY2hpbGRMb2dpY2FsTGVmdCwgLWNoaWxkTG9naWNhbFRvcCkg
OiBMYXlvdXRTaXplKC1jaGlsZExvZ2ljYWxUb3AsIC1jaGlsZExvZ2ljYWxMZWZ0KTsKLSAgICAg
ICAgICAgICAgICBib29sIHNob3VsZFBhaW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAv
LyBUaGUgbmVhcmVzdCBlbmNsb3NpbmcgbGF5ZXIgYWx3YXlzIHBhaW50cyB0aGUgZmxvYXQgKHNv
IHRoYXQgemluZGV4IGFuZCBzdGFja2luZwotICAgICAgICAgICAgICAgIC8vIGJlaGF2ZXMgcHJv
cGVybHkpLiAgV2UgYWx3YXlzIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBkZXNpcmUgdG8gcGFpbnQg
dGhlIGZsb2F0IGFzCi0gICAgICAgICAgICAgICAgLy8gZmFyIG91dCBhcyB3ZSBjYW4sIHRvIHRo
ZSBvdXRlcm1vc3QgYmxvY2sgdGhhdCBvdmVybGFwcyB0aGUgZmxvYXQsIHN0b3BwaW5nIG9ubHkK
LSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoaXQgYSBzZWxmLXBhaW50aW5nIGxheWVyIGJvdW5k
YXJ5LgotICAgICAgICAgICAgICAgIGlmIChyLT5yZW5kZXJlcigpLmVuY2xvc2luZ0Zsb2F0UGFp
bnRpbmdMYXllcigpID09IGVuY2xvc2luZ0Zsb2F0UGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIHItPnNldFNob3VsZFBhaW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAg
ICAgc2hvdWxkUGFpbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAvLyBXZSBjcmVhdGUgdGhlIGZsb2F0aW5nIG9iamVjdCBsaXN0IGxhemlseS4KLSAgICAgICAg
ICAgICAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICAgICAgICAgICAgICBjcmVh
dGVGbG9hdGluZ09iamVjdHMoKTsKLQotICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3Rz
LT5hZGQoci0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCwgc2hvdWxkUGFpbnQsIHRydWUpKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYWtlQ2hp
bGRQYWludE90aGVyRmxvYXRzICYmICFyLT5zaG91bGRQYWludCgpICYmICFyLT5yZW5kZXJlcigp
Lmhhc1NlbGZQYWludGluZ0xheWVyKCkKLSAgICAgICAgICAgICAgICAmJiByLT5yZW5kZXJlcigp
LmlzRGVzY2VuZGFudE9mKGNoaWxkKSAmJiByLT5yZW5kZXJlcigpLmVuY2xvc2luZ0Zsb2F0UGFp
bnRpbmdMYXllcigpID09IGNoaWxkLT5lbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSkgewot
ICAgICAgICAgICAgICAgIC8vIFRoZSBmbG9hdCBpcyBub3Qgb3ZlcmhhbmdpbmcgZnJvbSB0aGlz
IGJsb2NrLCBzbyBpZiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGNoaWxkLCB0aGUgY2hpbGQg
c2hvdWxkCi0gICAgICAgICAgICAgICAgLy8gcGFpbnQgaXQgKHRoZSBvdGhlciBjYXNlIGlzIHRo
YXQgaXQgaXMgaW50cnVkaW5nIGludG8gdGhlIGNoaWxkKSwgdW5sZXNzIGl0IGhhcyBpdHMgb3du
IGxheWVyIG9yIGVuY2xvc2luZwotICAgICAgICAgICAgICAgIC8vIGxheWVyLgotICAgICAgICAg
ICAgICAgIC8vIElmIG1ha2VDaGlsZFBhaW50T3RoZXJGbG9hdHMgaXMgZmFsc2UsIGl0IG1lYW5z
IHRoYXQgdGhlIGNoaWxkIG11c3QgYWxyZWFkeSBrbm93IGFib3V0IGFsbCB0aGUgZmxvYXRzCi0g
ICAgICAgICAgICAgICAgLy8gaXQgc2hvdWxkIHBhaW50LgotICAgICAgICAgICAgICAgIHItPnNl
dFNob3VsZFBhaW50KHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAg
ICAgICAvLyBTaW5jZSB0aGUgZmxvYXQgZG9lc24ndCBvdmVyaGFuZywgaXQgZGlkbid0IGdldCBw
dXQgaW50byBvdXIgbGlzdC4gIFdlIG5lZWQgdG8gZ28gYWhlYWQgYW5kIGFkZCBpdHMgb3ZlcmZs
b3cgaW4gdG8gdGhlCi0gICAgICAgICAgICAvLyBjaGlsZCBub3cuCi0gICAgICAgICAgICBpZiAo
ci0+aXNEZXNjZW5kYW50KCkpCi0gICAgICAgICAgICAgICAgY2hpbGQtPmFkZE92ZXJmbG93RnJv
bUNoaWxkKCZyLT5yZW5kZXJlcigpLCBMYXlvdXRTaXplKHhQb3NpdGlvbkZvckZsb2F0SW5jbHVk
aW5nTWFyZ2luKHIpLCB5UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSkpOwotICAg
ICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b207Ci19Ci0K
LWJvb2wgUmVuZGVyQmxvY2s6Omhhc092ZXJoYW5naW5nRmxvYXQoUmVuZGVyQm94KiByZW5kZXJl
cikKLXsKLSAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzIHx8IGhhc0NvbHVtbnMoKSB8fCAhcGFy
ZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0
U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICBh
dXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZmluZDxSZW5kZXJCb3gmLCBGbG9hdGluZ09iamVj
dEhhc2hUcmFuc2xhdG9yPigqcmVuZGVyZXIpOwotICAgIGlmIChpdCA9PSBmbG9hdGluZ09iamVj
dFNldC5lbmQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuICgqaXQpLT5s
b2dpY2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpID4gbG9naWNhbEhlaWdodCgp
OwotfQotCi12b2lkIFJlbmRlckJsb2NrOjphZGRJbnRydWRpbmdGbG9hdHMoUmVuZGVyQmxvY2sq
IHByZXYsIExheW91dFVuaXQgbG9naWNhbExlZnRPZmZzZXQsIExheW91dFVuaXQgbG9naWNhbFRv
cE9mZnNldCkKLXsKLSAgICBBU1NFUlQoIWF2b2lkc0Zsb2F0cygpKTsKLQotICAgIC8vIElmIHRo
ZSBwYXJlbnQgb3IgcHJldmlvdXMgc2libGluZyBkb2Vzbid0IGhhdmUgYW55IGZsb2F0cyB0byBh
ZGQsIGRvbid0IGJvdGhlci4KLSAgICBpZiAoIXByZXYtPm1fZmxvYXRpbmdPYmplY3RzKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBsb2dpY2FsTGVmdE9mZnNldCArPSBtYXJnaW5Mb2dpY2FsTGVm
dCgpOwotCi0gICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIHByZXZTZXQgPSBwcmV2LT5tX2Zs
b2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgYXV0byBwcmV2RW5kID0gcHJldlNldC5lbmQoKTsK
LSAgICBmb3IgKGF1dG8gcHJldkl0ID0gcHJldlNldC5iZWdpbigpOyBwcmV2SXQgIT0gcHJldkVu
ZDsgKytwcmV2SXQpIHsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIHIgPSBwcmV2SXQtPmdldCgp
OwotICAgICAgICBpZiAoci0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KSA+IGxvZ2ljYWxUb3BPZmZzZXQpIHsKLSAgICAgICAgICAgIGlmICghbV9mbG9hdGluZ09iamVj
dHMgfHwgIW1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5jb250YWluczxGbG9hdGluZ09iamVjdCYs
IEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+KCpyKSkgewotICAgICAgICAgICAgICAgIC8v
IFdlIGNyZWF0ZSB0aGUgZmxvYXRpbmcgb2JqZWN0IGxpc3QgbGF6aWx5LgotICAgICAgICAgICAg
ICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZs
b2F0aW5nT2JqZWN0cygpOwotCi0gICAgICAgICAgICAgICAgLy8gQXBwbHlpbmcgdGhlIGNoaWxk
J3MgbWFyZ2luIG1ha2VzIG5vIHNlbnNlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBjaGlsZCB3YXMg
cGFzc2VkIGluLgotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgbWFyZ2luIHdhcyBhZGRl
ZCBhbHJlYWR5IHRocm91Z2ggdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgfGxvZ2ljYWxMZWZ0T2Zm
c2V0fCB2YXJpYWJsZQotICAgICAgICAgICAgICAgIC8vIGFib3ZlLiAgfGxvZ2ljYWxMZWZ0T2Zm
c2V0fCB3aWxsIGVxdWFsIHRoZSBtYXJnaW4gaW4gdGhpcyBjYXNlLCBzbyBpdCdzIGFscmVhZHkg
YmVlbiB0YWtlbgotICAgICAgICAgICAgICAgIC8vIGludG8gYWNjb3VudC4gIE9ubHkgYXBwbHkg
dGhpcyBjb2RlIGlmIHByZXYgaXMgdGhlIHBhcmVudCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0
IG1hcmdpbgotICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGFwcGxpZWQgdHdpY2UuCi0gICAg
ICAgICAgICAgICAgTGF5b3V0U2l6ZSBvZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgp
Ci0gICAgICAgICAgICAgICAgICAgID8gTGF5b3V0U2l6ZShsb2dpY2FsTGVmdE9mZnNldCAtIChw
cmV2ICE9IHBhcmVudCgpID8gcHJldi0+bWFyZ2luTGVmdCgpIDogTGF5b3V0VW5pdCgpKSwgbG9n
aWNhbFRvcE9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgOiBMYXlvdXRTaXplKGxvZ2ljYWxU
b3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0IC0gKHByZXYgIT0gcGFyZW50KCkgPyBwcmV2LT5t
YXJnaW5Ub3AoKSA6IExheW91dFVuaXQoKSkpOwotCi0gICAgICAgICAgICAgICAgbV9mbG9hdGlu
Z09iamVjdHMtPmFkZChyLT5jb3B5VG9OZXdDb250YWluZXIob2Zmc2V0KSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIGJvb2wgUmVuZGVyQmxvY2s6OmF2b2lkc0Zsb2F0
cygpIGNvbnN0CiB7CiAgICAgLy8gRmxvYXRzIGNhbid0IGludHJ1ZGUgaW50byBvdXIgYm94IGlm
IHdlIGhhdmUgYSBub24tYXV0byBjb2x1bW4gY291bnQgb3Igd2lkdGguCiAgICAgcmV0dXJuIFJl
bmRlckJveDo6YXZvaWRzRmxvYXRzKCkgfHwgIXN0eWxlKCktPmhhc0F1dG9Db2x1bW5Db3VudCgp
IHx8ICFzdHlsZSgpLT5oYXNBdXRvQ29sdW1uV2lkdGgoKTsKIH0KIAotYm9vbCBSZW5kZXJCbG9j
azo6Y29udGFpbnNGbG9hdChSZW5kZXJCb3gqIHJlbmRlcmVyKSBjb25zdAotewotICAgIHJldHVy
biBtX2Zsb2F0aW5nT2JqZWN0cyAmJiBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuY29udGFpbnM8
UmVuZGVyQm94JiwgRmxvYXRpbmdPYmplY3RIYXNoVHJhbnNsYXRvcj4oKnJlbmRlcmVyKTsKLX0K
LQotdm9pZCBSZW5kZXJCbG9jazo6bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91
dChSZW5kZXJCb3gqIGZsb2F0VG9SZW1vdmUsIGJvb2wgaW5MYXlvdXQpCi17Ci0gICAgaWYgKCFl
dmVySGFkTGF5b3V0KCkgJiYgIWNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIE1hcmtpbmdCZWhhdmlvciBtYXJrUGFyZW50cyA9IGluTGF5b3V0ID8gTWFya09ubHlUaGlz
IDogTWFya0NvbnRhaW5pbmdCbG9ja0NoYWluOwotICAgIHNldENoaWxkTmVlZHNMYXlvdXQobWFy
a1BhcmVudHMpOwotIAotICAgIGlmIChmbG9hdFRvUmVtb3ZlKQotICAgICAgICByZW1vdmVGbG9h
dGluZ09iamVjdChmbG9hdFRvUmVtb3ZlKTsKLQotICAgIC8vIEl0ZXJhdGUgb3ZlciBvdXIgY2hp
bGRyZW4gYW5kIG1hcmsgdGhlbSBhcyBuZWVkZWQuCi0gICAgaWYgKCFjaGlsZHJlbklubGluZSgp
KSB7Ci0gICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hp
bGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmICgoIWZs
b2F0VG9SZW1vdmUgJiYgY2hpbGQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkg
fHwgIWNoaWxkLT5pc1JlbmRlckJsb2NrKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICBSZW5kZXJCbG9jayogY2hpbGRCbG9jayA9IHRvUmVuZGVyQmxvY2soY2hpbGQp
OwotICAgICAgICAgICAgaWYgKChmbG9hdFRvUmVtb3ZlID8gY2hpbGRCbG9jay0+Y29udGFpbnNG
bG9hdChmbG9hdFRvUmVtb3ZlKSA6IGNoaWxkQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpIHx8IGNo
aWxkQmxvY2stPnNocmlua1RvQXZvaWRGbG9hdHMoKSkKLSAgICAgICAgICAgICAgICBjaGlsZEJs
b2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUs
IGluTGF5b3V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6bWFy
a1NpYmxpbmdzV2l0aEZsb2F0c0ZvckxheW91dChSZW5kZXJCb3gqIGZsb2F0VG9SZW1vdmUpCi17
Ci0gICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29u
c3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVj
dHMtPnNldCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0KLSAg
ICBmb3IgKFJlbmRlck9iamVjdCogbmV4dCA9IG5leHRTaWJsaW5nKCk7IG5leHQ7IG5leHQgPSBu
ZXh0LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIGlmICghbmV4dC0+aXNSZW5kZXJCbG9jaygp
IHx8IG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCB0b1JlbmRlckJs
b2NrKG5leHQpLT5hdm9pZHNGbG9hdHMoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgIFJlbmRlckJsb2NrKiBuZXh0QmxvY2sgPSB0b1JlbmRlckJsb2NrKG5leHQpOwotICAgICAg
ICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKLSAgICAgICAgICAgIFJlbmRlckJveCogZmxvYXRpbmdCb3ggPSAmKCppdCktPnJlbmRl
cmVyKCk7Ci0gICAgICAgICAgICBpZiAoZmxvYXRUb1JlbW92ZSAmJiBmbG9hdGluZ0JveCAhPSBm
bG9hdFRvUmVtb3ZlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYg
KG5leHRCbG9jay0+Y29udGFpbnNGbG9hdChmbG9hdGluZ0JveCkpCi0gICAgICAgICAgICAgICAg
bmV4dEJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0aW5n
Qm94KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6Z2V0
Q2xlYXJEZWx0YShSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxUb3ApCi17Ci0g
ICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjb21wdXRlIGNsZWFyYW5jZSBpZiB3ZSBoYXZlIG5v
IGZsb2F0cy4KLSAgICBpZiAoIWNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIHJldHVybiAwOwot
ICAgIAotICAgIC8vIEF0IGxlYXN0IG9uZSBmbG9hdCBpcyBwcmVzZW50LiAgV2UgbmVlZCB0byBw
ZXJmb3JtIHRoZSBjbGVhcmFuY2UgY29tcHV0YXRpb24uCi0gICAgYm9vbCBjbGVhclNldCA9IGNo
aWxkLT5zdHlsZSgpLT5jbGVhcigpICE9IENOT05FOwotICAgIExheW91dFVuaXQgbG9naWNhbEJv
dHRvbSA9IDA7Ci0gICAgc3dpdGNoIChjaGlsZC0+c3R5bGUoKS0+Y2xlYXIoKSkgewotICAgICAg
ICBjYXNlIENOT05FOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xFRlQ6Ci0g
ICAgICAgICAgICBsb2dpY2FsQm90dG9tID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0
aW5nT2JqZWN0OjpGbG9hdExlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
Q1JJR0hUOgotICAgICAgICAgICAgbG9naWNhbEJvdHRvbSA9IGxvd2VzdEZsb2F0TG9naWNhbEJv
dHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRSaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBDQk9USDoKLSAgICAgICAgICAgIGxvZ2ljYWxCb3R0b20gPSBsb3dlc3RGbG9h
dExvZ2ljYWxCb3R0b20oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIFdl
IGFsc28gY2xlYXIgZmxvYXRzIGlmIHdlIGFyZSB0b28gYmlnIHRvIHNpdCBvbiB0aGUgc2FtZSBs
aW5lIGFzIGEgZmxvYXQgKGFuZCB3aXNoIHRvIGF2b2lkIGZsb2F0cyBieSBkZWZhdWx0KS4KLSAg
ICBMYXlvdXRVbml0IHJlc3VsdCA9IGNsZWFyU2V0ID8gbWF4PExheW91dFVuaXQ+KDAsIGxvZ2lj
YWxCb3R0b20gLSBsb2dpY2FsVG9wKSA6IExheW91dFVuaXQoKTsKLSAgICBpZiAoIXJlc3VsdCAm
JiBjaGlsZC0+YXZvaWRzRmxvYXRzKCkpIHsKLSAgICAgICAgTGF5b3V0VW5pdCBuZXdMb2dpY2Fs
VG9wID0gbG9naWNhbFRvcDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIExh
eW91dFVuaXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoQXROZXdMb2dpY2FsVG9wT2Zmc2V0ID0gYXZh
aWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShuZXdMb2dpY2FsVG9wLCBmYWxzZSwgbG9naWNhbEhl
aWdodEZvckNoaWxkKGNoaWxkKSk7Ci0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdp
ZHRoQXROZXdMb2dpY2FsVG9wT2Zmc2V0ID09IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNvbnRl
bnQobmV3TG9naWNhbFRvcCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xvZ2ljYWxUb3Ag
LSBsb2dpY2FsVG9wOwotCi0gICAgICAgICAgICBSZW5kZXJSZWdpb24qIHJlZ2lvbiA9IHJlZ2lv
bkF0QmxvY2tPZmZzZXQobG9naWNhbFRvcEZvckNoaWxkKGNoaWxkKSk7Ci0gICAgICAgICAgICBM
YXlvdXRSZWN0IGJvcmRlckJveCA9IGNoaWxkLT5ib3JkZXJCb3hSZWN0SW5SZWdpb24ocmVnaW9u
LCBEb05vdENhY2hlUmVuZGVyQm94UmVnaW9uSW5mbyk7Ci0gICAgICAgICAgICBMYXlvdXRVbml0
IGNoaWxkTG9naWNhbFdpZHRoQXRPbGRMb2dpY2FsVG9wT2Zmc2V0ID0gaXNIb3Jpem9udGFsV3Jp
dGluZ01vZGUoKSA/IGJvcmRlckJveC53aWR0aCgpIDogYm9yZGVyQm94LmhlaWdodCgpOwotCi0g
ICAgICAgICAgICAvLyBGSVhNRTogTm9uZSBvZiB0aGlzIGlzIHJpZ2h0IGZvciBwZXJwZW5kaWN1
bGFyIHdyaXRpbmctbW9kZSBjaGlsZHJlbi4KLSAgICAgICAgICAgIExheW91dFVuaXQgY2hpbGRP
bGRMb2dpY2FsV2lkdGggPSBjaGlsZC0+bG9naWNhbFdpZHRoKCk7Ci0gICAgICAgICAgICBMYXlv
dXRVbml0IGNoaWxkT2xkTWFyZ2luTGVmdCA9IGNoaWxkLT5tYXJnaW5MZWZ0KCk7Ci0gICAgICAg
ICAgICBMYXlvdXRVbml0IGNoaWxkT2xkTWFyZ2luUmlnaHQgPSBjaGlsZC0+bWFyZ2luUmlnaHQo
KTsKLSAgICAgICAgICAgIExheW91dFVuaXQgY2hpbGRPbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxv
Z2ljYWxUb3AoKTsKLQotICAgICAgICAgICAgY2hpbGQtPnNldExvZ2ljYWxUb3AobmV3TG9naWNh
bFRvcCk7Ci0gICAgICAgICAgICBjaGlsZC0+dXBkYXRlTG9naWNhbFdpZHRoKCk7Ci0gICAgICAg
ICAgICByZWdpb24gPSByZWdpb25BdEJsb2NrT2Zmc2V0KGxvZ2ljYWxUb3BGb3JDaGlsZChjaGls
ZCkpOwotICAgICAgICAgICAgYm9yZGVyQm94ID0gY2hpbGQtPmJvcmRlckJveFJlY3RJblJlZ2lv
bihyZWdpb24sIERvTm90Q2FjaGVSZW5kZXJCb3hSZWdpb25JbmZvKTsKLSAgICAgICAgICAgIExh
eW91dFVuaXQgY2hpbGRMb2dpY2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQgPSBpc0hvcml6
b250YWxXcml0aW5nTW9kZSgpID8gYm9yZGVyQm94LndpZHRoKCkgOiBib3JkZXJCb3guaGVpZ2h0
KCk7Ci0KLSAgICAgICAgICAgIGNoaWxkLT5zZXRMb2dpY2FsVG9wKGNoaWxkT2xkTG9naWNhbFRv
cCk7Ci0gICAgICAgICAgICBjaGlsZC0+c2V0TG9naWNhbFdpZHRoKGNoaWxkT2xkTG9naWNhbFdp
ZHRoKTsKLSAgICAgICAgICAgIGNoaWxkLT5zZXRNYXJnaW5MZWZ0KGNoaWxkT2xkTWFyZ2luTGVm
dCk7Ci0gICAgICAgICAgICBjaGlsZC0+c2V0TWFyZ2luUmlnaHQoY2hpbGRPbGRNYXJnaW5SaWdo
dCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjaGlsZExvZ2ljYWxXaWR0aEF0TmV3
TG9naWNhbFRvcE9mZnNldCA8PSBhdmFpbGFibGVMb2dpY2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BP
ZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBtYXkgbm90IGJlIG1v
dmluZywgaWYgdGhlIGxvZ2ljYWwgd2lkdGggZGlkIHNocmluayBiZWNhdXNlIG9mIHRoZSBwcmVz
ZW5jZSBvZiBuZXcgZmxvYXRzLCB0aGVuCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBm
b3JjZSBhIHJlbGF5b3V0IGFzIHRob3VnaCB3ZSBzaGlmdGVkLiBUaGlzIGhhcHBlbnMgYmVjYXVz
ZSBvZiB0aGUgZHluYW1pYyBhZGRpdGlvbiBvZiBvdmVyaGFuZ2luZyBmbG9hdHMKLSAgICAgICAg
ICAgICAgICAvLyBmcm9tIHByZXZpb3VzIHNpYmxpbmdzIHdoZW4gbmVnYXRpdmUgbWFyZ2lucyBl
eGlzdCBvbiBhIGNoaWxkIChzZWUgdGhlIGFkZE92ZXJoYW5naW5nRmxvYXRzIGNhbGwgYXQgdGhl
IGVuZCBvZiBjb2xsYXBzZU1hcmdpbnMpLgotICAgICAgICAgICAgICAgIGlmIChjaGlsZExvZ2lj
YWxXaWR0aEF0T2xkTG9naWNhbFRvcE9mZnNldCAhPSBjaGlsZExvZ2ljYWxXaWR0aEF0TmV3TG9n
aWNhbFRvcE9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQtPnNldENoaWxkTmVlZHNM
YXlvdXQoTWFya09ubHlUaGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3TG9naWNhbFRv
cCAtIGxvZ2ljYWxUb3A7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ld0xvZ2ljYWxU
b3AgPSBuZXh0RmxvYXRMb2dpY2FsQm90dG9tQmVsb3cobmV3TG9naWNhbFRvcCk7Ci0gICAgICAg
ICAgICBBU1NFUlQobmV3TG9naWNhbFRvcCA+PSBsb2dpY2FsVG9wKTsKLSAgICAgICAgICAgIGlm
IChuZXdMb2dpY2FsVG9wIDwgbG9naWNhbFRvcCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0gICAgcmV0dXJu
IHJlc3VsdDsKLX0KLQogYm9vbCBSZW5kZXJCbG9jazo6aXNQb2ludEluT3ZlcmZsb3dDb250cm9s
KEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgTGF5b3V0UG9pbnQmIGxvY2F0aW9uSW5Db250
YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCkKIHsKICAgICBpZiAo
IXNjcm9sbHNPdmVyZmxvdygpKQpAQCAtNDEyOCwzNCArMzM2OSw2IEBAIGJvb2wgUmVuZGVyQmxv
Y2s6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVz
dWx0JiByZXN1CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFJlbmRlckJsb2NrOjpoaXRU
ZXN0RmxvYXRzKGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiBy
ZXN1bHQsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3Qg
TGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0KQotewotICAgIGlmICghbV9mbG9hdGluZ09i
amVjdHMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIExheW91dFBvaW50IGFkanVzdGVk
TG9jYXRpb24gPSBhY2N1bXVsYXRlZE9mZnNldDsKLSAgICBpZiAoaXNSZW5kZXJWaWV3KCkpCi0g
ICAgICAgIGFkanVzdGVkTG9jYXRpb24gKz0gdG9MYXlvdXRTaXplKHRvUmVuZGVyVmlldygqdGhp
cykuZnJhbWVWaWV3KCkuc2Nyb2xsUG9zaXRpb24oKSk7Ci0KLSAgICBjb25zdCBGbG9hdGluZ09i
amVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0g
ICAgYXV0byBiZWdpbiA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7Ci0gICAgZm9yIChhdXRv
IGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7IGl0ICE9IGJlZ2luOykgewotICAgICAgICAt
LWl0OwotICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7
Ci0gICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+c2hvdWxkUGFpbnQoKSAmJiAhZmxvYXRpbmdP
YmplY3QtPnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAg
TGF5b3V0VW5pdCB4T2Zmc2V0ID0geFBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4oZmxv
YXRpbmdPYmplY3QpIC0gZmxvYXRpbmdPYmplY3QtPnJlbmRlcmVyKCkueCgpOwotICAgICAgICAg
ICAgTGF5b3V0VW5pdCB5T2Zmc2V0ID0geVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4o
ZmxvYXRpbmdPYmplY3QpIC0gZmxvYXRpbmdPYmplY3QtPnJlbmRlcmVyKCkueSgpOwotICAgICAg
ICAgICAgTGF5b3V0UG9pbnQgY2hpbGRQb2ludCA9IGZsaXBGbG9hdEZvcldyaXRpbmdNb2RlRm9y
Q2hpbGQoZmxvYXRpbmdPYmplY3QsIGFkanVzdGVkTG9jYXRpb24gKyBMYXlvdXRTaXplKHhPZmZz
ZXQsIHlPZmZzZXQpKTsKLSAgICAgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIo
KS5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCwgbG9jYXRpb25JbkNvbnRhaW5lciwgY2hpbGRQb2lu
dCkpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgbG9jYXRp
b25JbkNvbnRhaW5lci5wb2ludCgpIC0gdG9MYXlvdXRTaXplKGNoaWxkUG9pbnQpKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogY2xhc3MgQ29sdW1uUmVjdEl0ZXJhdG9yIHsKICAg
ICBXVEZfTUFLRV9OT05DT1BZQUJMRShDb2x1bW5SZWN0SXRlcmF0b3IpOwogcHVibGljOgpAQCAt
NjA2OSw3ICs1MjgyLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRqdXN0Rm9yQm9yZGVyRml0KExh
eW91dFVuaXQgeCwgTGF5b3V0VW5pdCYgbGVmdCwgTGF5b3V0VW5pdCYKICAgICAgICAgZWxzZSB7
CiAgICAgICAgICAgICBmb3IgKFJlbmRlckJveCogb2JqID0gZmlyc3RDaGlsZEJveCgpOyBvYmo7
IG9iaiA9IG9iai0+bmV4dFNpYmxpbmdCb3goKSkgewogICAgICAgICAgICAgICAgIGlmICghb2Jq
LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKG9iai0+aXNSZW5kZXJCbG9ja0Zsb3coKSAmJiAhb2JqLT5oYXNPdmVyZmxvd0NsaXAo
KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iai0+aXNSZW5kZXJCbG9jaygpICYmICFvYmot
Pmhhc092ZXJmbG93Q2xpcCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCbG9j
ayhvYmopLT5hZGp1c3RGb3JCb3JkZXJGaXQoeCArIG9iai0+eCgpLCBsZWZ0LCByaWdodCk7CiAg
ICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iai0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09
IFZJU0lCTEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhIHJlcGxhY2Vk
IGVsZW1lbnQgb3Igc29tZSBraW5kIG9mIG5vbi1ibG9jay1mbG93IG9iamVjdC4KQEAgLTYwNzks
MjEgKzUyOTIsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RGb3JCb3JkZXJGaXQoTGF5b3V0
VW5pdCB4LCBMYXlvdXRVbml0JiBsZWZ0LCBMYXlvdXRVbml0JgogICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1fZmxvYXRp
bmdPYmplY3RzKSB7Ci0gICAgICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRp
bmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgICAgICAgICBhdXRv
IGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOwotICAgICAgICAgICAgZm9yIChhdXRvIGl0
ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
ICAgICAgICAgRmxvYXRpbmdPYmplY3QqIHIgPSBpdC0+Z2V0KCk7Ci0gICAgICAgICAgICAgICAg
Ly8gT25seSBleGFtaW5lIHRoZSBvYmplY3QgaWYgb3VyIG1fc2hvdWxkUGFpbnQgZmxhZyBpcyBz
ZXQuCi0gICAgICAgICAgICAgICAgaWYgKHItPnNob3VsZFBhaW50KCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgTGF5b3V0VW5pdCBmbG9hdExlZnQgPSB4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGlu
Z01hcmdpbihyKSAtIHItPnJlbmRlcmVyKCkueCgpOwotICAgICAgICAgICAgICAgICAgICBMYXlv
dXRVbml0IGZsb2F0UmlnaHQgPSBmbG9hdExlZnQgKyByLT5yZW5kZXJlcigpLndpZHRoKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaW4obGVmdCwgZmxvYXRMZWZ0KTsKLSAgICAgICAg
ICAgICAgICAgICAgcmlnaHQgPSBtYXgocmlnaHQsIGZsb2F0UmlnaHQpOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgIH0KIH0KIApAQCAtNjY3MywxMSAr
NTg3MSw2IEBAIGNvbnN0IGNoYXIqIFJlbmRlckJsb2NrOjpyZW5kZXJOYW1lKCkgY29uc3QKICAg
ICByZXR1cm4gIlJlbmRlckJsb2NrIjsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6Y3JlYXRlRmxv
YXRpbmdPYmplY3RzKCkKLXsKLSAgICBtX2Zsb2F0aW5nT2JqZWN0cyA9IGFkb3B0UHRyKG5ldyBG
bG9hdGluZ09iamVjdHModGhpcywgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkpOwotfQotCiB0
ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhcmFjdGVyVHlwZT4KIHN0YXRpYyBpbmxpbmUgVGV4dFJ1biBj
b25zdHJ1Y3RUZXh0UnVuSW50ZXJuYWwoUmVuZGVyT2JqZWN0KiBjb250ZXh0LCBjb25zdCBGb250
JiBmb250LCBjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoLCBjb25z
dCBSZW5kZXJTdHlsZSYgc3R5bGUsIFRleHRSdW46OkV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lv
bikKIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5o
IGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgKaW5kZXggMjc4ZGZlNmJj
NDU0YTQ5NzRiMThiMjhhZDk3MThmNThlMTM4ODY5Ny4uMzVlOWNiM2ZmMmZiZmU2MThkN2I4ZjJj
YThlMmM3N2Q5NDBjZmQ3NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgK
QEAgLTUzLDcgKzUzLDYgQEAgY2xhc3MgUmVuZGVyVGV4dDsKIAogc3RydWN0IEJpZGlSdW47CiBz
dHJ1Y3QgUGFpbnRJbmZvOwotY2xhc3MgTGluZUJyZWFrZXI7CiBjbGFzcyBMaW5lSW5mbzsKIGNs
YXNzIFJlbmRlclJ1YnlSdW47CiAjaWYgRU5BQkxFKENTU19TSEFQRVMpCkBAIC0xMTgsNyArMTE3
LDcgQEAgcHVibGljOgogICAgIElubGluZUZsb3dCb3gqIGZpcnN0TGluZUJveCgpIGNvbnN0IHsg
cmV0dXJuIG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpOyB9CiAgICAgSW5saW5lRmxvd0JveCog
bGFzdExpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5sYXN0TGluZUJveCgpOyB9
CiAKLSAgICB2b2lkIGRlbGV0ZUxpbmVCb3hUcmVlKCk7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0
ZUxpbmVCb3hUcmVlKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoUmVuZGVyT2JqZWN0
KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApIE9WRVJSSURFOwogICAg
IHZpcnR1YWwgdm9pZCByZW1vdmVDaGlsZChSZW5kZXJPYmplY3QqKSBPVkVSUklERTsKQEAgLTEy
OSw4ICsxMjgsNiBAQCBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQgcmVtb3ZlUG9zaXRpb25lZE9i
amVjdChSZW5kZXJCb3gqKTsKICAgICB2b2lkIHJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKFJlbmRl
ckJsb2NrKiwgQ29udGFpbmluZ0Jsb2NrU3RhdGUgPSBTYW1lQ29udGFpbmluZ0Jsb2NrKTsKIAot
ICAgIHZvaWQgcmVtb3ZlRmxvYXRpbmdPYmplY3RzKCk7Ci0KICAgICBUcmFja2VkUmVuZGVyZXJM
aXN0SGFzaFNldCogcG9zaXRpb25lZE9iamVjdHMoKSBjb25zdDsKICAgICBib29sIGhhc1Bvc2l0
aW9uZWRPYmplY3RzKCkgY29uc3QKICAgICB7CkBAIC0xNjIsMTMgKzE1OSwxMCBAQCBwdWJsaWM6
CiAKICAgICBib29sIGdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxkKFJlbmRlck9iamVj
dCopOwogCi0gICAgdm9pZCBtYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KFJl
bmRlckJveCogZmxvYXRUb1JlbW92ZSA9IDAsIGJvb2wgaW5MYXlvdXQgPSB0cnVlKTsKLSAgICB2
b2lkIG1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlvdXQoUmVuZGVyQm94KiBmbG9hdFRvUmVt
b3ZlID0gMCk7CiAgICAgdm9pZCBtYXJrUG9zaXRpb25lZE9iamVjdHNGb3JMYXlvdXQoKTsKICAg
ICB2aXJ0dWFsIHZvaWQgbWFya0ZvclBhZ2luYXRpb25SZWxheW91dElmTmVlZGVkKCkgT1ZFUlJJ
REUgRklOQUw7CiAgICAgCi0gICAgYm9vbCBjb250YWluc0Zsb2F0cygpIGNvbnN0IHsgcmV0dXJu
IG1fZmxvYXRpbmdPYmplY3RzICYmICFtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuaXNFbXB0eSgp
OyB9Ci0gICAgYm9vbCBjb250YWluc0Zsb2F0KFJlbmRlckJveCopIGNvbnN0OworICAgIHZpcnR1
YWwgYm9vbCBjb250YWluc0Zsb2F0cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgICAv
LyBWZXJzaW9ucyB0aGF0IGNhbiBjb21wdXRlIGxpbmUgb2Zmc2V0cyB3aXRoIHRoZSByZWdpb24g
YW5kIHBhZ2Ugb2Zmc2V0IHBhc3NlZCBpbi4gVXNlZCBmb3Igc3BlZWQgdG8gYXZvaWQgaGF2aW5n
IHRvCiAgICAgLy8gY29tcHV0ZSB0aGUgcmVnaW9uIGFsbCBvdmVyIGFnYWluIHdoZW4geW91IGFs
cmVhZHkga25vdyBpdC4KQEAgLTI5Miw4ICsyODYsNiBAQCBwdWJsaWM6CiAgICAgewogICAgICAg
ICByZXR1cm4gb2JqLT5pc0Zsb2F0aW5nKCkgfHwgKG9iai0+aXNPdXRPZkZsb3dQb3NpdGlvbmVk
KCkgJiYgIW9iai0+c3R5bGUoKS0+aXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCkgJiYgIW9i
ai0+Y29udGFpbmVyKCktPmlzUmVuZGVySW5saW5lKCkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0
aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgaW50IHN0
YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsKIAogICAg
IHN0YXRpYyBUZXh0UnVuIGNvbnN0cnVjdFRleHRSdW4oUmVuZGVyT2JqZWN0KiBjb250ZXh0LCBj
b25zdCBGb250JiwgY29uc3QgU3RyaW5nJiwgY29uc3QgUmVuZGVyU3R5bGUmLAogICAgICAgICBU
ZXh0UnVuOjpFeHBhbnNpb25CZWhhdmlvciA9IFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNp
b24gfCBUZXh0UnVuOjpGb3JiaWRMZWFkaW5nRXhwYW5zaW9uLCBUZXh0UnVuRmxhZ3MgPSBEZWZh
dWx0VGV4dFJ1bkZsYWdzKTsKQEAgLTUxMywxMSArNTA1LDExIEBAIHByb3RlY3RlZDoKICAgICB2
b2lkIHNldERlc2lyZWRDb2x1bW5Db3VudEFuZFdpZHRoKGludCwgTGF5b3V0VW5pdCk7CiAKIHB1
YmxpYzoKLSAgICB2b2lkIGNvbXB1dGVPdmVyZmxvdyhMYXlvdXRVbml0IG9sZENsaWVudEFmdGVy
RWRnZSwgYm9vbCByZWNvbXB1dGVGbG9hdHMgPSBmYWxzZSk7CisgICAgdmlydHVhbCB2b2lkIGNv
bXB1dGVPdmVyZmxvdyhMYXlvdXRVbml0IG9sZENsaWVudEFmdGVyRWRnZSwgYm9vbCByZWNvbXB1
dGVGbG9hdHMgPSBmYWxzZSk7CiAgICAgdm9pZCBjbGVhckxheW91dE92ZXJmbG93KCk7CiBwcm90
ZWN0ZWQ6CiAgICAgdmlydHVhbCB2b2lkIGFkZE92ZXJmbG93RnJvbUNoaWxkcmVuKCk7Ci0gICAg
dm9pZCBhZGRPdmVyZmxvd0Zyb21GbG9hdHMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkT3ZlcmZs
b3dGcm9tRmxvYXRzKCkgeyB9OwogICAgIHZvaWQgYWRkT3ZlcmZsb3dGcm9tUG9zaXRpb25lZE9i
amVjdHMoKTsKICAgICB2b2lkIGFkZE92ZXJmbG93RnJvbUJsb2NrQ2hpbGRyZW4oKTsKICAgICB2
b2lkIGFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCk7CkBAIC01MzcsOCArNTI5LDggQEAg
cHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9pZCBjaGVja0ZvclBhZ2luYXRpb25Mb2dpY2FsSGVp
Z2h0Q2hhbmdlKExheW91dFVuaXQmIHBhZ2VMb2dpY2FsSGVpZ2h0LCBib29sJiBwYWdlTG9naWNh
bEhlaWdodENoYW5nZWQsIGJvb2wmIGhhc1NwZWNpZmllZFBhZ2VMb2dpY2FsSGVpZ2h0KTsKIAog
cHJpdmF0ZToKLSAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9yTGluZShM
YXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQq
IGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBTaGFwZU91dHNpZGVG
bG9hdE9mZnNldE1vZGUpIGNvbnN0OwotICAgIExheW91dFVuaXQgbG9naWNhbExlZnRGbG9hdE9m
ZnNldEZvckxpbmUoTGF5b3V0VW5pdCBsb2dpY2FsVG9wLCBMYXlvdXRVbml0IGZpeGVkT2Zmc2V0
LCBMYXlvdXRVbml0KiBoZWlnaHRSZW1haW5pbmcsIExheW91dFVuaXQgbG9naWNhbEhlaWdodCwg
U2hhcGVPdXRzaWRlRmxvYXRPZmZzZXRNb2RlKSBjb25zdDsKKyAgICB2aXJ0dWFsIExheW91dFVu
aXQgbG9naWNhbFJpZ2h0RmxvYXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQsIExheW91dFVuaXQg
Zml4ZWRPZmZzZXQsIExheW91dFVuaXQqLCBMYXlvdXRVbml0LCBTaGFwZU91dHNpZGVGbG9hdE9m
ZnNldE1vZGUpIGNvbnN0IHsgcmV0dXJuIGZpeGVkT2Zmc2V0OyB9OworICAgIHZpcnR1YWwgTGF5
b3V0VW5pdCBsb2dpY2FsTGVmdEZsb2F0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0LCBMYXlvdXRV
bml0IGZpeGVkT2Zmc2V0LCBMYXlvdXRVbml0KiwgTGF5b3V0VW5pdCwgU2hhcGVPdXRzaWRlRmxv
YXRPZmZzZXRNb2RlKSBjb25zdCB7IHJldHVybiBmaXhlZE9mZnNldDsgfQogICAgIExheW91dFVu
aXQgYWRqdXN0TG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IG9mZnNldEZyb21G
bG9hdHMsIGJvb2wgYXBwbHlUZXh0SW5kZW50KSBjb25zdDsKICAgICBMYXlvdXRVbml0IGFkanVz
dExvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IG9mZnNldEZyb21GbG9hdHMsIGJv
b2wgYXBwbHlUZXh0SW5kZW50KSBjb25zdDsKIApAQCAtNTU2LDcgKzU0OCw3IEBAIHByaXZhdGU6
CiAgICAgdm9pZCBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUoUmVuZGVyT2JqZWN0KiBpbnNlcnRpb25Q
b2ludCA9IDApOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVMZWZ0b3ZlckFub255bW91c0Jsb2Nr
KFJlbmRlckJsb2NrKiBjaGlsZCk7CiAKLSAgICB2b2lkIG1vdmVBbGxDaGlsZHJlbkluY2x1ZGlu
Z0Zsb2F0c1RvKFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBib29sIGZ1bGxSZW1vdmVJbnNlcnQpOwor
ICAgIHZpcnR1YWwgdm9pZCBtb3ZlQWxsQ2hpbGRyZW5PblJlbW92YWxUbyhSZW5kZXJCbG9jayog
dG9CbG9jaywgYm9vbCBmdWxsUmVtb3ZlSW5zZXJ0KSB7IG1vdmVBbGxDaGlsZHJlblRvKHRvQmxv
Y2ssIGZ1bGxSZW1vdmVJbnNlcnQpOyB9CiAKICAgICB2b2lkIGFkZENoaWxkVG9Db250aW51YXRp
b24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7CiAg
ICAgdmlydHVhbCB2b2lkIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0
KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkgT1ZFUlJJREU7CkBAIC01NjYs
MTAgKzU1OCw2IEBAIHByaXZhdGU6CiAgICAgCiAgICAgdmlydHVhbCBib29sIGlzU2VsZkNvbGxh
cHNpbmdCbG9jaygpIGNvbnN0IE9WRVJSSURFIEZJTkFMOwogCi0gICAgdmlydHVhbCB2b2lkIHJl
cGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyhib29sIHBhaW50QWxsRGVzY2VuZGFudHMpIE9WRVJSSURF
IEZJTkFMOwotCi0gICAgQmlkaVJ1biogaGFuZGxlVHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxpc3Q8
QmlkaVJ1bj4mLCBCaWRpQ29udGV4dCopOwotCiAgICAgdm9pZCBpbnNlcnRJbnRvVHJhY2tlZFJl
bmRlcmVyTWFwcyhSZW5kZXJCb3gqIGRlc2NlbmRhbnQsIFRyYWNrZWREZXNjZW5kYW50c01hcCom
LCBUcmFja2VkQ29udGFpbmVyTWFwKiYpOwogICAgIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21UcmFj
a2VkUmVuZGVyZXJNYXBzKFJlbmRlckJveCogZGVzY2VuZGFudCwgVHJhY2tlZERlc2NlbmRhbnRz
TWFwKiYsIFRyYWNrZWRDb250YWluZXJNYXAqJik7CiAKQEAgLTYxNCw2MyArNjAyLDE4IEBAIHBy
aXZhdGU6CiAgICAgICAgICAgICByZXR1cm4gY2hpbGQtPnkoKSArIGNoaWxkLT5yZW5kZXJlcigp
Lm1hcmdpblRvcCgpOwogICAgIH0KIAotICAgIExheW91dFBvaW50IGNvbXB1dGVMb2dpY2FsTG9j
YXRpb25Gb3JGbG9hdChjb25zdCBGbG9hdGluZ09iamVjdCosIExheW91dFVuaXQgbG9naWNhbFRv
cE9mZnNldCkgY29uc3Q7Ci0KLSAgICB2b2lkIGNoZWNrRmxvYXRzSW5DbGVhbkxpbmUoUm9vdElu
bGluZUJveCosIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYsIHNpemVfdCYgZmxvYXRJbmRleCwgYm9v
bCYgZW5jb3VudGVyZWROZXdGbG9hdCwgYm9vbCYgZGlydGllZEJ5RmxvYXQpOwotICAgIFJvb3RJ
bmxpbmVCb3gqIGRldGVybWluZVN0YXJ0UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiwgSW5saW5l
QmlkaVJlc29sdmVyJik7Ci0gICAgdm9pZCBkZXRlcm1pbmVFbmRQb3NpdGlvbihMaW5lTGF5b3V0
U3RhdGUmLCBSb290SW5saW5lQm94KiBzdGFydEJveCwgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGlu
ZVN0YXJ0LCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzKTsKLSAgICBib29sIG1hdGNo
ZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYsIGNvbnN0IElubGluZUJpZGlSZXNvbHZlciYsIGNv
bnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVuZExp
bmVTdGF0dXMpOwotICAgIGJvb2wgY2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKExp
bmVMYXlvdXRTdGF0ZSYpOwotICAgIAotICAgIFJvb3RJbmxpbmVCb3gqIGNvbnN0cnVjdExpbmUo
QmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBjb25zdCBMaW5lSW5mbyYpOwotICAgIElubGluZUZsb3dC
b3gqIGNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqLCBjb25zdCBMaW5lSW5mbyYsIElubGlu
ZUJveCogY2hpbGRCb3gsIGJvb2wgc3RhcnRzTmV3U2VnbWVudCk7Ci0KLSAgICB2b2lkIHNldE1h
cmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qLCBSZW5kZXJSdWJ5UnVuKiwgUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgTGluZUluZm8mKTsKLQotICAgIEJpZGlSdW4qIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Q
b3NpdGlvbnNGb3JTZWdtZW50KFJvb3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIEVUZXh0
QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwKLSAgICAgICAgZmxvYXQmIGF2YWlsYWJsZUxvZ2lj
YWxXaWR0aCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIEds
eXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQ
b3NpdGlvbkNhY2hlJiwgV29yZE1lYXN1cmVtZW50cyYpOwotICAgIHZvaWQgY29tcHV0ZUlubGlu
ZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJbmZv
JiwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVh
Y2hlZEVuZCwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmLCBWZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUmLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9pZCBjb21wdXRlQmxvY2tEaXJl
Y3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBCaWRpUnVuKiwgR2x5cGhPdmVy
Zmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmKTsKLSAgICB2
b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7Ci0gICAgdm9pZCBjaGVja0xpbmVzRm9yVGV4
dE92ZXJmbG93KCk7Ci0KLSAgICAvLyBQb3NpdGlvbnMgbmV3IGZsb2F0cyBhbmQgYWxzbyBhZGp1
c3QgYWxsIGZsb2F0cyBlbmNvdW50ZXJlZCBvbiB0aGUgbGluZSBpZiBhbnkgb2YgdGhlbQotICAg
IC8vIGhhdmUgdG8gbW92ZSB0byB0aGUgbmV4dCBwYWdlL2NvbHVtbi4KLSAgICBib29sIHBvc2l0
aW9uTmV3RmxvYXRPbkxpbmUoRmxvYXRpbmdPYmplY3QqIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVj
dCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZUluZm8mLCBMaW5lV2lkdGgmKTsKLSAg
ICB2b2lkIGFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9hdGluZ09iamVjdCopOwot
Ci0gICAgLy8gRW5kIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIFJlbmRlckJsb2NrTGluZUxheW91
dC5jcHAuCi0KLSAgICB2b2lkIHBhaW50RmxvYXRzKFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBv
aW50JiwgYm9vbCBwcmVzZXJ2ZVBoYXNlID0gZmFsc2UpOworICAgIHZpcnR1YWwgdm9pZCBwYWlu
dEZsb2F0cyhQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIGJvb2wpIHsgfQogICAgIHZv
aWQgcGFpbnRDb250ZW50cyhQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYpOwogICAgIHZv
aWQgcGFpbnRDb2x1bW5Db250ZW50cyhQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIGJv
b2wgcGFpbnRGbG9hdHMgPSBmYWxzZSk7CiAgICAgdm9pZCBwYWludENvbHVtblJ1bGVzKFBhaW50
SW5mbyYsIGNvbnN0IExheW91dFBvaW50Jik7CiAgICAgdm9pZCBwYWludFNlbGVjdGlvbihQYWlu
dEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYpOwogICAgIHZvaWQgcGFpbnRDYXJldChQYWludElu
Zm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIENhcmV0VHlwZSk7CiAKLSAgICBGbG9hdGluZ09iamVj
dCogaW5zZXJ0RmxvYXRpbmdPYmplY3QoUmVuZGVyQm94Kik7Ci0gICAgdm9pZCByZW1vdmVGbG9h
dGluZ09iamVjdChSZW5kZXJCb3gqKTsKLSAgICB2b2lkIHJlbW92ZUZsb2F0aW5nT2JqZWN0c0Jl
bG93KEZsb2F0aW5nT2JqZWN0KiwgaW50IGxvZ2ljYWxPZmZzZXQpOwotICAgIAotICAgIC8vIENh
bGxlZCBmcm9tIGxpbmVXaWR0aCwgdG8gcG9zaXRpb24gdGhlIGZsb2F0cyBhZGRlZCBpbiB0aGUg
bGFzdCBsaW5lLgotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBpdCBoYXMgcG9z
aXRpb25lZCBhbnkgZmxvYXRzLgotICAgIGJvb2wgcG9zaXRpb25OZXdGbG9hdHMoKTsKLQotICAg
IExheW91dFVuaXQgZ2V0Q2xlYXJEZWx0YShSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IHlQ
b3MpOwotCiAgICAgdmlydHVhbCBib29sIGF2b2lkc0Zsb2F0cygpIGNvbnN0IE9WRVJSSURFOwog
Ci0gICAgYm9vbCBoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpIHsgcmV0dXJuIHBhcmVudCgpICYmICFo
YXNDb2x1bW5zKCkgJiYgY29udGFpbnNGbG9hdHMoKSAmJiBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0
b20oKSA+IGxvZ2ljYWxIZWlnaHQoKTsgfQotICAgIGJvb2wgaGFzT3ZlcmhhbmdpbmdGbG9hdChS
ZW5kZXJCb3gqKTsKLSAgICB2b2lkIGFkZEludHJ1ZGluZ0Zsb2F0cyhSZW5kZXJCbG9jayogcHJl
diwgTGF5b3V0VW5pdCB4b2Zmc2V0LCBMYXlvdXRVbml0IHlvZmZzZXQpOwotICAgIExheW91dFVu
aXQgYWRkT3ZlcmhhbmdpbmdGbG9hdHMoUmVuZGVyQmxvY2sqIGNoaWxkLCBib29sIG1ha2VDaGls
ZFBhaW50T3RoZXJGbG9hdHMpOwotCi0gICAgTGF5b3V0VW5pdCBsb3dlc3RGbG9hdExvZ2ljYWxC
b3R0b20oRmxvYXRpbmdPYmplY3Q6OlR5cGUgPSBGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0Umln
aHQpIGNvbnN0OyAKLSAgICBMYXlvdXRVbml0IG5leHRGbG9hdExvZ2ljYWxCb3R0b21CZWxvdyhM
YXlvdXRVbml0LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUgPSBTaGFwZU91dHNpZGVGbG9h
dE1hcmdpbkJveE9mZnNldCkgY29uc3Q7Ci0gICAgCiAgICAgYm9vbCBoaXRUZXN0Q29sdW1ucyhj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRp
b24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9m
ZnNldCwgSGl0VGVzdEFjdGlvbik7CiAgICAgdmlydHVhbCBib29sIGhpdFRlc3RDb250ZW50cyhj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRp
b24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9m
ZnNldCwgSGl0VGVzdEFjdGlvbik7Ci0gICAgYm9vbCBoaXRUZXN0RmxvYXRzKGNvbnN0IEhpdFRl
c3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRp
b25JbkNvbnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0KTsKKyAg
ICB2aXJ0dWFsIGJvb2wgaGl0VGVzdEZsb2F0cyhjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRl
c3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mLCBjb25zdCBMYXlvdXRQb2ludCYpIHsg
cmV0dXJuIGZhbHNlOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNQb2ludEluT3ZlcmZsb3dDb250
cm9sKEhpdFRlc3RSZXN1bHQmLCBjb25zdCBMYXlvdXRQb2ludCYgbG9jYXRpb25JbkNvbnRhaW5l
ciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0KTsKIApAQCAtNzA2LDYgKzY0
OSw3IEBAIHByaXZhdGU6CiAgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdFNlbGVjdGlvbk9mZnNl
dChSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBMYXlvdXRVbml0IHBvc2l0aW9uLCBjb25zdCBMb2dp
Y2FsU2VsZWN0aW9uT2Zmc2V0Q2FjaGVzJik7CiAgICAgTGF5b3V0VW5pdCBsb2dpY2FsUmlnaHRT
ZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgTGF5b3V0VW5pdCBwb3NpdGlv
biwgY29uc3QgTG9naWNhbFNlbGVjdGlvbk9mZnNldENhY2hlcyYpOwogICAgIAorICAgIHZpcnR1
YWwgdm9pZCBjbGlwT3V0RmxvYXRpbmdPYmplY3RzKFJlbmRlckJsb2NrKiwgY29uc3QgUGFpbnRJ
bmZvKiwgY29uc3QgTGF5b3V0UG9pbnQmLCBjb25zdCBMYXlvdXRTaXplJikgeyB9OwogICAgIGZy
aWVuZCBjbGFzcyBMb2dpY2FsU2VsZWN0aW9uT2Zmc2V0Q2FjaGVzOwogCiAgICAgdmlydHVhbCB2
b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgY29uc3QgTGF5b3V0UG9pbnQmIGFj
Y3VtdWxhdGVkT2Zmc2V0KSBjb25zdCBPVkVSUklERTsKQEAgLTcyMSwxMiArNjY1LDEwIEBAIHBy
aXZhdGU6CiAgICAgdm9pZCBhZGp1c3RQb2ludFRvQ29sdW1uQ29udGVudHMoTGF5b3V0UG9pbnQm
KSBjb25zdDsKICAgICAKICAgICB2b2lkIGZpdEJvcmRlclRvTGluZXNJZk5lZWRlZCgpOyAvLyBT
aHJpbmsgdGhlIGJveCBpbiB3aGljaCB0aGUgYm9yZGVyIHBhaW50cyBpZiBib3JkZXItZml0IGlz
IHNldC4KLSAgICB2b2lkIGFkanVzdEZvckJvcmRlckZpdChMYXlvdXRVbml0IHgsIExheW91dFVu
aXQmIGxlZnQsIExheW91dFVuaXQmIHJpZ2h0KSBjb25zdDsgLy8gSGVscGVyIGZ1bmN0aW9uIGZv
ciBib3JkZXJGaXRBZGp1c3QKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Rm9yQm9yZGVyRml0KExh
eW91dFVuaXQgeCwgTGF5b3V0VW5pdCYgbGVmdCwgTGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0OyAv
LyBIZWxwZXIgZnVuY3Rpb24gZm9yIGJvcmRlckZpdEFkanVzdAogCiAgICAgdm9pZCBtYXJrTGlu
ZXNEaXJ0eUluQmxvY2tSYW5nZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgbG9n
aWNhbEJvdHRvbSwgUm9vdElubGluZUJveCogaGlnaGVzdCA9IDApOwogCi0gICAgdm9pZCBuZXdM
aW5lKEVDbGVhcik7Ci0KICAgICBQb3NpdGlvbiBwb3NpdGlvbkZvckJveChJbmxpbmVCb3gqLCBi
b29sIHN0YXJ0ID0gdHJ1ZSkgY29uc3Q7CiAgICAgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uRm9y
UG9pbnRXaXRoSW5saW5lQ2hpbGRyZW4oY29uc3QgTGF5b3V0UG9pbnQmKTsKIApAQCAtNzQ4LDE5
ICs2OTAsNiBAQCBwcml2YXRlOgogICAgIHZvaWQgbW92ZVJ1bkluVW5kZXJTaWJsaW5nQmxvY2tJ
Zk5lZWRlZChSZW5kZXJPYmplY3QqIHJ1bkluKTsKICAgICB2b2lkIG1vdmVSdW5JblRvT3JpZ2lu
YWxQb3NpdGlvbihSZW5kZXJPYmplY3QqIHJ1bkluKTsKIAotICAgIC8vIEhlbHBlciBmdW5jdGlv
biBmb3IgbGF5b3V0SW5saW5lQ2hpbGRyZW4oKQotICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUxp
bmVCb3hlc0Zyb21CaWRpUnVucyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGNvbnN0IElubGluZUl0
ZXJhdG9yJiBlbmQsIExpbmVJbmZvJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgQmlkaVJ1biog
dHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYpOwotICAgIHZvaWQgbGF5b3V0UnVu
c0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmLCBib29sIGhhc0lubGluZUNoaWxkKTsKLSAgICB2
b2lkIGxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlvdXRTdGF0ZSYsIElubGluZUJp
ZGlSZXNvbHZlciYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3Qg
QmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBo
ZW5hdGVkTGluZXMpOwotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotICAgIHZvaWQgdXBkYXRlU2hh
cGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lKFNoYXBlSW5zaWRlSW5mbyomLCBjb25zdCBMYXlv
dXRTaXplJiwgTGluZUxheW91dFN0YXRlJik7Ci0gICAgdm9pZCB1cGRhdGVTaGFwZUFuZFNlZ21l
bnRzRm9yQ3VycmVudExpbmVJbkZsb3dUaHJlYWQoU2hhcGVJbnNpZGVJbmZvKiYsIExpbmVMYXlv
dXRTdGF0ZSYpOwotICAgIGJvb2wgYWRqdXN0TG9naWNhbExpbmVUb3BBbmRMb2dpY2FsSGVpZ2h0
SWZOZWVkZWQoU2hhcGVJbnNpZGVJbmZvKiwgTGF5b3V0VW5pdCwgTGluZUxheW91dFN0YXRlJiwg
SW5saW5lQmlkaVJlc29sdmVyJiwgRmxvYXRpbmdPYmplY3QqLCBJbmxpbmVJdGVyYXRvciYsIFdv
cmRNZWFzdXJlbWVudHMmKTsKLSNlbmRpZgotICAgIGNvbnN0IElubGluZUl0ZXJhdG9yJiByZXN0
YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVpZ2h0
LCBMYXlvdXRVbml0IG5ld0xvZ2ljYWxIZWlnaHQsICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSwgSW5saW5lQmlkaVJlc29sdmVyJiwgIGNvbnN0IElubGluZUl0ZXJh
dG9yJik7Ci0gICAgdm9pZCBsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJik7
Ci0gICAgc3RhdGljIHZvaWQgcmVwYWludERpcnR5RmxvYXRzKFZlY3RvcjxGbG9hdFdpdGhSZWN0
PiYgZmxvYXRzKTsKLQogcHJvdGVjdGVkOgogICAgIHZvaWQgZGlydHlGb3JMYXlvdXRGcm9tUGVy
Y2VudGFnZUhlaWdodERlc2NlbmRhbnRzKCk7CiAgICAgCkBAIC04MjEsOSArNzUwLDcgQEAgcHVi
bGljOgogICAgIC8vIEZJWE1FOiBUaGlzIGlzIHRlbXBvcmFyeSB0byBhbGxvdyB1cyB0byBtb3Zl
IGNvZGUgZnJvbSBSZW5kZXJCbG9jayBpbnRvIFJlbmRlckJsb2NrRmxvdyB0aGF0IGFjY2Vzc2Vz
IG1lbWJlciB2YXJpYWJsZXMgdGhhdCB3ZSBoYXZlbid0IG1vdmVkIG91dCBvZgogICAgIC8vIFJl
bmRlckJsb2NrIHlldC4KICAgICBmcmllbmQgY2xhc3MgUmVuZGVyQmxvY2tGbG93OwotCi1wcm90
ZWN0ZWQ6Ci0gICAgdm9pZCBjcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKKyAgICBmcmllbmQgY2xh
c3MgTGluZUJyZWFrZXI7CiAKIHB1YmxpYzoKICAgICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNv
bWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCkBAIC04NDYsNyArNzcz
LDYgQEAgcHVibGljOgogCiBwcm90ZWN0ZWQ6CiAKLSAgICBPd25QdHI8RmxvYXRpbmdPYmplY3Rz
PiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBPd25QdHI8UmVuZGVyQmxvY2tSYXJlRGF0YT4gbV9y
YXJlRGF0YTsKIAogICAgIFJlbmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBv
ZiB0aGUgcm9vdCBsaW5lIGJveGVzIGNyZWF0ZWQgZm9yIHRoaXMgYmxvY2sgZmxvdy4gIEZvciBl
eGFtcGxlLCA8ZGl2PkhlbGxvPGJyPndvcmxkLjwvZGl2PiB3aWxsIGhhdmUgdHdvIHRvdGFsIGxp
bmVzIGZvciB0aGUgPGRpdj4uCkBAIC04NjYsOCArNzkyLDYgQEAgcHJvdGVjdGVkOgogICAgIC8v
IFJlbmRlclJ1YnlCYXNlIG9iamVjdHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFuZCBtZXJn
ZSwgbW92aW5nIHRoZWlyIGNoaWxkcmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1vdmVDaGls
ZFRvLCBtb3ZlQWxsQ2hpbGRyZW5UbywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSkuCiAgICAg
ZnJpZW5kIGNsYXNzIFJlbmRlclJ1YnlCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBMaW5lQnJlYWtl
cjsKLSAgICBmcmllbmQgY2xhc3MgTGluZVdpZHRoOyAvLyBOZWVkcyB0byBrbm93IEZsb2F0aW5n
T2JqZWN0CiAKIHByaXZhdGU6CiAgICAgLy8gVXNlZCB0byBzdG9yZSBzdGF0ZSBiZXR3ZWVuIHN0
eWxlV2lsbENoYW5nZSBhbmQgc3R5bGVEaWRDaGFuZ2UKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKaW5kZXggNTJlNzEwY2I2Nzk2MGUxYjYxNzg4MjU2YWE2
NmU1YTQ4MDc1ZmM0My4uYThlYmUyZTE5YjI4YTg3YmZlNjFiODhlOGUyZTE5Mjk0NzM3MGFjZSAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKQEAgLTI1
LDYgKzI1LDcgQEAKICNpbmNsdWRlICJSZW5kZXJCbG9ja0Zsb3cuaCIKIAogI2luY2x1ZGUgIkZs
b2F0aW5nT2JqZWN0cy5oIgorI2luY2x1ZGUgIkhpdFRlc3RMb2NhdGlvbi5oIgogI2luY2x1ZGUg
IkxheW91dFJlcGFpbnRlci5oIgogI2luY2x1ZGUgIlJlbmRlckZsb3dUaHJlYWQuaCIKICNpbmNs
dWRlICJSZW5kZXJMYXllci5oIgpAQCAtMzUsNiArMzYsOCBAQCB1c2luZyBuYW1lc3BhY2Ugc3Rk
OwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2Jvb2wgUmVuZGVyQmxvY2s6OnNfY2FuUHJvcGFn
YXRlRmxvYXRJbnRvU2libGluZyA9IGZhbHNlOworCiBzdHJ1Y3QgU2FtZVNpemVBc01hcmdpbklu
Zm8gewogICAgIHVpbnQzMl90IGJpdGZpZWxkcyA6IDE2OwogICAgIExheW91dFVuaXQgbWFyZ2lu
c1syXTsKQEAgLTEzMSwxNiArMTM0LDE2IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpjbGVhckZs
b2F0cygpCiAgICAgLy8gV2Ugc2hvdWxkIG5vdCBwcm9jZXNzIGZsb2F0cyBpZiB0aGUgcGFyZW50
IG5vZGUgaXMgbm90IGEgUmVuZGVyQmxvY2suIE90aGVyd2lzZSwgd2Ugd2lsbCBhZGQgCiAgICAg
Ly8gZmxvYXRzIGluIGFuIGludmFsaWQgY29udGV4dC4gVGhpcyB3aWxsIGNhdXNlIGEgY3Jhc2gg
YXJpc2luZyBmcm9tIGEgYmFkIGNhc3Qgb24gdGhlIHBhcmVudC4KICAgICAvLyBTZWUgPHJkYXI6
Ly9wcm9ibGVtLzgwNDk3NTM+LCB3aGVyZSBmbG9hdCBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGEg
dGV4dCBub2RlIGluIGEgU1ZHLgotICAgIGlmICghcGFyZW50KCkgfHwgIXBhcmVudCgpLT5pc1Jl
bmRlckJsb2NrKCkpCisgICAgaWYgKCFwYXJlbnQoKSB8fCAhcGFyZW50KCktPmlzUmVuZGVyQmxv
Y2tGbG93KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIEF0dGVtcHQgdG8gbG9jYXRlIGEg
cHJldmlvdXMgc2libGluZyB3aXRoIG92ZXJoYW5naW5nIGZsb2F0cy4gV2Ugc2tpcCBhbnkgZWxl
bWVudHMgdGhhdCBhcmUKICAgICAvLyBvdXQgb2YgZmxvdyAobGlrZSBmbG9hdGluZy9wb3NpdGlv
bmVkIGVsZW1lbnRzKSwgYW5kIHdlIGFsc28gc2tpcCBvdmVyIGFueSBvYmplY3RzIHRoYXQgbWF5
IGhhdmUgc2hpZnRlZAogICAgIC8vIHRvIGF2b2lkIGZsb2F0cy4KLSAgICBSZW5kZXJCbG9jayog
cGFyZW50QmxvY2sgPSB0b1JlbmRlckJsb2NrKHBhcmVudCgpKTsKKyAgICBSZW5kZXJCbG9ja0Zs
b3cqIHBhcmVudEJsb2NrID0gdG9SZW5kZXJCbG9ja0Zsb3cocGFyZW50KCkpOwogICAgIGJvb2wg
cGFyZW50SGFzRmxvYXRzID0gZmFsc2U7CiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlv
dXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPck91dE9m
Rmxvd1Bvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9j
aygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgIHdoaWxl
IChwcmV2ICYmIChwcmV2LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgIXBy
ZXYtPmlzQm94KCkgfHwgIXByZXYtPmlzUmVuZGVyQmxvY2tGbG93KCkgfHwgdG9SZW5kZXJCbG9j
a0Zsb3cocHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewogICAgICAgICBpZiAocHJldi0+aXNGbG9h
dGluZygpKQogICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKICAgICAgICAgcHJl
diA9IHByZXYtPnByZXZpb3VzU2libGluZygpOwpAQCAtMTYwLDcgKzE2Myw3IEBAIHZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpjbGVhckZsb2F0cygpCiAgICAgfQogCiAgICAgLy8gQWRkIG92ZXJoYW5n
aW5nIGZsb2F0cyBmcm9tIHRoZSBwcmV2aW91cyBSZW5kZXJCbG9jaywgYnV0IG9ubHkgaWYgaXQg
aGFzIGEgZmxvYXQgdGhhdCBpbnRydWRlcyBpbnRvIG91ciBzcGFjZS4gICAgCi0gICAgUmVuZGVy
QmxvY2sqIGJsb2NrID0gdG9SZW5kZXJCbG9jayhwcmV2KTsKKyAgICBSZW5kZXJCbG9ja0Zsb3cq
IGJsb2NrID0gdG9SZW5kZXJCbG9ja0Zsb3cocHJldik7CiAgICAgaWYgKGJsb2NrLT5tX2Zsb2F0
aW5nT2JqZWN0cyAmJiBibG9jay0+bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBsb2dpY2Fs
VG9wT2Zmc2V0KQogICAgICAgICBhZGRJbnRydWRpbmdGbG9hdHMoYmxvY2ssIGxvZ2ljYWxMZWZ0
T2Zmc2V0LCBsb2dpY2FsVG9wT2Zmc2V0KTsKIApAQCAtMzE3LDcgKzMyMCw3IEBAIHZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpsYXlvdXRCbG9jayhib29sIHJlbGF5b3V0Q2hpbGRyZW4sIExheW91dFVu
aXQgcGFnZUxvZ2ljYWxICiAgICAgICAgICAgICAvLyBPbmUgb2Ygb3VyIGNoaWxkcmVuJ3MgZmxv
YXRzIG1heSBoYXZlIGJlY29tZSBhbiBvdmVyaGFuZ2luZyBmbG9hdCBmb3IgdXMuIFdlIG5lZWQg
dG8gbG9vayBmb3IgaXQuCiAgICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBm
aXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7CiAgICAg
ICAgICAgICAgICAgaWYgKGNoaWxkLT5pc1JlbmRlckJsb2NrRmxvdygpICYmICFjaGlsZC0+aXNG
bG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJl
bmRlckJsb2NrKiBibG9jayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOworICAgICAgICAgICAgICAg
ICAgICBSZW5kZXJCbG9ja0Zsb3cqIGJsb2NrID0gdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpOwog
ICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgp
ICsgYmxvY2stPmxvZ2ljYWxUb3AoKSA+IG5ld0hlaWdodCkKICAgICAgICAgICAgICAgICAgICAg
ICAgIGFkZE92ZXJoYW5naW5nRmxvYXRzKGJsb2NrLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAg
fQpAQCAtNTc3LDcgKzU4MCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRCbG9ja0No
aWxkKFJlbmRlckJveCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sCiAgICAgLy8gSWYg
dGhlIGNoaWxkIGhhcyBvdmVyaGFuZ2luZyBmbG9hdHMgdGhhdCBpbnRydWRlIGludG8gZm9sbG93
aW5nIHNpYmxpbmdzIChvciBwb3NzaWJseSBvdXQKICAgICAvLyBvZiB0aGlzIGJsb2NrKSwgdGhl
biB0aGUgcGFyZW50IGdldHMgbm90aWZpZWQgb2YgdGhlIGZsb2F0cyBub3cuCiAgICAgaWYgKGNo
aWxkQmxvY2tGbG93ICYmIGNoaWxkQmxvY2tGbG93LT5jb250YWluc0Zsb2F0cygpKQotICAgICAg
ICBtYXhGbG9hdExvZ2ljYWxCb3R0b20gPSBtYXgobWF4RmxvYXRMb2dpY2FsQm90dG9tLCBhZGRP
dmVyaGFuZ2luZ0Zsb2F0cyh0b1JlbmRlckJsb2NrKGNoaWxkKSwgIWNoaWxkTmVlZGVkTGF5b3V0
KSk7CisgICAgICAgIG1heEZsb2F0TG9naWNhbEJvdHRvbSA9IG1heChtYXhGbG9hdExvZ2ljYWxC
b3R0b20sIGFkZE92ZXJoYW5naW5nRmxvYXRzKHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKSwgIWNo
aWxkTmVlZGVkTGF5b3V0KSk7CiAKICAgICBpZiAoY2hpbGRPZmZzZXQud2lkdGgoKSB8fCBjaGls
ZE9mZnNldC5oZWlnaHQoKSkgewogICAgICAgICB2aWV3KCkuYWRkTGF5b3V0RGVsdGEoY2hpbGRP
ZmZzZXQpOwpAQCAtODQ2LDcgKzg0OSw3IEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93Ojpj
b2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luCiAgICAg
c2V0TG9naWNhbEhlaWdodChsb2dpY2FsVG9wKTsKICAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBj
aGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7CiAgICAgaWYgKHByZXYgJiYgcHJldi0+aXNSZW5kZXJC
bG9ja0Zsb3coKSAmJiAhcHJldi0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7
Ci0gICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHRvUmVuZGVyQmxvY2socHJldik7CisgICAg
ICAgIFJlbmRlckJsb2NrRmxvdyogYmxvY2sgPSB0b1JlbmRlckJsb2NrRmxvdyhwcmV2KTsKICAg
ICAgICAgaWYgKGJsb2NrLT5jb250YWluc0Zsb2F0cygpICYmICFibG9jay0+YXZvaWRzRmxvYXRz
KCkgJiYgKGJsb2NrLT5sb2dpY2FsVG9wKCkgKyBibG9jay0+bG93ZXN0RmxvYXRMb2dpY2FsQm90
dG9tKCkpID4gbG9naWNhbFRvcCkgCiAgICAgICAgICAgICBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyhi
bG9jaywgZmFsc2UpOwogICAgIH0KQEAgLTkxNSw4ICs5MTgsOCBAQCBMYXlvdXRVbml0IFJlbmRl
ckJsb2NrRmxvdzo6Y2xlYXJGbG9hdHNJZk5lZWRlZChSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5J
bmZvJiBtYQogICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IHlQb3MgKyBoZWlnaHRJbmNyZWFz
ZTsKICAgICAvLyBBZnRlciBtYXJnaW4gY29sbGFwc2luZywgb25lIG9mIG91ciBmbG9hdHMgbWF5
IG5vdyBpbnRydWRlIGludG8gdGhlIGNoaWxkLiBJZiB0aGUgY2hpbGQgZG9lc24ndCBjb250YWlu
IGZsb2F0cyBvZiBpdHMgb3duIGl0CiAgICAgLy8gd29uJ3QgZ2V0IHBpY2tlZCB1cCBmb3IgcmVs
YXlvdXQgZXZlbiB0aG91Z2ggdGhlIGxvZ2ljYWwgdG9wIGVzdGltYXRlIHdhcyB3cm9uZyAtIHNv
IGFkZCB0aGUgbmV3bHkgaW50cnVkaW5nIGZsb2F0IG5vdy4KLSAgICBpZiAoY29udGFpbnNGbG9h
dHMoKSAmJiBjaGlsZC0+aXNSZW5kZXJCbG9jaygpICYmICF0b1JlbmRlckJsb2NrKGNoaWxkKS0+
Y29udGFpbnNGbG9hdHMoKSAmJiAhY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0
TG9naWNhbEJvdHRvbSgpID4gbG9naWNhbFRvcCkKLSAgICAgICAgdG9SZW5kZXJCbG9jayhjaGls
ZCktPmFkZEludHJ1ZGluZ0Zsb2F0cyh0aGlzLCBsb2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQo
KSwgbG9naWNhbFRvcCk7CisgICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgJiYgY2hpbGQtPmlzUmVu
ZGVyQmxvY2tGbG93KCkgJiYgIXRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKS0+Y29udGFpbnNGbG9h
dHMoKSAmJiAhY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRv
bSgpID4gbG9naWNhbFRvcCkKKyAgICAgICAgdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpLT5hZGRJ
bnRydWRpbmdGbG9hdHModGhpcywgbG9naWNhbExlZnRPZmZzZXRGb3JDb250ZW50KCksIGxvZ2lj
YWxUb3ApOwogCiAgICAgcmV0dXJuIGxvZ2ljYWxUb3A7CiB9CkBAIC0xMjcwLDcgKzEyNzMsNyBA
QCBMYXlvdXRVbml0IFJlbmRlckJsb2NrRmxvdzo6YWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRp
b24oTGF5b3V0VW5pdCBsb2dpY2FsVG9wQQogICAgICAgICAKICAgICAgICAgaWYgKGNoaWxkUmVu
ZGVyQmxvY2spIHsKICAgICAgICAgICAgIGlmICghY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGNo
aWxkUmVuZGVyQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgICAgICAgICAgY2hpbGRS
ZW5kZXJCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCgpOworICAg
ICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkUmVuZGVyQmxvY2spLT5tYXJrQWxs
RGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7CiAgICAgICAgICAgICBpZiAoIWNoaWxk
LT5uZWVkc0xheW91dCgpKQogICAgICAgICAgICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlv
blJlbGF5b3V0SWZOZWVkZWQoKTsKICAgICAgICAgfQpAQCAtMTQ4NSw0ICsxNDg4LDg1NiBAQCB2
b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0TGluZUdyaWRCb3goKQogICAgIC8vIHRvIHRoaXMg
Z3JpZC4KIH0KIAorYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmNvbnRhaW5zRmxvYXQoUmVuZGVyQm94
KiByZW5kZXJlcikgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgbV9m
bG9hdGluZ09iamVjdHMtPnNldCgpLmNvbnRhaW5zPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0
SGFzaFRyYW5zbGF0b3I+KCpyZW5kZXJlcik7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpz
dHlsZURpZENoYW5nZShTdHlsZURpZmZlcmVuY2UgZGlmZiwgY29uc3QgUmVuZGVyU3R5bGUqIG9s
ZFN0eWxlKQoreworICAgIFJlbmRlckJsb2NrOjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHls
ZSk7CisgICAgCisgICAgLy8gQWZ0ZXIgb3VyIHN0eWxlIGNoYW5nZWQsIGlmIHdlIGxvc2Ugb3Vy
IGFiaWxpdHkgdG8gcHJvcGFnYXRlIGZsb2F0cyBpbnRvIG5leHQgc2libGluZworICAgIC8vIGJs
b2NrcywgdGhlbiB3ZSBuZWVkIHRvIGZpbmQgdGhlIHRvcCBtb3N0IHBhcmVudCBjb250YWluaW5n
IHRoYXQgb3ZlcmhhbmdpbmcgZmxvYXQgYW5kCisgICAgLy8gdGhlbiBtYXJrIGl0cyBkZXNjZW5k
YW50cyB3aXRoIGZsb2F0cyBmb3IgbGF5b3V0IGFuZCBjbGVhciBhbGwgZmxvYXRzIGZyb20gaXRz
IG5leHQKKyAgICAvLyBzaWJsaW5nIGJsb2NrcyB0aGF0IGV4aXN0IGluIG91ciBmbG9hdGluZyBv
YmplY3RzIGxpc3QuIFNlZSBidWcgNTYyOTkgYW5kIDYyODc1LgorICAgIGJvb2wgY2FuUHJvcGFn
YXRlRmxvYXRJbnRvU2libGluZyA9ICFpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkg
JiYgIWF2b2lkc0Zsb2F0cygpOworICAgIGlmIChkaWZmID09IFN0eWxlRGlmZmVyZW5jZUxheW91
dCAmJiBzX2NhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxpbmcgJiYgIWNhblByb3BhZ2F0ZUZsb2F0
SW50b1NpYmxpbmcgJiYgaGFzT3ZlcmhhbmdpbmdGbG9hdHMoKSkgeworICAgICAgICBSZW5kZXJC
bG9ja0Zsb3cqIHBhcmVudEJsb2NrID0gdGhpczsKKyAgICAgICAgY29uc3QgRmxvYXRpbmdPYmpl
Y3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAg
ICAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworCisgICAgICAgIGZvciAo
UmVuZGVyT2JqZWN0KiBjdXJyID0gcGFyZW50KCk7IGN1cnIgJiYgIWN1cnItPmlzUmVuZGVyVmll
dygpOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5pc1Jl
bmRlckJsb2NrRmxvdygpKSB7CisgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93KiBjdXJy
QmxvY2sgPSB0b1JlbmRlckJsb2NrRmxvdyhjdXJyKTsKKworICAgICAgICAgICAgICAgIGlmIChj
dXJyQmxvY2stPmhhc092ZXJoYW5naW5nRmxvYXRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
Zm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJCb3gmIHJlbmRlcmVyID0gKCppdCkt
PnJlbmRlcmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckJsb2NrLT5oYXNP
dmVyaGFuZ2luZ0Zsb2F0KCZyZW5kZXJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYXJlbnRCbG9jayA9IGN1cnJCbG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBh
cmVudEJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7CisgICAg
ICAgIHBhcmVudEJsb2NrLT5tYXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KCk7CisgICAg
fQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6c3R5bGVXaWxsQ2hhbmdlKFN0eWxlRGlmZmVy
ZW5jZSBkaWZmLCBjb25zdCBSZW5kZXJTdHlsZSogbmV3U3R5bGUpCit7CisgICAgUmVuZGVyU3R5
bGUqIG9sZFN0eWxlID0gc3R5bGUoKTsKKyAgICBzX2NhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxp
bmcgPSBvbGRTdHlsZSA/ICFpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2
b2lkc0Zsb2F0cygpIDogZmFsc2U7CisKKyAgICBpZiAob2xkU3R5bGUgJiYgcGFyZW50KCkgJiYg
ZGlmZiA9PSBTdHlsZURpZmZlcmVuY2VMYXlvdXQgJiYgb2xkU3R5bGUtPnBvc2l0aW9uKCkgIT0g
bmV3U3R5bGUtPnBvc2l0aW9uKCkpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgJiYg
IWlzRmxvYXRpbmcoKSAmJiAhaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgbmV3U3R5bGUtPmhh
c091dE9mRmxvd1Bvc2l0aW9uKCkpCisgICAgICAgICAgICBtYXJrQWxsRGVzY2VuZGFudHNXaXRo
RmxvYXRzRm9yTGF5b3V0KCk7CisgICAgfQorCisgICAgUmVuZGVyQmxvY2s6OnN0eWxlV2lsbENo
YW5nZShkaWZmLCBuZXdTdHlsZSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZWxldGVM
aW5lQm94VHJlZSgpCit7CisgICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIG1fZmxv
YXRpbmdPYmplY3RzLT5jbGVhckxpbmVCb3hUcmVlUG9pbnRlcnMoKTsKKyAgICBSZW5kZXJCbG9j
azo6ZGVsZXRlTGluZUJveFRyZWUoKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6Om1vdmVB
bGxDaGlsZHJlbk9uUmVtb3ZhbFRvKFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBib29sIGZ1bGxSZW1v
dmVJbnNlcnQpCit7CisgICAgUmVuZGVyQmxvY2tGbG93KiB0b0Jsb2NrRmxvdyA9IHRvUmVuZGVy
QmxvY2tGbG93KHRvQmxvY2spOworICAgIG1vdmVBbGxDaGlsZHJlblRvKHRvQmxvY2tGbG93LCBm
dWxsUmVtb3ZlSW5zZXJ0KTsKKworICAgIC8vIFdoZW4gYSBwb3J0aW9uIG9mIHRoZSByZW5kZXIg
dHJlZSBpcyBiZWluZyBkZXRhY2hlZCwgYW5vbnltb3VzIGJsb2NrcworICAgIC8vIHdpbGwgYmUg
Y29tYmluZWQgYXMgdGhlaXIgY2hpbGRyZW4gYXJlIGRlbGV0ZWQuIEluIHRoaXMgcHJvY2Vzcywg
dGhlCisgICAgLy8gYW5vbnltb3VzIGJsb2NrIGxhdGVyIGluIHRoZSB0cmVlIGlzIG1lcmdlZCBp
bnRvIHRoZSBvbmUgcHJlY2VlZGluZyBpdC4KKyAgICAvLyBJdCBjYW4gaGFwcGVuIHRoYXQgdGhl
IGxhdGVyIGJsb2NrICh0aGlzKSBjb250YWlucyBmbG9hdHMgdGhhdCB0aGUKKyAgICAvLyBwcmV2
aW91cyBibG9jayAodG9CbG9ja0Zsb3cpIGRpZCBub3QgY29udGFpbiwgYW5kIHRodXMgYXJlIG5v
dCBpbiB0aGUKKyAgICAvLyBmbG9hdGluZyBvYmplY3RzIGxpc3QgZm9yIHRvQmxvY2tGbG93LiBU
aGlzIGNhbiByZXN1bHQgaW4gdG9CbG9ja0Zsb3cKKyAgICAvLyBjb250YWluaW5nIGZsb2F0cyB0
aGF0IGFyZSBub3QgaW4gaXQncyBmbG9hdGluZyBvYmplY3RzIGxpc3QsIGJ1dCBhcmUgaW4KKyAg
ICAvLyB0aGUgZmxvYXRpbmcgb2JqZWN0cyBsaXN0cyBvZiBzaWJsaW5ncyBhbmQgcGFyZW50cy4g
VGhpcyBjYW4gY2F1c2UKKyAgICAvLyBwcm9ibGVtcyB3aGVuIHRoZSBmbG9hdCBpdHNlbGYgaXMg
ZGVsZXRlZCwgc2luY2UgdGhlIGRlbGV0aW9uIGNvZGUKKyAgICAvLyBhc3N1bWVzIHRoYXQgaWYg
YSBmbG9hdCBpcyBub3QgaW4gaXQncyBjb250YWluaW5nIGJsb2NrJ3MgZmxvYXRpbmcKKyAgICAv
LyBvYmplY3RzIGxpc3QsIGl0IGlzbid0IGluIGFueSBmbG9hdGluZyBvYmplY3RzIGxpc3QuIElu
IG9yZGVyIHRvCisgICAgLy8gcHJlc2VydmUgdGhpcyBjb25kaXRpb24gKHJlbW92aW5nIGl0IGhh
cyBzZXJpb3VzIHBlcmZvcm1hbmNlCisgICAgLy8gaW1wbGljYXRpb25zKSwgd2UgbmVlZCB0byBj
b3B5IHRoZSBmbG9hdGluZyBvYmplY3RzIGZyb20gdGhlIG9sZCBibG9jaworICAgIC8vICh0aGlz
KSB0byB0aGUgbmV3IGJsb2NrICh0b0Jsb2NrRmxvdykuIFRoZSBmbG9hdCdzIG1ldHJpY3Mgd2ls
bCBsaWtlbHkKKyAgICAvLyBhbGwgYmUgd3JvbmcsIGJ1dCBzaW5jZSB0b0Jsb2NrRmxvdyBpcyBh
bHJlYWR5IG1hcmtlZCBmb3IgbGF5b3V0LCB0aGlzCisgICAgLy8gd2lsbCBnZXQgZml4ZWQgYmVm
b3JlIGFueXRoaW5nIGdldHMgZGlzcGxheWVkLgorICAgIC8vIFNlZSBidWcgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNTU2NgorICAgIGlmIChtX2Zsb2F0aW5nT2Jq
ZWN0cykgeworICAgICAgICBpZiAoIXRvQmxvY2tGbG93LT5tX2Zsb2F0aW5nT2JqZWN0cykKKyAg
ICAgICAgICAgIHRvQmxvY2tGbG93LT5jcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKKworICAgICAg
ICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZnJvbUZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9h
dGluZ09iamVjdHMtPnNldCgpOworICAgICAgICBhdXRvIGVuZCA9IGZyb21GbG9hdGluZ09iamVj
dFNldC5lbmQoKTsKKworICAgICAgICBmb3IgKGF1dG8gaXQgPSBmcm9tRmxvYXRpbmdPYmplY3RT
ZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBGbG9hdGluZ09iamVj
dCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7CisKKyAgICAgICAgICAgIC8vIERvbid0IGlu
c2VydCB0aGUgb2JqZWN0IGFnYWluIGlmIGl0J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAorICAgICAg
ICAgICAgaWYgKHRvQmxvY2tGbG93LT5jb250YWluc0Zsb2F0KCZmbG9hdGluZ09iamVjdC0+cmVu
ZGVyZXIoKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHRvQmxv
Y2tGbG93LT5tX2Zsb2F0aW5nT2JqZWN0cy0+YWRkKGZsb2F0aW5nT2JqZWN0LT51bnNhZmVDbG9u
ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92
ZXJmbG93RnJvbUZsb2F0cygpCit7CisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0
U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgIGF1dG8gZW5kID0gZmxvYXRpbmdP
YmplY3RTZXQuZW5kKCk7CisgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVn
aW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQt
PmdldCgpOworICAgICAgICBpZiAoci0+aXNEZXNjZW5kYW50KCkpCisgICAgICAgICAgICBhZGRP
dmVyZmxvd0Zyb21DaGlsZCgmci0+cmVuZGVyZXIoKSwgSW50U2l6ZSh4UG9zaXRpb25Gb3JGbG9h
dEluY2x1ZGluZ01hcmdpbihyKSwgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4ocikp
KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlT3ZlcmZsb3coTGF5
b3V0VW5pdCBvbGRDbGllbnRBZnRlckVkZ2UsIGJvb2wgcmVjb21wdXRlRmxvYXRzKQoreworICAg
IFJlbmRlckJsb2NrOjpjb21wdXRlT3ZlcmZsb3cob2xkQ2xpZW50QWZ0ZXJFZGdlLCByZWNvbXB1
dGVGbG9hdHMpOworCisgICAgaWYgKCFoYXNDb2x1bW5zKCkgJiYgKHJlY29tcHV0ZUZsb2F0cyB8
fCBpc1Jvb3QoKSB8fCBleHBhbmRzVG9FbmNsb3NlT3ZlcmhhbmdpbmdGbG9hdHMoKSB8fCBoYXNT
ZWxmUGFpbnRpbmdMYXllcigpKSkKKyAgICAgICAgYWRkT3ZlcmZsb3dGcm9tRmxvYXRzKCk7Cit9
CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoYm9vbCBw
YWludEFsbERlc2NlbmRhbnRzKQoreworICAgIC8vIFJlcGFpbnQgYW55IG92ZXJoYW5naW5nIGZs
b2F0cyAoaWYgd2Uga25vdyB3ZSdyZSB0aGUgb25lIHRvIHBhaW50IHRoZW0pLgorICAgIC8vIE90
aGVyd2lzZSwgYmFpbCBvdXQuCisgICAgaWYgKCFoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBGSVhNRTogQXZvaWQgZGlzYWJsaW5nIExheW91dFN0YXRl
LiBBdCB0aGUgdmVyeSBsZWFzdCwgZG9uJ3QgZGlzYWJsZSBpdCBmb3IgZmxvYXRzIG9yaWdpbmF0
aW5nCisgICAgLy8gaW4gdGhpcyBibG9jay4gQmV0dGVyIHlldCB3b3VsZCBiZSB0byBwdXNoIGV4
dHJhIHN0YXRlIGZvciB0aGUgY29udGFpbmVycyBvZiBvdGhlciBmbG9hdHMuCisgICAgTGF5b3V0
U3RhdGVEaXNhYmxlciBsYXlvdXRTdGF0ZURpc2FibGVyKCZ2aWV3KCkpOworICAgIGNvbnN0IEZs
b2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5z
ZXQoKTsKKyAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIGZvciAo
YXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewor
ICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7CisgICAg
ICAgIC8vIE9ubHkgcmVwYWludCB0aGUgb2JqZWN0IGlmIGl0IGlzIG92ZXJoYW5naW5nLCBpcyBu
b3QgaW4gaXRzIG93biBsYXllciwgYW5kCisgICAgICAgIC8vIGlzIG91ciByZXNwb25zaWJpbGl0
eSB0byBwYWludCAobV9zaG91bGRQYWludCBpcyBzZXQpLiBXaGVuIHBhaW50QWxsRGVzY2VuZGFu
dHMgaXMgdHJ1ZSwgdGhlIGxhdHRlcgorICAgICAgICAvLyBjb25kaXRpb24gaXMgcmVwbGFjZWQg
d2l0aCBiZWluZyBhIGRlc2NlbmRhbnQgb2YgdXMuCisgICAgICAgIGlmIChmbG9hdGluZ09iamVj
dC0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSA+IGxvZ2ljYWxIZWln
aHQoKQorICAgICAgICAgICAgJiYgIWZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhhc1NlbGZQ
YWludGluZ0xheWVyKCkKKyAgICAgICAgICAgICYmIChmbG9hdGluZ09iamVjdC0+c2hvdWxkUGFp
bnQoKSB8fCAocGFpbnRBbGxEZXNjZW5kYW50cyAmJiBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIo
KS5pc0Rlc2NlbmRhbnRPZih0aGlzKSkpKSB7CisgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+
cmVuZGVyZXIoKS5yZXBhaW50KCk7CisgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+cmVuZGVy
ZXIoKS5yZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoZmFsc2UpOworICAgICAgICB9CisgICAgfQor
fQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6cGFpbnRGbG9hdHMoUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgYm9vbCBwcmVzZXJ2ZVBoYXNlKQor
eworICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybjsKKworICAgIGNv
bnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmpl
Y3RzLT5zZXQoKTsKKyAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAg
IGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBGbG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKKyAgICAgICAgLy8g
T25seSBwYWludCB0aGUgb2JqZWN0IGlmIG91ciBtX3Nob3VsZFBhaW50IGZsYWcgaXMgc2V0Lgor
ICAgICAgICBpZiAoci0+c2hvdWxkUGFpbnQoKSAmJiAhci0+cmVuZGVyZXIoKS5oYXNTZWxmUGFp
bnRpbmdMYXllcigpKSB7CisgICAgICAgICAgICBQYWludEluZm8gY3VycmVudFBhaW50SW5mbyhw
YWludEluZm8pOworICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IHByZXNlcnZl
UGhhc2UgPyBwYWludEluZm8ucGhhc2UgOiBQYWludFBoYXNlQmxvY2tCYWNrZ3JvdW5kOworICAg
ICAgICAgICAgLy8gRklYTUU6IExheW91dFBvaW50IHZlcnNpb24gb2YgeFBvc2l0aW9uRm9yRmxv
YXRJbmNsdWRpbmdNYXJnaW4gd291bGQgbWFrZSB0aGlzIG11Y2ggY2xlYW5lci4KKyAgICAgICAg
ICAgIExheW91dFBvaW50IGNoaWxkUG9pbnQgPSBmbGlwRmxvYXRGb3JXcml0aW5nTW9kZUZvckNo
aWxkKHIsIExheW91dFBvaW50KHBhaW50T2Zmc2V0LngoKSArIHhQb3NpdGlvbkZvckZsb2F0SW5j
bHVkaW5nTWFyZ2luKHIpIC0gci0+cmVuZGVyZXIoKS54KCksIHBhaW50T2Zmc2V0LnkoKSArIHlQ
b3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIpIC0gci0+cmVuZGVyZXIoKS55KCkpKTsK
KyAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5mbywgY2hpbGRQ
b2ludCk7CisgICAgICAgICAgICBpZiAoIXByZXNlcnZlUGhhc2UpIHsKKyAgICAgICAgICAgICAg
ICBjdXJyZW50UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5k
czsKKyAgICAgICAgICAgICAgICByLT5yZW5kZXJlcigpLnBhaW50KGN1cnJlbnRQYWludEluZm8s
IGNoaWxkUG9pbnQpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQYWludEluZm8ucGhhc2UgPSBQ
YWludFBoYXNlRmxvYXQ7CisgICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5wYWludChjdXJy
ZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFpbnRJ
bmZvLnBoYXNlID0gUGFpbnRQaGFzZUZvcmVncm91bmQ7CisgICAgICAgICAgICAgICAgci0+cmVu
ZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKKyAgICAgICAgICAg
ICAgICBjdXJyZW50UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZU91dGxpbmU7CisgICAgICAg
ICAgICAgICAgci0+cmVuZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6Y2xpcE91dEZsb2F0aW5nT2JqZWN0cyhSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBj
b25zdCBQYWludEluZm8qIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHJvb3RCbG9ja1Bo
eXNpY2FsUG9zaXRpb24sIGNvbnN0IExheW91dFNpemUmIG9mZnNldEZyb21Sb290QmxvY2spCit7
CisgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKSB7CisgICAgICAgIGNvbnN0IEZsb2F0aW5nT2Jq
ZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAg
ICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICAgICAgZm9yIChh
dXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7Cisg
ICAgICAgICAgICBMYXlvdXRSZWN0IGZsb2F0Qm94KG9mZnNldEZyb21Sb290QmxvY2sud2lkdGgo
KSArIHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSwKKyAg
ICAgICAgICAgICAgICBvZmZzZXRGcm9tUm9vdEJsb2NrLmhlaWdodCgpICsgeVBvc2l0aW9uRm9y
RmxvYXRJbmNsdWRpbmdNYXJnaW4oZmxvYXRpbmdPYmplY3QpLAorICAgICAgICAgICAgICAgIGZs
b2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLndpZHRoKCksIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJl
cigpLmhlaWdodCgpKTsKKyAgICAgICAgICAgIHJvb3RCbG9jay0+ZmxpcEZvcldyaXRpbmdNb2Rl
KGZsb2F0Qm94KTsKKyAgICAgICAgICAgIGZsb2F0Qm94Lm1vdmUocm9vdEJsb2NrUGh5c2ljYWxQ
b3NpdGlvbi54KCksIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRpb24ueSgpKTsKKyAgICAgICAgICAg
IHBhaW50SW5mby0+Y29udGV4dC0+Y2xpcE91dChwaXhlbFNuYXBwZWRJbnRSZWN0KGZsb2F0Qm94
KSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVG
bG9hdGluZ09iamVjdHMoKQoreworICAgIG1fZmxvYXRpbmdPYmplY3RzID0gYWRvcHRQdHIobmV3
IEZsb2F0aW5nT2JqZWN0cyh0aGlzLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSk7Cit9CisK
K3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHMoKQoreworICAgIGlm
ICghbV9mbG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZmxvYXRpbmdP
YmplY3RzLT5jbGVhcigpOworfQorCitGbG9hdGluZ09iamVjdCogUmVuZGVyQmxvY2tGbG93Ojpp
bnNlcnRGbG9hdGluZ09iamVjdChSZW5kZXJCb3gqIGZsb2F0Qm94KQoreworICAgIEFTU0VSVChm
bG9hdEJveC0+aXNGbG9hdGluZygpKTsKKworICAgIC8vIENyZWF0ZSB0aGUgbGlzdCBvZiBzcGVj
aWFsIG9iamVjdHMgaWYgd2UgZG9uJ3QgYWxlYWR5IGhhdmUgb25lCisgICAgaWYgKCFtX2Zsb2F0
aW5nT2JqZWN0cykKKyAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7CisgICAgZWxzZSB7
CisgICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgZmxvYXRpbmdPYmplY3QgYWdhaW4gaWYgaXQn
cyBhbHJlYWR5IGluIHRoZSBsaXN0CisgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBm
bG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgYXV0
byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmZpbmQ8UmVuZGVyQm94JiwgRmxvYXRpbmdPYmplY3RI
YXNoVHJhbnNsYXRvcj4oKmZsb2F0Qm94KTsKKyAgICAgICAgaWYgKGl0ICE9IGZsb2F0aW5nT2Jq
ZWN0U2V0LmVuZCgpKQorICAgICAgICAgICAgcmV0dXJuIGl0LT5nZXQoKTsKKyAgICB9CisKKyAg
ICAvLyBDcmVhdGUgdGhlIHNwZWNpYWwgZmxvYXRpbmdPYmplY3QgZW50cnkgJiBhcHBlbmQgaXQg
dG8gdGhlIGxpc3QKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxGbG9hdGluZ09iamVjdD4gZmxvYXRp
bmdPYmplY3QgPSBGbG9hdGluZ09iamVjdDo6Y3JlYXRlKCpmbG9hdEJveCk7CisgICAgCisgICAg
Ly8gT3VyIGxvY2F0aW9uIGlzIGlycmVsZXZhbnQgaWYgd2UncmUgdW5zcGxpdHRhYmxlIG9yIG5v
IHBhZ2luYXRpb24gaXMgaW4gZWZmZWN0LgorICAgIC8vIEp1c3QgZ28gYWhlYWQgYW5kIGxheSBv
dXQgdGhlIGZsb2F0LgorICAgIGJvb2wgaXNDaGlsZFJlbmRlckJsb2NrID0gZmxvYXRCb3gtPmlz
UmVuZGVyQmxvY2soKTsKKyAgICBpZiAoaXNDaGlsZFJlbmRlckJsb2NrICYmICFmbG9hdEJveC0+
bmVlZHNMYXlvdXQoKSAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+cGFnZUxvZ2ljYWxIZWlnaHRD
aGFuZ2VkKCkpCisgICAgICAgIGZsb2F0Qm94LT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5
VGhpcyk7CisgICAgICAgICAgICAKKyAgICBib29sIG5lZWRzQmxvY2tEaXJlY3Rpb25Mb2NhdGlv
blNldEJlZm9yZUxheW91dCA9IGlzQ2hpbGRSZW5kZXJCbG9jayAmJiB2aWV3KCkubGF5b3V0U3Rh
dGUoKS0+bmVlZHNCbG9ja0RpcmVjdGlvbkxvY2F0aW9uU2V0QmVmb3JlTGF5b3V0KCk7CisgICAg
aWYgKCFuZWVkc0Jsb2NrRGlyZWN0aW9uTG9jYXRpb25TZXRCZWZvcmVMYXlvdXQgfHwgaXNXcml0
aW5nTW9kZVJvb3QoKSkgLy8gV2UgYXJlIHVuc3BsaXR0YWJsZSBpZiB3ZSdyZSBhIGJsb2NrIGZs
b3cgcm9vdC4KKyAgICAgICAgZmxvYXRCb3gtPmxheW91dElmTmVlZGVkKCk7CisgICAgZWxzZSB7
CisgICAgICAgIGZsb2F0Qm94LT51cGRhdGVMb2dpY2FsV2lkdGgoKTsKKyAgICAgICAgZmxvYXRC
b3gtPmNvbXB1dGVBbmRTZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7CisgICAgfQorCisg
ICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGhGb3JDaGlsZChm
bG9hdEJveCkgKyBtYXJnaW5TdGFydEZvckNoaWxkKGZsb2F0Qm94KSArIG1hcmdpbkVuZEZvckNo
aWxkKGZsb2F0Qm94KSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisKKyNpZiBFTkFCTEUo
Q1NTX1NIQVBFUykKKyAgICBpZiAoU2hhcGVPdXRzaWRlSW5mbyogc2hhcGVPdXRzaWRlID0gZmxv
YXRCb3gtPnNoYXBlT3V0c2lkZUluZm8oKSkKKyAgICAgICAgc2hhcGVPdXRzaWRlLT5zZXRTaGFw
ZVNpemUobG9naWNhbFdpZHRoRm9yQ2hpbGQoZmxvYXRCb3gpLCBsb2dpY2FsSGVpZ2h0Rm9yQ2hp
bGQoZmxvYXRCb3gpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIG1fZmxvYXRpbmdPYmplY3RzLT5h
ZGQoc3RkOjptb3ZlKGZsb2F0aW5nT2JqZWN0KSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93
OjpyZW1vdmVGbG9hdGluZ09iamVjdChSZW5kZXJCb3gqIGZsb2F0Qm94KQoreworICAgIGlmICht
X2Zsb2F0aW5nT2JqZWN0cykgeworICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxv
YXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgICAgIGF1dG8g
aXQgPSBmbG9hdGluZ09iamVjdFNldC5maW5kPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0SGFz
aFRyYW5zbGF0b3I+KCpmbG9hdEJveCk7CisgICAgICAgIGlmIChpdCAhPSBmbG9hdGluZ09iamVj
dFNldC5lbmQoKSkgeworICAgICAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0
ID0gaXQtPmdldCgpOworICAgICAgICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAg
ICAgICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3AgPSBmbG9hdGluZ09iamVjdC0+bG9naWNh
bFRvcChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRV
bml0IGxvZ2ljYWxCb3R0b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRvbShpc0hvcml6
b250YWxXcml0aW5nTW9kZSgpKTsKKworICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU0OTk1LgorICAgICAgICAgICAgICAg
IGlmIChsb2dpY2FsQm90dG9tIDwgMCB8fCBsb2dpY2FsQm90dG9tIDwgbG9naWNhbFRvcCB8fCBs
b2dpY2FsVG9wID09IExheW91dFVuaXQ6Om1heCgpKQorICAgICAgICAgICAgICAgICAgICBsb2dp
Y2FsQm90dG9tID0gTGF5b3V0VW5pdDo6bWF4KCk7CisgICAgICAgICAgICAgICAgZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwtY2FzZSB6ZXJvLSBhbmQgbGVzcy10aGFuLXpl
cm8taGVpZ2h0IGZsb2F0czogdGhvc2UgZG9uJ3QgdG91Y2gKKyAgICAgICAgICAgICAgICAgICAg
Ly8gdGhlIGxpbmUgdGhhdCB0aGV5J3JlIG9uLCBidXQgaXQgc3RpbGwgbmVlZHMgdG8gYmUgZGly
dGllZC4gVGhpcyBpcworICAgICAgICAgICAgICAgICAgICAvLyBhY2NvbXBsaXNoZWQgYnkgcHJl
dGVuZGluZyB0aGV5IGhhdmUgYSBoZWlnaHQgb2YgMS4KKyAgICAgICAgICAgICAgICAgICAgbG9n
aWNhbEJvdHRvbSA9IG1heChsb2dpY2FsQm90dG9tLCBsb2dpY2FsVG9wICsgMSk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRp
bmdMaW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmTmVlZHNMYXlvdXQoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCZmbG9hdGluZ09iamVjdC0+b3JpZ2lu
YXRpbmdMaW5lKCktPnJlbmRlcmVyKCkgPT0gdGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCktPm1hcmtEaXJ0eSgpOworICAgICAg
ICAgICAgICAgICAgICB9CisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgICAgICAgICAgICAgICAg
ICBmbG9hdGluZ09iamVjdC0+c2V0T3JpZ2luYXRpbmdMaW5lKDApOworI2VuZGlmCisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKDAs
IGxvZ2ljYWxCb3R0b20pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mbG9hdGluZ09i
amVjdHMtPnJlbW92ZShmbG9hdGluZ09iamVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Zv
aWQgUmVuZGVyQmxvY2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhGbG9hdGluZ09i
amVjdCogbGFzdEZsb2F0LCBpbnQgbG9naWNhbE9mZnNldCkKK3sKKyAgICBpZiAoIWNvbnRhaW5z
RmxvYXRzKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBjb25zdCBGbG9hdGluZ09iamVj
dFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAg
RmxvYXRpbmdPYmplY3QqIGN1cnIgPSBmbG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCk7Cisg
ICAgd2hpbGUgKGN1cnIgIT0gbGFzdEZsb2F0ICYmICghY3Vyci0+aXNQbGFjZWQoKSB8fCBjdXJy
LT5sb2dpY2FsVG9wKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpID49IGxvZ2ljYWxPZmZzZXQp
KSB7CisgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5yZW1vdmUoY3Vycik7CisgICAgICAgIGlm
IChmbG9hdGluZ09iamVjdFNldC5pc0VtcHR5KCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY3VyciA9IGZsb2F0aW5nT2JqZWN0U2V0Lmxhc3QoKS5nZXQoKTsKKyAgICB9Cit9CisKK0xh
eW91dFBvaW50IFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUxvZ2ljYWxMb2NhdGlvbkZvckZsb2F0
KGNvbnN0IEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCwgTGF5b3V0VW5pdCBsb2dpY2Fs
VG9wT2Zmc2V0KSBjb25zdAoreworICAgIFJlbmRlckJveCogY2hpbGRCb3ggPSAmZmxvYXRpbmdP
YmplY3QtPnJlbmRlcmVyKCk7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdE9mZnNldCA9IGxv
Z2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQg
cGFydCBvZiBsZWZ0IG9mZnNldC4KKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodE9mZnNldDsg
Ly8gQ29uc3RhbnQgcGFydCBvZiByaWdodCBvZmZzZXQuCisjaWYgRU5BQkxFKENTU19TSEFQRVMp
CisgICAgLy8gRklYTUUgQnVnIDEwMjk0ODogVGhpcyBvbmx5IHdvcmtzIGZvciBzaGFwZSBvdXRz
aWRlIGRpcmVjdGx5IHNldCBvbiB0aGlzIGJsb2NrLgorICAgIFNoYXBlSW5zaWRlSW5mbyogc2hh
cGVJbnNpZGVJbmZvID0gdGhpcy0+bGF5b3V0U2hhcGVJbnNpZGVJbmZvKCk7CisgICAgLy8gRklY
TUU6IEltcGxlbWVudCBiZWhhdmlvciBmb3IgcmlnaHQgZmxvYXRzLgorICAgIGlmIChzaGFwZUlu
c2lkZUluZm8pIHsKKyAgICAgICAgTGF5b3V0U2l6ZSBmbG9hdExvZ2ljYWxTaXplID0gTGF5b3V0
U2l6ZShjaGlsZEJveC0+bG9naWNhbFdpZHRoKCksIGNoaWxkQm94LT5sb2dpY2FsSGVpZ2h0KCkp
OworICAgICAgICAvLyBGSVhNRTogSWYgdGhlIGZsb2F0IGRvZXNuJ3QgZml0IGluIHRoZSBzaGFw
ZSB3ZSBzaG91bGQgcHVzaCBpdCB1bmRlciB0aGUgY29udGVudCBib3gKKyAgICAgICAgbG9naWNh
bFRvcE9mZnNldCA9IHNoYXBlSW5zaWRlSW5mby0+Y29tcHV0ZUZpcnN0Rml0UG9zaXRpb25Gb3JG
bG9hdChmbG9hdExvZ2ljYWxTaXplKTsKKyAgICAgICAgaWYgKGxvZ2ljYWxIZWlnaHQoKSA+IGxv
Z2ljYWxUb3BPZmZzZXQpCisgICAgICAgICAgICBsb2dpY2FsVG9wT2Zmc2V0ID0gbG9naWNhbEhl
aWdodCgpOworCisgICAgICAgIFNlZ21lbnRMaXN0IHNlZ21lbnRzID0gc2hhcGVJbnNpZGVJbmZv
LT5jb21wdXRlU2VnbWVudHNGb3JMaW5lKGxvZ2ljYWxUb3BPZmZzZXQsIGNoaWxkQm94LT5sb2dp
Y2FsSGVpZ2h0KCkpOworICAgICAgICAvLyBGSVhNRSBCdWcgMTAyOTQ5OiBBZGQgc3VwcG9ydCBm
b3Igc2hhcGVzIHdpdGggbXVsdGlwbGUgc2VnbWVudHMuCisgICAgICAgIGlmIChzZWdtZW50cy5z
aXplKCkgPT0gMSkgeworICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgb2Zmc2V0cyBhcmUgcmVs
YXRpdmUgdG8gdGhlIGNvbnRlbnQgYm94LgorICAgICAgICAgICAgbG9naWNhbFJpZ2h0T2Zmc2V0
ID0gbG9naWNhbExlZnRPZmZzZXQgKyBzZWdtZW50c1swXS5sb2dpY2FsUmlnaHQ7CisgICAgICAg
ICAgICBsb2dpY2FsTGVmdE9mZnNldCArPSBzZWdtZW50c1swXS5sb2dpY2FsTGVmdDsKKyAgICAg
ICAgfQorICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGxvZ2ljYWxSaWdodE9mZnNldCA9IGxv
Z2ljYWxSaWdodE9mZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7CisKKyAgICBMYXlv
dXRVbml0IGZsb2F0TG9naWNhbFdpZHRoID0gbWluKGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lk
dGgoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSksIGxvZ2ljYWxSaWdodE9mZnNldCAtIGxvZ2lj
YWxMZWZ0T2Zmc2V0KTsgLy8gVGhlIHdpZHRoIHdlIGxvb2sgZm9yLgorCisgICAgTGF5b3V0VW5p
dCBmbG9hdExvZ2ljYWxMZWZ0OworCisgICAgYm9vbCBpbnNpZGVGbG93VGhyZWFkID0gZmxvd1Ro
cmVhZENvbnRhaW5pbmdCbG9jaygpOworCisgICAgaWYgKGNoaWxkQm94LT5zdHlsZSgpLT5mbG9h
dGluZygpID09IExlZnRGbG9hdCkgeworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmlu
Z0xlZnQgPSAxOworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmluZ1JpZ2h0ID0gMTsK
KyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9y
aW5nU2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxz
ZSwgJmhlaWdodFJlbWFpbmluZ0xlZnQpOworICAgICAgICB3aGlsZSAobG9naWNhbFJpZ2h0T2Zm
c2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxS
aWdodE9mZnNldCwgZmFsc2UsICZoZWlnaHRSZW1haW5pbmdSaWdodCkgLSBmbG9hdExvZ2ljYWxM
ZWZ0IDwgZmxvYXRMb2dpY2FsV2lkdGgpIHsKKyAgICAgICAgICAgIGxvZ2ljYWxUb3BPZmZzZXQg
Kz0gbWluKGhlaWdodFJlbWFpbmluZ0xlZnQsIGhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKKyAgICAg
ICAgICAgIGZsb2F0TG9naWNhbExlZnQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmVJZ25vcmlu
Z1NoYXBlT3V0c2lkZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9mZnNldCwgZmFsc2Us
ICZoZWlnaHRSZW1haW5pbmdMZWZ0KTsKKyAgICAgICAgICAgIGlmIChpbnNpZGVGbG93VGhyZWFk
KSB7CisgICAgICAgICAgICAgICAgLy8gSGF2ZSB0byByZS1ldmFsdWF0ZSBhbGwgb2Ygb3VyIG9m
ZnNldHMsIHNpbmNlIHRoZXkgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBsb2dp
Y2FsUmlnaHRPZmZzZXQgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BP
ZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9mZnNldC4KKyAgICAgICAgICAgICAg
ICBsb2dpY2FsTGVmdE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudChsb2dpY2Fs
VG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFydCBvZiBsZWZ0IG9mZnNldC4KKyAgICAgICAgICAg
ICAgICBmbG9hdExvZ2ljYWxXaWR0aCA9IG1pbihmbG9hdGluZ09iamVjdC0+bG9naWNhbFdpZHRo
KGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpLCBsb2dpY2FsUmlnaHRPZmZzZXQgLSBsb2dpY2Fs
TGVmdE9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmxvYXRMb2dp
Y2FsTGVmdCA9IG1heChsb2dpY2FsTGVmdE9mZnNldCAtIGJvcmRlckFuZFBhZGRpbmdMb2dpY2Fs
TGVmdCgpLCBmbG9hdExvZ2ljYWxMZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMYXlvdXRV
bml0IGhlaWdodFJlbWFpbmluZ0xlZnQgPSAxOworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJl
bWFpbmluZ1JpZ2h0ID0gMTsKKyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IGxvZ2ljYWxSaWdo
dE9mZnNldEZvckxpbmVJZ25vcmluZ1NoYXBlT3V0c2lkZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dp
Y2FsUmlnaHRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nUmlnaHQpOworICAgICAgICB3
aGlsZSAoZmxvYXRMb2dpY2FsTGVmdCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9yaW5n
U2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxzZSwg
JmhlaWdodFJlbWFpbmluZ0xlZnQpIDwgZmxvYXRMb2dpY2FsV2lkdGgpIHsKKyAgICAgICAgICAg
IGxvZ2ljYWxUb3BPZmZzZXQgKz0gbWluKGhlaWdodFJlbWFpbmluZ0xlZnQsIGhlaWdodFJlbWFp
bmluZ1JpZ2h0KTsKKyAgICAgICAgICAgIGZsb2F0TG9naWNhbExlZnQgPSBsb2dpY2FsUmlnaHRP
ZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9mZnNldCwgbG9naWNh
bFJpZ2h0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKKyAgICAgICAgICAg
IGlmIChpbnNpZGVGbG93VGhyZWFkKSB7CisgICAgICAgICAgICAgICAgLy8gSGF2ZSB0byByZS1l
dmFsdWF0ZSBhbGwgb2Ygb3VyIG9mZnNldHMsIHNpbmNlIHRoZXkgbWF5IGhhdmUgY2hhbmdlZC4K
KyAgICAgICAgICAgICAgICBsb2dpY2FsUmlnaHRPZmZzZXQgPSBsb2dpY2FsUmlnaHRPZmZzZXRG
b3JDb250ZW50KGxvZ2ljYWxUb3BPZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9m
ZnNldC4KKyAgICAgICAgICAgICAgICBsb2dpY2FsTGVmdE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zm
c2V0Rm9yQ29udGVudChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFydCBvZiBsZWZ0
IG9mZnNldC4KKyAgICAgICAgICAgICAgICBmbG9hdExvZ2ljYWxXaWR0aCA9IG1pbihmbG9hdGlu
Z09iamVjdC0+bG9naWNhbFdpZHRoKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpLCBsb2dpY2Fs
UmlnaHRPZmZzZXQgLSBsb2dpY2FsTGVmdE9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCB3aWR0aCBvZiB0aGUgZmxvYXQgaGVyZSwg
c2luY2UgdGhlIGxvY2FsIHZhcmlhYmxlCisgICAgICAgIC8vIHxmbG9hdExvZ2ljYWxXaWR0aHwg
d2FzIGNhcHBlZCB0byB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGguIFNlZQorICAgICAgICAvLyBm
YXN0L2Jsb2NrL2Zsb2F0L2NsYW1wZWQtcmlnaHQtZmxvYXQuaHRtbC4KKyAgICAgICAgZmxvYXRM
b2dpY2FsTGVmdCAtPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbFdpZHRoKGlzSG9yaXpvbnRhbFdy
aXRpbmdNb2RlKCkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gTGF5b3V0UG9pbnQoZmxvYXRM
b2dpY2FsTGVmdCwgbG9naWNhbFRvcE9mZnNldCk7Cit9CisKK2Jvb2wgUmVuZGVyQmxvY2tGbG93
Ojpwb3NpdGlvbk5ld0Zsb2F0cygpCit7CisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0
aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgIGlmIChmbG9hdGlu
Z09iamVjdFNldC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElm
IGFsbCBmbG9hdHMgaGF2ZSBhbHJlYWR5IGJlZW4gcG9zaXRpb25lZCwgdGhlbiB3ZSBoYXZlIG5v
IHdvcmsgdG8gZG8uCisgICAgaWYgKGZsb2F0aW5nT2JqZWN0U2V0Lmxhc3QoKS0+aXNQbGFjZWQo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTW92ZSBiYWNrd2FyZHMgdGhyb3Vn
aCBvdXIgZmxvYXRpbmcgb2JqZWN0IGxpc3QgdW50aWwgd2UgZmluZCBhIGZsb2F0IHRoYXQgaGFz
CisgICAgLy8gYWxyZWFkeSBiZWVuIHBvc2l0aW9uZWQuIFRoZW4gd2UnbGwgYmUgYWJsZSB0byBt
b3ZlIGZvcndhcmQsIHBvc2l0aW9uaW5nIGFsbCBvZgorICAgIC8vIHRoZSBuZXcgZmxvYXRzIHRo
YXQgbmVlZCBpdC4KKyAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAg
LS1pdDsgLy8gR28gdG8gbGFzdCBpdGVtLgorICAgIGF1dG8gYmVnaW4gPSBmbG9hdGluZ09iamVj
dFNldC5iZWdpbigpOworICAgIEZsb2F0aW5nT2JqZWN0KiBsYXN0UGxhY2VkRmxvYXRpbmdPYmpl
Y3QgPSAwOworICAgIHdoaWxlIChpdCAhPSBiZWdpbikgeworICAgICAgICAtLWl0OworICAgICAg
ICBpZiAoKCppdCktPmlzUGxhY2VkKCkpIHsKKyAgICAgICAgICAgIGxhc3RQbGFjZWRGbG9hdGlu
Z09iamVjdCA9IGl0LT5nZXQoKTsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KKworICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IGxvZ2lj
YWxIZWlnaHQoKTsKKyAgICAKKyAgICAvLyBUaGUgZmxvYXQgY2Fubm90IHN0YXJ0IGFib3ZlIHRo
ZSB0b3AgcG9zaXRpb24gb2YgdGhlIGxhc3QgcG9zaXRpb25lZCBmbG9hdC4KKyAgICBpZiAobGFz
dFBsYWNlZEZsb2F0aW5nT2JqZWN0KQorICAgICAgICBsb2dpY2FsVG9wID0gbWF4KGxhc3RQbGFj
ZWRGbG9hdGluZ09iamVjdC0+bG9naWNhbFRvcChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSwg
bG9naWNhbFRvcCk7CisKKyAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOwor
ICAgIC8vIE5vdyB3YWxrIHRocm91Z2ggdGhlIHNldCBvZiB1bnBvc2l0aW9uZWQgZmxvYXRzIGFu
ZCBwbGFjZSB0aGVtLgorICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgRmxv
YXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOworICAgICAgICAvLyBUaGUg
Y29udGFpbmluZyBibG9jayBpcyByZXNwb25zaWJsZSBmb3IgcG9zaXRpb25pbmcgZmxvYXRzLCBz
byBpZiB3ZSBoYXZlIGZsb2F0cyBpbiBvdXIKKyAgICAgICAgLy8gbGlzdCB0aGF0IGNvbWUgZnJv
bSBzb21ld2hlcmUgZWxzZSwgZG8gbm90IGF0dGVtcHQgdG8gcG9zaXRpb24gdGhlbS4KKyAgICAg
ICAgaWYgKGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmNvbnRhaW5pbmdCbG9jaygpICE9IHRo
aXMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBSZW5kZXJCb3gqIGNoaWxkQm94
ID0gJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpOworCisgICAgICAgIExheW91dFVuaXQgY2hp
bGRMb2dpY2FsTGVmdE1hcmdpbiA9IHN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/
IG1hcmdpblN0YXJ0Rm9yQ2hpbGQoY2hpbGRCb3gpIDogbWFyZ2luRW5kRm9yQ2hpbGQoY2hpbGRC
b3gpOworCisgICAgICAgIExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkQm94LT5mcmFtZVJlY3Qo
KTsKKworICAgICAgICBpZiAoY2hpbGRCb3gtPnN0eWxlKCktPmNsZWFyKCkgJiBDTEVGVCkKKyAg
ICAgICAgICAgIGxvZ2ljYWxUb3AgPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0
aW5nT2JqZWN0OjpGbG9hdExlZnQpLCBsb2dpY2FsVG9wKTsKKyAgICAgICAgaWYgKGNoaWxkQm94
LT5zdHlsZSgpLT5jbGVhcigpICYgQ1JJR0hUKQorICAgICAgICAgICAgbG9naWNhbFRvcCA9IG1h
eChsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpLCBs
b2dpY2FsVG9wKTsKKworICAgICAgICBMYXlvdXRQb2ludCBmbG9hdExvZ2ljYWxMb2NhdGlvbiA9
IGNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9hdChmbG9hdGluZ09iamVjdCwgbG9naWNhbFRv
cCk7CisKKyAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxMZWZ0KGZsb2F0TG9naWNh
bExvY2F0aW9uLngoKSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisKKyAgICAgICAgc2V0
TG9naWNhbExlZnRGb3JDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueCgpICsg
Y2hpbGRMb2dpY2FsTGVmdE1hcmdpbik7CisgICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChj
aGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueSgpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQo
Y2hpbGRCb3gpKTsKKworICAgICAgICBlc3RpbWF0ZVJlZ2lvblJhbmdlRm9yQm94Q2hpbGQoY2hp
bGRCb3gpOworCisgICAgICAgIExheW91dFN0YXRlKiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlv
dXRTdGF0ZSgpOworICAgICAgICBib29sIGlzUGFnaW5hdGVkID0gbGF5b3V0U3RhdGUtPmlzUGFn
aW5hdGVkKCk7CisgICAgICAgIGlmIChpc1BhZ2luYXRlZCAmJiAhY2hpbGRCb3gtPm5lZWRzTGF5
b3V0KCkpCisgICAgICAgICAgICBjaGlsZEJveC0+bWFya0ZvclBhZ2luYXRpb25SZWxheW91dElm
TmVlZGVkKCk7CisgICAgICAgIAorICAgICAgICBjaGlsZEJveC0+bGF5b3V0SWZOZWVkZWQoKTsK
KworICAgICAgICBpZiAoaXNQYWdpbmF0ZWQpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSB1
bnNwbGl0dGFibGUgYW5kIGRvbid0IGZpdCwgdGhlbiB3ZSBuZWVkIHRvIG1vdmUgZG93bi4KKyAg
ICAgICAgICAgIC8vIFdlIGluY2x1ZGUgb3VyIG1hcmdpbnMgYXMgcGFydCBvZiB0aGUgdW5zcGxp
dHRhYmxlIGFyZWEuCisgICAgICAgICAgICBMYXlvdXRVbml0IG5ld0xvZ2ljYWxUb3AgPSBhZGp1
c3RGb3JVbnNwbGl0dGFibGVDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueSgp
LCB0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYSBw
YWdpbmF0aW9uIHN0cnV0IHRoYXQgaXMgbWFraW5nIHVzIG1vdmUgZG93biBmdXJ0aGVyLgorICAg
ICAgICAgICAgLy8gTm90ZSB0aGF0IGFuIHVuc3BsaXR0YWJsZSBjaGlsZCBjYW4ndCBhbHNvIGhh
dmUgYSBwYWdpbmF0aW9uIHN0cnV0LCBzbyB0aGlzIGlzCisgICAgICAgICAgICAvLyBleGNsdXNp
dmUgd2l0aCB0aGUgY2FzZSBhYm92ZS4KKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBjaGlsZEJs
b2NrID0gY2hpbGRCb3gtPmlzUmVuZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGRCb3gp
IDogMDsKKyAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrICYmIGNoaWxkQmxvY2stPnBhZ2luYXRp
b25TdHJ1dCgpKSB7CisgICAgICAgICAgICAgICAgbmV3TG9naWNhbFRvcCArPSBjaGlsZEJsb2Nr
LT5wYWdpbmF0aW9uU3RydXQoKTsKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5zZXRQYWdp
bmF0aW9uU3RydXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGlmIChuZXdMb2dpY2FsVG9wICE9IGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSkgeworICAgICAg
ICAgICAgICAgIGZsb2F0aW5nT2JqZWN0LT5zZXRQYWdpbmF0aW9uU3RydXQobmV3TG9naWNhbFRv
cCAtIGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdExv
Z2ljYWxMb2NhdGlvbiA9IGNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9hdChmbG9hdGluZ09i
amVjdCwgbmV3TG9naWNhbFRvcCk7CisgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNl
dExvZ2ljYWxMZWZ0KGZsb2F0TG9naWNhbExvY2F0aW9uLngoKSwgaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSk7CisKKyAgICAgICAgICAgICAgICBzZXRMb2dpY2FsTGVmdEZvckNoaWxkKGNoaWxk
Qm94LCBmbG9hdExvZ2ljYWxMb2NhdGlvbi54KCkgKyBjaGlsZExvZ2ljYWxMZWZ0TWFyZ2luKTsK
KyAgICAgICAgICAgICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9n
aWNhbExvY2F0aW9uLnkoKSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkQm94KSk7CisgICAg
ICAgIAorICAgICAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrKQorICAgICAgICAgICAgICAgICAg
ICBjaGlsZEJsb2NrLT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CisgICAgICAg
ICAgICAgICAgY2hpbGRCb3gtPmxheW91dElmTmVlZGVkKCk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGlmICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxkKGNoaWxkQm94KSkgewor
ICAgICAgICAgICAgICAgIGNoaWxkQm94LT5zZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOwor
ICAgICAgICAgICAgICAgIGNoaWxkQm94LT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxUb3AoZmxv
YXRMb2dpY2FsTG9jYXRpb24ueSgpLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKKworICAg
ICAgICBmbG9hdGluZ09iamVjdC0+c2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0Rm9yQ2hp
bGQoY2hpbGRCb3gpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGRCb3gpICsgbWFyZ2luQWZ0
ZXJGb3JDaGlsZChjaGlsZEJveCksIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOworCisgICAg
ICAgIG1fZmxvYXRpbmdPYmplY3RzLT5hZGRQbGFjZWRPYmplY3QoZmxvYXRpbmdPYmplY3QpOwor
CisgICAgICAgIC8vIElmIHRoZSBjaGlsZCBtb3ZlZCwgd2UgaGF2ZSB0byByZXBhaW50IGl0Lgor
ICAgICAgICBpZiAoY2hpbGRCb3gtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQorICAg
ICAgICAgICAgY2hpbGRCb3gtPnJlcGFpbnREdXJpbmdMYXlvdXRJZk1vdmVkKG9sZFJlY3QpOwor
ICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6Om5ld0xp
bmUoRUNsZWFyIGNsZWFyKQoreworICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgLy8gc2V0
IHkgcG9zaXRpb24KKyAgICBMYXlvdXRVbml0IG5ld1kgPSAwOworICAgIHN3aXRjaCAoY2xlYXIp
IHsKKyAgICBjYXNlIENMRUZUOgorICAgICAgICBuZXdZID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90
dG9tKEZsb2F0aW5nT2JqZWN0OjpGbG9hdExlZnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IENSSUdIVDoKKyAgICAgICAgbmV3WSA9IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGlu
Z09iamVjdDo6RmxvYXRSaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0JPVEg6Cisg
ICAgICAgIG5ld1kgPSBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oKTsKKyAgICBkZWZhdWx0Ogor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGhlaWdodCgpIDwgbmV3WSkKKyAgICAgICAg
c2V0TG9naWNhbEhlaWdodChuZXdZKTsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6
OmxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5
b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0VW5pdCogaGVpZ2h0UmVtYWluaW5nLCBMYXlvdXRV
bml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSBvZmZzZXRNb2Rl
KSBjb25zdAoreworICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiBtX2Zsb2F0aW5nT2JqZWN0
cy0+aGFzTGVmdE9iamVjdHMoKSkKKyAgICAgICAgcmV0dXJuIG1fZmxvYXRpbmdPYmplY3RzLT5s
b2dpY2FsTGVmdE9mZnNldChmaXhlZE9mZnNldCwgbG9naWNhbFRvcCwgbG9naWNhbEhlaWdodCwg
b2Zmc2V0TW9kZSwgaGVpZ2h0UmVtYWluaW5nKTsKKworICAgIHJldHVybiBmaXhlZE9mZnNldDsK
K30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0
Rm9yTGluZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExh
eW91dFVuaXQqIGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBTaGFw
ZU91dHNpZGVGbG9hdE9mZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKK3sKKyAgICBpZiAobV9m
bG9hdGluZ09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPmhhc1JpZ2h0T2JqZWN0cygpKQor
ICAgICAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMtPmxvZ2ljYWxSaWdodE9mZnNldChmaXhl
ZE9mZnNldCwgbG9naWNhbFRvcCwgbG9naWNhbEhlaWdodCwgb2Zmc2V0TW9kZSwgaGVpZ2h0UmVt
YWluaW5nKTsKKworICAgIHJldHVybiBmaXhlZE9mZnNldDsKK30KKworTGF5b3V0VW5pdCBSZW5k
ZXJCbG9ja0Zsb3c6Om5leHRGbG9hdExvZ2ljYWxCb3R0b21CZWxvdyhMYXlvdXRVbml0IGxvZ2lj
YWxIZWlnaHQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSBvZmZzZXRNb2RlKSBjb25zdAor
eworICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybiBsb2dpY2FsSGVp
Z2h0OworCisgICAgTGF5b3V0VW5pdCBib3R0b20gPSBMYXlvdXRVbml0OjptYXgoKTsKKyAgICBj
b25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2Jq
ZWN0cy0+c2V0KCk7CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAg
ICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKKyAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgp
OworICAgICAgICBMYXlvdXRVbml0IGZsb2F0Qm90dG9tOworI2lmIEVOQUJMRShDU1NfU0hBUEVT
KQorICAgICAgICBTaGFwZU91dHNpZGVJbmZvKiBzaGFwZU91dHNpZGUgPSBmbG9hdGluZ09iamVj
dC0+cmVuZGVyZXIoKS5zaGFwZU91dHNpZGVJbmZvKCk7CisgICAgICAgIGlmIChvZmZzZXRNb2Rl
ID09IFNoYXBlT3V0c2lkZUZsb2F0U2hhcGVPZmZzZXQgJiYgc2hhcGVPdXRzaWRlKQorICAgICAg
ICAgICAgZmxvYXRCb3R0b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbFRvcChpc0hvcml6b250
YWxXcml0aW5nTW9kZSgpKSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKCYoZmxvYXRpbmdPYmplY3Qt
PnJlbmRlcmVyKCkpKSArIHNoYXBlT3V0c2lkZS0+c2hhcGVMb2dpY2FsQm90dG9tKCk7CisgICAg
ICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgZmxvYXRCb3R0b20gPSBmbG9hdGluZ09iamVj
dC0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKKyAgICAgICAgaWYg
KGZsb2F0Qm90dG9tID4gbG9naWNhbEhlaWdodCkKKyAgICAgICAgICAgIGJvdHRvbSA9IG1pbihm
bG9hdEJvdHRvbSwgYm90dG9tKTsKKyAgICB9CisKKyAgICByZXR1cm4gYm90dG9tID09IExheW91
dFVuaXQ6Om1heCgpID8gTGF5b3V0VW5pdCgpIDogYm90dG9tOworfQorCitMYXlvdXRVbml0IFJl
bmRlckJsb2NrRmxvdzo6bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0OjpU
eXBlIGZsb2F0VHlwZSkgY29uc3QKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0Qm90dG9tID0gMDsKKyAg
ICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5n
T2JqZWN0cy0+c2V0KCk7CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsK
KyAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpIHsKKyAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdl
dCgpOworICAgICAgICBpZiAoZmxvYXRpbmdPYmplY3QtPmlzUGxhY2VkKCkgJiYgZmxvYXRpbmdP
YmplY3QtPnR5cGUoKSAmIGZsb2F0VHlwZSkKKyAgICAgICAgICAgIGxvd2VzdEZsb2F0Qm90dG9t
ID0gbWF4KGxvd2VzdEZsb2F0Qm90dG9tLCBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRvbShp
c0hvcml6b250YWxXcml0aW5nTW9kZSgpKSk7CisgICAgfQorICAgIHJldHVybiBsb3dlc3RGbG9h
dEJvdHRvbTsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJoYW5naW5n
RmxvYXRzKFJlbmRlckJsb2NrRmxvdyogY2hpbGQsIGJvb2wgbWFrZUNoaWxkUGFpbnRPdGhlckZs
b2F0cykKK3sKKyAgICAvLyBQcmV2ZW50IGZsb2F0cyBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZSBj
YW52YXMgYnkgdGhlIHJvb3QgZWxlbWVudCwgZS5nLiwgPGh0bWw+LgorICAgIGlmIChjaGlsZC0+
aGFzT3ZlcmZsb3dDbGlwKCkgfHwgIWNoaWxkLT5jb250YWluc0Zsb2F0cygpIHx8IGNoaWxkLT5p
c1Jvb3QoKSB8fCBjaGlsZC0+aGFzQ29sdW1ucygpIHx8IGNoaWxkLT5pc1dyaXRpbmdNb2RlUm9v
dCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2FsVG9w
ID0gY2hpbGQtPmxvZ2ljYWxUb3AoKTsKKyAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbExlZnQg
PSBjaGlsZC0+bG9naWNhbExlZnQoKTsKKyAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0TG9naWNh
bEJvdHRvbSA9IDA7CisKKyAgICAvLyBGbG9hdHMgdGhhdCB3aWxsIHJlbWFpbiB0aGUgY2hpbGQn
cyByZXNwb25zaWJpbGl0eSB0byBwYWludCBzaG91bGQgZmFjdG9yIGludG8gaXRzCisgICAgLy8g
b3ZlcmZsb3cuCisgICAgYXV0byBjaGlsZEVuZCA9IGNoaWxkLT5tX2Zsb2F0aW5nT2JqZWN0cy0+
c2V0KCkuZW5kKCk7CisgICAgZm9yIChhdXRvIGNoaWxkSXQgPSBjaGlsZC0+bV9mbG9hdGluZ09i
amVjdHMtPnNldCgpLmJlZ2luKCk7IGNoaWxkSXQgIT0gY2hpbGRFbmQ7ICsrY2hpbGRJdCkgewor
ICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBjaGlsZEl0LT5nZXQoKTsK
KyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tRm9yRmxvYXQgPSBtaW4oZmxvYXRpbmdP
YmplY3QtPmxvZ2ljYWxCb3R0b20oaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSksIExheW91dFVu
aXQ6Om1heCgpIC0gY2hpbGRMb2dpY2FsVG9wKTsKKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2Fs
Qm90dG9tID0gY2hpbGRMb2dpY2FsVG9wICsgbG9naWNhbEJvdHRvbUZvckZsb2F0OworICAgICAg
ICBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20gPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9t
LCBsb2dpY2FsQm90dG9tKTsKKworICAgICAgICBpZiAobG9naWNhbEJvdHRvbSA+IGxvZ2ljYWxI
ZWlnaHQoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxp
c3QsIHdlIGFkZCBpdCBub3cuCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zRmxvYXQoJmZsb2F0
aW5nT2JqZWN0LT5yZW5kZXJlcigpKSkgeworICAgICAgICAgICAgICAgIExheW91dFNpemUgb2Zm
c2V0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IExheW91dFNpemUoLWNoaWxkTG9naWNh
bExlZnQsIC1jaGlsZExvZ2ljYWxUb3ApIDogTGF5b3V0U2l6ZSgtY2hpbGRMb2dpY2FsVG9wLCAt
Y2hpbGRMb2dpY2FsTGVmdCk7CisgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRQYWludCA9IGZh
bHNlOworCisgICAgICAgICAgICAgICAgLy8gVGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxheWVyIGFs
d2F5cyBwYWludHMgdGhlIGZsb2F0IChzbyB0aGF0IHppbmRleCBhbmQgc3RhY2tpbmcKKyAgICAg
ICAgICAgICAgICAvLyBiZWhhdmVzIHByb3Blcmx5KS4gV2UgYWx3YXlzIHdhbnQgdG8gcHJvcGFn
YXRlIHRoZSBkZXNpcmUgdG8gcGFpbnQgdGhlIGZsb2F0IGFzCisgICAgICAgICAgICAgICAgLy8g
ZmFyIG91dCBhcyB3ZSBjYW4sIHRvIHRoZSBvdXRlcm1vc3QgYmxvY2sgdGhhdCBvdmVybGFwcyB0
aGUgZmxvYXQsIHN0b3BwaW5nIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoaXQgYSBz
ZWxmLXBhaW50aW5nIGxheWVyIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIGlmIChmbG9hdGlu
Z09iamVjdC0+cmVuZGVyZXIoKS5lbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9PSBlbmNs
b3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdGlu
Z09iamVjdC0+c2V0U2hvdWxkUGFpbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBzaG91
bGRQYWludCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdl
IGNyZWF0ZSB0aGUgZmxvYXRpbmcgb2JqZWN0IGxpc3QgbGF6aWx5LgorICAgICAgICAgICAgICAg
IGlmICghbV9mbG9hdGluZ09iamVjdHMpCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZsb2F0
aW5nT2JqZWN0cygpOworCisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmFkZChm
bG9hdGluZ09iamVjdC0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCwgc2hvdWxkUGFpbnQsIHRy
dWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICht
YWtlQ2hpbGRQYWludE90aGVyRmxvYXRzICYmICFmbG9hdGluZ09iamVjdC0+c2hvdWxkUGFpbnQo
KSAmJiAhZmxvYXRpbmdPYmplY3QtPnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKQor
ICAgICAgICAgICAgICAgICYmIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmlzRGVzY2VuZGFu
dE9mKGNoaWxkKSAmJiBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5lbmNsb3NpbmdGbG9hdFBh
aW50aW5nTGF5ZXIoKSA9PSBjaGlsZC0+ZW5jbG9zaW5nRmxvYXRQYWludGluZ0xheWVyKCkpIHsK
KyAgICAgICAgICAgICAgICAvLyBUaGUgZmxvYXQgaXMgbm90IG92ZXJoYW5naW5nIGZyb20gdGhp
cyBibG9jaywgc28gaWYgaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBjaGlsZCwgdGhlIGNoaWxk
IHNob3VsZAorICAgICAgICAgICAgICAgIC8vIHBhaW50IGl0ICh0aGUgb3RoZXIgY2FzZSBpcyB0
aGF0IGl0IGlzIGludHJ1ZGluZyBpbnRvIHRoZSBjaGlsZCksIHVubGVzcyBpdCBoYXMgaXRzIG93
biBsYXllciBvciBlbmNsb3NpbmcKKyAgICAgICAgICAgICAgICAvLyBsYXllci4KKyAgICAgICAg
ICAgICAgICAvLyBJZiBtYWtlQ2hpbGRQYWludE90aGVyRmxvYXRzIGlzIGZhbHNlLCBpdCBtZWFu
cyB0aGF0IHRoZSBjaGlsZCBtdXN0IGFscmVhZHkga25vdyBhYm91dCBhbGwgdGhlIGZsb2F0cwor
ICAgICAgICAgICAgICAgIC8vIGl0IHNob3VsZCBwYWludC4KKyAgICAgICAgICAgICAgICBmbG9h
dGluZ09iamVjdC0+c2V0U2hvdWxkUGFpbnQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBmbG9hdCBkb2Vzbid0IG92ZXJoYW5nLCBp
dCBkaWRuJ3QgZ2V0IHB1dCBpbnRvIG91ciBsaXN0LiBXZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBh
ZGQgaXRzIG92ZXJmbG93IGluIHRvIHRoZQorICAgICAgICAgICAgLy8gY2hpbGQgbm93LgorICAg
ICAgICAgICAgaWYgKGZsb2F0aW5nT2JqZWN0LT5pc0Rlc2NlbmRhbnQoKSkKKyAgICAgICAgICAg
ICAgICBjaGlsZC0+YWRkT3ZlcmZsb3dGcm9tQ2hpbGQoJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJl
cigpLCBMYXlvdXRTaXplKHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKGZsb2F0aW5n
T2JqZWN0KSwgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4oZmxvYXRpbmdPYmplY3Qp
KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRv
bTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Omhhc092ZXJoYW5naW5nRmxvYXQoUmVuZGVy
Qm94KiByZW5kZXJlcikKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzIHx8IGhhc0NvbHVt
bnMoKSB8fCAhcGFyZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IEZs
b2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5z
ZXQoKTsKKyAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZmluZDxSZW5kZXJCb3gmLCBG
bG9hdGluZ09iamVjdEhhc2hUcmFuc2xhdG9yPigqcmVuZGVyZXIpOworICAgIGlmIChpdCA9PSBm
bG9hdGluZ09iamVjdFNldC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0
dXJuICgqaXQpLT5sb2dpY2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpID4gbG9n
aWNhbEhlaWdodCgpOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YWRkSW50cnVkaW5nRmxv
YXRzKFJlbmRlckJsb2NrRmxvdyogcHJldiwgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdE9mZnNldCwg
TGF5b3V0VW5pdCBsb2dpY2FsVG9wT2Zmc2V0KQoreworICAgIEFTU0VSVCghYXZvaWRzRmxvYXRz
KCkpOworCisgICAgLy8gSWYgdGhlIHBhcmVudCBvciBwcmV2aW91cyBzaWJsaW5nIGRvZXNuJ3Qg
aGF2ZSBhbnkgZmxvYXRzIHRvIGFkZCwgZG9uJ3QgYm90aGVyLgorICAgIGlmICghcHJldi0+bV9m
bG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybjsKKworICAgIGxvZ2ljYWxMZWZ0T2Zmc2V0
ICs9IG1hcmdpbkxvZ2ljYWxMZWZ0KCk7CisKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYg
cHJldlNldCA9IHByZXYtPm1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBhdXRvIHByZXZF
bmQgPSBwcmV2U2V0LmVuZCgpOworICAgIGZvciAoYXV0byBwcmV2SXQgPSBwcmV2U2V0LmJlZ2lu
KCk7IHByZXZJdCAhPSBwcmV2RW5kOyArK3ByZXZJdCkgeworICAgICAgICBGbG9hdGluZ09iamVj
dCogZmxvYXRpbmdPYmplY3QgPSBwcmV2SXQtPmdldCgpOworICAgICAgICBpZiAoZmxvYXRpbmdP
YmplY3QtPmxvZ2ljYWxCb3R0b20oaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgPiBsb2dpY2Fs
VG9wT2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzIHx8ICFtX2Zs
b2F0aW5nT2JqZWN0cy0+c2V0KCkuY29udGFpbnM8RmxvYXRpbmdPYmplY3QmLCBGbG9hdGluZ09i
amVjdEhhc2hUcmFuc2xhdG9yPigqZmxvYXRpbmdPYmplY3QpKSB7CisgICAgICAgICAgICAgICAg
Ly8gV2UgY3JlYXRlIHRoZSBmbG9hdGluZyBvYmplY3QgbGlzdCBsYXppbHkuCisgICAgICAgICAg
ICAgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRl
RmxvYXRpbmdPYmplY3RzKCk7CisKKyAgICAgICAgICAgICAgICAvLyBBcHBseWluZyB0aGUgY2hp
bGQncyBtYXJnaW4gbWFrZXMgbm8gc2Vuc2UgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGNoaWxkIHdh
cyBwYXNzZWQgaW4uCisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBtYXJnaW4gd2FzIGFk
ZGVkIGFscmVhZHkgdGhyb3VnaCB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSB8bG9naWNhbExlZnRP
ZmZzZXR8IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgLy8gYWJvdmUuIHxsb2dpY2FsTGVmdE9m
ZnNldHwgd2lsbCBlcXVhbCB0aGUgbWFyZ2luIGluIHRoaXMgY2FzZSwgc28gaXQncyBhbHJlYWR5
IGJlZW4gdGFrZW4KKyAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQuIE9ubHkgYXBwbHkg
dGhpcyBjb2RlIGlmIHByZXYgaXMgdGhlIHBhcmVudCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0
IG1hcmdpbgorICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGFwcGxpZWQgdHdpY2UuCisgICAg
ICAgICAgICAgICAgTGF5b3V0U2l6ZSBvZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgp
CisgICAgICAgICAgICAgICAgICAgID8gTGF5b3V0U2l6ZShsb2dpY2FsTGVmdE9mZnNldCAtIChw
cmV2ICE9IHBhcmVudCgpID8gcHJldi0+bWFyZ2luTGVmdCgpIDogTGF5b3V0VW5pdCgpKSwgbG9n
aWNhbFRvcE9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgOiBMYXlvdXRTaXplKGxvZ2ljYWxU
b3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0IC0gKHByZXYgIT0gcGFyZW50KCkgPyBwcmV2LT5t
YXJnaW5Ub3AoKSA6IExheW91dFVuaXQoKSkpOworCisgICAgICAgICAgICAgICAgbV9mbG9hdGlu
Z09iamVjdHMtPmFkZChmbG9hdGluZ09iamVjdC0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCkp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2Nr
Rmxvdzo6bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChSZW5kZXJCb3gqIGZs
b2F0VG9SZW1vdmUsIGJvb2wgaW5MYXlvdXQpCit7CisgICAgaWYgKCFldmVySGFkTGF5b3V0KCkg
JiYgIWNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIE1hcmtpbmdCZWhh
dmlvciBtYXJrUGFyZW50cyA9IGluTGF5b3V0ID8gTWFya09ubHlUaGlzIDogTWFya0NvbnRhaW5p
bmdCbG9ja0NoYWluOworICAgIHNldENoaWxkTmVlZHNMYXlvdXQobWFya1BhcmVudHMpOworCisg
ICAgaWYgKGZsb2F0VG9SZW1vdmUpCisgICAgICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0
VG9SZW1vdmUpOworCisgICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGlsZHJlbiBhbmQgbWFyayB0
aGVtIGFzIG5lZWRlZC4KKyAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgZm9y
IChSZW5kZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGls
ZC0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgaWYgKCghZmxvYXRUb1JlbW92ZSAmJiBj
aGlsZC0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB8fCAhY2hpbGQtPmlzUmVu
ZGVyQmxvY2soKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgh
Y2hpbGQtPmlzUmVuZGVyQmxvY2tGbG93KCkpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJCbG9j
ayogY2hpbGRCbG9jayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOworICAgICAgICAgICAgICAgIGlm
IChjaGlsZEJsb2NrLT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkgJiYgY2hpbGRCbG9jay0+ZXZlckhh
ZExheW91dCgpKQorICAgICAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5zZXRDaGlsZE5lZWRz
TGF5b3V0KG1hcmtQYXJlbnRzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIFJlbmRlckJsb2NrRmxvdyogY2hpbGRCbG9jayA9IHRvUmVuZGVy
QmxvY2tGbG93KGNoaWxkKTsKKyAgICAgICAgICAgIGlmICgoZmxvYXRUb1JlbW92ZSA/IGNoaWxk
QmxvY2stPmNvbnRhaW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWlu
c0Zsb2F0cygpKSB8fCBjaGlsZEJsb2NrLT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkpCisgICAgICAg
ICAgICAgICAgY2hpbGRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91
dChmbG9hdFRvUmVtb3ZlLCBpbkxheW91dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQg
UmVuZGVyQmxvY2tGbG93OjptYXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KFJlbmRlckJv
eCogZmxvYXRUb1JlbW92ZSkKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RT
ZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09i
amVjdFNldC5lbmQoKTsKKworICAgIGZvciAoUmVuZGVyT2JqZWN0KiBuZXh0ID0gbmV4dFNpYmxp
bmcoKTsgbmV4dDsgbmV4dCA9IG5leHQtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKCFu
ZXh0LT5pc1JlbmRlckJsb2NrRmxvdygpIHx8IG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bv
c2l0aW9uZWQoKSB8fCB0b1JlbmRlckJsb2NrKG5leHQpLT5hdm9pZHNGbG9hdHMoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFJlbmRlckJsb2NrRmxvdyogbmV4dEJsb2NrID0g
dG9SZW5kZXJCbG9ja0Zsb3cobmV4dCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5n
T2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgUmVuZGVy
Qm94KiBmbG9hdGluZ0JveCA9ICYoKml0KS0+cmVuZGVyZXIoKTsKKyAgICAgICAgICAgIGlmIChm
bG9hdFRvUmVtb3ZlICYmIGZsb2F0aW5nQm94ICE9IGZsb2F0VG9SZW1vdmUpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAobmV4dEJsb2NrLT5jb250YWluc0Zsb2F0
KGZsb2F0aW5nQm94KSkKKyAgICAgICAgICAgICAgICBuZXh0QmxvY2stPm1hcmtBbGxEZXNjZW5k
YW50c1dpdGhGbG9hdHNGb3JMYXlvdXQoZmxvYXRpbmdCb3gpOworICAgICAgICB9CisgICAgfQor
fQorCitMYXlvdXRVbml0IFJlbmRlckJsb2NrRmxvdzo6Z2V0Q2xlYXJEZWx0YShSZW5kZXJCb3gq
IGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxUb3ApCit7CisgICAgLy8gVGhlcmUgaXMgbm8gbmVl
ZCB0byBjb21wdXRlIGNsZWFyYW5jZSBpZiB3ZSBoYXZlIG5vIGZsb2F0cy4KKyAgICBpZiAoIWNv
bnRhaW5zRmxvYXRzKCkpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIEF0IGxlYXN0
IG9uZSBmbG9hdCBpcyBwcmVzZW50LiBXZSBuZWVkIHRvIHBlcmZvcm0gdGhlIGNsZWFyYW5jZSBj
b21wdXRhdGlvbi4KKyAgICBib29sIGNsZWFyU2V0ID0gY2hpbGQtPnN0eWxlKCktPmNsZWFyKCkg
IT0gQ05PTkU7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0gMDsKKyAgICBzd2l0Y2gg
KGNoaWxkLT5zdHlsZSgpLT5jbGVhcigpKSB7CisgICAgY2FzZSBDTk9ORToKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBDTEVGVDoKKyAgICAgICAgbG9naWNhbEJvdHRvbSA9IGxvd2VzdEZsb2F0
TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBDUklHSFQ6CisgICAgICAgIGxvZ2ljYWxCb3R0b20gPSBsb3dlc3RGbG9hdExv
Z2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIENCT1RIOgorICAgICAgICBsb2dpY2FsQm90dG9tID0gbG93ZXN0RmxvYXRMb2dp
Y2FsQm90dG9tKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFdlIGFsc28gY2xl
YXIgZmxvYXRzIGlmIHdlIGFyZSB0b28gYmlnIHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFzIGEg
ZmxvYXQgKGFuZCB3aXNoIHRvIGF2b2lkIGZsb2F0cyBieSBkZWZhdWx0KS4KKyAgICBMYXlvdXRV
bml0IHJlc3VsdCA9IGNsZWFyU2V0ID8gbWF4PExheW91dFVuaXQ+KDAsIGxvZ2ljYWxCb3R0b20g
LSBsb2dpY2FsVG9wKSA6IExheW91dFVuaXQoKTsKKyAgICBpZiAoIXJlc3VsdCAmJiBjaGlsZC0+
YXZvaWRzRmxvYXRzKCkpIHsKKyAgICAgICAgTGF5b3V0VW5pdCBuZXdMb2dpY2FsVG9wID0gbG9n
aWNhbFRvcDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIExheW91dFVuaXQg
YXZhaWxhYmxlTG9naWNhbFdpZHRoQXROZXdMb2dpY2FsVG9wT2Zmc2V0ID0gYXZhaWxhYmxlTG9n
aWNhbFdpZHRoRm9yTGluZShuZXdMb2dpY2FsVG9wLCBmYWxzZSwgbG9naWNhbEhlaWdodEZvckNo
aWxkKGNoaWxkKSk7CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoQXROZXdM
b2dpY2FsVG9wT2Zmc2V0ID09IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNvbnRlbnQobmV3TG9n
aWNhbFRvcCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xvZ2ljYWxUb3AgLSBsb2dpY2Fs
VG9wOworCisgICAgICAgICAgICBSZW5kZXJSZWdpb24qIHJlZ2lvbiA9IHJlZ2lvbkF0QmxvY2tP
ZmZzZXQobG9naWNhbFRvcEZvckNoaWxkKGNoaWxkKSk7CisgICAgICAgICAgICBMYXlvdXRSZWN0
IGJvcmRlckJveCA9IGNoaWxkLT5ib3JkZXJCb3hSZWN0SW5SZWdpb24ocmVnaW9uLCBEb05vdENh
Y2hlUmVuZGVyQm94UmVnaW9uSW5mbyk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkTG9n
aWNhbFdpZHRoQXRPbGRMb2dpY2FsVG9wT2Zmc2V0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUo
KSA/IGJvcmRlckJveC53aWR0aCgpIDogYm9yZGVyQm94LmhlaWdodCgpOworCisgICAgICAgICAg
ICAvLyBGSVhNRTogTm9uZSBvZiB0aGlzIGlzIHJpZ2h0IGZvciBwZXJwZW5kaWN1bGFyIHdyaXRp
bmctbW9kZSBjaGlsZHJlbi4KKyAgICAgICAgICAgIExheW91dFVuaXQgY2hpbGRPbGRMb2dpY2Fs
V2lkdGggPSBjaGlsZC0+bG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNo
aWxkT2xkTWFyZ2luTGVmdCA9IGNoaWxkLT5tYXJnaW5MZWZ0KCk7CisgICAgICAgICAgICBMYXlv
dXRVbml0IGNoaWxkT2xkTWFyZ2luUmlnaHQgPSBjaGlsZC0+bWFyZ2luUmlnaHQoKTsKKyAgICAg
ICAgICAgIExheW91dFVuaXQgY2hpbGRPbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxvZ2ljYWxUb3Ao
KTsKKworICAgICAgICAgICAgY2hpbGQtPnNldExvZ2ljYWxUb3AobmV3TG9naWNhbFRvcCk7Cisg
ICAgICAgICAgICBjaGlsZC0+dXBkYXRlTG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICByZWdp
b24gPSByZWdpb25BdEJsb2NrT2Zmc2V0KGxvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCkpOworICAg
ICAgICAgICAgYm9yZGVyQm94ID0gY2hpbGQtPmJvcmRlckJveFJlY3RJblJlZ2lvbihyZWdpb24s
IERvTm90Q2FjaGVSZW5kZXJCb3hSZWdpb25JbmZvKTsKKyAgICAgICAgICAgIExheW91dFVuaXQg
Y2hpbGRMb2dpY2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQgPSBpc0hvcml6b250YWxXcml0
aW5nTW9kZSgpID8gYm9yZGVyQm94LndpZHRoKCkgOiBib3JkZXJCb3guaGVpZ2h0KCk7CisKKyAg
ICAgICAgICAgIGNoaWxkLT5zZXRMb2dpY2FsVG9wKGNoaWxkT2xkTG9naWNhbFRvcCk7CisgICAg
ICAgICAgICBjaGlsZC0+c2V0TG9naWNhbFdpZHRoKGNoaWxkT2xkTG9naWNhbFdpZHRoKTsKKyAg
ICAgICAgICAgIGNoaWxkLT5zZXRNYXJnaW5MZWZ0KGNoaWxkT2xkTWFyZ2luTGVmdCk7CisgICAg
ICAgICAgICBjaGlsZC0+c2V0TWFyZ2luUmlnaHQoY2hpbGRPbGRNYXJnaW5SaWdodCk7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmIChjaGlsZExvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRv
cE9mZnNldCA8PSBhdmFpbGFibGVMb2dpY2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQpIHsK
KyAgICAgICAgICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBtYXkgbm90IGJlIG1vdmluZywgaWYg
dGhlIGxvZ2ljYWwgd2lkdGggZGlkIHNocmluayBiZWNhdXNlIG9mIHRoZSBwcmVzZW5jZSBvZiBu
ZXcgZmxvYXRzLCB0aGVuCisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmb3JjZSBhIHJl
bGF5b3V0IGFzIHRob3VnaCB3ZSBzaGlmdGVkLiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBvZiB0aGUg
ZHluYW1pYyBhZGRpdGlvbiBvZiBvdmVyaGFuZ2luZyBmbG9hdHMKKyAgICAgICAgICAgICAgICAv
LyBmcm9tIHByZXZpb3VzIHNpYmxpbmdzIHdoZW4gbmVnYXRpdmUgbWFyZ2lucyBleGlzdCBvbiBh
IGNoaWxkIChzZWUgdGhlIGFkZE92ZXJoYW5naW5nRmxvYXRzIGNhbGwgYXQgdGhlIGVuZCBvZiBj
b2xsYXBzZU1hcmdpbnMpLgorICAgICAgICAgICAgICAgIGlmIChjaGlsZExvZ2ljYWxXaWR0aEF0
T2xkTG9naWNhbFRvcE9mZnNldCAhPSBjaGlsZExvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRvcE9m
ZnNldCkKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQtPnNldENoaWxkTmVlZHNMYXlvdXQoTWFy
a09ubHlUaGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TG9naWNhbFRvcCAtIGxvZ2lj
YWxUb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ld0xvZ2ljYWxUb3AgPSBuZXh0
RmxvYXRMb2dpY2FsQm90dG9tQmVsb3cobmV3TG9naWNhbFRvcCk7CisgICAgICAgICAgICBBU1NF
UlQobmV3TG9naWNhbFRvcCA+PSBsb2dpY2FsVG9wKTsKKyAgICAgICAgICAgIGlmIChuZXdMb2dp
Y2FsVG9wIDwgbG9naWNhbFRvcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmhpdFRlc3RGbG9hdHMoY29uc3QgSGl0VGVzdFJl
cXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSGl0VGVzdExvY2F0
aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRP
ZmZzZXQpCit7CisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgTGF5b3V0UG9pbnQgYWRqdXN0ZWRMb2NhdGlvbiA9IGFjY3VtdWxhdGVkT2Zm
c2V0OworICAgIGlmIChpc1JlbmRlclZpZXcoKSkKKyAgICAgICAgYWRqdXN0ZWRMb2NhdGlvbiAr
PSB0b0xheW91dFNpemUodG9SZW5kZXJWaWV3KCp0aGlzKS5mcmFtZVZpZXcoKS5zY3JvbGxQb3Np
dGlvbigpKTsKKworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNl
dCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBhdXRvIGJlZ2luID0gZmxvYXRpbmdP
YmplY3RTZXQuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5l
bmQoKTsgaXQgIT0gYmVnaW47KSB7CisgICAgICAgIC0taXQ7CisgICAgICAgIEZsb2F0aW5nT2Jq
ZWN0KiBmbG9hdGluZ09iamVjdCA9IGl0LT5nZXQoKTsKKyAgICAgICAgaWYgKGZsb2F0aW5nT2Jq
ZWN0LT5zaG91bGRQYWludCgpICYmICFmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5oYXNTZWxm
UGFpbnRpbmdMYXllcigpKSB7CisgICAgICAgICAgICBMYXlvdXRVbml0IHhPZmZzZXQgPSB4UG9z
aXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihmbG9hdGluZ09iamVjdCkgLSBmbG9hdGluZ09i
amVjdC0+cmVuZGVyZXIoKS54KCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IHlPZmZzZXQgPSB5
UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihmbG9hdGluZ09iamVjdCkgLSBmbG9hdGlu
Z09iamVjdC0+cmVuZGVyZXIoKS55KCk7CisgICAgICAgICAgICBMYXlvdXRQb2ludCBjaGlsZFBv
aW50ID0gZmxpcEZsb2F0Rm9yV3JpdGluZ01vZGVGb3JDaGlsZChmbG9hdGluZ09iamVjdCwgYWRq
dXN0ZWRMb2NhdGlvbiArIExheW91dFNpemUoeE9mZnNldCwgeU9mZnNldCkpOworICAgICAgICAg
ICAgaWYgKGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0
LCBsb2NhdGlvbkluQ29udGFpbmVyLCBjaGlsZFBvaW50KSkgeworICAgICAgICAgICAgICAgIHVw
ZGF0ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBsb2NhdGlvbkluQ29udGFpbmVyLnBvaW50KCkgLSB0
b0xheW91dFNpemUoY2hpbGRQb2ludCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YWRqdXN0Rm9yQm9yZGVyRml0KExheW91dFVuaXQgeCwg
TGF5b3V0VW5pdCYgbGVmdCwgTGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0Cit7CisgICAgUmVuZGVy
QmxvY2s6OmFkanVzdEZvckJvcmRlckZpdCh4LCBsZWZ0LCByaWdodCk7CisgICAgICAgIAorICAg
IGlmIChzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgeworICAgICAgICBpZiAobV9m
bG9hdGluZ09iamVjdHMpIHsKKyAgICAgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBm
bG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgICAg
IGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAgICAgICAgICBmb3IgKGF1
dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgICAgICAgICBGbG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKKyAgICAgICAgICAg
ICAgICAvLyBPbmx5IGV4YW1pbmUgdGhlIG9iamVjdCBpZiBvdXIgbV9zaG91bGRQYWludCBmbGFn
IGlzIHNldC4KKyAgICAgICAgICAgICAgICBpZiAoci0+c2hvdWxkUGFpbnQoKSkgeworICAgICAg
ICAgICAgICAgICAgICBMYXlvdXRVbml0IGZsb2F0TGVmdCA9IHhQb3NpdGlvbkZvckZsb2F0SW5j
bHVkaW5nTWFyZ2luKHIpIC0gci0+cmVuZGVyZXIoKS54KCk7CisgICAgICAgICAgICAgICAgICAg
IExheW91dFVuaXQgZmxvYXRSaWdodCA9IGZsb2F0TGVmdCArIHItPnJlbmRlcmVyKCkud2lkdGgo
KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG1pbihsZWZ0LCBmbG9hdExlZnQpOworICAg
ICAgICAgICAgICAgICAgICByaWdodCA9IG1heChyaWdodCwgZmxvYXRSaWdodCk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9ja0Zsb3cuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zs
b3cuaAppbmRleCAxMGNkMDExMjQyNjM2YmFkYzg3NmJiYTg5NTNkNWU1YTc2ZjQxMzhhLi40ZDI2
N2VkYjkwNGQ0M2I4Y2JhNjY3ZTBmZTAxMGU1ZmRjYjY4NmUwIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmgKKysrIGIvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oCkBAIC0yNyw2ICsyNyw4IEBACiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAorY2xhc3MgTGluZUJyZWFrZXI7CisKIGNsYXNzIFJlbmRlckJsb2NrRmxv
dyA6IHB1YmxpYyBSZW5kZXJCbG9jayB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgUmVuZGVyQmxv
Y2tGbG93KEVsZW1lbnQqKTsKQEAgLTIzMiw2ICsyMzQsMTYgQEAgcHVibGljOgogICAgIH0KICAg
ICB2b2lkIGxheW91dExpbmVHcmlkQm94KCk7CiAKKyAgICBib29sIGNvbnRhaW5zRmxvYXRzKCkg
Y29uc3QgT1ZFUlJJREUgeyByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgIW1fZmxvYXRpbmdP
YmplY3RzLT5zZXQoKS5pc0VtcHR5KCk7IH0KKyAgICBib29sIGNvbnRhaW5zRmxvYXQoUmVuZGVy
Qm94KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlTGluZUJveFRyZWUoKSBPVkVS
UklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tcHV0ZU92ZXJmbG93KExheW91dFVuaXQgb2xkQ2xp
ZW50QWZ0ZXJFZGdlLCBib29sIHJlY29tcHV0ZUZsb2F0cyA9IGZhbHNlKSBPVkVSUklERTsKKwor
ICAgIHZvaWQgcmVtb3ZlRmxvYXRpbmdPYmplY3RzKCk7CisgICAgdm9pZCBtYXJrQWxsRGVzY2Vu
ZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KFJlbmRlckJveCogZmxvYXRUb1JlbW92ZSA9IDAsIGJv
b2wgaW5MYXlvdXQgPSB0cnVlKTsKKyAgICB2b2lkIG1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JM
YXlvdXQoUmVuZGVyQm94KiBmbG9hdFRvUmVtb3ZlID0gMCk7CisKIHByb3RlY3RlZDoKICAgICBM
YXlvdXRVbml0IG1heFBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9yYXJl
RGF0YSA/IG1fcmFyZURhdGEtPm1fbWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIDogUmVu
ZGVyQmxvY2tGbG93UmFyZURhdGE6OnBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKTsg
fQogICAgIExheW91dFVuaXQgbWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVy
biBtX3JhcmVEYXRhID8gbV9yYXJlRGF0YS0+bV9tYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQmVmb3Jl
KCkgOiBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0
KHRoaXMpOyB9CkBAIC0yNjYsMTMgKzI3OCw5OCBAQCBwcm90ZWN0ZWQ6CiAgICAgTGF5b3V0VW5p
dCBhcHBseUJlZm9yZUJyZWFrKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQgbG9naWNhbE9m
ZnNldCk7IC8vIElmIHRoZSBjaGlsZCBoYXMgYSBiZWZvcmUgYnJlYWssIHRoZW4gcmV0dXJuIGEg
bmV3IHlQb3MgdGhhdCBzaGlmdHMgdG8gdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlL2NvbHVtbi4K
ICAgICBMYXlvdXRVbml0IGFwcGx5QWZ0ZXJCcmVhayhSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRV
bml0IGxvZ2ljYWxPZmZzZXQsIE1hcmdpbkluZm8mKTsgLy8gSWYgdGhlIGNoaWxkIGhhcyBhbiBh
ZnRlciBicmVhaywgdGhlbiByZXR1cm4gYSBuZXcgb2Zmc2V0IHRoYXQgc2hpZnRzIHRvIHRoZSB0
b3Agb2YgdGhlIG5leHQgcGFnZS9jb2x1bW4uCiAgICAgTGF5b3V0VW5pdCBhZGp1c3RCbG9ja0No
aWxkRm9yUGFnaW5hdGlvbihMYXlvdXRVbml0IGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBMYXlvdXRV
bml0IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24sIFJlbmRlckJveCogY2hpbGQsIGJvb2wgYXRC
ZWZvcmVTaWRlT2ZCbG9jayk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3R5bGVXaWxsQ2hhbmdlKFN0
eWxlRGlmZmVyZW5jZSwgY29uc3QgUmVuZGVyU3R5bGUqIG5ld1N0eWxlKSBPVkVSUklERTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc3R5bGVEaWRDaGFuZ2UoU3R5bGVEaWZmZXJlbmNlLCBjb25zdCBSZW5k
ZXJTdHlsZSogb2xkU3R5bGUpIE9WRVJSSURFOworCisgICAgdm9pZCBjcmVhdGVGbG9hdGluZ09i
amVjdHMoKTsKKworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgbW92ZUFsbENoaWxkcmVuT25S
ZW1vdmFsVG8oUmVuZGVyQmxvY2sqIHRvQmxvY2ssIGJvb2wgZnVsbFJlbW92ZUluc2VydCkgT1ZF
UlJJREU7CisgICAgdmlydHVhbCB2b2lkIHJlcGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyhib29sIHBh
aW50QWxsRGVzY2VuZGFudHMpIE9WRVJSSURFIEZJTkFMOworICAgIHZpcnR1YWwgdm9pZCBwYWlu
dEZsb2F0cyhQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIGJvb2wgcHJlc2VydmVQaGFz
ZSA9IGZhbHNlKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xpcE91dEZsb2F0aW5nT2Jq
ZWN0cyhSZW5kZXJCbG9jayosIGNvbnN0IFBhaW50SW5mbyosIGNvbnN0IExheW91dFBvaW50Jiwg
Y29uc3QgTGF5b3V0U2l6ZSYpIE9WRVJSSURFOworCisgICAgRmxvYXRpbmdPYmplY3QqIGluc2Vy
dEZsb2F0aW5nT2JqZWN0KFJlbmRlckJveCopOworICAgIHZvaWQgcmVtb3ZlRmxvYXRpbmdPYmpl
Y3QoUmVuZGVyQm94Kik7CisgICAgdm9pZCByZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhGbG9h
dGluZ09iamVjdCosIGludCBsb2dpY2FsT2Zmc2V0KTsKKyAgICBMYXlvdXRQb2ludCBjb21wdXRl
TG9naWNhbExvY2F0aW9uRm9yRmxvYXQoY29uc3QgRmxvYXRpbmdPYmplY3QqLCBMYXlvdXRVbml0
IGxvZ2ljYWxUb3BPZmZzZXQpIGNvbnN0OworCisgICAgLy8gQ2FsbGVkIGZyb20gbGluZVdpZHRo
LCB0byBwb3NpdGlvbiB0aGUgZmxvYXRzIGFkZGVkIGluIHRoZSBsYXN0IGxpbmUuCisgICAgLy8g
UmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIGl0IGhhcyBwb3NpdGlvbmVkIGFueSBmbG9hdHMu
CisgICAgYm9vbCBwb3NpdGlvbk5ld0Zsb2F0cygpOworCisgICAgdm9pZCBuZXdMaW5lKEVDbGVh
cik7CisKKyAgICB2aXJ0dWFsIExheW91dFVuaXQgbG9naWNhbFJpZ2h0RmxvYXRPZmZzZXRGb3JM
aW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0
VW5pdCogaGVpZ2h0UmVtYWluaW5nLCBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0
c2lkZUZsb2F0T2Zmc2V0TW9kZSkgY29uc3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCBMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwg
TGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0VW5pdCogaGVpZ2h0UmVtYWluaW5nLCBMYXlv
dXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSkgY29uc3Qg
T1ZFUlJJREU7CisgICAgTGF5b3V0VW5pdCBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oRmxvYXRp
bmdPYmplY3Q6OlR5cGUgPSBGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0UmlnaHQpIGNvbnN0OyAK
KyAgICBMYXlvdXRVbml0IG5leHRGbG9hdExvZ2ljYWxCb3R0b21CZWxvdyhMYXlvdXRVbml0LCBT
aGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUgPSBTaGFwZU91dHNpZGVGbG9hdE1hcmdpbkJveE9m
ZnNldCkgY29uc3Q7CisgICAgCisgICAgTGF5b3V0VW5pdCBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyhS
ZW5kZXJCbG9ja0Zsb3cqIGNoaWxkLCBib29sIG1ha2VDaGlsZFBhaW50T3RoZXJGbG9hdHMpOwor
ICAgIGJvb2wgaGFzT3ZlcmhhbmdpbmdGbG9hdChSZW5kZXJCb3gqKTsKKyAgICB2b2lkIGFkZElu
dHJ1ZGluZ0Zsb2F0cyhSZW5kZXJCbG9ja0Zsb3cqIHByZXYsIExheW91dFVuaXQgeG9mZnNldCwg
TGF5b3V0VW5pdCB5b2Zmc2V0KTsKKyAgICBib29sIGhhc092ZXJoYW5naW5nRmxvYXRzKCkgeyBy
ZXR1cm4gcGFyZW50KCkgJiYgIWhhc0NvbHVtbnMoKSAmJiBjb250YWluc0Zsb2F0cygpICYmIGxv
d2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpID4gbG9naWNhbEhlaWdodCgpOyB9CisgICAgTGF5b3V0
VW5pdCBnZXRDbGVhckRlbHRhKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQgeVBvcyk7CisK
KyAgICB2aXJ0dWFsIGJvb2wgaGl0VGVzdEZsb2F0cyhjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhp
dFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIs
IGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCkgT1ZFUlJJREU7CisgICAgdmly
dHVhbCB2b2lkIGFkZE92ZXJmbG93RnJvbUZsb2F0cygpIE9WRVJSSURFOworICAgIHZpcnR1YWwg
dm9pZCBhZGp1c3RGb3JCb3JkZXJGaXQoTGF5b3V0VW5pdCB4LCBMYXlvdXRVbml0JiBsZWZ0LCBM
YXlvdXRVbml0JiByaWdodCkgY29uc3QgT1ZFUlJJREU7CisKKworLy8gRklYTUUtQkxPQ0tGTE9X
OiBUaGVzZSBtZXRob2RzIGhhdmUgaW1wbGVtZW50YXRpb25zIGluCisvLyBSZW5kZXJCbG9ja0xp
bmVMYXlvdXQuIFRoZXkgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBwcm9wZXIgaGVhZGVyIG9uY2Ug
dGhlCisvLyBsaW5lIGxheW91dCBjb2RlIGlzIHNlcGFyYXRlZCBmcm9tIFJlbmRlckJsb2NrIGFu
ZCBSZW5kZXJCbG9ja0Zsb3cuCisvLyBTVEFSVCBNRVRIT0RTIERFRklORUQgSU4gUmVuZGVyQmxv
Y2tMaW5lTGF5b3V0CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVj
dChCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0
KiwgSW5saW5lQmlkaVJlc29sdmVyJik7CisKK3ByaXZhdGU6CisgICAgSW5saW5lRmxvd0JveCog
Y3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVjdCosIGNvbnN0IExpbmVJbmZvJiwgSW5saW5lQm94
KiBjaGlsZEJveCwgYm9vbCBzdGFydHNOZXdTZWdtZW50KTsKKyAgICBSb290SW5saW5lQm94KiBj
b25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgTGluZUluZm8mKTsKKyAg
ICB2b2lkIHNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qLCBSZW5kZXJSdWJ5UnVuKiwgUmVu
ZGVyT2JqZWN0KiwgY29uc3QgTGluZUluZm8mKTsKKyAgICB2b2lkIGNvbXB1dGVJbmxpbmVEaXJl
Y3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIEJp
ZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRF
bmQsIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNh
Y2hlJiwgV29yZE1lYXN1cmVtZW50cyYpOworICAgIEJpZGlSdW4qIGNvbXB1dGVJbmxpbmVEaXJl
Y3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KFJvb3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYs
IEVUZXh0QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwKKyAgICAgICAgZmxvYXQmIGF2YWlsYWJs
ZUxvZ2ljYWxXaWR0aCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VS
dW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVy
dGljYWxQb3NpdGlvbkNhY2hlJiwgV29yZE1lYXN1cmVtZW50cyYpOworICAgIHZvaWQgY29tcHV0
ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgQmlkaVJ1bios
IEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hl
Jik7CisgICAgQmlkaVJ1biogaGFuZGxlVHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxpc3Q8QmlkaVJ1
bj4mLCBCaWRpQ29udGV4dCopOworICAgIHZvaWQgYXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RM
aW5lKEZsb2F0aW5nT2JqZWN0Kik7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBsYXlvdXRJ
bmxpbmVDaGlsZHJlbigpCisgICAgUm9vdElubGluZUJveCogY3JlYXRlTGluZUJveGVzRnJvbUJp
ZGlSdW5zKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwg
TGluZUluZm8mLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNl
UnVuLCBXb3JkTWVhc3VyZW1lbnRzJik7CisgICAgdm9pZCBsYXlvdXRSdW5zQW5kRmxvYXRzKExp
bmVMYXlvdXRTdGF0ZSYsIGJvb2wgaGFzSW5saW5lQ2hpbGQpOworICAgIGNvbnN0IElubGluZUl0
ZXJhdG9yJiByZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGF5b3V0VW5pdCBvbGRM
b2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IG5ld0xvZ2ljYWxIZWlnaHQsICBGbG9hdGluZ09iamVj
dCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgSW5saW5lQmlkaVJlc29sdmVyJiwgIGNvbnN0
IElubGluZUl0ZXJhdG9yJik7CisgICAgdm9pZCBsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShM
aW5lTGF5b3V0U3RhdGUmLCBJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgY2xlYW5MaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMs
IHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKKyNpZiBFTkFCTEUoQ1NTX1NI
QVBFUykKKyAgICB2b2lkIHVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZShTaGFw
ZUluc2lkZUluZm8qJiwgY29uc3QgTGF5b3V0U2l6ZSYsIExpbmVMYXlvdXRTdGF0ZSYpOworICAg
IHZvaWQgdXBkYXRlU2hhcGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lSW5GbG93VGhyZWFkKFNo
YXBlSW5zaWRlSW5mbyomLCBMaW5lTGF5b3V0U3RhdGUmKTsKKyAgICBib29sIGFkanVzdExvZ2lj
YWxMaW5lVG9wQW5kTG9naWNhbEhlaWdodElmTmVlZGVkKFNoYXBlSW5zaWRlSW5mbyosIExheW91
dFVuaXQsIExpbmVMYXlvdXRTdGF0ZSYsIElubGluZUJpZGlSZXNvbHZlciYsIEZsb2F0aW5nT2Jq
ZWN0KiwgSW5saW5lSXRlcmF0b3ImLCBXb3JkTWVhc3VyZW1lbnRzJik7CisjZW5kaWYKKyAgICB2
b2lkIGxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmKTsKKyAgICBzdGF0aWMg
dm9pZCByZXBhaW50RGlydHlGbG9hdHMoVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiBmbG9hdHMpOwor
ICAgIHZvaWQgY2hlY2tGbG9hdHNJbkNsZWFuTGluZShSb290SW5saW5lQm94KiwgVmVjdG9yPEZs
b2F0V2l0aFJlY3Q+Jiwgc2l6ZV90JiBmbG9hdEluZGV4LCBib29sJiBlbmNvdW50ZXJlZE5ld0Zs
b2F0LCBib29sJiBkaXJ0aWVkQnlGbG9hdCk7CisgICAgUm9vdElubGluZUJveCogZGV0ZXJtaW5l
U3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsKKyAg
ICB2b2lkIGRldGVybWluZUVuZFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYsIFJvb3RJbmxpbmVC
b3gqIHN0YXJ0Qm94LCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMm
IGNsZWFuTGluZUJpZGlTdGF0dXMpOworICAgIGJvb2wgY2hlY2tQYWdpbmF0aW9uQW5kRmxvYXRz
QXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYpOworICAgIGJvb2wgbWF0Y2hlZEVuZExpbmUoTGlu
ZUxheW91dFN0YXRlJiwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRl
cmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5kTGluZVN0YXR1cyk7Cisg
ICAgdm9pZCBkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpOworICAgIHZvaWQgY2hlY2tMaW5lc0Zv
clRleHRPdmVyZmxvdygpOworICAgIC8vIFBvc2l0aW9ucyBuZXcgZmxvYXRzIGFuZCBhbHNvIGFk
anVzdCBhbGwgZmxvYXRzIGVuY291bnRlcmVkIG9uIHRoZSBsaW5lIGlmIGFueSBvZiB0aGVtCisg
ICAgLy8gaGF2ZSB0byBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2UvY29sdW1uLgorICAgIGJvb2wgcG9z
aXRpb25OZXdGbG9hdE9uTGluZShGbG9hdGluZ09iamVjdCogbmV3RmxvYXQsIEZsb2F0aW5nT2Jq
ZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5mbyYsIExpbmVXaWR0aCYpOwor
CisKKy8vIEVORCBNRVRIT0RTIERFRklORUQgSU4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0CiAgICAg
CiBwdWJsaWM6CiAgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBUaGlzIGNhbiBiZSBtYWRlIHByb3Rl
Y3RlZCBhZ2FpbiBvbmNlIGFsbCBjYWxsZXJzIGhhdmUgYmVlbiBtb3ZlZCBoZXJlLgogICAgIHZv
aWQgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihSb290SW5saW5lQm94KiwgTGF5b3V0
VW5pdCYgZGVsdGFPZmZzZXQsIFJlbmRlckZsb3dUaHJlYWQqKTsgLy8gQ29tcHV0ZXMgYSBkZWx0
YU9mZnNldCB2YWx1ZSB0aGF0IHB1dCBhIGxpbmUgYXQgdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdl
IGlmIGl0IGRvZXNuJ3QgZml0IG9uIHRoZSBjdXJyZW50IHBhZ2UuCiAKIHByb3RlY3RlZDoKKyAg
ICBPd25QdHI8RmxvYXRpbmdPYmplY3RzPiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBPd25QdHI8
UmVuZGVyQmxvY2tGbG93UmFyZURhdGE+IG1fcmFyZURhdGE7CisKKyAgICBmcmllbmQgY2xhc3Mg
TGluZUJyZWFrZXI7CisgICAgZnJpZW5kIGNsYXNzIExpbmVXaWR0aDsgLy8gTmVlZHMgdG8ga25v
dyBGbG9hdGluZ09iamVjdAogfTsKIAogaW5saW5lIFJlbmRlckJsb2NrRmxvdyYgdG9SZW5kZXJC
bG9ja0Zsb3coUmVuZGVyT2JqZWN0JiBvYmplY3QpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCmluZGV4IDRlZjc5ZTE1MWUzNzZmMjMw
NzgwNjAwN2YzMjc5MWNjNTBiNGRjNmIuLjBiOGY2M2E0YmZiZTliZDdjZjVlNGY5ZjdiYzgxZmM0
ZmRiZjNmY2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9j
a0xpbmVMYXlvdXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9j
a0xpbmVMYXlvdXQuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiTGluZUxheW91dFN0
YXRlLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCisj
aW5jbHVkZSAiUmVuZGVyQmxvY2tGbG93LmgiCiAjaW5jbHVkZSAiUmVuZGVyQ29tYmluZVRleHQu
aCIKICNpbmNsdWRlICJSZW5kZXJDb3VudGVyLmgiCiAjaW5jbHVkZSAiUmVuZGVyRmxvd1RocmVh
ZC5oIgpAQCAtODIsNyArODMsNyBAQCBzdHJ1Y3QgUmVuZGVyVGV4dEluZm8gewogCiBjbGFzcyBM
aW5lQnJlYWtlciB7CiBwdWJsaWM6Ci0gICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2sqIGJsb2Nr
KQorICAgIExpbmVCcmVha2VyKFJlbmRlckJsb2NrRmxvdyogYmxvY2spCiAgICAgICAgIDogbV9i
bG9jayhibG9jaykKICAgICB7CiAgICAgICAgIHJlc2V0KCk7CkBAIC0xMDAsNyArMTAxLDcgQEAg
cHJpdmF0ZToKICAgICB2b2lkIHNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0b3Im
LCBjb25zdCBMaW5lSW5mbyYpOwogICAgIHZvaWQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGlu
ZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIExpbmVXaWR0aCYpOwogCi0gICAgUmVuZGVyQmxvY2sqIG1fYmxvY2s7Cisg
ICAgUmVuZGVyQmxvY2tGbG93KiBtX2Jsb2NrOwogICAgIGJvb2wgbV9oeXBoZW5hdGVkOwogICAg
IEVDbGVhciBtX2NsZWFyOwogICAgIFZlY3RvcjxSZW5kZXJCb3gqPiBtX3Bvc2l0aW9uZWRPYmpl
Y3RzOwpAQCAtMjU2LDcgKzI1Nyw3IEBAIHN0YXRpYyBpbmxpbmUgQmlkaVJ1biogY3JlYXRlUnVu
KGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiBvYmosIElubGluZUJpCiAgICAgcmV0
dXJuIG5ldyAob2JqLT5yZW5kZXJBcmVuYSgpKSBCaWRpUnVuKHN0YXJ0LCBlbmQsIG9iaiwgcmVz
b2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6
OmFwcGVuZFJ1bnNGb3JPYmplY3QoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIHJ1bnMsIGludCBzdGFy
dCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiBvYmosIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2
ZXIpCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlz
dDxCaWRpUnVuPiYgcnVucywgaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwg
SW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlcikKIHsKICAgICBpZiAoc3RhcnQgPiBlbmQgfHwg
c2hvdWxkU2tpcENyZWF0aW5nUnVuc0Zvck9iamVjdChvYmopKQogICAgICAgICByZXR1cm47CkBA
IC0zNTAsNyArMzUxLDcgQEAgc3RhdGljIGJvb2wgcGFyZW50SXNDb25zdHJ1Y3RlZE9ySGF2ZU5l
eHQoSW5saW5lRmxvd0JveCogcGFyZW50Qm94KQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotSW5s
aW5lRmxvd0JveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqIG9i
aiwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBJbmxpbmVCb3gqIGNoaWxkQm94LCBib29sIHN0
YXJ0TmV3U2VnbWVudCkKK0lubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGlu
ZUJveGVzKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIElubGlu
ZUJveCogY2hpbGRCb3gsIGJvb2wgc3RhcnROZXdTZWdtZW50KQogewogICAgIC8vIFNlZSBpZiB3
ZSBoYXZlIGFuIHVuY29uc3RydWN0ZWQgbGluZSBib3ggZm9yIHRoaXMgb2JqZWN0IHRoYXQgaXMg
YWxzbwogICAgIC8vIHRoZSBsYXN0IGl0ZW0gb24gdGhlIGxpbmUuCkBAIC00NDMsNyArNDQ0LDcg
QEAgc3RhdGljIGJvb2wgcmVhY2hlZEVuZE9mVGV4dFJlbmRlcmVyKGNvbnN0IEJpZGlSdW5MaXN0
PEJpZGlSdW4+JiBiaWRpUnVucykKICAgICByZXR1cm4gZW5kc1dpdGhBU0NJSVNwYWNlcyhyZW5k
ZXJUZXh0LT5jaGFyYWN0ZXJzMTYoKSwgcG9zLCBsZW5ndGgpOwogfQogCi1Sb290SW5saW5lQm94
KiBSZW5kZXJCbG9jazo6Y29uc3RydWN0TGluZShCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1
bnMsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKK1Jvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2Nr
Rmxvdzo6Y29uc3RydWN0TGluZShCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0
IExpbmVJbmZvJiBsaW5lSW5mbykKIHsKICAgICBBU1NFUlQoYmlkaVJ1bnMuZmlyc3RSdW4oKSk7
CiAKQEAgLTU4Myw3ICs1ODQsNyBAQCBzdGF0aWMgdm9pZCB1cGRhdGVMb2dpY2FsV2lkdGhGb3JD
ZW50ZXJBbGlnbmVkQmxvY2soYm9vbCBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uLAogICAgICAgICBs
b2dpY2FsTGVmdCArPSB0b3RhbExvZ2ljYWxXaWR0aCA+IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCA/
IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgOiAoYXZhaWxhYmxl
TG9naWNhbFdpZHRoIC0gdG90YWxMb2dpY2FsV2lkdGgpIC8gMiAtIHRyYWlsaW5nU3BhY2VXaWR0
aDsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biog
cnVuLCBSZW5kZXJSdWJ5UnVuKiByZW5kZXJlciwgUmVuZGVyT2JqZWN0KiBwcmV2aW91c09iamVj
dCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1h
cmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qIHJ1biwgUmVuZGVyUnVieVJ1biogcmVuZGVyZXIsIFJl
bmRlck9iamVjdCogcHJldmlvdXNPYmplY3QsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKIHsK
ICAgICBpbnQgc3RhcnRPdmVyaGFuZzsKICAgICBpbnQgZW5kT3Zlcmhhbmc7CkBAIC04MDgsNyAr
ODA5LDcgQEAgc3RhdGljIEluZGVudFRleHRPck5vdCByZXF1aXJlc0luZGVudChib29sIGlzRmly
c3RMaW5lLCBib29sIGlzQWZ0ZXJIYXJkTGluZUJyZWEKICAgICByZXR1cm4gc2hvdWxkSW5kZW50
VGV4dDsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbElubGluZVBvc2l0aW9ucyhSZW5k
ZXJCbG9jayogYmxvY2ssIGZsb2F0JiBsaW5lTG9naWNhbExlZnQsIGZsb2F0JiBsaW5lTG9naWNh
bFJpZ2h0LCBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBib29sIGZpcnN0TGluZSwgSW5k
ZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQsIExheW91dFVuaXQgYm94TG9naWNhbEhlaWdo
dCkKK3N0YXRpYyB2b2lkIHVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoUmVuZGVyQmxvY2tG
bG93KiBibG9jaywgZmxvYXQmIGxpbmVMb2dpY2FsTGVmdCwgZmxvYXQmIGxpbmVMb2dpY2FsUmln
aHQsIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGJvb2wgZmlyc3RMaW5lLCBJbmRlbnRU
ZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCwgTGF5b3V0VW5pdCBib3hMb2dpY2FsSGVpZ2h0KQog
ewogICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxIZWlnaHQgPSBibG9jay0+bWluTGluZUhlaWdo
dEZvclJlcGxhY2VkUmVuZGVyZXIoZmlyc3RMaW5lLCBib3hMb2dpY2FsSGVpZ2h0KTsKICAgICBs
aW5lTG9naWNhbExlZnQgPSBibG9jay0+cGl4ZWxTbmFwcGVkTG9naWNhbExlZnRPZmZzZXRGb3JM
aW5lKGJsb2NrLT5sb2dpY2FsSGVpZ2h0KCksIHNob3VsZEluZGVudFRleHQgPT0gSW5kZW50VGV4
dCwgbGluZUxvZ2ljYWxIZWlnaHQpOwpAQCAtODE2LDcgKzgxNyw3IEBAIHN0YXRpYyB2b2lkIHVw
ZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoUmVuZGVyQmxvY2sqIGJsb2NrLCBmbG9hdCYgbGlu
ZUxvZ2ljYWxMCiAgICAgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gbGluZUxvZ2ljYWxSaWdodCAt
IGxpbmVMb2dpY2FsTGVmdDsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUlubGluZURp
cmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGlu
ZUluZm8mIGxpbmVJbmZvLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFj
ZVJ1biwgYm9vbCByZWFjaGVkRW5kLAordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxp
bmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0
IExpbmVJbmZvJiBsaW5lSW5mbywgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5n
U3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRz
TWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCiB7CiAgICAgRVRl
eHRBbGlnbiB0ZXh0QWxpZ24gPSB0ZXh0QWxpZ25tZW50Rm9yTGluZSghcmVhY2hlZEVuZCAmJiAh
bGluZUJveC0+ZW5kc1dpdGhCcmVhaygpKTsKQEAgLTg3Nyw3ICs4NzgsNyBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5l
Qm94KiBsaW5lQm94LAogICAgIGxpbmVCb3gtPnBsYWNlQm94ZXNJbklubGluZURpcmVjdGlvbihs
aW5lTG9naWNhbExlZnQsIG5lZWRzV29yZFNwYWNpbmcsIHRleHRCb3hEYXRhTWFwKTsKIH0KIAot
QmlkaVJ1biogUmVuZGVyQmxvY2s6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JT
ZWdtZW50KFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywg
RVRleHRBbGlnbiB0ZXh0QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwgCitCaWRpUnVuKiBSZW5k
ZXJCbG9ja0Zsb3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KFJv
b3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgRVRleHRBbGln
biB0ZXh0QWxpZ24sIGZsb2F0JiBsb2dpY2FsTGVmdCwgCiAgICAgZmxvYXQmIGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4s
IEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGlj
YWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsCiAgICAgV29yZE1lYXN1cmVt
ZW50cyYgd29yZE1lYXN1cmVtZW50cykKIHsKQEAgLTk0OCw3ICs5NDksNyBAQCBCaWRpUnVuKiBS
ZW5kZXJCbG9jazo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQoUm9v
dElubGluZUJveCogbAogICAgIHJldHVybiByOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpjb21w
dXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gs
IEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4
dEJveERhdGFNYXAsCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9u
UG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBmaXJzdFJ1
biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSkKIHsKICAgICBzZXRMb2dp
Y2FsSGVpZ2h0KGxpbmVCb3gtPmFsaWduQm94ZXNJbkJsb2NrRGlyZWN0aW9uKGxvZ2ljYWxIZWln
aHQoKSwgdGV4dEJveERhdGFNYXAsIHZlcnRpY2FsUG9zaXRpb25DYWNoZSkpOwpAQCAtOTkwLDcg
Kzk5MSw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0NvbGxhcHNpYmxlU3BhY2UoVUNoYXIgY2hh
cmFjdGVyLCBSZW5kZXJUZXh0KiByZW5kZXJlcikKIH0KIAogCi1zdGF0aWMgdm9pZCBzZXRTdGF0
aWNQb3NpdGlvbnMoUmVuZGVyQmxvY2sqIGJsb2NrLCBSZW5kZXJCb3gqIGNoaWxkKQorc3RhdGlj
IHZvaWQgc2V0U3RhdGljUG9zaXRpb25zKFJlbmRlckJsb2NrRmxvdyogYmxvY2ssIFJlbmRlckJv
eCogY2hpbGQpCiB7CiAgICAgLy8gRklYTUU6IFRoZSBtYXRoIGhlcmUgaXMgYWN0dWFsbHkgbm90
IHJlYWxseSByaWdodC4gSXQncyBhIGJlc3QtZ3Vlc3MgYXBwcm94aW1hdGlvbiB0aGF0CiAgICAg
Ly8gd2lsbCB3b3JrIGZvciB0aGUgY29tbW9uIGNhc2VzCkBAIC0xMDIxLDcgKzEwMjIsNyBAQCBz
dGF0aWMgaW5saW5lIGludCBmaW5kRmlyc3RUcmFpbGluZ1NwYWNlKFJlbmRlclRleHQqIGxhc3RU
ZXh0LCBjb25zdCBDaGFyYWN0ZXJUeQogICAgIHJldHVybiBmaXJzdFNwYWNlOwogfQogCi1pbmxp
bmUgQmlkaVJ1biogUmVuZGVyQmxvY2s6OmhhbmRsZVRyYWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0
PEJpZGlSdW4+JiBiaWRpUnVucywgQmlkaUNvbnRleHQqIGN1cnJlbnRDb250ZXh0KQoraW5saW5l
IEJpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6aGFuZGxlVHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBCaWRpQ29udGV4dCogY3VycmVudENvbnRleHQpCiB7CiAg
ICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpCiAgICAgICAgIHx8ICFiaWRpUnVucy5sb2dpY2Fs
bHlMYXN0UnVuKCktPm1fb2JqZWN0LT5zdHlsZSgpLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2Uo
KQpAQCAtMTA3Miw3ICsxMDczLDcgQEAgaW5saW5lIEJpZGlSdW4qIFJlbmRlckJsb2NrOjpoYW5k
bGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMKICAgICByZXR1
cm4gdHJhaWxpbmdTcGFjZVJ1bjsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YXBwZW5kRmxvYXRp
bmdPYmplY3RUb0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCkKK3ZvaWQg
UmVuZGVyQmxvY2tGbG93OjphcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdP
YmplY3QqIGZsb2F0aW5nT2JqZWN0KQogewogICAgIEFTU0VSVCghZmxvYXRpbmdPYmplY3QtPm9y
aWdpbmF0aW5nTGluZSgpKTsKICAgICBmbG9hdGluZ09iamVjdC0+c2V0T3JpZ2luYXRpbmdMaW5l
KGxhc3RSb290Qm94KCkpOwpAQCAtMTE1NSw3ICsxMTU2LDcgQEAgc3RhdGljIGlubGluZSB2b2lk
IGNvbnN0cnVjdEJpZGlSdW5zRm9yU2VnbWVudChJbmxpbmVCaWRpUmVzb2x2ZXImIHRvcFJlc29s
dmVyLAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlSdW5zRm9y
TGluZShjb25zdCBSZW5kZXJCbG9jayogYmxvY2ssIElubGluZUJpZGlSZXNvbHZlciYgdG9wUmVz
b2x2ZXIsIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGVuZE9mTGluZSwgVmlzdWFsRGlyZWN0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIGJvb2wgcHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KQorc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlS
dW5zRm9yTGluZShjb25zdCBSZW5kZXJCbG9ja0Zsb3cqIGJsb2NrLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHRvcFJlc29sdmVyLCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBlbmRPZkxpbmUsIFZpc3VhbERpcmVjdGlvbk92ZXJyaWRlIG92ZXJyaWRl
LCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSkKIHsKICNpZiAhRU5BQkxFKENTU19TSEFQ
RVMpCiAgICAgVU5VU0VEX1BBUkFNKGJsb2NrKTsKQEAgLTExOTIsNyArMTE5Myw3IEBAIHN0YXRp
YyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3RCaWRpUnVuc0ZvckxpbmUoY29uc3QgUmVuZGVyQmxvY2sq
IGJsb2NrLCBJbmxpbmVCaWRpCiB9CiAKIC8vIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyBsaW5l
IGJveGVzIGZvciBhbGwgb2YgdGhlIHRleHQgcnVucyBpbiB0aGUgcmVzb2x2ZXIgYW5kIGNvbXB1
dGVzIHRoZWlyIHBvc2l0aW9uLgotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUxp
bmVCb3hlc0Zyb21CaWRpUnVucyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBlbmQsIExpbmVJbmZvJiBsaW5lSW5mbywgVmVydGljYWxQb3NpdGlv
bkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4s
IFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCitSb290SW5saW5lQm94KiBSZW5k
ZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhCaWRpUnVuTGlzdDxCaWRp
UnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExpbmVJbmZvJiBsaW5l
SW5mbywgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUsIEJpZGlS
dW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMp
CiB7CiAgICAgaWYgKCFiaWRpUnVucy5ydW5Db3VudCgpKQogICAgICAgICByZXR1cm4gMDsKQEAg
LTEyNTcsNyArMTI1OCw3IEBAIHN0YXRpYyB2b2lkIGRlbGV0ZUxpbmVSYW5nZShMaW5lTGF5b3V0
U3RhdGUmIGxheW91dFN0YXRlLCBSZW5kZXJBcmVuYSYgYXJlbmEsIFJvCiAgICAgfQogfQogCi12
b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYgbGF5
b3V0U3RhdGUsIGJvb2wgaGFzSW5saW5lQ2hpbGQpCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5
b3V0UnVuc0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29sIGhhc0lu
bGluZUNoaWxkKQogewogICAgIC8vIFdlIHdhbnQgdG8gc2tpcCBhaGVhZCB0byB0aGUgZmlyc3Qg
ZGlydHkgbGluZQogICAgIElubGluZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKQEAgLTEzMzEsNyAr
MTMzMiw3IEBAIFJlbmRlclRleHRJbmZvOjp+UmVuZGVyVGV4dEluZm8oKQogfQogCiAvLyBCZWZv
cmUgcmVzdGFydGluZyB0aGUgbGF5b3V0IGxvb3Agd2l0aCBhIG5ldyBsb2dpY2FsSGVpZ2h0LCBy
ZW1vdmUgYWxsIGZsb2F0cyB0aGF0IHdlcmUgYWRkZWQgYW5kIHJlc2V0IHRoZSByZXNvbHZlci4K
LWlubGluZSBjb25zdCBJbmxpbmVJdGVyYXRvciYgUmVuZGVyQmxvY2s6OnJlc3RhcnRMYXlvdXRS
dW5zQW5kRmxvYXRzSW5SYW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVu
aXQgbmV3TG9naWNhbEhlaWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCAgY29uc3QgSW5saW5lSXRlcmF0
b3ImIG9sZEVuZCkKK2lubGluZSBjb25zdCBJbmxpbmVJdGVyYXRvciYgUmVuZGVyQmxvY2tGbG93
OjpyZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGF5b3V0VW5pdCBvbGRMb2dpY2Fs
SGVpZ2h0LCBMYXlvdXRVbml0IG5ld0xvZ2ljYWxIZWlnaHQsICBGbG9hdGluZ09iamVjdCogbGFz
dEZsb2F0RnJvbVByZXZpb3VzTGluZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgIGNv
bnN0IElubGluZUl0ZXJhdG9yJiBvbGRFbmQpCiB7CiAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3Rz
QmVsb3cobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgb2xkTG9naWNhbEhlaWdodCk7CiAgICAg
c2V0TG9naWNhbEhlaWdodChuZXdMb2dpY2FsSGVpZ2h0KTsKQEAgLTEzNjIsNyArMTM2Myw3IEBA
IHN0YXRpYyBpbmxpbmUgTGF5b3V0VW5pdCBhZGp1c3RMb2dpY2FsTGluZVRvcChTaGFwZUluc2lk
ZUluZm8qIHNoYXBlSW5zaWRlSW5mbywKICAgICByZXR1cm4gc2hhcGVJbnNpZGVJbmZvLT5zaGFw
ZUxvZ2ljYWxCb3R0b20oKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB1c2hTaGFwZUNvbnRl
bnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJveChSZW5kZXJCbG9jayogYmxvY2ssIFNoYXBlSW5z
aWRlSW5mbyogc2hhcGVJbnNpZGVJbmZvLCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQg
bGluZUhlaWdodCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXNoU2hhcGVDb250ZW50T3ZlcmZsb3dC
ZWxvd1RoZUNvbnRlbnRCb3goUmVuZGVyQmxvY2tGbG93KiBibG9jaywgU2hhcGVJbnNpZGVJbmZv
KiBzaGFwZUluc2lkZUluZm8sIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lSGVp
Z2h0KQogewogICAgIEFTU0VSVChzaGFwZUluc2lkZUluZm8pOwogCkBAIC0xMzgzLDcgKzEzODQs
NyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgcHVzaFNoYXBlQ29udGVudE92ZXJmbG93QmVsb3dUaGVD
b250ZW50Qm94KFJlbmRlckJsb2NrKiBibG9jawogICAgIGJsb2NrLT5zZXRMb2dpY2FsSGVpZ2h0
KG5ld0xvZ2ljYWxIZWlnaHQpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVTaGFwZUFu
ZFNlZ21lbnRzRm9yQ3VycmVudExpbmUoU2hhcGVJbnNpZGVJbmZvKiYgc2hhcGVJbnNpZGVJbmZv
LCBjb25zdCBMYXlvdXRTaXplJiBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyLCBMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVNo
YXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZShTaGFwZUluc2lkZUluZm8qJiBzaGFwZUluc2lk
ZUluZm8sIGNvbnN0IExheW91dFNpemUmIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIs
IExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCiB7CiAgICAgaWYgKGxheW91dFN0YXRlLmZs
b3dUaHJlYWQoKSkKICAgICAgICAgcmV0dXJuIHVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJy
ZW50TGluZUluRmxvd1RocmVhZChzaGFwZUluc2lkZUluZm8sIGxheW91dFN0YXRlKTsKQEAgLTE0
MDEsNyArMTQwMiw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNG
b3JDdXJyZW50TGluZShTaGFwZUluc2lkZUluZm8qJiBzaGFwZUluCiAgICAgcHVzaFNoYXBlQ29u
dGVudE92ZXJmbG93QmVsb3dUaGVDb250ZW50Qm94KHRoaXMsIHNoYXBlSW5zaWRlSW5mbywgbGlu
ZVRvcCwgbGluZUhlaWdodCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZVNoYXBlQW5k
U2VnbWVudHNGb3JDdXJyZW50TGluZUluRmxvd1RocmVhZChTaGFwZUluc2lkZUluZm8qJiBzaGFw
ZUluc2lkZUluZm8sIExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6dXBkYXRlU2hhcGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lSW5GbG93VGhyZWFk
KFNoYXBlSW5zaWRlSW5mbyomIHNoYXBlSW5zaWRlSW5mbywgTGluZUxheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSkKIHsKICAgICBBU1NFUlQobGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKTsKIApAQCAt
MTQ3NSw3ICsxNDc2LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlU2hhcGVBbmRTZWdtZW50
c0ZvckN1cnJlbnRMaW5lSW5GbG93VGhyZWFkKFNoYXBlSW5zaWRlSW4KICAgICAgICAgcHVzaFNo
YXBlQ29udGVudE92ZXJmbG93QmVsb3dUaGVDb250ZW50Qm94KHRoaXMsIHNoYXBlSW5zaWRlSW5m
bywgbGluZVRvcCwgbGluZUhlaWdodCk7CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2s6OmFkanVzdExv
Z2ljYWxMaW5lVG9wQW5kTG9naWNhbEhlaWdodElmTmVlZGVkKFNoYXBlSW5zaWRlSW5mbyogc2hh
cGVJbnNpZGVJbmZvLCBMYXlvdXRVbml0IGFic29sdXRlTG9naWNhbFRvcCwgTGluZUxheW91dFN0
YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgRmxvYXRpbmdP
YmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIElubGluZUl0ZXJhdG9yJiBlbmQsIFdv
cmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCitib29sIFJlbmRlckJsb2NrRmxvdzo6
YWRqdXN0TG9naWNhbExpbmVUb3BBbmRMb2dpY2FsSGVpZ2h0SWZOZWVkZWQoU2hhcGVJbnNpZGVJ
bmZvKiBzaGFwZUluc2lkZUluZm8sIExheW91dFVuaXQgYWJzb2x1dGVMb2dpY2FsVG9wLCBMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBG
bG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgSW5saW5lSXRlcmF0b3Im
IGVuZCwgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKIHsKICAgICBMYXlvdXRV
bml0IGFkanVzdGVkTG9naWNhbExpbmVUb3AgPSBhZGp1c3RMb2dpY2FsTGluZVRvcChzaGFwZUlu
c2lkZUluZm8sIHJlc29sdmVyLnBvc2l0aW9uKCksIGVuZCwgd29yZE1lYXN1cmVtZW50cyk7CiAK
QEAgLTE1MDEsNyArMTUwMiw3IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmFkanVzdExvZ2ljYWxMaW5l
VG9wQW5kTG9naWNhbEhlaWdodElmTmVlZGVkKFNoYXBlSW5zaWRlSW5mbyoKIH0KICNlbmRpZgog
Ci12b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMaW5lTGF5b3V0
U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGNsZWFuTGlu
ZUJpZGlTdGF0dXMsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKQordm9pZCBS
ZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlvdXRTdGF0
ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0IElubGlu
ZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlk
aVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCiB7CiAgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlVG9Vc2UgPSBzdHlsZSgpOwogICAgIGJvb2wgcGFnaW5hdGVkID0gdmll
dygpLmxheW91dFN0YXRlKCkgJiYgdmlldygpLmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7
CkBAIC0xNjE2LDggKzE2MTcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxv
YXRzSW5SYW5nZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbgogCiAgICAgICAg
ICAgICAgICAgaWYgKHBhZ2luYXRlZCkgewogICAgICAgICAgICAgICAgICAgICBMYXlvdXRVbml0
IGFkanVzdG1lbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6
IFJlbW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92
ZXMuCi0gICAgICAgICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2tGbG93KHRoaXMpLT5hZGp1c3RM
aW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmVCb3gsIGFkanVzdG1lbnQsIGxheW91dFN0YXRl
LmZsb3dUaHJlYWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZv
clBhZ2luYXRpb24obGluZUJveCwgYWRqdXN0bWVudCwgbGF5b3V0U3RhdGUuZmxvd1RocmVhZCgp
KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFkanVzdG1lbnQpIHsKICAgICAgICAgICAgICAg
ICAgICAgICAgIExheW91dFVuaXQgb2xkTGluZVdpZHRoID0gYXZhaWxhYmxlTG9naWNhbFdpZHRo
Rm9yTGluZShvbGRMb2dpY2FsSGVpZ2h0LCBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLmlzRmlyc3RM
aW5lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+YWRqdXN0QmxvY2tEaXJl
Y3Rpb25Qb3NpdGlvbihhZGp1c3RtZW50KTsKQEAgLTE2NzcsOCArMTY3Nyw3IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlvdXRTdGF0ZSYgbGF5
b3V0U3RhdGUsIElubGluCiAgICAgLy8gSW4gY2FzZSB3ZSBhbHJlYWR5IGFkanVzdGVkIHRoZSBs
aW5lIHBvc2l0aW9ucyBkdXJpbmcgdGhpcyBsYXlvdXQgdG8gYXZvaWQgd2lkb3dzCiAgICAgLy8g
dGhlbiB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgb2YgaGF2aW5nIGEgbmV3IHdp
ZG93cyBzaXR1YXRpb24uCiAgICAgLy8gT3RoZXJ3aXNlLCB3ZSByaXNrIGxlYXZpbmcgZW1wdHkg
Y29udGFpbmVycyB3aGljaCBpcyBhZ2FpbnN0IHRoZSBibG9jayBmcmFnbWVudGF0aW9uIHByaW5j
aXBsZXMuCi0gICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdGhpcyB0eXBlIGNvbnZlcnNp
b24gb25jZSB0aGUgb3duaW5nIGZ1bmN0aW9uIG1vdmVzLgotICAgIGlmIChwYWdpbmF0ZWQgJiYg
IXN0eWxlKCktPmhhc0F1dG9XaWRvd3MoKSAmJiAhdG9SZW5kZXJCbG9ja0Zsb3codGhpcyktPmRp
ZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCkpIHsKKyAgICBpZiAocGFnaW5hdGVkICYmICFzdHls
ZSgpLT5oYXNBdXRvV2lkb3dzKCkgJiYgIWRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCkpIHsK
ICAgICAgICAgLy8gQ2hlY2sgdGhlIGxpbmUgYm94ZXMgdG8gbWFrZSBzdXJlIHdlIGRpZG4ndCBj
cmVhdGUgdW5hY2NlcHRhYmxlIHdpZG93cy4KICAgICAgICAgLy8gSG93ZXZlciwgd2UnbGwgcHJp
b3JpdGl6ZSBvcnBoYW5zIC0gc28gbm90aGluZyB3ZSBkbyBoZXJlIHNob3VsZCBjcmVhdGUKICAg
ICAgICAgLy8gYSBuZXcgb3JwaGFuLgpAQCAtMTczMCwxNyArMTcyOSwxNSBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMaW5lTGF5b3V0U3RhdGUmIGxheW91
dFN0YXRlLCBJbmxpbgogICAgICAgICAgICAgICAgIGxpbmVCb3ggPSBsaW5lQm94LT5wcmV2Um9v
dEJveCgpOwogCiAgICAgICAgICAgICAvLyBXZSBub3cgd2FudCB0byBicmVhayBhdCB0aGlzIGxp
bmUuIFJlbWVtYmVyIGZvciBuZXh0IGxheW91dCBhbmQgdHJpZ2dlciByZWxheW91dC4KLSAgICAg
ICAgICAgIC8vIEZJWE1FLUJMT0NLRkxPVzogUmVtb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIG9u
Y2UgdGhlIG93bmluZyBmdW5jdGlvbiBtb3Zlcy4KLSAgICAgICAgICAgIHRvUmVuZGVyQmxvY2tG
bG93KHRoaXMpLT5zZXRCcmVha0F0TGluZVRvQXZvaWRXaWRvdyhsaW5lQ291bnQobGluZUJveCkp
OworICAgICAgICAgICAgc2V0QnJlYWtBdExpbmVUb0F2b2lkV2lkb3cobGluZUNvdW50KGxpbmVC
b3gpKTsKICAgICAgICAgICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKGxhc3RSb290Qm94
KCktPmxpbmVCb3R0b21XaXRoTGVhZGluZygpLCBsaW5lQm94LT5saW5lQm90dG9tV2l0aExlYWRp
bmcoKSwgbGluZUJveCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBGSVhNRS1CTE9DS0ZM
T1c6IFJlbW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24g
bW92ZXMuCi0gICAgdG9SZW5kZXJCbG9ja0Zsb3codGhpcyktPmNsZWFyRGlkQnJlYWtBdExpbmVU
b0F2b2lkV2lkb3coKTsKKyAgICBjbGVhckRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7CiB9
CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0U3Rh
dGUmIGxheW91dFN0YXRlKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxpbmtUb0VuZExpbmVJZk5l
ZWRlZChMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQogewogICAgIGlmIChsYXlvdXRTdGF0
ZS5lbmRMaW5lKCkpIHsKICAgICAgICAgaWYgKGxheW91dFN0YXRlLmVuZExpbmVNYXRjaGVkKCkp
IHsKQEAgLTE3NTEsOCArMTc0OCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxpbmtUb0VuZExpbmVJ
Zk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQogICAgICAgICAgICAgICAgIGxp
bmUtPmF0dGFjaExpbmUoKTsKICAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKSB7CiAgICAg
ICAgICAgICAgICAgICAgIGRlbHRhIC09IGxpbmUtPnBhZ2luYXRpb25TdHJ1dCgpOwotICAgICAg
ICAgICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFJlbW92ZSB0aGlzIHR5cGUgY29udmVy
c2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92ZXMuCi0gICAgICAgICAgICAgICAgICAg
IHRvUmVuZGVyQmxvY2tGbG93KHRoaXMpLT5hZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9u
KGxpbmUsIGRlbHRhLCBsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpOworICAgICAgICAgICAgICAg
ICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmUsIGRlbHRhLCBsYXlvdXRT
dGF0ZS5mbG93VGhyZWFkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBp
ZiAoZGVsdGEpIHsKICAgICAgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWlu
dFJhbmdlRnJvbUJveChsaW5lLCBkZWx0YSk7CkBAIC0xODE2LDcgKzE4MTIsNyBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBsYXlvdXRT
dGF0ZSkKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnJlcGFpbnREaXJ0eUZsb2F0cyhW
ZWN0b3I8RmxvYXRXaXRoUmVjdD4mIGZsb2F0cykKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZXBh
aW50RGlydHlGbG9hdHMoVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiBmbG9hdHMpCiB7CiAgICAgc2l6
ZV90IGZsb2F0Q291bnQgPSBmbG9hdHMuc2l6ZSgpOwogICAgIC8vIEZsb2F0cyB0aGF0IGRpZCBu
b3QgaGF2ZSBsYXlvdXQgZGlkIG5vdCByZXBhaW50IHdoZW4gd2UgbGFpZCB0aGVtIG91dC4gVGhl
eSB3b3VsZCBoYXZlCkBAIC0xOTM2LDcgKzE5MzIsNyBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6
bGF5b3V0SW5saW5lQ2hpbGRyZW4oYm9vbCByZWxheW91dENoaWxkcmVuLCBMYXlvdXRVbml0JiBy
ZQogICAgICAgICBjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCk7CiB9CiAKLXZvaWQgUmVuZGVy
QmxvY2s6OmNoZWNrRmxvYXRzSW5DbGVhbkxpbmUoUm9vdElubGluZUJveCogbGluZSwgVmVjdG9y
PEZsb2F0V2l0aFJlY3Q+JiBmbG9hdHMsIHNpemVfdCYgZmxvYXRJbmRleCwgYm9vbCYgZW5jb3Vu
dGVyZWROZXdGbG9hdCwgYm9vbCYgZGlydGllZEJ5RmxvYXQpCit2b2lkIFJlbmRlckJsb2NrRmxv
dzo6Y2hlY2tGbG9hdHNJbkNsZWFuTGluZShSb290SW5saW5lQm94KiBsaW5lLCBWZWN0b3I8Rmxv
YXRXaXRoUmVjdD4mIGZsb2F0cywgc2l6ZV90JiBmbG9hdEluZGV4LCBib29sJiBlbmNvdW50ZXJl
ZE5ld0Zsb2F0LCBib29sJiBkaXJ0aWVkQnlGbG9hdCkKIHsKICAgICBWZWN0b3I8UmVuZGVyQm94
Kj4qIGNsZWFuTGluZUZsb2F0cyA9IGxpbmUtPmZsb2F0c1B0cigpOwogICAgIGlmICghY2xlYW5M
aW5lRmxvYXRzKQpAQCAtMTk2Nyw3ICsxOTYzLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2hlY2tG
bG9hdHNJbkNsZWFuTGluZShSb290SW5saW5lQm94KiBsaW5lLCBWZWN0b3I8RmxvYXRXaXRoUmUK
ICAgICB9CiB9CiAKLVJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpkZXRlcm1pbmVTdGFydFBv
c2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIpCitSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZVN0YXJ0
UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlcikKIHsKICAgICBSb290SW5saW5lQm94KiBjdXJyID0gMDsKICAgICBSb290SW5s
aW5lQm94KiBsYXN0ID0gMDsKQEAgLTE5ODYsOCArMTk4Miw3IEBAIFJvb3RJbmxpbmVCb3gqIFJl
bmRlckJsb2NrOjpkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0
U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgICAgICBwYWdpbmF0aW9uRGVsdGEgLT0gY3Vyci0+cGFnaW5hdGlvblN0cnV0KCk7
Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdGhpcyB0eXBlIGNv
bnZlcnNpb24gb25jZSB0aGUgb3duaW5nIGZ1bmN0aW9uIG1vdmVzLgotICAgICAgICAgICAgICAg
IHRvUmVuZGVyQmxvY2tGbG93KHRoaXMpLT5hZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9u
KGN1cnIsIHBhZ2luYXRpb25EZWx0YSwgbGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKTsKKyAgICAg
ICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGN1cnIsIHBhZ2luYXRp
b25EZWx0YSwgbGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKTsKICAgICAgICAgICAgICAgICBpZiAo
cGFnaW5hdGlvbkRlbHRhKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0Zsb2F0
cygpIHx8ICFsYXlvdXRTdGF0ZS5mbG9hdHMoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIEZJWE1FOiBEbyBiZXR0ZXIgZXZlbnR1YWxseS4gIEZvciBub3cgaWYgd2Ug
ZXZlciBzaGlmdCBiZWNhdXNlIG9mIHBhZ2luYXRpb24gYW5kIGZsb2F0cyBhcmUgcHJlc2VudCBq
dXN0IGdvIHRvIGEgZnVsbCBsYXlvdXQuCkBAIC0yMDg1LDcgKzIwODAsNyBAQCBSb290SW5saW5l
Qm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUm
IGxheW91dFN0YXRlLAogICAgIHJldHVybiBjdXJyOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpk
ZXRlcm1pbmVFbmRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBSb290SW5s
aW5lQm94KiBzdGFydExpbmUsIElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgQmlkaVN0
YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cykKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1p
bmVFbmRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBSb290SW5saW5lQm94
KiBzdGFydExpbmUsIElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgQmlkaVN0YXR1cyYg
Y2xlYW5MaW5lQmlkaVN0YXR1cykKIHsKICAgICBBU1NFUlQoIWxheW91dFN0YXRlLmVuZExpbmUo
KSk7CiAgICAgc2l6ZV90IGZsb2F0SW5kZXggPSBsYXlvdXRTdGF0ZS5mbG9hdEluZGV4KCk7CkBA
IC0yMTIyLDcgKzIxMTcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpkZXRlcm1pbmVFbmRQb3NpdGlv
bihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBSb290SW5saW5lQgogICAgIGxheW91dFN0
YXRlLnNldEVuZExpbmUobGFzdCk7CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2s6OmNoZWNrUGFnaW5h
dGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQorYm9v
bCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQogewogICAgIExheW91dFVuaXQgbGluZURlbHRhID0g
bG9naWNhbEhlaWdodCgpIC0gbGF5b3V0U3RhdGUuZW5kTGluZUxvZ2ljYWxUb3AoKTsKIApAQCAt
MjEzNiw4ICsyMTMxLDcgQEAgYm9vbCBSZW5kZXJCbG9jazo6Y2hlY2tQYWdpbmF0aW9uQW5kRmxv
YXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUKICAgICAgICAgICAgICAg
ICAvLyBzdHJ1dCB5ZXQuCiAgICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRQYWdpbmF0aW9u
U3RydXQgPSBsaW5lQm94LT5wYWdpbmF0aW9uU3RydXQoKTsKICAgICAgICAgICAgICAgICBsaW5l
RGVsdGEgLT0gb2xkUGFnaW5hdGlvblN0cnV0OwotICAgICAgICAgICAgICAgIC8vIEZJWE1FLUJM
T0NLRkxPVzogUmVtb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIG9uY2UgdGhlIG93bmluZyBmdW5j
dGlvbiBtb3Zlcy4KLSAgICAgICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+YWRq
dXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lQm94LCBsaW5lRGVsdGEsIGxheW91dFN0
YXRlLmZsb3dUaHJlYWQoKSk7CisgICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9y
UGFnaW5hdGlvbihsaW5lQm94LCBsaW5lRGVsdGEsIGxheW91dFN0YXRlLmZsb3dUaHJlYWQoKSk7
CiAgICAgICAgICAgICAgICAgbGluZUJveC0+c2V0UGFnaW5hdGlvblN0cnV0KG9sZFBhZ2luYXRp
b25TdHJ1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobGluZVdpZHRoRm9yUGFn
aW5hdGVkTGluZUNoYW5nZWQobGluZUJveCwgbGluZURlbHRhLCBsYXlvdXRTdGF0ZS5mbG93VGhy
ZWFkKCkpKQpAQCAtMjE2OCw3ICsyMTYyLDcgQEAgYm9vbCBSZW5kZXJCbG9jazo6Y2hlY2tQYWdp
bmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUKICAg
ICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBSZW5kZXJCbG9jazo6bWF0Y2hlZEVuZExpbmUoTGlu
ZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNv
bHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1
cyYgZW5kTGluZVN0YXR1cykKK2Jvb2wgUmVuZGVyQmxvY2tGbG93OjptYXRjaGVkRW5kTGluZShM
aW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBjb25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJl
c29sdmVyLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3Rh
dHVzJiBlbmRMaW5lU3RhdHVzKQogewogICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpID09IGVu
ZExpbmVTdGFydCkgewogICAgICAgICBpZiAocmVzb2x2ZXIuc3RhdHVzKCkgIT0gZW5kTGluZVN0
YXR1cykKQEAgLTIzNTAsNyArMjM0NCw3IEBAIHZvaWQgTGluZUJyZWFrZXI6OnNraXBMZWFkaW5n
V2hpdGVzcGFjZShJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYKIAogLy8g
VGhpcyBpcyBjdXJyZW50bHkganVzdCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBm
bG93cyB0aGF0IGhhdmUgbGluZSBib3hlcy4gTmVpdGhlciBzaG91bGQKIC8vIGhhdmUgYW4gZWZm
ZWN0IG9uIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotc3RhdGljIGJvb2wg
c2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrKiBibG9jaywg
UmVuZGVyT2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUpCitz
dGF0aWMgYm9vbCBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QoUmVuZGVyQmxv
Y2tGbG93KiBibG9jaywgUmVuZGVyT2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1p
ZHBvaW50U3RhdGUpCiB7CiAgICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHRTa2lwcGlu
Z0VtcHR5SW5saW5lcyhibG9jaywgbyk7CiAgICAgd2hpbGUgKG5leHQgJiYgbmV4dC0+aXNGbG9h
dGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQpAQCAtMjY1OSw3ICsyNjUzLDcgQEAgc3RhdGlj
IGJvb2wgY2FuQnJlYWtBdFRoaXNQb3NpdGlvbihib29sIGF1dG9XcmFwLCBMaW5lV2lkdGgmIHdp
ZHRoLCBJbmxpbmVJdGVyYXQKIH0KIAogI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotc3RhdGljIHZv
aWQgdXBkYXRlU2VnbWVudHNGb3JTaGFwZXMoUmVuZGVyQmxvY2sqIGJsb2NrLCBjb25zdCBGbG9h
dGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc3QgV29yZE1lYXN1cmVt
ZW50cyYgd29yZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0aCwgYm9vbCBpc0ZpcnN0TGlu
ZSkKK3N0YXRpYyB2b2lkIHVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVzKFJlbmRlckJsb2NrRmxvdyog
YmxvY2ssIGNvbnN0IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBj
b25zdCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBMaW5lV2lkdGgmIHdpZHRo
LCBib29sIGlzRmlyc3RMaW5lKQogewogICAgIEFTU0VSVChsYXN0RmxvYXRGcm9tUHJldmlvdXNM
aW5lKTsKIApAQCAtMzM2Miw3ICszMzU2LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkT3ZlcmZs
b3dGcm9tSW5saW5lQ2hpbGRyZW4oKQogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6ZGVs
ZXRlRWxsaXBzaXNMaW5lQm94ZXMoKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmRlbGV0ZUVsbGlw
c2lzTGluZUJveGVzKCkKIHsKICAgICBFVGV4dEFsaWduIHRleHRBbGlnbiA9IHN0eWxlKCktPnRl
eHRBbGlnbigpOwogICAgIGJvb2wgbHRyID0gc3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlv
bigpOwpAQCAtMzM4Niw3ICszMzgwLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6ZGVsZXRlRWxsaXBz
aXNMaW5lQm94ZXMoKQogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6Y2hlY2tMaW5lc0Zv
clRleHRPdmVyZmxvdygpCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2hlY2tMaW5lc0ZvclRleHRP
dmVyZmxvdygpCiB7CiAgICAgLy8gRGV0ZXJtaW5lIHRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzaXMg
dXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KICAgICAvLyBGSVhNRTogQ1NTMyBzYXlzIHRoaXMgaXMg
Y29uZmlndXJhYmxlLCBhbHNvIG5lZWQgdG8gdXNlIDB4MDAyRSAoRlVMTCBTVE9QKSBpZiBob3Jp
em9udGFsIGVsbGlwc2lzIGlzICJub3QgcmVuZGVyYWJsZSIKQEAgLTM0MzMsNyArMzQyNyw3IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQogICAgIH0KIH0K
IAotYm9vbCBSZW5kZXJCbG9jazo6cG9zaXRpb25OZXdGbG9hdE9uTGluZShGbG9hdGluZ09iamVj
dCogbmV3RmxvYXQsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBM
aW5lSW5mbyYgbGluZUluZm8sIExpbmVXaWR0aCYgd2lkdGgpCitib29sIFJlbmRlckJsb2NrRmxv
dzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZShGbG9hdGluZ09iamVjdCogbmV3RmxvYXQsIEZsb2F0
aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5mbyYgbGluZUluZm8s
IExpbmVXaWR0aCYgd2lkdGgpCiB7CiAgICAgaWYgKCFwb3NpdGlvbk5ld0Zsb2F0cygpKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQm94LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCmlu
ZGV4IDY2ODFkMzQ0ZDc5MzRjNTM5NTc4MDhkOTBkMjliMmY3ZTJkMTE3OWUuLjg3NDNlZjQ4YjM5
MmQ1YzBhNzI2ZWIzMGNmNzkxM2NjMWNjNDcxOTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCb3guY3BwCkBAIC0yMjMsMjIgKzIyMywxNyBAQCB2b2lkIFJlbmRlckJveDo6d2lsbEJl
RGVzdHJveWVkKCkKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6d2lsbEJlRGVzdHJveWVkKCk7
CiB9CiAKLVJlbmRlckJsb2NrKiBSZW5kZXJCb3g6Om91dGVybW9zdEJsb2NrQ29udGFpbmluZ0Zs
b2F0aW5nT2JqZWN0KCkKK1JlbmRlckJsb2NrRmxvdyogUmVuZGVyQm94OjpvdXRlcm1vc3RCbG9j
a0NvbnRhaW5pbmdGbG9hdGluZ09iamVjdCgpCiB7CiAgICAgQVNTRVJUKGlzRmxvYXRpbmcoKSk7
Ci0gICAgUmVuZGVyQmxvY2sqIHBhcmVudEJsb2NrID0gMDsKKyAgICBSZW5kZXJCbG9ja0Zsb3cq
IHBhcmVudEJsb2NrID0gMDsKICAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IHBhcmVudCgp
OyBjdXJyICYmICFjdXJyLT5pc1JlbmRlclZpZXcoKTsgY3VyciA9IGN1cnItPnBhcmVudCgpKSB7
Ci0gICAgICAgIGlmIChjdXJyLT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRl
ckJsb2NrKiBjdXJyQmxvY2sgPSB0b1JlbmRlckJsb2NrKGN1cnIpOworICAgICAgICBpZiAoY3Vy
ci0+aXNSZW5kZXJCbG9ja0Zsb3coKSkgeworICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93KiBj
dXJyQmxvY2sgPSB0b1JlbmRlckJsb2NrRmxvdyhjdXJyKTsKICAgICAgICAgICAgIGlmICghcGFy
ZW50QmxvY2sgfHwgY3VyckJsb2NrLT5jb250YWluc0Zsb2F0KHRoaXMpKQogICAgICAgICAgICAg
ICAgIHBhcmVudEJsb2NrID0gY3VyckJsb2NrOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChw
YXJlbnRCbG9jaykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHBhcmVudCA9IHBhcmVudEJsb2Nr
LT5wYXJlbnQoKTsKLSAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQtPmlzRmxleGlibGVCb3hJ
bmNsdWRpbmdEZXByZWNhdGVkKCkpCi0gICAgICAgICAgICBwYXJlbnRCbG9jayA9IHRvUmVuZGVy
QmxvY2socGFyZW50KTsKLSAgICB9CiAgICAgcmV0dXJuIHBhcmVudEJsb2NrOwogfQogCkBAIC0y
NTAsNyArMjQ1LDcgQEAgdm9pZCBSZW5kZXJCb3g6OnJlbW92ZUZsb2F0aW5nT3JQb3NpdGlvbmVk
Q2hpbGRGcm9tQmxvY2tMaXN0cygpCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChpc0Zsb2F0
aW5nKCkpIHsKLSAgICAgICAgaWYgKFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IG91dGVybW9z
dEJsb2NrQ29udGFpbmluZ0Zsb2F0aW5nT2JqZWN0KCkpIHsKKyAgICAgICAgaWYgKFJlbmRlckJs
b2NrRmxvdyogcGFyZW50QmxvY2sgPSBvdXRlcm1vc3RCbG9ja0NvbnRhaW5pbmdGbG9hdGluZ09i
amVjdCgpKSB7CiAgICAgICAgICAgICBwYXJlbnRCbG9jay0+bWFya1NpYmxpbmdzV2l0aEZsb2F0
c0ZvckxheW91dCh0aGlzKTsKICAgICAgICAgICAgIHBhcmVudEJsb2NrLT5tYXJrQWxsRGVzY2Vu
ZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KHRoaXMsIGZhbHNlKTsKICAgICAgICAgfQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5oIGIvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJveC5oCmluZGV4IDk2M2RkMjU5NmM3YzMyYjM5N2RmMjNkMDA3
MjVjODQ2Y2E1Nzc4MWQuLjk4MjcyZGI1M2UzMTU1NWU3ZDhkY2NlZjUxYzI4YjVlZjcyNTdjMTUg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guaAorKysgYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmgKQEAgLTMyLDYgKzMyLDcgQEAKIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCitjbGFzcyBSZW5kZXJCbG9ja0Zsb3c7CiBjbGFzcyBSZW5k
ZXJCb3hSZWdpb25JbmZvOwogY2xhc3MgUmVuZGVyUmVnaW9uOwogc3RydWN0IFBhaW50SW5mbzsK
QEAgLTUwMiw3ICs1MDMsNyBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIFZpc2libGVQb3NpdGlv
biBwb3NpdGlvbkZvclBvaW50KGNvbnN0IExheW91dFBvaW50JikgT1ZFUlJJREU7CiAKLSAgICBS
ZW5kZXJCbG9jayogb3V0ZXJtb3N0QmxvY2tDb250YWluaW5nRmxvYXRpbmdPYmplY3QoKTsKKyAg
ICBSZW5kZXJCbG9ja0Zsb3cqIG91dGVybW9zdEJsb2NrQ29udGFpbmluZ0Zsb2F0aW5nT2JqZWN0
KCk7CiAKICAgICB2b2lkIHJlbW92ZUZsb2F0aW5nT3JQb3NpdGlvbmVkQ2hpbGRGcm9tQmxvY2tM
aXN0cygpOwogICAgIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJveE1vZGVsT2JqZWN0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hN
b2RlbE9iamVjdC5jcHAKaW5kZXggODdmNTA0OGIyZWE4NzBmNDQzYmRiMDc4MGE2ODVhM2E2NThi
N2M2Yy4uMzYzN2M4YWUzNGViNzkxYmFkM2Y1YTMyMTU2YjI5ZWVmNjYwN2Y2NiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCkBAIC0y
ODAxLDkgKzI4MDEsOSBAQCB2b2lkIFJlbmRlckJveE1vZGVsT2JqZWN0Ojptb3ZlQ2hpbGRyZW5U
byhSZW5kZXJCb3hNb2RlbE9iamVjdCogdG9Cb3hNb2RlbE9iamVjdAogICAgIC8vIGFub255bW91
cyBibG9ja3Mgd2hpY2ggY2FuIG5vIGxvbmdlciBjYXJyeSBwb3NpdGlvbmVkIG9iamVjdHMgKHNl
ZSByMTIwNzYxKQogICAgIC8vIG9yIHdoZW4gZnVsbFJlbW92ZUluc2VydCBpcyBmYWxzZS4KICAg
ICBpZiAoZnVsbFJlbW92ZUluc2VydCAmJiBpc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgUmVu
ZGVyQmxvY2sqIGJsb2NrID0gdG9SZW5kZXJCbG9jayh0aGlzKTsKLSAgICAgICAgYmxvY2stPnJl
bW92ZVBvc2l0aW9uZWRPYmplY3RzKDApOwotICAgICAgICBibG9jay0+cmVtb3ZlRmxvYXRpbmdP
YmplY3RzKCk7IAorICAgICAgICB0b1JlbmRlckJsb2NrKHRoaXMpLT5yZW1vdmVQb3NpdGlvbmVk
T2JqZWN0cygwKTsKKyAgICAgICAgaWYgKGlzUmVuZGVyQmxvY2tGbG93KCkpCisgICAgICAgICAg
ICB0b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+cmVtb3ZlRmxvYXRpbmdPYmplY3RzKCk7IAogICAg
IH0KIAogICAgIEFTU0VSVCghYmVmb3JlQ2hpbGQgfHwgdG9Cb3hNb2RlbE9iamVjdCA9PSBiZWZv
cmVDaGlsZC0+cGFyZW50KCkpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlcklubGluZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5l
LmNwcAppbmRleCA5N2I1ZDcwMjY2NmM3YWQwNzNmYTM5YWUyNTk4M2ZkZTQ0YzE2NmZiLi5lNGI2
YWQ5OWQwYjE5M2ExMzJkYzZmZmYyMjE1NmViYjg3MGFhYjc5IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcApAQCAtNDQ4LDcgKzQ0OCwxMSBAQCB2b2lkIFJlbmRl
cklubGluZTo6c3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2Nr
KiBuZXdCbG9ja0JveAogICAgICAgICAvLyBXZSBjYW4gcmV1c2UgdGhpcyBibG9jayBhbmQgbWFr
ZSBpdCB0aGUgcHJlQmxvY2sgb2YgdGhlIG5leHQgY29udGludWF0aW9uLgogICAgICAgICBwcmUg
PSBibG9jazsKICAgICAgICAgcHJlLT5yZW1vdmVQb3NpdGlvbmVkT2JqZWN0cygwKTsKLSAgICAg
ICAgcHJlLT5yZW1vdmVGbG9hdGluZ09iamVjdHMoKTsKKyAgICAgICAgLy8gRklYTUUtQkxPQ0tG
TE9XOiBUaGUgZW5jbG9zaW5nIG1ldGhvZCBzaG91bGQgbGlrZWx5IGJlIHN3aXRjaGVkIG92ZXIK
KyAgICAgICAgLy8gdG8gb25seSB3b3JrIG9uIFJlbmRlckJsb2NrRmxvdywgaW4gd2hpY2ggY2Fz
ZSB0aGlzIGNvbnZlcnNpb24gY2FuIGJlCisgICAgICAgIC8vIHJlbW92ZWQuCisgICAgICAgIGlm
IChwcmUtPmlzUmVuZGVyQmxvY2tGbG93KCkpCisgICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxv
dyhwcmUpLT5yZW1vdmVGbG9hdGluZ09iamVjdHMoKTsKICAgICAgICAgYmxvY2sgPSBibG9jay0+
Y29udGFpbmluZ0Jsb2NrKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gTm8gYW5vbnltb3Vz
IGJsb2NrIGF2YWlsYWJsZSBmb3IgdXNlLiAgTWFrZSBvbmUuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>213713</attachid>
            <date>2013-10-08 13:37:52 -0700</date>
            <delta_ts>2013-10-08 15:21:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-122512-20131008133752.patch</filename>
            <type>text/plain</type>
            <size>158243</size>
            <attacher name="Bem Jones-Bey">bjonesbe</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU3MTA4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOWRkNWViY2FhYjdjZWI2
OWU3MTIyY2EyZjNiYjE0MDAzZDMyOTdkNS4uYjRkZTVkYzA3MGRhOTBiMzk5NzEwMGE1YTQ2MDg2
NjNjODhlYTY2NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEyNyBAQAorMjAxMy0xMC0wOCAgQmVt
IEpvbmVzLUJleSAgPGJqb25lc2JlQGFkb2JlLmNvbT4KKworICAgICAgICBNb3ZlIG1fZmxvYXRp
bmdPYmplY3RzIHRvIFJlbmRlckJsb2NrRmxvdyBmcm9tIFJlbmRlckJsb2NrCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjI1MTIKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBGbG9hdHMgYXJlIHBhcnQgb2Yg
YmxvY2sgZmxvdywgbm90IGV2ZXJ5IFJlbmRlckJsb2NrIGNhbiBjb250YWluCisgICAgICAgIGZs
b2Fycy4gVGhpcyBjaGFuZ2UgbWFrZXMgaXQgc28gdGhhdCBSZW5kZXJCbG9jayBubyBsb25nZXIg
Y2FuIGNvbnRhaW4KKyAgICAgICAgZmxvYXRzLCBvbmx5IFJlbmRlckJsb2NrRmxvdyBjYW4uCisK
KyAgICAgICAgVGhpcyBhbHNvIG1vdmVzIGEgYnVuY2ggb2YgbGluZSBsYXlvdXQgc3R1ZmYgb3Zl
ciB0byBSZW5kZXJCbG9ja0Zsb3csCisgICAgICAgIGJ1dCBtYWtlcyBubyBlZmZvcnQgdG8gbW92
ZSBhbGwgb2YgbGluZSBsYXlvdXQsIGFzIGFsbCBvZiB0aGF0IGlzCisgICAgICAgIGRlc3RpbmVk
IHRvIG1vdmUgb3V0IG9mIGJvdGggUmVuZGVyQmxvY2tGbG93IGFuZCBSZW5kZXJCbG9jayBpbnRv
IGl0cworICAgICAgICBvd24gY2xhc3MuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBubyBiZWhh
dmlvciBjaGFuZ2UuCisKKyAgICAgICAgKiByZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaDoKKyAg
ICAgICAgKFdlYkNvcmU6OklubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuKToKKyAgICAgICAg
KiByZW5kZXJpbmcvTGluZVdpZHRoLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVXaWR0aDo6
TGluZVdpZHRoKToKKyAgICAgICAgKiByZW5kZXJpbmcvTGluZVdpZHRoLmg6CisgICAgICAgICog
cmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
OjpzdHlsZVdpbGxDaGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnN0eWxl
RGlkQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzcGxpdEZsb3cpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmRlbGV0ZUxpbmVCb3hUcmVlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9jazo6Y29tcHV0ZU92ZXJmbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpzZWxlY3Rpb25HYXBzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjph
ZGp1c3RGb3JCb3JkZXJGaXQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmNvbnRhaW5zRmxvYXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzaG91bGRTa2lwQ3JlYXRpbmdSdW5zRm9yT2JqZWN0KToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21GbG9hdHMpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9y
TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6bG9naWNhbExlZnRGbG9hdE9m
ZnNldEZvckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6Om1vdmVBbGxDaGls
ZHJlbk9uUmVtb3ZhbFRvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpwYWludEZs
b2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6aGl0VGVzdEZsb2F0cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6Y2xpcE91dEZsb2F0aW5nT2JqZWN0cyk6Cisg
ICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6bGF5b3V0QmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpsYXlvdXRCbG9ja0NoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6Y29sbGFwc2VNYXJnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
Y2xlYXJGbG9hdHNJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OmFkanVzdEJsb2NrQ2hpbGRGb3JQYWdpbmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6Y29udGFpbnNGbG9hdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OnN0eWxlRGlkQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6c3R5bGVXaWxsQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
ZGVsZXRlTGluZUJveFRyZWUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpt
b3ZlQWxsQ2hpbGRyZW5PblJlbW92YWxUbyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmFkZE92ZXJmbG93RnJvbUZsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OmNvbXB1dGVPdmVyZmxvdyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OnJlcGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OnBhaW50RmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6Y2xpcE91dEZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OmNyZWF0ZUZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6OnJlbW92ZUZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Omluc2VydEZsb2F0aW5nT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6cmVtb3ZlRmxvYXRpbmdPYmplY3QpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9h
dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bmV3TGluZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5l
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bG9naWNhbFJpZ2h0RmxvYXRP
ZmZzZXRGb3JMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bmV4dEZs
b2F0TG9naWNhbEJvdHRvbUJlbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6YWRkT3ZlcmhhbmdpbmdGbG9hdHMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpoYXNPdmVyaGFuZ2luZ0Zsb2F0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6YWRkSW50cnVkaW5nRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrRmxvdzo6bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JM
YXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpnZXRDbGVhckRlbHRh
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6aGl0VGVzdEZsb2F0cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZvckJvcmRlckZpdCk6Cisg
ICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjpoYXNPdmVyaGFuZ2luZ0Zsb2F0cyk6CisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJl
YWtlcjo6TGluZUJyZWFrZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojph
cHBlbmRSdW5zRm9yT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
Y3JlYXRlTGluZUJveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29u
c3RydWN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnNldE1hcmdp
bnNGb3JSdWJ5UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3Np
dGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5l
RGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRp
b25zRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpzZXRTdGF0aWNQb3NpdGlvbnMpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9M
YXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpjb25zdHJ1Y3RCaWRpUnVuc0ZvckxpbmUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlk
aVJ1bnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5k
RmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6cmVzdGFydExheW91
dFJ1bnNBbmRGbG9hdHNJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OnB1c2hTaGFwZUNvbnRl
bnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJy
ZW50TGluZUluRmxvd1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OmFkanVzdExvZ2ljYWxMaW5lVG9wQW5kTG9naWNhbEhlaWdodElmTmVlZGVkKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpyZXBhaW50RGlydHlGbG9hdHMp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVja0Zsb2F0c0luQ2xlYW5M
aW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lU3RhcnRQ
b3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZUVu
ZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y2hlY2tQYWdp
bmF0aW9uQW5kRmxvYXRzQXRFbmRMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6bWF0Y2hlZEVuZExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkU2tpcFdoaXRl
c3BhY2VBZnRlclN0YXJ0T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRz
Rm9yU2hhcGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxs
aXBzaXNMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVj
a0xpbmVzRm9yVGV4dE92ZXJmbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6cG9zaXRpb25OZXdGbG9hdE9uTGluZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJv
eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCb3g6Om91dGVybW9zdEJsb2NrQ29udGFp
bmluZ0Zsb2F0aW5nT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJveDo6cmVtb3Zl
RmxvYXRpbmdPclBvc2l0aW9uZWRDaGlsZEZyb21CbG9ja0xpc3RzKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyQm94Lmg6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2Jq
ZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJveE1vZGVsT2JqZWN0Ojptb3ZlQ2hp
bGRyZW5Ubyk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJJbmxpbmU6OnNwbGl0Rmxvdyk6CisKIDIwMTMtMTAtMDggIEh1cm5q
b28gTGVlICA8aHVybmpvby5sZWVAc2Ftc3VuZy5jb20+CiAKICAgICAgICAgQ29tcG9zaXRlZCBs
YXllciB0aGF0IHBhaW50ZWQgaW50byBjb21wb3NpdGVkIGFuY2VzdG9yIGlzIG5vdCByZXBhaW50
ZWQgYWZ0ZXIgbW92aW5nCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5s
aW5lSXRlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5o
CmluZGV4IDg0ZjE2ZDRlN2NhYTIyNTc0MWQwZDg1Y2E5NDg0ZDg5YjIxMjVmMWEuLjhlYmFlNTNi
MTRhOThiMzgwYjFjZDNkZGRkNmY2NzQ2NjkxY2JmZWQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9JbmxpbmVJdGVyYXRvci5oCkBAIC0yNCw3ICsyNCw3IEBACiAjZGVmaW5lIElubGluZUl0
ZXJhdG9yX2gKIAogI2luY2x1ZGUgIkJpZGlSdW4uaCIKLSNpbmNsdWRlICJSZW5kZXJCbG9jay5o
IgorI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgogI2luY2x1ZGUgIlJlbmRlcklubGluZS5o
IgogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+
CkBAIC01MjEsNyArNTIxLDcgQEAgaW5saW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjphcHBl
bmRSdW4oKQogICAgICAgICAgICAgaWYgKGlzb2xhdGVUcmFja2VyLmluSXNvbGF0ZSgpKQogICAg
ICAgICAgICAgICAgIGlzb2xhdGVUcmFja2VyLmFkZEZha2VSdW5JZk5lY2Vzc2FyeShvYmosIHN0
YXJ0LCAqdGhpcyk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUmVuZGVyQmxv
Y2s6OmFwcGVuZFJ1bnNGb3JPYmplY3QobV9ydW5zLCBzdGFydCwgb2JqLT5sZW5ndGgoKSwgb2Jq
LCAqdGhpcyk7CisgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9y
T2JqZWN0KG1fcnVucywgc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOwogICAgICAg
ICAgICAgLy8gRklYTUU6IHN0YXJ0L29iaiBzaG91bGQgYmUgYW4gSW5saW5lSXRlcmF0b3IgaW5z
dGVhZCBvZiB0d28gc2VwYXJhdGUgdmFyaWFibGVzLgogICAgICAgICAgICAgc3RhcnQgPSAwOwog
ICAgICAgICAgICAgb2JqID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX3Nvci5yb290
KCksIG9iaiwgJmlzb2xhdGVUcmFja2VyKTsKQEAgLTUzNyw3ICs1MzcsNyBAQCBpbmxpbmUgdm9p
ZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmFwcGVuZFJ1bigpCiAgICAgICAgICAgICBpZiAoaXNvbGF0
ZVRyYWNrZXIuaW5Jc29sYXRlKCkpCiAgICAgICAgICAgICAgICAgaXNvbGF0ZVRyYWNrZXIuYWRk
RmFrZVJ1bklmTmVjZXNzYXJ5KG9iaiwgc3RhcnQsICp0aGlzKTsKICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICBSZW5kZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChtX3J1bnMs
IHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOworICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrRmxv
dzo6YXBwZW5kUnVuc0Zvck9iamVjdChtX3J1bnMsIHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOwog
ICAgICAgICB9CiAKICAgICAgICAgbV9lb3IuaW5jcmVtZW50KCk7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZVdpZHRoLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9MaW5lV2lkdGguY3BwCmluZGV4IDgwYTdhYzY2YjE5YTU5ODZkNGIzZjMxYjAxNjU2ODI1
OTg5Zjk4MjMuLmZkY2VhN2JhYWQyOWFlYzgwMjhkYWRmOWJiMjg5ZTkyY2FhN2RjZTMgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguY3BwCkBAIC0zMCwxMiArMzAsMTIgQEAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJMaW5lV2lkdGguaCIKIAotI2luY2x1ZGUgIlJl
bmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyQmxvY2tGbG93LmgiCiAjaW5jbHVkZSAiUmVu
ZGVyUnVieVJ1bi5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUxpbmVXaWR0aDo6TGluZVdp
ZHRoKFJlbmRlckJsb2NrJiBibG9jaywgYm9vbCBpc0ZpcnN0TGluZSwgSW5kZW50VGV4dE9yTm90
IHNob3VsZEluZGVudFRleHQpCitMaW5lV2lkdGg6OkxpbmVXaWR0aChSZW5kZXJCbG9ja0Zsb3cm
IGJsb2NrLCBib29sIGlzRmlyc3RMaW5lLCBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4
dCkKICAgICA6IG1fYmxvY2soYmxvY2spCiAgICAgLCBtX3VuY29tbWl0dGVkV2lkdGgoMCkKICAg
ICAsIG1fY29tbWl0dGVkV2lkdGgoMCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9MaW5lV2lkdGguaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguaApp
bmRleCBmODhjMmFiYjEwYjdlYmYxOWI4OTJhMWNiZTNmNDI5MjRiODk0YmEwLi5lNzUyMmNmZmUw
ZjAwMDQxMTNmZTVhYTNmZTllYTc0ZDE2NzE1NzU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvTGluZVdpZHRoLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xp
bmVXaWR0aC5oCkBAIC0zNSw3ICszNSw3IEBACiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNz
IEZsb2F0aW5nT2JqZWN0OwotY2xhc3MgUmVuZGVyQmxvY2s7CitjbGFzcyBSZW5kZXJCbG9ja0Zs
b3c7CiBjbGFzcyBSZW5kZXJPYmplY3Q7CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOwogCkBAIC00NSw3
ICs0NSw3IEBAIGVudW0gSW5kZW50VGV4dE9yTm90IHsgRG9Ob3RJbmRlbnRUZXh0LCBJbmRlbnRU
ZXh0IH07CiAKIGNsYXNzIExpbmVXaWR0aCB7CiBwdWJsaWM6Ci0gICAgTGluZVdpZHRoKFJlbmRl
ckJsb2NrJiwgYm9vbCBpc0ZpcnN0TGluZSwgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRl
eHQpOworICAgIExpbmVXaWR0aChSZW5kZXJCbG9ja0Zsb3cmLCBib29sIGlzRmlyc3RMaW5lLCBJ
bmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCk7CiAKICAgICBib29sIGZpdHNPbkxpbmUo
Ym9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkgY29uc3Q7CiAgICAgYm9vbCBmaXRz
T25MaW5lSW5jbHVkaW5nRXh0cmFXaWR0aChmbG9hdCBleHRyYSkgY29uc3Q7CkBAIC03NSw3ICs3
NSw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBjb21wdXRlQXZhaWxhYmxlV2lkdGhGcm9tTGVmdEFu
ZFJpZ2h0KCk7CiAgICAgYm9vbCBmaXRzT25MaW5lRXhjbHVkaW5nVHJhaWxpbmdDb2xsYXBzZWRX
aGl0ZXNwYWNlKCkgY29uc3Q7CiAKLSAgICBSZW5kZXJCbG9jayYgbV9ibG9jazsKKyAgICBSZW5k
ZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CiAgICAgZmxvYXQgbV91bmNvbW1pdHRlZFdpZHRoOwogICAg
IGZsb2F0IG1fY29tbWl0dGVkV2lkdGg7CiAgICAgZmxvYXQgbV9vdmVyaGFuZ1dpZHRoOyAvLyBU
aGUgYW1vdW50IGJ5IHdoaWNoIHxtX2F2YWlsYWJsZVdpZHRofCBoYXMgYmVlbiBpbmZsYXRlZCB0
byBhY2NvdW50IGZvciBwb3NzaWJsZSBjb250cmFjdGlvbiBkdWUgdG8gcnVieSBvdmVyaGFuZy4K
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCmluZGV4IGY4NTRmODRhMmJi
NGJjOGI1MjFmNmI1ZjU4MTYwODI2YTgwOTk4YzMuLmU1Y2Q4NmQzYjZmMzQxMGUwZjQwZWE0MmM3
N2Y3N2MzNTYzZTVlYjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9jay5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNw
cApAQCAtODMsNyArODMsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiB1c2luZyBuYW1lc3BhY2Ug
SFRNTE5hbWVzOwogCiBzdHJ1Y3QgU2FtZVNpemVBc1JlbmRlckJsb2NrIDogcHVibGljIFJlbmRl
ckJveCB7Ci0gICAgdm9pZCogcG9pbnRlcnNbMl07CisgICAgdm9pZCogcG9pbnRlcnNbMV07CiAg
ICAgUmVuZGVyTGluZUJveExpc3QgbGluZUJveGVzOwogICAgIHVpbnQzMl90IGJpdGZpZWxkczsK
IH07CkBAIC0xMDcsOCArMTA3LDYgQEAgc3RhdGljIERlbGF5ZWRVcGRhdGVTY3JvbGxJbmZvU2V0
KiBnRGVsYXllZFVwZGF0ZVNjcm9sbEluZm9TZXQgPSAwOwogCiBzdGF0aWMgYm9vbCBnQ29sdW1u
Rmxvd1NwbGl0RW5hYmxlZCA9IHRydWU7CiAKLWJvb2wgUmVuZGVyQmxvY2s6OnNfY2FuUHJvcGFn
YXRlRmxvYXRJbnRvU2libGluZyA9IGZhbHNlOwotCiAvLyBUaGlzIGNsYXNzIGhlbHBzIGRpc3Bh
dGNoaW5nIHRoZSAnb3ZlcmZsb3cnIGV2ZW50IG9uIGxheW91dCBjaGFuZ2UuIG92ZXJmbG93IGNh
biBiZSBzZXQgb24gUmVuZGVyQm94ZXMsIHlldCB0aGUgZXhpc3RpbmcgY29kZQogLy8gb25seSB3
b3JrcyBvbiBSZW5kZXJCbG9ja3MuIElmIHRoaXMgY2hhbmdlLCB0aGlzIGNsYXNzIHNob3VsZCBi
ZSBzaGFyZWQgd2l0aCBvdGhlciBSZW5kZXJCb3hlcy4KIGNsYXNzIE92ZXJmbG93RXZlbnREaXNw
YXRjaGVyIHsKQEAgLTI1Niw3ICsyNTQsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjp3aWxsQmVEZXN0
cm95ZWQoKQogdm9pZCBSZW5kZXJCbG9jazo6c3R5bGVXaWxsQ2hhbmdlKFN0eWxlRGlmZmVyZW5j
ZSBkaWZmLCBjb25zdCBSZW5kZXJTdHlsZSogbmV3U3R5bGUpCiB7CiAgICAgUmVuZGVyU3R5bGUq
IG9sZFN0eWxlID0gc3R5bGUoKTsKLSAgICBzX2NhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxpbmcg
PSBvbGRTdHlsZSA/ICFpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2b2lk
c0Zsb2F0cygpIDogZmFsc2U7CiAKICAgICBzZXRSZXBsYWNlZChuZXdTdHlsZS0+aXNEaXNwbGF5
SW5saW5lVHlwZSgpKTsKICAgICAKQEAgLTI4MCw5ICsyNzcsNiBAQCB2b2lkIFJlbmRlckJsb2Nr
OjpzdHlsZVdpbGxDaGFuZ2UoU3R5bGVEaWZmZXJlbmNlIGRpZmYsIGNvbnN0IFJlbmRlclN0eWxl
KiBuZXdTdAogICAgICAgICAgICAgaWYgKGNiLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAg
ICAgICAgdG9SZW5kZXJCbG9jayhjYiktPnJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKHRoaXMsIE5l
d0NvbnRhaW5pbmdCbG9jayk7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGFpbnNGbG9h
dHMoKSAmJiAhaXNGbG9hdGluZygpICYmICFpc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiBuZXdT
dHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSkKLSAgICAgICAgICAgIG1hcmtBbGxEZXNjZW5k
YW50c1dpdGhGbG9hdHNGb3JMYXlvdXQoKTsKICAgICB9CiAKICAgICBSZW5kZXJCb3g6OnN0eWxl
V2lsbENoYW5nZShkaWZmLCBuZXdTdHlsZSk7CkBAIC0zMjQsMzYgKzMxOCw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSBkaWZmLCBjb25zdCBSZW5k
ZXJTdHlsZSogb2xkU3R5CiAKICAgICBwcm9wYWdhdGVTdHlsZVRvQW5vbnltb3VzQ2hpbGRyZW4o
UHJvcGFnYXRlVG9CbG9ja0NoaWxkcmVuT25seSk7CiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7Ci0K
LSAgICAvLyBBZnRlciBvdXIgc3R5bGUgY2hhbmdlZCwgaWYgd2UgbG9zZSBvdXIgYWJpbGl0eSB0
byBwcm9wYWdhdGUgZmxvYXRzIGludG8gbmV4dCBzaWJsaW5nCi0gICAgLy8gYmxvY2tzLCB0aGVu
IHdlIG5lZWQgdG8gZmluZCB0aGUgdG9wIG1vc3QgcGFyZW50IGNvbnRhaW5pbmcgdGhhdCBvdmVy
aGFuZ2luZyBmbG9hdCBhbmQKLSAgICAvLyB0aGVuIG1hcmsgaXRzIGRlc2NlbmRhbnRzIHdpdGgg
ZmxvYXRzIGZvciBsYXlvdXQgYW5kIGNsZWFyIGFsbCBmbG9hdHMgZnJvbSBpdHMgbmV4dAotICAg
IC8vIHNpYmxpbmcgYmxvY2tzIHRoYXQgZXhpc3QgaW4gb3VyIGZsb2F0aW5nIG9iamVjdHMgbGlz
dC4gU2VlIGJ1ZyA1NjI5OSBhbmQgNjI4NzUuCi0gICAgYm9vbCBjYW5Qcm9wYWdhdGVGbG9hdElu
dG9TaWJsaW5nID0gIWlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhYXZvaWRz
RmxvYXRzKCk7Ci0gICAgaWYgKGRpZmYgPT0gU3R5bGVEaWZmZXJlbmNlTGF5b3V0ICYmIHNfY2Fu
UHJvcGFnYXRlRmxvYXRJbnRvU2libGluZyAmJiAhY2FuUHJvcGFnYXRlRmxvYXRJbnRvU2libGlu
ZyAmJiBoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBwYXJl
bnRCbG9jayA9IHRoaXM7Ci0gICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGlu
Z09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICAgICAgYXV0byBlbmQg
PSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLQotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCog
Y3VyciA9IHBhcmVudCgpOyBjdXJyICYmICFjdXJyLT5pc1JlbmRlclZpZXcoKTsgY3VyciA9IGN1
cnItPnBhcmVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+aXNSZW5kZXJCbG9jaygpKSB7
Ci0gICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGN1cnJCbG9jayA9IHRvUmVuZGVyQmxvY2so
Y3Vycik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VyckJsb2NrLT5oYXNPdmVyaGFuZ2luZ0Zs
b2F0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2Jq
ZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgUmVuZGVyQm94JiByZW5kZXJlciA9ICgqaXQpLT5yZW5kZXJlcigpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGN1cnJCbG9jay0+aGFzT3ZlcmhhbmdpbmdGbG9hdCgmcmVuZGVyZXIp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2sgPSBjdXJyQmxvY2s7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgIHBhcmVudEJsb2NrLT5t
YXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgICAgIHBhcmVudEJs
b2NrLT5tYXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgfQogICAgIAogICAg
IC8vIEl0J3MgcG9zc2libGUgZm9yIG91ciBib3JkZXIvcGFkZGluZyB0byBjaGFuZ2UsIGJ1dCBm
b3IgdGhlIG92ZXJhbGwgbG9naWNhbCB3aWR0aCBvZiB0aGUgYmxvY2sgdG8KICAgICAvLyBlbmQg
dXAgYmVpbmcgdGhlIHNhbWUuIFdlIGtlZXAgdHJhY2sgb2YgdGhpcyBjaGFuZ2Ugc28gaW4gbGF5
b3V0QmxvY2ssIHdlIGNhbiBrbm93IHRvIHNldCByZWxheW91dENoaWxkcmVuPXRydWUuCkBAIC02
MjUsNyArNTg5LDkgQEAgdm9pZCBSZW5kZXJCbG9jazo6c3BsaXRGbG93KFJlbmRlck9iamVjdCog
YmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwKICAgICAgICAgLy8gV2UgY2Fu
IHJldXNlIHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBuZXh0IGNv
bnRpbnVhdGlvbi4KICAgICAgICAgcHJlID0gYmxvY2s7CiAgICAgICAgIHByZS0+cmVtb3ZlUG9z
aXRpb25lZE9iamVjdHMoMCk7Ci0gICAgICAgIHByZS0+cmVtb3ZlRmxvYXRpbmdPYmplY3RzKCk7
CisgICAgICAgIC8vIEZJWE1FLUJMT0NLRkxPVyByZW1vdmUgdGhpcyB3aGVuIHNwbGl0RmxvdyBp
cyBtb3ZlZCB0byBSZW5kZXJCbG9ja0Zsb3cuCisgICAgICAgIGlmIChwcmUtPmlzUmVuZGVyQmxv
Y2tGbG93KCkpCisgICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyhwcmUpLT5yZW1vdmVGbG9h
dGluZ09iamVjdHMoKTsKICAgICAgICAgYmxvY2sgPSB0b1JlbmRlckJsb2NrKGJsb2NrLT5wYXJl
bnQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2YWls
YWJsZSBmb3IgdXNlLiAgTWFrZSBvbmUuCkBAIC05MzgsOCArOTA0LDYgQEAgc3RhdGljIHZvaWQg
Z2V0SW5saW5lUnVuKFJlbmRlck9iamVjdCogc3RhcnQsIFJlbmRlck9iamVjdCogYm91bmRhcnks
CiAKIHZvaWQgUmVuZGVyQmxvY2s6OmRlbGV0ZUxpbmVCb3hUcmVlKCkKIHsKLSAgICBpZiAoY29u
dGFpbnNGbG9hdHMoKSkKLSAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmNsZWFyTGluZUJveFRy
ZWVQb2ludGVycygpOwogICAgIG1fbGluZUJveGVzLmRlbGV0ZUxpbmVCb3hUcmVlKHJlbmRlckFy
ZW5hKCkpOwogCiAgICAgaWYgKEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gZG9jdW1lbnQoKS5leGlz
dGluZ0FYT2JqZWN0Q2FjaGUoKSkKQEAgLTExMjMsNDYgKzEwODcsNiBAQCB2b2lkIFJlbmRlckJs
b2NrOjpjb2xsYXBzZUFub255bW91c0JveENoaWxkKFJlbmRlckJsb2NrKiBwYXJlbnQsIFJlbmRl
ckJsb2NrKiBjaAogICAgIGNoaWxkLT5kZXN0cm95KCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6
Om1vdmVBbGxDaGlsZHJlbkluY2x1ZGluZ0Zsb2F0c1RvKFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBi
b29sIGZ1bGxSZW1vdmVJbnNlcnQpCi17Ci0gICAgbW92ZUFsbENoaWxkcmVuVG8odG9CbG9jaywg
ZnVsbFJlbW92ZUluc2VydCk7Ci0KLSAgICAvLyBXaGVuIGEgcG9ydGlvbiBvZiB0aGUgcmVuZGVy
IHRyZWUgaXMgYmVpbmcgZGV0YWNoZWQsIGFub255bW91cyBibG9ja3MKLSAgICAvLyB3aWxsIGJl
IGNvbWJpbmVkIGFzIHRoZWlyIGNoaWxkcmVuIGFyZSBkZWxldGVkLiBJbiB0aGlzIHByb2Nlc3Ms
IHRoZQotICAgIC8vIGFub255bW91cyBibG9jayBsYXRlciBpbiB0aGUgdHJlZSBpcyBtZXJnZWQg
aW50byB0aGUgb25lIHByZWNlZWRpbmcgaXQuCi0gICAgLy8gSXQgY2FuIGhhcHBlbiB0aGF0IHRo
ZSBsYXRlciBibG9jayAodGhpcykgY29udGFpbnMgZmxvYXRzIHRoYXQgdGhlCi0gICAgLy8gcHJl
dmlvdXMgYmxvY2sgKHRvQmxvY2spIGRpZCBub3QgY29udGFpbiwgYW5kIHRodXMgYXJlIG5vdCBp
biB0aGUKLSAgICAvLyBmbG9hdGluZyBvYmplY3RzIGxpc3QgZm9yIHRvQmxvY2suIFRoaXMgY2Fu
IHJlc3VsdCBpbiB0b0Jsb2NrIGNvbnRhaW5pbmcKLSAgICAvLyBmbG9hdHMgdGhhdCBhcmUgbm90
IGluIGl0J3MgZmxvYXRpbmcgb2JqZWN0cyBsaXN0LCBidXQgYXJlIGluIHRoZQotICAgIC8vIGZs
b2F0aW5nIG9iamVjdHMgbGlzdHMgb2Ygc2libGluZ3MgYW5kIHBhcmVudHMuIFRoaXMgY2FuIGNh
dXNlIHByb2JsZW1zCi0gICAgLy8gd2hlbiB0aGUgZmxvYXQgaXRzZWxmIGlzIGRlbGV0ZWQsIHNp
bmNlIHRoZSBkZWxldGlvbiBjb2RlIGFzc3VtZXMgdGhhdAotICAgIC8vIGlmIGEgZmxvYXQgaXMg
bm90IGluIGl0J3MgY29udGFpbmluZyBibG9jaydzIGZsb2F0aW5nIG9iamVjdHMgbGlzdCwgaXQK
LSAgICAvLyBpc24ndCBpbiBhbnkgZmxvYXRpbmcgb2JqZWN0cyBsaXN0LiBJbiBvcmRlciB0byBw
cmVzZXJ2ZSB0aGlzIGNvbmRpdGlvbgotICAgIC8vIChyZW1vdmluZyBpdCBoYXMgc2VyaW91cyBw
ZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMpLCB3ZSBuZWVkIHRvIGNvcHkgdGhlCi0gICAgLy8gZmxv
YXRpbmcgb2JqZWN0cyBmcm9tIHRoZSBvbGQgYmxvY2sgKHRoaXMpIHRvIHRoZSBuZXcgYmxvY2sg
KHRvQmxvY2spLgotICAgIC8vIFRoZSBmbG9hdCdzIG1ldHJpY3Mgd2lsbCBsaWtlbHkgYWxsIGJl
IHdyb25nLCBidXQgc2luY2UgdG9CbG9jayBpcwotICAgIC8vIGFscmVhZHkgbWFya2VkIGZvciBs
YXlvdXQsIHRoaXMgd2lsbCBnZXQgZml4ZWQgYmVmb3JlIGFueXRoaW5nIGdldHMKLSAgICAvLyBk
aXNwbGF5ZWQuCi0gICAgLy8gU2VlIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MTE1NTY2Ci0gICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKSB7Ci0gICAgICAgIGlm
ICghdG9CbG9jay0+bV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgICAgICB0b0Jsb2NrLT5jcmVh
dGVGbG9hdGluZ09iamVjdHMoKTsKLQotICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYg
ZnJvbUZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgICAg
ICBhdXRvIGVuZCA9IGZyb21GbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLQotICAgICAgICBmb3Ig
KGF1dG8gaXQgPSBmcm9tRmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7Ci0gICAgICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0
KCk7Ci0KLSAgICAgICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgb2JqZWN0IGFnYWluIGlmIGl0
J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgaWYgKHRvQmxvY2stPmNvbnRhaW5z
RmxvYXQoJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpKSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLQotICAgICAgICAgICAgdG9CbG9jay0+bV9mbG9hdGluZ09iamVjdHMtPmFkZChmbG9h
dGluZ09iamVjdC0+dW5zYWZlQ2xvbmUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHZvaWQg
UmVuZGVyQmxvY2s6OnJlbW92ZUNoaWxkKFJlbmRlck9iamVjdCogb2xkQ2hpbGQpCiB7CiAgICAg
Ly8gTm8gbmVlZCB0byB3YXN0ZSB0aW1lIGluIG1lcmdpbmcgb3IgcmVtb3ZpbmcgZW1wdHkgYW5v
bnltb3VzIGJsb2Nrcy4KQEAgLTE2MTMsMTYgKzE1MzcsMTMgQEAgdm9pZCBSZW5kZXJCbG9jazo6
YWRkT3ZlcmZsb3dGcm9tQ2hpbGRyZW4oKQogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6
Y29tcHV0ZU92ZXJmbG93KExheW91dFVuaXQgb2xkQ2xpZW50QWZ0ZXJFZGdlLCBib29sIHJlY29t
cHV0ZUZsb2F0cykKK3ZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVPdmVyZmxvdyhMYXlvdXRVbml0
IG9sZENsaWVudEFmdGVyRWRnZSwgYm9vbCkKIHsKICAgICBjbGVhck92ZXJmbG93KCk7CiAKICAg
ICAvLyBBZGQgb3ZlcmZsb3cgZnJvbSBjaGlsZHJlbi4KICAgICBhZGRPdmVyZmxvd0Zyb21DaGls
ZHJlbigpOwogCi0gICAgaWYgKCFoYXNDb2x1bW5zKCkgJiYgKHJlY29tcHV0ZUZsb2F0cyB8fCBp
c1Jvb3QoKSB8fCBleHBhbmRzVG9FbmNsb3NlT3ZlcmhhbmdpbmdGbG9hdHMoKSB8fCBoYXNTZWxm
UGFpbnRpbmdMYXllcigpKSkKLSAgICAgICAgYWRkT3ZlcmZsb3dGcm9tRmxvYXRzKCk7Ci0KICAg
ICAvLyBBZGQgaW4gdGhlIG92ZXJmbG93IGZyb20gcG9zaXRpb25lZCBvYmplY3RzLgogICAgIGFk
ZE92ZXJmbG93RnJvbVBvc2l0aW9uZWRPYmplY3RzKCk7CiAKQEAgLTE2NzMsMjAgKzE1OTQsNiBA
QCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21CbG9ja0NoaWxkcmVuKCkKICAgICB9
CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygpCi17Ci0gICAg
aWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgRmxv
YXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNl
dCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgZm9yIChh
dXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0g
ICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAgICAgICBpZiAoci0+aXNE
ZXNjZW5kYW50KCkpCi0gICAgICAgICAgICBhZGRPdmVyZmxvd0Zyb21DaGlsZCgmci0+cmVuZGVy
ZXIoKSwgSW50U2l6ZSh4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwgeVBvc2l0
aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4ocikpKTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVuZGVy
QmxvY2s6OmFkZE92ZXJmbG93RnJvbVBvc2l0aW9uZWRPYmplY3RzKCkKIHsKICAgICBUcmFja2Vk
UmVuZGVyZXJMaXN0SGFzaFNldCogcG9zaXRpb25lZERlc2NlbmRhbnRzID0gcG9zaXRpb25lZE9i
amVjdHMoKTsKQEAgLTIxODMsMzIgKzIwOTAsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjptYXJrRm9y
UGFnaW5hdGlvblJlbGF5b3V0SWZOZWVkZWQoKQogICAgICAgICBzZXRDaGlsZE5lZWRzTGF5b3V0
KE1hcmtPbmx5VGhpcyk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnJlcGFpbnRPdmVyaGFuZ2lu
Z0Zsb2F0cyhib29sIHBhaW50QWxsRGVzY2VuZGFudHMpCi17Ci0gICAgLy8gUmVwYWludCBhbnkg
b3ZlcmhhbmdpbmcgZmxvYXRzIChpZiB3ZSBrbm93IHdlJ3JlIHRoZSBvbmUgdG8gcGFpbnQgdGhl
bSkuCi0gICAgLy8gT3RoZXJ3aXNlLCBiYWlsIG91dC4KLSAgICBpZiAoIWhhc092ZXJoYW5naW5n
RmxvYXRzKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZJWE1FOiBBdm9pZCBkaXNhYmxp
bmcgTGF5b3V0U3RhdGUuIEF0IHRoZSB2ZXJ5IGxlYXN0LCBkb24ndCBkaXNhYmxlIGl0IGZvciBm
bG9hdHMgb3JpZ2luYXRpbmcKLSAgICAvLyBpbiB0aGlzIGJsb2NrLiBCZXR0ZXIgeWV0IHdvdWxk
IGJlIHRvIHB1c2ggZXh0cmEgc3RhdGUgZm9yIHRoZSBjb250YWluZXJzIG9mIG90aGVyIGZsb2F0
cy4KLSAgICBMYXlvdXRTdGF0ZURpc2FibGVyIGxheW91dFN0YXRlRGlzYWJsZXIoJnZpZXcoKSk7
Ci0gICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9h
dGluZ09iamVjdHMtPnNldCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5k
KCk7Ci0gICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAg
ICAgICAvLyBPbmx5IHJlcGFpbnQgdGhlIG9iamVjdCBpZiBpdCBpcyBvdmVyaGFuZ2luZywgaXMg
bm90IGluIGl0cyBvd24gbGF5ZXIsIGFuZAotICAgICAgICAvLyBpcyBvdXIgcmVzcG9uc2liaWxp
dHkgdG8gcGFpbnQgKG1fc2hvdWxkUGFpbnQgaXMgc2V0KS4gV2hlbiBwYWludEFsbERlc2NlbmRh
bnRzIGlzIHRydWUsIHRoZSBsYXR0ZXIKLSAgICAgICAgLy8gY29uZGl0aW9uIGlzIHJlcGxhY2Vk
IHdpdGggYmVpbmcgYSBkZXNjZW5kYW50IG9mIHVzLgotICAgICAgICBpZiAoci0+bG9naWNhbEJv
dHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSA+IGxvZ2ljYWxIZWlnaHQoKQotICAgICAg
ICAgICAgJiYgIXItPnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKQotICAgICAgICAg
ICAgJiYgKHItPnNob3VsZFBhaW50KCkgfHwgKHBhaW50QWxsRGVzY2VuZGFudHMgJiYgci0+cmVu
ZGVyZXIoKS5pc0Rlc2NlbmRhbnRPZih0aGlzKSkpKSB7Ci0gICAgICAgICAgICByLT5yZW5kZXJl
cigpLnJlcGFpbnQoKTsKLSAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucmVwYWludE92ZXJoYW5n
aW5nRmxvYXRzKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLSAKIHZvaWQgUmVuZGVyQmxv
Y2s6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRP
ZmZzZXQpCiB7CiAgICAgTGF5b3V0UG9pbnQgYWRqdXN0ZWRQYWludE9mZnNldCA9IHBhaW50T2Zm
c2V0ICsgbG9jYXRpb24oKTsKQEAgLTI2MDEsMzYgKzI0ODIsNiBAQCBMYXlvdXRQb2ludCBSZW5k
ZXJCbG9jazo6ZmxpcEZsb2F0Rm9yV3JpdGluZ01vZGVGb3JDaGlsZChjb25zdCBGbG9hdGluZ09i
amVjdCogYwogICAgIHJldHVybiBMYXlvdXRQb2ludChwb2ludC54KCkgKyB3aWR0aCgpIC0gY2hp
bGQtPnJlbmRlcmVyKCkud2lkdGgoKSAtIDIgKiB4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01h
cmdpbihjaGlsZCksIHBvaW50LnkoKSk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnBhaW50Rmxv
YXRzKFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQs
IGJvb2wgcHJlc2VydmVQaGFzZSkKLXsKLSAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmpl
Y3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgYXV0byBlbmQgPSBmbG9hdGlu
Z09iamVjdFNldC5lbmQoKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIHIgPSBp
dC0+Z2V0KCk7Ci0gICAgICAgIC8vIE9ubHkgcGFpbnQgdGhlIG9iamVjdCBpZiBvdXIgbV9zaG91
bGRQYWludCBmbGFnIGlzIHNldC4KLSAgICAgICAgaWYgKHItPnNob3VsZFBhaW50KCkgJiYgIXIt
PnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgUGFpbnRJ
bmZvIGN1cnJlbnRQYWludEluZm8ocGFpbnRJbmZvKTsKLSAgICAgICAgICAgIGN1cnJlbnRQYWlu
dEluZm8ucGhhc2UgPSBwcmVzZXJ2ZVBoYXNlID8gcGFpbnRJbmZvLnBoYXNlIDogUGFpbnRQaGFz
ZUJsb2NrQmFja2dyb3VuZDsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBMYXlvdXRQb2ludCB2ZXJz
aW9uIG9mIHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luIHdvdWxkIG1ha2UgdGhpcyBt
dWNoIGNsZWFuZXIuCi0gICAgICAgICAgICBMYXlvdXRQb2ludCBjaGlsZFBvaW50ID0gZmxpcEZs
b2F0Rm9yV3JpdGluZ01vZGVGb3JDaGlsZChyLCBMYXlvdXRQb2ludChwYWludE9mZnNldC54KCkg
KyB4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSAtIHItPnJlbmRlcmVyKCkueCgp
LCBwYWludE9mZnNldC55KCkgKyB5UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSAt
IHItPnJlbmRlcmVyKCkueSgpKSk7Ci0gICAgICAgICAgICByLT5yZW5kZXJlcigpLnBhaW50KGN1
cnJlbnRQYWludEluZm8sIGNoaWxkUG9pbnQpOwotICAgICAgICAgICAgaWYgKCFwcmVzZXJ2ZVBo
YXNlKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IFBhaW50UGhh
c2VDaGlsZEJsb2NrQmFja2dyb3VuZHM7Ci0gICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5w
YWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKLSAgICAgICAgICAgICAgICBjdXJy
ZW50UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZUZsb2F0OwotICAgICAgICAgICAgICAgIHIt
PnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5mbywgY2hpbGRQb2ludCk7Ci0gICAgICAg
ICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IFBhaW50UGhhc2VGb3JlZ3JvdW5kOwot
ICAgICAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5mbywgY2hp
bGRQb2ludCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IFBhaW50
UGhhc2VPdXRsaW5lOwotICAgICAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucGFpbnQoY3VycmVu
dFBhaW50SW5mbywgY2hpbGRQb2ludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
Ci19Ci0KIFJlbmRlcklubGluZSogUmVuZGVyQmxvY2s6OmlubGluZUVsZW1lbnRDb250aW51YXRp
b24oKSBjb25zdAogeyAKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9uID0g
dGhpcy0+Y29udGludWF0aW9uKCk7CkBAIC0yODM0LDE5ICsyNjg1LDcgQEAgR2FwUmVjdHMgUmVu
ZGVyQmxvY2s6OnNlbGVjdGlvbkdhcHMoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgY29uc3QgTGF5
b3V0UG9pbnQmIHIKICAgICAgICAgaWYgKGlzQm9keSgpIHx8IGlzUm9vdCgpKSAvLyBUaGUgPGJv
ZHk+IG11c3QgbWFrZSBzdXJlIHRvIGV4YW1pbmUgaXRzIGNvbnRhaW5pbmdCbG9jaydzIHBvc2l0
aW9uZWQgb2JqZWN0cy4KICAgICAgICAgICAgIGZvciAoUmVuZGVyQmxvY2sqIGNiID0gY29udGFp
bmluZ0Jsb2NrKCk7IGNiICYmICFjYi0+aXNSZW5kZXJWaWV3KCk7IGNiID0gY2ItPmNvbnRhaW5p
bmdCbG9jaygpKQogICAgICAgICAgICAgICAgIGNsaXBPdXRQb3NpdGlvbmVkT2JqZWN0cyhwYWlu
dEluZm8sIExheW91dFBvaW50KGNiLT54KCksIGNiLT55KCkpLCBjYi0+cG9zaXRpb25lZE9iamVj
dHMoKSk7IC8vIEZJWE1FOiBOb3QgcmlnaHQgZm9yIGZsaXBwZWQgd3JpdGluZyBtb2Rlcy4KLSAg
ICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKSB7Ci0gICAgICAgICAgICBjb25zdCBGbG9hdGlu
Z09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7
Ci0gICAgICAgICAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOwotICAgICAg
ICAgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgRmxvYXRpbmdPYmplY3QqIHIgPSBpdC0+Z2V0KCk7
Ci0gICAgICAgICAgICAgICAgTGF5b3V0UmVjdCBmbG9hdEJveChvZmZzZXRGcm9tUm9vdEJsb2Nr
LndpZHRoKCkgKyB4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldEZyb21Sb290QmxvY2suaGVpZ2h0KCkg
KyB5UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHItPnJlbmRlcmVyKCkud2lkdGgoKSwgci0+cmVuZGVyZXIoKS5o
ZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgcm9vdEJsb2NrLT5mbGlwRm9yV3JpdGluZ01vZGUo
ZmxvYXRCb3gpOwotICAgICAgICAgICAgICAgIGZsb2F0Qm94Lm1vdmUocm9vdEJsb2NrUGh5c2lj
YWxQb3NpdGlvbi54KCksIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRpb24ueSgpKTsKLSAgICAgICAg
ICAgICAgICBwYWludEluZm8tPmNvbnRleHQtPmNsaXBPdXQocGl4ZWxTbmFwcGVkSW50UmVjdChm
bG9hdEJveCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGNsaXBPdXRGbG9h
dGluZ09iamVjdHMocm9vdEJsb2NrLCBwYWludEluZm8sIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRp
b24sIG9mZnNldEZyb21Sb290QmxvY2spOwogICAgIH0KIAogICAgIC8vIEZJWE1FOiBvdmVyZmxv
dzogYXV0by9zY3JvbGwgcmVnaW9ucyBuZWVkIG1vcmUgbWF0aCBoZXJlLCBzaW5jZSBwYWludGlu
ZyBpbiB0aGUgYm9yZGVyIGJveCBpcyBkaWZmZXJlbnQgZnJvbSBwYWludGluZyBpbiB0aGUgcGFk
ZGluZyBib3ggKG9uZSBpcyBzY3JvbGxlZCwgdGhlIG90aGVyIGlzCkBAIC0zMjU2LDMxOCArMzA5
NSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKFJlbmRlckJs
b2NrKiBvLCBDb250YWluaW5nQmxvY2tTdGF0ZSBjCiAgICAgICAgIHJlbW92ZVBvc2l0aW9uZWRP
YmplY3QoZGVhZE9iamVjdHMuYXQoaSkpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVG
bG9hdGluZ09iamVjdHMoKQotewotICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAg
IHJldHVybjsKLQotICAgIG1fZmxvYXRpbmdPYmplY3RzLT5jbGVhcigpOwotfQotCi1GbG9hdGlu
Z09iamVjdCogUmVuZGVyQmxvY2s6Omluc2VydEZsb2F0aW5nT2JqZWN0KFJlbmRlckJveCogbykK
LXsKLSAgICBBU1NFUlQoby0+aXNGbG9hdGluZygpKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgbGlz
dCBvZiBzcGVjaWFsIG9iamVjdHMgaWYgd2UgZG9uJ3QgYWxlYWR5IGhhdmUgb25lCi0gICAgaWYg
KCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7Ci0g
ICAgZWxzZSB7Ci0gICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgb2JqZWN0IGFnYWluIGlmIGl0
J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAotICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYg
ZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgICAgIGF1
dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5maW5kPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0
SGFzaFRyYW5zbGF0b3I+KCpvKTsKLSAgICAgICAgaWYgKGl0ICE9IGZsb2F0aW5nT2JqZWN0U2V0
LmVuZCgpKQotICAgICAgICAgICAgcmV0dXJuIGl0LT5nZXQoKTsKLSAgICB9Ci0KLSAgICAvLyBD
cmVhdGUgdGhlIHNwZWNpYWwgb2JqZWN0IGVudHJ5ICYgYXBwZW5kIGl0IHRvIHRoZSBsaXN0Ci0K
LSAgICBzdGQ6OnVuaXF1ZV9wdHI8RmxvYXRpbmdPYmplY3Q+IG9iamVjdCA9IEZsb2F0aW5nT2Jq
ZWN0OjpjcmVhdGUoKm8pOwotICAgIAotICAgIC8vIE91ciBsb2NhdGlvbiBpcyBpcnJlbGV2YW50
IGlmIHdlJ3JlIHVuc3BsaXR0YWJsZSBvciBubyBwYWdpbmF0aW9uIGlzIGluIGVmZmVjdC4KLSAg
ICAvLyBKdXN0IGdvIGFoZWFkIGFuZCBsYXkgb3V0IHRoZSBmbG9hdC4KLSAgICBib29sIGlzQ2hp
bGRSZW5kZXJCbG9jayA9IG8tPmlzUmVuZGVyQmxvY2soKTsKLSAgICBpZiAoaXNDaGlsZFJlbmRl
ckJsb2NrICYmICFvLT5uZWVkc0xheW91dCgpICYmIHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5wYWdl
TG9naWNhbEhlaWdodENoYW5nZWQoKSkKLSAgICAgICAgby0+c2V0Q2hpbGROZWVkc0xheW91dChN
YXJrT25seVRoaXMpOwotICAgICAgICAgICAgCi0gICAgYm9vbCBuZWVkc0Jsb2NrRGlyZWN0aW9u
TG9jYXRpb25TZXRCZWZvcmVMYXlvdXQgPSBpc0NoaWxkUmVuZGVyQmxvY2sgJiYgdmlldygpLmxh
eW91dFN0YXRlKCktPm5lZWRzQmxvY2tEaXJlY3Rpb25Mb2NhdGlvblNldEJlZm9yZUxheW91dCgp
OwotICAgIGlmICghbmVlZHNCbG9ja0RpcmVjdGlvbkxvY2F0aW9uU2V0QmVmb3JlTGF5b3V0IHx8
IGlzV3JpdGluZ01vZGVSb290KCkpIC8vIFdlIGFyZSB1bnNwbGl0dGFibGUgaWYgd2UncmUgYSBi
bG9jayBmbG93IHJvb3QuCi0gICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7Ci0gICAgZWxzZSB7
Ci0gICAgICAgIG8tPnVwZGF0ZUxvZ2ljYWxXaWR0aCgpOwotICAgICAgICBvLT5jb21wdXRlQW5k
U2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5zKHRoaXMpOwotICAgIH0KLQotICAgIG9iamVjdC0+c2V0
TG9naWNhbFdpZHRoKGxvZ2ljYWxXaWR0aEZvckNoaWxkKG8pICsgbWFyZ2luU3RhcnRGb3JDaGls
ZChvKSArIG1hcmdpbkVuZEZvckNoaWxkKG8pLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsK
LQotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotICAgIGlmIChTaGFwZU91dHNpZGVJbmZvKiBzaGFw
ZU91dHNpZGUgPSBvLT5zaGFwZU91dHNpZGVJbmZvKCkpCi0gICAgICAgIHNoYXBlT3V0c2lkZS0+
c2V0U2hhcGVTaXplKGxvZ2ljYWxXaWR0aEZvckNoaWxkKG8pLCBsb2dpY2FsSGVpZ2h0Rm9yQ2hp
bGQobykpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMtPmFkZChzdGQ6
Om1vdmUob2JqZWN0KSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUZsb2F0aW5nT2Jq
ZWN0KFJlbmRlckJveCogbykKLXsKLSAgICBpZiAobV9mbG9hdGluZ09iamVjdHMpIHsKLSAgICAg
ICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGlu
Z09iamVjdHMtPnNldCgpOwotICAgICAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZmlu
ZDxSZW5kZXJCb3gmLCBGbG9hdGluZ09iamVjdEhhc2hUcmFuc2xhdG9yPigqbyk7Ci0gICAgICAg
IGlmIChpdCAhPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKSkgewotICAgICAgICAgICAgRmxvYXRp
bmdPYmplY3QqIHIgPSBpdC0+Z2V0KCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUo
KSkgewotICAgICAgICAgICAgICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IHItPmxvZ2ljYWxU
b3AoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7Ci0gICAgICAgICAgICAgICAgTGF5b3V0VW5p
dCBsb2dpY2FsQm90dG9tID0gci0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU0OTk1LgotICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsQm90
dG9tIDwgMCB8fCBsb2dpY2FsQm90dG9tIDwgbG9naWNhbFRvcCB8fCBsb2dpY2FsVG9wID09IExh
eW91dFVuaXQ6Om1heCgpKQotICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQm90dG9tID0gTGF5
b3V0VW5pdDo6bWF4KCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAg
ICAgIC8vIFNwZWNpYWwtY2FzZSB6ZXJvLSBhbmQgbGVzcy10aGFuLXplcm8taGVpZ2h0IGZsb2F0
czogdGhvc2UgZG9uJ3QgdG91Y2gKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpbmUgdGhh
dCB0aGV5J3JlIG9uLCBidXQgaXQgc3RpbGwgbmVlZHMgdG8gYmUgZGlydGllZC4gVGhpcyBpcwot
ICAgICAgICAgICAgICAgICAgICAvLyBhY2NvbXBsaXNoZWQgYnkgcHJldGVuZGluZyB0aGV5IGhh
dmUgYSBoZWlnaHQgb2YgMS4KLSAgICAgICAgICAgICAgICAgICAgbG9naWNhbEJvdHRvbSA9IG1h
eChsb2dpY2FsQm90dG9tLCBsb2dpY2FsVG9wICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIGlmIChyLT5vcmlnaW5hdGluZ0xpbmUoKSkgewotICAgICAgICAgICAgICAg
ICAgICBpZiAoIXNlbGZOZWVkc0xheW91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBB
U1NFUlQoJnItPm9yaWdpbmF0aW5nTGluZSgpLT5yZW5kZXJlcigpID09IHRoaXMpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgci0+b3JpZ2luYXRpbmdMaW5lKCktPm1hcmtEaXJ0eSgpOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgICAgICAgICAgICAg
ICAgICByLT5zZXRPcmlnaW5hdGluZ0xpbmUoMCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgbWFya0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UoMCwgbG9naWNhbEJv
dHRvbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+cmVt
b3ZlKHIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVG
bG9hdGluZ09iamVjdHNCZWxvdyhGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0LCBpbnQgbG9naWNh
bE9mZnNldCkKLXsKLSAgICBpZiAoIWNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIHJldHVybjsK
LSAgICAKLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBt
X2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgRmxvYXRpbmdPYmplY3QqIGN1cnIgPSBmbG9h
dGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCk7Ci0gICAgd2hpbGUgKGN1cnIgIT0gbGFzdEZsb2F0
ICYmICghY3Vyci0+aXNQbGFjZWQoKSB8fCBjdXJyLT5sb2dpY2FsVG9wKGlzSG9yaXpvbnRhbFdy
aXRpbmdNb2RlKCkpID49IGxvZ2ljYWxPZmZzZXQpKSB7Ci0gICAgICAgIG1fZmxvYXRpbmdPYmpl
Y3RzLT5yZW1vdmUoY3Vycik7Ci0gICAgICAgIGlmIChmbG9hdGluZ09iamVjdFNldC5pc0VtcHR5
KCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY3VyciA9IGZsb2F0aW5nT2JqZWN0U2V0
Lmxhc3QoKS5nZXQoKTsKLSAgICB9Ci19Ci0KLUxheW91dFBvaW50IFJlbmRlckJsb2NrOjpjb21w
dXRlTG9naWNhbExvY2F0aW9uRm9yRmxvYXQoY29uc3QgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5n
T2JqZWN0LCBMYXlvdXRVbml0IGxvZ2ljYWxUb3BPZmZzZXQpIGNvbnN0Ci17Ci0gICAgUmVuZGVy
Qm94KiBjaGlsZEJveCA9ICZmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKTsKLSAgICBMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0T2Zmc2V0ID0gbG9naWNhbExlZnRPZmZzZXRGb3JDb250ZW50KGxvZ2lj
YWxUb3BPZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9mIGxlZnQgb2Zmc2V0LgotICAgIExheW91
dFVuaXQgbG9naWNhbFJpZ2h0T2Zmc2V0OyAvLyBDb25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9mZnNl
dC4KLSNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKLSAgICAvLyBGSVhNRSBCdWcgMTAyOTQ4OiBUaGlz
IG9ubHkgd29ya3MgZm9yIHNoYXBlIG91dHNpZGUgZGlyZWN0bHkgc2V0IG9uIHRoaXMgYmxvY2su
Ci0gICAgU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluc2lkZUluZm8gPSB0aGlzLT5sYXlvdXRTaGFw
ZUluc2lkZUluZm8oKTsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IGJlaGF2aW9yIGZvciByaWdo
dCBmbG9hdHMuCi0gICAgaWYgKHNoYXBlSW5zaWRlSW5mbykgewotICAgICAgICBMYXlvdXRTaXpl
IGZsb2F0TG9naWNhbFNpemUgPSBMYXlvdXRTaXplKGNoaWxkQm94LT5sb2dpY2FsV2lkdGgoKSwg
Y2hpbGRCb3gtPmxvZ2ljYWxIZWlnaHQoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB0aGUgZmxv
YXQgZG9lc24ndCBmaXQgaW4gdGhlIHNoYXBlIHdlIHNob3VsZCBwdXNoIGl0IHVuZGVyIHRoZSBj
b250ZW50IGJveAotICAgICAgICBsb2dpY2FsVG9wT2Zmc2V0ID0gc2hhcGVJbnNpZGVJbmZvLT5j
b21wdXRlRmlyc3RGaXRQb3NpdGlvbkZvckZsb2F0KGZsb2F0TG9naWNhbFNpemUpOwotICAgICAg
ICBpZiAobG9naWNhbEhlaWdodCgpID4gbG9naWNhbFRvcE9mZnNldCkKLSAgICAgICAgICAgIGxv
Z2ljYWxUb3BPZmZzZXQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0KLSAgICAgICAgU2VnbWVudExpc3Qg
c2VnbWVudHMgPSBzaGFwZUluc2lkZUluZm8tPmNvbXB1dGVTZWdtZW50c0ZvckxpbmUobG9naWNh
bFRvcE9mZnNldCwgY2hpbGRCb3gtPmxvZ2ljYWxIZWlnaHQoKSk7Ci0gICAgICAgIC8vIEZJWE1F
IEJ1ZyAxMDI5NDk6IEFkZCBzdXBwb3J0IGZvciBzaGFwZXMgd2l0aCBtdWx0aXBsZSBzZWdtZW50
cy4KLSAgICAgICAgaWYgKHNlZ21lbnRzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAvLyBU
aGUgc2VnbWVudCBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgY29udGVudCBib3guCi0gICAg
ICAgICAgICBsb2dpY2FsUmlnaHRPZmZzZXQgPSBsb2dpY2FsTGVmdE9mZnNldCArIHNlZ21lbnRz
WzBdLmxvZ2ljYWxSaWdodDsKLSAgICAgICAgICAgIGxvZ2ljYWxMZWZ0T2Zmc2V0ICs9IHNlZ21l
bnRzWzBdLmxvZ2ljYWxMZWZ0OwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSAgICAg
ICAgbG9naWNhbFJpZ2h0T2Zmc2V0ID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yQ29udGVudChsb2dp
Y2FsVG9wT2Zmc2V0KTsKLQotICAgIExheW91dFVuaXQgZmxvYXRMb2dpY2FsV2lkdGggPSBtaW4o
ZmxvYXRpbmdPYmplY3QtPmxvZ2ljYWxXaWR0aChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSwg
bG9naWNhbFJpZ2h0T2Zmc2V0IC0gbG9naWNhbExlZnRPZmZzZXQpOyAvLyBUaGUgd2lkdGggd2Ug
bG9vayBmb3IuCi0KLSAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbExlZnQ7Ci0KLSAgICBib29s
IGluc2lkZUZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29udGFpbmluZ0Jsb2NrKCk7Ci0KLSAgICBp
ZiAoY2hpbGRCb3gtPnN0eWxlKCktPmZsb2F0aW5nKCkgPT0gTGVmdEZsb2F0KSB7Ci0gICAgICAg
IExheW91dFVuaXQgaGVpZ2h0UmVtYWluaW5nTGVmdCA9IDE7Ci0gICAgICAgIExheW91dFVuaXQg
aGVpZ2h0UmVtYWluaW5nUmlnaHQgPSAxOwotICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0ID0gbG9n
aWNhbExlZnRPZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9mZnNl
dCwgbG9naWNhbExlZnRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nTGVmdCk7Ci0gICAg
ICAgIHdoaWxlIChsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUo
bG9naWNhbFRvcE9mZnNldCwgbG9naWNhbFJpZ2h0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFp
bmluZ1JpZ2h0KSAtIGZsb2F0TG9naWNhbExlZnQgPCBmbG9hdExvZ2ljYWxXaWR0aCkgewotICAg
ICAgICAgICAgbG9naWNhbFRvcE9mZnNldCArPSBtaW4oaGVpZ2h0UmVtYWluaW5nTGVmdCwgaGVp
Z2h0UmVtYWluaW5nUmlnaHQpOwotICAgICAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IGxvZ2lj
YWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BPZmZzZXQs
IGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFpbmluZ0xlZnQpOwotICAgICAg
ICAgICAgaWYgKGluc2lkZUZsb3dUaHJlYWQpIHsKLSAgICAgICAgICAgICAgICAvLyBIYXZlIHRv
IHJlLWV2YWx1YXRlIGFsbCBvZiBvdXIgb2Zmc2V0cywgc2luY2UgdGhleSBtYXkgaGF2ZSBjaGFu
Z2VkLgotICAgICAgICAgICAgICAgIGxvZ2ljYWxSaWdodE9mZnNldCA9IGxvZ2ljYWxSaWdodE9m
ZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7IC8vIENvbnN0YW50IHBhcnQgb2Ygcmln
aHQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGxvZ2ljYWxMZWZ0T2Zmc2V0ID0gbG9naWNhbExl
ZnRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BPZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9m
IGxlZnQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGZsb2F0TG9naWNhbFdpZHRoID0gbWluKGZs
b2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSksIGxv
Z2ljYWxSaWdodE9mZnNldCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0ID0gbWF4KGxvZ2ljYWxMZWZ0T2Zmc2V0
IC0gYm9yZGVyQW5kUGFkZGluZ0xvZ2ljYWxMZWZ0KCksIGZsb2F0TG9naWNhbExlZnQpOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIExheW91dFVuaXQgaGVpZ2h0UmVtYWluaW5nTGVmdCA9IDE7Ci0g
ICAgICAgIExheW91dFVuaXQgaGVpZ2h0UmVtYWluaW5nUmlnaHQgPSAxOwotICAgICAgICBmbG9h
dExvZ2ljYWxMZWZ0ID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRz
aWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxSaWdodE9mZnNldCwgZmFsc2UsICZoZWlnaHRS
ZW1haW5pbmdSaWdodCk7Ci0gICAgICAgIHdoaWxlIChmbG9hdExvZ2ljYWxMZWZ0IC0gbG9naWNh
bExlZnRPZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9mZnNldCwg
bG9naWNhbExlZnRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nTGVmdCkgPCBmbG9hdExv
Z2ljYWxXaWR0aCkgewotICAgICAgICAgICAgbG9naWNhbFRvcE9mZnNldCArPSBtaW4oaGVpZ2h0
UmVtYWluaW5nTGVmdCwgaGVpZ2h0UmVtYWluaW5nUmlnaHQpOwotICAgICAgICAgICAgZmxvYXRM
b2dpY2FsTGVmdCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmVJZ25vcmluZ1NoYXBlT3V0c2lk
ZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsUmlnaHRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVt
YWluaW5nUmlnaHQpOwotICAgICAgICAgICAgaWYgKGluc2lkZUZsb3dUaHJlYWQpIHsKLSAgICAg
ICAgICAgICAgICAvLyBIYXZlIHRvIHJlLWV2YWx1YXRlIGFsbCBvZiBvdXIgb2Zmc2V0cywgc2lu
Y2UgdGhleSBtYXkgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIGxvZ2ljYWxSaWdodE9m
ZnNldCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7IC8v
IENvbnN0YW50IHBhcnQgb2YgcmlnaHQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGxvZ2ljYWxM
ZWZ0T2Zmc2V0ID0gbG9naWNhbExlZnRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BPZmZzZXQp
OyAvLyBDb25zdGFudCBwYXJ0IG9mIGxlZnQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGZsb2F0
TG9naWNhbFdpZHRoID0gbWluKGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSksIGxvZ2ljYWxSaWdodE9mZnNldCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0IC09
IGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7
IC8vIFVzZSB0aGUgb3JpZ2luYWwgd2lkdGggb2YgdGhlIGZsb2F0IGhlcmUsIHNpbmNlIHRoZSBs
b2NhbCB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gfGZsb2F0TG9naWNhbFdpZHRofCB3YXMgY2FwcGVk
IHRvIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBmYXN0L2Jsb2Nr
L2Zsb2F0L2NsYW1wZWQtcmlnaHQtZmxvYXQuaHRtbC4KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJu
IExheW91dFBvaW50KGZsb2F0TG9naWNhbExlZnQsIGxvZ2ljYWxUb3BPZmZzZXQpOwotfQotCi1i
b29sIFJlbmRlckJsb2NrOjpwb3NpdGlvbk5ld0Zsb2F0cygpCi17Ci0gICAgaWYgKCFtX2Zsb2F0
aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY29uc3QgRmxvYXRpbmdP
YmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwot
ICAgIGlmIChmbG9hdGluZ09iamVjdFNldC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIC8vIElmIGFsbCBmbG9hdHMgaGF2ZSBhbHJlYWR5IGJlZW4gcG9zaXRpb25lZCwg
dGhlbiB3ZSBoYXZlIG5vIHdvcmsgdG8gZG8uCi0gICAgaWYgKGZsb2F0aW5nT2JqZWN0U2V0Lmxh
c3QoKS0+aXNQbGFjZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTW92ZSBi
YWNrd2FyZHMgdGhyb3VnaCBvdXIgZmxvYXRpbmcgb2JqZWN0IGxpc3QgdW50aWwgd2UgZmluZCBh
IGZsb2F0IHRoYXQgaGFzCi0gICAgLy8gYWxyZWFkeSBiZWVuIHBvc2l0aW9uZWQuICBUaGVuIHdl
J2xsIGJlIGFibGUgdG8gbW92ZSBmb3J3YXJkLCBwb3NpdGlvbmluZyBhbGwgb2YKLSAgICAvLyB0
aGUgbmV3IGZsb2F0cyB0aGF0IG5lZWQgaXQuCi0gICAgYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0
U2V0LmVuZCgpOwotICAgIC0taXQ7IC8vIEdvIHRvIGxhc3QgaXRlbS4KLSAgICBhdXRvIGJlZ2lu
ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsKLSAgICBGbG9hdGluZ09iamVjdCogbGFzdFBs
YWNlZEZsb2F0aW5nT2JqZWN0ID0gMDsKLSAgICB3aGlsZSAoaXQgIT0gYmVnaW4pIHsKLSAgICAg
ICAgLS1pdDsKLSAgICAgICAgaWYgKCgqaXQpLT5pc1BsYWNlZCgpKSB7Ci0gICAgICAgICAgICBs
YXN0UGxhY2VkRmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7Ci0gICAgICAgICAgICArK2l0Owot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBMYXlvdXRVbml0IGxv
Z2ljYWxUb3AgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgCi0gICAgLy8gVGhlIGZsb2F0IGNhbm5v
dCBzdGFydCBhYm92ZSB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBsYXN0IHBvc2l0aW9uZWQgZmxv
YXQuCi0gICAgaWYgKGxhc3RQbGFjZWRGbG9hdGluZ09iamVjdCkKLSAgICAgICAgbG9naWNhbFRv
cCA9IG1heChsYXN0UGxhY2VkRmxvYXRpbmdPYmplY3QtPmxvZ2ljYWxUb3AoaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSksIGxvZ2ljYWxUb3ApOwotCi0gICAgYXV0byBlbmQgPSBmbG9hdGluZ09i
amVjdFNldC5lbmQoKTsKLSAgICAvLyBOb3cgd2FsayB0aHJvdWdoIHRoZSBzZXQgb2YgdW5wb3Np
dGlvbmVkIGZsb2F0cyBhbmQgcGxhY2UgdGhlbS4KLSAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0
KSB7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCA9IGl0LT5nZXQoKTsK
LSAgICAgICAgLy8gVGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgcmVzcG9uc2libGUgZm9yIHBvc2l0
aW9uaW5nIGZsb2F0cywgc28gaWYgd2UgaGF2ZSBmbG9hdHMgaW4gb3VyCi0gICAgICAgIC8vIGxp
c3QgdGhhdCBjb21lIGZyb20gc29tZXdoZXJlIGVsc2UsIGRvIG5vdCBhdHRlbXB0IHRvIHBvc2l0
aW9uIHRoZW0uCi0gICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5jb250YWlu
aW5nQmxvY2soKSAhPSB0aGlzKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgUmVu
ZGVyQm94KiBjaGlsZEJveCA9ICZmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKTsKLQotICAgICAg
ICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbExlZnRNYXJnaW4gPSBzdHlsZSgpLT5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCkgPyBtYXJnaW5TdGFydEZvckNoaWxkKGNoaWxkQm94KSA6IG1hcmdpbkVu
ZEZvckNoaWxkKGNoaWxkQm94KTsKLQotICAgICAgICBMYXlvdXRSZWN0IG9sZFJlY3QgPSBjaGls
ZEJveC0+ZnJhbWVSZWN0KCk7Ci0KLSAgICAgICAgaWYgKGNoaWxkQm94LT5zdHlsZSgpLT5jbGVh
cigpICYgQ0xFRlQpCi0gICAgICAgICAgICBsb2dpY2FsVG9wID0gbWF4KGxvd2VzdEZsb2F0TG9n
aWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KSwgbG9naWNhbFRvcCk7Ci0gICAg
ICAgIGlmIChjaGlsZEJveC0+c3R5bGUoKS0+Y2xlYXIoKSAmIENSSUdIVCkKLSAgICAgICAgICAg
IGxvZ2ljYWxUb3AgPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0
OjpGbG9hdFJpZ2h0KSwgbG9naWNhbFRvcCk7Ci0KLSAgICAgICAgTGF5b3V0UG9pbnQgZmxvYXRM
b2dpY2FsTG9jYXRpb24gPSBjb21wdXRlTG9naWNhbExvY2F0aW9uRm9yRmxvYXQoZmxvYXRpbmdP
YmplY3QsIGxvZ2ljYWxUb3ApOwotCi0gICAgICAgIGZsb2F0aW5nT2JqZWN0LT5zZXRMb2dpY2Fs
TGVmdChmbG9hdExvZ2ljYWxMb2NhdGlvbi54KCksIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkp
OwotCi0gICAgICAgIHNldExvZ2ljYWxMZWZ0Rm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9naWNh
bExvY2F0aW9uLngoKSArIGNoaWxkTG9naWNhbExlZnRNYXJnaW4pOwotICAgICAgICBzZXRMb2dp
Y2FsVG9wRm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSArIG1hcmdp
bkJlZm9yZUZvckNoaWxkKGNoaWxkQm94KSk7Ci0KLSAgICAgICAgZXN0aW1hdGVSZWdpb25SYW5n
ZUZvckJveENoaWxkKGNoaWxkQm94KTsKLQotICAgICAgICBMYXlvdXRTdGF0ZSogbGF5b3V0U3Rh
dGUgPSB2aWV3KCkubGF5b3V0U3RhdGUoKTsKLSAgICAgICAgYm9vbCBpc1BhZ2luYXRlZCA9IGxh
eW91dFN0YXRlLT5pc1BhZ2luYXRlZCgpOwotICAgICAgICBpZiAoaXNQYWdpbmF0ZWQgJiYgIWNo
aWxkQm94LT5uZWVkc0xheW91dCgpKQotICAgICAgICAgICAgY2hpbGRCb3gtPm1hcmtGb3JQYWdp
bmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgpOwotICAgICAgICAKLSAgICAgICAgY2hpbGRCb3gtPmxh
eW91dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgaWYgKGlzUGFnaW5hdGVkKSB7Ci0gICAgICAgICAg
ICAvLyBJZiB3ZSBhcmUgdW5zcGxpdHRhYmxlIGFuZCBkb24ndCBmaXQsIHRoZW4gd2UgbmVlZCB0
byBtb3ZlIGRvd24uCi0gICAgICAgICAgICAvLyBXZSBpbmNsdWRlIG91ciBtYXJnaW5zIGFzIHBh
cnQgb2YgdGhlIHVuc3BsaXR0YWJsZSBhcmVhLgotICAgICAgICAgICAgTGF5b3V0VW5pdCBuZXdM
b2dpY2FsVG9wID0gYWRqdXN0Rm9yVW5zcGxpdHRhYmxlQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9n
aWNhbExvY2F0aW9uLnkoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNl
ZSBpZiB3ZSBoYXZlIGEgcGFnaW5hdGlvbiBzdHJ1dCB0aGF0IGlzIG1ha2luZyB1cyBtb3ZlIGRv
d24gZnVydGhlci4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiB1bnNwbGl0dGFibGUgY2hp
bGQgY2FuJ3QgYWxzbyBoYXZlIGEgcGFnaW5hdGlvbiBzdHJ1dCwgc28gdGhpcyBpcwotICAgICAg
ICAgICAgLy8gZXhjbHVzaXZlIHdpdGggdGhlIGNhc2UgYWJvdmUuCi0gICAgICAgICAgICBSZW5k
ZXJCbG9jayogY2hpbGRCbG9jayA9IGNoaWxkQm94LT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRl
ckJsb2NrKGNoaWxkQm94KSA6IDA7Ci0gICAgICAgICAgICBpZiAoY2hpbGRCbG9jayAmJiBjaGls
ZEJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKSkgewotICAgICAgICAgICAgICAgIG5ld0xvZ2ljYWxU
b3AgKz0gY2hpbGRCbG9jay0+cGFnaW5hdGlvblN0cnV0KCk7Ci0gICAgICAgICAgICAgICAgY2hp
bGRCbG9jay0+c2V0UGFnaW5hdGlvblN0cnV0KDApOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgCi0gICAgICAgICAgICBpZiAobmV3TG9naWNhbFRvcCAhPSBmbG9hdExvZ2ljYWxMb2NhdGlv
bi55KCkpIHsKLSAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0UGFnaW5hdGlvblN0
cnV0KG5ld0xvZ2ljYWxUb3AgLSBmbG9hdExvZ2ljYWxMb2NhdGlvbi55KCkpOwotCi0gICAgICAg
ICAgICAgICAgZmxvYXRMb2dpY2FsTG9jYXRpb24gPSBjb21wdXRlTG9naWNhbExvY2F0aW9uRm9y
RmxvYXQoZmxvYXRpbmdPYmplY3QsIG5ld0xvZ2ljYWxUb3ApOwotICAgICAgICAgICAgICAgIGZs
b2F0aW5nT2JqZWN0LT5zZXRMb2dpY2FsTGVmdChmbG9hdExvZ2ljYWxMb2NhdGlvbi54KCksIGlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotCi0gICAgICAgICAgICAgICAgc2V0TG9naWNhbExl
ZnRGb3JDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueCgpICsgY2hpbGRMb2dp
Y2FsTGVmdE1hcmdpbik7Ci0gICAgICAgICAgICAgICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGNo
aWxkQm94LCBmbG9hdExvZ2ljYWxMb2NhdGlvbi55KCkgKyBtYXJnaW5CZWZvcmVGb3JDaGlsZChj
aGlsZEJveCkpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRCbG9jaykKLSAg
ICAgICAgICAgICAgICAgICAgY2hpbGRCbG9jay0+c2V0Q2hpbGROZWVkc0xheW91dChNYXJrT25s
eVRoaXMpOwotICAgICAgICAgICAgICAgIGNoaWxkQm94LT5sYXlvdXRJZk5lZWRlZCgpOwotICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodXBkYXRlUmVnaW9uUmFuZ2VGb3JCb3hDaGls
ZChjaGlsZEJveCkpIHsKLSAgICAgICAgICAgICAgICBjaGlsZEJveC0+c2V0TmVlZHNMYXlvdXQo
TWFya09ubHlUaGlzKTsKLSAgICAgICAgICAgICAgICBjaGlsZEJveC0+bGF5b3V0SWZOZWVkZWQo
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0aW5nT2JqZWN0LT5z
ZXRMb2dpY2FsVG9wKGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSwgaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSk7Ci0KLSAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxIZWlnaHQobG9n
aWNhbEhlaWdodEZvckNoaWxkKGNoaWxkQm94KSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxk
Qm94KSArIG1hcmdpbkFmdGVyRm9yQ2hpbGQoY2hpbGRCb3gpLCBpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpKTsKLQotICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+YWRkUGxhY2VkT2JqZWN0KGZs
b2F0aW5nT2JqZWN0KTsKLQotICAgICAgICAvLyBJZiB0aGUgY2hpbGQgbW92ZWQsIHdlIGhhdmUg
dG8gcmVwYWludCBpdC4KLSAgICAgICAgaWYgKGNoaWxkQm94LT5jaGVja0ZvclJlcGFpbnREdXJp
bmdMYXlvdXQoKSkKLSAgICAgICAgICAgIGNoaWxkQm94LT5yZXBhaW50RHVyaW5nTGF5b3V0SWZN
b3ZlZChvbGRSZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVuZGVy
QmxvY2s6Om5ld0xpbmUoRUNsZWFyIGNsZWFyKQotewotICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7
Ci0gICAgLy8gc2V0IHkgcG9zaXRpb24KLSAgICBMYXlvdXRVbml0IG5ld1kgPSAwOwotICAgIHN3
aXRjaCAoY2xlYXIpCi0gICAgewotICAgICAgICBjYXNlIENMRUZUOgotICAgICAgICAgICAgbmV3
WSA9IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENSSUdIVDoKLSAgICAgICAgICAgIG5l
d1kgPSBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0JPVEg6Ci0gICAgICAgICAgICBu
ZXdZID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGhlaWdodCgpIDwgbmV3WSkKLSAgICAgICAg
c2V0TG9naWNhbEhlaWdodChuZXdZKTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6YWRkUGVyY2Vu
dEhlaWdodERlc2NlbmRhbnQoUmVuZGVyQm94KiBkZXNjZW5kYW50KQogewogICAgIGluc2VydElu
dG9UcmFja2VkUmVuZGVyZXJNYXBzKGRlc2NlbmRhbnQsIGdQZXJjZW50SGVpZ2h0RGVzY2VuZGFu
dHNNYXAsIGdQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKTsKQEAgLTM2NTMsMTQgKzMxODAsNiBA
QCBMYXlvdXRVbml0IFJlbmRlckJsb2NrOjpsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50KFJl
bmRlclJlZ2lvbiogcmVnaW9uKSBjb25zdAogICAgIHJldHVybiBsb2dpY2FsUmlnaHRPZmZzZXQg
LSAobG9naWNhbFdpZHRoKCkgLSAoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IGJveFJlY3Qu
bWF4WCgpIDogYm94UmVjdC5tYXhZKCkpKTsKIH0KIAotTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6
bG9naWNhbExlZnRGbG9hdE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBsb2dpY2FsVG9wLCBMYXlv
dXRVbml0IGZpeGVkT2Zmc2V0LCBMYXlvdXRVbml0KiBoZWlnaHRSZW1haW5pbmcsIExheW91dFVu
aXQgbG9naWNhbEhlaWdodCwgU2hhcGVPdXRzaWRlRmxvYXRPZmZzZXRNb2RlIG9mZnNldE1vZGUp
IGNvbnN0Ci17Ci0gICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIG1fZmxvYXRpbmdPYmplY3Rz
LT5oYXNMZWZ0T2JqZWN0cygpKQotICAgICAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMtPmxv
Z2ljYWxMZWZ0T2Zmc2V0KGZpeGVkT2Zmc2V0LCBsb2dpY2FsVG9wLCBsb2dpY2FsSGVpZ2h0LCBv
ZmZzZXRNb2RlLCBoZWlnaHRSZW1haW5pbmcpOwotCi0gICAgcmV0dXJuIGZpeGVkT2Zmc2V0Owot
fQotCiBMYXlvdXRVbml0IFJlbmRlckJsb2NrOjphZGp1c3RMb2dpY2FsTGVmdE9mZnNldEZvckxp
bmUoTGF5b3V0VW5pdCBvZmZzZXRGcm9tRmxvYXRzLCBib29sIGFwcGx5VGV4dEluZGVudCkgY29u
c3QKIHsKICAgICBMYXlvdXRVbml0IGxlZnQgPSBvZmZzZXRGcm9tRmxvYXRzOwpAQCAtMzcwMSwx
NCArMzIyMCw2IEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2s6OmFkanVzdExvZ2ljYWxMZWZ0T2Zm
c2V0Rm9yTGluZShMYXlvdXRVbml0IG9mZnNldEZyb21GbG9hCiAgICAgcmV0dXJuIGxlZnQ7CiB9
CiAKLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9yTGlu
ZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVu
aXQqIGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBTaGFwZU91dHNp
ZGVGbG9hdE9mZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKLXsKLSAgICBpZiAobV9mbG9hdGlu
Z09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPmhhc1JpZ2h0T2JqZWN0cygpKQotICAgICAg
ICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMtPmxvZ2ljYWxSaWdodE9mZnNldChmaXhlZE9mZnNl
dCwgbG9naWNhbFRvcCwgbG9naWNhbEhlaWdodCwgb2Zmc2V0TW9kZSwgaGVpZ2h0UmVtYWluaW5n
KTsKLQotICAgIHJldHVybiBmaXhlZE9mZnNldDsKLX0KLQogTGF5b3V0VW5pdCBSZW5kZXJCbG9j
azo6YWRqdXN0TG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IG9mZnNldEZyb21G
bG9hdHMsIGJvb2wgYXBwbHlUZXh0SW5kZW50KSBjb25zdAogewogICAgIExheW91dFVuaXQgcmln
aHQgPSBvZmZzZXRGcm9tRmxvYXRzOwpAQCAtMzc0OSw0NiArMzI2MCw2IEBAIExheW91dFVuaXQg
UmVuZGVyQmxvY2s6OmFkanVzdExvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBv
ZmZzZXRGcm9tRmxvCiAgICAgcmV0dXJuIHJpZ2h0OwogfQogCi1MYXlvdXRVbml0IFJlbmRlckJs
b2NrOjpuZXh0RmxvYXRMb2dpY2FsQm90dG9tQmVsb3coTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0
LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKLXsKLSAgICBp
ZiAoIW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICByZXR1cm4gbG9naWNhbEhlaWdodDsKLQot
ICAgIExheW91dFVuaXQgYm90dG9tID0gTGF5b3V0VW5pdDo6bWF4KCk7Ci0gICAgY29uc3QgRmxv
YXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNl
dCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgZm9yIChh
dXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0g
ICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAgICAgICBMYXlvdXRVbml0
IGZsb2F0Qm90dG9tOwotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotICAgICAgICBTaGFwZU91dHNp
ZGVJbmZvKiBzaGFwZU91dHNpZGUgPSByLT5yZW5kZXJlcigpLnNoYXBlT3V0c2lkZUluZm8oKTsK
LSAgICAgICAgaWYgKG9mZnNldE1vZGUgPT0gU2hhcGVPdXRzaWRlRmxvYXRTaGFwZU9mZnNldCAm
JiBzaGFwZU91dHNpZGUpCi0gICAgICAgICAgICBmbG9hdEJvdHRvbSA9IHItPmxvZ2ljYWxUb3Ao
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgKyBtYXJnaW5CZWZvcmVGb3JDaGlsZCgmKHItPnJl
bmRlcmVyKCkpKSArIHNoYXBlT3V0c2lkZS0+c2hhcGVMb2dpY2FsQm90dG9tKCk7Ci0gICAgICAg
IGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgZmxvYXRCb3R0b20gPSByLT5sb2dpY2FsQm90dG9t
KGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotICAgICAgICBpZiAoZmxvYXRCb3R0b20gPiBs
b2dpY2FsSGVpZ2h0KQotICAgICAgICAgICAgYm90dG9tID0gbWluKGZsb2F0Qm90dG9tLCBib3R0
b20pOwotICAgIH0KLQotICAgIHJldHVybiBib3R0b20gPT0gTGF5b3V0VW5pdDo6bWF4KCkgPyBM
YXlvdXRVbml0KCkgOiBib3R0b207Ci19Ci0KLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6Omxvd2Vz
dEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6VHlwZSBmbG9hdFR5cGUpIGNvbnN0
Ci17Ci0gICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
TGF5b3V0VW5pdCBsb3dlc3RGbG9hdEJvdHRvbSA9IDA7Ci0gICAgY29uc3QgRmxvYXRpbmdPYmpl
Y3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAg
IGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgZm9yIChhdXRvIGl0ID0g
ZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEZs
b2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAgICAgICBpZiAoci0+aXNQbGFjZWQoKSAm
JiByLT50eXBlKCkgJiBmbG9hdFR5cGUpCi0gICAgICAgICAgICBsb3dlc3RGbG9hdEJvdHRvbSA9
IG1heChsb3dlc3RGbG9hdEJvdHRvbSwgci0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0
aW5nTW9kZSgpKSk7Ci0gICAgfQotICAgIHJldHVybiBsb3dlc3RGbG9hdEJvdHRvbTsKLX0KLQog
dm9pZCBSZW5kZXJCbG9jazo6bWFya0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UoTGF5b3V0VW5pdCBs
b2dpY2FsVG9wLCBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20sIFJvb3RJbmxpbmVCb3gqIGhpZ2hl
c3QpCiB7CiAgICAgaWYgKGxvZ2ljYWxUb3AgPj0gbG9naWNhbEJvdHRvbSkKQEAgLTM4MDcsMjQy
ICszMjc4LDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6Om1hcmtMaW5lc0RpcnR5SW5CbG9ja1Jhbmdl
KExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBsCiAgICAgfQogfQogCi1MYXlvdXRV
bml0IFJlbmRlckJsb2NrOjphZGRPdmVyaGFuZ2luZ0Zsb2F0cyhSZW5kZXJCbG9jayogY2hpbGQs
IGJvb2wgbWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0cykKLXsKLSAgICAvLyBQcmV2ZW50IGZsb2F0
cyBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZSBjYW52YXMgYnkgdGhlIHJvb3QgZWxlbWVudCwgZS5n
LiwgPGh0bWw+LgotICAgIGlmIChjaGlsZC0+aGFzT3ZlcmZsb3dDbGlwKCkgfHwgIWNoaWxkLT5j
b250YWluc0Zsb2F0cygpIHx8IGNoaWxkLT5pc1Jvb3QoKSB8fCBjaGlsZC0+aGFzQ29sdW1ucygp
IHx8IGNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IExheW91dFVuaXQgY2hpbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxvZ2ljYWxUb3AoKTsKLSAgICBM
YXlvdXRVbml0IGNoaWxkTG9naWNhbExlZnQgPSBjaGlsZC0+bG9naWNhbExlZnQoKTsKLSAgICBM
YXlvdXRVbml0IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSA9IDA7Ci0KLSAgICAvLyBGbG9hdHMg
dGhhdCB3aWxsIHJlbWFpbiB0aGUgY2hpbGQncyByZXNwb25zaWJpbGl0eSB0byBwYWludCBzaG91
bGQgZmFjdG9yIGludG8gaXRzCi0gICAgLy8gb3ZlcmZsb3cuCi0gICAgYXV0byBjaGlsZEVuZCA9
IGNoaWxkLT5tX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuZW5kKCk7Ci0gICAgZm9yIChhdXRvIGNo
aWxkSXQgPSBjaGlsZC0+bV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmJlZ2luKCk7IGNoaWxkSXQg
IT0gY2hpbGRFbmQ7ICsrY2hpbGRJdCkgewotICAgICAgICBGbG9hdGluZ09iamVjdCogciA9IGNo
aWxkSXQtPmdldCgpOwotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b21Gb3JGbG9hdCA9
IG1pbihyLT5sb2dpY2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpLCBMYXlvdXRV
bml0OjptYXgoKSAtIGNoaWxkTG9naWNhbFRvcCk7Ci0gICAgICAgIExheW91dFVuaXQgbG9naWNh
bEJvdHRvbSA9IGNoaWxkTG9naWNhbFRvcCArIGxvZ2ljYWxCb3R0b21Gb3JGbG9hdDsKLSAgICAg
ICAgbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tID0gbWF4KGxvd2VzdEZsb2F0TG9naWNhbEJvdHRv
bSwgbG9naWNhbEJvdHRvbSk7Ci0KLSAgICAgICAgaWYgKGxvZ2ljYWxCb3R0b20gPiBsb2dpY2Fs
SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBs
aXN0LCB3ZSBhZGQgaXQgbm93LgotICAgICAgICAgICAgaWYgKCFjb250YWluc0Zsb2F0KCZyLT5y
ZW5kZXJlcigpKSkgewotICAgICAgICAgICAgICAgIExheW91dFNpemUgb2Zmc2V0ID0gaXNIb3Jp
em9udGFsV3JpdGluZ01vZGUoKSA/IExheW91dFNpemUoLWNoaWxkTG9naWNhbExlZnQsIC1jaGls
ZExvZ2ljYWxUb3ApIDogTGF5b3V0U2l6ZSgtY2hpbGRMb2dpY2FsVG9wLCAtY2hpbGRMb2dpY2Fs
TGVmdCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBzaG91bGRQYWludCA9IGZhbHNlOwotCi0gICAg
ICAgICAgICAgICAgLy8gVGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxheWVyIGFsd2F5cyBwYWludHMg
dGhlIGZsb2F0IChzbyB0aGF0IHppbmRleCBhbmQgc3RhY2tpbmcKLSAgICAgICAgICAgICAgICAv
LyBiZWhhdmVzIHByb3Blcmx5KS4gIFdlIGFsd2F5cyB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgZGVz
aXJlIHRvIHBhaW50IHRoZSBmbG9hdCBhcwotICAgICAgICAgICAgICAgIC8vIGZhciBvdXQgYXMg
d2UgY2FuLCB0byB0aGUgb3V0ZXJtb3N0IGJsb2NrIHRoYXQgb3ZlcmxhcHMgdGhlIGZsb2F0LCBz
dG9wcGluZyBvbmx5Ci0gICAgICAgICAgICAgICAgLy8gaWYgd2UgaGl0IGEgc2VsZi1wYWludGlu
ZyBsYXllciBib3VuZGFyeS4KLSAgICAgICAgICAgICAgICBpZiAoci0+cmVuZGVyZXIoKS5lbmNs
b3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9PSBlbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIo
KSkgewotICAgICAgICAgICAgICAgICAgICByLT5zZXRTaG91bGRQYWludChmYWxzZSk7Ci0gICAg
ICAgICAgICAgICAgICAgIHNob3VsZFBhaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlIHRoZSBmbG9hdGluZyBvYmplY3QgbGlzdCBsYXpp
bHkuCi0gICAgICAgICAgICAgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgICAg
ICAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7Ci0KLSAgICAgICAgICAgICAgICBtX2Zs
b2F0aW5nT2JqZWN0cy0+YWRkKHItPmNvcHlUb05ld0NvbnRhaW5lcihvZmZzZXQsIHNob3VsZFBh
aW50LCB0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBpZiAobWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0cyAmJiAhci0+c2hvdWxkUGFpbnQoKSAmJiAh
ci0+cmVuZGVyZXIoKS5oYXNTZWxmUGFpbnRpbmdMYXllcigpCi0gICAgICAgICAgICAgICAgJiYg
ci0+cmVuZGVyZXIoKS5pc0Rlc2NlbmRhbnRPZihjaGlsZCkgJiYgci0+cmVuZGVyZXIoKS5lbmNs
b3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9PSBjaGlsZC0+ZW5jbG9zaW5nRmxvYXRQYWludGlu
Z0xheWVyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZmxvYXQgaXMgbm90IG92ZXJoYW5n
aW5nIGZyb20gdGhpcyBibG9jaywgc28gaWYgaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBjaGls
ZCwgdGhlIGNoaWxkIHNob3VsZAotICAgICAgICAgICAgICAgIC8vIHBhaW50IGl0ICh0aGUgb3Ro
ZXIgY2FzZSBpcyB0aGF0IGl0IGlzIGludHJ1ZGluZyBpbnRvIHRoZSBjaGlsZCksIHVubGVzcyBp
dCBoYXMgaXRzIG93biBsYXllciBvciBlbmNsb3NpbmcKLSAgICAgICAgICAgICAgICAvLyBsYXll
ci4KLSAgICAgICAgICAgICAgICAvLyBJZiBtYWtlQ2hpbGRQYWludE90aGVyRmxvYXRzIGlzIGZh
bHNlLCBpdCBtZWFucyB0aGF0IHRoZSBjaGlsZCBtdXN0IGFscmVhZHkga25vdyBhYm91dCBhbGwg
dGhlIGZsb2F0cwotICAgICAgICAgICAgICAgIC8vIGl0IHNob3VsZCBwYWludC4KLSAgICAgICAg
ICAgICAgICByLT5zZXRTaG91bGRQYWludCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIAotICAgICAgICAgICAgLy8gU2luY2UgdGhlIGZsb2F0IGRvZXNuJ3Qgb3ZlcmhhbmcsIGl0
IGRpZG4ndCBnZXQgcHV0IGludG8gb3VyIGxpc3QuICBXZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBh
ZGQgaXRzIG92ZXJmbG93IGluIHRvIHRoZQotICAgICAgICAgICAgLy8gY2hpbGQgbm93LgotICAg
ICAgICAgICAgaWYgKHItPmlzRGVzY2VuZGFudCgpKQotICAgICAgICAgICAgICAgIGNoaWxkLT5h
ZGRPdmVyZmxvd0Zyb21DaGlsZCgmci0+cmVuZGVyZXIoKSwgTGF5b3V0U2l6ZSh4UG9zaXRpb25G
b3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJn
aW4ocikpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbG93ZXN0RmxvYXRMb2dpY2Fs
Qm90dG9tOwotfQotCi1ib29sIFJlbmRlckJsb2NrOjpoYXNPdmVyaGFuZ2luZ0Zsb2F0KFJlbmRl
ckJveCogcmVuZGVyZXIpCi17Ci0gICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cyB8fCBoYXNDb2x1
bW5zKCkgfHwgIXBhcmVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjb25zdCBG
bG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+
c2V0KCk7Ci0gICAgYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmZpbmQ8UmVuZGVyQm94Jiwg
RmxvYXRpbmdPYmplY3RIYXNoVHJhbnNsYXRvcj4oKnJlbmRlcmVyKTsKLSAgICBpZiAoaXQgPT0g
ZmxvYXRpbmdPYmplY3RTZXQuZW5kKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJl
dHVybiAoKml0KS0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSA+IGxv
Z2ljYWxIZWlnaHQoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkSW50cnVkaW5nRmxvYXRz
KFJlbmRlckJsb2NrKiBwcmV2LCBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0T2Zmc2V0LCBMYXlvdXRV
bml0IGxvZ2ljYWxUb3BPZmZzZXQpCi17Ci0gICAgQVNTRVJUKCFhdm9pZHNGbG9hdHMoKSk7Ci0K
LSAgICAvLyBJZiB0aGUgcGFyZW50IG9yIHByZXZpb3VzIHNpYmxpbmcgZG9lc24ndCBoYXZlIGFu
eSBmbG9hdHMgdG8gYWRkLCBkb24ndCBib3RoZXIuCi0gICAgaWYgKCFwcmV2LT5tX2Zsb2F0aW5n
T2JqZWN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbG9naWNhbExlZnRPZmZzZXQgKz0gbWFy
Z2luTG9naWNhbExlZnQoKTsKLQotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBwcmV2U2V0
ID0gcHJldi0+bV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgIGF1dG8gcHJldkVuZCA9IHBy
ZXZTZXQuZW5kKCk7Ci0gICAgZm9yIChhdXRvIHByZXZJdCA9IHByZXZTZXQuYmVnaW4oKTsgcHJl
dkl0ICE9IHByZXZFbmQ7ICsrcHJldkl0KSB7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0g
cHJldkl0LT5nZXQoKTsKLSAgICAgICAgaWYgKHItPmxvZ2ljYWxCb3R0b20oaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkgPiBsb2dpY2FsVG9wT2Zmc2V0KSB7Ci0gICAgICAgICAgICBpZiAoIW1f
ZmxvYXRpbmdPYmplY3RzIHx8ICFtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuY29udGFpbnM8Rmxv
YXRpbmdPYmplY3QmLCBGbG9hdGluZ09iamVjdEhhc2hUcmFuc2xhdG9yPigqcikpIHsKLSAgICAg
ICAgICAgICAgICAvLyBXZSBjcmVhdGUgdGhlIGZsb2F0aW5nIG9iamVjdCBsaXN0IGxhemlseS4K
LSAgICAgICAgICAgICAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICAgICAgICAg
ICAgICBjcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKLQotICAgICAgICAgICAgICAgIC8vIEFwcGx5
aW5nIHRoZSBjaGlsZCdzIG1hcmdpbiBtYWtlcyBubyBzZW5zZSBpbiB0aGUgY2FzZSB3aGVyZSB0
aGUgY2hpbGQgd2FzIHBhc3NlZCBpbi4KLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIG1h
cmdpbiB3YXMgYWRkZWQgYWxyZWFkeSB0aHJvdWdoIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIHxs
b2dpY2FsTGVmdE9mZnNldHwgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAvLyBhYm92ZS4gIHxs
b2dpY2FsTGVmdE9mZnNldHwgd2lsbCBlcXVhbCB0aGUgbWFyZ2luIGluIHRoaXMgY2FzZSwgc28g
aXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KLSAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQu
ICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiBwcmV2IGlzIHRoZSBwYXJlbnQsIHNpbmNlIG90aGVy
d2lzZSB0aGUgbGVmdCBtYXJnaW4KLSAgICAgICAgICAgICAgICAvLyB3aWxsIGdldCBhcHBsaWVk
IHR3aWNlLgotICAgICAgICAgICAgICAgIExheW91dFNpemUgb2Zmc2V0ID0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKQotICAgICAgICAgICAgICAgICAgICA/IExheW91dFNpemUobG9naWNhbExl
ZnRPZmZzZXQgLSAocHJldiAhPSBwYXJlbnQoKSA/IHByZXYtPm1hcmdpbkxlZnQoKSA6IExheW91
dFVuaXQoKSksIGxvZ2ljYWxUb3BPZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIDogTGF5b3V0
U2l6ZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IHBhcmVu
dCgpID8gcHJldi0+bWFyZ2luVG9wKCkgOiBMYXlvdXRVbml0KCkpKTsKLQotICAgICAgICAgICAg
ICAgIG1fZmxvYXRpbmdPYmplY3RzLT5hZGQoci0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCkp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCiBib29sIFJlbmRlckJsb2Nr
Ojphdm9pZHNGbG9hdHMoKSBjb25zdAogewogICAgIC8vIEZsb2F0cyBjYW4ndCBpbnRydWRlIGlu
dG8gb3VyIGJveCBpZiB3ZSBoYXZlIGEgbm9uLWF1dG8gY29sdW1uIGNvdW50IG9yIHdpZHRoLgog
ICAgIHJldHVybiBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIHx8ICFzdHlsZSgpLT5oYXNBdXRv
Q29sdW1uQ291bnQoKSB8fCAhc3R5bGUoKS0+aGFzQXV0b0NvbHVtbldpZHRoKCk7CiB9CiAKLWJv
b2wgUmVuZGVyQmxvY2s6OmNvbnRhaW5zRmxvYXQoUmVuZGVyQm94KiByZW5kZXJlcikgY29uc3QK
LXsKLSAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPnNl
dCgpLmNvbnRhaW5zPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+KCpy
ZW5kZXJlcik7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6Om1hcmtBbGxEZXNjZW5kYW50c1dpdGhG
bG9hdHNGb3JMYXlvdXQoUmVuZGVyQm94KiBmbG9hdFRvUmVtb3ZlLCBib29sIGluTGF5b3V0KQot
ewotICAgIGlmICghZXZlckhhZExheW91dCgpICYmICFjb250YWluc0Zsb2F0cygpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBNYXJraW5nQmVoYXZpb3IgbWFya1BhcmVudHMgPSBpbkxheW91dCA/
IE1hcmtPbmx5VGhpcyA6IE1hcmtDb250YWluaW5nQmxvY2tDaGFpbjsKLSAgICBzZXRDaGlsZE5l
ZWRzTGF5b3V0KG1hcmtQYXJlbnRzKTsKLSAKLSAgICBpZiAoZmxvYXRUb1JlbW92ZSkKLSAgICAg
ICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoZmxvYXRUb1JlbW92ZSk7Ci0KLSAgICAvLyBJdGVyYXRl
IG92ZXIgb3VyIGNoaWxkcmVuIGFuZCBtYXJrIHRoZW0gYXMgbmVlZGVkLgotICAgIGlmICghY2hp
bGRyZW5JbmxpbmUoKSkgewotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBmaXJz
dENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAg
ICAgICBpZiAoKCFmbG9hdFRvUmVtb3ZlICYmIGNoaWxkLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQ
b3NpdGlvbmVkKCkpIHx8ICFjaGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSB0b1JlbmRl
ckJsb2NrKGNoaWxkKTsKLSAgICAgICAgICAgIGlmICgoZmxvYXRUb1JlbW92ZSA/IGNoaWxkQmxv
Y2stPmNvbnRhaW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWluc0Zs
b2F0cygpKSB8fCBjaGlsZEJsb2NrLT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkpCi0gICAgICAgICAg
ICAgICAgY2hpbGRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChm
bG9hdFRvUmVtb3ZlLCBpbkxheW91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUmVu
ZGVyQmxvY2s6Om1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlvdXQoUmVuZGVyQm94KiBmbG9h
dFRvUmVtb3ZlKQotewotICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1f
ZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0
LmVuZCgpOwotCi0gICAgZm9yIChSZW5kZXJPYmplY3QqIG5leHQgPSBuZXh0U2libGluZygpOyBu
ZXh0OyBuZXh0ID0gbmV4dC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW5leHQtPmlz
UmVuZGVyQmxvY2soKSB8fCBuZXh0LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkg
fHwgdG9SZW5kZXJCbG9jayhuZXh0KS0+YXZvaWRzRmxvYXRzKCkpCi0gICAgICAgICAgICBjb250
aW51ZTsKLQotICAgICAgICBSZW5kZXJCbG9jayogbmV4dEJsb2NrID0gdG9SZW5kZXJCbG9jayhu
ZXh0KTsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIGZsb2F0aW5nQm94ID0g
JigqaXQpLT5yZW5kZXJlcigpOwotICAgICAgICAgICAgaWYgKGZsb2F0VG9SZW1vdmUgJiYgZmxv
YXRpbmdCb3ggIT0gZmxvYXRUb1JlbW92ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgIGlmIChuZXh0QmxvY2stPmNvbnRhaW5zRmxvYXQoZmxvYXRpbmdCb3gpKQotICAg
ICAgICAgICAgICAgIG5leHRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0Zvckxh
eW91dChmbG9hdGluZ0JveCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUxheW91dFVuaXQgUmVu
ZGVyQmxvY2s6OmdldENsZWFyRGVsdGEoUmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dp
Y2FsVG9wKQotewotICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY29tcHV0ZSBjbGVhcmFuY2Ug
aWYgd2UgaGF2ZSBubyBmbG9hdHMuCi0gICAgaWYgKCFjb250YWluc0Zsb2F0cygpKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyBBdCBsZWFzdCBvbmUgZmxvYXQgaXMgcHJlc2VudC4g
IFdlIG5lZWQgdG8gcGVyZm9ybSB0aGUgY2xlYXJhbmNlIGNvbXB1dGF0aW9uLgotICAgIGJvb2wg
Y2xlYXJTZXQgPSBjaGlsZC0+c3R5bGUoKS0+Y2xlYXIoKSAhPSBDTk9ORTsKLSAgICBMYXlvdXRV
bml0IGxvZ2ljYWxCb3R0b20gPSAwOwotICAgIHN3aXRjaCAoY2hpbGQtPnN0eWxlKCktPmNsZWFy
KCkpIHsKLSAgICAgICAgY2FzZSBDTk9ORToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENMRUZUOgotICAgICAgICAgICAgbG9naWNhbEJvdHRvbSA9IGxvd2VzdEZsb2F0TG9naWNh
bEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIENSSUdIVDoKLSAgICAgICAgICAgIGxvZ2ljYWxCb3R0b20gPSBsb3dlc3RG
bG9hdExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0JPVEg6Ci0gICAgICAgICAgICBsb2dpY2FsQm90dG9t
ID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9
Ci0KLSAgICAvLyBXZSBhbHNvIGNsZWFyIGZsb2F0cyBpZiB3ZSBhcmUgdG9vIGJpZyB0byBzaXQg
b24gdGhlIHNhbWUgbGluZSBhcyBhIGZsb2F0IChhbmQgd2lzaCB0byBhdm9pZCBmbG9hdHMgYnkg
ZGVmYXVsdCkuCi0gICAgTGF5b3V0VW5pdCByZXN1bHQgPSBjbGVhclNldCA/IG1heDxMYXlvdXRV
bml0PigwLCBsb2dpY2FsQm90dG9tIC0gbG9naWNhbFRvcCkgOiBMYXlvdXRVbml0KCk7Ci0gICAg
aWYgKCFyZXN1bHQgJiYgY2hpbGQtPmF2b2lkc0Zsb2F0cygpKSB7Ci0gICAgICAgIExheW91dFVu
aXQgbmV3TG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0g
ICAgICAgICAgICBMYXlvdXRVbml0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRv
cE9mZnNldCA9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUobmV3TG9naWNhbFRvcCwgZmFs
c2UsIGxvZ2ljYWxIZWlnaHRGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICAgICAgaWYgKGF2YWls
YWJsZUxvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRvcE9mZnNldCA9PSBhdmFpbGFibGVMb2dpY2Fs
V2lkdGhGb3JDb250ZW50KG5ld0xvZ2ljYWxUb3ApKQotICAgICAgICAgICAgICAgIHJldHVybiBu
ZXdMb2dpY2FsVG9wIC0gbG9naWNhbFRvcDsKLQotICAgICAgICAgICAgUmVuZGVyUmVnaW9uKiBy
ZWdpb24gPSByZWdpb25BdEJsb2NrT2Zmc2V0KGxvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCkpOwot
ICAgICAgICAgICAgTGF5b3V0UmVjdCBib3JkZXJCb3ggPSBjaGlsZC0+Ym9yZGVyQm94UmVjdElu
UmVnaW9uKHJlZ2lvbiwgRG9Ob3RDYWNoZVJlbmRlckJveFJlZ2lvbkluZm8pOwotICAgICAgICAg
ICAgTGF5b3V0VW5pdCBjaGlsZExvZ2ljYWxXaWR0aEF0T2xkTG9naWNhbFRvcE9mZnNldCA9IGlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBib3JkZXJCb3gud2lkdGgoKSA6IGJvcmRlckJveC5o
ZWlnaHQoKTsKLQotICAgICAgICAgICAgLy8gRklYTUU6IE5vbmUgb2YgdGhpcyBpcyByaWdodCBm
b3IgcGVycGVuZGljdWxhciB3cml0aW5nLW1vZGUgY2hpbGRyZW4uCi0gICAgICAgICAgICBMYXlv
dXRVbml0IGNoaWxkT2xkTG9naWNhbFdpZHRoID0gY2hpbGQtPmxvZ2ljYWxXaWR0aCgpOwotICAg
ICAgICAgICAgTGF5b3V0VW5pdCBjaGlsZE9sZE1hcmdpbkxlZnQgPSBjaGlsZC0+bWFyZ2luTGVm
dCgpOwotICAgICAgICAgICAgTGF5b3V0VW5pdCBjaGlsZE9sZE1hcmdpblJpZ2h0ID0gY2hpbGQt
Pm1hcmdpblJpZ2h0KCk7Ci0gICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkT2xkTG9naWNhbFRv
cCA9IGNoaWxkLT5sb2dpY2FsVG9wKCk7Ci0KLSAgICAgICAgICAgIGNoaWxkLT5zZXRMb2dpY2Fs
VG9wKG5ld0xvZ2ljYWxUb3ApOwotICAgICAgICAgICAgY2hpbGQtPnVwZGF0ZUxvZ2ljYWxXaWR0
aCgpOwotICAgICAgICAgICAgcmVnaW9uID0gcmVnaW9uQXRCbG9ja09mZnNldChsb2dpY2FsVG9w
Rm9yQ2hpbGQoY2hpbGQpKTsKLSAgICAgICAgICAgIGJvcmRlckJveCA9IGNoaWxkLT5ib3JkZXJC
b3hSZWN0SW5SZWdpb24ocmVnaW9uLCBEb05vdENhY2hlUmVuZGVyQm94UmVnaW9uSW5mbyk7Ci0g
ICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbFdpZHRoQXROZXdMb2dpY2FsVG9wT2Zm
c2V0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IGJvcmRlckJveC53aWR0aCgpIDogYm9y
ZGVyQm94LmhlaWdodCgpOwotCi0gICAgICAgICAgICBjaGlsZC0+c2V0TG9naWNhbFRvcChjaGls
ZE9sZExvZ2ljYWxUb3ApOwotICAgICAgICAgICAgY2hpbGQtPnNldExvZ2ljYWxXaWR0aChjaGls
ZE9sZExvZ2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBjaGlsZC0+c2V0TWFyZ2luTGVmdChjaGls
ZE9sZE1hcmdpbkxlZnQpOwotICAgICAgICAgICAgY2hpbGQtPnNldE1hcmdpblJpZ2h0KGNoaWxk
T2xkTWFyZ2luUmlnaHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2hpbGRMb2dp
Y2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQgPD0gYXZhaWxhYmxlTG9naWNhbFdpZHRoQXRO
ZXdMb2dpY2FsVG9wT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggd2Ug
bWF5IG5vdCBiZSBtb3ZpbmcsIGlmIHRoZSBsb2dpY2FsIHdpZHRoIGRpZCBzaHJpbmsgYmVjYXVz
ZSBvZiB0aGUgcHJlc2VuY2Ugb2YgbmV3IGZsb2F0cywgdGhlbgotICAgICAgICAgICAgICAgIC8v
IHdlIG5lZWQgdG8gZm9yY2UgYSByZWxheW91dCBhcyB0aG91Z2ggd2Ugc2hpZnRlZC4gVGhpcyBo
YXBwZW5zIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYWRkaXRpb24gb2Ygb3ZlcmhhbmdpbmcgZmxv
YXRzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBwcmV2aW91cyBzaWJsaW5ncyB3aGVuIG5lZ2F0
aXZlIG1hcmdpbnMgZXhpc3Qgb24gYSBjaGlsZCAoc2VlIHRoZSBhZGRPdmVyaGFuZ2luZ0Zsb2F0
cyBjYWxsIGF0IHRoZSBlbmQgb2YgY29sbGFwc2VNYXJnaW5zKS4KLSAgICAgICAgICAgICAgICBp
ZiAoY2hpbGRMb2dpY2FsV2lkdGhBdE9sZExvZ2ljYWxUb3BPZmZzZXQgIT0gY2hpbGRMb2dpY2Fs
V2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLT5z
ZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IG5ld0xvZ2ljYWxUb3AgLSBsb2dpY2FsVG9wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBuZXdMb2dpY2FsVG9wID0gbmV4dEZsb2F0TG9naWNhbEJvdHRvbUJlbG93KG5ld0xvZ2ljYWxU
b3ApOwotICAgICAgICAgICAgQVNTRVJUKG5ld0xvZ2ljYWxUb3AgPj0gbG9naWNhbFRvcCk7Ci0g
ICAgICAgICAgICBpZiAobmV3TG9naWNhbFRvcCA8IGxvZ2ljYWxUb3ApCi0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAg
fQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIGJvb2wgUmVuZGVyQmxvY2s6OmlzUG9pbnRJbk92
ZXJmbG93Q29udHJvbChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IExheW91dFBvaW50JiBs
b2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQp
CiB7CiAgICAgaWYgKCFzY3JvbGxzT3ZlcmZsb3coKSkKQEAgLTQxMjgsMzQgKzMzNjksNiBAQCBi
b29sIFJlbmRlckJsb2NrOjpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVz
dCwgSGl0VGVzdFJlc3VsdCYgcmVzdQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBSZW5k
ZXJCbG9jazo6aGl0VGVzdEZsb2F0cyhjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0
VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250
YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCkKLXsKLSAgICBpZiAo
IW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBMYXlvdXRQ
b2ludCBhZGp1c3RlZExvY2F0aW9uID0gYWNjdW11bGF0ZWRPZmZzZXQ7Ci0gICAgaWYgKGlzUmVu
ZGVyVmlldygpKQotICAgICAgICBhZGp1c3RlZExvY2F0aW9uICs9IHRvTGF5b3V0U2l6ZSh0b1Jl
bmRlclZpZXcoKnRoaXMpLmZyYW1lVmlldygpLnNjcm9sbFBvc2l0aW9uKCkpOwotCi0gICAgY29u
c3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVj
dHMtPnNldCgpOwotICAgIGF1dG8gYmVnaW4gPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOwot
ICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOyBpdCAhPSBiZWdpbjsp
IHsKLSAgICAgICAgLS1pdDsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0
ID0gaXQtPmdldCgpOwotICAgICAgICBpZiAoZmxvYXRpbmdPYmplY3QtPnNob3VsZFBhaW50KCkg
JiYgIWZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhhc1NlbGZQYWludGluZ0xheWVyKCkpIHsK
LSAgICAgICAgICAgIExheW91dFVuaXQgeE9mZnNldCA9IHhQb3NpdGlvbkZvckZsb2F0SW5jbHVk
aW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSAtIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLngo
KTsKLSAgICAgICAgICAgIExheW91dFVuaXQgeU9mZnNldCA9IHlQb3NpdGlvbkZvckZsb2F0SW5j
bHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSAtIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigp
LnkoKTsKLSAgICAgICAgICAgIExheW91dFBvaW50IGNoaWxkUG9pbnQgPSBmbGlwRmxvYXRGb3JX
cml0aW5nTW9kZUZvckNoaWxkKGZsb2F0aW5nT2JqZWN0LCBhZGp1c3RlZExvY2F0aW9uICsgTGF5
b3V0U2l6ZSh4T2Zmc2V0LCB5T2Zmc2V0KSk7Ci0gICAgICAgICAgICBpZiAoZmxvYXRpbmdPYmpl
Y3QtPnJlbmRlcmVyKCkuaGl0VGVzdChyZXF1ZXN0LCByZXN1bHQsIGxvY2F0aW9uSW5Db250YWlu
ZXIsIGNoaWxkUG9pbnQpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSGl0VGVzdFJlc3VsdChy
ZXN1bHQsIGxvY2F0aW9uSW5Db250YWluZXIucG9pbnQoKSAtIHRvTGF5b3V0U2l6ZShjaGlsZFBv
aW50KSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIGNsYXNzIENvbHVtblJlY3RJ
dGVyYXRvciB7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ29sdW1uUmVjdEl0ZXJhdG9yKTsK
IHB1YmxpYzoKQEAgLTYwNjksNyArNTI4Miw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkanVzdEZv
ckJvcmRlckZpdChMYXlvdXRVbml0IHgsIExheW91dFVuaXQmIGxlZnQsIExheW91dFVuaXQmCiAg
ICAgICAgIGVsc2UgewogICAgICAgICAgICAgZm9yIChSZW5kZXJCb3gqIG9iaiA9IGZpcnN0Q2hp
bGRCb3goKTsgb2JqOyBvYmogPSBvYmotPm5leHRTaWJsaW5nQm94KCkpIHsKICAgICAgICAgICAg
ICAgICBpZiAoIW9iai0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChvYmotPmlzUmVuZGVyQmxvY2tGbG93KCkgJiYgIW9iai0+aGFz
T3ZlcmZsb3dDbGlwKCkpCisgICAgICAgICAgICAgICAgICAgIGlmIChvYmotPmlzUmVuZGVyQmxv
Y2soKSAmJiAhb2JqLT5oYXNPdmVyZmxvd0NsaXAoKSkKICAgICAgICAgICAgICAgICAgICAgICAg
IHRvUmVuZGVyQmxvY2sob2JqKS0+YWRqdXN0Rm9yQm9yZGVyRml0KHggKyBvYmotPngoKSwgbGVm
dCwgcmlnaHQpOwogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmotPnN0eWxlKCktPnZp
c2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBh
cmUgYSByZXBsYWNlZCBlbGVtZW50IG9yIHNvbWUga2luZCBvZiBub24tYmxvY2stZmxvdyBvYmpl
Y3QuCkBAIC02MDc5LDIxICs1MjkyLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRqdXN0Rm9yQm9y
ZGVyRml0KExheW91dFVuaXQgeCwgTGF5b3V0VW5pdCYgbGVmdCwgTGF5b3V0VW5pdCYKICAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAg
IGlmIChtX2Zsb2F0aW5nT2JqZWN0cykgewotICAgICAgICAgICAgY29uc3QgRmxvYXRpbmdPYmpl
Y3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAg
ICAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICAgICAgICAg
IGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgewotICAgICAgICAgICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAg
ICAgICAgICAgICAgIC8vIE9ubHkgZXhhbWluZSB0aGUgb2JqZWN0IGlmIG91ciBtX3Nob3VsZFBh
aW50IGZsYWcgaXMgc2V0LgotICAgICAgICAgICAgICAgIGlmIChyLT5zaG91bGRQYWludCgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIExheW91dFVuaXQgZmxvYXRMZWZ0ID0geFBvc2l0aW9uRm9y
RmxvYXRJbmNsdWRpbmdNYXJnaW4ocikgLSByLT5yZW5kZXJlcigpLngoKTsKLSAgICAgICAgICAg
ICAgICAgICAgTGF5b3V0VW5pdCBmbG9hdFJpZ2h0ID0gZmxvYXRMZWZ0ICsgci0+cmVuZGVyZXIo
KS53aWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbWluKGxlZnQsIGZsb2F0TGVm
dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gbWF4KHJpZ2h0LCBmbG9hdFJpZ2h0KTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiB9CiAK
QEAgLTY2NzMsMTEgKzU4NzEsNiBAQCBjb25zdCBjaGFyKiBSZW5kZXJCbG9jazo6cmVuZGVyTmFt
ZSgpIGNvbnN0CiAgICAgcmV0dXJuICJSZW5kZXJCbG9jayI7CiB9CiAKLXZvaWQgUmVuZGVyQmxv
Y2s6OmNyZWF0ZUZsb2F0aW5nT2JqZWN0cygpCi17Ci0gICAgbV9mbG9hdGluZ09iamVjdHMgPSBh
ZG9wdFB0cihuZXcgRmxvYXRpbmdPYmplY3RzKHRoaXMsIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2Rl
KCkpKTsKLX0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+CiBzdGF0aWMgaW5s
aW5lIFRleHRSdW4gY29uc3RydWN0VGV4dFJ1bkludGVybmFsKFJlbmRlck9iamVjdCogY29udGV4
dCwgY29uc3QgRm9udCYgZm9udCwgY29uc3QgQ2hhcmFjdGVyVHlwZSogY2hhcmFjdGVycywgaW50
IGxlbmd0aCwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBUZXh0UnVuOjpFeHBhbnNpb25CZWhh
dmlvciBleHBhbnNpb24pCiB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2suaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCmlu
ZGV4IDI3OGRmZTZiYzQ1NGE0OTc0YjE4YjI4YWQ5NzE4ZjU4ZTEzODg2OTcuLmIzM2JjOTAyNGU2
ZmY5MWQ5MjQ5ODBhZmFiN2VhZjdkZDZmZTQ5MDYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9jay5oCkBAIC01Myw3ICs1Myw2IEBAIGNsYXNzIFJlbmRlclRleHQ7CiAKIHN0cnVj
dCBCaWRpUnVuOwogc3RydWN0IFBhaW50SW5mbzsKLWNsYXNzIExpbmVCcmVha2VyOwogY2xhc3Mg
TGluZUluZm87CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOwogI2lmIEVOQUJMRShDU1NfU0hBUEVTKQpA
QCAtMTE4LDcgKzExNyw4IEBAIHB1YmxpYzoKICAgICBJbmxpbmVGbG93Qm94KiBmaXJzdExpbmVC
b3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5maXJzdExpbmVCb3goKTsgfQogICAgIElu
bGluZUZsb3dCb3gqIGxhc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMubGFz
dExpbmVCb3goKTsgfQogCi0gICAgdm9pZCBkZWxldGVMaW5lQm94VHJlZSgpOworICAgIC8vIEZJ
WE1FLUJMT0NLRkxPVzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBoYXZl
IG1vdmVkIHRvIFJlbmRlckJsb2NrRmxvdworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVMaW5lQm94
VHJlZSgpOwogCiAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hp
bGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQgPSAwKSBPVkVSUklERTsKICAgICB2aXJ0dWFs
IHZvaWQgcmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZWN0KikgT1ZFUlJJREU7CkBAIC0xMjksOCArMTI5
LDYgQEAgcHVibGljOgogICAgIHN0YXRpYyB2b2lkIHJlbW92ZVBvc2l0aW9uZWRPYmplY3QoUmVu
ZGVyQm94Kik7CiAgICAgdm9pZCByZW1vdmVQb3NpdGlvbmVkT2JqZWN0cyhSZW5kZXJCbG9jayos
IENvbnRhaW5pbmdCbG9ja1N0YXRlID0gU2FtZUNvbnRhaW5pbmdCbG9jayk7CiAKLSAgICB2b2lk
IHJlbW92ZUZsb2F0aW5nT2JqZWN0cygpOwotCiAgICAgVHJhY2tlZFJlbmRlcmVyTGlzdEhhc2hT
ZXQqIHBvc2l0aW9uZWRPYmplY3RzKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNQb3NpdGlvbmVkT2Jq
ZWN0cygpIGNvbnN0CiAgICAgewpAQCAtMTYyLDEzICsxNjAsMTEgQEAgcHVibGljOgogCiAgICAg
Ym9vbCBnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmplY3QqKTsKIAot
ICAgIHZvaWQgbWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChSZW5kZXJCb3gq
IGZsb2F0VG9SZW1vdmUgPSAwLCBib29sIGluTGF5b3V0ID0gdHJ1ZSk7Ci0gICAgdm9pZCBtYXJr
U2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KFJlbmRlckJveCogZmxvYXRUb1JlbW92ZSA9IDAp
OwogICAgIHZvaWQgbWFya1Bvc2l0aW9uZWRPYmplY3RzRm9yTGF5b3V0KCk7CiAgICAgdmlydHVh
bCB2b2lkIG1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgpIE9WRVJSSURFIEZJTkFM
OwogICAgIAotICAgIGJvb2wgY29udGFpbnNGbG9hdHMoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0
aW5nT2JqZWN0cyAmJiAhbV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmlzRW1wdHkoKTsgfQotICAg
IGJvb2wgY29udGFpbnNGbG9hdChSZW5kZXJCb3gqKSBjb25zdDsKKyAgICAvLyBGSVhNRS1CTE9D
S0ZMT1c6IFJlbW92ZSB2aXJ0dWFsaXphaW9uIHdoZW4gYWxsIG9mIHRoZSBsaW5lIGxheW91dCBj
b2RlIGhhcyBiZWVuIG1vdmVkIG91dCBvZiBSZW5kZXJCbG9jaworICAgIHZpcnR1YWwgYm9vbCBj
b250YWluc0Zsb2F0cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgICAvLyBWZXJzaW9u
cyB0aGF0IGNhbiBjb21wdXRlIGxpbmUgb2Zmc2V0cyB3aXRoIHRoZSByZWdpb24gYW5kIHBhZ2Ug
b2Zmc2V0IHBhc3NlZCBpbi4gVXNlZCBmb3Igc3BlZWQgdG8gYXZvaWQgaGF2aW5nIHRvCiAgICAg
Ly8gY29tcHV0ZSB0aGUgcmVnaW9uIGFsbCBvdmVyIGFnYWluIHdoZW4geW91IGFscmVhZHkga25v
dyBpdC4KQEAgLTI5Miw4ICsyODgsNiBAQCBwdWJsaWM6CiAgICAgewogICAgICAgICByZXR1cm4g
b2JqLT5pc0Zsb2F0aW5nKCkgfHwgKG9iai0+aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIW9i
ai0+c3R5bGUoKS0+aXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCkgJiYgIW9iai0+Y29udGFp
bmVyKCktPmlzUmVuZGVySW5saW5lKCkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBh
cHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgaW50IHN0YXJ0LCBpbnQg
ZW5kLCBSZW5kZXJPYmplY3QqLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsKIAogICAgIHN0YXRpYyBU
ZXh0UnVuIGNvbnN0cnVjdFRleHRSdW4oUmVuZGVyT2JqZWN0KiBjb250ZXh0LCBjb25zdCBGb250
JiwgY29uc3QgU3RyaW5nJiwgY29uc3QgUmVuZGVyU3R5bGUmLAogICAgICAgICBUZXh0UnVuOjpF
eHBhbnNpb25CZWhhdmlvciA9IFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24gfCBUZXh0
UnVuOjpGb3JiaWRMZWFkaW5nRXhwYW5zaW9uLCBUZXh0UnVuRmxhZ3MgPSBEZWZhdWx0VGV4dFJ1
bkZsYWdzKTsKQEAgLTUxMywxMSArNTA3LDEwIEBAIHByb3RlY3RlZDoKICAgICB2b2lkIHNldERl
c2lyZWRDb2x1bW5Db3VudEFuZFdpZHRoKGludCwgTGF5b3V0VW5pdCk7CiAKIHB1YmxpYzoKLSAg
ICB2b2lkIGNvbXB1dGVPdmVyZmxvdyhMYXlvdXRVbml0IG9sZENsaWVudEFmdGVyRWRnZSwgYm9v
bCByZWNvbXB1dGVGbG9hdHMgPSBmYWxzZSk7CisgICAgdmlydHVhbCB2b2lkIGNvbXB1dGVPdmVy
ZmxvdyhMYXlvdXRVbml0IG9sZENsaWVudEFmdGVyRWRnZSwgYm9vbCByZWNvbXB1dGVGbG9hdHMg
PSBmYWxzZSk7CiAgICAgdm9pZCBjbGVhckxheW91dE92ZXJmbG93KCk7CiBwcm90ZWN0ZWQ6CiAg
ICAgdmlydHVhbCB2b2lkIGFkZE92ZXJmbG93RnJvbUNoaWxkcmVuKCk7Ci0gICAgdm9pZCBhZGRP
dmVyZmxvd0Zyb21GbG9hdHMoKTsKICAgICB2b2lkIGFkZE92ZXJmbG93RnJvbVBvc2l0aW9uZWRP
YmplY3RzKCk7CiAgICAgdm9pZCBhZGRPdmVyZmxvd0Zyb21CbG9ja0NoaWxkcmVuKCk7CiAgICAg
dm9pZCBhZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbigpOwpAQCAtNTM3LDggKzUzMCwxMCBA
QCBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB2b2lkIGNoZWNrRm9yUGFnaW5hdGlvbkxvZ2ljYWxI
ZWlnaHRDaGFuZ2UoTGF5b3V0VW5pdCYgcGFnZUxvZ2ljYWxIZWlnaHQsIGJvb2wmIHBhZ2VMb2dp
Y2FsSGVpZ2h0Q2hhbmdlZCwgYm9vbCYgaGFzU3BlY2lmaWVkUGFnZUxvZ2ljYWxIZWlnaHQpOwog
CiBwcml2YXRlOgotICAgIExheW91dFVuaXQgbG9naWNhbFJpZ2h0RmxvYXRPZmZzZXRGb3JMaW5l
KExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0VW5p
dCogaGVpZ2h0UmVtYWluaW5nLCBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0c2lk
ZUZsb2F0T2Zmc2V0TW9kZSkgY29uc3Q7Ci0gICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdEZsb2F0
T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZz
ZXQsIExheW91dFVuaXQqIGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0
LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUpIGNvbnN0OworICAgIC8vIEZJWE1FLUJMT0NL
RkxPVzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBoYXZlIG1vdmVkIHRv
IFJlbmRlckJsb2NrRmxvdworICAgIHZpcnR1YWwgTGF5b3V0VW5pdCBsb2dpY2FsUmlnaHRGbG9h
dE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0
VW5pdCosIExheW91dFVuaXQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSkgY29uc3QgeyBy
ZXR1cm4gZml4ZWRPZmZzZXQ7IH07CisgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdmly
dHVhbGl6YWlvbiB3aGVuIGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQgdG8gUmVuZGVyQmxvY2tGbG93
CisgICAgdmlydHVhbCBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5lKExh
eW91dFVuaXQsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQqLCBMYXlvdXRVbml0
LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUpIGNvbnN0IHsgcmV0dXJuIGZpeGVkT2Zmc2V0
OyB9CiAgICAgTGF5b3V0VW5pdCBhZGp1c3RMb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKExheW91
dFVuaXQgb2Zmc2V0RnJvbUZsb2F0cywgYm9vbCBhcHBseVRleHRJbmRlbnQpIGNvbnN0OwogICAg
IExheW91dFVuaXQgYWRqdXN0TG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgb2Zm
c2V0RnJvbUZsb2F0cywgYm9vbCBhcHBseVRleHRJbmRlbnQpIGNvbnN0OwogCkBAIC01NTYsNyAr
NTUxLDggQEAgcHJpdmF0ZToKICAgICB2b2lkIG1ha2VDaGlsZHJlbk5vbklubGluZShSZW5kZXJP
YmplY3QqIGluc2VydGlvblBvaW50ID0gMCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUxlZnRv
dmVyQW5vbnltb3VzQmxvY2soUmVuZGVyQmxvY2sqIGNoaWxkKTsKIAotICAgIHZvaWQgbW92ZUFs
bENoaWxkcmVuSW5jbHVkaW5nRmxvYXRzVG8oUmVuZGVyQmxvY2sqIHRvQmxvY2ssIGJvb2wgZnVs
bFJlbW92ZUluc2VydCk7CisgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdmlydHVhbGl6
YWlvbiB3aGVuIGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQgdG8gUmVuZGVyQmxvY2tGbG93CisgICAg
dmlydHVhbCB2b2lkIG1vdmVBbGxDaGlsZHJlbkluY2x1ZGluZ0Zsb2F0c1RvKFJlbmRlckJsb2Nr
KiB0b0Jsb2NrLCBib29sIGZ1bGxSZW1vdmVJbnNlcnQpIHsgbW92ZUFsbENoaWxkcmVuVG8odG9C
bG9jaywgZnVsbFJlbW92ZUluc2VydCk7IH0KIAogICAgIHZvaWQgYWRkQ2hpbGRUb0NvbnRpbnVh
dGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsK
ICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmpl
Y3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKSBPVkVSUklERTsKQEAgLTU2
NiwxMCArNTYyLDYgQEAgcHJpdmF0ZToKICAgICAKICAgICB2aXJ0dWFsIGJvb2wgaXNTZWxmQ29s
bGFwc2luZ0Jsb2NrKCkgY29uc3QgT1ZFUlJJREUgRklOQUw7CiAKLSAgICB2aXJ0dWFsIHZvaWQg
cmVwYWludE92ZXJoYW5naW5nRmxvYXRzKGJvb2wgcGFpbnRBbGxEZXNjZW5kYW50cykgT1ZFUlJJ
REUgRklOQUw7Ci0KLSAgICBCaWRpUnVuKiBoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlz
dDxCaWRpUnVuPiYsIEJpZGlDb250ZXh0Kik7Ci0KICAgICB2b2lkIGluc2VydEludG9UcmFja2Vk
UmVuZGVyZXJNYXBzKFJlbmRlckJveCogZGVzY2VuZGFudCwgVHJhY2tlZERlc2NlbmRhbnRzTWFw
KiYsIFRyYWNrZWRDb250YWluZXJNYXAqJik7CiAgICAgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbVRy
YWNrZWRSZW5kZXJlck1hcHMoUmVuZGVyQm94KiBkZXNjZW5kYW50LCBUcmFja2VkRGVzY2VuZGFu
dHNNYXAqJiwgVHJhY2tlZENvbnRhaW5lck1hcComKTsKIApAQCAtNjE0LDYzICs2MDYsMjAgQEAg
cHJpdmF0ZToKICAgICAgICAgICAgIHJldHVybiBjaGlsZC0+eSgpICsgY2hpbGQtPnJlbmRlcmVy
KCkubWFyZ2luVG9wKCk7CiAgICAgfQogCi0gICAgTGF5b3V0UG9pbnQgY29tcHV0ZUxvZ2ljYWxM
b2NhdGlvbkZvckZsb2F0KGNvbnN0IEZsb2F0aW5nT2JqZWN0KiwgTGF5b3V0VW5pdCBsb2dpY2Fs
VG9wT2Zmc2V0KSBjb25zdDsKLQotICAgIHZvaWQgY2hlY2tGbG9hdHNJbkNsZWFuTGluZShSb290
SW5saW5lQm94KiwgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+Jiwgc2l6ZV90JiBmbG9hdEluZGV4LCBi
b29sJiBlbmNvdW50ZXJlZE5ld0Zsb2F0LCBib29sJiBkaXJ0aWVkQnlGbG9hdCk7Ci0gICAgUm9v
dElubGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmLCBJbmxp
bmVCaWRpUmVzb2x2ZXImKTsKLSAgICB2b2lkIGRldGVybWluZUVuZFBvc2l0aW9uKExpbmVMYXlv
dXRTdGF0ZSYsIFJvb3RJbmxpbmVCb3gqIHN0YXJ0Qm94LCBJbmxpbmVJdGVyYXRvciYgY2xlYW5M
aW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpOwotICAgIGJvb2wgbWF0
Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiwg
Y29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5k
TGluZVN0YXR1cyk7Ci0gICAgYm9vbCBjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUo
TGluZUxheW91dFN0YXRlJik7Ci0gICAgCi0gICAgUm9vdElubGluZUJveCogY29uc3RydWN0TGlu
ZShCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGNvbnN0IExpbmVJbmZvJik7Ci0gICAgSW5saW5lRmxv
d0JveCogY3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVjdCosIGNvbnN0IExpbmVJbmZvJiwgSW5s
aW5lQm94KiBjaGlsZEJveCwgYm9vbCBzdGFydHNOZXdTZWdtZW50KTsKLQotICAgIHZvaWQgc2V0
TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biosIFJlbmRlclJ1YnlSdW4qLCBSZW5kZXJPYmplY3Qq
LCBjb25zdCBMaW5lSW5mbyYpOwotCi0gICAgQmlkaVJ1biogY29tcHV0ZUlubGluZURpcmVjdGlv
blBvc2l0aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJbmZvJiwgRVRl
eHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0LAotICAgICAgICBmbG9hdCYgYXZhaWxhYmxlTG9n
aWNhbFdpZHRoLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwg
R2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNh
bFBvc2l0aW9uQ2FjaGUmLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9pZCBjb21wdXRlSW5s
aW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgY29uc3QgTGluZUlu
Zm8mLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCBy
ZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYsIFZlcnRpY2FsUG9z
aXRpb25DYWNoZSYsIFdvcmRNZWFzdXJlbWVudHMmKTsKLSAgICB2b2lkIGNvbXB1dGVCbG9ja0Rp
cmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIEJpZGlSdW4qLCBHbHlwaE92
ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYpOwotICAg
IHZvaWQgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKLSAgICB2b2lkIGNoZWNrTGluZXNGb3JU
ZXh0T3ZlcmZsb3coKTsKLQotICAgIC8vIFBvc2l0aW9ucyBuZXcgZmxvYXRzIGFuZCBhbHNvIGFk
anVzdCBhbGwgZmxvYXRzIGVuY291bnRlcmVkIG9uIHRoZSBsaW5lIGlmIGFueSBvZiB0aGVtCi0g
ICAgLy8gaGF2ZSB0byBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2UvY29sdW1uLgotICAgIGJvb2wgcG9z
aXRpb25OZXdGbG9hdE9uTGluZShGbG9hdGluZ09iamVjdCogbmV3RmxvYXQsIEZsb2F0aW5nT2Jq
ZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5mbyYsIExpbmVXaWR0aCYpOwot
ICAgIHZvaWQgYXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0Kik7
Ci0KLSAgICAvLyBFbmQgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gUmVuZGVyQmxvY2tMaW5lTGF5
b3V0LmNwcC4KLQotICAgIHZvaWQgcGFpbnRGbG9hdHMoUGFpbnRJbmZvJiwgY29uc3QgTGF5b3V0
UG9pbnQmLCBib29sIHByZXNlcnZlUGhhc2UgPSBmYWxzZSk7CisgICAgLy8gRklYTUUtQkxPQ0tG
TE9XOiBSZW1vdmUgdmlydHVhbGl6YWlvbiB3aGVuIGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQgdG8g
UmVuZGVyQmxvY2tGbG93CisgICAgdmlydHVhbCB2b2lkIHBhaW50RmxvYXRzKFBhaW50SW5mbyYs
IGNvbnN0IExheW91dFBvaW50JiwgYm9vbCkgeyB9CiAgICAgdm9pZCBwYWludENvbnRlbnRzKFBh
aW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50Jik7CiAgICAgdm9pZCBwYWludENvbHVtbkNvbnRl
bnRzKFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgYm9vbCBwYWludEZsb2F0cyA9IGZh
bHNlKTsKICAgICB2b2lkIHBhaW50Q29sdW1uUnVsZXMoUGFpbnRJbmZvJiwgY29uc3QgTGF5b3V0
UG9pbnQmKTsKICAgICB2b2lkIHBhaW50U2VsZWN0aW9uKFBhaW50SW5mbyYsIGNvbnN0IExheW91
dFBvaW50Jik7CiAgICAgdm9pZCBwYWludENhcmV0KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBv
aW50JiwgQ2FyZXRUeXBlKTsKIAotICAgIEZsb2F0aW5nT2JqZWN0KiBpbnNlcnRGbG9hdGluZ09i
amVjdChSZW5kZXJCb3gqKTsKLSAgICB2b2lkIHJlbW92ZUZsb2F0aW5nT2JqZWN0KFJlbmRlckJv
eCopOwotICAgIHZvaWQgcmVtb3ZlRmxvYXRpbmdPYmplY3RzQmVsb3coRmxvYXRpbmdPYmplY3Qq
LCBpbnQgbG9naWNhbE9mZnNldCk7Ci0gICAgCi0gICAgLy8gQ2FsbGVkIGZyb20gbGluZVdpZHRo
LCB0byBwb3NpdGlvbiB0aGUgZmxvYXRzIGFkZGVkIGluIHRoZSBsYXN0IGxpbmUuCi0gICAgLy8g
UmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIGl0IGhhcyBwb3NpdGlvbmVkIGFueSBmbG9hdHMu
Ci0gICAgYm9vbCBwb3NpdGlvbk5ld0Zsb2F0cygpOwotCi0gICAgTGF5b3V0VW5pdCBnZXRDbGVh
ckRlbHRhKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQgeVBvcyk7Ci0KICAgICB2aXJ0dWFs
IGJvb2wgYXZvaWRzRmxvYXRzKCkgY29uc3QgT1ZFUlJJREU7CiAKLSAgICBib29sIGhhc092ZXJo
YW5naW5nRmxvYXRzKCkgeyByZXR1cm4gcGFyZW50KCkgJiYgIWhhc0NvbHVtbnMoKSAmJiBjb250
YWluc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpID4gbG9naWNhbEhlaWdo
dCgpOyB9Ci0gICAgYm9vbCBoYXNPdmVyaGFuZ2luZ0Zsb2F0KFJlbmRlckJveCopOwotICAgIHZv
aWQgYWRkSW50cnVkaW5nRmxvYXRzKFJlbmRlckJsb2NrKiBwcmV2LCBMYXlvdXRVbml0IHhvZmZz
ZXQsIExheW91dFVuaXQgeW9mZnNldCk7Ci0gICAgTGF5b3V0VW5pdCBhZGRPdmVyaGFuZ2luZ0Zs
b2F0cyhSZW5kZXJCbG9jayogY2hpbGQsIGJvb2wgbWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0cyk7
Ci0KLSAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVj
dDo6VHlwZSA9IEZsb2F0aW5nT2JqZWN0OjpGbG9hdExlZnRSaWdodCkgY29uc3Q7IAotICAgIExh
eW91dFVuaXQgbmV4dEZsb2F0TG9naWNhbEJvdHRvbUJlbG93KExheW91dFVuaXQsIFNoYXBlT3V0
c2lkZUZsb2F0T2Zmc2V0TW9kZSA9IFNoYXBlT3V0c2lkZUZsb2F0TWFyZ2luQm94T2Zmc2V0KSBj
b25zdDsKLSAgICAKICAgICBib29sIGhpdFRlc3RDb2x1bW5zKGNvbnN0IEhpdFRlc3RSZXF1ZXN0
JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRh
aW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBIaXRUZXN0QWN0aW9u
KTsKICAgICB2aXJ0dWFsIGJvb2wgaGl0VGVzdENvbnRlbnRzKGNvbnN0IEhpdFRlc3RSZXF1ZXN0
JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRh
aW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBIaXRUZXN0QWN0aW9u
KTsKLSAgICBib29sIGhpdFRlc3RGbG9hdHMoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0
UmVzdWx0JiwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25z
dCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQpOworICAgIC8vIEZJWE1FLUJMT0NLRkxP
VzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBoYXZlIG1vdmVkIHRvIFJl
bmRlckJsb2NrRmxvdworICAgIHZpcnR1YWwgYm9vbCBoaXRUZXN0RmxvYXRzKGNvbnN0IEhpdFRl
c3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYsIGNvbnN0
IExheW91dFBvaW50JikgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgYm9vbCBpc1Bv
aW50SW5PdmVyZmxvd0NvbnRyb2woSGl0VGVzdFJlc3VsdCYsIGNvbnN0IExheW91dFBvaW50JiBs
b2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQp
OwogCkBAIC03MDYsNiArNjU1LDggQEAgcHJpdmF0ZToKICAgICBMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIExheW91dFVuaXQgcG9z
aXRpb24sIGNvbnN0IExvZ2ljYWxTZWxlY3Rpb25PZmZzZXRDYWNoZXMmKTsKICAgICBMYXlvdXRV
bml0IGxvZ2ljYWxSaWdodFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBM
YXlvdXRVbml0IHBvc2l0aW9uLCBjb25zdCBMb2dpY2FsU2VsZWN0aW9uT2Zmc2V0Q2FjaGVzJik7
CiAgICAgCisgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdmlydHVhbGl6YWlvbiB3aGVu
IGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQgdG8gUmVuZGVyQmxvY2tGbG93CisgICAgdmlydHVhbCB2
b2lkIGNsaXBPdXRGbG9hdGluZ09iamVjdHMoUmVuZGVyQmxvY2sqLCBjb25zdCBQYWludEluZm8q
LCBjb25zdCBMYXlvdXRQb2ludCYsIGNvbnN0IExheW91dFNpemUmKSB7IH07CiAgICAgZnJpZW5k
IGNsYXNzIExvZ2ljYWxTZWxlY3Rpb25PZmZzZXRDYWNoZXM7CiAKICAgICB2aXJ0dWFsIHZvaWQg
YWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11
bGF0ZWRPZmZzZXQpIGNvbnN0IE9WRVJSSURFOwpAQCAtNzIxLDEyICs2NzIsMTAgQEAgcHJpdmF0
ZToKICAgICB2b2lkIGFkanVzdFBvaW50VG9Db2x1bW5Db250ZW50cyhMYXlvdXRQb2ludCYpIGNv
bnN0OwogICAgIAogICAgIHZvaWQgZml0Qm9yZGVyVG9MaW5lc0lmTmVlZGVkKCk7IC8vIFNocmlu
ayB0aGUgYm94IGluIHdoaWNoIHRoZSBib3JkZXIgcGFpbnRzIGlmIGJvcmRlci1maXQgaXMgc2V0
LgotICAgIHZvaWQgYWRqdXN0Rm9yQm9yZGVyRml0KExheW91dFVuaXQgeCwgTGF5b3V0VW5pdCYg
bGVmdCwgTGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0OyAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGJv
cmRlckZpdEFkanVzdAorICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RGb3JCb3JkZXJGaXQoTGF5b3V0
VW5pdCB4LCBMYXlvdXRVbml0JiBsZWZ0LCBMYXlvdXRVbml0JiByaWdodCkgY29uc3Q7IC8vIEhl
bHBlciBmdW5jdGlvbiBmb3IgYm9yZGVyRml0QWRqdXN0CiAKICAgICB2b2lkIG1hcmtMaW5lc0Rp
cnR5SW5CbG9ja1JhbmdlKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBsb2dpY2Fs
Qm90dG9tLCBSb290SW5saW5lQm94KiBoaWdoZXN0ID0gMCk7CiAKLSAgICB2b2lkIG5ld0xpbmUo
RUNsZWFyKTsKLQogICAgIFBvc2l0aW9uIHBvc2l0aW9uRm9yQm94KElubGluZUJveCosIGJvb2wg
c3RhcnQgPSB0cnVlKSBjb25zdDsKICAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25Gb3JQb2lu
dFdpdGhJbmxpbmVDaGlsZHJlbihjb25zdCBMYXlvdXRQb2ludCYpOwogCkBAIC03NDgsMTkgKzY5
Nyw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCBtb3ZlUnVuSW5VbmRlclNpYmxpbmdCbG9ja0lmTmVl
ZGVkKFJlbmRlck9iamVjdCogcnVuSW4pOwogICAgIHZvaWQgbW92ZVJ1bkluVG9PcmlnaW5hbFBv
c2l0aW9uKFJlbmRlck9iamVjdCogcnVuSW4pOwogCi0gICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZv
ciBsYXlvdXRJbmxpbmVDaGlsZHJlbigpCi0gICAgUm9vdElubGluZUJveCogY3JlYXRlTGluZUJv
eGVzRnJvbUJpZGlSdW5zKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0cmFp
bGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9pZCBsYXlvdXRSdW5zQW5k
RmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYsIGJvb2wgaGFzSW5saW5lQ2hpbGQpOwotICAgIHZvaWQg
bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiwgSW5saW5lQmlkaVJl
c29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBCaWRp
U3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0
ZWRMaW5lcyk7Ci0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi0gICAgdm9pZCB1cGRhdGVTaGFwZUFu
ZFNlZ21lbnRzRm9yQ3VycmVudExpbmUoU2hhcGVJbnNpZGVJbmZvKiYsIGNvbnN0IExheW91dFNp
emUmLCBMaW5lTGF5b3V0U3RhdGUmKTsKLSAgICB2b2lkIHVwZGF0ZVNoYXBlQW5kU2VnbWVudHNG
b3JDdXJyZW50TGluZUluRmxvd1RocmVhZChTaGFwZUluc2lkZUluZm8qJiwgTGluZUxheW91dFN0
YXRlJik7Ci0gICAgYm9vbCBhZGp1c3RMb2dpY2FsTGluZVRvcEFuZExvZ2ljYWxIZWlnaHRJZk5l
ZWRlZChTaGFwZUluc2lkZUluZm8qLCBMYXlvdXRVbml0LCBMaW5lTGF5b3V0U3RhdGUmLCBJbmxp
bmVCaWRpUmVzb2x2ZXImLCBGbG9hdGluZ09iamVjdCosIElubGluZUl0ZXJhdG9yJiwgV29yZE1l
YXN1cmVtZW50cyYpOwotI2VuZGlmCi0gICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIHJlc3RhcnRM
YXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExh
eW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2ZXImLCAgY29uc3QgSW5saW5lSXRlcmF0b3Im
KTsKLSAgICB2b2lkIGxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmKTsKLSAg
ICBzdGF0aWMgdm9pZCByZXBhaW50RGlydHlGbG9hdHMoVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiBm
bG9hdHMpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBkaXJ0eUZvckxheW91dEZyb21QZXJjZW50
YWdlSGVpZ2h0RGVzY2VuZGFudHMoKTsKICAgICAKQEAgLTgyMSw5ICs3NTcsOCBAQCBwdWJsaWM6
CiAgICAgLy8gRklYTUU6IFRoaXMgaXMgdGVtcG9yYXJ5IHRvIGFsbG93IHVzIHRvIG1vdmUgY29k
ZSBmcm9tIFJlbmRlckJsb2NrIGludG8gUmVuZGVyQmxvY2tGbG93IHRoYXQgYWNjZXNzZXMgbWVt
YmVyIHZhcmlhYmxlcyB0aGF0IHdlIGhhdmVuJ3QgbW92ZWQgb3V0IG9mCiAgICAgLy8gUmVuZGVy
QmxvY2sgeWV0LgogICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJCbG9ja0Zsb3c7Ci0KLXByb3RlY3Rl
ZDoKLSAgICB2b2lkIGNyZWF0ZUZsb2F0aW5nT2JqZWN0cygpOworICAgIC8vIEZJWE1FLUJMT0NL
RkxPVzogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgbGluZSBsYXlvdXQgc3R1ZmYgaGFzIGFsbCBtb3Zl
ZCBvdXQgb2YgUmVuZGVyQmxvY2sKKyAgICBmcmllbmQgY2xhc3MgTGluZUJyZWFrZXI7CiAKIHB1
YmxpYzoKICAgICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhh
dmUgbm9uLWRlZmF1bHQgdmFsdWVzCkBAIC04NDYsNyArNzgxLDYgQEAgcHVibGljOgogCiBwcm90
ZWN0ZWQ6CiAKLSAgICBPd25QdHI8RmxvYXRpbmdPYmplY3RzPiBtX2Zsb2F0aW5nT2JqZWN0czsK
ICAgICBPd25QdHI8UmVuZGVyQmxvY2tSYXJlRGF0YT4gbV9yYXJlRGF0YTsKIAogICAgIFJlbmRl
ckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgcm9vdCBsaW5lIGJveGVz
IGNyZWF0ZWQgZm9yIHRoaXMgYmxvY2sgZmxvdy4gIEZvciBleGFtcGxlLCA8ZGl2PkhlbGxvPGJy
PndvcmxkLjwvZGl2PiB3aWxsIGhhdmUgdHdvIHRvdGFsIGxpbmVzIGZvciB0aGUgPGRpdj4uCkBA
IC04NjYsOCArODAwLDYgQEAgcHJvdGVjdGVkOgogICAgIC8vIFJlbmRlclJ1YnlCYXNlIG9iamVj
dHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFuZCBtZXJnZSwgbW92aW5nIHRoZWlyIGNoaWxk
cmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1vdmVDaGlsZFRvLCBtb3ZlQWxsQ2hpbGRyZW5U
bywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSkuCiAgICAgZnJpZW5kIGNsYXNzIFJlbmRlclJ1
YnlCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBMaW5lQnJlYWtlcjsKLSAgICBmcmllbmQgY2xhc3Mg
TGluZVdpZHRoOyAvLyBOZWVkcyB0byBrbm93IEZsb2F0aW5nT2JqZWN0CiAKIHByaXZhdGU6CiAg
ICAgLy8gVXNlZCB0byBzdG9yZSBzdGF0ZSBiZXR3ZWVuIHN0eWxlV2lsbENoYW5nZSBhbmQgc3R5
bGVEaWRDaGFuZ2UKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
bG9ja0Zsb3cuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5j
cHAKaW5kZXggNTJlNzEwY2I2Nzk2MGUxYjYxNzg4MjU2YWE2NmU1YTQ4MDc1ZmM0My4uZjM3MTQz
Y2JmOTMwYWY1NDYwNjY1MDQ2NjI2ODkxYTBhMDA3NDhmMyAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRl
ICJSZW5kZXJCbG9ja0Zsb3cuaCIKIAogI2luY2x1ZGUgIkZsb2F0aW5nT2JqZWN0cy5oIgorI2lu
Y2x1ZGUgIkhpdFRlc3RMb2NhdGlvbi5oIgogI2luY2x1ZGUgIkxheW91dFJlcGFpbnRlci5oIgog
I2luY2x1ZGUgIlJlbmRlckZsb3dUaHJlYWQuaCIKICNpbmNsdWRlICJSZW5kZXJMYXllci5oIgpA
QCAtMzUsNiArMzYsOCBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKK2Jvb2wgUmVuZGVyQmxvY2s6OnNfY2FuUHJvcGFnYXRlRmxvYXRJbnRvU2libGluZyA9
IGZhbHNlOworCiBzdHJ1Y3QgU2FtZVNpemVBc01hcmdpbkluZm8gewogICAgIHVpbnQzMl90IGJp
dGZpZWxkcyA6IDE2OwogICAgIExheW91dFVuaXQgbWFyZ2luc1syXTsKQEAgLTEzMSwxNiArMTM0
LDE2IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpjbGVhckZsb2F0cygpCiAgICAgLy8gV2Ugc2hv
dWxkIG5vdCBwcm9jZXNzIGZsb2F0cyBpZiB0aGUgcGFyZW50IG5vZGUgaXMgbm90IGEgUmVuZGVy
QmxvY2suIE90aGVyd2lzZSwgd2Ugd2lsbCBhZGQgCiAgICAgLy8gZmxvYXRzIGluIGFuIGludmFs
aWQgY29udGV4dC4gVGhpcyB3aWxsIGNhdXNlIGEgY3Jhc2ggYXJpc2luZyBmcm9tIGEgYmFkIGNh
c3Qgb24gdGhlIHBhcmVudC4KICAgICAvLyBTZWUgPHJkYXI6Ly9wcm9ibGVtLzgwNDk3NTM+LCB3
aGVyZSBmbG9hdCBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGEgdGV4dCBub2RlIGluIGEgU1ZHLgot
ICAgIGlmICghcGFyZW50KCkgfHwgIXBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkpCisgICAgaWYg
KCFwYXJlbnQoKSB8fCAhcGFyZW50KCktPmlzUmVuZGVyQmxvY2tGbG93KCkpCiAgICAgICAgIHJl
dHVybjsKIAogICAgIC8vIEF0dGVtcHQgdG8gbG9jYXRlIGEgcHJldmlvdXMgc2libGluZyB3aXRo
IG92ZXJoYW5naW5nIGZsb2F0cy4gV2Ugc2tpcCBhbnkgZWxlbWVudHMgdGhhdCBhcmUKICAgICAv
LyBvdXQgb2YgZmxvdyAobGlrZSBmbG9hdGluZy9wb3NpdGlvbmVkIGVsZW1lbnRzKSwgYW5kIHdl
IGFsc28gc2tpcCBvdmVyIGFueSBvYmplY3RzIHRoYXQgbWF5IGhhdmUgc2hpZnRlZAogICAgIC8v
IHRvIGF2b2lkIGZsb2F0cy4KLSAgICBSZW5kZXJCbG9jayogcGFyZW50QmxvY2sgPSB0b1JlbmRl
ckJsb2NrKHBhcmVudCgpKTsKKyAgICBSZW5kZXJCbG9ja0Zsb3cqIHBhcmVudEJsb2NrID0gdG9S
ZW5kZXJCbG9ja0Zsb3cocGFyZW50KCkpOwogICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gZmFs
c2U7CiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hp
bGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCAh
cHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2so
cHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgIHdoaWxlIChwcmV2ICYmIChwcmV2LT5pc0Zs
b2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgIXByZXYtPmlzQm94KCkgfHwgIXByZXYt
PmlzUmVuZGVyQmxvY2tGbG93KCkgfHwgdG9SZW5kZXJCbG9ja0Zsb3cocHJldiktPmF2b2lkc0Zs
b2F0cygpKSkgewogICAgICAgICBpZiAocHJldi0+aXNGbG9hdGluZygpKQogICAgICAgICAgICAg
cGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2li
bGluZygpOwpAQCAtMTYwLDcgKzE2Myw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpjbGVhckZs
b2F0cygpCiAgICAgfQogCiAgICAgLy8gQWRkIG92ZXJoYW5naW5nIGZsb2F0cyBmcm9tIHRoZSBw
cmV2aW91cyBSZW5kZXJCbG9jaywgYnV0IG9ubHkgaWYgaXQgaGFzIGEgZmxvYXQgdGhhdCBpbnRy
dWRlcyBpbnRvIG91ciBzcGFjZS4gICAgCi0gICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gdG9SZW5k
ZXJCbG9jayhwcmV2KTsKKyAgICBSZW5kZXJCbG9ja0Zsb3cqIGJsb2NrID0gdG9SZW5kZXJCbG9j
a0Zsb3cocHJldik7CiAgICAgaWYgKGJsb2NrLT5tX2Zsb2F0aW5nT2JqZWN0cyAmJiBibG9jay0+
bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBsb2dpY2FsVG9wT2Zmc2V0KQogICAgICAgICBh
ZGRJbnRydWRpbmdGbG9hdHMoYmxvY2ssIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBsb2dpY2FsVG9wT2Zm
c2V0KTsKIApAQCAtMzE3LDcgKzMyMCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRC
bG9jayhib29sIHJlbGF5b3V0Q2hpbGRyZW4sIExheW91dFVuaXQgcGFnZUxvZ2ljYWxICiAgICAg
ICAgICAgICAvLyBPbmUgb2Ygb3VyIGNoaWxkcmVuJ3MgZmxvYXRzIG1heSBoYXZlIGJlY29tZSBh
biBvdmVyaGFuZ2luZyBmbG9hdCBmb3IgdXMuIFdlIG5lZWQgdG8gbG9vayBmb3IgaXQuCiAgICAg
ICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNoaWxk
LT5pc1JlbmRlckJsb2NrRmxvdygpICYmICFjaGlsZC0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9z
aXRpb25lZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHRv
UmVuZGVyQmxvY2soY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9ja0Zsb3cq
IGJsb2NrID0gdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICBp
ZiAoYmxvY2stPmxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpICsgYmxvY2stPmxvZ2ljYWxUb3Ao
KSA+IG5ld0hlaWdodCkKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE92ZXJoYW5naW5nRmxv
YXRzKGJsb2NrLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc3LDcgKzU4MCw3IEBA
IHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRCbG9ja0NoaWxkKFJlbmRlckJveCogY2hpbGQs
IE1hcmdpbkluZm8mIG1hcmdpbkluZm8sCiAgICAgLy8gSWYgdGhlIGNoaWxkIGhhcyBvdmVyaGFu
Z2luZyBmbG9hdHMgdGhhdCBpbnRydWRlIGludG8gZm9sbG93aW5nIHNpYmxpbmdzIChvciBwb3Nz
aWJseSBvdXQKICAgICAvLyBvZiB0aGlzIGJsb2NrKSwgdGhlbiB0aGUgcGFyZW50IGdldHMgbm90
aWZpZWQgb2YgdGhlIGZsb2F0cyBub3cuCiAgICAgaWYgKGNoaWxkQmxvY2tGbG93ICYmIGNoaWxk
QmxvY2tGbG93LT5jb250YWluc0Zsb2F0cygpKQotICAgICAgICBtYXhGbG9hdExvZ2ljYWxCb3R0
b20gPSBtYXgobWF4RmxvYXRMb2dpY2FsQm90dG9tLCBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyh0b1Jl
bmRlckJsb2NrKGNoaWxkKSwgIWNoaWxkTmVlZGVkTGF5b3V0KSk7CisgICAgICAgIG1heEZsb2F0
TG9naWNhbEJvdHRvbSA9IG1heChtYXhGbG9hdExvZ2ljYWxCb3R0b20sIGFkZE92ZXJoYW5naW5n
RmxvYXRzKHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKSwgIWNoaWxkTmVlZGVkTGF5b3V0KSk7CiAK
ICAgICBpZiAoY2hpbGRPZmZzZXQud2lkdGgoKSB8fCBjaGlsZE9mZnNldC5oZWlnaHQoKSkgewog
ICAgICAgICB2aWV3KCkuYWRkTGF5b3V0RGVsdGEoY2hpbGRPZmZzZXQpOwpAQCAtODQ2LDcgKzg0
OSw3IEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93Ojpjb2xsYXBzZU1hcmdpbnMoUmVuZGVy
Qm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luCiAgICAgc2V0TG9naWNhbEhlaWdodChsb2dp
Y2FsVG9wKTsKICAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBjaGlsZC0+cHJldmlvdXNTaWJsaW5n
KCk7CiAgICAgaWYgKHByZXYgJiYgcHJldi0+aXNSZW5kZXJCbG9ja0Zsb3coKSAmJiAhcHJldi0+
aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIFJlbmRlckJsb2Nr
KiBibG9jayA9IHRvUmVuZGVyQmxvY2socHJldik7CisgICAgICAgIFJlbmRlckJsb2NrRmxvdyog
YmxvY2sgPSB0b1JlbmRlckJsb2NrRmxvdyhwcmV2KTsKICAgICAgICAgaWYgKGJsb2NrLT5jb250
YWluc0Zsb2F0cygpICYmICFibG9jay0+YXZvaWRzRmxvYXRzKCkgJiYgKGJsb2NrLT5sb2dpY2Fs
VG9wKCkgKyBibG9jay0+bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkpID4gbG9naWNhbFRvcCkg
CiAgICAgICAgICAgICBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyhibG9jaywgZmFsc2UpOwogICAgIH0K
QEAgLTkxNSw4ICs5MTgsOCBAQCBMYXlvdXRVbml0IFJlbmRlckJsb2NrRmxvdzo6Y2xlYXJGbG9h
dHNJZk5lZWRlZChSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYQogICAgIExheW91dFVu
aXQgbG9naWNhbFRvcCA9IHlQb3MgKyBoZWlnaHRJbmNyZWFzZTsKICAgICAvLyBBZnRlciBtYXJn
aW4gY29sbGFwc2luZywgb25lIG9mIG91ciBmbG9hdHMgbWF5IG5vdyBpbnRydWRlIGludG8gdGhl
IGNoaWxkLiBJZiB0aGUgY2hpbGQgZG9lc24ndCBjb250YWluIGZsb2F0cyBvZiBpdHMgb3duIGl0
CiAgICAgLy8gd29uJ3QgZ2V0IHBpY2tlZCB1cCBmb3IgcmVsYXlvdXQgZXZlbiB0aG91Z2ggdGhl
IGxvZ2ljYWwgdG9wIGVzdGltYXRlIHdhcyB3cm9uZyAtIHNvIGFkZCB0aGUgbmV3bHkgaW50cnVk
aW5nIGZsb2F0IG5vdy4KLSAgICBpZiAoY29udGFpbnNGbG9hdHMoKSAmJiBjaGlsZC0+aXNSZW5k
ZXJCbG9jaygpICYmICF0b1JlbmRlckJsb2NrKGNoaWxkKS0+Y29udGFpbnNGbG9hdHMoKSAmJiAh
Y2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpID4gbG9n
aWNhbFRvcCkKLSAgICAgICAgdG9SZW5kZXJCbG9jayhjaGlsZCktPmFkZEludHJ1ZGluZ0Zsb2F0
cyh0aGlzLCBsb2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQoKSwgbG9naWNhbFRvcCk7CisgICAg
aWYgKGNvbnRhaW5zRmxvYXRzKCkgJiYgY2hpbGQtPmlzUmVuZGVyQmxvY2tGbG93KCkgJiYgIXRv
UmVuZGVyQmxvY2tGbG93KGNoaWxkKS0+Y29udGFpbnNGbG9hdHMoKSAmJiAhY2hpbGQtPmF2b2lk
c0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpID4gbG9naWNhbFRvcCkKKyAg
ICAgICAgdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpLT5hZGRJbnRydWRpbmdGbG9hdHModGhpcywg
bG9naWNhbExlZnRPZmZzZXRGb3JDb250ZW50KCksIGxvZ2ljYWxUb3ApOwogCiAgICAgcmV0dXJu
IGxvZ2ljYWxUb3A7CiB9CkBAIC0xMjcwLDcgKzEyNzMsNyBAQCBMYXlvdXRVbml0IFJlbmRlckJs
b2NrRmxvdzo6YWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRpb24oTGF5b3V0VW5pdCBsb2dpY2Fs
VG9wQQogICAgICAgICAKICAgICAgICAgaWYgKGNoaWxkUmVuZGVyQmxvY2spIHsKICAgICAgICAg
ICAgIGlmICghY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGNoaWxkUmVuZGVyQmxvY2stPmNvbnRh
aW5zRmxvYXRzKCkpCi0gICAgICAgICAgICAgICAgY2hpbGRSZW5kZXJCbG9jay0+bWFya0FsbERl
c2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCgpOworICAgICAgICAgICAgICAgIHRvUmVuZGVy
QmxvY2tGbG93KGNoaWxkUmVuZGVyQmxvY2spLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRz
Rm9yTGF5b3V0KCk7CiAgICAgICAgICAgICBpZiAoIWNoaWxkLT5uZWVkc0xheW91dCgpKQogICAg
ICAgICAgICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVkZWQoKTsK
ICAgICAgICAgfQpAQCAtMTQ4NSw0ICsxNDg4LDg1NiBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6
bGF5b3V0TGluZUdyaWRCb3goKQogICAgIC8vIHRvIHRoaXMgZ3JpZC4KIH0KIAorYm9vbCBSZW5k
ZXJCbG9ja0Zsb3c6OmNvbnRhaW5zRmxvYXQoUmVuZGVyQm94KiByZW5kZXJlcikgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPnNldCgp
LmNvbnRhaW5zPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+KCpyZW5k
ZXJlcik7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpzdHlsZURpZENoYW5nZShTdHlsZURp
ZmZlcmVuY2UgZGlmZiwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKQoreworICAgIFJlbmRl
ckJsb2NrOjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHlsZSk7CisgICAgCisgICAgLy8gQWZ0
ZXIgb3VyIHN0eWxlIGNoYW5nZWQsIGlmIHdlIGxvc2Ugb3VyIGFiaWxpdHkgdG8gcHJvcGFnYXRl
IGZsb2F0cyBpbnRvIG5leHQgc2libGluZworICAgIC8vIGJsb2NrcywgdGhlbiB3ZSBuZWVkIHRv
IGZpbmQgdGhlIHRvcCBtb3N0IHBhcmVudCBjb250YWluaW5nIHRoYXQgb3ZlcmhhbmdpbmcgZmxv
YXQgYW5kCisgICAgLy8gdGhlbiBtYXJrIGl0cyBkZXNjZW5kYW50cyB3aXRoIGZsb2F0cyBmb3Ig
bGF5b3V0IGFuZCBjbGVhciBhbGwgZmxvYXRzIGZyb20gaXRzIG5leHQKKyAgICAvLyBzaWJsaW5n
IGJsb2NrcyB0aGF0IGV4aXN0IGluIG91ciBmbG9hdGluZyBvYmplY3RzIGxpc3QuIFNlZSBidWcg
NTYyOTkgYW5kIDYyODc1LgorICAgIGJvb2wgY2FuUHJvcGFnYXRlRmxvYXRJbnRvU2libGluZyA9
ICFpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2b2lkc0Zsb2F0cygpOwor
ICAgIGlmIChkaWZmID09IFN0eWxlRGlmZmVyZW5jZUxheW91dCAmJiBzX2NhblByb3BhZ2F0ZUZs
b2F0SW50b1NpYmxpbmcgJiYgIWNhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxpbmcgJiYgaGFzT3Zl
cmhhbmdpbmdGbG9hdHMoKSkgeworICAgICAgICBSZW5kZXJCbG9ja0Zsb3cqIHBhcmVudEJsb2Nr
ID0gdGhpczsKKyAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0
U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgICAgICBhdXRvIGVuZCA9IGZsb2F0
aW5nT2JqZWN0U2V0LmVuZCgpOworCisgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0g
cGFyZW50KCk7IGN1cnIgJiYgIWN1cnItPmlzUmVuZGVyVmlldygpOyBjdXJyID0gY3Vyci0+cGFy
ZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5pc1JlbmRlckJsb2NrRmxvdygpKSB7Cisg
ICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93KiBjdXJyQmxvY2sgPSB0b1JlbmRlckJsb2Nr
RmxvdyhjdXJyKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyQmxvY2stPmhhc092ZXJoYW5n
aW5nRmxvYXRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRp
bmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBSZW5kZXJCb3gmIHJlbmRlcmVyID0gKCppdCktPnJlbmRlcmVyKCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoY3VyckJsb2NrLT5oYXNPdmVyaGFuZ2luZ0Zsb2F0KCZyZW5k
ZXJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jayA9IGN1cnJC
bG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBhcmVudEJsb2NrLT5tYXJrQWxsRGVz
Y2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7CisgICAgICAgIHBhcmVudEJsb2NrLT5tYXJr
U2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KCk7CisgICAgfQorfQorCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6c3R5bGVXaWxsQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSBkaWZmLCBjb25zdCBSZW5k
ZXJTdHlsZSogbmV3U3R5bGUpCit7CisgICAgUmVuZGVyU3R5bGUqIG9sZFN0eWxlID0gc3R5bGUo
KTsKKyAgICBzX2NhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxpbmcgPSBvbGRTdHlsZSA/ICFpc0Zs
b2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2b2lkc0Zsb2F0cygpIDogZmFsc2U7
CisKKyAgICBpZiAob2xkU3R5bGUgJiYgcGFyZW50KCkgJiYgZGlmZiA9PSBTdHlsZURpZmZlcmVu
Y2VMYXlvdXQgJiYgb2xkU3R5bGUtPnBvc2l0aW9uKCkgIT0gbmV3U3R5bGUtPnBvc2l0aW9uKCkp
IHsKKyAgICAgICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgJiYgIWlzRmxvYXRpbmcoKSAmJiAhaXNP
dXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgbmV3U3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCkp
CisgICAgICAgICAgICBtYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Cisg
ICAgfQorCisgICAgUmVuZGVyQmxvY2s6OnN0eWxlV2lsbENoYW5nZShkaWZmLCBuZXdTdHlsZSk7
Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZWxldGVMaW5lQm94VHJlZSgpCit7CisgICAg
aWYgKGNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5jbGVhckxp
bmVCb3hUcmVlUG9pbnRlcnMoKTsKKyAgICBSZW5kZXJCbG9jazo6ZGVsZXRlTGluZUJveFRyZWUo
KTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6Om1vdmVBbGxDaGlsZHJlbkluY2x1ZGluZ0Zs
b2F0c1RvKFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBib29sIGZ1bGxSZW1vdmVJbnNlcnQpCit7Cisg
ICAgUmVuZGVyQmxvY2tGbG93KiB0b0Jsb2NrRmxvdyA9IHRvUmVuZGVyQmxvY2tGbG93KHRvQmxv
Y2spOworICAgIG1vdmVBbGxDaGlsZHJlblRvKHRvQmxvY2tGbG93LCBmdWxsUmVtb3ZlSW5zZXJ0
KTsKKworICAgIC8vIFdoZW4gYSBwb3J0aW9uIG9mIHRoZSByZW5kZXIgdHJlZSBpcyBiZWluZyBk
ZXRhY2hlZCwgYW5vbnltb3VzIGJsb2NrcworICAgIC8vIHdpbGwgYmUgY29tYmluZWQgYXMgdGhl
aXIgY2hpbGRyZW4gYXJlIGRlbGV0ZWQuIEluIHRoaXMgcHJvY2VzcywgdGhlCisgICAgLy8gYW5v
bnltb3VzIGJsb2NrIGxhdGVyIGluIHRoZSB0cmVlIGlzIG1lcmdlZCBpbnRvIHRoZSBvbmUgcHJl
Y2VlZGluZyBpdC4KKyAgICAvLyBJdCBjYW4gaGFwcGVuIHRoYXQgdGhlIGxhdGVyIGJsb2NrICh0
aGlzKSBjb250YWlucyBmbG9hdHMgdGhhdCB0aGUKKyAgICAvLyBwcmV2aW91cyBibG9jayAodG9C
bG9ja0Zsb3cpIGRpZCBub3QgY29udGFpbiwgYW5kIHRodXMgYXJlIG5vdCBpbiB0aGUKKyAgICAv
LyBmbG9hdGluZyBvYmplY3RzIGxpc3QgZm9yIHRvQmxvY2tGbG93LiBUaGlzIGNhbiByZXN1bHQg
aW4gdG9CbG9ja0Zsb3cKKyAgICAvLyBjb250YWluaW5nIGZsb2F0cyB0aGF0IGFyZSBub3QgaW4g
aXQncyBmbG9hdGluZyBvYmplY3RzIGxpc3QsIGJ1dCBhcmUgaW4KKyAgICAvLyB0aGUgZmxvYXRp
bmcgb2JqZWN0cyBsaXN0cyBvZiBzaWJsaW5ncyBhbmQgcGFyZW50cy4gVGhpcyBjYW4gY2F1c2UK
KyAgICAvLyBwcm9ibGVtcyB3aGVuIHRoZSBmbG9hdCBpdHNlbGYgaXMgZGVsZXRlZCwgc2luY2Ug
dGhlIGRlbGV0aW9uIGNvZGUKKyAgICAvLyBhc3N1bWVzIHRoYXQgaWYgYSBmbG9hdCBpcyBub3Qg
aW4gaXQncyBjb250YWluaW5nIGJsb2NrJ3MgZmxvYXRpbmcKKyAgICAvLyBvYmplY3RzIGxpc3Qs
IGl0IGlzbid0IGluIGFueSBmbG9hdGluZyBvYmplY3RzIGxpc3QuIEluIG9yZGVyIHRvCisgICAg
Ly8gcHJlc2VydmUgdGhpcyBjb25kaXRpb24gKHJlbW92aW5nIGl0IGhhcyBzZXJpb3VzIHBlcmZv
cm1hbmNlCisgICAgLy8gaW1wbGljYXRpb25zKSwgd2UgbmVlZCB0byBjb3B5IHRoZSBmbG9hdGlu
ZyBvYmplY3RzIGZyb20gdGhlIG9sZCBibG9jaworICAgIC8vICh0aGlzKSB0byB0aGUgbmV3IGJs
b2NrICh0b0Jsb2NrRmxvdykuIFRoZSBmbG9hdCdzIG1ldHJpY3Mgd2lsbCBsaWtlbHkKKyAgICAv
LyBhbGwgYmUgd3JvbmcsIGJ1dCBzaW5jZSB0b0Jsb2NrRmxvdyBpcyBhbHJlYWR5IG1hcmtlZCBm
b3IgbGF5b3V0LCB0aGlzCisgICAgLy8gd2lsbCBnZXQgZml4ZWQgYmVmb3JlIGFueXRoaW5nIGdl
dHMgZGlzcGxheWVkLgorICAgIC8vIFNlZSBidWcgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTExNTU2NgorICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cykgeworICAgICAg
ICBpZiAoIXRvQmxvY2tGbG93LT5tX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgICAgIHRvQmxv
Y2tGbG93LT5jcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKKworICAgICAgICBjb25zdCBGbG9hdGlu
Z09iamVjdFNldCYgZnJvbUZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNl
dCgpOworICAgICAgICBhdXRvIGVuZCA9IGZyb21GbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKwor
ICAgICAgICBmb3IgKGF1dG8gaXQgPSBmcm9tRmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmpl
Y3QgPSBpdC0+Z2V0KCk7CisKKyAgICAgICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgb2JqZWN0
IGFnYWluIGlmIGl0J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAorICAgICAgICAgICAgaWYgKHRvQmxv
Y2tGbG93LT5jb250YWluc0Zsb2F0KCZmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKSkpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHRvQmxvY2tGbG93LT5tX2Zsb2F0
aW5nT2JqZWN0cy0+YWRkKGZsb2F0aW5nT2JqZWN0LT51bnNhZmVDbG9uZSgpKTsKKyAgICAgICAg
fQorICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJmbG93RnJvbUZsb2F0
cygpCit7CisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGlu
Z09iamVjdHMtPnNldCgpOworICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7
CisgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KSB7CisgICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOworICAgICAg
ICBpZiAoci0+aXNEZXNjZW5kYW50KCkpCisgICAgICAgICAgICBhZGRPdmVyZmxvd0Zyb21DaGls
ZCgmci0+cmVuZGVyZXIoKSwgSW50U2l6ZSh4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdp
bihyKSwgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4ocikpKTsKKyAgICB9Cit9CisK
K3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlT3ZlcmZsb3coTGF5b3V0VW5pdCBvbGRDbGll
bnRBZnRlckVkZ2UsIGJvb2wgcmVjb21wdXRlRmxvYXRzKQoreworICAgIFJlbmRlckJsb2NrOjpj
b21wdXRlT3ZlcmZsb3cob2xkQ2xpZW50QWZ0ZXJFZGdlLCByZWNvbXB1dGVGbG9hdHMpOworCisg
ICAgaWYgKCFoYXNDb2x1bW5zKCkgJiYgKHJlY29tcHV0ZUZsb2F0cyB8fCBpc1Jvb3QoKSB8fCBl
eHBhbmRzVG9FbmNsb3NlT3ZlcmhhbmdpbmdGbG9hdHMoKSB8fCBoYXNTZWxmUGFpbnRpbmdMYXll
cigpKSkKKyAgICAgICAgYWRkT3ZlcmZsb3dGcm9tRmxvYXRzKCk7Cit9CisKK3ZvaWQgUmVuZGVy
QmxvY2tGbG93OjpyZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoYm9vbCBwYWludEFsbERlc2NlbmRh
bnRzKQoreworICAgIC8vIFJlcGFpbnQgYW55IG92ZXJoYW5naW5nIGZsb2F0cyAoaWYgd2Uga25v
dyB3ZSdyZSB0aGUgb25lIHRvIHBhaW50IHRoZW0pLgorICAgIC8vIE90aGVyd2lzZSwgYmFpbCBv
dXQuCisgICAgaWYgKCFoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBGSVhNRTogQXZvaWQgZGlzYWJsaW5nIExheW91dFN0YXRlLiBBdCB0aGUgdmVyeSBs
ZWFzdCwgZG9uJ3QgZGlzYWJsZSBpdCBmb3IgZmxvYXRzIG9yaWdpbmF0aW5nCisgICAgLy8gaW4g
dGhpcyBibG9jay4gQmV0dGVyIHlldCB3b3VsZCBiZSB0byBwdXNoIGV4dHJhIHN0YXRlIGZvciB0
aGUgY29udGFpbmVycyBvZiBvdGhlciBmbG9hdHMuCisgICAgTGF5b3V0U3RhdGVEaXNhYmxlciBs
YXlvdXRTdGF0ZURpc2FibGVyKCZ2aWV3KCkpOworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0
JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBhdXRv
IGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIGZvciAoYXV0byBpdCA9IGZsb2F0
aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBGbG9hdGlu
Z09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7CisgICAgICAgIC8vIE9ubHkgcmVw
YWludCB0aGUgb2JqZWN0IGlmIGl0IGlzIG92ZXJoYW5naW5nLCBpcyBub3QgaW4gaXRzIG93biBs
YXllciwgYW5kCisgICAgICAgIC8vIGlzIG91ciByZXNwb25zaWJpbGl0eSB0byBwYWludCAobV9z
aG91bGRQYWludCBpcyBzZXQpLiBXaGVuIHBhaW50QWxsRGVzY2VuZGFudHMgaXMgdHJ1ZSwgdGhl
IGxhdHRlcgorICAgICAgICAvLyBjb25kaXRpb24gaXMgcmVwbGFjZWQgd2l0aCBiZWluZyBhIGRl
c2NlbmRhbnQgb2YgdXMuCisgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRv
bShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSA+IGxvZ2ljYWxIZWlnaHQoKQorICAgICAgICAg
ICAgJiYgIWZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhhc1NlbGZQYWludGluZ0xheWVyKCkK
KyAgICAgICAgICAgICYmIChmbG9hdGluZ09iamVjdC0+c2hvdWxkUGFpbnQoKSB8fCAocGFpbnRB
bGxEZXNjZW5kYW50cyAmJiBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5pc0Rlc2NlbmRhbnRP
Zih0aGlzKSkpKSB7CisgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5yZXBh
aW50KCk7CisgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5yZXBhaW50T3Zl
cmhhbmdpbmdGbG9hdHMoZmFsc2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6cGFpbnRGbG9hdHMoUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExheW91
dFBvaW50JiBwYWludE9mZnNldCwgYm9vbCBwcmVzZXJ2ZVBoYXNlKQoreworICAgIGlmICghbV9m
bG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEZsb2F0aW5nT2Jq
ZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAg
ICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIGZvciAoYXV0byBpdCA9
IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBG
bG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKKyAgICAgICAgLy8gT25seSBwYWludCB0aGUg
b2JqZWN0IGlmIG91ciBtX3Nob3VsZFBhaW50IGZsYWcgaXMgc2V0LgorICAgICAgICBpZiAoci0+
c2hvdWxkUGFpbnQoKSAmJiAhci0+cmVuZGVyZXIoKS5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSB7
CisgICAgICAgICAgICBQYWludEluZm8gY3VycmVudFBhaW50SW5mbyhwYWludEluZm8pOworICAg
ICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IHByZXNlcnZlUGhhc2UgPyBwYWludElu
Zm8ucGhhc2UgOiBQYWludFBoYXNlQmxvY2tCYWNrZ3JvdW5kOworICAgICAgICAgICAgLy8gRklY
TUU6IExheW91dFBvaW50IHZlcnNpb24gb2YgeFBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJn
aW4gd291bGQgbWFrZSB0aGlzIG11Y2ggY2xlYW5lci4KKyAgICAgICAgICAgIExheW91dFBvaW50
IGNoaWxkUG9pbnQgPSBmbGlwRmxvYXRGb3JXcml0aW5nTW9kZUZvckNoaWxkKHIsIExheW91dFBv
aW50KHBhaW50T2Zmc2V0LngoKSArIHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIp
IC0gci0+cmVuZGVyZXIoKS54KCksIHBhaW50T2Zmc2V0LnkoKSArIHlQb3NpdGlvbkZvckZsb2F0
SW5jbHVkaW5nTWFyZ2luKHIpIC0gci0+cmVuZGVyZXIoKS55KCkpKTsKKyAgICAgICAgICAgIHIt
PnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5mbywgY2hpbGRQb2ludCk7CisgICAgICAg
ICAgICBpZiAoIXByZXNlcnZlUGhhc2UpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFpbnRJ
bmZvLnBoYXNlID0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5kczsKKyAgICAgICAgICAg
ICAgICByLT5yZW5kZXJlcigpLnBhaW50KGN1cnJlbnRQYWludEluZm8sIGNoaWxkUG9pbnQpOwor
ICAgICAgICAgICAgICAgIGN1cnJlbnRQYWludEluZm8ucGhhc2UgPSBQYWludFBoYXNlRmxvYXQ7
CisgICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBj
aGlsZFBvaW50KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFpbnRJbmZvLnBoYXNlID0gUGFp
bnRQaGFzZUZvcmVncm91bmQ7CisgICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5wYWludChj
dXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFp
bnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZU91dGxpbmU7CisgICAgICAgICAgICAgICAgci0+cmVu
ZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2xpcE91
dEZsb2F0aW5nT2JqZWN0cyhSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBjb25zdCBQYWludEluZm8q
IHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRpb24s
IGNvbnN0IExheW91dFNpemUmIG9mZnNldEZyb21Sb290QmxvY2spCit7CisgICAgaWYgKG1fZmxv
YXRpbmdPYmplY3RzKSB7CisgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGlu
Z09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgYXV0byBlbmQg
PSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRp
bmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBGbG9h
dGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7CisgICAgICAgICAgICBMYXlv
dXRSZWN0IGZsb2F0Qm94KG9mZnNldEZyb21Sb290QmxvY2sud2lkdGgoKSArIHhQb3NpdGlvbkZv
ckZsb2F0SW5jbHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSwKKyAgICAgICAgICAgICAgICBv
ZmZzZXRGcm9tUm9vdEJsb2NrLmhlaWdodCgpICsgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdN
YXJnaW4oZmxvYXRpbmdPYmplY3QpLAorICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqZWN0LT5y
ZW5kZXJlcigpLndpZHRoKCksIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhlaWdodCgpKTsK
KyAgICAgICAgICAgIHJvb3RCbG9jay0+ZmxpcEZvcldyaXRpbmdNb2RlKGZsb2F0Qm94KTsKKyAg
ICAgICAgICAgIGZsb2F0Qm94Lm1vdmUocm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbi54KCksIHJv
b3RCbG9ja1BoeXNpY2FsUG9zaXRpb24ueSgpKTsKKyAgICAgICAgICAgIHBhaW50SW5mby0+Y29u
dGV4dC0+Y2xpcE91dChwaXhlbFNuYXBwZWRJbnRSZWN0KGZsb2F0Qm94KSk7CisgICAgICAgIH0K
KyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVGbG9hdGluZ09iamVjdHMo
KQoreworICAgIG1fZmxvYXRpbmdPYmplY3RzID0gYWRvcHRQdHIobmV3IEZsb2F0aW5nT2JqZWN0
cyh0aGlzLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxv
Y2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHMoKQoreworICAgIGlmICghbV9mbG9hdGluZ09i
amVjdHMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZmxvYXRpbmdPYmplY3RzLT5jbGVhcigp
OworfQorCitGbG9hdGluZ09iamVjdCogUmVuZGVyQmxvY2tGbG93OjppbnNlcnRGbG9hdGluZ09i
amVjdChSZW5kZXJCb3gqIGZsb2F0Qm94KQoreworICAgIEFTU0VSVChmbG9hdEJveC0+aXNGbG9h
dGluZygpKTsKKworICAgIC8vIENyZWF0ZSB0aGUgbGlzdCBvZiBzcGVjaWFsIG9iamVjdHMgaWYg
d2UgZG9uJ3QgYWxlYWR5IGhhdmUgb25lCisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAg
ICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIERv
bid0IGluc2VydCB0aGUgZmxvYXRpbmdPYmplY3QgYWdhaW4gaWYgaXQncyBhbHJlYWR5IGluIHRo
ZSBsaXN0CisgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNl
dCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgYXV0byBpdCA9IGZsb2F0aW5n
T2JqZWN0U2V0LmZpbmQ8UmVuZGVyQm94JiwgRmxvYXRpbmdPYmplY3RIYXNoVHJhbnNsYXRvcj4o
KmZsb2F0Qm94KTsKKyAgICAgICAgaWYgKGl0ICE9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpKQor
ICAgICAgICAgICAgcmV0dXJuIGl0LT5nZXQoKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhl
IHNwZWNpYWwgZmxvYXRpbmdPYmplY3QgZW50cnkgJiBhcHBlbmQgaXQgdG8gdGhlIGxpc3QKKwor
ICAgIHN0ZDo6dW5pcXVlX3B0cjxGbG9hdGluZ09iamVjdD4gZmxvYXRpbmdPYmplY3QgPSBGbG9h
dGluZ09iamVjdDo6Y3JlYXRlKCpmbG9hdEJveCk7CisgICAgCisgICAgLy8gT3VyIGxvY2F0aW9u
IGlzIGlycmVsZXZhbnQgaWYgd2UncmUgdW5zcGxpdHRhYmxlIG9yIG5vIHBhZ2luYXRpb24gaXMg
aW4gZWZmZWN0LgorICAgIC8vIEp1c3QgZ28gYWhlYWQgYW5kIGxheSBvdXQgdGhlIGZsb2F0Lgor
ICAgIGJvb2wgaXNDaGlsZFJlbmRlckJsb2NrID0gZmxvYXRCb3gtPmlzUmVuZGVyQmxvY2soKTsK
KyAgICBpZiAoaXNDaGlsZFJlbmRlckJsb2NrICYmICFmbG9hdEJveC0+bmVlZHNMYXlvdXQoKSAm
JiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+cGFnZUxvZ2ljYWxIZWlnaHRDaGFuZ2VkKCkpCisgICAg
ICAgIGZsb2F0Qm94LT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CisgICAgICAg
ICAgICAKKyAgICBib29sIG5lZWRzQmxvY2tEaXJlY3Rpb25Mb2NhdGlvblNldEJlZm9yZUxheW91
dCA9IGlzQ2hpbGRSZW5kZXJCbG9jayAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bmVlZHNCbG9j
a0RpcmVjdGlvbkxvY2F0aW9uU2V0QmVmb3JlTGF5b3V0KCk7CisgICAgaWYgKCFuZWVkc0Jsb2Nr
RGlyZWN0aW9uTG9jYXRpb25TZXRCZWZvcmVMYXlvdXQgfHwgaXNXcml0aW5nTW9kZVJvb3QoKSkg
Ly8gV2UgYXJlIHVuc3BsaXR0YWJsZSBpZiB3ZSdyZSBhIGJsb2NrIGZsb3cgcm9vdC4KKyAgICAg
ICAgZmxvYXRCb3gtPmxheW91dElmTmVlZGVkKCk7CisgICAgZWxzZSB7CisgICAgICAgIGZsb2F0
Qm94LT51cGRhdGVMb2dpY2FsV2lkdGgoKTsKKyAgICAgICAgZmxvYXRCb3gtPmNvbXB1dGVBbmRT
ZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7CisgICAgfQorCisgICAgZmxvYXRpbmdPYmpl
Y3QtPnNldExvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGhGb3JDaGlsZChmbG9hdEJveCkgKyBtYXJn
aW5TdGFydEZvckNoaWxkKGZsb2F0Qm94KSArIG1hcmdpbkVuZEZvckNoaWxkKGZsb2F0Qm94KSwg
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKKyAg
ICBpZiAoU2hhcGVPdXRzaWRlSW5mbyogc2hhcGVPdXRzaWRlID0gZmxvYXRCb3gtPnNoYXBlT3V0
c2lkZUluZm8oKSkKKyAgICAgICAgc2hhcGVPdXRzaWRlLT5zZXRTaGFwZVNpemUobG9naWNhbFdp
ZHRoRm9yQ2hpbGQoZmxvYXRCb3gpLCBsb2dpY2FsSGVpZ2h0Rm9yQ2hpbGQoZmxvYXRCb3gpKTsK
KyNlbmRpZgorCisgICAgcmV0dXJuIG1fZmxvYXRpbmdPYmplY3RzLT5hZGQoc3RkOjptb3ZlKGZs
b2F0aW5nT2JqZWN0KSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZW1vdmVGbG9hdGlu
Z09iamVjdChSZW5kZXJCb3gqIGZsb2F0Qm94KQoreworICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0
cykgeworICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQg
PSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgICAgIGF1dG8gaXQgPSBmbG9hdGluZ09i
amVjdFNldC5maW5kPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+KCpm
bG9hdEJveCk7CisgICAgICAgIGlmIChpdCAhPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKSkgewor
ICAgICAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOwor
ICAgICAgICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgICAgICAgICBMYXlv
dXRVbml0IGxvZ2ljYWxUb3AgPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbFRvcChpc0hvcml6b250
YWxXcml0aW5nTW9kZSgpKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0
b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpKTsKKworICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTU0OTk1LgorICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsQm90
dG9tIDwgMCB8fCBsb2dpY2FsQm90dG9tIDwgbG9naWNhbFRvcCB8fCBsb2dpY2FsVG9wID09IExh
eW91dFVuaXQ6Om1heCgpKQorICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQm90dG9tID0gTGF5
b3V0VW5pdDo6bWF4KCk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAg
ICAgIC8vIFNwZWNpYWwtY2FzZSB6ZXJvLSBhbmQgbGVzcy10aGFuLXplcm8taGVpZ2h0IGZsb2F0
czogdGhvc2UgZG9uJ3QgdG91Y2gKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpbmUgdGhh
dCB0aGV5J3JlIG9uLCBidXQgaXQgc3RpbGwgbmVlZHMgdG8gYmUgZGlydGllZC4gVGhpcyBpcwor
ICAgICAgICAgICAgICAgICAgICAvLyBhY2NvbXBsaXNoZWQgYnkgcHJldGVuZGluZyB0aGV5IGhh
dmUgYSBoZWlnaHQgb2YgMS4KKyAgICAgICAgICAgICAgICAgICAgbG9naWNhbEJvdHRvbSA9IG1h
eChsb2dpY2FsQm90dG9tLCBsb2dpY2FsVG9wICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmTmVlZHNMYXlvdXQoKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUKCZmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCktPnJl
bmRlcmVyKCkgPT0gdGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVj
dC0+b3JpZ2luYXRpbmdMaW5lKCktPm1hcmtEaXJ0eSgpOworICAgICAgICAgICAgICAgICAgICB9
CisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVj
dC0+c2V0T3JpZ2luYXRpbmdMaW5lKDApOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKDAsIGxvZ2ljYWxCb3R0b20p
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPnJlbW92ZShm
bG9hdGluZ09iamVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tG
bG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0
LCBpbnQgbG9naWNhbE9mZnNldCkKK3sKKyAgICBpZiAoIWNvbnRhaW5zRmxvYXRzKCkpCisgICAg
ICAgIHJldHVybjsKKyAgICAKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdP
YmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgRmxvYXRpbmdPYmplY3Qq
IGN1cnIgPSBmbG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCk7CisgICAgd2hpbGUgKGN1cnIg
IT0gbGFzdEZsb2F0ICYmICghY3Vyci0+aXNQbGFjZWQoKSB8fCBjdXJyLT5sb2dpY2FsVG9wKGlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpID49IGxvZ2ljYWxPZmZzZXQpKSB7CisgICAgICAgIG1f
ZmxvYXRpbmdPYmplY3RzLT5yZW1vdmUoY3Vycik7CisgICAgICAgIGlmIChmbG9hdGluZ09iamVj
dFNldC5pc0VtcHR5KCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VyciA9IGZsb2F0
aW5nT2JqZWN0U2V0Lmxhc3QoKS5nZXQoKTsKKyAgICB9Cit9CisKK0xheW91dFBvaW50IFJlbmRl
ckJsb2NrRmxvdzo6Y29tcHV0ZUxvZ2ljYWxMb2NhdGlvbkZvckZsb2F0KGNvbnN0IEZsb2F0aW5n
T2JqZWN0KiBmbG9hdGluZ09iamVjdCwgTGF5b3V0VW5pdCBsb2dpY2FsVG9wT2Zmc2V0KSBjb25z
dAoreworICAgIFJlbmRlckJveCogY2hpbGRCb3ggPSAmZmxvYXRpbmdPYmplY3QtPnJlbmRlcmVy
KCk7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0
Rm9yQ29udGVudChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFydCBvZiBsZWZ0IG9m
ZnNldC4KKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodE9mZnNldDsgLy8gQ29uc3RhbnQgcGFy
dCBvZiByaWdodCBvZmZzZXQuCisjaWYgRU5BQkxFKENTU19TSEFQRVMpCisgICAgLy8gRklYTUUg
QnVnIDEwMjk0ODogVGhpcyBvbmx5IHdvcmtzIGZvciBzaGFwZSBvdXRzaWRlIGRpcmVjdGx5IHNl
dCBvbiB0aGlzIGJsb2NrLgorICAgIFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJbnNpZGVJbmZvID0g
dGhpcy0+bGF5b3V0U2hhcGVJbnNpZGVJbmZvKCk7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBi
ZWhhdmlvciBmb3IgcmlnaHQgZmxvYXRzLgorICAgIGlmIChzaGFwZUluc2lkZUluZm8pIHsKKyAg
ICAgICAgTGF5b3V0U2l6ZSBmbG9hdExvZ2ljYWxTaXplID0gTGF5b3V0U2l6ZShjaGlsZEJveC0+
bG9naWNhbFdpZHRoKCksIGNoaWxkQm94LT5sb2dpY2FsSGVpZ2h0KCkpOworICAgICAgICAvLyBG
SVhNRTogSWYgdGhlIGZsb2F0IGRvZXNuJ3QgZml0IGluIHRoZSBzaGFwZSB3ZSBzaG91bGQgcHVz
aCBpdCB1bmRlciB0aGUgY29udGVudCBib3gKKyAgICAgICAgbG9naWNhbFRvcE9mZnNldCA9IHNo
YXBlSW5zaWRlSW5mby0+Y29tcHV0ZUZpcnN0Rml0UG9zaXRpb25Gb3JGbG9hdChmbG9hdExvZ2lj
YWxTaXplKTsKKyAgICAgICAgaWYgKGxvZ2ljYWxIZWlnaHQoKSA+IGxvZ2ljYWxUb3BPZmZzZXQp
CisgICAgICAgICAgICBsb2dpY2FsVG9wT2Zmc2V0ID0gbG9naWNhbEhlaWdodCgpOworCisgICAg
ICAgIFNlZ21lbnRMaXN0IHNlZ21lbnRzID0gc2hhcGVJbnNpZGVJbmZvLT5jb21wdXRlU2VnbWVu
dHNGb3JMaW5lKGxvZ2ljYWxUb3BPZmZzZXQsIGNoaWxkQm94LT5sb2dpY2FsSGVpZ2h0KCkpOwor
ICAgICAgICAvLyBGSVhNRSBCdWcgMTAyOTQ5OiBBZGQgc3VwcG9ydCBmb3Igc2hhcGVzIHdpdGgg
bXVsdGlwbGUgc2VnbWVudHMuCisgICAgICAgIGlmIChzZWdtZW50cy5zaXplKCkgPT0gMSkgewor
ICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIGNv
bnRlbnQgYm94LgorICAgICAgICAgICAgbG9naWNhbFJpZ2h0T2Zmc2V0ID0gbG9naWNhbExlZnRP
ZmZzZXQgKyBzZWdtZW50c1swXS5sb2dpY2FsUmlnaHQ7CisgICAgICAgICAgICBsb2dpY2FsTGVm
dE9mZnNldCArPSBzZWdtZW50c1swXS5sb2dpY2FsTGVmdDsKKyAgICAgICAgfQorICAgIH0gZWxz
ZQorI2VuZGlmCisgICAgICAgIGxvZ2ljYWxSaWdodE9mZnNldCA9IGxvZ2ljYWxSaWdodE9mZnNl
dEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7CisKKyAgICBMYXlvdXRVbml0IGZsb2F0TG9n
aWNhbFdpZHRoID0gbWluKGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSksIGxvZ2ljYWxSaWdodE9mZnNldCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0KTsg
Ly8gVGhlIHdpZHRoIHdlIGxvb2sgZm9yLgorCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxM
ZWZ0OworCisgICAgYm9vbCBpbnNpZGVGbG93VGhyZWFkID0gZmxvd1RocmVhZENvbnRhaW5pbmdC
bG9jaygpOworCisgICAgaWYgKGNoaWxkQm94LT5zdHlsZSgpLT5mbG9hdGluZygpID09IExlZnRG
bG9hdCkgeworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmluZ0xlZnQgPSAxOworICAg
ICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmluZ1JpZ2h0ID0gMTsKKyAgICAgICAgZmxvYXRM
b2dpY2FsTGVmdCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRzaWRl
KGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFp
bmluZ0xlZnQpOworICAgICAgICB3aGlsZSAobG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZUlnbm9y
aW5nU2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxSaWdodE9mZnNldCwgZmFs
c2UsICZoZWlnaHRSZW1haW5pbmdSaWdodCkgLSBmbG9hdExvZ2ljYWxMZWZ0IDwgZmxvYXRMb2dp
Y2FsV2lkdGgpIHsKKyAgICAgICAgICAgIGxvZ2ljYWxUb3BPZmZzZXQgKz0gbWluKGhlaWdodFJl
bWFpbmluZ0xlZnQsIGhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKKyAgICAgICAgICAgIGZsb2F0TG9n
aWNhbExlZnQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmVJZ25vcmluZ1NoYXBlT3V0c2lkZShs
b2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9mZnNldCwgZmFsc2UsICZoZWlnaHRSZW1haW5p
bmdMZWZ0KTsKKyAgICAgICAgICAgIGlmIChpbnNpZGVGbG93VGhyZWFkKSB7CisgICAgICAgICAg
ICAgICAgLy8gSGF2ZSB0byByZS1ldmFsdWF0ZSBhbGwgb2Ygb3VyIG9mZnNldHMsIHNpbmNlIHRo
ZXkgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBsb2dpY2FsUmlnaHRPZmZzZXQg
PSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BPZmZzZXQpOyAvLyBDb25z
dGFudCBwYXJ0IG9mIHJpZ2h0IG9mZnNldC4KKyAgICAgICAgICAgICAgICBsb2dpY2FsTGVmdE9m
ZnNldCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8g
Q29uc3RhbnQgcGFydCBvZiBsZWZ0IG9mZnNldC4KKyAgICAgICAgICAgICAgICBmbG9hdExvZ2lj
YWxXaWR0aCA9IG1pbihmbG9hdGluZ09iamVjdC0+bG9naWNhbFdpZHRoKGlzSG9yaXpvbnRhbFdy
aXRpbmdNb2RlKCkpLCBsb2dpY2FsUmlnaHRPZmZzZXQgLSBsb2dpY2FsTGVmdE9mZnNldCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IG1heChs
b2dpY2FsTGVmdE9mZnNldCAtIGJvcmRlckFuZFBhZGRpbmdMb2dpY2FsTGVmdCgpLCBmbG9hdExv
Z2ljYWxMZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFp
bmluZ0xlZnQgPSAxOworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmluZ1JpZ2h0ID0g
MTsKKyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmVJ
Z25vcmluZ1NoYXBlT3V0c2lkZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsUmlnaHRPZmZzZXQs
IGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nUmlnaHQpOworICAgICAgICB3aGlsZSAoZmxvYXRMb2dp
Y2FsTGVmdCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRzaWRlKGxv
Z2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFpbmlu
Z0xlZnQpIDwgZmxvYXRMb2dpY2FsV2lkdGgpIHsKKyAgICAgICAgICAgIGxvZ2ljYWxUb3BPZmZz
ZXQgKz0gbWluKGhlaWdodFJlbWFpbmluZ0xlZnQsIGhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKKyAg
ICAgICAgICAgIGZsb2F0TG9naWNhbExlZnQgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lSWdu
b3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9mZnNldCwgbG9naWNhbFJpZ2h0T2Zmc2V0LCBm
YWxzZSwgJmhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKKyAgICAgICAgICAgIGlmIChpbnNpZGVGbG93
VGhyZWFkKSB7CisgICAgICAgICAgICAgICAgLy8gSGF2ZSB0byByZS1ldmFsdWF0ZSBhbGwgb2Yg
b3VyIG9mZnNldHMsIHNpbmNlIHRoZXkgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAg
ICBsb2dpY2FsUmlnaHRPZmZzZXQgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50KGxvZ2lj
YWxUb3BPZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9mZnNldC4KKyAgICAgICAg
ICAgICAgICBsb2dpY2FsTGVmdE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudChs
b2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFydCBvZiBsZWZ0IG9mZnNldC4KKyAgICAg
ICAgICAgICAgICBmbG9hdExvZ2ljYWxXaWR0aCA9IG1pbihmbG9hdGluZ09iamVjdC0+bG9naWNh
bFdpZHRoKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpLCBsb2dpY2FsUmlnaHRPZmZzZXQgLSBs
b2dpY2FsTGVmdE9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8g
VXNlIHRoZSBvcmlnaW5hbCB3aWR0aCBvZiB0aGUgZmxvYXQgaGVyZSwgc2luY2UgdGhlIGxvY2Fs
IHZhcmlhYmxlCisgICAgICAgIC8vIHxmbG9hdExvZ2ljYWxXaWR0aHwgd2FzIGNhcHBlZCB0byB0
aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGguIFNlZQorICAgICAgICAvLyBmYXN0L2Jsb2NrL2Zsb2F0
L2NsYW1wZWQtcmlnaHQtZmxvYXQuaHRtbC4KKyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCAtPSBm
bG9hdGluZ09iamVjdC0+bG9naWNhbFdpZHRoKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwor
ICAgIH0KKyAgICAKKyAgICByZXR1cm4gTGF5b3V0UG9pbnQoZmxvYXRMb2dpY2FsTGVmdCwgbG9n
aWNhbFRvcE9mZnNldCk7Cit9CisKK2Jvb2wgUmVuZGVyQmxvY2tGbG93Ojpwb3NpdGlvbk5ld0Zs
b2F0cygpCit7CisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0g
bV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgIGlmIChmbG9hdGluZ09iamVjdFNldC5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIGFsbCBmbG9hdHMgaGF2
ZSBhbHJlYWR5IGJlZW4gcG9zaXRpb25lZCwgdGhlbiB3ZSBoYXZlIG5vIHdvcmsgdG8gZG8uCisg
ICAgaWYgKGZsb2F0aW5nT2JqZWN0U2V0Lmxhc3QoKS0+aXNQbGFjZWQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gTW92ZSBiYWNrd2FyZHMgdGhyb3VnaCBvdXIgZmxvYXRpbmcg
b2JqZWN0IGxpc3QgdW50aWwgd2UgZmluZCBhIGZsb2F0IHRoYXQgaGFzCisgICAgLy8gYWxyZWFk
eSBiZWVuIHBvc2l0aW9uZWQuIFRoZW4gd2UnbGwgYmUgYWJsZSB0byBtb3ZlIGZvcndhcmQsIHBv
c2l0aW9uaW5nIGFsbCBvZgorICAgIC8vIHRoZSBuZXcgZmxvYXRzIHRoYXQgbmVlZCBpdC4KKyAg
ICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAgLS1pdDsgLy8gR28gdG8g
bGFzdCBpdGVtLgorICAgIGF1dG8gYmVnaW4gPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOwor
ICAgIEZsb2F0aW5nT2JqZWN0KiBsYXN0UGxhY2VkRmxvYXRpbmdPYmplY3QgPSAwOworICAgIHdo
aWxlIChpdCAhPSBiZWdpbikgeworICAgICAgICAtLWl0OworICAgICAgICBpZiAoKCppdCktPmlz
UGxhY2VkKCkpIHsKKyAgICAgICAgICAgIGxhc3RQbGFjZWRGbG9hdGluZ09iamVjdCA9IGl0LT5n
ZXQoKTsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IGxvZ2ljYWxIZWlnaHQoKTsKKyAg
ICAKKyAgICAvLyBUaGUgZmxvYXQgY2Fubm90IHN0YXJ0IGFib3ZlIHRoZSB0b3AgcG9zaXRpb24g
b2YgdGhlIGxhc3QgcG9zaXRpb25lZCBmbG9hdC4KKyAgICBpZiAobGFzdFBsYWNlZEZsb2F0aW5n
T2JqZWN0KQorICAgICAgICBsb2dpY2FsVG9wID0gbWF4KGxhc3RQbGFjZWRGbG9hdGluZ09iamVj
dC0+bG9naWNhbFRvcChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSwgbG9naWNhbFRvcCk7CisK
KyAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIC8vIE5vdyB3YWxr
IHRocm91Z2ggdGhlIHNldCBvZiB1bnBvc2l0aW9uZWQgZmxvYXRzIGFuZCBwbGFjZSB0aGVtLgor
ICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZs
b2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOworICAgICAgICAvLyBUaGUgY29udGFpbmluZyBibG9j
ayBpcyByZXNwb25zaWJsZSBmb3IgcG9zaXRpb25pbmcgZmxvYXRzLCBzbyBpZiB3ZSBoYXZlIGZs
b2F0cyBpbiBvdXIKKyAgICAgICAgLy8gbGlzdCB0aGF0IGNvbWUgZnJvbSBzb21ld2hlcmUgZWxz
ZSwgZG8gbm90IGF0dGVtcHQgdG8gcG9zaXRpb24gdGhlbS4KKyAgICAgICAgaWYgKGZsb2F0aW5n
T2JqZWN0LT5yZW5kZXJlcigpLmNvbnRhaW5pbmdCbG9jaygpICE9IHRoaXMpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICBSZW5kZXJCb3gqIGNoaWxkQm94ID0gJmZsb2F0aW5nT2Jq
ZWN0LT5yZW5kZXJlcigpOworCisgICAgICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2FsTGVmdE1h
cmdpbiA9IHN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG1hcmdpblN0YXJ0Rm9y
Q2hpbGQoY2hpbGRCb3gpIDogbWFyZ2luRW5kRm9yQ2hpbGQoY2hpbGRCb3gpOworCisgICAgICAg
IExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkQm94LT5mcmFtZVJlY3QoKTsKKworICAgICAgICBp
ZiAoY2hpbGRCb3gtPnN0eWxlKCktPmNsZWFyKCkgJiBDTEVGVCkKKyAgICAgICAgICAgIGxvZ2lj
YWxUb3AgPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0OjpGbG9h
dExlZnQpLCBsb2dpY2FsVG9wKTsKKyAgICAgICAgaWYgKGNoaWxkQm94LT5zdHlsZSgpLT5jbGVh
cigpICYgQ1JJR0hUKQorICAgICAgICAgICAgbG9naWNhbFRvcCA9IG1heChsb3dlc3RGbG9hdExv
Z2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpLCBsb2dpY2FsVG9wKTsKKwor
ICAgICAgICBMYXlvdXRQb2ludCBmbG9hdExvZ2ljYWxMb2NhdGlvbiA9IGNvbXB1dGVMb2dpY2Fs
TG9jYXRpb25Gb3JGbG9hdChmbG9hdGluZ09iamVjdCwgbG9naWNhbFRvcCk7CisKKyAgICAgICAg
ZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxMZWZ0KGZsb2F0TG9naWNhbExvY2F0aW9uLngoKSwg
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisKKyAgICAgICAgc2V0TG9naWNhbExlZnRGb3JD
aGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueCgpICsgY2hpbGRMb2dpY2FsTGVm
dE1hcmdpbik7CisgICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZEJveCwgZmxvYXRM
b2dpY2FsTG9jYXRpb24ueSgpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGRCb3gpKTsKKwor
ICAgICAgICBlc3RpbWF0ZVJlZ2lvblJhbmdlRm9yQm94Q2hpbGQoY2hpbGRCb3gpOworCisgICAg
ICAgIExheW91dFN0YXRlKiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgpOworICAg
ICAgICBib29sIGlzUGFnaW5hdGVkID0gbGF5b3V0U3RhdGUtPmlzUGFnaW5hdGVkKCk7CisgICAg
ICAgIGlmIChpc1BhZ2luYXRlZCAmJiAhY2hpbGRCb3gtPm5lZWRzTGF5b3V0KCkpCisgICAgICAg
ICAgICBjaGlsZEJveC0+bWFya0ZvclBhZ2luYXRpb25SZWxheW91dElmTmVlZGVkKCk7CisgICAg
ICAgIAorICAgICAgICBjaGlsZEJveC0+bGF5b3V0SWZOZWVkZWQoKTsKKworICAgICAgICBpZiAo
aXNQYWdpbmF0ZWQpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSB1bnNwbGl0dGFibGUgYW5k
IGRvbid0IGZpdCwgdGhlbiB3ZSBuZWVkIHRvIG1vdmUgZG93bi4KKyAgICAgICAgICAgIC8vIFdl
IGluY2x1ZGUgb3VyIG1hcmdpbnMgYXMgcGFydCBvZiB0aGUgdW5zcGxpdHRhYmxlIGFyZWEuCisg
ICAgICAgICAgICBMYXlvdXRVbml0IG5ld0xvZ2ljYWxUb3AgPSBhZGp1c3RGb3JVbnNwbGl0dGFi
bGVDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueSgpLCB0cnVlKTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYSBwYWdpbmF0aW9uIHN0cnV0
IHRoYXQgaXMgbWFraW5nIHVzIG1vdmUgZG93biBmdXJ0aGVyLgorICAgICAgICAgICAgLy8gTm90
ZSB0aGF0IGFuIHVuc3BsaXR0YWJsZSBjaGlsZCBjYW4ndCBhbHNvIGhhdmUgYSBwYWdpbmF0aW9u
IHN0cnV0LCBzbyB0aGlzIGlzCisgICAgICAgICAgICAvLyBleGNsdXNpdmUgd2l0aCB0aGUgY2Fz
ZSBhYm92ZS4KKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBjaGlsZEJsb2NrID0gY2hpbGRCb3gt
PmlzUmVuZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGRCb3gpIDogMDsKKyAgICAgICAg
ICAgIGlmIChjaGlsZEJsb2NrICYmIGNoaWxkQmxvY2stPnBhZ2luYXRpb25TdHJ1dCgpKSB7Cisg
ICAgICAgICAgICAgICAgbmV3TG9naWNhbFRvcCArPSBjaGlsZEJsb2NrLT5wYWdpbmF0aW9uU3Ry
dXQoKTsKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5zZXRQYWdpbmF0aW9uU3RydXQoMCk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChuZXdMb2dpY2Fs
VG9wICE9IGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSkgeworICAgICAgICAgICAgICAgIGZsb2F0
aW5nT2JqZWN0LT5zZXRQYWdpbmF0aW9uU3RydXQobmV3TG9naWNhbFRvcCAtIGZsb2F0TG9naWNh
bExvY2F0aW9uLnkoKSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdExvZ2ljYWxMb2NhdGlvbiA9
IGNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9hdChmbG9hdGluZ09iamVjdCwgbmV3TG9naWNh
bFRvcCk7CisgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxMZWZ0KGZs
b2F0TG9naWNhbExvY2F0aW9uLngoKSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisKKyAg
ICAgICAgICAgICAgICBzZXRMb2dpY2FsTGVmdEZvckNoaWxkKGNoaWxkQm94LCBmbG9hdExvZ2lj
YWxMb2NhdGlvbi54KCkgKyBjaGlsZExvZ2ljYWxMZWZ0TWFyZ2luKTsKKyAgICAgICAgICAgICAg
ICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9naWNhbExvY2F0aW9uLnko
KSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkQm94KSk7CisgICAgICAgIAorICAgICAgICAg
ICAgICAgIGlmIChjaGlsZEJsb2NrKQorICAgICAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5z
ZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CisgICAgICAgICAgICAgICAgY2hpbGRC
b3gtPmxheW91dElmTmVlZGVkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1
cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxkKGNoaWxkQm94KSkgeworICAgICAgICAgICAgICAg
IGNoaWxkQm94LT5zZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOworICAgICAgICAgICAgICAg
IGNoaWxkQm94LT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxUb3AoZmxvYXRMb2dpY2FsTG9jYXRp
b24ueSgpLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKKworICAgICAgICBmbG9hdGluZ09i
amVjdC0+c2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0Rm9yQ2hpbGQoY2hpbGRCb3gpICsg
bWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGRCb3gpICsgbWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGls
ZEJveCksIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOworCisgICAgICAgIG1fZmxvYXRpbmdP
YmplY3RzLT5hZGRQbGFjZWRPYmplY3QoZmxvYXRpbmdPYmplY3QpOworCisgICAgICAgIC8vIElm
IHRoZSBjaGlsZCBtb3ZlZCwgd2UgaGF2ZSB0byByZXBhaW50IGl0LgorICAgICAgICBpZiAoY2hp
bGRCb3gtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQorICAgICAgICAgICAgY2hpbGRC
b3gtPnJlcGFpbnREdXJpbmdMYXlvdXRJZk1vdmVkKG9sZFJlY3QpOworICAgIH0KKyAgICByZXR1
cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6Om5ld0xpbmUoRUNsZWFyIGNsZWFy
KQoreworICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgLy8gc2V0IHkgcG9zaXRpb24KKyAg
ICBMYXlvdXRVbml0IG5ld1kgPSAwOworICAgIHN3aXRjaCAoY2xlYXIpIHsKKyAgICBjYXNlIENM
RUZUOgorICAgICAgICBuZXdZID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2Jq
ZWN0OjpGbG9hdExlZnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENSSUdIVDoKKyAgICAg
ICAgbmV3WSA9IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRS
aWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0JPVEg6CisgICAgICAgIG5ld1kgPSBs
b3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsK
KyAgICB9CisgICAgaWYgKGhlaWdodCgpIDwgbmV3WSkKKyAgICAgICAgc2V0TG9naWNhbEhlaWdo
dChuZXdZKTsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxMZWZ0Rmxv
YXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9m
ZnNldCwgTGF5b3V0VW5pdCogaGVpZ2h0UmVtYWluaW5nLCBMYXlvdXRVbml0IGxvZ2ljYWxIZWln
aHQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSBvZmZzZXRNb2RlKSBjb25zdAoreworICAg
IGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiBtX2Zsb2F0aW5nT2JqZWN0cy0+aGFzTGVmdE9iamVj
dHMoKSkKKyAgICAgICAgcmV0dXJuIG1fZmxvYXRpbmdPYmplY3RzLT5sb2dpY2FsTGVmdE9mZnNl
dChmaXhlZE9mZnNldCwgbG9naWNhbFRvcCwgbG9naWNhbEhlaWdodCwgb2Zmc2V0TW9kZSwgaGVp
Z2h0UmVtYWluaW5nKTsKKworICAgIHJldHVybiBmaXhlZE9mZnNldDsKK30KKworTGF5b3V0VW5p
dCBSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9yTGluZShMYXlvdXRV
bml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQqIGhlaWdo
dFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBTaGFwZU91dHNpZGVGbG9hdE9m
ZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKK3sKKyAgICBpZiAobV9mbG9hdGluZ09iamVjdHMg
JiYgbV9mbG9hdGluZ09iamVjdHMtPmhhc1JpZ2h0T2JqZWN0cygpKQorICAgICAgICByZXR1cm4g
bV9mbG9hdGluZ09iamVjdHMtPmxvZ2ljYWxSaWdodE9mZnNldChmaXhlZE9mZnNldCwgbG9naWNh
bFRvcCwgbG9naWNhbEhlaWdodCwgb2Zmc2V0TW9kZSwgaGVpZ2h0UmVtYWluaW5nKTsKKworICAg
IHJldHVybiBmaXhlZE9mZnNldDsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6Om5l
eHRGbG9hdExvZ2ljYWxCb3R0b21CZWxvdyhMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBl
T3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSBvZmZzZXRNb2RlKSBjb25zdAoreworICAgIGlmICghbV9m
bG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybiBsb2dpY2FsSGVpZ2h0OworCisgICAgTGF5
b3V0VW5pdCBib3R0b20gPSBMYXlvdXRVbml0OjptYXgoKTsKKyAgICBjb25zdCBGbG9hdGluZ09i
amVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Cisg
ICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICBmb3IgKGF1dG8gaXQg
PSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAg
RmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOworICAgICAgICBMYXlv
dXRVbml0IGZsb2F0Qm90dG9tOworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorICAgICAgICBTaGFw
ZU91dHNpZGVJbmZvKiBzaGFwZU91dHNpZGUgPSBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5z
aGFwZU91dHNpZGVJbmZvKCk7CisgICAgICAgIGlmIChvZmZzZXRNb2RlID09IFNoYXBlT3V0c2lk
ZUZsb2F0U2hhcGVPZmZzZXQgJiYgc2hhcGVPdXRzaWRlKQorICAgICAgICAgICAgZmxvYXRCb3R0
b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbFRvcChpc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKCYoZmxvYXRpbmdPYmplY3QtPnJlbmRlcmVyKCkpKSAr
IHNoYXBlT3V0c2lkZS0+c2hhcGVMb2dpY2FsQm90dG9tKCk7CisgICAgICAgIGVsc2UKKyNlbmRp
ZgorICAgICAgICAgICAgZmxvYXRCb3R0b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRv
bShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKKyAgICAgICAgaWYgKGZsb2F0Qm90dG9tID4g
bG9naWNhbEhlaWdodCkKKyAgICAgICAgICAgIGJvdHRvbSA9IG1pbihmbG9hdEJvdHRvbSwgYm90
dG9tKTsKKyAgICB9CisKKyAgICByZXR1cm4gYm90dG9tID09IExheW91dFVuaXQ6Om1heCgpID8g
TGF5b3V0VW5pdCgpIDogYm90dG9tOworfQorCitMYXlvdXRVbml0IFJlbmRlckJsb2NrRmxvdzo6
bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0OjpUeXBlIGZsb2F0VHlwZSkg
Y29uc3QKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQorICAgICAgICByZXR1cm4gMDsK
KyAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0Qm90dG9tID0gMDsKKyAgICBjb25zdCBGbG9hdGlu
Z09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7
CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICBmb3IgKGF1dG8g
aXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAg
ICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOworICAgICAgICBp
ZiAoZmxvYXRpbmdPYmplY3QtPmlzUGxhY2VkKCkgJiYgZmxvYXRpbmdPYmplY3QtPnR5cGUoKSAm
IGZsb2F0VHlwZSkKKyAgICAgICAgICAgIGxvd2VzdEZsb2F0Qm90dG9tID0gbWF4KGxvd2VzdEZs
b2F0Qm90dG9tLCBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0
aW5nTW9kZSgpKSk7CisgICAgfQorICAgIHJldHVybiBsb3dlc3RGbG9hdEJvdHRvbTsKK30KKwor
TGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJoYW5naW5nRmxvYXRzKFJlbmRlckJs
b2NrRmxvdyogY2hpbGQsIGJvb2wgbWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0cykKK3sKKyAgICAv
LyBQcmV2ZW50IGZsb2F0cyBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZSBjYW52YXMgYnkgdGhlIHJv
b3QgZWxlbWVudCwgZS5nLiwgPGh0bWw+LgorICAgIGlmIChjaGlsZC0+aGFzT3ZlcmZsb3dDbGlw
KCkgfHwgIWNoaWxkLT5jb250YWluc0Zsb2F0cygpIHx8IGNoaWxkLT5pc1Jvb3QoKSB8fCBjaGls
ZC0+aGFzQ29sdW1ucygpIHx8IGNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxvZ2lj
YWxUb3AoKTsKKyAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbExlZnQgPSBjaGlsZC0+bG9naWNh
bExlZnQoKTsKKyAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSA9IDA7CisK
KyAgICAvLyBGbG9hdHMgdGhhdCB3aWxsIHJlbWFpbiB0aGUgY2hpbGQncyByZXNwb25zaWJpbGl0
eSB0byBwYWludCBzaG91bGQgZmFjdG9yIGludG8gaXRzCisgICAgLy8gb3ZlcmZsb3cuCisgICAg
YXV0byBjaGlsZEVuZCA9IGNoaWxkLT5tX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuZW5kKCk7Cisg
ICAgZm9yIChhdXRvIGNoaWxkSXQgPSBjaGlsZC0+bV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmJl
Z2luKCk7IGNoaWxkSXQgIT0gY2hpbGRFbmQ7ICsrY2hpbGRJdCkgeworICAgICAgICBGbG9hdGlu
Z09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBjaGlsZEl0LT5nZXQoKTsKKyAgICAgICAgTGF5b3V0
VW5pdCBsb2dpY2FsQm90dG9tRm9yRmxvYXQgPSBtaW4oZmxvYXRpbmdPYmplY3QtPmxvZ2ljYWxC
b3R0b20oaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSksIExheW91dFVuaXQ6Om1heCgpIC0gY2hp
bGRMb2dpY2FsVG9wKTsKKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0gY2hpbGRM
b2dpY2FsVG9wICsgbG9naWNhbEJvdHRvbUZvckZsb2F0OworICAgICAgICBsb3dlc3RGbG9hdExv
Z2ljYWxCb3R0b20gPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tLCBsb2dpY2FsQm90dG9t
KTsKKworICAgICAgICBpZiAobG9naWNhbEJvdHRvbSA+IGxvZ2ljYWxIZWlnaHQoKSkgeworICAg
ICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxpc3QsIHdlIGFkZCBpdCBu
b3cuCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zRmxvYXQoJmZsb2F0aW5nT2JqZWN0LT5yZW5k
ZXJlcigpKSkgeworICAgICAgICAgICAgICAgIExheW91dFNpemUgb2Zmc2V0ID0gaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSA/IExheW91dFNpemUoLWNoaWxkTG9naWNhbExlZnQsIC1jaGlsZExv
Z2ljYWxUb3ApIDogTGF5b3V0U2l6ZSgtY2hpbGRMb2dpY2FsVG9wLCAtY2hpbGRMb2dpY2FsTGVm
dCk7CisgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRQYWludCA9IGZhbHNlOworCisgICAgICAg
ICAgICAgICAgLy8gVGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxheWVyIGFsd2F5cyBwYWludHMgdGhl
IGZsb2F0IChzbyB0aGF0IHppbmRleCBhbmQgc3RhY2tpbmcKKyAgICAgICAgICAgICAgICAvLyBi
ZWhhdmVzIHByb3Blcmx5KS4gV2UgYWx3YXlzIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBkZXNpcmUg
dG8gcGFpbnQgdGhlIGZsb2F0IGFzCisgICAgICAgICAgICAgICAgLy8gZmFyIG91dCBhcyB3ZSBj
YW4sIHRvIHRoZSBvdXRlcm1vc3QgYmxvY2sgdGhhdCBvdmVybGFwcyB0aGUgZmxvYXQsIHN0b3Bw
aW5nIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoaXQgYSBzZWxmLXBhaW50aW5nIGxh
eWVyIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+cmVuZGVy
ZXIoKS5lbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9PSBlbmNsb3NpbmdGbG9hdFBhaW50
aW5nTGF5ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0U2hv
dWxkUGFpbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBzaG91bGRQYWludCA9IHRydWU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZSB0aGUgZmxv
YXRpbmcgb2JqZWN0IGxpc3QgbGF6aWx5LgorICAgICAgICAgICAgICAgIGlmICghbV9mbG9hdGlu
Z09iamVjdHMpCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZsb2F0aW5nT2JqZWN0cygpOwor
CisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmFkZChmbG9hdGluZ09iamVjdC0+
Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCwgc2hvdWxkUGFpbnQsIHRydWUpKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtYWtlQ2hpbGRQYWludE90
aGVyRmxvYXRzICYmICFmbG9hdGluZ09iamVjdC0+c2hvdWxkUGFpbnQoKSAmJiAhZmxvYXRpbmdP
YmplY3QtPnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKQorICAgICAgICAgICAgICAg
ICYmIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmlzRGVzY2VuZGFudE9mKGNoaWxkKSAmJiBm
bG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5lbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9
PSBjaGlsZC0+ZW5jbG9zaW5nRmxvYXRQYWludGluZ0xheWVyKCkpIHsKKyAgICAgICAgICAgICAg
ICAvLyBUaGUgZmxvYXQgaXMgbm90IG92ZXJoYW5naW5nIGZyb20gdGhpcyBibG9jaywgc28gaWYg
aXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBjaGlsZCwgdGhlIGNoaWxkIHNob3VsZAorICAgICAg
ICAgICAgICAgIC8vIHBhaW50IGl0ICh0aGUgb3RoZXIgY2FzZSBpcyB0aGF0IGl0IGlzIGludHJ1
ZGluZyBpbnRvIHRoZSBjaGlsZCksIHVubGVzcyBpdCBoYXMgaXRzIG93biBsYXllciBvciBlbmNs
b3NpbmcKKyAgICAgICAgICAgICAgICAvLyBsYXllci4KKyAgICAgICAgICAgICAgICAvLyBJZiBt
YWtlQ2hpbGRQYWludE90aGVyRmxvYXRzIGlzIGZhbHNlLCBpdCBtZWFucyB0aGF0IHRoZSBjaGls
ZCBtdXN0IGFscmVhZHkga25vdyBhYm91dCBhbGwgdGhlIGZsb2F0cworICAgICAgICAgICAgICAg
IC8vIGl0IHNob3VsZCBwYWludC4KKyAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0
U2hvdWxkUGFpbnQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIC8vIFNpbmNlIHRoZSBmbG9hdCBkb2Vzbid0IG92ZXJoYW5nLCBpdCBkaWRuJ3QgZ2V0IHB1
dCBpbnRvIG91ciBsaXN0LiBXZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBhZGQgaXRzIG92ZXJmbG93
IGluIHRvIHRoZQorICAgICAgICAgICAgLy8gY2hpbGQgbm93LgorICAgICAgICAgICAgaWYgKGZs
b2F0aW5nT2JqZWN0LT5pc0Rlc2NlbmRhbnQoKSkKKyAgICAgICAgICAgICAgICBjaGlsZC0+YWRk
T3ZlcmZsb3dGcm9tQ2hpbGQoJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLCBMYXlvdXRTaXpl
KHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSwgeVBvc2l0
aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4oZmxvYXRpbmdPYmplY3QpKSk7CisgICAgICAgIH0K
KyAgICB9CisgICAgcmV0dXJuIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbTsKK30KKworYm9vbCBS
ZW5kZXJCbG9ja0Zsb3c6Omhhc092ZXJoYW5naW5nRmxvYXQoUmVuZGVyQm94KiByZW5kZXJlcikK
K3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzIHx8IGhhc0NvbHVtbnMoKSB8fCAhcGFyZW50
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0
JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBhdXRv
IGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZmluZDxSZW5kZXJCb3gmLCBGbG9hdGluZ09iamVjdEhh
c2hUcmFuc2xhdG9yPigqcmVuZGVyZXIpOworICAgIGlmIChpdCA9PSBmbG9hdGluZ09iamVjdFNl
dC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuICgqaXQpLT5sb2dp
Y2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpID4gbG9naWNhbEhlaWdodCgpOwor
fQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YWRkSW50cnVkaW5nRmxvYXRzKFJlbmRlckJsb2Nr
RmxvdyogcHJldiwgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdE9mZnNldCwgTGF5b3V0VW5pdCBsb2dp
Y2FsVG9wT2Zmc2V0KQoreworICAgIEFTU0VSVCghYXZvaWRzRmxvYXRzKCkpOworCisgICAgLy8g
SWYgdGhlIHBhcmVudCBvciBwcmV2aW91cyBzaWJsaW5nIGRvZXNuJ3QgaGF2ZSBhbnkgZmxvYXRz
IHRvIGFkZCwgZG9uJ3QgYm90aGVyLgorICAgIGlmICghcHJldi0+bV9mbG9hdGluZ09iamVjdHMp
CisgICAgICAgIHJldHVybjsKKworICAgIGxvZ2ljYWxMZWZ0T2Zmc2V0ICs9IG1hcmdpbkxvZ2lj
YWxMZWZ0KCk7CisKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgcHJldlNldCA9IHByZXYt
Pm1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBhdXRvIHByZXZFbmQgPSBwcmV2U2V0LmVu
ZCgpOworICAgIGZvciAoYXV0byBwcmV2SXQgPSBwcmV2U2V0LmJlZ2luKCk7IHByZXZJdCAhPSBw
cmV2RW5kOyArK3ByZXZJdCkgeworICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmpl
Y3QgPSBwcmV2SXQtPmdldCgpOworICAgICAgICBpZiAoZmxvYXRpbmdPYmplY3QtPmxvZ2ljYWxC
b3R0b20oaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgPiBsb2dpY2FsVG9wT2Zmc2V0KSB7Cisg
ICAgICAgICAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzIHx8ICFtX2Zsb2F0aW5nT2JqZWN0cy0+
c2V0KCkuY29udGFpbnM8RmxvYXRpbmdPYmplY3QmLCBGbG9hdGluZ09iamVjdEhhc2hUcmFuc2xh
dG9yPigqZmxvYXRpbmdPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlIHRo
ZSBmbG9hdGluZyBvYmplY3QgbGlzdCBsYXppbHkuCisgICAgICAgICAgICAgICAgaWYgKCFtX2Zs
b2F0aW5nT2JqZWN0cykKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3Rz
KCk7CisKKyAgICAgICAgICAgICAgICAvLyBBcHBseWluZyB0aGUgY2hpbGQncyBtYXJnaW4gbWFr
ZXMgbm8gc2Vuc2UgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGNoaWxkIHdhcyBwYXNzZWQgaW4uCisg
ICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBtYXJnaW4gd2FzIGFkZGVkIGFscmVhZHkgdGhy
b3VnaCB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSB8bG9naWNhbExlZnRPZmZzZXR8IHZhcmlhYmxl
CisgICAgICAgICAgICAgICAgLy8gYWJvdmUuIHxsb2dpY2FsTGVmdE9mZnNldHwgd2lsbCBlcXVh
bCB0aGUgbWFyZ2luIGluIHRoaXMgY2FzZSwgc28gaXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KKyAg
ICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQuIE9ubHkgYXBwbHkgdGhpcyBjb2RlIGlmIHBy
ZXYgaXMgdGhlIHBhcmVudCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0IG1hcmdpbgorICAgICAg
ICAgICAgICAgIC8vIHdpbGwgZ2V0IGFwcGxpZWQgdHdpY2UuCisgICAgICAgICAgICAgICAgTGF5
b3V0U2l6ZSBvZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpCisgICAgICAgICAgICAg
ICAgICAgID8gTGF5b3V0U2l6ZShsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IHBhcmVudCgp
ID8gcHJldi0+bWFyZ2luTGVmdCgpIDogTGF5b3V0VW5pdCgpKSwgbG9naWNhbFRvcE9mZnNldCkK
KyAgICAgICAgICAgICAgICAgICAgOiBMYXlvdXRTaXplKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2lj
YWxMZWZ0T2Zmc2V0IC0gKHByZXYgIT0gcGFyZW50KCkgPyBwcmV2LT5tYXJnaW5Ub3AoKSA6IExh
eW91dFVuaXQoKSkpOworCisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmFkZChm
bG9hdGluZ09iamVjdC0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCkpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bWFya0FsbERl
c2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChSZW5kZXJCb3gqIGZsb2F0VG9SZW1vdmUsIGJv
b2wgaW5MYXlvdXQpCit7CisgICAgaWYgKCFldmVySGFkTGF5b3V0KCkgJiYgIWNvbnRhaW5zRmxv
YXRzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIE1hcmtpbmdCZWhhdmlvciBtYXJrUGFyZW50
cyA9IGluTGF5b3V0ID8gTWFya09ubHlUaGlzIDogTWFya0NvbnRhaW5pbmdCbG9ja0NoYWluOwor
ICAgIHNldENoaWxkTmVlZHNMYXlvdXQobWFya1BhcmVudHMpOworCisgICAgaWYgKGZsb2F0VG9S
ZW1vdmUpCisgICAgICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0VG9SZW1vdmUpOworCisg
ICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGlsZHJlbiBhbmQgbWFyayB0aGVtIGFzIG5lZWRlZC4K
KyAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgZm9yIChSZW5kZXJPYmplY3Qq
IGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmco
KSkgeworICAgICAgICAgICAgaWYgKCghZmxvYXRUb1JlbW92ZSAmJiBjaGlsZC0+aXNGbG9hdGlu
Z09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB8fCAhY2hpbGQtPmlzUmVuZGVyQmxvY2soKSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghY2hpbGQtPmlzUmVuZGVy
QmxvY2tGbG93KCkpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogY2hpbGRCbG9jayA9
IHRvUmVuZGVyQmxvY2soY2hpbGQpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrLT5z
aHJpbmtUb0F2b2lkRmxvYXRzKCkgJiYgY2hpbGRCbG9jay0+ZXZlckhhZExheW91dCgpKQorICAg
ICAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5zZXRDaGlsZE5lZWRzTGF5b3V0KG1hcmtQYXJl
bnRzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIFJlbmRlckJsb2NrRmxvdyogY2hpbGRCbG9jayA9IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxk
KTsKKyAgICAgICAgICAgIGlmICgoZmxvYXRUb1JlbW92ZSA/IGNoaWxkQmxvY2stPmNvbnRhaW5z
RmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWluc0Zsb2F0cygpKSB8fCBj
aGlsZEJsb2NrLT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkpCisgICAgICAgICAgICAgICAgY2hpbGRC
bG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChmbG9hdFRvUmVtb3Zl
LCBpbkxheW91dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93
OjptYXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KFJlbmRlckJveCogZmxvYXRUb1JlbW92
ZSkKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5n
T2JqZWN0cy0+c2V0KCk7CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsK
KworICAgIGZvciAoUmVuZGVyT2JqZWN0KiBuZXh0ID0gbmV4dFNpYmxpbmcoKTsgbmV4dDsgbmV4
dCA9IG5leHQtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKCFuZXh0LT5pc1JlbmRlckJs
b2NrRmxvdygpIHx8IG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCB0
b1JlbmRlckJsb2NrKG5leHQpLT5hdm9pZHNGbG9hdHMoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIFJlbmRlckJsb2NrRmxvdyogbmV4dEJsb2NrID0gdG9SZW5kZXJCbG9ja0Zs
b3cobmV4dCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2lu
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgUmVuZGVyQm94KiBmbG9hdGluZ0Jv
eCA9ICYoKml0KS0+cmVuZGVyZXIoKTsKKyAgICAgICAgICAgIGlmIChmbG9hdFRvUmVtb3ZlICYm
IGZsb2F0aW5nQm94ICE9IGZsb2F0VG9SZW1vdmUpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICBpZiAobmV4dEJsb2NrLT5jb250YWluc0Zsb2F0KGZsb2F0aW5nQm94KSkK
KyAgICAgICAgICAgICAgICBuZXh0QmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhGbG9hdHNG
b3JMYXlvdXQoZmxvYXRpbmdCb3gpOworICAgICAgICB9CisgICAgfQorfQorCitMYXlvdXRVbml0
IFJlbmRlckJsb2NrRmxvdzo6Z2V0Q2xlYXJEZWx0YShSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRV
bml0IGxvZ2ljYWxUb3ApCit7CisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjb21wdXRlIGNs
ZWFyYW5jZSBpZiB3ZSBoYXZlIG5vIGZsb2F0cy4KKyAgICBpZiAoIWNvbnRhaW5zRmxvYXRzKCkp
CisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIEF0IGxlYXN0IG9uZSBmbG9hdCBpcyBw
cmVzZW50LiBXZSBuZWVkIHRvIHBlcmZvcm0gdGhlIGNsZWFyYW5jZSBjb21wdXRhdGlvbi4KKyAg
ICBib29sIGNsZWFyU2V0ID0gY2hpbGQtPnN0eWxlKCktPmNsZWFyKCkgIT0gQ05PTkU7CisgICAg
TGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0gMDsKKyAgICBzd2l0Y2ggKGNoaWxkLT5zdHlsZSgp
LT5jbGVhcigpKSB7CisgICAgY2FzZSBDTk9ORToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBD
TEVGVDoKKyAgICAgICAgbG9naWNhbEJvdHRvbSA9IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShG
bG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUklH
SFQ6CisgICAgICAgIGxvZ2ljYWxCb3R0b20gPSBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oRmxv
YXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENCT1RI
OgorICAgICAgICBsb2dpY2FsQm90dG9tID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFdlIGFsc28gY2xlYXIgZmxvYXRzIGlmIHdl
IGFyZSB0b28gYmlnIHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFzIGEgZmxvYXQgKGFuZCB3aXNo
IHRvIGF2b2lkIGZsb2F0cyBieSBkZWZhdWx0KS4KKyAgICBMYXlvdXRVbml0IHJlc3VsdCA9IGNs
ZWFyU2V0ID8gbWF4PExheW91dFVuaXQ+KDAsIGxvZ2ljYWxCb3R0b20gLSBsb2dpY2FsVG9wKSA6
IExheW91dFVuaXQoKTsKKyAgICBpZiAoIXJlc3VsdCAmJiBjaGlsZC0+YXZvaWRzRmxvYXRzKCkp
IHsKKyAgICAgICAgTGF5b3V0VW5pdCBuZXdMb2dpY2FsVG9wID0gbG9naWNhbFRvcDsKKyAgICAg
ICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIExheW91dFVuaXQgYXZhaWxhYmxlTG9naWNh
bFdpZHRoQXROZXdMb2dpY2FsVG9wT2Zmc2V0ID0gYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGlu
ZShuZXdMb2dpY2FsVG9wLCBmYWxzZSwgbG9naWNhbEhlaWdodEZvckNoaWxkKGNoaWxkKSk7Cisg
ICAgICAgICAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoQXROZXdMb2dpY2FsVG9wT2Zmc2V0
ID09IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNvbnRlbnQobmV3TG9naWNhbFRvcCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIG5ld0xvZ2ljYWxUb3AgLSBsb2dpY2FsVG9wOworCisgICAgICAg
ICAgICBSZW5kZXJSZWdpb24qIHJlZ2lvbiA9IHJlZ2lvbkF0QmxvY2tPZmZzZXQobG9naWNhbFRv
cEZvckNoaWxkKGNoaWxkKSk7CisgICAgICAgICAgICBMYXlvdXRSZWN0IGJvcmRlckJveCA9IGNo
aWxkLT5ib3JkZXJCb3hSZWN0SW5SZWdpb24ocmVnaW9uLCBEb05vdENhY2hlUmVuZGVyQm94UmVn
aW9uSW5mbyk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbFdpZHRoQXRPbGRM
b2dpY2FsVG9wT2Zmc2V0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IGJvcmRlckJveC53
aWR0aCgpIDogYm9yZGVyQm94LmhlaWdodCgpOworCisgICAgICAgICAgICAvLyBGSVhNRTogTm9u
ZSBvZiB0aGlzIGlzIHJpZ2h0IGZvciBwZXJwZW5kaWN1bGFyIHdyaXRpbmctbW9kZSBjaGlsZHJl
bi4KKyAgICAgICAgICAgIExheW91dFVuaXQgY2hpbGRPbGRMb2dpY2FsV2lkdGggPSBjaGlsZC0+
bG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkT2xkTWFyZ2luTGVm
dCA9IGNoaWxkLT5tYXJnaW5MZWZ0KCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkT2xk
TWFyZ2luUmlnaHQgPSBjaGlsZC0+bWFyZ2luUmlnaHQoKTsKKyAgICAgICAgICAgIExheW91dFVu
aXQgY2hpbGRPbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxvZ2ljYWxUb3AoKTsKKworICAgICAgICAg
ICAgY2hpbGQtPnNldExvZ2ljYWxUb3AobmV3TG9naWNhbFRvcCk7CisgICAgICAgICAgICBjaGls
ZC0+dXBkYXRlTG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICByZWdpb24gPSByZWdpb25BdEJs
b2NrT2Zmc2V0KGxvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCkpOworICAgICAgICAgICAgYm9yZGVy
Qm94ID0gY2hpbGQtPmJvcmRlckJveFJlY3RJblJlZ2lvbihyZWdpb24sIERvTm90Q2FjaGVSZW5k
ZXJCb3hSZWdpb25JbmZvKTsKKyAgICAgICAgICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2FsV2lk
dGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpID8gYm9y
ZGVyQm94LndpZHRoKCkgOiBib3JkZXJCb3guaGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGNoaWxk
LT5zZXRMb2dpY2FsVG9wKGNoaWxkT2xkTG9naWNhbFRvcCk7CisgICAgICAgICAgICBjaGlsZC0+
c2V0TG9naWNhbFdpZHRoKGNoaWxkT2xkTG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIGNoaWxk
LT5zZXRNYXJnaW5MZWZ0KGNoaWxkT2xkTWFyZ2luTGVmdCk7CisgICAgICAgICAgICBjaGlsZC0+
c2V0TWFyZ2luUmlnaHQoY2hpbGRPbGRNYXJnaW5SaWdodCk7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGlmIChjaGlsZExvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRvcE9mZnNldCA8PSBhdmFp
bGFibGVMb2dpY2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQpIHsKKyAgICAgICAgICAgICAg
ICAvLyBFdmVuIHRob3VnaCB3ZSBtYXkgbm90IGJlIG1vdmluZywgaWYgdGhlIGxvZ2ljYWwgd2lk
dGggZGlkIHNocmluayBiZWNhdXNlIG9mIHRoZSBwcmVzZW5jZSBvZiBuZXcgZmxvYXRzLCB0aGVu
CisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmb3JjZSBhIHJlbGF5b3V0IGFzIHRob3Vn
aCB3ZSBzaGlmdGVkLiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBhZGRpdGlv
biBvZiBvdmVyaGFuZ2luZyBmbG9hdHMKKyAgICAgICAgICAgICAgICAvLyBmcm9tIHByZXZpb3Vz
IHNpYmxpbmdzIHdoZW4gbmVnYXRpdmUgbWFyZ2lucyBleGlzdCBvbiBhIGNoaWxkIChzZWUgdGhl
IGFkZE92ZXJoYW5naW5nRmxvYXRzIGNhbGwgYXQgdGhlIGVuZCBvZiBjb2xsYXBzZU1hcmdpbnMp
LgorICAgICAgICAgICAgICAgIGlmIChjaGlsZExvZ2ljYWxXaWR0aEF0T2xkTG9naWNhbFRvcE9m
ZnNldCAhPSBjaGlsZExvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRvcE9mZnNldCkKKyAgICAgICAg
ICAgICAgICAgICAgY2hpbGQtPnNldENoaWxkTmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gbmV3TG9naWNhbFRvcCAtIGxvZ2ljYWxUb3A7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIG5ld0xvZ2ljYWxUb3AgPSBuZXh0RmxvYXRMb2dpY2FsQm90
dG9tQmVsb3cobmV3TG9naWNhbFRvcCk7CisgICAgICAgICAgICBBU1NFUlQobmV3TG9naWNhbFRv
cCA+PSBsb2dpY2FsVG9wKTsKKyAgICAgICAgICAgIGlmIChuZXdMb2dpY2FsVG9wIDwgbG9naWNh
bFRvcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBSZW5k
ZXJCbG9ja0Zsb3c6OmhpdFRlc3RGbG9hdHMoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3Qs
IEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbklu
Q29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQpCit7CisgICAg
aWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTGF5
b3V0UG9pbnQgYWRqdXN0ZWRMb2NhdGlvbiA9IGFjY3VtdWxhdGVkT2Zmc2V0OworICAgIGlmIChp
c1JlbmRlclZpZXcoKSkKKyAgICAgICAgYWRqdXN0ZWRMb2NhdGlvbiArPSB0b0xheW91dFNpemUo
dG9SZW5kZXJWaWV3KCp0aGlzKS5mcmFtZVZpZXcoKS5zY3JvbGxQb3NpdGlvbigpKTsKKworICAg
IGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdP
YmplY3RzLT5zZXQoKTsKKyAgICBhdXRvIGJlZ2luID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4o
KTsKKyAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsgaXQgIT0gYmVn
aW47KSB7CisgICAgICAgIC0taXQ7CisgICAgICAgIEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09i
amVjdCA9IGl0LT5nZXQoKTsKKyAgICAgICAgaWYgKGZsb2F0aW5nT2JqZWN0LT5zaG91bGRQYWlu
dCgpICYmICFmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5oYXNTZWxmUGFpbnRpbmdMYXllcigp
KSB7CisgICAgICAgICAgICBMYXlvdXRVbml0IHhPZmZzZXQgPSB4UG9zaXRpb25Gb3JGbG9hdElu
Y2x1ZGluZ01hcmdpbihmbG9hdGluZ09iamVjdCkgLSBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIo
KS54KCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IHlPZmZzZXQgPSB5UG9zaXRpb25Gb3JGbG9h
dEluY2x1ZGluZ01hcmdpbihmbG9hdGluZ09iamVjdCkgLSBmbG9hdGluZ09iamVjdC0+cmVuZGVy
ZXIoKS55KCk7CisgICAgICAgICAgICBMYXlvdXRQb2ludCBjaGlsZFBvaW50ID0gZmxpcEZsb2F0
Rm9yV3JpdGluZ01vZGVGb3JDaGlsZChmbG9hdGluZ09iamVjdCwgYWRqdXN0ZWRMb2NhdGlvbiAr
IExheW91dFNpemUoeE9mZnNldCwgeU9mZnNldCkpOworICAgICAgICAgICAgaWYgKGZsb2F0aW5n
T2JqZWN0LT5yZW5kZXJlcigpLmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0LCBsb2NhdGlvbkluQ29u
dGFpbmVyLCBjaGlsZFBvaW50KSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUhpdFRlc3RSZXN1
bHQocmVzdWx0LCBsb2NhdGlvbkluQ29udGFpbmVyLnBvaW50KCkgLSB0b0xheW91dFNpemUoY2hp
bGRQb2ludCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6YWRqdXN0Rm9yQm9yZGVyRml0KExheW91dFVuaXQgeCwgTGF5b3V0VW5pdCYgbGVm
dCwgTGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0Cit7CisgICAgUmVuZGVyQmxvY2s6OmFkanVzdEZv
ckJvcmRlckZpdCh4LCBsZWZ0LCByaWdodCk7CisgICAgICAgIAorICAgIGlmIChzdHlsZSgpLT52
aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgeworICAgICAgICBpZiAobV9mbG9hdGluZ09iamVjdHMp
IHsKKyAgICAgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNl
dCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgICAgIGF1dG8gZW5kID0gZmxv
YXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGlu
Z09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBG
bG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IGV4
YW1pbmUgdGhlIG9iamVjdCBpZiBvdXIgbV9zaG91bGRQYWludCBmbGFnIGlzIHNldC4KKyAgICAg
ICAgICAgICAgICBpZiAoci0+c2hvdWxkUGFpbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBM
YXlvdXRVbml0IGZsb2F0TGVmdCA9IHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKHIp
IC0gci0+cmVuZGVyZXIoKS54KCk7CisgICAgICAgICAgICAgICAgICAgIExheW91dFVuaXQgZmxv
YXRSaWdodCA9IGZsb2F0TGVmdCArIHItPnJlbmRlcmVyKCkud2lkdGgoKTsKKyAgICAgICAgICAg
ICAgICAgICAgbGVmdCA9IG1pbihsZWZ0LCBmbG9hdExlZnQpOworICAgICAgICAgICAgICAgICAg
ICByaWdodCA9IG1heChyaWdodCwgZmxvYXRSaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKIH0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cu
aCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAppbmRleCAxMGNk
MDExMjQyNjM2YmFkYzg3NmJiYTg5NTNkNWU1YTc2ZjQxMzhhLi40MGFlMWIzOWI0NzEyNDdkMmZj
YTU1YmQ0ZTg4MzJiMzNhMmJlY2Y2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2tGbG93LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrRmxvdy5oCkBAIC0yNyw2ICsyNyw4IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAor
Y2xhc3MgTGluZUJyZWFrZXI7CisKIGNsYXNzIFJlbmRlckJsb2NrRmxvdyA6IHB1YmxpYyBSZW5k
ZXJCbG9jayB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgUmVuZGVyQmxvY2tGbG93KEVsZW1lbnQq
KTsKQEAgLTIzMiw2ICsyMzQsMTYgQEAgcHVibGljOgogICAgIH0KICAgICB2b2lkIGxheW91dExp
bmVHcmlkQm94KCk7CiAKKyAgICBib29sIGNvbnRhaW5zRmxvYXRzKCkgY29uc3QgT1ZFUlJJREUg
eyByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgIW1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5p
c0VtcHR5KCk7IH0KKyAgICBib29sIGNvbnRhaW5zRmxvYXQoUmVuZGVyQm94KikgY29uc3Q7CisK
KyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlTGluZUJveFRyZWUoKSBPVkVSUklERTsKKyAgICB2aXJ0
dWFsIHZvaWQgY29tcHV0ZU92ZXJmbG93KExheW91dFVuaXQgb2xkQ2xpZW50QWZ0ZXJFZGdlLCBi
b29sIHJlY29tcHV0ZUZsb2F0cyA9IGZhbHNlKSBPVkVSUklERTsKKworICAgIHZvaWQgcmVtb3Zl
RmxvYXRpbmdPYmplY3RzKCk7CisgICAgdm9pZCBtYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRz
Rm9yTGF5b3V0KFJlbmRlckJveCogZmxvYXRUb1JlbW92ZSA9IDAsIGJvb2wgaW5MYXlvdXQgPSB0
cnVlKTsKKyAgICB2b2lkIG1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlvdXQoUmVuZGVyQm94
KiBmbG9hdFRvUmVtb3ZlID0gMCk7CisKIHByb3RlY3RlZDoKICAgICBMYXlvdXRVbml0IG1heFBv
c2l0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURh
dGEtPm1fbWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIDogUmVuZGVyQmxvY2tGbG93UmFy
ZURhdGE6OnBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKTsgfQogICAgIExheW91dFVu
aXQgbWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX3JhcmVEYXRhID8g
bV9yYXJlRGF0YS0+bV9tYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkgOiBSZW5kZXJCbG9j
a0Zsb3dSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpOyB9CkBAIC0y
NjYsMTMgKzI3OCw5OCBAQCBwcm90ZWN0ZWQ6CiAgICAgTGF5b3V0VW5pdCBhcHBseUJlZm9yZUJy
ZWFrKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQgbG9naWNhbE9mZnNldCk7IC8vIElmIHRo
ZSBjaGlsZCBoYXMgYSBiZWZvcmUgYnJlYWssIHRoZW4gcmV0dXJuIGEgbmV3IHlQb3MgdGhhdCBz
aGlmdHMgdG8gdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlL2NvbHVtbi4KICAgICBMYXlvdXRVbml0
IGFwcGx5QWZ0ZXJCcmVhayhSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxPZmZz
ZXQsIE1hcmdpbkluZm8mKTsgLy8gSWYgdGhlIGNoaWxkIGhhcyBhbiBhZnRlciBicmVhaywgdGhl
biByZXR1cm4gYSBuZXcgb2Zmc2V0IHRoYXQgc2hpZnRzIHRvIHRoZSB0b3Agb2YgdGhlIG5leHQg
cGFnZS9jb2x1bW4uCiAgICAgTGF5b3V0VW5pdCBhZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlv
bihMYXlvdXRVbml0IGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBMYXlvdXRVbml0IGVzdGltYXRlV2l0
aG91dFBhZ2luYXRpb24sIFJlbmRlckJveCogY2hpbGQsIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9j
ayk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3R5bGVXaWxsQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSwg
Y29uc3QgUmVuZGVyU3R5bGUqIG5ld1N0eWxlKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQg
c3R5bGVEaWRDaGFuZ2UoU3R5bGVEaWZmZXJlbmNlLCBjb25zdCBSZW5kZXJTdHlsZSogb2xkU3R5
bGUpIE9WRVJSSURFOworCisgICAgdm9pZCBjcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKKworcHJp
dmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgbW92ZUFsbENoaWxkcmVuSW5jbHVkaW5nRmxvYXRzVG8o
UmVuZGVyQmxvY2sqIHRvQmxvY2ssIGJvb2wgZnVsbFJlbW92ZUluc2VydCkgT1ZFUlJJREU7Cisg
ICAgdmlydHVhbCB2b2lkIHJlcGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyhib29sIHBhaW50QWxsRGVz
Y2VuZGFudHMpIE9WRVJSSURFIEZJTkFMOworICAgIHZpcnR1YWwgdm9pZCBwYWludEZsb2F0cyhQ
YWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIGJvb2wgcHJlc2VydmVQaGFzZSA9IGZhbHNl
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xpcE91dEZsb2F0aW5nT2JqZWN0cyhSZW5k
ZXJCbG9jayosIGNvbnN0IFBhaW50SW5mbyosIGNvbnN0IExheW91dFBvaW50JiwgY29uc3QgTGF5
b3V0U2l6ZSYpIE9WRVJSSURFOworCisgICAgRmxvYXRpbmdPYmplY3QqIGluc2VydEZsb2F0aW5n
T2JqZWN0KFJlbmRlckJveCopOworICAgIHZvaWQgcmVtb3ZlRmxvYXRpbmdPYmplY3QoUmVuZGVy
Qm94Kik7CisgICAgdm9pZCByZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhGbG9hdGluZ09iamVj
dCosIGludCBsb2dpY2FsT2Zmc2V0KTsKKyAgICBMYXlvdXRQb2ludCBjb21wdXRlTG9naWNhbExv
Y2F0aW9uRm9yRmxvYXQoY29uc3QgRmxvYXRpbmdPYmplY3QqLCBMYXlvdXRVbml0IGxvZ2ljYWxU
b3BPZmZzZXQpIGNvbnN0OworCisgICAgLy8gQ2FsbGVkIGZyb20gbGluZVdpZHRoLCB0byBwb3Np
dGlvbiB0aGUgZmxvYXRzIGFkZGVkIGluIHRoZSBsYXN0IGxpbmUuCisgICAgLy8gUmV0dXJucyB0
cnVlIGlmIGFuZCBvbmx5IGlmIGl0IGhhcyBwb3NpdGlvbmVkIGFueSBmbG9hdHMuCisgICAgYm9v
bCBwb3NpdGlvbk5ld0Zsb2F0cygpOworCisgICAgdm9pZCBuZXdMaW5lKEVDbGVhcik7CisKKyAg
ICB2aXJ0dWFsIExheW91dFVuaXQgbG9naWNhbFJpZ2h0RmxvYXRPZmZzZXRGb3JMaW5lKExheW91
dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0VW5pdCogaGVp
Z2h0UmVtYWluaW5nLCBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0c2lkZUZsb2F0
T2Zmc2V0TW9kZSkgY29uc3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCBMYXlvdXRVbml0IGxvZ2lj
YWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5p
dCBmaXhlZE9mZnNldCwgTGF5b3V0VW5pdCogaGVpZ2h0UmVtYWluaW5nLCBMYXlvdXRVbml0IGxv
Z2ljYWxIZWlnaHQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSkgY29uc3QgT1ZFUlJJREU7
CisgICAgTGF5b3V0VW5pdCBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6
OlR5cGUgPSBGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0UmlnaHQpIGNvbnN0OyAKKyAgICBMYXlv
dXRVbml0IG5leHRGbG9hdExvZ2ljYWxCb3R0b21CZWxvdyhMYXlvdXRVbml0LCBTaGFwZU91dHNp
ZGVGbG9hdE9mZnNldE1vZGUgPSBTaGFwZU91dHNpZGVGbG9hdE1hcmdpbkJveE9mZnNldCkgY29u
c3Q7CisgICAgCisgICAgTGF5b3V0VW5pdCBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyhSZW5kZXJCbG9j
a0Zsb3cqIGNoaWxkLCBib29sIG1ha2VDaGlsZFBhaW50T3RoZXJGbG9hdHMpOworICAgIGJvb2wg
aGFzT3ZlcmhhbmdpbmdGbG9hdChSZW5kZXJCb3gqKTsKKyAgICB2b2lkIGFkZEludHJ1ZGluZ0Zs
b2F0cyhSZW5kZXJCbG9ja0Zsb3cqIHByZXYsIExheW91dFVuaXQgeG9mZnNldCwgTGF5b3V0VW5p
dCB5b2Zmc2V0KTsKKyAgICBib29sIGhhc092ZXJoYW5naW5nRmxvYXRzKCkgeyByZXR1cm4gcGFy
ZW50KCkgJiYgIWhhc0NvbHVtbnMoKSAmJiBjb250YWluc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0
TG9naWNhbEJvdHRvbSgpID4gbG9naWNhbEhlaWdodCgpOyB9CisgICAgTGF5b3V0VW5pdCBnZXRD
bGVhckRlbHRhKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQgeVBvcyk7CisKKyAgICB2aXJ0
dWFsIGJvb2wgaGl0VGVzdEZsb2F0cyhjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1
bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExh
eW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCkgT1ZFUlJJREU7CisgICAgdm9pZCBhZGRPdmVy
Zmxvd0Zyb21GbG9hdHMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Rm9yQm9yZGVyRml0KExh
eW91dFVuaXQgeCwgTGF5b3V0VW5pdCYgbGVmdCwgTGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0IE9W
RVJSSURFOworCisKKy8vIEZJWE1FLUJMT0NLRkxPVzogVGhlc2UgbWV0aG9kcyBoYXZlIGltcGxl
bWVudGF0aW9ucyBpbgorLy8gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LiBUaGV5IHNob3VsZCBiZSBt
b3ZlZCB0byB0aGUgcHJvcGVyIGhlYWRlciBvbmNlIHRoZQorLy8gbGluZSBsYXlvdXQgY29kZSBp
cyBzZXBhcmF0ZWQgZnJvbSBSZW5kZXJCbG9jayBhbmQgUmVuZGVyQmxvY2tGbG93LgorLy8gU1RB
UlQgTUVUSE9EUyBERUZJTkVEIElOIFJlbmRlckJsb2NrTGluZUxheW91dAorcHVibGljOgorICAg
IHN0YXRpYyB2b2lkIGFwcGVuZFJ1bnNGb3JPYmplY3QoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBp
bnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCosIElubGluZUJpZGlSZXNvbHZlciYpOwor
Citwcml2YXRlOgorICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmpl
Y3QqLCBjb25zdCBMaW5lSW5mbyYsIElubGluZUJveCogY2hpbGRCb3gsIGJvb2wgc3RhcnRzTmV3
U2VnbWVudCk7CisgICAgUm9vdElubGluZUJveCogY29uc3RydWN0TGluZShCaWRpUnVuTGlzdDxC
aWRpUnVuPiYsIGNvbnN0IExpbmVJbmZvJik7CisgICAgdm9pZCBzZXRNYXJnaW5zRm9yUnVieVJ1
bihCaWRpUnVuKiwgUmVuZGVyUnVieVJ1biosIFJlbmRlck9iamVjdCosIGNvbnN0IExpbmVJbmZv
Jik7CisgICAgdm9pZCBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290
SW5saW5lQm94KiwgY29uc3QgTGluZUluZm8mLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biog
dHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcCYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIFdvcmRNZWFzdXJlbWVudHMmKTsK
KyAgICBCaWRpUnVuKiBjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChS
b290SW5saW5lQm94KiwgY29uc3QgTGluZUluZm8mLCBFVGV4dEFsaWduLCBmbG9hdCYgbG9naWNh
bExlZnQsCisgICAgICAgIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIEJpZGlSdW4qIGZp
cnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIFdvcmRN
ZWFzdXJlbWVudHMmKTsKKyAgICB2b2lkIGNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0Zv
ckxpbmUoUm9vdElubGluZUJveCosIEJpZGlSdW4qLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tG
b250c01hcCYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYpOworICAgIEJpZGlSdW4qIGhhbmRsZVRy
YWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgQmlkaUNvbnRleHQqKTsKKyAgICB2
b2lkIGFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9hdGluZ09iamVjdCopOworICAg
IC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgbGF5b3V0SW5saW5lQ2hpbGRyZW4oKQorICAgIFJvb3RJ
bmxpbmVCb3gqIGNyZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyhCaWRpUnVuTGlzdDxCaWRpUnVu
PiYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExpbmVJbmZvJiwgVmVydGljYWxQb3NpdGlv
bkNhY2hlJiwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYpOwor
ICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmLCBib29sIGhhc0lu
bGluZUNoaWxkKTsKKyAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgcmVzdGFydExheW91dFJ1bnNB
bmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCwgTGF5b3V0VW5pdCBu
ZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xp
bmUsIElubGluZUJpZGlSZXNvbHZlciYsICBjb25zdCBJbmxpbmVJdGVyYXRvciYpOworICAgIHZv
aWQgbGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiwgSW5saW5lQmlk
aVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBC
aWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhl
bmF0ZWRMaW5lcyk7CisjaWYgRU5BQkxFKENTU19TSEFQRVMpCisgICAgdm9pZCB1cGRhdGVTaGFw
ZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmUoU2hhcGVJbnNpZGVJbmZvKiYsIGNvbnN0IExheW91
dFNpemUmLCBMaW5lTGF5b3V0U3RhdGUmKTsKKyAgICB2b2lkIHVwZGF0ZVNoYXBlQW5kU2VnbWVu
dHNGb3JDdXJyZW50TGluZUluRmxvd1RocmVhZChTaGFwZUluc2lkZUluZm8qJiwgTGluZUxheW91
dFN0YXRlJik7CisgICAgYm9vbCBhZGp1c3RMb2dpY2FsTGluZVRvcEFuZExvZ2ljYWxIZWlnaHRJ
Zk5lZWRlZChTaGFwZUluc2lkZUluZm8qLCBMYXlvdXRVbml0LCBMaW5lTGF5b3V0U3RhdGUmLCBJ
bmxpbmVCaWRpUmVzb2x2ZXImLCBGbG9hdGluZ09iamVjdCosIElubGluZUl0ZXJhdG9yJiwgV29y
ZE1lYXN1cmVtZW50cyYpOworI2VuZGlmCisgICAgdm9pZCBsaW5rVG9FbmRMaW5lSWZOZWVkZWQo
TGluZUxheW91dFN0YXRlJik7CisgICAgc3RhdGljIHZvaWQgcmVwYWludERpcnR5RmxvYXRzKFZl
Y3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzKTsKKyAgICB2b2lkIGNoZWNrRmxvYXRzSW5DbGVh
bkxpbmUoUm9vdElubGluZUJveCosIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYsIHNpemVfdCYgZmxv
YXRJbmRleCwgYm9vbCYgZW5jb3VudGVyZWROZXdGbG9hdCwgYm9vbCYgZGlydGllZEJ5RmxvYXQp
OworICAgIFJvb3RJbmxpbmVCb3gqIGRldGVybWluZVN0YXJ0UG9zaXRpb24oTGluZUxheW91dFN0
YXRlJiwgSW5saW5lQmlkaVJlc29sdmVyJik7CisgICAgdm9pZCBkZXRlcm1pbmVFbmRQb3NpdGlv
bihMaW5lTGF5b3V0U3RhdGUmLCBSb290SW5saW5lQm94KiBzdGFydEJveCwgSW5saW5lSXRlcmF0
b3ImIGNsZWFuTGluZVN0YXJ0LCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzKTsKKyAg
ICBib29sIGNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3RhdGUm
KTsKKyAgICBib29sIG1hdGNoZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYsIGNvbnN0IElubGlu
ZUJpZGlSZXNvbHZlciYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5lU3RhcnQsIGNvbnN0
IEJpZGlTdGF0dXMmIGVuZExpbmVTdGF0dXMpOworICAgIHZvaWQgZGVsZXRlRWxsaXBzaXNMaW5l
Qm94ZXMoKTsKKyAgICB2b2lkIGNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKTsKKyAgICAvLyBQ
b3NpdGlvbnMgbmV3IGZsb2F0cyBhbmQgYWxzbyBhZGp1c3QgYWxsIGZsb2F0cyBlbmNvdW50ZXJl
ZCBvbiB0aGUgbGluZSBpZiBhbnkgb2YgdGhlbQorICAgIC8vIGhhdmUgdG8gbW92ZSB0byB0aGUg
bmV4dCBwYWdlL2NvbHVtbi4KKyAgICBib29sIHBvc2l0aW9uTmV3RmxvYXRPbkxpbmUoRmxvYXRp
bmdPYmplY3QqIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSwgTGluZUluZm8mLCBMaW5lV2lkdGgmKTsKKworCisvLyBFTkQgTUVUSE9EUyBERUZJTkVE
IElOIFJlbmRlckJsb2NrTGluZUxheW91dAogICAgIAogcHVibGljOgogICAgIC8vIEZJWE1FLUJM
T0NLRkxPVzogVGhpcyBjYW4gYmUgbWFkZSBwcm90ZWN0ZWQgYWdhaW4gb25jZSBhbGwgY2FsbGVy
cyBoYXZlIGJlZW4gbW92ZWQgaGVyZS4KICAgICB2b2lkIGFkanVzdExpbmVQb3NpdGlvbkZvclBh
Z2luYXRpb24oUm9vdElubGluZUJveCosIExheW91dFVuaXQmIGRlbHRhT2Zmc2V0LCBSZW5kZXJG
bG93VGhyZWFkKik7IC8vIENvbXB1dGVzIGEgZGVsdGFPZmZzZXQgdmFsdWUgdGhhdCBwdXQgYSBs
aW5lIGF0IHRoZSB0b3Agb2YgdGhlIG5leHQgcGFnZSBpZiBpdCBkb2Vzbid0IGZpdCBvbiB0aGUg
Y3VycmVudCBwYWdlLgogCiBwcm90ZWN0ZWQ6CisgICAgT3duUHRyPEZsb2F0aW5nT2JqZWN0cz4g
bV9mbG9hdGluZ09iamVjdHM7CiAgICAgT3duUHRyPFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhPiBt
X3JhcmVEYXRhOworCisgICAgZnJpZW5kIGNsYXNzIExpbmVCcmVha2VyOworICAgIGZyaWVuZCBj
bGFzcyBMaW5lV2lkdGg7IC8vIE5lZWRzIHRvIGtub3cgRmxvYXRpbmdPYmplY3QKIH07CiAKIGlu
bGluZSBSZW5kZXJCbG9ja0Zsb3cmIHRvUmVuZGVyQmxvY2tGbG93KFJlbmRlck9iamVjdCYgb2Jq
ZWN0KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGlu
ZUxheW91dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5
b3V0LmNwcAppbmRleCA0ZWY3OWUxNTFlMzc2ZjIzMDc4MDYwMDdmMzI3OTFjYzUwYjRkYzZiLi4w
YjhmNjNhNGJmYmU5YmQ3Y2Y1ZTRmOWY3YmM4MWZjNGZkYmYzZmNkIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcApAQCAtMzIsNiAr
MzIsNyBAQAogI2luY2x1ZGUgIkxpbmVMYXlvdXRTdGF0ZS5oIgogI2luY2x1ZGUgIkxvZ2dpbmcu
aCIKICNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5o
IgogI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCiAjaW5jbHVkZSAiUmVuZGVyQ291bnRl
ci5oIgogI2luY2x1ZGUgIlJlbmRlckZsb3dUaHJlYWQuaCIKQEAgLTgyLDcgKzgzLDcgQEAgc3Ry
dWN0IFJlbmRlclRleHRJbmZvIHsKIAogY2xhc3MgTGluZUJyZWFrZXIgewogcHVibGljOgotICAg
IExpbmVCcmVha2VyKFJlbmRlckJsb2NrKiBibG9jaykKKyAgICBMaW5lQnJlYWtlcihSZW5kZXJC
bG9ja0Zsb3cqIGJsb2NrKQogICAgICAgICA6IG1fYmxvY2soYmxvY2spCiAgICAgewogICAgICAg
ICByZXNldCgpOwpAQCAtMTAwLDcgKzEwMSw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBza2lwVHJh
aWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgY29uc3QgTGluZUluZm8mKTsKICAgICB2
b2lkIHNraXBMZWFkaW5nV2hpdGVzcGFjZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYs
IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lV2lkdGgmKTsK
IAotICAgIFJlbmRlckJsb2NrKiBtX2Jsb2NrOworICAgIFJlbmRlckJsb2NrRmxvdyogbV9ibG9j
azsKICAgICBib29sIG1faHlwaGVuYXRlZDsKICAgICBFQ2xlYXIgbV9jbGVhcjsKICAgICBWZWN0
b3I8UmVuZGVyQm94Kj4gbV9wb3NpdGlvbmVkT2JqZWN0czsKQEAgLTI1Niw3ICsyNTcsNyBAQCBz
dGF0aWMgaW5saW5lIEJpZGlSdW4qIGNyZWF0ZVJ1bihpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRl
ck9iamVjdCogb2JqLCBJbmxpbmVCaQogICAgIHJldHVybiBuZXcgKG9iai0+cmVuZGVyQXJlbmEo
KSkgQmlkaVJ1bihzdGFydCwgZW5kLCBvYmosIHJlc29sdmVyLmNvbnRleHQoKSwgcmVzb2x2ZXIu
ZGlyKCkpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjphcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlS
dW5MaXN0PEJpZGlSdW4+JiBydW5zLCBpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCog
b2JqLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmFwcGVuZFJ1bnNGb3JPYmplY3QoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIHJ1bnMsIGludCBzdGFy
dCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiBvYmosIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2
ZXIpCiB7CiAgICAgaWYgKHN0YXJ0ID4gZW5kIHx8IHNob3VsZFNraXBDcmVhdGluZ1J1bnNGb3JP
YmplY3Qob2JqKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMzUwLDcgKzM1MSw3IEBAIHN0YXRpYyBi
b29sIHBhcmVudElzQ29uc3RydWN0ZWRPckhhdmVOZXh0KElubGluZUZsb3dCb3gqIHBhcmVudEJv
eCkKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUlubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrOjpj
cmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5m
bywgSW5saW5lQm94KiBjaGlsZEJveCwgYm9vbCBzdGFydE5ld1NlZ21lbnQpCitJbmxpbmVGbG93
Qm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqIG9iaiwg
Y29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBJbmxpbmVCb3gqIGNoaWxkQm94LCBib29sIHN0YXJ0
TmV3U2VnbWVudCkKIHsKICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbiB1bmNvbnN0cnVjdGVkIGxp
bmUgYm94IGZvciB0aGlzIG9iamVjdCB0aGF0IGlzIGFsc28KICAgICAvLyB0aGUgbGFzdCBpdGVt
IG9uIHRoZSBsaW5lLgpAQCAtNDQzLDcgKzQ0NCw3IEBAIHN0YXRpYyBib29sIHJlYWNoZWRFbmRP
ZlRleHRSZW5kZXJlcihjb25zdCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMpCiAgICAg
cmV0dXJuIGVuZHNXaXRoQVNDSUlTcGFjZXMocmVuZGVyVGV4dC0+Y2hhcmFjdGVyczE2KCksIHBv
cywgbGVuZ3RoKTsKIH0KIAotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNvbnN0cnVjdExp
bmUoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBMaW5lSW5mbyYgbGluZUlu
Zm8pCitSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNvbnN0cnVjdExpbmUoQmlkaVJ1
bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCiB7CiAg
ICAgQVNTRVJUKGJpZGlSdW5zLmZpcnN0UnVuKCkpOwogCkBAIC01ODMsNyArNTg0LDcgQEAgc3Rh
dGljIHZvaWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yQ2VudGVyQWxpZ25lZEJsb2NrKGJvb2wgaXNM
ZWZ0VG9SaWdodERpcmVjdGlvbiwKICAgICAgICAgbG9naWNhbExlZnQgKz0gdG90YWxMb2dpY2Fs
V2lkdGggPiBhdmFpbGFibGVMb2dpY2FsV2lkdGggPyAoYXZhaWxhYmxlTG9naWNhbFdpZHRoIC0g
dG90YWxMb2dpY2FsV2lkdGgpIDogKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNh
bFdpZHRoKSAvIDIgLSB0cmFpbGluZ1NwYWNlV2lkdGg7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6
OnNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qIHJ1biwgUmVuZGVyUnVieVJ1biogcmVuZGVy
ZXIsIFJlbmRlck9iamVjdCogcHJldmlvdXNPYmplY3QsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5m
bykKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpzZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiBy
dW4sIFJlbmRlclJ1YnlSdW4qIHJlbmRlcmVyLCBSZW5kZXJPYmplY3QqIHByZXZpb3VzT2JqZWN0
LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCiB7CiAgICAgaW50IHN0YXJ0T3Zlcmhhbmc7CiAg
ICAgaW50IGVuZE92ZXJoYW5nOwpAQCAtODA4LDcgKzgwOSw3IEBAIHN0YXRpYyBJbmRlbnRUZXh0
T3JOb3QgcmVxdWlyZXNJbmRlbnQoYm9vbCBpc0ZpcnN0TGluZSwgYm9vbCBpc0FmdGVySGFyZExp
bmVCcmVhCiAgICAgcmV0dXJuIHNob3VsZEluZGVudFRleHQ7CiB9CiAKLXN0YXRpYyB2b2lkIHVw
ZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlvbnMoUmVuZGVyQmxvY2sqIGJsb2NrLCBmbG9hdCYgbGlu
ZUxvZ2ljYWxMZWZ0LCBmbG9hdCYgbGluZUxvZ2ljYWxSaWdodCwgZmxvYXQmIGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCwgYm9vbCBmaXJzdExpbmUsIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRU
ZXh0LCBMYXlvdXRVbml0IGJveExvZ2ljYWxIZWlnaHQpCitzdGF0aWMgdm9pZCB1cGRhdGVMb2dp
Y2FsSW5saW5lUG9zaXRpb25zKFJlbmRlckJsb2NrRmxvdyogYmxvY2ssIGZsb2F0JiBsaW5lTG9n
aWNhbExlZnQsIGZsb2F0JiBsaW5lTG9naWNhbFJpZ2h0LCBmbG9hdCYgYXZhaWxhYmxlTG9naWNh
bFdpZHRoLCBib29sIGZpcnN0TGluZSwgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVudFRleHQs
IExheW91dFVuaXQgYm94TG9naWNhbEhlaWdodCkKIHsKICAgICBMYXlvdXRVbml0IGxpbmVMb2dp
Y2FsSGVpZ2h0ID0gYmxvY2stPm1pbkxpbmVIZWlnaHRGb3JSZXBsYWNlZFJlbmRlcmVyKGZpcnN0
TGluZSwgYm94TG9naWNhbEhlaWdodCk7CiAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gYmxvY2stPnBp
eGVsU25hcHBlZExvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZShibG9jay0+bG9naWNhbEhlaWdodCgp
LCBzaG91bGRJbmRlbnRUZXh0ID09IEluZGVudFRleHQsIGxpbmVMb2dpY2FsSGVpZ2h0KTsKQEAg
LTgxNiw3ICs4MTcsNyBAQCBzdGF0aWMgdm9pZCB1cGRhdGVMb2dpY2FsSW5saW5lUG9zaXRpb25z
KFJlbmRlckJsb2NrKiBibG9jaywgZmxvYXQmIGxpbmVMb2dpY2FsTAogICAgIGF2YWlsYWJsZUxv
Z2ljYWxXaWR0aCA9IGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQ7CiB9CiAKLXZv
aWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJv
b3RJbmxpbmVCb3gqIGxpbmVCb3gsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgQmlkaVJ1biog
Zmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCwKK3Zv
aWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGlu
ZShSb290SW5saW5lQm94KiBsaW5lQm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIEJpZGlS
dW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQs
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRp
Y2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVhc3VyZW1lbnRz
JiB3b3JkTWVhc3VyZW1lbnRzKQogewogICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gdGV4dEFs
aWdubWVudEZvckxpbmUoIXJlYWNoZWRFbmQgJiYgIWxpbmVCb3gtPmVuZHNXaXRoQnJlYWsoKSk7
CkBAIC04NzcsNyArODc4LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUlubGluZURpcmVj
dGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwKICAgICBsaW5lQm94
LT5wbGFjZUJveGVzSW5JbmxpbmVEaXJlY3Rpb24obGluZUxvZ2ljYWxMZWZ0LCBuZWVkc1dvcmRT
cGFjaW5nLCB0ZXh0Qm94RGF0YU1hcCk7CiB9CiAKLUJpZGlSdW4qIFJlbmRlckJsb2NrOjpjb21w
dXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiBsaW5l
Qm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIEVUZXh0QWxpZ24gdGV4dEFsaWduLCBmbG9h
dCYgbG9naWNhbExlZnQsIAorQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5l
RGlyZWN0aW9uUG9zaXRpb25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiBsaW5lQm94LCBjb25z
dCBMaW5lSW5mbyYgbGluZUluZm8sIEVUZXh0QWxpZ24gdGV4dEFsaWduLCBmbG9hdCYgbG9naWNh
bExlZnQsIAogICAgIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIEJpZGlSdW4qIGZpcnN0
UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tG
b250c01hcCYgdGV4dEJveERhdGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQ
b3NpdGlvbkNhY2hlLAogICAgIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCiB7
CkBAIC05NDgsNyArOTQ5LDcgQEAgQmlkaVJ1biogUmVuZGVyQmxvY2s6OmNvbXB1dGVJbmxpbmVE
aXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KFJvb3RJbmxpbmVCb3gqIGwKICAgICByZXR1cm4g
cjsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25z
Rm9yTGluZShSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBmaXJzdFJ1biwgR2x5cGhP
dmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLAordm9pZCBSZW5kZXJC
bG9ja0Zsb3c6OmNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGlu
ZUJveCogbGluZUJveCwgQmlkaVJ1biogZmlyc3RSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFj
a0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNh
bFBvc2l0aW9uQ2FjaGUpCiB7CiAgICAgc2V0TG9naWNhbEhlaWdodChsaW5lQm94LT5hbGlnbkJv
eGVzSW5CbG9ja0RpcmVjdGlvbihsb2dpY2FsSGVpZ2h0KCksIHRleHRCb3hEYXRhTWFwLCB2ZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUpKTsKQEAgLTk5MCw3ICs5OTEsNyBAQCBzdGF0aWMgaW5saW5lIGJv
b2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3RlciwgUmVuZGVyVGV4dCogcmVuZGVy
ZXIpCiB9CiAKIAotc3RhdGljIHZvaWQgc2V0U3RhdGljUG9zaXRpb25zKFJlbmRlckJsb2NrKiBi
bG9jaywgUmVuZGVyQm94KiBjaGlsZCkKK3N0YXRpYyB2b2lkIHNldFN0YXRpY1Bvc2l0aW9ucyhS
ZW5kZXJCbG9ja0Zsb3cqIGJsb2NrLCBSZW5kZXJCb3gqIGNoaWxkKQogewogICAgIC8vIEZJWE1F
OiBUaGUgbWF0aCBoZXJlIGlzIGFjdHVhbGx5IG5vdCByZWFsbHkgcmlnaHQuIEl0J3MgYSBiZXN0
LWd1ZXNzIGFwcHJveGltYXRpb24gdGhhdAogICAgIC8vIHdpbGwgd29yayBmb3IgdGhlIGNvbW1v
biBjYXNlcwpAQCAtMTAyMSw3ICsxMDIyLDcgQEAgc3RhdGljIGlubGluZSBpbnQgZmluZEZpcnN0
VHJhaWxpbmdTcGFjZShSZW5kZXJUZXh0KiBsYXN0VGV4dCwgY29uc3QgQ2hhcmFjdGVyVHkKICAg
ICByZXR1cm4gZmlyc3RTcGFjZTsKIH0KIAotaW5saW5lIEJpZGlSdW4qIFJlbmRlckJsb2NrOjpo
YW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIEJpZGlD
b250ZXh0KiBjdXJyZW50Q29udGV4dCkKK2lubGluZSBCaWRpUnVuKiBSZW5kZXJCbG9ja0Zsb3c6
OmhhbmRsZVRyYWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgQmlk
aUNvbnRleHQqIGN1cnJlbnRDb250ZXh0KQogewogICAgIGlmICghYmlkaVJ1bnMucnVuQ291bnQo
KQogICAgICAgICB8fCAhYmlkaVJ1bnMubG9naWNhbGx5TGFzdFJ1bigpLT5tX29iamVjdC0+c3R5
bGUoKS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkKQEAgLTEwNzIsNyArMTA3Myw3IEBAIGlu
bGluZSBCaWRpUnVuKiBSZW5kZXJCbG9jazo6aGFuZGxlVHJhaWxpbmdTcGFjZXMoQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4mIGJpZGlSdW5zCiAgICAgcmV0dXJuIHRyYWlsaW5nU3BhY2VSdW47CiB9CiAK
LXZvaWQgUmVuZGVyQmxvY2s6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0TGluZShGbG9hdGlu
Z09iamVjdCogZmxvYXRpbmdPYmplY3QpCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kRmxv
YXRpbmdPYmplY3RUb0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCkKIHsK
ICAgICBBU1NFUlQoIWZsb2F0aW5nT2JqZWN0LT5vcmlnaW5hdGluZ0xpbmUoKSk7CiAgICAgZmxv
YXRpbmdPYmplY3QtPnNldE9yaWdpbmF0aW5nTGluZShsYXN0Um9vdEJveCgpKTsKQEAgLTExNTUs
NyArMTE1Niw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3RCaWRpUnVuc0ZvclNlZ21l
bnQoSW5saW5lQmlkaVJlc29sdmVyJiB0b3BSZXNvbHZlciwKICAgICB9CiB9CiAKLXN0YXRpYyBp
bmxpbmUgdm9pZCBjb25zdHJ1Y3RCaWRpUnVuc0ZvckxpbmUoY29uc3QgUmVuZGVyQmxvY2sqIGJs
b2NrLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHRvcFJlc29sdmVyLCBCaWRpUnVuTGlzdDxCaWRpUnVu
PiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRPZkxpbmUsIFZpc3VhbERpcmVj
dGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSkKK3N0
YXRpYyBpbmxpbmUgdm9pZCBjb25zdHJ1Y3RCaWRpUnVuc0ZvckxpbmUoY29uc3QgUmVuZGVyQmxv
Y2tGbG93KiBibG9jaywgSW5saW5lQmlkaVJlc29sdmVyJiB0b3BSZXNvbHZlciwgQmlkaVJ1bkxp
c3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kT2ZMaW5lLCBW
aXN1YWxEaXJlY3Rpb25PdmVycmlkZSBvdmVycmlkZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNs
ZWFubHkpCiB7CiAjaWYgIUVOQUJMRShDU1NfU0hBUEVTKQogICAgIFVOVVNFRF9QQVJBTShibG9j
ayk7CkBAIC0xMTkyLDcgKzExOTMsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgY29uc3RydWN0Qmlk
aVJ1bnNGb3JMaW5lKGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaywgSW5saW5lQmlkaQogfQogCiAv
LyBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgbGluZSBib3hlcyBmb3IgYWxsIG9mIHRoZSB0ZXh0
IHJ1bnMgaW4gdGhlIHJlc29sdmVyIGFuZCBjb21wdXRlcyB0aGVpciBwb3NpdGlvbi4KLVJvb3RJ
bmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnMoQmlkaVJ1
bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBMaW5l
SW5mbyYgbGluZUluZm8sIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNh
Y2hlLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVh
c3VyZW1lbnRzKQorUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94
ZXNGcm9tQmlkaVJ1bnMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBJbmxp
bmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYgbGluZUluZm8sIFZlcnRpY2FsUG9zaXRpb25DYWNo
ZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3Jk
TWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewogICAgIGlmICghYmlkaVJ1bnMucnVu
Q291bnQoKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMjU3LDcgKzEyNTgsNyBAQCBzdGF0aWMg
dm9pZCBkZWxldGVMaW5lUmFuZ2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgUmVuZGVy
QXJlbmEmIGFyZW5hLCBSbwogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVu
c0FuZEZsb2F0cyhMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBib29sIGhhc0lubGluZUNo
aWxkKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dFJ1bnNBbmRGbG9hdHMoTGluZUxheW91
dFN0YXRlJiBsYXlvdXRTdGF0ZSwgYm9vbCBoYXNJbmxpbmVDaGlsZCkKIHsKICAgICAvLyBXZSB3
YW50IHRvIHNraXAgYWhlYWQgdG8gdGhlIGZpcnN0IGRpcnR5IGxpbmUKICAgICBJbmxpbmVCaWRp
UmVzb2x2ZXIgcmVzb2x2ZXI7CkBAIC0xMzMxLDcgKzEzMzIsNyBAQCBSZW5kZXJUZXh0SW5mbzo6
flJlbmRlclRleHRJbmZvKCkKIH0KIAogLy8gQmVmb3JlIHJlc3RhcnRpbmcgdGhlIGxheW91dCBs
b29wIHdpdGggYSBuZXcgbG9naWNhbEhlaWdodCwgcmVtb3ZlIGFsbCBmbG9hdHMgdGhhdCB3ZXJl
IGFkZGVkIGFuZCByZXNldCB0aGUgcmVzb2x2ZXIuCi1pbmxpbmUgY29uc3QgSW5saW5lSXRlcmF0
b3ImIFJlbmRlckJsb2NrOjpyZXN0YXJ0TGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGF5b3V0
VW5pdCBvbGRMb2dpY2FsSGVpZ2h0LCBMYXlvdXRVbml0IG5ld0xvZ2ljYWxIZWlnaHQsICBGbG9h
dGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBvbGRFbmQpCitpbmxpbmUgY29uc3Qg
SW5saW5lSXRlcmF0b3ImIFJlbmRlckJsb2NrRmxvdzo6cmVzdGFydExheW91dFJ1bnNBbmRGbG9h
dHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCwgTGF5b3V0VW5pdCBuZXdMb2dp
Y2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIElu
bGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsICBjb25zdCBJbmxpbmVJdGVyYXRvciYgb2xkRW5k
KQogewogICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0c0JlbG93KGxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIG9sZExvZ2ljYWxIZWlnaHQpOwogICAgIHNldExvZ2ljYWxIZWlnaHQobmV3TG9naWNh
bEhlaWdodCk7CkBAIC0xMzYyLDcgKzEzNjMsNyBAQCBzdGF0aWMgaW5saW5lIExheW91dFVuaXQg
YWRqdXN0TG9naWNhbExpbmVUb3AoU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluc2lkZUluZm8sCiAg
ICAgcmV0dXJuIHNoYXBlSW5zaWRlSW5mby0+c2hhcGVMb2dpY2FsQm90dG9tKCk7CiB9CiAKLXN0
YXRpYyBpbmxpbmUgdm9pZCBwdXNoU2hhcGVDb250ZW50T3ZlcmZsb3dCZWxvd1RoZUNvbnRlbnRC
b3goUmVuZGVyQmxvY2sqIGJsb2NrLCBTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbywg
TGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVIZWlnaHQpCitzdGF0aWMgaW5saW5l
IHZvaWQgcHVzaFNoYXBlQ29udGVudE92ZXJmbG93QmVsb3dUaGVDb250ZW50Qm94KFJlbmRlckJs
b2NrRmxvdyogYmxvY2ssIFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJbnNpZGVJbmZvLCBMYXlvdXRV
bml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUhlaWdodCkKIHsKICAgICBBU1NFUlQoc2hhcGVJ
bnNpZGVJbmZvKTsKIApAQCAtMTM4Myw3ICsxMzg0LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHB1
c2hTaGFwZUNvbnRlbnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJveChSZW5kZXJCbG9jayogYmxv
Y2sKICAgICBibG9jay0+c2V0TG9naWNhbEhlaWdodChuZXdMb2dpY2FsSGVpZ2h0KTsKIH0KIAot
dm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlU2hhcGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lKFNo
YXBlSW5zaWRlSW5mbyomIHNoYXBlSW5zaWRlSW5mbywgY29uc3QgTGF5b3V0U2l6ZSYgbG9naWNh
bE9mZnNldEZyb21TaGFwZUNvbnRhaW5lciwgTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkK
K3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExp
bmUoU2hhcGVJbnNpZGVJbmZvKiYgc2hhcGVJbnNpZGVJbmZvLCBjb25zdCBMYXlvdXRTaXplJiBs
b2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyLCBMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0
YXRlKQogewogICAgIGlmIChsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpCiAgICAgICAgIHJldHVy
biB1cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmVJbkZsb3dUaHJlYWQoc2hhcGVJ
bnNpZGVJbmZvLCBsYXlvdXRTdGF0ZSk7CkBAIC0xNDAxLDcgKzE0MDIsNyBAQCB2b2lkIFJlbmRl
ckJsb2NrOjp1cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmUoU2hhcGVJbnNpZGVJ
bmZvKiYgc2hhcGVJbgogICAgIHB1c2hTaGFwZUNvbnRlbnRPdmVyZmxvd0JlbG93VGhlQ29udGVu
dEJveCh0aGlzLCBzaGFwZUluc2lkZUluZm8sIGxpbmVUb3AsIGxpbmVIZWlnaHQpOwogfQogCi12
b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmVJbkZs
b3dUaHJlYWQoU2hhcGVJbnNpZGVJbmZvKiYgc2hhcGVJbnNpZGVJbmZvLCBMaW5lTGF5b3V0U3Rh
dGUmIGxheW91dFN0YXRlKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2Vn
bWVudHNGb3JDdXJyZW50TGluZUluRmxvd1RocmVhZChTaGFwZUluc2lkZUluZm8qJiBzaGFwZUlu
c2lkZUluZm8sIExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCiB7CiAgICAgQVNTRVJUKGxh
eW91dFN0YXRlLmZsb3dUaHJlYWQoKSk7CiAKQEAgLTE0NzUsNyArMTQ3Niw3IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZUluRmxvd1RocmVh
ZChTaGFwZUluc2lkZUluCiAgICAgICAgIHB1c2hTaGFwZUNvbnRlbnRPdmVyZmxvd0JlbG93VGhl
Q29udGVudEJveCh0aGlzLCBzaGFwZUluc2lkZUluZm8sIGxpbmVUb3AsIGxpbmVIZWlnaHQpOwog
fQogCi1ib29sIFJlbmRlckJsb2NrOjphZGp1c3RMb2dpY2FsTGluZVRvcEFuZExvZ2ljYWxIZWln
aHRJZk5lZWRlZChTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbywgTGF5b3V0VW5pdCBh
YnNvbHV0ZUxvZ2ljYWxUb3AsIExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJp
ZGlSZXNvbHZlciYgcmVzb2x2ZXIsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lLCBJbmxpbmVJdGVyYXRvciYgZW5kLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3Vy
ZW1lbnRzKQorYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdExvZ2ljYWxMaW5lVG9wQW5kTG9n
aWNhbEhlaWdodElmTmVlZGVkKFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJbnNpZGVJbmZvLCBMYXlv
dXRVbml0IGFic29sdXRlTG9naWNhbFRvcCwgTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwg
SW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZy
b21QcmV2aW91c0xpbmUsIElubGluZUl0ZXJhdG9yJiBlbmQsIFdvcmRNZWFzdXJlbWVudHMmIHdv
cmRNZWFzdXJlbWVudHMpCiB7CiAgICAgTGF5b3V0VW5pdCBhZGp1c3RlZExvZ2ljYWxMaW5lVG9w
ID0gYWRqdXN0TG9naWNhbExpbmVUb3Aoc2hhcGVJbnNpZGVJbmZvLCByZXNvbHZlci5wb3NpdGlv
bigpLCBlbmQsIHdvcmRNZWFzdXJlbWVudHMpOwogCkBAIC0xNTAxLDcgKzE1MDIsNyBAQCBib29s
IFJlbmRlckJsb2NrOjphZGp1c3RMb2dpY2FsTGluZVRvcEFuZExvZ2ljYWxIZWlnaHRJZk5lZWRl
ZChTaGFwZUluc2lkZUluZm8qCiB9CiAjZW5kaWYKIAotdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0
UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5l
QmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0
YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5z
QW5kRmxvYXRzSW5SYW5nZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQs
IGNvbnN0IEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMsIHVuc2lnbmVkIGNvbnNlY3V0
aXZlSHlwaGVuYXRlZExpbmVzKQogewogICAgIFJlbmRlclN0eWxlKiBzdHlsZVRvVXNlID0gc3R5
bGUoKTsKICAgICBib29sIHBhZ2luYXRlZCA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgpICYmIHZpZXco
KS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRlZCgpOwpAQCAtMTYxNiw4ICsxNjE3LDcgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRl
JiBsYXlvdXRTdGF0ZSwgSW5saW4KIAogICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0ZWQpIHsK
ICAgICAgICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBhZGp1c3RtZW50ID0gMDsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdGhpcyB0eXBlIGNvbnZlcnNp
b24gb25jZSB0aGUgb3duaW5nIGZ1bmN0aW9uIG1vdmVzLgotICAgICAgICAgICAgICAgICAgICB0
b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+YWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihs
aW5lQm94LCBhZGp1c3RtZW50LCBsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpOworICAgICAgICAg
ICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmVCb3gsIGFkanVz
dG1lbnQsIGxheW91dFN0YXRlLmZsb3dUaHJlYWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlm
IChhZGp1c3RtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExp
bmVXaWR0aCA9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUob2xkTG9naWNhbEhlaWdodCwg
bGF5b3V0U3RhdGUubGluZUluZm8oKS5pc0ZpcnN0TGluZSgpKTsKICAgICAgICAgICAgICAgICAg
ICAgICAgIGxpbmVCb3gtPmFkanVzdEJsb2NrRGlyZWN0aW9uUG9zaXRpb24oYWRqdXN0bWVudCk7
CkBAIC0xNjc3LDggKzE2NzcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxv
YXRzSW5SYW5nZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbgogICAgIC8vIElu
IGNhc2Ugd2UgYWxyZWFkeSBhZGp1c3RlZCB0aGUgbGluZSBwb3NpdGlvbnMgZHVyaW5nIHRoaXMg
bGF5b3V0IHRvIGF2b2lkIHdpZG93cwogICAgIC8vIHRoZW4gd2UgbmVlZCB0byBpZ25vcmUgdGhl
IHBvc3NpYmlsaXR5IG9mIGhhdmluZyBhIG5ldyB3aWRvd3Mgc2l0dWF0aW9uLgogICAgIC8vIE90
aGVyd2lzZSwgd2UgcmlzayBsZWF2aW5nIGVtcHR5IGNvbnRhaW5lcnMgd2hpY2ggaXMgYWdhaW5z
dCB0aGUgYmxvY2sgZnJhZ21lbnRhdGlvbiBwcmluY2lwbGVzLgotICAgIC8vIEZJWE1FLUJMT0NL
RkxPVzogUmVtb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIG9uY2UgdGhlIG93bmluZyBmdW5jdGlv
biBtb3Zlcy4KLSAgICBpZiAocGFnaW5hdGVkICYmICFzdHlsZSgpLT5oYXNBdXRvV2lkb3dzKCkg
JiYgIXRvUmVuZGVyQmxvY2tGbG93KHRoaXMpLT5kaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygp
KSB7CisgICAgaWYgKHBhZ2luYXRlZCAmJiAhc3R5bGUoKS0+aGFzQXV0b1dpZG93cygpICYmICFk
aWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpKSB7CiAgICAgICAgIC8vIENoZWNrIHRoZSBsaW5l
IGJveGVzIHRvIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIHVuYWNjZXB0YWJsZSB3aWRvd3Mu
CiAgICAgICAgIC8vIEhvd2V2ZXIsIHdlJ2xsIHByaW9yaXRpemUgb3JwaGFucyAtIHNvIG5vdGhp
bmcgd2UgZG8gaGVyZSBzaG91bGQgY3JlYXRlCiAgICAgICAgIC8vIGEgbmV3IG9ycGhhbi4KQEAg
LTE3MzAsMTcgKzE3MjksMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0
c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW4KICAgICAgICAgICAg
ICAgICBsaW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKIAogICAgICAgICAgICAgLy8g
V2Ugbm93IHdhbnQgdG8gYnJlYWsgYXQgdGhpcyBsaW5lLiBSZW1lbWJlciBmb3IgbmV4dCBsYXlv
dXQgYW5kIHRyaWdnZXIgcmVsYXlvdXQuCi0gICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6
IFJlbW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92
ZXMuCi0gICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+c2V0QnJlYWtBdExpbmVU
b0F2b2lkV2lkb3cobGluZUNvdW50KGxpbmVCb3gpKTsKKyAgICAgICAgICAgIHNldEJyZWFrQXRM
aW5lVG9Bdm9pZFdpZG93KGxpbmVDb3VudChsaW5lQm94KSk7CiAgICAgICAgICAgICBtYXJrTGlu
ZXNEaXJ0eUluQmxvY2tSYW5nZShsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRpbmco
KSwgbGluZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gpOwogICAgICAgICB9
CiAgICAgfQogCi0gICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdGhpcyB0eXBlIGNvbnZl
cnNpb24gb25jZSB0aGUgb3duaW5nIGZ1bmN0aW9uIG1vdmVzLgotICAgIHRvUmVuZGVyQmxvY2tG
bG93KHRoaXMpLT5jbGVhckRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7CisgICAgY2xlYXJE
aWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpsaW5r
VG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKK3ZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSkKIHsKICAgICBpZiAobGF5b3V0U3RhdGUuZW5kTGluZSgpKSB7CiAgICAgICAgIGlm
IChsYXlvdXRTdGF0ZS5lbmRMaW5lTWF0Y2hlZCgpKSB7CkBAIC0xNzUxLDggKzE3NDgsNyBAQCB2
b2lkIFJlbmRlckJsb2NrOjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSkKICAgICAgICAgICAgICAgICBsaW5lLT5hdHRhY2hMaW5lKCk7CiAgICAgICAg
ICAgICAgICAgaWYgKHBhZ2luYXRlZCkgewogICAgICAgICAgICAgICAgICAgICBkZWx0YSAtPSBs
aW5lLT5wYWdpbmF0aW9uU3RydXQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUtQkxP
Q0tGTE9XOiBSZW1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gb25jZSB0aGUgb3duaW5nIGZ1bmN0
aW9uIG1vdmVzLgotICAgICAgICAgICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+
YWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lLCBkZWx0YSwgbGF5b3V0U3RhdGUu
Zmxvd1RocmVhZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0aW9uRm9y
UGFnaW5hdGlvbihsaW5lLCBkZWx0YSwgbGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKTsKICAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGRlbHRhKSB7CiAgICAgICAgICAgICAg
ICAgICAgIGxheW91dFN0YXRlLnVwZGF0ZVJlcGFpbnRSYW5nZUZyb21Cb3gobGluZSwgZGVsdGEp
OwpAQCAtMTgxNiw3ICsxODEyLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGlua1RvRW5kTGluZUlm
TmVlZGVkKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCiAgICAgfQogfQogCi12b2lkIFJl
bmRlckJsb2NrOjpyZXBhaW50RGlydHlGbG9hdHMoVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiBmbG9h
dHMpCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6cmVwYWludERpcnR5RmxvYXRzKFZlY3RvcjxGbG9h
dFdpdGhSZWN0PiYgZmxvYXRzKQogewogICAgIHNpemVfdCBmbG9hdENvdW50ID0gZmxvYXRzLnNp
emUoKTsKICAgICAvLyBGbG9hdHMgdGhhdCBkaWQgbm90IGhhdmUgbGF5b3V0IGRpZCBub3QgcmVw
YWludCB3aGVuIHdlIGxhaWQgdGhlbSBvdXQuIFRoZXkgd291bGQgaGF2ZQpAQCAtMTkzNiw3ICsx
OTMyLDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dElubGluZUNoaWxkcmVuKGJvb2wg
cmVsYXlvdXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmUKICAgICAgICAgY2hlY2tMaW5lc0ZvclRl
eHRPdmVyZmxvdygpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpjaGVja0Zsb2F0c0luQ2xlYW5M
aW5lKFJvb3RJbmxpbmVCb3gqIGxpbmUsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzLCBz
aXplX3QmIGZsb2F0SW5kZXgsIGJvb2wmIGVuY291bnRlcmVkTmV3RmxvYXQsIGJvb2wmIGRpcnRp
ZWRCeUZsb2F0KQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrRmxvYXRzSW5DbGVhbkxpbmUo
Um9vdElubGluZUJveCogbGluZSwgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiBmbG9hdHMsIHNpemVf
dCYgZmxvYXRJbmRleCwgYm9vbCYgZW5jb3VudGVyZWROZXdGbG9hdCwgYm9vbCYgZGlydGllZEJ5
RmxvYXQpCiB7CiAgICAgVmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVGbG9hdHMgPSBsaW5l
LT5mbG9hdHNQdHIoKTsKICAgICBpZiAoIWNsZWFuTGluZUZsb2F0cykKQEAgLTE5NjcsNyArMTk2
Myw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNoZWNrRmxvYXRzSW5DbGVhbkxpbmUoUm9vdElubGlu
ZUJveCogbGluZSwgVmVjdG9yPEZsb2F0V2l0aFJlCiAgICAgfQogfQogCi1Sb290SW5saW5lQm94
KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxh
eW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQorUm9vdElubGluZUJveCog
UmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCiB7CiAgICAgUm9vdElu
bGluZUJveCogY3VyciA9IDA7CiAgICAgUm9vdElubGluZUJveCogbGFzdCA9IDA7CkBAIC0xOTg2
LDggKzE5ODIsNyBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhcnRQ
b3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLAogICAgICAgICAgICAgICAgICAg
ICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcGFnaW5hdGlvbkRl
bHRhIC09IGN1cnItPnBhZ2luYXRpb25TdHJ1dCgpOwotICAgICAgICAgICAgICAgIC8vIEZJWE1F
LUJMT0NLRkxPVzogUmVtb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIG9uY2UgdGhlIG93bmluZyBm
dW5jdGlvbiBtb3Zlcy4KLSAgICAgICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+
YWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihjdXJyLCBwYWdpbmF0aW9uRGVsdGEsIGxh
eW91dFN0YXRlLmZsb3dUaHJlYWQoKSk7CisgICAgICAgICAgICAgICAgYWRqdXN0TGluZVBvc2l0
aW9uRm9yUGFnaW5hdGlvbihjdXJyLCBwYWdpbmF0aW9uRGVsdGEsIGxheW91dFN0YXRlLmZsb3dU
aHJlYWQoKSk7CiAgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRpb25EZWx0YSkgewogICAgICAg
ICAgICAgICAgICAgICBpZiAoY29udGFpbnNGbG9hdHMoKSB8fCAhbGF5b3V0U3RhdGUuZmxvYXRz
KCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogRG8gYmV0
dGVyIGV2ZW50dWFsbHkuICBGb3Igbm93IGlmIHdlIGV2ZXIgc2hpZnQgYmVjYXVzZSBvZiBwYWdp
bmF0aW9uIGFuZCBmbG9hdHMgYXJlIHByZXNlbnQganVzdCBnbyB0byBhIGZ1bGwgbGF5b3V0LgpA
QCAtMjA4NSw3ICsyMDgwLDcgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmRldGVybWlu
ZVN0YXJ0UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwKICAgICByZXR1cm4g
Y3VycjsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJ
dGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMp
Cit2b2lkIFJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0
YXRlJiBsYXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJdGVyYXRv
ciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpCiB7CiAg
ICAgQVNTRVJUKCFsYXlvdXRTdGF0ZS5lbmRMaW5lKCkpOwogICAgIHNpemVfdCBmbG9hdEluZGV4
ID0gbGF5b3V0U3RhdGUuZmxvYXRJbmRleCgpOwpAQCAtMjEyMiw3ICsyMTE3LDcgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRT
dGF0ZSwgUm9vdElubGluZUIKICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lKGxhc3QpOwogfQog
Ci1ib29sIFJlbmRlckJsb2NrOjpjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUoTGlu
ZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKK2Jvb2wgUmVuZGVyQmxvY2tGbG93OjpjaGVja1Bh
Z2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkK
IHsKICAgICBMYXlvdXRVbml0IGxpbmVEZWx0YSA9IGxvZ2ljYWxIZWlnaHQoKSAtIGxheW91dFN0
YXRlLmVuZExpbmVMb2dpY2FsVG9wKCk7CiAKQEAgLTIxMzYsOCArMjEzMSw3IEBAIGJvb2wgUmVu
ZGVyQmxvY2s6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3Rh
dGUmIGxheW91dFN0YXRlCiAgICAgICAgICAgICAgICAgLy8gc3RydXQgeWV0LgogICAgICAgICAg
ICAgICAgIExheW91dFVuaXQgb2xkUGFnaW5hdGlvblN0cnV0ID0gbGluZUJveC0+cGFnaW5hdGlv
blN0cnV0KCk7CiAgICAgICAgICAgICAgICAgbGluZURlbHRhIC09IG9sZFBhZ2luYXRpb25TdHJ1
dDsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFJlbW92ZSB0aGlzIHR5cGUg
Y29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92ZXMuCi0gICAgICAgICAgICAg
ICAgdG9SZW5kZXJCbG9ja0Zsb3codGhpcyktPmFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRp
b24obGluZUJveCwgbGluZURlbHRhLCBsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpOworICAgICAg
ICAgICAgICAgIGFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgbGluZURl
bHRhLCBsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpOwogICAgICAgICAgICAgICAgIGxpbmVCb3gt
PnNldFBhZ2luYXRpb25TdHJ1dChvbGRQYWdpbmF0aW9uU3RydXQpOwogICAgICAgICAgICAgfQog
ICAgICAgICAgICAgaWYgKGxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKGxpbmVCb3gs
IGxpbmVEZWx0YSwgbGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKSkKQEAgLTIxNjgsNyArMjE2Miw3
IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShM
aW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wg
UmVuZGVyQmxvY2s6Om1hdGNoZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUs
IGNvbnN0IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0IElubGluZUl0ZXJhdG9y
JiBlbmRMaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVuZExpbmVTdGF0dXMpCitib29sIFJl
bmRlckJsb2NrRmxvdzo6bWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5kTGluZVN0YXR1cykKIHsKICAg
ICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5lU3RhcnQpIHsKICAgICAgICAgaWYg
KHJlc29sdmVyLnN0YXR1cygpICE9IGVuZExpbmVTdGF0dXMpCkBAIC0yMzUwLDcgKzIzNDQsNyBA
QCB2b2lkIExpbmVCcmVha2VyOjpza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29s
dmVyJiByZXNvbHZlciwgTGluZUluZm8mCiAKIC8vIFRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNl
ZCBmb3IgbGlzdCBtYXJrZXJzIGFuZCBpbmxpbmUgZmxvd3MgdGhhdCBoYXZlIGxpbmUgYm94ZXMu
IE5laXRoZXIgc2hvdWxkCiAvLyBoYXZlIGFuIGVmZmVjdCBvbiB3aGl0ZXNwYWNlIGF0IHRoZSBz
dGFydCBvZiB0aGUgbGluZS4KLXN0YXRpYyBib29sIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJT
dGFydE9iamVjdChSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlck9iamVjdCogbywgTGluZU1pZHBv
aW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQorc3RhdGljIGJvb2wgc2hvdWxkU2tpcFdoaXRl
c3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyogYmxvY2ssIFJlbmRlck9iamVj
dCogbywgTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQogewogICAgIFJlbmRl
ck9iamVjdCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG8pOwog
ICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQo
KSkKQEAgLTI2NTksNyArMjY1Myw3IEBAIHN0YXRpYyBib29sIGNhbkJyZWFrQXRUaGlzUG9zaXRp
b24oYm9vbCBhdXRvV3JhcCwgTGluZVdpZHRoJiB3aWR0aCwgSW5saW5lSXRlcmF0CiB9CiAKICNp
ZiBFTkFCTEUoQ1NTX1NIQVBFUykKLXN0YXRpYyB2b2lkIHVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVz
KFJlbmRlckJsb2NrKiBibG9jaywgY29uc3QgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIGNvbnN0IFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIExp
bmVXaWR0aCYgd2lkdGgsIGJvb2wgaXNGaXJzdExpbmUpCitzdGF0aWMgdm9pZCB1cGRhdGVTZWdt
ZW50c0ZvclNoYXBlcyhSZW5kZXJCbG9ja0Zsb3cqIGJsb2NrLCBjb25zdCBGbG9hdGluZ09iamVj
dCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc3QgV29yZE1lYXN1cmVtZW50cyYgd29y
ZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0aCwgYm9vbCBpc0ZpcnN0TGluZSkKIHsKICAg
ICBBU1NFUlQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7CiAKQEAgLTMzNjIsNyArMzM1Niw3
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCkKICAg
ICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCkKK3Zv
aWQgUmVuZGVyQmxvY2tGbG93OjpkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpCiB7CiAgICAgRVRl
eHRBbGlnbiB0ZXh0QWxpZ24gPSBzdHlsZSgpLT50ZXh0QWxpZ24oKTsKICAgICBib29sIGx0ciA9
IHN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKQEAgLTMzODYsNyArMzM4MCw3IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCkKICAgICB9CiB9CiAK
LXZvaWQgUmVuZGVyQmxvY2s6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQordm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQogewogICAgIC8vIERldGVy
bWluZSB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCiAg
ICAgLy8gRklYTUU6IENTUzMgc2F5cyB0aGlzIGlzIGNvbmZpZ3VyYWJsZSwgYWxzbyBuZWVkIHRv
IHVzZSAweDAwMkUgKEZVTEwgU1RPUCkgaWYgaG9yaXpvbnRhbCBlbGxpcHNpcyBpcyAibm90IHJl
bmRlcmFibGUiCkBAIC0zNDMzLDcgKzM0MjcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpjaGVja0xp
bmVzRm9yVGV4dE92ZXJmbG93KCkKICAgICB9CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2s6OnBvc2l0
aW9uTmV3RmxvYXRPbkxpbmUoRmxvYXRpbmdPYmplY3QqIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVj
dCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZUluZm8mIGxpbmVJbmZvLCBMaW5lV2lk
dGgmIHdpZHRoKQorYm9vbCBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUo
RmxvYXRpbmdPYmplY3QqIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSwgTGluZUluZm8mIGxpbmVJbmZvLCBMaW5lV2lkdGgmIHdpZHRoKQogewogICAg
IGlmICghcG9zaXRpb25OZXdGbG9hdHMoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAppbmRleCA2NjgxZDM0NGQ3OTM0YzUzOTU3ODA4
ZDkwZDI5YjJmN2UyZDExNzllLi44NzQzZWY0OGIzOTJkNWMwYTcyNmViMzBjZjc5MTNjYzFjYzQ3
MTkyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcApAQCAtMjIzLDIyICsy
MjMsMTcgQEAgdm9pZCBSZW5kZXJCb3g6OndpbGxCZURlc3Ryb3llZCgpCiAgICAgUmVuZGVyQm94
TW9kZWxPYmplY3Q6OndpbGxCZURlc3Ryb3llZCgpOwogfQogCi1SZW5kZXJCbG9jayogUmVuZGVy
Qm94OjpvdXRlcm1vc3RCbG9ja0NvbnRhaW5pbmdGbG9hdGluZ09iamVjdCgpCitSZW5kZXJCbG9j
a0Zsb3cqIFJlbmRlckJveDo6b3V0ZXJtb3N0QmxvY2tDb250YWluaW5nRmxvYXRpbmdPYmplY3Qo
KQogewogICAgIEFTU0VSVChpc0Zsb2F0aW5nKCkpOwotICAgIFJlbmRlckJsb2NrKiBwYXJlbnRC
bG9jayA9IDA7CisgICAgUmVuZGVyQmxvY2tGbG93KiBwYXJlbnRCbG9jayA9IDA7CiAgICAgZm9y
IChSZW5kZXJPYmplY3QqIGN1cnIgPSBwYXJlbnQoKTsgY3VyciAmJiAhY3Vyci0+aXNSZW5kZXJW
aWV3KCk7IGN1cnIgPSBjdXJyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3Vyci0+aXNSZW5k
ZXJCbG9jaygpKSB7Ci0gICAgICAgICAgICBSZW5kZXJCbG9jayogY3VyckJsb2NrID0gdG9SZW5k
ZXJCbG9jayhjdXJyKTsKKyAgICAgICAgaWYgKGN1cnItPmlzUmVuZGVyQmxvY2tGbG93KCkpIHsK
KyAgICAgICAgICAgIFJlbmRlckJsb2NrRmxvdyogY3VyckJsb2NrID0gdG9SZW5kZXJCbG9ja0Zs
b3coY3Vycik7CiAgICAgICAgICAgICBpZiAoIXBhcmVudEJsb2NrIHx8IGN1cnJCbG9jay0+Y29u
dGFpbnNGbG9hdCh0aGlzKSkKICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jayA9IGN1cnJCbG9j
azsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocGFyZW50QmxvY2spIHsKLSAgICAgICAgUmVu
ZGVyT2JqZWN0KiBwYXJlbnQgPSBwYXJlbnRCbG9jay0+cGFyZW50KCk7Ci0gICAgICAgIGlmIChw
YXJlbnQgJiYgcGFyZW50LT5pc0ZsZXhpYmxlQm94SW5jbHVkaW5nRGVwcmVjYXRlZCgpKQotICAg
ICAgICAgICAgcGFyZW50QmxvY2sgPSB0b1JlbmRlckJsb2NrKHBhcmVudCk7Ci0gICAgfQogICAg
IHJldHVybiBwYXJlbnRCbG9jazsKIH0KIApAQCAtMjUwLDcgKzI0NSw3IEBAIHZvaWQgUmVuZGVy
Qm94OjpyZW1vdmVGbG9hdGluZ09yUG9zaXRpb25lZENoaWxkRnJvbUJsb2NrTGlzdHMoKQogICAg
ICAgICByZXR1cm47CiAKICAgICBpZiAoaXNGbG9hdGluZygpKSB7Ci0gICAgICAgIGlmIChSZW5k
ZXJCbG9jayogcGFyZW50QmxvY2sgPSBvdXRlcm1vc3RCbG9ja0NvbnRhaW5pbmdGbG9hdGluZ09i
amVjdCgpKSB7CisgICAgICAgIGlmIChSZW5kZXJCbG9ja0Zsb3cqIHBhcmVudEJsb2NrID0gb3V0
ZXJtb3N0QmxvY2tDb250YWluaW5nRmxvYXRpbmdPYmplY3QoKSkgewogICAgICAgICAgICAgcGFy
ZW50QmxvY2stPm1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlvdXQodGhpcyk7CiAgICAgICAg
ICAgICBwYXJlbnRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCh0
aGlzLCBmYWxzZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCb3guaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guaApp
bmRleCA5NjNkZDI1OTZjN2MzMmIzOTdkZjIzZDAwNzI1Yzg0NmNhNTc3ODFkLi45ODI3MmRiNTNl
MzE1NTVlN2Q4ZGNjZWY1MWMyOGI1ZWY3MjU3YzE1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQm94LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJveC5oCkBAIC0zMiw2ICszMiw3IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xh
c3MgUmVuZGVyQmxvY2tGbG93OwogY2xhc3MgUmVuZGVyQm94UmVnaW9uSW5mbzsKIGNsYXNzIFJl
bmRlclJlZ2lvbjsKIHN0cnVjdCBQYWludEluZm87CkBAIC01MDIsNyArNTAzLDcgQEAgcHVibGlj
OgogCiAgICAgdmlydHVhbCBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25Gb3JQb2ludChjb25zdCBM
YXlvdXRQb2ludCYpIE9WRVJSSURFOwogCi0gICAgUmVuZGVyQmxvY2sqIG91dGVybW9zdEJsb2Nr
Q29udGFpbmluZ0Zsb2F0aW5nT2JqZWN0KCk7CisgICAgUmVuZGVyQmxvY2tGbG93KiBvdXRlcm1v
c3RCbG9ja0NvbnRhaW5pbmdGbG9hdGluZ09iamVjdCgpOwogCiAgICAgdm9pZCByZW1vdmVGbG9h
dGluZ09yUG9zaXRpb25lZENoaWxkRnJvbUJsb2NrTGlzdHMoKTsKICAgICAKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCmluZGV4IDg3ZjUw
NDhiMmVhODcwZjQ0M2JkYjA3ODBhNjg1YTNhNjU4YjdjNmMuLjM2MzdjOGFlMzRlYjc5MWJhZDNm
NWEzMjE1NmIyOWVlZjY2MDdmNjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcApAQCAtMjgwMSw5ICsyODAxLDkgQEAgdm9pZCBSZW5k
ZXJCb3hNb2RlbE9iamVjdDo6bW92ZUNoaWxkcmVuVG8oUmVuZGVyQm94TW9kZWxPYmplY3QqIHRv
Qm94TW9kZWxPYmplY3QKICAgICAvLyBhbm9ueW1vdXMgYmxvY2tzIHdoaWNoIGNhbiBubyBsb25n
ZXIgY2FycnkgcG9zaXRpb25lZCBvYmplY3RzIChzZWUgcjEyMDc2MSkKICAgICAvLyBvciB3aGVu
IGZ1bGxSZW1vdmVJbnNlcnQgaXMgZmFsc2UuCiAgICAgaWYgKGZ1bGxSZW1vdmVJbnNlcnQgJiYg
aXNSZW5kZXJCbG9jaygpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHRvUmVuZGVy
QmxvY2sodGhpcyk7Ci0gICAgICAgIGJsb2NrLT5yZW1vdmVQb3NpdGlvbmVkT2JqZWN0cygwKTsK
LSAgICAgICAgYmxvY2stPnJlbW92ZUZsb2F0aW5nT2JqZWN0cygpOyAKKyAgICAgICAgdG9SZW5k
ZXJCbG9jayh0aGlzKS0+cmVtb3ZlUG9zaXRpb25lZE9iamVjdHMoMCk7CisgICAgICAgIGlmIChp
c1JlbmRlckJsb2NrRmxvdygpKQorICAgICAgICAgICAgdG9SZW5kZXJCbG9ja0Zsb3codGhpcykt
PnJlbW92ZUZsb2F0aW5nT2JqZWN0cygpOyAKICAgICB9CiAKICAgICBBU1NFUlQoIWJlZm9yZUNo
aWxkIHx8IHRvQm94TW9kZWxPYmplY3QgPT0gYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAKaW5kZXggOTdiNWQ3MDI2NjZjN2Fk
MDczZmEzOWFlMjU5ODNmZGU0NGMxNjZmYi4uZTRiNmFkOTlkMGIxOTNhMTMyZGM2ZmZmMjIxNTZl
YmI4NzBhYWI3OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklu
bGluZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAK
QEAgLTQ0OCw3ICs0NDgsMTEgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0RmxvdyhSZW5kZXJP
YmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gKICAgICAgICAgLy8g
V2UgY2FuIHJldXNlIHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBu
ZXh0IGNvbnRpbnVhdGlvbi4KICAgICAgICAgcHJlID0gYmxvY2s7CiAgICAgICAgIHByZS0+cmVt
b3ZlUG9zaXRpb25lZE9iamVjdHMoMCk7Ci0gICAgICAgIHByZS0+cmVtb3ZlRmxvYXRpbmdPYmpl
Y3RzKCk7CisgICAgICAgIC8vIEZJWE1FLUJMT0NLRkxPVzogVGhlIGVuY2xvc2luZyBtZXRob2Qg
c2hvdWxkIGxpa2VseSBiZSBzd2l0Y2hlZCBvdmVyCisgICAgICAgIC8vIHRvIG9ubHkgd29yayBv
biBSZW5kZXJCbG9ja0Zsb3csIGluIHdoaWNoIGNhc2UgdGhpcyBjb252ZXJzaW9uIGNhbiBiZQor
ICAgICAgICAvLyByZW1vdmVkLgorICAgICAgICBpZiAocHJlLT5pc1JlbmRlckJsb2NrRmxvdygp
KQorICAgICAgICAgICAgdG9SZW5kZXJCbG9ja0Zsb3cocHJlKS0+cmVtb3ZlRmxvYXRpbmdPYmpl
Y3RzKCk7CiAgICAgICAgIGJsb2NrID0gYmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOwogICAgIH0g
ZWxzZSB7CiAgICAgICAgIC8vIE5vIGFub255bW91cyBibG9jayBhdmFpbGFibGUgZm9yIHVzZS4g
IE1ha2Ugb25lLgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>213726</attachid>
            <date>2013-10-08 15:21:35 -0700</date>
            <delta_ts>2013-10-08 16:19:14 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-122512-20131008152134.patch</filename>
            <type>text/plain</type>
            <size>160511</size>
            <attacher name="Bem Jones-Bey">bjonesbe</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU3MTM5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYTQyNGJhZmVmOWU1ODU5
MTAyNjUwYzliNjUzNmFkMTk0YzcyNzU0OS4uNTQ5YWM4NjU0MjA2NjQxODllNzAwNTI4YmY3ZDg1
ODkwZTEwYTY4YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEyNyBAQAorMjAxMy0xMC0wOCAgQmVt
IEpvbmVzLUJleSAgPGJqb25lc2JlQGFkb2JlLmNvbT4KKworICAgICAgICBNb3ZlIG1fZmxvYXRp
bmdPYmplY3RzIHRvIFJlbmRlckJsb2NrRmxvdyBmcm9tIFJlbmRlckJsb2NrCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjI1MTIKKworICAgICAgICBS
ZXZpZXdlZCBieSBEYXZpZCBIeWF0dC4KKworICAgICAgICBGbG9hdHMgYXJlIHBhcnQgb2YgYmxv
Y2sgZmxvdywgbm90IGV2ZXJ5IFJlbmRlckJsb2NrIGNhbiBjb250YWluCisgICAgICAgIGZsb2Fy
cy4gVGhpcyBjaGFuZ2UgbWFrZXMgaXQgc28gdGhhdCBSZW5kZXJCbG9jayBubyBsb25nZXIgY2Fu
IGNvbnRhaW4KKyAgICAgICAgZmxvYXRzLCBvbmx5IFJlbmRlckJsb2NrRmxvdyBjYW4uCisKKyAg
ICAgICAgVGhpcyBhbHNvIG1vdmVzIGEgYnVuY2ggb2YgbGluZSBsYXlvdXQgc3R1ZmYgb3ZlciB0
byBSZW5kZXJCbG9ja0Zsb3csCisgICAgICAgIGJ1dCBtYWtlcyBubyBlZmZvcnQgdG8gbW92ZSBh
bGwgb2YgbGluZSBsYXlvdXQsIGFzIGFsbCBvZiB0aGF0IGlzCisgICAgICAgIGRlc3RpbmVkIHRv
IG1vdmUgb3V0IG9mIGJvdGggUmVuZGVyQmxvY2tGbG93IGFuZCBSZW5kZXJCbG9jayBpbnRvIGl0
cworICAgICAgICBvd24gY2xhc3MuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBubyBiZWhhdmlv
ciBjaGFuZ2UuCisKKyAgICAgICAgKiByZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OklubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuKToKKyAgICAgICAgKiBy
ZW5kZXJpbmcvTGluZVdpZHRoLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVXaWR0aDo6TGlu
ZVdpZHRoKToKKyAgICAgICAgKiByZW5kZXJpbmcvTGluZVdpZHRoLmg6CisgICAgICAgICogcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpz
dHlsZVdpbGxDaGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnN0eWxlRGlk
Q2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzcGxpdEZsb3cpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmRlbGV0ZUxpbmVCb3hUcmVlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9jazo6Y29tcHV0ZU92ZXJmbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrOjpzZWxlY3Rpb25HYXBzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjphZGp1
c3RGb3JCb3JkZXJGaXQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmNvbnRhaW5zRmxvYXRzKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrOjpzaG91bGRTa2lwQ3JlYXRpbmdSdW5zRm9yT2JqZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21GbG9hdHMpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9yTGlu
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6bG9naWNhbExlZnRGbG9hdE9mZnNl
dEZvckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6Om1vdmVBbGxDaGlsZHJl
bk9uUmVtb3ZhbFRvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpwYWludEZsb2F0
cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6aGl0VGVzdEZsb2F0cyk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6Y2xpcE91dEZsb2F0aW5nT2JqZWN0cyk6CisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6bGF5b3V0QmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93
OjpsYXlvdXRCbG9ja0NoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
Y29sbGFwc2VNYXJnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y2xl
YXJGbG9hdHNJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFk
anVzdEJsb2NrQ2hpbGRGb3JQYWdpbmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6Y29udGFpbnNGbG9hdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OnN0eWxlRGlkQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
c3R5bGVXaWxsQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGVs
ZXRlTGluZUJveFRyZWUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojptb3Zl
QWxsQ2hpbGRyZW5PblJlbW92YWxUbyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OmFkZE92ZXJmbG93RnJvbUZsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmNvbXB1dGVPdmVyZmxvdyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OnJlcGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OnBhaW50RmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6Y2xpcE91dEZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OmNyZWF0ZUZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9ja0Zsb3c6OnJlbW92ZUZsb2F0aW5nT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6Omluc2VydEZsb2F0aW5nT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6cmVtb3ZlRmxvYXRpbmdPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9hdCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRzKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bmV3TGluZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5lKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bG9naWNhbFJpZ2h0RmxvYXRPZmZz
ZXRGb3JMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bmV4dEZsb2F0
TG9naWNhbEJvdHRvbUJlbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6YWRkT3ZlcmhhbmdpbmdGbG9hdHMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxv
Y2tGbG93OjpoYXNPdmVyaGFuZ2luZ0Zsb2F0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6YWRkSW50cnVkaW5nRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlv
dXQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpnZXRDbGVhckRlbHRhKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6aGl0VGVzdEZsb2F0cyk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZvckJvcmRlckZpdCk6CisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2tGbG93OjpoYXNPdmVyaGFuZ2luZ0Zsb2F0cyk6CisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlckJsb2NrTGluZUxheW91dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtl
cjo6TGluZUJyZWFrZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjphcHBl
bmRSdW5zRm9yT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y3Jl
YXRlTGluZUJveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29uc3Ry
dWN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnNldE1hcmdpbnNG
b3JSdWJ5UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZUxvZ2ljYWxJbmxpbmVQb3NpdGlv
bnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlSW5saW5lRGly
ZWN0aW9uUG9zaXRpb25zRm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zs
b3c6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNGb3JTZWdtZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUJsb2NrRGlyZWN0aW9uUG9zaXRpb25z
Rm9yTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpzZXRTdGF0aWNQb3NpdGlvbnMpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpoYW5kbGVUcmFpbGluZ1NwYWNlcyk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9MYXN0
TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpjb25zdHJ1Y3RCaWRpUnVuc0ZvckxpbmUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1
bnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxv
YXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6cmVzdGFydExheW91dFJ1
bnNBbmRGbG9hdHNJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OnB1c2hTaGFwZUNvbnRlbnRP
dmVyZmxvd0JlbG93VGhlQ29udGVudEJveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50
TGluZUluRmxvd1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFk
anVzdExvZ2ljYWxMaW5lVG9wQW5kTG9naWNhbEhlaWdodElmTmVlZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpyZXBhaW50RGlydHlGbG9hdHMpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVja0Zsb2F0c0luQ2xlYW5MaW5l
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGV0ZXJtaW5lU3RhcnRQb3Np
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmRldGVybWluZUVuZFBv
c2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6Y2hlY2tQYWdpbmF0
aW9uQW5kRmxvYXRzQXRFbmRMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6bWF0Y2hlZEVuZExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkU2tpcFdoaXRlc3Bh
Y2VBZnRlclN0YXJ0T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRzRm9y
U2hhcGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZGVsZXRlRWxsaXBz
aXNMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpjaGVja0xp
bmVzRm9yVGV4dE92ZXJmbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
cG9zaXRpb25OZXdGbG9hdE9uTGluZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJveC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCb3g6Om91dGVybW9zdEJsb2NrQ29udGFpbmlu
Z0Zsb2F0aW5nT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJveDo6cmVtb3ZlRmxv
YXRpbmdPclBvc2l0aW9uZWRDaGlsZEZyb21CbG9ja0xpc3RzKToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyQm94Lmg6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJveE1vZGVsT2JqZWN0Ojptb3ZlQ2hpbGRy
ZW5Ubyk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJJbmxpbmU6OnNwbGl0Rmxvdyk6CisKIDIwMTMtMTAtMDggIERlYW4gSmFj
a3NvbiAgPGRpbm9AYXBwbGUuY29tPgogCiAgICAgICAgIFN1cHBvcnQgdW5wcmVmaXhlZCBXZWJH
TCBjb250ZXh0IGNyZWF0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
SW5saW5lSXRlcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRv
ci5oCmluZGV4IDg0ZjE2ZDRlN2NhYTIyNTc0MWQwZDg1Y2E5NDg0ZDg5YjIxMjVmMWEuLjhlYmFl
NTNiMTRhOThiMzgwYjFjZDNkZGRkNmY2NzQ2NjkxY2JmZWQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCkBAIC0yNCw3ICsyNCw3IEBACiAjZGVmaW5lIElubGlu
ZUl0ZXJhdG9yX2gKIAogI2luY2x1ZGUgIkJpZGlSdW4uaCIKLSNpbmNsdWRlICJSZW5kZXJCbG9j
ay5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgogI2luY2x1ZGUgIlJlbmRlcklubGlu
ZS5oIgogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFz
Lmg+CkBAIC01MjEsNyArNTIxLDcgQEAgaW5saW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjph
cHBlbmRSdW4oKQogICAgICAgICAgICAgaWYgKGlzb2xhdGVUcmFja2VyLmluSXNvbGF0ZSgpKQog
ICAgICAgICAgICAgICAgIGlzb2xhdGVUcmFja2VyLmFkZEZha2VSdW5JZk5lY2Vzc2FyeShvYmos
IHN0YXJ0LCAqdGhpcyk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUmVuZGVy
QmxvY2s6OmFwcGVuZFJ1bnNGb3JPYmplY3QobV9ydW5zLCBzdGFydCwgb2JqLT5sZW5ndGgoKSwg
b2JqLCAqdGhpcyk7CisgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5z
Rm9yT2JqZWN0KG1fcnVucywgc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOwogICAg
ICAgICAgICAgLy8gRklYTUU6IHN0YXJ0L29iaiBzaG91bGQgYmUgYW4gSW5saW5lSXRlcmF0b3Ig
aW5zdGVhZCBvZiB0d28gc2VwYXJhdGUgdmFyaWFibGVzLgogICAgICAgICAgICAgc3RhcnQgPSAw
OwogICAgICAgICAgICAgb2JqID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX3Nvci5y
b290KCksIG9iaiwgJmlzb2xhdGVUcmFja2VyKTsKQEAgLTUzNyw3ICs1MzcsNyBAQCBpbmxpbmUg
dm9pZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmFwcGVuZFJ1bigpCiAgICAgICAgICAgICBpZiAoaXNv
bGF0ZVRyYWNrZXIuaW5Jc29sYXRlKCkpCiAgICAgICAgICAgICAgICAgaXNvbGF0ZVRyYWNrZXIu
YWRkRmFrZVJ1bklmTmVjZXNzYXJ5KG9iaiwgc3RhcnQsICp0aGlzKTsKICAgICAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgICAgICBSZW5kZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChtX3J1
bnMsIHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOworICAgICAgICAgICAgICAgIFJlbmRlckJsb2Nr
Rmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjdChtX3J1bnMsIHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMp
OwogICAgICAgICB9CiAKICAgICAgICAgbV9lb3IuaW5jcmVtZW50KCk7CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZVdpZHRoLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9MaW5lV2lkdGguY3BwCmluZGV4IDgwYTdhYzY2YjE5YTU5ODZkNGIzZjMxYjAxNjU2
ODI1OTg5Zjk4MjMuLmZkY2VhN2JhYWQyOWFlYzgwMjhkYWRmOWJiMjg5ZTkyY2FhN2RjZTMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguY3BwCkBAIC0zMCwxMiArMzAsMTIgQEAK
ICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJMaW5lV2lkdGguaCIKIAotI2luY2x1ZGUg
IlJlbmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyQmxvY2tGbG93LmgiCiAjaW5jbHVkZSAi
UmVuZGVyUnVieVJ1bi5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUxpbmVXaWR0aDo6TGlu
ZVdpZHRoKFJlbmRlckJsb2NrJiBibG9jaywgYm9vbCBpc0ZpcnN0TGluZSwgSW5kZW50VGV4dE9y
Tm90IHNob3VsZEluZGVudFRleHQpCitMaW5lV2lkdGg6OkxpbmVXaWR0aChSZW5kZXJCbG9ja0Zs
b3cmIGJsb2NrLCBib29sIGlzRmlyc3RMaW5lLCBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50
VGV4dCkKICAgICA6IG1fYmxvY2soYmxvY2spCiAgICAgLCBtX3VuY29tbWl0dGVkV2lkdGgoMCkK
ICAgICAsIG1fY29tbWl0dGVkV2lkdGgoMCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9MaW5lV2lkdGguaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGgu
aAppbmRleCBmODhjMmFiYjEwYjdlYmYxOWI4OTJhMWNiZTNmNDI5MjRiODk0YmEwLi5lNzUyMmNm
ZmUwZjAwMDQxMTNmZTVhYTNmZTllYTc0ZDE2NzE1NzU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvTGluZVdpZHRoLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L0xpbmVXaWR0aC5oCkBAIC0zNSw3ICszNSw3IEBACiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNs
YXNzIEZsb2F0aW5nT2JqZWN0OwotY2xhc3MgUmVuZGVyQmxvY2s7CitjbGFzcyBSZW5kZXJCbG9j
a0Zsb3c7CiBjbGFzcyBSZW5kZXJPYmplY3Q7CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOwogCkBAIC00
NSw3ICs0NSw3IEBAIGVudW0gSW5kZW50VGV4dE9yTm90IHsgRG9Ob3RJbmRlbnRUZXh0LCBJbmRl
bnRUZXh0IH07CiAKIGNsYXNzIExpbmVXaWR0aCB7CiBwdWJsaWM6Ci0gICAgTGluZVdpZHRoKFJl
bmRlckJsb2NrJiwgYm9vbCBpc0ZpcnN0TGluZSwgSW5kZW50VGV4dE9yTm90IHNob3VsZEluZGVu
dFRleHQpOworICAgIExpbmVXaWR0aChSZW5kZXJCbG9ja0Zsb3cmLCBib29sIGlzRmlyc3RMaW5l
LCBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCk7CiAKICAgICBib29sIGZpdHNPbkxp
bmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkgY29uc3Q7CiAgICAgYm9vbCBm
aXRzT25MaW5lSW5jbHVkaW5nRXh0cmFXaWR0aChmbG9hdCBleHRyYSkgY29uc3Q7CkBAIC03NSw3
ICs3NSw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBjb21wdXRlQXZhaWxhYmxlV2lkdGhGcm9tTGVm
dEFuZFJpZ2h0KCk7CiAgICAgYm9vbCBmaXRzT25MaW5lRXhjbHVkaW5nVHJhaWxpbmdDb2xsYXBz
ZWRXaGl0ZXNwYWNlKCkgY29uc3Q7CiAKLSAgICBSZW5kZXJCbG9jayYgbV9ibG9jazsKKyAgICBS
ZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CiAgICAgZmxvYXQgbV91bmNvbW1pdHRlZFdpZHRoOwog
ICAgIGZsb2F0IG1fY29tbWl0dGVkV2lkdGg7CiAgICAgZmxvYXQgbV9vdmVyaGFuZ1dpZHRoOyAv
LyBUaGUgYW1vdW50IGJ5IHdoaWNoIHxtX2F2YWlsYWJsZVdpZHRofCBoYXMgYmVlbiBpbmZsYXRl
ZCB0byBhY2NvdW50IGZvciBwb3NzaWJsZSBjb250cmFjdGlvbiBkdWUgdG8gcnVieSBvdmVyaGFu
Zy4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCmluZGV4IGY4NTRmODRh
MmJiNGJjOGI1MjFmNmI1ZjU4MTYwODI2YTgwOTk4YzMuLmU1Y2Q4NmQzYjZmMzQxMGUwZjQwZWE0
MmM3N2Y3N2MzNTYzZTVlYjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9jay5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2Nr
LmNwcApAQCAtODMsNyArODMsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiB1c2luZyBuYW1lc3Bh
Y2UgSFRNTE5hbWVzOwogCiBzdHJ1Y3QgU2FtZVNpemVBc1JlbmRlckJsb2NrIDogcHVibGljIFJl
bmRlckJveCB7Ci0gICAgdm9pZCogcG9pbnRlcnNbMl07CisgICAgdm9pZCogcG9pbnRlcnNbMV07
CiAgICAgUmVuZGVyTGluZUJveExpc3QgbGluZUJveGVzOwogICAgIHVpbnQzMl90IGJpdGZpZWxk
czsKIH07CkBAIC0xMDcsOCArMTA3LDYgQEAgc3RhdGljIERlbGF5ZWRVcGRhdGVTY3JvbGxJbmZv
U2V0KiBnRGVsYXllZFVwZGF0ZVNjcm9sbEluZm9TZXQgPSAwOwogCiBzdGF0aWMgYm9vbCBnQ29s
dW1uRmxvd1NwbGl0RW5hYmxlZCA9IHRydWU7CiAKLWJvb2wgUmVuZGVyQmxvY2s6OnNfY2FuUHJv
cGFnYXRlRmxvYXRJbnRvU2libGluZyA9IGZhbHNlOwotCiAvLyBUaGlzIGNsYXNzIGhlbHBzIGRp
c3BhdGNoaW5nIHRoZSAnb3ZlcmZsb3cnIGV2ZW50IG9uIGxheW91dCBjaGFuZ2UuIG92ZXJmbG93
IGNhbiBiZSBzZXQgb24gUmVuZGVyQm94ZXMsIHlldCB0aGUgZXhpc3RpbmcgY29kZQogLy8gb25s
eSB3b3JrcyBvbiBSZW5kZXJCbG9ja3MuIElmIHRoaXMgY2hhbmdlLCB0aGlzIGNsYXNzIHNob3Vs
ZCBiZSBzaGFyZWQgd2l0aCBvdGhlciBSZW5kZXJCb3hlcy4KIGNsYXNzIE92ZXJmbG93RXZlbnRE
aXNwYXRjaGVyIHsKQEAgLTI1Niw3ICsyNTQsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjp3aWxsQmVE
ZXN0cm95ZWQoKQogdm9pZCBSZW5kZXJCbG9jazo6c3R5bGVXaWxsQ2hhbmdlKFN0eWxlRGlmZmVy
ZW5jZSBkaWZmLCBjb25zdCBSZW5kZXJTdHlsZSogbmV3U3R5bGUpCiB7CiAgICAgUmVuZGVyU3R5
bGUqIG9sZFN0eWxlID0gc3R5bGUoKTsKLSAgICBzX2NhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxp
bmcgPSBvbGRTdHlsZSA/ICFpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2
b2lkc0Zsb2F0cygpIDogZmFsc2U7CiAKICAgICBzZXRSZXBsYWNlZChuZXdTdHlsZS0+aXNEaXNw
bGF5SW5saW5lVHlwZSgpKTsKICAgICAKQEAgLTI4MCw5ICsyNzcsNiBAQCB2b2lkIFJlbmRlckJs
b2NrOjpzdHlsZVdpbGxDaGFuZ2UoU3R5bGVEaWZmZXJlbmNlIGRpZmYsIGNvbnN0IFJlbmRlclN0
eWxlKiBuZXdTdAogICAgICAgICAgICAgaWYgKGNiLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAg
ICAgICAgICAgdG9SZW5kZXJCbG9jayhjYiktPnJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKHRoaXMs
IE5ld0NvbnRhaW5pbmdCbG9jayk7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGFpbnNG
bG9hdHMoKSAmJiAhaXNGbG9hdGluZygpICYmICFpc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiBu
ZXdTdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSkKLSAgICAgICAgICAgIG1hcmtBbGxEZXNj
ZW5kYW50c1dpdGhGbG9hdHNGb3JMYXlvdXQoKTsKICAgICB9CiAKICAgICBSZW5kZXJCb3g6OnN0
eWxlV2lsbENoYW5nZShkaWZmLCBuZXdTdHlsZSk7CkBAIC0zMjQsMzYgKzMxOCw2IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSBkaWZmLCBjb25zdCBS
ZW5kZXJTdHlsZSogb2xkU3R5CiAKICAgICBwcm9wYWdhdGVTdHlsZVRvQW5vbnltb3VzQ2hpbGRy
ZW4oUHJvcGFnYXRlVG9CbG9ja0NoaWxkcmVuT25seSk7CiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7
Ci0KLSAgICAvLyBBZnRlciBvdXIgc3R5bGUgY2hhbmdlZCwgaWYgd2UgbG9zZSBvdXIgYWJpbGl0
eSB0byBwcm9wYWdhdGUgZmxvYXRzIGludG8gbmV4dCBzaWJsaW5nCi0gICAgLy8gYmxvY2tzLCB0
aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgdG9wIG1vc3QgcGFyZW50IGNvbnRhaW5pbmcgdGhhdCBv
dmVyaGFuZ2luZyBmbG9hdCBhbmQKLSAgICAvLyB0aGVuIG1hcmsgaXRzIGRlc2NlbmRhbnRzIHdp
dGggZmxvYXRzIGZvciBsYXlvdXQgYW5kIGNsZWFyIGFsbCBmbG9hdHMgZnJvbSBpdHMgbmV4dAot
ICAgIC8vIHNpYmxpbmcgYmxvY2tzIHRoYXQgZXhpc3QgaW4gb3VyIGZsb2F0aW5nIG9iamVjdHMg
bGlzdC4gU2VlIGJ1ZyA1NjI5OSBhbmQgNjI4NzUuCi0gICAgYm9vbCBjYW5Qcm9wYWdhdGVGbG9h
dEludG9TaWJsaW5nID0gIWlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhYXZv
aWRzRmxvYXRzKCk7Ci0gICAgaWYgKGRpZmYgPT0gU3R5bGVEaWZmZXJlbmNlTGF5b3V0ICYmIHNf
Y2FuUHJvcGFnYXRlRmxvYXRJbnRvU2libGluZyAmJiAhY2FuUHJvcGFnYXRlRmxvYXRJbnRvU2li
bGluZyAmJiBoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBw
YXJlbnRCbG9jayA9IHRoaXM7Ci0gICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9h
dGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICAgICAgYXV0byBl
bmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLQotICAgICAgICBmb3IgKFJlbmRlck9iamVj
dCogY3VyciA9IHBhcmVudCgpOyBjdXJyICYmICFjdXJyLT5pc1JlbmRlclZpZXcoKTsgY3VyciA9
IGN1cnItPnBhcmVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+aXNSZW5kZXJCbG9jaygp
KSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGN1cnJCbG9jayA9IHRvUmVuZGVyQmxv
Y2soY3Vycik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VyckJsb2NrLT5oYXNPdmVyaGFuZ2lu
Z0Zsb2F0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5n
T2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgUmVuZGVyQm94JiByZW5kZXJlciA9ICgqaXQpLT5yZW5kZXJlcigpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGN1cnJCbG9jay0+aGFzT3ZlcmhhbmdpbmdGbG9hdCgmcmVuZGVy
ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2sgPSBjdXJyQmxv
Y2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgIHBhcmVudEJsb2Nr
LT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgICAgIHBhcmVu
dEJsb2NrLT5tYXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgfQogICAgIAog
ICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIG91ciBib3JkZXIvcGFkZGluZyB0byBjaGFuZ2UsIGJ1
dCBmb3IgdGhlIG92ZXJhbGwgbG9naWNhbCB3aWR0aCBvZiB0aGUgYmxvY2sgdG8KICAgICAvLyBl
bmQgdXAgYmVpbmcgdGhlIHNhbWUuIFdlIGtlZXAgdHJhY2sgb2YgdGhpcyBjaGFuZ2Ugc28gaW4g
bGF5b3V0QmxvY2ssIHdlIGNhbiBrbm93IHRvIHNldCByZWxheW91dENoaWxkcmVuPXRydWUuCkBA
IC02MjUsNyArNTg5LDkgQEAgdm9pZCBSZW5kZXJCbG9jazo6c3BsaXRGbG93KFJlbmRlck9iamVj
dCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwKICAgICAgICAgLy8gV2Ug
Y2FuIHJldXNlIHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBuZXh0
IGNvbnRpbnVhdGlvbi4KICAgICAgICAgcHJlID0gYmxvY2s7CiAgICAgICAgIHByZS0+cmVtb3Zl
UG9zaXRpb25lZE9iamVjdHMoMCk7Ci0gICAgICAgIHByZS0+cmVtb3ZlRmxvYXRpbmdPYmplY3Rz
KCk7CisgICAgICAgIC8vIEZJWE1FLUJMT0NLRkxPVyByZW1vdmUgdGhpcyB3aGVuIHNwbGl0Rmxv
dyBpcyBtb3ZlZCB0byBSZW5kZXJCbG9ja0Zsb3cuCisgICAgICAgIGlmIChwcmUtPmlzUmVuZGVy
QmxvY2tGbG93KCkpCisgICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyhwcmUpLT5yZW1vdmVG
bG9hdGluZ09iamVjdHMoKTsKICAgICAgICAgYmxvY2sgPSB0b1JlbmRlckJsb2NrKGJsb2NrLT5w
YXJlbnQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2
YWlsYWJsZSBmb3IgdXNlLiAgTWFrZSBvbmUuCkBAIC05MzgsOCArOTA0LDYgQEAgc3RhdGljIHZv
aWQgZ2V0SW5saW5lUnVuKFJlbmRlck9iamVjdCogc3RhcnQsIFJlbmRlck9iamVjdCogYm91bmRh
cnksCiAKIHZvaWQgUmVuZGVyQmxvY2s6OmRlbGV0ZUxpbmVCb3hUcmVlKCkKIHsKLSAgICBpZiAo
Y29udGFpbnNGbG9hdHMoKSkKLSAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmNsZWFyTGluZUJv
eFRyZWVQb2ludGVycygpOwogICAgIG1fbGluZUJveGVzLmRlbGV0ZUxpbmVCb3hUcmVlKHJlbmRl
ckFyZW5hKCkpOwogCiAgICAgaWYgKEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gZG9jdW1lbnQoKS5l
eGlzdGluZ0FYT2JqZWN0Q2FjaGUoKSkKQEAgLTExMjMsNDYgKzEwODcsNiBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpjb2xsYXBzZUFub255bW91c0JveENoaWxkKFJlbmRlckJsb2NrKiBwYXJlbnQsIFJl
bmRlckJsb2NrKiBjaAogICAgIGNoaWxkLT5kZXN0cm95KCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxv
Y2s6Om1vdmVBbGxDaGlsZHJlbkluY2x1ZGluZ0Zsb2F0c1RvKFJlbmRlckJsb2NrKiB0b0Jsb2Nr
LCBib29sIGZ1bGxSZW1vdmVJbnNlcnQpCi17Ci0gICAgbW92ZUFsbENoaWxkcmVuVG8odG9CbG9j
aywgZnVsbFJlbW92ZUluc2VydCk7Ci0KLSAgICAvLyBXaGVuIGEgcG9ydGlvbiBvZiB0aGUgcmVu
ZGVyIHRyZWUgaXMgYmVpbmcgZGV0YWNoZWQsIGFub255bW91cyBibG9ja3MKLSAgICAvLyB3aWxs
IGJlIGNvbWJpbmVkIGFzIHRoZWlyIGNoaWxkcmVuIGFyZSBkZWxldGVkLiBJbiB0aGlzIHByb2Nl
c3MsIHRoZQotICAgIC8vIGFub255bW91cyBibG9jayBsYXRlciBpbiB0aGUgdHJlZSBpcyBtZXJn
ZWQgaW50byB0aGUgb25lIHByZWNlZWRpbmcgaXQuCi0gICAgLy8gSXQgY2FuIGhhcHBlbiB0aGF0
IHRoZSBsYXRlciBibG9jayAodGhpcykgY29udGFpbnMgZmxvYXRzIHRoYXQgdGhlCi0gICAgLy8g
cHJldmlvdXMgYmxvY2sgKHRvQmxvY2spIGRpZCBub3QgY29udGFpbiwgYW5kIHRodXMgYXJlIG5v
dCBpbiB0aGUKLSAgICAvLyBmbG9hdGluZyBvYmplY3RzIGxpc3QgZm9yIHRvQmxvY2suIFRoaXMg
Y2FuIHJlc3VsdCBpbiB0b0Jsb2NrIGNvbnRhaW5pbmcKLSAgICAvLyBmbG9hdHMgdGhhdCBhcmUg
bm90IGluIGl0J3MgZmxvYXRpbmcgb2JqZWN0cyBsaXN0LCBidXQgYXJlIGluIHRoZQotICAgIC8v
IGZsb2F0aW5nIG9iamVjdHMgbGlzdHMgb2Ygc2libGluZ3MgYW5kIHBhcmVudHMuIFRoaXMgY2Fu
IGNhdXNlIHByb2JsZW1zCi0gICAgLy8gd2hlbiB0aGUgZmxvYXQgaXRzZWxmIGlzIGRlbGV0ZWQs
IHNpbmNlIHRoZSBkZWxldGlvbiBjb2RlIGFzc3VtZXMgdGhhdAotICAgIC8vIGlmIGEgZmxvYXQg
aXMgbm90IGluIGl0J3MgY29udGFpbmluZyBibG9jaydzIGZsb2F0aW5nIG9iamVjdHMgbGlzdCwg
aXQKLSAgICAvLyBpc24ndCBpbiBhbnkgZmxvYXRpbmcgb2JqZWN0cyBsaXN0LiBJbiBvcmRlciB0
byBwcmVzZXJ2ZSB0aGlzIGNvbmRpdGlvbgotICAgIC8vIChyZW1vdmluZyBpdCBoYXMgc2VyaW91
cyBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMpLCB3ZSBuZWVkIHRvIGNvcHkgdGhlCi0gICAgLy8g
ZmxvYXRpbmcgb2JqZWN0cyBmcm9tIHRoZSBvbGQgYmxvY2sgKHRoaXMpIHRvIHRoZSBuZXcgYmxv
Y2sgKHRvQmxvY2spLgotICAgIC8vIFRoZSBmbG9hdCdzIG1ldHJpY3Mgd2lsbCBsaWtlbHkgYWxs
IGJlIHdyb25nLCBidXQgc2luY2UgdG9CbG9jayBpcwotICAgIC8vIGFscmVhZHkgbWFya2VkIGZv
ciBsYXlvdXQsIHRoaXMgd2lsbCBnZXQgZml4ZWQgYmVmb3JlIGFueXRoaW5nIGdldHMKLSAgICAv
LyBkaXNwbGF5ZWQuCi0gICAgLy8gU2VlIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTE1NTY2Ci0gICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKSB7Ci0gICAgICAg
IGlmICghdG9CbG9jay0+bV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgICAgICB0b0Jsb2NrLT5j
cmVhdGVGbG9hdGluZ09iamVjdHMoKTsKLQotICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNl
dCYgZnJvbUZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAg
ICAgICBhdXRvIGVuZCA9IGZyb21GbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLQotICAgICAgICBm
b3IgKGF1dG8gaXQgPSBmcm9tRmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyAr
K2l0KSB7Ci0gICAgICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+
Z2V0KCk7Ci0KLSAgICAgICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgb2JqZWN0IGFnYWluIGlm
IGl0J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgaWYgKHRvQmxvY2stPmNvbnRh
aW5zRmxvYXQoJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpKSkKLSAgICAgICAgICAgICAgICBj
b250aW51ZTsKLQotICAgICAgICAgICAgdG9CbG9jay0+bV9mbG9hdGluZ09iamVjdHMtPmFkZChm
bG9hdGluZ09iamVjdC0+dW5zYWZlQ2xvbmUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHZv
aWQgUmVuZGVyQmxvY2s6OnJlbW92ZUNoaWxkKFJlbmRlck9iamVjdCogb2xkQ2hpbGQpCiB7CiAg
ICAgLy8gTm8gbmVlZCB0byB3YXN0ZSB0aW1lIGluIG1lcmdpbmcgb3IgcmVtb3ZpbmcgZW1wdHkg
YW5vbnltb3VzIGJsb2Nrcy4KQEAgLTE2MTMsMTYgKzE1MzcsMTMgQEAgdm9pZCBSZW5kZXJCbG9j
azo6YWRkT3ZlcmZsb3dGcm9tQ2hpbGRyZW4oKQogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJCbG9j
azo6Y29tcHV0ZU92ZXJmbG93KExheW91dFVuaXQgb2xkQ2xpZW50QWZ0ZXJFZGdlLCBib29sIHJl
Y29tcHV0ZUZsb2F0cykKK3ZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVPdmVyZmxvdyhMYXlvdXRV
bml0IG9sZENsaWVudEFmdGVyRWRnZSwgYm9vbCkKIHsKICAgICBjbGVhck92ZXJmbG93KCk7CiAK
ICAgICAvLyBBZGQgb3ZlcmZsb3cgZnJvbSBjaGlsZHJlbi4KICAgICBhZGRPdmVyZmxvd0Zyb21D
aGlsZHJlbigpOwogCi0gICAgaWYgKCFoYXNDb2x1bW5zKCkgJiYgKHJlY29tcHV0ZUZsb2F0cyB8
fCBpc1Jvb3QoKSB8fCBleHBhbmRzVG9FbmNsb3NlT3ZlcmhhbmdpbmdGbG9hdHMoKSB8fCBoYXNT
ZWxmUGFpbnRpbmdMYXllcigpKSkKLSAgICAgICAgYWRkT3ZlcmZsb3dGcm9tRmxvYXRzKCk7Ci0K
ICAgICAvLyBBZGQgaW4gdGhlIG92ZXJmbG93IGZyb20gcG9zaXRpb25lZCBvYmplY3RzLgogICAg
IGFkZE92ZXJmbG93RnJvbVBvc2l0aW9uZWRPYmplY3RzKCk7CiAKQEAgLTE2NzMsMjAgKzE1OTQs
NiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21CbG9ja0NoaWxkcmVuKCkKICAg
ICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygpCi17Ci0g
ICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3Qg
RmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMt
PnNldCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgZm9y
IChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7
Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAgICAgICBpZiAoci0+
aXNEZXNjZW5kYW50KCkpCi0gICAgICAgICAgICBhZGRPdmVyZmxvd0Zyb21DaGlsZCgmci0+cmVu
ZGVyZXIoKSwgSW50U2l6ZSh4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwgeVBv
c2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4ocikpKTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVu
ZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbVBvc2l0aW9uZWRPYmplY3RzKCkKIHsKICAgICBUcmFj
a2VkUmVuZGVyZXJMaXN0SGFzaFNldCogcG9zaXRpb25lZERlc2NlbmRhbnRzID0gcG9zaXRpb25l
ZE9iamVjdHMoKTsKQEAgLTIxODMsMzIgKzIwOTAsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjptYXJr
Rm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVkZWQoKQogICAgICAgICBzZXRDaGlsZE5lZWRzTGF5
b3V0KE1hcmtPbmx5VGhpcyk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnJlcGFpbnRPdmVyaGFu
Z2luZ0Zsb2F0cyhib29sIHBhaW50QWxsRGVzY2VuZGFudHMpCi17Ci0gICAgLy8gUmVwYWludCBh
bnkgb3ZlcmhhbmdpbmcgZmxvYXRzIChpZiB3ZSBrbm93IHdlJ3JlIHRoZSBvbmUgdG8gcGFpbnQg
dGhlbSkuCi0gICAgLy8gT3RoZXJ3aXNlLCBiYWlsIG91dC4KLSAgICBpZiAoIWhhc092ZXJoYW5n
aW5nRmxvYXRzKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZJWE1FOiBBdm9pZCBkaXNh
YmxpbmcgTGF5b3V0U3RhdGUuIEF0IHRoZSB2ZXJ5IGxlYXN0LCBkb24ndCBkaXNhYmxlIGl0IGZv
ciBmbG9hdHMgb3JpZ2luYXRpbmcKLSAgICAvLyBpbiB0aGlzIGJsb2NrLiBCZXR0ZXIgeWV0IHdv
dWxkIGJlIHRvIHB1c2ggZXh0cmEgc3RhdGUgZm9yIHRoZSBjb250YWluZXJzIG9mIG90aGVyIGZs
b2F0cy4KLSAgICBMYXlvdXRTdGF0ZURpc2FibGVyIGxheW91dFN0YXRlRGlzYWJsZXIoJnZpZXco
KSk7Ci0gICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9m
bG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQu
ZW5kKCk7Ci0gICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwot
ICAgICAgICAvLyBPbmx5IHJlcGFpbnQgdGhlIG9iamVjdCBpZiBpdCBpcyBvdmVyaGFuZ2luZywg
aXMgbm90IGluIGl0cyBvd24gbGF5ZXIsIGFuZAotICAgICAgICAvLyBpcyBvdXIgcmVzcG9uc2li
aWxpdHkgdG8gcGFpbnQgKG1fc2hvdWxkUGFpbnQgaXMgc2V0KS4gV2hlbiBwYWludEFsbERlc2Nl
bmRhbnRzIGlzIHRydWUsIHRoZSBsYXR0ZXIKLSAgICAgICAgLy8gY29uZGl0aW9uIGlzIHJlcGxh
Y2VkIHdpdGggYmVpbmcgYSBkZXNjZW5kYW50IG9mIHVzLgotICAgICAgICBpZiAoci0+bG9naWNh
bEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSA+IGxvZ2ljYWxIZWlnaHQoKQotICAg
ICAgICAgICAgJiYgIXItPnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKQotICAgICAg
ICAgICAgJiYgKHItPnNob3VsZFBhaW50KCkgfHwgKHBhaW50QWxsRGVzY2VuZGFudHMgJiYgci0+
cmVuZGVyZXIoKS5pc0Rlc2NlbmRhbnRPZih0aGlzKSkpKSB7Ci0gICAgICAgICAgICByLT5yZW5k
ZXJlcigpLnJlcGFpbnQoKTsKLSAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucmVwYWludE92ZXJo
YW5naW5nRmxvYXRzKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLSAKIHZvaWQgUmVuZGVy
QmxvY2s6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFp
bnRPZmZzZXQpCiB7CiAgICAgTGF5b3V0UG9pbnQgYWRqdXN0ZWRQYWludE9mZnNldCA9IHBhaW50
T2Zmc2V0ICsgbG9jYXRpb24oKTsKQEAgLTI2MDEsMzYgKzI0ODIsNiBAQCBMYXlvdXRQb2ludCBS
ZW5kZXJCbG9jazo6ZmxpcEZsb2F0Rm9yV3JpdGluZ01vZGVGb3JDaGlsZChjb25zdCBGbG9hdGlu
Z09iamVjdCogYwogICAgIHJldHVybiBMYXlvdXRQb2ludChwb2ludC54KCkgKyB3aWR0aCgpIC0g
Y2hpbGQtPnJlbmRlcmVyKCkud2lkdGgoKSAtIDIgKiB4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGlu
Z01hcmdpbihjaGlsZCksIHBvaW50LnkoKSk7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnBhaW50
RmxvYXRzKFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZz
ZXQsIGJvb2wgcHJlc2VydmVQaGFzZSkKLXsKLSAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdP
YmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgYXV0byBlbmQgPSBmbG9h
dGluZ09iamVjdFNldC5lbmQoKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNl
dC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIHIg
PSBpdC0+Z2V0KCk7Ci0gICAgICAgIC8vIE9ubHkgcGFpbnQgdGhlIG9iamVjdCBpZiBvdXIgbV9z
aG91bGRQYWludCBmbGFnIGlzIHNldC4KLSAgICAgICAgaWYgKHItPnNob3VsZFBhaW50KCkgJiYg
IXItPnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgUGFp
bnRJbmZvIGN1cnJlbnRQYWludEluZm8ocGFpbnRJbmZvKTsKLSAgICAgICAgICAgIGN1cnJlbnRQ
YWludEluZm8ucGhhc2UgPSBwcmVzZXJ2ZVBoYXNlID8gcGFpbnRJbmZvLnBoYXNlIDogUGFpbnRQ
aGFzZUJsb2NrQmFja2dyb3VuZDsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBMYXlvdXRQb2ludCB2
ZXJzaW9uIG9mIHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luIHdvdWxkIG1ha2UgdGhp
cyBtdWNoIGNsZWFuZXIuCi0gICAgICAgICAgICBMYXlvdXRQb2ludCBjaGlsZFBvaW50ID0gZmxp
cEZsb2F0Rm9yV3JpdGluZ01vZGVGb3JDaGlsZChyLCBMYXlvdXRQb2ludChwYWludE9mZnNldC54
KCkgKyB4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSAtIHItPnJlbmRlcmVyKCku
eCgpLCBwYWludE9mZnNldC55KCkgKyB5UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihy
KSAtIHItPnJlbmRlcmVyKCkueSgpKSk7Ci0gICAgICAgICAgICByLT5yZW5kZXJlcigpLnBhaW50
KGN1cnJlbnRQYWludEluZm8sIGNoaWxkUG9pbnQpOwotICAgICAgICAgICAgaWYgKCFwcmVzZXJ2
ZVBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IFBhaW50
UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHM7Ci0gICAgICAgICAgICAgICAgci0+cmVuZGVyZXIo
KS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKLSAgICAgICAgICAgICAgICBj
dXJyZW50UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZUZsb2F0OwotICAgICAgICAgICAgICAg
IHItPnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5mbywgY2hpbGRQb2ludCk7Ci0gICAg
ICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IFBhaW50UGhhc2VGb3JlZ3JvdW5k
OwotICAgICAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5mbywg
Y2hpbGRQb2ludCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IFBh
aW50UGhhc2VPdXRsaW5lOwotICAgICAgICAgICAgICAgIHItPnJlbmRlcmVyKCkucGFpbnQoY3Vy
cmVudFBhaW50SW5mbywgY2hpbGRQb2ludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci19Ci0KIFJlbmRlcklubGluZSogUmVuZGVyQmxvY2s6OmlubGluZUVsZW1lbnRDb250aW51
YXRpb24oKSBjb25zdAogeyAKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9u
ID0gdGhpcy0+Y29udGludWF0aW9uKCk7CkBAIC0yODM0LDE5ICsyNjg1LDcgQEAgR2FwUmVjdHMg
UmVuZGVyQmxvY2s6OnNlbGVjdGlvbkdhcHMoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgY29uc3Qg
TGF5b3V0UG9pbnQmIHIKICAgICAgICAgaWYgKGlzQm9keSgpIHx8IGlzUm9vdCgpKSAvLyBUaGUg
PGJvZHk+IG11c3QgbWFrZSBzdXJlIHRvIGV4YW1pbmUgaXRzIGNvbnRhaW5pbmdCbG9jaydzIHBv
c2l0aW9uZWQgb2JqZWN0cy4KICAgICAgICAgICAgIGZvciAoUmVuZGVyQmxvY2sqIGNiID0gY29u
dGFpbmluZ0Jsb2NrKCk7IGNiICYmICFjYi0+aXNSZW5kZXJWaWV3KCk7IGNiID0gY2ItPmNvbnRh
aW5pbmdCbG9jaygpKQogICAgICAgICAgICAgICAgIGNsaXBPdXRQb3NpdGlvbmVkT2JqZWN0cyhw
YWludEluZm8sIExheW91dFBvaW50KGNiLT54KCksIGNiLT55KCkpLCBjYi0+cG9zaXRpb25lZE9i
amVjdHMoKSk7IC8vIEZJWE1FOiBOb3QgcmlnaHQgZm9yIGZsaXBwZWQgd3JpdGluZyBtb2Rlcy4K
LSAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKSB7Ci0gICAgICAgICAgICBjb25zdCBGbG9h
dGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0
KCk7Ci0gICAgICAgICAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOwotICAg
ICAgICAgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgRmxvYXRpbmdPYmplY3QqIHIgPSBpdC0+Z2V0
KCk7Ci0gICAgICAgICAgICAgICAgTGF5b3V0UmVjdCBmbG9hdEJveChvZmZzZXRGcm9tUm9vdEJs
b2NrLndpZHRoKCkgKyB4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldEZyb21Sb290QmxvY2suaGVpZ2h0
KCkgKyB5UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHItPnJlbmRlcmVyKCkud2lkdGgoKSwgci0+cmVuZGVyZXIo
KS5oZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgcm9vdEJsb2NrLT5mbGlwRm9yV3JpdGluZ01v
ZGUoZmxvYXRCb3gpOwotICAgICAgICAgICAgICAgIGZsb2F0Qm94Lm1vdmUocm9vdEJsb2NrUGh5
c2ljYWxQb3NpdGlvbi54KCksIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRpb24ueSgpKTsKLSAgICAg
ICAgICAgICAgICBwYWludEluZm8tPmNvbnRleHQtPmNsaXBPdXQocGl4ZWxTbmFwcGVkSW50UmVj
dChmbG9hdEJveCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGNsaXBPdXRG
bG9hdGluZ09iamVjdHMocm9vdEJsb2NrLCBwYWludEluZm8sIHJvb3RCbG9ja1BoeXNpY2FsUG9z
aXRpb24sIG9mZnNldEZyb21Sb290QmxvY2spOwogICAgIH0KIAogICAgIC8vIEZJWE1FOiBvdmVy
ZmxvdzogYXV0by9zY3JvbGwgcmVnaW9ucyBuZWVkIG1vcmUgbWF0aCBoZXJlLCBzaW5jZSBwYWlu
dGluZyBpbiB0aGUgYm9yZGVyIGJveCBpcyBkaWZmZXJlbnQgZnJvbSBwYWludGluZyBpbiB0aGUg
cGFkZGluZyBib3ggKG9uZSBpcyBzY3JvbGxlZCwgdGhlIG90aGVyIGlzCkBAIC0zMjU2LDMxOCAr
MzA5NSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKFJlbmRl
ckJsb2NrKiBvLCBDb250YWluaW5nQmxvY2tTdGF0ZSBjCiAgICAgICAgIHJlbW92ZVBvc2l0aW9u
ZWRPYmplY3QoZGVhZE9iamVjdHMuYXQoaSkpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpyZW1v
dmVGbG9hdGluZ09iamVjdHMoKQotewotICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fZmxvYXRpbmdPYmplY3RzLT5jbGVhcigpOwotfQotCi1GbG9h
dGluZ09iamVjdCogUmVuZGVyQmxvY2s6Omluc2VydEZsb2F0aW5nT2JqZWN0KFJlbmRlckJveCog
bykKLXsKLSAgICBBU1NFUlQoby0+aXNGbG9hdGluZygpKTsKLQotICAgIC8vIENyZWF0ZSB0aGUg
bGlzdCBvZiBzcGVjaWFsIG9iamVjdHMgaWYgd2UgZG9uJ3QgYWxlYWR5IGhhdmUgb25lCi0gICAg
aWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7
Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgb2JqZWN0IGFnYWluIGlm
IGl0J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAotICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNl
dCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgICAg
IGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5maW5kPFJlbmRlckJveCYsIEZsb2F0aW5nT2Jq
ZWN0SGFzaFRyYW5zbGF0b3I+KCpvKTsKLSAgICAgICAgaWYgKGl0ICE9IGZsb2F0aW5nT2JqZWN0
U2V0LmVuZCgpKQotICAgICAgICAgICAgcmV0dXJuIGl0LT5nZXQoKTsKLSAgICB9Ci0KLSAgICAv
LyBDcmVhdGUgdGhlIHNwZWNpYWwgb2JqZWN0IGVudHJ5ICYgYXBwZW5kIGl0IHRvIHRoZSBsaXN0
Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RmxvYXRpbmdPYmplY3Q+IG9iamVjdCA9IEZsb2F0aW5n
T2JqZWN0OjpjcmVhdGUoKm8pOwotICAgIAotICAgIC8vIE91ciBsb2NhdGlvbiBpcyBpcnJlbGV2
YW50IGlmIHdlJ3JlIHVuc3BsaXR0YWJsZSBvciBubyBwYWdpbmF0aW9uIGlzIGluIGVmZmVjdC4K
LSAgICAvLyBKdXN0IGdvIGFoZWFkIGFuZCBsYXkgb3V0IHRoZSBmbG9hdC4KLSAgICBib29sIGlz
Q2hpbGRSZW5kZXJCbG9jayA9IG8tPmlzUmVuZGVyQmxvY2soKTsKLSAgICBpZiAoaXNDaGlsZFJl
bmRlckJsb2NrICYmICFvLT5uZWVkc0xheW91dCgpICYmIHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5w
YWdlTG9naWNhbEhlaWdodENoYW5nZWQoKSkKLSAgICAgICAgby0+c2V0Q2hpbGROZWVkc0xheW91
dChNYXJrT25seVRoaXMpOwotICAgICAgICAgICAgCi0gICAgYm9vbCBuZWVkc0Jsb2NrRGlyZWN0
aW9uTG9jYXRpb25TZXRCZWZvcmVMYXlvdXQgPSBpc0NoaWxkUmVuZGVyQmxvY2sgJiYgdmlldygp
LmxheW91dFN0YXRlKCktPm5lZWRzQmxvY2tEaXJlY3Rpb25Mb2NhdGlvblNldEJlZm9yZUxheW91
dCgpOwotICAgIGlmICghbmVlZHNCbG9ja0RpcmVjdGlvbkxvY2F0aW9uU2V0QmVmb3JlTGF5b3V0
IHx8IGlzV3JpdGluZ01vZGVSb290KCkpIC8vIFdlIGFyZSB1bnNwbGl0dGFibGUgaWYgd2UncmUg
YSBibG9jayBmbG93IHJvb3QuCi0gICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7Ci0gICAgZWxz
ZSB7Ci0gICAgICAgIG8tPnVwZGF0ZUxvZ2ljYWxXaWR0aCgpOwotICAgICAgICBvLT5jb21wdXRl
QW5kU2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5zKHRoaXMpOwotICAgIH0KLQotICAgIG9iamVjdC0+
c2V0TG9naWNhbFdpZHRoKGxvZ2ljYWxXaWR0aEZvckNoaWxkKG8pICsgbWFyZ2luU3RhcnRGb3JD
aGlsZChvKSArIG1hcmdpbkVuZEZvckNoaWxkKG8pLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KTsKLQotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotICAgIGlmIChTaGFwZU91dHNpZGVJbmZvKiBz
aGFwZU91dHNpZGUgPSBvLT5zaGFwZU91dHNpZGVJbmZvKCkpCi0gICAgICAgIHNoYXBlT3V0c2lk
ZS0+c2V0U2hhcGVTaXplKGxvZ2ljYWxXaWR0aEZvckNoaWxkKG8pLCBsb2dpY2FsSGVpZ2h0Rm9y
Q2hpbGQobykpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMtPmFkZChz
dGQ6Om1vdmUob2JqZWN0KSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUZsb2F0aW5n
T2JqZWN0KFJlbmRlckJveCogbykKLXsKLSAgICBpZiAobV9mbG9hdGluZ09iamVjdHMpIHsKLSAg
ICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9h
dGluZ09iamVjdHMtPnNldCgpOwotICAgICAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQu
ZmluZDxSZW5kZXJCb3gmLCBGbG9hdGluZ09iamVjdEhhc2hUcmFuc2xhdG9yPigqbyk7Ci0gICAg
ICAgIGlmIChpdCAhPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKSkgewotICAgICAgICAgICAgRmxv
YXRpbmdPYmplY3QqIHIgPSBpdC0+Z2V0KCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW5Jbmxp
bmUoKSkgewotICAgICAgICAgICAgICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IHItPmxvZ2lj
YWxUb3AoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7Ci0gICAgICAgICAgICAgICAgTGF5b3V0
VW5pdCBsb2dpY2FsQm90dG9tID0gci0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTU0OTk1LgotICAgICAgICAgICAgICAgIGlmIChsb2dpY2Fs
Qm90dG9tIDwgMCB8fCBsb2dpY2FsQm90dG9tIDwgbG9naWNhbFRvcCB8fCBsb2dpY2FsVG9wID09
IExheW91dFVuaXQ6Om1heCgpKQotICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQm90dG9tID0g
TGF5b3V0VW5pdDo6bWF4KCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIFNwZWNpYWwtY2FzZSB6ZXJvLSBhbmQgbGVzcy10aGFuLXplcm8taGVpZ2h0IGZs
b2F0czogdGhvc2UgZG9uJ3QgdG91Y2gKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpbmUg
dGhhdCB0aGV5J3JlIG9uLCBidXQgaXQgc3RpbGwgbmVlZHMgdG8gYmUgZGlydGllZC4gVGhpcyBp
cwotICAgICAgICAgICAgICAgICAgICAvLyBhY2NvbXBsaXNoZWQgYnkgcHJldGVuZGluZyB0aGV5
IGhhdmUgYSBoZWlnaHQgb2YgMS4KLSAgICAgICAgICAgICAgICAgICAgbG9naWNhbEJvdHRvbSA9
IG1heChsb2dpY2FsQm90dG9tLCBsb2dpY2FsVG9wICsgMSk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIGlmIChyLT5vcmlnaW5hdGluZ0xpbmUoKSkgewotICAgICAgICAgICAg
ICAgICAgICBpZiAoIXNlbGZOZWVkc0xheW91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBBU1NFUlQoJnItPm9yaWdpbmF0aW5nTGluZSgpLT5yZW5kZXJlcigpID09IHRoaXMpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgci0+b3JpZ2luYXRpbmdMaW5lKCktPm1hcmtEaXJ0eSgpOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgICAgICAgICAg
ICAgICAgICByLT5zZXRPcmlnaW5hdGluZ0xpbmUoMCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgbWFya0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UoMCwgbG9naWNh
bEJvdHRvbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+
cmVtb3ZlKHIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrOjpyZW1v
dmVGbG9hdGluZ09iamVjdHNCZWxvdyhGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0LCBpbnQgbG9n
aWNhbE9mZnNldCkKLXsKLSAgICBpZiAoIWNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQg
PSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7Ci0gICAgRmxvYXRpbmdPYmplY3QqIGN1cnIgPSBm
bG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCk7Ci0gICAgd2hpbGUgKGN1cnIgIT0gbGFzdEZs
b2F0ICYmICghY3Vyci0+aXNQbGFjZWQoKSB8fCBjdXJyLT5sb2dpY2FsVG9wKGlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKCkpID49IGxvZ2ljYWxPZmZzZXQpKSB7Ci0gICAgICAgIG1fZmxvYXRpbmdP
YmplY3RzLT5yZW1vdmUoY3Vycik7Ci0gICAgICAgIGlmIChmbG9hdGluZ09iamVjdFNldC5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY3VyciA9IGZsb2F0aW5nT2JqZWN0
U2V0Lmxhc3QoKS5nZXQoKTsKLSAgICB9Ci19Ci0KLUxheW91dFBvaW50IFJlbmRlckJsb2NrOjpj
b21wdXRlTG9naWNhbExvY2F0aW9uRm9yRmxvYXQoY29uc3QgRmxvYXRpbmdPYmplY3QqIGZsb2F0
aW5nT2JqZWN0LCBMYXlvdXRVbml0IGxvZ2ljYWxUb3BPZmZzZXQpIGNvbnN0Ci17Ci0gICAgUmVu
ZGVyQm94KiBjaGlsZEJveCA9ICZmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKTsKLSAgICBMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0T2Zmc2V0ID0gbG9naWNhbExlZnRPZmZzZXRGb3JDb250ZW50KGxv
Z2ljYWxUb3BPZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9mIGxlZnQgb2Zmc2V0LgotICAgIExh
eW91dFVuaXQgbG9naWNhbFJpZ2h0T2Zmc2V0OyAvLyBDb25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9m
ZnNldC4KLSNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKLSAgICAvLyBGSVhNRSBCdWcgMTAyOTQ4OiBU
aGlzIG9ubHkgd29ya3MgZm9yIHNoYXBlIG91dHNpZGUgZGlyZWN0bHkgc2V0IG9uIHRoaXMgYmxv
Y2suCi0gICAgU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluc2lkZUluZm8gPSB0aGlzLT5sYXlvdXRT
aGFwZUluc2lkZUluZm8oKTsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IGJlaGF2aW9yIGZvciBy
aWdodCBmbG9hdHMuCi0gICAgaWYgKHNoYXBlSW5zaWRlSW5mbykgewotICAgICAgICBMYXlvdXRT
aXplIGZsb2F0TG9naWNhbFNpemUgPSBMYXlvdXRTaXplKGNoaWxkQm94LT5sb2dpY2FsV2lkdGgo
KSwgY2hpbGRCb3gtPmxvZ2ljYWxIZWlnaHQoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB0aGUg
ZmxvYXQgZG9lc24ndCBmaXQgaW4gdGhlIHNoYXBlIHdlIHNob3VsZCBwdXNoIGl0IHVuZGVyIHRo
ZSBjb250ZW50IGJveAotICAgICAgICBsb2dpY2FsVG9wT2Zmc2V0ID0gc2hhcGVJbnNpZGVJbmZv
LT5jb21wdXRlRmlyc3RGaXRQb3NpdGlvbkZvckZsb2F0KGZsb2F0TG9naWNhbFNpemUpOwotICAg
ICAgICBpZiAobG9naWNhbEhlaWdodCgpID4gbG9naWNhbFRvcE9mZnNldCkKLSAgICAgICAgICAg
IGxvZ2ljYWxUb3BPZmZzZXQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0KLSAgICAgICAgU2VnbWVudExp
c3Qgc2VnbWVudHMgPSBzaGFwZUluc2lkZUluZm8tPmNvbXB1dGVTZWdtZW50c0ZvckxpbmUobG9n
aWNhbFRvcE9mZnNldCwgY2hpbGRCb3gtPmxvZ2ljYWxIZWlnaHQoKSk7Ci0gICAgICAgIC8vIEZJ
WE1FIEJ1ZyAxMDI5NDk6IEFkZCBzdXBwb3J0IGZvciBzaGFwZXMgd2l0aCBtdWx0aXBsZSBzZWdt
ZW50cy4KLSAgICAgICAgaWYgKHNlZ21lbnRzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAv
LyBUaGUgc2VnbWVudCBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgY29udGVudCBib3guCi0g
ICAgICAgICAgICBsb2dpY2FsUmlnaHRPZmZzZXQgPSBsb2dpY2FsTGVmdE9mZnNldCArIHNlZ21l
bnRzWzBdLmxvZ2ljYWxSaWdodDsKLSAgICAgICAgICAgIGxvZ2ljYWxMZWZ0T2Zmc2V0ICs9IHNl
Z21lbnRzWzBdLmxvZ2ljYWxMZWZ0OwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSAg
ICAgICAgbG9naWNhbFJpZ2h0T2Zmc2V0ID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yQ29udGVudChs
b2dpY2FsVG9wT2Zmc2V0KTsKLQotICAgIExheW91dFVuaXQgZmxvYXRMb2dpY2FsV2lkdGggPSBt
aW4oZmxvYXRpbmdPYmplY3QtPmxvZ2ljYWxXaWR0aChpc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KSwgbG9naWNhbFJpZ2h0T2Zmc2V0IC0gbG9naWNhbExlZnRPZmZzZXQpOyAvLyBUaGUgd2lkdGgg
d2UgbG9vayBmb3IuCi0KLSAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbExlZnQ7Ci0KLSAgICBi
b29sIGluc2lkZUZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29udGFpbmluZ0Jsb2NrKCk7Ci0KLSAg
ICBpZiAoY2hpbGRCb3gtPnN0eWxlKCktPmZsb2F0aW5nKCkgPT0gTGVmdEZsb2F0KSB7Ci0gICAg
ICAgIExheW91dFVuaXQgaGVpZ2h0UmVtYWluaW5nTGVmdCA9IDE7Ci0gICAgICAgIExheW91dFVu
aXQgaGVpZ2h0UmVtYWluaW5nUmlnaHQgPSAxOwotICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0ID0g
bG9naWNhbExlZnRPZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9m
ZnNldCwgbG9naWNhbExlZnRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nTGVmdCk7Ci0g
ICAgICAgIHdoaWxlIChsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNp
ZGUobG9naWNhbFRvcE9mZnNldCwgbG9naWNhbFJpZ2h0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJl
bWFpbmluZ1JpZ2h0KSAtIGZsb2F0TG9naWNhbExlZnQgPCBmbG9hdExvZ2ljYWxXaWR0aCkgewot
ICAgICAgICAgICAgbG9naWNhbFRvcE9mZnNldCArPSBtaW4oaGVpZ2h0UmVtYWluaW5nTGVmdCwg
aGVpZ2h0UmVtYWluaW5nUmlnaHQpOwotICAgICAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IGxv
Z2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BPZmZz
ZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFpbmluZ0xlZnQpOwotICAg
ICAgICAgICAgaWYgKGluc2lkZUZsb3dUaHJlYWQpIHsKLSAgICAgICAgICAgICAgICAvLyBIYXZl
IHRvIHJlLWV2YWx1YXRlIGFsbCBvZiBvdXIgb2Zmc2V0cywgc2luY2UgdGhleSBtYXkgaGF2ZSBj
aGFuZ2VkLgotICAgICAgICAgICAgICAgIGxvZ2ljYWxSaWdodE9mZnNldCA9IGxvZ2ljYWxSaWdo
dE9mZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7IC8vIENvbnN0YW50IHBhcnQgb2Yg
cmlnaHQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGxvZ2ljYWxMZWZ0T2Zmc2V0ID0gbG9naWNh
bExlZnRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BPZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0
IG9mIGxlZnQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGZsb2F0TG9naWNhbFdpZHRoID0gbWlu
KGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSks
IGxvZ2ljYWxSaWdodE9mZnNldCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0KTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0ID0gbWF4KGxvZ2ljYWxMZWZ0T2Zm
c2V0IC0gYm9yZGVyQW5kUGFkZGluZ0xvZ2ljYWxMZWZ0KCksIGZsb2F0TG9naWNhbExlZnQpOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIExheW91dFVuaXQgaGVpZ2h0UmVtYWluaW5nTGVmdCA9IDE7
Ci0gICAgICAgIExheW91dFVuaXQgaGVpZ2h0UmVtYWluaW5nUmlnaHQgPSAxOwotICAgICAgICBm
bG9hdExvZ2ljYWxMZWZ0ID0gbG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVP
dXRzaWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxSaWdodE9mZnNldCwgZmFsc2UsICZoZWln
aHRSZW1haW5pbmdSaWdodCk7Ci0gICAgICAgIHdoaWxlIChmbG9hdExvZ2ljYWxMZWZ0IC0gbG9n
aWNhbExlZnRPZmZzZXRGb3JMaW5lSWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9mZnNl
dCwgbG9naWNhbExlZnRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nTGVmdCkgPCBmbG9h
dExvZ2ljYWxXaWR0aCkgewotICAgICAgICAgICAgbG9naWNhbFRvcE9mZnNldCArPSBtaW4oaGVp
Z2h0UmVtYWluaW5nTGVmdCwgaGVpZ2h0UmVtYWluaW5nUmlnaHQpOwotICAgICAgICAgICAgZmxv
YXRMb2dpY2FsTGVmdCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxpbmVJZ25vcmluZ1NoYXBlT3V0
c2lkZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsUmlnaHRPZmZzZXQsIGZhbHNlLCAmaGVpZ2h0
UmVtYWluaW5nUmlnaHQpOwotICAgICAgICAgICAgaWYgKGluc2lkZUZsb3dUaHJlYWQpIHsKLSAg
ICAgICAgICAgICAgICAvLyBIYXZlIHRvIHJlLWV2YWx1YXRlIGFsbCBvZiBvdXIgb2Zmc2V0cywg
c2luY2UgdGhleSBtYXkgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIGxvZ2ljYWxSaWdo
dE9mZnNldCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7
IC8vIENvbnN0YW50IHBhcnQgb2YgcmlnaHQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGxvZ2lj
YWxMZWZ0T2Zmc2V0ID0gbG9naWNhbExlZnRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BPZmZz
ZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9mIGxlZnQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIGZs
b2F0TG9naWNhbFdpZHRoID0gbWluKGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jp
em9udGFsV3JpdGluZ01vZGUoKSksIGxvZ2ljYWxSaWdodE9mZnNldCAtIGxvZ2ljYWxMZWZ0T2Zm
c2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmbG9hdExvZ2ljYWxMZWZ0
IC09IGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUo
KSk7IC8vIFVzZSB0aGUgb3JpZ2luYWwgd2lkdGggb2YgdGhlIGZsb2F0IGhlcmUsIHNpbmNlIHRo
ZSBsb2NhbCB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfGZsb2F0TG9naWNhbFdpZHRofCB3YXMgY2Fw
cGVkIHRvIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBmYXN0L2Js
b2NrL2Zsb2F0L2NsYW1wZWQtcmlnaHQtZmxvYXQuaHRtbC4KLSAgICB9Ci0gICAgCi0gICAgcmV0
dXJuIExheW91dFBvaW50KGZsb2F0TG9naWNhbExlZnQsIGxvZ2ljYWxUb3BPZmZzZXQpOwotfQot
Ci1ib29sIFJlbmRlckJsb2NrOjpwb3NpdGlvbk5ld0Zsb2F0cygpCi17Ci0gICAgaWYgKCFtX2Zs
b2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY29uc3QgRmxvYXRp
bmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgp
OwotICAgIGlmIChmbG9hdGluZ09iamVjdFNldC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIElmIGFsbCBmbG9hdHMgaGF2ZSBhbHJlYWR5IGJlZW4gcG9zaXRpb25l
ZCwgdGhlbiB3ZSBoYXZlIG5vIHdvcmsgdG8gZG8uCi0gICAgaWYgKGZsb2F0aW5nT2JqZWN0U2V0
Lmxhc3QoKS0+aXNQbGFjZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTW92
ZSBiYWNrd2FyZHMgdGhyb3VnaCBvdXIgZmxvYXRpbmcgb2JqZWN0IGxpc3QgdW50aWwgd2UgZmlu
ZCBhIGZsb2F0IHRoYXQgaGFzCi0gICAgLy8gYWxyZWFkeSBiZWVuIHBvc2l0aW9uZWQuICBUaGVu
IHdlJ2xsIGJlIGFibGUgdG8gbW92ZSBmb3J3YXJkLCBwb3NpdGlvbmluZyBhbGwgb2YKLSAgICAv
LyB0aGUgbmV3IGZsb2F0cyB0aGF0IG5lZWQgaXQuCi0gICAgYXV0byBpdCA9IGZsb2F0aW5nT2Jq
ZWN0U2V0LmVuZCgpOwotICAgIC0taXQ7IC8vIEdvIHRvIGxhc3QgaXRlbS4KLSAgICBhdXRvIGJl
Z2luID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsKLSAgICBGbG9hdGluZ09iamVjdCogbGFz
dFBsYWNlZEZsb2F0aW5nT2JqZWN0ID0gMDsKLSAgICB3aGlsZSAoaXQgIT0gYmVnaW4pIHsKLSAg
ICAgICAgLS1pdDsKLSAgICAgICAgaWYgKCgqaXQpLT5pc1BsYWNlZCgpKSB7Ci0gICAgICAgICAg
ICBsYXN0UGxhY2VkRmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7Ci0gICAgICAgICAgICArK2l0
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBMYXlvdXRVbml0
IGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgCi0gICAgLy8gVGhlIGZsb2F0IGNh
bm5vdCBzdGFydCBhYm92ZSB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBsYXN0IHBvc2l0aW9uZWQg
ZmxvYXQuCi0gICAgaWYgKGxhc3RQbGFjZWRGbG9hdGluZ09iamVjdCkKLSAgICAgICAgbG9naWNh
bFRvcCA9IG1heChsYXN0UGxhY2VkRmxvYXRpbmdPYmplY3QtPmxvZ2ljYWxUb3AoaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSksIGxvZ2ljYWxUb3ApOwotCi0gICAgYXV0byBlbmQgPSBmbG9hdGlu
Z09iamVjdFNldC5lbmQoKTsKLSAgICAvLyBOb3cgd2FsayB0aHJvdWdoIHRoZSBzZXQgb2YgdW5w
b3NpdGlvbmVkIGZsb2F0cyBhbmQgcGxhY2UgdGhlbS4KLSAgICBmb3IgKDsgaXQgIT0gZW5kOyAr
K2l0KSB7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCA9IGl0LT5nZXQo
KTsKLSAgICAgICAgLy8gVGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgcmVzcG9uc2libGUgZm9yIHBv
c2l0aW9uaW5nIGZsb2F0cywgc28gaWYgd2UgaGF2ZSBmbG9hdHMgaW4gb3VyCi0gICAgICAgIC8v
IGxpc3QgdGhhdCBjb21lIGZyb20gc29tZXdoZXJlIGVsc2UsIGRvIG5vdCBhdHRlbXB0IHRvIHBv
c2l0aW9uIHRoZW0uCi0gICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5jb250
YWluaW5nQmxvY2soKSAhPSB0aGlzKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
UmVuZGVyQm94KiBjaGlsZEJveCA9ICZmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKTsKLQotICAg
ICAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbExlZnRNYXJnaW4gPSBzdHlsZSgpLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkgPyBtYXJnaW5TdGFydEZvckNoaWxkKGNoaWxkQm94KSA6IG1hcmdp
bkVuZEZvckNoaWxkKGNoaWxkQm94KTsKLQotICAgICAgICBMYXlvdXRSZWN0IG9sZFJlY3QgPSBj
aGlsZEJveC0+ZnJhbWVSZWN0KCk7Ci0KLSAgICAgICAgaWYgKGNoaWxkQm94LT5zdHlsZSgpLT5j
bGVhcigpICYgQ0xFRlQpCi0gICAgICAgICAgICBsb2dpY2FsVG9wID0gbWF4KGxvd2VzdEZsb2F0
TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KSwgbG9naWNhbFRvcCk7Ci0g
ICAgICAgIGlmIChjaGlsZEJveC0+c3R5bGUoKS0+Y2xlYXIoKSAmIENSSUdIVCkKLSAgICAgICAg
ICAgIGxvZ2ljYWxUb3AgPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2Jq
ZWN0OjpGbG9hdFJpZ2h0KSwgbG9naWNhbFRvcCk7Ci0KLSAgICAgICAgTGF5b3V0UG9pbnQgZmxv
YXRMb2dpY2FsTG9jYXRpb24gPSBjb21wdXRlTG9naWNhbExvY2F0aW9uRm9yRmxvYXQoZmxvYXRp
bmdPYmplY3QsIGxvZ2ljYWxUb3ApOwotCi0gICAgICAgIGZsb2F0aW5nT2JqZWN0LT5zZXRMb2dp
Y2FsTGVmdChmbG9hdExvZ2ljYWxMb2NhdGlvbi54KCksIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2Rl
KCkpOwotCi0gICAgICAgIHNldExvZ2ljYWxMZWZ0Rm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9n
aWNhbExvY2F0aW9uLngoKSArIGNoaWxkTG9naWNhbExlZnRNYXJnaW4pOwotICAgICAgICBzZXRM
b2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSArIG1h
cmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkQm94KSk7Ci0KLSAgICAgICAgZXN0aW1hdGVSZWdpb25S
YW5nZUZvckJveENoaWxkKGNoaWxkQm94KTsKLQotICAgICAgICBMYXlvdXRTdGF0ZSogbGF5b3V0
U3RhdGUgPSB2aWV3KCkubGF5b3V0U3RhdGUoKTsKLSAgICAgICAgYm9vbCBpc1BhZ2luYXRlZCA9
IGxheW91dFN0YXRlLT5pc1BhZ2luYXRlZCgpOwotICAgICAgICBpZiAoaXNQYWdpbmF0ZWQgJiYg
IWNoaWxkQm94LT5uZWVkc0xheW91dCgpKQotICAgICAgICAgICAgY2hpbGRCb3gtPm1hcmtGb3JQ
YWdpbmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgpOwotICAgICAgICAKLSAgICAgICAgY2hpbGRCb3gt
PmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgaWYgKGlzUGFnaW5hdGVkKSB7Ci0gICAgICAg
ICAgICAvLyBJZiB3ZSBhcmUgdW5zcGxpdHRhYmxlIGFuZCBkb24ndCBmaXQsIHRoZW4gd2UgbmVl
ZCB0byBtb3ZlIGRvd24uCi0gICAgICAgICAgICAvLyBXZSBpbmNsdWRlIG91ciBtYXJnaW5zIGFz
IHBhcnQgb2YgdGhlIHVuc3BsaXR0YWJsZSBhcmVhLgotICAgICAgICAgICAgTGF5b3V0VW5pdCBu
ZXdMb2dpY2FsVG9wID0gYWRqdXN0Rm9yVW5zcGxpdHRhYmxlQ2hpbGQoY2hpbGRCb3gsIGZsb2F0
TG9naWNhbExvY2F0aW9uLnkoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8v
IFNlZSBpZiB3ZSBoYXZlIGEgcGFnaW5hdGlvbiBzdHJ1dCB0aGF0IGlzIG1ha2luZyB1cyBtb3Zl
IGRvd24gZnVydGhlci4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiB1bnNwbGl0dGFibGUg
Y2hpbGQgY2FuJ3QgYWxzbyBoYXZlIGEgcGFnaW5hdGlvbiBzdHJ1dCwgc28gdGhpcyBpcwotICAg
ICAgICAgICAgLy8gZXhjbHVzaXZlIHdpdGggdGhlIGNhc2UgYWJvdmUuCi0gICAgICAgICAgICBS
ZW5kZXJCbG9jayogY2hpbGRCbG9jayA9IGNoaWxkQm94LT5pc1JlbmRlckJsb2NrKCkgPyB0b1Jl
bmRlckJsb2NrKGNoaWxkQm94KSA6IDA7Ci0gICAgICAgICAgICBpZiAoY2hpbGRCbG9jayAmJiBj
aGlsZEJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKSkgewotICAgICAgICAgICAgICAgIG5ld0xvZ2lj
YWxUb3AgKz0gY2hpbGRCbG9jay0+cGFnaW5hdGlvblN0cnV0KCk7Ci0gICAgICAgICAgICAgICAg
Y2hpbGRCbG9jay0+c2V0UGFnaW5hdGlvblN0cnV0KDApOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBpZiAobmV3TG9naWNhbFRvcCAhPSBmbG9hdExvZ2ljYWxMb2Nh
dGlvbi55KCkpIHsKLSAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0UGFnaW5hdGlv
blN0cnV0KG5ld0xvZ2ljYWxUb3AgLSBmbG9hdExvZ2ljYWxMb2NhdGlvbi55KCkpOwotCi0gICAg
ICAgICAgICAgICAgZmxvYXRMb2dpY2FsTG9jYXRpb24gPSBjb21wdXRlTG9naWNhbExvY2F0aW9u
Rm9yRmxvYXQoZmxvYXRpbmdPYmplY3QsIG5ld0xvZ2ljYWxUb3ApOwotICAgICAgICAgICAgICAg
IGZsb2F0aW5nT2JqZWN0LT5zZXRMb2dpY2FsTGVmdChmbG9hdExvZ2ljYWxMb2NhdGlvbi54KCks
IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotCi0gICAgICAgICAgICAgICAgc2V0TG9naWNh
bExlZnRGb3JDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueCgpICsgY2hpbGRM
b2dpY2FsTGVmdE1hcmdpbik7Ci0gICAgICAgICAgICAgICAgc2V0TG9naWNhbFRvcEZvckNoaWxk
KGNoaWxkQm94LCBmbG9hdExvZ2ljYWxMb2NhdGlvbi55KCkgKyBtYXJnaW5CZWZvcmVGb3JDaGls
ZChjaGlsZEJveCkpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRCbG9jaykK
LSAgICAgICAgICAgICAgICAgICAgY2hpbGRCbG9jay0+c2V0Q2hpbGROZWVkc0xheW91dChNYXJr
T25seVRoaXMpOwotICAgICAgICAgICAgICAgIGNoaWxkQm94LT5sYXlvdXRJZk5lZWRlZCgpOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodXBkYXRlUmVnaW9uUmFuZ2VGb3JCb3hD
aGlsZChjaGlsZEJveCkpIHsKLSAgICAgICAgICAgICAgICBjaGlsZEJveC0+c2V0TmVlZHNMYXlv
dXQoTWFya09ubHlUaGlzKTsKLSAgICAgICAgICAgICAgICBjaGlsZEJveC0+bGF5b3V0SWZOZWVk
ZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0aW5nT2JqZWN0
LT5zZXRMb2dpY2FsVG9wKGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSwgaXNIb3Jpem9udGFsV3Jp
dGluZ01vZGUoKSk7Ci0KLSAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxIZWlnaHQo
bG9naWNhbEhlaWdodEZvckNoaWxkKGNoaWxkQm94KSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNo
aWxkQm94KSArIG1hcmdpbkFmdGVyRm9yQ2hpbGQoY2hpbGRCb3gpLCBpc0hvcml6b250YWxXcml0
aW5nTW9kZSgpKTsKLQotICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+YWRkUGxhY2VkT2JqZWN0
KGZsb2F0aW5nT2JqZWN0KTsKLQotICAgICAgICAvLyBJZiB0aGUgY2hpbGQgbW92ZWQsIHdlIGhh
dmUgdG8gcmVwYWludCBpdC4KLSAgICAgICAgaWYgKGNoaWxkQm94LT5jaGVja0ZvclJlcGFpbnRE
dXJpbmdMYXlvdXQoKSkKLSAgICAgICAgICAgIGNoaWxkQm94LT5yZXBhaW50RHVyaW5nTGF5b3V0
SWZNb3ZlZChvbGRSZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVu
ZGVyQmxvY2s6Om5ld0xpbmUoRUNsZWFyIGNsZWFyKQotewotICAgIHBvc2l0aW9uTmV3RmxvYXRz
KCk7Ci0gICAgLy8gc2V0IHkgcG9zaXRpb24KLSAgICBMYXlvdXRVbml0IG5ld1kgPSAwOwotICAg
IHN3aXRjaCAoY2xlYXIpCi0gICAgewotICAgICAgICBjYXNlIENMRUZUOgotICAgICAgICAgICAg
bmV3WSA9IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENSSUdIVDoKLSAgICAgICAgICAg
IG5ld1kgPSBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0Umln
aHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0JPVEg6Ci0gICAgICAgICAg
ICBuZXdZID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGhlaWdodCgpIDwgbmV3WSkKLSAgICAg
ICAgc2V0TG9naWNhbEhlaWdodChuZXdZKTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6YWRkUGVy
Y2VudEhlaWdodERlc2NlbmRhbnQoUmVuZGVyQm94KiBkZXNjZW5kYW50KQogewogICAgIGluc2Vy
dEludG9UcmFja2VkUmVuZGVyZXJNYXBzKGRlc2NlbmRhbnQsIGdQZXJjZW50SGVpZ2h0RGVzY2Vu
ZGFudHNNYXAsIGdQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKTsKQEAgLTM2NTMsMTQgKzMxODAs
NiBAQCBMYXlvdXRVbml0IFJlbmRlckJsb2NrOjpsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50
KFJlbmRlclJlZ2lvbiogcmVnaW9uKSBjb25zdAogICAgIHJldHVybiBsb2dpY2FsUmlnaHRPZmZz
ZXQgLSAobG9naWNhbFdpZHRoKCkgLSAoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IGJveFJl
Y3QubWF4WCgpIDogYm94UmVjdC5tYXhZKCkpKTsKIH0KIAotTGF5b3V0VW5pdCBSZW5kZXJCbG9j
azo6bG9naWNhbExlZnRGbG9hdE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBsb2dpY2FsVG9wLCBM
YXlvdXRVbml0IGZpeGVkT2Zmc2V0LCBMYXlvdXRVbml0KiBoZWlnaHRSZW1haW5pbmcsIExheW91
dFVuaXQgbG9naWNhbEhlaWdodCwgU2hhcGVPdXRzaWRlRmxvYXRPZmZzZXRNb2RlIG9mZnNldE1v
ZGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIG1fZmxvYXRpbmdPYmpl
Y3RzLT5oYXNMZWZ0T2JqZWN0cygpKQotICAgICAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMt
PmxvZ2ljYWxMZWZ0T2Zmc2V0KGZpeGVkT2Zmc2V0LCBsb2dpY2FsVG9wLCBsb2dpY2FsSGVpZ2h0
LCBvZmZzZXRNb2RlLCBoZWlnaHRSZW1haW5pbmcpOwotCi0gICAgcmV0dXJuIGZpeGVkT2Zmc2V0
OwotfQotCiBMYXlvdXRVbml0IFJlbmRlckJsb2NrOjphZGp1c3RMb2dpY2FsTGVmdE9mZnNldEZv
ckxpbmUoTGF5b3V0VW5pdCBvZmZzZXRGcm9tRmxvYXRzLCBib29sIGFwcGx5VGV4dEluZGVudCkg
Y29uc3QKIHsKICAgICBMYXlvdXRVbml0IGxlZnQgPSBvZmZzZXRGcm9tRmxvYXRzOwpAQCAtMzcw
MSwxNCArMzIyMCw2IEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2s6OmFkanVzdExvZ2ljYWxMZWZ0
T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IG9mZnNldEZyb21GbG9hCiAgICAgcmV0dXJuIGxlZnQ7
CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9y
TGluZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91
dFVuaXQqIGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBTaGFwZU91
dHNpZGVGbG9hdE9mZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKLXsKLSAgICBpZiAobV9mbG9h
dGluZ09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPmhhc1JpZ2h0T2JqZWN0cygpKQotICAg
ICAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMtPmxvZ2ljYWxSaWdodE9mZnNldChmaXhlZE9m
ZnNldCwgbG9naWNhbFRvcCwgbG9naWNhbEhlaWdodCwgb2Zmc2V0TW9kZSwgaGVpZ2h0UmVtYWlu
aW5nKTsKLQotICAgIHJldHVybiBmaXhlZE9mZnNldDsKLX0KLQogTGF5b3V0VW5pdCBSZW5kZXJC
bG9jazo6YWRqdXN0TG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IG9mZnNldEZy
b21GbG9hdHMsIGJvb2wgYXBwbHlUZXh0SW5kZW50KSBjb25zdAogewogICAgIExheW91dFVuaXQg
cmlnaHQgPSBvZmZzZXRGcm9tRmxvYXRzOwpAQCAtMzc0OSw0NiArMzI2MCw2IEBAIExheW91dFVu
aXQgUmVuZGVyQmxvY2s6OmFkanVzdExvZ2ljYWxSaWdodE9mZnNldEZvckxpbmUoTGF5b3V0VW5p
dCBvZmZzZXRGcm9tRmxvCiAgICAgcmV0dXJuIHJpZ2h0OwogfQogCi1MYXlvdXRVbml0IFJlbmRl
ckJsb2NrOjpuZXh0RmxvYXRMb2dpY2FsQm90dG9tQmVsb3coTGF5b3V0VW5pdCBsb2dpY2FsSGVp
Z2h0LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKLXsKLSAg
ICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICByZXR1cm4gbG9naWNhbEhlaWdodDsK
LQotICAgIExheW91dFVuaXQgYm90dG9tID0gTGF5b3V0VW5pdDo6bWF4KCk7Ci0gICAgY29uc3Qg
RmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMt
PnNldCgpOwotICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgZm9y
IChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7
Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAgICAgICBMYXlvdXRV
bml0IGZsb2F0Qm90dG9tOwotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotICAgICAgICBTaGFwZU91
dHNpZGVJbmZvKiBzaGFwZU91dHNpZGUgPSByLT5yZW5kZXJlcigpLnNoYXBlT3V0c2lkZUluZm8o
KTsKLSAgICAgICAgaWYgKG9mZnNldE1vZGUgPT0gU2hhcGVPdXRzaWRlRmxvYXRTaGFwZU9mZnNl
dCAmJiBzaGFwZU91dHNpZGUpCi0gICAgICAgICAgICBmbG9hdEJvdHRvbSA9IHItPmxvZ2ljYWxU
b3AoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgKyBtYXJnaW5CZWZvcmVGb3JDaGlsZCgmKHIt
PnJlbmRlcmVyKCkpKSArIHNoYXBlT3V0c2lkZS0+c2hhcGVMb2dpY2FsQm90dG9tKCk7Ci0gICAg
ICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgZmxvYXRCb3R0b20gPSByLT5sb2dpY2FsQm90
dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwotICAgICAgICBpZiAoZmxvYXRCb3R0b20g
PiBsb2dpY2FsSGVpZ2h0KQotICAgICAgICAgICAgYm90dG9tID0gbWluKGZsb2F0Qm90dG9tLCBi
b3R0b20pOwotICAgIH0KLQotICAgIHJldHVybiBib3R0b20gPT0gTGF5b3V0VW5pdDo6bWF4KCkg
PyBMYXlvdXRVbml0KCkgOiBib3R0b207Ci19Ci0KLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6Omxv
d2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6VHlwZSBmbG9hdFR5cGUpIGNv
bnN0Ci17Ci0gICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgTGF5b3V0VW5pdCBsb3dlc3RGbG9hdEJvdHRvbSA9IDA7Ci0gICAgY29uc3QgRmxvYXRpbmdP
YmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwot
ICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7Ci0gICAgZm9yIChhdXRvIGl0
ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwotICAgICAgICBpZiAoci0+aXNQbGFjZWQo
KSAmJiByLT50eXBlKCkgJiBmbG9hdFR5cGUpCi0gICAgICAgICAgICBsb3dlc3RGbG9hdEJvdHRv
bSA9IG1heChsb3dlc3RGbG9hdEJvdHRvbSwgci0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxX
cml0aW5nTW9kZSgpKSk7Ci0gICAgfQotICAgIHJldHVybiBsb3dlc3RGbG9hdEJvdHRvbTsKLX0K
LQogdm9pZCBSZW5kZXJCbG9jazo6bWFya0xpbmVzRGlydHlJbkJsb2NrUmFuZ2UoTGF5b3V0VW5p
dCBsb2dpY2FsVG9wLCBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20sIFJvb3RJbmxpbmVCb3gqIGhp
Z2hlc3QpCiB7CiAgICAgaWYgKGxvZ2ljYWxUb3AgPj0gbG9naWNhbEJvdHRvbSkKQEAgLTM4MDcs
MjQyICszMjc4LDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6Om1hcmtMaW5lc0RpcnR5SW5CbG9ja1Jh
bmdlKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBsCiAgICAgfQogfQogCi1MYXlv
dXRVbml0IFJlbmRlckJsb2NrOjphZGRPdmVyaGFuZ2luZ0Zsb2F0cyhSZW5kZXJCbG9jayogY2hp
bGQsIGJvb2wgbWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0cykKLXsKLSAgICAvLyBQcmV2ZW50IGZs
b2F0cyBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZSBjYW52YXMgYnkgdGhlIHJvb3QgZWxlbWVudCwg
ZS5nLiwgPGh0bWw+LgotICAgIGlmIChjaGlsZC0+aGFzT3ZlcmZsb3dDbGlwKCkgfHwgIWNoaWxk
LT5jb250YWluc0Zsb2F0cygpIHx8IGNoaWxkLT5pc1Jvb3QoKSB8fCBjaGlsZC0+aGFzQ29sdW1u
cygpIHx8IGNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxvZ2ljYWxUb3AoKTsKLSAg
ICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbExlZnQgPSBjaGlsZC0+bG9naWNhbExlZnQoKTsKLSAg
ICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSA9IDA7Ci0KLSAgICAvLyBGbG9h
dHMgdGhhdCB3aWxsIHJlbWFpbiB0aGUgY2hpbGQncyByZXNwb25zaWJpbGl0eSB0byBwYWludCBz
aG91bGQgZmFjdG9yIGludG8gaXRzCi0gICAgLy8gb3ZlcmZsb3cuCi0gICAgYXV0byBjaGlsZEVu
ZCA9IGNoaWxkLT5tX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuZW5kKCk7Ci0gICAgZm9yIChhdXRv
IGNoaWxkSXQgPSBjaGlsZC0+bV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmJlZ2luKCk7IGNoaWxk
SXQgIT0gY2hpbGRFbmQ7ICsrY2hpbGRJdCkgewotICAgICAgICBGbG9hdGluZ09iamVjdCogciA9
IGNoaWxkSXQtPmdldCgpOwotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b21Gb3JGbG9h
dCA9IG1pbihyLT5sb2dpY2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpLCBMYXlv
dXRVbml0OjptYXgoKSAtIGNoaWxkTG9naWNhbFRvcCk7Ci0gICAgICAgIExheW91dFVuaXQgbG9n
aWNhbEJvdHRvbSA9IGNoaWxkTG9naWNhbFRvcCArIGxvZ2ljYWxCb3R0b21Gb3JGbG9hdDsKLSAg
ICAgICAgbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tID0gbWF4KGxvd2VzdEZsb2F0TG9naWNhbEJv
dHRvbSwgbG9naWNhbEJvdHRvbSk7Ci0KLSAgICAgICAgaWYgKGxvZ2ljYWxCb3R0b20gPiBsb2dp
Y2FsSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3QgaXMgbm90IGluIHRo
ZSBsaXN0LCB3ZSBhZGQgaXQgbm93LgotICAgICAgICAgICAgaWYgKCFjb250YWluc0Zsb2F0KCZy
LT5yZW5kZXJlcigpKSkgewotICAgICAgICAgICAgICAgIExheW91dFNpemUgb2Zmc2V0ID0gaXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IExheW91dFNpemUoLWNoaWxkTG9naWNhbExlZnQsIC1j
aGlsZExvZ2ljYWxUb3ApIDogTGF5b3V0U2l6ZSgtY2hpbGRMb2dpY2FsVG9wLCAtY2hpbGRMb2dp
Y2FsTGVmdCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBzaG91bGRQYWludCA9IGZhbHNlOwotCi0g
ICAgICAgICAgICAgICAgLy8gVGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxheWVyIGFsd2F5cyBwYWlu
dHMgdGhlIGZsb2F0IChzbyB0aGF0IHppbmRleCBhbmQgc3RhY2tpbmcKLSAgICAgICAgICAgICAg
ICAvLyBiZWhhdmVzIHByb3Blcmx5KS4gIFdlIGFsd2F5cyB3YW50IHRvIHByb3BhZ2F0ZSB0aGUg
ZGVzaXJlIHRvIHBhaW50IHRoZSBmbG9hdCBhcwotICAgICAgICAgICAgICAgIC8vIGZhciBvdXQg
YXMgd2UgY2FuLCB0byB0aGUgb3V0ZXJtb3N0IGJsb2NrIHRoYXQgb3ZlcmxhcHMgdGhlIGZsb2F0
LCBzdG9wcGluZyBvbmx5Ci0gICAgICAgICAgICAgICAgLy8gaWYgd2UgaGl0IGEgc2VsZi1wYWlu
dGluZyBsYXllciBib3VuZGFyeS4KLSAgICAgICAgICAgICAgICBpZiAoci0+cmVuZGVyZXIoKS5l
bmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9PSBlbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5
ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICByLT5zZXRTaG91bGRQYWludChmYWxzZSk7Ci0g
ICAgICAgICAgICAgICAgICAgIHNob3VsZFBhaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlIHRoZSBmbG9hdGluZyBvYmplY3QgbGlzdCBs
YXppbHkuCi0gICAgICAgICAgICAgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAgICAg
ICAgICAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7Ci0KLSAgICAgICAgICAgICAgICBt
X2Zsb2F0aW5nT2JqZWN0cy0+YWRkKHItPmNvcHlUb05ld0NvbnRhaW5lcihvZmZzZXQsIHNob3Vs
ZFBhaW50LCB0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBpZiAobWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0cyAmJiAhci0+c2hvdWxkUGFpbnQoKSAm
JiAhci0+cmVuZGVyZXIoKS5oYXNTZWxmUGFpbnRpbmdMYXllcigpCi0gICAgICAgICAgICAgICAg
JiYgci0+cmVuZGVyZXIoKS5pc0Rlc2NlbmRhbnRPZihjaGlsZCkgJiYgci0+cmVuZGVyZXIoKS5l
bmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9PSBjaGlsZC0+ZW5jbG9zaW5nRmxvYXRQYWlu
dGluZ0xheWVyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZmxvYXQgaXMgbm90IG92ZXJo
YW5naW5nIGZyb20gdGhpcyBibG9jaywgc28gaWYgaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBj
aGlsZCwgdGhlIGNoaWxkIHNob3VsZAotICAgICAgICAgICAgICAgIC8vIHBhaW50IGl0ICh0aGUg
b3RoZXIgY2FzZSBpcyB0aGF0IGl0IGlzIGludHJ1ZGluZyBpbnRvIHRoZSBjaGlsZCksIHVubGVz
cyBpdCBoYXMgaXRzIG93biBsYXllciBvciBlbmNsb3NpbmcKLSAgICAgICAgICAgICAgICAvLyBs
YXllci4KLSAgICAgICAgICAgICAgICAvLyBJZiBtYWtlQ2hpbGRQYWludE90aGVyRmxvYXRzIGlz
IGZhbHNlLCBpdCBtZWFucyB0aGF0IHRoZSBjaGlsZCBtdXN0IGFscmVhZHkga25vdyBhYm91dCBh
bGwgdGhlIGZsb2F0cwotICAgICAgICAgICAgICAgIC8vIGl0IHNob3VsZCBwYWludC4KLSAgICAg
ICAgICAgICAgICByLT5zZXRTaG91bGRQYWludCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIAotICAgICAgICAgICAgLy8gU2luY2UgdGhlIGZsb2F0IGRvZXNuJ3Qgb3Zlcmhhbmcs
IGl0IGRpZG4ndCBnZXQgcHV0IGludG8gb3VyIGxpc3QuICBXZSBuZWVkIHRvIGdvIGFoZWFkIGFu
ZCBhZGQgaXRzIG92ZXJmbG93IGluIHRvIHRoZQotICAgICAgICAgICAgLy8gY2hpbGQgbm93Lgot
ICAgICAgICAgICAgaWYgKHItPmlzRGVzY2VuZGFudCgpKQotICAgICAgICAgICAgICAgIGNoaWxk
LT5hZGRPdmVyZmxvd0Zyb21DaGlsZCgmci0+cmVuZGVyZXIoKSwgTGF5b3V0U2l6ZSh4UG9zaXRp
b25Gb3JGbG9hdEluY2x1ZGluZ01hcmdpbihyKSwgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdN
YXJnaW4ocikpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbG93ZXN0RmxvYXRMb2dp
Y2FsQm90dG9tOwotfQotCi1ib29sIFJlbmRlckJsb2NrOjpoYXNPdmVyaGFuZ2luZ0Zsb2F0KFJl
bmRlckJveCogcmVuZGVyZXIpCi17Ci0gICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cyB8fCBoYXND
b2x1bW5zKCkgfHwgIXBhcmVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjb25z
dCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0
cy0+c2V0KCk7Ci0gICAgYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmZpbmQ8UmVuZGVyQm94
JiwgRmxvYXRpbmdPYmplY3RIYXNoVHJhbnNsYXRvcj4oKnJlbmRlcmVyKTsKLSAgICBpZiAoaXQg
PT0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IHJldHVybiAoKml0KS0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSA+
IGxvZ2ljYWxIZWlnaHQoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkSW50cnVkaW5nRmxv
YXRzKFJlbmRlckJsb2NrKiBwcmV2LCBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0T2Zmc2V0LCBMYXlv
dXRVbml0IGxvZ2ljYWxUb3BPZmZzZXQpCi17Ci0gICAgQVNTRVJUKCFhdm9pZHNGbG9hdHMoKSk7
Ci0KLSAgICAvLyBJZiB0aGUgcGFyZW50IG9yIHByZXZpb3VzIHNpYmxpbmcgZG9lc24ndCBoYXZl
IGFueSBmbG9hdHMgdG8gYWRkLCBkb24ndCBib3RoZXIuCi0gICAgaWYgKCFwcmV2LT5tX2Zsb2F0
aW5nT2JqZWN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbG9naWNhbExlZnRPZmZzZXQgKz0g
bWFyZ2luTG9naWNhbExlZnQoKTsKLQotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBwcmV2
U2V0ID0gcHJldi0+bV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwotICAgIGF1dG8gcHJldkVuZCA9
IHByZXZTZXQuZW5kKCk7Ci0gICAgZm9yIChhdXRvIHByZXZJdCA9IHByZXZTZXQuYmVnaW4oKTsg
cHJldkl0ICE9IHByZXZFbmQ7ICsrcHJldkl0KSB7Ci0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiBy
ID0gcHJldkl0LT5nZXQoKTsKLSAgICAgICAgaWYgKHItPmxvZ2ljYWxCb3R0b20oaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSkgPiBsb2dpY2FsVG9wT2Zmc2V0KSB7Ci0gICAgICAgICAgICBpZiAo
IW1fZmxvYXRpbmdPYmplY3RzIHx8ICFtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuY29udGFpbnM8
RmxvYXRpbmdPYmplY3QmLCBGbG9hdGluZ09iamVjdEhhc2hUcmFuc2xhdG9yPigqcikpIHsKLSAg
ICAgICAgICAgICAgICAvLyBXZSBjcmVhdGUgdGhlIGZsb2F0aW5nIG9iamVjdCBsaXN0IGxhemls
eS4KLSAgICAgICAgICAgICAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICAgICAg
ICAgICAgICBjcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKLQotICAgICAgICAgICAgICAgIC8vIEFw
cGx5aW5nIHRoZSBjaGlsZCdzIG1hcmdpbiBtYWtlcyBubyBzZW5zZSBpbiB0aGUgY2FzZSB3aGVy
ZSB0aGUgY2hpbGQgd2FzIHBhc3NlZCBpbi4KLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlz
IG1hcmdpbiB3YXMgYWRkZWQgYWxyZWFkeSB0aHJvdWdoIHRoZSBtb2RpZmljYXRpb24gb2YgdGhl
IHxsb2dpY2FsTGVmdE9mZnNldHwgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAvLyBhYm92ZS4g
IHxsb2dpY2FsTGVmdE9mZnNldHwgd2lsbCBlcXVhbCB0aGUgbWFyZ2luIGluIHRoaXMgY2FzZSwg
c28gaXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KLSAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291
bnQuICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiBwcmV2IGlzIHRoZSBwYXJlbnQsIHNpbmNlIG90
aGVyd2lzZSB0aGUgbGVmdCBtYXJnaW4KLSAgICAgICAgICAgICAgICAvLyB3aWxsIGdldCBhcHBs
aWVkIHR3aWNlLgotICAgICAgICAgICAgICAgIExheW91dFNpemUgb2Zmc2V0ID0gaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKQotICAgICAgICAgICAgICAgICAgICA/IExheW91dFNpemUobG9naWNh
bExlZnRPZmZzZXQgLSAocHJldiAhPSBwYXJlbnQoKSA/IHByZXYtPm1hcmdpbkxlZnQoKSA6IExh
eW91dFVuaXQoKSksIGxvZ2ljYWxUb3BPZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIDogTGF5
b3V0U2l6ZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IHBh
cmVudCgpID8gcHJldi0+bWFyZ2luVG9wKCkgOiBMYXlvdXRVbml0KCkpKTsKLQotICAgICAgICAg
ICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5hZGQoci0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNl
dCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCiBib29sIFJlbmRlckJs
b2NrOjphdm9pZHNGbG9hdHMoKSBjb25zdAogewogICAgIC8vIEZsb2F0cyBjYW4ndCBpbnRydWRl
IGludG8gb3VyIGJveCBpZiB3ZSBoYXZlIGEgbm9uLWF1dG8gY29sdW1uIGNvdW50IG9yIHdpZHRo
LgogICAgIHJldHVybiBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIHx8ICFzdHlsZSgpLT5oYXNB
dXRvQ29sdW1uQ291bnQoKSB8fCAhc3R5bGUoKS0+aGFzQXV0b0NvbHVtbldpZHRoKCk7CiB9CiAK
LWJvb2wgUmVuZGVyQmxvY2s6OmNvbnRhaW5zRmxvYXQoUmVuZGVyQm94KiByZW5kZXJlcikgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMt
PnNldCgpLmNvbnRhaW5zPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+
KCpyZW5kZXJlcik7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6Om1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoUmVuZGVyQm94KiBmbG9hdFRvUmVtb3ZlLCBib29sIGluTGF5b3V0
KQotewotICAgIGlmICghZXZlckhhZExheW91dCgpICYmICFjb250YWluc0Zsb2F0cygpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBNYXJraW5nQmVoYXZpb3IgbWFya1BhcmVudHMgPSBpbkxheW91
dCA/IE1hcmtPbmx5VGhpcyA6IE1hcmtDb250YWluaW5nQmxvY2tDaGFpbjsKLSAgICBzZXRDaGls
ZE5lZWRzTGF5b3V0KG1hcmtQYXJlbnRzKTsKLSAKLSAgICBpZiAoZmxvYXRUb1JlbW92ZSkKLSAg
ICAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoZmxvYXRUb1JlbW92ZSk7Ci0KLSAgICAvLyBJdGVy
YXRlIG92ZXIgb3VyIGNoaWxkcmVuIGFuZCBtYXJrIHRoZW0gYXMgbmVlZGVkLgotICAgIGlmICgh
Y2hpbGRyZW5JbmxpbmUoKSkgewotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBm
aXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAg
ICAgICAgICBpZiAoKCFmbG9hdFRvUmVtb3ZlICYmIGNoaWxkLT5pc0Zsb2F0aW5nT3JPdXRPZkZs
b3dQb3NpdGlvbmVkKCkpIHx8ICFjaGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSB0b1Jl
bmRlckJsb2NrKGNoaWxkKTsKLSAgICAgICAgICAgIGlmICgoZmxvYXRUb1JlbW92ZSA/IGNoaWxk
QmxvY2stPmNvbnRhaW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWlu
c0Zsb2F0cygpKSB8fCBjaGlsZEJsb2NrLT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkpCi0gICAgICAg
ICAgICAgICAgY2hpbGRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91
dChmbG9hdFRvUmVtb3ZlLCBpbkxheW91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQg
UmVuZGVyQmxvY2s6Om1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlvdXQoUmVuZGVyQm94KiBm
bG9hdFRvUmVtb3ZlKQotewotICAgIGlmICghbV9mbG9hdGluZ09iamVjdHMpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9
IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKLSAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0
U2V0LmVuZCgpOwotCi0gICAgZm9yIChSZW5kZXJPYmplY3QqIG5leHQgPSBuZXh0U2libGluZygp
OyBuZXh0OyBuZXh0ID0gbmV4dC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW5leHQt
PmlzUmVuZGVyQmxvY2soKSB8fCBuZXh0LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVk
KCkgfHwgdG9SZW5kZXJCbG9jayhuZXh0KS0+YXZvaWRzRmxvYXRzKCkpCi0gICAgICAgICAgICBj
b250aW51ZTsKLQotICAgICAgICBSZW5kZXJCbG9jayogbmV4dEJsb2NrID0gdG9SZW5kZXJCbG9j
ayhuZXh0KTsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIGZsb2F0aW5nQm94
ID0gJigqaXQpLT5yZW5kZXJlcigpOwotICAgICAgICAgICAgaWYgKGZsb2F0VG9SZW1vdmUgJiYg
ZmxvYXRpbmdCb3ggIT0gZmxvYXRUb1JlbW92ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgICAgIGlmIChuZXh0QmxvY2stPmNvbnRhaW5zRmxvYXQoZmxvYXRpbmdCb3gpKQot
ICAgICAgICAgICAgICAgIG5leHRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0Zv
ckxheW91dChmbG9hdGluZ0JveCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUxheW91dFVuaXQg
UmVuZGVyQmxvY2s6OmdldENsZWFyRGVsdGEoUmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBs
b2dpY2FsVG9wKQotewotICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY29tcHV0ZSBjbGVhcmFu
Y2UgaWYgd2UgaGF2ZSBubyBmbG9hdHMuCi0gICAgaWYgKCFjb250YWluc0Zsb2F0cygpKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyBBdCBsZWFzdCBvbmUgZmxvYXQgaXMgcHJlc2Vu
dC4gIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGUgY2xlYXJhbmNlIGNvbXB1dGF0aW9uLgotICAgIGJv
b2wgY2xlYXJTZXQgPSBjaGlsZC0+c3R5bGUoKS0+Y2xlYXIoKSAhPSBDTk9ORTsKLSAgICBMYXlv
dXRVbml0IGxvZ2ljYWxCb3R0b20gPSAwOwotICAgIHN3aXRjaCAoY2hpbGQtPnN0eWxlKCktPmNs
ZWFyKCkpIHsKLSAgICAgICAgY2FzZSBDTk9ORToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIENMRUZUOgotICAgICAgICAgICAgbG9naWNhbEJvdHRvbSA9IGxvd2VzdEZsb2F0TG9n
aWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIENSSUdIVDoKLSAgICAgICAgICAgIGxvZ2ljYWxCb3R0b20gPSBsb3dl
c3RGbG9hdExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0JPVEg6Ci0gICAgICAgICAgICBsb2dpY2FsQm90
dG9tID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICB9Ci0KLSAgICAvLyBXZSBhbHNvIGNsZWFyIGZsb2F0cyBpZiB3ZSBhcmUgdG9vIGJpZyB0byBz
aXQgb24gdGhlIHNhbWUgbGluZSBhcyBhIGZsb2F0IChhbmQgd2lzaCB0byBhdm9pZCBmbG9hdHMg
YnkgZGVmYXVsdCkuCi0gICAgTGF5b3V0VW5pdCByZXN1bHQgPSBjbGVhclNldCA/IG1heDxMYXlv
dXRVbml0PigwLCBsb2dpY2FsQm90dG9tIC0gbG9naWNhbFRvcCkgOiBMYXlvdXRVbml0KCk7Ci0g
ICAgaWYgKCFyZXN1bHQgJiYgY2hpbGQtPmF2b2lkc0Zsb2F0cygpKSB7Ci0gICAgICAgIExheW91
dFVuaXQgbmV3TG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7
Ci0gICAgICAgICAgICBMYXlvdXRVbml0IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEF0TmV3TG9naWNh
bFRvcE9mZnNldCA9IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUobmV3TG9naWNhbFRvcCwg
ZmFsc2UsIGxvZ2ljYWxIZWlnaHRGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICAgICAgaWYgKGF2
YWlsYWJsZUxvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRvcE9mZnNldCA9PSBhdmFpbGFibGVMb2dp
Y2FsV2lkdGhGb3JDb250ZW50KG5ld0xvZ2ljYWxUb3ApKQotICAgICAgICAgICAgICAgIHJldHVy
biBuZXdMb2dpY2FsVG9wIC0gbG9naWNhbFRvcDsKLQotICAgICAgICAgICAgUmVuZGVyUmVnaW9u
KiByZWdpb24gPSByZWdpb25BdEJsb2NrT2Zmc2V0KGxvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCkp
OwotICAgICAgICAgICAgTGF5b3V0UmVjdCBib3JkZXJCb3ggPSBjaGlsZC0+Ym9yZGVyQm94UmVj
dEluUmVnaW9uKHJlZ2lvbiwgRG9Ob3RDYWNoZVJlbmRlckJveFJlZ2lvbkluZm8pOwotICAgICAg
ICAgICAgTGF5b3V0VW5pdCBjaGlsZExvZ2ljYWxXaWR0aEF0T2xkTG9naWNhbFRvcE9mZnNldCA9
IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBib3JkZXJCb3gud2lkdGgoKSA6IGJvcmRlckJv
eC5oZWlnaHQoKTsKLQotICAgICAgICAgICAgLy8gRklYTUU6IE5vbmUgb2YgdGhpcyBpcyByaWdo
dCBmb3IgcGVycGVuZGljdWxhciB3cml0aW5nLW1vZGUgY2hpbGRyZW4uCi0gICAgICAgICAgICBM
YXlvdXRVbml0IGNoaWxkT2xkTG9naWNhbFdpZHRoID0gY2hpbGQtPmxvZ2ljYWxXaWR0aCgpOwot
ICAgICAgICAgICAgTGF5b3V0VW5pdCBjaGlsZE9sZE1hcmdpbkxlZnQgPSBjaGlsZC0+bWFyZ2lu
TGVmdCgpOwotICAgICAgICAgICAgTGF5b3V0VW5pdCBjaGlsZE9sZE1hcmdpblJpZ2h0ID0gY2hp
bGQtPm1hcmdpblJpZ2h0KCk7Ci0gICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkT2xkTG9naWNh
bFRvcCA9IGNoaWxkLT5sb2dpY2FsVG9wKCk7Ci0KLSAgICAgICAgICAgIGNoaWxkLT5zZXRMb2dp
Y2FsVG9wKG5ld0xvZ2ljYWxUb3ApOwotICAgICAgICAgICAgY2hpbGQtPnVwZGF0ZUxvZ2ljYWxX
aWR0aCgpOwotICAgICAgICAgICAgcmVnaW9uID0gcmVnaW9uQXRCbG9ja09mZnNldChsb2dpY2Fs
VG9wRm9yQ2hpbGQoY2hpbGQpKTsKLSAgICAgICAgICAgIGJvcmRlckJveCA9IGNoaWxkLT5ib3Jk
ZXJCb3hSZWN0SW5SZWdpb24ocmVnaW9uLCBEb05vdENhY2hlUmVuZGVyQm94UmVnaW9uSW5mbyk7
Ci0gICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbFdpZHRoQXROZXdMb2dpY2FsVG9w
T2Zmc2V0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IGJvcmRlckJveC53aWR0aCgpIDog
Ym9yZGVyQm94LmhlaWdodCgpOwotCi0gICAgICAgICAgICBjaGlsZC0+c2V0TG9naWNhbFRvcChj
aGlsZE9sZExvZ2ljYWxUb3ApOwotICAgICAgICAgICAgY2hpbGQtPnNldExvZ2ljYWxXaWR0aChj
aGlsZE9sZExvZ2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBjaGlsZC0+c2V0TWFyZ2luTGVmdChj
aGlsZE9sZE1hcmdpbkxlZnQpOwotICAgICAgICAgICAgY2hpbGQtPnNldE1hcmdpblJpZ2h0KGNo
aWxkT2xkTWFyZ2luUmlnaHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2hpbGRM
b2dpY2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQgPD0gYXZhaWxhYmxlTG9naWNhbFdpZHRo
QXROZXdMb2dpY2FsVG9wT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2gg
d2UgbWF5IG5vdCBiZSBtb3ZpbmcsIGlmIHRoZSBsb2dpY2FsIHdpZHRoIGRpZCBzaHJpbmsgYmVj
YXVzZSBvZiB0aGUgcHJlc2VuY2Ugb2YgbmV3IGZsb2F0cywgdGhlbgotICAgICAgICAgICAgICAg
IC8vIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxheW91dCBhcyB0aG91Z2ggd2Ugc2hpZnRlZC4gVGhp
cyBoYXBwZW5zIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYWRkaXRpb24gb2Ygb3Zlcmhhbmdpbmcg
ZmxvYXRzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBwcmV2aW91cyBzaWJsaW5ncyB3aGVuIG5l
Z2F0aXZlIG1hcmdpbnMgZXhpc3Qgb24gYSBjaGlsZCAoc2VlIHRoZSBhZGRPdmVyaGFuZ2luZ0Zs
b2F0cyBjYWxsIGF0IHRoZSBlbmQgb2YgY29sbGFwc2VNYXJnaW5zKS4KLSAgICAgICAgICAgICAg
ICBpZiAoY2hpbGRMb2dpY2FsV2lkdGhBdE9sZExvZ2ljYWxUb3BPZmZzZXQgIT0gY2hpbGRMb2dp
Y2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIGNoaWxk
LT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIG5ld0xvZ2ljYWxUb3AgLSBsb2dpY2FsVG9wOwotICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICBuZXdMb2dpY2FsVG9wID0gbmV4dEZsb2F0TG9naWNhbEJvdHRvbUJlbG93KG5ld0xvZ2lj
YWxUb3ApOwotICAgICAgICAgICAgQVNTRVJUKG5ld0xvZ2ljYWxUb3AgPj0gbG9naWNhbFRvcCk7
Ci0gICAgICAgICAgICBpZiAobmV3TG9naWNhbFRvcCA8IGxvZ2ljYWxUb3ApCi0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIGJvb2wgUmVuZGVyQmxvY2s6OmlzUG9pbnRJ
bk92ZXJmbG93Q29udHJvbChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IExheW91dFBvaW50
JiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZz
ZXQpCiB7CiAgICAgaWYgKCFzY3JvbGxzT3ZlcmZsb3coKSkKQEAgLTQxMjgsMzQgKzMzNjksNiBA
QCBib29sIFJlbmRlckJsb2NrOjpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVx
dWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBS
ZW5kZXJCbG9jazo6aGl0VGVzdEZsb2F0cyhjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwg
SGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5D
b250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCkKLXsKLSAgICBp
ZiAoIW1fZmxvYXRpbmdPYmplY3RzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBMYXlv
dXRQb2ludCBhZGp1c3RlZExvY2F0aW9uID0gYWNjdW11bGF0ZWRPZmZzZXQ7Ci0gICAgaWYgKGlz
UmVuZGVyVmlldygpKQotICAgICAgICBhZGp1c3RlZExvY2F0aW9uICs9IHRvTGF5b3V0U2l6ZSh0
b1JlbmRlclZpZXcoKnRoaXMpLmZyYW1lVmlldygpLnNjcm9sbFBvc2l0aW9uKCkpOwotCi0gICAg
Y29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09i
amVjdHMtPnNldCgpOwotICAgIGF1dG8gYmVnaW4gPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigp
OwotICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOyBpdCAhPSBiZWdp
bjspIHsKLSAgICAgICAgLS1pdDsKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2Jq
ZWN0ID0gaXQtPmdldCgpOwotICAgICAgICBpZiAoZmxvYXRpbmdPYmplY3QtPnNob3VsZFBhaW50
KCkgJiYgIWZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhhc1NlbGZQYWludGluZ0xheWVyKCkp
IHsKLSAgICAgICAgICAgIExheW91dFVuaXQgeE9mZnNldCA9IHhQb3NpdGlvbkZvckZsb2F0SW5j
bHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSAtIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigp
LngoKTsKLSAgICAgICAgICAgIExheW91dFVuaXQgeU9mZnNldCA9IHlQb3NpdGlvbkZvckZsb2F0
SW5jbHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSAtIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJl
cigpLnkoKTsKLSAgICAgICAgICAgIExheW91dFBvaW50IGNoaWxkUG9pbnQgPSBmbGlwRmxvYXRG
b3JXcml0aW5nTW9kZUZvckNoaWxkKGZsb2F0aW5nT2JqZWN0LCBhZGp1c3RlZExvY2F0aW9uICsg
TGF5b3V0U2l6ZSh4T2Zmc2V0LCB5T2Zmc2V0KSk7Ci0gICAgICAgICAgICBpZiAoZmxvYXRpbmdP
YmplY3QtPnJlbmRlcmVyKCkuaGl0VGVzdChyZXF1ZXN0LCByZXN1bHQsIGxvY2F0aW9uSW5Db250
YWluZXIsIGNoaWxkUG9pbnQpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSGl0VGVzdFJlc3Vs
dChyZXN1bHQsIGxvY2F0aW9uSW5Db250YWluZXIucG9pbnQoKSAtIHRvTGF5b3V0U2l6ZShjaGls
ZFBvaW50KSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIGNsYXNzIENvbHVtblJl
Y3RJdGVyYXRvciB7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ29sdW1uUmVjdEl0ZXJhdG9y
KTsKIHB1YmxpYzoKQEAgLTYwNjksNyArNTI4Miw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkanVz
dEZvckJvcmRlckZpdChMYXlvdXRVbml0IHgsIExheW91dFVuaXQmIGxlZnQsIExheW91dFVuaXQm
CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgZm9yIChSZW5kZXJCb3gqIG9iaiA9IGZpcnN0
Q2hpbGRCb3goKTsgb2JqOyBvYmogPSBvYmotPm5leHRTaWJsaW5nQm94KCkpIHsKICAgICAgICAg
ICAgICAgICBpZiAoIW9iai0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChvYmotPmlzUmVuZGVyQmxvY2tGbG93KCkgJiYgIW9iai0+
aGFzT3ZlcmZsb3dDbGlwKCkpCisgICAgICAgICAgICAgICAgICAgIGlmIChvYmotPmlzUmVuZGVy
QmxvY2soKSAmJiAhb2JqLT5oYXNPdmVyZmxvd0NsaXAoKSkKICAgICAgICAgICAgICAgICAgICAg
ICAgIHRvUmVuZGVyQmxvY2sob2JqKS0+YWRqdXN0Rm9yQm9yZGVyRml0KHggKyBvYmotPngoKSwg
bGVmdCwgcmlnaHQpOwogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmotPnN0eWxlKCkt
PnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBX
ZSBhcmUgYSByZXBsYWNlZCBlbGVtZW50IG9yIHNvbWUga2luZCBvZiBub24tYmxvY2stZmxvdyBv
YmplY3QuCkBAIC02MDc5LDIxICs1MjkyLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRqdXN0Rm9y
Qm9yZGVyRml0KExheW91dFVuaXQgeCwgTGF5b3V0VW5pdCYgbGVmdCwgTGF5b3V0VW5pdCYKICAg
ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cykgewotICAgICAgICAgICAgY29uc3QgRmxvYXRpbmdP
YmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOwot
ICAgICAgICAgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKLSAgICAgICAg
ICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgewotICAgICAgICAgICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOwot
ICAgICAgICAgICAgICAgIC8vIE9ubHkgZXhhbWluZSB0aGUgb2JqZWN0IGlmIG91ciBtX3Nob3Vs
ZFBhaW50IGZsYWcgaXMgc2V0LgotICAgICAgICAgICAgICAgIGlmIChyLT5zaG91bGRQYWludCgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIExheW91dFVuaXQgZmxvYXRMZWZ0ID0geFBvc2l0aW9u
Rm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4ocikgLSByLT5yZW5kZXJlcigpLngoKTsKLSAgICAgICAg
ICAgICAgICAgICAgTGF5b3V0VW5pdCBmbG9hdFJpZ2h0ID0gZmxvYXRMZWZ0ICsgci0+cmVuZGVy
ZXIoKS53aWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbWluKGxlZnQsIGZsb2F0
TGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gbWF4KHJpZ2h0LCBmbG9hdFJpZ2h0
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiB9
CiAKQEAgLTY2NzMsMTEgKzU4NzEsNiBAQCBjb25zdCBjaGFyKiBSZW5kZXJCbG9jazo6cmVuZGVy
TmFtZSgpIGNvbnN0CiAgICAgcmV0dXJuICJSZW5kZXJCbG9jayI7CiB9CiAKLXZvaWQgUmVuZGVy
QmxvY2s6OmNyZWF0ZUZsb2F0aW5nT2JqZWN0cygpCi17Ci0gICAgbV9mbG9hdGluZ09iamVjdHMg
PSBhZG9wdFB0cihuZXcgRmxvYXRpbmdPYmplY3RzKHRoaXMsIGlzSG9yaXpvbnRhbFdyaXRpbmdN
b2RlKCkpKTsKLX0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+CiBzdGF0aWMg
aW5saW5lIFRleHRSdW4gY29uc3RydWN0VGV4dFJ1bkludGVybmFsKFJlbmRlck9iamVjdCogY29u
dGV4dCwgY29uc3QgRm9udCYgZm9udCwgY29uc3QgQ2hhcmFjdGVyVHlwZSogY2hhcmFjdGVycywg
aW50IGxlbmd0aCwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBUZXh0UnVuOjpFeHBhbnNpb25C
ZWhhdmlvciBleHBhbnNpb24pCiB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5o
CmluZGV4IDI3OGRmZTZiYzQ1NGE0OTc0YjE4YjI4YWQ5NzE4ZjU4ZTEzODg2OTcuLmIzM2JjOTAy
NGU2ZmY5MWQ5MjQ5ODBhZmFiN2VhZjdkZDZmZTQ5MDYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9jay5oCkBAIC01Myw3ICs1Myw2IEBAIGNsYXNzIFJlbmRlclRleHQ7CiAKIHN0
cnVjdCBCaWRpUnVuOwogc3RydWN0IFBhaW50SW5mbzsKLWNsYXNzIExpbmVCcmVha2VyOwogY2xh
c3MgTGluZUluZm87CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOwogI2lmIEVOQUJMRShDU1NfU0hBUEVT
KQpAQCAtMTE4LDcgKzExNyw4IEBAIHB1YmxpYzoKICAgICBJbmxpbmVGbG93Qm94KiBmaXJzdExp
bmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5maXJzdExpbmVCb3goKTsgfQogICAg
IElubGluZUZsb3dCb3gqIGxhc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMu
bGFzdExpbmVCb3goKTsgfQogCi0gICAgdm9pZCBkZWxldGVMaW5lQm94VHJlZSgpOworICAgIC8v
IEZJWE1FLUJMT0NLRkxPVzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBo
YXZlIG1vdmVkIHRvIFJlbmRlckJsb2NrRmxvdworICAgIHZpcnR1YWwgdm9pZCBkZWxldGVMaW5l
Qm94VHJlZSgpOwogCiAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3
Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQgPSAwKSBPVkVSUklERTsKICAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZWN0KikgT1ZFUlJJREU7CkBAIC0xMjksOCAr
MTI5LDYgQEAgcHVibGljOgogICAgIHN0YXRpYyB2b2lkIHJlbW92ZVBvc2l0aW9uZWRPYmplY3Qo
UmVuZGVyQm94Kik7CiAgICAgdm9pZCByZW1vdmVQb3NpdGlvbmVkT2JqZWN0cyhSZW5kZXJCbG9j
ayosIENvbnRhaW5pbmdCbG9ja1N0YXRlID0gU2FtZUNvbnRhaW5pbmdCbG9jayk7CiAKLSAgICB2
b2lkIHJlbW92ZUZsb2F0aW5nT2JqZWN0cygpOwotCiAgICAgVHJhY2tlZFJlbmRlcmVyTGlzdEhh
c2hTZXQqIHBvc2l0aW9uZWRPYmplY3RzKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNQb3NpdGlvbmVk
T2JqZWN0cygpIGNvbnN0CiAgICAgewpAQCAtMTYyLDEzICsxNjAsMTEgQEAgcHVibGljOgogCiAg
ICAgYm9vbCBnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmplY3QqKTsK
IAotICAgIHZvaWQgbWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChSZW5kZXJC
b3gqIGZsb2F0VG9SZW1vdmUgPSAwLCBib29sIGluTGF5b3V0ID0gdHJ1ZSk7Ci0gICAgdm9pZCBt
YXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KFJlbmRlckJveCogZmxvYXRUb1JlbW92ZSA9
IDApOwogICAgIHZvaWQgbWFya1Bvc2l0aW9uZWRPYmplY3RzRm9yTGF5b3V0KCk7CiAgICAgdmly
dHVhbCB2b2lkIG1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgpIE9WRVJSSURFIEZJ
TkFMOwogICAgIAotICAgIGJvb2wgY29udGFpbnNGbG9hdHMoKSBjb25zdCB7IHJldHVybiBtX2Zs
b2F0aW5nT2JqZWN0cyAmJiAhbV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmlzRW1wdHkoKTsgfQot
ICAgIGJvb2wgY29udGFpbnNGbG9hdChSZW5kZXJCb3gqKSBjb25zdDsKKyAgICAvLyBGSVhNRS1C
TE9DS0ZMT1c6IFJlbW92ZSB2aXJ0dWFsaXphaW9uIHdoZW4gYWxsIG9mIHRoZSBsaW5lIGxheW91
dCBjb2RlIGhhcyBiZWVuIG1vdmVkIG91dCBvZiBSZW5kZXJCbG9jaworICAgIHZpcnR1YWwgYm9v
bCBjb250YWluc0Zsb2F0cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgICAvLyBWZXJz
aW9ucyB0aGF0IGNhbiBjb21wdXRlIGxpbmUgb2Zmc2V0cyB3aXRoIHRoZSByZWdpb24gYW5kIHBh
Z2Ugb2Zmc2V0IHBhc3NlZCBpbi4gVXNlZCBmb3Igc3BlZWQgdG8gYXZvaWQgaGF2aW5nIHRvCiAg
ICAgLy8gY29tcHV0ZSB0aGUgcmVnaW9uIGFsbCBvdmVyIGFnYWluIHdoZW4geW91IGFscmVhZHkg
a25vdyBpdC4KQEAgLTI5Miw4ICsyODgsNiBAQCBwdWJsaWM6CiAgICAgewogICAgICAgICByZXR1
cm4gb2JqLT5pc0Zsb2F0aW5nKCkgfHwgKG9iai0+aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYg
IW9iai0+c3R5bGUoKS0+aXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCkgJiYgIW9iai0+Y29u
dGFpbmVyKCktPmlzUmVuZGVySW5saW5lKCkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9p
ZCBhcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgaW50IHN0YXJ0LCBp
bnQgZW5kLCBSZW5kZXJPYmplY3QqLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsKIAogICAgIHN0YXRp
YyBUZXh0UnVuIGNvbnN0cnVjdFRleHRSdW4oUmVuZGVyT2JqZWN0KiBjb250ZXh0LCBjb25zdCBG
b250JiwgY29uc3QgU3RyaW5nJiwgY29uc3QgUmVuZGVyU3R5bGUmLAogICAgICAgICBUZXh0UnVu
OjpFeHBhbnNpb25CZWhhdmlvciA9IFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24gfCBU
ZXh0UnVuOjpGb3JiaWRMZWFkaW5nRXhwYW5zaW9uLCBUZXh0UnVuRmxhZ3MgPSBEZWZhdWx0VGV4
dFJ1bkZsYWdzKTsKQEAgLTUxMywxMSArNTA3LDEwIEBAIHByb3RlY3RlZDoKICAgICB2b2lkIHNl
dERlc2lyZWRDb2x1bW5Db3VudEFuZFdpZHRoKGludCwgTGF5b3V0VW5pdCk7CiAKIHB1YmxpYzoK
LSAgICB2b2lkIGNvbXB1dGVPdmVyZmxvdyhMYXlvdXRVbml0IG9sZENsaWVudEFmdGVyRWRnZSwg
Ym9vbCByZWNvbXB1dGVGbG9hdHMgPSBmYWxzZSk7CisgICAgdmlydHVhbCB2b2lkIGNvbXB1dGVP
dmVyZmxvdyhMYXlvdXRVbml0IG9sZENsaWVudEFmdGVyRWRnZSwgYm9vbCByZWNvbXB1dGVGbG9h
dHMgPSBmYWxzZSk7CiAgICAgdm9pZCBjbGVhckxheW91dE92ZXJmbG93KCk7CiBwcm90ZWN0ZWQ6
CiAgICAgdmlydHVhbCB2b2lkIGFkZE92ZXJmbG93RnJvbUNoaWxkcmVuKCk7Ci0gICAgdm9pZCBh
ZGRPdmVyZmxvd0Zyb21GbG9hdHMoKTsKICAgICB2b2lkIGFkZE92ZXJmbG93RnJvbVBvc2l0aW9u
ZWRPYmplY3RzKCk7CiAgICAgdm9pZCBhZGRPdmVyZmxvd0Zyb21CbG9ja0NoaWxkcmVuKCk7CiAg
ICAgdm9pZCBhZGRPdmVyZmxvd0Zyb21JbmxpbmVDaGlsZHJlbigpOwpAQCAtNTM3LDggKzUzMCwx
MCBAQCBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB2b2lkIGNoZWNrRm9yUGFnaW5hdGlvbkxvZ2lj
YWxIZWlnaHRDaGFuZ2UoTGF5b3V0VW5pdCYgcGFnZUxvZ2ljYWxIZWlnaHQsIGJvb2wmIHBhZ2VM
b2dpY2FsSGVpZ2h0Q2hhbmdlZCwgYm9vbCYgaGFzU3BlY2lmaWVkUGFnZUxvZ2ljYWxIZWlnaHQp
OwogCiBwcml2YXRlOgotICAgIExheW91dFVuaXQgbG9naWNhbFJpZ2h0RmxvYXRPZmZzZXRGb3JM
aW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5b3V0
VW5pdCogaGVpZ2h0UmVtYWluaW5nLCBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNoYXBlT3V0
c2lkZUZsb2F0T2Zmc2V0TW9kZSkgY29uc3Q7Ci0gICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdEZs
b2F0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRP
ZmZzZXQsIExheW91dFVuaXQqIGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVp
Z2h0LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUpIGNvbnN0OworICAgIC8vIEZJWE1FLUJM
T0NLRkxPVzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBoYXZlIG1vdmVk
IHRvIFJlbmRlckJsb2NrRmxvdworICAgIHZpcnR1YWwgTGF5b3V0VW5pdCBsb2dpY2FsUmlnaHRG
bG9hdE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCwgTGF5b3V0VW5pdCBmaXhlZE9mZnNldCwgTGF5
b3V0VW5pdCosIExheW91dFVuaXQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSkgY29uc3Qg
eyByZXR1cm4gZml4ZWRPZmZzZXQ7IH07CisgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUg
dmlydHVhbGl6YWlvbiB3aGVuIGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQgdG8gUmVuZGVyQmxvY2tG
bG93CisgICAgdmlydHVhbCBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0RmxvYXRPZmZzZXRGb3JMaW5l
KExheW91dFVuaXQsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQqLCBMYXlvdXRV
bml0LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUpIGNvbnN0IHsgcmV0dXJuIGZpeGVkT2Zm
c2V0OyB9CiAgICAgTGF5b3V0VW5pdCBhZGp1c3RMb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5lKExh
eW91dFVuaXQgb2Zmc2V0RnJvbUZsb2F0cywgYm9vbCBhcHBseVRleHRJbmRlbnQpIGNvbnN0Owog
ICAgIExheW91dFVuaXQgYWRqdXN0TG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQg
b2Zmc2V0RnJvbUZsb2F0cywgYm9vbCBhcHBseVRleHRJbmRlbnQpIGNvbnN0OwogCkBAIC01NTYs
NyArNTUxLDggQEAgcHJpdmF0ZToKICAgICB2b2lkIG1ha2VDaGlsZHJlbk5vbklubGluZShSZW5k
ZXJPYmplY3QqIGluc2VydGlvblBvaW50ID0gMCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUxl
ZnRvdmVyQW5vbnltb3VzQmxvY2soUmVuZGVyQmxvY2sqIGNoaWxkKTsKIAotICAgIHZvaWQgbW92
ZUFsbENoaWxkcmVuSW5jbHVkaW5nRmxvYXRzVG8oUmVuZGVyQmxvY2sqIHRvQmxvY2ssIGJvb2wg
ZnVsbFJlbW92ZUluc2VydCk7CisgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdmlydHVh
bGl6YWlvbiB3aGVuIGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQgdG8gUmVuZGVyQmxvY2tGbG93Cisg
ICAgdmlydHVhbCB2b2lkIG1vdmVBbGxDaGlsZHJlbkluY2x1ZGluZ0Zsb2F0c1RvKFJlbmRlckJs
b2NrKiB0b0Jsb2NrLCBib29sIGZ1bGxSZW1vdmVJbnNlcnQpIHsgbW92ZUFsbENoaWxkcmVuVG8o
dG9CbG9jaywgZnVsbFJlbW92ZUluc2VydCk7IH0KIAogICAgIHZvaWQgYWRkQ2hpbGRUb0NvbnRp
bnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxk
KTsKICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJP
YmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKSBPVkVSUklERTsKQEAg
LTU2NiwxMCArNTYyLDYgQEAgcHJpdmF0ZToKICAgICAKICAgICB2aXJ0dWFsIGJvb2wgaXNTZWxm
Q29sbGFwc2luZ0Jsb2NrKCkgY29uc3QgT1ZFUlJJREUgRklOQUw7CiAKLSAgICB2aXJ0dWFsIHZv
aWQgcmVwYWludE92ZXJoYW5naW5nRmxvYXRzKGJvb2wgcGFpbnRBbGxEZXNjZW5kYW50cykgT1ZF
UlJJREUgRklOQUw7Ci0KLSAgICBCaWRpUnVuKiBoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVu
TGlzdDxCaWRpUnVuPiYsIEJpZGlDb250ZXh0Kik7Ci0KICAgICB2b2lkIGluc2VydEludG9UcmFj
a2VkUmVuZGVyZXJNYXBzKFJlbmRlckJveCogZGVzY2VuZGFudCwgVHJhY2tlZERlc2NlbmRhbnRz
TWFwKiYsIFRyYWNrZWRDb250YWluZXJNYXAqJik7CiAgICAgc3RhdGljIHZvaWQgcmVtb3ZlRnJv
bVRyYWNrZWRSZW5kZXJlck1hcHMoUmVuZGVyQm94KiBkZXNjZW5kYW50LCBUcmFja2VkRGVzY2Vu
ZGFudHNNYXAqJiwgVHJhY2tlZENvbnRhaW5lck1hcComKTsKIApAQCAtNjE0LDYzICs2MDYsMjAg
QEAgcHJpdmF0ZToKICAgICAgICAgICAgIHJldHVybiBjaGlsZC0+eSgpICsgY2hpbGQtPnJlbmRl
cmVyKCkubWFyZ2luVG9wKCk7CiAgICAgfQogCi0gICAgTGF5b3V0UG9pbnQgY29tcHV0ZUxvZ2lj
YWxMb2NhdGlvbkZvckZsb2F0KGNvbnN0IEZsb2F0aW5nT2JqZWN0KiwgTGF5b3V0VW5pdCBsb2dp
Y2FsVG9wT2Zmc2V0KSBjb25zdDsKLQotICAgIHZvaWQgY2hlY2tGbG9hdHNJbkNsZWFuTGluZShS
b290SW5saW5lQm94KiwgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+Jiwgc2l6ZV90JiBmbG9hdEluZGV4
LCBib29sJiBlbmNvdW50ZXJlZE5ld0Zsb2F0LCBib29sJiBkaXJ0aWVkQnlGbG9hdCk7Ci0gICAg
Um9vdElubGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmLCBJ
bmxpbmVCaWRpUmVzb2x2ZXImKTsKLSAgICB2b2lkIGRldGVybWluZUVuZFBvc2l0aW9uKExpbmVM
YXlvdXRTdGF0ZSYsIFJvb3RJbmxpbmVCb3gqIHN0YXJ0Qm94LCBJbmxpbmVJdGVyYXRvciYgY2xl
YW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpOwotICAgIGJvb2wg
bWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiwgY29uc3QgSW5saW5lQmlkaVJlc29sdmVy
JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYg
ZW5kTGluZVN0YXR1cyk7Ci0gICAgYm9vbCBjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExp
bmUoTGluZUxheW91dFN0YXRlJik7Ci0gICAgCi0gICAgUm9vdElubGluZUJveCogY29uc3RydWN0
TGluZShCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGNvbnN0IExpbmVJbmZvJik7Ci0gICAgSW5saW5l
Rmxvd0JveCogY3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVjdCosIGNvbnN0IExpbmVJbmZvJiwg
SW5saW5lQm94KiBjaGlsZEJveCwgYm9vbCBzdGFydHNOZXdTZWdtZW50KTsKLQotICAgIHZvaWQg
c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biosIFJlbmRlclJ1YnlSdW4qLCBSZW5kZXJPYmpl
Y3QqLCBjb25zdCBMaW5lSW5mbyYpOwotCi0gICAgQmlkaVJ1biogY29tcHV0ZUlubGluZURpcmVj
dGlvblBvc2l0aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJveCosIGNvbnN0IExpbmVJbmZvJiwg
RVRleHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0LAotICAgICAgICBmbG9hdCYgYXZhaWxhYmxl
TG9naWNhbFdpZHRoLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1
biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUmLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9pZCBjb21wdXRl
SW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgY29uc3QgTGlu
ZUluZm8mLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9v
bCByZWFjaGVkRW5kLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYsIFZlcnRpY2Fs
UG9zaXRpb25DYWNoZSYsIFdvcmRNZWFzdXJlbWVudHMmKTsKLSAgICB2b2lkIGNvbXB1dGVCbG9j
a0RpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIEJpZGlSdW4qLCBHbHlw
aE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYpOwot
ICAgIHZvaWQgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKLSAgICB2b2lkIGNoZWNrTGluZXNG
b3JUZXh0T3ZlcmZsb3coKTsKLQotICAgIC8vIFBvc2l0aW9ucyBuZXcgZmxvYXRzIGFuZCBhbHNv
IGFkanVzdCBhbGwgZmxvYXRzIGVuY291bnRlcmVkIG9uIHRoZSBsaW5lIGlmIGFueSBvZiB0aGVt
Ci0gICAgLy8gaGF2ZSB0byBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2UvY29sdW1uLgotICAgIGJvb2wg
cG9zaXRpb25OZXdGbG9hdE9uTGluZShGbG9hdGluZ09iamVjdCogbmV3RmxvYXQsIEZsb2F0aW5n
T2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lSW5mbyYsIExpbmVXaWR0aCYp
OwotICAgIHZvaWQgYXBwZW5kRmxvYXRpbmdPYmplY3RUb0xhc3RMaW5lKEZsb2F0aW5nT2JqZWN0
Kik7Ci0KLSAgICAvLyBFbmQgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gUmVuZGVyQmxvY2tMaW5l
TGF5b3V0LmNwcC4KLQotICAgIHZvaWQgcGFpbnRGbG9hdHMoUGFpbnRJbmZvJiwgY29uc3QgTGF5
b3V0UG9pbnQmLCBib29sIHByZXNlcnZlUGhhc2UgPSBmYWxzZSk7CisgICAgLy8gRklYTUUtQkxP
Q0tGTE9XOiBSZW1vdmUgdmlydHVhbGl6YWlvbiB3aGVuIGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQg
dG8gUmVuZGVyQmxvY2tGbG93CisgICAgdmlydHVhbCB2b2lkIHBhaW50RmxvYXRzKFBhaW50SW5m
byYsIGNvbnN0IExheW91dFBvaW50JiwgYm9vbCkgeyB9CiAgICAgdm9pZCBwYWludENvbnRlbnRz
KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50Jik7CiAgICAgdm9pZCBwYWludENvbHVtbkNv
bnRlbnRzKFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgYm9vbCBwYWludEZsb2F0cyA9
IGZhbHNlKTsKICAgICB2b2lkIHBhaW50Q29sdW1uUnVsZXMoUGFpbnRJbmZvJiwgY29uc3QgTGF5
b3V0UG9pbnQmKTsKICAgICB2b2lkIHBhaW50U2VsZWN0aW9uKFBhaW50SW5mbyYsIGNvbnN0IExh
eW91dFBvaW50Jik7CiAgICAgdm9pZCBwYWludENhcmV0KFBhaW50SW5mbyYsIGNvbnN0IExheW91
dFBvaW50JiwgQ2FyZXRUeXBlKTsKIAotICAgIEZsb2F0aW5nT2JqZWN0KiBpbnNlcnRGbG9hdGlu
Z09iamVjdChSZW5kZXJCb3gqKTsKLSAgICB2b2lkIHJlbW92ZUZsb2F0aW5nT2JqZWN0KFJlbmRl
ckJveCopOwotICAgIHZvaWQgcmVtb3ZlRmxvYXRpbmdPYmplY3RzQmVsb3coRmxvYXRpbmdPYmpl
Y3QqLCBpbnQgbG9naWNhbE9mZnNldCk7Ci0gICAgCi0gICAgLy8gQ2FsbGVkIGZyb20gbGluZVdp
ZHRoLCB0byBwb3NpdGlvbiB0aGUgZmxvYXRzIGFkZGVkIGluIHRoZSBsYXN0IGxpbmUuCi0gICAg
Ly8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIGl0IGhhcyBwb3NpdGlvbmVkIGFueSBmbG9h
dHMuCi0gICAgYm9vbCBwb3NpdGlvbk5ld0Zsb2F0cygpOwotCi0gICAgTGF5b3V0VW5pdCBnZXRD
bGVhckRlbHRhKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQgeVBvcyk7Ci0KICAgICB2aXJ0
dWFsIGJvb2wgYXZvaWRzRmxvYXRzKCkgY29uc3QgT1ZFUlJJREU7CiAKLSAgICBib29sIGhhc092
ZXJoYW5naW5nRmxvYXRzKCkgeyByZXR1cm4gcGFyZW50KCkgJiYgIWhhc0NvbHVtbnMoKSAmJiBj
b250YWluc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpID4gbG9naWNhbEhl
aWdodCgpOyB9Ci0gICAgYm9vbCBoYXNPdmVyaGFuZ2luZ0Zsb2F0KFJlbmRlckJveCopOwotICAg
IHZvaWQgYWRkSW50cnVkaW5nRmxvYXRzKFJlbmRlckJsb2NrKiBwcmV2LCBMYXlvdXRVbml0IHhv
ZmZzZXQsIExheW91dFVuaXQgeW9mZnNldCk7Ci0gICAgTGF5b3V0VW5pdCBhZGRPdmVyaGFuZ2lu
Z0Zsb2F0cyhSZW5kZXJCbG9jayogY2hpbGQsIGJvb2wgbWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0
cyk7Ci0KLSAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09i
amVjdDo6VHlwZSA9IEZsb2F0aW5nT2JqZWN0OjpGbG9hdExlZnRSaWdodCkgY29uc3Q7IAotICAg
IExheW91dFVuaXQgbmV4dEZsb2F0TG9naWNhbEJvdHRvbUJlbG93KExheW91dFVuaXQsIFNoYXBl
T3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSA9IFNoYXBlT3V0c2lkZUZsb2F0TWFyZ2luQm94T2Zmc2V0
KSBjb25zdDsKLSAgICAKICAgICBib29sIGhpdFRlc3RDb2x1bW5zKGNvbnN0IEhpdFRlc3RSZXF1
ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNv
bnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBIaXRUZXN0QWN0
aW9uKTsKICAgICB2aXJ0dWFsIGJvb2wgaGl0VGVzdENvbnRlbnRzKGNvbnN0IEhpdFRlc3RSZXF1
ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNv
bnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBIaXRUZXN0QWN0
aW9uKTsKLSAgICBib29sIGhpdFRlc3RGbG9hdHMoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRU
ZXN0UmVzdWx0JiwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBj
b25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQpOworICAgIC8vIEZJWE1FLUJMT0NL
RkxPVzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBoYXZlIG1vdmVkIHRv
IFJlbmRlckJsb2NrRmxvdworICAgIHZpcnR1YWwgYm9vbCBoaXRUZXN0RmxvYXRzKGNvbnN0IEhp
dFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYsIGNv
bnN0IExheW91dFBvaW50JikgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgYm9vbCBp
c1BvaW50SW5PdmVyZmxvd0NvbnRyb2woSGl0VGVzdFJlc3VsdCYsIGNvbnN0IExheW91dFBvaW50
JiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZz
ZXQpOwogCkBAIC03MDYsNiArNjU1LDggQEAgcHJpdmF0ZToKICAgICBMYXlvdXRVbml0IGxvZ2lj
YWxMZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIExheW91dFVuaXQg
cG9zaXRpb24sIGNvbnN0IExvZ2ljYWxTZWxlY3Rpb25PZmZzZXRDYWNoZXMmKTsKICAgICBMYXlv
dXRVbml0IGxvZ2ljYWxSaWdodFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2Nr
LCBMYXlvdXRVbml0IHBvc2l0aW9uLCBjb25zdCBMb2dpY2FsU2VsZWN0aW9uT2Zmc2V0Q2FjaGVz
Jik7CiAgICAgCisgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdmlydHVhbGl6YWlvbiB3
aGVuIGFsbCBjYWxsZXJzIGhhdmUgbW92ZWQgdG8gUmVuZGVyQmxvY2tGbG93CisgICAgdmlydHVh
bCB2b2lkIGNsaXBPdXRGbG9hdGluZ09iamVjdHMoUmVuZGVyQmxvY2sqLCBjb25zdCBQYWludElu
Zm8qLCBjb25zdCBMYXlvdXRQb2ludCYsIGNvbnN0IExheW91dFNpemUmKSB7IH07CiAgICAgZnJp
ZW5kIGNsYXNzIExvZ2ljYWxTZWxlY3Rpb25PZmZzZXRDYWNoZXM7CiAKICAgICB2aXJ0dWFsIHZv
aWQgYWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mLCBjb25zdCBMYXlvdXRQb2ludCYgYWNj
dW11bGF0ZWRPZmZzZXQpIGNvbnN0IE9WRVJSSURFOwpAQCAtNzIxLDEyICs2NzIsMTAgQEAgcHJp
dmF0ZToKICAgICB2b2lkIGFkanVzdFBvaW50VG9Db2x1bW5Db250ZW50cyhMYXlvdXRQb2ludCYp
IGNvbnN0OwogICAgIAogICAgIHZvaWQgZml0Qm9yZGVyVG9MaW5lc0lmTmVlZGVkKCk7IC8vIFNo
cmluayB0aGUgYm94IGluIHdoaWNoIHRoZSBib3JkZXIgcGFpbnRzIGlmIGJvcmRlci1maXQgaXMg
c2V0LgotICAgIHZvaWQgYWRqdXN0Rm9yQm9yZGVyRml0KExheW91dFVuaXQgeCwgTGF5b3V0VW5p
dCYgbGVmdCwgTGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0OyAvLyBIZWxwZXIgZnVuY3Rpb24gZm9y
IGJvcmRlckZpdEFkanVzdAorICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RGb3JCb3JkZXJGaXQoTGF5
b3V0VW5pdCB4LCBMYXlvdXRVbml0JiBsZWZ0LCBMYXlvdXRVbml0JiByaWdodCkgY29uc3Q7IC8v
IEhlbHBlciBmdW5jdGlvbiBmb3IgYm9yZGVyRml0QWRqdXN0CiAKICAgICB2b2lkIG1hcmtMaW5l
c0RpcnR5SW5CbG9ja1JhbmdlKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBsb2dp
Y2FsQm90dG9tLCBSb290SW5saW5lQm94KiBoaWdoZXN0ID0gMCk7CiAKLSAgICB2b2lkIG5ld0xp
bmUoRUNsZWFyKTsKLQogICAgIFBvc2l0aW9uIHBvc2l0aW9uRm9yQm94KElubGluZUJveCosIGJv
b2wgc3RhcnQgPSB0cnVlKSBjb25zdDsKICAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25Gb3JQ
b2ludFdpdGhJbmxpbmVDaGlsZHJlbihjb25zdCBMYXlvdXRQb2ludCYpOwogCkBAIC03NDgsMTkg
KzY5Nyw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCBtb3ZlUnVuSW5VbmRlclNpYmxpbmdCbG9ja0lm
TmVlZGVkKFJlbmRlck9iamVjdCogcnVuSW4pOwogICAgIHZvaWQgbW92ZVJ1bkluVG9PcmlnaW5h
bFBvc2l0aW9uKFJlbmRlck9iamVjdCogcnVuSW4pOwogCi0gICAgLy8gSGVscGVyIGZ1bmN0aW9u
IGZvciBsYXlvdXRJbmxpbmVDaGlsZHJlbigpCi0gICAgUm9vdElubGluZUJveCogY3JlYXRlTGlu
ZUJveGVzRnJvbUJpZGlSdW5zKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgSW5saW5lSXRl
cmF0b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0
cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0gICAgdm9pZCBsYXlvdXRSdW5z
QW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYsIGJvb2wgaGFzSW5saW5lQ2hpbGQpOwotICAgIHZv
aWQgbGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxheW91dFN0YXRlJiwgSW5saW5lQmlk
aVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBC
aWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhl
bmF0ZWRMaW5lcyk7Ci0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi0gICAgdm9pZCB1cGRhdGVTaGFw
ZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmUoU2hhcGVJbnNpZGVJbmZvKiYsIGNvbnN0IExheW91
dFNpemUmLCBMaW5lTGF5b3V0U3RhdGUmKTsKLSAgICB2b2lkIHVwZGF0ZVNoYXBlQW5kU2VnbWVu
dHNGb3JDdXJyZW50TGluZUluRmxvd1RocmVhZChTaGFwZUluc2lkZUluZm8qJiwgTGluZUxheW91
dFN0YXRlJik7Ci0gICAgYm9vbCBhZGp1c3RMb2dpY2FsTGluZVRvcEFuZExvZ2ljYWxIZWlnaHRJ
Zk5lZWRlZChTaGFwZUluc2lkZUluZm8qLCBMYXlvdXRVbml0LCBMaW5lTGF5b3V0U3RhdGUmLCBJ
bmxpbmVCaWRpUmVzb2x2ZXImLCBGbG9hdGluZ09iamVjdCosIElubGluZUl0ZXJhdG9yJiwgV29y
ZE1lYXN1cmVtZW50cyYpOwotI2VuZGlmCi0gICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIHJlc3Rh
cnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQs
IExheW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRG
cm9tUHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2ZXImLCAgY29uc3QgSW5saW5lSXRlcmF0
b3ImKTsKLSAgICB2b2lkIGxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmKTsK
LSAgICBzdGF0aWMgdm9pZCByZXBhaW50RGlydHlGbG9hdHMoVmVjdG9yPEZsb2F0V2l0aFJlY3Q+
JiBmbG9hdHMpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBkaXJ0eUZvckxheW91dEZyb21QZXJj
ZW50YWdlSGVpZ2h0RGVzY2VuZGFudHMoKTsKICAgICAKQEAgLTgyMSw5ICs3NTcsOCBAQCBwdWJs
aWM6CiAgICAgLy8gRklYTUU6IFRoaXMgaXMgdGVtcG9yYXJ5IHRvIGFsbG93IHVzIHRvIG1vdmUg
Y29kZSBmcm9tIFJlbmRlckJsb2NrIGludG8gUmVuZGVyQmxvY2tGbG93IHRoYXQgYWNjZXNzZXMg
bWVtYmVyIHZhcmlhYmxlcyB0aGF0IHdlIGhhdmVuJ3QgbW92ZWQgb3V0IG9mCiAgICAgLy8gUmVu
ZGVyQmxvY2sgeWV0LgogICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJCbG9ja0Zsb3c7Ci0KLXByb3Rl
Y3RlZDoKLSAgICB2b2lkIGNyZWF0ZUZsb2F0aW5nT2JqZWN0cygpOworICAgIC8vIEZJWE1FLUJM
T0NLRkxPVzogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgbGluZSBsYXlvdXQgc3R1ZmYgaGFzIGFsbCBt
b3ZlZCBvdXQgb2YgUmVuZGVyQmxvY2sKKyAgICBmcmllbmQgY2xhc3MgTGluZUJyZWFrZXI7CiAK
IHB1YmxpYzoKICAgICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRz
IGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCkBAIC04NDYsNyArNzgxLDYgQEAgcHVibGljOgogCiBw
cm90ZWN0ZWQ6CiAKLSAgICBPd25QdHI8RmxvYXRpbmdPYmplY3RzPiBtX2Zsb2F0aW5nT2JqZWN0
czsKICAgICBPd25QdHI8UmVuZGVyQmxvY2tSYXJlRGF0YT4gbV9yYXJlRGF0YTsKIAogICAgIFJl
bmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgcm9vdCBsaW5lIGJv
eGVzIGNyZWF0ZWQgZm9yIHRoaXMgYmxvY2sgZmxvdy4gIEZvciBleGFtcGxlLCA8ZGl2PkhlbGxv
PGJyPndvcmxkLjwvZGl2PiB3aWxsIGhhdmUgdHdvIHRvdGFsIGxpbmVzIGZvciB0aGUgPGRpdj4u
CkBAIC04NjYsOCArODAwLDYgQEAgcHJvdGVjdGVkOgogICAgIC8vIFJlbmRlclJ1YnlCYXNlIG9i
amVjdHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFuZCBtZXJnZSwgbW92aW5nIHRoZWlyIGNo
aWxkcmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1vdmVDaGlsZFRvLCBtb3ZlQWxsQ2hpbGRy
ZW5UbywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSkuCiAgICAgZnJpZW5kIGNsYXNzIFJlbmRl
clJ1YnlCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBMaW5lQnJlYWtlcjsKLSAgICBmcmllbmQgY2xh
c3MgTGluZVdpZHRoOyAvLyBOZWVkcyB0byBrbm93IEZsb2F0aW5nT2JqZWN0CiAKIHByaXZhdGU6
CiAgICAgLy8gVXNlZCB0byBzdG9yZSBzdGF0ZSBiZXR3ZWVuIHN0eWxlV2lsbENoYW5nZSBhbmQg
c3R5bGVEaWRDaGFuZ2UKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9ja0Zsb3cuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxv
dy5jcHAKaW5kZXggMzRjMmQwYWQ2ZTY5NzM4NWY0ZTRlNjFlNTA0M2I4MzRjM2VlZDg0MC4uNjRj
YWY4ZWZjNWY1ZWQ1MGI4MTZkZTkwMmNhMWQ3YzkwNjdjNWYyNSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNs
dWRlICJSZW5kZXJCbG9ja0Zsb3cuaCIKIAogI2luY2x1ZGUgIkZsb2F0aW5nT2JqZWN0cy5oIgor
I2luY2x1ZGUgIkhpdFRlc3RMb2NhdGlvbi5oIgogI2luY2x1ZGUgIkxheW91dFJlcGFpbnRlci5o
IgogI2luY2x1ZGUgIlJlbmRlckZsb3dUaHJlYWQuaCIKICNpbmNsdWRlICJSZW5kZXJMYXllci5o
IgpAQCAtMzUsNiArMzYsOCBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKK2Jvb2wgUmVuZGVyQmxvY2s6OnNfY2FuUHJvcGFnYXRlRmxvYXRJbnRvU2libGlu
ZyA9IGZhbHNlOworCiBzdHJ1Y3QgU2FtZVNpemVBc01hcmdpbkluZm8gewogICAgIHVpbnQzMl90
IGJpdGZpZWxkcyA6IDE2OwogICAgIExheW91dFVuaXQgbWFyZ2luc1syXTsKQEAgLTEzMSwxNiAr
MTM0LDE2IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpjbGVhckZsb2F0cygpCiAgICAgLy8gV2Ug
c2hvdWxkIG5vdCBwcm9jZXNzIGZsb2F0cyBpZiB0aGUgcGFyZW50IG5vZGUgaXMgbm90IGEgUmVu
ZGVyQmxvY2suIE90aGVyd2lzZSwgd2Ugd2lsbCBhZGQgCiAgICAgLy8gZmxvYXRzIGluIGFuIGlu
dmFsaWQgY29udGV4dC4gVGhpcyB3aWxsIGNhdXNlIGEgY3Jhc2ggYXJpc2luZyBmcm9tIGEgYmFk
IGNhc3Qgb24gdGhlIHBhcmVudC4KICAgICAvLyBTZWUgPHJkYXI6Ly9wcm9ibGVtLzgwNDk3NTM+
LCB3aGVyZSBmbG9hdCBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGEgdGV4dCBub2RlIGluIGEgU1ZH
LgotICAgIGlmICghcGFyZW50KCkgfHwgIXBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkpCisgICAg
aWYgKCFwYXJlbnQoKSB8fCAhcGFyZW50KCktPmlzUmVuZGVyQmxvY2tGbG93KCkpCiAgICAgICAg
IHJldHVybjsKIAogICAgIC8vIEF0dGVtcHQgdG8gbG9jYXRlIGEgcHJldmlvdXMgc2libGluZyB3
aXRoIG92ZXJoYW5naW5nIGZsb2F0cy4gV2Ugc2tpcCBhbnkgZWxlbWVudHMgdGhhdCBhcmUKICAg
ICAvLyBvdXQgb2YgZmxvdyAobGlrZSBmbG9hdGluZy9wb3NpdGlvbmVkIGVsZW1lbnRzKSwgYW5k
IHdlIGFsc28gc2tpcCBvdmVyIGFueSBvYmplY3RzIHRoYXQgbWF5IGhhdmUgc2hpZnRlZAogICAg
IC8vIHRvIGF2b2lkIGZsb2F0cy4KLSAgICBSZW5kZXJCbG9jayogcGFyZW50QmxvY2sgPSB0b1Jl
bmRlckJsb2NrKHBhcmVudCgpKTsKKyAgICBSZW5kZXJCbG9ja0Zsb3cqIHBhcmVudEJsb2NrID0g
dG9SZW5kZXJCbG9ja0Zsb3cocGFyZW50KCkpOwogICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0g
ZmFsc2U7CiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAg
d2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSB8
fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxv
Y2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgIHdoaWxlIChwcmV2ICYmIChwcmV2LT5p
c0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgIXByZXYtPmlzQm94KCkgfHwgIXBy
ZXYtPmlzUmVuZGVyQmxvY2tGbG93KCkgfHwgdG9SZW5kZXJCbG9ja0Zsb3cocHJldiktPmF2b2lk
c0Zsb2F0cygpKSkgewogICAgICAgICBpZiAocHJldi0+aXNGbG9hdGluZygpKQogICAgICAgICAg
ICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3Vz
U2libGluZygpOwpAQCAtMTYwLDcgKzE2Myw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpjbGVh
ckZsb2F0cygpCiAgICAgfQogCiAgICAgLy8gQWRkIG92ZXJoYW5naW5nIGZsb2F0cyBmcm9tIHRo
ZSBwcmV2aW91cyBSZW5kZXJCbG9jaywgYnV0IG9ubHkgaWYgaXQgaGFzIGEgZmxvYXQgdGhhdCBp
bnRydWRlcyBpbnRvIG91ciBzcGFjZS4gICAgCi0gICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gdG9S
ZW5kZXJCbG9jayhwcmV2KTsKKyAgICBSZW5kZXJCbG9ja0Zsb3cqIGJsb2NrID0gdG9SZW5kZXJC
bG9ja0Zsb3cocHJldik7CiAgICAgaWYgKGJsb2NrLT5tX2Zsb2F0aW5nT2JqZWN0cyAmJiBibG9j
ay0+bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBsb2dpY2FsVG9wT2Zmc2V0KQogICAgICAg
ICBhZGRJbnRydWRpbmdGbG9hdHMoYmxvY2ssIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBsb2dpY2FsVG9w
T2Zmc2V0KTsKIApAQCAtMzE3LDcgKzMyMCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlv
dXRCbG9jayhib29sIHJlbGF5b3V0Q2hpbGRyZW4sIExheW91dFVuaXQgcGFnZUxvZ2ljYWxICiAg
ICAgICAgICAgICAvLyBPbmUgb2Ygb3VyIGNoaWxkcmVuJ3MgZmxvYXRzIG1heSBoYXZlIGJlY29t
ZSBhbiBvdmVyaGFuZ2luZyBmbG9hdCBmb3IgdXMuIFdlIG5lZWQgdG8gbG9vayBmb3IgaXQuCiAg
ICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxk
OyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNo
aWxkLT5pc1JlbmRlckJsb2NrRmxvdygpICYmICFjaGlsZC0+aXNGbG9hdGluZ09yT3V0T2ZGbG93
UG9zaXRpb25lZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9
IHRvUmVuZGVyQmxvY2soY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9ja0Zs
b3cqIGJsb2NrID0gdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpOwogICAgICAgICAgICAgICAgICAg
ICBpZiAoYmxvY2stPmxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpICsgYmxvY2stPmxvZ2ljYWxU
b3AoKSA+IG5ld0hlaWdodCkKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE92ZXJoYW5naW5n
RmxvYXRzKGJsb2NrLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc3LDcgKzU4MCw3
IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRCbG9ja0NoaWxkKFJlbmRlckJveCogY2hp
bGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sCiAgICAgLy8gSWYgdGhlIGNoaWxkIGhhcyBvdmVy
aGFuZ2luZyBmbG9hdHMgdGhhdCBpbnRydWRlIGludG8gZm9sbG93aW5nIHNpYmxpbmdzIChvciBw
b3NzaWJseSBvdXQKICAgICAvLyBvZiB0aGlzIGJsb2NrKSwgdGhlbiB0aGUgcGFyZW50IGdldHMg
bm90aWZpZWQgb2YgdGhlIGZsb2F0cyBub3cuCiAgICAgaWYgKGNoaWxkQmxvY2tGbG93ICYmIGNo
aWxkQmxvY2tGbG93LT5jb250YWluc0Zsb2F0cygpKQotICAgICAgICBtYXhGbG9hdExvZ2ljYWxC
b3R0b20gPSBtYXgobWF4RmxvYXRMb2dpY2FsQm90dG9tLCBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyh0
b1JlbmRlckJsb2NrKGNoaWxkKSwgIWNoaWxkTmVlZGVkTGF5b3V0KSk7CisgICAgICAgIG1heEZs
b2F0TG9naWNhbEJvdHRvbSA9IG1heChtYXhGbG9hdExvZ2ljYWxCb3R0b20sIGFkZE92ZXJoYW5n
aW5nRmxvYXRzKHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKSwgIWNoaWxkTmVlZGVkTGF5b3V0KSk7
CiAKICAgICBpZiAoY2hpbGRPZmZzZXQud2lkdGgoKSB8fCBjaGlsZE9mZnNldC5oZWlnaHQoKSkg
ewogICAgICAgICB2aWV3KCkuYWRkTGF5b3V0RGVsdGEoY2hpbGRPZmZzZXQpOwpAQCAtODQ2LDcg
Kzg0OSw3IEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93Ojpjb2xsYXBzZU1hcmdpbnMoUmVu
ZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luCiAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsVG9wKTsKICAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBjaGlsZC0+cHJldmlvdXNTaWJs
aW5nKCk7CiAgICAgaWYgKHByZXYgJiYgcHJldi0+aXNSZW5kZXJCbG9ja0Zsb3coKSAmJiAhcHJl
di0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIFJlbmRlckJs
b2NrKiBibG9jayA9IHRvUmVuZGVyQmxvY2socHJldik7CisgICAgICAgIFJlbmRlckJsb2NrRmxv
dyogYmxvY2sgPSB0b1JlbmRlckJsb2NrRmxvdyhwcmV2KTsKICAgICAgICAgaWYgKGJsb2NrLT5j
b250YWluc0Zsb2F0cygpICYmICFibG9jay0+YXZvaWRzRmxvYXRzKCkgJiYgKGJsb2NrLT5sb2dp
Y2FsVG9wKCkgKyBibG9jay0+bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkpID4gbG9naWNhbFRv
cCkgCiAgICAgICAgICAgICBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyhibG9jaywgZmFsc2UpOwogICAg
IH0KQEAgLTkxNSw4ICs5MTgsOCBAQCBMYXlvdXRVbml0IFJlbmRlckJsb2NrRmxvdzo6Y2xlYXJG
bG9hdHNJZk5lZWRlZChSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYQogICAgIExheW91
dFVuaXQgbG9naWNhbFRvcCA9IHlQb3MgKyBoZWlnaHRJbmNyZWFzZTsKICAgICAvLyBBZnRlciBt
YXJnaW4gY29sbGFwc2luZywgb25lIG9mIG91ciBmbG9hdHMgbWF5IG5vdyBpbnRydWRlIGludG8g
dGhlIGNoaWxkLiBJZiB0aGUgY2hpbGQgZG9lc24ndCBjb250YWluIGZsb2F0cyBvZiBpdHMgb3du
IGl0CiAgICAgLy8gd29uJ3QgZ2V0IHBpY2tlZCB1cCBmb3IgcmVsYXlvdXQgZXZlbiB0aG91Z2gg
dGhlIGxvZ2ljYWwgdG9wIGVzdGltYXRlIHdhcyB3cm9uZyAtIHNvIGFkZCB0aGUgbmV3bHkgaW50
cnVkaW5nIGZsb2F0IG5vdy4KLSAgICBpZiAoY29udGFpbnNGbG9hdHMoKSAmJiBjaGlsZC0+aXNS
ZW5kZXJCbG9jaygpICYmICF0b1JlbmRlckJsb2NrKGNoaWxkKS0+Y29udGFpbnNGbG9hdHMoKSAm
JiAhY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpID4g
bG9naWNhbFRvcCkKLSAgICAgICAgdG9SZW5kZXJCbG9jayhjaGlsZCktPmFkZEludHJ1ZGluZ0Zs
b2F0cyh0aGlzLCBsb2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQoKSwgbG9naWNhbFRvcCk7Cisg
ICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgJiYgY2hpbGQtPmlzUmVuZGVyQmxvY2tGbG93KCkgJiYg
IXRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKS0+Y29udGFpbnNGbG9hdHMoKSAmJiAhY2hpbGQtPmF2
b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpID4gbG9naWNhbFRvcCkK
KyAgICAgICAgdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpLT5hZGRJbnRydWRpbmdGbG9hdHModGhp
cywgbG9naWNhbExlZnRPZmZzZXRGb3JDb250ZW50KCksIGxvZ2ljYWxUb3ApOwogCiAgICAgcmV0
dXJuIGxvZ2ljYWxUb3A7CiB9CkBAIC0xMjcwLDcgKzEyNzMsNyBAQCBMYXlvdXRVbml0IFJlbmRl
ckJsb2NrRmxvdzo6YWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRpb24oTGF5b3V0VW5pdCBsb2dp
Y2FsVG9wQQogICAgICAgICAKICAgICAgICAgaWYgKGNoaWxkUmVuZGVyQmxvY2spIHsKICAgICAg
ICAgICAgIGlmICghY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGNoaWxkUmVuZGVyQmxvY2stPmNv
bnRhaW5zRmxvYXRzKCkpCi0gICAgICAgICAgICAgICAgY2hpbGRSZW5kZXJCbG9jay0+bWFya0Fs
bERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCgpOworICAgICAgICAgICAgICAgIHRvUmVu
ZGVyQmxvY2tGbG93KGNoaWxkUmVuZGVyQmxvY2spLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxv
YXRzRm9yTGF5b3V0KCk7CiAgICAgICAgICAgICBpZiAoIWNoaWxkLT5uZWVkc0xheW91dCgpKQog
ICAgICAgICAgICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVkZWQo
KTsKICAgICAgICAgfQpAQCAtMTQ4Nyw0ICsxNDkwLDg1NiBAQCB2b2lkIFJlbmRlckJsb2NrRmxv
dzo6bGF5b3V0TGluZUdyaWRCb3goKQogICAgIC8vIHRvIHRoaXMgZ3JpZC4KIH0KIAorYm9vbCBS
ZW5kZXJCbG9ja0Zsb3c6OmNvbnRhaW5zRmxvYXQoUmVuZGVyQm94KiByZW5kZXJlcikgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPnNl
dCgpLmNvbnRhaW5zPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+KCpy
ZW5kZXJlcik7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpzdHlsZURpZENoYW5nZShTdHls
ZURpZmZlcmVuY2UgZGlmZiwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKQoreworICAgIFJl
bmRlckJsb2NrOjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHlsZSk7CisgICAgCisgICAgLy8g
QWZ0ZXIgb3VyIHN0eWxlIGNoYW5nZWQsIGlmIHdlIGxvc2Ugb3VyIGFiaWxpdHkgdG8gcHJvcGFn
YXRlIGZsb2F0cyBpbnRvIG5leHQgc2libGluZworICAgIC8vIGJsb2NrcywgdGhlbiB3ZSBuZWVk
IHRvIGZpbmQgdGhlIHRvcCBtb3N0IHBhcmVudCBjb250YWluaW5nIHRoYXQgb3Zlcmhhbmdpbmcg
ZmxvYXQgYW5kCisgICAgLy8gdGhlbiBtYXJrIGl0cyBkZXNjZW5kYW50cyB3aXRoIGZsb2F0cyBm
b3IgbGF5b3V0IGFuZCBjbGVhciBhbGwgZmxvYXRzIGZyb20gaXRzIG5leHQKKyAgICAvLyBzaWJs
aW5nIGJsb2NrcyB0aGF0IGV4aXN0IGluIG91ciBmbG9hdGluZyBvYmplY3RzIGxpc3QuIFNlZSBi
dWcgNTYyOTkgYW5kIDYyODc1LgorICAgIGJvb2wgY2FuUHJvcGFnYXRlRmxvYXRJbnRvU2libGlu
ZyA9ICFpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2b2lkc0Zsb2F0cygp
OworICAgIGlmIChkaWZmID09IFN0eWxlRGlmZmVyZW5jZUxheW91dCAmJiBzX2NhblByb3BhZ2F0
ZUZsb2F0SW50b1NpYmxpbmcgJiYgIWNhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxpbmcgJiYgaGFz
T3ZlcmhhbmdpbmdGbG9hdHMoKSkgeworICAgICAgICBSZW5kZXJCbG9ja0Zsb3cqIHBhcmVudEJs
b2NrID0gdGhpczsKKyAgICAgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2Jq
ZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgICAgICBhdXRvIGVuZCA9IGZs
b2F0aW5nT2JqZWN0U2V0LmVuZCgpOworCisgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJy
ID0gcGFyZW50KCk7IGN1cnIgJiYgIWN1cnItPmlzUmVuZGVyVmlldygpOyBjdXJyID0gY3Vyci0+
cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5pc1JlbmRlckJsb2NrRmxvdygpKSB7
CisgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2tGbG93KiBjdXJyQmxvY2sgPSB0b1JlbmRlckJs
b2NrRmxvdyhjdXJyKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyQmxvY2stPmhhc092ZXJo
YW5naW5nRmxvYXRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZmxv
YXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBSZW5kZXJCb3gmIHJlbmRlcmVyID0gKCppdCktPnJlbmRlcmVyKCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckJsb2NrLT5oYXNPdmVyaGFuZ2luZ0Zsb2F0KCZy
ZW5kZXJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jayA9IGN1
cnJCbG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBhcmVudEJsb2NrLT5tYXJrQWxs
RGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7CisgICAgICAgIHBhcmVudEJsb2NrLT5t
YXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KCk7CisgICAgfQorfQorCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6c3R5bGVXaWxsQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSBkaWZmLCBjb25zdCBS
ZW5kZXJTdHlsZSogbmV3U3R5bGUpCit7CisgICAgUmVuZGVyU3R5bGUqIG9sZFN0eWxlID0gc3R5
bGUoKTsKKyAgICBzX2NhblByb3BhZ2F0ZUZsb2F0SW50b1NpYmxpbmcgPSBvbGRTdHlsZSA/ICFp
c0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWF2b2lkc0Zsb2F0cygpIDogZmFs
c2U7CisKKyAgICBpZiAob2xkU3R5bGUgJiYgcGFyZW50KCkgJiYgZGlmZiA9PSBTdHlsZURpZmZl
cmVuY2VMYXlvdXQgJiYgb2xkU3R5bGUtPnBvc2l0aW9uKCkgIT0gbmV3U3R5bGUtPnBvc2l0aW9u
KCkpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgJiYgIWlzRmxvYXRpbmcoKSAmJiAh
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgbmV3U3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9u
KCkpCisgICAgICAgICAgICBtYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KCk7
CisgICAgfQorCisgICAgUmVuZGVyQmxvY2s6OnN0eWxlV2lsbENoYW5nZShkaWZmLCBuZXdTdHls
ZSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpkZWxldGVMaW5lQm94VHJlZSgpCit7Cisg
ICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5jbGVh
ckxpbmVCb3hUcmVlUG9pbnRlcnMoKTsKKyAgICBSZW5kZXJCbG9jazo6ZGVsZXRlTGluZUJveFRy
ZWUoKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6Om1vdmVBbGxDaGlsZHJlbkluY2x1ZGlu
Z0Zsb2F0c1RvKFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBib29sIGZ1bGxSZW1vdmVJbnNlcnQpCit7
CisgICAgUmVuZGVyQmxvY2tGbG93KiB0b0Jsb2NrRmxvdyA9IHRvUmVuZGVyQmxvY2tGbG93KHRv
QmxvY2spOworICAgIG1vdmVBbGxDaGlsZHJlblRvKHRvQmxvY2tGbG93LCBmdWxsUmVtb3ZlSW5z
ZXJ0KTsKKworICAgIC8vIFdoZW4gYSBwb3J0aW9uIG9mIHRoZSByZW5kZXIgdHJlZSBpcyBiZWlu
ZyBkZXRhY2hlZCwgYW5vbnltb3VzIGJsb2NrcworICAgIC8vIHdpbGwgYmUgY29tYmluZWQgYXMg
dGhlaXIgY2hpbGRyZW4gYXJlIGRlbGV0ZWQuIEluIHRoaXMgcHJvY2VzcywgdGhlCisgICAgLy8g
YW5vbnltb3VzIGJsb2NrIGxhdGVyIGluIHRoZSB0cmVlIGlzIG1lcmdlZCBpbnRvIHRoZSBvbmUg
cHJlY2VlZGluZyBpdC4KKyAgICAvLyBJdCBjYW4gaGFwcGVuIHRoYXQgdGhlIGxhdGVyIGJsb2Nr
ICh0aGlzKSBjb250YWlucyBmbG9hdHMgdGhhdCB0aGUKKyAgICAvLyBwcmV2aW91cyBibG9jayAo
dG9CbG9ja0Zsb3cpIGRpZCBub3QgY29udGFpbiwgYW5kIHRodXMgYXJlIG5vdCBpbiB0aGUKKyAg
ICAvLyBmbG9hdGluZyBvYmplY3RzIGxpc3QgZm9yIHRvQmxvY2tGbG93LiBUaGlzIGNhbiByZXN1
bHQgaW4gdG9CbG9ja0Zsb3cKKyAgICAvLyBjb250YWluaW5nIGZsb2F0cyB0aGF0IGFyZSBub3Qg
aW4gaXQncyBmbG9hdGluZyBvYmplY3RzIGxpc3QsIGJ1dCBhcmUgaW4KKyAgICAvLyB0aGUgZmxv
YXRpbmcgb2JqZWN0cyBsaXN0cyBvZiBzaWJsaW5ncyBhbmQgcGFyZW50cy4gVGhpcyBjYW4gY2F1
c2UKKyAgICAvLyBwcm9ibGVtcyB3aGVuIHRoZSBmbG9hdCBpdHNlbGYgaXMgZGVsZXRlZCwgc2lu
Y2UgdGhlIGRlbGV0aW9uIGNvZGUKKyAgICAvLyBhc3N1bWVzIHRoYXQgaWYgYSBmbG9hdCBpcyBu
b3QgaW4gaXQncyBjb250YWluaW5nIGJsb2NrJ3MgZmxvYXRpbmcKKyAgICAvLyBvYmplY3RzIGxp
c3QsIGl0IGlzbid0IGluIGFueSBmbG9hdGluZyBvYmplY3RzIGxpc3QuIEluIG9yZGVyIHRvCisg
ICAgLy8gcHJlc2VydmUgdGhpcyBjb25kaXRpb24gKHJlbW92aW5nIGl0IGhhcyBzZXJpb3VzIHBl
cmZvcm1hbmNlCisgICAgLy8gaW1wbGljYXRpb25zKSwgd2UgbmVlZCB0byBjb3B5IHRoZSBmbG9h
dGluZyBvYmplY3RzIGZyb20gdGhlIG9sZCBibG9jaworICAgIC8vICh0aGlzKSB0byB0aGUgbmV3
IGJsb2NrICh0b0Jsb2NrRmxvdykuIFRoZSBmbG9hdCdzIG1ldHJpY3Mgd2lsbCBsaWtlbHkKKyAg
ICAvLyBhbGwgYmUgd3JvbmcsIGJ1dCBzaW5jZSB0b0Jsb2NrRmxvdyBpcyBhbHJlYWR5IG1hcmtl
ZCBmb3IgbGF5b3V0LCB0aGlzCisgICAgLy8gd2lsbCBnZXQgZml4ZWQgYmVmb3JlIGFueXRoaW5n
IGdldHMgZGlzcGxheWVkLgorICAgIC8vIFNlZSBidWcgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTExNTU2NgorICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cykgeworICAg
ICAgICBpZiAoIXRvQmxvY2tGbG93LT5tX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgICAgIHRv
QmxvY2tGbG93LT5jcmVhdGVGbG9hdGluZ09iamVjdHMoKTsKKworICAgICAgICBjb25zdCBGbG9h
dGluZ09iamVjdFNldCYgZnJvbUZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09iamVjdHMt
PnNldCgpOworICAgICAgICBhdXRvIGVuZCA9IGZyb21GbG9hdGluZ09iamVjdFNldC5lbmQoKTsK
KworICAgICAgICBmb3IgKGF1dG8gaXQgPSBmcm9tRmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdP
YmplY3QgPSBpdC0+Z2V0KCk7CisKKyAgICAgICAgICAgIC8vIERvbid0IGluc2VydCB0aGUgb2Jq
ZWN0IGFnYWluIGlmIGl0J3MgYWxyZWFkeSBpbiB0aGUgbGlzdAorICAgICAgICAgICAgaWYgKHRv
QmxvY2tGbG93LT5jb250YWluc0Zsb2F0KCZmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKSkpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHRvQmxvY2tGbG93LT5tX2Zs
b2F0aW5nT2JqZWN0cy0+YWRkKGZsb2F0aW5nT2JqZWN0LT51bnNhZmVDbG9uZSgpKTsKKyAgICAg
ICAgfQorICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJmbG93RnJvbUZs
b2F0cygpCit7CisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9h
dGluZ09iamVjdHMtPnNldCgpOworICAgIGF1dG8gZW5kID0gZmxvYXRpbmdPYmplY3RTZXQuZW5k
KCk7CisgICAgZm9yIChhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7CisgICAgICAgIEZsb2F0aW5nT2JqZWN0KiByID0gaXQtPmdldCgpOworICAg
ICAgICBpZiAoci0+aXNEZXNjZW5kYW50KCkpCisgICAgICAgICAgICBhZGRPdmVyZmxvd0Zyb21D
aGlsZCgmci0+cmVuZGVyZXIoKSwgSW50U2l6ZSh4UG9zaXRpb25Gb3JGbG9hdEluY2x1ZGluZ01h
cmdpbihyKSwgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4ocikpKTsKKyAgICB9Cit9
CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21wdXRlT3ZlcmZsb3coTGF5b3V0VW5pdCBvbGRD
bGllbnRBZnRlckVkZ2UsIGJvb2wgcmVjb21wdXRlRmxvYXRzKQoreworICAgIFJlbmRlckJsb2Nr
Ojpjb21wdXRlT3ZlcmZsb3cob2xkQ2xpZW50QWZ0ZXJFZGdlLCByZWNvbXB1dGVGbG9hdHMpOwor
CisgICAgaWYgKCFoYXNDb2x1bW5zKCkgJiYgKHJlY29tcHV0ZUZsb2F0cyB8fCBpc1Jvb3QoKSB8
fCBleHBhbmRzVG9FbmNsb3NlT3ZlcmhhbmdpbmdGbG9hdHMoKSB8fCBoYXNTZWxmUGFpbnRpbmdM
YXllcigpKSkKKyAgICAgICAgYWRkT3ZlcmZsb3dGcm9tRmxvYXRzKCk7Cit9CisKK3ZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpyZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoYm9vbCBwYWludEFsbERlc2Nl
bmRhbnRzKQoreworICAgIC8vIFJlcGFpbnQgYW55IG92ZXJoYW5naW5nIGZsb2F0cyAoaWYgd2Ug
a25vdyB3ZSdyZSB0aGUgb25lIHRvIHBhaW50IHRoZW0pLgorICAgIC8vIE90aGVyd2lzZSwgYmFp
bCBvdXQuCisgICAgaWYgKCFoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBGSVhNRTogQXZvaWQgZGlzYWJsaW5nIExheW91dFN0YXRlLiBBdCB0aGUgdmVy
eSBsZWFzdCwgZG9uJ3QgZGlzYWJsZSBpdCBmb3IgZmxvYXRzIG9yaWdpbmF0aW5nCisgICAgLy8g
aW4gdGhpcyBibG9jay4gQmV0dGVyIHlldCB3b3VsZCBiZSB0byBwdXNoIGV4dHJhIHN0YXRlIGZv
ciB0aGUgY29udGFpbmVycyBvZiBvdGhlciBmbG9hdHMuCisgICAgTGF5b3V0U3RhdGVEaXNhYmxl
ciBsYXlvdXRTdGF0ZURpc2FibGVyKCZ2aWV3KCkpOworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0
U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBh
dXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIGZvciAoYXV0byBpdCA9IGZs
b2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBGbG9h
dGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7CisgICAgICAgIC8vIE9ubHkg
cmVwYWludCB0aGUgb2JqZWN0IGlmIGl0IGlzIG92ZXJoYW5naW5nLCBpcyBub3QgaW4gaXRzIG93
biBsYXllciwgYW5kCisgICAgICAgIC8vIGlzIG91ciByZXNwb25zaWJpbGl0eSB0byBwYWludCAo
bV9zaG91bGRQYWludCBpcyBzZXQpLiBXaGVuIHBhaW50QWxsRGVzY2VuZGFudHMgaXMgdHJ1ZSwg
dGhlIGxhdHRlcgorICAgICAgICAvLyBjb25kaXRpb24gaXMgcmVwbGFjZWQgd2l0aCBiZWluZyBh
IGRlc2NlbmRhbnQgb2YgdXMuCisgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+bG9naWNhbEJv
dHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSA+IGxvZ2ljYWxIZWlnaHQoKQorICAgICAg
ICAgICAgJiYgIWZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhhc1NlbGZQYWludGluZ0xheWVy
KCkKKyAgICAgICAgICAgICYmIChmbG9hdGluZ09iamVjdC0+c2hvdWxkUGFpbnQoKSB8fCAocGFp
bnRBbGxEZXNjZW5kYW50cyAmJiBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5pc0Rlc2NlbmRh
bnRPZih0aGlzKSkpKSB7CisgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5y
ZXBhaW50KCk7CisgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5yZXBhaW50
T3ZlcmhhbmdpbmdGbG9hdHMoZmFsc2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJl
bmRlckJsb2NrRmxvdzo6cGFpbnRGbG9hdHMoUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExh
eW91dFBvaW50JiBwYWludE9mZnNldCwgYm9vbCBwcmVzZXJ2ZVBoYXNlKQoreworICAgIGlmICgh
bV9mbG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEZsb2F0aW5n
T2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsK
KyAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIGZvciAoYXV0byBp
dCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAg
ICBGbG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKKyAgICAgICAgLy8gT25seSBwYWludCB0
aGUgb2JqZWN0IGlmIG91ciBtX3Nob3VsZFBhaW50IGZsYWcgaXMgc2V0LgorICAgICAgICBpZiAo
ci0+c2hvdWxkUGFpbnQoKSAmJiAhci0+cmVuZGVyZXIoKS5oYXNTZWxmUGFpbnRpbmdMYXllcigp
KSB7CisgICAgICAgICAgICBQYWludEluZm8gY3VycmVudFBhaW50SW5mbyhwYWludEluZm8pOwor
ICAgICAgICAgICAgY3VycmVudFBhaW50SW5mby5waGFzZSA9IHByZXNlcnZlUGhhc2UgPyBwYWlu
dEluZm8ucGhhc2UgOiBQYWludFBoYXNlQmxvY2tCYWNrZ3JvdW5kOworICAgICAgICAgICAgLy8g
RklYTUU6IExheW91dFBvaW50IHZlcnNpb24gb2YgeFBvc2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdN
YXJnaW4gd291bGQgbWFrZSB0aGlzIG11Y2ggY2xlYW5lci4KKyAgICAgICAgICAgIExheW91dFBv
aW50IGNoaWxkUG9pbnQgPSBmbGlwRmxvYXRGb3JXcml0aW5nTW9kZUZvckNoaWxkKHIsIExheW91
dFBvaW50KHBhaW50T2Zmc2V0LngoKSArIHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2lu
KHIpIC0gci0+cmVuZGVyZXIoKS54KCksIHBhaW50T2Zmc2V0LnkoKSArIHlQb3NpdGlvbkZvckZs
b2F0SW5jbHVkaW5nTWFyZ2luKHIpIC0gci0+cmVuZGVyZXIoKS55KCkpKTsKKyAgICAgICAgICAg
IHItPnJlbmRlcmVyKCkucGFpbnQoY3VycmVudFBhaW50SW5mbywgY2hpbGRQb2ludCk7CisgICAg
ICAgICAgICBpZiAoIXByZXNlcnZlUGhhc2UpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFp
bnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5kczsKKyAgICAgICAg
ICAgICAgICByLT5yZW5kZXJlcigpLnBhaW50KGN1cnJlbnRQYWludEluZm8sIGNoaWxkUG9pbnQp
OworICAgICAgICAgICAgICAgIGN1cnJlbnRQYWludEluZm8ucGhhc2UgPSBQYWludFBoYXNlRmxv
YXQ7CisgICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZv
LCBjaGlsZFBvaW50KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGFpbnRJbmZvLnBoYXNlID0g
UGFpbnRQaGFzZUZvcmVncm91bmQ7CisgICAgICAgICAgICAgICAgci0+cmVuZGVyZXIoKS5wYWlu
dChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50
UGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZU91dGxpbmU7CisgICAgICAgICAgICAgICAgci0+
cmVuZGVyZXIoKS5wYWludChjdXJyZW50UGFpbnRJbmZvLCBjaGlsZFBvaW50KTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y2xp
cE91dEZsb2F0aW5nT2JqZWN0cyhSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBjb25zdCBQYWludElu
Zm8qIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRp
b24sIGNvbnN0IExheW91dFNpemUmIG9mZnNldEZyb21Sb290QmxvY2spCit7CisgICAgaWYgKG1f
ZmxvYXRpbmdPYmplY3RzKSB7CisgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9h
dGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgYXV0byBl
bmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gZmxv
YXRpbmdPYmplY3RTZXQuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBG
bG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBpdC0+Z2V0KCk7CisgICAgICAgICAgICBM
YXlvdXRSZWN0IGZsb2F0Qm94KG9mZnNldEZyb21Sb290QmxvY2sud2lkdGgoKSArIHhQb3NpdGlv
bkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSwKKyAgICAgICAgICAgICAg
ICBvZmZzZXRGcm9tUm9vdEJsb2NrLmhlaWdodCgpICsgeVBvc2l0aW9uRm9yRmxvYXRJbmNsdWRp
bmdNYXJnaW4oZmxvYXRpbmdPYmplY3QpLAorICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqZWN0
LT5yZW5kZXJlcigpLndpZHRoKCksIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhlaWdodCgp
KTsKKyAgICAgICAgICAgIHJvb3RCbG9jay0+ZmxpcEZvcldyaXRpbmdNb2RlKGZsb2F0Qm94KTsK
KyAgICAgICAgICAgIGZsb2F0Qm94Lm1vdmUocm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbi54KCks
IHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRpb24ueSgpKTsKKyAgICAgICAgICAgIHBhaW50SW5mby0+
Y29udGV4dC0+Y2xpcE91dChwaXhlbFNuYXBwZWRJbnRSZWN0KGZsb2F0Qm94KSk7CisgICAgICAg
IH0KKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVGbG9hdGluZ09iamVj
dHMoKQoreworICAgIG1fZmxvYXRpbmdPYmplY3RzID0gYWRvcHRQdHIobmV3IEZsb2F0aW5nT2Jq
ZWN0cyh0aGlzLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSk7Cit9CisKK3ZvaWQgUmVuZGVy
QmxvY2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHMoKQoreworICAgIGlmICghbV9mbG9hdGlu
Z09iamVjdHMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZmxvYXRpbmdPYmplY3RzLT5jbGVh
cigpOworfQorCitGbG9hdGluZ09iamVjdCogUmVuZGVyQmxvY2tGbG93OjppbnNlcnRGbG9hdGlu
Z09iamVjdChSZW5kZXJCb3gqIGZsb2F0Qm94KQoreworICAgIEFTU0VSVChmbG9hdEJveC0+aXNG
bG9hdGluZygpKTsKKworICAgIC8vIENyZWF0ZSB0aGUgbGlzdCBvZiBzcGVjaWFsIG9iamVjdHMg
aWYgd2UgZG9uJ3QgYWxlYWR5IGhhdmUgb25lCisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykK
KyAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7CisgICAgZWxzZSB7CisgICAgICAgIC8v
IERvbid0IGluc2VydCB0aGUgZmxvYXRpbmdPYmplY3QgYWdhaW4gaWYgaXQncyBhbHJlYWR5IGlu
IHRoZSBsaXN0CisgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVj
dFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgYXV0byBpdCA9IGZsb2F0
aW5nT2JqZWN0U2V0LmZpbmQ8UmVuZGVyQm94JiwgRmxvYXRpbmdPYmplY3RIYXNoVHJhbnNsYXRv
cj4oKmZsb2F0Qm94KTsKKyAgICAgICAgaWYgKGl0ICE9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgp
KQorICAgICAgICAgICAgcmV0dXJuIGl0LT5nZXQoKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUg
dGhlIHNwZWNpYWwgZmxvYXRpbmdPYmplY3QgZW50cnkgJiBhcHBlbmQgaXQgdG8gdGhlIGxpc3QK
KworICAgIHN0ZDo6dW5pcXVlX3B0cjxGbG9hdGluZ09iamVjdD4gZmxvYXRpbmdPYmplY3QgPSBG
bG9hdGluZ09iamVjdDo6Y3JlYXRlKCpmbG9hdEJveCk7CisgICAgCisgICAgLy8gT3VyIGxvY2F0
aW9uIGlzIGlycmVsZXZhbnQgaWYgd2UncmUgdW5zcGxpdHRhYmxlIG9yIG5vIHBhZ2luYXRpb24g
aXMgaW4gZWZmZWN0LgorICAgIC8vIEp1c3QgZ28gYWhlYWQgYW5kIGxheSBvdXQgdGhlIGZsb2F0
LgorICAgIGJvb2wgaXNDaGlsZFJlbmRlckJsb2NrID0gZmxvYXRCb3gtPmlzUmVuZGVyQmxvY2so
KTsKKyAgICBpZiAoaXNDaGlsZFJlbmRlckJsb2NrICYmICFmbG9hdEJveC0+bmVlZHNMYXlvdXQo
KSAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+cGFnZUxvZ2ljYWxIZWlnaHRDaGFuZ2VkKCkpCisg
ICAgICAgIGZsb2F0Qm94LT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CisgICAg
ICAgICAgICAKKyAgICBib29sIG5lZWRzQmxvY2tEaXJlY3Rpb25Mb2NhdGlvblNldEJlZm9yZUxh
eW91dCA9IGlzQ2hpbGRSZW5kZXJCbG9jayAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bmVlZHNC
bG9ja0RpcmVjdGlvbkxvY2F0aW9uU2V0QmVmb3JlTGF5b3V0KCk7CisgICAgaWYgKCFuZWVkc0Js
b2NrRGlyZWN0aW9uTG9jYXRpb25TZXRCZWZvcmVMYXlvdXQgfHwgaXNXcml0aW5nTW9kZVJvb3Qo
KSkgLy8gV2UgYXJlIHVuc3BsaXR0YWJsZSBpZiB3ZSdyZSBhIGJsb2NrIGZsb3cgcm9vdC4KKyAg
ICAgICAgZmxvYXRCb3gtPmxheW91dElmTmVlZGVkKCk7CisgICAgZWxzZSB7CisgICAgICAgIGZs
b2F0Qm94LT51cGRhdGVMb2dpY2FsV2lkdGgoKTsKKyAgICAgICAgZmxvYXRCb3gtPmNvbXB1dGVB
bmRTZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7CisgICAgfQorCisgICAgZmxvYXRpbmdP
YmplY3QtPnNldExvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGhGb3JDaGlsZChmbG9hdEJveCkgKyBt
YXJnaW5TdGFydEZvckNoaWxkKGZsb2F0Qm94KSArIG1hcmdpbkVuZEZvckNoaWxkKGZsb2F0Qm94
KSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX1NIQVBFUykK
KyAgICBpZiAoU2hhcGVPdXRzaWRlSW5mbyogc2hhcGVPdXRzaWRlID0gZmxvYXRCb3gtPnNoYXBl
T3V0c2lkZUluZm8oKSkKKyAgICAgICAgc2hhcGVPdXRzaWRlLT5zZXRTaGFwZVNpemUobG9naWNh
bFdpZHRoRm9yQ2hpbGQoZmxvYXRCb3gpLCBsb2dpY2FsSGVpZ2h0Rm9yQ2hpbGQoZmxvYXRCb3gp
KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIG1fZmxvYXRpbmdPYmplY3RzLT5hZGQoc3RkOjptb3Zl
KGZsb2F0aW5nT2JqZWN0KSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpyZW1vdmVGbG9h
dGluZ09iamVjdChSZW5kZXJCb3gqIGZsb2F0Qm94KQoreworICAgIGlmIChtX2Zsb2F0aW5nT2Jq
ZWN0cykgeworICAgICAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RT
ZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgICAgIGF1dG8gaXQgPSBmbG9hdGlu
Z09iamVjdFNldC5maW5kPFJlbmRlckJveCYsIEZsb2F0aW5nT2JqZWN0SGFzaFRyYW5zbGF0b3I+
KCpmbG9hdEJveCk7CisgICAgICAgIGlmIChpdCAhPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKSkg
eworICAgICAgICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgp
OworICAgICAgICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgICAgICAgICBM
YXlvdXRVbml0IGxvZ2ljYWxUb3AgPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbFRvcChpc0hvcml6
b250YWxXcml0aW5nTW9kZSgpKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxC
b3R0b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpKTsKKworICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTU0OTk1LgorICAgICAgICAgICAgICAgIGlmIChsb2dpY2Fs
Qm90dG9tIDwgMCB8fCBsb2dpY2FsQm90dG9tIDwgbG9naWNhbFRvcCB8fCBsb2dpY2FsVG9wID09
IExheW91dFVuaXQ6Om1heCgpKQorICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQm90dG9tID0g
TGF5b3V0VW5pdDo6bWF4KCk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAg
ICAgICAgIC8vIFNwZWNpYWwtY2FzZSB6ZXJvLSBhbmQgbGVzcy10aGFuLXplcm8taGVpZ2h0IGZs
b2F0czogdGhvc2UgZG9uJ3QgdG91Y2gKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpbmUg
dGhhdCB0aGV5J3JlIG9uLCBidXQgaXQgc3RpbGwgbmVlZHMgdG8gYmUgZGlydGllZC4gVGhpcyBp
cworICAgICAgICAgICAgICAgICAgICAvLyBhY2NvbXBsaXNoZWQgYnkgcHJldGVuZGluZyB0aGV5
IGhhdmUgYSBoZWlnaHQgb2YgMS4KKyAgICAgICAgICAgICAgICAgICAgbG9naWNhbEJvdHRvbSA9
IG1heChsb2dpY2FsQm90dG9tLCBsb2dpY2FsVG9wICsgMSk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmTmVlZHNMYXlvdXQoKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKCZmbG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkt
PnJlbmRlcmVyKCkgPT0gdGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09i
amVjdC0+b3JpZ2luYXRpbmdMaW5lKCktPm1hcmtEaXJ0eSgpOworICAgICAgICAgICAgICAgICAg
ICB9CisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09i
amVjdC0+c2V0T3JpZ2luYXRpbmdMaW5lKDApOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIG1hcmtMaW5lc0RpcnR5SW5CbG9ja1JhbmdlKDAsIGxvZ2ljYWxCb3R0
b20pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPnJlbW92
ZShmbG9hdGluZ09iamVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxv
Y2tGbG93OjpyZW1vdmVGbG9hdGluZ09iamVjdHNCZWxvdyhGbG9hdGluZ09iamVjdCogbGFzdEZs
b2F0LCBpbnQgbG9naWNhbE9mZnNldCkKK3sKKyAgICBpZiAoIWNvbnRhaW5zRmxvYXRzKCkpCisg
ICAgICAgIHJldHVybjsKKyAgICAKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRp
bmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgRmxvYXRpbmdPYmpl
Y3QqIGN1cnIgPSBmbG9hdGluZ09iamVjdFNldC5sYXN0KCkuZ2V0KCk7CisgICAgd2hpbGUgKGN1
cnIgIT0gbGFzdEZsb2F0ICYmICghY3Vyci0+aXNQbGFjZWQoKSB8fCBjdXJyLT5sb2dpY2FsVG9w
KGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpID49IGxvZ2ljYWxPZmZzZXQpKSB7CisgICAgICAg
IG1fZmxvYXRpbmdPYmplY3RzLT5yZW1vdmUoY3Vycik7CisgICAgICAgIGlmIChmbG9hdGluZ09i
amVjdFNldC5pc0VtcHR5KCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VyciA9IGZs
b2F0aW5nT2JqZWN0U2V0Lmxhc3QoKS5nZXQoKTsKKyAgICB9Cit9CisKK0xheW91dFBvaW50IFJl
bmRlckJsb2NrRmxvdzo6Y29tcHV0ZUxvZ2ljYWxMb2NhdGlvbkZvckZsb2F0KGNvbnN0IEZsb2F0
aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCwgTGF5b3V0VW5pdCBsb2dpY2FsVG9wT2Zmc2V0KSBj
b25zdAoreworICAgIFJlbmRlckJveCogY2hpbGRCb3ggPSAmZmxvYXRpbmdPYmplY3QtPnJlbmRl
cmVyKCk7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zm
c2V0Rm9yQ29udGVudChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFydCBvZiBsZWZ0
IG9mZnNldC4KKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodE9mZnNldDsgLy8gQ29uc3RhbnQg
cGFydCBvZiByaWdodCBvZmZzZXQuCisjaWYgRU5BQkxFKENTU19TSEFQRVMpCisgICAgLy8gRklY
TUUgQnVnIDEwMjk0ODogVGhpcyBvbmx5IHdvcmtzIGZvciBzaGFwZSBvdXRzaWRlIGRpcmVjdGx5
IHNldCBvbiB0aGlzIGJsb2NrLgorICAgIFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJbnNpZGVJbmZv
ID0gdGhpcy0+bGF5b3V0U2hhcGVJbnNpZGVJbmZvKCk7CisgICAgLy8gRklYTUU6IEltcGxlbWVu
dCBiZWhhdmlvciBmb3IgcmlnaHQgZmxvYXRzLgorICAgIGlmIChzaGFwZUluc2lkZUluZm8pIHsK
KyAgICAgICAgTGF5b3V0U2l6ZSBmbG9hdExvZ2ljYWxTaXplID0gTGF5b3V0U2l6ZShjaGlsZEJv
eC0+bG9naWNhbFdpZHRoKCksIGNoaWxkQm94LT5sb2dpY2FsSGVpZ2h0KCkpOworICAgICAgICAv
LyBGSVhNRTogSWYgdGhlIGZsb2F0IGRvZXNuJ3QgZml0IGluIHRoZSBzaGFwZSB3ZSBzaG91bGQg
cHVzaCBpdCB1bmRlciB0aGUgY29udGVudCBib3gKKyAgICAgICAgbG9naWNhbFRvcE9mZnNldCA9
IHNoYXBlSW5zaWRlSW5mby0+Y29tcHV0ZUZpcnN0Rml0UG9zaXRpb25Gb3JGbG9hdChmbG9hdExv
Z2ljYWxTaXplKTsKKyAgICAgICAgaWYgKGxvZ2ljYWxIZWlnaHQoKSA+IGxvZ2ljYWxUb3BPZmZz
ZXQpCisgICAgICAgICAgICBsb2dpY2FsVG9wT2Zmc2V0ID0gbG9naWNhbEhlaWdodCgpOworCisg
ICAgICAgIFNlZ21lbnRMaXN0IHNlZ21lbnRzID0gc2hhcGVJbnNpZGVJbmZvLT5jb21wdXRlU2Vn
bWVudHNGb3JMaW5lKGxvZ2ljYWxUb3BPZmZzZXQsIGNoaWxkQm94LT5sb2dpY2FsSGVpZ2h0KCkp
OworICAgICAgICAvLyBGSVhNRSBCdWcgMTAyOTQ5OiBBZGQgc3VwcG9ydCBmb3Igc2hhcGVzIHdp
dGggbXVsdGlwbGUgc2VnbWVudHMuCisgICAgICAgIGlmIChzZWdtZW50cy5zaXplKCkgPT0gMSkg
eworICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhl
IGNvbnRlbnQgYm94LgorICAgICAgICAgICAgbG9naWNhbFJpZ2h0T2Zmc2V0ID0gbG9naWNhbExl
ZnRPZmZzZXQgKyBzZWdtZW50c1swXS5sb2dpY2FsUmlnaHQ7CisgICAgICAgICAgICBsb2dpY2Fs
TGVmdE9mZnNldCArPSBzZWdtZW50c1swXS5sb2dpY2FsTGVmdDsKKyAgICAgICAgfQorICAgIH0g
ZWxzZQorI2VuZGlmCisgICAgICAgIGxvZ2ljYWxSaWdodE9mZnNldCA9IGxvZ2ljYWxSaWdodE9m
ZnNldEZvckNvbnRlbnQobG9naWNhbFRvcE9mZnNldCk7CisKKyAgICBMYXlvdXRVbml0IGZsb2F0
TG9naWNhbFdpZHRoID0gbWluKGZsb2F0aW5nT2JqZWN0LT5sb2dpY2FsV2lkdGgoaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSksIGxvZ2ljYWxSaWdodE9mZnNldCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0
KTsgLy8gVGhlIHdpZHRoIHdlIGxvb2sgZm9yLgorCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2lj
YWxMZWZ0OworCisgICAgYm9vbCBpbnNpZGVGbG93VGhyZWFkID0gZmxvd1RocmVhZENvbnRhaW5p
bmdCbG9jaygpOworCisgICAgaWYgKGNoaWxkQm94LT5zdHlsZSgpLT5mbG9hdGluZygpID09IExl
ZnRGbG9hdCkgeworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmluZ0xlZnQgPSAxOwor
ICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmluZ1JpZ2h0ID0gMTsKKyAgICAgICAgZmxv
YXRMb2dpY2FsTGVmdCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRz
aWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJl
bWFpbmluZ0xlZnQpOworICAgICAgICB3aGlsZSAobG9naWNhbFJpZ2h0T2Zmc2V0Rm9yTGluZUln
bm9yaW5nU2hhcGVPdXRzaWRlKGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxSaWdodE9mZnNldCwg
ZmFsc2UsICZoZWlnaHRSZW1haW5pbmdSaWdodCkgLSBmbG9hdExvZ2ljYWxMZWZ0IDwgZmxvYXRM
b2dpY2FsV2lkdGgpIHsKKyAgICAgICAgICAgIGxvZ2ljYWxUb3BPZmZzZXQgKz0gbWluKGhlaWdo
dFJlbWFpbmluZ0xlZnQsIGhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKKyAgICAgICAgICAgIGZsb2F0
TG9naWNhbExlZnQgPSBsb2dpY2FsTGVmdE9mZnNldEZvckxpbmVJZ25vcmluZ1NoYXBlT3V0c2lk
ZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9mZnNldCwgZmFsc2UsICZoZWlnaHRSZW1h
aW5pbmdMZWZ0KTsKKyAgICAgICAgICAgIGlmIChpbnNpZGVGbG93VGhyZWFkKSB7CisgICAgICAg
ICAgICAgICAgLy8gSGF2ZSB0byByZS1ldmFsdWF0ZSBhbGwgb2Ygb3VyIG9mZnNldHMsIHNpbmNl
IHRoZXkgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBsb2dpY2FsUmlnaHRPZmZz
ZXQgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50KGxvZ2ljYWxUb3BPZmZzZXQpOyAvLyBD
b25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9mZnNldC4KKyAgICAgICAgICAgICAgICBsb2dpY2FsTGVm
dE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudChsb2dpY2FsVG9wT2Zmc2V0KTsg
Ly8gQ29uc3RhbnQgcGFydCBvZiBsZWZ0IG9mZnNldC4KKyAgICAgICAgICAgICAgICBmbG9hdExv
Z2ljYWxXaWR0aCA9IG1pbihmbG9hdGluZ09iamVjdC0+bG9naWNhbFdpZHRoKGlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKCkpLCBsb2dpY2FsUmlnaHRPZmZzZXQgLSBsb2dpY2FsTGVmdE9mZnNldCk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IG1h
eChsb2dpY2FsTGVmdE9mZnNldCAtIGJvcmRlckFuZFBhZGRpbmdMb2dpY2FsTGVmdCgpLCBmbG9h
dExvZ2ljYWxMZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJl
bWFpbmluZ0xlZnQgPSAxOworICAgICAgICBMYXlvdXRVbml0IGhlaWdodFJlbWFpbmluZ1JpZ2h0
ID0gMTsKKyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCA9IGxvZ2ljYWxSaWdodE9mZnNldEZvckxp
bmVJZ25vcmluZ1NoYXBlT3V0c2lkZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsUmlnaHRPZmZz
ZXQsIGZhbHNlLCAmaGVpZ2h0UmVtYWluaW5nUmlnaHQpOworICAgICAgICB3aGlsZSAoZmxvYXRM
b2dpY2FsTGVmdCAtIGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGluZUlnbm9yaW5nU2hhcGVPdXRzaWRl
KGxvZ2ljYWxUb3BPZmZzZXQsIGxvZ2ljYWxMZWZ0T2Zmc2V0LCBmYWxzZSwgJmhlaWdodFJlbWFp
bmluZ0xlZnQpIDwgZmxvYXRMb2dpY2FsV2lkdGgpIHsKKyAgICAgICAgICAgIGxvZ2ljYWxUb3BP
ZmZzZXQgKz0gbWluKGhlaWdodFJlbWFpbmluZ0xlZnQsIGhlaWdodFJlbWFpbmluZ1JpZ2h0KTsK
KyAgICAgICAgICAgIGZsb2F0TG9naWNhbExlZnQgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JMaW5l
SWdub3JpbmdTaGFwZU91dHNpZGUobG9naWNhbFRvcE9mZnNldCwgbG9naWNhbFJpZ2h0T2Zmc2V0
LCBmYWxzZSwgJmhlaWdodFJlbWFpbmluZ1JpZ2h0KTsKKyAgICAgICAgICAgIGlmIChpbnNpZGVG
bG93VGhyZWFkKSB7CisgICAgICAgICAgICAgICAgLy8gSGF2ZSB0byByZS1ldmFsdWF0ZSBhbGwg
b2Ygb3VyIG9mZnNldHMsIHNpbmNlIHRoZXkgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAg
ICAgICBsb2dpY2FsUmlnaHRPZmZzZXQgPSBsb2dpY2FsUmlnaHRPZmZzZXRGb3JDb250ZW50KGxv
Z2ljYWxUb3BPZmZzZXQpOyAvLyBDb25zdGFudCBwYXJ0IG9mIHJpZ2h0IG9mZnNldC4KKyAgICAg
ICAgICAgICAgICBsb2dpY2FsTGVmdE9mZnNldCA9IGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVu
dChsb2dpY2FsVG9wT2Zmc2V0KTsgLy8gQ29uc3RhbnQgcGFydCBvZiBsZWZ0IG9mZnNldC4KKyAg
ICAgICAgICAgICAgICBmbG9hdExvZ2ljYWxXaWR0aCA9IG1pbihmbG9hdGluZ09iamVjdC0+bG9n
aWNhbFdpZHRoKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpLCBsb2dpY2FsUmlnaHRPZmZzZXQg
LSBsb2dpY2FsTGVmdE9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg
Ly8gVXNlIHRoZSBvcmlnaW5hbCB3aWR0aCBvZiB0aGUgZmxvYXQgaGVyZSwgc2luY2UgdGhlIGxv
Y2FsIHZhcmlhYmxlCisgICAgICAgIC8vIHxmbG9hdExvZ2ljYWxXaWR0aHwgd2FzIGNhcHBlZCB0
byB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGguIFNlZQorICAgICAgICAvLyBmYXN0L2Jsb2NrL2Zs
b2F0L2NsYW1wZWQtcmlnaHQtZmxvYXQuaHRtbC4KKyAgICAgICAgZmxvYXRMb2dpY2FsTGVmdCAt
PSBmbG9hdGluZ09iamVjdC0+bG9naWNhbFdpZHRoKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkp
OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gTGF5b3V0UG9pbnQoZmxvYXRMb2dpY2FsTGVmdCwg
bG9naWNhbFRvcE9mZnNldCk7Cit9CisKK2Jvb2wgUmVuZGVyQmxvY2tGbG93Ojpwb3NpdGlvbk5l
d0Zsb2F0cygpCit7CisgICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgY29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0
ID0gbV9mbG9hdGluZ09iamVjdHMtPnNldCgpOworICAgIGlmIChmbG9hdGluZ09iamVjdFNldC5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIGFsbCBmbG9hdHMg
aGF2ZSBhbHJlYWR5IGJlZW4gcG9zaXRpb25lZCwgdGhlbiB3ZSBoYXZlIG5vIHdvcmsgdG8gZG8u
CisgICAgaWYgKGZsb2F0aW5nT2JqZWN0U2V0Lmxhc3QoKS0+aXNQbGFjZWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gTW92ZSBiYWNrd2FyZHMgdGhyb3VnaCBvdXIgZmxvYXRp
bmcgb2JqZWN0IGxpc3QgdW50aWwgd2UgZmluZCBhIGZsb2F0IHRoYXQgaGFzCisgICAgLy8gYWxy
ZWFkeSBiZWVuIHBvc2l0aW9uZWQuIFRoZW4gd2UnbGwgYmUgYWJsZSB0byBtb3ZlIGZvcndhcmQs
IHBvc2l0aW9uaW5nIGFsbCBvZgorICAgIC8vIHRoZSBuZXcgZmxvYXRzIHRoYXQgbmVlZCBpdC4K
KyAgICBhdXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAgLS1pdDsgLy8gR28g
dG8gbGFzdCBpdGVtLgorICAgIGF1dG8gYmVnaW4gPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigp
OworICAgIEZsb2F0aW5nT2JqZWN0KiBsYXN0UGxhY2VkRmxvYXRpbmdPYmplY3QgPSAwOworICAg
IHdoaWxlIChpdCAhPSBiZWdpbikgeworICAgICAgICAtLWl0OworICAgICAgICBpZiAoKCppdCkt
PmlzUGxhY2VkKCkpIHsKKyAgICAgICAgICAgIGxhc3RQbGFjZWRGbG9hdGluZ09iamVjdCA9IGl0
LT5nZXQoKTsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgIH0KKworICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IGxvZ2ljYWxIZWlnaHQoKTsK
KyAgICAKKyAgICAvLyBUaGUgZmxvYXQgY2Fubm90IHN0YXJ0IGFib3ZlIHRoZSB0b3AgcG9zaXRp
b24gb2YgdGhlIGxhc3QgcG9zaXRpb25lZCBmbG9hdC4KKyAgICBpZiAobGFzdFBsYWNlZEZsb2F0
aW5nT2JqZWN0KQorICAgICAgICBsb2dpY2FsVG9wID0gbWF4KGxhc3RQbGFjZWRGbG9hdGluZ09i
amVjdC0+bG9naWNhbFRvcChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSwgbG9naWNhbFRvcCk7
CisKKyAgICBhdXRvIGVuZCA9IGZsb2F0aW5nT2JqZWN0U2V0LmVuZCgpOworICAgIC8vIE5vdyB3
YWxrIHRocm91Z2ggdGhlIHNldCBvZiB1bnBvc2l0aW9uZWQgZmxvYXRzIGFuZCBwbGFjZSB0aGVt
LgorICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgRmxvYXRpbmdPYmplY3Qq
IGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOworICAgICAgICAvLyBUaGUgY29udGFpbmluZyBi
bG9jayBpcyByZXNwb25zaWJsZSBmb3IgcG9zaXRpb25pbmcgZmxvYXRzLCBzbyBpZiB3ZSBoYXZl
IGZsb2F0cyBpbiBvdXIKKyAgICAgICAgLy8gbGlzdCB0aGF0IGNvbWUgZnJvbSBzb21ld2hlcmUg
ZWxzZSwgZG8gbm90IGF0dGVtcHQgdG8gcG9zaXRpb24gdGhlbS4KKyAgICAgICAgaWYgKGZsb2F0
aW5nT2JqZWN0LT5yZW5kZXJlcigpLmNvbnRhaW5pbmdCbG9jaygpICE9IHRoaXMpCisgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICBSZW5kZXJCb3gqIGNoaWxkQm94ID0gJmZsb2F0aW5n
T2JqZWN0LT5yZW5kZXJlcigpOworCisgICAgICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2FsTGVm
dE1hcmdpbiA9IHN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG1hcmdpblN0YXJ0
Rm9yQ2hpbGQoY2hpbGRCb3gpIDogbWFyZ2luRW5kRm9yQ2hpbGQoY2hpbGRCb3gpOworCisgICAg
ICAgIExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkQm94LT5mcmFtZVJlY3QoKTsKKworICAgICAg
ICBpZiAoY2hpbGRCb3gtPnN0eWxlKCktPmNsZWFyKCkgJiBDTEVGVCkKKyAgICAgICAgICAgIGxv
Z2ljYWxUb3AgPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0OjpG
bG9hdExlZnQpLCBsb2dpY2FsVG9wKTsKKyAgICAgICAgaWYgKGNoaWxkQm94LT5zdHlsZSgpLT5j
bGVhcigpICYgQ1JJR0hUKQorICAgICAgICAgICAgbG9naWNhbFRvcCA9IG1heChsb3dlc3RGbG9h
dExvZ2ljYWxCb3R0b20oRmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpLCBsb2dpY2FsVG9wKTsK
KworICAgICAgICBMYXlvdXRQb2ludCBmbG9hdExvZ2ljYWxMb2NhdGlvbiA9IGNvbXB1dGVMb2dp
Y2FsTG9jYXRpb25Gb3JGbG9hdChmbG9hdGluZ09iamVjdCwgbG9naWNhbFRvcCk7CisKKyAgICAg
ICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxMZWZ0KGZsb2F0TG9naWNhbExvY2F0aW9uLngo
KSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisKKyAgICAgICAgc2V0TG9naWNhbExlZnRG
b3JDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueCgpICsgY2hpbGRMb2dpY2Fs
TGVmdE1hcmdpbik7CisgICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZEJveCwgZmxv
YXRMb2dpY2FsTG9jYXRpb24ueSgpICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGRCb3gpKTsK
KworICAgICAgICBlc3RpbWF0ZVJlZ2lvblJhbmdlRm9yQm94Q2hpbGQoY2hpbGRCb3gpOworCisg
ICAgICAgIExheW91dFN0YXRlKiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgpOwor
ICAgICAgICBib29sIGlzUGFnaW5hdGVkID0gbGF5b3V0U3RhdGUtPmlzUGFnaW5hdGVkKCk7Cisg
ICAgICAgIGlmIChpc1BhZ2luYXRlZCAmJiAhY2hpbGRCb3gtPm5lZWRzTGF5b3V0KCkpCisgICAg
ICAgICAgICBjaGlsZEJveC0+bWFya0ZvclBhZ2luYXRpb25SZWxheW91dElmTmVlZGVkKCk7Cisg
ICAgICAgIAorICAgICAgICBjaGlsZEJveC0+bGF5b3V0SWZOZWVkZWQoKTsKKworICAgICAgICBp
ZiAoaXNQYWdpbmF0ZWQpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSB1bnNwbGl0dGFibGUg
YW5kIGRvbid0IGZpdCwgdGhlbiB3ZSBuZWVkIHRvIG1vdmUgZG93bi4KKyAgICAgICAgICAgIC8v
IFdlIGluY2x1ZGUgb3VyIG1hcmdpbnMgYXMgcGFydCBvZiB0aGUgdW5zcGxpdHRhYmxlIGFyZWEu
CisgICAgICAgICAgICBMYXlvdXRVbml0IG5ld0xvZ2ljYWxUb3AgPSBhZGp1c3RGb3JVbnNwbGl0
dGFibGVDaGlsZChjaGlsZEJveCwgZmxvYXRMb2dpY2FsTG9jYXRpb24ueSgpLCB0cnVlKTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYSBwYWdpbmF0aW9uIHN0
cnV0IHRoYXQgaXMgbWFraW5nIHVzIG1vdmUgZG93biBmdXJ0aGVyLgorICAgICAgICAgICAgLy8g
Tm90ZSB0aGF0IGFuIHVuc3BsaXR0YWJsZSBjaGlsZCBjYW4ndCBhbHNvIGhhdmUgYSBwYWdpbmF0
aW9uIHN0cnV0LCBzbyB0aGlzIGlzCisgICAgICAgICAgICAvLyBleGNsdXNpdmUgd2l0aCB0aGUg
Y2FzZSBhYm92ZS4KKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBjaGlsZEJsb2NrID0gY2hpbGRC
b3gtPmlzUmVuZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGRCb3gpIDogMDsKKyAgICAg
ICAgICAgIGlmIChjaGlsZEJsb2NrICYmIGNoaWxkQmxvY2stPnBhZ2luYXRpb25TdHJ1dCgpKSB7
CisgICAgICAgICAgICAgICAgbmV3TG9naWNhbFRvcCArPSBjaGlsZEJsb2NrLT5wYWdpbmF0aW9u
U3RydXQoKTsKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5zZXRQYWdpbmF0aW9uU3RydXQo
MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChuZXdMb2dp
Y2FsVG9wICE9IGZsb2F0TG9naWNhbExvY2F0aW9uLnkoKSkgeworICAgICAgICAgICAgICAgIGZs
b2F0aW5nT2JqZWN0LT5zZXRQYWdpbmF0aW9uU3RydXQobmV3TG9naWNhbFRvcCAtIGZsb2F0TG9n
aWNhbExvY2F0aW9uLnkoKSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdExvZ2ljYWxMb2NhdGlv
biA9IGNvbXB1dGVMb2dpY2FsTG9jYXRpb25Gb3JGbG9hdChmbG9hdGluZ09iamVjdCwgbmV3TG9n
aWNhbFRvcCk7CisgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxMZWZ0
KGZsb2F0TG9naWNhbExvY2F0aW9uLngoKSwgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSk7CisK
KyAgICAgICAgICAgICAgICBzZXRMb2dpY2FsTGVmdEZvckNoaWxkKGNoaWxkQm94LCBmbG9hdExv
Z2ljYWxMb2NhdGlvbi54KCkgKyBjaGlsZExvZ2ljYWxMZWZ0TWFyZ2luKTsKKyAgICAgICAgICAg
ICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGRCb3gsIGZsb2F0TG9naWNhbExvY2F0aW9u
LnkoKSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkQm94KSk7CisgICAgICAgIAorICAgICAg
ICAgICAgICAgIGlmIChjaGlsZEJsb2NrKQorICAgICAgICAgICAgICAgICAgICBjaGlsZEJsb2Nr
LT5zZXRDaGlsZE5lZWRzTGF5b3V0KE1hcmtPbmx5VGhpcyk7CisgICAgICAgICAgICAgICAgY2hp
bGRCb3gtPmxheW91dElmTmVlZGVkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxkKGNoaWxkQm94KSkgeworICAgICAgICAgICAg
ICAgIGNoaWxkQm94LT5zZXROZWVkc0xheW91dChNYXJrT25seVRoaXMpOworICAgICAgICAgICAg
ICAgIGNoaWxkQm94LT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgZmxvYXRpbmdPYmplY3QtPnNldExvZ2ljYWxUb3AoZmxvYXRMb2dpY2FsTG9j
YXRpb24ueSgpLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKKworICAgICAgICBmbG9hdGlu
Z09iamVjdC0+c2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0Rm9yQ2hpbGQoY2hpbGRCb3gp
ICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGRCb3gpICsgbWFyZ2luQWZ0ZXJGb3JDaGlsZChj
aGlsZEJveCksIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOworCisgICAgICAgIG1fZmxvYXRp
bmdPYmplY3RzLT5hZGRQbGFjZWRPYmplY3QoZmxvYXRpbmdPYmplY3QpOworCisgICAgICAgIC8v
IElmIHRoZSBjaGlsZCBtb3ZlZCwgd2UgaGF2ZSB0byByZXBhaW50IGl0LgorICAgICAgICBpZiAo
Y2hpbGRCb3gtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQorICAgICAgICAgICAgY2hp
bGRCb3gtPnJlcGFpbnREdXJpbmdMYXlvdXRJZk1vdmVkKG9sZFJlY3QpOworICAgIH0KKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6Om5ld0xpbmUoRUNsZWFyIGNs
ZWFyKQoreworICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgLy8gc2V0IHkgcG9zaXRpb24K
KyAgICBMYXlvdXRVbml0IG5ld1kgPSAwOworICAgIHN3aXRjaCAoY2xlYXIpIHsKKyAgICBjYXNl
IENMRUZUOgorICAgICAgICBuZXdZID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5n
T2JqZWN0OjpGbG9hdExlZnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENSSUdIVDoKKyAg
ICAgICAgbmV3WSA9IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbShGbG9hdGluZ09iamVjdDo6Rmxv
YXRSaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0JPVEg6CisgICAgICAgIG5ld1kg
PSBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVh
azsKKyAgICB9CisgICAgaWYgKGhlaWdodCgpIDwgbmV3WSkKKyAgICAgICAgc2V0TG9naWNhbEhl
aWdodChuZXdZKTsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxMZWZ0
RmxvYXRPZmZzZXRGb3JMaW5lKExheW91dFVuaXQgbG9naWNhbFRvcCwgTGF5b3V0VW5pdCBmaXhl
ZE9mZnNldCwgTGF5b3V0VW5pdCogaGVpZ2h0UmVtYWluaW5nLCBMYXlvdXRVbml0IGxvZ2ljYWxI
ZWlnaHQsIFNoYXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSBvZmZzZXRNb2RlKSBjb25zdAorewor
ICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiBtX2Zsb2F0aW5nT2JqZWN0cy0+aGFzTGVmdE9i
amVjdHMoKSkKKyAgICAgICAgcmV0dXJuIG1fZmxvYXRpbmdPYmplY3RzLT5sb2dpY2FsTGVmdE9m
ZnNldChmaXhlZE9mZnNldCwgbG9naWNhbFRvcCwgbG9naWNhbEhlaWdodCwgb2Zmc2V0TW9kZSwg
aGVpZ2h0UmVtYWluaW5nKTsKKworICAgIHJldHVybiBmaXhlZE9mZnNldDsKK30KKworTGF5b3V0
VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9yTGluZShMYXlv
dXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQqIGhl
aWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBTaGFwZU91dHNpZGVGbG9h
dE9mZnNldE1vZGUgb2Zmc2V0TW9kZSkgY29uc3QKK3sKKyAgICBpZiAobV9mbG9hdGluZ09iamVj
dHMgJiYgbV9mbG9hdGluZ09iamVjdHMtPmhhc1JpZ2h0T2JqZWN0cygpKQorICAgICAgICByZXR1
cm4gbV9mbG9hdGluZ09iamVjdHMtPmxvZ2ljYWxSaWdodE9mZnNldChmaXhlZE9mZnNldCwgbG9n
aWNhbFRvcCwgbG9naWNhbEhlaWdodCwgb2Zmc2V0TW9kZSwgaGVpZ2h0UmVtYWluaW5nKTsKKwor
ICAgIHJldHVybiBmaXhlZE9mZnNldDsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6
Om5leHRGbG9hdExvZ2ljYWxCb3R0b21CZWxvdyhMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQsIFNo
YXBlT3V0c2lkZUZsb2F0T2Zmc2V0TW9kZSBvZmZzZXRNb2RlKSBjb25zdAoreworICAgIGlmICgh
bV9mbG9hdGluZ09iamVjdHMpCisgICAgICAgIHJldHVybiBsb2dpY2FsSGVpZ2h0OworCisgICAg
TGF5b3V0VW5pdCBib3R0b20gPSBMYXlvdXRVbml0OjptYXgoKTsKKyAgICBjb25zdCBGbG9hdGlu
Z09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCk7
CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICBmb3IgKGF1dG8g
aXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAg
ICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOworICAgICAgICBM
YXlvdXRVbml0IGZsb2F0Qm90dG9tOworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorICAgICAgICBT
aGFwZU91dHNpZGVJbmZvKiBzaGFwZU91dHNpZGUgPSBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIo
KS5zaGFwZU91dHNpZGVJbmZvKCk7CisgICAgICAgIGlmIChvZmZzZXRNb2RlID09IFNoYXBlT3V0
c2lkZUZsb2F0U2hhcGVPZmZzZXQgJiYgc2hhcGVPdXRzaWRlKQorICAgICAgICAgICAgZmxvYXRC
b3R0b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbFRvcChpc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpKSArIG1hcmdpbkJlZm9yZUZvckNoaWxkKCYoZmxvYXRpbmdPYmplY3QtPnJlbmRlcmVyKCkp
KSArIHNoYXBlT3V0c2lkZS0+c2hhcGVMb2dpY2FsQm90dG9tKCk7CisgICAgICAgIGVsc2UKKyNl
bmRpZgorICAgICAgICAgICAgZmxvYXRCb3R0b20gPSBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJv
dHRvbShpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKTsKKyAgICAgICAgaWYgKGZsb2F0Qm90dG9t
ID4gbG9naWNhbEhlaWdodCkKKyAgICAgICAgICAgIGJvdHRvbSA9IG1pbihmbG9hdEJvdHRvbSwg
Ym90dG9tKTsKKyAgICB9CisKKyAgICByZXR1cm4gYm90dG9tID09IExheW91dFVuaXQ6Om1heCgp
ID8gTGF5b3V0VW5pdCgpIDogYm90dG9tOworfQorCitMYXlvdXRVbml0IFJlbmRlckJsb2NrRmxv
dzo6bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0OjpUeXBlIGZsb2F0VHlw
ZSkgY29uc3QKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0Qm90dG9tID0gMDsKKyAgICBjb25zdCBGbG9h
dGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0
KCk7CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsKKyAgICBmb3IgKGF1
dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gaXQtPmdldCgpOworICAgICAg
ICBpZiAoZmxvYXRpbmdPYmplY3QtPmlzUGxhY2VkKCkgJiYgZmxvYXRpbmdPYmplY3QtPnR5cGUo
KSAmIGZsb2F0VHlwZSkKKyAgICAgICAgICAgIGxvd2VzdEZsb2F0Qm90dG9tID0gbWF4KGxvd2Vz
dEZsb2F0Qm90dG9tLCBmbG9hdGluZ09iamVjdC0+bG9naWNhbEJvdHRvbShpc0hvcml6b250YWxX
cml0aW5nTW9kZSgpKSk7CisgICAgfQorICAgIHJldHVybiBsb3dlc3RGbG9hdEJvdHRvbTsKK30K
KworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmFkZE92ZXJoYW5naW5nRmxvYXRzKFJlbmRl
ckJsb2NrRmxvdyogY2hpbGQsIGJvb2wgbWFrZUNoaWxkUGFpbnRPdGhlckZsb2F0cykKK3sKKyAg
ICAvLyBQcmV2ZW50IGZsb2F0cyBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZSBjYW52YXMgYnkgdGhl
IHJvb3QgZWxlbWVudCwgZS5nLiwgPGh0bWw+LgorICAgIGlmIChjaGlsZC0+aGFzT3ZlcmZsb3dD
bGlwKCkgfHwgIWNoaWxkLT5jb250YWluc0Zsb2F0cygpIHx8IGNoaWxkLT5pc1Jvb3QoKSB8fCBj
aGlsZC0+aGFzQ29sdW1ucygpIHx8IGNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxv
Z2ljYWxUb3AoKTsKKyAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbExlZnQgPSBjaGlsZC0+bG9n
aWNhbExlZnQoKTsKKyAgICBMYXlvdXRVbml0IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSA9IDA7
CisKKyAgICAvLyBGbG9hdHMgdGhhdCB3aWxsIHJlbWFpbiB0aGUgY2hpbGQncyByZXNwb25zaWJp
bGl0eSB0byBwYWludCBzaG91bGQgZmFjdG9yIGludG8gaXRzCisgICAgLy8gb3ZlcmZsb3cuCisg
ICAgYXV0byBjaGlsZEVuZCA9IGNoaWxkLT5tX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuZW5kKCk7
CisgICAgZm9yIChhdXRvIGNoaWxkSXQgPSBjaGlsZC0+bV9mbG9hdGluZ09iamVjdHMtPnNldCgp
LmJlZ2luKCk7IGNoaWxkSXQgIT0gY2hpbGRFbmQ7ICsrY2hpbGRJdCkgeworICAgICAgICBGbG9h
dGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBjaGlsZEl0LT5nZXQoKTsKKyAgICAgICAgTGF5
b3V0VW5pdCBsb2dpY2FsQm90dG9tRm9yRmxvYXQgPSBtaW4oZmxvYXRpbmdPYmplY3QtPmxvZ2lj
YWxCb3R0b20oaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSksIExheW91dFVuaXQ6Om1heCgpIC0g
Y2hpbGRMb2dpY2FsVG9wKTsKKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0gY2hp
bGRMb2dpY2FsVG9wICsgbG9naWNhbEJvdHRvbUZvckZsb2F0OworICAgICAgICBsb3dlc3RGbG9h
dExvZ2ljYWxCb3R0b20gPSBtYXgobG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tLCBsb2dpY2FsQm90
dG9tKTsKKworICAgICAgICBpZiAobG9naWNhbEJvdHRvbSA+IGxvZ2ljYWxIZWlnaHQoKSkgewor
ICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxpc3QsIHdlIGFkZCBp
dCBub3cuCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zRmxvYXQoJmZsb2F0aW5nT2JqZWN0LT5y
ZW5kZXJlcigpKSkgeworICAgICAgICAgICAgICAgIExheW91dFNpemUgb2Zmc2V0ID0gaXNIb3Jp
em9udGFsV3JpdGluZ01vZGUoKSA/IExheW91dFNpemUoLWNoaWxkTG9naWNhbExlZnQsIC1jaGls
ZExvZ2ljYWxUb3ApIDogTGF5b3V0U2l6ZSgtY2hpbGRMb2dpY2FsVG9wLCAtY2hpbGRMb2dpY2Fs
TGVmdCk7CisgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRQYWludCA9IGZhbHNlOworCisgICAg
ICAgICAgICAgICAgLy8gVGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxheWVyIGFsd2F5cyBwYWludHMg
dGhlIGZsb2F0IChzbyB0aGF0IHppbmRleCBhbmQgc3RhY2tpbmcKKyAgICAgICAgICAgICAgICAv
LyBiZWhhdmVzIHByb3Blcmx5KS4gV2UgYWx3YXlzIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBkZXNp
cmUgdG8gcGFpbnQgdGhlIGZsb2F0IGFzCisgICAgICAgICAgICAgICAgLy8gZmFyIG91dCBhcyB3
ZSBjYW4sIHRvIHRoZSBvdXRlcm1vc3QgYmxvY2sgdGhhdCBvdmVybGFwcyB0aGUgZmxvYXQsIHN0
b3BwaW5nIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoaXQgYSBzZWxmLXBhaW50aW5n
IGxheWVyIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIGlmIChmbG9hdGluZ09iamVjdC0+cmVu
ZGVyZXIoKS5lbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIoKSA9PSBlbmNsb3NpbmdGbG9hdFBh
aW50aW5nTGF5ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+c2V0
U2hvdWxkUGFpbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBzaG91bGRQYWludCA9IHRy
dWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZSB0aGUg
ZmxvYXRpbmcgb2JqZWN0IGxpc3QgbGF6aWx5LgorICAgICAgICAgICAgICAgIGlmICghbV9mbG9h
dGluZ09iamVjdHMpCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZsb2F0aW5nT2JqZWN0cygp
OworCisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmFkZChmbG9hdGluZ09iamVj
dC0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCwgc2hvdWxkUGFpbnQsIHRydWUpKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtYWtlQ2hpbGRQYWlu
dE90aGVyRmxvYXRzICYmICFmbG9hdGluZ09iamVjdC0+c2hvdWxkUGFpbnQoKSAmJiAhZmxvYXRp
bmdPYmplY3QtPnJlbmRlcmVyKCkuaGFzU2VsZlBhaW50aW5nTGF5ZXIoKQorICAgICAgICAgICAg
ICAgICYmIGZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLmlzRGVzY2VuZGFudE9mKGNoaWxkKSAm
JiBmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5lbmNsb3NpbmdGbG9hdFBhaW50aW5nTGF5ZXIo
KSA9PSBjaGlsZC0+ZW5jbG9zaW5nRmxvYXRQYWludGluZ0xheWVyKCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBUaGUgZmxvYXQgaXMgbm90IG92ZXJoYW5naW5nIGZyb20gdGhpcyBibG9jaywgc28g
aWYgaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBjaGlsZCwgdGhlIGNoaWxkIHNob3VsZAorICAg
ICAgICAgICAgICAgIC8vIHBhaW50IGl0ICh0aGUgb3RoZXIgY2FzZSBpcyB0aGF0IGl0IGlzIGlu
dHJ1ZGluZyBpbnRvIHRoZSBjaGlsZCksIHVubGVzcyBpdCBoYXMgaXRzIG93biBsYXllciBvciBl
bmNsb3NpbmcKKyAgICAgICAgICAgICAgICAvLyBsYXllci4KKyAgICAgICAgICAgICAgICAvLyBJ
ZiBtYWtlQ2hpbGRQYWludE90aGVyRmxvYXRzIGlzIGZhbHNlLCBpdCBtZWFucyB0aGF0IHRoZSBj
aGlsZCBtdXN0IGFscmVhZHkga25vdyBhYm91dCBhbGwgdGhlIGZsb2F0cworICAgICAgICAgICAg
ICAgIC8vIGl0IHNob3VsZCBwYWludC4KKyAgICAgICAgICAgICAgICBmbG9hdGluZ09iamVjdC0+
c2V0U2hvdWxkUGFpbnQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIC8vIFNpbmNlIHRoZSBmbG9hdCBkb2Vzbid0IG92ZXJoYW5nLCBpdCBkaWRuJ3QgZ2V0
IHB1dCBpbnRvIG91ciBsaXN0LiBXZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBhZGQgaXRzIG92ZXJm
bG93IGluIHRvIHRoZQorICAgICAgICAgICAgLy8gY2hpbGQgbm93LgorICAgICAgICAgICAgaWYg
KGZsb2F0aW5nT2JqZWN0LT5pc0Rlc2NlbmRhbnQoKSkKKyAgICAgICAgICAgICAgICBjaGlsZC0+
YWRkT3ZlcmZsb3dGcm9tQ2hpbGQoJmZsb2F0aW5nT2JqZWN0LT5yZW5kZXJlcigpLCBMYXlvdXRT
aXplKHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2luKGZsb2F0aW5nT2JqZWN0KSwgeVBv
c2l0aW9uRm9yRmxvYXRJbmNsdWRpbmdNYXJnaW4oZmxvYXRpbmdPYmplY3QpKSk7CisgICAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbTsKK30KKworYm9v
bCBSZW5kZXJCbG9ja0Zsb3c6Omhhc092ZXJoYW5naW5nRmxvYXQoUmVuZGVyQm94KiByZW5kZXJl
cikKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzIHx8IGhhc0NvbHVtbnMoKSB8fCAhcGFy
ZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0
U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBh
dXRvIGl0ID0gZmxvYXRpbmdPYmplY3RTZXQuZmluZDxSZW5kZXJCb3gmLCBGbG9hdGluZ09iamVj
dEhhc2hUcmFuc2xhdG9yPigqcmVuZGVyZXIpOworICAgIGlmIChpdCA9PSBmbG9hdGluZ09iamVj
dFNldC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuICgqaXQpLT5s
b2dpY2FsQm90dG9tKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpID4gbG9naWNhbEhlaWdodCgp
OworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6YWRkSW50cnVkaW5nRmxvYXRzKFJlbmRlckJs
b2NrRmxvdyogcHJldiwgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdE9mZnNldCwgTGF5b3V0VW5pdCBs
b2dpY2FsVG9wT2Zmc2V0KQoreworICAgIEFTU0VSVCghYXZvaWRzRmxvYXRzKCkpOworCisgICAg
Ly8gSWYgdGhlIHBhcmVudCBvciBwcmV2aW91cyBzaWJsaW5nIGRvZXNuJ3QgaGF2ZSBhbnkgZmxv
YXRzIHRvIGFkZCwgZG9uJ3QgYm90aGVyLgorICAgIGlmICghcHJldi0+bV9mbG9hdGluZ09iamVj
dHMpCisgICAgICAgIHJldHVybjsKKworICAgIGxvZ2ljYWxMZWZ0T2Zmc2V0ICs9IG1hcmdpbkxv
Z2ljYWxMZWZ0KCk7CisKKyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgcHJldlNldCA9IHBy
ZXYtPm1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICBhdXRvIHByZXZFbmQgPSBwcmV2U2V0
LmVuZCgpOworICAgIGZvciAoYXV0byBwcmV2SXQgPSBwcmV2U2V0LmJlZ2luKCk7IHByZXZJdCAh
PSBwcmV2RW5kOyArK3ByZXZJdCkgeworICAgICAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdP
YmplY3QgPSBwcmV2SXQtPmdldCgpOworICAgICAgICBpZiAoZmxvYXRpbmdPYmplY3QtPmxvZ2lj
YWxCb3R0b20oaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgPiBsb2dpY2FsVG9wT2Zmc2V0KSB7
CisgICAgICAgICAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzIHx8ICFtX2Zsb2F0aW5nT2JqZWN0
cy0+c2V0KCkuY29udGFpbnM8RmxvYXRpbmdPYmplY3QmLCBGbG9hdGluZ09iamVjdEhhc2hUcmFu
c2xhdG9yPigqZmxvYXRpbmdPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRl
IHRoZSBmbG9hdGluZyBvYmplY3QgbGlzdCBsYXppbHkuCisgICAgICAgICAgICAgICAgaWYgKCFt
X2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmxvYXRpbmdPYmpl
Y3RzKCk7CisKKyAgICAgICAgICAgICAgICAvLyBBcHBseWluZyB0aGUgY2hpbGQncyBtYXJnaW4g
bWFrZXMgbm8gc2Vuc2UgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGNoaWxkIHdhcyBwYXNzZWQgaW4u
CisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBtYXJnaW4gd2FzIGFkZGVkIGFscmVhZHkg
dGhyb3VnaCB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSB8bG9naWNhbExlZnRPZmZzZXR8IHZhcmlh
YmxlCisgICAgICAgICAgICAgICAgLy8gYWJvdmUuIHxsb2dpY2FsTGVmdE9mZnNldHwgd2lsbCBl
cXVhbCB0aGUgbWFyZ2luIGluIHRoaXMgY2FzZSwgc28gaXQncyBhbHJlYWR5IGJlZW4gdGFrZW4K
KyAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQuIE9ubHkgYXBwbHkgdGhpcyBjb2RlIGlm
IHByZXYgaXMgdGhlIHBhcmVudCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0IG1hcmdpbgorICAg
ICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGFwcGxpZWQgdHdpY2UuCisgICAgICAgICAgICAgICAg
TGF5b3V0U2l6ZSBvZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpCisgICAgICAgICAg
ICAgICAgICAgID8gTGF5b3V0U2l6ZShsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IHBhcmVu
dCgpID8gcHJldi0+bWFyZ2luTGVmdCgpIDogTGF5b3V0VW5pdCgpKSwgbG9naWNhbFRvcE9mZnNl
dCkKKyAgICAgICAgICAgICAgICAgICAgOiBMYXlvdXRTaXplKGxvZ2ljYWxUb3BPZmZzZXQsIGxv
Z2ljYWxMZWZ0T2Zmc2V0IC0gKHByZXYgIT0gcGFyZW50KCkgPyBwcmV2LT5tYXJnaW5Ub3AoKSA6
IExheW91dFVuaXQoKSkpOworCisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmFk
ZChmbG9hdGluZ09iamVjdC0+Y29weVRvTmV3Q29udGFpbmVyKG9mZnNldCkpOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bWFya0Fs
bERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChSZW5kZXJCb3gqIGZsb2F0VG9SZW1vdmUs
IGJvb2wgaW5MYXlvdXQpCit7CisgICAgaWYgKCFldmVySGFkTGF5b3V0KCkgJiYgIWNvbnRhaW5z
RmxvYXRzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIE1hcmtpbmdCZWhhdmlvciBtYXJrUGFy
ZW50cyA9IGluTGF5b3V0ID8gTWFya09ubHlUaGlzIDogTWFya0NvbnRhaW5pbmdCbG9ja0NoYWlu
OworICAgIHNldENoaWxkTmVlZHNMYXlvdXQobWFya1BhcmVudHMpOworCisgICAgaWYgKGZsb2F0
VG9SZW1vdmUpCisgICAgICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0VG9SZW1vdmUpOwor
CisgICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGlsZHJlbiBhbmQgbWFyayB0aGVtIGFzIG5lZWRl
ZC4KKyAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgZm9yIChSZW5kZXJPYmpl
Y3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxp
bmcoKSkgeworICAgICAgICAgICAgaWYgKCghZmxvYXRUb1JlbW92ZSAmJiBjaGlsZC0+aXNGbG9h
dGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB8fCAhY2hpbGQtPmlzUmVuZGVyQmxvY2soKSkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghY2hpbGQtPmlzUmVu
ZGVyQmxvY2tGbG93KCkpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogY2hpbGRCbG9j
ayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZEJsb2Nr
LT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkgJiYgY2hpbGRCbG9jay0+ZXZlckhhZExheW91dCgpKQor
ICAgICAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5zZXRDaGlsZE5lZWRzTGF5b3V0KG1hcmtQ
YXJlbnRzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIFJlbmRlckJsb2NrRmxvdyogY2hpbGRCbG9jayA9IHRvUmVuZGVyQmxvY2tGbG93KGNo
aWxkKTsKKyAgICAgICAgICAgIGlmICgoZmxvYXRUb1JlbW92ZSA/IGNoaWxkQmxvY2stPmNvbnRh
aW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWluc0Zsb2F0cygpKSB8
fCBjaGlsZEJsb2NrLT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkpCisgICAgICAgICAgICAgICAgY2hp
bGRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChmbG9hdFRvUmVt
b3ZlLCBpbkxheW91dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tG
bG93OjptYXJrU2libGluZ3NXaXRoRmxvYXRzRm9yTGF5b3V0KFJlbmRlckJveCogZmxvYXRUb1Jl
bW92ZSkKK3sKKyAgICBpZiAoIW1fZmxvYXRpbmdPYmplY3RzKQorICAgICAgICByZXR1cm47CisK
KyAgICBjb25zdCBGbG9hdGluZ09iamVjdFNldCYgZmxvYXRpbmdPYmplY3RTZXQgPSBtX2Zsb2F0
aW5nT2JqZWN0cy0+c2V0KCk7CisgICAgYXV0byBlbmQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQo
KTsKKworICAgIGZvciAoUmVuZGVyT2JqZWN0KiBuZXh0ID0gbmV4dFNpYmxpbmcoKTsgbmV4dDsg
bmV4dCA9IG5leHQtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKCFuZXh0LT5pc1JlbmRl
ckJsb2NrRmxvdygpIHx8IG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSB8
fCB0b1JlbmRlckJsb2NrKG5leHQpLT5hdm9pZHNGbG9hdHMoKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIFJlbmRlckJsb2NrRmxvdyogbmV4dEJsb2NrID0gdG9SZW5kZXJCbG9j
a0Zsb3cobmV4dCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGZsb2F0aW5nT2JqZWN0U2V0LmJl
Z2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgUmVuZGVyQm94KiBmbG9hdGlu
Z0JveCA9ICYoKml0KS0+cmVuZGVyZXIoKTsKKyAgICAgICAgICAgIGlmIChmbG9hdFRvUmVtb3Zl
ICYmIGZsb2F0aW5nQm94ICE9IGZsb2F0VG9SZW1vdmUpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICBpZiAobmV4dEJsb2NrLT5jb250YWluc0Zsb2F0KGZsb2F0aW5nQm94
KSkKKyAgICAgICAgICAgICAgICBuZXh0QmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhGbG9h
dHNGb3JMYXlvdXQoZmxvYXRpbmdCb3gpOworICAgICAgICB9CisgICAgfQorfQorCitMYXlvdXRV
bml0IFJlbmRlckJsb2NrRmxvdzo6Z2V0Q2xlYXJEZWx0YShSZW5kZXJCb3gqIGNoaWxkLCBMYXlv
dXRVbml0IGxvZ2ljYWxUb3ApCit7CisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjb21wdXRl
IGNsZWFyYW5jZSBpZiB3ZSBoYXZlIG5vIGZsb2F0cy4KKyAgICBpZiAoIWNvbnRhaW5zRmxvYXRz
KCkpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIEF0IGxlYXN0IG9uZSBmbG9hdCBp
cyBwcmVzZW50LiBXZSBuZWVkIHRvIHBlcmZvcm0gdGhlIGNsZWFyYW5jZSBjb21wdXRhdGlvbi4K
KyAgICBib29sIGNsZWFyU2V0ID0gY2hpbGQtPnN0eWxlKCktPmNsZWFyKCkgIT0gQ05PTkU7Cisg
ICAgTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tID0gMDsKKyAgICBzd2l0Y2ggKGNoaWxkLT5zdHls
ZSgpLT5jbGVhcigpKSB7CisgICAgY2FzZSBDTk9ORToKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBDTEVGVDoKKyAgICAgICAgbG9naWNhbEJvdHRvbSA9IGxvd2VzdEZsb2F0TG9naWNhbEJvdHRv
bShGbG9hdGluZ09iamVjdDo6RmxvYXRMZWZ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBD
UklHSFQ6CisgICAgICAgIGxvZ2ljYWxCb3R0b20gPSBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20o
RmxvYXRpbmdPYmplY3Q6OkZsb2F0UmlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENC
T1RIOgorICAgICAgICBsb2dpY2FsQm90dG9tID0gbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCk7
CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFdlIGFsc28gY2xlYXIgZmxvYXRzIGlm
IHdlIGFyZSB0b28gYmlnIHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFzIGEgZmxvYXQgKGFuZCB3
aXNoIHRvIGF2b2lkIGZsb2F0cyBieSBkZWZhdWx0KS4KKyAgICBMYXlvdXRVbml0IHJlc3VsdCA9
IGNsZWFyU2V0ID8gbWF4PExheW91dFVuaXQ+KDAsIGxvZ2ljYWxCb3R0b20gLSBsb2dpY2FsVG9w
KSA6IExheW91dFVuaXQoKTsKKyAgICBpZiAoIXJlc3VsdCAmJiBjaGlsZC0+YXZvaWRzRmxvYXRz
KCkpIHsKKyAgICAgICAgTGF5b3V0VW5pdCBuZXdMb2dpY2FsVG9wID0gbG9naWNhbFRvcDsKKyAg
ICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIExheW91dFVuaXQgYXZhaWxhYmxlTG9n
aWNhbFdpZHRoQXROZXdMb2dpY2FsVG9wT2Zmc2V0ID0gYXZhaWxhYmxlTG9naWNhbFdpZHRoRm9y
TGluZShuZXdMb2dpY2FsVG9wLCBmYWxzZSwgbG9naWNhbEhlaWdodEZvckNoaWxkKGNoaWxkKSk7
CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoQXROZXdMb2dpY2FsVG9wT2Zm
c2V0ID09IGF2YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckNvbnRlbnQobmV3TG9naWNhbFRvcCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xvZ2ljYWxUb3AgLSBsb2dpY2FsVG9wOworCisgICAg
ICAgICAgICBSZW5kZXJSZWdpb24qIHJlZ2lvbiA9IHJlZ2lvbkF0QmxvY2tPZmZzZXQobG9naWNh
bFRvcEZvckNoaWxkKGNoaWxkKSk7CisgICAgICAgICAgICBMYXlvdXRSZWN0IGJvcmRlckJveCA9
IGNoaWxkLT5ib3JkZXJCb3hSZWN0SW5SZWdpb24ocmVnaW9uLCBEb05vdENhY2hlUmVuZGVyQm94
UmVnaW9uSW5mbyk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkTG9naWNhbFdpZHRoQXRP
bGRMb2dpY2FsVG9wT2Zmc2V0ID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IGJvcmRlckJv
eC53aWR0aCgpIDogYm9yZGVyQm94LmhlaWdodCgpOworCisgICAgICAgICAgICAvLyBGSVhNRTog
Tm9uZSBvZiB0aGlzIGlzIHJpZ2h0IGZvciBwZXJwZW5kaWN1bGFyIHdyaXRpbmctbW9kZSBjaGls
ZHJlbi4KKyAgICAgICAgICAgIExheW91dFVuaXQgY2hpbGRPbGRMb2dpY2FsV2lkdGggPSBjaGls
ZC0+bG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxkT2xkTWFyZ2lu
TGVmdCA9IGNoaWxkLT5tYXJnaW5MZWZ0KCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNoaWxk
T2xkTWFyZ2luUmlnaHQgPSBjaGlsZC0+bWFyZ2luUmlnaHQoKTsKKyAgICAgICAgICAgIExheW91
dFVuaXQgY2hpbGRPbGRMb2dpY2FsVG9wID0gY2hpbGQtPmxvZ2ljYWxUb3AoKTsKKworICAgICAg
ICAgICAgY2hpbGQtPnNldExvZ2ljYWxUb3AobmV3TG9naWNhbFRvcCk7CisgICAgICAgICAgICBj
aGlsZC0+dXBkYXRlTG9naWNhbFdpZHRoKCk7CisgICAgICAgICAgICByZWdpb24gPSByZWdpb25B
dEJsb2NrT2Zmc2V0KGxvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCkpOworICAgICAgICAgICAgYm9y
ZGVyQm94ID0gY2hpbGQtPmJvcmRlckJveFJlY3RJblJlZ2lvbihyZWdpb24sIERvTm90Q2FjaGVS
ZW5kZXJCb3hSZWdpb25JbmZvKTsKKyAgICAgICAgICAgIExheW91dFVuaXQgY2hpbGRMb2dpY2Fs
V2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpID8g
Ym9yZGVyQm94LndpZHRoKCkgOiBib3JkZXJCb3guaGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGNo
aWxkLT5zZXRMb2dpY2FsVG9wKGNoaWxkT2xkTG9naWNhbFRvcCk7CisgICAgICAgICAgICBjaGls
ZC0+c2V0TG9naWNhbFdpZHRoKGNoaWxkT2xkTG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIGNo
aWxkLT5zZXRNYXJnaW5MZWZ0KGNoaWxkT2xkTWFyZ2luTGVmdCk7CisgICAgICAgICAgICBjaGls
ZC0+c2V0TWFyZ2luUmlnaHQoY2hpbGRPbGRNYXJnaW5SaWdodCk7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGlmIChjaGlsZExvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRvcE9mZnNldCA8PSBh
dmFpbGFibGVMb2dpY2FsV2lkdGhBdE5ld0xvZ2ljYWxUb3BPZmZzZXQpIHsKKyAgICAgICAgICAg
ICAgICAvLyBFdmVuIHRob3VnaCB3ZSBtYXkgbm90IGJlIG1vdmluZywgaWYgdGhlIGxvZ2ljYWwg
d2lkdGggZGlkIHNocmluayBiZWNhdXNlIG9mIHRoZSBwcmVzZW5jZSBvZiBuZXcgZmxvYXRzLCB0
aGVuCisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmb3JjZSBhIHJlbGF5b3V0IGFzIHRo
b3VnaCB3ZSBzaGlmdGVkLiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBhZGRp
dGlvbiBvZiBvdmVyaGFuZ2luZyBmbG9hdHMKKyAgICAgICAgICAgICAgICAvLyBmcm9tIHByZXZp
b3VzIHNpYmxpbmdzIHdoZW4gbmVnYXRpdmUgbWFyZ2lucyBleGlzdCBvbiBhIGNoaWxkIChzZWUg
dGhlIGFkZE92ZXJoYW5naW5nRmxvYXRzIGNhbGwgYXQgdGhlIGVuZCBvZiBjb2xsYXBzZU1hcmdp
bnMpLgorICAgICAgICAgICAgICAgIGlmIChjaGlsZExvZ2ljYWxXaWR0aEF0T2xkTG9naWNhbFRv
cE9mZnNldCAhPSBjaGlsZExvZ2ljYWxXaWR0aEF0TmV3TG9naWNhbFRvcE9mZnNldCkKKyAgICAg
ICAgICAgICAgICAgICAgY2hpbGQtPnNldENoaWxkTmVlZHNMYXlvdXQoTWFya09ubHlUaGlzKTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TG9naWNhbFRvcCAtIGxvZ2ljYWxUb3A7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIG5ld0xvZ2ljYWxUb3AgPSBuZXh0RmxvYXRMb2dpY2Fs
Qm90dG9tQmVsb3cobmV3TG9naWNhbFRvcCk7CisgICAgICAgICAgICBBU1NFUlQobmV3TG9naWNh
bFRvcCA+PSBsb2dpY2FsVG9wKTsKKyAgICAgICAgICAgIGlmIChuZXdMb2dpY2FsVG9wIDwgbG9n
aWNhbFRvcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBS
ZW5kZXJCbG9ja0Zsb3c6OmhpdFRlc3RGbG9hdHMoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVl
c3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlv
bkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQpCit7Cisg
ICAgaWYgKCFtX2Zsb2F0aW5nT2JqZWN0cykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
TGF5b3V0UG9pbnQgYWRqdXN0ZWRMb2NhdGlvbiA9IGFjY3VtdWxhdGVkT2Zmc2V0OworICAgIGlm
IChpc1JlbmRlclZpZXcoKSkKKyAgICAgICAgYWRqdXN0ZWRMb2NhdGlvbiArPSB0b0xheW91dFNp
emUodG9SZW5kZXJWaWV3KCp0aGlzKS5mcmFtZVZpZXcoKS5zY3JvbGxQb3NpdGlvbigpKTsKKwor
ICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVjdFNldCA9IG1fZmxvYXRp
bmdPYmplY3RzLT5zZXQoKTsKKyAgICBhdXRvIGJlZ2luID0gZmxvYXRpbmdPYmplY3RTZXQuYmVn
aW4oKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBmbG9hdGluZ09iamVjdFNldC5lbmQoKTsgaXQgIT0g
YmVnaW47KSB7CisgICAgICAgIC0taXQ7CisgICAgICAgIEZsb2F0aW5nT2JqZWN0KiBmbG9hdGlu
Z09iamVjdCA9IGl0LT5nZXQoKTsKKyAgICAgICAgaWYgKGZsb2F0aW5nT2JqZWN0LT5zaG91bGRQ
YWludCgpICYmICFmbG9hdGluZ09iamVjdC0+cmVuZGVyZXIoKS5oYXNTZWxmUGFpbnRpbmdMYXll
cigpKSB7CisgICAgICAgICAgICBMYXlvdXRVbml0IHhPZmZzZXQgPSB4UG9zaXRpb25Gb3JGbG9h
dEluY2x1ZGluZ01hcmdpbihmbG9hdGluZ09iamVjdCkgLSBmbG9hdGluZ09iamVjdC0+cmVuZGVy
ZXIoKS54KCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IHlPZmZzZXQgPSB5UG9zaXRpb25Gb3JG
bG9hdEluY2x1ZGluZ01hcmdpbihmbG9hdGluZ09iamVjdCkgLSBmbG9hdGluZ09iamVjdC0+cmVu
ZGVyZXIoKS55KCk7CisgICAgICAgICAgICBMYXlvdXRQb2ludCBjaGlsZFBvaW50ID0gZmxpcEZs
b2F0Rm9yV3JpdGluZ01vZGVGb3JDaGlsZChmbG9hdGluZ09iamVjdCwgYWRqdXN0ZWRMb2NhdGlv
biArIExheW91dFNpemUoeE9mZnNldCwgeU9mZnNldCkpOworICAgICAgICAgICAgaWYgKGZsb2F0
aW5nT2JqZWN0LT5yZW5kZXJlcigpLmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0LCBsb2NhdGlvbklu
Q29udGFpbmVyLCBjaGlsZFBvaW50KSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUhpdFRlc3RS
ZXN1bHQocmVzdWx0LCBsb2NhdGlvbkluQ29udGFpbmVyLnBvaW50KCkgLSB0b0xheW91dFNpemUo
Y2hpbGRQb2ludCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6YWRqdXN0Rm9yQm9yZGVyRml0KExheW91dFVuaXQgeCwgTGF5b3V0VW5pdCYg
bGVmdCwgTGF5b3V0VW5pdCYgcmlnaHQpIGNvbnN0Cit7CisgICAgUmVuZGVyQmxvY2s6OmFkanVz
dEZvckJvcmRlckZpdCh4LCBsZWZ0LCByaWdodCk7CisgICAgICAgIAorICAgIGlmIChzdHlsZSgp
LT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgeworICAgICAgICBpZiAobV9mbG9hdGluZ09iamVj
dHMpIHsKKyAgICAgICAgICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09iamVj
dFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKKyAgICAgICAgICAgIGF1dG8gZW5kID0g
ZmxvYXRpbmdPYmplY3RTZXQuZW5kKCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBmbG9h
dGluZ09iamVjdFNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgICAg
ICBGbG9hdGluZ09iamVjdCogciA9IGl0LT5nZXQoKTsKKyAgICAgICAgICAgICAgICAvLyBPbmx5
IGV4YW1pbmUgdGhlIG9iamVjdCBpZiBvdXIgbV9zaG91bGRQYWludCBmbGFnIGlzIHNldC4KKyAg
ICAgICAgICAgICAgICBpZiAoci0+c2hvdWxkUGFpbnQoKSkgeworICAgICAgICAgICAgICAgICAg
ICBMYXlvdXRVbml0IGZsb2F0TGVmdCA9IHhQb3NpdGlvbkZvckZsb2F0SW5jbHVkaW5nTWFyZ2lu
KHIpIC0gci0+cmVuZGVyZXIoKS54KCk7CisgICAgICAgICAgICAgICAgICAgIExheW91dFVuaXQg
ZmxvYXRSaWdodCA9IGZsb2F0TGVmdCArIHItPnJlbmRlcmVyKCkud2lkdGgoKTsKKyAgICAgICAg
ICAgICAgICAgICAgbGVmdCA9IG1pbihsZWZ0LCBmbG9hdExlZnQpOworICAgICAgICAgICAgICAg
ICAgICByaWdodCA9IG1heChyaWdodCwgZmxvYXRSaWdodCk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zs
b3cuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAppbmRleCAy
NTc0NzdlMDhmYjI5NzM0MTQ0NWNiMjkzMjM2N2U5OTRiYmRlNGI3Li5mOTBjZTZkMTczMTU1YzQ3
MTIyNjQ3MjhjM2E1Yzg0MDgyNWY1ZjlkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2tGbG93LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrRmxvdy5oCkBAIC0yNyw2ICsyNyw4IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAorY2xhc3MgTGluZUJyZWFrZXI7CisKIGNsYXNzIFJlbmRlckJsb2NrRmxvdyA6IHB1YmxpYyBS
ZW5kZXJCbG9jayB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgUmVuZGVyQmxvY2tGbG93KEVsZW1l
bnQqKTsKQEAgLTIzMiw2ICsyMzQsMTYgQEAgcHVibGljOgogICAgIH0KICAgICB2b2lkIGxheW91
dExpbmVHcmlkQm94KCk7CiAKKyAgICBib29sIGNvbnRhaW5zRmxvYXRzKCkgY29uc3QgT1ZFUlJJ
REUgeyByZXR1cm4gbV9mbG9hdGluZ09iamVjdHMgJiYgIW1fZmxvYXRpbmdPYmplY3RzLT5zZXQo
KS5pc0VtcHR5KCk7IH0KKyAgICBib29sIGNvbnRhaW5zRmxvYXQoUmVuZGVyQm94KikgY29uc3Q7
CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlTGluZUJveFRyZWUoKSBPVkVSUklERTsKKyAgICB2
aXJ0dWFsIHZvaWQgY29tcHV0ZU92ZXJmbG93KExheW91dFVuaXQgb2xkQ2xpZW50QWZ0ZXJFZGdl
LCBib29sIHJlY29tcHV0ZUZsb2F0cyA9IGZhbHNlKSBPVkVSUklERTsKKworICAgIHZvaWQgcmVt
b3ZlRmxvYXRpbmdPYmplY3RzKCk7CisgICAgdm9pZCBtYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxv
YXRzRm9yTGF5b3V0KFJlbmRlckJveCogZmxvYXRUb1JlbW92ZSA9IDAsIGJvb2wgaW5MYXlvdXQg
PSB0cnVlKTsKKyAgICB2b2lkIG1hcmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlvdXQoUmVuZGVy
Qm94KiBmbG9hdFRvUmVtb3ZlID0gMCk7CisKIHByb3RlY3RlZDoKICAgICBMYXlvdXRVbml0IG1h
eFBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFy
ZURhdGEtPm1fbWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIDogUmVuZGVyQmxvY2tGbG93
UmFyZURhdGE6OnBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKTsgfQogICAgIExheW91
dFVuaXQgbWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX3JhcmVEYXRh
ID8gbV9yYXJlRGF0YS0+bV9tYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkgOiBSZW5kZXJC
bG9ja0Zsb3dSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpOyB9CkBA
IC0yNjcsMTMgKzI3OSw5OCBAQCBwcm90ZWN0ZWQ6CiAgICAgTGF5b3V0VW5pdCBhcHBseUFmdGVy
QnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0LCBNYXJnaW5J
bmZvJik7IC8vIElmIHRoZSBjaGlsZCBoYXMgYW4gYWZ0ZXIgYnJlYWssIHRoZW4gcmV0dXJuIGEg
bmV3IG9mZnNldCB0aGF0IHNoaWZ0cyB0byB0aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UvY29sdW1u
LgogICAgIExheW91dFVuaXQgYWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRpb24oTGF5b3V0VW5p
dCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciwgTGF5b3V0VW5pdCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0
aW9uLCBSZW5kZXJCb3gqIGNoaWxkLCBib29sIGF0QmVmb3JlU2lkZU9mQmxvY2spOwogCisgICAg
dmlydHVhbCB2b2lkIHN0eWxlV2lsbENoYW5nZShTdHlsZURpZmZlcmVuY2UsIGNvbnN0IFJlbmRl
clN0eWxlKiBuZXdTdHlsZSkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHN0eWxlRGlkQ2hh
bmdlKFN0eWxlRGlmZmVyZW5jZSwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKSBPVkVSUklE
RTsKKworICAgIHZvaWQgY3JlYXRlRmxvYXRpbmdPYmplY3RzKCk7CisKK3ByaXZhdGU6CisgICAg
dmlydHVhbCB2b2lkIG1vdmVBbGxDaGlsZHJlbkluY2x1ZGluZ0Zsb2F0c1RvKFJlbmRlckJsb2Nr
KiB0b0Jsb2NrLCBib29sIGZ1bGxSZW1vdmVJbnNlcnQpIE9WRVJSSURFOworICAgIHZpcnR1YWwg
dm9pZCByZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoYm9vbCBwYWludEFsbERlc2NlbmRhbnRzKSBP
VkVSUklERSBGSU5BTDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRGbG9hdHMoUGFpbnRJbmZvJiwg
Y29uc3QgTGF5b3V0UG9pbnQmLCBib29sIHByZXNlcnZlUGhhc2UgPSBmYWxzZSkgT1ZFUlJJREU7
CisgICAgdmlydHVhbCB2b2lkIGNsaXBPdXRGbG9hdGluZ09iamVjdHMoUmVuZGVyQmxvY2sqLCBj
b25zdCBQYWludEluZm8qLCBjb25zdCBMYXlvdXRQb2ludCYsIGNvbnN0IExheW91dFNpemUmKSBP
VkVSUklERTsKKworICAgIEZsb2F0aW5nT2JqZWN0KiBpbnNlcnRGbG9hdGluZ09iamVjdChSZW5k
ZXJCb3gqKTsKKyAgICB2b2lkIHJlbW92ZUZsb2F0aW5nT2JqZWN0KFJlbmRlckJveCopOworICAg
IHZvaWQgcmVtb3ZlRmxvYXRpbmdPYmplY3RzQmVsb3coRmxvYXRpbmdPYmplY3QqLCBpbnQgbG9n
aWNhbE9mZnNldCk7CisgICAgTGF5b3V0UG9pbnQgY29tcHV0ZUxvZ2ljYWxMb2NhdGlvbkZvckZs
b2F0KGNvbnN0IEZsb2F0aW5nT2JqZWN0KiwgTGF5b3V0VW5pdCBsb2dpY2FsVG9wT2Zmc2V0KSBj
b25zdDsKKworICAgIC8vIENhbGxlZCBmcm9tIGxpbmVXaWR0aCwgdG8gcG9zaXRpb24gdGhlIGZs
b2F0cyBhZGRlZCBpbiB0aGUgbGFzdCBsaW5lLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbmQg
b25seSBpZiBpdCBoYXMgcG9zaXRpb25lZCBhbnkgZmxvYXRzLgorICAgIGJvb2wgcG9zaXRpb25O
ZXdGbG9hdHMoKTsKKworICAgIHZvaWQgbmV3TGluZShFQ2xlYXIpOworCisgICAgdmlydHVhbCBM
YXlvdXRVbml0IGxvZ2ljYWxSaWdodEZsb2F0T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IGxvZ2lj
YWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZzZXQsIExheW91dFVuaXQqIGhlaWdodFJlbWFpbmlu
ZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUp
IGNvbnN0IE9WRVJSSURFOworICAgIHZpcnR1YWwgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdEZsb2F0
T2Zmc2V0Rm9yTGluZShMYXlvdXRVbml0IGxvZ2ljYWxUb3AsIExheW91dFVuaXQgZml4ZWRPZmZz
ZXQsIExheW91dFVuaXQqIGhlaWdodFJlbWFpbmluZywgTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0
LCBTaGFwZU91dHNpZGVGbG9hdE9mZnNldE1vZGUpIGNvbnN0IE9WRVJSSURFOworICAgIExheW91
dFVuaXQgbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKEZsb2F0aW5nT2JqZWN0OjpUeXBlID0gRmxv
YXRpbmdPYmplY3Q6OkZsb2F0TGVmdFJpZ2h0KSBjb25zdDsgCisgICAgTGF5b3V0VW5pdCBuZXh0
RmxvYXRMb2dpY2FsQm90dG9tQmVsb3coTGF5b3V0VW5pdCwgU2hhcGVPdXRzaWRlRmxvYXRPZmZz
ZXRNb2RlID0gU2hhcGVPdXRzaWRlRmxvYXRNYXJnaW5Cb3hPZmZzZXQpIGNvbnN0OworICAgIAor
ICAgIExheW91dFVuaXQgYWRkT3ZlcmhhbmdpbmdGbG9hdHMoUmVuZGVyQmxvY2tGbG93KiBjaGls
ZCwgYm9vbCBtYWtlQ2hpbGRQYWludE90aGVyRmxvYXRzKTsKKyAgICBib29sIGhhc092ZXJoYW5n
aW5nRmxvYXQoUmVuZGVyQm94Kik7CisgICAgdm9pZCBhZGRJbnRydWRpbmdGbG9hdHMoUmVuZGVy
QmxvY2tGbG93KiBwcmV2LCBMYXlvdXRVbml0IHhvZmZzZXQsIExheW91dFVuaXQgeW9mZnNldCk7
CisgICAgYm9vbCBoYXNPdmVyaGFuZ2luZ0Zsb2F0cygpIHsgcmV0dXJuIHBhcmVudCgpICYmICFo
YXNDb2x1bW5zKCkgJiYgY29udGFpbnNGbG9hdHMoKSAmJiBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0
b20oKSA+IGxvZ2ljYWxIZWlnaHQoKTsgfQorICAgIExheW91dFVuaXQgZ2V0Q2xlYXJEZWx0YShS
ZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IHlQb3MpOworCisgICAgdmlydHVhbCBib29sIGhp
dFRlc3RGbG9hdHMoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29uc3Qg
SGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYg
YWNjdW11bGF0ZWRPZmZzZXQpIE9WRVJSSURFOworICAgIHZvaWQgYWRkT3ZlcmZsb3dGcm9tRmxv
YXRzKCk7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdEZvckJvcmRlckZpdChMYXlvdXRVbml0IHgs
IExheW91dFVuaXQmIGxlZnQsIExheW91dFVuaXQmIHJpZ2h0KSBjb25zdCBPVkVSUklERTsKKwor
CisvLyBGSVhNRS1CTE9DS0ZMT1c6IFRoZXNlIG1ldGhvZHMgaGF2ZSBpbXBsZW1lbnRhdGlvbnMg
aW4KKy8vIFJlbmRlckJsb2NrTGluZUxheW91dC4gVGhleSBzaG91bGQgYmUgbW92ZWQgdG8gdGhl
IHByb3BlciBoZWFkZXIgb25jZSB0aGUKKy8vIGxpbmUgbGF5b3V0IGNvZGUgaXMgc2VwYXJhdGVk
IGZyb20gUmVuZGVyQmxvY2sgYW5kIFJlbmRlckJsb2NrRmxvdy4KKy8vIFNUQVJUIE1FVEhPRFMg
REVGSU5FRCBJTiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9p
ZCBhcHBlbmRSdW5zRm9yT2JqZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgaW50IHN0YXJ0LCBp
bnQgZW5kLCBSZW5kZXJPYmplY3QqLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsKKworcHJpdmF0ZToK
KyAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgY29uc3Qg
TGluZUluZm8mLCBJbmxpbmVCb3gqIGNoaWxkQm94LCBib29sIHN0YXJ0c05ld1NlZ21lbnQpOwor
ICAgIFJvb3RJbmxpbmVCb3gqIGNvbnN0cnVjdExpbmUoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBj
b25zdCBMaW5lSW5mbyYpOworICAgIHZvaWQgc2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1bios
IFJlbmRlclJ1YnlSdW4qLCBSZW5kZXJPYmplY3QqLCBjb25zdCBMaW5lSW5mbyYpOworICAgIHZv
aWQgY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCos
IGNvbnN0IExpbmVJbmZvJiwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3Bh
Y2VSdW4sIGJvb2wgcmVhY2hlZEVuZCwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAm
LCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBXb3JkTWVhc3VyZW1lbnRzJik7CisgICAgQmlkaVJ1
biogY29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJv
eCosIGNvbnN0IExpbmVJbmZvJiwgRVRleHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0LAorICAg
ICAgICBmbG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlk
aVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAm
IHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmLCBXb3JkTWVhc3VyZW1lbnRz
Jik7CisgICAgdm9pZCBjb21wdXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJ
bmxpbmVCb3gqLCBCaWRpUnVuKiwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmLCBW
ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmKTsKKyAgICBCaWRpUnVuKiBoYW5kbGVUcmFpbGluZ1NwYWNl
cyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIEJpZGlDb250ZXh0Kik7CisgICAgdm9pZCBhcHBlbmRG
bG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdPYmplY3QqKTsKKyAgICAvLyBIZWxwZXIg
ZnVuY3Rpb24gZm9yIGxheW91dElubGluZUNoaWxkcmVuKCkKKyAgICBSb290SW5saW5lQm94KiBj
cmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mLCBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgZW5kLCBMaW5lSW5mbyYsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYsIEJp
ZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdvcmRNZWFzdXJlbWVudHMmKTsKKyAgICB2b2lkIGxh
eW91dFJ1bnNBbmRGbG9hdHMoTGluZUxheW91dFN0YXRlJiwgYm9vbCBoYXNJbmxpbmVDaGlsZCk7
CisgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIHJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5S
YW5nZShMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVuaXQgbmV3TG9naWNhbEhl
aWdodCwgIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBJbmxpbmVC
aWRpUmVzb2x2ZXImLCAgY29uc3QgSW5saW5lSXRlcmF0b3ImKTsKKyAgICB2b2lkIGxheW91dFJ1
bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlvdXRTdGF0ZSYsIElubGluZUJpZGlSZXNvbHZlciYs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlkaVN0YXR1cyYg
Y2xlYW5MaW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMp
OworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorICAgIHZvaWQgdXBkYXRlU2hhcGVBbmRTZWdtZW50
c0ZvckN1cnJlbnRMaW5lKFNoYXBlSW5zaWRlSW5mbyomLCBjb25zdCBMYXlvdXRTaXplJiwgTGlu
ZUxheW91dFN0YXRlJik7CisgICAgdm9pZCB1cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVu
dExpbmVJbkZsb3dUaHJlYWQoU2hhcGVJbnNpZGVJbmZvKiYsIExpbmVMYXlvdXRTdGF0ZSYpOwor
ICAgIGJvb2wgYWRqdXN0TG9naWNhbExpbmVUb3BBbmRMb2dpY2FsSGVpZ2h0SWZOZWVkZWQoU2hh
cGVJbnNpZGVJbmZvKiwgTGF5b3V0VW5pdCwgTGluZUxheW91dFN0YXRlJiwgSW5saW5lQmlkaVJl
c29sdmVyJiwgRmxvYXRpbmdPYmplY3QqLCBJbmxpbmVJdGVyYXRvciYsIFdvcmRNZWFzdXJlbWVu
dHMmKTsKKyNlbmRpZgorICAgIHZvaWQgbGlua1RvRW5kTGluZUlmTmVlZGVkKExpbmVMYXlvdXRT
dGF0ZSYpOworICAgIHN0YXRpYyB2b2lkIHJlcGFpbnREaXJ0eUZsb2F0cyhWZWN0b3I8RmxvYXRX
aXRoUmVjdD4mIGZsb2F0cyk7CisgICAgdm9pZCBjaGVja0Zsb2F0c0luQ2xlYW5MaW5lKFJvb3RJ
bmxpbmVCb3gqLCBWZWN0b3I8RmxvYXRXaXRoUmVjdD4mLCBzaXplX3QmIGZsb2F0SW5kZXgsIGJv
b2wmIGVuY291bnRlcmVkTmV3RmxvYXQsIGJvb2wmIGRpcnRpZWRCeUZsb2F0KTsKKyAgICBSb290
SW5saW5lQm94KiBkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExpbmVMYXlvdXRTdGF0ZSYsIElubGlu
ZUJpZGlSZXNvbHZlciYpOworICAgIHZvaWQgZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91
dFN0YXRlJiwgUm9vdElubGluZUJveCogc3RhcnRCb3gsIElubGluZUl0ZXJhdG9yJiBjbGVhbkxp
bmVTdGFydCwgQmlkaVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cyk7CisgICAgYm9vbCBjaGVj
a1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRlJik7CisgICAgYm9v
bCBtYXRjaGVkRW5kTGluZShMaW5lTGF5b3V0U3RhdGUmLCBjb25zdCBJbmxpbmVCaWRpUmVzb2x2
ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVz
JiBlbmRMaW5lU3RhdHVzKTsKKyAgICB2b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7Cisg
ICAgdm9pZCBjaGVja0xpbmVzRm9yVGV4dE92ZXJmbG93KCk7CisgICAgLy8gUG9zaXRpb25zIG5l
dyBmbG9hdHMgYW5kIGFsc28gYWRqdXN0IGFsbCBmbG9hdHMgZW5jb3VudGVyZWQgb24gdGhlIGxp
bmUgaWYgYW55IG9mIHRoZW0KKyAgICAvLyBoYXZlIHRvIG1vdmUgdG8gdGhlIG5leHQgcGFnZS9j
b2x1bW4uCisgICAgYm9vbCBwb3NpdGlvbk5ld0Zsb2F0T25MaW5lKEZsb2F0aW5nT2JqZWN0KiBu
ZXdGbG9hdCwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVJ
bmZvJiwgTGluZVdpZHRoJik7CisKKworLy8gRU5EIE1FVEhPRFMgREVGSU5FRCBJTiBSZW5kZXJC
bG9ja0xpbmVMYXlvdXQKKyAgICAKIHB1YmxpYzoKICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFRo
ZXNlIGNhbiBiZSBtYWRlIHByb3RlY3RlZCBhZ2FpbiBvbmNlIGFsbCBjYWxsZXJzIGhhdmUgYmVl
biBtb3ZlZCBoZXJlLgogICAgIHZvaWQgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihS
b290SW5saW5lQm94KiwgTGF5b3V0VW5pdCYgZGVsdGFPZmZzZXQsIFJlbmRlckZsb3dUaHJlYWQq
KTsgLy8gQ29tcHV0ZXMgYSBkZWx0YU9mZnNldCB2YWx1ZSB0aGF0IHB1dCBhIGxpbmUgYXQgdGhl
IHRvcCBvZiB0aGUgbmV4dCBwYWdlIGlmIGl0IGRvZXNuJ3QgZml0IG9uIHRoZSBjdXJyZW50IHBh
Z2UuCiAgICAgdm9pZCB1cGRhdGVSZWdpb25Gb3JMaW5lKFJvb3RJbmxpbmVCb3gqKSBjb25zdDsK
IAogcHJvdGVjdGVkOgorICAgIE93blB0cjxGbG9hdGluZ09iamVjdHM+IG1fZmxvYXRpbmdPYmpl
Y3RzOwogICAgIE93blB0cjxSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YT4gbV9yYXJlRGF0YTsKKwor
ICAgIGZyaWVuZCBjbGFzcyBMaW5lQnJlYWtlcjsKKyAgICBmcmllbmQgY2xhc3MgTGluZVdpZHRo
OyAvLyBOZWVkcyB0byBrbm93IEZsb2F0aW5nT2JqZWN0CiB9OwogCiBpbmxpbmUgUmVuZGVyQmxv
Y2tGbG93JiB0b1JlbmRlckJsb2NrRmxvdyhSZW5kZXJPYmplY3QmIG9iamVjdCkKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwIGIv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKaW5kZXgg
NGQ3MWE2YzJmNWRmODY0MmYxMWUzOTc2YWUyYjMxMjkwNGJkNjA5Mi4uMGM2NTI5MTQ1ZTBiODQz
YjlhNmIwZjFjNjY5YzU0YjQ5NGNlYWZhOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNs
dWRlICJMaW5lTGF5b3V0U3RhdGUuaCIKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAi
UmVuZGVyQXJlbmEuaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9ja0Zsb3cuaCIKICNpbmNsdWRlICJS
ZW5kZXJDb21iaW5lVGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlckNvdW50ZXIuaCIKICNpbmNsdWRl
ICJSZW5kZXJGbG93VGhyZWFkLmgiCkBAIC04Miw3ICs4Myw3IEBAIHN0cnVjdCBSZW5kZXJUZXh0
SW5mbyB7CiAKIGNsYXNzIExpbmVCcmVha2VyIHsKIHB1YmxpYzoKLSAgICBMaW5lQnJlYWtlcihS
ZW5kZXJCbG9jayogYmxvY2spCisgICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2tGbG93KiBibG9j
aykKICAgICAgICAgOiBtX2Jsb2NrKGJsb2NrKQogICAgIHsKICAgICAgICAgcmVzZXQoKTsKQEAg
LTEwMCw3ICsxMDEsNyBAQCBwcml2YXRlOgogICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFj
ZShJbmxpbmVJdGVyYXRvciYsIGNvbnN0IExpbmVJbmZvJik7CiAgICAgdm9pZCBza2lwTGVhZGlu
Z1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBGbG9hdGluZ09iamVj
dCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZVdpZHRoJik7CiAKLSAgICBSZW5kZXJC
bG9jayogbV9ibG9jazsKKyAgICBSZW5kZXJCbG9ja0Zsb3cqIG1fYmxvY2s7CiAgICAgYm9vbCBt
X2h5cGhlbmF0ZWQ7CiAgICAgRUNsZWFyIG1fY2xlYXI7CiAgICAgVmVjdG9yPFJlbmRlckJveCo+
IG1fcG9zaXRpb25lZE9iamVjdHM7CkBAIC0yNTYsNyArMjU3LDcgQEAgc3RhdGljIGlubGluZSBC
aWRpUnVuKiBjcmVhdGVSdW4oaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwg
SW5saW5lQmkKICAgICByZXR1cm4gbmV3IChvYmotPnJlbmRlckFyZW5hKCkpIEJpZGlSdW4oc3Rh
cnQsIGVuZCwgb2JqLCByZXNvbHZlci5jb250ZXh0KCksIHJlc29sdmVyLmRpcigpKTsKIH0KIAot
dm9pZCBSZW5kZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChCaWRpUnVuTGlzdDxCaWRpUnVu
PiYgcnVucywgaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlk
aVJlc29sdmVyJiByZXNvbHZlcikKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjphcHBlbmRSdW5zRm9y
T2JqZWN0KEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBydW5zLCBpbnQgc3RhcnQsIGludCBlbmQsIFJl
bmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQogewogICAgIGlm
IChzdGFydCA+IGVuZCB8fCBzaG91bGRTa2lwQ3JlYXRpbmdSdW5zRm9yT2JqZWN0KG9iaikpCiAg
ICAgICAgIHJldHVybjsKQEAgLTM1MCw3ICszNTEsNyBAQCBzdGF0aWMgYm9vbCBwYXJlbnRJc0Nv
bnN0cnVjdGVkT3JIYXZlTmV4dChJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3gpCiAgICAgcmV0dXJu
IGZhbHNlOwogfQogCi1JbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGluZUJveGVz
KFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIElubGluZUJveCog
Y2hpbGRCb3gsIGJvb2wgc3RhcnROZXdTZWdtZW50KQorSW5saW5lRmxvd0JveCogUmVuZGVyQmxv
Y2tGbG93OjpjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IExpbmVJbmZv
JiBsaW5lSW5mbywgSW5saW5lQm94KiBjaGlsZEJveCwgYm9vbCBzdGFydE5ld1NlZ21lbnQpCiB7
CiAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5jb25zdHJ1Y3RlZCBsaW5lIGJveCBmb3IgdGhp
cyBvYmplY3QgdGhhdCBpcyBhbHNvCiAgICAgLy8gdGhlIGxhc3QgaXRlbSBvbiB0aGUgbGluZS4K
QEAgLTQ0Myw3ICs0NDQsNyBAQCBzdGF0aWMgYm9vbCByZWFjaGVkRW5kT2ZUZXh0UmVuZGVyZXIo
Y29uc3QgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zKQogICAgIHJldHVybiBlbmRzV2l0
aEFTQ0lJU3BhY2VzKHJlbmRlclRleHQtPmNoYXJhY3RlcnMxNigpLCBwb3MsIGxlbmd0aCk7CiB9
CiAKLVJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0
PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQorUm9vdElubGlu
ZUJveCogUmVuZGVyQmxvY2tGbG93Ojpjb25zdHJ1Y3RMaW5lKEJpZGlSdW5MaXN0PEJpZGlSdW4+
JiBiaWRpUnVucywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQogewogICAgIEFTU0VSVChiaWRp
UnVucy5maXJzdFJ1bigpKTsKIApAQCAtNTgzLDcgKzU4NCw3IEBAIHN0YXRpYyB2b2lkIHVwZGF0
ZUxvZ2ljYWxXaWR0aEZvckNlbnRlckFsaWduZWRCbG9jayhib29sIGlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24sCiAgICAgICAgIGxvZ2ljYWxMZWZ0ICs9IHRvdGFsTG9naWNhbFdpZHRoID4gYXZhaWxh
YmxlTG9naWNhbFdpZHRoID8gKGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCAtIHRvdGFsTG9naWNhbFdp
ZHRoKSA6IChhdmFpbGFibGVMb2dpY2FsV2lkdGggLSB0b3RhbExvZ2ljYWxXaWR0aCkgLyAyIC0g
dHJhaWxpbmdTcGFjZVdpZHRoOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpzZXRNYXJnaW5zRm9y
UnVieVJ1bihCaWRpUnVuKiBydW4sIFJlbmRlclJ1YnlSdW4qIHJlbmRlcmVyLCBSZW5kZXJPYmpl
Y3QqIHByZXZpb3VzT2JqZWN0LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biogcnVuLCBSZW5kZXJSdWJ5
UnVuKiByZW5kZXJlciwgUmVuZGVyT2JqZWN0KiBwcmV2aW91c09iamVjdCwgY29uc3QgTGluZUlu
Zm8mIGxpbmVJbmZvKQogewogICAgIGludCBzdGFydE92ZXJoYW5nOwogICAgIGludCBlbmRPdmVy
aGFuZzsKQEAgLTgwOCw3ICs4MDksNyBAQCBzdGF0aWMgSW5kZW50VGV4dE9yTm90IHJlcXVpcmVz
SW5kZW50KGJvb2wgaXNGaXJzdExpbmUsIGJvb2wgaXNBZnRlckhhcmRMaW5lQnJlYQogICAgIHJl
dHVybiBzaG91bGRJbmRlbnRUZXh0OwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVMb2dpY2FsSW5s
aW5lUG9zaXRpb25zKFJlbmRlckJsb2NrKiBibG9jaywgZmxvYXQmIGxpbmVMb2dpY2FsTGVmdCwg
ZmxvYXQmIGxpbmVMb2dpY2FsUmlnaHQsIGZsb2F0JiBhdmFpbGFibGVMb2dpY2FsV2lkdGgsIGJv
b2wgZmlyc3RMaW5lLCBJbmRlbnRUZXh0T3JOb3Qgc2hvdWxkSW5kZW50VGV4dCwgTGF5b3V0VW5p
dCBib3hMb2dpY2FsSGVpZ2h0KQorc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbElubGluZVBvc2l0
aW9ucyhSZW5kZXJCbG9ja0Zsb3cqIGJsb2NrLCBmbG9hdCYgbGluZUxvZ2ljYWxMZWZ0LCBmbG9h
dCYgbGluZUxvZ2ljYWxSaWdodCwgZmxvYXQmIGF2YWlsYWJsZUxvZ2ljYWxXaWR0aCwgYm9vbCBm
aXJzdExpbmUsIEluZGVudFRleHRPck5vdCBzaG91bGRJbmRlbnRUZXh0LCBMYXlvdXRVbml0IGJv
eExvZ2ljYWxIZWlnaHQpCiB7CiAgICAgTGF5b3V0VW5pdCBsaW5lTG9naWNhbEhlaWdodCA9IGJs
b2NrLT5taW5MaW5lSGVpZ2h0Rm9yUmVwbGFjZWRSZW5kZXJlcihmaXJzdExpbmUsIGJveExvZ2lj
YWxIZWlnaHQpOwogICAgIGxpbmVMb2dpY2FsTGVmdCA9IGJsb2NrLT5waXhlbFNuYXBwZWRMb2dp
Y2FsTGVmdE9mZnNldEZvckxpbmUoYmxvY2stPmxvZ2ljYWxIZWlnaHQoKSwgc2hvdWxkSW5kZW50
VGV4dCA9PSBJbmRlbnRUZXh0LCBsaW5lTG9naWNhbEhlaWdodCk7CkBAIC04MTYsNyArODE3LDcg
QEAgc3RhdGljIHZvaWQgdXBkYXRlTG9naWNhbElubGluZVBvc2l0aW9ucyhSZW5kZXJCbG9jayog
YmxvY2ssIGZsb2F0JiBsaW5lTG9naWNhbEwKICAgICBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBs
aW5lTG9naWNhbFJpZ2h0IC0gbGluZUxvZ2ljYWxMZWZ0OwogfQogCi12b2lkIFJlbmRlckJsb2Nr
Ojpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiBs
aW5lQm94LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRp
UnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsCit2b2lkIFJlbmRlckJsb2Nr
Rmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJv
eCogbGluZUJveCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvLCBCaWRpUnVuKiBmaXJzdFJ1biwg
QmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGhPdmVyZmxv
d0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2Fj
aGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVt
ZW50cykKIHsKICAgICBFVGV4dEFsaWduIHRleHRBbGlnbiA9IHRleHRBbGlnbm1lbnRGb3JMaW5l
KCFyZWFjaGVkRW5kICYmICFsaW5lQm94LT5lbmRzV2l0aEJyZWFrKCkpOwpAQCAtODc3LDcgKzg3
OCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlvbnNG
b3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsCiAgICAgbGluZUJveC0+cGxhY2VCb3hlc0lu
SW5saW5lRGlyZWN0aW9uKGxpbmVMb2dpY2FsTGVmdCwgbmVlZHNXb3JkU3BhY2luZywgdGV4dEJv
eERhdGFNYXApOwogfQogCi1CaWRpUnVuKiBSZW5kZXJCbG9jazo6Y29tcHV0ZUlubGluZURpcmVj
dGlvblBvc2l0aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGlu
ZUluZm8mIGxpbmVJbmZvLCBFVGV4dEFsaWduIHRleHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0
LCAKK0JpZGlSdW4qIFJlbmRlckJsb2NrRmxvdzo6Y29tcHV0ZUlubGluZURpcmVjdGlvblBvc2l0
aW9uc0ZvclNlZ21lbnQoUm9vdElubGluZUJveCogbGluZUJveCwgY29uc3QgTGluZUluZm8mIGxp
bmVJbmZvLCBFVGV4dEFsaWduIHRleHRBbGlnbiwgZmxvYXQmIGxvZ2ljYWxMZWZ0LCAKICAgICBm
bG9hdCYgYXZhaWxhYmxlTG9naWNhbFdpZHRoLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biog
dHJhaWxpbmdTcGFjZVJ1biwgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRC
b3hEYXRhTWFwLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwK
ICAgICBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewpAQCAtOTQ4LDcgKzk0
OSw3IEBAIEJpZGlSdW4qIFJlbmRlckJsb2NrOjpjb21wdXRlSW5saW5lRGlyZWN0aW9uUG9zaXRp
b25zRm9yU2VnbWVudChSb290SW5saW5lQm94KiBsCiAgICAgcmV0dXJuIHI7CiB9CiAKLXZvaWQg
UmVuZGVyQmxvY2s6OmNvbXB1dGVCbG9ja0RpcmVjdGlvblBvc2l0aW9uc0ZvckxpbmUoUm9vdElu
bGluZUJveCogbGluZUJveCwgQmlkaVJ1biogZmlyc3RSdW4sIEdseXBoT3ZlcmZsb3dBbmRGYWxs
YmFja0ZvbnRzTWFwJiB0ZXh0Qm94RGF0YU1hcCwKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpjb21w
dXRlQmxvY2tEaXJlY3Rpb25Qb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gs
IEJpZGlSdW4qIGZpcnN0UnVuLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4
dEJveERhdGFNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hl
KQogewogICAgIHNldExvZ2ljYWxIZWlnaHQobGluZUJveC0+YWxpZ25Cb3hlc0luQmxvY2tEaXJl
Y3Rpb24obG9naWNhbEhlaWdodCgpLCB0ZXh0Qm94RGF0YU1hcCwgdmVydGljYWxQb3NpdGlvbkNh
Y2hlKSk7CkBAIC05OTAsNyArOTkxLDcgQEAgc3RhdGljIGlubGluZSBib29sIGlzQ29sbGFwc2li
bGVTcGFjZShVQ2hhciBjaGFyYWN0ZXIsIFJlbmRlclRleHQqIHJlbmRlcmVyKQogfQogCiAKLXN0
YXRpYyB2b2lkIHNldFN0YXRpY1Bvc2l0aW9ucyhSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlckJv
eCogY2hpbGQpCitzdGF0aWMgdm9pZCBzZXRTdGF0aWNQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93
KiBibG9jaywgUmVuZGVyQm94KiBjaGlsZCkKIHsKICAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVy
ZSBpcyBhY3R1YWxseSBub3QgcmVhbGx5IHJpZ2h0LiBJdCdzIGEgYmVzdC1ndWVzcyBhcHByb3hp
bWF0aW9uIHRoYXQKICAgICAvLyB3aWxsIHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKQEAgLTEw
MjEsNyArMTAyMiw3IEBAIHN0YXRpYyBpbmxpbmUgaW50IGZpbmRGaXJzdFRyYWlsaW5nU3BhY2Uo
UmVuZGVyVGV4dCogbGFzdFRleHQsIGNvbnN0IENoYXJhY3RlclR5CiAgICAgcmV0dXJuIGZpcnN0
U3BhY2U7CiB9CiAKLWlubGluZSBCaWRpUnVuKiBSZW5kZXJCbG9jazo6aGFuZGxlVHJhaWxpbmdT
cGFjZXMoQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBCaWRpQ29udGV4dCogY3VycmVu
dENvbnRleHQpCitpbmxpbmUgQmlkaVJ1biogUmVuZGVyQmxvY2tGbG93OjpoYW5kbGVUcmFpbGlu
Z1NwYWNlcyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIEJpZGlDb250ZXh0KiBjdXJy
ZW50Q29udGV4dCkKIHsKICAgICBpZiAoIWJpZGlSdW5zLnJ1bkNvdW50KCkKICAgICAgICAgfHwg
IWJpZGlSdW5zLmxvZ2ljYWxseUxhc3RSdW4oKS0+bV9vYmplY3QtPnN0eWxlKCktPmJyZWFrT25s
eUFmdGVyV2hpdGVTcGFjZSgpCkBAIC0xMDcyLDcgKzEwNzMsNyBAQCBpbmxpbmUgQmlkaVJ1biog
UmVuZGVyQmxvY2s6OmhhbmRsZVRyYWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBi
aWRpUnVucwogICAgIHJldHVybiB0cmFpbGluZ1NwYWNlUnVuOwogfQogCi12b2lkIFJlbmRlckJs
b2NrOjphcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRpbmdPYmplY3QqIGZsb2F0
aW5nT2JqZWN0KQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFwcGVuZEZsb2F0aW5nT2JqZWN0VG9M
YXN0TGluZShGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QpCiB7CiAgICAgQVNTRVJUKCFm
bG9hdGluZ09iamVjdC0+b3JpZ2luYXRpbmdMaW5lKCkpOwogICAgIGZsb2F0aW5nT2JqZWN0LT5z
ZXRPcmlnaW5hdGluZ0xpbmUobGFzdFJvb3RCb3goKSk7CkBAIC0xMTU1LDcgKzExNTYsNyBAQCBz
dGF0aWMgaW5saW5lIHZvaWQgY29uc3RydWN0QmlkaVJ1bnNGb3JTZWdtZW50KElubGluZUJpZGlS
ZXNvbHZlciYgdG9wUmVzb2x2ZXIsCiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29u
c3RydWN0QmlkaVJ1bnNGb3JMaW5lKGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaywgSW5saW5lQmlk
aVJlc29sdmVyJiB0b3BSZXNvbHZlciwgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBj
b25zdCBJbmxpbmVJdGVyYXRvciYgZW5kT2ZMaW5lLCBWaXN1YWxEaXJlY3Rpb25PdmVycmlkZSBv
dmVycmlkZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpCitzdGF0aWMgaW5saW5lIHZv
aWQgY29uc3RydWN0QmlkaVJ1bnNGb3JMaW5lKGNvbnN0IFJlbmRlckJsb2NrRmxvdyogYmxvY2ss
IElubGluZUJpZGlSZXNvbHZlciYgdG9wUmVzb2x2ZXIsIEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBi
aWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZE9mTGluZSwgVmlzdWFsRGlyZWN0aW9u
T3ZlcnJpZGUgb3ZlcnJpZGUsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQogewogI2lm
ICFFTkFCTEUoQ1NTX1NIQVBFUykKICAgICBVTlVTRURfUEFSQU0oYmxvY2spOwpAQCAtMTE5Miw3
ICsxMTkzLDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlSdW5zRm9yTGluZShj
b25zdCBSZW5kZXJCbG9jayogYmxvY2ssIElubGluZUJpZGkKIH0KIAogLy8gVGhpcyBmdW5jdGlv
biBjb25zdHJ1Y3RzIGxpbmUgYm94ZXMgZm9yIGFsbCBvZiB0aGUgdGV4dCBydW5zIGluIHRoZSBy
ZXNvbHZlciBhbmQgY29tcHV0ZXMgdGhlaXIgcG9zaXRpb24uCi1Sb290SW5saW5lQm94KiBSZW5k
ZXJCbG9jazo6Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKEJpZGlSdW5MaXN0PEJpZGlSdW4+
JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8mIGxpbmVJbmZv
LCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgQmlkaVJ1biog
dHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK1Jv
b3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5z
KEJpZGlSdW5MaXN0PEJpZGlSdW4+JiBiaWRpUnVucywgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVu
ZCwgTGluZUluZm8mIGxpbmVJbmZvLCBWZXJ0aWNhbFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9z
aXRpb25DYWNoZSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cykKIHsKICAgICBpZiAoIWJpZGlSdW5zLnJ1bkNvdW50KCkpCiAgICAg
ICAgIHJldHVybiAwOwpAQCAtMTI1Nyw3ICsxMjU4LDcgQEAgc3RhdGljIHZvaWQgZGVsZXRlTGlu
ZVJhbmdlKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIFJlbmRlckFyZW5hJiBhcmVuYSwg
Um8KICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHMoTGlu
ZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgYm9vbCBoYXNJbmxpbmVDaGlsZCkKK3ZvaWQgUmVu
ZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0
U3RhdGUsIGJvb2wgaGFzSW5saW5lQ2hpbGQpCiB7CiAgICAgLy8gV2Ugd2FudCB0byBza2lwIGFo
ZWFkIHRvIHRoZSBmaXJzdCBkaXJ0eSBsaW5lCiAgICAgSW5saW5lQmlkaVJlc29sdmVyIHJlc29s
dmVyOwpAQCAtMTMzMSw3ICsxMzMyLDcgQEAgUmVuZGVyVGV4dEluZm86On5SZW5kZXJUZXh0SW5m
bygpCiB9CiAKIC8vIEJlZm9yZSByZXN0YXJ0aW5nIHRoZSBsYXlvdXQgbG9vcCB3aXRoIGEgbmV3
IGxvZ2ljYWxIZWlnaHQsIHJlbW92ZSBhbGwgZmxvYXRzIHRoYXQgd2VyZSBhZGRlZCBhbmQgcmVz
ZXQgdGhlIHJlc29sdmVyLgotaW5saW5lIGNvbnN0IElubGluZUl0ZXJhdG9yJiBSZW5kZXJCbG9j
azo6cmVzdGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNh
bEhlaWdodCwgTGF5b3V0VW5pdCBuZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxh
c3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsICBj
b25zdCBJbmxpbmVJdGVyYXRvciYgb2xkRW5kKQoraW5saW5lIGNvbnN0IElubGluZUl0ZXJhdG9y
JiBSZW5kZXJCbG9ja0Zsb3c6OnJlc3RhcnRMYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMYXlv
dXRVbml0IG9sZExvZ2ljYWxIZWlnaHQsIExheW91dFVuaXQgbmV3TG9naWNhbEhlaWdodCwgIEZs
b2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHJlc29sdmVyLCAgY29uc3QgSW5saW5lSXRlcmF0b3ImIG9sZEVuZCkKIHsKICAgICByZW1v
dmVGbG9hdGluZ09iamVjdHNCZWxvdyhsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBvbGRMb2dp
Y2FsSGVpZ2h0KTsKICAgICBzZXRMb2dpY2FsSGVpZ2h0KG5ld0xvZ2ljYWxIZWlnaHQpOwpAQCAt
MTM2Miw3ICsxMzYzLDcgQEAgc3RhdGljIGlubGluZSBMYXlvdXRVbml0IGFkanVzdExvZ2ljYWxM
aW5lVG9wKFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJbnNpZGVJbmZvLAogICAgIHJldHVybiBzaGFw
ZUluc2lkZUluZm8tPnNoYXBlTG9naWNhbEJvdHRvbSgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZv
aWQgcHVzaFNoYXBlQ29udGVudE92ZXJmbG93QmVsb3dUaGVDb250ZW50Qm94KFJlbmRlckJsb2Nr
KiBibG9jaywgU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluc2lkZUluZm8sIExheW91dFVuaXQgbGlu
ZVRvcCwgTGF5b3V0VW5pdCBsaW5lSGVpZ2h0KQorc3RhdGljIGlubGluZSB2b2lkIHB1c2hTaGFw
ZUNvbnRlbnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJveChSZW5kZXJCbG9ja0Zsb3cqIGJsb2Nr
LCBTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbywgTGF5b3V0VW5pdCBsaW5lVG9wLCBM
YXlvdXRVbml0IGxpbmVIZWlnaHQpCiB7CiAgICAgQVNTRVJUKHNoYXBlSW5zaWRlSW5mbyk7CiAK
QEAgLTEzODMsNyArMTM4NCw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXNoU2hhcGVDb250ZW50
T3ZlcmZsb3dCZWxvd1RoZUNvbnRlbnRCb3goUmVuZGVyQmxvY2sqIGJsb2NrCiAgICAgYmxvY2st
PnNldExvZ2ljYWxIZWlnaHQobmV3TG9naWNhbEhlaWdodCk7CiB9CiAKLXZvaWQgUmVuZGVyQmxv
Y2s6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZShTaGFwZUluc2lkZUluZm8q
JiBzaGFwZUluc2lkZUluZm8sIGNvbnN0IExheW91dFNpemUmIGxvZ2ljYWxPZmZzZXRGcm9tU2hh
cGVDb250YWluZXIsIExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6dXBkYXRlU2hhcGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lKFNoYXBlSW5zaWRl
SW5mbyomIHNoYXBlSW5zaWRlSW5mbywgY29uc3QgTGF5b3V0U2l6ZSYgbG9naWNhbE9mZnNldEZy
b21TaGFwZUNvbnRhaW5lciwgTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKIHsKICAgICBp
ZiAobGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKQogICAgICAgICByZXR1cm4gdXBkYXRlU2hhcGVB
bmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lSW5GbG93VGhyZWFkKHNoYXBlSW5zaWRlSW5mbywgbGF5
b3V0U3RhdGUpOwpAQCAtMTQwMSw3ICsxNDAyLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRl
U2hhcGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lKFNoYXBlSW5zaWRlSW5mbyomIHNoYXBlSW4K
ICAgICBwdXNoU2hhcGVDb250ZW50T3ZlcmZsb3dCZWxvd1RoZUNvbnRlbnRCb3godGhpcywgc2hh
cGVJbnNpZGVJbmZvLCBsaW5lVG9wLCBsaW5lSGVpZ2h0KTsKIH0KIAotdm9pZCBSZW5kZXJCbG9j
azo6dXBkYXRlU2hhcGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lSW5GbG93VGhyZWFkKFNoYXBl
SW5zaWRlSW5mbyomIHNoYXBlSW5zaWRlSW5mbywgTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSkKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVu
dExpbmVJbkZsb3dUaHJlYWQoU2hhcGVJbnNpZGVJbmZvKiYgc2hhcGVJbnNpZGVJbmZvLCBMaW5l
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQogewogICAgIEFTU0VSVChsYXlvdXRTdGF0ZS5mbG93
VGhyZWFkKCkpOwogCkBAIC0xNDc1LDcgKzE0NzYsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjp1cGRh
dGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmVJbkZsb3dUaHJlYWQoU2hhcGVJbnNpZGVJ
bgogICAgICAgICBwdXNoU2hhcGVDb250ZW50T3ZlcmZsb3dCZWxvd1RoZUNvbnRlbnRCb3godGhp
cywgc2hhcGVJbnNpZGVJbmZvLCBsaW5lVG9wLCBsaW5lSGVpZ2h0KTsKIH0KIAotYm9vbCBSZW5k
ZXJCbG9jazo6YWRqdXN0TG9naWNhbExpbmVUb3BBbmRMb2dpY2FsSGVpZ2h0SWZOZWVkZWQoU2hh
cGVJbnNpZGVJbmZvKiBzaGFwZUluc2lkZUluZm8sIExheW91dFVuaXQgYWJzb2x1dGVMb2dpY2Fs
VG9wLCBMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJl
c29sdmVyLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgSW5saW5l
SXRlcmF0b3ImIGVuZCwgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK2Jvb2wg
UmVuZGVyQmxvY2tGbG93OjphZGp1c3RMb2dpY2FsTGluZVRvcEFuZExvZ2ljYWxIZWlnaHRJZk5l
ZWRlZChTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbywgTGF5b3V0VW5pdCBhYnNvbHV0
ZUxvZ2ljYWxUb3AsIExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNv
bHZlciYgcmVzb2x2ZXIsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
LCBJbmxpbmVJdGVyYXRvciYgZW5kLCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRz
KQogewogICAgIExheW91dFVuaXQgYWRqdXN0ZWRMb2dpY2FsTGluZVRvcCA9IGFkanVzdExvZ2lj
YWxMaW5lVG9wKHNoYXBlSW5zaWRlSW5mbywgcmVzb2x2ZXIucG9zaXRpb24oKSwgZW5kLCB3b3Jk
TWVhc3VyZW1lbnRzKTsKIApAQCAtMTUwMSw3ICsxNTAyLDcgQEAgYm9vbCBSZW5kZXJCbG9jazo6
YWRqdXN0TG9naWNhbExpbmVUb3BBbmRMb2dpY2FsSGVpZ2h0SWZOZWVkZWQoU2hhcGVJbnNpZGVJ
bmZvKgogfQogI2VuZGlmCiAKLXZvaWQgUmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJ
blJhbmdlKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBjbGVhbkxpbmVTdGFydCwgY29uc3QgQmlk
aVN0YXR1cyYgY2xlYW5MaW5lQmlkaVN0YXR1cywgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMpCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFu
Z2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNv
bHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNsZWFuTGluZVN0YXJ0LCBjb25zdCBCaWRpU3Rh
dHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRM
aW5lcykKIHsKICAgICBSZW5kZXJTdHlsZSogc3R5bGVUb1VzZSA9IHN0eWxlKCk7CiAgICAgYm9v
bCBwYWdpbmF0ZWQgPSB2aWV3KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkubGF5b3V0U3RhdGUo
KS0+aXNQYWdpbmF0ZWQoKTsKQEAgLTE2MTYsOCArMTYxNyw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUs
IElubGluCiAKICAgICAgICAgICAgICAgICBpZiAocGFnaW5hdGVkKSB7CiAgICAgICAgICAgICAg
ICAgICAgIExheW91dFVuaXQgYWRqdXN0bWVudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IEZJWE1FLUJMT0NLRkxPVzogUmVtb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIG9uY2UgdGhlIG93
bmluZyBmdW5jdGlvbiBtb3Zlcy4KLSAgICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCbG9ja0Zs
b3codGhpcyktPmFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgYWRqdXN0
bWVudCwgbGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRq
dXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihsaW5lQm94LCBhZGp1c3RtZW50LCBsYXlvdXRT
dGF0ZS5mbG93VGhyZWFkKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0bWVudCkg
ewogICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMaW5lV2lkdGggPSBhdmFp
bGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKG9sZExvZ2ljYWxIZWlnaHQsIGxheW91dFN0YXRlLmxp
bmVJbmZvKCkuaXNGaXJzdExpbmUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQm94
LT5hZGp1c3RCbG9ja0RpcmVjdGlvblBvc2l0aW9uKGFkanVzdG1lbnQpOwpAQCAtMTYzNSw4ICsx
NjM1LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGlu
ZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW4KICAgICAgICAgICAgICAgICAgICAgfQog
CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFJlbW92ZSB0aGlzIHR5cGUg
Y29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92ZXMuCi0gICAgICAgICAgICAg
ICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+dXBkYXRlUmVnaW9uRm9yTGluZShs
aW5lQm94KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlZ2lvbkZvckxpbmUobGlu
ZUJveCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0x
Njc4LDggKzE2NzcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5S
YW5nZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbgogICAgIC8vIEluIGNhc2Ug
d2UgYWxyZWFkeSBhZGp1c3RlZCB0aGUgbGluZSBwb3NpdGlvbnMgZHVyaW5nIHRoaXMgbGF5b3V0
IHRvIGF2b2lkIHdpZG93cwogICAgIC8vIHRoZW4gd2UgbmVlZCB0byBpZ25vcmUgdGhlIHBvc3Np
YmlsaXR5IG9mIGhhdmluZyBhIG5ldyB3aWRvd3Mgc2l0dWF0aW9uLgogICAgIC8vIE90aGVyd2lz
ZSwgd2UgcmlzayBsZWF2aW5nIGVtcHR5IGNvbnRhaW5lcnMgd2hpY2ggaXMgYWdhaW5zdCB0aGUg
YmxvY2sgZnJhZ21lbnRhdGlvbiBwcmluY2lwbGVzLgotICAgIC8vIEZJWE1FLUJMT0NLRkxPVzog
UmVtb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIG9uY2UgdGhlIG93bmluZyBmdW5jdGlvbiBtb3Zl
cy4KLSAgICBpZiAocGFnaW5hdGVkICYmICFzdHlsZSgpLT5oYXNBdXRvV2lkb3dzKCkgJiYgIXRv
UmVuZGVyQmxvY2tGbG93KHRoaXMpLT5kaWRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygpKSB7Cisg
ICAgaWYgKHBhZ2luYXRlZCAmJiAhc3R5bGUoKS0+aGFzQXV0b1dpZG93cygpICYmICFkaWRCcmVh
a0F0TGluZVRvQXZvaWRXaWRvdygpKSB7CiAgICAgICAgIC8vIENoZWNrIHRoZSBsaW5lIGJveGVz
IHRvIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIHVuYWNjZXB0YWJsZSB3aWRvd3MuCiAgICAg
ICAgIC8vIEhvd2V2ZXIsIHdlJ2xsIHByaW9yaXRpemUgb3JwaGFucyAtIHNvIG5vdGhpbmcgd2Ug
ZG8gaGVyZSBzaG91bGQgY3JlYXRlCiAgICAgICAgIC8vIGEgbmV3IG9ycGhhbi4KQEAgLTE3MzEs
MTcgKzE3MjksMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFu
Z2UoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgSW5saW4KICAgICAgICAgICAgICAgICBs
aW5lQm94ID0gbGluZUJveC0+cHJldlJvb3RCb3goKTsKIAogICAgICAgICAgICAgLy8gV2Ugbm93
IHdhbnQgdG8gYnJlYWsgYXQgdGhpcyBsaW5lLiBSZW1lbWJlciBmb3IgbmV4dCBsYXlvdXQgYW5k
IHRyaWdnZXIgcmVsYXlvdXQuCi0gICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFJlbW92
ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92ZXMuCi0g
ICAgICAgICAgICB0b1JlbmRlckJsb2NrRmxvdyh0aGlzKS0+c2V0QnJlYWtBdExpbmVUb0F2b2lk
V2lkb3cobGluZUNvdW50KGxpbmVCb3gpKTsKKyAgICAgICAgICAgIHNldEJyZWFrQXRMaW5lVG9B
dm9pZFdpZG93KGxpbmVDb3VudChsaW5lQm94KSk7CiAgICAgICAgICAgICBtYXJrTGluZXNEaXJ0
eUluQmxvY2tSYW5nZShsYXN0Um9vdEJveCgpLT5saW5lQm90dG9tV2l0aExlYWRpbmcoKSwgbGlu
ZUJveC0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCksIGxpbmVCb3gpOwogICAgICAgICB9CiAgICAg
fQogCi0gICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBSZW1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24g
b25jZSB0aGUgb3duaW5nIGZ1bmN0aW9uIG1vdmVzLgotICAgIHRvUmVuZGVyQmxvY2tGbG93KHRo
aXMpLT5jbGVhckRpZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93KCk7CisgICAgY2xlYXJEaWRCcmVh
a0F0TGluZVRvQXZvaWRXaWRvdygpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpsaW5rVG9FbmRM
aW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKK3ZvaWQgUmVuZGVyQmxv
Y2tGbG93OjpsaW5rVG9FbmRMaW5lSWZOZWVkZWQoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSkKIHsKICAgICBpZiAobGF5b3V0U3RhdGUuZW5kTGluZSgpKSB7CiAgICAgICAgIGlmIChsYXlv
dXRTdGF0ZS5lbmRMaW5lTWF0Y2hlZCgpKSB7CkBAIC0xNzUyLDE2ICsxNzQ4LDE0IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OmxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0U3RhdGUmIGxheW91
dFN0YXRlKQogICAgICAgICAgICAgICAgIGxpbmUtPmF0dGFjaExpbmUoKTsKICAgICAgICAgICAg
ICAgICBpZiAocGFnaW5hdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRhIC09IGxpbmUt
PnBhZ2luYXRpb25TdHJ1dCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZM
T1c6IFJlbW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24g
bW92ZXMuCi0gICAgICAgICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2tGbG93KHRoaXMpLT5hZGp1
c3RMaW5lUG9zaXRpb25Gb3JQYWdpbmF0aW9uKGxpbmUsIGRlbHRhLCBsYXlvdXRTdGF0ZS5mbG93
VGhyZWFkKCkpOworICAgICAgICAgICAgICAgICAgICBhZGp1c3RMaW5lUG9zaXRpb25Gb3JQYWdp
bmF0aW9uKGxpbmUsIGRlbHRhLCBsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpOwogICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZGVsdGEpIHsKICAgICAgICAgICAgICAgICAg
ICAgbGF5b3V0U3RhdGUudXBkYXRlUmVwYWludFJhbmdlRnJvbUJveChsaW5lLCBkZWx0YSk7CiAg
ICAgICAgICAgICAgICAgICAgIGxpbmUtPmFkanVzdEJsb2NrRGlyZWN0aW9uUG9zaXRpb24oZGVs
dGEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUu
Zmxvd1RocmVhZCgpKQotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFJl
bW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92ZXMu
Ci0gICAgICAgICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2tGbG93KHRoaXMpLT51cGRhdGVSZWdp
b25Gb3JMaW5lKGxpbmUpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZWdpb25Gb3JMaW5l
KGxpbmUpOwogICAgICAgICAgICAgICAgIGlmIChWZWN0b3I8UmVuZGVyQm94Kj4qIGNsZWFuTGlu
ZUZsb2F0cyA9IGxpbmUtPmZsb2F0c1B0cigpKSB7CiAgICAgICAgICAgICAgICAgICAgIFZlY3Rv
cjxSZW5kZXJCb3gqPjo6aXRlcmF0b3IgZW5kID0gY2xlYW5MaW5lRmxvYXRzLT5lbmQoKTsKICAg
ICAgICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGYgPSBj
bGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IGYgIT0gZW5kOyArK2YpIHsKQEAgLTE4MDAsOCArMTc5
NCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxpbmtUb0VuZExpbmVJZk5lZWRlZChMaW5lTGF5b3V0
U3RhdGUmIGxheW91dFN0YXRlKQogICAgICAgICAgICAgTGF5b3V0UmVjdCBsb2dpY2FsVmlzdWFs
T3ZlcmZsb3coMCwgYmxvY2tMb2dpY2FsSGVpZ2h0LCAxLCBib3R0b21WaXN1YWxPdmVyZmxvdyAt
IGJsb2NrTG9naWNhbEhlaWdodCk7CiAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gt
PnNldE92ZXJmbG93RnJvbUxvZ2ljYWxSZWN0cyhsb2dpY2FsTGF5b3V0T3ZlcmZsb3csIGxvZ2lj
YWxWaXN1YWxPdmVyZmxvdywgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5saW5lVG9wKCksIHRyYWls
aW5nRmxvYXRzTGluZUJveC0+bGluZUJvdHRvbSgpKTsKICAgICAgICAgICAgIGlmIChsYXlvdXRT
dGF0ZS5mbG93VGhyZWFkKCkpCi0gICAgICAgICAgICAgICAgLy8gRklYTUUtQkxPQ0tGTE9XOiBS
ZW1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gb25jZSB0aGUgb3duaW5nIGZ1bmN0aW9uIG1vdmVz
LgotICAgICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2tGbG93KHRoaXMpLT51cGRhdGVSZWdpb25G
b3JMaW5lKHRyYWlsaW5nRmxvYXRzTGluZUJveCk7CisgICAgICAgICAgICAgICAgdXBkYXRlUmVn
aW9uRm9yTGluZSh0cmFpbGluZ0Zsb2F0c0xpbmVCb3gpOwogICAgICAgICB9CiAKICAgICAgICAg
Y29uc3QgRmxvYXRpbmdPYmplY3RTZXQmIGZsb2F0aW5nT2JqZWN0U2V0ID0gbV9mbG9hdGluZ09i
amVjdHMtPnNldCgpOwpAQCAtMTgxOSw3ICsxODEyLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGlu
a1RvRW5kTGluZUlmTmVlZGVkKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCiAgICAgfQog
fQogCi12b2lkIFJlbmRlckJsb2NrOjpyZXBhaW50RGlydHlGbG9hdHMoVmVjdG9yPEZsb2F0V2l0
aFJlY3Q+JiBmbG9hdHMpCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6cmVwYWludERpcnR5RmxvYXRz
KFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzKQogewogICAgIHNpemVfdCBmbG9hdENvdW50
ID0gZmxvYXRzLnNpemUoKTsKICAgICAvLyBGbG9hdHMgdGhhdCBkaWQgbm90IGhhdmUgbGF5b3V0
IGRpZCBub3QgcmVwYWludCB3aGVuIHdlIGxhaWQgdGhlbSBvdXQuIFRoZXkgd291bGQgaGF2ZQpA
QCAtMTkzOSw3ICsxOTMyLDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dElubGluZUNo
aWxkcmVuKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmUKICAgICAgICAgY2hl
Y2tMaW5lc0ZvclRleHRPdmVyZmxvdygpOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjpjaGVja0Zs
b2F0c0luQ2xlYW5MaW5lKFJvb3RJbmxpbmVCb3gqIGxpbmUsIFZlY3RvcjxGbG9hdFdpdGhSZWN0
PiYgZmxvYXRzLCBzaXplX3QmIGZsb2F0SW5kZXgsIGJvb2wmIGVuY291bnRlcmVkTmV3RmxvYXQs
IGJvb2wmIGRpcnRpZWRCeUZsb2F0KQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNoZWNrRmxvYXRz
SW5DbGVhbkxpbmUoUm9vdElubGluZUJveCogbGluZSwgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiBm
bG9hdHMsIHNpemVfdCYgZmxvYXRJbmRleCwgYm9vbCYgZW5jb3VudGVyZWROZXdGbG9hdCwgYm9v
bCYgZGlydGllZEJ5RmxvYXQpCiB7CiAgICAgVmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVG
bG9hdHMgPSBsaW5lLT5mbG9hdHNQdHIoKTsKICAgICBpZiAoIWNsZWFuTGluZUZsb2F0cykKQEAg
LTE5NzAsNyArMTk2Myw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNoZWNrRmxvYXRzSW5DbGVhbkxp
bmUoUm9vdElubGluZUJveCogbGluZSwgVmVjdG9yPEZsb2F0V2l0aFJlCiAgICAgfQogfQogCi1S
b290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5
b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQorUm9v
dElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpkZXRlcm1pbmVTdGFydFBvc2l0aW9uKExpbmVM
YXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCiB7
CiAgICAgUm9vdElubGluZUJveCogY3VyciA9IDA7CiAgICAgUm9vdElubGluZUJveCogbGFzdCA9
IDA7CkBAIC0xOTg5LDggKzE5ODIsNyBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0
ZXJtaW5lU3RhcnRQb3NpdGlvbihMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLAogICAgICAg
ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAg
cGFnaW5hdGlvbkRlbHRhIC09IGN1cnItPnBhZ2luYXRpb25TdHJ1dCgpOwotICAgICAgICAgICAg
ICAgIC8vIEZJWE1FLUJMT0NLRkxPVzogUmVtb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIG9uY2Ug
dGhlIG93bmluZyBmdW5jdGlvbiBtb3Zlcy4KLSAgICAgICAgICAgICAgICB0b1JlbmRlckJsb2Nr
Rmxvdyh0aGlzKS0+YWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihjdXJyLCBwYWdpbmF0
aW9uRGVsdGEsIGxheW91dFN0YXRlLmZsb3dUaHJlYWQoKSk7CisgICAgICAgICAgICAgICAgYWRq
dXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihjdXJyLCBwYWdpbmF0aW9uRGVsdGEsIGxheW91
dFN0YXRlLmZsb3dUaHJlYWQoKSk7CiAgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRpb25EZWx0
YSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNGbG9hdHMoKSB8fCAhbGF5b3V0
U3RhdGUuZmxvYXRzKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBG
SVhNRTogRG8gYmV0dGVyIGV2ZW50dWFsbHkuICBGb3Igbm93IGlmIHdlIGV2ZXIgc2hpZnQgYmVj
YXVzZSBvZiBwYWdpbmF0aW9uIGFuZCBmbG9hdHMgYXJlIHByZXNlbnQganVzdCBnbyB0byBhIGZ1
bGwgbGF5b3V0LgpAQCAtMjAwMiw4ICsxOTk0LDcgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxv
Y2s6OmRldGVybWluZVN0YXJ0UG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwK
ICAgICAgICAgICAgICAgICAgICAgY3Vyci0+YWRqdXN0QmxvY2tEaXJlY3Rpb25Qb3NpdGlvbihw
YWdpbmF0aW9uRGVsdGEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAo
bGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKQotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRS1C
TE9DS0ZMT1c6IFJlbW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBvbmNlIHRoZSBvd25pbmcgZnVu
Y3Rpb24gbW92ZXMuCi0gICAgICAgICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2tGbG93KHRoaXMp
LT51cGRhdGVSZWdpb25Gb3JMaW5lKGN1cnIpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVS
ZWdpb25Gb3JMaW5lKGN1cnIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBh
IG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBiZWZvcmUgdGhpcyBsaW5lIG9yIGJlZm9yZSBp
dHMgbGFzdCBrbm93biBmbG9hdCwganVzdCBkbyBhIGZ1bGwgbGF5b3V0LgpAQCAtMjA4OSw3ICsy
MDgwLDcgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmRldGVybWluZVN0YXJ0UG9zaXRp
b24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwKICAgICByZXR1cm4gY3VycjsKIH0KIAot
dm9pZCBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xl
YW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpCit2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRT
dGF0ZSwgUm9vdElubGluZUJveCogc3RhcnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5l
U3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGluZUJpZGlTdGF0dXMpCiB7CiAgICAgQVNTRVJUKCFs
YXlvdXRTdGF0ZS5lbmRMaW5lKCkpOwogICAgIHNpemVfdCBmbG9hdEluZGV4ID0gbGF5b3V0U3Rh
dGUuZmxvYXRJbmRleCgpOwpAQCAtMjEyNiw3ICsyMTE3LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6
ZGV0ZXJtaW5lRW5kUG9zaXRpb24oTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgUm9vdElu
bGluZUIKICAgICBsYXlvdXRTdGF0ZS5zZXRFbmRMaW5lKGxhc3QpOwogfQogCi1ib29sIFJlbmRl
ckJsb2NrOjpjaGVja1BhZ2luYXRpb25BbmRGbG9hdHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRl
JiBsYXlvdXRTdGF0ZSkKK2Jvb2wgUmVuZGVyQmxvY2tGbG93OjpjaGVja1BhZ2luYXRpb25BbmRG
bG9hdHNBdEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKIHsKICAgICBMYXlv
dXRVbml0IGxpbmVEZWx0YSA9IGxvZ2ljYWxIZWlnaHQoKSAtIGxheW91dFN0YXRlLmVuZExpbmVM
b2dpY2FsVG9wKCk7CiAKQEAgLTIxNDAsOCArMjEzMSw3IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmNo
ZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0
YXRlCiAgICAgICAgICAgICAgICAgLy8gc3RydXQgeWV0LgogICAgICAgICAgICAgICAgIExheW91
dFVuaXQgb2xkUGFnaW5hdGlvblN0cnV0ID0gbGluZUJveC0+cGFnaW5hdGlvblN0cnV0KCk7CiAg
ICAgICAgICAgICAgICAgbGluZURlbHRhIC09IG9sZFBhZ2luYXRpb25TdHJ1dDsKLSAgICAgICAg
ICAgICAgICAvLyBGSVhNRS1CTE9DS0ZMT1c6IFJlbW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiBv
bmNlIHRoZSBvd25pbmcgZnVuY3Rpb24gbW92ZXMuCi0gICAgICAgICAgICAgICAgdG9SZW5kZXJC
bG9ja0Zsb3codGhpcyktPmFkanVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwg
bGluZURlbHRhLCBsYXlvdXRTdGF0ZS5mbG93VGhyZWFkKCkpOworICAgICAgICAgICAgICAgIGFk
anVzdExpbmVQb3NpdGlvbkZvclBhZ2luYXRpb24obGluZUJveCwgbGluZURlbHRhLCBsYXlvdXRT
dGF0ZS5mbG93VGhyZWFkKCkpOwogICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldFBhZ2luYXRp
b25TdHJ1dChvbGRQYWdpbmF0aW9uU3RydXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAg
aWYgKGxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKGxpbmVCb3gsIGxpbmVEZWx0YSwg
bGF5b3V0U3RhdGUuZmxvd1RocmVhZCgpKSkKQEAgLTIxNzIsNyArMjE2Miw3IEBAIGJvb2wgUmVu
ZGVyQmxvY2s6OmNoZWNrUGFnaW5hdGlvbkFuZEZsb2F0c0F0RW5kTGluZShMaW5lTGF5b3V0U3Rh
dGUmIGxheW91dFN0YXRlCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2s6
Om1hdGNoZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGNvbnN0IElubGlu
ZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5lU3Rh
cnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVuZExpbmVTdGF0dXMpCitib29sIFJlbmRlckJsb2NrRmxv
dzo6bWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgY29uc3QgSW5s
aW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZExpbmVT
dGFydCwgY29uc3QgQmlkaVN0YXR1cyYgZW5kTGluZVN0YXR1cykKIHsKICAgICBpZiAocmVzb2x2
ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5lU3RhcnQpIHsKICAgICAgICAgaWYgKHJlc29sdmVyLnN0
YXR1cygpICE9IGVuZExpbmVTdGF0dXMpCkBAIC0yMzU0LDcgKzIzNDQsNyBAQCB2b2lkIExpbmVC
cmVha2VyOjpza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZl
ciwgTGluZUluZm8mCiAKIC8vIFRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCBmb3IgbGlzdCBt
YXJrZXJzIGFuZCBpbmxpbmUgZmxvd3MgdGhhdCBoYXZlIGxpbmUgYm94ZXMuIE5laXRoZXIgc2hv
dWxkCiAvLyBoYXZlIGFuIGVmZmVjdCBvbiB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiB0aGUg
bGluZS4KLXN0YXRpYyBib29sIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdChS
ZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlck9iamVjdCogbywgTGluZU1pZHBvaW50U3RhdGUmIGxp
bmVNaWRwb2ludFN0YXRlKQorc3RhdGljIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0
YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyogYmxvY2ssIFJlbmRlck9iamVjdCogbywgTGluZU1p
ZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQogewogICAgIFJlbmRlck9iamVjdCogbmV4
dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG8pOwogICAgIHdoaWxlIChu
ZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKQEAgLTI2NjMs
NyArMjY1Myw3IEBAIHN0YXRpYyBib29sIGNhbkJyZWFrQXRUaGlzUG9zaXRpb24oYm9vbCBhdXRv
V3JhcCwgTGluZVdpZHRoJiB3aWR0aCwgSW5saW5lSXRlcmF0CiB9CiAKICNpZiBFTkFCTEUoQ1NT
X1NIQVBFUykKLXN0YXRpYyB2b2lkIHVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVzKFJlbmRlckJsb2Nr
KiBibG9jaywgY29uc3QgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUs
IGNvbnN0IFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIExpbmVXaWR0aCYgd2lk
dGgsIGJvb2wgaXNGaXJzdExpbmUpCitzdGF0aWMgdm9pZCB1cGRhdGVTZWdtZW50c0ZvclNoYXBl
cyhSZW5kZXJCbG9ja0Zsb3cqIGJsb2NrLCBjb25zdCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSwgY29uc3QgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50
cywgTGluZVdpZHRoJiB3aWR0aCwgYm9vbCBpc0ZpcnN0TGluZSkKIHsKICAgICBBU1NFUlQobGFz
dEZsb2F0RnJvbVByZXZpb3VzTGluZSk7CiAKQEAgLTMzNjYsNyArMzM1Niw3IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCkKICAgICB9CiB9CiAKLXZv
aWQgUmVuZGVyQmxvY2s6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCkKK3ZvaWQgUmVuZGVyQmxv
Y2tGbG93OjpkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpCiB7CiAgICAgRVRleHRBbGlnbiB0ZXh0
QWxpZ24gPSBzdHlsZSgpLT50ZXh0QWxpZ24oKTsKICAgICBib29sIGx0ciA9IHN0eWxlKCktPmlz
TGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKQEAgLTMzOTAsNyArMzM4MCw3IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCkKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVy
QmxvY2s6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQordm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQogewogICAgIC8vIERldGVybWluZSB0aGUgd2lk
dGggb2YgdGhlIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCiAgICAgLy8gRklYTUU6
IENTUzMgc2F5cyB0aGlzIGlzIGNvbmZpZ3VyYWJsZSwgYWxzbyBuZWVkIHRvIHVzZSAweDAwMkUg
KEZVTEwgU1RPUCkgaWYgaG9yaXpvbnRhbCBlbGxpcHNpcyBpcyAibm90IHJlbmRlcmFibGUiCkBA
IC0zNDM3LDcgKzM0MjcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpjaGVja0xpbmVzRm9yVGV4dE92
ZXJmbG93KCkKICAgICB9CiB9CiAKLWJvb2wgUmVuZGVyQmxvY2s6OnBvc2l0aW9uTmV3RmxvYXRP
bkxpbmUoRmxvYXRpbmdPYmplY3QqIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSwgTGluZUluZm8mIGxpbmVJbmZvLCBMaW5lV2lkdGgmIHdpZHRoKQor
Ym9vbCBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUoRmxvYXRpbmdPYmpl
Y3QqIG5ld0Zsb2F0LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwg
TGluZUluZm8mIGxpbmVJbmZvLCBMaW5lV2lkdGgmIHdpZHRoKQogewogICAgIGlmICghcG9zaXRp
b25OZXdGbG9hdHMoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQm94LmNwcAppbmRleCA2NjgxZDM0NGQ3OTM0YzUzOTU3ODA4ZDkwZDI5YjJmN2Uy
ZDExNzllLi44NzQzZWY0OGIzOTJkNWMwYTcyNmViMzBjZjc5MTNjYzFjYzQ3MTkyIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcApAQCAtMjIzLDIyICsyMjMsMTcgQEAgdm9p
ZCBSZW5kZXJCb3g6OndpbGxCZURlc3Ryb3llZCgpCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6
OndpbGxCZURlc3Ryb3llZCgpOwogfQogCi1SZW5kZXJCbG9jayogUmVuZGVyQm94OjpvdXRlcm1v
c3RCbG9ja0NvbnRhaW5pbmdGbG9hdGluZ09iamVjdCgpCitSZW5kZXJCbG9ja0Zsb3cqIFJlbmRl
ckJveDo6b3V0ZXJtb3N0QmxvY2tDb250YWluaW5nRmxvYXRpbmdPYmplY3QoKQogewogICAgIEFT
U0VSVChpc0Zsb2F0aW5nKCkpOwotICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IDA7Cisg
ICAgUmVuZGVyQmxvY2tGbG93KiBwYXJlbnRCbG9jayA9IDA7CiAgICAgZm9yIChSZW5kZXJPYmpl
Y3QqIGN1cnIgPSBwYXJlbnQoKTsgY3VyciAmJiAhY3Vyci0+aXNSZW5kZXJWaWV3KCk7IGN1cnIg
PSBjdXJyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3Vyci0+aXNSZW5kZXJCbG9jaygpKSB7
Ci0gICAgICAgICAgICBSZW5kZXJCbG9jayogY3VyckJsb2NrID0gdG9SZW5kZXJCbG9jayhjdXJy
KTsKKyAgICAgICAgaWYgKGN1cnItPmlzUmVuZGVyQmxvY2tGbG93KCkpIHsKKyAgICAgICAgICAg
IFJlbmRlckJsb2NrRmxvdyogY3VyckJsb2NrID0gdG9SZW5kZXJCbG9ja0Zsb3coY3Vycik7CiAg
ICAgICAgICAgICBpZiAoIXBhcmVudEJsb2NrIHx8IGN1cnJCbG9jay0+Y29udGFpbnNGbG9hdCh0
aGlzKSkKICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jayA9IGN1cnJCbG9jazsKICAgICAgICAg
fQogICAgIH0KLSAgICBpZiAocGFyZW50QmxvY2spIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBw
YXJlbnQgPSBwYXJlbnRCbG9jay0+cGFyZW50KCk7Ci0gICAgICAgIGlmIChwYXJlbnQgJiYgcGFy
ZW50LT5pc0ZsZXhpYmxlQm94SW5jbHVkaW5nRGVwcmVjYXRlZCgpKQotICAgICAgICAgICAgcGFy
ZW50QmxvY2sgPSB0b1JlbmRlckJsb2NrKHBhcmVudCk7Ci0gICAgfQogICAgIHJldHVybiBwYXJl
bnRCbG9jazsKIH0KIApAQCAtMjUwLDcgKzI0NSw3IEBAIHZvaWQgUmVuZGVyQm94OjpyZW1vdmVG
bG9hdGluZ09yUG9zaXRpb25lZENoaWxkRnJvbUJsb2NrTGlzdHMoKQogICAgICAgICByZXR1cm47
CiAKICAgICBpZiAoaXNGbG9hdGluZygpKSB7Ci0gICAgICAgIGlmIChSZW5kZXJCbG9jayogcGFy
ZW50QmxvY2sgPSBvdXRlcm1vc3RCbG9ja0NvbnRhaW5pbmdGbG9hdGluZ09iamVjdCgpKSB7Cisg
ICAgICAgIGlmIChSZW5kZXJCbG9ja0Zsb3cqIHBhcmVudEJsb2NrID0gb3V0ZXJtb3N0QmxvY2tD
b250YWluaW5nRmxvYXRpbmdPYmplY3QoKSkgewogICAgICAgICAgICAgcGFyZW50QmxvY2stPm1h
cmtTaWJsaW5nc1dpdGhGbG9hdHNGb3JMYXlvdXQodGhpcyk7CiAgICAgICAgICAgICBwYXJlbnRC
bG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dCh0aGlzLCBmYWxzZSk7
CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
b3guaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guaAppbmRleCA5NjNkZDI1
OTZjN2MzMmIzOTdkZjIzZDAwNzI1Yzg0NmNhNTc3ODFkLi45ODI3MmRiNTNlMzE1NTVlN2Q4ZGNj
ZWY1MWMyOGI1ZWY3MjU3YzE1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQm94LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5oCkBA
IC0zMiw2ICszMiw3IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgUmVuZGVyQmxv
Y2tGbG93OwogY2xhc3MgUmVuZGVyQm94UmVnaW9uSW5mbzsKIGNsYXNzIFJlbmRlclJlZ2lvbjsK
IHN0cnVjdCBQYWludEluZm87CkBAIC01MDIsNyArNTAzLDcgQEAgcHVibGljOgogCiAgICAgdmly
dHVhbCBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25Gb3JQb2ludChjb25zdCBMYXlvdXRQb2ludCYp
IE9WRVJSSURFOwogCi0gICAgUmVuZGVyQmxvY2sqIG91dGVybW9zdEJsb2NrQ29udGFpbmluZ0Zs
b2F0aW5nT2JqZWN0KCk7CisgICAgUmVuZGVyQmxvY2tGbG93KiBvdXRlcm1vc3RCbG9ja0NvbnRh
aW5pbmdGbG9hdGluZ09iamVjdCgpOwogCiAgICAgdm9pZCByZW1vdmVGbG9hdGluZ09yUG9zaXRp
b25lZENoaWxkRnJvbUJsb2NrTGlzdHMoKTsKICAgICAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCmluZGV4IDg3ZjUwNDhiMmVhODcwZjQ0
M2JkYjA3ODBhNjg1YTNhNjU4YjdjNmMuLjM2MzdjOGFlMzRlYjc5MWJhZDNmNWEzMjE1NmIyOWVl
ZjY2MDdmNjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hN
b2RlbE9iamVjdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1v
ZGVsT2JqZWN0LmNwcApAQCAtMjgwMSw5ICsyODAxLDkgQEAgdm9pZCBSZW5kZXJCb3hNb2RlbE9i
amVjdDo6bW92ZUNoaWxkcmVuVG8oUmVuZGVyQm94TW9kZWxPYmplY3QqIHRvQm94TW9kZWxPYmpl
Y3QKICAgICAvLyBhbm9ueW1vdXMgYmxvY2tzIHdoaWNoIGNhbiBubyBsb25nZXIgY2FycnkgcG9z
aXRpb25lZCBvYmplY3RzIChzZWUgcjEyMDc2MSkKICAgICAvLyBvciB3aGVuIGZ1bGxSZW1vdmVJ
bnNlcnQgaXMgZmFsc2UuCiAgICAgaWYgKGZ1bGxSZW1vdmVJbnNlcnQgJiYgaXNSZW5kZXJCbG9j
aygpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHRvUmVuZGVyQmxvY2sodGhpcyk7
Ci0gICAgICAgIGJsb2NrLT5yZW1vdmVQb3NpdGlvbmVkT2JqZWN0cygwKTsKLSAgICAgICAgYmxv
Y2stPnJlbW92ZUZsb2F0aW5nT2JqZWN0cygpOyAKKyAgICAgICAgdG9SZW5kZXJCbG9jayh0aGlz
KS0+cmVtb3ZlUG9zaXRpb25lZE9iamVjdHMoMCk7CisgICAgICAgIGlmIChpc1JlbmRlckJsb2Nr
RmxvdygpKQorICAgICAgICAgICAgdG9SZW5kZXJCbG9ja0Zsb3codGhpcyktPnJlbW92ZUZsb2F0
aW5nT2JqZWN0cygpOyAKICAgICB9CiAKICAgICBBU1NFUlQoIWJlZm9yZUNoaWxkIHx8IHRvQm94
TW9kZWxPYmplY3QgPT0gYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlcklubGluZS5jcHAKaW5kZXggOTdiNWQ3MDI2NjZjN2FkMDczZmEzOWFlMjU5
ODNmZGU0NGMxNjZmYi4uZTRiNmFkOTlkMGIxOTNhMTMyZGM2ZmZmMjIxNTZlYmI4NzBhYWI3OSAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAKQEAgLTQ0OCw3ICs0
NDgsMTEgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9y
ZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gKICAgICAgICAgLy8gV2UgY2FuIHJldXNl
IHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBuZXh0IGNvbnRpbnVh
dGlvbi4KICAgICAgICAgcHJlID0gYmxvY2s7CiAgICAgICAgIHByZS0+cmVtb3ZlUG9zaXRpb25l
ZE9iamVjdHMoMCk7Ci0gICAgICAgIHByZS0+cmVtb3ZlRmxvYXRpbmdPYmplY3RzKCk7CisgICAg
ICAgIC8vIEZJWE1FLUJMT0NLRkxPVzogVGhlIGVuY2xvc2luZyBtZXRob2Qgc2hvdWxkIGxpa2Vs
eSBiZSBzd2l0Y2hlZCBvdmVyCisgICAgICAgIC8vIHRvIG9ubHkgd29yayBvbiBSZW5kZXJCbG9j
a0Zsb3csIGluIHdoaWNoIGNhc2UgdGhpcyBjb252ZXJzaW9uIGNhbiBiZQorICAgICAgICAvLyBy
ZW1vdmVkLgorICAgICAgICBpZiAocHJlLT5pc1JlbmRlckJsb2NrRmxvdygpKQorICAgICAgICAg
ICAgdG9SZW5kZXJCbG9ja0Zsb3cocHJlKS0+cmVtb3ZlRmxvYXRpbmdPYmplY3RzKCk7CiAgICAg
ICAgIGJsb2NrID0gYmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOwogICAgIH0gZWxzZSB7CiAgICAg
ICAgIC8vIE5vIGFub255bW91cyBibG9jayBhdmFpbGFibGUgZm9yIHVzZS4gIE1ha2Ugb25lLgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>